ZGlmZiAtLWdpdCBhL3NyYy9jaGFyc2V0LmMgYi9zcmMvY2hhcnNldC5jCmluZGV4IGMxNGJlZjAuLmM3Njk0ODYgMTAwNjQ0Ci0tLSBhL3NyYy9jaGFyc2V0LmMKKysrIGIvc3JjL2NoYXJzZXQuYwpAQCAtMTUzMSw2ICsxNTMxLDEyMiBAQAogCXx8IChjID49ICdBJyAmJiBjIDw9ICdGJyk7CiB9CiAKKyNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCisvKgorICogVmltJ3Mgb3duIGNoYXJhY3RlciBjbGFzcyBmdW5jdGlvbnMuICBUaGVzZSBleGlzdCBiZWNhdXNlIG1hbnkgbGlicmFyeQorICogaXNsb3dlcigpL3RvdXBwZXIoKSBldGMuIGRvIG5vdCB3b3JrIHByb3Blcmx5OiB0aGV5IGNyYXNoIHdoZW4gdXNlZCB3aXRoCisgKiBpbnZhbGlkIHZhbHVlcyBvciBjYW4ndCBoYW5kbGUgbGF0aW4xIHdoZW4gdGhlIGxvY2FsZSBpcyBDLgorICogU3BlZWQgaXMgbW9zdCBpbXBvcnRhbnQgaGVyZS4KKyAqLworI2RlZmluZSBMQVRJTjFMT1dFUiAnbCcKKyNkZWZpbmUgTEFUSU4xVVBQRVIgJ1UnCisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdJV8nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/ICovCitzdGF0aWMgY2hhcl91IGxhdGluMWZsYWdzWzI1Nl0gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSAgICAgIGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUgVVVVVVVVVWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbCBsbGxsbGxsbCI7CitzdGF0aWMgY2hhcl91IGxhdGluMXVwcGVyWzI1Nl0gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e38DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW99jZ2tvc3d7/IjsKK3N0YXRpYyBjaGFyX3UgbGF0aW4xbG93ZXJbMjU2XSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eltcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX21/j5+vv8/f7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8iOworCisgICAgaW50Cit2aW1faXNsb3dlcihjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBpZiAoYyA8PSAnQCcpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChjID49IDB4ODApCisgICAgeworCWlmIChlbmNfdXRmOCkKKwkgICAgcmV0dXJuIHV0Zl9pc2xvd2VyKGMpOworCWlmIChjID49IDB4MTAwKQorCXsKKyNpZmRlZiBIQVZFX0lTV0xPV0VSCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXJldHVybiBpc3dsb3dlcihjKTsKKyNlbmRpZgorCSAgICAvKiBpc2xvd2VyKCkgY2FuJ3QgaGFuZGxlIHRoZXNlIGNoYXJzIGFuZCBtYXkgY3Jhc2ggKi8KKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoZW5jX2xhdGluMWxpa2UpCisJICAgIHJldHVybiAobGF0aW4xZmxhZ3NbY10gJiBMQVRJTjFMT1dFUikgPT0gTEFUSU4xTE9XRVI7CisgICAgfQorICAgIHJldHVybiBpc2xvd2VyKGMpOworfQorCisgICAgaW50Cit2aW1faXN1cHBlcihjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBpZiAoYyA8PSAnQCcpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChjID49IDB4ODApCisgICAgeworCWlmIChlbmNfdXRmOCkKKwkgICAgcmV0dXJuIHV0Zl9pc3VwcGVyKGMpOworCWlmIChjID49IDB4MTAwKQorCXsKKyNpZmRlZiBIQVZFX0lTV1VQUEVSCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXJldHVybiBpc3d1cHBlcihjKTsKKyNlbmRpZgorCSAgICAvKiBpc2xvd2VyKCkgY2FuJ3QgaGFuZGxlIHRoZXNlIGNoYXJzIGFuZCBtYXkgY3Jhc2ggKi8KKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoZW5jX2xhdGluMWxpa2UpCisJICAgIHJldHVybiAobGF0aW4xZmxhZ3NbY10gJiBMQVRJTjFVUFBFUikgPT0gTEFUSU4xVVBQRVI7CisgICAgfQorICAgIHJldHVybiBpc3VwcGVyKGMpOworfQorCisgICAgaW50Cit2aW1fdG91cHBlcihjKQorICAgIGludAkgICAgYzsKK3sKKyAgICBpZiAoYyA8PSAnQCcpCisJcmV0dXJuIGM7CisgICAgaWYgKGMgPj0gMHg4MCkKKyAgICB7CisJaWYgKGVuY191dGY4KQorCSAgICByZXR1cm4gdXRmX3RvdXBwZXIoYyk7CisJaWYgKGMgPj0gMHgxMDApCisJeworI2lmZGVmIEhBVkVfVE9XVVBQRVIKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkJcmV0dXJuIHRvd3VwcGVyKGMpOworI2VuZGlmCisJICAgIC8qIHRvdXBwZXIoKSBjYW4ndCBoYW5kbGUgdGhlc2UgY2hhcnMgYW5kIG1heSBjcmFzaCAqLworCSAgICByZXR1cm4gYzsKKwl9CisJaWYgKGVuY19sYXRpbjFsaWtlKQorCSAgICByZXR1cm4gbGF0aW4xdXBwZXJbY107CisgICAgfQorICAgIHJldHVybiBUT1VQUEVSX0xPQyhjKTsKK30KKworICAgIGludAordmltX3RvbG93ZXIoYykKKyAgICBpbnQJICAgIGM7Cit7CisgICAgaWYgKGMgPD0gJ0AnKQorCXJldHVybiBjOworICAgIGlmIChjID49IDB4ODApCisgICAgeworCWlmIChlbmNfdXRmOCkKKwkgICAgcmV0dXJuIHV0Zl90b2xvd2VyKGMpOworCWlmIChjID49IDB4MTAwKQorCXsKKyNpZmRlZiBIQVZFX1RPV0xPV0VSCisJICAgIGlmIChoYXNfbWJ5dGUpCisJCXJldHVybiB0b3dsb3dlcihjKTsKKyNlbmRpZgorCSAgICAvKiB0b2xvd2VyKCkgY2FuJ3QgaGFuZGxlIHRoZXNlIGNoYXJzIGFuZCBtYXkgY3Jhc2ggKi8KKwkgICAgcmV0dXJuIGM7CisJfQorCWlmIChlbmNfbGF0aW4xbGlrZSkKKwkgICAgcmV0dXJuIGxhdGluMWxvd2VyW2NdOworICAgIH0KKyAgICByZXR1cm4gVE9MT1dFUl9MT0MoYyk7Cit9CisjZW5kaWYKKwogLyoKICAqIHNraXB0b3doaXRlOiBza2lwIG92ZXIgdGV4dCB1bnRpbCAnICcgb3IgJ1x0JyBvciBOVUwuCiAgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWNyb3MuaCBiL3NyYy9tYWNyb3MuaAppbmRleCBkMTg4MTNjLi45MzEwYmRkIDEwMDY0NAotLS0gYS9zcmMvbWFjcm9zLmgKKysrIGIvc3JjL21hY3Jvcy5oCkBAIC04MSwxMyArODEsMTMgQEAKIAogLyoKICAqIE1CX0lTTE9XRVIoKSBhbmQgTUJfSVNVUFBFUigpIGFyZSB0byBiZSB1c2VkIG9uIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gIEJ1dAotICogZG9uJ3QgdXNlIHRoZW0gZm9yIG5lZ2F0aXZlIHZhbHVlcy4KKyAqIGRvbid0IHVzZSB0aGVtIGZvciBuZWdhdGl2ZSB2YWx1ZXMhCiAgKi8KICNpZmRlZiBGRUFUX01CWVRFCi0jIGRlZmluZSBNQl9JU0xPV0VSKGMpCShlbmNfdXRmOCAmJiAoYykgPj0gMHg4MCA/IHV0Zl9pc2xvd2VyKGMpIDogKGhhc19tYnl0ZSAmJiBjID4gMjU1ID8gRkFMU0UgOiBpc2xvd2VyKGMpKSkKLSMgZGVmaW5lIE1CX0lTVVBQRVIoYykJKGVuY191dGY4ICYmIChjKSA+PSAweDgwID8gdXRmX2lzdXBwZXIoYykgOiAoaGFzX21ieXRlICYmIGMgPiAyNTUgPyBGQUxTRSA6IGlzdXBwZXIoYykpKQotIyBkZWZpbmUgTUJfVE9MT1dFUihjKQkoZW5jX3V0ZjggJiYgKGMpID49IDB4ODAgPyB1dGZfdG9sb3dlcihjKSA6IChoYXNfbWJ5dGUgJiYgYyA+IDI1NSA/IGMgOiBUT0xPV0VSX0xPQyhjKSkpCi0jIGRlZmluZSBNQl9UT1VQUEVSKGMpCShlbmNfdXRmOCAmJiAoYykgPj0gMHg4MCA/IHV0Zl90b3VwcGVyKGMpIDogKGhhc19tYnl0ZSAmJiBjID4gMjU1ID8gYyA6IFRPVVBQRVJfTE9DKGMpKSkKKyMgZGVmaW5lIE1CX0lTTE9XRVIoYykJdmltX2lzbG93ZXIoYykKKyMgZGVmaW5lIE1CX0lTVVBQRVIoYykJdmltX2lzdXBwZXIoYykKKyMgZGVmaW5lIE1CX1RPTE9XRVIoYykJdmltX3RvbG93ZXIoYykKKyMgZGVmaW5lIE1CX1RPVVBQRVIoYykJdmltX3RvdXBwZXIoYykKICNlbHNlCiAjIGRlZmluZSBNQl9JU0xPV0VSKGMpCWlzbG93ZXIoYykKICMgZGVmaW5lIE1CX0lTVVBQRVIoYykJaXN1cHBlcihjKQpkaWZmIC0tZ2l0IGEvc3JjL21ieXRlLmMgYi9zcmMvbWJ5dGUuYwppbmRleCA1ZmI0NTU2Li45ZjJkZjNhIDEwMDY0NAotLS0gYS9zcmMvbWJ5dGUuYworKysgYi9zcmMvbWJ5dGUuYwpAQCAtNTg0LDYgKzU4NCwxMCBAQAogICAgIGVuY19sYXRpbjkgPSAoU1RSQ01QKHBfZW5jLCAiaXNvLTg4NTktMTUiKSA9PSAwKTsKICNlbmRpZgogCisgICAgLyogRGV0ZWN0IGFuIGVuY29kaW5nIHRoYXQgdXNlcyBsYXRpbjEgY2hhcmFjdGVycy4gKi8KKyAgICBlbmNfbGF0aW4xbGlrZSA9IChlbmNfdXRmOCB8fCBTVFJDTVAocF9lbmMsICJsYXRpbjEiKSA9PSAwCisJCQkJCXx8IFNUUkNNUChwX2VuYywgImlzby04ODU5LTE1IikgPT0gMCk7CisKICAgICAvKgogICAgICAqIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMuCiAgICAgICovCmRpZmYgLS1naXQgYS9zcmMvb3NfbWFjb3N4LmMgYi9zcmMvb3NfbWFjb3N4LmMKaW5kZXggZDM2MTk1OC4uOGU5ZDU1ZCAxMDA2NDQKLS0tIGEvc3JjL29zX21hY29zeC5jCisrKyBiL3NyYy9vc19tYWNvc3guYwpAQCAtODUsNiArODUsNyBAQAogCXsiaXNvLTg4NTktOCIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbkhlYnJld30sCiAJeyJpc28tODg1OS05Iiwga1RleHRFbmNvZGluZ0lTT0xhdGluNX0sCiAJeyJpc28tODg1OS0xMCIsIGtUZXh0RW5jb2RpbmdJU09MYXRpbjZ9LAorCXsiaXNvLTg4NTktMTUiLCBrVGV4dEVuY29kaW5nSVNPTGF0aW45fSwKIAogCS8qIFVuaWNvZGUgZW5jb2RpbmdzLiAqLwogCS8qIFRPRE86IEFkZCBvdGhlciB0eXBlIG9mIHVuaWNvZGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9wby9NYWtlZmlsZSBiL3NyYy9wby9NYWtlZmlsZQppbmRleCBmNDI4MTg3Li5hMDY0ODg4IDEwMDY0NAotLS0gYS9zcmMvcG8vTWFrZWZpbGUKKysrIGIvc3JjL3BvL01ha2VmaWxlCkBAIC0yNiw4ICsyNiw3IEBACiAJCXpoX0NOIFwKIAkJemhfQ04uVVRGLTggXAogCQl6aF9UVyBcCi0JCXpoX1RXLlVURi04IFwKLSMgZW5kIG1hcmtlcgorCQl6aF9UVy5VVEYtOAogCiBNT0ZJTEVTID0gXAogCQlhZi5tbyBcCkBAIC01MSw4ICs1MCw3IEBACiAJCXpoX0NOLlVURi04Lm1vIFwKIAkJemhfQ04ubW8gXAogCQl6aF9UVy5VVEYtOC5tbyBcCi0JCXpoX1RXLm1vIFwKLSMgZW5kIG1hcmtlcgorCQl6aF9UVy5tbwogCiBDT05WRVJURUQgPSBcCiAJCWNzLmNwMTI1MC5tbyBcCkBAIC02MSw4ICs1OSw3IEBACiAJCXJ1LmNwMTI1MS5tbyBcCiAJCXNrLmNwMTI1MC5tbyBcCiAJCXVrLmNwMTI1MS5tbyBcCi0JCXpoX0NOLmNwOTM2Lm1vIFwKLSMgZW5kIG1hcmtlcgorCQl6aF9DTi5jcDkzNi5tbwogCiBDSEVDS0ZJTEVTID0gXAogCQlhZi5jayBcCkBAIC05Myw4ICs5MCw3IEBACiAJCXJ1LmNwMTI1MS5jayBcCiAJCXNrLmNwMTI1MC5jayBcCiAJCXVrLmNwMTI1MS5jayBcCi0JCXpoX0NOLmNwOTM2LmNrIFwKLSMgZW5kIG1hcmtlcgorCQl6aF9DTi5jcDkzNi5jawogCiBQQUNLQUdFID0gdmltCiBTSEVMTCA9IC9iaW4vc2gKZGlmZiAtLWdpdCBhL3NyYy9wcm90by9jaGFyc2V0LnBybyBiL3NyYy9wcm90by9jaGFyc2V0LnBybwppbmRleCA0MzdlODg1Li40YjY4OTBkIDEwMDY0NAotLS0gYS9zcmMvcHJvdG8vY2hhcnNldC5wcm8KKysrIGIvc3JjL3Byb3RvL2NoYXJzZXQucHJvCkBAIC0zOCw2ICszOCwxMCBAQAogY2hhcl91ICpza2lwdG9oZXggX19BUkdTKChjaGFyX3UgKnApKTsKIGludCB2aW1faXNkaWdpdCBfX0FSR1MoKGludCBjKSk7CiBpbnQgdmltX2lzeGRpZ2l0IF9fQVJHUygoaW50IGMpKTsKK2ludCB2aW1faXNsb3dlciBfX0FSR1MoKGludCBjKSk7CitpbnQgdmltX2lzdXBwZXIgX19BUkdTKChpbnQgYykpOworaW50IHZpbV90b3VwcGVyIF9fQVJHUygoaW50IGMpKTsKK2ludCB2aW1fdG9sb3dlciBfX0FSR1MoKGludCBjKSk7CiBjaGFyX3UgKnNraXB0b3doaXRlIF9fQVJHUygoY2hhcl91ICpwKSk7CiBjaGFyX3UgKnNraXB0b3doaXRlX2VzYyBfX0FSR1MoKGNoYXJfdSAqcCkpOwogbG9uZyBnZXRkaWdpdHMgX19BUkdTKChjaGFyX3UgKipwcCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3JlZ2V4cC5jIGIvc3JjL3JlZ2V4cC5jCmluZGV4IGY4Yjg2MTYuLmUyMTJjYzAgMTAwNjQ0Ci0tLSBhL3NyYy9yZWdleHAuYworKysgYi9zcmMvcmVnZXhwLmMKQEAgLTc0Miw3ICs3NDIsNyBAQAogewogI2lmZGVmIEZFQVRfTUJZVEUKICAgICBpZiAoZW5jX3V0ZjggfHwgU1RSQ01QKHBfZW5jLCAibGF0aW4xIikgPT0gMAotCQkJCQkgICAgICB8fCBTVFJDTVAocF9lbmMsICJsYXRpbjkiKSA9PSAwKQorCQkJCQkgfHwgU1RSQ01QKHBfZW5jLCAiaXNvLTg4NTktMTUiKSA9PSAwKQogI2VuZGlmCiAgICAgewogCXN3aXRjaCAoYykKZGlmZiAtLWdpdCBhL3NyYy9zcGVsbC5jIGIvc3JjL3NwZWxsLmMKaW5kZXggZGQwZmU4My4uMTI4MzczYSAxMDA2NDQKLS0tIGEvc3JjL3NwZWxsLmMKKysrIGIvc3JjL3NwZWxsLmMKQEAgLTE2Miw2ICsxNjIsOCBAQAogICogPGNvbXBmbGFncz4gICBOIGJ5dGVzICAgIEZsYWdzIGZyb20gQ09NUE9VTkRGTEFHUyBpdGVtcywgc2VwYXJhdGVkIGJ5CiAgKgkJCSAgICBzbGFzaGVzLgogICoKKyAqIHNlY3Rpb25JRCA9PSBTTl9OT0JSRUFLOiAoZW1wdHksIGl0cyBwcmVzZW5jZSBpcyBlbm91Z2gpCisgKgogICogc2VjdGlvbklEID09IFNOX1NZTExBQkxFOiA8c3lsbGFibGU+CiAgKiA8c3lsbGFibGU+ICAgIE4gYnl0ZXMgICAgU3RyaW5nIGZyb20gU1lMTEFCTEUgaXRlbS4KICAqCkBAIC0zNzgsNiArMzgwLDcgQEAKIAkJCQkgKiAoTlVMTCB3aGVuIG5vIGNvbXBvdW5kaW5nKSAqLwogICAgIGNoYXJfdQkqc2xfY29tcHN0YXJ0ZmxhZ3M7IC8qIGZsYWdzIGZvciBmaXJzdCBjb21wb3VuZCB3b3JkICovCiAgICAgY2hhcl91CSpzbF9jb21wYWxsZmxhZ3M7IC8qIGFsbCBmbGFncyBmb3IgY29tcG91bmQgd29yZHMgKi8KKyAgICBjaGFyX3UJc2xfbm9icmVhazsJLyogV2hlbiBUUlVFOiBubyBzcGFjZXMgYmV0d2VlbiB3b3JkcyAqLwogICAgIGNoYXJfdQkqc2xfc3lsbGFibGU7CS8qIFNZTExBQkxFIHJlcGVhdGFibGUgY2hhcnMgb3IgTlVMTCAqLwogICAgIGdhcnJheV9UCXNsX3N5bF9pdGVtczsJLyogc3lsbGFibGUgaXRlbXMgKi8KIApAQCAtNDQyLDYgKzQ0NSw3IEBACiAjZGVmaW5lIFNOX01BUAkJNwkvKiBNQVAgaXRlbXMgc2VjdGlvbiAqLwogI2RlZmluZSBTTl9DT01QT1VORAk4CS8qIGNvbXBvdW5kIHdvcmRzIHNlY3Rpb24gKi8KICNkZWZpbmUgU05fU1lMTEFCTEUJOQkvKiBzeWxsYWJsZSBzZWN0aW9uICovCisjZGVmaW5lIFNOX05PQlJFQUsJMTAJLyogTk9CUkVBSyBzZWN0aW9uICovCiAjZGVmaW5lIFNOX0VORAkJMjU1CS8qIGVuZCBvZiBzZWN0aW9ucyAqLwogCiAjZGVmaW5lIFNORl9SRVFVSVJFRAkxCS8qIDxzZWN0aW9uZmxhZ3M+OiByZXF1aXJlZCBzZWN0aW9uICovCkBAIC01NjAsNiArNTY0LDEwIEBACiAgICAgaW50CQltaV9yZXN1bHQ7CQkvKiByZXN1bHQgc28gZmFyOiBTUF9CQUQsIFNQX09LLCBldGMuICovCiAgICAgaW50CQltaV9jYXBmbGFnczsJCS8qIFdGX09ORUNBUCBXRl9BTExDQVAgV0ZfS0VFUENBUCAqLwogICAgIGJ1Zl9UCSptaV9idWY7CQkvKiBidWZmZXIgYmVpbmcgY2hlY2tlZCAqLworCisgICAgLyogZm9yIE5PQlJFQUsgKi8KKyAgICBpbnQJCW1pX3Jlc3VsdDI7CQkvKiAibWlfcmVzdWwiIHdpdGhvdXQgZm9sbG93aW5nIHdvcmQgKi8KKyAgICBjaGFyX3UJKm1pX2VuZDI7CQkvKiAibWlfZW5kIiB3aXRob3V0IGZvbGxvd2luZyB3b3JkICovCiB9IG1hdGNoaW5mX1Q7CiAKIC8qCkBAIC02MzgsNiArNjQ2LDcgQEAKICNlbmRpZgogICAgIGNoYXJfdQl0c19wcmV3b3JkbGVuOwkvKiBsZW5ndGggb2Ygd29yZCBpbiAicHJld29yZFtdIiAqLwogICAgIGNoYXJfdQl0c19zcGxpdG9mZjsJLyogaW5kZXggaW4gInR3b3JkIiBhZnRlciBsYXN0IHNwbGl0ICovCisgICAgY2hhcl91CXRzX3NwbGl0ZmlkeDsJLyogInRzX2ZpZHgiIGF0IHdvcmQgc3BsaXQgKi8KICAgICBjaGFyX3UJdHNfY29tcGxlbjsJLyogbnIgb2YgY29tcG91bmQgd29yZHMgdXNlZCAqLwogICAgIGNoYXJfdQl0c19jb21wc3BsaXQ7CS8qIGluZGV4IGZvciAiY29tcGZsYWdzIiB3aGVyZSB3b3JkIHdhcyBzcGl0ICovCiAgICAgY2hhcl91CXRzX3NhdmVfYmFkZmxhZ3M7ICAgLyogc3VfYmFkZmxhZ3Mgc2F2ZWQgaGVyZSAqLwpAQCAtODg3LDYgKzg5Niw3IEBACiAKICAgICAvKiBUaGUgd29yZCBpcyBiYWQgdW5sZXNzIHdlIHJlY29nbml6ZSBpdC4gKi8KICAgICBtaS5taV9yZXN1bHQgPSBTUF9CQUQ7CisgICAgbWkubWlfcmVzdWx0MiA9IFNQX0JBRDsKIAogICAgIC8qCiAgICAgICogTG9vcCBvdmVyIHRoZSBsYW5ndWFnZXMgc3BlY2lmaWVkIGluICdzcGVsbGxhbmcnLgpAQCAtOTA0LDYgKzkxNCwxNSBAQAogCiAJLyogQ2hlY2sgZm9yIG1hdGNoaW5nIHByZWZpeGVzLiAqLwogCWZpbmRfcHJlZml4KCZtaSwgRklORF9GT0xEV09SRCk7CisKKwkvKiBGb3IgYSBOT0JSRUFLIGxhbmd1YWdlLCBtYXkgd2FudCB0byB1c2UgYSB3b3JkIHdpdGhvdXQgYSBmb2xsb3dpbmcKKwkgKiB3b3JkIGFzIGEgYmFja3VwLiAqLworCWlmIChtaS5taV9scC0+bHBfc2xhbmctPnNsX25vYnJlYWsgJiYgbWkubWlfcmVzdWx0ID09IFNQX0JBRAorCQkJCQkJICAgJiYgbWkubWlfcmVzdWx0MiAhPSBTUF9CQUQpCisJeworCSAgICBtaS5taV9yZXN1bHQgPSBtaS5taV9yZXN1bHQyOworCSAgICBtaS5taV9lbmQgPSBtaS5taV9lbmQyOworCX0KICAgICB9CiAKICAgICBpZiAobWkubWlfcmVzdWx0ICE9IFNQX09LKQpAQCAtOTQxLDYgKzk2MCwzMyBAQAogCSAgICAvKiBBbHdheXMgaW5jbHVkZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLiAgUmVxdWlyZWQgZm9yIHdoZW4gdGhlcmUKIAkgICAgICogaXMgYSBtaXh1cCBpbiAibWlkd29yZCIuICovCiAJICAgIG1iX3B0cl9hZHYobWkubWlfZW5kKTsKKwllbHNlIGlmIChtaS5taV9yZXN1bHQgPT0gU1BfQkFECisJCSYmIExBTkdQX0VOVFJZKHdwLT53X2J1ZmZlci0+Yl9sYW5ncCwgMCktPmxwX3NsYW5nLT5zbF9ub2JyZWFrKQorCXsKKwkgICAgY2hhcl91CSpwLCAqZnA7CisJICAgIGludAkJc2F2ZV9yZXN1bHQgPSBtaS5taV9yZXN1bHQ7CisKKwkgICAgLyogRmlyc3QgbGFuZ3VhZ2UgaW4gJ3NwZWxsbGFuZycgaXMgTk9CUkVBSy4gIEZpbmQgZmlyc3QgcG9zaXRpb24KKwkgICAgICogYXQgd2hpY2ggYW55IHdvcmQgd291bGQgYmUgdmFsaWQuICovCisJICAgIG1pLm1pX2xwID0gTEFOR1BfRU5UUlkod3AtPndfYnVmZmVyLT5iX2xhbmdwLCAwKTsKKwkgICAgcCA9IG1pLm1pX3dvcmQ7CisJICAgIGZwID0gbWkubWlfZndvcmQ7CisJICAgIGZvciAoOzspCisJICAgIHsKKwkJbWJfcHRyX2FkdihwKTsKKwkJbWJfcHRyX2FkdihmcCk7CisJCWlmIChwID49IG1pLm1pX2VuZCkKKwkJICAgIGJyZWFrOworCQltaS5taV9jb21wb2ZmID0gZnAgLSBtaS5taV9md29yZDsKKwkJZmluZF93b3JkKCZtaSwgRklORF9DT01QT1VORCk7CisJCWlmIChtaS5taV9yZXN1bHQgIT0gU1BfQkFEKQorCQl7CisJCSAgICBtaS5taV9lbmQgPSBwOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBtaS5taV9yZXN1bHQgPSBzYXZlX3Jlc3VsdDsKKwl9CiAKIAlpZiAobWkubWlfcmVzdWx0ID09IFNQX0JBRCB8fCBtaS5taV9yZXN1bHQgPT0gU1BfQkFOTkVEKQogCSAgICAqYXR0cnAgPSBoaWdobGlnaHRfYXR0cltITEZfU1BCXTsKQEAgLTk5NSw2ICsxMDQxLDcgQEAKICAgICBpZHhfVAkqaWR4czsKICAgICBpbnQJCXdvcmRfZW5kczsKICAgICBpbnQJCXByZWZpeF9mb3VuZDsKKyAgICBpbnQJCW5vYnJlYWtfcmVzdWx0OwogCiAgICAgaWYgKG1vZGUgPT0gRklORF9LRUVQV09SRCB8fCBtb2RlID09IEZJTkRfS0VFUENPTVBPVU5EKQogICAgIHsKQEAgLTExMzcsNyArMTE4NCw3IEBACiAjZW5kaWYKIAlpZiAoc3BlbGxfaXN3b3JkcChwdHIgKyB3bGVuLCBtaXAtPm1pX2J1ZikpCiAJewotCSAgICBpZiAoc2xhbmctPnNsX2NvbXBwcm9nID09IE5VTEwpCisJICAgIGlmIChzbGFuZy0+c2xfY29tcHByb2cgPT0gTlVMTCAmJiAhc2xhbmctPnNsX25vYnJlYWspCiAJCWNvbnRpbnVlOwkgICAgLyogbmV4dCBjaGFyIGlzIGEgd29yZCBjaGFyYWN0ZXIgKi8KIAkgICAgd29yZF9lbmRzID0gRkFMU0U7CiAJfQpAQCAtMTIxMCw4ICsxMjU3LDIwIEBACiAJCXByZWZpeF9mb3VuZCA9IFRSVUU7CiAJICAgIH0KIAotCSAgICBpZiAobW9kZSA9PSBGSU5EX0NPTVBPVU5EIHx8IG1vZGUgPT0gRklORF9LRUVQQ09NUE9VTkQKLQkJCQkJCQkJfHwgIXdvcmRfZW5kcykKKwkgICAgaWYgKHNsYW5nLT5zbF9ub2JyZWFrKQorCSAgICB7CisJCWlmICgobW9kZSA9PSBGSU5EX0NPTVBPVU5EIHx8IG1vZGUgPT0gRklORF9LRUVQQ09NUE9VTkQpCisJCQkmJiAoZmxhZ3MgJiBXRl9CQU5ORUQpID09IDApCisJCXsKKwkJICAgIC8qIE5PQlJFQUs6IGZvdW5kIGEgdmFsaWQgZm9sbG93aW5nIHdvcmQuICBUaGF0J3MgYWxsIHdlCisJCSAgICAgKiBuZWVkIHRvIGtub3csIHNvIHJldHVybi4gKi8KKwkJICAgIG1pcC0+bWlfcmVzdWx0ID0gU1BfT0s7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisKKwkgICAgZWxzZSBpZiAoKG1vZGUgPT0gRklORF9DT01QT1VORCB8fCBtb2RlID09IEZJTkRfS0VFUENPTVBPVU5ECisJCQkJCQkJCXx8ICF3b3JkX2VuZHMpKQogCSAgICB7CiAJCS8qIElmIHRoZXJlIGlzIG5vICBmbGFnIG9yIHRoZSB3b3JkIGlzIHNob3J0ZXIgdGhhbgogCQkgKiBDT01QT1VORE1JTiByZWplY3QgaXQgcXVpY2tseS4KQEAgLTEyOTUsMTEgKzEzNTQsMjAgQEAKIAkJfQogCSAgICB9CiAKKwkgICAgbm9icmVha19yZXN1bHQgPSBTUF9PSzsKKwogCSAgICBpZiAoIXdvcmRfZW5kcykKIAkgICAgewotCQkvKiBDaGVjayB0aGF0IGEgdmFsaWQgd29yZCBmb2xsb3dzLiAgSWYgdGhlcmUgaXMgb25lLCBpdCB3aWxsCi0JCSAqIHNldCAibWlfcmVzdWx0IiwgdGh1cyB3ZSBhcmUgYWx3YXlzIGZpbmlzaGVkIGhlcmUuCisJCWludAlzYXZlX3Jlc3VsdCA9IG1pcC0+bWlfcmVzdWx0OworCQljaGFyX3UJKnNhdmVfZW5kID0gbWlwLT5taV9lbmQ7CisKKwkJLyogQ2hlY2sgdGhhdCBhIHZhbGlkIHdvcmQgZm9sbG93cy4gIElmIHRoZXJlIGlzIG9uZSBhbmQgd2UKKwkJICogYXJlIGNvbXBvdW5kaW5nLCBpdCB3aWxsIHNldCAibWlfcmVzdWx0IiwgdGh1cyB3ZSBhcmUKKwkJICogYWx3YXlzIGZpbmlzaGVkIGhlcmUuICBGb3IgTk9CUkVBSyB3ZSBvbmx5IGNoZWNrIHRoYXQgYQorCQkgKiB2YWxpZCB3b3JkIGZvbGxvd3MuCiAJCSAqIFJlY3Vyc2l2ZSEgKi8KKwkJaWYgKHNsYW5nLT5zbF9ub2JyZWFrKQorCQkgICAgbWlwLT5taV9yZXN1bHQgPSBTUF9CQUQ7CiAKIAkJLyogRmluZCBmb2xsb3dpbmcgd29yZCBpbiBjYXNlLWZvbGRlZCB0cmVlLiAqLwogCQltaXAtPm1pX2NvbXBvZmYgPSBlbmRsZW5bZW5kaWR4Y250XTsKQEAgLTEzMjMsMTggKzEzOTEsMzYgQEAKIAkJKyttaXAtPm1pX2NvbXBsZW47CiAJCWZpbmRfd29yZChtaXAsIEZJTkRfQ09NUE9VTkQpOwogCi0JCS8qIEZpbmQgZm9sbG93aW5nIHdvcmQgaW4ga2VlcC1jYXNlIHRyZWUuICovCi0JCW1pcC0+bWlfY29tcG9mZiA9IHdsZW47Ci0JCWZpbmRfd29yZChtaXAsIEZJTkRfS0VFUENPTVBPVU5EKTsKKwkJLyogV2hlbiBOT0JSRUFLIGFueSB3b3JkIHRoYXQgbWF0Y2hlcyBpcyBPSy4gIE90aGVyd2lzZSB3ZQorCQkgKiBuZWVkIHRvIGZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIHRodXMgdHJ5IHdpdGgga2VlcC1jYXNlIGFuZAorCQkgKiBwcmVmaXggdG9vLiAqLworCQlpZiAoIXNsYW5nLT5zbF9ub2JyZWFrIHx8IG1pcC0+bWlfcmVzdWx0ID09IFNQX0JBRCkKKwkJeworCQkgICAgLyogRmluZCBmb2xsb3dpbmcgd29yZCBpbiBrZWVwLWNhc2UgdHJlZS4gKi8KKwkJICAgIG1pcC0+bWlfY29tcG9mZiA9IHdsZW47CisJCSAgICBmaW5kX3dvcmQobWlwLCBGSU5EX0tFRVBDT01QT1VORCk7CiAKLQkJLyogQ2hlY2sgZm9yIGZvbGxvd2luZyB3b3JkIHdpdGggcHJlZml4LiAqLwotCQltaXAtPm1pX2NvbXBvZmYgPSBjOwotCQlmaW5kX3ByZWZpeChtaXAsIEZJTkRfQ09NUE9VTkQpOworCQkgICAgaWYgKCFzbGFuZy0+c2xfbm9icmVhayB8fCBtaXAtPm1pX3Jlc3VsdCA9PSBTUF9CQUQpCisJCSAgICB7CisJCQkvKiBDaGVjayBmb3IgZm9sbG93aW5nIHdvcmQgd2l0aCBwcmVmaXguICovCisJCQltaXAtPm1pX2NvbXBvZmYgPSBjOworCQkJZmluZF9wcmVmaXgobWlwLCBGSU5EX0NPTVBPVU5EKTsKKwkJICAgIH0KKwkJfQogCQktLW1pcC0+bWlfY29tcGxlbjsKIAotCQlpZiAobWlwLT5taV9yZXN1bHQgPT0gU1BfT0spCi0JCSAgICBicmVhazsKLQkJY29udGludWU7CisJCWlmIChzbGFuZy0+c2xfbm9icmVhaykKKwkJeworCQkgICAgbm9icmVha19yZXN1bHQgPSBtaXAtPm1pX3Jlc3VsdDsKKwkJICAgIG1pcC0+bWlfcmVzdWx0ID0gc2F2ZV9yZXN1bHQ7CisJCSAgICBtaXAtPm1pX2VuZCA9IHNhdmVfZW5kOworCQl9CisJCWVsc2UKKwkJeworCQkgICAgaWYgKG1pcC0+bWlfcmVzdWx0ID09IFNQX09LKQorCQkJYnJlYWs7CisJCSAgICBjb250aW51ZTsKKwkJfQogCSAgICB9CiAKIAkgICAgaWYgKGZsYWdzICYgV0ZfQkFOTkVEKQpAQCAtMTM1Miw4ICsxNDM4LDIxIEBACiAJICAgIGVsc2UKIAkJcmVzID0gU1BfT0s7CiAKLQkgICAgLyogQWx3YXlzIHVzZSB0aGUgbG9uZ2VzdCBtYXRjaCBhbmQgdGhlIGJlc3QgcmVzdWx0LiAqLwotCSAgICBpZiAobWlwLT5taV9yZXN1bHQgPiByZXMpCisJICAgIC8qIEFsd2F5cyB1c2UgdGhlIGxvbmdlc3QgbWF0Y2ggYW5kIHRoZSBiZXN0IHJlc3VsdC4gIEZvciBOT0JSRUFLCisJICAgICAqIHdlIHNlcGFyYXRlbHkga2VlcCB0aGUgbG9uZ2VzdCBtYXRjaCB3aXRob3V0IGEgZm9sbG93aW5nIGdvb2QKKwkgICAgICogd29yZCBhcyBhIGZhbGwtYmFjay4gKi8KKwkgICAgaWYgKG5vYnJlYWtfcmVzdWx0ID09IFNQX0JBRCkKKwkgICAgeworCQlpZiAobWlwLT5taV9yZXN1bHQyID4gcmVzKQorCQl7CisJCSAgICBtaXAtPm1pX3Jlc3VsdDIgPSByZXM7CisJCSAgICBtaXAtPm1pX2VuZDIgPSBtaXAtPm1pX3dvcmQgKyB3bGVuOworCQl9CisJCWVsc2UgaWYgKG1pcC0+bWlfcmVzdWx0MiA9PSByZXMKKwkJCQkJJiYgbWlwLT5taV9lbmQyIDwgbWlwLT5taV93b3JkICsgd2xlbikKKwkJICAgIG1pcC0+bWlfZW5kMiA9IG1pcC0+bWlfd29yZCArIHdsZW47CisJICAgIH0KKwkgICAgZWxzZSBpZiAobWlwLT5taV9yZXN1bHQgPiByZXMpCiAJICAgIHsKIAkJbWlwLT5taV9yZXN1bHQgPSByZXM7CiAJCW1pcC0+bWlfZW5kID0gbWlwLT5taV93b3JkICsgd2xlbjsKQEAgLTEzNjEsMTEgKzE0NjAsMTEgQEAKIAkgICAgZWxzZSBpZiAobWlwLT5taV9yZXN1bHQgPT0gcmVzICYmIG1pcC0+bWlfZW5kIDwgbWlwLT5taV93b3JkICsgd2xlbikKIAkJbWlwLT5taV9lbmQgPSBtaXAtPm1pX3dvcmQgKyB3bGVuOwogCi0JICAgIGlmIChyZXMgPT0gU1BfT0spCisJICAgIGlmIChtaXAtPm1pX3Jlc3VsdCA9PSBTUF9PSykKIAkJYnJlYWs7CiAJfQogCi0JaWYgKHJlcyA9PSBTUF9PSykKKwlpZiAobWlwLT5taV9yZXN1bHQgPT0gU1BfT0spCiAJICAgIGJyZWFrOwogICAgIH0KIH0KQEAgLTIyMjQsNiArMjMyMywxMCBAQAogCQlyZXMgPSByZWFkX2NvbXBvdW5kKGZkLCBscCwgbGVuKTsKIAkJYnJlYWs7CiAKKwkgICAgY2FzZSBTTl9OT0JSRUFLOgorCQlscC0+c2xfbm9icmVhayA9IFRSVUU7CisJCWJyZWFrOworCiAJICAgIGNhc2UgU05fU1lMTEFCTEU6CiAJCWxwLT5zbF9zeWxsYWJsZSA9IHJlYWRfc3RyaW5nKGZkLCBsZW4pOwkvKiA8c3lsbGFibGU+ICovCiAJCWlmIChscC0+c2xfc3lsbGFibGUgPT0gTlVMTCkKQEAgLTM5NTEsNiArNDA1NCw3IEBACiAgICAgaW50CQlzaV9jb21wbWlubGVuOwkvKiBtaW5pbWFsIGxlbmd0aCBmb3IgY29tcG91bmRpbmcgKi8KICAgICBpbnQJCXNpX2NvbXBzeWxtYXg7CS8qIG1heCBuciBvZiBzeWxsYWJsZXMgZm9yIGNvbXBvdW5kaW5nICovCiAgICAgY2hhcl91CSpzaV9jb21wZmxhZ3M7CS8qIGZsYWdzIHVzZWQgZm9yIGNvbXBvdW5kaW5nICovCisgICAgY2hhcl91CXNpX25vYnJlYWs7CS8qIE5PQlJFQUsgKi8KICAgICBjaGFyX3UJKnNpX3N5bGxhYmxlOwkvKiBzeWxsYWJsZSBzdHJpbmcgKi8KICAgICBnYXJyYXlfVAlzaV9wcmVmY29uZDsJLyogdGFibGUgd2l0aCBjb25kaXRpb25zIGZvciBwb3N0cG9uZWQKIAkJCQkgKiBwcmVmaXhlcywgZWFjaCBzdG9yZWQgYXMgYSBzdHJpbmcgKi8KQEAgLTQzNjIsNiArNDQ2NiwxMCBAQAogCSAgICB7CiAJCWFmZi0+YWZfc3lsbGFibGUgPSBnZXRyb29tX3NhdmUoc3BpbiwgaXRlbXNbMV0pOwogCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIk5PQlJFQUsiKSA9PSAwICYmIGl0ZW1jbnQgPT0gMSkKKwkgICAgeworCQlzcGluLT5zaV9ub2JyZWFrID0gVFJVRTsKKwkgICAgfQogCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJQRlhQT1NUUE9ORSIpID09IDAgJiYgaXRlbWNudCA9PSAxKQogCSAgICB7CiAJCWFmZi0+YWZfcGZ4cG9zdHBvbmUgPSBUUlVFOwpAQCAtNjQ0MSw2ICs2NTQ5LDE2IEBACiAJZndyaXRlKHNwaW4tPnNpX2NvbXBmbGFncywgKHNpemVfdClsLCAoc2l6ZV90KTEsIGZkKTsKICAgICB9CiAKKyAgICAvKiBTTl9OT0JSRUFLOiBOT0JSRUFLIGZsYWcgKi8KKyAgICBpZiAoc3Bpbi0+c2lfbm9icmVhaykKKyAgICB7CisJcHV0YyhTTl9OT0JSRUFLLCBmZCk7CQkJCS8qIDxzZWN0aW9uSUQ+ICovCisJcHV0YygwLCBmZCk7CQkJCQkvKiA8c2VjdGlvbmZsYWdzPiAqLworCisJLyogSXQncyBlbXB0eSwgdGhlIHByZWNlbnNlIG9mIHRoZSBzZWN0aW9uIGZsYWdzIHRoZSBmZWF0dXJlLiAqLworCXB1dF9ieXRlcyhmZCwgKGxvbmdfdSkwLCA0KTsJCQkvKiA8c2VjdGlvbmxlbj4gKi8KKyAgICB9CisKICAgICAvKiBTTl9TWUxMQUJMRTogc3lsbGFibGUgaW5mby4KICAgICAgKiBXZSBkb24ndCBtYXJrIGl0IHJlcXVpcmVkLCB3aGVuIG5vdCBzdXBwb3J0ZWQgc3lsbGFibGVzIHdpbGwgbm90IGJlCiAgICAgICogY291bnRlZC4gKi8KQEAgLTY4NjEsNiArNjk3OSw5IEBACiAjZW5kaWYKIAl9CiAKKwlpZiAoc3Bpbi5zaV9jb21wZmxhZ3MgIT0gTlVMTCAmJiBzcGluLnNpX25vYnJlYWspCisJICAgIE1TRyhfKCJXYXJuaW5nOiBib3RoIGNvbXBvdW5kaW5nIGFuZCBOT0JSRUFLIHNwZWNpZmllZCIpKTsKKwogCWlmICghZXJyb3IpCiAJewogCSAgICAvKgpAQCAtODM2MCw3ICs4NDgxLDIwIEBACiAJZWxzZQogI2VuZGlmCiAJICAgIGMgPSAqcysrOwotCWMgPSBTUEVMTF9UT1VQUEVSKGMpOworCisjaWZkZWYgRkVBVF9NQllURQorCS8qIFdlIG9ubHkgY2hhbmdlIN8gdG8gU1Mgd2hlbiB3ZSBhcmUgY2VydGFpbiBsYXRpbjEgaXMgdXNlZC4gIEl0CisJICogd291bGQgY2F1c2Ugd2VpcmQgZXJyb3JzIGluIG90aGVyIDgtYml0IGVuY29kaW5ncy4gKi8KKwlpZiAoZW5jX2xhdGluMWxpa2UgJiYgYyA9PSAweGRmKQorCXsKKwkgICAgYyA9ICdTJzsKKwkgICAgaWYgKGQgLSB3Y29weSA+PSBNQVhXTEVOIC0gMSkKKwkJYnJlYWs7CisJICAgICpkKysgPSBjOworCX0KKwllbHNlCisjZW5kaWYKKwkgICAgYyA9IFNQRUxMX1RPVVBQRVIoYyk7CiAKICNpZmRlZiBGRUFUX01CWVRFCiAJaWYgKGhhc19tYnl0ZSkKQEAgLTg2MjksMjkgKzg3NjMsNTIgQEAKIAogCQlpZiAoc3AtPnRzX2NvbXBsZW4gPiBzcC0+dHNfY29tcHNwbGl0KQogCQl7Ci0JCSAgICAvKiBUaGVyZSB3YXMgYSBjb21wb3VuZCB3b3JkIGJlZm9yZSB0aGlzIHdvcmQuICBJZiB0aGlzCi0JCSAgICAgKiB3b3JkIGRvZXMgbm90IHN1cHBvcnQgY29tcG91bmRpbmcgdGhlbiBnaXZlIHVwCi0JCSAgICAgKiAoc3BsaXR0aW5nIGlzIHRyaWVkIGZvciB0aGUgd29yZCB3aXRob3V0IGNvbXBvdW5kCi0JCSAgICAgKiBmbGFnKS4gKi8KLQkJICAgIGlmICgoKHVuc2lnbmVkKWZsYWdzID4+IDI0KSA9PSAwCi0JCQkgICAgfHwgc3AtPnRzX3R3b3JkbGVuIC0gc3AtPnRzX3NwbGl0b2ZmCisJCSAgICBpZiAoc2xhbmctPnNsX25vYnJlYWspCisJCSAgICB7CisJCQkvKiBUaGVyZSB3YXMgYSB3b3JkIGJlZm9yZSB0aGlzIHdvcmQuICBXaGVuIHRoZXJlIHdhcworCQkJICogbm8gY2hhbmdlIGluIHRoaXMgd29yZCAoaXQgd2FzIGNvcnJlY3QpIGFkZCB0aGUKKwkJCSAqIGZpcnN0IHdvcmQgYXMgYSBzdWdnZXN0aW9uLiAgSWYgdGhpcyB3b3JkIHdhcworCQkJICogY29ycmVjdGVkIHRvbywgd2UgbmVlZCB0byBjaGVjayBpZiBhIGNvcnJlY3Qgd29yZAorCQkJICogZm9sbG93cy4gKi8KKwkJCWlmIChzcC0+dHNfZmlkeCAtIHNwLT50c19zcGxpdGZpZHgKKwkJCQkJICA9PSBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYKKwkJCQkmJiBTVFJOQ01QKGZ3b3JkICsgc3AtPnRzX3NwbGl0ZmlkeCwKKwkJCQkJICAgIHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAorCQkJCQkgc3AtPnRzX2ZpZHggLSBzcC0+dHNfc3BsaXRmaWR4KSA9PSAwKQorCQkJeworCQkJICAgIHByZXdvcmRbc3AtPnRzX3ByZXdvcmRsZW5dID0gTlVMOworCQkJICAgIGFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBwcmV3b3JkLAorCQkJCQlzcC0+dHNfc3BsaXRmaWR4IC0gcmVwZXh0cmEsCisJCQkJCQkgICAgICBzcC0+dHNfc2NvcmUsIDAsIEZBTFNFKTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qIFRoZXJlIHdhcyBhIGNvbXBvdW5kIHdvcmQgYmVmb3JlIHRoaXMgd29yZC4gIElmCisJCQkgKiB0aGlzIHdvcmQgZG9lcyBub3Qgc3VwcG9ydCBjb21wb3VuZGluZyB0aGVuIGdpdmUgdXAKKwkJCSAqIChzcGxpdHRpbmcgaXMgdHJpZWQgZm9yIHRoZSB3b3JkIHdpdGhvdXQgY29tcG91bmQKKwkJCSAqIGZsYWcpLiAqLworCQkJaWYgKCgodW5zaWduZWQpZmxhZ3MgPj4gMjQpID09IDAKKwkJCQl8fCBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYKIAkJCQkJCSAgICAgICA8IHNsYW5nLT5zbF9jb21wbWlubGVuKQotCQkJYnJlYWs7Ci0JCSAgICBjb21wZmxhZ3Nbc3AtPnRzX2NvbXBsZW5dID0gKCh1bnNpZ25lZClmbGFncyA+PiAyNCk7Ci0JCSAgICBjb21wZmxhZ3Nbc3AtPnRzX2NvbXBsZW4gKyAxXSA9IE5VTDsKLQkJICAgIHZpbV9zdHJuY3B5KHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbiwKLQkJCSAgICB0d29yZCArIHNwLT50c19zcGxpdG9mZiwKLQkJCSAgICBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYpOwotCQkgICAgcCA9IHByZXdvcmQ7Ci0JCSAgICB3aGlsZSAoKnNraXB0b3doaXRlKHApICE9IE5VTCkKLQkJCXAgPSBza2lwd2hpdGUoc2tpcHRvd2hpdGUocCkpOwotCQkgICAgaWYgKGZ3b3JkX2VuZHMgJiYgIWNhbl9jb21wb3VuZChzbGFuZywgcCwKKwkJCSAgICBicmVhazsKKwkJCWNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbl0gPSAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KTsKKwkJCWNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbiArIDFdID0gTlVMOworCQkJdmltX3N0cm5jcHkocHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLAorCQkJCXR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAorCQkJCXNwLT50c190d29yZGxlbiAtIHNwLT50c19zcGxpdG9mZik7CisJCQlwID0gcHJld29yZDsKKwkJCXdoaWxlICgqc2tpcHRvd2hpdGUocCkgIT0gTlVMKQorCQkJICAgIHAgPSBza2lwd2hpdGUoc2tpcHRvd2hpdGUocCkpOworCQkJaWYgKGZ3b3JkX2VuZHMgJiYgIWNhbl9jb21wb3VuZChzbGFuZywgcCwKIAkJCQkJCWNvbXBmbGFncyArIHNwLT50c19jb21wc3BsaXQpKQotCQkJYnJlYWs7CisJCQkgICAgYnJlYWs7CiAKLQkJICAgIC8qIEdldCBwb2ludGVyIHRvIGxhc3QgY2hhciBvZiBwcmV2aW91cyB3b3JkLiAqLwotCQkgICAgcCA9IHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbjsKLQkJICAgIG1iX3B0cl9iYWNrKHByZXdvcmQsIHApOworCQkJLyogR2V0IHBvaW50ZXIgdG8gbGFzdCBjaGFyIG9mIHByZXZpb3VzIHdvcmQuICovCisJCQlwID0gcHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuOworCQkJbWJfcHRyX2JhY2socHJld29yZCwgcCk7CisJCSAgICB9CiAJCX0KIAkJZWxzZQogCQkgICAgcCA9IE5VTEw7CkBAIC04NzUzLDYgKzg5MTAsOCBAQAogCQkgICAgICogICAgSWYgdGhlIHdvcmQgYWxsb3dzIGNvbXBvdW5kaW5nIHRyeSB0aGF0LiAgT3RoZXJ3aXNlCiAJCSAgICAgKiAgICB0cnkgYSBzcGxpdCBieSBpbnNlcnRpbmcgYSBzcGFjZS4gIEZvciBib3RoIGNoZWNrCiAJCSAgICAgKiAgICB0aGF0IGEgdmFsaWQgd29yZHMgc3RhcnRzIGF0IGZ3b3JkW3NwLT50c19maWR4XS4KKwkJICAgICAqICAgIEZvciBOT0JSRUFLIGRvIGxpa2UgY29tcG91bmRpbmcgdG8gYmUgYWJsZSB0byBjaGVjaworCQkgICAgICogICAgaWYgdGhlIG5leHQgd29yZCBpcyB2YWxpZC4KIAkJICAgICAqIDIuIFRoZSBiYWR3b3JkIGRvZXMgZW5kLCBidXQgaXQgd2FzIGR1ZSB0byBhIGNoYW5nZQogCQkgICAgICogICAgKGUuZy4sIGEgc3dhcCkuICBObyBuZWVkIHRvIHNwbGl0LCBidXQgZG8gY2hlY2sgdGhhdAogCQkgICAgICogICAgdGhlIGZvbGxvd2luZyB3b3JkIGlzIHZhbGlkLgpAQCAtODc3NSwxMCArODkzNCwxNSBAQAogCQkJY29tcGZsYWdzW3NwLT50c19jb21wbGVuICsgMV0gPSBOVUw7CiAJCSAgICB9CiAKKwkJICAgIC8qIEZvciBOT0JSRUFLIHdlIG5ldmVyIHRyeSBzcGxpdHRpbmcsIGl0IHdvbid0IG1ha2UgYW55CisJCSAgICAgKiB3b3JkIHZhbGlkLiAqLworCQkgICAgaWYgKHNsYW5nLT5zbF9ub2JyZWFrKQorCQkJdHJ5X2NvbXBvdW5kID0gVFJVRTsKKwogCQkgICAgLyogSWYgd2UgY291bGQgYWRkIGEgY29tcG91bmQgd29yZCwgYW5kIGl0J3MgYWxzbyBwb3NzaWJsZQogCQkgICAgICogdG8gc3BsaXQgYXQgdGhpcyBwb2ludCwgZG8gdGhlIHNwbGl0IGZpcnN0IGFuZCBzZXQKIAkJICAgICAqIFRTRl9ESURTUExJVCB0byBhdm9pZCBkb2luZyBpdCBhZ2Fpbi4gKi8KLQkJICAgIGlmICghZndvcmRfZW5kcworCQkgICAgZWxzZSBpZiAoIWZ3b3JkX2VuZHMKIAkJCSAgICAmJiB0cnlfY29tcG91bmQKIAkJCSAgICAmJiAoc3AtPnRzX2ZsYWdzICYgVFNGX0RJRFNQTElUKSA9PSAwKQogCQkgICAgewpAQCAtODgxOCw2ICs4OTgyLDcgQEAKIAkJCSAgICBTVFJDQVQocHJld29yZCwgIiAiKTsKIAkJCXNwLT50c19wcmV3b3JkbGVuID0gU1RSTEVOKHByZXdvcmQpOwogCQkJc3AtPnRzX3NwbGl0b2ZmID0gc3AtPnRzX3R3b3JkbGVuOworCQkJc3AtPnRzX3NwbGl0ZmlkeCA9IHNwLT50c19maWR4OwogCiAJCQkvKiBJZiB0aGUgYmFkd29yZCBoYXMgYSBub24td29yZCBjaGFyYWN0ZXIgYXQgdGhpcwogCQkJICogcG9zaXRpb24gc2tpcCBpdC4gIFRoYXQgbWVhbnMgcmVwbGFjaW5nIHRoZQo=