LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCCpIDIwMDcgUmVkIEhhdCBJbmMuCiAqIENvcHlyaWdodCCpIDIwMDctMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgogKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQmlzbWFyY2ssIE5ELiwgVVNBCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgogKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cvZtIDx0aG9tYXMtYXQtdHVuZ3N0ZW5ncmFwaGljcy1kb3QtY29tPgogKiAgICAgICAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGh3LWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICoJICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CiAqCSAgICBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KICovCgojaW5jbHVkZSA8eGY4NmRybS5oPgojaW5jbHVkZSA8eGY4NmF0b21pYy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPgoKI2luY2x1ZGUgImVycm5vLmgiCiNpZm5kZWYgRVRJTUUKI2RlZmluZSBFVElNRSBFVElNRURPVVQKI2VuZGlmCiNpbmNsdWRlICJsaWJkcm1fbWFjcm9zLmgiCiNpbmNsdWRlICJsaWJkcm1fbGlzdHMuaCIKI2luY2x1ZGUgImludGVsX2J1Zm1nci5oIgojaW5jbHVkZSAiaW50ZWxfYnVmbWdyX3ByaXYuaCIKI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIKI2luY2x1ZGUgInN0cmluZy5oIgoKI2luY2x1ZGUgImk5MTVfZHJtLmgiCiNpbmNsdWRlICJ1dGhhc2guaCIKCiNpZiBIQVZFX1ZBTEdSSU5ECiNpbmNsdWRlIDx2YWxncmluZC5oPgojaW5jbHVkZSA8bWVtY2hlY2suaD4KI2RlZmluZSBWRyh4KSB4CiNlbHNlCiNkZWZpbmUgVkcoeCkKI2VuZGlmCgojZGVmaW5lIG1lbWNsZWFyKHMpIG1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKQoKI2RlZmluZSBEQkcoLi4uKSBkbyB7CQkJCQlcCglpZiAoYnVmbWdyX2dlbS0+YnVmbWdyLmRlYnVnKQkJCVwKCQlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOwkJXAp9IHdoaWxlICgwKQoKI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKI2RlZmluZSBNQVgyKEEsIEIpICgoQSkgPiAoQikgPyAoQSkgOiAoQikpCgovKioKICogdXBwZXJfMzJfYml0cyAtIHJldHVybiBiaXRzIDMyLTYzIG9mIGEgbnVtYmVyCiAqIEBuOiB0aGUgbnVtYmVyIHdlJ3JlIGFjY2Vzc2luZwogKgogKiBBIGJhc2ljIHNoaWZ0LXJpZ2h0IG9mIGEgNjQtIG9yIDMyLWJpdCBxdWFudGl0eS4gIFVzZSB0aGlzIHRvIHN1cHByZXNzCiAqIHRoZSAicmlnaHQgc2hpZnQgY291bnQgPj0gd2lkdGggb2YgdHlwZSIgd2FybmluZyB3aGVuIHRoYXQgcXVhbnRpdHkgaXMKICogMzItYml0cy4KICovCiNkZWZpbmUgdXBwZXJfMzJfYml0cyhuKSAoKF9fdTMyKSgoKG4pID4+IDE2KSA+PiAxNikpCgovKioKICogbG93ZXJfMzJfYml0cyAtIHJldHVybiBiaXRzIDAtMzEgb2YgYSBudW1iZXIKICogQG46IHRoZSBudW1iZXIgd2UncmUgYWNjZXNzaW5nCiAqLwojZGVmaW5lIGxvd2VyXzMyX2JpdHMobikgKChfX3UzMikobikpCgp0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2JvX2dlbSBkcm1faW50ZWxfYm9fZ2VtOwoKc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0IHsKCWRybU1NTGlzdEhlYWQgaGVhZDsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKfTsKCnR5cGVkZWYgc3RydWN0IF9kcm1faW50ZWxfYnVmbWdyX2dlbSB7Cglkcm1faW50ZWxfYnVmbWdyIGJ1Zm1ncjsKCglhdG9taWNfdCByZWZjb3VudDsKCglpbnQgZmQ7CgoJaW50IG1heF9yZWxvY3M7CgoJcHRocmVhZF9tdXRleF90IGxvY2s7CgoJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWMyX29iamVjdHM7Cglkcm1faW50ZWxfYm8gKipleGVjX2JvczsKCWludCBleGVjX3NpemU7CglpbnQgZXhlY19jb3VudDsKCgkvKiogQXJyYXkgb2YgbGlzdHMgb2YgY2FjaGVkIGdlbSBvYmplY3RzIG9mIHBvd2VyLW9mLXR3byBzaXplcyAqLwoJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0IGNhY2hlX2J1Y2tldFsxNCAqIDRdOwoJaW50IG51bV9idWNrZXRzOwoJdGltZV90IHRpbWU7CgoJZHJtTU1MaXN0SGVhZCBtYW5hZ2VyczsKCglkcm1faW50ZWxfYm9fZ2VtICpuYW1lX3RhYmxlOwoJZHJtX2ludGVsX2JvX2dlbSAqaGFuZGxlX3RhYmxlOwoKCWRybU1NTGlzdEhlYWQgdm1hX2NhY2hlOwoJaW50IHZtYV9jb3VudCwgdm1hX29wZW4sIHZtYV9tYXg7CgoJdWludDY0X3QgZ3R0X3NpemU7CglpbnQgYXZhaWxhYmxlX2ZlbmNlczsKCWludCBwY2lfZGV2aWNlOwoJaW50IGdlbjsKCXVuc2lnbmVkIGludCBoYXNfYnNkIDogMTsKCXVuc2lnbmVkIGludCBoYXNfYmx0IDogMTsKCXVuc2lnbmVkIGludCBoYXNfcmVsYXhlZF9mZW5jaW5nIDogMTsKCXVuc2lnbmVkIGludCBoYXNfbGxjIDogMTsKCXVuc2lnbmVkIGludCBoYXNfd2FpdF90aW1lb3V0IDogMTsKCXVuc2lnbmVkIGludCBib19yZXVzZSA6IDE7Cgl1bnNpZ25lZCBpbnQgbm9fZXhlYyA6IDE7Cgl1bnNpZ25lZCBpbnQgaGFzX3ZlYm94IDogMTsKCXVuc2lnbmVkIGludCBoYXNfZXhlY19hc3luYyA6IDE7Cglib29sIGZlbmNlZF9yZWxvY3M7CgoJc3RydWN0IHsKCQl2b2lkICpwdHI7CgkJdWludDMyX3QgaGFuZGxlOwoJfSB1c2VycHRyX2FjdGl2ZTsKCn0gZHJtX2ludGVsX2J1Zm1ncl9nZW07CgojZGVmaW5lIERSTV9JTlRFTF9SRUxPQ19GRU5DRSAoMTw8MCkKCnR5cGVkZWYgc3RydWN0IF9kcm1faW50ZWxfcmVsb2NfdGFyZ2V0X2luZm8gewoJZHJtX2ludGVsX2JvICpibzsKCWludCBmbGFnczsKfSBkcm1faW50ZWxfcmVsb2NfdGFyZ2V0OwoKc3RydWN0IF9kcm1faW50ZWxfYm9fZ2VtIHsKCWRybV9pbnRlbF9ibyBibzsKCglhdG9taWNfdCByZWZjb3VudDsKCXVpbnQzMl90IGdlbV9oYW5kbGU7Cgljb25zdCBjaGFyICpuYW1lOwoKCS8qKgoJICogS2VuZWwtYXNzaWduZWQgZ2xvYmFsIG5hbWUgZm9yIHRoaXMgb2JqZWN0CiAgICAgICAgICoKICAgICAgICAgKiBMaXN0IGNvbnRhaW5zIGJvdGggZmxpbmsgbmFtZWQgYW5kIHByaW1lIGZkJ2Qgb2JqZWN0cwoJICovCgl1bnNpZ25lZCBpbnQgZ2xvYmFsX25hbWU7CgoJVVRfaGFzaF9oYW5kbGUgaGFuZGxlX2hoOwoJVVRfaGFzaF9oYW5kbGUgbmFtZV9oaDsKCgkvKioKCSAqIEluZGV4IG9mIHRoZSBidWZmZXIgd2l0aGluIHRoZSB2YWxpZGF0aW9uIGxpc3Qgd2hpbGUgcHJlcGFyaW5nIGEKCSAqIGJhdGNoYnVmZmVyIGV4ZWN1dGlvbi4KCSAqLwoJaW50IHZhbGlkYXRlX2luZGV4OwoKCS8qKgoJICogQ3VycmVudCB0aWxpbmcgbW9kZQoJICovCgl1aW50MzJfdCB0aWxpbmdfbW9kZTsKCXVpbnQzMl90IHN3aXp6bGVfbW9kZTsKCXVuc2lnbmVkIGxvbmcgc3RyaWRlOwoKCXVuc2lnbmVkIGxvbmcga2ZsYWdzOwoKCXRpbWVfdCBmcmVlX3RpbWU7CgoJLyoqIEFycmF5IHBhc3NlZCB0byB0aGUgRFJNIGNvbnRhaW5pbmcgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4gKi8KCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2NzOwoJLyoqCgkgKiBBcnJheSBvZiBpbmZvIHN0cnVjdHMgY29ycmVzcG9uZGluZyB0byByZWxvY3NbaV0udGFyZ2V0X2hhbmRsZSBldGMKCSAqLwoJZHJtX2ludGVsX3JlbG9jX3RhcmdldCAqcmVsb2NfdGFyZ2V0X2luZm87CgkvKiogTnVtYmVyIG9mIGVudHJpZXMgaW4gcmVsb2NzICovCglpbnQgcmVsb2NfY291bnQ7CgkvKiogQXJyYXkgb2YgQk9zIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyBidWZmZXIgYW5kIHdpbGwgYmUgc29mdHBpbm5lZCAqLwoJZHJtX2ludGVsX2JvICoqc29mdHBpbl90YXJnZXQ7CgkvKiogTnVtYmVyIHNvZnRwaW5uZWQgQk9zIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyBidWZmZXIgKi8KCWludCBzb2Z0cGluX3RhcmdldF9jb3VudDsKCS8qKiBNYXhpbXVtIGFtb3VudCBvZiBzb2Z0cGlubmVkIEJPcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgYnVmZmVyICovCglpbnQgc29mdHBpbl90YXJnZXRfc2l6ZTsKCgkvKiogTWFwcGVkIGFkZHJlc3MgZm9yIHRoZSBidWZmZXIsIHNhdmVkIGFjcm9zcyBtYXAvdW5tYXAgY3ljbGVzICovCgl2b2lkICptZW1fdmlydHVhbDsKCS8qKiBHVFQgdmlydHVhbCBhZGRyZXNzIGZvciB0aGUgYnVmZmVyLCBzYXZlZCBhY3Jvc3MgbWFwL3VubWFwIGN5Y2xlcyAqLwoJdm9pZCAqZ3R0X3ZpcnR1YWw7CgkvKiogV0MgQ1BVIGFkZHJlc3MgZm9yIHRoZSBidWZmZXIsIHNhdmVkIGFjcm9zcyBtYXAvdW5tYXAgY3ljbGVzICovCgl2b2lkICp3Y192aXJ0dWFsOwoJLyoqCgkgKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdXNlciwgdXNlZCBmb3IgdXNlcnB0cgoJICogb2JqZWN0cyBvbmx5LgoJICovCgl2b2lkICp1c2VyX3ZpcnR1YWw7CglpbnQgbWFwX2NvdW50OwoJZHJtTU1MaXN0SGVhZCB2bWFfbGlzdDsKCgkvKiogQk8gY2FjaGUgbGlzdCAqLwoJZHJtTU1MaXN0SGVhZCBoZWFkOwoKCS8qKgoJICogQm9vbGVhbiBvZiB3aGV0aGVyIHRoaXMgQk8gYW5kIGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gaW5jbHVkZWQgaW4KCSAqIHRoZSBjdXJyZW50IGRybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoKSB0b3RhbC4KCSAqLwoJYm9vbCBpbmNsdWRlZF9pbl9jaGVja19hcGVydHVyZTsKCgkvKioKCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIGJ1ZmZlciBoYXMgYmVlbiB1c2VkIGFzIGEgcmVsb2NhdGlvbgoJICogdGFyZ2V0IGFuZCBoYWQgaXRzIHNpemUgYWNjb3VudGVkIGZvciwgYW5kIHRodXMgY2FuJ3QgaGF2ZSBhbnkKCSAqIGZ1cnRoZXIgcmVsb2NhdGlvbnMgYWRkZWQgdG8gaXQuCgkgKi8KCWJvb2wgdXNlZF9hc19yZWxvY190YXJnZXQ7CgoJLyoqCgkgKiBCb29sZWFuIG9mIHdoZXRoZXIgd2UgaGF2ZSBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsc3QgYnVpbGRpbmcgdGhlIHJlbG9jYXRpb24gdHJlZS4KCSAqLwoJYm9vbCBoYXNfZXJyb3I7CgoJLyoqCgkgKiBCb29sZWFuIG9mIHdoZXRoZXIgdGhpcyBidWZmZXIgY2FuIGJlIHJlLXVzZWQKCSAqLwoJYm9vbCByZXVzYWJsZTsKCgkvKioKCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGUgR1BVIGlzIGRlZmluaXRlbHkgbm90IGFjY2Vzc2luZyB0aGUgYnVmZmVyLgoJICoKCSAqIFRoaXMgaXMgb25seSB2YWxpZCB3aGVuIHJldXNhYmxlLCBzaW5jZSBub24tcmV1c2FibGUKCSAqIGJ1ZmZlcnMgYXJlIHRob3NlIHRoYXQgaGF2ZSBiZWVuIHNoYXJlZCB3aXRoIG90aGVyCgkgKiBwcm9jZXNzZXMsIHNvIHdlIGRvbid0IGtub3cgdGhlaXIgc3RhdGUuCgkgKi8KCWJvb2wgaWRsZTsKCgkvKioKCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHdpdGggdXNlcnB0cgoJICovCglib29sIGlzX3VzZXJwdHI7CgoJLyoqCgkgKiBTaXplIGluIGJ5dGVzIG9mIHRoaXMgYnVmZmVyIGFuZCBpdHMgcmVsb2NhdGlvbiBkZXNjZW5kZW50cy4KCSAqCgkgKiBVc2VkIHRvIGF2b2lkIGNvc3RseSB0cmVlIHdhbGtpbmcgaW4KCSAqIGRybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmUgaW4gdGhlIGNvbW1vbiBjYXNlLgoJICovCglpbnQgcmVsb2NfdHJlZV9zaXplOwoKCS8qKgoJICogTnVtYmVyIG9mIHBvdGVudGlhbCBmZW5jZSByZWdpc3RlcnMgcmVxdWlyZWQgYnkgdGhpcyBidWZmZXIgYW5kIGl0cwoJICogcmVsb2NhdGlvbnMuCgkgKi8KCWludCByZWxvY190cmVlX2ZlbmNlczsKCgkvKiogRmxhZ3MgdGhhdCB3ZSBtYXkgbmVlZCB0byBkbyB0aGUgU1dfRklOSVNIIGlvY3RsIG9uIHVubWFwLiAqLwoJYm9vbCBtYXBwZWRfY3B1X3dyaXRlOwp9OwoKc3RhdGljIHVuc2lnbmVkIGludApkcm1faW50ZWxfZ2VtX2VzdGltYXRlX2JhdGNoX3NwYWNlKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQKZHJtX2ludGVsX2dlbV9jb21wdXRlX2JhdGNoX3NwYWNlKGRybV9pbnRlbF9ibyAqKiBib19hcnJheSwgaW50IGNvdW50KTsKCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19nZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCgkJCSAgICB1aW50MzJfdCAqIHN3aXp6bGVfbW9kZSk7CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZ19pbnRlcm5hbChkcm1faW50ZWxfYm8gKmJvLAoJCQkJICAgICB1aW50MzJfdCB0aWxpbmdfbW9kZSwKCQkJCSAgICAgdWludDMyX3Qgc3RyaWRlKTsKCnN0YXRpYyB2b2lkIGRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKGRybV9pbnRlbF9ibyAqYm8sCgkJCQkJCSAgICAgIHRpbWVfdCB0aW1lKTsKCnN0YXRpYyB2b2lkIGRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibyk7CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoZHJtX2ludGVsX2JvICpibyk7CgpzdGF0aWMgaW5saW5lIGRybV9pbnRlbF9ib19nZW0gKnRvX2JvX2dlbShkcm1faW50ZWxfYm8gKmJvKQp7CiAgICAgICAgcmV0dXJuIChkcm1faW50ZWxfYm9fZ2VtICopYm87Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nCmRybV9pbnRlbF9nZW1fYm9fdGlsZV9zaXplKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLCB1bnNpZ25lZCBsb25nIHNpemUsCgkJCSAgIHVpbnQzMl90ICp0aWxpbmdfbW9kZSkKewoJdW5zaWduZWQgbG9uZyBtaW5fc2l6ZSwgbWF4X3NpemU7Cgl1bnNpZ25lZCBsb25nIGk7CgoJaWYgKCp0aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQoJCXJldHVybiBzaXplOwoKCS8qIDk2NSsganVzdCBuZWVkIG11bHRpcGxlcyBvZiBwYWdlIHNpemUgZm9yIHRpbGluZyAqLwoJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA+PSA0KQoJCXJldHVybiBST1VORF9VUF9UTyhzaXplLCA0MDk2KTsKCgkvKiBPbGRlciBjaGlwcyBuZWVkIHBvd2VycyBvZiB0d28sIG9mIGF0IGxlYXN0IDUxMmsgb3IgMU0gKi8KCWlmIChidWZtZ3JfZ2VtLT5nZW4gPT0gMykgewoJCW1pbl9zaXplID0gMTAyNCoxMDI0OwoJCW1heF9zaXplID0gMTI4KjEwMjQqMTAyNDsKCX0gZWxzZSB7CgkJbWluX3NpemUgPSA1MTIqMTAyNDsKCQltYXhfc2l6ZSA9IDY0KjEwMjQqMTAyNDsKCX0KCglpZiAoc2l6ZSA+IG1heF9zaXplKSB7CgkJKnRpbGluZ19tb2RlID0gSTkxNV9USUxJTkdfTk9ORTsKCQlyZXR1cm4gc2l6ZTsKCX0KCgkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGV2ZXJ5IHBhZ2UgZm9yIHRoZSBmZW5jZT8gKi8KCWlmIChidWZtZ3JfZ2VtLT5oYXNfcmVsYXhlZF9mZW5jaW5nKQoJCXJldHVybiBST1VORF9VUF9UTyhzaXplLCA0MDk2KTsKCglmb3IgKGkgPSBtaW5fc2l6ZTsgaSA8IHNpemU7IGkgPDw9IDEpCgkJOwoKCXJldHVybiBpOwp9CgovKgogKiBSb3VuZCBhIGdpdmVuIHBpdGNoIHVwIHRvIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGZvciBYIHRpbGluZyBvbiBhCiAqIGdpdmVuIGNoaXAuICBXZSB1c2UgNTEyIGFzIHRoZSBtaW5pbXVtIHRvIGFsbG93IGZvciBhIGxhdGVyIHRpbGluZwogKiBjaGFuZ2UuCiAqLwpzdGF0aWMgdW5zaWduZWQgbG9uZwpkcm1faW50ZWxfZ2VtX2JvX3RpbGVfcGl0Y2goZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCgkJCSAgICB1bnNpZ25lZCBsb25nIHBpdGNoLCB1aW50MzJfdCAqdGlsaW5nX21vZGUpCnsKCXVuc2lnbmVkIGxvbmcgdGlsZV93aWR0aDsKCXVuc2lnbmVkIGxvbmcgaTsKCgkvKiBJZiB1bnRpbGVkLCB0aGVuIGp1c3QgYWxpZ24gaXQgc28gdGhhdCB3ZSBjYW4gZG8gcmVuZGVyaW5nCgkgKiB0byBpdCB3aXRoIHRoZSAzRCBlbmdpbmUuCgkgKi8KCWlmICgqdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKCQlyZXR1cm4gQUxJR04ocGl0Y2gsIDY0KTsKCglpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1gKCQkJfHwgKElTXzkxNShidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKQoJCQkgICAgJiYgKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpKQoJCXRpbGVfd2lkdGggPSA1MTI7CgllbHNlCgkJdGlsZV93aWR0aCA9IDEyODsKCgkvKiA5NjUgaXMgZmxleGlibGUgKi8KCWlmIChidWZtZ3JfZ2VtLT5nZW4gPj0gNCkKCQlyZXR1cm4gUk9VTkRfVVBfVE8ocGl0Y2gsIHRpbGVfd2lkdGgpOwoKCS8qIFRoZSBvbGRlciBoYXJkd2FyZSBoYXMgYSBtYXhpbXVtIHBpdGNoIG9mIDgxOTIgd2l0aCB0aWxlZAoJICogc3VyZmFjZXMsIHNvIGZhbGxiYWNrIHRvIHVudGlsZWQgaWYgaXQncyB0b28gbGFyZ2UuCgkgKi8KCWlmIChwaXRjaCA+IDgxOTIpIHsKCQkqdGlsaW5nX21vZGUgPSBJOTE1X1RJTElOR19OT05FOwoJCXJldHVybiBBTElHTihwaXRjaCwgNjQpOwoJfQoKCS8qIFByZS05NjUgbmVlZHMgcG93ZXIgb2YgdHdvIHRpbGUgd2lkdGggKi8KCWZvciAoaSA9IHRpbGVfd2lkdGg7IGkgPCBwaXRjaDsgaSA8PD0gMSkKCQk7CgoJcmV0dXJuIGk7Cn0KCnN0YXRpYyBzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgKgpkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldF9mb3Jfc2l6ZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKCQkJCSB1bnNpZ25lZCBsb25nIHNpemUpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5udW1fYnVja2V0czsgaSsrKSB7CgkJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQgPQoJCSAgICAmYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldOwoJCWlmIChidWNrZXQtPnNpemUgPj0gc2l6ZSkgewoJCQlyZXR1cm4gYnVja2V0OwoJCX0KCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9kdW1wX3ZhbGlkYXRpb25fbGlzdChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKewoJaW50IGksIGo7CgoJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7IGkrKykgewoJCWRybV9pbnRlbF9ibyAqYm8gPSBidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpXTsKCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCgkJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgJiYgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldCA9PSBOVUxMKSB7CgkJCURCRygiJTJkOiAlZCAlcyglcylcbiIsIGksIGJvX2dlbS0+Z2VtX2hhbmRsZSwKCQkJICAgIGJvX2dlbS0+a2ZsYWdzICYgRVhFQ19PQkpFQ1RfUElOTkVEID8gIioiIDogIiIsCgkJCSAgICBib19nZW0tPm5hbWUpOwoJCQljb250aW51ZTsKCQl9CgoJCWZvciAoaiA9IDA7IGogPCBib19nZW0tPnJlbG9jX2NvdW50OyBqKyspIHsKCQkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2pdLmJvOwoJCQlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfZ2VtID0KCQkJICAgIChkcm1faW50ZWxfYm9fZ2VtICopIHRhcmdldF9ibzsKCgkJCURCRygiJTJkOiAlZCAlcyglcylAMHglMDh4ICUwOHggLT4gIgoJCQkgICAgIiVkICglcylAMHglMDh4ICUwOHggKyAweCUwOHhcbiIsCgkJCSAgICBpLAoJCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgYm9fZ2VtLT5rZmxhZ3MgJiBFWEVDX09CSkVDVF9QSU5ORUQgPyAiKiIgOiAiIiwKCQkJICAgIGJvX2dlbS0+bmFtZSwKCQkJICAgIHVwcGVyXzMyX2JpdHMoYm9fZ2VtLT5yZWxvY3Nbal0ub2Zmc2V0KSwKCQkJICAgIGxvd2VyXzMyX2JpdHMoYm9fZ2VtLT5yZWxvY3Nbal0ub2Zmc2V0KSwKCQkJICAgIHRhcmdldF9nZW0tPmdlbV9oYW5kbGUsCgkJCSAgICB0YXJnZXRfZ2VtLT5uYW1lLAoJCQkgICAgdXBwZXJfMzJfYml0cyh0YXJnZXRfYm8tPm9mZnNldDY0KSwKCQkJICAgIGxvd2VyXzMyX2JpdHModGFyZ2V0X2JvLT5vZmZzZXQ2NCksCgkJCSAgICBib19nZW0tPnJlbG9jc1tqXS5kZWx0YSk7CgkJfQoKCQlmb3IgKGogPSAwOyBqIDwgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudDsgaisrKSB7CgkJCWRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvID0gYm9fZ2VtLT5zb2Z0cGluX3RhcmdldFtqXTsKCQkJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2dlbSA9CgkJCSAgICAoZHJtX2ludGVsX2JvX2dlbSAqKSB0YXJnZXRfYm87CgkJCURCRygiJTJkOiAlZCAlcyglcykgLT4gIgoJCQkgICAgIiVkICooJXMpQDB4JTA4eCAlMDh4XG4iLAoJCQkgICAgaSwKCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwKCQkJICAgIGJvX2dlbS0+a2ZsYWdzICYgRVhFQ19PQkpFQ1RfUElOTkVEID8gIioiIDogIiIsCgkJCSAgICBib19nZW0tPm5hbWUsCgkJCSAgICB0YXJnZXRfZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgdGFyZ2V0X2dlbS0+bmFtZSwKCQkJICAgIHVwcGVyXzMyX2JpdHModGFyZ2V0X2JvLT5vZmZzZXQ2NCksCgkJCSAgICBsb3dlcl8zMl9iaXRzKHRhcmdldF9iby0+b2Zmc2V0NjQpKTsKCQl9Cgl9Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZApkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglhdG9taWNfaW5jKCZib19nZW0tPnJlZmNvdW50KTsKfQoKLyoqCiAqIEFkZHMgdGhlIGdpdmVuIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzIHRvIGJlIHZhbGlkYXRlZCAobW92ZWQgaW50byB0aGUKICogYXBwcm9wcmlhdGUgbWVtb3J5IHR5cGUpIHdpdGggdGhlIG5leHQgYmF0Y2ggc3VibWlzc2lvbi4KICoKICogSWYgYSBidWZmZXIgaXMgdmFsaWRhdGVkIG11bHRpcGxlIHRpbWVzIGluIGEgYmF0Y2ggc3VibWlzc2lvbiwgaXQgZW5kcyB1cAogKiB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG1lbW9yeSB0eXBlIGZsYWdzIGFuZCB0aGUgdW5pb24gb2YgdGhlCiAqIGFjY2VzcyBmbGFncy4KICovCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgbmVlZF9mZW5jZSkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKiliby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKilibzsKCWludCBpbmRleDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZmxhZ3MgPSAwOwoJaWYgKG5lZWRfZmVuY2UpCgkJZmxhZ3MgfD0gRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0U7CgoJaWYgKGJvX2dlbS0+dmFsaWRhdGVfaW5kZXggIT0gLTEpIHsKCQlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2JvX2dlbS0+dmFsaWRhdGVfaW5kZXhdLmZsYWdzIHw9IGZsYWdzOwoJCXJldHVybjsKCX0KCgkvKiBFeHRlbmQgdGhlIGFycmF5IG9mIHZhbGlkYXRpb24gZW50cmllcyBhcyBuZWNlc3NhcnkuICovCglpZiAoYnVmbWdyX2dlbS0+ZXhlY19jb3VudCA9PSBidWZtZ3JfZ2VtLT5leGVjX3NpemUpIHsKCQlpbnQgbmV3X3NpemUgPSBidWZtZ3JfZ2VtLT5leGVjX3NpemUgKiAyOwoKCQlpZiAobmV3X3NpemUgPT0gMCkKCQkJbmV3X3NpemUgPSA1OwoKCQlidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzID0KCQkJcmVhbGxvYyhidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzLAoJCQkJc2l6ZW9mKCpidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzKSAqIG5ld19zaXplKTsKCQlidWZtZ3JfZ2VtLT5leGVjX2JvcyA9CgkJCXJlYWxsb2MoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCgkJCQlzaXplb2YoKmJ1Zm1ncl9nZW0tPmV4ZWNfYm9zKSAqIG5ld19zaXplKTsKCQlidWZtZ3JfZ2VtLT5leGVjX3NpemUgPSBuZXdfc2l6ZTsKCX0KCglpbmRleCA9IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7Cglib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gaW5kZXg7CgkvKiBGaWxsIGluIGFycmF5IGVudHJ5ICovCglidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CglidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5yZWxvY2F0aW9uX2NvdW50ID0gYm9fZ2VtLT5yZWxvY19jb3VudDsKCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaW5kZXhdLnJlbG9jc19wdHIgPSAodWludHB0cl90KWJvX2dlbS0+cmVsb2NzOwoJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0uYWxpZ25tZW50ID0gYm8tPmFsaWduOwoJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ub2Zmc2V0ID0gYm8tPm9mZnNldDY0OwoJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0uZmxhZ3MgPSBib19nZW0tPmtmbGFncyB8IGZsYWdzOwoJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ucnN2ZDEgPSAwOwoJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ucnN2ZDIgPSAwOwoJYnVmbWdyX2dlbS0+ZXhlY19ib3NbaW5kZXhdID0gYm87CglidWZtZ3JfZ2VtLT5leGVjX2NvdW50Kys7Cn0KCiNkZWZpbmUgUkVMT0NfQlVGX1NJWkUoeCkgKChJOTE1X1JFTE9DX0hFQURFUiArIHggKiBJOTE1X1JFTE9DMF9TVFJJREUpICogXAoJc2l6ZW9mKHVpbnQzMl90KSkKCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCgkJCQkgICAgICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0sCgkJCQkgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KQp7Cgl1bnNpZ25lZCBpbnQgc2l6ZTsKCglhc3NlcnQoIWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQpOwoKCS8qIFRoZSBvbGRlciBjaGlwc2V0cyBhcmUgZmFyLWxlc3MgZmxleGlibGUgaW4gdGVybXMgb2YgdGlsaW5nLAoJICogYW5kIHJlcXVpcmUgdGlsZWQgYnVmZmVyIHRvIGJlIHNpemUgYWxpZ25lZCBpbiB0aGUgYXBlcnR1cmUuCgkgKiBUaGlzIG1lYW5zIHRoYXQgaW4gdGhlIHdvcnN0IHBvc3NpYmxlIGNhc2Ugd2Ugd2lsbCBuZWVkIGEgaG9sZQoJICogdHdpY2UgYXMgbGFyZ2UgYXMgdGhlIG9iamVjdCBpbiBvcmRlciBmb3IgaXQgdG8gZml0IGludG8gdGhlCgkgKiBhcGVydHVyZS4gT3B0aW1hbCBwYWNraW5nIGlzIGZvciB3aW1wcy4KCSAqLwoJc2l6ZSA9IGJvX2dlbS0+Ym8uc2l6ZTsKCWlmIChidWZtZ3JfZ2VtLT5nZW4gPCA0ICYmIGJvX2dlbS0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgewoJCXVuc2lnbmVkIGludCBtaW5fc2l6ZTsKCgkJaWYgKGJ1Zm1ncl9nZW0tPmhhc19yZWxheGVkX2ZlbmNpbmcpIHsKCQkJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA9PSAzKQoJCQkJbWluX3NpemUgPSAxMDI0KjEwMjQ7CgkJCWVsc2UKCQkJCW1pbl9zaXplID0gNTEyKjEwMjQ7CgoJCQl3aGlsZSAobWluX3NpemUgPCBzaXplKQoJCQkJbWluX3NpemUgKj0gMjsKCQl9IGVsc2UKCQkJbWluX3NpemUgPSBzaXplOwoKCQkvKiBBY2NvdW50IGZvciB3b3JzdC1jYXNlIGFsaWdubWVudC4gKi8KCQlhbGlnbm1lbnQgPSBNQVgyKGFsaWdubWVudCwgbWluX3NpemUpOwoJfQoKCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplID0gc2l6ZSArIGFsaWdubWVudDsKfQoKc3RhdGljIGludApkcm1faW50ZWxfc2V0dXBfcmVsb2NfbGlzdChkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cgl1bnNpZ25lZCBpbnQgbWF4X3JlbG9jcyA9IGJ1Zm1ncl9nZW0tPm1heF9yZWxvY3M7CgoJaWYgKGJvLT5zaXplIC8gNCA8IG1heF9yZWxvY3MpCgkJbWF4X3JlbG9jcyA9IGJvLT5zaXplIC8gNDsKCglib19nZW0tPnJlbG9jcyA9IG1hbGxvYyhtYXhfcmVsb2NzICoKCQkJCXNpemVvZihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkpKTsKCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8gPSBtYWxsb2MobWF4X3JlbG9jcyAqCgkJCQkJICAgc2l6ZW9mKGRybV9pbnRlbF9yZWxvY190YXJnZXQpKTsKCWlmIChib19nZW0tPnJlbG9jcyA9PSBOVUxMIHx8IGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8gPT0gTlVMTCkgewoJCWJvX2dlbS0+aGFzX2Vycm9yID0gdHJ1ZTsKCgkJZnJlZSAoYm9fZ2VtLT5yZWxvY3MpOwoJCWJvX2dlbS0+cmVsb2NzID0gTlVMTDsKCgkJZnJlZSAoYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyk7CgkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9IE5VTEw7CgoJCXJldHVybiAxOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fYnVzeShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2J1c3kgYnVzeTsKCWludCByZXQ7CgoJaWYgKGJvX2dlbS0+cmV1c2FibGUgJiYgYm9fZ2VtLT5pZGxlKQoJCXJldHVybiBmYWxzZTsKCgltZW1jbGVhcihidXN5KTsKCWJ1c3kuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRU1fQlVTWSwgJmJ1c3kpOwoJaWYgKHJldCA9PSAwKSB7CgkJYm9fZ2VtLT5pZGxlID0gIWJ1c3kuYnVzeTsKCQlyZXR1cm4gYnVzeS5idXN5OwoJfSBlbHNlIHsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19tYWR2aXNlX2ludGVybmFsKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAoJCQkJICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0sIGludCBzdGF0ZSkKewoJc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlIG1hZHY7CgoJbWVtY2xlYXIobWFkdik7CgltYWR2LmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCW1hZHYubWFkdiA9IHN0YXRlOwoJbWFkdi5yZXRhaW5lZCA9IDE7Cglkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX01BRFZJU0UsICZtYWR2KTsKCglyZXR1cm4gbWFkdi5yZXRhaW5lZDsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2UoZHJtX2ludGVsX2JvICpibywgaW50IG1hZHYpCnsKCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwKCQkoKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3IsCgkJIChkcm1faW50ZWxfYm9fZ2VtICopIGJvLAoJCSBtYWR2KTsKfQoKLyogZHJvcCB0aGUgb2xkZXN0IGVudHJpZXMgdGhhdCBoYXZlIGJlZW4gcHVyZ2VkIGJ5IHRoZSBrZXJuZWwgKi8Kc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib19jYWNoZV9wdXJnZV9idWNrZXQoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCgkJCQkgICAgc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQpCnsKCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOwoKCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5uZXh0LCBoZWFkKTsKCQlpZiAoZHJtX2ludGVsX2dlbV9ib19tYWR2aXNlX2ludGVybmFsCgkJICAgIChidWZtZ3JfZ2VtLCBib19nZW0sIEk5MTVfTUFEVl9ET05UTkVFRCkpCgkJCWJyZWFrOwoKCQlEUk1MSVNUREVMKCZib19nZW0tPmhlYWQpOwoJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7Cgl9Cn0KCnN0YXRpYyBkcm1faW50ZWxfYm8gKgpkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2ludGVybmFsKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKCQkJCWNvbnN0IGNoYXIgKm5hbWUsCgkJCQl1bnNpZ25lZCBsb25nIHNpemUsCgkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLAoJCQkJdWludDMyX3QgdGlsaW5nX21vZGUsCgkJCQl1bnNpZ25lZCBsb25nIHN0cmlkZSwKCQkJCXVuc2lnbmVkIGludCBhbGlnbm1lbnQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOwoJaW50IHJldDsKCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0OwoJYm9vbCBhbGxvY19mcm9tX2NhY2hlOwoJdW5zaWduZWQgbG9uZyBib19zaXplOwoJYm9vbCBmb3JfcmVuZGVyID0gZmFsc2U7CgoJaWYgKGZsYWdzICYgQk9fQUxMT0NfRk9SX1JFTkRFUikKCQlmb3JfcmVuZGVyID0gdHJ1ZTsKCgkvKiBSb3VuZCB0aGUgYWxsb2NhdGVkIHNpemUgdXAgdG8gYSBwb3dlciBvZiB0d28gbnVtYmVyIG9mIHBhZ2VzLiAqLwoJYnVja2V0ID0gZHJtX2ludGVsX2dlbV9ib19idWNrZXRfZm9yX3NpemUoYnVmbWdyX2dlbSwgc2l6ZSk7CgoJLyogSWYgd2UgZG9uJ3QgaGF2ZSBjYWNoaW5nIGF0IHRoaXMgc2l6ZSwgZG9uJ3QgYWN0dWFsbHkgcm91bmQgdGhlCgkgKiBhbGxvY2F0aW9uIHVwLgoJICovCglpZiAoYnVja2V0ID09IE5VTEwpIHsKCQlib19zaXplID0gc2l6ZTsKCQlpZiAoYm9fc2l6ZSA8IHBhZ2Vfc2l6ZSkKCQkJYm9fc2l6ZSA9IHBhZ2Vfc2l6ZTsKCX0gZWxzZSB7CgkJYm9fc2l6ZSA9IGJ1Y2tldC0+c2l6ZTsKCX0KCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJLyogR2V0IGEgYnVmZmVyIG91dCBvZiB0aGUgY2FjaGUgaWYgYXZhaWxhYmxlICovCnJldHJ5OgoJYWxsb2NfZnJvbV9jYWNoZSA9IGZhbHNlOwoJaWYgKGJ1Y2tldCAhPSBOVUxMICYmICFEUk1MSVNURU1QVFkoJmJ1Y2tldC0+aGVhZCkpIHsKCQlpZiAoZm9yX3JlbmRlcikgewoJCQkvKiBBbGxvY2F0ZSBuZXcgcmVuZGVyLXRhcmdldCBCT3MgZnJvbSB0aGUgdGFpbCAoTVJVKQoJCQkgKiBvZiB0aGUgbGlzdCwgYXMgaXQgd2lsbCBsaWtlbHkgYmUgaG90IGluIHRoZSBHUFUKCQkJICogY2FjaGUgYW5kIGluIHRoZSBhcGVydHVyZSBmb3IgdXMuCgkJCSAqLwoJCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKCQkJCQkgICAgICBidWNrZXQtPmhlYWQucHJldiwgaGVhZCk7CgkJCURSTUxJU1RERUwoJmJvX2dlbS0+aGVhZCk7CgkJCWFsbG9jX2Zyb21fY2FjaGUgPSB0cnVlOwoJCQlib19nZW0tPmJvLmFsaWduID0gYWxpZ25tZW50OwoJCX0gZWxzZSB7CgkJCWFzc2VydChhbGlnbm1lbnQgPT0gMCk7CgkJCS8qIEZvciBub24tcmVuZGVyLXRhcmdldCBCT3MgKHdoZXJlIHdlJ3JlIHByb2JhYmx5CgkJCSAqIGdvaW5nIHRvIG1hcCBpdCBmaXJzdCB0aGluZyBpbiBvcmRlciB0byBmaWxsIGl0CgkJCSAqIHdpdGggZGF0YSksIGNoZWNrIGlmIHRoZSBsYXN0IEJPIGluIHRoZSBjYWNoZSBpcwoJCQkgKiB1bmJ1c3ksIGFuZCBvbmx5IHJldXNlIGluIHRoYXQgY2FzZS4gT3RoZXJ3aXNlLAoJCQkgKiBhbGxvY2F0aW5nIGEgbmV3IGJ1ZmZlciBpcyBwcm9iYWJseSBmYXN0ZXIgdGhhbgoJCQkgKiB3YWl0aW5nIGZvciB0aGUgR1BVIHRvIGZpbmlzaC4KCQkJICovCgkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAoJCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5uZXh0LCBoZWFkKTsKCQkJaWYgKCFkcm1faW50ZWxfZ2VtX2JvX2J1c3koJmJvX2dlbS0+Ym8pKSB7CgkJCQlhbGxvY19mcm9tX2NhY2hlID0gdHJ1ZTsKCQkJCURSTUxJU1RERUwoJmJvX2dlbS0+aGVhZCk7CgkJCX0KCQl9CgoJCWlmIChhbGxvY19mcm9tX2NhY2hlKSB7CgkJCWlmICghZHJtX2ludGVsX2dlbV9ib19tYWR2aXNlX2ludGVybmFsCgkJCSAgICAoYnVmbWdyX2dlbSwgYm9fZ2VtLCBJOTE1X01BRFZfV0lMTE5FRUQpKSB7CgkJCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOwoJCQkJZHJtX2ludGVsX2dlbV9ib19jYWNoZV9wdXJnZV9idWNrZXQoYnVmbWdyX2dlbSwKCQkJCQkJCQkgICAgYnVja2V0KTsKCQkJCWdvdG8gcmV0cnk7CgkJCX0KCgkJCWlmIChkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoJmJvX2dlbS0+Ym8sCgkJCQkJCQkJIHRpbGluZ19tb2RlLAoJCQkJCQkJCSBzdHJpZGUpKSB7CgkJCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOwoJCQkJZ290byByZXRyeTsKCQkJfQoJCX0KCX0KCglpZiAoIWFsbG9jX2Zyb21fY2FjaGUpIHsKCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NyZWF0ZSBjcmVhdGU7CgoJCWJvX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJvX2dlbSkpOwoJCWlmICghYm9fZ2VtKQoJCQlnb3RvIGVycjsKCgkJLyogZHJtX2ludGVsX2dlbV9ib19mcmVlIGNhbGxzIERSTUxJU1RERUwoKSBmb3IgYW4gdW5pbml0aWFsaXplZAoJCSAgIGxpc3QgKHZtYV9saXN0KSwgc28gYmV0dGVyIHNldCB0aGUgbGlzdCBoZWFkIGhlcmUgKi8KCQlEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOwoKCQlib19nZW0tPmJvLnNpemUgPSBib19zaXplOwoKCQltZW1jbGVhcihjcmVhdGUpOwoJCWNyZWF0ZS5zaXplID0gYm9fc2l6ZTsKCgkJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fQ1JFQVRFLAoJCQkgICAgICAgJmNyZWF0ZSk7CgkJaWYgKHJldCAhPSAwKSB7CgkJCWZyZWUoYm9fZ2VtKTsKCQkJZ290byBlcnI7CgkJfQoKCQlib19nZW0tPmdlbV9oYW5kbGUgPSBjcmVhdGUuaGFuZGxlOwoJCUhBU0hfQUREKGhhbmRsZV9oaCwgYnVmbWdyX2dlbS0+aGFuZGxlX3RhYmxlLAoJCQkgZ2VtX2hhbmRsZSwgc2l6ZW9mKGJvX2dlbS0+Z2VtX2hhbmRsZSksCgkJCSBib19nZW0pOwoKCQlib19nZW0tPmJvLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCQlib19nZW0tPmJvLmJ1Zm1nciA9IGJ1Zm1ncjsKCQlib19nZW0tPmJvLmFsaWduID0gYWxpZ25tZW50OwoKCQlib19nZW0tPnRpbGluZ19tb2RlID0gSTkxNV9USUxJTkdfTk9ORTsKCQlib19nZW0tPnN3aXp6bGVfbW9kZSA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOwoJCWJvX2dlbS0+c3RyaWRlID0gMDsKCgkJaWYgKGRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZ19pbnRlcm5hbCgmYm9fZ2VtLT5ibywKCQkJCQkJCSB0aWxpbmdfbW9kZSwKCQkJCQkJCSBzdHJpZGUpKQoJCQlnb3RvIGVycl9mcmVlOwoJfQoKCWJvX2dlbS0+bmFtZSA9IG5hbWU7CglhdG9taWNfc2V0KCZib19nZW0tPnJlZmNvdW50LCAxKTsKCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKCWJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAwOwoJYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCA9IGZhbHNlOwoJYm9fZ2VtLT5oYXNfZXJyb3IgPSBmYWxzZTsKCWJvX2dlbS0+cmV1c2FibGUgPSB0cnVlOwoKCWRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoYnVmbWdyX2dlbSwgYm9fZ2VtLCBhbGlnbm1lbnQpOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCURCRygiYm9fY3JlYXRlOiBidWYgJWQgKCVzKSAlbGRiXG4iLAoJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLCBzaXplKTsKCglyZXR1cm4gJmJvX2dlbS0+Ym87CgplcnJfZnJlZToKCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CmVycjoKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgZHJtX2ludGVsX2JvICoKZHJtX2ludGVsX2dlbV9ib19hbGxvY19mb3JfcmVuZGVyKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkJICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KQp7CglyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hbGxvY19pbnRlcm5hbChidWZtZ3IsIG5hbWUsIHNpemUsCgkJCQkJICAgICAgIEJPX0FMTE9DX0ZPUl9SRU5ERVIsCgkJCQkJICAgICAgIEk5MTVfVElMSU5HX05PTkUsIDAsCgkJCQkJICAgICAgIGFsaWdubWVudCk7Cn0KCnN0YXRpYyBkcm1faW50ZWxfYm8gKgpkcm1faW50ZWxfZ2VtX2JvX2FsbG9jKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50KQp7CglyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hbGxvY19pbnRlcm5hbChidWZtZ3IsIG5hbWUsIHNpemUsIDAsCgkJCQkJICAgICAgIEk5MTVfVElMSU5HX05PTkUsIDAsIDApOwp9CgpzdGF0aWMgZHJtX2ludGVsX2JvICoKZHJtX2ludGVsX2dlbV9ib19hbGxvY190aWxlZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGNvbnN0IGNoYXIgKm5hbWUsCgkJCSAgICAgaW50IHgsIGludCB5LCBpbnQgY3BwLCB1aW50MzJfdCAqdGlsaW5nX21vZGUsCgkJCSAgICAgdW5zaWduZWQgbG9uZyAqcGl0Y2gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOwoJdW5zaWduZWQgbG9uZyBzaXplLCBzdHJpZGU7Cgl1aW50MzJfdCB0aWxpbmc7CgoJZG8gewoJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF95LCBoZWlnaHRfYWxpZ25tZW50OwoKCQl0aWxpbmcgPSAqdGlsaW5nX21vZGU7CgoJCS8qIElmIHdlJ3JlIHRpbGVkLCBvdXIgYWxsb2NhdGlvbnMgYXJlIGluIDggb3IgMzItcm93IGJsb2NrcywKCQkgKiBzbyBmYWlsdXJlIHRvIGFsaWduIG91ciBoZWlnaHQgbWVhbnMgdGhhdCB3ZSB3b24ndCBhbGxvY2F0ZQoJCSAqIGVub3VnaCBwYWdlcy4KCQkgKgoJCSAqIElmIHdlJ3JlIHVudGlsZWQsIHdlIHN0aWxsIGhhdmUgdG8gYWxpZ24gdG8gMiByb3dzIGhpZ2gKCQkgKiBiZWNhdXNlIHRoZSBkYXRhIHBvcnQgYWNjZXNzZXMgMngyIGJsb2NrcyBldmVuIGlmIHRoZQoJCSAqIGJvdHRvbSByb3cgaXNuJ3QgdG8gYmUgcmVuZGVyZWQsIHNvIGZhaWx1cmUgdG8gYWxpZ24gbWVhbnMKCQkgKiB3ZSBjb3VsZCB3YWxrIG9mZiB0aGUgZW5kIG9mIHRoZSBHVFQgYW5kIGZhdWx0LiAgVGhpcyBpcwoJCSAqIGRvY3VtZW50ZWQgb24gOTY1LCBhbmQgbWF5IGJlIHRoZSBjYXNlIG9uIG9sZGVyIGNoaXBzZXRzCgkJICogdG9vIHNvIHdlIHRyeSB0byBiZSBjYXJlZnVsLgoJCSAqLwoJCWFsaWduZWRfeSA9IHk7CgkJaGVpZ2h0X2FsaWdubWVudCA9IDI7CgoJCWlmICgoYnVmbWdyX2dlbS0+Z2VuID09IDIpICYmIHRpbGluZyAhPSBJOTE1X1RJTElOR19OT05FKQoJCQloZWlnaHRfYWxpZ25tZW50ID0gMTY7CgkJZWxzZSBpZiAodGlsaW5nID09IEk5MTVfVElMSU5HX1gKCQkJfHwgKElTXzkxNShidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKQoJCQkgICAgJiYgdGlsaW5nID09IEk5MTVfVElMSU5HX1kpKQoJCQloZWlnaHRfYWxpZ25tZW50ID0gODsKCQllbHNlIGlmICh0aWxpbmcgPT0gSTkxNV9USUxJTkdfWSkKCQkJaGVpZ2h0X2FsaWdubWVudCA9IDMyOwoJCWFsaWduZWRfeSA9IEFMSUdOKHksIGhlaWdodF9hbGlnbm1lbnQpOwoKCQlzdHJpZGUgPSB4ICogY3BwOwoJCXN0cmlkZSA9IGRybV9pbnRlbF9nZW1fYm9fdGlsZV9waXRjaChidWZtZ3JfZ2VtLCBzdHJpZGUsIHRpbGluZ19tb2RlKTsKCQlzaXplID0gc3RyaWRlICogYWxpZ25lZF95OwoJCXNpemUgPSBkcm1faW50ZWxfZ2VtX2JvX3RpbGVfc2l6ZShidWZtZ3JfZ2VtLCBzaXplLCB0aWxpbmdfbW9kZSk7Cgl9IHdoaWxlICgqdGlsaW5nX21vZGUgIT0gdGlsaW5nKTsKCSpwaXRjaCA9IHN0cmlkZTsKCglpZiAodGlsaW5nID09IEk5MTVfVElMSU5HX05PTkUpCgkJc3RyaWRlID0gMDsKCglyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hbGxvY19pbnRlcm5hbChidWZtZ3IsIG5hbWUsIHNpemUsIGZsYWdzLAoJCQkJCSAgICAgICB0aWxpbmcsIHN0cmlkZSwgMCk7Cn0KCnN0YXRpYyBkcm1faW50ZWxfYm8gKgpkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCQkJY29uc3QgY2hhciAqbmFtZSwKCQkJCXZvaWQgKmFkZHIsCgkJCQl1aW50MzJfdCB0aWxpbmdfbW9kZSwKCQkJCXVpbnQzMl90IHN0cmlkZSwKCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKCWludCByZXQ7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKCgkvKiBUaWxpbmcgd2l0aCB1c2VycHRyIHN1cmZhY2VzIGlzIG5vdCBzdXBwb3J0ZWQKCSAqIG9uIGFsbCBoYXJkd2FyZSBzbyByZWZ1c2UgaXQgZm9yIHRpbWUgYmVpbmcuCgkgKi8KCWlmICh0aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQoJCXJldHVybiBOVUxMOwoKCWJvX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJvX2dlbSkpOwoJaWYgKCFib19nZW0pCgkJcmV0dXJuIE5VTEw7CgoJYXRvbWljX3NldCgmYm9fZ2VtLT5yZWZjb3VudCwgMSk7CglEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOwoKCWJvX2dlbS0+Ym8uc2l6ZSA9IHNpemU7CgoJbWVtY2xlYXIodXNlcnB0cik7Cgl1c2VycHRyLnVzZXJfcHRyID0gKF9fdTY0KSgodW5zaWduZWQgbG9uZylhZGRyKTsKCXVzZXJwdHIudXNlcl9zaXplID0gc2l6ZTsKCXVzZXJwdHIuZmxhZ3MgPSBmbGFnczsKCglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkJRFJNX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIsCgkJCSZ1c2VycHRyKTsKCWlmIChyZXQgIT0gMCkgewoJCURCRygiYm9fY3JlYXRlX3VzZXJwdHI6ICIKCQkgICAgImlvY3RsIGZhaWxlZCB3aXRoIHVzZXIgcHRyICVwIHNpemUgMHglbHgsICIKCQkgICAgInVzZXIgZmxhZ3MgMHglbHhcbiIsIGFkZHIsIHNpemUsIGZsYWdzKTsKCQlmcmVlKGJvX2dlbSk7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglib19nZW0tPmdlbV9oYW5kbGUgPSB1c2VycHRyLmhhbmRsZTsKCWJvX2dlbS0+Ym8uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJYm9fZ2VtLT5iby5idWZtZ3IgICAgPSBidWZtZ3I7Cglib19nZW0tPmlzX3VzZXJwdHIgICA9IHRydWU7Cglib19nZW0tPmJvLnZpcnR1YWwgICA9IGFkZHI7CgkvKiBTYXZlIHRoZSBhZGRyZXNzIHByb3ZpZGVkIGJ5IHVzZXIgKi8KCWJvX2dlbS0+dXNlcl92aXJ0dWFsID0gYWRkcjsKCWJvX2dlbS0+dGlsaW5nX21vZGUgID0gSTkxNV9USUxJTkdfTk9ORTsKCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7Cglib19nZW0tPnN0cmlkZSAgICAgICA9IDA7CgoJSEFTSF9BREQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCgkJIGdlbV9oYW5kbGUsIHNpemVvZihib19nZW0tPmdlbV9oYW5kbGUpLAoJCSBib19nZW0pOwoKCWJvX2dlbS0+bmFtZSA9IG5hbWU7Cglib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gLTE7Cglib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzID0gMDsKCWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSBmYWxzZTsKCWJvX2dlbS0+aGFzX2Vycm9yID0gZmFsc2U7Cglib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CgoJZHJtX2ludGVsX2JvX2dlbV9zZXRfaW5fYXBlcnR1cmVfc2l6ZShidWZtZ3JfZ2VtLCBib19nZW0sIDApOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCURCRygiYm9fY3JlYXRlX3VzZXJwdHI6ICIKCSAgICAicHRyICVwIGJ1ZiAlZCAoJXMpIHNpemUgJWxkYiwgc3RyaWRlIDB4JXgsIHRpbGUgbW9kZSAlZFxuIiwKCQlhZGRyLCBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKCQlzaXplLCBzdHJpZGUsIHRpbGluZ19tb2RlKTsKCglyZXR1cm4gJmJvX2dlbS0+Ym87Cn0KCnN0YXRpYyBib29sCmhhc191c2VycHRyKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQp7CglpbnQgcmV0OwoJdm9pZCAqcHRyOwoJbG9uZyBwZ3N6OwoJc3RydWN0IGRybV9pOTE1X2dlbV91c2VycHRyIHVzZXJwdHI7CgoJcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKCWFzc2VydChwZ3N6ID4gMCk7CgoJcmV0ID0gcG9zaXhfbWVtYWxpZ24oJnB0ciwgcGdzeiwgcGdzeik7CglpZiAocmV0KSB7CgkJREJHKCJGYWlsZWQgdG8gZ2V0IGEgcGFnZSAoJWxkKSBmb3IgdXNlcnB0ciBkZXRlY3Rpb24hXG4iLAoJCQlwZ3N6KTsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJbWVtY2xlYXIodXNlcnB0cik7Cgl1c2VycHRyLnVzZXJfcHRyID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXB0cjsKCXVzZXJwdHIudXNlcl9zaXplID0gcGdzejsKCnJldHJ5OgoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSLCAmdXNlcnB0cik7CglpZiAocmV0KSB7CgkJaWYgKGVycm5vID09IEVOT0RFViAmJiB1c2VycHRyLmZsYWdzID09IDApIHsKCQkJdXNlcnB0ci5mbGFncyA9IEk5MTVfVVNFUlBUUl9VTlNZTkNIUk9OSVpFRDsKCQkJZ290byByZXRyeTsKCQl9CgkJZnJlZShwdHIpOwoJCXJldHVybiBmYWxzZTsKCX0KCgkvKiBXZSBkb24ndCByZWxlYXNlIHRoZSB1c2VycHRyIGJvIGhlcmUgYXMgd2Ugd2FudCB0byBrZWVwIHRoZQoJICoga2VybmVsIG1tIHRyYWNraW5nIGFsaXZlIGZvciBvdXIgbGlmZXRpbWUuIFRoZSBmaXJzdCB0aW1lIHdlCgkgKiBjcmVhdGUgYSB1c2VycHRyIG9iamVjdCB0aGUga2VybmVsIGhhcyB0byBpbnN0YWxsIGEgbW11X25vdGlmZXIKCSAqIHdoaWNoIGlzIGEgaGVhdnl3ZWlnaHQgb3BlcmF0aW9uIChlLmcuIGl0IHJlcXVpcmVzIHRha2luZyBhbGwKCSAqIG1tX2xvY2tzIGFuZCBzdG9wX21hY2hpbmUoKSkuCgkgKi8KCglidWZtZ3JfZ2VtLT51c2VycHRyX2FjdGl2ZS5wdHIgPSBwdHI7CglidWZtZ3JfZ2VtLT51c2VycHRyX2FjdGl2ZS5oYW5kbGUgPSB1c2VycHRyLmhhbmRsZTsKCglyZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGRybV9pbnRlbF9ibyAqCmNoZWNrX2JvX2FsbG9jX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAoJCSAgICAgICB2b2lkICphZGRyLAoJCSAgICAgICB1aW50MzJfdCB0aWxpbmdfbW9kZSwKCQkgICAgICAgdWludDMyX3Qgc3RyaWRlLAoJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCgkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCnsKCWlmIChoYXNfdXNlcnB0cigoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3IpKQoJCWJ1Zm1nci0+Ym9fYWxsb2NfdXNlcnB0ciA9IGRybV9pbnRlbF9nZW1fYm9fYWxsb2NfdXNlcnB0cjsKCWVsc2UKCQlidWZtZ3ItPmJvX2FsbG9jX3VzZXJwdHIgPSBOVUxMOwoKCXJldHVybiBkcm1faW50ZWxfYm9fYWxsb2NfdXNlcnB0cihidWZtZ3IsIG5hbWUsIGFkZHIsCgkJCQkJICB0aWxpbmdfbW9kZSwgc3RyaWRlLCBzaXplLCBmbGFncyk7Cn0KCnN0YXRpYyBpbnQgZ2V0X3RpbGluZ19tb2RlKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAoJCQkgICB1aW50MzJfdCBnZW1faGFuZGxlLAoJCQkgICB1aW50MzJfdCAqdGlsaW5nX21vZGUsCgkJCSAgIHVpbnQzMl90ICpzd2l6emxlX21vZGUpCnsKCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZyBnZXRfdGlsaW5nID0gewoJCS5oYW5kbGUgPSBnZW1faGFuZGxlLAoJfTsKCWludCByZXQ7CgoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfVElMSU5HLAoJCSAgICAgICAmZ2V0X3RpbGluZyk7CglpZiAocmV0ICE9IDAgJiYgZXJybm8gIT0gRU9QTk9UU1VQUCkKCQlyZXR1cm4gcmV0OwoKCSp0aWxpbmdfbW9kZSA9IGdldF90aWxpbmcudGlsaW5nX21vZGU7Cgkqc3dpenpsZV9tb2RlID0gZ2V0X3RpbGluZy5zd2l6emxlX21vZGU7CgoJcmV0dXJuIDA7Cn0KCi8qKgogKiBSZXR1cm5zIGEgZHJtX2ludGVsX2JvIHdyYXBwaW5nIHRoZSBnaXZlbiBidWZmZXIgb2JqZWN0IGhhbmRsZS4KICoKICogVGhpcyBjYW4gYmUgdXNlZCB3aGVuIG9uZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBwYXNzIGEgYnVmZmVyIG9iamVjdAogKiB0byBhbm90aGVyLgogKi8KZHJtX3B1YmxpYyBkcm1faW50ZWxfYm8gKgpkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCQkJICBjb25zdCBjaGFyICpuYW1lLAoJCQkJICB1bnNpZ25lZCBpbnQgaGFuZGxlKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CglpbnQgcmV0OwoJc3RydWN0IGRybV9nZW1fb3BlbiBvcGVuX2FyZzsKCgkvKiBBdCB0aGUgbW9tZW50IG1vc3QgYXBwbGljYXRpb25zIG9ubHkgaGF2ZSBhIGZldyBuYW1lZCBiby4KCSAqIEZvciBpbnN0YW5jZSwgaW4gYSBEUkkgY2xpZW50IG9ubHkgdGhlIHJlbmRlciBidWZmZXJzIHBhc3NlZAoJICogYmV0d2VlbiBYIGFuZCB0aGUgY2xpZW50IGFyZSBuYW1lZC4gQW5kIHNpbmNlIFggcmV0dXJucyB0aGUKCSAqIGFsdGVybmF0aW5nIG5hbWVzIGZvciB0aGUgZnJvbnQvYmFjayBidWZmZXIgYSBsaW5lYXIgc2VhcmNoCgkgKiBwcm92aWRlcyBhIHN1ZmZpY2llbnRseSBmYXN0IG1hdGNoLgoJICovCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJSEFTSF9GSU5EKG5hbWVfaGgsIGJ1Zm1ncl9nZW0tPm5hbWVfdGFibGUsCgkJICAmaGFuZGxlLCBzaXplb2YoaGFuZGxlKSwgYm9fZ2VtKTsKCWlmIChib19nZW0pIHsKCQlkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZSgmYm9fZ2VtLT5ibyk7CgkJZ290byBvdXQ7Cgl9CgoJbWVtY2xlYXIob3Blbl9hcmcpOwoJb3Blbl9hcmcubmFtZSA9IGhhbmRsZTsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfR0VNX09QRU4sCgkJICAgICAgICZvcGVuX2FyZyk7CglpZiAocmV0ICE9IDApIHsKCQlEQkcoIkNvdWxkbid0IHJlZmVyZW5jZSAlcyBoYW5kbGUgMHglMDh4OiAlc1xuIiwKCQkgICAgbmFtZSwgaGFuZGxlLCBzdHJlcnJvcihlcnJubykpOwoJCWJvX2dlbSA9IE5VTEw7CgkJZ290byBvdXQ7Cgl9CiAgICAgICAgLyogTm93IHNlZSBpZiBzb21lb25lIGhhcyB1c2VkIGEgcHJpbWUgaGFuZGxlIHRvIGdldCB0aGlzCiAgICAgICAgICogb2JqZWN0IGZyb20gdGhlIGtlcm5lbCBiZWZvcmUgYnkgbG9va2luZyB0aHJvdWdoIHRoZSBsaXN0CiAgICAgICAgICogYWdhaW4gZm9yIGEgbWF0Y2hpbmcgZ2VtX2hhbmRsZQogICAgICAgICAqLwoJSEFTSF9GSU5EKGhhbmRsZV9oaCwgYnVmbWdyX2dlbS0+aGFuZGxlX3RhYmxlLAoJCSAgJm9wZW5fYXJnLmhhbmRsZSwgc2l6ZW9mKG9wZW5fYXJnLmhhbmRsZSksIGJvX2dlbSk7CglpZiAoYm9fZ2VtKSB7CgkJZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UoJmJvX2dlbS0+Ym8pOwoJCWdvdG8gb3V0OwoJfQoKCWJvX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJvX2dlbSkpOwoJaWYgKCFib19nZW0pCgkJZ290byBvdXQ7CgoJYXRvbWljX3NldCgmYm9fZ2VtLT5yZWZjb3VudCwgMSk7CglEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOwoKCWJvX2dlbS0+Ym8uc2l6ZSA9IG9wZW5fYXJnLnNpemU7Cglib19nZW0tPmJvLm9mZnNldCA9IDA7Cglib19nZW0tPmJvLm9mZnNldDY0ID0gMDsKCWJvX2dlbS0+Ym8udmlydHVhbCA9IE5VTEw7Cglib19nZW0tPmJvLmJ1Zm1nciA9IGJ1Zm1ncjsKCWJvX2dlbS0+bmFtZSA9IG5hbWU7Cglib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gLTE7Cglib19nZW0tPmdlbV9oYW5kbGUgPSBvcGVuX2FyZy5oYW5kbGU7Cglib19nZW0tPmJvLmhhbmRsZSA9IG9wZW5fYXJnLmhhbmRsZTsKCWJvX2dlbS0+Z2xvYmFsX25hbWUgPSBoYW5kbGU7Cglib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CgoJSEFTSF9BREQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCgkJIGdlbV9oYW5kbGUsIHNpemVvZihib19nZW0tPmdlbV9oYW5kbGUpLCBib19nZW0pOwoJSEFTSF9BREQobmFtZV9oaCwgYnVmbWdyX2dlbS0+bmFtZV90YWJsZSwKCQkgZ2xvYmFsX25hbWUsIHNpemVvZihib19nZW0tPmdsb2JhbF9uYW1lKSwgYm9fZ2VtKTsKCglyZXQgPSBnZXRfdGlsaW5nX21vZGUoYnVmbWdyX2dlbSwgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgICAmYm9fZ2VtLT50aWxpbmdfbW9kZSwgJmJvX2dlbS0+c3dpenpsZV9tb2RlKTsKCWlmIChyZXQgIT0gMCkKCQlnb3RvIGVycl91bnJlZjsKCgkvKiBYWFggc3RyaWRlIGlzIHVua25vd24gKi8KCWRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoYnVmbWdyX2dlbSwgYm9fZ2VtLCAwKTsKCURCRygiYm9fY3JlYXRlX2Zyb21faGFuZGxlOiAlZCAoJXMpXG4iLCBoYW5kbGUsIGJvX2dlbS0+bmFtZSk7CgpvdXQ6CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CglyZXR1cm4gJmJvX2dlbS0+Ym87CgplcnJfdW5yZWY6Cglkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9nZW1fYm9fZnJlZShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglpbnQgcmV0OwoKCURSTUxJU1RERUwoJmJvX2dlbS0+dm1hX2xpc3QpOwoJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpIHsKCQlWRyhWQUxHUklORF9GUkVFTElLRV9CTE9DSyhib19nZW0tPm1lbV92aXJ0dWFsLCAwKSk7CgkJZHJtX211bm1hcChib19nZW0tPm1lbV92aXJ0dWFsLCBib19nZW0tPmJvLnNpemUpOwoJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOwoJfQoJaWYgKGJvX2dlbS0+d2NfdmlydHVhbCkgewoJCVZHKFZBTEdSSU5EX0ZSRUVMSUtFX0JMT0NLKGJvX2dlbS0+d2NfdmlydHVhbCwgMCkpOwoJCWRybV9tdW5tYXAoYm9fZ2VtLT53Y192aXJ0dWFsLCBib19nZW0tPmJvLnNpemUpOwoJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOwoJfQoJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpIHsKCQlkcm1fbXVubWFwKGJvX2dlbS0+Z3R0X3ZpcnR1YWwsIGJvX2dlbS0+Ym8uc2l6ZSk7CgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07Cgl9CgoJaWYgKGJvX2dlbS0+Z2xvYmFsX25hbWUpCgkJSEFTSF9ERUxFVEUobmFtZV9oaCwgYnVmbWdyX2dlbS0+bmFtZV90YWJsZSwgYm9fZ2VtKTsKCUhBU0hfREVMRVRFKGhhbmRsZV9oaCwgYnVmbWdyX2dlbS0+aGFuZGxlX3RhYmxlLCBib19nZW0pOwoKCS8qIENsb3NlIHRoaXMgb2JqZWN0ICovCglyZXQgPSBkcm1DbG9zZUJ1ZmZlckhhbmRsZShidWZtZ3JfZ2VtLT5mZCwgYm9fZ2VtLT5nZW1faGFuZGxlKTsKCWlmIChyZXQgIT0gMCkgewoJCURCRygiZHJtQ2xvc2VCdWZmZXJIYW5kbGUgJWQgZmFpbGVkICglcyk6ICVzXG4iLAoJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKCX0KCWZyZWUoYm8pOwp9CgpzdGF0aWMgdm9pZApkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChkcm1faW50ZWxfYm8gKmJvKQp7CiNpZiBIQVZFX1ZBTEdSSU5ECglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkKCQlWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUyhib19nZW0tPm1lbV92aXJ0dWFsLCBiby0+c2l6ZSk7CgoJaWYgKGJvX2dlbS0+d2NfdmlydHVhbCkKCQlWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUyhib19nZW0tPndjX3ZpcnR1YWwsIGJvLT5zaXplKTsKCglpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCkKCQlWQUxHUklORF9NQUtFX01FTV9OT0FDQ0VTUyhib19nZW0tPmd0dF92aXJ0dWFsLCBiby0+c2l6ZSk7CiNlbmRpZgp9CgovKiogRnJlZXMgYWxsIGNhY2hlZCBidWZmZXJzIHNpZ25pZmljYW50bHkgb2xkZXIgdGhhbiBAdGltZS4gKi8Kc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9jbGVhbnVwX2JvX2NhY2hlKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLCB0aW1lX3QgdGltZSkKewoJaW50IGk7CgoJaWYgKGJ1Zm1ncl9nZW0tPnRpbWUgPT0gdGltZSkKCQlyZXR1cm47CgoJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzOyBpKyspIHsKCQlzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgKmJ1Y2tldCA9CgkJICAgICZidWZtZ3JfZ2VtLT5jYWNoZV9idWNrZXRbaV07CgoJCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CgkJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKCgkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAoJCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5uZXh0LCBoZWFkKTsKCQkJaWYgKHRpbWUgLSBib19nZW0tPmZyZWVfdGltZSA8PSAxKQoJCQkJYnJlYWs7CgoJCQlEUk1MSVNUREVMKCZib19nZW0tPmhlYWQpOwoKCQkJZHJtX2ludGVsX2dlbV9ib19mcmVlKCZib19nZW0tPmJvKTsKCQl9Cgl9CgoJYnVmbWdyX2dlbS0+dGltZSA9IHRpbWU7Cn0KCnN0YXRpYyB2b2lkIGRybV9pbnRlbF9nZW1fYm9fcHVyZ2Vfdm1hX2NhY2hlKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQp7CglpbnQgbGltaXQ7CgoJREJHKCIlczogY2FjaGVkPSVkLCBvcGVuPSVkLCBsaW1pdD0lZFxuIiwgX19GVU5DVElPTl9fLAoJICAgIGJ1Zm1ncl9nZW0tPnZtYV9jb3VudCwgYnVmbWdyX2dlbS0+dm1hX29wZW4sIGJ1Zm1ncl9nZW0tPnZtYV9tYXgpOwoKCWlmIChidWZtZ3JfZ2VtLT52bWFfbWF4IDwgMCkKCQlyZXR1cm47CgoJLyogV2UgbWF5IG5lZWQgdG8gZXZpY3QgYSBmZXcgZW50cmllcyBpbiBvcmRlciB0byBjcmVhdGUgbmV3IG1tYXBzICovCglsaW1pdCA9IGJ1Zm1ncl9nZW0tPnZtYV9tYXggLSAyKmJ1Zm1ncl9nZW0tPnZtYV9vcGVuOwoJaWYgKGxpbWl0IDwgMCkKCQlsaW1pdCA9IDA7CgoJd2hpbGUgKGJ1Zm1ncl9nZW0tPnZtYV9jb3VudCA+IGxpbWl0KSB7CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOwoKCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKCQkJCSAgICAgIGJ1Zm1ncl9nZW0tPnZtYV9jYWNoZS5uZXh0LAoJCQkJICAgICAgdm1hX2xpc3QpOwoJCWFzc2VydChib19nZW0tPm1hcF9jb3VudCA9PSAwKTsKCQlEUk1MSVNUREVMSU5JVCgmYm9fZ2VtLT52bWFfbGlzdCk7CgoJCWlmIChib19nZW0tPm1lbV92aXJ0dWFsKSB7CgkJCWRybV9tdW5tYXAoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKCQkJYm9fZ2VtLT5tZW1fdmlydHVhbCA9IE5VTEw7CgkJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOwoJCX0KCQlpZiAoYm9fZ2VtLT53Y192aXJ0dWFsKSB7CgkJCWRybV9tdW5tYXAoYm9fZ2VtLT53Y192aXJ0dWFsLCBib19nZW0tPmJvLnNpemUpOwoJCQlib19nZW0tPndjX3ZpcnR1YWwgPSBOVUxMOwoJCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKCQl9CgkJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpIHsKCQkJZHJtX211bm1hcChib19nZW0tPmd0dF92aXJ0dWFsLCBib19nZW0tPmJvLnNpemUpOwoJCQlib19nZW0tPmd0dF92aXJ0dWFsID0gTlVMTDsKCQkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKCQkJCSAgICAgICBkcm1faW50ZWxfYm9fZ2VtICpib19nZW0pCnsKCWJ1Zm1ncl9nZW0tPnZtYV9vcGVuLS07CglEUk1MSVNUQUREVEFJTCgmYm9fZ2VtLT52bWFfbGlzdCwgJmJ1Zm1ncl9nZW0tPnZtYV9jYWNoZSk7CglpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkKCQlidWZtZ3JfZ2VtLT52bWFfY291bnQrKzsKCWlmIChib19nZW0tPndjX3ZpcnR1YWwpCgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50Kys7CglpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCkKCQlidWZtZ3JfZ2VtLT52bWFfY291bnQrKzsKCWRybV9pbnRlbF9nZW1fYm9fcHVyZ2Vfdm1hX2NhY2hlKGJ1Zm1ncl9nZW0pOwp9CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX29wZW5fdm1hKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAoJCQkJICAgICAgZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtKQp7CglidWZtZ3JfZ2VtLT52bWFfb3BlbisrOwoJRFJNTElTVERFTCgmYm9fZ2VtLT52bWFfbGlzdCk7CglpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkKCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKCWlmIChib19nZW0tPndjX3ZpcnR1YWwpCgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CglpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCkKCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKCWRybV9pbnRlbF9nZW1fYm9fcHVyZ2Vfdm1hX2NhY2hlKGJ1Zm1ncl9nZW0pOwp9CgpzdGF0aWMgdm9pZApkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2ZpbmFsKGRybV9pbnRlbF9ibyAqYm8sIHRpbWVfdCB0aW1lKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgKmJ1Y2tldDsKCWludCBpOwoKCS8qIFVucmVmZXJlbmNlIGFsbCB0aGUgdGFyZ2V0IGJ1ZmZlcnMgKi8KCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKCQlpZiAoYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tpXS5ibyAhPSBibykgewoJCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZChib19nZW0tPgoJCQkJCQkJCSAgcmVsb2NfdGFyZ2V0X2luZm9baV0uYm8sCgkJCQkJCQkJICB0aW1lKTsKCQl9Cgl9Cglmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudDsgaSsrKQoJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKGJvX2dlbS0+c29mdHBpbl90YXJnZXRbaV0sCgkJCQkJCQkJICB0aW1lKTsKCWJvX2dlbS0+a2ZsYWdzID0gMDsKCWJvX2dlbS0+cmVsb2NfY291bnQgPSAwOwoJYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCA9IGZhbHNlOwoJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudCA9IDA7CgoJREJHKCJib191bnJlZmVyZW5jZSBmaW5hbDogJWQgKCVzKVxuIiwKCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSk7CgoJLyogcmVsZWFzZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0ICovCglpZiAoYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbykgewoJCWZyZWUoYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyk7CgkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9IE5VTEw7Cgl9CglpZiAoYm9fZ2VtLT5yZWxvY3MpIHsKCQlmcmVlKGJvX2dlbS0+cmVsb2NzKTsKCQlib19nZW0tPnJlbG9jcyA9IE5VTEw7Cgl9CglpZiAoYm9fZ2VtLT5zb2Z0cGluX3RhcmdldCkgewoJCWZyZWUoYm9fZ2VtLT5zb2Z0cGluX3RhcmdldCk7CgkJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldCA9IE5VTEw7CgkJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplID0gMDsKCX0KCgkvKiBDbGVhciBhbnkgbGVmdC1vdmVyIG1hcHBpbmdzICovCglpZiAoYm9fZ2VtLT5tYXBfY291bnQpIHsKCQlEQkcoImJvIGZyZWVkIHdpdGggbm9uLXplcm8gbWFwLWNvdW50ICVkXG4iLCBib19nZW0tPm1hcF9jb3VudCk7CgkJYm9fZ2VtLT5tYXBfY291bnQgPSAwOwoJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CgkJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOwoJfQoKCWJ1Y2tldCA9IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0X2Zvcl9zaXplKGJ1Zm1ncl9nZW0sIGJvLT5zaXplKTsKCS8qIFB1dCB0aGUgYnVmZmVyIGludG8gb3VyIGludGVybmFsIGNhY2hlIGZvciByZXVzZSBpZiB3ZSBjYW4uICovCglpZiAoYnVmbWdyX2dlbS0+Ym9fcmV1c2UgJiYgYm9fZ2VtLT5yZXVzYWJsZSAmJiBidWNrZXQgIT0gTlVMTCAmJgoJICAgIGRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZV9pbnRlcm5hbChidWZtZ3JfZ2VtLCBib19nZW0sCgkJCQkJICAgICAgSTkxNV9NQURWX0RPTlRORUVEKSkgewoJCWJvX2dlbS0+ZnJlZV90aW1lID0gdGltZTsKCgkJYm9fZ2VtLT5uYW1lID0gTlVMTDsKCQlib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gLTE7CgoJCURSTUxJU1RBRERUQUlMKCZib19nZW0tPmhlYWQsICZidWNrZXQtPmhlYWQpOwoJfSBlbHNlIHsKCQlkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoYm8pOwoJfQp9CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZChkcm1faW50ZWxfYm8gKmJvLAoJCQkJCQkgICAgICB0aW1lX3QgdGltZSkKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJYXNzZXJ0KGF0b21pY19yZWFkKCZib19nZW0tPnJlZmNvdW50KSA+IDApOwoJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJvX2dlbS0+cmVmY291bnQpKQoJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfZmluYWwoYm8sIHRpbWUpOwp9CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlKGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWFzc2VydChhdG9taWNfcmVhZCgmYm9fZ2VtLT5yZWZjb3VudCkgPiAwKTsKCglpZiAoYXRvbWljX2FkZF91bmxlc3MoJmJvX2dlbS0+cmVmY291bnQsIC0xLCAxKSkgewoJCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0KCQkgICAgKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CgkJc3RydWN0IHRpbWVzcGVjIHRpbWU7CgoJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZSk7CgoJCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZib19nZW0tPnJlZmNvdW50KSkgewoJCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2ZpbmFsKGJvLCB0aW1lLnR2X3NlYyk7CgkJCWRybV9pbnRlbF9nZW1fY2xlYW51cF9ib19jYWNoZShidWZtZ3JfZ2VtLCB0aW1lLnR2X3NlYyk7CgkJfQoKCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7Cgl9Cn0KCnN0YXRpYyBpbnQgZHJtX2ludGVsX2dlbV9ib19tYXAoZHJtX2ludGVsX2JvICpibywgaW50IHdyaXRlX2VuYWJsZSkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluIHNldF9kb21haW47CglpbnQgcmV0OwoKCWlmIChib19nZW0tPmlzX3VzZXJwdHIpIHsKCQkvKiBSZXR1cm4gdGhlIHNhbWUgdXNlciBwdHIgKi8KCQliby0+dmlydHVhbCA9IGJvX2dlbS0+dXNlcl92aXJ0dWFsOwoJCXJldHVybiAwOwoJfQoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJaWYgKGJvX2dlbS0+bWFwX2NvdW50KysgPT0gMCkKCQlkcm1faW50ZWxfZ2VtX2JvX29wZW5fdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CgoJaWYgKCFib19nZW0tPm1lbV92aXJ0dWFsKSB7CgkJc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwIG1tYXBfYXJnOwoKCQlEQkcoImJvX21hcDogJWQgKCVzKSwgbWFwX2NvdW50PSVkXG4iLAoJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOwoKCQltZW1jbGVhcihtbWFwX2FyZyk7CgkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCW1tYXBfYXJnLnNpemUgPSBiby0+c2l6ZTsKCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQLAoJCQkgICAgICAgJm1tYXBfYXJnKTsKCQlpZiAocmV0ICE9IDApIHsKCQkJcmV0ID0gLWVycm5vOwoJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAoJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCgkJCSAgICBib19nZW0tPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCgkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoJCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgkJCXJldHVybiByZXQ7CgkJfQoJCVZHKFZBTEdSSU5EX01BTExPQ0xJS0VfQkxPQ0sobW1hcF9hcmcuYWRkcl9wdHIsIG1tYXBfYXJnLnNpemUsIDAsIDEpKTsKCQlib19nZW0tPm1lbV92aXJ0dWFsID0gKHZvaWQgKikodWludHB0cl90KSBtbWFwX2FyZy5hZGRyX3B0cjsKCX0KCURCRygiYm9fbWFwOiAlZCAoJXMpIC0+ICVwXG4iLCBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKCSAgICBib19nZW0tPm1lbV92aXJ0dWFsKTsKCWJvLT52aXJ0dWFsID0gYm9fZ2VtLT5tZW1fdmlydHVhbDsKCgltZW1jbGVhcihzZXRfZG9tYWluKTsKCXNldF9kb21haW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJc2V0X2RvbWFpbi5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fQ1BVOwoJaWYgKHdyaXRlX2VuYWJsZSkKCQlzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CgllbHNlCgkJc2V0X2RvbWFpbi53cml0ZV9kb21haW4gPSAwOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfRE9NQUlOLAoJCSAgICAgICAmc2V0X2RvbWFpbik7CglpZiAocmV0ICE9IDApIHsKCQlEQkcoIiVzOiVkOiBFcnJvciBzZXR0aW5nIHRvIENQVSBkb21haW4gJWQ6ICVzXG4iLAoJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwKCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKCX0KCglpZiAod3JpdGVfZW5hYmxlKQoJCWJvX2dlbS0+bWFwcGVkX2NwdV93cml0ZSA9IHRydWU7CgoJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOwoJVkcoVkFMR1JJTkRfTUFLRV9NRU1fREVGSU5FRChib19nZW0tPm1lbV92aXJ0dWFsLCBiby0+c2l6ZSkpOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50Cm1hcF9ndHQoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJaW50IHJldDsKCglpZiAoYm9fZ2VtLT5pc191c2VycHRyKQoJCXJldHVybiAtRUlOVkFMOwoKCWlmIChib19nZW0tPm1hcF9jb3VudCsrID09IDApCgkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoKCS8qIEdldCBhIG1hcHBpbmcgb2YgdGhlIGJ1ZmZlciBpZiB3ZSBoYXZlbid0IGJlZm9yZS4gKi8KCWlmIChib19nZW0tPmd0dF92aXJ0dWFsID09IE5VTEwpIHsKCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0IG1tYXBfYXJnOwoKCQlEQkcoImJvX21hcF9ndHQ6IG1tYXAgJWQgKCVzKSwgbWFwX2NvdW50PSVkXG4iLAoJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOwoKCQltZW1jbGVhcihtbWFwX2FyZyk7CgkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoKCQkvKiBHZXQgdGhlIGZha2Ugb2Zmc2V0IGJhY2suLi4gKi8KCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQX0dUVCwKCQkJICAgICAgICZtbWFwX2FyZyk7CgkJaWYgKHJldCAhPSAwKSB7CgkJCXJldCA9IC1lcnJubzsKCQkJREJHKCIlczolZDogRXJyb3IgcHJlcGFyaW5nIGJ1ZmZlciBtYXAgJWQgKCVzKTogJXMgLlxuIiwKCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywKCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAoJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKCQkJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkKCQkJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CgkJCXJldHVybiByZXQ7CgkJfQoKCQkvKiBhbmQgbW1hcCBpdCAqLwoJCWJvX2dlbS0+Z3R0X3ZpcnR1YWwgPSBkcm1fbW1hcCgwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKCQkJCQkgICAgICAgTUFQX1NIQVJFRCwgYnVmbWdyX2dlbS0+ZmQsCgkJCQkJICAgICAgIG1tYXBfYXJnLm9mZnNldCk7CgkJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwgPT0gTUFQX0ZBSUxFRCkgewoJCQlib19nZW0tPmd0dF92aXJ0dWFsID0gTlVMTDsKCQkJcmV0ID0gLWVycm5vOwoJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAoJCQkgICAgX19GSUxFX18sIF9fTElORV9fLAoJCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCgkJCSAgICBzdHJlcnJvcihlcnJubykpOwoJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQoJCQkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCQkJcmV0dXJuIHJldDsKCQl9Cgl9CgoJYm8tPnZpcnR1YWwgPSBib19nZW0tPmd0dF92aXJ0dWFsOwoKCURCRygiYm9fbWFwX2d0dDogJWQgKCVzKSAtPiAlcFxuIiwgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCgkgICAgYm9fZ2VtLT5ndHRfdmlydHVhbCk7CgoJcmV0dXJuIDA7Cn0KCmRybV9wdWJsaWMgaW50CmRybV9pbnRlbF9nZW1fYm9fbWFwX2d0dChkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4gc2V0X2RvbWFpbjsKCWludCByZXQ7CgoJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglyZXQgPSBtYXBfZ3R0KGJvKTsKCWlmIChyZXQpIHsKCQlwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgkJcmV0dXJuIHJldDsKCX0KCgkvKiBOb3cgbW92ZSBpdCB0byB0aGUgR1RUIGRvbWFpbiBzbyB0aGF0IHRoZSBHUFUgYW5kIENQVQoJICogY2FjaGVzIGFyZSBmbHVzaGVkIGFuZCB0aGUgR1BVIGlzbid0IGFjdGl2ZWx5IHVzaW5nIHRoZQoJICogYnVmZmVyLgoJICoKCSAqIFRoZSBwYWdlZmF1bHQgaGFuZGxlciBkb2VzIHRoaXMgZG9tYWluIGNoYW5nZSBmb3IgdXMgd2hlbgoJICogaXQgaGFzIHVuYm91bmQgdGhlIEJPIGZyb20gdGhlIEdUVCwgYnV0IGl0J3MgdXAgdG8gdXMgdG8KCSAqIHRlbGwgaXQgd2hlbiB3ZSdyZSBhYm91dCB0byB1c2UgdGhpbmdzIGlmIHdlIGhhZCBkb25lCgkgKiByZW5kZXJpbmcgYW5kIGl0IHN0aWxsIGhhcHBlbnMgdG8gYmUgYm91bmQgdG8gdGhlIEdUVC4KCSAqLwoJbWVtY2xlYXIoc2V0X2RvbWFpbik7CglzZXRfZG9tYWluLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKCXNldF9kb21haW4ud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX0RPTUFJTiwKCQkgICAgICAgJnNldF9kb21haW4pOwoJaWYgKHJldCAhPSAwKSB7CgkJREJHKCIlczolZDogRXJyb3Igc2V0dGluZyBkb21haW4gJWQ6ICVzXG4iLAoJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwKCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKCX0KCglkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CglWRyhWQUxHUklORF9NQUtFX01FTV9ERUZJTkVEKGJvX2dlbS0+Z3R0X3ZpcnR1YWwsIGJvLT5zaXplKSk7CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJcmV0dXJuIDA7Cn0KCi8qKgogKiBQZXJmb3JtcyBhIG1hcHBpbmcgb2YgdGhlIGJ1ZmZlciBvYmplY3QgbGlrZSB0aGUgbm9ybWFsIEdUVAogKiBtYXBwaW5nLCBidXQgYXZvaWRzIHdhaXRpbmcgZm9yIHRoZSBHUFUgdG8gYmUgZG9uZSByZWFkaW5nIGZyb20gb3IKICogcmVuZGVyaW5nIHRvIHRoZSBidWZmZXIuCiAqCiAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgR0xfQVJCX21hcF9idWZmZXJfcmFuZ2U6IFRoZQogKiB1c2VyIGFza3MgdG8gY3JlYXRlIGEgYnVmZmVyLCB0aGVuIGRvZXMgYSBtYXBwaW5nLCBmaWxscyBzb21lCiAqIHNwYWNlLCBydW5zIGEgZHJhd2luZyBjb21tYW5kLCB0aGVuIGFza3MgdG8gbWFwIGl0IGFnYWluIHdpdGhvdXQKICogc3luY2hyb25pemluZyBiZWNhdXNlIGl0IGd1YXJhbnRlZXMgdGhhdCBpdCB3b24ndCB3cml0ZSBvdmVyIHRoZQogKiBkYXRhIHRoYXQgdGhlIEdQVSBpcyBidXN5IHVzaW5nIChvciwgbW9yZSBzcGVjaWZpY2FsbHksIHRoYXQgaWYgaXQKICogZG9lcyB3cml0ZSBvdmVyIHRoZSBkYXRhLCBpdCBhY2tub3dsZWRnZXMgdGhhdCByZW5kZXJpbmcgaXMKICogdW5kZWZpbmVkKS4KICovCgpkcm1fcHVibGljIGludApkcm1faW50ZWxfZ2VtX2JvX21hcF91bnN5bmNocm9uaXplZChkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwojaWYgSEFWRV9WQUxHUklORAoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CiNlbmRpZgoJaW50IHJldDsKCgkvKiBJZiB0aGUgQ1BVIGNhY2hlIGlzbid0IGNvaGVyZW50IHdpdGggdGhlIEdUVCwgdGhlbiB1c2UgYQoJICogcmVndWxhciBzeW5jaHJvbml6ZWQgbWFwcGluZy4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgZG9uJ3QKCSAqIHRyYWNrIHdoZXJlIHRoZSBidWZmZXIgd2FzIGxhc3QgdXNlZCBvbiB0aGUgQ1BVIHNpZGUgaW4KCSAqIHRlcm1zIG9mIGRybV9pbnRlbF9ib19tYXAgdnMgZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0LCBzbwoJICogd2Ugd291bGQgcG90ZW50aWFsbHkgY29ycnVwdCB0aGUgYnVmZmVyIGV2ZW4gd2hlbiB0aGUgdXNlcgoJICogZG9lcyByZWFzb25hYmxlIHRoaW5ncy4KCSAqLwoJaWYgKCFidWZtZ3JfZ2VtLT5oYXNfbGxjKQoJCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoYm8pOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJcmV0ID0gbWFwX2d0dChibyk7CglpZiAocmV0ID09IDApIHsKCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CgkJVkcoVkFMR1JJTkRfTUFLRV9NRU1fREVGSU5FRChib19nZW0tPmd0dF92aXJ0dWFsLCBiby0+c2l6ZSkpOwoJfQoKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGRybV9pbnRlbF9nZW1fYm9fdW5tYXAoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW07Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWludCByZXQgPSAwOwoKCWlmIChibyA9PSBOVUxMKQoJCXJldHVybiAwOwoKCWlmIChib19nZW0tPmlzX3VzZXJwdHIpCgkJcmV0dXJuIDA7CgoJYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJaWYgKGJvX2dlbS0+bWFwX2NvdW50IDw9IDApIHsKCQlEQkcoImF0dGVtcHRlZCB0byB1bm1hcCBhbiB1bm1hcHBlZCBib1xuIik7CgkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJCS8qIFByZXNlcnZlIHRoZSBvbGQgYmVoYXZpb3VyIG9mIGp1c3QgdHJlYXRpbmcgdGhpcyBhcyBhCgkJICogbm8tb3AgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHRoZSBlcnJvci4KCQkgKi8KCQlyZXR1cm4gMDsKCX0KCglpZiAoYm9fZ2VtLT5tYXBwZWRfY3B1X3dyaXRlKSB7CgkJc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2ggc3dfZmluaXNoOwoKCQkvKiBDYXVzZSBhIGZsdXNoIHRvIGhhcHBlbiBpZiB0aGUgYnVmZmVyJ3MgcGlubmVkIGZvcgoJCSAqIHNjYW5vdXQsIHNvIHRoZSByZXN1bHRzIHNob3cgdXAgaW4gYSB0aW1lbHkgbWFubmVyLgoJCSAqIFVubGlrZSBHVFQgc2V0IGRvbWFpbnMsIHRoaXMgb25seSBkb2VzIHdvcmsgaWYgdGhlCgkJICogYnVmZmVyIHNob3VsZCBiZSBzY2Fub3V0LXJlbGF0ZWQuCgkJICovCgkJbWVtY2xlYXIoc3dfZmluaXNoKTsKCQlzd19maW5pc2guaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1NXX0ZJTklTSCwKCQkJICAgICAgICZzd19maW5pc2gpOwoJCXJldCA9IHJldCA9PSAtMSA/IC1lcnJubyA6IDA7CgoJCWJvX2dlbS0+bWFwcGVkX2NwdV93cml0ZSA9IGZhbHNlOwoJfQoKCS8qIFdlIG5lZWQgdG8gdW5tYXAgYWZ0ZXIgZXZlcnkgaW5ub3ZhdGlvbiBhcyB3ZSBjYW5ub3QgdHJhY2sKCSAqIGFuIG9wZW4gdm1hIGZvciBldmVyeSBibyBhcyB0aGF0IHdpbGwgZXhoYXVzdCB0aGUgc3lzdGVtCgkgKiBsaW1pdHMgYW5kIGNhdXNlIGxhdGVyIGZhaWx1cmVzLgoJICovCglpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKSB7CgkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CgkJYm8tPnZpcnR1YWwgPSBOVUxMOwoJfQoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldHVybiByZXQ7Cn0KCmRybV9wdWJsaWMgaW50CmRybV9pbnRlbF9nZW1fYm9fdW5tYXBfZ3R0KGRybV9pbnRlbF9ibyAqYm8pCnsKCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX3VubWFwKGJvKTsKfQoKc3RhdGljIGJvb2wgaXNfY2FjaGVfY29oZXJlbnQoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV9jYWNoaW5nIGFyZyA9IHt9OwoKCWFyZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CglpZiAoZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfQ0FDSElORywgJmFyZykpCgkJYXNzZXJ0KGZhbHNlKTsKCXJldHVybiBhcmcuY2FjaGluZyAhPSBJOTE1X0NBQ0hJTkdfTk9ORTsKfQoKc3RhdGljIHZvaWQgc2V0X2RvbWFpbihkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCByZWFkLCB1aW50MzJfdCB3cml0ZSkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluIGFyZyA9IHt9OwoKCWFyZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CglhcmcucmVhZF9kb21haW5zID0gcmVhZDsKCWFyZy53cml0ZV9kb21haW4gPSB3cml0ZTsKCWlmIChkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9ET01BSU4sICZhcmcpKQoJCWFzc2VydChmYWxzZSk7Cn0KCnN0YXRpYyBpbnQgbW1hcF93cml0ZShkcm1faW50ZWxfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCwgY29uc3Qgdm9pZCAqYnVmKQp7Cgl2b2lkICptYXAgPSBOVUxMOwoKCWlmICghbGVuZ3RoKQoJCXJldHVybiAwOwoKCWlmIChpc19jYWNoZV9jb2hlcmVudChibykpIHsKCQltYXAgPSBkcm1faW50ZWxfZ2VtX2JvX21hcF9fY3B1KGJvKTsKCQlpZiAobWFwKQoJCQlzZXRfZG9tYWluKGJvLCBJOTE1X0dFTV9ET01BSU5fQ1BVLCBJOTE1X0dFTV9ET01BSU5fQ1BVKTsKCX0KCWlmICghbWFwKSB7CgkJbWFwID0gZHJtX2ludGVsX2dlbV9ib19tYXBfX3djKGJvKTsKCQlpZiAobWFwKQoJCQlzZXRfZG9tYWluKGJvLCBJOTE1X0dFTV9ET01BSU5fV0MsIEk5MTVfR0VNX0RPTUFJTl9XQyk7Cgl9CgoJYXNzZXJ0KG1hcCk7CgltZW1jcHkoKGNoYXIgKiltYXAgKyBvZmZzZXQsIGJ1ZiwgbGVuZ3RoKTsKCWRybV9pbnRlbF9nZW1fYm9fdW5tYXAoYm8pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbW1hcF9yZWFkKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAoJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCB2b2lkICpidWYpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cgl2b2lkICptYXAgPSBOVUxMOwoKCWlmICghbGVuZ3RoKQoJCXJldHVybiAwOwoKCWlmIChidWZtZ3JfZ2VtLT5oYXNfbGxjIHx8IGlzX2NhY2hlX2NvaGVyZW50KGJvKSkgewoJCW1hcCA9IGRybV9pbnRlbF9nZW1fYm9fbWFwX19jcHUoYm8pOwoJCWlmIChtYXApCgkJCXNldF9kb21haW4oYm8sIEk5MTVfR0VNX0RPTUFJTl9DUFUsIDApOwoJfQoJaWYgKCFtYXApIHsKCQltYXAgPSBkcm1faW50ZWxfZ2VtX2JvX21hcF9fd2MoYm8pOwoJCWlmIChtYXApCgkJCXNldF9kb21haW4oYm8sIEk5MTVfR0VNX0RPTUFJTl9XQywgMCk7Cgl9CgoJYXNzZXJ0KG1hcCk7CgltZW1jcHkoYnVmLCAoY2hhciAqKW1hcCArIG9mZnNldCwgbGVuZ3RoKTsKCWRybV9pbnRlbF9nZW1fYm9fdW5tYXAoYm8pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAoJCQkgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCB2b2lkICpkYXRhKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSBwd3JpdGU7CglpbnQgcmV0OwoKCWlmIChib19nZW0tPmlzX3VzZXJwdHIpCgkJcmV0dXJuIC1FSU5WQUw7CgoJbWVtY2xlYXIocHdyaXRlKTsKCXB3cml0ZS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7Cglwd3JpdGUub2Zmc2V0ID0gb2Zmc2V0OwoJcHdyaXRlLnNpemUgPSBzaXplOwoJcHdyaXRlLmRhdGFfcHRyID0gKHVpbnQ2NF90KSAodWludHB0cl90KSBkYXRhOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9QV1JJVEUsCgkJICAgICAgICZwd3JpdGUpOwoJaWYgKHJldCkKCQlyZXQgPSAtZXJybm87CgoJaWYgKHJldCAhPSAwICYmIHJldCAhPSAtRU9QTk9UU1VQUCkgewoJCURCRygiJXM6JWQ6IEVycm9yIHdyaXRpbmcgZGF0YSB0byBidWZmZXIgJWQ6ICglZCAlZCkgJXMgLlxuIiwKCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsIChpbnQpb2Zmc2V0LAoJCSAgICAoaW50KXNpemUsIHN0cmVycm9yKGVycm5vKSk7CgkJcmV0dXJuIHJldDsKCX0KCglpZiAocmV0ID09IC1FT1BOT1RTVVBQKQoJCW1tYXBfd3JpdGUoYm8sIG9mZnNldCwgc2l6ZSwgZGF0YSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9nZXRfcGlwZV9mcm9tX2NydGNfaWQoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgY3J0Y19pZCkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOwoJc3RydWN0IGRybV9pOTE1X2dldF9waXBlX2Zyb21fY3J0Y19pZCBnZXRfcGlwZV9mcm9tX2NydGNfaWQ7CglpbnQgcmV0OwoKCW1lbWNsZWFyKGdldF9waXBlX2Zyb21fY3J0Y19pZCk7CglnZXRfcGlwZV9mcm9tX2NydGNfaWQuY3J0Y19pZCA9IGNydGNfaWQ7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VUX1BJUEVfRlJPTV9DUlRDX0lELAoJCSAgICAgICAmZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKTsKCWlmIChyZXQgIT0gMCkgewoJCS8qIFdlIHJldHVybiAtMSBoZXJlIHRvIHNpZ25hbCB0aGF0IHdlIGRvbid0CgkJICoga25vdyB3aGljaCBwaXBlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNydGMuCgkJICogVGhpcyBsZXRzIHRoZSBjYWxsZXIga25vdyB0aGF0IHRoaXMgaW5mb3JtYXRpb24KCQkgKiBpc24ndCBhdmFpbGFibGU7IHVzaW5nIHRoZSB3cm9uZyBwaXBlIGZvcgoJCSAqIHZibGFuayB3YWl0aW5nIGNhbiBjYXVzZSB0aGUgY2hpcHNldCB0byBsb2NrIHVwCgkJICovCgkJcmV0dXJuIC0xOwoJfQoKCXJldHVybiBnZXRfcGlwZV9mcm9tX2NydGNfaWQucGlwZTsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2dldF9zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAoJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV9wcmVhZCBwcmVhZDsKCWludCByZXQ7CgoJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKCQlyZXR1cm4gLUVJTlZBTDsKCgltZW1jbGVhcihwcmVhZCk7CglwcmVhZC5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CglwcmVhZC5vZmZzZXQgPSBvZmZzZXQ7CglwcmVhZC5zaXplID0gc2l6ZTsKCXByZWFkLmRhdGFfcHRyID0gKHVpbnQ2NF90KSAodWludHB0cl90KSBkYXRhOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9QUkVBRCwKCQkgICAgICAgJnByZWFkKTsKCWlmIChyZXQpCgkJcmV0ID0gLWVycm5vOwoKCWlmIChyZXQgIT0gMCAmJiByZXQgIT0gLUVPUE5PVFNVUFApIHsKCQlEQkcoIiVzOiVkOiBFcnJvciByZWFkaW5nIGRhdGEgZnJvbSBidWZmZXIgJWQ6ICglZCAlZCkgJXMgLlxuIiwKCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsIChpbnQpb2Zmc2V0LAoJCSAgICAoaW50KXNpemUsIHN0cmVycm9yKGVycm5vKSk7CgkJcmV0dXJuIHJldDsKCX0KCglpZiAocmV0ID09IC1FT1BOT1RTVVBQKQoJCW1tYXBfcmVhZChibywgb2Zmc2V0LCBzaXplLCBkYXRhKTsKCglyZXR1cm4gMDsKfQoKLyoqIFdhaXRzIGZvciBhbGwgR1BVIHJlbmRlcmluZyB3aXRoIHRoZSBvYmplY3QgdG8gaGF2ZSBjb21wbGV0ZWQuICovCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9nZW1fYm9fd2FpdF9yZW5kZXJpbmcoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2dlbV9ib19zdGFydF9ndHRfYWNjZXNzKGJvLCAxKTsKfQoKLyoqCiAqIFdhaXRzIG9uIGEgQk8gZm9yIHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZS4KICoKICogQGJvOiBidWZmZXIgb2JqZWN0IHRvIHdhaXQgZm9yCiAqIEB0aW1lb3V0X25zOiBhbW91bnQgb2YgdGltZSB0byB3YWl0IGluIG5hbm9zZWNvbmRzLgogKiAgIElmIHZhbHVlIGlzIGxlc3MgdGhhbiAwLCBhbiBpbmZpbml0ZSB3YWl0IHdpbGwgb2NjdXIuCiAqCiAqIFJldHVybnMgMCBpZiB0aGUgd2FpdCB3YXMgc3VjY2Vzc2Z1bCBpZS4gdGhlIGxhc3QgYmF0Y2ggcmVmZXJlbmNpbmcgdGhlCiAqIG9iamVjdCBoYXMgY29tcGxldGVkIHdpdGhpbiB0aGUgYWxsb3R0ZWQgdGltZS4gT3RoZXJ3aXNlIHNvbWUgbmVnYXRpdmUgcmV0dXJuCiAqIHZhbHVlIGRlc2NyaWJlcyB0aGUgZXJyb3IuIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgaXMgLUVUSU1FIHdoZW4gdGhlIHdhaXQgaGFzCiAqIGZhaWxlZCB0byB5aWVsZCB0aGUgZGVzaXJlZCByZXN1bHQuCiAqCiAqIFNpbWlsYXIgdG8gZHJtX2ludGVsX2dlbV9ib193YWl0X3JlbmRlcmluZyBleGNlcHQgYSB0aW1lb3V0IHBhcmFtZXRlciBhbGxvd3MKICogdGhlIG9wZXJhdGlvbiB0byBnaXZlIHVwIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4gQW5vdGhlciBzdWJ0bGUKICogZGlmZmVyZW5jZSBpcyB0aGUgaW50ZXJuYWwgbG9ja2luZyBzZW1hbnRpY3MgYXJlIGRpZmZlcmVudCAodGhpcyB2YXJpYW50IGRvZXMKICogbm90IGhvbGQgdGhlIGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgd2FpdCkuIFRoaXMgbWFrZXMgdGhlIHdhaXQgc3ViamVjdAogKiB0byBhIGxhcmdlciB1c2Vyc3BhY2UgcmFjZSB3aW5kb3cuCiAqCiAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaGFsbCB3YWl0IHVudGlsIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIGFjdGl2ZWx5CiAqIHJlZmVyZW5jZWQgd2l0aGluIGEgYmF0Y2ggYnVmZmVyIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsLiBUaGUgd2FpdCB3aWxsCiAqIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgYnVmZmVyIGlzIHJlLWlzc3VlZCB2aWEgYW5vdGhlciB0aHJlYWQsIG9yIGFuIGZsaW5rZWQKICogaGFuZGxlLiBVc2Vyc3BhY2UgbXVzdCBtYWtlIHN1cmUgdGhpcyByYWNlIGRvZXMgbm90IG9jY3VyIGlmIHN1Y2ggcHJlY2lzaW9uCiAqIGlzIGltcG9ydGFudC4KICoKICogTm90ZSB0aGF0IHNvbWUga2VybmVscyBoYXZlIGJyb2tlbiB0aGUgaW5pZml0ZSB3YWl0IGZvciBuZWdhdGl2ZSB2YWx1ZXMKICogcHJvbWlzZSwgdXBncmFkZSB0byBsYXRlc3Qgc3RhYmxlIGtlcm5lbHMgaWYgdGhpcyBpcyB0aGUgY2FzZS4KICovCmRybV9wdWJsaWMgaW50CmRybV9pbnRlbF9nZW1fYm9fd2FpdChkcm1faW50ZWxfYm8gKmJvLCBpbnQ2NF90IHRpbWVvdXRfbnMpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCXN0cnVjdCBkcm1faTkxNV9nZW1fd2FpdCB3YWl0OwoJaW50IHJldDsKCglpZiAoIWJ1Zm1ncl9nZW0tPmhhc193YWl0X3RpbWVvdXQpIHsKCQlEQkcoIiVzOiVkOiBUaW1lZCB3YWl0IGlzIG5vdCBzdXBwb3J0ZWQuIEZhbGxpbmcgYmFjayB0byAiCgkJICAgICJpbmZpbml0ZSB3YWl0XG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCWlmICh0aW1lb3V0X25zKSB7CgkJCWRybV9pbnRlbF9nZW1fYm9fd2FpdF9yZW5kZXJpbmcoYm8pOwoJCQlyZXR1cm4gMDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19idXN5KGJvKSA/IC1FVElNRSA6IDA7CgkJfQoJfQoKCW1lbWNsZWFyKHdhaXQpOwoJd2FpdC5ib19oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7Cgl3YWl0LnRpbWVvdXRfbnMgPSB0aW1lb3V0X25zOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9XQUlULCAmd2FpdCk7CglpZiAocmV0ID09IC0xKQoJCXJldHVybiAtZXJybm87CgoJcmV0dXJuIHJldDsKfQoKLyoqCiAqIFNldHMgdGhlIG9iamVjdCB0byB0aGUgR1RUIHJlYWQgYW5kIHBvc3NpYmx5IHdyaXRlIGRvbWFpbiwgdXNlZCBieSB0aGUgWAogKiAyRCBkcml2ZXIgaW4gdGhlIGFic2VuY2Ugb2Yga2VybmVsIHN1cHBvcnQgdG8gZG8gZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0KCkuCiAqCiAqIEluIGNvbWJpbmF0aW9uIHdpdGggZHJtX2ludGVsX2dlbV9ib19waW4oKSBhbmQgbWFudWFsIGZlbmNlIG1hbmFnZW1lbnQsIHdlCiAqIGNhbiBkbyB0aWxlZCBwaXhtYXBzIHRoaXMgd2F5LgogKi8KZHJtX3B1YmxpYyB2b2lkCmRybV9pbnRlbF9nZW1fYm9fc3RhcnRfZ3R0X2FjY2Vzcyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgd3JpdGVfZW5hYmxlKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4gc2V0X2RvbWFpbjsKCWludCByZXQ7CgoJbWVtY2xlYXIoc2V0X2RvbWFpbik7CglzZXRfZG9tYWluLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKCXNldF9kb21haW4ud3JpdGVfZG9tYWluID0gd3JpdGVfZW5hYmxlID8gSTkxNV9HRU1fRE9NQUlOX0dUVCA6IDA7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1NFVF9ET01BSU4sCgkJICAgICAgICZzZXRfZG9tYWluKTsKCWlmIChyZXQgIT0gMCkgewoJCURCRygiJXM6JWQ6IEVycm9yIHNldHRpbmcgbWVtb3J5IGRvbWFpbnMgJWQgKCUwOHggJTA4eCk6ICVzIC5cbiIsCgkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCSAgICBzZXRfZG9tYWluLnJlYWRfZG9tYWlucywgc2V0X2RvbWFpbi53cml0ZV9kb21haW4sCgkJICAgIHN0cmVycm9yKGVycm5vKSk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9idWZtZ3JfZ2VtX2Rlc3Ryb3koZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7CglpbnQgaSwgcmV0OwoKCWZyZWUoYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0cyk7CglmcmVlKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zKTsKCglwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCS8qIEZyZWUgYW55IGNhY2hlZCBidWZmZXIgb2JqZWN0cyB3ZSB3ZXJlIGdvaW5nIHRvIHJldXNlICovCglmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+bnVtX2J1Y2tldHM7IGkrKykgewoJCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0ID0KCQkgICAgJmJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXTsKCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CgoJCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CgkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAoJCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5uZXh0LCBoZWFkKTsKCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKCgkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CgkJfQoJfQoKCS8qIFJlbGVhc2UgdXNlcnB0ciBibyBrZXB0IGhhbmdpbmcgYXJvdW5kIGZvciBvcHRpbWlzYXRpb24uICovCglpZiAoYnVmbWdyX2dlbS0+dXNlcnB0cl9hY3RpdmUucHRyKSB7CgkJcmV0ID0gZHJtQ2xvc2VCdWZmZXJIYW5kbGUoYnVmbWdyX2dlbS0+ZmQsCgkJCQkJICAgYnVmbWdyX2dlbS0+dXNlcnB0cl9hY3RpdmUuaGFuZGxlKTsKCQlmcmVlKGJ1Zm1ncl9nZW0tPnVzZXJwdHJfYWN0aXZlLnB0cik7CgkJaWYgKHJldCkKCQkJZnByaW50ZihzdGRlcnIsCgkJCQkiRmFpbGVkIHRvIHJlbGVhc2UgdGVzdCB1c2VycHRyIG9iamVjdCEgKCVkKSAiCgkJCQkiaTkxNSBrZXJuZWwgZHJpdmVyIG1heSBub3QgYmUgc2FuZSFcbiIsIGVycm5vKTsKCX0KCglmcmVlKGJ1Zm1ncik7Cn0KCi8qKgogKiBBZGRzIHRoZSB0YXJnZXQgYnVmZmVyIHRvIHRoZSB2YWxpZGF0aW9uIGxpc3QgYW5kIGFkZHMgdGhlIHJlbG9jYXRpb24KICogdG8gdGhlIHJlbG9jX2J1ZmZlcidzIHJlbG9jYXRpb24gbGlzdC4KICoKICogVGhlIHJlbG9jYXRpb24gZW50cnkgYXQgdGhlIGdpdmVuIG9mZnNldCBtdXN0IGFscmVhZHkgY29udGFpbiB0aGUKICogcHJlY29tcHV0ZWQgcmVsb2NhdGlvbiB2YWx1ZSwgYmVjYXVzZSB0aGUga2VybmVsIHdpbGwgb3B0aW1pemUgb3V0CiAqIHRoZSByZWxvY2F0aW9uIGVudHJ5IHdyaXRlIHdoZW4gdGhlIGJ1ZmZlciBoYXNuJ3QgbW92ZWQgZnJvbSB0aGUKICogbGFzdCBrbm93biBvZmZzZXQgaW4gdGFyZ2V0X2JvLgogKi8Kc3RhdGljIGludApkb19ib19lbWl0X3JlbG9jKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKCQkgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCgkJIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluLAoJCSBib29sIG5lZWRfZmVuY2UpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9ib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSB0YXJnZXRfYm87Cglib29sIGZlbmNlZF9jb21tYW5kOwoKCWlmIChib19nZW0tPmhhc19lcnJvcikKCQlyZXR1cm4gLUVOT01FTTsKCglpZiAodGFyZ2V0X2JvX2dlbS0+aGFzX2Vycm9yKSB7CgkJYm9fZ2VtLT5oYXNfZXJyb3IgPSB0cnVlOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCS8qIFdlIG5ldmVyIHVzZSBIVyBmZW5jZXMgZm9yIHJlbmRlcmluZyBvbiA5NjUrICovCglpZiAoYnVmbWdyX2dlbS0+Z2VuID49IDQpCgkJbmVlZF9mZW5jZSA9IGZhbHNlOwoKCWZlbmNlZF9jb21tYW5kID0gbmVlZF9mZW5jZTsKCWlmICh0YXJnZXRfYm9fZ2VtLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQoJCW5lZWRfZmVuY2UgPSBmYWxzZTsKCgkvKiBDcmVhdGUgYSBuZXcgcmVsb2NhdGlvbiBsaXN0IGlmIG5lZWRlZCAqLwoJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgJiYgZHJtX2ludGVsX3NldHVwX3JlbG9jX2xpc3QoYm8pKQoJCXJldHVybiAtRU5PTUVNOwoKCS8qIENoZWNrIG92ZXJmbG93ICovCglhc3NlcnQoYm9fZ2VtLT5yZWxvY19jb3VudCA8IGJ1Zm1ncl9nZW0tPm1heF9yZWxvY3MpOwoKCS8qIENoZWNrIGFyZ3MgKi8KCWFzc2VydChvZmZzZXQgPD0gYm8tPnNpemUgLSA0KTsKCWFzc2VydCgod3JpdGVfZG9tYWluICYgKHdyaXRlX2RvbWFpbiAtIDEpKSA9PSAwKTsKCgkvKiBBbiBvYmplY3QgbmVlZGluZyBhIGZlbmNlIGlzIGEgdGlsZWQgYnVmZmVyLCBzbyBpdCB3b24ndCBoYXZlCgkgKiByZWxvY3MgdG8gb3RoZXIgYnVmZmVycy4KCSAqLwoJaWYgKG5lZWRfZmVuY2UpIHsKCQlhc3NlcnQodGFyZ2V0X2JvX2dlbS0+cmVsb2NfY291bnQgPT0gMCk7CgkJdGFyZ2V0X2JvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAxOwoJfQoKCS8qIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIG5vdCBhZGRpbmcgYSByZWxvYyB0byBzb21ldGhpbmcgd2hvc2Ugc2l6ZSBoYXMKCSAqIGFscmVhZHkgYmVlbiBhY2NvdW50ZWQgZm9yLgoJICovCglhc3NlcnQoIWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQpOwoJaWYgKHRhcmdldF9ib19nZW0gIT0gYm9fZ2VtKSB7CgkJdGFyZ2V0X2JvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSB0cnVlOwoJCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplICs9IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfc2l6ZTsKCQlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzICs9IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOwoJfQoKCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9bYm9fZ2VtLT5yZWxvY19jb3VudF0uYm8gPSB0YXJnZXRfYm87CglpZiAodGFyZ2V0X2JvICE9IGJvKQoJCWRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKHRhcmdldF9ibyk7CglpZiAoZmVuY2VkX2NvbW1hbmQpCgkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tib19nZW0tPnJlbG9jX2NvdW50XS5mbGFncyA9CgkJCURSTV9JTlRFTF9SRUxPQ19GRU5DRTsKCWVsc2UKCQlib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2JvX2dlbS0+cmVsb2NfY291bnRdLmZsYWdzID0gMDsKCglib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS5vZmZzZXQgPSBvZmZzZXQ7Cglib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS5kZWx0YSA9IHRhcmdldF9vZmZzZXQ7Cglib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS50YXJnZXRfaGFuZGxlID0KCSAgICB0YXJnZXRfYm9fZ2VtLT5nZW1faGFuZGxlOwoJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ucmVhZF9kb21haW5zID0gcmVhZF9kb21haW5zOwoJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ud3JpdGVfZG9tYWluID0gd3JpdGVfZG9tYWluOwoJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ucHJlc3VtZWRfb2Zmc2V0ID0gdGFyZ2V0X2JvLT5vZmZzZXQ2NDsKCWJvX2dlbS0+cmVsb2NfY291bnQrKzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib191c2VfNDhiX2FkZHJlc3NfcmFuZ2UoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgZW5hYmxlKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglpZiAoZW5hYmxlKQoJCWJvX2dlbS0+a2ZsYWdzIHw9IEVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTOwoJZWxzZQoJCWJvX2dlbS0+a2ZsYWdzICY9IH5FWEVDX09CSkVDVF9TVVBQT1JUU180OEJfQUREUkVTUzsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2FkZF9zb2Z0cGluX3RhcmdldChkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2JvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIHRhcmdldF9ibzsKCWlmIChib19nZW0tPmhhc19lcnJvcikKCQlyZXR1cm4gLUVOT01FTTsKCglpZiAodGFyZ2V0X2JvX2dlbS0+aGFzX2Vycm9yKSB7CgkJYm9fZ2VtLT5oYXNfZXJyb3IgPSB0cnVlOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWlmICghKHRhcmdldF9ib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCkpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAodGFyZ2V0X2JvX2dlbSA9PSBib19nZW0pCgkJcmV0dXJuIC1FSU5WQUw7CgoJaWYgKGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQgPT0gYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplKSB7CgkJaW50IG5ld19zaXplID0gYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplICogMjsKCQlpZiAobmV3X3NpemUgPT0gMCkKCQkJbmV3X3NpemUgPSBidWZtZ3JfZ2VtLT5tYXhfcmVsb2NzOwoKCQlib19nZW0tPnNvZnRwaW5fdGFyZ2V0ID0gcmVhbGxvYyhib19nZW0tPnNvZnRwaW5fdGFyZ2V0LCBuZXdfc2l6ZSAqCgkJCQlzaXplb2YoZHJtX2ludGVsX2JvICopKTsKCQlpZiAoIWJvX2dlbS0+c29mdHBpbl90YXJnZXQpCgkJCXJldHVybiAtRU5PTUVNOwoKCQlib19nZW0tPnNvZnRwaW5fdGFyZ2V0X3NpemUgPSBuZXdfc2l6ZTsKCX0KCWJvX2dlbS0+c29mdHBpbl90YXJnZXRbYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudF0gPSB0YXJnZXRfYm87Cglkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZSh0YXJnZXRfYm8pOwoJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudCsrOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvYyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCgkJCSAgICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKCQkJICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKil0YXJnZXRfYm87CgoJaWYgKHRhcmdldF9ib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCkKCQlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hZGRfc29mdHBpbl90YXJnZXQoYm8sIHRhcmdldF9ibyk7CgllbHNlCgkJcmV0dXJuIGRvX2JvX2VtaXRfcmVsb2MoYm8sIG9mZnNldCwgdGFyZ2V0X2JvLCB0YXJnZXRfb2Zmc2V0LAoJCQkJCXJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLAoJCQkJCSFidWZtZ3JfZ2VtLT5mZW5jZWRfcmVsb2NzKTsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2VtaXRfcmVsb2NfZmVuY2UoZHJtX2ludGVsX2JvICpibywgdWludDMyX3Qgb2Zmc2V0LAoJCQkJICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywKCQkJCSAgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKCQkJCSAgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pCnsKCXJldHVybiBkb19ib19lbWl0X3JlbG9jKGJvLCBvZmZzZXQsIHRhcmdldF9ibywgdGFyZ2V0X29mZnNldCwKCQkJCXJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLCB0cnVlKTsKfQoKZHJtX3B1YmxpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19nZXRfcmVsb2NfY291bnQoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJcmV0dXJuIGJvX2dlbS0+cmVsb2NfY291bnQ7Cn0KCi8qKgogKiBSZW1vdmVzIGV4aXN0aW5nIHJlbG9jYXRpb24gZW50cmllcyBpbiB0aGUgQk8gYWZ0ZXIgInN0YXJ0Ii4KICoKICogVGhpcyBhbGxvd3MgYSB1c2VyIHRvIGF2b2lkIGEgdHdvLXN0ZXAgcHJvY2VzcyBmb3Igc3RhdGUgc2V0dXAgd2l0aAogKiBjb3VudGluZyB1cCBhbGwgdGhlIGJ1ZmZlciBvYmplY3RzIGFuZCBkb2luZyBhCiAqIGRybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoKSBiZWZvcmUgZW1pdHRpbmcgYW55IG9mIHRoZQogKiByZWxvY2F0aW9ucyBmb3IgdGhlIHN0YXRlIHNldHVwLiAgSW5zdGVhZCwgc2F2ZSB0aGUgc3RhdGUgb2YgdGhlCiAqIGJhdGNoYnVmZmVyIGluY2x1ZGluZyBkcm1faW50ZWxfZ2VtX2dldF9yZWxvY19jb3VudCgpLCBlbWl0IGFsbCB0aGUKICogc3RhdGUsIGFuZCB0aGVuIGNoZWNrIGlmIGl0IHN0aWxsIGZpdHMgaW4gdGhlIGFwZXJ0dXJlLgogKgogKiBBbnkgZnVydGhlciBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgcXVlcmllcwogKiBpbnZvbHZpbmcgdGhpcyBidWZmZXIgaW4gdGhlIHRyZWUgYXJlIHVuZGVmaW5lZCBhZnRlciB0aGlzIGNhbGwuCiAqCiAqIFRoaXMgYWxzbyByZW1vdmVzIGFsbCBzb2Z0cGlubmVkIHRhcmdldHMgYmVpbmcgcmVmZXJlbmNlZCBieSB0aGUgQk8uCiAqLwpkcm1fcHVibGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib19jbGVhcl9yZWxvY3MoZHJtX2ludGVsX2JvICpibywgaW50IHN0YXJ0KQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglpbnQgaTsKCXN0cnVjdCB0aW1lc3BlYyB0aW1lOwoKCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZSk7CgoJYXNzZXJ0KGJvX2dlbS0+cmVsb2NfY291bnQgPj0gc3RhcnQpOwoKCS8qIFVucmVmZXJlbmNlIHRoZSBjbGVhcmVkIHRhcmdldCBidWZmZXJzICovCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCWZvciAoaSA9IHN0YXJ0OyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2JvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm87CgkJaWYgKCZ0YXJnZXRfYm9fZ2VtLT5ibyAhPSBibykgewoJCQlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzIC09IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOwoJCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZCgmdGFyZ2V0X2JvX2dlbS0+Ym8sCgkJCQkJCQkJICB0aW1lLnR2X3NlYyk7CgkJfQoJfQoJYm9fZ2VtLT5yZWxvY19jb3VudCA9IHN0YXJ0OwoKCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnNvZnRwaW5fdGFyZ2V0X2NvdW50OyBpKyspIHsKCQlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldFtpXTsKCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZCgmdGFyZ2V0X2JvX2dlbS0+Ym8sIHRpbWUudHZfc2VjKTsKCX0KCWJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQgPSAwOwoKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCn0KCi8qKgogKiBXYWxrIHRoZSB0cmVlIG9mIHJlbG9jYXRpb25zIHJvb3RlZCBhdCBCTyBhbmQgYWNjdW11bGF0ZSB0aGUgbGlzdCBvZgogKiB2YWxpZGF0aW9ucyB0byBiZSBwZXJmb3JtZWQgYW5kIHVwZGF0ZSB0aGUgcmVsb2NhdGlvbiBidWZmZXJzIHdpdGgKICogaW5kZXggdmFsdWVzIGludG8gdGhlIHZhbGlkYXRpb24gbGlzdC4KICovCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYzIoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKilibzsKCWludCBpOwoKCWlmIChib19nZW0tPnJlbG9jcyA9PSBOVUxMICYmIGJvX2dlbS0+c29mdHBpbl90YXJnZXQgPT0gTlVMTCkKCQlyZXR1cm47CgoJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IGkrKykgewoJCWRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvID0gYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tpXS5ibzsKCQlpbnQgbmVlZF9mZW5jZTsKCgkJaWYgKHRhcmdldF9ibyA9PSBibykKCQkJY29udGludWU7CgoJCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKCgkJLyogQ29udGludWUgd2Fsa2luZyB0aGUgdHJlZSBkZXB0aC1maXJzdC4gKi8KCQlkcm1faW50ZWxfZ2VtX2JvX3Byb2Nlc3NfcmVsb2MyKHRhcmdldF9ibyk7CgoJCW5lZWRfZmVuY2UgPSAoYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tpXS5mbGFncyAmCgkJCSAgICAgIERSTV9JTlRFTF9SRUxPQ19GRU5DRSk7CgoJCS8qIEFkZCB0aGUgdGFyZ2V0IHRvIHRoZSB2YWxpZGF0ZSBsaXN0ICovCgkJZHJtX2ludGVsX2FkZF92YWxpZGF0ZV9idWZmZXIyKHRhcmdldF9ibywgbmVlZF9mZW5jZSk7Cgl9CgoJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGkrKykgewoJCWRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvID0gYm9fZ2VtLT5zb2Z0cGluX3RhcmdldFtpXTsKCgkJaWYgKHRhcmdldF9ibyA9PSBibykKCQkJY29udGludWU7CgoJCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKCQlkcm1faW50ZWxfZ2VtX2JvX3Byb2Nlc3NfcmVsb2MyKHRhcmdldF9ibyk7CgkJZHJtX2ludGVsX2FkZF92YWxpZGF0ZV9idWZmZXIyKHRhcmdldF9ibywgZmFsc2UpOwoJfQp9CgpzdGF0aWMgdm9pZApkcm1faW50ZWxfdXBkYXRlX2J1ZmZlcl9vZmZzZXRzMiAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OyBpKyspIHsKCQlkcm1faW50ZWxfYm8gKmJvID0gYnVmbWdyX2dlbS0+ZXhlY19ib3NbaV07CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKilibzsKCgkJLyogVXBkYXRlIHRoZSBidWZmZXIgb2Zmc2V0ICovCgkJaWYgKGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0ICE9IGJvLT5vZmZzZXQ2NCkgewoJCQkvKiBJZiB3ZSdyZSBzZWVpbmcgc29mdHBpbm5lZCBvYmplY3QgaGVyZSBpdCBtZWFucyB0aGF0IHRoZSBrZXJuZWwKCQkJICogaGFzIHJlbG9jYXRlZCBvdXIgb2JqZWN0Li4uIEluZGljYXRpbmcgYSBwcm9ncmFtbWluZyBlcnJvcgoJCQkgKi8KCQkJYXNzZXJ0KCEoYm9fZ2VtLT5rZmxhZ3MgJiBFWEVDX09CSkVDVF9QSU5ORUQpKTsKCQkJREJHKCJCTyAlZCAoJXMpIG1pZ3JhdGVkOiAweCUwOHggJTA4eCAtPiAweCUwOHggJTA4eFxuIiwKCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAoJCQkgICAgdXBwZXJfMzJfYml0cyhiby0+b2Zmc2V0NjQpLAoJCQkgICAgbG93ZXJfMzJfYml0cyhiby0+b2Zmc2V0NjQpLAoJCQkgICAgdXBwZXJfMzJfYml0cyhidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2ldLm9mZnNldCksCgkJCSAgICBsb3dlcl8zMl9iaXRzKGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0KSk7CgkJCWJvLT5vZmZzZXQ2NCA9IGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0OwoJCQliby0+b2Zmc2V0ID0gYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpXS5vZmZzZXQ7CgkJfQoJfQp9Cgpkcm1fcHVibGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib19hdWJfZHVtcF9ibXAoZHJtX2ludGVsX2JvICpibywKCQkJICAgICAgaW50IHgxLCBpbnQgeTEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkJICAgICAgZW51bSBhdWJfZHVtcF9ibXBfZm9ybWF0IGZvcm1hdCwKCQkJICAgICAgaW50IHBpdGNoLCBpbnQgb2Zmc2V0KQp7Cn0KCnN0YXRpYyBpbnQKZG9fZXhlYzIoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsIGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCgkgZHJtX2NsaXBfcmVjdF90ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLCBpbnQgRFI0LAoJIGludCBpbl9mZW5jZSwgaW50ICpvdXRfZmVuY2UsCgkgdW5zaWduZWQgaW50IGZsYWdzKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWNidWY7CglpbnQgcmV0ID0gMDsKCWludCBpOwoKCWlmICh0b19ib19nZW0oYm8pLT5oYXNfZXJyb3IpCgkJcmV0dXJuIC1FTk9NRU07CgoJc3dpdGNoIChmbGFncyAmIDB4NykgewoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCWNhc2UgSTkxNV9FWEVDX0JMVDoKCQlpZiAoIWJ1Zm1ncl9nZW0tPmhhc19ibHQpCgkJCXJldHVybiAtRUlOVkFMOwoJCWJyZWFrOwoJY2FzZSBJOTE1X0VYRUNfQlNEOgoJCWlmICghYnVmbWdyX2dlbS0+aGFzX2JzZCkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEk5MTVfRVhFQ19WRUJPWDoKCQlpZiAoIWJ1Zm1ncl9nZW0tPmhhc192ZWJveCkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEk5MTVfRVhFQ19SRU5ERVI6CgljYXNlIEk5MTVfRVhFQ19ERUZBVUxUOgoJCWJyZWFrOwoJfQoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgkvKiBVcGRhdGUgaW5kaWNlcyBhbmQgc2V0IHVwIHRoZSB2YWxpZGF0ZSBsaXN0LiAqLwoJZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jMihibyk7CgoJLyogQWRkIHRoZSBiYXRjaCBidWZmZXIgdG8gdGhlIHZhbGlkYXRpb24gbGlzdC4gIFRoZXJlIGFyZSBubyByZWxvY2F0aW9ucwoJICogcG9pbnRpbmcgdG8gaXQuCgkgKi8KCWRybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyMihibywgMCk7CgoJbWVtY2xlYXIoZXhlY2J1Zik7CglleGVjYnVmLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdClidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzOwoJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OwoJZXhlY2J1Zi5iYXRjaF9zdGFydF9vZmZzZXQgPSAwOwoJZXhlY2J1Zi5iYXRjaF9sZW4gPSB1c2VkOwoJZXhlY2J1Zi5jbGlwcmVjdHNfcHRyID0gKHVpbnRwdHJfdCljbGlwcmVjdHM7CglleGVjYnVmLm51bV9jbGlwcmVjdHMgPSBudW1fY2xpcHJlY3RzOwoJZXhlY2J1Zi5EUjEgPSAwOwoJZXhlY2J1Zi5EUjQgPSBEUjQ7CglleGVjYnVmLmZsYWdzID0gZmxhZ3M7CglpZiAoY3R4ID09IE5VTEwpCgkJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVmLCAwKTsKCWVsc2UKCQlpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0X2lkKGV4ZWNidWYsIGN0eC0+Y3R4X2lkKTsKCWV4ZWNidWYucnN2ZDIgPSAwOwoJaWYgKGluX2ZlbmNlICE9IC0xKSB7CgkJZXhlY2J1Zi5yc3ZkMiA9IGluX2ZlbmNlOwoJCWV4ZWNidWYuZmxhZ3MgfD0gSTkxNV9FWEVDX0ZFTkNFX0lOOwoJfQoJaWYgKG91dF9mZW5jZSAhPSBOVUxMKSB7CgkJKm91dF9mZW5jZSA9IC0xOwoJCWV4ZWNidWYuZmxhZ3MgfD0gSTkxNV9FWEVDX0ZFTkNFX09VVDsKCX0KCglpZiAoYnVmbWdyX2dlbS0+bm9fZXhlYykKCQlnb3RvIHNraXBfZXhlY3V0aW9uOwoKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjJfV1IsCgkJICAgICAgICZleGVjYnVmKTsKCWlmIChyZXQgIT0gMCkgewoJCXJldCA9IC1lcnJubzsKCQlpZiAocmV0ID09IC1FTk9TUEMpIHsKCQkJREJHKCJFeGVjYnVmZmVyIGZhaWxzIHRvIHBpbi4gIgoJCQkgICAgIkVzdGltYXRlOiAldS4gQWN0dWFsOiAldS4gQXZhaWxhYmxlOiAldVxuIiwKCQkJICAgIGRybV9pbnRlbF9nZW1fZXN0aW1hdGVfYmF0Y2hfc3BhY2UoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCgkJCQkJCQkgICAgICAgYnVmbWdyX2dlbS0+ZXhlY19jb3VudCksCgkJCSAgICBkcm1faW50ZWxfZ2VtX2NvbXB1dGVfYmF0Y2hfc3BhY2UoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCgkJCQkJCQkgICAgICBidWZtZ3JfZ2VtLT5leGVjX2NvdW50KSwKCQkJICAgICh1bnNpZ25lZCBpbnQpIGJ1Zm1ncl9nZW0tPmd0dF9zaXplKTsKCQl9Cgl9Cglkcm1faW50ZWxfdXBkYXRlX2J1ZmZlcl9vZmZzZXRzMihidWZtZ3JfZ2VtKTsKCglpZiAocmV0ID09IDAgJiYgb3V0X2ZlbmNlICE9IE5VTEwpCgkJKm91dF9mZW5jZSA9IGV4ZWNidWYucnN2ZDIgPj4gMzI7Cgpza2lwX2V4ZWN1dGlvbjoKCWlmIChidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcpCgkJZHJtX2ludGVsX2dlbV9kdW1wX3ZhbGlkYXRpb25fbGlzdChidWZtZ3JfZ2VtKTsKCglmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gdG9fYm9fZ2VtKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldKTsKCgkJYm9fZ2VtLT5pZGxlID0gZmFsc2U7CgoJCS8qIERpc2Nvbm5lY3QgdGhlIGJ1ZmZlciBmcm9tIHRoZSB2YWxpZGF0ZSBsaXN0ICovCgkJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOwoJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldID0gTlVMTDsKCX0KCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQgPSAwOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19leGVjMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwKCQkgICAgICAgZHJtX2NsaXBfcmVjdF90ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLAoJCSAgICAgICBpbnQgRFI0KQp7CglyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIE5VTEwsIGNsaXByZWN0cywgbnVtX2NsaXByZWN0cywgRFI0LAoJCQktMSwgTlVMTCwgSTkxNV9FWEVDX1JFTkRFUik7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19tcmJfZXhlYzIoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCgkJCWRybV9jbGlwX3JlY3RfdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCwKCQkJdW5zaWduZWQgaW50IGZsYWdzKQp7CglyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIE5VTEwsIGNsaXByZWN0cywgbnVtX2NsaXByZWN0cywgRFI0LAoJCQktMSwgTlVMTCwgZmxhZ3MpOwp9Cgpkcm1fcHVibGljIGludApkcm1faW50ZWxfZ2VtX2JvX2NvbnRleHRfZXhlYyhkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfY29udGV4dCAqY3R4LAoJCQkgICAgICBpbnQgdXNlZCwgdW5zaWduZWQgaW50IGZsYWdzKQp7CglyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIGN0eCwgTlVMTCwgMCwgMCwgLTEsIE5VTEwsIGZsYWdzKTsKfQoKZHJtX3B1YmxpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19mZW5jZV9leGVjKGRybV9pbnRlbF9ibyAqYm8sCgkJCSAgICBkcm1faW50ZWxfY29udGV4dCAqY3R4LAoJCQkgICAgaW50IHVzZWQsCgkJCSAgICBpbnQgaW5fZmVuY2UsCgkJCSAgICBpbnQgKm91dF9mZW5jZSwKCQkJICAgIHVuc2lnbmVkIGludCBmbGFncykKewoJcmV0dXJuIGRvX2V4ZWMyKGJvLCB1c2VkLCBjdHgsIE5VTEwsIDAsIDAsIGluX2ZlbmNlLCBvdXRfZmVuY2UsIGZsYWdzKTsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX3Bpbihkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBhbGlnbm1lbnQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCXN0cnVjdCBkcm1faTkxNV9nZW1fcGluIHBpbjsKCWludCByZXQ7CgoJbWVtY2xlYXIocGluKTsKCXBpbi5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CglwaW4uYWxpZ25tZW50ID0gYWxpZ25tZW50OwoKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fUElOLAoJCSAgICAgICAmcGluKTsKCWlmIChyZXQgIT0gMCkKCQlyZXR1cm4gLWVycm5vOwoKCWJvLT5vZmZzZXQ2NCA9IHBpbi5vZmZzZXQ7Cgliby0+b2Zmc2V0ID0gcGluLm9mZnNldDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fdW5waW4oZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV91bnBpbiB1bnBpbjsKCWludCByZXQ7CgoJbWVtY2xlYXIodW5waW4pOwoJdW5waW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRU1fVU5QSU4sICZ1bnBpbik7CglpZiAocmV0ICE9IDApCgkJcmV0dXJuIC1lcnJubzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoZHJtX2ludGVsX2JvICpibywKCQkJCSAgICAgdWludDMyX3QgdGlsaW5nX21vZGUsCgkJCQkgICAgIHVpbnQzMl90IHN0cmlkZSkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfdGlsaW5nIHNldF90aWxpbmc7CglpbnQgcmV0OwoKCWlmIChib19nZW0tPmdsb2JhbF9uYW1lID09IDAgJiYKCSAgICB0aWxpbmdfbW9kZSA9PSBib19nZW0tPnRpbGluZ19tb2RlICYmCgkgICAgc3RyaWRlID09IGJvX2dlbS0+c3RyaWRlKQoJCXJldHVybiAwOwoKCW1lbXNldCgmc2V0X3RpbGluZywgMCwgc2l6ZW9mKHNldF90aWxpbmcpKTsKCWRvIHsKCQkvKiBzZXRfdGlsaW5nIGlzIHNsaWdodGx5IGJyb2tlbiBhbmQgb3ZlcndyaXRlcyB0aGUKCQkgKiBpbnB1dCBvbiB0aGUgZXJyb3IgcGF0aCwgc28gd2UgaGF2ZSB0byBvcGVuIGNvZGUKCQkgKiBybUlvY3RsLgoJCSAqLwoJCXNldF90aWxpbmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCXNldF90aWxpbmcudGlsaW5nX21vZGUgPSB0aWxpbmdfbW9kZTsKCQlzZXRfdGlsaW5nLnN0cmlkZSA9IHN0cmlkZTsKCgkJcmV0ID0gaW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJCSAgICBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX1RJTElORywKCQkJICAgICZzZXRfdGlsaW5nKTsKCX0gd2hpbGUgKHJldCA9PSAtMSAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSk7CglpZiAocmV0ID09IC0xKQoJCXJldHVybiAtZXJybm87CgoJYm9fZ2VtLT50aWxpbmdfbW9kZSA9IHNldF90aWxpbmcudGlsaW5nX21vZGU7Cglib19nZW0tPnN3aXp6bGVfbW9kZSA9IHNldF90aWxpbmcuc3dpenpsZV9tb2RlOwoJYm9fZ2VtLT5zdHJpZGUgPSBzZXRfdGlsaW5nLnN0cmlkZTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAoJCQkgICAgdWludDMyX3Qgc3RyaWRlKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglpbnQgcmV0OwoKCS8qIFRpbGluZyB3aXRoIHVzZXJwdHIgc3VyZmFjZXMgaXMgbm90IHN1cHBvcnRlZAoJICogb24gYWxsIGhhcmR3YXJlIHNvIHJlZnVzZSBpdCBmb3IgdGltZSBiZWluZy4KCSAqLwoJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKCQlyZXR1cm4gLUVJTlZBTDsKCgkvKiBMaW5lYXIgYnVmZmVycyBoYXZlIG5vIHN0cmlkZS4gQnkgZW5zdXJpbmcgdGhhdCB3ZSBvbmx5IGV2ZXIgdXNlCgkgKiBzdHJpZGUgMCB3aXRoIGxpbmVhciBidWZmZXJzLCB3ZSBzaW1wbGlmeSBvdXIgY29kZS4KCSAqLwoJaWYgKCp0aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQoJCXN0cmlkZSA9IDA7CgoJcmV0ID0gZHJtX2ludGVsX2dlbV9ib19zZXRfdGlsaW5nX2ludGVybmFsKGJvLCAqdGlsaW5nX21vZGUsIHN0cmlkZSk7CglpZiAocmV0ID09IDApCgkJZHJtX2ludGVsX2JvX2dlbV9zZXRfaW5fYXBlcnR1cmVfc2l6ZShidWZtZ3JfZ2VtLCBib19nZW0sIDApOwoKCSp0aWxpbmdfbW9kZSA9IGJvX2dlbS0+dGlsaW5nX21vZGU7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZ2V0X3RpbGluZyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAoJCQkgICAgdWludDMyX3QgKiBzd2l6emxlX21vZGUpCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCSp0aWxpbmdfbW9kZSA9IGJvX2dlbS0+dGlsaW5nX21vZGU7Cgkqc3dpenpsZV9tb2RlID0gYm9fZ2VtLT5zd2l6emxlX21vZGU7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX3NldF9zb2Z0cGluX29mZnNldChkcm1faW50ZWxfYm8gKmJvLCB1aW50NjRfdCBvZmZzZXQpCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWJvLT5vZmZzZXQ2NCA9IG9mZnNldDsKCWJvLT5vZmZzZXQgPSBvZmZzZXQ7Cglib19nZW0tPmtmbGFncyB8PSBFWEVDX09CSkVDVF9QSU5ORUQ7CgoJcmV0dXJuIDA7Cn0KCmRybV9wdWJsaWMgZHJtX2ludGVsX2JvICoKZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9wcmltZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCBwcmltZV9mZCwgaW50IHNpemUpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKCWludCByZXQ7Cgl1aW50MzJfdCBoYW5kbGU7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CgoJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCXJldCA9IGRybVByaW1lRkRUb0hhbmRsZShidWZtZ3JfZ2VtLT5mZCwgcHJpbWVfZmQsICZoYW5kbGUpOwoJaWYgKHJldCkgewoJCURCRygiY3JlYXRlX2Zyb21fcHJpbWU6IGZhaWxlZCB0byBvYnRhaW4gaGFuZGxlIGZyb20gZmQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwoJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKgoJICogU2VlIGlmIHRoZSBrZXJuZWwgaGFzIGFscmVhZHkgcmV0dXJuZWQgdGhpcyBidWZmZXIgdG8gdXMuIEp1c3QgYXMKCSAqIGZvciBuYW1lZCBidWZmZXJzLCB3ZSBtdXN0IG5vdCBjcmVhdGUgdHdvIGJvJ3MgcG9pbnRpbmcgYXQgdGhlIHNhbWUKCSAqIGtlcm5lbCBvYmplY3QKCSAqLwoJSEFTSF9GSU5EKGhhbmRsZV9oaCwgYnVmbWdyX2dlbS0+aGFuZGxlX3RhYmxlLAoJCSAgJmhhbmRsZSwgc2l6ZW9mKGhhbmRsZSksIGJvX2dlbSk7CglpZiAoYm9fZ2VtKSB7CgkJZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UoJmJvX2dlbS0+Ym8pOwoJCWdvdG8gb3V0OwoJfQoKCWJvX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJvX2dlbSkpOwoJaWYgKCFib19nZW0pCgkJZ290byBvdXQ7CgoJYXRvbWljX3NldCgmYm9fZ2VtLT5yZWZjb3VudCwgMSk7CglEUk1JTklUTElTVEhFQUQoJmJvX2dlbS0+dm1hX2xpc3QpOwoKCS8qIERldGVybWluZSBzaXplIG9mIGJvLiAgVGhlIGZkLXRvLWhhbmRsZSBpb2N0bCByZWFsbHkgc2hvdWxkCgkgKiByZXR1cm4gdGhlIHNpemUsIGJ1dCBpdCBkb2Vzbid0LiAgSWYgd2UgaGF2ZSBrZXJuZWwgMy4xMiBvcgoJICogbGF0ZXIsIHdlIGNhbiBsc2VlayBvbiB0aGUgcHJpbWUgZmQgdG8gZ2V0IHRoZSBzaXplLiAgT2xkZXIKCSAqIGtlcm5lbHMgd2lsbCBqdXN0IGZhaWwsIGluIHdoaWNoIGNhc2Ugd2UgZmFsbCBiYWNrIHRvIHRoZQoJICogcHJvdmlkZWQgKGVzdGltYXRlZCBvciBndWVzcyBzaXplKS4gKi8KCXJldCA9IGxzZWVrKHByaW1lX2ZkLCAwLCBTRUVLX0VORCk7CglpZiAocmV0ICE9IC0xKQoJCWJvX2dlbS0+Ym8uc2l6ZSA9IHJldDsKCWVsc2UKCQlib19nZW0tPmJvLnNpemUgPSBzaXplOwoKCWJvX2dlbS0+Ym8uaGFuZGxlID0gaGFuZGxlOwoJYm9fZ2VtLT5iby5idWZtZ3IgPSBidWZtZ3I7CgoJYm9fZ2VtLT5nZW1faGFuZGxlID0gaGFuZGxlOwoJSEFTSF9BREQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCgkJIGdlbV9oYW5kbGUsIHNpemVvZihib19nZW0tPmdlbV9oYW5kbGUpLCBib19nZW0pOwoKCWJvX2dlbS0+bmFtZSA9ICJwcmltZSI7Cglib19nZW0tPnZhbGlkYXRlX2luZGV4ID0gLTE7Cglib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzID0gMDsKCWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSBmYWxzZTsKCWJvX2dlbS0+aGFzX2Vycm9yID0gZmFsc2U7Cglib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CgoJcmV0ID0gZ2V0X3RpbGluZ19tb2RlKGJ1Zm1ncl9nZW0sIGhhbmRsZSwKCQkJICAgICAgJmJvX2dlbS0+dGlsaW5nX21vZGUsICZib19nZW0tPnN3aXp6bGVfbW9kZSk7CglpZiAocmV0KQoJCWdvdG8gZXJyOwoKCS8qIFhYWCBzdHJpZGUgaXMgdW5rbm93biAqLwoJZHJtX2ludGVsX2JvX2dlbV9zZXRfaW5fYXBlcnR1cmVfc2l6ZShidWZtZ3JfZ2VtLCBib19nZW0sIDApOwoKb3V0OgoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJcmV0dXJuICZib19nZW0tPmJvOwoKZXJyOgoJZHJtX2ludGVsX2dlbV9ib19mcmVlKCZib19nZW0tPmJvKTsKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCXJldHVybiBOVUxMOwp9Cgpkcm1fcHVibGljIGludApkcm1faW50ZWxfYm9fZ2VtX2V4cG9ydF90b19wcmltZShkcm1faW50ZWxfYm8gKmJvLCBpbnQgKnByaW1lX2ZkKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJaWYgKGRybVByaW1lSGFuZGxlVG9GRChidWZtZ3JfZ2VtLT5mZCwgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgICAgRFJNX0NMT0VYRUMgfCBEUk1fUkRXUiwgcHJpbWVfZmQpICE9IDApCgkJcmV0dXJuIC1lcnJubzsKCglib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19mbGluayhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIG5hbWUpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglpZiAoIWJvX2dlbS0+Z2xvYmFsX25hbWUpIHsKCQlzdHJ1Y3QgZHJtX2dlbV9mbGluayBmbGluazsKCgkJbWVtY2xlYXIoZmxpbmspOwoJCWZsaW5rLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCQlpZiAoZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9HRU1fRkxJTkssICZmbGluaykpCgkJCXJldHVybiAtZXJybm87CgoJCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgkJaWYgKCFib19nZW0tPmdsb2JhbF9uYW1lKSB7CgkJCWJvX2dlbS0+Z2xvYmFsX25hbWUgPSBmbGluay5uYW1lOwoJCQlib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CgoJCQlIQVNIX0FERChuYW1lX2hoLCBidWZtZ3JfZ2VtLT5uYW1lX3RhYmxlLAoJCQkJIGdsb2JhbF9uYW1lLCBzaXplb2YoYm9fZ2VtLT5nbG9iYWxfbmFtZSksCgkJCQkgYm9fZ2VtKTsKCQl9CgkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJfQoKCSpuYW1lID0gYm9fZ2VtLT5nbG9iYWxfbmFtZTsKCXJldHVybiAwOwp9CgovKioKICogRW5hYmxlcyB1bmxpbWl0ZWQgY2FjaGluZyBvZiBidWZmZXIgb2JqZWN0cyBmb3IgcmV1c2UuCiAqCiAqIFRoaXMgaXMgcG90ZW50aWFsbHkgdmVyeSBtZW1vcnkgZXhwZW5zaXZlLCBhcyB0aGUgY2FjaGUgYXQgZWFjaCBidWNrZXQKICogc2l6ZSBpcyBvbmx5IGJvdW5kZWQgYnkgaG93IG1hbnkgYnVmZmVycyBvZiB0aGF0IHNpemUgd2UndmUgbWFuYWdlZCB0byBoYXZlCiAqIGluIGZsaWdodCBhdCBvbmNlLgogKi8KZHJtX3B1YmxpYyB2b2lkCmRybV9pbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9yZXVzZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKCglidWZtZ3JfZ2VtLT5ib19yZXVzZSA9IHRydWU7Cn0KCi8qKgogKiBEaXNhYmxlcyBpbXBsaWNpdCBzeW5jaHJvbmlzYXRpb24gYmVmb3JlIGV4ZWN1dGluZyB0aGUgYm8KICoKICogVGhpcyB3aWxsIGNhdXNlIHJlbmRlcmluZyBjb3JydXB0aW9uIHVubGVzcyB5b3UgY29ycmVjdGx5IG1hbmFnZSBleHBsaWNpdAogKiBmZW5jZXMgZm9yIGFsbCByZW5kZXJpbmcgaW52b2x2aW5nIHRoaXMgYnVmZmVyIC0gaW5jbHVkaW5nIHVzZSBieSBvdGhlcnMuCiAqIERpc2FibGluZyB0aGUgaW1wbGljaXQgc2VyaWFsaXNhdGlvbiBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoYXQgc2VyaWFsaXNhdGlvbgogKiBpcyB0b28gY29hcnNlIChmb3IgZXhhbXBsZSwgeW91IGhhdmUgc3BsaXQgdGhlIGJ1ZmZlciBpbnRvIG1hbnkKICogbm9uLW92ZXJsYXBwaW5nIHJlZ2lvbnMgYW5kIGFyZSBzaGFyaW5nIHRoZSB3aG9sZSBidWZmZXIgYmV0d2VlbiBjb25jdXJyZW50CiAqIGluZGVwZW5kZW50IGNvbW1hbmQgc3RyZWFtcykuCiAqCiAqIE5vdGUgdGhlIGtlcm5lbCBtdXN0IGFkdmVydGlzZSBzdXBwb3J0IHZpYSBJOTE1X1BBUkFNX0hBU19FWEVDX0FTWU5DLAogKiB3aGljaCBjYW4gYmUgY2hlY2tlZCB1c2luZyBkcm1faW50ZWxfYnVmbWdyX2Nhbl9kaXNhYmxlX2ltcGxpY2l0X3N5bmMsCiAqIG9yIHN1YnNlcXVlbnQgZXhlY2J1ZnMgaW52b2x2aW5nIHRoZSBibyB3aWxsIGdlbmVyYXRlIEVJTlZBTC4KICovCmRybV9wdWJsaWMgdm9pZApkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfaW1wbGljaXRfc3luYyhkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglib19nZW0tPmtmbGFncyB8PSBFWEVDX09CSkVDVF9BU1lOQzsKfQoKLyoqCiAqIEVuYWJsZXMgaW1wbGljaXQgc3luY2hyb25pc2F0aW9uIGJlZm9yZSBleGVjdXRpbmcgdGhlIGJvCiAqCiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHRoZSBrZXJuZWwsIHRvIHdhaXQgdXBvbiBwcmlvciB3cml0ZXMKICogY29tcGxldGluZyBvbiB0aGUgb2JqZWN0IGJlZm9yZSByZW5kZXJpbmcgd2l0aCBpdCwgb3IgdG8gd2FpdCBmb3IgcHJpb3IKICogcmVhZHMgdG8gY29tcGxldGUgYmVmb3JlIHdyaXRpbmcgaW50byB0aGUgb2JqZWN0LgogKiBkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfaW1wbGljaXRfc3luYygpIGNhbiBzdG9wIHRoaXMgYmVoYXZpb3VyLCB0ZWxsaW5nCiAqIHRoZSBrZXJuZWwgbmV2ZXIgdG8gaW5zZXJ0IGEgc3RhbGwgYmVmb3JlIHVzaW5nIHRoZSBvYmplY3QuIFRoZW4gdGhpcwogKiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBpbXBsaWNpdCBzeW5jIGJlZm9yZSBzdWJzZXF1ZW50CiAqIHJlbmRlcmluZy4KICovCmRybV9wdWJsaWMgdm9pZApkcm1faW50ZWxfZ2VtX2JvX2VuYWJsZV9pbXBsaWNpdF9zeW5jKGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWJvX2dlbS0+a2ZsYWdzICY9IH5FWEVDX09CSkVDVF9BU1lOQzsKfQoKLyoqCiAqIFF1ZXJ5IHdoZXRoZXIgdGhlIGtlcm5lbCBzdXBwb3J0cyBkaXNhYmxpbmcgb2YgaXRzIGltcGxpY2l0IHN5bmNocm9uaXNhdGlvbgogKiBiZWZvcmUgZXhlY2J1Zi4gU2VlIGRybV9pbnRlbF9nZW1fYm9fZGlzYWJsZV9pbXBsaWNpdF9zeW5jKCkKICovCmRybV9wdWJsaWMgaW50CmRybV9pbnRlbF9idWZtZ3JfZ2VtX2Nhbl9kaXNhYmxlX2ltcGxpY2l0X3N5bmMoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7CgoJcmV0dXJuIGJ1Zm1ncl9nZW0tPmhhc19leGVjX2FzeW5jOwp9CgovKioKICogRW5hYmxlIHVzZSBvZiBmZW5jZWQgcmVsb2MgdHlwZS4KICoKICogTmV3IGNvZGUgc2hvdWxkIGVuYWJsZSB0aGlzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGZlbmNlIHJlZ2lzdGVyCiAqIGFsbG9jYXRpb24uICBJZiB0aGlzIG9wdGlvbiBpcyBub3QgZW5hYmxlZCwgYWxsIHJlbG9jcyB3aWxsIGhhdmUgZmVuY2UKICogcmVnaXN0ZXIgYWxsb2NhdGVkLgogKi8KZHJtX3B1YmxpYyB2b2lkCmRybV9pbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9mZW5jZWRfcmVsb2NzKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CglidWZtZ3JfZ2VtLT5mZW5jZWRfcmVsb2NzID0gdHJ1ZTsKfQoKLyoqCiAqIFJldHVybiB0aGUgYWRkaXRpb25hbCBhcGVydHVyZSBzcGFjZSByZXF1aXJlZCBieSB0aGUgdHJlZSBvZiBidWZmZXIgb2JqZWN0cwogKiByb290ZWQgYXQgYm8uCiAqLwpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJaW50IGk7CglpbnQgdG90YWwgPSAwOwoKCWlmIChibyA9PSBOVUxMIHx8IGJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUpCgkJcmV0dXJuIDA7CgoJdG90YWwgKz0gYm8tPnNpemU7Cglib19nZW0tPmluY2x1ZGVkX2luX2NoZWNrX2FwZXJ0dXJlID0gdHJ1ZTsKCglmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKQoJCXRvdGFsICs9CgkJICAgIGRybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKGJvX2dlbS0+CgkJCQkJCQlyZWxvY190YXJnZXRfaW5mb1tpXS5ibyk7CgoJcmV0dXJuIHRvdGFsOwp9CgovKioKICogQ291bnQgdGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoaXMgbGlzdCB0aGF0IG5lZWQgYSBmZW5jZSByZWcKICoKICogSWYgdGhlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByZWdzLCB3ZSdsbCBoYXZlCiAqIHRvIGFzayB0aGUgY2FsbGVyIHRvIHJlc3VibWl0IGEgYmF0Y2ggd2l0aCBmZXdlciB0aWxlZCBidWZmZXJzLgogKgogKiBUaGlzIGZ1bmN0aW9uIG92ZXItY291bnRzIGlmIHRoZSBzYW1lIGJ1ZmZlciBpcyB1c2VkIG11bHRpcGxlIHRpbWVzLgogKi8Kc3RhdGljIHVuc2lnbmVkIGludApkcm1faW50ZWxfZ2VtX3RvdGFsX2ZlbmNlcyhkcm1faW50ZWxfYm8gKiogYm9fYXJyYXksIGludCBjb3VudCkKewoJaW50IGk7Cgl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOwoKCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm9fYXJyYXlbaV07CgoJCWlmIChib19nZW0gPT0gTlVMTCkKCQkJY29udGludWU7CgoJCXRvdGFsICs9IGJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXM7Cgl9CglyZXR1cm4gdG90YWw7Cn0KCi8qKgogKiBDbGVhciB0aGUgZmxhZyBzZXQgYnkgZHJtX2ludGVsX2dlbV9ib19nZXRfYXBlcnR1cmVfc3BhY2UoKSBzbyB3ZSdyZSByZWFkeQogKiBmb3IgdGhlIG5leHQgZHJtX2ludGVsX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZSgpIGNhbGwuCiAqLwpzdGF0aWMgdm9pZApkcm1faW50ZWxfZ2VtX2JvX2NsZWFyX2FwZXJ0dXJlX3NwYWNlX2ZsYWcoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglpbnQgaTsKCglpZiAoYm8gPT0gTlVMTCB8fCAhYm9fZ2VtLT5pbmNsdWRlZF9pbl9jaGVja19hcGVydHVyZSkKCQlyZXR1cm47CgoJYm9fZ2VtLT5pbmNsdWRlZF9pbl9jaGVja19hcGVydHVyZSA9IGZhbHNlOwoKCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspCgkJZHJtX2ludGVsX2dlbV9ib19jbGVhcl9hcGVydHVyZV9zcGFjZV9mbGFnKGJvX2dlbS0+CgkJCQkJCQkgICByZWxvY190YXJnZXRfaW5mb1tpXS5ibyk7Cn0KCi8qKgogKiBSZXR1cm4gYSBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgZm9yIHRoZSBhbW91bnQgb2YgYXBlcnR1cmUgcmVxdWlyZWQKICogZm9yIGEgY29sbGVjdGlvbiBvZiBidWZmZXJzLiBUaGlzIG1heSBkb3VibGUtY291bnQgc29tZSBidWZmZXJzLgogKi8Kc3RhdGljIHVuc2lnbmVkIGludApkcm1faW50ZWxfZ2VtX2VzdGltYXRlX2JhdGNoX3NwYWNlKGRybV9pbnRlbF9ibyAqKmJvX2FycmF5LCBpbnQgY291bnQpCnsKCWludCBpOwoJdW5zaWduZWQgaW50IHRvdGFsID0gMDsKCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvX2FycmF5W2ldOwoJCWlmIChib19nZW0gIT0gTlVMTCkKCQkJdG90YWwgKz0gYm9fZ2VtLT5yZWxvY190cmVlX3NpemU7Cgl9CglyZXR1cm4gdG90YWw7Cn0KCi8qKgogKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBhcGVydHVyZSBuZWVkZWQgZm9yIGEgY29sbGVjdGlvbiBvZiBidWZmZXJzLgogKiBUaGlzIGF2b2lkcyBkb3VibGUgY291bnRpbmcgYW55IGJ1ZmZlcnMsIGF0IHRoZSBjb3N0IG9mIGxvb2tpbmcKICogYXQgZXZlcnkgYnVmZmVyIGluIHRoZSBzZXQuCiAqLwpzdGF0aWMgdW5zaWduZWQgaW50CmRybV9pbnRlbF9nZW1fY29tcHV0ZV9iYXRjaF9zcGFjZShkcm1faW50ZWxfYm8gKipib19hcnJheSwgaW50IGNvdW50KQp7CglpbnQgaTsKCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CgoJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQl0b3RhbCArPSBkcm1faW50ZWxfZ2VtX2JvX2dldF9hcGVydHVyZV9zcGFjZShib19hcnJheVtpXSk7CgkJLyogRm9yIHRoZSBmaXJzdCBidWZmZXIgb2JqZWN0IGluIHRoZSBhcnJheSwgd2UgZ2V0IGFuCgkJICogYWNjdXJhdGUgY291bnQgYmFjayBmb3IgaXRzIHJlbG9jX3RyZWUgc2l6ZSAoc2luY2Ugbm90aGluZwoJCSAqIGhhZCBiZWVuIGZsYWdnZWQgYXMgYmVpbmcgY291bnRlZCB5ZXQpLiAgV2UgY2FuIHNhdmUgdGhhdAoJCSAqIHZhbHVlIG91dCBhcyBhIG1vcmUgY29uc2VydmF0aXZlIHJlbG9jX3RyZWVfc2l6ZSB0aGF0CgkJICogYXZvaWRzIGRvdWJsZS1jb3VudGluZyB0YXJnZXQgYnVmZmVycy4gIFNpbmNlIHRoZSBmaXJzdAoJCSAqIGJ1ZmZlciBoYXBwZW5zIHRvIHVzdWFsbHkgYmUgdGhlIGJhdGNoIGJ1ZmZlciBpbiBvdXIKCQkgKiBjYWxsZXJzLCB0aGlzIGNhbiBwdWxsIHVzIGJhY2sgZnJvbSBkb2luZyB0aGUgdHJlZQoJCSAqIHdhbGsgb24gZXZlcnkgbmV3IGJhdGNoIGVtaXQuCgkJICovCgkJaWYgKGkgPT0gMCkgewoJCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPQoJCQkgICAgKGRybV9pbnRlbF9ib19nZW0gKikgYm9fYXJyYXlbaV07CgkJCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplID0gdG90YWw7CgkJfQoJfQoKCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCWRybV9pbnRlbF9nZW1fYm9fY2xlYXJfYXBlcnR1cmVfc3BhY2VfZmxhZyhib19hcnJheVtpXSk7CglyZXR1cm4gdG90YWw7Cn0KCi8qKgogKiBSZXR1cm4gLTEgaWYgdGhlIGJhdGNoYnVmZmVyIHNob3VsZCBiZSBmbHVzaGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvCiAqIGVtaXQgcmVuZGVyaW5nIHJlZmVyZW5jaW5nIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkgYm9fYXJyYXkuCiAqCiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBpZiB3ZSB0cnkgdG8gZW1pdCBhIGJhdGNoYnVmZmVyIHdpdGggcmVsb2NhdGlvbnMKICogdG8gYSB0cmVlIG9mIGJ1ZmZlcnMgdGhhdCB3b24ndCBzaW11bHRhbmVvdXNseSBmaXQgaW4gdGhlIGFwZXJ0dXJlLAogKiB0aGUgcmVuZGVyaW5nIHdpbGwgcmV0dXJuIGFuIGVycm9yIGF0IGEgcG9pbnQgd2hlcmUgdGhlIHNvZnR3YXJlIGlzIG5vdAogKiBwcmVwYXJlZCB0byByZWNvdmVyIGZyb20gaXQuCiAqCiAqIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBlbWl0IHRoZSBiYXRjaGJ1ZmZlciBzaWduaWZpY2FudGx5IGJlZm9yZSB3ZSByZWFjaAogKiB0aGUgbGltaXQsIGFzIGEgc2VyaWVzIG9mIGJhdGNoYnVmZmVycyBlYWNoIG9mIHdoaWNoIHJlZmVyZW5jZXMgYnVmZmVycwogKiBjb3ZlcmluZyBhbG1vc3QgYWxsIG9mIHRoZSBhcGVydHVyZSBtZWFucyB0aGF0IGF0IGVhY2ggZW1pdCB3ZSBlbmQgdXAKICogd2FpdGluZyB0byBldmljdCBhIGJ1ZmZlciBmcm9tIHRoZSBsYXN0IHJlbmRlcmluZywgYW5kIHdlIGdldCBzeW5jaHJvbm91cwogKiBwZXJmb3JtYW5jZS4gIEJ5IGVtaXR0aW5nIHNtYWxsZXIgYmF0Y2hidWZmZXJzLCB3ZSBlYXQgc29tZSBDUFUgb3ZlcmhlYWQgdG8KICogZ2V0IGJldHRlciBwYXJhbGxlbGlzbS4KICovCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9jaGVja19hcGVydHVyZV9zcGFjZShkcm1faW50ZWxfYm8gKipib19hcnJheSwgaW50IGNvdW50KQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9CgkgICAgKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvX2FycmF5WzBdLT5idWZtZ3I7Cgl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOwoJdW5zaWduZWQgaW50IHRocmVzaG9sZCA9IGJ1Zm1ncl9nZW0tPmd0dF9zaXplICogMyAvIDQ7CglpbnQgdG90YWxfZmVuY2VzOwoKCS8qIENoZWNrIGZvciBmZW5jZSByZWcgY29uc3RyYWludHMgaWYgbmVjZXNzYXJ5ICovCglpZiAoYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlcykgewoJCXRvdGFsX2ZlbmNlcyA9IGRybV9pbnRlbF9nZW1fdG90YWxfZmVuY2VzKGJvX2FycmF5LCBjb3VudCk7CgkJaWYgKHRvdGFsX2ZlbmNlcyA+IGJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMpCgkJCXJldHVybiAtRU5PU1BDOwoJfQoKCXRvdGFsID0gZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShib19hcnJheSwgY291bnQpOwoKCWlmICh0b3RhbCA+IHRocmVzaG9sZCkKCQl0b3RhbCA9IGRybV9pbnRlbF9nZW1fY29tcHV0ZV9iYXRjaF9zcGFjZShib19hcnJheSwgY291bnQpOwoKCWlmICh0b3RhbCA+IHRocmVzaG9sZCkgewoJCURCRygiY2hlY2tfc3BhY2U6IG92ZXJmbG93ZWQgYXZhaWxhYmxlIGFwZXJ0dXJlLCAiCgkJICAgICIlZGtiIHZzICVka2JcbiIsCgkJICAgIHRvdGFsIC8gMTAyNCwgKGludClidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAvIDEwMjQpOwoJCXJldHVybiAtRU5PU1BDOwoJfSBlbHNlIHsKCQlEQkcoImRybV9jaGVja19zcGFjZTogdG90YWwgJWRrYiB2cyBidWZnciAlZGtiXG4iLCB0b3RhbCAvIDEwMjQsCgkJICAgIChpbnQpYnVmbWdyX2dlbS0+Z3R0X3NpemUgLyAxMDI0KTsKCQlyZXR1cm4gMDsKCX0KfQoKLyoKICogRGlzYWJsZSBidWZmZXIgcmV1c2UgZm9yIG9iamVjdHMgd2hpY2ggYXJlIHNoYXJlZCB3aXRoIHRoZSBrZXJuZWwKICogYXMgc2Nhbm91dCBidWZmZXJzCiAqLwpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZGlzYWJsZV9yZXVzZShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglib19nZW0tPnJldXNhYmxlID0gZmFsc2U7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2lzX3JldXNhYmxlKGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCXJldHVybiBib19nZW0tPnJldXNhYmxlOwp9CgpzdGF0aWMgaW50Cl9kcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXMoZHJtX2ludGVsX2JvICpibywgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IGkrKykgewoJCWlmIChib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvID09IHRhcmdldF9ibykKCQkJcmV0dXJuIDE7CgkJaWYgKGJvID09IGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8pCgkJCWNvbnRpbnVlOwoJCWlmIChfZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2VzKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8sCgkJCQkJCXRhcmdldF9ibykpCgkJCXJldHVybiAxOwoJfQoKCWZvciAoaSA9IDA7IGk8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGkrKykgewoJCWlmIChib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2ldID09IHRhcmdldF9ibykKCQkJcmV0dXJuIDE7CgkJaWYgKF9kcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXMoYm9fZ2VtLT5zb2Z0cGluX3RhcmdldFtpXSwgdGFyZ2V0X2JvKSkKCQkJcmV0dXJuIDE7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qKiBSZXR1cm4gdHJ1ZSBpZiB0YXJnZXRfYm8gaXMgcmVmZXJlbmNlZCBieSBibydzIHJlbG9jYXRpb24gdHJlZS4gKi8Kc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXMoZHJtX2ludGVsX2JvICpibywgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9ib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSB0YXJnZXRfYm87CgoJaWYgKGJvID09IE5VTEwgfHwgdGFyZ2V0X2JvID09IE5VTEwpCgkJcmV0dXJuIDA7CglpZiAodGFyZ2V0X2JvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQpCgkJcmV0dXJuIF9kcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZXMoYm8sIHRhcmdldF9ibyk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKYWRkX2J1Y2tldChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwgaW50IHNpemUpCnsKCXVuc2lnbmVkIGludCBpID0gYnVmbWdyX2dlbS0+bnVtX2J1Y2tldHM7CgoJYXNzZXJ0KGkgPCBBUlJBWV9TSVpFKGJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldCkpOwoKCURSTUlOSVRMSVNUSEVBRCgmYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldLmhlYWQpOwoJYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldLnNpemUgPSBzaXplOwoJYnVmbWdyX2dlbS0+bnVtX2J1Y2tldHMrKzsKfQoKc3RhdGljIHZvaWQKaW5pdF9jYWNoZV9idWNrZXRzKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQp7Cgl1bnNpZ25lZCBsb25nIHNpemUsIGNhY2hlX21heF9zaXplID0gNjQgKiAxMDI0ICogMTAyNDsKCgkvKiBPSywgc28gcG93ZXIgb2YgdHdvIGJ1Y2tldHMgd2FzIHRvbyB3YXN0ZWZ1bCBvZiBtZW1vcnkuCgkgKiBHaXZlIDMgb3RoZXIgc2l6ZXMgYmV0d2VlbiBlYWNoIHBvd2VyIG9mIHR3bywgdG8gaG9wZWZ1bGx5CgkgKiBjb3ZlciB0aGluZ3MgYWNjdXJhdGVseSBlbm91Z2guICAoVGhlIGFsdGVybmF0aXZlIGlzCgkgKiBwcm9iYWJseSB0byBqdXN0IGdvIGZvciBleGFjdCBtYXRjaGluZyBvZiBzaXplcywgYW5kIGFzc3VtZQoJICogdGhhdCBmb3IgdGhpbmdzIGxpa2UgY29tcG9zaXRlZCB3aW5kb3cgcmVzaXplIHRoZSB0aWxlZAoJICogd2lkdGgvaGVpZ2h0IGFsaWdubWVudCBhbmQgcm91bmRpbmcgb2Ygc2l6ZXMgdG8gcGFnZXMgd2lsbAoJICogZ2V0IHVzIHVzZWZ1bCBjYWNoZSBoaXQgcmF0ZXMgYW55d2F5KQoJICovCglhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIDQwOTYpOwoJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCA0MDk2ICogMik7CglhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIDQwOTYgKiAzKTsKCgkvKiBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdHMgZm9yIEJPIHJldXNlIGNhY2hlLiAqLwoJZm9yIChzaXplID0gNCAqIDQwOTY7IHNpemUgPD0gY2FjaGVfbWF4X3NpemU7IHNpemUgKj0gMikgewoJCWFkZF9idWNrZXQoYnVmbWdyX2dlbSwgc2l6ZSk7CgoJCWFkZF9idWNrZXQoYnVmbWdyX2dlbSwgc2l6ZSArIHNpemUgKiAxIC8gNCk7CgkJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCBzaXplICsgc2l6ZSAqIDIgLyA0KTsKCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMyAvIDQpOwoJfQp9Cgpkcm1fcHVibGljIHZvaWQKZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X3ZtYV9jYWNoZV9zaXplKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGxpbWl0KQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncjsKCglidWZtZ3JfZ2VtLT52bWFfbWF4ID0gbGltaXQ7CgoJZHJtX2ludGVsX2dlbV9ib19wdXJnZV92bWFfY2FjaGUoYnVmbWdyX2dlbSk7Cn0KCnN0YXRpYyBpbnQKcGFyc2VfZGV2aWRfb3ZlcnJpZGUoY29uc3QgY2hhciAqZGV2aWRfb3ZlcnJpZGUpCnsKCXN0YXRpYyBjb25zdCBzdHJ1Y3QgewoJCWNvbnN0IGNoYXIgKm5hbWU7CgkJaW50IHBjaV9pZDsKCX0gbmFtZV9tYXBbXSA9IHsKCQl7ICJicnciLCBQQ0lfQ0hJUF9JOTY1X0dNIH0sCgkJeyAiZzR4IiwgUENJX0NISVBfR000NV9HTSB9LAoJCXsgImlsayIsIFBDSV9DSElQX0lMRF9HIH0sCgkJeyAic25iIiwgUENJX0NISVBfU0FORFlCUklER0VfTV9HVDJfUExVUyB9LAoJCXsgIml2YiIsIFBDSV9DSElQX0lWWUJSSURHRV9TX0dUMiB9LAoJCXsgImhzdyIsIFBDSV9DSElQX0hBU1dFTExfQ1JXX0VfR1QzIH0sCgkJeyAiYnl0IiwgUENJX0NISVBfVkFMTEVZVklFV18zIH0sCgkJeyAiYmR3IiwgMHgxNjIwIHwgQkRXX1VMWCB9LAoJCXsgInNrbCIsIFBDSV9DSElQX1NLWUxBS0VfRFRfR1QyIH0sCgkJeyAia2JsIiwgUENJX0NISVBfS0FCWUxBS0VfRFRfR1QyIH0sCgl9OwoJdW5zaWduZWQgaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmFtZV9tYXApOyBpKyspIHsKCQlpZiAoIXN0cmNtcChuYW1lX21hcFtpXS5uYW1lLCBkZXZpZF9vdmVycmlkZSkpCgkJCXJldHVybiBuYW1lX21hcFtpXS5wY2lfaWQ7Cgl9CgoJcmV0dXJuIHN0cnRvZChkZXZpZF9vdmVycmlkZSwgTlVMTCk7Cn0KCi8qKgogKiBHZXQgdGhlIFBDSSBJRCBmb3IgdGhlIGRldmljZS4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUKICogSU5URUxfREVWSURfT1ZFUlJJREUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGRlc2lyZWQgSUQuCiAqLwpzdGF0aWMgaW50CmdldF9wY2lfZGV2aWNlX2lkKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQp7CgljaGFyICpkZXZpZF9vdmVycmlkZTsKCWludCBkZXZpZCA9IDA7CglpbnQgcmV0OwoJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKCglpZiAoZ2V0ZXVpZCgpID09IGdldHVpZCgpKSB7CgkJZGV2aWRfb3ZlcnJpZGUgPSBnZXRlbnYoIklOVEVMX0RFVklEX09WRVJSSURFIik7CgkJaWYgKGRldmlkX292ZXJyaWRlKSB7CgkJCWJ1Zm1ncl9nZW0tPm5vX2V4ZWMgPSB0cnVlOwoJCQlyZXR1cm4gcGFyc2VfZGV2aWRfb3ZlcnJpZGUoZGV2aWRfb3ZlcnJpZGUpOwoJCX0KCX0KCgltZW1jbGVhcihncCk7CglncC5wYXJhbSA9IEk5MTVfUEFSQU1fQ0hJUFNFVF9JRDsKCWdwLnZhbHVlID0gJmRldmlkOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOwoJaWYgKHJldCkgewoJCWZwcmludGYoc3RkZXJyLCAiZ2V0IGNoaXAgaWQgZmFpbGVkOiAlZCBbJWRdXG4iLCByZXQsIGVycm5vKTsKCQlmcHJpbnRmKHN0ZGVyciwgInBhcmFtOiAlZCwgdmFsOiAlZFxuIiwgZ3AucGFyYW0sICpncC52YWx1ZSk7Cgl9CglyZXR1cm4gZGV2aWQ7Cn0KCmRybV9wdWJsaWMgaW50CmRybV9pbnRlbF9idWZtZ3JfZ2VtX2dldF9kZXZpZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOwoKCXJldHVybiBidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlOwp9CgovKioKICogU2V0cyB0aGUgQVVCIGZpbGVuYW1lLgogKgogKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIGRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfZHVtcCgpCiAqIGZvciBpdCB0byBoYXZlIGFueSBlZmZlY3QuCiAqLwpkcm1fcHVibGljIHZvaWQKZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9maWxlbmFtZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCgkJCQkgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKewp9CgovKioKICogU2V0cyB1cCBBVUIgZHVtcGluZy4KICoKICogVGhpcyBpcyBhIHRyYWNlIGZpbGUgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgc2ltdWxhdG9yLgogKiBQYWNrZXRzIGFyZSBlbWl0dGVkIGluIGEgZm9ybWF0IHNvbWV3aGF0IGxpa2UgR1BVIGNvbW1hbmQgcGFja2V0cy4KICogWW91IGNhbiBzZXQgdXAgYSBHVFQgYW5kIHVwbG9hZCB5b3VyIG9iamVjdHMgaW50byB0aGUgcmVmZXJlbmNlZAogKiBzcGFjZSwgdGhlbiBzZW5kIG9mZiBiYXRjaGJ1ZmZlcnMgYW5kIGdldCBCTVBzIG91dCB0aGUgb3RoZXIgZW5kLgogKi8KZHJtX3B1YmxpYyB2b2lkCmRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfZHVtcChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCBlbmFibGUpCnsKCWZwcmludGYoc3RkZXJyLCAibGliZHJtIGF1YiBkdW1waW5nIGlzIGRlcHJlY2F0ZWQuXG5cbiIKCQkiVXNlIGludGVsX2F1YmR1bXAgZnJvbSBpbnRlbC1ncHUtdG9vbHMgaW5zdGVhZC4gIEluc3RhbGwgaW50ZWwtZ3B1LXRvb2xzLFxuIgoJCSJ0aGVuIHJ1biAoZm9yIGV4YW1wbGUpXG5cbiIKCQkiXHQkIGludGVsX2F1YmR1bXAgLS1vdXRwdXQ9dHJhY2UuYXViIGdseGdlYXJzIC1nZW9tZXRyeSA1MDB4NTAwXG5cbiIKCQkiU2VlIHRoZSBpbnRlbF9hdWJkdW1wIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuXG4iKTsKfQoKZHJtX3B1YmxpYyBkcm1faW50ZWxfY29udGV4dCAqCmRybV9pbnRlbF9nZW1fY29udGV4dF9jcmVhdGUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncjsKCXN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9jcmVhdGUgY3JlYXRlOwoJZHJtX2ludGVsX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOwoJaW50IHJldDsKCgljb250ZXh0ID0gY2FsbG9jKDEsIHNpemVvZigqY29udGV4dCkpOwoJaWYgKCFjb250ZXh0KQoJCXJldHVybiBOVUxMOwoKCW1lbWNsZWFyKGNyZWF0ZSk7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfQ1JFQVRFLCAmY3JlYXRlKTsKCWlmIChyZXQgIT0gMCkgewoJCURCRygiRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfQ1JFQVRFIGZhaWxlZDogJXNcbiIsCgkJICAgIHN0cmVycm9yKGVycm5vKSk7CgkJZnJlZShjb250ZXh0KTsKCQlyZXR1cm4gTlVMTDsKCX0KCgljb250ZXh0LT5jdHhfaWQgPSBjcmVhdGUuY3R4X2lkOwoJY29udGV4dC0+YnVmbWdyID0gYnVmbWdyOwoKCXJldHVybiBjb250ZXh0Owp9Cgpkcm1fcHVibGljIGludApkcm1faW50ZWxfZ2VtX2NvbnRleHRfZ2V0X2lkKGRybV9pbnRlbF9jb250ZXh0ICpjdHgsIHVpbnQzMl90ICpjdHhfaWQpCnsKCWlmIChjdHggPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCgkqY3R4X2lkID0gY3R4LT5jdHhfaWQ7CgoJcmV0dXJuIDA7Cn0KCmRybV9wdWJsaWMgdm9pZApkcm1faW50ZWxfZ2VtX2NvbnRleHRfZGVzdHJveShkcm1faW50ZWxfY29udGV4dCAqY3R4KQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbTsKCXN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9kZXN0cm95IGRlc3Ryb3k7CglpbnQgcmV0OwoKCWlmIChjdHggPT0gTlVMTCkKCQlyZXR1cm47CgoJbWVtY2xlYXIoZGVzdHJveSk7CgoJYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWN0eC0+YnVmbWdyOwoJZGVzdHJveS5jdHhfaWQgPSBjdHgtPmN0eF9pZDsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9ERVNUUk9ZLAoJCSAgICAgICAmZGVzdHJveSk7CglpZiAocmV0ICE9IDApCgkJZnByaW50ZihzdGRlcnIsICJEUk1fSU9DVExfSTkxNV9HRU1fQ09OVEVYVF9ERVNUUk9ZIGZhaWxlZDogJXNcbiIsCgkJCXN0cmVycm9yKGVycm5vKSk7CgoJZnJlZShjdHgpOwp9Cgpkcm1fcHVibGljIGludApkcm1faW50ZWxfZ2V0X3Jlc2V0X3N0YXRzKGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCgkJCSAgdWludDMyX3QgKnJlc2V0X2NvdW50LAoJCQkgIHVpbnQzMl90ICphY3RpdmUsCgkJCSAgdWludDMyX3QgKnBlbmRpbmcpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOwoJc3RydWN0IGRybV9pOTE1X3Jlc2V0X3N0YXRzIHN0YXRzOwoJaW50IHJldDsKCglpZiAoY3R4ID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJbWVtY2xlYXIoc3RhdHMpOwoKCWJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKiljdHgtPmJ1Zm1ncjsKCXN0YXRzLmN0eF9pZCA9IGN0eC0+Y3R4X2lkOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFVF9SRVNFVF9TVEFUUywKCQkgICAgICAgJnN0YXRzKTsKCWlmIChyZXQgPT0gMCkgewoJCWlmIChyZXNldF9jb3VudCAhPSBOVUxMKQoJCQkqcmVzZXRfY291bnQgPSBzdGF0cy5yZXNldF9jb3VudDsKCgkJaWYgKGFjdGl2ZSAhPSBOVUxMKQoJCQkqYWN0aXZlID0gc3RhdHMuYmF0Y2hfYWN0aXZlOwoKCQlpZiAocGVuZGluZyAhPSBOVUxMKQoJCQkqcGVuZGluZyA9IHN0YXRzLmJhdGNoX3BlbmRpbmc7Cgl9CgoJcmV0dXJuIHJldDsKfQoKZHJtX3B1YmxpYyBpbnQKZHJtX2ludGVsX3JlZ19yZWFkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwKCQkgICB1aW50MzJfdCBvZmZzZXQsCgkJICAgdWludDY0X3QgKnJlc3VsdCkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CglzdHJ1Y3QgZHJtX2k5MTVfcmVnX3JlYWQgcmVnX3JlYWQ7CglpbnQgcmV0OwoKCW1lbWNsZWFyKHJlZ19yZWFkKTsKCXJlZ19yZWFkLm9mZnNldCA9IG9mZnNldDsKCglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfUkVHX1JFQUQsICZyZWdfcmVhZCk7CgoJKnJlc3VsdCA9IHJlZ19yZWFkLnZhbDsKCXJldHVybiByZXQ7Cn0KCmRybV9wdWJsaWMgaW50CmRybV9pbnRlbF9nZXRfc3Vic2xpY2VfdG90YWwoaW50IGZkLCB1bnNpZ25lZCBpbnQgKnN1YnNsaWNlX3RvdGFsKQp7Cglkcm1faTkxNV9nZXRwYXJhbV90IGdwOwoJaW50IHJldDsKCgltZW1jbGVhcihncCk7CglncC52YWx1ZSA9IChpbnQqKXN1YnNsaWNlX3RvdGFsOwoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX1NVQlNMSUNFX1RPVEFMOwoJcmV0ID0gZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOwoJaWYgKHJldCkKCQlyZXR1cm4gLWVycm5vOwoKCXJldHVybiAwOwp9Cgpkcm1fcHVibGljIGludApkcm1faW50ZWxfZ2V0X2V1X3RvdGFsKGludCBmZCwgdW5zaWduZWQgaW50ICpldV90b3RhbCkKewoJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKCWludCByZXQ7CgoJbWVtY2xlYXIoZ3ApOwoJZ3AudmFsdWUgPSAoaW50KilldV90b3RhbDsKCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9FVV9UT1RBTDsKCXJldCA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKCWlmIChyZXQpCgkJcmV0dXJuIC1lcnJubzsKCglyZXR1cm4gMDsKfQoKZHJtX3B1YmxpYyBpbnQKZHJtX2ludGVsX2dldF9wb29sZWRfZXUoaW50IGZkKQp7Cglkcm1faTkxNV9nZXRwYXJhbV90IGdwOwoJaW50IHJldCA9IC0xOwoKCW1lbWNsZWFyKGdwKTsKCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfUE9PTEVEX0VVOwoJZ3AudmFsdWUgPSAmcmV0OwoJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKSkKCQlyZXR1cm4gLWVycm5vOwoKCXJldHVybiByZXQ7Cn0KCmRybV9wdWJsaWMgaW50CmRybV9pbnRlbF9nZXRfbWluX2V1X2luX3Bvb2woaW50IGZkKQp7Cglkcm1faTkxNV9nZXRwYXJhbV90IGdwOwoJaW50IHJldCA9IC0xOwoKCW1lbWNsZWFyKGdwKTsKCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9NSU5fRVVfSU5fUE9PTDsKCWdwLnZhbHVlID0gJnJldDsKCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCkpCgkJcmV0dXJuIC1lcnJubzsKCglyZXR1cm4gcmV0Owp9CgovKioKICogQW5ub3RhdGUgdGhlIGdpdmVuIGJvIGZvciB1c2UgaW4gYXViIGR1bXBpbmcuCiAqCiAqIFxwYXJhbSBhbm5vdGF0aW9ucyBpcyBhbiBhcnJheSBvZiBkcm1faW50ZWxfYXViX2Fubm90YXRpb24gb2JqZWN0cwogKiBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGRhdGEgaW4gdmFyaW91cyBzZWN0aW9ucyBvZiB0aGUgYm8uICBFYWNoCiAqIGVsZW1lbnQgb2YgdGhlIGFycmF5IHNwZWNpZmllcyB0aGUgdHlwZSBhbmQgc3VidHlwZSBvZiBhIHNlY3Rpb24gb2YKICogdGhlIGJvLCBhbmQgdGhlIHBhc3QtdGhlLWVuZCBvZmZzZXQgb2YgdGhhdCBzZWN0aW9uLiAgVGhlIGVsZW1lbnRzCiAqIG9mIFxjIGFubm90YXRpb25zIG11c3QgYmUgc29ydGVkIHNvIHRoYXQgZW5kaW5nX29mZnNldCBpcwogKiBpbmNyZWFzaW5nLgogKgogKiBccGFyYW0gY291bnQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgXGMgYW5ub3RhdGlvbnMgYXJyYXkuCiAqIElmIFxjIGNvdW50IGlzIHplcm8sIHRoZW4gXGMgYW5ub3RhdGlvbnMgd2lsbCBub3QgYmUgZGVyZWZlcmVuY2VkLgogKgogKiBBbm5vdGF0aW9ucyBhcmUgY29waWVkIGludG8gYSBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBzbyBjYWxsZXIgbWF5CiAqIHJlLXVzZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgXGMgYW5ub3RhdGlvbnMgYWZ0ZXIgdGhlIGNhbGwKICogcmV0dXJucy4KICoKICogQW5ub3RhdGlvbnMgYXJlIHN0b3JlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBibzsgdG8gcmVzZXQgdG8gdGhlCiAqIGRlZmF1bHQgc3RhdGUgKG5vIGFubm90YXRpb25zKSwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBcYyBjb3VudAogKiBvZiB6ZXJvLgogKi8KZHJtX3B1YmxpYyB2b2lkIGRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfYW5ub3RhdGlvbnMoZHJtX2ludGVsX2JvICpibywKCQkJCQkgZHJtX2ludGVsX2F1Yl9hbm5vdGF0aW9uICphbm5vdGF0aW9ucywKCQkJCQkgdW5zaWduZWQgY291bnQpCnsKfQoKc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBidWZtZ3JfbGlzdF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CnN0YXRpYyBkcm1NTUxpc3RIZWFkIGJ1Zm1ncl9saXN0ID0geyAmYnVmbWdyX2xpc3QsICZidWZtZ3JfbGlzdCB9OwoKc3RhdGljIGRybV9pbnRlbF9idWZtZ3JfZ2VtICoKZHJtX2ludGVsX2J1Zm1ncl9nZW1fZmluZChpbnQgZmQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOwoKCURSTUxJU1RGT1JFQUNIRU5UUlkoYnVmbWdyX2dlbSwgJmJ1Zm1ncl9saXN0LCBtYW5hZ2VycykgewoJCWlmIChidWZtZ3JfZ2VtLT5mZCA9PSBmZCkgewoJCQlhdG9taWNfaW5jKCZidWZtZ3JfZ2VtLT5yZWZjb3VudCk7CgkJCXJldHVybiBidWZtZ3JfZ2VtOwoJCX0KCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2J1Zm1ncl9nZW1fdW5yZWYoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncjsKCglpZiAoYXRvbWljX2FkZF91bmxlc3MoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50LCAtMSwgMSkpIHsKCQlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9saXN0X211dGV4KTsKCgkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50KSkgewoJCQlEUk1MSVNUREVMKCZidWZtZ3JfZ2VtLT5tYW5hZ2Vycyk7CgkJCWRybV9pbnRlbF9idWZtZ3JfZ2VtX2Rlc3Ryb3koYnVmbWdyKTsKCQl9CgoJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfbGlzdF9tdXRleCk7Cgl9Cn0KCmRybV9wdWJsaWMgdm9pZCAqZHJtX2ludGVsX2dlbV9ib19tYXBfX2d0dChkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpCgkJcmV0dXJuIGJvX2dlbS0+Z3R0X3ZpcnR1YWw7CgoJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKCQlyZXR1cm4gTlVMTDsKCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwgPT0gTlVMTCkgewoJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQgbW1hcF9hcmc7CgkJdm9pZCAqcHRyOwoKCQlEQkcoImJvX21hcF9ndHQ6IG1tYXAgJWQgKCVzKSwgbWFwX2NvdW50PSVkXG4iLAoJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOwoKCQlpZiAoYm9fZ2VtLT5tYXBfY291bnQrKyA9PSAwKQoJCQlkcm1faW50ZWxfZ2VtX2JvX29wZW5fdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CgoJCW1lbWNsZWFyKG1tYXBfYXJnKTsKCQltbWFwX2FyZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CgoJCS8qIEdldCB0aGUgZmFrZSBvZmZzZXQgYmFjay4uLiAqLwoJCXB0ciA9IE1BUF9GQUlMRUQ7CgkJaWYgKGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCQkgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQX0dUVCwKCQkJICAgICAmbW1hcF9hcmcpID09IDApIHsKCQkJLyogYW5kIG1tYXAgaXQgKi8KCQkJcHRyID0gZHJtX21tYXAoMCwgYm8tPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCgkJCQkgICAgICAgTUFQX1NIQVJFRCwgYnVmbWdyX2dlbS0+ZmQsCgkJCQkgICAgICAgbW1hcF9hcmcub2Zmc2V0KTsKCQl9CgkJaWYgKHB0ciA9PSBNQVBfRkFJTEVEKSB7CgkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCgkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoJCQlwdHIgPSBOVUxMOwoJCX0KCgkJYm9fZ2VtLT5ndHRfdmlydHVhbCA9IHB0cjsKCX0KCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglyZXR1cm4gYm9fZ2VtLT5ndHRfdmlydHVhbDsKfQoKZHJtX3B1YmxpYyB2b2lkICpkcm1faW50ZWxfZ2VtX2JvX21hcF9fY3B1KGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkKCQlyZXR1cm4gYm9fZ2VtLT5tZW1fdmlydHVhbDsKCglpZiAoYm9fZ2VtLT5pc191c2VycHRyKSB7CgkJLyogUmV0dXJuIHRoZSBzYW1lIHVzZXIgcHRyICovCgkJcmV0dXJuIGJvX2dlbS0+dXNlcl92aXJ0dWFsOwoJfQoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CglpZiAoIWJvX2dlbS0+bWVtX3ZpcnR1YWwpIHsKCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXAgbW1hcF9hcmc7CgoJCWlmIChib19nZW0tPm1hcF9jb3VudCsrID09IDApCgkJCWRybV9pbnRlbF9nZW1fYm9fb3Blbl92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCgkJREJHKCJib19tYXA6ICVkICglcyksIG1hcF9jb3VudD0lZFxuIiwKCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIGJvX2dlbS0+bWFwX2NvdW50KTsKCgkJbWVtY2xlYXIobW1hcF9hcmcpOwoJCW1tYXBfYXJnLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCQltbWFwX2FyZy5zaXplID0gYm8tPnNpemU7CgkJaWYgKGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCQkgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9NTUFQLAoJCQkgICAgICZtbWFwX2FyZykpIHsKCQkJREJHKCIlczolZDogRXJyb3IgbWFwcGluZyBidWZmZXIgJWQgKCVzKTogJXMgLlxuIiwKCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgYm9fZ2VtLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOwoJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQoJCQkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCQl9IGVsc2UgewoJCQlWRyhWQUxHUklORF9NQUxMT0NMSUtFX0JMT0NLKG1tYXBfYXJnLmFkZHJfcHRyLCBtbWFwX2FyZy5zaXplLCAwLCAxKSk7CgkJCWJvX2dlbS0+bWVtX3ZpcnR1YWwgPSAodm9pZCAqKSh1aW50cHRyX3QpIG1tYXBfYXJnLmFkZHJfcHRyOwoJCX0KCX0KCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglyZXR1cm4gYm9fZ2VtLT5tZW1fdmlydHVhbDsKfQoKZHJtX3B1YmxpYyB2b2lkICpkcm1faW50ZWxfZ2VtX2JvX21hcF9fd2MoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWlmIChib19nZW0tPndjX3ZpcnR1YWwpCgkJcmV0dXJuIGJvX2dlbS0+d2NfdmlydHVhbDsKCglpZiAoYm9fZ2VtLT5pc191c2VycHRyKQoJCXJldHVybiBOVUxMOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CglpZiAoIWJvX2dlbS0+d2NfdmlydHVhbCkgewoJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCBtbWFwX2FyZzsKCgkJaWYgKGJvX2dlbS0+bWFwX2NvdW50KysgPT0gMCkKCQkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoKCQlEQkcoImJvX21hcDogJWQgKCVzKSwgbWFwX2NvdW50PSVkXG4iLAoJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOwoKCQltZW1jbGVhcihtbWFwX2FyZyk7CgkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCW1tYXBfYXJnLnNpemUgPSBiby0+c2l6ZTsKCQltbWFwX2FyZy5mbGFncyA9IEk5MTVfTU1BUF9XQzsKCQlpZiAoZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJCSAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVAsCgkJCSAgICAgJm1tYXBfYXJnKSkgewoJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAoJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCgkJCSAgICBib19nZW0tPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCgkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoJCX0gZWxzZSB7CgkJCVZHKFZBTEdSSU5EX01BTExPQ0xJS0VfQkxPQ0sobW1hcF9hcmcuYWRkcl9wdHIsIG1tYXBfYXJnLnNpemUsIDAsIDEpKTsKCQkJYm9fZ2VtLT53Y192aXJ0dWFsID0gKHZvaWQgKikodWludHB0cl90KSBtbWFwX2FyZy5hZGRyX3B0cjsKCQl9Cgl9CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJcmV0dXJuIGJvX2dlbS0+d2NfdmlydHVhbDsKfQoKLyoqCiAqIEluaXRpYWxpemVzIHRoZSBHRU0gYnVmZmVyIG1hbmFnZXIsIHdoaWNoIHVzZXMgdGhlIGtlcm5lbCB0byBhbGxvY2F0ZSwgbWFwLAogKiBhbmQgbWFuYWdlIG1hcCBidWZmZXIgb2JqZWN0aW9ucy4KICoKICogXHBhcmFtIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3BlbmVkIERSTSBkZXZpY2UuCiAqLwpkcm1fcHVibGljIGRybV9pbnRlbF9idWZtZ3IgKgpkcm1faW50ZWxfYnVmbWdyX2dlbV9pbml0KGludCBmZCwgaW50IGJhdGNoX3NpemUpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOwoJc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfYXBlcnR1cmUgYXBlcnR1cmU7Cglkcm1faTkxNV9nZXRwYXJhbV90IGdwOwoJaW50IHJldCwgdG1wOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2xpc3RfbXV0ZXgpOwoKCWJ1Zm1ncl9nZW0gPSBkcm1faW50ZWxfYnVmbWdyX2dlbV9maW5kKGZkKTsKCWlmIChidWZtZ3JfZ2VtKQoJCWdvdG8gZXhpdDsKCglidWZtZ3JfZ2VtID0gY2FsbG9jKDEsIHNpemVvZigqYnVmbWdyX2dlbSkpOwoJaWYgKGJ1Zm1ncl9nZW0gPT0gTlVMTCkKCQlnb3RvIGV4aXQ7CgoJYnVmbWdyX2dlbS0+ZmQgPSBmZDsKCWF0b21pY19zZXQoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50LCAxKTsKCglpZiAocHRocmVhZF9tdXRleF9pbml0KCZidWZtZ3JfZ2VtLT5sb2NrLCBOVUxMKSAhPSAwKSB7CgkJZnJlZShidWZtZ3JfZ2VtKTsKCQlidWZtZ3JfZ2VtID0gTlVMTDsKCQlnb3RvIGV4aXQ7Cgl9CgoJbWVtY2xlYXIoYXBlcnR1cmUpOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9HRVRfQVBFUlRVUkUsCgkJICAgICAgICZhcGVydHVyZSk7CgoJaWYgKHJldCA9PSAwKQoJCWJ1Zm1ncl9nZW0tPmd0dF9zaXplID0gYXBlcnR1cmUuYXBlcl9hdmFpbGFibGVfc2l6ZTsKCWVsc2UgewoJCWZwcmludGYoc3RkZXJyLCAiRFJNX0lPQ1RMX0k5MTVfR0VNX0FQRVJUVVJFIGZhaWxlZDogJXNcbiIsCgkJCXN0cmVycm9yKGVycm5vKSk7CgkJYnVmbWdyX2dlbS0+Z3R0X3NpemUgPSAxMjggKiAxMDI0ICogMTAyNDsKCQlmcHJpbnRmKHN0ZGVyciwgIkFzc3VtaW5nICVka0IgYXZhaWxhYmxlIGFwZXJ0dXJlIHNpemUuXG4iCgkJCSJNYXkgbGVhZCB0byByZWR1Y2VkIHBlcmZvcm1hbmNlIG9yIGluY29ycmVjdCAiCgkJCSJyZW5kZXJpbmcuXG4iLAoJCQkoaW50KWJ1Zm1ncl9nZW0tPmd0dF9zaXplIC8gMTAyNCk7Cgl9CgoJYnVmbWdyX2dlbS0+cGNpX2RldmljZSA9IGdldF9wY2lfZGV2aWNlX2lkKGJ1Zm1ncl9nZW0pOwoKCWlmIChJU19HRU4yKGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQoJCWJ1Zm1ncl9nZW0tPmdlbiA9IDI7CgllbHNlIGlmIChJU19HRU4zKGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQoJCWJ1Zm1ncl9nZW0tPmdlbiA9IDM7CgllbHNlIGlmIChJU19HRU40KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQoJCWJ1Zm1ncl9nZW0tPmdlbiA9IDQ7CgllbHNlIGlmIChJU19HRU41KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQoJCWJ1Zm1ncl9nZW0tPmdlbiA9IDU7CgllbHNlIGlmIChJU19HRU42KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQoJCWJ1Zm1ncl9nZW0tPmdlbiA9IDY7CgllbHNlIGlmIChJU19HRU43KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQoJCWJ1Zm1ncl9nZW0tPmdlbiA9IDc7CgllbHNlIGlmIChJU19HRU44KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKQoJCWJ1Zm1ncl9nZW0tPmdlbiA9IDg7CgllbHNlIGlmICghaW50ZWxfZ2V0X2dlbngoYnVmbWdyX2dlbS0+cGNpX2RldmljZSwgJmJ1Zm1ncl9nZW0tPmdlbikpIHsKCQlmcmVlKGJ1Zm1ncl9nZW0pOwoJCWJ1Zm1ncl9nZW0gPSBOVUxMOwoJCWdvdG8gZXhpdDsKCX0KCglpZiAoSVNfR0VOMyhidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSAmJgoJICAgIGJ1Zm1ncl9nZW0tPmd0dF9zaXplID4gMjU2KjEwMjQqMTAyNCkgewoJCS8qIFRoZSB1bm1hcHBhYmxlIHBhcnQgb2YgZ3R0IG9uIGdlbiAzIChpLmUuIGFib3ZlIDI1Nk1CKSBjYW4ndAoJCSAqIGJlIHVzZWQgZm9yIHRpbGVkIGJsaXRzLiBUbyBzaW1wbGlmeSB0aGUgYWNjb3VudGluZywganVzdAoJCSAqIHN1YnRyYWN0IHRoZSB1bm1hcHBhYmxlIHBhcnQgKGZpeGVkIHRvIDI1Nk1CIG9uIGFsbCBrbm93bgoJCSAqIGdlbjMgZGV2aWNlcykgaWYgdGhlIGtlcm5lbCBhZHZlcnRpc2VzIGl0LiAqLwoJCWJ1Zm1ncl9nZW0tPmd0dF9zaXplIC09IDI1NioxMDI0KjEwMjQ7Cgl9CgoJbWVtY2xlYXIoZ3ApOwoJZ3AudmFsdWUgPSAmdG1wOwoKCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfRVhFQ0JVRjI7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAocmV0KSB7CgkJZnByaW50ZihzdGRlcnIsICJpOTE1IGRvZXMgbm90IHN1cHBvcnQgRVhFQ0JVRkVSMlxuIik7CgkJZnJlZShidWZtZ3JfZ2VtKTsKCQlidWZtZ3JfZ2VtID0gTlVMTDsKICAgICAgICBnb3RvIGV4aXQ7CiAgICB9CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19CU0Q7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfYnNkID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19CTFQ7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfYmx0ID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19SRUxBWEVEX0ZFTkNJTkc7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfcmVsYXhlZF9mZW5jaW5nID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19FWEVDX0FTWU5DOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOwoJYnVmbWdyX2dlbS0+aGFzX2V4ZWNfYXN5bmMgPSByZXQgPT0gMDsKCglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfdXNlcnB0ciA9IGNoZWNrX2JvX2FsbG9jX3VzZXJwdHI7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19XQUlUX1RJTUVPVVQ7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfd2FpdF90aW1lb3V0ID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19MTEM7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAocmV0ICE9IDApIHsKCQkvKiBLZXJuZWwgZG9lcyBub3Qgc3VwcG9ydHMgSEFTX0xMQyBxdWVyeSwgZmFsbGJhY2sgdG8gR1BVCgkJICogZ2VuZXJhdGlvbiBkZXRlY3Rpb24gYW5kIGFzc3VtZSB0aGF0IHdlIGhhdmUgTExDIG9uIEdFTjYvNwoJCSAqLwoJCWJ1Zm1ncl9nZW0tPmhhc19sbGMgPSAoSVNfR0VONihidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSB8CgkJCQlJU19HRU43KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKTsKCX0gZWxzZQoJCWJ1Zm1ncl9nZW0tPmhhc19sbGMgPSAqZ3AudmFsdWU7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19WRUJPWDsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKCWJ1Zm1ncl9nZW0tPmhhc192ZWJveCA9IChyZXQgPT0gMCkgJiAoKmdwLnZhbHVlID4gMCk7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19FWEVDX1NPRlRQSU47CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAocmV0ID09IDAgJiYgKmdwLnZhbHVlID4gMCkKCQlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fc2V0X3NvZnRwaW5fb2Zmc2V0ID0gZHJtX2ludGVsX2dlbV9ib19zZXRfc29mdHBpbl9vZmZzZXQ7CgoJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA8IDQpIHsKCQlncC5wYXJhbSA9IEk5MTVfUEFSQU1fTlVNX0ZFTkNFU19BVkFJTDsKCQlncC52YWx1ZSA9ICZidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzOwoJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKCQlpZiAocmV0KSB7CgkJCWZwcmludGYoc3RkZXJyLCAiZ2V0IGZlbmNlcyBmYWlsZWQ6ICVkIFslZF1cbiIsIHJldCwKCQkJCWVycm5vKTsKCQkJZnByaW50ZihzdGRlcnIsICJwYXJhbTogJWQsIHZhbDogJWRcbiIsIGdwLnBhcmFtLAoJCQkJKmdwLnZhbHVlKTsKCQkJYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlcyA9IDA7CgkJfSBlbHNlIHsKCQkJLyogWFhYIFRoZSBrZXJuZWwgcmVwb3J0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGZlbmNlcywKCQkJICogaW5jbHVkaW5nIGFueSB0aGF0IG1heSBiZSBwaW5uZWQuCgkJCSAqCgkJCSAqIFdlIHByZXN1bWUgdGhhdCB0aGVyZSB3aWxsIGJlIGF0IGxlYXN0IG9uZSBwaW5uZWQKCQkJICogZmVuY2UgZm9yIHRoZSBzY2Fub3V0IGJ1ZmZlciwgYnV0IHRoZXJlIG1heSBiZSBtb3JlCgkJCSAqIHRoYW4gb25lIHNjYW5vdXQgYW5kIHRoZSB1c2VyIG1heSBiZSBtYW51YWxseQoJCQkgKiBwaW5uaW5nIGJ1ZmZlcnMuIExldCdzIG1vdmUgdG8gZXhlY2J1ZmZlcjIgYW5kCgkJCSAqIHRoZXJlYnkgZm9yZ2V0IHRoZSBpbnNhbml0eSBvZiB1c2luZyBmZW5jZXMuLi4KCQkJICovCgkJCWJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMgLT0gMjsKCQkJaWYgKGJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMgPCAwKQoJCQkJYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlcyA9IDA7CgkJfQoJfQoKCWlmIChidWZtZ3JfZ2VtLT5nZW4gPj0gOCkgewoJCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfQUxJQVNJTkdfUFBHVFQ7CgkJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOwoJCWlmIChyZXQgPT0gMCAmJiAqZ3AudmFsdWUgPT0gMykKCQkJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3VzZV80OGJfYWRkcmVzc19yYW5nZSA9IGRybV9pbnRlbF9nZW1fYm9fdXNlXzQ4Yl9hZGRyZXNzX3JhbmdlOwoJfQoKCS8qIExldCdzIGdvIHdpdGggb25lIHJlbG9jYXRpb24gcGVyIGV2ZXJ5IDIgZHdvcmRzIChidXQgcm91bmQgZG93biBhIGJpdAoJICogc2luY2UgYSBwb3dlciBvZiB0d28gd2lsbCBtZWFuIGFuIGV4dHJhIHBhZ2UgYWxsb2NhdGlvbiBmb3IgdGhlIHJlbG9jCgkgKiBidWZmZXIpLgoJICoKCSAqIEV2ZXJ5IDQgd2FzIHRvbyBmZXcgZm9yIHRoZSBibGVuZGVyIGJlbmNobWFyay4KCSAqLwoJYnVmbWdyX2dlbS0+bWF4X3JlbG9jcyA9IGJhdGNoX3NpemUgLyBzaXplb2YodWludDMyX3QpIC8gMiAtIDI7CgoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2FsbG9jID0gZHJtX2ludGVsX2dlbV9ib19hbGxvYzsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19hbGxvY19mb3JfcmVuZGVyID0KCSAgICBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2Zvcl9yZW5kZXI7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfdGlsZWQgPSBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3RpbGVkOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3JlZmVyZW5jZSA9IGRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3VucmVmZXJlbmNlID0gZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19tYXAgPSBkcm1faW50ZWxfZ2VtX2JvX21hcDsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib191bm1hcCA9IGRybV9pbnRlbF9nZW1fYm9fdW5tYXA7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fc3ViZGF0YSA9IGRybV9pbnRlbF9nZW1fYm9fc3ViZGF0YTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19nZXRfc3ViZGF0YSA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3N1YmRhdGE7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fd2FpdF9yZW5kZXJpbmcgPSBkcm1faW50ZWxfZ2VtX2JvX3dhaXRfcmVuZGVyaW5nOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2VtaXRfcmVsb2MgPSBkcm1faW50ZWxfZ2VtX2JvX2VtaXRfcmVsb2M7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZW1pdF9yZWxvY19mZW5jZSA9IGRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvY19mZW5jZTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19waW4gPSBkcm1faW50ZWxfZ2VtX2JvX3BpbjsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib191bnBpbiA9IGRybV9pbnRlbF9nZW1fYm9fdW5waW47CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZ2V0X3RpbGluZyA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3RpbGluZzsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19zZXRfdGlsaW5nID0gZHJtX2ludGVsX2dlbV9ib19zZXRfdGlsaW5nOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2ZsaW5rID0gZHJtX2ludGVsX2dlbV9ib19mbGluazsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19leGVjID0gZHJtX2ludGVsX2dlbV9ib19leGVjMjsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19tcmJfZXhlYyA9IGRybV9pbnRlbF9nZW1fYm9fbXJiX2V4ZWMyOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2J1c3kgPSBkcm1faW50ZWxfZ2VtX2JvX2J1c3k7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fbWFkdmlzZSA9IGRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5kZXN0cm95ID0gZHJtX2ludGVsX2J1Zm1ncl9nZW1fdW5yZWY7CglidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcgPSAwOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmNoZWNrX2FwZXJ0dXJlX3NwYWNlID0KCSAgICBkcm1faW50ZWxfZ2VtX2NoZWNrX2FwZXJ0dXJlX3NwYWNlOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2Rpc2FibGVfcmV1c2UgPSBkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfcmV1c2U7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9faXNfcmV1c2FibGUgPSBkcm1faW50ZWxfZ2VtX2JvX2lzX3JldXNhYmxlOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmdldF9waXBlX2Zyb21fY3J0Y19pZCA9CgkgICAgZHJtX2ludGVsX2dlbV9nZXRfcGlwZV9mcm9tX2NydGNfaWQ7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fcmVmZXJlbmNlcyA9IGRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlczsKCglpbml0X2NhY2hlX2J1Y2tldHMoYnVmbWdyX2dlbSk7CgoJRFJNSU5JVExJU1RIRUFEKCZidWZtZ3JfZ2VtLT52bWFfY2FjaGUpOwoJYnVmbWdyX2dlbS0+dm1hX21heCA9IC0xOyAvKiB1bmxpbWl0ZWQgYnkgZGVmYXVsdCAqLwoKCURSTUxJU1RBREQoJmJ1Zm1ncl9nZW0tPm1hbmFnZXJzLCAmYnVmbWdyX2xpc3QpOwoKZXhpdDoKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfbGlzdF9tdXRleCk7CgoJcmV0dXJuIGJ1Zm1ncl9nZW0gIT0gTlVMTCA/ICZidWZtZ3JfZ2VtLT5idWZtZ3IgOiBOVUxMOwp9Cg==