ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNDUzNDFmOC4uNmQzYzVjYiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTczLDkgKzczLDEyIEBACiAjIEZsYWdzIHRvIGdlbmVyYXRlIHRoZSBDaGFpbiBvZiBUcnVzdAogR0VORVJBVEVfQ09UCQk6PSAwCiBDUkVBVEVfS0VZUwkJOj0gMQorU0FWRV9LRVlTCQk6PSAwCiAjIEZsYWdzIHRvIGJ1aWxkIFRGIHdpdGggVHJ1c3RlZCBCb290IHN1cHBvcnQKIFRSVVNURURfQk9BUkRfQk9PVAk6PSAwCi1BVVRIX01PRAkJOj0gbm9uZQorIyBCeSBkZWZhdWx0LCBjb25zaWRlciB0aGF0IHRoZSBwbGF0Zm9ybSdzIHJlc2V0IGFkZHJlc3MgaXMgbm90IHByb2dyYW1tYWJsZS4KKyMgVGhlIHBsYXRmb3JtIE1ha2VmaWxlIGlzIGZyZWUgdG8gb3ZlcnJpZGUgdGhpcyB2YWx1ZS4KK1BST0dSQU1NQUJMRV9SRVNFVF9BRERSRVNTCTo9IDAKIAogIyBDaGVja3BhdGNoIGlnbm9yZXMKIENIRUNLX0lHTk9SRQkJPQktLWlnbm9yZSBDT01QTEVYX01BQ1JPIFwKQEAgLTIxMSw2ICsyMTQsNyBAQAogCQkJCS1JaW5jbHVkZS9jb21tb24JCVwKIAkJCQktSWluY2x1ZGUvZHJpdmVycwkJXAogCQkJCS1JaW5jbHVkZS9kcml2ZXJzL2FybQkJXAorCQkJCS1JaW5jbHVkZS9kcml2ZXJzL2F1dGgJCVwKIAkJCQktSWluY2x1ZGUvZHJpdmVycy9pbwkJXAogCQkJCS1JaW5jbHVkZS9kcml2ZXJzL3RpL3VhcnQJXAogCQkJCS1JaW5jbHVkZS9saWIJCQlcCkBAIC0yNjcsMTEgKzI3MSwxNiBAQAogIyBQcm9jZXNzIEdlbmVyYXRlIENvVCBmbGFncwogJChldmFsICQoY2FsbCBhc3NlcnRfYm9vbGVhbixHRU5FUkFURV9DT1QpKQogJChldmFsICQoY2FsbCBhc3NlcnRfYm9vbGVhbixDUkVBVEVfS0VZUykpCiskKGV2YWwgJChjYWxsIGFzc2VydF9ib29sZWFuLFNBVkVfS0VZUykpCiAKICMgUHJvY2VzcyBUUlVTVEVEX0JPQVJEX0JPT1QgZmxhZwogJChldmFsICQoY2FsbCBhc3NlcnRfYm9vbGVhbixUUlVTVEVEX0JPQVJEX0JPT1QpKQogJChldmFsICQoY2FsbCBhZGRfZGVmaW5lLFRSVVNURURfQk9BUkRfQk9PVCkpCiAKKyMgUHJvY2VzcyBQUk9HUkFNTUFCTEVfUkVTRVRfQUREUkVTUyBmbGFnCiskKGV2YWwgJChjYWxsIGFzc2VydF9ib29sZWFuLFBST0dSQU1NQUJMRV9SRVNFVF9BRERSRVNTKSkKKyQoZXZhbCAkKGNhbGwgYWRkX2RlZmluZSxQUk9HUkFNTUFCTEVfUkVTRVRfQUREUkVTUykpCisKIEFTRkxBR1MJCQkrPSAJLW5vc3RkaW5jIC1mZnJlZXN0YW5kaW5nIC1XYSwtLWZhdGFsLXdhcm5pbmdzCVwKIAkJCQktV2Vycm9yIC1XbWlzc2luZy1pbmNsdWRlLWRpcnMJCQlcCiAJCQkJLW1nZW5lcmFsLXJlZ3Mtb25seSAtRF9fQVNTRU1CTFlfXwkJXApAQCAtMzIwLDI4ICszMjksMTUgQEAKIAogICAgIGlmbmVxICgke0NSRUFURV9LRVlTfSwwKQogICAgICAgICAkKGV2YWwgQ1JUX0FSR1MgKz0gLW4pCisgICAgICAgIGlmbmVxICgke1NBVkVfS0VZU30sMCkKKyAgICAgICAgICAgICQoZXZhbCBDUlRfQVJHUyArPSAtaykKKyAgICAgICAgZW5kaWYKICAgICBlbmRpZgogICAgICQoZXZhbCBDUlRfQVJHUyArPSAkKGlmICR7Uk9UX0tFWX0sIC0tcm90LWtleSAke1JPVF9LRVl9KSkKICAgICAkKGV2YWwgQ1JUX0FSR1MgKz0gJChpZiAke1RSVVNURURfV09STERfS0VZfSwgLS10cnVzdGVkLXdvcmxkLWtleSAke1RSVVNURURfV09STERfS0VZfSkpCiAgICAgJChldmFsIENSVF9BUkdTICs9ICQoaWYgJHtOT05fVFJVU1RFRF9XT1JMRF9LRVl9LCAtLW5vbi10cnVzdGVkLXdvcmxkLWtleSAke05PTl9UUlVTVEVEX1dPUkxEX0tFWX0pKQogICAgICQoZXZhbCBDUlRfQVJHUyArPSAtLXRydXN0ZWQta2V5LWNlcnQgJHtUUlVTVEVEX0tFWV9DRVJUfSkKLWVuZGlmCi0KLSMgQ2hlY2sgVHJ1c3RlZCBCb2FyZCBCb290IG9wdGlvbnMKLWlmbmVxICgke1RSVVNURURfQk9BUkRfQk9PVH0sMCkKLSAgICBpZmVxICgke0FVVEhfTU9EfSxub25lKQotICAgICAgICAkKGVycm9yIEVycm9yOiBXaGVuIFRSVVNURURfQk9BUkRfQk9PVD0xLCBBVVRIX01PRCBoYXMgdG8gYmUgdGhlIG5hbWUgb2YgYSB2YWxpZCBhdXRoZW50aWNhdGlvbiBtb2R1bGUpCi0gICAgZWxzZQotICAgICAgICAjIFdlIGV4cGVjdCB0byBsb2NhdGUgYW4gKi5tayBmaWxlIHVuZGVyIHRoZSBzcGVjaWZpZWQgQVVUSF9NT0QgZGlyZWN0b3J5Ci0gICAgICAgIEFVVEhfTUFLRSA6PSAkKHNoZWxsIG09ImNvbW1vbi9hdXRoLyR7QVVUSF9NT0R9LyR7QVVUSF9NT0R9Lm1rIjsgWyAtZiAiJCRtIiBdICYmIGVjaG8gIiQkbSIpCi0gICAgICAgIGlmZXEgKCR7QVVUSF9NQUtFfSwpCi0gICAgICAgICAgICAkKGVycm9yIEVycm9yOiBObyBjb21tb24vYXV0aC8ke0FVVEhfTU9EfS8ke0FVVEhfTU9EfS5tayBsb2NhdGVkKQotICAgICAgICBlbmRpZgotICAgICAgICAkKGluZm8gSW5jbHVkaW5nICR7QVVUSF9NQUtFfSkKLSAgICAgICAgaW5jbHVkZSAke0FVVEhfTUFLRX0KLSAgICBlbmRpZgotCi0gICAgQkxfQ09NTU9OX1NPVVJDRVMJKz0JY29tbW9uL2F1dGguYworICAgICQoZXZhbCBDUlRfQVJHUyArPSAkKGlmICR7S0VZX0FMR30sIC0ta2V5LWFsZyAke0tFWV9BTEd9KSkKIGVuZGlmCiAKICMgQ2hlY2sgaWYgLXBlZGFudGljIG9wdGlvbiBzaG91bGQgYmUgdXNlZApAQCAtNTA3LDcgKzUwMyw2IEBACiAkKGV2YWwgRklQX0FSR1MgKz0gJChpZiAkNCwkKGlmICQ1LC0tYmwkKDEpLWtleS1jZXJ0ICQoQlVJTERfUExBVCkvYmwkKDEpX2tleS5jcnQpKSkKIAogJChldmFsIENSVF9ERVBTICs9ICQoaWYgJDQsJCgyKSwpKQotJChldmFsIENSVF9ERVBTICs9ICQoaWYgJDQsJChpZiAkNiwkKDYpLCkpKQogJChldmFsIENSVF9BUkdTICs9ICQoaWYgJDQsLS1ibCQoMSkgJCgyKSkpCiAkKGV2YWwgQ1JUX0FSR1MgKz0gJChpZiAkNCwkKGlmICQ2LC0tYmwkKDEpLWtleSAkKDYpKSkpCiAkKGV2YWwgQ1JUX0FSR1MgKz0gJChpZiAkNCwtLWJsJCgxKS1jZXJ0ICQoQlVJTERfUExBVCkvYmwkKDEpLmNydCkpCmRpZmYgLS1naXQgYS9ibDEvYWFyY2g2NC9ibDFfZW50cnlwb2ludC5TIGIvYmwxL2FhcmNoNjQvYmwxX2VudHJ5cG9pbnQuUwppbmRleCA4YmFiYjMzLi40ZmM1MjkxIDEwMDY0NAotLS0gYS9ibDEvYWFyY2g2NC9ibDFfZW50cnlwb2ludC5TCisrKyBiL2JsMS9hYXJjaDY0L2JsMV9lbnRyeXBvaW50LlMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIEFSTSBMaW1pdGVkIGFuZCBDb250cmlidXRvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgpAQCAtMjksNyArMjksNyBAQAogICovCiAKICNpbmNsdWRlIDxhcmNoLmg+Ci0jaW5jbHVkZSA8YXNtX21hY3Jvcy5TPgorI2luY2x1ZGUgPGVsM19jb21tb25fbWFjcm9zLlM+CiAKIAkuZ2xvYmwJYmwxX2VudHJ5cG9pbnQKIApAQCAtNDIsMTE2ICs0MiwxOSBAQAogCSAqLwogCiBmdW5jIGJsMV9lbnRyeXBvaW50Ci0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogU2V0IHRoZSBDUFUgZW5kaWFubmVzcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcKLQkgKiB0aGF0IG1pZ2h0IGludm9sdmUgbWVtb3J5IHJlYWRzIG9yIHdyaXRlcy4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQltcnMJeDAsIHNjdGxyX2VsMwotCWJpYwl4MCwgeDAsICNTQ1RMUl9FRV9CSVQKLQltc3IJc2N0bHJfZWwzLCB4MAotCWlzYgotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogUGVyZm9ybSBhbnkgcHJvY2Vzc29yIHNwZWNpZmljIGFjdGlvbnMgdXBvbgotCSAqIHJlc2V0IGUuZy4gY2FjaGUsIHRsYiBpbnZhbGlkYXRpb25zIGV0Yy4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlibAlyZXNldF9oYW5kbGVyCi0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBFbmFibGUgdGhlIGluc3RydWN0aW9uIGNhY2hlLCBzdGFjayBwb2ludGVyCi0JICogYW5kIGRhdGEgYWNjZXNzIGFsaWdubWVudCBjaGVja3MKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQltb3YJeDEsICMoU0NUTFJfSV9CSVQgfCBTQ1RMUl9BX0JJVCB8IFNDVExSX1NBX0JJVCkKLQltcnMJeDAsIHNjdGxyX2VsMwotCW9ycgl4MCwgeDAsIHgxCi0JbXNyCXNjdGxyX2VsMywgeDAKLQlpc2IKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFNldCB0aGUgZXhjZXB0aW9uIHZlY3RvciB0byBzb21ldGhpbmcgc2FuZS4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlhZHIJeDAsIGJsMV9leGNlcHRpb25zCi0JbXNyCXZiYXJfZWwzLCB4MAotCWlzYgotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogRW5hYmxlIHRoZSBTRXJyb3IgaW50ZXJydXB0IG5vdyB0aGF0IHRoZQotCSAqIGV4Y2VwdGlvbiB2ZWN0b3JzIGhhdmUgYmVlbiBzZXR1cC4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQltc3IJZGFpZmNsciwgI0RBSUZfQUJUX0JJVAotCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIEFyY2hpdGVjdHVyYWwgZmVhdHVyZSB0cmFwIHJlZ2lzdGVyCi0JICogKENQVFJfRUwzKSBpcyB1bmtub3duIGFuZCBpdCBtdXN0IGJlIHNldCB0byBhIGtub3duIHN0YXRlLiBBbGwKLQkgKiBmZWF0dXJlIHRyYXBzIGFyZSBkaXNhYmxlZC4gU29tZSBiaXRzIGluIHRoaXMgcmVnaXN0ZXIgYXJlIG1hcmtlZCBhcwotCSAqIFJlc2VydmVkIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgotCSAqCi0JICogQ1BUUl9FTDMuVENQQUM6IFRoaXMgY2F1c2VzIGEgZGlyZWN0IGFjY2VzcyB0byB0aGUgQ1BBQ1JfRUwxIGZyb20gRUwxCi0JICogIG9yIHRoZSBDUFRSX0VMMiBmcm9tIEVMMiB0byB0cmFwIHRvIEVMMyB1bmxlc3MgaXQgaXMgdHJhcHBlZCBhdCBFTDIuCi0JICogQ1BUUl9FTDMuVFRBOiBUaGlzIGNhdXNlcyBhY2Nlc3MgdG8gdGhlIFRyYWNlIGZ1bmN0aW9uYWxpdHkgdG8gdHJhcAotCSAqICB0byBFTDMgd2hlbiBleGVjdXRlZCBmcm9tIEVMMCwgRUwxLCBFTDIsIG9yIEVMMy4gSWYgc3lzdGVtIHJlZ2lzdGVyCi0JICogIGFjY2VzcyB0byB0cmFjZSBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgYml0IGlzIFJFUzAuCi0JICogQ1BUUl9FTDMuVEZQOiBUaGlzIGNhdXNlcyBpbnN0cnVjdGlvbnMgdGhhdCBhY2Nlc3MgdGhlIHJlZ2lzdGVycwotCSAqICBhc3NvY2lhdGVkIHdpdGggRmxvYXRpbmcgUG9pbnQgYW5kIEFkdmFuY2VkIFNJTUQgZXhlY3V0aW9uIHRvIHRyYXAKLQkgKiAgdG8gRUwzIHdoZW4gZXhlY3V0ZWQgZnJvbSBhbnkgZXhjZXB0aW9uIGxldmVsLCB1bmxlc3MgdHJhcHBlZCB0byBFTDEKLQkgKiAgb3IgRUwyLgorCSAqIElmIHRoZSByZXNldCBhZGRyZXNzIGlzIHByb2dyYW1tYWJsZSB0aGVuIGJsMV9lbnRyeXBvaW50KCkgaXMKKwkgKiBleGVjdXRlZCBvbmx5IG9uIHRoZSBjb2xkIGJvb3QgcGF0aC4gVGhlcmVmb3JlLCB3ZSBjYW4gc2tpcCB0aGUgd2FybQorCSAqIGJvb3QgbWFpbGJveCBtZWNoYW5pc20uCiAJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICovCi0JbXJzCXgwLCBjcHRyX2VsMwotCWJpYwl3MCwgdzAsICNUQ1BBQ19CSVQKLQliaWMJdzAsIHcwLCAjVFRBX0JJVAotCWJpYwl3MCwgdzAsICNURlBfQklUCi0JbXNyCWNwdHJfZWwzLCB4MAotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFdpbGwgbm90IHJldHVybiBmcm9tIHRoaXMgbWFjcm8gaWYgaXQgaXMgYSB3YXJtIGJvb3QuCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCXdhaXRfZm9yX2VudHJ5cG9pbnQKLQotCWJsCXBsYXRmb3JtX21lbV9pbml0Ci0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBJbml0IEMgcnVudGltZSBlbnZpcm9ubWVudC4KLQkgKiAgIC0gWmVyby1pbml0aWFsaXNlIHRoZSBOT0JJVFMgc2VjdGlvbnMuCi0JICogICAgIFRoZXJlIGFyZSAyIG9mIHRoZW06Ci0JICogICAgICAgLSB0aGUgLmJzcyBzZWN0aW9uOwotCSAqICAgICAgIC0gdGhlIGNvaGVyZW50IG1lbW9yeSBzZWN0aW9uLgotCSAqICAgLSBDb3B5IHRoZSBkYXRhIHNlY3Rpb24gZnJvbSBCTDEgaW1hZ2UKLQkgKiAgICAgKHN0b3JlZCBpbiBST00pIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uCi0JICogICAgIGluIFJBTS4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlsZHIJeDAsID1fX0JTU19TVEFSVF9fCi0JbGRyCXgxLCA9X19CU1NfU0laRV9fCi0JYmwJemVyb21lbTE2Ci0KLSNpZiBVU0VfQ09IRVJFTlRfTUVNCi0JbGRyCXgwLCA9X19DT0hFUkVOVF9SQU1fU1RBUlRfXwotCWxkcgl4MSwgPV9fQ09IRVJFTlRfUkFNX1VOQUxJR05FRF9TSVpFX18KLQlibAl6ZXJvbWVtMTYKLSNlbmRpZgotCi0JbGRyCXgwLCA9X19EQVRBX1JBTV9TVEFSVF9fCi0JbGRyCXgxLCA9X19EQVRBX1JPTV9TVEFSVF9fCi0JbGRyCXgyLCA9X19EQVRBX1NJWkVfXwotCWJsCW1lbWNweTE2Ci0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIEFsbG9jYXRlIGEgc3RhY2sgd2hvc2UgbWVtb3J5IHdpbGwgYmUgbWFya2VkCi0JICogYXMgTm9ybWFsLUlTLVdCV0Egd2hlbiB0aGUgTU1VIGlzIGVuYWJsZWQuCi0JICogVGhlcmUgaXMgbm8gcmlzayBvZiByZWFkaW5nIHN0YWxlIHN0YWNrCi0JICogbWVtb3J5IGFmdGVyIGVuYWJsaW5nIHRoZSBNTVUgYXMgb25seSB0aGUKLQkgKiBwcmltYXJ5IGNwdSBpcyBydW5uaW5nIGF0IHRoZSBtb21lbnQuCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQltcnMJeDAsIG1waWRyX2VsMQotCWJsCXBsYXRmb3JtX3NldF9zdGFjaworCWVsM19lbnRyeXBvaW50X2NvbW1vbgkJCQkJXAorCQlfc2V0X2VuZGlhbj0xCQkJCQlcCisJCV93YXJtX2Jvb3RfbWFpbGJveD0hUFJPR1JBTU1BQkxFX1JFU0VUX0FERFJFU1MJXAorCQlfc2Vjb25kYXJ5X2NvbGRfYm9vdD0xCQkJCVwKKwkJX2luaXRfbWVtb3J5PTEJCQkJCVwKKwkJX2luaXRfY19ydW50aW1lPTEJCQkJXAorCQlfZXhjZXB0aW9uX3ZlY3RvcnM9YmwxX2V4Y2VwdGlvbnMKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqIEFyY2hpdGVjdHVyYWwgaW5pdC4gY2FuIGJlIGdlbmVyaWMgZS5nLgpkaWZmIC0tZ2l0IGEvYmwxL2JsMS5sZC5TIGIvYmwxL2JsMS5sZC5TCmluZGV4IGQ2ODIzODQuLmRmOWE3OTkgMTAwNjQ0Ci0tLSBhL2JsMS9ibDEubGQuUworKysgYi9ibDEvYmwxLmxkLlMKQEAgLTUxLDYgKzUxLDEyIEBACiAgICAgICAgICooLnRleHQqKQogICAgICAgICAqKC5yb2RhdGEqKQogCisgICAgICAgIC8qIEVuc3VyZSA4LWJ5dGUgYWxpZ25tZW50IGZvciBkZXNjcmlwdG9ycyBhbmQgZW5zdXJlIGluY2x1c2lvbiAqLworICAgICAgICAuID0gQUxJR04oOCk7CisgICAgICAgIF9fUEFSU0VSX0xJQl9ERVNDU19TVEFSVF9fID0gLjsKKyAgICAgICAgS0VFUCgqKC5pbWdfcGFyc2VyX2xpYl9kZXNjcykpCisgICAgICAgIF9fUEFSU0VSX0xJQl9ERVNDU19FTkRfXyA9IC47CisKICAgICAgICAgLyoKICAgICAgICAgICogRW5zdXJlIDgtYnl0ZSBhbGlnbm1lbnQgZm9yIGNwdV9vcHMgc28gdGhhdCBpdHMgZmllbGRzIGFyZSBhbHNvCiAgICAgICAgICAqIGFsaWduZWQuIEFsc28gZW5zdXJlIGNwdV9vcHMgaW5jbHVzaW9uLgpkaWZmIC0tZ2l0IGEvYmwxL2JsMV9tYWluLmMgYi9ibDEvYmwxX21haW4uYwppbmRleCBhNWRiMDg1Li5lMzIyNTMxIDEwMDY0NAotLS0gYS9ibDEvYmwxX21haW4uYworKysgYi9ibDEvYmwxX21haW4uYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFyY2guaD4KICNpbmNsdWRlIDxhcmNoX2hlbHBlcnMuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxhdXRoLmg+CisjaW5jbHVkZSA8YXV0aF9tb2QuaD4KICNpbmNsdWRlIDxibF9jb21tb24uaD4KICNpbmNsdWRlIDxkZWJ1Zy5oPgogI2luY2x1ZGUgPHBsYXRmb3JtLmg+CkBAIC0xMjYsOSArMTI2LDkgQEAKIAkgKiBFbnN1cmUgdGhhdCBNTVUvQ2FjaGVzIGFuZCBjb2hlcmVuY3kgYXJlIHR1cm5lZCBvbgogCSAqLwogCXZhbCA9IHJlYWRfc2N0bHJfZWwzKCk7Ci0JYXNzZXJ0KHZhbCB8IFNDVExSX01fQklUKTsKLQlhc3NlcnQodmFsIHwgU0NUTFJfQ19CSVQpOwotCWFzc2VydCh2YWwgfCBTQ1RMUl9JX0JJVCk7CisJYXNzZXJ0KHZhbCAmIFNDVExSX01fQklUKTsKKwlhc3NlcnQodmFsICYgU0NUTFJfQ19CSVQpOworCWFzc2VydCh2YWwgJiBTQ1RMUl9JX0JJVCk7CiAJLyoKIAkgKiBDaGVjayB0aGF0IENhY2hlIFdyaXRlYmFjayBHcmFudWxlIChDV0cpIGluIENUUl9FTDAgbWF0Y2hlcyB0aGUKIAkgKiBwcm92aWRlZCBwbGF0Zm9ybSB2YWx1ZQpAQCAtMTU3LDQwICsxNTcsMjAgQEAKIAkvKiBGaW5kIG91dCBob3cgbXVjaCBmcmVlIHRydXN0ZWQgcmFtIHJlbWFpbnMgYWZ0ZXIgQkwxIGxvYWQgKi8KIAlibDFfdHpyYW1fbGF5b3V0ID0gYmwxX3BsYXRfc2VjX21lbV9sYXlvdXQoKTsKIAorCUlORk8oIkJMMTogTG9hZGluZyBCTDJcbiIpOworCiAjaWYgVFJVU1RFRF9CT0FSRF9CT09UCiAJLyogSW5pdGlhbGl6ZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgKi8KLQlhdXRoX2luaXQoKTsKLQotCS8qCi0JICogTG9hZCB0aGUgQkwyIGNlcnRpZmljYXRlIGludG8gdGhlIEJMMiByZWdpb24uIFRoaXMgcmVnaW9uIHdpbGwgYmUKLQkgKiBvdmVyd3JpdHRlbiBieSB0aGUgaW1hZ2UsIHNvIHRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgaXMgcmVzcG9uc2libGUKLQkgKiBmb3Igc3RvcmluZyB0aGUgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBjZXJ0aWZpY2F0ZSAoa2V5cywgaGFzaGVzLAotCSAqIGV0Yy4pIHNvIGl0IGNhbiBiZSB1c2VkIGxhdGVyLgotCSAqLwotCWVyciA9IGxvYWRfaW1hZ2UoYmwxX3R6cmFtX2xheW91dCwKLQkJCSBCTDJfQ0VSVF9OQU1FLAotCQkJIEJMMl9CQVNFLAotCQkJICZibDJfaW1hZ2VfaW5mbywKLQkJCSBOVUxMKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJGYWlsZWQgdG8gbG9hZCBCTDIgY2VydGlmaWNhdGUuXG4iKTsKLQkJcGFuaWMoKTsKLQl9Ci0KLQllcnIgPSBhdXRoX3ZlcmlmeV9vYmooQVVUSF9CTDJfSU1HX0NFUlQsIGJsMl9pbWFnZV9pbmZvLmltYWdlX2Jhc2UsCi0JCQlibDJfaW1hZ2VfaW5mby5pbWFnZV9zaXplKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJGYWlsZWQgdG8gdmFsaWRhdGUgQkwyIGNlcnRpZmljYXRlLlxuIik7Ci0JCXBhbmljKCk7Ci0JfQorCWF1dGhfbW9kX2luaXQoKTsKICNlbmRpZiAvKiBUUlVTVEVEX0JPQVJEX0JPT1QgKi8KIAogCS8qIExvYWQgdGhlIEJMMiBpbWFnZSAqLwotCWVyciA9IGxvYWRfaW1hZ2UoYmwxX3R6cmFtX2xheW91dCwKLQkJCSBCTDJfSU1BR0VfTkFNRSwKKwllcnIgPSBsb2FkX2F1dGhfaW1hZ2UoYmwxX3R6cmFtX2xheW91dCwKKwkJCSBCTDJfSU1BR0VfSUQsCiAJCQkgQkwyX0JBU0UsCiAJCQkgJmJsMl9pbWFnZV9pbmZvLAogCQkJICZibDJfZXApOworCiAJaWYgKGVycikgewogCQkvKgogCQkgKiBUT0RPOiBwcmludCBmYWlsdXJlIHRvIGxvYWQgQkwyIGJ1dCBhbHNvIGFkZCBhIHR6d2RvZyB0aW1lcgpAQCAtMjAwLDE5ICsxODAsNiBAQAogCQlwYW5pYygpOwogCX0KIAotI2lmIFRSVVNURURfQk9BUkRfQk9PVAotCWVyciA9IGF1dGhfdmVyaWZ5X29iaihBVVRIX0JMMl9JTUcsIGJsMl9pbWFnZV9pbmZvLmltYWdlX2Jhc2UsCi0JCQkJYmwyX2ltYWdlX2luZm8uaW1hZ2Vfc2l6ZSk7Ci0JaWYgKGVycikgewotCQlFUlJPUigiRmFpbGVkIHRvIHZhbGlkYXRlIEJMMiBpbWFnZS5cbiIpOwotCQlwYW5pYygpOwotCX0KLQotCS8qIEFmdGVyIHdvcmtpbmcgd2l0aCBkYXRhLCBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlICovCi0JaW52X2RjYWNoZV9yYW5nZShibDJfaW1hZ2VfaW5mby5pbWFnZV9iYXNlLAotCQkJKHNpemVfdClibDJfaW1hZ2VfaW5mby5pbWFnZV9zaXplKTsKLSNlbmRpZiAvKiBUUlVTVEVEX0JPQVJEX0JPT1QgKi8KLQogCS8qCiAJICogQ3JlYXRlIGEgbmV3IGxheW91dCBvZiBtZW1vcnkgZm9yIEJMMiBhcyBzZWVuIGJ5IEJMMSBpLmUuCiAJICogdGVsbCBpdCB0aGUgYW1vdW50IG9mIHRvdGFsIGFuZCBmcmVlIG1lbW9yeSBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9ibDIvYmwyLmxkLlMgYi9ibDIvYmwyLmxkLlMKaW5kZXggOTkzMzMzOS4uMzM1ODhlNiAxMDA2NDQKLS0tIGEvYmwyL2JsMi5sZC5TCisrKyBiL2JsMi9ibDIubGQuUwpAQCAtNTAsNiArNTAsMTMgQEAKICAgICAgICAgKmJsMl9lbnRyeXBvaW50Lm8oLnRleHQqKQogICAgICAgICAqKC50ZXh0KikKICAgICAgICAgKigucm9kYXRhKikKKworICAgICAgICAvKiBFbnN1cmUgOC1ieXRlIGFsaWdubWVudCBmb3IgZGVzY3JpcHRvcnMgYW5kIGVuc3VyZSBpbmNsdXNpb24gKi8KKyAgICAgICAgLiA9IEFMSUdOKDgpOworICAgICAgICBfX1BBUlNFUl9MSUJfREVTQ1NfU1RBUlRfXyA9IC47CisgICAgICAgIEtFRVAoKiguaW1nX3BhcnNlcl9saWJfZGVzY3MpKQorICAgICAgICBfX1BBUlNFUl9MSUJfREVTQ1NfRU5EX18gPSAuOworCiAgICAgICAgICooLnZlY3RvcnMpCiAgICAgICAgIF9fUk9fRU5EX1VOQUxJR05FRF9fID0gLjsKICAgICAgICAgLyoKZGlmZiAtLWdpdCBhL2JsMi9ibDJfbWFpbi5jIGIvYmwyL2JsMl9tYWluLmMKaW5kZXggZmI3OWYwNC4uNGMxOTAwMiAxMDA2NDQKLS0tIGEvYmwyL2JsMl9tYWluLmMKKysrIGIvYmwyL2JsMl9tYWluLmMKQEAgLTMxLDE0OSArMzEsMTQgQEAKICNpbmNsdWRlIDxhcmNoLmg+CiAjaW5jbHVkZSA8YXJjaF9oZWxwZXJzLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8YXV0aC5oPgorI2luY2x1ZGUgPGF1dGhfbW9kLmg+CiAjaW5jbHVkZSA8YmxfY29tbW9uLmg+CiAjaW5jbHVkZSA8ZGVidWcuaD4KICNpbmNsdWRlIDxwbGF0Zm9ybS5oPgogI2luY2x1ZGUgPHBsYXRmb3JtX2RlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgImJsMl9wcml2YXRlLmgiCiAKLSNpZiBUUlVTVEVEX0JPQVJEX0JPT1QKLQotI2lmZGVmIEJMMzJfQkFTRQotc3RhdGljIGludCBibDMyX2NlcnRfZXJyb3I7Ci0jZW5kaWYKLQotLyoKLSAqIExvYWQgYW5kIGF1dGhlbnRpY2F0ZSB0aGUga2V5IGFuZCBjb250ZW50IGNlcnRpZmljYXRlcyBmb3IgYSBCTDMteCBpbWFnZQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiAgIGtleV9jZXJ0X2Jsb2I6IGtleSBjZXJ0aWZpY2F0ZSBibG9iIGlkIChzZWUgYXV0aC5oKQotICogICBrZXlfY2VydF9uYW1lOiBrZXkgY2VydGlmaWNhdGUgZmlsZW5hbWUKLSAqICAgY29udF9jZXJ0X2Jsb2I6IGNvbnRlbnQgY2VydGlmaWNhdGUgYmxvYiBpZCAoc2VlIGF1dGguaCkKLSAqICAgY29udF9jZXJ0X25hbWU6IGNvbnRlbnQgY2VydGlmaWNhdGUgZmlsZW5hbWUKLSAqICAgbWVtX2xheW91dDogVHJ1c3RlZCBTUkFNIG1lbW9yeSBsYXlvdXQKLSAqICAgbG9hZF9hZGRyOiBsb2FkIHRoZSBjZXJ0aWZpY2F0ZXMgYXQgdGhpcyBhZGRyZXNzCi0gKgotICogUmV0dXJuOiAwID0gc3VjY2VzcywgT3RoZXJ3aXNlID0gZXJyb3IKLSAqLwotc3RhdGljIGludCBsb2FkX2NlcnRfYmwzeChpbnQga2V5X2NlcnRfYmxvYiwgY29uc3QgY2hhciAqa2V5X2NlcnRfbmFtZSwKLQkJCSAgaW50IGNvbnRfY2VydF9ibG9iLCBjb25zdCBjaGFyICpjb250X2NlcnRfbmFtZSwKLQkJCSAgbWVtaW5mb190ICptZW1fbGF5b3V0LCB1aW50NjRfdCBsb2FkX2FkZHIpCi17Ci0JaW1hZ2VfaW5mb190IGltYWdlX2luZm87Ci0JaW50IGVycjsKLQotCS8qIExvYWQgS2V5IGNlcnRpZmljYXRlICovCi0JaW1hZ2VfaW5mby5oLnZlcnNpb24gPSBWRVJTSU9OXzE7Ci0JZXJyID0gbG9hZF9pbWFnZShtZW1fbGF5b3V0LCBrZXlfY2VydF9uYW1lLCBsb2FkX2FkZHIsICZpbWFnZV9pbmZvLCBOVUxMKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJDYW5ub3QgbG9hZCAlcy5cbiIsIGtleV9jZXJ0X25hbWUpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWVyciA9IGF1dGhfdmVyaWZ5X29iaihrZXlfY2VydF9ibG9iLCBpbWFnZV9pbmZvLmltYWdlX2Jhc2UsCi0JCQlpbWFnZV9pbmZvLmltYWdlX3NpemUpOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIkludmFsaWQga2V5IGNlcnRpZmljYXRlICVzLlxuIiwga2V5X2NlcnRfbmFtZSk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JLyogTG9hZCBDb250ZW50IGNlcnRpZmljYXRlICovCi0JaW1hZ2VfaW5mby5oLnZlcnNpb24gPSBWRVJTSU9OXzE7Ci0JZXJyID0gbG9hZF9pbWFnZShtZW1fbGF5b3V0LCBjb250X2NlcnRfbmFtZSwgbG9hZF9hZGRyLCAmaW1hZ2VfaW5mbywgTlVMTCk7Ci0JaWYgKGVycikgewotCQlFUlJPUigiQ2Fubm90IGxvYWQgJXMuXG4iLCBjb250X2NlcnRfbmFtZSk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZXJyID0gYXV0aF92ZXJpZnlfb2JqKGNvbnRfY2VydF9ibG9iLCBpbWFnZV9pbmZvLmltYWdlX2Jhc2UsCi0JCQlpbWFnZV9pbmZvLmltYWdlX3NpemUpOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIkludmFsaWQgY29udGVudCBjZXJ0aWZpY2F0ZSAlcy5cbiIsIGNvbnRfY2VydF9uYW1lKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIExvYWQgYW5kIGF1dGhlbnRpY2F0ZSB0aGUgVHJ1c3RlZCBLZXkgY2VydGlmaWNhdGUgdGhlIGtleSBhbmQgY29udGVudAotICogY2VydGlmaWNhdGVzIGZvciBlYWNoIG9mIHRoZSBCTDMteCBpbWFnZXMuCi0gKgotICogUmV0dXJuOiAwID0gc3VjY2VzcywgT3RoZXJ3aXNlID0gZXJyb3IKLSAqLwotc3RhdGljIGludCBsb2FkX2NlcnRzKHZvaWQpCi17Ci0JY29uc3QgdWludDY0X3QgbG9hZF9hZGRyID0gQkwzMV9CQVNFOwotCWltYWdlX2luZm9fdCBpbWFnZV9pbmZvOwotCW1lbWluZm9fdCAqbWVtX2xheW91dDsKLQlpbnQgZXJyOwotCi0JLyogRmluZCBvdXQgaG93IG11Y2ggZnJlZSB0cnVzdGVkIHJhbSByZW1haW5zIGFmdGVyIEJMMiBsb2FkICovCi0JbWVtX2xheW91dCA9IGJsMl9wbGF0X3NlY19tZW1fbGF5b3V0KCk7Ci0KLQkvKiBMb2FkIHRoZSBUcnVzdGVkIEtleSBjZXJ0aWZpY2F0ZSBpbiB0aGUgQkwzMSByZWdpb24gKi8KLQlpbWFnZV9pbmZvLmgudmVyc2lvbiA9IFZFUlNJT05fMTsKLQllcnIgPSBsb2FkX2ltYWdlKG1lbV9sYXlvdXQsIFRSVVNURURfS0VZX0NFUlRfTkFNRSwgbG9hZF9hZGRyLAotCQkJICZpbWFnZV9pbmZvLCBOVUxMKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJGYWlsZWQgdG8gbG9hZCBUcnVzdGVkIEtleSBjZXJ0aWZpY2F0ZS5cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIFZhbGlkYXRlIHRoZSBjZXJ0aWZpY2F0ZSAqLwotCWVyciA9IGF1dGhfdmVyaWZ5X29iaihBVVRIX1RSVVNURURfS0VZX0NFUlQsIGltYWdlX2luZm8uaW1hZ2VfYmFzZSwKLQkJCWltYWdlX2luZm8uaW1hZ2Vfc2l6ZSk7Ci0JaWYgKGVycikgewotCQlFUlJPUigiSW52YWxpZCBUcnVzdGVkIEtleSBjZXJ0aWZpY2F0ZS5cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIExvYWQgYW5kIHZhbGlkYXRlIEtleSBhbmQgQ29udGVudCBjZXJ0aWZpY2F0ZXMgZm9yIEJMMy14IGltYWdlcyAqLwotI2lmZGVmIEJMMzBfQkFTRQotCWVyciA9IGxvYWRfY2VydF9ibDN4KEFVVEhfQkwzMF9LRVlfQ0VSVCwgQkwzMF9LRVlfQ0VSVF9OQU1FLAotCQkJICAgICBBVVRIX0JMMzBfSU1HX0NFUlQsIEJMMzBfQ0VSVF9OQU1FLAotCQkJICAgICBtZW1fbGF5b3V0LCBsb2FkX2FkZHIpOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIkZhaWxlZCB0byB2ZXJpZnkgQkwzLTAgYXV0aGVudGljaXR5XG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0jZW5kaWYgLyogQkwzMF9CQVNFICovCi0KLQllcnIgPSBsb2FkX2NlcnRfYmwzeChBVVRIX0JMMzFfS0VZX0NFUlQsIEJMMzFfS0VZX0NFUlRfTkFNRSwKLQkJCSAgICAgQVVUSF9CTDMxX0lNR19DRVJULCBCTDMxX0NFUlRfTkFNRSwKLQkJCSAgICAgbWVtX2xheW91dCwgbG9hZF9hZGRyKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJGYWlsZWQgdG8gdmVyaWZ5IEJMMy0xIGF1dGhlbnRpY2l0eVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0jaWZkZWYgQkwzMl9CQVNFCi0JLyogQkwzLTIgaW1hZ2UgaXMgb3B0aW9uYWwsIGJ1dCBrZWVwIHRoZSByZXR1cm4gdmFsdWUgaW4gY2FzZSB0aGUKLQkgKiBpbWFnZSBpcyBwcmVzZW50IGJ1dCB0aGUgY2VydGlmaWNhdGUgaXMgbWlzc2luZyAqLwotCWVyciA9IGxvYWRfY2VydF9ibDN4KEFVVEhfQkwzMl9LRVlfQ0VSVCwgQkwzMl9LRVlfQ0VSVF9OQU1FLAotCQkJICAgICBBVVRIX0JMMzJfSU1HX0NFUlQsIEJMMzJfQ0VSVF9OQU1FLAotCQkJICAgICBtZW1fbGF5b3V0LCBsb2FkX2FkZHIpOwotCWlmIChlcnIpIHsKLQkJV0FSTigiRmFpbGVkIHRvIHZlcmlmeSBCTDMtMiBhdXRoZW50aWNpdHlcbiIpOwotCX0KLQlibDMyX2NlcnRfZXJyb3IgPSBlcnI7Ci0jZW5kaWYgLyogQkwzMl9CQVNFICovCi0KLQllcnIgPSBsb2FkX2NlcnRfYmwzeChBVVRIX0JMMzNfS0VZX0NFUlQsIEJMMzNfS0VZX0NFUlRfTkFNRSwKLQkJCSAgICAgQVVUSF9CTDMzX0lNR19DRVJULCBCTDMzX0NFUlRfTkFNRSwKLQkJCSAgICAgbWVtX2xheW91dCwgbG9hZF9hZGRyKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJGYWlsZWQgdG8gdmVyaWZ5IEJMMy0zIGF1dGhlbnRpY2l0eVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBUUlVTVEVEX0JPQVJEX0JPT1QgKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIExvYWQgdGhlIEJMMy0wIGltYWdlIGlmIHRoZXJlJ3Mgb25lLgogICogSWYgYSBwbGF0Zm9ybSBkb2VzIG5vdCB3YW50IHRvIGF0dGVtcHQgdG8gbG9hZCBCTDMtMCBpbWFnZSBpdCBtdXN0IGxlYXZlCkBAIC0xOTksMzQgKzY0LDE4IEBACiAJSU5GTygiQkwyOiBMb2FkaW5nIEJMMy0wXG4iKTsKIAlibDJfcGxhdF9nZXRfYmwzMF9tZW1pbmZvKCZibDMwX21lbV9pbmZvKTsKIAlibDMwX2ltYWdlX2luZm8uaC52ZXJzaW9uID0gVkVSU0lPTl8xOwotCWUgPSBsb2FkX2ltYWdlKCZibDMwX21lbV9pbmZvLAotCQkgICAgICAgQkwzMF9JTUFHRV9OQU1FLAotCQkgICAgICAgQkwzMF9CQVNFLAotCQkgICAgICAgJmJsMzBfaW1hZ2VfaW5mbywKLQkJICAgICAgIE5VTEwpOworCWUgPSBsb2FkX2F1dGhfaW1hZ2UoJmJsMzBfbWVtX2luZm8sCisJCQkgICAgQkwzMF9JTUFHRV9JRCwKKwkJCSAgICBCTDMwX0JBU0UsCisJCQkgICAgJmJsMzBfaW1hZ2VfaW5mbywKKwkJCSAgICBOVUxMKTsKIAotCWlmIChlKQotCQlyZXR1cm4gZTsKLQotI2lmIFRSVVNURURfQk9BUkRfQk9PVAotCWUgPSBhdXRoX3ZlcmlmeV9vYmooQVVUSF9CTDMwX0lNRywKLQkJCWJsMzBfaW1hZ2VfaW5mby5pbWFnZV9iYXNlLAotCQkJYmwzMF9pbWFnZV9pbmZvLmltYWdlX3NpemUpOwotCWlmIChlKSB7Ci0JCUVSUk9SKCJGYWlsZWQgdG8gYXV0aGVudGljYXRlIEJMMy0wIGltYWdlLlxuIik7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qIEFmdGVyIHdvcmtpbmcgd2l0aCBkYXRhLCBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlICovCi0JaW52X2RjYWNoZV9yYW5nZShibDMwX2ltYWdlX2luZm8uaW1hZ2VfYmFzZSwKLQkJCShzaXplX3QpYmwzMF9pbWFnZV9pbmZvLmltYWdlX3NpemUpOwotI2VuZGlmIC8qIFRSVVNURURfQk9BUkRfQk9PVCAqLwotCi0JLyogVGhlIHN1YnNlcXVlbnQgaGFuZGxpbmcgb2YgQkwzLTAgaXMgcGxhdGZvcm0gc3BlY2lmaWMgKi8KLQllID0gYmwyX3BsYXRfaGFuZGxlX2JsMzAoJmJsMzBfaW1hZ2VfaW5mbyk7Ci0JaWYgKGUpIHsKLQkJRVJST1IoIkZhaWx1cmUgaW4gcGxhdGZvcm0tc3BlY2lmaWMgaGFuZGxpbmcgb2YgQkwzLTAgaW1hZ2UuXG4iKTsKLQkJcmV0dXJuIGU7CisJaWYgKGUgPT0gMCkgeworCQkvKiBUaGUgc3Vic2VxdWVudCBoYW5kbGluZyBvZiBCTDMtMCBpcyBwbGF0Zm9ybSBzcGVjaWZpYyAqLworCQllID0gYmwyX3BsYXRfaGFuZGxlX2JsMzAoJmJsMzBfaW1hZ2VfaW5mbyk7CisJCWlmIChlKSB7CisJCQlFUlJPUigiRmFpbHVyZSBpbiBwbGF0Zm9ybS1zcGVjaWZpYyBoYW5kbGluZyBvZiBCTDMtMCBpbWFnZS5cbiIpOworCQl9CiAJfQogI2VuZGlmIC8qIEJMMzBfQkFTRSAqLwogCkBAIC0yNTYsMzEgKzEwNSwxNyBAQAogCWJsMzFfZXBfaW5mby0+YXJncy5hcmcwID0gKHVuc2lnbmVkIGxvbmcpYmwyX3RvX2JsMzFfcGFyYW1zOwogCiAJLyogTG9hZCB0aGUgQkwzLTEgaW1hZ2UgKi8KLQllID0gbG9hZF9pbWFnZShibDJfdHpyYW1fbGF5b3V0LAotCQkgICAgICAgQkwzMV9JTUFHRV9OQU1FLAotCQkgICAgICAgQkwzMV9CQVNFLAotCQkgICAgICAgYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMxX2ltYWdlX2luZm8sCi0JCSAgICAgICBibDMxX2VwX2luZm8pOwotCWlmIChlKQotCQlyZXR1cm4gZTsKKwllID0gbG9hZF9hdXRoX2ltYWdlKGJsMl90enJhbV9sYXlvdXQsCisJCQkgICAgQkwzMV9JTUFHRV9JRCwKKwkJCSAgICBCTDMxX0JBU0UsCisJCQkgICAgYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMxX2ltYWdlX2luZm8sCisJCQkgICAgYmwzMV9lcF9pbmZvKTsKIAotI2lmIFRSVVNURURfQk9BUkRfQk9PVAotCWUgPSBhdXRoX3ZlcmlmeV9vYmooQVVUSF9CTDMxX0lNRywKLQkJCSAgICBibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzFfaW1hZ2VfaW5mby0+aW1hZ2VfYmFzZSwKLQkJCSAgICBibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzFfaW1hZ2VfaW5mby0+aW1hZ2Vfc2l6ZSk7Ci0JaWYgKGUpIHsKLQkJRVJST1IoIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgQkwzLTEgaW1hZ2UuXG4iKTsKLQkJcmV0dXJuIGU7CisJaWYgKGUgPT0gMCkgeworCQlibDJfcGxhdF9zZXRfYmwzMV9lcF9pbmZvKGJsMl90b19ibDMxX3BhcmFtcy0+YmwzMV9pbWFnZV9pbmZvLAorCQkJCQkgIGJsMzFfZXBfaW5mbyk7CiAJfQogCi0JLyogQWZ0ZXIgd29ya2luZyB3aXRoIGRhdGEsIGludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgKi8KLQlpbnZfZGNhY2hlX3JhbmdlKGJsMl90b19ibDMxX3BhcmFtcy0+YmwzMV9pbWFnZV9pbmZvLT5pbWFnZV9iYXNlLAotCQkJKHNpemVfdClibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzFfaW1hZ2VfaW5mby0+aW1hZ2Vfc2l6ZSk7Ci0jZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCi0KLQlibDJfcGxhdF9zZXRfYmwzMV9lcF9pbmZvKGJsMl90b19ibDMxX3BhcmFtcy0+YmwzMV9pbWFnZV9pbmZvLAotCQkJCSAgYmwzMV9lcF9pbmZvKTsKLQogCXJldHVybiBlOwogfQogCkBAIC0zMDgsMzcgKzE0MywxNyBAQAogCSAqIGNvbXBsZXRlbHkgZGlmZmVyZW50IG1lbW9yeS4KIAkgKi8KIAlibDJfcGxhdF9nZXRfYmwzMl9tZW1pbmZvKCZibDMyX21lbV9pbmZvKTsKLQllID0gbG9hZF9pbWFnZSgmYmwzMl9tZW1faW5mbywKLQkJICAgICAgIEJMMzJfSU1BR0VfTkFNRSwKLQkJICAgICAgIEJMMzJfQkFTRSwKLQkJICAgICAgIGJsMl90b19ibDMxX3BhcmFtcy0+YmwzMl9pbWFnZV9pbmZvLAotCQkgICAgICAgYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMyX2VwX2luZm8pOworCWUgPSBsb2FkX2F1dGhfaW1hZ2UoJmJsMzJfbWVtX2luZm8sCisJCQkgICAgQkwzMl9JTUFHRV9JRCwKKwkJCSAgICBCTDMyX0JBU0UsCisJCQkgICAgYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMyX2ltYWdlX2luZm8sCisJCQkgICAgYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMyX2VwX2luZm8pOwogCi0JaWYgKGUpCi0JCXJldHVybiBlOwotCi0jaWYgVFJVU1RFRF9CT0FSRF9CT09UCi0JLyogSW1hZ2UgaXMgcHJlc2VudC4gQ2hlY2sgaWYgdGhlcmUgaXMgYSB2YWxpZCBjZXJ0aWZpY2F0ZSAqLwotCWlmIChibDMyX2NlcnRfZXJyb3IpIHsKLQkJRVJST1IoIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgQkwzLTIgY2VydGlmaWNhdGVzLlxuIik7Ci0JCXJldHVybiBibDMyX2NlcnRfZXJyb3I7CisJaWYgKGUgPT0gMCkgeworCQlibDJfcGxhdF9zZXRfYmwzMl9lcF9pbmZvKAorCQkJYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMyX2ltYWdlX2luZm8sCisJCQlibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzJfZXBfaW5mbyk7CiAJfQotCi0JZSA9IGF1dGhfdmVyaWZ5X29iaihBVVRIX0JMMzJfSU1HLAotCQkJICAgIGJsMl90b19ibDMxX3BhcmFtcy0+YmwzMl9pbWFnZV9pbmZvLT5pbWFnZV9iYXNlLAotCQkJICAgIGJsMl90b19ibDMxX3BhcmFtcy0+YmwzMl9pbWFnZV9pbmZvLT5pbWFnZV9zaXplKTsKLQlpZiAoZSkgewotCQlFUlJPUigiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBCTDMtMiBpbWFnZS5cbiIpOwotCQlyZXR1cm4gZTsKLQl9Ci0JLyogQWZ0ZXIgd29ya2luZyB3aXRoIGRhdGEsIGludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgKi8KLQlpbnZfZGNhY2hlX3JhbmdlKGJsMl90b19ibDMxX3BhcmFtcy0+YmwzMl9pbWFnZV9pbmZvLT5pbWFnZV9iYXNlLAotCQkJKHNpemVfdClibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzJfaW1hZ2VfaW5mby0+aW1hZ2Vfc2l6ZSk7Ci0jZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCi0KLQlibDJfcGxhdF9zZXRfYmwzMl9lcF9pbmZvKAotCQlibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzJfaW1hZ2VfaW5mbywKLQkJYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMyX2VwX2luZm8pOwogI2VuZGlmIC8qIEJMMzJfQkFTRSAqLwogCiAJcmV0dXJuIGU7CkBAIC0zNjEsMzAgKzE3NiwxNiBAQAogCWJsMl9wbGF0X2dldF9ibDMzX21lbWluZm8oJmJsMzNfbWVtX2luZm8pOwogCiAJLyogTG9hZCB0aGUgQkwzLTMgaW1hZ2UgaW4gbm9uLXNlY3VyZSBtZW1vcnkgcHJvdmlkZWQgYnkgdGhlIHBsYXRmb3JtICovCi0JZSA9IGxvYWRfaW1hZ2UoJmJsMzNfbWVtX2luZm8sCi0JCSAgICAgICBCTDMzX0lNQUdFX05BTUUsCi0JCSAgICAgICBwbGF0X2dldF9uc19pbWFnZV9lbnRyeXBvaW50KCksCi0JCSAgICAgICBibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzNfaW1hZ2VfaW5mbywKLQkJICAgICAgIGJsMl90b19ibDMxX3BhcmFtcy0+YmwzM19lcF9pbmZvKTsKKwllID0gbG9hZF9hdXRoX2ltYWdlKCZibDMzX21lbV9pbmZvLAorCQkJICAgIEJMMzNfSU1BR0VfSUQsCisJCQkgICAgcGxhdF9nZXRfbnNfaW1hZ2VfZW50cnlwb2ludCgpLAorCQkJICAgIGJsMl90b19ibDMxX3BhcmFtcy0+YmwzM19pbWFnZV9pbmZvLAorCQkJICAgIGJsMl90b19ibDMxX3BhcmFtcy0+YmwzM19lcF9pbmZvKTsKIAotCWlmIChlKQotCQlyZXR1cm4gZTsKLQotI2lmIFRSVVNURURfQk9BUkRfQk9PVAotCWUgPSBhdXRoX3ZlcmlmeV9vYmooQVVUSF9CTDMzX0lNRywKLQkJCSAgICBibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzNfaW1hZ2VfaW5mby0+aW1hZ2VfYmFzZSwKLQkJCSAgICBibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzNfaW1hZ2VfaW5mby0+aW1hZ2Vfc2l6ZSk7Ci0JaWYgKGUpIHsKLQkJRVJST1IoIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgQkwzLTMgaW1hZ2UuXG4iKTsKLQkJcmV0dXJuIGU7CisJaWYgKGUgPT0gMCkgeworCQlibDJfcGxhdF9zZXRfYmwzM19lcF9pbmZvKGJsMl90b19ibDMxX3BhcmFtcy0+YmwzM19pbWFnZV9pbmZvLAorCQkJCQkgIGJsMl90b19ibDMxX3BhcmFtcy0+YmwzM19lcF9pbmZvKTsKIAl9Ci0JLyogQWZ0ZXIgd29ya2luZyB3aXRoIGRhdGEsIGludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgKi8KLQlpbnZfZGNhY2hlX3JhbmdlKGJsMl90b19ibDMxX3BhcmFtcy0+YmwzM19pbWFnZV9pbmZvLT5pbWFnZV9iYXNlLAotCQkJKHNpemVfdClibDJfdG9fYmwzMV9wYXJhbXMtPmJsMzNfaW1hZ2VfaW5mby0+aW1hZ2Vfc2l6ZSk7Ci0jZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCi0KLQlibDJfcGxhdF9zZXRfYmwzM19lcF9pbmZvKGJsMl90b19ibDMxX3BhcmFtcy0+YmwzM19pbWFnZV9pbmZvLAotCQkJCSAgYmwyX3RvX2JsMzFfcGFyYW1zLT5ibDMzX2VwX2luZm8pOwogCiAJcmV0dXJuIGU7CiB9CkBAIC00MDgsMTQgKzIwOSw3IEBACiAKICNpZiBUUlVTVEVEX0JPQVJEX0JPT1QKIAkvKiBJbml0aWFsaXplIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSAqLwotCWF1dGhfaW5pdCgpOwotCi0JLyogVmFsaWRhdGUgdGhlIGNlcnRpZmljYXRlcyBpbnZvbHZlZCBpbiB0aGUgQ2hhaW4gb2YgVHJ1c3QgKi8KLQllID0gbG9hZF9jZXJ0cygpOwotCWlmIChlKSB7Ci0JCUVSUk9SKCJDaGFpbiBvZiBUcnVzdCBpbnZhbGlkLiBBYm9ydGluZy4uLlxuIik7Ci0JCXBhbmljKCk7Ci0JfQorCWF1dGhfbW9kX2luaXQoKTsKICNlbmRpZiAvKiBUUlVTVEVEX0JPQVJEX0JPT1QgKi8KIAogCS8qCmRpZmYgLS1naXQgYS9ibDMxL2FhcmNoNjQvYmwzMV9lbnRyeXBvaW50LlMgYi9ibDMxL2FhcmNoNjQvYmwzMV9lbnRyeXBvaW50LlMKaW5kZXggMTc3N2QyNi4uNWJhMGY5YyAxMDA2NDQKLS0tIGEvYmwzMS9hYXJjaDY0L2JsMzFfZW50cnlwb2ludC5TCisrKyBiL2JsMzEvYWFyY2g2NC9ibDMxX2VudHJ5cG9pbnQuUwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBBUk0gTGltaXRlZCBhbmQgQ29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CkBAIC0yOSw4ICsyOSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGFyY2guaD4KLSNpbmNsdWRlIDxhc21fbWFjcm9zLlM+CiAjaW5jbHVkZSA8YmxfY29tbW9uLmg+CisjaW5jbHVkZSA8ZWwzX2NvbW1vbl9tYWNyb3MuUz4KIAogCS5nbG9ibAlibDMxX2VudHJ5cG9pbnQKIApAQCAtNDIsMTU0ICs0Miw2OCBAQAogCSAqLwogCiBmdW5jIGJsMzFfZW50cnlwb2ludAorI2lmICFSRVNFVF9UT19CTDMxCiAJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICogUHJlY2VkaW5nIGJvb3Rsb2FkZXIgaGFzIHBvcHVsYXRlZCB4MCB3aXRoIGEgcG9pbnRlciB0byBhCiAJICogJ2JsMzFfcGFyYW1zJyBzdHJ1Y3R1cmUgJiB4MSB3aXRoIGEgcG9pbnRlciB0byBwbGF0Zm9ybQogCSAqIHNwZWNpZmljIHN0cnVjdHVyZQogCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqLwotI2lmICFSRVNFVF9UT19CTDMxCiAJbW92CXgyMCwgeDAKIAltb3YJeDIxLCB4MQotI2Vsc2UKLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBTZXQgdGhlIENQVSBlbmRpYW5uZXNzIGJlZm9yZSBkb2luZyBhbnl0aGluZwotCSAqIHRoYXQgbWlnaHQgaW52b2x2ZSBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzLgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCW1ycwl4MCwgc2N0bHJfZWwzCi0JYmljCXgwLCB4MCwgI1NDVExSX0VFX0JJVAotCW1zcglzY3Rscl9lbDMsIHgwCi0JaXNiCi0jZW5kaWYKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFdoZW4gUkVTRVRfVE9fQkwzMSBpcyB0cnVlLCBwZXJmb3JtIGFueQotCSAqIHByb2Nlc3NvciBzcGVjaWZpYyBhY3Rpb25zIHVwb24gcmVzZXQgZS5nLgotCSAqIGNhY2hlLCB0bGIgaW52YWxpZGF0aW9ucywgZXJyYXRhIHdvcmthcm91bmRzCi0JICogZXRjLgotCSAqIFdoZW4gUkVTRVRfVE9fQkwzMSBpcyBmYWxzZSwgcGVyZm9ybSBhbnkKLQkgKiBwcm9jZXNzb3Igc3BlY2lmaWMgYWN0aW9ucyB3aGljaCB1bmRvIG9yIGFyZQotCSAqIGluIGFkZGl0aW9uIHRvIHRoZSBhY3Rpb25zIHBlcmZvcm1lZCBieSB0aGUKLQkgKiByZXNldCBoYW5kbGVyIGluIHRoZSBCb290IFJPTSAoQkwxKS4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlibAlyZXNldF9oYW5kbGVyCi0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBFbmFibGUgdGhlIGluc3RydWN0aW9uIGNhY2hlLCBzdGFjayBwb2ludGVyCi0JICogYW5kIGRhdGEgYWNjZXNzIGFsaWdubWVudCBjaGVja3MKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQltb3YJeDEsICMoU0NUTFJfSV9CSVQgfCBTQ1RMUl9BX0JJVCB8IFNDVExSX1NBX0JJVCkKLQltcnMJeDAsIHNjdGxyX2VsMwotCW9ycgl4MCwgeDAsIHgxCi0JbXNyCXNjdGxyX2VsMywgeDAKLQlpc2IKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIEluaXRpYWxpc2UgY3B1X2RhdGEgZWFybHkgdG8gZW5hYmxlIGNyYXNoCi0JICogcmVwb3J0aW5nIHRvIGhhdmUgYWNjZXNzIHRvIGNyYXNoIHN0YWNrLgotCSAqIFNpbmNlIGNyYXNoIHJlcG9ydGluZyBkZXBlbmRzIG9uIGNwdV9kYXRhIHRvCi0JICogcmVwb3J0IHRoZSB1bmhhbmRsZWQgZXhjZXB0aW9uLCBub3QKLQkgKiBkb2luZyBzbyBjYW4gbGVhZCB0byByZWN1cnNpdmUgZXhjZXB0aW9ucyBkdWUKLQkgKiB0byBhIE5VTEwgVFBJRFJfRUwzCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JYmwJaW5pdF9jcHVfZGF0YV9wdHIKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFNldCB0aGUgZXhjZXB0aW9uIHZlY3Rvci4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlhZHIJeDEsIHJ1bnRpbWVfZXhjZXB0aW9ucwotCW1zcgl2YmFyX2VsMywgeDEKLQlpc2IKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIEVuYWJsZSB0aGUgU0Vycm9yIGludGVycnVwdCBub3cgdGhhdCB0aGUKLQkgKiBleGNlcHRpb24gdmVjdG9ycyBoYXZlIGJlZW4gc2V0dXAuCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JbXNyCWRhaWZjbHIsICNEQUlGX0FCVF9CSVQKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBBcmNoaXRlY3R1cmFsIGZlYXR1cmUgdHJhcCByZWdpc3RlcgotCSAqIChDUFRSX0VMMykgaXMgdW5rbm93biBhbmQgaXQgbXVzdCBiZSBzZXQgdG8gYSBrbm93biBzdGF0ZS4gQWxsCi0JICogZmVhdHVyZSB0cmFwcyBhcmUgZGlzYWJsZWQuIFNvbWUgYml0cyBpbiB0aGlzIHJlZ2lzdGVyIGFyZSBtYXJrZWQgYXMKLQkgKiBSZXNlcnZlZCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KKwkgKiBGb3IgIVJFU0VUX1RPX0JMMzEgc3lzdGVtcywgb25seSB0aGUgcHJpbWFyeSBDUFUgZXZlciByZWFjaGVzCisJICogYmwzMV9lbnRyeXBvaW50KCkgZHVyaW5nIHRoZSBjb2xkIGJvb3QgZmxvdywgc28gdGhlIGNvbGQvd2FybSBib290CisJICogYW5kIHByaW1hcnkvc2Vjb25kYXJ5IENQVSBsb2dpYyBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIGluIHRoaXMgY2FzZS4KIAkgKgotCSAqIENQVFJfRUwzLlRDUEFDOiBUaGlzIGNhdXNlcyBhIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIENQQUNSX0VMMSBmcm9tIEVMMQotCSAqICBvciB0aGUgQ1BUUl9FTDIgZnJvbSBFTDIgdG8gdHJhcCB0byBFTDMgdW5sZXNzIGl0IGlzIHRyYXBwZWQgYXQgRUwyLgotCSAqIENQVFJfRUwzLlRUQTogVGhpcyBjYXVzZXMgYWNjZXNzIHRvIHRoZSBUcmFjZSBmdW5jdGlvbmFsaXR5IHRvIHRyYXAKLQkgKiAgdG8gRUwzIHdoZW4gZXhlY3V0ZWQgZnJvbSBFTDAsIEVMMSwgRUwyLCBvciBFTDMuIElmIHN5c3RlbSByZWdpc3RlcgotCSAqICBhY2Nlc3MgdG8gdHJhY2UgZnVuY3Rpb25hbGl0eSBpcyBub3Qgc3VwcG9ydGVkLCB0aGlzIGJpdCBpcyBSRVMwLgotCSAqIENQVFJfRUwzLlRGUDogVGhpcyBjYXVzZXMgaW5zdHJ1Y3Rpb25zIHRoYXQgYWNjZXNzIHRoZSByZWdpc3RlcnMKLQkgKiAgYXNzb2NpYXRlZCB3aXRoIEZsb2F0aW5nIFBvaW50IGFuZCBBZHZhbmNlZCBTSU1EIGV4ZWN1dGlvbiB0byB0cmFwCi0JICogIHRvIEVMMyB3aGVuIGV4ZWN1dGVkIGZyb20gYW55IGV4Y2VwdGlvbiBsZXZlbCwgdW5sZXNzIHRyYXBwZWQgdG8gRUwxCi0JICogIG9yIEVMMi4KKwkgKiBBbHNvLCBhc3N1bWUgdGhhdCB0aGUgcHJldmlvdXMgYm9vdGxvYWRlciBoYXMgYWxyZWFkeSBzZXQgdXAgdGhlIENQVQorCSAqIGVuZGlhbm5lc3MgYW5kIGhhcyBpbml0aWFsaXNlZCB0aGUgbWVtb3J5LgogCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqLwotCW1ycwl4MSwgY3B0cl9lbDMKLQliaWMJdzEsIHcxLCAjVENQQUNfQklUCi0JYmljCXcxLCB3MSwgI1RUQV9CSVQKLQliaWMJdzEsIHcxLCAjVEZQX0JJVAotCW1zcgljcHRyX2VsMywgeDEKKwllbDNfZW50cnlwb2ludF9jb21tb24JCQkJCVwKKwkJX3NldF9lbmRpYW49MAkJCQkJXAorCQlfd2FybV9ib290X21haWxib3g9MAkJCQlcCisJCV9zZWNvbmRhcnlfY29sZF9ib290PTAJCQkJXAorCQlfaW5pdF9tZW1vcnk9MAkJCQkJXAorCQlfaW5pdF9jX3J1bnRpbWU9MQkJCQlcCisJCV9leGNlcHRpb25fdmVjdG9ycz1ydW50aW1lX2V4Y2VwdGlvbnMKIAotI2lmIFJFU0VUX1RPX0JMMzEKLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogV2lsbCBub3QgcmV0dXJuIGZyb20gdGhpcyBtYWNybyBpZiBpdCBpcyBhIHdhcm0gYm9vdC4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUmVsYXkgdGhlIHByZXZpb3VzIGJvb3Rsb2FkZXIncyBhcmd1bWVudHMgdG8gdGhlIHBsYXRmb3JtIGxheWVyCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICovCi0Jd2FpdF9mb3JfZW50cnlwb2ludAotCWJsCXBsYXRmb3JtX21lbV9pbml0Ci0jZW5kaWYKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFplcm8gb3V0IE5PQklUUyBzZWN0aW9ucy4gVGhlcmUgYXJlIDIgb2YgdGhlbToKLQkgKiAgIC0gdGhlIC5ic3Mgc2VjdGlvbjsKLQkgKiAgIC0gdGhlIGNvaGVyZW50IG1lbW9yeSBzZWN0aW9uLgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCW1vdgl4MCwgeDIwCisJbW92CXgxLCB4MjEKKyNlbHNlCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogRm9yIFJFU0VUX1RPX0JMMzEgc3lzdGVtcyB3aGljaCBoYXZlIGEgcHJvZ3JhbW1hYmxlIHJlc2V0IGFkZHJlc3MsCisJICogYmwzMV9lbnRyeXBvaW50KCkgaXMgZXhlY3V0ZWQgb25seSBvbiB0aGUgY29sZCBib290IHBhdGggc28gd2UgY2FuCisJICogc2tpcCB0aGUgd2FybSBib290IG1haWxib3ggbWVjaGFuaXNtLgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqLwotCWxkcgl4MCwgPV9fQlNTX1NUQVJUX18KLQlsZHIJeDEsID1fX0JTU19TSVpFX18KLQlibAl6ZXJvbWVtMTYKKwllbDNfZW50cnlwb2ludF9jb21tb24JCQkJCVwKKwkJX3NldF9lbmRpYW49MQkJCQkJXAorCQlfd2FybV9ib290X21haWxib3g9IVBST0dSQU1NQUJMRV9SRVNFVF9BRERSRVNTCVwKKwkJX3NlY29uZGFyeV9jb2xkX2Jvb3Q9MQkJCQlcCisJCV9pbml0X21lbW9yeT0xCQkJCQlcCisJCV9pbml0X2NfcnVudGltZT0xCQkJCVwKKwkJX2V4Y2VwdGlvbl92ZWN0b3JzPXJ1bnRpbWVfZXhjZXB0aW9ucwogCi0jaWYgVVNFX0NPSEVSRU5UX01FTQotCWxkcgl4MCwgPV9fQ09IRVJFTlRfUkFNX1NUQVJUX18KLQlsZHIJeDEsID1fX0NPSEVSRU5UX1JBTV9VTkFMSUdORURfU0laRV9fCi0JYmwJemVyb21lbTE2Ci0jZW5kaWYKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFVzZSBTUF9FTDAgZm9yIHRoZSBDIHJ1bnRpbWUgc3RhY2suCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogRm9yIFJFU0VUX1RPX0JMMzEgc3lzdGVtcywgQkwzLTEgaXMgdGhlIGZpcnN0IGJvb3Rsb2FkZXIgdG8gcnVuIHNvCisJICogdGhlcmUncyBubyBhcmd1bWVudCB0byByZWxheSBmcm9tIGEgcHJldmlvdXMgYm9vdGxvYWRlci4gWmVybyB0aGUKKwkgKiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBwbGF0Zm9ybSBsYXllciB0byByZWZsZWN0IHRoYXQuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICovCi0JbXNyCXNwc2VsLCAjMAotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBBbGxvY2F0ZSBhIHN0YWNrIHdob3NlIG1lbW9yeSB3aWxsIGJlIG1hcmtlZAotCSAqIGFzIE5vcm1hbC1JUy1XQldBIHdoZW4gdGhlIE1NVSBpcyBlbmFibGVkLgotCSAqIFRoZXJlIGlzIG5vIHJpc2sgb2YgcmVhZGluZyBzdGFsZSBzdGFjawotCSAqIG1lbW9yeSBhZnRlciBlbmFibGluZyB0aGUgTU1VIGFzIG9ubHkgdGhlCi0JICogcHJpbWFyeSBjcHUgaXMgcnVubmluZyBhdCB0aGUgbW9tZW50LgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JbXJzCXgwLCBtcGlkcl9lbDEKLQlibAlwbGF0Zm9ybV9zZXRfc3RhY2sKKwltb3YJeDAsIDAKKwltb3YJeDEsIDAKKyNlbmRpZiAvKiBSRVNFVF9UT19CTDMxICovCiAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgKiBQZXJmb3JtIHBsYXRmb3JtIHNwZWNpZmljIGVhcmx5IGFyY2guIHNldHVwCiAJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICovCi0jaWYgUkVTRVRfVE9fQkwzMQotCW1vdgl4MCwgMAotCW1vdgl4MSwgMAotI2Vsc2UKLQltb3YJeDAsIHgyMAotCW1vdgl4MSwgeDIxCi0jZW5kaWYKLQogCWJsCWJsMzFfZWFybHlfcGxhdGZvcm1fc2V0dXAKIAlibAlibDMxX3BsYXRfYXJjaF9zZXR1cAogCmRpZmYgLS1naXQgYS9jb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbC5jIGIvY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5OWY1MC4uMDAwMDAwMAotLS0gYS9jb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEFSTSBMaW1pdGVkIGFuZCBDb250cmlidXRvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQVJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZAotICogdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKLSAqIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiBBdXRoZW50aWNhdGlvbiBtb2R1bGUgYmFzZWQgb24gUG9sYXJTU0wgKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8YXV0aC5oPgotI2luY2x1ZGUgPGRlYnVnLmg+Ci0jaW5jbHVkZSA8cGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxwbGF0Zm9ybV9kZWYuaD4KLSNpbmNsdWRlIDxwbGF0Zm9ybV9vaWQuaD4KLQotI2luY2x1ZGUgPHBvbGFyc3NsL21lbW9yeV9idWZmZXJfYWxsb2MuaD4KLSNpbmNsdWRlIDxwb2xhcnNzbC9vaWQuaD4KLSNpbmNsdWRlIDxwb2xhcnNzbC9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPHBvbGFyc3NsL3NoYTI1Ni5oPgotI2luY2x1ZGUgPHBvbGFyc3NsL3g1MDlfY3J0Lmg+Ci0KLS8qCi0gKiBBdCBlYWNoIGF1dGhlbnRpY2F0aW9uIHN0YWdlLCB0aGUgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvciBleHRyYWN0aW5nIGFuZAotICogc3RvcmluZyB0aG9zZSBlbGVtZW50cyAoa2V5cywgaGFzaGVzLCBldGMuKSB0aGF0IHdpbGwgYmUgbmVlZGVkIGxhdGVyIG9uCi0gKiBkdXJpbmcgdGhlIFRydXN0ZWQgQm9vdCBwcm9jZXNzLgotICovCi0KLS8qIFNIQTI1NiBhbGdvcml0aG0gKi8KLSNkZWZpbmUgU0hBX0JZVEVTCQkJMzIKLQotLyoKLSAqIEFuIDggS0Igc3RhY2sgaGFzIGJlZW4gcHJvdmVuIHRvIGJlIGVub3VnaCBmb3IgdGhlIGN1cnJlbnQgVHJ1c3RlZCBCb290Ci0gKiBwcm9jZXNzCi0gKi8KLSNkZWZpbmUgUE9MQVJTU0xfSEVBUF9TSVpFCQkoOCoxMDI0KQotc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhcFtQT0xBUlNTTF9IRUFQX1NJWkVdOwotCi0vKgotICogUlNBIHB1YmxpYyBrZXlzOgotICogIFN1YmplY3RQdWJsaWNLZXlJbmZvICA6Oj0gIFNFUVVFTkNFICB7ICAgICAgICAgIDEgKyAzCi0gKiAgICAgICBhbGdvcml0aG0gICAgICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVyLCAgMSArIDEgKHNlcXVlbmNlKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEgKyAxICsgOSAocnNhIG9pZCkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxICsgMSAocGFyYW1zIG51bGwpCi0gKiAgICAgICBzdWJqZWN0UHVibGljS2V5ICAgICBCSVQgU1RSSU5HIH0gICAgICAgICAgMSArIDMgKyAoMSArIGJlbG93KQotICogIFJTQVB1YmxpY0tleSA6Oj0gU0VRVUVOQ0UgeyAgICAgICAgICAgICAgICAgICAgIDEgKyAzCi0gKiAgICAgIG1vZHVsdXMgICAgICAgICAgIElOVEVHRVIsICAtLSBuICAgICAgICAgICAgMSArIDMgKyBNUElfTUFYICsgMQotICogICAgICBwdWJsaWNFeHBvbmVudCAgICBJTlRFR0VSICAgLS0gZSAgICAgICAgICAgIDEgKyAzICsgTVBJX01BWCArIDEKLSAqICB9Ci0gKgotICogUE9MQVJTU0xfTVBJX01BWF9TSVpFIGlzIHNldCB0byAyNTYgYnl0ZXMgKFJTQS0yMDQ4IGJpdCBrZXlzKSBpbiB0aGUKLSAqIGNvbmZpZ3VyYXRpb24gZmlsZQotICovCi0jZGVmaW5lIFJTQV9QVUJfREVSX01BWF9CWVRFUyAgIDM4ICsgMiAqIFBPTEFSU1NMX01QSV9NQVhfU0laRQotCi0vKgotICogQnVmZmVyIGZvciBzdG9yaW5nIHB1YmxpYyBrZXlzIGV4dHJhY3RlZCBmcm9tIGNlcnRpZmljYXRlcyB3aGlsZSB0aGV5IGFyZQotICogdmVyaWZpZWQKLSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGtfYnVmW1JTQV9QVUJfREVSX01BWF9CWVRFU107Ci0KLS8qIFdlIHVzZSB0aGlzIHZhcmlhYmxlIHRvIHBhcnNlIGFuZCBhdXRoZW50aWNhdGUgdGhlIGNlcnRpZmljYXRlcyAqLwotc3RhdGljIHg1MDlfY3J0IGNlcnQ7Ci0KLS8qIEJMIHNwZWNpZmljIHZhcmlhYmxlcyAqLwotI2lmIElNQUdFX0JMMQotc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hhX2JsMltTSEFfQllURVNdOwotI2VsaWYgSU1BR0VfQkwyCi0vKiBCdWZmZXJzIHRvIHN0b3JlIHRoZSBoYXNoIG9mIEJMMy14IGltYWdlcyAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hhX2JsMzBbU0hBX0JZVEVTXTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYV9ibDMxW1NIQV9CWVRFU107Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBzaGFfYmwzMltTSEFfQllURVNdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgc2hhX2JsMzNbU0hBX0JZVEVTXTsKLS8qIEJ1ZmZlcnMgdG8gc3RvcmUgdGhlIFRydXN0ZWQgYW5kIE5vbi1UcnVzdGVkIHdvcmxkIHB1YmxpYyBrZXlzICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciB0el93b3JsZF9wa1tSU0FfUFVCX0RFUl9NQVhfQllURVNdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgbnR6X3dvcmxkX3BrW1JTQV9QVUJfREVSX01BWF9CWVRFU107Ci1zdGF0aWMgc2l6ZV90IHR6X3dvcmxkX3BrX2xlbiwgbnR6X3dvcmxkX3BrX2xlbjsKLS8qIEJ1ZmZlciB0byBzdG9yZSB0aGUgQkwzLXggcHVibGljIGtleXMgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvbnRlbnRfcGtbUlNBX1BVQl9ERVJfTUFYX0JZVEVTXTsKLXN0YXRpYyBzaXplX3QgY29udGVudF9wa19sZW47Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IHg1MDlfZ2V0X2NydF9leHRfZGF0YShjb25zdCB1bnNpZ25lZCBjaGFyICoqZXh0X2RhdGEsCi0JCQkJIHNpemVfdCAqZXh0X2xlbiwKLQkJCQkgeDUwOV9jcnQgKmNydCwKLQkJCQkgY29uc3QgY2hhciAqb2lkKQotewotCWludCByZXQ7Ci0Jc2l6ZV90IGxlbjsKLQl1bnNpZ25lZCBjaGFyICplbmRfZXh0X2RhdGEsICplbmRfZXh0X29jdGV0OwotCXVuc2lnbmVkIGNoYXIgKnA7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqZW5kOwotCWNoYXIgb2lkX3N0cls2NF07Ci0KLQlwID0gY3J0LT52M19leHQucDsKLQllbmQgPSBjcnQtPnYzX2V4dC5wICsgY3J0LT52M19leHQubGVuOwotCi0JcmV0ID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiBQT0xBUlNTTF9FUlJfWDUwOV9JTlZBTElEX0VYVEVOU0lPTlMgKyByZXQ7Ci0KLQlpZiAoZW5kICE9IHAgKyBsZW4pCi0JCXJldHVybiBQT0xBUlNTTF9FUlJfWDUwOV9JTlZBTElEX0VYVEVOU0lPTlMgKwotCQkJCVBPTEFSU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSDsKLQotCXdoaWxlIChwIDwgZW5kKSB7Ci0JCS8qCi0JCSAqIEV4dGVuc2lvbiAgOjo9ICBTRVFVRU5DRSAgewotCQkgKiAgICAgIGV4dG5JRCAgICAgIE9CSkVDVCBJREVOVElGSUVSLAotCQkgKiAgICAgIGNyaXRpY2FsICAgIEJPT0xFQU4gREVGQVVMVCBGQUxTRSwKLQkJICogICAgICBleHRuVmFsdWUgICBPQ1RFVCBTVFJJTkcgIH0KLQkJICovCi0JCXg1MDlfYnVmIGV4dG5fb2lkID0gezAsIDAsIE5VTEx9OwotCQlpbnQgaXNfY3JpdGljYWwgPSAwOyAvKiBERUZBVUxUIEZBTFNFICovCi0KLQkJcmV0ID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sCi0JCQkJQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UpOwotCQlpZiAocmV0ICE9IDApCi0JCQlyZXR1cm4gUE9MQVJTU0xfRVJSX1g1MDlfSU5WQUxJRF9FWFRFTlNJT05TICsgcmV0OwotCi0JCWVuZF9leHRfZGF0YSA9IHAgKyBsZW47Ci0KLQkJLyogR2V0IGV4dGVuc2lvbiBJRCAqLwotCQlleHRuX29pZC50YWcgPSAqcDsKLQotCQlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmV4dG5fb2lkLmxlbiwgQVNOMV9PSUQpOwotCQlpZiAocmV0ICE9IDApCi0JCQlyZXR1cm4gUE9MQVJTU0xfRVJSX1g1MDlfSU5WQUxJRF9FWFRFTlNJT05TICsgcmV0OwotCi0JCWV4dG5fb2lkLnAgPSBwOwotCQlwICs9IGV4dG5fb2lkLmxlbjsKLQotCQlpZiAoKGVuZCAtIHApIDwgMSkKLQkJCXJldHVybiBQT0xBUlNTTF9FUlJfWDUwOV9JTlZBTElEX0VYVEVOU0lPTlMgKwotCQkJCQlQT0xBUlNTTF9FUlJfQVNOMV9PVVRfT0ZfREFUQTsKLQotCQkvKiBHZXQgb3B0aW9uYWwgY3JpdGljYWwgKi8KLQkJcmV0ID0gYXNuMV9nZXRfYm9vbCgmcCwgZW5kX2V4dF9kYXRhLCAmaXNfY3JpdGljYWwpOwotCQlpZiAocmV0ICE9IDAgJiYgKHJldCAhPSBQT0xBUlNTTF9FUlJfQVNOMV9VTkVYUEVDVEVEX1RBRykpCi0JCQlyZXR1cm4gUE9MQVJTU0xfRVJSX1g1MDlfSU5WQUxJRF9FWFRFTlNJT05TICsgcmV0OwotCi0JCS8qIERhdGEgc2hvdWxkIGJlIG9jdGV0IHN0cmluZyB0eXBlICovCi0JCXJldCA9IGFzbjFfZ2V0X3RhZygmcCwgZW5kX2V4dF9kYXRhLCAmbGVuLCBBU04xX09DVEVUX1NUUklORyk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXJldHVybiBQT0xBUlNTTF9FUlJfWDUwOV9JTlZBTElEX0VYVEVOU0lPTlMgKyByZXQ7Ci0KLQkJZW5kX2V4dF9vY3RldCA9IHAgKyBsZW47Ci0KLQkJaWYgKGVuZF9leHRfb2N0ZXQgIT0gZW5kX2V4dF9kYXRhKQotCQkJcmV0dXJuIFBPTEFSU1NMX0VSUl9YNTA5X0lOVkFMSURfRVhURU5TSU9OUyArCi0JCQkJCVBPTEFSU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSDsKLQotCQkvKiBEZXRlY3QgcmVxdWVzdGVkIGV4dGVuc2lvbiAqLwotCQlvaWRfZ2V0X251bWVyaWNfc3RyaW5nKG9pZF9zdHIsIDY0LCAmZXh0bl9vaWQpOwotCQlpZiAobWVtY21wKG9pZCwgb2lkX3N0ciwgc2l6ZW9mKG9pZCkpID09IDApIHsKLQkJCSpleHRfZGF0YSA9IHA7Ci0JCQkqZXh0X2xlbiA9IGxlbjsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLyogTmV4dCAqLwotCQlwID0gZW5kX2V4dF9vY3RldDsKLQl9Ci0KLQlpZiAocCAhPSBlbmQpCi0JCXJldHVybiBQT0xBUlNTTF9FUlJfWDUwOV9JTlZBTElEX0VYVEVOU0lPTlMgKwotCQkJCVBPTEFSU1NMX0VSUl9BU04xX0xFTkdUSF9NSVNNQVRDSDsKLQotCXJldHVybiBQT0xBUlNTTF9FUlJfWDUwOV9VTktOT1dOX09JRDsKLX0KLQotI2lmIElNQUdFX0JMMQotLyoKLSAqIFBhcnNlIGFuZCB2ZXJpZnkgdGhlIEJMMiBjZXJ0aWZpY2F0ZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIGludGVncml0eSBvZiB0aGUgQkwyIGNlcnRpZmljYXRlLCBjaGVja3MgdGhhdCBpdAotICogaGFzIGJlZW4gc2lnbmVkIHdpdGggdGhlIFJPVCBrZXkgYW5kIGV4dHJhY3RzIHRoZSBCTDIgaGFzaCBzdG9yZWQgaW4gdGhlCi0gKiBjZXJ0aWZpY2F0ZSBzbyBpdCBjYW4gYmUgbWF0Y2hlZCBsYXRlciBhZ2FpbnN0IHRoZSBjYWxjdWxhdGVkIGhhc2guCi0gKgotICogUmV0dXJuOiAwID0gc3VjY2VzcywgT3RoZXJ3aXNlID0gZXJyb3IKLSAqLwotc3RhdGljIGludCBjaGVja19ibDJfY2VydCh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcDsKLQlzaXplX3Qgc3o7Ci0JaW50IGVyciwgZmxhZ3M7Ci0KLQl4NTA5X2NydF9pbml0KCZjZXJ0KTsKLQotCS8qIFBhcnNlIHRoZSBCTDIgY2VydGlmaWNhdGUgKi8KLQllcnIgPSB4NTA5X2NydF9wYXJzZSgmY2VydCwgYnVmLCBsZW4pOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIkJMMiBjZXJ0aWZpY2F0ZSBwYXJzZSBlcnJvciAlZC5cbiIsIGVycik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogQ2hlY2sgdGhhdCBpdCBoYXMgYmVlbiBzaWduZWQgd2l0aCB0aGUgUk9UIGtleSAqLwotCWVyciA9IHBrX3dyaXRlX3B1YmtleV9kZXIoJmNlcnQucGssIHBrX2J1Ziwgc2l6ZW9mKHBrX2J1ZikpOwotCWlmIChlcnIgPCAwKSB7Ci0JCUVSUk9SKCJFcnJvciBsb2FkaW5nIFJPVCBrZXkgaW4gREVSIGZvcm1hdCAlZC5cbiIsIGVycik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0Jc3ogPSAoc2l6ZV90KWVycjsKLQlwID0gcGtfYnVmICsgc2l6ZW9mKHBrX2J1ZikgLSBzejsKLQotCWVyciA9IHBsYXRfbWF0Y2hfcm90cGsocCwgc3opOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIlJPVCBhbmQgQkwyIGNlcnRpZmljYXRlIGtleSBtaXNtYXRjaFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogVmVyaWZ5IGNlcnRpZmljYXRlICovCi0JZXJyID0geDUwOV9jcnRfdmVyaWZ5KCZjZXJ0LCAmY2VydCwgTlVMTCwgTlVMTCwgJmZsYWdzLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJCTDIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGVycm9yICVkLiBGbGFnczogMHgleC5cbiIsCi0JCQkJZXJyLCBmbGFncyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogRXh0cmFjdCBCTDIgaW1hZ2UgaGFzaCBmcm9tIGNlcnRpZmljYXRlICovCi0JZXJyID0geDUwOV9nZXRfY3J0X2V4dF9kYXRhKCZwLCAmc3osICZjZXJ0LCBCTDJfSEFTSF9PSUQpOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIkNhbm5vdCByZWFkIEJMMiBoYXNoIGZyb20gY2VydGlmaWNhdGVcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWFzc2VydChzeiA9PSBTSEFfQllURVMgKyAyKTsKLQotCS8qIFNraXAgdGhlIHRhZyBhbmQgbGVuZ3RoIGJ5dGVzIGFuZCBjb3B5IHRoZSBoYXNoICovCi0JcCArPSAyOwotCW1lbWNweShzaGFfYmwyLCBwLCBTSEFfQllURVMpOwotCi1lcnJvcjoKLQl4NTA5X2NydF9mcmVlKCZjZXJ0KTsKLQotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYgLyogSU1BR0VfQkwxICovCi0KLSNpZiBJTUFHRV9CTDIKLXN0YXRpYyBpbnQgY2hlY2tfdHJ1c3RlZF9rZXlfY2VydCh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcDsKLQlzaXplX3Qgc3o7Ci0JaW50IGVyciwgZmxhZ3M7Ci0KLQl4NTA5X2NydF9pbml0KCZjZXJ0KTsKLQotCS8qIFBhcnNlIHRoZSBUcnVzdGVkIEtleSBjZXJ0aWZpY2F0ZSAqLwotCWVyciA9IHg1MDlfY3J0X3BhcnNlKCZjZXJ0LCBidWYsIGxlbik7Ci0JaWYgKGVycikgewotCQlFUlJPUigiVHJ1c3RlZCBLZXkgY2VydGlmaWNhdGUgcGFyc2UgZXJyb3IgJWQuXG4iLCBlcnIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIFZlcmlmeSBUcnVzdGVkIEtleSBjZXJ0aWZpY2F0ZSAqLwotCWVyciA9IHg1MDlfY3J0X3ZlcmlmeSgmY2VydCwgJmNlcnQsIE5VTEwsIE5VTEwsICZmbGFncywgTlVMTCwgTlVMTCk7Ci0JaWYgKGVycikgewotCQlFUlJPUigiVHJ1c3RlZCBLZXkgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGVycm9yICVkLiBGbGFnczogIgotCQkJCSIweCV4LlxuIiwgZXJyLCBmbGFncyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogQ2hlY2sgdGhhdCBpdCBoYXMgYmVlbiBzaWduZWQgd2l0aCB0aGUgUk9UIGtleSAqLwotCWVyciA9IHBrX3dyaXRlX3B1YmtleV9kZXIoJmNlcnQucGssIHBrX2J1Ziwgc2l6ZW9mKHBrX2J1ZikpOwotCWlmIChlcnIgPCAwKSB7Ci0JCUVSUk9SKCJFcnJvciBsb2FkaW5nIFJPVCBrZXkgaW4gREVSIGZvcm1hdCAlZC5cbiIsIGVycik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0Jc3ogPSAoc2l6ZV90KWVycjsKLQlwID0gcGtfYnVmICsgc2l6ZW9mKHBrX2J1ZikgLSBzejsKLQotCWlmIChwbGF0X21hdGNoX3JvdHBrKHAsIHN6KSkgewotCQlFUlJPUigiUk9UIGFuZCBUcnVzdGVkIEtleSBjZXJ0aWZpY2F0ZSBrZXkgbWlzbWF0Y2hcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIEV4dHJhY3QgVHJ1c3RlZCBXb3JsZCBrZXkgZnJvbSBleHRlbnNpb25zICovCi0JZXJyID0geDUwOV9nZXRfY3J0X2V4dF9kYXRhKCZwLCAmdHpfd29ybGRfcGtfbGVuLAotCQkJJmNlcnQsIFRaX1dPUkxEX1BLX09JRCk7Ci0JaWYgKGVycikgewotCQlFUlJPUigiQ2Fubm90IHJlYWQgVHJ1c3RlZCBXb3JsZCBrZXlcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWFzc2VydCh0el93b3JsZF9wa19sZW4gPD0gUlNBX1BVQl9ERVJfTUFYX0JZVEVTKTsKLQltZW1jcHkodHpfd29ybGRfcGssIHAsIHR6X3dvcmxkX3BrX2xlbik7Ci0KLQkvKiBFeHRyYWN0IE5vbi1UcnVzdGVkIFdvcmxkIGtleSBmcm9tIGV4dGVuc2lvbnMgKi8KLQllcnIgPSB4NTA5X2dldF9jcnRfZXh0X2RhdGEoJnAsICZudHpfd29ybGRfcGtfbGVuLAotCQkJJmNlcnQsIE5UWl9XT1JMRF9QS19PSUQpOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIkNhbm5vdCByZWFkIE5vbi1UcnVzdGVkIFdvcmxkIGtleVxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JYXNzZXJ0KHR6X3dvcmxkX3BrX2xlbiA8PSBSU0FfUFVCX0RFUl9NQVhfQllURVMpOwotCW1lbWNweShudHpfd29ybGRfcGssIHAsIG50el93b3JsZF9wa19sZW4pOwotCi1lcnJvcjoKLQl4NTA5X2NydF9mcmVlKCZjZXJ0KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfYmwzeF9rZXlfY2VydChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0JCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaV9rZXksIHNpemVfdCBpX2tleV9sZW4sCi0JCQkgICAgICAgdW5zaWduZWQgY2hhciAqc19rZXksIHNpemVfdCAqc19rZXlfbGVuLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmtleV9vaWQpCi17Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqcDsKLQlzaXplX3Qgc3o7Ci0JaW50IGVyciwgZmxhZ3M7Ci0KLQl4NTA5X2NydF9pbml0KCZjZXJ0KTsKLQotCS8qIFBhcnNlIGtleSBjZXJ0aWZpY2F0ZSAqLwotCWVyciA9IHg1MDlfY3J0X3BhcnNlKCZjZXJ0LCBidWYsIGxlbik7Ci0JaWYgKGVycikgewotCQlFUlJPUigiS2V5IGNlcnRpZmljYXRlIHBhcnNlIGVycm9yICVkLlxuIiwgZXJyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBWZXJpZnkgY2VydGlmaWNhdGUgKi8KLQllcnIgPSB4NTA5X2NydF92ZXJpZnkoJmNlcnQsICZjZXJ0LCBOVUxMLCBOVUxMLCAmZmxhZ3MsIE5VTEwsIE5VTEwpOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIktleSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZXJyb3IgJWQuIEZsYWdzOiAiCi0JCQkJIjB4JXguXG4iLCBlcnIsIGZsYWdzKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBDaGVjayB0aGF0IHRoZSBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiBzaWduZWQgYnkgdGhlIGlzc3VlciAqLwotCWVyciA9IHBrX3dyaXRlX3B1YmtleV9kZXIoJmNlcnQucGssIHBrX2J1Ziwgc2l6ZW9mKHBrX2J1ZikpOwotCWlmIChlcnIgPCAwKSB7Ci0JCUVSUk9SKCJFcnJvciBsb2FkaW5nIGtleSBpbiBERVIgZm9ybWF0ICVkLlxuIiwgZXJyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlzeiA9IChzaXplX3QpZXJyOwotCXAgPSBwa19idWYgKyBzaXplb2YocGtfYnVmKSAtIHN6OwotCWlmICgoc3ogIT0gaV9rZXlfbGVuKSB8fCBtZW1jbXAocCwgaV9rZXksIHN6KSkgewotCQlFUlJPUigiS2V5IGNlcnRpZmljYXRlIG5vdCBzaWduZWQgd2l0aCBpc3N1ZXIga2V5XG4iKTsKLQkJZXJyID0gMTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBHZXQgdGhlIGNvbnRlbnQgY2VydGlmaWNhdGUga2V5ICovCi0JZXJyID0geDUwOV9nZXRfY3J0X2V4dF9kYXRhKCZwLCAmc3osICZjZXJ0LCBrZXlfb2lkKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJFeHRlbnNpb24gJXMgbm90IGZvdW5kIGluIEtleSBjZXJ0aWZpY2F0ZVxuIiwga2V5X29pZCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JYXNzZXJ0KHN6IDw9IFJTQV9QVUJfREVSX01BWF9CWVRFUyk7Ci0JbWVtY3B5KHNfa2V5LCBwLCBzeik7Ci0JKnNfa2V5X2xlbiA9IHN6OwotCi1lcnJvcjoKLQl4NTA5X2NydF9mcmVlKCZjZXJ0KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfYmwzeF9jZXJ0KHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlfa2V5LCBzaXplX3QgaV9rZXlfbGVuLAotCQkgICAgICAgY29uc3QgY2hhciAqaGFzaF9vaWQsIHVuc2lnbmVkIGNoYXIgKnNoYSkKLXsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpwOwotCXNpemVfdCBzejsKLQlpbnQgZXJyLCBmbGFnczsKLQotCXg1MDlfY3J0X2luaXQoJmNlcnQpOwotCi0JLyogUGFyc2UgQkwzMSBjb250ZW50IGNlcnRpZmljYXRlICovCi0JZXJyID0geDUwOV9jcnRfcGFyc2UoJmNlcnQsIGJ1ZiwgbGVuKTsKLQlpZiAoZXJyKSB7Ci0JCUVSUk9SKCJDb250ZW50IGNlcnRpZmljYXRlIHBhcnNlIGVycm9yICVkLlxuIiwgZXJyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBWZXJpZnkgY2VydGlmaWNhdGUgKi8KLQllcnIgPSB4NTA5X2NydF92ZXJpZnkoJmNlcnQsICZjZXJ0LCBOVUxMLCBOVUxMLCAmZmxhZ3MsIE5VTEwsIE5VTEwpOwotCWlmIChlcnIpIHsKLQkJRVJST1IoIkNvbnRlbnQgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGVycm9yICVkLiBGbGFnczogIgotCQkJCSIweCV4LlxuIiwgZXJyLCBmbGFncyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogQ2hlY2sgdGhhdCBjb250ZW50IGNlcnRpZmljYXRlIGhhcyBiZWVuIHNpZ25lZCB3aXRoIHRoZSBjb250ZW50Ci0JICogY2VydGlmaWNhdGUga2V5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbWFnZSAqLwotCXN6ID0gcGtfd3JpdGVfcHVia2V5X2RlcigmY2VydC5waywgcGtfYnVmLCBzaXplb2YocGtfYnVmKSk7Ci0JcCA9IHBrX2J1ZiArIHNpemVvZihwa19idWYpIC0gc3o7Ci0KLQlpZiAoKHN6ICE9IGlfa2V5X2xlbikgfHwgbWVtY21wKHAsIGlfa2V5LCBzeikpIHsKLQkJRVJST1IoIkNvbnRlbnQgY2VydGlmaWNhdGUgbm90IHNpZ25lZCB3aXRoIGNvbnRlbnQgIgotCQkJCSJjZXJ0aWZpY2F0ZSBrZXlcbiIpOwotCQllcnIgPSAxOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIEV4dHJhY3QgaW1hZ2UgaGFzaCBmcm9tIGNlcnRpZmljYXRlICovCi0JZXJyID0geDUwOV9nZXRfY3J0X2V4dF9kYXRhKCZwLCAmc3osICZjZXJ0LCBoYXNoX29pZCk7Ci0JaWYgKGVycikgewotCQlFUlJPUigiQ2Fubm90IHJlYWQgaGFzaCBmcm9tIGNlcnRpZmljYXRlXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlhc3NlcnQoc3ogPT0gU0hBX0JZVEVTICsgMik7Ci0KLQkvKiBTa2lwIHRoZSB0YWcgYW5kIGxlbmd0aCBieXRlcyBhbmQgY29weSB0aGUgaGFzaCAqLwotCXAgKz0gMjsKLQltZW1jcHkoc2hhLCBwLCBTSEFfQllURVMpOwotCi1lcnJvcjoKLQl4NTA5X2NydF9mcmVlKCZjZXJ0KTsKLQotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYgLyogSU1BR0VfQkwyICovCi0KLS8qCi0gKiBDYWxjdWxhdGUgdGhlIGhhc2ggb2YgdGhlIGltYWdlIGFuZCBjaGVjayBpdCBhZ2FpbnN0IHRoZSBoYXNoIGV4dHJhY3RlZAotICogcHJldmlvdXNseSBmcm9tIHRoZSBjZXJ0aWZpY2F0ZQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiAgIGJ1ZjogYnVmZmVyIHdoZXJlIGltYWdlIGlzIGxvYWRlZAotICogICBsZW46IHNpemUgb2YgdGhlIGltYWdlCi0gKiAgIHNoYTogbWF0Y2hpbmcgaGFzaCAoZXh0cmFjdGVkIGZyb20gdGhlIGltYWdlIGNlcnRpZmljYXRlKQotICoKLSAqIFJldHVybjogMCA9IG1hdGNoLCBPdGhlcndpc2UgPSBtaXNtYXRjaAotICovCi1zdGF0aWMgaW50IGNoZWNrX2JsX2ltZyh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0JCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGEpCi17Ci0JdW5zaWduZWQgY2hhciBpbWdfc2hhW1NIQV9CWVRFU107Ci0KLQkvKiBDYWxjdWxhdGUgdGhlIGhhc2ggb2YgdGhlIGltYWdlICovCi0Jc2hhMjU2KGJ1ZiwgbGVuLCBpbWdfc2hhLCAwKTsKLQotCS8qIE1hdGNoIHRoZSBoYXNoIHdpdGggdGhlIG9uZSBleHRyYWN0ZWQgZnJvbSB0aGUgY2VydGlmaWNhdGUgKi8KLQlpZiAobWVtY21wKGltZ19zaGEsIHNoYSwgU0hBX0JZVEVTKSkgewotCQlFUlJPUigiSW1hZ2UgaGFzaCBtaXNtYXRjaFxuIik7Ci0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogT2JqZWN0IHZlcmlmaWNhdGlvbiBmdW5jdGlvbgotICoKLSAqIFRoZSBpZCBwYXJhbWV0ZXIgd2lsbCBpbmRpY2F0ZSB0aGUgZXhwZWN0ZWQgZm9ybWF0IG9mIHRoZSBvYmplY3QKLSAqIChjZXJ0aWZpY2F0ZSwgaW1hZ2UsIGV0YykuCi0gKgotICogUmV0dXJuOiAwID0gc3VjY2VzcywgT3RoZXJ3aXNlID0gZXJyb3IKLSAqLwotc3RhdGljIGludCBwb2xhcnNzbF9tb2RfdmVyaWZ5KHVuc2lnbmVkIGludCBpZCwgdWludHB0cl90IG9iaiwgc2l6ZV90IGxlbikKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChpZCkgewotI2lmIElNQUdFX0JMMQotCWNhc2UgQVVUSF9CTDJfSU1HX0NFUlQ6Ci0JCXJldCA9IGNoZWNrX2JsMl9jZXJ0KCh1bnNpZ25lZCBjaGFyICopb2JqLCBsZW4pOwotCQlicmVhazsKLQljYXNlIEFVVEhfQkwyX0lNRzoKLQkJcmV0ID0gY2hlY2tfYmxfaW1nKCh1bnNpZ25lZCBjaGFyICopb2JqLCBsZW4sIHNoYV9ibDIpOwotCQlicmVhazsKLSNlbmRpZiAvKiBJTUFHRV9CTDEgKi8KLQotI2lmIElNQUdFX0JMMgotCWNhc2UgQVVUSF9UUlVTVEVEX0tFWV9DRVJUOgotCQlyZXQgPSBjaGVja190cnVzdGVkX2tleV9jZXJ0KCh1bnNpZ25lZCBjaGFyICopb2JqLCBsZW4pOwotCQlicmVhazsKLQljYXNlIEFVVEhfQkwzMF9LRVlfQ0VSVDoKLQkJcmV0ID0gY2hlY2tfYmwzeF9rZXlfY2VydCgodW5zaWduZWQgY2hhciAqKW9iaiwgbGVuLAotCQkJCXR6X3dvcmxkX3BrLCB0el93b3JsZF9wa19sZW4sCi0JCQkJY29udGVudF9waywgJmNvbnRlbnRfcGtfbGVuLAotCQkJCUJMMzBfQ09OVEVOVF9DRVJUX1BLX09JRCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVUSF9CTDMxX0tFWV9DRVJUOgotCQlyZXQgPSBjaGVja19ibDN4X2tleV9jZXJ0KCh1bnNpZ25lZCBjaGFyICopb2JqLCBsZW4sCi0JCQkJdHpfd29ybGRfcGssIHR6X3dvcmxkX3BrX2xlbiwKLQkJCQljb250ZW50X3BrLCAmY29udGVudF9wa19sZW4sCi0JCQkJQkwzMV9DT05URU5UX0NFUlRfUEtfT0lEKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0JMMzJfS0VZX0NFUlQ6Ci0JCXJldCA9IGNoZWNrX2JsM3hfa2V5X2NlcnQoKHVuc2lnbmVkIGNoYXIgKilvYmosIGxlbiwKLQkJCQl0el93b3JsZF9waywgdHpfd29ybGRfcGtfbGVuLAotCQkJCWNvbnRlbnRfcGssICZjb250ZW50X3BrX2xlbiwKLQkJCQlCTDMyX0NPTlRFTlRfQ0VSVF9QS19PSUQpOwotCQlicmVhazsKLQljYXNlIEFVVEhfQkwzM19LRVlfQ0VSVDoKLQkJcmV0ID0gY2hlY2tfYmwzeF9rZXlfY2VydCgodW5zaWduZWQgY2hhciAqKW9iaiwgbGVuLAotCQkJCW50el93b3JsZF9waywgbnR6X3dvcmxkX3BrX2xlbiwKLQkJCQljb250ZW50X3BrLCAmY29udGVudF9wa19sZW4sCi0JCQkJQkwzM19DT05URU5UX0NFUlRfUEtfT0lEKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0JMMzBfSU1HX0NFUlQ6Ci0JCXJldCA9IGNoZWNrX2JsM3hfY2VydCgodW5zaWduZWQgY2hhciAqKW9iaiwgbGVuLAotCQkJCWNvbnRlbnRfcGssIGNvbnRlbnRfcGtfbGVuLAotCQkJCUJMMzBfSEFTSF9PSUQsIHNoYV9ibDMwKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0JMMzFfSU1HX0NFUlQ6Ci0JCXJldCA9IGNoZWNrX2JsM3hfY2VydCgodW5zaWduZWQgY2hhciAqKW9iaiwgbGVuLAotCQkJCWNvbnRlbnRfcGssIGNvbnRlbnRfcGtfbGVuLAotCQkJCUJMMzFfSEFTSF9PSUQsIHNoYV9ibDMxKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0JMMzJfSU1HX0NFUlQ6Ci0JCXJldCA9IGNoZWNrX2JsM3hfY2VydCgodW5zaWduZWQgY2hhciAqKW9iaiwgbGVuLAotCQkJCWNvbnRlbnRfcGssIGNvbnRlbnRfcGtfbGVuLAotCQkJCUJMMzJfSEFTSF9PSUQsIHNoYV9ibDMyKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0JMMzNfSU1HX0NFUlQ6Ci0JCXJldCA9IGNoZWNrX2JsM3hfY2VydCgodW5zaWduZWQgY2hhciAqKW9iaiwgbGVuLAotCQkJCWNvbnRlbnRfcGssIGNvbnRlbnRfcGtfbGVuLAotCQkJCUJMMzNfSEFTSF9PSUQsIHNoYV9ibDMzKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0JMMzBfSU1HOgotCQlyZXQgPSBjaGVja19ibF9pbWcoKHVuc2lnbmVkIGNoYXIgKilvYmosIGxlbiwgc2hhX2JsMzApOwotCQlicmVhazsKLQljYXNlIEFVVEhfQkwzMV9JTUc6Ci0JCXJldCA9IGNoZWNrX2JsX2ltZygodW5zaWduZWQgY2hhciAqKW9iaiwgbGVuLCBzaGFfYmwzMSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVUSF9CTDMyX0lNRzoKLQkJcmV0ID0gY2hlY2tfYmxfaW1nKCh1bnNpZ25lZCBjaGFyICopb2JqLCBsZW4sIHNoYV9ibDMyKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0JMMzNfSU1HOgotCQlyZXQgPSBjaGVja19ibF9pbWcoKHVuc2lnbmVkIGNoYXIgKilvYmosIGxlbiwgc2hhX2JsMzMpOwotCQlicmVhazsKLSNlbmRpZiAvKiBJTUFHRV9CTDIgKi8KLQlkZWZhdWx0OgotCQlyZXQgPSAtMTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotICoKLSAqIFJldHVybjogMCA9IHN1Y2Nlc3MsIE90aGVyd2lzZSA9IGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgcG9sYXJzc2xfbW9kX2luaXQodm9pZCkKLXsKLQkvKiBJbml0aWFsaXplIHRoZSBQb2xhclNTTCBoZWFwICovCi0JcmV0dXJuIG1lbW9yeV9idWZmZXJfYWxsb2NfaW5pdChoZWFwLCBQT0xBUlNTTF9IRUFQX1NJWkUpOwotfQotCi1jb25zdCBhdXRoX21vZF90IGF1dGhfbW9kID0gewotCS5uYW1lID0gIlBvbGFyU1NMIiwKLQkuaW5pdCA9IHBvbGFyc3NsX21vZF9pbml0LAotCS52ZXJpZnkgPSBwb2xhcnNzbF9tb2RfdmVyaWZ5Ci19OwpkaWZmIC0tZ2l0IGEvY29tbW9uL2JsX2NvbW1vbi5jIGIvY29tbW9uL2JsX2NvbW1vbi5jCmluZGV4IGI5Y2MwZjIuLmI4NTU4YTYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9ibF9jb21tb24uYworKysgYi9jb21tb24vYmxfY29tbW9uLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxhcmNoLmg+CiAjaW5jbHVkZSA8YXJjaF9oZWxwZXJzLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8YXV0aF9tb2QuaD4KICNpbmNsdWRlIDxibF9jb21tb24uaD4KICNpbmNsdWRlIDxkZWJ1Zy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC0xNTYsNyArMTU3LDcgQEAKIH0KIAogLyogR2VuZXJpYyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHNpemUgb2YgYW4gaW1hZ2UgKi8KLXVuc2lnbmVkIGxvbmcgaW1hZ2Vfc2l6ZShjb25zdCBjaGFyICppbWFnZV9uYW1lKQordW5zaWduZWQgbG9uZyBpbWFnZV9zaXplKHVuc2lnbmVkIGludCBpbWFnZV9pZCkKIHsKIAl1aW50cHRyX3QgZGV2X2hhbmRsZTsKIAl1aW50cHRyX3QgaW1hZ2VfaGFuZGxlOwpAQCAtMTY0LDI5ICsxNjUsMjcgQEAKIAlzaXplX3QgaW1hZ2Vfc2l6ZSA9IDA7CiAJaW50IGlvX3Jlc3VsdCA9IElPX0ZBSUw7CiAKLQlhc3NlcnQoaW1hZ2VfbmFtZSAhPSBOVUxMKTsKLQogCS8qIE9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgYnkgcXVlcnlpbmcgdGhlIHBsYXRmb3JtIGxheWVyICovCi0JaW9fcmVzdWx0ID0gcGxhdF9nZXRfaW1hZ2Vfc291cmNlKGltYWdlX25hbWUsICZkZXZfaGFuZGxlLCAmaW1hZ2Vfc3BlYyk7CisJaW9fcmVzdWx0ID0gcGxhdF9nZXRfaW1hZ2Vfc291cmNlKGltYWdlX2lkLCAmZGV2X2hhbmRsZSwgJmltYWdlX3NwZWMpOwogCWlmIChpb19yZXN1bHQgIT0gSU9fU1VDQ0VTUykgewotCQlXQVJOKCJGYWlsZWQgdG8gb2J0YWluIHJlZmVyZW5jZSB0byBpbWFnZSAnJXMnICglaSlcbiIsCi0JCQlpbWFnZV9uYW1lLCBpb19yZXN1bHQpOworCQlXQVJOKCJGYWlsZWQgdG8gb2J0YWluIHJlZmVyZW5jZSB0byBpbWFnZSBpZD0ldSAoJWkpXG4iLAorCQkJaW1hZ2VfaWQsIGlvX3Jlc3VsdCk7CiAJCXJldHVybiAwOwogCX0KIAogCS8qIEF0dGVtcHQgdG8gYWNjZXNzIHRoZSBpbWFnZSAqLwogCWlvX3Jlc3VsdCA9IGlvX29wZW4oZGV2X2hhbmRsZSwgaW1hZ2Vfc3BlYywgJmltYWdlX2hhbmRsZSk7CiAJaWYgKGlvX3Jlc3VsdCAhPSBJT19TVUNDRVNTKSB7Ci0JCVdBUk4oIkZhaWxlZCB0byBhY2Nlc3MgaW1hZ2UgJyVzJyAoJWkpXG4iLAotCQkJaW1hZ2VfbmFtZSwgaW9fcmVzdWx0KTsKKwkJV0FSTigiRmFpbGVkIHRvIGFjY2VzcyBpbWFnZSBpZD0ldSAoJWkpXG4iLAorCQkJaW1hZ2VfaWQsIGlvX3Jlc3VsdCk7CiAJCXJldHVybiAwOwogCX0KIAogCS8qIEZpbmQgdGhlIHNpemUgb2YgdGhlIGltYWdlICovCiAJaW9fcmVzdWx0ID0gaW9fc2l6ZShpbWFnZV9oYW5kbGUsICZpbWFnZV9zaXplKTsKIAlpZiAoKGlvX3Jlc3VsdCAhPSBJT19TVUNDRVNTKSB8fCAoaW1hZ2Vfc2l6ZSA9PSAwKSkgewotCQlXQVJOKCJGYWlsZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBpbWFnZSAnJXMnIGZpbGUgKCVpKVxuIiwKLQkJCWltYWdlX25hbWUsIGlvX3Jlc3VsdCk7CisJCVdBUk4oIkZhaWxlZCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGltYWdlIGlkPSV1ICglaSlcbiIsCisJCQlpbWFnZV9pZCwgaW9fcmVzdWx0KTsKIAl9CiAJaW9fcmVzdWx0ID0gaW9fY2xvc2UoaW1hZ2VfaGFuZGxlKTsKIAkvKiBJZ25vcmUgaW1wcm9iYWJsZS91bnJlY292ZXJhYmxlIGVycm9yIGluICdjbG9zZScgKi8KQEAgLTIxMCw4ICsyMDksOCBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IGxvYWRfaW1hZ2UobWVtaW5mb190ICptZW1fbGF5b3V0LAotCSAgICAgICBjb25zdCBjaGFyICppbWFnZV9uYW1lLAotCSAgICAgICB1aW50NjRfdCBpbWFnZV9iYXNlLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaW1hZ2VfaWQsCisJICAgICAgIHVpbnRwdHJfdCBpbWFnZV9iYXNlLAogCSAgICAgICBpbWFnZV9pbmZvX3QgKmltYWdlX2RhdGEsCiAJICAgICAgIGVudHJ5X3BvaW50X2luZm9fdCAqZW50cnlfcG9pbnRfaW5mbykKIHsKQEAgLTIyMywzMyArMjIyLDMyIEBACiAJaW50IGlvX3Jlc3VsdCA9IElPX0ZBSUw7CiAKIAlhc3NlcnQobWVtX2xheW91dCAhPSBOVUxMKTsKLQlhc3NlcnQoaW1hZ2VfbmFtZSAhPSBOVUxMKTsKIAlhc3NlcnQoaW1hZ2VfZGF0YSAhPSBOVUxMKTsKIAlhc3NlcnQoaW1hZ2VfZGF0YS0+aC52ZXJzaW9uID49IFZFUlNJT05fMSk7CiAKIAkvKiBPYnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGltYWdlIGJ5IHF1ZXJ5aW5nIHRoZSBwbGF0Zm9ybSBsYXllciAqLwotCWlvX3Jlc3VsdCA9IHBsYXRfZ2V0X2ltYWdlX3NvdXJjZShpbWFnZV9uYW1lLCAmZGV2X2hhbmRsZSwgJmltYWdlX3NwZWMpOworCWlvX3Jlc3VsdCA9IHBsYXRfZ2V0X2ltYWdlX3NvdXJjZShpbWFnZV9pZCwgJmRldl9oYW5kbGUsICZpbWFnZV9zcGVjKTsKIAlpZiAoaW9fcmVzdWx0ICE9IElPX1NVQ0NFU1MpIHsKLQkJV0FSTigiRmFpbGVkIHRvIG9idGFpbiByZWZlcmVuY2UgdG8gaW1hZ2UgJyVzJyAoJWkpXG4iLAotCQkJaW1hZ2VfbmFtZSwgaW9fcmVzdWx0KTsKKwkJV0FSTigiRmFpbGVkIHRvIG9idGFpbiByZWZlcmVuY2UgdG8gaW1hZ2UgaWQ9JXUgKCVpKVxuIiwKKwkJCWltYWdlX2lkLCBpb19yZXN1bHQpOwogCQlyZXR1cm4gaW9fcmVzdWx0OwogCX0KIAogCS8qIEF0dGVtcHQgdG8gYWNjZXNzIHRoZSBpbWFnZSAqLwogCWlvX3Jlc3VsdCA9IGlvX29wZW4oZGV2X2hhbmRsZSwgaW1hZ2Vfc3BlYywgJmltYWdlX2hhbmRsZSk7CiAJaWYgKGlvX3Jlc3VsdCAhPSBJT19TVUNDRVNTKSB7Ci0JCVdBUk4oIkZhaWxlZCB0byBhY2Nlc3MgaW1hZ2UgJyVzJyAoJWkpXG4iLAotCQkJaW1hZ2VfbmFtZSwgaW9fcmVzdWx0KTsKKwkJV0FSTigiRmFpbGVkIHRvIGFjY2VzcyBpbWFnZSBpZD0ldSAoJWkpXG4iLAorCQkJaW1hZ2VfaWQsIGlvX3Jlc3VsdCk7CiAJCXJldHVybiBpb19yZXN1bHQ7CiAJfQogCi0JSU5GTygiTG9hZGluZyBmaWxlICclcycgYXQgYWRkcmVzcyAweCVseFxuIiwgaW1hZ2VfbmFtZSwgaW1hZ2VfYmFzZSk7CisJSU5GTygiTG9hZGluZyBpbWFnZSBpZD0ldSBhdCBhZGRyZXNzIDB4JWx4XG4iLCBpbWFnZV9pZCwgaW1hZ2VfYmFzZSk7CiAKIAkvKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBpbWFnZSAqLwogCWlvX3Jlc3VsdCA9IGlvX3NpemUoaW1hZ2VfaGFuZGxlLCAmaW1hZ2Vfc2l6ZSk7CiAJaWYgKChpb19yZXN1bHQgIT0gSU9fU1VDQ0VTUykgfHwgKGltYWdlX3NpemUgPT0gMCkpIHsKLQkJV0FSTigiRmFpbGVkIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgJyVzJyBmaWxlICglaSlcbiIsCi0JCQlpbWFnZV9uYW1lLCBpb19yZXN1bHQpOworCQlXQVJOKCJGYWlsZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBpZD0ldSAoJWkpXG4iLAorCQkJaW1hZ2VfaWQsIGlvX3Jlc3VsdCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI2Nyw3ICsyNjUsNyBAQAogCS8qIFRPRE86IENvbnNpZGVyIHdoZXRoZXIgdG8gdHJ5IHRvIHJlY292ZXIvcmV0cnkgYSBwYXJ0aWFsbHkgc3VjY2Vzc2Z1bCByZWFkICovCiAJaW9fcmVzdWx0ID0gaW9fcmVhZChpbWFnZV9oYW5kbGUsIGltYWdlX2Jhc2UsIGltYWdlX3NpemUsICZieXRlc19yZWFkKTsKIAlpZiAoKGlvX3Jlc3VsdCAhPSBJT19TVUNDRVNTKSB8fCAoYnl0ZXNfcmVhZCA8IGltYWdlX3NpemUpKSB7Ci0JCVdBUk4oIkZhaWxlZCB0byBsb2FkICclcycgZmlsZSAoJWkpXG4iLCBpbWFnZV9uYW1lLCBpb19yZXN1bHQpOworCQlXQVJOKCJGYWlsZWQgdG8gbG9hZCBpbWFnZSBpZD0ldSAoJWkpXG4iLCBpbWFnZV9pZCwgaW9fcmVzdWx0KTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjk4LDcgKzI5Niw3IEBACiAJICovCiAJZmx1c2hfZGNhY2hlX3JhbmdlKGltYWdlX2Jhc2UsIGltYWdlX3NpemUpOwogCi0JSU5GTygiRmlsZSAnJXMnIGxvYWRlZDogMHglbHggLSAweCVseFxuIiwgaW1hZ2VfbmFtZSwgaW1hZ2VfYmFzZSwKKwlJTkZPKCJJbWFnZSBpZD0ldSBsb2FkZWQ6IDB4JWx4IC0gMHglbHhcbiIsIGltYWdlX2lkLCBpbWFnZV9iYXNlLAogCSAgICAgaW1hZ2VfYmFzZSArIGltYWdlX3NpemUpOwogCiBleGl0OgpAQCAtMzExLDMgKzMwOSw1NCBAQAogCiAJcmV0dXJuIGlvX3Jlc3VsdDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyaWMgZnVuY3Rpb24gdG8gbG9hZCBhbmQgYXV0aGVudGljYXRlIGFuIGltYWdlLiBUaGUgaW1hZ2UgaXMgYWN0dWFsbHkKKyAqIGxvYWRlZCBieSBjYWxsaW5nIHRoZSAnbG9hZF9pbWFnZSgpJyBmdW5jdGlvbi4gSW4gYWRkaXRpb24sIHRoaXMgZnVuY3Rpb24KKyAqIHVzZXMgcmVjdXJzaW9uIHRvIGF1dGhlbnRpY2F0ZSB0aGUgcGFyZW50IGltYWdlcyB1cCB0byB0aGUgcm9vdCBvZiB0cnVzdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbG9hZF9hdXRoX2ltYWdlKG1lbWluZm9fdCAqbWVtX2xheW91dCwKKwkJICAgIHVuc2lnbmVkIGludCBpbWFnZV9pZCwKKwkJICAgIHVpbnRwdHJfdCBpbWFnZV9iYXNlLAorCQkgICAgaW1hZ2VfaW5mb190ICppbWFnZV9kYXRhLAorCQkgICAgZW50cnlfcG9pbnRfaW5mb190ICplbnRyeV9wb2ludF9pbmZvKQoreworCWludCByYzsKKworI2lmIFRSVVNURURfQk9BUkRfQk9PVAorCXVuc2lnbmVkIGludCBwYXJlbnRfaWQ7CisKKwkvKiBVc2UgcmVjdXJzaW9uIHRvIGF1dGhlbnRpY2F0ZSBwYXJlbnQgaW1hZ2VzICovCisJcmMgPSBhdXRoX21vZF9nZXRfcGFyZW50X2lkKGltYWdlX2lkLCAmcGFyZW50X2lkKTsKKwlpZiAocmMgPT0gMCkgeworCQlyYyA9IGxvYWRfYXV0aF9pbWFnZShtZW1fbGF5b3V0LCBwYXJlbnRfaWQsIGltYWdlX2Jhc2UsCisJCQkJICAgICBpbWFnZV9kYXRhLCBOVUxMKTsKKwkJaWYgKHJjICE9IElPX1NVQ0NFU1MpIHsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKyNlbmRpZiAvKiBUUlVTVEVEX0JPQVJEX0JPT1QgKi8KKworCS8qIExvYWQgdGhlIGltYWdlICovCisJcmMgPSBsb2FkX2ltYWdlKG1lbV9sYXlvdXQsIGltYWdlX2lkLCBpbWFnZV9iYXNlLCBpbWFnZV9kYXRhLAorCQkJZW50cnlfcG9pbnRfaW5mbyk7CisJaWYgKHJjICE9IElPX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIHJjOworCX0KKworI2lmIFRSVVNURURfQk9BUkRfQk9PVAorCS8qIEF1dGhlbnRpY2F0ZSBpdCAqLworCXJjID0gYXV0aF9tb2RfdmVyaWZ5X2ltZyhpbWFnZV9pZCwKKwkJCQkgKHZvaWQgKilpbWFnZV9kYXRhLT5pbWFnZV9iYXNlLAorCQkJCSBpbWFnZV9kYXRhLT5pbWFnZV9zaXplKTsKKwlpZiAocmMgIT0gMCkgeworCQlyZXR1cm4gSU9fRkFJTDsKKwl9CisKKwkvKiBBZnRlciB3b3JraW5nIHdpdGggZGF0YSwgaW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSAqLworCWludl9kY2FjaGVfcmFuZ2UoaW1hZ2VfZGF0YS0+aW1hZ2VfYmFzZSwKKwkJCShzaXplX3QpaW1hZ2VfZGF0YS0+aW1hZ2Vfc2l6ZSk7CisjZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCisKKwlyZXR1cm4gSU9fU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2RvY3MvYXV0aC1mcmFtZXdvcmsubWQgYi9kb2NzL2F1dGgtZnJhbWV3b3JrLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OGZhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2F1dGgtZnJhbWV3b3JrLm1kCkBAIC0wLDAgKzEsOTE4IEBACitBYnN0cmFjdGluZyBhIENoYWluIG9mIFRydXN0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRlbnRzIDoKKworMS4gIFtJbnRyb2R1Y3Rpb25dKCMxLS1pbnRyb2R1Y3Rpb24pCisyLiAgW0ZyYW1ld29yayBkZXNpZ25dKCMyLS1mcmFtZXdvcmstZGVzaWduKQorMy4gIFtTcGVjaWZ5aW5nIGEgQ2hhaW4gb2YgVHJ1c3RdKCMzLS1zcGVjaWZ5aW5nLWEtY2hhaW4tb2YtdHJ1c3QpCis0LiAgW0ltcGxlbWVudGF0aW9uIGV4YW1wbGVdKCM0LS1pbXBsZW1lbnRhdGlvbi1leGFtcGxlKQorCisKKzEuICBJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGFpbSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIGRlc2NyaWJlIHRoZSBhdXRoZW50aWNhdGlvbiBmcmFtZXdvcmsgaW1wbGVtZW50ZWQKK2luIHRoZSBUcnVzdGVkIEZpcm13YXJlLiBUaGlzIGZyYW1ld29yayBmdWxmaWxscyB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKKworMS4gIEl0IHNob3VsZCBiZSBwb3NzaWJsZSBmb3IgYSBwbGF0Zm9ybSBwb3J0IHRvIHNwZWNpZnkgdGhlIENoYWluIG9mIFRydXN0IGluCisgICAgdGVybXMgb2YgY2VydGlmaWNhdGUgaGllcmFyY2h5IGFuZCB0aGUgbWVjaGFuaXNtcyB1c2VkIHRvIHZlcmlmeSBhCisgICAgcGFydGljdWxhciBpbWFnZS9jZXJ0aWZpY2F0ZS4KKworMi4gIFRoZSBmcmFtZXdvcmsgc2hvdWxkIGRpc3Rpbmd1aXNoIGJldHdlZW46CisKKyAgICAtIFRoZSBtZWNoYW5pc20gdXNlZCB0byBlbmNvZGUgYW5kIHRyYW5zcG9ydCBpbmZvcm1hdGlvbiwgZS5nLiBERVIgZW5jb2RlZAorICAgICAgWC41MDl2MyBjZXJ0aWZpY2F0ZXMgdG8gZmVycnkgU3ViamVjdCBQdWJsaWMgS2V5cywgaGFzaGVzIGFuZCBub24tdm9sYXRpbGUKKyAgICAgIGNvdW50ZXJzLgorCisgICAgLSBUaGUgbWVjaGFuaXNtIHVzZWQgdG8gdmVyaWZ5IHRoZSB0cmFuc3BvcnRlZCBpbmZvcm1hdGlvbiBpLmUuIHRoZQorICAgICAgY3J5cHRvZ3JhcGhpYyBsaWJyYXJpZXMuCisKK1RoZSBmcmFtZXdvcmsgaGFzIGJlZW4gZGVzaWduZWQgZm9sbG93aW5nIGEgbW9kdWxhciBhcHByb2FjaCBpbGx1c3RyYXRlZCBpbiB0aGUKK25leHQgZGlhZ3JhbToKKworYGBgCisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKworICAgIHwgVHJ1c3RlZCAgICAgICB8IFRydXN0ZWQgICAgICAgfCBUcnVzdGVkICAgIHwKKyAgICB8IEZpcm13YXJlICAgICAgfCBGaXJtd2FyZSAgICAgIHwgRmlybXdhcmUgICB8CisgICAgfCBHZW5lcmljICAgICAgIHwgSU8gRnJhbWV3b3JrICB8IFBsYXRmb3JtICAgfAorICAgIHwgQ29kZSBpLmUuICAgICB8IChJTykgICAgICAgICAgfCBQb3J0ICAgICAgIHwKKyAgICB8IEJMMS9CTDIgKEdFTikgfCAgICAgICAgICAgICAgIHwgKFBQKSAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKworICAgICAgICAgICBeICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgICAgICAgIHYgICAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgdgorICAgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsKKyAgICAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgIHwgICB8IEltYWdlICAgICB8CisgICAgIHwgQ3J5cHRvICAgIHwgICB8IEF1dGggICAgICB8ICAgfCBQYXJzZXIgICAgfAorICAgICB8IE1vZHVsZSAgICB8PC0+fCBNb2R1bGUgICAgfDwtPnwgTW9kdWxlICAgIHwKKyAgICAgfCAoQ00pICAgICAgfCAgIHwgKEFNKSAgICAgIHwgICB8IChJUE0pICAgICB8CisgICAgIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgfAorICAgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgQ3J5cHRvZ3JhcGhpYyAgfCAgICAgICAgICAgICB8IEltYWdlIFBhcnNlciAgICB8CisgICAgfCBMaWJyYXJpZXMgKENMKSB8ICAgICAgICAgICAgIHwgTGlicmFyaWVzIChJUEwpIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICB2CisgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgfCBNaXNjLiBMaWJzIGUuZy4gfAorICAgICAgICAgICAgICAgICB8IEFTTi4xIGRlY29kZXIgICB8CisgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgRElBR1JBTSAxLgorYGBgCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBpbm5lciBkZXRhaWxzIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBmcmFtZXdvcmsgYW5kCit0aGUgYWJzdHJhY3Rpb24gbWVjaGFuaXNtcyBhdmFpbGFibGUgdG8gc3BlY2lmeSBhIENoYWluIG9mIFRydXN0LgorCisKKzIuICBGcmFtZXdvcmsgZGVzaWduCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNvbWUgYXNwZWN0cyBvZiB0aGUgZnJhbWV3b3JrIGRlc2lnbiBhbmQgdGhlIHJhdGlvbmFsZQorYmVoaW5kIHRoZW0uIFRoZXNlIGFzcGVjdHMgYXJlIGtleSB0byB2ZXJpZnkgYSBDaGFpbiBvZiBUcnVzdC4KKworIyMjIDIuMSBDaGFpbiBvZiBUcnVzdAorCitBIENvVCBpcyBiYXNpY2FsbHkgYSBzZXF1ZW5jZSBvZiBhdXRoZW50aWNhdGlvbiBpbWFnZXMgd2hpY2ggdXN1YWxseSBzdGFydHMgd2l0aAorYSByb290IG9mIHRydXN0IGFuZCBjdWxtaW5hdGVzIGluIGEgc2luZ2xlIGRhdGEgaW1hZ2UuIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbQoraWxsdXN0cmF0ZXMgaG93IHRoaXMgbWFwcyB0byBhIENvVCBmb3IgdGhlIEJMMy0xIGltYWdlIGRlc2NyaWJlZCBpbiB0aGUKK1RCQlItQ2xpZW50IHNwZWNpZmljYXRpb24uCisKK2BgYAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgUk9UUEsvUk9UUEsgSGFzaCB8LS0tLS0tPnwgVHJ1c3RlZCBLZXkgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgIHwgQ2VydGlmaWNhdGUgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKEF1dGggSW1hZ2UpICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLystLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEwgICAgICAgICAgICAgICAgdgorICAgICstLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBUcnVzdGVkIFdvcmxkICAgIHwtLS0tLS0+fCBCTDMtMSBLZXkgICAgICAgICB8CisgICAgfCBQdWJsaWMgS2V5ICAgICAgIHwgICAgICAgfCBDZXJ0aWZpY2F0ZSAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgfCAoQXV0aCBJbWFnZSkgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICB2CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgTCAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBCTDMtMSBDb250ZW50ICAgIHwtLS0tLS0+fCBCTDMtMSBDb250ZW50ICAgICB8CisgICAgfCBDZXJ0aWZpY2F0ZSBQSyAgIHwgICAgICAgfCBDZXJ0aWZpY2F0ZSAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgfCAoQXV0aCBJbWFnZSkgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICB2CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgTCAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBCTDMtMSBIYXNoICAgICAgIHwtLS0tLS0+fCBCTDMtMSBJbWFnZSAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgfCAoRGF0YSBJbWFnZSkgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgfCAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgICBESUFHUkFNIDIuCitgYGAKKworVGhlIHJvb3Qgb2YgdHJ1c3QgaXMgdXN1YWxseSBhIHB1YmxpYyBrZXkgKFJPVFBLKSB0aGF0IGhhcyBiZWVuIGJ1cm50IGluIHRoZQorcGxhdGZvcm0gYW5kIGNhbm5vdCBiZSBtb2RpZmllZC4KKworIyMjIDIuMiBJbWFnZSB0eXBlcworCitJbWFnZXMgaW4gYSBDb1QgYXJlIGNhdGVnb3Jpc2VkIGFzIGF1dGhlbnRpY2F0aW9uIGFuZCBkYXRhIGltYWdlcy4gQW4KK2F1dGhlbnRpY2F0aW9uIGltYWdlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRvIGF1dGhlbnRpY2F0ZSBhIGRhdGEgaW1hZ2Ugb3IKK2Fub3RoZXIgYXV0aGVudGljYXRpb24gaW1hZ2UuIEEgZGF0YSBpbWFnZSBpcyB1c3VhbGx5IGEgYm9vdCBsb2FkZXIgYmluYXJ5LCBidXQKK2l0IGNvdWxkIGJlIGFueSBvdGhlciBkYXRhIHRoYXQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24uCisKKyMjIyAyLjMgQ29tcG9uZW50IHJlc3BvbnNpYmlsaXRpZXMKKworRm9yIGV2ZXJ5IGltYWdlIGluIGEgQ2hhaW4gb2YgVHJ1c3QsIHRoZSBmb2xsb3dpbmcgaGlnaCBsZXZlbCBvcGVyYXRpb25zIGFyZQorcGVyZm9ybWVkIHRvIHZlcmlmeSBpdDoKKworMS4gIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGltYWdlIGVpdGhlciBzdGF0aWNhbGx5IG9yIGF0IHJ1bnRpbWUuCisKKzIuICBJZGVudGlmeSB0aGUgaW1hZ2UgYW5kIGxvYWQgaXQgaW4gdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisKKzMuICBDaGVjayB0aGUgaW50ZWdyaXR5IG9mIHRoZSBpbWFnZSBhcyBwZXIgaXRzIHR5cGUuCisKKzQuICBBdXRoZW50aWNhdGUgdGhlIGltYWdlIGFzIHBlciB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG1zIHVzZWQuCisKKzUuICBJZiB0aGUgaW1hZ2UgaXMgYW4gYXV0aGVudGljYXRpb24gaW1hZ2UsIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2lsbAorICAgIGJlIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoZSBuZXh0IGltYWdlIGluIHRoZSBDb1QuCisKK0luIERpYWdyYW0gMSwgZWFjaCBjb21wb25lbnQgaXMgcmVzcG9uc2libGUgZm9yIG9uZSBvciBtb3JlIG9mIHRoZXNlIG9wZXJhdGlvbnMuCitUaGUgcmVzcG9uc2liaWxpdGllcyBhcmUgYnJpZWZseSBkZXNjcmliZWQgYmVsb3cuCisKKworIyMjIyAyLjIuMSBURiBHZW5lcmljIGNvZGUgYW5kIElPIGZyYW1ld29yayAoR0VOL0lPKQorCitUaGVzZSBjb21wb25lbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgaW5pdGlhdGluZyB0aGUgYXV0aGVudGljYXRpb24gcHJvY2VzcyBmb3IgYQorcGFydGljdWxhciBpbWFnZSBpbiBCTDEgb3IgQkwyLiBGb3IgZWFjaCBCTCBpbWFnZSB0aGF0IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uLAordGhlIEdlbmVyaWMgY29kZSBhc2tzIHJlY3Vyc2l2ZWx5IHRoZSBBdXRoZW50aWNhdGlvbiBtb2R1bGUgd2hhdCBpcyB0aGUgcGFyZW50CitpbWFnZSB1bnRpbCBlaXRoZXIgYW4gYXV0aGVudGljYXRlZCBpbWFnZSBvciB0aGUgUk9UIGlzIHJlYWNoZWQuIFRoZW4gdGhlCitHZW5lcmljIGNvZGUgY2FsbHMgdGhlIElPIGZyYW1ld290ayB0byBsb2FkIHRoZSBpbWFnZSBhbmQgY2FsbHMgdGhlCitBdXRoZW50aWNhdGlvbiBtb2R1bGUgdG8gYXV0aGVudGljYXRlIGl0LCBmb2xsb3dpbmcgdGhlIENvVCBmcm9tIFJPVCB0byBJbWFnZS4KKworCisjIyMjIDIuMi4yIFRGIFBsYXRmb3JtIFBvcnQgKFBQKQorCitUaGUgcGxhdGZvcm0gaXMgcmVzcG9uc2libGUgZm9yOgorCisxLiAgU3BlY2lmeWluZyB0aGUgQ29UIGZvciBlYWNoIGltYWdlIHRoYXQgbmVlZHMgdG8gYmUgYXV0aGVudGljYXRlZC4gRGV0YWlscyBvZgorICAgIGhvdyBhIENvVCBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBwbGF0Zm9ybSBhcmUgZXhwbGFpbmVkIGxhdGVyLiBUaGUgcGxhdGZvcm0KKyAgICBhbHNvIHNwZWNpZmllcyB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kcyBhbmQgdGhlIHBhcnNpbmcgbWV0aG9kIHVzZWQgZm9yCisgICAgZWFjaCBpbWFnZS4KKworMi4gIFN0YXRpY2FsbHkgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGVhY2ggcGFyYW1ldGVyIGluIGVhY2ggaW1hZ2Ugd2hpY2ggaXMKKyAgICB1c2VkIGZvciB2ZXJpZnlpbmcgdGhlIENvVCwgZS5nLiBtZW1vcnkgZm9yIHB1YmxpYyBrZXlzLCBoYXNoZXMgZXRjLgorCiszLiAgUHJvdmlkaW5nIHRoZSBST1RQSyBvciBhIGhhc2ggb2YgaXQuCisKKzQuICBQcm92aWRpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgSVBNIHRvIGVuYWJsZSBpdCB0byBpZGVudGlmeSBhbmQKKyAgICBleHRyYWN0IGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIGFuIGltYWdlLCBlLmcuIGlmIHRoZQorICAgIHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBhcyBYNTA5djMgZXh0ZW5zaW9ucywgdGhlIGNvcnJlc3BvbmRpbmcgT0lEIG11c3QgYmUKKyAgICBwcm92aWRlZC4KKworNS4gIEZ1bGZpbGwgYW55IG90aGVyIG1lbW9yeSByZXF1aXJlbWVudHMgb2YgdGhlIElQTSBhbmQgdGhlIENNIChub3QgY3VycmVudGx5CisgICAgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQpLgorCis2LiAgRXhwb3J0IGZ1bmN0aW9ucyB0byB2ZXJpZnkgYW4gaW1hZ2Ugd2hpY2ggdXNlcyBhbiBhdXRoZW50aWNhdGlvbiBtZXRob2QgdGhhdAorICAgIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBieSB0aGUgQ00sIGUuZy4gaWYgYW4gaW1hZ2UgaGFzIHRvIGJlIHZlcmlmaWVkIHVzaW5nIGEKKyAgICBOViBjb3VudGVyLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciB0byBjb21wYXJlIHdpdGggY2FuIG9ubHkgYmUKKyAgICBwcm92aWRlZCBieSB0aGUgcGxhdGZvcm0uCisKKzcuICBFeHBvcnQgYSBjdXN0b20gSVBNIGlmIGEgcHJvcHJpZXRhcnkgaW1hZ2UgZm9ybWF0IGlzIGJlaW5nIHVzZWQgKGRlc2NyaWJlZAorICAgIGxhdGVyKS4KKworCisjIyMjIDIuMi4zIEF1dGhlbnRpY2F0aW9uIE1vZHVsZSAoQU0pCisKK0l0IGlzIHJlc3BvbnNpYmxlIGZvcjoKKworMS4gIFByb3ZpZGluZyB0aGUgbmVjZXNzYXJ5IGFic3RyYWN0aW9uIG1lY2hhbmlzbXMgdG8gZGVzY3JpYmUgYSBDb1QuIEFtb25nc3QKKyAgICBvdGhlciB0aGluZ3MsIHRoZSBhdXRoZW50aWNhdGlvbiBhbmQgaW1hZ2UgcGFyc2luZyBtZXRob2RzIG11c3QgYmUgc3BlY2lmaWVkCisgICAgYnkgdGhlIFBQIGluIHRoZSBDb1QuCisKKzIuICBWZXJpZnlpbmcgdGhlIENvVCBwYXNzZWQgYnkgR0VOIGJ5IHV0aWxpc2luZyBmdW5jdGlvbmFsaXR5IGV4cG9ydGVkIGJ5IHRoZQorICAgIFBQLCBJUE0gYW5kIENNLgorCiszLiAgVHJhY2tpbmcgd2hpY2ggaW1hZ2VzIGhhdmUgYmVlbiB2ZXJpZmllZC4gSW4gY2FzZSBhbiBpbWFnZSBpcyBhIHBhcnQgb2YKKyAgICBtdWx0aXBsZSBDb1RzIHRoZW4gaXQgc2hvdWxkIGJlIHZlcmlmaWVkIG9ubHkgb25jZSBlLmcuIHRoZSBUcnVzdGVkIFdvcmxkCisgICAgS2V5IENlcnRpZmljYXRlIGluIHRoZSBUQkJSLUNsaWVudCBzcGVjLiBjb250YWlucyBpbmZvcm1hdGlvbiB0byB2ZXJpZnkKKyAgICBCTDMtMCwgQkwzLTEsIEJMMy0yIGVhY2ggb2Ygd2hpY2ggaGF2ZSBhIHNlcGFyYXRlIENvVC4gKFRoaXMgcmVzcG9uc2liaWxpdHkKKyAgICBoYXMgbm90IGJlZW4gZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQgYnV0IHNob3VsZCBiZSB0cml2aWFsIHRvIGltcGxlbWVudCkuCisKKzQuICBSZXVzaW5nIG1lbW9yeSBtZWFudCBmb3IgYSBkYXRhIGltYWdlIHRvIHZlcmlmeSBhdXRoZW50aWNhdGlvbiBpbWFnZXMgZS5nLgorICAgIGluIHRoZSBDb1QgZGVzY3JpYmVkIGluIERpYWdyYW0gMiwgZWFjaCBjZXJ0aWZpY2F0ZSBjYW4gYmUgbG9hZGVkIGFuZAorICAgIHZlcmlmaWVkIGluIHRoZSBtZW1vcnkgcmVzZXJ2ZWQgYnkgdGhlIHBsYXRmb3JtIGZvciB0aGUgQkwzLTEgaW1hZ2UuIEJ5IHRoZQorICAgIHRpbWUgQkwzLTEgKHRoZSBkYXRhIGltYWdlKSBpcyBsb2FkZWQsIGFsbCBpbmZvcm1hdGlvbiB0byBhdXRoZW50aWNhdGUgaXQKKyAgICB3aWxsIGhhdmUgYmVlbiBleHRyYWN0ZWQgZnJvbSB0aGUgcGFyZW50IGltYWdlIGkuZS4gQkwzLTEgY29udGVudAorICAgIGNlcnRpZmljYXRlLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHNpemUgb2YgYW4gYXV0aGVudGljYXRpb24gaW1hZ2Ugd2lsbAorICAgIG5ldmVyIGV4Y2VlZCB0aGUgc2l6ZSBvZiBhIGRhdGEgaW1hZ2UuIEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB2ZXJpZnkgdGhpcworICAgIGF0IGJ1aWxkIHRpbWUgdXNpbmcgYXNzZXJ0cy4KKworCisjIyMjIDIuMi40IENyeXB0b2dyYXBoaWMgTW9kdWxlIChDTSkKKworVGhlIENNIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYW4gQVBJIHRvOgorCisxLiAgVmVyaWZ5IGEgZGlnaXRhbCBzaWduYXR1cmUuCisyLiAgVmVyaWZ5IGEgaGFzaC4KKworVGhlIENNIGRvZXMgbm90IGluY2x1ZGUgYW55IGNyeXB0b2dyYXBoeSByZWxhdGVkIGNvZGUsIGJ1dCBpdCByZWxpZXMgb24gYW4KK2V4dGVybmFsIGxpYnJhcnkgdG8gcGVyZm9ybSB0aGUgY3J5cHRvZ3JhcGhpYyBvcGVyYXRpb25zLiBBIENyeXB0by1MaWJyYXJ5IChDTCkKK2xpbmtpbmcgdGhlIENNIGFuZCB0aGUgZXh0ZXJuYWwgbGlicmFyeSBtdXN0IGJlIGltcGxlbWVudGVkLiBUaGUgZm9sbG93aW5nCitmdW5jdGlvbnMgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgQ0w6CisKK2BgYAordm9pZCAoKmluaXQpKHZvaWQpOworaW50ICgqdmVyaWZ5X3NpZ25hdHVyZSkodm9pZCAqZGF0YV9wdHIsIHVuc2lnbmVkIGludCBkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNpZ19wdHIsIHVuc2lnbmVkIGludCBzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc2lnX2FsZywgdW5zaWduZWQgaW50IHNpZ19hbGdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGtfcHRyLCB1bnNpZ25lZCBpbnQgcGtfbGVuKTsKK2ludCAoKnZlcmlmeV9oYXNoKSh2b2lkICpkYXRhX3B0ciwgdW5zaWduZWQgaW50IGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKmRpZ2VzdF9pbmZvX3B0ciwgdW5zaWduZWQgaW50IGRpZ2VzdF9pbmZvX2xlbik7CitgYGAKKworVGhlc2UgZnVuY3Rpb25zIGFyZSByZWdpc3RlcmVkIGluIHRoZSBDTSB1c2luZyB0aGUgbWFjcm86CitgYGAKK1JFR0lTVEVSX0NSWVBUT19MSUIoX25hbWUsIF9pbml0LCBfdmVyaWZ5X3NpZ25hdHVyZSwgX3ZlcmlmeV9oYXNoKTsKK2BgYAorCitgX25hbWVgIG11c3QgYmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgQ0wuIFRoaXMgbmFtZSBpcyB1c2VkIGZvcgorZGVidWdnaW5nIHB1cnBvc2VzLgorCisjIyMjIDIuMi41IEltYWdlIFBhcnNlciBNb2R1bGUgKElQTSkKKworVGhlIElQTSBpcyByZXNwb25zaWJsZSBmb3I6CisKKzEuICBDaGVja2luZyB0aGUgaW50ZWdyaXR5IG9mIGVhY2ggaW1hZ2UgbG9hZGVkIGJ5IHRoZSBJTyBmcmFtZXdvcmsuCisyLiAgRXh0cmFjdGluZyBwYXJhbWV0ZXJzIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW5nIGFuIGltYWdlIGJhc2VkIHVwb24gYQorICAgIGRlc2NyaXB0aW9uIHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSBpbiB0aGUgQ29UIGRlc2NyaXB0b3IuCisKK0ltYWdlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgZm9ybWF0cyAoZm9yIGV4YW1wbGUsIGF1dGhlbnRpY2F0aW9uIGltYWdlcyBjb3VsZCBiZQoreDUwOXYzIGNlcnRpZmljYXRlcywgc2lnbmVkIEVMRiBmaWxlcyBvciBhbnkgb3RoZXIgcGxhdGZvcm0gc3BlY2lmaWMgZm9ybWF0KS4KK1RoZSBJUE0gYWxsb3dzIHRvIHJlZ2lzdGVyIGFuIEltYWdlIFBhcnNlciBMaWJyYXJ5IChJUEwpIGZvciBldmVyeSBpbWFnZSBmb3JtYXQKK3VzZWQgaW4gdGhlIENvVC4gVGhpcyBsaWJyYXJ5IG11c3QgaW1wbGVtZW50IHRoZSBzcGVjaWZpYyBtZXRob2RzIHRvIHBhcnNlIHRoZQoraW1hZ2UuIFRoZSBJUE0gb2J0YWlucyB0aGUgaW1hZ2UgZm9ybWF0IGZyb20gdGhlIENvVCBhbmQgY2FsbHMgdGhlIHJpZ2h0IElQTCB0bworY2hlY2sgdGhlIGltYWdlIGludGVncml0eSBhbmQgZXh0cmFjdCB0aGUgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycy4KKworU2VlIFNlY3Rpb24gIkRlc2NyaWJpbmcgdGhlIGltYWdlIHBhcnNpbmcgbWV0aG9kcyIgZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUKK21lY2hhbmlzbSB0aGUgSVBNIHByb3ZpZGVzIHRvIGRlZmluZSBhbmQgcmVnaXN0ZXIgSVBMcy4KKworCisjIyMgMi4zIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMKKworVGhlIEFNIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXV0aGVudGljYXRpb24gbWV0aG9kczoKKworMS4gIEhhc2gKKzIuICBEaWdpdGFsIHNpZ25hdHVyZQorCitUaGUgcGxhdGZvcm0gbWF5IHNwZWNpZnkgdGhlc2UgbWV0aG9kcyBpbiB0aGUgQ29UIGluIGNhc2UgaXQgZGVjaWRlcyB0byBkZWZpbmUKK2EgY3VzdG9tIENvVCBpbnN0ZWFkIG9mIHJldXNpbmcgYSBwcmVkZWZpbmVkIG9uZS4KKworSWYgYSBkYXRhIGltYWdlIHVzZXMgbXVsdGlwbGUgbWV0aG9kcywgdGhlbiBhbGwgdGhlIG1ldGhvZHMgbXVzdCBiZSBhIHBhcnQgb2YKK3RoZSBzYW1lIENvVC4gVGhlIG51bWJlciBhbmQgdHlwZSBvZiBwYXJhbWV0ZXJzIGFyZSBtZXRob2Qgc3BlY2lmaWMuIFRoZXNlCitwYXJhbWV0ZXJzIHNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBwYXJlbnQgaW1hZ2UgdXNpbmcgdGhlIElQTS4KKworMS4gIEhhc2gKKworICAgIFBhcmFtZXRlcnM6CisKKyAgICAxLiAgQSBwb2ludGVyIHRvIGRhdGEgdG8gaGFzaAorICAgIDIuICBMZW5ndGggb2YgdGhlIGRhdGEKKyAgICA0LiAgQSBwb2ludGVyIHRvIHRoZSBoYXNoCisgICAgNS4gIExlbmd0aCBvZiB0aGUgaGFzaAorCisgICAgVGhlIGhhc2ggd2lsbCBiZSByZXByZXNlbnRlZCBieSB0aGUgREVSIGVuY29kaW5nIG9mIHRoZSBmb2xsb3dpbmcgQVNOLjEKKyAgICB0eXBlOgorCisgICAgYGBgCisgICAgRGlnZXN0SW5mbyA6Oj0gU0VRVUVOQ0UgeworICAgICAgICBkaWdlc3RBbGdvcml0aG0gIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIsCisgICAgICAgIGRpZ2VzdCAgICAgICAgICAgRGlnZXN0CisgICAgfQorICAgIGBgYAorCisgICAgVGhpcyBBU04uMSBzdHJ1Y3R1cmUgbWFrZXMgaXQgcG9zc2libGUgdG8gcmVtb3ZlIGFueSBhc3N1bXB0aW9uIGFib3V0IHRoZQorICAgIHR5cGUgb2YgaGFzaCBhbGdvcml0aG0gdXNlZCBhcyB0aGlzIGluZm9ybWF0aW9uIGFjY29tcGFuaWVzIHRoZSBoYXNoLiBUaGlzCisgICAgc2hvdWxkIGFsbG93IHRoZSBDcnlwdG9ncmFwaHkgTGlicmFyeSAoQ0wpIHRvIHN1cHBvcnQgbXVsdGlwbGUgaGFzaAorICAgIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMuCisKKzIuICBEaWdpdGFsIFNpZ25hdHVyZQorCisgICAgUGFyYW1ldGVyczoKKworICAgIDEuICBBIHBvaW50ZXIgdG8gZGF0YSB0byBzaWduCisgICAgMi4gIExlbmd0aCBvZiB0aGUgZGF0YQorICAgIDMuICBQdWJsaWMgS2V5IEFsZ29yaXRobQorICAgIDQuICBQdWJsaWMgS2V5IHZhbHVlCisgICAgNS4gIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobQorICAgIDYuICBEaWdpdGFsIFNpZ25hdHVyZSB2YWx1ZQorCisgICAgVGhlIFB1YmxpYyBLZXkgcGFyYW1ldGVycyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBERVIgZW5jb2Rpbmcgb2YgdGhlCisgICAgZm9sbG93aW5nIEFTTi4xIHR5cGU6CisKKyAgICBgYGAKKyAgICBTdWJqZWN0UHVibGljS2V5SW5mbyAgOjo9ICBTRVFVRU5DRSAgeworICAgICAgICBhbGdvcml0aG0gICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVye1BVQkxJQy1LRVkse1B1YmxpY0tleUFsZ29yaXRobXN9fSwKKyAgICAgICAgc3ViamVjdFB1YmxpY0tleSAgQklUIFNUUklORyAgfQorICAgIGBgYAorCisgICAgVGhlIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBERVIgZW5jb2Rpbmcgb2YKKyAgICB0aGUgZm9sbG93aW5nIEFTTi4xIHR5cGVzLgorCisgICAgYGBgCisgICAgQWxnb3JpdGhtSWRlbnRpZmllciB7QUxHT1JJVEhNOklPU2V0IH0gOjo9IFNFUVVFTkNFIHsKKyAgICAgICAgYWxnb3JpdGhtICAgICAgICAgQUxHT1JJVEhNLiZpZCh7SU9TZXR9KSwKKyAgICAgICAgcGFyYW1ldGVycyAgICAgICAgQUxHT1JJVEhNLiZUeXBlKHtJT1NldH17QGFsZ29yaXRobX0pIE9QVElPTkFMCisgICAgfQorICAgIGBgYAorCisgICAgVGhlIGRpZ2l0YWwgc2lnbmF0dXJlIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnk6CisgICAgYGBgCisgICAgc2lnbmF0dXJlICA6Oj0gIEJJVCBTVFJJTkcKKyAgICBgYGAKKworVGhlIGF1dGhlbnRpY2F0aW9uIGZyYW1ld29yayB3aWxsIHVzZSB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byBleHRyYWN0IGFsbCB0aGUKK2luZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYXV0aGVudGljYXRpb24uCisKKworMy4gIFNwZWNpZnlpbmcgYSBDaGFpbiBvZiBUcnVzdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIENvVCBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgc2V0IG9mIGltYWdlIGRlc2NyaXB0b3JzIGxpbmtlZCB0b2dldGhlciBpbiBhCitwYXJ0aWN1bGFyIG9yZGVyLiBUaGUgb3JkZXIgZGljdGF0ZXMgdGhlIHNlcXVlbmNlIGluIHdoaWNoIHRoZXkgbXVzdCBiZQordmVyaWZpZWQuIEVhY2ggaW1hZ2UgaGFzIGEgc2V0IG9mIHByb3BlcnRpZXMgd2hpY2ggYWxsb3cgdGhlIEFNIHRvIHZlcmlmeSBpdC4KK1RoZXNlIHByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKworVGhlIFBQIGlzIHJlc3BvbnNpYmxlIGZvciBkZWZpbmluZyBhIHNpbmdsZSBvciBtdWx0aXBsZSBDb1RzIGZvciBhIGRhdGEgaW1hZ2UuCitVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgdGhlIGRhdGEgc3RydWN0dXJlcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZworc2VjdGlvbnMgYXJlIHBvcHVsYXRlZCBieSB0aGUgUFAgc3RhdGljYWxseS4KKworCisjIyMgMy4xIERlc2NyaWJpbmcgdGhlIGltYWdlIHBhcnNpbmcgbWV0aG9kcworCitUaGUgcGFyc2luZyBtZXRob2QgcmVmZXJzIHRvIHRoZSBmb3JtYXQgb2YgYSBwYXJ0aWN1bGFyIGltYWdlLiBGb3IgZXhhbXBsZSwgYW4KK2F1dGhlbnRpY2F0aW9uIGltYWdlIHRoYXQgcmVwcmVzZW50cyBhIGNlcnRpZmljYXRlIGNvdWxkIGJlIGluIHRoZSBYLjUwOXYzCitmb3JtYXQuIEEgZGF0YSBpbWFnZSB0aGF0IHJlcHJlc2VudHMgYSBib290IGxvYWRlciBzdGFnZSBjb3VsZCBiZSBpbiByYXcgYmluYXJ5CitvciBFTEYgZm9ybWF0LiBUaGUgSVBNIHN1cHBvcnRzIHRocmVlIHBhcnNpbmcgbWV0aG9kcy4gQW4gaW1hZ2UgaGFzIHRvIHVzZSBvbmUKK29mIHRoZSB0aHJlZSBtZXRob2RzIGRlc2NyaWJlZCBiZWxvdy4gQW4gSVBMIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcnByZXRpbmcgYQorc2luZ2xlIHBhcnNpbmcgbWV0aG9kLiBUaGVyZSBoYXMgdG8gYmUgb25lIElQTCBmb3IgZXZlcnkgbWV0aG9kIHVzZWQgYnkgdGhlCitwbGF0Zm9ybS4KKworMS4gIFJhdyBmb3JtYXQ6IFRoaXMgZm9ybWF0IGlzIGVmZmVjdGl2ZWx5IGEgbm9wIGFzIGFuIGltYWdlIHVzaW5nIHRoaXMgbWV0aG9kCisgICAgaXMgdHJlYXRlZCBhcyBiZWluZyBpbiByYXcgYmluYXJ5IGZvcm1hdCBlLmcuIGJvb3QgbG9hZGVyIGltYWdlcyB1c2VkIGJ5IEFSTQorICAgIFRGLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGRhdGEgaW1hZ2VzLgorCisyLiAgWDUwOVYzIG1ldGhvZDogVGhpcyBtZXRob2QgdXNlcyBpbmR1c3RyeSBzdGFuZGFyZHMgbGlrZSBYLjUwOSB0byByZXByZXNlbnQKKyAgICBQS0kgY2VydGlmaWNhdGVzIChhdXRoZW50aWNhdGlvbiBpbWFnZXMpLiBJdCBpcyBleHBlY3RlZCB0aGF0IG9wZW4gc291cmNlCisgICAgbGlicmFyaWVzIHdpbGwgYmUgYXZhaWxhYmxlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBhcnNlIGFuIGltYWdlIHJlcHJlc2VudGVkCisgICAgYnkgdGhpcyBtZXRob2QuIFN1Y2ggbGlicmFyaWVzIGNhbiBiZSB1c2VkIHRvIHdyaXRlIHRoZSBjb3JyZXNwb25kaW5nIElQTAorICAgIGUuZy4gdGhlIFguNTA5IHBhcnNpbmcgbGlicmFyeSBjb2RlIGluIFBvbGFyU1NMLgorCiszLiAgUGxhdGZvcm0gZGVmaW5lZCBtZXRob2Q6IFRoaXMgbWV0aG9kIGNhdGVycyBmb3IgcGxhdGZvcm0gc3BlY2lmaWMKKyAgICBwcm9wcmlldGFyeSBzdGFuZGFyZHMgdG8gcmVwcmVzZW50IGF1dGhlbnRpY2F0aW9uIG9yIGRhdGEgaW1hZ2VzLiBGb3IKKyAgICBleGFtcGxlLCBUaGUgc2lnbmF0dXJlIG9mIGEgZGF0YSBpbWFnZSBjb3VsZCBiZSBhcHBlbmRlZCB0byB0aGUgZGF0YSBpbWFnZQorICAgIHJhdyBiaW5hcnkuIEEgaGVhZGVyIGNvdWxkIGJlIHByZXBlbmRlZCB0byB0aGUgY29tYmluZWQgYmxvYiB0byBzcGVjaWZ5IHRoZQorICAgIGV4dGVudHMgb2YgZWFjaCBjb21wb25lbnQuIFRoZSBwbGF0Zm9ybSB3aWxsIGhhdmUgdG8gaW1wbGVtZW50IHRoZQorICAgIGNvcnJlc3BvbmRpbmcgSVBMIHRvIGludGVycHJldCBzdWNoIGEgZm9ybWF0LgorCitUaGUgZm9sbG93aW5nIGVudW0gY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZXNlIHRocmVlIG1ldGhvZHMuCisKK2BgYAordHlwZWRlZiBlbnVtIGltZ190eXBlX2VudW0geworCUlNR19SQVcsCQkJLyogQmluYXJ5IGltYWdlICovCisJSU1HX1BMQVQsCQkJLyogUGxhdGZvcm0gc3BlY2lmaWMgZm9ybWF0ICovCisJSU1HX0NFUlQsCQkJLyogWDUwOXYzIGNlcnRpZmljYXRlICovCisJSU1HX01BWF9UWVBFUywKK30gaW1nX3R5cGVfdDsKK2BgYAorCitBbiBJUEwgbXVzdCBwcm92aWRlIGZ1bmN0aW9ucyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlczoKKworYGBgCit2b2lkIGluaXQodm9pZCk7CitpbnQgY2hlY2tfaW50ZWdyaXR5KHZvaWQgKmltZywgdW5zaWduZWQgaW50IGltZ19sZW4pOworaW50IGdldF9hdXRoX3BhcmFtKGNvbnN0IGF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgKnR5cGVfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbWcsIHVuc2lnbmVkIGludCBpbWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwYXJhbSwgdW5zaWduZWQgaW50ICpwYXJhbV9sZW4pOworYGBgCisKK0FuIElQTCBmb3IgZWFjaCB0eXBlIG11c3QgYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIG1hY3JvOgorCitgYGAKK1JFR0lTVEVSX0lNR19QQVJTRVJfTElCKF90eXBlLCBfbmFtZSwgX2luaXQsIF9jaGVja19pbnQsIF9nZXRfcGFyYW0pCitgYGAKKworKiAgIGBfdHlwZWA6IG9uZSBvZiB0aGUgdHlwZXMgZGVzY3JpYmVkIGFib3ZlLgorKiAgIGBfbmFtZWA6IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIElQTCBuYW1lIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisqICAgYF9pbml0YDogaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gcG9pbnRlci4KKyogICBgX2NoZWNrX2ludGA6IGNoZWNrIGltYWdlIGludGVncml0eSBmdW5jdGlvbiBwb2ludGVyLgorKiAgIGBfZ2V0X3BhcmFtYDogZXh0cmFjdCBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXIgZnVuY2lvbiBwb2ludGVyLgorCitUaGUgYGluaXQoKWAgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIElQTC4KKworVGhlIGBjaGVja19pbnRlZ3JpdHkoKWAgZnVuY3Rpb24gaXMgcGFzc2VkIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IHdoZXJlIHRoZQoraW1hZ2UgaGFzIGJlZW4gbG9hZGVkIGJ5IHRoZSBJTyBmcmFtZXdvcmsgYW5kIHRoZSBpbWFnZSBsZW5ndGguIEl0IHNob3VsZCBlbnN1cmUKK3RoYXQgdGhlIGltYWdlIGlzIGluIHRoZSBmb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGUgcGFyc2luZyBtZXRob2QgYW5kIGhhcyBub3QKK2JlZW4gdGFtcGVyZWQgd2l0aC4gRm9yIGV4YW1wbGUsIFJGQy0yNDU5IGRlc2NyaWJlcyBhIHZhbGlkYXRpb24gc2VxdWVuY2UgZm9yIGFuCitYLjUwOSBjZXJ0aWZpY2F0ZS4KKworVGhlIGBnZXRfYXV0aF9wYXJhbSgpYCBmdW5jdGlvbiBpcyBwYXNzZWQgYSBwYXJhbWV0ZXIgZGVzY3JpcHRvciBjb250YWluaW5nCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyYW1ldGVyIChgdHlwZV9kZXNjYCBhbmQgYGNvb2tpZWApIHRvIGlkZW50aWZ5IGFuZAorZXh0cmFjdCB0aGUgZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgcGFyYW1ldGVyIGZyb20gYW4gaW1hZ2UuIFRoaXMgZGF0YSB3aWxsCitiZSB1c2VkIHRvIHZlcmlmeSBlaXRoZXIgdGhlIGN1cnJlbnQgb3IgdGhlIG5leHQgaW1hZ2UgaW4gdGhlIENvVCBzZXF1ZW5jZS4KKworRWFjaCBpbWFnZSBpbiB0aGUgQ29UIHdpbGwgc3BlY2lmeSB0aGUgcGFyc2luZyBtZXRob2QgaXQgdXNlcy4gVGhpcyBpbmZvcm1hdGlvbgord2lsbCBiZSB1c2VkIGJ5IHRoZSBJUE0gdG8gZmluZCB0aGUgcmlnaHQgcGFyc2VyIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZS4KKworCisjIyMgMy4yIERlc2NyaWJpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZChzKQorCitBcyBwYXJ0IG9mIHRoZSBDb1QsIGVhY2ggaW1hZ2UgaGFzIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgYXV0aGVudGljYXRpb24gbWV0aG9kcword2hpY2ggd2lsbCBiZSB1c2VkIHRvIHZlcmlmeSBpdC4gQXMgZGVzY3JpYmVkIGluIHRoZSBTZWN0aW9uICJBdXRoZW50aWNhdGlvbgorbWV0aG9kcyIsIHRoZXJlIGFyZSB0aHJlZSBtZXRob2RzIHN1cHBvcnRlZCBieSB0aGUgQU0uCisKK2BgYAordHlwZWRlZiBlbnVtIHsKKwlBVVRIX01FVEhPRF9OT05FLAorCUFVVEhfTUVUSE9EX0hBU0gsCisJQVVUSF9NRVRIT0RfU0lHLAorCUFVVEhfTUVUSE9EX05VTQorfSBhdXRoX21ldGhvZF90eXBlX3Q7CitgYGAKKworVGhlIEFNIGRlZmluZXMgdGhlIHR5cGUgb2YgZWFjaCBwYXJhbWV0ZXIgdXNlZCBieSBhbiBhdXRoZW50aWNhdGlvbiBtZXRob2QuIEl0Cit1c2VzIHRoaXMgaW5mb3JtYXRpb24gdG86CisKKzEuICBTcGVjaWZ5IHRvIHRoZSBgZ2V0X2F1dGhfcGFyYW0oKWAgZnVuY3Rpb24gZXhwb3J0ZWQgYnkgdGhlIElQTSwgd2hpY2gKKyAgICBwYXJhbWV0ZXIgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIGFuIGltYWdlLgorCisyLiAgQ29ycmVjdGx5IG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzIHdoaWxlIGNhbGxpbmcgdGhlIHZlcmlmaWNhdGlvbiBmdW5jdGlvbgorICAgIGV4cG9ydGVkIGJ5IHRoZSBDTSBhbmQgUFAuCisKKzMuICBFeHRyYWN0IGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMgZnJvbSBhIHBhcmVudCBpbWFnZSBpbiBvcmRlciB0byB2ZXJpZnkgYQorICAgIGNoaWxkIGltYWdlIGUuZy4gdG8gdmVyaWZ5IHRoZSBjZXJ0aWZpY2F0ZSBpbWFnZSwgdGhlIHB1YmxpYyBrZXkgaGFzIHRvIGJlCisgICAgb2J0YWluZWQgZnJvbSB0aGUgcGFyZW50IGltYWdlLgorCitgYGAKK3R5cGVkZWYgZW51bSB7CisJQVVUSF9QQVJBTV9OT05FLAorCUFVVEhfUEFSQU1fUkFXX0RBVEEsCQkvKiBSYXcgaW1hZ2UgZGF0YSAqLworCUFVVEhfUEFSQU1fU0lHLAkJCS8qIFRoZSBpbWFnZSBzaWduYXR1cmUgKi8KKwlBVVRIX1BBUkFNX1NJR19BTEcsCQkvKiBUaGUgaW1hZ2Ugc2lnbmF0dXJlIGFsZ29yaXRobSAqLworCUFVVEhfUEFSQU1fSEFTSCwJCS8qIEEgaGFzaCAoaW5jbHVkaW5nIHRoZSBhbGdvcml0aG0pICovCisJQVVUSF9QQVJBTV9QVUJfS0VZLAkJLyogQSBwdWJsaWMga2V5ICovCit9IGF1dGhfcGFyYW1fdHlwZV90OworYGBgCisKK1RoZSBBTSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHRvIGlkZW50aWZ5IGFuIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcgorcmVxdWlyZWQgdG8gdmVyaWZ5IGFuIGltYWdlLgorCitgYGAKK3R5cGVkZWYgc3RydWN0IGF1dGhfcGFyYW1fdHlwZV9kZXNjX3MgeworICAgIGF1dGhfcGFyYW1fdHlwZV90IHR5cGU7CisgICAgdm9pZCAqY29va2llOworfSBhdXRoX3BhcmFtX3R5cGVfZGVzY190OworYGBgCisKK2Bjb29raWVgIGlzIHVzZWQgYnkgdGhlIHBsYXRmb3JtIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgSVBNCit3aGljaCBlbmFibGVzIGl0IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBwYXJhbWV0ZXIgdGhhdCBzaG91bGQgYmUgZXh0cmFjdGVkCitmcm9tIGFuIGltYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGhhc2ggb2YgYSBCTDMteCBpbWFnZSBpbiBpdHMgY29ycmVzcG9uZGluZworY29udGVudCBjZXJ0aWZpY2F0ZSBpcyBzdG9yZWQgaW4gYW4gWDUwOXYzIGN1c3RvbSBleHRlbnNpb24gZmllbGQuIEFuIGV4dGVuc2lvbgorZmllbGQgY2FuIG9ubHkgYmUgaWRlbnRpZmllZCB1c2luZyBhbiBPSUQuIEluIHRoaXMgY2FzZSwgdGhlIGBjb29raWVgIGNvdWxkCitjb250YWluIHRoZSBwb2ludGVyIHRvIHRoZSBPSUQgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0gZm9yIHRoZSBoYXNoIGV4dGVuc2lvbgorZmllbGQgd2hpbGUgdGhlIGB0eXBlYCBmaWVsZCBjb3VsZCBiZSBzZXQgdG8gYEFVVEhfUEFSQU1fSEFTSGAuIEEgdmFsdWUgb2YgMCBmb3IKK3RoZSBgY29va2llYCBmaWVsZCBtZWFucyB0aGF0IGl0IGlzIG5vdCB1c2VkLgorCitGb3IgZWFjaCBtZXRob2QsIHRoZSBBTSBkZWZpbmVzIGEgc3RydWN0dXJlIHdpdGggdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgdG8KK3ZlcmlmeSB0aGUgaW1hZ2UuCisKK2BgYAorLyoKKyAqIFBhcmFtZXRlcnMgZm9yIGF1dGhlbnRpY2F0aW9uIGJ5IGhhc2ggbWF0Y2hpbmcKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXV0aF9tZXRob2RfcGFyYW1faGFzaF9zIHsKKwlhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpkYXRhOwkvKiBEYXRhIHRvIGhhc2ggKi8KKwlhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpoYXNoOwkvKiBIYXNoIHRvIG1hdGNoIHdpdGggKi8KK30gYXV0aF9tZXRob2RfcGFyYW1faGFzaF90OworCisvKgorICogUGFyYW1ldGVycyBmb3IgYXV0aGVudGljYXRpb24gYnkgc2lnbmF0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IGF1dGhfbWV0aG9kX3BhcmFtX3NpZ19zIHsKKwlhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpwazsJLyogUHVibGljIGtleSAqLworCWF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgKnNpZzsJLyogU2lnbmF0dXJlIHRvIGNoZWNrICovCisJYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqYWxnOwkvKiBTaWduYXR1cmUgYWxnb3JpdGhtICovCisJYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqdGJzOwkvKiBEYXRhIHNpZ25lZCAqLworfSBhdXRoX21ldGhvZF9wYXJhbV9zaWdfdDsKKworYGBgCisKK1RoZSBBTSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGFuIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBmb3IKK3ZlcmlmeWluZyBhbiBpbWFnZQorCitgYGAKKy8qCisgKiBBdXRoZW50aWNhdGlvbiBtZXRob2QgZGVzY3JpcHRvcgorICovCit0eXBlZGVmIHN0cnVjdCBhdXRoX21ldGhvZF9kZXNjX3MgeworCWF1dGhfbWV0aG9kX3R5cGVfdCB0eXBlOworCXVuaW9uIHsKKwkJYXV0aF9tZXRob2RfcGFyYW1faGFzaF90IGhhc2g7CisJCWF1dGhfbWV0aG9kX3BhcmFtX3NpZ190IHNpZzsKKwl9IHBhcmFtOworfSBhdXRoX21ldGhvZF9kZXNjX3Q7CitgYGAKKworVXNpbmcgdGhlIG1ldGhvZCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgYHR5cGVgIGZpZWxkLCB0aGUgQU0gZmluZHMgb3V0IHdoYXQgZmllbGQKK25lZWRzIHRvIGFjY2VzcyB3aXRoaW4gdGhlIGBwYXJhbWAgdW5pb24uCisKKyMjIyAzLjMgU3RvcmluZyBBdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzCisKK0EgcGFyYW1ldGVyIGRlc2NyaWJlZCBieSBgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdGAgdG8gdmVyaWZ5IGFuIGltYWdlIGNvdWxkIGJlCitvYnRhaW5lZCBmcm9tIGVpdGhlciB0aGUgaW1hZ2UgaXRzZWxmIG9yIGl0cyBwYXJlbnQgaW1hZ2UuIFRoZSBtZW1vcnkgYWxsb2NhdGVkCitmb3IgbG9hZGluZyB0aGUgcGFyZW50IGltYWdlIHdpbGwgYmUgcmV1c2VkIGZvciBsb2FkaW5nIHRoZSBjaGlsZCBpbWFnZS4gSGVuY2UKK3BhcmFtZXRlcnMgd2hpY2ggYXJlIG9idGFpbmVkIGZyb20gdGhlIHBhcmVudCBmb3IgdmVyaWZ5aW5nIGEgY2hpbGQgaW1hZ2UgbmVlZAordG8gaGF2ZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGVtIHNlcGFyYXRlbHkgd2hlcmUgdGhleSBjYW4gYmUgc3RvcmVkLiBUaGlzCittZW1vcnkgbXVzdCBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBieSB0aGUgcGxhdGZvcm0gcG9ydC4KKworVGhlIEFNIGRlZmluZXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGRhdGEgY29ycmVzcG9uZGluZyB0byBhbgorYXV0aGVudGljYXRpb24gcGFyYW1ldGVyLgorCitgYGAKK3R5cGVkZWYgc3RydWN0IGF1dGhfcGFyYW1fZGF0YV9kZXNjX3MgeworCXZvaWQgKmF1dGhfcGFyYW1fcHRyOworCXVuc2lnbmVkIGludCBhdXRoX3BhcmFtX2xlbjsKK30gYXV0aF9wYXJhbV9kYXRhX2Rlc2NfdDsKK2BgYAorCitUaGUgYGF1dGhfcGFyYW1fcHRyYCBmaWVsZCBpcyBpbml0aWFsaXplZCBieSB0aGUgcGxhdGZvcm0uIFRoZSBgYXV0aF9wYXJhbV9sZW5gCitmaWVsZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgbWVtb3J5LgorCitGb3IgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBjaGlsZCBpbWFnZSBpdHNlbGYsIHRoZSBJUE0gaXMKK3Jlc3BvbnNpYmxlIGZvciBwb3B1bGF0aW5nIHRoZSBgYXV0aF9wYXJhbV9wdHJgIGFuZCBgYXV0aF9wYXJhbV9sZW5gIGZpZWxkcword2hpbGUgZXhlY3V0aW5nIHRoZSBgaW1nX2dldF9hdXRoX3BhcmFtKClgIGZ1bmN0aW9uLgorCitUaGUgQU0gZGVmaW5lcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSB0byBlbmFibGUgYW4gaW1hZ2UgdG8gZGVzY3JpYmUgdGhlCitwYXJhbWV0ZXJzIHRoYXQgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIGl0IGFuZCB1c2VkIHRvIHZlcmlmeSB0aGUgbmV4dCBpbWFnZQorKGNoaWxkKSBpbiBhIENvVC4KKworYGBgCit0eXBlZGVmIHN0cnVjdCBhdXRoX3BhcmFtX2Rlc2NfcyB7CisJYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCB0eXBlX2Rlc2M7CisJYXV0aF9wYXJhbV9kYXRhX2Rlc2NfdCBkYXRhOworfSBhdXRoX3BhcmFtX2Rlc2NfdDsKK2BgYAorCisjIyMgMy40IERlc2NyaWJpbmcgYW4gaW1hZ2UgaW4gYSBDb1QKKworQW4gaW1hZ2UgaW4gYSBDb1QgaXMgYSBjb25zb2xpZGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgYXNwZWN0cyBvZiBhIENvVCBkZXNjcmliZWQKK2Fib3ZlLgorCisxLiAgQSB1bmlxdWUgaWRlbnRpZmllciBzcGVjaWZpZWQgYnkgdGhlIHBsYXRmb3JtIHdoaWNoIGFsbG93cyB0aGUgSU8gZnJhbWV3b3JrCisgICAgdG8gbG9jYXRlIHRoZSBpbWFnZSBpbiBhIEZJUCBhbmQgbG9hZCBpdCBpbiB0aGUgbWVtb3J5IHJlc2VydmVkIGZvciB0aGUgZGF0YQorICAgIGltYWdlIGluIHRoZSBDb1QuCisKKzIuICBBIHBhcnNpbmcgbWV0aG9kIHdoaWNoIGlzIHVzZWQgYnkgdGhlIEFNIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIElQTS4KKworMy4gIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgYW5kIHRoZWlyIHBhcmFtZXRlcnMgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cworICAgIHNlY3Rpb24uIFRoZXNlIGFyZSB1c2VkIHRvIHZlcmlmeSB0aGUgY3VycmVudCBpbWFnZS4KKworNC4gIFBhcmFtZXRlcnMgd2hpY2ggYXJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBuZXh0IGltYWdlIGluIHRoZSBjdXJyZW50IENvVC4gVGhlc2UKKyAgICBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgb25seSBieSBhdXRoZW50aWNhdGlvbiBpbWFnZXMgYW5kIGNhbiBiZSBleHRyYWN0ZWQKKyAgICBmcm9tIHRoZSBjdXJyZW50IGltYWdlIG9uY2UgaXQgaGFzIGJlZW4gdmVyaWZpZWQuCisKK1RoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGFuIGltYWdlIGluIGEgQ29ULgorYGBgCit0eXBlZGVmIHN0cnVjdCBhdXRoX2ltZ19kZXNjX3MgeworCXVuc2lnbmVkIGludCBpbWdfaWQ7CisJY29uc3Qgc3RydWN0IGF1dGhfaW1nX2Rlc2NfcyAqcGFyZW50OworCWltZ190eXBlX3QgaW1nX3R5cGU7CisJYXV0aF9tZXRob2RfZGVzY190IGltZ19hdXRoX21ldGhvZHNbQVVUSF9NRVRIT0RfTlVNXTsKKwlhdXRoX3BhcmFtX2Rlc2NfdCBhdXRoZW50aWNhdGVkX2RhdGFbQ09UX01BWF9WRVJJRklFRF9QQVJBTVNdOworfSBhdXRoX2ltZ19kZXNjX3Q7CitgYGAKK0EgQ29UIGlzIGRlZmluZWQgYXMgYW4gYXJyYXkgb2YgYGF1dGhfaW1hZ2VfZGVzY190YCBzdHJ1Y3R1cmVzIGxpbmtlZCB0b2dldGhlcgorYnkgdGhlIGBwYXJlbnRgIGZpZWxkLiBUaG9zZSBub2RlcyB3aXRoIG5vIHBhcmVudCBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdXNpbmcKK3RoZSBST1RQSyBzdG9yZWQgaW4gdGhlIHBsYXRmb3JtLgorCisKKzQuICBJbXBsZW1lbnRhdGlvbiBleGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gaXMgYSBkZXRhaWxlZCBndWlkZSBleHBsYWluaW5nIGEgdHJ1c3RlZCBib290IGltcGxlbWVudGF0aW9uIHVzaW5nCit0aGUgYXV0aGVudGljYXRpb24gZnJhbWV3b3JrLiBUaGlzIGV4YW1wbGUgY29ycmVzcG9uZHMgdG8gdGhlIEFwcGxpY2F0aXZlCitGdW5jdGlvbmFsIE1vZGUgKEFGTSkgYXMgc3BlY2lmaWVkIGluIHRoZSBUQkJSLUNsaWVudCBkb2N1bWVudC4gSXQgaXMKK3JlY29tbWVuZGVkIHRvIHJlYWQgdGhpcyBndWlkZSBhbG9uZyB3aXRoIHRoZSBzb3VyY2UgY29kZS4KKworIyMjIDQuMSBUaGUgVEJCUiBDb1QKKworVGhlIENvVCBjYW4gYmUgZm91bmQgaW4gYGRyaXZlcnMvYXV0aC90YmJyL3RiYnJfY290LmNgLiBUaGlzIENvVCBjb25zaXN0cyBvZiBhbgorYXJyYXkgb2YgaW1hZ2UgZGVzY3JpcHRvcnMgYW5kIGl0IGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGZyYW1ld29yayB1c2luZyB0aGUgbWFjcm8KK2BSRUdJU1RFUl9DT1QoY290X2Rlc2MpYCwgd2hlcmUgJ2NvdF9kZXNjJyBtdXN0IGJlIHRoZSBuYW1lIG9mIHRoZSBhcnJheQorKHBhc3NpbmcgYSBwb2ludGVyIG9yIGFueSBvdGhlciB0eXBlIG9mIGluZGlyZWN0aW9uIHdpbGwgY2F1c2UgdGhlIHJlZ2lzdHJhdGlvbgorcHJvY2VzcyB0byBmYWlsKS4KKworVGhlIG51bWJlciBvZiBpbWFnZXMgcGFydGljaXBhdGluZyBpbiB0aGUgYm9vdCBwcm9jZXNzIGRlcGVuZHMgb24gdGhlIENvVC4gVGhlcmUKK2lzLCBob3dldmVyLCBhIG1pbmltdW0gc2V0IG9mIGltYWdlcyB0aGF0IGFyZSBtYW5kYXRvcnkgaW4gdGhlIFRydXN0ZWQgRmlybXdhcmUKK2FuZCB0aHVzIGFsbCBDb1RzIG11c3QgcHJlc2VudDoKKworKiAgIGBCTDJgCisqICAgYEJMMy0wYCAocGxhdGZvcm0gc3BlY2lmaWMpCisqICAgYEJMMy0xYAorKiAgIGBCTDMtMmAgKG9wdGlvbmFsKQorKiAgIGBCTDMtM2AKKworVGhlIFRCQlIgc3BlY2lmaWVzIHRoZSBhZGRpdGlvbmFsIGNlcnRpZmljYXRlcyB0aGF0IG11c3QgYWNjb21wYW55IHRoZXNlIGltYWdlcworZm9yIGEgcHJvcGVyIGF1dGhlbnRpY2F0aW9uLiBEZXRhaWxzIGFib3V0IHRoZSBUQkJSIENvVCBtYXkgYmUgZm91bmQgaW4gdGhlCitbVHJ1c3RlZCBCb2FyZCBCb290XSBkb2N1bWVudC4KKworRm9sbG93aW5nIHRoZSBbUGxhdGZvcm0gUG9ydGluZyBHdWlkZV0sIGEgcGxhdGZvcm0gbXVzdCBwcm92aWRlIHVuaXF1ZQoraWRlbnRpZmllcnMgZm9yIGFsbCB0aGUgaW1hZ2VzIGFuZCBjZXJ0aWZpY2F0ZXMgdGhhdCB3aWxsIGJlIGxvYWRlZCBkdXJpbmcgdGhlCitib290IHByb2Nlc3MuIElmIGEgcGxhdGZvcm0gaXMgdXNpbmcgdGhlIFRCQlIgYXMgYSByZWZlcmVuY2UgZm9yIHRydXN0ZWQgYm9vdCwKK3RoZXNlIGlkZW50aWZpZXJzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGBpbmNsdWRlL2NvbW1vbi90YmJyL3RiYnJfaW1nX2RlZi5oYC4KK0FSTSBwbGF0Zm9ybXMgaW5jbHVkZSB0aGlzIGZpbGUgaW4gYGluY2x1ZGUvcGxhdC9hcm0vY29tbW9uL2FybV9kZWYuaGAuIE90aGVyCitwbGF0Zm9ybXMgbWF5IGFsc28gaW5jbHVkZSB0aGlzIGZpbGUgb3IgcHJvdmlkZSB0aGVpciBvd24gaWRlbnRpZmllcnMuCisKKyoqSW1wb3J0YW50Kio6IHRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgdXNlcyB0aGVzZSBpZGVudGlmaWVycyB0byBpbmRleCB0aGUKK0NvVCBhcnJheSwgc28gdGhlIGRlc2NyaXB0b3JzIGxvY2F0aW9uIGluIHRoZSBhcnJheSBtdXN0IG1hdGNoIHRoZSBpZGVudGlmaWVycy4KKworRWFjaCBpbWFnZSBkZXNjcmlwdG9yIG11c3Qgc3BlY2lmeToKKworKiAgIGBpbWdfaWRgOiB0aGUgY29ycmVzcG9uZGluZyBpbWFnZSB1bmlxdWUgaWRlbnRpZmllciBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4KKyogICBgaW1nX3R5cGVgOiB0aGUgaW1hZ2UgcGFyc2VyIG1vZHVsZSB1c2VzIHRoZSBpbWFnZSB0eXBlIHRvIGNhbGwgdGhlIHByb3BlcgorICAgIHBhcnNpbmcgbGlicmFyeSB0byBjaGVjayB0aGUgaW1hZ2UgaW50ZWdyaXR5IGFuZCBleHRyYWN0IHRoZSByZXF1aXJlZAorICAgIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMuIFRocmVlIHR5cGVzIG9mIGltYWdlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDoKKyAgICAqICAgYElNR19SQVdgOiBpbWFnZSBpcyBhIHJhdyBiaW5hcnkuIE5vIHBhcnNpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUsCisgICAgICAgIG90aGVyIHRoYW4gcmVhZGluZyB0aGUgd2hvbGUgaW1hZ2UuCisgICAgKiAgIGBJTUdfUExBVGA6IGltYWdlIGZvcm1hdCBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4gVGhlIHBsYXRmb3JtIG1heSB1c2UgdGhpcworICAgICAgICB0eXBlIGZvciBjdXN0b20gaW1hZ2VzIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGZyYW1ld29yay4KKyAgICAqICAgYElNR19DRVJUYDogaW1hZ2UgaXMgYW4geDUwOXYzIGNlcnRpZmljYXRlLgorKiAgIGBwYXJlbnRgOiBwb2ludGVyIHRvIHRoZSBwYXJlbnQgaW1hZ2UgZGVzY3JpcHRvci4gVGhlIHBhcmVudCB3aWxsIGNvbnRhaW4KKyAgICB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIHRoZSBjdXJyZW50IGltYWdlLiBJZiB0aGUgcGFyZW50CisgICAgaXMgTlVMTCwgdGhlIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBwbGF0Zm9ybQorICAgIChpLmUuIHRoZSBCTDIgYW5kIFRydXN0ZWQgS2V5IGNlcnRpZmljYXRlcyBhcmUgc2lnbmVkIHdpdGggdGhlIFJPVCBwcml2YXRlCisgICAga2V5LCB3aG9zZSBwdWJsaWMgcGFydCBpcyBzdG9yZWQgaW4gdGhlIHBsYXRmb3JtKS4KKyogICBgaW1nX2F1dGhfbWV0aG9kc2A6IHRoaXMgYXJyYXkgZGVmaW5lcyB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kcyB0aGF0IG11c3QKKyAgICBiZSBjaGVja2VkIHRvIGNvbnNpZGVyIGFuIGltYWdlIGF1dGhlbnRpY2F0ZWQuIEVhY2ggbWV0aG9kIGNvbnNpc3RzIG9mIGEKKyAgICB0eXBlIGFuZCBhIGxpc3Qgb2YgcGFyYW1ldGVyIGRlc2NyaXB0b3JzLiBBIHBhcmFtZXRlciBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mCisgICAgYSB0eXBlIGFuZCBhIGNvb2tpZSB3aGljaCB3aWxsIHBvaW50IHRvIHNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvCisgICAgZXh0cmFjdCB0aGF0IHBhcmFtZXRlciBmcm9tIHRoZSBpbWFnZSAoaS5lLiBpZiB0aGUgcGFyYW1ldGVyIGlzIHN0b3JlZCBpbiBhbgorICAgIHg1MDl2MyBleHRlbnNpb24sIHRoZSBjb29raWUgd2lsbCBwb2ludCB0byB0aGUgZXh0ZW5zaW9uIE9JRCkuIERlcGVuZGluZyBvbgorICAgIHRoZSBtZXRob2QgdHlwZSwgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQuCisgICAgU3VwcG9ydGVkIG1ldGhvZHMgYXJlOgorICAgICogICBgQVVUSF9NRVRIT0RfSEFTSGA6IHRoZSBoYXNoIG9mIHRoZSBpbWFnZSBtdXN0IG1hdGNoIHRoZSBoYXNoIGV4dHJhY3RlZAorICAgICAgICBmcm9tIHRoZSBwYXJlbnQgaW1hZ2UuIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIG11c3QgYmUKKyAgICAgICAgc3BlY2lmaWVkOgorICAgICAgICAqICAgYGRhdGFgOiBkYXRhIHRvIGJlIGhhc2hlZCAob2J0YWluZWQgZnJvbSBjdXJyZW50IGltYWdlKQorICAgICAgICAqICAgYGhhc2hgOiByZWZlcmVuY2UgaGFzaCAob2J0YWluZWQgZnJvbSBwYXJlbnQgaW1hZ2UpCisgICAgKiAgIGBBVVRIX01FVEhPRF9TSUdgOiB0aGUgaW1hZ2UgKHVzdWFsbHkgYSBjZXJ0aWZpY2F0ZSkgbXVzdCBiZSBzaWduZWQgd2l0aAorICAgICAgICB0aGUgcHJpdmF0ZSBrZXkgd2hvc2UgcHVibGljIHBhcnQgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHBhcmVudCBpbWFnZSAob3IKKyAgICAgICAgdGhlIHBsYXRmb3JtIGlmIHRoZSBwYXJlbnQgaXMgTlVMTCkuIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIGRlc2NyaXB0b3JzCisgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkOgorICAgICAgICAqICAgYHBrYDogdGhlIHB1YmxpYyBrZXkgKG9idGFpbmVkIGZyb20gcGFyZW50IGltYWdlKQorICAgICAgICAqICAgYHNpZ2A6IHRoZSBkaWdpdGFsIHNpZ25hdHVyZSAob2J0YWluZWQgZnJvbSBjdXJyZW50IGltYWdlKQorICAgICAgICAqICAgYGFsZ2A6IHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIHVzZWQgKG9idGFpbmVkIGZyb20gY3VycmVudCBpbWFnZSkKKyAgICAgICAgKiAgIGBkYXRhYDogdGhlIGRhdGEgdG8gYmUgc2lnbmVkIChvYnRhaW5lZCBmcm9tIGN1cnJlbnQgaW1hZ2UpCisqICAgYGF1dGhlbnRpY2F0ZWRfZGF0YWA6IHRoaXMgYXJyYXkgaW5kaWNhdGVzIHdoYXQgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycworICAgIG11c3QgYmUgZXh0cmFjdGVkIGZyb20gYW4gaW1hZ2Ugb25jZSBpdCBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLiBFYWNoCisgICAgcGFyYW1ldGVyIGNvbnNpc3RzIG9mIGEgcGFyYW1ldGVyIGRlc2NyaXB0b3IgYW5kIHRoZSBidWZmZXIgYWRkcmVzcy9zaXplCisgICAgdG8gc3RvcmUgdGhlIHBhcmFtZXRlci4gVGhlIENvVCBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyB0aGUgcmVxdWlyZWQKKyAgICBtZW1vcnkgdG8gc3RvcmUgdGhlIHBhcmFtZXRlcnMuCisKK0luIHRoZSBgdGJicl9jb3QuY2AgZmlsZSwgYSBzZXQgb2YgYnVmZmVycyBhcmUgYWxsb2NhdGVkIHRvIHN0b3JlIHRoZSBwYXJhbWV0ZXJzCitleHRyYWN0ZWQgZnJvbSB0aGUgY2VydGlmaWNhdGVzLiBJbiB0aGUgY2FzZSBvZiB0aGUgVEJCUiBDb1QsIHRoZXNlIHBhcmFtZXRlcnMKK2FyZSBoYXNoZXMgYW5kIHB1YmxpYyBrZXlzLiBJbiBERVIgZm9ybWF0LCBhbiBSU0EtMjA0OCBwdWJsaWMga2V5IHJlcXVpcmVzIDI5NAorYnl0ZXMsIGFuZCBhIGhhc2ggcmVxdWlyZXMgNTEgYnl0ZXMuIERlcGVuZGluZyBvbiB0aGUgQ29UIGFuZCB0aGUgYXV0aGVudGljYXRpb24KK3Byb2Nlc3MsIHNvbWUgb2YgdGhlIGJ1ZmZlcnMgbWF5IGJlIHJldXNlZCBhdCBkaWZmZXJlbnQgc3RhZ2VzIGR1cmluZyB0aGUgYm9vdC4KKworTmV4dCBpbiB0aGF0IGZpbGUsIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgYXJlIGRlZmluZWQuIFRoZXNlIGRlc2NyaXB0b3JzIHdpbGwKK2JlIHVzZWQgdG8gZXh0cmFjdCB0aGUgcGFyYW1ldGVyIGRhdGEgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBpbWFnZS4KKworIyMjIyA0LjEuMSBFeGFtcGxlOiB0aGUgQkwzLTEgQ2hhaW4gb2YgVHJ1c3QKKworRm91ciBpbWFnZSBkZXNjcmlwdG9ycyBmb3JtIHRoZSBCTDMtMSBDaGFpbiBvZiBUcnVzdDoKKworYGBgCitbVFJVU1RFRF9LRVlfQ0VSVF9JRF0gPSB7CisJLmltZ19pZCA9IFRSVVNURURfS0VZX0NFUlRfSUQsCisJLmltZ190eXBlID0gSU1HX0NFUlQsCisJLnBhcmVudCA9IE5VTEwsCisJLmltZ19hdXRoX21ldGhvZHMgPSB7CisJCVswXSA9IHsKKwkJCS50eXBlID0gQVVUSF9NRVRIT0RfU0lHLAorCQkJLnBhcmFtLnNpZyA9IHsKKwkJCQkucGsgPSAmc3ViamVjdF9waywKKwkJCQkuc2lnID0gJnNpZywKKwkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJLmRhdGEgPSAmcmF3X2RhdGEsCisJCQl9CisJCX0KKwl9LAorCS5hdXRoZW50aWNhdGVkX2RhdGEgPSB7CisJCVswXSA9IHsKKwkJCS50eXBlX2Rlc2MgPSAmdHpfd29ybGRfcGssCisJCQkuZGF0YSA9IHsKKwkJCQkucHRyID0gKHZvaWQgKilwbGF0X3R6X3dvcmxkX3BrX2J1ZiwKKwkJCQkubGVuID0gKHVuc2lnbmVkIGludClQS19ERVJfTEVOCisJCQl9CisJCX0sCisJCVsxXSA9IHsKKwkJCS50eXBlX2Rlc2MgPSAmbnR6X3dvcmxkX3BrLAorCQkJLmRhdGEgPSB7CisJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9udHpfd29ybGRfcGtfYnVmLAorCQkJCS5sZW4gPSAodW5zaWduZWQgaW50KVBLX0RFUl9MRU4KKwkJCX0KKwkJfQorCX0KK30sCitbQkwzMV9LRVlfQ0VSVF9JRF0gPSB7CisJLmltZ19pZCA9IEJMMzFfS0VZX0NFUlRfSUQsCisJLmltZ190eXBlID0gSU1HX0NFUlQsCisJLnBhcmVudCA9ICZjb3RfZGVzY1tUUlVTVEVEX0tFWV9DRVJUX0lEXSwKKwkuaW1nX2F1dGhfbWV0aG9kcyA9IHsKKwkJWzBdID0geworCQkJLnR5cGUgPSBBVVRIX01FVEhPRF9TSUcsCisJCQkucGFyYW0uc2lnID0geworCQkJCS5wayA9ICZ0el93b3JsZF9waywKKwkJCQkuc2lnID0gJnNpZywKKwkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJLmRhdGEgPSAmcmF3X2RhdGEsCisJCQl9CisJCX0KKwl9LAorCS5hdXRoZW50aWNhdGVkX2RhdGEgPSB7CisJCVswXSA9IHsKKwkJCS50eXBlX2Rlc2MgPSAmYmwzMV9jb250ZW50X3BrLAorCQkJLmRhdGEgPSB7CisJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9jb250ZW50X3BrLAorCQkJCS5sZW4gPSAodW5zaWduZWQgaW50KVBLX0RFUl9MRU4KKwkJCX0KKwkJfQorCX0KK30sCitbQkwzMV9DRVJUX0lEXSA9IHsKKwkuaW1nX2lkID0gQkwzMV9DRVJUX0lELAorCS5pbWdfdHlwZSA9IElNR19DRVJULAorCS5wYXJlbnQgPSAmY290X2Rlc2NbQkwzMV9LRVlfQ0VSVF9JRF0sCisJLmltZ19hdXRoX21ldGhvZHMgPSB7CisJCVswXSA9IHsKKwkJCS50eXBlID0gQVVUSF9NRVRIT0RfU0lHLAorCQkJLnBhcmFtLnNpZyA9IHsKKwkJCQkucGsgPSAmYmwzMV9jb250ZW50X3BrLAorCQkJCS5zaWcgPSAmc2lnLAorCQkJCS5hbGcgPSAmc2lnX2FsZywKKwkJCQkuZGF0YSA9ICZyYXdfZGF0YSwKKwkJCX0KKwkJfQorCX0sCisJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJWzBdID0geworCQkJLnR5cGVfZGVzYyA9ICZibDMxX2hhc2gsCisJCQkuZGF0YSA9IHsKKwkJCQkucHRyID0gKHZvaWQgKilwbGF0X2JsMzFfaGFzaF9idWYsCisJCQkJLmxlbiA9ICh1bnNpZ25lZCBpbnQpSEFTSF9ERVJfTEVOCisJCQl9CisJCX0KKwl9Cit9LAorW0JMMzFfSU1BR0VfSURdID0geworCS5pbWdfaWQgPSBCTDMxX0lNQUdFX0lELAorCS5pbWdfdHlwZSA9IElNR19SQVcsCisJLnBhcmVudCA9ICZjb3RfZGVzY1tCTDMxX0NFUlRfSURdLAorCS5pbWdfYXV0aF9tZXRob2RzID0geworCQlbMF0gPSB7CisJCQkudHlwZSA9IEFVVEhfTUVUSE9EX0hBU0gsCisJCQkucGFyYW0uaGFzaCA9IHsKKwkJCQkuZGF0YSA9ICZyYXdfZGF0YSwKKwkJCQkuaGFzaCA9ICZibDMxX2hhc2gsCisJCQl9CisJCX0KKwl9Cit9CitgYGAKK1RoZSAqKlRydXN0ZWQgS2V5IGNlcnRpZmljYXRlKiogaXMgc2lnbmVkIHdpdGggdGhlIFJPVCBwcml2YXRlIGtleSBhbmQgY29udGFpbnMKK3RoZSBUcnVzdGVkIFdvcmxkIHB1YmxpYyBrZXkgYW5kIHRoZSBOb24tVHJ1c3RlZCBXb3JsZCBwdWJsaWMga2V5IGFzIHg1MDl2MworZXh0ZW5zaW9ucy4gVGhpcyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgaW1hZ2UgZGVzY3JpcHRvciB1c2luZyB0aGUKK2BpbWdfYXV0aF9tZXRob2RzYCBhbmQgYGF1dGhlbnRpY2F0ZWRfZGF0YWAgYXJyYXlzLCByZXNwZWN0aXZlbHkuCisKK1RoZSBUcnVzdGVkIEtleSBjZXJ0aWZpY2F0ZSBpcyBhdXRoZW50aWNhdGVkIGJ5IGNoZWNraW5nIGl0cyBkaWdpdGFsIHNpZ25hdHVyZQordXNpbmcgdGhlIFJPVFBLLiBGb3VyIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkIHRvIGNoZWNrIGEgc2lnbmF0dXJlOiB0aGUgcHVibGljCitrZXksIHRoZSBhbGdvcml0aG0sIHRoZSBzaWduYXR1cmUgYW5kIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gc2lnbmVkLiBUaGVyZWZvcmUsCitmb3VyIHBhcmFtZXRlciBkZXNjcmlwdG9ycyBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2Q6CisKKyogICBgc3ViamVjdF9wa2A6IHBhcmFtZXRlciBkZXNjcmlwdG9yIG9mIHR5cGUgYEFVVEhfUEFSQU1fUFVCX0tFWWAuIFRoaXMgdHlwZQorICAgIGlzIHVzZWQgdG8gZXh0cmFjdCBhIHB1YmxpYyBrZXkgZnJvbSB0aGUgcGFyZW50IGltYWdlLiBJZiB0aGUgY29va2llIGlzIGFuCisgICAgT0lELCB0aGUga2V5IGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIHg1MDl2MyBleHRlbnNpb24uIElmIHRoZQorICAgIGNvb2tpZSBpcyBOVUxMLCB0aGUgc3ViamVjdCBwdWJsaWMga2V5IGlzIHJldHJpZXZlZC4gSW4gdGhpcyBjYXNlLCBiZWNhdXNlCisgICAgdGhlIHBhcmVudCBpbWFnZSBpcyBOVUxMLCB0aGUgcHVibGljIGtleSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBwbGF0Zm9ybQorICAgICh0aGlzIGtleSB3aWxsIGJlIHRoZSBST1RQSykuCisqICAgYHNpZ2A6IHBhcmFtZXRlciBkZXNjcmlwdG9yIG9mIHR5cGUgYEFVVEhfUEFSQU1fU0lHYC4gSXQgaXMgdXNlZCB0byBleHRyYWN0CisgICAgdGhlIHNpZ25hdHVyZSBmcm9tIHRoZSBjZXJ0aWZpY2F0ZS4KKyogICBgc2lnX2FsZ2A6IHBhcmFtZXRlciBkZXNjcmlwdG9yIG9mIHR5cGUgYEFVVEhfUEFSQU1fU0lHYC4gSXQgaXMgdXNlZCB0bworICAgIGV4dHJhY3QgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gZnJvbSB0aGUgY2VydGlmaWNhdGUuCisqICAgYHJhd19kYXRhYDogcGFyYW1ldGVyIGRlc2NyaXB0b3Igb2YgdHlwZSBgQVVUSF9QQVJBTV9SQVdfREFUQWAuIEl0IGlzIHVzZWQKKyAgICB0byBleHRyYWN0IHRoZSBkYXRhIHRvIGJlIHNpZ25lZCBmcm9tIHRoZSBjZXJ0aWZpY2F0ZS4KKworT25jZSB0aGUgc2lnbmF0dXJlIGhhcyBiZWVuIGNoZWNrZWQgYW5kIHRoZSBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGVkLCB0aGUKK1RydXN0ZWQgV29ybGQgcHVibGljIGtleSBuZWVkcyB0byBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgY2VydGlmaWNhdGUuIEEgbmV3IGVudHJ5CitpcyBjcmVhdGVkIGluIHRoZSBgYXV0aGVudGljYXRlZF9kYXRhYCBhcnJheSBmb3IgdGhhdCBwdXJwb3NlLiBJbiB0aGF0IGVudHJ5LAordGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGRlc2NyaXB0b3IgbXVzdCBiZSBzcGVjaWZpZWQgYWxvbmcgd2l0aCB0aGUgYnVmZmVyCithZGRyZXNzIHRvIHN0b3JlIHRoZSBwYXJhbWV0ZXIgdmFsdWUuIEluIHRoaXMgY2FzZSwgdGhlIGB0el93b3JsZF9wa2AgZGVzY3JpcHRvcgoraXMgdXNlZCB0byBleHRyYWN0IHRoZSBwdWJsaWMga2V5IGZyb20gYW4geDUwOXYzIGV4dGVuc2lvbiB3aXRoIE9JRAorYFRaX1dPUkxEX1BLX09JRGAuIFRoZSBCTDMtMSBrZXkgY2VydGlmaWNhdGUgd2lsbCB1c2UgdGhpcyBkZXNjcmlwdG9yIGFzCitwYXJhbWV0ZXIgaW4gdGhlIHNpZ25hdHVyZSBhdXRoZW50aWNhdGlvbiBtZXRob2QuIFRoZSBrZXkgaXMgc3RvcmVkIGluIHRoZQorYHBsYXRfdHpfd29ybGRfcGtfYnVmYCBidWZmZXIuCisKK1RoZSAqKkJMMy0xIEtleSBjZXJ0aWZpY2F0ZSoqIGlzIGF1dGhlbnRpY2F0ZWQgYnkgY2hlY2tpbmcgaXRzIGRpZ2l0YWwgc2lnbmF0dXJlCit1c2luZyB0aGUgVHJ1c3RlZCBXb3JsZCBwdWJsaWMga2V5IG9idGFpbmVkIHByZXZpb3VzbHkgZnJvbSB0aGUgVHJ1c3RlZCBLZXkKK2NlcnRpZmljYXRlLiBJbiB0aGUgaW1hZ2UgZGVzY3JpcHRvciwgd2Ugc3BlY2lmeSBhIHNpbmdsZSBhdXRoZW50aWNhdGlvbiBtZXRob2QKK2J5IHNpZ25hdHVyZSB3aG9zZSBwdWJsaWMga2V5IGlzIHRoZSBgdHpfd29ybGRfcGtgLiBPbmNlIHRoaXMgY2VydGlmaWNhdGUgaGFzCitiZWVuIGF1dGhlbnRpY2F0ZWQsIHdlIGhhdmUgdG8gZXh0cmFjdCB0aGUgQkwzLTEgcHVibGljIGtleSwgc3RvcmVkIGluIHRoZQorZXh0ZW5zaW9uIHNwZWNpZmllZCBieSBgYmwzMV9jb250ZW50X3BrYC4gVGhpcyBrZXkgd2lsbCBiZSBjb3BpZWQgdG8gdGhlCitgcGxhdF9jb250ZW50X3BrYCBidWZmZXIuCisKK1RoZSAqKkJMMy0xIGNlcnRpZmljYXRlKiogaXMgYXV0aGVudGljYXRlZCBieSBjaGVja2luZyBpdHMgZGlnaXRhbCBzaWduYXR1cmUKK3VzaW5nIHRoZSBCTDMtMSBwdWJsaWMga2V5IG9idGFpbmVkIHByZXZpb3VzbHkgZnJvbSB0aGUgQkwzLTEgS2V5IGNlcnRpZmljYXRlLgorV2Ugc3BlY2lmeSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHVzaW5nIGBibDMxX2NvbnRlbnRfcGtgIGFzIHB1YmxpYyBrZXkuCitBZnRlciBhdXRoZW50aWNhdGlvbiwgd2UgbmVlZCB0byBleHRyYWN0IHRoZSBCTDMtMSBoYXNoLCBzdG9yZWQgaW4gdGhlIGV4dGVuc2lvbgorc3BlY2lmaWVkIGJ5IGBibDMxX2hhc2hgLiBUaGlzIGhhc2ggd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGBwbGF0X2JsMzFfaGFzaF9idWZgCitidWZmZXIuCisKK1RoZSAqKkJMMy0xIGltYWdlKiogaXMgYXV0aGVudGljYXRlZCBieSBjYWxjdWxhdGluZyBpdHMgaGFzaCBhbmQgbWF0Y2hpbmcgaXQKK3dpdGggdGhlIGhhc2ggb2J0YWluZWQgZnJvbSB0aGUgQkwzLTEgY2VydGlmaWNhdGUuIFRoZSBpbWFnZSBkZXNjcmlwdG9yIGNvbnRhaW5zCithIHNpbmdsZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgYnkgaGFzaC4gVGhlIHBhcmFtZXRlcnMgdG8gdGhlIGhhc2ggbWV0aG9kIGFyZQordGhlIHJlZmVyZW5jZSBoYXNoLCBgYmwzMV9oYXNoYCwgYW5kIHRoZSBkYXRhIHRvIGJlIGhhc2hlZC4gSW4gdGhpcyBjYXNlLCBpdCBpcwordGhlIHdob2xlIGltYWdlLCBzbyB3ZSBzcGVjaWZ5IGByYXdfZGF0YWAuCisKKyMjIyA0LjIgVGhlIGltYWdlIHBhcnNlciBsaWJyYXJ5CisKK1RoZSBpbWFnZSBwYXJzZXIgbW9kdWxlIHJlbGllcyBvbiBsaWJyYXJpZXMgdG8gY2hlY2sgdGhlIGltYWdlIGludGVncml0eSBhbmQKK2V4dHJhY3QgdGhlIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMuIFRoZSBudW1iZXIgYW5kIHR5cGUgb2YgcGFyc2VyIGxpYnJhcmllcworZGVwZW5kIG9uIHRoZSBpbWFnZXMgdXNlZCBpbiB0aGUgQ29ULiBSYXcgaW1hZ2VzIGRvIG5vdCBuZWVkIGEgbGlicmFyeSwgc28KK29ubHkgYW4geDUwOXYzIGxpYnJhcnkgaXMgcmVxdWlyZWQgZm9yIHRoZSBUQkJSIENvVC4KKworQVJNIHBsYXRmb3JtcyB3aWxsIHVzZSBhbiB4NTA5djMgbGlicmFyeSBiYXNlZCBvbiBtYmVkVExTLiBUaGlzIGxpYnJhcnkgbWF5IGJlCitmb3VuZCBpbiBgZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc194NTA5X3BhcnNlci5jYC4gSXQgZXhwb3J0cyB0aHJlZQorZnVuY3Rpb25zOgorCitgYGAKK3ZvaWQgaW5pdCh2b2lkKTsKK2ludCBjaGVja19pbnRlZ3JpdHkodm9pZCAqaW1nLCB1bnNpZ25lZCBpbnQgaW1nX2xlbik7CitpbnQgZ2V0X2F1dGhfcGFyYW0oY29uc3QgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqdHlwZV9kZXNjLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKmltZywgdW5zaWduZWQgaW50IGltZ19sZW4sCisgICAgICAgICAgICAgICAgICAgdm9pZCAqKnBhcmFtLCB1bnNpZ25lZCBpbnQgKnBhcmFtX2xlbik7CitgYGAKKworVGhlIGxpYnJhcnkgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgZnJhbWV3b3JrIHVzaW5nIHRoZSBtYWNybworYFJFR0lTVEVSX0lNR19QQVJTRVJfTElCKClgLiBFYWNoIHRpbWUgdGhlIGltYWdlIHBhcnNlciBtb2R1bGUgbmVlZHMgdG8gYWNjZXNzCithbiBpbWFnZSBvZiB0eXBlIGBJTUdfQ0VSVGAsIGl0IHdpbGwgY2FsbCB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBleHBvcnRlZAoraW4gdGhpcyBmaWxlLgorCitUaGUgYnVpbGQgc3lzdGVtIG11c3QgYmUgdXBkYXRlZCB0byBpbmNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIGxpYnJhcnkgYW5kCittYmVkVExTIHNvdXJjZXMuIEFSTSBwbGF0Zm9ybXMgdXNlIHRoZSBgYXJtX2NvbW1vbi5ta2AgZmlsZSB0byBwdWxsIHRoZSBzb3VyY2VzLgorCisjIyMgNC4zIFRoZSBjcnlwdG9ncmFwaGljIGxpYnJhcnkKKworVGhlIGNyeXB0b2dyYXBoaWMgbW9kdWxlIHJlbGllcyBvbiBhIGxpYnJhcnkgdG8gcGVyZm9ybSB0aGUgcmVxdWlyZWQgb3BlcmF0aW9ucywKK2kuZS4gdmVyaWZ5IGEgaGFzaCBvciBhIGRpZ2l0YWwgc2lnbmF0dXJlLiBBUk0gcGxhdGZvcm1zIHdpbGwgdXNlIGEgbGlicmFyeQorYmFzZWQgb24gbWJlZFRMUywgd2hpY2ggY2FuIGJlIGZvdW5kIGluIGBkcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX2NyeXB0by5jYC4KK1RoaXMgbGlicmFyeSBpcyByZWdpc3RlcmVkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBmcmFtZXdvcmsgdXNpbmcgdGhlIG1hY3JvCitgUkVHSVNURVJfQ1JZUFRPX0xJQigpYCBhbmQgZXhwb3J0cyB0aHJlZSBmdW5jdGlvbnM6CisKK2BgYAordm9pZCBpbml0KHZvaWQpOworaW50IHZlcmlmeV9zaWduYXR1cmUodm9pZCAqZGF0YV9wdHIsIHVuc2lnbmVkIGludCBkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNpZ19wdHIsIHVuc2lnbmVkIGludCBzaWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc2lnX2FsZywgdW5zaWduZWQgaW50IHNpZ19hbGdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGtfcHRyLCB1bnNpZ25lZCBpbnQgcGtfbGVuKTsKK2ludCB2ZXJpZnlfaGFzaCh2b2lkICpkYXRhX3B0ciwgdW5zaWduZWQgaW50IGRhdGFfbGVuLAorICAgICAgICAgICAgICAgIHZvaWQgKmRpZ2VzdF9pbmZvX3B0ciwgdW5zaWduZWQgaW50IGRpZ2VzdF9pbmZvX2xlbik7CitgYGAKKworVGhlIGtleSBhbGdvcml0aG0gKHJzYSwgZWNkc2EpIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBidWlsZCBzeXN0ZW0gdXNpbmcgdGhlCitgTUJFRFRMU19LRVlfQUxHYCB2YXJpYWJsZSwgc28gdGhlIE1ha2VmaWxlIGNhbiBpbmNsdWRlIHRoZSBjb3JyZXNwb25kaW5nCitzb3VyY2VzIGluIHRoZSBidWlsZC4KKworLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK19Db3B5cmlnaHQgKGMpIDIwMTUsIEFSTSBMaW1pdGVkIGFuZCBDb250cmlidXRvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXworCisKK1tUcnVzdGVkIEJvYXJkIEJvb3RdOiAgICAgICAgICAgLi90cnVzdGVkLWJvYXJkLWJvb3QubWQKK1tQbGF0Zm9ybSBQb3J0aW5nIEd1aWRlXTogICAgICAgLi9wb3J0aW5nLWd1aWRlLm1kCmRpZmYgLS1naXQgYS9kb2NzL2Zpcm13YXJlLWRlc2lnbi5tZCBiL2RvY3MvZmlybXdhcmUtZGVzaWduLm1kCmluZGV4IDM5NzcyMTMuLjIxM2M4ZmYgMTAwNjQ0Ci0tLSBhL2RvY3MvZmlybXdhcmUtZGVzaWduLm1kCisrKyBiL2RvY3MvZmlybXdhcmUtZGVzaWduLm1kCkBAIC0xODQsNyArMTg0LDcgQEAKIAogIyMjIyBQbGF0Zm9ybSBpbml0aWFsaXphdGlvbgogCi1CTDEgZW5hYmxlcyBpc3N1aW5nIG9mIHNub29wIGFuZCBEVk0gKERpc3RyaWJ1dGVkIFZpcnR1YWwgTWVtb3J5KSByZXF1ZXN0cyBmcm9tCitCTDEgZW5hYmxlcyBpc3N1aW5nIG9mIHNub29wIGFuZCBEVk0gKERpc3RyaWJ1dGVkIFZpcnR1YWwgTWVtb3J5KSByZXF1ZXN0cyB0bwogdGhlIENDSSBzbGF2ZSBpbnRlcmZhY2UgY29ycmVzcG9uZGluZyB0byB0aGUgY2x1c3RlciB0aGF0IGluY2x1ZGVzIHRoZQogcHJpbWFyeSBDUFUuIEJMMSBhbHNvIGluaXRpYWxpemVzIGEgVUFSVCAoUEwwMTEgY29uc29sZSksIHdoaWNoIGVuYWJsZXMgYWNjZXNzCiB0byB0aGUgYHByaW50ZmAgZmFtaWx5IG9mIGZ1bmN0aW9ucyBpbiBCTDEuCkBAIC0zMzQsNyArMzM0LDkgQEAKIEJMMy0xIHBlcmZvcm1zIGRldGFpbGVkIHBsYXRmb3JtIGluaXRpYWxpemF0aW9uLCB3aGljaCBlbmFibGVzIG5vcm1hbCB3b3JsZAogc29mdHdhcmUgdG8gZnVuY3Rpb24gY29ycmVjdGx5LiBJdCBhbHNvIHJldHJpZXZlcyBlbnRyeXBvaW50IGluZm9ybWF0aW9uIGZvcgogdGhlIEJMMy0zIGltYWdlIGxvYWRlZCBieSBCTDIgZnJvbSB0aGUgcGxhdGZvcm0gZGVmaW5lZCBtZW1vcnkgYWRkcmVzcyBwb3B1bGF0ZWQKLWJ5IEJMMi4gQkwzLTEgYWxzbyBpbml0aWFsaXplcyBhIFVBUlQgKFBMMDExIGNvbnNvbGUpLCB3aGljaCBlbmFibGVzCitieSBCTDIuIEl0IGVuYWJsZXMgaXNzdWluZyBvZiBzbm9vcCBhbmQgRFZNIChEaXN0cmlidXRlZCBWaXJ0dWFsIE1lbW9yeSkKK3JlcXVlc3RzIHRvIHRoZSBDQ0kgc2xhdmUgaW50ZXJmYWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsdXN0ZXIgdGhhdCBpbmNsdWRlcwordGhlIHByaW1hcnkgQ1BVLiBCTDMtMSBhbHNvIGluaXRpYWxpemVzIGEgVUFSVCAoUEwwMTEgY29uc29sZSksIHdoaWNoIGVuYWJsZXMKIGFjY2VzcyB0byB0aGUgYHByaW50ZmAgZmFtaWx5IG9mIGZ1bmN0aW9ucyBpbiBCTDMtMS4gIEl0IGVuYWJsZXMgdGhlIHN5c3RlbQogbGV2ZWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGdlbmVyaWMgdGltZXIgdGhyb3VnaCB0aGUgbWVtb3J5IG1hcHBlZCBpbnRlcmZhY2UuCiAKQEAgLTQxMiw4ICs0MTQsNyBAQAogCiAjIyMjIFJlcXVpcmVkIENQVSBzdGF0ZSB3aGVuIGNhbGxpbmcgYGJsMzFfZW50cnlwb2ludCgpYCBkdXJpbmcgY29sZCBib290CiAKLVRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgcHJpbWFyeSBDUFUsIGlmIHRoaXMgaXMgY2FsbGVkIGJ5IGFueQotb3RoZXIgQ1BVIHRoZSBmaXJtd2FyZSB3aWxsIGFib3J0LgorVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBwcmltYXJ5IENQVS4KIAogT24gZW50cnkgdG8gdGhpcyBmdW5jdGlvbiB0aGUgY2FsbGluZyBwcmltYXJ5IENQVSBtdXN0IGJlIGV4ZWN1dGluZyBpbiBBQXJjaDY0CiBFTDMsIGxpdHRsZS1lbmRpYW4gZGF0YSBhY2Nlc3MsIGFuZCBhbGwgaW50ZXJydXB0IHNvdXJjZXMgbWFza2VkOgpAQCAtNTQzLDExICs1NDQsNiBAQAogbXVzdCBwbGFjZSBhbnkgc2Vjb25kYXJ5IENQVXMgaW50byBhIHNhZmUgc3RhdGUgd2hpbGUgdGhlIHByaW1hcnkgQ1BVIGV4ZWN1dGVzCiBhIG1vZGlmaWVkIEJMMy0xIGluaXRpYWxpemF0aW9uLCBhcyBkZXNjcmliZWQgYmVsb3cuCiAKLSMjIyMgQXJjaGl0ZWN0dXJhbCBpbml0aWFsaXphdGlvbgotCi1BcyB0aGUgZmlyc3QgaW1hZ2UgdG8gZXhlY3V0ZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gQkwzLTEgbXVzdCBlbnN1cmUgdGhhdAotaW50ZXJjb25uZWN0IGNvaGVyZW5jeSBpcyBlbmFibGVkIChpZiByZXF1aXJlZCkgYmVmb3JlIGVuYWJsaW5nIHRoZSBNTVUuCi0KICMjIyMgUGxhdGZvcm0gaW5pdGlhbGl6YXRpb24KIAogSW4gdGhpcyBjb25maWd1cmF0aW9uLCB3aGVuIHRoZSBDUFUgcmVzZXRzIHRvIEJMMy0xIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzCkBAIC05NjIsNyArOTU4LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUcnVzdGVkIEZpcm13YXJlIGltcGxlbWVudHMgYSBmcmFtZXdvcmsgdGhhdCBhbGxvd3MgQ1BVIGFuZCBwbGF0Zm9ybSBwb3J0cyB0bwotcGVyZm9ybSBhY3Rpb25zIGltbWVkaWF0ZWx5IGFmdGVyIGEgQ1BVIGlzIHJlbGVhc2VkIGZyb20gcmVzZXQgaW4gYm90aCB0aGUgY29sZAorcGVyZm9ybSBhY3Rpb25zIHZlcnkgZWFybHkgYWZ0ZXIgYSBDUFUgaXMgcmVsZWFzZWQgZnJvbSByZXNldCBpbiBib3RoIHRoZSBjb2xkCiBhbmQgd2FybSBib290IHBhdGhzLiBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyB0aGUgYHJlc2V0X2hhbmRsZXIoKWAgZnVuY3Rpb24gaW4KIGJvdGggdGhlIEJMMSBhbmQgQkwzLTEgaW1hZ2VzLiBJdCBpbiB0dXJuIGNhbGxzIHRoZSBwbGF0Zm9ybSBhbmQgQ1BVIHNwZWNpZmljCiByZXNldCBoYW5kbGluZyBmdW5jdGlvbnMuCkBAIC05NzEsMzMgKzk2NywxMiBAQAogU2VjdGlvbiA4LiBEZXRhaWxzIGZvciBpbXBsZW1lbnRpbmcgYSBwbGF0Zm9ybSBzcGVjaWZpYyByZXNldCBoYW5kbGVyIGNhbiBiZQogZm91bmQgaW4gdGhlIFtQb3J0aW5nIEd1aWRlXShzZWUgdGhlIGBwbGF0X3Jlc2V0X2hhbmRsZXIoKWAgZnVuY3Rpb24pLgogCi1XaGVuIGFkZGluZyBmdW5jdGlvbmFsaXR5IHRvIGEgcmVzZXQgaGFuZGxlciwgdGhlIGZvbGxvd2luZyBwb2ludHMgc2hvdWxkIGJlCi1rZXB0IGluIG1pbmQuCi0KLTEuICAgVGhlIGZpcnN0IHJlc2V0IGhhbmRsZXIgaW4gdGhlIHN5c3RlbSBleGlzdHMgZWl0aGVyIGluIGEgUk9NIGltYWdlCi0gICAgIChlLmcuIEJMMSksIG9yIEJMMy0xIGlmIGBSRVNFVF9UT19CTDMxYCBpcyB0cnVlLiBUaGlzIG1heSBiZSBkZXRlY3RlZCBhdAotICAgICBjb21waWxlIHRpbWUgdXNpbmcgdGhlIGNvbnN0YW50IGBGSVJTVF9SRVNFVF9IQU5ETEVSX0NBTExgLgotCi0yLiAgIFdoZW4gY29uc2lkZXJpbmcgUk9NIGltYWdlcywgaXQncyBpbXBvcnRhbnQgdG8gY29uc2lkZXIgbm9uIFRGLWJhc2VkIFJPTXMKLSAgICAgYW5kIFJPTXMgYmFzZWQgb24gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIFRGIGNvZGUuCi0KLTMuICAgSWYgdGhlIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIGFwcGxpZWQgdG8gYSBST00gYW5kIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5Ci0gICAgIG9mIGEgUk9NIGJlaW5nIHVzZWQgdGhhdCBkb2VzIG5vdCBhcHBseSB0aGUgZnVuY3Rpb25hbGl0eSAob3IgZXF1aXZhbGVudCksCi0gICAgIHRoZW4gdGhlIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIGFwcGxpZWQgd2l0aGluIGEgYCNpZgotICAgICBGSVJTVF9SRVNFVF9IQU5ETEVSX0NBTExgIGJsb2NrLgotCi00LiAgIElmIHRoZSBmdW5jdGlvbmFsaXR5IHNob3VsZCBleGVjdXRlIGluIEJMMy0xIGluIG9yZGVyIHRvIG92ZXJyaWRlIG9yCi0gICAgIHN1cHBsZW1lbnQgYSBST00gdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb25hbGl0eSwgdGhlbiB0aGUgZnVuY3Rpb25hbGl0eQotICAgICBzaG91bGQgYmUgYXBwbGllZCBpbiB0aGUgYCNlbHNlYCBwYXJ0IG9mIGEgYCNpZiBGSVJTVF9SRVNFVF9IQU5ETEVSX0NBTExgCi0gICAgIGJsb2NrLgotCi01LiAgIElmIHRoZSBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZSBhcHBsaWVkIHRvIGEgUk9NIGJ1dCB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5Ci0gICAgIG9mIFJPTXMgYmVpbmcgdXNlZCB0aGF0IGRvIG5vdCBhcHBseSB0aGUgZnVuY3Rpb25hbGl0eSwgdGhlbiB0aGUKLSAgICAgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmUgYXBwbGllZCBvdXRzaWRlIG9mIGEgYEZJUlNUX1JFU0VUX0hBTkRMRVJfQ0FMTGAKLSAgICAgYmxvY2ssIHNvIHRoYXQgQkwzLTEgaGFzIGFuIG9wcG9ydHVuaXR5IHRvIGFwcGx5IHRoZSBmdW5jdGlvbmFsaXR5IGluc3RlYWQuCi0gICAgIEluIHRoaXMgY2FzZSwgYWRkaXRpb25hbCBjb2RlIG1heSBiZSBuZWVkZWQgdG8gY29wZSB3aXRoIGRpZmZlcmVudCBST01zCi0gICAgIHRoYXQgZG8gb3IgZG8gbm90IGFwcGx5IHRoZSBmdW5jdGlvbmFsaXR5LgotCitXaGVuIGFkZGluZyBmdW5jdGlvbmFsaXR5IHRvIGEgcmVzZXQgaGFuZGxlciwga2VlcCBpbiBtaW5kIHRoYXQgaWYgYSBkaWZmZXJlbnQKK3Jlc2V0IGhhbmRsaW5nIGJlaGF2aW9yIGlzIHJlcXVpcmVkIGJldHdlZW4gdGhlIGZpcnN0IGFuZCB0aGUgc3Vic2VxdWVudAoraW52b2NhdGlvbnMgb2YgdGhlIHJlc2V0IGhhbmRsaW5nIGNvZGUsIHRoaXMgc2hvdWxkIGJlIGRldGVjdGVkIGF0IHJ1bnRpbWUuCitJbiBvdGhlciB3b3JkcywgdGhlIHJlc2V0IGhhbmRsZXIgc2hvdWxkIGJlIGFibGUgdG8gZGV0ZWN0IHdoZXRoZXIgYW4gYWN0aW9uIGhhcworYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCBhbmQgYWN0IGFzIGFwcHJvcHJpYXRlLiBQb3NzaWJsZSBjb3Vyc2VzIG9mIGFjdGlvbnMgYXJlLAorZS5nLiBza2lwIHRoZSBhY3Rpb24gdGhlIHNlY29uZCB0aW1lLCBvciB1bmRvL3JlZG8gaXQuCiAKIDguICBDUFUgc3BlY2lmaWMgb3BlcmF0aW9ucyBmcmFtZXdvcmsKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kb2NzL3BvcnRpbmctZ3VpZGUubWQgYi9kb2NzL3BvcnRpbmctZ3VpZGUubWQKaW5kZXggYzA5YzI2NS4uMGYxMGZkNCAxMDA2NDQKLS0tIGEvZG9jcy9wb3J0aW5nLWd1aWRlLm1kCisrKyBiL2RvY3MvcG9ydGluZy1ndWlkZS5tZApAQCAtMTM0LDUxICsxMzQsNiBAQAogICAgIERlZmluZXMgdGhlIGNoYXJhY3RlciBzdHJpbmcgcHJpbnRlZCBieSBCTDEgdXBvbiBlbnRyeSBpbnRvIHRoZSBgYmwxX21haW4oKWAKICAgICBmdW5jdGlvbi4KIAotKiAgICoqI2RlZmluZSA6IEJMMl9JTUFHRV9OQU1FKioKLQotICAgIE5hbWUgb2YgdGhlIEJMMiBiaW5hcnkgaW1hZ2Ugb24gdGhlIGhvc3QgZmlsZS1zeXN0ZW0uIFRoaXMgbmFtZSBpcyB1c2VkIGJ5Ci0gICAgQkwxIHRvIGxvYWQgQkwyIGludG8gc2VjdXJlIG1lbW9yeSBmcm9tIG5vbi12b2xhdGlsZSBzdG9yYWdlLgotCi0qICAgKiojZGVmaW5lIDogQkwzMV9JTUFHRV9OQU1FKioKLQotICAgIE5hbWUgb2YgdGhlIEJMMy0xIGJpbmFyeSBpbWFnZSBvbiB0aGUgaG9zdCBmaWxlLXN5c3RlbS4gVGhpcyBuYW1lIGlzIHVzZWQgYnkKLSAgICBCTDIgdG8gbG9hZCBCTDMtMSBpbnRvIHNlY3VyZSBtZW1vcnkgZnJvbSBwbGF0Zm9ybSBzdG9yYWdlLgotCi0qICAgKiojZGVmaW5lIDogQkwzM19JTUFHRV9OQU1FKioKLQotICAgIE5hbWUgb2YgdGhlIEJMMy0zIGJpbmFyeSBpbWFnZSBvbiB0aGUgaG9zdCBmaWxlLXN5c3RlbS4gVGhpcyBuYW1lIGlzIHVzZWQgYnkKLSAgICBCTDIgdG8gbG9hZCBCTDMtMyBpbnRvIG5vbi1zZWN1cmUgbWVtb3J5IGZyb20gcGxhdGZvcm0gc3RvcmFnZS4KLQotKiAgICoqI2RlZmluZSA6IEJMMl9DRVJUX05BTUUqKgotCi0gICAgTmFtZSBvZiB0aGUgQkwyIGNvbnRlbnQgY2VydGlmaWNhdGUgb24gdGhlIGhvc3QgZmlsZS1zeXN0ZW0gKG1hbmRhdG9yeSB3aGVuCi0gICAgVHJ1c3RlZCBCb2FyZCBCb290IGlzIGVuYWJsZWQpLgotCi0qICAgKiojZGVmaW5lIDogVFJVU1RFRF9LRVlfQ0VSVF9OQU1FKioKLQotICAgIE5hbWUgb2YgdGhlIFRydXN0ZWQgS2V5IGNlcnRpZmljYXRlIG9uIHRoZSBob3N0IGZpbGUtc3lzdGVtIChtYW5kYXRvcnkgd2hlbgotICAgIFRydXN0ZWQgQm9hcmQgQm9vdCBpcyBlbmFibGVkKS4KLQotKiAgICoqI2RlZmluZSA6IEJMMzFfS0VZX0NFUlRfTkFNRSoqCi0KLSAgICBOYW1lIG9mIHRoZSBCTDMtMSBLZXkgY2VydGlmaWNhdGUgb24gdGhlIGhvc3QgZmlsZS1zeXN0ZW0gKG1hbmRhdG9yeSB3aGVuCi0gICAgVHJ1c3RlZCBCb2FyZCBCb290IGlzIGVuYWJsZWQpLgotCi0qICAgKiojZGVmaW5lIDogQkwzMV9DRVJUX05BTUUqKgotCi0gICAgTmFtZSBvZiB0aGUgQkwzLTEgQ29udGVudCBjZXJ0aWZpY2F0ZSBvbiB0aGUgaG9zdCBmaWxlLXN5c3RlbSAobWFuZGF0b3J5Ci0gICAgd2hlbiBUcnVzdGVkIEJvYXJkIEJvb3QgaXMgZW5hYmxlZCkuCi0KLSogICAqKiNkZWZpbmUgOiBCTDMzX0tFWV9DRVJUX05BTUUqKgotCi0gICAgTmFtZSBvZiB0aGUgQkwzLTMgS2V5IGNlcnRpZmljYXRlIG9uIHRoZSBob3N0IGZpbGUtc3lzdGVtIChtYW5kYXRvcnkgd2hlbgotICAgIFRydXN0ZWQgQm9hcmQgQm9vdCBpcyBlbmFibGVkKS4KLQotKiAgICoqI2RlZmluZSA6IEJMMzNfQ0VSVF9OQU1FKioKLQotICAgIE5hbWUgb2YgdGhlIEJMMy0zIENvbnRlbnQgY2VydGlmaWNhdGUgb24gdGhlIGhvc3QgZmlsZS1zeXN0ZW0gKG1hbmRhdG9yeQotICAgIHdoZW4gVHJ1c3RlZCBCb2FyZCBCb290IGlzIGVuYWJsZWQpLgotCiAqICAgKiojZGVmaW5lIDogUExBVEZPUk1fQ09SRV9DT1VOVCoqCiAKICAgICBEZWZpbmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgQ1BVcyBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0gYWNyb3NzIGFsbApAQCAtMjQzLDQyICsxOTgsOTMgQEAKICAgICBEZWZpbmVzIHRoZSBiYXNlIGFkZHJlc3MgaW4gbm9uLXNlY3VyZSBEUkFNIHdoZXJlIEJMMiBsb2FkcyB0aGUgQkwzLTMgYmluYXJ5CiAgICAgaW1hZ2UuIE11c3QgYmUgYWxpZ25lZCBvbiBhIHBhZ2Utc2l6ZSBib3VuZGFyeS4KIAorRm9yIGV2ZXJ5IGltYWdlLCB0aGUgcGxhdGZvcm0gbXVzdCBkZWZpbmUgaW5kaXZpZHVhbCBpZGVudGlmaWVycyB0aGF0IHdpbGwgYmUKK3VzZWQgYnkgQkwxIG9yIEJMMiB0byBsb2FkIHRoZSBjb3JyZXNwb25kaW5nIGltYWdlIGludG8gbWVtb3J5IGZyb20gbm9uLXZvbGF0aWxlCitzdG9yYWdlLiBGb3IgdGhlIHNha2Ugb2YgcGVyZm9ybWFuY2UsIGludGVnZXIgbnVtYmVycyB3aWxsIGJlIHVzZWQgYXMKK2lkZW50aWZpZXJzLiBUaGUgcGxhdGZvcm0gd2lsbCB1c2UgdGhvc2UgaWRlbnRpZmllcnMgdG8gcmV0dXJuIHRoZSByZWxldmFudAoraW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlIHRvIGJlIGxvYWRlZCAoZmlsZSBoYW5kbGVyLCBsb2FkIGFkZHJlc3MsCithdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiwgZXRjLikuIFRoZSBmb2xsb3dpbmcgaW1hZ2UgaWRlbnRpZmllcnMgYXJlCittYW5kYXRvcnk6CisKKyogICAqKiNkZWZpbmUgOiBCTDJfSU1BR0VfSUQqKgorCisgICAgQkwyIGltYWdlIGlkZW50aWZpZXIsIHVzZWQgYnkgQkwxIHRvIGxvYWQgQkwyLgorCisqICAgKiojZGVmaW5lIDogQkwzMV9JTUFHRV9JRCoqCisKKyAgICBCTDMtMSBpbWFnZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMiB0byBsb2FkIEJMMy0xLgorCisqICAgKiojZGVmaW5lIDogQkwzM19JTUFHRV9JRCoqCisKKyAgICBCTDMtMyBpbWFnZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMiB0byBsb2FkIEJMMy0zLgorCitJZiBUcnVzdGVkIEJvYXJkIEJvb3QgaXMgZW5hYmxlZCwgdGhlIGZvbGxvd2luZyBjZXJ0aWZpY2F0ZSBpZGVudGlmaWVycyBtdXN0CithbHNvIGJlIGRlZmluZWQ6CisKKyogICAqKiNkZWZpbmUgOiBCTDJfQ0VSVF9JRCoqCisKKyAgICBCTDIgY29udGVudCBjZXJ0aWZpY2F0ZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMSB0byBsb2FkIHRoZSBCTDIgY29udGVudAorICAgIGNlcnRpZmljYXRlLgorCisqICAgKiojZGVmaW5lIDogVFJVU1RFRF9LRVlfQ0VSVF9JRCoqCisKKyAgICBUcnVzdGVkIGtleSBjZXJ0aWZpY2F0ZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMiB0byBsb2FkIHRoZSB0cnVzdGVkIGtleQorICAgIGNlcnRpZmljYXRlLgorCisqICAgKiojZGVmaW5lIDogQkwzMV9LRVlfQ0VSVF9JRCoqCisKKyAgICBCTDMtMSBrZXkgY2VydGlmaWNhdGUgaWRlbnRpZmllciwgdXNlZCBieSBCTDIgdG8gbG9hZCB0aGUgQkwzLTEga2V5CisgICAgY2VydGlmaWNhdGUuCisKKyogICAqKiNkZWZpbmUgOiBCTDMxX0NFUlRfSUQqKgorCisgICAgQkwzLTEgY29udGVudCBjZXJ0aWZpY2F0ZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMiB0byBsb2FkIHRoZSBCTDMtMSBjb250ZW50CisgICAgY2VydGlmaWNhdGUuCisKKyogICAqKiNkZWZpbmUgOiBCTDMzX0tFWV9DRVJUX0lEKioKKworICAgIEJMMy0zIGtleSBjZXJ0aWZpY2F0ZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMiB0byBsb2FkIHRoZSBCTDMtMyBrZXkKKyAgICBjZXJ0aWZpY2F0ZS4KKworKiAgICoqI2RlZmluZSA6IEJMMzNfQ0VSVF9JRCoqCisKKyAgICBCTDMtMyBjb250ZW50IGNlcnRpZmljYXRlIGlkZW50aWZpZXIsIHVzZWQgYnkgQkwyIHRvIGxvYWQgdGhlIEJMMy0zIGNvbnRlbnQKKyAgICBjZXJ0aWZpY2F0ZS4KKwogSWYgYSBCTDMtMCBpbWFnZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBtdXN0CiBhbHNvIGJlIGRlZmluZWQ6CiAKLSogICAqKiNkZWZpbmUgOiBCTDMwX0lNQUdFX05BTUUqKgorKiAgICoqI2RlZmluZSA6IEJMMzBfSU1BR0VfSUQqKgogCi0gICAgTmFtZSBvZiB0aGUgQkwzLTAgYmluYXJ5IGltYWdlIG9uIHRoZSBob3N0IGZpbGUtc3lzdGVtLiBUaGlzIG5hbWUgaXMgdXNlZCBieQotICAgIEJMMiB0byBsb2FkIEJMMy0wIGludG8gc2VjdXJlIG1lbW9yeSBmcm9tIHBsYXRmb3JtIHN0b3JhZ2UgYmVmb3JlIGJlaW5nCi0gICAgdHJhbnNmZXJlZCB0byB0aGUgU0NQLgorICAgIEJMMy0wIGltYWdlIGlkZW50aWZpZXIsIHVzZWQgYnkgQkwyIHRvIGxvYWQgQkwzLTAgaW50byBzZWN1cmUgbWVtb3J5IGZyb20KKyAgICBwbGF0Zm9ybSBzdG9yYWdlIGJlZm9yZSBiZWluZyB0cmFuc2ZlcmVkIHRvIHRoZSBTQ1AuCiAKLSogICAqKiNkZWZpbmUgOiBCTDMwX0tFWV9DRVJUX05BTUUqKgorKiAgICoqI2RlZmluZSA6IEJMMzBfS0VZX0NFUlRfSUQqKgogCi0gICAgTmFtZSBvZiB0aGUgQkwzLTAgS2V5IGNlcnRpZmljYXRlIG9uIHRoZSBob3N0IGZpbGUtc3lzdGVtIChtYW5kYXRvcnkgd2hlbgotICAgIFRydXN0ZWQgQm9hcmQgQm9vdCBpcyBlbmFibGVkKS4KKyAgICBCTDMtMCBrZXkgY2VydGlmaWNhdGUgaWRlbnRpZmllciwgdXNlZCBieSBCTDIgdG8gbG9hZCB0aGUgQkwzLTAga2V5CisgICAgY2VydGlmaWNhdGUgKG1hbmRhdG9yeSB3aGVuIFRydXN0ZWQgQm9hcmQgQm9vdCBpcyBlbmFibGVkKS4KIAotKiAgICoqI2RlZmluZSA6IEJMMzBfQ0VSVF9OQU1FKioKKyogICAqKiNkZWZpbmUgOiBCTDMwX0NFUlRfSUQqKgogCi0gICAgTmFtZSBvZiB0aGUgQkwzLTAgQ29udGVudCBjZXJ0aWZpY2F0ZSBvbiB0aGUgaG9zdCBmaWxlLXN5c3RlbSAobWFuZGF0b3J5Ci0gICAgd2hlbiBUcnVzdGVkIEJvYXJkIEJvb3QgaXMgZW5hYmxlZCkuCisgICAgQkwzLTAgY29udGVudCBjZXJ0aWZpY2F0ZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMiB0byBsb2FkIHRoZSBCTDMtMCBjb250ZW50CisgICAgY2VydGlmaWNhdGUgKG1hbmRhdG9yeSB3aGVuIFRydXN0ZWQgQm9hcmQgQm9vdCBpcyBlbmFibGVkKS4KIAogSWYgYSBCTDMtMiBpbWFnZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBtdXN0CiBhbHNvIGJlIGRlZmluZWQ6CiAKLSogICAqKiNkZWZpbmUgOiBCTDMyX0lNQUdFX05BTUUqKgorKiAgICoqI2RlZmluZSA6IEJMMzJfSU1BR0VfSUQqKgogCi0gICAgTmFtZSBvZiB0aGUgQkwzLTIgYmluYXJ5IGltYWdlIG9uIHRoZSBob3N0IGZpbGUtc3lzdGVtLiBUaGlzIG5hbWUgaXMgdXNlZCBieQotICAgIEJMMiB0byBsb2FkIEJMMy0yIGludG8gc2VjdXJlIG1lbW9yeSBmcm9tIHBsYXRmb3JtIHN0b3JhZ2UuCisgICAgQkwzLTIgaW1hZ2UgaWRlbnRpZmllciwgdXNlZCBieSBCTDIgdG8gbG9hZCBCTDMtMi4KIAotKiAgICoqI2RlZmluZSA6IEJMMzJfS0VZX0NFUlRfTkFNRSoqCisqICAgKiojZGVmaW5lIDogQkwzMl9LRVlfQ0VSVF9JRCoqCiAKLSAgICBOYW1lIG9mIHRoZSBCTDMtMiBLZXkgY2VydGlmaWNhdGUgb24gdGhlIGhvc3QgZmlsZS1zeXN0ZW0gKG1hbmRhdG9yeSB3aGVuCi0gICAgVHJ1c3RlZCBCb2FyZCBCb290IGlzIGVuYWJsZWQpLgorICAgIEJMMy0yIGtleSBjZXJ0aWZpY2F0ZSBpZGVudGlmaWVyLCB1c2VkIGJ5IEJMMiB0byBsb2FkIHRoZSBCTDMtMiBrZXkKKyAgICBjZXJ0aWZpY2F0ZSAobWFuZGF0b3J5IHdoZW4gVHJ1c3RlZCBCb2FyZCBCb290IGlzIGVuYWJsZWQpLgogCi0qICAgKiojZGVmaW5lIDogQkwzMl9DRVJUX05BTUUqKgorKiAgICoqI2RlZmluZSA6IEJMMzJfQ0VSVF9JRCoqCiAKLSAgICBOYW1lIG9mIHRoZSBCTDMtMiBDb250ZW50IGNlcnRpZmljYXRlIG9uIHRoZSBob3N0IGZpbGUtc3lzdGVtIChtYW5kYXRvcnkKLSAgICB3aGVuIFRydXN0ZWQgQm9hcmQgQm9vdCBpcyBlbmFibGVkKS4KKyAgICBCTDMtMiBjb250ZW50IGNlcnRpZmljYXRlIGlkZW50aWZpZXIsIHVzZWQgYnkgQkwyIHRvIGxvYWQgdGhlIEJMMy0yIGNvbnRlbnQKKyAgICBjZXJ0aWZpY2F0ZSAobWFuZGF0b3J5IHdoZW4gVHJ1c3RlZCBCb2FyZCBCb290IGlzIGVuYWJsZWQpLgogCiAqICAgKiojZGVmaW5lIDogQkwzMl9CQVNFKioKIApAQCAtNDM0LDcgKzQ0MCw3IEBACiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBNTVUgYW5kIGRhdGEgY2FjaGVzIGRpc2FibGVkLiBJdCBpcyByZXNwb25zaWJsZQogZm9yIHBsYWNpbmcgdGhlIGV4ZWN1dGluZyBzZWNvbmRhcnkgQ1BVIGluIGEgcGxhdGZvcm0tc3BlY2lmaWMgc3RhdGUgdW50aWwgdGhlCiBwcmltYXJ5IENQVSBwZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGFjdGlvbnMgdG8gYnJpbmcgaXQgb3V0IG9mIHRoYXQgc3RhdGUgYW5kCi1hbGxvdyBlbnRyeSBpbnRvIHRoZSBPUy4KK2FsbG93IGVudHJ5IGludG8gdGhlIE9TLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybi4KIAogSW4gdGhlIEFSTSBGVlAgcG9ydCwgZWFjaCBzZWNvbmRhcnkgQ1BVIHBvd2VycyBpdHNlbGYgb2ZmLiBUaGUgcHJpbWFyeSBDUFUgaXMKIHJlc3BvbnNpYmxlIGZvciBwb3dlcmluZyB1cCB0aGUgc2Vjb25kYXJ5IENQVSB3aGVuIG5vcm1hbCB3b3JsZCBzb2Z0d2FyZQpAQCAtNDY2LDE1ICs0NzIsMzYgQEAKIHByb3ZpZGluZyB0aGUgd2FybS1ib290IGVudHJ5LXBvaW50IGFkZHJlc3Nlcy4KIAogCi0jIyMgRnVuY3Rpb246IHBsYXRfbWF0Y2hfcm90cGsoKQorIyMjIEZ1bmN0aW9uOiBwbGF0X2dldF9yb3Rwa19pbmZvKCkKIAotICAgIEFyZ3VtZW50IDogY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQKKyAgICBBcmd1bWVudCA6IHZvaWQgKiwgdm9pZCAqKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqCiAgICAgUmV0dXJuICAgOiBpbnQKIAotVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkgd2hlbiBUcnVzdGVkIEJvYXJkIEJvb3QgaXMgZW5hYmxlZC4gSXQgcmVjZWl2ZXMgYQotcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2lnbmluZyBrZXkgYW5kIGl0cyBzaXplIGFzIHBhcmFtZXRlcnMgYW5kCi1yZXR1cm5zIDAgKHN1Y2Nlc3MpIGlmIHRoYXQga2V5IG1hdGNoZXMgdGhlIFJPVCAoUm9vdCBPZiBUcnVzdCkga2V5IHN0b3JlZCBpbgotdGhlIHBsYXRmb3JtLiBBbnkgb3RoZXIgcmV0dXJuIHZhbHVlIG1lYW5zIGEgbWlzbWF0Y2guCitUaGlzIGZ1bmN0aW9uIGlzIG1hbmRhdG9yeSB3aGVuIFRydXN0ZWQgQm9hcmQgQm9vdCBpcyBlbmFibGVkLiBJdCByZXR1cm5zIGEKK3BvaW50ZXIgdG8gdGhlIFJPVFBLIHN0b3JlZCBpbiB0aGUgcGxhdGZvcm0gKG9yIGEgaGFzaCBvZiBpdCkgYW5kIGl0cyBsZW5ndGguCitUaGUgUk9UUEsgbXVzdCBiZSBlbmNvZGVkIGluIERFUiBmb3JtYXQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgQVNOLjEKK3N0cnVjdHVyZToKKworICAgIEFsZ29yaXRobUlkZW50aWZpZXIgIDo6PSAgU0VRVUVOQ0UgIHsKKyAgICAgICAgYWxnb3JpdGhtICAgICAgICAgT0JKRUNUIElERU5USUZJRVIsCisgICAgICAgIHBhcmFtZXRlcnMgICAgICAgIEFOWSBERUZJTkVEIEJZIGFsZ29yaXRobSBPUFRJT05BTAorICAgIH0KKworICAgIFN1YmplY3RQdWJsaWNLZXlJbmZvICA6Oj0gIFNFUVVFTkNFICB7CisgICAgICAgIGFsZ29yaXRobSAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgICAgICAgIHN1YmplY3RQdWJsaWNLZXkgIEJJVCBTVFJJTkcKKyAgICB9CisKK0luIGNhc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBoYXNoIG9mIHRoZSBrZXk6CisKKyAgICBEaWdlc3RJbmZvIDo6PSBTRVFVRU5DRSB7CisgICAgICAgIGRpZ2VzdEFsZ29yaXRobSAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgICAgICAgIGRpZ2VzdCAgICAgICAgICAgIE9DVEVUIFNUUklORworICAgIH0KKworVGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLiBBbnkgb3RoZXIgdmFsdWUgbWVhbnMgdGhlIFJPVFBLIGNvdWxkIG5vdCBiZQorcmV0cmlldmVkIGZyb20gdGhlIHBsYXRmb3JtLiBUaGUgZnVuY3Rpb24gYWxzbyByZXBvcnRzIGV4dHJhIGluZm9ybWF0aW9uIHJlbGF0ZWQKK3RvIHRoZSBST1RQSyBpbiB0aGUgZmxhZ3MgcGFyYW1ldGVyLgogCiAKIApAQCAtNTY5LDcgKzU5Niw3IEBACiAKIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcuIElmIGEgcGxhdGZvcm0gbmVlZHMgdG8gb3ZlcnJpZGUKIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCByZWZlciB0byB0aGUgW0Zpcm13YXJlIERlc2lnbl0gZm9yIGdlbmVyYWwKLWd1aWRlbGluZXMgcmVnYXJkaW5nIHBsYWNlbWVudCBvZiBjb2RlIGluIGEgcmVzZXQgaGFuZGxlci4KK2d1aWRlbGluZXMuCiAKICMjIyBGdW5jdGlvbiA6IHBsYXRfZGlzYWJsZV9hY3AoKQogCkBAIC0xNTM3LDEwICsxNTY0LDExIEBACiBvcGVyYXRpb25zIHN1Y2ggYXMgbG9hZGluZyBhIGJvb3Rsb2FkZXIgaW1hZ2UuCiAKIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgYWxsb3dzIGZvciBrbm93biBpbWFnZXMgdG8gYmUgbG9hZGVkIGJ5IHRoZQotZmlybXdhcmUuICBUaGVzZSBpbWFnZXMgYXJlIHNwZWNpZmllZCBieSB1c2luZyB0aGVpciBuYW1lcywgYXMgZGVmaW5lZCBpbgotW2luY2x1ZGUvcGxhdC9jb21tb24vcGxhdGZvcm0uaF0uIFRoZSBwbGF0Zm9ybSBsYXllciAoYHBsYXRfZ2V0X2ltYWdlX3NvdXJjZSgpYCkKLXRoZW4gcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGRldmljZSBhbmQgYSBkcml2ZXItc3BlY2lmaWMgYHNwZWNgIHdoaWNoIHdpbGwgYmUKLXVuZGVyc3Rvb2QgYnkgdGhlIGRyaXZlciB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIGltYWdlIGRhdGEuCitmaXJtd2FyZS4gVGhlc2UgaW1hZ2VzIGFyZSBzcGVjaWZpZWQgYnkgdXNpbmcgdGhlaXIgaWRlbnRpZmllcnMsIGFzIGRlZmluZWQgaW4KK1tpbmNsdWRlL3BsYXQvY29tbW9uL3BsYXRmb3JtX2RlZi5oXSAob3IgYSBzZXBhcmF0ZSBoZWFkZXIgZmlsZSBpbmNsdWRlZCBmcm9tCit0aGVyZSkuIFRoZSBwbGF0Zm9ybSBsYXllciAoYHBsYXRfZ2V0X2ltYWdlX3NvdXJjZSgpYCkgdGhlbiByZXR1cm5zIGEgcmVmZXJlbmNlCit0byBhIGRldmljZSBhbmQgYSBkcml2ZXItc3BlY2lmaWMgYHNwZWNgIHdoaWNoIHdpbGwgYmUgdW5kZXJzdG9vZCBieSB0aGUgZHJpdmVyCit0byBhbGxvdyBhY2Nlc3MgdG8gdGhlIGltYWdlIGRhdGEuCiAKIFRoZSBsYXllciBpcyBkZXNpZ25lZCBpbiBzdWNoIGEgd2F5IHRoYXQgaXMgaXQgcG9zc2libGUgdG8gY2hhaW4gZHJpdmVycyB3aXRoCiBvdGhlciBkcml2ZXJzLiAgRm9yIGV4YW1wbGUsIGZpbGUtc3lzdGVtIGRyaXZlcnMgbWF5IGJlIGltcGxlbWVudGVkIG9uIHRvcCBvZgpkaWZmIC0tZ2l0IGEvZG9jcy90cnVzdGVkLWJvYXJkLWJvb3QubWQgYi9kb2NzL3RydXN0ZWQtYm9hcmQtYm9vdC5tZAppbmRleCBmM2I5ZjE0Li4xY2ZhODQzIDEwMDY0NAotLS0gYS9kb2NzL3RydXN0ZWQtYm9hcmQtYm9vdC5tZAorKysgYi9kb2NzL3RydXN0ZWQtYm9hcmQtYm9vdC5tZApAQCAtNiw3ICs2LDcgQEAKIDEuICBbSW50cm9kdWN0aW9uXSgjMS0taW50cm9kdWN0aW9uKQogMi4gIFtDaGFpbiBvZiBUcnVzdF0oIzItLWNoYWluLW9mLXRydXN0KQogMy4gIFtUcnVzdGVkIEJvYXJkIEJvb3QgU2VxdWVuY2VdKCMzLS10cnVzdGVkLWJvYXJkLWJvb3Qtc2VxdWVuY2UpCi00LiAgW0F1dGhlbnRpY2F0aW9uIE1vZHVsZV0oIzQtLWF1dGhlbnRpY2F0aW9uLW1vZHVsZSkKKzQuICBbQXV0aGVudGljYXRpb24gRnJhbWV3b3JrXSgjNC0tYXV0aGVudGljYXRpb24tZnJhbWV3b3JrKQogNS4gIFtDZXJ0aWZpY2F0ZSBHZW5lcmF0aW9uIFRvb2xdKCM1LS1jZXJ0aWZpY2F0ZS1nZW5lcmF0aW9uLXRvb2wpCiAKIApAQCAtMjA5LDI3ICsyMDksMTUgQEAKIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgogCiAKLTQuICBBdXRoZW50aWNhdGlvbiBNb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzQuICBBdXRoZW50aWNhdGlvbiBGcmFtZXdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSByZXF1aXJlZCBzdXBwb3J0IHRvIGF1dGhlbnRpY2F0ZSB0aGUKLWNvcnJlc3BvbmRpbmcgY2VydGlmaWNhdGVzIG9yIGltYWdlcyBhdCBlYWNoIHN0ZXAgaW4gdGhlIFRydXN0ZWQgQm9hcmQgQm9vdAotc2VxdWVuY2UuIFRoZSBtb2R1bGUgcmVsaWVzIG9uIHRoZSBQb2xhclNTTCBsaWJyYXJ5ICh2MS4zLjkpIHRvIHBlcmZvcm0gdGhlCi1mb2xsb3dpbmcgb3BlcmF0aW9uczoKK1RoZSBhdXRoZW50aWNhdGlvbiBmcmFtZXdvcmsgaW5jbHVkZWQgaW4gdGhlIFRydXN0ZWQgRmlybXdhcmUgcHJvdmlkZXMgc3VwcG9ydAordG8gaW1wbGVtZW50IHRoZSBkZXNpcmVkIHRydXN0ZWQgYm9vdCBzZXF1ZW5jZS4gQVJNIHBsYXRmb3JtcyB1c2UgdGhpcyBmcmFtZXdvcmsKK3RvIGltcGxlbWVudCB0aGUgYm9vdCByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGluIHRoZSBUQkJSLWNsaWVudCBkb2N1bWVudC4KIAotKiAgIFBhcnNpbmcgWC41MDkgY2VydGlmaWNhdGVzIGFuZCB2ZXJpZnlpbmcgdGhlbSB1c2luZyBTSEEtMjU2IHdpdGggUlNBCi0gICAgRW5jcnlwdGlvbi4KLSogICBFeHRyYWN0aW5nIHB1YmxpYyBrZXlzIGFuZCBoYXNoZXMgZnJvbSB0aGUgY2VydGlmaWNhdGVzLgotKiAgIEdlbmVyYXRpbmcgaGFzaGVzIChTSEEtMjU2KSBvZiBib290IGxvYWRlciBpbWFnZXMKLQotQXQgZWFjaCBzdGVwLCB0aGUgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIG1lbW9yeSB0byBzdG9yZSB0aGUKLXB1YmxpYyBrZXlzIG9yIGhhc2hlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBsYXRlciBzdGVwcy4gVGhlIHN0ZXAgaWRlbnRpZmllciBpcwotdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBpbmZvcm1hdGlvbiBtdXN0IGJlIHNhdmVkLCBhY2NvcmRpbmcgdG8gdGhlIENvVCBtb2RlbAotZGV0YWlsZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb25zLgotCi1UaGUgYXV0aGVudGljYXRpb24gbW9kdWxlIHJlc2lkZXMgaW4gdGhlIGBjb21tb24vYXV0aC9wb2xhcnNzbGAgZGlyZWN0b3J5LgotSW5zdHJ1Y3Rpb25zIGZvciBpbmNsdWRpbmcgdGhlIG5lY2Vzc2FyeSBtb2R1bGVzIG9mIHRoZSBQb2xhclNTTCBTU0wgbGlicmFyeSBhbmQKLWJ1aWxkaW5nIHRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgY2FuIGJlIGZvdW5kIGluIHRoZSBbVXNlciBHdWlkZV0uCitNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdXRoZW50aWNhdGlvbiBmcmFtZXdvcmsgY2FuIGJlIGZvdW5kIGluIHRoZQorW0F1dGggRnJhbWV3b3JrXSBkb2N1bWVudC4KIAogCiA1LiAgQ2VydGlmaWNhdGUgR2VuZXJhdGlvbiBUb29sCkBAIC0yNTcsNCArMjQ1LDUgQEAKIAogW1guNTA5IHYzXTogICAgICAgICAgaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNTI4MC50eHQKIFtYLjY5MF06ICAgICAgICAgICAgIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9zdHVkeWdyb3Vwcy9jb20xNy9sYW5ndWFnZXMvWC42OTAtMDIwNy5wZGYKK1tBdXRoIEZyYW1ld29ya106ICAgIGF1dGgtZnJhbWV3b3JrLm1kCiBbVXNlciBHdWlkZV06ICAgICAgICB1c2VyLWd1aWRlLm1kCmRpZmYgLS1naXQgYS9kb2NzL3VzZXItZ3VpZGUubWQgYi9kb2NzL3VzZXItZ3VpZGUubWQKaW5kZXggOWE5MzM0Zi4uNDcwYzY5ZiAxMDA2NDQKLS0tIGEvZG9jcy91c2VyLWd1aWRlLm1kCisrKyBiL2RvY3MvdXNlci1ndWlkZS5tZApAQCAtMjY1LDE2ICsyNjUsOCBAQAogKiAgIGBUUlVTVEVEX0JPQVJEX0JPT1RgOiBCb29sZWFuIGZsYWcgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgVHJ1c3RlZCBCb2FyZAogICAgIEJvb3QgZmVhdHVyZS4gV2hlbiBzZXQgdG8gJzEnLCBCTDEgYW5kIEJMMiBpbWFnZXMgaW5jbHVkZSBzdXBwb3J0IHRvIGxvYWQKICAgICBhbmQgdmVyaWZ5IHRoZSBjZXJ0aWZpY2F0ZXMgYW5kIGltYWdlcyBpbiBhIEZJUC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJzAnLgotICAgIEEgc3VjY2Vzc2Z1bCBidWlsZCwgd2hlbiBgVFJVU1RFRF9CT0FSRF9CT09UPTFgLCBkZXBlbmRzIHVwb24gdGhlIGNvcnJlY3QKLSAgICBpbml0aWFsaXphdGlvbiBvZiB0aGUgYEFVVEhfTU9EYCBvcHRpb24uIEdlbmVyYXRpb24gYW5kIGluY2x1c2lvbiBvZgotICAgIGNlcnRpZmljYXRlcyBpbiB0aGUgRklQIGRlcGVuZHMgdXBvbiB0aGUgdmFsdWUgb2YgdGhlIGBHRU5FUkFURV9DT1RgIG9wdGlvbi4KLQotKiAgIGBBVVRIX01PRGA6IFRoaXMgb3B0aW9uIGlzIHVzZWQgd2hlbiBgVFJVU1RFRF9CT0FSRF9CT09UPTFgLiBJdCBzcGVjaWZpZXMKLSAgICB0aGUgbmFtZSBvZiB0aGUgYXV0aGVudGljYXRpb24gbW9kdWxlIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBUcnVzdGVkIEJvYXJkCi0gICAgQm9vdCBzZXF1ZW5jZS4gVGhlIG1vZHVsZSBtdXN0IGJlIGxvY2F0ZWQgaW4gYGNvbW1vbi9hdXRoLzxtb2R1bGUgbmFtZT5gCi0gICAgZGlyZWN0b3J5LiBUaGUgZGlyZWN0b3J5IG11c3QgY29udGFpbiBhIG1ha2VmaWxlIGA8bW9kdWxlIG5hbWU+Lm1rYCB3aGljaAotICAgIHdpbGwgYmUgdXNlZCB0byBidWlsZCB0aGUgbW9kdWxlLiBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbgotICAgIFtUcnVzdGVkIEJvYXJkIEJvb3RdLiBUaGUgZGVmYXVsdCBtb2R1bGUgbmFtZSBpcyAnbm9uZScuCisgICAgR2VuZXJhdGlvbiBhbmQgaW5jbHVzaW9uIG9mIGNlcnRpZmljYXRlcyBpbiB0aGUgRklQIGRlcGVuZHMgdXBvbiB0aGUgdmFsdWUKKyAgICBvZiB0aGUgYEdFTkVSQVRFX0NPVGAgb3B0aW9uLgogCiAqICAgYEdFTkVSQVRFX0NPVGA6IEJvb2xlYW4gZmxhZyB1c2VkIHRvIGJ1aWxkIGFuZCBleGVjdXRlIHRoZSBgY2VydF9jcmVhdGVgCiAgICAgdG9vbCB0byBjcmVhdGUgY2VydGlmaWNhdGVzIGFzIHBlciB0aGUgQ2hhaW4gb2YgVHJ1c3QgZGVzY3JpYmVkIGluCkBAIC0yOTcsMjggKzI4OSw0NCBAQAogICAgIGNlcnRpZmljYXRlIGdlbmVyYXRpb24gdG9vbCB0byBjcmVhdGUgbmV3IGtleXMgaW4gY2FzZSBubyB2YWxpZCBrZXlzIGFyZQogICAgIHByZXNlbnQgb3Igc3BlY2lmaWVkLiBBbGxvd2VkIG9wdGlvbnMgYXJlICcwJyBvciAnMScuIERlZmF1bHQgaXMgJzEnLgogCisqICAgYFNBVkVfS0VZU2A6IFRoaXMgb3B0aW9uIGlzIHVzZWQgd2hlbiBgR0VORVJBVEVfQ09UPTFgLiBJdCB0ZWxscyB0aGUKKyAgICBjZXJ0aWZpY2F0ZSBnZW5lcmF0aW9uIHRvb2wgdG8gc2F2ZSB0aGUga2V5cyB1c2VkIHRvIGVzdGFibGlzaCB0aGUgQ2hhaW4gb2YKKyAgICBUcnVzdC4gQWxsb3dlZCBvcHRpb25zIGFyZSAnMCcgb3IgJzEnLiBEZWZhdWx0IGlzICcwJyAoZG8gbm90IHNhdmUpLgorCisgICAgTm90ZTogVGhpcyBvcHRpb24gZGVwZW5kcyBvbiAnQ1JFQVRFX0tFWVMnIHRvIGJlIGVuYWJsZWQuIElmIHRoZSBrZXlzCisgICAgYWxyZWFkeSBleGlzdCBpbiBkaXNrLCB0aGV5IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aG91dCBmdXJ0aGVyIG5vdGljZS4KKwogKiAgIGBST1RfS0VZYDogVGhpcyBvcHRpb24gaXMgdXNlZCB3aGVuIGBHRU5FUkFURV9DT1Q9MWAuIEl0IHNwZWNpZmllcyB0aGUKLSAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIFJPVCBwcml2YXRlIGtleSBpbiBQRU0gZm9ybWF0LgorICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgUk9UIHByaXZhdGUga2V5IGluIFBFTSBmb3JtYXQuIElmIGBTQVZFX0tFWVM9MWAsIHRoaXMKKyAgICBmaWxlIG5hbWUgd2lsbCBiZSB1c2VkIHRvIHNhdmUgdGhlIGtleS4KIAogKiAgIGBUUlVTVEVEX1dPUkxEX0tFWWA6IFRoaXMgb3B0aW9uIGlzIHVzZWQgd2hlbiBgR0VORVJBVEVfQ09UPTFgLiBJdAogICAgIHNwZWNpZmllcyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBUcnVzdGVkIFdvcmxkIHByaXZhdGUga2V5IGluIFBFTQotICAgIGZvcm1hdC4KKyAgICBmb3JtYXQuIElmIGBTQVZFX0tFWVM9MWAsIHRoaXMgZmlsZSBuYW1lIHdpbGwgYmUgdXNlZCB0byBzYXZlIHRoZSBrZXkuCiAKICogICBgTk9OX1RSVVNURURfV09STERfS0VZYDogVGhpcyBvcHRpb24gaXMgdXNlZCB3aGVuIGBHRU5FUkFURV9DT1Q9MWAuIEl0CiAgICAgc3BlY2lmaWVzIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIE5vbi1UcnVzdGVkIFdvcmxkIHByaXZhdGUga2V5IGluIFBFTQotICAgIGZvcm1hdC4KKyAgICBmb3JtYXQuIElmIGBTQVZFX0tFWVM9MWAsIHRoaXMgZmlsZSBuYW1lIHdpbGwgYmUgdXNlZCB0byBzYXZlIHRoZSBrZXkuCiAKICogICBgQkwzMF9LRVlgOiBUaGlzIG9wdGlvbiBpcyB1c2VkIHdoZW4gYEdFTkVSQVRFX0NPVD0xYC4gSXQgc3BlY2lmaWVzIHRoZQotICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgQkwzLTAgcHJpdmF0ZSBrZXkgaW4gUEVNIGZvcm1hdC4KKyAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIEJMMy0wIHByaXZhdGUga2V5IGluIFBFTSBmb3JtYXQuIElmIGBTQVZFX0tFWVM9MWAsCisgICAgdGhpcyBmaWxlIG5hbWUgd2lsbCBiZSB1c2VkIHRvIHNhdmUgdGhlIGtleS4KIAogKiAgIGBCTDMxX0tFWWA6IFRoaXMgb3B0aW9uIGlzIHVzZWQgd2hlbiBgR0VORVJBVEVfQ09UPTFgLiBJdCBzcGVjaWZpZXMgdGhlCi0gICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBCTDMtMSBwcml2YXRlIGtleSBpbiBQRU0gZm9ybWF0LgorICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgQkwzLTEgcHJpdmF0ZSBrZXkgaW4gUEVNIGZvcm1hdC4gSWYgYFNBVkVfS0VZUz0xYCwKKyAgICB0aGlzIGZpbGUgbmFtZSB3aWxsIGJlIHVzZWQgdG8gc2F2ZSB0aGUga2V5LgogCiAqICAgYEJMMzJfS0VZYDogVGhpcyBvcHRpb24gaXMgdXNlZCB3aGVuIGBHRU5FUkFURV9DT1Q9MWAuIEl0IHNwZWNpZmllcyB0aGUKLSAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIEJMMy0yIHByaXZhdGUga2V5IGluIFBFTSBmb3JtYXQuCisgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBCTDMtMiBwcml2YXRlIGtleSBpbiBQRU0gZm9ybWF0LiBJZiBgU0FWRV9LRVlTPTFgLAorICAgIHRoaXMgZmlsZSBuYW1lIHdpbGwgYmUgdXNlZCB0byBzYXZlIHRoZSBrZXkuCiAKICogICBgQkwzM19LRVlgOiBUaGlzIG9wdGlvbiBpcyB1c2VkIHdoZW4gYEdFTkVSQVRFX0NPVD0xYC4gSXQgc3BlY2lmaWVzIHRoZQotICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgQkwzLTMgcHJpdmF0ZSBrZXkgaW4gUEVNIGZvcm1hdC4KKyAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIEJMMy0zIHByaXZhdGUga2V5IGluIFBFTSBmb3JtYXQuIElmIGBTQVZFX0tFWVM9MWAsCisgICAgdGhpcyBmaWxlIG5hbWUgd2lsbCBiZSB1c2VkIHRvIHNhdmUgdGhlIGtleS4KKworKiAgIGBQUk9HUkFNTUFCTEVfUkVTRVRfQUREUkVTU2A6IFRoaXMgb3B0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXNldAorICAgIHZlY3RvciBhZGRyZXNzIGNhbiBiZSBwcm9ncmFtbWVkIG9yIGlzIGZpeGVkIG9uIHRoZSBwbGF0Zm9ybS4gSXQgY2FuIHRha2UKKyAgICBlaXRoZXIgMCAoZml4ZWQpIG9yIDEgKHByb2dyYW1tYWJsZSkuIERlZmF1bHQgaXMgMC4KIAogIyMjIyBBUk0gZGV2ZWxvcG1lbnQgcGxhdGZvcm0gc3BlY2lmaWMgYnVpbGQgb3B0aW9ucwogCkBAIC0zMzAsNiArMzM4LDIzIEBACiBGb3IgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGVzZSBvcHRpb25zLCB0aGUgQVJNIGRldmVsb3BtZW50IHBsYXRmb3JtIG1lbW9yeQogbWFwIGlzIGV4cGxhaW5lZCBpbiB0aGUgW0Zpcm13YXJlIERlc2lnbl0uCiAKKyogICBgQVJNX1JPVFBLX0xPQ0FUSU9OYDogdXNlZCB3aGVuIGBUUlVTVEVEX0JPQVJEX0JPT1Q9MWAuIEl0IHNwZWNpZmllcyB0aGUKKyAgICBsb2NhdGlvbiBvZiB0aGUgUk9UUEsgaGFzaCByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gYHBsYXRfZ2V0X3JvdHBrX2luZm8oKWAKKyAgICBmb3IgQVJNIHBsYXRmb3Jtcy4gRGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBvcHRpb24sIHRoZSBwcm9wZXIgcHJpdmF0ZSBrZXkKKyAgICBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyB0aGUgYFJPVF9LRVlgIG9wdGlvbiB3aGVuIGJ1aWxkaW5nIHRoZSBUcnVzdGVkCisgICAgRmlybXdhcmUuIFRoaXMgcHJpdmF0ZSBrZXkgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjZXJ0aWZpY2F0ZSBnZW5lcmF0aW9uIHRvb2wKKyAgICB0byBzaWduIHRoZSBCTDIgYW5kIFRydXN0ZWQgS2V5IGNlcnRpZmljYXRlcy4gQXZhaWxhYmxlIG9wdGlvbnMgZm9yCisgICAgYEFSTV9ST1RQS19MT0NBVElPTmAgYXJlOgorCisgICAgLSAgIGByZWdzYCA6IHJldHVybiB0aGUgUk9UUEsgaGFzaCBzdG9yZWQgaW4gdGhlIFRydXN0ZWQgcm9vdC1rZXkgc3RvcmFnZQorICAgICAgICByZWdpc3RlcnMuIFRoZSBwcml2YXRlIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgUk9UUEsgaGFzaCBpcyBub3QKKyAgICAgICAgY3VycmVudGx5IGF2YWlsYWJsZS4KKyAgICAtICAgYGRldmVsX3JzYWAgOiByZXR1cm4gYSBkZXZlbG9wbWVudCBwdWJsaWMga2V5IGhhc2ggZW1iZWRkZWQgaW4gdGhlIEJMMQorICAgICAgICBhbmQgQkwyIGJpbmFyaWVzLiBUaGlzIGhhc2ggaGFzIGJlZW4gb2J0YWluZWQgZnJvbSB0aGUgUlNBIHB1YmxpYyBrZXkKKyAgICAgICAgYGFybV9yb3Rwa19yc2EuZGVyYCwgbG9jYXRlZCBpbiBgcGxhdC9hcm0vYm9hcmQvY29tbW9uL3JvdHBrYC4gVG8gdXNlCisgICAgICAgIHRoaXMgb3B0aW9uLCBgYXJtX3JvdHByaXZrX3JzYS5wZW1gIG11c3QgYmUgc3BlY2lmaWVkIGFzIGBST1RfS0VZYCB3aGVuCisgICAgICAgIGNyZWF0aW5nIHRoZSBjZXJ0aWZpY2F0ZXMuCisKICMjIyMgQVJNIENTUyBwbGF0Zm9ybSBzcGVjaWZpYyBidWlsZCBvcHRpb25zCiAKICogICBgQ1NTX0RFVEVDVF9QUkVfMV83XzBfU0NQYDogQm9vbGVhbiBmbGFnIHRvIGRldGVjdCBTQ1AgdmVyc2lvbgpAQCAtNDgyLDI1ICs1MDcsNTggQEAKIGZvbGxvd2luZyBzdGVwcyBzaG91bGQgYmUgZm9sbG93ZWQgdG8gYnVpbGQgYSBGSVAgaW1hZ2Ugd2l0aCBzdXBwb3J0IGZvciB0aGlzCiBmZWF0dXJlLgogCi0xLiAgRnVsZmlsbCB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBgcG9sYXJzc2xgIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSBieSBjaGVja2luZwotICAgIG91dCB0aGUgdGFnIGBwb2xhcnNzbC0xLjMuOWAgZnJvbSB0aGUgW1BvbGFyU1NMIFJlcG9zaXRvcnldLgorMS4gIEZ1bGZpbGwgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgYG1iZWR0bHNgIGNyeXB0b2dyYXBoaWMgYW5kIGltYWdlIHBhcnNlcgorICAgIG1vZHVsZXMgYnkgY2hlY2tpbmcgb3V0IHRoZSB0YWcgYG1iZWR0bHMtMS4zLjExYCBmcm9tIHRoZQorICAgIFttYmVkVExTIFJlcG9zaXRvcnldLgogCi0gICAgVGhlIGBjb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbC5ta2AgY29udGFpbnMgdGhlIGxpc3Qgb2YgUG9sYXJTU0wgc291cmNlCi0gICAgZmlsZXMgdGhlIG1vZHVsZSBkZXBlbmRzIHVwb24uIGBjb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbF9jb25maWcuaGAKLSAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBQb2xhclNTTCBzb3VyY2VzLgorICAgIFRoZSBgZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc18qLm1rYCBmaWxlcyBjb250YWluIHRoZSBsaXN0IG9mIG1iZWRUTFMKKyAgICBzb3VyY2UgZmlsZXMgdGhlIG1vZHVsZXMgZGVwZW5kIHVwb24uCisgICAgYGluY2x1ZGUvZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc19jb25maWcuaGAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICBvcHRpb25zIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBtYmVkVExTIHNvdXJjZXMuCiAKLSAgICBOb3RlIHRoYXQgdGhlIFBvbGFyU1NMIFNTTCBsaWJyYXJ5IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR1BMIHZlcnNpb24gMgotICAgIG9yIGxhdGVyIGxpY2Vuc2UuIFVzaW5nIFBvbGFyU1NMIHNvdXJjZSBjb2RlIHdpbGwgYWZmZWN0IHRoZSBsaWNlbnNpbmcgb2YKKyAgICBOb3RlIHRoYXQgdGhlIG1iZWRUTFMgbGlicmFyeSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdQTCB2ZXJzaW9uIDIKKyAgICBvciBsYXRlciBsaWNlbnNlLiBVc2luZyBtYmVkVExTIHNvdXJjZSBjb2RlIHdpbGwgYWZmZWN0IHRoZSBsaWNlbnNpbmcgb2YKICAgICBUcnVzdGVkIEZpcm13YXJlIGJpbmFyaWVzIHRoYXQgYXJlIGJ1aWx0IHVzaW5nIHRoaXMgbGlicmFyeS4KIAogMi4gIEVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIHZhcmlhYmxlcyBhcmUgc2V0IHdoaWxlIGludm9raW5nCiAgICAgYG1ha2VgIHRvIGJ1aWxkIFRydXN0ZWQgRmlybXdhcmU6CiAKLSAgICAqICAgYFBPTEFSU1NMX0RJUj08cGF0aCBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgUG9sYXJTU0wgc291cmNlcz5gCi0gICAgKiAgIGBBVVRIX01PRD1wb2xhcnNzbGAKKyAgICAqICAgYE1CRURUTFNfRElSPTxwYXRoIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBtYmVkVExTIHNvdXJjZXM+YAogICAgICogICBgVFJVU1RFRF9CT0FSRF9CT09UPTFgCiAgICAgKiAgIGBHRU5FUkFURV9DT1Q9MWAKIAorICAgIEluIHRoZSBjYXNlIG9mIEFSTSBwbGF0Zm9ybXMsIHRoZSBsb2NhdGlvbiBvZiB0aGUgUk9UUEsgaGFzaCBtdXN0IGFsc28gYmUKKyAgICBzcGVjaWZpZWQgYXQgYnVpbGQgdGltZS4gVHdvIGxvY2F0aW9ucyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCAoc2VlCisgICAgYEFSTV9ST1RQS19MT0NBVElPTmAgYnVpbGQgb3B0aW9uKToKKworICAgICogICBgQVJNX1JPVFBLX0xPQ0FUSU9OPXJlZ3NgOiB0aGUgUk9UUEsgaGFzaCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBUcnVzdGVkCisgICAgICAgIHJvb3Qta2V5IHN0b3JhZ2UgcmVnaXN0ZXJzIHByZXNlbnQgaW4gdGhlIHBsYXRmb3JtLiBPbiBKdW5vLCB0aGlzCisgICAgICAgIHJlZ2lzdGVycyBhcmUgcmVhZC1vbmx5LiBPbiBGVlAgQmFzZSBhbmQgQ29ydGV4IG1vZGVscywgdGhlIHJlZ2lzdGVycworICAgICAgICBhcmUgcmVhZC1vbmx5LCBidXQgdGhlIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIGNvbW1hbmQgbGluZQorICAgICAgICBvcHRpb24gYGJwLnRydXN0ZWRfa2V5X3N0b3JhZ2UucHVibGljX2tleWAgd2hlbiBsYXVuY2hpbmcgdGhlIG1vZGVsLgorICAgICAgICBPbiBib3RoIEp1bm8gYW5kIEZWUCBtb2RlbHMsIHRoZSBkZWZhdWx0IHZhbHVlIGNvcnJlc3BvbmRzIHRvIGFuCisgICAgICAgIEVDRFNBLVNFQ1AyNTZSMSBwdWJsaWMga2V5IGhhc2gsIHdob3NlIHByaXZhdGUgcGFydCBpcyBub3QgY3VycmVudGx5CisgICAgICAgIGF2YWlsYWJsZS4KKworICAgICogICBgQVJNX1JPVFBLX0xPQ0FUSU9OPWRldmVsX3JzYWA6IHVzZSB0aGUgUk9UUEsgaGFzaCB0aGF0IGlzIGhhcmRjb2RlZAorICAgICAgICBpbiB0aGUgQVJNIHBsYXRmb3JtIHBvcnQuIFRoZSBwcml2YXRlL3B1YmxpYyBSU0Ega2V5IHBhaXIgbWF5IGJlCisgICAgICAgIGZvdW5kIGluIGBwbGF0L2FybS9ib2FyZC9jb21tb24vcm90cGtgLgorCisgICAgRXhhbXBsZSBvZiBjb21tYW5kIGxpbmUgdXNpbmcgUlNBIGRldmVsb3BtZW50IGtleXM6CisKKyAgICAgICAgQ1JPU1NfQ09NUElMRT08cGF0aC10by1hYXJjaDY0LWdjYz4vYmluL2FhcmNoNjQtbm9uZS1lbGYtICAgICAgIFwKKyAgICAgICAgQkwzMz08cGF0aC10bz4vPGJsMzNfaW1hZ2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUJFRFRMU19ESVI9PHBhdGggb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIG1iZWRUTFMgc291cmNlcz4gIFwKKyAgICAgICAgbWFrZSBQTEFUPTxwbGF0Zm9ybT4gVFJVU1RFRF9CT0FSRF9CT09UPTEgR0VORVJBVEVfQ09UPTEgICAgICAgIFwKKyAgICAgICAgQVJNX1JPVFBLX0xPQ0FUSU9OPWRldmVsX3JzYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUk9UX0tFWT1wbGF0L2FybS9ib2FyZC9jb21tb24vcm90cGsvYXJtX3JvdHByaXZrX3JzYS5wZW0gICAgICAgIFwKKyAgICAgICAgYWxsIGZpcAorCisgICAgVGhlIHJlc3VsdCBvZiB0aGlzIGJ1aWxkIHdpbGwgYmUgdGhlIGJsMS5iaW4gYW5kIHRoZSBmaXAuYmluIGJpbmFyaWVzLCB3aXRoCisgICAgdGhlIGRpZmZlcmVuY2UgdGhhdCB0aGUgRklQIHdpbGwgaW5jbHVkZSB0aGUgY2VydGlmaWNhdGVzIGNvcnJlc3BvbmRpbmcgdG8KKyAgICB0aGUgQ2hhaW4gb2YgVHJ1c3QgZGVzY3JpYmVkIGluIHRoZSBUQkJSLWNsaWVudCBkb2N1bWVudC4gVGhlc2UgY2VydGlmaWNhdGVzCisgICAgY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIG91dHB1dCBidWlsZCBkaXJlY3RvcnkuCisKIAogIyMjIENoZWNraW5nIHNvdXJjZSBjb2RlIHN0eWxlCiAKQEAgLTExMjAsNSArMTE3OCw1IEBACiBbTGluYXJvIFRvb2xjaGFpbl06ICAgICAgICAgICAgaHR0cDovL3JlbGVhc2VzLmxpbmFyby5vcmcvMTQuMDcvY29tcG9uZW50cy90b29sY2hhaW4vYmluYXJpZXMvCiBbRURLMl06ICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2dpdGh1Yi5jb20vdGlhbm9jb3JlL2VkazIKIFtEUy01XTogICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFybS5jb20vcHJvZHVjdHMvdG9vbHMvc29mdHdhcmUtdG9vbHMvZHMtNS9pbmRleC5waHAKLVtQb2xhcnNzbCBSZXBvc2l0b3J5XTogICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vcG9sYXJzc2wvcG9sYXJzc2wuZ2l0CitbbWJlZFRMUyBSZXBvc2l0b3J5XTogICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL0FSTW1iZWQvbWJlZHRscy5naXQKIFtUcnVzdGVkIEJvYXJkIEJvb3RdOiAgICAgICAgICB0cnVzdGVkLWJvYXJkLWJvb3QubWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXV0aC9hdXRoX21vZC5jIGIvZHJpdmVycy9hdXRoL2F1dGhfbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkM2M1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXV0aC9hdXRoX21vZC5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBBUk0gTGltaXRlZCBhbmQgQ29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFSTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKKyAqIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgKiBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGF1dGhfY29tbW9uLmg+CisjaW5jbHVkZSA8YXV0aF9tb2QuaD4KKyNpbmNsdWRlIDxjb3RfZGVmLmg+CisjaW5jbHVkZSA8Y3J5cHRvX21vZC5oPgorI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8aW1nX3BhcnNlcl9tb2QuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHBsYXRmb3JtX2RlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIHJldHVybl9pZl9lcnJvcihyYykgXAorCWRvIHsgXAorCQlpZiAocmMgIT0gMCkgeyBcCisJCQlyZXR1cm4gcmM7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworLyogUG9pbnRlciB0byBDb1QgKi8KK2V4dGVybiBjb25zdCBhdXRoX2ltZ19kZXNjX3QgKmNvbnN0IGNvdF9kZXNjX3B0cjsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXV0aF9pbWdfZmxhZ3NbXTsKKworc3RhdGljIGludCBjbXBfYXV0aF9wYXJhbV90eXBlX2Rlc2MoY29uc3QgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqYSwKKwkJY29uc3QgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqYikKK3sKKwlpZiAoKGEtPnR5cGUgPT0gYi0+dHlwZSkgJiYgKGEtPmNvb2tpZSA9PSBiLT5jb29raWUpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gb2J0YWlucyB0aGUgcmVxdWVzdGVkIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlciBkYXRhIGZyb20gdGhlCisgKiBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgcGFyZW50IGltYWdlIGFmdGVyIGl0cyBhdXRoZW50aWNhdGlvbi4KKyAqLworc3RhdGljIGludCBhdXRoX2dldF9wYXJhbShjb25zdCBhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpwYXJhbV90eXBlX2Rlc2MsCisJCQkgIGNvbnN0IGF1dGhfaW1nX2Rlc2NfdCAqaW1nX2Rlc2MsCisJCQkgIHZvaWQgKipwYXJhbSwgdW5zaWduZWQgaW50ICpsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IENPVF9NQVhfVkVSSUZJRURfUEFSQU1TIDsgaSsrKSB7CisJCWlmICgwID09IGNtcF9hdXRoX3BhcmFtX3R5cGVfZGVzYyhwYXJhbV90eXBlX2Rlc2MsCisJCQkJaW1nX2Rlc2MtPmF1dGhlbnRpY2F0ZWRfZGF0YVtpXS50eXBlX2Rlc2MpKSB7CisJCQkqcGFyYW0gPSBpbWdfZGVzYy0+YXV0aGVudGljYXRlZF9kYXRhW2ldLmRhdGEucHRyOworCQkJKmxlbiA9IGltZ19kZXNjLT5hdXRoZW50aWNhdGVkX2RhdGFbaV0uZGF0YS5sZW47CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQXV0aGVudGljYXRlIGFuIGltYWdlIGJ5IG1hdGNoaW5nIHRoZSBkYXRhIGhhc2gKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgJ0FVVEhfTUVUSE9EX0hBU0gnLiBUbyBhdXRoZW50aWNhdGUgYW4gaW1hZ2UgdXNpbmcKKyAqIHRoaXMgbWV0aG9kLCB0aGUgaW1hZ2UgbXVzdCBjb250YWluOgorICoKKyAqICAgLSBUaGUgZGF0YSB0byBjYWxjdWxhdGUgdGhlIGhhc2ggZnJvbQorICoKKyAqIFRoZSBwYXJlbnQgaW1hZ2UgbXVzdCBjb250YWluOgorICoKKyAqICAgLSBUaGUgaGFzaCB0byBiZSBtYXRjaGVkIHdpdGggKGluY2x1ZGluZyBoYXNoIGFsZ29yaXRobSkKKyAqCisgKiBGb3IgYSBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uLCBib3RoIGhhc2hlcyBtdXN0IG1hdGNoLiBUaGUgZnVuY3Rpb24gY2FsbHMKKyAqIHRoZSBjcnlwdG8tbW9kdWxlIHRvIGNoZWNrIHRoaXMgbWF0Y2hpbmcuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgcGFyYW06IHBhcmFtZXRlcnMgdG8gcGVyZm9ybSB0aGUgaGFzaCBhdXRoZW50aWNhdGlvbgorICogICBpbWdfZGVzYzogcG9pbnRlciB0byBpbWFnZSBkZXNjcmlwdG9yIHNvIHdlIGNhbiBrbm93IHRoZSBpbWFnZSB0eXBlCisgKiAgICAgICAgICAgICBhbmQgcGFyZW50IGltYWdlCisgKiAgIGltZzogcG9pbnRlciB0byBpbWFnZSBpbiBtZW1vcnkKKyAqICAgaW1nX2xlbjogbGVuZ3RoIG9mIGltYWdlIChpbiBieXRlcykKKyAqCisgKiBSZXR1cm46CisgKiAgIDAgPSBzdWNjZXNzLCBPdGhlcndpc2UgPSBlcnJvcgorICovCitzdGF0aWMgaW50IGF1dGhfaGFzaChjb25zdCBhdXRoX21ldGhvZF9wYXJhbV9oYXNoX3QgKnBhcmFtLAorCQkgICAgIGNvbnN0IGF1dGhfaW1nX2Rlc2NfdCAqaW1nX2Rlc2MsCisJCSAgICAgdm9pZCAqaW1nLCB1bnNpZ25lZCBpbnQgaW1nX2xlbikKK3sKKwl2b2lkICpkYXRhX3B0ciwgKmhhc2hfZGVyX3B0cjsKKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW4sIGhhc2hfZGVyX2xlbjsKKwlpbnQgcmMgPSAwOworCisJLyogR2V0IHRoZSBoYXNoIGZyb20gdGhlIHBhcmVudCBpbWFnZS4gVGhpcyBoYXNoIHdpbGwgYmUgREVSIGVuY29kZWQKKwkgKiBhbmQgY29udGFpbiB0aGUgaGFzaCBhbGdvcml0aG0gKi8KKwlyYyA9IGF1dGhfZ2V0X3BhcmFtKHBhcmFtLT5oYXNoLCBpbWdfZGVzYy0+cGFyZW50LAorCQkJJmhhc2hfZGVyX3B0ciwgJmhhc2hfZGVyX2xlbik7CisJcmV0dXJuX2lmX2Vycm9yKHJjKTsKKworCS8qIEdldCB0aGUgZGF0YSB0byBiZSBoYXNoZWQgZnJvbSB0aGUgY3VycmVudCBpbWFnZSAqLworCXJjID0gaW1nX3BhcnNlcl9nZXRfYXV0aF9wYXJhbShpbWdfZGVzYy0+aW1nX3R5cGUsIHBhcmFtLT5kYXRhLAorCQkJaW1nLCBpbWdfbGVuLCAmZGF0YV9wdHIsICZkYXRhX2xlbik7CisJcmV0dXJuX2lmX2Vycm9yKHJjKTsKKworCS8qIEFzayB0aGUgY3J5cHRvIG1vZHVsZSB0byB2ZXJpZnkgdGhpcyBoYXNoICovCisJcmMgPSBjcnlwdG9fbW9kX3ZlcmlmeV9oYXNoKGRhdGFfcHRyLCBkYXRhX2xlbiwKKwkJCQkgICAgaGFzaF9kZXJfcHRyLCBoYXNoX2Rlcl9sZW4pOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogQXV0aGVudGljYXRlIGJ5IGRpZ2l0YWwgc2lnbmF0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzICdBVVRIX01FVEhPRF9TSUcnLiBUbyBhdXRoZW50aWNhdGUgYW4gaW1hZ2UgdXNpbmcKKyAqIHRoaXMgbWV0aG9kLCB0aGUgaW1hZ2UgbXVzdCBjb250YWluOgorICoKKyAqICAgLSBEYXRhIHRvIGJlIHNpZ25lZAorICogICAtIFNpZ25hdHVyZQorICogICAtIFNpZ25hdHVyZSBhbGdvcml0aG0KKyAqCisgKiBXZSByZWx5IG9uIHRoZSBpbWFnZSBwYXJzZXIgbW9kdWxlIHRvIGV4dHJhY3QgdGhpcyBkYXRhIGZyb20gdGhlIGltYWdlLgorICogVGhlIHBhcmVudCBpbWFnZSBtdXN0IGNvbnRhaW46CisgKgorICogICAtIFB1YmxpYyBrZXkgKG9yIGEgaGFzaCBvZiBpdCkKKyAqCisgKiBJZiB0aGUgcGFyZW50IGltYWdlIGNvbnRhaW5zIG9ubHkgYSBoYXNoIG9mIHRoZSBrZXksIHdlIHdpbGwgdHJ5IHRvIG9idGFpbgorICogdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgaW1hZ2UgaXRzZWxmIChpLmUuIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcykuIEluIHRoYXQKKyAqIGNhc2UsIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGlzIGNvbnNpZGVyZWQganVzdCBhbiBpbnRlZ3JpdHkgY2hlY2sgYW5kCisgKiB0aGUgYXV0aGVudGljYXRpb24gaXMgZXN0YWJsaXNoZWQgYnkgY2FsY3VsYXRpbmcgdGhlIGhhc2ggb2YgdGhlIGtleSBhbmQKKyAqIGNvbXBhcmluZyBpdCB3aXRoIHRoZSBoYXNoIG9idGFpbmVkIGZyb20gdGhlIHBhcmVudC4KKyAqCisgKiBJZiB0aGUgaW1hZ2UgaGFzIG5vIHBhcmVudCAoTlVMTCksIGl0IG1lYW5zIGl0IGhhcyB0byBiZSBhdXRoZW50aWNhdGVkIHVzaW5nCisgKiB0aGUgUk9UUEsgc3RvcmVkIGluIHRoZSBwbGF0Zm9ybS4gQWdhaW4sIHRoaXMgUk9UUEsgY291bGQgYmUgdGhlIGtleSBpdHNlbGYKKyAqIG9yIGEgaGFzaCBvZiBpdC4KKyAqCisgKiBSZXR1cm46IDAgPSBzdWNjZXNzLCBPdGhlcndpc2UgPSBlcnJvcgorICovCitzdGF0aWMgaW50IGF1dGhfc2lnbmF0dXJlKGNvbnN0IGF1dGhfbWV0aG9kX3BhcmFtX3NpZ190ICpwYXJhbSwKKwkJCSAgY29uc3QgYXV0aF9pbWdfZGVzY190ICppbWdfZGVzYywKKwkJCSAgdm9pZCAqaW1nLCB1bnNpZ25lZCBpbnQgaW1nX2xlbikKK3sKKwl2b2lkICpkYXRhX3B0ciwgKnBrX3B0ciwgKnBrX2hhc2hfcHRyLCAqc2lnX3B0ciwgKnNpZ19hbGdfcHRyOworCXVuc2lnbmVkIGludCBkYXRhX2xlbiwgcGtfbGVuLCBwa19oYXNoX2xlbiwgc2lnX2xlbiwgc2lnX2FsZ19sZW47CisJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKKwlpbnQgcmMgPSAwOworCisJLyogR2V0IHRoZSBkYXRhIHRvIGJlIHNpZ25lZCBmcm9tIGN1cnJlbnQgaW1hZ2UgKi8KKwlyYyA9IGltZ19wYXJzZXJfZ2V0X2F1dGhfcGFyYW0oaW1nX2Rlc2MtPmltZ190eXBlLCBwYXJhbS0+ZGF0YSwKKwkJCWltZywgaW1nX2xlbiwgJmRhdGFfcHRyLCAmZGF0YV9sZW4pOworCXJldHVybl9pZl9lcnJvcihyYyk7CisKKwkvKiBHZXQgdGhlIHNpZ25hdHVyZSBmcm9tIGN1cnJlbnQgaW1hZ2UgKi8KKwlyYyA9IGltZ19wYXJzZXJfZ2V0X2F1dGhfcGFyYW0oaW1nX2Rlc2MtPmltZ190eXBlLCBwYXJhbS0+c2lnLAorCQkJaW1nLCBpbWdfbGVuLCAmc2lnX3B0ciwgJnNpZ19sZW4pOworCXJldHVybl9pZl9lcnJvcihyYyk7CisKKwkvKiBHZXQgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gZnJvbSBjdXJyZW50IGltYWdlICovCisJcmMgPSBpbWdfcGFyc2VyX2dldF9hdXRoX3BhcmFtKGltZ19kZXNjLT5pbWdfdHlwZSwgcGFyYW0tPmFsZywKKwkJCWltZywgaW1nX2xlbiwgJnNpZ19hbGdfcHRyLCAmc2lnX2FsZ19sZW4pOworCXJldHVybl9pZl9lcnJvcihyYyk7CisKKwkvKiBHZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgcGFyZW50LiBJZiB0aGVyZSBpcyBubyBwYXJlbnQgKE5VTEwpLAorCSAqIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgYmVlbiBzaWduZWQgd2l0aCB0aGUgUk9UUEssIHNvIHdlIGhhdmUgdG8gZ2V0CisJICogdGhlIFBLIGZyb20gdGhlIHBsYXRmb3JtICovCisJaWYgKGltZ19kZXNjLT5wYXJlbnQpIHsKKwkJcmMgPSBhdXRoX2dldF9wYXJhbShwYXJhbS0+cGssIGltZ19kZXNjLT5wYXJlbnQsCisJCQkJJnBrX3B0ciwgJnBrX2xlbik7CisJfSBlbHNlIHsKKwkJcmMgPSBwbGF0X2dldF9yb3Rwa19pbmZvKHBhcmFtLT5way0+Y29va2llLCAmcGtfcHRyLCAmcGtfbGVuLAorCQkJCSZmbGFncyk7CisJfQorCXJldHVybl9pZl9lcnJvcihyYyk7CisKKwkvKiBJZiB0aGUgUEsgaXMgYSBoYXNoIG9mIHRoZSBrZXksIHJldHJpZXZlIHRoZSBrZXkgZnJvbSB0aGUgaW1hZ2UgKi8KKwlpZiAoZmxhZ3MgJiBST1RQS19JU19IQVNIKSB7CisJCXBrX2hhc2hfcHRyID0gcGtfcHRyOworCQlwa19oYXNoX2xlbiA9IHBrX2xlbjsKKwkJcmMgPSBpbWdfcGFyc2VyX2dldF9hdXRoX3BhcmFtKGltZ19kZXNjLT5pbWdfdHlwZSwKKwkJCQkJcGFyYW0tPnBrLCBpbWcsIGltZ19sZW4sCisJCQkJCSZwa19wdHIsICZwa19sZW4pOworCQlyZXR1cm5faWZfZXJyb3IocmMpOworCisJCS8qIEFzayB0aGUgY3J5cHRvIG1vZHVsZSB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSAqLworCQlyYyA9IGNyeXB0b19tb2RfdmVyaWZ5X3NpZ25hdHVyZShkYXRhX3B0ciwgZGF0YV9sZW4sCisJCQkJCQkgc2lnX3B0ciwgc2lnX2xlbiwKKwkJCQkJCSBzaWdfYWxnX3B0ciwgc2lnX2FsZ19sZW4sCisJCQkJCQkgcGtfcHRyLCBwa19sZW4pOworCQlyZXR1cm5faWZfZXJyb3IocmMpOworCisJCS8qIEFzayB0aGUgY3J5cHRvLW1vZHVsZSB0byB2ZXJpZnkgdGhlIGtleSBoYXNoICovCisJCXJjID0gY3J5cHRvX21vZF92ZXJpZnlfaGFzaChwa19wdHIsIHBrX2xlbiwKKwkJCQkJICAgIHBrX2hhc2hfcHRyLCBwa19oYXNoX2xlbik7CisJfSBlbHNlIHsKKwkJLyogQXNrIHRoZSBjcnlwdG8gbW9kdWxlIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlICovCisJCXJjID0gY3J5cHRvX21vZF92ZXJpZnlfc2lnbmF0dXJlKGRhdGFfcHRyLCBkYXRhX2xlbiwKKwkJCQkJCSBzaWdfcHRyLCBzaWdfbGVuLAorCQkJCQkJIHNpZ19hbGdfcHRyLCBzaWdfYWxnX2xlbiwKKwkJCQkJCSBwa19wdHIsIHBrX2xlbik7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKgorICogUmV0dXJuIHRoZSBwYXJlbnQgaWQgaW4gdGhlIG91dHB1dCBwYXJhbWV0ZXIgJypwYXJlbnRfaWQnCisgKgorICogUmV0dXJuIHZhbHVlOgorICogICAwID0gSW1hZ2UgaGFzIHBhcmVudCwgMSA9IEltYWdlIGhhcyBubyBwYXJlbnQgb3IgcGFyZW50IGlzIGF1dGhlbnRpY2F0ZWQKKyAqLworaW50IGF1dGhfbW9kX2dldF9wYXJlbnRfaWQodW5zaWduZWQgaW50IGltZ19pZCwgdW5zaWduZWQgaW50ICpwYXJlbnRfaWQpCit7CisJY29uc3QgYXV0aF9pbWdfZGVzY190ICppbWdfZGVzYyA9IE5VTEw7CisKKwlhc3NlcnQocGFyZW50X2lkICE9IE5VTEwpOworCisJLyogR2V0IHRoZSBpbWFnZSBkZXNjcmlwdG9yICovCisJaW1nX2Rlc2MgPSAmY290X2Rlc2NfcHRyW2ltZ19pZF07CisKKwkvKiBDaGVjayBpZiB0aGUgaW1hZ2UgaGFzIG5vIHBhcmVudCAoUk9UKSAqLworCWlmIChpbWdfZGVzYy0+cGFyZW50ID09IE5VTEwpIHsKKwkJKnBhcmVudF9pZCA9IDA7CisJCXJldHVybiAxOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBwYXJlbnQgaGFzIGFscmVhZHkgYmVlbiBhdXRoZW50aWNhdGVkICovCisJaWYgKGF1dGhfaW1nX2ZsYWdzW2ltZ19kZXNjLT5wYXJlbnQtPmltZ19pZF0gJiBJTUdfRkxBR19BVVRIRU5USUNBVEVEKSB7CisJCSpwYXJlbnRfaWQgPSAwOworCQlyZXR1cm4gMTsKKwl9CisKKwkqcGFyZW50X2lkID0gaW1nX2Rlc2MtPnBhcmVudC0+aW1nX2lkOworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgZGlmZmVyZW50IG1vZHVsZXMgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIGZyYW1ld29yaworICovCit2b2lkIGF1dGhfbW9kX2luaXQodm9pZCkKK3sKKwkvKiBDaGVjayB3ZSBoYXZlIGEgdmFsaWQgQ29UIHJlZ2lzdGVyZWQgKi8KKwlhc3NlcnQoY290X2Rlc2NfcHRyICE9IE5VTEwpOworCisJLyogQ3J5cHRvIG1vZHVsZSAqLworCWNyeXB0b19tb2RfaW5pdCgpOworCisJLyogSW1hZ2UgcGFyc2VyIG1vZHVsZSAqLworCWltZ19wYXJzZXJfaW5pdCgpOworfQorCisvKgorICogQXV0aGVudGljYXRlIGEgY2VydGlmaWNhdGUvaW1hZ2UKKyAqCisgKiBSZXR1cm46IDAgPSBzdWNjZXNzLCBPdGhlcndpc2UgPSBlcnJvcgorICovCitpbnQgYXV0aF9tb2RfdmVyaWZ5X2ltZyh1bnNpZ25lZCBpbnQgaW1nX2lkLAorCQkJdm9pZCAqaW1nX3B0ciwKKwkJCXVuc2lnbmVkIGludCBpbWdfbGVuKQoreworCWNvbnN0IGF1dGhfaW1nX2Rlc2NfdCAqaW1nX2Rlc2MgPSBOVUxMOworCWNvbnN0IGF1dGhfbWV0aG9kX2Rlc2NfdCAqYXV0aF9tZXRob2QgPSBOVUxMOworCXZvaWQgKnBhcmFtX3B0cjsKKwl1bnNpZ25lZCBpbnQgcGFyYW1fbGVuOworCWludCByYywgaTsKKworCS8qIEdldCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBjaGFpbiBvZiB0cnVzdCAqLworCWltZ19kZXNjID0gJmNvdF9kZXNjX3B0cltpbWdfaWRdOworCisJLyogQXNrIHRoZSBwYXJzZXIgdG8gY2hlY2sgdGhlIGltYWdlIGludGVncml0eSAqLworCXJjID0gaW1nX3BhcnNlcl9jaGVja19pbnRlZ3JpdHkoaW1nX2Rlc2MtPmltZ190eXBlLCBpbWdfcHRyLCBpbWdfbGVuKTsKKwlyZXR1cm5faWZfZXJyb3IocmMpOworCisJLyogQXV0aGVudGljYXRlIHRoZSBpbWFnZSB1c2luZyB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgaW4gdGhlIGltYWdlCisJICogZGVzY3JpcHRvci4gKi8KKwlmb3IgKGkgPSAwIDsgaSA8IEFVVEhfTUVUSE9EX05VTSA7IGkrKykgeworCQlhdXRoX21ldGhvZCA9ICZpbWdfZGVzYy0+aW1nX2F1dGhfbWV0aG9kc1tpXTsKKwkJc3dpdGNoIChhdXRoX21ldGhvZC0+dHlwZSkgeworCQljYXNlIEFVVEhfTUVUSE9EX05PTkU6CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBBVVRIX01FVEhPRF9IQVNIOgorCQkJcmMgPSBhdXRoX2hhc2goJmF1dGhfbWV0aG9kLT5wYXJhbS5oYXNoLAorCQkJCQlpbWdfZGVzYywgaW1nX3B0ciwgaW1nX2xlbik7CisJCQlicmVhazsKKwkJY2FzZSBBVVRIX01FVEhPRF9TSUc6CisJCQlyYyA9IGF1dGhfc2lnbmF0dXJlKCZhdXRoX21ldGhvZC0+cGFyYW0uc2lnLAorCQkJCQlpbWdfZGVzYywgaW1nX3B0ciwgaW1nX2xlbik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIFVua25vd24gYXV0aGVudGljYXRpb24gbWV0aG9kICovCisJCQlyYyA9IDE7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm5faWZfZXJyb3IocmMpOworCX0KKworCS8qIEV4dHJhY3QgdGhlIHBhcmFtZXRlcnMgaW5kaWNhdGVkIGluIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvCisJICogYXV0aGVudGljYXRlIHRoZSBjaGlsZHJlbiBpbWFnZXMuICovCisJZm9yIChpID0gMCA7IGkgPCBDT1RfTUFYX1ZFUklGSUVEX1BBUkFNUyA7IGkrKykgeworCQlpZiAoaW1nX2Rlc2MtPmF1dGhlbnRpY2F0ZWRfZGF0YVtpXS50eXBlX2Rlc2MgPT0gTlVMTCkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBHZXQgdGhlIHBhcmFtZXRlciBmcm9tIHRoZSBpbWFnZSBwYXJzZXIgbW9kdWxlICovCisJCXJjID0gaW1nX3BhcnNlcl9nZXRfYXV0aF9wYXJhbShpbWdfZGVzYy0+aW1nX3R5cGUsCisJCQkJaW1nX2Rlc2MtPmF1dGhlbnRpY2F0ZWRfZGF0YVtpXS50eXBlX2Rlc2MsCisJCQkJaW1nX3B0ciwgaW1nX2xlbiwgJnBhcmFtX3B0ciwgJnBhcmFtX2xlbik7CisJCXJldHVybl9pZl9lcnJvcihyYyk7CisKKwkJLyogQ2hlY2sgcGFyYW1ldGVyIHNpemUgKi8KKwkJaWYgKHBhcmFtX2xlbiA+IGltZ19kZXNjLT5hdXRoZW50aWNhdGVkX2RhdGFbaV0uZGF0YS5sZW4pIHsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogQ29weSB0aGUgcGFyYW1ldGVyIGZvciBsYXRlciB1c2UgKi8KKwkJbWVtY3B5KCh2b2lkICopaW1nX2Rlc2MtPmF1dGhlbnRpY2F0ZWRfZGF0YVtpXS5kYXRhLnB0ciwKKwkJCQkodm9pZCAqKXBhcmFtX3B0ciwgcGFyYW1fbGVuKTsKKwl9CisKKwkvKiBNYXJrIGltYWdlIGFzIGF1dGhlbnRpY2F0ZWQgKi8KKwlhdXRoX2ltZ19mbGFnc1tpbWdfZGVzYy0+aW1nX2lkXSB8PSBJTUdfRkxBR19BVVRIRU5USUNBVEVEOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1dGgvY3J5cHRvX21vZC5jIGIvZHJpdmVycy9hdXRoL2NyeXB0b19tb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMyZTZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdXRoL2NyeXB0b19tb2QuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCisgKiB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjcnlwdG9fbW9kLmg+CisjaW5jbHVkZSA8ZGVidWcuaD4KKworLyogVmFyaWFibGUgZXhwb3J0ZWQgYnkgdGhlIGNyeXB0byBsaWJyYXJ5IHRocm91Z2ggUkVHSVNURVJfQ1JZUFRPX0xJQigpICovCitleHRlcm4gY29uc3QgY3J5cHRvX2xpYl9kZXNjX3QgY3J5cHRvX2xpYl9kZXNjOworCisvKgorICogVGhlIGNyeXB0byBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIHZlcmlmeWluZyBkaWdpdGFsIHNpZ25hdHVyZXMgYW5kIGhhc2hlcy4KKyAqIEl0IHJlbGllcyBvbiBhIGNyeXB0byBsaWJyYXJ5IHRvIHBlcmZvcm0gdGhlIGNyeXB0b2dyYXBoaWMgb3BlcmF0aW9ucy4KKyAqCisgKiBUaGUgY3J5cHRvIG1vZHVsZSBpdHNlbGYgZG9lcyBub3QgaW1wb3NlIGFueSBzcGVjaWZpYyBmb3JtYXQgb24gc2lnbmF0dXJlcywKKyAqIHNpZ25hdHVyZSBhbGdvcml0aG0sIGtleXMgb3IgaGFzaGVzLCBidXQgbW9zdCBjcnlwdG9ncmFwaGljIGxpYnJhcmllcyB3aWxsCisgKiB0YWtlIHRoZSBwYXJhbWV0ZXJzIGFzIHRoZSBmb2xsb3dpbmcgREVSIGVuY29kZWQgQVNOLjEgc3RydWN0dXJlczoKKyAqCisgKiAgICAgQWxnb3JpdGhtSWRlbnRpZmllciA6Oj0gU0VRVUVOQ0UgIHsKKyAqICAgICAgICAgYWxnb3JpdGhtICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiwKKyAqICAgICAgICAgcGFyYW1ldGVycyAgICAgICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwKKyAqICAgICB9CisgKgorICogICAgIERpZ2VzdEluZm8gOjo9IFNFUVVFTkNFIHsKKyAqICAgICAgICAgZGlnZXN0QWxnb3JpdGhtICBBbGdvcml0aG1JZGVudGlmaWVyLAorICogICAgICAgICBkaWdlc3QgICAgICAgICAgIE9DVEVUIFNUUklORworICogICAgIH0KKyAqCisgKiAgICAgU3ViamVjdFB1YmxpY0tleUluZm8gOjo9IFNFUVVFTkNFICB7CisgKiAgICAgICAgIGFsZ29yaXRobSAgICAgICAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICAgICAgc3ViamVjdFB1YmxpY0tleSBCSVQgU1RSSU5HCisgKiAgICAgfQorICoKKyAqICAgICBTaWduYXR1cmVBbGdvcml0aG0gOjo9IEFsZ29yaXRobUlkZW50aWZpZXIKKyAqCisgKiAgICAgU2lnbmF0dXJlVmFsdWUgOjo9IEJJVCBTVFJJTkcKKyAqLworCisvKgorICogUGVyZm9ybSBzb21lIHN0YXRpYyBjaGVja2luZyBhbmQgY2FsbCB0aGUgbGlicmFyeSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICovCit2b2lkIGNyeXB0b19tb2RfaW5pdCh2b2lkKQoreworCWFzc2VydChjcnlwdG9fbGliX2Rlc2MubmFtZSAhPSBOVUxMKTsKKwlhc3NlcnQoY3J5cHRvX2xpYl9kZXNjLmluaXQgIT0gTlVMTCk7CisJYXNzZXJ0KGNyeXB0b19saWJfZGVzYy52ZXJpZnlfc2lnbmF0dXJlICE9IE5VTEwpOworCWFzc2VydChjcnlwdG9fbGliX2Rlc2MudmVyaWZ5X2hhc2ggIT0gTlVMTCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjcnlwdG9ncmFwaGljIGxpYnJhcnkgKi8KKwljcnlwdG9fbGliX2Rlc2MuaW5pdCgpOworCUlORk8oIlVzaW5nIGNyeXB0byBsaWJyYXJ5ICclcydcbiIsIGNyeXB0b19saWJfZGVzYy5uYW1lKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRvIHZlcmlmeSBhIGRpZ2l0YWwgc2lnbmF0dXJlCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiAgIGRhdGFfcHRyLCBkYXRhX2xlbjogc2lnbmVkIGRhdGEKKyAqICAgc2lnX3B0ciwgc2lnX2xlbjogdGhlIGRpZ2l0YWwgc2lnbmF0dXJlCisgKiAgIHNpZ19hbGdfcHRyLCBzaWdfYWxnX2xlbjogdGhlIGRpZ2l0YWwgc2lnbmF0dXJlIGFsZ29yaXRobQorICogICBwa19wdHIsIHBrX2xlbjogdGhlIHB1YmxpYyBrZXkKKyAqLworaW50IGNyeXB0b19tb2RfdmVyaWZ5X3NpZ25hdHVyZSh2b2lkICpkYXRhX3B0ciwgdW5zaWduZWQgaW50IGRhdGFfbGVuLAorCQkJCXZvaWQgKnNpZ19wdHIsIHVuc2lnbmVkIGludCBzaWdfbGVuLAorCQkJCXZvaWQgKnNpZ19hbGdfcHRyLCB1bnNpZ25lZCBpbnQgc2lnX2FsZ19sZW4sCisJCQkJdm9pZCAqcGtfcHRyLCB1bnNpZ25lZCBpbnQgcGtfbGVuKQoreworCWFzc2VydChkYXRhX3B0ciAhPSBOVUxMKTsKKwlhc3NlcnQoZGF0YV9sZW4gIT0gMCk7CisJYXNzZXJ0KHNpZ19wdHIgIT0gTlVMTCk7CisJYXNzZXJ0KHNpZ19sZW4gIT0gMCk7CisJYXNzZXJ0KHNpZ19hbGdfcHRyICE9IE5VTEwpOworCWFzc2VydChzaWdfYWxnX2xlbiAhPSAwKTsKKwlhc3NlcnQocGtfcHRyICE9IE5VTEwpOworCWFzc2VydChwa19sZW4gIT0gMCk7CisKKwlyZXR1cm4gY3J5cHRvX2xpYl9kZXNjLnZlcmlmeV9zaWduYXR1cmUoZGF0YV9wdHIsIGRhdGFfbGVuLAorCQkJCQkJc2lnX3B0ciwgc2lnX2xlbiwKKwkJCQkJCXNpZ19hbGdfcHRyLCBzaWdfYWxnX2xlbiwKKwkJCQkJCXBrX3B0ciwgcGtfbGVuKTsKK30KKworLyoKKyAqIFZlcmlmeSBhIGhhc2ggYnkgY29tcGFyaXNvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogICBkYXRhX3B0ciwgZGF0YV9sZW46IGRhdGEgdG8gYmUgaGFzaGVkCisgKiAgIGRpZ2VzdF9pbmZvX3B0ciwgZGlnZXN0X2luZm9fbGVuOiBoYXNoIHRvIGJlIGNvbXBhcmVkCisgKi8KK2ludCBjcnlwdG9fbW9kX3ZlcmlmeV9oYXNoKHZvaWQgKmRhdGFfcHRyLCB1bnNpZ25lZCBpbnQgZGF0YV9sZW4sCisJCQkgICB2b2lkICpkaWdlc3RfaW5mb19wdHIsIHVuc2lnbmVkIGludCBkaWdlc3RfaW5mb19sZW4pCit7CisJYXNzZXJ0KGRhdGFfcHRyICE9IE5VTEwpOworCWFzc2VydChkYXRhX2xlbiAhPSAwKTsKKwlhc3NlcnQoZGlnZXN0X2luZm9fcHRyICE9IE5VTEwpOworCWFzc2VydChkaWdlc3RfaW5mb19sZW4gIT0gMCk7CisKKwlyZXR1cm4gY3J5cHRvX2xpYl9kZXNjLnZlcmlmeV9oYXNoKGRhdGFfcHRyLCBkYXRhX2xlbiwKKwkJCQkJICAgZGlnZXN0X2luZm9fcHRyLCBkaWdlc3RfaW5mb19sZW4pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdXRoL2ltZ19wYXJzZXJfbW9kLmMgYi9kcml2ZXJzL2F1dGgvaW1nX3BhcnNlcl9tb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNiZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdXRoL2ltZ19wYXJzZXJfbW9kLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEFSTSBMaW1pdGVkIGFuZCBDb250cmlidXRvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQVJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZAorICogdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKyAqIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8YXV0aF9jb21tb24uaD4KKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8aW1nX3BhcnNlcl9tb2QuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIHVpbnRwdHJfdCBfX1BBUlNFUl9MSUJfREVTQ1NfU1RBUlRfXzsKK2V4dGVybiB1aW50cHRyX3QgX19QQVJTRVJfTElCX0RFU0NTX0VORF9fOworI2RlZmluZSBQQVJTRVJfTElCX0RFU0NTX1NUQVJUCSgodWludHB0cl90KSAoJl9fUEFSU0VSX0xJQl9ERVNDU19TVEFSVF9fKSkKKyNkZWZpbmUgUEFSU0VSX0xJQl9ERVNDU19FTkQJKCh1aW50cHRyX3QpICgmX19QQVJTRVJfTElCX0RFU0NTX0VORF9fKSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFyc2VyX2xpYl9pbmRpY2VzW0lNR19NQVhfVFlQRVNdOworc3RhdGljIGltZ19wYXJzZXJfbGliX2Rlc2NfdCAqcGFyc2VyX2xpYl9kZXNjczsKKworI2RlZmluZSBJTlZBTElEX0lEWAkJVUlOVF9NQVgKKworc3RhdGljIHZvaWQgdmFsaWRhdGVfZGVzYyhpbWdfcGFyc2VyX2xpYl9kZXNjX3QgKmRlc2MpCit7CisJYXNzZXJ0KGRlc2MgIT0gTlVMTCk7CisJYXNzZXJ0KGRlc2MtPmluaXQgIT0gTlVMTCk7CisJYXNzZXJ0KGRlc2MtPm5hbWUgIT0gTlVMTCk7CisJYXNzZXJ0KGRlc2MtPmNoZWNrX2ludGVncml0eSAhPSBOVUxMKTsKKwlhc3NlcnQoZGVzYy0+Z2V0X2F1dGhfcGFyYW0gIT0gTlVMTCk7Cit9CisKK3ZvaWQgaW1nX3BhcnNlcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGluZGV4LCBtb2RfbnVtOworCisJLyogSW5pdGlhbGlzZSBpbnRlcm5hbCB2YXJpYWJsZXMgdG8gaW52YWxpZCBzdGF0ZSAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IElNR19NQVhfVFlQRVM7IGluZGV4KyspIHsKKwkJcGFyc2VyX2xpYl9pbmRpY2VzW2luZGV4XSA9IElOVkFMSURfSURYOworCX0KKworCS8qIENhbGN1bGF0ZSBob3cgbWFueSBpbWFnZSBwYXJzZXJzIGFyZSByZWdpc3RlcmVkLiBBdCBsZWFzdCBvbmUgcGFyc2VyCisJICogbXVzdCBiZSBwcmVzZW50ICovCisJbW9kX251bSA9IFBBUlNFUl9MSUJfREVTQ1NfRU5EIC0gUEFSU0VSX0xJQl9ERVNDU19TVEFSVDsKKwltb2RfbnVtIC89IHNpemVvZihpbWdfcGFyc2VyX2xpYl9kZXNjX3QpOworCWFzc2VydChtb2RfbnVtID4gMCk7CisKKwlwYXJzZXJfbGliX2Rlc2NzID0gKGltZ19wYXJzZXJfbGliX2Rlc2NfdCAqKSBQQVJTRVJfTElCX0RFU0NTX1NUQVJUOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1vZF9udW07IGluZGV4KyspIHsKKworCQkvKiBDaGVjayB0aGF0IHRoZSBpbWFnZSBwYXJzZXIgbGlicmFyeSBkZXNjcmlwdG9yIGlzIHZhbGlkICovCisJCXZhbGlkYXRlX2Rlc2MoJnBhcnNlcl9saWJfZGVzY3NbaW5kZXhdKTsKKworCQkvKiBJbml0aWFsaXplIGltYWdlIHBhcnNlciAqLworCQlwYXJzZXJfbGliX2Rlc2NzW2luZGV4XS5pbml0KCk7CisKKwkJLyogRW5zdXJlIG9ubHkgb25lIHBhcnNlciBpcyByZWdpc3RlcmVkIGZvciBlYWNoIGltYWdlIHR5cGUgKi8KKwkJYXNzZXJ0KHBhcnNlcl9saWJfaW5kaWNlc1twYXJzZXJfbGliX2Rlc2NzW2luZGV4XS5pbWdfdHlwZV0gPT0KKwkJCQlJTlZBTElEX0lEWCk7CisKKwkJLyogS2VlcCB0aGUgaW5kZXggb2YgdGhpcyBoYXNoIGNhbGN1bGF0b3IgKi8KKwkJcGFyc2VyX2xpYl9pbmRpY2VzW3BhcnNlcl9saWJfZGVzY3NbaW5kZXhdLmltZ190eXBlXSA9IGluZGV4OworCX0KK30KKworaW50IGltZ19wYXJzZXJfY2hlY2tfaW50ZWdyaXR5KGltZ190eXBlX3QgaW1nX3R5cGUsCisJCQkgICAgICAgdm9pZCAqaW1nX3B0ciwgdW5zaWduZWQgaW50IGltZ19sZW4pCit7CisJdW5zaWduZWQgaW50IGlkeDsKKworCWFzc2VydChpbWdfcHRyICE9IE5VTEwpOworCWFzc2VydChpbWdfbGVuICE9IDApOworCisJLyogTm8gaW50ZWdyaXR5IGNoZWNrcyBvbiByYXcgaW1hZ2VzICovCisJaWYgKGltZ190eXBlID09IElNR19SQVcpIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfT0s7CisJfQorCisJLyogRmluZCB0aGUgaW5kZXggb2YgdGhlIHJlcXVpcmVkIGltYWdlIHBhcnNlciAqLworCWlkeCA9IHBhcnNlcl9saWJfaW5kaWNlc1tpbWdfdHlwZV07CisJYXNzZXJ0KGlkeCAhPSBJTlZBTElEX0lEWCk7CisKKwkvKiBDYWxsIHRoZSBmdW5jdGlvbiB0byBjaGVjayB0aGUgaW1hZ2UgaW50ZWdyaXR5ICovCisJcmV0dXJuIHBhcnNlcl9saWJfZGVzY3NbaWR4XS5jaGVja19pbnRlZ3JpdHkoaW1nX3B0ciwgaW1nX2xlbik7Cit9CisKKy8qCisgKiBFeHRyYWN0IGFuIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlciBmcm9tIGFuIGltYWdlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgaW1nX3R5cGU6IGltYWdlIHR5cGUgKGNlcnRpZmljYXRlLCByYXcgaW1hZ2UsIGV0YykKKyAqICAgdHlwZV9kZXNjOiBwcm92aWRlcyBpbmZvIHRvIG9idGFpbiB0aGUgcGFyYW1ldGVyCisgKiAgIGltZ19wdHI6IHBvaW50ZXIgdG8gaW1hZ2UgZGF0YQorICogICBpbWdfbGVuOiBpbWFnZSBsZW5ndGgKKyAqICAgcGFyYW1fcHRyOiBbb3V0XSBzdG9yZXMgYSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIKKyAqICAgcGFyYW1fbGVuOiBbb3V0XSBzdG9yZXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFyYW1ldGVyCisgKi8KK2ludCBpbWdfcGFyc2VyX2dldF9hdXRoX3BhcmFtKGltZ190eXBlX3QgaW1nX3R5cGUsCisJCQkgICAgICBjb25zdCBhdXRoX3BhcmFtX3R5cGVfZGVzY190ICp0eXBlX2Rlc2MsCisJCQkgICAgICB2b2lkICppbWdfcHRyLCB1bnNpZ25lZCBpbnQgaW1nX2xlbiwKKwkJCSAgICAgIHZvaWQgKipwYXJhbV9wdHIsIHVuc2lnbmVkIGludCAqcGFyYW1fbGVuKQoreworCXVuc2lnbmVkIGludCBpZHg7CisKKwlhc3NlcnQodHlwZV9kZXNjICE9IE5VTEwpOworCWFzc2VydChpbWdfcHRyICE9IE5VTEwpOworCWFzc2VydChpbWdfbGVuICE9IDApOworCWFzc2VydChwYXJhbV9wdHIgIT0gTlVMTCk7CisJYXNzZXJ0KHBhcmFtX2xlbiAhPSBOVUxMKTsKKworCS8qIEluIGEgcmF3IGltYWdlIHdlIGNhbiBvbmx5IGdldCB0aGUgZGF0YSBpdHNlbGYgKi8KKwlpZiAoaW1nX3R5cGUgPT0gSU1HX1JBVykgeworCQlhc3NlcnQodHlwZV9kZXNjLT50eXBlID09IEFVVEhfUEFSQU1fUkFXX0RBVEEpOworCQkqcGFyYW1fcHRyID0gaW1nX3B0cjsKKwkJKnBhcmFtX2xlbiA9IGltZ19sZW47CisJCXJldHVybiBJTUdfUEFSU0VSX09LOworCX0KKworCS8qIEZpbmQgdGhlIGluZGV4IG9mIHRoZSByZXF1aXJlZCBpbWFnZSBwYXJzZXIgbGlicmFyeSAqLworCWlkeCA9IHBhcnNlcl9saWJfaW5kaWNlc1tpbWdfdHlwZV07CisJYXNzZXJ0KGlkeCAhPSBJTlZBTElEX0lEWCk7CisKKwkvKiBDYWxsIHRoZSBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIHBhcmFtZXRlciAqLworCXJldHVybiBwYXJzZXJfbGliX2Rlc2NzW2lkeF0uZ2V0X2F1dGhfcGFyYW0odHlwZV9kZXNjLCBpbWdfcHRyLCBpbWdfbGVuLAorCQkJcGFyYW1fcHRyLCBwYXJhbV9sZW4pOworfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dGguYyBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLmMKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gY29tbW9uL2F1dGguYwpyZW5hbWUgdG8gZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc19jb21tb24uYwppbmRleCAzNzIzNGI4Li4yOTc4MjYwIDEwMDY0NAotLS0gYS9jb21tb24vYXV0aC5jCisrKyBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLmMKQEAgLTI5LDMzICsyOSwzNyBAQAogICovCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxhdXRoLmg+Ci0jaW5jbHVkZSA8ZGVidWcuaD4KKworLyogbWJlZFRMUyBoZWFkZXJzICovCisjaW5jbHVkZSA8cG9sYXJzc2wvbWVtb3J5X2J1ZmZlcl9hbGxvYy5oPgogCiAvKgotICogSW5pdGlhbGl6ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kdWxlCisgKiBtYmVkVExTIGhlYXAKICAqLwotdm9pZCBhdXRoX2luaXQodm9pZCkKLXsKLQlhc3NlcnQoYXV0aF9tb2QubmFtZSk7Ci0JYXNzZXJ0KGF1dGhfbW9kLmluaXQpOwotCWFzc2VydChhdXRoX21vZC52ZXJpZnkpOwotCi0JSU5GTygiVXNpbmcgYXV0aGVudGljYXRpb24gbW9kdWxlICclcydcbiIsIGF1dGhfbW9kLm5hbWUpOwotCWlmIChhdXRoX21vZC5pbml0KCkgIT0gMCkKLQkJYXNzZXJ0KDApOwotfQorI2lmIChNQkVEVExTX0tFWV9BTEdfSUQgPT0gTUJFRFRMU19FQ0RTQSkKKyNkZWZpbmUgTUJFRFRMU19IRUFQX1NJWkUJCSgxNCoxMDI0KQorI2VsaWYgKE1CRURUTFNfS0VZX0FMR19JRCA9PSBNQkVEVExTX1JTQSkKKyNkZWZpbmUgTUJFRFRMU19IRUFQX1NJWkUJCSg4KjEwMjQpCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYXBbTUJFRFRMU19IRUFQX1NJWkVdOwogCiAvKgotICogQXV0aGVudGljYXRlIGEgY2VydGlmaWNhdGUvaW1hZ2UKKyAqIG1iZWRUTFMgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAqCiAgKiBSZXR1cm46IDAgPSBzdWNjZXNzLCBPdGhlcndpc2UgPSBlcnJvcgogICovCi1pbnQgYXV0aF92ZXJpZnlfb2JqKHVuc2lnbmVkIGludCBvYmpfaWQsIHVpbnRwdHJfdCBvYmpfYnVmLCBzaXplX3QgbGVuKQordm9pZCBtYmVkdGxzX2luaXQodm9pZCkKIHsKLQlhc3NlcnQob2JqX2lkIDwgQVVUSF9OVU1fT0JKKTsKLQlhc3NlcnQob2JqX2J1ZiAhPSAwKTsKLQlhc3NlcnQoYXV0aF9tb2QudmVyaWZ5KTsKKwlzdGF0aWMgaW50IHJlYWR5OworCWludCByYzsKIAotCXJldHVybiBhdXRoX21vZC52ZXJpZnkob2JqX2lkLCBvYmpfYnVmLCBsZW4pOworCWlmICghcmVhZHkpIHsKKwkJLyogSW5pdGlhbGl6ZSB0aGUgbWJlZFRMUyBoZWFwICovCisJCXJjID0gbWVtb3J5X2J1ZmZlcl9hbGxvY19pbml0KGhlYXAsIE1CRURUTFNfSEVBUF9TSVpFKTsKKwkJaWYgKHJjID09IDApIHsKKwkJCXJlYWR5ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydCgwKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRoL3BvbGFyc3NsL3BvbGFyc3NsLm1rIGIvZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc19jb21tb24ubWsKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2wubWsKcmVuYW1lIHRvIGRyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLm1rCmluZGV4IDY5Yzc0MWYuLmI3MWJiYzkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRoL3BvbGFyc3NsL3BvbGFyc3NsLm1rCisrKyBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLm1rCkBAIC0yOCw0MSArMjgsMzMgQEAKICMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAjCiAKLSMgUE9MQVJTU0xfRElSIG11c3QgYmUgc2V0IHRvIHRoZSBQb2xhclNTTCBtYWluIGRpcmVjdG9yeSAoaXQgbXVzdCBjb250YWluCitpZm5lcSAoJHtNQkVEVExTX0NPTU1PTl9NS30sMSkKK01CRURUTFNfQ09NTU9OX01LCTo9CTEKKworIyBNQkVEVExTX0RJUiBtdXN0IGJlIHNldCB0byB0aGUgbWJlZFRMUyBtYWluIGRpcmVjdG9yeSAoaXQgbXVzdCBjb250YWluCiAjIHRoZSAnaW5jbHVkZScgYW5kICdsaWJyYXJ5JyBzdWJkaXJlY3RvcmllcykuCi1pZmVxICgke1BPTEFSU1NMX0RJUn0sKQotICAkKGVycm9yIEVycm9yOiBQT0xBUlNTTF9ESVIgbm90IHNldCkKK2lmZXEgKCR7TUJFRFRMU19ESVJ9LCkKKyAgJChlcnJvciBFcnJvcjogTUJFRFRMU19ESVIgbm90IHNldCkKIGVuZGlmCiAKLUlOQ0xVREVTCQkrPQktSSR7UE9MQVJTU0xfRElSfS9pbmNsdWRlCQlcCi0JCQkJLUljb21tb24vYXV0aC9wb2xhcnNzbAorSU5DTFVERVMJCSs9CS1JJHtNQkVEVExTX0RJUn0vaW5jbHVkZQkJXAorCQkJCS1JaW5jbHVkZS9kcml2ZXJzL2F1dGgvbWJlZHRscwogCi1QT0xBUlNTTF9DT05GSUdfRklMRQk6PQkiPHBvbGFyc3NsX2NvbmZpZy5oPiIKKyMgU3BlY2lmeSBtYmVkVExTIGNvbmZpZ3VyYXRpb24gZmlsZQorUE9MQVJTU0xfQ09ORklHX0ZJTEUJOj0JIjxtYmVkdGxzX2NvbmZpZy5oPiIKICQoZXZhbCAkKGNhbGwgYWRkX2RlZmluZSxQT0xBUlNTTF9DT05GSUdfRklMRSkpCiAKLVBPTEFSU1NMX1NPVVJDRVMJOj0JJChhZGRwcmVmaXggJHtQT0xBUlNTTF9ESVJ9L2xpYnJhcnkvLAlcCitNQkVEVExTX0NPTU1PTl9TT1VSQ0VTCTo9CWRyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLmMJXAorCQkJCSQoYWRkcHJlZml4ICR7TUJFRFRMU19ESVJ9L2xpYnJhcnkvLAlcCiAJCQkJYXNuMXBhcnNlLmMgCQkJCVwKIAkJCQlhc24xd3JpdGUuYyAJCQkJXAotCQkJCWJpZ251bS5jCQkJCVwKLQkJCQltZC5jCQkJCQlcCi0JCQkJbWRfd3JhcC5jCQkJCVwKIAkJCQltZW1vcnlfYnVmZmVyX2FsbG9jLmMJCQlcCiAJCQkJb2lkLmMgCQkJCQlcCi0JCQkJcGsuYyAJCQkJCVwKLQkJCQlwa193cmFwLmMgCQkJCVwKLQkJCQlwa3BhcnNlLmMgCQkJCVwKLQkJCQlwa3dyaXRlLmMgCQkJCVwKIAkJCQlwbGF0Zm9ybS5jIAkJCQlcCi0JCQkJcnNhLmMgCQkJCQlcCi0JCQkJc2hhMjU2LmMJCQkJXAotCQkJCXg1MDkuYyAJCQkJCVwKLQkJCQl4NTA5X2NydC5jIAkJCQlcCiAJCQkJKQogCi1CTDFfU09VUkNFUwkJKz0JJHtQT0xBUlNTTF9TT1VSQ0VTfSAJCQlcCi0JCQkJY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2wuYwotCi1CTDJfU09VUkNFUwkJKz0JJHtQT0xBUlNTTF9TT1VSQ0VTfSAJCQlcCi0JCQkJY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2wuYwotCitCTDFfU09VUkNFUwkJKz0JJHtNQkVEVExTX0NPTU1PTl9TT1VSQ0VTfQorQkwyX1NPVVJDRVMJCSs9CSR7TUJFRFRMU19DT01NT05fU09VUkNFU30KIERJU0FCTEVfUEVEQU5USUMJOj0JMQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc19jcnlwdG8uYyBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY3J5cHRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5ZjkzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY3J5cHRvLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEFSTSBMaW1pdGVkIGFuZCBDb250cmlidXRvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQVJNIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZAorICogdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKyAqIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpbmNsdWRlIDxjcnlwdG9fbW9kLmg+CisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxtYmVkdGxzX2NvbW1vbi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBtYmVkVExTIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxwb2xhcnNzbC9tZF93cmFwLmg+CisjaW5jbHVkZSA8cG9sYXJzc2wvbWVtb3J5X2J1ZmZlcl9hbGxvYy5oPgorI2luY2x1ZGUgPHBvbGFyc3NsL29pZC5oPgorI2luY2x1ZGUgPHBvbGFyc3NsL3BsYXRmb3JtLmg+CisKKyNkZWZpbmUgTElCX05BTUUJCSJtYmVkVExTIgorCisvKgorICogQWxnb3JpdGhtSWRlbnRpZmllciAgOjo9ICBTRVFVRU5DRSAgeworICogICAgIGFsZ29yaXRobSAgICAgICAgICAgICAgIE9CSkVDVCBJREVOVElGSUVSLAorICogICAgIHBhcmFtZXRlcnMgICAgICAgICAgICAgIEFOWSBERUZJTkVEIEJZIGFsZ29yaXRobSBPUFRJT05BTAorICogfQorICoKKyAqIFN1YmplY3RQdWJsaWNLZXlJbmZvICA6Oj0gIFNFUVVFTkNFICB7CisgKiAgICAgYWxnb3JpdGhtICAgICAgICAgICAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICBzdWJqZWN0UHVibGljS2V5ICAgICBCSVQgU1RSSU5HCisgKiB9CisgKgorICogRGlnZXN0SW5mbyA6Oj0gU0VRVUVOQ0UgeworICogICAgIGRpZ2VzdEFsZ29yaXRobSBBbGdvcml0aG1JZGVudGlmaWVyLAorICogICAgIGRpZ2VzdCBPQ1RFVCBTVFJJTkcKKyAqIH0KKyAqLworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBhbmQgZXhwb3J0IHRoZSBkZXNjcmlwdG9yCisgKi8KK3N0YXRpYyB2b2lkIGluaXQodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIG1iZWRUTFMgKi8KKwltYmVkdGxzX2luaXQoKTsKK30KKworLyoKKyAqIFZlcmlmeSBhIHNpZ25hdHVyZS4KKyAqCisgKiBQYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdXNpbmcgdGhlIERFUiBlbmNvZGluZyBmb3JtYXQgZm9sbG93aW5nIHRoZSBBU04uMQorICogc3RydWN0dXJlcyBkZXRhaWxlZCBhYm92ZS4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfc2lnbmF0dXJlKHZvaWQgKmRhdGFfcHRyLCB1bnNpZ25lZCBpbnQgZGF0YV9sZW4sCisJCQkgICAgdm9pZCAqc2lnX3B0ciwgdW5zaWduZWQgaW50IHNpZ19sZW4sCisJCQkgICAgdm9pZCAqc2lnX2FsZywgdW5zaWduZWQgaW50IHNpZ19hbGdfbGVuLAorCQkJICAgIHZvaWQgKnBrX3B0ciwgdW5zaWduZWQgaW50IHBrX2xlbikKK3sKKwlhc24xX2J1ZiBzaWdfb2lkLCBzaWdfcGFyYW1zOworCWFzbjFfYnVmIHNpZ25hdHVyZTsKKwltZF90eXBlX3QgbWRfYWxnOworCXBrX3R5cGVfdCBwa19hbGc7CisJcGtfY29udGV4dCBwazsKKwlpbnQgcmM7CisJdm9pZCAqc2lnX29wdHMgPSBOVUxMOworCWNvbnN0IG1kX2luZm9fdCAqbWRfaW5mbzsKKwl1bnNpZ25lZCBjaGFyICpwLCAqZW5kOworCXVuc2lnbmVkIGNoYXIgaGFzaFtQT0xBUlNTTF9NRF9NQVhfU0laRV07CisKKwkvKiBHZXQgcG9pbnRlcnMgdG8gc2lnbmF0dXJlIE9JRCBhbmQgcGFyYW1ldGVycyAqLworCXAgPSAodW5zaWduZWQgY2hhciAqKXNpZ19hbGc7CisJZW5kID0gKHVuc2lnbmVkIGNoYXIgKikocCArIHNpZ19hbGdfbGVuKTsKKwlyYyA9IGFzbjFfZ2V0X2FsZygmcCwgZW5kLCAmc2lnX29pZCwgJnNpZ19wYXJhbXMpOworCWlmIChyYyAhPSAwKSB7CisJCXJldHVybiBDUllQVE9fRVJSX1NJR05BVFVSRTsKKwl9CisKKwkvKiBHZXQgdGhlIGFjdHVhbCBzaWduYXR1cmUgYWxnb3JpdGhtIChNRCArIFBLKSAqLworCXJjID0gb2lkX2dldF9zaWdfYWxnKCZzaWdfb2lkLCAmbWRfYWxnLCAmcGtfYWxnKTsKKwlpZiAocmMgIT0gMCkgeworCQlyZXR1cm4gQ1JZUFRPX0VSUl9TSUdOQVRVUkU7CisJfQorCisJLyogUGFyc2UgdGhlIHB1YmxpYyBrZXkgKi8KKwlwa19pbml0KCZwayk7CisJcCA9ICh1bnNpZ25lZCBjaGFyICopcGtfcHRyOworCWVuZCA9ICh1bnNpZ25lZCBjaGFyICopKHAgKyBwa19sZW4pOworCXJjID0gcGtfcGFyc2Vfc3VicHVia2V5KCZwLCBlbmQsICZwayk7CisJaWYgKHJjICE9IDApIHsKKwkJcmV0dXJuIENSWVBUT19FUlJfU0lHTkFUVVJFOworCX0KKworCS8qIEdldCB0aGUgc2lnbmF0dXJlIChiaXRzdHJpbmcpICovCisJcCA9ICh1bnNpZ25lZCBjaGFyICopc2lnX3B0cjsKKwllbmQgPSAodW5zaWduZWQgY2hhciAqKShwICsgc2lnX2xlbik7CisJc2lnbmF0dXJlLnRhZyA9ICpwOworCXJjID0gYXNuMV9nZXRfYml0c3RyaW5nX251bGwoJnAsIGVuZCwgJnNpZ25hdHVyZS5sZW4pOworCWlmIChyYyAhPSAwKSB7CisJCXJjID0gQ1JZUFRPX0VSUl9TSUdOQVRVUkU7CisJCWdvdG8gZW5kOworCX0KKwlzaWduYXR1cmUucCA9IHA7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGhhc2ggb2YgdGhlIGRhdGEgKi8KKwltZF9pbmZvID0gbWRfaW5mb19mcm9tX3R5cGUobWRfYWxnKTsKKwlpZiAobWRfaW5mbyA9PSBOVUxMKSB7CisJCXJjID0gQ1JZUFRPX0VSUl9TSUdOQVRVUkU7CisJCWdvdG8gZW5kOworCX0KKwlwID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhX3B0cjsKKwlyYyA9IG1kKG1kX2luZm8sIHAsIGRhdGFfbGVuLCBoYXNoKTsKKwlpZiAocmMgIT0gMCkgeworCQlyYyA9IENSWVBUT19FUlJfU0lHTkFUVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBWZXJpZnkgdGhlIHNpZ25hdHVyZSAqLworCXJjID0gcGtfdmVyaWZ5X2V4dChwa19hbGcsIHNpZ19vcHRzLCAmcGssIG1kX2FsZywgaGFzaCwKKwkJCW1kX2luZm8tPnNpemUsIHNpZ25hdHVyZS5wLCBzaWduYXR1cmUubGVuKTsKKwlpZiAocmMgIT0gMCkgeworCQlyYyA9IENSWVBUT19FUlJfU0lHTkFUVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIHN1Y2Nlc3MgKi8KKwlyYyA9IENSWVBUT19TVUNDRVNTOworCitlbmQ6CisJcGtfZnJlZSgmcGspOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE1hdGNoIGEgaGFzaAorICoKKyAqIERpZ2VzdCBpbmZvIGlzIHBhc3NlZCBpbiBERVIgZm9ybWF0IGZvbGxvd2luZyB0aGUgQVNOLjEgc3RydWN0dXJlIGRldGFpbGVkCisgKiBhYm92ZS4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfaGFzaCh2b2lkICpkYXRhX3B0ciwgdW5zaWduZWQgaW50IGRhdGFfbGVuLAorCQkgICAgICAgdm9pZCAqZGlnZXN0X2luZm9fcHRyLCB1bnNpZ25lZCBpbnQgZGlnZXN0X2luZm9fbGVuKQoreworCWFzbjFfYnVmIGhhc2hfb2lkLCBwYXJhbXM7CisJbWRfdHlwZV90IG1kX2FsZzsKKwljb25zdCBtZF9pbmZvX3QgKm1kX2luZm87CisJdW5zaWduZWQgY2hhciAqcCwgKmVuZCwgKmhhc2g7CisJdW5zaWduZWQgY2hhciBkYXRhX2hhc2hbUE9MQVJTU0xfTURfTUFYX1NJWkVdOworCXNpemVfdCBsZW47CisJaW50IHJjOworCisJLyogRGlnZXN0IGluZm8gc2hvdWxkIGJlIGFuIEFTTjFfU0VRVUVOQ0UgKi8KKwlwID0gKHVuc2lnbmVkIGNoYXIgKilkaWdlc3RfaW5mb19wdHI7CisJZW5kID0gKHVuc2lnbmVkIGNoYXIgKikoZGlnZXN0X2luZm9fcHRyICsgZGlnZXN0X2luZm9fbGVuKTsKKwlyYyA9IGFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmbGVuLCBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSk7CisJaWYgKHJjICE9IDApIHsKKwkJcmV0dXJuIENSWVBUT19FUlJfSEFTSDsKKwl9CisKKwkvKiBHZXQgdGhlIGhhc2ggYWxnb3JpdGhtICovCisJcmMgPSBhc24xX2dldF9hbGcoJnAsIGVuZCwgJmhhc2hfb2lkLCAmcGFyYW1zKTsKKwlpZiAocmMgIT0gMCkgeworCQlyZXR1cm4gQ1JZUFRPX0VSUl9IQVNIOworCX0KKworCXJjID0gb2lkX2dldF9tZF9hbGcoJmhhc2hfb2lkLCAmbWRfYWxnKTsKKwlpZiAocmMgIT0gMCkgeworCQlyZXR1cm4gQ1JZUFRPX0VSUl9IQVNIOworCX0KKworCW1kX2luZm8gPSBtZF9pbmZvX2Zyb21fdHlwZShtZF9hbGcpOworCWlmIChtZF9pbmZvID09IE5VTEwpIHsKKwkJcmV0dXJuIENSWVBUT19FUlJfSEFTSDsKKwl9CisKKwkvKiBIYXNoIHNob3VsZCBiZSBvY3RldCBzdHJpbmcgdHlwZSAqLworCXJjID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sIEFTTjFfT0NURVRfU1RSSU5HKTsKKwlpZiAocmMgIT0gMCkgeworCQlyZXR1cm4gQ1JZUFRPX0VSUl9IQVNIOworCX0KKworCS8qIExlbmd0aCBvZiBoYXNoIG11c3QgbWF0Y2ggdGhlIGFsZ29yaXRobSdzIHNpemUgKi8KKwlpZiAobGVuICE9IG1kX2luZm8tPnNpemUpIHsKKwkJcmV0dXJuIENSWVBUT19FUlJfSEFTSDsKKwl9CisJaGFzaCA9IHA7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGhhc2ggb2YgdGhlIGRhdGEgKi8KKwlwID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhX3B0cjsKKwlyYyA9IG1kKG1kX2luZm8sIHAsIGRhdGFfbGVuLCBkYXRhX2hhc2gpOworCWlmIChyYyAhPSAwKSB7CisJCXJldHVybiBDUllQVE9fRVJSX0hBU0g7CisJfQorCisJLyogQ29tcGFyZSB2YWx1ZXMgKi8KKwlyYyA9IG1lbWNtcChkYXRhX2hhc2gsIGhhc2gsIG1kX2luZm8tPnNpemUpOworCWlmIChyYyAhPSAwKSB7CisJCXJldHVybiBDUllQVE9fRVJSX0hBU0g7CisJfQorCisJcmV0dXJuIENSWVBUT19TVUNDRVNTOworfQorCisvKgorICogUmVnaXN0ZXIgY3J5cHRvIGxpYnJhcnkgZGVzY3JpcHRvcgorICovCitSRUdJU1RFUl9DUllQVE9fTElCKExJQl9OQU1FLCBpbml0LCB2ZXJpZnlfc2lnbmF0dXJlLCB2ZXJpZnlfaGFzaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX2NyeXB0by5tayBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY3J5cHRvLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDJlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX2NyeXB0by5tawpAQCAtMCwwICsxLDcyIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorIworIyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjCisjIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyMgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCisjIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisjIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorIyBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorIyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMKKworaW5jbHVkZSBkcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX2NvbW1vbi5taworCisjIFRoZSBwbGF0Zm9ybSBtYXkgZGVmaW5lIHRoZSB2YXJpYWJsZSAnTUJFRFRMU19LRVlfQUxHJyB0byBzZWxlY3QgdGhlIGtleQorIyBhbGdvcml0aG0gdG8gdXNlLiBEZWZhdWx0IGFsZ29yaXRobSBpcyBFQ0RTQS4KK2lmZXEgKCR7TUJFRFRMU19LRVlfQUxHfSwpCisgICAgTUJFRFRMU19LRVlfQUxHCQk6PQlyc2EKK2VuZGlmCisKK01CRURUTFNfQ1JZUFRPX1NPVVJDRVMJCTo9CWRyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY3J5cHRvLmMJXAorCQkJCQkkKGFkZHByZWZpeCAke01CRURUTFNfRElSfS9saWJyYXJ5LywJXAorCQkJCQliaWdudW0uYwkJCQlcCisJCQkJCW1kLmMJCQkJCVwKKwkJCQkJbWRfd3JhcC5jCQkJCVwKKwkJCQkJcGsuYyAJCQkJCVwKKwkJCQkJcGtfd3JhcC5jIAkJCQlcCisJCQkJCXBrcGFyc2UuYyAJCQkJXAorCQkJCQlwa3dyaXRlLmMgCQkJCVwKKwkJCQkJc2hhMjU2LmMJCQkJXAorCQkJCQkpCisKKyMgS2V5IGFsZ29yaXRobSBzcGVjaWZpYyBmaWxlcworaWZlcSAoJHtNQkVEVExTX0tFWV9BTEd9LGVjZHNhKQorICAgIE1CRURUTFNfQ1JZUFRPX1NPVVJDRVMJKz0JJChhZGRwcmVmaXggJHtNQkVEVExTX0RJUn0vbGlicmFyeS8sCVwKKyAgICAJCQkJCWVjZHNhLmMJCQkJCVwKKyAgICAJCQkJCWVjcF9jdXJ2ZXMuYwkJCQlcCisgICAgCQkJCQllY3AuYwkJCQkJXAorICAgIAkJCQkJKQorICAgIE1CRURUTFNfS0VZX0FMR19JRAkJOj0JTUJFRFRMU19FQ0RTQQorZWxzZSBpZmVxICgke01CRURUTFNfS0VZX0FMR30scnNhKQorICAgIE1CRURUTFNfQ1JZUFRPX1NPVVJDRVMJKz0JJChhZGRwcmVmaXggJHtNQkVEVExTX0RJUn0vbGlicmFyeS8sCVwKKyAgICAJCQkJCXJzYS5jCQkJCQlcCisgICAgCQkJCQkpCisgICAgTUJFRFRMU19LRVlfQUxHX0lECQk6PQlNQkVEVExTX1JTQQorZWxzZQorICAgICQoZXJyb3IgIk1CRURUTFNfS0VZX0FMRz0ke01CRURUTFNfS0VZX0FMR30gbm90IHN1cHBvcnRlZCBvbiBtYmVkVExTIikKK2VuZGlmCisKKyMgbWJlZFRMUyBsaWJyYXJpZXMgcmVseSBvbiB0aGlzIGRlZmluZSB0byBidWlsZCBjb3JyZWN0bHkKKyQoZXZhbCAkKGNhbGwgYWRkX2RlZmluZSxNQkVEVExTX0tFWV9BTEdfSUQpKQorCitCTDFfU09VUkNFUwkJCSs9CSR7TUJFRFRMU19DUllQVE9fU09VUkNFU30KK0JMMl9TT1VSQ0VTCQkJKz0JJHtNQkVEVExTX0NSWVBUT19TT1VSQ0VTfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2wubWsgYi9kcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX3g1MDkubWsKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIGNvbW1vbi9hdXRoL3BvbGFyc3NsL3BvbGFyc3NsLm1rCmNvcHkgdG8gZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc194NTA5Lm1rCmluZGV4IDY5Yzc0MWYuLjNmOTQyMGQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRoL3BvbGFyc3NsL3BvbGFyc3NsLm1rCisrKyBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfeDUwOS5tawpAQCAtMjgsNDEgKzI4LDEzIEBACiAjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogIwogCi0jIFBPTEFSU1NMX0RJUiBtdXN0IGJlIHNldCB0byB0aGUgUG9sYXJTU0wgbWFpbiBkaXJlY3RvcnkgKGl0IG11c3QgY29udGFpbgotIyB0aGUgJ2luY2x1ZGUnIGFuZCAnbGlicmFyeScgc3ViZGlyZWN0b3JpZXMpLgotaWZlcSAoJHtQT0xBUlNTTF9ESVJ9LCkKLSAgJChlcnJvciBFcnJvcjogUE9MQVJTU0xfRElSIG5vdCBzZXQpCi1lbmRpZgoraW5jbHVkZSBkcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX2NvbW1vbi5tawogCi1JTkNMVURFUwkJKz0JLUkke1BPTEFSU1NMX0RJUn0vaW5jbHVkZQkJXAotCQkJCS1JY29tbW9uL2F1dGgvcG9sYXJzc2wKLQotUE9MQVJTU0xfQ09ORklHX0ZJTEUJOj0JIjxwb2xhcnNzbF9jb25maWcuaD4iCi0kKGV2YWwgJChjYWxsIGFkZF9kZWZpbmUsUE9MQVJTU0xfQ09ORklHX0ZJTEUpKQotCi1QT0xBUlNTTF9TT1VSQ0VTCTo9CSQoYWRkcHJlZml4ICR7UE9MQVJTU0xfRElSfS9saWJyYXJ5LywJXAotCQkJCWFzbjFwYXJzZS5jIAkJCQlcCi0JCQkJYXNuMXdyaXRlLmMgCQkJCVwKLQkJCQliaWdudW0uYwkJCQlcCi0JCQkJbWQuYwkJCQkJXAotCQkJCW1kX3dyYXAuYwkJCQlcCi0JCQkJbWVtb3J5X2J1ZmZlcl9hbGxvYy5jCQkJXAotCQkJCW9pZC5jIAkJCQkJXAotCQkJCXBrLmMgCQkJCQlcCi0JCQkJcGtfd3JhcC5jIAkJCQlcCi0JCQkJcGtwYXJzZS5jIAkJCQlcCi0JCQkJcGt3cml0ZS5jIAkJCQlcCi0JCQkJcGxhdGZvcm0uYyAJCQkJXAotCQkJCXJzYS5jIAkJCQkJXAotCQkJCXNoYTI1Ni5jCQkJCVwKLQkJCQl4NTA5LmMgCQkJCQlcCi0JCQkJeDUwOV9jcnQuYyAJCQkJXAorTUJFRFRMU19YNTA5X1NPVVJDRVMJOj0JZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc194NTA5X3BhcnNlci5jCVwKKwkJCQkkKGFkZHByZWZpeCAke01CRURUTFNfRElSfS9saWJyYXJ5LywJCVwKKwkJCQl4NTA5LmMgCQkJCQkJXAorCQkJCXg1MDlfY3J0LmMgCQkJCQlcCiAJCQkJKQogCi1CTDFfU09VUkNFUwkJKz0JJHtQT0xBUlNTTF9TT1VSQ0VTfSAJCQlcCi0JCQkJY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2wuYwotCi1CTDJfU09VUkNFUwkJKz0JJHtQT0xBUlNTTF9TT1VSQ0VTfSAJCQlcCi0JCQkJY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2wuYwotCi1ESVNBQkxFX1BFREFOVElDCTo9CTEKK0JMMV9TT1VSQ0VTCQkrPQkke01CRURUTFNfWDUwOV9TT1VSQ0VTfQorQkwyX1NPVVJDRVMJCSs9CSR7TUJFRFRMU19YNTA5X1NPVVJDRVN9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX3g1MDlfcGFyc2VyLmMgYi9kcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX3g1MDlfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2MDVjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfeDUwOV9wYXJzZXIuYwpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCisgKiB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBYNTA5IHBhcnNlciBiYXNlZCBvbiBQb2xhclNTTAorICoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgYSBYNTA5djMKKyAqIGNlcnRpZmljYXRlIEFTTi4xIHN0cnVjdHVyZSBhbmQgZXh0cmFjdCBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzIGZyb20gdGhlCisgKiBleHRlbnNpb25zIGZpZWxkLCBzdWNoIGFzIGFuIGltYWdlIGhhc2ggb3IgYSBwdWJsaWMga2V5LgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbWdfcGFyc2VyX21vZC5oPgorI2luY2x1ZGUgPG1iZWR0bHNfY29tbW9uLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIG1iZWRUTFMgaGVhZGVycyAqLworI2luY2x1ZGUgPHBvbGFyc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxwb2xhcnNzbC9vaWQuaD4KKyNpbmNsdWRlIDxwb2xhcnNzbC9wbGF0Zm9ybS5oPgorCisvKiBNYXhpbXVtIE9JRCBzdHJpbmcgbGVuZ3RoICgiYS5iLmMuZC5lLmYgLi4uIikgKi8KKyNkZWZpbmUgTUFYX09JRF9TVFJfTEVOCQkJNjQKKworI2RlZmluZSBMSUJfTkFNRQkibWJlZFRMUyBYNTA5djMiCisKKy8qIFRlbXBvcmFyeSB2YXJpYWJsZXMgdG8gc3BlZWQgdXAgdGhlIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMgc2VhcmNoLiBUaGVzZQorICogdmFyaWFibGVzIGFyZSBhc3NpZ25lZCBvbmNlIGR1cmluZyB0aGUgaW50ZWdyaXR5IGNoZWNrIGFuZCB1c2VkIGFueSB0aW1lIGFuCisgKiBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXIgaXMgcmVxdWVzdGVkLCBzbyB3ZSBkbyBub3QgaGF2ZSB0byBwYXJzZSB0aGUgaW1hZ2UKKyAqIGFnYWluICovCitzdGF0aWMgYXNuMV9idWYgdGJzOworc3RhdGljIGFzbjFfYnVmIHYzX2V4dDsKK3N0YXRpYyBhc24xX2J1ZiBwazsKK3N0YXRpYyBhc24xX2J1ZiBzaWdfYWxnOworc3RhdGljIGFzbjFfYnVmIHNpZ25hdHVyZTsKKworLyoKKyAqIEdldCBYNTA5djMgZXh0ZW5zaW9uCisgKgorICogR2xvYmFsIHZhcmlhYmxlICd2M19leHQnIG11c3QgcG9pbnQgdG8gdGhlIGV4dGVuc2lvbnMgcmVnaW9uCisgKiBpbiB0aGUgY2VydGlmaWNhdGUuIE5vIG5lZWQgdG8gY2hlY2sgZm9yIGVycm9ycyBzaW5jZSB0aGUgaW1hZ2UgaGFzIHBhc3NlZAorICogdGhlIGludGVncml0eSBjaGVjay4KKyAqLworc3RhdGljIGludCBnZXRfZXh0KGNvbnN0IGNoYXIgKm9pZCwgdm9pZCAqKmV4dCwgdW5zaWduZWQgaW50ICpleHRfbGVuKQoreworCWludCBvaWRfbGVuOworCXNpemVfdCBsZW47CisJdW5zaWduZWQgY2hhciAqZW5kX2V4dF9kYXRhLCAqZW5kX2V4dF9vY3RldDsKKwl1bnNpZ25lZCBjaGFyICpwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZDsKKwljaGFyIG9pZF9zdHJbTUFYX09JRF9TVFJfTEVOXTsKKwlhc24xX2J1ZiBleHRuX29pZDsKKwlpbnQgaXNfY3JpdGljYWw7CisKKwlhc3NlcnQob2lkICE9IE5VTEwpOworCisJcCA9IHYzX2V4dC5wOworCWVuZCA9IHYzX2V4dC5wICsgdjNfZXh0LmxlbjsKKworCWFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmbGVuLCBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSk7CisKKwl3aGlsZSAocCA8IGVuZCkgeworCQltZW1zZXQoJmV4dG5fb2lkLCAweDAsIHNpemVvZihleHRuX29pZCkpOworCQlpc19jcml0aWNhbCA9IDA7IC8qIERFRkFVTFQgRkFMU0UgKi8KKworCQlhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwgQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UpOworCQllbmRfZXh0X2RhdGEgPSBwICsgbGVuOworCisJCS8qIEdldCBleHRlbnNpb24gSUQgKi8KKwkJZXh0bl9vaWQudGFnID0gKnA7CisJCWFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmZXh0bl9vaWQubGVuLCBBU04xX09JRCk7CisJCWV4dG5fb2lkLnAgPSBwOworCQlwICs9IGV4dG5fb2lkLmxlbjsKKworCQkvKiBHZXQgb3B0aW9uYWwgY3JpdGljYWwgKi8KKwkJYXNuMV9nZXRfYm9vbCgmcCwgZW5kX2V4dF9kYXRhLCAmaXNfY3JpdGljYWwpOworCisJCS8qIEV4dGVuc2lvbiBkYXRhICovCisJCWFzbjFfZ2V0X3RhZygmcCwgZW5kX2V4dF9kYXRhLCAmbGVuLCBBU04xX09DVEVUX1NUUklORyk7CisJCWVuZF9leHRfb2N0ZXQgPSBwICsgbGVuOworCisJCS8qIERldGVjdCByZXF1ZXN0ZWQgZXh0ZW5zaW9uICovCisJCW9pZF9sZW4gPSBvaWRfZ2V0X251bWVyaWNfc3RyaW5nKG9pZF9zdHIsCisJCQkJTUFYX09JRF9TVFJfTEVOLCAmZXh0bl9vaWQpOworCQlpZiAob2lkX2xlbiA9PSBQT0xBUlNTTF9FUlJfT0lEX0JVRl9UT09fU01BTEwpIHsKKwkJCXJldHVybiBJTUdfUEFSU0VSX0VSUjsKKwkJfQorCQlpZiAoKG9pZF9sZW4gPT0gc3RybGVuKG9pZF9zdHIpKSAmJiAhc3RyY21wKG9pZCwgb2lkX3N0cikpIHsKKwkJCSpleHQgPSAodm9pZCAqKXA7CisJCQkqZXh0X2xlbiA9ICh1bnNpZ25lZCBpbnQpbGVuOworCQkJcmV0dXJuIElNR19QQVJTRVJfT0s7CisJCX0KKworCQkvKiBOZXh0ICovCisJCXAgPSBlbmRfZXh0X29jdGV0OworCX0KKworCXJldHVybiBJTUdfUEFSU0VSX0VSUl9OT1RfRk9VTkQ7Cit9CisKKworLyoKKyAqIENoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGNlcnRpZmljYXRlIEFTTi4xIHN0cnVjdHVyZS4KKyAqIEV4dHJhY3QgdGhlIHJlbGV2YW50IGRhdGEgdGhhdCB3aWxsIGJlIHVzZWQgbGF0ZXIgZHVyaW5nIGF1dGhlbnRpY2F0aW9uLgorICovCitzdGF0aWMgaW50IGNlcnRfcGFyc2Uodm9pZCAqaW1nLCB1bnNpZ25lZCBpbnQgaW1nX2xlbikKK3sKKwlpbnQgcmV0LCBpc19jcml0aWNhbDsKKwlzaXplX3QgbGVuOworCXVuc2lnbmVkIGNoYXIgKnAsICplbmQsICpjcnRfZW5kOworCWFzbjFfYnVmIHNpZ19hbGcxLCBzaWdfYWxnMjsKKworCXAgPSAodW5zaWduZWQgY2hhciAqKWltZzsKKwlsZW4gPSBpbWdfbGVuOworCWVuZCA9IHAgKyBsZW47CisKKwkvKgorCSAqIENlcnRpZmljYXRlICA6Oj0gIFNFUVVFTkNFICB7CisJICogICAgICB0YnNDZXJ0aWZpY2F0ZSAgICAgICBUQlNDZXJ0aWZpY2F0ZSwKKwkgKiAgICAgIHNpZ25hdHVyZUFsZ29yaXRobSAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisJICogICAgICBzaWduYXR1cmVWYWx1ZSAgICAgICBCSVQgU1RSSU5HICB9CisJICovCisJcmV0ID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisKKwlpZiAobGVuID4gKHNpemVfdCkoZW5kIC0gcCkpIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisJY3J0X2VuZCA9IHAgKyBsZW47CisKKwkvKgorCSAqIFRCU0NlcnRpZmljYXRlICA6Oj0gIFNFUVVFTkNFICB7CisJICovCisJdGJzLnAgPSBwOworCXJldCA9IGFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmbGVuLCBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJfQorCWVuZCA9IHAgKyBsZW47CisJdGJzLmxlbiA9IGVuZCAtIHRicy5wOworCisJLyoKKwkgKiBWZXJzaW9uICA6Oj0gIElOVEVHRVIgIHsgIHYxKDApLCB2MigxKSwgdjMoMikgIH0KKwkgKi8KKwlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwKKwkJCUFTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IEFTTjFfQ09OU1RSVUNURUQgfCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisJcCArPSBsZW47CisKKwkvKgorCSAqIENlcnRpZmljYXRlU2VyaWFsTnVtYmVyICA6Oj0gIElOVEVHRVIKKwkgKi8KKwlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwgQVNOMV9JTlRFR0VSKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisJcCArPSBsZW47CisKKwkvKgorCSAqIHNpZ25hdHVyZSAgICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIKKwkgKi8KKwlzaWdfYWxnMS5wID0gcDsKKwlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwgQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UpOworCWlmIChyZXQgIT0gMCkgeworCQlyZXR1cm4gSU1HX1BBUlNFUl9FUlJfRk9STUFUOworCX0KKwlpZiAoKGVuZCAtIHApIDwgMSkgeworCQlyZXR1cm4gSU1HX1BBUlNFUl9FUlJfRk9STUFUOworCX0KKwlzaWdfYWxnMS5sZW4gPSAocCArIGxlbikgLSBzaWdfYWxnMS5wOworCXAgKz0gbGVuOworCisJLyoKKwkgKiBpc3N1ZXIgICAgICAgICAgICAgICBOYW1lCisJICovCisJcmV0ID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisJcCArPSBsZW47CisKKwkvKgorCSAqIFZhbGlkaXR5IDo6PSBTRVFVRU5DRSB7CisJICogICAgICBub3RCZWZvcmUgICAgICBUaW1lLAorCSAqICAgICAgbm90QWZ0ZXIgICAgICAgVGltZSB9CisJICoKKwkgKi8KKwlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwgQVNOMV9DT05TVFJVQ1RFRCB8IEFTTjFfU0VRVUVOQ0UpOworCWlmIChyZXQgIT0gMCkgeworCQlyZXR1cm4gSU1HX1BBUlNFUl9FUlJfRk9STUFUOworCX0KKwlwICs9IGxlbjsKKworCS8qCisJICogc3ViamVjdCAgICAgICAgICAgICAgTmFtZQorCSAqLworCXJldCA9IGFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmbGVuLCBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJfQorCXAgKz0gbGVuOworCisJLyoKKwkgKiBTdWJqZWN0UHVibGljS2V5SW5mbworCSAqLworCXBrLnAgPSBwOworCXJldCA9IGFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmbGVuLCBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJfQorCXBrLmxlbiA9IChwICsgbGVuKSAtIHBrLnA7CisJcCArPSBsZW47CisKKwkvKgorCSAqIGlzc3VlclVuaXF1ZUlEICBbMV0gIElNUExJQ0lUIFVuaXF1ZUlkZW50aWZpZXIgT1BUSU9OQUwsCisJICovCisJcmV0ID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sCisJCQlBU04xX0NPTlRFWFRfU1BFQ0lGSUMgfCBBU04xX0NPTlNUUlVDVEVEIHwgMSk7CisJaWYgKHJldCAhPSAwKSB7CisJCWlmIChyZXQgIT0gUE9MQVJTU0xfRVJSX0FTTjFfVU5FWFBFQ1RFRF9UQUcpIHsKKwkJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJCX0KKwl9IGVsc2UgeworCQlwICs9IGxlbjsKKwl9CisKKwkvKgorCSAqIHN1YmplY3RVbmlxdWVJRCBbMl0gIElNUExJQ0lUIFVuaXF1ZUlkZW50aWZpZXIgT1BUSU9OQUwsCisJICovCisJcmV0ID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sCisJCQlBU04xX0NPTlRFWFRfU1BFQ0lGSUMgfCBBU04xX0NPTlNUUlVDVEVEIHwgMik7CisJaWYgKHJldCAhPSAwKSB7CisJCWlmIChyZXQgIT0gUE9MQVJTU0xfRVJSX0FTTjFfVU5FWFBFQ1RFRF9UQUcpIHsKKwkJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJCX0KKwl9IGVsc2UgeworCQlwICs9IGxlbjsKKwl9CisKKwkvKgorCSAqIGV4dGVuc2lvbnMgICAgICBbM10gIEVYUExJQ0lUIEV4dGVuc2lvbnMgT1BUSU9OQUwKKwkgKi8KKwlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwKKwkJCUFTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IEFTTjFfQ09OU1RSVUNURUQgfCAzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisKKwkvKgorCSAqIEV4dGVuc2lvbnMgIDo6PSAgU0VRVUVOQ0UgU0laRSAoMS4uTUFYKSBPRiBFeHRlbnNpb24KKwkgKi8KKwl2M19leHQucCA9IHA7CisJcmV0ID0gYXNuMV9nZXRfdGFnKCZwLCBlbmQsICZsZW4sIEFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisJdjNfZXh0LmxlbiA9IChwICsgbGVuKSAtIHYzX2V4dC5wOworCisJLyoKKwkgKiBDaGVjayBleHRlbnNpb25zIGludGVncml0eQorCSAqLworCXdoaWxlIChwIDwgZW5kKSB7CisJCXJldCA9IGFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmbGVuLAorCQkJCUFTTjFfQ09OU1RSVUNURUQgfCBBU04xX1NFUVVFTkNFKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlyZXR1cm4gSU1HX1BBUlNFUl9FUlJfRk9STUFUOworCQl9CisKKwkJLyogR2V0IGV4dGVuc2lvbiBJRCAqLworCQlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwgQVNOMV9PSUQpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJCX0KKwkJcCArPSBsZW47CisKKwkJLyogR2V0IG9wdGlvbmFsIGNyaXRpY2FsICovCisJCXJldCA9IGFzbjFfZ2V0X2Jvb2woJnAsIGVuZCwgJmlzX2NyaXRpY2FsKTsKKwkJaWYgKChyZXQgIT0gMCkgJiYgKHJldCAhPSBQT0xBUlNTTF9FUlJfQVNOMV9VTkVYUEVDVEVEX1RBRykpIHsKKwkJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJCX0KKworCQkvKiBEYXRhIHNob3VsZCBiZSBvY3RldCBzdHJpbmcgdHlwZSAqLworCQlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwgQVNOMV9PQ1RFVF9TVFJJTkcpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJCX0KKwkJcCArPSBsZW47CisJfQorCisJaWYgKHAgIT0gZW5kKSB7CisJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJfQorCisJZW5kID0gY3J0X2VuZDsKKworCS8qCisJICogIH0KKwkgKiAgLS0gZW5kIG9mIFRCU0NlcnRpZmljYXRlCisJICoKKwkgKiAgc2lnbmF0dXJlQWxnb3JpdGhtICAgQWxnb3JpdGhtSWRlbnRpZmllcgorCSAqLworCXNpZ19hbGcyLnAgPSBwOworCXJldCA9IGFzbjFfZ2V0X3RhZygmcCwgZW5kLCAmbGVuLCBBU04xX0NPTlNUUlVDVEVEIHwgQVNOMV9TRVFVRU5DRSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJfQorCWlmICgoZW5kIC0gcCkgPCAxKSB7CisJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJfQorCXNpZ19hbGcyLmxlbiA9IChwICsgbGVuKSAtIHNpZ19hbGcyLnA7CisJcCArPSBsZW47CisKKwkvKiBDb21wYXJlIGJvdGggc2lnbmF0dXJlIGFsZ29yaXRobXMgKi8KKwlpZiAoc2lnX2FsZzEubGVuICE9IHNpZ19hbGcyLmxlbikgeworCQlyZXR1cm4gSU1HX1BBUlNFUl9FUlJfRk9STUFUOworCX0KKwlpZiAoMCAhPSBtZW1jbXAoc2lnX2FsZzEucCwgc2lnX2FsZzIucCwgc2lnX2FsZzEubGVuKSkgeworCQlyZXR1cm4gSU1HX1BBUlNFUl9FUlJfRk9STUFUOworCX0KKwltZW1jcHkoJnNpZ19hbGcsICZzaWdfYWxnMSwgc2l6ZW9mKHNpZ19hbGcpKTsKKworCS8qCisJICogc2lnbmF0dXJlVmFsdWUgICAgICAgQklUIFNUUklORworCSAqLworCXNpZ25hdHVyZS5wID0gcDsKKwlyZXQgPSBhc24xX2dldF90YWcoJnAsIGVuZCwgJmxlbiwgQVNOMV9CSVRfU1RSSU5HKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcmV0dXJuIElNR19QQVJTRVJfRVJSX0ZPUk1BVDsKKwl9CisJc2lnbmF0dXJlLmxlbiA9IChwICsgbGVuKSAtIHNpZ25hdHVyZS5wOworCXAgKz0gbGVuOworCisJLyogQ2hlY2sgY2VydGlmaWNhdGUgbGVuZ3RoICovCisJaWYgKHAgIT0gZW5kKSB7CisJCXJldHVybiBJTUdfUEFSU0VSX0VSUl9GT1JNQVQ7CisJfQorCisJcmV0dXJuIElNR19QQVJTRVJfT0s7Cit9CisKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGluaXQodm9pZCkKK3sKKwltYmVkdGxzX2luaXQoKTsKK30KKworc3RhdGljIGludCBjaGVja19pbnRlZ3JpdHkodm9pZCAqaW1nLCB1bnNpZ25lZCBpbnQgaW1nX2xlbikKK3sKKwlyZXR1cm4gY2VydF9wYXJzZShpbWcsIGltZ19sZW4pOworfQorCisvKgorICogRXh0cmFjdCBhbiBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXIgZnJvbSBhbiBYNTA5djMgY2VydGlmaWNhdGUKKyAqLworc3RhdGljIGludCBnZXRfYXV0aF9wYXJhbShjb25zdCBhdXRoX3BhcmFtX3R5cGVfZGVzY190ICp0eXBlX2Rlc2MsCisJCXZvaWQgKmltZywgdW5zaWduZWQgaW50IGltZ19sZW4sCisJCXZvaWQgKipwYXJhbSwgdW5zaWduZWQgaW50ICpwYXJhbV9sZW4pCit7CisJaW50IHJjID0gSU1HX1BBUlNFUl9PSzsKKworCS8qIFdlIGRvIG5vdCB1c2UgaW1nIGJlY2F1c2UgdGhlIGNoZWNrX2ludGVncml0eSBmdW5jdGlvbiBoYXMgYWxyZWFkeQorCSAqIGV4dHJhY3RlZCB0aGUgcmVsZXZhbnQgZGF0YSAodjNfZXh0LCBwaywgc2lnX2FsZywgZXRjKSAqLworCisJc3dpdGNoICh0eXBlX2Rlc2MtPnR5cGUpIHsKKwljYXNlIEFVVEhfUEFSQU1fUkFXX0RBVEE6CisJCS8qIERhdGEgdG8gYmUgc2lnbmVkICovCisJCSpwYXJhbSA9ICh2b2lkICopdGJzLnA7CisJCSpwYXJhbV9sZW4gPSAodW5zaWduZWQgaW50KXRicy5sZW47CisJCWJyZWFrOworCWNhc2UgQVVUSF9QQVJBTV9IQVNIOgorCQkvKiBBbGwgdGhlc2UgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgYXMgWDUwOXYzIGV4dGVuc2lvbnMgKi8KKwkJcmMgPSBnZXRfZXh0KHR5cGVfZGVzYy0+Y29va2llLCBwYXJhbSwgcGFyYW1fbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBBVVRIX1BBUkFNX1BVQl9LRVk6CisJCWlmICh0eXBlX2Rlc2MtPmNvb2tpZSAhPSAwKSB7CisJCQkvKiBHZXQgcHVibGljIGtleSBmcm9tIGV4dGVuc2lvbiAqLworCQkJcmMgPSBnZXRfZXh0KHR5cGVfZGVzYy0+Y29va2llLCBwYXJhbSwgcGFyYW1fbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEdldCB0aGUgc3ViamVjdCBwdWJsaWMga2V5ICovCisJCQkqcGFyYW0gPSAodm9pZCAqKXBrLnA7CisJCQkqcGFyYW1fbGVuID0gKHVuc2lnbmVkIGludClway5sZW47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBVVRIX1BBUkFNX1NJR19BTEc6CisJCS8qIEdldCB0aGUgY2VydGlmaWNhdGUgc2lnbmF0dXJlIGFsZ29yaXRobSAqLworCQkqcGFyYW0gPSAodm9pZCAqKXNpZ19hbGcucDsKKwkJKnBhcmFtX2xlbiA9ICh1bnNpZ25lZCBpbnQpc2lnX2FsZy5sZW47CisJCWJyZWFrOworCWNhc2UgQVVUSF9QQVJBTV9TSUc6CisJCS8qIEdldCB0aGUgY2VydGlmaWNhdGUgc2lnbmF0dXJlICovCisJCSpwYXJhbSA9ICh2b2lkICopc2lnbmF0dXJlLnA7CisJCSpwYXJhbV9sZW4gPSAodW5zaWduZWQgaW50KXNpZ25hdHVyZS5sZW47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gSU1HX1BBUlNFUl9FUlJfTk9UX0ZPVU5EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK1JFR0lTVEVSX0lNR19QQVJTRVJfTElCKElNR19DRVJULCBMSUJfTkFNRSwgaW5pdCwgXAorCQkgICAgICAgY2hlY2tfaW50ZWdyaXR5LCBnZXRfYXV0aF9wYXJhbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F1dGgvdGJici90YmJyX2NvdC5jIGIvZHJpdmVycy9hdXRoL3RiYnIvdGJicl9jb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWE4OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdXRoL3RiYnIvdGJicl9jb3QuYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCisgKiB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxhdXRoX21vZC5oPgorI2luY2x1ZGUgPHBsYXRmb3JtX2RlZi5oPgorI2luY2x1ZGUgPHBsYXRmb3JtX29pZC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKgorICogTWF4aW11bSBrZXkgYW5kIGhhc2ggc2l6ZXMgKGluIERFUiBmb3JtYXQpCisgKi8KKyNkZWZpbmUgUEtfREVSX0xFTgkJCTI5NAorI2RlZmluZSBIQVNIX0RFUl9MRU4JCQk1MQorCisvKgorICogVGhlIHBsYXRmb3JtIG11c3QgYWxsb2NhdGUgYnVmZmVycyB0byBzdG9yZSB0aGUgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycworICogZXh0cmFjdGVkIGZyb20gdGhlIGNlcnRpZmljYXRlcy4gSW4gdGhpcyBjYXNlLCBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIENvVCBpcworICogZXN0YWJsaXNoZWQsIHdlIGNhbiByZXVzZSBzb21lIG9mIHRoZSBidWZmZXJzIG9uIGRpZmZlcmVudCBzdGFnZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhdF9ibDJfaGFzaF9idWZbSEFTSF9ERVJfTEVOXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBsYXRfYmwzMF9oYXNoX2J1ZltIQVNIX0RFUl9MRU5dOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhdF9ibDMxX2hhc2hfYnVmW0hBU0hfREVSX0xFTl07CitzdGF0aWMgdW5zaWduZWQgY2hhciBwbGF0X2JsMzJfaGFzaF9idWZbSEFTSF9ERVJfTEVOXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBsYXRfYmwzM19oYXNoX2J1ZltIQVNIX0RFUl9MRU5dOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhdF90el93b3JsZF9wa19idWZbUEtfREVSX0xFTl07CitzdGF0aWMgdW5zaWduZWQgY2hhciBwbGF0X250el93b3JsZF9wa19idWZbUEtfREVSX0xFTl07CitzdGF0aWMgdW5zaWduZWQgY2hhciBwbGF0X2NvbnRlbnRfcGtbUEtfREVSX0xFTl07CisKKy8qCisgKiBQYXJhbWV0ZXIgdHlwZSBkZXNjcmlwdG9ycworICovCitzdGF0aWMgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCBzdWJqZWN0X3BrID0gQVVUSF9QQVJBTV9UWVBFX0RFU0MoCisJCUFVVEhfUEFSQU1fUFVCX0tFWSwgMCk7CitzdGF0aWMgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCBzaWcgPSBBVVRIX1BBUkFNX1RZUEVfREVTQygKKwkJQVVUSF9QQVJBTV9TSUcsIDApOworc3RhdGljIGF1dGhfcGFyYW1fdHlwZV9kZXNjX3Qgc2lnX2FsZyA9IEFVVEhfUEFSQU1fVFlQRV9ERVNDKAorCQlBVVRIX1BBUkFNX1NJR19BTEcsIDApOworc3RhdGljIGF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgcmF3X2RhdGEgPSBBVVRIX1BBUkFNX1RZUEVfREVTQygKKwkJQVVUSF9QQVJBTV9SQVdfREFUQSwgMCk7CisKK3N0YXRpYyBhdXRoX3BhcmFtX3R5cGVfZGVzY190IHR6X3dvcmxkX3BrID0gQVVUSF9QQVJBTV9UWVBFX0RFU0MoCisJCUFVVEhfUEFSQU1fUFVCX0tFWSwgVFpfV09STERfUEtfT0lEKTsKK3N0YXRpYyBhdXRoX3BhcmFtX3R5cGVfZGVzY190IG50el93b3JsZF9wayA9IEFVVEhfUEFSQU1fVFlQRV9ERVNDKAorCQlBVVRIX1BBUkFNX1BVQl9LRVksIE5UWl9XT1JMRF9QS19PSUQpOworCitzdGF0aWMgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCBibDMwX2NvbnRlbnRfcGsgPSBBVVRIX1BBUkFNX1RZUEVfREVTQygKKwkJQVVUSF9QQVJBTV9QVUJfS0VZLCBCTDMwX0NPTlRFTlRfQ0VSVF9QS19PSUQpOworc3RhdGljIGF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgYmwzMV9jb250ZW50X3BrID0gQVVUSF9QQVJBTV9UWVBFX0RFU0MoCisJCUFVVEhfUEFSQU1fUFVCX0tFWSwgQkwzMV9DT05URU5UX0NFUlRfUEtfT0lEKTsKK3N0YXRpYyBhdXRoX3BhcmFtX3R5cGVfZGVzY190IGJsMzJfY29udGVudF9wayA9IEFVVEhfUEFSQU1fVFlQRV9ERVNDKAorCQlBVVRIX1BBUkFNX1BVQl9LRVksIEJMMzJfQ09OVEVOVF9DRVJUX1BLX09JRCk7CitzdGF0aWMgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCBibDMzX2NvbnRlbnRfcGsgPSBBVVRIX1BBUkFNX1RZUEVfREVTQygKKwkJQVVUSF9QQVJBTV9QVUJfS0VZLCBCTDMzX0NPTlRFTlRfQ0VSVF9QS19PSUQpOworCitzdGF0aWMgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCBibDJfaGFzaCA9IEFVVEhfUEFSQU1fVFlQRV9ERVNDKAorCQlBVVRIX1BBUkFNX0hBU0gsIEJMMl9IQVNIX09JRCk7CitzdGF0aWMgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCBibDMwX2hhc2ggPSBBVVRIX1BBUkFNX1RZUEVfREVTQygKKwkJQVVUSF9QQVJBTV9IQVNILCBCTDMwX0hBU0hfT0lEKTsKK3N0YXRpYyBhdXRoX3BhcmFtX3R5cGVfZGVzY190IGJsMzFfaGFzaCA9IEFVVEhfUEFSQU1fVFlQRV9ERVNDKAorCQlBVVRIX1BBUkFNX0hBU0gsIEJMMzFfSEFTSF9PSUQpOworc3RhdGljIGF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgYmwzMl9oYXNoID0gQVVUSF9QQVJBTV9UWVBFX0RFU0MoCisJCUFVVEhfUEFSQU1fSEFTSCwgQkwzMl9IQVNIX09JRCk7CitzdGF0aWMgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCBibDMzX2hhc2ggPSBBVVRIX1BBUkFNX1RZUEVfREVTQygKKwkJQVVUSF9QQVJBTV9IQVNILCBCTDMzX0hBU0hfT0lEKTsKKworLyoKKyAqIFRCQlIgQ2hhaW4gb2YgdHJ1c3QgZGVmaW5pdGlvbgorICovCitzdGF0aWMgY29uc3QgYXV0aF9pbWdfZGVzY190IGNvdF9kZXNjW10gPSB7CisJLyoKKwkgKiBCTDIKKwkgKi8KKwlbQkwyX0NFUlRfSURdID0geworCQkuaW1nX2lkID0gQkwyX0NFUlRfSUQsCisJCS5pbWdfdHlwZSA9IElNR19DRVJULAorCQkucGFyZW50ID0gTlVMTCwKKwkJLmltZ19hdXRoX21ldGhvZHMgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGUgPSBBVVRIX01FVEhPRF9TSUcsCisJCQkJLnBhcmFtLnNpZyA9IHsKKwkJCQkJLnBrID0gJnN1YmplY3RfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJmJsMl9oYXNoLAorCQkJCS5kYXRhID0geworCQkJCQkucHRyID0gKHZvaWQgKilwbGF0X2JsMl9oYXNoX2J1ZiwKKwkJCQkJLmxlbiA9ICh1bnNpZ25lZCBpbnQpSEFTSF9ERVJfTEVOCisJCQkJfQorCQkJfQorCQl9CisJfSwKKwlbQkwyX0lNQUdFX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMl9JTUFHRV9JRCwKKwkJLmltZ190eXBlID0gSU1HX1JBVywKKwkJLnBhcmVudCA9ICZjb3RfZGVzY1tCTDJfQ0VSVF9JRF0sCisJCS5pbWdfYXV0aF9tZXRob2RzID0geworCQkJWzBdID0geworCQkJCS50eXBlID0gQVVUSF9NRVRIT0RfSEFTSCwKKwkJCQkucGFyYW0uaGFzaCA9IHsKKwkJCQkJLmRhdGEgPSAmcmF3X2RhdGEsCisJCQkJCS5oYXNoID0gJmJsMl9oYXNoLAorCQkJCX0KKwkJCX0KKwkJfQorCX0sCisJLyoKKwkgKiBUcnVzdGVkIGtleSBjZXJ0aWZpY2F0ZQorCSAqLworCVtUUlVTVEVEX0tFWV9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IFRSVVNURURfS0VZX0NFUlRfSUQsCisJCS5pbWdfdHlwZSA9IElNR19DRVJULAorCQkucGFyZW50ID0gTlVMTCwKKwkJLmltZ19hdXRoX21ldGhvZHMgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGUgPSBBVVRIX01FVEhPRF9TSUcsCisJCQkJLnBhcmFtLnNpZyA9IHsKKwkJCQkJLnBrID0gJnN1YmplY3RfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJnR6X3dvcmxkX3BrLAorCQkJCS5kYXRhID0geworCQkJCQkucHRyID0gKHZvaWQgKilwbGF0X3R6X3dvcmxkX3BrX2J1ZiwKKwkJCQkJLmxlbiA9ICh1bnNpZ25lZCBpbnQpUEtfREVSX0xFTgorCQkJCX0KKwkJCX0sCisJCQlbMV0gPSB7CisJCQkJLnR5cGVfZGVzYyA9ICZudHpfd29ybGRfcGssCisJCQkJLmRhdGEgPSB7CisJCQkJCS5wdHIgPSAodm9pZCAqKXBsYXRfbnR6X3dvcmxkX3BrX2J1ZiwKKwkJCQkJLmxlbiA9ICh1bnNpZ25lZCBpbnQpUEtfREVSX0xFTgorCQkJCX0KKwkJCX0KKwkJfQorCX0sCisJLyoKKwkgKiBCTDMtMAorCSAqLworCVtCTDMwX0tFWV9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzBfS0VZX0NFUlRfSUQsCisJCS5pbWdfdHlwZSA9IElNR19DRVJULAorCQkucGFyZW50ID0gJmNvdF9kZXNjW1RSVVNURURfS0VZX0NFUlRfSURdLAorCQkuaW1nX2F1dGhfbWV0aG9kcyA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IEFVVEhfTUVUSE9EX1NJRywKKwkJCQkucGFyYW0uc2lnID0geworCQkJCQkucGsgPSAmdHpfd29ybGRfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJmJsMzBfY29udGVudF9waywKKwkJCQkuZGF0YSA9IHsKKwkJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9jb250ZW50X3BrLAorCQkJCQkubGVuID0gKHVuc2lnbmVkIGludClQS19ERVJfTEVOCisJCQkJfQorCQkJfQorCQl9CisJfSwKKwlbQkwzMF9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzBfQ0VSVF9JRCwKKwkJLmltZ190eXBlID0gSU1HX0NFUlQsCisJCS5wYXJlbnQgPSAmY290X2Rlc2NbQkwzMF9LRVlfQ0VSVF9JRF0sCisJCS5pbWdfYXV0aF9tZXRob2RzID0geworCQkJWzBdID0geworCQkJCS50eXBlID0gQVVUSF9NRVRIT0RfU0lHLAorCQkJCS5wYXJhbS5zaWcgPSB7CisJCQkJCS5wayA9ICZibDMwX2NvbnRlbnRfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJmJsMzBfaGFzaCwKKwkJCQkuZGF0YSA9IHsKKwkJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9ibDMwX2hhc2hfYnVmLAorCQkJCQkubGVuID0gKHVuc2lnbmVkIGludClIQVNIX0RFUl9MRU4KKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCVtCTDMwX0lNQUdFX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzBfSU1BR0VfSUQsCisJCS5pbWdfdHlwZSA9IElNR19SQVcsCisJCS5wYXJlbnQgPSAmY290X2Rlc2NbQkwzMF9DRVJUX0lEXSwKKwkJLmltZ19hdXRoX21ldGhvZHMgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGUgPSBBVVRIX01FVEhPRF9IQVNILAorCQkJCS5wYXJhbS5oYXNoID0geworCQkJCQkuZGF0YSA9ICZyYXdfZGF0YSwKKwkJCQkJLmhhc2ggPSAmYmwzMF9oYXNoLAorCQkJCX0KKwkJCX0KKwkJfQorCX0sCisJLyoKKwkgKiBCTDMtMQorCSAqLworCVtCTDMxX0tFWV9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzFfS0VZX0NFUlRfSUQsCisJCS5pbWdfdHlwZSA9IElNR19DRVJULAorCQkucGFyZW50ID0gJmNvdF9kZXNjW1RSVVNURURfS0VZX0NFUlRfSURdLAorCQkuaW1nX2F1dGhfbWV0aG9kcyA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IEFVVEhfTUVUSE9EX1NJRywKKwkJCQkucGFyYW0uc2lnID0geworCQkJCQkucGsgPSAmdHpfd29ybGRfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJmJsMzFfY29udGVudF9waywKKwkJCQkuZGF0YSA9IHsKKwkJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9jb250ZW50X3BrLAorCQkJCQkubGVuID0gKHVuc2lnbmVkIGludClQS19ERVJfTEVOCisJCQkJfQorCQkJfQorCQl9CisJfSwKKwlbQkwzMV9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzFfQ0VSVF9JRCwKKwkJLmltZ190eXBlID0gSU1HX0NFUlQsCisJCS5wYXJlbnQgPSAmY290X2Rlc2NbQkwzMV9LRVlfQ0VSVF9JRF0sCisJCS5pbWdfYXV0aF9tZXRob2RzID0geworCQkJWzBdID0geworCQkJCS50eXBlID0gQVVUSF9NRVRIT0RfU0lHLAorCQkJCS5wYXJhbS5zaWcgPSB7CisJCQkJCS5wayA9ICZibDMxX2NvbnRlbnRfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJmJsMzFfaGFzaCwKKwkJCQkuZGF0YSA9IHsKKwkJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9ibDMxX2hhc2hfYnVmLAorCQkJCQkubGVuID0gKHVuc2lnbmVkIGludClIQVNIX0RFUl9MRU4KKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCVtCTDMxX0lNQUdFX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzFfSU1BR0VfSUQsCisJCS5pbWdfdHlwZSA9IElNR19SQVcsCisJCS5wYXJlbnQgPSAmY290X2Rlc2NbQkwzMV9DRVJUX0lEXSwKKwkJLmltZ19hdXRoX21ldGhvZHMgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGUgPSBBVVRIX01FVEhPRF9IQVNILAorCQkJCS5wYXJhbS5oYXNoID0geworCQkJCQkuZGF0YSA9ICZyYXdfZGF0YSwKKwkJCQkJLmhhc2ggPSAmYmwzMV9oYXNoLAorCQkJCX0KKwkJCX0KKwkJfQorCX0sCisJLyoKKwkgKiBCTDMtMgorCSAqLworCVtCTDMyX0tFWV9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzJfS0VZX0NFUlRfSUQsCisJCS5pbWdfdHlwZSA9IElNR19DRVJULAorCQkucGFyZW50ID0gJmNvdF9kZXNjW1RSVVNURURfS0VZX0NFUlRfSURdLAorCQkuaW1nX2F1dGhfbWV0aG9kcyA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IEFVVEhfTUVUSE9EX1NJRywKKwkJCQkucGFyYW0uc2lnID0geworCQkJCQkucGsgPSAmdHpfd29ybGRfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJmJsMzJfY29udGVudF9waywKKwkJCQkuZGF0YSA9IHsKKwkJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9jb250ZW50X3BrLAorCQkJCQkubGVuID0gKHVuc2lnbmVkIGludClQS19ERVJfTEVOCisJCQkJfQorCQkJfQorCQl9CisJfSwKKwlbQkwzMl9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzJfQ0VSVF9JRCwKKwkJLmltZ190eXBlID0gSU1HX0NFUlQsCisJCS5wYXJlbnQgPSAmY290X2Rlc2NbQkwzMl9LRVlfQ0VSVF9JRF0sCisJCS5pbWdfYXV0aF9tZXRob2RzID0geworCQkJWzBdID0geworCQkJCS50eXBlID0gQVVUSF9NRVRIT0RfU0lHLAorCQkJCS5wYXJhbS5zaWcgPSB7CisJCQkJCS5wayA9ICZibDMyX2NvbnRlbnRfcGssCisJCQkJCS5zaWcgPSAmc2lnLAorCQkJCQkuYWxnID0gJnNpZ19hbGcsCisJCQkJCS5kYXRhID0gJnJhd19kYXRhLAorCQkJCX0KKwkJCX0KKwkJfSwKKwkJLmF1dGhlbnRpY2F0ZWRfZGF0YSA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZV9kZXNjID0gJmJsMzJfaGFzaCwKKwkJCQkuZGF0YSA9IHsKKwkJCQkJLnB0ciA9ICh2b2lkICopcGxhdF9ibDMyX2hhc2hfYnVmLAorCQkJCQkubGVuID0gKHVuc2lnbmVkIGludClIQVNIX0RFUl9MRU4KKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCVtCTDMyX0lNQUdFX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzJfSU1BR0VfSUQsCisJCS5pbWdfdHlwZSA9IElNR19SQVcsCisJCS5wYXJlbnQgPSAmY290X2Rlc2NbQkwzMl9DRVJUX0lEXSwKKwkJLmltZ19hdXRoX21ldGhvZHMgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGUgPSBBVVRIX01FVEhPRF9IQVNILAorCQkJCS5wYXJhbS5oYXNoID0geworCQkJCQkuZGF0YSA9ICZyYXdfZGF0YSwKKwkJCQkJLmhhc2ggPSAmYmwzMl9oYXNoLAorCQkJCX0KKwkJCX0KKwkJfQorCX0sCisJLyoKKwkgKiBCTDMtMworCSAqLworCVtCTDMzX0tFWV9DRVJUX0lEXSA9IHsKKwkJLmltZ19pZCA9IEJMMzNfS0VZX0NFUlRfSUQsCisJCS5pbWdfdHlwZSA9IElNR19DRVJULAorCQkucGFyZW50ID0gJmNvdF9kZXNjW1RSVVNURURfS0VZX0NFUlRfSURdLAorCQkuaW1nX2F1dGhfbWV0aG9kcyA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IEFVVEhfTUVUSE9EX1NJRywKKwkJCQkucGFyYW0uc2lnID0geworCQkJCQkucGsgPSAmbnR6X3dvcmxkX3BrLAorCQkJCQkuc2lnID0gJnNpZywKKwkJCQkJLmFsZyA9ICZzaWdfYWxnLAorCQkJCQkuZGF0YSA9ICZyYXdfZGF0YSwKKwkJCQl9CisJCQl9CisJCX0sCisJCS5hdXRoZW50aWNhdGVkX2RhdGEgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGVfZGVzYyA9ICZibDMzX2NvbnRlbnRfcGssCisJCQkJLmRhdGEgPSB7CisJCQkJCS5wdHIgPSAodm9pZCAqKXBsYXRfY29udGVudF9waywKKwkJCQkJLmxlbiA9ICh1bnNpZ25lZCBpbnQpUEtfREVSX0xFTgorCQkJCX0KKwkJCX0KKwkJfQorCX0sCisJW0JMMzNfQ0VSVF9JRF0gPSB7CisJCS5pbWdfaWQgPSBCTDMzX0NFUlRfSUQsCisJCS5pbWdfdHlwZSA9IElNR19DRVJULAorCQkucGFyZW50ID0gJmNvdF9kZXNjW0JMMzNfS0VZX0NFUlRfSURdLAorCQkuaW1nX2F1dGhfbWV0aG9kcyA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IEFVVEhfTUVUSE9EX1NJRywKKwkJCQkucGFyYW0uc2lnID0geworCQkJCQkucGsgPSAmYmwzM19jb250ZW50X3BrLAorCQkJCQkuc2lnID0gJnNpZywKKwkJCQkJLmFsZyA9ICZzaWdfYWxnLAorCQkJCQkuZGF0YSA9ICZyYXdfZGF0YSwKKwkJCQl9CisJCQl9CisJCX0sCisJCS5hdXRoZW50aWNhdGVkX2RhdGEgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGVfZGVzYyA9ICZibDMzX2hhc2gsCisJCQkJLmRhdGEgPSB7CisJCQkJCS5wdHIgPSAodm9pZCAqKXBsYXRfYmwzM19oYXNoX2J1ZiwKKwkJCQkJLmxlbiA9ICh1bnNpZ25lZCBpbnQpSEFTSF9ERVJfTEVOCisJCQkJfQorCQkJfQorCQl9CisJfSwKKwlbQkwzM19JTUFHRV9JRF0gPSB7CisJCS5pbWdfaWQgPSBCTDMzX0lNQUdFX0lELAorCQkuaW1nX3R5cGUgPSBJTUdfUkFXLAorCQkucGFyZW50ID0gJmNvdF9kZXNjW0JMMzNfQ0VSVF9JRF0sCisJCS5pbWdfYXV0aF9tZXRob2RzID0geworCQkJWzBdID0geworCQkJCS50eXBlID0gQVVUSF9NRVRIT0RfSEFTSCwKKwkJCQkucGFyYW0uaGFzaCA9IHsKKwkJCQkJLmRhdGEgPSAmcmF3X2RhdGEsCisJCQkJCS5oYXNoID0gJmJsMzNfaGFzaCwKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OworCisvKiBSZWdpc3RlciB0aGUgQ29UIGluIHRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgKi8KK1JFR0lTVEVSX0NPVChjb3RfZGVzYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvL2lvX2ZpcC5jIGIvZHJpdmVycy9pby9pb19maXAuYwppbmRleCA5ZGNkOTAxLi41YThhMjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvL2lvX2ZpcC5jCisrKyBiL2RyaXZlcnMvaW8vaW9fZmlwLmMKQEAgLTUxLDExICs1MSw2IEBACiAJCXgubm9kZVs0XSwgeC5ub2RlWzVdCiAKIHR5cGVkZWYgc3RydWN0IHsKLQljb25zdCBjaGFyCSpuYW1lOwotCWNvbnN0IHV1aWRfdAkgdXVpZDsKLX0gcGxhdF9maXBfbmFtZV91dWlkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKIAkvKiBQdXQgZmlsZV9wb3MgYWJvdmUgdGhlIHN0cnVjdCB0byBhbGxvdyB7MH0gb24gc3RhdGljIGluaXQuCiAJICogSXQgaXMgYSB3b3JrYXJvdW5kIGZvciBhIGtub3duIGJ1ZyBpbiBHQ0MKIAkgKiBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUzMTE5CkBAIC02NCwzNyArNTksNiBAQAogCWZpcF90b2NfZW50cnlfdCBlbnRyeTsKIH0gZmlsZV9zdGF0ZV90OwogCi1zdGF0aWMgY29uc3QgcGxhdF9maXBfbmFtZV91dWlkX3QgbmFtZV91dWlkW10gPSB7Ci0Je0JMMl9JTUFHRV9OQU1FLCBVVUlEX1RSVVNURURfQk9PVF9GSVJNV0FSRV9CTDJ9LAotI2lmZGVmIEJMMzBfSU1BR0VfTkFNRQotCS8qIEJMMy0wIGlzIG9wdGlvbmFsIGluIHRoZSBwbGF0Zm9ybSAqLwotCXtCTDMwX0lNQUdFX05BTUUsIFVVSURfU0NQX0ZJUk1XQVJFX0JMMzB9LAotI2VuZGlmIC8qIEJMMzBfSU1BR0VfTkFNRSAqLwotCXtCTDMxX0lNQUdFX05BTUUsIFVVSURfRUwzX1JVTlRJTUVfRklSTVdBUkVfQkwzMX0sCi0jaWZkZWYgQkwzMl9JTUFHRV9OQU1FCi0JLyogQkwzLTIgaXMgb3B0aW9uYWwgaW4gdGhlIHBsYXRmb3JtICovCi0Je0JMMzJfSU1BR0VfTkFNRSwgVVVJRF9TRUNVUkVfUEFZTE9BRF9CTDMyfSwKLSNlbmRpZiAvKiBCTDMyX0lNQUdFX05BTUUgKi8KLQl7QkwzM19JTUFHRV9OQU1FLCBVVUlEX05PTl9UUlVTVEVEX0ZJUk1XQVJFX0JMMzN9LAotI2lmIFRSVVNURURfQk9BUkRfQk9PVAotCS8qIENlcnRpZmljYXRlcyAqLwotCXtCTDJfQ0VSVF9OQU1FLCBVVUlEX1RSVVNURURfQk9PVF9GSVJNV0FSRV9CTDJfQ0VSVH0sCi0Je1RSVVNURURfS0VZX0NFUlRfTkFNRSwgVVVJRF9UUlVTVEVEX0tFWV9DRVJUfSwKLSNpZmRlZiBCTDMwX0tFWV9DRVJUX05BTUUKLQl7QkwzMF9LRVlfQ0VSVF9OQU1FLCBVVUlEX1NDUF9GSVJNV0FSRV9CTDMwX0tFWV9DRVJUfSwKLSNlbmRpZgotCXtCTDMxX0tFWV9DRVJUX05BTUUsIFVVSURfRUwzX1JVTlRJTUVfRklSTVdBUkVfQkwzMV9LRVlfQ0VSVH0sCi0Je0JMMzJfS0VZX0NFUlRfTkFNRSwgVVVJRF9TRUNVUkVfUEFZTE9BRF9CTDMyX0tFWV9DRVJUfSwKLQl7QkwzM19LRVlfQ0VSVF9OQU1FLCBVVUlEX05PTl9UUlVTVEVEX0ZJUk1XQVJFX0JMMzNfS0VZX0NFUlR9LAotI2lmZGVmIEJMMzBfQ0VSVF9OQU1FCi0Je0JMMzBfQ0VSVF9OQU1FLCBVVUlEX1NDUF9GSVJNV0FSRV9CTDMwX0NFUlR9LAotI2VuZGlmCi0Je0JMMzFfQ0VSVF9OQU1FLCBVVUlEX0VMM19SVU5USU1FX0ZJUk1XQVJFX0JMMzFfQ0VSVH0sCi0Je0JMMzJfQ0VSVF9OQU1FLCBVVUlEX1NFQ1VSRV9QQVlMT0FEX0JMMzJfQ0VSVH0sCi0Je0JMMzNfQ0VSVF9OQU1FLCBVVUlEX05PTl9UUlVTVEVEX0ZJUk1XQVJFX0JMMzNfQ0VSVH0sCi0jZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCi19OwotCiBzdGF0aWMgY29uc3QgdXVpZF90IHV1aWRfbnVsbCA9IHswfTsKIHN0YXRpYyBmaWxlX3N0YXRlX3QgY3VycmVudF9maWxlID0gezB9Owogc3RhdGljIHVpbnRwdHJfdCBiYWNrZW5kX2Rldl9oYW5kbGU7CkBAIC0xMTMsMTMgKzc3LDYgQEAKIHN0YXRpYyBpbnQgZmlwX2Rldl9jbG9zZShpb19kZXZfaW5mb190ICpkZXZfaW5mbyk7CiAKIAotc3RhdGljIGlubGluZSBpbnQgY29weV91dWlkKHV1aWRfdCAqZHN0LCBjb25zdCB1dWlkX3QgKnNyYykKLXsKLQltZW1jcHkoZHN0LCBzcmMsIHNpemVvZih1dWlkX3QpKTsKLQlyZXR1cm4gMDsKLX0KLQotCiAvKiBSZXR1cm4gMCBmb3IgZXF1YWwgdXVpZHMuICovCiBzdGF0aWMgaW5saW5lIGludCBjb21wYXJlX3V1aWRzKGNvbnN0IHV1aWRfdCAqdXVpZDEsIGNvbnN0IHV1aWRfdCAqdXVpZDIpCiB7CkBAIC0xMzgsMjIgKzk1LDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IGZpbGVfdG9fdXVpZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdXVpZF90ICp1dWlkKQotewotCWludCBpOwotCWludCBzdGF0dXMgPSAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmFtZV91dWlkKTsgaSsrKSB7Ci0JCWlmIChzdHJjbXAoZmlsZW5hbWUsIG5hbWVfdXVpZFtpXS5uYW1lKSA9PSAwKSB7Ci0JCQljb3B5X3V1aWQodXVpZCwgJm5hbWVfdXVpZFtpXS51dWlkKTsKLQkJCXN0YXR1cyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0KIC8qIElkZW50aWZ5IHRoZSBkZXZpY2UgdHlwZSBhcyBhIHZpcnR1YWwgZHJpdmVyICovCiBpb190eXBlX3QgZGV2aWNlX3R5cGVfZmlwKHZvaWQpCiB7CkBAIC0yMDEsMTcgKzE0MiwxNyBAQAogc3RhdGljIGludCBmaXBfZGV2X2luaXQoaW9fZGV2X2luZm9fdCAqZGV2X2luZm8sIGNvbnN0IHVpbnRwdHJfdCBpbml0X3BhcmFtcykKIHsKIAlpbnQgcmVzdWx0ID0gSU9fRkFJTDsKLQljaGFyICppbWFnZV9uYW1lID0gKGNoYXIgKilpbml0X3BhcmFtczsKKwl1bnNpZ25lZCBpbnQgaW1hZ2VfaWQgPSAodW5zaWduZWQgaW50KWluaXRfcGFyYW1zOwogCXVpbnRwdHJfdCBiYWNrZW5kX2hhbmRsZTsKIAlmaXBfdG9jX2hlYWRlcl90IGhlYWRlcjsKIAlzaXplX3QgYnl0ZXNfcmVhZDsKIAogCS8qIE9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgYnkgcXVlcnlpbmcgdGhlIHBsYXRmb3JtIGxheWVyICovCi0JcmVzdWx0ID0gcGxhdF9nZXRfaW1hZ2Vfc291cmNlKGltYWdlX25hbWUsICZiYWNrZW5kX2Rldl9oYW5kbGUsCisJcmVzdWx0ID0gcGxhdF9nZXRfaW1hZ2Vfc291cmNlKGltYWdlX2lkLCAmYmFja2VuZF9kZXZfaGFuZGxlLAogCQkJCSAgICAgICAmYmFja2VuZF9pbWFnZV9zcGVjKTsKIAlpZiAocmVzdWx0ICE9IElPX1NVQ0NFU1MpIHsKLQkJV0FSTigiRmFpbGVkIHRvIG9idGFpbiByZWZlcmVuY2UgdG8gaW1hZ2UgJyVzJyAoJWkpXG4iLAotCQkJaW1hZ2VfbmFtZSwgcmVzdWx0KTsKKwkJV0FSTigiRmFpbGVkIHRvIG9idGFpbiByZWZlcmVuY2UgdG8gaW1hZ2UgaWQ9JXUgKCVpKVxuIiwKKwkJCWltYWdlX2lkLCByZXN1bHQpOwogCQlyZXN1bHQgPSBJT19GQUlMOwogCQlnb3RvIGZpcF9kZXZfaW5pdF9leGl0OwogCX0KQEAgLTIyMCw3ICsxNjEsNyBAQAogCXJlc3VsdCA9IGlvX29wZW4oYmFja2VuZF9kZXZfaGFuZGxlLCBiYWNrZW5kX2ltYWdlX3NwZWMsCiAJCQkgJmJhY2tlbmRfaGFuZGxlKTsKIAlpZiAocmVzdWx0ICE9IElPX1NVQ0NFU1MpIHsKLQkJV0FSTigiRmFpbGVkIHRvIGFjY2VzcyBpbWFnZSAnJXMnICglaSlcbiIsIGltYWdlX25hbWUsIHJlc3VsdCk7CisJCVdBUk4oIkZhaWxlZCB0byBhY2Nlc3MgaW1hZ2UgaWQ9JXUgKCVpKVxuIiwgaW1hZ2VfaWQsIHJlc3VsdCk7CiAJCXJlc3VsdCA9IElPX0ZBSUw7CiAJCWdvdG8gZmlwX2Rldl9pbml0X2V4aXQ7CiAJfQpAQCAtMjYxLDEyICsyMDIsMTEgQEAKIHsKIAlpbnQgcmVzdWx0ID0gSU9fRkFJTDsKIAl1aW50cHRyX3QgYmFja2VuZF9oYW5kbGU7Ci0JdXVpZF90IGZpbGVfdXVpZDsKLQljb25zdCBpb19maWxlX3NwZWNfdCAqZmlsZV9zcGVjID0gKGlvX2ZpbGVfc3BlY190ICopc3BlYzsKKwljb25zdCBpb191dWlkX3NwZWNfdCAqdXVpZF9zcGVjID0gKGlvX3V1aWRfc3BlY190ICopc3BlYzsKIAlzaXplX3QgYnl0ZXNfcmVhZDsKIAlpbnQgZm91bmRfZmlsZSA9IDA7CiAKLQlhc3NlcnQoZmlsZV9zcGVjICE9IE5VTEwpOworCWFzc2VydCh1dWlkX3NwZWMgIT0gTlVMTCk7CiAJYXNzZXJ0KGVudGl0eSAhPSBOVUxMKTsKIAogCS8qIENhbiBvbmx5IGhhdmUgb25lIGZpbGUgb3BlbiBhdCBhIHRpbWUgZm9yIHRoZSBtb21lbnQuIFdlIG5lZWQgdG8KQEAgLTI5Nyw4ICsyMzcsNiBAQAogCQlnb3RvIGZpcF9maWxlX29wZW5fY2xvc2U7CiAJfQogCi0JZmlsZV90b191dWlkKGZpbGVfc3BlYy0+cGF0aCwgJmZpbGVfdXVpZCk7Ci0KIAlmb3VuZF9maWxlID0gMDsKIAlkbyB7CiAJCXJlc3VsdCA9IGlvX3JlYWQoYmFja2VuZF9oYW5kbGUsCkBAIC0zMDcsNyArMjQ1LDcgQEAKIAkJCQkgJmJ5dGVzX3JlYWQpOwogCQlpZiAocmVzdWx0ID09IElPX1NVQ0NFU1MpIHsKIAkJCWlmIChjb21wYXJlX3V1aWRzKCZjdXJyZW50X2ZpbGUuZW50cnkudXVpZCwKLQkJCQkJICAmZmlsZV91dWlkKSA9PSAwKSB7CisJCQkJCSAgJnV1aWRfc3BlYy0+dXVpZCkgPT0gMCkgewogCQkJCWZvdW5kX2ZpbGUgPSAxOwogCQkJCWJyZWFrOwogCQkJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb24vYXNtX21hY3Jvcy5TIGIvaW5jbHVkZS9jb21tb24vYXNtX21hY3Jvcy5TCmluZGV4IGY5ZTc4MjMuLjQ1MDU4YTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbW9uL2FzbV9tYWNyb3MuUworKysgYi9pbmNsdWRlL2NvbW1vbi9hc21fbWFjcm9zLlMKQEAgLTk5LDQxICs5OSw2IEBACiAJLnNpemUgXF9uYW1lLCAuIC0gXF9uYW1lCiAJLmVuZG0KIAotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIEZpbmQgdGhlIHR5cGUgb2YgcmVzZXQgYW5kIGp1bXAgdG8gaGFuZGxlcgotCSAqIGlmIHByZXNlbnQuIElmIHRoZSBoYW5kbGVyIGlzIG51bGwgdGhlbiBpdCBpcwotCSAqIGEgY29sZCBib290LiBUaGUgcHJpbWFyeSBjcHUgd2lsbCBzZXQgdXAgdGhlCi0JICogcGxhdGZvcm0gd2hpbGUgdGhlIHNlY29uZGFyaWVzIHdhaXQgZm9yCi0JICogdGhlaXIgdHVybiB0byBiZSB3b2tlbiB1cAotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCS5tYWNybyB3YWl0X2Zvcl9lbnRyeXBvaW50Ci13YWl0X2Zvcl9lbnRyeXBvaW50OgotCW1ycwl4MCwgbXBpZHJfZWwxCi0JYmwJcGxhdGZvcm1fZ2V0X2VudHJ5cG9pbnQKLQljYm56CXgwLCBkb193YXJtX2Jvb3QKLQltcnMJeDAsIG1waWRyX2VsMQotCWJsCXBsYXRmb3JtX2lzX3ByaW1hcnlfY3B1Ci0JY2Juegl4MCwgZG9fY29sZF9ib290Ci0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBQZXJmb3JtIGFueSBwbGF0Zm9ybSBzcGVjaWZpYyBzZWNvbmRhcnkgY3B1Ci0JICogYWN0aW9ucwotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCWJsCXBsYXRfc2Vjb25kYXJ5X2NvbGRfYm9vdF9zZXR1cAotCWIJd2FpdF9mb3JfZW50cnlwb2ludAotCi0JZG9fd2FybV9ib290OgotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIEp1bXAgdG8gQkwzMSBmb3IgYWxsIHdhcm0gYm9vdCBpbml0LgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCWJscgl4MAotCi0JZG9fY29sZF9ib290OgotCS5lbmRtCi0KIAkvKgogCSAqIFRoaXMgbWFjcm8gZGVjbGFyZXMgYW4gYXJyYXkgb2YgMSBvciBtb3JlIHN0YWNrcywgcHJvcGVybHkKIAkgKiBhbGlnbmVkIGFuZCBpbiB0aGUgcmVxdWVzdGVkIHNlY3Rpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbW9uL2F1dGguaCBiL2luY2x1ZGUvY29tbW9uL2F1dGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzYTZiZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvbW1vbi9hdXRoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBBUk0gTGltaXRlZCBhbmQgQ29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFSTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKLSAqIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCi0gKiBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBBVVRIX0hfCi0jZGVmaW5lIEFVVEhfSF8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vKgotICogQXV0aGVudGljYXRpb24gaW5mcmFzdHJ1Y3R1cmUgZm9yIFRydXN0ZWQgQm9vdAotICoKLSAqIFRoaXMgaW5mcmFzdHJ1Y3R1cmUgcHJvdmlkZXMgYW4gQVBJIHRvIGFjY2VzcyB0aGUgYXV0aGVudGljYXRpb24gbW9kdWxlLiBUaGlzCi0gKiBtb2R1bGUgd2lsbCBpbXBsZW1lbnQgdGhlIHJlcXVpcmVkIG9wZXJhdGlvbnMgZm9yIFRydXN0ZWQgQm9vdCBieSBjcmVhdGluZyBhbgotICogaW5zdGFuY2Ugb2YgdGhlIHN0cnVjdHVyZSAnYXV0aF9tb2RfdCcuIFRoaXMgaW5zdGFuY2UgbXVzdCBiZSBjYWxsZWQKLSAqICdhdXRoX21vZCcgYW5kIG11c3QgcHJvdmlkZSB0aGUgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZSBhbmQKLSAqIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBpbWFnZXMuCi0gKi8KLQotLyogT2JqZWN0cyAoaW1hZ2VzIGFuZCBjZXJ0aWZpY2F0ZXMpIGludm9sdmVkIGluIHRoZSBUQkIgcHJvY2VzcyAqLwotZW51bSB7Ci0JQVVUSF9CTDJfSU1HX0NFUlQsCi0JQVVUSF9CTDJfSU1HLAotCUFVVEhfVFJVU1RFRF9LRVlfQ0VSVCwKLQlBVVRIX0JMMzBfS0VZX0NFUlQsCi0JQVVUSF9CTDMwX0lNR19DRVJULAotCUFVVEhfQkwzMF9JTUcsCi0JQVVUSF9CTDMxX0tFWV9DRVJULAotCUFVVEhfQkwzMV9JTUdfQ0VSVCwKLQlBVVRIX0JMMzFfSU1HLAotCUFVVEhfQkwzMl9LRVlfQ0VSVCwKLQlBVVRIX0JMMzJfSU1HX0NFUlQsCi0JQVVUSF9CTDMyX0lNRywKLQlBVVRIX0JMMzNfS0VZX0NFUlQsCi0JQVVUSF9CTDMzX0lNR19DRVJULAotCUFVVEhfQkwzM19JTUcsCi0JQVVUSF9OVU1fT0JKCi19OwotCi0vKiBBdXRoZW50aWNhdGlvbiBtb2R1bGUgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBhdXRoX21vZF9zIHsKLQkvKiBbbWFuZGF0b3J5XSBNb2R1bGUgbmFtZS4gUHJpbnRlZCB0byB0aGUgbG9nIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkvKiBbbWFuZGF0b3J5XSBJbml0aWFsaXplIHRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgKi8KLQlpbnQgKCppbml0KSh2b2lkKTsKLQotCS8qIFttYW5kYXRvcnldIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgdG8gYXV0aGVudGljYXRlIGEgbmV3Ci0JICogb2JqZWN0IGxvYWRlZCBpbnRvIG1lbW9yeS4gVGhlIG9ial9pZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlCi0JICogdmFsdWVzIGluIHRoZSBlbnVtZXJhdGlvbiBhYm92ZSAqLwotCWludCAoKnZlcmlmeSkodW5zaWduZWQgaW50IG9ial9pZCwgdWludHB0cl90IG9ial9idWYsIHNpemVfdCBsZW4pOwotfSBhdXRoX21vZF90OwotCi0vKiBUaGlzIHZhcmlhYmxlIG11c3QgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgKi8KLWV4dGVybiBjb25zdCBhdXRoX21vZF90IGF1dGhfbW9kOwotCi0vKiBQdWJsaWMgZnVuY3Rpb25zICovCi12b2lkIGF1dGhfaW5pdCh2b2lkKTsKLWludCBhdXRoX3ZlcmlmeV9vYmoodW5zaWduZWQgaW50IG9ial9pZCwgdWludHB0cl90IG9ial9idWYsIHNpemVfdCBsZW4pOwotCi0jZW5kaWYgLyogQVVUSF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb24vYmxfY29tbW9uLmggYi9pbmNsdWRlL2NvbW1vbi9ibF9jb21tb24uaAppbmRleCAzM2I3NWYxLi5iMWE5YzhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1vbi9ibF9jb21tb24uaAorKysgYi9pbmNsdWRlL2NvbW1vbi9ibF9jb21tb24uaApAQCAtOTAsMTggKzkwLDYgQEAKIAkoX3ApLT5oLmF0dHIgPSAodWludDMyX3QpKF9hdHRyKSA7IFwKIAl9IHdoaWxlICgwKQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGUgcmVzZXQgaGFuZGxlcgotICogY29udGFpbmVkIGluIGFuIGltYWdlLiBUaGlzIHdpbGwgYmUgdGhlIGNhc2Ugd2hlbiB0aGUgaW1hZ2UgaXMgQkwxIG9yIHdoZW4KLSAqIGl0cyBCTDMtMSBhbmQgUkVTRVRfVE9fQkwzMSBpcyB0cnVlLiBUaGlzIGNvbnN0YW50IGVuYWJsZXMgYSBzdWJzZXF1ZW50Ci0gKiB2ZXJzaW9uIG9mIHRoZSByZXNldCBoYW5kbGVyIHRvIHBlcmZvcm0gYWN0aW9ucyB0aGF0IG92ZXJyaWRlIHRoZSBvbmVzCi0gKiBwZXJmb3JtZWQgaW4gdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhlIGNvZGUuIFRoaXMgd2lsbCBiZSByZXF1aXJlZCB3aGVuIHRoZQotICogZmlyc3QgdmVyc2lvbiBleGlzdHMgaW4gYW4gdW4tbW9kaWZpYWJsZSBpbWFnZSBlLmcuIGEgQm9vdFJPTSBpbWFnZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgSU1BR0VfQkwxIHx8IChJTUFHRV9CTDMxICYmIFJFU0VUX1RPX0JMMzEpCi0jZGVmaW5lIEZJUlNUX1JFU0VUX0hBTkRMRVJfQ0FMTAotI2VuZGlmCi0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8Y2RlZnMuaD4gLyogRm9yIF9fZGVhZDIgKi8KICNpbmNsdWRlIDxjYXNzZXJ0Lmg+CkBAIC0xOTUsOSArMTgzLDkgQEAKICAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHN1cGVyc2V0IG9mIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHBhc3NlZCB0bwogICogQkwzMSBlLmcuIHdoaWxlIHBhc3NpbmcgY29udHJvbCB0byBpdCBmcm9tIEJMMi4gVGhlIEJMMzIgcGFyYW1ldGVycyB3aWxsIGJlCiAgKiBwb3B1bGF0ZWQgb25seSBpZiBCTDIgZGV0ZWN0cyBpdHMgcHJlc2VuY2UuIEEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBvZiB0aGlzCi0gKiB0eXBlIHNob3VsZCBiZSBwYXNzZWQgaW4gWDMgdG8gQkwzMSdzIGNvbGQgYm9vdCBlbnRyeXBvaW50CisgKiB0eXBlIHNob3VsZCBiZSBwYXNzZWQgaW4gWDAgdG8gQkwzLTEncyBjb2xkIGJvb3QgZW50cnlwb2ludC4KICAqCi0gKiBVc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYW5kIHRoZSBYMyBwYXJhbWV0ZXIgaXMgbm90IG1hbmRhdG9yeTogdGhlIEJMMy0xCisgKiBVc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYW5kIHRoZSBYMCBwYXJhbWV0ZXIgaXMgbm90IG1hbmRhdG9yeTogdGhlIEJMMy0xCiAgKiBwbGF0Zm9ybSBjb2RlIGNhbiB1c2Ugb3RoZXIgbWVjaGFuaXNtcyB0byBwcm92aWRlIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24KICAqIGFib3V0IEJMMy0yIGFuZCBCTDMtMyB0byB0aGUgY29tbW9uIGFuZCBTUEQgY29kZS4KICAqCkBAIC0yMzgsMTIgKzIyNiwxNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHVuc2lnbmVkIGxvbmcgcGFnZV9hbGlnbih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCk7CiB2b2lkIGNoYW5nZV9zZWN1cml0eV9zdGF0ZSh1bnNpZ25lZCBpbnQpOwotdW5zaWduZWQgbG9uZyBpbWFnZV9zaXplKGNvbnN0IGNoYXIgKik7Cit1bnNpZ25lZCBsb25nIGltYWdlX3NpemUodW5zaWduZWQgaW50IGltYWdlX2lkKTsKIGludCBsb2FkX2ltYWdlKG1lbWluZm9fdCAqbWVtX2xheW91dCwKLQkgICAgICAgY29uc3QgY2hhciAqaW1hZ2VfbmFtZSwKLQkgICAgICAgdWludDY0X3QgaW1hZ2VfYmFzZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGltYWdlX2lkLAorCSAgICAgICB1aW50cHRyX3QgaW1hZ2VfYmFzZSwKIAkgICAgICAgaW1hZ2VfaW5mb190ICppbWFnZV9kYXRhLAogCSAgICAgICBlbnRyeV9wb2ludF9pbmZvX3QgKmVudHJ5X3BvaW50X2luZm8pOworaW50IGxvYWRfYXV0aF9pbWFnZShtZW1pbmZvX3QgKm1lbV9sYXlvdXQsCisJCSAgICB1bnNpZ25lZCBpbnQgaW1hZ2VfbmFtZSwKKwkJICAgIHVpbnRwdHJfdCBpbWFnZV9iYXNlLAorCQkgICAgaW1hZ2VfaW5mb190ICppbWFnZV9kYXRhLAorCQkgICAgZW50cnlfcG9pbnRfaW5mb190ICplbnRyeV9wb2ludF9pbmZvKTsKIGV4dGVybiBjb25zdCBjaGFyIGJ1aWxkX21lc3NhZ2VbXTsKIGV4dGVybiBjb25zdCBjaGFyIHZlcnNpb25fc3RyaW5nW107CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbW9uL2VsM19jb21tb25fbWFjcm9zLlMgYi9pbmNsdWRlL2NvbW1vbi9lbDNfY29tbW9uX21hY3Jvcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDMzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbW1vbi9lbDNfY29tbW9uX21hY3Jvcy5TCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBBUk0gTGltaXRlZCBhbmQgQ29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFSTSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKKyAqIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgKiBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0VMM19DT01NT05fTUFDUk9TX1NfXworI2RlZmluZSBfX0VMM19DT01NT05fTUFDUk9TX1NfXworCisjaW5jbHVkZSA8YXJjaC5oPgorI2luY2x1ZGUgPGFzbV9tYWNyb3MuUz4KKworCS8qCisJICogSGVscGVyIG1hY3JvIHRvIGluaXRpYWxpc2UgRUwzIHJlZ2lzdGVycyB3ZSBjYXJlIGFib3V0LgorCSAqLworCS5tYWNybyBlbDNfYXJjaF9pbml0X2NvbW1vbiBfZXhjZXB0aW9uX3ZlY3RvcnMKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBFbmFibGUgdGhlIGluc3RydWN0aW9uIGNhY2hlLCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFjY2VzcyBhbGlnbm1lbnQKKwkgKiBjaGVja3MKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKi8KKwltb3YJeDEsICMoU0NUTFJfSV9CSVQgfCBTQ1RMUl9BX0JJVCB8IFNDVExSX1NBX0JJVCkKKwltcnMJeDAsIHNjdGxyX2VsMworCW9ycgl4MCwgeDAsIHgxCisJbXNyCXNjdGxyX2VsMywgeDAKKwlpc2IKKworI2lmIElNQUdFX0JMMzEKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJbml0aWFsaXNlIHRoZSBwZXItY3B1IGNhY2hlIHBvaW50ZXIgdG8gdGhlIENQVS4KKwkgKiBUaGlzIGlzIGRvbmUgZWFybHkgdG8gZW5hYmxlIGNyYXNoIHJlcG9ydGluZyB0byBoYXZlIGFjY2VzcyB0byBjcmFzaAorCSAqIHN0YWNrLiBTaW5jZSBjcmFzaCByZXBvcnRpbmcgZGVwZW5kcyBvbiBjcHVfZGF0YSB0byByZXBvcnQgdGhlCisJICogdW5oYW5kbGVkIGV4Y2VwdGlvbiwgbm90IGRvaW5nIHNvIGNhbiBsZWFkIHRvIHJlY3Vyc2l2ZSBleGNlcHRpb25zCisJICogZHVlIHRvIGEgTlVMTCBUUElEUl9FTDMuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJYmwJaW5pdF9jcHVfZGF0YV9wdHIKKyNlbmRpZiAvKiBJTUFHRV9CTDMxICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXQgdGhlIGV4Y2VwdGlvbiB2ZWN0b3JzLgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqLworCWFkcgl4MCwgXF9leGNlcHRpb25fdmVjdG9ycworCW1zcgl2YmFyX2VsMywgeDAKKwlpc2IKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEVuYWJsZSB0aGUgU0Vycm9yIGludGVycnVwdCBub3cgdGhhdCB0aGUgZXhjZXB0aW9uIHZlY3RvcnMgaGF2ZSBiZWVuCisJICogc2V0dXAuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJbXNyCWRhaWZjbHIsICNEQUlGX0FCVF9CSVQKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBBcmNoaXRlY3R1cmFsIGZlYXR1cmUgdHJhcCByZWdpc3RlcgorCSAqIChDUFRSX0VMMykgaXMgdW5rbm93biBhbmQgaXQgbXVzdCBiZSBzZXQgdG8gYSBrbm93biBzdGF0ZS4gQWxsCisJICogZmVhdHVyZSB0cmFwcyBhcmUgZGlzYWJsZWQuIFNvbWUgYml0cyBpbiB0aGlzIHJlZ2lzdGVyIGFyZSBtYXJrZWQgYXMKKwkgKiByZXNlcnZlZCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KKwkgKgorCSAqIENQVFJfRUwzLlRDUEFDOiBUaGlzIGNhdXNlcyBhIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIENQQUNSX0VMMSBmcm9tIEVMMQorCSAqICBvciB0aGUgQ1BUUl9FTDIgZnJvbSBFTDIgdG8gdHJhcCB0byBFTDMgdW5sZXNzIGl0IGlzIHRyYXBwZWQgYXQgRUwyLgorCSAqCisJICogQ1BUUl9FTDMuVFRBOiBUaGlzIGNhdXNlcyBhY2Nlc3MgdG8gdGhlIFRyYWNlIGZ1bmN0aW9uYWxpdHkgdG8gdHJhcAorCSAqICB0byBFTDMgd2hlbiBleGVjdXRlZCBmcm9tIEVMMCwgRUwxLCBFTDIsIG9yIEVMMy4gSWYgc3lzdGVtIHJlZ2lzdGVyCisJICogIGFjY2VzcyB0byB0cmFjZSBmdW5jdGlvbmFsaXR5IGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgYml0IGlzIFJFUzAuCisJICoKKwkgKiBDUFRSX0VMMy5URlA6IFRoaXMgY2F1c2VzIGluc3RydWN0aW9ucyB0aGF0IGFjY2VzcyB0aGUgcmVnaXN0ZXJzCisJICogIGFzc29jaWF0ZWQgd2l0aCBGbG9hdGluZyBQb2ludCBhbmQgQWR2YW5jZWQgU0lNRCBleGVjdXRpb24gdG8gdHJhcAorCSAqICB0byBFTDMgd2hlbiBleGVjdXRlZCBmcm9tIGFueSBleGNlcHRpb24gbGV2ZWwsIHVubGVzcyB0cmFwcGVkIHRvIEVMMQorCSAqICBvciBFTDIuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJbXJzCXgwLCBjcHRyX2VsMworCWJpYwl3MCwgdzAsICNUQ1BBQ19CSVQKKwliaWMJdzAsIHcwLCAjVFRBX0JJVAorCWJpYwl3MCwgdzAsICNURlBfQklUCisJbXNyCWNwdHJfZWwzLCB4MAorCS5lbmRtCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGlzIHRoZSBzdXBlciBzZXQgb2YgYWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIGR1cmluZyBhIGNvbGQgYm9vdAorICogb3IgYSB3YXJtIGJvb3QgaW4gRUwzLiBUaGlzIGNvZGUgaXMgc2hhcmVkIGJ5IEJMMSBhbmQgQkwzLTEuCisgKgorICogVGhpcyBtYWNybyB3aWxsIGFsd2F5cyBwZXJmb3JtIHJlc2V0IGhhbmRsaW5nLCBhcmNoaXRlY3R1cmFsIGluaXRpYWxpc2F0aW9ucworICogYW5kIHN0YWNrIHNldHVwLiBUaGUgcmVzdCBvZiB0aGUgYWN0aW9ucyBhcmUgb3B0aW9uYWwgYmVjYXVzZSB0aGV5IG1pZ2h0IG5vdAorICogYmUgbmVlZGVkLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBtYWNybyBpcyBjYWxsZWQuIFRoaXMgaXMKKyAqIHdoeSB0aGlzIG1hY3JvIGlzIHBhcmFtZXRlcmlzZWQgOyBlYWNoIHBhcmFtZXRlciBhbGxvd3MgdG8gZW5hYmxlL2Rpc2FibGUKKyAqIHNvbWUgYWN0aW9ucy4KKyAqCisgKiAgX3NldF9lbmRpYW46CisgKglXaGV0aGVyIHRoZSBtYWNybyBuZWVkcyB0byBjb25maWd1cmUgdGhlIGVuZGlhbm5lc3Mgb2YgZGF0YSBhY2Nlc3Nlcy4KKyAqCisgKiAgX3dhcm1fYm9vdF9tYWlsYm94OgorICoJV2hldGhlciB0aGUgbWFjcm8gbmVlZHMgdG8gZGV0ZWN0IHRoZSB0eXBlIG9mIGJvb3QgKGNvbGQvd2FybSkuIFRoZQorICoJZGV0ZWN0aW9uIGlzIGJhc2VkIG9uIHRoZSBwbGF0Zm9ybSBlbnRyeXBvaW50IGFkZHJlc3MgOiBpZiBpdCBpcyB6ZXJvCisgKgl0aGVuIGl0IGlzIGEgY29sZCBib290LCBvdGhlcndpc2UgaXQgaXMgYSB3YXJtIGJvb3QuIEluIHRoZSBsYXR0ZXIgY2FzZSwKKyAqCXRoaXMgbWFjcm8ganVtcHMgb24gdGhlIHBsYXRmb3JtIGVudHJ5cG9pbnQgYWRkcmVzcy4KKyAqCisgKiAgX3NlY29uZGFyeV9jb2xkX2Jvb3Q6CisgKglXaGV0aGVyIHRoZSBtYWNybyBuZWVkcyB0byBpZGVudGlmeSB0aGUgQ1BVIHRoYXQgaXMgY2FsbGluZyBpdDogcHJpbWFyeQorICoJQ1BVIG9yIHNlY29uZGFyeSBDUFUuIFRoZSBwcmltYXJ5IENQVSB3aWxsIGJlIGFsbG93ZWQgdG8gY2Fycnkgb24gd2l0aAorICoJdGhlIHBsYXRmb3JtIGluaXRpYWxpc2F0aW9ucywgd2hpbGUgdGhlIHNlY29uZGFyaWVzIHdpbGwgYmUgcHV0IGluIGEKKyAqCXBsYXRmb3JtLXNwZWNpZmljIHN0YXRlIGluIHRoZSBtZWFudGltZS4KKyAqCisgKglJZiB0aGUgY2FsbGVyIGtub3dzIHRoaXMgbWFjcm8gd2lsbCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgcHJpbWFyeSBDUFUKKyAqCXRoZW4gdGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGRlZmluZWQgdG8gMCB0byBza2lwIHRoaXMgc3RlcC4KKyAqCisgKiBfaW5pdF9tZW1vcnk6CisgKglXaGV0aGVyIHRoZSBtYWNybyBuZWVkcyB0byBpbml0aWFsaXNlIHRoZSBtZW1vcnkuCisgKgorICogX2luaXRfY19ydW50aW1lOgorICoJV2hldGhlciB0aGUgbWFjcm8gbmVlZHMgdG8gaW5pdGlhbGlzZSB0aGUgQyBydW50aW1lIGVudmlyb25tZW50LgorICoKKyAqIF9leGNlcHRpb25fdmVjdG9yczoKKyAqCUFkZHJlc3Mgb2YgdGhlIGV4Y2VwdGlvbiB2ZWN0b3JzIHRvIHByb2dyYW0gaW4gdGhlIFZCQVJfRUwzIHJlZ2lzdGVyLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCS5tYWNybyBlbDNfZW50cnlwb2ludF9jb21tb24JCQkJCVwKKwkJX3NldF9lbmRpYW4sIF93YXJtX2Jvb3RfbWFpbGJveCwgX3NlY29uZGFyeV9jb2xkX2Jvb3QsCVwKKwkJX2luaXRfbWVtb3J5LCBfaW5pdF9jX3J1bnRpbWUsIF9leGNlcHRpb25fdmVjdG9ycworCisJLmlmIFxfc2V0X2VuZGlhbgorCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqIFNldCB0aGUgQ1BVIGVuZGlhbm5lc3MgYmVmb3JlIGRvaW5nIGFueXRoaW5nIHRoYXQgbWlnaHQKKwkJICogaW52b2x2ZSBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzLgorCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqLworCQltcnMJeDAsIHNjdGxyX2VsMworCQliaWMJeDAsIHgwLCAjU0NUTFJfRUVfQklUCisJCW1zcglzY3Rscl9lbDMsIHgwCisJCWlzYgorCS5lbmRpZiAvKiBfc2V0X2VuZGlhbiAqLworCisJLmlmIFxfd2FybV9ib290X21haWxib3gKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgKiBUaGlzIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBmb3IgYm90aCB3YXJtIGFuZCBjb2xkIHJlc2V0cy4KKwkJICogTm93IGlzIHRoZSB0aW1lIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3by4KKwkJICogUXVlcnkgdGhlIHBsYXRmb3JtIGVudHJ5cG9pbnQgYWRkcmVzcyBhbmQgaWYgaXQgaXMgbm90IHplcm8KKwkJICogdGhlbiBpdCBtZWFucyBpdCBpcyBhIHdhcm0gYm9vdCBzbyBqdW1wIHRvIHRoaXMgYWRkcmVzcy4KKwkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgKi8KKwkJbXJzCXgwLCBtcGlkcl9lbDEKKwkJYmwJcGxhdGZvcm1fZ2V0X2VudHJ5cG9pbnQKKwkJY2J6CXgwLCBkb19jb2xkX2Jvb3QKKwkJYnIJeDAKKworCWRvX2NvbGRfYm9vdDoKKwkuZW5kaWYgLyogX3dhcm1fYm9vdF9tYWlsYm94ICovCisKKwkuaWYgXF9zZWNvbmRhcnlfY29sZF9ib290CisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICogSXQgaXMgYSBjb2xkIGJvb3QuCisJCSAqIFRoZSBwcmltYXJ5IENQVSB3aWxsIHNldCB1cCB0aGUgcGxhdGZvcm0gd2hpbGUgdGhlCisJCSAqIHNlY29uZGFyaWVzIGFyZSBwbGFjZWQgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyBzdGF0ZSB1bnRpbCB0aGUKKwkJICogcHJpbWFyeSBDUFUgcGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBhY3Rpb25zIHRvIGJyaW5nIHRoZW0gb3V0CisJCSAqIG9mIHRoYXQgc3RhdGUgYW5kIGFsbG93cyBlbnRyeSBpbnRvIHRoZSBPUy4KKwkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgKi8KKwkJbXJzCXgwLCBtcGlkcl9lbDEKKwkJYmwJcGxhdGZvcm1faXNfcHJpbWFyeV9jcHUKKwkJY2Juegl4MCwgZG9fcHJpbWFyeV9jb2xkX2Jvb3QKKworCQkvKiBUaGlzIGlzIGEgY29sZCBib290IG9uIGEgc2Vjb25kYXJ5IENQVSAqLworCQlibAlwbGF0X3NlY29uZGFyeV9jb2xkX2Jvb3Rfc2V0dXAKKwkJLyogcGxhdF9zZWNvbmRhcnlfY29sZF9ib290X3NldHVwKCkgaXMgbm90IHN1cHBvc2VkIHRvIHJldHVybiAqLworCXNlY29uZGFyeV9wYW5pYzoKKwkJYglzZWNvbmRhcnlfcGFuaWMKKworCWRvX3ByaW1hcnlfY29sZF9ib290OgorCS5lbmRpZiAvKiBfc2Vjb25kYXJ5X2NvbGRfYm9vdCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUGVyZm9ybSBhbnkgcHJvY2Vzc29yIHNwZWNpZmljIGFjdGlvbnMgdXBvbiByZXNldCBlLmcuIGNhY2hlLCBUTEIKKwkgKiBpbnZhbGlkYXRpb25zIGV0Yy4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKi8KKwlibAlyZXNldF9oYW5kbGVyCisKKwllbDNfYXJjaF9pbml0X2NvbW1vbiBcX2V4Y2VwdGlvbl92ZWN0b3JzCisKKwkuaWYgXF9pbml0X21lbW9yeQorCQlibAlwbGF0Zm9ybV9tZW1faW5pdAorCS5lbmRpZiAvKiBfaW5pdF9tZW1vcnkgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEluaXQgQyBydW50aW1lIGVudmlyb25tZW50OgorCSAqICAgLSBaZXJvLWluaXRpYWxpc2UgdGhlIE5PQklUUyBzZWN0aW9ucy4gVGhlcmUgYXJlIDIgb2YgdGhlbToKKwkgKiAgICAgICAtIHRoZSAuYnNzIHNlY3Rpb247CisJICogICAgICAgLSB0aGUgY29oZXJlbnQgbWVtb3J5IHNlY3Rpb24gKGlmIGFueSkuCisJICogICAtIFJlbG9jYXRlIHRoZSBkYXRhIHNlY3Rpb24gZnJvbSBST00gdG8gUkFNLCBpZiByZXF1aXJlZC4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKi8KKwkuaWYgXF9pbml0X2NfcnVudGltZQorCQlsZHIJeDAsID1fX0JTU19TVEFSVF9fCisJCWxkcgl4MSwgPV9fQlNTX1NJWkVfXworCQlibAl6ZXJvbWVtMTYKKworI2lmIFVTRV9DT0hFUkVOVF9NRU0KKwkJbGRyCXgwLCA9X19DT0hFUkVOVF9SQU1fU1RBUlRfXworCQlsZHIJeDEsID1fX0NPSEVSRU5UX1JBTV9VTkFMSUdORURfU0laRV9fCisJCWJsCXplcm9tZW0xNgorI2VuZGlmCisKKyNpZiBJTUFHRV9CTDEKKwkJbGRyCXgwLCA9X19EQVRBX1JBTV9TVEFSVF9fCisJCWxkcgl4MSwgPV9fREFUQV9ST01fU1RBUlRfXworCQlsZHIJeDIsID1fX0RBVEFfU0laRV9fCisJCWJsCW1lbWNweTE2CisjZW5kaWYKKwkuZW5kaWYgLyogX2luaXRfY19ydW50aW1lICovCisKKyNpZiBJTUFHRV9CTDMxCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogVXNlIFNQX0VMMCBmb3IgdGhlIEMgcnVudGltZSBzdGFjay4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKi8KKwltc3IJc3BzZWwsICMwCisjZW5kaWYgLyogSU1BR0VfQkwzMSAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQWxsb2NhdGUgYSBzdGFjayB3aG9zZSBtZW1vcnkgd2lsbCBiZSBtYXJrZWQgYXMgTm9ybWFsLUlTLVdCV0Egd2hlbgorCSAqIHRoZSBNTVUgaXMgZW5hYmxlZC4gVGhlcmUgaXMgbm8gcmlzayBvZiByZWFkaW5nIHN0YWxlIHN0YWNrIG1lbW9yeQorCSAqIGFmdGVyIGVuYWJsaW5nIHRoZSBNTVUgYXMgb25seSB0aGUgcHJpbWFyeSBDUFUgaXMgcnVubmluZyBhdCB0aGUKKwkgKiBtb21lbnQuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJbXJzCXgwLCBtcGlkcl9lbDEKKwlibAlwbGF0Zm9ybV9zZXRfc3RhY2sKKwkuZW5kbQorCisjZW5kaWYgLyogX19FTDNfQ09NTU9OX01BQ1JPU19TX18gKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRoLmMgYi9pbmNsdWRlL2NvbW1vbi90YmJyL2NvdF9kZWYuaApzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gY29tbW9uL2F1dGguYwpjb3B5IHRvIGluY2x1ZGUvY29tbW9uL3RiYnIvY290X2RlZi5oCmluZGV4IDM3MjM0YjguLmQ2ZGNhNGEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRoLmMKKysrIGIvaW5jbHVkZS9jb21tb24vdGJici9jb3RfZGVmLmgKQEAgLTI4LDM0ICsyOCwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGF1dGguaD4KLSNpbmNsdWRlIDxkZWJ1Zy5oPgorI2lmbmRlZiBfX0NPVF9ERUZfSF9fCisjZGVmaW5lIF9fQ09UX0RFRl9IX18KIAotLyoKLSAqIEluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZQotICovCi12b2lkIGF1dGhfaW5pdCh2b2lkKQotewotCWFzc2VydChhdXRoX21vZC5uYW1lKTsKLQlhc3NlcnQoYXV0aF9tb2QuaW5pdCk7Ci0JYXNzZXJ0KGF1dGhfbW9kLnZlcmlmeSk7CisvKiBUQkJSIENvVCBkZWZpbml0aW9ucyAqLwogCi0JSU5GTygiVXNpbmcgYXV0aGVudGljYXRpb24gbW9kdWxlICclcydcbiIsIGF1dGhfbW9kLm5hbWUpOwotCWlmIChhdXRoX21vZC5pbml0KCkgIT0gMCkKLQkJYXNzZXJ0KDApOwotfQorI2RlZmluZSBDT1RfTUFYX1ZFUklGSUVEX1BBUkFNUwkJNAogCi0vKgotICogQXV0aGVudGljYXRlIGEgY2VydGlmaWNhdGUvaW1hZ2UKLSAqCi0gKiBSZXR1cm46IDAgPSBzdWNjZXNzLCBPdGhlcndpc2UgPSBlcnJvcgotICovCi1pbnQgYXV0aF92ZXJpZnlfb2JqKHVuc2lnbmVkIGludCBvYmpfaWQsIHVpbnRwdHJfdCBvYmpfYnVmLCBzaXplX3QgbGVuKQotewotCWFzc2VydChvYmpfaWQgPCBBVVRIX05VTV9PQkopOwotCWFzc2VydChvYmpfYnVmICE9IDApOwotCWFzc2VydChhdXRoX21vZC52ZXJpZnkpOwotCi0JcmV0dXJuIGF1dGhfbW9kLnZlcmlmeShvYmpfaWQsIG9ial9idWYsIGxlbik7Ci19CisjZW5kaWYgLyogX19DT1RfREVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dGguYyBiL2luY2x1ZGUvY29tbW9uL3RiYnIvdGJicl9pbWdfZGVmLmgKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIGNvbW1vbi9hdXRoLmMKY29weSB0byBpbmNsdWRlL2NvbW1vbi90YmJyL3RiYnJfaW1nX2RlZi5oCmluZGV4IDM3MjM0YjguLmM0M2MzOTUgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRoLmMKKysrIGIvaW5jbHVkZS9jb21tb24vdGJici90YmJyX2ltZ19kZWYuaApAQCAtMjgsMzQgKzI4LDM5IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8YXV0aC5oPgotI2luY2x1ZGUgPGRlYnVnLmg+CisjaWZuZGVmIF9fVEJCUl9JTUdfREVGX0hfXworI2RlZmluZSBfX1RCQlJfSU1HX0RFRl9IX18KIAotLyoKLSAqIEluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZQotICovCi12b2lkIGF1dGhfaW5pdCh2b2lkKQotewotCWFzc2VydChhdXRoX21vZC5uYW1lKTsKLQlhc3NlcnQoYXV0aF9tb2QuaW5pdCk7Ci0JYXNzZXJ0KGF1dGhfbW9kLnZlcmlmeSk7CisvKiBGaXJtd2FyZSBJbWFnZSBQYWNrYWdlICovCisjZGVmaW5lIEZJUF9JTUFHRV9JRAkJCTAKIAotCUlORk8oIlVzaW5nIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSAnJXMnXG4iLCBhdXRoX21vZC5uYW1lKTsKLQlpZiAoYXV0aF9tb2QuaW5pdCgpICE9IDApCi0JCWFzc2VydCgwKTsKLX0KKy8qIFRydXN0ZWQgQm9vdCBGaXJtd2FyZSBCTDIgKi8KKyNkZWZpbmUgQkwyX0lNQUdFX0lECQkJMQogCi0vKgotICogQXV0aGVudGljYXRlIGEgY2VydGlmaWNhdGUvaW1hZ2UKLSAqCi0gKiBSZXR1cm46IDAgPSBzdWNjZXNzLCBPdGhlcndpc2UgPSBlcnJvcgotICovCi1pbnQgYXV0aF92ZXJpZnlfb2JqKHVuc2lnbmVkIGludCBvYmpfaWQsIHVpbnRwdHJfdCBvYmpfYnVmLCBzaXplX3QgbGVuKQotewotCWFzc2VydChvYmpfaWQgPCBBVVRIX05VTV9PQkopOwotCWFzc2VydChvYmpfYnVmICE9IDApOwotCWFzc2VydChhdXRoX21vZC52ZXJpZnkpOworLyogU0NQIEZpcm13YXJlIEJMMy0wICovCisjZGVmaW5lIEJMMzBfSU1BR0VfSUQJCQkyCiAKLQlyZXR1cm4gYXV0aF9tb2QudmVyaWZ5KG9ial9pZCwgb2JqX2J1ZiwgbGVuKTsKLX0KKy8qIEVMMyBSdW50aW1lIEZpcm13YXJlIEJMMzEgKi8KKyNkZWZpbmUgQkwzMV9JTUFHRV9JRAkJCTMKKworLyogU2VjdXJlIFBheWxvYWQgQkwzMiAoVHJ1c3RlZCBPUykgKi8KKyNkZWZpbmUgQkwzMl9JTUFHRV9JRAkJCTQKKworLyogTm9uLVRydXN0ZWQgRmlybXdhcmUgQkwzMyAqLworI2RlZmluZSBCTDMzX0lNQUdFX0lECQkJNQorCisvKiBDZXJ0aWZpY2F0ZXMgKi8KKyNkZWZpbmUgQkwyX0NFUlRfSUQJCQk2CisjZGVmaW5lIFRSVVNURURfS0VZX0NFUlRfSUQJCTcKKworI2RlZmluZSBCTDMwX0tFWV9DRVJUX0lECQk4CisjZGVmaW5lIEJMMzFfS0VZX0NFUlRfSUQJCTkKKyNkZWZpbmUgQkwzMl9LRVlfQ0VSVF9JRAkJMTAKKyNkZWZpbmUgQkwzM19LRVlfQ0VSVF9JRAkJMTEKKworI2RlZmluZSBCTDMwX0NFUlRfSUQJCQkxMgorI2RlZmluZSBCTDMxX0NFUlRfSUQJCQkxMworI2RlZmluZSBCTDMyX0NFUlRfSUQJCQkxNAorI2RlZmluZSBCTDMzX0NFUlRfSUQJCQkxNQorCisjZW5kaWYgLyogX19UQkJSX0lNR19ERUZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RyaXZlcnMvYXV0aC9hdXRoX2NvbW1vbi5oIGIvaW5jbHVkZS9kcml2ZXJzL2F1dGgvYXV0aF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmE4OTVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcml2ZXJzL2F1dGgvYXV0aF9jb21tb24uaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCisgKiB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19BVVRIX0NPTU1PTl9IX18KKyNkZWZpbmUgX19BVVRIX0NPTU1PTl9IX18KKworLyoKKyAqIEF1dGhlbnRpY2F0aW9uIGZyYW1ld29yayBjb21tb24gdHlwZXMKKyAqLworCisvKgorICogVHlwZSBvZiBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGFuIGltYWdlIGFuZAorICogdXNlZCBmb3IgYXV0aGVudGljYXRpb24KKyAqLwordHlwZWRlZiBlbnVtIGF1dGhfcGFyYW1fdHlwZV9lbnVtIHsKKwlBVVRIX1BBUkFNX05PTkUsCisJQVVUSF9QQVJBTV9SQVdfREFUQSwJCS8qIFJhdyBpbWFnZSBkYXRhICovCisJQVVUSF9QQVJBTV9TSUcsCQkJLyogVGhlIGltYWdlIHNpZ25hdHVyZSAqLworCUFVVEhfUEFSQU1fU0lHX0FMRywJCS8qIFRoZSBpbWFnZSBzaWduYXR1cmUgYWxnb3JpdGhtICovCisJQVVUSF9QQVJBTV9IQVNILAkJLyogQSBoYXNoIChpbmNsdWRpbmcgdGhlIGFsZ29yaXRobSkgKi8KKwlBVVRIX1BBUkFNX1BVQl9LRVksCQkvKiBBIHB1YmxpYyBrZXkgKi8KK30gYXV0aF9wYXJhbV90eXBlX3Q7CisKKy8qCisgKiBEZWZpbmVzIGFuIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlci4gVGhlIGNvb2tpZSB3aWxsIGJlIGludGVycHJldGVkIGJ5IHRoZQorICogaW1hZ2UgcGFyc2VyIG1vZHVsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXV0aF9wYXJhbV90eXBlX2Rlc2NfcyB7CisJYXV0aF9wYXJhbV90eXBlX3QgdHlwZTsKKwl2b2lkICpjb29raWU7Cit9IGF1dGhfcGFyYW1fdHlwZV9kZXNjX3Q7CisKKy8qCisgKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlciBhbmQgaXRzIGxlbmd0aAorICovCit0eXBlZGVmIHN0cnVjdCBhdXRoX3BhcmFtX2RhdGFfZGVzY19zIHsKKwl2b2lkICpwdHI7CisJdW5zaWduZWQgaW50IGxlbjsKK30gYXV0aF9wYXJhbV9kYXRhX2Rlc2NfdDsKKworLyoKKyAqIEF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlciBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgdHlwZSBhbmQgdmFsdWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXV0aF9wYXJhbV9kZXNjX3MgeworCWF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgKnR5cGVfZGVzYzsKKwlhdXRoX3BhcmFtX2RhdGFfZGVzY190IGRhdGE7Cit9IGF1dGhfcGFyYW1fZGVzY190OworCisvKgorICogVGhlIG1ldGhvZCB0eXBlIGRlZmluZXMgaG93IGFuIGltYWdlIGlzIGF1dGhlbnRpY2F0ZWQKKyAqLwordHlwZWRlZiBlbnVtIGF1dGhfbWV0aG9kX3R5cGVfZW51bSB7CisJQVVUSF9NRVRIT0RfTk9ORSA9IDAsCisJQVVUSF9NRVRIT0RfSEFTSCwJLyogQXV0aGVudGljYXRlIGJ5IGhhc2ggbWF0Y2hpbmcgKi8KKwlBVVRIX01FVEhPRF9TSUcsCS8qIEF1dGhlbnRpY2F0ZSBieSBQSyBvcGVyYXRpb24gKi8KKwlBVVRIX01FVEhPRF9OVU0gCS8qIE51bWJlciBvZiBtZXRob2RzICovCit9IGF1dGhfbWV0aG9kX3R5cGVfdDsKKworLyoKKyAqIFBhcmFtZXRlcnMgZm9yIGF1dGhlbnRpY2F0aW9uIGJ5IGhhc2ggbWF0Y2hpbmcKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXV0aF9tZXRob2RfcGFyYW1faGFzaF9zIHsKKwlhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpkYXRhOwkvKiBEYXRhIHRvIGhhc2ggKi8KKwlhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpoYXNoOwkvKiBIYXNoIHRvIG1hdGNoIHdpdGggKi8KK30gYXV0aF9tZXRob2RfcGFyYW1faGFzaF90OworCisvKgorICogUGFyYW1ldGVycyBmb3IgYXV0aGVudGljYXRpb24gYnkgc2lnbmF0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IGF1dGhfbWV0aG9kX3BhcmFtX3NpZ19zIHsKKwlhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpwazsJLyogUHVibGljIGtleSAqLworCWF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgKnNpZzsJLyogU2lnbmF0dXJlIHRvIGNoZWNrICovCisJYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqYWxnOwkvKiBTaWduYXR1cmUgYWxnb3JpdGhtICovCisJYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqZGF0YTsJLyogRGF0YSBzaWduZWQgKi8KK30gYXV0aF9tZXRob2RfcGFyYW1fc2lnX3Q7CisKKy8qCisgKiBQYXJhbWV0ZXJzIGZvciBhdXRoZW50aWNhdGlvbiBieSBOViBjb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IGF1dGhfbWV0aG9kX3BhcmFtX252X2N0cl9zIHsKKwlhdXRoX3BhcmFtX3R5cGVfZGVzY190ICpudl9jdHI7CS8qIE5WIGNvdW50ZXIgdmFsdWUgKi8KK30gYXV0aF9tZXRob2RfcGFyYW1fbnZfY3RyX3Q7CisKKy8qCisgKiBBdXRoZW50aWNhdGlvbiBtZXRob2QgZGVzY3JpcHRvcgorICovCit0eXBlZGVmIHN0cnVjdCBhdXRoX21ldGhvZF9kZXNjX3MgeworCWF1dGhfbWV0aG9kX3R5cGVfdCB0eXBlOworCXVuaW9uIHsKKwkJYXV0aF9tZXRob2RfcGFyYW1faGFzaF90IGhhc2g7CisJCWF1dGhfbWV0aG9kX3BhcmFtX3NpZ190IHNpZzsKKwkJYXV0aF9tZXRob2RfcGFyYW1fbnZfY3RyX3QgbnZfY3RyOworCX0gcGFyYW07Cit9IGF1dGhfbWV0aG9kX2Rlc2NfdDsKKworLyoKKyAqIEhlbHBlciBtYWNybyB0byBkZWZpbmUgYW4gYXV0aGVudGljYXRpb24gcGFyYW1ldGVyIHR5cGUgZGVzY3JpcHRvcgorICovCisjZGVmaW5lIEFVVEhfUEFSQU1fVFlQRV9ERVNDKF90eXBlLCBfY29va2llKSBcCisJeyBcCisJCS50eXBlID0gX3R5cGUsIFwKKwkJLmNvb2tpZSA9ICh2b2lkICopX2Nvb2tpZSBcCisJfQorCisvKgorICogSGVscGVyIG1hY3JvIHRvIGRlZmluZSBhbiBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXIgZGF0YSBkZXNjcmlwdG9yCisgKi8KKyNkZWZpbmUgQVVUSF9QQVJBTV9EQVRBX0RFU0MoX3B0ciwgX2xlbikgXAorCXsgXAorCQkucHRyID0gKHZvaWQgKilfcHRyLCBcCisJCS5sZW4gPSAodW5zaWduZWQgaW50KV9sZW4gXAorCX0KKworI2VuZGlmIC8qIF9fQVVUSF9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9jb21tb24vYXV0aC5jIGIvaW5jbHVkZS9kcml2ZXJzL2F1dGgvYXV0aF9tb2QuaApzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gY29tbW9uL2F1dGguYwpjb3B5IHRvIGluY2x1ZGUvZHJpdmVycy9hdXRoL2F1dGhfbW9kLmgKaW5kZXggMzcyMzRiOC4uMGYxOWI1YyAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dGguYworKysgYi9pbmNsdWRlL2RyaXZlcnMvYXV0aC9hdXRoX21vZC5oCkBAIC0yOCwzNCArMjgsNDUgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxhdXRoLmg+Ci0jaW5jbHVkZSA8ZGVidWcuaD4KKyNpZm5kZWYgX19BVVRIX01PRF9IX18KKyNkZWZpbmUgX19BVVRIX01PRF9IX18KKworI2lmIFRSVVNURURfQk9BUkRfQk9PVAorCisjaW5jbHVkZSA8YXV0aF9jb21tb24uaD4KKyNpbmNsdWRlIDxjb3RfZGVmLmg+CisjaW5jbHVkZSA8aW1nX3BhcnNlcl9tb2QuaD4KIAogLyoKLSAqIEluaXRpYWxpemUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZQorICogSW1hZ2UgZmxhZ3MKICAqLwotdm9pZCBhdXRoX2luaXQodm9pZCkKLXsKLQlhc3NlcnQoYXV0aF9tb2QubmFtZSk7Ci0JYXNzZXJ0KGF1dGhfbW9kLmluaXQpOwotCWFzc2VydChhdXRoX21vZC52ZXJpZnkpOworI2RlZmluZSBJTUdfRkxBR19BVVRIRU5USUNBVEVECQkoMSA8PCAwKQogCi0JSU5GTygiVXNpbmcgYXV0aGVudGljYXRpb24gbW9kdWxlICclcydcbiIsIGF1dGhfbW9kLm5hbWUpOwotCWlmIChhdXRoX21vZC5pbml0KCkgIT0gMCkKLQkJYXNzZXJ0KDApOwotfQogCiAvKgotICogQXV0aGVudGljYXRlIGEgY2VydGlmaWNhdGUvaW1hZ2UKLSAqCi0gKiBSZXR1cm46IDAgPSBzdWNjZXNzLCBPdGhlcndpc2UgPSBlcnJvcgorICogQXV0aGVudGljYXRpb24gaW1hZ2UgZGVzY3JpcHRvcgogICovCi1pbnQgYXV0aF92ZXJpZnlfb2JqKHVuc2lnbmVkIGludCBvYmpfaWQsIHVpbnRwdHJfdCBvYmpfYnVmLCBzaXplX3QgbGVuKQotewotCWFzc2VydChvYmpfaWQgPCBBVVRIX05VTV9PQkopOwotCWFzc2VydChvYmpfYnVmICE9IDApOwotCWFzc2VydChhdXRoX21vZC52ZXJpZnkpOwordHlwZWRlZiBzdHJ1Y3QgYXV0aF9pbWdfZGVzY19zIHsKKwl1bnNpZ25lZCBpbnQgaW1nX2lkOworCWNvbnN0IHN0cnVjdCBhdXRoX2ltZ19kZXNjX3MgKnBhcmVudDsKKwlpbWdfdHlwZV90IGltZ190eXBlOworCWF1dGhfbWV0aG9kX2Rlc2NfdCBpbWdfYXV0aF9tZXRob2RzW0FVVEhfTUVUSE9EX05VTV07CisJYXV0aF9wYXJhbV9kZXNjX3QgYXV0aGVudGljYXRlZF9kYXRhW0NPVF9NQVhfVkVSSUZJRURfUEFSQU1TXTsKK30gYXV0aF9pbWdfZGVzY190OwogCi0JcmV0dXJuIGF1dGhfbW9kLnZlcmlmeShvYmpfaWQsIG9ial9idWYsIGxlbik7Ci19CisvKiBQdWJsaWMgZnVuY3Rpb25zICovCit2b2lkIGF1dGhfbW9kX2luaXQodm9pZCk7CitpbnQgYXV0aF9tb2RfZ2V0X3BhcmVudF9pZCh1bnNpZ25lZCBpbnQgaW1nX2lkLCB1bnNpZ25lZCBpbnQgKnBhcmVudF9pZCk7CitpbnQgYXV0aF9tb2RfdmVyaWZ5X2ltZyh1bnNpZ25lZCBpbnQgaW1nX2lkLAorCQkJdm9pZCAqaW1nX3B0ciwKKwkJCXVuc2lnbmVkIGludCBpbWdfbGVuKTsKKworLyogTWFjcm8gdG8gcmVnaXN0ZXIgYSBDb1QgZGVmaW5lZCBhcyBhbiBhcnJheSBvZiBhdXRoX2ltZ19kZXNjX3QgKi8KKyNkZWZpbmUgUkVHSVNURVJfQ09UKF9jb3QpIFwKKwljb25zdCBhdXRoX2ltZ19kZXNjX3QgKmNvbnN0IGNvdF9kZXNjX3B0ciA9IFwKKwkJCShjb25zdCBhdXRoX2ltZ19kZXNjX3QgKmNvbnN0KSZfY290WzBdOyBcCisJdW5zaWduZWQgaW50IGF1dGhfaW1nX2ZsYWdzW3NpemVvZihfY290KS9zaXplb2YoX2NvdFswXSldOworCisjZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCisKKyNlbmRpZiAvKiBfX0FVVEhfTU9EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcml2ZXJzL2F1dGgvY3J5cHRvX21vZC5oIGIvaW5jbHVkZS9kcml2ZXJzL2F1dGgvY3J5cHRvX21vZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTU2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RyaXZlcnMvYXV0aC9jcnlwdG9fbW9kLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCisgKiB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19DUllQVE9fTU9EX0hfXworI2RlZmluZSBfX0NSWVBUT19NT0RfSF9fCisKKy8qIFJldHVybiB2YWx1ZXMgKi8KK2VudW0gY3J5cHRvX3JldF92YWx1ZSB7CisJQ1JZUFRPX1NVQ0NFU1MgPSAwLAorCUNSWVBUT19FUlJfSU5JVCwKKwlDUllQVE9fRVJSX0hBU0gsCisJQ1JZUFRPX0VSUl9TSUdOQVRVUkUsCisJQ1JZUFRPX0VSUl9VTktOT1dOCit9OworCisvKgorICogQ3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IGRlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRvX2xpYl9kZXNjX3MgeworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBJbml0aWFsaXplIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24gaXMgbm90IGV4cGVjdGVkIHRvIGZhaWwuIEFsbCBlcnJvcnMKKwkgKiBtdXN0IGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbiwgYXNzZXJ0aW5nIG9yIHBhbmljaW5nIGluIGNhc2Ugb2YKKwkgKiBhIG5vbi1yZWNvdmVyYWJsZSBlcnJvciAqLworCXZvaWQgKCppbml0KSh2b2lkKTsKKworCS8qIFZlcmlmeSBhIGRpZ2l0YWwgc2lnbmF0dXJlLiBSZXR1cm4gb25lIG9mIHRoZQorCSAqICdlbnVtIGNyeXB0b19yZXRfdmFsdWUnIG9wdGlvbnMgKi8KKwlpbnQgKCp2ZXJpZnlfc2lnbmF0dXJlKSh2b2lkICpkYXRhX3B0ciwgdW5zaWduZWQgaW50IGRhdGFfbGVuLAorCQkJCXZvaWQgKnNpZ19wdHIsIHVuc2lnbmVkIGludCBzaWdfbGVuLAorCQkJCXZvaWQgKnNpZ19hbGcsIHVuc2lnbmVkIGludCBzaWdfYWxnX2xlbiwKKwkJCQl2b2lkICpwa19wdHIsIHVuc2lnbmVkIGludCBwa19sZW4pOworCisJLyogVmVyaWZ5IGEgaGFzaC4gUmV0dXJuIG9uZSBvZiB0aGUgJ2VudW0gY3J5cHRvX3JldF92YWx1ZScgb3B0aW9ucyAqLworCWludCAoKnZlcmlmeV9oYXNoKSh2b2lkICpkYXRhX3B0ciwgdW5zaWduZWQgaW50IGRhdGFfbGVuLAorCQkJICAgdm9pZCAqZGlnZXN0X2luZm9fcHRyLCB1bnNpZ25lZCBpbnQgZGlnZXN0X2luZm9fbGVuKTsKK30gY3J5cHRvX2xpYl9kZXNjX3Q7CisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KK3ZvaWQgY3J5cHRvX21vZF9pbml0KHZvaWQpOworaW50IGNyeXB0b19tb2RfdmVyaWZ5X3NpZ25hdHVyZSh2b2lkICpkYXRhX3B0ciwgdW5zaWduZWQgaW50IGRhdGFfbGVuLAorCQkJCXZvaWQgKnNpZ19wdHIsIHVuc2lnbmVkIGludCBzaWdfbGVuLAorCQkJCXZvaWQgKnNpZ19hbGcsIHVuc2lnbmVkIGludCBzaWdfYWxnX2xlbiwKKwkJCQl2b2lkICpwa19wdHIsIHVuc2lnbmVkIGludCBwa19sZW4pOworaW50IGNyeXB0b19tb2RfdmVyaWZ5X2hhc2godm9pZCAqZGF0YV9wdHIsIHVuc2lnbmVkIGludCBkYXRhX2xlbiwKKwkJCSAgIHZvaWQgKmRpZ2VzdF9pbmZvX3B0ciwgdW5zaWduZWQgaW50IGRpZ2VzdF9pbmZvX2xlbik7CisKKy8qIE1hY3JvIHRvIHJlZ2lzdGVyIGEgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5ICovCisjZGVmaW5lIFJFR0lTVEVSX0NSWVBUT19MSUIoX25hbWUsIF9pbml0LCBfdmVyaWZ5X3NpZ25hdHVyZSwgX3ZlcmlmeV9oYXNoKSBcCisJY29uc3QgY3J5cHRvX2xpYl9kZXNjX3QgY3J5cHRvX2xpYl9kZXNjID0geyBcCisJCS5uYW1lID0gX25hbWUsIFwKKwkJLmluaXQgPSBfaW5pdCwgXAorCQkudmVyaWZ5X3NpZ25hdHVyZSA9IF92ZXJpZnlfc2lnbmF0dXJlLCBcCisJCS52ZXJpZnlfaGFzaCA9IF92ZXJpZnlfaGFzaCBcCisJfQorCisjZW5kaWYgLyogX19DUllQVE9fTU9EX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcml2ZXJzL2F1dGgvaW1nX3BhcnNlcl9tb2QuaCBiL2luY2x1ZGUvZHJpdmVycy9hdXRoL2ltZ19wYXJzZXJfbW9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwZTBmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJpdmVycy9hdXRoL2ltZ19wYXJzZXJfbW9kLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogTmVpdGhlciB0aGUgbmFtZSBvZiBBUk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCisgKiB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19JTUdfUEFSU0VSX01PRF9IX18KKyNkZWZpbmUgX19JTUdfUEFSU0VSX01PRF9IX18KKworI2luY2x1ZGUgPGF1dGhfY29tbW9uLmg+CisKKy8qCisgKiBSZXR1cm4gdmFsdWVzCisgKi8KK2VudW0gaW1nX3BhcnNlcl9yZXRfdmFsdWUgeworCUlNR19QQVJTRVJfT0ssCisJSU1HX1BBUlNFUl9FUlIsCQkJLyogUGFyc2VyIGludGVybmFsIGVycm9yICovCisJSU1HX1BBUlNFUl9FUlJfRk9STUFULAkJLyogTWFsZm9ybWVkIGltYWdlICovCisJSU1HX1BBUlNFUl9FUlJfTk9UX0ZPVU5ECS8qIEF1dGhlbnRpY2F0aW9uIGRhdGEgbm90IGZvdW5kICovCit9OworCisvKgorICogSW1hZ2UgdHlwZXMuIEEgcGFyc2VyIHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgYW5kIHJlZ2lzdGVyZWQgZm9yIGVhY2ggdHlwZQorICovCit0eXBlZGVmIGVudW0gaW1nX3R5cGVfZW51bSB7CisJSU1HX1JBVywJCQkvKiBCaW5hcnkgaW1hZ2UgKi8KKwlJTUdfUExBVCwJCQkvKiBQbGF0Zm9ybSBzcGVjaWZpYyBmb3JtYXQgKi8KKwlJTUdfQ0VSVCwJCQkvKiBYNTA5djMgY2VydGlmaWNhdGUgKi8KKwlJTUdfTUFYX1RZUEVTLAorfSBpbWdfdHlwZV90OworCisvKiBJbWFnZSBwYXJzZXIgbGlicmFyeSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IGltZ19wYXJzZXJfbGliX2Rlc2NfcyB7CisJaW1nX3R5cGVfdCBpbWdfdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJdm9pZCAoKmluaXQpKHZvaWQpOworCWludCAoKmNoZWNrX2ludGVncml0eSkodm9pZCAqaW1nLCB1bnNpZ25lZCBpbnQgaW1nX2xlbik7CisJaW50ICgqZ2V0X2F1dGhfcGFyYW0pKGNvbnN0IGF1dGhfcGFyYW1fdHlwZV9kZXNjX3QgKnR5cGVfZGVzYywKKwkJCXZvaWQgKmltZywgdW5zaWduZWQgaW50IGltZ19sZW4sCisJCQl2b2lkICoqcGFyYW0sIHVuc2lnbmVkIGludCAqcGFyYW1fbGVuKTsKK30gaW1nX3BhcnNlcl9saWJfZGVzY190OworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KK3ZvaWQgaW1nX3BhcnNlcl9pbml0KHZvaWQpOworaW50IGltZ19wYXJzZXJfY2hlY2tfaW50ZWdyaXR5KGltZ190eXBlX3QgaW1nX3R5cGUsCisJCXZvaWQgKmltZywgdW5zaWduZWQgaW50IGltZ19sZW4pOworaW50IGltZ19wYXJzZXJfZ2V0X2F1dGhfcGFyYW0oaW1nX3R5cGVfdCBpbWdfdHlwZSwKKwkJY29uc3QgYXV0aF9wYXJhbV90eXBlX2Rlc2NfdCAqdHlwZV9kZXNjLAorCQl2b2lkICppbWcsIHVuc2lnbmVkIGludCBpbWdfbGVuLAorCQl2b2lkICoqcGFyYW1fcHRyLCB1bnNpZ25lZCBpbnQgKnBhcmFtX2xlbik7CisKKy8qIE1hY3JvIHRvIHJlZ2lzdGVyIGFuIGltYWdlIHBhcnNlciBsaWJyYXJ5ICovCisjZGVmaW5lIFJFR0lTVEVSX0lNR19QQVJTRVJfTElCKF90eXBlLCBfbmFtZSwgX2luaXQsIF9jaGVja19pbnQsIF9nZXRfcGFyYW0pIFwKKwlzdGF0aWMgY29uc3QgaW1nX3BhcnNlcl9saWJfZGVzY190IF9faW1nX3BhcnNlcl9saWJfZGVzY18jI190eXBlIFwKKwlfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLmltZ19wYXJzZXJfbGliX2Rlc2NzIiksIHVzZWQpKSA9IHsgXAorCQkuaW1nX3R5cGUgPSBfdHlwZSwgXAorCQkubmFtZSA9IF9uYW1lLCBcCisJCS5pbml0ID0gX2luaXQsIFwKKwkJLmNoZWNrX2ludGVncml0eSA9IF9jaGVja19pbnQsIFwKKwkJLmdldF9hdXRoX3BhcmFtID0gX2dldF9wYXJhbSBcCisJfQorCisjZW5kaWYgLyogX19JTUdfUEFSU0VSX01PRF9IX18gKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRoLmMgYi9pbmNsdWRlL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLmgKc2ltaWxhcml0eSBpbmRleCA3MSUKY29weSBmcm9tIGNvbW1vbi9hdXRoLmMKY29weSB0byBpbmNsdWRlL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLmgKaW5kZXggMzcyMzRiOC4uZWIyMmU4YSAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dGguYworKysgYi9pbmNsdWRlL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29tbW9uLmgKQEAgLTI4LDM0ICsyOCw5IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8YXV0aC5oPgotI2luY2x1ZGUgPGRlYnVnLmg+CisjaWZuZGVmIF9fTUJFRFRMU19DT01NT05fSF9fCisjZGVmaW5lIF9fTUJFRFRMU19DT01NT05fSF9fCiAKLS8qCi0gKiBJbml0aWFsaXplIHRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUKLSAqLwotdm9pZCBhdXRoX2luaXQodm9pZCkKLXsKLQlhc3NlcnQoYXV0aF9tb2QubmFtZSk7Ci0JYXNzZXJ0KGF1dGhfbW9kLmluaXQpOwotCWFzc2VydChhdXRoX21vZC52ZXJpZnkpOwordm9pZCBtYmVkdGxzX2luaXQodm9pZCk7CiAKLQlJTkZPKCJVc2luZyBhdXRoZW50aWNhdGlvbiBtb2R1bGUgJyVzJ1xuIiwgYXV0aF9tb2QubmFtZSk7Ci0JaWYgKGF1dGhfbW9kLmluaXQoKSAhPSAwKQotCQlhc3NlcnQoMCk7Ci19Ci0KLS8qCi0gKiBBdXRoZW50aWNhdGUgYSBjZXJ0aWZpY2F0ZS9pbWFnZQotICoKLSAqIFJldHVybjogMCA9IHN1Y2Nlc3MsIE90aGVyd2lzZSA9IGVycm9yCi0gKi8KLWludCBhdXRoX3ZlcmlmeV9vYmoodW5zaWduZWQgaW50IG9ial9pZCwgdWludHB0cl90IG9ial9idWYsIHNpemVfdCBsZW4pCi17Ci0JYXNzZXJ0KG9ial9pZCA8IEFVVEhfTlVNX09CSik7Ci0JYXNzZXJ0KG9ial9idWYgIT0gMCk7Ci0JYXNzZXJ0KGF1dGhfbW9kLnZlcmlmeSk7Ci0KLQlyZXR1cm4gYXV0aF9tb2QudmVyaWZ5KG9ial9pZCwgb2JqX2J1ZiwgbGVuKTsKLX0KKyNlbmRpZiAvKiBfX01CRURUTFNfQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2xfY29uZmlnLmggYi9pbmNsdWRlL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29uZmlnLmgKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gY29tbW9uL2F1dGgvcG9sYXJzc2wvcG9sYXJzc2xfY29uZmlnLmgKcmVuYW1lIHRvIGluY2x1ZGUvZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc19jb25maWcuaAppbmRleCBiNDE5YmY5Li44YTAwMGYwIDEwMDY0NAotLS0gYS9jb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbF9jb25maWcuaAorKysgYi9pbmNsdWRlL2RyaXZlcnMvYXV0aC9tYmVkdGxzL21iZWR0bHNfY29uZmlnLmgKQEAgLTI3LDkgKzI3LDE0IEBACiAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KLSNpZm5kZWYgX19QT0xBUlNTTF9DT05GSUdfSF9fCi0jZGVmaW5lIF9fUE9MQVJTU0xfQ09ORklHX0hfXworI2lmbmRlZiBfX01CRURUTFNfQ09ORklHX0hfXworI2RlZmluZSBfX01CRURUTFNfQ09ORklHX0hfXwogCisvKgorICogS2V5IGFsZ29yaXRobXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBtYmVkVExTIGxpYnJhcmllcworICovCisjZGVmaW5lIE1CRURUTFNfUlNBCQkJMQorI2RlZmluZSBNQkVEVExTX0VDRFNBCQkJMgogCiAvKgogICogQ29uZmlndXJhdGlvbiBmaWxlIHRvIGJ1aWxkIFBvbGFyU1NMIHdpdGggdGhlIHJlcXVpcmVkIGZlYXR1cmVzIGZvcgpAQCAtNjQsNyArNjksMTQgQEAKIAogI2RlZmluZSBQT0xBUlNTTF9QTEFURk9STV9DCiAKKyNpZiAoTUJFRFRMU19LRVlfQUxHX0lEID09IE1CRURUTFNfRUNEU0EpCisjZGVmaW5lIFBPTEFSU1NMX0VDRFNBX0MKKyNkZWZpbmUgUE9MQVJTU0xfRUNQX0MKKyNkZWZpbmUgUE9MQVJTU0xfRUNQX0RQX1NFQ1AyNTZSMV9FTkFCTEVECisjZWxpZiAoTUJFRFRMU19LRVlfQUxHX0lEID09IE1CRURUTFNfUlNBKQogI2RlZmluZSBQT0xBUlNTTF9SU0FfQworI2VuZGlmCisKICNkZWZpbmUgUE9MQVJTU0xfU0hBMjU2X0MKIAogI2RlZmluZSBQT0xBUlNTTF9WRVJTSU9OX0MKQEAgLTgxLDQgKzkzLDcgQEAKIAogI2luY2x1ZGUgInBvbGFyc3NsL2NoZWNrX2NvbmZpZy5oIgogCi0jZW5kaWYgLyogX19QT0xBUlNTTF9DT05GSUdfSF9fICovCisvKiBTeXN0ZW0gaGVhZGVycyByZXF1aXJlZCB0byBidWlsZCBtYmVkVExTIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZW5kaWYgLyogX19NQkVEVExTX0NPTkZJR19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJpdmVycy9pby9pb19zdG9yYWdlLmggYi9pbmNsdWRlL2RyaXZlcnMvaW8vaW9fc3RvcmFnZS5oCmluZGV4IGFlMTE1OGMuLmU5OGRjZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJpdmVycy9pby9pb19zdG9yYWdlLmgKKysrIGIvaW5jbHVkZS9kcml2ZXJzL2lvL2lvX3N0b3JhZ2UuaApAQCAtMzMsNiArMzMsNyBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4gLyogRm9yIHNzaXplX3QgKi8KKyNpbmNsdWRlIDx1dWlkLmg+CiAKIAogLyogRGV2aWNlIHR5cGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHBvbGljeSBkZWNpc2lvbnMgYWJvdXQgd2hpY2ggZGV2aWNlCkBAIC02Nyw2ICs2OCwxMSBAQAogCXVuc2lnbmVkIGludCBtb2RlOwogfSBpb19maWxlX3NwZWNfdDsKIAorLyogVVVJRCBzcGVjaWZpY2F0aW9uIC0gdXNlZCB0byByZWZlciB0byBkYXRhIGFjY2Vzc2VkIHVzaW5nIFVVSURzIChpLmUuIEZJUAorICogaW1hZ2VzKSAqLwordHlwZWRlZiBzdHJ1Y3QgaW9fdXVpZF9zcGVjIHsKKwljb25zdCB1dWlkX3QgdXVpZDsKK30gaW9fdXVpZF9zcGVjX3Q7CiAKIC8qIEJsb2NrIHNwZWNpZmljYXRpb24gLSB1c2VkIHRvIHJlZmVyIHRvIGRhdGEgb24gYSBkZXZpY2Ugc3VwcG9ydGluZwogICogYmxvY2stbGlrZSBlbnRpdGllcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wbGF0L2FybS9ib2FyZC9jb21tb24vYm9hcmRfYXJtX2RlZi5oIGIvaW5jbHVkZS9wbGF0L2FybS9ib2FyZC9jb21tb24vYm9hcmRfYXJtX2RlZi5oCmluZGV4IDIxZGVlN2UuLjNhYmYyMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGxhdC9hcm0vYm9hcmQvY29tbW9uL2JvYXJkX2FybV9kZWYuaAorKysgYi9pbmNsdWRlL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fZGVmLmgKQEAgLTY0LDI5ICs2NCw0MSBAQAogICogcGxhdF9hcm1fbW1hcCBhcnJheSBkZWZpbmVkIGZvciBlYWNoIEJMIHN0YWdlLgogICovCiAjaWYgSU1BR0VfQkwxCi0jIGRlZmluZSBQTEFUX0FSTV9NTUFQX0VOVFJJRVMJCTYKKyMgaWYgUExBVF9mdnAKKyMgIGRlZmluZSBQTEFUX0FSTV9NTUFQX0VOVFJJRVMJCTcKKyMgZWxzZQorIyAgZGVmaW5lIFBMQVRfQVJNX01NQVBfRU5UUklFUwkJNgorIyBlbmRpZgogI2VuZGlmCiAjaWYgSU1BR0VfQkwyCi0jIGRlZmluZSBQTEFUX0FSTV9NTUFQX0VOVFJJRVMJCTgKKyMgaWYgUExBVF9mdnAKKyMgIGRlZmluZSBQTEFUX0FSTV9NTUFQX0VOVFJJRVMJCTkKKyMgZWxzZQorIyAgZGVmaW5lIFBMQVRfQVJNX01NQVBfRU5UUklFUwkJOAorIyBlbmRpZgogI2VuZGlmCiAjaWYgSU1BR0VfQkwzMQotIyBkZWZpbmUgUExBVF9BUk1fTU1BUF9FTlRSSUVTCQk1CisjZGVmaW5lIFBMQVRfQVJNX01NQVBfRU5UUklFUwkJNQogI2VuZGlmCiAjaWYgSU1BR0VfQkwzMgotIyBkZWZpbmUgUExBVF9BUk1fTU1BUF9FTlRSSUVTCQk0CisjZGVmaW5lIFBMQVRfQVJNX01NQVBfRU5UUklFUwkJNAogI2VuZGlmCiAKIC8qCiAgKiBQbGF0Zm9ybSBzcGVjaWZpYyBwYWdlIHRhYmxlIGFuZCBNTVUgc2V0dXAgY29uc3RhbnRzCiAgKi8KICNpZiBJTUFHRV9CTDEKLSMgaWYgUExBVF9mdnAgfHwgUExBVF9qdW5vCisjIGlmIFBMQVRfanVubwogIyAgZGVmaW5lIE1BWF9YTEFUX1RBQkxFUwkJMgogIyBlbHNlCiAjICBkZWZpbmUgTUFYX1hMQVRfVEFCTEVTCQkzCiAjIGVuZGlmIC8qIFBMQVRfICovCiAjZWxpZiBJTUFHRV9CTDIKLSMgZGVmaW5lIE1BWF9YTEFUX1RBQkxFUwkJMworIyBpZiBQTEFUX2p1bm8KKyMgIGRlZmluZSBNQVhfWExBVF9UQUJMRVMJCTMKKyMgZWxzZQorIyAgZGVmaW5lIE1BWF9YTEFUX1RBQkxFUwkJNAorIyBlbmRpZiAvKiBQTEFUXyAqLwogI2VsaWYgSU1BR0VfQkwzMQogIyBkZWZpbmUgTUFYX1hMQVRfVEFCTEVTCQkyCiAjZWxpZiBJTUFHRV9CTDMyCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BsYXQvYXJtL2NvbW1vbi9hcm1fZGVmLmggYi9pbmNsdWRlL3BsYXQvYXJtL2NvbW1vbi9hcm1fZGVmLmgKaW5kZXggYzkzYjY4NC4uNDQ0N2FmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wbGF0L2FybS9jb21tb24vYXJtX2RlZi5oCisrKyBiL2luY2x1ZGUvcGxhdC9hcm0vY29tbW9uL2FybV9kZWYuaApAQCAtMzIsNiArMzIsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uX2RlZi5oPgogI2luY2x1ZGUgPHBsYXRmb3JtX2RlZi5oPgorI2luY2x1ZGUgPHRiYnJfaW1nX2RlZi5oPgogI2luY2x1ZGUgPHhsYXRfdGFibGVzLmg+CiAKIApAQCAtMjAwLDcgKzIwMSw3IEBACiAjaWYgVFJVU1RFRF9CT0FSRF9CT09UCiAjZGVmaW5lIEJMMV9SV19CQVNFCQkJKEFSTV9CTF9SQU1fQkFTRSArCQlcCiAJCQkJCQlBUk1fQkxfUkFNX1NJWkUgLQlcCi0JCQkJCQkweDgwMDApCisJCQkJCQkweDkwMDApCiAjZWxzZQogI2RlZmluZSBCTDFfUldfQkFTRQkJCShBUk1fQkxfUkFNX0JBU0UgKwkJXAogCQkJCQkJQVJNX0JMX1JBTV9TSVpFIC0JXApAQCAtMjE2LDcgKzIxNyw3IEBACiAgKiBzaXplIHBsdXMgYSBsaXR0bGUgc3BhY2UgZm9yIGdyb3d0aC4KICAqLwogI2lmIFRSVVNURURfQk9BUkRfQk9PVAotI2RlZmluZSBCTDJfQkFTRQkJCShCTDMxX0JBU0UgLSAweDFDMDAwKQorI2RlZmluZSBCTDJfQkFTRQkJCShCTDMxX0JBU0UgLSAweDFEMDAwKQogI2Vsc2UKICNkZWZpbmUgQkwyX0JBU0UJCQkoQkwzMV9CQVNFIC0gMHhDMDAwKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BsYXQvYXJtL2NvbW1vbi9wbGF0X2FybS5oIGIvaW5jbHVkZS9wbGF0L2FybS9jb21tb24vcGxhdF9hcm0uaAppbmRleCBlMTIyMWE5Li5kN2VhYWMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BsYXQvYXJtL2NvbW1vbi9wbGF0X2FybS5oCisrKyBiL2luY2x1ZGUvcGxhdC9hcm0vY29tbW9uL3BsYXRfYXJtLmgKQEAgLTE5Niw4ICsxOTYsOSBAQAogICovCiB2b2lkIHBsYXRfYXJtX2lvX3NldHVwKHZvaWQpOwogaW50IHBsYXRfYXJtX2dldF9hbHRfaW1hZ2Vfc291cmNlKAotCWNvbnN0IHVpbnRwdHJfdCBpbWFnZV9zcGVjLAotCXVpbnRwdHJfdCAqZGV2X2hhbmRsZSk7CisJdW5zaWduZWQgaW50IGltYWdlX2lkLAorCXVpbnRwdHJfdCAqZGV2X2hhbmRsZSwKKwl1aW50cHRyX3QgKmltYWdlX3NwZWMpOwogdm9pZCBwbGF0X2FybV90b3BvbG9neV9zZXR1cCh2b2lkKTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BsYXQvYXJtL3NvYy9jb21tb24vc29jX2Nzc19kZWYuaCBiL2luY2x1ZGUvcGxhdC9hcm0vc29jL2NvbW1vbi9zb2NfY3NzX2RlZi5oCmluZGV4IDhiNDNlNGMuLjQyOGRmNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGxhdC9hcm0vc29jL2NvbW1vbi9zb2NfY3NzX2RlZi5oCisrKyBiL2luY2x1ZGUvcGxhdC9hcm0vc29jL2NvbW1vbi9zb2NfY3NzX2RlZi5oCkBAIC02NSw2ICs2NSwxNCBAQAogICovCiAjZGVmaW5lIFNPQ19DU1NfTklDNDAwX0FQQjRfQlJJREdFCTQKIAorLyogS2V5cyAqLworI2RlZmluZSBTT0NfS0VZU19CQVNFCQkJMHg3ZmU4MDAwMAorI2RlZmluZSBUWl9QVUJfS0VZX0hBU0hfQkFTRQkJKFNPQ19LRVlTX0JBU0UgKyAweDAwMDApCisjZGVmaW5lIFRaX1BVQl9LRVlfSEFTSF9TSVpFCQkzMgorI2RlZmluZSBIVV9LRVlfQkFTRQkJCShTT0NfS0VZU19CQVNFICsgMHgwMDIwKQorI2RlZmluZSBIVV9LRVlfU0laRQkJCTE2CisjZGVmaW5lIEVORF9LRVlfQkFTRQkJCShTT0NfS0VZU19CQVNFICsgMHgwMDQ0KQorI2RlZmluZSBFTkRfS0VZX1NJWkUJCQkzMgogCiAjZGVmaW5lIFNPQ19DU1NfTUFQX0RFVklDRQkJTUFQX1JFR0lPTl9GTEFUKAkJXAogCQkJCQkJU09DX0NTU19ERVZJQ0VfQkFTRSwJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wbGF0L2NvbW1vbi9jb21tb25fZGVmLmggYi9pbmNsdWRlL3BsYXQvY29tbW9uL2NvbW1vbl9kZWYuaAppbmRleCAxZTJhNDE3Li4xYjMyMDNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BsYXQvY29tbW9uL2NvbW1vbl9kZWYuaAorKysgYi9pbmNsdWRlL3BsYXQvY29tbW9uL2NvbW1vbl9kZWYuaApAQCAtNDcsNDAgKzQ3LDYgQEAKICAqLwogI2RlZmluZSBGSVJNV0FSRV9XRUxDT01FX1NUUgkJIkJvb3RpbmcgVHJ1c3RlZCBGaXJtd2FyZVxuIgogCi0vKiBUcnVzdGVkIEJvb3QgRmlybXdhcmUgQkwyICovCi0jZGVmaW5lIEJMMl9JTUFHRV9OQU1FCQkJImJsMi5iaW4iCi0KLS8qIFNDUCBGaXJtd2FyZSBCTDMtMCAqLwotI2RlZmluZSBCTDMwX0lNQUdFX05BTUUJCQkiYmwzMC5iaW4iCi0KLS8qIEVMMyBSdW50aW1lIEZpcm13YXJlIEJMMzEgKi8KLSNkZWZpbmUgQkwzMV9JTUFHRV9OQU1FCQkJImJsMzEuYmluIgotCi0vKiBTZWN1cmUgUGF5bG9hZCBCTDMyIChUcnVzdGVkIE9TKSAqLwotI2RlZmluZSBCTDMyX0lNQUdFX05BTUUJCQkiYmwzMi5iaW4iCi0KLS8qIE5vbi1UcnVzdGVkIEZpcm13YXJlIEJMMzMgKi8KLSNkZWZpbmUgQkwzM19JTUFHRV9OQU1FCQkJImJsMzMuYmluIgotCi0vKiBGaXJtd2FyZSBJbWFnZSBQYWNrYWdlICovCi0jZGVmaW5lIEZJUF9JTUFHRV9OQU1FCQkJImZpcC5iaW4iCi0KLSNpZiBUUlVTVEVEX0JPQVJEX0JPT1QKLS8qIENlcnRpZmljYXRlcyAqLwotIyBkZWZpbmUgQkwyX0NFUlRfTkFNRQkJCSJibDIuY3J0IgotIyBkZWZpbmUgVFJVU1RFRF9LRVlfQ0VSVF9OQU1FCQkidHJ1c3RlZF9rZXkuY3J0IgotCi0jIGRlZmluZSBCTDMwX0tFWV9DRVJUX05BTUUJCSJibDMwX2tleS5jcnQiCi0jIGRlZmluZSBCTDMxX0tFWV9DRVJUX05BTUUJCSJibDMxX2tleS5jcnQiCi0jIGRlZmluZSBCTDMyX0tFWV9DRVJUX05BTUUJCSJibDMyX2tleS5jcnQiCi0jIGRlZmluZSBCTDMzX0tFWV9DRVJUX05BTUUJCSJibDMzX2tleS5jcnQiCi0KLSMgZGVmaW5lIEJMMzBfQ0VSVF9OQU1FCQkJImJsMzAuY3J0IgotIyBkZWZpbmUgQkwzMV9DRVJUX05BTUUJCQkiYmwzMS5jcnQiCi0jIGRlZmluZSBCTDMyX0NFUlRfTkFNRQkJCSJibDMyLmNydCIKLSMgZGVmaW5lIEJMMzNfQ0VSVF9OQU1FCQkJImJsMzMuY3J0IgotI2VuZGlmIC8qIFRSVVNURURfQk9BUkRfQk9PVCAqLwotCiAvKgogICogU29tZSBvZiB0aGUgcGxhdGZvcm0gcG9ydGluZyBkZWZpbml0aW9ucyB1c2UgdGhlICd1bGwnIHN1ZmZpeCBpbiBvcmRlciB0bwogICogYXZvaWQgc3VidGxlIGludGVnZXIgb3ZlcmZsb3cgZXJyb3JzIGR1ZSB0byBpbXBsaWNpdCBpbnRlZ2VyIHR5cGUgcHJvbW90aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BsYXQvY29tbW9uL3BsYXRmb3JtLmggYi9pbmNsdWRlL3BsYXQvY29tbW9uL3BsYXRmb3JtLmgKaW5kZXggODE4OGY0NS4uNDY5ZDQ2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wbGF0L2NvbW1vbi9wbGF0Zm9ybS5oCisrKyBiL2luY2x1ZGUvcGxhdC9jb21tb24vcGxhdGZvcm0uaApAQCAtNDQsMTMgKzQ0LDE4IEBACiBzdHJ1Y3QgYmwzMV9wYXJhbXM7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwbGF0X2dldF9yb3Rwa19pbmZvKCkgZmxhZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFJPVFBLX0lTX0hBU0gJCQkoMSA8PCAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRnVuY3Rpb24gZGVjbGFyYXRpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hbmRhdG9yeSBjb21tb24gZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdWludDY0X3QgcGxhdF9nZXRfc3lzY250X2ZyZXEodm9pZCk7Ci1pbnQgcGxhdF9nZXRfaW1hZ2Vfc291cmNlKGNvbnN0IGNoYXIgKmltYWdlX25hbWUsCitpbnQgcGxhdF9nZXRfaW1hZ2Vfc291cmNlKHVuc2lnbmVkIGludCBpbWFnZV9pZCwKIAkJCXVpbnRwdHJfdCAqZGV2X2hhbmRsZSwKIAkJCXVpbnRwdHJfdCAqaW1hZ2Vfc3BlYyk7CiB1bnNpZ25lZCBsb25nIHBsYXRfZ2V0X25zX2ltYWdlX2VudHJ5cG9pbnQodm9pZCk7CkBAIC0xOTEsOCArMTk2LDkgQEAKIHZvaWQgYmwzMl9wbGF0X2VuYWJsZV9tbXUodWludDMyX3QgZmxhZ3MpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVHJ1c3RlZCBCb290IGZ1bmN0aW9ucworICogVHJ1c3RlZCBCb2FyZCBCb290IGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBwbGF0X21hdGNoX3JvdHBrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK2ludCBwbGF0X2dldF9yb3Rwa19pbmZvKHZvaWQgKmNvb2tpZSwgdm9pZCAqKmtleV9wdHIsIHVuc2lnbmVkIGludCAqa2V5X2xlbiwKKwkJCXVuc2lnbmVkIGludCAqZmxhZ3MpOwogCiAjZW5kaWYgLyogX19QTEFURk9STV9IX18gKi8KZGlmZiAtLWdpdCBhL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fdHJ1c3RlZF9ib290LmMgYi9wbGF0L2FybS9ib2FyZC9jb21tb24vYm9hcmRfYXJtX3RydXN0ZWRfYm9vdC5jCmluZGV4IGM2YWQ2OGEuLjEwM2FhZmIgMTAwNjQ0Ci0tLSBhL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fdHJ1c3RlZF9ib290LmMKKysrIGIvcGxhdC9hcm0vYm9hcmQvY29tbW9uL2JvYXJkX2FybV90cnVzdGVkX2Jvb3QuYwpAQCAtMjgsMTUgKzI4LDEyMyBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAorI2luY2x1ZGUgPGFybV9kZWYuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCiAvKiBXZWFrIGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgcGxhdGZvcm0gKi8KICNwcmFnbWEgd2VhayBwbGF0X21hdGNoX3JvdHBrCisKKy8qIFNIQTI1NiBhbGdvcml0aG0gKi8KKyNkZWZpbmUgU0hBMjU2X0JZVEVTCQkJMzIKKworLyogUk9UUEsgbG9jYXRpb25zICovCisjZGVmaW5lIEFSTV9ST1RQS19SRUdTX0lECQkxCisjZGVmaW5lIEFSTV9ST1RQS19ERVZFTF9SU0FfSUQJCTIKKworI2lmICFBUk1fUk9UUEtfTE9DQVRJT05fSUQKKyAgI2Vycm9yICJBUk1fUk9UUEtfTE9DQVRJT05fSUQgbm90IGRlZmluZWQiCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcm90cGtfaGFzaF9oZHJbXSA9CQlcCisJCSJceDMwXHgzMVx4MzBceDBEXHgwNlx4MDlceDYwXHg4Nlx4NDgiCVwKKwkJIlx4MDFceDY1XHgwM1x4MDRceDAyXHgwMVx4MDVceDAwXHgwNFx4MjAiOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByb3Rwa19oYXNoX2hkcl9sZW4gPSBzaXplb2Yocm90cGtfaGFzaF9oZHIpIC0gMTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJvdHBrX2hhc2hfZGVyW3NpemVvZihyb3Rwa19oYXNoX2hkcikgLSAxICsgU0hBMjU2X0JZVEVTXTsKKworI2lmIChBUk1fUk9UUEtfTE9DQVRJT05fSUQgPT0gQVJNX1JPVFBLX0RFVkVMX1JTQV9JRCkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFybV9kZXZlbF9yb3Rwa19oYXNoW10gPQlcCisJCSJceEIwXHhGM1x4ODJceDA5XHgxMlx4OTdceEQ4XHgzQSIJXAorCQkiXHgzN1x4N0FceDcyXHg0N1x4MUJceEVDXHgzMlx4NzMiCVwKKwkJIlx4RTlceDkyXHgzMlx4RTJceDQ5XHg1OVx4RjZceDVFIglcCisJCSJceDhCXHg0QVx4NEFceDQ2XHhEOFx4MjJceDlBXHhEQSI7CisjZW5kaWYKKwogLyoKLSAqIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUga2V5CisgKiBSZXR1cm4gdGhlIFJPVFBLIGhhc2ggaW4gdGhlIGZvbGxvd2luZyBBU04uMSBzdHJ1Y3R1cmUgaW4gREVSIGZvcm1hdDoKICAqCi0gKiAwID0gc3VjY2VzcywgT3RoZXJ3aXNlID0gZXJyb3IKKyAqIEFsZ29yaXRobUlkZW50aWZpZXIgIDo6PSAgU0VRVUVOQ0UgIHsKKyAqICAgICBhbGdvcml0aG0gICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiwKKyAqICAgICBwYXJhbWV0ZXJzICAgICAgICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwKKyAqIH0KKyAqCisgKiBEaWdlc3RJbmZvIDo6PSBTRVFVRU5DRSB7CisgKiAgICAgZGlnZXN0QWxnb3JpdGhtICAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICBkaWdlc3QgICAgICAgICAgICBPQ1RFVCBTVFJJTkcKKyAqIH0KICAqLwotaW50IHBsYXRfbWF0Y2hfcm90cGsoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5X2J1ZiwgdW5zaWduZWQgaW50IGtleV9sZW4pCitpbnQgcGxhdF9nZXRfcm90cGtfaW5mbyh2b2lkICpjb29raWUsIHZvaWQgKiprZXlfcHRyLCB1bnNpZ25lZCBpbnQgKmtleV9sZW4sCisJCQl1bnNpZ25lZCBpbnQgKmZsYWdzKQogewotCS8qIFRPRE86IGNoZWNrIGFnYWluc3QgdGhlIFJPVCBrZXkgc3RvcmVkIGluIHRoZSBwbGF0Zm9ybSAqLworCXVpbnQ4X3QgKmRzdDsKKworCWFzc2VydChrZXlfcHRyICE9IE5VTEwpOworCWFzc2VydChrZXlfbGVuICE9IE5VTEwpOworCWFzc2VydChmbGFncyAhPSBOVUxMKTsKKworCS8qIENvcHkgdGhlIERFUiBoZWFkZXIgKi8KKwltZW1jcHkocm90cGtfaGFzaF9kZXIsIHJvdHBrX2hhc2hfaGRyLCByb3Rwa19oYXNoX2hkcl9sZW4pOworCWRzdCA9ICh1aW50OF90ICopJnJvdHBrX2hhc2hfZGVyW3JvdHBrX2hhc2hfaGRyX2xlbl07CisKKyNpZiAoQVJNX1JPVFBLX0xPQ0FUSU9OX0lEID09IEFSTV9ST1RQS19ERVZFTF9SU0FfSUQpCisJbWVtY3B5KGRzdCwgYXJtX2RldmVsX3JvdHBrX2hhc2gsIFNIQTI1Nl9CWVRFUyk7CisjZWxpZiAoQVJNX1JPVFBLX0xPQ0FUSU9OX0lEID09IEFSTV9ST1RQS19SRUdTX0lEKQorCXVpbnQzMl90ICpzcmMsIHRtcDsKKwl1bnNpZ25lZCBpbnQgd29yZHMsIGk7CisKKwkvKgorCSAqIEFwcGVuZCB0aGUgaGFzaCBmcm9tIFRydXN0ZWQgUm9vdC1LZXkgU3RvcmFnZSByZWdpc3RlcnMuIFRoZSBoYXNoIGhhcworCSAqIG5vdCBiZWVuIHdyaXR0ZW4gbGluZWFybHkgaW50byB0aGUgcmVnaXN0ZXJzLCBzbyB3ZSBoYXZlIHRvIGRvIGEgYml0CisJICogb2YgYnl0ZSBzd2FwcGluZzoKKwkgKgorCSAqICAgICAweDAwICAgIDB4MDQgICAgMHgwOCAgICAweDBDICAgIDB4MTAgICAgMHgxNCAgICAweDE4ICAgIDB4MUMKKwkgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIHwgUmVnMCAgfCBSZWcxICB8IFJlZzIgIHwgUmVnMyAgfCBSZWc0ICB8IFJlZzUgIHwgUmVnNiAgfCBSZWc3ICB8CisJICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiAgfCAuLi4gICAgICAgICAgICAgICAgICAgIC4uLiB8ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgLi4uICB8CisJICogIHwgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIHwgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKworCSAqICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisJICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKwkgKiAgKy0tLS0tLS0rICAgICAgICAgICAgICAgICAgICB8ICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICB8CisJICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKKwkgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxCisJICoKKwkgKiBBZGRpdGlvbmFsbHksIHdlIGhhdmUgdG8gYWNjZXNzIHRoZSByZWdpc3RlcnMgaW4gMzItYml0IHdvcmRzCisJICovCisJd29yZHMgPSBTSEEyNTZfQllURVMgPj4gMzsKKworCS8qIFN3YXAgYnl0ZXMgMC0xNSAoZmlyc3QgZm91ciByZWdpc3RlcnMpICovCisJc3JjID0gKHVpbnQzMl90ICopVFpfUFVCX0tFWV9IQVNIX0JBU0U7CisJZm9yIChpID0gMCA7IGkgPCB3b3JkcyA7IGkrKykgeworCQl0bXAgPSBzcmNbd29yZHMgLSAxIC0gaV07CisJCS8qIFdvcmRzIGFyZSByZWFkIGluIGxpdHRsZSBlbmRpYW4gKi8KKwkJKmRzdCsrID0gKHVpbnQ4X3QpKCh0bXAgPj4gMjQpICYgMHhGRik7CisJCSpkc3QrKyA9ICh1aW50OF90KSgodG1wID4+IDE2KSAmIDB4RkYpOworCQkqZHN0KysgPSAodWludDhfdCkoKHRtcCA+PiA4KSAmIDB4RkYpOworCQkqZHN0KysgPSAodWludDhfdCkodG1wICYgMHhGRik7CisJfQorCisJLyogU3dhcCBieXRlcyAxNi0zMSAobGFzdCBmb3VyIHJlZ2lzdGVycykgKi8KKwlzcmMgPSAodWludDMyX3QgKikoVFpfUFVCX0tFWV9IQVNIX0JBU0UgKyBTSEEyNTZfQllURVMgLyAyKTsKKwlmb3IgKGkgPSAwIDsgaSA8IHdvcmRzIDsgaSsrKSB7CisJCXRtcCA9IHNyY1t3b3JkcyAtIDEgLSBpXTsKKwkJKmRzdCsrID0gKHVpbnQ4X3QpKCh0bXAgPj4gMjQpICYgMHhGRik7CisJCSpkc3QrKyA9ICh1aW50OF90KSgodG1wID4+IDE2KSAmIDB4RkYpOworCQkqZHN0KysgPSAodWludDhfdCkoKHRtcCA+PiA4KSAmIDB4RkYpOworCQkqZHN0KysgPSAodWludDhfdCkodG1wICYgMHhGRik7CisJfQorI2VuZGlmIC8qIChBUk1fUk9UUEtfTE9DQVRJT05fSUQgPT0gQVJNX1JPVFBLX0RFVkVMX1JTQV9JRCkgKi8KKworCSprZXlfcHRyID0gKHZvaWQgKilyb3Rwa19oYXNoX2RlcjsKKwkqa2V5X2xlbiA9ICh1bnNpZ25lZCBpbnQpc2l6ZW9mKHJvdHBrX2hhc2hfZGVyKTsKKwkqZmxhZ3MgPSBST1RQS19JU19IQVNIOwogCXJldHVybiAwOwogfQorCmRpZmYgLS1naXQgYS9jb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbC5tayBiL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9jb21tb24ubWsKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIGNvbW1vbi9hdXRoL3BvbGFyc3NsL3BvbGFyc3NsLm1rCmNvcHkgdG8gcGxhdC9hcm0vYm9hcmQvY29tbW9uL2JvYXJkX2NvbW1vbi5tawppbmRleCA2OWM3NDFmLi5iZWM0OWVkIDEwMDY0NAotLS0gYS9jb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbC5taworKysgYi9wbGF0L2FybS9ib2FyZC9jb21tb24vYm9hcmRfY29tbW9uLm1rCkBAIC0yOCw0MSArMjgsMjggQEAKICMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAjCiAKLSMgUE9MQVJTU0xfRElSIG11c3QgYmUgc2V0IHRvIHRoZSBQb2xhclNTTCBtYWluIGRpcmVjdG9yeSAoaXQgbXVzdCBjb250YWluCi0jIHRoZSAnaW5jbHVkZScgYW5kICdsaWJyYXJ5JyBzdWJkaXJlY3RvcmllcykuCi1pZmVxICgke1BPTEFSU1NMX0RJUn0sKQotICAkKGVycm9yIEVycm9yOiBQT0xBUlNTTF9ESVIgbm90IHNldCkKK1BMQVRfSU5DTFVERVMJCSs9CS1JaW5jbHVkZS9wbGF0L2FybS9ib2FyZC9jb21tb24vCisKK1BMQVRfQkxfQ09NTU9OX1NPVVJDRVMJKz0JZHJpdmVycy9hcm0vcGwwMTEvcGwwMTFfY29uc29sZS5TCQkJXAorCQkJCXBsYXQvYXJtL2JvYXJkL2NvbW1vbi9hYXJjaDY0L2JvYXJkX2FybV9oZWxwZXJzLlMKKworI0JMMV9TT1VSQ0VTCQkrPQorCisjQkwyX1NPVVJDRVMJCSs9CisKKyNCTDMxX1NPVVJDRVMJCSs9CisKK2lmbmVxICgke1RSVVNURURfQk9BUkRfQk9PVH0sMCkKKyAgICAjIFJPVFBLIGhhc2ggbG9jYXRpb24KKyAgICBpZmVxICgke0FSTV9ST1RQS19MT0NBVElPTn0sIHJlZ3MpCisgICAgICAgIEFSTV9ST1RQS19MT0NBVElPTl9JRCA9IEFSTV9ST1RQS19SRUdTX0lECisgICAgZWxzZSBpZmVxICgke0FSTV9ST1RQS19MT0NBVElPTn0sIGRldmVsX3JzYSkKKyAgICAgICAgQVJNX1JPVFBLX0xPQ0FUSU9OX0lEID0gQVJNX1JPVFBLX0RFVkVMX1JTQV9JRAorICAgIGVsc2UKKyAgICAgICAgJChlcnJvciAiVW5zdXBwb3J0ZWQgQVJNX1JPVFBLX0xPQ0FUSU9OIHZhbHVlIikKKyAgICBlbmRpZgorICAgICQoZXZhbCAkKGNhbGwgYWRkX2RlZmluZSxBUk1fUk9UUEtfTE9DQVRJT05fSUQpKQorCisgICAgQkwxX1NPVVJDRVMJCSs9CXBsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fdHJ1c3RlZF9ib290LmMKKyAgICBCTDJfU09VUkNFUwkJKz0JcGxhdC9hcm0vYm9hcmQvY29tbW9uL2JvYXJkX2FybV90cnVzdGVkX2Jvb3QuYwogZW5kaWYKLQotSU5DTFVERVMJCSs9CS1JJHtQT0xBUlNTTF9ESVJ9L2luY2x1ZGUJCVwKLQkJCQktSWNvbW1vbi9hdXRoL3BvbGFyc3NsCi0KLVBPTEFSU1NMX0NPTkZJR19GSUxFCTo9CSI8cG9sYXJzc2xfY29uZmlnLmg+IgotJChldmFsICQoY2FsbCBhZGRfZGVmaW5lLFBPTEFSU1NMX0NPTkZJR19GSUxFKSkKLQotUE9MQVJTU0xfU09VUkNFUwk6PQkkKGFkZHByZWZpeCAke1BPTEFSU1NMX0RJUn0vbGlicmFyeS8sCVwKLQkJCQlhc24xcGFyc2UuYyAJCQkJXAotCQkJCWFzbjF3cml0ZS5jIAkJCQlcCi0JCQkJYmlnbnVtLmMJCQkJXAotCQkJCW1kLmMJCQkJCVwKLQkJCQltZF93cmFwLmMJCQkJXAotCQkJCW1lbW9yeV9idWZmZXJfYWxsb2MuYwkJCVwKLQkJCQlvaWQuYyAJCQkJCVwKLQkJCQlway5jIAkJCQkJXAotCQkJCXBrX3dyYXAuYyAJCQkJXAotCQkJCXBrcGFyc2UuYyAJCQkJXAotCQkJCXBrd3JpdGUuYyAJCQkJXAotCQkJCXBsYXRmb3JtLmMgCQkJCVwKLQkJCQlyc2EuYyAJCQkJCVwKLQkJCQlzaGEyNTYuYwkJCQlcCi0JCQkJeDUwOS5jIAkJCQkJXAotCQkJCXg1MDlfY3J0LmMgCQkJCVwKLQkJCQkpCi0KLUJMMV9TT1VSQ0VTCQkrPQkke1BPTEFSU1NMX1NPVVJDRVN9IAkJCVwKLQkJCQljb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbC5jCi0KLUJMMl9TT1VSQ0VTCQkrPQkke1BPTEFSU1NMX1NPVVJDRVN9IAkJCVwKLQkJCQljb21tb24vYXV0aC9wb2xhcnNzbC9wb2xhcnNzbC5jCi0KLURJU0FCTEVfUEVEQU5USUMJOj0JMQpkaWZmIC0tZ2l0IGEvcGxhdC9hcm0vYm9hcmQvY29tbW9uL2JvYXJkX2Nzcy5tayBiL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9jc3MubWsKaW5kZXggNjkxOTk5Yi4uNjdlNzk0ZSAxMDA2NDQKLS0tIGEvcGxhdC9hcm0vYm9hcmQvY29tbW9uL2JvYXJkX2Nzcy5taworKysgYi9wbGF0L2FybS9ib2FyZC9jb21tb24vYm9hcmRfY3NzLm1rCkBAIC0yOCwyMCArMjgsNiBAQAogIyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICMKIAotUExBVF9JTkNMVURFUwkJKz0JLUlpbmNsdWRlL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi8KK1BMQVRfQkxfQ09NTU9OX1NPVVJDRVMJKz0JcGxhdC9hcm0vYm9hcmQvY29tbW9uL2JvYXJkX2Nzc19jb21tb24uYwogCi1QTEFUX0JMX0NPTU1PTl9TT1VSQ0VTCSs9CWRyaXZlcnMvYXJtL3BsMDExL3BsMDExX2NvbnNvbGUuUwkJCVwKLQkJCQlwbGF0L2FybS9ib2FyZC9jb21tb24vYWFyY2g2NC9ib2FyZF9hcm1faGVscGVycy5TCVwKLQkJCQlwbGF0L2FybS9ib2FyZC9jb21tb24vYm9hcmRfY3NzX2NvbW1vbi5jCi0KLQotI0JMMV9TT1VSQ0VTCQkrPQotCi0jQkwyX1NPVVJDRVMJCSs9Ci0KLSNCTDMxX1NPVVJDRVMJCSs9Ci0KLWlmbmVxICgke1RSVVNURURfQk9BUkRfQk9PVH0sMCkKLSAgQkwxX1NPVVJDRVMJCSs9CXBsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fdHJ1c3RlZF9ib290LmMKLSAgQkwyX1NPVVJDRVMJCSs9CXBsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fdHJ1c3RlZF9ib290LmMKLWVuZGlmCitpbmNsdWRlIHBsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9jb21tb24ubWsKZGlmZiAtLWdpdCBhL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9yb3Rway9hcm1fcm90cGtfcnNhLmRlciBiL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9yb3Rway9hcm1fcm90cGtfcnNhLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFmODk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdC9hcm0vYm9hcmQvY29tbW9uL3JvdHBrL2FybV9yb3Rwa19yc2EuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXQvYXJtL2JvYXJkL2NvbW1vbi9yb3Rway9hcm1fcm90cGtfcnNhX3NoYTI1Ni5iaW4gYi9wbGF0L2FybS9ib2FyZC9jb21tb24vcm90cGsvYXJtX3JvdHBrX3JzYV9zaGEyNTYuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NTNmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0L2FybS9ib2FyZC9jb21tb24vcm90cGsvYXJtX3JvdHBrX3JzYV9zaGEyNTYuYmluCkBAIC0wLDAgKzEgQEAKK7DzggkSl9g6N3pyRxvsMnPpkjLiSVn2XotKSkbYIpraClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGxhdC9hcm0vYm9hcmQvY29tbW9uL3JvdHBrL2FybV9yb3Rwcml2a19yc2EucGVtIGIvcGxhdC9hcm0vYm9hcmQvY29tbW9uL3JvdHBrL2FybV9yb3Rwcml2a19yc2EucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNDEwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0L2FybS9ib2FyZC9jb21tb24vcm90cGsvYXJtX3JvdHByaXZrX3JzYS5wZW0KQEAgLTAsMCArMSwyOCBAQAorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUURMTEdEVmpXUFVCM2wrCit4eGFXdlUwa1RxeUc1cmR4NDhWVUMrY1VITDBwR3NFL2VyWUNxcXMyeE5rMmFXemlaY09ic2I4OXFGWW15LzBFCitBYnFzUGxReXlubGV1N0lGNmdaWThuUzY0ZlNId0JrS0gyWUhkNFNEb1J6di95aFo1OE5vZlNZZ1ErdFdZL001CitNZGdyVWFtOFQ5RDIzcFhjWDF2QjdaQnY3Q2lSZmhmdGVKRDBZS2ZFeDA5UTdWMFRPaUVyY01WaGV3Z2haVHJOCitnbGFNZWtlc2llaWxTRWd4MlIxRzVZV0dtS0Rsd0tacXZRZmtrbGRoQjQ5OVdrM0tyamE1VmdRUThteSs5anRzCitnRDYrRHFOTng5UitwMG5VOHRLOHp6Q281M1NQWk4rOFhFZG96RUJNK0lQTXkwQTFCR0RLczZRWG53UEtIVnI2CiswYThoVnhEVEFnTUJBQUVDZ2dFQWZ3c2M4ZXdiaERXNFR3SUdxZk50RFVyMHJ0WU4xM1ZwcW9oVzBraTJMOEcvCitIUWFLVVZpTy93eFFGcW9Obi9PcVFPMEFmSG1LaFhBQW9rVENpWG5nQkhKL09qRjd2QjcrSVJoYXpaRUU2dTIvCit1b2l2ci9PWU5RYkZwWHlUcXNRMWVGenBQanU2S0tjUEs3QnpUNE1jODllay92bG9GQWk4dzZMZE1sOGxidk9nCitMQldxWCs1QStVUW9lblBVVHZZTTRVMjJZTmNFQVd1Ymtwc1lBbVZpaVdpYWMrYSt1UFJrMzlhS3lmT2VkRE51CisrdHk5TXRDd2VraXZvVVRmUC8xK08rakZsRG5QTUpVT0VrQm1jQnF4c2VZWUFIdTdibEJwZEh4WXBBSXRDMnB2CitZd0pKU3ZzRStITEJMUGsxNzdKYWhnN3NPVXFjUDBGL1grVDY1eXV2SVFLQmdRRHhkalhkSlQ1SzhqN3JHMmZ2CisyYnZGMkgxR1BhSGFUWVJrMEVHSTJRbDZObitkZGZlQ0U2Z2FUN2FQUGdnODd3QWhOdTkzY29GdVlIdzBwL3NjCitaa1hNSitCbWxzdFBWNTU1Y1dYbXdjeFpMc25pMGZPWHJ0NFl4d1drWndtaDc0bTBOVk0vY1NGdzU2UFUwb2oxCit5RE5lcTNmZ21zSm9jbXVOVGUxZUc5cUE3UUtCZ1FEWGFBR3JOQTVYZWw1bXFxTVlUSEhRV0k2bDJ1emROdHQ3CitlRG4zSzkrRWgzeXdUcXJ3UDg0NU1BaktEVTJMcTYxSTZ0Mkg4OWRFaWZIcTgyM1ZJY0xDSGQ5QkYwNE1yQUg3CitxRFB6cm1QUDJpQjlnK1lGbUdCS2UrSzBIRkUxdDFLclRsbzlWVjZaQUM2UkpOTEFnd0Q0a3ZmSVZZTmtDR3dlCisraG9aQmRoZ3Z3S0JnQnJPc1BRNGFrNFB6d1J6S25ycWhYcFZxckxkck5aN3ZMTWttK0lCbHBmRzdTd2lLTFI4CitVakY1b0I4UEdBTUwxY3ZhT1lQZFpwbEdoUU9qa3JGNGVVOU5MaEMxdFNTOTZZNDZGTUlseWZZc3g2VXpBZ1JaCitHYmRPZ1VYYldxcHIyYkgwS2FYbGZYejNlcXpxSXVLR3M0MVRKQi8vam8zaUJpYk4vQWh5dHpPUkFvR0FlR292Cis1S0RwRTRYWWw5UHo4SFZyZW1qRzlYaDR5UUVObU93UW0xZnZUNHJkN1VGTTFaa1ZrMnFDdjFESWRMZTMydmRRCitkOXVjRHpoK0FEV3N4R1JuRjFUVHBQTitNaDlGeklTdTVoNHF0ZHJlSnN4QkhnZWNiSWJzcUhyYit3ZE1NMjlOCitpdFBhV2ZWOEVxOWZFVGNxcDhxZ3NXRDhYa05IRGRvS0ZNcnJ0c2tDZ1lBb1N0L0plMUQzWkUvM0hFamV6N2JxCitmZW5TM0o2S0cyU0VuMlBORm4rUjBSNXZCbzREYVYvY1F5c0toNDRHRDIrc2gwUUR5aDZudVdKdWZ5aFB6Uk9QCitEVTZEQ0xid05lUGoveWFHdXppMzZvTHQ2YkJnZlBXQ2lKWTdqSWRLOERtVExXMjVtN2ZSdENDNXB4WmxTemdsCitLQmY3UjZjYmFUdmFGZTA1WTJGSlhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3BsYXQvYXJtL2JvYXJkL2Z2cC9hYXJjaDY0L2Z2cF9jb21tb24uYyBiL3BsYXQvYXJtL2JvYXJkL2Z2cC9hYXJjaDY0L2Z2cF9jb21tb24uYwppbmRleCBhODc2MzEzLi5jNDZiZGI2IDEwMDY0NAotLS0gYS9wbGF0L2FybS9ib2FyZC9mdnAvYWFyY2g2NC9mdnBfY29tbW9uLmMKKysrIGIvcGxhdC9hcm0vYm9hcmQvZnZwL2FhcmNoNjQvZnZwX2NvbW1vbi5jCkBAIC01NSw2ICs1NSwxMSBAQAogCQkJCQlERVZJQ0UxX1NJWkUsCQkJXAogCQkJCQlNVF9ERVZJQ0UgfCBNVF9SVyB8IE1UX1NFQ1VSRSkKIAorI2RlZmluZSBNQVBfREVWSUNFMglNQVBfUkVHSU9OX0ZMQVQoREVWSUNFMl9CQVNFLAkJCVwKKwkJCQkJREVWSUNFMl9TSVpFLAkJCVwKKwkJCQkJTVRfREVWSUNFIHwgTVRfUk8gfCBNVF9TRUNVUkUpCisKKwogLyoKICAqIFRhYmxlIG9mIHJlZ2lvbnMgZm9yIHZhcmlvdXMgQkwgc3RhZ2VzIHRvIG1hcCB1c2luZyB0aGUgTU1VLgogICogVGhpcyBkb2Vzbid0IGluY2x1ZGUgVFpSQU0gYXMgdGhlICdtZW1fbGF5b3V0JyBhcmd1bWVudCBwYXNzZWQgdG8KQEAgLTY3LDYgKzcyLDcgQEAKIAlWMk1fTUFQX0lPRlBHQSwKIAlNQVBfREVWSUNFMCwKIAlNQVBfREVWSUNFMSwKKwlNQVBfREVWSUNFMiwKIAl7MH0KIH07CiAjZW5kaWYKQEAgLTc3LDYgKzgzLDcgQEAKIAlWMk1fTUFQX0lPRlBHQSwKIAlNQVBfREVWSUNFMCwKIAlNQVBfREVWSUNFMSwKKwlNQVBfREVWSUNFMiwKIAlBUk1fTUFQX05TX0RSQU0xLAogCUFSTV9NQVBfVFNQX1NFQ19NRU0sCiAJezB9CmRpZmYgLS1naXQgYS9wbGF0L2FybS9ib2FyZC9mdnAvZnZwX2JsMzFfc2V0dXAuYyBiL3BsYXQvYXJtL2JvYXJkL2Z2cC9mdnBfYmwzMV9zZXR1cC5jCmluZGV4IGI1MGFlNTUuLmYyOWFmNjQgMTAwNjQ0Ci0tLSBhL3BsYXQvYXJtL2JvYXJkL2Z2cC9mdnBfYmwzMV9zZXR1cC5jCisrKyBiL3BsYXQvYXJtL2JvYXJkL2Z2cC9mdnBfYmwzMV9zZXR1cC5jCkBAIC00NSwxMyArNDUsMTMgQEAKIAkgKiBObyBuZWVkIGZvciBsb2NrcyBhcyBubyBvdGhlciBDUFUgaXMgYWN0aXZlLgogCSAqLwogCWZ2cF9jY2lfaW5pdCgpOwotI2lmIFJFU0VUX1RPX0JMMzEKKwogCS8qCi0JICogRW5hYmxlIENDSSBjb2hlcmVuY3kgZm9yIHRoZSBwcmltYXJ5IENQVSdzIGNsdXN0ZXIKLQkgKiAoaWYgZWFybGllciBCTCBoYXMgbm90IGFscmVhZHkgZG9uZSBzbykuCisJICogRW5hYmxlIENDSSBjb2hlcmVuY3kgZm9yIHRoZSBwcmltYXJ5IENQVSdzIGNsdXN0ZXIuCisJICogRWFybGllciBib290bG9hZGVyIHN0YWdlcyBtaWdodCBhbHJlYWR5IGRvIHRoaXMgKGUuZy4gVHJ1c3RlZAorCSAqIEZpcm13YXJlJ3MgQkwxIGRvZXMgaXQpIGJ1dCB3ZSBjYW4ndCBhc3N1bWUgc28uIFRoZXJlIGlzIG5vIGhhcm0gaW4KKwkgKiBleGVjdXRpbmcgdGhpcyBjb2RlIHR3aWNlIGFueXdheS4KIAkgKiBGVlAgUFNDSSBjb2RlIHdpbGwgZW5hYmxlIGNvaGVyZW5jeSBmb3Igb3RoZXIgY2x1c3RlcnMuCiAJICovCiAJZnZwX2NjaV9lbmFibGUoKTsKLQotI2VuZGlmIC8qIFJFU0VUX1RPX0JMMzEgKi8KIH0KZGlmZiAtLWdpdCBhL3BsYXQvYXJtL2JvYXJkL2Z2cC9mdnBfZGVmLmggYi9wbGF0L2FybS9ib2FyZC9mdnAvZnZwX2RlZi5oCmluZGV4IDY4ZWYyOTcuLjg0MmEyODcgMTAwNjQ0Ci0tLSBhL3BsYXQvYXJtL2JvYXJkL2Z2cC9mdnBfZGVmLmgKKysrIGIvcGxhdC9hcm0vYm9hcmQvZnZwL2Z2cF9kZWYuaApAQCAtNTgsMTMgKzU4LDI1IEBACiAjZGVmaW5lIERFVklDRTFfQkFTRQkJCTB4MmYwMDAwMDAKICNkZWZpbmUgREVWSUNFMV9TSVpFCQkJMHgyMDAwMDAKIAorLyogRGV2aWNlcyBpbiB0aGUgc2Vjb25kIEdCICovCisjZGVmaW5lIERFVklDRTJfQkFTRQkJCTB4N2ZlMDAwMDAKKyNkZWZpbmUgREVWSUNFMl9TSVpFCQkJMHgwMDIwMDAwMAorCiAjZGVmaW5lIE5TUkFNX0JBU0UJCQkweDJlMDAwMDAwCiAjZGVmaW5lIE5TUkFNX1NJWkUJCQkweDEwMDAwCiAKICNkZWZpbmUgUENJRV9FWFBfQkFTRQkJCTB4NDAwMDAwMDAKICNkZWZpbmUgVFpSTkdfQkFTRQkJCTB4N2ZlNjAwMDAKICNkZWZpbmUgVFpOVkNUUl9CQVNFCQkJMHg3ZmU3MDAwMAotI2RlZmluZSBUWlJPT1RLRVlfQkFTRQkJCTB4N2ZlODAwMDAKKworLyogS2V5cyAqLworI2RlZmluZSBTT0NfS0VZU19CQVNFCQkJMHg3ZmU4MDAwMAorI2RlZmluZSBUWl9QVUJfS0VZX0hBU0hfQkFTRQkJKFNPQ19LRVlTX0JBU0UgKyAweDAwMDApCisjZGVmaW5lIFRaX1BVQl9LRVlfSEFTSF9TSVpFCQkzMgorI2RlZmluZSBIVV9LRVlfQkFTRQkJCShTT0NfS0VZU19CQVNFICsgMHgwMDIwKQorI2RlZmluZSBIVV9LRVlfU0laRQkJCTE2CisjZGVmaW5lIEVORF9LRVlfQkFTRQkJCShTT0NfS0VZU19CQVNFICsgMHgwMDQ0KQorI2RlZmluZSBFTkRfS0VZX1NJWkUJCQkzMgogCiAvKiBDb25zdGFudHMgdG8gZGlzdGluZ3Vpc2ggRlZQIHR5cGUgKi8KICNkZWZpbmUgSEJJX0JBU0VfRlZQCQkJMHgwMjAKZGlmZiAtLWdpdCBhL3BsYXQvYXJtL2JvYXJkL2Z2cC9mdnBfaW9fc3RvcmFnZS5jIGIvcGxhdC9hcm0vYm9hcmQvZnZwL2Z2cF9pb19zdG9yYWdlLmMKaW5kZXggMDI4NGMzZC4uZTlkODQ3ZiAxMDA2NDQKLS0tIGEvcGxhdC9hcm0vYm9hcmQvZnZwL2Z2cF9pb19zdG9yYWdlLmMKKysrIGIvcGxhdC9hcm0vYm9hcmQvZnZwL2Z2cF9pb19zdG9yYWdlLmMKQEAgLTI5LDE2ICsyOSw4OCBAQAogICovCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjb21tb25fZGVmLmg+CiAjaW5jbHVkZSA8ZGVidWcuaD4KICNpbmNsdWRlIDxpb19kcml2ZXIuaD4KICNpbmNsdWRlIDxpb19zdG9yYWdlLmg+CiAjaW5jbHVkZSA8aW9fc2VtaWhvc3RpbmcuaD4KICNpbmNsdWRlIDxwbGF0X2FybS5oPgorI2luY2x1ZGUgPHNlbWlob3N0aW5nLmg+CS8qIEZvciBGT1BFTl9NT0RFXy4uLiAqLworCisvKiBTZW1paG9zdGluZyBmaWxlbmFtZXMgKi8KKyNkZWZpbmUgQkwyX0lNQUdFX05BTUUJCQkiYmwyLmJpbiIKKyNkZWZpbmUgQkwzMV9JTUFHRV9OQU1FCQkJImJsMzEuYmluIgorI2RlZmluZSBCTDMyX0lNQUdFX05BTUUJCQkiYmwzMi5iaW4iCisjZGVmaW5lIEJMMzNfSU1BR0VfTkFNRQkJCSJibDMzLmJpbiIKKworI2lmIFRSVVNURURfQk9BUkRfQk9PVAorI2RlZmluZSBCTDJfQ0VSVF9OQU1FCQkJImJsMi5jcnQiCisjZGVmaW5lIFRSVVNURURfS0VZX0NFUlRfTkFNRQkJInRydXN0ZWRfa2V5LmNydCIKKyNkZWZpbmUgQkwzMV9LRVlfQ0VSVF9OQU1FCQkiYmwzMV9rZXkuY3J0IgorI2RlZmluZSBCTDMyX0tFWV9DRVJUX05BTUUJCSJibDMyX2tleS5jcnQiCisjZGVmaW5lIEJMMzNfS0VZX0NFUlRfTkFNRQkJImJsMzNfa2V5LmNydCIKKyNkZWZpbmUgQkwzMV9DRVJUX05BTUUJCQkiYmwzMS5jcnQiCisjZGVmaW5lIEJMMzJfQ0VSVF9OQU1FCQkJImJsMzIuY3J0IgorI2RlZmluZSBCTDMzX0NFUlRfTkFNRQkJCSJibDMzLmNydCIKKyNlbmRpZiAvKiBUUlVTVEVEX0JPQVJEX0JPT1QgKi8KIAogLyogSU8gZGV2aWNlcyAqLwogc3RhdGljIGNvbnN0IGlvX2Rldl9jb25uZWN0b3JfdCAqc2hfZGV2X2NvbjsKIHN0YXRpYyB1aW50cHRyX3Qgc2hfZGV2X2hhbmRsZTsKIAorc3RhdGljIGNvbnN0IGlvX2ZpbGVfc3BlY190IHNoX2ZpbGVfc3BlY1tdID0geworCVtCTDJfSU1BR0VfSURdID0geworCQkucGF0aCA9IEJMMl9JTUFHRV9OQU1FLAorCQkubW9kZSA9IEZPUEVOX01PREVfUkIKKwl9LAorCVtCTDMxX0lNQUdFX0lEXSA9IHsKKwkJLnBhdGggPSBCTDMxX0lNQUdFX05BTUUsCisJCS5tb2RlID0gRk9QRU5fTU9ERV9SQgorCX0sCisJW0JMMzJfSU1BR0VfSURdID0geworCQkucGF0aCA9IEJMMzJfSU1BR0VfTkFNRSwKKwkJLm1vZGUgPSBGT1BFTl9NT0RFX1JCCisJfSwKKwlbQkwzM19JTUFHRV9JRF0gPSB7CisJCS5wYXRoID0gQkwzM19JTUFHRV9OQU1FLAorCQkubW9kZSA9IEZPUEVOX01PREVfUkIKKwl9LAorI2lmIFRSVVNURURfQk9BUkRfQk9PVAorCVtCTDJfQ0VSVF9JRF0gPSB7CisJCS5wYXRoID0gQkwyX0NFUlRfTkFNRSwKKwkJLm1vZGUgPSBGT1BFTl9NT0RFX1JCCisJfSwKKwlbVFJVU1RFRF9LRVlfQ0VSVF9JRF0gPSB7CisJCS5wYXRoID0gVFJVU1RFRF9LRVlfQ0VSVF9OQU1FLAorCQkubW9kZSA9IEZPUEVOX01PREVfUkIKKwl9LAorCVtCTDMxX0tFWV9DRVJUX0lEXSA9IHsKKwkJLnBhdGggPSBCTDMxX0tFWV9DRVJUX05BTUUsCisJCS5tb2RlID0gRk9QRU5fTU9ERV9SQgorCX0sCisJW0JMMzJfS0VZX0NFUlRfSURdID0geworCQkucGF0aCA9IEJMMzJfS0VZX0NFUlRfTkFNRSwKKwkJLm1vZGUgPSBGT1BFTl9NT0RFX1JCCisJfSwKKwlbQkwzM19LRVlfQ0VSVF9JRF0gPSB7CisJCS5wYXRoID0gQkwzM19LRVlfQ0VSVF9OQU1FLAorCQkubW9kZSA9IEZPUEVOX01PREVfUkIKKwl9LAorCVtCTDMxX0NFUlRfSURdID0geworCQkucGF0aCA9IEJMMzFfQ0VSVF9OQU1FLAorCQkubW9kZSA9IEZPUEVOX01PREVfUkIKKwl9LAorCVtCTDMyX0NFUlRfSURdID0geworCQkucGF0aCA9IEJMMzJfQ0VSVF9OQU1FLAorCQkubW9kZSA9IEZPUEVOX01PREVfUkIKKwl9LAorCVtCTDMzX0NFUlRfSURdID0geworCQkucGF0aCA9IEJMMzNfQ0VSVF9OQU1FLAorCQkubW9kZSA9IEZPUEVOX01PREVfUkIKKwl9LAorI2VuZGlmIC8qIFRSVVNURURfQk9BUkRfQk9PVCAqLworfTsKKwogCiBzdGF0aWMgaW50IG9wZW5fc2VtaWhvc3RpbmcoY29uc3QgdWludHB0cl90IHNwZWMpCiB7CkBAIC03NSwxMyArMTQ3LDE3IEBACiAJKHZvaWQpaW9fcmVzdWx0OwogfQogCi1pbnQgcGxhdF9hcm1fZ2V0X2FsdF9pbWFnZV9zb3VyY2UoCi0JY29uc3QgdWludHB0cl90IGltYWdlX3NwZWMsCi0JdWludHB0cl90ICpkZXZfaGFuZGxlKQorLyoKKyAqIEZWUCBwcm92aWRlcyBzZW1paG9zdGluZyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBsb2FkIGltYWdlcworICovCitpbnQgcGxhdF9hcm1fZ2V0X2FsdF9pbWFnZV9zb3VyY2UodW5zaWduZWQgaW50IGltYWdlX2lkLCB1aW50cHRyX3QgKmRldl9oYW5kbGUsCisJCQkJICB1aW50cHRyX3QgKmltYWdlX3NwZWMpCiB7Ci0JaW50IHJlc3VsdCA9IG9wZW5fc2VtaWhvc3RpbmcoaW1hZ2Vfc3BlYyk7Ci0JaWYgKHJlc3VsdCA9PSBJT19TVUNDRVNTKQorCWludCByZXN1bHQgPSBvcGVuX3NlbWlob3N0aW5nKChjb25zdCB1aW50cHRyX3QpJnNoX2ZpbGVfc3BlY1tpbWFnZV9pZF0pOworCWlmIChyZXN1bHQgPT0gSU9fU1VDQ0VTUykgewogCQkqZGV2X2hhbmRsZSA9IHNoX2Rldl9oYW5kbGU7CisJCSppbWFnZV9zcGVjID0gKHVpbnRwdHJfdCkmc2hfZmlsZV9zcGVjW2ltYWdlX2lkXTsKKwl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvcGxhdC9hcm0vYm9hcmQvZnZwL3BsYXRmb3JtLm1rIGIvcGxhdC9hcm0vYm9hcmQvZnZwL3BsYXRmb3JtLm1rCmluZGV4IDk0OWU2YWQuLmExYTA5NzEgMTAwNjQ0Ci0tLSBhL3BsYXQvYXJtL2JvYXJkL2Z2cC9wbGF0Zm9ybS5taworKysgYi9wbGF0L2FybS9ib2FyZC9mdnAvcGxhdGZvcm0ubWsKQEAgLTI5LDEyICsyOSwxMCBAQAogIwogCiAKLVBMQVRfSU5DTFVERVMJCTo9CS1JaW5jbHVkZS9wbGF0L2FybS9ib2FyZC9jb21tb24JCQlcCi0JCQkJLUlwbGF0L2FybS9ib2FyZC9mdnAvaW5jbHVkZQorUExBVF9JTkNMVURFUwkJOj0JLUlwbGF0L2FybS9ib2FyZC9mdnAvaW5jbHVkZQogCiAKLVBMQVRfQkxfQ09NTU9OX1NPVVJDRVMJOj0JZHJpdmVycy9hcm0vcGwwMTEvcGwwMTFfY29uc29sZS5TCQlcCi0JCQkJcGxhdC9hcm0vYm9hcmQvZnZwL2FhcmNoNjQvZnZwX2NvbW1vbi5jCitQTEFUX0JMX0NPTU1PTl9TT1VSQ0VTCTo9CXBsYXQvYXJtL2JvYXJkL2Z2cC9hYXJjaDY0L2Z2cF9jb21tb24uYwogCiBCTDFfU09VUkNFUwkJKz0JZHJpdmVycy9pby9pb19zZW1paG9zdGluZy5jCQkJXAogCQkJCWxpYi9jcHVzL2FhcmNoNjQvYWVtX2dlbmVyaWMuUwkJCVwKQEAgLTY1LDEwICs2Myw1IEBACiAJCQkJcGxhdC9hcm0vYm9hcmQvZnZwL2FhcmNoNjQvZnZwX2hlbHBlcnMuUwlcCiAJCQkJcGxhdC9hcm0vYm9hcmQvZnZwL2RyaXZlcnMvcHdyYy9mdnBfcHdyYy5jCiAKLWlmbmVxICgke1RSVVNURURfQk9BUkRfQk9PVH0sMCkKLSAgQkwxX1NPVVJDRVMJCSs9CXBsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fdHJ1c3RlZF9ib290LmMKLSAgQkwyX1NPVVJDRVMJCSs9CXBsYXQvYXJtL2JvYXJkL2NvbW1vbi9ib2FyZF9hcm1fdHJ1c3RlZF9ib290LmMKLWVuZGlmCi0KLQoraW5jbHVkZSBwbGF0L2FybS9ib2FyZC9jb21tb24vYm9hcmRfY29tbW9uLm1rCiBpbmNsdWRlIHBsYXQvYXJtL2NvbW1vbi9hcm1fY29tbW9uLm1rCmRpZmYgLS1naXQgYS9wbGF0L2FybS9ib2FyZC9qdW5vL2FhcmNoNjQvanVub19oZWxwZXJzLlMgYi9wbGF0L2FybS9ib2FyZC9qdW5vL2FhcmNoNjQvanVub19oZWxwZXJzLlMKaW5kZXggNmQzMTg0Ny4uY2U0MWJhZSAxMDA2NDQKLS0tIGEvcGxhdC9hcm0vYm9hcmQvanVuby9hYXJjaDY0L2p1bm9faGVscGVycy5TCisrKyBiL3BsYXQvYXJtL2JvYXJkL2p1bm8vYWFyY2g2NC9qdW5vX2hlbHBlcnMuUwpAQCAtNDIsMTAgKzQyLDYgQEAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqIHZvaWQgcGxhdF9yZXNldF9oYW5kbGVyKHZvaWQpOwogCSAqCi0JICogQmVmb3JlIGFkZGluZyBjb2RlIGluIHRoaXMgZnVuY3Rpb24sIHJlZmVyIHRvIHRoZSBndWlkZWxpbmVzIGluCi0JICogZG9jcy9maXJtd2FyZS1kZXNpZ24ubWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvZGUgc2hvdWxkIHJlc2lkZQotCSAqIHdpdGhpbiB0aGUgRklSU1RfUkVTRVRfSEFORExFUl9DQUxMIGJsb2NrIG9yIG5vdC4KLQkgKgogCSAqIEZvciBKdW5vIHIwOgogCSAqIC0gSW1wbGVtZW50IHdvcmthcm91bmQgZm9yIGRlZmVjdCBpZCA4MzEyNzMgYnkgZW5hYmxpbmcgYW4gZXZlbnQKIAkgKiAgIHN0cmVhbSBldmVyeSA2NTUzNiBjeWNsZXMuCkBAIC01OCwxMyArNTQsOSBAQAogCSAqIC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBMMiBUYWcgUkFNIGxhdGVuY3kgZm9yIENvcnRleC1BNTcgaXMKIAkgKiAgIHN1aXRhYmxlLgogCSAqIC0gRGVmZWN0ICM4MzEyNzMgZG9lc24ndCBhZmZlY3QgSnVubyByMS4KLQkgKgotCSAqIFRoaXMgY29kZSBpcyBpbmNsdWRlZCBvbmx5IHdoZW4gRklSU1RfUkVTRVRfSEFORExFUl9DQUxMIGlzIGRlZmluZWQKLQkgKiBzaW5jZSBpdCBzaG91bGQgYmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgQkwxLgogCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICovCiBmdW5jIHBsYXRfcmVzZXRfaGFuZGxlcgotI2lmZGVmIEZJUlNUX1JFU0VUX0hBTkRMRVJfQ0FMTAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjb2RlIGlzIHJ1bm5pbmcgb24gSnVubyByMCBvciBKdW5vIHIxLgogCSAqIEtlZXAgdGhpcyBpbmZvcm1hdGlvbiBpbiB4Mi4KQEAgLTEyMyw2ICsxMTUsNSBAQAogCW1zciAgICAgQ05US0NUTF9FTDEsIHgwCiByZXQ6CiAJaXNiCi0jZW5kaWYgLyogRklSU1RfUkVTRVRfSEFORExFUl9DQUxMICovCiAJcmV0CiBlbmRmdW5jIHBsYXRfcmVzZXRfaGFuZGxlcgpkaWZmIC0tZ2l0IGEvcGxhdC9hcm0vYm9hcmQvanVuby9wbGF0Zm9ybS5tayBiL3BsYXQvYXJtL2JvYXJkL2p1bm8vcGxhdGZvcm0ubWsKaW5kZXggZDhkNGYxNC4uOTg4MzRlNyAxMDA2NDQKLS0tIGEvcGxhdC9hcm0vYm9hcmQvanVuby9wbGF0Zm9ybS5taworKysgYi9wbGF0L2FybS9ib2FyZC9qdW5vL3BsYXRmb3JtLm1rCkBAIC00MCw3ICs0MCw2IEBACiBCTDMxX1NPVVJDRVMJCSs9CWxpYi9jcHVzL2FhcmNoNjQvY29ydGV4X2E1My5TCQlcCiAJCQkJbGliL2NwdXMvYWFyY2g2NC9jb3J0ZXhfYTU3LlMKIAotCiAjIEVuYWJsZSB3b3JrYXJvdW5kcyBmb3Igc2VsZWN0ZWQgQ29ydGV4LUE1NyBlcnJhdGFzLgogRVJSQVRBX0E1N184MDY5NjkJOj0JMAogRVJSQVRBX0E1N184MTM0MjAJOj0JMQpAQCAtNTMsMyArNTIsNyBAQAogaW5jbHVkZSBwbGF0L2FybS9jb21tb24vYXJtX2NvbW1vbi5tawogaW5jbHVkZSBwbGF0L2FybS9zb2MvY29tbW9uL3NvY19jc3MubWsKIGluY2x1ZGUgcGxhdC9hcm0vY3NzL2NvbW1vbi9jc3NfY29tbW9uLm1rCisKK2lmZXEgKCR7S0VZX0FMR30sZWNkc2EpCisgICAgJChlcnJvciAiRUNEU0Ega2V5IGFsZ29yaXRobSBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIG9uIEp1bm8uIikKK2VuZGlmCmRpZmYgLS1naXQgYS9wbGF0L2FybS9jb21tb24vYXJtX2JsMzFfc2V0dXAuYyBiL3BsYXQvYXJtL2NvbW1vbi9hcm1fYmwzMV9zZXR1cC5jCmluZGV4IDVjMzIxZmEuLjdlODg1NmIgMTAwNjQ0Ci0tLSBhL3BsYXQvYXJtL2NvbW1vbi9hcm1fYmwzMV9zZXR1cC5jCisrKyBiL3BsYXQvYXJtL2NvbW1vbi9hcm1fYmwzMV9zZXR1cC5jCkBAIC0xNzksMTYgKzE3OSwxNiBAQAogCSAqIE5vIG5lZWQgZm9yIGxvY2tzIGFzIG5vIG90aGVyIENQVSBpcyBhY3RpdmUuCiAJICovCiAJYXJtX2NjaV9pbml0KCk7Ci0jaWYgUkVTRVRfVE9fQkwzMQorCiAJLyoKLQkgKiBFbmFibGUgQ0NJIGNvaGVyZW5jeSBmb3IgdGhlIHByaW1hcnkgQ1BVJ3MgY2x1c3RlcgotCSAqIChpZiBlYXJsaWVyIEJMIGhhcyBub3QgYWxyZWFkeSBkb25lIHNvKS4KKwkgKiBFbmFibGUgQ0NJIGNvaGVyZW5jeSBmb3IgdGhlIHByaW1hcnkgQ1BVJ3MgY2x1c3Rlci4KKwkgKiBFYXJsaWVyIGJvb3Rsb2FkZXIgc3RhZ2VzIG1pZ2h0IGFscmVhZHkgZG8gdGhpcyAoZS5nLiBUcnVzdGVkCisJICogRmlybXdhcmUncyBCTDEgZG9lcyBpdCkgYnV0IHdlIGNhbid0IGFzc3VtZSBzby4gVGhlcmUgaXMgbm8gaGFybSBpbgorCSAqIGV4ZWN1dGluZyB0aGlzIGNvZGUgdHdpY2UgYW55d2F5LgogCSAqIFBsYXRmb3JtIHNwZWNpZmljIFBTQ0kgY29kZSB3aWxsIGVuYWJsZSBjb2hlcmVuY3kgZm9yIG90aGVyCiAJICogY2x1c3RlcnMuCiAJICovCiAJY2NpX2VuYWJsZV9zbm9vcF9kdm1fcmVxcyhNUElEUl9BRkZMVkwxX1ZBTChyZWFkX21waWRyKCkpKTsKLQotI2VuZGlmIC8qIFJFU0VUX1RPX0JMMzEgKi8KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL3BsYXQvYXJtL2NvbW1vbi9hcm1fY29tbW9uLm1rIGIvcGxhdC9hcm0vY29tbW9uL2FybV9jb21tb24ubWsKaW5kZXggM2I3YzA1Ny4uYmNjMzgzMyAxMDA2NDQKLS0tIGEvcGxhdC9hcm0vY29tbW9uL2FybV9jb21tb24ubWsKKysrIGIvcGxhdC9hcm0vY29tbW9uL2FybV9jb21tb24ubWsKQEAgLTQ2LDcgKzQ2LDggQEAKICMgUHJvY2VzcyBmbGFncwogJChldmFsICQoY2FsbCBhZGRfZGVmaW5lLEFSTV9UU1BfUkFNX0xPQ0FUSU9OX0lEKSkKIAotUExBVF9JTkNMVURFUwkJKz0JLUlpbmNsdWRlL3BsYXQvYXJtL2NvbW1vbgkJCVwKK1BMQVRfSU5DTFVERVMJCSs9CS1JaW5jbHVkZS9jb21tb24vdGJicgkJCQlcCisJCQkJLUlpbmNsdWRlL3BsYXQvYXJtL2NvbW1vbgkJCVwKIAkJCQktSWluY2x1ZGUvcGxhdC9hcm0vY29tbW9uL2FhcmNoNjQKIAogCkBAIC04MywzICs4NCwzMSBAQAogCQkJCXBsYXQvYXJtL2NvbW1vbi9hcm1fdG9wb2xvZ3kuYwkJCVwKIAkJCQlwbGF0L2NvbW1vbi9wbGF0X2dpYy5jCQkJCVwKIAkJCQlwbGF0L2NvbW1vbi9hYXJjaDY0L3BsYXRmb3JtX21wX3N0YWNrLlMKKworaWZuZXEgKCR7VFJVU1RFRF9CT0FSRF9CT09UfSwwKQorCisgICAgIyBCeSBkZWZhdWx0LCBBUk0gcGxhdGZvcm1zIHVzZSBSU0Ega2V5cworICAgIEtFWV9BTEcJCTo9CXJzYQorCisgICAgIyBJbmNsdWRlIGNvbW1vbiBUQkIgc291cmNlcworICAgIEFVVEhfU09VUkNFUwk6PQlkcml2ZXJzL2F1dGgvYXV0aF9tb2QuYwkJCQlcCisgICAgCQkJCWRyaXZlcnMvYXV0aC9jcnlwdG9fbW9kLmMJCQlcCisgICAgCQkJCWRyaXZlcnMvYXV0aC9pbWdfcGFyc2VyX21vZC5jCQkJXAorICAgIAkJCQlkcml2ZXJzL2F1dGgvdGJici90YmJyX2NvdC5jCQkJXAorCisgICAgQkwxX1NPVVJDRVMJCSs9CSR7QVVUSF9TT1VSQ0VTfQorICAgIEJMMl9TT1VSQ0VTCQkrPQkke0FVVEhfU09VUkNFU30KKworICAgIE1CRURUTFNfS0VZX0FMRwk6PQkke0tFWV9BTEd9CisKKyAgICAjIFdlIGV4cGVjdCB0byBsb2NhdGUgdGhlICoubWsgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBiZWxvdworICAgIENSWVBUT19MSUJfTUsgOj0gZHJpdmVycy9hdXRoL21iZWR0bHMvbWJlZHRsc19jcnlwdG8ubWsKKyAgICBJTUdfUEFSU0VSX0xJQl9NSyA6PSBkcml2ZXJzL2F1dGgvbWJlZHRscy9tYmVkdGxzX3g1MDkubWsKKworICAgICQoaW5mbyBJbmNsdWRpbmcgJHtDUllQVE9fTElCX01LfSkKKyAgICBpbmNsdWRlICR7Q1JZUFRPX0xJQl9NS30KKworICAgICQoaW5mbyBJbmNsdWRpbmcgJHtJTUdfUEFSU0VSX0xJQl9NS30pCisgICAgaW5jbHVkZSAke0lNR19QQVJTRVJfTElCX01LfQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvcGxhdC9hcm0vY29tbW9uL2FybV9pb19zdG9yYWdlLmMgYi9wbGF0L2FybS9jb21tb24vYXJtX2lvX3N0b3JhZ2UuYwppbmRleCBlYTI5MzEzLi44NDg4ZjEyIDEwMDY0NAotLS0gYS9wbGF0L2FybS9jb21tb24vYXJtX2lvX3N0b3JhZ2UuYworKysgYi9wbGF0L2FybS9jb21tb24vYXJtX2lvX3N0b3JhZ2UuYwpAQCAtMjgsMTMgKzI4LDE0IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGJsX2NvbW1vbi5oPgkJLyogRm9yIEFSUkFZX1NJWkUgKi8KICNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGZpcm13YXJlX2ltYWdlX3BhY2thZ2UuaD4KICNpbmNsdWRlIDxpb19kcml2ZXIuaD4KICNpbmNsdWRlIDxpb19maXAuaD4KICNpbmNsdWRlIDxpb19tZW1tYXAuaD4KICNpbmNsdWRlIDxpb19zdG9yYWdlLmg+CiAjaW5jbHVkZSA8cGxhdGZvcm1fZGVmLmg+Ci0jaW5jbHVkZSA8c2VtaWhvc3RpbmcuaD4JLyogRm9yIEZPUEVOX01PREVfLi4uICovCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKIC8qIElPIGRldmljZXMgKi8KQEAgLTQ4LDE3OSArNDksMTYyIEBACiAJLmxlbmd0aCA9IFBMQVRfQVJNX0ZJUF9NQVhfU0laRQogfTsKIAotc3RhdGljIGNvbnN0IGlvX2ZpbGVfc3BlY190IGJsMl9maWxlX3NwZWMgPSB7Ci0JLnBhdGggPSBCTDJfSU1BR0VfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDJfdXVpZF9zcGVjID0geworCS51dWlkID0gVVVJRF9UUlVTVEVEX0JPT1RfRklSTVdBUkVfQkwyLAogfTsKIAotc3RhdGljIGNvbnN0IGlvX2ZpbGVfc3BlY190IGJsMzBfZmlsZV9zcGVjID0gewotCS5wYXRoID0gQkwzMF9JTUFHRV9OQU1FLAotCS5tb2RlID0gRk9QRU5fTU9ERV9SQgorc3RhdGljIGNvbnN0IGlvX3V1aWRfc3BlY190IGJsMzBfdXVpZF9zcGVjID0geworCS51dWlkID0gVVVJRF9TQ1BfRklSTVdBUkVfQkwzMCwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMxX2ZpbGVfc3BlYyA9IHsKLQkucGF0aCA9IEJMMzFfSU1BR0VfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDMxX3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfRUwzX1JVTlRJTUVfRklSTVdBUkVfQkwzMSwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMyX2ZpbGVfc3BlYyA9IHsKLQkucGF0aCA9IEJMMzJfSU1BR0VfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDMyX3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfU0VDVVJFX1BBWUxPQURfQkwzMiwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMzX2ZpbGVfc3BlYyA9IHsKLQkucGF0aCA9IEJMMzNfSU1BR0VfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDMzX3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfTk9OX1RSVVNURURfRklSTVdBUkVfQkwzMywKIH07CiAKICNpZiBUUlVTVEVEX0JPQVJEX0JPT1QKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDJfY2VydF9maWxlX3NwZWMgPSB7Ci0JLnBhdGggPSBCTDJfQ0VSVF9OQU1FLAotCS5tb2RlID0gRk9QRU5fTU9ERV9SQgorc3RhdGljIGNvbnN0IGlvX3V1aWRfc3BlY190IGJsMl9jZXJ0X3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfVFJVU1RFRF9CT09UX0ZJUk1XQVJFX0JMMl9DRVJULAogfTsKIAotc3RhdGljIGNvbnN0IGlvX2ZpbGVfc3BlY190IHRydXN0ZWRfa2V5X2NlcnRfZmlsZV9zcGVjID0gewotCS5wYXRoID0gVFJVU1RFRF9LRVlfQ0VSVF9OQU1FLAotCS5tb2RlID0gRk9QRU5fTU9ERV9SQgorc3RhdGljIGNvbnN0IGlvX3V1aWRfc3BlY190IHRydXN0ZWRfa2V5X2NlcnRfdXVpZF9zcGVjID0geworCS51dWlkID0gVVVJRF9UUlVTVEVEX0tFWV9DRVJULAogfTsKIAotc3RhdGljIGNvbnN0IGlvX2ZpbGVfc3BlY190IGJsMzBfa2V5X2NlcnRfZmlsZV9zcGVjID0gewotCS5wYXRoID0gQkwzMF9LRVlfQ0VSVF9OQU1FLAotCS5tb2RlID0gRk9QRU5fTU9ERV9SQgorc3RhdGljIGNvbnN0IGlvX3V1aWRfc3BlY190IGJsMzBfa2V5X2NlcnRfdXVpZF9zcGVjID0geworCS51dWlkID0gVVVJRF9TQ1BfRklSTVdBUkVfQkwzMF9LRVlfQ0VSVCwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMxX2tleV9jZXJ0X2ZpbGVfc3BlYyA9IHsKLQkucGF0aCA9IEJMMzFfS0VZX0NFUlRfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDMxX2tleV9jZXJ0X3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfRUwzX1JVTlRJTUVfRklSTVdBUkVfQkwzMV9LRVlfQ0VSVCwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMyX2tleV9jZXJ0X2ZpbGVfc3BlYyA9IHsKLQkucGF0aCA9IEJMMzJfS0VZX0NFUlRfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDMyX2tleV9jZXJ0X3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfU0VDVVJFX1BBWUxPQURfQkwzMl9LRVlfQ0VSVCwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMzX2tleV9jZXJ0X2ZpbGVfc3BlYyA9IHsKLQkucGF0aCA9IEJMMzNfS0VZX0NFUlRfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDMzX2tleV9jZXJ0X3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfTk9OX1RSVVNURURfRklSTVdBUkVfQkwzM19LRVlfQ0VSVCwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMwX2NlcnRfZmlsZV9zcGVjID0gewotCS5wYXRoID0gQkwzMF9DRVJUX05BTUUsCi0JLm1vZGUgPSBGT1BFTl9NT0RFX1JCCitzdGF0aWMgY29uc3QgaW9fdXVpZF9zcGVjX3QgYmwzMF9jZXJ0X3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfU0NQX0ZJUk1XQVJFX0JMMzBfQ0VSVCwKIH07CiAKLXN0YXRpYyBjb25zdCBpb19maWxlX3NwZWNfdCBibDMxX2NlcnRfZmlsZV9zcGVjID0gewotCS5wYXRoID0gQkwzMV9DRVJUX05BTUUsCi0JLm1vZGUgPSBGT1BFTl9NT0RFX1JCCitzdGF0aWMgY29uc3QgaW9fdXVpZF9zcGVjX3QgYmwzMV9jZXJ0X3V1aWRfc3BlYyA9IHsKKwkudXVpZCA9IFVVSURfRUwzX1JVTlRJTUVfRklSTVdBUkVfQkwzMV9DRVJULAogfTsKIAotc3RhdGljIGNvbnN0IGlvX2ZpbGVfc3BlY190IGJsMzJfY2VydF9maWxlX3NwZWMgPSB7Ci0JLnBhdGggPSBCTDMyX0NFUlRfTkFNRSwKLQkubW9kZSA9IEZPUEVOX01PREVfUkIKK3N0YXRpYyBjb25zdCBpb191dWlkX3NwZWNfdCBibDMyX2NlcnRfdXVpZF9zcGVjID0geworCS51dWlkID0gVVVJRF9TRUNVUkVfUEFZTE9BRF9CTDMyX0NFUlQsCiB9OwogCi1zdGF0aWMgY29uc3QgaW9fZmlsZV9zcGVjX3QgYmwzM19jZXJ0X2ZpbGVfc3BlYyA9IHsKLQkucGF0aCA9IEJMMzNfQ0VSVF9OQU1FLAotCS5tb2RlID0gRk9QRU5fTU9ERV9SQgorc3RhdGljIGNvbnN0IGlvX3V1aWRfc3BlY190IGJsMzNfY2VydF91dWlkX3NwZWMgPSB7CisJLnV1aWQgPSBVVUlEX05PTl9UUlVTVEVEX0ZJUk1XQVJFX0JMMzNfQ0VSVCwKIH07CiAjZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCiAKKwogc3RhdGljIGludCBvcGVuX2ZpcChjb25zdCB1aW50cHRyX3Qgc3BlYyk7CiBzdGF0aWMgaW50IG9wZW5fbWVtbWFwKGNvbnN0IHVpbnRwdHJfdCBzcGVjKTsKIAogc3RydWN0IHBsYXRfaW9fcG9saWN5IHsKLQljb25zdCBjaGFyICppbWFnZV9uYW1lOwogCXVpbnRwdHJfdCAqZGV2X2hhbmRsZTsKIAl1aW50cHRyX3QgaW1hZ2Vfc3BlYzsKIAlpbnQgKCpjaGVjaykoY29uc3QgdWludHB0cl90IHNwZWMpOwogfTsKIAorLyogQnkgZGVmYXVsdCwgQVJNIHBsYXRmb3JtcyBsb2FkIGltYWdlcyBmcm9tIHRoZSBGSVAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdF9pb19wb2xpY3kgcG9saWNpZXNbXSA9IHsKLQl7Ci0JCUZJUF9JTUFHRV9OQU1FLAorCVtGSVBfSU1BR0VfSURdID0gewogCQkmbWVtbWFwX2Rldl9oYW5kbGUsCiAJCSh1aW50cHRyX3QpJmZpcF9ibG9ja19zcGVjLAogCQlvcGVuX21lbW1hcAotCX0sIHsKLQkJQkwyX0lNQUdFX05BTUUsCisJfSwKKwlbQkwyX0lNQUdFX0lEXSA9IHsKIAkJJmZpcF9kZXZfaGFuZGxlLAotCQkodWludHB0cl90KSZibDJfZmlsZV9zcGVjLAorCQkodWludHB0cl90KSZibDJfdXVpZF9zcGVjLAogCQlvcGVuX2ZpcAotCX0sIHsKLQkJQkwzMF9JTUFHRV9OQU1FLAorCX0sCisJW0JMMzBfSU1BR0VfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMzBfZmlsZV9zcGVjLAorCQkodWludHB0cl90KSZibDMwX3V1aWRfc3BlYywKIAkJb3Blbl9maXAKLQl9LCB7Ci0JCUJMMzFfSU1BR0VfTkFNRSwKKwl9LAorCVtCTDMxX0lNQUdFX0lEXSA9IHsKIAkJJmZpcF9kZXZfaGFuZGxlLAotCQkodWludHB0cl90KSZibDMxX2ZpbGVfc3BlYywKKwkJKHVpbnRwdHJfdCkmYmwzMV91dWlkX3NwZWMsCiAJCW9wZW5fZmlwCi0JfSwgewotCQlCTDMyX0lNQUdFX05BTUUsCisJfSwKKwlbQkwzMl9JTUFHRV9JRF0gPSB7CiAJCSZmaXBfZGV2X2hhbmRsZSwKLQkJKHVpbnRwdHJfdCkmYmwzMl9maWxlX3NwZWMsCisJCSh1aW50cHRyX3QpJmJsMzJfdXVpZF9zcGVjLAogCQlvcGVuX2ZpcAotCX0sIHsKLQkJQkwzM19JTUFHRV9OQU1FLAorCX0sCisJW0JMMzNfSU1BR0VfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMzNfZmlsZV9zcGVjLAorCQkodWludHB0cl90KSZibDMzX3V1aWRfc3BlYywKIAkJb3Blbl9maXAKLQl9LCB7CisJfSwKICNpZiBUUlVTVEVEX0JPQVJEX0JPT1QKLQkJQkwyX0NFUlRfTkFNRSwKKwlbQkwyX0NFUlRfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMl9jZXJ0X2ZpbGVfc3BlYywKKwkJKHVpbnRwdHJfdCkmYmwyX2NlcnRfdXVpZF9zcGVjLAogCQlvcGVuX2ZpcAotCX0sIHsKLQkJVFJVU1RFRF9LRVlfQ0VSVF9OQU1FLAorCX0sCisJW1RSVVNURURfS0VZX0NFUlRfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJnRydXN0ZWRfa2V5X2NlcnRfZmlsZV9zcGVjLAorCQkodWludHB0cl90KSZ0cnVzdGVkX2tleV9jZXJ0X3V1aWRfc3BlYywKIAkJb3Blbl9maXAKLQl9LCB7Ci0JCUJMMzBfS0VZX0NFUlRfTkFNRSwKKwl9LAorCVtCTDMwX0tFWV9DRVJUX0lEXSA9IHsKIAkJJmZpcF9kZXZfaGFuZGxlLAotCQkodWludHB0cl90KSZibDMwX2tleV9jZXJ0X2ZpbGVfc3BlYywKKwkJKHVpbnRwdHJfdCkmYmwzMF9rZXlfY2VydF91dWlkX3NwZWMsCiAJCW9wZW5fZmlwCi0JfSwgewotCQlCTDMxX0tFWV9DRVJUX05BTUUsCisJfSwKKwlbQkwzMV9LRVlfQ0VSVF9JRF0gPSB7CiAJCSZmaXBfZGV2X2hhbmRsZSwKLQkJKHVpbnRwdHJfdCkmYmwzMV9rZXlfY2VydF9maWxlX3NwZWMsCisJCSh1aW50cHRyX3QpJmJsMzFfa2V5X2NlcnRfdXVpZF9zcGVjLAogCQlvcGVuX2ZpcAotCX0sIHsKLQkJQkwzMl9LRVlfQ0VSVF9OQU1FLAorCX0sCisJW0JMMzJfS0VZX0NFUlRfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMzJfa2V5X2NlcnRfZmlsZV9zcGVjLAorCQkodWludHB0cl90KSZibDMyX2tleV9jZXJ0X3V1aWRfc3BlYywKIAkJb3Blbl9maXAKLQl9LCB7Ci0JCUJMMzNfS0VZX0NFUlRfTkFNRSwKKwl9LAorCVtCTDMzX0tFWV9DRVJUX0lEXSA9IHsKIAkJJmZpcF9kZXZfaGFuZGxlLAotCQkodWludHB0cl90KSZibDMzX2tleV9jZXJ0X2ZpbGVfc3BlYywKKwkJKHVpbnRwdHJfdCkmYmwzM19rZXlfY2VydF91dWlkX3NwZWMsCiAJCW9wZW5fZmlwCi0JfSwgewotCQlCTDMwX0NFUlRfTkFNRSwKKwl9LAorCVtCTDMwX0NFUlRfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMzBfY2VydF9maWxlX3NwZWMsCisJCSh1aW50cHRyX3QpJmJsMzBfY2VydF91dWlkX3NwZWMsCiAJCW9wZW5fZmlwCi0JfSwgewotCQlCTDMxX0NFUlRfTkFNRSwKKwl9LAorCVtCTDMxX0NFUlRfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMzFfY2VydF9maWxlX3NwZWMsCisJCSh1aW50cHRyX3QpJmJsMzFfY2VydF91dWlkX3NwZWMsCiAJCW9wZW5fZmlwCi0JfSwgewotCQlCTDMyX0NFUlRfTkFNRSwKKwl9LAorCVtCTDMyX0NFUlRfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMzJfY2VydF9maWxlX3NwZWMsCisJCSh1aW50cHRyX3QpJmJsMzJfY2VydF91dWlkX3NwZWMsCiAJCW9wZW5fZmlwCi0JfSwgewotCQlCTDMzX0NFUlRfTkFNRSwKKwl9LAorCVtCTDMzX0NFUlRfSURdID0gewogCQkmZmlwX2Rldl9oYW5kbGUsCi0JCSh1aW50cHRyX3QpJmJsMzNfY2VydF9maWxlX3NwZWMsCisJCSh1aW50cHRyX3QpJmJsMzNfY2VydF91dWlkX3NwZWMsCiAJCW9wZW5fZmlwCi0JfSwgeworCX0sCiAjZW5kaWYgLyogVFJVU1RFRF9CT0FSRF9CT09UICovCi0JCTAsIDAsIDAKLQl9CiB9OwogCiAKQEAgLTIzNSw3ICsyMTksNyBAQAogCXVpbnRwdHJfdCBsb2NhbF9pbWFnZV9oYW5kbGU7CiAKIAkvKiBTZWUgaWYgYSBGaXJtd2FyZSBJbWFnZSBQYWNrYWdlIGlzIGF2YWlsYWJsZSAqLwotCXJlc3VsdCA9IGlvX2Rldl9pbml0KGZpcF9kZXZfaGFuZGxlLCAodWludHB0cl90KUZJUF9JTUFHRV9OQU1FKTsKKwlyZXN1bHQgPSBpb19kZXZfaW5pdChmaXBfZGV2X2hhbmRsZSwgKHVpbnRwdHJfdClGSVBfSU1BR0VfSUQpOwogCWlmIChyZXN1bHQgPT0gSU9fU1VDQ0VTUykgewogCQlyZXN1bHQgPSBpb19vcGVuKGZpcF9kZXZfaGFuZGxlLCBzcGVjLCAmbG9jYWxfaW1hZ2VfaGFuZGxlKTsKIAkJaWYgKHJlc3VsdCA9PSBJT19TVUNDRVNTKSB7CkBAIC0yOTMsOCArMjc3LDkgQEAKIH0KIAogaW50IHBsYXRfYXJtX2dldF9hbHRfaW1hZ2Vfc291cmNlKAotCWNvbnN0IHVpbnRwdHJfdCBpbWFnZV9zcGVjIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAotCXVpbnRwdHJfdCAqZGV2X2hhbmRsZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKKwl1bnNpZ25lZCBpbnQgaW1hZ2VfaWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJdWludHB0cl90ICpkZXZfaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCXVpbnRwdHJfdCAqaW1hZ2Vfc3BlYyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIHsKIAkvKiBCeSBkZWZhdWx0IGRvIG5vdCB0cnkgYW4gYWx0ZXJuYXRpdmUgKi8KIAlyZXR1cm4gSU9fRkFJTDsKQEAgLTMwMiwzNiArMjg3LDI0IEBACiAKIC8qIFJldHVybiBhbiBJTyBkZXZpY2UgaGFuZGxlIGFuZCBzcGVjaWZpY2F0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcwogICogYW4gaW1hZ2UuIFVzZSB0aGlzIHRvIGVuZm9yY2UgcGxhdGZvcm0gbG9hZCBwb2xpY3kgKi8KLWludCBwbGF0X2dldF9pbWFnZV9zb3VyY2UoY29uc3QgY2hhciAqaW1hZ2VfbmFtZSwgdWludHB0cl90ICpkZXZfaGFuZGxlLAoraW50IHBsYXRfZ2V0X2ltYWdlX3NvdXJjZSh1bnNpZ25lZCBpbnQgaW1hZ2VfaWQsIHVpbnRwdHJfdCAqZGV2X2hhbmRsZSwKIAkJCSAgdWludHB0cl90ICppbWFnZV9zcGVjKQogewogCWludCByZXN1bHQgPSBJT19GQUlMOwogCWNvbnN0IHN0cnVjdCBwbGF0X2lvX3BvbGljeSAqcG9saWN5OwogCi0JaWYgKChpbWFnZV9uYW1lICE9IE5VTEwpICYmIChkZXZfaGFuZGxlICE9IE5VTEwpICYmCi0JICAgIChpbWFnZV9zcGVjICE9IE5VTEwpKSB7Ci0JCXBvbGljeSA9IHBvbGljaWVzOwotCQl3aGlsZSAocG9saWN5LT5pbWFnZV9uYW1lICE9IE5VTEwpIHsKLQkJCWlmIChzdHJjbXAocG9saWN5LT5pbWFnZV9uYW1lLCBpbWFnZV9uYW1lKSA9PSAwKSB7Ci0JCQkJcmVzdWx0ID0gcG9saWN5LT5jaGVjayhwb2xpY3ktPmltYWdlX3NwZWMpOwotCQkJCWlmIChyZXN1bHQgPT0gSU9fU1VDQ0VTUykgewotCQkJCQkqaW1hZ2Vfc3BlYyA9IHBvbGljeS0+aW1hZ2Vfc3BlYzsKLQkJCQkJKmRldl9oYW5kbGUgPSAqKHBvbGljeS0+ZGV2X2hhbmRsZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlWRVJCT1NFKCJUcnlpbmcgYWx0ZXJuYXRpdmUgSU9cbiIpOwotCQkJCXJlc3VsdCA9IHBsYXRfYXJtX2dldF9hbHRfaW1hZ2Vfc291cmNlKAotCQkJCQkJcG9saWN5LT5pbWFnZV9zcGVjLAotCQkJCQkJZGV2X2hhbmRsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBJT19TVUNDRVNTKSB7Ci0JCQkJCSppbWFnZV9zcGVjID0gcG9saWN5LT5pbWFnZV9zcGVjOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwb2xpY3krKzsKLQkJfQorCWFzc2VydChpbWFnZV9pZCA8IEFSUkFZX1NJWkUocG9saWNpZXMpKTsKKworCXBvbGljeSA9ICZwb2xpY2llc1tpbWFnZV9pZF07CisJcmVzdWx0ID0gcG9saWN5LT5jaGVjayhwb2xpY3ktPmltYWdlX3NwZWMpOworCWlmIChyZXN1bHQgPT0gSU9fU1VDQ0VTUykgeworCQkqaW1hZ2Vfc3BlYyA9IHBvbGljeS0+aW1hZ2Vfc3BlYzsKKwkJKmRldl9oYW5kbGUgPSAqKHBvbGljeS0+ZGV2X2hhbmRsZSk7CiAJfSBlbHNlIHsKLQkJcmVzdWx0ID0gSU9fRkFJTDsKKwkJVkVSQk9TRSgiVHJ5aW5nIGFsdGVybmF0aXZlIElPXG4iKTsKKwkJcmVzdWx0ID0gcGxhdF9hcm1fZ2V0X2FsdF9pbWFnZV9zb3VyY2UoaW1hZ2VfaWQsIGRldl9oYW5kbGUsCisJCQkJCQkgICAgICAgaW1hZ2Vfc3BlYyk7CiAJfQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL3BsYXQvbnZpZGlhL3RlZ3JhL2NvbW1vbi90ZWdyYV9jb21tb24ubWsgYi9wbGF0L252aWRpYS90ZWdyYS9jb21tb24vdGVncmFfY29tbW9uLm1rCmluZGV4IDEyZDY4NGYuLjczZTEyODEgMTAwNjQ0Ci0tLSBhL3BsYXQvbnZpZGlhL3RlZ3JhL2NvbW1vbi90ZWdyYV9jb21tb24ubWsKKysrIGIvcGxhdC9udmlkaWEvdGVncmEvY29tbW9uL3RlZ3JhX2NvbW1vbi5tawpAQCAtNDMsMTQgKzQzLDEyIEBACiAKIENPTU1PTl9ESVIJCTo9CXBsYXQvbnZpZGlhL3RlZ3JhL2NvbW1vbgogCi1CTDMxX1NPVVJDRVMJCSs9CWRyaXZlcnMvYXJtL2dpYy9hcm1fZ2ljLmMJCQlcCi0JCQkJZHJpdmVycy9hcm0vZ2ljL2dpY192Mi5jCQkJXAorQkwzMV9TT1VSQ0VTCQkrPQlkcml2ZXJzL2FybS9naWMvZ2ljX3YyLmMJCQlcCiAJCQkJZHJpdmVycy9hcm0vZ2ljL2dpY192My5jCQkJXAogCQkJCWRyaXZlcnMvY29uc29sZS9jb25zb2xlLlMJCQlcCiAJCQkJZHJpdmVycy90aS91YXJ0LzE2NTUwX2NvbnNvbGUuUwkJCVwKIAkJCQlsaWIvY3B1cy9hYXJjaDY0L2NvcnRleF9hNTMuUwkJCVwKIAkJCQlsaWIvY3B1cy9hYXJjaDY0L2NvcnRleF9hNTcuUwkJCVwKLQkJCQlwbGF0L2NvbW1vbi9wbGF0X2dpYy5jCQkJCVwKIAkJCQlwbGF0L2NvbW1vbi9hYXJjaDY0L3BsYXRmb3JtX21wX3N0YWNrLlMJCVwKIAkJCQkke0NPTU1PTl9ESVJ9L2FhcmNoNjQvdGVncmFfaGVscGVycy5TCQlcCiAJCQkJJHtDT01NT05fRElSfS9kcml2ZXJzL21lbWN0cmwvbWVtY3RybC5jCQlcCmRpZmYgLS1naXQgYS9wbGF0L252aWRpYS90ZWdyYS9jb21tb24vdGVncmFfZ2ljLmMgYi9wbGF0L252aWRpYS90ZWdyYS9jb21tb24vdGVncmFfZ2ljLmMKaW5kZXggMmRhZmFlNy4uZWUxMjk3NSAxMDA2NDQKLS0tIGEvcGxhdC9udmlkaWEvdGVncmEvY29tbW9uL3RlZ3JhX2dpYy5jCisrKyBiL3BsYXQvbnZpZGlhL3RlZ3JhL2NvbW1vbi90ZWdyYV9naWMuYwpAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8YXJjaF9oZWxwZXJzLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8YXJtX2dpYy5oPgogI2luY2x1ZGUgPGJsX2NvbW1vbi5oPgogI2luY2x1ZGUgPGRlYnVnLmg+CiAjaW5jbHVkZSA8Z2ljX3YyLmg+CkBAIC0zOSw2ICs0MCwxMyBAQAogI2luY2x1ZGUgPHRlZ3JhX3ByaXZhdGUuaD4KICNpbmNsdWRlIDx0ZWdyYV9kZWYuaD4KIAorLyogVmFsdWUgdXNlZCB0byBpbml0aWFsaXplIE5vbi1TZWN1cmUgSVJRIHByaW9yaXRpZXMgZm91ciBhdCBhIHRpbWUgKi8KKyNkZWZpbmUgR0lDRF9JUFJJT1JJVFlSX0RFRl9WQUwgXAorCShHSUNfSElHSEVTVF9OU19QUklPUklUWSB8IFwKKwkoR0lDX0hJR0hFU1RfTlNfUFJJT1JJVFkgPDwgOCkgfCBcCisJKEdJQ19ISUdIRVNUX05TX1BSSU9SSVRZIDw8IDE2KSB8IFwKKwkoR0lDX0hJR0hFU1RfTlNfUFJJT1JJVFkgPDwgMjQpKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUGxhY2UgdGhlIGNwdSBpbnRlcmZhY2UgaW4gYSBzdGF0ZSB3aGVyZSBpdCBjYW4gbmV2ZXIgbWFrZSBhIGNwdSBleGl0IHdmaSBhcwogICogYXMgcmVzdWx0IG9mIGFuIGFzc2VydGVkIGludGVycnVwdC4gVGhpcyBpcyBjcml0aWNhbCBmb3IgcG93ZXJpbmcgZG93biBhIGNwdQpAQCAtNjEsMTggKzY5LDQ4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgdGVncmFfZ2ljX2NwdWlmX3NldHVwKHVuc2lnbmVkIGludCBnaWNjX2Jhc2UpCiB7Ci0JZ2ljY193cml0ZV9jdGxyKGdpY2NfYmFzZSwgRU5BQkxFX0dSUDAgfCBFTkFCTEVfR1JQMSk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IEVOQUJMRV9HUlAwIHwgRU5BQkxFX0dSUDEgfCBGSVFfRU4gfCBGSVFfQllQX0RJU19HUlAwOworCXZhbCB8PSBJUlFfQllQX0RJU19HUlAwIHwgRklRX0JZUF9ESVNfR1JQMSB8IElSUV9CWVBfRElTX0dSUDE7CisKKwlnaWNjX3dyaXRlX2N0bHIoZ2ljY19iYXNlLCB2YWwpOwogCWdpY2Nfd3JpdGVfcG1yKGdpY2NfYmFzZSwgR0lDX1BSSV9NQVNLKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlciBjcHUgZ2ljIGRpc3RyaWJ1dG9yIHNldHVwIHdoaWNoIHdpbGwgYmUgZG9uZSBieSBhbGwgY3B1cyBhZnRlciBhIGNvbGQKKyAqIGJvb3QvaG90cGx1Zy4gVGhpcyBtYXJrcyBvdXQgdGhlIHNlY3VyZSBpbnRlcnJ1cHRzICYgZW5hYmxlcyB0aGVtLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHRlZ3JhX2dpY19wY3B1X2Rpc3RpZl9zZXR1cCh1bnNpZ25lZCBpbnQgZ2ljZF9iYXNlKQoreworCXVuc2lnbmVkIGludCBpbmRleCwgc2VjX3BwaV9zZ2lfbWFzayA9IDA7CisKKwlhc3NlcnQoZ2ljZF9iYXNlKTsKKworCS8qIFNldHVwIFBQSSBwcmlvcml0aWVzIGRvaW5nIGZvdXIgYXQgYSB0aW1lICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMzI7IGluZGV4ICs9IDQpIHsKKwkJZ2ljZF93cml0ZV9pcHJpb3JpdHlyKGdpY2RfYmFzZSwgaW5kZXgsCisJCQkJR0lDRF9JUFJJT1JJVFlSX0RFRl9WQUwpOworCX0KKworCS8qCisJICogSW52ZXJ0IHRoZSBiaXRtYXNrIHRvIGNyZWF0ZSBhIG1hc2sgZm9yIG5vbi1zZWN1cmUgUFBJcyBhbmQKKwkgKiBTR0lzLiBQcm9ncmFtIHRoZSBHSUNEX0lHUk9VUFIwIHdpdGggdGhpcyBiaXQgbWFzay4gVGhpcyB3cml0ZSB3aWxsCisJICogdXBkYXRlIHRoZSBHSUNSX0lHUk9VUFIwIGFzIHdlbGwgaW4gY2FzZSB3ZSBhcmUgcnVubmluZyBvbiBhIEdJQ3YzCisJICogc3lzdGVtLiBUaGlzIGlzIGNyaXRpY2FsIGlmIEdJQ0RfQ1RMUi5BUkVfTlM9MS4KKwkgKi8KKwlnaWNkX3dyaXRlX2lncm91cHIoZ2ljZF9iYXNlLCAwLCB+c2VjX3BwaV9zZ2lfbWFzayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBHbG9iYWwgZ2ljIGRpc3RyaWJ1dG9yIHNldHVwIHdoaWNoIHdpbGwgYmUgZG9uZSBieSB0aGUgcHJpbWFyeSBjcHUgYWZ0ZXIgYQogICogY29sZCBib290LiBJdCBtYXJrcyBvdXQgdGhlIG5vbiBzZWN1cmUgU1BJcywgUFBJcyAmIFNHSXMgYW5kIGVuYWJsZXMgdGhlbS4KICAqIEl0IHRoZW4gZW5hYmxlcyB0aGUgc2VjdXJlIEdJQyBkaXN0cmlidXRvciBpbnRlcmZhY2UuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgdGVncmFfZ2ljX2Rpc3RpZl9zZXR1cCh1bnNpZ25lZCBpbnQgZ2ljZF9iYXNlKQogewotCXVuc2lnbmVkIGludCBjdHIsIG51bV9pbnRzOworCXVuc2lnbmVkIGludCBpbmRleCwgbnVtX2ludHM7CiAKIAkvKgogCSAqIE1hcmsgb3V0IG5vbi1zZWN1cmUgaW50ZXJydXB0cy4gQ2FsY3VsYXRlIG51bWJlciBvZgpAQCAtODAsOSArMTE4LDIyIEBACiAJICogbnVtYmVyIG9mIElUX0xJTkVTCiAJICovCiAJbnVtX2ludHMgPSBnaWNkX3JlYWRfdHlwZXIoZ2ljZF9iYXNlKSAmIElUX0xJTkVTX05PX01BU0s7Ci0JbnVtX2ludHMrKzsKLQlmb3IgKGN0ciA9IDA7IGN0ciA8IG51bV9pbnRzOyBjdHIrKykKLQkJZ2ljZF93cml0ZV9pZ3JvdXByKGdpY2RfYmFzZSwgY3RyIDw8IElHUk9VUFJfU0hJRlQsIH4wKTsKKwludW1faW50cyA9IChudW1faW50cyArIDEpIDw8IDU7CisJZm9yIChpbmRleCA9IE1JTl9TUElfSUQ7IGluZGV4IDwgbnVtX2ludHM7IGluZGV4ICs9IDMyKQorCQlnaWNkX3dyaXRlX2lncm91cHIoZ2ljZF9iYXNlLCBpbmRleCwgfjApOworCisJLyogU2V0dXAgU1BJIHByaW9yaXRpZXMgZG9pbmcgZm91ciBhdCBhIHRpbWUgKi8KKwlmb3IgKGluZGV4ID0gTUlOX1NQSV9JRDsgaW5kZXggPCBudW1faW50czsgaW5kZXggKz0gNCkgeworCQlnaWNkX3dyaXRlX2lwcmlvcml0eXIoZ2ljZF9iYXNlLCBpbmRleCwKKwkJCQlHSUNEX0lQUklPUklUWVJfREVGX1ZBTCk7CisJfQorCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIFNHSSBhbmQgUFBJLiBUaGlzIGlzIGRvbmUgaW4gYSBzZXBhcmF0ZWQgZnVuY3Rpb24KKwkgKiBiZWNhdXNlIGVhY2ggQ1BVIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgaXRzIG93biBwcml2YXRlCisJICogaW50ZXJydXB0cy4KKwkgKi8KKwl0ZWdyYV9naWNfcGNwdV9kaXN0aWZfc2V0dXAoZ2ljZF9iYXNlKTsKIAogCS8qIGVuYWJsZSBkaXN0cmlidXRvciAqLwogCWdpY2Rfd3JpdGVfY3RscihnaWNkX2Jhc2UsIEVOQUJMRV9HUlAwIHwgRU5BQkxFX0dSUDEpOwpAQCAtOTMsMyArMTQ0LDE1MSBAQAogCXRlZ3JhX2dpY19jcHVpZl9zZXR1cChURUdSQV9HSUNDX0JBU0UpOwogCXRlZ3JhX2dpY19kaXN0aWZfc2V0dXAoVEVHUkFfR0lDRF9CQVNFKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFuIEFSTSBwcm9jZXNzb3Igc2lnbmFscyBpbnRlcnJ1cHQgZXhjZXB0aW9ucyB0aHJvdWdoIHRoZSBJUlEgYW5kIEZJUSBwaW5zLgorICogVGhlIGludGVycnVwdCBjb250cm9sbGVyIGtub3dzIHdoaWNoIHBpbi9saW5lIGl0IHVzZXMgdG8gc2lnbmFsIGEgdHlwZSBvZgorICogaW50ZXJydXB0LiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgY29tbW9uIGltcGxlbWVudGF0aW9uIG9mCisgKiBwbGF0X2ludGVycnVwdF90eXBlX3RvX2xpbmUoKSBpbiBhbiBBUk0gR0lDIGVudmlyb25tZW50IGZvciBvcHRpb25hbCByZS11c2UKKyAqIGFjcm9zcyBwbGF0Zm9ybXMuIEl0IGxldHMgdGhlIGludGVycnVwdCBtYW5hZ2VtZW50IGZyYW1ld29yayBkZXRlcm1pbmUKKyAqIGZvciBhIHR5cGUgb2YgaW50ZXJydXB0IGFuZCBzZWN1cml0eSBzdGF0ZSwgd2hpY2ggbGluZSBzaG91bGQgYmUgdXNlZCBpbiB0aGUKKyAqIFNDUl9FTDMgdG8gY29udHJvbCBpdHMgcm91dGluZyB0byBFTDMuIFRoZSBpbnRlcnJ1cHQgbGluZSBpcyByZXByZXNlbnRlZCBhcworICogdGhlIGJpdCBwb3NpdGlvbiBvZiB0aGUgSVJRIG9yIEZJUSBiaXQgaW4gdGhlIFNDUl9FTDMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgdGVncmFfZ2ljX2ludGVycnVwdF90eXBlX3RvX2xpbmUodWludDMyX3QgdHlwZSwKKwkJCQl1aW50MzJfdCBzZWN1cml0eV9zdGF0ZSkKK3sKKwlhc3NlcnQodHlwZSA9PSBJTlRSX1RZUEVfU19FTDEgfHwKKwkgICAgICAgdHlwZSA9PSBJTlRSX1RZUEVfRUwzIHx8CisJICAgICAgIHR5cGUgPT0gSU5UUl9UWVBFX05TKTsKKworCWFzc2VydChzZWNfc3RhdGVfaXNfdmFsaWQoc2VjdXJpdHlfc3RhdGUpKTsKKworCS8qCisJICogV2UgaWdub3JlIHRoZSBzZWN1cml0eSBzdGF0ZSBwYXJhbWV0ZXIgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdAorCSAqIGJvdGggbm9ybWFsIGFuZCBzZWN1cmUgd29ybGRzIGFyZSB1c2luZyBBUk0gR0lDdjIuIFRoaXMgcGFyYW1ldGVyCisJICogd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHNlY3VyZSB3b3JsZCBzdGFydHMgdXNpbmcgR0lDdjMuCisJICovCisjaWYgQVJNX0dJQ19BUkNIID09IDIKKwlyZXR1cm4gZ2ljdjJfaW50ZXJydXB0X3R5cGVfdG9fbGluZShURUdSQV9HSUNDX0JBU0UsIHR5cGUpOworI2Vsc2UKKyNlcnJvciAiSW52YWxpZCBBUk0gR0lDIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIHNwZWNpZmllZCBmb3IgcGxhdGZvcm0gcG9ydCIKKyNlbmRpZiAvKiBBUk1fR0lDX0FSQ0ggKi8KK30KKworI2lmIEFSTV9HSUNfQVJDSCA9PSAyCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBoaWdoZXN0IHByaW9yaXR5IHBlbmRpbmcgaW50ZXJydXB0IGF0CisgKiB0aGUgR0lDIGNwdSBpbnRlcmZhY2UuIElOVFJfVFlQRV9JTlZBTCBpcyByZXR1cm5lZCB3aGVuIHRoZXJlIGlzIG5vCisgKiBpbnRlcnJ1cHQgcGVuZGluZy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCB0ZWdyYV9naWNfZ2V0X3BlbmRpbmdfaW50ZXJydXB0X3R5cGUodm9pZCkKK3sKKwl1aW50MzJfdCBpZDsKKworCWlkID0gZ2ljY19yZWFkX2hwcGlyKFRFR1JBX0dJQ0NfQkFTRSkgJiBJTlRfSURfTUFTSzsKKworCS8qIEFzc3VtZSB0aGF0IGFsbCBzZWN1cmUgaW50ZXJydXB0cyBhcmUgUy1FTDEgaW50ZXJydXB0cyAqLworCWlmIChpZCA8IDEwMjIpCisJCXJldHVybiBJTlRSX1RZUEVfU19FTDE7CisKKwlpZiAoaWQgPT0gR0lDX1NQVVJJT1VTX0lOVEVSUlVQVCkKKwkJcmV0dXJuIElOVFJfVFlQRV9JTlZBTDsKKworCXJldHVybiBJTlRSX1RZUEVfTlM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlkIG9mIHRoZSBoaWdoZXN0IHByaW9yaXR5IHBlbmRpbmcgaW50ZXJydXB0IGF0CisgKiB0aGUgR0lDIGNwdSBpbnRlcmZhY2UuIElOVFJfSURfVU5BVkFJTEFCTEUgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZSBpcyBubworICogaW50ZXJydXB0IHBlbmRpbmcuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgdGVncmFfZ2ljX2dldF9wZW5kaW5nX2ludGVycnVwdF9pZCh2b2lkKQoreworCXVpbnQzMl90IGlkOworCisJaWQgPSBnaWNjX3JlYWRfaHBwaXIoVEVHUkFfR0lDQ19CQVNFKSAmIElOVF9JRF9NQVNLOworCisJaWYgKGlkIDwgMTAyMikKKwkJcmV0dXJuIGlkOworCisJaWYgKGlkID09IDEwMjMpCisJCXJldHVybiBJTlRSX0lEX1VOQVZBSUxBQkxFOworCisJLyoKKwkgKiBGaW5kIG91dCB3aGljaCBub24tc2VjdXJlIGludGVycnVwdCBpdCBpcyB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0CisJICogdGhlIEdJQ0NfQ1RMUi5BY2tDdGwgYml0IGlzIDAuCisJICovCisJcmV0dXJuIGdpY2NfcmVhZF9haHBwaXIoVEVHUkFfR0lDQ19CQVNFKSAmIElOVF9JRF9NQVNLOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbnMgcmVhZHMgdGhlIEdJQyBjcHUgaW50ZXJmYWNlIEludGVycnVwdCBBY2tub3dsZWRnZSByZWdpc3RlcgorICogdG8gc3RhcnQgaGFuZGxpbmcgdGhlIHBlbmRpbmcgaW50ZXJydXB0LiBJdCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgSUFSLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IHRlZ3JhX2dpY19hY2tub3dsZWRnZV9pbnRlcnJ1cHQodm9pZCkKK3sKKwlyZXR1cm4gZ2ljY19yZWFkX0lBUihURUdSQV9HSUNDX0JBU0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBmdW5jdGlvbnMgd3JpdGVzIHRoZSBHSUMgY3B1IGludGVyZmFjZSBFbmQgT2YgSW50ZXJydXB0IHJlZ2lzdGVyIHdpdGgKKyAqIHRoZSBwYXNzZWQgdmFsdWUgdG8gZmluaXNoIGhhbmRsaW5nIHRoZSBhY3RpdmUgaW50ZXJydXB0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0ZWdyYV9naWNfZW5kX29mX2ludGVycnVwdCh1aW50MzJfdCBpZCkKK3sKKwlnaWNjX3dyaXRlX0VPSVIoVEVHUkFfR0lDQ19CQVNFLCBpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGludGVycnVwdCBpZCBkZXBlbmRpbmcgdXBvbiB0aGUgZ3JvdXAKKyAqIHRoaXMgaW50ZXJydXB0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdW5kZXIgYnkgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGkuZS4KKyAqIGdyb3VwMCBvciBncm91cDEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgdGVncmFfZ2ljX2dldF9pbnRlcnJ1cHRfdHlwZSh1aW50MzJfdCBpZCkKK3sKKwl1aW50MzJfdCBncm91cDsKKworCWdyb3VwID0gZ2ljZF9nZXRfaWdyb3VwcihURUdSQV9HSUNEX0JBU0UsIGlkKTsKKworCS8qIEFzc3VtZSB0aGF0IGFsbCBzZWN1cmUgaW50ZXJydXB0cyBhcmUgUy1FTDEgaW50ZXJydXB0cyAqLworCWlmIChncm91cCA9PSBHUlAwKQorCQlyZXR1cm4gSU5UUl9UWVBFX1NfRUwxOworCWVsc2UKKwkJcmV0dXJuIElOVFJfVFlQRV9OUzsKK30KKworI2Vsc2UKKyNlcnJvciAiSW52YWxpZCBBUk0gR0lDIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIHNwZWNpZmllZCBmb3IgcGxhdGZvcm0gcG9ydCIKKyNlbmRpZiAvKiBBUk1fR0lDX0FSQ0ggKi8KKwordWludDMyX3QgcGxhdF9pY19nZXRfcGVuZGluZ19pbnRlcnJ1cHRfaWQodm9pZCkKK3sKKwlyZXR1cm4gdGVncmFfZ2ljX2dldF9wZW5kaW5nX2ludGVycnVwdF9pZCgpOworfQorCit1aW50MzJfdCBwbGF0X2ljX2dldF9wZW5kaW5nX2ludGVycnVwdF90eXBlKHZvaWQpCit7CisJcmV0dXJuIHRlZ3JhX2dpY19nZXRfcGVuZGluZ19pbnRlcnJ1cHRfdHlwZSgpOworfQorCit1aW50MzJfdCBwbGF0X2ljX2Fja25vd2xlZGdlX2ludGVycnVwdCh2b2lkKQoreworCXJldHVybiB0ZWdyYV9naWNfYWNrbm93bGVkZ2VfaW50ZXJydXB0KCk7Cit9CisKK3VpbnQzMl90IHBsYXRfaWNfZ2V0X2ludGVycnVwdF90eXBlKHVpbnQzMl90IGlkKQoreworCXJldHVybiB0ZWdyYV9naWNfZ2V0X2ludGVycnVwdF90eXBlKGlkKTsKK30KKwordm9pZCBwbGF0X2ljX2VuZF9vZl9pbnRlcnJ1cHQodWludDMyX3QgaWQpCit7CisJdGVncmFfZ2ljX2VuZF9vZl9pbnRlcnJ1cHQoaWQpOworfQorCit1aW50MzJfdCBwbGF0X2ludGVycnVwdF90eXBlX3RvX2xpbmUodWludDMyX3QgdHlwZSwKKwkJCQl1aW50MzJfdCBzZWN1cml0eV9zdGF0ZSkKK3sKKwlyZXR1cm4gdGVncmFfZ2ljX2ludGVycnVwdF90eXBlX3RvX2xpbmUodHlwZSwgc2VjdXJpdHlfc3RhdGUpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3RkX3N2Yy9wc2NpL3BzY2lfY29tbW9uLmMgYi9zZXJ2aWNlcy9zdGRfc3ZjL3BzY2kvcHNjaV9jb21tb24uYwppbmRleCBlNDAxNjA5Li4xYjc0ZmYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdGRfc3ZjL3BzY2kvcHNjaV9jb21tb24uYworKysgYi9zZXJ2aWNlcy9zdGRfc3ZjL3BzY2kvcHNjaV9jb21tb24uYwpAQCAtMjE3LDggKzIxNyw4IEBACiAJYWZmX3NoaWZ0ID0gZ2V0X2FmZmx2bF9zaGlmdChhZmZfbHZsKTsKIAogCS8qIENsZWFyIHRoZSBleGlzdGluZyBhZmZpbml0eSBpbnN0YW5jZSAmIHNldCB0aGUgbmV3IG9uZSovCi0JbXBpZHIgJj0gfihNUElEUl9BRkZMVkxfTUFTSyA8PCBhZmZfc2hpZnQpOwotCW1waWRyIHw9IGFmZl9pbnN0IDw8IGFmZl9zaGlmdDsKKwltcGlkciAmPSB+KCgodW5zaWduZWQgbG9uZylNUElEUl9BRkZMVkxfTUFTSykgPDwgYWZmX3NoaWZ0KTsKKwltcGlkciB8PSAoKHVuc2lnbmVkIGxvbmcpYWZmX2luc3QpIDw8IGFmZl9zaGlmdDsKIAogCXJldHVybiBtcGlkcjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N0ZF9zdmMvcHNjaS9wc2NpX2VudHJ5LlMgYi9zZXJ2aWNlcy9zdGRfc3ZjL3BzY2kvcHNjaV9lbnRyeS5TCmluZGV4IDNmMGQ0ZjAuLjA1MGY2YzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N0ZF9zdmMvcHNjaS9wc2NpX2VudHJ5LlMKKysrIGIvc2VydmljZXMvc3RkX3N2Yy9wc2NpL3BzY2lfZW50cnkuUwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgQVJNIExpbWl0ZWQgYW5kIENvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBBUk0gTGltaXRlZCBhbmQgQ29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxhcmNoLmg+CiAjaW5jbHVkZSA8YXNtX21hY3Jvcy5TPgorI2luY2x1ZGUgPGVsM19jb21tb25fbWFjcm9zLlM+CiAjaW5jbHVkZSA8cHNjaS5oPgogI2luY2x1ZGUgPHhsYXRfdGFibGVzLmg+CiAKQEAgLTUyLDY5ICs1MywzMCBAQAogCWFkcgl4MjMsIHBzY2lfYWZmbHZsX3N1c3BlbmRfZmluaXNoZXJzCiAKIHBzY2lfYWZmX2NvbW1vbl9maW5pc2hfZW50cnk6Ci0jaWYgIVJFU0VUX1RPX0JMMzEKLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBQZXJmb3JtIGFueSBwcm9jZXNzb3Igc3BlY2lmaWMgYWN0aW9ucyB3aGljaAotCSAqIHVuZG8gb3IgYXJlIGluIGFkZGl0aW9uIHRvIHRoZSBhY3Rpb25zCi0JICogcGVyZm9ybWVkIGJ5IHRoZSByZXNldCBoYW5kbGVyIGluIHRoZSBCb290Uk9NCi0JICogKEJMMSkgZS5nLiBjYWNoZSwgdGxiIGludmFsaWRhdGlvbnMsIGVycmF0YQotCSAqIHdvcmthcm91bmRzIGV0Yy4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvKgorCSAqIE9uIHRoZSB3YXJtIGJvb3QgcGF0aCwgbW9zdCBvZiB0aGUgRUwzIGluaXRpYWxpc2F0aW9ucyBwZXJmb3JtZWQgYnkKKwkgKiAnZWwzX2VudHJ5cG9pbnRfY29tbW9uJyBtdXN0IGJlIHNraXBwZWQ6CisJICoKKwkgKiAgLSBPbmx5IHdoZW4gdGhlIHBsYXRmb3JtIGJ5cGFzc2VzIHRoZSBCTDEvQkwzLTEgZW50cnlwb2ludCBieQorCSAqICAgIHByb2dyYW1taW5nIHRoZSByZXNldCBhZGRyZXNzIGRvIHdlIG5lZWQgdG8gc2V0IHRoZSBDUFUgZW5kaWFubmVzcy4KKwkgKiAgICBJbiBvdGhlciBjYXNlcywgd2UgYXNzdW1lIHRoaXMgaGFzIGJlZW4gdGFrZW4gY2FyZSBieSB0aGUKKwkgKiAgICBlbnRyeXBvaW50IGNvZGUuCisJICoKKwkgKiAgLSBObyBuZWVkIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBib290LCB3ZSBrbm93IGl0IGlzIGEgd2FybSBib290LgorCSAqCisJICogIC0gRG8gbm90IHRyeSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHByaW1hcnkgYW5kIHNlY29uZGFyeSBDUFVzLCB0aGlzCisJICogICAgbm90aW9uIG9ubHkgZXhpc3RzIGZvciBhIGNvbGQgYm9vdC4KKwkgKgorCSAqICAtIE5vIG5lZWQgdG8gaW5pdGlhbGlzZSB0aGUgbWVtb3J5IG9yIHRoZSBDIHJ1bnRpbWUgZW52aXJvbm1lbnQsCisJICogICAgaXQgaGFzIGJlZW4gZG9uZSBvbmNlIGFuZCBmb3IgYWxsIG9uIHRoZSBjb2xkIGJvb3QgcGF0aC4KIAkgKi8KLQlibCAgICAgIHJlc2V0X2hhbmRsZXIKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIEVuYWJsZSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUsIHN0YWNrIHBvaW50ZXIKLQkgKiBhbmQgZGF0YSBhY2Nlc3MgYWxpZ25tZW50IGNoZWNrcy4KLQkgKiBJdCBjYW4gYmUgYXNzdW1lZCB0aGF0IEJMMy0xIGVudHJ5cG9pbnQgY29kZQotCSAqIHdpbGwgZG8gdGhpcyB3aGVuIFJFU0VUX1RPX0JMMzEgaXMgc2V0LiBUaGUKLQkgKiBzYW1lICBhc3N1bXB0aW9uIGNhbm5vdCBiZSBtYWRlIHdoZW4gYW5vdGhlcgotCSAqIGJvb3QgbG9hZGVyIGV4ZWN1dGVzIGJlZm9yZSBCTDMtMSBpbiB0aGUgd2FybQotCSAqIGJvb3QgcGF0aCBlLmcuIEJMMS4KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQltb3YJeDEsICMoU0NUTFJfSV9CSVQgfCBTQ1RMUl9BX0JJVCB8IFNDVExSX1NBX0JJVCkKLQltcnMJeDAsIHNjdGxyX2VsMwotCW9ycgl4MCwgeDAsIHgxCi0JbXNyCXNjdGxyX2VsMywgeDAKLQlpc2IKLSNlbmRpZgotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogSW5pdGlhbGlzZSB0aGUgcGNwdSBjYWNoZSBwb2ludGVyIGZvciB0aGUgQ1BVCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JYmwJaW5pdF9jcHVfZGF0YV9wdHIKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFNldCB0aGUgZXhjZXB0aW9uIHZlY3RvcnMKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlhZHIJeDAsIHJ1bnRpbWVfZXhjZXB0aW9ucwotCW1zcgl2YmFyX2VsMywgeDAKLQlpc2IKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIEVuYWJsZSB0aGUgU0Vycm9yIGludGVycnVwdCBub3cgdGhhdCB0aGUKLQkgKiBleGNlcHRpb24gdmVjdG9ycyBoYXZlIGJlZW4gc2V0dXAuCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JbXNyCWRhaWZjbHIsICNEQUlGX0FCVF9CSVQKLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqIFVzZSBTUF9FTDAgZm9yIHRoZSBDIHJ1bnRpbWUgc3RhY2suCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JbXNyCXNwc2VsLCAjMAotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBHaXZlIG91cnNlbHZlcyBhIHN0YWNrIHdob3NlIG1lbW9yeSB3aWxsIGJlCi0JICogbWFya2VkIGFzIE5vcm1hbC1JUy1XQldBIHdoZW4gdGhlIE1NVSBpcwotCSAqIGVuYWJsZWQuCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQltcnMJeDAsIG1waWRyX2VsMQotCWJsCXBsYXRmb3JtX3NldF9zdGFjaworCWVsM19lbnRyeXBvaW50X2NvbW1vbgkJCQkJXAorCQlfc2V0X2VuZGlhbj1QUk9HUkFNTUFCTEVfUkVTRVRfQUREUkVTUwkJXAorCQlfd2FybV9ib290X21haWxib3g9MAkJCQlcCisJCV9zZWNvbmRhcnlfY29sZF9ib290PTAJCQkJXAorCQlfaW5pdF9tZW1vcnk9MAkJCQkJXAorCQlfaW5pdF9jX3J1bnRpbWU9MAkJCQlcCisJCV9leGNlcHRpb25fdmVjdG9ycz1ydW50aW1lX2V4Y2VwdGlvbnMKIAogCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICogRW5hYmxlIHRoZSBNTVUgd2l0aCB0aGUgRENhY2hlIGRpc2FibGVkLiBJdApkaWZmIC0tZ2l0IGEvdG9vbHMvY2VydF9jcmVhdGUvTWFrZWZpbGUgYi90b29scy9jZXJ0X2NyZWF0ZS9NYWtlZmlsZQppbmRleCBlYWM4Y2VjLi5hNGJkNzZmIDEwMDY0NAotLS0gYS90b29scy9jZXJ0X2NyZWF0ZS9NYWtlZmlsZQorKysgYi90b29scy9jZXJ0X2NyZWF0ZS9NYWtlZmlsZQpAQCAtMzMsNiArMzMsNyBAQAogVgkJOj0gMAogREVCVUcJCTo9IDAKIEJJTkFSWQkJOj0gJHtQUk9KRUNUfQorT1BFTlNTTF9ESVIJOj0gL3VzcgogCiBPQkpFQ1RTIDo9IHNyYy9jZXJ0Lm8gXAogICAgICAgICAgICBzcmMvZXh0Lm8gXApAQCAtNjksOCArNzAsOCBAQAogCiAjIE1ha2Ugc29mdCBsaW5rcyBhbmQgaW5jbHVkZSBmcm9tIGxvY2FsIGRpcmVjdG9yeSBvdGhlcndpc2Ugd3JvbmcgaGVhZGVycwogIyBjb3VsZCBnZXQgcHVsbGVkIGluIGZyb20gZmlybXdhcmUgdHJlZS4KLUlOQ19ESVIgOj0gLUkgLi9pbmNsdWRlIC1JICR7UExBVF9JTkNMVURFfQotTElCX0RJUiA6PQorSU5DX0RJUiA6PSAtSSAuL2luY2x1ZGUgLUkgJHtQTEFUX0lOQ0xVREV9IC1JICR7T1BFTlNTTF9ESVJ9L2luY2x1ZGUKK0xJQl9ESVIgOj0gLUwgJHtPUEVOU1NMX0RJUn0vbGliCiBMSUIgOj0gLWxzc2wgLWxjcnlwdG8KIAogQ0MgOj0gZ2NjCmRpZmYgLS1naXQgYS90b29scy9jZXJ0X2NyZWF0ZS9pbmNsdWRlL2V4dC5oIGIvdG9vbHMvY2VydF9jcmVhdGUvaW5jbHVkZS9leHQuaAppbmRleCBkNzNmNTczLi41N2JiNjVmIDEwMDY0NAotLS0gYS90b29scy9jZXJ0X2NyZWF0ZS9pbmNsdWRlL2V4dC5oCisrKyBiL3Rvb2xzL2NlcnRfY3JlYXRlL2luY2x1ZGUvZXh0LmgKQEAgLTYzLDcgKzYzLDggQEAKIH07CiAKIGludCBleHRfaW5pdChleHRfdCAqdGJiX2V4dCk7Ci1YNTA5X0VYVEVOU0lPTiAqZXh0X25ld19oYXNoKGludCBuaWQsIGludCBjcml0LCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworWDUwOV9FWFRFTlNJT04gKmV4dF9uZXdfaGFzaChpbnQgbmlkLCBpbnQgY3JpdCwgY29uc3QgRVZQX01EICptZCwKKwkJdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKIFg1MDlfRVhURU5TSU9OICpleHRfbmV3X252Y291bnRlcihpbnQgbmlkLCBpbnQgY3JpdCwgaW50IHZhbHVlKTsKIFg1MDlfRVhURU5TSU9OICpleHRfbmV3X2tleShpbnQgbmlkLCBpbnQgY3JpdCwgRVZQX1BLRVkgKmspOwogCmRpZmYgLS1naXQgYS90b29scy9jZXJ0X2NyZWF0ZS9pbmNsdWRlL2tleS5oIGIvdG9vbHMvY2VydF9jcmVhdGUvaW5jbHVkZS9rZXkuaAppbmRleCA4ODE5NzUwLi4xNjVmZmExIDEwMDY0NAotLS0gYS90b29scy9jZXJ0X2NyZWF0ZS9pbmNsdWRlL2tleS5oCisrKyBiL3Rvb2xzL2NlcnRfY3JlYXRlL2luY2x1ZGUva2V5LmgKQEAgLTM1LDYgKzM1LDI0IEBACiAKICNkZWZpbmUgUlNBX0tFWV9CSVRTCQkyMDQ4CiAKKy8qIEVycm9yIGNvZGVzICovCitlbnVtIHsKKwlLRVlfRVJSX05PTkUsCisJS0VZX0VSUl9NQUxMT0MsCisJS0VZX0VSUl9GSUxFTkFNRSwKKwlLRVlfRVJSX09QRU4sCisJS0VZX0VSUl9MT0FECit9OworCisvKiBTdXBwb3J0ZWQga2V5IGFsZ29yaXRobXMgKi8KK2VudW0geworCUtFWV9BTEdfUlNBLAorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJS0VZX0FMR19FQ0RTQSwKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisJS0VZX0FMR19NQVhfTlVNCit9OworCiAvKgogICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUga2V5cwogICogcmVxdWlyZWQgdG8gc2lnbiB0aGUgY2VydGlmaWNhdGVzLgpAQCAtNTAsOCArNjgsOCBAQAogCUVWUF9QS0VZICprZXk7CQkvKiBLZXkgY29udGFpbmVyICovCiB9IGtleV90OwogCi1pbnQga2V5X25ldyhrZXlfdCAqa2V5KTsKLWludCBrZXlfbG9hZChrZXlfdCAqa2V5KTsKK2ludCBrZXlfY3JlYXRlKGtleV90ICprZXksIGludCB0eXBlKTsKK2ludCBrZXlfbG9hZChrZXlfdCAqa2V5LCB1bnNpZ25lZCBpbnQgKmVycl9jb2RlKTsKIGludCBrZXlfc3RvcmUoa2V5X3QgKmtleSk7CiAKICNlbmRpZiAvKiBLRVlfSF8gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL2NlcnRfY3JlYXRlL3NyYy9leHQuYyBiL3Rvb2xzL2NlcnRfY3JlYXRlL3NyYy9leHQuYwppbmRleCAzMWY4NGE4Li4yMWI5MGRiIDEwMDY0NAotLS0gYS90b29scy9jZXJ0X2NyZWF0ZS9zcmMvZXh0LmMKKysrIGIvdG9vbHMvY2VydF9jcmVhdGUvc3JjL2V4dC5jCkBAIC0zMSwxMyArMzEsMjkgQEAKICNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CiAjaW5jbHVkZSAiZXh0LmgiCiAKIERFQ0xBUkVfQVNOMV9JVEVNKEFTTjFfSU5URUdFUikKK0RFQ0xBUkVfQVNOMV9JVEVNKFg1MDlfQUxHT1IpCiBERUNMQVJFX0FTTjFfSVRFTShBU04xX09DVEVUX1NUUklORykKIAordHlwZWRlZiBzdHJ1Y3QgeworCVg1MDlfQUxHT1IgKmhhc2hBbGdvcml0aG07CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGFIYXNoOworfSBIQVNIOworCitBU04xX1NFUVVFTkNFKEhBU0gpID0geworCUFTTjFfU0lNUExFKEhBU0gsIGhhc2hBbGdvcml0aG0sIFg1MDlfQUxHT1IpLAorCUFTTjFfU0lNUExFKEhBU0gsIGRhdGFIYXNoLCBBU04xX09DVEVUX1NUUklORyksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEhBU0gpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoSEFTSCkKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhIQVNIKQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBUQkIgZXh0ZW5zaW9ucyB0byB0aGUgaW50ZXJuYWwgZXh0ZW5zaW9uIGxpc3QKICAqIG1haW50YWluZWQgYnkgT3BlblNTTCBzbyB0aGV5IGNhbiBiZSB1c2VkIGxhdGVyLgpAQCAtMTIzLDM3ICsxMzksODUgQEAKIH0KIAogLyoKLSAqIENyZWF0ZXMgYSB4NTA5djMgZXh0ZW5zaW9uIGNvbnRhaW5pbmcgYSBoYXNoIGVuY2Fwc3VsYXRlZCBpbiBhbiBBU04xIE9jdGV0Ci0gKiBTdHJpbmcKKyAqIENyZWF0ZXMgYSB4NTA5djMgZXh0ZW5zaW9uIGNvbnRhaW5pbmcgYSBoYXNoCisgKgorICogRGlnZXN0SW5mbyA6Oj0gU0VRVUVOQ0UgeworICogICAgIGRpZ2VzdEFsZ29yaXRobSAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICBkaWdlc3QgICAgICAgICAgIE9DVEVUIFNUUklORworICogfQorICoKKyAqIEFsZ29yaXRobUlkZW50aWZpZXIgOjo9ICBTRVFVRU5DRSAgeworICogICAgIGFsZ29yaXRobSAgICAgICAgT0JKRUNUIElERU5USUZJRVIsCisgKiAgICAgcGFyYW1ldGVycyAgICAgICBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUwKKyAqIH0KICAqCiAgKiBQYXJhbWV0ZXJzOgotICogICBwZXg6IE9wZW5TU0wgZXh0ZW5zaW9uIHBvaW50ZXIgKG91dHB1dCBwYXJhbWV0ZXIpCiAgKiAgIG5pZDogZXh0ZW5zaW9uIGlkZW50aWZpZXIKICAqICAgY3JpdDogZXh0ZW5zaW9uIGNyaXRpY2FsIChFWFRfTk9OX0NSSVQsIEVYVF9DUklUKQorICogICBtZDogaGFzaCBhbGdvcml0aG0KICAqICAgYnVmOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgaGFzaAogICogICBsZW46IHNpemUgb2YgdGhlIGhhc2ggaW4gYnl0ZXMKICAqCiAgKiBSZXR1cm46IEV4dGVuc2lvbiBhZGRyZXNzLCBOVUxMIGlmIGVycm9yCiAgKi8KLVg1MDlfRVhURU5TSU9OICpleHRfbmV3X2hhc2goaW50IG5pZCwgaW50IGNyaXQsIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK1g1MDlfRVhURU5TSU9OICpleHRfbmV3X2hhc2goaW50IG5pZCwgaW50IGNyaXQsIGNvbnN0IEVWUF9NRCAqbWQsCisJCXVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlYNTA5X0VYVEVOU0lPTiAqZXggPSBOVUxMOwotCUFTTjFfT0NURVRfU1RSSU5HICpoYXNoID0gTlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqb2N0ZXQgPSBOVUxMOworCUhBU0ggKmhhc2ggPSBOVUxMOworCUFTTjFfT0JKRUNUICphbGdvcml0aG0gPSBOVUxMOworCVg1MDlfQUxHT1IgKng1MDlfYWxnb3IgPSBOVUxMOwogCXVuc2lnbmVkIGNoYXIgKnAgPSBOVUxMOwogCWludCBzeiA9IC0xOwogCi0JLyogRW5jb2RlIEhhc2ggKi8KLQloYXNoID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCk7Ci0JQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KGhhc2gsIGJ1ZiwgbGVuKTsKLQlzeiA9IGkyZF9BU04xX09DVEVUX1NUUklORyhoYXNoLCBOVUxMKTsKLQlpMmRfQVNOMV9PQ1RFVF9TVFJJTkcoaGFzaCwgJnApOworCS8qIE9CSkVDVF9JREVOVElGSUVSIHdpdGggaGFzaCBhbGdvcml0aG0gKi8KKwlhbGdvcml0aG0gPSBPQkpfbmlkMm9iaihtZC0+dHlwZSk7CisJaWYgKGFsZ29yaXRobSA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIENyZWF0ZSBYNTA5X0FMR09SICovCisJeDUwOV9hbGdvciA9IFg1MDlfQUxHT1JfbmV3KCk7CisJaWYgKHg1MDlfYWxnb3IgPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJeDUwOV9hbGdvci0+YWxnb3JpdGhtID0gYWxnb3JpdGhtOworCXg1MDlfYWxnb3ItPnBhcmFtZXRlciA9IEFTTjFfVFlQRV9uZXcoKTsKKwlBU04xX1RZUEVfc2V0KHg1MDlfYWxnb3ItPnBhcmFtZXRlciwgVl9BU04xX05VTEwsIE5VTEwpOworCisJLyogT0NURVRfU1RSSU5HIHdpdGggdGhlIGFjdHVhbCBoYXNoICovCisJb2N0ZXQgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlpZiAob2N0ZXQgPT0gTlVMTCkgeworCQlYNTA5X0FMR09SX2ZyZWUoeDUwOV9hbGdvcik7CisJCXJldHVybiBOVUxMOworCX0KKwlBU04xX09DVEVUX1NUUklOR19zZXQob2N0ZXQsIGJ1ZiwgbGVuKTsKKworCS8qIEhBU0ggc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxnb3JpdGhtICsgaGFzaCAqLworCWhhc2ggPSBIQVNIX25ldygpOworCWlmIChoYXNoID09IE5VTEwpIHsKKwkJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvY3RldCk7CisJCVg1MDlfQUxHT1JfZnJlZSh4NTA5X2FsZ29yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWhhc2gtPmhhc2hBbGdvcml0aG0gPSB4NTA5X2FsZ29yOworCWhhc2gtPmRhdGFIYXNoID0gb2N0ZXQ7CisKKwkvKiBERVIgZW5jb2RlZCBIQVNIICovCisJc3ogPSBpMmRfSEFTSChoYXNoLCAmcCk7CisJaWYgKChzeiA8PSAwKSB8fCAocCA9PSBOVUxMKSkgeworCQlIQVNIX2ZyZWUoaGFzaCk7CisJCVg1MDlfQUxHT1JfZnJlZSh4NTA5X2FsZ29yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJLyogQ3JlYXRlIHRoZSBleHRlbnNpb24gKi8KIAlleCA9IGV4dF9uZXcobmlkLCBjcml0LCBwLCBzeik7CiAKIAkvKiBDbGVhbiB1cCAqLwogCU9QRU5TU0xfZnJlZShwKTsKLQlBU04xX09DVEVUX1NUUklOR19mcmVlKGhhc2gpOworCUhBU0hfZnJlZShoYXNoKTsKIAogCXJldHVybiBleDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2NlcnRfY3JlYXRlL3NyYy9rZXkuYyBiL3Rvb2xzL2NlcnRfY3JlYXRlL3NyYy9rZXkuYwppbmRleCBiNTczN2Q5Li42MDcyZDljIDEwMDY0NAotLS0gYS90b29scy9jZXJ0X2NyZWF0ZS9zcmMva2V5LmMKKysrIGIvdG9vbHMvY2VydF9jcmVhdGUvc3JjL2tleS5jCkBAIC00Niw0MSArNDYsMTAyIEBACiAjZGVmaW5lIE1BWF9GSUxFTkFNRV9MRU4JCTEwMjQKIAogLyoKLSAqIENyZWF0ZSBhIG5ldyBrZXkKKyAqIENyZWF0ZSBhIG5ldyBrZXkgY29udGFpbmVyCiAgKi8KLWludCBrZXlfbmV3KGtleV90ICprZXkpCitzdGF0aWMgaW50IGtleV9uZXcoa2V5X3QgKmtleSkKIHsKLQlSU0EgKnJzYSA9IE5VTEw7Ci0JRVZQX1BLRVkgKmsgPSBOVUxMOwotCiAJLyogQ3JlYXRlIGtleSBwYWlyIGNvbnRhaW5lciAqLwotCWsgPSBFVlBfUEtFWV9uZXcoKTsKLQlpZiAoayA9PSBOVUxMKSB7CisJa2V5LT5rZXkgPSBFVlBfUEtFWV9uZXcoKTsKKwlpZiAoa2V5LT5rZXkgPT0gTlVMTCkgewogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBHZW5lcmF0ZSBhIG5ldyBSU0Ega2V5ICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQga2V5X2NyZWF0ZV9yc2Eoa2V5X3QgKmtleSkKK3sKKwlSU0EgKnJzYSA9IE5VTEw7CisKIAlyc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KFJTQV9LRVlfQklUUywgUlNBX0Y0LCBOVUxMLCBOVUxMKTsKLQlpZiAoRVZQX1BLRVlfYXNzaWduX1JTQShrLCByc2EpKSB7Ci0JCWtleS0+a2V5ID0gazsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKKwlpZiAocnNhID09IE5VTEwpIHsKKwkJcHJpbnRmKCJDYW5ub3QgY3JlYXRlIFJTQSBrZXlcbiIpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCFFVlBfUEtFWV9hc3NpZ25fUlNBKGtleS0+a2V5LCByc2EpKSB7CiAJCXByaW50ZigiQ2Fubm90IGFzc2lnbiBSU0Ega2V5XG4iKTsKKwkJZ290byBlcnI7CiAJfQogCi0JaWYgKGspCi0JCUVWUF9QS0VZX2ZyZWUoayk7CisJcmV0dXJuIDE7CitlcnI6CisJUlNBX2ZyZWUocnNhKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IGtleV9sb2FkKGtleV90ICprZXkpCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKK3N0YXRpYyBpbnQga2V5X2NyZWF0ZV9lY2RzYShrZXlfdCAqa2V5KQoreworCUVDX0tFWSAqZWMgPSBOVUxMOworCisJZWMgPSBFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoTklEX1g5XzYyX3ByaW1lMjU2djEpOworCWlmIChlYyA9PSBOVUxMKSB7CisJCXByaW50ZigiQ2Fubm90IGNyZWF0ZSBFQyBrZXlcbiIpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCFFQ19LRVlfZ2VuZXJhdGVfa2V5KGVjKSkgeworCQlwcmludGYoIkNhbm5vdCBnZW5lcmF0ZSBFQyBrZXlcbiIpOworCQlnb3RvIGVycjsKKwl9CisJRUNfS0VZX3NldF9mbGFncyhlYywgRUNfUEtFWV9OT19QQVJBTUVURVJTKTsKKwlFQ19LRVlfc2V0X2FzbjFfZmxhZyhlYywgT1BFTlNTTF9FQ19OQU1FRF9DVVJWRSk7CisJaWYgKCFFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKGtleS0+a2V5LCBlYykpIHsKKwkJcHJpbnRmKCJDYW5ub3QgYXNzaWduIEVDIGtleVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAxOworZXJyOgorCUVDX0tFWV9mcmVlKGVjKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisKK3R5cGVkZWYgaW50ICgqa2V5X2NyZWF0ZV9mbl90KShrZXlfdCAqa2V5KTsKK3N0YXRpYyBjb25zdCBrZXlfY3JlYXRlX2ZuX3Qga2V5X2NyZWF0ZV9mbltLRVlfQUxHX01BWF9OVU1dID0geworCWtleV9jcmVhdGVfcnNhLAorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJa2V5X2NyZWF0ZV9lY2RzYSwKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCit9OworCitpbnQga2V5X2NyZWF0ZShrZXlfdCAqa2V5LCBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA+PSBLRVlfQUxHX01BWF9OVU0pIHsKKwkJcHJpbnRmKCJJbnZhbGlkIGtleSB0eXBlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ3JlYXRlIE9wZW5TU0wga2V5IGNvbnRhaW5lciAqLworCWlmICgha2V5X25ldyhrZXkpKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChrZXlfY3JlYXRlX2ZuW3R5cGVdKSB7CisJCXJldHVybiBrZXlfY3JlYXRlX2ZuW3R5cGVdKGtleSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBrZXlfbG9hZChrZXlfdCAqa2V5LCB1bnNpZ25lZCBpbnQgKmVycl9jb2RlKQogewogCUZJTEUgKmZwID0gTlVMTDsKIAlFVlBfUEtFWSAqayA9IE5VTEw7CiAKLQkvKiBDcmVhdGUga2V5IHBhaXIgY29udGFpbmVyICovCi0JayA9IEVWUF9QS0VZX25ldygpOwotCWlmIChrID09IE5VTEwpIHsKKwkvKiBDcmVhdGUgT3BlblNTTCBrZXkgY29udGFpbmVyICovCisJaWYgKCFrZXlfbmV3KGtleSkpIHsKKwkJKmVycl9jb2RlID0gS0VZX0VSUl9NQUxMT0M7CiAJCXJldHVybiAwOwogCX0KIApAQCAtODgsMjQgKzE0OSwyNCBAQAogCQkvKiBMb2FkIGtleSBmcm9tIGZpbGUgKi8KIAkJZnAgPSBmb3BlbihrZXktPmZuLCAiciIpOwogCQlpZiAoZnApIHsKLQkJCWsgPSBQRU1fcmVhZF9Qcml2YXRlS2V5KGZwLCAmaywgTlVMTCwgTlVMTCk7CisJCQlrID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmcCwgJmtleS0+a2V5LCBOVUxMLCBOVUxMKTsKIAkJCWZjbG9zZShmcCk7CiAJCQlpZiAoaykgewotCQkJCWtleS0+a2V5ID0gazsKKwkJCQkqZXJyX2NvZGUgPSBLRVlfRVJSX05PTkU7CiAJCQkJcmV0dXJuIDE7CiAJCQl9IGVsc2UgewotCQkJCUVSUk9SKCJDYW5ub3QgcmVhZCBrZXkgZnJvbSAlc1xuIiwga2V5LT5mbik7CisJCQkJRVJST1IoIkNhbm5vdCBsb2FkIGtleSBmcm9tICVzXG4iLCBrZXktPmZuKTsKKwkJCQkqZXJyX2NvZGUgPSBLRVlfRVJSX0xPQUQ7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlFUlJPUigiQ2Fubm90IG9wZW4gZmlsZSAlc1xuIiwga2V5LT5mbik7CisJCQlXQVJOKCJDYW5ub3Qgb3BlbiBmaWxlICVzXG4iLCBrZXktPmZuKTsKKwkJCSplcnJfY29kZSA9IEtFWV9FUlJfT1BFTjsKIAkJfQogCX0gZWxzZSB7Ci0JCUVSUk9SKCJLZXkgZmlsZW5hbWUgbm90IHNwZWNpZmllZFxuIik7CisJCVdBUk4oIktleSBmaWxlbmFtZSBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJKmVycl9jb2RlID0gS0VZX0VSUl9GSUxFTkFNRTsKIAl9CiAKLQlpZiAoaykKLQkJRVZQX1BLRVlfZnJlZShrKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS90b29scy9jZXJ0X2NyZWF0ZS9zcmMvbWFpbi5jIGIvdG9vbHMvY2VydF9jcmVhdGUvc3JjL21haW4uYwppbmRleCA2ZGYzNjdhLi5jNzhkODdhIDEwMDY0NAotLS0gYS90b29scy9jZXJ0X2NyZWF0ZS9zcmMvbWFpbi5jCisrKyBiL3Rvb2xzL2NlcnRfY3JlYXRlL3NyYy9tYWluLmMKQEAgLTgwLDYgKzgwLDcgQEAKICNkZWZpbmUgVkFMX0RBWVMJCQk3MzAwCiAjZGVmaW5lIElEX1RPX0JJVF9NQVNLKGlkKQkJKDEgPDwgaWQpCiAjZGVmaW5lIE5WQ09VTlRFUl9WQUxVRQkJCTAKKyNkZWZpbmUgTlVNX0VMRU0oeCkJCQkoKHNpemVvZih4KSkgLyAoc2l6ZW9mKHhbMF0pKSkKIAogLyogRmlsZXMgKi8KIGVudW0gewpAQCAtMTEyLDYgKzExMyw3IEBACiB9OwogCiAvKiBHbG9iYWwgb3B0aW9ucyAqLworc3RhdGljIGludCBrZXlfYWxnOwogc3RhdGljIGludCBuZXdfa2V5czsKIHN0YXRpYyBpbnQgc2F2ZV9rZXlzOwogc3RhdGljIGludCBwcmludF9jZXJ0OwpAQCAtMTM4LDYgKzE0MCwxMyBAQAogCXJldHVybiBkdXA7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICprZXlfYWxnc19zdHJbXSA9IHsKKwlbS0VZX0FMR19SU0FdID0gInJzYSIsCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwlbS0VZX0FMR19FQ0RTQV0gPSAiZWNkc2EiCisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworfTsKKwogLyogQ29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0W10gPSB7CiAJLyogQmluYXJ5IGltYWdlcyAqLwpAQCAtMTY2LDYgKzE3NSw3IEBACiAJeyJibDMyLWtleSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBCTDMyX0tFWV9JRH0sCiAJeyJibDMzLWtleSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBCTDMzX0tFWV9JRH0sCiAJLyogQ29tbW9uIG9wdGlvbnMgKi8KKwl7ImtleS1hbGciLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2EnfSwKIAl7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKIAl7InNhdmUta2V5cyIsIG5vX2FyZ3VtZW50LCAwLCAnayd9LAogCXsibmV3LWNoYWluIiwgbm9fYXJndW1lbnQsIDAsICduJ30sCkBAIC0xODksNiArMTk5LDcgQEAKIAkJcHJpbnRmKCIgICAgICAgIC0tJXMgPGZpbGU+ICBcXFxuIiwgbG9uZ19vcHRbaV0ubmFtZSk7CiAJfQogCXByaW50ZigiXG4iKTsKKwlwcmludGYoIi1hICAgIEtleSBhbGdvcml0aG06IHJzYSAoZGVmYXVsdCksIGVjZHNhXG4iKTsKIAlwcmludGYoIi1oICAgIFByaW50IGhlbHAgYW5kIGV4aXRcbiIpOwogCXByaW50ZigiLWsgICAgU2F2ZSBrZXkgcGFpcnMgaW50byBmaWxlcy4gRmlsZW5hbWVzIG11c3QgYmUgcHJvdmlkZWRcbiIpOwogCXByaW50ZigiLW4gICAgR2VuZXJhdGUgbmV3IGtleSBwYWlycyBpZiBubyBrZXkgZmlsZXMgYXJlIHByb3ZpZGVkXG4iKTsKQEAgLTE5OCw4ICsyMDksMjcgQEAKIAlleGl0KDApOwogfQogCitzdGF0aWMgaW50IGdldF9rZXlfYWxnKGNvbnN0IGNoYXIgKmtleV9hbGdfc3RyKQoreworCWludCBpOworCisJZm9yIChpID0gMCA7IGkgPCBOVU1fRUxFTShrZXlfYWxnc19zdHIpIDsgaSsrKSB7CisJCWlmICgwID09IHN0cmNtcChrZXlfYWxnX3N0ciwga2V5X2FsZ3Nfc3RyW2ldKSkgeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyB2b2lkIGNoZWNrX2NtZF9wYXJhbXModm9pZCkKIHsKKwkvKiBPbmx5IHNhdmUgbmV3IGtleXMgKi8KKwlpZiAoc2F2ZV9rZXlzICYmICFuZXdfa2V5cykgeworCQlFUlJPUigiT25seSBuZXcga2V5cyBjYW4gYmUgc2F2ZWQgdG8gZGlza1xuIik7CisJCWV4aXQoMSk7CisJfQorCiAJLyogQkwyLCBCTDMxIGFuZCBCTDMzIGFyZSBtYW5kYXRvcnkgKi8KIAlpZiAoY2VydHNbQkwyX0NFUlRdLmJpbiA9PSBOVUxMKSB7CiAJCUVSUk9SKCJCTDIgaW1hZ2Ugbm90IHNwZWNpZmllZFxuIik7CkBAIC0yNzYsMTQgKzMwNiwxOSBAQAogCUZJTEUgKmZpbGUgPSBOVUxMOwogCWludCBpLCB0el9udmN0cl9uaWQsIG50el9udmN0cl9uaWQsIGhhc2hfbmlkLCBwa19uaWQ7CiAJaW50IGMsIG9wdF9pZHggPSAwOworCXVuc2lnbmVkIGludCBlcnJfY29kZTsKIAl1bnNpZ25lZCBjaGFyIG1kW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKKwljb25zdCBFVlBfTUQgKm1kX2luZm87CiAKIAlOT1RJQ0UoIkNvVCBHZW5lcmF0aW9uIFRvb2w6ICVzXG4iLCBidWlsZF9tc2cpOwogCU5PVElDRSgiVGFyZ2V0IHBsYXRmb3JtOiAlc1xuIiwgcGxhdGZvcm1fbXNnKTsKIAorCS8qIFNldCBkZWZhdWx0IG9wdGlvbnMgKi8KKwlrZXlfYWxnID0gS0VZX0FMR19SU0E7CisKIAl3aGlsZSAoMSkgewogCQkvKiBnZXRvcHRfbG9uZyBzdG9yZXMgdGhlIG9wdGlvbiBpbmRleCBoZXJlLiAqLwotCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhrbnAiLCBsb25nX29wdCwgJm9wdF9pZHgpOworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImFoa25wIiwgbG9uZ19vcHQsICZvcHRfaWR4KTsKIAogCQkvKiBEZXRlY3QgdGhlIGVuZCBvZiB0aGUgb3B0aW9ucy4gKi8KIAkJaWYgKGMgPT0gLTEpIHsKQEAgLTI5MSw2ICszMjYsMTMgQEAKIAkJfQogCiAJCXN3aXRjaCAoYykgeworCQljYXNlICdhJzoKKwkJCWtleV9hbGcgPSBnZXRfa2V5X2FsZyhvcHRhcmcpOworCQkJaWYgKGtleV9hbGcgPCAwKSB7CisJCQkJRVJST1IoIkludmFsaWQga2V5IGFsZ29yaXRobSAnJXMnXG4iLCBvcHRhcmcpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKIAkJY2FzZSAnaCc6CiAJCQlwcmludF9oZWxwKGFyZ3ZbMF0pOwogCQkJYnJlYWs7CkBAIC0zODksMjQgKzQzMSw1MCBAQAogCQlleGl0KDEpOwogCX0KIAorCS8qIEluZGljYXRlIFNIQTI1NiBhcyBpbWFnZSBoYXNoIGFsZ29yaXRobSBpbiB0aGUgY2VydGlmaWNhdGUKKwkgKiBleHRlbnNpb24gKi8KKwltZF9pbmZvID0gRVZQX3NoYTI1NigpOworCiAJLyogR2V0IG5vbi12b2xhdGlsZSBjb3VudGVycyBOSURzICovCiAJQ0hFQ0tfT0lEKHR6X252Y3RyX25pZCwgVFpfRldfTlZDT1VOVEVSX09JRCk7CiAJQ0hFQ0tfT0lEKG50el9udmN0cl9uaWQsIE5UWl9GV19OVkNPVU5URVJfT0lEKTsKIAogCS8qIExvYWQgcHJpdmF0ZSBrZXlzIGZyb20gZmlsZXMgKG9yIGdlbmVyYXRlIG5ldyBvbmVzKSAqLwotCWlmIChuZXdfa2V5cykgewotCQlmb3IgKGkgPSAwIDsgaSA8IE5VTV9LRVlTIDsgaSsrKSB7Ci0JCQlpZiAoIWtleV9uZXcoJmtleXNbaV0pKSB7Ci0JCQkJRVJST1IoIkVycm9yIGNyZWF0aW5nICVzXG4iLCBrZXlzW2ldLmRlc2MpOwotCQkJCWV4aXQoMSk7Ci0JCQl9CisJZm9yIChpID0gMCA7IGkgPCBOVU1fS0VZUyA7IGkrKykgeworCQkvKiBGaXJzdCB0cnkgdG8gbG9hZCB0aGUga2V5IGZyb20gZGlzayAqLworCQlpZiAoa2V5X2xvYWQoJmtleXNbaV0sICZlcnJfY29kZSkpIHsKKwkJCS8qIEtleSBsb2FkZWQgc3VjY2Vzc2Z1bGx5ICovCisJCQljb250aW51ZTsKIAkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDAgOyBpIDwgTlVNX0tFWVMgOyBpKyspIHsKLQkJCWlmICgha2V5X2xvYWQoJmtleXNbaV0pKSB7Ci0JCQkJRVJST1IoIkVycm9yIGxvYWRpbmcgJXNcbiIsIGtleXNbaV0uZGVzYyk7CisKKwkJLyogS2V5IG5vdCBsb2FkZWQuIENoZWNrIHRoZSBlcnJvciBjb2RlICovCisJCWlmIChlcnJfY29kZSA9PSBLRVlfRVJSX01BTExPQykgeworCQkJLyogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeS4gQWJvcnQuICovCisJCQlFUlJPUigiTWFsbG9jIGVycm9yIHdoaWxlIGxvYWRpbmcgJyVzJ1xuIiwga2V5c1tpXS5mbik7CisJCQlleGl0KDEpOworCQl9IGVsc2UgaWYgKGVycl9jb2RlID09IEtFWV9FUlJfTE9BRCkgeworCQkJLyogRmlsZSBleGlzdHMsIGJ1dCBpdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcHJpdmF0ZQorCQkJICoga2V5LiBBYm9ydC4gKi8KKwkJCUVSUk9SKCJFcnJvciBsb2FkaW5nICclcydcbiIsIGtleXNbaV0uZm4pOworCQkJZXhpdCgxKTsKKwkJfQorCisJCS8qIEZpbGUgZG9lcyBub3QgZXhpc3QsIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3Igbm8gZmlsZW5hbWUgd2FzCisJCSAqIGdpdmVuICovCisJCWlmIChuZXdfa2V5cykgeworCQkJLyogVHJ5IHRvIGNyZWF0ZSBhIG5ldyBrZXkgKi8KKwkJCU5PVElDRSgiQ3JlYXRpbmcgbmV3IGtleSBmb3IgJyVzJ1xuIiwga2V5c1tpXS5kZXNjKTsKKwkJCWlmICgha2V5X2NyZWF0ZSgma2V5c1tpXSwga2V5X2FsZykpIHsKKwkJCQlFUlJPUigiRXJyb3IgY3JlYXRpbmcga2V5ICclcydcbiIsIGtleXNbaV0uZGVzYyk7CiAJCQkJZXhpdCgxKTsKIAkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChlcnJfY29kZSA9PSBLRVlfRVJSX09QRU4pIHsKKwkJCQlFUlJPUigiRXJyb3Igb3BlbmluZyAnJXMnXG4iLCBrZXlzW2ldLmZuKTsKKwkJCX0gZWxzZSB7CisJCQkJRVJST1IoIktleSAnJXMnIG5vdCBzcGVjaWZpZWRcbiIsIGtleXNbaV0uZGVzYyk7CisJCQl9CisJCQlleGl0KDEpOwogCQl9CiAJfQogCkBAIC00MzAsNyArNDk4LDcgQEAKIAkJZXhpdCgxKTsKIAl9CiAJQ0hFQ0tfT0lEKGhhc2hfbmlkLCBCTDJfSEFTSF9PSUQpOwotCUNIRUNLX05VTEwoaGFzaF9leHQsIGV4dF9uZXdfaGFzaChoYXNoX25pZCwgRVhUX0NSSVQsIG1kLAorCUNIRUNLX05VTEwoaGFzaF9leHQsIGV4dF9uZXdfaGFzaChoYXNoX25pZCwgRVhUX0NSSVQsIG1kX2luZm8sIG1kLAogCQkJU0hBMjU2X0RJR0VTVF9MRU5HVEgpKTsKIAlza19YNTA5X0VYVEVOU0lPTl9wdXNoKHNrLCBoYXNoX2V4dCk7CiAKQEAgLTUwOSw4ICs1NzcsOCBAQAogCQkJZXhpdCgxKTsKIAkJfQogCQlDSEVDS19PSUQoaGFzaF9uaWQsIEJMMzBfSEFTSF9PSUQpOwotCQlDSEVDS19OVUxMKGhhc2hfZXh0LCBleHRfbmV3X2hhc2goaGFzaF9uaWQsIEVYVF9DUklULCBtZCwKLQkJCQlTSEEyNTZfRElHRVNUX0xFTkdUSCkpOworCQlDSEVDS19OVUxMKGhhc2hfZXh0LCBleHRfbmV3X2hhc2goaGFzaF9uaWQsIEVYVF9DUklULCBtZF9pbmZvLAorCQkJCW1kLCBTSEEyNTZfRElHRVNUX0xFTkdUSCkpOwogCQlza19YNTA5X0VYVEVOU0lPTl9wdXNoKHNrLCBoYXNoX2V4dCk7CiAKIAkJaWYgKCFjZXJ0X25ldygmY2VydHNbQkwzMF9DRVJUXSwgVkFMX0RBWVMsIDAsIHNrKSkgewpAQCAtNTU5LDcgKzYyNyw3IEBACiAJCWV4aXQoMSk7CiAJfQogCUNIRUNLX09JRChoYXNoX25pZCwgQkwzMV9IQVNIX09JRCk7Ci0JQ0hFQ0tfTlVMTChoYXNoX2V4dCwgZXh0X25ld19oYXNoKGhhc2hfbmlkLCBFWFRfQ1JJVCwgbWQsCisJQ0hFQ0tfTlVMTChoYXNoX2V4dCwgZXh0X25ld19oYXNoKGhhc2hfbmlkLCBFWFRfQ1JJVCwgbWRfaW5mbywgbWQsCiAJCQlTSEEyNTZfRElHRVNUX0xFTkdUSCkpOwogCXNrX1g1MDlfRVhURU5TSU9OX3B1c2goc2ssIGhhc2hfZXh0KTsKIApAQCAtNjEyLDggKzY4MCw4IEBACiAJCQlleGl0KDEpOwogCQl9CiAJCUNIRUNLX09JRChoYXNoX25pZCwgQkwzMl9IQVNIX09JRCk7Ci0JCUNIRUNLX05VTEwoaGFzaF9leHQsIGV4dF9uZXdfaGFzaChoYXNoX25pZCwgRVhUX0NSSVQsIG1kLAotCQkJCVNIQTI1Nl9ESUdFU1RfTEVOR1RIKSk7CisJCUNIRUNLX05VTEwoaGFzaF9leHQsIGV4dF9uZXdfaGFzaChoYXNoX25pZCwgRVhUX0NSSVQsIG1kX2luZm8sCisJCQkJbWQsIFNIQTI1Nl9ESUdFU1RfTEVOR1RIKSk7CiAJCXNrX1g1MDlfRVhURU5TSU9OX3B1c2goc2ssIGhhc2hfZXh0KTsKIAogCQlpZiAoIWNlcnRfbmV3KCZjZXJ0c1tCTDMyX0NFUlRdLCBWQUxfREFZUywgMCwgc2spKSB7CkBAIC02NjIsNyArNzMwLDcgQEAKIAkJZXhpdCgxKTsKIAl9CiAJQ0hFQ0tfT0lEKGhhc2hfbmlkLCBCTDMzX0hBU0hfT0lEKTsKLQlDSEVDS19OVUxMKGhhc2hfZXh0LCBleHRfbmV3X2hhc2goaGFzaF9uaWQsIEVYVF9DUklULCBtZCwKKwlDSEVDS19OVUxMKGhhc2hfZXh0LCBleHRfbmV3X2hhc2goaGFzaF9uaWQsIEVYVF9DUklULCBtZF9pbmZvLCBtZCwKIAkJCVNIQTI1Nl9ESUdFU1RfTEVOR1RIKSk7CiAJc2tfWDUwOV9FWFRFTlNJT05fcHVzaChzaywgaGFzaF9leHQpOwogCg==