ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWlpbyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWlpbwppbmRleCA5YTcwYzMxLi4zYmVmY2IxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1paW8KKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaWlvCkBAIC0yNTMsNiArMjUzLDggQEAKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9wcmVzc3VyZVlfb2Zmc2V0CiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fcHJlc3N1cmVfb2Zmc2V0CiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5faHVtaWRpdHlyZWxhdGl2ZV9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9tYWduX29mZnNldAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3JvdF9vZmZzZXQKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0yOTYsNiArMjk4LDcgQEAKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9wcmVzc3VyZV9zY2FsZQogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2h1bWlkaXR5cmVsYXRpdmVfc2NhbGUKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl92ZWxvY2l0eV9zcXJ0KHheMit5XjIrel4yKV9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlX3NjYWxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMzM2LDYgKzMzOSw3IEBACiB3aGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9wcm94aW1pdHkwX2NhbGlic2NhbGUKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9wcmVzc3VyZVlfY2FsaWJzY2FsZQogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ByZXNzdXJlX2NhbGlic2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9pbGx1bWluYW5jZV9jYWxpYnNjYWxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMzQ3LDcgKzM1MSw3IEBACiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fZW5lcmd5X2NhbGliZ2VuZGVyCiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fZGlzdGFuY2VfY2FsaWJnZW5kZXIKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl92ZWxvY2l0eV9jYWxpYmdlbmRlcgotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJR2VuZGVyIG9mIHRoZSB1c2VyIChlLmcuOiBtYWxlLCBmZW1hbGUpIHVzZWQgYnkgc29tZSBwZWRvbWV0ZXJzCkBAIC0zNTgsNyArMzYyLDcgQEAKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9lbmVyZ3lfY2FsaWJnZW5kZXJfYXZhaWxhYmxlCiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fZGlzdGFuY2VfY2FsaWJnZW5kZXJfYXZhaWxhYmxlCiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdmVsb2NpdHlfY2FsaWJnZW5kZXJfYXZhaWxhYmxlCi1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjAKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlMaXN0cyBhbGwgYXZhaWxhYmxlIGdlbmRlciB2YWx1ZXMgKGUuZy46IG1hbGUsIGZlbWFsZSkuCkBAIC0zNzUsNyArMzc5LDcgQEAKIAkJdHlwZS4KIAogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2VuZXJneV9jYWxpYndlaWdodAotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJV2VpZ2h0IG9mIHRoZSB1c2VyIChpbiBrZykuIEl0IGlzIG5lZWRlZCBieSBzb21lIHBlZG9tZXRlcnMKQEAgLTYxMiw2ICs2MTYsOCBAQAogCQlhIGdpdmVuIGV2ZW50IHR5cGUgaXMgZW5hYmxlZCBhIGZ1dHVyZSBwb2ludCAoYW5kIG5vdCB0aG9zZSBmb3IKIAkJd2hhdGV2ZXIgZXZlbnQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCkuCiAKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF90aHJlc2hfZmFsbGluZ192YWx1ZQogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCiBXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCiBXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3lfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKQEAgLTY2MSw2ICs2NjcsMjQgQEAKIAkJdmFsdWUgaXMgaW4gcmF3IGRldmljZSB1bml0cyBvciBpbiBwcm9jZXNzZWQgdW5pdHMgKGFzIF9yYXcKIAkJYW5kIF9pbnB1dCBkbyBvbiBzeXNmcyBkaXJlY3QgY2hhbm5lbCByZWFkIGF0dHJpYnV0ZXMpLgogCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3NjYWxlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3BlYWtfc2NhbGUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF9zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9tYWduX3NjYWxlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3JvdF9mcm9tX25vcnRoX21hZ25ldGljX3NjYWxlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3JvdF9mcm9tX25vcnRoX3RydWVfc2NhbGUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZV9zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl92b2x0YWdlX3N1cHBseV9zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl90ZW1wX3NjYWxlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2lsbHVtaW5hbmNlX3NjYWxlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3Byb3hpbWl0eV9zY2FsZQorS2VybmVsVmVyc2lvbjoJMy4yMQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBjb252ZXJzaW9uIGZhY3RvciBmcm9tIHRoZSBzdGFuZGFyZCB1bml0cworICAgICAgICAgICAgICAgIHRvIGRldmljZSBzcGVjaWZpYyB1bml0cyB1c2VkIHRvIHNldCB0aGUgZXZlbnQgdHJpZ2dlcgorICAgICAgICAgICAgICAgIHRocmVzaG9sZC4KKwogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3RocmVzaF9yaXNpbmdfaHlzdGVyZXNpcwogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3RocmVzaF9mYWxsaW5nX2h5c3RlcmVzaXMKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF90aHJlc2hfZWl0aGVyX2h5c3RlcmVzaXMKQEAgLTc3Niw3ICs4MDAsNyBAQAogCiBXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfdGhyZXNoX3Jpc2luZ19wZXJpb2QKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF90aHJlc2hfZmFsbGluZ19wZXJpb2QKLWhhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfcm9jX3Jpc2luZ19wZXJpb2QKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF9yb2NfZmFsbGluZ19wZXJpb2QKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeV90aHJlc2hfcmlzaW5nX3BlcmlvZAogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF95X3RocmVzaF9mYWxsaW5nX3BlcmlvZApAQCAtOTIzLDcgKzk0Nyw3IEBACiAJCXRoaXMgdHlwZS4KIAogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9zdGVwc19jaGFuZ2VfZW4KLUtlcm5lbFZlcnNpb246CTMuMjAKK0tlcm5lbFZlcnNpb246CTQuMAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUV2ZW50IGdlbmVyYXRlZCB3aGVuIGNoYW5uZWwgcGFzc2VzIGEgdGhyZXNob2xkIG9uIHRoZSBhYnNvbHV0ZQpAQCAtOTMyLDcgKzk1Niw3IEBACiAJCWluX3N0ZXBzX2NoYW5nZV92YWx1ZS4KIAogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9zdGVwc19jaGFuZ2VfdmFsdWUKLUtlcm5lbFZlcnNpb246CTMuMjAKK0tlcm5lbFZlcnNpb246CTQuMAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVNwZWNpZmllcyB0aGUgdmFsdWUgb2YgY2hhbmdlIHRocmVzaG9sZCB0aGF0IHRoZQpAQCAtOTk3LDYgKzEwMjEsNyBAQAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcHJlc3N1cmVZX2VuCiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvc2Nhbl9lbGVtZW50cy9pbl9wcmVzc3VyZV9lbgogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcm90X3F1YXRlcm5pb25fZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3Byb3hpbWl0eV9lbgogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTEwMTMsNiArMTAzOCw3IEBACiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvc2Nhbl9lbGVtZW50cy9pbl9wcmVzc3VyZVlfdHlwZQogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcHJlc3N1cmVfdHlwZQogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcm90X3F1YXRlcm5pb25fdHlwZQorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcHJveGltaXR5X3R5cGUKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMDY0LDYgKzEwOTAsNyBAQAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcHJlc3N1cmVZX2luZGV4CiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvc2Nhbl9lbGVtZW50cy9pbl9wcmVzc3VyZV9pbmRleAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcm90X3F1YXRlcm5pb25faW5kZXgKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3Byb3hpbWl0eV9pbmRleAogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTExMDQsNyArMTEzMSw3IEBACiAKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9lbmVyZ3lfaW5wdXQKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9lbmVyZ3lfcmF3Ci1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjAKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHJlYWQgdGhlIGVuZXJneSB2YWx1ZSByZXBvcnRlZCBieSB0aGUKQEAgLTExMTMsNyArMTE0MCw3IEBACiAKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9kaXN0YW5jZV9pbnB1dAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2Rpc3RhbmNlX3JhdwotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byByZWFkIHRoZSBkaXN0YW5jZSBjb3ZlcmVkIGJ5IHRoZSB1c2VyCkBAIC0xMTQzLDkgKzExNzAsMTMgQEAKIAkJdmFsdWVzIHNob3VsZCBiZWhhdmUgaW4gdGhlIHNhbWUgd2F5IGFzIGEgZGlzdGFuY2UsIGkuZS4gbG93ZXIKIAkJdmFsdWVzIGluZGljYXRlIHNvbWV0aGluZyBpcyBjbG9zZXIgdG8gdGhlIHNlbnNvci4KIAorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlX2lucHV0CitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5faWxsdW1pbmFuY2VfcmF3CiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5faWxsdW1pbmFuY2VZX2lucHV0CiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5faWxsdW1pbmFuY2VZX3JhdwogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlWV9tZWFuX3JhdworV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlX2lyX3JhdworV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlX2NsZWFyX3JhdwogS2VybmVsVmVyc2lvbjoJMy40CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTExNzQsNyArMTIwNSw3IEBACiAJCXNlY29uZHMuCiAKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl92ZWxvY2l0eV9zcXJ0KHheMit5XjIrel4yKV9pbnRlZ3JhdGlvbl90aW1lCi1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjAKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlOdW1iZXIgb2Ygc2Vjb25kcyBpbiB3aGljaCB0byBjb21wdXRlIHNwZWVkLgpAQCAtMTIzNiw3ICsxMjY3LDcgQEAKIAkJVW5pdHMgYWZ0ZXIgYXBwbGljYXRpb24gb2Ygc2NhbGUgYXJlIG0vcy4KIAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX3N0ZXBzX2RlYm91bmNlX2NvdW50Ci1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjAKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdGVwcyB0aGF0IG11c3Qgb2NjdXIgd2l0aGluCkBAIC0xMjQ0LDggKzEyNzUsOTIgQEAKIAkJY29uc3VtZXIgaXMgbWFraW5nIHN0ZXBzLgogCiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5fc3RlcHNfZGVib3VuY2VfdGltZQotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJU3BlY2lmaWVzIG51bWJlciBvZiBzZWNvbmRzIGluIHdoaWNoIHdlIGNvbXB1dGUgdGhlIHN0ZXBzCiAJCXRoYXQgb2NjdXIgaW4gb3JkZXIgdG8gZGVjaWRlIGlmIHRoZSBjb25zdW1lciBpcyBtYWtpbmcgc3RlcHMuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9idWZmZXIvd2F0ZXJtYXJrCitLZXJuZWxWZXJzaW9uOgk0LjIKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlBIHNpbmdsZSBwb3NpdGl2ZSBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYW4KKwkJZWxlbWVudHMgdG8gd2FpdCBmb3IuCisJCVBvbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgd2F0ZXJtYXJrIGlzIHJlYWNoZWQuCisJCUJsb2NraW5nIHJlYWQgd2lsbCB3YWl0IHVudGlsIHRoZSBtaW5pbXVtIGJldHdlZW4gdGhlIHJlcXVlc3RlZAorCQlyZWFkIGFtb3VudCBvciB0aGUgbG93IHdhdGVyIG1hcmsgaXMgYXZhaWxhYmxlLgorCQlOb24tYmxvY2tpbmcgcmVhZCB3aWxsIHJldHJpZXZlIHRoZSBhdmFpbGFibGUgc2FtcGxlcyBmcm9tIHRoZQorCQlidWZmZXIgZXZlbiBpZiB0aGVyZSBhcmUgbGVzcyBzYW1wbGVzIHRoZW4gd2F0ZXJtYXJrIGxldmVsLiBUaGlzCisJCWFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gYmxvY2sgb24gcG9sbCB3aXRoIGEgdGltZW91dCBhbmQgcmVhZAorCQl0aGUgYXZhaWxhYmxlIHNhbXBsZXMgYWZ0ZXIgdGhlIHRpbWVvdXQgZXhwaXJlcyBhbmQgdGh1cyBoYXZlIGEKKwkJbWF4aW11bSBkZWxheSBndWFyYW50ZWUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9idWZmZXIvaHdmaWZvX2VuYWJsZWQKK0tlcm5lbFZlcnNpb246IDQuMgorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUEgcmVhZC1vbmx5IGJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIGhhcmR3YXJlIGZpZm8gaXMKKwkJY3VycmVudGx5IGVuYWJsZWQgb3IgZGlzYWJsZWQuIElmIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhCisJCWhhcmR3YXJlIGZpZm8gdGhpcyBlbnRyeSBpcyBub3QgcHJlc2VudC4KKwkJVGhlIGhhcmR3YXJlIGZpZm8gaXMgZW5hYmxlZCB3aGVuIHRoZSBidWZmZXIgaXMgZW5hYmxlZCBpZiB0aGUKKwkJY3VycmVudCBoYXJkd2FyZSBmaWZvIHdhdGVybWFyayBsZXZlbCBpcyBzZXQgYW5kIG90aGVyIGN1cnJlbnQKKwkJZGV2aWNlIHNldHRpbmdzIGFsbG93cyBpdCAoZS5nLiBpZiBhIHRyaWdnZXIgaXMgc2V0IHRoYXQgc2FtcGxlcworCQlkYXRhIGRpZmZlcmVudGx5IHRoYXQgdGhlIGhhcmR3YXJlIGZpZm8gZG9lcyB0aGVuIGhhcmR3YXJlIGZpZm8KKwkJd2lsbCBub3QgZW5hYmxlZCkuCisJCUlmIHRoZSBoYXJkd2FyZSBmaWZvIGlzIGVuYWJsZWQgYW5kIHRoZSBsZXZlbCBvZiB0aGUgaGFyZHdhcmUKKwkJZmlmbyByZWFjaGVzIHRoZSBoYXJkd2FyZSBmaWZvIHdhdGVybWFyayBsZXZlbCB0aGUgZGV2aWNlIHdpbGwKKwkJZmx1c2ggaXRzIGhhcmR3YXJlIGZpZm8gdG8gdGhlIGRldmljZSBidWZmZXIuIERvaW5nIGEgbm9uCisJCWJsb2NraW5nIHJlYWQgb24gdGhlIGRldmljZSB3aGVuIG5vIHNhbXBsZXMgYXJlIHByZXNlbnQgaW4gdGhlCisJCWRldmljZSBidWZmZXIgd2lsbCBhbHNvIGZvcmNlIGEgZmx1c2guCisJCVdoZW4gdGhlIGhhcmR3YXJlIGZpZm8gaXMgZW5hYmxlZCB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBhCisJCXRyaWdnZXIgdG8gdXNlIGJ1ZmZlciBtb2RlIHNpbmNlIHRoZSB3YXRlcm1hcmsgc2V0dGluZ3MKKwkJZ3VhcmFudGVlcyB0aGF0IHRoZSBoYXJkd2FyZSBmaWZvIGlzIGZsdXNoZWQgdG8gdGhlIGRldmljZQorCQlidWZmZXIuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9idWZmZXIvaHdmaWZvX3dhdGVybWFyaworS2VybmVsVmVyc2lvbjogNC4yCitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJUmVhZC1vbmx5IGVudHJ5IHRoYXQgY29udGFpbnMgYSBzaW5nbGUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZQorCQljdXJyZW50IHdhdGVybWFyayBsZXZlbCBmb3IgdGhlIGhhcmR3YXJlIGZpZm8uIElmIHRoZSBkZXZpY2UKKwkJZG9lcyBub3QgaGF2ZSBhIGhhcmR3YXJlIGZpZm8gdGhpcyBlbnRyeSBpcyBub3QgcHJlc2VudC4KKwkJVGhlIHdhdGVybWFyayBsZXZlbCBmb3IgdGhlIGhhcmR3YXJlIGZpZm8gaXMgc2V0IGJ5IHRoZSBkcml2ZXIKKwkJYmFzZWQgb24gdGhlIHZhbHVlIHNldCBieSB0aGUgdXNlciBpbiBidWZmZXIvd2F0ZXJtYXJrIGJ1dAorCQl0YWtpbmcgaW50byBhY2NvdW50IGhhcmR3YXJlIGxpbWl0YXRpb25zIChlLmcuIG1vc3QgaGFyZHdhcmUKKwkJYnVmZmVycyBhcmUgbGltaXRlZCB0byAzMi02NCBzYW1wbGVzLCBzb21lIGhhcmR3YXJlIGJ1ZmZlcnMKKwkJd2F0ZXJtYXJrcyBhcmUgZml4ZWQgb3IgaGF2ZSBtaW5pbXVtIGxldmVscykuICBBIHZhbHVlIG9mIDAKKwkJbWVhbnMgdGhhdCB0aGUgaGFyZHdhcmUgd2F0ZXJtYXJrIGlzIHVuc2V0LgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL2h3Zmlmb193YXRlcm1hcmtfbWluCitLZXJuZWxWZXJzaW9uOiA0LjIKK0NvbnRhY3Q6ICAgICAgIGxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlBIHNpbmdsZSBwb3NpdGl2ZSBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG1pbmltdW0gd2F0ZXJtYXJrIGxldmVsCisJCWZvciB0aGUgaGFyZHdhcmUgZmlmbyBvZiB0aGlzIGRldmljZS4gSWYgdGhlIGRldmljZSBkb2VzIG5vdAorCQloYXZlIGEgaGFyZHdhcmUgZmlmbyB0aGlzIGVudHJ5IGlzIG5vdCBwcmVzZW50LgorCQlJZiB0aGUgdXNlciBzZXRzIGJ1ZmZlci93YXRlcm1hcmsgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhpcyBvbmUsCisJCXRoZW4gdGhlIGhhcmR3YXJlIHdhdGVybWFyayB3aWxsIHJlbWFpbiB1bnNldC4KKworV2hhdDoJICAgICAgIC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2J1ZmZlci9od2ZpZm9fd2F0ZXJtYXJrX21heAorS2VybmVsVmVyc2lvbjogNC4yCitDb250YWN0OiAgICAgICBsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQSBzaW5nbGUgcG9zaXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIHdhdGVybWFyayBsZXZlbAorCQlmb3IgdGhlIGhhcmR3YXJlIGZpZm8gb2YgdGhpcyBkZXZpY2UuIElmIHRoZSBkZXZpY2UgZG9lcyBub3QKKwkJaGF2ZSBhIGhhcmR3YXJlIGZpZm8gdGhpcyBlbnRyeSBpcyBub3QgcHJlc2VudC4KKwkJSWYgdGhlIHVzZXIgc2V0cyBidWZmZXIvd2F0ZXJtYXJrIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHRoaXMKKwkJb25lLCB0aGVuIHRoZSBoYXJkd2FyZSB3YXRlcm1hcmsgd2lsbCBiZSBjYXBwZWQgYXQgdGhpcyB2YWx1ZS4KKworV2hhdDoJICAgICAgIC9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2J1ZmZlci9od2ZpZm9fd2F0ZXJtYXJrX2F2YWlsYWJsZQorS2VybmVsVmVyc2lvbjogNC4yCitDb250YWN0OiAgICAgICBsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQSBsaXN0IG9mIHBvc2l0aXZlIGludGVnZXJzIHNwZWNpZnlpbmcgdGhlIGF2YWlsYWJsZSB3YXRlcm1hcmsKKwkJbGV2ZWxzIGZvciB0aGUgaGFyZHdhcmUgZmlmby4gVGhpcyBlbnRyeSBpcyBvcHRpb25hbCBhbmQgaWYgaXQKKwkJaXMgbm90IHByZXNlbnQgaXQgbWVhbnMgdGhhdCBhbGwgdGhlIHZhbHVlcyBiZXR3ZWVuCisJCWh3Zmlmb193YXRlcm1hcmtfbWluIGFuZCBod2ZpZm9fd2F0ZXJtYXJrX21heCBhcmUgc3VwcG9ydGVkLgorCQlJZiB0aGUgdXNlciBzZXRzIGJ1ZmZlci93YXRlcm1hcmsgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4KKwkJaHdmaWZvX3dhdGVybWFrX21pbiBidXQgbm90IGVxdWFsIHRvIGFueSBvZiB0aGUgdmFsdWVzIGluIHRoaXMKKwkJbGlzdCwgdGhlIGRyaXZlciB3aWxsIGNob3NlIGFuIGFwcHJvcHJpYXRlIHZhbHVlIGZvciB0aGUKKwkJaGFyZHdhcmUgZmlmbyB3YXRlcm1hcmsgbGV2ZWwuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tY3AzMjB4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL21jcDMyMHgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tY3AzMjB4LnR4dApAQCAtMCwwICsxLDMwIEBACisqIE1pY3JvY2hpcCBBbmFsb2cgdG8gRGlnaXRhbCBDb252ZXJ0ZXIgKEFEQykKKworVGhlIG5vZGUgZm9yIHRoaXMgZHJpdmVyIG11c3QgYmUgYSBjaGlsZCBub2RlIG9mIGEgU1BJIGNvbnRyb2xsZXIsIGhlbmNlCithbGwgbWFuZGF0b3J5IHByb3BlcnRpZXMgZGVzY3JpYmVkIGluCisKKyAgICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCittdXN0IGJlIHNwZWNpZmllZC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKwktIGNvbXBhdGlibGU6ICAJTXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgZGVwZW5kaW5nIG9uIHRoZQorCQkJbW9kZWw6CisJCQkJIm1jcDMwMDEiCisJCQkJIm1jcDMwMDIiCisJCQkJIm1jcDMwMDQiCisJCQkJIm1jcDMwMDgiCisJCQkJIm1jcDMyMDEiCisJCQkJIm1jcDMyMDIiCisJCQkJIm1jcDMyMDQiCisJCQkJIm1jcDMyMDgiCisKKworRXhhbXBsZXM6CitzcGlfY29udHJvbGxlciB7CisJbWNwM3gweEAwIHsKKwkJY29tcGF0aWJsZSA9ICJtY3AzMDAyIjsKKwkJcmVnID0gPDA+OworCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDwxMDAwMDAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL21jcDM0MjIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvbWNwMzQyMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzMTM5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL21jcDM0MjIudHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogTWljcm9jaGlwIG1jcDM0MjIvMy80LzYvNy84IGNoaXAgZmFtaWx5IChBREMpCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUKKwkibWljcm9jaGlwLG1jcDM0MjIiIG9yCisJIm1pY3JvY2hpcCxtY3AzNDIzIiBvcgorCSJtaWNyb2NoaXAsbWNwMzQyNCIgb3IKKwkibWljcm9jaGlwLG1jcDM0MjYiIG9yCisJIm1pY3JvY2hpcCxtY3AzNDI3IiBvcgorCSJtaWNyb2NoaXAsbWNwMzQyOCIKKyAtIHJlZzogSTJDIGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UKKworRXhhbXBsZToKK2FkY0AwIHsKKwljb21wYXRpYmxlID0gIm1pY3JvY2hpcCxtY3AzNDI0IjsKKwlyZWcgPSA8MHg2OD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTI4czA1Mi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxMjhzMDUyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmNhN2RlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTI4czA1Mi50eHQKQEAgLTAsMCArMSwxOCBAQAorKiBUZXhhcyBJbnN0cnVtZW50cycgQURDMTI4UzA1MiBBREMgY2hpcAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxhZGMxMjhzMDUyIgorIC0gcmVnOiBzcGkgY2hpcCBzZWxlY3QgbnVtYmVyIGZvciB0aGUgZGV2aWNlCisgLSB2cmVmLXN1cHBseTogVGhlIHJlZ3VsYXRvciBzdXBwbHkgZm9yIEFEQyByZWZlcmVuY2Ugdm9sdGFnZQorCitSZWNvbW1lbmRlZCBwcm9wZXJ0aWVzOgorIC0gc3BpLW1heC1mcmVxdWVuY3k6IERlZmluaXRpb24gYXMgcGVyCisJCURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKworRXhhbXBsZToKK2FkY0AwIHsKKwljb21wYXRpYmxlID0gInRpLGFkYzEyOHMwNTIiOworCXJlZyA9IDwwPjsKKwl2cmVmLXN1cHBseSA9IDwmdmRkX3N1cHBseT47CisJc3BpLW1heC1mcmVxdWVuY3kgPSA8MTAwMDAwMD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9zdC1zZW5zb3JzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vc3Qtc2Vuc29ycy50eHQKaW5kZXggYTdhMGExNS4uZDJhYWNhOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9zdC1zZW5zb3JzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3N0LXNlbnNvcnMudHh0CkBAIC0yMyw2ICsyMyw3IEBACiBWYWxpZCBjb21wYXRpYmxlIHN0cmluZ3M6CiAKIEFjY2VsZXJvbWV0ZXJzOgorLSBzdCxsaXMzbHYwMmRsLWFjY2VsCiAtIHN0LGxzbTMwM2RsaC1hY2NlbAogLSBzdCxsc20zMDNkbGhjLWFjY2VsCiAtIHN0LGxpczNkaC1hY2NlbApkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA0NTgyNWI5Li4zODU3OWFjIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNzI0LDcgKzcyNCw3IEBACiAKIEFORFJPSUQgRFJJVkVSUwogTToJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4KLU06CUFydmUgSGr4bm5lduVnIDxhcnZlQGFuZHJvaWQuY29tPgorTToJQXJ2ZSBIasO4bm5ldsOlZyA8YXJ2ZUBhbmRyb2lkLmNvbT4KIE06CVJpbGV5IEFuZHJld3MgPHJpYW5kcmV3c0BhbmRyb2lkLmNvbT4KIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9ncmVna2gvc3RhZ2luZy5naXQKIEw6CWRldmVsQGRyaXZlcmRldi5vc3Vvc2wub3JnCkBAIC00MTY5LDYgKzQxNjksMTIgQEAKIEY6CXNvdW5kL3NvYy9mc2wvaW14KgogRjoJc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYwogCitGUkVFU0NBTEUgUU9SSVEgTUFOQUdFTUVOVCBDT01QTEVYIERSSVZFUgorTToJSi4gR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy8KKwogRlJFRVZYRlMgRklMRVNZU1RFTQogTToJQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgogVzoJZnRwOi8vZnRwLm9wZW5saW51eC5vcmcvcHViL3Blb3BsZS9oY2gvdnhmcwpAQCAtNDk1NCw2ICs0OTYwLDcgQEAKIEY6CWRyaXZlcnMvaWlvLwogRjoJZHJpdmVycy9zdGFnaW5nL2lpby8KIEY6CWluY2x1ZGUvbGludXgvaWlvLworRjoJdG9vbHMvaWlvLwogCiBJS0FOT1MvQURJIEVBR0xFIEFEU0wgVVNCIERSSVZFUgogTToJTWF0dGhpZXUgQ2FzdGV0IDxjYXN0ZXQubWF0dGhpZXVAZnJlZS5mcj4KQEAgLTkzNjMsNiArOTM3MCwxNCBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvCiAKK1NUQUdJTkcgLSBTSUxJQ09OIE1PVElPTiBTTTc1MCBGUkFNRSBCVUZGRVIgRFJJVkVSCitNOglTdWRpcCBNdWtoZXJqZWUgPHN1ZGlwbS5tdWtoZXJqZWVAZ21haWwuY29tPgorTToJVGVkZHkgV2FuZyA8dGVkZHkud2FuZ0BzaWxpY29ubW90aW9uLmNvbT4KK006CVN1ZGlwIE11a2hlcmplZSA8c3VkaXBAdmVjdG9yaW5kaWEub3JnPgorTDoJbGludXgtZmJkZXZAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvc203NTBmYi8KKwogU1RBR0lORyAtIFNMSUNPU1MKIE06CUxpb3IgRG90YW4gPGxpb2RvdEBnbWFpbC5jb20+CiBNOglDaHJpc3RvcGhlciBIYXJyZXIgPGNoYXJyZXJAYWxhY3JpdGVjaC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYyBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCmluZGV4IDY4YWNhMzMuLjEzMzJiMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCisrKyBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCkBAIC0zNTQ4LDcgKzM1NDgsNyBAQAogCiAJaWYgKCFwbGF0X2RhdGEpIHsKIAkJaWYgKG5wKSB7Ci0JCQlpZihkNDBfb2ZfcHJvYmUocGRldiwgbnApKSB7CisJCQlpZiAoZDQwX29mX3Byb2JlKHBkZXYsIG5wKSkgewogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBmYWlsdXJlOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvYm1jMTUwLWFjY2VsLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwuYwppbmRleCA3NTU2N2ZkLi43M2U4NzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwuYwpAQCAtNzAsNyArNzAsOSBAQAogI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX01BUF8wX0JJVF9TTE9QRQlCSVQoMikKIAogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9NQVBfMQkJMHgxQQotI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9EQVRBCUJJVCgwKQorI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9EQVRBCQlCSVQoMCkKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9NQVBfMV9CSVRfRldNCQlCSVQoMSkKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9NQVBfMV9CSVRfRkZVTEwJQklUKDIpCiAKICNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19JTlRfUlNUX0xBVENICQkweDIxCiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9MQVRDSF9SRVNFVAkweDgwCkBAIC04Myw3ICs4NSw5IEBACiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX1NMUF9aCQlCSVQoMikKIAogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9FTl8xCQkweDE3Ci0jZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX0RBVEFfRU4JQklUKDQpCisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX0RBVEFfRU4JCUJJVCg0KQorI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX0VOX0JJVF9GRlVMTF9FTglCSVQoNSkKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfRldNX0VOCQlCSVQoNikKIAogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9PVVRfQ1RSTAkJMHgyMAogI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX09VVF9DVFJMX0lOVDFfTFZMCUJJVCgwKQpAQCAtMTIyLDYgKzEyNiwxMiBAQAogI2RlZmluZSBCTUMxNTBfQUNDRUxfQVhJU19UT19SRUcoYXhpcykJKEJNQzE1MF9BQ0NFTF9SRUdfWE9VVF9MICsgKGF4aXMgKiAyKSkKICNkZWZpbmUgQk1DMTUwX0FVVE9fU1VTUEVORF9ERUxBWV9NUwkJMjAwMAogCisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9SRUdfRklGT19TVEFUVVMJCTB4MEUKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19GSUZPX0NPTkZJRzAJCTB4MzAKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19GSUZPX0NPTkZJRzEJCTB4M0UKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19GSUZPX0RBVEEJCTB4M0YKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX0ZJRk9fTEVOR1RICQkzMgorCiBlbnVtIGJtYzE1MF9hY2NlbF9heGlzIHsKIAlBWElTX1gsCiAJQVhJU19ZLApAQCAtMTQ3LDIwICsxNTcsNDYgQEAKIAljb25zdCBzdHJ1Y3QgYm1jMTUwX3NjYWxlX2luZm8gc2NhbGVfdGFibGVbNF07CiB9OwogCitzdHJ1Y3QgYm1jMTUwX2FjY2VsX2ludGVycnVwdCB7CisJY29uc3Qgc3RydWN0IGJtYzE1MF9hY2NlbF9pbnRlcnJ1cHRfaW5mbyAqaW5mbzsKKwlhdG9taWNfdCB1c2VyczsKK307CisKK3N0cnVjdCBibWMxNTBfYWNjZWxfdHJpZ2dlciB7CisJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhOworCXN0cnVjdCBpaW9fdHJpZ2dlciAqaW5kaW9fdHJpZzsKKwlpbnQgKCpzZXR1cCkoc3RydWN0IGJtYzE1MF9hY2NlbF90cmlnZ2VyICp0LCBib29sIHN0YXRlKTsKKwlpbnQgaW50cjsKKwlib29sIGVuYWJsZWQ7Cit9OworCitlbnVtIGJtYzE1MF9hY2NlbF9pbnRlcnJ1cHRfaWQgeworCUJNQzE1MF9BQ0NFTF9JTlRfREFUQV9SRUFEWSwKKwlCTUMxNTBfQUNDRUxfSU5UX0FOWV9NT1RJT04sCisJQk1DMTUwX0FDQ0VMX0lOVF9XQVRFUk1BUkssCisJQk1DMTUwX0FDQ0VMX0lOVEVSUlVQVFMsCit9OworCitlbnVtIGJtYzE1MF9hY2NlbF90cmlnZ2VyX2lkIHsKKwlCTUMxNTBfQUNDRUxfVFJJR0dFUl9EQVRBX1JFQURZLAorCUJNQzE1MF9BQ0NFTF9UUklHR0VSX0FOWV9NT1RJT04sCisJQk1DMTUwX0FDQ0VMX1RSSUdHRVJTLAorfTsKKwogc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpaW9fdHJpZ2dlciAqZHJlYWR5X3RyaWc7Ci0Jc3RydWN0IGlpb190cmlnZ2VyICptb3Rpb25fdHJpZzsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2ludGVycnVwdCBpbnRlcnJ1cHRzW0JNQzE1MF9BQ0NFTF9JTlRFUlJVUFRTXTsKKwlhdG9taWNfdCBhY3RpdmVfaW50cjsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX3RyaWdnZXIgdHJpZ2dlcnNbQk1DMTUwX0FDQ0VMX1RSSUdHRVJTXTsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJdTggZmlmb19tb2RlLCB3YXRlcm1hcms7CiAJczE2IGJ1ZmZlcls4XTsKIAl1OCBid19iaXRzOwogCXUzMiBzbG9wZV9kdXI7CiAJdTMyIHNsb3BlX3RocmVzOwogCXUzMiByYW5nZTsKIAlpbnQgZXZfZW5hYmxlX3N0YXRlOwotCWJvb2wgZHJlYWR5X3RyaWdnZXJfb247Ci0JYm9vbCBtb3Rpb25fdHJpZ2dlcl9vbjsKLQlpbnQ2NF90IHRpbWVzdGFtcDsKKwlpbnQ2NF90IHRpbWVzdGFtcCwgb2xkX3RpbWVzdGFtcDsKIAljb25zdCBzdHJ1Y3QgYm1jMTUwX2FjY2VsX2NoaXBfaW5mbyAqY2hpcF9pbmZvOwogfTsKIApAQCAtMjY5LDYgKzMwNSw0NiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW50IGJtYzE1MF9hY2NlbF91cGRhdGVfc2xvcGUoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhKQoreworCWludCByZXQsIHZhbDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBCTUMxNTBfQUNDRUxfUkVHX0lOVF82LAorCQkJCQlkYXRhLT5zbG9wZV90aHJlcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19pbnRfNlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgQk1DMTUwX0FDQ0VMX1JFR19JTlRfNSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ19pbnRfNVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJdmFsID0gKHJldCAmIH5CTUMxNTBfQUNDRUxfU0xPUEVfRFVSX01BU0spIHwgZGF0YS0+c2xvcGVfZHVyOworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBCTUMxNTBfQUNDRUxfUkVHX0lOVF81LAorCQkJCQl2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGUgcmVnX2ludF81XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfZGJnKCZkYXRhLT5jbGllbnQtPmRldiwgIiVzOiAleCAleFxuIiwgX19mdW5jX18sIGRhdGEtPnNsb3BlX3RocmVzLAorCQlkYXRhLT5zbG9wZV9kdXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBibWMxNTBfYWNjZWxfYW55X21vdGlvbl9zZXR1cChzdHJ1Y3QgYm1jMTUwX2FjY2VsX3RyaWdnZXIgKnQsCisJCQkJCSBib29sIHN0YXRlKQoreworCWlmIChzdGF0ZSkKKwkJcmV0dXJuIGJtYzE1MF9hY2NlbF91cGRhdGVfc2xvcGUodC0+ZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBibWMxNTBfYWNjZWxfY2hpcF9pbml0KHN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSkKIHsKIAlpbnQgcmV0OwpAQCAtMzA3LDMyICszODMsMTIgQEAKIAogCWRhdGEtPnJhbmdlID0gQk1DMTUwX0FDQ0VMX0RFRl9SQU5HRV80RzsKIAotCS8qIFNldCBkZWZhdWx0IHNsb3BlIGR1cmF0aW9uICovCi0JcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgQk1DMTUwX0FDQ0VMX1JFR19JTlRfNSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ19pbnRfNVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWRhdGEtPnNsb3BlX2R1ciB8PSBCTUMxNTBfQUNDRUxfREVGX1NMT1BFX0RVUkFUSU9OOwotCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAotCQkJCQlCTUMxNTBfQUNDRUxfUkVHX0lOVF81LAotCQkJCQlkYXRhLT5zbG9wZV9kdXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50XzVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlkZXZfZGJnKCZkYXRhLT5jbGllbnQtPmRldiwgInNsb3BlX2R1ciAleFxuIiwgZGF0YS0+c2xvcGVfZHVyKTsKLQotCS8qIFNldCBkZWZhdWx0IHNsb3BlIHRocmVzaG9sZHMgKi8KLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfNiwKLQkJCQkJQk1DMTUwX0FDQ0VMX0RFRl9TTE9QRV9USFJFU0hPTEQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50XzZcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KKwkvKiBTZXQgZGVmYXVsdCBzbG9wZSBkdXJhdGlvbiBhbmQgdGhyZXNob2xkcyAqLwogCWRhdGEtPnNsb3BlX3RocmVzID0gQk1DMTUwX0FDQ0VMX0RFRl9TTE9QRV9USFJFU0hPTEQ7Ci0JZGV2X2RiZygmZGF0YS0+Y2xpZW50LT5kZXYsICJzbG9wZV90aHJlcyAleFxuIiwgZGF0YS0+c2xvcGVfdGhyZXMpOworCWRhdGEtPnNsb3BlX2R1ciA9IEJNQzE1MF9BQ0NFTF9ERUZfU0xPUEVfRFVSQVRJT047CisJcmV0ID0gYm1jMTUwX2FjY2VsX3VwZGF0ZV9zbG9wZShkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIFNldCBkZWZhdWx0IGFzIGxhdGNoZWQgaW50ZXJydXB0cyAqLwogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LApAQCAtMzQ4LDE1NSArNDA0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBibWMxNTBfYWNjZWxfc2V0dXBfYW55X21vdGlvbl9pbnRlcnJ1cHQoCi0JCQkJCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSwKLQkJCQkJYm9vbCBzdGF0dXMpCi17Ci0JaW50IHJldDsKLQotCS8qIEVuYWJsZS9EaXNhYmxlIElOVDEgbWFwcGluZyAqLwotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJICAgICAgIEJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8wKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgcmVnX2ludF9tYXBfMFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWlmIChzdGF0dXMpCi0JCXJldCB8PSBCTUMxNTBfQUNDRUxfSU5UX01BUF8wX0JJVF9TTE9QRTsKLQllbHNlCi0JCXJldCAmPSB+Qk1DMTUwX0FDQ0VMX0lOVF9NQVBfMF9CSVRfU0xPUEU7Ci0KLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfTUFQXzAsCi0JCQkJCXJldCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19pbnRfbWFwXzBcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJLyogU2V0IHNsb3BlIGR1cmF0aW9uIChubyBvZiBzYW1wbGVzKSAqLwotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UXzUsCi0JCQkJCQlkYXRhLT5zbG9wZV9kdXIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0ZSByZWdfaW50XzVcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8qIFNldCBzbG9wZSB0aHJlc2hvbGRzICovCi0JCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAotCQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfNiwKLQkJCQkJCWRhdGEtPnNsb3BlX3RocmVzKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGUgcmVnX2ludF82XG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBOZXcgZGF0YSBpbnRlcnJ1cHQgaXMgYWx3YXlzIG5vbi1sYXRjaGVkLAotCQkgKiB3aGljaCB3aWxsIGhhdmUgaGlnaGVyIHByaW9yaXR5LCBzbyBubyBuZWVkCi0JCSAqIHRvIHNldCBsYXRjaGVkIG1vZGUsIHdlIHdpbGwgYmUgZmxvb2RlZCBhbnl3YXkgd2l0aCBJTlRSCi0JCSAqLwotCQlpZiAoIWRhdGEtPmRyZWFkeV90cmlnZ2VyX29uKSB7Ci0JCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfUlNUX0xBVENILAotCQkJCQlCTUMxNTBfQUNDRUxfSU5UX01PREVfTEFUQ0hfSU5UIHwKLQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9NT0RFX0xBVENIX1JFU0VUKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsCi0JCQkJCSJFcnJvciB3cml0aW5nIHJlZ19pbnRfcnN0X2xhdGNoXG4iKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0KLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCQlCTUMxNTBfQUNDRUxfUkVHX0lOVF9FTl8wLAotCQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfU0xQX1ggfAotCQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfU0xQX1kgfAotCQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfU0xQX1opOwotCX0gZWxzZQotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX0VOXzAsCi0JCQkJCQkwKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50X2VuXzBcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJtYzE1MF9hY2NlbF9zZXR1cF9uZXdfZGF0YV9pbnRlcnJ1cHQoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhLAotCQkJCQkgICBib29sIHN0YXR1cykKLXsKLQlpbnQgcmV0OwotCi0JLyogRW5hYmxlL0Rpc2FibGUgSU5UMSBtYXBwaW5nICovCi0JcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkgICAgICAgQk1DMTUwX0FDQ0VMX1JFR19JTlRfTUFQXzEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWdfaW50X21hcF8xXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKHN0YXR1cykKLQkJcmV0IHw9IEJNQzE1MF9BQ0NFTF9JTlRfTUFQXzFfQklUX0RBVEE7Ci0JZWxzZQotCQlyZXQgJj0gfkJNQzE1MF9BQ0NFTF9JTlRfTUFQXzFfQklUX0RBVEE7Ci0KLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfTUFQXzEsCi0JCQkJCXJldCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19pbnRfbWFwXzFcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJLyoKLQkJICogU2V0IG5vbiBsYXRjaGVkIG1vZGUgaW50ZXJydXB0IGFuZCBjbGVhciBhbnkgbGF0Y2hlZAotCQkgKiBpbnRlcnJ1cHQKLQkJICovCi0JCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAotCQkJCQlCTUMxNTBfQUNDRUxfUkVHX0lOVF9SU1RfTEFUQ0gsCi0JCQkJCUJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9OT05fTEFUQ0hfSU5UIHwKLQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9NT0RFX0xBVENIX1JFU0VUKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LAotCQkJCSJFcnJvciB3cml0aW5nIHJlZ19pbnRfcnN0X2xhdGNoXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfRU5fMSwKLQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfREFUQV9FTik7Ci0KLQl9IGVsc2UgewotCQkvKiBSZXN0b3JlIGRlZmF1bHQgaW50ZXJydXB0IG1vZGUgKi8KLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX1JTVF9MQVRDSCwKLQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9NT0RFX0xBVENIX0lOVCB8Ci0JCQkJCUJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9MQVRDSF9SRVNFVCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwKLQkJCQkiRXJyb3Igd3JpdGluZyByZWdfaW50X3JzdF9sYXRjaFxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCQlCTUMxNTBfQUNDRUxfUkVHX0lOVF9FTl8xLAotCQkJCQkJMCk7Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19pbnRfZW5fMVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2dldF9idyhzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEsIGludCAqdmFsLAogCQkJICAgICAgIGludCAqdmFsMikKIHsKQEAgLTU1NCw2ICs0NjEsMTIwIEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBibWMxNTBfYWNjZWxfaW50ZXJydXB0X2luZm8geworCXU4IG1hcF9yZWc7CisJdTggbWFwX2JpdG1hc2s7CisJdTggZW5fcmVnOworCXU4IGVuX2JpdG1hc2s7Cit9IGJtYzE1MF9hY2NlbF9pbnRlcnJ1cHRzW0JNQzE1MF9BQ0NFTF9JTlRFUlJVUFRTXSA9IHsKKwl7IC8qIGRhdGEgcmVhZHkgaW50ZXJydXB0ICovCisJCS5tYXBfcmVnID0gQk1DMTUwX0FDQ0VMX1JFR19JTlRfTUFQXzEsCisJCS5tYXBfYml0bWFzayA9IEJNQzE1MF9BQ0NFTF9JTlRfTUFQXzFfQklUX0RBVEEsCisJCS5lbl9yZWcgPSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9FTl8xLAorCQkuZW5fYml0bWFzayA9IEJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX0RBVEFfRU4sCisJfSwKKwl7ICAvKiBtb3Rpb24gaW50ZXJydXB0ICovCisJCS5tYXBfcmVnID0gQk1DMTUwX0FDQ0VMX1JFR19JTlRfTUFQXzAsCisJCS5tYXBfYml0bWFzayA9IEJNQzE1MF9BQ0NFTF9JTlRfTUFQXzBfQklUX1NMT1BFLAorCQkuZW5fcmVnID0gQk1DMTUwX0FDQ0VMX1JFR19JTlRfRU5fMCwKKwkJLmVuX2JpdG1hc2sgPSAgQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfU0xQX1ggfAorCQkJQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfU0xQX1kgfAorCQkJQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfU0xQX1oKKwl9LAorCXsgLyogZmlmbyB3YXRlcm1hcmsgaW50ZXJydXB0ICovCisJCS5tYXBfcmVnID0gQk1DMTUwX0FDQ0VMX1JFR19JTlRfTUFQXzEsCisJCS5tYXBfYml0bWFzayA9IEJNQzE1MF9BQ0NFTF9JTlRfTUFQXzFfQklUX0ZXTSwKKwkJLmVuX3JlZyA9IEJNQzE1MF9BQ0NFTF9SRUdfSU5UX0VOXzEsCisJCS5lbl9iaXRtYXNrID0gQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfRldNX0VOLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBibWMxNTBfYWNjZWxfaW50ZXJydXB0c19zZXR1cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCQkgIHN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCTUMxNTBfQUNDRUxfSU5URVJSVVBUUzsgaSsrKQorCQlkYXRhLT5pbnRlcnJ1cHRzW2ldLmluZm8gPSAmYm1jMTUwX2FjY2VsX2ludGVycnVwdHNbaV07Cit9CisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX3NldF9pbnRlcnJ1cHQoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhLCBpbnQgaSwKKwkJCQkgICAgICBib29sIHN0YXRlKQoreworCXN0cnVjdCBibWMxNTBfYWNjZWxfaW50ZXJydXB0ICppbnRyID0gJmRhdGEtPmludGVycnVwdHNbaV07CisJY29uc3Qgc3RydWN0IGJtYzE1MF9hY2NlbF9pbnRlcnJ1cHRfaW5mbyAqaW5mbyA9IGludHItPmluZm87CisJaW50IHJldDsKKworCWlmIChzdGF0ZSkgeworCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJmludHItPnVzZXJzKSA+IDEpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmludHItPnVzZXJzKSA+IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIHdpbGwgZXhwZWN0IHRoZSBlbmFibGUgYW5kIGRpc2FibGUgdG8gZG8gb3BlcmF0aW9uIGluCisJICogaW4gcmV2ZXJzZSBvcmRlci4gVGhpcyB3aWxsIGhhcHBlbiBoZXJlIGFueXdheSBhcyBvdXIKKwkgKiByZXN1bWUgb3BlcmF0aW9uIHVzZXMgc3luYyBtb2RlIHJ1bnRpbWUgcG0gY2FsbHMsIHRoZQorCSAqIHN1c3BlbmQgb3BlcmF0aW9uIHdpbGwgYmUgZGVsYXllZCBieSBhdXRvc3VzcGVuZCBkZWxheQorCSAqIFNvIHRoZSBkaXNhYmxlIG9wZXJhdGlvbiB3aWxsIHN0aWxsIGhhcHBlbiBpbiByZXZlcnNlIG9mCisJICogZW5hYmxlIG9wZXJhdGlvbi4gV2hlbiBydW50aW1lIHBtIGlzIGRpc2FibGVkIHRoZSBtb2RlCisJICogaXMgYWx3YXlzIG9uIHNvIHNlcXVlbmNlIGRvZXNuJ3QgbWF0dGVyCisJICovCisJcmV0ID0gYm1jMTUwX2FjY2VsX3NldF9wb3dlcl9zdGF0ZShkYXRhLCBzdGF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBtYXAgdGhlIGludGVycnVwdCB0byB0aGUgYXBwcm9wcmlhdGUgcGlucyAqLworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIGluZm8tPm1hcF9yZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWdfaW50X21hcFxuIik7CisJCWdvdG8gb3V0X2ZpeF9wb3dlcl9zdGF0ZTsKKwl9CisJaWYgKHN0YXRlKQorCQlyZXQgfD0gaW5mby0+bWFwX2JpdG1hc2s7CisJZWxzZQorCQlyZXQgJj0gfmluZm8tPm1hcF9iaXRtYXNrOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIGluZm8tPm1hcF9yZWcsCisJCQkJCXJldCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19pbnRfbWFwXG4iKTsKKwkJZ290byBvdXRfZml4X3Bvd2VyX3N0YXRlOworCX0KKworCS8qIGVuYWJsZS9kaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBpbmZvLT5lbl9yZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWdfaW50X2VuXG4iKTsKKwkJZ290byBvdXRfZml4X3Bvd2VyX3N0YXRlOworCX0KKworCWlmIChzdGF0ZSkKKwkJcmV0IHw9IGluZm8tPmVuX2JpdG1hc2s7CisJZWxzZQorCQlyZXQgJj0gfmluZm8tPmVuX2JpdG1hc2s7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgaW5mby0+ZW5fcmVnLCByZXQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50X2VuXG4iKTsKKwkJZ290byBvdXRfZml4X3Bvd2VyX3N0YXRlOworCX0KKworCWlmIChzdGF0ZSkKKwkJYXRvbWljX2luYygmZGF0YS0+YWN0aXZlX2ludHIpOworCWVsc2UKKwkJYXRvbWljX2RlYygmZGF0YS0+YWN0aXZlX2ludHIpOworCisJcmV0dXJuIDA7CisKK291dF9maXhfcG93ZXJfc3RhdGU6CisJYm1jMTUwX2FjY2VsX3NldF9wb3dlcl9zdGF0ZShkYXRhLCBmYWxzZSk7CisJcmV0dXJuIHJldDsKK30KKworCiBzdGF0aWMgaW50IGJtYzE1MF9hY2NlbF9zZXRfc2NhbGUoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhLCBpbnQgdmFsKQogewogCWludCByZXQsIGk7CkBAIC03MzIsNyArNzUzLDcgQEAKIAkJKnZhbCA9IGRhdGEtPnNsb3BlX3RocmVzOwogCQlicmVhazsKIAljYXNlIElJT19FVl9JTkZPX1BFUklPRDoKLQkJKnZhbCA9IGRhdGEtPnNsb3BlX2R1ciAmIEJNQzE1MF9BQ0NFTF9TTE9QRV9EVVJfTUFTSzsKKwkJKnZhbCA9IGRhdGEtPnNsb3BlX2R1cjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NTUsMTEgKzc3NiwxMCBAQAogCiAJc3dpdGNoIChpbmZvKSB7CiAJY2FzZSBJSU9fRVZfSU5GT19WQUxVRToKLQkJZGF0YS0+c2xvcGVfdGhyZXMgPSB2YWw7CisJCWRhdGEtPnNsb3BlX3RocmVzID0gdmFsICYgMHhGRjsKIAkJYnJlYWs7CiAJY2FzZSBJSU9fRVZfSU5GT19QRVJJT0Q6Ci0JCWRhdGEtPnNsb3BlX2R1ciAmPSB+Qk1DMTUwX0FDQ0VMX1NMT1BFX0RVUl9NQVNLOwotCQlkYXRhLT5zbG9wZV9kdXIgfD0gdmFsICYgQk1DMTUwX0FDQ0VMX1NMT1BFX0RVUl9NQVNLOworCQlkYXRhLT5zbG9wZV9kdXIgPSB2YWwgJiBCTUMxNTBfQUNDRUxfU0xPUEVfRFVSX01BU0s7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzg4LDQwICs4MDgsMTggQEAKIAlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CiAKLQlpZiAoc3RhdGUgJiYgZGF0YS0+ZXZfZW5hYmxlX3N0YXRlKQorCWlmIChzdGF0ZSA9PSBkYXRhLT5ldl9lbmFibGVfc3RhdGUpCiAJCXJldHVybiAwOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwogCi0JaWYgKCFzdGF0ZSAmJiBkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbikgewotCQlkYXRhLT5ldl9lbmFibGVfc3RhdGUgPSAwOwotCQltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBXZSB3aWxsIGV4cGVjdCB0aGUgZW5hYmxlIGFuZCBkaXNhYmxlIHRvIGRvIG9wZXJhdGlvbiBpbgotCSAqIGluIHJldmVyc2Ugb3JkZXIuIFRoaXMgd2lsbCBoYXBwZW4gaGVyZSBhbnl3YXkgYXMgb3VyCi0JICogcmVzdW1lIG9wZXJhdGlvbiB1c2VzIHN5bmMgbW9kZSBydW50aW1lIHBtIGNhbGxzLCB0aGUKLQkgKiBzdXNwZW5kIG9wZXJhdGlvbiB3aWxsIGJlIGRlbGF5ZWQgYnkgYXV0b3N1c3BlbmQgZGVsYXkKLQkgKiBTbyB0aGUgZGlzYWJsZSBvcGVyYXRpb24gd2lsbCBzdGlsbCBoYXBwZW4gaW4gcmV2ZXJzZSBvZgotCSAqIGVuYWJsZSBvcGVyYXRpb24uIFdoZW4gcnVudGltZSBwbSBpcyBkaXNhYmxlZCB0aGUgbW9kZQotCSAqIGlzIGFsd2F5cyBvbiBzbyBzZXF1ZW5jZSBkb2Vzbid0IG1hdHRlcgotCSAqLwotCi0JcmV0ID0gYm1jMTUwX2FjY2VsX3NldF9wb3dlcl9zdGF0ZShkYXRhLCBzdGF0ZSk7CisJcmV0ID0gYm1jMTUwX2FjY2VsX3NldF9pbnRlcnJ1cHQoZGF0YSwgQk1DMTUwX0FDQ0VMX0lOVF9BTllfTU9USU9OLAorCQkJCQkgc3RhdGUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9ICBibWMxNTBfYWNjZWxfc2V0dXBfYW55X21vdGlvbl9pbnRlcnJ1cHQoZGF0YSwgc3RhdGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWJtYzE1MF9hY2NlbF9zZXRfcG93ZXJfc3RhdGUoZGF0YSwgZmFsc2UpOwotCQltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlkYXRhLT5ldl9lbmFibGVfc3RhdGUgPSBzdGF0ZTsKIAltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKIApAQCAtODMyLDEzICs4MzAsMjI0IEBACiAJCQkJICAgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKQogewogCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGk7CiAKLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWcgIT0gdHJpZyAmJiBkYXRhLT5tb3Rpb25fdHJpZyAhPSB0cmlnKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgQk1DMTUwX0FDQ0VMX1RSSUdHRVJTOyBpKyspIHsKKwkJaWYgKGRhdGEtPnRyaWdnZXJzW2ldLmluZGlvX3RyaWcgPT0gdHJpZykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdCBibWMxNTBfYWNjZWxfZ2V0X2ZpZm9fd2F0ZXJtYXJrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOworCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHdtOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOworCXdtID0gZGF0YS0+d2F0ZXJtYXJrOworCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHdtKTsKK30KKworc3RhdGljIHNzaXplX3QgYm1jMTUwX2FjY2VsX2dldF9maWZvX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWJvb2wgc3RhdGU7CisKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisJc3RhdGUgPSBkYXRhLT5maWZvX21vZGU7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3RhdGUpOworfQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaHdmaWZvX3dhdGVybWFya19taW4sICIxIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaHdmaWZvX3dhdGVybWFya19tYXgsCisJCSAgICAgIF9fc3RyaW5naWZ5KEJNQzE1MF9BQ0NFTF9GSUZPX0xFTkdUSCkpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihod2ZpZm9fZW5hYmxlZCwgU19JUlVHTywKKwkJICAgICAgIGJtYzE1MF9hY2NlbF9nZXRfZmlmb19zdGF0ZSwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGh3Zmlmb193YXRlcm1hcmssIFNfSVJVR08sCisJCSAgICAgICBibWMxNTBfYWNjZWxfZ2V0X2ZpZm9fd2F0ZXJtYXJrLCBOVUxMLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKmJtYzE1MF9hY2NlbF9maWZvX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfaHdmaWZvX3dhdGVybWFya19taW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaHdmaWZvX3dhdGVybWFya19tYXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2h3Zmlmb193YXRlcm1hcmsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2h3Zmlmb19lbmFibGVkLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX3NldF93YXRlcm1hcmsoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgdmFsKQoreworCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpZiAodmFsID4gQk1DMTUwX0FDQ0VMX0ZJRk9fTEVOR1RIKQorCQl2YWwgPSBCTUMxNTBfQUNDRUxfRklGT19MRU5HVEg7CisKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisJZGF0YS0+d2F0ZXJtYXJrID0gdmFsOworCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBXZSBtdXN0IHJlYWQgYXQgbGVhc3Qgb25lIGZ1bGwgZnJhbWUgaW4gb25lIGJ1cnN0LCBvdGhlcndpc2UgdGhlIHJlc3Qgb2YgdGhlCisgKiBmcmFtZSBkYXRhIGlzIGRpc2NhcmRlZC4KKyAqLworc3RhdGljIGludCBibWMxNTBfYWNjZWxfZmlmb190cmFuc2Zlcihjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IHNhbXBsZXMpCit7CisJaW50IHNhbXBsZV9sZW5ndGggPSAzICogMjsKKwl1OCByZWdfZmlmb19kYXRhID0gQk1DMTUwX0FDQ0VMX1JFR19GSUZPX0RBVEE7CisJaW50IHJldCA9IC1FSU87CisKKwlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKKwkJCXsKKwkJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCQkuZmxhZ3MgPSAwLAorCQkJCS5idWYgPSAmcmVnX2ZpZm9fZGF0YSwKKwkJCQkubGVuID0gc2l6ZW9mKHJlZ19maWZvX2RhdGEpLAorCQkJfSwKKwkJCXsKKwkJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkuYnVmID0gKHU4ICopYnVmZmVyLAorCQkJCS5sZW4gPSBzYW1wbGVzICogc2FtcGxlX2xlbmd0aCwKKwkJCX0KKwkJfTsKKworCQlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworCQlpZiAocmV0ICE9IDIpCisJCQlyZXQgPSAtRUlPOworCQllbHNlCisJCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCWludCBpLCBzdGVwID0gSTJDX1NNQlVTX0JMT0NLX01BWCAvIHNhbXBsZV9sZW5ndGg7CisKKwkJZm9yIChpID0gMDsgaSA8IHNhbXBsZXMgKiBzYW1wbGVfbGVuZ3RoOyBpICs9IHN0ZXApIHsKKwkJCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwKKwkJCQkJCQkgICAgcmVnX2ZpZm9fZGF0YSwgc3RlcCwKKwkJCQkJCQkgICAgJmJ1ZmZlcltpXSk7CisJCQlpZiAocmV0ICE9IHN0ZXApIHsKKwkJCQlyZXQgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyZXQgPSAwOworCQl9CisJfQorCisJaWYgKHJldCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJFcnJvciB0cmFuc2ZlcnJpbmcgZGF0YSBmcm9tIGZpZm9cbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2JtYzE1MF9hY2NlbF9maWZvX2ZsdXNoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgICB1bnNpZ25lZCBzYW1wbGVzLCBib29sIGlycSkKK3sKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQsIGk7CisJdTggY291bnQ7CisJdTE2IGJ1ZmZlcltCTUMxNTBfQUNDRUxfRklGT19MRU5HVEggKiAzXTsKKwlpbnQ2NF90IHRzdGFtcDsKKwl1aW50NjRfdCBzYW1wbGVfcGVyaW9kOworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJICAgICAgIEJNQzE1MF9BQ0NFTF9SRUdfRklGT19TVEFUVVMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWdfZmlmb19zdGF0dXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNvdW50ID0gcmV0ICYgMHg3RjsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB3ZSBnZXR0aW5nIGNhbGxlZCBmcm9tIElSUSBoYW5kbGVyIHdlIGtub3cgdGhlIHN0b3JlZCB0aW1lc3RhbXAgaXMKKwkgKiBmYWlybHkgYWNjdXJhdGUgZm9yIHRoZSBsYXN0IHN0b3JlZCBzYW1wbGUuIE90aGVyd2lzZSwgaWYgd2UgYXJlCisJICogY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgcmVhZCBvcGVyYXRpb24gZnJvbSB1c2Vyc3BhY2UgYW5kIGhlbmNlCisJICogYmVmb3JlIHRoZSB3YXRlcm1hcmsgaW50ZXJydXB0IHdhcyB0cmlnZ2VyZWQsIHRha2UgYSB0aW1lc3RhbXAKKwkgKiBub3cuIFdlIGNhbiBmYWxsIGFueXdoZXJlIGluIGJldHdlZW4gdHdvIHNhbXBsZXMgc28gdGhlIGVycm9yIGluIHRoaXMKKwkgKiBjYXNlIGlzIGF0IG1vc3Qgb25lIHNhbXBsZSBwZXJpb2QuCisJICovCisJaWYgKCFpcnEpIHsKKwkJZGF0YS0+b2xkX3RpbWVzdGFtcCA9IGRhdGEtPnRpbWVzdGFtcDsKKwkJZGF0YS0+dGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKCk7CisJfQorCisJLyoKKwkgKiBBcHByb3hpbWF0ZSB0aW1lc3RhbXBzIGZvciBlYWNoIG9mIHRoZSBzYW1wbGUgYmFzZWQgb24gdGhlIHNhbXBsaW5nCisJICogZnJlcXVlbmN5LCB0aW1lc3RhbXAgZm9yIGxhc3Qgc2FtcGxlIGFuZCBudW1iZXIgb2Ygc2FtcGxlcy4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGN1cnJlbnQgYmFuZHdpZHRoIHNldHRpbmdzIHRvIGNvbXB1dGUgdGhlCisJICogc2FtcGxlIHBlcmlvZCBiZWNhdXNlIHRoZSBzYW1wbGUgcmF0ZSB2YXJpZXMgd2l0aCB0aGUgZGV2aWNlCisJICogKGUuZy4gYmV0d2VlbiAzMS43MG1zIHRvIDMyLjIwbXMgZm9yIGEgYmFuZHdpZHRoIG9mIDE1LjYzSFopLiBUaGF0CisJICogc21hbGwgdmFyaWF0aW9uIGFkZHMgd2hlbiB3ZSBzdG9yZSBhIGxhcmdlIG51bWJlciBvZiBzYW1wbGVzIGFuZAorCSAqIGNyZWF0ZXMgc2lnbmlmaWNhbnQgaml0dGVyIGJldHdlZW4gdGhlIGxhc3QgYW5kIGZpcnN0IHNhbXBsZXMgaW4KKwkgKiBkaWZmZXJlbnQgYmF0Y2hlcyAoZS5nLiAzMm1zIHZzIDIxbXMpLgorCSAqCisJICogVG8gYXZvaWQgdGhpcyBpc3N1ZSB3ZSBjb21wdXRlIHRoZSBhY3R1YWwgc2FtcGxlIHBlcmlvZCBvdXJzZWx2ZXMKKwkgKiBiYXNlZCBvbiB0aGUgdGltZXN0YW1wIGRlbHRhIGJldHdlZW4gdGhlIGxhc3QgdHdvIGZsdXNoIG9wZXJhdGlvbnMuCisJICovCisJc2FtcGxlX3BlcmlvZCA9IChkYXRhLT50aW1lc3RhbXAgLSBkYXRhLT5vbGRfdGltZXN0YW1wKTsKKwlkb19kaXYoc2FtcGxlX3BlcmlvZCwgY291bnQpOworCXRzdGFtcCA9IGRhdGEtPnRpbWVzdGFtcCAtIChjb3VudCAtIDEpICogc2FtcGxlX3BlcmlvZDsKKworCWlmIChzYW1wbGVzICYmIGNvdW50ID4gc2FtcGxlcykKKwkJY291bnQgPSBzYW1wbGVzOworCisJcmV0ID0gYm1jMTUwX2FjY2VsX2ZpZm9fdHJhbnNmZXIoZGF0YS0+Y2xpZW50LCAodTggKilidWZmZXIsIGNvdW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBJZGVhbGx5IHdlIHdhbnQgdGhlIElJTyBjb3JlIHRvIGhhbmRsZSB0aGUgZGVtdXggd2hlbiBydW5uaW5nIGluIGZpZm8KKwkgKiBtb2RlIGJ1dCBub3Qgd2hlbiBydW5uaW5nIGluIHRyaWdnZXJlZCBidWZmZXIgbW9kZS4gVW5mb3J0dW5hdGVseQorCSAqIHRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSBwb3NzaWJsZSwgc28gc3RpY2sgd2l0aCBkcml2ZXIgZGVtdXggZm9yCisJICogbm93LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXUxNiBzYW1wbGVbOF07CisJCWludCBqLCBiaXQ7CisKKwkJaiA9IDA7CisJCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCisJCQkJIGluZGlvX2Rldi0+bWFza2xlbmd0aCkKKwkJCW1lbWNweSgmc2FtcGxlW2orK10sICZidWZmZXJbaSAqIDMgKyBiaXRdLCAyKTsKKworCQlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2Rldiwgc2FtcGxlLCB0c3RhbXApOworCisJCXRzdGFtcCArPSBzYW1wbGVfcGVyaW9kOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBibWMxNTBfYWNjZWxfZmlmb19mbHVzaChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1bnNpZ25lZCBzYW1wbGVzKQoreworCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKKwlyZXQgPSBfX2JtYzE1MF9hY2NlbF9maWZvX2ZsdXNoKGluZGlvX2Rldiwgc2FtcGxlcywgZmFsc2UpOworCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgKIAkJIjE1LjYyMDAwMCAzMS4yNjAwMDAgNjIuNTAwMDAgMTI1IDI1MCA1MDAgMTAwMCAyMDAwIik7CiAKQEAgLTk3OCw2ICsxMTg3LDIwIEBACiAJLmRyaXZlcl9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGJtYzE1MF9hY2NlbF9pbmZvX2ZpZm8gPSB7CisJLmF0dHJzCQkJPSAmYm1jMTUwX2FjY2VsX2F0dHJzX2dyb3VwLAorCS5yZWFkX3JhdwkJPSBibWMxNTBfYWNjZWxfcmVhZF9yYXcsCisJLndyaXRlX3JhdwkJPSBibWMxNTBfYWNjZWxfd3JpdGVfcmF3LAorCS5yZWFkX2V2ZW50X3ZhbHVlCT0gYm1jMTUwX2FjY2VsX3JlYWRfZXZlbnQsCisJLndyaXRlX2V2ZW50X3ZhbHVlCT0gYm1jMTUwX2FjY2VsX3dyaXRlX2V2ZW50LAorCS53cml0ZV9ldmVudF9jb25maWcJPSBibWMxNTBfYWNjZWxfd3JpdGVfZXZlbnRfY29uZmlnLAorCS5yZWFkX2V2ZW50X2NvbmZpZwk9IGJtYzE1MF9hY2NlbF9yZWFkX2V2ZW50X2NvbmZpZywKKwkudmFsaWRhdGVfdHJpZ2dlcgk9IGJtYzE1MF9hY2NlbF92YWxpZGF0ZV90cmlnZ2VyLAorCS5od2ZpZm9fc2V0X3dhdGVybWFyawk9IGJtYzE1MF9hY2NlbF9zZXRfd2F0ZXJtYXJrLAorCS5od2ZpZm9fZmx1c2hfdG9fYnVmZmVyCT0gYm1jMTUwX2FjY2VsX2ZpZm9fZmx1c2gsCisJLmRyaXZlcl9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCit9OworCiBzdGF0aWMgaXJxcmV0dXJuX3QgYm1jMTUwX2FjY2VsX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7CkBAIC0xMDA4LDEyICsxMjMxLDEyIEBACiAKIHN0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX3RyaWdfdHJ5X3JlZW4oc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKQogewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpaW9fdHJpZ2dlcl9nZXRfZHJ2ZGF0YSh0cmlnKTsKLQlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBibWMxNTBfYWNjZWxfdHJpZ2dlciAqdCA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOworCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IHQtPmRhdGE7CiAJaW50IHJldDsKIAogCS8qIG5ldyBkYXRhIGludGVycnVwdHMgZG9uJ3QgbmVlZCBhY2sgKi8KLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWdnZXJfb24pCisJaWYgKHQgPT0gJnQtPmRhdGEtPnRyaWdnZXJzW0JNQzE1MF9BQ0NFTF9UUklHR0VSX0RBVEFfUkVBRFldKQogCQlyZXR1cm4gMDsKIAogCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKQEAgLTEwMzIsNDMgKzEyNTUsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBibWMxNTBfYWNjZWxfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAorc3RhdGljIGludCBibWMxNTBfYWNjZWxfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAogCQkJCQkJICAgYm9vbCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7Ci0Jc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX3RyaWdnZXIgKnQgPSBpaW9fdHJpZ2dlcl9nZXRfZHJ2ZGF0YSh0cmlnKTsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSB0LT5kYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CiAKLQlpZiAoIXN0YXRlICYmIGRhdGEtPmV2X2VuYWJsZV9zdGF0ZSAmJiBkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbikgewotCQlkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbiA9IGZhbHNlOworCWlmICh0LT5lbmFibGVkID09IHN0YXRlKSB7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKgotCSAqIFJlZmVyIHRvIGNvbW1lbnQgaW4gYm1jMTUwX2FjY2VsX3dyaXRlX2V2ZW50X2NvbmZpZyBmb3IKLQkgKiBlbmFibGUvZGlzYWJsZSBvcGVyYXRpb24gb3JkZXIKLQkgKi8KLQlyZXQgPSBibWMxNTBfYWNjZWxfc2V0X3Bvd2VyX3N0YXRlKGRhdGEsIHN0YXRlKTsKKwlpZiAodC0+c2V0dXApIHsKKwkJcmV0ID0gdC0+c2V0dXAodCwgc3RhdGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gYm1jMTUwX2FjY2VsX3NldF9pbnRlcnJ1cHQoZGF0YSwgdC0+aW50ciwgc3RhdGUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpZiAoZGF0YS0+bW90aW9uX3RyaWcgPT0gdHJpZykKLQkJcmV0ID0gIGJtYzE1MF9hY2NlbF9zZXR1cF9hbnlfbW90aW9uX2ludGVycnVwdChkYXRhLCBzdGF0ZSk7Ci0JZWxzZQotCQlyZXQgPSBibWMxNTBfYWNjZWxfc2V0dXBfbmV3X2RhdGFfaW50ZXJydXB0KGRhdGEsIHN0YXRlKTsKLQlpZiAocmV0IDwgMCkgewotCQlibWMxNTBfYWNjZWxfc2V0X3Bvd2VyX3N0YXRlKGRhdGEsIGZhbHNlKTsKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWlmIChkYXRhLT5tb3Rpb25fdHJpZyA9PSB0cmlnKQotCQlkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbiA9IHN0YXRlOwotCWVsc2UKLQkJZGF0YS0+ZHJlYWR5X3RyaWdnZXJfb24gPSBzdGF0ZTsKKworCXQtPmVuYWJsZWQgPSBzdGF0ZTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCkBAIC0xMDc2LDIzICsxMjkxLDIyIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIGJtYzE1MF9hY2NlbF90cmlnZ2VyX29wcyA9IHsKLQkuc2V0X3RyaWdnZXJfc3RhdGUgPSBibWMxNTBfYWNjZWxfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0gYm1jMTUwX2FjY2VsX3RyaWdnZXJfc2V0X3N0YXRlLAogCS50cnlfcmVlbmFibGUgPSBibWMxNTBfYWNjZWxfdHJpZ190cnlfcmVlbiwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBibWMxNTBfYWNjZWxfZXZlbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQorc3RhdGljIGludCBibWMxNTBfYWNjZWxfaGFuZGxlX3JvY19ldmVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwcml2YXRlOwogCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JaW50IHJldDsKIAlpbnQgZGlyOworCWludCByZXQ7CiAKIAlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAogCQkJCSAgICAgICBCTUMxNTBfQUNDRUxfUkVHX0lOVF9TVEFUVVNfMik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ19pbnRfc3RhdHVzXzJcbiIpOwotCQlnb3RvIGFja19pbnRyX3N0YXR1czsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAocmV0ICYgQk1DMTUwX0FDQ0VMX0FOWV9NT1RJT05fQklUX1NJR04pCkBAIC0xMTIxLDMyICsxMzM1LDczIEBACiAJCQkJCQkJSUlPX0VWX1RZUEVfUk9DLAogCQkJCQkJCWRpciksCiAJCQkJCQkJZGF0YS0+dGltZXN0YW1wKTsKLWFja19pbnRyX3N0YXR1czoKLQlpZiAoIWRhdGEtPmRyZWFkeV90cmlnZ2VyX29uKQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBibWMxNTBfYWNjZWxfaXJxX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHByaXZhdGU7CisJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlib29sIGFjayA9IGZhbHNlOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisKKwlpZiAoZGF0YS0+Zmlmb19tb2RlKSB7CisJCXJldCA9IF9fYm1jMTUwX2FjY2VsX2ZpZm9fZmx1c2goaW5kaW9fZGV2LAorCQkJCQkJQk1DMTUwX0FDQ0VMX0ZJRk9fTEVOR1RILCB0cnVlKTsKKwkJaWYgKHJldCA+IDApCisJCQlhY2sgPSB0cnVlOworCX0KKworCWlmIChkYXRhLT5ldl9lbmFibGVfc3RhdGUpIHsKKwkJcmV0ID0gYm1jMTUwX2FjY2VsX2hhbmRsZV9yb2NfZXZlbnQoaW5kaW9fZGV2KTsKKwkJaWYgKHJldCA+IDApCisJCQlhY2sgPSB0cnVlOworCX0KKworCWlmIChhY2spIHsKIAkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCiAJCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX1JTVF9MQVRDSCwKIAkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9NT0RFX0xBVENIX0lOVCB8CiAJCQkJCUJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9MQVRDSF9SRVNFVCk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRpbmcgcmVnX2ludF9yc3RfbGF0Y2hcbiIpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9IGVsc2UgeworCQlyZXQgPSBJUlFfTk9ORTsKKwl9CiAKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgYm1jMTUwX2FjY2VsX2RhdGFfcmR5X3RyaWdfcG9sbChpbnQgaXJxLCB2b2lkICpwcml2YXRlKQorc3RhdGljIGlycXJldHVybl90IGJtYzE1MF9hY2NlbF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwcml2YXRlOwogCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJYm9vbCBhY2sgPSBmYWxzZTsKKwlpbnQgaTsKIAorCWRhdGEtPm9sZF90aW1lc3RhbXAgPSBkYXRhLT50aW1lc3RhbXA7CiAJZGF0YS0+dGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKCk7CiAKLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWdnZXJfb24pCi0JCWlpb190cmlnZ2VyX3BvbGwoZGF0YS0+ZHJlYWR5X3RyaWcpOwotCWVsc2UgaWYgKGRhdGEtPm1vdGlvbl90cmlnZ2VyX29uKQotCQlpaW9fdHJpZ2dlcl9wb2xsKGRhdGEtPm1vdGlvbl90cmlnKTsKKwlmb3IgKGkgPSAwOyBpIDwgQk1DMTUwX0FDQ0VMX1RSSUdHRVJTOyBpKyspIHsKKwkJaWYgKGRhdGEtPnRyaWdnZXJzW2ldLmVuYWJsZWQpIHsKKwkJCWlpb190cmlnZ2VyX3BvbGwoZGF0YS0+dHJpZ2dlcnNbaV0uaW5kaW9fdHJpZyk7CisJCQlhY2sgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQlpZiAoZGF0YS0+ZXZfZW5hYmxlX3N0YXRlKQorCWlmIChkYXRhLT5ldl9lbmFibGVfc3RhdGUgfHwgZGF0YS0+Zmlmb19tb2RlKQogCQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOwotCWVsc2UKKworCWlmIChhY2spCiAJCXJldHVybiBJUlFfSEFORExFRDsKKworCXJldHVybiBJUlFfTk9ORTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmJtYzE1MF9hY2NlbF9tYXRjaF9hY3BpX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCAqZGF0YSkKQEAgLTExNzYsMTYgKzE0MzEsMTIgQEAKIAlkZXYgPSAmY2xpZW50LT5kZXY7CiAKIAkvKiBkYXRhIHJlYWR5IGdwaW8gaW50ZXJydXB0IHBpbiAqLwotCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEJNQzE1MF9BQ0NFTF9HUElPX05BTUUsIDApOworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEJNQzE1MF9BQ0NFTF9HUElPX05BTUUsIDAsIEdQSU9EX0lOKTsKIAlpZiAoSVNfRVJSKGdwaW8pKSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkOiBncGlvIGdldCBpbmRleFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGdwaW8pOwogCX0KIAotCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gZ3Bpb2RfdG9faXJxKGdwaW8pOwogCiAJZGV2X2RiZyhkZXYsICJHUElPIHJlc291cmNlLCBubzolZCBpcnE6JWRcbiIsIGRlc2NfdG9fZ3BpbyhncGlvKSwgcmV0KTsKQEAgLTExOTMsNiArMTQ0NCwxNTggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlpbnQgaW50cjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnNldHVwKShzdHJ1Y3QgYm1jMTUwX2FjY2VsX3RyaWdnZXIgKnQsIGJvb2wgc3RhdGUpOworfSBibWMxNTBfYWNjZWxfdHJpZ2dlcnNbQk1DMTUwX0FDQ0VMX1RSSUdHRVJTXSA9IHsKKwl7CisJCS5pbnRyID0gMCwKKwkJLm5hbWUgPSAiJXMtZGV2JWQiLAorCX0sCisJeworCQkuaW50ciA9IDEsCisJCS5uYW1lID0gIiVzLWFueS1tb3Rpb24tZGV2JWQiLAorCQkuc2V0dXAgPSBibWMxNTBfYWNjZWxfYW55X21vdGlvbl9zZXR1cCwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgYm1jMTUwX2FjY2VsX3VucmVnaXN0ZXJfdHJpZ2dlcnMoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhLAorCQkJCQkgICAgIGludCBmcm9tKQoreworCWludCBpOworCisJZm9yIChpID0gZnJvbTsgaSA+PSAwOyBpKyspIHsKKwkJaWYgKGRhdGEtPnRyaWdnZXJzW2ldLmluZGlvX3RyaWcpIHsKKwkJCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoZGF0YS0+dHJpZ2dlcnNbaV0uaW5kaW9fdHJpZyk7CisJCQlkYXRhLT50cmlnZ2Vyc1tpXS5pbmRpb190cmlnID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBibWMxNTBfYWNjZWxfdHJpZ2dlcnNfc2V0dXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgICAgc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhKQoreworCWludCBpLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQk1DMTUwX0FDQ0VMX1RSSUdHRVJTOyBpKyspIHsKKwkJc3RydWN0IGJtYzE1MF9hY2NlbF90cmlnZ2VyICp0ID0gJmRhdGEtPnRyaWdnZXJzW2ldOworCisJCXQtPmluZGlvX3RyaWcgPSBkZXZtX2lpb190cmlnZ2VyX2FsbG9jKCZkYXRhLT5jbGllbnQtPmRldiwKKwkJCQkJICAgICAgIGJtYzE1MF9hY2NlbF90cmlnZ2Vyc1tpXS5uYW1lLAorCQkJCQkJICAgICAgIGluZGlvX2Rldi0+bmFtZSwKKwkJCQkJCSAgICAgICBpbmRpb19kZXYtPmlkKTsKKwkJaWYgKCF0LT5pbmRpb190cmlnKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQl0LT5pbmRpb190cmlnLT5kZXYucGFyZW50ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCQl0LT5pbmRpb190cmlnLT5vcHMgPSAmYm1jMTUwX2FjY2VsX3RyaWdnZXJfb3BzOworCQl0LT5pbnRyID0gYm1jMTUwX2FjY2VsX3RyaWdnZXJzW2ldLmludHI7CisJCXQtPmRhdGEgPSBkYXRhOworCQl0LT5zZXR1cCA9IGJtYzE1MF9hY2NlbF90cmlnZ2Vyc1tpXS5zZXR1cDsKKwkJaWlvX3RyaWdnZXJfc2V0X2RydmRhdGEodC0+aW5kaW9fdHJpZywgdCk7CisKKwkJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIodC0+aW5kaW9fdHJpZyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlpZiAocmV0KQorCQlibWMxNTBfYWNjZWxfdW5yZWdpc3Rlcl90cmlnZ2VycyhkYXRhLCBpIC0gMSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9GSUZPX01PREVfU1RSRUFNICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX0ZJRk9fTU9ERV9GSUZPICAgICAgICAgICAgMHg0MAorI2RlZmluZSBCTUMxNTBfQUNDRUxfRklGT19NT0RFX0JZUEFTUyAgICAgICAgICAweDAwCisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhKQoreworCXU4IHJlZyA9IEJNQzE1MF9BQ0NFTF9SRUdfRklGT19DT05GSUcxOworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgcmVnLCBkYXRhLT5maWZvX21vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfZmlmb19jb25maWcxXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWRhdGEtPmZpZm9fbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJQk1DMTUwX0FDQ0VMX1JFR19GSUZPX0NPTkZJRzAsCisJCQkJCWRhdGEtPndhdGVybWFyayk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfZmlmb19jb25maWcwXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2J1ZmZlcl9wb3N0ZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpbmRpb19kZXYtPmN1cnJlbnRtb2RlID09IElORElPX0JVRkZFUl9UUklHR0VSRUQpCisJCXJldHVybiBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisKKwlpZiAoIWRhdGEtPndhdGVybWFyaykKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBibWMxNTBfYWNjZWxfc2V0X2ludGVycnVwdChkYXRhLCBCTUMxNTBfQUNDRUxfSU5UX1dBVEVSTUFSSywKKwkJCQkJIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZGF0YS0+Zmlmb19tb2RlID0gQk1DMTUwX0FDQ0VMX0ZJRk9fTU9ERV9GSUZPOworCisJcmV0ID0gYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CisJaWYgKHJldCkgeworCQlkYXRhLT5maWZvX21vZGUgPSAwOworCQlibWMxNTBfYWNjZWxfc2V0X2ludGVycnVwdChkYXRhLCBCTUMxNTBfQUNDRUxfSU5UX1dBVEVSTUFSSywKKwkJCQkJICAgZmFsc2UpOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBibWMxNTBfYWNjZWxfYnVmZmVyX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWYgKGluZGlvX2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkKKwkJcmV0dXJuIGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKKworCWlmICghZGF0YS0+Zmlmb19tb2RlKQorCQlnb3RvIG91dDsKKworCWJtYzE1MF9hY2NlbF9zZXRfaW50ZXJydXB0KGRhdGEsIEJNQzE1MF9BQ0NFTF9JTlRfV0FURVJNQVJLLCBmYWxzZSk7CisJX19ibWMxNTBfYWNjZWxfZmlmb19mbHVzaChpbmRpb19kZXYsIEJNQzE1MF9BQ0NFTF9GSUZPX0xFTkdUSCwgZmFsc2UpOworCWRhdGEtPmZpZm9fbW9kZSA9IDA7CisJYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CisKK291dDoKKwltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIGJtYzE1MF9hY2NlbF9idWZmZXJfb3BzID0geworCS5wb3N0ZW5hYmxlID0gYm1jMTUwX2FjY2VsX2J1ZmZlcl9wb3N0ZW5hYmxlLAorCS5wcmVkaXNhYmxlID0gYm1jMTUwX2FjY2VsX2J1ZmZlcl9wcmVkaXNhYmxlLAorfTsKKwogc3RhdGljIGludCBibWMxNTBfYWNjZWxfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTEyMzksNTMgKzE2NDIsNTEgQEAKIAlpZiAoY2xpZW50LT5pcnEgPj0gMCkgewogCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKAogCQkJCQkJJmNsaWVudC0+ZGV2LCBjbGllbnQtPmlycSwKLQkJCQkJCWJtYzE1MF9hY2NlbF9kYXRhX3JkeV90cmlnX3BvbGwsCi0JCQkJCQlibWMxNTBfYWNjZWxfZXZlbnRfaGFuZGxlciwKKwkJCQkJCWJtYzE1MF9hY2NlbF9pcnFfaGFuZGxlciwKKwkJCQkJCWJtYzE1MF9hY2NlbF9pcnFfdGhyZWFkX2hhbmRsZXIsCiAJCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCQkJQk1DMTUwX0FDQ0VMX0lSUV9OQU1FLAogCQkJCQkJaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZGF0YS0+ZHJlYWR5X3RyaWcgPSBkZXZtX2lpb190cmlnZ2VyX2FsbG9jKCZjbGllbnQtPmRldiwKLQkJCQkJCQkgICAiJXMtZGV2JWQiLAotCQkJCQkJCSAgIGluZGlvX2Rldi0+bmFtZSwKLQkJCQkJCQkgICBpbmRpb19kZXYtPmlkKTsKLQkJaWYgKCFkYXRhLT5kcmVhZHlfdHJpZykKLQkJCXJldHVybiAtRU5PTUVNOworCQkvKgorCQkgKiBTZXQgbGF0Y2hlZCBtb2RlIGludGVycnVwdC4gV2hpbGUgY2VydGFpbiBpbnRlcnJ1cHRzIGFyZQorCQkgKiBub24tbGF0Y2hlZCByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZ3MgKGUuZy4gbmV3IGRhdGEpIHdlCisJCSAqIHdhbnQgdG8gdXNlIGxhdGNoIG1vZGUgd2hlbiB3ZSBjYW4gdG8gcHJldmVudCBpbnRlcnJ1cHQKKwkJICogZmxvb2RpbmcuCisJCSAqLworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX1JTVF9MQVRDSCwKKwkJCQkJICAgICBCTUMxNTBfQUNDRUxfSU5UX01PREVfTEFUQ0hfUkVTRVQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19pbnRfcnN0X2xhdGNoXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAotCQlkYXRhLT5tb3Rpb25fdHJpZyA9IGRldm1faWlvX3RyaWdnZXJfYWxsb2MoJmNsaWVudC0+ZGV2LAotCQkJCQkJCSAgIiVzLWFueS1tb3Rpb24tZGV2JWQiLAotCQkJCQkJCSAgaW5kaW9fZGV2LT5uYW1lLAotCQkJCQkJCSAgaW5kaW9fZGV2LT5pZCk7Ci0JCWlmICghZGF0YS0+bW90aW9uX3RyaWcpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJYm1jMTUwX2FjY2VsX2ludGVycnVwdHNfc2V0dXAoaW5kaW9fZGV2LCBkYXRhKTsKIAotCQlkYXRhLT5kcmVhZHlfdHJpZy0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQkJZGF0YS0+ZHJlYWR5X3RyaWctPm9wcyA9ICZibWMxNTBfYWNjZWxfdHJpZ2dlcl9vcHM7Ci0JCWlpb190cmlnZ2VyX3NldF9kcnZkYXRhKGRhdGEtPmRyZWFkeV90cmlnLCBpbmRpb19kZXYpOwotCQlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihkYXRhLT5kcmVhZHlfdHJpZyk7CisJCXJldCA9IGJtYzE1MF9hY2NlbF90cmlnZ2Vyc19zZXR1cChpbmRpb19kZXYsIGRhdGEpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQlkYXRhLT5tb3Rpb25fdHJpZy0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQkJZGF0YS0+bW90aW9uX3RyaWctPm9wcyA9ICZibWMxNTBfYWNjZWxfdHJpZ2dlcl9vcHM7Ci0JCWlpb190cmlnZ2VyX3NldF9kcnZkYXRhKGRhdGEtPm1vdGlvbl90cmlnLCBpbmRpb19kZXYpOwotCQlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihkYXRhLT5tb3Rpb25fdHJpZyk7Ci0JCWlmIChyZXQpIHsKLQkJCWRhdGEtPm1vdGlvbl90cmlnID0gTlVMTDsKLQkJCWdvdG8gZXJyX3RyaWdnZXJfdW5yZWdpc3RlcjsKLQkJfQotCiAJCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwKIAkJCQkJCSAmaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCiAJCQkJCQkgYm1jMTUwX2FjY2VsX3RyaWdnZXJfaGFuZGxlciwKLQkJCQkJCSBOVUxMKTsKKwkJCQkJCSAmYm1jMTUwX2FjY2VsX2J1ZmZlcl9vcHMpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkJIkZhaWxlZDogaWlvIHRyaWdnZXJlZCBidWZmZXIgc2V0dXBcbiIpOwogCQkJZ290byBlcnJfdHJpZ2dlcl91bnJlZ2lzdGVyOwogCQl9CisKKwkJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSB8fAorCQkgICAgaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCQkgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0spKSB7CisJCQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9TT0ZUV0FSRTsKKwkJCWluZGlvX2Rldi0+aW5mbyA9ICZibWMxNTBfYWNjZWxfaW5mb19maWZvOworCQkJaW5kaW9fZGV2LT5idWZmZXItPmF0dHJzID0gYm1jMTUwX2FjY2VsX2ZpZm9fYXR0cmlidXRlczsKKwkJfQogCX0KIAogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKQEAgLTEzMDgsMTMgKzE3MDksMTAgQEAKIGVycl9paW9fdW5yZWdpc3RlcjoKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycl9idWZmZXJfY2xlYW51cDoKLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWcpCisJaWYgKGluZGlvX2Rldi0+cG9sbGZ1bmMpCiAJCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKIGVycl90cmlnZ2VyX3VucmVnaXN0ZXI6Ci0JaWYgKGRhdGEtPmRyZWFkeV90cmlnKQotCQlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKGRhdGEtPmRyZWFkeV90cmlnKTsKLQlpZiAoZGF0YS0+bW90aW9uX3RyaWcpCi0JCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoZGF0YS0+bW90aW9uX3RyaWcpOworCWJtYzE1MF9hY2NlbF91bnJlZ2lzdGVyX3RyaWdnZXJzKGRhdGEsIEJNQzE1MF9BQ0NFTF9UUklHR0VSUyAtIDEpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzMzAsMTEgKzE3MjgsNyBAQAogCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAKLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWcpIHsKLQkJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOwotCQlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKGRhdGEtPmRyZWFkeV90cmlnKTsKLQkJaWlvX3RyaWdnZXJfdW5yZWdpc3RlcihkYXRhLT5tb3Rpb25fdHJpZyk7Ci0JfQorCWJtYzE1MF9hY2NlbF91bnJlZ2lzdGVyX3RyaWdnZXJzKGRhdGEsIEJNQzE1MF9BQ0NFTF9UUklHR0VSUyAtIDEpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwogCWJtYzE1MF9hY2NlbF9zZXRfbW9kZShkYXRhLCBCTUMxNTBfQUNDRUxfU0xFRVBfTU9ERV9ERUVQX1NVU1BFTkQsIDApOwpAQCAtMTM2Miw5ICsxNzU2LDkgQEAKIAlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwotCWlmIChkYXRhLT5kcmVhZHlfdHJpZ2dlcl9vbiB8fCBkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbiB8fAotCQkJCQkJCWRhdGEtPmV2X2VuYWJsZV9zdGF0ZSkKKwlpZiAoYXRvbWljX3JlYWQoJmRhdGEtPmFjdGl2ZV9pbnRyKSkKIAkJYm1jMTUwX2FjY2VsX3NldF9tb2RlKGRhdGEsIEJNQzE1MF9BQ0NFTF9TTEVFUF9NT0RFX05PUk1BTCwgMCk7CisJYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTEzOTgsNiArMTc5Miw5IEBACiAJcmV0ID0gYm1jMTUwX2FjY2VsX3NldF9tb2RlKGRhdGEsIEJNQzE1MF9BQ0NFTF9TTEVFUF9NT0RFX05PUk1BTCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CisJcmV0ID0gYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlzbGVlcF92YWwgPSBibWMxNTBfYWNjZWxfZ2V0X3N0YXJ0dXBfdGltZXMoZGF0YSk7CiAJaWYgKHNsZWVwX3ZhbCA8IDIwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwva3hjamstMTAxMy5jIGIvZHJpdmVycy9paW8vYWNjZWwva3hjamstMTAxMy5jCmluZGV4IDFhNjM3OTUuLjUxZGEzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2t4Y2prLTEwMTMuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reGNqay0xMDEzLmMKQEAgLTExNjksMTYgKzExNjksMTIgQEAKIAlkZXYgPSAmY2xpZW50LT5kZXY7CiAKIAkvKiBkYXRhIHJlYWR5IGdwaW8gaW50ZXJydXB0IHBpbiAqLwotCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsICJreGNqazEwMTNfaW50IiwgMCk7CisJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgImt4Y2prMTAxM19pbnQiLCAwLCBHUElPRF9JTik7CiAJaWYgKElTX0VSUihncGlvKSkgewogCQlkZXZfZXJyKGRldiwgImFjcGkgZ3BpbyBnZXQgaW5kZXggZmFpbGVkXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoZ3Bpbyk7CiAJfQogCi0JcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSBncGlvZF90b19pcnEoZ3Bpbyk7CiAKIAlkZXZfZGJnKGRldiwgIkdQSU8gcmVzb3VyY2UsIG5vOiVkIGlycTolZFxuIiwgZGVzY190b19ncGlvKGdwaW8pLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvbW1hOTU1MS5jIGIvZHJpdmVycy9paW8vYWNjZWwvbW1hOTU1MS5jCmluZGV4IDQ2YzM4MzUuLjdkYjdjYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL21tYTk1NTEuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9tbWE5NTUxLmMKQEAgLTQxOCwxNyArNDE4LDE4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OwogCiAJZm9yIChpID0gMDsgaSA8IE1NQTk1NTFfR1BJT19DT1VOVDsgaSsrKSB7Ci0JCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIE1NQTk1NTFfR1BJT19OQU1FLCBpKTsKKwkJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgTU1BOTU1MV9HUElPX05BTUUsIGksCisJCQkJCSAgICBHUElPRF9JTik7CiAJCWlmIChJU19FUlIoZ3BpbykpIHsKIAkJCWRldl9lcnIoZGV2LCAiYWNwaSBncGlvIGdldCBpbmRleCBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIFBUUl9FUlIoZ3Bpbyk7CiAJCX0KIAotCQlyZXQgPSBncGlvZF9kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7Ci0JCWlmIChyZXQpCisJCXJldCA9IGdwaW9kX3RvX2lycShncGlvKTsKKwkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWRhdGEtPmlycXNbaV0gPSBncGlvZF90b19pcnEoZ3Bpbyk7CisJCWRhdGEtPmlycXNbaV0gPSByZXQ7CiAJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBkYXRhLT5pcnFzW2ldLAogCQkJCU5VTEwsIG1tYTk1NTFfZXZlbnRfaGFuZGxlciwKIAkJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9PTkVTSE9ULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvbW1hOTU1My5jIGIvZHJpdmVycy9paW8vYWNjZWwvbW1hOTU1My5jCmluZGV4IGQyM2ViZjEuLjJkZjFhZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL21tYTk1NTMuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9tbWE5NTUzLmMKQEAgLTExMDksMTYgKzExMDksMTIgQEAKIAlkZXYgPSAmY2xpZW50LT5kZXY7CiAKIAkvKiBkYXRhIHJlYWR5IGdwaW8gaW50ZXJydXB0IHBpbiAqLwotCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIE1NQTk1NTNfR1BJT19OQU1FLCAwKTsKKwlncGlvID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCBNTUE5NTUzX0dQSU9fTkFNRSwgMCwgR1BJT0RfSU4pOwogCWlmIChJU19FUlIoZ3BpbykpIHsKIAkJZGV2X2VycihkZXYsICJhY3BpIGdwaW8gZ2V0IGluZGV4IGZhaWxlZFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGdwaW8pOwogCX0KIAotCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gZ3Bpb2RfdG9faXJxKGdwaW8pOwogCiAJZGV2X2RiZyhkZXYsICJncGlvIHJlc291cmNlLCBubzolZCBpcnE6JWRcbiIsIGRlc2NfdG9fZ3BpbyhncGlvKSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsLmggYi9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbC5oCmluZGV4IGZhOTY0NjAuLjdlZTk3MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsLmgKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvc3RfYWNjZWwuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaWlvL2NvbW1vbi9zdF9zZW5zb3JzLmg+CiAKKyNkZWZpbmUgTElTM0xWMDJETF9BQ0NFTF9ERVZfTkFNRQkibGlzM2x2MDJkbF9hY2NlbCIKICNkZWZpbmUgTFNNMzAzRExIQ19BQ0NFTF9ERVZfTkFNRQkibHNtMzAzZGxoY19hY2NlbCIKICNkZWZpbmUgTElTM0RIX0FDQ0VMX0RFVl9OQU1FCQkibGlzM2RoIgogI2RlZmluZSBMU00zMzBEX0FDQ0VMX0RFVl9OQU1FCQkibHNtMzMwZF9hY2NlbCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsX2NvcmUuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsX2NvcmUuYwppbmRleCA1M2YzMjYyLi41OGQxZDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbF9jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvc3RfYWNjZWxfY29yZS5jCkBAIC0xMjksNiArMTI5LDMwIEBACiAjZGVmaW5lIFNUX0FDQ0VMXzNfSUcxX0VOX01BU0sJCQkweDA4CiAjZGVmaW5lIFNUX0FDQ0VMXzNfTVVMVElSRUFEX0JJVAkJZmFsc2UKIAorLyogQ1VTVE9NIFZBTFVFUyBGT1IgU0VOU09SIDQgKi8KKyNkZWZpbmUgU1RfQUNDRUxfNF9XQUlfRVhQCQkJMHgzYQorI2RlZmluZSBTVF9BQ0NFTF80X09EUl9BRERSCQkJMHgyMAorI2RlZmluZSBTVF9BQ0NFTF80X09EUl9NQVNLCQkJMHgzMCAvKiBERjEgYW5kIERGMCAqLworI2RlZmluZSBTVF9BQ0NFTF80X09EUl9BVkxfNDBIWl9WQUwJCTB4MDAKKyNkZWZpbmUgU1RfQUNDRUxfNF9PRFJfQVZMXzE2MEhaX1ZBTAkJMHgwMQorI2RlZmluZSBTVF9BQ0NFTF80X09EUl9BVkxfNjQwSFpfVkFMCQkweDAyCisjZGVmaW5lIFNUX0FDQ0VMXzRfT0RSX0FWTF8yNTYwSFpfVkFMCQkweDAzCisjZGVmaW5lIFNUX0FDQ0VMXzRfUFdfQUREUgkJCTB4MjAKKyNkZWZpbmUgU1RfQUNDRUxfNF9QV19NQVNLCQkJMHhjMAorI2RlZmluZSBTVF9BQ0NFTF80X0ZTX0FERFIJCQkweDIxCisjZGVmaW5lIFNUX0FDQ0VMXzRfRlNfTUFTSwkJCTB4ODAKKyNkZWZpbmUgU1RfQUNDRUxfNF9GU19BVkxfMl9WQUwJCQkwWDAwCisjZGVmaW5lIFNUX0FDQ0VMXzRfRlNfQVZMXzZfVkFMCQkJMFgwMQorI2RlZmluZSBTVF9BQ0NFTF80X0ZTX0FWTF8yX0dBSU4JCUlJT19HX1RPX01fU18yKDEwMjQpCisjZGVmaW5lIFNUX0FDQ0VMXzRfRlNfQVZMXzZfR0FJTgkJSUlPX0dfVE9fTV9TXzIoMzQwKQorI2RlZmluZSBTVF9BQ0NFTF80X0JEVV9BRERSCQkJMHgyMQorI2RlZmluZSBTVF9BQ0NFTF80X0JEVV9NQVNLCQkJMHg0MAorI2RlZmluZSBTVF9BQ0NFTF80X0RSRFlfSVJRX0FERFIJCTB4MjEKKyNkZWZpbmUgU1RfQUNDRUxfNF9EUkRZX0lSUV9JTlQxX01BU0sJCTB4MDQKKyNkZWZpbmUgU1RfQUNDRUxfNF9JRzFfRU5fQUREUgkJCTB4MjEKKyNkZWZpbmUgU1RfQUNDRUxfNF9JRzFfRU5fTUFTSwkJCTB4MDgKKyNkZWZpbmUgU1RfQUNDRUxfNF9NVUxUSVJFQURfQklUCQl0cnVlCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzdF9hY2NlbF8xMmJpdF9jaGFubmVsc1tdID0gewogCVNUX1NFTlNPUlNfTFNNX0NIQU5ORUxTKElJT19BQ0NFTCwKIAkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCkBAIC0zNzMsNiArMzk3LDYzIEBACiAJCS5tdWx0aV9yZWFkX2JpdCA9IFNUX0FDQ0VMXzNfTVVMVElSRUFEX0JJVCwKIAkJLmJvb3RpbWUgPSAyLAogCX0sCisJeworCQkud2FpID0gU1RfQUNDRUxfNF9XQUlfRVhQLAorCQkuc2Vuc29yc19zdXBwb3J0ZWQgPSB7CisJCQlbMF0gPSBMSVMzTFYwMkRMX0FDQ0VMX0RFVl9OQU1FLAorCQl9LAorCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9hY2NlbF8xMmJpdF9jaGFubmVscywKKwkJLm9kciA9IHsKKwkJCS5hZGRyID0gU1RfQUNDRUxfNF9PRFJfQUREUiwKKwkJCS5tYXNrID0gU1RfQUNDRUxfNF9PRFJfTUFTSywKKwkJCS5vZHJfYXZsID0geworCQkJCXsgNDAsIFNUX0FDQ0VMXzRfT0RSX0FWTF80MEhaX1ZBTCB9LAorCQkJCXsgMTYwLCBTVF9BQ0NFTF80X09EUl9BVkxfMTYwSFpfVkFMLCB9LAorCQkJCXsgNjQwLCBTVF9BQ0NFTF80X09EUl9BVkxfNjQwSFpfVkFMLCB9LAorCQkJCXsgMjU2MCwgU1RfQUNDRUxfNF9PRFJfQVZMXzI1NjBIWl9WQUwsIH0sCisJCQl9LAorCQl9LAorCQkucHcgPSB7CisJCQkuYWRkciA9IFNUX0FDQ0VMXzRfUFdfQUREUiwKKwkJCS5tYXNrID0gU1RfQUNDRUxfNF9QV19NQVNLLAorCQkJLnZhbHVlX29uID0gU1RfU0VOU09SU19ERUZBVUxUX1BPV0VSX09OX1ZBTFVFLAorCQkJLnZhbHVlX29mZiA9IFNUX1NFTlNPUlNfREVGQVVMVF9QT1dFUl9PRkZfVkFMVUUsCisJCX0sCisJCS5lbmFibGVfYXhpcyA9IHsKKwkJCS5hZGRyID0gU1RfU0VOU09SU19ERUZBVUxUX0FYSVNfQUREUiwKKwkJCS5tYXNrID0gU1RfU0VOU09SU19ERUZBVUxUX0FYSVNfTUFTSywKKwkJfSwKKwkJLmZzID0geworCQkJLmFkZHIgPSBTVF9BQ0NFTF80X0ZTX0FERFIsCisJCQkubWFzayA9IFNUX0FDQ0VMXzRfRlNfTUFTSywKKwkJCS5mc19hdmwgPSB7CisJCQkJWzBdID0geworCQkJCQkubnVtID0gU1RfQUNDRUxfRlNfQVZMXzJHLAorCQkJCQkudmFsdWUgPSBTVF9BQ0NFTF80X0ZTX0FWTF8yX1ZBTCwKKwkJCQkJLmdhaW4gPSBTVF9BQ0NFTF80X0ZTX0FWTF8yX0dBSU4sCisJCQkJfSwKKwkJCQlbMV0gPSB7CisJCQkJCS5udW0gPSBTVF9BQ0NFTF9GU19BVkxfNkcsCisJCQkJCS52YWx1ZSA9IFNUX0FDQ0VMXzRfRlNfQVZMXzZfVkFMLAorCQkJCQkuZ2FpbiA9IFNUX0FDQ0VMXzRfRlNfQVZMXzZfR0FJTiwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwkJLmJkdSA9IHsKKwkJCS5hZGRyID0gU1RfQUNDRUxfNF9CRFVfQUREUiwKKwkJCS5tYXNrID0gU1RfQUNDRUxfNF9CRFVfTUFTSywKKwkJfSwKKwkJLmRyZHlfaXJxID0geworCQkJLmFkZHIgPSBTVF9BQ0NFTF80X0RSRFlfSVJRX0FERFIsCisJCQkubWFza19pbnQxID0gU1RfQUNDRUxfNF9EUkRZX0lSUV9JTlQxX01BU0ssCisJCQkuaWcxID0geworCQkJCS5lbl9hZGRyID0gU1RfQUNDRUxfNF9JRzFfRU5fQUREUiwKKwkJCQkuZW5fbWFzayA9IFNUX0FDQ0VMXzRfSUcxX0VOX01BU0ssCisJCQl9LAorCQl9LAorCQkubXVsdGlfcmVhZF9iaXQgPSBTVF9BQ0NFTF80X01VTFRJUkVBRF9CSVQsCisJCS5ib290aW1lID0gMiwgLyogZ3Vlc3MgKi8KKwl9LAogfTsKIAogc3RhdGljIGludCBzdF9hY2NlbF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvc3RfYWNjZWxfaTJjLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbF9pMmMuYwppbmRleCBjNzI0NmJkLi42YjcyMGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbF9pMmMuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbF9pMmMuYwpAQCAtMjEsNiArMjEsMTAgQEAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X2FjY2VsX29mX21hdGNoW10gPSB7CiAJeworCQkuY29tcGF0aWJsZSA9ICJzdCxsaXMzbHYwMmRsLWFjY2VsIiwKKwkJLmRhdGEgPSBMSVMzTFYwMkRMX0FDQ0VMX0RFVl9OQU1FLAorCX0sCisJewogCQkuY29tcGF0aWJsZSA9ICJzdCxsc20zMDNkbGgtYWNjZWwiLAogCQkuZGF0YSA9IExTTTMwM0RMSF9BQ0NFTF9ERVZfTkFNRSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwppbmRleCBkODJhZjE0Li5lMzZhNzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwpAQCAtMTk2LDEwICsxOTYsMTEgQEAKIAkgIGRhdGEgdmlhIHRoZSBpaW8gZGV2IGludGVyZmFjZS4KIAogY29uZmlnIE1DUDMyMFgKLQl0cmlzdGF0ZSAiTWljcm9jaGlwIFRlY2hub2xvZ3kgTUNQMzIwNC8wOCIKKwl0cmlzdGF0ZSAiTWljcm9jaGlwIFRlY2hub2xvZ3kgTUNQM3gwMS8wMi8wNC8wOCIKIAlkZXBlbmRzIG9uIFNQSQogCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBNaWNyb2NoaXAgVGVjaG5vbG9neSdzIE1DUDMyMDQgb3IKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBNaWNyb2NoaXAgVGVjaG5vbG9neSdzCisJICBNQ1AzMDAxLCBNQ1AzMDAyLCBNQ1AzMDA0LCBNQ1AzMDA4LCBNQ1AzMjAxLCBNQ1AzMjAyLCBNQ1AzMjA0IG9yCiAJICBNQ1AzMjA4IGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRlci4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9hZDc3OTMuYyBiL2RyaXZlcnMvaWlvL2FkYy9hZDc3OTMuYwppbmRleCA0ZGRkZWFiLi5iODQ5MjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvYWQ3NzkzLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jCkBAIC04NjEsNSArODYxLDUgQEAKIG1vZHVsZV9zcGlfZHJpdmVyKGFkNzc5M19kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDc3OTMgYW5kIHNpbWlhbHIgQURDcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDc3OTMgYW5kIHNpbWlsYXIgQURDcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jCmluZGV4IGU2M2I4ZTcuLjU2MjkyYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy92ZjYxMF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMKQEAgLTI3NSw3ICsyNzUsNiBAQAogc3RhdGljIHZvaWQgdmY2MTBfYWRjX2NhbGlicmF0aW9uKHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCiB7CiAJaW50IGFkY19nYywgaGNfY2ZnOwotCWludCB0aW1lb3V0OwogCiAJaWYgKCFpbmZvLT5hZGNfZmVhdHVyZS5jYWxpYnJhdGlvbikKIAkJcmV0dXJuOwpAQCAtMjg3LDkgKzI4Niw3IEBACiAJYWRjX2djID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR0MpOwogCXdyaXRlbChhZGNfZ2MgfCBWRjYxMF9BRENfQ0FMLCBpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19HQyk7CiAKLQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0Ci0JCQkoJmluZm8tPmNvbXBsZXRpb24sIFZGNjEwX0FEQ19USU1FT1VUKTsKLQlpZiAodGltZW91dCA9PSAwKQorCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbmZvLT5jb21wbGV0aW9uLCBWRjYxMF9BRENfVElNRU9VVCkpCiAJCWRldl9lcnIoaW5mby0+ZGV2LCAiVGltZW91dCBmb3IgYWRjIGNhbGlicmF0aW9uXG4iKTsKIAogCWFkY19nYyA9IHJlYWRsKGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NvbW1vbi9zc3Bfc2Vuc29ycy9zc3BfZGV2LmMgYi9kcml2ZXJzL2lpby9jb21tb24vc3NwX3NlbnNvcnMvc3NwX2Rldi5jCmluZGV4IDU1YTkwMDgyLi45YTQwMDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vc3NwX3NlbnNvcnMvc3NwX2Rldi5jCisrKyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zc3Bfc2Vuc29ycy9zc3BfZGV2LmMKQEAgLTQzNyw3ICs0MzcsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzc3Bfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNzcF9vZl9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUJPSAic2Ftc3VuZyxzZW5zb3JodWItcmluYXRvIiwKIAkJLmRhdGEJCT0gJnNzcF9yaW5hdG9faW5mbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9LY29uZmlnIGIvZHJpdmVycy9paW8vZGFjL0tjb25maWcKaW5kZXggMjIzNmVhMi4uMTM0NzFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vZGFjL0tjb25maWcKQEAgLTE0MywxMSArMTQzLDE2IEBACiAJICBhZDczMDMuCiAKIGNvbmZpZyBNQVg1MTcKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYNTE3LzUxOC81MTkgREFDIGRyaXZlciIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNTE3LzUxOC81MTkvNTIwLzUyMSBEQUMgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCiAJaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBjaGlwcyBNQVg1MTcsCi0JICBNQVg1MTggYW5kIE1BWDUxOSAoSTJDIDgtQml0IERBQ3Mgd2l0aCByYWlsLXRvLXJhaWwgb3V0cHV0cykuCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZyBNYXhpbSBjaGlwcworCSAgKEkyQyA4LUJpdCBEQUNzIHdpdGggcmFpbC10by1yYWlsIG91dHB1dHMpOgorCSAgTUFYNTE3IC0gU2luZ2xlIGNoYW5uZWwsIHNpbmdsZSByZWZlcmVuY2UKKwkgIE1BWDUxOCAtIER1YWwgY2hhbm5lbCwgcmVmPVZkZAorCSAgTUFYNTE5IC0gRHVhbCBjaGFubmVsLCBkdWFsIHJlZmVyZW5jZQorCSAgTUFYNTIwIC0gUXVhZCBjaGFubmVsLCBxdWFkIHJlZmVyZW5jZQorCSAgTUFYNTIxIC0gT2N0YWwgY2hhbm5lbCwgaW5kZXBlbmRlbnQgcmVmIGZvciBjaDAtMywgc2hhcmVkIHJlZiBmb3IgY2g0LTcKIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbWF4NTE3LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL21heDUxNy5jIGIvZHJpdmVycy9paW8vZGFjL21heDUxNy5jCmluZGV4IDlhODJhNzIuLjU1MDdiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9tYXg1MTcuYworKysgYi9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMKQEAgLTM5LDExICszOSwxMyBAQAogCUlEX01BWDUxNywKIAlJRF9NQVg1MTgsCiAJSURfTUFYNTE5LAorCUlEX01BWDUyMCwKKwlJRF9NQVg1MjEsCiB9OwogCiBzdHJ1Y3QgbWF4NTE3X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7Ci0JdW5zaWduZWQgc2hvcnQJCXZyZWZfbXZbMl07CisJdW5zaWduZWQgc2hvcnQJCXZyZWZfbXZbOF07CiB9OwogCiAvKgpAQCAtMTQ5LDcgKzE1MSwxMyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgbWF4NTE3X2NoYW5uZWxzW10gPSB7CiAJTUFYNTE3X0NIQU5ORUwoMCksCi0JTUFYNTE3X0NIQU5ORUwoMSkKKwlNQVg1MTdfQ0hBTk5FTCgxKSwKKwlNQVg1MTdfQ0hBTk5FTCgyKSwKKwlNQVg1MTdfQ0hBTk5FTCgzKSwKKwlNQVg1MTdfQ0hBTk5FTCg0KSwKKwlNQVg1MTdfQ0hBTk5FTCg1KSwKKwlNQVg1MTdfQ0hBTk5FTCg2KSwKKwlNQVg1MTdfQ0hBTk5FTCg3KSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4NTE3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0xNTgsNiArMTY2LDcgQEAKIAlzdHJ1Y3QgbWF4NTE3X2RhdGEgKmRhdGE7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAlzdHJ1Y3QgbWF4NTE3X3BsYXRmb3JtX2RhdGEgKnBsYXRmb3JtX2RhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBjaGFuOwogCiAJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CiAJaWYgKCFpbmRpb19kZXYpCkBAIC0xNjksMTEgKzE3OCwyMSBAQAogCS8qIGVzdGFibGlzaCB0aGF0IHRoZSBpaW9fZGV2IGlzIGEgY2hpbGQgb2YgdGhlIGkyYyBkZXZpY2UgKi8KIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CiAKLQkvKiByZWR1Y2VkIGNoYW5uZWwgc2V0IGZvciBNQVg1MTcgKi8KLQlpZiAoaWQtPmRyaXZlcl9kYXRhID09IElEX01BWDUxNykKLQkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSAxOwotCWVsc2UKKwlzd2l0Y2ggKGlkLT5kcml2ZXJfZGF0YSkgeworCWNhc2UgSURfTUFYNTIxOgorCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDg7CisJCWJyZWFrOworCWNhc2UgSURfTUFYNTIwOgorCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDQ7CisJCWJyZWFrOworCWNhc2UgSURfTUFYNTE5OgorCWNhc2UgSURfTUFYNTE4OgogCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDI7CisJCWJyZWFrOworCWRlZmF1bHQ6ICAvKiBzaW5nbGUgY2hhbm5lbCBmb3IgTUFYNTE3ICovCisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gMTsKKwkJYnJlYWs7CisJfQogCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtYXg1MTdfY2hhbm5lbHM7CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCWluZGlvX2Rldi0+aW5mbyA9ICZtYXg1MTdfaW5mbzsKQEAgLTE4MiwxMSArMjAxLDExIEBACiAJICogUmVmZXJlbmNlIHZvbHRhZ2Ugb24gTUFYNTE4IGFuZCBkZWZhdWx0IGlzIDVWLCBlbHNlIHRha2UgdnJlZl9tdgogCSAqIGZyb20gcGxhdGZvcm1fZGF0YQogCSAqLwotCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gSURfTUFYNTE4IHx8ICFwbGF0Zm9ybV9kYXRhKSB7Ci0JCWRhdGEtPnZyZWZfbXZbMF0gPSBkYXRhLT52cmVmX212WzFdID0gNTAwMDsgLyogbVYgKi8KLQl9IGVsc2UgewotCQlkYXRhLT52cmVmX212WzBdID0gcGxhdGZvcm1fZGF0YS0+dnJlZl9tdlswXTsKLQkJZGF0YS0+dnJlZl9tdlsxXSA9IHBsYXRmb3JtX2RhdGEtPnZyZWZfbXZbMV07CisJZm9yIChjaGFuID0gMDsgY2hhbiA8IGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBjaGFuKyspIHsKKwkJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSBJRF9NQVg1MTggfHwgIXBsYXRmb3JtX2RhdGEpCisJCQlkYXRhLT52cmVmX212W2NoYW5dID0gNTAwMDsgLyogbVYgKi8KKwkJZWxzZQorCQkJZGF0YS0+dnJlZl9tdltjaGFuXSA9IHBsYXRmb3JtX2RhdGEtPnZyZWZfbXZbY2hhbl07CiAJfQogCiAJcmV0dXJuIGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKQEAgLTIwMiw2ICsyMjEsOCBAQAogCXsgIm1heDUxNyIsIElEX01BWDUxNyB9LAogCXsgIm1heDUxOCIsIElEX01BWDUxOCB9LAogCXsgIm1heDUxOSIsIElEX01BWDUxOSB9LAorCXsgIm1heDUyMCIsIElEX01BWDUyMCB9LAorCXsgIm1heDUyMSIsIElEX01BWDUyMSB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXg1MTdfaWQpOwpAQCAtMjE4LDUgKzIzOSw1IEBACiBtb2R1bGVfaTJjX2RyaXZlcihtYXg1MTdfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiUm9sYW5kIFN0aWdnZSA8c3RpZ2dlQGFudGNvbS5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTUFYNTE3L01BWDUxOC9NQVg1MTkgOC1iaXQgREFDIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1BWDUxNy81MTgvNTE5LzUyMC81MjEgOC1iaXQgREFDIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9neXJvL2JtZzE2MC5jIGIvZHJpdmVycy9paW8vZ3lyby9ibWcxNjAuYwppbmRleCBjY2YzZWE3Li40NDE1ZjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9neXJvL2JtZzE2MC5jCisrKyBiL2RyaXZlcnMvaWlvL2d5cm8vYm1nMTYwLmMKQEAgLTEwMDEsMTYgKzEwMDEsMTIgQEAKIAlkZXYgPSAmY2xpZW50LT5kZXY7CiAKIAkvKiBkYXRhIHJlYWR5IGdwaW8gaW50ZXJydXB0IHBpbiAqLwotCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEJNRzE2MF9HUElPX05BTUUsIDApOworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEJNRzE2MF9HUElPX05BTUUsIDAsIEdQSU9EX0lOKTsKIAlpZiAoSVNfRVJSKGdwaW8pKSB7CiAJCWRldl9lcnIoZGV2LCAiYWNwaSBncGlvIGdldCBpbmRleCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihncGlvKTsKIAl9CiAKLQlyZXQgPSBncGlvZF9kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGdwaW9kX3RvX2lycShncGlvKTsKIAogCWRldl9kYmcoZGV2LCAiR1BJTyByZXNvdXJjZSwgbm86JWQgaXJxOiVkXG4iLCBkZXNjX3RvX2dwaW8oZ3BpbyksIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9neXJvL2l0ZzMyMDBfY29yZS5jIGIvZHJpdmVycy9paW8vZ3lyby9pdGczMjAwX2NvcmUuYwppbmRleCA2YTgwMjBkLi5mMGZkOTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9neXJvL2l0ZzMyMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2d5cm8vaXRnMzIwMF9jb3JlLmMKQEAgLTIyMyw2ICsyMjMsMTAgQEAKIAlpbnQgcmV0OwogCXU4IHZhbDsKIAorCXJldCA9IGl0ZzMyMDBfcmVzZXQoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKIAlyZXQgPSBpdGczMjAwX3JlYWRfcmVnXzgoaW5kaW9fZGV2LCBJVEczMjAwX1JFR19BRERSRVNTLCAmdmFsKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9yZXQ7CkBAIC0yMzMsMTAgKzIzNyw2IEBACiAJCWdvdG8gZXJyX3JldDsKIAl9CiAKLQlyZXQgPSBpdGczMjAwX3Jlc2V0KGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfcmV0OwotCiAJcmV0ID0gaXRnMzIwMF9lbmFibGVfZnVsbF9zY2FsZShpbmRpb19kZXYpOwogZXJyX3JldDoKIAlyZXR1cm4gcmV0OwpAQCAtMzUxLDYgKzM1MSwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGl0ZzMyMDBfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpdGczMjAwICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlkZXZfZGJnKCZzdC0+aTJjLT5kZXYsICJzdXNwZW5kIGRldmljZSIpOworCisJcmV0dXJuIGl0ZzMyMDBfd3JpdGVfcmVnXzgoaW5kaW9fZGV2LCBJVEczMjAwX1JFR19QT1dFUl9NQU5BR0VNRU5ULAorCQkJCSAgIElURzMyMDBfU0xFRVApOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGl0ZzMyMDBfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gaXRnMzIwMF9pbml0aWFsX3NldHVwKGluZGlvX2Rldik7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhpdGczMjAwX3BtX29wcywgaXRnMzIwMF9zdXNwZW5kLCBpdGczMjAwX3Jlc3VtZSk7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpdGczMjAwX2lkW10gPSB7CiAJeyAiaXRnMzIwMCIsIDAgfSwKIAl7IH0KQEAgLTM2MSw2ICszODEsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5vd25lciAgPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAiaXRnMzIwMCIsCisJCS5wbQk9ICZpdGczMjAwX3BtX29wcywKIAl9LAogCS5pZF90YWJsZQk9IGl0ZzMyMDBfaWQsCiAJLnByb2JlCQk9IGl0ZzMyMDBfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9neXJvL3N0X2d5cm9fY29yZS5jIGIvZHJpdmVycy9paW8vZ3lyby9zdF9neXJvX2NvcmUuYwppbmRleCBmMDdhMjMzLi4yMTM5NWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9neXJvL3N0X2d5cm9fY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2d5cm8vc3RfZ3lyb19jb3JlLmMKQEAgLTg3LDYgKzg3LDMxIEBACiAjZGVmaW5lIFNUX0dZUk9fMl9EUkRZX0lSUV9JTlQyX01BU0sJCTB4MDgKICNkZWZpbmUgU1RfR1lST18yX01VTFRJUkVBRF9CSVQJCQl0cnVlCiAKKy8qIENVU1RPTSBWQUxVRVMgRk9SIFNFTlNPUiAzICovCisjZGVmaW5lIFNUX0dZUk9fM19XQUlfRVhQCQkJMHhkNworI2RlZmluZSBTVF9HWVJPXzNfT0RSX0FERFIJCQkweDIwCisjZGVmaW5lIFNUX0dZUk9fM19PRFJfTUFTSwkJCTB4YzAKKyNkZWZpbmUgU1RfR1lST18zX09EUl9BVkxfOTVIWl9WQUwJCTB4MDAKKyNkZWZpbmUgU1RfR1lST18zX09EUl9BVkxfMTkwSFpfVkFMCQkweDAxCisjZGVmaW5lIFNUX0dZUk9fM19PRFJfQVZMXzM4MEhaX1ZBTAkJMHgwMgorI2RlZmluZSBTVF9HWVJPXzNfT0RSX0FWTF83NjBIWl9WQUwJCTB4MDMKKyNkZWZpbmUgU1RfR1lST18zX1BXX0FERFIJCQkweDIwCisjZGVmaW5lIFNUX0dZUk9fM19QV19NQVNLCQkJMHgwOAorI2RlZmluZSBTVF9HWVJPXzNfRlNfQUREUgkJCTB4MjMKKyNkZWZpbmUgU1RfR1lST18zX0ZTX01BU0sJCQkweDMwCisjZGVmaW5lIFNUX0dZUk9fM19GU19BVkxfMjUwX1ZBTAkJMHgwMAorI2RlZmluZSBTVF9HWVJPXzNfRlNfQVZMXzUwMF9WQUwJCTB4MDEKKyNkZWZpbmUgU1RfR1lST18zX0ZTX0FWTF8yMDAwX1ZBTAkJMHgwMgorI2RlZmluZSBTVF9HWVJPXzNfRlNfQVZMXzI1MF9HQUlOCQlJSU9fREVHUkVFX1RPX1JBRCg4NzUwKQorI2RlZmluZSBTVF9HWVJPXzNfRlNfQVZMXzUwMF9HQUlOCQlJSU9fREVHUkVFX1RPX1JBRCgxNzUwMCkKKyNkZWZpbmUgU1RfR1lST18zX0ZTX0FWTF8yMDAwX0dBSU4JCUlJT19ERUdSRUVfVE9fUkFEKDcwMDAwKQorI2RlZmluZSBTVF9HWVJPXzNfQkRVX0FERFIJCQkweDIzCisjZGVmaW5lIFNUX0dZUk9fM19CRFVfTUFTSwkJCTB4ODAKKyNkZWZpbmUgU1RfR1lST18zX0RSRFlfSVJRX0FERFIJCQkweDIyCisjZGVmaW5lIFNUX0dZUk9fM19EUkRZX0lSUV9JTlQyX01BU0sJCTB4MDgKKyNkZWZpbmUgU1RfR1lST18zX01VTFRJUkVBRF9CSVQJCQl0cnVlCisKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0X2d5cm9fMTZiaXRfY2hhbm5lbHNbXSA9IHsKIAlTVF9TRU5TT1JTX0xTTV9DSEFOTkVMUyhJSU9fQU5HTF9WRUwsCiAJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLApAQCAtMjI1LDYgKzI1MCw2NCBAQAogCQkubXVsdGlfcmVhZF9iaXQgPSBTVF9HWVJPXzJfTVVMVElSRUFEX0JJVCwKIAkJLmJvb3RpbWUgPSAyLAogCX0sCisJeworCQkud2FpID0gU1RfR1lST18zX1dBSV9FWFAsCisJCS5zZW5zb3JzX3N1cHBvcnRlZCA9IHsKKwkJCVswXSA9IEwzR0QyMF9HWVJPX0RFVl9OQU1FLAorCQl9LAorCQkuY2ggPSAoc3RydWN0IGlpb19jaGFuX3NwZWMgKilzdF9neXJvXzE2Yml0X2NoYW5uZWxzLAorCQkub2RyID0geworCQkJLmFkZHIgPSBTVF9HWVJPXzNfT0RSX0FERFIsCisJCQkubWFzayA9IFNUX0dZUk9fM19PRFJfTUFTSywKKwkJCS5vZHJfYXZsID0geworCQkJCXsgOTUsIFNUX0dZUk9fM19PRFJfQVZMXzk1SFpfVkFMLCB9LAorCQkJCXsgMTkwLCBTVF9HWVJPXzNfT0RSX0FWTF8xOTBIWl9WQUwsIH0sCisJCQkJeyAzODAsIFNUX0dZUk9fM19PRFJfQVZMXzM4MEhaX1ZBTCwgfSwKKwkJCQl7IDc2MCwgU1RfR1lST18zX09EUl9BVkxfNzYwSFpfVkFMLCB9LAorCQkJfSwKKwkJfSwKKwkJLnB3ID0geworCQkJLmFkZHIgPSBTVF9HWVJPXzNfUFdfQUREUiwKKwkJCS5tYXNrID0gU1RfR1lST18zX1BXX01BU0ssCisJCQkudmFsdWVfb24gPSBTVF9TRU5TT1JTX0RFRkFVTFRfUE9XRVJfT05fVkFMVUUsCisJCQkudmFsdWVfb2ZmID0gU1RfU0VOU09SU19ERUZBVUxUX1BPV0VSX09GRl9WQUxVRSwKKwkJfSwKKwkJLmVuYWJsZV9heGlzID0geworCQkJLmFkZHIgPSBTVF9TRU5TT1JTX0RFRkFVTFRfQVhJU19BRERSLAorCQkJLm1hc2sgPSBTVF9TRU5TT1JTX0RFRkFVTFRfQVhJU19NQVNLLAorCQl9LAorCQkuZnMgPSB7CisJCQkuYWRkciA9IFNUX0dZUk9fM19GU19BRERSLAorCQkJLm1hc2sgPSBTVF9HWVJPXzNfRlNfTUFTSywKKwkJCS5mc19hdmwgPSB7CisJCQkJWzBdID0geworCQkJCQkubnVtID0gU1RfR1lST19GU19BVkxfMjUwRFBTLAorCQkJCQkudmFsdWUgPSBTVF9HWVJPXzNfRlNfQVZMXzI1MF9WQUwsCisJCQkJCS5nYWluID0gU1RfR1lST18zX0ZTX0FWTF8yNTBfR0FJTiwKKwkJCQl9LAorCQkJCVsxXSA9IHsKKwkJCQkJLm51bSA9IFNUX0dZUk9fRlNfQVZMXzUwMERQUywKKwkJCQkJLnZhbHVlID0gU1RfR1lST18zX0ZTX0FWTF81MDBfVkFMLAorCQkJCQkuZ2FpbiA9IFNUX0dZUk9fM19GU19BVkxfNTAwX0dBSU4sCisJCQkJfSwKKwkJCQlbMl0gPSB7CisJCQkJCS5udW0gPSBTVF9HWVJPX0ZTX0FWTF8yMDAwRFBTLAorCQkJCQkudmFsdWUgPSBTVF9HWVJPXzNfRlNfQVZMXzIwMDBfVkFMLAorCQkJCQkuZ2FpbiA9IFNUX0dZUk9fM19GU19BVkxfMjAwMF9HQUlOLAorCQkJCX0sCisJCQl9LAorCQl9LAorCQkuYmR1ID0geworCQkJLmFkZHIgPSBTVF9HWVJPXzNfQkRVX0FERFIsCisJCQkubWFzayA9IFNUX0dZUk9fM19CRFVfTUFTSywKKwkJfSwKKwkJLmRyZHlfaXJxID0geworCQkJLmFkZHIgPSBTVF9HWVJPXzNfRFJEWV9JUlFfQUREUiwKKwkJCS5tYXNrX2ludDIgPSBTVF9HWVJPXzNfRFJEWV9JUlFfSU5UMl9NQVNLLAorCQl9LAorCQkubXVsdGlfcmVhZF9iaXQgPSBTVF9HWVJPXzNfTVVMVElSRUFEX0JJVCwKKwkJLmJvb3RpbWUgPSAyLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHN0X2d5cm9fcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9NYWtlZmlsZQppbmRleCAzYTY3N2M3Li5mNTY2ZjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL01ha2VmaWxlCkBAIC0zLDQgKzMsNCBAQAogIwogCiBvYmotJChDT05GSUdfSU5WX01QVTYwNTBfSUlPKSArPSBpbnYtbXB1NjA1MC5vCi1pbnYtbXB1NjA1MC1vYmpzIDo9IGludl9tcHVfY29yZS5vIGludl9tcHVfcmluZy5vIGludl9tcHVfdHJpZ2dlci5vCitpbnYtbXB1NjA1MC1vYmpzIDo9IGludl9tcHVfY29yZS5vIGludl9tcHVfcmluZy5vIGludl9tcHVfdHJpZ2dlci5vIGludl9tcHVfYWNwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9hY3BpLmMgYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ODJhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2FjcGkuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIGludl9tcHVfYWNwaTogQUNQSSBwcm9jZXNzaW5nIGZvciBjcmVhdGluZyBjbGllbnQgZGV2aWNlcworICogQ29weXJpZ2h0IChjKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmZGVmIENPTkZJR19BQ1BJCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSAiaW52X21wdV9paW8uaCIKKworZW51bSBpbnZfbXB1X3Byb2R1Y3RfbmFtZSB7CisJSU5WX01QVV9OT1RfTUFUQ0hFRCwKKwlJTlZfTVBVX0FTVVNfVDEwMFRBLAorfTsKKworc3RhdGljIGVudW0gaW52X21wdV9wcm9kdWN0X25hbWUgbWF0Y2hlZF9wcm9kdWN0X25hbWU7CisKK3N0YXRpYyBpbnQgX19pbml0IGFzdXNfdDEwMF9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCW1hdGNoZWRfcHJvZHVjdF9uYW1lID0gSU5WX01QVV9BU1VTX1QxMDBUQTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgaW52X21wdV9kZXZfbGlzdFtdID0geworCXsKKwkuY2FsbGJhY2sgPSBhc3VzX3QxMDBfbWF0Y2hlZCwKKwkuaWRlbnQgPSAiQXN1cyBUcmFuc2Zvcm1lciBCb29rIFQxMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ09NUFVURVIgSU5DIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlQxMDBUQSIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICIxLjAiKSwKKwkJfSwKKwl9LAorCS8qIEFkZCBtb3JlIG1hdGNoaW5nIHRhYmxlcyBoZXJlLi4qLworCXt9Cit9OworCitzdGF0aWMgaW50IGFzdXNfYWNwaV9nZXRfc2Vuc29yX2luZm8oc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAorCQkJCSAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwlpbnQgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vYmplY3QgKmNwbTsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGFkZXYtPmhhbmRsZSwgIkNORjAiLCBOVUxMLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOworCisJY3BtID0gYnVmZmVyLnBvaW50ZXI7CisJZm9yIChpID0gMDsgaSA8IGNwbS0+cGFja2FnZS5jb3VudDsgKytpKSB7CisJCXVuaW9uIGFjcGlfb2JqZWN0ICplbGVtOworCQlpbnQgajsKKworCQllbGVtID0gJihjcG0tPnBhY2thZ2UuZWxlbWVudHNbaV0pOworCQlmb3IgKGogPSAwOyBqIDwgZWxlbS0+cGFja2FnZS5jb3VudDsgKytqKSB7CisJCQl1bmlvbiBhY3BpX29iamVjdCAqc3ViX2VsZW07CisKKwkJCXN1Yl9lbGVtID0gJihlbGVtLT5wYWNrYWdlLmVsZW1lbnRzW2pdKTsKKwkJCWlmIChzdWJfZWxlbS0+dHlwZSA9PSBBQ1BJX1RZUEVfU1RSSU5HKQorCQkJCXN0cmxjcHkoaW5mby0+dHlwZSwgc3ViX2VsZW0tPnN0cmluZy5wb2ludGVyLAorCQkJCQlzaXplb2YoaW5mby0+dHlwZSkpOworCQkJZWxzZSBpZiAoc3ViX2VsZW0tPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJCQlpZiAoc3ViX2VsZW0tPmludGVnZXIudmFsdWUgIT0gY2xpZW50LT5hZGRyKSB7CisJCQkJCWluZm8tPmFkZHIgPSBzdWJfZWxlbS0+aW50ZWdlci52YWx1ZTsKKwkJCQkJYnJlYWs7IC8qIE5vdCBhIE1QVTY1MDAgcHJpbWFyeSAqLworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKKworCXJldHVybiBjcG0tPnBhY2thZ2UuY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9pMmNfY2hlY2tfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFyZXMsIHZvaWQgKmRhdGEpCit7CisJdTMyICphZGRyID0gZGF0YTsKKworCWlmIChhcmVzLT50eXBlID09IEFDUElfUkVTT1VSQ0VfVFlQRV9TRVJJQUxfQlVTKSB7CisJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2kyY19zZXJpYWxidXMgKnNiOworCisJCXNiID0gJmFyZXMtPmRhdGEuaTJjX3NlcmlhbF9idXM7CisJCWlmIChzYi0+dHlwZSA9PSBBQ1BJX1JFU09VUkNFX1NFUklBTF9UWVBFX0kyQykgeworCQkJaWYgKCphZGRyKQorCQkJCSphZGRyIHw9IChzYi0+c2xhdmVfYWRkcmVzcyA8PCAxNik7CisJCQllbHNlCisJCQkJKmFkZHIgPSBzYi0+c2xhdmVfYWRkcmVzczsKKwkJfQorCX0KKworCS8qIFRlbGwgdGhlIEFDUEkgY29yZSB0aGF0IHdlIGFscmVhZHkgY29waWVkIHRoaXMgYWRkcmVzcyAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGludl9tcHVfcHJvY2Vzc19hY3BpX2NvbmZpZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCAqcHJpbWFyeV9hZGRyLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCAqc2Vjb25kYXJ5X2FkZHIpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXY7CisJdTMyIGkyY19hZGRyID0gMDsKKwlMSVNUX0hFQUQocmVzb3VyY2VzKTsKKwlpbnQgcmV0OworCisJaWQgPSBhY3BpX21hdGNoX2RldmljZShjbGllbnQtPmRldi5kcml2ZXItPmFjcGlfbWF0Y2hfdGFibGUsCisJCQkgICAgICAgJmNsaWVudC0+ZGV2KTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWFkZXYgPSBBQ1BJX0NPTVBBTklPTigmY2xpZW50LT5kZXYpOworCWlmICghYWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBhY3BpX2Rldl9nZXRfcmVzb3VyY2VzKGFkZXYsICZyZXNvdXJjZXMsCisJCQkJICAgICBhY3BpX2kyY19jaGVja19yZXNvdXJjZSwgJmkyY19hZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWFjcGlfZGV2X2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VzKTsKKwkqcHJpbWFyeV9hZGRyID0gaTJjX2FkZHIgJiAweDAwMDBmZmZmOworCSpzZWNvbmRhcnlfYWRkciA9IChpMmNfYWRkciAmIDB4ZmZmZjAwMDApID4+IDE2OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnZfbXB1X2FjcGlfY3JlYXRlX211eF9jbGllbnQoc3RydWN0IGludl9tcHU2MDUwX3N0YXRlICpzdCkKK3sKKworCXN0LT5tdXhfY2xpZW50ID0gTlVMTDsKKwlpZiAoQUNQSV9IQU5ETEUoJnN0LT5jbGllbnQtPmRldikpIHsKKwkJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CisJCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKKwkJaW50IHJldCA9IC0xOworCisJCWFkZXYgPSBBQ1BJX0NPTVBBTklPTigmc3QtPmNsaWVudC0+ZGV2KTsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCisJCWRtaV9jaGVja19zeXN0ZW0oaW52X21wdV9kZXZfbGlzdCk7CisJCXN3aXRjaCAobWF0Y2hlZF9wcm9kdWN0X25hbWUpIHsKKwkJY2FzZSBJTlZfTVBVX0FTVVNfVDEwMFRBOgorCQkJcmV0ID0gYXN1c19hY3BpX2dldF9zZW5zb3JfaW5mbyhhZGV2LCBzdC0+Y2xpZW50LAorCQkJCQkJCSZpbmZvKTsKKwkJCWJyZWFrOworCQkvKiBBZGQgbW9yZSBtYXRjaGVkIHByb2R1Y3QgcHJvY2Vzc2luZyBoZXJlICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZXQgPCAwKSB7CisJCQkvKiBObyBtYXRjaGluZyBETUksIHNvIGNyZWF0ZSBkZXZpY2Ugb24gSU5WNlhYIHR5cGUgKi8KKwkJCXVuc2lnbmVkIHNob3J0IHByaW1hcnksIHNlY29uZGFyeTsKKworCQkJcmV0ID0gaW52X21wdV9wcm9jZXNzX2FjcGlfY29uZmlnKHN0LT5jbGllbnQsICZwcmltYXJ5LAorCQkJCQkJCSAgJnNlY29uZGFyeSk7CisJCQlpZiAoIXJldCAmJiBzZWNvbmRhcnkpIHsKKwkJCQljaGFyICpuYW1lOworCisJCQkJaW5mby5hZGRyID0gc2Vjb25kYXJ5OworCQkJCXN0cmxjcHkoaW5mby50eXBlLCBkZXZfbmFtZSgmYWRldi0+ZGV2KSwKKwkJCQkJc2l6ZW9mKGluZm8udHlwZSkpOworCQkJCW5hbWUgPSBzdHJjaHIoaW5mby50eXBlLCAnOicpOworCQkJCWlmIChuYW1lKQorCQkJCQkqbmFtZSA9ICdcMCc7CisJCQkJc3RybGNhdChpbmZvLnR5cGUsICItY2xpZW50IiwKKwkJCQkJc2l6ZW9mKGluZm8udHlwZSkpOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIDA7IC8qIG5vIHNlY29uZGFyeSBhZGRyLCB3aGljaCBpcyBPSyAqLworCQl9CisJCXN0LT5tdXhfY2xpZW50ID0gaTJjX25ld19kZXZpY2Uoc3QtPm11eF9hZGFwdGVyLCAmaW5mbyk7CisJCWlmICghc3QtPm11eF9jbGllbnQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGludl9tcHVfYWNwaV9kZWxldGVfbXV4X2NsaWVudChzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0KQoreworCWlmIChzdC0+bXV4X2NsaWVudCkKKwkJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKHN0LT5tdXhfY2xpZW50KTsKK30KKyNlbHNlCisKKyNpbmNsdWRlICJpbnZfbXB1X2lpby5oIgorCitpbnQgaW52X21wdV9hY3BpX2NyZWF0ZV9tdXhfY2xpZW50KHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaW52X21wdV9hY3BpX2RlbGV0ZV9tdXhfY2xpZW50KHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QpCit7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2NvcmUuYyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2NvcmUuYwppbmRleCBlZjc2YWZlLi4xN2Q0YmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfY29yZS5jCkBAIC04MjksOCArODI5LDE0IEBACiAJCWdvdG8gb3V0X3VucmVnX2RldmljZTsKIAl9CiAKKwlyZXN1bHQgPSBpbnZfbXB1X2FjcGlfY3JlYXRlX211eF9jbGllbnQoc3QpOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0X2RlbF9tdXg7CisKIAlyZXR1cm4gMDsKIAorb3V0X2RlbF9tdXg6CisJaTJjX2RlbF9tdXhfYWRhcHRlcihzdC0+bXV4X2FkYXB0ZXIpOwogb3V0X3VucmVnX2RldmljZToKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIG91dF9yZW1vdmVfdHJpZ2dlcjoKQEAgLTg0NSw2ICs4NTEsNyBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAorCWludl9tcHVfYWNwaV9kZWxldGVfbXV4X2NsaWVudChzdCk7CiAJaTJjX2RlbF9tdXhfYWRhcHRlcihzdC0+bXV4X2FkYXB0ZXIpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWludl9tcHU2MDUwX3JlbW92ZV90cmlnZ2VyKHN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2lpby5oIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKaW5kZXggYWE4MzdkZS4uZGIwYTRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKQEAgLTEyMSw2ICsxMjEsNyBAQAogCXNwaW5sb2NrX3QgdGltZV9zdGFtcF9sb2NrOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IGkyY19hZGFwdGVyICptdXhfYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbXV4X2NsaWVudDsKIAl1bnNpZ25lZCBpbnQgcG93ZXJ1cF9jb3VudDsKIAlzdHJ1Y3QgaW52X21wdTYwNTBfcGxhdGZvcm1fZGF0YSBwbGF0X2RhdGE7CiAJREVDTEFSRV9LRklGTyh0aW1lc3RhbXBzLCBsb25nIGxvbmcsIFRJTUVTVEFNUF9GSUZPX1NJWkUpOwpAQCAtMjUxLDMgKzI1Miw1IEBACiBpbnQgaW52X21wdTYwNTBfc3dpdGNoX2VuZ2luZShzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0LCBib29sIGVuLCB1MzIgbWFzayk7CiBpbnQgaW52X21wdTYwNTBfd3JpdGVfcmVnKHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QsIGludCByZWcsIHU4IHZhbCk7CiBpbnQgaW52X21wdTYwNTBfc2V0X3Bvd2VyX2l0ZyhzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0LCBib29sIHBvd2VyX29uKTsKK2ludCBpbnZfbXB1X2FjcGlfY3JlYXRlX211eF9jbGllbnQoc3RydWN0IGludl9tcHU2MDUwX3N0YXRlICpzdCk7Cit2b2lkIGludl9tcHVfYWNwaV9kZWxldGVfbXV4X2NsaWVudChzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9rbXg2MS5jIGIvZHJpdmVycy9paW8vaW11L2tteDYxLmMKaW5kZXggYjNhMzYzNy4uNDYyYTAxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2tteDYxLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2tteDYxLmMKQEAgLTE2OSwxOSArMTY5LDE4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlpbnQgdmFsOwogCWludCB2YWwyOwotCXU4IG9kcl9iaXRzOwotfSBrbXg2MV9zYW1wX2ZyZXFfdGFibGVbXSA9IHsgezEyLCA1MDAwMDAsIDB4MDB9LAotCQkJezI1LCAwLCAweDAxfSwKLQkJCXs1MCwgMCwgMHgwMn0sCi0JCQl7MTAwLCAwLCAweDAzfSwKLQkJCXsyMDAsIDAsIDB4MDR9LAotCQkJezQwMCwgMCwgMHgwNX0sCi0JCQl7ODAwLCAwLCAweDA2fSwKLQkJCXsxNjAwLCAwLCAweDA3fSwKLQkJCXswLCA3ODEwMDAsIDB4MDh9LAotCQkJezEsIDU2MzAwMCwgMHgwOX0sCi0JCQl7MywgMTI1MDAwLCAweDBBfSwKLQkJCXs2LCAyNTAwMDAsIDB4MEJ9IH07Cit9IGtteDYxX3NhbXBfZnJlcV90YWJsZVtdID0geyB7MTIsIDUwMDAwMH0sCisJCQl7MjUsIDB9LAorCQkJezUwLCAwfSwKKwkJCXsxMDAsIDB9LAorCQkJezIwMCwgMH0sCisJCQl7NDAwLCAwfSwKKwkJCXs4MDAsIDB9LAorCQkJezE2MDAsIDB9LAorCQkJezAsIDc4MTAwMH0sCisJCQl7MSwgNTYzMDAwfSwKKwkJCXszLCAxMjUwMDB9LAorCQkJezYsIDI1MDAwMH0gfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJaW50IHZhbDsKQEAgLTMwMiwyNCArMzAxLDEwIEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa214NjFfc2FtcF9mcmVxX3RhYmxlKTsgaSsrKQogCQlpZiAodmFsID09IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS52YWwgJiYKIAkJICAgIHZhbDIgPT0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLnZhbDIpCi0JCQlyZXR1cm4ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLm9kcl9iaXRzOworCQkJcmV0dXJuIGk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQga214NjFfY29udmVydF9iaXRfdG9fZnJlcSh1OCBvZHJfYml0cywgaW50ICp2YWwsIGludCAqdmFsMikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtteDYxX3NhbXBfZnJlcV90YWJsZSk7IGkrKykKLQkJaWYgKG9kcl9iaXRzID09IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS5vZHJfYml0cykgewotCQkJKnZhbCA9IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS52YWw7Ci0JCQkqdmFsMiA9IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS52YWwyOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotCiBzdGF0aWMgaW50IGtteDYxX2NvbnZlcnRfd2FrZV91cF9vZHJfdG9fYml0KGludCB2YWwsIGludCB2YWwyKQogewogCWludCBpOwpAQCAtNDc4LDcgKzQ2Myw3IEBACiAKIHN0YXRpYyBpbnQga214NjFfZ2V0X29kcihzdHJ1Y3Qga214NjFfZGF0YSAqZGF0YSwgaW50ICp2YWwsIGludCAqdmFsMiwKIAkJCSB1OCBkZXZpY2UpCi17CWludCBpOworewogCXU4IGxvZHJfYml0czsKIAogCWlmIChkZXZpY2UgJiBLTVg2MV9BQ0MpCkBAIC00OTAsMTMgKzQ3NSwxMyBAQAogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrbXg2MV9zYW1wX2ZyZXFfdGFibGUpOyBpKyspCi0JCWlmIChsb2RyX2JpdHMgPT0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLm9kcl9iaXRzKSB7Ci0JCQkqdmFsID0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLnZhbDsKLQkJCSp2YWwyID0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLnZhbDI7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCXJldHVybiAtRUlOVkFMOworCWlmIChsb2RyX2JpdHMgPj0gQVJSQVlfU0laRShrbXg2MV9zYW1wX2ZyZXFfdGFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBrbXg2MV9zYW1wX2ZyZXFfdGFibGVbbG9kcl9iaXRzXS52YWw7CisJKnZhbDIgPSBrbXg2MV9zYW1wX2ZyZXFfdGFibGVbbG9kcl9iaXRzXS52YWwyOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga214NjFfc2V0X3JhbmdlKHN0cnVjdCBrbXg2MV9kYXRhICpkYXRhLCB1OCByYW5nZSkKQEAgLTU4MCw4ICs1NjUsMTEgQEAKIAl9CiAJZGF0YS0+b2RyX2JpdHMgPSByZXQ7CiAKLQkvKiBzZXQgb3V0cHV0IGRhdGEgcmF0ZSBmb3Igd2FrZSB1cCAobW90aW9uIGRldGVjdGlvbikgZnVuY3Rpb24gKi8KLQlyZXQgPSBrbXg2MV9jb252ZXJ0X2JpdF90b19mcmVxKGRhdGEtPm9kcl9iaXRzLCAmdmFsLCAmdmFsMik7CisJLyoKKwkgKiBzZXQgb3V0cHV0IGRhdGEgcmF0ZSBmb3Igd2FrZSB1cCAobW90aW9uIGRldGVjdGlvbikgZnVuY3Rpb24KKwkgKiB0byBtYXRjaCBkYXRhIHJhdGUgZm9yIGFjY2VsZXJvbWV0ZXIgc2FtcGxpbmcKKwkgKi8KKwlyZXQgPSBrbXg2MV9nZXRfb2RyKGRhdGEsICZ2YWwsICZ2YWwyLCBLTVg2MV9BQ0MpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMjY3LDE2ICsxMjU1LDEyIEBACiAJZGV2ID0gJmNsaWVudC0+ZGV2OwogCiAJLyogZGF0YSByZWFkeSBncGlvIGludGVycnVwdCBwaW4gKi8KLQlncGlvID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCBLTVg2MV9HUElPX05BTUUsIDApOworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEtNWDYxX0dQSU9fTkFNRSwgMCwgR1BJT0RfSU4pOwogCWlmIChJU19FUlIoZ3BpbykpIHsKIAkJZGV2X2VycihkZXYsICJhY3BpIGdwaW8gZ2V0IGluZGV4IGZhaWxlZFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGdwaW8pOwogCX0KIAotCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gZ3Bpb2RfdG9faXJxKGdwaW8pOwogCiAJZGV2X2RiZyhkZXYsICJHUElPIHJlc291cmNlLCBubzolZCBpcnE6JWRcbiIsIGRlc2NfdG9fZ3BpbyhncGlvKSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYwppbmRleCA3MTMzMzE0Li5kZjkxOWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCkBAIC0zNywxMSArMzcsNTcgQEAKIAlyZXR1cm4gIWxpc3RfZW1wdHkoJmJ1Zi0+YnVmZmVyX2xpc3QpOwogfQogCi1zdGF0aWMgYm9vbCBpaW9fYnVmZmVyX2RhdGFfYXZhaWxhYmxlKHN0cnVjdCBpaW9fYnVmZmVyICpidWYpCitzdGF0aWMgc2l6ZV90IGlpb19idWZmZXJfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKmJ1ZikKIHsKIAlyZXR1cm4gYnVmLT5hY2Nlc3MtPmRhdGFfYXZhaWxhYmxlKGJ1Zik7CiB9CiAKK3N0YXRpYyBpbnQgaWlvX2J1ZmZlcl9mbHVzaF9od2ZpZm8oc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICBzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmLCBzaXplX3QgcmVxdWlyZWQpCit7CisJaWYgKCFpbmRpb19kZXYtPmluZm8tPmh3Zmlmb19mbHVzaF90b19idWZmZXIpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIGluZGlvX2Rldi0+aW5mby0+aHdmaWZvX2ZsdXNoX3RvX2J1ZmZlcihpbmRpb19kZXYsIHJlcXVpcmVkKTsKK30KKworc3RhdGljIGJvb2wgaWlvX2J1ZmZlcl9yZWFkeShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmLAorCQkJICAgICBzaXplX3QgdG9fd2FpdCwgaW50IHRvX2ZsdXNoKQoreworCXNpemVfdCBhdmFpbDsKKwlpbnQgZmx1c2hlZCA9IDA7CisKKwkvKiB3YWtldXAgaWYgdGhlIGRldmljZSB3YXMgdW5yZWdpc3RlcmVkICovCisJaWYgKCFpbmRpb19kZXYtPmluZm8pCisJCXJldHVybiB0cnVlOworCisJLyogZHJhaW4gdGhlIGJ1ZmZlciBpZiBpdCB3YXMgZGlzYWJsZWQgKi8KKwlpZiAoIWlpb19idWZmZXJfaXNfYWN0aXZlKGJ1ZikpIHsKKwkJdG9fd2FpdCA9IG1pbl90KHNpemVfdCwgdG9fd2FpdCwgMSk7CisJCXRvX2ZsdXNoID0gMDsKKwl9CisKKwlhdmFpbCA9IGlpb19idWZmZXJfZGF0YV9hdmFpbGFibGUoYnVmKTsKKworCWlmIChhdmFpbCA+PSB0b193YWl0KSB7CisJCS8qIGZvcmNlIGEgZmx1c2ggZm9yIG5vbi1ibG9ja2luZyByZWFkcyAqLworCQlpZiAoIXRvX3dhaXQgJiYgIWF2YWlsICYmIHRvX2ZsdXNoKQorCQkJaWlvX2J1ZmZlcl9mbHVzaF9od2ZpZm8oaW5kaW9fZGV2LCBidWYsIHRvX2ZsdXNoKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJaWYgKHRvX2ZsdXNoKQorCQlmbHVzaGVkID0gaWlvX2J1ZmZlcl9mbHVzaF9od2ZpZm8oaW5kaW9fZGV2LCBidWYsCisJCQkJCQkgIHRvX3dhaXQgLSBhdmFpbCk7CisJaWYgKGZsdXNoZWQgPD0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGF2YWlsICsgZmx1c2hlZCA+PSB0b193YWl0KQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogLyoqCiAgKiBpaW9fYnVmZmVyX3JlYWRfZmlyc3Rfbl9vdXRlcigpIC0gY2hyZGV2IHJlYWQgZm9yIGJ1ZmZlciBhY2Nlc3MKICAqCkBAIC01Myw2ICs5OSw5IEBACiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlzaXplX3QgZGF0dW1fc2l6ZTsKKwlzaXplX3QgdG9fd2FpdCA9IDA7CisJc2l6ZV90IHRvX3JlYWQ7CiAJaW50IHJldDsKIAogCWlmICghaW5kaW9fZGV2LT5pbmZvKQpAQCAtNjEsMTkgKzExMCwyOCBAQAogCWlmICghcmIgfHwgIXJiLT5hY2Nlc3MtPnJlYWRfZmlyc3RfbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkbyB7Ci0JCWlmICghaWlvX2J1ZmZlcl9kYXRhX2F2YWlsYWJsZShyYikpIHsKLQkJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCQlyZXR1cm4gLUVBR0FJTjsKKwlkYXR1bV9zaXplID0gcmItPmJ5dGVzX3Blcl9kYXR1bTsKIAotCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJiLT5wb2xscSwKLQkJCQkJaWlvX2J1ZmZlcl9kYXRhX2F2YWlsYWJsZShyYikgfHwKLQkJCQkJaW5kaW9fZGV2LT5pbmZvID09IE5VTEwpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJaWYgKGluZGlvX2Rldi0+aW5mbyA9PSBOVUxMKQotCQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJLyoKKwkgKiBJZiBkYXR1bV9zaXplIGlzIDAgdGhlcmUgd2lsbCBuZXZlciBiZSBhbnl0aGluZyB0byByZWFkIGZyb20gdGhlCisJICogYnVmZmVyLCBzbyBzaWduYWwgZW5kIG9mIGZpbGUgbm93LgorCSAqLworCWlmICghZGF0dW1fc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwl0b19yZWFkID0gbWluX3Qoc2l6ZV90LCBuIC8gZGF0dW1fc2l6ZSwgcmItPndhdGVybWFyayk7CisKKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCisJCXRvX3dhaXQgPSB0b19yZWFkOworCisJZG8geworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmItPnBvbGxxLAorCQkJaWlvX2J1ZmZlcl9yZWFkeShpbmRpb19kZXYsIHJiLCB0b193YWl0LCB0b19yZWFkKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmICghaW5kaW9fZGV2LT5pbmZvKQorCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJcmV0ID0gcmItPmFjY2Vzcy0+cmVhZF9maXJzdF9uKHJiLCBuLCBidWYpOwogCQlpZiAocmV0ID09IDAgJiYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKQEAgLTk2LDkgKzE1NCw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJcG9sbF93YWl0KGZpbHAsICZyYi0+cG9sbHEsIHdhaXQpOwotCWlmIChpaW9fYnVmZmVyX2RhdGFfYXZhaWxhYmxlKHJiKSkKKwlpZiAoaWlvX2J1ZmZlcl9yZWFkeShpbmRpb19kZXYsIHJiLCByYi0+d2F0ZXJtYXJrLCAwKSkKIAkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0JLyogbmVlZCBhIHdheSBvZiBrbm93aW5nIGlmIHRoZXJlIG1heSBiZSBlbm91Z2ggZGF0YS4uLiAqLwogCXJldHVybiAwOwogfQogCkBAIC0xMjMsNiArMTgwLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmYnVmZmVyLT5idWZmZXJfbGlzdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmYnVmZmVyLT5wb2xscSk7CiAJa3JlZl9pbml0KCZidWZmZXItPnJlZik7CisJYnVmZmVyLT53YXRlcm1hcmsgPSAxOwogfQogRVhQT1JUX1NZTUJPTChpaW9fYnVmZmVyX2luaXQpOwogCkBAIC00MTYsNiArNDc0LDExIEBACiAJCWJ1ZmZlci0+YWNjZXNzLT5zZXRfbGVuZ3RoKGJ1ZmZlciwgdmFsKTsKIAkJcmV0ID0gMDsKIAl9CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJaWYgKGJ1ZmZlci0+bGVuZ3RoICYmIGJ1ZmZlci0+bGVuZ3RoIDwgYnVmZmVyLT53YXRlcm1hcmspCisJCWJ1ZmZlci0+d2F0ZXJtYXJrID0gYnVmZmVyLT5sZW5ndGg7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAogCXJldHVybiByZXQgPyByZXQgOiBsZW47CkBAIC00NzIsNiArNTM1LDcgQEAKIHN0YXRpYyB2b2lkIGlpb19idWZmZXJfZGVhY3RpdmF0ZShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKQogewogCWxpc3RfZGVsX2luaXQoJmJ1ZmZlci0+YnVmZmVyX2xpc3QpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYnVmZmVyLT5wb2xscSk7CiAJaWlvX2J1ZmZlcl9wdXQoYnVmZmVyKTsKIH0KIApAQCAtNjI5LDE5ICs2OTMsMTYgQEAKIAkJfQogCX0KIAkvKiBEZWZpbml0ZWx5IHBvc3NpYmxlIGZvciBkZXZpY2VzIHRvIHN1cHBvcnQgYm90aCBvZiB0aGVzZS4gKi8KLQlpZiAoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9UUklHR0VSRUQpIHsKLQkJaWYgKCFpbmRpb19kZXYtPnRyaWcpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIkJ1ZmZlciBub3Qgc3RhcnRlZDogbm8gdHJpZ2dlclxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJLyogQ2FuIG9ubHkgb2NjdXIgb24gZmlyc3QgYnVmZmVyICovCi0JCQlnb3RvIGVycm9yX3J1bl9wb3N0ZGlzYWJsZTsKLQkJfQorCWlmICgoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9UUklHR0VSRUQpICYmIGluZGlvX2Rldi0+dHJpZykgewogCQlpbmRpb19kZXYtPmN1cnJlbnRtb2RlID0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRDsKIAl9IGVsc2UgaWYgKGluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19CVUZGRVJfSEFSRFdBUkUpIHsKIAkJaW5kaW9fZGV2LT5jdXJyZW50bW9kZSA9IElORElPX0JVRkZFUl9IQVJEV0FSRTsKIAl9IGVsc2UgaWYgKGluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19CVUZGRVJfU09GVFdBUkUpIHsKIAkJaW5kaW9fZGV2LT5jdXJyZW50bW9kZSA9IElORElPX0JVRkZFUl9TT0ZUV0FSRTsKIAl9IGVsc2UgeyAvKiBTaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqLworCQkvKiBDYW4gb25seSBvY2N1ciBvbiBmaXJzdCBidWZmZXIgKi8KKwkJaWYgKGluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19CVUZGRVJfVFJJR0dFUkVEKQorCQkJcHJfaW5mbygiQnVmZmVyIG5vdCBzdGFydGVkOiBubyB0cmlnZ2VyXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcl9ydW5fcG9zdGRpc2FibGU7CiAJfQpAQCAtNzU0LDEyICs4MTUsNjggQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fc2Nhbl9lbGVtZW50c19ncm91cF9uYW1lID0gInNjYW5fZWxlbWVudHMiOwogCitzdGF0aWMgc3NpemVfdCBpaW9fYnVmZmVyX3Nob3dfd2F0ZXJtYXJrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBidWZmZXItPndhdGVybWFyayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlpb19idWZmZXJfc3RvcmVfd2F0ZXJtYXJrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjb25zdCBjaGFyICpidWYsCisJCQkJCSAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyID0gaW5kaW9fZGV2LT5idWZmZXI7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvdWludChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICghdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJaWYgKHZhbCA+IGJ1ZmZlci0+bGVuZ3RoKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpaW9fYnVmZmVyX2lzX2FjdGl2ZShpbmRpb19kZXYtPmJ1ZmZlcikpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlidWZmZXItPndhdGVybWFyayA9IHZhbDsKKworCWlmIChpbmRpb19kZXYtPmluZm8tPmh3Zmlmb19zZXRfd2F0ZXJtYXJrKQorCQlpbmRpb19kZXYtPmluZm8tPmh3Zmlmb19zZXRfd2F0ZXJtYXJrKGluZGlvX2RldiwgdmFsKTsKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKGxlbmd0aCwgU19JUlVHTyB8IFNfSVdVU1IsIGlpb19idWZmZXJfcmVhZF9sZW5ndGgsCiAJCSAgIGlpb19idWZmZXJfd3JpdGVfbGVuZ3RoKTsKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9sZW5ndGhfcm8gPSBfX0FUVFIobGVuZ3RoLAogCVNfSVJVR08sIGlpb19idWZmZXJfcmVhZF9sZW5ndGgsIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGVuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgIGlpb19idWZmZXJfc2hvd19lbmFibGUsIGlpb19idWZmZXJfc3RvcmVfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih3YXRlcm1hcmssIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBpaW9fYnVmZmVyX3Nob3dfd2F0ZXJtYXJrLCBpaW9fYnVmZmVyX3N0b3JlX3dhdGVybWFyayk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppaW9fYnVmZmVyX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2xlbmd0aC5hdHRyLAorCSZkZXZfYXR0cl9lbmFibGUuYXR0ciwKKwkmZGV2X2F0dHJfd2F0ZXJtYXJrLmF0dHIsCit9OwogCiBpbnQgaWlvX2J1ZmZlcl9hbGxvY19zeXNmc19hbmRfbWFzayhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewpAQCAtNzc4LDIxICs4OTUsMjMgQEAKIAkJCWF0dHJjb3VudCsrOwogCX0KIAotCWJ1ZmZlci0+YnVmZmVyX2dyb3VwLm5hbWUgPSAiYnVmZmVyIjsKLQlidWZmZXItPmJ1ZmZlcl9ncm91cC5hdHRycyA9IGtjYWxsb2MoYXR0cmNvdW50ICsgMywKLQkJCXNpemVvZigqYnVmZmVyLT5idWZmZXJfZ3JvdXAuYXR0cnMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlci0+YnVmZmVyX2dyb3VwLmF0dHJzKQorCWF0dHIgPSBrY2FsbG9jKGF0dHJjb3VudCArIEFSUkFZX1NJWkUoaWlvX2J1ZmZlcl9hdHRycykgKyAxLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhdHRyaWJ1dGUgKiksIEdGUF9LRVJORUwpOworCWlmICghYXR0cikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoYnVmZmVyLT5hY2Nlc3MtPnNldF9sZW5ndGgpCi0JCWJ1ZmZlci0+YnVmZmVyX2dyb3VwLmF0dHJzWzBdID0gJmRldl9hdHRyX2xlbmd0aC5hdHRyOwotCWVsc2UKLQkJYnVmZmVyLT5idWZmZXJfZ3JvdXAuYXR0cnNbMF0gPSAmZGV2X2F0dHJfbGVuZ3RoX3JvLmF0dHI7Ci0JYnVmZmVyLT5idWZmZXJfZ3JvdXAuYXR0cnNbMV0gPSAmZGV2X2F0dHJfZW5hYmxlLmF0dHI7CisJbWVtY3B5KGF0dHIsIGlpb19idWZmZXJfYXR0cnMsIHNpemVvZihpaW9fYnVmZmVyX2F0dHJzKSk7CisJaWYgKCFidWZmZXItPmFjY2Vzcy0+c2V0X2xlbmd0aCkKKwkJYXR0clswXSA9ICZkZXZfYXR0cl9sZW5ndGhfcm8uYXR0cjsKKwogCWlmIChidWZmZXItPmF0dHJzKQotCQltZW1jcHkoJmJ1ZmZlci0+YnVmZmVyX2dyb3VwLmF0dHJzWzJdLCBidWZmZXItPmF0dHJzLAotCQkJc2l6ZW9mKComYnVmZmVyLT5idWZmZXJfZ3JvdXAuYXR0cnMpICogYXR0cmNvdW50KTsKLQlidWZmZXItPmJ1ZmZlcl9ncm91cC5hdHRyc1thdHRyY291bnQrMl0gPSBOVUxMOworCQltZW1jcHkoJmF0dHJbQVJSQVlfU0laRShpaW9fYnVmZmVyX2F0dHJzKV0sIGJ1ZmZlci0+YXR0cnMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZSAqKSAqIGF0dHJjb3VudCk7CisKKwlhdHRyW2F0dHJjb3VudCArIEFSUkFZX1NJWkUoaWlvX2J1ZmZlcl9hdHRycyldID0gTlVMTDsKKworCWJ1ZmZlci0+YnVmZmVyX2dyb3VwLm5hbWUgPSAiYnVmZmVyIjsKKwlidWZmZXItPmJ1ZmZlcl9ncm91cC5hdHRycyA9IGF0dHI7CiAKIAlpbmRpb19kZXYtPmdyb3Vwc1tpbmRpb19kZXYtPmdyb3VwY291bnRlcisrXSA9ICZidWZmZXItPmJ1ZmZlcl9ncm91cDsKIApAQCAtOTM3LDggKzEwNTYsMTggQEAKIHN0YXRpYyBpbnQgaWlvX3B1c2hfdG9fYnVmZmVyKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIsIGNvbnN0IHZvaWQgKmRhdGEpCiB7CiAJY29uc3Qgdm9pZCAqZGF0YW91dCA9IGlpb19kZW11eChidWZmZXIsIGRhdGEpOworCWludCByZXQ7CiAKLQlyZXR1cm4gYnVmZmVyLT5hY2Nlc3MtPnN0b3JlX3RvKGJ1ZmZlciwgZGF0YW91dCk7CisJcmV0ID0gYnVmZmVyLT5hY2Nlc3MtPnN0b3JlX3RvKGJ1ZmZlciwgZGF0YW91dCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogV2UgY2FuJ3QganVzdCB0ZXN0IGZvciB3YXRlcm1hcmsgdG8gZGVjaWRlIGlmIHdlIHdha2UgdGhlIHBvbGwgcXVldWUKKwkgKiBiZWNhdXNlIHJlYWQgbWF5IHJlcXVlc3QgbGVzcyBzYW1wbGVzIHRoYW4gdGhlIHdhdGVybWFyay4KKwkgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbCgmYnVmZmVyLT5wb2xscSwgUE9MTElOIHwgUE9MTFJETk9STSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGlpb19idWZmZXJfZGVtdXhfZnJlZShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8va2ZpZm9fYnVmLmMgYi9kcml2ZXJzL2lpby9rZmlmb19idWYuYwppbmRleCBiMmJlZWEwLi44NDdjYTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9rZmlmb19idWYuYworKysgYi9kcml2ZXJzL2lpby9rZmlmb19idWYuYwpAQCAtODMsOSArODMsNiBAQAogCXJldCA9IGtmaWZvX2luKCZrZi0+a2YsIGRhdGEsIDEpOwogCWlmIChyZXQgIT0gMSkKIAkJcmV0dXJuIC1FQlVTWTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCZyLT5wb2xscSwgUE9MTElOIHwgUE9MTFJETk9STSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5LDE2ICsxMDYsMTYgQEAKIAlyZXR1cm4gY29waWVkOwogfQogCi1zdGF0aWMgYm9vbCBpaW9fa2ZpZm9fYnVmX2RhdGFfYXZhaWxhYmxlKHN0cnVjdCBpaW9fYnVmZmVyICpyKQorc3RhdGljIHNpemVfdCBpaW9fa2ZpZm9fYnVmX2RhdGFfYXZhaWxhYmxlKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCXN0cnVjdCBpaW9fa2ZpZm8gKmtmID0gaWlvX3RvX2tmaWZvKHIpOwotCWJvb2wgZW1wdHk7CisJc2l6ZV90IHNhbXBsZXM7CiAKIAltdXRleF9sb2NrKCZrZi0+dXNlcl9sb2NrKTsKLQllbXB0eSA9IGtmaWZvX2lzX2VtcHR5KCZrZi0+a2YpOworCXNhbXBsZXMgPSBrZmlmb19sZW4oJmtmLT5rZik7CiAJbXV0ZXhfdW5sb2NrKCZrZi0+dXNlcl9sb2NrKTsKIAotCXJldHVybiAhZW1wdHk7CisJcmV0dXJuIHNhbXBsZXM7CiB9CiAKIHN0YXRpYyB2b2lkIGlpb19rZmlmb19idWZmZXJfcmVsZWFzZShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKaW5kZXggYTIyNGFmZC4uMDFhMWExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCkBAIC01OSw2ICs1OSwxNiBAQAogCSBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOgogCSB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNtMzIzMi4KIAorY29uZmlnIENNMzMyMworCWRlcGVuZHMgb24gSTJDCisJdHJpc3RhdGUgIkNhcGVsbGEgQ00zMzIzIGNvbG9yIGxpZ2h0IHNlbnNvciIKKwloZWxwCisJIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBkcml2ZXIgZm9yIENhcGVsYSBDTTMzMjMKKwkgY29sb3Igc2Vuc29yLgorCisJIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSBiZSBjYWxsZWQgY20zMzIzLgorCiBjb25maWcgQ00zNjY1MQogCWRlcGVuZHMgb24gSTJDCiAJdHJpc3RhdGUgIkNNMzY2NTEgZHJpdmVyIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQppbmRleCBiMTJhNTE2Li5hZDdjMzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQpAQCAtOCw2ICs4LDcgQEAKIG9iai0kKENPTkZJR19BUERTOTMwMCkJCSs9IGFwZHM5MzAwLm8KIG9iai0kKENPTkZJR19DTTMyMTgxKQkJKz0gY20zMjE4MS5vCiBvYmotJChDT05GSUdfQ00zMjMyKQkJKz0gY20zMjMyLm8KK29iai0kKENPTkZJR19DTTMzMjMpCQkrPSBjbTMzMjMubwogb2JqLSQoQ09ORklHX0NNMzY2NTEpCQkrPSBjbTM2NjUxLm8KIG9iai0kKENPTkZJR19HUDJBUDAyMEEwMEYpCSs9IGdwMmFwMDIwYTAwZi5vCiBvYmotJChDT05GSUdfSElEX1NFTlNPUl9BTFMpCSs9IGhpZC1zZW5zb3ItYWxzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2NtMzIzMi5jIGIvZHJpdmVycy9paW8vbGlnaHQvY20zMjMyLmMKaW5kZXggOTBlMzUxOS4uMzljOGQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvY20zMjMyLmMKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvY20zMjMyLmMKQEAgLTM3OCw2ICszNzgsMzkgQEAKIAl7fQogfTsKIAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBjbTMyMzJfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YSh0b19pMmNfY2xpZW50KGRldikpOworCXN0cnVjdCBjbTMyMzJfY2hpcCAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJY2hpcC0+cmVnc19jbWQgfD0gQ00zMjMyX0NNRF9BTFNfRElTQUJMRTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQ00zMjMyX1JFR19BRERSX0NNRCwKKwkJCQkJY2hpcC0+cmVnc19jbWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjbTMyMzJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJc3RydWN0IGNtMzIzMl9jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQ7CisKKwljaGlwLT5yZWdzX2NtZCAmPSB+Q00zMjMyX0NNRF9BTFNfRElTQUJMRTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQ00zMjMyX1JFR19BRERSX0NNRCwKKwkJCQkJY2hpcC0+cmVnc19jbWQgfCBDTTMyMzJfQ01EX0FMU19SRVNFVCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgY20zMjMyX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhjbTMyMzJfc3VzcGVuZCwgY20zMjMyX3Jlc3VtZSl9OworI2VuZGlmCisKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBjbTMyMzJfaWQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjbTMyMzJfb2ZfbWF0Y2hbXSA9IHsKQEAgLTM5MCw2ICs0MjMsOSBAQAogCQkubmFtZQk9ICJjbTMyMzIiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGNtMzIzMl9vZl9tYXRjaCksCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisJCS5wbQk9ICZjbTMyMzJfcG1fb3BzLAorI2VuZGlmCiAJfSwKIAkuaWRfdGFibGUJPSBjbTMyMzJfaWQsCiAJLnByb2JlCQk9IGNtMzIzMl9wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2NtMzMyMy5jIGIvZHJpdmVycy9paW8vbGlnaHQvY20zMzIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5MDMzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2NtMzMyMy5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ00zMzIzIC0gQ2FwZWxsYSBDb2xvciBMaWdodCBTZW5zb3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogSUlPIGRyaXZlciBmb3IgQ00zMzIzICg3LWJpdCBJMkMgc2xhdmUgYWRkcmVzcyAweDEwKQorICoKKyAqIFRPRE86IGNhbGlic2NhbGUgdG8gY29ycmVjdCB0aGUgbGVucyBmYWN0b3IKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorCisjZGVmaW5lIENNMzMyM19EUlZfTkFNRSAiY20zMzIzIgorCisjZGVmaW5lIENNMzMyM19DTURfQ09ORgkJMHgwMAorI2RlZmluZSBDTTMzMjNfQ01EX1JFRF9EQVRBCTB4MDgKKyNkZWZpbmUgQ00zMzIzX0NNRF9HUkVFTl9EQVRBCTB4MDkKKyNkZWZpbmUgQ00zMzIzX0NNRF9CTFVFX0RBVEEJMHgwQQorI2RlZmluZSBDTTMzMjNfQ01EX0NMRUFSX0RBVEEJMHgwQgorCisjZGVmaW5lIENNMzMyM19DT05GX1NEX0JJVAlCSVQoMCkgLyogc2Vuc29yIGRpc2FibGUgKi8KKyNkZWZpbmUgQ00zMzIzX0NPTkZfQUZfQklUCUJJVCgxKSAvKiBhdXRvL21hbnVhbCBmb3JjZSBtb2RlICovCisjZGVmaW5lIENNMzMyM19DT05GX0lUX01BU0sJKEJJVCg0KSB8IEJJVCg1KSB8IEJJVCg2KSkKKyNkZWZpbmUgQ00zMzIzX0NPTkZfSVRfU0hJRlQJNAorCisjZGVmaW5lIENNMzMyM19JTlRfVElNRV9BVkFJTEFCTEUgIjAuMDQgMC4wOCAwLjE2IDAuMzIgMC42NCAxLjI4IgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlpbnQgdmFsOworCWludCB2YWwyOworfSBjbTMzMjNfaW50X3RpbWVbXSA9IHsKKwl7MCwgNDAwMDB9LCAgLyogNDAgbXMgKi8KKwl7MCwgODAwMDB9LCAgLyogODAgbXMgKi8KKwl7MCwgMTYwMDAwfSwgLyogMTYwIG1zICovCisJezAsIDMyMDAwMH0sIC8qIDMyMCBtcyAqLworCXswLCA2NDAwMDB9LCAvKiA2NDAgbXMgKi8KKwl7MSwgMjgwMDAwfSwgLyogMTI4MCBtcyAqLworfTsKKworc3RydWN0IGNtMzMyM19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXUxNiByZWdfY29uZjsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Cit9OworCisjZGVmaW5lIENNMzMyM19DT0xPUl9DSEFOTkVMKF9jb2xvciwgX2FkZHIpIHsgXAorCS50eXBlID0gSUlPX0lOVEVOU0lUWSwgXAorCS5tb2RpZmllZCA9IDEsIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX0lOVF9USU1FKSwgXAorCS5jaGFubmVsMiA9IElJT19NT0RfTElHSFRfIyNfY29sb3IsIFwKKwkuYWRkcmVzcyA9IF9hZGRyLCBcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjbTMzMjNfY2hhbm5lbHNbXSA9IHsKKwlDTTMzMjNfQ09MT1JfQ0hBTk5FTChSRUQsIENNMzMyM19DTURfUkVEX0RBVEEpLAorCUNNMzMyM19DT0xPUl9DSEFOTkVMKEdSRUVOLCBDTTMzMjNfQ01EX0dSRUVOX0RBVEEpLAorCUNNMzMyM19DT0xPUl9DSEFOTkVMKEJMVUUsIENNMzMyM19DTURfQkxVRV9EQVRBKSwKKwlDTTMzMjNfQ09MT1JfQ0hBTk5FTChDTEVBUiwgQ00zMzIzX0NNRF9DTEVBUl9EQVRBKSwKK307CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9JTlRfVElNRV9BVkFJTChDTTMzMjNfSU5UX1RJTUVfQVZBSUxBQkxFKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNtMzMyM19hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2ludGVncmF0aW9uX3RpbWVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY20zMzIzX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBjbTMzMjNfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgY20zMzIzX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjbTMzMjNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBDTTMzMjNfQ01EX0NPTkYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWdfY29uZlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZW5hYmxlIHNlbnNvciBhbmQgc2V0IGF1dG8gZm9yY2UgbW9kZSAqLworCXJldCAmPSB+KENNMzMyM19DT05GX1NEX0JJVCB8IENNMzMyM19DT05GX0FGX0JJVCk7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwgQ00zMzIzX0NNRF9DT05GLCByZXQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfY29uZlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGF0YS0+cmVnX2NvbmYgPSByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY20zMzIzX2Rpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBjbTMzMjNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwgQ00zMzIzX0NNRF9DT05GLAorCQkJCQlDTTMzMjNfQ09ORl9TRF9CSVQpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRpbmcgcmVnX2NvbmZcbiIpOworfQorCitzdGF0aWMgaW50IGNtMzMyM19zZXRfaXRfYml0cyhzdHJ1Y3QgY20zMzIzX2RhdGEgKmRhdGEsIGludCB2YWwsIGludCB2YWwyKQoreworCWludCBpLCByZXQ7CisJdTE2IHJlZ19jb25mOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY20zMzIzX2ludF90aW1lKTsgaSsrKSB7CisJCWlmICh2YWwgPT0gY20zMzIzX2ludF90aW1lW2ldLnZhbCAmJgorCQkgICAgdmFsMiA9PSBjbTMzMjNfaW50X3RpbWVbaV0udmFsMikgeworCQkJcmVnX2NvbmYgPSBkYXRhLT5yZWdfY29uZjsKKwkJCXJlZ19jb25mIHw9IGkgPDwgQ00zMzIzX0NPTkZfSVRfU0hJRlQ7CisKKwkJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJCUNNMzMyM19DTURfQ09ORiwKKwkJCQkJCQlyZWdfY29uZik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlkYXRhLT5yZWdfY29uZiA9IHJlZ19jb25mOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY20zMzIzX2dldF9pdF9iaXRzKHN0cnVjdCBjbTMzMjNfZGF0YSAqZGF0YSkKK3sKKwlpbnQgYml0czsKKworCWJpdHMgPSAoZGF0YS0+cmVnX2NvbmYgJiBDTTMzMjNfQ09ORl9JVF9NQVNLKSA+PgorCQlDTTMzMjNfQ09ORl9JVF9TSElGVDsKKworCWlmIChiaXRzID49IEFSUkFZX1NJWkUoY20zMzIzX2ludF90aW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyBpbnQgY20zMzIzX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwsCisJCQkgICBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBjbTMzMjNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsIGNoYW4tPmFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCSp2YWwgPSByZXQ7CisJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fSU5UX1RJTUU6CisJCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKKwkJaSA9IGNtMzMyM19nZXRfaXRfYml0cyhkYXRhKTsKKwkJaWYgKGkgPCAwKSB7CisJCQltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJKnZhbCA9IGNtMzMyM19pbnRfdGltZVtpXS52YWw7CisJCSp2YWwyID0gY20zMzIzX2ludF90aW1lW2ldLnZhbDI7CisJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBjbTMzMjNfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCB2YWwsCisJCQkgICAgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgY20zMzIzX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fSU5UX1RJTUU6CisJCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKKwkJcmV0ID0gY20zMzIzX3NldF9pdF9iaXRzKGRhdGEsIHZhbCwgdmFsMik7CisJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGNtMzMyM19pbmZvID0geworCS5kcml2ZXJfbW9kdWxlCT0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3CT0gY20zMzIzX3JlYWRfcmF3LAorCS53cml0ZV9yYXcJPSBjbTMzMjNfd3JpdGVfcmF3LAorCS5hdHRycwkJPSAmY20zMzIzX2F0dHJpYnV0ZV9ncm91cCwKK307CisKK3N0YXRpYyBpbnQgY20zMzIzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGNtMzMyM19kYXRhICpkYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bXV0ZXgpOworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZjbTMzMjNfaW5mbzsKKwlpbmRpb19kZXYtPm5hbWUgPSBDTTMzMjNfRFJWX05BTUU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGNtMzMyM19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoY20zMzIzX2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBjbTMzMjNfaW5pdChpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY20zMzIzIGNoaXAgaW5pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaWlvIGRldlxuIik7CisJCWdvdG8gZXJyX2luaXQ7CisJfQorCXJldHVybiAwOworZXJyX2luaXQ6CisJY20zMzIzX2Rpc2FibGUoaW5kaW9fZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNtMzMyM19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwljbTMzMjNfZGlzYWJsZShpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBjbTMzMjNfaWRbXSA9IHsKKwl7ImNtMzMyMyIsIDB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNtMzMyM19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBjbTMzMjNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gQ00zMzIzX0RSVl9OQU1FLAorCX0sCisJLnByb2JlCQk9IGNtMzMyM19wcm9iZSwKKwkucmVtb3ZlCQk9IGNtMzMyM19yZW1vdmUsCisJLmlkX3RhYmxlCT0gY20zMzIzX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoY20zMzIzX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkRhbmllbCBCYWx1dGEgPGRhbmllbC5iYWx1dGFAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDYXBlbGxhIENNMzMyMyBDb2xvciBMaWdodCBTZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9ncDJhcDAyMGEwMGYuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2dwMmFwMDIwYTAwZi5jCmluZGV4IDIyMWVkMTYuLjMyYjY0NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L2dwMmFwMDIwYTAwZi5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2dwMmFwMDIwYTAwZi5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KQEAgLTk2Niw3ICs5NjcsNiBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OwogCXN0cnVjdCBncDJhcDAyMGEwMGZfZGF0YSAqcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc2l6ZV90IGRfc2l6ZSA9IDA7Ci0JX19sZTMyIGxpZ2h0X2x1eDsKIAlpbnQgaSwgb3V0X3ZhbCwgcmV0OwogCiAJZm9yX2VhY2hfc2V0X2JpdChpLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCkBAIC05ODEsOCArOTgxLDggQEAKIAkJICAgIGkgPT0gR1AyQVAwMjBBMDBGX1NDQU5fTU9ERV9MSUdIVF9JUikgewogCQkJb3V0X3ZhbCA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJnByaXYtPmJ1ZmZlcltkX3NpemVdKTsKIAkJCWdwMmFwMDIwYTAwZl9vdXRwdXRfdG9fbHV4KHByaXYsICZvdXRfdmFsKTsKLQkJCWxpZ2h0X2x1eCA9IGNwdV90b19sZTMyKG91dF92YWwpOwotCQkJbWVtY3B5KCZwcml2LT5idWZmZXJbZF9zaXplXSwgKHU4ICopJmxpZ2h0X2x1eCwgNCk7CisKKwkJCXB1dF91bmFsaWduZWRfbGUzMihvdXRfdmFsLCAmcHJpdi0+YnVmZmVyW2Rfc2l6ZV0pOwogCQkJZF9zaXplICs9IDQ7CiAJCX0gZWxzZSB7CiAJCQlkX3NpemUgKz0gMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2pzYTEyMTIuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2pzYTEyMTIuYwppbmRleCAyOWRlN2U3Li4zYTNhZjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9qc2ExMjEyLmMKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvanNhMTIxMi5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBqc2ExMjEyX3JlZ21hcF9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcganNhMTIxMl9yZWdtYXBfY29uZmlnID0gewogCS5uYW1lID0gIEpTQTEyMTJfUkVHTUFQX05BTUUsCiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvbHRyNTAxLmMgYi9kcml2ZXJzL2lpby9saWdodC9sdHI1MDEuYwppbmRleCA2MmI3MDcyLi43OGI4NzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9sdHI1MDEuYworKysgYi9kcml2ZXJzL2lpby9saWdodC9sdHI1MDEuYwpAQCAtMzMzLDYgKzMzMywxMyBAQAogCQlkYXRhLT5wc19jb250cik7CiB9CiAKK3N0YXRpYyBpbnQgbHRyNTAxX3Bvd2VyZG93bihzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsCisJCQkJICBkYXRhLT5hbHNfY29udHIgJiB+TFRSNTAxX0NPTlRSX0FDVElWRSwKKwkJCQkgIGRhdGEtPnBzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUpOworfQorCiBzdGF0aWMgaW50IGx0cjUwMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0zNzAsNyArMzc3LDcgQEAKIAlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCiAJCWx0cjUwMV90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gcG93ZXJkb3duX29uX2Vycm9yOwogCiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQpCkBAIC0zODAsMTYgKzM4NywxMSBAQAogCiBlcnJvcl91bnJlZ19idWZmZXI6CiAJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworcG93ZXJkb3duX29uX2Vycm9yOgorCWx0cjUwMV9wb3dlcmRvd24oZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsdHI1MDFfcG93ZXJkb3duKHN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSkKLXsKLQlyZXR1cm4gbHRyNTAxX3dyaXRlX2NvbnRyKGRhdGEtPmNsaWVudCwKLQkJZGF0YS0+YWxzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUsCi0JCWRhdGEtPnBzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUpOwotfQotCiBzdGF0aWMgaW50IGx0cjUwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYwppbmRleCBlMzEwNmI0Li4yNjFkNTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKQEAgLTMyMSw2ICszMjEsMTIgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWFnMzExMF9zY2FuX21hc2tzW10gPSB7MHg3LCAweGYsIDB9OwogCitzdGF0aWMgaW50IG1hZzMxMTBfc3RhbmRieShzdHJ1Y3QgbWFnMzExMF9kYXRhICpkYXRhKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTUFHMzExMF9DVFJMX1JFRzEsCisJCWRhdGEtPmN0cmxfcmVnMSAmIH5NQUczMTEwX0NUUkxfQUMpOworfQorCiBzdGF0aWMgaW50IG1hZzMxMTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0zNjAsMTIgKzM2NiwxMiBAQAogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQUczMTEwX0NUUkxfUkVHMiwKIAkJTUFHMzExMF9DVFJMX0FVVE9fTVJTVF9FTik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gc3RhbmRieV9vbl9lcnJvcjsKIAogCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKIAkJbWFnMzExMF90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIHN0YW5kYnlfb25fZXJyb3I7CiAKIAlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKHJldCA8IDApCkBAIC0zNzQsMTUgKzM4MCwxMSBAQAogCiBidWZmZXJfY2xlYW51cDoKIAlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CitzdGFuZGJ5X29uX2Vycm9yOgorCW1hZzMxMTBfc3RhbmRieShpaW9fcHJpdihpbmRpb19kZXYpKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG1hZzMxMTBfc3RhbmRieShzdHJ1Y3QgbWFnMzExMF9kYXRhICpkYXRhKQotewotCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTUFHMzExMF9DVFJMX1JFRzEsCi0JCWRhdGEtPmN0cmxfcmVnMSAmIH5NQUczMTEwX0NUUkxfQUMpOwotfQotCiBzdGF0aWMgaW50IG1hZzMxMTBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKaW5kZXggYTNiZTUzNy4uZmE2Mjk1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCkBAIC01Miw2ICs1MiwzMyBAQAogICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBtcGwzMTE1LgogCitjb25maWcgTVM1NjExCisJdHJpc3RhdGUgIk1lYXN1cmVtZW50IFNwZWNpYWxpdGllcyBNUzU2MTEgcHJlc3N1cmUgc2Vuc29yIGRyaXZlciIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBNZWFzdXJlbWVudCBTcGVjaWFsaXRpZXMKKwkgIE1TNTYxMSBwcmVzc3VyZSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtczU2MTFfY29yZS4KKworY29uZmlnIE1TNTYxMV9JMkMKKwl0cmlzdGF0ZSAic3VwcG9ydCBJMkMgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBJMkMgJiYgTVM1NjExCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBidWlsZCBJMkMgYnVzIHN1cHBvcnQgZm9yIE1TNTYxMS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbXM1NjExX2kyYy4KKworY29uZmlnIE1TNTYxMV9TUEkKKwl0cmlzdGF0ZSAic3VwcG9ydCBTUEkgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIE1TNTYxMQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gYnVpbGQgU1BJIGJ1cyBzdXBwb3J0IGZvciBNUzU2MTEuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIG1zNTYxMV9zcGkuCisKIGNvbmZpZyBJSU9fU1RfUFJFU1MKIAl0cmlzdGF0ZSAiU1RNaWNyb2VsZWN0cm9uaWNzIHByZXNzdXJlIHNlbnNvciBEcml2ZXIiCiAJZGVwZW5kcyBvbiAoSTJDIHx8IFNQSV9NQVNURVIpICYmIFNZU0ZTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlCmluZGV4IDg4MDExZjIuLmE0Zjk4ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlCkBAIC03LDYgKzcsOSBAQAogb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfUFJFU1MpICAgKz0gaGlkLXNlbnNvci1wcmVzcy5vCiBvYmotJChDT05GSUdfTVBMMTE1KSArPSBtcGwxMTUubwogb2JqLSQoQ09ORklHX01QTDMxMTUpICs9IG1wbDMxMTUubworb2JqLSQoQ09ORklHX01TNTYxMSkgKz0gbXM1NjExX2NvcmUubworb2JqLSQoQ09ORklHX01TNTYxMV9JMkMpICs9IG1zNTYxMV9pMmMubworb2JqLSQoQ09ORklHX01TNTYxMV9TUEkpICs9IG1zNTYxMV9zcGkubwogb2JqLSQoQ09ORklHX0lJT19TVF9QUkVTUykgKz0gc3RfcHJlc3N1cmUubwogc3RfcHJlc3N1cmUteSA6PSBzdF9wcmVzc3VyZV9jb3JlLm8KIHN0X3ByZXNzdXJlLSQoQ09ORklHX0lJT19CVUZGRVIpICs9IHN0X3ByZXNzdXJlX2J1ZmZlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTEuaCBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWM2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTEuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogTVM1NjExIHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSBUb21hc3ogRHVzenluc2tpIDx0ZHVzenluc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfTVM1NjExX0gKKyNkZWZpbmUgX01TNTYxMV9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2RlZmluZSBNUzU2MTFfUkVTRVQJCQkweDFlCisjZGVmaW5lIE1TNTYxMV9SRUFEX0FEQwkJCTB4MDAKKyNkZWZpbmUgTVM1NjExX1JFQURfUFJPTV9XT1JECQkweEEwCisjZGVmaW5lIE1TNTYxMV9TVEFSVF9URU1QX0NPTlYJCTB4NTgKKyNkZWZpbmUgTVM1NjExX1NUQVJUX1BSRVNTVVJFX0NPTlYJMHg0OAorCisjZGVmaW5lIE1TNTYxMV9DT05WX1RJTUVfTUlOCQk5MDQwCisjZGVmaW5lIE1TNTYxMV9DT05WX1RJTUVfTUFYCQkxMDAwMAorCisjZGVmaW5lIE1TNTYxMV9QUk9NX1dPUkRTX05CCQk4CisKK3N0cnVjdCBtczU2MTFfc3RhdGUgeworCXZvaWQgKmNsaWVudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCWludCAoKnJlc2V0KShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKnJlYWRfcHJvbV93b3JkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCwgdTE2ICp3b3JkKTsKKwlpbnQgKCpyZWFkX2FkY190ZW1wX2FuZF9wcmVzc3VyZSkoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHMzMiAqdGVtcCwgczMyICpwcmVzc3VyZSk7CisKKwl1MTYgcHJvbVtNUzU2MTFfUFJPTV9XT1JEU19OQl07Cit9OworCitpbnQgbXM1NjExX3Byb2JlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBkZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKiBfTVM1NjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9jb3JlLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmM4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfY29yZS5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogTVM1NjExIHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSBUb21hc3ogRHVzenluc2tpIDx0ZHVzenluc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEYXRhIHNoZWV0OgorICogIGh0dHA6Ly93d3cubWVhcy1zcGVjLmNvbS9kb3dubG9hZHMvTVM1NjExLTAxQkEwMy5wZGYKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibXM1NjExLmgiCisKK3N0YXRpYyBib29sIG1zNTYxMV9wcm9tX2lzX3ZhbGlkKHUxNiAqcHJvbSwgc2l6ZV90IGxlbikKK3sKKwlpbnQgaSwgajsKKwl1aW50MTZfdCBjcmMgPSAwLCBjcmNfb3JpZyA9IHByb21bN10gJiAweDAwMEY7CisKKwlwcm9tWzddICY9IDB4RkYwMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW4gKiAyOyBpKyspIHsKKwkJaWYgKGkgJSAyID09IDEpCisJCQljcmMgXj0gcHJvbVtpID4+IDFdICYgMHgwMEZGOworCQllbHNlCisJCQljcmMgXj0gcHJvbVtpID4+IDFdID4+IDg7CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJaWYgKGNyYyAmIDB4ODAwMCkKKwkJCQljcmMgPSAoY3JjIDw8IDEpIF4gMHgzMDAwOworCQkJZWxzZQorCQkJCWNyYyA8PD0gMTsKKwkJfQorCX0KKworCWNyYyA9IChjcmMgPj4gMTIpICYgMHgwMDBGOworCisJcmV0dXJuIGNyY19vcmlnICE9IDB4MDAwMCAmJiBjcmMgPT0gY3JjX29yaWc7Cit9CisKK3N0YXRpYyBpbnQgbXM1NjExX3JlYWRfcHJvbShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQsIGk7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJZm9yIChpID0gMDsgaSA8IE1TNTYxMV9QUk9NX1dPUkRTX05COyBpKyspIHsKKwkJcmV0ID0gc3QtPnJlYWRfcHJvbV93b3JkKCZpbmRpb19kZXYtPmRldiwgaSwgJnN0LT5wcm9tW2ldKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gcmVhZCBwcm9tIGF0ICVkXG4iLCBpKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoIW1zNTYxMV9wcm9tX2lzX3ZhbGlkKHN0LT5wcm9tLCBNUzU2MTFfUFJPTV9XT1JEU19OQikpIHsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJQUk9NIGludGVncml0eSBjaGVjayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtczU2MTFfcmVhZF90ZW1wX2FuZF9wcmVzc3VyZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCQkgczMyICp0ZW1wLCBzMzIgKnByZXNzdXJlKQoreworCWludCByZXQ7CisJczMyIHQsIHA7CisJczY0IG9mZiwgc2VucywgZHQ7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0ID0gc3QtPnJlYWRfYWRjX3RlbXBfYW5kX3ByZXNzdXJlKCZpbmRpb19kZXYtPmRldiwgJnQsICZwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gcmVhZCB0ZW1wZXJhdHVyZSBhbmQgcHJlc3N1cmVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWR0ID0gdCAtIChzdC0+cHJvbVs1XSA8PCA4KTsKKwlvZmYgPSAoKHM2NClzdC0+cHJvbVsyXSA8PCAxNikgKyAoKHN0LT5wcm9tWzRdICogZHQpID4+IDcpOworCXNlbnMgPSAoKHM2NClzdC0+cHJvbVsxXSA8PCAxNSkgKyAoKHN0LT5wcm9tWzNdICogZHQpID4+IDgpOworCisJdCA9IDIwMDAgKyAoKHN0LT5wcm9tWzZdICogZHQpID4+IDIzKTsKKwlpZiAodCA8IDIwMDApIHsKKwkJczY0IG9mZjIsIHNlbnMyLCB0MjsKKworCQl0MiA9IChkdCAqIGR0KSA+PiAzMTsKKwkJb2ZmMiA9ICg1ICogKHQgLSAyMDAwKSAqICh0IC0gMjAwMCkpID4+IDE7CisJCXNlbnMyID0gb2ZmMiA+PiAxOworCisJCWlmICh0IDwgLTE1MDApIHsKKwkJCXM2NCB0bXAgPSAodCArIDE1MDApICogKHQgKyAxNTAwKTsKKworCQkJb2ZmMiArPSA3ICogdG1wOworCQkJc2VuczIgKz0gKDExICogdG1wKSA+PiAxOworCQl9CisKKwkJdCAtPSB0MjsKKwkJb2ZmIC09IG9mZjI7CisJCXNlbnMgLT0gc2VuczI7CisJfQorCisJKnRlbXAgPSB0OworCSpwcmVzc3VyZSA9ICgoKHAgKiBzZW5zKSA+PiAyMSkgLSBvZmYpID4+IDE1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXM1NjExX3Jlc2V0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXQgPSBzdC0+cmVzZXQoJmluZGlvX2Rldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgImZhaWxlZCB0byByZXNldCBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXVzbGVlcF9yYW5nZSgzMDAwLCA0MDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJaW50IHJldDsKKwlzMzIgdGVtcCwgcHJlc3N1cmU7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1BST0NFU1NFRDoKKwkJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCQlyZXQgPSBtczU2MTFfcmVhZF90ZW1wX2FuZF9wcmVzc3VyZShpbmRpb19kZXYsCisJCQkJCQkgICAgJnRlbXAsICZwcmVzc3VyZSk7CisJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1RFTVA6CisJCQkqdmFsID0gdGVtcCAqIDEwOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19QUkVTU1VSRToKKwkJCSp2YWwgPSBwcmVzc3VyZSAvIDEwMDA7CisJCQkqdmFsMiA9IChwcmVzc3VyZSAlIDEwMDApICogMTAwMDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1zNTYxMV9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fUFJFU1NVUkUsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19QUk9DRVNTRUQpIHwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKQorCX0sCisJeworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUFJPQ0VTU0VEKSB8CisJCQlCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIG1zNTYxMV9pbmZvID0geworCS5yZWFkX3JhdyA9ICZtczU2MTFfcmVhZF9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgbXM1NjExX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbXM1NjExX3Jlc2V0KGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbXM1NjExX3JlYWRfcHJvbShpbmRpb19kZXYpOworfQorCitpbnQgbXM1NjExX3Byb2JlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSBkZXY7CisJaW5kaW9fZGV2LT5uYW1lID0gZGV2LT5kcml2ZXItPm5hbWU7CisJaW5kaW9fZGV2LT5pbmZvID0gJm1zNTYxMV9pbmZvOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtczU2MTFfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG1zNTYxMV9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gbXM1NjExX2luaXQoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoZGV2LCBpbmRpb19kZXYpOworfQorRVhQT1JUX1NZTUJPTChtczU2MTFfcHJvYmUpOworCitNT0RVTEVfQVVUSE9SKCJUb21hc3ogRHVzenluc2tpIDx0ZHVzenluc0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1TNTYxMSBjb3JlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2kyYy5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OGZkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfaTJjLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBNUzU2MTEgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgKEkyQyBidXMpCisgKgorICogQ29weXJpZ2h0IChjKSBUb21hc3ogRHVzenluc2tpIDx0ZHVzenluc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiA3LWJpdCBJMkMgc2xhdmUgYWRkcmVzc2VzOgorICoKKyAqIDB4NzcgKENTQiBwaW4gbG93KQorICogMHg3NiAoQ1NCIHBpbiBoaWdoKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgIm1zNTYxMS5oIgorCitzdGF0aWMgaW50IG1zNTYxMV9pMmNfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X3RvX2lpb19kZXYoZGV2KSk7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGUoc3QtPmNsaWVudCwgTVM1NjExX1JFU0VUKTsKK30KKworc3RhdGljIGludCBtczU2MTFfaTJjX3JlYWRfcHJvbV93b3JkKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4LCB1MTYgKndvcmQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2FwcGVkKHN0LT5jbGllbnQsCisJCQlNUzU2MTFfUkVBRF9QUk9NX1dPUkQgKyAoaW5kZXggPDwgMSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKndvcmQgPSByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtczU2MTFfaTJjX3JlYWRfYWRjKHN0cnVjdCBtczU2MTFfc3RhdGUgKnN0LCBzMzIgKnZhbCkKK3sKKwlpbnQgcmV0OworCXU4IGJ1ZlszXTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKHN0LT5jbGllbnQsIE1TNTYxMV9SRUFEX0FEQywKKwkJCQkJICAgIDMsIGJ1Zik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqdmFsID0gKGJ1ZlswXSA8PCAxNikgfCAoYnVmWzFdIDw8IDgpIHwgYnVmWzJdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXM1NjExX2kyY19yZWFkX2FkY190ZW1wX2FuZF9wcmVzc3VyZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkgczMyICp0ZW1wLCBzMzIgKnByZXNzdXJlKQoreworCWludCByZXQ7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKHN0LT5jbGllbnQsIE1TNTYxMV9TVEFSVF9URU1QX0NPTlYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdXNsZWVwX3JhbmdlKE1TNTYxMV9DT05WX1RJTUVfTUlOLCBNUzU2MTFfQ09OVl9USU1FX01BWCk7CisKKwlyZXQgPSBtczU2MTFfaTJjX3JlYWRfYWRjKHN0LCB0ZW1wKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKHN0LT5jbGllbnQsIE1TNTYxMV9TVEFSVF9QUkVTU1VSRV9DT05WKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXVzbGVlcF9yYW5nZShNUzU2MTFfQ09OVl9USU1FX01JTiwgTVM1NjExX0NPTlZfVElNRV9NQVgpOworCisJcmV0dXJuIG1zNTYxMV9pMmNfcmVhZF9hZGMoc3QsIHByZXNzdXJlKTsKK30KKworc3RhdGljIGludCBtczU2MTFfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBtczU2MTFfc3RhdGUgKnN0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0spKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqc3QpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3QtPnJlc2V0ID0gbXM1NjExX2kyY19yZXNldDsKKwlzdC0+cmVhZF9wcm9tX3dvcmQgPSBtczU2MTFfaTJjX3JlYWRfcHJvbV93b3JkOworCXN0LT5yZWFkX2FkY190ZW1wX2FuZF9wcmVzc3VyZSA9IG1zNTYxMV9pMmNfcmVhZF9hZGNfdGVtcF9hbmRfcHJlc3N1cmU7CisJc3QtPmNsaWVudCA9IGNsaWVudDsKKworCXJldHVybiBtczU2MTFfcHJvYmUoaW5kaW9fZGV2LCAmY2xpZW50LT5kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbXM1NjExX2lkW10gPSB7CisJeyAibXM1NjExIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtczU2MTFfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbXM1NjExX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtczU2MTEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5pZF90YWJsZSA9IG1zNTYxMV9pZCwKKwkucHJvYmUgPSBtczU2MTFfaTJjX3Byb2JlLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKG1zNTYxMV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUb21hc3ogRHVzenluc2tpIDx0ZHVzenluc0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1TNTYxMSBpMmMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfc3BpLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2NzI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9zcGkuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIE1TNTYxMSBwcmVzc3VyZSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciAoU1BJIGJ1cykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIFRvbWFzeiBEdXN6eW5za2kgPHRkdXN6eW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICJtczU2MTEuaCIKKworc3RhdGljIGludCBtczU2MTFfc3BpX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1OCBjbWQgPSBNUzU2MTFfUkVTRVQ7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKKworCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHN0LT5jbGllbnQsICZjbWQsIDEsIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9zcGlfcmVhZF9wcm9tX3dvcmQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgsIHUxNiAqd29yZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X3RvX2lpb19kZXYoZGV2KSk7CisKKwlyZXQgPSBzcGlfdzhyMTZiZShzdC0+Y2xpZW50LCBNUzU2MTFfUkVBRF9QUk9NX1dPUkQgKyAoaW5kZXggPDwgMSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKndvcmQgPSByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtczU2MTFfc3BpX3JlYWRfYWRjKHN0cnVjdCBkZXZpY2UgKmRldiwgczMyICp2YWwpCit7CisJaW50IHJldDsKKwl1OCBidWZbM10gPSB7IE1TNTYxMV9SRUFEX0FEQyB9OworCXN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X3RvX2lpb19kZXYoZGV2KSk7CisKKwlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHN0LT5jbGllbnQsIGJ1ZiwgMSwgYnVmLCAzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSAoYnVmWzBdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMl07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtczU2MTFfc3BpX3JlYWRfYWRjX3RlbXBfYW5kX3ByZXNzdXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCSBzMzIgKnRlbXAsIHMzMiAqcHJlc3N1cmUpCit7CisJdTggY21kOworCWludCByZXQ7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKKworCWNtZCA9IE1TNTYxMV9TVEFSVF9URU1QX0NPTlY7CisJcmV0ID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzdC0+Y2xpZW50LCAmY21kLCAxLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXVzbGVlcF9yYW5nZShNUzU2MTFfQ09OVl9USU1FX01JTiwgTVM1NjExX0NPTlZfVElNRV9NQVgpOworCisJcmV0ID0gbXM1NjExX3NwaV9yZWFkX2FkYyhkZXYsIHRlbXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY21kID0gTVM1NjExX1NUQVJUX1BSRVNTVVJFX0NPTlY7CisJcmV0ID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzdC0+Y2xpZW50LCAmY21kLCAxLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXVzbGVlcF9yYW5nZShNUzU2MTFfQ09OVl9USU1FX01JTiwgTVM1NjExX0NPTlZfVElNRV9NQVgpOworCisJcmV0dXJuIG1zNTYxMV9zcGlfcmVhZF9hZGMoZGV2LCBwcmVzc3VyZSk7Cit9CisKK3N0YXRpYyBpbnQgbXM1NjExX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3Q7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmc3BpLT5kZXYsIHNpemVvZigqc3QpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8wOworCXNwaS0+bWF4X3NwZWVkX2h6ID0gMjAwMDAwMDA7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwlyZXQgPSBzcGlfc2V0dXAoc3BpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdC0+cmVzZXQgPSBtczU2MTFfc3BpX3Jlc2V0OworCXN0LT5yZWFkX3Byb21fd29yZCA9IG1zNTYxMV9zcGlfcmVhZF9wcm9tX3dvcmQ7CisJc3QtPnJlYWRfYWRjX3RlbXBfYW5kX3ByZXNzdXJlID0gbXM1NjExX3NwaV9yZWFkX2FkY190ZW1wX2FuZF9wcmVzc3VyZTsKKwlzdC0+Y2xpZW50ID0gc3BpOworCisJcmV0dXJuIG1zNTYxMV9wcm9iZShpbmRpb19kZXYsICZzcGktPmRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBtczU2MTFfaWRbXSA9IHsKKwl7ICJtczU2MTEiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIG1zNTYxMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtczU2MTFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zNTYxMSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLmlkX3RhYmxlID0gbXM1NjExX2lkLAorCS5wcm9iZSA9IG1zNTYxMV9zcGlfcHJvYmUsCit9OworbW9kdWxlX3NwaV9kcml2ZXIobXM1NjExX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRvbWFzeiBEdXN6eW5za2kgPHRkdXN6eW5zQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVM1NjExIHNwaSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9zeDk1MDAuYyBiL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9zeDk1MDAuYwppbmRleCA4OWZjYTNhLi5mYTQwZjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcm94aW1pdHkvc3g5NTAwLmMKKysrIGIvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jCkBAIC02MTgsMTYgKzYxOCwxMiBAQAogCWRldiA9ICZjbGllbnQtPmRldjsKIAogCS8qIGRhdGEgcmVhZHkgZ3BpbyBpbnRlcnJ1cHQgcGluICovCi0JZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgU1g5NTAwX0dQSU9fTkFNRSwgMCk7CisJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgU1g5NTAwX0dQSU9fTkFNRSwgMCwgR1BJT0RfSU4pOwogCWlmIChJU19FUlIoZ3BpbykpIHsKIAkJZGV2X2VycihkZXYsICJhY3BpIGdwaW8gZ2V0IGluZGV4IGZhaWxlZFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGdwaW8pOwogCX0KIAotCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gZ3Bpb2RfdG9faXJxKGdwaW8pOwogCiAJZGV2X2RiZyhkZXYsICJHUElPIHJlc291cmNlLCBubzolZCBpcnE6JWRcbiIsIGRlc2NfdG9fZ3BpbyhncGlvKSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21seDkwNjE0LmMgYi9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9tbHg5MDYxNC5jCmluZGV4IGM4YjZhYzguLmExMTJmYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21seDkwNjE0LmMKKysrIGIvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvbWx4OTA2MTQuYwpAQCAtMiw2ICsyLDcgQEAKICAqIG1seDkwNjE0LmMgLSBTdXBwb3J0IGZvciBNZWxleGlzIE1MWDkwNjE0IGNvbnRhY3RsZXNzIElSIHRlbXBlcmF0dXJlIHNlbnNvcgogICoKICAqIENvcHlyaWdodCAoYykgMjAxNCBQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgRXNzZW5zaXVtIE5WCiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgogICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KQEAgLTIwLDExICsyMSwzNSBAQAogCiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogCi0jZGVmaW5lIE1MWDkwNjE0X09QX1JBTSAweDAwCisjZGVmaW5lIE1MWDkwNjE0X09QX1JBTQkJMHgwMAorI2RlZmluZSBNTFg5MDYxNF9PUF9FRVBST00JMHgyMAorI2RlZmluZSBNTFg5MDYxNF9PUF9TTEVFUAkweGZmCiAKIC8qIFJBTSBvZmZzZXRzIHdpdGggMTYtYml0IGRhdGEsIE1TQiBmaXJzdCAqLwotI2RlZmluZSBNTFg5MDYxNF9UQSAweDA2IC8qIGFtYmllbnQgdGVtcGVyYXR1cmUgKi8KLSNkZWZpbmUgTUxYOTA2MTRfVE9CSjEgMHgwNyAvKiBvYmplY3QgdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgTUxYOTA2MTRfUkFXMQkoTUxYOTA2MTRfT1BfUkFNIHwgMHgwNCkgLyogcmF3IGRhdGEgSVIgY2hhbm5lbCAxICovCisjZGVmaW5lIE1MWDkwNjE0X1JBVzIJKE1MWDkwNjE0X09QX1JBTSB8IDB4MDUpIC8qIHJhdyBkYXRhIElSIGNoYW5uZWwgMiAqLworI2RlZmluZSBNTFg5MDYxNF9UQQkoTUxYOTA2MTRfT1BfUkFNIHwgMHgwNikgLyogYW1iaWVudCB0ZW1wZXJhdHVyZSAqLworI2RlZmluZSBNTFg5MDYxNF9UT0JKMQkoTUxYOTA2MTRfT1BfUkFNIHwgMHgwNykgLyogb2JqZWN0IDEgdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgTUxYOTA2MTRfVE9CSjIJKE1MWDkwNjE0X09QX1JBTSB8IDB4MDgpIC8qIG9iamVjdCAyIHRlbXBlcmF0dXJlICovCisKKy8qIEVFUFJPTSBvZmZzZXRzIHdpdGggMTYtYml0IGRhdGEsIE1TQiBmaXJzdCAqLworI2RlZmluZSBNTFg5MDYxNF9FTUlTU0lWSVRZCShNTFg5MDYxNF9PUF9FRVBST00gfCAweDA0KSAvKiBlbWlzc2l2aXR5IGNvcnJlY3Rpb24gY29lZmZpY2llbnQgKi8KKyNkZWZpbmUgTUxYOTA2MTRfQ09ORklHCQkoTUxYOTA2MTRfT1BfRUVQUk9NIHwgMHgwNSkgLyogY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCisvKiBDb250cm9sIGJpdHMgaW4gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBNTFg5MDYxNF9DT05GSUdfSUlSX1NISUZUIDAgLyogSUlSIGNvZWZmaWNpZW50ICovCisjZGVmaW5lIE1MWDkwNjE0X0NPTkZJR19JSVJfTUFTSyAoMHg3IDw8IE1MWDkwNjE0X0NPTkZJR19JSVJfU0hJRlQpCisjZGVmaW5lIE1MWDkwNjE0X0NPTkZJR19EVUFMX1NISUZUIDYgLyogc2luZ2xlICgwKSBvciBkdWFsICgxKSBJUiBzZW5zb3IgKi8KKyNkZWZpbmUgTUxYOTA2MTRfQ09ORklHX0RVQUxfTUFTSyAoMSA8PCBNTFg5MDYxNF9DT05GSUdfRFVBTF9TSElGVCkKKyNkZWZpbmUgTUxYOTA2MTRfQ09ORklHX0ZJUl9TSElGVCA4IC8qIEZJUiBjb2VmZmljaWVudCAqLworI2RlZmluZSBNTFg5MDYxNF9DT05GSUdfRklSX01BU0sgKDB4NyA8PCBNTFg5MDYxNF9DT05GSUdfRklSX1NISUZUKQorI2RlZmluZSBNTFg5MDYxNF9DT05GSUdfR0FJTl9TSElGVCAxMSAvKiBnYWluICovCisjZGVmaW5lIE1MWDkwNjE0X0NPTkZJR19HQUlOX01BU0sgKDB4NyA8PCBNTFg5MDYxNF9DT05GSUdfR0FJTl9TSElGVCkKKworLyogVGltaW5ncyAoaW4gbXMpICovCisjZGVmaW5lIE1MWDkwNjE0X1RJTUlOR19FRVBST00gMjAgLyogdGltZSBmb3IgRUVQUk9NIHdyaXRlL2VyYXNlIHRvIGNvbXBsZXRlICovCisjZGVmaW5lIE1MWDkwNjE0X1RJTUlOR19XQUtFVVAgMzQgLyogdGltZSB0byBob2xkIFNEQSBsb3cgZm9yIHdha2UtdXAgKi8KKyNkZWZpbmUgTUxYOTA2MTRfVElNSU5HX1NUQVJUVVAgMjUwIC8qIHRpbWUgYmVmb3JlIGZpcnN0IGRhdGEgYWZ0ZXIgd2FrZS11cCAqLwogCiBzdHJ1Y3QgbWx4OTA2MTRfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKQEAgLTM1LDI2ICs2MCwzNCBAQAogCQkJICAgIGludCAqdmFsMiwgbG9uZyBtYXNrKQogewogCXN0cnVjdCBtbHg5MDYxNF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1OCBjbWQ7CiAJczMyIHJldDsKIAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6IC8qIDAuMDJLIC8gTFNCICovCiAJCXN3aXRjaCAoY2hhbm5lbC0+Y2hhbm5lbDIpIHsKIAkJY2FzZSBJSU9fTU9EX1RFTVBfQU1CSUVOVDoKLQkJCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkgICAgTUxYOTA2MTRfT1BfUkFNIHwgTUxYOTA2MTRfVEEpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJCWNtZCA9IE1MWDkwNjE0X1RBOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX01PRF9URU1QX09CSkVDVDoKLQkJCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkgICAgTUxYOTA2MTRfT1BfUkFNIHwgTUxYOTA2MTRfVE9CSjEpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJCXN3aXRjaCAoY2hhbm5lbC0+Y2hhbm5lbCkgeworCQkJY2FzZSAwOgorCQkJCWNtZCA9IE1MWDkwNjE0X1RPQkoxOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWNtZCA9IE1MWDkwNjE0X1RPQkoyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKworCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBjbWQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAJCSp2YWwgPSByZXQ7CiAJCXJldHVybiBJSU9fVkFMX0lOVDsKIAljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgpAQCAtODYsNiArMTE5LDE2IEBACiAJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwKIAkJICAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKIAl9LAorCXsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZGV4ZWQgPSAxLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfVEVNUF9PQkpFQ1QsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8CisJCSAgICBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbWx4OTA2MTRfaW5mbyA9IHsKQEAgLTkzLDExICsxMzYsMjUgQEAKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIAorLyogUmV0dXJuIDAgZm9yIHNpbmdsZSBzZW5zb3IsIDEgZm9yIGR1YWwgc2Vuc29yLCA8MCBvbiBlcnJvci4gKi8KK3N0YXRpYyBpbnQgbWx4OTA2MTRfcHJvYmVfbnVtX2lyX3NlbnNvcnMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzMzIgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgTUxYOTA2MTRfQ09ORklHKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIChyZXQgJiBNTFg5MDYxNF9DT05GSUdfRFVBTF9NQVNLKSA/IDEgOiAwOworfQorCiBzdGF0aWMgaW50IG1seDkwNjE0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IG1seDkwNjE0X2RhdGEgKmRhdGE7CisJaW50IHJldDsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTExNSw4ICsxNzIsMjEgQEAKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAJaW5kaW9fZGV2LT5pbmZvID0gJm1seDkwNjE0X2luZm87CiAKLQlpbmRpb19kZXYtPmNoYW5uZWxzID0gbWx4OTA2MTRfY2hhbm5lbHM7Ci0JaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG1seDkwNjE0X2NoYW5uZWxzKTsKKwlyZXQgPSBtbHg5MDYxNF9wcm9iZV9udW1faXJfc2Vuc29ycyhjbGllbnQpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZvdW5kIHNpbmdsZSBzZW5zb3IiKTsKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IG1seDkwNjE0X2NoYW5uZWxzOworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJGb3VuZCBkdWFsIHNlbnNvciIpOworCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gbWx4OTA2MTRfY2hhbm5lbHM7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogfQpAQCAtMTQ2LDUgKzIxNiw2IEBACiBtb2R1bGVfaTJjX2RyaXZlcihtbHg5MDYxNF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+Iik7CitNT0RVTEVfQVVUSE9SKCJWaWFubmV5IGxlIENsw6ltZW50IGRlIFNhaW50LU1hcmNxIDx2aWFubmV5LmxlY2xlbWVudEBlc3NlbnNpdW0uY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWxleGlzIE1MWDkwNjE0IGNvbnRhY3RsZXNzIElSIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggNDViYWE4My4uYmZhY2Y2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTU4LDYgKzU4LDggQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc203eHhmYi9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3hnaWZiL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL0tjb25maWciCkBAIC0xMDgsNCArMTEwLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaTJvL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9LY29uZmlnIgorCiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCAyOTE2MDc5Li4yYmJkMWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC0yMyw2ICsyMyw3IEBACiBvYmotJChDT05GSUdfVk1FX0JVUykJCSs9IHZtZS8KIG9iai0kKENPTkZJR19JSU8pCQkrPSBpaW8vCiBvYmotJChDT05GSUdfRkJfU003WFgpCQkrPSBzbTd4eGZiLworb2JqLSQoQ09ORklHX0ZCX1NNN1hYKQkJKz0gc203NTBmYi8KIG9iai0kKENPTkZJR19GQl9YR0kpCQkrPSB4Z2lmYi8KIG9iai0kKENPTkZJR19VU0JfRU1YWCkJCSs9IGVteHhfdWRjLwogb2JqLSQoQ09ORklHX0ZUMTAwMCkJCSs9IGZ0MTAwMC8KQEAgLTQ2LDMgKzQ3LDQgQEAKIG9iai0kKENPTkZJR19DT01NT05fQ0xLX1hMTlhfQ0xLV1pSRCkJKz0gY2xvY2tpbmctd2l6YXJkLwogb2JqLSQoQ09ORklHX0ZCX1RGVCkJCSs9IGZidGZ0Lwogb2JqLSQoQ09ORklHX0kyTykJCSs9IGkyby8KK29iai0kKENPTkZJR19GU0xfTUNfQlVTKQkrPSBmc2wtbWMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKaW5kZXggYjhmMWM0OS4uMGUzZDhjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYwpAQCAtNTY2LDggKzU2Niw4IEBACiAJYnVmZmVyID0gaGFuZGxlLT5idWZmZXI7CiAKIAlpZiAoIWJ1ZmZlci0+aGVhcC0+b3BzLT5waHlzKSB7Ci0JCXByX2VycigiJXM6IGlvbl9waHlzIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIGhlYXAuXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBpb25fcGh5cyBpcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBoZWFwIChuYW1lPSVzLCB0eXBlPSVkKS5cbiIsCisJCQlfX2Z1bmNfXywgYnVmZmVyLT5oZWFwLT5uYW1lLCBidWZmZXItPmhlYXAtPnR5cGUpOwogCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTEzOTUsNyArMTM5NSw3IEBACiAJc2l6ZV90IHRvdGFsX3NpemUgPSAwOwogCXNpemVfdCB0b3RhbF9vcnBoYW5lZF9zaXplID0gMDsKIAotCXNlcV9wcmludGYocywgIiUxNi5zICUxNi5zICUxNi5zXG4iLCAiY2xpZW50IiwgInBpZCIsICJzaXplIik7CisJc2VxX3ByaW50ZihzLCAiJTE2cyAlMTZzICUxNnNcbiIsICJjbGllbnQiLCAicGlkIiwgInNpemUiKTsKIAlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKIAlmb3IgKG4gPSByYl9maXJzdCgmZGV2LT5jbGllbnRzKTsgbjsgbiA9IHJiX25leHQobikpIHsKQEAgLTE0MDksMTAgKzE0MDksMTAgQEAKIAkJCWNoYXIgdGFza19jb21tW1RBU0tfQ09NTV9MRU5dOwogCiAJCQlnZXRfdGFza19jb21tKHRhc2tfY29tbSwgY2xpZW50LT50YXNrKTsKLQkJCXNlcV9wcmludGYocywgIiUxNi5zICUxNnUgJTE2enVcbiIsIHRhc2tfY29tbSwKKwkJCXNlcV9wcmludGYocywgIiUxNnMgJTE2dSAlMTZ6dVxuIiwgdGFza19jb21tLAogCQkJCSAgIGNsaWVudC0+cGlkLCBzaXplKTsKIAkJfSBlbHNlIHsKLQkJCXNlcV9wcmludGYocywgIiUxNi5zICUxNnUgJTE2enVcbiIsIGNsaWVudC0+bmFtZSwKKwkJCXNlcV9wcmludGYocywgIiUxNnMgJTE2dSAlMTZ6dVxuIiwgY2xpZW50LT5uYW1lLAogCQkJCSAgIGNsaWVudC0+cGlkLCBzaXplKTsKIAkJfQogCX0KQEAgLTE0MjYsNyArMTQyNiw3IEBACiAJCQljb250aW51ZTsKIAkJdG90YWxfc2l6ZSArPSBidWZmZXItPnNpemU7CiAJCWlmICghYnVmZmVyLT5oYW5kbGVfY291bnQpIHsKLQkJCXNlcV9wcmludGYocywgIiUxNi5zICUxNnUgJTE2enUgJWQgJWRcbiIsCisJCQlzZXFfcHJpbnRmKHMsICIlMTZzICUxNnUgJTE2enUgJWQgJWRcbiIsCiAJCQkJICAgYnVmZmVyLT50YXNrX2NvbW0sIGJ1ZmZlci0+cGlkLAogCQkJCSAgIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5rbWFwX2NudCwKIAkJCQkgICBhdG9taWNfcmVhZCgmYnVmZmVyLT5yZWYucmVmY291bnQpKTsKQEAgLTE0MzUsMTEgKzE0MzUsMTEgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmJ1ZmZlcl9sb2NrKTsKIAlzZXFfcHV0cyhzLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0Jc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2enVcbiIsICJ0b3RhbCBvcnBoYW5lZCIsCisJc2VxX3ByaW50ZihzLCAiJTE2cyAlMTZ6dVxuIiwgInRvdGFsIG9ycGhhbmVkIiwKIAkJICAgdG90YWxfb3JwaGFuZWRfc2l6ZSk7Ci0Jc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2enVcbiIsICJ0b3RhbCAiLCB0b3RhbF9zaXplKTsKKwlzZXFfcHJpbnRmKHMsICIlMTZzICUxNnp1XG4iLCAidG90YWwgIiwgdG90YWxfc2l6ZSk7CiAJaWYgKGhlYXAtPmZsYWdzICYgSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFKQotCQlzZXFfcHJpbnRmKHMsICIlMTYucyAlMTZ6dVxuIiwgImRlZmVycmVkIGZyZWUiLAorCQlzZXFfcHJpbnRmKHMsICIlMTZzICUxNnp1XG4iLCAiZGVmZXJyZWQgZnJlZSIsCiAJCQkJaGVhcC0+ZnJlZV9saXN0X3NpemUpOwogCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl90ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYwppbmRleCA2NTRhY2I1Li4zYmM0NjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYwpAQCAtMjgwLDMgKzI4MCw0IEBACiAKIG1vZHVsZV9pbml0KGlvbl90ZXN0X2luaXQpOwogbW9kdWxlX2V4aXQoaW9uX3Rlc3RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmMKaW5kZXggN2JkYjYyYi4uZjgzZTAwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N5bmMuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCBuZXh0LCAmb2JqLT5hY3RpdmVfbGlzdF9oZWFkLAogCQkJCSBhY3RpdmVfbGlzdCkgewogCQlpZiAoZmVuY2VfaXNfc2lnbmFsZWRfbG9ja2VkKCZwdC0+YmFzZSkpCi0JCQlsaXN0X2RlbCgmcHQtPmFjdGl2ZV9saXN0KTsKKwkJCWxpc3RfZGVsX2luaXQoJnB0LT5hY3RpdmVfbGlzdCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZwppbmRleCA1OTNmY2IxLi42MWM2MzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCkBAIC0xMDgsNiArMTA4LDcgQEAKIAogY29uZmlnIENPTUVESV9QQ0w3MTEKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC03MTEvNzExYiBhbmQgQURsaW5rIEFDTC04MTEyIElTQSBjYXJkIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtNzExIGFuZCA3MTFiLCBBRGxpbmsgQUNMLTgxMTIKIApAQCAtMTY5LDYgKzE3MCw3IEBACiBjb25maWcgQ09NRURJX1BDTDgxMgogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTgxMi84MTMgYW5kIEFEbGluayBBQ0wtODExMi84MTEzLzgxMTMvODIxNiIKIAlzZWxlY3QgQ09NRURJX0lTQURNQSBpZiBJU0FfRE1BX0FQSQorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxMi9QRywgUENMLTgxMy9CLCBBRExpbmsKIAkgIEFDTC04MTEyREcvSEcvUEcsIEFDTC04MTEzLCBBQ0wtODIxNiwgSUNQIERBUyBBLTgyMVBHSC9QR0wvUEdMLU5EQSwKQEAgLTE4MCw2ICsxODIsNyBAQAogY29uZmlnIENPTUVESV9QQ0w4MTYKIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDTC04MTQgYW5kIFBDTC04MTYgSVNBIGNhcmQgc3VwcG9ydCIKIAlzZWxlY3QgQ09NRURJX0lTQURNQSBpZiBJU0FfRE1BX0FQSQorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENMLTgxNCBhbmQgUENMLTgxNiBJU0EgY2FyZHMKIApAQCAtMTg5LDYgKzE5Miw3IEBACiBjb25maWcgQ09NRURJX1BDTDgxOAogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTcxOCBhbmQgUENMLTgxOCBJU0EgY2FyZCBzdXBwb3J0IgogCXNlbGVjdCBDT01FRElfSVNBRE1BIGlmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODE4IElTQSBjYXJkcwogCSAgUENMLTgxOEwsIFBDTC04MThILCBQQ0wtODE4SEQsIFBDTC04MThIRywgUENMLTgxOCBhbmQgUENMLTcxOApAQCAtMjU5LDYgKzI2Myw3IEBACiAKIGNvbmZpZyBDT01FRElfREFTMTZNMQogCXRyaXN0YXRlICJNZWFzdXJlbWVudENvbXB1dGluZyBDSU8tREFTMTYvTTFEQVMtMTYgSVNBIGNhcmQgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAlzZWxlY3QgQ09NRURJXzgyNTUKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgTWVhc3VyZW1lbnQgQ29tcHV0aW5nIENJTy1EQVMxNi9NMSBJU0EgY2FyZHMuCkBAIC0yODIsNiArMjg3LDcgQEAKIGNvbmZpZyBDT01FRElfREFTMTYKIAl0cmlzdGF0ZSAiREFTLTE2IGNvbXBhdGlibGUgSVNBIGFuZCBQQy8xMDQgY2FyZCBzdXBwb3J0IgogCXNlbGVjdCBDT01FRElfSVNBRE1BIGlmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV84MjU0CiAJc2VsZWN0IENPTUVESV84MjU1CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEtlaXRobGV5IE1ldHJhYnl0ZS9Db21wdXRlckJvYXJkcyBEQVMxNgpAQCAtMjk4LDYgKzMwNCw3IEBACiAKIGNvbmZpZyBDT01FRElfREFTODAwCiAJdHJpc3RhdGUgIkRBUzgwMCBhbmQgY29tcGF0aWJsZSBJU0EgY2FyZCBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBLZWl0aGxleSBNZXRyYWJ5dGUgREFTODAwIGFuZCBjb21wYXRpYmxlIElTQSBjYXJkcwogCSAgS2VpdGhsZXkgTWV0cmFieXRlIERBUy04MDAsIERBUy04MDEsIERBUy04MDIKQEAgLTMxMCw2ICszMTcsNyBAQAogY29uZmlnIENPTUVESV9EQVMxODAwCiAJdHJpc3RhdGUgIkRBUzE4MDAgYW5kIGNvbXBhdGlibGUgSVNBIGNhcmQgc3VwcG9ydCIKIAlzZWxlY3QgQ09NRURJX0lTQURNQSBpZiBJU0FfRE1BX0FQSQorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBEQVMxODAwIGFuZCBjb21wYXRpYmxlIElTQSBjYXJkcwogCSAgS2VpdGhsZXkgTWV0cmFieXRlIERBUy0xNzAxU1QsIERBUy0xNzAxU1QtREEsIERBUy0xNzAxL0FPLApAQCAtMzIzLDYgKzMzMSw3IEBACiAKIGNvbmZpZyBDT01FRElfREFTNjQwMgogCXRyaXN0YXRlICJEQVM2NDAyIGFuZCBjb21wYXRpYmxlIElTQSBjYXJkIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERBUzY0MDIgYW5kIGNvbXBhdGlibGUgSVNBIGNhcmRzCiAJICBDb21wdXRlcmJvYXJkcywgS2VpdGhsZXkgTWV0cmFieXRlIERBUzY0MDIgYW5kIGNvbXBhdGlibGVzCkBAIC00NjMsNiArNDcyLDcgQEAKIGNvbmZpZyBDT01FRElfTklfQVRfQTIxNTAKIAl0cmlzdGF0ZSAiTkkgQVQtQTIxNTAgSVNBIGNhcmQgc3VwcG9ydCIKIAlzZWxlY3QgQ09NRURJX0lTQURNQSBpZiBJU0FfRE1BX0FQSQorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1BMjE1MCBjYXJkcwogCkBAIC00NzEsNiArNDgxLDcgQEAKIAogY29uZmlnIENPTUVESV9OSV9BVF9BTwogCXRyaXN0YXRlICJOSSBBVC1BTy02LzEwIEVJU0EgY2FyZCBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1BTy02LzEwIGNhcmRzCiAKQEAgLTcxNSw2ICs3MjYsNyBAQAogCiBjb25maWcgQ09NRURJX0FETF9QQ0k5MTExCiAJdHJpc3RhdGUgIkFETGluayBQQ0ktOTExMUhSIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEbGluayBQQ0k5MTExIGNhcmRzCiAKQEAgLTcyNCw2ICs3MzYsNyBAQAogY29uZmlnIENPTUVESV9BRExfUENJOTExOAogCXRyaXN0YXRlICJBRExpbmsgUENJLTkxMThERywgUENJLTkxMThIRywgUENJLTkxMThIUiBzdXBwb3J0IgogCWRlcGVuZHMgb24gSEFTX0RNQQorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBRGxpbmsgUENJLTkxMThERywgUENJLTkxMThIRywgUENJLTkxMThIUiBjYXJkcwogCkBAIC03MzIsNiArNzQ1LDcgQEAKIAogY29uZmlnIENPTUVESV9BRFZfUENJMTcxMAogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENJLTE3MXgsIFBDSS0xNzIwIGFuZCBQQ0ktMTczMSBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENJLTE3MTAsIFBDSS0xNzEwSEcsIFBDSS0xNzExLAogCSAgUENJLTE3MTMsIFBDSS0xNzIwIGFuZCBQQ0ktMTczMQpAQCAtNzU5LDYgKzc3Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQURWX1BDSV9ESU8KIAl0cmlzdGF0ZSAiQWR2YW50ZWNoIFBDSSBESU8gY2FyZCBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCXNlbGVjdCBDT01FRElfODI1NQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBZHZhbnRlY2ggUENJIERJTyBjYXJkcwpAQCAtNzk5LDYgKzgxNCw3IEBACiAKIGNvbmZpZyBDT01FRElfQU1QTENfUENJMjI0CiAJdHJpc3RhdGUgIkFtcGxpY29uIFBDSTIyNCBhbmQgUENJMjM0IHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFtcGxpY29uIFBDSTIyNCBhbmQgUENJMjM0IEFPIGJvYXJkcwogCkBAIC04MDcsNiArODIzLDcgQEAKIAogY29uZmlnIENPTUVESV9BTVBMQ19QQ0kyMzAKIAl0cmlzdGF0ZSAiQW1wbGljb24gUENJMjMwIGFuZCBQQ0kyNjAgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAlzZWxlY3QgQ09NRURJXzgyNTUKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQW1wbGljb24gUENJMjMwIGFuZCBQQ0kyNjAgTXVsdGlmdW5jdGlvbiBJL08KQEAgLTkxMiw2ICs5MjksNyBAQAogCiBjb25maWcgQ09NRURJX0NCX1BDSURBUwogCXRyaXN0YXRlICJNZWFzdXJlbWVudENvbXB1dGluZyBQQ0ktREFTIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJc2VsZWN0IENPTUVESV84MjU1CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIENvbXB1dGVyQm9hcmRzL01lYXN1cmVtZW50Q29tcHV0aW5nIFBDSS1EQVMgd2l0aApAQCAtOTM1LDYgKzk1Myw3IEBACiAKIGNvbmZpZyBDT01FRElfQ0JfUENJTURBUwogCXRyaXN0YXRlICJNZWFzdXJlbWVudENvbXB1dGluZyBQQ0lNLURBUzE2MDIvMTYsIFBDSWUtREFTMTYwMi8xNiBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCXNlbGVjdCBDT01FRElfODI1NQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBDb21wdXRlckJvYXJkcy9NZWFzdXJlbWVudENvbXB1dGluZyBQQ0kgTWlncmF0aW9uCkBAIC05NTQsNiArOTczLDcgQEAKIAogY29uZmlnIENPTUVESV9NRTQwMDAKIAl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtNDAwMCBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBNZWlsaGF1cyBQQ0kgZGF0YSBhY3F1aXNpdGlvbiBjYXJkcwogCSAgTUUtNDY1MCwgTUUtNDY3MGksIE1FLTQ2ODAsIE1FLTQ2ODBpIGFuZCBNRS00NjgwaXMKQEAgLTEwOTEsNiArMTExMSw3IEBACiAKIGNvbmZpZyBDT01FRElfQ0JfREFTMTZfQ1MKIAl0cmlzdGF0ZSAiQ0IgREFTMTYgc2VyaWVzIFBDTUNJQSBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQ29tcHV0ZXJCb2FyZHMvTWVhc3VyZW1lbnRDb21wdXRpbmcgUENNQ0lBCiAJICBjYXJkcyBEQVMxNi8xNiwgUENNLURBUzE2RC8xMiBhbmQgUENNLURBUzE2cy8xNgpAQCAtMTIyMiw2ICsxMjQzLDkgQEAKIAogZW5kaWYgIyBDT01FRElfVVNCX0RSSVZFUlMKIAorY29uZmlnIENPTUVESV84MjU0CisJdHJpc3RhdGUKKwogY29uZmlnIENPTUVESV84MjU1CiAJdHJpc3RhdGUgIkdlbmVyaWMgODI1NSBzdXBwb3J0IgogCS0tLWhlbHAtLS0KQEAgLTEyNTIsNiArMTI3Niw3IEBACiAJICBjYWxsZWQga2NvbWVkaWxpYi4KIAogY29uZmlnIENPTUVESV9BTVBMQ19ESU8yMDAKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAl0cmlzdGF0ZQogCiBjb25maWcgQ09NRURJX0FNUExDX1BDMjM2CkBAIC0xMjYwLDYgKzEyODUsNyBAQAogCiBjb25maWcgQ09NRURJX0RBUzA4CiAJdHJpc3RhdGUKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAlzZWxlY3QgQ09NRURJXzgyNTUKIAogY29uZmlnIENPTUVESV9JU0FETUEKQEAgLTEyNjcsNiArMTI5Myw3IEBACiAKIGNvbmZpZyBDT01FRElfTklfTEFCUEMKIAl0cmlzdGF0ZQorCXNlbGVjdCBDT01FRElfODI1NAogCXNlbGVjdCBDT01FRElfODI1NQogCiBjb25maWcgQ09NRURJX05JX0xBQlBDX0lTQURNQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCmluZGV4IDcyNzY0MGUuLmU3OGRkYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogewogCXN0cnVjdCBtb2R1bGUgKmRyaXZlcl9tb2R1bGUgPSBOVUxMOwogCi0JaWYgKGRldiA9PSBOVUxMKQorCWlmICghZGV2KQogCQlyZXR1cm47CiAJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CiAJaWYgKGRldi0+YXR0YWNoZWQpCkBAIC0yNjAsNyArMjYwLDcgQEAKIAogCWlmIChtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUykgewogCQlzID0gY29tZWRpX3N1YmRldmljZV9mcm9tX21pbm9yKGRldiwgbWlub3IpOwotCQlpZiAocyA9PSBOVUxMIHx8IChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1JFQUQpKQorCQlpZiAoIXMgfHwgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfUkVBRCkpCiAJCQlyZXR1cm4gczsKIAl9CiAJcmV0dXJuIGRldi0+cmVhZF9zdWJkZXY7CkBAIC0yNzMsNyArMjczLDcgQEAKIAogCWlmIChtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUykgewogCQlzID0gY29tZWRpX3N1YmRldmljZV9mcm9tX21pbm9yKGRldiwgbWlub3IpOwotCQlpZiAocyA9PSBOVUxMIHx8IChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKSkKKwkJaWYgKCFzIHx8IChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKSkKIAkJCXJldHVybiBzOwogCX0KIAlyZXR1cm4gZGV2LT53cml0ZV9zdWJkZXY7CkBAIC0yOTAsOSArMjkwLDkgQEAKIAl3cml0ZV9zID0gZGV2LT53cml0ZV9zdWJkZXY7CiAJaWYgKG1pbm9yID49IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKSB7CiAJCXMgPSBjb21lZGlfc3ViZGV2aWNlX2Zyb21fbWlub3IoZGV2LCBtaW5vcik7Ci0JCWlmIChzID09IE5VTEwgfHwgcy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9SRUFEKQorCQlpZiAoIXMgfHwgcy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9SRUFEKQogCQkJcmVhZF9zID0gczsKLQkJaWYgKHMgPT0gTlVMTCB8fCBzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKQorCQlpZiAoIXMgfHwgcy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9XUklURSkKIAkJCXdyaXRlX3MgPSBzOwogCX0KIAljZnAtPmxhc3RfYXR0YWNoZWQgPSBkZXYtPmF0dGFjaGVkOwpAQCAtNjAxLDI4ICs2MDEsNTUgQEAKIH07CiBBVFRSSUJVVEVfR1JPVVBTKGNvbWVkaV9kZXYpOwogCi1zdGF0aWMgdm9pZCBjb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICB1bnNpZ25lZCBtYXNrLCB1bnNpZ25lZCBiaXRzKQorc3RhdGljIHZvaWQgX19jb21lZGlfY2xlYXJfc3ViZGV2aWNlX3J1bmZsYWdzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgICAgICB1bnNpZ25lZCBiaXRzKQoreworCXMtPnJ1bmZsYWdzICY9IH5iaXRzOworfQorCitzdGF0aWMgdm9pZCBfX2NvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgICAgdW5zaWduZWQgYml0cykKK3sKKwlzLT5ydW5mbGFncyB8PSBiaXRzOworfQorCitzdGF0aWMgdm9pZCBjb21lZGlfdXBkYXRlX3N1YmRldmljZV9ydW5mbGFncyhzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkJICAgICB1bnNpZ25lZCBtYXNrLCB1bnNpZ25lZCBiaXRzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7Ci0Jcy0+cnVuZmxhZ3MgJj0gfm1hc2s7Ci0Jcy0+cnVuZmxhZ3MgfD0gKGJpdHMgJiBtYXNrKTsKKwlfX2NvbWVkaV9jbGVhcl9zdWJkZXZpY2VfcnVuZmxhZ3MocywgbWFzayk7CisJX19jb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCBiaXRzICYgbWFzayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBfX2NvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXJldHVybiBzLT5ydW5mbGFnczsKK30KKwogc3RhdGljIHVuc2lnbmVkIGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgcnVuZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7Ci0JcnVuZmxhZ3MgPSBzLT5ydW5mbGFnczsKKwlydW5mbGFncyA9IF9fY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Mocyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJ1bmZsYWdzOwogfQogCitzdGF0aWMgYm9vbCBjb21lZGlfaXNfcnVuZmxhZ3NfcnVubmluZyh1bnNpZ25lZCBydW5mbGFncykKK3sKKwlyZXR1cm4gcnVuZmxhZ3MgJiBDT01FRElfU1JGX1JVTk5JTkc7Cit9CisKK3N0YXRpYyBib29sIGNvbWVkaV9pc19ydW5mbGFnc19pbl9lcnJvcih1bnNpZ25lZCBydW5mbGFncykKK3sKKwlyZXR1cm4gcnVuZmxhZ3MgJiBDT01FRElfU1JGX0VSUk9SOworfQorCiAvKioKICAqIGNvbWVkaV9pc19zdWJkZXZpY2VfcnVubmluZyAtIGNoZWNrIGlmIGFzeW5jIGNvbW1hbmQgcnVubmluZyBvbiBzdWJkZXZpY2UKICAqIEBzOiBjb21lZGlfc3ViZGV2aWNlIHN0cnVjdApAQCAtNjM0LDIyICs2NjEsMjIgQEAKIHsKIAl1bnNpZ25lZCBydW5mbGFncyA9IGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpOwogCi0JcmV0dXJuIChydW5mbGFncyAmIENPTUVESV9TUkZfUlVOTklORykgPyB0cnVlIDogZmFsc2U7CisJcmV0dXJuIGNvbWVkaV9pc19ydW5mbGFnc19ydW5uaW5nKHJ1bmZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV9pc19zdWJkZXZpY2VfcnVubmluZyk7CiAKLXN0YXRpYyBib29sIGNvbWVkaV9pc19zdWJkZXZpY2VfaW5fZXJyb3Ioc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCitzdGF0aWMgYm9vbCBfX2NvbWVkaV9pc19zdWJkZXZpY2VfcnVubmluZyhzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQl1bnNpZ25lZCBydW5mbGFncyA9IGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpOworCXVuc2lnbmVkIHJ1bmZsYWdzID0gX19jb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKTsKIAotCXJldHVybiAocnVuZmxhZ3MgJiBDT01FRElfU1JGX0VSUk9SKSA/IHRydWUgOiBmYWxzZTsKKwlyZXR1cm4gY29tZWRpX2lzX3J1bmZsYWdzX3J1bm5pbmcocnVuZmxhZ3MpOwogfQogCiBzdGF0aWMgYm9vbCBjb21lZGlfaXNfc3ViZGV2aWNlX2lkbGUoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJdW5zaWduZWQgcnVuZmxhZ3MgPSBjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKTsKIAotCXJldHVybiAocnVuZmxhZ3MgJiBDT01FRElfU1JGX0JVU1lfTUFTSykgPyBmYWxzZSA6IHRydWU7CisJcmV0dXJuICEocnVuZmxhZ3MgJiBDT01FRElfU1JGX0JVU1lfTUFTSyk7CiB9CiAKIC8qKgpAQCAtNjc3LDE0ICs3MDQsMTQgQEAKIHsKIAlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwogCi0JY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgQ09NRURJX1NSRl9SVU5OSU5HLCAwKTsKKwljb21lZGlfdXBkYXRlX3N1YmRldmljZV9ydW5mbGFncyhzLCBDT01FRElfU1JGX1JVTk5JTkcsIDApOwogCWlmIChhc3luYykgewogCQljb21lZGlfYnVmX3Jlc2V0KHMpOwogCQlhc3luYy0+aW50dHJpZyA9IE5VTEw7CiAJCWtmcmVlKGFzeW5jLT5jbWQuY2hhbmxpc3QpOwogCQlhc3luYy0+Y21kLmNoYW5saXN0ID0gTlVMTDsKIAkJcy0+YnVzeSA9IE5VTEw7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJnMtPmFzeW5jLT53YWl0X2hlYWQpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZhc3luYy0+d2FpdF9oZWFkKTsKIAl9IGVsc2UgewogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJIkJVRzogKD8pIGRvX2JlY29tZV9ub25idXN5IGNhbGxlZCB3aXRoIGFzeW5jPU5VTExcbiIpOwpAQCAtNzU5LDcgKzc4Niw3IEBACiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKGFyZyA9PSBOVUxMKSB7CisJaWYgKCFhcmcpIHsKIAkJaWYgKGlzX2RldmljZV9idXN5KGRldikpCiAJCQlyZXR1cm4gLUVCVVNZOwogCQlpZiAoZGV2LT5hdHRhY2hlZCkgewpAQCAtMTY3OCw4ICsxNzA1LDggQEAKIAlpZiAoYXN5bmMtPmNtZC5mbGFncyAmIENNREZfV0FLRV9FT1MpCiAJCWFzeW5jLT5jYl9tYXNrIHw9IENPTUVESV9DQl9FT1M7CiAKLQljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCBDT01FRElfU1JGX0JVU1lfTUFTSywKLQkJCQkgICAgICBDT01FRElfU1JGX1JVTk5JTkcpOworCWNvbWVkaV91cGRhdGVfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIENPTUVESV9TUkZfQlVTWV9NQVNLLAorCQkJCQkgQ09NRURJX1NSRl9SVU5OSU5HKTsKIAogCS8qCiAJICogU2V0IHMtPmJ1c3kgX2FmdGVyXyBzZXR0aW5nIENPTUVESV9TUkZfUlVOTklORyBmbGFnIHRvIGF2b2lkCkBAIC0xODQwLDcgKzE4NjcsNyBAQAogCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCiAJCXJldHVybiAtRUlOVkFMOwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2FyZ107Ci0JaWYgKHMtPmFzeW5jID09IE5VTEwpCisJaWYgKCFzLT5hc3luYykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXMtPmJ1c3kpCkBAIC0yMjgyLDEzICsyMzA5LDE2IEBACiAJYWRkX3dhaXRfcXVldWUoJmFzeW5jLT53YWl0X2hlYWQsICZ3YWl0KTsKIAlvbl93YWl0X3F1ZXVlID0gdHJ1ZTsKIAl3aGlsZSAobmJ5dGVzID4gMCAmJiAhcmV0dmFsKSB7CisJCXVuc2lnbmVkIHJ1bmZsYWdzOworCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkJaWYgKCFjb21lZGlfaXNfc3ViZGV2aWNlX3J1bm5pbmcocykpIHsKKwkJcnVuZmxhZ3MgPSBjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKTsKKwkJaWYgKCFjb21lZGlfaXNfcnVuZmxhZ3NfcnVubmluZyhydW5mbGFncykpIHsKIAkJCWlmIChjb3VudCA9PSAwKSB7CiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKm5ld19zOwogCi0JCQkJaWYgKGNvbWVkaV9pc19zdWJkZXZpY2VfaW5fZXJyb3IocykpCisJCQkJaWYgKGNvbWVkaV9pc19ydW5mbGFnc19pbl9lcnJvcihydW5mbGFncykpCiAJCQkJCXJldHZhbCA9IC1FUElQRTsKIAkJCQllbHNlCiAJCQkJCXJldHZhbCA9IDA7CkBAIC0yNDM1LDggKzI0NjUsMTAgQEAKIAkJCW4gPSBtOwogCiAJCWlmIChuID09IDApIHsKLQkJCWlmICghY29tZWRpX2lzX3N1YmRldmljZV9ydW5uaW5nKHMpKSB7Ci0JCQkJaWYgKGNvbWVkaV9pc19zdWJkZXZpY2VfaW5fZXJyb3IocykpCisJCQl1bnNpZ25lZCBydW5mbGFncyA9IGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpOworCisJCQlpZiAoIWNvbWVkaV9pc19ydW5mbGFnc19ydW5uaW5nKHJ1bmZsYWdzKSkgeworCQkJCWlmIChjb21lZGlfaXNfcnVuZmxhZ3NfaW5fZXJyb3IocnVuZmxhZ3MpKQogCQkJCQlyZXR2YWwgPSAtRVBJUEU7CiAJCQkJZWxzZQogCQkJCQlyZXR2YWwgPSAwOwpAQCAtMjYzOCwzOSArMjY3MCwzOCBAQAogdm9pZCBjb21lZGlfZXZlbnQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKLQl1bnNpZ25lZCBydW5mbGFncyA9IDA7Ci0JdW5zaWduZWQgcnVuZmxhZ3NfbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGV2ZW50czsKKwlpbnQgc2lfY29kZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghY29tZWRpX2lzX3N1YmRldmljZV9ydW5uaW5nKHMpKQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCWV2ZW50cyA9IGFzeW5jLT5ldmVudHM7CisJYXN5bmMtPmV2ZW50cyA9IDA7CisJaWYgKCFfX2NvbWVkaV9pc19zdWJkZXZpY2VfcnVubmluZyhzKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOworCX0KIAotCWlmIChzLT5hc3luYy0+ZXZlbnRzICYgQ09NRURJX0NCX0NBTkNFTF9NQVNLKQotCQlydW5mbGFnc19tYXNrIHw9IENPTUVESV9TUkZfUlVOTklORzsKKwlpZiAoZXZlbnRzICYgQ09NRURJX0NCX0NBTkNFTF9NQVNLKQorCQlfX2NvbWVkaV9jbGVhcl9zdWJkZXZpY2VfcnVuZmxhZ3MocywgQ09NRURJX1NSRl9SVU5OSU5HKTsKIAogCS8qCi0JICogUmVtZW1iZXIgaWYgYW4gZXJyb3IgZXZlbnQgaGFzIG9jY3VycmVkLCBzbyBhbiBlcnJvcgotCSAqIGNhbiBiZSByZXR1cm5lZCB0aGUgbmV4dCB0aW1lIHRoZSB1c2VyIGRvZXMgYSByZWFkKCkuCisJICogUmVtZW1iZXIgaWYgYW4gZXJyb3IgZXZlbnQgaGFzIG9jY3VycmVkLCBzbyBhbiBlcnJvciBjYW4gYmUKKwkgKiByZXR1cm5lZCB0aGUgbmV4dCB0aW1lIHRoZSB1c2VyIGRvZXMgYSByZWFkKCkgb3Igd3JpdGUoKS4KIAkgKi8KLQlpZiAocy0+YXN5bmMtPmV2ZW50cyAmIENPTUVESV9DQl9FUlJPUl9NQVNLKSB7Ci0JCXJ1bmZsYWdzX21hc2sgfD0gQ09NRURJX1NSRl9FUlJPUjsKLQkJcnVuZmxhZ3MgfD0gQ09NRURJX1NSRl9FUlJPUjsKLQl9Ci0JaWYgKHJ1bmZsYWdzX21hc2spIHsKLQkJLyoKLQkJICogU2V0cyBDT01FRElfU1JGX0VSUk9SIGFuZCBDT01FRElfU1JGX1JVTk5JTkcgdG9nZXRoZXIKLQkJICogYXRvbWljYWxseS4KLQkJICovCi0JCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIHJ1bmZsYWdzX21hc2ssIHJ1bmZsYWdzKTsKKwlpZiAoZXZlbnRzICYgQ09NRURJX0NCX0VSUk9SX01BU0spCisJCV9fY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgQ09NRURJX1NSRl9FUlJPUik7CisKKwlpZiAoYXN5bmMtPmNiX21hc2sgJiBldmVudHMpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhc3luYy0+d2FpdF9oZWFkKTsKKwkJc2lfY29kZSA9IGFzeW5jLT5jbWQuZmxhZ3MgJiBDTURGX1dSSVRFID8gUE9MTF9PVVQgOiBQT0xMX0lOOwogCX0KIAotCWlmIChhc3luYy0+Y2JfbWFzayAmIHMtPmFzeW5jLT5ldmVudHMpIHsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhc3luYy0+d2FpdF9oZWFkKTsKLQkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfUkVBRCkKLQkJCWtpbGxfZmFzeW5jKCZkZXYtPmFzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7Ci0JCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKQotCQkJa2lsbF9mYXN5bmMoJmRldi0+YXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX09VVCk7Ci0JfQotCXMtPmFzeW5jLT5ldmVudHMgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJaWYgKHNpX2NvZGUpCisJCWtpbGxfZmFzeW5jKCZkZXYtPmFzeW5jX3F1ZXVlLCBTSUdJTywgc2lfY29kZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfZXZlbnQpOwogCkBAIC0yNjgyLDcgKzI3MTMsNyBAQAogCXVuc2lnbmVkIGk7CiAKIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKQorCWlmICghZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAljb21lZGlfZGV2aWNlX2luaXQoZGV2KTsKIAljb21lZGlfc2V0X2h3X2RldihkZXYsIGhhcmR3YXJlX2RldmljZSk7CkBAIC0yNjkwLDcgKzI3MjEsNyBAQAogCW11dGV4X2xvY2soJmNvbWVkaV9ib2FyZF9taW5vcl90YWJsZV9sb2NrKTsKIAlmb3IgKGkgPSBoYXJkd2FyZV9kZXZpY2UgPyBjb21lZGlfbnVtX2xlZ2FjeV9taW5vcnMgOiAwOwogCSAgICAgaSA8IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTOyArK2kpIHsKLQkJaWYgKGNvbWVkaV9ib2FyZF9taW5vcl90YWJsZVtpXSA9PSBOVUxMKSB7CisJCWlmICghY29tZWRpX2JvYXJkX21pbm9yX3RhYmxlW2ldKSB7CiAJCQljb21lZGlfYm9hcmRfbWlub3JfdGFibGVbaV0gPSBkZXY7CiAJCQlicmVhazsKIAkJfQpAQCAtMjcwMCw3ICsyNzMxLDggQEAKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAkJY29tZWRpX2RldmljZV9jbGVhbnVwKGRldik7CiAJCWNvbWVkaV9kZXZfcHV0KGRldik7Ci0JCXByX2VycigicmFuIG91dCBvZiBtaW5vciBudW1iZXJzIGZvciBib2FyZCBkZXZpY2UgZmlsZXNcbiIpOworCQlkZXZfZXJyKGhhcmR3YXJlX2RldmljZSwKKwkJCSJyYW4gb3V0IG9mIG1pbm9yIG51bWJlcnMgZm9yIGJvYXJkIGRldmljZSBmaWxlc1xuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CiAJfQogCWRldi0+bWlub3IgPSBpOwpAQCAtMjc0NiwxNCArMjc3OCwxNSBAQAogCiAJbXV0ZXhfbG9jaygmY29tZWRpX3N1YmRldmljZV9taW5vcl90YWJsZV9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9TVUJERVZJQ0VfTUlOT1JTOyArK2kpIHsKLQkJaWYgKGNvbWVkaV9zdWJkZXZpY2VfbWlub3JfdGFibGVbaV0gPT0gTlVMTCkgeworCQlpZiAoIWNvbWVkaV9zdWJkZXZpY2VfbWlub3JfdGFibGVbaV0pIHsKIAkJCWNvbWVkaV9zdWJkZXZpY2VfbWlub3JfdGFibGVbaV0gPSBzOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZjb21lZGlfc3ViZGV2aWNlX21pbm9yX3RhYmxlX2xvY2spOwogCWlmIChpID09IENPTUVESV9OVU1fU1VCREVWSUNFX01JTk9SUykgewotCQlwcl9lcnIoInJhbiBvdXQgb2YgbWlub3IgbnVtYmVycyBmb3Igc3ViZGV2aWNlIGZpbGVzXG4iKTsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKKwkJCSJyYW4gb3V0IG9mIG1pbm9yIG51bWJlcnMgZm9yIHN1YmRldmljZSBmaWxlc1xuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWkgKz0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7CkBAIC0yNzcxLDcgKzI4MDQsNyBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKHMgPT0gTlVMTCkKKwlpZiAoIXMpCiAJCXJldHVybjsKIAlpZiAocy0+bWlub3IgPCAwKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfaW50ZXJuYWwuaAppbmRleCBkNTc4MTdjLi4zYjkxODUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ludGVybmFsLmgKQEAgLTEsMTEgKzEsMjEgQEAKICNpZm5kZWYgX0NPTUVESV9JTlRFUk5BTF9ICiAjZGVmaW5lIF9DT01FRElfSU5URVJOQUxfSAogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKgogICogdmFyaW91cyBpbnRlcm5hbCBjb21lZGkgc3R1ZmYKICAqLworCitzdHJ1Y3QgY29tZWRpX2J1Zl9tYXA7CitzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZzsKK3N0cnVjdCBjb21lZGlfZGV2aWNlOworc3RydWN0IGNvbWVkaV9pbnNuOworc3RydWN0IGNvbWVkaV9yYW5nZWluZm87CitzdHJ1Y3QgY29tZWRpX3N1YmRldmljZTsKK3N0cnVjdCBkZXZpY2U7CisKIGludCBkb19yYW5nZWluZm9faW9jdGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJICAgICAgIHN0cnVjdCBjb21lZGlfcmFuZ2VpbmZvIF9fdXNlciAqYXJnKTsKIHN0cnVjdCBjb21lZGlfZGV2aWNlICpjb21lZGlfYWxsb2NfYm9hcmRfbWlub3Ioc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcGNpLmMKaW5kZXggNmJhNTljOS4uMDI3ZjBmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcGNpLmMKQEAgLTE3LDEwICsxNyw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgogCiAvKioKICAqIGNvbWVkaV90b19wY2lfZGV2KCkgLSBjb21lZGlfZGV2aWNlIHBvaW50ZXIgdG8gcGNpX2RldiBwb2ludGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA1Y2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcGNpLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIGNvbWVkaV9wY2kuaAorICogaGVhZGVyIGZpbGUgZm9yIENvbWVkaSBQQ0kgZHJpdmVycworICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9DT01FRElfUENJX0gKKyNkZWZpbmUgX0NPTUVESV9QQ0lfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKworLyoKKyAqIFBDSSBWZW5kb3IgSURzIG5vdCBpbiA8bGludXgvcGNpX2lkcy5oPgorICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfS09MVEVSCQkweDEwMDEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JQ1AJCTB4MTA0YworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RUCQkweDExMTYKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JT1RFQ0gJCTB4MTYxNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTlRFQwkJMHgxMjIxCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUlRECQkweDE0MzUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9IVU1VU09GVAkJMHgxODZjCisKK3N0cnVjdCBwY2lfZGV2ICpjb21lZGlfdG9fcGNpX2RldihzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKKworaW50IGNvbWVkaV9wY2lfZW5hYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOwordm9pZCBjb21lZGlfcGNpX2Rpc2FibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKik7Cit2b2lkIGNvbWVkaV9wY2lfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOworCitpbnQgY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3QgY29tZWRpX2RyaXZlciAqLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KTsKK3ZvaWQgY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKHN0cnVjdCBwY2lfZGV2ICopOworCitpbnQgY29tZWRpX3BjaV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGNvbWVkaV9kcml2ZXIgKiwgc3RydWN0IHBjaV9kcml2ZXIgKik7Cit2b2lkIGNvbWVkaV9wY2lfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGNvbWVkaV9kcml2ZXIgKiwgc3RydWN0IHBjaV9kcml2ZXIgKik7CisKKy8qKgorICogbW9kdWxlX2NvbWVkaV9wY2lfZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIHJlZ2lzdGVyaW5nIGEgY29tZWRpIFBDSSBkcml2ZXIKKyAqIEBfX2NvbWVkaV9kcml2ZXI6IGNvbWVkaV9kcml2ZXIgc3RydWN0CisgKiBAX19wY2lfZHJpdmVyOiBwY2lfZHJpdmVyIHN0cnVjdAorICoKKyAqIEhlbHBlciBtYWNybyBmb3IgY29tZWRpIFBDSSBkcml2ZXJzIHdoaWNoIGRvIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsCisgKiBpbiBtb2R1bGUgaW5pdC9leGl0LiBUaGlzIGVsaW1pbmF0ZXMgYSBsb3Qgb2YgYm9pbGVycGxhdGUuIEVhY2gKKyAqIG1vZHVsZSBtYXkgb25seSB1c2UgdGhpcyBtYWNybyBvbmNlLCBhbmQgY2FsbGluZyBpdCByZXBsYWNlcworICogbW9kdWxlX2luaXQoKSBhbmQgbW9kdWxlX2V4aXQoKQorICovCisjZGVmaW5lIG1vZHVsZV9jb21lZGlfcGNpX2RyaXZlcihfX2NvbWVkaV9kcml2ZXIsIF9fcGNpX2RyaXZlcikgXAorCW1vZHVsZV9kcml2ZXIoX19jb21lZGlfZHJpdmVyLCBjb21lZGlfcGNpX2RyaXZlcl9yZWdpc3RlciwgXAorCQkJY29tZWRpX3BjaV9kcml2ZXJfdW5yZWdpc3RlciwgJihfX3BjaV9kcml2ZXIpKQorCisjZW5kaWYgLyogX0NPTUVESV9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKaW5kZXggZTEzOGViMC4uZGZhYjVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCkBAIC0yNTYsNiArMjU2LDcgQEAKIHN0cnVjdCBjb21lZGlfZGV2aWNlIHsKIAlpbnQgdXNlX2NvdW50OwogCXN0cnVjdCBjb21lZGlfZHJpdmVyICpkcml2ZXI7CisJc3RydWN0IGNvbWVkaV84MjU0ICpwYWNlcjsKIAl2b2lkICpwcml2YXRlOwogCiAJc3RydWN0IGRldmljZSAqY2xhc3NfZGV2OwpAQCAtNDYzLDYgKzQ2NCw4NCBAQAogCXJldHVybiBuc2FtcGxlcyA8PCBjb21lZGlfc2FtcGxlX3NoaWZ0KHMpOwogfQogCisvKioKKyAqIGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygpIC0gdHJpdmlhbGx5IHZhbGlkYXRlIGEgY29tZWRpX2NtZCB0cmlnZ2VyIHNvdXJjZQorICogQHNyYzogcG9pbnRlciB0byB0aGUgdHJpZ2dlciBzb3VyY2UgdG8gdmFsaWRhdGUKKyAqIEBmbGFnczogYml0bWFzayBvZiB2YWxpZCBUUklHXyogZm9yIHRoZSB0cmlnZ2VyCisgKgorICogVGhpcyBpcyB1c2VkIGluICJzdGVwIDEiIG9mIHRoZSBkb19jbWR0ZXN0IGZ1bmN0aW9ucyBvZiBjb21lZGkgZHJpdmVycworICogdG8gdmFpbGRhdGUgdGhlIGNvbWVkaV9jbWQgdHJpZ2dlcnMuIFRoZSBtYXNrIG9mIHRoZSBAc3JjIGFnYWluc3QgdGhlCisgKiBAZmxhZ3MgYWxsb3dzIHRoZSB1c2Vyc3BhY2UgY29tZWRpbGliIHRvIHBhc3MgYWxsIHRoZSBjb21lZGlfY21kCisgKiB0cmlnZ2VycyBhcyBUUklHX0FOWSBhbmQgZ2V0IGJhY2sgYSBiaXRtYXNrIG9mIHRoZSB2YWxpZCB0cmlnZ2VyIHNvdXJjZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYyh1bnNpZ25lZCBpbnQgKnNyYywKKwkJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBvcmlnX3NyYyA9ICpzcmM7CisKKwkqc3JjID0gb3JpZ19zcmMgJiBmbGFnczsKKwlpZiAoKnNyYyA9PSBUUklHX0lOVkFMSUQgfHwgKnNyYyAhPSBvcmlnX3NyYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKCkgLSBtYWtlIHN1cmUgYSB0cmlnZ2VyIHNvdXJjZSBpcyB1bmlxdWUKKyAqIEBzcmM6IHRoZSB0cmlnZ2VyIHNvdXJjZSB0byBjaGVjaworICovCitzdGF0aWMgaW5saW5lIGludCBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUodW5zaWduZWQgaW50IHNyYykKK3sKKwkvKiB0aGlzIHRlc3QgaXMgdHJ1ZSBpZiBtb3JlIHRoYW4gb25lIF9zcmMgYml0IGlzIHNldCAqLworCWlmICgoc3JjICYgKHNyYyAtIDEpKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoKSAtIHRyaXZpYWxseSB2YWxpZGF0ZSBhIHRyaWdnZXIgYXJndW1lbnQKKyAqIEBhcmc6IHBvaW50ZXIgdG8gdGhlIHRyaWdnZXIgYXJnIHRvIHZhbGlkYXRlCisgKiBAdmFsOiB0aGUgdmFsdWUgdGhlIGFyZ3VtZW50IHNob3VsZCBiZQorICovCitzdGF0aWMgaW5saW5lIGludCBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXModW5zaWduZWQgaW50ICphcmcsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCB2YWwpCit7CisJaWYgKCphcmcgIT0gdmFsKSB7CisJCSphcmcgPSB2YWw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCkgLSB0cml2aWFsbHkgdmFsaWRhdGUgYSB0cmlnZ2VyIGFyZ3VtZW50CisgKiBAYXJnOiBwb2ludGVyIHRvIHRoZSB0cmlnZ2VyIGFyZyB0byB2YWxpZGF0ZQorICogQHZhbDogdGhlIG1pbmltdW0gdmFsdWUgdGhlIGFyZ3VtZW50IHNob3VsZCBiZQorICovCitzdGF0aWMgaW5saW5lIGludCBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKHVuc2lnbmVkIGludCAqYXJnLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZiAoKmFyZyA8IHZhbCkgeworCQkqYXJnID0gdmFsOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgpIC0gdHJpdmlhbGx5IHZhbGlkYXRlIGEgdHJpZ2dlciBhcmd1bWVudAorICogQGFyZzogcG9pbnRlciB0byB0aGUgdHJpZ2dlciBhcmcgdG8gdmFsaWRhdGUKKyAqIEB2YWw6IHRoZSBtYXhpbXVtIHZhbHVlIHRoZSBhcmd1bWVudCBzaG91bGQgYmUKKyAqLworc3RhdGljIGlubGluZSBpbnQgY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCh1bnNpZ25lZCBpbnQgKmFyZywKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB2YWwpCit7CisJaWYgKCphcmcgPiB2YWwpIHsKKwkJKmFyZyA9IHZhbDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCiAvKgogICogTXVzdCBzZXQgZGV2LT5od19kZXYgaWYgeW91IHdpc2ggdG8gZG1hIGRpcmVjdGx5IGludG8gY29tZWRpJ3MgYnVmZmVyLgogICogQWxzbyB1c2VmdWwgZm9yIHJldHJpZXZpbmcgYSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgaGFyZHdhcmUgZGV2aWNlIG9mCkBAIC01NTMsNDcgKzYzMiw0IEBACiAJbW9kdWxlX2RyaXZlcihfX2NvbWVkaV9kcml2ZXIsIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIsIFwKIAkJCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcikKIAotLyogY29tZWRpX3BjaS5jIC0gY29tZWRpIFBDSSBkcml2ZXIgc3BlY2lmaWMgZnVuY3Rpb25zICovCi0KLS8qCi0gKiBQQ0kgVmVuZG9yIElEcyBub3QgaW4gPGxpbnV4L3BjaV9pZHMuaD4KLSAqLwotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0tPTFRFUgkJMHgxMDAxCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfSUNQCQkweDEwNGMKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9EVAkJMHgxMTE2Ci0jZGVmaW5lIFBDSV9WRU5ET1JfSURfSU9URUNICQkweDE2MTYKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DT05URUMJCTB4MTIyMQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JURAkJMHgxNDM1Ci0jZGVmaW5lIFBDSV9WRU5ET1JfSURfSFVNVVNPRlQJCTB4MTg2YwotCi1zdHJ1Y3QgcGNpX2RldjsKLXN0cnVjdCBwY2lfZHJpdmVyOwotCi1zdHJ1Y3QgcGNpX2RldiAqY29tZWRpX3RvX3BjaV9kZXYoc3RydWN0IGNvbWVkaV9kZXZpY2UgKik7Ci0KLWludCBjb21lZGlfcGNpX2VuYWJsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKLXZvaWQgY29tZWRpX3BjaV9kaXNhYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOwotdm9pZCBjb21lZGlfcGNpX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKLQotaW50IGNvbWVkaV9wY2lfYXV0b19jb25maWcoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IGNvbWVkaV9kcml2ZXIgKiwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCk7Ci12b2lkIGNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqKTsKLQotaW50IGNvbWVkaV9wY2lfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBjb21lZGlfZHJpdmVyICosIHN0cnVjdCBwY2lfZHJpdmVyICopOwotdm9pZCBjb21lZGlfcGNpX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBjb21lZGlfZHJpdmVyICosIHN0cnVjdCBwY2lfZHJpdmVyICopOwotCi0vKioKLSAqIG1vZHVsZV9jb21lZGlfcGNpX2RyaXZlcigpIC0gSGVscGVyIG1hY3JvIGZvciByZWdpc3RlcmluZyBhIGNvbWVkaSBQQ0kgZHJpdmVyCi0gKiBAX19jb21lZGlfZHJpdmVyOiBjb21lZGlfZHJpdmVyIHN0cnVjdAotICogQF9fcGNpX2RyaXZlcjogcGNpX2RyaXZlciBzdHJ1Y3QKLSAqCi0gKiBIZWxwZXIgbWFjcm8gZm9yIGNvbWVkaSBQQ0kgZHJpdmVycyB3aGljaCBkbyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbAotICogaW4gbW9kdWxlIGluaXQvZXhpdC4gVGhpcyBlbGltaW5hdGVzIGEgbG90IG9mIGJvaWxlcnBsYXRlLiBFYWNoCi0gKiBtb2R1bGUgbWF5IG9ubHkgdXNlIHRoaXMgbWFjcm8gb25jZSwgYW5kIGNhbGxpbmcgaXQgcmVwbGFjZXMKLSAqIG1vZHVsZV9pbml0KCkgYW5kIG1vZHVsZV9leGl0KCkKLSAqLwotI2RlZmluZSBtb2R1bGVfY29tZWRpX3BjaV9kcml2ZXIoX19jb21lZGlfZHJpdmVyLCBfX3BjaV9kcml2ZXIpIFwKLQltb2R1bGVfZHJpdmVyKF9fY29tZWRpX2RyaXZlciwgY29tZWRpX3BjaV9kcml2ZXJfcmVnaXN0ZXIsIFwKLQkJCWNvbWVkaV9wY2lfZHJpdmVyX3VucmVnaXN0ZXIsICYoX19wY2lfZHJpdmVyKSkKLQogI2VuZGlmIC8qIF9DT01FRElERVZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwppbmRleCBmMzJlNzE0Li41N2RjZmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwpAQCAtNDYsNyArNDYsNyBAQAogewogCWlmIChod19kZXYgPT0gZGV2LT5od19kZXYpCiAJCXJldHVybiAwOwotCWlmIChkZXYtPmh3X2RldiAhPSBOVUxMKQorCWlmIChkZXYtPmh3X2RldikKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJZGV2LT5od19kZXYgPSBnZXRfZGV2aWNlKGh3X2Rldik7CiAJcmV0dXJuIDA7CkBAIC0xMzksNyArMTM5LDkgQEAKIAkJZGV2LT5uX3N1YmRldmljZXMgPSAwOwogCX0KIAlrZnJlZShkZXYtPnByaXZhdGUpOworCWtmcmVlKGRldi0+cGFjZXIpOwogCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisJZGV2LT5wYWNlciA9IE5VTEw7CiAJZGV2LT5kcml2ZXIgPSBOVUxMOwogCWRldi0+Ym9hcmRfbmFtZSA9IE5VTEw7CiAJZGV2LT5ib2FyZF9wdHIgPSBOVUxMOwpAQCAtODAwLDcgKzgwMiw3IEBACiAJCX0KIAkJbW9kdWxlX3B1dChkcml2LT5tb2R1bGUpOwogCX0KLQlpZiAoZHJpdiA9PSBOVUxMKSB7CisJaWYgKCFkcml2KSB7CiAJCS8qICByZWNvZ25pemUgaGFzIGZhaWxlZCBpZiB3ZSBnZXQgaGVyZSAqLwogCQkvKiAgcmVwb3J0IHZhbGlkIGJvYXJkIG5hbWVzIGJlZm9yZSByZXR1cm5pbmcgZXJyb3IgKi8KIAkJZm9yIChkcml2ID0gY29tZWRpX2RyaXZlcnM7IGRyaXY7IGRyaXYgPSBkcml2LT5uZXh0KSB7CkBAIC04MTIsNyArODE0LDcgQEAKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQotCWlmIChkcml2LT5hdHRhY2ggPT0gTlVMTCkgeworCWlmICghZHJpdi0+YXR0YWNoKSB7CiAJCS8qIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IG1hbnVhbCBjb25maWd1cmF0aW9uICovCiAJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAogCQkJICJkcml2ZXIgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGF0dGFjaCB1c2luZyBjb21lZGlfY29uZmlnXG4iLApAQCAtODk2LDcgKzg5OCw3IEBACiAKIHZvaWQgY29tZWRpX2F1dG9fdW5jb25maWcoc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlKQogewotCWlmIChoYXJkd2FyZV9kZXZpY2UgPT0gTlVMTCkKKwlpZiAoIWhhcmR3YXJlX2RldmljZSkKIAkJcmV0dXJuOwogCWNvbWVkaV9yZWxlYXNlX2hhcmR3YXJlX2RldmljZShoYXJkd2FyZV9kZXZpY2UpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjUzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjljOGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogY29tZWRpL2RyaXZlcnMvODI1My5oCi0gKiBIZWFkZXIgZmlsZSBmb3IgODI1MwotICoKLSAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfODI1M19ICi0jZGVmaW5lIF84MjUzX0gKLQotI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgotCi0vKgotICogQ29tbW9uIG9zY2lsbGF0b3IgYmFzZSB2YWx1ZXMgaW4gbmFub3NlY29uZHMKLSAqLwotI2RlZmluZSBJODI1NF9PU0NfQkFTRV8xME1IWgkJMTAwCi0jZGVmaW5lIEk4MjU0X09TQ19CQVNFXzVNSFoJCTIwMAotI2RlZmluZSBJODI1NF9PU0NfQkFTRV80TUhaCQkyNTAKLSNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfMk1IWgkJNTAwCi0jZGVmaW5lIEk4MjU0X09TQ19CQVNFXzFNSFoJCTEwMDAKLQotc3RhdGljIGlubGluZSB2b2lkIGk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoaW50IGk4MjUzX29zY19iYXNlLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCAqZDEsCi0JCQkJCSAgICAgdW5zaWduZWQgaW50ICpkMiwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKm5hbm9zZWMsCi0JCQkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXVuc2lnbmVkIGludCBkaXZpZGVyOwotCXVuc2lnbmVkIGludCBkaXYxLCBkaXYyOwotCXVuc2lnbmVkIGludCBkaXYxX2dsYiwgZGl2Ml9nbGIsIG5zX2dsYjsKLQl1bnNpZ25lZCBpbnQgZGl2MV9sdWIsIGRpdjJfbHViLCBuc19sdWI7Ci0JdW5zaWduZWQgaW50IG5zOwotCXVuc2lnbmVkIGludCBzdGFydDsKLQl1bnNpZ25lZCBpbnQgbnNfbG93LCBuc19oaWdoOwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X2NvdW50ID0gMHgxMDAwMDsKLQkvKgotCSAqIGV4aXQgZWFybHkgaWYgZXZlcnl0aGluZyBpcyBhbHJlYWR5IGNvcnJlY3QgKHRoaXMgY2FuIHNhdmUgdGltZQotCSAqIHNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCByZXBlYXRlZGx5IGR1cmluZyBjb21tYW5kIHRlc3RzCi0JICogYW5kIGV4ZWN1dGlvbikKLQkgKi8KLQlkaXYxID0gKmQxID8gKmQxIDogbWF4X2NvdW50OwotCWRpdjIgPSAqZDIgPyAqZDIgOiBtYXhfY291bnQ7Ci0JZGl2aWRlciA9IGRpdjEgKiBkaXYyOwotCWlmIChkaXYxICogZGl2MiAqIGk4MjUzX29zY19iYXNlID09ICpuYW5vc2VjICYmCi0JICAgIGRpdjEgPiAxICYmIGRpdjEgPD0gbWF4X2NvdW50ICYmIGRpdjIgPiAxICYmIGRpdjIgPD0gbWF4X2NvdW50ICYmCi0JICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotCSAgICBkaXZpZGVyID4gZGl2MSAmJiBkaXZpZGVyID4gZGl2MiAmJgotCSAgICBkaXZpZGVyICogaTgyNTNfb3NjX2Jhc2UgPiBkaXZpZGVyICYmCi0JICAgIGRpdmlkZXIgKiBpODI1M19vc2NfYmFzZSA+IGk4MjUzX29zY19iYXNlKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlkaXZpZGVyID0gKm5hbm9zZWMgLyBpODI1M19vc2NfYmFzZTsKLQotCWRpdjFfbHViID0gZGl2Ml9sdWIgPSAwOwotCWRpdjFfZ2xiID0gZGl2Ml9nbGIgPSAwOwotCi0JbnNfZ2xiID0gMDsKLQluc19sdWIgPSAweGZmZmZmZmZmOwotCi0JZGl2MiA9IG1heF9jb3VudDsKLQlzdGFydCA9IGRpdmlkZXIgLyBkaXYyOwotCWlmIChzdGFydCA8IDIpCi0JCXN0YXJ0ID0gMjsKLQlmb3IgKGRpdjEgPSBzdGFydDsgZGl2MSA8PSBkaXZpZGVyIC8gZGl2MSArIDEgJiYgZGl2MSA8PSBtYXhfY291bnQ7Ci0JICAgICBkaXYxKyspIHsKLQkJZm9yIChkaXYyID0gZGl2aWRlciAvIGRpdjE7Ci0JCSAgICAgZGl2MSAqIGRpdjIgPD0gZGl2aWRlciArIGRpdjEgKyAxICYmIGRpdjIgPD0gbWF4X2NvdW50OwotCQkgICAgIGRpdjIrKykgewotCQkJbnMgPSBpODI1M19vc2NfYmFzZSAqIGRpdjEgKiBkaXYyOwotCQkJaWYgKG5zIDw9ICpuYW5vc2VjICYmIG5zID4gbnNfZ2xiKSB7Ci0JCQkJbnNfZ2xiID0gbnM7Ci0JCQkJZGl2MV9nbGIgPSBkaXYxOwotCQkJCWRpdjJfZ2xiID0gZGl2MjsKLQkJCX0KLQkJCWlmIChucyA+PSAqbmFub3NlYyAmJiBucyA8IG5zX2x1YikgewotCQkJCW5zX2x1YiA9IG5zOwotCQkJCWRpdjFfbHViID0gZGl2MTsKLQkJCQlkaXYyX2x1YiA9IGRpdjI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKGZsYWdzICYgQ01ERl9ST1VORF9NQVNLKSB7Ci0JY2FzZSBDTURGX1JPVU5EX05FQVJFU1Q6Ci0JZGVmYXVsdDoKLQkJbnNfaGlnaCA9IGRpdjFfbHViICogZGl2Ml9sdWIgKiBpODI1M19vc2NfYmFzZTsKLQkJbnNfbG93ID0gZGl2MV9nbGIgKiBkaXYyX2dsYiAqIGk4MjUzX29zY19iYXNlOwotCQlpZiAobnNfaGlnaCAtICpuYW5vc2VjIDwgKm5hbm9zZWMgLSBuc19sb3cpIHsKLQkJCWRpdjEgPSBkaXYxX2x1YjsKLQkJCWRpdjIgPSBkaXYyX2x1YjsKLQkJfSBlbHNlIHsKLQkJCWRpdjEgPSBkaXYxX2dsYjsKLQkJCWRpdjIgPSBkaXYyX2dsYjsKLQkJfQotCQlicmVhazsKLQljYXNlIENNREZfUk9VTkRfVVA6Ci0JCWRpdjEgPSBkaXYxX2x1YjsKLQkJZGl2MiA9IGRpdjJfbHViOwotCQlicmVhazsKLQljYXNlIENNREZfUk9VTkRfRE9XTjoKLQkJZGl2MSA9IGRpdjFfZ2xiOwotCQlkaXYyID0gZGl2Ml9nbGI7Ci0JCWJyZWFrOwotCX0KLQotCSpuYW5vc2VjID0gZGl2MSAqIGRpdjIgKiBpODI1M19vc2NfYmFzZTsKLQkvKiBtYXNraW5nIGlzIGRvbmUgc2luY2UgY291bnRlciBtYXBzIHplcm8gdG8gMHgxMDAwMCAqLwotCSpkMSA9IGRpdjEgJiAweGZmZmY7Ci0JKmQyID0gZGl2MiAmIDB4ZmZmZjsKLX0KLQotI2lmbmRlZiBDTURURVNUCi0vKgotICogaTgyNTRfbG9hZCBwcm9ncmFtcyA4MjU0IGNvdW50ZXIgY2hpcC4gIEl0IHNob3VsZCBhbHNvIHdvcmsgZm9yIHRoZSA4MjUzLgotICogYmFzZV9hZGRyZXNzIGlzIHRoZSBsb3dlc3QgaW8gYWRkcmVzcwotICogZm9yIHRoZSBjaGlwICh0aGUgYWRkcmVzcyBvZiBjb3VudGVyIDApLgotICogY291bnRlcl9udW1iZXIgaXMgdGhlIGNvdW50ZXIgeW91IHdhbnQgdG8gbG9hZCAoMCwxIG9yIDIpCi0gKiBjb3VudCBpcyB0aGUgbnVtYmVyIHRvIGxvYWQgaW50byB0aGUgY291bnRlci4KLSAqCi0gKiBZb3UgcHJvYmFibHkgd2FudCB0byB1c2UgbW9kZSAyLgotICoKLSAqIFVzZSBpODI1NF9tbV9sb2FkKCkgaWYgeW91IGJvYXJkIHVzZXMgbWVtb3J5LW1hcHBlZCBpbywgaXQgaXMKLSAqIHRoZSBzYW1lIGFzIGk4MjU0X2xvYWQoKSBleGNlcHQgaXQgdXNlcyB3cml0ZWIoKSBpbnN0ZWFkIG9mIG91dGIoKS4KLSAqCi0gKiBOZWl0aGVyIGk4MjU0X2xvYWQoKSBvciBpODI1NF9yZWFkKCkgZG8gdGhlaXIgbG9hZGluZy9yZWFkaW5nCi0gKiBhdG9taWNhbGx5LiAgVGhlIDE2IGJpdCByZWFkL3dyaXRlcyBhcmUgcGVyZm9ybWVkIHdpdGggdHdvIHN1Y2Nlc3NpdmUKLSAqIDggYml0IHJlYWQvd3JpdGVzLiAgU28gaWYgdHdvIHBhcnRzIG9mIHlvdXIgZHJpdmVyIGRvIGEgbG9hZC9yZWFkIG9uCi0gKiB0aGUgc2FtZSBjb3VudGVyLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHByb3RlY3QgdGhlc2UgZnVuY3Rpb25zCi0gKiB3aXRoIGEgc3BpbmxvY2suCi0gKgotICogRk1ICi0gKi8KLQotI2RlZmluZSBpODI1NF9jb250cm9sX3JlZwkzCi0KLXN0YXRpYyBpbmxpbmUgaW50IGk4MjU0X2xvYWQodW5zaWduZWQgbG9uZyBiYXNlX2FkZHJlc3MsIHVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50ZXJfbnVtYmVyLCB1bnNpZ25lZCBpbnQgY291bnQsCi0JCQkgICAgIHVuc2lnbmVkIGludCBtb2RlKQotewotCXVuc2lnbmVkIGludCBieXRlOwotCi0JaWYgKGNvdW50ZXJfbnVtYmVyID4gMikKLQkJcmV0dXJuIC0xOwotCWlmIChjb3VudCA+IDB4ZmZmZikKLQkJcmV0dXJuIC0xOwotCWlmIChtb2RlID4gNSkKLQkJcmV0dXJuIC0xOwotCWlmICgobW9kZSA9PSAyIHx8IG1vZGUgPT0gMykgJiYgY291bnQgPT0gMSkKLQkJcmV0dXJuIC0xOwotCi0JYnl0ZSA9IGNvdW50ZXJfbnVtYmVyIDw8IDY7Ci0JYnl0ZSB8PSAweDMwOwkJLyogbG9hZCBsb3cgdGhlbiBoaWdoIGJ5dGUgKi8KLQlieXRlIHw9IChtb2RlIDw8IDEpOwkvKiBzZXQgY291bnRlciBtb2RlICovCi0Jb3V0YihieXRlLCBiYXNlX2FkZHJlc3MgKyAoaTgyNTRfY29udHJvbF9yZWcgPDwgcmVnc2hpZnQpKTsKLQlieXRlID0gY291bnQgJiAweGZmOwkvKiBsc2Igb2YgY291bnRlciB2YWx1ZSAqLwotCW91dGIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSk7Ci0JYnl0ZSA9IChjb3VudCA+PiA4KSAmIDB4ZmY7CS8qIG1zYiBvZiBjb3VudGVyIHZhbHVlICovCi0Jb3V0YihieXRlLCBiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpODI1NF9tbV9sb2FkKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAotCQkJCXVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCQl1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIsCi0JCQkJdW5zaWduZWQgaW50IGNvdW50LAotCQkJCXVuc2lnbmVkIGludCBtb2RlKQotewotCXVuc2lnbmVkIGludCBieXRlOwotCi0JaWYgKGNvdW50ZXJfbnVtYmVyID4gMikKLQkJcmV0dXJuIC0xOwotCWlmIChjb3VudCA+IDB4ZmZmZikKLQkJcmV0dXJuIC0xOwotCWlmIChtb2RlID4gNSkKLQkJcmV0dXJuIC0xOwotCWlmICgobW9kZSA9PSAyIHx8IG1vZGUgPT0gMykgJiYgY291bnQgPT0gMSkKLQkJcmV0dXJuIC0xOwotCi0JYnl0ZSA9IGNvdW50ZXJfbnVtYmVyIDw8IDY7Ci0JYnl0ZSB8PSAweDMwOwkJLyogbG9hZCBsb3cgdGhlbiBoaWdoIGJ5dGUgKi8KLQlieXRlIHw9IChtb2RlIDw8IDEpOwkvKiBzZXQgY291bnRlciBtb2RlICovCi0Jd3JpdGViKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChpODI1NF9jb250cm9sX3JlZyA8PCByZWdzaGlmdCkpOwotCWJ5dGUgPSBjb3VudCAmIDB4ZmY7CS8qIGxzYiBvZiBjb3VudGVyIHZhbHVlICovCi0Jd3JpdGViKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotCWJ5dGUgPSAoY291bnQgPj4gOCkgJiAweGZmOwkvKiBtc2Igb2YgY291bnRlciB2YWx1ZSAqLwotCXdyaXRlYihieXRlLCBiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIDE2IGJpdCBjb3VudGVyIHZhbHVlLCBzaG91bGQgd29yayBmb3IgODI1MyBhbHNvLiAqLwotc3RhdGljIGlubGluZSBpbnQgaTgyNTRfcmVhZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkcmVzcywgdW5zaWduZWQgaW50IHJlZ3NoaWZ0LAotCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0JaW50IHJldDsKLQotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQotCS8qIGxhdGNoIGNvdW50ZXIgKi8KLQlieXRlID0gY291bnRlcl9udW1iZXIgPDwgNjsKLQlvdXRiKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChpODI1NF9jb250cm9sX3JlZyA8PCByZWdzaGlmdCkpOwotCi0JLyogcmVhZCBsc2IgKi8KLQlyZXQgPSBpbmIoYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSk7Ci0JLyogcmVhZCBtc2IgKi8KLQlyZXQgKz0gaW5iKGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpIDw8IDg7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpODI1NF9tbV9yZWFkKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAotCQkJCXVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCQl1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0JaW50IHJldDsKLQotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQotCS8qIGxhdGNoIGNvdW50ZXIgKi8KLQlieXRlID0gY291bnRlcl9udW1iZXIgPDwgNjsKLQl3cml0ZWIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGk4MjU0X2NvbnRyb2xfcmVnIDw8IHJlZ3NoaWZ0KSk7Ci0KLQkvKiByZWFkIGxzYiAqLwotCXJldCA9IHJlYWRiKGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotCS8qIHJlYWQgbXNiICovCi0JcmV0ICs9IHJlYWRiKGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpIDw8IDg7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBMb2FkcyAxNiBiaXQgaW5pdGlhbCBjb3VudGVyIHZhbHVlLCBzaG91bGQgd29yayBmb3IgODI1MyBhbHNvLiAqLwotc3RhdGljIGlubGluZSB2b2lkIGk4MjU0X3dyaXRlKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgYnl0ZTsKLQotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybjsKLQotCWJ5dGUgPSBjb3VudCAmIDB4ZmY7CS8qIGxzYiBvZiBjb3VudGVyIHZhbHVlICovCi0Jb3V0YihieXRlLCBiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLQlieXRlID0gKGNvdW50ID4+IDgpICYgMHhmZjsJLyogbXNiIG9mIGNvdW50ZXIgdmFsdWUgKi8KLQlvdXRiKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaTgyNTRfbW1fd3JpdGUodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCi0JCQkJICB1bnNpZ25lZCBpbnQgcmVnc2hpZnQsCi0JCQkJICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIsCi0JCQkJICB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0KLQlpZiAoY291bnRlcl9udW1iZXIgPiAyKQotCQlyZXR1cm47Ci0KLQlieXRlID0gY291bnQgJiAweGZmOwkvKiBsc2Igb2YgY291bnRlciB2YWx1ZSAqLwotCXdyaXRlYihieXRlLCBiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLQlieXRlID0gKGNvdW50ID4+IDgpICYgMHhmZjsJLyogbXNiIG9mIGNvdW50ZXIgdmFsdWUgKi8KLQl3cml0ZWIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSk7Ci19Ci0KLS8qCi0gKiBTZXQgY291bnRlciBtb2RlLCBzaG91bGQgd29yayBmb3IgODI1MyBhbHNvLgotICogTm90ZTogdGhlICdtb2RlJyB2YWx1ZSBpcyBkaWZmZXJlbnQgdG8gdGhhdCBmb3IgaTgyNTRfbG9hZCgpIGFuZCBjb21lcwotICogZnJvbSB0aGUgSU5TTl9DT05GSUdfODI1NF9TRVRfTU9ERSBjb21tYW5kOgotICogICBJODI1NF9NT0RFMCwgSTgyNTRfTU9ERTEsIC4uLiwgSTgyNTRfTU9ERTUKLSAqIE9SJ2VkIHdpdGg6Ci0gKiAgIEk4MjU0X0JDRCwgSTgyNTRfQklOQVJZCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGk4MjU0X3NldF9tb2RlKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzLAotCQkJCSB1bnNpZ25lZCBpbnQgcmVnc2hpZnQsCi0JCQkJIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0KLQlpZiAoY291bnRlcl9udW1iZXIgPiAyKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG1vZGUgPiAoSTgyNTRfTU9ERTUgfCBJODI1NF9CQ0QpKQotCQlyZXR1cm4gLTE7Ci0KLQlieXRlID0gY291bnRlcl9udW1iZXIgPDwgNjsKLQlieXRlIHw9IDB4MzA7CQkvKiBsb2FkIGxvdyB0aGVuIGhpZ2ggYnl0ZSAqLwotCWJ5dGUgfD0gbW9kZTsJCS8qIHNldCBjb3VudGVyIG1vZGUgYW5kIEJDRHxiaW5hcnkgKi8KLQlvdXRiKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChpODI1NF9jb250cm9sX3JlZyA8PCByZWdzaGlmdCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGk4MjU0X21tX3NldF9tb2RlKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnc2hpZnQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCQkgICAgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0KLQlpZiAoY291bnRlcl9udW1iZXIgPiAyKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG1vZGUgPiAoSTgyNTRfTU9ERTUgfCBJODI1NF9CQ0QpKQotCQlyZXR1cm4gLTE7Ci0KLQlieXRlID0gY291bnRlcl9udW1iZXIgPDwgNjsKLQlieXRlIHw9IDB4MzA7CQkvKiBsb2FkIGxvdyB0aGVuIGhpZ2ggYnl0ZSAqLwotCWJ5dGUgfD0gbW9kZTsJCS8qIHNldCBjb3VudGVyIG1vZGUgYW5kIEJDRHxiaW5hcnkgKi8KLQl3cml0ZWIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGk4MjU0X2NvbnRyb2xfcmVnIDw8IHJlZ3NoaWZ0KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaTgyNTRfc3RhdHVzKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIpCi17Ci0Jb3V0YigweEUwIHwgKDIgPDwgY291bnRlcl9udW1iZXIpLAotCSAgICAgYmFzZV9hZGRyZXNzICsgKGk4MjU0X2NvbnRyb2xfcmVnIDw8IHJlZ3NoaWZ0KSk7Ci0JcmV0dXJuIGluYihiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaTgyNTRfbW1fc3RhdHVzKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLAotCQkJCSAgdW5zaWduZWQgaW50IHJlZ3NoaWZ0LAotCQkJCSAgdW5zaWduZWQgaW50IGNvdW50ZXJfbnVtYmVyKQotewotCXdyaXRlYigweEUwIHwgKDIgPDwgY291bnRlcl9udW1iZXIpLAotCSAgICAgICBiYXNlX2FkZHJlc3MgKyAoaTgyNTRfY29udHJvbF9yZWcgPDwgcmVnc2hpZnQpKTsKLQlyZXR1cm4gcmVhZGIoYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSk7Ci19Ci0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NS5jCmluZGV4IGMyZjE1ZGUuLmJhODkzMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYwpAQCAtNTEsNyArNTEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiODI1NS5oIgogCiBzdHJ1Y3Qgc3ViZGV2XzgyNTVfcHJpdmF0ZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NV9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jCmluZGV4IDk4NDc2NDIuLmJiOTg1NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jCkBAIC02Miw5ICs2Miw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAiODI1NS5oIgogCkBAIC0xNzgsNyArMTc3LDcgQEAKIAl9LAogfTsKIAotLyogcmlwcGVkIGZyb20gbWl0ZS5oIGFuZCBtaXRlX3NldHVwMigpIHRvIGF2b2lkIG1pdGUgZGVwZW5kYW5jeSAqLworLyogcmlwcGVkIGZyb20gbWl0ZS5oIGFuZCBtaXRlX3NldHVwMigpIHRvIGF2b2lkIG1pdGUgZGVwZW5kZW5jeSAqLwogI2RlZmluZSBNSVRFX0lPRFdCU1IJMHhjMAkgLyogSU8gRGV2aWNlIFdpbmRvdyBCYXNlIFNpemUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgV0VOQUIJCSgxIDw8IDcpIC8qIHdpbmRvdyBlbmFibGUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDdkMWZiZDUuLmQ2ZDgzNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiBjY2ZsYWdzLSQoQ09ORklHX0NPTUVESV9ERUJVRykJCTo9IC1EREVCVUcKIAogIyBDb21lZGkgImhlbHBlciIgbW9kdWxlcworb2JqLSQoQ09ORklHX0NPTUVESV84MjU0KQkJKz0gY29tZWRpXzgyNTQubwogb2JqLSQoQ09ORklHX0NPTUVESV9JU0FETUEpCQkrPSBjb21lZGlfaXNhZG1hLm8KIAogIyBDb21lZGkgbWlzYyBkcml2ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzEwMzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTAzMi5jCmluZGV4IDQ5MTFiNjIuLmIzNzE2NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTAzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTAzMi5jCkBAIC03MSwxMSArNzEsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKICNpbmNsdWRlICJhbWNjX3M1OTMzLmgiCiAKIC8qCkBAIC0xOTYsMTEgKzE5NCwxMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwpAQCAtMjEwLDExICsyMDgsMTIgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0yMzgsNyArMjM3LDcgQEAKIAogCWlmICghZGV2cHJpdi0+Y3RybCkgewogCQlkZXZfd2FybihkZXYtPmNsYXNzX2RldiwKLQkJCSJJbnRlcnJ1cHRzIGRpc2FibGVkIGR1ZSB0byBtb2RlIGNvbmZpZ3VyYXRpb24hXG4iKTsKKwkJCSAiSW50ZXJydXB0cyBkaXNhYmxlZCBkdWUgdG8gbW9kZSBjb25maWd1cmF0aW9uIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjk2LDcgKzI5NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYXBjaTEwMzJfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJCXVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGFwY2kxMDMyX3ByaXZhdGUgKmRldnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCmluZGV4IGYxNWFhMWYuLjYzOTkxYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jCkBAIC0yMiwxMSArMjIsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKICNpbmNsdWRlICJhbWNjX3M1OTMzLmgiCiAjaW5jbHVkZSAiejg1MzYuaCIKIApAQCAtMjQ5LDggKzI0Nyw4IEBACiAJICoKIAkgKiAgICBNYXNrICAgICBNZWFuaW5nCiAJICogLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogMHgwMDAwMDAwMSAgRXZlbnQgMSBoYXMgb2NjdXJlZAotCSAqIDB4MDAwMDAwMTAgIEV2ZW50IDIgaGFzIG9jY3VyZWQKKwkgKiAweDAwMDAwMDAxICBFdmVudCAxIGhhcyBvY2N1cnJlZAorCSAqIDB4MDAwMDAwMTAgIEV2ZW50IDIgaGFzIG9jY3VycmVkCiAJICogMHgwMDAwMDEwMCAgQ291bnRlci90aW1lciAxIGhhcyBydW4gZG93biAobm90IGltcGxlbWVudGVkKQogCSAqIDB4MDAwMDEwMDAgIENvdW50ZXIvdGltZXIgMiBoYXMgcnVuIGRvd24gKG5vdCBpbXBsZW1lbnRlZCkKIAkgKiAweDAwMDEwMDAwICBDb3VudGVyIDMgaGFzIHJ1biBkb3duIChub3QgaW1wbGVtZW50ZWQpCkBAIC0zODYsMTEgKzM4NCwxMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwpAQCAtNDE1LDEyICs0MTMsMTMgQEAKIAkgKiAgIDMJT1IgbW9kZSBmb3IgUG9ydCBBIChkaWdpdGFsIGlucHV0cyAwLTcpCiAJICoJT1IgbW9kZSBmb3IgUG9ydCBCIChkaWdpdGFsIGlucHV0cyA4LTEzIGFuZCBpbnRlcm5hbCBzaWduYWxzKQogCSAqLwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0YXJ0X2FyZywgMyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c3RhcnRfYXJnLCAzKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNTE0LDExICs1MTMsMTEgQEAKIAogCQlzcmMgPSBwdCAmIDB4ZmY7CiAJCWlmIChzcmMpCi0JCQlyZXQgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKHNyYyk7CisJCQlyZXQgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKHNyYyk7CiAKIAkJc3JjID0gKHB0ID4+IDgpICYgMHhmZjsKIAkJaWYgKHNyYykKLQkJCXJldCB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoc3JjKTsKKwkJCXJldCB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoc3JjKTsKIAogCQlpZiAocmV0KSB7CiAJCQlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MTYuYwppbmRleCBkODQxMDQxLi45YzUxNmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MTYuYwpAQCAtMjMsMTEgKzIzLDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAjaW5jbHVkZSAiYWRkaV93YXRjaGRvZy5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCiAvKgogICogUENJIGJhciAxIEkvTyBSZWdpc3RlciBtYXAgLSBEaWdpdGFsIGlucHV0L291dHB1dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYwppbmRleCA2ODcyYjY5Li4zM2U1OGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYwpAQCAtMjIsMTIgKzIyLDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAjaW5jbHVkZSAiYWRkaV90Y3cuaCIKICNpbmNsdWRlICJhZGRpX3dhdGNoZG9nLmgiCiAKQEAgLTEwNywxMiArMTA1LDEyIEBACiAjZGVmaW5lIEFQQ0kxNTY0X0NPVU5URVIoeCkJCQkoKHgpICogMHgyMCkKIAogc3RydWN0IGFwY2kxNTY0X3ByaXZhdGUgewotCXVuc2lnbmVkIGxvbmcgZWVwcm9tOwkJLyogYmFzZSBhZGRyZXNzIG9mIEVFUFJPTSByZWdpc3RlciAqLwotCXVuc2lnbmVkIGxvbmcgdGltZXI7CQkvKiBiYXNlIGFkZHJlc3Mgb2YgMTItYml0IHRpbWVyICovCi0JdW5zaWduZWQgbG9uZyBjb3VudGVyczsJCS8qIGJhc2UgYWRkcmVzcyBvZiAzMi1iaXQgY291bnRlcnMgKi8KLQl1bnNpZ25lZCBpbnQgbW9kZTE7CQkvKiByaWRpbmctZWRnZS9oaWdoIGxldmVsIGNoYW5uZWxzICovCi0JdW5zaWduZWQgaW50IG1vZGUyOwkJLyogZmFsbGluZy1lZGdlL2xvdyBsZXZlbCBjaGFubmVscyAqLwotCXVuc2lnbmVkIGludCBjdHJsOwkJLyogaW50ZXJydXB0IG1vZGUgT1IgKGVkZ2UpIC4gQU5EIChsZXZlbCkgKi8KKwl1bnNpZ25lZCBsb25nIGVlcHJvbTsJLyogYmFzZSBhZGRyZXNzIG9mIEVFUFJPTSByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgdGltZXI7CS8qIGJhc2UgYWRkcmVzcyBvZiAxMi1iaXQgdGltZXIgKi8KKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOwkvKiBiYXNlIGFkZHJlc3Mgb2YgMzItYml0IGNvdW50ZXJzICovCisJdW5zaWduZWQgaW50IG1vZGUxOwkvKiByaWRpbmctZWRnZS9oaWdoIGxldmVsIGNoYW5uZWxzICovCisJdW5zaWduZWQgaW50IG1vZGUyOwkvKiBmYWxsaW5nLWVkZ2UvbG93IGxldmVsIGNoYW5uZWxzICovCisJdW5zaWduZWQgaW50IGN0cmw7CS8qIGludGVycnVwdCBtb2RlIE9SIChlZGdlKSAuIEFORCAobGV2ZWwpICovCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2tfY3VycmVudDsKIH07CiAKQEAgLTM2NSwxMSArMzYzLDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC0zNzksMTEgKzM3NywxMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTQwNyw3ICs0MDYsNyBAQAogCiAJaWYgKCFkZXZwcml2LT5jdHJsKSB7CiAJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAotCQkJIkludGVycnVwdHMgZGlzYWJsZWQgZHVlIHRvIG1vZGUgY29uZmlndXJhdGlvbiFcbiIpOworCQkJICJJbnRlcnJ1cHRzIGRpc2FibGVkIGR1ZSB0byBtb2RlIGNvbmZpZ3VyYXRpb24hXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MzAsNyArNDI5LDcgQEAKIH0KIAogc3RhdGljIGludCBhcGNpMTU2NF9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCisJCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgYXBjaTE1NjRfcHJpdmF0ZSAqZGV2cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTZ4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNnh4LmMKaW5kZXggYTEyNDhkYS4uYzYzMTMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNnh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNnh4LmMKQEAgLTIzLDkgKzIzLDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKIC8qCiAgKiBSZWdpc3RlciBJL08gbWFwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzIwMzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAzMi5jCmluZGV4IGVlYmY0ZjEuLmFkNzE1MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAzMi5jCkBAIC0yMywxMyArMjMsMTEgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogI2luY2x1ZGUgImFkZGlfd2F0Y2hkb2cuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAogLyoKICAqIFBDSSBiYXIgMSBJL08gUmVnaXN0ZXIgbWFwCkBAIC05MywxNyArOTEsMTcgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0xMTIsMTQgKzExMCwxNSBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzIyMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjIwMC5jCmluZGV4IDFmOWQxMzYuLjJiMzgyYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjIwMC5jCkBAIC0yMyw5ICsyMyw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogI2luY2x1ZGUgImFkZGlfd2F0Y2hkb2cuaCIKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzEyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMKaW5kZXggYzY1Zjk0MC4uOTVkYzY0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMKQEAgLTIyLDExICsyMiw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogI2luY2x1ZGUgImFtY2NfczU5MzMuaCIKIAogLyoKQEAgLTYxMiwyMSArNjEwLDIxIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19USU1FUiB8IFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTYzNSwyMSArNjMzLDI0IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikJLyogVGVzdCBEZWxheSB0aW1pbmcgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDEwMDAwMCk7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewkvKiBUZXN0IERlbGF5IHRpbWluZyAqLworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICAxMDAwMDApOworCX0KIAogCS8qIG1pbmltdW0gY29udmVyc2lvbiB0aW1lIHBlciBzYW1wbGUgaXMgMTB1cyAqLwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qICBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC02NTksNyArNjYwLDcgQEAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCS8qIHNjYW4gYmVnaW4gbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgc2NhbiB0aW1lICovCiAJCWFyZyA9IGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jCmluZGV4IDU5NjFmMTkuLjczNzg2YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jCkBAIC0yMywxMiArMjMsMTAgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKICNpbmNsdWRlICJhbWNjX3M1OTMzLmgiCiAKIC8qCkBAIC0yMDMsNyArMjAxLDcgQEAKIAkJb3V0YihOVkNNRF9MT0FEX0hJR0gsIGlvYmFzZSArIEFNQ0NfT1BfUkVHX01DU1JfTlZDTUQpOwogCQlhcGNpMzUwMV9lZXByb21fd2FpdChpb2Jhc2UpOwogCQlvdXRiKCgoYWRkciArIGkpID4+IDgpICYgMHhmZiwKLQkJCWlvYmFzZSArIEFNQ0NfT1BfUkVHX01DU1JfTlZEQVRBKTsKKwkJICAgICBpb2Jhc2UgKyBBTUNDX09QX1JFR19NQ1NSX05WREFUQSk7CiAJCWFwY2kzNTAxX2VlcHJvbV93YWl0KGlvYmFzZSk7CiAKIAkJLyogUmVhZCB0aGUgZWVwcm9tIGRhdGEgYnl0ZSAqLwpAQCAtMjcwLDcgKzI2OCw3IEBACiAKIAkvKiAgRGlzYWJsZSBJbnRlcnJ1cHQgKi8KIAl1bF9Db21tYW5kMSA9IGlubChkZXYtPmlvYmFzZSArIEFQQ0kzNTAxX1RJTUVSX0NUUkxfUkVHKTsKLQl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkR1bCk7CisJdWxfQ29tbWFuZDEgPSB1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkR1bDsKIAlvdXRsKHVsX0NvbW1hbmQxLCBkZXYtPmlvYmFzZSArIEFQQ0kzNTAxX1RJTUVSX0NUUkxfUkVHKTsKIAogCXVpX1RpbWVyX0FPV2F0Y2hkb2cgPSBpbmwoZGV2LT5pb2Jhc2UgKyBBUENJMzUwMV9USU1FUl9JUlFfUkVHKSAmIDB4MTsKQEAgLTI4Miw3ICsyODAsNyBAQAogCS8qIEVuYWJsZSBJbnRlcnJ1cHQgU2VuZCBhIHNpZ25hbCB0byBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlICovCiAJc2VuZF9zaWcoU0lHSU8sIGRldnByaXYtPnRza19DdXJyZW50LCAwKTsKIAl1bF9Db21tYW5kMSA9IGlubChkZXYtPmlvYmFzZSArIEFQQ0kzNTAxX1RJTUVSX0NUUkxfUkVHKTsKLQl1bF9Db21tYW5kMSA9ICgodWxfQ29tbWFuZDEgJiAweEZGRkZGOUZEdWwpIHwgMSA8PCAxKTsKKwl1bF9Db21tYW5kMSA9ICh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkR1bCkgfCAxIDw8IDE7CiAJb3V0bCh1bF9Db21tYW5kMSwgZGV2LT5pb2Jhc2UgKyBBUENJMzUwMV9USU1FUl9DVFJMX1JFRyk7CiAJaW5sKGRldi0+aW9iYXNlICsgQVBDSTM1MDFfVElNRVJfU1RBVFVTX1JFRyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfM3h4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKaW5kZXggYzE3MzgxMC4uYmVmNmVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMKQEAgLTIzLDEyICsyMyw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0KLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNkZWZpbmUgQ09OVl9VTklUX05TCQkoMSA8PCAwKQogI2RlZmluZSBDT05WX1VOSVRfVVMJCSgxIDw8IDEpCkBAIC01MjksMTggKzUyNiwxOCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTU0OSwxNiArNTQ2LDE3IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCSBib2FyZC0+YWlfbWluX2FjcV9ucyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCSAgICBib2FyZC0+YWlfbWluX2FjcV9ucyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNTY3LDcgKzU2NSw3IEBACiAKIAlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwogCWVyciB8PSBhcGNpM3h4eF9haV9uc190b190aW1lcihkZXYsICZhcmcsIGNtZC0+ZmxhZ3MpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiA0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfd2F0Y2hkb2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX3dhdGNoZG9nLmMKaW5kZXggYzViMDgyZC4uOWQ5ODUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV93YXRjaGRvZy5jCkBAIC01NCw3ICs1NCw3IEBACiAKIAkJLyogVGltZSBiYXNlIGlzIDIwbXMsIGxldCB0aGUgdXNlciBrbm93IHRoZSB0aW1lb3V0ICovCiAJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAid2F0Y2hkb2cgZW5hYmxlZCwgdGltZW91dDolZG1zXG4iLAotCQkJMjAgKiByZWxvYWQgKyAyMCk7CisJCQkgMjAgKiByZWxvYWQgKyAyMCk7CiAJCWJyZWFrOwogCWNhc2UgSU5TTl9DT05GSUdfRElTQVJNOgogCQlzcHJpdi0+d2RvZ19jdHJsID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMKaW5kZXggYTNlYTRiNy4uN2VkM2ZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMKQEAgLTE5LDE5ICsxOSwyMiBAQAogLyoKICAqIERyaXZlcjogYWRsX3BjaTYyMDgKICAqIERlc2NyaXB0aW9uOiBBRExpbmsgUENJLTYyMDgvNjIxNiBTZXJpZXMgTXVsdGktY2hhbm5lbCBBbmFsb2cgT3V0cHV0IENhcmRzCi0gKiBEZXZpY2VzOiBbQURMaW5rXSBQQ0ktNjIwOCAoYWRsX3BjaTYyMDgpLCBQQ0ktNjIxNiAoYWRsX3BjaTYyMTYpCisgKiBEZXZpY2VzOiBbQURMaW5rXSBQQ0ktNjIwOCAoYWRsX3BjaTYyMDgpLCBQQ0ktNjIxNgogICogQXV0aG9yOiBuc3llb3cgPG5zeWVvd0BwZC5qYXJpbmcubXk+Ci0gKiBVcGRhdGVkOiBGcmksIDMwIEphbiAyMDA0IDE0OjQ0OjI3ICswODAwCisgKiBVcGRhdGVkOiBXZWQsIDExIEZlYiAyMDE1IDExOjM3OjE4ICswMDAwCiAgKiBTdGF0dXM6IHVudGVzdGVkCiAgKgogICogQ29uZmlndXJhdGlvbiBPcHRpb25zOiBub3QgYXBwbGljYWJsZSwgdXNlcyBQQ0kgYXV0byBjb25maWcKKyAqCisgKiBBbGwgc3VwcG9ydGVkIGRldmljZXMgc2hhcmUgdGhlIHNhbWUgUENJIGRldmljZSBJRCBhbmQgYXJlIHRyZWF0ZWQgYXMgYQorICogUENJLTYyMTYgd2l0aCAxNiBhbmFsb2cgb3V0cHV0IGNoYW5uZWxzLiAgT24gYSBQQ0ktNjIwOCwgdGhlIHVwcGVyIDgKKyAqIGNoYW5uZWxzIGV4aXN0IGluIHJlZ2lzdGVycywgYnV0IGRvbid0IGdvIHRvIERBQyBjaGlwcy4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyoKICAqIFBDSS02MjA4LzYyMTYtR0wgcmVnaXN0ZXIgbWFwCkBAIC00NSwyNyArNDgsNiBAQAogI2RlZmluZSBQQ0k2MjA4X0RJT19ESV9NQVNLCQkoMHhmMCkKICNkZWZpbmUgUENJNjIwOF9ESU9fRElfU0hJRlQJCSg0KQogCi1lbnVtIHBjaTYyMDhfYm9hcmRpZCB7Ci0JQk9BUkRfUENJNjIwOCwKLQlCT0FSRF9QQ0k2MjE2LAotfTsKLQotc3RydWN0IHBjaTYyMDhfYm9hcmQgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IGFvX2NoYW5zOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2k2MjA4X2JvYXJkIHBjaTYyMDhfYm9hcmRzW10gPSB7Ci0JW0JPQVJEX1BDSTYyMDhdID0gewotCQkubmFtZQkJPSAiYWRsX3BjaTYyMDgiLAotCQkuYW9fY2hhbnMJPSA4LAotCX0sCi0JW0JPQVJEX1BDSTYyMTZdID0gewotCQkubmFtZQkJPSAiYWRsX3BjaTYyMTYiLAotCQkuYW9fY2hhbnMJPSAxNiwKLQl9LAotfTsKLQogc3RhdGljIGludCBwY2k2MjA4X2FvX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtMTM2LDIxICsxMTgsMTMgQEAKIH0KIAogc3RhdGljIGludCBwY2k2MjA4X2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KQorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7Ci0JY29uc3Qgc3RydWN0IHBjaTYyMDhfYm9hcmQgKmJvYXJkaW5mbyA9IE5VTEw7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJdW5zaWduZWQgaW50IHZhbDsKIAlpbnQgcmV0OwogCi0JaWYgKGNvbnRleHQgPCBBUlJBWV9TSVpFKHBjaTYyMDhfYm9hcmRzKSkKLQkJYm9hcmRpbmZvID0gJnBjaTYyMDhfYm9hcmRzW2NvbnRleHRdOwotCWlmICghYm9hcmRpbmZvKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlkZXYtPmJvYXJkX3B0ciA9IGJvYXJkaW5mbzsKLQlkZXYtPmJvYXJkX25hbWUgPSBib2FyZGluZm8tPm5hbWU7Ci0KIAlyZXQgPSBjb21lZGlfcGNpX2VuYWJsZShkZXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC0xNjQsNyArMTM4LDcgQEAKIAkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLwogCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQU87CiAJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOwotCXMtPm5fY2hhbgk9IGJvYXJkaW5mby0+YW9fY2hhbnM7CisJcy0+bl9jaGFuCT0gMTY7CS8qIE9ubHkgOCB1c2FibGUgb24gUENJLTYyMDggKi8KIAlzLT5tYXhkYXRhCT0gMHhmZmZmOwogCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2JpcG9sYXIxMDsKIAlzLT5pbnNuX3dyaXRlCT0gcGNpNjIwOF9hb19pbnNuX3dyaXRlOwpAQCAtMjE3LDggKzE5MSw5IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZGxfcGNpNjIwOF9wY2lfdGFibGVbXSA9IHsKLQl7IFBDSV9WREVWSUNFKEFETElOSywgMHg2MjA4KSwgQk9BUkRfUENJNjIwOCB9LAotCXsgUENJX1ZERVZJQ0UoQURMSU5LLCAweDYyMTYpLCBCT0FSRF9QQ0k2MjE2IH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQURMSU5LLCAweDYyMDgpIH0sCisJeyBQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfOTA1MCwKKwkJCSAweDk5OTksIDB4NjIwOCkgfSwKIAl7IDAgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZGxfcGNpNjIwOF9wY2lfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3eDN4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTd4M3guYwppbmRleCA2MThlNjQxLi45MzRhZjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTd4M3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTd4M3guYwpAQCAtNTMsOSArNTMsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyoKICAqIFJlZ2lzdGVyIEkvTyBtYXAgKDMyLWJpdCBhY2Nlc3Mgb25seSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKaW5kZXggY2M2YzUzYi4uZGE5MDFjOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jCkBAIC0yOCw5ICsyOCw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2RlZmluZSBQQ0k4MTY0X0FYSVMoeCkJCSgoeCkgKiAweDA4KQogI2RlZmluZSBQQ0k4MTY0X0NNRF9NU1RTX1JFRwkweDAwCkBAIC02OSw3ICs2OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRsX3BjaTgxNjRfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJCSAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCmluZGV4IGY2OGRjOTkuLmM5ZGYzYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jCkBAIC02NSwxNSArNjUsMTMgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiODI1My5oIgogI2luY2x1ZGUgInBseDkwNTIuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAjZGVmaW5lIFBDSTkxMTFfRklGT19IQUxGX1NJWkUJNTEyCiAKQEAgLTEzNyw5ICsxMzUsNiBAQAogCXVuc2lnbmVkIGludCBjaHVua19jb3VudGVyOwogCXVuc2lnbmVkIGludCBjaHVua19udW1fc2FtcGxlczsKIAotCXVuc2lnbmVkIGludCBkaXYxOwotCXVuc2lnbmVkIGludCBkaXYyOwotCiAJdW5zaWduZWQgc2hvcnQgYWlfYm91bmNlX2J1ZmZlclsyICogUENJOTExMV9GSUZPX0hBTEZfU0laRV07CiB9OwogCkBAIC0xNjcsMjEgKzE2Miw2IEBACiAJb3V0YihmbGFncywgaW9fYmFzZSArIFBMWDkwNTJfSU5UQ1NSKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpOTExMV90aW1lcl9zZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpOTExMV9wcml2YXRlX2RhdGEgKmRldl9wcml2YXRlID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENJOTExMV84MjU0X0JBU0VfUkVHOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMSwgMCwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDEsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAxLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0KLQl1ZGVsYXkoMSk7Ci0KLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAxLCAyLCBkZXZfcHJpdmF0ZS0+ZGl2Mik7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMSwgMSwgZGV2X3ByaXZhdGUtPmRpdjEpOwotfQotCiBlbnVtIHBjaTkxMTFfSVNDMF9zb3VyY2VzIHsKIAlpcnFfb25fZW9jLAogCWlycV9vbl9maWZvX2hhbGZfZnVsbApAQCAtMjgxLDE5ICsyNjEsMTggQEAKIAkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgcGNpOTExMV9wcml2YXRlX2RhdGEgKmRldl9wcml2YXRlID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19GT0xMT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAogCQkJCQlUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCkBAIC0zMDEsOSArMjgwLDkgQEAKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTMxNywyNiArMjk2LDI5IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKIAkJCQkJUENJOTExMV9BSV9BQ1FVSVNJVElPTl9QRVJJT0RfTUlOX05TKTsKLQllbHNlCS8qIFRSSUdfRVhUICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCX0gZWxzZSB7CS8qIFRSSUdfRVhUICovCisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCX0KIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCiAJCQkJCVBDSTkxMTFfQUlfQUNRVUlTSVRJT05fUEVSSU9EX01JTl9OUyk7Ci0JZWxzZQkvKiBUUklHX0ZPTExPVyB8fCBUUklHX0VYVCAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwl9IGVsc2UgewkvKiBUUklHX0ZPTExPVyB8fCBUUklHX0VYVCAqLworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTM0NSwxMSArMzI3LDggQEAKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8yTUhaLAotCQkJCQkgICZkZXZfcHJpdmF0ZS0+ZGl2MSwKLQkJCQkJICAmZGV2X3ByaXZhdGUtPmRpdjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAJfQogCiAJLyoKQEAgLTM2Miw3ICszNDEsNyBAQAogCQlpZiAoYXJnIDwgY21kLT5zY2FuX2JlZ2luX2FyZykKIAkJCWFyZyAqPSAoY21kLT5zY2FuX2JlZ2luX2FyZyAvIGFyZyk7CiAKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtMzc2LDcgKzM1NSw2IEBACiAJCXJldHVybiA1OwogCiAJcmV0dXJuIDA7Ci0KIH0KIAogc3RhdGljIGludCBwY2k5MTExX2FpX2RvX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNDAwLDEzICszNzgsMTQgQEAKIAkvKiAgVGhpcyBpcyB0aGUgc2FtZSBnYWluIG9uIGV2ZXJ5IGNoYW5uZWwgKi8KIAogCW91dGIoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFswXSkgJiBQQ0k5MTExX0FJX1JBTkdFX01BU0ssCi0JCWRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7CisJICAgICBkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfUkFOR0VfU1RBVF9SRUcpOwogCiAJLyogIFNldCB0aW1lciBwYWNlciAqLwogCWRldl9wcml2YXRlLT5zY2FuX2RlbGF5ID0gMDsKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXRyaWcgfD0gUENJOTExMV9BSV9UUklHX0NUUkxfVFBTVDsKLQkJcGNpOTExMV90aW1lcl9zZXQoZGV2KTsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldi0+cGFjZXIpOworCQljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgdHJ1ZSk7CiAJCXBjaTkxMTFfZmlmb19yZXNldChkZXYpOwogCQlwY2k5MTExX2ludGVycnVwdF9zb3VyY2Vfc2V0KGRldiwgaXJxX29uX2ZpZm9faGFsZl9mdWxsLAogCQkJCQkgICAgIGlycV9vbl90aW1lcl90aWNrKTsKQEAgLTU5Myw3ICs1NzIsNyBAQAogCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfUkFOR0VfU1RBVF9SRUcpOwogCWlmICgoc3RhdHVzICYgUENJOTExMV9BSV9SQU5HRV9NQVNLKSAhPSByYW5nZSkgewogCQlvdXRiKHJhbmdlICYgUENJOTExMV9BSV9SQU5HRV9NQVNLLAotCQkJZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0FJX1JBTkdFX1NUQVRfUkVHKTsKKwkJICAgICBkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfUkFOR0VfU1RBVF9SRUcpOwogCX0KIAogCXBjaTkxMTFfZmlmb19yZXNldChkZXYpOwpAQCAtNjY3LDE2ICs2NDYsMTEgQEAKIAkvKiBkaXNhYmxlIEEvRCB0cmlnZ2VycyAoc29mdHdhcmUgdHJpZ2dlciBtb2RlKSBhbmQgYXV0byBzY2FuIG9mZiAqLwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0FJX1RSSUdfQ1RSTF9SRUcpOwogCi0JLyogUmVzZXQgODI1NCBjaGlwICovCi0JZGV2X3ByaXZhdGUtPmRpdjEgPSAwOwotCWRldl9wcml2YXRlLT5kaXYyID0gMDsKLQlwY2k5MTExX3RpbWVyX3NldChkZXYpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGNpOTExMV9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBwY2k5MTExX3ByaXZhdGVfZGF0YSAqZGV2X3ByaXZhdGU7CkBAIC03MDIsNiArNjc2LDExIEBACiAJCQlkZXYtPmlycSA9IHBjaWRldi0+aXJxOwogCX0KIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgUENJOTExMV84MjU0X0JBU0VfUkVHLAorCQkJCSAgICAgIEk4MjU0X09TQ19CQVNFXzJNSFosIEk4MjU0X0lPMTYsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCmluZGV4IGY2MWUzOTIuLmZiMzA0M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCkBAIC03MywxNyArNzMsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAiYW1jY19zNTkzMy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAjZGVmaW5lIElPUkFOR0VfOTExOAk2NAkvKiBJIGhvcGUgKi8KICNkZWZpbmUgUENJOTExOF9DSEFOTEVOCTI1NQkvKgpAQCAtOTQsOCArOTIsNyBAQAogLyoKICAqIFBDSSBCQVIyIFJlZ2lzdGVyIG1hcCAoZGV2LT5pb2Jhc2UpCiAgKi8KLSNkZWZpbmUgUENJOTExOF9USU1FUl9SRUcoeCkJCSgweDAwICsgKCh4KSAqIDQpKQotI2RlZmluZSBQQ0k5MTE4X1RJTUVSX0NUUkxfUkVHCQkweDBjCisjZGVmaW5lIFBDSTkxMThfVElNRVJfQkFTRQkJMHgwMAogI2RlZmluZSBQQ0k5MTE4X0FJX0ZJRk9fUkVHCQkweDEwCiAjZGVmaW5lIFBDSTkxMThfQU9fUkVHKHgpCQkoMHgxMCArICgoeCkgKiA0KSkKICNkZWZpbmUgUENJOTExOF9BSV9TVEFUVVNfUkVHCQkweDE4CkBAIC0yMzksMTAgKzIzNiw2IEBACiAJCQkJCSAqIG1lYXN1cmUgY2FuIHN0YXJ0L3N0b3AKIAkJCQkJICogb24gZXh0ZXJuYWwgdHJpZ2dlcgogCQkJCQkgKi8KLQl1bnNpZ25lZCBpbnQgYWlfZGl2aXNvcjEsIGFpX2Rpdmlzb3IyOwkvKgotCQkJCQkJICogZGl2aXNvcnMgZm9yIHN0YXJ0IG9mIG1lYXN1cmUKLQkJCQkJCSAqIG9uIGV4dGVybmFsIHN0YXJ0Ci0JCQkJCQkgKi8KIAl1bnNpZ25lZCBpbnQgZG1hX2FjdGJ1ZjsJCS8qIHdoaWNoIGJ1ZmZlciBpcyB1c2VkIG5vdyAqLwogCXN0cnVjdCBwY2k5MTE4X2RtYWJ1ZiBkbWFidWZbMl07CiAJaW50IHNvZnRzc2hkZWxheTsJCS8qCkBAIC0yOTcsMjQgKzI5MCw2IEBACiAJb3V0bChpbnRjc3IsIGRldnByaXYtPmlvYmFzZV9hICsgQU1DQ19PUF9SRUdfSU5UQ1NSKTsKIH0KIAotc3RhdGljIHZvaWQgcGNpOTExOF90aW1lcl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXVuc2lnbmVkIGludCB0aW1lciwgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlvdXRsKHZhbCAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENJOTExOF9USU1FUl9SRUcodGltZXIpKTsKLQlvdXRsKCh2YWwgPj4gOCkgJiAweGZmLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfVElNRVJfUkVHKHRpbWVyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaTkxMThfdGltZXJfc2V0X21vZGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgdGltZXIsIHVuc2lnbmVkIGludCBtb2RlKQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQl2YWwgPSB0aW1lciA8PCA2OwkvKiBzZWxlY3QgdGltZXIgKi8KLQl2YWwgfD0gMHgzMDsJCS8qIGxvYWQgbG93IHRoZW4gaGlnaCBieXRlICovCi0JdmFsIHw9IG1vZGU7CQkvKiBzZXQgdGltZXIgbW9kZSBhbmQgQkNEfGJpbmFyeSAqLwotCW91dGwodmFsLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfVElNRVJfQ1RSTF9SRUcpOwotfQotCiBzdGF0aWMgdm9pZCBwY2k5MTE4X2FpX3Jlc2V0X2ZpZm8oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAkvKiB3cml0aW5nIGFueSB2YWx1ZSByZXNldHMgdGhlIEEvRCBGSUZPICovCkBAIC00NDAsOCArNDE1LDggQEAKIAlkZXZwcml2LT5haV9jZmcgPSBQQ0k5MTE4X0FJX0NGR19QRFRSRyB8IFBDSTkxMThfQUlfQ0ZHX1BFVFJHIHwKIAkJCSAgUENJOTExOF9BSV9DRkdfQU07CiAJb3V0bChkZXZwcml2LT5haV9jZmcsIGRldi0+aW9iYXNlICsgUENJOTExOF9BSV9DRkdfUkVHKTsKLQlwY2k5MTE4X3RpbWVyX3NldF9tb2RlKGRldiwgMCwgSTgyNTRfTU9ERTApOwotCXBjaTkxMThfdGltZXJfd3JpdGUoZGV2LCAwLCBkbWFidWYtPmh3ID4+IDEpOworCWNvbWVkaV84MjU0X2xvYWQoZGV2LT5wYWNlciwgMCwgZG1hYnVmLT5odyA+PiAxLAorCQkJIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAlkZXZwcml2LT5haV9jZmcgfD0gUENJOTExOF9BSV9DRkdfU1RBUlQ7CiAJb3V0bChkZXZwcml2LT5haV9jZmcsIGRldi0+aW9iYXNlICsgUENJOTExOF9BSV9DRkdfUkVHKTsKIH0KQEAgLTU3NywxNSArNTUyLDE2IEBACiAJCQkJICB1bnNpZ25lZCBpbnQgKmRpdjEsIHVuc2lnbmVkIGludCAqZGl2MiwKIAkJCQkgIHVuc2lnbmVkIGludCBjaG5zc2hmcm9udCkKIHsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKnBhY2VyID0gZGV2LT5wYWNlcjsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CiAKLQkqZGl2MSA9ICp0aW0yIC8gSTgyNTRfT1NDX0JBU0VfNE1IWjsJLyogY29udmVydCB0aW1lciAoYnVyc3QpICovCi0JKmRpdjIgPSAqdGltMSAvIEk4MjU0X09TQ19CQVNFXzRNSFo7CS8qIHNjYW4gdGltZXIgKi8KKwkqZGl2MSA9ICp0aW0yIC8gcGFjZXItPm9zY19iYXNlOwkvKiBjb252ZXJ0IHRpbWVyIChidXJzdCkgKi8KKwkqZGl2MiA9ICp0aW0xIC8gcGFjZXItPm9zY19iYXNlOwkvKiBzY2FuIHRpbWVyICovCiAJKmRpdjIgPSAqZGl2MiAvICpkaXYxOwkJCS8qIG1ham9yIHRpbWVyIGlzIGMxKmMyICovCiAJaWYgKCpkaXYyIDwgY2hhbnMpCiAJCSpkaXYyID0gY2hhbnM7CiAKLQkqdGltMiA9ICpkaXYxICogSTgyNTRfT1NDX0JBU0VfNE1IWjsJLyogcmVhbCBjb252ZXJ0IHRpbWVyICovCisJKnRpbTIgPSAqZGl2MSAqIHBhY2VyLT5vc2NfYmFzZTsJLyogcmVhbCBjb252ZXJ0IHRpbWVyICovCiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX05PVyAmJiAhY2huc3NoZnJvbnQpIHsKIAkJLyogdXNlIEJTU0ggc2lnbmFsICovCkBAIC01OTMsMjEgKzU2OSwxMyBAQAogCQkJKmRpdjIgPSBjaGFucyArIDI7CiAJfQogCi0JKnRpbTEgPSAqZGl2MSAqICpkaXYyICogSTgyNTRfT1NDX0JBU0VfNE1IWjsKKwkqdGltMSA9ICpkaXYxICogKmRpdjIgKiBwYWNlci0+b3NjX2Jhc2U7CiB9CiAKIHN0YXRpYyB2b2lkIHBjaTkxMThfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IG1vZGUpCiB7Ci0Jc3RydWN0IHBjaTkxMThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQotCXBjaTkxMThfdGltZXJfc2V0X21vZGUoZGV2LCAxLCBJODI1NF9NT0RFMik7Ci0JcGNpOTExOF90aW1lcl9zZXRfbW9kZShkZXYsIDIsIEk4MjU0X01PREUyKTsKLQl1ZGVsYXkoMSk7Ci0KLQlpZiAoKG1vZGUgPT0gMSkgfHwgKG1vZGUgPT0gMikgfHwgKG1vZGUgPT0gNCkpIHsKLQkJcGNpOTExOF90aW1lcl93cml0ZShkZXYsIDIsIGRldnByaXYtPmFpX2Rpdmlzb3IyKTsKLQkJcGNpOTExOF90aW1lcl93cml0ZShkZXYsIDEsIGRldnByaXYtPmFpX2Rpdmlzb3IxKTsKLQl9CisJaWYgKG1vZGUgPT0gMSB8fCBtb2RlID09IDIgfHwgbW9kZSA9PSA0KQorCQljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBpbnQgcGNpOTExOF9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTYxOCw3ICs1ODYsNyBAQAogCWlmIChkZXZwcml2LT51c2VkbWEpCiAJCXBjaTkxMThfYW1jY19kbWFfZW5hKGRldiwgZmFsc2UpOwogCXBjaTkxMThfZXh0dHJnX2VuYWJsZShkZXYsIGZhbHNlKTsKLQlwY2k5MTE4X3N0YXJ0X3BhY2VyKGRldiwgMCk7CS8qIHN0b3AgODI1NCBjb3VudGVycyAqLworCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCBmYWxzZSk7CiAJLyogc2V0IGRlZmF1bHQgY29uZmlnIChkaXNhYmxlIGJ1cnN0IGFuZCB0cmlnZ2VycykgKi8KIAlkZXZwcml2LT5haV9jZmcgPSBQQ0k5MTE4X0FJX0NGR19QRFRSRyB8IFBDSTkxMThfQUlfQ0ZHX1BFVFJHOwogCW91dGwoZGV2cHJpdi0+YWlfY2ZnLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfQUlfQ0ZHX1JFRyk7CkBAIC02NjMsNyArNjMxLDYgQEAKIAkJCWFycmF5W2ldIF49IDB4ODAwMDsKIAkJZWxzZQogCQkJYXJyYXlbaV0gPSAoYXJyYXlbaV0gPj4gNCkgJiAweDBmZmY7Ci0KIAl9CiB9CiAKQEAgLTk2Niw3ICs5MzMsNyBAQAogLyogb3V0bCgweDAyMDAwMDAwfEFJTlRfV1JJVEVfQ09NUEwsIGRldnByaXYtPmlvYmFzZV9hK0FNQ0NfT1BfUkVHX0lOVENTUik7ICovCiAJcGNpOTExOF9hbWNjX2RtYV9lbmEoZGV2LCB0cnVlKTsKIAlvdXRsKGlubChkZXZwcml2LT5pb2Jhc2VfYSArIEFNQ0NfT1BfUkVHX0lOVENTUikgfCBFTl9BMlBfVFJBTlNGRVJTLAotCQkJZGV2cHJpdi0+aW9iYXNlX2EgKyBBTUNDX09QX1JFR19JTlRDU1IpOworCSAgICAgZGV2cHJpdi0+aW9iYXNlX2EgKyBBTUNDX09QX1JFR19JTlRDU1IpOwogCQkJCQkJLyogYWxsb3cgYnVzIG1hc3RlcmluZyAqLwogCiAJcmV0dXJuIDA7CkBAIC05NzUsNiArOTQyLDcgQEAKIHN0YXRpYyBpbnQgcGNpOTExOF9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjaTkxMThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKnBhY2VyID0gZGV2LT5wYWNlcjsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CiAJdW5zaWduZWQgaW50IGFkZGNoYW5zID0gMDsKIApAQCAtMTA5MywxMiArMTA2MSwxMCBAQAogCQllbHNlCiAJCQlkZXZwcml2LT5haV9kbyA9IDE7CiAKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV80TUhaLAotCQkJCQkgICZkZXZwcml2LT5haV9kaXZpc29yMSwKLQkJCQkJICAmZGV2cHJpdi0+YWlfZGl2aXNvcjIsCi0JCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCSAgZGV2cHJpdi0+YWlfZmxhZ3MgJgotCQkJCQkgIENNREZfUk9VTkRfTkVBUkVTVCk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIocGFjZXIsICZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJZGV2cHJpdi0+YWlfZmxhZ3MgJgorCQkJCQkJQ01ERl9ST1VORF9ORUFSRVNUKTsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKHBhY2VyKTsKIAogCQlkZXZwcml2LT5haV9jdHJsIHw9IFBDSTkxMThfQUlfQ1RSTF9UTVJUUjsKIApAQCAtMTExMiw4ICsxMDc4LDggQEAKIAogCQkJZGV2cHJpdi0+YWlfY2ZnIHw9IFBDSTkxMThfQUlfQ0ZHX0FNOwogCQkJb3V0bChkZXZwcml2LT5haV9jZmcsIGRldi0+aW9iYXNlICsgUENJOTExOF9BSV9DRkdfUkVHKTsKLQkJCXBjaTkxMThfdGltZXJfc2V0X21vZGUoZGV2LCAwLCBJODI1NF9NT0RFMCk7Ci0JCQlwY2k5MTE4X3RpbWVyX3dyaXRlKGRldiwgMCwgZG1hYnVmLT5odyA+PiAxKTsKKwkJCWNvbWVkaV84MjU0X2xvYWQocGFjZXIsIDAsIGRtYWJ1Zi0+aHcgPj4gMSwKKwkJCQkJIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAkJCWRldnByaXYtPmFpX2NmZyB8PSBQQ0k5MTE4X0FJX0NGR19TVEFSVDsKIAkJfQogCX0KQEAgLTExMzMsOCArMTA5OSw4IEBACiAJCQkJICAgICAgJmNtZC0+c2Nhbl9iZWdpbl9hcmcsICZjbWQtPmNvbnZlcnRfYXJnLAogCQkJCSAgICAgIGRldnByaXYtPmFpX2ZsYWdzLAogCQkJCSAgICAgIGRldnByaXYtPmFpX25fcmVhbHNjYW5sZW4sCi0JCQkJICAgICAgJmRldnByaXYtPmFpX2Rpdmlzb3IxLAotCQkJCSAgICAgICZkZXZwcml2LT5haV9kaXZpc29yMiwKKwkJCQkgICAgICAmcGFjZXItPmRpdmlzb3IxLAorCQkJCSAgICAgICZwYWNlci0+ZGl2aXNvcjIsCiAJCQkJICAgICAgZGV2cHJpdi0+YWlfYWRkX2Zyb250KTsKIAogCQlkZXZwcml2LT5haV9jdHJsIHw9IFBDSTkxMThfQUlfQ1RSTF9UTVJUUjsKQEAgLTExNjIsOCArMTEyOCw2IEBACiAJaWYgKGRldnByaXYtPnVzZWRtYSkKIAkJZGV2cHJpdi0+YWlfY3RybCB8PSBQQ0k5MTE4X0FJX0NUUkxfRE1BOwogCi0JcGNpOTExOF9zdGFydF9wYWNlcihkZXYsIC0xKTsJLyogc3RvcCBwYWNlciAqLwotCiAJLyogc2V0IGRlZmF1bHQgY29uZmlnIChkaXNhYmxlIGJ1cnN0IGFuZCB0cmlnZ2VycykgKi8KIAlkZXZwcml2LT5haV9jZmcgPSBQQ0k5MTE4X0FJX0NGR19QRFRSRyB8IFBDSTkxMThfQUlfQ0ZHX1BFVFJHOwogCW91dGwoZGV2cHJpdi0+YWlfY2ZnLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfQUlfQ0ZHX1JFRyk7CkBAIC0xMjA2LDI1ICsxMTcwLDI0IEBACiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCXVuc2lnbmVkIGludCBhcmc7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsCiAJCQkJCVRSSUdfTk9XIHwgVFJJR19FWFQgfCBUUklHX0lOVCk7CiAKIAlmbGFncyA9IFRSSUdfRk9MTE9XOwogCWlmIChkZXZwcml2LT5tYXN0ZXIpCiAJCWZsYWdzIHw9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBmbGFncyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgZmxhZ3MpOwogCiAJZmxhZ3MgPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CiAJaWYgKGRldnByaXYtPm1hc3RlcikKIAkJZmxhZ3MgfD0gVFJJR19OT1c7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgZmxhZ3MpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIGZsYWdzKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAogCQkJCQlUUklHX0NPVU5UIHwgVFJJR19OT05FIHwgVFJJR19FWFQpOwogCiAJaWYgKGVycikKQEAgLTEyMzIsMTAgKzExOTUsMTAgQEAKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTEyNjQsNyArMTIyNyw3IEBACiAJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgewogCWNhc2UgVFJJR19OT1c6CiAJY2FzZSBUUklHX0VYVDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19JTlQ6CiAJCS8qIHN0YXJ0X2FyZyBpcyB0aGUgaW50ZXJuYWwgdHJpZ2dlciAoYW55IHZhbHVlKSAqLwpAQCAtMTI3Miw3ICsxMjM1LDcgQEAKIAl9CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAmIChUUklHX0ZPTExPVyB8IFRSSUdfRVhUKSkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCiAJaWYgKChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpICYmCiAJICAgIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpICYmIChjbWQtPnNjYW5fZW5kX2FyZyA9PSAxKSkgewpAQCAtMTI4MSwzNCArMTI0NCwzNyBAQAogCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMDsKIAl9CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBkZXZwcml2LT5haV9uc19taW4pOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgZGV2cHJpdi0+YWlfbnNfbWluKTsKKwl9CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCkKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCkgewogCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZykgewogCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDA7CiAJCQllcnIgfD0gLUVJTlZBTDsKLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fZW5kX2FyZywKLQkJCQkJCQkgNjU1MzUpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkJCSAgICA2NTUzNSk7CiAJCX0KKwl9CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyAmIChUUklHX1RJTUVSIHwgVFJJR19OT1cpKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBkZXZwcml2LT5haV9uc19taW4pOworCWlmIChjbWQtPmNvbnZlcnRfc3JjICYgKFRSSUdfVElNRVIgfCBUUklHX05PVykpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgZGV2cHJpdi0+YWlfbnNfbWluKTsKKwl9CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9lbmRfYXJnLAotCQkJCQkgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmICgoY21kLT5zY2FuX2VuZF9hcmcgJSBjbWQtPmNoYW5saXN0X2xlbikpIHsKIAkJY21kLT5zY2FuX2VuZF9hcmcgPQpAQCAtMTMyMywxOCArMTI4OSwxNCBAQAogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzRNSFosCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgJiAoVFJJR19USU1FUiB8IFRSSUdfTk9XKSkgewogCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzRNSFosCi0JCQkJCSAgJmRpdmlzb3IxLCAmZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAKIAkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgogCQkgICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX05PVykgewpAQCAtMTM0NCw4ICsxMzA2LDkgQEAKIAkJCX0gZWxzZSB7CiAJCQkJYXJnID0gY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuOwogCQkJfQotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkJIGFyZyk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT4KKwkJCQkJCQkgICAgc2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkJICAgIGFyZyk7CiAJCX0KIAl9CiAKQEAgLTE0ODIsMTAgKzE0NDUsNiBAQAogCWlubChkZXYtPmlvYmFzZSArIFBDSTkxMThfSU5UX0NUUkxfUkVHKTsKIAlpbmwoZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FJX1NUQVRVU19SRUcpOwogCi0JLyogcmVzZXQgYW5kIHN0b3AgY291bnRlcnMgKi8KLQlwY2k5MTE4X3RpbWVyX3NldF9tb2RlKGRldiwgMCwgSTgyNTRfTU9ERTApOwotCXBjaTkxMThfc3RhcnRfcGFjZXIoZGV2LCAwKTsKLQogCS8qIHJlc2V0IERNQSBhbmQgc2NhbiBxdWV1ZSAqLwogCW91dGwoMCwgZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FJX0JVUlNUX05VTV9SRUcpOwogCW91dGwoMSwgZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FJX0FVVE9TQ0FOX01PREVfUkVHKTsKQEAgLTE1OTAsNiArMTU0OSwxMSBAQAogCWRldnByaXYtPmlvYmFzZV9hID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CiAJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgUENJOTExOF9USU1FUl9CQVNFLAorCQkJCSAgICAgIEk4MjU0X09TQ19CQVNFXzRNSFosIEk4MjU0X0lPMzIsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlwY2k5MTE4X3Jlc2V0KGRldik7CiAKIAlpZiAocGNpZGV2LT5pcnEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYwppbmRleCA4YjE1Y2JlLi5iYzVmOTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRxMTJiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jCkBAIC02OSw4ICs2OSw2IEBACiAKICAgIDEzLW9jdC0yMDA3CiAgICAgICsgZmlyc3QgdHJ5Ci0KLQogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTcwLDcgKzE2OCw2IEBACiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0KIAkvKiBvbmx5IGJpdHMgMC00IGhhdmUgaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBpbnB1dHMgKi8KIAlkYXRhWzFdID0gKGluYihkZXYtPmlvYmFzZSArIEFEUTEyQl9TVElOUikgJiBBRFExMkJfU1RJTlJfSU5fTUFTSyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKaW5kZXggM2Y3MjQ1MS4uMGM2YWE5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMKQEAgLTQsNyArNCw3IEBACiAgKiBBdXRob3I6IE1pY2hhbCBEb2JlcyA8ZG9iZXNAdGVzbmV0LmN6PgogICoKICAqIFRoYW5rcyB0byBaaGVuR2FuZyBTaGFuZyA8WmhlbkdhbmcuU2hhbmdAQWR2YW50ZWNoLmNvbS5jbj4KLSAqIGZvciB0ZXN0aW5nIGFuZCBpbmZvcm1hdGlvbnMuCisgKiBmb3IgdGVzdGluZyBhbmQgaW5mb3JtYXRpb24uCiAgKgogICogIGhhcmR3YXJlIGRyaXZlciBmb3IgQWR2YW50ZWNoIGNhcmRzOgogICogICBjYXJkOiAgIFBDSS0xNzEwLCBQQ0ktMTcxMEhHLCBQQ0ktMTcxMSwgUENJLTE3MTMsIFBDSS0xNzIwLCBQQ0ktMTczMQpAQCAtNDIsMTMgKzQyLDExIEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICJhbWNjX3M1OTMzLmgiCiAKICNkZWZpbmUgUENJMTcxeF9BRF9EQVRBCSAwCS8qIFI6ICAgQS9EIGRhdGEgKi8KQEAgLTY3LDExICs2NSw2IEBACiAKICNkZWZpbmUgUENJMTcxWF9USU1FUl9CQVNFCTB4MTgKIAotI2RlZmluZSBQQ0kxNzF4X0NOVDAJMjQJLyogUi9XOiA4MjU0IGNvdW50ZXIgMCAqLwotI2RlZmluZSBQQ0kxNzF4X0NOVDEJMjYJLyogUi9XOiA4MjU0IGNvdW50ZXIgMSAqLwotI2RlZmluZSBQQ0kxNzF4X0NOVDIJMjgJLyogUi9XOiA4MjU0IGNvdW50ZXIgMiAqLwotI2RlZmluZSBQQ0kxNzF4X0NOVENUUkwJMzAJLyogVzogICA4MjU0IGNvdW50ZXIgY29udHJvbCAqLwotCiAvKiB1cHBlciBiaXRzIGZyb20gc3RhdHVzIHJlZ2lzdGVyIChQQ0kxNzF4X1NUQVRVUykgKGxvd2VyIGlzIHNhbWUgd2l0aCBjb250cm9sCiAgKiByZWcpICovCiAjZGVmaW5lCVN0YXR1c19GRQkweDAxMDAJLyogMT1GSUZPIGlzIGVtcHR5ICovCkBAIC04NywxNiArODAsNiBAQAogI2RlZmluZSBDb250cm9sX0VYVAkweDAwMDQJLyogMT1leHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSAqLwogI2RlZmluZSBDb250cm9sX1BBQ0VSCTB4MDAwMgkvKiAxPWVuYWJsZSBpbnRlcm5hbCA4MjU0IHRyaWdnZXIgc291cmNlICovCiAjZGVmaW5lIENvbnRyb2xfU1cJMHgwMDAxCS8qIDE9ZW5hYmxlIHNvZnR3YXJlIHRyaWdnZXIgc291cmNlICovCi0vKiBiaXRzIGZyb20gY291bnRlciBjb250cm9sIHJlZ2lzdGVyIChQQ0kxNzF4X0NOVENUUkwpICovCi0jZGVmaW5lIENvdW50ZXJfQkNEICAgICAweDAwMDEJLyogMCA9IGJpbmFyeSBjb3VudGVyLCAxID0gQkNEIGNvdW50ZXIgKi8KLSNkZWZpbmUgQ291bnRlcl9NMCAgICAgIDB4MDAwMgkvKiBNMC1NMiBzZWxlY3QgbW9kZXMgMC01ICovCi0jZGVmaW5lIENvdW50ZXJfTTEgICAgICAweDAwMDQJLyogMDAwID0gbW9kZSAwLCAwMTAgPSBtb2RlIDIgLi4uICovCi0jZGVmaW5lIENvdW50ZXJfTTIgICAgICAweDAwMDgKLSNkZWZpbmUgQ291bnRlcl9SVzAgICAgIDB4MDAxMAkvKiBSVzAvUlcxIHNlbGVjdCByZWFkL3dyaXRlIG1vZGUgKi8KLSNkZWZpbmUgQ291bnRlcl9SVzEgICAgIDB4MDAyMAotI2RlZmluZSBDb3VudGVyX1NDMCAgICAgMHgwMDQwCS8qIFNlbGVjdCBDb3VudGVyLiBPbmx5IDAwIG9yIDExIG1heSAqLwotI2RlZmluZSBDb3VudGVyX1NDMSAgICAgMHgwMDgwCS8qIGJlIHVzZWQsIDAwIGZvciBDTlQwLAotCQkJCSAqIDExIGZvciByZWFkLWJhY2sgY29tbWFuZCAqLwogCiAjZGVmaW5lIFBDSTE3MjBfREEwCSAwCS8qIFc6ICAgRC9BIHJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgUENJMTcyMF9EQTEJIDIJLyogVzogICBEL0EgcmVnaXN0ZXIgMSAqLwpAQCAtMjY1LDE1ICsyNDgsOSBAQAogCXVuc2lnbmVkIGNoYXIgYWlfZXQ7CiAJdW5zaWduZWQgaW50IGFpX2V0X0NudHJsUmVnOwogCXVuc2lnbmVkIGludCBhaV9ldF9NdXhWYWw7Ci0JdW5zaWduZWQgaW50IG5leHRfZGl2aXNvcjE7Ci0JdW5zaWduZWQgaW50IG5leHRfZGl2aXNvcjI7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsKIAl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0WzMyXTsJLyogIGxpc3Qgb2Ygc2Nhbm5lZCBjaGFubmVsICovCiAJdW5zaWduZWQgY2hhciBzYXZlZF9zZWdsZW47CS8qIGxlbiBvZiB0aGUgbm9uLXJlcGVhdGluZyBjaGFubGlzdCAqLwogCXVuc2lnbmVkIGNoYXIgZGFfcmFuZ2VzOwkvKiAgY29weSBvZiBEL0Egb3V0cGl0IHJhbmdlIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgaW50IGNudDBfd3JpdGVfd2FpdDsJLyogYWZ0ZXIgYSB3cml0ZSwgd2FpdCBmb3IgdXBkYXRlIG9mIHRoZQotCQkJCQkgKiBpbnRlcm5hbCBzdGF0ZSAqLwogfTsKIAogc3RhdGljIGludCBwY2kxNzF4X2FpX2NoZWNrX2NoYW5saXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC01MDgsMTA1ICs0ODUsNiBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgdm9pZCBwY2kxNzF4X3N0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJYm9vbCBsb2FkX2NvdW50ZXJzKQotewotCXN0cnVjdCBwY2kxNzEwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBQQ0kxNzFYX1RJTUVSX0JBU0U7Ci0KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAxLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMSwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCi0JaWYgKGxvYWRfY291bnRlcnMpIHsKLQkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMSwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOwotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAxLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHBjaTE3MXhfY291bnRlcl9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXVuc2lnbmVkIGludCBtc2IsIGxzYiwgY2NudHJsOwotCWludCBpOwotCi0JY2NudHJsID0gMHhEMjsJCS8qIGNvdW50IG9ubHkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7Ci0JCW91dHcoY2NudHJsLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UQ1RSTCk7Ci0KLQkJbHNiID0gaW53KGRldi0+aW9iYXNlICsgUENJMTcxeF9DTlQwKSAmIDB4RkY7Ci0JCW1zYiA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UMCkgJiAweEZGOwotCi0JCWRhdGFbMF0gPSBsc2IgfCAobXNiIDw8IDgpOwotCX0KLQotCXJldHVybiBpbnNuLT5uOwotfQotCi1zdGF0aWMgaW50IHBjaTE3MXhfY291bnRlcl9pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcGNpMTcxMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVpbnQgbXNiLCBsc2IsIGNjbnRybCwgc3RhdHVzOwotCi0JbHNiID0gZGF0YVswXSAmIDB4MDBGRjsKLQltc2IgPSAoZGF0YVswXSAmIDB4RkYwMCkgPj4gODsKLQotCS8qIHdyaXRlIGxzYiwgdGhlbiBtc2IgKi8KLQlvdXR3KGxzYiwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NOVDApOwotCW91dHcobXNiLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UMCk7Ci0KLQlpZiAoZGV2cHJpdi0+Y250MF93cml0ZV93YWl0KSB7Ci0JCS8qIHdhaXQgZm9yIHRoZSBuZXcgY291bnQgdG8gYmUgbG9hZGVkICovCi0JCWNjbnRybCA9IDB4RTI7Ci0JCWRvIHsKLQkJCW91dHcoY2NudHJsLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UQ1RSTCk7Ci0JCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NOVDApICYgMHhGRjsKLQkJfSB3aGlsZSAoc3RhdHVzICYgMHg0MCk7Ci0JfQotCi0JcmV0dXJuIGluc24tPm47Ci19Ci0KLXN0YXRpYyBpbnQgcGNpMTcxeF9jb3VudGVyX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLSNpZmRlZiB1bnVzZWQKLQkvKiBUaGlzIGRvZXNuJ3Qgd29yayBsaWtlIGEgbm9ybWFsIENvbWVkaSBjb3VudGVyIGNvbmZpZyAqLwotCXN0cnVjdCBwY2kxNzEwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdWludCBjY250cmwgPSAwOwotCi0JZGV2cHJpdi0+Y250MF93cml0ZV93YWl0ID0gZGF0YVswXSAmIDB4MjA7Ci0KLQkvKiBpbnRlcm5hbCBvciBleHRlcm5hbCBjbG9jaz8gKi8KLQlpZiAoIShkYXRhWzBdICYgMHgxMCkpIHsJLyogaW50ZXJuYWwgKi8KLQkJZGV2cHJpdi0+Q250cmxSZWcgJj0gfkNvbnRyb2xfQ05UMDsKLQl9IGVsc2UgewotCQlkZXZwcml2LT5DbnRybFJlZyB8PSBDb250cm9sX0NOVDA7Ci0JfQotCW91dHcoZGV2cHJpdi0+Q250cmxSZWcsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DT05UUk9MKTsKLQotCWlmIChkYXRhWzBdICYgMHgwMSkKLQkJY2NudHJsIHw9IENvdW50ZXJfTTA7Ci0JaWYgKGRhdGFbMF0gJiAweDAyKQotCQljY250cmwgfD0gQ291bnRlcl9NMTsKLQlpZiAoZGF0YVswXSAmIDB4MDQpCi0JCWNjbnRybCB8PSBDb3VudGVyX00yOwotCWlmIChkYXRhWzBdICYgMHgwOCkKLQkJY2NudHJsIHw9IENvdW50ZXJfQkNEOwotCWNjbnRybCB8PSBDb3VudGVyX1JXMDsJLyogc2V0IHJlYWQvd3JpdGUgbW9kZSAqLwotCWNjbnRybCB8PSBDb3VudGVyX1JXMTsKLQlvdXR3KGNjbnRybCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NOVENUUkwpOwotI2VuZGlmCi0KLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGludCBwY2kxNzIwX2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTY0Niw3ICs1MjQsNyBAQAogCWRldnByaXYtPkNudHJsUmVnIHw9IENvbnRyb2xfU1c7CiAJLyogcmVzZXQgYW55IG9wZXJhdGlvbnMgKi8KIAlvdXR3KGRldnByaXYtPkNudHJsUmVnLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ09OVFJPTCk7Ci0JcGNpMTcxeF9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKKwljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgZmFsc2UpOwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUkZJRk8pOwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUklOVCk7CiAKQEAgLTc2Nyw3ICs2NDUsNyBAQAogCQlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJJTlQpOwogCQlvdXR3KGRldnByaXYtPmFpX2V0X011eFZhbCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X01VWCk7CiAJCW91dHcoZGV2cHJpdi0+Q250cmxSZWcsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DT05UUk9MKTsKLQkJcGNpMTcxeF9zdGFydF9wYWNlcihkZXYsIHRydWUpOworCQljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgdHJ1ZSk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKQEAgLTc4Niw4ICs2NjQsNiBAQAogCXN0cnVjdCBwY2kxNzEwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwogCi0JcGNpMTcxeF9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKLQogCXBjaTE3MXhfYWlfc2V0dXBfY2hhbmxpc3QoZGV2LCBzLCBjbWQtPmNoYW5saXN0LCBjbWQtPmNoYW5saXN0X2xlbiwKIAkJCQkgIGRldnByaXYtPnNhdmVkX3NlZ2xlbik7CiAKQEAgLTc5OCwxMCArNjc0LDkgQEAKIAlpZiAoKGNtZC0+ZmxhZ3MgJiBDTURGX1dBS0VfRU9TKSA9PSAwKQogCQlkZXZwcml2LT5DbnRybFJlZyB8PSBDb250cm9sX09ORUZIOwogCi0JZGV2cHJpdi0+ZGl2aXNvcjEgPSBkZXZwcml2LT5uZXh0X2Rpdmlzb3IxOwotCWRldnByaXYtPmRpdmlzb3IyID0gZGV2cHJpdi0+bmV4dF9kaXZpc29yMjsKLQogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldi0+cGFjZXIpOworCiAJCWRldnByaXYtPkNudHJsUmVnIHw9IENvbnRyb2xfUEFDRVIgfCBDb250cm9sX0lSUUVOOwogCQlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpIHsKIAkJCWRldnByaXYtPmFpX2V0X0NudHJsUmVnID0gZGV2cHJpdi0+Q250cmxSZWc7CkBAIC04MTUsNyArNjkwLDcgQEAKIAkJb3V0dyhkZXZwcml2LT5DbnRybFJlZywgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NPTlRST0wpOwogCiAJCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykKLQkJCXBjaTE3MXhfc3RhcnRfcGFjZXIoZGV2LCB0cnVlKTsKKwkJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAl9IGVsc2UgewkvKiBUUklHX0VYVCAqLwogCQlkZXZwcml2LT5DbnRybFJlZyB8PSBDb250cm9sX0VYVCB8IENvbnRyb2xfSVJRRU47CiAJCW91dHcoZGV2cHJpdi0+Q250cmxSZWcsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DT05UUk9MKTsKQEAgLTgyOCwyNiArNzAzLDI1IEBACiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBpbnQgYXJnOwogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBzdGVwIDJhOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBzdGVwIDJiOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC04NTYsMjAgKzczMCwyMSBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CiAJZWxzZQkvKiBUUklHX0ZPTExPVyAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTg3NywxMiArNzUyLDEwIEBACiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAotCQkJCQkgICZkZXZwcml2LT5uZXh0X2Rpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5uZXh0X2Rpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQl1bnNpZ25lZCBpbnQgYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKKworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC04OTgsMTkgKzc3MSw1NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBjaTE3MXhfaW5zbl9jb3VudGVyX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQzoKKwkJc3dpdGNoIChkYXRhWzFdKSB7CisJCWNhc2UgMDoJLyogaW50ZXJuYWwgKi8KKwkJCWRldnByaXYtPmFpX2V0X0NudHJsUmVnICY9IH5Db250cm9sX0NOVDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBleHRlcm5hbCAqLworCQkJZGV2cHJpdi0+YWlfZXRfQ250cmxSZWcgfD0gQ29udHJvbF9DTlQwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlvdXR3KGRldnByaXYtPmFpX2V0X0NudHJsUmVnLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ09OVFJPTCk7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfR0VUX0NMT0NLX1NSQzoKKwkJaWYgKGRldnByaXYtPmFpX2V0X0NudHJsUmVnICYgQ29udHJvbF9DTlQwKSB7CisJCQlkYXRhWzFdID0gMTsKKwkJCWRhdGFbMl0gPSAwOworCQl9IGVsc2UgeworCQkJZGF0YVsxXSA9IDA7CisJCQlkYXRhWzJdID0gSTgyNTRfT1NDX0JBU0VfMTBNSFo7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKIHN0YXRpYyBpbnQgcGNpMTcxeF9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBib2FyZHR5cGUgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7CiAJc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCW91dHcoMHgzMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NOVENUUkwpOwogCS8qIFNvZnR3YXJlIHRyaWdnZXIsIENOVDA9ZXh0ZXJuYWwgKi8KIAlkZXZwcml2LT5DbnRybFJlZyA9IENvbnRyb2xfU1cgfCBDb250cm9sX0NOVDA7CiAJLyogcmVzZXQgYW55IG9wZXJhdGlvbnMgKi8KIAlvdXR3KGRldnByaXYtPkNudHJsUmVnLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ09OVFJPTCk7CiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSRklGTyk7CS8qICBjbGVhciBGSUZPICovCiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSSU5UKTsJLyogIGNsZWFyIElOVCByZXF1ZXN0ICovCi0JcGNpMTcxeF9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKIAlkZXZwcml2LT5kYV9yYW5nZXMgPSAwOwogCWlmIChib2FyZC0+aGFzX2FvKSB7CiAJCS8qIHNldCBEQUNzIHRvIDAuLjVWICovCkBAIC05NzcsNiArODg1LDExIEBACiAJCXJldHVybiByZXQ7CiAJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgUENJMTcxWF9USU1FUl9CQVNFLAorCQkJCSAgICAgIEk4MjU0X09TQ19CQVNFXzEwTUhaLCBJODI1NF9JTzE2LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJbl9zdWJkZXZpY2VzID0gMDsKIAlpZiAoYm9hcmQtPm5fYWljaGFuKQogCQluX3N1YmRldmljZXMrKzsKQEAgLTEwNzMsMTYgKzk4NiwxNyBAQAogCQlzdWJkZXYrKzsKIAl9CiAKKwkvKiBDb3VudGVyIHN1YmRldmljZSAoODI1NCkgKi8KIAlpZiAoYm9hcmQtPmhhc19jb3VudGVyKSB7CiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07Ci0JCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQ09VTlRFUjsKLQkJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOwotCQlzLT5uX2NoYW4JPSAxOwotCQlzLT5tYXhkYXRhCT0gMHhmZmZmOwotCQlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmtub3duOwotCQlzLT5pbnNuX3JlYWQJPSBwY2kxNzF4X2NvdW50ZXJfaW5zbl9yZWFkOwotCQlzLT5pbnNuX3dyaXRlCT0gcGNpMTcxeF9jb3VudGVyX2luc25fd3JpdGU7Ci0JCXMtPmluc25fY29uZmlnCT0gcGNpMTcxeF9jb3VudGVyX2luc25fY29uZmlnOworCQljb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdChzLCBkZXYtPnBhY2VyKTsKKworCQlkZXYtPnBhY2VyLT5pbnNuX2NvbmZpZyA9IHBjaTE3MXhfaW5zbl9jb3VudGVyX2NvbmZpZzsKKworCQkvKiBjb3VudGVycyAxIGFuZCAyIGFyZSB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBwYWNlciAqLworCQljb21lZGlfODI1NF9zZXRfYnVzeShkZXYtPnBhY2VyLCAxLCB0cnVlKTsKKwkJY29tZWRpXzgyNTRfc2V0X2J1c3koZGV2LT5wYWNlciwgMiwgdHJ1ZSk7CisKIAkJc3ViZGV2Kys7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyMy5jCmluZGV4IGYxOTQ1YmUuLjE5MjFhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyMy5jCkBAIC00MSw5ICs0MSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAvKgogICogUENJIEJhciAyIEkvTyBSZWdpc3RlciBtYXAgKGRldi0+aW9iYXNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjQuYwppbmRleCBhMzU3M2VhLi5mN2E3ZGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjQuYwpAQCAtNDcsOSArNDcsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyoKICAqIFBDSSBiYXIgMiBSZWdpc3RlciBJL08gbWFwIChkZXYtPmlvYmFzZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKaW5kZXggMDk2MDlkNi4uNDU2ZTg3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMKQEAgLTMwLDEzICszMCwxMiBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICI4MjU1LmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qIGhhcmR3YXJlIHR5cGVzIG9mIHRoZSBjYXJkcyAqLwogZW51bSBod19jYXJkc19pZCB7CkBAIC02MCwxMiArNTksNiBAQAogI2RlZmluZSBNQVhfRE9fU1VCREVWUwkyCS8qIG1heCBudW1iZXIgb2YgRE8gc3ViZGV2aWNlcyBwZXIgY2FyZCAqLwogI2RlZmluZSBNQVhfRElPX1NVQkRFVkcJMgkvKiBtYXggbnVtYmVyIG9mIERJTyBzdWJkZXZpY2VzIGdyb3VwIHBlcgogCQkJCSAqIGNhcmQgKi8KLSNkZWZpbmUgTUFYXzgyNTRfU1VCREVWUyAgIDEJLyogbWF4IG51bWJlciBvZiA4MjU0IGNvdW50ZXIgc3ViZGV2cyBwZXIKLQkJCQkgKiBjYXJkICovCi0JCQkJLyogKGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgODI1NCBwZXIKLQkJCQkgKiBzdWJkZXZpY2UpICovCi0KLSNkZWZpbmUgU0laRV84MjU0CSAgIDQJLyogODI1NCBJTyBzcGFjZSBsZW5ndGggKi8KIAogI2RlZmluZSBQQ0lESU9fTUFJTlJFRwkgICAyCS8qIG1haW4gSS9PIHJlZ2lvbiBmb3IgYWxsIEFkdmFudGVjaCBjYXJkcz8gKi8KIApAQCAtMjMwLDcgKzIyMyw3IEBACiAJaW50IGNoYW5zOwkJLyogIG51bSBvZiBjaGFucyAqLwogCWludCBhZGRyOwkJLyogIFBDSSBhZGRyZXNzIG9mc2V0ICovCiAJaW50IHJlZ3M7CQkvKiAgbnVtYmVyIG9mIHJlZ2lzdGVycyB0byByZWFkIG9yIDgyNTUKLQkJCQkgICAgc3ViZGV2aWNlcyBvciA4MjU0IGNoaXBzICovCisJCQkJICAgIHN1YmRldmljZXMgKi8KIAl1bnNpZ25lZCBpbnQgc3BlY2ZsYWdzOwkvKiAgYWRkb24gc3ViZGV2aWNlIGZsYWdzICovCiB9OwogCkBAIC0yNDMsNyArMjM2LDcgQEAKIAlzdHJ1Y3QgZGlvc3ViZF9kYXRhIHNkb1tNQVhfRE9fU1VCREVWU107CS8qICBETyBjaGFucyAqLwogCXN0cnVjdCBkaW9zdWJkX2RhdGEgc2Rpb1tNQVhfRElPX1NVQkRFVkddOwkvKiAgRElPIDgyNTUgY2hhbnMgKi8KIAlzdHJ1Y3QgZGlvc3ViZF9kYXRhIGJvYXJkaWQ7CS8qICBjYXJkIHN1cHBvcnRzIGJvYXJkIElEIHN3aXRjaCAqLwotCXN0cnVjdCBkaW9zdWJkX2RhdGEgczgyNTRbTUFYXzgyNTRfU1VCREVWU107CS8qIDgyNTQgc3ViZGV2aWNlcyAqLworCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnYmFzZTsKIAllbnVtIGh3X2lvX2FjY2VzcyBpb19hY2Nlc3M7CiB9OwogCkBAIC0yODYsNyArMjc5LDcgQEAKIAkJLnNkaVswXQkJPSB7IDMyLCBQQ0kxNzM1X0RJLCA0LCAwLCB9LAogCQkuc2RvWzBdCQk9IHsgMzIsIFBDSTE3MzVfRE8sIDQsIDAsIH0sCiAJCS5ib2FyZGlkCT0geyA0LCBQQ0kxNzM1X0JPQVJESUQsIDEsIFNERl9JTlRFUk5BTCwgfSwKLQkJLnM4MjU0WzBdCT0geyAzLCBQQ0kxNzM1X0M4MjU0LCAxLCAwLCB9LAorCQkudGltZXJfcmVnYmFzZQk9IFBDSTE3MzVfQzgyNTQsCiAJCS5pb19hY2Nlc3MJPSBJT184YiwKIAl9LAogCVtUWVBFX1BDSTE3MzZdID0gewpAQCAtMzIyLDcgKzMxNSw3IEBACiAJCS5jYXJkdHlwZQk9IFRZUEVfUENJMTc1MSwKIAkJLm5zdWJkZXZzCT0gMywKIAkJLnNkaW9bMF0JPSB7IDQ4LCBQQ0kxNzUxX0RJTywgMiwgMCwgfSwKLQkJLnM4MjU0WzBdCT0geyAzLCBQQ0kxNzUxX0NOVCwgMSwgMCwgfSwKKwkJLnRpbWVyX3JlZ2Jhc2UJPSBQQ0kxNzUxX0NOVCwKIAkJLmlvX2FjY2Vzcwk9IElPXzhiLAogCX0sCiAJW1RZUEVfUENJMTc1Ml0gPSB7CkBAIC00MjUsNyArNDE4LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZC0+cmVnczsgaSsrKQogCQlkYXRhWzFdIHw9IGluYihkZXYtPmlvYmFzZSArIGQtPmFkZHIgKyBpKSA8PCAoOCAqIGkpOwogCi0KIAlyZXR1cm4gaW5zbi0+bjsKIH0KIApAQCAtNDg3LDgzICs0NzksNiBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLXN0YXRpYyBpbnQgcGNpXzgyNTRfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWNvbnN0IHN0cnVjdCBkaW9zdWJkX2RhdGEgKmQgPSAoY29uc3Qgc3RydWN0IGRpb3N1YmRfZGF0YSAqKXMtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGNoYW4sIGNoaXAsIGNoaXBjaGFuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CS8qIGNoYW5uZWwgb24gc3ViZGV2aWNlICovCi0JY2hpcCA9IGNoYW4gLyAzOwkJLyogY2hpcCBvbiBzdWJkZXZpY2UgKi8KLQljaGlwY2hhbiA9IGNoYW4gLSAoMyAqIGNoaXApOwkvKiBjaGFubmVsIG9uIGNoaXAgb24gc3ViZGV2aWNlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOwotCWRhdGFbMF0gPSBpODI1NF9yZWFkKGRldi0+aW9iYXNlICsgZC0+YWRkciArIChTSVpFXzgyNTQgKiBjaGlwKSwKLQkJCTAsIGNoaXBjaGFuKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgcGNpXzgyNTRfaW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWNvbnN0IHN0cnVjdCBkaW9zdWJkX2RhdGEgKmQgPSAoY29uc3Qgc3RydWN0IGRpb3N1YmRfZGF0YSAqKXMtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGNoYW4sIGNoaXAsIGNoaXBjaGFuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CS8qIGNoYW5uZWwgb24gc3ViZGV2aWNlICovCi0JY2hpcCA9IGNoYW4gLyAzOwkJLyogY2hpcCBvbiBzdWJkZXZpY2UgKi8KLQljaGlwY2hhbiA9IGNoYW4gLSAoMyAqIGNoaXApOwkvKiBjaGFubmVsIG9uIGNoaXAgb24gc3ViZGV2aWNlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOwotCWk4MjU0X3dyaXRlKGRldi0+aW9iYXNlICsgZC0+YWRkciArIChTSVpFXzgyNTQgKiBjaGlwKSwKLQkJCTAsIGNoaXBjaGFuLCBkYXRhWzBdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMTsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbnQgcGNpXzgyNTRfaW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQljb25zdCBzdHJ1Y3QgZGlvc3ViZF9kYXRhICpkID0gKGNvbnN0IHN0cnVjdCBkaW9zdWJkX2RhdGEgKilzLT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBjaGFuLCBjaGlwLCBjaGlwY2hhbjsKLQl1bnNpZ25lZCBsb25nIGlvYmFzZTsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwkvKiBjaGFubmVsIG9uIHN1YmRldmljZSAqLwotCWNoaXAgPSBjaGFuIC8gMzsJCS8qIGNoaXAgb24gc3ViZGV2aWNlICovCi0JY2hpcGNoYW4gPSBjaGFuIC0gKDMgKiBjaGlwKTsJLyogY2hhbm5lbCBvbiBjaGlwIG9uIHN1YmRldmljZSAqLwotCWlvYmFzZSA9IGRldi0+aW9iYXNlICsgZC0+YWRkciArIChTSVpFXzgyNTQgKiBjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7Ci0Jc3dpdGNoIChkYXRhWzBdKSB7Ci0JY2FzZSBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFOgotCQlyZXQgPSBpODI1NF9zZXRfbW9kZShpb2Jhc2UsIDAsIGNoaXBjaGFuLCBkYXRhWzFdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIElOU05fQ09ORklHXzgyNTRfUkVBRF9TVEFUVVM6Ci0JCWRhdGFbMV0gPSBpODI1NF9zdGF0dXMoaW9iYXNlLCAwLCBjaGlwY2hhbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IGluc24tPm47Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCiBzdGF0aWMgaW50IHBjaTE3NjBfdW5jaGVja2VkX21ieHJlcXVlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkJdW5zaWduZWQgY2hhciAqb21iLCB1bnNpZ25lZCBjaGFyICppbWIsCiAJCQkJCWludCByZXBlYXRzKQpAQCAtODQ1LDkgKzc2MCw2IEBACiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzM1X0RPICsgMSk7CiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzM1X0RPICsgMik7CiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzM1X0RPICsgMyk7Ci0JCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENJMTczNV9DODI1NCwgMCwgMCwgSTgyNTRfTU9ERTApOwotCQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTE3MzVfQzgyNTQsIDAsIDEsIEk4MjU0X01PREUwKTsKLQkJaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kxNzM1X0M4MjU0LCAwLCAyLCBJODI1NF9NT0RFMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBUWVBFX1BDSTE3MzY6CkBAIC0xMDI5LDI2ICs5NDEsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2lfZGlvX2FkZF84MjU0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgY29uc3Qgc3RydWN0IGRpb3N1YmRfZGF0YSAqZCkKLXsKLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7Ci0Jcy0+bl9jaGFuID0gZC0+Y2hhbnM7Ci0Jcy0+bWF4ZGF0YSA9IDY1NTM1OwotCXMtPmxlbl9jaGFubGlzdCA9IGQtPmNoYW5zOwotCXMtPmluc25fcmVhZCA9IHBjaV84MjU0X2luc25fcmVhZDsKLQlzLT5pbnNuX3dyaXRlID0gcGNpXzgyNTRfaW5zbl93cml0ZTsKLQlzLT5pbnNuX2NvbmZpZyA9IHBjaV84MjU0X2luc25fY29uZmlnOwotCXMtPnByaXZhdGUgPSAodm9pZCAqKWQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNpX2Rpb19vdmVycmlkZV9jYXJkdHlwZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAogCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjYXJkdHlwZSkKIHsKQEAgLTExNDQsMTIgKzEwMzYsMTkgQEAKIAkJc3ViZGV2Kys7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF84MjU0X1NVQkRFVlM7IGkrKykKLQkJaWYgKHRoaXNfYm9hcmQtPnM4MjU0W2ldLmNoYW5zKSB7Ci0JCQlzID0gJmRldi0+c3ViZGV2aWNlc1tzdWJkZXZdOwotCQkJcGNpX2Rpb19hZGRfODI1NChkZXYsIHMsICZ0aGlzX2JvYXJkLT5zODI1NFtpXSk7Ci0JCQlzdWJkZXYrKzsKLQkJfQorCWlmICh0aGlzX2JvYXJkLT50aW1lcl9yZWdiYXNlKSB7CisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07CisKKwkJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKworCQkJCQkgICAgICB0aGlzX2JvYXJkLT50aW1lcl9yZWdiYXNlLAorCQkJCQkgICAgICAwLCBJODI1NF9JTzgsIDApOworCQlpZiAoIWRldi0+cGFjZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdChzLCBkZXYtPnBhY2VyKTsKKworCQlzdWJkZXYrKzsKKwl9CiAKIAlpZiAodGhpc19ib2FyZC0+Y2FyZHR5cGUgPT0gVFlQRV9QQ0kxNzYwKQogCQlwY2kxNzYwX2F0dGFjaChkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fpb19paXJvXzE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYwppbmRleCAxYzdiMzI1Li4zNWIyZjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYwpAQCAtNDIsOCArNDIsNiBAQAogCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLQogI2RlZmluZSBBSU9fSUlST18xNl9SRUxBWV8wXzcJCTB4MDAKICNkZWZpbmUgQUlPX0lJUk9fMTZfSU5QVVRfMF83CQkweDAxCiAjZGVmaW5lIEFJT19JSVJPXzE2X0lSUQkJCTB4MDIKQEAgLTExNiwxMSArMTE0LDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC0xMzAsMTEgKzEyOCwxMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX2NvbW1vbi5jCmluZGV4IDI2YWFkNzAuLmQxNWEzZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9jb21tb24uYwpAQCAtMjUsMTkgKzI1LDE0IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJhbXBsY19kaW8yMDAuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICI4MjU1LmgiCQkvKiBvbmx5IGZvciByZWdpc3RlciBkZWZpbmVzICovCiAKIC8qIDIwMCBzZXJpZXMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIERJTzIwMF9JT19TSVpFCQkweDIwCiAjZGVmaW5lIERJTzIwMF9QQ0lFX0lPX1NJWkUJMHg0MDAwCi0jZGVmaW5lIERJTzIwMF9YQ0xLX1NDRQkJMHgxOAkvKiBHcm91cCBYIGNsb2NrIHNlbGVjdGlvbiByZWdpc3RlciAqLwotI2RlZmluZSBESU8yMDBfWUNMS19TQ0UJCTB4MTkJLyogR3JvdXAgWSBjbG9jayBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRElPMjAwX1pDTEtfU0NFCQkweDFhCS8qIEdyb3VwIFogY2xvY2sgc2VsZWN0aW9uIHJlZ2lzdGVyICovCi0jZGVmaW5lIERJTzIwMF9YR0FUX1NDRQkJMHgxYgkvKiBHcm91cCBYIGdhdGUgc2VsZWN0aW9uIHJlZ2lzdGVyICovCi0jZGVmaW5lIERJTzIwMF9ZR0FUX1NDRQkJMHgxYwkvKiBHcm91cCBZIGdhdGUgc2VsZWN0aW9uIHJlZ2lzdGVyICovCi0jZGVmaW5lIERJTzIwMF9aR0FUX1NDRQkJMHgxZAkvKiBHcm91cCBaIGdhdGUgc2VsZWN0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIERJTzIwMF9DTEtfU0NFKHgpCSgweDE4ICsgKHgpKQkvKiBHcm91cCBYL1kvWiBjbG9jayBzZWwgcmVnICovCisjZGVmaW5lIERJTzIwMF9HQVRfU0NFKHgpCSgweDFiICsgKHgpKQkvKiBHcm91cCBYL1kvWiBnYXRlIHNlbCByZWcgKi8KICNkZWZpbmUgRElPMjAwX0lOVF9TQ0UJCTB4MWUJLyogSW50ZXJydXB0IGVuYWJsZS9zdGF0dXMgcmVnaXN0ZXIgKi8KIC8qIEV4dHJhIHJlZ2lzdGVycyBmb3IgbmV3IFBDSWUgYm9hcmRzICovCiAjZGVmaW5lIERJTzIwMF9FTkhBTkNFCQkweDIwCS8qIDEgdG8gZW5hYmxlIGVuaGFuY2VkIGZlYXR1cmVzICovCkBAIC0xMDEsMTYgKzk2LDYgQEAKIAkxMDAwMDAwLAkJLyogMSBtaWxsaXNlY29uZC4gKi8KIH07CiAKLXN0cnVjdCBkaW8yMDBfc3ViZGV2XzgyNTQgewotCXVuc2lnbmVkIGludCBvZnM7CQkvKiBDb3VudGVyIGJhc2Ugb2Zmc2V0ICovCi0JdW5zaWduZWQgaW50IGNsa19zY2Vfb2ZzOwkvKiBDTEtfU0NFIGJhc2UgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGludCBnYXRfc2NlX29mczsJLyogR0FUX1NDRSBiYXNlIGFkZHJlc3MgKi8KLQlpbnQgd2hpY2g7CQkJLyogQml0IDUgb2YgQ0xLX1NDRSBvciBHQVRfU0NFICovCi0JdW5zaWduZWQgaW50IGNsb2NrX3NyY1szXTsJLyogQ3VycmVudCBjbG9jayBzb3VyY2VzICovCi0JdW5zaWduZWQgaW50IGdhdGVfc3JjWzNdOwkvKiBDdXJyZW50IGdhdGUgc291cmNlcyAqLwotCXNwaW5sb2NrX3Qgc3BpbmxvY2s7Ci19OwotCiBzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU1IHsKIAl1bnNpZ25lZCBpbnQgb2ZzOwkJLyogRElPIGJhc2Ugb2Zmc2V0ICovCiB9OwpAQCAtMTc3LDYgKzE2MiwyNyBAQAogCQlvdXRsKHZhbCwgZGV2LT5pb2Jhc2UgKyBvZmZzZXQpOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9vZmZzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJY29uc3Qgc3RydWN0IGRpbzIwMF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0ID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisJLyogZ2V0IHRoZSBvZmZzZXQgdGhhdCB3YXMgcGFzc2VkIHRvIGNvbWVkaV84MjU0XypfaW5pdCgpICovCisJaWYgKGRldi0+bW1pbykKKwkJb2Zmc2V0ID0gaTgyNTQtPm1taW8gLSBkZXYtPm1taW87CisJZWxzZQorCQlvZmZzZXQgPSBpODI1NC0+aW9iYXNlIC0gZGV2LT5pb2Jhc2U7CisKKwkvKiByZW1vdmUgdGhlIHNoaWZ0IHRoYXQgd2FzIGFkZGVkIGZvciBQQ0llIGJvYXJkcyAqLworCWlmIChib2FyZC0+aXNfcGNpZSkKKwkJb2Zmc2V0ID4+PSAzOworCisJLyogdGhpcyBvZmZzZXQgbm93IHdvcmtzIGZvciB0aGUgZGlvMjAwX3tyZWFkLHdyaXRlfSBoZWxwZXJzICovCisJcmV0dXJuIG9mZnNldDsKK30KKwogc3RhdGljIGludCBkaW8yMDBfc3ViZGV2X2ludHJfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCkBAIC0zNjYsMTkgKzM3MiwxOSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTM4NywxNSArMzkzLDE2IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNDgyLDE3NSArNDg5LDI2IEBACiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGlvMjAwX3N1YmRldl84MjU0X3JlYWRfY2hhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkJIHVuc2lnbmVkIGludCBjaGFuKQotewotCXN0cnVjdCBkaW8yMDBfc3ViZGV2XzgyNTQgKnN1YnByaXYgPSBzLT5wcml2YXRlOwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQkvKiBsYXRjaCBjb3VudGVyICovCi0JdmFsID0gY2hhbiA8PCA2OwotCWRpbzIwMF93cml0ZTgoZGV2LCBzdWJwcml2LT5vZnMgKyBpODI1NF9jb250cm9sX3JlZywgdmFsKTsKLQkvKiByZWFkIGxzYiwgbXNiICovCi0JdmFsID0gZGlvMjAwX3JlYWQ4KGRldiwgc3VicHJpdi0+b2ZzICsgY2hhbik7Ci0JdmFsICs9IGRpbzIwMF9yZWFkOChkZXYsIHN1YnByaXYtPm9mcyArIGNoYW4pIDw8IDg7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQgZGlvMjAwX3N1YmRldl84MjU0X3dyaXRlX2NoYW4oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICB1bnNpZ25lZCBpbnQgY2hhbiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0KLQkvKiB3cml0ZSBsc2IsIG1zYiAqLwotCWRpbzIwMF93cml0ZTgoZGV2LCBzdWJwcml2LT5vZnMgKyBjaGFuLCBjb3VudCAmIDB4ZmYpOwotCWRpbzIwMF93cml0ZTgoZGV2LCBzdWJwcml2LT5vZnMgKyBjaGFuLCAoY291bnQgPj4gOCkgJiAweGZmKTsKLX0KLQotc3RhdGljIHZvaWQgZGlvMjAwX3N1YmRldl84MjU0X3NldF9tb2RlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQl1bnNpZ25lZCBpbnQgY2hhbiwKLQkJCQkJdW5zaWduZWQgaW50IG1vZGUpCi17Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0KLQlieXRlID0gY2hhbiA8PCA2OwotCWJ5dGUgfD0gMHgzMDsJCS8qIGFjY2VzcyBvcmRlcjogbHNiLCBtc2IgKi8KLQlieXRlIHw9IChtb2RlICYgMHhmKTsJLyogY291bnRlciBtb2RlIGFuZCBCQ0R8YmluYXJ5ICovCi0JZGlvMjAwX3dyaXRlOChkZXYsIHN1YnByaXYtPm9mcyArIGk4MjU0X2NvbnRyb2xfcmVnLCBieXRlKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBkaW8yMDBfc3ViZGV2XzgyNTRfc3RhdHVzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQotCS8qIGxhdGNoIHN0YXR1cyAqLwotCWRpbzIwMF93cml0ZTgoZGV2LCBzdWJwcml2LT5vZnMgKyBpODI1NF9jb250cm9sX3JlZywKLQkJICAgICAgMHhlMCB8ICgyIDw8IGNoYW4pKTsKLQkvKiByZWFkIHN0YXR1cyAqLwotCXJldHVybiBkaW8yMDBfcmVhZDgoZGV2LCBzdWJwcml2LT5vZnMgKyBjaGFuKTsKLX0KLQotc3RhdGljIGludCBkaW8yMDBfc3ViZGV2XzgyNTRfcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQl1bnNpZ25lZCBpbnQgbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3VicHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJZGF0YVtuXSA9IGRpbzIwMF9zdWJkZXZfODI1NF9yZWFkX2NoYW4oZGV2LCBzLCBjaGFuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3VicHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKLQl9Ci0JcmV0dXJuIGluc24tPm47Ci19Ci0KLXN0YXRpYyBpbnQgZGlvMjAwX3N1YmRldl84MjU0X3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGludCBuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJwcml2LT5zcGlubG9jaywgZmxhZ3MpOwotCQlkaW8yMDBfc3ViZGV2XzgyNTRfd3JpdGVfY2hhbihkZXYsIHMsIGNoYW4sIGRhdGFbbl0pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJwcml2LT5zcGlubG9jaywgZmxhZ3MpOwotCX0KLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotc3RhdGljIGludCBkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X2dhdGVfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBnYXRlX3NyYykKLXsKLQljb25zdCBzdHJ1Y3QgZGlvMjAwX2JvYXJkICpib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXN0cnVjdCBkaW8yMDBfc3ViZGV2XzgyNTQgKnN1YnByaXYgPSBzLT5wcml2YXRlOwotCXVuc2lnbmVkIGNoYXIgYnl0ZTsKLQotCWlmICghYm9hcmQtPmhhc19jbGtfZ2F0X3NjZSkKLQkJcmV0dXJuIC0xOwotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQlpZiAoZ2F0ZV9zcmMgPiAoYm9hcmQtPmlzX3BjaWUgPyAzMSA6IDcpKQotCQlyZXR1cm4gLTE7Ci0KLQlzdWJwcml2LT5nYXRlX3NyY1tjb3VudGVyX251bWJlcl0gPSBnYXRlX3NyYzsKLQlieXRlID0gZ2F0X3NjZShzdWJwcml2LT53aGljaCwgY291bnRlcl9udW1iZXIsIGdhdGVfc3JjKTsKLQlkaW8yMDBfd3JpdGU4KGRldiwgc3VicHJpdi0+Z2F0X3NjZV9vZnMsIGJ5dGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGlvMjAwX3N1YmRldl84MjU0X2dldF9nYXRlX3NyYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgdW5zaWduZWQgaW50IGNvdW50ZXJfbnVtYmVyKQotewotCWNvbnN0IHN0cnVjdCBkaW8yMDBfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0KLQlpZiAoIWJvYXJkLT5oYXNfY2xrX2dhdF9zY2UpCi0JCXJldHVybiAtMTsKLQlpZiAoY291bnRlcl9udW1iZXIgPiAyKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gc3VicHJpdi0+Z2F0ZV9zcmNbY291bnRlcl9udW1iZXJdOwotfQotCi1zdGF0aWMgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9zZXRfY2xvY2tfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X2dhdGVfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCQkJICAgIHVuc2lnbmVkIGludCBjbG9ja19zcmMpCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgY2hhbiwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBzcmMpCiB7Ci0JY29uc3Qgc3RydWN0IGRpbzIwMF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBjaGFyIGJ5dGU7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGRpbzIwMF9zdWJkZXZfODI1NF9vZmZzZXQoZGV2LCBzKTsKIAotCWlmICghYm9hcmQtPmhhc19jbGtfZ2F0X3NjZSkKLQkJcmV0dXJuIC0xOwotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQlpZiAoY2xvY2tfc3JjID4gKGJvYXJkLT5pc19wY2llID8gMzEgOiA3KSkKLQkJcmV0dXJuIC0xOwotCi0Jc3VicHJpdi0+Y2xvY2tfc3JjW2NvdW50ZXJfbnVtYmVyXSA9IGNsb2NrX3NyYzsKLQlieXRlID0gY2xrX3NjZShzdWJwcml2LT53aGljaCwgY291bnRlcl9udW1iZXIsIGNsb2NrX3NyYyk7Ci0JZGlvMjAwX3dyaXRlOChkZXYsIHN1YnByaXYtPmNsa19zY2Vfb2ZzLCBieXRlKTsKLQotCXJldHVybiAwOworCWRpbzIwMF93cml0ZTgoZGV2LCBESU8yMDBfR0FUX1NDRShvZmZzZXQgPj4gMyksCisJCSAgICAgIGdhdF9zY2UoKG9mZnNldCA+PiAyKSAmIDEsIGNoYW4sIHNyYykpOwogfQogCi1zdGF0aWMgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9nZXRfY2xvY2tfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkJICAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCQkJICAgIHVuc2lnbmVkIGludCAqcGVyaW9kX25zKQorc3RhdGljIHZvaWQgZGlvMjAwX3N1YmRldl84MjU0X3NldF9jbG9ja19zcmMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3JjKQogewotCWNvbnN0IHN0cnVjdCBkaW8yMDBfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0JdW5zaWduZWQgY2xvY2tfc3JjOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBkaW8yMDBfc3ViZGV2XzgyNTRfb2Zmc2V0KGRldiwgcyk7CiAKLQlpZiAoIWJvYXJkLT5oYXNfY2xrX2dhdF9zY2UpCi0JCXJldHVybiAtMTsKLQlpZiAoY291bnRlcl9udW1iZXIgPiAyKQotCQlyZXR1cm4gLTE7Ci0KLQljbG9ja19zcmMgPSBzdWJwcml2LT5jbG9ja19zcmNbY291bnRlcl9udW1iZXJdOwotCSpwZXJpb2RfbnMgPSBjbG9ja19wZXJpb2RbY2xvY2tfc3JjXTsKLQlyZXR1cm4gY2xvY2tfc3JjOworCWRpbzIwMF93cml0ZTgoZGV2LCBESU8yMDBfQ0xLX1NDRShvZmZzZXQgPj4gMyksCisJCSAgICAgIGNsa19zY2UoKG9mZnNldCA+PiAyKSAmIDEsIGNoYW4sIHNyYykpOwogfQogCiBzdGF0aWMgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTY1OCw1NCArNTE2LDQ0IEBACiAJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IHN0cnVjdCBkaW8yMDBfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7CisJc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCA9IHMtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwl1bnNpZ25lZCBpbnQgbWF4X3NyYyA9IGJvYXJkLT5pc19wY2llID8gMzEgOiA3OworCXVuc2lnbmVkIGludCBzcmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3VicHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAoIWJvYXJkLT5oYXNfY2xrX2dhdF9zY2UpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3dpdGNoIChkYXRhWzBdKSB7Ci0JY2FzZSBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFOgotCQlpZiAoZGF0YVsxXSA+IChJODI1NF9NT0RFNSB8IEk4MjU0X0JDRCkpCi0JCQlyZXQgPSAtRUlOVkFMOwotCQllbHNlCi0JCQlkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X21vZGUoZGV2LCBzLCBjaGFuLCBkYXRhWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTOgotCQlkYXRhWzFdID0gZGlvMjAwX3N1YmRldl84MjU0X3N0YXR1cyhkZXYsIHMsIGNoYW4pOwotCQlicmVhazsKIAljYXNlIElOU05fQ09ORklHX1NFVF9HQVRFX1NSQzoKLQkJcmV0ID0gZGlvMjAwX3N1YmRldl84MjU0X3NldF9nYXRlX3NyYyhkZXYsIHMsIGNoYW4sIGRhdGFbMl0pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldCA9IC1FSU5WQUw7CisJCXNyYyA9IGRhdGFbMl07CisJCWlmIChzcmMgPiBtYXhfc3JjKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZGlvMjAwX3N1YmRldl84MjU0X3NldF9nYXRlX3NyYyhkZXYsIHMsIGNoYW4sIHNyYyk7CisJCWk4MjU0LT5nYXRlX3NyY1tjaGFuXSA9IHNyYzsKIAkJYnJlYWs7CiAJY2FzZSBJTlNOX0NPTkZJR19HRVRfR0FURV9TUkM6Ci0JCXJldCA9IGRpbzIwMF9zdWJkZXZfODI1NF9nZXRfZ2F0ZV9zcmMoZGV2LCBzLCBjaGFuKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlkYXRhWzJdID0gcmV0OworCQlkYXRhWzJdID0gaTgyNTQtPmdhdGVfc3JjW2NoYW5dOwogCQlicmVhazsKIAljYXNlIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkM6Ci0JCXJldCA9IGRpbzIwMF9zdWJkZXZfODI1NF9zZXRfY2xvY2tfc3JjKGRldiwgcywgY2hhbiwgZGF0YVsxXSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJc3JjID0gZGF0YVsxXTsKKwkJaWYgKHNyYyA+IG1heF9zcmMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X2Nsb2NrX3NyYyhkZXYsIHMsIGNoYW4sIHNyYyk7CisJCWk4MjU0LT5jbG9ja19zcmNbY2hhbl0gPSBzcmM7CiAJCWJyZWFrOwogCWNhc2UgSU5TTl9DT05GSUdfR0VUX0NMT0NLX1NSQzoKLQkJcmV0ID0gZGlvMjAwX3N1YmRldl84MjU0X2dldF9jbG9ja19zcmMoZGV2LCBzLCBjaGFuLCAmZGF0YVsyXSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGF0YVsxXSA9IHJldDsKKwkJZGF0YVsxXSA9IGk4MjU0LT5jbG9ja19zcmNbY2hhbl07CisJCWRhdGFbMl0gPSBjbG9ja19wZXJpb2RbaTgyNTQtPmNsb2NrX3NyY1tjaGFuXV07CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3VicHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IGluc24tPm47CisKKwlyZXR1cm4gaW5zbi0+bjsKIH0KIAogc3RhdGljIGludCBkaW8yMDBfc3ViZGV2XzgyNTRfaW5pdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNzEzLDM2ICs1NjEsNDYgQEAKIAkJCQkgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCWNvbnN0IHN0cnVjdCBkaW8yMDBfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdjsKLQl1bnNpZ25lZCBpbnQgY2hhbjsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0OworCXVuc2lnbmVkIGludCByZWdzaGlmdDsKKwlpbnQgY2hhbjsKIAotCXN1YnByaXYgPSBjb21lZGlfYWxsb2Nfc3ByaXYocywgc2l6ZW9mKCpzdWJwcml2KSk7Ci0JaWYgKCFzdWJwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKLQlzLT5uX2NoYW4gPSAzOwotCXMtPm1heGRhdGEgPSAweEZGRkY7Ci0Jcy0+aW5zbl9yZWFkID0gZGlvMjAwX3N1YmRldl84MjU0X3JlYWQ7Ci0Jcy0+aW5zbl93cml0ZSA9IGRpbzIwMF9zdWJkZXZfODI1NF93cml0ZTsKLQlzLT5pbnNuX2NvbmZpZyA9IGRpbzIwMF9zdWJkZXZfODI1NF9jb25maWc7Ci0KLQlzcGluX2xvY2tfaW5pdCgmc3VicHJpdi0+c3BpbmxvY2spOwotCXN1YnByaXYtPm9mcyA9IG9mZnNldDsKLQlpZiAoYm9hcmQtPmhhc19jbGtfZ2F0X3NjZSkgewotCQkvKiBEZXJpdmUgQ0xLX1NDRSBhbmQgR0FUX1NDRSByZWdpc3RlciBvZmZzZXRzIGZyb20KLQkJICogODI1NCBvZmZzZXQuICovCi0JCXN1YnByaXYtPmNsa19zY2Vfb2ZzID0gRElPMjAwX1hDTEtfU0NFICsgKG9mZnNldCA+PiAzKTsKLQkJc3VicHJpdi0+Z2F0X3NjZV9vZnMgPSBESU8yMDBfWEdBVF9TQ0UgKyAob2Zmc2V0ID4+IDMpOwotCQlzdWJwcml2LT53aGljaCA9IChvZmZzZXQgPj4gMikgJiAxOworCS8qCisJICogUENJZSBib2FyZHMgbmVlZCB0aGUgb2Zmc2V0IHNoaWZ0ZWQgaW4gb3JkZXIgdG8gZ2V0IHRoZQorCSAqIGNvcnJlY3QgYmFzZSBhZGRyZXNzIG9mIHRoZSB0aW1lci4KKwkgKi8KKwlpZiAoYm9hcmQtPmlzX3BjaWUpIHsKKwkJb2Zmc2V0IDw8PSAzOworCQlyZWdzaGlmdCA9IDM7CisJfSBlbHNlIHsKKwkJcmVnc2hpZnQgPSAwOwogCX0KIAorCWlmIChkZXYtPm1taW8pCisJCWk4MjU0ID0gY29tZWRpXzgyNTRfbW1faW5pdChkZXYtPm1taW8gKyBvZmZzZXQsCisJCQkJCSAgICAwLCBJODI1NF9JTzgsIHJlZ3NoaWZ0KTsKKwllbHNlCisJCWk4MjU0ID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIG9mZnNldCwKKwkJCQkJIDAsIEk4MjU0X0lPOCwgcmVnc2hpZnQpOworCWlmICghaTgyNTQpCisJCXJldHVybiAtRU5PTUVNOworCisJY29tZWRpXzgyNTRfc3ViZGV2aWNlX2luaXQocywgaTgyNTQpOworCisJaTgyNTQtPmluc25fY29uZmlnID0gZGlvMjAwX3N1YmRldl84MjU0X2NvbmZpZzsKKworCS8qCisJICogVGhlcmUgY291bGQgYmUgbXVsdGlwbGUgdGltZXJzIHNvIHRoaXMgZHJpdmVyIGRvZXMgbm90CisJICogdXNlIGRldi0+cGFjZXIgdG8gc2F2ZSB0aGUgaTgyNTQgcG9pbnRlci4gSW5zdGVhZCwKKwkgKiBjb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdCgpIHNhdmVkIHRoZSBpODI1NCBwb2ludGVyIGluCisJICogcy0+cHJpdmF0ZS4gU2V0IHRoZSBydW5mbGFnIGJpdCBzbyB0aGF0IHRoZSBjb3JlIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IGZyZWUgaXQgd2hlbiB0aGUgZHJpdmVyIGlzIGRldGFjaGVkLgorCSAqLworCXMtPnJ1bmZsYWdzIHw9IENPTUVESV9TUkZfRlJFRV9TUFJJVjsKKwogCS8qIEluaXRpYWxpemUgY2hhbm5lbHMuICovCi0JZm9yIChjaGFuID0gMDsgY2hhbiA8IDM7IGNoYW4rKykgewotCQlkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X21vZGUoZGV2LCBzLCBjaGFuLAotCQkJCQkgICAgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCQlpZiAoYm9hcmQtPmhhc19jbGtfZ2F0X3NjZSkgeworCWlmIChib2FyZC0+aGFzX2Nsa19nYXRfc2NlKSB7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCAzOyBjaGFuKyspIHsKIAkJCS8qIEdhdGUgc291cmNlIDAgaXMgVkNDIChsb2dpYyAxKS4gKi8KIAkJCWRpbzIwMF9zdWJkZXZfODI1NF9zZXRfZ2F0ZV9zcmMoZGV2LCBzLCBjaGFuLCAwKTsKIAkJCS8qIENsb2NrIHNvdXJjZSAwIGlzIHRoZSBkZWRpY2F0ZWQgY2xvY2sgaW5wdXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9wY2kuYwppbmRleCBiODNkMWY1Li5kOTg1MGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfcGNpLmMKQEAgLTIyMSwxMCArMjIxLDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICJhbXBsY19kaW8yMDAuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2X2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2X2NvbW1vbi5jCmluZGV4IGJlODcxNzIuLjI0NWY5MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzIzNl9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyMzZfY29tbW9uLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImFtcGxjX3BjMjM2LmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiODI1NS5oIgogCiBzdGF0aWMgdm9pZCBwYzIzNl9pbnRyX3VwZGF0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBib29sIGVuYWJsZSkKQEAgLTgyLDExICs4MSwxMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwpAQCAtOTYsMTEgKzk1LDEyIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGl0IGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMTk1LDcgKzE5NSw2IEBACiB9CiBtb2R1bGVfZXhpdChhbXBsY19wYzIzNl9jb21tb25fZXhpdCk7CiAKLQogTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkgaGVscGVyIGZvciBhbXBsY19wYzIzNiBhbmQgYW1wbGNfcGNpMjM2Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMKaW5kZXggOTI0YzgyOS4uMDhhOTE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMjQuYwpAQCAtMTAzLDIyICsxMDMsMTcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qCiAgKiBQQ0kyMjQvMjM0IGkvbyBzcGFjZSAxIChQQ0lCQVIyKSByZWdpc3RlcnMuCiAgKi8KLSNkZWZpbmUgUENJMjI0X1oyX0NUMAkweDE0CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgMCAqLwotI2RlZmluZSBQQ0kyMjRfWjJfQ1QxCTB4MTUJLyogODJDNTQgY291bnRlci90aW1lciAxICovCi0jZGVmaW5lIFBDSTIyNF9aMl9DVDIJMHgxNgkvKiA4MkM1NCBjb3VudGVyL3RpbWVyIDIgKi8KLSNkZWZpbmUgUENJMjI0X1oyX0NUQwkweDE3CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgY29udHJvbCB3b3JkICovCisjZGVmaW5lIFBDSTIyNF9aMl9CQVNFCTB4MTQJLyogODJDNTQgY291bnRlci90aW1lciAqLwogI2RlZmluZSBQQ0kyMjRfWkNMS19TQ0UJMHgxQQkvKiBHcm91cCBaIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgUENJMjI0X1pHQVRfU0NFCTB4MUQJLyogR3JvdXAgWiBHYXRlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgUENJMjI0X0lOVF9TQ0UJMHgxRQkvKiBJU1IgSW50ZXJydXB0IHNvdXJjZSBtYXNrIHJlZ2lzdGVyICovCkBAIC0zNzksOCArMzc0LDYgQEAKIAlpbnQgaW50cl9jcHVpZDsKIAlzaG9ydCBpbnRyX3J1bm5pbmc7CiAJdW5zaWduZWQgc2hvcnQgZGFjY29uOwotCXVuc2lnbmVkIGludCBjYWNoZWRfZGl2MTsKLQl1bnNpZ25lZCBpbnQgY2FjaGVkX2RpdjI7CiAJdW5zaWduZWQgc2hvcnQgYW9fZW5hYjsJLyogbWF4IDE2IGNoYW5uZWxzIHNvICdzaG9ydCcgd2lsbCBkbyAqLwogCXVuc2lnbmVkIGNoYXIgaW50c2NlOwogfTsKQEAgLTQ1MSw3ICs0NDQsNiBAQAogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFPX0NNRF9TVEFSVEVELCAmZGV2cHJpdi0+c3RhdGUpKQogCQlyZXR1cm47CiAKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZwcml2LT5hb19zcGlubG9jaywgZmxhZ3MpOwogCS8qIEtpbGwgdGhlIGludGVycnVwdHMuICovCiAJZGV2cHJpdi0+aW50c2NlID0gMDsKQEAgLTY2OCwyOCArNjYwLDI3IEBACiBwY2kyMjRfYW9fY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCXN0cnVjdCBwY2kyMjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQgYXJnOwogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCi0JCQkJICAgICBUUklHX0VYVCB8IFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywKLQkJCQkgICAgIFRSSUdfQ09VTlQgfCBUUklHX0VYVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJCQkJCVRSSUdfRVhUIHwgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAorCQkJCQlUUklHX0NPVU5UIHwgVFJJR19FWFQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTcxNCw3ICs3MDUsNyBAQAogCiAJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgewogCWNhc2UgVFJJR19JTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCQlicmVhazsKIAljYXNlIFRSSUdfRVhUOgogCQkvKiBGb3JjZSB0byBleHRlcm5hbCB0cmlnZ2VyIDAuICovCkBAIC03MzQsMTMgKzcyNSwxMyBAQAogCiAJc3dpdGNoIChjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CiAJY2FzZSBUUklHX1RJTUVSOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBNQVhfU0NBTl9QRVJJT0QpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBNQVhfU0NBTl9QRVJJT0QpOwogCiAJCWFyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuICogQ09OVkVSVF9QRVJJT0Q7CiAJCWlmIChhcmcgPCBNSU5fU0NBTl9QRVJJT0QpCiAJCQlhcmcgPSBNSU5fU0NBTl9QRVJJT0Q7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0VYVDoKIAkJLyogRm9yY2UgdG8gZXh0ZXJuYWwgdHJpZ2dlciAwLiAqLwpAQCAtNzYwLDEyICs3NTEsMTMgQEAKIAkJYnJlYWs7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CiAJY2FzZSBUUklHX0NPVU5UOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0VYVDoKIAkJLyogRm9yY2UgdG8gZXh0ZXJuYWwgdHJpZ2dlciAwLiAqLwpAQCAtNzgxLDcgKzc3Myw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBUUklHX05PTkU6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAkJYnJlYWs7CiAJfQogCkBAIC03OTMsMTEgKzc4NSw4IEBACiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCQkvKiBVc2UgdHdvIHRpbWVycy4gKi8KLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGV2cHJpdi0+Y2FjaGVkX2RpdjEsCi0JCQkJCSAgJmRldnByaXYtPmNhY2hlZF9kaXYyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC04MTcsNyArODA2LDYgQEAKIAkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBwY2kyMjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXZwcml2LT5pb2Jhc2UxICsgUENJMjI0X1oyX0NUMDsKIAogCS8qCiAJICogVGhlIG91dHB1dCBvZiB0aW1lciBaMi0wIHdpbGwgYmUgdXNlZCBhcyB0aGUgc2NhbiB0cmlnZ2VyCkBAIC04MzAsMTQgKzgxOCwxMCBAQAogCW91dGIoR0FUX0NPTkZJRygyLCBHQVRfVkNDKSwgZGV2cHJpdi0+aW9iYXNlMSArIFBDSTIyNF9aR0FUX1NDRSk7CiAJLyogWjItMiBuZWVkcyAxMCBNSHogY2xvY2suICovCiAJb3V0YihDTEtfQ09ORklHKDIsIENMS18xME1IWiksIGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMjRfWkNMS19TQ0UpOwotCS8qIExvYWQgWjItMiBtb2RlICgyKSBhbmQgY291bnRlciAoZGl2MSkuICovCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmNhY2hlZF9kaXYxKTsKIAkvKiBaMi0wIGlzIGNsb2NrZWQgZnJvbSBaMi0yJ3Mgb3V0cHV0LiAqLwogCW91dGIoQ0xLX0NPTkZJRygwLCBDTEtfT1VUTk0xKSwgZGV2cHJpdi0+aW9iYXNlMSArIFBDSTIyNF9aQ0xLX1NDRSk7Ci0JLyogTG9hZCBaMi0wIG1vZGUgKDIpIGFuZCBjb3VudGVyIChkaXYyKS4gKi8KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMCwgZGV2cHJpdi0+Y2FjaGVkX2RpdjIpOworCisJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDIsIDAsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludCBwY2kyMjRfYW9fY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQpAQCAtODUyLDEwICs4MzYsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBDYW5ub3QgaGFuZGxlIG51bGwvZW1wdHkgY2hhbmxpc3QuICovCi0JaWYgKGNtZC0+Y2hhbmxpc3QgPT0gTlVMTCB8fCBjbWQtPmNoYW5saXN0X2xlbiA9PSAwKQorCWlmICghY21kLT5jaGFubGlzdCB8fCBjbWQtPmNoYW5saXN0X2xlbiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCiAJLyogRGV0ZXJtaW5lIHdoaWNoIGNoYW5uZWxzIGFyZSBlbmFibGVkIGFuZCB0aGVpciBsb2FkIG9yZGVyLiAgKi8KIAlkZXZwcml2LT5hb19lbmFiID0gMDsKIApAQCAtODkzLDggKzg3NiwxMCBAQAogCW91dHcoZGV2cHJpdi0+ZGFjY29uIHwgUENJMjI0X0RBQ0NPTl9GSUZPUkVTRVQsCiAJICAgICBkZXYtPmlvYmFzZSArIFBDSTIyNF9EQUNDT04pOwogCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKIAkJcGNpMjI0X2FvX3N0YXJ0X3BhY2VyKGRldiwgcyk7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldnByaXYtPmFvX3NwaW5sb2NrLCBmbGFncyk7CiAJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfSU5UKSB7CkBAIC0xMDQyLDE0ICsxMDI3LDEyIEBACiAJaWYgKCFkZXZwcml2LT5hb19zY2FuX3ZhbHMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0KIAkvKiBBbGxvY2F0ZSBidWZmZXIgdG8gaG9sZCBBTyBjaGFubmVsIHNjYW4gb3JkZXIuICovCiAJZGV2cHJpdi0+YW9fc2Nhbl9vcmRlciA9IGttYWxsb2Moc2l6ZW9mKGRldnByaXYtPmFvX3NjYW5fb3JkZXJbMF0pICoKIAkJCQkJIHRoaXNib2FyZC0+YW9fY2hhbnMsIEdGUF9LRVJORUwpOwogCWlmICghZGV2cHJpdi0+YW9fc2Nhbl9vcmRlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQogCS8qIERpc2FibGUgaW50ZXJydXB0IHNvdXJjZXMuICovCiAJZGV2cHJpdi0+aW50c2NlID0gMDsKIAlvdXRiKDAsIGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMjRfSU5UX1NDRSk7CkBAIC0xMDYzLDYgKzEwNDYsMTEgQEAKIAlvdXR3KGRldnByaXYtPmRhY2NvbiB8IFBDSTIyNF9EQUNDT05fRklGT1JFU0VULAogCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0kyMjRfREFDQ09OKTsKIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMjRfWjJfQkFTRSwKKwkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8xME1IWiwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAxKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCmluZGV4IDQ5ODA2YTUuLjIwZDU5MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKQEAgLTE4MSwxNCArMTgxLDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICI4MjU1LmgiCiAKIC8qCkBAIC0yMDYsMTAgKzIwNCw2IEBACiAjZGVmaW5lIFBDSTIzMF9QUElfWF9DCQkweDAyCS8qIFVzZXIgUFBJICg4MkM1NSkgcG9ydCBDICovCiAjZGVmaW5lIFBDSTIzMF9QUElfWF9DTUQJMHgwMwkvKiBVc2VyIFBQSSAoODJDNTUpIGNvbnRyb2wgd29yZCAqLwogI2RlZmluZSBQQ0kyMzBfWjJfQ1RfQkFTRQkweDE0CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgYmFzZSAqLwotI2RlZmluZSBQQ0kyMzBfWjJfQ1QwCQkweDE0CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgMCAqLwotI2RlZmluZSBQQ0kyMzBfWjJfQ1QxCQkweDE1CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgMSAqLwotI2RlZmluZSBQQ0kyMzBfWjJfQ1QyCQkweDE2CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgMiAqLwotI2RlZmluZSBQQ0kyMzBfWjJfQ1RDCQkweDE3CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgY29udHJvbCB3b3JkICovCiAjZGVmaW5lIFBDSTIzMF9aQ0xLX1NDRQkJMHgxQQkvKiBHcm91cCBaIENsb2NrIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgUENJMjMwX1pHQVRfU0NFCQkweDFECS8qIEdyb3VwIFogR2F0ZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIFBDSTIzMF9JTlRfU0NFCQkweDFFCS8qIEludGVycnVwdCBzb3VyY2UgbWFzayAodykgKi8KQEAgLTM3NywxMiArMzcxLDYgQEAKICNkZWZpbmUgQ0xLX0VYVAkJNwkvKiBleHRlcm5hbCBjbG9jayAqLwogLyogTWFjcm8gdG8gY29uc3RydWN0IGNsb2NrIGlucHV0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUuICovCiAjZGVmaW5lIENMS19DT05GSUcoY2hhbiwgc3JjKQkoKCgoY2hhbikgJiAzKSA8PCAzKSB8ICgoc3JjKSAmIDcpKQotLyogVGltZWJhc2VzIGluIG5zLiAqLwotI2RlZmluZSBUSU1FQkFTRV8xME1IWgkJMTAwCi0jZGVmaW5lIFRJTUVCQVNFXzFNSFoJCTEwMDAKLSNkZWZpbmUgVElNRUJBU0VfMTAwS0haCQkxMDAwMAotI2RlZmluZSBUSU1FQkFTRV8xMEtIWgkJMTAwMDAwCi0jZGVmaW5lIFRJTUVCQVNFXzFLSFoJCTEwMDAwMDAKIAogLyoKICAqIENvdW50ZXIvdGltZXIgZ2F0ZSBpbnB1dCBjb25maWd1cmF0aW9uIHNvdXJjZXMuCkBAIC01MDcsMTEgKzQ5NSwxMSBAQAogCiAvKiBQQ0kyMzAgY2xvY2sgc291cmNlIHBlcmlvZHMgaW4gbnMgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpMjMwX3RpbWViYXNlWzhdID0gewotCVtDTEtfMTBNSFpdID0gVElNRUJBU0VfMTBNSFosCi0JW0NMS18xTUhaXSA9IFRJTUVCQVNFXzFNSFosCi0JW0NMS18xMDBLSFpdID0gVElNRUJBU0VfMTAwS0haLAotCVtDTEtfMTBLSFpdID0gVElNRUJBU0VfMTBLSFosCi0JW0NMS18xS0haXSA9IFRJTUVCQVNFXzFLSFosCisJW0NMS18xME1IWl0JPSBJODI1NF9PU0NfQkFTRV8xME1IWiwKKwlbQ0xLXzFNSFpdCT0gSTgyNTRfT1NDX0JBU0VfMU1IWiwKKwlbQ0xLXzEwMEtIWl0JPSBJODI1NF9PU0NfQkFTRV8xMDBLSFosCisJW0NMS18xMEtIWl0JPSBJODI1NF9PU0NfQkFTRV8xMEtIWiwKKwlbQ0xLXzFLSFpdCT0gSTgyNTRfT1NDX0JBU0VfMUtIWiwKIH07CiAKIC8qIFBDSTIzMCBhbmFsb2d1ZSBpbnB1dCByYW5nZSB0YWJsZSAqLwpAQCAtNjk1LDcgKzY4Myw3IEBACiAJdW5zaWduZWQgaW50IGNvdW50OwogCiAJLyogU2V0IG1vZGUuICovCi0JaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwgY3QsIG1vZGUpOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIGN0LCBtb2RlKTsKIAkvKiBEZXRlcm1pbmUgY2xvY2sgc291cmNlIGFuZCBjb3VudC4gKi8KIAljbGtfc3JjID0gcGNpMjMwX2Nob29zZV9jbGtfY291bnQobnMsICZjb3VudCwgZmxhZ3MpOwogCS8qIFByb2dyYW0gY2xvY2sgc291cmNlLiAqLwpAQCAtNzA0LDEzICs2OTIsMTMgQEAKIAlpZiAoY291bnQgPj0gNjU1MzYpCiAJCWNvdW50ID0gMDsKIAotCWk4MjU0X3dyaXRlKGRldi0+aW9iYXNlICsgUENJMjMwX1oyX0NUX0JBU0UsIDAsIGN0LCBjb3VudCk7CisJY29tZWRpXzgyNTRfd3JpdGUoZGV2LT5wYWNlciwgY3QsIGNvdW50KTsKIH0KIAogc3RhdGljIHZvaWQgcGNpMjMwX2NhbmNlbF9jdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY3QpCiB7Ci0JaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwgY3QsIEk4MjU0X01PREUxKTsKIAkvKiBDb3VudGVyIGN0LCA4MjU0IG1vZGUgMSwgaW5pdGlhbCBjb3VudCBub3Qgd3JpdHRlbi4gKi8KKwljb21lZGlfODI1NF9zZXRfbW9kZShkZXYtPnBhY2VyLCBjdCwgSTgyNTRfTU9ERTEpOwogfQogCiBzdGF0aWMgaW50IHBjaTIzMF9haV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTc2MCw3ICs3NDgsNyBAQAogCSAqLwogCWFkY2NvbiA9IFBDSTIzMF9BRENfVFJJR19aMkNUMiB8IFBDSTIzMF9BRENfRklGT19FTjsKIAkvKiBTZXQgWjItQ1QyIG91dHB1dCBsb3cgdG8gYXZvaWQgYW55IGZhbHNlIHRyaWdnZXJzLiAqLwotCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENJMjMwX1oyX0NUX0JBU0UsIDAsIDIsIEk4MjU0X01PREUwKTsKKwljb21lZGlfODI1NF9zZXRfbW9kZShkZXYtPnBhY2VyLCAyLCBJODI1NF9NT0RFMCk7CiAJZGV2cHJpdi0+YWlfYmlwb2xhciA9IGNvbWVkaV9yYW5nZV9pc19iaXBvbGFyKHMsIHJhbmdlKTsKIAlpZiAoYXJlZiA9PSBBUkVGX0RJRkYpIHsKIAkJLyogRGlmZmVyZW50aWFsLiAqLwpAQCAtODExLDEwICs3OTksOCBAQAogCQkgKiBUcmlnZ2VyIGNvbnZlcnNpb24gYnkgdG9nZ2xpbmcgWjItQ1QyIG91dHB1dAogCQkgKiAoZmluaXNoIHdpdGggb3V0cHV0IGhpZ2gpLgogCQkgKi8KLQkJaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwKLQkJCSAgICAgICAyLCBJODI1NF9NT0RFMCk7Ci0JCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENJMjMwX1oyX0NUX0JBU0UsIDAsCi0JCQkgICAgICAgMiwgSTgyNTRfTU9ERTEpOworCQljb21lZGlfODI1NF9zZXRfbW9kZShkZXYtPnBhY2VyLCAyLCBJODI1NF9NT0RFMCk7CisJCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDIsIEk4MjU0X01PREUxKTsKIAogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwogCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIHBjaTIzMF9haV9lb2MsIDApOwpAQCAtODk4LDcgKzg4NCw3IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7CiAKIAl0bXAgPSBUUklHX1RJTUVSIHwgVFJJR19JTlQ7CiAJaWYgKHRoaXNib2FyZC0+bWluX2h3dmVyID4gMCAmJiBkZXZwcml2LT5od3ZlciA+PSAyKSB7CkBAIC05MTgsMTkgKzkwNCwxOSBAQAogCQkgKi8KIAkJdG1wIHw9IFRSSUdfRVhUOwogCX0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCB0bXApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIHRtcCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtOTM5LDcgKzkyNSw3IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAjZGVmaW5lIE1BWF9TUEVFRF9BTwk4MDAwCS8qIDgwMDAgbnMgPT4gMTI1IGtIeiAqLwogLyoKQEAgLTk1MCwxMCArOTM2LDEwIEBACiAKIAlzd2l0Y2ggKGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKIAljYXNlIFRSSUdfVElNRVI6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIE1BWF9TUEVFRF9BTyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIE1JTl9TUEVFRF9BTyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIE1BWF9TUEVFRF9BTyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIE1JTl9TUEVFRF9BTyk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6CiAJCS8qCkBAIC05NzgsMTYgKzk2NCwxNyBAQAogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAkJYnJlYWs7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0xNTIwLDcgKzE1MDcsNyBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKIAogCXRtcCA9IFRSSUdfRk9MTE9XIHwgVFJJR19USU1FUiB8IFRSSUdfSU5UOwogCWlmICh0aGlzYm9hcmQtPmhhdmVfZGlvIHx8IHRoaXNib2FyZC0+bWluX2h3dmVyID4gMCkgewpAQCAtMTUzMiwyMSArMTUxOSwyMSBAQAogCQkgKi8KIAkJdG1wIHw9IFRSSUdfRVhUOwogCX0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCB0bXApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgdG1wKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19JTlQgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMTU2Myw3ICsxNTUwLDcgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKICNkZWZpbmUgTUFYX1NQRUVEX0FJX1NFCQkzMjAwCS8qIFBDSTIzMCBTRTogICAzMjAwIG5zID0+IDMxMi41IGtIeiAqLwogI2RlZmluZSBNQVhfU1BFRURfQUlfRElGRgk4MDAwCS8qIFBDSTIzMCBESUZGOiA4MDAwIG5zID0+IDEyNSBrSHogKi8KQEAgLTE1OTgsMTAgKzE1ODUsMTAgQEAKIAkJCW1heF9zcGVlZF9haSA9IE1BWF9TUEVFRF9BSV9QTFVTOwogCQl9CiAKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgbWF4X3NwZWVkX2FpKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgTUlOX1NQRUVEX0FJKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgbWF4X3NwZWVkX2FpKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgTUlOX1NQRUVEX0FJKTsKIAl9IGVsc2UgaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpIHsKIAkJLyoKIAkJICogZXh0ZXJuYWwgdHJpZ2dlcgpAQCAtMTYzNiwxOCArMTYyMywyMCBAQAogCQkJICogY29udmVydF9hcmcgPT0gMCA9PiB0cmlnZ2VyIG9uIC12ZSBlZGdlLgogCQkJICogY29udmVydF9hcmcgPT0gMSA9PiB0cmlnZ2VyIG9uICt2ZSBlZGdlLgogCQkJICovCi0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywgMSk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCQkgICAgMSk7CiAJCX0KIAl9IGVsc2UgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQpIHsKIAkJLyoKQEAgLTE2NzIsNyArMTY2MSw3IEBACiAJCQllcnIgfD0gLUVJTlZBTDsKIAogCX0gZWxzZSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtMTc2Nyw4ICsxNzU2LDggQEAKIAkgKiBUcmlnZ2VyIGNvbnZlcnNpb24gYnkgdG9nZ2xpbmcgWjItQ1QyIG91dHB1dC4KIAkgKiBGaW5pc2ggd2l0aCBvdXRwdXQgaGlnaC4KIAkgKi8KLQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLCAyLCBJODI1NF9NT0RFMCk7Ci0JaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwgMiwgSTgyNTRfTU9ERTEpOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDIsIEk4MjU0X01PREUwKTsKKwljb21lZGlfODI1NF9zZXRfbW9kZShkZXYtPnBhY2VyLCAyLCBJODI1NF9NT0RFMSk7CiAJLyoKIAkgKiBEZWxheS4gIFNob3VsZCBkcml2ZXIgYmUgcmVzcG9uc2libGUgZm9yIHRoaXM/ICBBbgogCSAqIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHdhaXQgdW50aWwgY29udmVyc2lvbiBpcyBjb21wbGV0ZSwKQEAgLTIxODksNyArMjE3OCw3IEBACiAJICogU2V0IGNvdW50ZXIvdGltZXIgMiBvdXRwdXQgaGlnaCBmb3IgdXNlIGFzIHRoZSBpbml0aWFsIHN0YXJ0CiAJICogY29udmVyc2lvbiBzb3VyY2UuCiAJICovCi0JaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwgMiwgSTgyNTRfTU9ERTEpOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDIsIEk4MjU0X01PREUxKTsKIAogCS8qCiAJICogVGVtcG9yYXJpbHkgdXNlIENUMiBvdXRwdXQgYXMgY29udmVyc2lvbiB0cmlnZ2VyIHNvdXJjZSBhbmQKQEAgLTIzOTMsNyArMjM4Miw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmRldnByaXYtPmFvX3N0b3Bfc3BpbmxvY2spOwogCiAJZGV2LT5ib2FyZF9wdHIgPSBwY2kyMzBfZmluZF9wY2lfYm9hcmQocGNpX2Rldik7Ci0JaWYgKGRldi0+Ym9hcmRfcHRyID09IE5VTEwpIHsKKwlpZiAoIWRldi0+Ym9hcmRfcHRyKSB7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkiYW1wbGNfcGNpMjMwOiBCVUchIGNhbm5vdCBkZXRlcm1pbmUgYm9hcmQgdHlwZSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0ODEsNiArMjQ3MCwxMSBAQAogCQkJZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CiAJfQogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwKKwkJCQkgICAgICAwLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyYyA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjM2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjM2LmMKaW5kZXggYWQxZTkzZC4uMzFjYzM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzYuYwpAQCAtNDIsMTAgKzQyLDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICJhbXBsY19wYzIzNi5oIgogI2luY2x1ZGUgInBseDkwNTIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyNjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyNjMuYwppbmRleCAwZDIyMjRiLi5iNjc2OGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjYzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jCkBAIC0zMyw5ICszMyw4IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKIHN0YXRpYyBpbnQgcGNpMjYzX2RvX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwppbmRleCAxMDc5YjZjLi5hZTg0ZjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYwpAQCAtMzAsOCArMzAsNiBAQAogQXV0aG9yOiBkcwogVXBkYXRlZDogTW9uLCAwNCBOb3YgMjAwMiAyMDowNDoyMSAtMDgwMAogU3RhdHVzOiBleHBlcmltZW50YWwKLQotCiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00MCwxNyArMzgsMTMgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaV9wY21jaWEuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAjZGVmaW5lIERBUzE2Q1NfQURDX0RBVEEJCTAKICNkZWZpbmUgREFTMTZDU19ESU9fTVVYCQkJMgogI2RlZmluZSBEQVMxNkNTX01JU0MxCQkJNAogI2RlZmluZSBEQVMxNkNTX01JU0MyCQkJNgotI2RlZmluZSBEQVMxNkNTX0NUUjAJCQk4Ci0jZGVmaW5lIERBUzE2Q1NfQ1RSMQkJCTEwCi0jZGVmaW5lIERBUzE2Q1NfQ1RSMgkJCTEyCi0jZGVmaW5lIERBUzE2Q1NfQ1RSX0NPTlRST0wJCTE0CisjZGVmaW5lIERBUzE2Q1NfVElNRVJfQkFTRQkJOAogI2RlZmluZSBEQVMxNkNTX0RJTwkJCTE2CiAKIHN0cnVjdCBkYXMxNmNzX2JvYXJkIHsKQEAgLTI3OSw2ICsyNzMsMTEgQEAKIAlpZiAoIWRldnByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBEQVMxNkNTX1RJTUVSX0JBU0UsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMTBNSFosIEk4MjU0X0lPMTYsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzLmMKaW5kZXggZGQwYzY1YS4uZTM1OTFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYwpAQCAtNjIsMTYgKzYyLDE0IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogI2luY2x1ZGUgIjgyNTUuaCIKICNpbmNsdWRlICJhbWNjX3M1OTMzLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAKICNkZWZpbmUgQUlfQlVGRkVSX1NJWkUJCTEwMjQJLyogbWF4IGFpIGZpZm8gc2l6ZSAqLwogI2RlZmluZSBBT19CVUZGRVJfU0laRQkJMTAyNAkvKiBtYXggYW8gZmlmbyBzaXplICovCkBAIC0zMzgsMTQgKzMzNiwxMiBAQAogfTsKIAogc3RydWN0IGNiX3BjaWRhc19wcml2YXRlIHsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmFvX3BhY2VyOwogCS8qIGJhc2UgYWRkcmVzc2VzICovCiAJdW5zaWduZWQgbG9uZyBzNTkzM19jb25maWc7CiAJdW5zaWduZWQgbG9uZyBjb250cm9sX3N0YXR1czsKIAl1bnNpZ25lZCBsb25nIGFkY19maWZvOwogCXVuc2lnbmVkIGxvbmcgYW9fcmVnaXN0ZXJzOwotCS8qIGRpdmlzb3JzIG9mIG1hc3RlciBjbG9jayBmb3IgYW5hbG9nIGlucHV0IHBhY2luZyAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yMTsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CiAJLyogYml0cyB0byB3cml0ZSB0byByZWdpc3RlcnMgKi8KIAl1bnNpZ25lZCBpbnQgYWRjX2ZpZm9fYml0czsKIAl1bnNpZ25lZCBpbnQgczU5MzNfaW50Y3NyX2JpdHM7CkBAIC0zNTMsOSArMzQ5LDYgQEAKIAkvKiBmaWZvIGJ1ZmZlcnMgKi8KIAl1bnNpZ25lZCBzaG9ydCBhaV9idWZmZXJbQUlfQlVGRkVSX1NJWkVdOwogCXVuc2lnbmVkIHNob3J0IGFvX2J1ZmZlcltBT19CVUZGRVJfU0laRV07Ci0JLyogZGl2aXNvcnMgb2YgbWFzdGVyIGNsb2NrIGZvciBhbmFsb2cgb3V0cHV0IHBhY2luZyAqLwotCXVuc2lnbmVkIGludCBhb19kaXZpc29yMTsKLQl1bnNpZ25lZCBpbnQgYW9fZGl2aXNvcjI7CiAJdW5zaWduZWQgaW50IGNhbGlicmF0aW9uX3NvdXJjZTsKIH07CiAKQEAgLTUzMCw3ICs1MjMsNyBAQAogfQogCiBzdGF0aWMgaW50IG52cmFtX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFkZHJlc3MsCi0JCQl1aW50OF90ICpkYXRhKQorCQkgICAgICB1aW50OF90ICpkYXRhKQogewogCXN0cnVjdCBjYl9wY2lkYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGlvYmFzZSA9IGRldnByaXYtPnM1OTMzX2NvbmZpZzsKQEAgLTc3OCwyOSArNzcxLDI4IEBACiAJCQkJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAljb25zdCBzdHJ1Y3QgY2JfcGNpZGFzX2JvYXJkICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgY2JfcGNpZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX0ZPTExPVyB8IFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtODE5LDcgKzgxMSw3IEBACiAKIAlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CiAJY2FzZSBUUklHX05PVzoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6CiAJCS8qIEV4dGVybmFsIHRyaWdnZXIsIG9ubHkgQ1JfRURHRSBhbmQgQ1JfSU5WRVJUIGZsYWdzIGFsbG93ZWQgKi8KQEAgLTgzNiwyMCArODI4LDI0IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCXRoaXNib2FyZC0+YWlfc3BlZWQgKiBjbWQtPmNoYW5saXN0X2xlbik7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICB0aGlzYm9hcmQtPmFpX3NwZWVkICoKKwkJCQkJCSAgICBjbWQtPmNoYW5saXN0X2xlbik7CisJfQogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgdGhpc2JvYXJkLT5haV9zcGVlZCk7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKKwl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTg1OCwxOSArODU0LDEzIEBACiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMTBNSFosCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKQEAgLTg4NiwxOCArODc2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2JfcGNpZGFzX2FpX2xvYWRfY291bnRlcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgY2JfcGNpZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBBREM4MjU0OwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7Ci19Ci0KIHN0YXRpYyBpbnQgY2JfcGNpZGFzX2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewpAQCAtOTMzLDggKzkxMSwxMSBAQAogCW91dHcoYml0cywgZGV2cHJpdi0+Y29udHJvbF9zdGF0dXMgKyBBRENNVVhfQ09OVCk7CiAKIAkvKiAgbG9hZCBjb3VudGVycyAqLwotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgfHwgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQljYl9wY2lkYXNfYWlfbG9hZF9jb3VudGVycyhkZXYpOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgfHwKKwkgICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOworCX0KIAogCS8qICBlbmFibGUgaW50ZXJydXB0cyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CkBAIC0xMDA0LDI0ICs5ODUsMjMgQEAKIAljb25zdCBzdHJ1Y3QgY2JfcGNpZGFzX2JvYXJkICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKIAlzdHJ1Y3QgY2JfcGNpZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTEwMzAsMTggKzEwMTAsMjAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSB0aGlzYm9hcmQtPmFvX3NjYW5fc3BlZWQpOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgdGhpc2JvYXJkLT5hb19zY2FuX3NwZWVkKTsKKwl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTEwNDksMTIgKzEwMzEsMTEgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMTBNSFosCi0JCQkJCSAgJmRldnByaXYtPmFvX2Rpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5hb19kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJdW5zaWduZWQgaW50IGFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CisKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXZwcml2LT5hb19wYWNlciwKKwkJCQkJCSZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC0xMTM5LDE4ICsxMTIwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2JfcGNpZGFzX2FvX2xvYWRfY291bnRlcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgY2JfcGNpZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBEQUM4MjU0OwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmFvX2Rpdmlzb3IxKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5hb19kaXZpc29yMik7Ci19Ci0KIHN0YXRpYyBpbnQgY2JfcGNpZGFzX2FvX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewpAQCAtMTE4MCw4ICsxMTQ5LDEwIEBACiAJb3V0dygwLCBkZXZwcml2LT5hb19yZWdpc3RlcnMgKyBEQUNGSUZPQ0xSKTsKIAogCS8qICBsb2FkIGNvdW50ZXJzICovCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikKLQkJY2JfcGNpZGFzX2FvX2xvYWRfY291bnRlcnMoZGV2KTsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXZwcml2LT5hb19wYWNlcik7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXZwcml2LT5hb19wYWNlciwgMSwgMiwgdHJ1ZSk7CisJfQogCiAJLyogIHNldCBwYWNlciBzb3VyY2UgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwpAQCAtMTQwOCw2ICsxMzc5LDE3IEBACiAJfQogCWRldi0+aXJxID0gcGNpZGV2LT5pcnE7CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIEFEQzgyNTQsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMTBNSFosIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldnByaXYtPmFvX3BhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIERBQzgyNTQsCisJCQkJCSAgICAgSTgyNTRfT1NDX0JBU0VfMTBNSFosCisJCQkJCSAgICAgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldnByaXYtPmFvX3BhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE1MzAsOCArMTUxMiw5IEBACiAJCQlkYWMwOF93cml0ZShkZXYsIHMtPm1heGRhdGEgLyAyKTsKIAkJCXMtPnJlYWRiYWNrW2ldID0gcy0+bWF4ZGF0YSAvIDI7CiAJCX0KLQl9IGVsc2UKKwl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KIAogCS8qICBtYWtlIHN1cmUgbWFpbGJveCA0IGlzIGVtcHR5ICovCiAJaW5sKGRldnByaXYtPnM1OTMzX2NvbmZpZyArIEFNQ0NfT1BfUkVHX0lNQjQpOwpAQCAtMTU1MCw5ICsxNTMzLDExIEBACiB7CiAJc3RydWN0IGNiX3BjaWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0JaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+czU5MzNfY29uZmlnKSB7Ci0JCW91dGwoSU5UQ1NSX0lOQk9YX0lOVFJfU1RBVFVTLAotCQkgICAgIGRldnByaXYtPnM1OTMzX2NvbmZpZyArIEFNQ0NfT1BfUkVHX0lOVENTUik7CisJaWYgKGRldnByaXYpIHsKKwkJaWYgKGRldnByaXYtPnM1OTMzX2NvbmZpZykKKwkJCW91dGwoSU5UQ1NSX0lOQk9YX0lOVFJfU1RBVFVTLAorCQkJICAgICBkZXZwcml2LT5zNTkzM19jb25maWcgKyBBTUNDX09QX1JFR19JTlRDU1IpOworCQlrZnJlZShkZXZwcml2LT5hb19wYWNlcik7CiAJfQogCWNvbWVkaV9wY2lfZGV0YWNoKGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzNjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCmluZGV4IDViNDNlNGUuLmE5NGMzM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCkBAIC04MSwxNiArODEsMTMgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiODI1My5oIgogI2luY2x1ZGUgIjgyNTUuaCIKICNpbmNsdWRlICJwbHg5MDgwLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAKICNkZWZpbmUgVElNRVJfQkFTRSAyNQkJLyogIDQwTUh6IG1hc3RlciBjbG9jayAqLwogLyogMTAwa0h6ICdwcmVzY2FsZWQnIGNsb2NrIGZvciBzbG93IGFjcXVpc2l0aW9uLApAQCAtMTQ3NCw5ICsxNDcxLDggQEAKIAkJZGV2cHJpdi0+YWlfYnVmZmVyW2ldID0KIAkJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBjaWRldiwgRE1BX0JVRkZFUl9TSVpFLAogCQkJCQkgICAgICZkZXZwcml2LT5haV9idWZmZXJfYnVzX2FkZHJbaV0pOwotCQlpZiAoZGV2cHJpdi0+YWlfYnVmZmVyW2ldID09IE5VTEwpCisJCWlmICghZGV2cHJpdi0+YWlfYnVmZmVyW2ldKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0KIAl9CiAJZm9yIChpID0gMDsgaSA8IEFPX0RNQV9SSU5HX0NPVU5UOyBpKyspIHsKIAkJaWYgKGFvX2NtZF9pc19zdXBwb3J0ZWQodGhpc2JvYXJkKSkgewpAQCAtMTQ4NCw5ICsxNDgwLDggQEAKIAkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChwY2lkZXYsIERNQV9CVUZGRVJfU0laRSwKIAkJCQkJCSAgICAgJmRldnByaXYtPgogCQkJCQkJICAgICAgYW9fYnVmZmVyX2J1c19hZGRyW2ldKTsKLQkJCWlmIChkZXZwcml2LT5hb19idWZmZXJbaV0gPT0gTlVMTCkKKwkJCWlmICghZGV2cHJpdi0+YW9fYnVmZmVyW2ldKQogCQkJCXJldHVybiAtRU5PTUVNOwotCiAJCX0KIAl9CiAJLyogIGFsbG9jYXRlIGRtYSBkZXNjcmlwdG9ycyAqLwpAQCAtMTQ5NCw3ICsxNDg5LDcgQEAKIAkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpZGV2LCBzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykgKgogCQkJCSAgICAgYWlfZG1hX3JpbmdfY291bnQodGhpc2JvYXJkKSwKIAkJCQkgICAgICZkZXZwcml2LT5haV9kbWFfZGVzY19idXNfYWRkcik7Ci0JaWYgKGRldnByaXYtPmFpX2RtYV9kZXNjID09IE5VTEwpCisJaWYgKCFkZXZwcml2LT5haV9kbWFfZGVzYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoYW9fY21kX2lzX3N1cHBvcnRlZCh0aGlzYm9hcmQpKSB7CkBAIC0xNTAzLDcgKzE0OTgsNyBAQAogCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKSAqCiAJCQkJCSAgICAgQU9fRE1BX1JJTkdfQ09VTlQsCiAJCQkJCSAgICAgJmRldnByaXYtPmFvX2RtYV9kZXNjX2J1c19hZGRyKTsKLQkJaWYgKGRldnByaXYtPmFvX2RtYV9kZXNjID09IE5VTEwpCisJCWlmICghZGV2cHJpdi0+YW9fZG1hX2Rlc2MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJLyogIGluaXRpYWxpemUgZG1hIGRlc2NyaXB0b3JzICovCkBAIC0xNzA0LDggKzE2OTksNyBAQAogCiAJLyogIGdldCBhY2tub3dsZWRnZSAqLwogCWlmIChpMmNfcmVhZF9hY2soZGV2KSAhPSAwKSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlcyBmYWlsZWQ6IG5vIGFja25vd2xlZGdlXG4iLAotCQkJX19mdW5jX18pOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiZmFpbGVkOiBubyBhY2tub3dsZWRnZVxuIik7CiAJCWkyY19zdG9wKGRldik7CiAJCXJldHVybjsKIAl9CkBAIC0xNzEzLDggKzE3MDcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogCQlpMmNfd3JpdGVfYnl0ZShkZXYsIGRhdGFbaV0pOwogCQlpZiAoaTJjX3JlYWRfYWNrKGRldikgIT0gMCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzIGZhaWxlZDogbm8gYWNrbm93bGVkZ2VcbiIsCi0JCQkJX19mdW5jX18pOworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImZhaWxlZDogbm8gYWNrbm93bGVkZ2VcbiIpOwogCQkJaTJjX3N0b3AoZGV2KTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTg0MSw3ICsxODM0LDYgQEAKIAl9CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0KIAkJLyogIGNsZWFyIGFkYyBidWZmZXIgKGluc2lkZSBsb29wIGZvciA0MDIwIHNha2UpICovCiAJCXdyaXRldygwLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19CVUZGRVJfQ0xFQVJfUkVHKTsKIApAQCAtMTkwMyw3ICsxODk1LDYgQEAKIAkJcmV0dmFsID0gc2V0X2FpX2ZpZm9fc2l6ZShkZXYsIGZpZm9fc2l6ZSk7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJcmV0dXJuIHJldHZhbDsKLQogCX0KIAogCWJsb2NrX3NpemUgPSBhaV9maWZvX3NpemUoZGV2KSAvIGZpZm8tPm51bV9zZWdtZW50cyAqIGJ5dGVzX2luX3NhbXBsZTsKQEAgLTIwMDEsNyArMTk5Miw4IEBACiBzdGF0aWMgdm9pZCBjaGVja19hZGNfdGltaW5nKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJY29uc3Qgc3RydWN0IHBjaWRhczY0X2JvYXJkICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQl1bnNpZ25lZCBpbnQgY29udmVydF9kaXZpc29yID0gMCwgc2Nhbl9kaXZpc29yOworCXVuc2lnbmVkIGxvbmcgbG9uZyBjb252ZXJ0X2Rpdmlzb3IgPSAwOworCXVuc2lnbmVkIGludCBzY2FuX2Rpdmlzb3I7CiAJc3RhdGljIGNvbnN0IGludCBtaW5fY29udmVydF9kaXZpc29yID0gMzsKIAlzdGF0aWMgY29uc3QgaW50IG1heF9jb252ZXJ0X2Rpdmlzb3IgPQogCQltYXhfY291bnRlcl92YWx1ZSArIG1pbl9jb252ZXJ0X2Rpdmlzb3I7CkBAIC0yMDI3LDcgKzIwMTksNiBAQAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJc2Nhbl9kaXZpc29yID0gZ2V0X2Rpdmlzb3IoY21kLT5zY2FuX2JlZ2luX2FyZywgY21kLT5mbGFncyk7CiAJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJCS8qICBYWFggY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3dzICovCiAJCQltaW5fc2Nhbl9kaXZpc29yID0gY29udmVydF9kaXZpc29yICogY21kLT5jaGFubGlzdF9sZW47CiAJCQltYXhfc2Nhbl9kaXZpc29yID0KIAkJCQkoY29udmVydF9kaXZpc29yICogY21kLT5jaGFubGlzdF9sZW4gLSAxKSArCkBAIC0yMDk0LDM0ICsyMDg1LDM0IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOwogCiAJdHJpZ2dlcnMgPSBUUklHX1RJTUVSOwogCWlmICh0aGlzYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkKIAkJdHJpZ2dlcnMgfD0gVFJJR19PVEhFUjsKIAllbHNlCiAJCXRyaWdnZXJzIHw9IFRSSUdfRk9MTE9XOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIHRyaWdnZXJzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCB0cmlnZ2Vycyk7CiAKIAl0cmlnZ2VycyA9IFRSSUdfVElNRVI7CiAJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKQogCQl0cmlnZ2VycyB8PSBUUklHX05PVzsKIAllbHNlCiAJCXRyaWdnZXJzIHw9IFRSSUdfRVhUOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIHRyaWdnZXJzKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywKLQkJCQkgICAgIFRSSUdfQ09VTlQgfCBUUklHX0VYVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgdHJpZ2dlcnMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAorCQkJCQlUUklHX0NPVU5UIHwgVFJJR19FWFQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0yMTM1LDcgKzIxMjYsNyBAQAogCiAJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgewogCWNhc2UgVFJJR19OT1c6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCQlicmVhazsKIAljYXNlIFRSSUdfRVhUOgogCQkvKgpAQCAtMjE0NywzMCArMjEzOCwzNyBAQAogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlpZiAodGhpc2JvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzQwMjApIHsKLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCQkgICAwKTsKIAkJfSBlbHNlIHsKLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJCSB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKLQkJCS8qIGlmIHNjYW5zIGFyZSB0aW1lZCBmYXN0ZXIgdGhhbiBjb252ZXJzaW9uIHJhdGUgYWxsb3dzICovCi0JCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKAorCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkJICAgIHRoaXNib2FyZC0+CisJCQkJCQkJICAgIGFpX3NwZWVkKTsKKwkJCS8qCisJCQkgKiBpZiBzY2FucyBhcmUgdGltZWQgZmFzdGVyIHRoYW4gY29udmVyc2lvbiByYXRlCisJCQkgKiBhbGxvd3MKKwkJCSAqLworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKAogCQkJCQkJJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCiAJCQkJCQljbWQtPmNvbnZlcnRfYXJnICoKIAkJCQkJCWNtZC0+Y2hhbmxpc3RfbGVuKTsKKwkJCX0KIAkJfQogCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKIAljYXNlIFRSSUdfRVhUOgogCQlicmVhazsKIAljYXNlIFRSSUdfQ09VTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCQlicmVhazsKIAljYXNlIFRSSUdfTk9ORToKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTI2MzcsOCArMjYzNSw5IEBACiAJCWJpdHMgfD0gQURDX1NUQVJUX1RSSUdfRVhUX0JJVFM7CiAJCWlmIChjbWQtPnN0YXJ0X2FyZyAmIENSX0lOVkVSVCkKIAkJCWJpdHMgfD0gQURDX1NUQVJUX1RSSUdfRkFMTElOR19CSVQ7Ci0JfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKSB7CiAJCWJpdHMgfD0gQURDX1NUQVJUX1RSSUdfU09GVF9CSVRTOworCX0KIAlpZiAodXNlX2h3X3NhbXBsZV9jb3VudGVyKGNtZCkpCiAJCWJpdHMgfD0gQURDX1NBTVBMRV9DT1VOVEVSX0VOX0JJVDsKIAl3cml0ZXcoYml0cywgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfQ09OVFJPTDBfUkVHKTsKQEAgLTI4MjcsOCArMjgyNiw5IEBACiAJCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZykgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCQkJcGlvX2RyYWluX2FpX2ZpZm8oZGV2KTsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisJCX0KIAl9CiAJLyogIGlmIHdlIGFyZSBoYXZlIGFsbCB0aGUgZGF0YSwgdGhlbiBxdWl0ICovCiAJaWYgKChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKQEAgLTI5NzgsNyArMjk3OCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIGJvYXJkIG1pZ2h0IG5vdCBzdXBwb3J0IGFvLCBpbiB3aGljaCBjYXNlIHdyaXRlX3N1YmRldiBpcyBOVUxMICovCi0JaWYgKHMgPT0gTlVMTCkKKwlpZiAoIXMpCiAJCXJldHVybjsKIAlhc3luYyA9IHMtPmFzeW5jOwogCWNtZCA9ICZhc3luYy0+Y21kOwpAQCAtMzMxMiwyMCArMzMxMiwyMCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCi0JCQkJICAgICBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0zMzQwLDExICszMzQwLDExIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSB0aGlzYm9hcmQtPmFvX3NjYW5fc3BlZWQpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICB0aGlzYm9hcmQtPmFvX3NjYW5fc3BlZWQpOwogCQlpZiAoZ2V0X2FvX2Rpdmlzb3IoY21kLT5zY2FuX2JlZ2luX2FyZywgY21kLT5mbGFncykgPgogCQkgICAgbWF4X2NvdW50ZXJfdmFsdWUpIHsKIAkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAobWF4X2NvdW50ZXJfdmFsdWUgKyAyKSAqCkBAIC0zMzUzLDggKzMzNTMsOSBAQAogCQl9CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMzgxNyw4ICszODE4LDkgQEAKIAkJcy0+bWF4ZGF0YSA9IDE7CiAJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAJCXMtPmluc25fYml0cyA9IGRpX3JiaXRzOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQogCiAJLyogIGRpZ2l0YWwgb3V0cHV0ICovCiAJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF82NFhYKSB7CkBAIC0zODI5LDggKzM4MzEsOSBAQAogCQlzLT5tYXhkYXRhID0gMTsKIAkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKIAkJcy0+aW5zbl9iaXRzID0gZG9fd2JpdHM7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiA4MjU1ICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbNF07CkBAIC0zODU4LDggKzM4NjEsOSBAQAogCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwogCQlzLT5pbnNuX2NvbmZpZyA9IGRpb182MHh4X2NvbmZpZ19pbnNuOwogCQlzLT5pbnNuX2JpdHMgPSBkaW9fNjB4eF93Yml0czsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KIAogCS8qICBjYWxkYWMgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s2XTsKQEAgLTM4OTgsOCArMzkwMiw5IEBACiAJCQlhZDg0MDJfd3JpdGUoZGV2LCBpLCBzLT5tYXhkYXRhIC8gMik7CiAJCQlzLT5yZWFkYmFja1tpXSA9IHMtPm1heGRhdGEgLyAyOwogCQl9Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiBzZXJpYWwgRUVQUk9NLCBpZiBwcmVzZW50ICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbOF07CkBAIC0zOTA5LDggKzM5MTQsOSBAQAogCQlzLT5uX2NoYW4gPSAxMjg7CiAJCXMtPm1heGRhdGEgPSAweGZmZmY7CiAJCXMtPmluc25fcmVhZCA9IGVlcHJvbV9yZWFkX2luc247Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiAgdXNlciBjb3VudGVyIHN1YmQgWFhYICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbOV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKaW5kZXggMmIyY2ZjZC4uMzBjOWUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYwpAQCAtMzYsMTEgKzM2LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICI4MjU1LmgiCiAKICNkZWZpbmUgRUVQUk9NX1NJWkUJMTI4CS8qICBudW1iZXIgb2YgZW50cmllcyBpbiBlZXByb20gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRhcy5jCmluZGV4IDcwZGQyYzkuLmM0NThlNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYwpAQCAtNDIsMzcgKzQyLDExMiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAjaW5jbHVkZSAicGx4OTA1Mi5oIgogI2luY2x1ZGUgIjgyNTUuaCIKIAotLyogUmVnaXN0ZXJzIGZvciB0aGUgUENJTS1EQVMxNjAyLzE2IGFuZCBQQ0llLURBUzE2MDIvMTYgKi8KKy8qCisgKiBQQ0kgQmFyIDEgUmVnaXN0ZXIgbWFwCisgKiBzZWUgcGx4OTA1Mi5oIGZvciByZWdpc3RlciBhbmQgYml0IGRlZmluZXMKKyAqLwogCi0vKiBEQUMgT2Zmc2V0cyAqLwotI2RlZmluZSBBRENfVFJJRyAwCi0jZGVmaW5lIERBQzBfT0ZGU0VUIDIKLSNkZWZpbmUgREFDMV9PRkZTRVQgNAorLyoKKyAqIFBDSSBCYXIgMiBSZWdpc3RlciBtYXAgKGRldnByaXYtPmRhcWlvKQorICovCisjZGVmaW5lIFBDSU1EQVNfQUlfUkVHCQkJMHgwMAorI2RlZmluZSBQQ0lNREFTX0FJX1NPRlRUUklHX1JFRwkJMHgwMAorI2RlZmluZSBQQ0lNREFTX0FPX1JFRyh4KQkJKDB4MDIgKyAoKHgpICogMikpCiAKLS8qIEFJIGFuZCBDb3VudGVyIENvbnN0YW50cyAqLwotI2RlZmluZSBNVVhfTElNSVRTIDAKLSNkZWZpbmUgTUFJTl9DT05OX0RJTyAxCi0jZGVmaW5lIEFEQ19TVEFUIDIKLSNkZWZpbmUgQURDX0NPTlZfU1RBVCAzCi0jZGVmaW5lIEFEQ19JTlQgNAotI2RlZmluZSBBRENfUEFDRVIgNQotI2RlZmluZSBCVVJTVF9NT0RFIDYKLSNkZWZpbmUgUFJPR19HQUlOIDcKLSNkZWZpbmUgQ0xLODI1NF8xX0RBVEEgOAotI2RlZmluZSBDTEs4MjU0XzJfREFUQSA5Ci0jZGVmaW5lIENMSzgyNTRfM19EQVRBIDEwCi0jZGVmaW5lIENMSzgyNTRfQ09OVFJPTCAxMQotI2RlZmluZSBVU0VSX0NPVU5URVIgMTIKLSNkZWZpbmUgUkVTSURfQ09VTlRfSCAxMwotI2RlZmluZSBSRVNJRF9DT1VOVF9MIDE0CisvKgorICogUENJIEJhciAzIFJlZ2lzdGVyIG1hcCAoZGV2cHJpdi0+QkFEUjMpCisgKi8KKyNkZWZpbmUgUENJTURBU19NVVhfUkVHCQkJMHgwMAorI2RlZmluZSBQQ0lNREFTX01VWChfbG8sIF9oaSkJCSgoX2xvKSB8ICgoX2hpKSA8PCA0KSkKKyNkZWZpbmUgUENJTURBU19ESV9ET19SRUcJCTB4MDEKKyNkZWZpbmUgUENJTURBU19TVEFUVVNfUkVHCQkweDAyCisjZGVmaW5lIFBDSU1EQVNfU1RBVFVTX0VPQwkJQklUKDcpCisjZGVmaW5lIFBDSU1EQVNfU1RBVFVTX1VCCQlCSVQoNikKKyNkZWZpbmUgUENJTURBU19TVEFUVVNfTVVYCQlCSVQoNSkKKyNkZWZpbmUgUENJTURBU19TVEFUVVNfQ0xLCQlCSVQoNCkKKyNkZWZpbmUgUENJTURBU19TVEFUVVNfVE9fQ1VSUl9NVVgoeCkJKCh4KSAmIDB4ZikKKyNkZWZpbmUgUENJTURBU19DT05WX1NUQVRVU19SRUcJCTB4MDMKKyNkZWZpbmUgUENJTURBU19DT05WX1NUQVRVU19FT0MJCUJJVCg3KQorI2RlZmluZSBQQ0lNREFTX0NPTlZfU1RBVFVTX0VPQgkJQklUKDYpCisjZGVmaW5lIFBDSU1EQVNfQ09OVl9TVEFUVVNfRU9BCQlCSVQoNSkKKyNkZWZpbmUgUENJTURBU19DT05WX1NUQVRVU19GTkUJCUJJVCg0KQorI2RlZmluZSBQQ0lNREFTX0NPTlZfU1RBVFVTX0ZIRgkJQklUKDMpCisjZGVmaW5lIFBDSU1EQVNfQ09OVl9TVEFUVVNfT1ZFUlJVTglCSVQoMikKKyNkZWZpbmUgUENJTURBU19JUlFfUkVHCQkJMHgwNAorI2RlZmluZSBQQ0lNREFTX0lSUV9JTlRFCQlCSVQoNykKKyNkZWZpbmUgUENJTURBU19JUlFfSU5UCQkJQklUKDYpCisjZGVmaW5lIFBDSU1EQVNfSVJRX09WRVJSVU4JCUJJVCg0KQorI2RlZmluZSBQQ0lNREFTX0lSUV9FT0EJCQlCSVQoMykKKyNkZWZpbmUgUENJTURBU19JUlFfRU9BX0lOVF9TRUwJCUJJVCgyKQorI2RlZmluZSBQQ0lNREFTX0lSUV9JTlRTRUwoeCkJCSgoeCkgPDwgMCkKKyNkZWZpbmUgUENJTURBU19JUlFfSU5UU0VMX0VPQwkJUENJTURBU19JUlFfSU5UU0VMKDApCisjZGVmaW5lIFBDSU1EQVNfSVJRX0lOVFNFTF9GTkUJCVBDSU1EQVNfSVJRX0lOVFNFTCgxKQorI2RlZmluZSBQQ0lNREFTX0lSUV9JTlRTRUxfRU9CCQlQQ0lNREFTX0lSUV9JTlRTRUwoMikKKyNkZWZpbmUgUENJTURBU19JUlFfSU5UU0VMX0ZIRl9FT0EJUENJTURBU19JUlFfSU5UU0VMKDMpCisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfUkVHCQkweDA1CisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfR0FURV9TVEFUVVMJQklUKDYpCisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfR0FURV9QT0wJCUJJVCg1KQorI2RlZmluZSBQQ0lNREFTX1BBQ0VSX0dBVEVfTEFUQ0gJQklUKDQpCisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfR0FURV9FTgkJQklUKDMpCisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfRVhUX1BBQ0VSX1BPTAlCSVQoMikKKyNkZWZpbmUgUENJTURBU19QQUNFUl9TUkMoeCkJCSgoeCkgPDwgMCkKKyNkZWZpbmUgUENJTURBU19QQUNFUl9TUkNfUE9MTEVECVBDSU1EQVNfUEFDRVJfU1JDKDApCisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfU1JDX0VYVAkJUENJTURBU19QQUNFUl9TUkMoMikKKyNkZWZpbmUgUENJTURBU19QQUNFUl9TUkNfSU5UCQlQQ0lNREFTX1BBQ0VSX1NSQygzKQorI2RlZmluZSBQQ0lNREFTX1BBQ0VSX1NSQ19NQVNLCQkoMyA8PCAwKQorI2RlZmluZSBQQ0lNREFTX0JVUlNUX1JFRwkJMHgwNgorI2RlZmluZSBQQ0lNREFTX0JVUlNUX0JNRQkJQklUKDEpCisjZGVmaW5lIFBDSU1EQVNfQlVSU1RfQ09OVl9FTgkJQklUKDApCisjZGVmaW5lIFBDSU1EQVNfR0FJTl9SRUcJCTB4MDcKKyNkZWZpbmUgUENJTURBU184MjU0X0JBU0UJCTB4MDgKKyNkZWZpbmUgUENJTURBU19VU0VSX0NOVFJfUkVHCQkweDBjCisjZGVmaW5lIFBDSU1EQVNfVVNFUl9DTlRSX0NUUjFfQ0xLX1NFTAlCSVQoMCkKKyNkZWZpbmUgUENJTURBU19SRVNJRFVFX01TQl9SRUcJCTB4MGQKKyNkZWZpbmUgUENJTURBU19SRVNJRFVFX0xTQl9SRUcJCTB4MGUKKworLyoKKyAqIFBDSSBCYXIgNCBSZWdpc3RlciBtYXAgKGRldi0+aW9iYXNlKQorICovCisjZGVmaW5lIFBDSU1EQVNfODI1NV9CQVNFCQkweDAwCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSBjYl9wY2ltZGFzX2FpX2JpcF9yYW5nZSA9IHsKKwk0LCB7CisJCUJJUF9SQU5HRSgxMCksCisJCUJJUF9SQU5HRSg1KSwKKwkJQklQX1JBTkdFKDIuNSksCisJCUJJUF9SQU5HRSgxLjI1KQorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSBjYl9wY2ltZGFzX2FpX3VuaV9yYW5nZSA9IHsKKwk0LCB7CisJCVVOSV9SQU5HRSgxMCksCisJCVVOSV9SQU5HRSg1KSwKKwkJVU5JX1JBTkdFKDIuNSksCisJCVVOSV9SQU5HRSgxLjI1KQorCX0KK307CisKKy8qCisgKiBUaGUgQW5hbG9nIE91dHB1dCByYW5nZSBpcyBub3QgcHJvZ3JhbW1hYmxlLiBUaGUgREFDIHJhbmdlcyBhcmUKKyAqIGp1bXBlci1zZXR0YWJsZSBvbiB0aGUgYm9hcmQuIFRoZSBzZXR0aW5ncyBhcmUgbm90IHNvZnR3YXJlLXJlYWRhYmxlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgY2JfcGNpbWRhc19hb19yYW5nZSA9IHsKKwk0LCB7CisJCUJJUF9SQU5HRSgxMCksCisJCUJJUF9SQU5HRSg1KSwKKwkJVU5JX1JBTkdFKDEwKSwKKwkJVU5JX1JBTkdFKDUpCisJfQorfTsKIAogLyoKICAqIHRoaXMgc3RydWN0dXJlIGlzIGZvciBkYXRhIHVuaXF1ZSB0byB0aGlzIGhhcmR3YXJlIGRyaXZlci4gIElmCkBAIC05NCw1OSArMTY5LDQ3IEBACiAJc3RydWN0IGNiX3BjaW1kYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gaW5iKGRldnByaXYtPkJBRFIzICsgMik7Ci0JaWYgKChzdGF0dXMgJiAweDgwKSA9PSAwKQorCXN0YXR1cyA9IGluYihkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfU1RBVFVTX1JFRyk7CisJaWYgKChzdGF0dXMgJiBQQ0lNREFTX1NUQVRVU19FT0MpID09IDApCiAJCXJldHVybiAwOwogCXJldHVybiAtRUJVU1k7CiB9CiAKLXN0YXRpYyBpbnQgY2JfcGNpbWRhc19haV9yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorc3RhdGljIGludCBjYl9wY2ltZGFzX2FpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGNiX3BjaW1kYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgbjsKIAl1bnNpZ25lZCBpbnQgZDsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIHNob3J0IGNoYW5saW1zOwotCWludCBtYXhjaGFuczsKIAlpbnQgcmV0OwogCiAJLyogIG9ubHkgc3VwcG9ydCBzdyBpbml0aWF0ZWQgcmVhZHMgZnJvbSBhIHNpbmdsZSBjaGFubmVsICovCiAKLQkvKiBjaGVjayBjaGFubmVsIG51bWJlciAqLwotCWlmICgoaW5iKGRldnByaXYtPkJBRFIzICsgMikgJiAweDIwKSA9PSAwKQkvKiBkaWZmZXJlbnRpYWwgbW9kZSAqLwotCQltYXhjaGFucyA9IHMtPm5fY2hhbiAvIDI7Ci0JZWxzZQotCQltYXhjaGFucyA9IHMtPm5fY2hhbjsKLQotCWlmIChjaGFuID4gKG1heGNoYW5zIC0gMSkpCi0JCXJldHVybiAtRVRJTUVET1VUOwkvKiAqKiogV3JvbmcgZXJyb3IgY29kZS4gRml4bWUuICovCi0KIAkvKiBjb25maWd1cmUgZm9yIHN3IGluaXRpYXRlZCByZWFkICovCi0JZCA9IGluYihkZXZwcml2LT5CQURSMyArIDUpOwotCWlmICgoZCAmIDB4MDMpID4gMCkgewkvKiBvbmx5IHJlc2V0IGlmIG5lZWRlZC4gKi8KLQkJZCA9IGQgJiAweGZkOwotCQlvdXRiKGQsIGRldnByaXYtPkJBRFIzICsgNSk7CisJZCA9IGluYihkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfUEFDRVJfUkVHKTsKKwlpZiAoKGQgJiBQQ0lNREFTX1BBQ0VSX1NSQ19NQVNLKSAhPSBQQ0lNREFTX1BBQ0VSX1NSQ19QT0xMRUQpIHsKKwkJZCAmPSB+UENJTURBU19QQUNFUl9TUkNfTUFTSzsKKwkJZCB8PSBQQ0lNREFTX1BBQ0VSX1NSQ19QT0xMRUQ7CisJCW91dGIoZCwgZGV2cHJpdi0+QkFEUjMgKyBQQ0lNREFTX1BBQ0VSX1JFRyk7CiAJfQogCiAJLyogc2V0IGJ1cnN0aW5nIG9mZiwgY29udmVyc2lvbnMgb24gKi8KLQlvdXRiKDB4MDEsIGRldnByaXYtPkJBRFIzICsgNik7CisJb3V0YihQQ0lNREFTX0JVUlNUX0NPTlZfRU4sIGRldnByaXYtPkJBRFIzICsgUENJTURBU19CVVJTVF9SRUcpOwogCi0JLyogc2V0IHJhbmdlIHRvIDEwVi4gVVAvQlAgaXMgY29udHJvbGxlZCBieSBhIHN3aXRjaCBvbiB0aGUgYm9hcmQgKi8KLQlvdXRiKDB4MDAsIGRldnByaXYtPkJBRFIzICsgNyk7CisJLyogc2V0IHJhbmdlICovCisJb3V0YihyYW5nZSwgZGV2cHJpdi0+QkFEUjMgKyBQQ0lNREFTX0dBSU5fUkVHKTsKIAotCS8qCi0JICogd3JpdGUgY2hhbm5lbCBsaW1pdHMgdG8gbXVsdGlwbGV4ZXIsIHNldCBMb3cgKGJpdHMgMC0zKSBhbmQKLQkgKiBIaWdoIChiaXRzIDQtNykgY2hhbm5lbHMgdG8gY2hhbi4KLQkgKi8KLQljaGFubGltcyA9IGNoYW4gfCAoY2hhbiA8PCA0KTsKLQlvdXRiKGNoYW5saW1zLCBkZXZwcml2LT5CQURSMyArIDApOworCS8qIHNldCBtdXggZm9yIHNpbmdsZSBjaGFubmVsIHNjYW4gKi8KKwlvdXRiKFBDSU1EQVNfTVVYKGNoYW4sIGNoYW4pLCBkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfTVVYX1JFRyk7CiAKIAkvKiBjb252ZXJ0IG4gc2FtcGxlcyAqLwogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCi0JCW91dHcoMCwgZGV2cHJpdi0+ZGFxaW8gKyAwKTsKKwkJb3V0dygwLCBkZXZwcml2LT5kYXFpbyArIFBDSU1EQVNfQUlfU09GVFRSSUdfUkVHKTsKIAogCQkvKiB3YWl0IGZvciBjb252ZXJzaW9uIHRvIGVuZCAqLwogCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGNiX3BjaW1kYXNfYWlfZW9jLCAwKTsKQEAgLTE1NCw3ICsyMTcsNyBAQAogCQkJcmV0dXJuIHJldDsKIAogCQkvKiByZWFkIGRhdGEgKi8KLQkJZGF0YVtuXSA9IGludyhkZXZwcml2LT5kYXFpbyArIDApOworCQlkYXRhW25dID0gaW53KGRldnByaXYtPmRhcWlvICsgUENJTURBU19BSV9SRUcpOwogCX0KIAogCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCkBAIC0xNjksMjAgKzIzMiwxMjggQEAKIAlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CiAJdW5zaWduZWQgaW50IHZhbCA9IHMtPnJlYWRiYWNrW2NoYW5dOwotCXVuc2lnbmVkIGludCByZWcgPSAoY2hhbikgPyBEQUMxX09GRlNFVCA6IERBQzBfT0ZGU0VUOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewogCQl2YWwgPSBkYXRhW2ldOwotCQlvdXR3KHZhbCwgZGV2cHJpdi0+ZGFxaW8gKyByZWcpOworCQlvdXR3KHZhbCwgZGV2cHJpdi0+ZGFxaW8gKyBQQ0lNREFTX0FPX1JFRyhjaGFuKSk7CiAJfQogCXMtPnJlYWRiYWNrW2NoYW5dID0gdmFsOwogCiAJcmV0dXJuIGluc24tPm47CiB9CiAKK3N0YXRpYyBpbnQgY2JfcGNpbWRhc19kaV9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGluYihkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfRElfRE9fUkVHKTsKKworCWRhdGFbMV0gPSB2YWwgJiAweDBmOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgY2JfcGNpbWRhc19kb19pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCisJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKQorCQlvdXRiKHMtPnN0YXRlLCBkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfRElfRE9fUkVHKTsKKworCWRhdGFbMV0gPSBzLT5zdGF0ZTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGNiX3BjaW1kYXNfY291bnRlcl9pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGNiX3BjaW1kYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQzoKKwkJc3dpdGNoIChkYXRhWzFdKSB7CisJCWNhc2UgMDoJLyogaW50ZXJuYWwgMTAwIGtIeiBjbG9jayAqLworCQkJY3RybCA9IFBDSU1EQVNfVVNFUl9DTlRSX0NUUjFfQ0xLX1NFTDsKKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIGV4dGVybmFsIGNsayBvbiBwaW4gMjEgKi8KKwkJCWN0cmwgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlvdXRiKGN0cmwsIGRldnByaXYtPkJBRFIzICsgUENJTURBU19VU0VSX0NOVFJfUkVHKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfQ0xPQ0tfU1JDOgorCQljdHJsID0gaW5iKGRldnByaXYtPkJBRFIzICsgUENJTURBU19VU0VSX0NOVFJfUkVHKTsKKwkJaWYgKGN0cmwgJiBQQ0lNREFTX1VTRVJfQ05UUl9DVFIxX0NMS19TRUwpIHsKKwkJCWRhdGFbMV0gPSAwOworCQkJZGF0YVsyXSA9IEk4MjU0X09TQ19CQVNFXzEwMEtIWjsKKwkJfSBlbHNlIHsKKwkJCWRhdGFbMV0gPSAxOworCQkJZGF0YVsyXSA9IDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2JfcGNpbWRhc19wYWNlcl9jbGsoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwkvKiBUaGUgUGFjZXIgQ2xvY2sganVtcGVyIHNlbGVjdHMgYSAxMCBNSHogb3IgMSBNSHogY2xvY2sgKi8KKwlzdGF0dXMgPSBpbmIoZGV2cHJpdi0+QkFEUjMgKyBQQ0lNREFTX1NUQVRVU19SRUcpOworCWlmIChzdGF0dXMgJiBQQ0lNREFTX1NUQVRVU19DTEspCisJCXJldHVybiBJODI1NF9PU0NfQkFTRV8xME1IWjsKKwlyZXR1cm4gSTgyNTRfT1NDX0JBU0VfMU1IWjsKK30KKworc3RhdGljIGJvb2wgY2JfcGNpbWRhc19pc19haV9zZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCS8qCisJICogVGhlIG51bWJlciBvZiBBbmFsb2cgSW5wdXQgY2hhbm5lbHMgaXMgc2V0IHdpdGggdGhlCisJICogQW5hbG9nIElucHV0IE1vZGUgU3dpdGNoIG9uIHRoZSBib2FyZC4gVGhlIGJvYXJkIGNhbgorCSAqIGhhdmUgMTYgc2luZ2xlLWVuZGVkIG9yIDggZGlmZmVyZW50aWFsIGNoYW5uZWxzLgorCSAqLworCXN0YXR1cyA9IGluYihkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfU1RBVFVTX1JFRyk7CisJcmV0dXJuIHN0YXR1cyAmIFBDSU1EQVNfU1RBVFVTX01VWDsKK30KKworc3RhdGljIGJvb2wgY2JfcGNpbWRhc19pc19haV91bmkoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwkvKgorCSAqIFRoZSBBbmFsb2cgSW5wdXQgcmFuZ2UgcG9sYXJpdHkgaXMgc2V0IHdpdGggdGhlCisJICogQW5hbG9nIElucHV0IFBvbGFyaXR5IFN3aXRjaCBvbiB0aGUgYm9hcmQuIFRoZQorCSAqIGlucHV0cyBjYW4gYmUgc2V0IHRvIFVuaXBvbGFyIG9yIEJpcG9sYXIgcmFuZ2VzLgorCSAqLworCXN0YXR1cyA9IGluYihkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfU1RBVFVTX1JFRyk7CisJcmV0dXJuIHN0YXR1cyAmIFBDSU1EQVNfU1RBVFVTX1VCOworfQorCiBzdGF0aWMgaW50IGNiX3BjaW1kYXNfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCisJCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXY7CkBAIC0yMDEsNDIgKzM3Miw3OSBAQAogCWRldnByaXYtPkJBRFIzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMyk7CiAJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCA0KTsKIAotCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMyk7CisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2cHJpdi0+QkFEUjMgKyBQQ0lNREFTXzgyNTRfQkFTRSwKKwkJCQkgICAgICBjYl9wY2ltZGFzX3BhY2VyX2NsayhkZXYpLAorCQkJCSAgICAgIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIEFuYWxvZyBJbnB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKLQkvKiBkZXYtPnJlYWRfc3ViZGV2PXM7ICovCi0JLyogIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7Ci0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORDsKLQlzLT5uX2NoYW4gPSAxNjsKLQlzLT5tYXhkYXRhID0gMHhmZmZmOwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247Ci0Jcy0+bGVuX2NoYW5saXN0ID0gMTsJLyogIFRoaXMgaXMgdGhlIG1heGltdW0gY2hhbmxpc3QgbGVuZ3RoIHRoYXQgKi8KLQkvKiAgdGhlIGJvYXJkIGNhbiBoYW5kbGUgKi8KLQlzLT5pbnNuX3JlYWQgPSBjYl9wY2ltZGFzX2FpX3JpbnNuOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCWlmIChjYl9wY2ltZGFzX2lzX2FpX3NlKGRldikpIHsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9HUk9VTkQ7CisJCXMtPm5fY2hhbgk9IDE2OworCX0gZWxzZSB7CisJCXMtPnN1YmRldl9mbGFncwl8PSBTREZfRElGRjsKKwkJcy0+bl9jaGFuCT0gODsKKwl9CisJcy0+bWF4ZGF0YQk9IDB4ZmZmZjsKKwlzLT5yYW5nZV90YWJsZQk9IGNiX3BjaW1kYXNfaXNfYWlfdW5pKGRldikgPyAmY2JfcGNpbWRhc19haV91bmlfcmFuZ2UKKwkJCQkJCSAgICA6ICZjYl9wY2ltZGFzX2FpX2JpcF9yYW5nZTsKKwlzLT5pbnNuX3JlYWQJPSBjYl9wY2ltZGFzX2FpX2luc25fcmVhZDsKIAorCS8qIEFuYWxvZyBPdXRwdXQgc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07Ci0JLyogIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlICovCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKLQlzLT5uX2NoYW4gPSAyOwotCXMtPm1heGRhdGEgPSAweGZmZjsKLQkvKiByYW5nZXMgYXJlIGhhcmR3YXJlIHNldHRhYmxlLCBidXQgbm90IHNvZnR3YXJlIHJlYWRhYmxlLiAqLwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX3Vua25vd247Ci0Jcy0+aW5zbl93cml0ZSA9IGNiX3BjaW1kYXNfYW9faW5zbl93cml0ZTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4JPSAyOworCXMtPm1heGRhdGEJPSAweGZmZjsKKwlzLT5yYW5nZV90YWJsZQk9ICZjYl9wY2ltZGFzX2FvX3JhbmdlOworCXMtPmluc25fd3JpdGUJPSBjYl9wY2ltZGFzX2FvX2luc25fd3JpdGU7CiAKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2X3JlYWRiYWNrKHMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwkvKiBEaWdpdGFsIEkvTyBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1syXTsKLQkvKiBkaWdpdGFsIGkvbyBzdWJkZXZpY2UgKi8KLQlyZXQgPSBzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgMHgwMCk7CisJcmV0ID0gc3ViZGV2XzgyNTVfaW5pdChkZXYsIHMsIE5VTEwsIFBDSU1EQVNfODI1NV9CQVNFKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJLyogRGlnaXRhbCBJbnB1dCBzdWJkZXZpY2UgKG1haW4gY29ubmVjdG9yKSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbgk9IDQ7CisJcy0+bWF4ZGF0YQk9IDE7CisJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX3JlYWQJPSBjYl9wY2ltZGFzX2RpX2luc25fcmVhZDsKKworCS8qIERpZ2l0YWwgT3V0cHV0IHN1YmRldmljZSAobWFpbiBjb25uZWN0b3IpICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbNF07CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ETzsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gNDsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fd3JpdGUJPSBjYl9wY2ltZGFzX2RvX2luc25fd3JpdGU7CisKKwkvKiBDb3VudGVyIHN1YmRldmljZSAoODI1NCkgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1s1XTsKKwljb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdChzLCBkZXYtPnBhY2VyKTsKKworCWRldi0+cGFjZXItPmluc25fY29uZmlnID0gY2JfcGNpbWRhc19jb3VudGVyX2luc25fY29uZmlnOworCisJLyogY291bnRlcnMgMSBhbmQgMiBhcmUgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgcGFjZXIgKi8KKwljb21lZGlfODI1NF9zZXRfYnVzeShkZXYtPnBhY2VyLCAxLCB0cnVlKTsKKwljb21lZGlfODI1NF9zZXRfYnVzeShkZXYtPnBhY2VyLCAyLCB0cnVlKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kZGEuYwppbmRleCAwMzA0M2U3Li5hNDc4MWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMKQEAgLTc1LDkgKzc1LDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICI4MjU1LmgiCiAKQEAgLTEzNCw3ICsxMzMsNyBAQAogfQogCiBzdGF0aWMgaW50IGNiX3BjaW1kZGFfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCisJCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV84MjU0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpXzgyNTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDVkNTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV84MjU0LmMKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisgKiBjb21lZGlfODI1NC5jCisgKiBHZW5lcmljIDgyNTQgdGltZXIvY291bnRlciBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKgorICogQmFzZWQgb24gODI1My5oIGFuZCB2YXJpb3VzIHN1YmRldmljZSBpbXBsZW1lbnRhdGlvbnMgaW4gY29tZWRpIGRyaXZlcnMuCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogTW9kdWxlOiBjb21lZGlfODI1NAorICogRGVzY3JpcHRpb246IEdlbmVyaWMgODI1NCB0aW1lci9jb3VudGVyIHN1cHBvcnQKKyAqIEF1dGhvcjogSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKiBVcGRhdGVkOiBUaHUgSmFuIDggMTY6NDU6NDUgTVNUIDIwMTUKKyAqIFN0YXR1czogd29ya3MKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBub3QgdXNlZCBkaXJlY3RseSBieSBlbmQtdXNlcnMuIFJhdGhlciwgaXQgaXMgdXNlZCBieSBvdGhlcgorICogZHJpdmVycyB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGFuIDgyNTQgUHJvZ3JhbW1hYmxlIEludGVydmFsIFRpbWVyLiBUaGVzZQorICogY291bnRlcnMgYXJlIHR5cGljYWxseSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBwYWNlciBjbG9jayB1c2VkIGZvciBkYXRhCisgKiBhY3F1aXNpdGlvbi4gU29tZSBkcml2ZXJzIGFsc28gZXhwb3NlIHRoZSBjb3VudGVycyBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzZS4KKyAqCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGJhc2ljIGZ1bmN0aW9uczoKKyAqCisgKiBjb21lZGlfODI1NF9pbml0KCkgLyBjb21lZGlfODI1NF9tbV9pbml0KCkKKyAqCUluaXRpYWxpemVzIHRoaXMgbW9kdWxlIHRvIGFjY2VzcyB0aGUgODI1NCByZWdpc3RlcnMuIFRoZSBfbW0gdmVyc2lvbgorICoJc2V0cyB1cCB0aGUgbW9kdWxlIGZvciBNTUlPIHJlZ2lzdGVyIGFjY2VzcyB0aGUgb3RoZXIgZm9yIFBJTyBhY2Nlc3MuCisgKglUaGUgcG9pbnRlciByZXR1cm5lZCBmcm9tIHRoZXNlIGZ1bmN0aW9ucyBpcyBub3JtYWxseSBzdG9yZWQgaW4gdGhlCisgKgljb21lZGlfZGV2aWNlIGRldi0+cGFjZXIgYW5kIHdpbGwgYmUgZnJlZWQgYnkgdGhlIGNvbWVkaSBjb3JlIGR1cmluZworICoJdGhlIGRyaXZlciAoKmRldGFjaCkuIElmIGEgZHJpdmVyIGhhcyBtdWx0aXBsZSA4MjU0IGRldmljZXMsIHRoZXkgbmVlZAorICoJdG8gYmUgc3RvcmVkIGluIHRoZSBkcml2ZXJzIHByaXZhdGUgZGF0YSBhbmQgZnJlZWQgd2hlbiB0aGUgZHJpdmVyIGlzCisgKglkZXRhY2hlZC4KKyAqCisgKglOT1RFOiBUaGUgY291bnRlcnMgYXJlIHJlc2V0IGJ5IHNldHRpbmcgdGhlbSB0byBJODI1NF9NT0RFMCBhcyBwYXJ0IG9mCisgKgl0aGlzIGluaXRpYWxpemF0aW9uLgorICoKKyAqIGNvbWVkaV84MjU0X3NldF9tb2RlKCkKKyAqCVNldHMgYSBjb3VudGVycyBvcGVyYXRpb24gbW9kZToKKyAqCQlJODI1NF9NT0RFMAlJbnRlcnJ1cHQgb24gdGVybWluYWwgY291bnQKKyAqCQlJODI1NF9NT0RFMQlIYXJkd2FyZSByZXRyaWdnZXJhYmxlIG9uZS1zaG90CisgKgkJSTgyNTRfTU9ERTIJUmF0ZSBnZW5lcmF0b3IKKyAqCQlJODI1NF9NT0RFMwlTcXVhcmUgd2F2ZSBtb2RlCisgKgkJSTgyNTRfTU9ERTQJU29mdHdhcmUgdHJpZ2dlcmVkIHN0cm9iZQorICoJCUk4MjU0X01PREU1CUhhcmR3YXJlIHRyaWdnZXJlZCBzdHJvYmUgKHJldHJpZ2dlcmFibGUpCisgKgorICoJSW4gYWRkaXRpb24gSTgyNTRfQkNEIGFuZCBJODI1NF9CSU5BUlkgc3BlY2lmeSB0aGUgY291bnRpbmcgbW9kZToKKyAqCQlJODI1NF9CQ0QJQkNEIGNvdW50aW5nCisgKgkJSTgyNTRfQklOQVJZCUJpbmFyeSBjb3VudGluZworICoKKyAqIGNvbWVkaV84MjU0X3dyaXRlKCkKKyAqCVdyaXRlcyBhbiBpbml0aWFsIHZhbHVlIHRvIGEgY291bnRlci4KKyAqCisgKglUaGUgbGFyZ2VzdCBwb3NzaWJsZSBpbml0aWFsIGNvdW50IGlzIDA7IHRoaXMgaXMgZXF1aXZhbGVudCB0byAyXjE2CisgKglmb3IgYmluYXJ5IGNvdW50aW5nIGFuZCAxMF40IGZvciBCQ0QgY291bnRpbmcuCisgKgorICoJTk9URTogVGhlIGNvdW50ZXIgZG9lcyBub3Qgc3RvcCB3aGVuIGl0IHJlYWNoZXMgemVyby4gSW4gTW9kZSAwLCAxLCA0LAorICoJYW5kIDUgdGhlIGNvdW50ZXIgIndyYXBzIGFyb3VuZCIgdG8gdGhlIGhpZ2hlc3QgY291bnQsIGVpdGhlciAweGZmZmYKKyAqCWZvciBiaW5hcnkgY291bnRpbmcgb3IgOTk5OSBmb3IgQkNEIGNvdW50aW5nLCBhbmQgY29udGludWVzIGNvdW50aW5nLgorICoJTW9kZXMgMiBhbmQgMyBhcmUgcGVyaW9kaWM7IHRoZSBjb3VudGVyIHJlbG9hZHMgaXRzZWxmIHdpdGggdGhlIGluaXRpYWwKKyAqCWNvdW50IGFuZCBjb250aW51ZXMgY291bnRpbmcgZnJvbSB0aGVyZS4KKyAqCisgKiBjb21lZGlfODI1NF9yZWFkKCkKKyAqCVJlYWRzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gYSBjb3VudGVyLgorICoKKyAqIGNvbWVkaV84MjU0X3N0YXR1cygpCisgKglSZWFkcyB0aGUgc3RhdHVzIG9mIGEgY291bnRlci4KKyAqCisgKiBjb21lZGlfODI1NF9sb2FkKCkKKyAqCVNldHMgYSBjb3VudGVycyBvcGVyYXRpb24gbW9kZSBhbmQgd3JpdGVzIHRoZSBpbml0aWFsIHZhbHVlLgorICoKKyAqIFR5cGljYWxseSB0aGUgcGFjZXIgY2xvY2sgaXMgY3JlYXRlZCBieSBjYXNjYWRpbmcgdHdvIG9mIHRoZSAxNi1iaXQgY291bnRlcnMKKyAqIHRvIGNyZWF0ZSBhIDMyLWJpdCByYXRlIGdlbmVyYXRvciAoSTgyNTRfTU9ERTIpLiBUaGVzZSBmdW5jdGlvbnMgYXJlCisgKiBwcm92aWRlZCB0byBoYW5kbGUgdGhlIGNhc2NhZGVkIGNvdW50ZXJzOgorICoKKyAqIGNvbWVkaV84MjU0X25zX3RvX3RpbWVyKCkKKyAqCUNhbGN1bGF0ZXMgdGhlIGRpdmlzb3IgdmFsdWUgbmVlZGVkIGZvciBhIHNpbmdsZSBjb3VudGVyIHRvIGdlbmVyYXRlCisgKglucyB0aW1pbmcuCisgKgorICogY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcigpCisgKglDYWxjdWxhdGVzIHRoZSB0d28gZGl2aXNvciB2YWx1ZXMgbmVlZGVkIHRvIHRoZSBnZW5lcmF0ZSB0aGUgcGFjZXIKKyAqCWNsb2NrIChpbiBucykuCisgKgorICogY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKCkKKyAqCVRyYW5zZmVycyB0aGUgaW50ZXJtZWRpYXRlIGRpdmlzb3IgdmFsdWVzIHRvIHRoZSBjdXJyZW50IGRpdmlzb3JzLgorICoKKyAqIGNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZSgpCisgKglQcm9ncmFtcyB0aGUgbW9kZSBvZiB0aGUgY2FzY2FkZWQgY291bnRlcnMgYW5kIHdyaXRlcyB0aGUgY3VycmVudAorICoJZGl2aXNvciB2YWx1ZXMuCisgKgorICogVG8gZXhwb3NlIHRoZSBjb3VudGVycyBhcyBhIHN1YmRldmljZSBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzZSB0aGUgZm9sbG93aW5nCisgKiBmdW5jdGlvbnMgYSBwcm92aWRlZDoKKyAqCisgKiBjb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdCgpCisgKglJbml0aWFsaXplcyBhIGNvbWVkaV9zdWJkZXZpY2UgdG8gdXNlIHRoZSA4MjU0IHRpbWVyLgorICoKKyAqIGNvbWVkaV84MjU0X3NldF9idXN5KCkKKyAqCUludGVybmFsbHkgZmxhZ3MgYSBjb3VudGVyIGFzICJidXN5Ii4gVGhpcyBpcyBkb25lIHRvIHByb3RlY3QgdGhlCisgKgljb3VudGVycyB0aGF0IGFyZSB1c2VkIGZvciB0aGUgY2FzY2FkZWQgMzItYml0IHBhY2VyLgorICoKKyAqIFRoZSBzdWJkZXZpY2UgcHJvdmlkZXMgKCppbnNuX3JlYWQpIGFuZCAoKmluc25fd3JpdGUpIG9wZXJhdGlvbnMgdG8gcmVhZAorICogdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHdyaXRlIGFuIGluaXRpYWwgdmFsdWUgdG8gYSBjb3VudGVyLiBBICgqaW5zbl9jb25maWcpCisgKiBvcGVyYXRpb24gaXMgYWxzbyBwcm92aWRlZCB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBjb21lZGkgaW5zdHJ1Y3Rpb25zOgorICoKKyAqCUlOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUJY2FsbHMgY29tZWRpXzgyNTRfc2V0X21vZGUoKQorICoJSU5TTl9DT05GSUdfODI1NF9SRUFEX1NUQVRVUwljYWxscyBjb21lZGlfODI1NF9zdGF0dXMoKQorICoKKyAqIFRoZSAoKmluc25fY29uZmlnKSBtZW1iZXIgb2YgY29tZWRpXzgyNTQgY2FuIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBleHRlcm5hbAorICogZHJpdmVyIHRvIGhhbmRsZSBhbnkgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMuCisgKgorICogTk9URTogR2F0ZSBjb250cm9sLCBjbG9jayByb3V0aW5nLCBhbmQgYW55IGludGVycnVwdCBoYW5kbGluZyBmb3IgdGhlCisgKiBjb3VudGVycyBpcyBub3QgaGFuZGxlZCBieSB0aGlzIG1vZHVsZS4gVGhlc2UgZmVhdHVyZXMgYXJlIGRyaXZlciBkZXBlbmRlbnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IF9faTgyNTRfcmVhZChzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0ID0gKHJlZyAqIGk4MjU0LT5pb3NpemUpIDw8IGk4MjU0LT5yZWdzaGlmdDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJc3dpdGNoIChpODI1NC0+aW9zaXplKSB7CisJZGVmYXVsdDoKKwljYXNlIEk4MjU0X0lPODoKKwkJaWYgKGk4MjU0LT5tbWlvKQorCQkJdmFsID0gcmVhZGIoaTgyNTQtPm1taW8gKyByZWdfb2Zmc2V0KTsKKwkJZWxzZQorCQkJdmFsID0gaW5iKGk4MjU0LT5pb2Jhc2UgKyByZWdfb2Zmc2V0KTsKKwkJYnJlYWs7CisJY2FzZSBJODI1NF9JTzE2OgorCQlpZiAoaTgyNTQtPm1taW8pCisJCQl2YWwgPSByZWFkdyhpODI1NC0+bW1pbyArIHJlZ19vZmZzZXQpOworCQllbHNlCisJCQl2YWwgPSBpbncoaTgyNTQtPmlvYmFzZSArIHJlZ19vZmZzZXQpOworCQlicmVhazsKKwljYXNlIEk4MjU0X0lPMzI6CisJCWlmIChpODI1NC0+bW1pbykKKwkJCXZhbCA9IHJlYWRsKGk4MjU0LT5tbWlvICsgcmVnX29mZnNldCk7CisJCWVsc2UKKwkJCXZhbCA9IGlubChpODI1NC0+aW9iYXNlICsgcmVnX29mZnNldCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgX19pODI1NF93cml0ZShzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LAorCQkJICB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0ID0gKHJlZyAqIGk4MjU0LT5pb3NpemUpIDw8IGk4MjU0LT5yZWdzaGlmdDsKKworCXN3aXRjaCAoaTgyNTQtPmlvc2l6ZSkgeworCWRlZmF1bHQ6CisJY2FzZSBJODI1NF9JTzg6CisJCWlmIChpODI1NC0+bW1pbykKKwkJCXdyaXRlYih2YWwsIGk4MjU0LT5tbWlvICsgcmVnX29mZnNldCk7CisJCWVsc2UKKwkJCW91dGIodmFsLCBpODI1NC0+aW9iYXNlICsgcmVnX29mZnNldCk7CisJCWJyZWFrOworCWNhc2UgSTgyNTRfSU8xNjoKKwkJaWYgKGk4MjU0LT5tbWlvKQorCQkJd3JpdGV3KHZhbCwgaTgyNTQtPm1taW8gKyByZWdfb2Zmc2V0KTsKKwkJZWxzZQorCQkJb3V0dyh2YWwsIGk4MjU0LT5pb2Jhc2UgKyByZWdfb2Zmc2V0KTsKKwkJYnJlYWs7CisJY2FzZSBJODI1NF9JTzMyOgorCQlpZiAoaTgyNTQtPm1taW8pCisJCQl3cml0ZWwodmFsLCBpODI1NC0+bW1pbyArIHJlZ19vZmZzZXQpOworCQllbHNlCisJCQlvdXRsKHZhbCwgaTgyNTQtPmlvYmFzZSArIHJlZ19vZmZzZXQpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogY29tZWRpXzgyNTRfc3RhdHVzIC0gcmV0dXJuIHRoZSBzdGF0dXMgb2YgYSBjb3VudGVyCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKiBAY291bnRlcjoJdGhlIGNvdW50ZXIgbnVtYmVyCisgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfODI1NF9zdGF0dXMoc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCwgdW5zaWduZWQgaW50IGNvdW50ZXIpCit7CisJdW5zaWduZWQgaW50IGNtZDsKKworCWlmIChjb3VudGVyID4gMikKKwkJcmV0dXJuIDA7CisKKwljbWQgPSBJODI1NF9DVFJMX1JFQURCQUNLX1NUQVRVUyB8IEk4MjU0X0NUUkxfUkVBREJBQ0tfU0VMX0NUUihjb3VudGVyKTsKKwlfX2k4MjU0X3dyaXRlKGk4MjU0LCBjbWQsIEk4MjU0X0NUUkxfUkVHKTsKKworCXJldHVybiBfX2k4MjU0X3JlYWQoaTgyNTQsIGNvdW50ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfc3RhdHVzKTsKKworLyoqCisgKiBjb21lZGlfODI1NF9yZWFkIC0gcmVhZCB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKiBAY291bnRlcjoJdGhlIGNvdW50ZXIgbnVtYmVyCisgKi8KK3Vuc2lnbmVkIGludCBjb21lZGlfODI1NF9yZWFkKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsIHVuc2lnbmVkIGludCBjb3VudGVyKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoY291bnRlciA+IDIpCisJCXJldHVybiAwOworCisJLyogbGF0Y2ggY291bnRlciAqLworCV9faTgyNTRfd3JpdGUoaTgyNTQsIEk4MjU0X0NUUkxfU0VMX0NUUihjb3VudGVyKSB8IEk4MjU0X0NUUkxfTEFUQ0gsCisJCSAgICAgIEk4MjU0X0NUUkxfUkVHKTsKKworCS8qIHJlYWQgTFNCIHRoZW4gTVNCICovCisJdmFsID0gX19pODI1NF9yZWFkKGk4MjU0LCBjb3VudGVyKTsKKwl2YWwgfD0gKF9faTgyNTRfcmVhZChpODI1NCwgY291bnRlcikgPDwgOCk7CisKKwlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfcmVhZCk7CisKKy8qKgorICogY29tZWRpXzgyNTRfd3JpdGUgLSBsb2FkIGEgMTYtYml0IGluaXRpYWwgY291bnRlciB2YWx1ZQorICogQGk4MjU0Ogljb21lZGlfODI1NCBzdHJ1Y3QgZm9yIHRoZSB0aW1lcgorICogQGNvdW50ZXI6CXRoZSBjb3VudGVyIG51bWJlcgorICogQHZhbDoJdGhlIGluaXRpYWwgdmFsdWUKKyAqLwordm9pZCBjb21lZGlfODI1NF93cml0ZShzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LAorCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IGJ5dGU7CisKKwlpZiAoY291bnRlciA+IDIpCisJCXJldHVybjsKKwlpZiAodmFsID4gMHhmZmZmKQorCQlyZXR1cm47CisKKwkvKiBsb2FkIExTQiB0aGVuIE1TQiAqLworCWJ5dGUgPSB2YWwgJiAweGZmOworCV9faTgyNTRfd3JpdGUoaTgyNTQsIGJ5dGUsIGNvdW50ZXIpOworCWJ5dGUgPSAodmFsID4+IDgpICYgMHhmZjsKKwlfX2k4MjU0X3dyaXRlKGk4MjU0LCBieXRlLCBjb3VudGVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV84MjU0X3dyaXRlKTsKKworLyoqCisgKiBjb21lZGlfODI1NF9zZXRfbW9kZSAtIHNldCB0aGUgbW9kZSBvZiBhIGNvdW50ZXIKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqIEBjb3VudGVyOgl0aGUgY291bnRlciBudW1iZXIKKyAqIEBtb2RlOgl0aGUgSTgyNTRfTU9ERXggYW5kIEk4MjU0X0JDRHxJODI1NF9CSU5BUlkKKyAqLworaW50IGNvbWVkaV84MjU0X3NldF9tb2RlKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsIHVuc2lnbmVkIGludCBjb3VudGVyLAorCQkJIHVuc2lnbmVkIGludCBtb2RlKQoreworCXVuc2lnbmVkIGludCBieXRlOworCisJaWYgKGNvdW50ZXIgPiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobW9kZSA+IChJODI1NF9NT0RFNSB8IEk4MjU0X0JDRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYnl0ZSA9IEk4MjU0X0NUUkxfU0VMX0NUUihjb3VudGVyKSB8CS8qIHNlbGVjdCBjb3VudGVyICovCisJICAgICAgIEk4MjU0X0NUUkxfTFNCX01TQiB8CQkvKiBsb2FkIExTQiB0aGVuIE1TQiAqLworCSAgICAgICBtb2RlOwkJCQkvKiBtb2RlIGFuZCBCQ0R8YmluYXJ5ICovCisJX19pODI1NF93cml0ZShpODI1NCwgYnl0ZSwgSTgyNTRfQ1RSTF9SRUcpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9zZXRfbW9kZSk7CisKKy8qKgorICogY29tZWRpXzgyNTRfbG9hZCAtIHByb2dyYW0gdGhlIG1vZGUgYW5kIGluaXRpYWwgY291bnQgb2YgYSBjb3VudGVyCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKiBAY291bnRlcjoJdGhlIGNvdW50ZXIgbnVtYmVyCisgKiBAbW9kZToJdGhlIEk4MjU0X01PREV4IGFuZCBJODI1NF9CQ0R8STgyNTRfQklOQVJZCisgKiBAdmFsOgl0aGUgaW5pdGlhbCB2YWx1ZQorICovCitpbnQgY29tZWRpXzgyNTRfbG9hZChzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LCB1bnNpZ25lZCBpbnQgY291bnRlciwKKwkJICAgICB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlpZiAoY291bnRlciA+IDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2YWwgPiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtb2RlID4gKEk4MjU0X01PREU1IHwgSTgyNTRfQkNEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb21lZGlfODI1NF9zZXRfbW9kZShpODI1NCwgY291bnRlciwgbW9kZSk7CisJY29tZWRpXzgyNTRfd3JpdGUoaTgyNTQsIGNvdW50ZXIsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV84MjU0X2xvYWQpOworCisvKioKKyAqIGNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZSAtIHNldCB0aGUgbW9kZSBhbmQgbG9hZCB0aGUgY2FzY2FkZWQgY291bnRlcnMKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqIEBjb3VudGVyMToJdGhlIGNvdW50ZXIgbnVtYmVyIGZvciB0aGUgZmlyc3QgZGl2aXNvcgorICogQGNvdW50ZXIyOgl0aGUgY291bnRlciBudW1iZXIgZm9yIHRoZSBzZWNvbmQgZGl2aXNvcgorICogQGVuYWJsZToJZmxhZyB0byBlbmFibGUgKGxvYWQpIHRoZSBjb3VudGVycworICovCit2b2lkIGNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LAorCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIxLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIyLAorCQkJICAgICAgYm9vbCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IG1vZGU7CisKKwlpZiAoY291bnRlcjEgPiAyIHx8IGNvdW50ZXIyID4gMiB8fCBjb3VudGVyMSA9PSBjb3VudGVyMikKKwkJcmV0dXJuOworCisJaWYgKGVuYWJsZSkKKwkJbW9kZSA9IEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZOworCWVsc2UKKwkJbW9kZSA9IEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZOworCisJY29tZWRpXzgyNTRfc2V0X21vZGUoaTgyNTQsIGNvdW50ZXIxLCBtb2RlKTsKKwljb21lZGlfODI1NF9zZXRfbW9kZShpODI1NCwgY291bnRlcjIsIG1vZGUpOworCisJaWYgKGVuYWJsZSkgeworCQkvKgorCQkgKiBEaXZpc29ycyBhcmUgbG9hZGVkIHNlY29uZCBjb3VudGVyIHRoZW4gZmlyc3QgY291bnRlciB0bworCQkgKiBhdm9pZCBwb3NzaWJsZSBpc3N1ZXMgd2l0aCB0aGUgZmlyc3QgY291bnRlciBleHBpcmluZworCQkgKiBiZWZvcmUgdGhlIHNlY29uZCBjb3VudGVyIGlzIGxvYWRlZC4KKwkJICovCisJCWNvbWVkaV84MjU0X3dyaXRlKGk4MjU0LCBjb3VudGVyMiwgaTgyNTQtPmRpdmlzb3IyKTsKKwkJY29tZWRpXzgyNTRfd3JpdGUoaTgyNTQsIGNvdW50ZXIxLCBpODI1NC0+ZGl2aXNvcjEpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZSk7CisKKy8qKgorICogY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzIC0gdXBkYXRlIHRoZSBkaXZpc29ycyBmb3IgdGhlIGNhc2NhZGVkIGNvdW50ZXJzCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKi8KK3ZvaWQgY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQpCit7CisJLyogbWFza2luZyBpcyBkb25lIHNpbmNlIGNvdW50ZXIgbWFwcyB6ZXJvIHRvIDB4MTAwMDAgKi8KKwlpODI1NC0+ZGl2aXNvciA9IGk4MjU0LT5uZXh0X2RpdiAmIDB4ZmZmZjsKKwlpODI1NC0+ZGl2aXNvcjEgPSBpODI1NC0+bmV4dF9kaXYxICYgMHhmZmZmOworCWk4MjU0LT5kaXZpc29yMiA9IGk4MjU0LT5uZXh0X2RpdjIgJiAweGZmZmY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMpOworCisvKioKKyAqIGNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIgLSBjYWxjdWxhdGUgdGhlIGNhc2NhZGVkIGRpdmlzb3IgdmFsdWVzCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKiBAbmFub3NlYzoJdGhlIGRlc2lyZWQgbnMgdGltZQorICogQGZsYWdzOgljb21lZGlfY21kIGZsYWdzCisgKi8KK3ZvaWQgY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpuYW5vc2VjLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBkMSA9IGk4MjU0LT5uZXh0X2RpdjEgPyBpODI1NC0+bmV4dF9kaXYxIDogSTgyNTRfTUFYX0NPVU5UOworCXVuc2lnbmVkIGludCBkMiA9IGk4MjU0LT5uZXh0X2RpdjIgPyBpODI1NC0+bmV4dF9kaXYyIDogSTgyNTRfTUFYX0NPVU5UOworCXVuc2lnbmVkIGludCBkaXYgPSBkMSAqIGQyOworCXVuc2lnbmVkIGludCBuc19sdWIgPSAweGZmZmZmZmZmOworCXVuc2lnbmVkIGludCBuc19nbGIgPSAwOworCXVuc2lnbmVkIGludCBkMV9sdWIgPSAwOworCXVuc2lnbmVkIGludCBkMV9nbGIgPSAwOworCXVuc2lnbmVkIGludCBkMl9sdWIgPSAwOworCXVuc2lnbmVkIGludCBkMl9nbGIgPSAwOworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgbnM7CisJdW5zaWduZWQgaW50IG5zX2xvdzsKKwl1bnNpZ25lZCBpbnQgbnNfaGlnaDsKKworCS8qIGV4aXQgZWFybHkgaWYgZXZlcnl0aGluZyBpcyBhbHJlYWR5IGNvcnJlY3QgKi8KKwlpZiAoZGl2ICogaTgyNTQtPm9zY19iYXNlID09ICpuYW5vc2VjICYmCisJICAgIGQxID4gMSAmJiBkMSA8PSBJODI1NF9NQVhfQ09VTlQgJiYKKwkgICAgZDIgPiAxICYmIGQyIDw9IEk4MjU0X01BWF9DT1VOVCAmJgorCSAgICAvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKwkgICAgZGl2ID4gZDEgJiYgZGl2ID4gZDIgJiYKKwkgICAgZGl2ICogaTgyNTQtPm9zY19iYXNlID4gZGl2ICYmCisJICAgIGRpdiAqIGk4MjU0LT5vc2NfYmFzZSA+IGk4MjU0LT5vc2NfYmFzZSkKKwkJcmV0dXJuOworCisJZGl2ID0gKm5hbm9zZWMgLyBpODI1NC0+b3NjX2Jhc2U7CisJZDIgPSBJODI1NF9NQVhfQ09VTlQ7CisJc3RhcnQgPSBkaXYgLyBkMjsKKwlpZiAoc3RhcnQgPCAyKQorCQlzdGFydCA9IDI7CisJZm9yIChkMSA9IHN0YXJ0OyBkMSA8PSBkaXYgLyBkMSArIDEgJiYgZDEgPD0gSTgyNTRfTUFYX0NPVU5UOyBkMSsrKSB7CisJCWZvciAoZDIgPSBkaXYgLyBkMTsKKwkJICAgICBkMSAqIGQyIDw9IGRpdiArIGQxICsgMSAmJiBkMiA8PSBJODI1NF9NQVhfQ09VTlQ7IGQyKyspIHsKKwkJCW5zID0gaTgyNTQtPm9zY19iYXNlICogZDEgKiBkMjsKKwkJCWlmIChucyA8PSAqbmFub3NlYyAmJiBucyA+IG5zX2dsYikgeworCQkJCW5zX2dsYiA9IG5zOworCQkJCWQxX2dsYiA9IGQxOworCQkJCWQyX2dsYiA9IGQyOworCQkJfQorCQkJaWYgKG5zID49ICpuYW5vc2VjICYmIG5zIDwgbnNfbHViKSB7CisJCQkJbnNfbHViID0gbnM7CisJCQkJZDFfbHViID0gZDE7CisJCQkJZDJfbHViID0gZDI7CisJCQl9CisJCX0KKwl9CisKKwlzd2l0Y2ggKGZsYWdzICYgQ01ERl9ST1VORF9NQVNLKSB7CisJY2FzZSBDTURGX1JPVU5EX05FQVJFU1Q6CisJZGVmYXVsdDoKKwkJbnNfaGlnaCA9IGQxX2x1YiAqIGQyX2x1YiAqIGk4MjU0LT5vc2NfYmFzZTsKKwkJbnNfbG93ID0gZDFfZ2xiICogZDJfZ2xiICogaTgyNTQtPm9zY19iYXNlOworCQlpZiAobnNfaGlnaCAtICpuYW5vc2VjIDwgKm5hbm9zZWMgLSBuc19sb3cpIHsKKwkJCWQxID0gZDFfbHViOworCQkJZDIgPSBkMl9sdWI7CisJCX0gZWxzZSB7CisJCQlkMSA9IGQxX2dsYjsKKwkJCWQyID0gZDJfZ2xiOworCQl9CisJCWJyZWFrOworCWNhc2UgQ01ERl9ST1VORF9VUDoKKwkJZDEgPSBkMV9sdWI7CisJCWQyID0gZDJfbHViOworCQlicmVhazsKKwljYXNlIENNREZfUk9VTkRfRE9XTjoKKwkJZDEgPSBkMV9nbGI7CisJCWQyID0gZDJfZ2xiOworCQlicmVhazsKKwl9CisKKwkqbmFub3NlYyA9IGQxICogZDIgKiBpODI1NC0+b3NjX2Jhc2U7CisJaTgyNTQtPm5leHRfZGl2MSA9IGQxOworCWk4MjU0LT5uZXh0X2RpdjIgPSBkMjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIpOworCisvKioKKyAqIGNvbWVkaV84MjU0X25zX3RvX3RpbWVyIC0gY2FsY3VsYXRlIHRoZSBkaXZpc29yIHZhbHVlIGZvciBuYW5vc2VjIHRpbWluZworICogQGk4MjU0Ogljb21lZGlfODI1NCBzdHJ1Y3QgZm9yIHRoZSB0aW1lcgorICogQG5hbm9zZWM6CXRoZSBkZXNpcmVkIG5zIHRpbWUKKyAqIEBmbGFnczoJY29tZWRpX2NtZCBmbGFncworICovCit2b2lkIGNvbWVkaV84MjU0X25zX3RvX3RpbWVyKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsCisJCQkgICAgIHVuc2lnbmVkIGludCAqbmFub3NlYywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBkaXZpc29yOworCisJc3dpdGNoIChmbGFncyAmIENNREZfUk9VTkRfTUFTSykgeworCWRlZmF1bHQ6CisJY2FzZSBDTURGX1JPVU5EX05FQVJFU1Q6CisJCWRpdmlzb3IgPSBESVZfUk9VTkRfQ0xPU0VTVCgqbmFub3NlYywgaTgyNTQtPm9zY19iYXNlKTsKKwkJYnJlYWs7CisJY2FzZSBDTURGX1JPVU5EX1VQOgorCQlkaXZpc29yID0gRElWX1JPVU5EX1VQKCpuYW5vc2VjLCBpODI1NC0+b3NjX2Jhc2UpOworCQlicmVhazsKKwljYXNlIENNREZfUk9VTkRfRE9XTjoKKwkJZGl2aXNvciA9ICpuYW5vc2VjIC8gaTgyNTQtPm9zY19iYXNlOworCQlicmVhazsKKwl9CisJaWYgKGRpdmlzb3IgPCAyKQorCQlkaXZpc29yID0gMjsKKwlpZiAoZGl2aXNvciA+IEk4MjU0X01BWF9DT1VOVCkKKwkJZGl2aXNvciA9IEk4MjU0X01BWF9DT1VOVDsKKworCSpuYW5vc2VjID0gZGl2aXNvciAqIGk4MjU0LT5vc2NfYmFzZTsKKwlpODI1NC0+bmV4dF9kaXYgPSBkaXZpc29yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfbnNfdG9fdGltZXIpOworCisvKioKKyAqIGNvbWVkaV84MjU0X3NldF9idXN5IC0gc2V0L2NsZWFyIHRoZSAiYnVzeSIgZmxhZyBmb3IgYSBnaXZlbiBjb3VudGVyCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKiBAY291bnRlcjoJdGhlIGNvdW50ZXIgbnVtYmVyCisgKiBAYnVzeToJc2V0L2NsZWFyIGZsYWcKKyAqLwordm9pZCBjb21lZGlfODI1NF9zZXRfYnVzeShzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LAorCQkJICB1bnNpZ25lZCBpbnQgY291bnRlciwgYm9vbCBidXN5KQoreworCWlmIChjb3VudGVyIDwgMykKKwkJaTgyNTQtPmJ1c3lbY291bnRlcl0gPSBidXN5OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfc2V0X2J1c3kpOworCitzdGF0aWMgaW50IGNvbWVkaV84MjU0X2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCA9IHMtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgaTsKKworCWlmIChpODI1NC0+YnVzeVtjaGFuXSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCisJCWRhdGFbaV0gPSBjb21lZGlfODI1NF9yZWFkKGk4MjU0LCBjaGFuKTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGNvbWVkaV84MjU0X2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwlpZiAoaTgyNTQtPmJ1c3lbY2hhbl0pCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaW5zbi0+bikKKwkJY29tZWRpXzgyNTRfd3JpdGUoaTgyNTQsIGNoYW4sIGRhdGFbaW5zbi0+biAtIDFdKTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IGNvbWVkaV84MjU0X2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0ID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCByZXQ7CisKKwlpZiAoaTgyNTQtPmJ1c3lbY2hhbl0pCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX1JFU0VUOgorCQlyZXQgPSBjb21lZGlfODI1NF9zZXRfbW9kZShpODI1NCwgY2hhbiwKKwkJCQkJICAgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFOgorCQlyZXQgPSBjb21lZGlfODI1NF9zZXRfbW9kZShpODI1NCwgY2hhbiwgZGF0YVsxXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHXzgyNTRfUkVBRF9TVEFUVVM6CisJCWRhdGFbMV0gPSBjb21lZGlfODI1NF9zdGF0dXMoaTgyNTQsIGNoYW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBJZiBhdmFpbGFibGUsIGNhbGwgdGhlIGRyaXZlciBwcm92aWRlZCAoKmluc25fY29uZmlnKQorCQkgKiB0byBoYW5kbGUgYW55IGRyaXZlciBpbXBsZW1lbnRlZCBpbnN0cnVjdGlvbnMuCisJCSAqLworCQlpZiAoaTgyNTQtPmluc25fY29uZmlnKQorCQkJcmV0dXJuIGk4MjU0LT5pbnNuX2NvbmZpZyhkZXYsIHMsIGluc24sIGRhdGEpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBpbnNuLT5uOworfQorCisvKioKKyAqIGNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0IC0gaW5pdGlhbGl6ZSBhIGNvbWVkaV9zdWJkZXZpY2UgZm9yIHRoZSA4MjU0IHRpbWVyCisgKiBAczoJCWNvbWVkaV9zdWJkZXZpY2Ugc3RydWN0CisgKi8KK3ZvaWQgY29tZWRpXzgyNTRfc3ViZGV2aWNlX2luaXQoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCkKK3sKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbgk9IDM7CisJcy0+bWF4ZGF0YQk9IDB4ZmZmZjsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV91bmtub3duOworCXMtPmluc25fcmVhZAk9IGNvbWVkaV84MjU0X2luc25fcmVhZDsKKwlzLT5pbnNuX3dyaXRlCT0gY29tZWRpXzgyNTRfaW5zbl93cml0ZTsKKwlzLT5pbnNuX2NvbmZpZwk9IGNvbWVkaV84MjU0X2luc25fY29uZmlnOworCisJcy0+cHJpdmF0ZQk9IGk4MjU0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfc3ViZGV2aWNlX2luaXQpOworCitzdGF0aWMgc3RydWN0IGNvbWVkaV84MjU0ICpfX2k4MjU0X2luaXQodW5zaWduZWQgbG9uZyBpb2Jhc2UsCisJCQkJCXZvaWQgX19pb21lbSAqbW1pbywKKwkJCQkJdW5zaWduZWQgaW50IG9zY19iYXNlLAorCQkJCQl1bnNpZ25lZCBpbnQgaW9zaXplLAorCQkJCQl1bnNpZ25lZCBpbnQgcmVnc2hpZnQpCit7CisJc3RydWN0IGNvbWVkaV84MjU0ICppODI1NDsKKwlpbnQgaTsKKworCS8qIHNhbml0eSBjaGVjayB0aGF0IHRoZSBpb3NpemUgaXMgdmFsaWQgKi8KKwlpZiAoIShpb3NpemUgPT0gSTgyNTRfSU84IHx8IGlvc2l6ZSA9PSBJODI1NF9JTzE2IHx8CisJICAgICAgaW9zaXplID09IEk4MjU0X0lPMzIpKQorCQlyZXR1cm4gTlVMTDsKKworCWk4MjU0ID0ga3phbGxvYyhzaXplb2YoKmk4MjU0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpODI1NCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpODI1NC0+aW9iYXNlCT0gaW9iYXNlOworCWk4MjU0LT5tbWlvCT0gbW1pbzsKKwlpODI1NC0+aW9zaXplCT0gaW9zaXplOworCWk4MjU0LT5yZWdzaGlmdAk9IHJlZ3NoaWZ0OworCisJLyogZGVmYXVsdCBvc2NfYmFzZSB0byB0aGUgbWF4IHNwZWVkIG9mIGEgZ2VuZXJpYyA4MjU0IHRpbWVyICovCisJaTgyNTQtPm9zY19iYXNlCT0gb3NjX2Jhc2UgPyBvc2NfYmFzZSA6IEk4MjU0X09TQ19CQVNFXzEwTUhaOworCisJLyogcmVzZXQgYWxsIHRoZSBjb3VudGVycyBieSBzZXR0aW5nIHRoZW0gdG8gSTgyNTRfTU9ERTAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQljb21lZGlfODI1NF9zZXRfbW9kZShpODI1NCwgaSwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCisJcmV0dXJuIGk4MjU0OworfQorCisvKioKKyAqIGNvbWVkaV84MjU0X2luaXQgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgODI1NCBkZXZpY2UgZm9yIHBpbyBhY2Nlc3MKKyAqIEBtbWlvOglwb3J0IEkvTyBiYXNlIGFkZHJlc3MKKyAqIEBvc2NfYmFzZToJYmFzZSB0aW1lIG9mIHRoZSBjb3VudGVyIGluIG5zCisgKgkJT1BUSU9OQUwgLSBvbmx5IHVzZWQgYnkgY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcigpCisgKiBAaW9zaXplOglJL08gcmVnaXN0ZXIgc2l6ZQorICogQHJlZ3NoaWZ0OglyZWdpc3RlciBnYXAgc2hpZnQKKyAqLworc3RydWN0IGNvbWVkaV84MjU0ICpjb21lZGlfODI1NF9pbml0KHVuc2lnbmVkIGxvbmcgaW9iYXNlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9zY19iYXNlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGlvc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByZWdzaGlmdCkKK3sKKwlyZXR1cm4gX19pODI1NF9pbml0KGlvYmFzZSwgTlVMTCwgb3NjX2Jhc2UsIGlvc2l6ZSwgcmVnc2hpZnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfaW5pdCk7CisKKy8qKgorICogY29tZWRpXzgyNTRfbW1faW5pdCAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSA4MjU0IGRldmljZSBmb3IgbW1pbyBhY2Nlc3MKKyAqIEBtbWlvOgltZW1vcnkgbWFwcGVkIEkvTyBiYXNlIGFkZHJlc3MKKyAqIEBvc2NfYmFzZToJYmFzZSB0aW1lIG9mIHRoZSBjb3VudGVyIGluIG5zCisgKgkJT1BUSU9OQUwgLSBvbmx5IHVzZWQgYnkgY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcigpCisgKiBAaW9zaXplOglJL08gcmVnaXN0ZXIgc2l6ZQorICogQHJlZ3NoaWZ0OglyZWdpc3RlciBnYXAgc2hpZnQKKyAqLworc3RydWN0IGNvbWVkaV84MjU0ICpjb21lZGlfODI1NF9tbV9pbml0KHZvaWQgX19pb21lbSAqbW1pbywKKwkJCQkJdW5zaWduZWQgaW50IG9zY19iYXNlLAorCQkJCQl1bnNpZ25lZCBpbnQgaW9zaXplLAorCQkJCQl1bnNpZ25lZCBpbnQgcmVnc2hpZnQpCit7CisJcmV0dXJuIF9faTgyNTRfaW5pdCgwLCBtbWlvLCBvc2NfYmFzZSwgaW9zaXplLCByZWdzaGlmdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9tbV9pbml0KTsKKworc3RhdGljIGludCBfX2luaXQgY29tZWRpXzgyNTRfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGNvbWVkaV84MjU0X21vZHVsZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGNvbWVkaV84MjU0X21vZHVsZV9leGl0KHZvaWQpCit7Cit9Cittb2R1bGVfZXhpdChjb21lZGlfODI1NF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGk6IEdlbmVyaWMgODI1NCB0aW1lci9jb3VudGVyIHN1cHBvcnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfODI1NC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV84MjU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5ZjZkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfODI1NC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogY29tZWRpXzgyNTQuaAorICogR2VuZXJpYyA4MjU0IHRpbWVyL2NvdW50ZXIgc3VwcG9ydAorICogQ29weXJpZ2h0IChDKSAyMDE0IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgorICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ09NRURJXzgyNTRfSAorI2RlZmluZSBfQ09NRURJXzgyNTRfSAorCisvKgorICogQ29tbW9uIG9zY2lsbGF0b3IgYmFzZSB2YWx1ZXMgaW4gbmFub3NlY29uZHMKKyAqLworI2RlZmluZSBJODI1NF9PU0NfQkFTRV8xME1IWgkxMDAKKyNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfNU1IWgkyMDAKKyNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfNE1IWgkyNTAKKyNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfMk1IWgk1MDAKKyNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfMU1IWgkxMDAwCisjZGVmaW5lIEk4MjU0X09TQ19CQVNFXzEwMEtIWgkxMDAwMAorI2RlZmluZSBJODI1NF9PU0NfQkFTRV8xMEtIWgkxMDAwMDAKKyNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfMUtIWgkxMDAwMDAwCisKKy8qCisgKiBJL08gYWNjZXNzIHNpemUgdXNlZCB0byByZWFkL3dyaXRlIHJlZ2lzdGVycworICovCisjZGVmaW5lIEk4MjU0X0lPOAkJMQorI2RlZmluZSBJODI1NF9JTzE2CQkyCisjZGVmaW5lIEk4MjU0X0lPMzIJCTQKKworLyoKKyAqIFJlZ2lzdGVyIG1hcCBmb3IgZ2VuZXJpYyA4MjU0IHRpbWVyIChJODI1NF9JTzggd2l0aCAwIHJlZ3NoaWZ0KQorICovCisjZGVmaW5lIEk4MjU0X0NPVU5URVIwX1JFRwkJMHgwMAorI2RlZmluZSBJODI1NF9DT1VOVEVSMV9SRUcJCTB4MDEKKyNkZWZpbmUgSTgyNTRfQ09VTlRFUjJfUkVHCQkweDAyCisjZGVmaW5lIEk4MjU0X0NUUkxfUkVHCQkJMHgwMworI2RlZmluZSBJODI1NF9DVFJMX1NFTF9DVFIoeCkJCSgoeCkgPDwgNikKKyNkZWZpbmUgSTgyNTRfQ1RSTF9SRUFEQkFDS19DT1VOVAkoKDMgPDwgNikgfCAoMSA8PCA0KSkKKyNkZWZpbmUgSTgyNTRfQ1RSTF9SRUFEQkFDS19TVEFUVVMJKCgzIDw8IDYpIHwgKDEgPDwgNSkpCisjZGVmaW5lIEk4MjU0X0NUUkxfUkVBREJBQ0tfU0VMX0NUUih4KQkoMiA8PCAoeCkpCisjZGVmaW5lIEk4MjU0X0NUUkxfTEFUQ0gJCSgwIDw8IDQpCisjZGVmaW5lIEk4MjU0X0NUUkxfTFNCX09OTFkJCSgxIDw8IDQpCisjZGVmaW5lIEk4MjU0X0NUUkxfTVNCX09OTFkJCSgyIDw8IDQpCisjZGVmaW5lIEk4MjU0X0NUUkxfTFNCX01TQgkJKDMgPDwgNCkKKworLyogY291bnRlciBtYXBzIHplcm8gdG8gMHgxMDAwMCAqLworI2RlZmluZSBJODI1NF9NQVhfQ09VTlQJCQkweDEwMDAwCisKKy8qKgorICogc3RydWN0IGNvbWVkaV84MjU0IC0gcHJpdmF0ZSBkYXRhIHVzZWQgYnkgdGhpcyBtb2R1bGUKKyAqIEBpb2Jhc2U6CQlQSU8gYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlcnMgKGluL291dCkKKyAqIEBtbWlvOgkJTU1JTyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVycyAocmVhZC93cml0ZSkKKyAqIEBpb3NpemU6CQlJL08gc2l6ZSB1c2VkIHRvIGFjY2VzcyB0aGUgcmVnaXN0ZXJzIChiL3cvbCkKKyAqIEByZWdzaGlmdDoJCXJlZ2lzdGVyIGdhcCBzaGlmdAorICogQG9zY19iYXNlOgkJY2FzY2FkZWQgb3NjaWxsYXRvciBzcGVlZCBpbiBucworICogQGRpdmlzb3I6CQlkaXZpc29yIGZvciBzaW5nbGUgY291bnRlcgorICogQGRpdmlzb3IxOgkJZGl2aXNvciBsb2FkZWQgaW50byBmaXJzdCBjYXNjYWRlZCBjb3VudGVyCisgKiBAZGl2aXNvcjI6CQlkaXZpc29yIGxvYWRlZCBpbnRvIHNlY29uZCBjYXNjYWRlZCBjb3VudGVyCisgKiAjbmV4dF9kaXY6CQluZXh0IGRpdmlzb3IgZm9yIHNpbmdsZSBjb3VudGVyCisgKiBAbmV4dF9kaXYxOgkJbmV4dCBkaXZpc29yIHRvIHVzZSBmb3IgZmlyc3QgY2FzY2FkZWQgY291bnRlcgorICogQG5leHRfZGl2MjoJCW5leHQgZGl2aXNvciB0byB1c2UgZm9yIHNlY29uZCBjYXNjYWRlZCBjb3VudGVyCisgKiBAY2xvY2tfc3JjOwkJY3VycmVudCBjbG9jayBzb3VyY2UgZm9yIGVhY2ggY291bnRlciAoZHJpdmVyIHNwZWNpZmljKQorICogQGdhdGVfc3JjOwkJY3VycmVudCBnYXRlIHNvdXJjZSAgZm9yIGVhY2ggY291bnRlciAoZHJpdmVyIHNwZWNpZmljKQorICogQGJ1c3k6CQlmbGFncyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBjb3VudGVyIGlzICJidXN5IgorICogQGluc25fY29uZmlnOglkcml2ZXIgc3BlY2lmaWMgKCppbnNuX2NvbmZpZykgY2FsbGJhY2sKKyAqLworc3RydWN0IGNvbWVkaV84MjU0IHsKKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1taW87CisJdW5zaWduZWQgaW50IGlvc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcmVnc2hpZnQ7CisJdW5zaWduZWQgaW50IG9zY19iYXNlOworCXVuc2lnbmVkIGludCBkaXZpc29yOworCXVuc2lnbmVkIGludCBkaXZpc29yMTsKKwl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CisJdW5zaWduZWQgaW50IG5leHRfZGl2OworCXVuc2lnbmVkIGludCBuZXh0X2RpdjE7CisJdW5zaWduZWQgaW50IG5leHRfZGl2MjsKKwl1bnNpZ25lZCBpbnQgY2xvY2tfc3JjWzNdOworCXVuc2lnbmVkIGludCBnYXRlX3NyY1szXTsKKwlib29sIGJ1c3lbM107CisKKwlpbnQgKCppbnNuX2NvbmZpZykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKiwgdW5zaWduZWQgaW50ICpkYXRhKTsKK307CisKK3Vuc2lnbmVkIGludCBjb21lZGlfODI1NF9zdGF0dXMoc3RydWN0IGNvbWVkaV84MjU0ICosIHVuc2lnbmVkIGludCBjb3VudGVyKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfODI1NF9yZWFkKHN0cnVjdCBjb21lZGlfODI1NCAqLCB1bnNpZ25lZCBpbnQgY291bnRlcik7Cit2b2lkIGNvbWVkaV84MjU0X3dyaXRlKHN0cnVjdCBjb21lZGlfODI1NCAqLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIsIHVuc2lnbmVkIGludCB2YWwpOworCitpbnQgY29tZWRpXzgyNTRfc2V0X21vZGUoc3RydWN0IGNvbWVkaV84MjU0ICosCisJCQkgdW5zaWduZWQgaW50IGNvdW50ZXIsIHVuc2lnbmVkIGludCBtb2RlKTsKK2ludCBjb21lZGlfODI1NF9sb2FkKHN0cnVjdCBjb21lZGlfODI1NCAqLAorCQkgICAgIHVuc2lnbmVkIGludCBjb3VudGVyLCB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgbW9kZSk7CisKK3ZvaWQgY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKHN0cnVjdCBjb21lZGlfODI1NCAqLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIxLCB1bnNpZ25lZCBpbnQgY291bnRlcjIsCisJCQkgICAgICBib29sIGVuYWJsZSk7Cit2b2lkIGNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhzdHJ1Y3QgY29tZWRpXzgyNTQgKik7Cit2b2lkIGNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoc3RydWN0IGNvbWVkaV84MjU0ICosCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKm5hbm9zZWMsIHVuc2lnbmVkIGludCBmbGFncyk7Cit2b2lkIGNvbWVkaV84MjU0X25zX3RvX3RpbWVyKHN0cnVjdCBjb21lZGlfODI1NCAqLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKm5hbm9zZWMsIHVuc2lnbmVkIGludCBmbGFncyk7CisKK3ZvaWQgY29tZWRpXzgyNTRfc2V0X2J1c3koc3RydWN0IGNvbWVkaV84MjU0ICosCisJCQkgIHVuc2lnbmVkIGludCBjb3VudGVyLCBib29sIGJ1c3kpOworCit2b2lkIGNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0KHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICosCisJCQkJc3RydWN0IGNvbWVkaV84MjU0ICopOworCitzdHJ1Y3QgY29tZWRpXzgyNTQgKmNvbWVkaV84MjU0X2luaXQodW5zaWduZWQgbG9uZyBpb2Jhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb3NjX2Jhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgaW9zaXplLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJlZ3NoaWZ0KTsKK3N0cnVjdCBjb21lZGlfODI1NCAqY29tZWRpXzgyNTRfbW1faW5pdCh2b2lkIF9faW9tZW0gKm1taW8sCisJCQkJCXVuc2lnbmVkIGludCBvc2NfYmFzZSwKKwkJCQkJdW5zaWduZWQgaW50IGlvc2l6ZSwKKwkJCQkJdW5zaWduZWQgaW50IHJlZ3NoaWZ0KTsKKworI2VuZGlmCS8qIF9DT01FRElfODI1NF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCmluZGV4IDIyMWQzODEuLjk2ZGIwYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCkBAIC0yNjcsNyArMjY3LDYgQEAKIAkJCQlzdHJsY2F0KGRldnByaXYtPm5hbWUsIGJ1ZiwKIAkJCQkJc2l6ZW9mKGRldnByaXYtPm5hbWUpKTsKIAkJCX0KLQogCQl9CiAJfQogCkBAIC0zMTMsOSArMzEyLDkgQEAKIAlzLT5pbnNuX2NvbmZpZyA9IGJvbmRpbmdfZGlvX2luc25fY29uZmlnOwogCiAJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsCi0JCSIlczogJXMgYXR0YWNoZWQsICV1IGNoYW5uZWxzIGZyb20gJXUgZGV2aWNlc1xuIiwKLQkJZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUsCi0JCWRldnByaXYtPm5jaGFucywgZGV2cHJpdi0+bmRldnMpOworCQkgIiVzOiAlcyBhdHRhY2hlZCwgJXUgY2hhbm5lbHMgZnJvbSAldSBkZXZpY2VzXG4iLAorCQkgZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lLCBkZXYtPmJvYXJkX25hbWUsCisJCSBkZXZwcml2LT5uY2hhbnMsIGRldnByaXYtPm5kZXZzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZiZTkzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogY29tZWRpX2ZjLmgKLSAqIFRoaXMgaXMgYSBwbGFjZSBmb3IgY29kZSBkcml2ZXIgd3JpdGVycyB3aXNoIHRvIHNoYXJlIGJldHdlZW4KLSAqIHR3byBvciBtb3JlIGRyaXZlcnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbWVhbnQgdG8gYmUgdXNlZCBvbmx5Ci0gKiBieSBkcml2ZXJzLCB0aGV5IGFyZSBOT1QgcGFydCBvZiB0aGUga2NvbWVkaWxpYiBBUEkhCi0gKgotICogQXV0aG9yOiBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0NPTUVESV9GQ19ICi0jZGVmaW5lIF9DT01FRElfRkNfSAotCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0KLS8qKgotICogY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCkgLSB0cml2aWFsbHkgdmFsaWRhdGUgYSBjb21lZGlfY21kIHRyaWdnZXIgc291cmNlCi0gKiBAc3JjOiBwb2ludGVyIHRvIHRoZSB0cmlnZ2VyIHNvdXJjZSB0byB2YWxpZGF0ZQotICogQGZsYWdzOiBiaXRtYXNrIG9mIHZhbGlkIFRSSUdfKiBmb3IgdGhlIHRyaWdnZXIKLSAqCi0gKiBUaGlzIGlzIHVzZWQgaW4gInN0ZXAgMSIgb2YgdGhlIGRvX2NtZHRlc3QgZnVuY3Rpb25zIG9mIGNvbWVkaSBkcml2ZXJzCi0gKiB0byB2YWlsZGF0ZSB0aGUgY29tZWRpX2NtZCB0cmlnZ2Vycy4gVGhlIG1hc2sgb2YgdGhlIEBzcmMgYWdhaW5zdCB0aGUKLSAqIEBmbGFncyBhbGxvd3MgdGhlIHVzZXJzcGFjZSBjb21lZGlsaWIgdG8gcGFzcyBhbGwgdGhlIGNvbWVkaV9jbWQKLSAqIHRyaWdnZXJzIGFzIFRSSUdfQU5ZIGFuZCBnZXQgYmFjayBhIGJpdG1hc2sgb2YgdGhlIHZhbGlkIHRyaWdnZXIgc291cmNlcy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKHVuc2lnbmVkIGludCAqc3JjLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0JdW5zaWduZWQgaW50IG9yaWdfc3JjID0gKnNyYzsKLQotCSpzcmMgPSBvcmlnX3NyYyAmIGZsYWdzOwotCWlmICgqc3JjID09IFRSSUdfSU5WQUxJRCB8fCAqc3JjICE9IG9yaWdfc3JjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoKSAtIG1ha2Ugc3VyZSBhIHRyaWdnZXIgc291cmNlIGlzIHVuaXF1ZQotICogQHNyYzogdGhlIHRyaWdnZXIgc291cmNlIHRvIGNoZWNrCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZSh1bnNpZ25lZCBpbnQgc3JjKQotewotCS8qIHRoaXMgdGVzdCBpcyB0cnVlIGlmIG1vcmUgdGhhbiBvbmUgX3NyYyBiaXQgaXMgc2V0ICovCi0JaWYgKChzcmMgJiAoc3JjIC0gMSkpICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygpIC0gdHJpdmlhbGx5IHZhbGlkYXRlIGEgdHJpZ2dlciBhcmd1bWVudAotICogQGFyZzogcG9pbnRlciB0byB0aGUgdHJpZ2dlciBhcmcgdG8gdmFsaWRhdGUKLSAqIEB2YWw6IHRoZSB2YWx1ZSB0aGUgYXJndW1lbnQgc2hvdWxkIGJlCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcyh1bnNpZ25lZCBpbnQgKmFyZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlpZiAoKmFyZyAhPSB2YWwpIHsKLQkJKmFyZyA9IHZhbDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oKSAtIHRyaXZpYWxseSB2YWxpZGF0ZSBhIHRyaWdnZXIgYXJndW1lbnQKLSAqIEBhcmc6IHBvaW50ZXIgdG8gdGhlIHRyaWdnZXIgYXJnIHRvIHZhbGlkYXRlCi0gKiBAdmFsOiB0aGUgbWluaW11bSB2YWx1ZSB0aGUgYXJndW1lbnQgc2hvdWxkIGJlCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4odW5zaWduZWQgaW50ICphcmcsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgdmFsKQotewotCWlmICgqYXJnIDwgdmFsKSB7Ci0JCSphcmcgPSB2YWw7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCkgLSB0cml2aWFsbHkgdmFsaWRhdGUgYSB0cmlnZ2VyIGFyZ3VtZW50Ci0gKiBAYXJnOiBwb2ludGVyIHRvIHRoZSB0cmlnZ2VyIGFyZyB0byB2YWxpZGF0ZQotICogQHZhbDogdGhlIG1heGltdW0gdmFsdWUgdGhlIGFyZ3VtZW50IHNob3VsZCBiZQotICovCi1zdGF0aWMgaW5saW5lIGludCBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KHVuc2lnbmVkIGludCAqYXJnLAotCQkJCQkgICAgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlpZiAoKmFyZyA+IHZhbCkgewotCQkqYXJnID0gdmFsOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBfQ09NRURJX0ZDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfaXNhZG1hLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2lzYWRtYS5jCmluZGV4IGU4NTZmMDEuLjZiYTcxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfaXNhZG1hLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9pc2FkbWEuYwpAQCAtMjM1LDcgKzIzNSw4IEBACiAJCQlkZXNjID0gJmRtYS0+ZGVzY1tpXTsKIAkJCWlmIChkZXNjLT52aXJ0X2FkZHIpCiAJCQkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgZGVzYy0+bWF4c2l6ZSwKLQkJCQkJCWRlc2MtPnZpcnRfYWRkciwgZGVzYy0+aHdfYWRkcik7CisJCQkJCQkgIGRlc2MtPnZpcnRfYWRkciwKKwkJCQkJCSAgZGVzYy0+aHdfYWRkcik7CiAJCX0KIAkJa2ZyZWUoZG1hLT5kZXNjKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCmluZGV4IGNlZWY2OTMuLjE1YTQwOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jCkBAIC02OSw4ICs2OSw2IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotCiAvKgogICogUmVnaXN0ZXIgbWFwCiAgKi8KQEAgLTE2MSwxMSArMTU5LDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC0xNzUsMTEgKzE3MywxMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKaW5kZXggZTU2NTI1YS4uODBkNjEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKQEAgLTUwLDcgKzUwLDYgQEAKIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogCkBAIC0yMjUsMTkgKzIyNCwyMCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfTk9XIHwgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTI0NiwyNiArMjQ2LDMwIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19OT1cpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgbmFub19wZXJfbWljcm8pOwotCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbik7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIG5hbm9fcGVyX21pY3JvKTsKKwkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+CisJCQkJCQkJICAgIHNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgICBjbWQtPmNvbnZlcnRfYXJnICoKKwkJCQkJCQkgICAgY21kLT5jaGFubGlzdF9sZW4pOworCQl9CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMjc3LDE0ICsyODEsMTQgQEAKIAkJLyogcm91bmQgdG8gbmVhcmVzdCBtaWNyb3NlYyAqLwogCQlhcmcgPSBuYW5vX3Blcl9taWNybyAqCiAJCSAgICAgICgoYXJnICsgKG5hbm9fcGVyX21pY3JvIC8gMikpIC8gbmFub19wZXJfbWljcm8pOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7CiAJCS8qIHJvdW5kIHRvIG5lYXJlc3QgbWljcm9zZWMgKi8KIAkJYXJnID0gbmFub19wZXJfbWljcm8gKgogCQkgICAgICAoKGFyZyArIChuYW5vX3Blcl9taWNybyAvIDIpKSAvIG5hbm9fcGVyX21pY3JvKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtNDIwLDkgKzQyNCw4IEBACiAJZm9yIChpID0gMDsgaSA8IHMtPm5fY2hhbjsgaSsrKQogCQlkZXZwcml2LT5hb19sb29wYmFja3NbaV0gPSBzLT5tYXhkYXRhIC8gMjsKIAotCWluaXRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKLQlkZXZwcml2LT50aW1lci5mdW5jdGlvbiA9IHdhdmVmb3JtX2FpX2ludGVycnVwdDsKLQlkZXZwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXNldHVwX3RpbWVyKCZkZXZwcml2LT50aW1lciwgd2F2ZWZvcm1fYWlfaW50ZXJydXB0LAorCQkgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIAogCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LAogCQkgIiVzOiAlaSBtaWNyb3ZvbHQsICVsaSBtaWNyb3NlY29uZCB3YXZlZm9ybSBhdHRhY2hlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb250ZWNfcGNpX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMKaW5kZXggMjA1ZjlkZi4uNDk1NmE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMKQEAgLTI2LDkgKzI2LDggQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyoKICAqIFJlZ2lzdGVyIG1hcApAQCAtNTksNyArNTgsNyBAQAogfQogCiBzdGF0aWMgaW50IGNvbnRlY19hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQl1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYwppbmRleCA5NjY5N2ZiLi5mOTdkMThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCkBAIC0xMDMsMTEgKzEwMywxMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAiODI1NS5oIgogCkBAIC02NDksNyArNjQ4LDcgQEAKIH0KIAogc3RhdGljIGludCBkYXFib2FyZDIwMDBfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAljb25zdCBzdHJ1Y3QgZGFxMjAwX2JvYXJkdHlwZSAqYm9hcmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jCmluZGV4IGM3OGMwZGYuLjczZjRjOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICI4MjU1LmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAjaW5jbHVkZSAiZGFzMDguaCIKIAogLyoKQEAgLTM1OSw2MiArMzU5LDYgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotc3RhdGljIHZvaWQgaTgyNTRfaW5pdGlhbGl6ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBkYXMwOF9ib2FyZF9zdHJ1Y3QgKnRoaXNib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXVuc2lnbmVkIGxvbmcgaTgyNTRfaW9iYXNlID0gZGV2LT5pb2Jhc2UgKyB0aGlzYm9hcmQtPmk4MjU0X29mZnNldDsKLQl1bnNpZ25lZCBpbnQgbW9kZSA9IEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDM7ICsraSkKLQkJaTgyNTRfc2V0X21vZGUoaTgyNTRfaW9iYXNlLCAwLCBpLCBtb2RlKTsKLX0KLQotc3RhdGljIGludCBkYXMwOF9jb3VudGVyX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JY29uc3Qgc3RydWN0IGRhczA4X2JvYXJkX3N0cnVjdCAqdGhpc2JvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0JdW5zaWduZWQgbG9uZyBpODI1NF9pb2Jhc2UgPSBkZXYtPmlvYmFzZSArIHRoaXNib2FyZC0+aTgyNTRfb2Zmc2V0OwotCWludCBjaGFuID0gaW5zbi0+Y2hhbnNwZWM7Ci0KLQlkYXRhWzBdID0gaTgyNTRfcmVhZChpODI1NF9pb2Jhc2UsIDAsIGNoYW4pOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGRhczA4X2NvdW50ZXJfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQljb25zdCBzdHJ1Y3QgZGFzMDhfYm9hcmRfc3RydWN0ICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQl1bnNpZ25lZCBsb25nIGk4MjU0X2lvYmFzZSA9IGRldi0+aW9iYXNlICsgdGhpc2JvYXJkLT5pODI1NF9vZmZzZXQ7Ci0JaW50IGNoYW4gPSBpbnNuLT5jaGFuc3BlYzsKLQotCWk4MjU0X3dyaXRlKGk4MjU0X2lvYmFzZSwgMCwgY2hhbiwgZGF0YVswXSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZGFzMDhfY291bnRlcl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQljb25zdCBzdHJ1Y3QgZGFzMDhfYm9hcmRfc3RydWN0ICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQl1bnNpZ25lZCBsb25nIGk4MjU0X2lvYmFzZSA9IGRldi0+aW9iYXNlICsgdGhpc2JvYXJkLT5pODI1NF9vZmZzZXQ7Ci0JaW50IGNoYW4gPSBpbnNuLT5jaGFuc3BlYzsKLQotCXN3aXRjaCAoZGF0YVswXSkgewotCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERToKLQkJaTgyNTRfc2V0X21vZGUoaTgyNTRfaW9iYXNlLCAwLCBjaGFuLCBkYXRhWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTOgotCQlkYXRhWzFdID0gaTgyNTRfc3RhdHVzKGk4MjU0X2lvYmFzZSwgMCwgY2hhbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMjsKLX0KLQogaW50IGRhczA4X2NvbW1vbl9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBpb2Jhc2UpCiB7CiAJY29uc3Qgc3RydWN0IGRhczA4X2JvYXJkX3N0cnVjdCAqdGhpc2JvYXJkID0gZGV2LT5ib2FyZF9wdHI7CkBAIC00NjQsNyArNDA4LDcgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKLQkJLyogaW50aWFsaXplIGFsbCBjaGFubmVscyB0byAwViAqLworCQkvKiBpbml0aWFsaXplIGFsbCBjaGFubmVscyB0byAwViAqLwogCQlmb3IgKGkgPSAwOyBpIDwgcy0+bl9jaGFuOyBpKyspIHsKIAkJCXMtPnJlYWRiYWNrW2ldID0gcy0+bWF4ZGF0YSAvIDI7CiAJCQlkYXMwOF9hb19zZXRfZGF0YShkZXYsIGksIHMtPnJlYWRiYWNrW2ldKTsKQEAgLTUxMSwxNyArNDU1LDE2IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCisJLyogQ291bnRlciBzdWJkZXZpY2UgKDgyNTQpICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbNV07Ci0JLyogODI1NCAqLwotCWlmICh0aGlzYm9hcmQtPmk4MjU0X29mZnNldCAhPSAwKSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7Ci0JCXMtPm5fY2hhbiA9IDM7Ci0JCXMtPm1heGRhdGEgPSAweEZGRkY7Ci0JCXMtPmluc25fcmVhZCA9IGRhczA4X2NvdW50ZXJfcmVhZDsKLQkJcy0+aW5zbl93cml0ZSA9IGRhczA4X2NvdW50ZXJfd3JpdGU7Ci0JCXMtPmluc25fY29uZmlnID0gZGFzMDhfY291bnRlcl9jb25maWc7Ci0JCWk4MjU0X2luaXRpYWxpemUoZGV2KTsKKwlpZiAodGhpc2JvYXJkLT5pODI1NF9vZmZzZXQpIHsKKwkJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKworCQkJCQkgICAgICB0aGlzYm9hcmQtPmk4MjU0X29mZnNldCwKKwkJCQkJICAgICAgMCwgSTgyNTRfSU84LCAwKTsKKwkJaWYgKCFkZXYtPnBhY2VyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJY29tZWRpXzgyNTRfc3ViZGV2aWNlX2luaXQocywgZGV2LT5wYWNlcik7CiAJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDhfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDhfcGNpLmMKaW5kZXggYjJlYTEwYi4uZDhkMjdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOF9wY2kuYwpAQCAtMzIsOSArMzIsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgImRhczA4LmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKaW5kZXggMmMyMDMxMS4uZDdjZjRiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMKQEAgLTc2LDggKzc2LDcgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9pc2FkbWEuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICI4MjU1LmgiCiAKICNkZWZpbmUgREFTMTZfRE1BX1NJWkUgMHhmZjAwCS8qICBzaXplIGluIGJ5dGVzIG9mIGFsbG9jYXRlZCBkbWEgYnVmZmVyICovCkBAIC01OTksMjkgKzU5OCwyOSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwogCiAJdHJpZ19tYXNrID0gVFJJR19GT0xMT1c7CiAJaWYgKGRldnByaXYtPmNhbl9idXJzdCkKIAkJdHJpZ19tYXNrIHw9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCB0cmlnX21hc2spOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIHRyaWdfbWFzayk7CiAKIAl0cmlnX21hc2sgPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CiAJaWYgKGRldnByaXYtPmNhbl9idXJzdCkKIAkJdHJpZ19tYXNrIHw9IFRSSUdfTk9XOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIHRyaWdfbWFzayk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgdHJpZ19tYXNrKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTYzNiwyNiArNjM1LDMwIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpCS8qIGludGVybmFsIHRyaWdnZXIgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJLyogY2hlY2sgYWdhaW5zdCBtYXhpbXVtIGZyZXF1ZW5jeSAqLwotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQlib2FyZC0+YWlfc3BlZWQgKiBjbWQtPmNoYW5saXN0X2xlbik7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBib2FyZC0+YWlfc3BlZWQgKgorCQkJCQkJICAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwl9CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBib2FyZC0+YWlfc3BlZWQpOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgYm9hcmQtPmFpX3NwZWVkKTsKKwl9CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTY2MywxOSArNjY2LDEzIEBACiAJLyogIHN0ZXAgNDogZml4IHVwIGFyZ3VtZW50cyAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihkZXZwcml2LT5jbG9ja2Jhc2UsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmNsb2NrYmFzZSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAlpZiAoZXJyKQogCQlyZXR1cm4gNDsKQEAgLTY5MywxNyArNjkwLDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGFzMTZfc2V0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBucywKIAkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBkYXMxNl9wcml2YXRlX3N0cnVjdCAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIERBUzE2X1RJTUVSX0JBU0VfUkVHOwotCi0JaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihkZXZwcml2LT5jbG9ja2Jhc2UsCi0JCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkgICZucywgZmxhZ3MpOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOworCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJm5zLCBmbGFncyk7CisJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldi0+cGFjZXIpOworCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAogCXJldHVybiBuczsKIH0KQEAgLTcyMiw3ICs3MTEsNyBAQAogCiAJaWYgKGNtZC0+ZmxhZ3MgJiBDTURGX1BSSU9SSVRZKSB7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkgImlzYSBkbWEgdHJhbnNmZXJzIGNhbm5vdCBiZSBwZXJmb3JtZWQgd2l0aCBDTURGX1BSSU9SSVRZLCBhYm9ydGluZ1xuIik7CisJCQkiaXNhIGRtYSB0cmFuc2ZlcnMgY2Fubm90IGJlIHBlcmZvcm1lZCB3aXRoIENNREZfUFJJT1JJVFksIGFib3J0aW5nXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtOTM1LDcgKzkyNCw2IEBACiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIERBUzE2X1NUQVRVU19SRUcpOwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBEQVMxNl9DVFJMX1JFRyk7CiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIERBUzE2X1BBQ0VSX1JFRyk7Ci0Jb3V0YigwLCBkZXYtPmlvYmFzZSArIERBUzE2X1RJTUVSX0JBU0VfUkVHICsgaTgyNTRfY29udHJvbF9yZWcpOwogfQogCiBzdGF0aWMgdm9pZCBkYXMxNl9hbGxvY19kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGRtYV9jaGFuKQpAQCAtOTUwLDkgKzkzOCw4IEBACiAJZGV2cHJpdi0+ZG1hID0gY29tZWRpX2lzYWRtYV9hbGxvYyhkZXYsIDIsIGRtYV9jaGFuLCBkbWFfY2hhbiwKIAkJCQkJICAgREFTMTZfRE1BX1NJWkUsIENPTUVESV9JU0FETUFfUkVBRCk7CiAJaWYgKGRldnByaXYtPmRtYSkgewotCQlpbml0X3RpbWVyKCZkZXZwcml2LT50aW1lcik7Ci0JCWRldnByaXYtPnRpbWVyLmZ1bmN0aW9uID0gZGFzMTZfdGltZXJfaW50ZXJydXB0OwotCQlkZXZwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCQlzZXR1cF90aW1lcigmZGV2cHJpdi0+dGltZXIsIGRhczE2X3RpbWVyX2ludGVycnVwdCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOwogCX0KIH0KIApAQCAtMTAzOSw2ICsxMDI2LDcgQEAKIAljb25zdCBzdHJ1Y3QgZGFzMTZfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7CiAJc3RydWN0IGRhczE2X3ByaXZhdGVfc3RydWN0ICpkZXZwcml2OwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCXVuc2lnbmVkIGludCBvc2NfYmFzZTsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCWludCByZXQ7CiAKQEAgLTEwNzgsMjEgKzEwNjYsMjEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiAgZ2V0IG1hc3RlciBjbG9jayBzcGVlZCAqLworCW9zY19iYXNlID0gSTgyNTRfT1NDX0JBU0VfMU1IWjsKIAlpZiAoZGV2cHJpdi0+Y2FuX2J1cnN0KSB7CiAJCXN0YXR1cyA9IGluYihkZXYtPmlvYmFzZSArIERBUzE2MDBfU1RBVFVTX1JFRyk7Ci0KIAkJaWYgKHN0YXR1cyAmIERBUzE2MDBfU1RBVFVTX0NMS18xME1IWikKLQkJCWRldnByaXYtPmNsb2NrYmFzZSA9IEk4MjU0X09TQ19CQVNFXzEwTUhaOwotCQllbHNlCi0JCQlkZXZwcml2LT5jbG9ja2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xTUhaOworCQkJb3NjX2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xME1IWjsKIAl9IGVsc2UgewogCQlpZiAoaXQtPm9wdGlvbnNbM10pCi0JCQlkZXZwcml2LT5jbG9ja2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xTUhaIC8KLQkJCQkJICAgICBpdC0+b3B0aW9uc1szXTsKLQkJZWxzZQotCQkJZGV2cHJpdi0+Y2xvY2tiYXNlID0gSTgyNTRfT1NDX0JBU0VfMU1IWjsKKwkJCW9zY19iYXNlID0gSTgyNTRfT1NDX0JBU0VfMU1IWiAvIGl0LT5vcHRpb25zWzNdOwogCX0KIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgREFTMTZfVElNRVJfQkFTRV9SRUcsCisJCQkJICAgICAgb3NjX2Jhc2UsIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWRhczE2X2FsbG9jX2RtYShkZXYsIGl0LT5vcHRpb25zWzJdKTsKIAogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCArIGJvYXJkLT5oYXNfODI1NSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2bTEuYwppbmRleCAzNjY2YTY4Li4xYWRmNmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNm0xLmMKQEAgLTUzLDEyICs1MywxMiBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgIjgyNTUuaCIKLSNpbmNsdWRlICI4MjUzLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogI2RlZmluZSBEQVMxNk0xX1NJWkUyIDgKIApAQCAtMTAzLDggKzEwMyw2IEBACiAjZGVmaW5lICAgUV9SQU5HRSh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4ZikgPDwgNCkKICNkZWZpbmUgICBVTklQT0xBUiAgICAgICAgICAgICAgIDB4NDAKICNkZWZpbmUgREFTMTZNMV84MjU0X0ZJUlNUICAgICAgICAgICAgIDB4OAotI2RlZmluZSBEQVMxNk0xXzgyNTRfRklSU1RfQ05UUkwgICAgICAgMHhiCi0jZGVmaW5lICAgVE9UQUxfQ0xFQVIgICAgICAgICAgICAgICAgICAgIDB4MzAKICNkZWZpbmUgREFTMTZNMV84MjU0X1NFQ09ORCAgICAgICAgICAgIDB4YwogI2RlZmluZSBEQVMxNk0xXzgyQzU1ICAgICAgICAgICAgICAgICAgMHg0MDAKICNkZWZpbmUgREFTMTZNMV84MjU0X1RISVJEICAgICAgICAgICAgIDB4NDA0CkBAIC0xMjQsNiArMTIyLDcgQEAKIH07CiAKIHN0cnVjdCBkYXMxNm0xX3ByaXZhdGVfc3RydWN0IHsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmNvdW50ZXI7CiAJdW5zaWduZWQgaW50IGNvbnRyb2xfc3RhdGU7CiAJdW5zaWduZWQgaW50IGFkY19jb3VudDsJLyogIG51bWJlciBvZiBzYW1wbGVzIGNvbXBsZXRlZCAqLwogCS8qIGluaXRpYWwgdmFsdWUgaW4gbG93ZXIgaGFsZiBvZiBoYXJkd2FyZSBjb252ZXJzaW9uIGNvdW50ZXIsCkBAIC0xMzEsOCArMTMwLDYgQEAKIAkgKiBjb3VudGVyIHlldCAobG9hZGVkIGJ5IGZpcnN0IHNhbXBsZSBjb252ZXJzaW9uKSAqLwogCXUxNiBpbml0aWFsX2h3X2NvdW50OwogCXVuc2lnbmVkIHNob3J0IGFpX2J1ZmZlcltGSUZPX1NJWkVdOwotCXVuc2lnbmVkIGludCBkaXZpc29yMTsJLyogIGRpdmlkZXMgbWFzdGVyIGNsb2NrIHRvIG9idGFpbiBjb252ZXJzaW9uIHNwZWVkICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3IyOwkvKiAgZGl2aWRlcyBtYXN0ZXIgY2xvY2sgdG8gb2J0YWluIGNvbnZlcnNpb24gc3BlZWQgKi8KIAl1bnNpZ25lZCBsb25nIGV4dHJhX2lvYmFzZTsKIH07CiAKQEAgLTE2OSw3ICsxNjYsNyBAQAogCiAJCWlmICgoaSAlIDIpICE9IChjaGFuICUgMikpIHsKIAkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkJICJldmVuL29kZCBjaGFubmVscyBtdXN0IGdvIGhhdmUgZXZlbi9vZGQgY2hhbmxpc3QgaW5kaWNlc1xuIik7CisJCQkJImV2ZW4vb2RkIGNoYW5uZWxzIG11c3QgZ28gaGF2ZSBldmVuL29kZCBjaGFubGlzdCBpbmRpY2VzXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTgwLDI2ICsxNzcsMjUgQEAKIHN0YXRpYyBpbnQgZGFzMTZtMV9jbWRfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCXN0cnVjdCBkYXMxNm0xX3ByaXZhdGVfc3RydWN0ICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMjA4LDIwICsyMDQsMjEgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTAwMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMjI5LDEyICsyMjYsMTAgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhcmd1bWVudHMgKi8KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQl1bnNpZ25lZCBpbnQgYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKKworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC0yNTAsMjUgKzI0NSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkYXMxNm0xX3NldF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkYXMxNm0xX3ByaXZhdGVfc3RydWN0ICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgREFTMTZNMV84MjU0X1NFQ09ORDsKLQotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0KLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOwotfQotCiBzdGF0aWMgaW50IGRhczE2bTFfY21kX2V4ZWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgZGFzMTZtMV9wcml2YXRlX3N0cnVjdCAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIERBUzE2TTFfODI1NF9GSVJTVDsKIAl1bnNpZ25lZCBpbnQgYnl0ZSwgaTsKIAogCS8qIGRpc2FibGUgaW50ZXJydXB0cyBhbmQgaW50ZXJuYWwgcGFjZXIgKi8KQEAgLTI3NywxNCArMjU5LDIxIEBACiAKIAkvKiAgc2V0IHNvZnR3YXJlIGNvdW50ICovCiAJZGV2cHJpdi0+YWRjX2NvdW50ID0gMDsKLQkvKiBJbml0aWFsaXplIGxvd2VyIGhhbGYgb2YgaGFyZHdhcmUgY291bnRlciwgdXNlZCB0byBkZXRlcm1pbmUgaG93CisKKwkvKgorCSAqIEluaXRpYWxpemUgbG93ZXIgaGFsZiBvZiBoYXJkd2FyZSBjb3VudGVyLCB1c2VkIHRvIGRldGVybWluZSBob3cKIAkgKiBtYW55IHNhbXBsZXMgYXJlIGluIGZpZm8uICBWYWx1ZSBkb2Vzbid0IGFjdHVhbGx5IGxvYWQgaW50byBjb3VudGVyCi0JICogdW50aWwgY291bnRlcidzIG5leHQgY2xvY2sgKHRoZSBuZXh0IGEvZCBjb252ZXJzaW9uKSAqLwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCAwKTsKLQkvKiByZW1lbWJlciBjdXJyZW50IHJlYWRpbmcgb2YgY291bnRlciBzbyB3ZSBrbm93IHdoZW4gY291bnRlciBoYXMKLQkgKiBhY3R1YWxseSBiZWVuIGxvYWRlZCAqLwotCWRldnByaXYtPmluaXRpYWxfaHdfY291bnQgPSBpODI1NF9yZWFkKHRpbWVyX2Jhc2UsIDAsIDEpOworCSAqIHVudGlsIGNvdW50ZXIncyBuZXh0IGNsb2NrICh0aGUgbmV4dCBhL2QgY29udmVyc2lvbikuCisJICovCisJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2cHJpdi0+Y291bnRlciwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOworCWNvbWVkaV84MjU0X3dyaXRlKGRldnByaXYtPmNvdW50ZXIsIDEsIDApOworCisJLyoKKwkgKiBSZW1lbWJlciBjdXJyZW50IHJlYWRpbmcgb2YgY291bnRlciBzbyB3ZSBrbm93IHdoZW4gY291bnRlciBoYXMKKwkgKiBhY3R1YWxseSBiZWVuIGxvYWRlZC4KKwkgKi8KKwlkZXZwcml2LT5pbml0aWFsX2h3X2NvdW50ID0gY29tZWRpXzgyNTRfcmVhZChkZXZwcml2LT5jb3VudGVyLCAxKTsKKwogCS8qIHNldHVwIGNoYW5uZWwvZ2FpbiBxdWV1ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CiAJCW91dGIoaSwgZGV2LT5pb2Jhc2UgKyBEQVMxNk0xX1FVRVVFX0FERFIpOwpAQCAtMjk3LDcgKzI4Niw4IEBACiAJLyogZW5hYmxlIGludGVycnVwdHMgYW5kIHNldCBpbnRlcm5hbCBwYWNlciBjb3VudGVyIG1vZGUgYW5kIGNvdW50cyAqLwogCWRldnByaXYtPmNvbnRyb2xfc3RhdGUgJj0gflBBQ0VSX01BU0s7CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlkYXMxNm0xX3NldF9wYWNlcihkZXYpOworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAkJZGV2cHJpdi0+Y29udHJvbF9zdGF0ZSB8PSBJTlRfUEFDRVI7CiAJfSBlbHNlIHsJLyogVFJJR19FWFQgKi8KIAkJZGV2cHJpdi0+Y29udHJvbF9zdGF0ZSB8PSBFWFRfUEFDRVI7CkBAIC00MTcsOCArNDA3LDggQEAKIAlhc3luYyA9IHMtPmFzeW5jOwogCWNtZCA9ICZhc3luYy0+Y21kOwogCi0JLyogIGZpZ3VyZSBvdXQgaG93IG1hbnkgc2FtcGxlcyBhcmUgaW4gZmlmbyAqLwotCWh3X2NvdW50ZXIgPSBpODI1NF9yZWFkKGRldi0+aW9iYXNlICsgREFTMTZNMV84MjU0X0ZJUlNULCAwLCAxKTsKKwkvKiBmaWd1cmUgb3V0IGhvdyBtYW55IHNhbXBsZXMgYXJlIGluIGZpZm8gKi8KKwlod19jb3VudGVyID0gY29tZWRpXzgyNTRfcmVhZChkZXZwcml2LT5jb3VudGVyLCAxKTsKIAkvKiBtYWtlIHN1cmUgaGFyZHdhcmUgY291bnRlciByZWFkaW5nIGlzIG5vdCBib2d1cyBkdWUgdG8gaW5pdGlhbCB2YWx1ZQogCSAqIG5vdCBoYXZpbmcgYmVlbiBsb2FkZWQgeWV0ICovCiAJaWYgKGRldnByaXYtPmFkY19jb3VudCA9PSAwICYmIGh3X2NvdW50ZXIgPT0gZGV2cHJpdi0+aW5pdGlhbF9od19jb3VudCkgewpAQCAtNTYzLDYgKzU1MywxNiBAQAogCQkJZGV2LT5pcnEgPSBpdC0+b3B0aW9uc1sxXTsKIAl9CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIERBUzE2TTFfODI1NF9TRUNPTkQsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMTBNSFosIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldnByaXYtPmNvdW50ZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgREFTMTZNMV84MjU0X0ZJUlNULAorCQkJCQkgICAgMCwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldnByaXYtPmNvdW50ZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNjA5LDkgKzYwOSw2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCS8qICBkaXNhYmxlIHVwcGVyIGhhbGYgb2YgaGFyZHdhcmUgY29udmVyc2lvbiBjb3VudGVyIHNvIGl0IGRvZXNuJ3QgbWVzcyB3aXRoIHVzICovCi0Jb3V0YihUT1RBTF9DTEVBUiwgZGV2LT5pb2Jhc2UgKyBEQVMxNk0xXzgyNTRfRklSU1RfQ05UUkwpOwotCiAJLyogIGluaXRpYWxpemUgZGlnaXRhbCBvdXRwdXQgbGluZXMgKi8KIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgREFTMTZNMV9ESU8pOwogCkBAIC02MjYsOCArNjIzLDExIEBACiB7CiAJc3RydWN0IGRhczE2bTFfcHJpdmF0ZV9zdHJ1Y3QgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5leHRyYV9pb2Jhc2UpCi0JCXJlbGVhc2VfcmVnaW9uKGRldnByaXYtPmV4dHJhX2lvYmFzZSwgREFTMTZNMV9TSVpFMik7CisJaWYgKGRldnByaXYpIHsKKwkJaWYgKGRldnByaXYtPmV4dHJhX2lvYmFzZSkKKwkJCXJlbGVhc2VfcmVnaW9uKGRldnByaXYtPmV4dHJhX2lvYmFzZSwgREFTMTZNMV9TSVpFMik7CisJCWtmcmVlKGRldnByaXYtPmNvdW50ZXIpOworCX0KIAljb21lZGlfbGVnYWN5X2RldGFjaChkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE4MDAuYwppbmRleCAwNzkwYTI4Li41M2JhZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMKQEAgLTEwMiw4ICsxMDIsNyBAQAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiY29tZWRpX2lzYWRtYS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAvKiBtaXNjLiBkZWZpbmVzICovCiAjZGVmaW5lIERBUzE4MDBfU0laRSAgICAgICAgICAgMTYJLyogdXNlcyAxNiBpbyBhZGRyZXNzZXMgKi8KQEAgLTQyMiw4ICs0MjEsNiBAQAogCiBzdHJ1Y3QgZGFzMTgwMF9wcml2YXRlIHsKIAlzdHJ1Y3QgY29tZWRpX2lzYWRtYSAqZG1hOwotCXVuc2lnbmVkIGludCBkaXZpc29yMTsJLyogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciAxIGZvciB0aW1lZCBjb252ZXJzaW9ucyAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsJLyogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciAyIGZvciB0aW1lZCBjb252ZXJzaW9ucyAqLwogCWludCBpcnFfZG1hX2JpdHM7CS8qIGJpdHMgZm9yIGNvbnRyb2wgcmVnaXN0ZXIgYiAqLwogCS8qIGRtYSBiaXRzIGZvciBjb250cm9sIHJlZ2lzdGVyIGIsIHN0b3JlZCBzbyB0aGF0IGRtYSBjYW4gYmUKIAkgKiB0dXJuZWQgb24gYW5kIG9mZiAqLwpAQCAtNDkxLDkgKzQ4OCw3IEBACiAKIAl3aGlsZSAoaW5iKGRldi0+aW9iYXNlICsgREFTMTgwMF9TVEFUVVMpICYgRk5FKSB7CiAJCWRwbnQgPSBpbncoZGV2LT5pb2Jhc2UgKyBEQVMxODAwX0ZJRk8pOwotCQkvKiBjb252ZXJ0IHRvIHVuc2lnbmVkIHR5cGUgaWYgd2UgYXJlIGluIGEgYmlwb2xhciBtb2RlICovCi0JCWlmICghdW5pcG9sYXIpCi0JCQk7CisJCS8qIGNvbnZlcnQgdG8gdW5zaWduZWQgdHlwZSAqLwogCQlkcG50ID0gbXVuZ2VfYmlwb2xhcl9zYW1wbGUoZGV2LCBkcG50KTsKIAkJY29tZWRpX2J1Zl93cml0ZV9zYW1wbGVzKHMsICZkcG50LCAxKTsKIApAQCAtNzMxLDE4ICs3MjYsMTggQEAKIAkJCQkgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAljb25zdCBzdHJ1Y3QgZGFzMTgwMF9ib2FyZCAqdGhpc2JvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IGRhczE4MDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQgYXJnOwogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfRk9MTE9XIHwgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCiAJCQkJCVRSSUdfQ09VTlQgfCBUUklHX0VYVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQpAQCAtNzUwLDEwICs3NDUsMTAgQEAKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTc2NiwyMSArNzYxLDIzIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgdGhpc2JvYXJkLT5haV9zcGVlZCk7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKKwl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CiAJY2FzZSBUUklHX0NPVU5UOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX05PTkU6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC03OTUsMzUgKzc5MiwyNCBAQAogCSAgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJLyogd2UgYXJlIG5vdCBpbiBidXJzdCBtb2RlICovCiAJCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfNU1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZjbWQtPmNvbnZlcnRfYXJnLCBjbWQtPmZsYWdzKTsKLQkJaWYgKGFyZyAhPSBjbWQtPmNvbnZlcnRfYXJnKQotCQkJZXJyKys7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAJfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJLyogd2UgYXJlIGluIGJ1cnN0IG1vZGUgKi8KLQkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJY21kLT5jb252ZXJ0X2FyZyA9IGJ1cnN0X2NvbnZlcnRfYXJnKGNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgICAgIGNtZC0+ZmxhZ3MpOwotCQlpZiAoYXJnICE9IGNtZC0+Y29udmVydF9hcmcpCi0JCQllcnIrKzsKKwkJYXJnID0gYnVyc3RfY29udmVydF9hcmcoY21kLT5jb252ZXJ0X2FyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAKIAkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQkJYXJnID0gY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuOwotCQkJaWYgKGFyZyA+IGNtZC0+c2Nhbl9iZWdpbl9hcmcpIHsKLQkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gYXJnOwotCQkJCWVycisrOwotCQkJfQorCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+CisJCQkJCQkJICAgIHNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgICBhcmcpOwogCiAJCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwotCQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV81TUhaLAotCQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJCSAgJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgIGNtZC0+ZmxhZ3MpOwotCQkJaWYgKGFyZyAhPSBjbWQtPnNjYW5fYmVnaW5fYXJnKQotCQkJCWVycisrOworCQkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLAorCQkJCQkJCWNtZC0+ZmxhZ3MpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICBhcmcpOwogCQl9CiAJfQogCkBAIC05MTAsMzEgKzg5Niw2IEBACiAJcmV0dXJuIGNvbnRyb2xfYzsKIH0KIAotc3RhdGljIHZvaWQgZGFzMTgwMF9zZXR1cF9jb3VudGVycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBjb21lZGlfY21kICpjbWQpCi17Ci0Jc3RydWN0IGRhczE4MDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIERBUzE4MDBfQ09VTlRFUjsKLQotCS8qIHNldHVwIGNhc2NhZGVkIGNvdW50ZXJzIGZvciBjb252ZXJzaW9uL3NjYW4gZnJlcXVlbmN5ICovCi0JaWYgKChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XIHx8Ci0JICAgICBjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpICYmCi0JICAgIGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmRpdmlzb3IyKTsKLQl9Ci0KLQkvKiBzZXR1cCBjb3VudGVyIDAgZm9yICdhYm91dCB0cmlnZ2VyaW5nJyAqLwotCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfRVhUKSB7Ci0JCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAwLCAxKTsKLQl9Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGFzMTgwMF9haV90cmFuc2Zlcl9zaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJCSAgICAgdW5zaWduZWQgaW50IG1heGJ5dGVzLApAQCAtMTA1Myw3ICsxMDE0LDE5IEBACiAKIAkvKiBzZXR1cCBjYXJkIGFuZCBzdGFydCAqLwogCXByb2dyYW1fY2hhbmxpc3QoZGV2LCBjbWQpOwotCWRhczE4MDBfc2V0dXBfY291bnRlcnMoZGV2LCBjbWQpOworCisJLyogc2V0dXAgY2FzY2FkZWQgY291bnRlcnMgZm9yIGNvbnZlcnNpb24vc2NhbiBmcmVxdWVuY3kgKi8KKwlpZiAoKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgfHwKKwkgICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgJiYKKwkgICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOworCX0KKworCS8qIHNldHVwIGNvdW50ZXIgMCBmb3IgJ2Fib3V0IHRyaWdnZXJpbmcnICovCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19FWFQpCisJCWNvbWVkaV84MjU0X2xvYWQoZGV2LT5wYWNlciwgMCwgMSwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCiAJZGFzMTgwMF9haV9zZXR1cF9kbWEoZGV2LCBzKTsKIAlvdXRiKGNvbnRyb2xfYywgZGV2LT5pb2Jhc2UgKyBEQVMxODAwX0NPTlRST0xfQyk7CiAJLyogIHNldCBjb252ZXJzaW9uIHJhdGUgYW5kIGxlbmd0aCBmb3IgYnVyc3QgbW9kZSAqLwpAQCAtMTE3MSw3ICsxMTQ0LDYgQEAKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQogCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxODAwX0RJR0lUQUwpICYgMHhmOwogCWRhdGFbMF0gPSAwOwogCkBAIC0xMzc4LDYgKzEzNTAsMTEgQEAKIAlpZiAoIWRldnByaXYtPmZpZm9fYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgREFTMTgwMF9DT1VOVEVSLAorCQkJCSAgICAgIEk4MjU0X09TQ19CQVNFXzVNSFosIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCmluZGV4IGI4NzU1YjUuLjE3MDEyOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczY0MDIuYwpAQCAtMzUsOCArMzUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogLyoKICAqIFJlZ2lzdGVyIEkvTyBtYXAKQEAgLTEzOCwxMSArMTM4LDYgQEAKIAogc3RydWN0IGRhczY0MDJfcHJpdmF0ZSB7CiAJdW5zaWduZWQgaW50IGlycTsKLQotCXVuc2lnbmVkIGludCBjb3VudDsKLQl1bnNpZ25lZCBpbnQgZGl2aWRlcjE7Ci0JdW5zaWduZWQgaW50IGRpdmlkZXIyOwotCiAJdW5zaWduZWQgaW50IGFvX3JhbmdlOwogfTsKIApAQCAtMTcyLDI3ICsxNjcsNiBAQAogCW91dGIoREFTNjQwMl9TVEFUVVNfV19DTFJJTlQsIGRldi0+aW9iYXNlICsgREFTNjQwMl9TVEFUVVNfUkVHKTsKIH0KIAotc3RhdGljIHZvaWQgZGFzNjQwMl9lbmFibGVfY291bnRlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBib29sIGxvYWQpCi17Ci0Jc3RydWN0IGRhczY0MDJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2lvYmFzZSA9IGRldi0+aW9iYXNlICsgREFTNjQwMl9USU1FUl9CQVNFOwotCi0JaWYgKGxvYWQpIHsKLQkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQotCQlpODI1NF93cml0ZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIGRldnByaXYtPmNvdW50KTsKLQkJaTgyNTRfd3JpdGUodGltZXJfaW9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpZGVyMSk7Ci0JCWk4MjU0X3dyaXRlKHRpbWVyX2lvYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aWRlcjIpOwotCi0JfSBlbHNlIHsKLQkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQl9Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGFzNjQwMl9haV9yZWFkX3NhbXBsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKQEAgLTI2Nyw3ICsyNDEsOCBAQAogCW91dHcoREFTNjQwMl9BSV9NVVhfSEkoY2hhbl9oaSkgfCBEQVM2NDAyX0FJX01VWF9MTyhjaGFuX2xvKSwKIAkgICAgIGRldi0+aW9iYXNlICsgREFTNjQwMl9BSV9NVVhfUkVHKTsKIAotCWRhczY0MDJfZW5hYmxlX2NvdW50ZXIoZGV2LCB0cnVlKTsKKwljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOwogCiAJLyogZW5hYmxlIGludGVycnVwdCBhbmQgcGFjZXIgdHJpZ2dlciAqLwogCW91dGIoREFTNjQwMl9DVFJMX0lOVEUgfApAQCAtMzIyLDI0ICsyOTcsMjMgQEAKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMzQ4LDMwICszMjIsMjYgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTAwMDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKIAogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aWRlcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlkZXIyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwotCX0KKwlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOworCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiA0OwpAQCAtNTgxLDggKzU1MSw2IEBACiAJb3V0dygwLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfQU9fREFUQV9SRUcoMCkpOwogCWludyhkZXYtPmlvYmFzZSArIERBUzY0MDJfQU9fTFNCX1JFRygwKSk7CiAKLQlkYXM2NDAyX2VuYWJsZV9jb3VudGVyKGRldiwgZmFsc2UpOwotCiAJLyogc2V0IGFsbCBkaWdpdGFsIG91dHB1dHMgbG93ICovCiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIERBUzY0MDJfRElfRE9fUkVHKTsKIApAQCAtNjMxLDYgKzU5OSwxMSBAQAogCQl9CiAJfQogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1RJTUVSX0JBU0UsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMTBNSFosIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM4MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM4MDAuYwppbmRleCBmZjdmNGJlLi4zOWQzMDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jCkBAIC00Myw4ICs0Myw2IEBACiAKIAlUaGUgY2lvLWRhczgwMi8xNiBkb2VzIG5vdCBoYXZlIGEgZmlmby1lbXB0eSBzdGF0dXMgYml0ISAgVGhlcmVmb3JlCiAJb25seSBmaWZvLWhhbGYtZnVsbCB0cmFuc2ZlcnMgYXJlIHBvc3NpYmxlIHdpdGggdGhpcyBjYXJkLgotKi8KLS8qCiAKIGNtZCB0cmlnZ2VycyBzdXBwb3J0ZWQ6CiAJc3RhcnRfc3JjOiAgICAgIFRSSUdfTk9XIHwgVFJJR19FWFQKQEAgLTUyLDE4ICs1MCwxNSBAQAogCXNjYW5fZW5kX3NyYzogICBUUklHX0NPVU5UCiAJY29udmVydF9zcmM6ICAgIFRSSUdfVElNRVIgfCBUUklHX0VYVAogCXN0b3Bfc3JjOiAgICAgICBUUklHX05PTkUgfCBUUklHX0NPVU5UCi0KLQogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAotI2luY2x1ZGUgIjgyNTMuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKICNkZWZpbmUgTl9DSEFOX0FJICAgICAgICAgICAgIDgJLyogIG51bWJlciBvZiBhbmFsb2cgaW5wdXQgY2hhbm5lbHMgKi8KIApAQCAtMjE5LDggKzIxNCw2IEBACiB9OwogCiBzdHJ1Y3QgZGFzODAwX3ByaXZhdGUgewotCXVuc2lnbmVkIGludCBkaXZpc29yMTsJLyogY291bnRlciAxIHZhbHVlIGZvciB0aW1lZCBjb252ZXJzaW9ucyAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsJLyogY291bnRlciAyIHZhbHVlIGZvciB0aW1lZCBjb252ZXJzaW9ucyAqLwogCXVuc2lnbmVkIGludCBkb19iaXRzOwkvKiBkaWdpdGFsIG91dHB1dCBiaXRzICovCiB9OwogCkBAIC0yNzIsMTcgKzI2NSw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgaXJxX2ZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgZGFzODAwX3NldF9mcmVxdWVuY3koc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZGFzODAwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBEQVM4MDBfODI1NDsKLQotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMSwgZGV2cHJpdi0+ZGl2aXNvcjEpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmRpdmlzb3IyKTsKLX0KLQogc3RhdGljIGludCBkYXM4MDBfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCWRhczgwMF9kaXNhYmxlKGRldik7CkBAIC0zMjIsMjYgKzMwNCwyNSBAQAogCQkJCXN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJY29uc3Qgc3RydWN0IGRhczgwMF9ib2FyZCAqdGhpc2JvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IGRhczgwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMzUwLDE5ICszMzEsMjEgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIHRoaXNib2FyZC0+YWlfc3BlZWQpOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTM3MCwxMiArMzUzLDEwIEBACiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzFNSFosCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJdW5zaWduZWQgaW50IGFyZyA9IGNtZC0+Y29udmVydF9hcmc7CisKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtNDI2LDggKzQwNyw4IEBACiAJCWNvbnZfYml0cyB8PSBEVEVOOwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJY29udl9iaXRzIHw9IENBU0MgfCBJVEU7Ci0JCS8qIHNldCBjb252ZXJzaW9uIGZyZXF1ZW5jeSAqLwotCQlkYXM4MDBfc2V0X2ZyZXF1ZW5jeShkZXYpOworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgaXJxX2ZsYWdzKTsKQEAgLTY5Nyw2ICs2NzgsMTEgQEAKIAkJCWRldi0+aXJxID0gaXJxOwogCX0KIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgREFTODAwXzgyNTQsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMU1IWiwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKaW5kZXggMWFmMDA2Ni4uYmIyODgzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCkBAIC0zMCw3ICszMCw3IEBACiAgKiBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIERpYW1vbmQgU3lzdGVtcyBNTS0zMi1BVCBib2FyZAogICoJaHR0cDovL3d3dy5kaWFtb25kc3lzdGVtcy5jb20vcHJvZHVjdHMvZGlhbW9uZG1tMzJhdAogICoKLSAqIEl0IGlzIGJlaW5nIHVzZWQgb24gc2VydmVyYWwgcHJvamVjdHMgaW5zaWRlIE5BU0EsIHdpdGhvdXQKKyAqIEl0IGlzIGJlaW5nIHVzZWQgb24gc2V2ZXJhbCBwcm9qZWN0cyBpbnNpZGUgTkFTQSwgd2l0aG91dAogICogcHJvYmxlbXMgc28gZmFyLiBGb3IgYW5hbG9nIGlucHV0IGNvbW1hbmRzLCBUUklHX0VYVCBpcyBub3QKICAqIHlldCBzdXBwb3J0ZWQuCiAgKi8KQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgIjgyNTUuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAogLyogQm9hcmQgcmVnaXN0ZXIgYWRkcmVzc2VzICovCiAjZGVmaW5lIERNTTMyQVRfQUlfU1RBUlRfQ09OVl9SRUcJMHgwMApAQCAtMjc0LDE4ICsyNzMsMTggQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMjk0LDEwICsyOTMsMTAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywgMTAwMDAwMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDEwMDAwMDAwMDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAxMDAwMDAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgMTAwMDAwMDAwMCk7CiAKIAlpZiAoY21kLT5jb252ZXJ0X2FyZyA+PSAxNzUwMCkKIAkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDAwOwpAQCAtMzA4LDEyICszMDcsMTMgQEAKIAllbHNlCiAJCWNtZC0+Y29udmVydF9hcmcgPSA1MDAwOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZSAvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0zMjEsNyArMzIxLDcgQEAKIAkvKiBTdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gNDsKQEAgLTM5MSwxMyArMzkxLDEyIEBACiAJCS8qIHN0YXJ0IHRoZSBjbG9jayBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCiAJCWRtbTMyYXRfc2V0YWl0aW1lcihkZXYsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOwogCX0gZWxzZSB7Ci0JCS8qIHN0YXJ0IHRoZSBpbnRlcnJ1cHMgYW5kIGluaXRpYXRlIGEgc2luZ2xlIHNjYW4gKi8KKwkJLyogc3RhcnQgdGhlIGludGVycnVwdHMgYW5kIGluaXRpYXRlIGEgc2luZ2xlIHNjYW4gKi8KIAkJb3V0YihETU0zMkFUX0lOVENMS19BRElOVCwgZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0lOVENMS19SRUcpOwogCQlvdXRiKDB4ZmYsIGRldi0+aW9iYXNlICsgRE1NMzJBVF9BSV9TVEFSVF9DT05WX1JFRyk7CiAJfQogCiAJcmV0dXJuIDA7Ci0KIH0KIAogc3RhdGljIGludCBkbW0zMmF0X2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgwMS5jCmluZGV4IGI5NmU2MGYuLjgwZTM4ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODAxLmMKQEAgLTEyNiw3ICsxMjYsNiBAQAogfTsKIAogc3RydWN0IGR0MjgwMV9ib2FyZCB7Ci0KIAljb25zdCBjaGFyICpuYW1lOwogCWludCBib2FyZGNvZGU7CiAJaW50IGFkX2RpZmY7CkBAIC0yODAsNyArMjc5LDcgQEAKIAlyZXQgPSBkdDI4MDFfd3JpdGVkYXRhKGRldiwgZGF0YSAmIDB4ZmYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGR0MjgwMV93cml0ZWRhdGEoZGV2LCAoZGF0YSA+PiA4KSk7CisJcmV0ID0gZHQyODAxX3dyaXRlZGF0YShkZXYsIGRhdGEgPj4gOCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYwppbmRleCBkNjYwZjI3Li5hODA3NzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCkBAIC0xOTQsNyArMTk0LDYgQEAKICNkZWZpbmUgRFQyODExX0FETU9ERSAgIDB4MDMKIAogc3RydWN0IGR0MjgxMV9ib2FyZCB7Ci0KIAljb25zdCBjaGFyICpuYW1lOwogCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpiaXBfNTsKIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYmlwXzJfNTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYwppbmRleCA5ODA1YmUxLi42NjcwNWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCkBAIC00MCw4ICs0MCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0KICNkZWZpbmUgRFQyODE0X0NTUiAwCiAjZGVmaW5lIERUMjgxNF9EQVRBIDEKIApAQCAtNTYsNyArNTQsNiBAQAogI2RlZmluZSBEVDI4MTRfQ0hBTk1BU0sgMHgwZgogCiBzdHJ1Y3QgZHQyODE0X3ByaXZhdGUgewotCiAJaW50IG50cmlnOwogCWludCBjdXJhZGNoYW47CiB9OwpAQCAtMTMwLDE4ICsxMjcsMTggQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0xNTAsMTggKzE0NywxOSBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAxMDAwMDAwMDAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJIERUMjgxNF9NQVhfU1BFRUQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAxMDAwMDAwMDAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJICAgIERUMjgxNF9NQVhfU1BFRUQpOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDIpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMik7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0xNzAsNyArMTY4LDcgQEAKIAogCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJZHQyODE0X25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiA0OwpAQCAtMTkzLDcgKzE5MSw2IEBACiAJb3V0YihjaGFuIHwgRFQyODE0X0VOQiB8ICh0cmlndmFyIDw8IDUpLCBkZXYtPmlvYmFzZSArIERUMjgxNF9DU1IpOwogCiAJcmV0dXJuIDA7Ci0KIH0KIAogc3RhdGljIGlycXJldHVybl90IGR0MjgxNF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYwppbmRleCBhOThmYjY2Li5mYjA4NTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNS5jCkBAIC02MCw3ICs2MCw2IEBACiAjZGVmaW5lIERUMjgxNV9TVEFUVVMgMQogCiBzdHJ1Y3QgZHQyODE1X3ByaXZhdGUgewotCiAJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlX3R5cGVfbGlzdFs4XTsKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbOF07CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCmluZGV4IGRiMjFkMjEuLjVhNTM2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKQEAgLTY0LDcgKzY0LDYgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9pc2FkbWEuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAogLyoKICAqIFJlZ2lzdGVyIG1hcApAQCAtNjYxLDIwICs2NjAsMjAgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfRk9MTE9XIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNjgzLDIxICs2ODIsMjIgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCA0MDAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgNDAwMCk7CiAKICNkZWZpbmUgU0xPV0VTVF9USU1FUgkoMjUwKigxPDwxNSkqMjU1KQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCBTTE9XRVNUX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgYm9hcmQtPmFpX3NwZWVkKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCBTTE9XRVNUX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgYm9hcmQtPmFpX3NwZWVkKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX0VYVCB8IFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTcwNiw3ICs3MDYsNyBAQAogCiAJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKIAlkZXZwcml2LT5kaXZpc29yID0gZHQyODJ4X25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiA0OwpAQCAtNzY0LDcgKzc2NCw3IEBACiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgewogCQlvdXR3KGRldnByaXYtPnN1cGNzciB8IERUMjgyMV9TVVBDU1JfU1RSSUcsCi0JCQlkZXYtPmlvYmFzZSArIERUMjgyMV9TVVBDU1JfUkVHKTsKKwkJICAgICBkZXYtPmlvYmFzZSArIERUMjgyMV9TVVBDU1JfUkVHKTsKIAl9IGVsc2UgewogCQlkZXZwcml2LT5zdXBjc3IgfD0gRFQyODIxX1NVUENTUl9YVFJJRzsKIAkJb3V0dyhkZXZwcml2LT5zdXBjc3IsIGRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUl9SRUcpOwpAQCAtODMxLDE4ICs4MzEsMTggQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC04NTEsMTUgKzg1MSwxNiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCA1MDAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywgNTAwMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19FWFQgfCBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC04NjgsMTMgKzg2OSwxMiBAQAogCiAJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAlkZXZwcml2LT5kaXZpc29yID0gZHQyODJ4X25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiA0OwogCiAJcmV0dXJuIDA7Ci0KIH0KIAogc3RhdGljIGludCBkdDI4MnhfYW9faW50dHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jCmluZGV4IDBhYTUxOTguLjAzMTI4MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDMwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMKQEAgLTQ5LDEzICs0OSwxMCBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLQotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2R0MzAwMF9haSA9IHsKIAk0LCB7CkBAIC00MDksMTEgKzQwNiwxMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKQEAgLTQyMywyOCArNDIwLDI5IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSB0aGlzX2JvYXJkLT5haV9zcGVlZCk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIDEwMCAqIDE2ICogNjU1MzUpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICB0aGlzX2JvYXJkLT5haV9zcGVlZCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIDEwMCAqIDE2ICogNjU1MzUpOwogCX0KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgdGhpc19ib2FyZC0+YWlfc3BlZWQpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSA1MCAqIDE2ICogNjU1MzUpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICB0aGlzX2JvYXJkLT5haV9zcGVlZCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIDUwICogMTYgKiA2NTUzNSk7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c3RvcF9hcmcsIDB4MDBmZmZmZmYpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgMHgwMGZmZmZmZik7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC00NTQsMTggKzQ1MiwxOSBAQAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAkJZHQza19uc190b190aW1lcigxMDAsICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKIAkJZHQza19uc190b190aW1lcig1MCwgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAKIAkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQkJYXJnID0gY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+c2Nhbl9lbmRfYXJnOwotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkJIGFyZyk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT4KKwkJCQkJCQkgICAgc2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkJICAgIGFyZyk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9keW5hX3BjaTEweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9keW5hX3BjaTEweHguYwppbmRleCA2YzFlNDQyLi5jOWViMjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHluYV9wY2kxMHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jCkBAIC0zNCwxMCArMzQsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjZGVmaW5lIFJFQURfVElNRU9VVCA1MAogCkBAIC03MCw4ICs2OSw5IEBACiB9CiAKIHN0YXRpYyBpbnQgZHluYV9wY2kxMHh4X2luc25fcmVhZF9haShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKKwkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBkeW5hX3BjaTEweHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgbjsKQEAgLTEwOSw4ICsxMDksOSBAQAogCiAvKiBhbmFsb2cgb3V0cHV0IGNhbGxiYWNrICovCiBzdGF0aWMgaW50IGR5bmFfcGNpMTB4eF9pbnNuX3dyaXRlX2FvKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBkeW5hX3BjaTEweHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgbjsKQEAgLTEzMiw4ICsxMzMsOSBAQAogCiAvKiBkaWdpdGFsIGlucHV0IGJpdCBpbnRlcmZhY2UgKi8KIHN0YXRpYyBpbnQgZHluYV9wY2kxMHh4X2RpX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKKwkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewogCXN0cnVjdCBkeW5hX3BjaTEweHhfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1MTYgZCA9IDA7CkBAIC0xNzEsNyArMTczLDcgQEAKIH0KIAogc3RhdGljIGludCBkeW5hX3BjaTEweHhfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgZHluYV9wY2kxMHh4X3ByaXZhdGUgKmRldnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZ3NjX2hwZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCmluZGV4IGRlYWRhOTcuLjNjYjY0MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jCkBAIC00MSwxNCArNDEsMTIgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgInBseDkwODAuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAogLyoKICAqIFBDSSBCQVIyIFJlZ2lzdGVyIG1hcCAoZGV2LT5tbWlvKQpAQCAtMzg2LDE4ICszODQsMTggQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTQwNiwxOCArNDA0LDE5IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKCFjbWQtPmNoYW5saXN0X2xlbiB8fCAhY21kLT5jaGFubGlzdCkgewogCQljbWQtPmNoYW5saXN0X2xlbiA9IDMyOwogCQllcnIgfD0gLUVJTlZBTDsKIAl9Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC00MzMsNyArNDMyLDYgQEAKIAkJcmV0dXJuIDU7CiAKIAlyZXR1cm4gMDsKLQogfQogCiAvKiBzZXR1cCBkbWEgZGVzY3JpcHRvcnMgc28gYSBsaW5rIGNvbXBsZXRlcyBldmVyeSAnbGVuJyBieXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCmluZGV4IDFlYTE2ODYuLjFlMTA0ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKQEAgLTQzLDExICs0MywxMCBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNkZWZpbmUgSUNQX01VTFRJX0FEQ19DU1IJMAkvKiBSL1c6IEFEQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLwogI2RlZmluZSBJQ1BfTVVMVElfQUkJCTIJLyogUjogICBBbmFsb2d1ZSBpbnB1dCBkYXRhICovCkBAIC0zNzAsNyArMzY5LDYgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7Ci0KIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC00NDUsNyArNDQzLDcgQEAKIH0KIAogc3RhdGljIGludCBpY3BfbXVsdGlfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgaWNwX211bHRpX3ByaXZhdGUgKmRldnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwppbmRleCA4MWZhYjJkLi5iODcxOTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKQEAgLTM5LDE0ICszOSwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgImpyM19wY2kuaCIKIApAQCAtNzA2LDggKzcwNSw2IEBACiAJaWYgKCFkZXZwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWluaXRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKLQogCXJldCA9IGNvbWVkaV9wY2lfZW5hYmxlKGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTc3NSw4ICs3NzIsNyBAQAogCQlzcHJpdi0+bmV4dF90aW1lX21heCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApOwogCX0KIAotCWRldnByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7Ci0JZGV2cHJpdi0+dGltZXIuZnVuY3Rpb24gPSBqcjNfcGNpX3BvbGxfZGV2OworCXNldHVwX3RpbWVyKCZkZXZwcml2LT50aW1lciwganIzX3BjaV9wb2xsX2RldiwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIAlkZXZwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CiAJYWRkX3RpbWVyKCZkZXZwcml2LT50aW1lcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCmluZGV4IDNjMTllMGYuLmRjNjQyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYwpAQCAtMjgsOSArMjgsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyoKICAqIFBDSSBCQVIgMCBSZWdpc3RlciBJL08gbWFwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKaW5kZXggZDEyMGFhMi4uN2E4YzI3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwpAQCAtNDEsMTQgKzQxLDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICJwbHg5MDUyLmgiCiAKICNkZWZpbmUgTUU0MDAwX0ZJUk1XQVJFCQkibWU0MDAwX2Zpcm13YXJlLmJpbiIKQEAgLTE3MCw3ICsxNjgsNiBAQAogCiBzdHJ1Y3QgbWU0MDAwX2luZm8gewogCXVuc2lnbmVkIGxvbmcgcGx4X3JlZ2Jhc2U7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9yZWdiYXNlOwogfTsKIAogZW51bSBtZTQwMDBfYm9hcmRpZCB7CkBAIC00MjQsNyArNDIxLDcgQEAKIAogCS8qIFNldCBib3RoIHN0b3AgYml0cyBpbiB0aGUgYW5hbG9nIGlucHV0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAlvdXRsKE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TVE9QLAotCQlkZXYtPmlvYmFzZSArIE1FNDAwMF9BSV9DVFJMX1JFRyk7CisJICAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9BSV9DVFJMX1JFRyk7CiAKIAkvKiBTZXQgYm90aCBzdG9wIGJpdHMgaW4gdGhlIGFuYWxvZyBvdXRwdXQgY29udHJvbCByZWdpc3RlciAqLwogCXZhbCA9IE1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QOwpAQCAtNDM4LDcgKzQzNSw3IEBACiAKIAkvKiBTZXQgdGhlIGFkdXN0bWVudCByZWdpc3RlciBmb3IgQU8gZGVtdXggKi8KIAlvdXRsKE1FNDAwMF9BT19ERU1VWF9BREpVU1RfVkFMVUUsCi0JCSAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9BT19ERU1VWF9BREpVU1RfUkVHKTsKKwkgICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9SRUcpOwogCiAJLyoKIAkgKiBTZXQgZGlnaXRhbCBJL08gZGlyZWN0aW9uIGZvciBwb3J0IDAKQEAgLTYwOSw3ICs2MDYsNyBAQAogCiAJCQlpZiAoIWNvbWVkaV9yYW5nZV9pc19iaXBvbGFyKHMsIHJhbmdlKSkgewogCQkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCi0JCQkJICAgICAgICJCaXBvbGFyIGlzIG5vdCBzZWxlY3RlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZVxuIik7CisJCQkJCSJCaXBvbGFyIGlzIG5vdCBzZWxlY3RlZCBpbiBkaWZmZXJlbnRpYWwgbW9kZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0KQEAgLTYyNCw3ICs2MjEsNiBAQAogCQkJICAgICB1bnNpZ25lZCBpbnQgKmluaXRfdGlja3MsCiAJCQkgICAgIHVuc2lnbmVkIGludCAqc2Nhbl90aWNrcywgdW5zaWduZWQgaW50ICpjaGFuX3RpY2tzKQogewotCiAJaW50IHJlc3Q7CiAKIAkqaW5pdF90aWNrcyA9IDA7CkBAIC03MzEsNyArNzI3LDYgQEAKIAkJICAgICAgdW5zaWduZWQgaW50IGluaXRfdGlja3MsCiAJCSAgICAgIHVuc2lnbmVkIGludCBzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgY2hhbl90aWNrcykKIHsKLQogCXVuc2lnbmVkIGludCB0bXAgPSAwOwogCiAJLyogV3JpdGUgdGltZXIgYXJndW1lbnRzICovCkBAIC03NzIsMTIgKzc2NywxMiBAQAogCS8qIFN0b3AgdHJpZ2dlcnMgKi8KIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CiAJCW91dGwoY21kLT5jaGFubGlzdF9sZW4gKiBjbWQtPnN0b3BfYXJnLAotCQkJICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRyk7CisJCSAgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfQUlfU0FNUExFX0NPVU5URVJfUkVHKTsKIAkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJROwogCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUgJiYKIAkJICAgY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19DT1VOVCkgewogCQlvdXRsKGNtZC0+c2Nhbl9lbmRfYXJnLAotCQkJICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRyk7CisJCSAgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfQUlfU0FNUExFX0NPVU5URVJfUkVHKTsKIAkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJROwogCX0gZWxzZSB7CiAJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJROwpAQCAtODI3LDcgKzgyMiw2IEBACiAJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCSBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCiAJdW5zaWduZWQgaW50IGluaXRfdGlja3M7CiAJdW5zaWduZWQgaW50IGNoYW5fdGlja3M7CiAJdW5zaWduZWQgaW50IHNjYW5fdGlja3M7CkBAIC04MzgsMjQgKzgzMiwyNSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfRk9MTE9XIHwgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsCiAJCQkJCVRSSUdfTk9ORSB8IFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSB8IFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSB8IFRSSUdfQ09VTlQpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fZW5kX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fZW5kX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC04ODYsNyArODgxLDcgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5jaGFubGlzdF9sZW4gPCAxKSB7CiAJCWNtZC0+Y2hhbmxpc3RfbGVuID0gMTsKQEAgLTkwNiw5ICs5MDEsOSBAQAogCX0KIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtOTE5LDcgKzkxNCw2IEBACiAJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgogCSAgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQogCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KIAkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiSW52YWxpZCBzdGFydCBhcmdcbiIpOwpAQCAtOTQxLDcgKzkzNSw2IEBACiAJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgogCQkgICBjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCiAJCSAgIGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIHN0YXJ0IGFyZ1xuIik7CkBAIC05NTYsNyArOTQ5LDYgQEAKIAl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCiAJCSAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgogCQkgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQogCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KIAkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiSW52YWxpZCBzdGFydCBhcmdcbiIpOwpAQCAtOTc4LDcgKzk3MCw2IEBACiAJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgogCQkgICBjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCiAJCSAgIGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIHN0YXJ0IGFyZ1xuIik7CkBAIC05OTMsNyArOTg0LDYgQEAKIAl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCiAJCSAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKIAkJICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0KIAkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCiAJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludmFsaWQgc3RhcnQgYXJnXG4iKTsKQEAgLTEwMDgsNyArOTk4LDYgQEAKIAl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCiAJCSAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKIAkJICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkgewotCiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIHN0YXJ0IGFyZ1xuIik7CkBAIC0xMTg3LDEzICsxMTc2LDEzIEBACiB7CiAJaWYgKGNvbWVkaV9kaW9fdXBkYXRlX3N0YXRlKHMsIGRhdGEpKSB7CiAJCW91dGwoKHMtPnN0YXRlID4+IDApICYgMHhGRiwKLQkJCSAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8wX1JFRyk7CisJCSAgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMF9SRUcpOwogCQlvdXRsKChzLT5zdGF0ZSA+PiA4KSAmIDB4RkYsCi0JCQkgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMV9SRUcpOworCQkgICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19QT1JUXzFfUkVHKTsKIAkJb3V0bCgocy0+c3RhdGUgPj4gMTYpICYgMHhGRiwKLQkJCSAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8yX1JFRyk7CisJCSAgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMl9SRUcpOwogCQlvdXRsKChzLT5zdGF0ZSA+PiAyNCkgJiAweEZGLAotCQkJICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19QT1JUXzNfUkVHKTsKKwkJICAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8zX1JFRyk7CiAJfQogCiAJZGF0YVsxXSA9ICgoaW5sKGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19QT1JUXzBfUkVHKSAmIDB4RkYpIDw8IDApIHwKQEAgLTEyNTksODUgKzEyNDgsNiBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIENvdW50ZXIgc2VjdGlvbgotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBtZTQwMDBfaW5mbyAqaW5mbyA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWludCBlcnI7Ci0KLQlzd2l0Y2ggKGRhdGFbMF0pIHsKLQljYXNlIEdQQ1RfUkVTRVQ6Ci0JCWlmIChpbnNuLT5uICE9IDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQllcnIgPSBpODI1NF9zZXRfbW9kZShpbmZvLT50aW1lcl9yZWdiYXNlLCAwLCBjaGFuLAotCQkJCSAgICAgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJaTgyNTRfd3JpdGUoaW5mby0+dGltZXJfcmVnYmFzZSwgMCwgY2hhbiwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgR1BDVF9TRVRfT1BFUkFUSU9OOgotCQlpZiAoaW5zbi0+biAhPSAyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJZXJyID0gaTgyNTRfc2V0X21vZGUoaW5mby0+dGltZXJfcmVnYmFzZSwgMCwgY2hhbiwKLQkJCQkoZGF0YVsxXSA8PCAxKSB8IEk4MjU0X0JJTkFSWSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotc3RhdGljIGludCBtZTQwMDBfY250X2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBtZTQwMDBfaW5mbyAqaW5mbyA9IGRldi0+cHJpdmF0ZTsKLQotCWlmIChpbnNuLT5uID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKGluc24tPm4gPiAxKSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKLQkJCWluc24tPm4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkYXRhWzBdID0gaTgyNTRfcmVhZChpbmZvLT50aW1lcl9yZWdiYXNlLCAwLCBpbnNuLT5jaGFuc3BlYyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtZTQwMDBfY250X2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBtZTQwMDBfaW5mbyAqaW5mbyA9IGRldi0+cHJpdmF0ZTsKLQotCWlmIChpbnNuLT5uID09IDApIHsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChpbnNuLT5uID4gMSkgewotCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCi0JCQlpbnNuLT5uKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaTgyNTRfd3JpdGUoaW5mby0+dGltZXJfcmVnYmFzZSwgMCwgaW5zbi0+Y2hhbnNwZWMsIGRhdGFbMF0pOwotCi0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgbWU0MDAwX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CkBAIC0xMzY0LDggKzEyNzQsNyBAQAogCiAJaW5mby0+cGx4X3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAxKTsKIAlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwotCWluZm8tPnRpbWVyX3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAzKTsKLQlpZiAoIWluZm8tPnBseF9yZWdiYXNlIHx8ICFkZXYtPmlvYmFzZSB8fCAhaW5mby0+dGltZXJfcmVnYmFzZSkKKwlpZiAoIWluZm8tPnBseF9yZWdiYXNlIHx8ICFkZXYtPmlvYmFzZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXN1bHQgPSBjb21lZGlfbG9hZF9maXJtd2FyZShkZXYsICZwY2lkZXYtPmRldiwgTUU0MDAwX0ZJUk1XQVJFLApAQCAtMTM3Nyw3ICsxMjg2LDcgQEAKIAogCWlmIChwY2lkZXYtPmlycSA+IDApIHsKIAkJcmVzdWx0ID0gcmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIG1lNDAwMF9haV9pc3IsIElSUUZfU0hBUkVELAotCQkJCSAgZGV2LT5ib2FyZF9uYW1lLCBkZXYpOworCQkJCSAgICAgZGV2LT5ib2FyZF9uYW1lLCBkZXYpOwogCQlpZiAocmVzdWx0ID09IDApCiAJCQlkZXYtPmlycSA9IHBjaWRldi0+aXJxOwogCX0KQEAgLTE0NTksMjMgKzEzNjgsMjIgQEAKIAlpZiAoIWlubChkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fRElSX1JFRykpIHsKIAkJcy0+aW9fYml0cyB8PSAweEZGOwogCQlvdXRsKE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wLAotCQkJZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX0RJUl9SRUcpOworCQkgICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19ESVJfUkVHKTsKIAl9CiAKLSAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIENvdW50ZXIgc3ViZGV2aWNlCi0gICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCisJLyogQ291bnRlciBzdWJkZXZpY2UgKDgyNTQpICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbM107Ci0KIAlpZiAodGhpc2JvYXJkLT5oYXNfY291bnRlcikgewotCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQ09VTlRFUjsKLQkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOwotCQlzLT5uX2NoYW4gPSAzOwotCQlzLT5tYXhkYXRhID0gMHhGRkZGOwkvKiAgMTYgYml0IGNvdW50ZXJzICovCi0JCXMtPmluc25fcmVhZCA9IG1lNDAwMF9jbnRfaW5zbl9yZWFkOwotCQlzLT5pbnNuX3dyaXRlID0gbWU0MDAwX2NudF9pbnNuX3dyaXRlOwotCQlzLT5pbnNuX2NvbmZpZyA9IG1lNDAwMF9jbnRfaW5zbl9jb25maWc7CisJCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDMpOworCisJCWlmICghdGltZXJfYmFzZSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KHRpbWVyX2Jhc2UsIDAsIEk4MjU0X0lPOCwgMCk7CisJCWlmICghZGV2LT5wYWNlcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0KHMsIGRldi0+cGFjZXIpOwogCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCmluZGV4IDkyZTIzNTIuLmQ3OGU5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKQEAgLTMwLDExICszMCwxMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAicGx4OTA1Mi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWY2eDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jCmluZGV4IGRiOTcyYmMuLmE2NzVlMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jCkBAIC0yNiw5ICsyNiw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKIC8qIFJlZ2lzdGVycyBwcmVzZW50IGluIEJBUjAgbWVtb3J5IHJlZ2lvbiAqLwogI2RlZmluZSBNRjYyNF9HUElPQ19SCQkJCQkweDU0CkBAIC0yMzcsNyArMjM3LDYgQEAKIAllbHNlCiAJCWRldnByaXYtPmdwaW9jX1IgPSBkZXZwcml2LT5iYXIwX21lbSArIE1GNjI0X0dQSU9DX1I7CiAKLQogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCmluZGV4IDFlNTM3YTUuLmU0M2EwYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpAQCAtNDcsMTEgKzQ3LDkgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAibWl0ZS5oIgogCiAjZGVmaW5lIFRPUF9PRl9QQUdFKHgpICgoeCl8KH4oUEFHRV9NQVNLKSkpCkBAIC0xODYsMTAgKzE4NCwxMCBAQAogCXN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcgPQogCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nKSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAocmluZyA9PSBOVUxMKQotCQlyZXR1cm4gcmluZzsKKwlpZiAoIXJpbmcpCisJCXJldHVybiBOVUxMOwogCXJpbmctPmh3X2RldiA9IGdldF9kZXZpY2UoJm1pdGUtPnBjaWRldi0+ZGV2KTsKLQlpZiAocmluZy0+aHdfZGV2ID09IE5VTEwpIHsKKwlpZiAoIXJpbmctPmh3X2RldikgewogCQlrZnJlZShyaW5nKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKaW5kZXggYjJiMTIwNC4uYjNjYTdmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCkBAIC0xOSwxMCArMTksOSBAQAogI2lmbmRlZiBfTUlURV9IXwogI2RlZmluZSBfTUlURV9IXwogCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNkZWZpbmUgUENJTUlPX0NPTVBBVAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMKaW5kZXggMTI0MWY5OS4uMDIwN2I4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM2MjQuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJKE1QQzYyNF9PU1I0IHwgTVBDNjI0X09TUjMgfCBNUEM2MjRfT1NSMiB8IE1QQzYyNF9PU1IxIHwgTVBDNjI0X09TUjApCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RydWN0IG1wYzYyNF9wcml2YXRlIHsKLQogCS8qICBzZXQgYnkgbXBjNjI0X2F0dGFjaCgpIGZyb20gZHJpdmVyJ3MgcGFyYW1ldGVycyAqLwogCXVuc2lnbmVkIGxvbmcgaW50IHVsQ29udmVydGlvblJhdGU7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NTI3LmMKaW5kZXggNTMwZjcxNi4uNjJhODE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jCkBAIC0yOCwxMiArMjgsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAvKgogICogUENJIEJBUjEgLSBSZWdpc3RlciBtZW1vcnkgbWFwCkBAIC0yMjQsMTEgKzIyMSwxMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX09USEVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19PVEhFUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwpAQCAtMjM4LDExICsyMzUsMTIgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjV4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1eHguYwppbmRleCA2N2NiNzU4Li44MDBkNTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjV4eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NXh4LmMKQEAgLTU3LDEyICs1Nyw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0KLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKIC8qCiAgKiBQQ0kgQkFSMSBSZWdpc3RlciBNYXAKQEAgLTUwOCwxMSArNTA1LDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfT1RIRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX09USEVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC01MjIsMTEgKzUxOSwxMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTYxMyw3ICs2MTEsNyBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi0vKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRhbmN5ICovCisvKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRlbmN5ICovCiAjZGVmaW5lIE1JVEVfSU9EV0JTUgkweGMwCSAvKiBJTyBEZXZpY2UgV2luZG93IEJhc2UgU2l6ZSBSZWdpc3RlciAqLwogI2RlZmluZSBXRU5BQgkJKDEgPDwgNykgLyogd2luZG93IGVuYWJsZSAqLwogCkBAIC02NzYsNyArNjc0LDcgQEAKIAl9CiAKIAlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwgImJvYXJkOiAlcywgSUQ9MHglMDJ4IiwgZGV2LT5ib2FyZF9uYW1lLAotCSAgICAgICByZWFkYihkZXYtPm1taW8gKyBOSV82NVhYX0lEX1JFRykpOworCQkgcmVhZGIoZGV2LT5tbWlvICsgTklfNjVYWF9JRF9SRUcpKTsKIAogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NjB4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jCmluZGV4IDFlNGRkODIuLjQ2NjQ3YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NjB4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYwpAQCAtMzUsMTIgKzM1LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAibWl0ZS5oIgogI2luY2x1ZGUgIm5pX3Rpby5oIgogCkBAIC0xOTUsNyArMTkzLDYgQEAKIH0KIAogc3RydWN0IE5JXzY2MHhSZWdpc3RlckRhdGEgewotCiAJY29uc3QgY2hhciAqbmFtZTsJLyogIFJlZ2lzdGVyIE5hbWUgKi8KIAlpbnQgb2Zmc2V0OwkJLyogIE9mZnNldCBmcm9tIGJhc2UgYWRkcmVzcyBmcm9tIEdQQ1QgY2hpcCAqLwogCWVudW0gbmlfNjYweF9yZWdpc3Rlcl9kaXJlY3Rpb24gZGlyZWN0aW9uOwpAQCAtNzAyLDcgKzY5OSw3IEBACiAJQlVHX09OKGNvdW50ZXItPm1pdGVfY2hhbik7CiAJbWl0ZV9jaGFuID0gbWl0ZV9yZXF1ZXN0X2NoYW5uZWwoZGV2cHJpdi0+bWl0ZSwKIAkJCQkJIG1pdGVfcmluZyhkZXZwcml2LCBjb3VudGVyKSk7Ci0JaWYgKG1pdGVfY2hhbiA9PSBOVUxMKSB7CisJaWYgKCFtaXRlX2NoYW4pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCSJmYWlsZWQgdG8gcmVzZXJ2ZSBtaXRlIGRtYSBjaGFubmVsIGZvciBjb3VudGVyXG4iKTsKQEAgLTg2MSw3ICs4NTgsNyBAQAogCQlmb3IgKGogPSAwOyBqIDwgY291bnRlcnNfcGVyX2NoaXA7ICsraikgewogCQkJZGV2cHJpdi0+bWl0ZV9yaW5nc1tpXVtqXSA9CiAJCQkgICAgbWl0ZV9hbGxvY19yaW5nKGRldnByaXYtPm1pdGUpOwotCQkJaWYgKGRldnByaXYtPm1pdGVfcmluZ3NbaV1bal0gPT0gTlVMTCkKKwkJCWlmICghZGV2cHJpdi0+bWl0ZV9yaW5nc1tpXVtqXSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTExMDcsNyArMTEwNCw3IEBACiAJCQkJCQkgICAgIG5pX2dwY3RfdmFyaWFudF82NjB4LAogCQkJCQkJICAgICBuaV82NjB4X251bV9jb3VudGVycwogCQkJCQkJICAgICAoZGV2KSk7Ci0JaWYgKGRldnByaXYtPmNvdW50ZXJfZGV2ID09IE5VTEwpCisJaWYgKCFkZXZwcml2LT5jb3VudGVyX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAJZm9yIChpID0gMDsgaSA8IE5JXzY2MFhfTUFYX05VTV9DT1VOVEVSUzsgKytpKSB7CiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW05JXzY2MFhfR1BDVF9TVUJERVYoaSldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKaW5kZXggYzQyYTgxYy4uMTNjNmNjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCkBAIC0zNywxMSArMzcsMTAgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNkZWZpbmUgQU9fVkFMVUVfT0ZGU0VUCQkJMHgwMAogI2RlZmluZQlBT19DSEFOX09GRlNFVAkJCTB4MGMKQEAgLTE0Niw3ICsxNDUsNyBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi0vKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRhbmN5ICovCisvKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRlbmN5ICovCiAjZGVmaW5lIE1JVEVfSU9EV0JTUgkweGMwCSAvKiBJTyBEZXZpY2UgV2luZG93IEJhc2UgU2l6ZSBSZWdpc3RlciAqLwogI2RlZmluZSBXRU5BQgkJKDEgPDwgNykgLyogd2luZG93IGVuYWJsZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYTIxNTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCmluZGV4IGExY2UwYjAuLjNhOTcyZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCkBAIC02Nyw4ICs2Nyw3IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJjb21lZGlfaXNhZG1hLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKICNkZWZpbmUgQTIxNTBfRE1BX0JVRkZFUl9TSVpFCTB4ZmYwMAkvKiAgc2l6ZSBpbiBieXRlcyBvZiBkbWEgYnVmZmVyICovCiAKQEAgLTExMCw4ICsxMDksNiBAQAogI2RlZmluZSAgIERNQV9JTlRSX0VOX0JJVCAJCTB4ODAwCS8qICBlbmFibGUgaW50ZXJydXB0IG9uIGRtYSB0ZXJtaW5hbCBjb3VudCAqLwogI2RlZmluZSAgIERNQV9ERU1fRU5fQklUCTB4MTAwMAkvKiAgZW5hYmxlcyBkZW1hbmQgbW9kZSBkbWEgKi8KICNkZWZpbmUgSTgyNTNfQkFTRV9SRUcJCTB4MTQKLSNkZWZpbmUgSTgyNTNfTU9ERV9SRUcJCTB4MTcKLSNkZWZpbmUgICBIV19DT1VOVF9ESVNBQkxFCQkweDMwCS8qICBkaXNhYmxlIGhhcmR3YXJlIGNvdW50aW5nIG9mIGNvbnZlcnNpb25zICovCiAKIHN0cnVjdCBhMjE1MF9ib2FyZCB7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTQyMiwxOSArNDE5LDE5IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTQ0MywxOSArNDQwLDIxIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgdGhpc2JvYXJkLT5haV9zcGVlZCk7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKKwl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC00NjUsNyArNDY0LDcgQEAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCWEyMTUwX2dldF90aW1pbmcoZGV2LCAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtNDg4LDcgKzQ4Nyw2IEBACiAJc3RydWN0IGNvbWVkaV9pc2FkbWFfZGVzYyAqZGVzYyA9ICZkbWEtPmRlc2NbMF07CiAJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJmFzeW5jLT5jbWQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBJODI1M19CQVNFX1JFRzsKIAl1bnNpZ25lZCBpbnQgb2xkX2NvbmZpZ19iaXRzID0gZGV2cHJpdi0+Y29uZmlnX2JpdHM7CiAJdW5zaWduZWQgaW50IHRyaWdnZXJfYml0czsKIApAQCAtNTQ3LDggKzU0NSw3IEBACiAJb3V0dyhkZXZwcml2LT5pcnFfZG1hX2JpdHMsIGRldi0+aW9iYXNlICsgSVJRX0RNQV9DTlRSTF9SRUcpOwogCiAJLyogIG1heSBuZWVkIHRvIHdhaXQgNzIgc2FtcGxpbmcgcGVyaW9kcyBpZiB0aW1pbmcgd2FzIGNoYW5nZWQgKi8KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgNzIpOworCWNvbWVkaV84MjU0X2xvYWQoZGV2LT5wYWNlciwgMiwgNzIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAogCS8qICBzZXR1cCBzdGFydCB0cmlnZ2VyaW5nICovCiAJdHJpZ2dlcl9iaXRzID0gMDsKQEAgLTcyNiw2ICs3MjMsMTEgQEAKIAkvKiBhbiBJUlEgYW5kIERNQSBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCBhc3luYyBjb21tYW5kcyAqLwogCWEyMTUwX2FsbG9jX2lycV9hbmRfZG1hKGRldiwgaXQpOwogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBJODI1M19CQVNFX1JFRywKKwkJCQkgICAgICAwLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC03NDcsMTAgKzc0OSw2IEBACiAJCXMtPmNhbmNlbCA9IGEyMTUwX2NhbmNlbDsKIAl9CiAKLQkvKiBuZWVkIHRvIGRvIHRoaXMgZm9yIHNvZnR3YXJlIGNvdW50aW5nIG9mIGNvbXBsZXRlZCBjb252ZXJzaW9ucywgdG8KLQkgKiBwcmV2ZW50IGhhcmR3YXJlIGNvdW50IGZyb20gc3RvcHBpbmcgYWNxdWlzaXRpb24gKi8KLQlvdXR3KEhXX0NPVU5UX0RJU0FCTEUsIGRldi0+aW9iYXNlICsgSTgyNTNfTU9ERV9SRUcpOwotCiAJLyogIHNldCBjYXJkJ3MgaXJxIGFuZCBkbWEgbGV2ZWxzICovCiAJb3V0dyhkZXZwcml2LT5pcnFfZG1hX2JpdHMsIGRldi0+aW9iYXNlICsgSVJRX0RNQV9DTlRSTF9SRUcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jCmluZGV4IDllZWFmM2MuLmYyN2FhMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jCkBAIC0zNyw3ICszNyw3IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAvKgogICogUmVnaXN0ZXIgbWFwCkBAIC0yNzQsNyArMjc0LDYgQEAKIHN0YXRpYyB2b2lkIGF0YW9fcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRhb19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgQVRBT184MkM1M19CQVNFOwogCiAJLyogVGhpcyBpcyB0aGUgcmVzZXQgc2VxdWVuY2UgZGVzY3JpYmVkIGluIHRoZSBtYW51YWwgKi8KIApAQCAtMjgyLDkgKzI4MSw5IEBACiAJb3V0dyhkZXZwcml2LT5jZmcxLCBkZXYtPmlvYmFzZSArIEFUQU9fQ0ZHMV9SRUcpOwogCiAJLyogUHV0IG91dHB1dHMgb2YgY291bnRlciAxIGFuZCBjb3VudGVyIDIgaW4gYSBoaWdoIHN0YXRlICovCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTQgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREU0IHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAwLCAweDAwMDMpOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDAsIEk4MjU0X01PREU0IHwgSTgyNTRfQklOQVJZKTsKKwljb21lZGlfODI1NF9zZXRfbW9kZShkZXYtPnBhY2VyLCAxLCBJODI1NF9NT0RFNCB8IEk4MjU0X0JJTkFSWSk7CisJY29tZWRpXzgyNTRfd3JpdGUoZGV2LT5wYWNlciwgMCwgMHgwMDAzKTsKIAogCW91dHcoQVRBT19DRkcyX0NBTExEX05PUCwgZGV2LT5pb2Jhc2UgKyBBVEFPX0NGRzJfUkVHKTsKIApAQCAtMzE1LDYgKzMxNCwxMSBAQAogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIEFUQU9fODJDNTNfQkFTRSwKKwkJCQkgICAgICAwLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jCmluZGV4IDMwMWYxNTQuLjEzMDRiMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jCkBAIC0yNTAsNyArMjUwLDcgQEAKIAkJCQkJICBJU0FQTlBfRlVOQ1RJT04obmlfYm9hcmRzW2ldLgogCQkJCQkJCSAgaXNhcG5wX2lkKSwgTlVMTCk7CiAKLQkJaWYgKGlzYXBucF9kZXYgPT0gTlVMTCB8fCBpc2FwbnBfZGV2LT5jYXJkID09IE5VTEwpCisJCWlmICghaXNhcG5wX2RldiB8fCAhaXNhcG5wX2Rldi0+Y2FyZCkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChwbnBfZGV2aWNlX2F0dGFjaChpc2FwbnBfZGV2KSA8IDApCkBAIC0yODIsNyArMjgyLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuaV9ib2FyZHMpOyBpKyspIHsKIAkJaWYgKG5pX2JvYXJkc1tpXS5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQogCQkJcmV0dXJuIGk7Ci0KIAl9CiAJaWYgKGRldmljZV9pZCA9PSAyNTUpCiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJjYW4ndCBmaW5kIGJvYXJkXG4iKTsKQEAgLTM1NSw3ICszNTQsNiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwppbmRleCBjNDg0Yzg5Li5jM2ViNTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiODI1NS5oIgogCiAvKiBDb25maWd1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXJzICovCkBAIC05Niw3ICs5NSw2IEBACiAjZGVmaW5lIENMT0NLXzEwMF9IWgkweDhGMjUKIAogc3RydWN0IGF0bWlvMTZfYm9hcmRfdCB7Ci0KIAljb25zdCBjaGFyICpuYW1lOwogCWludCBoYXNfODI1NTsKIH07CkBAIC0yMzQsMjAgKzIzMiwyMCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19GT0xMT1cgfCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTI1NiwzMCArMjU0LDMxIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpIHsKIAkJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAJfSBlbHNlIHsKICNpZiAwCiAJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KIAkJLyogc2hvdWxkIGJlIGxldmVsL2VkZ2UsIGhpL2xvIHNwZWNpZmljYXRpb24gaGVyZSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAjZW5kaWYKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTAwMDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CiAjaWYgMAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCBTTE9XRVNUX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywgU0xPV0VTVF9USU1FUik7CiAjZW5kaWYKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYwppbmRleCBhOTE2MDQ3Li41MWU1ZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYwpAQCAtMTA1LDYgKzEwNSw3IEBACiBzdGF0aWMgdm9pZCBsYWJwY19kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlsYWJwY19mcmVlX2RtYV9jaGFuKGRldik7CisJbGFicGNfY29tbW9uX2RldGFjaChkZXYpOwogCWNvbWVkaV9sZWdhY3lfZGV0YWNoKGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmgKaW5kZXggYmU4OWFlNC4uODNmODc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmgKQEAgLTM2LDYgKzM2LDcgQEAKIAogc3RydWN0IGxhYnBjX3ByaXZhdGUgewogCXN0cnVjdCBjb21lZGlfaXNhZG1hICpkbWE7CisJc3RydWN0IGNvbWVkaV84MjU0ICpjb3VudGVyOwogCiAJLyogIG51bWJlciBvZiBkYXRhIHBvaW50cyBsZWZ0IHRvIGJlIHRha2VuICovCiAJdW5zaWduZWQgbG9uZyBsb25nIGNvdW50OwpAQCAtNDksMjAgKzUwLDYgQEAKIAkvKiAgc3RvcmUgbGFzdCByZWFkIG9mIGJvYXJkIHN0YXR1cyByZWdpc3RlcnMgKi8KIAl1bnNpZ25lZCBpbnQgc3RhdDE7CiAJdW5zaWduZWQgaW50IHN0YXQyOwotCS8qCi0JICogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBhMCAoY29udmVyc2lvbiBwYWNpbmcpIGZvciB0aW1lZAotCSAqIGNvbnZlcnNpb25zCi0JICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3JfYTA7Ci0JLyoKLQkgKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGIwIChtYXN0ZXIpIGZvciB0aW1lZCBjb252ZXJzaW9ucwotCSAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yX2IwOwotCS8qCi0JICogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBiMSAoc2NhbiBwYWNpbmcpIGZvciB0aW1lZAotCSAqIGNvbnZlcnNpb25zCi0JICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3JfYjE7CiAKIAkvKiB3ZSBhcmUgdXNpbmcgZG1hL2ZpZm8taGFsZi1mdWxsL2V0Yy4gKi8KIAllbnVtIHRyYW5zZmVyX3R5cGUgY3VycmVudF90cmFuc2ZlcjsKQEAgLTc3LDUgKzY0LDYgQEAKIAogaW50IGxhYnBjX2NvbW1vbl9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCXVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGxvbmcgaXNyX2ZsYWdzKTsKK3ZvaWQgbGFicGNfY29tbW9uX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKIAogI2VuZGlmIC8qIF9OSV9MQUJQQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY29tbW9uLmMKaW5kZXggYjg4ZWUyNi4uODYzYWZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jb21tb24uYwpAQCAtMjAsMTIgKzIwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAjaW5jbHVkZSAiODI1NS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIm5pX2xhYnBjLmgiCiAjaW5jbHVkZSAibmlfbGFicGNfcmVncy5oIgogI2luY2x1ZGUgIm5pX2xhYnBjX2lzYWRtYS5oIgpAQCAtMTA4LDMyICsxMDgsNiBAQAogCXdyaXRlYihieXRlLCBkZXYtPm1taW8gKyByZWcpOwogfQogCi1zdGF0aWMgdm9pZCBsYWJwY19jb3VudGVyX2xvYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHJlZywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBtb2RlKQotewotCWlmIChkZXYtPm1taW8pIHsKLQkJaTgyNTRfbW1fc2V0X21vZGUoZGV2LT5tbWlvICsgcmVnLCAwLCBjb3VudGVyX251bWJlciwgbW9kZSk7Ci0JCWk4MjU0X21tX3dyaXRlKGRldi0+bW1pbyArIHJlZywgMCwgY291bnRlcl9udW1iZXIsIGNvdW50KTsKLQl9IGVsc2UgewotCQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIHJlZywgMCwgY291bnRlcl9udW1iZXIsIG1vZGUpOwotCQlpODI1NF93cml0ZShkZXYtPmlvYmFzZSArIHJlZywgMCwgY291bnRlcl9udW1iZXIsIGNvdW50KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGxhYnBjX2NvdW50ZXJfc2V0X21vZGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIHJlZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIsCi0JCQkJICAgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JaWYgKGRldi0+bW1pbykKLQkJaTgyNTRfbW1fc2V0X21vZGUoZGV2LT5tbWlvICsgcmVnLCAwLCBjb3VudGVyX251bWJlciwgbW9kZSk7Ci0JZWxzZQotCQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIHJlZywgMCwgY291bnRlcl9udW1iZXIsIG1vZGUpOwotfQotCiBzdGF0aWMgaW50IGxhYnBjX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgbGFicGNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKQEAgLTI4NCw3ICsyNTgsNyBAQAogCWRldnByaXYtPndyaXRlX2J5dGUoZGV2LCBkZXZwcml2LT5jbWQ0LCBDTUQ0X1JFRyk7CiAKIAkvKiBpbml0aWFsaXplIHBhY2VyIGNvdW50ZXIgdG8gcHJldmVudCBhbnkgcHJvYmxlbXMgKi8KLQlsYWJwY19jb3VudGVyX3NldF9tb2RlKGRldiwgQ09VTlRFUl9BX0JBU0VfUkVHLCAwLCBJODI1NF9NT0RFMik7CisJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2cHJpdi0+Y291bnRlciwgMCwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwogCiAJbGFicGNfY2xlYXJfYWRjX2ZpZm8oZGV2KTsKIApAQCAtMzY3LDgzICszNDEsODEgQEAKIHN0YXRpYyB2b2lkIGxhYnBjX2FkY190aW1pbmcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCwKIAkJCSAgICAgZW51bSBzY2FuX21vZGUgbW9kZSkKIHsKLQlzdHJ1Y3QgbGFicGNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKnBhY2VyID0gZGV2LT5wYWNlcjsKKwl1bnNpZ25lZCBpbnQgY29udmVydF9wZXJpb2QgPSBsYWJwY19haV9jb252ZXJ0X3BlcmlvZChjbWQsIG1vZGUpOworCXVuc2lnbmVkIGludCBzY2FuX3BlcmlvZCA9IGxhYnBjX2FpX3NjYW5fcGVyaW9kKGNtZCwgbW9kZSk7CiAJdW5zaWduZWQgaW50IGJhc2VfcGVyaW9kOwotCXVuc2lnbmVkIGludCBzY2FuX3BlcmlvZDsKLQl1bnNpZ25lZCBpbnQgY29udmVydF9wZXJpb2Q7CiAKIAkvKgotCSAqIGlmIGJvdGggY29udmVydCBhbmQgc2NhbiB0cmlnZ2VycyBhcmUgVFJJR19USU1FUiwgdGhlbiB0aGV5Ci0JICogYm90aCByZWx5IG9uIGNvdW50ZXIgYjAKKwkgKiBJZiBib3RoIGNvbnZlcnQgYW5kIHNjYW4gdHJpZ2dlcnMgYXJlIFRSSUdfVElNRVIsIHRoZW4gdGhleQorCSAqIGJvdGggcmVseSBvbiBjb3VudGVyIGIwLiBJZiBvbmx5IG9uZSBUUklHX1RJTUVSIGlzIHVzZWQsIHdlCisJICogY2FuIHVzZSB0aGUgZ2VuZXJpYyBjYXNjYWRlZCB0aW1pbmcgZnVuY3Rpb25zLgogCSAqLwotCWNvbnZlcnRfcGVyaW9kID0gbGFicGNfYWlfY29udmVydF9wZXJpb2QoY21kLCBtb2RlKTsKLQlzY2FuX3BlcmlvZCA9IGxhYnBjX2FpX3NjYW5fcGVyaW9kKGNtZCwgbW9kZSk7CiAJaWYgKGNvbnZlcnRfcGVyaW9kICYmIHNjYW5fcGVyaW9kKSB7CiAJCS8qCi0JCSAqIHBpY2sgdGhlIGxvd2VzdCBiMCBkaXZpc29yIHZhbHVlIHdlIGNhbiAoZm9yIG1heGltdW0gaW5wdXQKKwkJICogcGljayB0aGUgbG93ZXN0IGRpdmlzb3IgdmFsdWUgd2UgY2FuIChmb3IgbWF4aW11bSBpbnB1dAogCQkgKiBjbG9jayBzcGVlZCBvbiBjb252ZXJ0IGFuZCBzY2FuIGNvdW50ZXJzKQogCQkgKi8KLQkJZGV2cHJpdi0+ZGl2aXNvcl9iMCA9IChzY2FuX3BlcmlvZCAtIDEpIC8KLQkJICAgIChJODI1NF9PU0NfQkFTRV8yTUhaICogMHgxMDAwMCkgKyAxOworCQlwYWNlci0+bmV4dF9kaXYxID0gKHNjYW5fcGVyaW9kIC0gMSkgLworCQkJCSAgIChwYWNlci0+b3NjX2Jhc2UgKiBJODI1NF9NQVhfQ09VTlQpICsgMTsKIAotCQljZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZkZXZwcml2LT5kaXZpc29yX2IwLCAyKTsKLQkJY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmZGV2cHJpdi0+ZGl2aXNvcl9iMCwgMHgxMDAwMCk7CisJCWNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJnBhY2VyLT5uZXh0X2RpdjEsIDIpOworCQljb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZwYWNlci0+bmV4dF9kaXYxLAorCQkJCQkgICAgIEk4MjU0X01BWF9DT1VOVCk7CiAKLQkJYmFzZV9wZXJpb2QgPSBJODI1NF9PU0NfQkFTRV8yTUhaICogZGV2cHJpdi0+ZGl2aXNvcl9iMDsKKwkJYmFzZV9wZXJpb2QgPSBwYWNlci0+b3NjX2Jhc2UgKiBwYWNlci0+bmV4dF9kaXYxOwogCiAJCS8qICBzZXQgYTAgZm9yIGNvbnZlcnNpb24gZnJlcXVlbmN5IGFuZCBiMSBmb3Igc2NhbiBmcmVxdWVuY3kgKi8KIAkJc3dpdGNoIChjbWQtPmZsYWdzICYgQ01ERl9ST1VORF9NQVNLKSB7CiAJCWRlZmF1bHQ6CiAJCWNhc2UgQ01ERl9ST1VORF9ORUFSRVNUOgotCQkJZGV2cHJpdi0+ZGl2aXNvcl9hMCA9IERJVl9ST1VORF9DTE9TRVNUKGNvbnZlcnRfcGVyaW9kLAotCQkJCQkJCQliYXNlX3BlcmlvZCk7Ci0JCQlkZXZwcml2LT5kaXZpc29yX2IxID0gRElWX1JPVU5EX0NMT1NFU1Qoc2Nhbl9wZXJpb2QsCi0JCQkJCQkJCWJhc2VfcGVyaW9kKTsKKwkJCXBhY2VyLT5uZXh0X2RpdiA9IERJVl9ST1VORF9DTE9TRVNUKGNvbnZlcnRfcGVyaW9kLAorCQkJCQkJCSAgICBiYXNlX3BlcmlvZCk7CisJCQlwYWNlci0+bmV4dF9kaXYyID0gRElWX1JPVU5EX0NMT1NFU1Qoc2Nhbl9wZXJpb2QsCisJCQkJCQkJICAgICBiYXNlX3BlcmlvZCk7CiAJCQlicmVhazsKIAkJY2FzZSBDTURGX1JPVU5EX1VQOgotCQkJZGV2cHJpdi0+ZGl2aXNvcl9hMCA9IERJVl9ST1VORF9VUChjb252ZXJ0X3BlcmlvZCwKLQkJCQkJCQkgICBiYXNlX3BlcmlvZCk7Ci0JCQlkZXZwcml2LT5kaXZpc29yX2IxID0gRElWX1JPVU5EX1VQKHNjYW5fcGVyaW9kLAotCQkJCQkJCSAgIGJhc2VfcGVyaW9kKTsKKwkJCXBhY2VyLT5uZXh0X2RpdiA9IERJVl9ST1VORF9VUChjb252ZXJ0X3BlcmlvZCwKKwkJCQkJCSAgICAgICBiYXNlX3BlcmlvZCk7CisJCQlwYWNlci0+bmV4dF9kaXYyID0gRElWX1JPVU5EX1VQKHNjYW5fcGVyaW9kLAorCQkJCQkJCWJhc2VfcGVyaW9kKTsKIAkJCWJyZWFrOwogCQljYXNlIENNREZfUk9VTkRfRE9XTjoKLQkJCWRldnByaXYtPmRpdmlzb3JfYTAgPSBjb252ZXJ0X3BlcmlvZCAvIGJhc2VfcGVyaW9kOwotCQkJZGV2cHJpdi0+ZGl2aXNvcl9iMSA9IHNjYW5fcGVyaW9kIC8gYmFzZV9wZXJpb2Q7CisJCQlwYWNlci0+bmV4dF9kaXYgPSBjb252ZXJ0X3BlcmlvZCAvIGJhc2VfcGVyaW9kOworCQkJcGFjZXItPm5leHRfZGl2MiA9IHNjYW5fcGVyaW9kIC8gYmFzZV9wZXJpb2Q7CiAJCQlicmVhazsKIAkJfQogCQkvKiAgbWFrZSBzdXJlIGEwIGFuZCBiMSB2YWx1ZXMgYXJlIGFjY2VwdGFibGUgKi8KLQkJY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmZGV2cHJpdi0+ZGl2aXNvcl9hMCwgMik7Ci0JCWNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmRldnByaXYtPmRpdmlzb3JfYTAsIDB4MTAwMDApOwotCQljZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZkZXZwcml2LT5kaXZpc29yX2IxLCAyKTsKLQkJY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmZGV2cHJpdi0+ZGl2aXNvcl9iMSwgMHgxMDAwMCk7CisJCWNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJnBhY2VyLT5uZXh0X2RpdiwgMik7CisJCWNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJnBhY2VyLT5uZXh0X2RpdiwgSTgyNTRfTUFYX0NPVU5UKTsKKwkJY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmcGFjZXItPm5leHRfZGl2MiwgMik7CisJCWNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJnBhY2VyLT5uZXh0X2RpdjIsCisJCQkJCSAgICAgSTgyNTRfTUFYX0NPVU5UKTsKKwogCQkvKiAgd3JpdGUgY29ycmVjdGVkIHRpbWluZ3MgdG8gY29tbWFuZCAqLwogCQlsYWJwY19zZXRfYWlfY29udmVydF9wZXJpb2QoY21kLCBtb2RlLAotCQkJCQkgICAgYmFzZV9wZXJpb2QgKiBkZXZwcml2LT5kaXZpc29yX2EwKTsKKwkJCQkJICAgIGJhc2VfcGVyaW9kICogcGFjZXItPm5leHRfZGl2KTsKIAkJbGFicGNfc2V0X2FpX3NjYW5fcGVyaW9kKGNtZCwgbW9kZSwKLQkJCQkJIGJhc2VfcGVyaW9kICogZGV2cHJpdi0+ZGl2aXNvcl9iMSk7Ci0JCS8qCi0JCSAqIGlmIG9ubHkgb25lIFRSSUdfVElNRVIgaXMgdXNlZCwgd2UgY2FuIGVtcGxveSB0aGUgZ2VuZXJpYwotCQkgKiBjYXNjYWRlZCB0aW1pbmcgZnVuY3Rpb25zCi0JCSAqLworCQkJCQkgYmFzZV9wZXJpb2QgKiBwYWNlci0+bmV4dF9kaXYyKTsKIAl9IGVsc2UgaWYgKHNjYW5fcGVyaW9kKSB7CiAJCS8qCiAJCSAqIGNhbGN1bGF0ZSBjYXNjYWRlZCBjb3VudGVyIHZhbHVlcwogCQkgKiB0aGF0IGdpdmUgZGVzaXJlZCBzY2FuIHRpbWluZworCQkgKiAocGFjZXItPm5leHRfZGl2MiAvIHBhY2VyLT5uZXh0X2RpdjEpCiAJCSAqLwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzJNSFosCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3JfYjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3JfYjAsCi0JCQkJCSAgJnNjYW5fcGVyaW9kLCBjbWQtPmZsYWdzKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihwYWNlciwgJnNjYW5fcGVyaW9kLAorCQkJCQkJY21kLT5mbGFncyk7CiAJCWxhYnBjX3NldF9haV9zY2FuX3BlcmlvZChjbWQsIG1vZGUsIHNjYW5fcGVyaW9kKTsKIAl9IGVsc2UgaWYgKGNvbnZlcnRfcGVyaW9kKSB7CiAJCS8qCiAJCSAqIGNhbGN1bGF0ZSBjYXNjYWRlZCBjb3VudGVyIHZhbHVlcwogCQkgKiB0aGF0IGdpdmUgZGVzaXJlZCBjb252ZXJzaW9uIHRpbWluZworCQkgKiAocGFjZXItPm5leHRfZGl2IC8gcGFjZXItPm5leHRfZGl2MSkKIAkJICovCi0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMk1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcl9hMCwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcl9iMCwKLQkJCQkJICAmY29udmVydF9wZXJpb2QsIGNtZC0+ZmxhZ3MpOworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKHBhY2VyLCAmY29udmVydF9wZXJpb2QsCisJCQkJCQljbWQtPmZsYWdzKTsKKwkJLyogdHJhbnNmZXIgZGl2MiB2YWx1ZSBzbyBjb3JyZWN0IHRpbWVyIGdldHMgdXBkYXRlZCAqLworCQlwYWNlci0+bmV4dF9kaXYgPSBwYWNlci0+bmV4dF9kaXYyOwogCQlsYWJwY19zZXRfYWlfY29udmVydF9wZXJpb2QoY21kLCBtb2RlLCBjb252ZXJ0X3BlcmlvZCk7CiAJfQogfQpAQCAtNDU3LDcgKzQyOSw3IEBACiAJCXJldHVybiBNT0RFX1NJTkdMRV9DSEFOOwogCiAJLyogY2hhbmxpc3QgbWF5IGJlIE5VTEwgZHVyaW5nIGNtZHRlc3QgKi8KLQlpZiAoY21kLT5jaGFubGlzdCA9PSBOVUxMKQorCWlmICghY21kLT5jaGFubGlzdCkKIAkJcmV0dXJuIE1PREVfTVVMVF9DSEFOX1VQOwogCiAJY2hhbjAgPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbMF0pOwpAQCAtNDgyLDkgKzQ1NCw2IEBACiAJdW5zaWduZWQgaW50IGFyZWYwID0gQ1JfQVJFRihjbWQtPmNoYW5saXN0WzBdKTsKIAlpbnQgaTsKIAotCWlmIChtb2RlID09IE1PREVfU0lOR0xFX0NIQU4pCi0JCXJldHVybiAwOwotCiAJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOwogCQl1bnNpZ25lZCBpbnQgcmFuZ2UgPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKTsKQEAgLTU0MywyNiArNTEyLDI3IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19USU1FUiB8IFRSSUdfRk9MTE9XIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwogCiAJc3RvcF9tYXNrID0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKIAlpZiAoYm9hcmQtPmlzX2xhYnBjMTIwMCkKIAkJc3RvcF9tYXNrIHw9IFRSSUdfRVhUOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIHN0b3BfbWFzayk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgc3RvcF9tYXNrKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTc3LDcgKzU0Nyw3IEBACiAKIAlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CiAJY2FzZSBUUklHX05PVzoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6CiAJCS8qIHN0YXJ0X2FyZyB2YWx1ZSBpcyBpZ25vcmVkICovCkBAIC01ODYsMjcgKzU1NiwzMyBAQAogCiAJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikKIAkJZXJyIHw9IC1FSU5WQUw7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgYm9hcmQtPmFpX3NwZWVkKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIGJvYXJkLT5haV9zcGVlZCk7CisJfQogCiAJLyogbWFrZSBzdXJlIHNjYW4gdGltaW5nIGlzIG5vdCB0b28gZmFzdCAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5jaGFubGlzdF9sZW4pOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQlib2FyZC0+YWlfc3BlZWQgKiBjbWQtPmNoYW5saXN0X2xlbik7CisJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgY21kLT5jb252ZXJ0X2FyZyAqCisJCQkJCQkJICAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwkJfQorCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBib2FyZC0+YWlfc3BlZWQgKgorCQkJCQkJICAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAl9CiAKIAlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKIAljYXNlIFRSSUdfQ09VTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCQlicmVhazsKIAljYXNlIFRSSUdfTk9ORToKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCQlicmVhazsKIAkJLyoKIAkJICogVFJJR19FWFQgZG9lc24ndCBjYXJlIHNpbmNlIGl0IGRvZXNuJ3QKQEAgLTY3MCwxMSArNjQ2LDEyIEBACiAJCSAqIGxvYWQgY291bnRlciBhMSB3aXRoIGNvdW50IG9mIDMKIAkJICogKHBjKyBtYW51YWwgc2F5cyB0aGlzIGlzIG1pbmltdW0gYWxsb3dlZCkgdXNpbmcgbW9kZSAwCiAJCSAqLwotCQlsYWJwY19jb3VudGVyX2xvYWQoZGV2LCBDT1VOVEVSX0FfQkFTRV9SRUcsCi0JCQkJICAgMSwgMywgSTgyNTRfTU9ERTApOworCQljb21lZGlfODI1NF9sb2FkKGRldnByaXYtPmNvdW50ZXIsIDEsCisJCQkJIDMsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKIAl9IGVsc2UJewogCQkvKiBqdXN0IHB1dCBjb3VudGVyIGExIGluIG1vZGUgMCB0byBzZXQgaXRzIG91dHB1dCBsb3cgKi8KLQkJbGFicGNfY291bnRlcl9zZXRfbW9kZShkZXYsIENPVU5URVJfQV9CQVNFX1JFRywgMSwgSTgyNTRfTU9ERTApOworCQljb21lZGlfODI1NF9zZXRfbW9kZShkZXZwcml2LT5jb3VudGVyLCAxLAorCQkJCSAgICAgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCX0KIAogCS8qIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2Qgd2Ugd2lsbCB1c2UgdG8gdHJhbnNmZXIgZGF0YSAqLwpAQCAtNzE1LDI3ICs2OTIsMjQgQEAKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIgfHwKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCS8qICBzZXQgdXAgcGFjaW5nICovCi0JCWxhYnBjX2FkY190aW1pbmcoZGV2LCBjbWQsIG1vZGUpOwotCQkvKiAgbG9hZCBjb3VudGVyIGIwIGluIG1vZGUgMyAqLwotCQlsYWJwY19jb3VudGVyX2xvYWQoZGV2LCBDT1VOVEVSX0JfQkFTRV9SRUcsCi0JCQkJICAgMCwgZGV2cHJpdi0+ZGl2aXNvcl9iMCwgSTgyNTRfTU9ERTMpOwotCX0KLQkvKiAgc2V0IHVwIGNvbnZlcnNpb24gcGFjaW5nICovCi0JaWYgKGxhYnBjX2FpX2NvbnZlcnRfcGVyaW9kKGNtZCwgbW9kZSkpIHsKLQkJLyogIGxvYWQgY291bnRlciBhMCBpbiBtb2RlIDIgKi8KLQkJbGFicGNfY291bnRlcl9sb2FkKGRldiwgQ09VTlRFUl9BX0JBU0VfUkVHLAotCQkJCSAgIDAsIGRldnByaXYtPmRpdmlzb3JfYTAsIEk4MjU0X01PREUyKTsKLQl9IGVsc2UgewotCQkvKiBpbml0aWFsaXplIHBhY2VyIGNvdW50ZXIgdG8gcHJldmVudCBhbnkgcHJvYmxlbXMgKi8KLQkJbGFicGNfY291bnRlcl9zZXRfbW9kZShkZXYsIENPVU5URVJfQV9CQVNFX1JFRywgMCwgSTgyNTRfTU9ERTIpOwotCX0KKwkJc3RydWN0IGNvbWVkaV84MjU0ICpwYWNlciA9IGRldi0+cGFjZXI7CisJCXN0cnVjdCBjb21lZGlfODI1NCAqY291bnRlciA9IGRldnByaXYtPmNvdW50ZXI7CiAKLQkvKiAgc2V0IHVwIHNjYW4gcGFjaW5nICovCi0JaWYgKGxhYnBjX2FpX3NjYW5fcGVyaW9kKGNtZCwgbW9kZSkpIHsKLQkJLyogIGxvYWQgY291bnRlciBiMSBpbiBtb2RlIDIgKi8KLQkJbGFicGNfY291bnRlcl9sb2FkKGRldiwgQ09VTlRFUl9CX0JBU0VfUkVHLAotCQkJCSAgIDEsIGRldnByaXYtPmRpdmlzb3JfYjEsIEk4MjU0X01PREUyKTsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKHBhY2VyKTsKKworCQkvKiBzZXQgdXAgcGFjaW5nICovCisJCWNvbWVkaV84MjU0X2xvYWQocGFjZXIsIDAsIHBhY2VyLT5kaXZpc29yMSwKKwkJCQkgSTgyNTRfTU9ERTMgfCBJODI1NF9CSU5BUlkpOworCisJCS8qIHNldCB1cCBjb252ZXJzaW9uIHBhY2luZyAqLworCQljb21lZGlfODI1NF9zZXRfbW9kZShjb3VudGVyLCAwLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJCWlmIChsYWJwY19haV9jb252ZXJ0X3BlcmlvZChjbWQsIG1vZGUpKQorCQkJY29tZWRpXzgyNTRfd3JpdGUoY291bnRlciwgMCwgcGFjZXItPmRpdmlzb3IpOworCisJCS8qIHNldCB1cCBzY2FuIHBhY2luZyAqLworCQlpZiAobGFicGNfYWlfc2Nhbl9wZXJpb2QoY21kLCBtb2RlKSkKKwkJCWNvbWVkaV84MjU0X2xvYWQocGFjZXIsIDEsIHBhY2VyLT5kaXZpc29yMiwKKwkJCQkJIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKIAl9CiAKIAlsYWJwY19jbGVhcl9hZGNfZmlmbyhkZXYpOwpAQCAtMTI0MCw2ICsxMjE0LDI2IEBACiAJCQlkZXYtPmlycSA9IGlycTsKIAl9CiAKKwlpZiAoZGV2LT5tbWlvKSB7CisJCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9tbV9pbml0KGRldi0+bW1pbyArIENPVU5URVJfQl9CQVNFX1JFRywKKwkJCQkJCSBJODI1NF9PU0NfQkFTRV8yTUhaLAorCQkJCQkJIEk4MjU0X0lPOCwgMCk7CisJCWRldnByaXYtPmNvdW50ZXIgPSBjb21lZGlfODI1NF9tbV9pbml0KGRldi0+bW1pbyArCisJCQkJCQkgICAgICAgQ09VTlRFUl9BX0JBU0VfUkVHLAorCQkJCQkJICAgICAgIEk4MjU0X09TQ19CQVNFXzJNSFosCisJCQkJCQkgICAgICAgSTgyNTRfSU84LCAwKTsKKwl9IGVsc2UgeworCQlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIENPVU5URVJfQl9CQVNFX1JFRywKKwkJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMk1IWiwKKwkJCQkJICAgICAgSTgyNTRfSU84LCAwKTsKKwkJZGV2cHJpdi0+Y291bnRlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKworCQkJCQkJICAgIENPVU5URVJfQV9CQVNFX1JFRywKKwkJCQkJCSAgICBJODI1NF9PU0NfQkFTRV8yTUhaLAorCQkJCQkJICAgIEk4MjU0X0lPOCwgMCk7CisJfQorCWlmICghZGV2LT5wYWNlciB8fCAhZGV2cHJpdi0+Y291bnRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC0xMzM2LDYgKzEzMzAsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxhYnBjX2NvbW1vbl9hdHRhY2gpOwogCit2b2lkIGxhYnBjX2NvbW1vbl9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFicGNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKworCWlmIChkZXZwcml2KQorCQlrZnJlZShkZXZwcml2LT5jb3VudGVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxhYnBjX2NvbW1vbl9kZXRhY2gpOworCiBzdGF0aWMgaW50IF9faW5pdCBsYWJwY19jb21tb25faW5pdCh2b2lkKQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwppbmRleCA3NDZjNGNkOS4uYTFjNjlhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMKQEAgLTY4LDggKzY4LDggQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBsYWJwY19hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCitzdGF0aWMgaW50IGxhYnBjX2NzX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0KQogewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gY29tZWRpX3RvX3BjbWNpYV9kZXYoZGV2KTsKIAlpbnQgcmV0OwpAQCAtOTAsMTEgKzkwLDE3IEBACiAJcmV0dXJuIGxhYnBjX2NvbW1vbl9hdHRhY2goZGV2LCBsaW5rLT5pcnEsIElSUUZfU0hBUkVEKTsKIH0KIAorc3RhdGljIHZvaWQgbGFicGNfY3NfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJbGFicGNfY29tbW9uX2RldGFjaChkZXYpOworCWNvbWVkaV9wY21jaWFfZGlzYWJsZShkZXYpOworfQorCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgZHJpdmVyX2xhYnBjX2NzID0gewogCS5kcml2ZXJfbmFtZQk9ICJuaV9sYWJwY19jcyIsCiAJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKLQkuYXV0b19hdHRhY2gJPSBsYWJwY19hdXRvX2F0dGFjaCwKLQkuZGV0YWNoCQk9IGNvbWVkaV9wY21jaWFfZGlzYWJsZSwKKwkuYXV0b19hdHRhY2gJPSBsYWJwY19jc19hdXRvX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGxhYnBjX2NzX2RldGFjaCwKIH07CiAKIHN0YXRpYyBpbnQgbGFicGNfY3NfYXR0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2lzYWRtYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2lzYWRtYS5jCmluZGV4IDZiNGNjZDguLjI5ZGJkZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19pc2FkbWEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfaXNhZG1hLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9pc2FkbWEuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICJuaV9sYWJwYy5oIgogI2luY2x1ZGUgIm5pX2xhYnBjX3JlZ3MuaCIKICNpbmNsdWRlICJuaV9sYWJwY19pc2FkbWEuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19wY2kuYwppbmRleCAwNDA3ZmY2Li43N2Q0MDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX3BjaS5jCkBAIC0zMSw5ICszMSw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgIm5pX2xhYnBjLmgiCiAKQEAgLTUxLDcgKzUwLDcgQEAKIAl9LAogfTsKIAotLyogcmlwcGVkIGZyb20gbWl0ZS5oIGFuZCBtaXRlX3NldHVwMigpIHRvIGF2b2lkIG1pdGUgZGVwZW5kYW5jeSAqLworLyogcmlwcGVkIGZyb20gbWl0ZS5oIGFuZCBtaXRlX3NldHVwMigpIHRvIGF2b2lkIG1pdGUgZGVwZW5kZW5jeSAqLwogI2RlZmluZSBNSVRFX0lPRFdCU1IJMHhjMAkgLyogSU8gRGV2aWNlIFdpbmRvdyBCYXNlIFNpemUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgV0VOQUIJCSgxIDw8IDcpIC8qIHdpbmRvdyBlbmFibGUgKi8KIApAQCAtMTAzLDExICsxMDIsMTcgQEAKIAlyZXR1cm4gbGFicGNfY29tbW9uX2F0dGFjaChkZXYsIHBjaWRldi0+aXJxLCBJUlFGX1NIQVJFRCk7CiB9CiAKK3N0YXRpYyB2b2lkIGxhYnBjX3BjaV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlsYWJwY19jb21tb25fZGV0YWNoKGRldik7CisJY29tZWRpX3BjaV9kZXRhY2goZGV2KTsKK30KKwogc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGxhYnBjX3BjaV9jb21lZGlfZHJpdmVyID0gewogCS5kcml2ZXJfbmFtZQk9ICJsYWJwY19wY2kiLAogCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJLmF1dG9fYXR0YWNoCT0gbGFicGNfcGNpX2F1dG9fYXR0YWNoLAotCS5kZXRhY2gJCT0gY29tZWRpX3BjaV9kZXRhY2gsCisJLmRldGFjaAkJPSBsYWJwY19wY2lfZGV0YWNoLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGxhYnBjX3BjaV90YWJsZVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKaW5kZXggYjZkZGMwMS4uYzY2YWZmZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwpAQCAtNTcsNyArNTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSAiODI1NS5oIgogI2luY2x1ZGUgIm1pdGUuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAogLyogQSB0aW1lb3V0IGNvdW50ICovCiAjZGVmaW5lIE5JX1RJTUVPVVQgMTAwMApAQCAtNjcwLDggKzY2OSw4IEBACiAJCW5pX3dyaXRlYihkZXYsIGRldnByaXYtPmcwX2cxX3NlbGVjdF9yZWcsIEcwX0cxX1NlbGVjdCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkiJXMgY2FsbGVkIHdpdGggaW52YWxpZCByZWdpc3RlciAlZFxuIiwgX19mdW5jX18sIHJlZyk7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJjYWxsZWQgd2l0aCBpbnZhbGlkIHJlZ2lzdGVyICVkXG4iLAorCQkJcmVnKTsKIAkJYnJlYWs7CiAJfQogCW1taW93YigpOwpAQCAtNzU1LDcgKzc1NCw3IEBACiAJQlVHX09OKGRldnByaXYtPmFpX21pdGVfY2hhbik7CiAJZGV2cHJpdi0+YWlfbWl0ZV9jaGFuID0KIAkgICAgbWl0ZV9yZXF1ZXN0X2NoYW5uZWwoZGV2cHJpdi0+bWl0ZSwgZGV2cHJpdi0+YWlfbWl0ZV9yaW5nKTsKLQlpZiAoZGV2cHJpdi0+YWlfbWl0ZV9jaGFuID09IE5VTEwpIHsKKwlpZiAoIWRldnByaXYtPmFpX21pdGVfY2hhbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZwcml2LT5taXRlX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJImZhaWxlZCB0byByZXNlcnZlIG1pdGUgZG1hIGNoYW5uZWwgZm9yIGFuYWxvZyBpbnB1dFxuIik7CkBAIC03NzYsNyArNzc1LDcgQEAKIAlCVUdfT04oZGV2cHJpdi0+YW9fbWl0ZV9jaGFuKTsKIAlkZXZwcml2LT5hb19taXRlX2NoYW4gPQogCSAgICBtaXRlX3JlcXVlc3RfY2hhbm5lbChkZXZwcml2LT5taXRlLCBkZXZwcml2LT5hb19taXRlX3JpbmcpOwotCWlmIChkZXZwcml2LT5hb19taXRlX2NoYW4gPT0gTlVMTCkgeworCWlmICghZGV2cHJpdi0+YW9fbWl0ZV9jaGFuKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkiZmFpbGVkIHRvIHJlc2VydmUgbWl0ZSBkbWEgY2hhbm5lbCBmb3IgYW5hbG9nIG91dHV0XG4iKTsKQEAgLTgwMiw3ICs4MDEsNyBAQAogCW1pdGVfY2hhbiA9CiAJICAgIG1pdGVfcmVxdWVzdF9jaGFubmVsKGRldnByaXYtPm1pdGUsCiAJCQkJIGRldnByaXYtPmdwY3RfbWl0ZV9yaW5nW2dwY3RfaW5kZXhdKTsKLQlpZiAobWl0ZV9jaGFuID09IE5VTEwpIHsKKwlpZiAoIW1pdGVfY2hhbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZwcml2LT5taXRlX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJImZhaWxlZCB0byByZXNlcnZlIG1pdGUgZG1hIGNoYW5uZWwgZm9yIGNvdW50ZXJcbiIpOwpAQCAtODI4LDcgKzgyNyw3IEBACiAJQlVHX09OKGRldnByaXYtPmNkb19taXRlX2NoYW4pOwogCWRldnByaXYtPmNkb19taXRlX2NoYW4gPQogCSAgICBtaXRlX3JlcXVlc3RfY2hhbm5lbChkZXZwcml2LT5taXRlLCBkZXZwcml2LT5jZG9fbWl0ZV9yaW5nKTsKLQlpZiAoZGV2cHJpdi0+Y2RvX21pdGVfY2hhbiA9PSBOVUxMKSB7CisJaWYgKCFkZXZwcml2LT5jZG9fbWl0ZV9jaGFuKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkiZmFpbGVkIHRvIHJlc2VydmUgbWl0ZSBkbWEgY2hhbm5lbCBmb3IgY29ycmVsYXRlZCBkaWdpdGFsIG91dHB1dFxuIik7CkBAIC0xMDY4LDcgKzEwNjcsNyBAQAogCQkJdWRlbGF5KDUpOwogCQl9CiAJCWlmIChpID09IHRpbWVvdXQpIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlcyB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJ0aW1lZCBvdXRcbiIpOwogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCQkibWl0ZV9ieXRlc19pbl90cmFuc2l0PSVpLCBBSV9TdGF0dXMxX1JlZ2lzdGVyPTB4JXhcbiIsCiAJCQkJbWl0ZV9ieXRlc19pbl90cmFuc2l0KGRldnByaXYtPmFpX21pdGVfY2hhbiksCkBAIC0xMzYwLDcgKzEzNTksNyBAQAogCS8qIENoZWNrIGlmIHRoZXJlJ3MgYSBzaW5nbGUgc2FtcGxlIHN0dWNrIGluIHRoZSBGSUZPICovCiAJaWYgKG5pX3JlYWRiKGRldiwgWFhYX1N0YXR1cykgJiAweDgwKSB7CiAJCWRsID0gbmlfcmVhZGwoZGV2LCBBRENfRklGT19EYXRhXzYxMXgpOwotCQlkYXRhID0gKGRsICYgMHhmZmZmKTsKKwkJZGF0YSA9IGRsICYgMHhmZmZmOwogCQljb21lZGlfYnVmX3dyaXRlX3NhbXBsZXMocywgJmRhdGEsIDEpOwogCX0KIH0KQEAgLTE2NTcsNyArMTY1Niw3IEBACiAJY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhzLCBzLT5hc3luYy0+cHJlYWxsb2NfYnVmc3opOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7Ci0JaWYgKGRldnByaXYtPmFpX21pdGVfY2hhbiA9PSBOVUxMKSB7CisJaWYgKCFkZXZwcml2LT5haV9taXRlX2NoYW4pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTcwMCw4ICsxNjk5LDkgQEAKIAkJCW1pdGVfcHJlcF9kbWEoZGV2cHJpdi0+YW9fbWl0ZV9jaGFuLCAxNiwgMzIpOwogCQl9CiAJCW1pdGVfZG1hX2FybShkZXZwcml2LT5hb19taXRlX2NoYW4pOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXJldHZhbCA9IC1FSU87CisJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTg3MCw3ICsxODcwLDcgQEAKIAkJY2hhbiA9IENSX0NIQU4obGlzdFswXSk7CiAJCXJhbmdlID0gQ1JfUkFOR0UobGlzdFswXSk7CiAJCXJhbmdlX2NvZGUgPSBuaV9nYWlubGt1cFtib2FyZC0+Z2FpbmxrdXBdW3JhbmdlXTsKLQkJZGl0aGVyID0gKChsaXN0WzBdICYgQ1JfQUxUX0ZJTFRFUikgIT0gMCk7CisJCWRpdGhlciA9IChsaXN0WzBdICYgQ1JfQUxUX0ZJTFRFUikgIT0gMDsKIAkJYnlwYXNzX2JpdHMgPSBNU2VyaWVzX0FJX0J5cGFzc19Db25maWdfRklGT19CaXQ7CiAJCWJ5cGFzc19iaXRzIHw9IGNoYW47CiAJCWJ5cGFzc19iaXRzIHw9CkBAIC0xODk0LDcgKzE4OTQsNyBAQAogCQljaGFuID0gQ1JfQ0hBTihsaXN0W2ldKTsKIAkJYXJlZiA9IENSX0FSRUYobGlzdFtpXSk7CiAJCXJhbmdlID0gQ1JfUkFOR0UobGlzdFtpXSk7Ci0JCWRpdGhlciA9ICgobGlzdFtpXSAmIENSX0FMVF9GSUxURVIpICE9IDApOworCQlkaXRoZXIgPSAobGlzdFtpXSAmIENSX0FMVF9GSUxURVIpICE9IDA7CiAKIAkJcmFuZ2VfY29kZSA9IG5pX2dhaW5sa3VwW2JvYXJkLT5nYWlubGt1cF1bcmFuZ2VdOwogCQlkZXZwcml2LT5haV9vZmZzZXRbaV0gPSAwOwpAQCAtMjAyMCw3ICsyMDIwLDcgQEAKIAkJCWNoYW4gPSBDUl9DSEFOKGxpc3RbaV0pOwogCQlhcmVmID0gQ1JfQVJFRihsaXN0W2ldKTsKIAkJcmFuZ2UgPSBDUl9SQU5HRShsaXN0W2ldKTsKLQkJZGl0aGVyID0gKChsaXN0W2ldICYgQ1JfQUxUX0ZJTFRFUikgIT0gMCk7CisJCWRpdGhlciA9IChsaXN0W2ldICYgQ1JfQUxUX0ZJTFRFUikgIT0gMDsKIAogCQkvKiBmaXggdGhlIGV4dGVybmFsL2ludGVybmFsIHJhbmdlIGRpZmZlcmVuY2VzICovCiAJCXJhbmdlID0gbmlfZ2FpbmxrdXBbYm9hcmQtPmdhaW5sa3VwXVtyYW5nZV07CkBAIC0yMTE2LDggKzIxMTYsNyBAQAogCQkJCX0KIAkJCX0KIAkJCWlmIChpID09IE5JX1RJTUVPVVQpIHsKLQkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiJXMgdGltZW91dFxuIiwKLQkJCQkJX19mdW5jX18pOworCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJ0aW1lb3V0XG4iKTsKIAkJCQlyZXR1cm4gLUVUSU1FOwogCQkJfQogCQkJZCArPSBzaWduYml0czsKQEAgLTIxNDAsOCArMjEzOSw3IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKGkgPT0gTklfVElNRU9VVCkgewotCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlcyB0aW1lb3V0XG4iLAotCQkJCQlfX2Z1bmNfXyk7CisJCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwogCQkJCXJldHVybiAtRVRJTUU7CiAJCQl9CiAJCQlkYXRhW25dID0gKCgoZGwgPj4gMTYpICYgMHhGRkZGKSArIHNpZ25iaXRzKSAmIDB4RkZGRjsKQEAgLTIxNTYsOCArMjE1NCw3IEBACiAJCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKGkgPT0gTklfVElNRU9VVCkgewotCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlcyB0aW1lb3V0XG4iLAotCQkJCQlfX2Z1bmNfXyk7CisJCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwogCQkJCXJldHVybiAtRVRJTUU7CiAJCQl9CiAJCQlpZiAoZGV2cHJpdi0+aXNfbV9zZXJpZXMpIHsKQEAgLTIyMjcsMjggKzIyMjQsMjggQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAogCQkJCQlUUklHX05PVyB8IFRSSUdfSU5UIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKIAogCXNvdXJjZXMgPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CiAJaWYgKGRldnByaXYtPmlzXzYxMXggfHwgZGV2cHJpdi0+aXNfNjE0MykKIAkJc291cmNlcyB8PSBUUklHX05PVzsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBzb3VyY2VzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBzb3VyY2VzKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTIyNjAsNyArMjI1Nyw3IEBACiAJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgewogCWNhc2UgVFJJR19OT1c6CiAJY2FzZSBUUklHX0lOVDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6CiAJCXRtcCA9IENSX0NIQU4oY21kLT5zdGFydF9hcmcpOwpAQCAtMjI2OCwxNSArMjI2NSwxNiBAQAogCQlpZiAodG1wID4gMTYpCiAJCQl0bXAgPSAxNjsKIAkJdG1wIHw9IChjbWQtPnN0YXJ0X2FyZyAmIChDUl9JTlZFUlQgfCBDUl9FREdFKSk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCB0bXApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgdG1wKTsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCiAJCQluaV9taW5fYWlfc2Nhbl9wZXJpb2RfbnMoZGV2LCBjbWQtPmNoYW5saXN0X2xlbikpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBkZXZwcml2LT5jbG9ja19ucyAqIDB4ZmZmZmZmKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgZGV2cHJpdi0+Y2xvY2tfbnMgKgorCQkJCQkJICAgIDB4ZmZmZmZmKTsKIAl9IGVsc2UgaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQpIHsKIAkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLwogCQl1bnNpZ25lZCBpbnQgdG1wID0gQ1JfQ0hBTihjbWQtPnNjYW5fYmVnaW5fYXJnKTsKQEAgLTIyODQsMTkgKzIyODIsMjEgQEAKIAkJaWYgKHRtcCA+IDE2KQogCQkJdG1wID0gMTY7CiAJCXRtcCB8PSAoY21kLT5zY2FuX2JlZ2luX2FyZyAmIChDUl9JTlZFUlQgfCBDUl9FREdFKSk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIHRtcCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIHRtcCk7CiAJfSBlbHNlIHsJCS8qIFRSSUdfT1RIRVIgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCX0KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJaWYgKGRldnByaXYtPmlzXzYxMXggfHwgZGV2cHJpdi0+aXNfNjE0MykgewotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSAgIDApOwogCQl9IGVsc2UgewotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkJIGJvYXJkLT5haV9zcGVlZCk7Ci0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCWRldnByaXYtPmNsb2NrX25zICogMHhmZmZmKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSAgICBib2FyZC0+YWlfc3BlZWQpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkJICAgIGRldnByaXYtPmNsb2NrX25zICoKKwkJCQkJCQkgICAgMHhmZmZmKTsKIAkJfQogCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkgewogCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCkBAIC0yMzA1LDIzICsyMzA1LDI0IEBACiAJCWlmICh0bXAgPiAxNikKIAkJCXRtcCA9IDE2OwogCQl0bXAgfD0gKGNtZC0+Y29udmVydF9hcmcgJiAoQ1JfQUxUX0ZJTFRFUiB8IENSX0lOVkVSVCkpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCB0bXApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCB0bXApOwogCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX05PVykgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgewogCQl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ID0gMHgwMTAwMDAwMDsKIAogCQlpZiAoZGV2cHJpdi0+aXNfNjExeCkKIAkJCW1heF9jb3VudCAtPSBudW1fYWRjX3N0YWdlc182MTF4OwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgbWF4X2NvdW50KTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgbWF4X2NvdW50KTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCX0gZWxzZSB7CiAJCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAJfQogCiAJaWYgKGVycikKQEAgLTI1MjksNyArMjUzMCw3IEBACiAJCXN0YXJ0X3N0b3Bfc2VsZWN0IHw9CiAJCSAgICBBSV9TVEFSVF9TZWxlY3QoMSArIENSX0NIQU4oY21kLT5zY2FuX2JlZ2luX2FyZykpOwogCQluaV9zdGNfd3JpdGV3KGRldiwgc3RhcnRfc3RvcF9zZWxlY3QsCi0JCQkJICAgIEFJX1NUQVJUX1NUT1BfU2VsZWN0X1JlZ2lzdGVyKTsKKwkJCSAgICAgIEFJX1NUQVJUX1NUT1BfU2VsZWN0X1JlZ2lzdGVyKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTcyLDcgKzI1NzMsNiBAQAogCX0KIAogCWlmIChkZXYtPmlycSkgewotCiAJCS8qIGludGVycnVwdCBvbiBGSUZPLCBlcnJvcnMsIFNDX1RDICovCiAJCWludGVycnVwdF9hX2VuYWJsZSB8PSBBSV9FcnJvcl9JbnRlcnJ1cHRfRW5hYmxlIHwKIAkJICAgIEFJX1NDX1RDX0ludGVycnVwdF9FbmFibGU7CkBAIC0yODA4LDggKzI4MDgsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSIlczogYnVnISB1bmhhbmRsZWQgYW8gcmVmZXJlbmNlIHZvbHRhZ2VcbiIsCi0JCQkJX19mdW5jX18pOworCQkJCSJidWchIHVuaGFuZGxlZCBhbyByZWZlcmVuY2Ugdm9sdGFnZVxuIik7CiAJCQlicmVhazsKIAkJfQogCQlzd2l0Y2ggKGtyYW5nZS0+bWF4ICsga3JhbmdlLT5taW4pIHsKQEAgLTI4MjEsOCArMjgyMCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJIiVzOiBidWchIHVuaGFuZGxlZCBhbyBvZmZzZXQgdm9sdGFnZVxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCQkJImJ1ZyEgdW5oYW5kbGVkIGFvIG9mZnNldCB2b2x0YWdlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmICh0aW1lZCkKQEAgLTMyNjIsMjEgKzMyNjAsMjEgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0zMjg3LDcgKzMyODUsNyBAQAogCiAJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgewogCWNhc2UgVFJJR19JTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCQlicmVhazsKIAljYXNlIFRSSUdfRVhUOgogCQl0bXAgPSBDUl9DSEFOKGNtZC0+c3RhcnRfYXJnKTsKQEAgLTMyOTUsMjQgKzMyOTMsMjYgQEAKIAkJaWYgKHRtcCA+IDE4KQogCQkJdG1wID0gMTg7CiAJCXRtcCB8PSAoY21kLT5zdGFydF9hcmcgJiAoQ1JfSU5WRVJUIHwgQ1JfRURHRSkpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgdG1wKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIHRtcCk7CiAJCWJyZWFrOwogCX0KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgYm9hcmQtPmFvX3NwZWVkKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgZGV2cHJpdi0+Y2xvY2tfbnMgKiAweGZmZmZmZik7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIGJvYXJkLT5hb19zcGVlZCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIGRldnByaXYtPmNsb2NrX25zICoKKwkJCQkJCSAgICAweGZmZmZmZik7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c3RvcF9hcmcsIDB4MDBmZmZmZmYpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgMHgwMGZmZmZmZik7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0zNDc0LDExICszNDc0LDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC0zNDg4LDE2ICszNDg4LDE3IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAl0bXAgJj0gQ1JfUEFDS19GTEFHUyhDRE9fU2FtcGxlX1NvdXJjZV9TZWxlY3RfTWFzaywgMCwgMCwgQ1JfSU5WRVJUKTsKIAlpZiAodG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9hcmcpCiAJCWVyciB8PSAtRUlOVkFMOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0zNjk0LDggKzM2OTUsNyBAQAogCQl1ZGVsYXkoKGRldnByaXYtPnNlcmlhbF9pbnRlcnZhbF9ucyArIDk5OSkgLyAxMDAwKTsKIAkJaWYgKC0tY291bnQgPCAwKSB7CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCSIlczogU1BJIHNlcmlhbCBJL08gZGlkbid0IGZpbmlzaCBpbiB0aW1lIVxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCQkJIlNQSSBzZXJpYWwgSS9PIGRpZG4ndCBmaW5pc2ggaW4gdGltZSFcbiIpOwogCQkJZXJyID0gLUVUSU1FOwogCQkJZ290byBFcnJvcjsKIAkJfQpAQCAtMzcwNSw3ICszNzA1LDcgQEAKIAkgICBESU9fU2VyaWFsX0lPX0luX1Byb2dyZXNzX1N0IGdvZXMgaGlnaCBvbmUgYml0IHRvbyBlYXJseS4gKi8KIAl1ZGVsYXkoKGRldnByaXYtPnNlcmlhbF9pbnRlcnZhbF9ucyArIDk5OSkgLyAxMDAwKTsKIAotCWlmIChkYXRhX2luICE9IE5VTEwpCisJaWYgKGRhdGFfaW4pCiAJCSpkYXRhX2luID0gbmlfc3RjX3JlYWR3KGRldiwgRElPX1NlcmlhbF9JbnB1dF9SZWdpc3Rlcik7CiAKIEVycm9yOgpAQCAtMzgxNyw4ICszODE3LDYgQEAKIAkJCSAgICAgIENsb2NrX2FuZF9GT1VUX1JlZ2lzdGVyKTsKIAkJcmV0dXJuIDE7CiAKLQkJYnJlYWs7Ci0KIAljYXNlIElOU05fQ09ORklHX0JJRElSRUNUSU9OQUxfREFUQToKIAogCQlpZiAoZGV2cHJpdi0+c2VyaWFsX2ludGVydmFsX25zID09IDApCkBAIC0zODMzLDggKzM4MzEsNyBAQAogCQkJZXJyID0gbmlfc2VyaWFsX3N3X3JlYWR3cml0ZTgoZGV2LCBzLCBieXRlX291dCwKIAkJCQkJCSAgICAgICZieXRlX2luKTsKIAkJfSBlbHNlIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlczogc2VyaWFsIGRpc2FibGVkIVxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAic2VyaWFsIGRpc2FibGVkIVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoZXJyIDwgMCkKQEAgLTM4NDYsNyArMzg0Myw2IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfYW9fNjd4eChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKQEAgLTQ1MjAsOCArNDUxNiw3IEBACiAJY2FzZSA5OgogCQlyZXR1cm4gTklfUEZJX09VVFBVVF9HX0dBVEUwOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkiJXM6IGJ1ZywgdW5oYW5kbGVkIGNhc2UgaW4gc3dpdGNoLlxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiYnVnLCB1bmhhbmRsZWQgY2FzZSBpbiBzd2l0Y2guXG4iKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtNDY3Myw3ICs0NjY4LDcgQEAKIAkJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoaSA9PSB0aW1lb3V0KSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlcyB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJ0aW1lb3V0XG4iKTsKIAkJcmV0dXJuIC1FVElNRTsKIAl9CiAJcmV0dXJuIDA7CkBAIC00OTA4LDcgKzQ5MDMsNyBAQAogCQkJCQkgICAgICAgJmRldnByaXYtPmNsb2NrX25zKTsKIAlpZiAocmV0dmFsIDwgMCkgewogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJIiVzOiBidWcsIGZhaWxlZCB0byBmaW5kIHBsbCBwYXJhbWV0ZXJzXG4iLCBfX2Z1bmNfXyk7CisJCQkiYnVnLCBmYWlsZWQgdG8gZmluZCBwbGwgcGFyYW1ldGVyc1xuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC00OTY2LDE0ICs0OTYxLDE0IEBACiAJCQkJCSAgICAgIFJUU0lfVHJpZ19EaXJlY3Rpb25fUmVnaXN0ZXIpOwogCQkJCWlmIChwZXJpb2RfbnMgPT0gMCkgewogCQkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAotCQkJCQkJIiVzOiB3ZSBkb24ndCBoYW5kbGUgYW4gdW5zcGVjaWZpZWQgY2xvY2sgcGVyaW9kIGNvcnJlY3RseSB5ZXQsIHJldHVybmluZyBlcnJvclxuIiwKLQkJCQkJCV9fZnVuY19fKTsKKwkJCQkJCSJ3ZSBkb24ndCBoYW5kbGUgYW4gdW5zcGVjaWZpZWQgY2xvY2sgcGVyaW9kIGNvcnJlY3RseSB5ZXQsIHJldHVybmluZyBlcnJvclxuIik7CiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCX0KIAkJCQlkZXZwcml2LT5jbG9ja19ucyA9IHBlcmlvZF9uczsKIAkJCQlkZXZwcml2LT5jbG9ja19zb3VyY2UgPSBzb3VyY2U7Ci0JCQl9IGVsc2UKKwkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CiAJCX0KIAl9CiAJcmV0dXJuIDM7CkBAIC01MDU3LDggKzUwNTIsNyBAQAogCX0gZWxzZSB7CiAJCWlmIChjaGFuID09IG9sZF9SVFNJX2Nsb2NrX2NoYW5uZWwpCiAJCQlyZXR1cm4gTklfUlRTSV9PVVRQVVRfUlRTSV9PU0M7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlczogYnVnISBzaG91bGQgbmV2ZXIgZ2V0IGhlcmU/XG4iLAotCQkJX19mdW5jX18pOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiYnVnISBzaG91bGQgbmV2ZXIgZ2V0IGhlcmU/XG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCmluZGV4IGRiMzk5ZmUuLmFjNzkwOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKQEAgLTUzLDkgKzUzLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAibWl0ZS5oIgogCiAvKiBkZWZpbmVzIGZvciB0aGUgUENJLURJTy0zMkhTICovCkBAIC0zMDQsNyArMzAzLDcgQEAKIAlkZXZwcml2LT5kaV9taXRlX2NoYW4gPQogCSAgICBtaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZShkZXZwcml2LT5taXRlLAogCQkJCQkgIGRldnByaXYtPmRpX21pdGVfcmluZywgMSwgMik7Ci0JaWYgKGRldnByaXYtPmRpX21pdGVfY2hhbiA9PSBOVUxMKSB7CisJaWYgKCFkZXZwcml2LT5kaV9taXRlX2NoYW4pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImZhaWxlZCB0byByZXNlcnZlIG1pdGUgZG1hIGNoYW5uZWxcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMzU0LDggKzM1Myw5IEBACiAJaWYgKGRldnByaXYtPmRpX21pdGVfY2hhbikgewogCQltaXRlX3ByZXBfZG1hKGRldnByaXYtPmRpX21pdGVfY2hhbiwgMzIsIDMyKTsKIAkJbWl0ZV9kbWFfYXJtKGRldnByaXYtPmRpX21pdGVfY2hhbik7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcmV0dmFsID0gLUVJTzsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXR2YWw7CkBAIC01NDcsMjEgKzU0NywyMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTU3MCwxMyArNTcwLDEzIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAjZGVmaW5lIE1BWF9TUEVFRAkoVElNRVJfQkFTRSkJLyogaW4gbmFub3NlY29uZHMgKi8KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUFYX1NQRUVEKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgTUFYX1NQRUVEKTsKIAkJLyogbm8gbWluaW11bSBzcGVlZCAqLwogCX0gZWxzZSB7CiAJCS8qIFRSSUdfRVhUICovCkBAIC01ODcsMTMgKzU4NywxNCBAQAogCQl9CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC02MDMsNyArNjA0LDcgQEAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCW5pX3BjaWRpb19uc190b190aW1lcigmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtOTI0LDcgKzkyNSw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlkZXZwcml2LT5kaV9taXRlX3JpbmcgPSBtaXRlX2FsbG9jX3JpbmcoZGV2cHJpdi0+bWl0ZSk7Ci0JaWYgKGRldnByaXYtPmRpX21pdGVfcmluZyA9PSBOVUxMKQorCWlmICghZGV2cHJpdi0+ZGlfbWl0ZV9yaW5nKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChib2FyZC0+dXNlc19maXJtd2FyZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCmluZGV4IDNiMmJkZWIuLjE0ODFmNzFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCkBAIC0xMDksNyArMTA5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCkBAIC0xMDQxLDcgKzEwNDEsNiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIG1fc2VyaWVzX2luaXRfZWVwcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBuaV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtMTE4MywxOSArMTE4MiwxOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJZGV2cHJpdi0+YWlfbWl0ZV9yaW5nID0gbWl0ZV9hbGxvY19yaW5nKGRldnByaXYtPm1pdGUpOwotCWlmIChkZXZwcml2LT5haV9taXRlX3JpbmcgPT0gTlVMTCkKKwlpZiAoIWRldnByaXYtPmFpX21pdGVfcmluZykKIAkJcmV0dXJuIC1FTk9NRU07CiAJZGV2cHJpdi0+YW9fbWl0ZV9yaW5nID0gbWl0ZV9hbGxvY19yaW5nKGRldnByaXYtPm1pdGUpOwotCWlmIChkZXZwcml2LT5hb19taXRlX3JpbmcgPT0gTlVMTCkKKwlpZiAoIWRldnByaXYtPmFvX21pdGVfcmluZykKIAkJcmV0dXJuIC1FTk9NRU07CiAJZGV2cHJpdi0+Y2RvX21pdGVfcmluZyA9IG1pdGVfYWxsb2NfcmluZyhkZXZwcml2LT5taXRlKTsKLQlpZiAoZGV2cHJpdi0+Y2RvX21pdGVfcmluZyA9PSBOVUxMKQorCWlmICghZGV2cHJpdi0+Y2RvX21pdGVfcmluZykKIAkJcmV0dXJuIC1FTk9NRU07CiAJZGV2cHJpdi0+Z3BjdF9taXRlX3JpbmdbMF0gPSBtaXRlX2FsbG9jX3JpbmcoZGV2cHJpdi0+bWl0ZSk7Ci0JaWYgKGRldnByaXYtPmdwY3RfbWl0ZV9yaW5nWzBdID09IE5VTEwpCisJaWYgKCFkZXZwcml2LT5ncGN0X21pdGVfcmluZ1swXSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZGV2cHJpdi0+Z3BjdF9taXRlX3JpbmdbMV0gPSBtaXRlX2FsbG9jX3JpbmcoZGV2cHJpdi0+bWl0ZSk7Ci0JaWYgKGRldnByaXYtPmdwY3RfbWl0ZV9yaW5nWzFdID09IE5VTEwpCisJaWYgKCFkZXZwcml2LT5ncGN0X21pdGVfcmluZ1sxXSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoZGV2cHJpdi0+aXNfbV9zZXJpZXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvY21kLmMKaW5kZXggZDM2YzNhYi4uOWIxMjRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpb2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYwpAQCAtNDQsNyArNDQsNiBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIm5pX3Rpb19pbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1pdGUuaCIKIApAQCAtMjAxLDcgKzIwMCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGNvdW50ZXItPm1pdGVfY2hhbiA9PSBOVUxMKSB7CisJaWYgKCFjb3VudGVyLT5taXRlX2NoYW4pIHsKIAkJZGV2X2Vycihjb3VudGVyLT5jb3VudGVyX2Rldi0+ZGV2LT5jbGFzc19kZXYsCiAJCQkiY29tbWFuZHMgb25seSBzdXBwb3J0ZWQgd2l0aCBETUEuICAiKTsKIAkJZGV2X2Vycihjb3VudGVyLT5jb3VudGVyX2Rldi0+ZGV2LT5jbGFzc19kZXYsCkBAIC0yMzQsMjMgKzIzMywyMyBAQAogCXNvdXJjZXMgPSBUUklHX05PVyB8IFRSSUdfSU5UIHwgVFJJR19PVEhFUjsKIAlpZiAobmlfdGlvX2NvdW50aW5nX21vZGVfcmVnaXN0ZXJzX3ByZXNlbnQoY291bnRlci0+Y291bnRlcl9kZXYpKQogCQlzb3VyY2VzIHw9IFRSSUdfRVhUOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBzb3VyY2VzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgc291cmNlcyk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfRk9MTE9XIHwgVFJJR19FWFQgfCBUUklHX09USEVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCiAJCQkJCVRSSUdfTk9XIHwgVFJJR19FWFQgfCBUUklHX09USEVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0yNjYsNyArMjY1LDcgQEAKIAljYXNlIFRSSUdfTk9XOgogCWNhc2UgVFJJR19JTlQ6CiAJY2FzZSBUUklHX09USEVSOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0VYVDoKIAkJLyogc3RhcnRfYXJnIGlzIHRoZSBzdGFydF90cmlnZ2VyIHBhc3NlZCB0byBuaV90aW9fYXJtKCkgKi8KQEAgLTI3NCwxMyArMjczLDE0IEBACiAJfQogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfRVhUKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTMyOSw3ICszMjksNyBAQAogCWNhc2UgbmlfZ3BjdF92YXJpYW50X2Vfc2VyaWVzOgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogCQl7Ci0JCQlpZiAoY291bnRlci0+bWl0ZV9jaGFuID09IE5VTEwgfHwKKwkJCWlmICghY291bnRlci0+bWl0ZV9jaGFuIHx8CiAJCQkgICAgY291bnRlci0+bWl0ZV9jaGFuLT5kaXIgIT0gQ09NRURJX0lOUFVUIHx8CiAJCQkgICAgKG1pdGVfZG9uZShjb3VudGVyLT5taXRlX2NoYW4pKSkgewogCQkJCXJldHZhbCA9IDE7CkBAIC0zNjYsNyArMzY2LDcgQEAKIAlpZiAoZ3h4X3N0YXR1cyAmIEdJX0dBVEVfRVJST1IoY2lkeCkpIHsKIAkJYWNrIHw9IEdJX0dBVEVfRVJST1JfQ09ORklSTShjaWR4KTsKIAkJaWYgKGdhdGVfZXJyb3IpIHsKLQkJCS8qNjYweCBkb24ndCBzdXBwb3J0IGF1dG9tYXRpYyBhY2tub3dsZWRnZW1lbnQKKwkJCS8qNjYweCBkb24ndCBzdXBwb3J0IGF1dG9tYXRpYyBhY2tub3dsZWRnbWVudAogCQkJICBvZiBnYXRlIGludGVycnVwdCB2aWEgZG1hIHJlYWQvd3JpdGUKIAkJCSAgIGFuZCByZXBvcnQgYm9ndXMgZ2F0ZSBlcnJvcnMgKi8KIAkJCWlmIChjb3VudGVyLT5jb3VudGVyX2Rldi0+dmFyaWFudCAhPQpAQCAtNDQzLDcgKzQ0Myw3IEBACiAJCWJyZWFrOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwotCWlmIChjb3VudGVyLT5taXRlX2NoYW4gPT0gTlVMTCkgeworCWlmICghY291bnRlci0+bWl0ZV9jaGFuKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYwppbmRleCBjYjdlNGMzLi5jZmMzYTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCkBAIC00MSw4ICs0MSw3IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAvKgogICogSS9PIHBvcnQgcmVnaXN0ZXIgbWFwCkBAIC0xNTMsMTEgKzE1Miw2IEBACiAJfSwKIH07CiAKLXN0cnVjdCBwY2w3MTFfcHJpdmF0ZSB7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsKLX07Ci0KIHN0YXRpYyB2b2lkIHBjbDcxMV9haV9zZXRfbW9kZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbW9kZSkKIHsKIAkvKgpAQCAtMjg3LDI2ICsyODEsMjQgQEAKIHN0YXRpYyBpbnQgcGNsNzExX2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHBjbDcxMV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0zMTUsMjMgKzMwNywyNCBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAl9IGVsc2UgewogI2RlZmluZSBNQVhfU1BFRUQgMTAwMAotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBNQVhfU1BFRUQpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBNQVhfU1BFRUQpOwogCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMzM5LDEyICszMzIsMTAgQEAKIAkvKiBzdGVwIDQgKi8KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8yTUhaLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCXVuc2lnbmVkIGludCBhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOworCisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKQEAgLTM1MywxOCArMzQ0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGNsNzExX2FpX2xvYWRfY291bnRlcnMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNsNzExX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfVElNRVJfQkFTRTsKLQotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0KLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOwotfQotCiBzdGF0aWMgaW50IHBjbDcxMV9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOwpAQCAtMzcyLDcgKzM1MSw4IEBACiAJcGNsNzExX3NldF9jaGFuZ2FpbihkZXYsIHMsIGNtZC0+Y2hhbmxpc3RbMF0pOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQlwY2w3MTFfYWlfbG9hZF9jb3VudGVycyhkZXYpOworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAkJb3V0YihQQ0w3MTFfSU5UX1NUQVRfQ0xSLCBkZXYtPmlvYmFzZSArIFBDTDcxMV9JTlRfU1RBVF9SRUcpOwogCQlwY2w3MTFfYWlfc2V0X21vZGUoZGV2LCBQQ0w3MTFfTU9ERV9QQUNFUl9JUlEpOwogCX0gZWxzZSB7CkBAIC00NDUsMTQgKzQyNSw5IEBACiBzdGF0aWMgaW50IHBjbDcxMV9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewogCWNvbnN0IHN0cnVjdCBwY2w3MTFfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IHBjbDcxMV9wcml2YXRlICpkZXZwcml2OwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwogCWludCByZXQ7CiAKLQlkZXZwcml2ID0gY29tZWRpX2FsbG9jX2RldnByaXYoZGV2LCBzaXplb2YoKmRldnByaXYpKTsKLQlpZiAoIWRldnByaXYpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcmV0ID0gY29tZWRpX3JlcXVlc3RfcmVnaW9uKGRldiwgaXQtPm9wdGlvbnNbMF0sIDB4MTApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC00NjQsNiArNDM5LDExIEBACiAJCQlkZXYtPmlycSA9IGl0LT5vcHRpb25zWzFdOwogCX0KIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgUENMNzExX1RJTUVSX0JBU0UsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMk1IWiwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jCmluZGV4IDQwNzk4MTUuLjI1Njg1MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMKQEAgLTYyLDggKzYyLDYgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0KICNkZWZpbmUgUENMNzI2X0FPX01TQl9SRUcoeCkJKDB4MDAgKyAoKHgpICogMikpCiAjZGVmaW5lIFBDTDcyNl9BT19MU0JfUkVHKHgpCSgweDAxICsgKCh4KSAqIDIpKQogI2RlZmluZSBQQ0w3MjZfRE9fTVNCX1JFRwkweDBjCkBAIC0xNzMsMTEgKzE3MSwxMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwpAQCAtMTg3LDExICsxODUsMTIgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKaW5kZXggM2ZmYjFlYS4uMDNhM2ZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYwpAQCAtMTE3LDggKzExNyw3IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJjb21lZGlfaXNhZG1hLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qIGhhcmR3YXJlIHR5cGVzIG9mIHRoZSBjYXJkcyAqLwogI2RlZmluZSBib2FyZFBDTDgxMlBHCSAgICAgIDAJLyogYW5kIEFDTC04MTEyUEcgKi8KQEAgLTUxMyw4ICs1MTIsNiBAQAogCXVuc2lnbmVkIGNoYXIgbW9kZV9yZWdfaW50OwkvKiAgdGhlcmUgaXMgc3RvcmVkIElOVCBudW1iZXIgZm9yIHNvbWUgY2FyZCAqLwogCXVuc2lnbmVkIGludCBhaV9wb2xsX3B0cjsJLyogIGhvdyBtYW55IHNhbXBlcyB0cmFuc2ZlciBwb2xsICovCiAJdW5zaWduZWQgaW50IG1heF84MTJfYWlfbW9kZTBfcmFuZ2V3YWl0OwkvKiAgc2V0bGluZyB0aW1lIGZvciBnYWluICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsKIAl1bnNpZ25lZCBpbnQgdXNlX2RpZmY6MTsKIAl1bnNpZ25lZCBpbnQgdXNlX21wYzUwODoxOwogCXVuc2lnbmVkIGludCB1c2VfZXh0X3RyZzoxOwpAQCAtNTIyLDIxICs1MTksNiBAQAogCXVuc2lnbmVkIGludCBhaV9lb3M6MTsKIH07CiAKLXN0YXRpYyB2b2lkIHBjbDgxMl9zdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBib29sIGxvYWRfdGltZXJzKQotewotCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxMl9USU1FUl9CQVNFOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQl1ZGVsYXkoMSk7Ci0KLQlpZiAobG9hZF90aW1lcnMpIHsKLQkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOwotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBwY2w4MTJfYWlfc2V0dXBfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJdW5zaWduZWQgaW50IHVucmVhZF9zYW1wbGVzKQpAQCAtNjUwLDI4ICs2MzIsMjcgQEAKIAlzdHJ1Y3QgcGNsODEyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgaW50IGZsYWdzOwotCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKIAogCWlmIChkZXZwcml2LT51c2VfZXh0X3RyZykKIAkJZmxhZ3MgPSBUUklHX0VYVDsKIAllbHNlCiAJCWZsYWdzID0gVFJJR19USU1FUjsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBmbGFncyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgZmxhZ3MpOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTY4MCwyMiArNjYxLDI0IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgYm9hcmQtPmFpX25zX21pbik7Ci0JZWxzZQkvKiBUUklHX0VYVCAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIGJvYXJkLT5haV9uc19taW4pOworCX0gZWxzZSB7CS8qIFRSSUdfRVhUICovCisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTcwMywxMiArNjg2LDEwIEBACiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzJNSFosCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJdW5zaWduZWQgaW50IGFyZyA9IGNtZC0+Y29udmVydF9hcmc7CisKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtNzI1LDggKzcwNiw2IEBACiAJdW5zaWduZWQgaW50IGN0cmwgPSAwOwogCXVuc2lnbmVkIGludCBpOwogCi0JcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwotCiAJcGNsODEyX2FpX3NldF9jaGFuX3JhbmdlKGRldiwgY21kLT5jaGFubGlzdFswXSwgMSk7CiAKIAlpZiAoZG1hKSB7CS8qICBjaGVjayBpZiB3ZSBjYW4gdXNlIERNQSB0cmFuc2ZlciAqLwpAQCAtNzYwLDcgKzczOSw4IEBACiAKIAlzd2l0Y2ggKGNtZC0+Y29udmVydF9zcmMpIHsKIAljYXNlIFRSSUdfVElNRVI6Ci0JCXBjbDgxMl9zdGFydF9wYWNlcihkZXYsIHRydWUpOworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC05MTgsNyArODk4LDcgQEAKIAogCW91dGIoZGV2cHJpdi0+bW9kZV9yZWdfaW50IHwgUENMODEyX0NUUkxfRElTQUJMRV9UUklHLAogCSAgICAgZGV2LT5pb2Jhc2UgKyBQQ0w4MTJfQ1RSTF9SRUcpOwotCXBjbDgxMl9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKKwljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgZmFsc2UpOwogCXBjbDgxMl9haV9jbGVhcl9lb2MoZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMTAsMTAgKzk5MCw2IEBACiAJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJMX1JFRyk7CiAJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOwogCi0JLyogc3RvcCBwYWNlciAqLwotCWlmIChib2FyZC0+SVJRYml0cykKLQkJcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwotCiAJLyoKIAkgKiBJbnZhbGlkYXRlIGxhc3RfYWlfY2hhbnNwZWMgdGhlbiBzZXQgYW5hbG9nIGlucHV0IHRvCiAJICoga25vd24gY2hhbm5lbC9yYW5nZS4KQEAgLTExNjIsMTEgKzExMzgsMTkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKCgxIDw8IGl0LT5vcHRpb25zWzFdKSAmIGJvYXJkLT5JUlFiaXRzKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5vcHRpb25zWzFdLCBwY2w4MTJfaW50ZXJydXB0LCAwLAotCQkJCSAgZGV2LT5ib2FyZF9uYW1lLCBkZXYpOwotCQlpZiAocmV0ID09IDApCi0JCQlkZXYtPmlycSA9IGl0LT5vcHRpb25zWzFdOworCWlmIChib2FyZC0+SVJRYml0cykgeworCQlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIFBDTDgxMl9USU1FUl9CQVNFLAorCQkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8yTUhaLAorCQkJCQkgICAgICBJODI1NF9JTzgsIDApOworCQlpZiAoIWRldi0+cGFjZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoKDEgPDwgaXQtPm9wdGlvbnNbMV0pICYgYm9hcmQtPklSUWJpdHMpIHsKKwkJCXJldCA9IHJlcXVlc3RfaXJxKGl0LT5vcHRpb25zWzFdLCBwY2w4MTJfaW50ZXJydXB0LCAwLAorCQkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlkZXYtPmlycSA9IGl0LT5vcHRpb25zWzFdOworCQl9CiAJfQogCiAJLyogd2UgbmVlZCBhbiBJUlEgdG8gZG8gRE1BIG9uIGNoYW5uZWwgMyBvciAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKaW5kZXggZGEzNWVkZi4uMWNjYjJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwpAQCAtNDEsOCArNDEsNyBAQAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiY29tZWRpX2lzYWRtYS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAvKgogICogUmVnaXN0ZXIgSS9PIG1hcApAQCAtMTE2LDMxICsxMTUsMTAgQEAKIHN0cnVjdCBwY2w4MTZfcHJpdmF0ZSB7CiAJc3RydWN0IGNvbWVkaV9pc2FkbWEgKmRtYTsKIAl1bnNpZ25lZCBpbnQgYWlfcG9sbF9wdHI7CS8qICBob3cgbWFueSBzYW1wZXMgdHJhbnNmZXIgcG9sbCAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yMTsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CiAJdW5zaWduZWQgaW50IGFpX2NtZF9ydW5uaW5nOjE7CiAJdW5zaWduZWQgaW50IGFpX2NtZF9jYW5jZWxlZDoxOwogfTsKIAotc3RhdGljIHZvaWQgcGNsODE2X3N0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZF9jb3VudGVycykKLXsKLQlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfVElNRVJfQkFTRTsKLQotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDAsIEk4MjU0X01PREUxIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAwLCAweDAwZmYpOwotCXVkZWxheSgxKTsKLQotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JdWRlbGF5KDEpOwotCi0JaWYgKGxvYWRfY291bnRlcnMpIHsKLQkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOwotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBwY2w4MTZfYWlfc2V0dXBfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJdW5zaWduZWQgaW50IHVucmVhZF9zYW1wbGVzKQpAQCAtMzY3LDY3ICszNDUsNjIgQEAKIHN0YXRpYyBpbnQgcGNsODE2X2FpX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHBjbDgxNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0VYVCB8IFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCQkJCQlUUklHX0VYVCB8IFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDI7CiAKLQogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTAwMDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTAwMDApOwogCWVsc2UJLyogVFJJR19FWFQgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CiAKLQogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMTBNSFosCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJdW5zaWduZWQgaW50IGFyZyA9IGNtZC0+Y29udmVydF9hcmc7CisKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gNDsKIAotCiAJLyogc3RlcCA1OiBjb21wbGFpbiBhYm91dCBzcGVjaWFsIGNoYW5saXN0IGNvbnNpZGVyYXRpb25zICovCiAKIAlpZiAoY21kLT5jaGFubGlzdCkgewpAQCAtNDUwLDggKzQyMyw2IEBACiAJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcGNsODE2X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwotCiAJc2VnbGVuID0gY2hlY2tfY2hhbm5lbF9saXN0KGRldiwgcywgY21kLT5jaGFubGlzdCwgY21kLT5jaGFubGlzdF9sZW4pOwogCWlmIChzZWdsZW4gPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ2Niw3ICs0MzcsMTEgQEAKIAlkbWEtPmN1cl9kbWEgPSAwOwogCXBjbDgxNl9haV9zZXR1cF9kbWEoZGV2LCBzLCAwKTsKIAotCXBjbDgxNl9zdGFydF9wYWNlcihkZXYsIHRydWUpOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDAsIEk4MjU0X01PREUxIHwgSTgyNTRfQklOQVJZKTsKKwljb21lZGlfODI1NF93cml0ZShkZXYtPnBhY2VyLCAwLCAweDBmZik7CisJdWRlbGF5KDEpOworCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgdHJ1ZSk7CiAKIAljdHJsID0gUENMODE2X0NUUkxfSU5URU4gfCBQQ0w4MTZfQ1RSTF9ETUFFTiB8IFBDTDgxNl9DVFJMX0RNQVNSQ19TTE9UMDsKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQpAQCAtNTI1LDExICs1MDAsNyBAQAogCW91dGIoUENMODE2X0NUUkxfRElTQUJMRV9UUklHLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9DVFJMX1JFRyk7CiAJcGNsODE2X2FpX2NsZWFyX2VvYyhkZXYpOwogCi0JLyogU3RvcCBwYWNlciAqLwotCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENMODE2X1RJTUVSX0JBU0UsIDAsCi0JCQkyLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfVElNRVJfQkFTRSwgMCwKLQkJCTEsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKKwljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgZmFsc2UpOwogCiAJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOwogCWRldnByaXYtPmFpX2NtZF9jYW5jZWxlZCA9IDE7CkBAIC01OTYsMTcgKzU2NywxMCBAQAogCiBzdGF0aWMgdm9pZCBwY2w4MTZfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFOwotCiAJb3V0YihQQ0w4MTZfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKIAlwY2w4MTZfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCAwLCAwKTsKIAlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CiAKLQkvKiBTdG9wIHBhY2VyICovCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0KIAkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENMODE2X0RPX0RJX0xTQl9SRUcpOwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTVNCX1JFRyk7CkBAIC02NjIsNiArNjI2LDExIEBACiAJLyogYW4gSVJRIGFuZCBETUEgYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgYXN5bmMgY29tbWFuZHMgKi8KIAlwY2w4MTZfYWxsb2NfaXJxX2FuZF9kbWEoZGV2LCBpdCk7CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFLAorCQkJCSAgICAgIEk4MjU0X09TQ19CQVNFXzEwTUhaLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKaW5kZXggN2U0Y2RlYS4uZTFiZGRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYwpAQCAtMTAwLDggKzEwMCw3IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJjb21lZGlfaXNhZG1hLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qIGJvYXJkcyBjb25zdGFudHMgKi8KIApAQCAtMjk5LDMzICsyOTgsMTUgQEAKIAlzdHJ1Y3QgY29tZWRpX2lzYWRtYSAqZG1hOwogCS8qICBtYW5pbWFsIGFsbG93ZWQgZGVsYXkgYmV0d2VlbiBzYW1wbGVzIChpbiB1cykgZm9yIGFjdHVhbCBjYXJkICovCiAJdW5zaWduZWQgaW50IG5zX21pbjsKLQlpbnQgaTgyNTNfb3NjX2Jhc2U7CS8qICAxL2ZyZXF1ZW5jeSBvZiBvbiBib2FyZCBvc2NpbGF0b3IgaW4gbnMgKi8KIAkvKiAgTVVYIHNldHRpbmcgZm9yIGFjdHVhbCBBSSBvcGVyYXRpb25zICovCiAJdW5zaWduZWQgaW50IGFjdF9jaGFubGlzdFsxNl07CiAJdW5zaWduZWQgaW50IGFjdF9jaGFubGlzdF9sZW47CS8qICBob3cgbG9uZyBpcyBhY3R1YWwgTVVYIGxpc3QgKi8KIAl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0X3BvczsJLyogIGFjdHVhbCBwb3NpdGlvbiBpbiBNVVggbGlzdCAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yMTsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CiAJdW5zaWduZWQgaW50IHVzZWZpZm86MTsKIAl1bnNpZ25lZCBpbnQgYWlfY21kX3J1bm5pbmc6MTsKIAl1bnNpZ25lZCBpbnQgYWlfY21kX2NhbmNlbGVkOjE7CiB9OwogCi1zdGF0aWMgdm9pZCBwY2w4MThfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgYm9vbCBsb2FkX2NvdW50ZXJzKQotewotCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxOF9USU1FUl9CQVNFOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQl1ZGVsYXkoMSk7Ci0KLQlpZiAobG9hZF9jb3VudGVycykgewotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7Ci0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHBjbDgxOF9haV9zZXR1cF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQl1bnNpZ25lZCBpbnQgdW5yZWFkX3NhbXBsZXMpCkBAIC02NjMsMjUgKzY0NCwyNCBAQAogCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC02OTAsMjEgKzY3MCwyMyBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIGJvYXJkLT5uc19taW4pOwotCWVsc2UJLyogVFJJR19FWFQgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBib2FyZC0+bnNfbWluKTsKKwl9IGVsc2UgewkvKiBUUklHX0VYVCAqLworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTcxMiwxMiArNjk0LDEwIEBACiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmk4MjUzX29zY19iYXNlLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCXVuc2lnbmVkIGludCBhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOworCisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKQEAgLTc0Niw4ICs3MjYsNiBAQAogCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZykKIAkJcmV0dXJuIC1FQlVTWTsKIAotCXBjbDgxOF9zdGFydF9wYWNlcihkZXYsIGZhbHNlKTsKLQogCXNlZ2xlbiA9IGNoZWNrX2NoYW5uZWxfbGlzdChkZXYsIHMsIGNtZC0+Y2hhbmxpc3QsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAlpZiAoc2VnbGVuIDwgMSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NzksOCArNzU3LDEwIEBACiAJfQogCW91dGIoY3RybCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ1RSTF9SRUcpOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJcGNsODE4X3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgxMiw3ICs3OTIsNyBAQAogCX0KIAogCW91dGIoUENMODE4X0NUUkxfRElTQUJMRV9UUklHLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJMX1JFRyk7Ci0JcGNsODE4X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOworCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCBmYWxzZSk7CiAJcGNsODE4X2FpX2NsZWFyX2VvYyhkZXYpOwogCiAJaWYgKGRldnByaXYtPnVzZWZpZm8pIHsJLyogIEZJRk8gc2h1dGRvd24gKi8KQEAgLTkwNiw3ICs4ODYsNiBAQAogc3RhdGljIHZvaWQgcGNsODE4X3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxOF9USU1FUl9CQVNFOwogCXVuc2lnbmVkIGludCBjaGFuOwogCiAJLyogZmx1c2ggYW5kIGRpc2FibGUgdGhlIEZJRk8gKi8KQEAgLTkyNCw5ICs5MDMsNiBAQAogCiAJLyogc3RvcCBwYWNlciAqLwogCW91dGIoUENMODE4X0NOVEVOQUJMRV9QQUNFUl9FTkEsIGRldi0+aW9iYXNlICsgUENMODE4X0NOVEVOQUJMRV9SRUcpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCiAJLyogc2V0IGFuYWxvZyBvdXRwdXQgY2hhbm5lbHMgdG8gMFYgKi8KIAlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgYm9hcmQtPm5fYW9jaGFuOyBjaGFuKyspIHsKQEAgLTEwMTYsNiArOTkyLDcgQEAKIAljb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkICpib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwogCXN0cnVjdCBwY2w4MThfcHJpdmF0ZSAqZGV2cHJpdjsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKKwl1bnNpZ25lZCBpbnQgb3NjX2Jhc2U7CiAJaW50IHJldDsKIAogCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwpAQCAtMTA0Myw2ICsxMDIwLDI1IEBACiAJaWYgKGRldi0+aXJxICYmIGJvYXJkLT5oYXNfZG1hKQogCQlwY2w4MThfYWxsb2NfZG1hKGRldiwgaXQtPm9wdGlvbnNbMl0pOwogCisJLyogdXNlIDFNSHogb3IgMTBNSHogb3NjaWxhdG9yICovCisJaWYgKChpdC0+b3B0aW9uc1szXSA9PSAwKSB8fCAoaXQtPm9wdGlvbnNbM10gPT0gMTApKQorCQlvc2NfYmFzZSA9IEk4MjU0X09TQ19CQVNFXzEwTUhaOworCWVsc2UKKwkJb3NjX2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xTUhaOworCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBQQ0w4MThfVElNRVJfQkFTRSwKKwkJCQkgICAgICBvc2NfYmFzZSwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbWF4IHNhbXBsaW5nIHNwZWVkICovCisJZGV2cHJpdi0+bnNfbWluID0gYm9hcmQtPm5zX21pbjsKKwlpZiAoIWJvYXJkLT5pc184MTgpIHsKKwkJLyogZXh0ZW5kZWQgUENMNzE4IHRvIDEwMGtIeiBEQUMgKi8KKwkJaWYgKChpdC0+b3B0aW9uc1s2XSA9PSAxKSB8fCAoaXQtPm9wdGlvbnNbNl0gPT0gMTAwKSkKKwkJCWRldnByaXYtPm5zX21pbiA9IDEwMDAwOworCX0KKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTExMTcsMjIgKzExMTMsNiBAQAogCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CiAJcy0+aW5zbl9iaXRzCT0gcGNsODE4X2RvX2luc25fYml0czsKIAotCS8qIHNlbGVjdCAxLzEwTUh6IG9zY2lsYXRvciAqLwotCWlmICgoaXQtPm9wdGlvbnNbM10gPT0gMCkgfHwgKGl0LT5vcHRpb25zWzNdID09IDEwKSkKLQkJZGV2cHJpdi0+aTgyNTNfb3NjX2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xME1IWjsKLQllbHNlCi0JCWRldnByaXYtPmk4MjUzX29zY19iYXNlID0gSTgyNTRfT1NDX0JBU0VfMU1IWjsKLQotCS8qIG1heCBzYW1wbGluZyBzcGVlZCAqLwotCWRldnByaXYtPm5zX21pbiA9IGJvYXJkLT5uc19taW47Ci0KLQlpZiAoIWJvYXJkLT5pc184MTgpIHsKLQkJaWYgKChpdC0+b3B0aW9uc1s2XSA9PSAxKSB8fCAoaXQtPm9wdGlvbnNbNl0gPT0gMTAwKSkgewotCQkJLyogZXh0ZW5kZWQgUENMNzE4IHRvIDEwMGtIeiBEQUMgKi8KLQkJCWRldnByaXYtPm5zX21pbiA9IDEwMDAwOwotCQl9Ci0JfQotCiAJcGNsODE4X3Jlc2V0KGRldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwppbmRleCAyYzBlN2VjLi4xMDQ3MmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCkBAIC03OCw4ICs3OCw2IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotCiAvKgogICogUmVnaXN0ZXIgSS9PIG1hcAogICovCkBAIC00ODMsMTkgKzQ4MSwxOSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTUwNCwxNSArNTAyLDE2IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbXVpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbXVpby5jCmluZGV4IGExNjQxZDkuLjdlYTgxMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY211aW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtdWlvLmMKQEAgLTc3LDggKzc3LDYgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0KIC8qCiAgKiBSZWdpc3RlciBJL08gbWFwCiAgKgpAQCAtNDg2LDE5ICs0ODQsMTkgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC01MDcsMTUgKzUwNSwxNiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTU2OCw3ICs1NjcsNyBAQAogCQl9IGVsc2UgaWYgKGl0LT5vcHRpb25zWzJdKSB7CiAJCQkvKiByZXF1ZXN0IHRoZSBpcnEgZm9yIHRoZSAybmQgYXNpYyAqLwogCQkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMl0sIHBjbXVpb19pbnRlcnJ1cHQsIDAsCi0JCQkJCWRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKKwkJCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7CiAJCQlpZiAocmV0ID09IDApCiAJCQkJZGV2cHJpdi0+aXJxMiA9IGl0LT5vcHRpb25zWzJdOwogCQl9CkBAIC01ODgsNyArNTg3LDcgQEAKIAkJcy0+aW5zbl9iaXRzCT0gcGNtdWlvX2Rpb19pbnNuX2JpdHM7CiAJCXMtPmluc25fY29uZmlnCT0gcGNtdWlvX2Rpb19pbnNuX2NvbmZpZzsKIAotCQkvKiBzdWJkZXZpY2VzIDAgYW5kIDIgY2FuIHN1cHBwb3J0IGludGVycnVwdHMgKi8KKwkJLyogc3ViZGV2aWNlcyAwIGFuZCAyIGNhbiBzdXBwb3J0IGludGVycnVwdHMgKi8KIAkJaWYgKChpID09IDAgJiYgZGV2LT5pcnEpIHx8IChpID09IDIgJiYgZGV2cHJpdi0+aXJxMikpIHsKIAkJCS8qIHNldHVwIHRoZSBpbnRlcnJ1cHQgc3ViZGV2aWNlICovCiAJCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYwppbmRleCA4Mzg3ZmQwLi4xNTJjYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCkBAIC01Miw3ICs1Miw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogCiAjaW5jbHVkZSAiLi4vY29tZWRpX3BjbWNpYS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCiBzdHJ1Y3QgZGFxcF9wcml2YXRlIHsKIAlpbnQgc3RvcDsKQEAgLTMxNSw3ICszMTQsNiBAQAogCWRldnByaXYtPmludGVycnVwdF9tb2RlID0gc2VtYXBob3JlOwogCiAJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgewotCiAJCS8qIFN0YXJ0IGNvbnZlcnNpb24gKi8KIAkJb3V0YihEQVFQX0NPTU1BTkRfQVJNIHwgREFRUF9DT01NQU5EX0ZJRk9fREFUQSwKIAkJICAgICBkZXYtPmlvYmFzZSArIERBUVBfQ09NTUFORCk7CkBAIC0zNjYsMjIgKzM2NCwyMiBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19USU1FUiB8IFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMzkwLDEzICszODgsMTQgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKICNkZWZpbmUgTUFYX1NQRUVECTEwMDAwCS8qIDEwMCBrSHogLSBpbiBuYW5vc2Vjb25kcyAqLwogCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUFYX1NQRUVEKTsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIE1BWF9TUEVFRCk7CisJfQogCiAJLyogSWYgYm90aCBzY2FuX2JlZ2luIGFuZCBjb252ZXJ0IGFyZSBib3RoIHRpbWVyIHZhbHVlcywgdGhlIG9ubHkKIAkgKiB3YXkgdGhhdCBjYW4gbWFrZSBzZW5zZSBpcyBpZiB0aGUgc2NhbiB0aW1lIGlzIHRoZSBudW1iZXIgb2YKQEAgLTQwOCwxNSArNDA3LDE4IEBACiAJCWVyciB8PSAtRUlOVkFMOwogCX0KIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCBNQVhfU1BFRUQpOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgTUFYX1NQRUVEKTsKKwl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgMHgwMGZmZmZmZik7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0b3BfYXJnLCAweDAwZmZmZmZmKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTQyNiwxMyArNDI4LDEzIEBACiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCQlkYXFwX25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKIAkJZGFxcF9uc190b190aW1lcigmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCmluZGV4IGM5NGFkMTIuLjRjMTNmNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKQEAgLTk0LDEzICs5NCwxMSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAicGx4OTA4MC5oIgogCiAvKgpAQCAtNTc5LDcgKzU3Nyw3IEBACiAKIAkJLyogcmVhZCBkYXRhICovCiAJCWQgPSByZWFkdyhkZXZwcml2LT5sYXMxICsgTEFTMV9BRENfRklGTyk7Ci0JCWQgPSBkID4+IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLworCQlkID4+PSAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KIAogCQkvKiBjb252ZXJ0IGJpcG9sYXIgZGF0YSB0byBjb21lZGkgdW5zaWduZWQgZGF0YSAqLwogCQlpZiAoY29tZWRpX3JhbmdlX2lzX2JpcG9sYXIocywgcmFuZ2UpKQpAQCAtNjE2LDcgKzYxNCw3IEBACiAJCX0KIAogCQlkID0gcmVhZHcoZGV2cHJpdi0+bGFzMSArIExBUzFfQURDX0ZJRk8pOwotCQlkID0gZCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJZCA+Pj0gMzsJLyogbG93IDMgYml0cyBhcmUgbWFya2VyIGxpbmVzICovCiAKIAkJLyogY29udmVydCBiaXBvbGFyIGRhdGEgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KIAkJaWYgKGNvbWVkaV9yYW5nZV9pc19iaXBvbGFyKHMsIHJhbmdlKSkKQEAgLTczNCwyMSArNzMyLDIyIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC03NTcsMzIgKzc1NiwzMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJLyogTm90ZTogdGhlc2UgYXJlIHRpbWUgcGVyaW9kcywgbm90IGFjdHVhbCByYXRlcyAqLwogCQlpZiAoMSA9PSBjbWQtPmNoYW5saXN0X2xlbikgewkvKiBubyBzY2FubmluZyAqLwotCQkJaWYgKGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgICAgICBSVERfTUFYX1NQRUVEXzEpKSB7CisJCQlpZiAoY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgUlREX01BWF9TUEVFRF8xKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCQkJCUNNREZfUk9VTkRfVVApOwogCQkJCWVyciB8PSAtRUlOVkFMOwogCQkJfQotCQkJaWYgKGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgICAgICBSVERfTUlOX1NQRUVEXzEpKSB7CisJCQlpZiAoY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgUlREX01JTl9TUEVFRF8xKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCQkJCUNNREZfUk9VTkRfRE9XTik7CiAJCQkJZXJyIHw9IC1FSU5WQUw7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSAgICAgIFJURF9NQVhfU1BFRUQpKSB7CisJCQlpZiAoY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgUlREX01BWF9TUEVFRCkpIHsKIAkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCiAJCQkJCQlDTURGX1JPVU5EX1VQKTsKIAkJCQllcnIgfD0gLUVJTlZBTDsKIAkJCX0KLQkJCWlmIChjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJICAgICAgUlREX01JTl9TUEVFRCkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSBSVERfTUlOX1NQRUVEKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCQkJCUNNREZfUk9VTkRfRE9XTik7CiAJCQkJZXJyIHw9IC1FSU5WQUw7CkBAIC03OTIsMzIgKzc5MSwzMiBAQAogCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCiAJCS8qIHNob3VsZCBiZSBsZXZlbC9lZGdlLCBoaS9sbyBzcGVjaWZpY2F0aW9uIGhlcmUgKi8KIAkJLyogc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgZXh0ZXJuYWwgdHJpZ2dlcnMgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDkpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgOSk7CiAJfQogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlpZiAoMSA9PSBjbWQtPmNoYW5saXN0X2xlbikgewkvKiBubyBzY2FubmluZyAqLwotCQkJaWYgKGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgICAgICBSVERfTUFYX1NQRUVEXzEpKSB7CisJCQlpZiAoY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCQkgUlREX01BWF9TUEVFRF8xKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKIAkJCQkJCUNNREZfUk9VTkRfVVApOwogCQkJCWVyciB8PSAtRUlOVkFMOwogCQkJfQotCQkJaWYgKGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgICAgICBSVERfTUlOX1NQRUVEXzEpKSB7CisJCQlpZiAoY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCQkgUlREX01JTl9TUEVFRF8xKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKIAkJCQkJCUNNREZfUk9VTkRfRE9XTik7CiAJCQkJZXJyIHw9IC1FSU5WQUw7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSAgICAgIFJURF9NQVhfU1BFRUQpKSB7CisJCQlpZiAoY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCQkgUlREX01BWF9TUEVFRCkpIHsKIAkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCiAJCQkJCQlDTURGX1JPVU5EX1VQKTsKIAkJCQllcnIgfD0gLUVJTlZBTDsKIAkJCX0KLQkJCWlmIChjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJICAgICAgUlREX01JTl9TUEVFRCkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSBSVERfTUlOX1NQRUVEKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKIAkJCQkJCUNNREZfUk9VTkRfRE9XTik7CiAJCQkJZXJyIHw9IC1FSU5WQUw7CkBAIC04MjYsMzcgKzgyNSwzOCBAQAogCX0gZWxzZSB7CiAJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KIAkJLyogc2VlIGFib3ZlICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCA5KTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsIDkpOwogCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwogCi0KIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCXJ0ZF9uc190b190aW1lcigmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7CiAJCXJ0ZF9uc190b190aW1lcigmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7Ci0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCQkgYXJnKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgYXJnKTsKIAkJfQogCX0KIApAQCAtMTE4MSw4ICsxMTgxLDggQEAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmcGNpX2xhdGVuY3kpOwogCWlmIChwY2lfbGF0ZW5jeSA8IDMyKSB7CiAJCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LAotCQkJIlBDSSBsYXRlbmN5IGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKLQkJCXBjaV9sYXRlbmN5LCAzMik7CisJCQkgIlBDSSBsYXRlbmN5IGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCSBwY2lfbGF0ZW5jeSwgMzIpOwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMzIpOwogCX0KIH0KQEAgLTEyOTksMTIgKzEyOTksOCBAQAogCQkvKiBTaHV0IGRvd24gYW55IGJvYXJkIG9wcyBieSByZXNldHRpbmcgaXQgKi8KIAkJaWYgKGRldi0+bW1pbyAmJiBkZXZwcml2LT5sY2ZnKQogCQkJcnRkX3Jlc2V0KGRldik7Ci0JCWlmIChkZXYtPmlycSkgewotCQkJd3JpdGVsKHJlYWRsKGRldnByaXYtPmxjZmcgKyBQTFhfSU5UUkNTX1JFRykgJgotCQkJCX4oSUNTX1BMSUUgfCBJQ1NfRE1BMF9FIHwgSUNTX0RNQTFfRSksCi0JCQkJZGV2cHJpdi0+bGNmZyArIFBMWF9JTlRSQ1NfUkVHKTsKKwkJaWYgKGRldi0+aXJxKQogCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JCX0KIAkJaWYgKGRldi0+bW1pbykKIAkJCWlvdW5tYXAoZGV2LT5tbWlvKTsKIAkJaWYgKGRldnByaXYtPmxhczEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwppbmRleCBmYzQ5N2RkLi43ODE5MThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKQEAgLTYxLDE0ICs2MSwxMiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiczYyNi5oIgogCiBzdHJ1Y3QgczYyNl9idWZmZXJfZG1hIHsKQEAgLTIzMSw5ICsyMjksOSBAQAogLyogKioqKioqKioqKioqKiogIEVFUFJPTSBBQ0NFU1MgRlVOQ1RJT05TICAqKioqKioqKioqKioqKiAqLwogCiBzdGF0aWMgaW50IHM2MjZfaTJjX2hhbmRzaGFrZV9lb2Moc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgdW5zaWduZWQgbG9uZyBjb250ZXh0KQorCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJYm9vbCBzdGF0dXM7CiAKQEAgLTI5NCw3ICsyOTIsNyBAQAogCSAqICBCeXRlMCA9IE5vdCBzZW50LgogCSAqLwogCWlmIChzNjI2X2kyY19oYW5kc2hha2UoZGV2LCBTNjI2X0kyQ19CMihTNjI2X0kyQ19BVFRSU1RBUlQsCi0JCQkJCSAgIChkZXZwcml2LT5pMmNfYWRycyB8IDEpKSB8CisJCQkJCQkoZGV2cHJpdi0+aTJjX2FkcnMgfCAxKSkgfAogCQkJCSAgICBTNjI2X0kyQ19CMShTNjI2X0kyQ19BVFRSU1RPUCwgMCkgfAogCQkJCSAgICBTNjI2X0kyQ19CMChTNjI2X0kyQ19BVFRSTk9QLCAwKSkpCiAJCS8qIEFib3J0IGZ1bmN0aW9uIGFuZCBkZWNsYXJlIGVycm9yIGlmIGhhbmRzaGFrZSBmYWlsZWQuICovCkBAIC01MTcsOCArNTE1LDggQEAKIC8qCiAgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbjogV3JpdGUgc2V0cG9pbnQgdG8gYW4gYXBwbGljYXRpb24gREFDIGNoYW5uZWwuCiAgKi8KLXN0YXRpYyBpbnQgczYyNl9zZXRfZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVpbnQxNl90IGNoYW4sCi0JCQkgaW50MTZfdCBkYWNkYXRhKQorc3RhdGljIGludCBzNjI2X3NldF9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCXVpbnQxNl90IGNoYW4sIGludDE2X3QgZGFjZGF0YSkKIHsKIAlzdHJ1Y3QgczYyNl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVpbnQxNl90IHNpZ25tYXNrOwpAQCAtNTgzLDggKzU4MSw4IEBACiAJcmV0dXJuIHM2MjZfc2VuZF9kYWMoZGV2LCB2YWwpOwogfQogCi1zdGF0aWMgaW50IHM2MjZfd3JpdGVfdHJpbV9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDhfdCBsb2dpY2FsX2NoYW4sCi0JCQkJdWludDhfdCBkYWNfZGF0YSkKK3N0YXRpYyBpbnQgczYyNl93cml0ZV90cmltX2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICAgIHVpbnQ4X3QgbG9naWNhbF9jaGFuLCB1aW50OF90IGRhY19kYXRhKQogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdWludDMyX3QgY2hhbjsKQEAgLTY0MSw3ICs2MzksNyBAQAogCS8qIENvcHkgVHJpbURhYyBzZXRwb2ludCB2YWx1ZXMgZnJvbSBFRVBST00gdG8gVHJpbURhY3MuICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoczYyNl90cmltY2hhbik7IGkrKykgewogCQlyZXQgPSBzNjI2X3dyaXRlX3RyaW1fZGFjKGRldiwgaSwKLQkJCQkgICAgczYyNl9pMmNfcmVhZChkZXYsIHM2MjZfdHJpbWFkcnNbaV0pKTsKKwkJCQkJICBzNjI2X2kyY19yZWFkKGRldiwgczYyNl90cmltYWRyc1tpXSkpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNTc2LDcgKzE1NzQsNyBAQAogCSAgICAgICBkZXYtPm1taW8gKyBTNjI2X1BfUlBTQUREUjEpOwogCiAJLyogQ29uc3RydWN0IFJQUyBwcm9ncmFtIGluIHJwc19idWYgRE1BIGJ1ZmZlciAqLwotCWlmIChjbWQgIT0gTlVMTCAmJiBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKSB7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpIHsKIAkJLyogV2FpdCBmb3IgU3RhcnQgdHJpZ2dlci4gKi8KIAkJKnJwcysrID0gUzYyNl9SUFNfUEFVU0UgfCBTNjI2X1JQU19TSUdBREM7CiAJCSpycHMrKyA9IFM2MjZfUlBTX0NMUlNJR05BTCB8IFM2MjZfUlBTX1NJR0FEQzsKQEAgLTE2NjUsNyArMTY2Myw3IEBACiAJCQkqcnBzKysgPSBqbXBfYWRyczsKIAkJfQogCi0JCWlmIChjbWQgIT0gTlVMTCAmJiBjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfTk9XKSB7CisJCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfTk9XKSB7CiAJCQkvKiBXYWl0IGZvciBTdGFydCB0cmlnZ2VyLiAqLwogCQkJKnJwcysrID0gUzYyNl9SUFNfUEFVU0UgfCBTNjI2X1JQU19TSUdBREM7CiAJCQkqcnBzKysgPSBTNjI2X1JQU19DTFJTSUdOQUwgfCBTNjI2X1JQU19TSUdBREM7CkBAIC0yMDM0LDEwICsyMDMyLDYgQEAKIAkvKiByZXNldCBhaV9jbWRfcnVubmluZyBmbGFnICovCiAJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOwogCi0JLyogdGVzdCBpZiBjbWQgaXMgdmFsaWQgKi8KLQlpZiAoY21kID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJczYyNl9haV9sb2FkX3BvbGxsaXN0KHBwbCwgY21kKTsKIAlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDE7CiAJZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCA9IDA7CkBAIC0yMTIwLDI0ICsyMTE0LDI0IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywKLQkJCQkgICAgIFRSSUdfTk9XIHwgVFJJR19JTlQgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKLQkJCQkgICAgIFRSSUdfVElNRVIgfCBUUklHX0VYVCB8IFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAotCQkJCSAgICAgVFJJR19USU1FUiB8IFRSSUdfRVhUIHwgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywKKwkJCQkJVFJJR19OT1cgfCBUUklHX0lOVCB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQgfCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUIHwgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMjE0OSw0OSArMjE0Myw1MyBAQAogCXN3aXRjaCAoY21kLT5zdGFydF9zcmMpIHsKIAljYXNlIFRSSUdfTk9XOgogCWNhc2UgVFJJR19JTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCQlicmVhazsKIAljYXNlIFRSSUdfRVhUOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdGFydF9hcmcsIDM5KTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c3RhcnRfYXJnLCAzOSk7CiAJCWJyZWFrOwogCX0KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgMzkpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgMzkpOwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywgMzkpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywgMzkpOwogCiAjZGVmaW5lIFM2MjZfTUFYX1NQRUVECTIwMDAwMAkvKiBpbiBuYW5vc2Vjb25kcyAqLwogI2RlZmluZSBTNjI2X01JTl9TUEVFRAkyMDAwMDAwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIFM2MjZfTUFYX1NQRUVEKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgUzYyNl9NSU5fU1BFRUQpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBTNjI2X01BWF9TUEVFRCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIFM2MjZfTUlOX1NQRUVEKTsKIAl9IGVsc2UgewotCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCi0JCS8qIHNob3VsZCBiZSBsZXZlbC9lZGdlLCBoaS9sbyBzcGVjaWZpY2F0aW9uIGhlcmUgKi8KLQkJLyogc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgZXh0ZXJuYWwgdHJpZ2dlcnMgKi8KLQkJLyogZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDkpOyAqLworCQkvKgorCQkgKiBleHRlcm5hbCB0cmlnZ2VyCisJCSAqIHNob3VsZCBiZSBsZXZlbC9lZGdlLCBoaS9sbyBzcGVjaWZpY2F0aW9uIGhlcmUKKwkJICogc2hvdWxkIHNwZWNpZnkgbXVsdGlwbGUgZXh0ZXJuYWwgdHJpZ2dlcnMKKwkJICogZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDkpOworCQkgKi8KIAl9CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBTNjI2X01BWF9TUEVFRCk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIFM2MjZfTUlOX1NQRUVEKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgUzYyNl9NQVhfU1BFRUQpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBTNjI2X01JTl9TUEVFRCk7CiAJfSBlbHNlIHsKLQkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLwotCQkvKiBzZWUgYWJvdmUgKi8KLQkJLyogZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDkpOyAqLworCQkvKgorCQkgKiBleHRlcm5hbCB0cmlnZ2VyIC0gc2VlIGFib3ZlCisJCSAqIGVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCA5KTsKKwkJICovCiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0yMjAxLDE4ICsyMTk5LDE5IEBACiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCQlzNjI2X25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKIAkJczYyNl9uc190b190aW1lcigmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7Ci0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCQkgYXJnKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgYXJnKTsKIAkJfQogCX0KIApAQCAtMjczMyw3ICsyNzMyLDcgQEAKIH0KIAogc3RhdGljIGludCBzNjI2X2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYwppbmRleCA3MTIyNmVlLi5hZDM1ZWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMKQEAgLTM5LDE0ICszOSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogc3RydWN0IHNlcmlhbDIwMDJfcmFuZ2VfdGFibGVfdCB7Ci0KIAkvKiAgSEFDSy4uLiAqLwogCWludCBsZW5ndGg7CiAJc3RydWN0IGNvbWVkaV9rcmFuZ2UgcmFuZ2U7CiB9OwogCiBzdHJ1Y3Qgc2VyaWFsMjAwMl9wcml2YXRlIHsKLQogCWludCBwb3J0OwkJLyogIC9kZXYvdHR5Uzxwb3J0PiAqLwogCWludCBzcGVlZDsJCS8qICBiYXVkcmF0ZSAqLwogCXN0cnVjdCBmaWxlICp0dHk7CkBAIC0xNDUsOCArMTQzLDggQEAKIAkJCWJyZWFrOwogCQl9CiAJCWRvX2dldHRpbWVvZmRheSgmbm93KTsKLQkJZWxhcHNlZCA9ICgxMDAwMDAwICogKG5vdy50dl9zZWMgLSBzdGFydC50dl9zZWMpICsKLQkJCSAgbm93LnR2X3VzZWMgLSBzdGFydC50dl91c2VjKTsKKwkJZWxhcHNlZCA9IDEwMDAwMDAgKiAobm93LnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKworCQkJICBub3cudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWM7CiAJCWlmIChlbGFwc2VkID4gdGltZW91dCkKIAkJCWJyZWFrOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwpAQCAtMzAwLDcgKzI5OCw2IEBACiAJCX0KIAl9CiAJcmV0dXJuIHJlc3VsdDsKLQogfQogCiBzdGF0aWMgdm9pZCBzZXJpYWwyMDAyX3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3Qgc2VyaWFsX2RhdGEgZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jCmluZGV4IDg0OGMzMDguLmFjYzdmMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3Nzdl9kbnAuYwpAQCAtMTI3LDcgKzEyNyw2IEBACiAJb3V0Yih2YWwsIENTQ0RSKTsKIAogCXJldHVybiBpbnNuLT5uOwotCiB9CiAKIHN0YXRpYyBpbnQgZG5wX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdW5pb3h4NS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VuaW94eDUuYwppbmRleCA3YzIyNzZhLi41MTQ5OGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdW5pb3h4NS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91bmlveHg1LmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogKi8KIAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKQEAgLTgxLDcgKzgwLDYgQEAKIAogc3RhdGljIGludCBfX3VuaW94eDVfZGVmaW5lX2NoYW5fb2Zmc2V0KGludCBjaGFuX251bSkKIHsKLQogCWlmIChjaGFuX251bSA8IDAgfHwgY2hhbl9udW0gPiAyMykKIAkJcmV0dXJuIC0xOwogCkBAIC0yNjYsNyArMjY0LDcgQEAKIAkvKiBzZW5kaW5nIGZvciBieXRlcyB0byBtb2R1bGUob25lIGJ5dGUgcGVyIGN5Y2xlIGl0ZXJhdGlvbikgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXdoaWxlICghKChpbmIodXNwLT51c3BfaW9iYXNlICsgMCkpICYgVHhCRSkpCi0JCQk7CS8qIHdhaXRzIHdoaWxlIHdyaXR0aW5nIHdpbGwgYmUgYWxsb3dlZCAqLworCQkJOwkvKiB3YWl0cyB3aGlsZSB3cml0aW5nIHdpbGwgYmUgYWxsb3dlZCAqLwogCQlvdXRiKHVzcC0+dXNwX2V4dHJhX2RhdGFbbW9kdWxlXVtpXSwgdXNwLT51c3BfaW9iYXNlICsgNik7CiAJfQogCkBAIC0zOTksNyArMzk3LDcgQEAKIAkJb3V0YihpICsgMSwgaW9iYXNlICsgNSk7CiAJCW91dGIoJ0gnLCBpb2Jhc2UgKyA2KTsJLyogcmVxdWVzdHMgRUVQUk9NIHdvcmxkICovCiAJCXdoaWxlICghKGluYihpb2Jhc2UgKyAwKSAmIFR4QkUpKQotCQkJOwkvKiB3YWl0cyB3aGlsZSB3cml0dGluZyB3aWxsIGJlIGFsbG93ZWQgKi8KKwkJCTsJLyogd2FpdHMgd2hpbGUgd3JpdGluZyB3aWxsIGJlIGFsbG93ZWQgKi8KIAkJb3V0YigwLCBpb2Jhc2UgKyA2KTsKIAogCQkvKiB3YWl0cyB3aGlsZSByZWFkaW5nIG9mIHR3byBieXRlcyB3aWxsIGJlIGFsbG93ZWQgKi8KQEAgLTQxMyw4ICs0MTEsOSBAQAogCQlpZiAobmRlZl9mbGFnKSB7CiAJCQl1c3AtPnVzcF9tb2R1bGVfdHlwZVtpXSA9IDA7CiAJCQluZGVmX2ZsYWcgPSAwOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXVzcC0+dXNwX21vZHVsZV90eXBlW2ldID0gaW5iKGlvYmFzZSArIDYpOworCQl9CiAKIAkJdWRlbGF5KDEpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwppbmRleCAxY2Q3NDAzLi5jZWQwNWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC04NSw4ICs4NSw2IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlfdXNiLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLQogLyogY29uc3RhbnRzIGZvciBmaXJtd2FyZSB1cGxvYWQgYW5kIGRvd25sb2FkICovCiAjZGVmaW5lIFVTQkRVWF9GSVJNV0FSRQkJInVzYmR1eF9maXJtd2FyZS5iaW4iCiAjZGVmaW5lIFVTQkRVWF9GSVJNV0FSRV9NQVhfTEVOCTB4MjAwMApAQCAtNTI0LDE5ICs1MjIsMTkgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTQ1LDEwICs1NDMsMTAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWlmICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgewpAQCAtNTYzLDggKzU2MSw5IEBACiAJCQl3aGlsZSAoaSA8IChjbWQtPmNoYW5saXN0X2xlbikpCiAJCQkJaSA9IGkgKiAyOwogCi0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCQkgMTAwMDAwMCAvIDggKiBpKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgMTAwMDAwMCAvIDggKiBpKTsKIAkJCS8qIG5vdyBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCBhbGwgdGhlCiAJCQkgKiByb3VuZGluZyBlcnJvcnMgKi8KIAkJCXRtcF90aW1lciA9CkBAIC01NzMsMjQgKzU3MiwyNiBAQAogCQl9IGVsc2UgewogCQkJLyogZnVsbCBzcGVlZCAqLwogCQkJLyogMWtIeiBzY2FucyBldmVyeSBVU0IgZnJhbWUgKi8KLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJCSAxMDAwMDAwKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgMTAwMDAwMCk7CiAJCQkvKgogCQkJICogY2FsYyB0aGUgcmVhbCBzYW1wbGluZyByYXRlIHdpdGggdGhlIHJvdW5kaW5nIGVycm9ycwogCQkJICovCiAJCQl0bXBfdGltZXIgPSAoKHVuc2lnbmVkIGludCkoY21kLT5zY2FuX2JlZ2luX2FyZyAvCiAJCQkJCQkgICAxMDAwMDAwKSkgKiAxMDAwMDAwOwogCQl9Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQl0bXBfdGltZXIpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgdG1wX3RpbWVyKTsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTYzMyw4ICs2MzQsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IFJFVFJJRVM7IGkrKykgewogCQlyZXQgPSB1c2JfYnVsa19tc2codXNiLCB1c2JfcmN2YnVsa3BpcGUodXNiLCA4KSwKLQkJCQkgICAgICBkZXZwcml2LT5pbnNuX2J1ZiwgU0laRUlOU05CVUYsCi0JCQkJICAgICAgJm5yZWMsIEJVTEtfVElNRU9VVCk7CisJCQkJICAgZGV2cHJpdi0+aW5zbl9idWYsIFNJWkVJTlNOQlVGLAorCQkJCSAgICZucmVjLCBCVUxLX1RJTUVPVVQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWlmIChsZTE2X3RvX2NwdShkZXZwcml2LT5pbnNuX2J1ZlswXSkgPT0gY29tbWFuZCkKQEAgLTg5NSw3ICs4OTYsNyBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKIAogCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCiAJCS8qIHRoZSBzYW1wbGluZyByYXRlIGlzIHNldCBieSB0aGUgY292ZXJzaW9uIHJhdGUgKi8KQEAgLTkwNCw3ICs5MDUsNyBAQAogCQkvKiBzdGFydCBhIG5ldyBzY2FuIChvdXRwdXQgYXQgb25jZSkgd2l0aCBhIHRpbWVyICovCiAJCWZsYWdzID0gVFJJR19USU1FUjsKIAl9Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgZmxhZ3MpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIGZsYWdzKTsKIAogCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCiAJCS8qCkBAIC05MTksMTggKzkyMCwxOCBAQAogCQkgKi8KIAkJZmxhZ3MgPSBUUklHX05PVzsKIAl9Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgZmxhZ3MpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIGZsYWdzKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC05MzksMjUgKzk0MCwyNyBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIDEwMDAwMDApOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgMTAwMDAwMCk7CisJfQogCiAJLyogbm90IHVzZWQgbm93LCBpcyBmb3IgbGF0ZXIgdXNlICovCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEyNTAwMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMjUwMDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0xMDQxLDcgKzEwNDQsNiBAQAogCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0KIAlzdHJ1Y3QgdXNiZHV4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKaW5kZXggN2NlMjdjMS4uZDkwZGM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiLi4vY29tZWRpX3VzYi5oIgogCiAvKgpAQCAtMzQzLDIzICszNDIsMjQgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAogCQkJCQlUUklHX05PVyB8IFRSSUdfRVhUIHwgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19GT0xMT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTM3MiwxMiArMzcyLDEzIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikKIAkJZXJyIHw9IC1FSU5WQUw7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5jaGFubGlzdF9sZW4gPT0gMSkKIAkJbWluX3NhbXBsZV9wZXJpb2QgPSAxOwpAQCAtMzk0LDE2ICszOTUsMTYgQEAKIAogCQkvKiBjYWxjIGFyZyBhZ2FpbiAqLwogCQl0bXAgPSBzdGVwcyAvIDMwOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCB0bXApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCB0bXApOwogCX0KIAogCS8qIHN0b3Agc291cmNlICovCiAJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CiAJY2FzZSBUUklHX0NPVU5UOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX05PTkU6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAkJYnJlYWs7CiAJCS8qCiAJCSAqIFRSSUdfRVhUIGRvZXNuJ3QgY2FyZSBzaW5jZSBpdCBkb2Vzbid0IHRyaWdnZXIKQEAgLTQxOSw3ICs0MjAsNiBAQAogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAogCXJldHVybiAwOwotCiB9CiAKIHN0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9pbnR0cmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4c2lnbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCmluZGV4IDM5NDk2OWIuLmVhYTlhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICIuLi9jb21lZGlfdXNiLmgiCiAKIC8qIHRpbWVvdXQgZm9yIHRoZSBVU0ItdHJhbnNmZXIgaW4gbXMqLwpAQCAtMjQzLDkgKzI0Miw4IEBACiAJCXVyYi0+ZGV2ID0gY29tZWRpX3RvX3VzYl9kZXYoZGV2KTsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJIiVzOiB1cmIgcmVzdWJtaXQgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidXJiIHJlc3VibWl0IGZhaWxlZCAoJWQpXG4iLAorCQkJCXJldCk7CiAJCQlpZiAocmV0ID09IC1FTDJOU1lOQykKIAkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gSVJRIGhhbmRsZXJcbiIpOwpAQCAtMjkyLDggKzI5MCw4IEBACiAKIAlkZWZhdWx0OgogCQkvKiBhIHJlYWwgZXJyb3IgKi8KLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzOiBub24temVybyB1cmIgc3RhdHVzICglZClcbiIsCi0JCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAibm9uLXplcm8gdXJiIHN0YXR1cyAoJWQpXG4iLAorCQkJdXJiLT5zdGF0dXMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJYnJlYWs7CiAJfQpAQCAtMzg2LDkgKzM4NCw4IEBACiAJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uc3RhdHVzID0gMDsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJIiVzOiB1cmIgcmVzdWJtaXQgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidXJiIHJlc3VibWl0IGZhaWxlZCAoJWQpXG4iLAorCQkJCXJldCk7CiAJCQlpZiAocmV0ID09IC1FTDJOU1lOQykKIAkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gSVJRIGhhbmRsZXJcbiIpOwpAQCAtNDIzLDggKzQyMCw4IEBACiAKIAlkZWZhdWx0OgogCQkvKiBhIHJlYWwgZXJyb3IgKi8KLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzOiBub24temVybyB1cmIgc3RhdHVzICglZClcbiIsCi0JCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAibm9uLXplcm8gdXJiIHN0YXR1cyAoJWQpXG4iLAorCQkJdXJiLT5zdGF0dXMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJYnJlYWs7CiAJfQpAQCAtNDg4LDE5ICs0ODUsMTkgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTA5LDEwICs1MDYsMTAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXVuc2lnbmVkIGludCB0bXA7CkBAIC01MjQsMjcgKzUyMSwzMSBAQAogCQkJICogc2FtcGxlIHR3byBjaGFubmVscy4gVGh1cywgdGhlIG1vcmUgY2hhbm5lbHMKIAkJCSAqIGFyZSBpbiB0aGUgY2hhbm5lbCBsaXN0IHRoZSBtb3JlIHRpbWUgd2UgbmVlZC4KIAkJCSAqLwotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkoMTAwMDAwMCAvIDggKiBpbnRlcnZhbCkpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+CisJCQkJCQkJICAgIHNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgICAoMTAwMDAwMCAvIDggKgorCQkJCQkJCSAgICAgaW50ZXJ2YWwpKTsKIAogCQkJdG1wID0gKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMjUwMDApICogMTI1MDAwOwogCQl9IGVsc2UgewogCQkJLyogZnVsbCBzcGVlZCAqLwogCQkJLyogMWtIeiBzY2FucyBldmVyeSBVU0IgZnJhbWUgKi8KLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJCSAxMDAwMDAwKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgMTAwMDAwMCk7CiAKIAkJCXRtcCA9IChjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMCkgKiAxMDAwMDAwOwogCQl9Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIHRtcCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIHRtcCk7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC04NTYsNyArODU3LDcgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7CiAKIAlpZiAoaGlnaF9zcGVlZCkgewogCQkvKgpAQCAtODY4LDExICs4NjksMTEgQEAKIAkJLyogc3RhcnQgYSBuZXcgc2NhbiAob3V0cHV0IGF0IG9uY2UpIHdpdGggYSB0aW1lciAqLwogCQlmbGFncyA9IFRSSUdfVElNRVI7CiAJfQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIGZsYWdzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBmbGFncyk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKSB7CiAJCXVwKCZkZXZwcml2LT5zZW0pOwpAQCAtODgxLDggKzg4Miw4IEBACiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtODkxLDI1ICs4OTIsMjcgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSAxMDAwMDAwKTsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIDEwMDAwMDApOworCX0KIAogCS8qIG5vdCB1c2VkIG5vdywgaXMgZm9yIGxhdGVyIHVzZSAqLwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMjUwMDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTI1MDAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMTA3MSw5ICsxMDc0LDggQEAKIAlkZWZhdWx0OgogCQkvKiBhIHJlYWwgZXJyb3IgKi8KIAkJaWYgKGRldnByaXYtPnB3bV9jbWRfcnVubmluZykgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkiJXM6IG5vbi16ZXJvIHVyYiBzdGF0dXMgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIm5vbi16ZXJvIHVyYiBzdGF0dXMgKCVkKVxuIiwKKwkJCQl1cmItPnN0YXR1cyk7CiAJCQl1c2JkdXhzaWdtYV9wd21fc3RvcChkZXYsIDApOwkvKiB3L28gdW5saW5rICovCiAJCX0KIAkJcmV0dXJuOwpAQCAtMTA4Nyw4ICsxMDg5LDcgQEAKIAl1cmItPnN0YXR1cyA9IDA7CiAJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiJXM6IHVyYiByZXN1Ym1pdCBmYWlsZWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidXJiIHJlc3VibWl0IGZhaWxlZCAoJWQpXG4iLCByZXQpOwogCQlpZiAocmV0ID09IC1FTDJOU1lOQykKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkJImJ1Z2d5IFVTQiBob3N0IGNvbnRyb2xsZXIgb3IgYnVnIGluIElSUSBoYW5kbGVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYwppbmRleCA5NzNmNTQ0Li43NmJmNTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCkBAIC01OCw3ICs1OCw3IEBACiAJCXJldHZhbCA9IE5VTEw7CiAJdXBfcmVhZCgmZGV2LT5hdHRhY2hfbG9jayk7CiAKLQlpZiAocmV0dmFsID09IE5VTEwpCisJaWYgKCFyZXR2YWwpCiAJCWNvbWVkaV9kZXZfcHV0KGRldik7CiAKIAlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jCmluZGV4IDcxODQ3NDcuLjY3NjZkNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmMKQEAgLTEzNjEsNyArMTM2MSw2IEBACiB7CiAJdTggX19pb21lbSAqdmFkZHI7CiAJdWxvbmcgb2Zmc2V0OwotCXVpbnQgdmFsdWU7CiAKIAlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCiAJCXJldHVybiAwOwpAQCAtMTM4NCw4ICsxMzgzLDcgQEAKIAlvZmZzZXQgPSAoaW9yZWFkMTYodmFkZHIgKyBFQ1NfU0VHKSA8PCA0KSArIChjaC0+Y2hfcG9ydG51bSAqIDB4MjgpCiAJICAgICAgICsgTElORV9TUEVFRDsKIAotCXZhbHVlID0gcmVhZHcodmFkZHIgKyBvZmZzZXQpOwotCXJldHVybiB2YWx1ZTsKKwlyZXR1cm4gcmVhZHcodmFkZHIgKyBvZmZzZXQpOwogfQogCiAvKgpAQCAtMjE5Niw3ICsyMTk0LDcgQEAKIAkgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlCiAJICovCiAJYnJkLT5wb3J0ID0gYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVDsKLQlicmQtPnBvcnRfZW5kID0gYnJkLT5wb3J0ICsgUENJX0lPX1NJWkU7CisJYnJkLT5wb3J0X2VuZCA9IGJyZC0+cG9ydCArIFBDSV9JT19TSVpFX0RHQVA7CiAKIAkvKgogCSAqIFNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZm9yIG5vbi1QTFggYm9hcmRzCkBAIC0zOTc5LDcgKzM5NzcsNiBAQAogCWludCByZXN1bHQ7CiAJdTggbXN0YXQ7CiAJdWxvbmcgbG9ja19mbGFnczsKLQlpbnQgcmM7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwogCkBAIC00MDA0LDkgKzQwMDEsNyBAQAogCWlmIChtc3RhdCAmIERfQ0QoY2gpKQogCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CiAKLQlyYyA9IHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiBwdXRfdXNlcihyZXN1bHQsIHZhbHVlKTsKIH0KIAogLyoKQEAgLTcwNDQsOCArNzAzOSw3IEBACiAKIAkvKiBTdGFydCB0aGUgcG9sbGVyICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRnYXBfcG9sbF9sb2NrLCBmbGFncyk7Ci0JaW5pdF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKLQlkZ2FwX3BvbGxfdGltZXIuZnVuY3Rpb24gPSBkZ2FwX3BvbGxfaGFuZGxlcjsKKwlzZXR1cF90aW1lcigmZGdhcF9wb2xsX3RpbWVyLCBkZ2FwX3BvbGxfaGFuZGxlciwgMCk7CiAJZGdhcF9wb2xsX3RpbWVyLmRhdGEgPSAwOwogCWRnYXBfcG9sbF90aW1lID0gamlmZmllcyArIGRnYXBfamlmZmllc19mcm9tX21zKGRnYXBfcG9sbF90aWNrKTsKIAlkZ2FwX3BvbGxfdGltZXIuZXhwaXJlcyA9IGRnYXBfcG9sbF90aW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5oCmluZGV4IDY4NDAzMzEuLmEyZTViMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmgKQEAgLTEyMSw3ICsxMjEsNyBAQAogI2RlZmluZSBQQ0lfSU9fT0ZGU0VUCQkweDAwMjAwMDAwCiAKIC8qIFNpemUgb2YgSU8gKDJNQikgKi8KLSNkZWZpbmUgUENJX0lPX1NJWkUJCTB4MDAyMDAwMDAKKyNkZWZpbmUgUENJX0lPX1NJWkVfREdBUAkweDAwMjAwMDAwCiAKIC8qIE51bWJlciBvZiBib2FyZHMgd2Ugc3VwcG9ydCBhdCBvbmNlLiAqLwogI2RlZmluZQlNQVhCT0FSRFMJMzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvTWFrZWZpbGUKaW5kZXggYjY5ZjdiNi4uOTk1Yzg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvTWFrZWZpbGUKQEAgLTEsNSArMSwzIEBACi1FWFRSQV9DRkxBR1MgKz0gLURER19OQU1FPVwiZGduYy0xLjMtMTZcIiAtRERHX1BBUlQ9XCI0MDAwMjM2OV9GXCIKLQogb2JqLSQoQ09ORklHX0RHTkMpICs9IGRnbmMubwogCiBkZ25jLW9ianMgOj0gICBkZ25jX2Nscy5vIGRnbmNfZHJpdmVyLm9cCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvVE9ETwppbmRleCAyMmFkZmYxLi4yYjJjNmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL1RPRE8KQEAgLTEsMTAgKzEsMTAgQEAKICogY2hlY2twYXRjaCBmaXhlcwogKiByZW1vdmUgdW5lY2Vzc2FyeSBjb21tZW50cwotKiByZW1vdmUgdW5lY2Vzc2FyeSBlcnJvciBtZXNzYWdlcy4gRXhhbXBsZSBremFsbG9jKCkgaGFzIGl0cyAKKyogcmVtb3ZlIHVuZWNlc3NhcnkgZXJyb3IgbWVzc2FnZXMuIEV4YW1wbGUga3phbGxvYygpIGhhcyBpdHMKICAgb3duIGVycm9yIG1lc3NhZ2UuIEFkZGluZyBhbiBleHRyYSBvbmUgaXMgdXNlbGVzcy4KICogdXNlIGdvdG8gc3RhdGVtZW50cyBmb3IgZXJyb3IgaGFuZGxpbmcgd2hlbiBhcHByb3ByaWF0ZQotKiB0aGVyZSBpcyBhIGxvdCBvZiB1bmVjZXNzYXJ5IGNvZGUgaW4gdGhlIGRyaXZlci4gSXQgd2FzIAorKiB0aGVyZSBpcyBhIGxvdCBvZiB1bmVjZXNzYXJ5IGNvZGUgaW4gdGhlIGRyaXZlci4gSXQgd2FzCiAgIG9yaWdpbmFsbHkgYSBzdGFuZGFsb25lIGRyaXZlci4gUmVtb3ZlIHVuZWVkZWQgY29kZS4KIAotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAogQ2M6IExpZHphIExvdWluYSA8bGlkemEubG91aW5hQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jCmluZGV4IGJlZGM1MjIuLmUzNTY0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYwpAQCAtMTEsMjIgKzExLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKglUaGFuayB5b3UuCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTkyLDE0ICs3NiwxMiBAQAogCS5zZW5kX2ltbWVkaWF0ZV9jaGFyID0JCWNsc19zZW5kX2ltbWVkaWF0ZV9jaGFyCiB9OwogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2N0c19mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdW5zaWduZWQgY2hhciBsY3JiID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bGNyKTsKIAl1bnNpZ25lZCBjaGFyIGllciA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CiAJdW5zaWduZWQgY2hhciBpc3JfZmNyID0gMDsKIAotCiAJLyoKIAkgKiBUaGUgRW5oYW5jZWQgUmVnaXN0ZXIgU2V0IG1heSBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4KIAkgKiB0aGUgTGluZSBDb250cm9sIFJlZ2lzdGVyIGlzIHNldCB0byAweEJGaC4KQEAgLTEzNiwxNCArMTE4LDEyIEBACiAKIH0KIAotCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9peG9uX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIGxjcmIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sY3IpOwogCXVuc2lnbmVkIGNoYXIgaWVyID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIAl1bnNpZ25lZCBjaGFyIGlzcl9mY3IgPSAwOwogCi0KIAkvKgogCSAqIFRoZSBFbmhhbmNlZCBSZWdpc3RlciBTZXQgbWF5IG9ubHkgYmUgYWNjZXNzZWQgd2hlbgogCSAqIHRoZSBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgaXMgc2V0IHRvIDB4QkZoLgpAQCAtMTg0LDE0ICsxNjQsMTIgQEAKIAogfQogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X25vX291dHB1dF9mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdW5zaWduZWQgY2hhciBsY3JiID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bGNyKTsKIAl1bnNpZ25lZCBjaGFyIGllciA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CiAJdW5zaWduZWQgY2hhciBpc3JfZmNyID0gMDsKIAotCiAJLyoKIAkgKiBUaGUgRW5oYW5jZWQgUmVnaXN0ZXIgU2V0IG1heSBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4KIAkgKiB0aGUgTGluZSBDb250cm9sIFJlZ2lzdGVyIGlzIHNldCB0byAweEJGaC4KQEAgLTIzMCwxNCArMjA4LDEyIEBACiAKIH0KIAotCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9ydHNfZmxvd19jb250cm9sKHN0cnVjdCBjaGFubmVsX3QgKmNoKQogewogCXVuc2lnbmVkIGNoYXIgbGNyYiA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmxjcik7CiAJdW5zaWduZWQgY2hhciBpZXIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5pZXIpOwogCXVuc2lnbmVkIGNoYXIgaXNyX2ZjciA9IDA7CiAKLQogCS8qCiAJICogVGhlIEVuaGFuY2VkIFJlZ2lzdGVyIFNldCBtYXkgb25seSBiZSBhY2Nlc3NlZCB3aGVuCiAJICogdGhlIExpbmUgQ29udHJvbCBSZWdpc3RlciBpcyBzZXQgdG8gMHhCRmguCkBAIC0yNjYsMjAgKzI0MiwxNyBAQAogCQlVQVJUXzE2NjU0X0ZDUl9UWFRSSUdHRVJfMTYgfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSKSwKIAkJJmNoLT5jaF9jbHNfdWFydC0+aXNyX2Zjcik7CiAKLQogCWNoLT5jaF9yX3dhdGVybWFyayA9IDQ7CiAJY2gtPmNoX3JfdGxldmVsID0gODsKIAogfQogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2l4b2ZmX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIGxjcmIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sY3IpOwogCXVuc2lnbmVkIGNoYXIgaWVyID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIAl1bnNpZ25lZCBjaGFyIGlzcl9mY3IgPSAwOwogCi0KIAkvKgogCSAqIFRoZSBFbmhhbmNlZCBSZWdpc3RlciBTZXQgbWF5IG9ubHkgYmUgYWNjZXNzZWQgd2hlbgogCSAqIHRoZSBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgaXMgc2V0IHRvIDB4QkZoLgpAQCAtMzE2LDE0ICsyODksMTIgQEAKIAogfQogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X25vX2lucHV0X2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIGxjcmIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sY3IpOwogCXVuc2lnbmVkIGNoYXIgaWVyID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIAl1bnNpZ25lZCBjaGFyIGlzcl9mY3IgPSAwOwogCi0KIAkvKgogCSAqIFRoZSBFbmhhbmNlZCBSZWdpc3RlciBTZXQgbWF5IG9ubHkgYmUgYWNjZXNzZWQgd2hlbgogCSAqIHRoZSBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgaXMgc2V0IHRvIDB4QkZoLgpAQCAtMzU3LDcgKzMyOCw2IEBACiAKIH0KIAotCiAvKgogICogY2xzX2NsZWFyX2JyZWFrLgogICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0cyB0aW1lIHRvIHNodXQgb2ZmIGJyZWFrIGNvbmRpdGlvbi4KQEAgLTM5Myw3ICszNjMsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiB9CiAKLQogLyogUGFyc2UgdGhlIElTUiByZWdpc3RlciBmb3IgdGhlIHNwZWNpZmljIHBvcnQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfcGFyc2VfaXNyKHN0cnVjdCBkZ25jX2JvYXJkICpicmQsIHVpbnQgcG9ydCkKIHsKQEAgLTQwNiw3ICszNzUsNyBAQAogCSAqIHZlcmlmaWVkIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZS4KIAkgKi8KIAotCWlmIChwb3J0ID4gYnJkLT5uYXN5bmMpCisJaWYgKHBvcnQgPj0gYnJkLT5uYXN5bmMpCiAJCXJldHVybjsKIAogCWNoID0gYnJkLT5jaGFubmVsc1twb3J0XTsKQEAgLTQ1Nyw3ICs0MjYsNiBAQAogCX0KIH0KIAotCiAvKgogICogY2xzX3BhcmFtKCkKICAqIFNlbmQgYW55L2FsbCBjaGFuZ2VzIHRvIHRoZSBsaW5lIHRvIHRoZSBVQVJULgpAQCAtNzExLDcgKzY3OSw2IEBACiAJY2xzX3BhcnNlX21vZGVtKGNoLCByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5tc3IpKTsKIH0KIAotCiAvKgogICogT3VyIGJvYXJkIHBvbGxlciBmdW5jdGlvbi4KICAqLwpAQCAtNzg0LDcgKzc1MSw2IEBACiAKIH0KIAotCiAvKgogICogY2xzX2ludHIoKQogICoKQEAgLTgzNCw3ICs4MDAsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotCiBzdGF0aWMgdm9pZCBjbHNfZGlzYWJsZV9yZWNlaXZlcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIHRtcCA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CkBAIC04NDMsNyArODA4LDYgQEAKIAl3cml0ZWIodG1wLCAmY2gtPmNoX2Nsc191YXJ0LT5pZXIpOwogfQogCi0KIHN0YXRpYyB2b2lkIGNsc19lbmFibGVfcmVjZWl2ZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdW5zaWduZWQgY2hhciB0bXAgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5pZXIpOwpAQCAtODUyLDcgKzgxNiw2IEBACiAJd3JpdGViKHRtcCwgJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBjbHNfY29weV9kYXRhX2Zyb21fdWFydF90b19xdWV1ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAlpbnQgcWxlZnQgPSAwOwpAQCAtOTQyLDcgKzkwNSw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIH0KIAotCiAvKgogICogVGhpcyBmdW5jdGlvbiBiYXNpY2FsbHkgZ29lcyB0byBzbGVlcCBmb3Igc2Vjcywgb3IgdW50aWwKICAqIGl0IGdldHMgc2lnbmFsbGVkIHRoYXQgdGhlIHBvcnQgaGFzIGZ1bGx5IGRyYWluZWQuCkBAIC05NzgsNyArOTQwLDYgQEAKIAkJCQkJICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApKTsKIH0KIAotCiAvKiBDaGFubmVsIGxvY2sgTVVTVCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24hICovCiBzdGF0aWMgdm9pZCBjbHNfZmx1c2hfdWFydF93cml0ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKQEAgLTk5Miw3ICs5NTMsNiBAQAogCWNoLT5jaF9mbGFncyB8PSAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKIH0KIAotCiAvKiBDaGFubmVsIGxvY2sgTVVTVCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24hICovCiBzdGF0aWMgdm9pZCBjbHNfZmx1c2hfdWFydF9yZWFkKHN0cnVjdCBjaGFubmVsX3QgKmNoKQogewpAQCAtMTAxMyw3ICs5NzMsNiBAQAogCXVkZWxheSgxMCk7CiB9CiAKLQogc3RhdGljIHZvaWQgY2xzX2NvcHlfZGF0YV9mcm9tX3F1ZXVlX3RvX3VhcnQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdXNob3J0IGhlYWQ7CkBAIC0xMDI5LDIyICs5ODgsMTYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAogCS8qIE5vIGRhdGEgdG8gd3JpdGUgdG8gdGhlIFVBUlQgKi8KLQlpZiAoY2gtPmNoX3dfdGFpbCA9PSBjaC0+Y2hfd19oZWFkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9CisJaWYgKGNoLT5jaF93X3RhaWwgPT0gY2gtPmNoX3dfaGVhZCkKKwkJZ290byBleGl0X3VubG9jazsKIAogCS8qIElmIHBvcnQgaXMgInN0b3BwZWQiLCBkb24ndCBzZW5kIGFueSBkYXRhIHRvIHRoZSBVQVJUICovCiAJaWYgKChjaC0+Y2hfZmxhZ3MgJiBDSF9GT1JDRURfU1RPUCkgfHwKLQkJCQkgKGNoLT5jaF9mbGFncyAmIENIX0JSRUFLX1NFTkRJTkcpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9CisJCQkJIChjaC0+Y2hfZmxhZ3MgJiBDSF9CUkVBS19TRU5ESU5HKSkKKwkJZ290byBleGl0X3VubG9jazsKIAotCWlmICghKGNoLT5jaF9mbGFncyAmIChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmICghKGNoLT5jaF9mbGFncyAmIChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pKSkKKwkJZ290byBleGl0X3VubG9jazsKIAogCW4gPSAzMjsKIApAQCAtMTA5NCwxMCArMTA0NywxMCBAQAogCWlmIChsZW5fd3JpdHRlbiA+IDApCiAJCWNoLT5jaF9mbGFncyAmPSB+KENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7CiAKK2V4aXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiB9CiAKLQogc3RhdGljIHZvaWQgY2xzX3BhcnNlX21vZGVtKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyIHNpZ25hbHMpCiB7CiAJdW5zaWduZWQgY2hhciBtc2lnbmFscyA9IHNpZ25hbHM7CkBAIC0xMTYyLDcgKzExMTUsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiB9CiAKLQogLyogTWFrZSB0aGUgVUFSVCByYWlzZSBhbnkgb2YgdGhlIG91dHB1dCBzaWduYWxzIHdlIHdhbnQgdXAgKi8KIHN0YXRpYyB2b2lkIGNsc19hc3NlcnRfbW9kZW1fc2lnbmFscyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKQEAgLTExODIsNyArMTEzNCw2IEBACiAJdWRlbGF5KDEwKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBjbHNfc2VuZF9zdGFydF9jaGFyYWN0ZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQpAQCAtMTE5NCw3ICsxMTQ1LDYgQEAKIAl9CiB9CiAKLQogc3RhdGljIHZvaWQgY2xzX3NlbmRfc3RvcF9jaGFyYWN0ZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQpAQCAtMTIwNiw3ICsxMTU2LDYgQEAKIAl9CiB9CiAKLQogLyogSW5pdHMgVUFSVCAqLwogc3RhdGljIHZvaWQgY2xzX3VhcnRfaW5pdChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKQEAgLTEyNDQsNyArMTE5Myw2IEBACiAJcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bXNyKTsKIH0KIAotCiAvKgogICogVHVybnMgb2ZmIFVBUlQuCiAgKi8KQEAgLTEyNTMsNyArMTIwMSw2IEBACiAJd3JpdGViKDAsICZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CiB9CiAKLQogLyoKICAqIGNsc19nZXRfdWFydHNfYnl0ZXNfbGVmdC4KICAqIFJldHVybnMgMCBpcyBub3RoaW5nIGxlZnQgaW4gdGhlIEZJRk8sIHJldHVybnMgMSBvdGhlcndpc2UuCkBAIC0xMjgzLDcgKzEyMzAsNiBAQAogCXJldHVybiBsZWZ0OwogfQogCi0KIC8qCiAgKiBjbHNfc2VuZF9icmVhay4KICAqIFN0YXJ0cyBzZW5kaW5nIGEgYnJlYWsgdGhydSB0aGUgVUFSVC4KQEAgLTEzMjYsNyArMTI3Miw2IEBACiAJfQogfQogCi0KIC8qCiAgKiBjbHNfc2VuZF9pbW1lZGlhdGVfY2hhci4KICAqIFNlbmRzIGEgc3BlY2lmaWMgY2hhcmFjdGVyIGFzIHNvb24gYXMgcG9zc2libGUgdG8gdGhlIFVBUlQsCkBAIC0xMzQ4LDcgKzEyOTMsNiBAQAogCXU4IF9faW9tZW0gICAgICAgICAgICpyZV9tYXBfdnBkYmFzZTsvKiBSZW1hcHBlZCBtZW1vcnkgb2YgdGhlIGNhcmQgKi8KIAlpbnQgaSA9IDA7CiAKLQogCXZwZGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYnJkLT5wZGV2LCAzKTsKIAogCS8qIE5vIFZQRCAqLwpAQCAtMTM3MCw0ICsxMzE0LDMgQEAKIAlpZiAocmVfbWFwX3ZwZGJhc2UpCiAJCWlvdW5tYXAocmVfbWFwX3ZwZGJhc2UpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuaAppbmRleCA0NjVkNzlhLi4yNTk3ZTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmgKQEAgLTExLDIxICsxMSwxMSBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKICAqLwogCiAjaWZuZGVmIF9fREdOQ19DTFNfSAogI2RlZmluZSBfX0RHTkNfQ0xTX0gKIAotI2luY2x1ZGUgImRnbmNfdHlwZXMuaCIKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBQZXIgY2hhbm5lbC9wb3J0IENsYXNzaWMgVUFSVCBzdHJ1Y3R1cmUJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzUsMTUgKzI1LDI1IEBACiAgKgkJCVUgPSBVbnVzZWQuCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICogdHhyeCAgICA6IFdSIFJIUi9USFIgLSBIb2xkaW5nIHJlZworICogaWVyICAgICA6IFdSIElFUiAtIEludGVycnVwdCBFbmFibGUgUmVnCisgKiBpc3JfZmNyIDogV1IgSVNSL0ZDUiAtIEludGVycnVwdCBTdGF0dXMgUmVnL0ZpZm8gQ29udHJvbCBSZWcKKyAqIGxjciAgICAgOiBXUiBMQ1IgLSBMaW5lIENvbnRyb2wgUmVnCisgKiBtY3IgICAgIDogV1IgTUNSIC0gTW9kZW0gQ29udHJvbCBSZWcKKyAqIGxzciAgICAgOiBXUiBMU1IgLSBMaW5lIFN0YXR1cyBSZWcKKyAqIG1zciAgICAgOiBXUiBNU0cgLSBNb2RlbSBTdGF0dXMgUmVnCisgKiBzcHIgICAgIDogV1IgU1BSIC0gU2NyYXRjaCBwYWQgUmVnCisgKi8KIHN0cnVjdCBjbHNfdWFydF9zdHJ1Y3QgewotCXU4IHR4cng7CQkvKiBXUiAgUkhSL1RIUiAtIEhvbGRpbmcgUmVnICovCi0JdTggaWVyOwkJLyogV1IgIElFUiAtIEludGVycnVwdCBFbmFibGUgUmVnICovCi0JdTggaXNyX2ZjcjsJCS8qIFdSICBJU1IvRkNSIC0gSW50ZXJydXB0IFN0YXR1cyBSZWcvRmlmbyBDb250cm9sIFJlZyAqLwotCXU4IGxjcjsJCS8qIFdSICBMQ1IgLSBMaW5lIENvbnRyb2wgUmVnICovCi0JdTggbWNyOwkJLyogV1IgIE1DUiAtIE1vZGVtIENvbnRyb2wgUmVnICovCi0JdTggbHNyOwkJLyogV1IgIExTUiAtIExpbmUgU3RhdHVzIFJlZyAqLwotCXU4IG1zcjsJCS8qIFdSICBNU1IgLSBNb2RlbSBTdGF0dXMgUmVnICovCi0JdTggc3ByOwkJLyogV1IgIFNQUiAtIFNjcmF0Y2ggUGFkIFJlZyAqLworCXU4IHR4cng7CisJdTggaWVyOworCXU4IGlzcl9mY3I7CisJdTggbGNyOworCXU4IG1jcjsKKwl1OCBsc3I7CisJdTggbXNyOworCXU4IHNwcjsKIH07CiAKIC8qIFdoZXJlIHRvIHJlYWQgdGhlIGludGVycnVwdCByZWdpc3RlciAoOGJpdHMpICovCkBAIC01MSwxOCArNTEsMTUgQEAKIAogI2RlZmluZSBVQVJUX0VYQVI2NTRfRU5IQU5DRURfUkVHSVNURVJfU0VUIDB4QkYKIAotI2RlZmluZSBVQVJUXzE2NjU0X0ZDUl9UWFRSSUdHRVJfOAkweDAKICNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfVFhUUklHR0VSXzE2CTB4MTAKLSNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfVFhUUklHR0VSXzMyCTB4MjAKLSNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfVFhUUklHR0VSXzU2CTB4MzAKLQotI2RlZmluZSBVQVJUXzE2NjU0X0ZDUl9SWFRSSUdHRVJfOAkweDAKICNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfUlhUUklHR0VSXzE2CTB4NDAKICNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfUlhUUklHR0VSXzU2CTB4ODAKLSNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfUlhUUklHR0VSXzYwICAgICAweEMwCiAKLSNkZWZpbmUgVUFSVF9JSVJfQ1RTUlRTCQkJMHgyMAkvKiBSZWNlaXZlZCBDVFMvUlRTIGNoYW5nZSBvZiBzdGF0ZSAqLwotI2RlZmluZSBVQVJUX0lJUl9SRElfVElNRU9VVAkJMHgwQyAgICAvKiBSZWNlaXZlciBkYXRhIFRJTUVPVVQgKi8KKy8qIFJlY2VpdmVkIENUUy9SVFMgY2hhbmdlIG9mIHN0YXRlICovCisjZGVmaW5lIFVBUlRfSUlSX0NUU1JUUwkJCTB4MjAKKworLyogUmVjZWl2ZXIgZGF0YSBUSU1FT1VUICovCisjZGVmaW5lIFVBUlRfSUlSX1JESV9USU1FT1VUCQkweDBDCiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIEVYVEVOREVEIGRlZmluaXRpb25zIGZvciB0aGUgRXhhciA2NTQncyBJbnRlcnJ1cHQKQEAgLTczLDEwICs3MCw2IEBACiAjZGVmaW5lIFVBUlRfRVhBUjY1NF9FRlJfSVhPRkYgICAgMHg4ICAgICAvKiBUcmFuc21pdCBYb24xL1hvZmYxICovCiAjZGVmaW5lIFVBUlRfRVhBUjY1NF9FRlJfUlRTRFRSICAgMHg0MCAgICAvKiBBdXRvIFJUUy9EVFIgRmxvdyBDb250cm9sIEVuYWJsZSAqLwogI2RlZmluZSBVQVJUX0VYQVI2NTRfRUZSX0NUU0RTUiAgIDB4ODAgICAgLyogQXV0byBDVFMvRFNSIEZsb3cgQ09udHJvbCBFbmFibGUgKi8KLQotI2RlZmluZSBVQVJUX0VYQVI2NTRfWE9GRl9ERVRFQ1QgIDB4MSAgICAgLyogSW5kaWNhdGVzIHdoZXRoZXIgY2hpcCBzYXcgYW4gaW5jb21pbmcgWE9GRiBjaGFyICAqLwotI2RlZmluZSBVQVJUX0VYQVI2NTRfWE9OX0RFVEVDVCAgIDB4MiAgICAgLyogSW5kaWNhdGVzIHdoZXRoZXIgY2hpcCBzYXcgYW4gaW5jb21pbmcgWE9OIGNoYXIgKi8KLQogI2RlZmluZSBVQVJUX0VYQVI2NTRfSUVSX1hPRkYgICAgIDB4MjAgICAgLyogWG9mZiBJbnRlcnJ1cHQgRW5hYmxlICovCiAjZGVmaW5lIFVBUlRfRVhBUjY1NF9JRVJfUlRTRFRSICAgMHg0MCAgICAvKiBPdXRwdXQgSW50ZXJydXB0IEVuYWJsZSAqLwogI2RlZmluZSBVQVJUX0VYQVI2NTRfSUVSX0NUU0RTUiAgIDB4ODAgICAgLyogSW5wdXQgSW50ZXJydXB0IEVuYWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmMKaW5kZXggZjE3N2QzYS4uODA1ZGM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jCkBAIC0xMSwyMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCiAgKi8KIAogCkBAIC0zNyw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogI2luY2x1ZGUgImRnbmNfcGNpLmgiCi0jaW5jbHVkZSAiZHBhY29tcGF0LmgiCiAjaW5jbHVkZSAiZGduY19tZ210LmgiCiAjaW5jbHVkZSAiZGduY190dHkuaCIKICNpbmNsdWRlICJkZ25jX2Nscy5oIgpAQCAtNjAsNyArNDMsOCBAQAogc3RhdGljIGludAkJZGduY19mb3VuZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlkKTsKIHN0YXRpYyB2b2lkCQlkZ25jX2NsZWFudXBfYm9hcmQoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CiBzdGF0aWMgdm9pZAkJZGduY19wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpOwotc3RhdGljIGludAkJZGduY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50CQlkZ25jX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwogc3RhdGljIHZvaWQJCWRnbmNfZG9fcmVtYXAoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CiAKIC8qCkBAIC05Miw4ICs3Niw4IEBACiAgKiBQb2xsZXIgc3R1ZmYKICAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhkZ25jX3BvbGxfbG9jayk7IC8qIFBvbGwgc2NoZWR1bGluZyBsb2NrICovCi1zdGF0aWMgdWxvbmcJCWRnbmNfcG9sbF90aW1lOwkJCQkvKiBUaW1lIG9mIG5leHQgcG9sbCAqLwotc3RhdGljIHVpbnQJCWRnbmNfcG9sbF9zdG9wOwkJCQkvKiBVc2VkIHRvIHRlbGwgcG9sbGVyIHRvIHN0b3AgKi8KK3N0YXRpYyB1bG9uZwkJZGduY19wb2xsX3RpbWU7IC8qIFRpbWUgb2YgbmV4dCBwb2xsICovCitzdGF0aWMgdWludAkJZGduY19wb2xsX3N0b3A7IC8qIFVzZWQgdG8gdGVsbCBwb2xsZXIgdG8gc3RvcCAqLwogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRnbmNfcG9sbF90aW1lcjsKIAogCkBAIC0xMzksMTQgKzEyMyw2IEBACiAJLmlkX3RhYmxlICAgICAgID0gZGduY19wY2lfdGJsLAogfTsKIAotCi1jaGFyICpkZ25jX3N0YXRlX3RleHRbXSA9IHsKLQkiQm9hcmQgRmFpbGVkIiwKLQkiQm9hcmQgRm91bmQiLAotCSJCb2FyZCBSRUFEWSIsCi19OwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBEcml2ZXIgbG9hZC91bmxvYWQgZnVuY3Rpb25zCkBAIC0yMTQsNyArMTkwLDcgQEAKIAkgKiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiB0aGUgc2NhbiwgYmFpbCBvdXQgb2YgZHJpdmVyLgogCSAqLwogCWlmIChyYyA8IDApIHsKLQkJLyogT25seSB1bnJlZ2lzdGVyIHRoZSBwY2kgZHJpdmVyIGlmIGl0IHdhcyBhY3R1YWxseSByZWdpc3RlcmVkLiAqLworCQkvKiBPbmx5IHVucmVnaXN0ZXIgaWYgaXQgd2FzIGFjdHVhbGx5IHJlZ2lzdGVyZWQuICovCiAJCWlmIChkZ25jX051bUJvYXJkcykKIAkJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGduY19kcml2ZXIpOwogCQllbHNlCkBAIC0yNTEsOSArMjI3LDkgQEAKIAkgKiBSZWdpc3RlciBtYW5hZ2VtZW50L2RwYSBkZXZpY2VzCiAJICovCiAJcmMgPSByZWdpc3Rlcl9jaHJkZXYoMCwgImRnbmMiLCAmZGduY19Cb2FyZEZvcHMpOwotCWlmIChyYyA8PSAwKSB7CisJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IHJlZ2lzdGVyIGRnbmMgZHJpdmVyIGRldmljZSAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiAtRU5YSU87CisJCXJldHVybiByYzsKIAl9CiAJZGduY19NYWpvciA9IHJjOwogCkBAIC0yODUsOSArMjYxLDcgQEAKIAogCS8qIFN0YXJ0IHRoZSBwb2xsZXIgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGduY19wb2xsX2xvY2ssIGZsYWdzKTsKLQlpbml0X3RpbWVyKCZkZ25jX3BvbGxfdGltZXIpOwotCWRnbmNfcG9sbF90aW1lci5mdW5jdGlvbiA9IGRnbmNfcG9sbF9oYW5kbGVyOwotCWRnbmNfcG9sbF90aW1lci5kYXRhID0gMDsKKwlzZXR1cF90aW1lcigmZGduY19wb2xsX3RpbWVyLCBkZ25jX3BvbGxfaGFuZGxlciwgMCk7CiAJZGduY19wb2xsX3RpbWUgPSBqaWZmaWVzICsgZGduY19qaWZmaWVzX2Zyb21fbXMoZGduY19wb2xsX3RpY2spOwogCWRnbmNfcG9sbF90aW1lci5leHBpcmVzID0gZGduY19wb2xsX3RpbWU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGduY19wb2xsX2xvY2ssIGZsYWdzKTsKQEAgLTM2NCw3ICszMzgsNyBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAJCWJyZC0+bXNnYnVmID0gTlVMTDsKLQkJcHJpbnRrKCIlcyIsIGJyZC0+bXNnYnVmX2hlYWQpOworCQlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwgIiVzXG4iLCBicmQtPm1zZ2J1Zl9oZWFkKTsKIAkJa2ZyZWUoYnJkLT5tc2didWZfaGVhZCk7CiAJCWJyZC0+bXNnYnVmX2hlYWQgPSBOVUxMOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CkBAIC00MTAsNyArMzg0LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBtYWtlIGEgdGVtcG9yYXJ5IG1lc3NhZ2UgYnVmZmVyIGZvciB0aGUgYm9vdCBtZXNzYWdlcyAqLwotCWJyZC0+bXNnYnVmX2hlYWQgPSBremFsbG9jKHNpemVvZih1OCkgKiA4MTkyLCBHRlBfS0VSTkVMKTsKKwlicmQtPm1zZ2J1Zl9oZWFkID0ga2NhbGxvYyg4MTkyLCBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKIAlicmQtPm1zZ2J1ZiA9IGJyZC0+bXNnYnVmX2hlYWQ7CiAKIAlpZiAoIWJyZC0+bXNnYnVmKSB7CkBAIC01NTMsNyArNTI3LDcgQEAKIAogCQlpZiAoYnJkLT5yZV9tYXBfbWVtYmFzZSkgewogCi0JCQkvKiBBZnRlciByZW1hcCBpcyBjb21wbGV0ZSwgd2UgbmVlZCB0byByZWFkIGFuZCBzdG9yZSB0aGUgZHZpZCAqLworCQkJLyogUmVhZCBhbmQgc3RvcmUgdGhlIGR2aWQgYWZ0ZXIgcmVtYXBwaW5nICovCiAJCQlicmQtPmR2aWQgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgMHg4RCk7CiAKIAkJCS8qIEdldCBhbmQgc3RvcmUgdGhlIGJvYXJkIFZQRCwgaWYgaXQgZXhpc3RzICovCkBAIC01NzQsMjkgKzU0OCwxOSBAQAogCiAJcmMgPSBkZ25jX3R0eV9yZWdpc3RlcihicmQpOwogCWlmIChyYyA8IDApIHsKLQkJZGduY190dHlfdW5pbml0KGJyZCk7CiAJCXByX2VycihEUlZTVFIgIjogQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZXMgKCVkKVxuIiwgcmMpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlyYyA9IGRnbmNfZmluYWxpemVfYm9hcmRfaW5pdChicmQpOwogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKERSVlNUUiAiOiBDYW4ndCBmaW5hbGl6ZSBib2FyZCBpbml0ICglZClcbiIsIHJjKTsKLQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKLQogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlyYyA9IGRnbmNfdHR5X2luaXQoYnJkKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWRnbmNfdHR5X3VuaW5pdChicmQpOwogCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IGluaXQgdHR5IGRldmljZXMgKCVkKVxuIiwgcmMpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNjA2LDExICs1NzAsMTMgQEAKIAlkZ25jX2NyZWF0ZV9wb3J0c19zeXNmaWxlcyhicmQpOwogCiAJLyogaW5pdCBvdXIgcG9sbCBoZWxwZXIgdGFza2xldCAqLwotCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwgYnJkLT5iZF9vcHMtPnRhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBicmQpOworCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwKKwkJICAgICBicmQtPmJkX29wcy0+dGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZykgYnJkKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAJYnJkLT5tc2didWYgPSBOVUxMOwotCXByaW50aygiJXMiLCBicmQtPm1zZ2J1Zl9oZWFkKTsKKwlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwgIiVzXG4iLCBicmQtPm1zZ2J1Zl9oZWFkKTsKIAlrZnJlZShicmQtPm1zZ2J1Zl9oZWFkKTsKIAlicmQtPm1zZ2J1Zl9oZWFkID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CkBAIC02MjgsNiArNTk0LDkgQEAKIAlyZXR1cm4gMDsKIAogZmFpbGVkOgorCWRnbmNfdHR5X3VuaW5pdChicmQpOworCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKIAogCXJldHVybiAtRU5YSU87CiAKQEAgLTcwOCw3ICs2NzcsNyBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZicmQtPmJkX2xvY2ssIGZsYWdzKTsKIAotCQkvKiBJZiBib2FyZCBpcyBpbiBhIGZhaWxlZCBzdGF0ZSwgZG9uJ3QgYm90aGVyIHNjaGVkdWxpbmcgYSB0YXNrbGV0ICovCisJCS8qIElmIGJvYXJkIGlzIGluIGEgZmFpbGVkIHN0YXRlIGRvbid0IHNjaGVkdWxlIGEgdGFza2xldCAqLwogCQlpZiAoYnJkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgZmxhZ3MpOwogCQkJY29udGludWU7CkBAIC03MjksMTEgKzY5OCw5IEBACiAJbmV3X3RpbWUgPSBkZ25jX3BvbGxfdGltZSAtIGppZmZpZXM7CiAKIAlpZiAoKHVsb25nKSBuZXdfdGltZSA+PSAyICogZGduY19wb2xsX3RpY2spCi0JCWRnbmNfcG9sbF90aW1lID0gamlmZmllcyArICBkZ25jX2ppZmZpZXNfZnJvbV9tcyhkZ25jX3BvbGxfdGljayk7CisJCWRnbmNfcG9sbF90aW1lID0gamlmZmllcyArIGRnbmNfamlmZmllc19mcm9tX21zKGRnbmNfcG9sbF90aWNrKTsKIAotCWluaXRfdGltZXIoJmRnbmNfcG9sbF90aW1lcik7Ci0JZGduY19wb2xsX3RpbWVyLmZ1bmN0aW9uID0gZGduY19wb2xsX2hhbmRsZXI7Ci0JZGduY19wb2xsX3RpbWVyLmRhdGEgPSAwOworCXNldHVwX3RpbWVyKCZkZ25jX3BvbGxfdGltZXIsIGRnbmNfcG9sbF9oYW5kbGVyLCAwKTsKIAlkZ25jX3BvbGxfdGltZXIuZXhwaXJlcyA9IGRnbmNfcG9sbF90aW1lOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRnbmNfcG9sbF9sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5oCmluZGV4IGE4MTU3ZWIuLmY3N2ZlZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuaApAQCAtMTIsMTIgKzEyLDYgQEAKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRHJpdmVyIGluY2x1ZGVzCkBAIC0zMSw5ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CSAgLyogVG8gcGljayB1cCB0aGUgdmFyaW91cyB0dHkgc3RydWN0cy9kZWZpbmVzICovCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciBpcnFyZXR1cm5fdCB0eXBlICovCiAKLSNpbmNsdWRlICJkZ25jX3R5cGVzLmgiCQkvKiBBZGRpdGlvbmFsIHR5cGVzIG5lZWRlZCBieSB0aGUgRGlnaSBoZWFkZXIgZmlsZXMgKi8KICNpbmNsdWRlICJkaWdpLmgiCQkvKiBEaWdpIHNwZWNpZmljIGlvY3RsIGhlYWRlciAqLwotI2luY2x1ZGUgImRnbmNfa2NvbXBhdC5oIgkvKiBLZXJuZWwgMi40LzIuNiBjb21wYXQgaW5jbHVkZXMgKi8KICNpbmNsdWRlICJkZ25jX3N5c2ZzLmgiCQkvKiBTdXBwb3J0IGZvciBTWVNGUyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDYsNiArMzgsNyBAQAogI2RlZmluZQlQUk9DU1RSCQkiZGduYyIJCQkvKiAvcHJvYyBlbnRyaWVzCSAqLwogI2RlZmluZQlERVZTVFIJCSIvZGV2L2RnL2RnbmMiCQkvKiAvZGV2IGVudHJpZXMJCSAqLwogI2RlZmluZQlEUlZTVFIJCSJkZ25jIgkJCS8qIERyaXZlciBuYW1lIHN0cmluZwkgKi8KKyNkZWZpbmUJREdfUEFSVAkJIjQwMDAyMzY5X0YiCQkvKiBSUE0gcGFydCBudW1iZXIJICovCiAKICNkZWZpbmUgVFJDX1RPX0NPTlNPTEUgMQogCkBAIC0yMTEsOCArMjA0LDggQEAKIAlzdHJ1Y3QgdHR5X2RyaXZlcglQcmludERyaXZlcjsKIAljaGFyCQlQcmludE5hbWVbMjAwXTsKIAotCXVpbnQJCWRnbmNfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQ7Ci0JdWludAkJZGduY19NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQ7CisJYm9vbAkJZGduY19NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZDsKKwlib29sCQlkZ25jX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZDsKIAogCXVpbnQJCWRnbmNfU2VyaWFsX01ham9yOwogCXVpbnQJCWRnbmNfVHJhbnNwYXJlbnRQcmludF9NYWpvcjsKQEAgLTM5OCwxMSArMzkxLDEwIEBACiAvKgogICogT3VyIEdsb2JhbCBWYXJpYWJsZXMuCiAgKi8KLWV4dGVybiB1aW50CQlkZ25jX01ham9yOwkJLyogT3VyIGRyaXZlci9tZ210IG1ham9yCSovCi1leHRlcm4gaW50CQlkZ25jX3BvbGxfdGljazsJCS8qIFBvbGwgaW50ZXJ2YWwgLSAyMCBtcwkqLwotZXh0ZXJuIHNwaW5sb2NrX3QJZGduY19nbG9iYWxfbG9jazsJLyogRHJpdmVyIGdsb2JhbCBzcGlubG9jawkqLwotZXh0ZXJuIHVpbnQJCWRnbmNfTnVtQm9hcmRzOwkJLyogVG90YWwgbnVtYmVyIG9mIGJvYXJkcwkqLwotZXh0ZXJuIHN0cnVjdCBkZ25jX2JvYXJkCSpkZ25jX0JvYXJkW01BWEJPQVJEU107CS8qIEFycmF5IG9mIGJvYXJkIHN0cnVjdHMJKi8KLWV4dGVybiBjaGFyCQkqZGduY19zdGF0ZV90ZXh0W107CS8qIEFycmF5IG9mIHN0YXRlIHRleHQJCSovCitleHRlcm4gdWludAkJZGduY19NYWpvcjsJCS8qIE91ciBkcml2ZXIvbWdtdCBtYWpvciAqLworZXh0ZXJuIGludAkJZGduY19wb2xsX3RpY2s7CQkvKiBQb2xsIGludGVydmFsIC0gMjAgbXMgKi8KK2V4dGVybiBzcGlubG9ja190CWRnbmNfZ2xvYmFsX2xvY2s7CS8qIERyaXZlciBnbG9iYWwgc3BpbmxvY2sgKi8KK2V4dGVybiB1aW50CQlkZ25jX051bUJvYXJkczsJCS8qIFRvdGFsIG51bWJlciBvZiBib2FyZHMgKi8KK2V4dGVybiBzdHJ1Y3QgZGduY19ib2FyZAkqZGduY19Cb2FyZFtNQVhCT0FSRFNdOwkvKiBBcnJheSBvZiBib2FyZCBzdHJ1Y3RzICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19rY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2tjb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2Y2FkMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2tjb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gY29udGFpbiBhbGwgdGhlIGtlcm5lbCAiZGlmZmVyZW5jZXMiIGJldHdlZW4gdGhlCi0gKiB2YXJpb3VzIGtlcm5lbHMgdGhhdCB3ZSBzdXBwb3J0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fREdOQ19LQ09NUEFUX0gKLSNkZWZpbmUgX19ER05DX0tDT01QQVRfSAotCi0jaWYgIWRlZmluZWQoVFRZX0ZMSVBCVUZfU0laRSkKLSMgZGVmaW5lIFRUWV9GTElQQlVGX1NJWkUgNTEyCi0jZW5kaWYKLQotCi0vKiBTcGFyc2Ugc3R1ZmYgKi8KLSMgaWZuZGVmIF9fdXNlcgotIyAgZGVmaW5lIF9fdXNlcgotIyAgZGVmaW5lIF9fa2VybmVsCi0jICBkZWZpbmUgX19zYWZlCi0jICBkZWZpbmUgX19mb3JjZQotIyAgZGVmaW5lIF9fY2hrX3VzZXJfcHRyKHgpICh2b2lkKTAKLSMgZW5kaWYKLQotCi0jZW5kaWYgLyogISBfX0RHTkNfS0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX21nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCmluZGV4IDU1NDRhOGU3Li5iMTMzMThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX21nbXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX21nbXQuYwpAQCAtMTEsMjIgKzExLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKglUaGFuayB5b3UuCi0gKgogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ2LDkgKzMwLDcgQEAKIAogI2luY2x1ZGUgImRnbmNfZHJpdmVyLmgiCiAjaW5jbHVkZSAiZGduY19wY2kuaCIKLSNpbmNsdWRlICJkZ25jX2tjb21wYXQuaCIJLyogS2VybmVsIDIuNC8yLjYgY29tcGF0IGluY2x1ZGVzICovCiAjaW5jbHVkZSAiZGduY19tZ210LmgiCi0jaW5jbHVkZSAiZHBhY29tcGF0LmgiCiAKIAogLyogT3VyICJpbiB1c2UiIHZhcmlhYmxlcywgdG8gZW5mb3JjZSAxIG9wZW4gb25seSAqLwpAQCAtMTUzLDggKzEzNSw3IEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcigmYnJkLCB1YXJnLCBzaXplb2YoaW50KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlpZiAoKGJyZCA8IDApIHx8IChicmQgPiBkZ25jX051bUJvYXJkcykgfHwKLQkJICAgIChkZ25jX051bUJvYXJkcyA9PSAwKSkKKwkJaWYgKGJyZCA8IDAgfHwgYnJkID49IGRnbmNfTnVtQm9hcmRzKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJbWVtc2V0KCZkaSwgMCwgc2l6ZW9mKGRpKSk7CkBAIC0xOTYsMTEgKzE3NywxMSBAQAogCQljaGFubmVsID0gbmkuY2hhbm5lbDsKIAogCQkvKiBWZXJpZnkgYm91bmRhcmllcyBvbiBib2FyZCAqLwotCQlpZiAoKGJvYXJkID4gZGduY19OdW1Cb2FyZHMpIHx8IChkZ25jX051bUJvYXJkcyA9PSAwKSkKKwkJaWYgKGJvYXJkID49IGRnbmNfTnVtQm9hcmRzKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJLyogVmVyaWZ5IGJvdW5kYXJpZXMgb24gY2hhbm5lbCAqLwotCQlpZiAoKGNoYW5uZWwgPCAwKSB8fCAoY2hhbm5lbCA+IGRnbmNfQm9hcmRbYm9hcmRdLT5uYXN5bmMpKQorCQlpZiAoY2hhbm5lbCA+PSBkZ25jX0JvYXJkW2JvYXJkXS0+bmFzeW5jKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJY2ggPSBkZ25jX0JvYXJkW2JvYXJkXS0+Y2hhbm5lbHNbY2hhbm5lbF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX21nbXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5oCmluZGV4IDU2N2Y2ODcuLjcwOGFiZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5oCkBAIC0xMSwxMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQogICovCiAKICNpZm5kZWYgX19ER05DX01HTVRfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMKaW5kZXggYzlhOGE5OC4uZjVhNGQzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jCkBAIC0xMSwyMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCiAgKi8KIAogCkBAIC0xMTksNyArMTAzLDcgQEAKIAogCS8qIFR1cm4gb24gYXV0byBDVFMgZmxvdyBjb250cm9sICovCiAjaWYgMQotCWllciB8PSAoVUFSVF8xNzE1OF9JRVJfQ1RTRFNSKTsKKwlpZXIgfD0gVUFSVF8xNzE1OF9JRVJfQ1RTRFNSOwogI2Vsc2UKIAlpZXIgJj0gfihVQVJUXzE3MTU4X0lFUl9DVFNEU1IpOwogI2VuZGlmCkBAIC0xMjcsNyArMTExLDcgQEAKIAllZnIgfD0gKFVBUlRfMTcxNThfRUZSX0VDQiB8IFVBUlRfMTcxNThfRUZSX0NUU0RTUik7CiAKIAkvKiBUdXJuIG9mZiBhdXRvIFhvbiBmbG93IGNvbnRyb2wgKi8KLQllZnIgJj0gfihVQVJUXzE3MTU4X0VGUl9JWE9OKTsKKwllZnIgJj0gflVBUlRfMTcxNThfRUZSX0lYT047CiAKIAkvKiBXaHk/IEJlY3V6IEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0IG91dCBiZWZvcmUgc2V0dGluZyBpdCAqLwogCXdyaXRlYigwLCAmY2gtPmNoX25lb191YXJ0LT5lZnIpOwpAQCAtMTU1LDE1ICsxMzksMTUgQEAKIAogCS8qIFR1cm4gb24gYXV0byBSVFMgZmxvdyBjb250cm9sICovCiAjaWYgMQotCWllciB8PSAoVUFSVF8xNzE1OF9JRVJfUlRTRFRSKTsKKwlpZXIgfD0gVUFSVF8xNzE1OF9JRVJfUlRTRFRSOwogI2Vsc2UKIAlpZXIgJj0gfihVQVJUXzE3MTU4X0lFUl9SVFNEVFIpOwogI2VuZGlmCiAJZWZyIHw9IChVQVJUXzE3MTU4X0VGUl9FQ0IgfCBVQVJUXzE3MTU4X0VGUl9SVFNEVFIpOwogCiAJLyogVHVybiBvZmYgYXV0byBYb2ZmIGZsb3cgY29udHJvbCAqLwotCWllciAmPSB+KFVBUlRfMTcxNThfSUVSX1hPRkYpOwotCWVmciAmPSB+KFVBUlRfMTcxNThfRUZSX0lYT0ZGKTsKKwlpZXIgJj0gflVBUlRfMTcxNThfSUVSX1hPRkY7CisJZWZyICY9IH5VQVJUXzE3MTU4X0VGUl9JWE9GRjsKIAogCS8qIFdoeT8gQmVjdXogRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlZm9yZSBzZXR0aW5nIGl0ICovCiAJd3JpdGViKDAsICZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CkBAIC0xODUsNyArMTY5LDcgQEAKIAkgKiBSVFMvRFRSIyBvdXRwdXQgcGluIChNQ1IgYml0LTAgb3IgMSB0byBsb2dpYyAxIGFmdGVyCiAJICogaXQgaXMgZW5hYmxlZC4KIAkgKi8KLQljaC0+Y2hfbW9zdGF0IHw9IChVQVJUX01DUl9SVFMpOworCWNoLT5jaF9tb3N0YXQgfD0gVUFSVF9NQ1JfUlRTOwogCiAJbmVvX3BjaV9wb3N0aW5nX2ZsdXNoKGNoLT5jaF9iZCk7CiB9CkBAIC0xOTcsOCArMTgxLDggQEAKIAl1bnNpZ25lZCBjaGFyIGVmciA9IHJlYWRiKCZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CiAKIAkvKiBUdXJuIG9mZiBhdXRvIENUUyBmbG93IGNvbnRyb2wgKi8KLQlpZXIgJj0gfihVQVJUXzE3MTU4X0lFUl9DVFNEU1IpOwotCWVmciAmPSB+KFVBUlRfMTcxNThfRUZSX0NUU0RTUik7CisJaWVyICY9IH5VQVJUXzE3MTU4X0lFUl9DVFNEU1I7CisJZWZyICY9IH5VQVJUXzE3MTU4X0VGUl9DVFNEU1I7CiAKIAkvKiBUdXJuIG9uIGF1dG8gWG9uIGZsb3cgY29udHJvbCAqLwogCWVmciB8PSAoVUFSVF8xNzE1OF9FRlJfRUNCIHwgVUFSVF8xNzE1OF9FRlJfSVhPTik7CkBAIC0yMzQsMTEgKzIxOCwxMSBAQAogCXVuc2lnbmVkIGNoYXIgZWZyID0gcmVhZGIoJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb2ZmIGF1dG8gUlRTIGZsb3cgY29udHJvbCAqLwotCWllciAmPSB+KFVBUlRfMTcxNThfSUVSX1JUU0RUUik7Ci0JZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfUlRTRFRSKTsKKwlpZXIgJj0gflVBUlRfMTcxNThfSUVSX1JUU0RUUjsKKwllZnIgJj0gflVBUlRfMTcxNThfRUZSX1JUU0RUUjsKIAogCS8qIFR1cm4gb24gYXV0byBYb2ZmIGZsb3cgY29udHJvbCAqLwotCWllciB8PSAoVUFSVF8xNzE1OF9JRVJfWE9GRik7CisJaWVyIHw9IFVBUlRfMTcxNThfSUVSX1hPRkY7CiAJZWZyIHw9IChVQVJUXzE3MTU4X0VGUl9FQ0IgfCBVQVJUXzE3MTU4X0VGUl9JWE9GRik7CiAKIAkvKiBXaHk/IEJlY3V6IEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0IG91dCBiZWZvcmUgc2V0dGluZyBpdCAqLwpAQCAtMjcyLDExICsyNTYsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIGVmciA9IHJlYWRiKCZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CiAKIAkvKiBUdXJuIG9mZiBhdXRvIFJUUyBmbG93IGNvbnRyb2wgKi8KLQlpZXIgJj0gfihVQVJUXzE3MTU4X0lFUl9SVFNEVFIpOwotCWVmciAmPSB+KFVBUlRfMTcxNThfRUZSX1JUU0RUUik7CisJaWVyICY9IH5VQVJUXzE3MTU4X0lFUl9SVFNEVFI7CisJZWZyICY9IH5VQVJUXzE3MTU4X0VGUl9SVFNEVFI7CiAKIAkvKiBUdXJuIG9mZiBhdXRvIFhvZmYgZmxvdyBjb250cm9sICovCi0JaWVyICY9IH4oVUFSVF8xNzE1OF9JRVJfWE9GRik7CisJaWVyICY9IH5VQVJUXzE3MTU4X0lFUl9YT0ZGOwogCWlmIChjaC0+Y2hfY19pZmxhZyAmIElYT04pCiAJCWVmciAmPSB+KFVBUlRfMTcxNThfRUZSX0lYT0ZGKTsKIAllbHNlCkBAIC0zMTIsMTIgKzI5NiwxMiBAQAogCXVuc2lnbmVkIGNoYXIgZWZyID0gcmVhZGIoJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb2ZmIGF1dG8gQ1RTIGZsb3cgY29udHJvbCAqLwotCWllciAmPSB+KFVBUlRfMTcxNThfSUVSX0NUU0RTUik7Ci0JZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfQ1RTRFNSKTsKKwlpZXIgJj0gflVBUlRfMTcxNThfSUVSX0NUU0RTUjsKKwllZnIgJj0gflVBUlRfMTcxNThfRUZSX0NUU0RTUjsKIAogCS8qIFR1cm4gb2ZmIGF1dG8gWG9uIGZsb3cgY29udHJvbCAqLwogCWlmIChjaC0+Y2hfY19pZmxhZyAmIElYT0ZGKQotCQllZnIgJj0gfihVQVJUXzE3MTU4X0VGUl9JWE9OKTsKKwkJZWZyICY9IH5VQVJUXzE3MTU4X0VGUl9JWE9OOwogCWVsc2UKIAkJZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfRUNCIHwgVUFSVF8xNzE1OF9FRlJfSVhPTik7CiAKQEAgLTQwNyw3ICszOTEsNyBAQAogCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdOQ19CT0FSRF9NQUdJQykKIAkJcmV0dXJuOwogCi0JaWYgKHBvcnQgPiBicmQtPm1heHBvcnRzKQorCWlmIChwb3J0ID49IGJyZC0+bWF4cG9ydHMpCiAJCXJldHVybjsKIAogCWNoID0gYnJkLT5jaGFubmVsc1twb3J0XTsKQEAgLTUzNyw3ICs1MjEsNyBAQAogCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdOQ19CT0FSRF9NQUdJQykKIAkJcmV0dXJuOwogCi0JaWYgKHBvcnQgPiBicmQtPm1heHBvcnRzKQorCWlmIChwb3J0ID49IGJyZC0+bWF4cG9ydHMpCiAJCXJldHVybjsKIAogCWNoID0gYnJkLT5jaGFubmVsc1twb3J0XTsKQEAgLTEwMTksNyArMTAwMyw3IEBACiAJCQkgKi8KIAogCQkJLyogVmVyaWZ5IHRoZSBwb3J0IGlzIGluIHJhbmdlLiAqLwotCQkJaWYgKHBvcnQgPiBicmQtPm5hc3luYykKKwkJCWlmIChwb3J0ID49IGJyZC0+bmFzeW5jKQogCQkJCWNvbnRpbnVlOwogCiAJCQljaCA9IGJyZC0+Y2hhbm5lbHNbcG9ydF07CkBAIC0xMjAzLDcgKzExODcsNyBAQAogCQkgKiBJQk0gcFNlcmllcyBwbGF0Zm9ybS4KIAkJICogMTUgYnl0ZXMgbWF4IGFwcGVhcnMgdG8gYmUgdGhlIG1hZ2ljIG51bWJlci4KIAkJICovCi0JCW4gPSBtaW4oKHVpbnQpIG4sICh1aW50KSAxMik7CisJCW4gPSBtaW5fdCh1aW50LCBuLCAxMik7CiAKIAkJLyoKIAkJICogU2luY2Ugd2UgYXJlIGdyYWJiaW5nIHRoZSBsaW5lc3RhdHVzIHJlZ2lzdGVyLCB3aGljaApAQCAtMTQzNiwxNiArMTQyMCwxMyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogCiAJLyogTm8gZGF0YSB0byB3cml0ZSB0byB0aGUgVUFSVCAqLwotCWlmIChjaC0+Y2hfd190YWlsID09IGNoLT5jaF93X2hlYWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoY2gtPmNoX3dfdGFpbCA9PSBjaC0+Y2hfd19oZWFkKQorCQlnb3RvIGV4aXRfdW5sb2NrOwogCiAJLyogSWYgcG9ydCBpcyAic3RvcHBlZCIsIGRvbid0IHNlbmQgYW55IGRhdGEgdG8gdGhlIFVBUlQgKi8KLQlpZiAoKGNoLT5jaF9mbGFncyAmIENIX0ZPUkNFRF9TVE9QKSB8fCAoY2gtPmNoX2ZsYWdzICYgQ0hfQlJFQUtfU0VORElORykpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoKGNoLT5jaF9mbGFncyAmIENIX0ZPUkNFRF9TVE9QKSB8fAorCQkgKGNoLT5jaF9mbGFncyAmIENIX0JSRUFLX1NFTkRJTkcpKQorCQlnb3RvIGV4aXRfdW5sb2NrOwogCiAJLyoKIAkgKiBJZiBGSUZPcyBhcmUgZGlzYWJsZWQuIFNlbmQgZGF0YSBkaXJlY3RseSB0byB0eHJ4IHJlZ2lzdGVyCkBAIC0xNDg2LDI3ICsxNDY3LDIzIEBACiAJCQljaC0+Y2hfd190YWlsICY9IFdRVUVVRU1BU0s7CiAJCQljaC0+Y2hfdHhjb3VudCsrOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKworCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIAogCS8qCiAJICogV2UgaGF2ZSB0byBkbyBpdCB0aGlzIHdheSwgYmVjYXVzZSBvZiB0aGUgRVhBUiBUWEZJRk8gY291bnQgYnVnLgogCSAqLwogCWlmICgoY2gtPmNoX2JkLT5kdmlkICYgMHhmMCkgPCBVQVJUX1hSMTdFMTU4X0RWSUQpIHsKLQkJaWYgKCEoY2gtPmNoX2ZsYWdzICYgKENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSkpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9CisJCWlmICghKGNoLT5jaF9mbGFncyAmIChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pKSkKKwkJCWdvdG8gZXhpdF91bmxvY2s7CiAKIAkJbGVuX3dyaXR0ZW4gPSAwOwogCiAJCW4gPSByZWFkYigmY2gtPmNoX25lb191YXJ0LT50Zmlmbyk7CiAKLQkJaWYgKCh1bnNpZ25lZCBpbnQpIG4gPiBjaC0+Y2hfdF90bGV2ZWwpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKCh1bnNpZ25lZCBpbnQpIG4gPiBjaC0+Y2hfdF90bGV2ZWwpCisJCQlnb3RvIGV4aXRfdW5sb2NrOwogCiAJCW4gPSBVQVJUXzE3MTU4X1RYX0ZJRk9TSVpFIC0gY2gtPmNoX3RfdGxldmVsOwogCX0gZWxzZSB7CkBAIC0xNTcwLDYgKzE1NDcsNyBAQAogCQljaC0+Y2hfZmxhZ3MgJj0gfihDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pOwogCX0KIAorZXhpdF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmgKaW5kZXggMWE0YWJiMS4uYzUyOGRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5oCkBAIC0xMSwxOSArMTEsMTEgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqCiAgKi8KIAogI2lmbmRlZiBfX0RHTkNfTkVPX0gKICNkZWZpbmUgX19ER05DX05FT19ICiAKLSNpbmNsdWRlICJkZ25jX3R5cGVzLmgiCiAjaW5jbHVkZSAiZGduY19kcml2ZXIuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfcGNpLmgKaW5kZXggNWI2Zjc2ZC4uNjE3ZDQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19wY2kuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3BjaS5oCkBAIC0xMSwxMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQogICovCiAKICNpZm5kZWYgX19ER05DX1BDSV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmMKaW5kZXggMmZkMzRjYS4uNjU1NTFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuYwpAQCAtMTEsMjIgKzExLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICogICAgICBOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKiAgICAgIFRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICogICAgICBMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqICAgICAgQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqICAgICAgb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICogICAgICBTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKiAgICAgIFRoYW5rIHlvdS4KLSAqCiAgKi8KIAogCkBAIC05MSw3ICs3NSw3IEBACiAJcmMgfD0gZHJpdmVyX2NyZWF0ZV9maWxlKGRyaXZlcmZzLCAmZHJpdmVyX2F0dHJfbWF4Ym9hcmRzKTsKIAlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9wb2xscmF0ZSk7CiAJaWYgKHJjKQotCQlwcmludGsoS0VSTl9FUlIgIkRHTkM6IHN5c2ZzIGRyaXZlcl9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKKwkJcHJfZXJyKCJER05DOiBzeXNmcyBkcml2ZXJfY3JlYXRlX2ZpbGUgZmFpbGVkIVxuIik7CiB9CiAKIApAQCAtMzYwLDcgKzM0NCw3IEBACiAJcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl92cGQpOwogCXJjIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmKGJkLT5wZGV2LT5kZXYpLCAmZGV2X2F0dHJfc2VyaWFsX251bWJlcik7CiAJaWYgKHJjKQotCQlwcmludGsoS0VSTl9FUlIgIkRHTkM6IHN5c2ZzIGRldmljZV9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKKwkJZGV2X2VycigmYmQtPnBkZXYtPmRldiwgImRnbmM6IHN5c2ZzIGRldmljZV9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmgKaW5kZXggNjhjMGRlNS4uYmUwZjkwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19zeXNmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuaApAQCAtMTEsMjAgKzExLDEzIEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQogICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCiAgKi8KIAogI2lmbmRlZiBfX0RHTkNfU1lTRlNfSAogI2RlZmluZSBfX0RHTkNfU1lTRlNfSAogCi0jaW5jbHVkZSAiZGduY19kcml2ZXIuaCIKLQogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgImRnbmNfZHJpdmVyLmgiCiAKIHN0cnVjdCBkZ25jX2JvYXJkOwogc3RydWN0IGNoYW5uZWxfdDsKQEAgLTQ0LDYgKzM3LDQgQEAKIGV4dGVybiB2b2lkIGRnbmNfY3JlYXRlX3R0eV9zeXNmcyhzdHJ1Y3QgdW5fdCAqdW4sIHN0cnVjdCBkZXZpY2UgKmMpOwogZXh0ZXJuIHZvaWQgZGduY19yZW1vdmVfdHR5X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmMpOwogCi0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYwppbmRleCBmODFhMzc1Li5jZTQxODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMKQEAgLTExLDIxICsxMSw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQogICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoKLSAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICoJVGhhbmsgeW91LgogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ0LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEZvciB1ZGVsYXkgKi8KQEAgLTUxLDEwICszNyw4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSAiZGduY19kcml2ZXIuaCIKICNpbmNsdWRlICJkZ25jX3R0eS5oIgotI2luY2x1ZGUgImRnbmNfdHlwZXMuaCIKICNpbmNsdWRlICJkZ25jX25lby5oIgogI2luY2x1ZGUgImRnbmNfY2xzLmgiCi0jaW5jbHVkZSAiZHBhY29tcGF0LmgiCiAjaW5jbHVkZSAiZGduY19zeXNmcy5oIgogI2luY2x1ZGUgImRnbmNfdXRpbHMuaCIKIApAQCAtMjM2LDcgKzIyMCw3IEBACiAJCQkJIkNhbid0IHJlZ2lzdGVyIHR0eSBkZXZpY2UgKCVkKVxuIiwgcmMpOwogCQkJcmV0dXJuIHJjOwogCQl9Ci0JCWJyZC0+ZGduY19NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IFRSVUU7CisJCWJyZC0+ZGduY19NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IHRydWU7CiAJfQogCiAJLyoKQEAgLTI4Niw3ICsyNzAsNyBAQAogCQkJCXJjKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQlicmQtPmRnbmNfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkID0gVFJVRTsKKwkJYnJkLT5kZ25jX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IHRydWU7CiAJfQogCiAJZGduY19Cb2FyZHNCeU1ham9yW2JyZC0+U2VyaWFsRHJpdmVyLm1ham9yXSA9IGJyZDsKQEAgLTQyNCw3ICs0MDgsNyBAQAogCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKCZicmQtPlNlcmlhbERyaXZlciwgaSk7CiAJCX0KIAkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKCZicmQtPlNlcmlhbERyaXZlcik7Ci0JCWJyZC0+ZGduY19NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IEZBTFNFOworCQlicmQtPmRnbmNfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQgPSBmYWxzZTsKIAl9CiAKIAlpZiAoYnJkLT5kZ25jX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCkgewpAQCAtNDM1LDcgKzQxOSw3IEBACiAJCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoJmJyZC0+UHJpbnREcml2ZXIsIGkpOwogCQl9CiAJCXR0eV91bnJlZ2lzdGVyX2RyaXZlcigmYnJkLT5QcmludERyaXZlcik7Ci0JCWJyZC0+ZGduY19NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQgPSBGQUxTRTsKKwkJYnJkLT5kZ25jX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IGZhbHNlOwogCX0KIAogCWtmcmVlKGJyZC0+U2VyaWFsRHJpdmVyLnR0eXMpOwpAQCAtNTA3LDcgKzQ5MSw3IEBACiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0cDsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZCA9IE5VTEw7CiAJdWludAlybWFzazsKIAl1c2hvcnQJaGVhZDsKIAl1c2hvcnQJdGFpbDsKQEAgLTUzOSwxMCArNTIzLDggQEAKIAl0YWlsID0gY2gtPmNoX3JfdGFpbCAmIHJtYXNrOwogCWRhdGFfbGVuID0gKGhlYWQgLSB0YWlsKSAmIHJtYXNrOwogCi0JaWYgKGRhdGFfbGVuID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoZGF0YV9sZW4gPT0gMCkKKwkJZ290byBleGl0X3VubG9jazsKIAogCS8qCiAJICogSWYgdGhlIGRldmljZSBpcyBub3Qgb3Blbiwgb3IgQ1JFQUQgaXMgb2ZmLApAQCAtNTU2LDE3ICs1MzgsMTQgQEAKIAkJLyogRm9yY2UgcXVldWUgZmxvdyBjb250cm9sIHRvIGJlIHJlbGVhc2VkLCBpZiBuZWVkZWQgKi8KIAkJZGduY19jaGVja19xdWV1ZV9mbG93X2NvbnRyb2woY2gpOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKwkJZ290byBleGl0X3VubG9jazsKIAl9CiAKIAkvKgogCSAqIElmIHdlIGFyZSB0aHJvdHRsZWQsIHNpbXBseSBkb24ndCByZWFkIGFueSBkYXRhLgogCSAqLwotCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9GT1JDRURfU1RPUEkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfRk9SQ0VEX1NUT1BJKQorCQlnb3RvIGV4aXRfdW5sb2NrOwogCiAJZmxpcF9sZW4gPSBUVFlfRkxJUEJVRl9TSVpFOwogCkBAIC02MDQsMTIgKzU4Myw4IEBACiAJCX0KIAl9CiAKLQlpZiAobGVuIDw9IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJaWYgKGxkKQotCQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAobGVuIDw9IDApCisJCWdvdG8gZXhpdF91bmxvY2s7CiAKIAkvKgogCSAqIFRoZSB0dHkgbGF5ZXIgaW4gdGhlIGtlcm5lbCBoYXMgY2hhbmdlZCBpbiAyLjYuMTYrLgpAQCAtNjc3LDYgKzY1MiwxMiBAQAogCiAJaWYgKGxkKQogCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCXJldHVybjsKKworZXhpdF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKKwlpZiAobGQpCisJCXR0eV9sZGlzY19kZXJlZihsZCk7CiB9CiAKIApAQCAtODg2LDEwICs4NjcsNiBAQAogCQkJCWNoLT5jaF9zdG9wc19zZW50Kys7CiAJCQl9CiAJCX0KLQkJLyogTm8gRkxPVyAqLwotCQllbHNlIHsKLQkJCS8qIEVtcHR5Li4uIENhbid0IGRvIGFueXRoaW5nIGFib3V0IHRoZSBpbXBlbmRpbmcgb3ZlcmZsb3cuLi4gKi8KLQkJfQogCX0KIAogCS8qCkBAIC0xMDY0LDcgKzEwNDEsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmQtPmJkX2xvY2ssIGZsYWdzKTsKIAogCS8qIElmIG9wZW5lZCBkZXZpY2UgaXMgZ3JlYXRlciB0aGFuIG91ciBudW1iZXIgb2YgcG9ydHMsIGJhaWwuICovCi0JaWYgKFBPUlRfTlVNKG1pbm9yKSA+IGJyZC0+bmFzeW5jKSB7CisJaWYgKFBPUlRfTlVNKG1pbm9yKSA+PSBicmQtPm5hc3luYykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmQtPmJkX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xNzc3LDEwICsxNzU0LDggQEAKIAkvKgogCSAqIEJhaWwgaWYgbm8gc3BhY2UgbGVmdC4KIAkgKi8KLQlpZiAoY291bnQgPD0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKGNvdW50IDw9IDApCisJCWdvdG8gZXhpdF9yZXRyeTsKIAogCS8qCiAJICogT3V0cHV0IHRoZSBwcmludGVyIE9OIHN0cmluZywgaWYgd2UgYXJlIGluIHRlcm1pbmFsIG1vZGUsIGJ1dApAQCAtMTgwNywxMCArMTc4Miw4IEBACiAJLyoKIAkgKiBJZiB0aGVyZSBpcyBub3RoaW5nIGxlZnQgdG8gY29weSwgb3IgSSBjYW4ndCBoYW5kbGUgYW55IG1vcmUgZGF0YSwgbGVhdmUuCiAJICovCi0JaWYgKGNvdW50IDw9IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmIChjb3VudCA8PSAwKQorCQlnb3RvIGV4aXRfcmV0cnk7CiAKIAlpZiAoZnJvbV91c2VyKSB7CiAKQEAgLTE4OTYsNiArMTg2OSwxMSBAQAogCX0KIAogCXJldHVybiBjb3VudDsKKworZXhpdF9yZXRyeToKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmgKaW5kZXggMzk3NWYwNC4uMjFkMzM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5oCkBAIC0xMSwxMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQogICovCiAKICNpZm5kZWYgX19ER05DX1RUWV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYWZjZWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAzIERpZ2kgSW50ZXJuYXRpb25hbCAod3d3LmRpZ2kuY29tKQotICoJU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotI2lmbmRlZiBfX0RHTkNfVFlQRVNfSAotI2RlZmluZSBfX0RHTkNfVFlQRVNfSAotCi0jaWZuZGVmIFRSVUUKLSMgZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSMgZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdXRpbHMuYwppbmRleCA4MGI1MTMzLi5mNzZkZTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3V0aWxzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY191dGlscy5jCkBAIC0xNiw1NSArMTYsMyBAQAogCXNjaGVkdWxlX3RpbWVvdXQoKG1zICogSFopIC8gMTAwMCk7CiAJcmV0dXJuIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpOwogfQotCi0vKgotICogICAgICBkZ25jX2lvY3RsX25hbWUoKSA6IFJldHVybnMgYSB0ZXh0IHZlcnNpb24gb2YgZWFjaCBpb2N0bCB2YWx1ZS4KLSAqLwotY2hhciAqZGduY19pb2N0bF9uYW1lKGludCBjbWQpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQotCWNhc2UgVENHRVRBOgkJcmV0dXJuICJUQ0dFVEEiOwotCWNhc2UgVENHRVRTOgkJcmV0dXJuICJUQ0dFVFMiOwotCWNhc2UgVENTRVRBOgkJcmV0dXJuICJUQ1NFVEEiOwotCWNhc2UgVENTRVRTOgkJcmV0dXJuICJUQ1NFVFMiOwotCWNhc2UgVENTRVRBVzoJCXJldHVybiAiVENTRVRBVyI7Ci0JY2FzZSBUQ1NFVFNXOgkJcmV0dXJuICJUQ1NFVFNXIjsKLQljYXNlIFRDU0VUQUY6CQlyZXR1cm4gIlRDU0VUQUYiOwotCWNhc2UgVENTRVRTRjoJCXJldHVybiAiVENTRVRTRiI7Ci0JY2FzZSBUQ1NCUks6CQlyZXR1cm4gIlRDU0JSSyI7Ci0JY2FzZSBUQ1hPTkM6CQlyZXR1cm4gIlRDWE9OQyI7Ci0JY2FzZSBUQ0ZMU0g6CQlyZXR1cm4gIlRDRkxTSCI7Ci0JY2FzZSBUSU9DR1NJRDoJCXJldHVybiAiVElPQ0dTSUQiOwotCi0JY2FzZSBUSU9DR0VURDoJCXJldHVybiAiVElPQ0dFVEQiOwotCWNhc2UgVElPQ1NFVEQ6CQlyZXR1cm4gIlRJT0NTRVREIjsKLQljYXNlIFRJT0NHV0lOU1o6CXJldHVybiAiVElPQ0dXSU5TWiI7Ci0JY2FzZSBUSU9DU1dJTlNaOglyZXR1cm4gIlRJT0NTV0lOU1oiOwotCi0JY2FzZSBUSU9DTUdFVDoJCXJldHVybiAiVElPQ01HRVQiOwotCWNhc2UgVElPQ01TRVQ6CQlyZXR1cm4gIlRJT0NNU0VUIjsKLQljYXNlIFRJT0NNQklTOgkJcmV0dXJuICJUSU9DTUJJUyI7Ci0JY2FzZSBUSU9DTUJJQzoJCXJldHVybiAiVElPQ01CSUMiOwotCi0JLyogZnJvbSBkaWdpLmggKi8KLQljYXNlIERJR0lfU0VUQToJCXJldHVybiAiRElHSV9TRVRBIjsKLQljYXNlIERJR0lfU0VUQVc6CXJldHVybiAiRElHSV9TRVRBVyI7Ci0JY2FzZSBESUdJX1NFVEFGOglyZXR1cm4gIkRJR0lfU0VUQUYiOwotCWNhc2UgRElHSV9TRVRGTE9XOglyZXR1cm4gIkRJR0lfU0VURkxPVyI7Ci0JY2FzZSBESUdJX1NFVEFGTE9XOglyZXR1cm4gIkRJR0lfU0VUQUZMT1ciOwotCWNhc2UgRElHSV9HRVRGTE9XOglyZXR1cm4gIkRJR0lfR0VURkxPVyI7Ci0JY2FzZSBESUdJX0dFVEFGTE9XOglyZXR1cm4gIkRJR0lfR0VUQUZMT1ciOwotCWNhc2UgRElHSV9HRVRBOgkJcmV0dXJuICJESUdJX0dFVEEiOwotCWNhc2UgRElHSV9HRURFTEFZOglyZXR1cm4gIkRJR0lfR0VERUxBWSI7Ci0JY2FzZSBESUdJX1NFREVMQVk6CXJldHVybiAiRElHSV9TRURFTEFZIjsKLQljYXNlIERJR0lfR0VUQ1VTVE9NQkFVRDogcmV0dXJuICJESUdJX0dFVENVU1RPTUJBVUQiOwotCWNhc2UgRElHSV9TRVRDVVNUT01CQVVEOiByZXR1cm4gIkRJR0lfU0VUQ1VTVE9NQkFVRCI7Ci0JY2FzZSBUSU9DTU9ERzoJCXJldHVybiAiVElPQ01PREciOwotCWNhc2UgVElPQ01PRFM6CQlyZXR1cm4gIlRJT0NNT0RTIjsKLQljYXNlIFRJT0NTRFRSOgkJcmV0dXJuICJUSU9DU0RUUiI7Ci0JY2FzZSBUSU9DQ0RUUjoJCXJldHVybiAiVElPQ0NEVFIiOwotCi0JZGVmYXVsdDoJCXJldHVybiAidW5rbm93biI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY191dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY191dGlscy5oCmluZGV4IGNlYmY2MDEuLjExNjRjM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdXRpbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3V0aWxzLmgKQEAgLTIsNiArMiw1IEBACiAjZGVmaW5lIF9fREdOQ19VVElMU19ICiAKIGludCBkZ25jX21zX3NsZWVwKHVsb25nIG1zKTsKLWNoYXIgKmRnbmNfaW9jdGxfbmFtZShpbnQgY21kKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kaWdpLmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kaWdpLmgKaW5kZXggZDZlMGI5Zi4uZDYzN2E3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGlnaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RpZ2kuaApAQCAtMTEsMzYgKzExLDExIEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQogICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCiAgKi8KIAogI2lmbmRlZiBfX0RJR0lfSAogI2RlZmluZSBfX0RJR0lfSAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqCURlZmluaXRpb25zIGZvciBEaWdpIGRpdHR5KDEpIGNvbW1hbmQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgtOTYgRGlnaSBJbnRlcm5hdGlvbmFsIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYXBwbGljYXRpb24gYWNjZXNzIHRvIHNwZWNpYWwgRGlnaQotICogc2VyaWFsIGxpbmUgZW5oYW5jZW1lbnRzIHdoaWNoIGFyZSBub3Qgc3RhbmRhcmQgVU5JWCh0bSkgZmVhdHVyZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgIWRlZmluZWQoVElPQ01PREcpCi0KLSNkZWZpbmUJVElPQ01PREcJKCgnZCc8PDgpIHwgMjUwKQkvKiBnZXQgbW9kZW0gY3RybCBzdGF0ZQkqLwotI2RlZmluZQlUSU9DTU9EUwkoKCdkJzw8OCkgfCAyNTEpCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0KICNpZm5kZWYgVElPQ01fTEUKICNkZWZpbmUJCVRJT0NNX0xFCTB4MDEJCS8qIGxpbmUgZW5hYmxlCQkqLwogI2RlZmluZQkJVElPQ01fRFRSCTB4MDIJCS8qIGRhdGEgdGVybWluYWwgcmVhZHkJKi8KQEAgLTU1LDggKzMwLDYgQEAKICNkZWZpbmUJCVRJT0NNX0NECVRJT0NNX0NBUgkvKiBjYXJyaWVyIGRldGVjdCAoYWx0KQkqLwogI2VuZGlmCiAKLSNlbmRpZgotCiAjaWYgIWRlZmluZWQoVElPQ01TRVQpCiAjZGVmaW5lCVRJT0NNU0VUCSgoJ2QnPDw4KSB8IDI1MikJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KICNkZWZpbmUJVElPQ01HRVQJKCgnZCc8PDgpIHwgMjUzKQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLwpAQCAtNjcsODMgKzQwLDI0IEBACiAjZGVmaW5lCVRJT0NNQklTCSgoJ2QnPDw4KSB8IDI1NSkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUgKi8KICNlbmRpZgogCi0KLSNpZiAhZGVmaW5lZChUSU9DU0RUUikKLSNkZWZpbmUJVElPQ1NEVFIJKCgnZSc8PDgpIHwgMCkJCS8qIHNldCBEVFIJCSovCi0jZGVmaW5lCVRJT0NDRFRSCSgoJ2UnPDw4KSB8IDEpCQkvKiBjbGVhciBEVFIJCSovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW9jdGwgY29tbWFuZCBhcmd1bWVudHMgZm9yIERJR0kgcGFyYW1ldGVycy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIERJR0lfR0VUQQkoKCdlJzw8OCkgfCA5NCkJCS8qIFJlYWQgcGFyYW1zCQkqLwotCiAjZGVmaW5lIERJR0lfU0VUQQkoKCdlJzw8OCkgfCA5NSkJCS8qIFNldCBwYXJhbXMJCSovCiAjZGVmaW5lIERJR0lfU0VUQVcJKCgnZSc8PDgpIHwgOTYpCQkvKiBEcmFpbiAmIHNldCBwYXJhbXMJKi8KICNkZWZpbmUgRElHSV9TRVRBRgkoKCdlJzw8OCkgfCA5NykJCS8qIERyYWluLCBmbHVzaCAmIHNldCBwYXJhbXMgKi8KLQotI2RlZmluZSBESUdJX0tNRQkoKCdlJzw8OCkgfCA5OCkJCS8qIFJlYWQvV3JpdGUgSG9zdAkqLwotCQkJCQkJLyogQWRhcHRlciBNZW1vcnkJKi8KLQotI2RlZmluZQlESUdJX0dFVEZMT1cJKCgnZSc8PDgpIHwgOTkpCQkvKiBHZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KLQkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycwkgKi8KLSNkZWZpbmUJRElHSV9TRVRGTE9XCSgoJ2UnPDw4KSB8IDEwMCkJLyogU2V0IHN0YXJ0Yy9zdG9wYyBmbG93ICovCi0JCQkJCQkvKiBjb250cm9sIGNoYXJhY3RlcnMJICovCi0jZGVmaW5lCURJR0lfR0VUQUZMT1cJKCgnZSc8PDgpIHwgMTAxKQkvKiBHZXQgQXV4LiBzdGFydGMvc3RvcGMgKi8KLQkJCQkJCS8qIGZsb3cgY29udHJvbCBjaGFycwkgKi8KLSNkZWZpbmUJRElHSV9TRVRBRkxPVwkoKCdlJzw8OCkgfCAxMDIpCS8qIFNldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLwotCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzCSAqLwotCi0jZGVmaW5lIERJR0lfR0VERUxBWQkoKCdkJzw8OCkgfCAyNDYpCS8qIEdldCBlZGVsYXkgKi8KLSNkZWZpbmUgRElHSV9TRURFTEFZCSgoJ2QnPDw4KSB8IDI0NykJLyogU2V0IGVkZWxheSAqLwotCi1zdHJ1Y3QJZGlnaWZsb3dfdCB7Ci0JdW5zaWduZWQgY2hhcglzdGFydGM7CQkJCS8qIGZsb3cgY250bCBzdGFydCBjaGFyCSovCi0JdW5zaWduZWQgY2hhcglzdG9wYzsJCQkJLyogZmxvdyBjbnRsIHN0b3AgY2hhcgkqLwotfTsKLQotCi0jaWZkZWYJRkxPV18yMjAwCi0jZGVmaW5lCUYyMjAwX0dFVEEJKCgnZSc8PDgpIHwgMTA0KQkvKiBHZXQgMngzNiBmbG93IGNudGwgZmxhZ3MgKi8KLSNkZWZpbmUJRjIyMDBfU0VUQVcJKCgnZSc8PDgpIHwgMTA1KQkvKiBTZXQgMngzNiBmbG93IGNudGwgZmxhZ3MgKi8KLSNkZWZpbmUJCUYyMjAwX01BU0sJMHgwMwkJLyogMjIwMCBmbG93IGNudGwgYml0IG1hc2sgICovCi0jZGVmaW5lCQlGQ05UTF8yMjAwCTB4MDEJCS8qIDJ4MzYgdGVybWluYWwgZmxvdyBjbnRsICAqLwotI2RlZmluZQkJUENOVExfMjIwMAkweDAyCQkvKiAyeDM2IHByaW50ZXIgZmxvdyBjbnRsICAgKi8KLSNkZWZpbmUJRjIyMDBfWE9OCTB4ZjgKLSNkZWZpbmUJUDIyMDBfWE9OCTB4ZjkKLSNkZWZpbmUJRjIyMDBfWE9GRgkweGZhCi0jZGVmaW5lCVAyMjAwX1hPRkYJMHhmYgotCi0jZGVmaW5lCUZYT0ZGX01BU0sJMHgwMwkJCS8qIDIyMDAgZmxvdyBzdGF0dXMgbWFzayAgICAqLwotI2RlZmluZQlSQ1ZEX0ZYT0ZGCTB4MDEJCQkvKiAyeDM2IFRlcm1pbmFsIFhPRkYgcmN2ZCAgKi8KLSNkZWZpbmUJUkNWRF9QWE9GRgkweDAyCQkJLyogMngzNiBQcmludGVyIFhPRkYgcmN2ZCAgICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFsdWVzIGZvciBkaWdpX2ZsYWdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBESUdJX0lYT04JMHgwMDAxCQkvKiBIYW5kbGUgSVhPTiBpbiB0aGUgRkVQCSovCisjZGVmaW5lIERJR0lfR0VUX05JX0lORk8gKCgnZCc8PDgpIHwgMjUwKSAvKiBOb24taW50ZWxsaWdlbnQgc3RhdGUgaW5mbyAqLworI2RlZmluZSBESUdJX0xPT1BCQUNLICgoJ2QnPDw4KSB8IDI1MikgLyoKKwkJCQkJKiBFbmFibGUvZGlzYWJsZSBVQVJUCisJCQkJCSogaW50ZXJuYWwgbG9vcGJhY2sKKwkJCQkJKi8KICNkZWZpbmUgRElHSV9GQVNUCTB4MDAwMgkJLyogRmFzdCBiYXVkIHJhdGVzCQkqLwogI2RlZmluZSBSVFNQQUNFCQkweDAwMDQJCS8qIFJUUyBpbnB1dCBmbG93IGNvbnRyb2wJKi8KICNkZWZpbmUgQ1RTUEFDRQkJMHgwMDA4CQkvKiBDVFMgb3V0cHV0IGZsb3cgY29udHJvbAkqLwotI2RlZmluZSBEU1JQQUNFCQkweDAwMTAJCS8qIERTUiBvdXRwdXQgZmxvdyBjb250cm9sCSovCi0jZGVmaW5lIERDRFBBQ0UJCTB4MDAyMAkJLyogRENEIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgRFRSUEFDRQkJMHgwMDQwCQkvKiBEVFIgaW5wdXQgZmxvdyBjb250cm9sCSovCiAjZGVmaW5lIERJR0lfQ09PSwkweDAwODAJCS8qIENvb2tlZCBwcm9jZXNzaW5nIGRvbmUgaW4gRkVQICovCiAjZGVmaW5lIERJR0lfRk9SQ0VEQ0QJMHgwMTAwCQkvKiBGb3JjZSBjYXJyaWVyCQkqLwogI2RlZmluZQlESUdJX0FMVFBJTgkweDAyMDAJCS8qIEFsdGVybmF0ZSBSSi00NSBwaW4gY29uZmlnCSovCi0jZGVmaW5lCURJR0lfQUlYT04JMHgwNDAwCQkvKiBBdXggZmxvdyBjb250cm9sIGluIGZlcAkqLwogI2RlZmluZQlESUdJX1BSSU5URVIJMHgwODAwCQkvKiBIb2xkIHBvcnQgb3BlbiBmb3IgZmxvdyBjbnRybCovCi0jZGVmaW5lIERJR0lfUFBfSU5QVVQJMHgxMDAwCQkvKiBDaGFuZ2UgcGFyYWxsZWwgcG9ydCB0byBpbnB1dCovCiAjZGVmaW5lIERJR0lfRFRSX1RPR0dMRQkweDIwMDAJCS8qIFN1cHBvcnQgRFRSIFRvZ2dsZSAgICAgICAgICAgKi8KLSNkZWZpbmUgRElHSV80MjIJMHg0MDAwCQkvKiBmb3IgNDIyLzIzMiBzZWxlY3RhYmxlIHBhbmVsICovCiAjZGVmaW5lIERJR0lfUlRTX1RPR0dMRQkweDgwMDAJCS8qIFN1cHBvcnQgUlRTIFRvZ2dsZQkJKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhlc2Ugb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGUgY29teGkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZQlESUdJX0NPTVhJCShESUdJX0ZBU1R8RElHSV9DT09LfERTUlBBQ0V8RENEUEFDRXxEVFJQQUNFKQotCiAjZGVmaW5lIERJR0lfUExFTgkyOAkJLyogU3RyaW5nIGxlbmd0aAkJKi8KICNkZWZpbmUJRElHSV9UU0laCTEwCQkvKiBUZXJtaW5hbCBzdHJpbmcgbGVuCQkqLwogCkBAIC0xNjMsNzYgKzc3LDYgQEAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEtNRSBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lCVJXX0lETEUJCTAJLyogT3BlcmF0aW9uIGNvbXBsZXRlCQkJKi8KLSNkZWZpbmUJUldfUkVBRAkJMQkvKiBSZWFkIENvbmNlbnRyYXRvciBNZW1vcnkJCSovCi0jZGVmaW5lCVJXX1dSSVRFCTIJLyogV3JpdGUgQ29uY2VudHJhdG9yIE1lbW9yeQkJKi8KLQotc3RydWN0IHJ3X3QgewotCXVuc2lnbmVkIGNoYXIJcndfcmVxOwkJLyogUmVxdWVzdCB0eXBlCQkJKi8KLQl1bnNpZ25lZCBjaGFyCXJ3X2JvYXJkOwkvKiBIb3N0IEFkYXB0ZXIgYm9hcmQgbnVtYmVyCSovCi0JdW5zaWduZWQgY2hhcglyd19jb25jOwkvKiBDb25jZW50cmF0b3IgbnVtYmVyCQkqLwotCXVuc2lnbmVkIGNoYXIJcndfcmVzZXJ2ZWQ7CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24JKi8KLQl1bnNpZ25lZCBpbnQJcndfYWRkcjsJLyogQWRkcmVzcyBpbiBjb25jZW50cmF0b3IJKi8KLQl1bnNpZ25lZCBzaG9ydAlyd19zaXplOwkvKiBSZWFkL3dyaXRlIHJlcXVlc3QgbGVuZ3RoCSovCi0JdW5zaWduZWQgY2hhcglyd19kYXRhWzEyOF07CS8qIERhdGEgdG8gcmVhZC93cml0ZQkJKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2hyaW5rIEJ1ZmZlciBhbmQgQm9hcmQgSW5mb3JtYXRpb24gZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkvKiBCb2FyZCB0eXBlIHJldHVybiBjb2RlcyAqLwotI2RlZmluZQlQQ1hJX1RZUEUgMSAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWGkgKi8KLSNkZWZpbmUgUENYTV9UWVBFIDIgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1htICovCi0jZGVmaW5lCVBDWEVfVFlQRSAzICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YZSAqLwotI2RlZmluZQlNQ1hJX1RZUEUgNCAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgTUMvWGkgKi8KLSNkZWZpbmUgQ09NWElfVFlQRSA1ICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBDT00vWGkgKi8KLQotCQkJIC8qIE5vbi1aZXJvIFJlc3VsdCBjb2Rlcy4gKi8KLSNkZWZpbmUgUkVTVUxUX05PQkRGTkQgMSAvKiBBIERpZ2kgcHJvZHVjdCBhdCB0aGF0IHBvcnQgaXMgbm90IGNvbmZpZyBpbnN0YWxsZWQgKi8KLSNkZWZpbmUgUkVTVUxUX05PREVTQ1QgMiAvKiBBIG1lbW9yeSBkZXNjcmlwdG9yIHdhcyBub3Qgb2J0YWluYWJsZSAqLwotI2RlZmluZSBSRVNVTFRfTk9PU1NJRyAzIC8qIEZFUC9PUyBzaWduYXR1cmUgd2FzIG5vdCBkZXRlY3RlZCBvbiB0aGUgYm9hcmQgKi8KLSNkZWZpbmUgUkVTVUxUX1RPT1NNTCAgNCAvKiBUb28gc21hbGwgYW4gYXJlYSB0byBzaHJpbmsuICAqLwotI2RlZmluZSBSRVNVTFRfTk9DSEFOICA1IC8qIENoYW5uZWwgc3RydWN0dXJlIGZvciB0aGUgYm9hcmQgd2FzIG5vdCBmb3VuZCAqLwotCi1zdHJ1Y3Qgc2hyaW5rX2J1Zl9zdHJ1Y3QgewotCXVuc2lnbmVkIGludAlzaHJpbmtfYnVmX3ZhZGRyOwkvKiBWaXJ0dWFsIGFkZHJlc3Mgb2YgYm9hcmQgKi8KLQl1bnNpZ25lZCBpbnQJc2hyaW5rX2J1Zl9waHlzOwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGJvYXJkICovCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfYnNlZzsJLyogQW1vdW50IG9mIGJvYXJkIG1lbW9yeSAqLwotCXVuc2lnbmVkIGludAlzaHJpbmtfYnVmX2hzZWc7CS8qICcxODYgQmVnaW5uaW5nIG9mIER1YWwtUG9ydCAqLwotCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfbHNlZzsJLyogJzE4NiBCZWdpbm5pbmcgb2YgZnJlZWQgbWVtb3J5ICovCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfbXNlZzsJLyogTGluZWFyIGFkZHJlc3MgZnJvbSBzdGFydCBvZgotCQkJCQkJICAgZHVhbC1wb3J0IHdlcmUgZnJlZWQgbWVtb3J5Ci0JCQkJCQkgICBiZWdpbnMsIGhvc3Qgdmlld3BvaW50LiAqLwotCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfYmRwYXJhbTsJLyogUGFyYW1ldGVyIGZvciB4eG1lbW9uIGFuZAotCQkJCQkJICAgeHhtZW1vZmYgKi8KLQotCXVuc2lnbmVkIGludAlzaHJpbmtfYnVmX3Jlc2VydmE7CS8qIFJlc2VydmVkICovCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfcmVzZXJ2YjsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBpbnQJc2hyaW5rX2J1Zl9yZXNlcnZjOwkvKiBSZXNlcnZlZCAqLwotCXVuc2lnbmVkIGludAlzaHJpbmtfYnVmX3Jlc2VydmQ7CS8qIFJlc2VydmVkICovCi0KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfcmVzdWx0OwkvKiBSZWFzb24gZm9yIGNhbGwgZmFpbGluZwotCQkJCQkJICAgWmVybyBpcyBHb29kIHJldHVybiAqLwotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9pbml0OwkvKiBOb24tWmVybyBpZiBpdCBjYXVzZWQgYW4KLQkJCQkJCSAgIHh4aW5pdCBjYWxsLiAqLwotCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2FucG9ydHM7CS8qIE51bWJlciBvZiBhc3luYyBwb3J0cyAgKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfc25wb3J0czsJLyogTnVtYmVyIG9mIHN5bmMgIHBvcnRzICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX3R5cGU7CS8qIEJvYXJkIHR5cGUgMSA9IFBDL1hpLAotCQkJCQkJCSAgICAgIDIgPSBQQy9YbSwKLQkJCQkJCQkgICAgICAzID0gUEMvWGUKLQkJCQkJCQkgICAgICA0ID0gTUMvWGkKLQkJCQkJCQkgICAgICA1ID0gQ09NWC9pICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2NhcmQ7CS8qIENhcmQgbnVtYmVyICovCi0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFN0cnVjdHVyZSB0byBnZXQgZHJpdmVyIHN0YXR1cyBpbmZvcm1hdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0cnVjdCBkaWdpX2RpbmZvIHsKQEAgLTI2Myw1MiArMTA3LDYgQEAKIAogI2RlZmluZQlESUdJX0dFVEJECSgoJ2QnPDw4KSB8IDI0OSkJLyogZ2V0IGJvYXJkIGluZm8gICAgICAgICAgKi8KIAotc3RydWN0IGRpZ2lfc3RhdCB7Ci0JdW5zaWduZWQgaW50CWluZm9fY2hhbjsJCS8qIENoYW5uZWwgbnVtYmVyICgwIGJhc2VkKSAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19icmQ7CQkvKiBCb2FyZCBudW1iZXIgKDAgYmFzZWQpICAqLwotCXVuc2lnbmVkIGludAlpbmZvX2NmbGFnOwkJLyogY2ZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19pZmxhZzsJCS8qIGlmbGFnIGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgaW50CWluZm9fb2ZsYWc7CQkvKiBvZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGludAlpbmZvX21zdGF0OwkJLyogbXN0YXQgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb190eF9kYXRhOwkJLyogdHhfZGF0YSBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGludAlpbmZvX3J4X2RhdGE7CQkvKiByeF9kYXRhIGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgaW50CWluZm9faGZsb3c7CQkvKiBoZmxvdyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGludAlpbmZvX3Jlc2VydmVkWzhdOwkvKiBmb3IgZnV0dXJlIGV4cGFuc2lvbiAgICAqLwotfTsKLQotI2RlZmluZQlESUdJX0dFVFNUQVQJKCgnZCc8PDgpIHwgMjQ0KQkvKiBnZXQgYm9hcmQgaW5mbyAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFN0cnVjdHVyZSB1c2VkIHdpdGggaW9jdGwgY29tbWFuZHMgZm9yIHBlci1jaGFubmVsIGluZm9ybWF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBkaWdpX2NoIHsKLQl1bnNpZ25lZCBpbnQJaW5mb19iZG51bTsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgaW50CWluZm9fY2hhbm5lbDsJCS8qIENoYW5uZWwgaW5kZXggbnVtYmVyICAgICovCi0JdW5zaWduZWQgaW50CWluZm9fY2hfY2ZsYWc7CQkvKiBDaGFubmVsIGNmbGFnCSAgICovCi0JdW5zaWduZWQgaW50CWluZm9fY2hfaWZsYWc7CQkvKiBDaGFubmVsIGlmbGFnCSAgICovCi0JdW5zaWduZWQgaW50CWluZm9fY2hfb2ZsYWc7CQkvKiBDaGFubmVsIG9mbGFnCSAgICovCi0JdW5zaWduZWQgaW50CWluZm9fY2hzaXplOwkJLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgc2l6ZSAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19zbGVlcF9zdGF0OwkvKiBzbGVlcCBzdGF0dXMJCSAgICovCi0JZGV2X3QJCWluZm9fZGV2OwkJLyogZGV2aWNlIG51bWJlcgkgICAqLwotCXVuc2lnbmVkIGNoYXIJaW5mb19pbml0c3RhdGU7CQkvKiBDaGFubmVsIGluaXQgc3RhdGUJICAgKi8KLQl1bnNpZ25lZCBjaGFyCWluZm9fcnVubmluZzsJCS8qIENoYW5uZWwgcnVubmluZyBzdGF0ZSAgICovCi0JaW50CQlyZXNlcnZlZFs4XTsJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi19OwotCi0vKgotKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHdpdGggdGhlIERJR0lfRkVQQ01EIGlvY3RsIHRvCi0qIHRlbGwgdGhlIGRyaXZlciB3aGljaCBwb3J0IHRvIHNlbmQgdGhlIGNvbW1hbmQgZm9yLgotKi8KLXN0cnVjdCBkaWdpX2NtZCB7Ci0JaW50CWNtZDsKLQlpbnQJd29yZDsKLQlpbnQJbmNtZHM7Ci0JaW50CWNoYW47IC8qIGNoYW5uZWwgaW5kZXggKHplcm8gYmFzZWQpICovCi0JaW50CWJkaWQ7IC8qIGJvYXJkIGluZGV4ICh6ZXJvIGJhc2VkKSAqLwotfTsKLQotCiBzdHJ1Y3QgZGlnaV9nZXRidWZmZXIgLyogU3RydWN0IGZvciBob2xkaW5nIGJ1ZmZlciB1c2UgY291bnRzICovCiB7CiAJdW5zaWduZWQgbG9uZyB0SW47CkBAIC0zMjgsNjMgKzEyNiw5IEBACiAJdW5zaWduZWQgbG9uZyB0Ynl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgZnVsbHkgKi8KIH07CiAKLS8qCi0qICBpbmZvX3NsZWVwX3N0YXQgZGVmaW5lcwotKi8KLSNkZWZpbmUgSU5GT19SVU5XQUlUCTB4MDAwMQotI2RlZmluZSBJTkZPX1dPUEVOCTB4MDAwMgotI2RlZmluZSBJTkZPX1RUSU9XCTB4MDAwNAotI2RlZmluZSBJTkZPX0NIX1JXQUlUCTB4MDAwOAotI2RlZmluZSBJTkZPX0NIX1dFTVBUWQkweDAwMTAKLSNkZWZpbmUgSU5GT19DSF9XTE9XCTB4MDAyMAotI2RlZmluZSBJTkZPX1hYQlVGX0JVU1kgMHgwMDQwCi0KLSNkZWZpbmUJRElHSV9HRVRDSAkoKCdkJzw8OCkgfCAyNDUpCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCi0KLS8qIEJvYXJkIHR5cGUgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZQlTVUJUWVBFCQkwMDA3Ci0jZGVmaW5lCVRfUENYSQkJMDAwMAotI2RlZmluZSBUX1BDWE0JCTAwMDEKLSNkZWZpbmUgVF9QQ1hFCQkwMDAyCi0jZGVmaW5lIFRfUENYUgkJMDAwMwotI2RlZmluZSBUX1NQCQkwMDA0Ci0jZGVmaW5lIFRfU1BfUExVUwkwMDA1Ci0jCWRlZmluZSBUX0hFUkMJMDAwMAotIwlkZWZpbmUgVF9IT1UJMDAwMQotIwlkZWZpbmUgVF9MT04JMDAwMgotIwlkZWZpbmUgVF9DSEEJMDAwMwotI2RlZmluZSBGQU1JTFkJCTAwNzAKLSNkZWZpbmUgVF9DT01YSQkJMDAwMAotI2RlZmluZSBUX1BDWFgJCTAwMTAKLSNkZWZpbmUgVF9DWAkJMDAyMAotI2RlZmluZSBUX0VQQwkJMDAzMAotI2RlZmluZQlUX1BDTElURQkwMDQwCi0jZGVmaW5lCVRfU1BYWAkJMDA1MAotI2RlZmluZQlUX0FWWFgJCTAwNjAKLSNkZWZpbmUgVF9EWEIJCTAwNzAKLSNkZWZpbmUgVF9BMktfNF84CTAwNzAKLSNkZWZpbmUgQlVTVFlQRQkJMDcwMAotI2RlZmluZSBUX0lTQUJVUwkwMDAwCi0jZGVmaW5lIFRfTUNCVVMJCTAxMDAKLSNkZWZpbmUJVF9FSVNBQlVTCTAyMDAKLSNkZWZpbmUJVF9QQ0lCVVMJMDQwMAotCiAvKiBCb2FyZCBTdGF0ZSBEZWZpbml0aW9ucyAqLwotCiAjZGVmaW5lCUJEX1JVTk5JTkcJMHgwCi0jZGVmaW5lCUJEX1JFQVNPTgkweDdmCi0jZGVmaW5lCUJEX05PVEZPVU5ECTB4MQotI2RlZmluZQlCRF9OT0lPUE9SVAkweDIKLSNkZWZpbmUJQkRfTk9NRU0JMHgzCi0jZGVmaW5lCUJEX05PQklPUwkweDQKICNkZWZpbmUJQkRfTk9GRVAJMHg1Ci0jZGVmaW5lCUJEX0ZBSUxFRAkweDYKLSNkZWZpbmUgQkRfQUxMT0NBVEVECTB4NwotI2RlZmluZSBCRF9UUklCT09UCTB4OAotI2RlZmluZQlCRF9CQURLTUUJMHg4MAotCi0jZGVmaW5lIERJR0lfU1BPTEwgICAgICAgICAgICAoKCdkJzw8OCkgfCAyNTQpICAvKiBjaGFuZ2UgcG9sbGVyIHJhdGUgICAqLwogCiAjZGVmaW5lIERJR0lfU0VUQ1VTVE9NQkFVRAlfSU9XKCdlJywgMTA2LCBpbnQpCS8qIFNldCBpbnRlZ2VyIGJhdWQgcmF0ZSAqLwogI2RlZmluZSBESUdJX0dFVENVU1RPTUJBVUQJX0lPUignZScsIDEwNywgaW50KQkvKiBHZXQgaW50ZWdlciBiYXVkIHJhdGUgKi8KQEAgLTM5NiwyMCArMTQwLDQwIEBACiAKICNkZWZpbmUgRVZfT1BVCQkweDAwMDEJCS8qICE8T3V0cHV0IHBhdXNlZCBieSBjbGllbnQgKi8KICNkZWZpbmUgRVZfT1BTCQkweDAwMDIJCS8qICE8T3V0cHV0IHBhdXNlZCBieSByZXF1bGFyIHN3IGZsb3djdHJsICovCi0jZGVmaW5lIEVWX09QWAkJMHgwMDA0CQkvKiAhPE91dHB1dCBwYXVzZWQgYnkgZXh0cmEgc3cgZmxvd2N0cmwgKi8KLSNkZWZpbmUgRVZfT1BICQkweDAwMDgJCS8qICE8T3V0cHV0IHBhdXNlZCBieSBodyBmbG93Y3RybCAqLwotI2RlZmluZSBFVl9PUFQJCTB4MDgwMAkJLyogITxPdXRwdXQgcGF1c2VkIGZvciBSVFMgVG9nZ2xlIHByZWRlbGF5ICovCi0KICNkZWZpbmUgRVZfSVBVCQkweDAwMTAJCS8qICE8SW5wdXQgcGF1c2VkIHVuY29uZGl0aW9uYWxseSBieSB1c2VyICovCiAjZGVmaW5lIEVWX0lQUwkJMHgwMDIwCQkvKiAhPElucHV0IHBhdXNlZCBieSBoaWdoL2xvdyB3YXRlciBtYXJrcyAqLwotI2RlZmluZSBFVl9JUEEJCTB4MDQwMAkJLyogITxJbnB1dCBwYXVzZWQgYnkgcGF0dGVybiBhbGFybSBtb2R1bGUgKi8KLQogI2RlZmluZSBFVl9UWEIJCTB4MDA0MAkJLyogITxUcmFuc21pdCBicmVhayBwZW5kaW5nICovCi0jZGVmaW5lIEVWX1RYSQkJMHgwMDgwCQkvKiAhPFRyYW5zbWl0IGltbWVkaWF0ZSBwZW5kaW5nICovCi0jZGVmaW5lIEVWX1RYRgkJMHgwMTAwCQkvKiAhPFRyYW5zbWl0IGZsb3djdHJsIGNoYXIgcGVuZGluZyAqLwotI2RlZmluZSBFVl9SWEIJCTB4MDIwMAkJLyogITxCcmVhayByZWNlaXZlZCAqLwogCi0jZGVmaW5lIEVWX09QQUxMCTB4MDgwZgkJLyogITxPdXRwdXQgcGF1c2UgZmxhZ3MgKi8KLSNkZWZpbmUgRVZfSVBBTEwJMHgwNDMwCQkvKiAhPElucHV0IHBhdXNlIGZsYWdzICovCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgZGF0YSBuZWVkZWQgZm9yIHRoZSBpbnRlbGxpZ2VudCA8LS0+IG5vbmludGVsbGlnZW50CisgKiBEUEEgdHJhbnNsYXRpb24KKyAqLworc3RydWN0IG5pX2luZm8geworCWludCBib2FyZDsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgZHRyOworCWludCBydHM7CisJaW50IGN0czsKKwlpbnQgZHNyOworCWludCByaTsKKwlpbnQgZGNkOworCWludCBjdXJ0eDsKKwlpbnQgY3Vycng7CisJdW5zaWduZWQgc2hvcnQgaWZsYWc7CisJdW5zaWduZWQgc2hvcnQgb2ZsYWc7CisJdW5zaWduZWQgc2hvcnQgY2ZsYWc7CisJdW5zaWduZWQgc2hvcnQgbGZsYWc7CisJdW5zaWduZWQgaW50IG1zdGF0OworCXVuc2lnbmVkIGNoYXIgaGZsb3c7CisJdW5zaWduZWQgY2hhciB4bWl0X3N0b3BwZWQ7CisJdW5zaWduZWQgY2hhciByZWN2X3N0b3BwZWQ7CisJdW5zaWduZWQgaW50IGJhdWQ7Cit9OwogCisjZGVmaW5lIFRfQ0xBU1NJQyAwMDAyCisjZGVmaW5lIFRfUENJQlVTIDA0MDAKKyNkZWZpbmUgVF9ORU9fRVhQUkVTUyAwMDAxCisjZGVmaW5lIFRfTkVPIDAwMDAKKworI2RlZmluZSBUVFlfRkxJUEJVRl9TSVpFIDUxMgogI2VuZGlmIC8qIERJR0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZHBhY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kcGFjb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjYjM5NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kcGFjb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKiAgICAgIFNjb3R0IEggS2lsYXUgPFNjb3R0X0tpbGF1IGF0IGRpZ2kgZG90IGNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKLSAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqICAgICAgTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKi8KLQotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgZGF0YSBuZWVkZWQgZm9yIHRoZSBpbnRlbGxpZ2VudCA8LS0+IG5vbmludGVsbGlnZW50Ci0gKiBEUEEgdHJhbnNsYXRpb24KLSAqLwotc3RydWN0IG5pX2luZm8gewotCWludCBib2FyZDsKLQlpbnQgY2hhbm5lbDsKLQlpbnQgZHRyOwotCWludCBydHM7Ci0JaW50IGN0czsKLQlpbnQgZHNyOwotCWludCByaTsKLQlpbnQgZGNkOwotCWludCBjdXJ0eDsKLQlpbnQgY3Vycng7Ci0JdW5zaWduZWQgc2hvcnQgaWZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgb2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgY2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgbGZsYWc7Ci0KLQl1bnNpZ25lZCBpbnQgbXN0YXQ7Ci0JdW5zaWduZWQgY2hhciBoZmxvdzsKLQotCXVuc2lnbmVkIGNoYXIgeG1pdF9zdG9wcGVkOwotCXVuc2lnbmVkIGNoYXIgcmVjdl9zdG9wcGVkOwotCi0JdW5zaWduZWQgaW50IGJhdWQ7Ci19OwotCi0jZGVmaW5lIFJXX1JFQUQJCTEKLSNkZWZpbmUgUldfV1JJVEUgICAgICAgIDIKLSNkZWZpbmUgRElHSV9LTUUgICAgICAgICgoJ2UnPDw4KSB8IDk4KSAgICAgICAgIC8qIFJlYWQvV3JpdGUgSG9zdCAqLwotCi0jZGVmaW5lIFNVQlRZUEUgICAgICAgICAwMDA3Ci0jZGVmaW5lIFRfUENYSSAgICAgICAgICAwMDAwCi0jZGVmaW5lIFRfUENYRU0gICAgICAgICAwMDAxCi0jZGVmaW5lIFRfUENYRSAgICAgICAgICAwMDAyCi0jZGVmaW5lIFRfUENYUiAgICAgICAgICAwMDAzCi0jZGVmaW5lIFRfU1AgICAgICAgICAgICAwMDA0Ci0jZGVmaW5lIFRfU1BfUExVUyAgICAgICAwMDA1Ci0KLSNkZWZpbmUgVF9IRVJDICAgMDAwMAotI2RlZmluZSBUX0hPVSAgICAwMDAxCi0jZGVmaW5lIFRfTE9OICAgIDAwMDIKLSNkZWZpbmUgVF9DSEEgICAgMDAwMwotCi0jZGVmaW5lIFRfTkVPCSAwMDAwCi0jZGVmaW5lIFRfTkVPX0VYUFJFU1MgIDAwMDEKLSNkZWZpbmUgVF9DTEFTU0lDIDAwMDIKLQotI2RlZmluZSBGQU1JTFkgICAgICAgICAgMDA3MAotI2RlZmluZSBUX0NPTVhJICAgICAgICAgMDAwMAotI2RlZmluZQlUX05JCQkwMDAwCi0jZGVmaW5lIFRfUENYWCAgICAgICAgICAwMDEwCi0jZGVmaW5lIFRfQ1ggICAgICAgICAgICAwMDIwCi0jZGVmaW5lIFRfRVBDICAgICAgICAgICAwMDMwCi0jZGVmaW5lIFRfUENMSVRFICAgICAgICAwMDQwCi0jZGVmaW5lIFRfU1BYWCAgICAgICAgICAwMDUwCi0jZGVmaW5lIFRfQVZYWCAgICAgICAgICAwMDYwCi0jZGVmaW5lIFRfRFhCICAgICAgICAgICAwMDcwCi0jZGVmaW5lIFRfQTJLXzRfOCAgICAgICAwMDcwCi0KLSNkZWZpbmUgQlVTVFlQRSAgICAgICAgIDA3MDAKLSNkZWZpbmUgVF9JU0FCVVMgICAgICAgIDAwMDAKLSNkZWZpbmUgVF9NQ0JVUyAgICAgICAgIDAxMDAKLSNkZWZpbmUgVF9FSVNBQlVTICAgICAgIDAyMDAKLSNkZWZpbmUgVF9QQ0lCVVMgICAgICAgIDA0MDAKLQotLyogQm9hcmQgU3RhdGUgRGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBCRF9SVU5OSU5HICAgICAgMHgwCi0jZGVmaW5lIEJEX1JFQVNPTiAgICAgICAweDdmCi0jZGVmaW5lIEJEX05PVEZPVU5EICAgICAweDEKLSNkZWZpbmUgQkRfTk9JT1BPUlQgICAgIDB4MgotI2RlZmluZSBCRF9OT01FTSAgICAgICAgMHgzCi0jZGVmaW5lIEJEX05PQklPUyAgICAgICAweDQKLSNkZWZpbmUgQkRfTk9GRVAgICAgICAgIDB4NQotI2RlZmluZSBCRF9GQUlMRUQgICAgICAgMHg2Ci0jZGVmaW5lIEJEX0FMTE9DQVRFRCAgICAweDcKLSNkZWZpbmUgQkRfVFJJQk9PVCAgICAgIDB4OAotI2RlZmluZSBCRF9CQURLTUUgICAgICAgMHg4MAotCi0jZGVmaW5lIERJR0lfQUlYT04gICAgICAweDA0MDAgICAgICAgICAgLyogQXV4IGZsb3cgY29udHJvbCBpbiBmZXAgKi8KLQotLyogSW9jdGxzIG5lZWRlZCBmb3IgZHBhIG9wZXJhdGlvbiAqLwotCi0jZGVmaW5lIERJR0lfR0VUREQgICAgICAoKCdkJzw8OCkgfCAyNDgpICAgICAgIC8qIGdldCBkcml2ZXIgaW5mbyAgICAgICovCi0jZGVmaW5lIERJR0lfR0VUQkQgICAgICAoKCdkJzw8OCkgfCAyNDkpICAgICAgIC8qIGdldCBib2FyZCBpbmZvICAgICAgICovCi0jZGVmaW5lIERJR0lfR0VUX05JX0lORk8gKCgnZCc8PDgpIHwgMjUwKQkvKiBub25pbnRlbGxpZ2VudCBzdGF0ZSBzbmZvICovCi0KLS8qIE90aGVyIHNwZWNpYWwgaW9jdGxzICovCi0jZGVmaW5lIERJR0lfVElNRVJJUlEgKCgnZCc8PDgpIHwgMjUxKQkJLyogRW5hYmxlL2Rpc2FibGUgUlNfVElNRVIgdXNlICovCi0jZGVmaW5lIERJR0lfTE9PUEJBQ0sgKCgnZCc8PDgpIHwgMjUyKQkJLyogRW5hYmxlL2Rpc2FibGUgVUFSVCBpbnRlcm5hbCBsb29wYmFjayAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL2VteHhfdWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYwppbmRleCA0YmU2NDZjLi5mYmY4MmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYwpAQCAtMTE1LDcgKzExNSw3IEBACiAJcHJfaW5mbygiPT09ICVzKClcbiIsIF9fZnVuY19fKTsKIAogCWlmICh1ZGMgPT0gTlVMTCkgewotCQlFUlIoIiVzIHVkYyA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXMgdWRjID09IE5VTExcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjAxLDcgKzIwMSw3IEBACiAJdTMyCQludW0sIGJ1Zl90eXBlOwogCXUzMgkJZGF0YSwgbGFzdF9yYW1fYWRyLCB1c2VfcmFtX3NpemU7CiAKLQlQVF9FUF9SRUdTCXBfZXBfcmVnczsKKwlzdHJ1Y3QgZXBfcmVncyAqcF9lcF9yZWdzOwogCiAJbGFzdF9yYW1fYWRyID0gKERfUkFNX1NJWkVfQ1RSTCAvIHNpemVvZih1MzIpKSAqIDI7CiAJdXNlX3JhbV9zaXplID0gMDsKQEAgLTM5NCw3ICszOTQsNyBAQAogewogCXUzMgkJbnVtOwogCXUzMgkJZGF0YTsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKHVkYy0+dmJ1c19hY3RpdmUgPT0gMCkKIAkJcmV0dXJuOwkJLyogVkJVUyBPRkYgKi8KQEAgLTQyNSw3ICs0MjUsNyBAQAogLyogQWJvcnQgRE1BICovCiBzdGF0aWMgdm9pZCBfbmJ1MnNzX2VwX2RtYV9hYm9ydChzdHJ1Y3QgbmJ1MnNzX3VkYyAqdWRjLCBzdHJ1Y3QgbmJ1MnNzX2VwICplcCkKIHsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJX25idTJzc19iaXRjbHIoJnByZWctPkVQX0RDUltlcC0+ZXBudW0tMV0uRVBfRENSMSwgRENSMV9FUG5fUkVRRU4pOwogCW1kZWxheShETUFfRElTQUJMRV9USU1FKTsJLyogRENSMV9FUG5fUkVRRU4gQ2xlYXIgKi8KQEAgLTQ0Myw3ICs0NDMsNyBAQAogewogCXUzMgkJZGF0YTsKIAl1MzIJCW51bTsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKGxlbmd0aCA+PSBzaXplb2YodTMyKSkKIAkJcmV0dXJuOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJdTMyCQlpOwogCWludAkJbnJldCAgID0gMDsKIAl1MzIJCWlXb3JkTGVuZ3RoID0gMDsKLQlVU0JfUkVHX0FDQ0VTUyAqcEJ1ZjMyID0gKFVTQl9SRUdfQUNDRVNTICopcEJ1ZjsKKwl1bmlvbiB1c2JfcmVnX2FjY2VzcyAqcEJ1ZjMyID0gKHVuaW9uIHVzYl9yZWdfYWNjZXNzICopcEJ1ZjsKIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAkvKiBSZWFkIExlbmd0aCAqLwpAQCAtNTkyLDggKzU5Miw4IEBACiB7CiAJdTMyCQlpOwogCXUzMgkJaVJlYWRTaXplID0gMDsKLQlVU0JfUkVHX0FDQ0VTUyAgVGVtcDMyOwotCVVTQl9SRUdfQUNDRVNTICpwQnVmMzIgPSAoVVNCX1JFR19BQ0NFU1MgKilwQnVmOworCXVuaW9uIHVzYl9yZWdfYWNjZXNzICBUZW1wMzI7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MgICpwQnVmMzIgPSAodW5pb24gdXNiX3JlZ19hY2Nlc3MgKilwQnVmOwogCiAJaWYgKCgwIDwgbGVuZ3RoKSAmJiAobGVuZ3RoIDwgc2l6ZW9mKHUzMikpKSB7CiAJCVRlbXAzMi5kdyA9IF9uYnUyc3NfcmVhZGwoJnVkYy0+cF9yZWdzLT5FUDBfUkVBRCk7CkBAIC02MTMsNyArNjEzLDcgQEAKIAl1MzIJCWlNYXhMZW5ndGggICA9IEVQMF9QQUNLRVRTSVpFOwogCXUzMgkJaVdvcmRMZW5ndGggID0gMDsKIAl1MzIJCWlXcml0ZUxlbmd0aCA9IDA7Ci0JVVNCX1JFR19BQ0NFU1MgKnBCdWYzMiA9IChVU0JfUkVHX0FDQ0VTUyAqKXBCdWY7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MgICpwQnVmMzIgPSAodW5pb24gdXNiX3JlZ19hY2Nlc3MgKilwQnVmOwogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCS8qIFRyYW5zZmVyIExlbmd0aCAqLwpAQCAtNjM4LDggKzYzOCw4IEBACiBzdGF0aWMgaW50IEVQMF9pbl9PdmVyQnl0ZXMoc3RydWN0IG5idTJzc191ZGMgKnVkYywgdTggKnBCdWYsIHUzMiBpUmVtYWluU2l6ZSkKIHsKIAl1MzIJCWk7Ci0JVVNCX1JFR19BQ0NFU1MgVGVtcDMyOwotCVVTQl9SRUdfQUNDRVNTICpwQnVmMzIgPSAoVVNCX1JFR19BQ0NFU1MgKilwQnVmOworCXVuaW9uIHVzYl9yZWdfYWNjZXNzICBUZW1wMzI7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MgICpwQnVmMzIgPSAodW5pb24gdXNiX3JlZ19hY2Nlc3MgKilwQnVmOwogCiAJaWYgKCgwIDwgaVJlbWFpblNpemUpICYmIChpUmVtYWluU2l6ZSA8IHNpemVvZih1MzIpKSkgewogCQlmb3IgKGkgPSAwIDsgaSA8IGlSZW1haW5TaXplIDsgaSsrKQpAQCAtODA4LDcgKzgwOCw3IEBACiAJCXJldHVybiAwOwkJLyogU2hvcnQgUGFja2V0IFRyYW5zZmVyIEVuZCAqLwogCiAJaWYgKHJlcS0+cmVxLmFjdHVhbCA+IHJlcS0+cmVxLmxlbmd0aCkgewotCQlFUlIoIiAqKiogT3ZlcnJ1biBFcnJvclxuIik7CisJCWRldl9lcnIodWRjLT5kZXYsICIgKioqIE92ZXJydW4gRXJyb3JcbiIpOwogCQlyZXR1cm4gLUVPVkVSRkxPVzsKIAl9CiAKQEAgLTg0MCw3ICs4NDAsNyBAQAogCXUzMgkJYnVyc3QgPSAxOwogCXUzMgkJZGF0YTsKIAlpbnQJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JUFRfRkNfUkVHUwlwcmVnID0gdWRjLT5wX3JlZ3M7CisJc3RydWN0IGZjX3JlZ3MJKnByZWcgPSB1ZGMtPnBfcmVnczsKIAogCWlmIChyZXEtPmRtYV9mbGFnKQogCQlyZXR1cm4gMTsJCS8qIERNQSBpcyBmb3J3YXJkZWQgKi8KQEAgLTkwMCwxMCArOTAwLDEwIEBACiAJdTMyCQlpOwogCXUzMgkJZGF0YTsKIAl1MzIJCWlXb3JkTGVuZ3RoOwotCVVTQl9SRUdfQUNDRVNTCVRlbXAzMjsKLQlVU0JfUkVHX0FDQ0VTUwkqcEJ1ZjMyOworCXVuaW9uIHVzYl9yZWdfYWNjZXNzCVRlbXAzMjsKKwl1bmlvbiB1c2JfcmVnX2FjY2VzcwkqcEJ1ZjMyOwogCWludAkJcmVzdWx0ID0gMDsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKHJlcS0+ZG1hX2ZsYWcpCiAJCXJldHVybiAxOwkJLyogRE1BIGlzIGZvcndhcmRlZCAqLwpAQCAtOTEyLDcgKzkxMiw3IEBACiAJCXJldHVybiAwOwogCiAJcEJ1ZmZlciA9ICh1OCAqKXJlcS0+cmVxLmJ1ZjsKLQlwQnVmMzIgPSAoVVNCX1JFR19BQ0NFU1MgKikocEJ1ZmZlciArIHJlcS0+cmVxLmFjdHVhbCk7CisJcEJ1ZjMyID0gKHVuaW9uIHVzYl9yZWdfYWNjZXNzICopKHBCdWZmZXIgKyByZXEtPnJlcS5hY3R1YWwpOwogCiAJaVdvcmRMZW5ndGggPSBsZW5ndGggLyBzaXplb2YodTMyKTsKIAlpZiAoaVdvcmRMZW5ndGggPiAwKSB7CkBAIC05ODgsNyArOTg4LDcgQEAKIAl1MzIJCW51bTsKIAl1MzIJCWlSZWN2TGVuZ3RoOwogCWludAkJcmVzdWx0ID0gMTsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKGVwLT5lcG51bSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMjYsOCArMTAyNiw4IEBACiAJfQogCiAJaWYgKHJlcS0+cmVxLmFjdHVhbCA+IHJlcS0+cmVxLmxlbmd0aCkgewotCQlFUlIoIiAqKiogT3ZlcnJ1biBFcnJvclxuIik7Ci0JCUVSUigiICoqKiBhY3R1YWwgPSAlZCwgbGVuZ3RoID0gJWRcbiIsCisJCWRldl9lcnIodWRjLT5kZXYsICIgT3ZlcnJ1biBFcnJvclxuIik7CisJCWRldl9lcnIodWRjLT5kZXYsICIgYWN0dWFsID0gJWQsIGxlbmd0aCA9ICVkXG4iLAogCQkJcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgpOwogCQlyZXN1bHQgPSAtRU9WRVJGTE9XOwogCX0KQEAgLTEwNTEsNyArMTA1MSw3IEBACiAJdTMyCQlpV3JpdGVMZW5ndGg7CiAJdTMyCQlkYXRhOwogCWludAkJcmVzdWx0ID0gLUVJTlZBTDsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKHJlcS0+ZG1hX2ZsYWcpCiAJCXJldHVybiAxOwkJLyogRE1BIGlzIGZvcndhcmRlZCAqLwpAQCAtMTEyMywxNyArMTEyMywxNyBAQAogCXUzMgkJaTsKIAl1MzIJCWRhdGE7CiAJdTMyCQlpV29yZExlbmd0aDsKLQlVU0JfUkVHX0FDQ0VTUwlUZW1wMzI7Ci0JVVNCX1JFR19BQ0NFU1MJKnBCdWYzMiA9IE5VTEw7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MJVGVtcDMyOworCXVuaW9uIHVzYl9yZWdfYWNjZXNzCSpwQnVmMzIgPSBOVUxMOwogCWludAkJcmVzdWx0ID0gMDsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKHJlcS0+ZG1hX2ZsYWcpCiAJCXJldHVybiAxOwkJLyogRE1BIGlzIGZvcndhcmRlZCAqLwogCiAJaWYgKGxlbmd0aCA+IDApIHsKIAkJcEJ1ZmZlciA9ICh1OCAqKXJlcS0+cmVxLmJ1ZjsKLQkJcEJ1ZjMyID0gKFVTQl9SRUdfQUNDRVNTICopKHBCdWZmZXIgKyByZXEtPnJlcS5hY3R1YWwpOworCQlwQnVmMzIgPSAodW5pb24gdXNiX3JlZ19hY2Nlc3MgKikocEJ1ZmZlciArIHJlcS0+cmVxLmFjdHVhbCk7CiAKIAkJaVdvcmRMZW5ndGggPSBsZW5ndGggLyBzaXplb2YodTMyKTsKIAkJaWYgKGlXb3JkTGVuZ3RoID4gMCkgewpAQCAtMTM0Nyw3ICsxMzQ3LDcgQEAKIAl1OAkJbnVtLCBlcG51bTsKIAl1MzIJCWRhdGE7CiAJc3RydWN0IG5idTJzc19lcCAqZXA7Ci0JUFRfRkNfUkVHUwlwcmVnID0gdWRjLT5wX3JlZ3M7CisJc3RydWN0IGZjX3JlZ3MJKnByZWcgPSB1ZGMtPnBfcmVnczsKIAogCWlmICgoZXBfYWRycyA9PSAwKSB8fCAoZXBfYWRycyA9PSAweDgwKSkgewogCQlpZiAoYnN0YWxsKSB7CkBAIC0xNDI2LDcgKzE0MjYsNyBAQAogCWlmIChtb2RlID4gTUFYX1RFU1RfTU9ERV9OVU0pCiAJCXJldHVybjsKIAotCXByX2luZm8oIlNFVCBGRUFUVVJFIDogdGVzdCBtb2RlID0gJWRcbiIsIG1vZGUpOworCWRldl9pbmZvKHVkYy0+ZGV2LCAiU0VUIEZFQVRVUkUgOiB0ZXN0IG1vZGUgPSAlZFxuIiwgbW9kZSk7CiAKIAlkYXRhID0gX25idTJzc19yZWFkbCgmdWRjLT5wX3JlZ3MtPlVTQl9DT05UUk9MKTsKIAlkYXRhICY9IH5URVNUX0ZPUkNFX0VOQUJMRTsKQEAgLTE0NTQsNyArMTQ1NCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBVU0JfREVWSUNFX1RFU1RfTU9ERToKLQkJd0luZGV4ID0gd0luZGV4ID4+IDg7CisJCXdJbmRleCA+Pj0gODsKIAkJaWYgKHdJbmRleCA8PSBNQVhfVEVTVF9NT0RFX05VTSkKIAkJCXJlc3VsdCA9IDA7CiAJCWJyZWFrOwpAQCAtMTQ3MSw3ICsxNDcxLDcgQEAKIHsKIAl1OAkJZXBudW07CiAJdTMyCQlkYXRhID0gMCwgYml0X2RhdGE7Ci0JUFRfRkNfUkVHUwlwcmVnID0gdWRjLT5wX3JlZ3M7CisJc3RydWN0IGZjX3JlZ3MJKnByZWcgPSB1ZGMtPnBfcmVnczsKIAogCWVwbnVtID0gZXBfYWRycyAmIH5VU0JfRU5EUE9JTlRfRElSX01BU0s7CiAJaWYgKGVwbnVtID09IDApIHsKQEAgLTE1NjYsNyArMTU2Niw3IEBACiAJdTMyCXJlZ2RhdGE7CiAJaW50CWxpbWl0X2NudCA9IDA7CiAKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKGVwLT5kaXJlY3QgPT0gVVNCX0RJUl9JTikgewogCQlmb3IgKGxpbWl0X2NudCA9IDAKQEAgLTE2MzgsNyArMTYzOCw3IEBACiAJCV9uYnUyc3NfZXAwX2luX3RyYW5zZmVyKHVkYywgJnVkYy0+ZXBbMF0sICZ1ZGMtPmVwMF9yZXEpOwogCiAJfSBlbHNlIHsKLQkJRVJSKCIqKiogRXJyb3IgR0VUX1NUQVRVU1xuIik7CisJCWRldl9lcnIodWRjLT5kZXYsICIgRXJyb3IgR0VUX1NUQVRVU1xuIik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTE2NzEsNyArMTY3MSw3IEBACiAJaWYgKHdWYWx1ZSAhPSAod1ZhbHVlICYgMHgwMDdGKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl3VmFsdWUgPSB3VmFsdWUgPDwgVVNCX0FEUlNfU0hJRlQ7CisJd1ZhbHVlIDw8PSBVU0JfQURSU19TSElGVDsKIAogCV9uYnUyc3Nfd3JpdGVsKCZ1ZGMtPnBfcmVncy0+VVNCX0FERFJFU1MsIHdWYWx1ZSk7CiAJX25idTJzc19jcmVhdGVfZXAwX3BhY2tldCh1ZGMsIHVkYy0+ZXAwX2J1ZiwgMCk7CkBAIC0xODg1LDggKzE4ODUsOCBAQAogCQkJfCBTVEdfRU5EX0lOVCB8IEVQMF9PVVRfTlVMTF9JTlQpOwogCiAJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCXByX2luZm8oIi0tLSAlcyBOb3QgRGVjb2RlIEludGVycnVwdFxuIiwgX19mdW5jX18pOwotCQlwcl9pbmZvKCItLS0gRVAwX1NUQVRVUyA9IDB4JTA4eFxuIiwgaW50cik7CisJCWRldl9pbmZvKHVkYy0+ZGV2LCAiJXMgTm90IERlY29kZSBJbnRlcnJ1cHRcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2luZm8odWRjLT5kZXYsICJFUDBfU1RBVFVTID0gMHglMDh4XG4iLCBpbnRyKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTk5NCw3ICsxOTk0LDcgQEAKIAlpbnQJcmVzdWx0ID0gMDsKIAl1MzIJc3RhdHVzOwogCi0JUFRfRkNfUkVHUwlwcmVnID0gdWRjLT5wX3JlZ3M7CisJc3RydWN0IGZjX3JlZ3MJKnByZWcgPSB1ZGMtPnBfcmVnczsKIAogCWlmIChyZXEtPmRtYV9mbGFnKQogCQlyZXR1cm47CQkvKiBETUEgaXMgZm9yd2FyZGVkICovCkBAIC0yMDkwLDcgKzIwOTAsNyBAQAogCXUzMgkJbnVtOwogCXUzMgkJZG1hY250LCBlcF9kbWFjbnQ7CiAJdTMyCQltcGt0OwotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAludW0gPSBlcC0+ZXBudW0gLSAxOwogCkBAIC0yMjI5LDggKzIyMjksNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIGNhbGxlZCB3aXRoIGlycXMgYmxvY2tlZCAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgewotCQlyZXEgPSBsaXN0X2VudHJ5KGVwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgbmJ1MnNzX3JlcSwgcXVldWUpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmZXAtPnF1ZXVlLCBxdWV1ZSkgewogCQlfbmJ1MnNzX2VwX2RvbmUoZXAsIHJlcSwgc3RhdHVzKTsKIAl9CiAKQEAgLTIyNTcsMTEgKzIyNTYsNiBAQAogewogCXUzMglyZWdfZHQ7CiAKLQlpZiAoIXVkYykgewotCQlFUlIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaWYgKHVkYy0+dmJ1c19hY3RpdmUgPT0gMCkKIAkJcmV0dXJuIC1FU0hVVERPV047CiAKQEAgLTIyOTMsNyArMjI4Nyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgX25idTJzc19maWZvX2ZsdXNoKHN0cnVjdCBuYnUyc3NfdWRjICp1ZGMsIHN0cnVjdCBuYnUyc3NfZXAgKmVwKQogewotCVBUX0ZDX1JFR1MJcCA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAodWRjLT52YnVzX2FjdGl2ZSA9PSAwKQogCQlyZXR1cm47CkBAIC0yMzUwLDcgKzIzNDQsNyBAQAogCQl3YWl0Y250Kys7CiAJCXVkZWxheSgxKTsJLyogMXVzIHdhaXQgKi8KIAkJaWYgKHdhaXRjbnQgPT0gRVBDX1BMTF9MT0NLX0NPVU5UKSB7Ci0JCQlFUlIoIioqKiBSZXNldCBDYW5jZWwgZmFpbGVkXG4iKTsKKwkJCWRldl9lcnIodWRjLT5kZXYsICIqKiogUmVzZXQgQ2FuY2VsIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX07CkBAIC0yNDEyLDcgKzI0MDYsNyBAQAogCQl1ZGMtPmxpbnV4X3N1c3BlbmRlZCA9IDA7CiAKIAkJX25idTJzc19yZXNldF9jb250cm9sbGVyKHVkYyk7Ci0JCXByX2luZm8oIiAtLS0tLSBWQlVTIE9GRlxuIik7CisJCWRldl9pbmZvKHVkYy0+ZGV2LCAiIC0tLS0tIFZCVVMgT0ZGXG4iKTsKIAogCQlpZiAodWRjLT52YnVzX2FjdGl2ZSA9PSAxKSB7CiAJCQkvKiBWQlVTIE9GRiAqLwpAQCAtMjQzOCw3ICsyNDMyLDcgQEAKIAkJaWYgKHJlZ19kdCA9PSAwKQogCQkJcmV0dXJuOwogCi0JCXByX2luZm8oIiAtLS0tLSBWQlVTIE9OXG4iKTsKKwkJZGV2X2luZm8odWRjLT5kZXYsICIgLS0tLS0gVkJVUyBPTlxuIik7CiAKIAkJaWYgKHVkYy0+bGludXhfc3VzcGVuZGVkKQogCQkJcmV0dXJuOwpAQCAtMjUzNiw3ICsyNTMwLDcgQEAKIAl1MzIJZXBudW0sIGludF9iaXQ7CiAKIAlzdHJ1Y3QgbmJ1MnNzX3VkYwkqdWRjID0gKHN0cnVjdCBuYnUyc3NfdWRjICopX3VkYzsKLQlQVF9GQ19SRUdTCQlwcmVnID0gdWRjLT5wX3JlZ3M7CisJc3RydWN0IGZjX3JlZ3MJKnByZWcgPSB1ZGMtPnBfcmVnczsKIAogCWlmIChncGlvX2dldF92YWx1ZShWQlVTX1ZBTFVFKSA9PSAwKSB7CiAJCV9uYnUyc3Nfd3JpdGVsKCZwcmVnLT5VU0JfSU5UX1NUQSwgflVTQl9JTlRfU1RBX1JXKTsKQEAgLTI2MTIsMTMgKzI2MDYsMTMgQEAKIAlzdHJ1Y3QgbmJ1MnNzX3VkYwkqdWRjOwogCiAJaWYgKChfZXAgPT0gTlVMTCkgfHwgKGRlc2MgPT0gTlVMTCkpIHsKLQkJRVJSKCIgKioqICVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIgKioqICVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmJ1MnNzX2VwLCBlcCk7CiAJaWYgKChlcCA9PSBOVUxMKSB8fCAoZXAtPnVkYyA9PSBOVUxMKSkgewotCQlFUlIoIiAqKiogJXMsIGVwID09IE5VTEwgISFcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIgKioqICVzLCBlcCA9PSBOVUxMICEhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjYyNiw3ICsyNjIwLDcgQEAKIAlpZiAoKGVwX3R5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKIAkJfHwgKGVwX3R5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykpIHsKIAotCQlFUlIoIiAqKiogJXMsIGJhdCBibUF0dHJpYnV0ZXNcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIgKioqICVzLCBiYXQgYm1BdHRyaWJ1dGVzXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjYzNyw3ICsyNjMxLDcgQEAKIAlpZiAoKHVkYy0+ZHJpdmVyID09IE5VTEwpCiAJCXx8ICh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikpIHsKIAotCQlFUlIoIiAqKiogJXMsIHVkYyAhIVxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKGVwLT51ZGMtPmRldiwgIiAqKiogJXMsIHVkYyAhIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVTSFVURE9XTjsKIAl9CiAKQEAgLTI2NzIsMTMgKzI2NjYsMTMgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAogCWlmIChfZXAgPT0gTlVMTCkgewotCQlFUlIoIiAqKiogJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiAqKiogJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuYnUyc3NfZXAsIGVwKTsKIAlpZiAoKGVwID09IE5VTEwpIHx8IChlcC0+dWRjID09IE5VTEwpKSB7Ci0JCUVSUigiICoqKiAlcywgZXAgPT0gTlVMTCAhIVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoInVkYzogKioqICVzLCBlcCA9PSBOVUxMICEhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjc0MiwxMCArMjczNiwxMCBAQAogCS8qIGNhdGNoIHZhcmlvdXMgYm9ndXMgcGFyYW1ldGVycyAqLwogCWlmICgoX2VwID09IE5VTEwpIHx8IChfcmVxID09IE5VTEwpKSB7CiAJCWlmIChfZXAgPT0gTlVMTCkKLQkJCUVSUigiKioqICVzIC0tLSBfZXAgPT0gTlVMTFxuIiwgX19mdW5jX18pOworCQkJcHJfZXJyKCJ1ZGM6ICVzIC0tLSBfZXAgPT0gTlVMTFxuIiwgX19mdW5jX18pOwogCiAJCWlmIChfcmVxID09IE5VTEwpCi0JCQlFUlIoIioqKiAlcyAtLS0gX3JlcSA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoInVkYzogJXMgLS0tIF9yZXEgPT0gTlVMTFxuIiwgX19mdW5jX18pOwogCiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI3NTYsMTMgKzI3NTAsMTMgQEAKIAkgICAgIHx8ICFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlKSkpIHsKIAogCQlpZiAoIV9yZXEtPmNvbXBsZXRlKQotCQkJRVJSKCIqKiogJXMgLS0tICFfcmVxLT5jb21wbGV0ZVxuIiwgX19mdW5jX18pOworCQkJcHJfZXJyKCJ1ZGM6ICVzIC0tLSAhX3JlcS0+Y29tcGxldGVcbiIsIF9fZnVuY19fKTsKIAogCQlpZiAoIV9yZXEtPmJ1ZikKLQkJCUVSUigiKioqICVzIC0tLSAhX3JlcS0+YnVmXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoInVkYzolcyAtLS0gIV9yZXEtPmJ1ZlxuIiwgX19mdW5jX18pOwogCiAJCWlmICghbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpCi0JCQlFUlIoIioqKiAlcyAtLS0gIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoIiVzIC0tLSAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSlcbiIsIF9fZnVuY19fKTsKIAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNzczLDEyICsyNzY3LDEzIEBACiAvKglJTkZPKCI9PT0gJXMoZXAlZCksIHplcm89JWRcbiIsIF9fZnVuY19fLCBlcC0+ZXBudW0sIF9yZXEtPnplcm8pOyAqLwogCiAJaWYgKHVkYy0+dmJ1c19hY3RpdmUgPT0gMCkgewotCQlwcl9pbmZvKCJDYW4ndCBlcF9xdWV1ZSAoVkJVUyBPRkYpXG4iKTsKKwkJZGV2X2luZm8odWRjLT5kZXYsICJDYW4ndCBlcF9xdWV1ZSAoVkJVUyBPRkYpXG4iKTsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQogCiAJaWYgKHVubGlrZWx5KCF1ZGMtPmRyaXZlcikpIHsKLQkJRVJSKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlICVwXG4iLCBfX2Z1bmNfXywgdWRjLT5kcml2ZXIpOworCQlkZXZfZXJyKHVkYy0+ZGV2LCAiJXMsIGJvZ3VzIGRldmljZSBzdGF0ZSAlcFxuIiwgX19mdW5jX18sCisJCQkJdWRjLT5kcml2ZXIpOwogCQlyZXR1cm4gLUVTSFVURE9XTjsKIAl9CiAKQEAgLTI3OTQsNyArMjc4OSw3IEBACiAJCWlmIChlcC0+dmlydF9idWYgPT0gTlVMTCkKIAkJCWVwLT52aXJ0X2J1ZiA9ICh1OCAqKWRtYV9hbGxvY19jb2hlcmVudCgKIAkJCQlOVUxMLCBQQUdFX1NJWkUsCi0JCQkJJmVwLT5waHlzX2J1ZiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQkJCSZlcC0+cGh5c19idWYsIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKIAkJaWYgKGVwLT5lcG51bSA+IDApICB7CiAJCQlpZiAoZXAtPmRpcmVjdCA9PSBVU0JfRElSX0lOKQogCQkJCW1lbWNweShlcC0+dmlydF9idWYsIHJlcS0+cmVxLmJ1ZiwKQEAgLTI4MTcsNyArMjgxMiw4IEBACiAKIAkJcmVzdWx0ID0gX25idTJzc19zdGFydF90cmFuc2Zlcih1ZGMsIGVwLCByZXEsIEZBTFNFKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCUVSUigiICoqKiAlcywgcmVzdWx0ID0gJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOworCQkJZGV2X2Vycih1ZGMtPmRldiwgIiAqKiogJXMsIHJlc3VsdCA9ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJcmVzdWx0KTsKIAkJCWxpc3RfZGVsKCZyZXEtPnF1ZXVlKTsKIAkJfSBlbHNlIGlmICgoZXAtPmVwbnVtID4gMCkgJiYgKGVwLT5kaXJlY3QgPT0gVVNCX0RJUl9PVVQpKSB7CiAjaWZkZWYgVVNFX0RNQQpAQCAtMjg0OSwxMyArMjg0NSwxMyBAQAogCiAJLyogY2F0Y2ggdmFyaW91cyBib2d1cyBwYXJhbWV0ZXJzICovCiAJaWYgKChfZXAgPT0gTlVMTCkgfHwgKF9yZXEgPT0gTlVMTCkpIHsKLQkJLyogRVJSKCIlcywgYmFkIHBhcmFtKDEpXG4iLCBfX2Z1bmNfXyk7ICovCisJCS8qIHByX2VycigiJXMsIGJhZCBwYXJhbSgxKVxuIiwgX19mdW5jX18pOyAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuYnUyc3NfZXAsIGVwKTsKIAlpZiAoIWVwKSB7Ci0JCUVSUigiJXMsIGVwID09IE5VTEwgISFcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcywgZXAgPT0gTlVMTCAhIVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI4OTUsMTkgKzI4OTEsMTkgQEAKIC8qCUlORk8oIj09PSAlcygpXG4iLCBfX2Z1bmNfXyk7ICovCiAKIAlpZiAoIV9lcCkgewotCQlFUlIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5idTJzc19lcCwgZXApOwogCWlmICghZXApIHsKLQkJRVJSKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXMsIGJhZCBlcFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl1ZGMgPSBlcC0+dWRjOwogCWlmICghdWRjKSB7Ci0JCUVSUigiICoqKiAlcywgYmFkIHVkY1xuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKGVwLT51ZGMtPmRldiwgIiAqKiogJXMsIGJhZCB1ZGNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yOTQ0LDI0ICsyOTQwLDI0IEBACiAJc3RydWN0IG5idTJzc19lcAkqZXA7CiAJc3RydWN0IG5idTJzc191ZGMJKnVkYzsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlQVF9GQ19SRUdTCQlwcmVnOworCXN0cnVjdCBmY19yZWdzCQkqcHJlZzsKIAogLyoJSU5GTygiPT09ICVzKClcbiIsIF9fZnVuY19fKTsgKi8KIAogCWlmICghX2VwKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmJ1MnNzX2VwLCBlcCk7CiAJaWYgKCFlcCkgewotCQlFUlIoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXVkYyA9IGVwLT51ZGM7CiAJaWYgKCF1ZGMpIHsKLQkJRVJSKCIlcywgYmFkIHVkY1xuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKGVwLT51ZGMtPmRldiwgIiVzLCBiYWQgdWRjXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjk5NywxOSArMjk5MywxOSBAQAogLyoJSU5GTygiPT09ICVzKClcbiIsIF9fZnVuY19fKTsgKi8KIAogCWlmICghX2VwKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoInVkYzogJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmJ1MnNzX2VwLCBlcCk7CiAJaWYgKCFfZXApIHsKLQkJRVJSKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigidWRjOiAlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAl1ZGMgPSBlcC0+dWRjOwogCWlmICghdWRjKSB7Ci0JCUVSUigiJXMsIGJhZCB1ZGNcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycihlcC0+dWRjLT5kZXYsICIlcywgYmFkIHVkY1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMDUzLDEzICszMDQ5LDEzIEBACiAvKglJTkZPKCI9PT0gJXMoKVxuIiwgX19mdW5jX18pOyAqLwogCiAJaWYgKHBnYWRnZXQgPT0gTlVMTCkgewotCQlFUlIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCJ1ZGM6ICVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdWRjID0gY29udGFpbmVyX29mKHBnYWRnZXQsIHN0cnVjdCBuYnUyc3NfdWRjLCBnYWRnZXQpOwogCWlmICh1ZGMgPT0gTlVMTCkgewotCQlFUlIoIiVzLCB1ZGMgPT0gTlVMTFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZ2FkZ2V0LT5kZXYsICIlcywgdWRjID09IE5VTExcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMDgzLDE5ICszMDc5LDE5IEBACiAvKglJTkZPKCI9PT0gJXMoKVxuIiwgX19mdW5jX18pOyAqLwogCiAJaWYgKHBnYWRnZXQgPT0gTlVMTCkgewotCQlFUlIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXVkYyA9IGNvbnRhaW5lcl9vZihwZ2FkZ2V0LCBzdHJ1Y3QgbmJ1MnNzX3VkYywgZ2FkZ2V0KTsKIAlpZiAodWRjID09IE5VTEwpIHsKLQkJRVJSKCIlcywgdWRjID09IE5VTExcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmcGdhZGdldC0+ZGV2LCAiJXMsIHVkYyA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWRhdGEgPSBncGlvX2dldF92YWx1ZShWQlVTX1ZBTFVFKTsKIAlpZiAoZGF0YSA9PSAwKSB7Ci0JCXByX3dhcm4oIlZCVVMgTEVWRUwgPSAlZFxuIiwgZGF0YSk7CisJCWRldl93YXJuKCZwZ2FkZ2V0LT5kZXYsICJWQlVTIExFVkVMID0gJWRcbiIsIGRhdGEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMxMjMsNyArMzExOSw3IEBACiAvKglJTkZPKCI9PT0gJXMoKVxuIiwgX19mdW5jX18pOyAqLwogCiAJaWYgKHBnYWRnZXQgPT0gTlVMTCkgewotCQlFUlIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzE1Miw3ICszMTQ4LDcgQEAKIC8qCUlORk8oIj09PSAlcygpXG4iLCBfX2Z1bmNfXyk7ICovCiAKIAlpZiAocGdhZGdldCA9PSBOVUxMKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMTc0LDcgKzMxNzAsNyBAQAogLyoJSU5GTygiPT09ICVzKClcbiIsIF9fZnVuY19fKTsgKi8KIAogCWlmIChwZ2FkZ2V0ID09IE5VTEwpIHsKLQkJRVJSKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMzNDEsMTEgKzMzMzcsMTEgQEAKIAkJCQkgIDAsIGRyaXZlcl9uYW1lLCB1ZGMpOwogCiAJLyogSU8gTWVtb3J5ICovCi0JdWRjLT5wX3JlZ3MgPSAoUFRfRkNfUkVHUyltbWlvX2Jhc2U7CisJdWRjLT5wX3JlZ3MgPSAoc3RydWN0IGZjX3JlZ3MgKiltbWlvX2Jhc2U7CiAKIAkvKiBVU0IgRnVuY3Rpb24gQ29udHJvbGxlciBJbnRlcnJ1cHQgKi8KIAlpZiAoc3RhdHVzICE9IDApIHsKLQkJRVJSKCJyZXF1ZXN0X2lycShVU0JfVURDX0lSUV8xKSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKHVkYy0+ZGV2LCAicmVxdWVzdF9pcnEoVVNCX1VEQ19JUlFfMSkgZmFpbGVkXG4iKTsKIAkJZ290byBjbGVhbnVwMTsKIAl9CiAKQEAgLTMzNjUsNyArMzM2MSw3IEBACiAJCQkJdWRjKTsKIAogCWlmIChzdGF0dXMgIT0gMCkgewotCQlFUlIoInJlcXVlc3RfaXJxKElOVF9WQlVTKSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKHVkYy0+ZGV2LCAicmVxdWVzdF9pcnEoSU5UX1ZCVVMpIGZhaWxlZFxuIik7CiAJCWdvdG8gY2xlYW51cDE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5oCmluZGV4IDIwMmUyZGMuLmMxOTE2OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5oCkBAIC00NzQsOCArNDc0LDggQEAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogU3RydWN0ICovCi0vKi0tLS0tLS0gVF9FUF9SRUdTICovCi10eXBlZGVmIHN0cnVjdCBfVF9FUF9SRUdTIHsKKy8qLS0tLS0tLSBlcF9yZWdzICovCitzdHJ1Y3QgZXBfcmVncyB7CiAJdTMyIEVQX0NPTlRST0w7CQkJLyogRVAgQ29udHJvbCAqLwogCXUzMiBFUF9TVEFUVVM7CQkJLyogRVAgU3RhdHVzICovCiAJdTMyIEVQX0lOVF9FTkE7CQkJLyogRVAgSW50ZXJydXB0IEVuYWJsZSAqLwpAQCAtNDg0LDE4ICs0ODQsMTggQEAKIAl1MzIgRVBfTEVOX0RDTlQ7CQkvKiBFUCBMZW5ndGggJiBETUEgY291bnQgKi8KIAl1MzIgRVBfUkVBRDsJCQkvKiBFUCBSZWFkICovCiAJdTMyIEVQX1dSSVRFOwkJCS8qIEVQIFdyaXRlICovCi19IFRfRVBfUkVHUywgKlBUX0VQX1JFR1M7Cit9OwogCi0vKi0tLS0tLS0gVF9FUF9EQ1IgKi8KLXR5cGVkZWYgc3RydWN0IF9UX0VQX0RDUiB7CisvKi0tLS0tLS0gZXBfZGNyICovCitzdHJ1Y3QgZXBfZGNyIHsKIAl1MzIgRVBfRENSMTsJCQkvKiBFUF9EQ1IxICovCiAJdTMyIEVQX0RDUjI7CQkJLyogRVBfRENSMiAqLwogCXUzMiBFUF9UQURSOwkJCS8qIEVQX1RBRFIgKi8KIAl1MzIgUmVzZXJ2ZWQ7CQkJLyogUmVzZXJ2ZWQgKi8KLX0gVF9FUF9EQ1IsICpQVF9FUF9EQ1I7Cit9OwogCiAvKi0tLS0tLS0gRnVuY3Rpb24gUmVnaXN0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBfVF9GQ19SRUdTIHsKK3N0cnVjdCBmY19yZWdzIHsKIAl1MzIgVVNCX0NPTlRST0w7CQkvKiAoMHgwMDAwKSBVU0IgQ29udHJvbCAqLwogCXUzMiBVU0JfU1RBVFVTOwkJCS8qICgweDAwMDQpIFVTQiBTdGF0dXMgKi8KIAl1MzIgVVNCX0FERFJFU1M7CQkvKiAoMHgwMDA4KSBVU0IgQWRkcmVzcyAqLwpAQCAtNTEzLDcgKzUxMyw3IEBACiAJdTMyIEVQMF9SRUFEOwkJCS8qICgweDAwMzgpIEVQMCBSZWFkICovCiAJdTMyIEVQMF9XUklURTsJCQkvKiAoMHgwMDNDKSBFUDAgV3JpdGUgKi8KIAotCVRfRVBfUkVHUyBFUF9SRUdTW1JFR19FUF9OVU1dOwkvKiBFbmRwb2ludCBSZWdpc3RlciAqLworCXN0cnVjdCBlcF9yZWdzIEVQX1JFR1NbUkVHX0VQX05VTV07CS8qIEVuZHBvaW50IFJlZ2lzdGVyICovCiAKIAl1OCBSZXNlcnZlZDIyMFsweDEwMDAtMHgyMjBdOwkvKiAoMHgwMjIwOjB4MEZGRikgUmVzZXJ2ZWQgKi8KIApAQCAtNTMxLDExICs1MzEsMTAgQEAKIAogCXU4IFJlc2VydmVkMTAyOFsweDExMC0weDI4XTsJLyogKDB4MTAyODoweDExMEYpIFJlc2VydmVkICovCiAKLQlUX0VQX0RDUiBFUF9EQ1JbUkVHX0VQX05VTV07CS8qICovCisJc3RydWN0IGVwX2RjciBFUF9EQ1JbUkVHX0VQX05VTV07CS8qICovCiAKIAl1OCBSZXNlcnZlZDEyMDBbMHgxMDAwLTB4MjAwXTsJLyogUmVzZXJ2ZWQgKi8KLQotfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKSBUX0ZDX1JFR1MsICpQVF9GQ19SRUdTOworfSBfX2FsaWduZWQoMzIpOwogCiAKIApAQCAtNjMxLDE4ICs2MzAsMTcgQEAKIAogCXUzMgkJY3Vycl9jb25maWc7CS8qIEN1cnJlbnQgQ29uZmlndXJhdGlvbiBOdW1iZXIgKi8KIAotCVBUX0ZDX1JFR1MJCXBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkJKnBfcmVnczsKIH07CiAKIC8qIFVTQiByZWdpc3RlciBhY2Nlc3Mgc3RydWN0dXJlICovCi10eXBlZGVmIHZvbGF0aWxlIHVuaW9uIHsKK3VuaW9uIHVzYl9yZWdfYWNjZXNzIHsKIAlzdHJ1Y3QgewogCQl1bnNpZ25lZCBjaGFyCURBVEFbNF07CiAJfSBieXRlOwogCXVuc2lnbmVkIGludAkJZHc7Ci19IFVTQl9SRUdfQUNDRVNTOworfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgRVJSKHN0dWZmLi4uKQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGM6ICIgc3R1ZmYpCiAKICNlbmRpZiAgLyogX0xJTlVYX0VNWFhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvS2NvbmZpZwppbmRleCA5OTVhOTEwLi42Y2YwYzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvS2NvbmZpZwpAQCAtMzgsNiArMzgsMTIgQEAKIAloZWxwCiAJICBHZW5lcmljIEZyYW1lYnVmZmVyIHN1cHBvcnQgZm9yIEhYODM1M0QKIAorY29uZmlnIEZCX1RGVF9JTEk5MTYzCisJdHJpc3RhdGUgIkZCIGRyaXZlciBmb3IgdGhlIElMSTkxNjMgTENEIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBGQl9URlQKKwloZWxwCisJICBHZW5lcmljIEZyYW1lYnVmZmVyIHN1cHBvcnQgZm9yIElMSTkxNjMKKwogY29uZmlnIEZCX1RGVF9JTEk5MzIwCiAJdHJpc3RhdGUgIkZCIGRyaXZlciBmb3IgdGhlIElMSTkzMjAgTENEIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBGQl9URlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9NYWtlZmlsZQppbmRleCBlNzczZjBmLi45ZTczYmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLSQoQ09ORklHX0ZCX1RGVF9IWDgzNDBCTikgICAgKz0gZmJfaHg4MzQwYm4ubwogb2JqLSQoQ09ORklHX0ZCX1RGVF9IWDgzNDdEKSAgICAgKz0gZmJfaHg4MzQ3ZC5vCiBvYmotJChDT05GSUdfRkJfVEZUX0hYODM1M0QpICAgICArPSBmYl9oeDgzNTNkLm8KK29iai0kKENPTkZJR19GQl9URlRfSUxJOTE2MykgICAgICs9IGZiX2lsaTkxNjMubwogb2JqLSQoQ09ORklHX0ZCX1RGVF9JTEk5MzIwKSAgICAgKz0gZmJfaWxpOTMyMC5vCiBvYmotJChDT05GSUdfRkJfVEZUX0lMSTkzMjUpICAgICArPSBmYl9pbGk5MzI1Lm8KIG9iai0kKENPTkZJR19GQl9URlRfSUxJOTM0MCkgICAgICs9IGZiX2lsaTkzNDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9SRUFETUUKaW5kZXggYmM4OWI1OC4uYmE0Yzc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvUkVBRE1FCkBAIC05LDIwICs5LDIwIEBACiBJTlNUQUxMQVRJT04KICAgRG93bmxvYWQga2VybmVsIHNvdXJjZXMKIAotICBGcm9tIExpbnV4IDMuMTUgIAorICBGcm9tIExpbnV4IDMuMTUKICAgICBjZCBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2ZidGZ0CiAgICAgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3Ryby9mYnRmdC5naXQKLSAgICAKKwogICAgIEFkZCB0byBkcml2ZXJzL3ZpZGVvL2ZiZGV2L0tjb25maWc6ICAgc291cmNlICJkcml2ZXJzL3ZpZGVvL2ZiZGV2L2ZidGZ0L0tjb25maWciCiAgICAgQWRkIHRvIGRyaXZlcnMvdmlkZW8vZmJkZXYvTWFrZWZpbGU6ICBvYmoteSArPSBmYnRmdC8KLSAgCi0gIEJlZm9yZSBMaW51eCAzLjE1ICAKKworICBCZWZvcmUgTGludXggMy4xNQogICAgIGNkIGRyaXZlcnMvdmlkZW8KICAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL25vdHJvL2ZidGZ0LmdpdAotICAgIAorCiAgICAgQWRkIHRvIGRyaXZlcnMvdmlkZW8vS2NvbmZpZzogICBzb3VyY2UgImRyaXZlcnMvdmlkZW8vZmJ0ZnQvS2NvbmZpZyIKICAgICBBZGQgdG8gZHJpdmVycy92aWRlby9NYWtlZmlsZTogIG9iai15ICs9IGZidGZ0LwotICAKKwogICBFbmFibGUgZHJpdmVyKHMpIGluIG1lbnVjb25maWcgYW5kIGJ1aWxkIHRoZSBrZXJuZWwKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfYWdtMTI2NGstZmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jCmluZGV4IDljYzdkMjUuLjhmNWFmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jCkBAIC0xNzQsNyArMTc0LDcgQEAKIAogLyogVGhpcyBmdW5jdGlvbiBvc2VzIHRvIGVudGVyIGNvbW1hbmRzCiAgKiBmaXJzdCBieXRlIC0gZGVzdGluYXRpb24gY29udHJvbGxlciAwIG9yIDEKLSAqIGZvbG93aW5nIC0gY29tbWFuZHMKKyAqIGZvbGxvd2luZyAtIGNvbW1hbmRzCiAgKi8KIHN0YXRpYyB2b2lkIHdyaXRlX3JlZzhfYnVzOChzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCBsZW4sIC4uLikKIHsKQEAgLTE5OCw4ICsxOTgsOCBAQAogCiAJaWYgKCpidWYgPiAxKSB7CiAJCXZhX2VuZChhcmdzKTsKLQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIiVzOiBJbmNvcnJlY3QgY2hpcCBzZWxsZWN0IHJlcXVlc3QgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCAqYnVmKTsKKwkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKKwkJCSJJbmNvcnJlY3QgY2hpcCBzZWxlY3QgcmVxdWVzdCAoJWQpXG4iLCAqYnVmKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjI0LDggKzIyNCw4IEBACiAJCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPmJ1ZiwgbGVuICogKHNpemVvZih1OCkpKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXZhX2VuZChhcmdzKTsKLQkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsICIlczogd3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOworCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKKwkJCQkid3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLCByZXQpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMjc4LDEwICsyNzgsMTMgQEAKIAlpbnQgeCwgeTsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIGJ1ZmZlciB0byBjb252ZXJ0IFJHQjU2NSAtPiBncmF5c2NhbGUxNiAtPiBEaXRoZXJkIGltYWdlIDFicHAgKi8KKwkvKiBidWZmZXIgdG8gY29udmVydCBSR0I1NjUgLT4gZ3JheXNjYWxlMTYgLT4gRGl0aGVyZWQgaW1hZ2UgMWJwcCAqLwogCXNpZ25lZCBzaG9ydCAqY29udmVydF9idWYgPSBrbWFsbG9jKHBhci0+aW5mby0+dmFyLnhyZXMgKgogCQlwYXItPmluZm8tPnZhci55cmVzICogc2l6ZW9mKHNpZ25lZCBzaG9ydCksIEdGUF9OT0lPKTsKIAorCWlmICghY29udmVydF9idWYpCisJCXJldHVybiAtRU5PTUVNOworCiAJZmJ0ZnRfcGFyX2RiZyhERUJVR19XUklURV9WTUVNLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBjb252ZXJ0aW5nIHRvIGdyYXlzY2FsZTE2ICovCkBAIC0zNzYsOCArMzc5LDggQEAKIAkJCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBidWYsIGxlbik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJCQkiJXM6IHdyaXRlIGZhaWxlZCBhbmQgcmV0dXJuZWQ6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQkJIndyaXRlIGZhaWxlZCBhbmQgcmV0dXJuZWQ6ICVkXG4iLAorCQkJCQlyZXQpOwogCQl9CiAJCS8qIHJpZ2h0IGhhbGYgb2YgZGlzcGxheSAqLwogCQlpZiAoYWRkcl93aW4ueGUgPj0gcGFyLT5pbmZvLT52YXIueHJlcyAvIDIpIHsKQEAgLTM5MCw3ICszOTMsNyBAQAogCQkJLyogc2VsZWN0IHJpZ2h0IHNpZGUgKHNjMSkKIAkJCSAqIHNldCBhZGRyCiAJCQkgKi8KLQkJCXdyaXRlX3JlZyhwYXIsIDB4MDEsICgxIDw8IDYpKTsKKwkJCXdyaXRlX3JlZyhwYXIsIDB4MDEsIDEgPDwgNik7CiAJCQl3cml0ZV9yZWcocGFyLCAweDAxLCAoMHgxNyA8PCAzKSB8ICh1OCl5KTsKIAogCQkJLyogd3JpdGUgYml0bWFwICovCkBAIC0zOTgsOCArNDAxLDggQEAKIAkJCXBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBidWYsIGxlbik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJCQkiJXM6IHdyaXRlIGZhaWxlZCBhbmQgcmV0dXJuZWQ6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQkJIndyaXRlIGZhaWxlZCBhbmQgcmV0dXJuZWQ6ICVkXG4iLAorCQkJCQlyZXQpOwogCQl9CiAJfQogCWtmcmVlKGNvbnZlcnRfYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9iZDY2MzQ3NC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2JkNjYzNDc0LmMKaW5kZXggN2UwMGM2MC4uMTdhMjE2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2JkNjYzNDc0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2JkNjYzNDc0LmMKQEAgLTQ3LDQ5ICs0Nyw0OSBAQAogCS8qIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGZyb20gTGliX1VURlQgKi8KIAogCS8qIG9zY2lsbGF0b3Igc3RhcnQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMCwweDAwMDEpOwkvKm9zY2lsbGF0b3IgMDogc3RvcCwgMTogb3BlcmF0aW9uICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDAsIDB4MDAwMSk7CS8qb3NjaWxsYXRvciAwOiBzdG9wLCAxOiBvcGVyYXRpb24gKi8KIAltZGVsYXkoMTApOwogCiAJLyogUG93ZXIgc2V0dGluZ3MgKi8KLQl3cml0ZV9yZWcocGFyLCAweDEwMCwgMHgwMDAwICk7IC8qIHBvd2VyIHN1cHBseSBzZXR1cCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MTAxLCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDEwMiwgMHgzMTEwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgxMDMsIDB4ZTIwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MTEwLCAweDAwOWQgKTsKLQl3cml0ZV9yZWcocGFyLCAweDExMSwgMHgwMDIyICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgxMDAsIDB4MDEyMCApOwotCW1kZWxheSggMjAgKTsKKwl3cml0ZV9yZWcocGFyLCAweDEwMCwgMHgwMDAwKTsgLyogcG93ZXIgc3VwcGx5IHNldHVwICovCisJd3JpdGVfcmVnKHBhciwgMHgxMDEsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgxMDIsIDB4MzExMCk7CisJd3JpdGVfcmVnKHBhciwgMHgxMDMsIDB4ZTIwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgxMTAsIDB4MDA5ZCk7CisJd3JpdGVfcmVnKHBhciwgMHgxMTEsIDB4MDAyMik7CisJd3JpdGVfcmVnKHBhciwgMHgxMDAsIDB4MDEyMCk7CisJbWRlbGF5KDIwKTsKIAotCXdyaXRlX3JlZyhwYXIsIDB4MTAwLCAweDMxMjAgKTsKLQltZGVsYXkoIDgwICk7CisJd3JpdGVfcmVnKHBhciwgMHgxMDAsIDB4MzEyMCk7CisJbWRlbGF5KDgwKTsKIAkvKiBEaXNwbGF5IGNvbnRyb2wgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMSwgMHgwMTAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDIsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDAzLCAweDEyMzAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwNiwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDcsIDB4MDEwMSApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA4LCAweDA4MDggKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwOSwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMGIsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDBjLCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwZCwgMHgwMDE4ICk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDEsIDB4MDEwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDIsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDMsIDB4MTIzMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDYsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDcsIDB4MDEwMSk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDgsIDB4MDgwOCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDksIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMGIsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMGMsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMGQsIDB4MDAxOCk7CiAJLyogTFRQUyBjb250cm9sIHNldHRpbmdzICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMTIsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDEzLCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAxOCwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMTksIDB4MDAwMCApOworCXdyaXRlX3JlZyhwYXIsIDB4MDEyLCAweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MDEzLCAweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MDE4LCAweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MDE5LCAweDAwMDApOwogCi0Jd3JpdGVfcmVnKHBhciwgMHgyMDMsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MjA0LCAweDAwMDAgKTsKKwl3cml0ZV9yZWcocGFyLCAweDIwMywgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDIwNCwgMHgwMDAwKTsKIAotCXdyaXRlX3JlZyhwYXIsIDB4MjEwLCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDIxMSwgMHgwMGVmICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgyMTIsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MjEzLCAweDAxM2YgKTsKLQl3cml0ZV9yZWcocGFyLCAweDIxNCwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgyMTUsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MjE2LCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDIxNywgMHgwMDAwICk7CisJd3JpdGVfcmVnKHBhciwgMHgyMTAsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgyMTEsIDB4MDBlZik7CisJd3JpdGVfcmVnKHBhciwgMHgyMTIsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgyMTMsIDB4MDEzZik7CisJd3JpdGVfcmVnKHBhciwgMHgyMTQsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgyMTUsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgyMTYsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgyMTcsIDB4MDAwMCk7CiAKIAkvKiBHcmF5IHNjYWxlIHNldHRpbmdzICovCiAJd3JpdGVfcmVnKHBhciwgMHgzMDAsIDB4NTM0Myk7CkBAIC0xMDQsMTggKzEwNCwxOCBAQAogCXdyaXRlX3JlZyhwYXIsIDB4MzA5LCAweDA1MGEpOwogCiAJLyogUkFNIGFjY2VzcyBzZXR0aW5ncyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4NDAwLCAweDQwMjcgKTsKLQl3cml0ZV9yZWcocGFyLCAweDQwMSwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHg0MDIsIDB4MDAwMCApOyAgLyogRmlyc3Qgc2NyZWVuIGRyaXZlIHBvc2l0aW9uICgxKSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4NDAzLCAweDAxM2YgKTsgIC8qIEZpcnN0IHNjcmVlbiBkcml2ZSBwb3NpdGlvbiAoMikgKi8KLQl3cml0ZV9yZWcocGFyLCAweDQwNCwgMHgwMDAwICk7CisJd3JpdGVfcmVnKHBhciwgMHg0MDAsIDB4NDAyNyk7CisJd3JpdGVfcmVnKHBhciwgMHg0MDEsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHg0MDIsIDB4MDAwMCk7ICAvKiBGaXJzdCBzY3JlZW4gZHJpdmUgcG9zaXRpb24gKDEpICovCisJd3JpdGVfcmVnKHBhciwgMHg0MDMsIDB4MDEzZik7ICAvKiBGaXJzdCBzY3JlZW4gZHJpdmUgcG9zaXRpb24gKDIpICovCisJd3JpdGVfcmVnKHBhciwgMHg0MDQsIDB4MDAwMCk7CiAKLQl3cml0ZV9yZWcocGFyLCAweDIwMCwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgyMDEsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MTAwLCAweDcxMjAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwNywgMHgwMTAzICk7Ci0JbWRlbGF5KCAxMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA3LCAweDAxMTMgKTsKKwl3cml0ZV9yZWcocGFyLCAweDIwMCwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDIwMSwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDEwMCwgMHg3MTIwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwNywgMHgwMTAzKTsKKwltZGVsYXkoMTApOworCXdyaXRlX3JlZyhwYXIsIDB4MDA3LCAweDAxMTMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaHg4MzQwYm4uYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNDBibi5jCmluZGV4IDM5Mzk1MDIuLjU0NTI4YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNDBibi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNDBibi5jCkBAIC00LDcgKzQsNyBAQAogICogVGhpcyBkaXNwbGF5IHVzZXMgOS1iaXQgU1BJOiBEYXRhL0NvbW1hbmQgYml0ICsgOCBkYXRhIGJpdHMKICAqIEZvciBwbGF0Zm9ybXMgdGhhdCBkb2Vzbid0IHN1cHBvcnQgOS1iaXQsIHRoZSBkcml2ZXIgaXMgY2FwYWJsZQogICogb2YgZW11bGF0aW5nIHRoaXMgdXNpbmcgOC1iaXQgdHJhbnNmZXIuCi0gKiBUaGlzIGlzIGRvbmUgYnkgdHJhbnNmZXJpbmcgZWlnaHQgOS1iaXQgd29yZHMgaW4gOSBieXRlcy4KKyAqIFRoaXMgaXMgZG9uZSBieSB0cmFuc2ZlcnJpbmcgZWlnaHQgOS1iaXQgd29yZHMgaW4gOSBieXRlcy4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTm9yYWxmIFRyb25uZXMKICAqCkBAIC00Nyw4ICs0Nyw2IEBACiAKIHN0YXRpYyBpbnQgaW5pdF9kaXNwbGF5KHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKLQlmYnRmdF9wYXJfZGJnKERFQlVHX0lOSVRfRElTUExBWSwgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOwotCiAJcGFyLT5mYnRmdG9wcy5yZXNldChwYXIpOwogCiAJLyogQlRMMjIxNzIyLTI3Nkwgc3RhcnR1cCBzZXF1ZW5jZSwgZnJvbSBkYXRhc2hlZXQgKi8KQEAgLTEwOCwxMSArMTA2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBzZXRfYWRkcl93aW4oc3RydWN0IGZidGZ0X3BhciAqcGFyLCBpbnQgeHMsIGludCB5cywgaW50IHhlLCBpbnQgeWUpCitzdGF0aWMgdm9pZCBzZXRfYWRkcl93aW4oc3RydWN0IGZidGZ0X3BhciAqcGFyLCBpbnQgeHMsIGludCB5cywgaW50IHhlLCBpbnQgeWUpCiB7Ci0JZmJ0ZnRfcGFyX2RiZyhERUJVR19TRVRfQUREUl9XSU4sIHBhciwKLQkJIiVzKHhzPSVkLCB5cz0lZCwgeGU9JWQsIHllPSVkKVxuIiwgX19mdW5jX18sIHhzLCB5cywgeGUsIHllKTsKLQogCXdyaXRlX3JlZyhwYXIsIEZCVEZUX0NBU0VULCAweDAwLCB4cywgMHgwMCwgeGUpOwogCXdyaXRlX3JlZyhwYXIsIEZCVEZUX1JBU0VULCAweDAwLCB5cywgMHgwMCwgeWUpOwogCXdyaXRlX3JlZyhwYXIsIEZCVEZUX1JBTVdSKTsKQEAgLTEyMCw4ICsxMTUsNiBAQAogCiBzdGF0aWMgaW50IHNldF92YXIoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewotCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0KIAkvKiBNQURDVEwgLSBNZW1vcnkgZGF0YSBhY2Nlc3MgY29udHJvbCAqLwogCS8qIFJHQi9CR1IgY2FuIGJlIHNldCB3aXRoIEgvVyBwaW4gU1JHQiBhbmQgTUFEQ1RMIEJHUiBiaXQgKi8KICNkZWZpbmUgTVkgKDEgPDwgNykKQEAgLTEyOSw3ICsxMjIsNyBAQAogI2RlZmluZSBNViAoMSA8PCA1KQogCXN3aXRjaCAocGFyLT5pbmZvLT52YXIucm90YXRlKSB7CiAJY2FzZSAwOgotCQl3cml0ZV9yZWcocGFyLCAweDM2LCAocGFyLT5iZ3IgPDwgMykpOworCQl3cml0ZV9yZWcocGFyLCAweDM2LCBwYXItPmJnciA8PCAzKTsKIAkJYnJlYWs7CiAJY2FzZSAyNzA6CiAJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIE1YIHwgTVYgfCAocGFyLT5iZ3IgPDwgMykpOwpAQCAtMTU2LDE0ICsxNDksMTIgQEAKIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewogCXVuc2lnbmVkIGxvbmcgbWFza1tdID0gewotCQkwYjExMTEsIDBiMTExMSwgMGIxMTExMSwgMGIxMTExLCAwYjExMTEsIDBiMTExMSwgMGIxMTExMSwKLQkJMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMSwgMGIxMSwKLQkJMGIxMTExLCAwYjExMTEsIDBiMTExMTEsIDBiMTExMSwgMGIxMTExLCAwYjExMTEsIDBiMTExMTEsCi0JCTBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsIDBiMCwgMGIwIH07CisJCTB4MGYsIDB4MGYsIDB4MWYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MWYsIDB4MDcsIDB4MDcsIDB4MDcsCisJCTB4MDcsIDB4MDcsIDB4MDcsIDB4MDMsIDB4MDMsIDB4MGYsIDB4MGYsIDB4MWYsIDB4MGYsIDB4MGYsCisJCTB4MGYsIDB4MWYsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsCisJfTsKIAlpbnQgaSwgajsKIAotCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0KIAkvKiBhcHBseSBtYXNrICovCiAJZm9yIChpID0gMDsgaSA8IHBhci0+Z2FtbWEubnVtX2N1cnZlczsgaSsrKQogCQlmb3IgKGogPSAwOyBqIDwgcGFyLT5nYW1tYS5udW1fdmFsdWVzOyBqKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaHg4MzQ3ZC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2h4ODM0N2QuYwppbmRleCA4MTM5YThmLi4wM2FlOTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaHg4MzQ3ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNDdkLmMKQEAgLTExNSwxMCArMTE1LDkgQEAKIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewogCXVuc2lnbmVkIGxvbmcgbWFza1tdID0gewotCQkwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLAotCQkwYjExMTExMTEsIDBiMTExMTExMSwKLQkJMGIxMTExMSwgMGIxMTExMSwgMGIxMTExMSwgMGIxMTExMSwgMGIxMTExMSwKLQkJMGIxMTExfTsKKwkJMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHg3ZiwgMHg3ZiwgMHgxZiwgMHgxZiwKKwkJMHgxZiwgMHgxZiwgMHgxZiwgMHgwZiwKKwl9OwogCWludCBpLCBqOwogCWludCBhY2MgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaHg4MzUzZC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2h4ODM1M2QuYwppbmRleCBjOTUxMmRjLi5kN2Y0MzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaHg4MzUzZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNTNkLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkvKiBjb2x1bW4gYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MmEsIHhzID4+IDgsIHhzICYgMHhmZiwgeGUgPj4gOCwgeGUgJiAweGZmKTsKIAotCS8qIHJvdyBhZHJlc3MgKi8KKwkvKiBSb3cgYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MmIsIHlzID4+IDgsIHlzICYgMHhmZiwgeWUgPj4gOCwgeWUgJiAweGZmKTsKIAogCS8qIG1lbW9yeSB3cml0ZSAqLwpAQCAtMTEyLDcgKzExMiw3IEBACiAJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIG15IHwgbXYgfCAocGFyLT5iZ3IgPDwgMykpOwogCQlicmVhazsKIAljYXNlIDE4MDoKLQkJd3JpdGVfcmVnKHBhciwgMHgzNiwgKHBhci0+YmdyIDw8IDMpKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgzNiwgcGFyLT5iZ3IgPDwgMyk7CiAJCWJyZWFrOwogCWNhc2UgOTA6CiAJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIG14IHwgbXYgfCAocGFyLT5iZ3IgPDwgMykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkxNjMuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MTYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MmE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MTYzLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBGQiBkcml2ZXIgZm9yIHRoZSBJTEk5MTYzIExDRCBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEtvemhldm5pa292IEFuYXRvbHkKKyAqCisgKiBCYXNlZCBvbiBpbGk5MzI1LmMgYnkgTm9yYWxmIFRyb25uZXMgYW5kCisgKiAuUy5VLk0uTy5ULk8uWS4gYnkgTWF4IE1DIENvc3RhIChodHRwczovL2dpdGh1Yi5jb20vc3Vtb3RveS9URlRfSUxJOTE2M0MpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAiZmJ0ZnQuaCIKKworI2RlZmluZSBEUlZOQU1FCQkiZmJfaWxpOTE2MyIKKyNkZWZpbmUgV0lEVEgJCTEyOAorI2RlZmluZSBIRUlHSFQJCTEyOAorI2RlZmluZSBCUFAJCTE2CisjZGVmaW5lIEZQUwkJMzAKKworI2lmZGVmIEdBTU1BX0FESgorI2RlZmluZSBHQU1NQV9MRU4JMTUKKyNkZWZpbmUgR0FNTUFfTlVNCTEKKyNkZWZpbmUgREVGQVVMVF9HQU1NQQkiMzYgMjkgMTIgMjIgMUMgMTUgNDIgQjcgMkYgMTMgMTIgMEEgMTEgMEIgMDZcbiIKKyNlbmRpZgorCisvKiBJTEk5MTYzQyBjb21tYW5kcyAqLworI2RlZmluZSBDTURfTk9QCQkweDAwIC8qIE5vbiBvcGVyYXRpb24qLworI2RlZmluZSBDTURfU1dSRVNFVAkweDAxIC8qIFNvZnQgUmVzZXQgKi8KKyNkZWZpbmUgQ01EX1NMUElOCTB4MTAgLyogU2xlZXAgT04gKi8KKyNkZWZpbmUgQ01EX1NMUE9VVAkweDExIC8qIFNsZWVwIE9GRiAqLworI2RlZmluZSBDTURfUFRMT04JMHgxMiAvKiBQYXJ0aWFsIE1vZGUgT04gKi8KKyNkZWZpbmUgQ01EX05PUk1MCTB4MTMgLyogTm9ybWFsIERpc3BsYXkgT04gKi8KKyNkZWZpbmUgQ01EX0RJTlZPRgkweDIwIC8qIERpc3BsYXkgSW52ZXJzaW9uIE9GRiAqLworI2RlZmluZSBDTURfRElOVk9OCTB4MjEgLyogRGlzcGxheSBJbnZlcnNpb24gT04gKi8KKyNkZWZpbmUgQ01EX0dBTU1BU0VUCTB4MjYgLyogR2FtbWEgU2V0ICgweDAxWzFdLDB4MDJbMl0sMHgwNFszXSwweDA4WzRdKSAqLworI2RlZmluZSBDTURfRElTUE9GRgkweDI4IC8qIERpc3BsYXkgT0ZGICovCisjZGVmaW5lIENNRF9ESVNQT04JMHgyOSAvKiBEaXNwbGF5IE9OICovCisjZGVmaW5lIENNRF9JRExFT04JMHgzOSAvKiBJZGxlIE1vZGUgT04gKi8KKyNkZWZpbmUgQ01EX0lETEVPRgkweDM4IC8qIElkbGUgTW9kZSBPRkYgKi8KKyNkZWZpbmUgQ01EX0NMTUFEUlMJMHgyQSAvKiBDb2x1bW4gQWRkcmVzcyBTZXQgKi8KKyNkZWZpbmUgQ01EX1BHRUFEUlMJMHgyQiAvKiBQYWdlIEFkZHJlc3MgU2V0ICovCisKKyNkZWZpbmUgQ01EX1JBTVdSCTB4MkMgLyogTWVtb3J5IFdyaXRlICovCisjZGVmaW5lIENNRF9SQU1SRAkweDJFIC8qIE1lbW9yeSBSZWFkICovCisjZGVmaW5lIENNRF9DTFJTUEFDRQkweDJEIC8qIENvbG9yIFNwYWNlIDogNEsvNjVLLzI2MksgKi8KKyNkZWZpbmUgQ01EX1BBUlRBUkVBCTB4MzAgLyogUGFydGlhbCBBcmVhICovCisjZGVmaW5lIENNRF9WU0NMTERFRgkweDMzIC8qIFZlcnRpY2FsIFNjcm9sbCBEZWZpbml0aW9uICovCisjZGVmaW5lIENNRF9URUZYTE9OCTB4MzQgLyogVGVhcmluZyBFZmZlY3QgTGluZSBPTiAqLworI2RlZmluZSBDTURfVEVGWExPRgkweDM1IC8qIFRlYXJpbmcgRWZmZWN0IExpbmUgT0ZGICovCisjZGVmaW5lIENNRF9NQURDVEwJMHgzNiAvKiBNZW1vcnkgQWNjZXNzIENvbnRyb2wgKi8KKworI2RlZmluZSBDTURfUElYRk1UCTB4M0EgLyogSW50ZXJmYWNlIFBpeGVsIEZvcm1hdCAqLworI2RlZmluZSBDTURfRlJNQ1RSMQkweEIxIC8qIEZyYW1lIFJhdGUgQ29udHJvbAorCQkJCShJbiBub3JtYWwgbW9kZS9GdWxsIGNvbG9ycykgKi8KKyNkZWZpbmUgQ01EX0ZSTUNUUjIJMHhCMiAvKiBGcmFtZSBSYXRlIENvbnRyb2wgKEluIElkbGUgbW9kZS84LWNvbG9ycykgKi8KKyNkZWZpbmUgQ01EX0ZSTUNUUjMJMHhCMyAvKiBGcmFtZSBSYXRlIENvbnRyb2wKKwkJCQkoSW4gUGFydGlhbCBtb2RlL2Z1bGwgY29sb3JzKSAqLworI2RlZmluZSBDTURfRElOVkNUUgkweEI0IC8qIERpc3BsYXkgSW52ZXJzaW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgQ01EX1JHQkJMSwkweEI1IC8qIFJHQiBJbnRlcmZhY2UgQmxhbmtpbmcgUG9yY2ggc2V0dGluZyAqLworI2RlZmluZSBDTURfREZVTkNUUgkweEI2IC8qIERpc3BsYXkgRnVuY3Rpb24gc2V0IDUgKi8KKyNkZWZpbmUgQ01EX1NEUlZESVIJMHhCNyAvKiBTb3VyY2UgRHJpdmVyIERpcmVjdGlvbiBDb250cm9sICovCisjZGVmaW5lIENNRF9HRFJWRElSCTB4QjggLyogR2F0ZSBEcml2ZXIgRGlyZWN0aW9uIENvbnRyb2wgICovCisKKyNkZWZpbmUgQ01EX1BXQ1RSMQkweEMwIC8qIFBvd2VyX0NvbnRyb2wxICovCisjZGVmaW5lIENNRF9QV0NUUjIJMHhDMSAvKiBQb3dlcl9Db250cm9sMiAqLworI2RlZmluZSBDTURfUFdDVFIzCTB4QzIgLyogUG93ZXJfQ29udHJvbDMgKi8KKyNkZWZpbmUgQ01EX1BXQ1RSNAkweEMzIC8qIFBvd2VyX0NvbnRyb2w0ICovCisjZGVmaW5lIENNRF9QV0NUUjUJMHhDNCAvKiBQb3dlcl9Db250cm9sNSAqLworI2RlZmluZSBDTURfVkNPTUNUUjEJMHhDNSAvKiBWQ09NX0NvbnRyb2wgMSAqLworI2RlZmluZSBDTURfVkNPTUNUUjIJMHhDNiAvKiBWQ09NX0NvbnRyb2wgMiAqLworI2RlZmluZSBDTURfVkNPTU9GRlMJMHhDNyAvKiBWQ09NIE9mZnNldCBDb250cm9sICovCisjZGVmaW5lIENNRF9QR0FNTUFDCTB4RTAgLyogUG9zaXRpdmUgR2FtbWEgQ29ycmVjdGlvbiBTZXR0aW5nICovCisjZGVmaW5lIENNRF9OR0FNTUFDCTB4RTEgLyogTmVnYXRpdmUgR2FtbWEgQ29ycmVjdGlvbiBTZXR0aW5nICovCisjZGVmaW5lIENNRF9HQU1SU0VMCTB4RjIgLyogR0FNX1JfU0VMICovCisKKy8qCitUaGlzIGRpc3BsYXk6CitodHRwOi8vd3d3LmViYXkuY29tL2l0bS9SZXBsYWNlLU5va2lhLTUxMTAtTENELTEtNDQtUmVkLVNlcmlhbC0xMjhYMTI4LVNQSS1Db2xvci1URlQtTENELURpc3BsYXktTW9kdWxlLS8yNzE0MjIxMjIyNzEKK1RoaXMgcGFydGljdWxhciBkaXNwbGF5IGhhcyBhIGRlc2lnbiBlcnJvciEgVGhlIGNvbnRyb2xsZXIgaGFzIDMgcGlucyB0bworY29uZmlndXJlIHRvIGNvbnN0cmFpbiB0aGUgbWVtb3J5IGFuZCByZXNvbHV0aW9uIHRvIGEgZml4ZWQgZGltZW5zaW9uIChpbgordGhhdCBjYXNlIDEyOHgxMjgpIGJ1dCB0aGV5IGxlYXZlZCB0aG9zZSBwaW5zIGNvbmZpZ3VyZWQgZm9yIDEyOHgxNjAgc28KK3RoZXJlIHdhcyBzZXZlcmFsIHBpeGVsIG1lbW9yeSBhZGRyZXNzaW5nIHByb2JsZW1zLgorSSBzb2x2ZWQgYnkgc2V0dXAgc2V2ZXJhbCBwYXJhbWV0ZXJzIHRoYXQgZGluYW1pY2FsbHkgZml4IHRoZSByZXNvbHV0aW9uIGFzCituZWVkaXQgc28gYmVsb3cgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgZGlzcGxheS4gSWYgeW91IGhhdmUgYSBzdHJhaW4gb3IgYQorY29ycmVjdCBkaXNwbGF5IChjYW4gaGFwcGVuIHdpdGggY2hpbmVzZSkgeW91IGNhbiBjb3B5IHRob3NlIHBhcmFtZXRlcnMgYW5kCitjcmVhdGUgc2V0dXAgZm9yIGRpZmZlcmVudCBkaXNwbGF5cy4KKyovCisKKyNpZmRlZiBSRUQKKyNkZWZpbmUgX19PRkZTRVQJCTMyIC8qc2VlIG5vdGUgMiAtIHRoaXMgaXMgdGhlIHJlZCB2ZXJzaW9uICovCisjZWxzZQorI2RlZmluZSBfX09GRlNFVAkJMCAgLypzZWUgbm90ZSAyIC0gdGhpcyBpcyB0aGUgYmxhY2sgdmVyc2lvbiAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdF9kaXNwbGF5KHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKK3sKKwlmYnRmdF9wYXJfZGJnKERFQlVHX0lOSVRfRElTUExBWSwgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJcGFyLT5mYnRmdG9wcy5yZXNldChwYXIpOworCisJaWYgKHBhci0+Z3Bpby5jcyAhPSAtMSkKKwkJZ3Bpb19zZXRfdmFsdWUocGFyLT5ncGlvLmNzLCAwKTsgIC8qIEFjdGl2YXRlIGNoaXAgKi8KKworCXdyaXRlX3JlZyhwYXIsIENNRF9TV1JFU0VUKTsgLyogc29mdHdhcmUgcmVzZXQgKi8KKwltZGVsYXkoNTAwKTsKKwl3cml0ZV9yZWcocGFyLCBDTURfU0xQT1VUKTsgLyogZXhpdCBzbGVlcCAqLworCW1kZWxheSg1KTsKKwl3cml0ZV9yZWcocGFyLCBDTURfUElYRk1ULCAweDA1KTsgLyogU2V0IENvbG9yIEZvcm1hdCAxNmJpdCAqLworCXdyaXRlX3JlZyhwYXIsIENNRF9HQU1NQVNFVCwgMHgwMik7IC8qIGRlZmF1bHQgZ2FtbWEgY3VydmUgMyAqLworI2lmZGVmIEdBTU1BX0FESgorCXdyaXRlX3JlZyhwYXIsIENNRF9HQU1SU0VMLCAweDAxKTsgLyogRW5hYmxlIEdhbW1hIGFkaiAqLworI2VuZGlmCisJd3JpdGVfcmVnKHBhciwgQ01EX05PUk1MKTsKKwl3cml0ZV9yZWcocGFyLCBDTURfREZVTkNUUiwgMHhmZiwgMHgwNik7CisJLyogRnJhbWUgUmF0ZSBDb250cm9sIChJbiBub3JtYWwgbW9kZS9GdWxsIGNvbG9ycykgKi8KKwl3cml0ZV9yZWcocGFyLCBDTURfRlJNQ1RSMSwgMHgwOCwgMHgwMik7CisJd3JpdGVfcmVnKHBhciwgQ01EX0RJTlZDVFIsIDB4MDcpOyAvKiBkaXNwbGF5IGludmVyc2lvbiAgKi8KKwkvKiBTZXQgVlJIMVs0OjBdICYgVkNbMjowXSBmb3IgVkNJMSAmIEdWREQgKi8KKwl3cml0ZV9yZWcocGFyLCBDTURfUFdDVFIxLCAweDBBLCAweDAyKTsKKwkvKiBTZXQgQlRbMjowXSBmb3IgQVZERCAmIFZDTCAmIFZHSCAmIFZHTCAgKi8KKwl3cml0ZV9yZWcocGFyLCBDTURfUFdDVFIyLCAweDAyKTsKKwkvKiBTZXQgVk1IWzY6MF0gJiBWTUxbNjowXSBmb3IgVk9NSCAmIFZDT01MICovCisJd3JpdGVfcmVnKHBhciwgQ01EX1ZDT01DVFIxLCAweDUwLCAweDYzKTsKKwl3cml0ZV9yZWcocGFyLCBDTURfVkNPTU9GRlMsIDApOworCisJd3JpdGVfcmVnKHBhciwgQ01EX0NMTUFEUlMsIDAsIDAsIDAsIFdJRFRIKTsgLyogU2V0IENvbHVtbiBBZGRyZXNzICovCisJd3JpdGVfcmVnKHBhciwgQ01EX1BHRUFEUlMsIDAsIDAsIDAsIEhFSUdIVCk7IC8qIFNldCBQYWdlIEFkZHJlc3MgKi8KKworCXdyaXRlX3JlZyhwYXIsIENNRF9ESVNQT04pOyAvKiBkaXNwbGF5IE9OICovCisJd3JpdGVfcmVnKHBhciwgQ01EX1JBTVdSKTsgLyogTWVtb3J5IFdyaXRlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2FkZHJfd2luKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgaW50IHhzLCBpbnQgeXMsCisJCQkJaW50IHhlLCBpbnQgeWUpCit7CisJZmJ0ZnRfcGFyX2RiZyhERUJVR19TRVRfQUREUl9XSU4sIHBhciwKKwkJIiVzKHhzPSVkLCB5cz0lZCwgeGU9JWQsIHllPSVkKVxuIiwgX19mdW5jX18sIHhzLCB5cywgeGUsIHllKTsKKworCXN3aXRjaCAocGFyLT5pbmZvLT52YXIucm90YXRlKSB7CisJY2FzZSAwOgorCQl3cml0ZV9yZWcocGFyLCBDTURfQ0xNQURSUywgeHMgPj4gOCwgeHMgJiAweGZmLCB4ZSA+PiA4LAorCQkJCXhlICYgMHhmZik7CisJCXdyaXRlX3JlZyhwYXIsIENNRF9QR0VBRFJTLAorCQkJCSh5cyArIF9fT0ZGU0VUKSA+PiA4LCAoeXMgKyBfX09GRlNFVCkgJiAweGZmLAorCQkJCSh5ZSArIF9fT0ZGU0VUKSA+PiA4LCAoeWUgKyBfX09GRlNFVCkgJiAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSA5MDoKKwkJd3JpdGVfcmVnKHBhciwgQ01EX0NMTUFEUlMsCisJCQkJKHhzICsgX19PRkZTRVQpID4+IDgsICh4cyArIF9fT0ZGU0VUKSAmIDB4ZmYsCisJCQkJKHhlICsgX19PRkZTRVQpID4+IDgsICh4ZSArIF9fT0ZGU0VUKSAmIDB4ZmYpOworCQl3cml0ZV9yZWcocGFyLCBDTURfUEdFQURSUywgeXMgPj4gOCwgeXMgJiAweGZmLCB5ZSA+PiA4LAorCQkJCXllICYgMHhmZik7CisJCWJyZWFrOworCWNhc2UgMTgwOgorCWNhc2UgMjcwOgorCQl3cml0ZV9yZWcocGFyLCBDTURfQ0xNQURSUywgeHMgPj4gOCwgeHMgJiAweGZmLCB4ZSA+PiA4LAorCQkJCXhlICYgMHhmZik7CisJCXdyaXRlX3JlZyhwYXIsIENNRF9QR0VBRFJTLCB5cyA+PiA4LCB5cyAmIDB4ZmYsIHllID4+IDgsCisJCQkJeWUgJiAweGZmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFyLT5pbmZvLT52YXIucm90YXRlID0gMDsgLyogRml4IGluY29ycmVjdCBzZXR0aW5nICovCisJfQorCXdyaXRlX3JlZyhwYXIsIENNRF9SQU1XUik7IC8qIFdyaXRlIERhdGEgdG8gR1JBTSBtb2RlICovCit9CisKKy8qCis3KSBNWTogIDEoYm90dG9tIHRvIHRvcCksCTAodG9wIHRvIGJvdHRvbSkgICAgUm93IEFkZHJlc3MgT3JkZXIKKzYpIE1YOiAgMShSIHRvIEwpLAkJMChMIHRvIFIpCSAgICBDb2x1bW4gQWRkcmVzcyBPcmRlcgorNSkgTVY6ICAxKEV4Y2hhbmdlZCksCQkwKG5vcm1hbCkJICAgIFJvdy9Db2x1bW4gZXhjaGFuZ2UKKzQpIE1MOiAgMShib3R0b20gdG8gdG9wKSwJMCh0b3AgdG8gYm90dG9tKSAgICBWZXJ0aWNhbCBSZWZyZXNoIE9yZGVyCiszKSBSR0I6IDEoQkdSKSwJCQkwKFJHQikJCSAgICBDb2xvciBTcGFjZQorMikgTUg6ICAxKFIgdG8gTCksCQkwKEwgdG8gUikJICAgIEhvcml6b250YWwgUmVmcmVzaCBPcmRlcgorMSkKKzApCisKKwlNWSwgTVgsIE1WLCBNTCxSR0IsIE1ILCBEMSwgRDAKKwkwIHwgMCB8IDAgfCAwIHwgMSB8IDAgfCAwIHwgMAkvL25vcm1hbAorCTEgfCAwIHwgMCB8IDAgfCAxIHwgMCB8IDAgfCAwCS8vWS1NaXJyb3IKKwkwIHwgMSB8IDAgfCAwIHwgMSB8IDAgfCAwIHwgMAkvL1gtTWlycm9yCisJMSB8IDEgfCAwIHwgMCB8IDEgfCAwIHwgMCB8IDAJLy9YLVktTWlycm9yCisJMCB8IDAgfCAxIHwgMCB8IDEgfCAwIHwgMCB8IDAJLy9YLVkgRXhjaGFuZ2UKKwkxIHwgMCB8IDEgfCAwIHwgMSB8IDAgfCAwIHwgMAkvL1gtWSBFeGNoYW5nZSwgWS1NaXJyb3IKKwkwIHwgMSB8IDEgfCAwIHwgMSB8IDAgfCAwIHwgMAkvL1hZIGV4Y2hhbmdlCisJMSB8IDEgfCAxIHwgMCB8IDEgfCAwIHwgMCB8IDAKKyovCitzdGF0aWMgaW50IHNldF92YXIoc3RydWN0IGZidGZ0X3BhciAqcGFyKQoreworCXU4IG1hY3RybF9kYXRhID0gMDsgLyogQXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworCisJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAocGFyLT5pbmZvLT52YXIucm90YXRlKSB7CisJY2FzZSAwOgorCQltYWN0cmxfZGF0YSA9IDB4MDg7CisJCWJyZWFrOworCWNhc2UgMTgwOgorCQltYWN0cmxfZGF0YSA9IDB4Qzg7CisJCWJyZWFrOworCWNhc2UgMjcwOgorCQltYWN0cmxfZGF0YSA9IDB4QTg7CisJCWJyZWFrOworCWNhc2UgOTA6CisJCW1hY3RybF9kYXRhID0gMHg2ODsKKwkJYnJlYWs7CisJfQorCisJLyogQ29sb3JzcGNhZSAqLworCWlmIChwYXItPmJncikKKwkJbWFjdHJsX2RhdGEgfD0gKDEgPDwgMik7CisJd3JpdGVfcmVnKHBhciwgQ01EX01BRENUTCwgbWFjdHJsX2RhdGEpOworCXdyaXRlX3JlZyhwYXIsIENNRF9SQU1XUik7IC8qIFdyaXRlIERhdGEgdG8gR1JBTSBtb2RlICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBHQU1NQV9BREoKKyNkZWZpbmUgQ1VSVkUobnVtLCBpZHgpICBjdXJ2ZXNbbnVtKnBhci0+Z2FtbWEubnVtX3ZhbHVlcyArIGlkeF0KK3N0YXRpYyBpbnQgZ2FtbWFfYWRqKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQoreworCXVuc2lnbmVkIGxvbmcgbWFza1tdID0geworCQkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGLAorCQkweDFmLCAweDNmLCAweDBmLCAweDBmLCAweDdmLCAweDFmLAorCQkweDNGLCAweDNGLCAweDNGLCAweDNGLCAweDNGfTsKKwlpbnQgaSwgajsKKworCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgR0FNTUFfTlVNOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBHQU1NQV9MRU47IGorKykKKwkJCUNVUlZFKGksIGopICY9IG1hc2tbaSpwYXItPmdhbW1hLm51bV92YWx1ZXMgKyBqXTsKKworCXdyaXRlX3JlZyhwYXIsIENNRF9QR0FNTUFDLAorCQkJCUNVUlZFKDAsIDApLAorCQkJCUNVUlZFKDAsIDEpLAorCQkJCUNVUlZFKDAsIDIpLAorCQkJCUNVUlZFKDAsIDMpLAorCQkJCUNVUlZFKDAsIDQpLAorCQkJCUNVUlZFKDAsIDUpLAorCQkJCUNVUlZFKDAsIDYpLAorCQkJCShDVVJWRSgwLCA3KSA8PCA0KSB8IENVUlZFKDAsIDgpLAorCQkJCUNVUlZFKDAsIDkpLAorCQkJCUNVUlZFKDAsIDEwKSwKKwkJCQlDVVJWRSgwLCAxMSksCisJCQkJQ1VSVkUoMCwgMTIpLAorCQkJCUNVUlZFKDAsIDEzKSwKKwkJCQlDVVJWRSgwLCAxNCksCisJCQkJQ1VSVkUoMCwgMTUpCisJCQkJKTsKKworCXdyaXRlX3JlZyhwYXIsIENNRF9SQU1XUik7IC8qIFdyaXRlIERhdGEgdG8gR1JBTSBtb2RlICovCisKKwlyZXR1cm4gMDsKK30KKyN1bmRlZiBDVVJWRQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmJ0ZnRfZGlzcGxheSBkaXNwbGF5ID0geworCS5yZWd3aWR0aCA9IDgsCisJLndpZHRoID0gV0lEVEgsCisJLmhlaWdodCA9IEhFSUdIVCwKKwkuYnBwID0gQlBQLAorCS5mcHMgPSBGUFMsCisjaWZkZWYgR0FNTUFfQURKCisJLmdhbW1hX251bSA9IEdBTU1BX05VTSwKKwkuZ2FtbWFfbGVuID0gR0FNTUFfTEVOLAorCS5nYW1tYSA9IERFRkFVTFRfR0FNTUEsCisjZW5kaWYKKwkuZmJ0ZnRvcHMgPSB7CisJCS5pbml0X2Rpc3BsYXkgPSBpbml0X2Rpc3BsYXksCisJCS5zZXRfYWRkcl93aW4gPSBzZXRfYWRkcl93aW4sCisJCS5zZXRfdmFyID0gc2V0X3ZhciwKKyNpZmRlZiBHQU1NQV9BREoKKwkJLnNldF9nYW1tYSA9IGdhbW1hX2FkaiwKKyNlbmRpZgorCX0sCit9OworCitGQlRGVF9SRUdJU1RFUl9EUklWRVIoRFJWTkFNRSwgImlsaXRlayxpbGk5MTYzIiwgJmRpc3BsYXkpOworCitNT0RVTEVfQUxJQVMoInNwaToiIERSVk5BTUUpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVk5BTUUpOworTU9EVUxFX0FMSUFTKCJzcGk6aWxpOTE2MyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTppbGk5MTYzIik7CisKK01PRFVMRV9ERVNDUklQVElPTigiRkIgZHJpdmVyIGZvciB0aGUgSUxJOTE2MyBMQ0QgQ29udHJvbGxlciIpOworTU9EVUxFX0FVVEhPUigiS296aGV2bmlrb3YgQW5hdG9seSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzIwLmMKaW5kZXggYjI2ZDg5My4uM2EwMmVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyMC5jCkBAIC00Nyw2ICs0Nyw3IEBACiBzdGF0aWMgaW50IGluaXRfZGlzcGxheShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCiB7CiAJdW5zaWduZWQgZGV2Y29kZTsKKwogCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAlwYXItPmZidGZ0b3BzLnJlc2V0KHBhcik7CkBAIC0xNzgsMTAgKzE3OSw5IEBACiBzdGF0aWMgaW50IHNldF9nYW1tYShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGxvbmcgKmN1cnZlcykKIHsKIAl1bnNpZ25lZCBsb25nIG1hc2tbXSA9IHsKLQkJMGIxMTExMSwgMGIxMTExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwKLQkJMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLAotCQkwYjExMTExLCAwYjExMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLAotCQkwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEgfTsKKwkJMHgxZiwgMHgxZiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywKKwkJMHgxZiwgMHgxZiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywKKwl9OwogCWludCBpLCBqOwogCiAJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyNS5jCmluZGV4IDVmODgxNDUuLjE5ZDI1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzI1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjUuYwpAQCAtNDEsMjIgKzQxLDIyIEBACiBtb2R1bGVfcGFyYW0oYnQsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhidCwgIlNldHMgdGhlIGZhY3RvciB1c2VkIGluIHRoZSBzdGVwLXVwIGNpcmN1aXRzIik7CiAKLXN0YXRpYyB1bnNpZ25lZCB2YyA9IDBiMDExOyAvKiBWY2kxPVZjaSowLjgwICovCitzdGF0aWMgdW5zaWduZWQgdmMgPSAweDAzOyAvKiBWY2kxPVZjaSowLjgwICovCiBtb2R1bGVfcGFyYW0odmMsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2YywKICJTZXRzIHRoZSByYXRpbyBmYWN0b3Igb2YgVmNpIHRvIGdlbmVyYXRlIHRoZSByZWZlcmVuY2Ugdm9sdGFnZXMgVmNpMSIpOwogCi1zdGF0aWMgdW5zaWduZWQgdnJoID0gMGIxMTAxOyAvKiBWUkVHMU9VVD1WY2kqMS44NSAqLworc3RhdGljIHVuc2lnbmVkIHZyaCA9IDB4MGQ7IC8qIFZSRUcxT1VUPVZjaSoxLjg1ICovCiBtb2R1bGVfcGFyYW0odnJoLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModnJoLAogIlNldCB0aGUgYW1wbGlmeWluZyByYXRlICgxLjYgfiAxLjkpIG9mIFZjaSBhcHBsaWVkIHRvIG91dHB1dCB0aGUgVlJFRzFPVVQiKTsKIAotc3RhdGljIHVuc2lnbmVkIHZkdiA9IDBiMTAwMTA7IC8qIFZDT01IIGFtcGxpdHVkZT1WUkVHMU9VVCowLjk4ICovCitzdGF0aWMgdW5zaWduZWQgdmR2ID0gMHgxMjsgLyogVkNPTUggYW1wbGl0dWRlPVZSRUcxT1VUKjAuOTggKi8KIG1vZHVsZV9wYXJhbSh2ZHYsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2ZHYsCiAiU2VsZWN0IHRoZSBmYWN0b3Igb2YgVlJFRzFPVVQgdG8gc2V0IHRoZSBhbXBsaXR1ZGUgb2YgVmNvbSIpOwogCi1zdGF0aWMgdW5zaWduZWQgdmNtID0gMGIwMDEwMTA7IC8qIFZDT01IPVZSRUcxT1VUKjAuNzM1ICovCitzdGF0aWMgdW5zaWduZWQgdmNtID0gMHgwYTsgLyogVkNPTUg9VlJFRzFPVVQqMC43MzUgKi8KIG1vZHVsZV9wYXJhbSh2Y20sIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2Y20sICJTZXQgdGhlIGludGVybmFsIFZjb21IIHZvbHRhZ2UiKTsKIApAQCAtMTA4LDExICsxMDgsMTEgQEAKIAlpZiAocGFyLT5ncGlvLmNzICE9IC0xKQogCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uY3MsIDApOyAgLyogQWN0aXZhdGUgY2hpcCAqLwogCi0JYnQgJj0gMGIxMTE7Ci0JdmMgJj0gMGIxMTE7Ci0JdnJoICY9IDBiMTExMTsKLQl2ZHYgJj0gMGIxMTExMTsKLQl2Y20gJj0gMGIxMTExMTE7CisJYnQgJj0gMHgwNzsKKwl2YyAmPSAweDA3OworCXZyaCAmPSAweDBmOworCXZkdiAmPSAweDFmOworCXZjbSAmPSAweDNmOwogCiAJLyogSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgZnJvbSBJTEk5MzI1IEFwcGxpY2F0aW9uIE5vdGVzICovCiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogCXdyaXRlX3JlZyhwYXIsIDB4MDAxMywgMHgwMDAwKTsgLyogVkRWWzQ6MF0gZm9yIFZDT00gYW1wbGl0dWRlICovCiAJbWRlbGF5KDIwMCk7IC8qIERpcy1jaGFyZ2UgY2FwYWNpdG9yIHBvd2VyIHZvbHRhZ2UgKi8KIAl3cml0ZV9yZWcocGFyLCAweDAwMTAsIC8qIFNBUCwgQlRbMzowXSwgQVAsIERTVEIsIFNMUCwgU1RCICovCi0JCSgxIDw8IDEyKSB8IChidCA8PCA4KSB8ICgxIDw8IDcpIHwgKDBiMDAxIDw8IDQpKTsKKwkJKDEgPDwgMTIpIHwgKGJ0IDw8IDgpIHwgKDEgPDwgNykgfCAoMHgwMSA8PCA0KSk7CiAJd3JpdGVfcmVnKHBhciwgMHgwMDExLCAweDIyMCB8IHZjKTsgLyogREMxWzI6MF0sIERDMFsyOjBdLCBWQ1syOjBdICovCiAJbWRlbGF5KDUwKTsgLyogRGVsYXkgNTBtcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MDAxMiwgdnJoKTsgLyogSW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2U9IFZjaTsgKi8KQEAgLTIzMywxMCArMjMzLDkgQEAKIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewogCXVuc2lnbmVkIGxvbmcgbWFza1tdID0gewotCQkwYjExMTExLCAwYjExMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLAotCQkwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsCi0JCTBiMTExMTEsIDBiMTExMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsCi0JCTBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSB9OworCQkweDFmLCAweDFmLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorCQkweDFmLCAweDFmLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorCX07CiAJaW50IGksIGo7CiAKIAlmYnRmdF9wYXJfZGJnKERFQlVHX0lOSVRfRElTUExBWSwgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzNDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzQwLmMKaW5kZXggOTg1Njg3ZC4uMGY0YTQyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzNDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTM0MC5jCkBAIC0zOSwxMiArMzksMTIgQEAKIAlwYXItPmZidGZ0b3BzLnJlc2V0KHBhcik7CiAKIAl3cml0ZV9yZWcocGFyLCAweEVGLCAweDAzLCAweDgwLCAweDAyKTsKLQl3cml0ZV9yZWcocGFyLCAweENGLCAweDAwICwgMFhDMSAsIDBYMzApOwotCXdyaXRlX3JlZyhwYXIsIDB4RUQsIDB4NjQgLCAweDAzICwgMFgxMiAsIDBYODEpOwotCXdyaXRlX3JlZyhwYXIsIDB4RTgsIDB4ODUgLCAweDAwICwgMHg3OCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHhDQiwgMHgzOSAsIDB4MkMgLCAweDAwICwgMHgzNCAsIDB4MDIpOworCXdyaXRlX3JlZyhwYXIsIDB4Q0YsIDB4MDAsIDBYQzEsIDBYMzApOworCXdyaXRlX3JlZyhwYXIsIDB4RUQsIDB4NjQsIDB4MDMsIDBYMTIsIDBYODEpOworCXdyaXRlX3JlZyhwYXIsIDB4RTgsIDB4ODUsIDB4MDAsIDB4NzgpOworCXdyaXRlX3JlZyhwYXIsIDB4Q0IsIDB4MzksIDB4MkMsIDB4MDAsIDB4MzQsIDB4MDIpOwogCXdyaXRlX3JlZyhwYXIsIDB4RjcsIDB4MjApOwotCXdyaXRlX3JlZyhwYXIsIDB4RUEsIDB4MDAgLCAweDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweEVBLCAweDAwLCAweDAwKTsKIAogCS8qIFBvd2VyIENvbnRyb2wgMSAqLwogCXdyaXRlX3JlZyhwYXIsIDB4QzAsIDB4MjMpOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJLyogQ29sdW1uIGFkZHJlc3MgKi8KIAl3cml0ZV9yZWcocGFyLCAweDJBLCB4cyA+PiA4LCB4cyAmIDB4RkYsIHhlID4+IDgsIHhlICYgMHhGRik7CiAKLQkvKiBSb3cgYWRyZXNzICovCisJLyogUm93IGFkZHJlc3MgKi8KIAl3cml0ZV9yZWcocGFyLCAweDJCLCB5cyA+PiA4LCB5cyAmIDB4RkYsIHllID4+IDgsIHllICYgMHhGRik7CiAKIAkvKiBNZW1vcnkgd3JpdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzQxLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTM0MS5jCmluZGV4IDIyNWIyZDguLjcwOTQ5MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzQxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzNDEuYwpAQCAtNCw3ICs0LDcgQEAKICAqIFRoaXMgZGlzcGxheSB1c2VzIDktYml0IFNQSTogRGF0YS9Db21tYW5kIGJpdCArIDggZGF0YSBiaXRzCiAgKiBGb3IgcGxhdGZvcm1zIHRoYXQgZG9lc24ndCBzdXBwb3J0IDktYml0LCB0aGUgZHJpdmVyIGlzIGNhcGFibGUKICAqIG9mIGVtdWxhdGluZyB0aGlzIHVzaW5nIDgtYml0IHRyYW5zZmVyLgotICogVGhpcyBpcyBkb25lIGJ5IHRyYW5zZmVyaW5nIGVpZ2h0IDktYml0IHdvcmRzIGluIDkgYnl0ZXMuCisgKiBUaGlzIGlzIGRvbmUgYnkgdHJhbnNmZXJyaW5nIGVpZ2h0IDktYml0IHdvcmRzIGluIDkgYnl0ZXMuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDEzIENocmlzdGlhbiBWb2dlbGdzYW5nCiAgKiBCYXNlZCBvbiBhZGFmcnVpdDIyZmIuYyBieSBOb3JhbGYgVHJvbm5lcwpAQCAtODksNyArODksNyBAQAogCXdyaXRlX3JlZyhwYXIsIDB4MkEsCiAJCSh4cyA+PiA4KSAmIDB4RkYsIHhzICYgMHhGRiwgKHhlID4+IDgpICYgMHhGRiwgeGUgJiAweEZGKTsKIAotCS8qIFJvdyBhZHJlc3Mgc2V0ICovCisJLyogUm93IGFkZHJlc3Mgc2V0ICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQiwKIAkJKHlzID4+IDgpICYgMHhGRiwgeXMgJiAweEZGLCAoeWUgPj4gOCkgJiAweEZGLCB5ZSAmIDB4RkYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTQ4MS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTk0ODEuYwppbmRleCA3MjUxNTdhLi44YmFlMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTQ4MS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5NDgxLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkvKiBjb2x1bW4gYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MmEsIHhzID4+IDgsIHhzICYgMHhmZiwgeGUgPj4gOCwgeGUgJiAweGZmKTsKIAotCS8qIHJvdyBhZHJlc3MgKi8KKwkvKiBSb3cgYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MmIsIHlzID4+IDgsIHlzICYgMHhmZiwgeWUgPj4gOCwgeWUgJiAweGZmKTsKIAogCS8qIG1lbW9yeSB3cml0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTk0ODYuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5NDg2LmMKaW5kZXggOTViODk5OS4uZGQ0ZGRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTk0ODYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTQ4Ni5jCkBAIC00NCwxMyArNDQsMTMgQEAKIAktMSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKIAkvKiBQR0FNQ1RSTChQb3NpdGl2ZSBHYW1tYSBDb250cm9sKSAqLwogCS0xLCAweEUwLCAweDBGLCAweDFGLCAweDFDLCAweDBDLCAweDBGLCAweDA4LCAweDQ4LCAweDk4LAotCSAgICAgICAgICAweDM3LCAweDBBLCAweDEzLCAweDA0LCAweDExLCAweDBELCAweDAwLAorCQkgIDB4MzcsIDB4MEEsIDB4MTMsIDB4MDQsIDB4MTEsIDB4MEQsIDB4MDAsCiAJLyogTkdBTUNUUkwoTmVnYXRpdmUgR2FtbWEgQ29udHJvbCkgKi8KIAktMSwgMHhFMSwgMHgwRiwgMHgzMiwgMHgyRSwgMHgwQiwgMHgwRCwgMHgwNSwgMHg0NywgMHg3NSwKLQkgICAgICAgICAgMHgzNywgMHgwNiwgMHgxMCwgMHgwMywgMHgyNCwgMHgyMCwgMHgwMCwKKwkJICAweDM3LCAweDA2LCAweDEwLCAweDAzLCAweDI0LCAweDIwLCAweDAwLAogCS8qIERpZ2l0YWwgR2FtbWEgQ29udHJvbCAxICovCiAJLTEsIDB4RTIsIDB4MEYsIDB4MzIsIDB4MkUsIDB4MEIsIDB4MEQsIDB4MDUsIDB4NDcsIDB4NzUsCi0JICAgICAgICAgIDB4MzcsIDB4MDYsIDB4MTAsIDB4MDMsIDB4MjQsIDB4MjAsIDB4MDAsCisJCSAgMHgzNywgMHgwNiwgMHgxMCwgMHgwMywgMHgyNCwgMHgyMCwgMHgwMCwKIAkvKiBTbGVlcCBPVVQgKi8KIAktMSwgMHgxMSwKIAkvKiBEaXNwbGF5IE9OICovCkBAIC02Nyw3ICs2Nyw3IEBACiAJLyogQ29sdW1uIGFkZHJlc3MgKi8KIAl3cml0ZV9yZWcocGFyLCAweDJBLCB4cyA+PiA4LCB4cyAmIDB4RkYsIHhlID4+IDgsIHhlICYgMHhGRik7CiAKLQkvKiBSb3cgYWRyZXNzICovCisJLyogUm93IGFkZHJlc3MgKi8KIAl3cml0ZV9yZWcocGFyLCAweDJCLCB5cyA+PiA4LCB5cyAmIDB4RkYsIHllID4+IDgsIHllICYgMHhGRik7CiAKIAkvKiBNZW1vcnkgd3JpdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9wY2Q4NTQ0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfcGNkODU0NC5jCmluZGV4IDhiOWViZmIuLjE1ZGEwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9wY2Q4NTQ0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3BjZDg1NDQuYwpAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBXSURUSCAgICAgICAgICA4NAogI2RlZmluZSBIRUlHSFQgICAgICAgICA0OAogI2RlZmluZSBUWEJVRkxFTiAgICAgICAoODQqNikKLSNkZWZpbmUgREVGQVVMVF9HQU1NQSAgIjQwIiAvKiBnYW1tYSBpcyB1c2VkIHRvIGNvbnRyb2wgY29udHJhc3QgaW4gdGhpcyBkcml2ZXIgKi8KKyNkZWZpbmUgREVGQVVMVF9HQU1NQSAgIjQwIiAvKiBnYW1tYSBjb250cm9scyB0aGUgY29udHJhc3QgaW4gdGhpcyBkcml2ZXIgKi8KIAogc3RhdGljIHVuc2lnbmVkIHRjOwogbW9kdWxlX3BhcmFtKHRjLCB1aW50LCAwKTsKQEAgLTUxLDYxICs1MSw3MyBAQAogCiAJcGFyLT5mYnRmdG9wcy5yZXNldChwYXIpOwogCi0JLyogRnVuY3Rpb24gc2V0ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgyMSk7IC8qIDU6MSAgMQotCSAgICAgICAgICAgICAgICAgICAgICAgICAyOjAgIFBEIC0gUG93ZXJkb3duIGNvbnRyb2w6IGNoaXAgaXMgYWN0aXZlCi0JCQkJCQkJIDE6MCAgViAgLSBFbnRyeSBtb2RlOiBob3Jpem9udGFsIGFkZHJlc3NpbmcKLQkJCQkJCQkgMDoxICBIICAtIEV4dGVuZGVkIGluc3RydWN0aW9uIHNldCBjb250cm9sOiBleHRlbmRlZAotCQkJCQkJICAqLworCS8qIEZ1bmN0aW9uIHNldAorCSAqCisJICogNToxICAxCisJICogMjowICBQRCAtIFBvd2VyZG93biBjb250cm9sOiBjaGlwIGlzIGFjdGl2ZQorCSAqIDE6MCAgViAgLSBFbnRyeSBtb2RlOiBob3Jpem9udGFsIGFkZHJlc3NpbmcKKwkgKiAwOjEgIEggIC0gRXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gc2V0IGNvbnRyb2w6IGV4dGVuZGVkCisJICovCisJd3JpdGVfcmVnKHBhciwgMHgyMSk7CiAKLQkvKiBIPTEgVGVtcGVyYXR1cmUgY29udHJvbCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDQgfCAodGMgJiAweDMpKTsgLyoKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMjoxICAxCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDE6eCAgVEMxIC0gVGVtcGVyYXR1cmUgQ29lZmZpY2llbnQ6IDB4MTAKLQkJCQkJCQkgMDp4ICBUQzAKLQkJCQkJCSAgKi8KKwkvKiBIPTEgVGVtcGVyYXR1cmUgY29udHJvbAorCSAqCisJICogMjoxICAxCisJICogMTp4ICBUQzEgLSBUZW1wZXJhdHVyZSBDb2VmZmljaWVudDogMHgxMAorCSAqIDA6eCAgVEMwCisJICovCisJd3JpdGVfcmVnKHBhciwgMHgwNCB8ICh0YyAmIDB4MykpOwogCi0JLyogSD0xIEJpYXMgc3lzdGVtICovCi0Jd3JpdGVfcmVnKHBhciwgMHgxMCB8IChicyAmIDB4NykpOyAvKgotCSAgICAgICAgICAgICAgICAgICAgICAgICA0OjEgIDEKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMzowICAwCi0JCQkJCQkJIDI6eCAgQlMyIC0gQmlhcyBTeXN0ZW0KLQkJCQkJCQkgMTp4ICBCUzEKLQkJCQkJCQkgMDp4ICBCUzAKLQkgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBIPTEgQmlhcyBzeXN0ZW0KKwkgKgorCSAqIDQ6MSAgMQorCSAqIDM6MCAgMAorCSAqIDI6eCAgQlMyIC0gQmlhcyBTeXN0ZW0KKwkgKiAxOnggIEJTMQorCSAqIDA6eCAgQlMwCisJICovCisJd3JpdGVfcmVnKHBhciwgMHgxMCB8IChicyAmIDB4NykpOwogCi0JLyogRnVuY3Rpb24gc2V0ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgyMik7IC8qIDU6MSAgMQotCSAgICAgICAgICAgICAgICAgICAgICAgICAyOjAgIFBEIC0gUG93ZXJkb3duIGNvbnRyb2w6IGNoaXAgaXMgYWN0aXZlCi0JCQkJCQkJIDE6MSAgViAgLSBFbnRyeSBtb2RlOiB2ZXJ0aWNhbCBhZGRyZXNzaW5nCi0JCQkJCQkJIDA6MCAgSCAgLSBFeHRlbmRlZCBpbnN0cnVjdGlvbiBzZXQgY29udHJvbDogYmFzaWMKLQkJCQkJCSAgKi8KKwkvKiBGdW5jdGlvbiBzZXQKKwkgKgorCSAqIDU6MSAgMQorCSAqIDI6MCAgUEQgLSBQb3dlcmRvd24gY29udHJvbDogY2hpcCBpcyBhY3RpdmUKKwkgKiAxOjEgIFYgIC0gRW50cnkgbW9kZTogdmVydGljYWwgYWRkcmVzc2luZworCSAqIDA6MCAgSCAgLSBFeHRlbmRlZCBpbnN0cnVjdGlvbiBzZXQgY29udHJvbDogYmFzaWMKKwkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDIyKTsKIAotCS8qIEg9MCBEaXNwbGF5IGNvbnRyb2wgKi8KLQl3cml0ZV9yZWcocGFyLCAweDA4IHwgNCk7IC8qCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDM6MSAgMQotCSAgICAgICAgICAgICAgICAgICAgICAgICAyOjEgIEQgIC0gREU6IDEwPW5vcm1hbCBtb2RlCi0JCQkJCQkJIDE6MCAgMAotCQkJCQkJCSAwOjAgIEUKLQkJCQkJCSAgKi8KKwkvKiBIPTAgRGlzcGxheSBjb250cm9sCisJICoKKwkgKiAzOjEgIDEKKwkgKiAyOjEgIEQgIC0gREU6IDEwPW5vcm1hbCBtb2RlCisJICogMTowICAwCisJICogMDowICBFCisJICovCisJd3JpdGVfcmVnKHBhciwgMHgwOCB8IDQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9hZGRyX3dpbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCB4cywgaW50IHlzLCBpbnQgeGUsIGludCB5ZSkKIHsKLQlmYnRmdF9wYXJfZGJnKERFQlVHX1NFVF9BRERSX1dJTiwgcGFyLCAiJXMoeHM9JWQsIHlzPSVkLCB4ZT0lZCwgeWU9JWQpXG4iLCBfX2Z1bmNfXywgeHMsIHlzLCB4ZSwgeWUpOworCWZidGZ0X3Bhcl9kYmcoREVCVUdfU0VUX0FERFJfV0lOLCBwYXIsICIlcyh4cz0lZCwgeXM9JWQsIHhlPSVkLCB5ZT0lZClcbiIsCisJCSAgICAgIF9fZnVuY19fLCB4cywgeXMsIHhlLCB5ZSk7CiAKLQkvKiBIPTAgU2V0IFggYWRkcmVzcyBvZiBSQU0gKi8KLQl3cml0ZV9yZWcocGFyLCAweDgwKTsgLyogNzoxICAxCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDYtMDogWFs2OjBdIC0gMHgwMAotCSAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEg9MCBTZXQgWCBhZGRyZXNzIG9mIFJBTQorCSAqCisJICogNzoxICAxCisJICogNi0wOiBYWzY6MF0gLSAweDAwCisJICovCisJd3JpdGVfcmVnKHBhciwgMHg4MCk7CiAKLQkvKiBIPTAgU2V0IFkgYWRkcmVzcyBvZiBSQU0gKi8KLQl3cml0ZV9yZWcocGFyLCAweDQwKTsgLyogNzowICAwCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDY6MSAgMQotCSAgICAgICAgICAgICAgICAgICAgICAgICAyLTA6IFlbMjowXSAtIDB4MAotCSAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEg9MCBTZXQgWSBhZGRyZXNzIG9mIFJBTQorCSAqCisJICogNzowICAwCisJICogNjoxICAxCisJICogMi0wOiBZWzI6MF0gLSAweDAKKwkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDQwKTsKIH0KIAogc3RhdGljIGludCB3cml0ZV92bWVtKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbikKQEAgLTEyMCw5ICsxMzIsOCBAQAogCWZvciAoeCA9IDA7IHggPCA4NDsgeCsrKSB7CiAJCWZvciAoeSA9IDA7IHkgPCA2OyB5KyspIHsKIAkJCSpidWYgPSAweDAwOwotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJCQkqYnVmIHw9ICh2bWVtMTZbKHkqOCtpKSo4NCt4XSA/IDEgOiAwKSA8PCBpOwotCQkJfQogCQkJYnVmKys7CiAJCX0KIAl9CkBAIC0xMzEsNyArMTQyLDggQEAKIAlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uZGMsIDEpOwogCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPnR4YnVmLmJ1ZiwgNio4NCk7CiAJaWYgKHJldCA8IDApCi0JCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsICIlczogd3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAid3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsCisJCQlyZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9yYTg4NzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9yYTg4NzUuYwppbmRleCBjMzIzYzA2Li4yYzRkNGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfcmE4ODc1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3JhODg3NS5jCkBAIC0xMSw3ICsxMSw3IEBACiAJCQkJCQkgICoqKioqICAgICAgKiAgICoKICAgRGF0ZSAgICA6IDEwLjA2LjIwMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAqCiAgIFZlcnNpb24gOiBWMS4xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqCi0gIFJldmlzb24gOiA1CisgIFJldmlzaW9uIDogNQogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtNzksMTEyICs3OSwxMTIgQEAKIAogCWlmICgocGFyLT5pbmZvLT52YXIueHJlcyA9PSAzMjApICYmIChwYXItPmluZm8tPnZhci55cmVzID09IDI0MCkpIHsKIAkJLyogUExMIGNsb2NrIGZyZXF1ZW5jeSAqLwotCQl3cml0ZV9yZWcocGFyLCAweDg4ICwgMHgwQSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4ODkgLCAweDAyKTsKKwkJd3JpdGVfcmVnKHBhciwgMHg4OCwgMHgwQSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4ODksIDB4MDIpOwogCQltZGVsYXkoMTApOwogCQkvKiBjb2xvciBkZWVwIC8gTUNVIEludGVyZmFjZSAqLwotCQl3cml0ZV9yZWcocGFyLCAweDEwICwgMHgwQyk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTAsIDB4MEMpOwogCQkvKiBwaXhlbCBjbG9jayBwZXJpb2QgICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MDQgLCAweDAzKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgwNCwgMHgwMyk7CiAJCW1kZWxheSgxKTsKIAkJLyogaG9yaXpvbnRhbCBzZXR0aW5ncyAqLwotCQl3cml0ZV9yZWcocGFyLCAweDE0ICwgMHgyNyk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTUgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNiAsIDB4MDUpOwotCQl3cml0ZV9yZWcocGFyLCAweDE3ICwgMHgwNCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTggLCAweDAzKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNCwgMHgyNyk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTUsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDE2LCAweDA1KTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNywgMHgwNCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTgsIDB4MDMpOwogCQkvKiB2ZXJ0aWNhbCBzZXR0aW5ncyAqLwotCQl3cml0ZV9yZWcocGFyLCAweDE5ICwgMHhFRik7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUEgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQiAsIDB4MDUpOwotCQl3cml0ZV9yZWcocGFyLCAweDFDICwgMHgwMCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUQgLCAweDBFKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRSAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDFGICwgMHgwMik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTksIDB4RUYpOworCQl3cml0ZV9yZWcocGFyLCAweDFBLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQiwgMHgwNSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUMsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDFELCAweDBFKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRSwgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUYsIDB4MDIpOwogCX0gZWxzZSBpZiAoKHBhci0+aW5mby0+dmFyLnhyZXMgPT0gNDgwKSAmJiAocGFyLT5pbmZvLT52YXIueXJlcyA9PSAyNzIpKSB7CiAJCS8qIFBMTCBjbG9jayBmcmVxdWVuY3kgICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4ODggLCAweDBBKTsKLQkJd3JpdGVfcmVnKHBhciwgMHg4OSAsIDB4MDIpOworCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBBKTsKKwkJd3JpdGVfcmVnKHBhciwgMHg4OSwgMHgwMik7CiAJCW1kZWxheSgxMCk7CiAJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTAgLCAweDBDKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CiAJCS8qIHBpeGVsIGNsb2NrIHBlcmlvZCAgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgwNCAsIDB4ODIpOworCQl3cml0ZV9yZWcocGFyLCAweDA0LCAweDgyKTsKIAkJbWRlbGF5KDEpOwogCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTQgLCAweDNCKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNSAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDE2ICwgMHgwMSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTcgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxOCAsIDB4MDUpOworCQl3cml0ZV9yZWcocGFyLCAweDE0LCAweDNCKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTYsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDE3LCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwNSk7CiAJCS8qIHZlcnRpY2FsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTkgLCAweDBGKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQSAsIDB4MDEpOwotCQl3cml0ZV9yZWcocGFyLCAweDFCICwgMHgwMik7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUMgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRCAsIDB4MDcpOwotCQl3cml0ZV9yZWcocGFyLCAweDFFICwgMHgwMCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUYgLCAweDA5KTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOSwgMHgwRik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUEsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDAyKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQywgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUQsIDB4MDcpOworCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRiwgMHgwOSk7CiAJfSBlbHNlIGlmICgocGFyLT5pbmZvLT52YXIueHJlcyA9PSA2NDApICYmIChwYXItPmluZm8tPnZhci55cmVzID09IDQ4MCkpIHsKIAkJLyogUExMIGNsb2NrIGZyZXF1ZW5jeSAqLwotCQl3cml0ZV9yZWcocGFyLCAweDg4ICwgMHgwQik7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4ODkgLCAweDAyKTsKKwkJd3JpdGVfcmVnKHBhciwgMHg4OCwgMHgwQik7CisJCXdyaXRlX3JlZyhwYXIsIDB4ODksIDB4MDIpOwogCQltZGVsYXkoMTApOwogCQkvKiBjb2xvciBkZWVwIC8gTUNVIEludGVyZmFjZSAqLwotCQl3cml0ZV9yZWcocGFyLCAweDEwICwgMHgwQyk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTAsIDB4MEMpOwogCQkvKiBwaXhlbCBjbG9jayBwZXJpb2QgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgwNCAsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDA0LCAweDAxKTsKIAkJbWRlbGF5KDEpOwogCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTQgLCAweDRGKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNSAsIDB4MDUpOwotCQl3cml0ZV9yZWcocGFyLCAweDE2ICwgMHgwRik7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTcgLCAweDAxKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxOCAsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDE0LCAweDRGKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwNSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTYsIDB4MEYpOworCQl3cml0ZV9yZWcocGFyLCAweDE3LCAweDAxKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwMCk7CiAJCS8qIHZlcnRpY2FsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTkgLCAweERGKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQSAsIDB4MDEpOwotCQl3cml0ZV9yZWcocGFyLCAweDFCICwgMHgwQSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUMgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRCAsIDB4MEUpOwotCQl3cml0ZV9yZWcocGFyLCAweDFFICwgMHgwMCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUYgLCAweDAxKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOSwgMHhERik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUEsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDBBKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQywgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUQsIDB4MEUpOworCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRiwgMHgwMSk7CiAJfSBlbHNlIGlmICgocGFyLT5pbmZvLT52YXIueHJlcyA9PSA4MDApICYmIChwYXItPmluZm8tPnZhci55cmVzID09IDQ4MCkpIHsKIAkJLyogUExMIGNsb2NrIGZyZXF1ZW5jeSAqLwotCQl3cml0ZV9yZWcocGFyLCAweDg4ICwgMHgwQik7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4ODkgLCAweDAyKTsKKwkJd3JpdGVfcmVnKHBhciwgMHg4OCwgMHgwQik7CisJCXdyaXRlX3JlZyhwYXIsIDB4ODksIDB4MDIpOwogCQltZGVsYXkoMTApOwogCQkvKiBjb2xvciBkZWVwIC8gTUNVIEludGVyZmFjZSAqLwotCQl3cml0ZV9yZWcocGFyLCAweDEwICwgMHgwQyk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTAsIDB4MEMpOwogCQkvKiBwaXhlbCBjbG9jayBwZXJpb2QgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgwNCAsIDB4ODEpOworCQl3cml0ZV9yZWcocGFyLCAweDA0LCAweDgxKTsKIAkJbWRlbGF5KDEpOwogCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTQgLCAweDYzKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNSAsIDB4MDMpOwotCQl3cml0ZV9yZWcocGFyLCAweDE2ICwgMHgwMyk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTcgLCAweDAyKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxOCAsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDE0LCAweDYzKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwMyk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTYsIDB4MDMpOworCQl3cml0ZV9yZWcocGFyLCAweDE3LCAweDAyKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwMCk7CiAJCS8qIHZlcnRpY2FsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTkgLCAweERGKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQSAsIDB4MDEpOwotCQl3cml0ZV9yZWcocGFyLCAweDFCICwgMHgxNCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUMgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRCAsIDB4MDYpOwotCQl3cml0ZV9yZWcocGFyLCAweDFFICwgMHgwMCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUYgLCAweDAxKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOSwgMHhERik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUEsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDE0KTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQywgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUQsIDB4MDYpOworCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRiwgMHgwMSk7CiAJfSBlbHNlIHsKIAkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgImRpc3BsYXkgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkISEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIFBXTSBjbG9jayAqLwotCXdyaXRlX3JlZyhwYXIsIDB4OGEgLCAweDgxKTsKLQl3cml0ZV9yZWcocGFyLCAweDhiICwgMHhGRik7CisJd3JpdGVfcmVnKHBhciwgMHg4YSwgMHg4MSk7CisJd3JpdGVfcmVnKHBhciwgMHg4YiwgMHhGRik7CiAJbWRlbGF5KDEwKTsKIAogCS8qIERpc3BsYXkgT04gKi8KLQl3cml0ZV9yZWcocGFyLCAweDAxICwgMHg4MCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMSwgMHg4MCk7CiAJbWRlbGF5KDEwKTsKIAogCXJldHVybiAwOwpAQCAtMTk2LDE0ICsxOTYsMTQgQEAKIAkJIiVzKHhzPSVkLCB5cz0lZCwgeGU9JWQsIHllPSVkKVxuIiwgX19mdW5jX18sIHhzLCB5cywgeGUsIHllKTsKIAogCS8qIFNldF9BY3RpdmVfV2luZG93ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgzMCAsIHhzICYgMHgwMEZGKTsKLQl3cml0ZV9yZWcocGFyLCAweDMxICwgKHhzICYgMHhGRjAwKSA+PiA4KTsKLQl3cml0ZV9yZWcocGFyLCAweDMyICwgeXMgJiAweDAwRkYpOwotCXdyaXRlX3JlZyhwYXIsIDB4MzMgLCAoeXMgJiAweEZGMDApID4+IDgpOwotCXdyaXRlX3JlZyhwYXIsIDB4MzQgLCAoeHMreGUpICYgMHgwMEZGKTsKLQl3cml0ZV9yZWcocGFyLCAweDM1ICwgKCh4cyt4ZSkgJiAweEZGMDApID4+IDgpOwotCXdyaXRlX3JlZyhwYXIsIDB4MzYgLCAoeXMreWUpICYgMHgwMEZGKTsKLQl3cml0ZV9yZWcocGFyLCAweDM3ICwgKCh5cyt5ZSkgJiAweEZGMDApID4+IDgpOworCXdyaXRlX3JlZyhwYXIsIDB4MzAsIHhzICYgMHgwMEZGKTsKKwl3cml0ZV9yZWcocGFyLCAweDMxLCAoeHMgJiAweEZGMDApID4+IDgpOworCXdyaXRlX3JlZyhwYXIsIDB4MzIsIHlzICYgMHgwMEZGKTsKKwl3cml0ZV9yZWcocGFyLCAweDMzLCAoeXMgJiAweEZGMDApID4+IDgpOworCXdyaXRlX3JlZyhwYXIsIDB4MzQsICh4cyt4ZSkgJiAweDAwRkYpOworCXdyaXRlX3JlZyhwYXIsIDB4MzUsICgoeHMreGUpICYgMHhGRjAwKSA+PiA4KTsKKwl3cml0ZV9yZWcocGFyLCAweDM2LCAoeXMreWUpICYgMHgwMEZGKTsKKwl3cml0ZV9yZWcocGFyLCAweDM3LCAoKHlzK3llKSAmIDB4RkYwMCkgPj4gOCk7CiAKIAkvKiBTZXRfTWVtb3J5X1dyaXRlX0N1cnNvciAqLwogCXdyaXRlX3JlZyhwYXIsIDB4NDYsICB4cyAmIDB4ZmYpOwpAQCAtMjM4LDggKzIzOCw4IEBACiAJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+YnVmLCAyKTsKIAlpZiAocmV0IDwgMCkgewogCQl2YV9lbmQoYXJncyk7Ci0JCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsICIlczogd3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKKwkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIndyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZG4iLAorCQkJcmV0KTsKIAkJcmV0dXJuOwogCX0KIAlsZW4tLTsKQEAgLTI1Niw4ICsyNTYsOCBAQAogCQlyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT5idWYsIGxlbiArIDEpOwogCQlpZiAocmV0IDwgMCkgewogCQkJdmFfZW5kKGFyZ3MpOwotCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIiVzOiB3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCisJCQkJIndyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZG4iLCByZXQpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDAyYTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQwMmExLmMKaW5kZXggZTQxMmE0Mi4uZjMzMDI1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDAyYTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMDJhMS5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkvKiBDb2x1bW4gYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkEsIHhzID4+IDgsIHhzICYgMHhGRiwgeGUgPj4gOCwgeGUgJiAweEZGKTsKIAotCS8qIFJvdyBhZHJlc3MgKi8KKwkvKiBSb3cgYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkIsIHlzID4+IDgsIHlzICYgMHhGRiwgeWUgPj4gOCwgeWUgJiAweEZGKTsKIAogCS8qIE1lbW9yeSB3cml0ZSAqLwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIE1ZIHwgTVYgfCAocGFyLT5iZ3IgPDwgMykpOwogCQlicmVhazsKIAljYXNlIDE4MDoKLQkJd3JpdGVfcmVnKHBhciwgMHgzNiwgKHBhci0+YmdyIDw8IDMpKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgzNiwgcGFyLT5iZ3IgPDwgMyk7CiAJCWJyZWFrOwogCWNhc2UgOTA6CiAJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIE1YIHwgTVYgfCAocGFyLT5iZ3IgPDwgMykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDExMjEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQxMTIxLmMKaW5kZXggMWVmOGMxYS4uMmUxYjcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDExMjEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMTEyMS5jCkBAIC0xNDMsMTIgKzE0MywxMCBAQAogc3RhdGljIGludCBzZXRfZ2FtbWEoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrW10gPSB7Ci0JCTBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIAotCQkwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLAotCQkwYjExMTExLCAwYjExMTExLAotCQkwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLAotCQkwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLAotCQkwYjExMTExLCAwYjExMTExIH07CisJCTB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsCisJCTB4M2YsIDB4M2YsIDB4MWYsIDB4MWYsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsCisJCTB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2YsIDB4MWYsIDB4MWYsCisJfTsKIAlpbnQgaSwgajsKIAogCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTI4OS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEyODkuYwppbmRleCBlZjQ2ZmJjLi4xN2E3N2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTI4OS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMjg5LmMKQEAgLTEyNiwxNiArMTI2LDE2IEBACiAKIAlzd2l0Y2ggKHBhci0+aW5mby0+dmFyLnJvdGF0ZSkgewogCWNhc2UgMDoKLQkJd3JpdGVfcmVnKHBhciwgMHgxMSwgcmVnMTEgfCAwYjExMDAwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTEsIHJlZzExIHwgMHgzMCk7CiAJCWJyZWFrOwogCWNhc2UgMjcwOgotCQl3cml0ZV9yZWcocGFyLCAweDExLCByZWcxMSB8IDBiMTAxMDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxMSwgcmVnMTEgfCAweDI4KTsKIAkJYnJlYWs7CiAJY2FzZSAxODA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTEsIHJlZzExIHwgMGIwMDAwMDApOworCQl3cml0ZV9yZWcocGFyLCAweDExLCByZWcxMSB8IDB4MDApOwogCQlicmVhazsKIAljYXNlIDkwOgotCQl3cml0ZV9yZWcocGFyLCAweDExLCByZWcxMSB8IDBiMDExMDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxMSwgcmVnMTEgfCAweDE4KTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNTEsMTAgKzE1MSw5IEBACiBzdGF0aWMgaW50IHNldF9nYW1tYShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGxvbmcgKmN1cnZlcykKIHsKIAl1bnNpZ25lZCBsb25nIG1hc2tbXSA9IHsKLQkJMGIxMTExMSwgMGIxMTExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwKLQkJMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLAotCQkwYjExMTExLCAwYjExMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLAotCQkwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEgfTsKKwkJMHgxZiwgMHgxZiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywKKwkJMHgxZiwgMHgxZiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywKKwl9OwogCWludCBpLCBqOwogCiAJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzA2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMwNi5jCmluZGV4IDVlYTE5NWIuLjE1ZWU0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzA2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMDYuYwpAQCAtMTkzLDggKzE5Myw4IEBACiAJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+dHhidWYuYnVmLAogCQkJCXBhci0+aW5mby0+dmFyLnhyZXMqcGFyLT5pbmZvLT52YXIueXJlcy84KTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKLQkJCSIlczogd3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAid3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsCisJCQlyZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzMxLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMzMS5jCmluZGV4IGRhNzQ2NGYuLjViYjc0MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzMxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMzEuYwpAQCAtMjksMjQgKzI5LDI0IEBACiAKIAl3cml0ZV9yZWcocGFyLCAweGFlKTsgLyogRGlzcGxheSBPZmYgKi8KIAl3cml0ZV9yZWcocGFyLCAweGEwLCAweDcwIHwgKHBhci0+YmdyIDw8IDIpKTsgLyogU2V0IENvbG91ciBEZXB0aCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4NzIpOyAvLyBSR0IgY29sb3VyCisJd3JpdGVfcmVnKHBhciwgMHg3Mik7IC8qIFJHQiBjb2xvdXIgKi8KIAl3cml0ZV9yZWcocGFyLCAweGExLCAweDAwKTsgLyogU2V0IERpc3BsYXkgU3RhcnQgTGluZSAqLwogCXdyaXRlX3JlZyhwYXIsIDB4YTIsIDB4MDApOyAvKiBTZXQgRGlzcGxheSBPZmZzZXQgKi8KIAl3cml0ZV9yZWcocGFyLCAweGE0KTsgLyogTk9STUFMRElTUExBWSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4YTgsIDB4M2YpOyAvLyBTZXQgbXVsdGlwbGV4Ci0Jd3JpdGVfcmVnKHBhciwgMHhhZCwgMHg4ZSk7IC8vIFNldCBtYXN0ZXIKLQkvLyB3cml0ZV9yZWcocGFyLCAweGIwLCAweDBiKTsgLy8gU2V0IHBvd2VyIG1vZGUKLQl3cml0ZV9yZWcocGFyLCAweGIxLCAweDMxKTsgLy8gUHJlY2hhcmdlCi0Jd3JpdGVfcmVnKHBhciwgMHhiMywgMHhmMCk7IC8vIENsb2NrIGRpdgotCXdyaXRlX3JlZyhwYXIsIDB4OGEsIDB4NjQpOyAvLyBQcmVjaGFyZ2UgQQotCXdyaXRlX3JlZyhwYXIsIDB4OGIsIDB4NzgpOyAvLyBQcmVjaGFyZ2UgQgotCXdyaXRlX3JlZyhwYXIsIDB4OGMsIDB4NjQpOyAvLyBQcmVjaGFyZ2UgQwotCXdyaXRlX3JlZyhwYXIsIDB4YmIsIDB4M2EpOyAvLyBQcmVjaGFyZ2UgbGV2ZWwKLQl3cml0ZV9yZWcocGFyLCAweGJlLCAweDNlKTsgLy8gdmNvbWgKLQl3cml0ZV9yZWcocGFyLCAweDg3LCAweDA2KTsgLy8gTWFzdGVyIGN1cnJlbnQKLQl3cml0ZV9yZWcocGFyLCAweDgxLCAweDkxKTsgLy8gQ29udHJhc3QgQQotCXdyaXRlX3JlZyhwYXIsIDB4ODIsIDB4NTApOyAvLyBDb250cmFzdCBCCi0Jd3JpdGVfcmVnKHBhciwgMHg4MywgMHg3ZCk7IC8vIENvbnRyYXN0IEMKKwl3cml0ZV9yZWcocGFyLCAweGE4LCAweDNmKTsgLyogU2V0IG11bHRpcGxleCAqLworCXdyaXRlX3JlZyhwYXIsIDB4YWQsIDB4OGUpOyAvKiBTZXQgbWFzdGVyICovCisJLyogd3JpdGVfcmVnKHBhciwgMHhiMCwgMHgwYik7ICBTZXQgcG93ZXIgbW9kZSAqLworCXdyaXRlX3JlZyhwYXIsIDB4YjEsIDB4MzEpOyAvKiBQcmVjaGFyZ2UgKi8KKwl3cml0ZV9yZWcocGFyLCAweGIzLCAweGYwKTsgLyogQ2xvY2sgZGl2ICovCisJd3JpdGVfcmVnKHBhciwgMHg4YSwgMHg2NCk7IC8qIFByZWNoYXJnZSBBICovCisJd3JpdGVfcmVnKHBhciwgMHg4YiwgMHg3OCk7IC8qIFByZWNoYXJnZSBCICovCisJd3JpdGVfcmVnKHBhciwgMHg4YywgMHg2NCk7IC8qIFByZWNoYXJnZSBDICovCisJd3JpdGVfcmVnKHBhciwgMHhiYiwgMHgzYSk7IC8qIFByZWNoYXJnZSBsZXZlbCAqLworCXdyaXRlX3JlZyhwYXIsIDB4YmUsIDB4M2UpOyAvKiB2Y29taCAqLworCXdyaXRlX3JlZyhwYXIsIDB4ODcsIDB4MDYpOyAvKiBNYXN0ZXIgY3VycmVudCAqLworCXdyaXRlX3JlZyhwYXIsIDB4ODEsIDB4OTEpOyAvKiBDb250cmFzdCBBICovCisJd3JpdGVfcmVnKHBhciwgMHg4MiwgMHg1MCk7IC8qIENvbnRyYXN0IEIgKi8KKwl3cml0ZV9yZWcocGFyLCAweDgzLCAweDdkKTsgLyogQ29udHJhc3QgQyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4YWYpOyAvKiBTZXQgU2xlZXAgTW9kZSBEaXNwbGF5IE9uICovCiAKIAlyZXR1cm4gMDsKQEAgLTY5LDkgKzY5LDggQEAKIAogCWlmICh1bmxpa2VseShwYXItPmRlYnVnICYgREVCVUdfV1JJVEVfUkVHSVNURVIpKSB7CiAJCXZhX3N0YXJ0KGFyZ3MsIGxlbik7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAJCQlidWZbaV0gPSAodTgpdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JCX0KIAkJdmFfZW5kKGFyZ3MpOwogCQlmYnRmdF9wYXJfZGJnX2hleChERUJVR19XUklURV9SRUdJU1RFUiwgcGFyLCBwYXItPmluZm8tPmRldmljZSwgdTgsIGJ1ZiwgbGVuLCAiJXM6ICIsIF9fZnVuY19fKTsKIAl9CkBAIC04NCwyMCArODMsMjEgQEAKIAlyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT5idWYsIHNpemVvZih1OCkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXZhX2VuZChhcmdzKTsKLQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIiVzOiB3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAorCQkJIndyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuOwogCX0KIAlsZW4tLTsKIAogCWlmIChsZW4pIHsKIAkJaSA9IGxlbjsKLQkJd2hpbGUgKGktLSkgeworCQl3aGlsZSAoaS0tKQogCQkJKmJ1ZisrID0gKHU4KXZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOwotCQl9CiAJCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPmJ1ZiwgbGVuICogKHNpemVvZih1OCkpKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXZhX2VuZChhcmdzKTsKLQkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsICIlczogd3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCisJCQkJIndyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKIAkJCXJldHVybjsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzUxLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTM1MS5jCmluZGV4IDA2MmQ5ODYuLjliY2Q3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzUxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzNTEuYwpAQCAtNzIsNiArNzIsNyBAQAogc3RhdGljIGludCBzZXRfdmFyKHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKIAl1bnNpZ25lZCByZW1hcDsKKwogCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAocGFyLT5mYnRmdG9wcy5pbml0X2Rpc3BsYXkgIT0gaW5pdF9kaXNwbGF5KSB7CkBAIC04NiwxNiArODcsMTYgQEAKIAogCXN3aXRjaCAocGFyLT5pbmZvLT52YXIucm90YXRlKSB7CiAJY2FzZSAwOgotCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDBiMDAgfCAxPDw0KTsKKwkJd3JpdGVfcmVnKHBhciwgMHhBMCwgcmVtYXAgfCAweDAwIHwgMTw8NCk7CiAJCWJyZWFrOwogCWNhc2UgMjcwOgotCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDBiMTEgfCAxPDw0KTsKKwkJd3JpdGVfcmVnKHBhciwgMHhBMCwgcmVtYXAgfCAweDAzIHwgMTw8NCk7CiAJCWJyZWFrOwogCWNhc2UgMTgwOgotCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDBiMTApOworCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDB4MDIpOwogCQlicmVhazsKIAljYXNlIDkwOgotCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDBiMDEpOworCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDB4MDEpOwogCQlicmVhazsKIAl9CiAKQEAgLTIxNywxMiArMjE4LDggQEAKIAogCWJsX29wcyA9IGRldm1fa3phbGxvYyhwYXItPmluZm8tPmRldmljZSwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfb3BzKSwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWJsX29wcykgewotCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBiYWNrbGlnaHQgb3BlcmF0aW9ucy5cbiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCFibF9vcHMpCiAJCXJldHVybjsKLQl9CiAKIAlibF9vcHMtPnVwZGF0ZV9zdGF0dXMgPSB1cGRhdGVfb25ib2FyZF9iYWNrbGlnaHQ7CiAJYmxfcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3Q3NzM1ci5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3N0NzczNXIuYwppbmRleCBiNjNhYTM4Li45ZDg3NDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3Q3NzM1ci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zdDc3MzVyLmMKQEAgLTMxLDIwICszMSwyMCBAQAogCiBzdGF0aWMgaW50IGRlZmF1bHRfaW5pdF9zZXF1ZW5jZVtdID0gewogCS8qIFNXUkVTRVQgLSBTb2Z0d2FyZSByZXNldCAqLwotCS0xLCAweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJLTEsIDB4MDEsCiAJLTIsIDE1MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVsYXkgKi8KIAogCS8qIFNMUE9VVCAtIFNsZWVwIG91dCAmIGJvb3N0ZXIgb24gKi8KLQktMSwgMHgxMSwgICAgICAgICAgICAgICAgICAgICAgICAgIAorCS0xLCAweDExLAogCS0yLCA1MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbGF5ICovCiAKIAkvKiBGUk1DVFIxIC0gZnJhbWUgcmF0ZSBjb250cm9sOiBub3JtYWwgbW9kZQogCSAgICAgZnJhbWUgcmF0ZSA9IGZvc2MgLyAoMSB4IDIgKyA0MCkgKiAoTElORSArIDJDICsgMkQpICovCi0JLTEsIDB4QjEsIDB4MDEsIDB4MkMsIDB4MkQsIAorCS0xLCAweEIxLCAweDAxLCAweDJDLCAweDJELAogCiAJLyogRlJNQ1RSMiAtIGZyYW1lIHJhdGUgY29udHJvbDogaWRsZSBtb2RlCiAJICAgICBmcmFtZSByYXRlID0gZm9zYyAvICgxIHggMiArIDQwKSAqIChMSU5FICsgMkMgKyAyRCkgKi8KLQktMSwgMHhCMiwgMHgwMSwgMHgyQywgMHgyRCwgCisJLTEsIDB4QjIsIDB4MDEsIDB4MkMsIDB4MkQsCiAKIAkvKiBGUk1DVFIzIC0gZnJhbWUgcmF0ZSBjb250cm9sIC0gcGFydGlhbCBtb2RlCiAJICAgICBkb3QgaW52ZXJzaW9uIG1vZGUsIGxpbmUgaW52ZXJzaW9uIG1vZGUgKi8KQEAgLTY4LDcgKzY4LDcgQEAKIAogCS8qIFBXQ1RSNCAtIFBvd2VyIENvbnRyb2wKIAkgICAgIEJDTEsvMiwgT3BhbXAgY3VycmVudCBzbWFsbCAmIE1lZGl1bSBsb3cgKi8KLQktMSwgMHhDMywweDhBLDB4MkEsCisJLTEsIDB4QzMsIDB4OEEsIDB4MkEsCiAKIAkvKiBQV0NUUjUgLSBQb3dlciBDb250cm9sICovCiAJLTEsIDB4QzQsIDB4OEEsIDB4RUUsCkBAIC05MSw3ICs5MSw3IEBACiAJLTIsIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWxheSAqLwogCiAJLyogZW5kIG1hcmtlciAqLwotCS0zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCS0zCiB9OwogCiBzdGF0aWMgdm9pZCBzZXRfYWRkcl93aW4oc3RydWN0IGZidGZ0X3BhciAqcGFyLCBpbnQgeHMsIGludCB5cywgaW50IHhlLCBpbnQgeWUpCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkvKiBDb2x1bW4gYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkEsIHhzID4+IDgsIHhzICYgMHhGRiwgeGUgPj4gOCwgeGUgJiAweEZGKTsKIAotCS8qIFJvdyBhZHJlc3MgKi8KKwkvKiBSb3cgYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkIsIHlzID4+IDgsIHlzICYgMHhGRiwgeWUgPj4gOCwgeWUgJiAweEZGKTsKIAogCS8qIE1lbW9yeSB3cml0ZSAqLwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIE1ZIHwgTVYgfCAocGFyLT5iZ3IgPDwgMykpOwogCQlicmVhazsKIAljYXNlIDE4MDoKLQkJd3JpdGVfcmVnKHBhciwgMHgzNiwgKHBhci0+YmdyIDw8IDMpKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgzNiwgcGFyLT5iZ3IgPDwgMyk7CiAJCWJyZWFrOwogCWNhc2UgOTA6CiAJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIE1YIHwgTVYgfCAocGFyLT5iZ3IgPDwgMykpOwpAQCAtMTQ4LDIxICsxNDgsMjEgQEAKICNkZWZpbmUgQ1VSVkUobnVtLCBpZHgpICBjdXJ2ZXNbbnVtKnBhci0+Z2FtbWEubnVtX3ZhbHVlcyArIGlkeF0KIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewotCWludCBpLGo7CisJaW50IGksIGo7CiAKIAlmYnRmdF9wYXJfZGJnKERFQlVHX0lOSVRfRElTUExBWSwgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJLyogYXBwbHkgbWFzayAqLwogCWZvciAoaSA9IDA7IGkgPCBwYXItPmdhbW1hLm51bV9jdXJ2ZXM7IGkrKykKIAkJZm9yIChqID0gMDsgaiA8IHBhci0+Z2FtbWEubnVtX3ZhbHVlczsgaisrKQotCQkJQ1VSVkUoaSxqKSAmPSAwYjExMTExMTsKKwkJCUNVUlZFKGksIGopICY9IDB4M2Y7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFyLT5nYW1tYS5udW1fY3VydmVzOyBpKyspCiAJCXdyaXRlX3JlZyhwYXIsIDB4RTAgKyBpLAogCQkJQ1VSVkUoaSwgMCksIENVUlZFKGksIDEpLCBDVVJWRShpLCAyKSwgQ1VSVkUoaSwgMyksCiAJCQlDVVJWRShpLCA0KSwgQ1VSVkUoaSwgNSksIENVUlZFKGksIDYpLCBDVVJWRShpLCA3KSwKIAkJCUNVUlZFKGksIDgpLCBDVVJWRShpLCA5KSwgQ1VSVkUoaSwgMTApLCBDVVJWRShpLCAxMSksCi0JCQlDVVJWRShpLCAxMiksIENVUlZFKGksIDEzKSwgQ1VSVkUoaSwgMTQpLCBDVVJWRShpLDE1KSk7CisJCQlDVVJWRShpLCAxMiksIENVUlZFKGksIDEzKSwgQ1VSVkUoaSwgMTQpLCBDVVJWRShpLCAxNSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGlueWxjZC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RpbnlsY2QuYwppbmRleCBjYTk4YmZiLi5jMGIxYTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGlueWxjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90aW55bGNkLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAkvKiBDb2x1bW4gYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkEsIHhzID4+IDgsIHhzICYgMHhGRiwgeGUgPj4gOCwgeGUgJiAweEZGKTsKIAotCS8qIFJvdyBhZHJlc3MgKi8KKwkvKiBSb3cgYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkIsIHlzID4+IDgsIHlzICYgMHhGRiwgeWUgPj4gOCwgeWUgJiAweEZGKTsKIAogCS8qIE1lbW9yeSB3cml0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RsczgyMDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90bHM4MjA0LmMKaW5kZXggODczOGM3YS4uZmNkMzhiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RsczgyMDQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGxzODIwNC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAkJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+dHhidWYuYnVmLCBXSURUSCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJCSIlczogd3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJCSJ3cml0ZSBmYWlsZWQgYW5kIHJldHVybmVkOiAlZFxuIiwgcmV0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VjMTcwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VjMTcwMS5jCmluZGV4IGQ3MGFjNTIuLjI2ZDY2OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91YzE3MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdWMxNzAxLmMKQEAgLTE4Myw3ICsxODMsOCBAQAogCX0KIAogCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAiJXM6IHdyaXRlIGZhaWxlZCBhbmQgcmV0dXJuZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIndyaXRlIGZhaWxlZCBhbmQgcmV0dXJuZWQ6ICVkXG4iLAorCQkJcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdXBkMTYxNzA0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdXBkMTYxNzA0LmMKaW5kZXggZmZmNTdiMy4uMTc2YzIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VwZDE2MTcwNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91cGQxNjE3MDQuYwpAQCAtNDcsODQgKzQ3LDg0IEBACiAJLyogSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgZnJvbSBMaWJfVVRGVCAqLwogCiAJLyogcmVnaXN0ZXIgcmVzZXQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMDMsMHgwMDAxKTsJLyogU29mdCByZXNldCAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAwMywgMHgwMDAxKTsJLyogU29mdCByZXNldCAqLwogCiAJLyogb3NjaWxsYXRvciBzdGFydCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAzQSwweDAwMDEpOwkvKk9zY2lsbGF0b3IgMDogc3RvcCwgMTogb3BlcmF0aW9uICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDNBLCAweDAwMDEpOwkvKk9zY2lsbGF0b3IgMDogc3RvcCwgMTogb3BlcmF0aW9uICovCiAJdWRlbGF5KDEwMCk7CiAKIAkvKiB5LXNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMjQsMHgwMDdCKTsJLyogYW1wbGl0dWRlIHNldHRpbmcgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMjQsIDB4MDA3Qik7CS8qIGFtcGxpdHVkZSBzZXR0aW5nICovCiAJdWRlbGF5KDEwKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwMjUsMHgwMDNCKTsJLyogYW1wbGl0dWRlIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMjYsMHgwMDM0KTsJLyogYW1wbGl0dWRlIHNldHRpbmcgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMjUsIDB4MDAzQik7CS8qIGFtcGxpdHVkZSBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDI2LCAweDAwMzQpOwkvKiBhbXBsaXR1ZGUgc2V0dGluZyAqLwogCXVkZWxheSgxMCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDI3LDB4MDAwNCk7CS8qIGFtcGxpdHVkZSBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDUyLDB4MDAyNSk7CS8qIGNpcmN1aXQgc2V0dGluZyAxICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDI3LCAweDAwMDQpOwkvKiBhbXBsaXR1ZGUgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDA1MiwgMHgwMDI1KTsJLyogY2lyY3VpdCBzZXR0aW5nIDEgKi8KIAl1ZGVsYXkoMTApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA1MywweDAwMzMpOwkvKiBjaXJjdWl0IHNldHRpbmcgMiAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDA2MSwweDAwMUMpOwkvKiBhZGp1c3RtZW50IFYxMCBwb3NpdGl2ZSBwb2xhcml0eSAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDA1MywgMHgwMDMzKTsJLyogY2lyY3VpdCBzZXR0aW5nIDIgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwNjEsIDB4MDAxQyk7CS8qIGFkanVzdG1lbnQgVjEwIHBvc2l0aXZlIHBvbGFyaXR5ICovCiAJdWRlbGF5KDEwKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwNjIsMHgwMDJDKTsJLyogYWRqdXN0bWVudCBWOSBuZWdhdGl2ZSBwb2xhcml0eSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDA2MywweDAwMjIpOwkvKiBhZGp1c3RtZW50IFYzNCBwb3NpdGl2ZSBwb2xhcml0eSAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDA2MiwgMHgwMDJDKTsJLyogYWRqdXN0bWVudCBWOSBuZWdhdGl2ZSBwb2xhcml0eSAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDA2MywgMHgwMDIyKTsJLyogYWRqdXN0bWVudCBWMzQgcG9zaXRpdmUgcG9sYXJpdHkgKi8KIAl1ZGVsYXkoMTApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA2NCwweDAwMjcpOwkvKiBhZGp1c3RtZW50IFYzMSBuZWdhdGl2ZSBwb2xhcml0eSAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDA2NCwgMHgwMDI3KTsJLyogYWRqdXN0bWVudCBWMzEgbmVnYXRpdmUgcG9sYXJpdHkgKi8KIAl1ZGVsYXkoMTApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA2NSwweDAwMTQpOwkvKiBhZGp1c3RtZW50IFY2MSBuZWdhdGl2ZSBwb2xhcml0eSAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDA2NSwgMHgwMDE0KTsJLyogYWRqdXN0bWVudCBWNjEgbmVnYXRpdmUgcG9sYXJpdHkgKi8KIAl1ZGVsYXkoMTApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA2NiwweDAwMTApOwkvKiBhZGp1c3RtZW50IFY2MSBuZWdhdGl2ZSBwb2xhcml0eSAqLwotCQorCXdyaXRlX3JlZyhwYXIsIDB4MDA2NiwgMHgwMDEwKTsJLyogYWRqdXN0bWVudCBWNjEgbmVnYXRpdmUgcG9sYXJpdHkgKi8KKwogCS8qIEJhc2ljYWwgY2xvY2sgZm9yIDEgbGluZSAoQkFTRUNPVU5UWzc6MF0pIG51bWJlciBzcGVjaWZpZWQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMkUsMHgwMDJEKTsKLQkKKwl3cml0ZV9yZWcocGFyLCAweDAwMkUsIDB4MDAyRCk7CisKIAkvKiBQb3dlciBzdXBwbHkgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxOSwweDAwMDApOwkvKiBEQy9EQyBvdXRwdXQgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAxOSwgMHgwMDAwKTsJLyogREMvREMgb3V0cHV0IHNldHRpbmcgKi8KIAl1ZGVsYXkoMjAwKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwMUEsMHgxMDAwKTsJLyogREMvREMgZnJlcXVlbmN5IHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMUIsMHgwMDIzKTsJLyogREMvREMgcmlzaW5nIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMUMsMHgwQzAxKTsJLyogUmVndWxhdG9yIHZvbHRhZ2Ugc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxRCwweDAwMDApOwkvKiBSZWd1bGF0b3IgY3VycmVudCBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDFFLDB4MDAwOSk7CS8qIFZDT00gb3V0cHV0IHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMUYsMHgwMDM1KTsJLyogVkNPTSBhbXBsaXR1ZGUgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAyMCwweDAwMTUpOwkvKiBWQ09NTSBjZW5jdGVyIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMTgsMHgxRTdCKTsJLyogREMvREMgb3BlcmF0aW9uIHNldHRpbmcgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMUEsIDB4MTAwMCk7CS8qIERDL0RDIGZyZXF1ZW5jeSBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDFCLCAweDAwMjMpOwkvKiBEQy9EQyByaXNpbmcgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAxQywgMHgwQzAxKTsJLyogUmVndWxhdG9yIHZvbHRhZ2Ugc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAxRCwgMHgwMDAwKTsJLyogUmVndWxhdG9yIGN1cnJlbnQgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAxRSwgMHgwMDA5KTsJLyogVkNPTSBvdXRwdXQgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAxRiwgMHgwMDM1KTsJLyogVkNPTSBhbXBsaXR1ZGUgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAyMCwgMHgwMDE1KTsJLyogVkNPTU0gY2VuY3RlciBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDE4LCAweDFFN0IpOwkvKiBEQy9EQyBvcGVyYXRpb24gc2V0dGluZyAqLwogCiAJLyogd2luZG93cyBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDA4LDB4MDAwMCk7CS8qIE1pbmltdW0gWCBhZGRyZXNzICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDA5LDB4MDBFRik7CS8qIE1heGltdW0gWCBhZGRyZXNzICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDBhLDB4MDAwMCk7CS8qIE1pbmltdW0gWSBhZGRyZXNzICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDBiLDB4MDEzRik7CS8qIE1heGltdW0gWSBhZGRyZXNzICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDA4LCAweDAwMDApOwkvKiBNaW5pbXVtIFggYWRkcmVzcyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAwOSwgMHgwMEVGKTsJLyogTWF4aW11bSBYIGFkZHJlc3MgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMGEsIDB4MDAwMCk7CS8qIE1pbmltdW0gWSBhZGRyZXNzICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDBiLCAweDAxM0YpOwkvKiBNYXhpbXVtIFkgYWRkcmVzcyAqLwogCiAJLyogTENEIGRpc3BsYXkgYXJlYSBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDI5LDB4MDAwMCk7CS8qIFtMQ0RTSVpFXSAgWCBNSU4uIHNpemUgc2V0ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDJBLDB4MDAwMCk7CS8qIFtMQ0RTSVpFXSAgWSBNSU4uIHNpemUgc2V0ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDJCLDB4MDBFRik7CS8qIFtMQ0RTSVpFXSAgWCBNQVguIHNpemUgc2V0ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDJDLDB4MDEzRik7CS8qIFtMQ0RTSVpFXSAgWSBNQVguIHNpemUgc2V0ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDI5LCAweDAwMDApOwkvKiBbTENEU0laRV0gIFggTUlOLiBzaXplIHNldCAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAyQSwgMHgwMDAwKTsJLyogW0xDRFNJWkVdICBZIE1JTi4gc2l6ZSBzZXQgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMkIsIDB4MDBFRik7CS8qIFtMQ0RTSVpFXSAgWCBNQVguIHNpemUgc2V0ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDJDLCAweDAxM0YpOwkvKiBbTENEU0laRV0gIFkgTUFYLiBzaXplIHNldCAqLwogCiAJLyogR2F0ZSBzY2FuIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMzIsMHgwMDAyKTsKLQkKKwl3cml0ZV9yZWcocGFyLCAweDAwMzIsIDB4MDAwMik7CisKIAkvKiBuIGxpbmUgaW52ZXJzaW9uIGxpbmUgbnVtYmVyICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDMzLDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDMzLCAweDAwMDApOwogCiAJLyogTGluZSBpbnZlcnNpb24vZnJhbWUgaW52ZXJzaW9uL2ludGVybGFjZSBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDM3LDB4MDAwMCk7Ci0JCisJd3JpdGVfcmVnKHBhciwgMHgwMDM3LCAweDAwMDApOworCiAJLyogR2F0ZSBzY2FuIG9wZXJhdGlvbiBzZXR0aW5nIHJlZ2lzdGVyICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDNCLDB4MDAwMSk7Ci0JCisJd3JpdGVfcmVnKHBhciwgMHgwMDNCLCAweDAwMDEpOworCiAJLyogQ29sb3IgbW9kZSAqLwogCS8qR1MgPSAwOiAyNjAtayBjb2xvciAoNjQgZ3JheSBzY2FsZSksIEdTID0gMTogOCBjb2xvciAoMiBncmF5IHNjYWxlKSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAwNCwweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MDAwNCwgMHgwMDAwKTsKIAogCS8qIFJBTSBjb250cm9sIHJlZ2lzdGVyICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDA1LDB4MDAwMCk7CS8qV2luZG93IGFjY2VzcyAwMDpOb3JtYWwsIDEwOldpbmRvdyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAwNSwgMHgwMDAwKTsJLypXaW5kb3cgYWNjZXNzIDAwOk5vcm1hbCwgMTA6V2luZG93ICovCiAKIAkvKiBEaXNwbGF5IHNldHRpbmcgcmVnaXN0ZXIgMiAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAwMSwweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MDAwMSwgMHgwMDAwKTsKIAogCS8qIGRpc3BsYXkgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAwMCwweDAwMDApOwkvKiBkaXNwbGF5IG9uICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDAwLCAweDAwMDApOwkvKiBkaXNwbGF5IG9uICovCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl93YXR0ZXJvdHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl93YXR0ZXJvdHQuYwppbmRleCA5NzViNTc5Li44OGZiMmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfd2F0dGVyb3R0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3dhdHRlcm90dC5jCkBAIC02NSw3ICs2NSw3IEBACiAJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+YnVmLCBsZW4pOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCi0JCQkiJXM6IHdyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCQkid3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLCByZXQpOwogCQlyZXR1cm47CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWJ1cy5jCmluZGV4IGIzY2RkYjAuLjUyYWY5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1idXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtYnVzLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPmJ1ZiwgKGxlbiArIHBhZCkgKiBzaXplb2YodTE2KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKLQkJCSIlczogd3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCSJ3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybjsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWNvcmUuYwppbmRleCAzN2RjZjdlLi41M2I3NDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1jb3JlLmMKQEAgLTQxLDE1ICs0MSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KIAogI2luY2x1ZGUgImZidGZ0LmgiCi0KLWV4dGVybiB2b2lkIGZidGZ0X3N5c2ZzX2luaXQoc3RydWN0IGZidGZ0X3BhciAqcGFyKTsKLWV4dGVybiB2b2lkIGZidGZ0X3N5c2ZzX2V4aXQoc3RydWN0IGZidGZ0X3BhciAqcGFyKTsKLWV4dGVybiB2b2lkIGZidGZ0X2V4cGFuZF9kZWJ1Z192YWx1ZSh1bnNpZ25lZCBsb25nICpkZWJ1Zyk7Ci1leHRlcm4gaW50IGZidGZ0X2dhbW1hX3BhcnNlX3N0cihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGxvbmcgKmN1cnZlcywKLQkJCQkJCWNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpOworI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRlYnVnOwotbW9kdWxlX3BhcmFtKGRlYnVnLCB1bG9uZyAsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCB1bG9uZywgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAib3ZlcnJpZGUgZGV2aWNlIGRlYnVnIGxldmVsIik7CiAKIHN0YXRpYyBib29sIGRtYSA9IHRydWU7CkBAIC0zMDIsMTIgKzI5Nyw4IEBACiAKIAlibF9vcHMgPSBkZXZtX2t6YWxsb2MocGFyLT5pbmZvLT5kZXZpY2UsIHNpemVvZihzdHJ1Y3QgYmFja2xpZ2h0X29wcyksCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFibF9vcHMpIHsKLQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKLQkJCSIlczogY291bGQgbm90IGFsbG9jYXRlIG1lbWVvcnkgZm9yIGJhY2tsaWdodCBvcGVyYXRpb25zLlxuIiwKLQkJCV9fZnVuY19fKTsKKwlpZiAoIWJsX29wcykKIAkJcmV0dXJuOwotCX0KIAogCWJsX29wcy0+Z2V0X2JyaWdodG5lc3MgPSBmYnRmdF9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3M7CiAJYmxfb3BzLT51cGRhdGVfc3RhdHVzID0gZmJ0ZnRfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXM7CkBAIC0zNDcsNyArMzM4LDcgQEAKIAl3cml0ZV9yZWcocGFyLCAweDJBLAogCQkoeHMgPj4gOCkgJiAweEZGLCB4cyAmIDB4RkYsICh4ZSA+PiA4KSAmIDB4RkYsIHhlICYgMHhGRik7CiAKLQkvKiBSb3cgYWRyZXNzIHNldCAqLworCS8qIFJvdyBhZGRyZXNzIHNldCAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkIsCiAJCSh5cyA+PiA4KSAmIDB4RkYsIHlzICYgMHhGRiwgKHllID4+IDgpICYgMHhGRiwgeWUgJiAweEZGKTsKIApAQCAtMzc5LDcgKzM3MCw3IEBACiAJaW50IHJldCA9IDA7CiAKIAlpZiAodW5saWtlbHkocGFyLT5kZWJ1ZyAmIChERUJVR19USU1FX0ZJUlNUX1VQREFURSB8IERFQlVHX1RJTUVfRUFDSF9VUERBVEUpKSkgewotCQlpZiAoKHBhci0+ZGVidWcgJiBERUJVR19USU1FX0VBQ0hfVVBEQVRFKSB8fCBcCisJCWlmICgocGFyLT5kZWJ1ZyAmIERFQlVHX1RJTUVfRUFDSF9VUERBVEUpIHx8CiAJCQkJKChwYXItPmRlYnVnICYgREVCVUdfVElNRV9GSVJTVF9VUERBVEUpICYmICFwYXItPmZpcnN0X3VwZGF0ZV9kb25lKSkgewogCQkJZ2V0bnN0aW1lb2ZkYXkoJnRzX3N0YXJ0KTsKIAkJCXRpbWVpdCA9IHRydWU7CkBAIC03MDcsOSArNjk4LDggQEAKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChkaXNwbGF5LT5nYW1tYV9udW0gKiBkaXNwbGF5LT5nYW1tYV9sZW4gPiBGQlRGVF9HQU1NQV9NQVhfVkFMVUVTX1RPVEFMKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJIiVzOiBGQlRGVF9HQU1NQV9NQVhfVkFMVUVTX1RPVEFMPSVkIGlzIGV4Y2VlZGVkXG4iLAotCQkJX19mdW5jX18sIEZCVEZUX0dBTU1BX01BWF9WQUxVRVNfVE9UQUwpOworCQlkZXZfZXJyKGRldiwgIkZCVEZUX0dBTU1BX01BWF9WQUxVRVNfVE9UQUw9JWQgaXMgZXhjZWVkZWRcbiIsCisJCQlGQlRGVF9HQU1NQV9NQVhfVkFMVUVTX1RPVEFMKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMDAwLDcgKzk5MCw3IEBACiAJZmJ0ZnRfc3lzZnNfaW5pdChwYXIpOwogCiAJaWYgKHBhci0+dHhidWYuYnVmKQotCQlzcHJpbnRmKHRleHQxLCAiLCAlZCBLaUIgJXNidWZmZXIgbWVtb3J5IiwKKwkJc3ByaW50Zih0ZXh0MSwgIiwgJXp1IEtpQiAlc2J1ZmZlciBtZW1vcnkiLAogCQkJcGFyLT50eGJ1Zi5sZW4gPj4gMTAsIHBhci0+dHhidWYuZG1hID8gIkRNQSAiIDogIiIpOwogCWlmIChzcGkpCiAJCXNwcmludGYodGV4dDIsICIsIHNwaSVkLiVkIGF0ICVkIE1IeiIsIHNwaS0+bWFzdGVyLT5idXNfbnVtLApAQCAtMTA0Niw3ICsxMDM2LDYgQEAKIHsKIAlzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIgPSBmYl9pbmZvLT5wYXI7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHBhci0+c3BpOwotCWludCByZXQ7CiAKIAlpZiAoc3BpKQogCQlzcGlfc2V0X2RydmRhdGEoc3BpLCBOVUxMKTsKQEAgLTEwNTUsOCArMTA0NCw3IEBACiAJaWYgKHBhci0+ZmJ0ZnRvcHMudW5yZWdpc3Rlcl9iYWNrbGlnaHQpCiAJCXBhci0+ZmJ0ZnRvcHMudW5yZWdpc3Rlcl9iYWNrbGlnaHQocGFyKTsKIAlmYnRmdF9zeXNmc19leGl0KHBhcik7Ci0JcmV0ID0gdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihmYl9pbmZvKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiB1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiX2luZm8pOwogfQogRVhQT1JUX1NZTUJPTChmYnRmdF91bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKTsKIApAQCAtMTI3OCw3ICsxMjY2LDcgQEAKIAlmYnRmdF9wYXJfZGJnKERFQlVHX1ZFUklGWV9HUElPUywgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJcGRhdGEgPSBwYXItPmluZm8tPmRldmljZS0+cGxhdGZvcm1fZGF0YTsKLQlpZiAocGRhdGEtPmRpc3BsYXkuYnVzd2lkdGggIT0gOSAmJiBwYXItPnN0YXJ0Ynl0ZSA9PSAwICYmIFwKKwlpZiAocGRhdGEtPmRpc3BsYXkuYnVzd2lkdGggIT0gOSAmJiBwYXItPnN0YXJ0Ynl0ZSA9PSAwICYmCiAJCQkJCQkJcGFyLT5ncGlvLmRjIDwgMCkgewogCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAogCQkJIk1pc3NpbmcgaW5mbyBhYm91dCAnZGMnIGdwaW8uIEFib3J0aW5nLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1pby5jCmluZGV4IDMyMTU1YTcuLmE2ZjA5MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1pby5jCkBAIC01OSw4ICs1OSw3IEBACiAJfQogCWlmICgobGVuICUgOCkgIT0gMCkgewogCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJIiVzOiBlcnJvcjogbGVuPSVkIG11c3QgYmUgZGl2aXNpYmxlIGJ5IDhcbiIsCi0JCQlfX2Z1bmNfXywgbGVuKTsKKwkJCSJlcnJvcjogbGVuPSV6dSBtdXN0IGJlIGRpdmlzaWJsZSBieSA4XG4iLCBsZW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwNiw4ICsxMDUsOCBAQAogCWlmIChwYXItPnN0YXJ0Ynl0ZSkgewogCQlpZiAobGVuID4gMzIpIHsKIAkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCi0JCQkJIiVzOiBsZW49JWQgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMzIgd2hlbiB1c2luZyAnc3RhcnRieXRlJ1xuIiwKLQkJCQlfX2Z1bmNfXywgbGVuKTsKKwkJCQkibGVuPSV6dSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAzMiB3aGVuIHVzaW5nICdzdGFydGJ5dGUnXG4iLAorCQkJCWxlbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl0eGJ1ZlswXSA9IHBhci0+c3RhcnRieXRlIHwgMHgzOwpAQCAtMTU1LDE0ICsxNTQsMTQgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJCQlpZiAoKGRhdGEgJiAxKSAhPSAocHJldl9kYXRhICYgMSkpCiAJCQkJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYltpXSwKLQkJCQkJCQkJKGRhdGEgJiAxKSk7CisJCQkJCQkJCWRhdGEgJiAxKTsKIAkJCQlkYXRhID4+PSAxOwogCQkJCXByZXZfZGF0YSA+Pj0gMTsKIAkJCX0KIAkJfQogI2Vsc2UKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJZ3Bpb19zZXRfdmFsdWUocGFyLT5ncGlvLmRiW2ldLCAoZGF0YSAmIDEpKTsKKwkJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYltpXSwgZGF0YSAmIDEpOwogCQkJZGF0YSA+Pj0gMTsKIAkJfQogI2VuZGlmCkBAIC0yMDUsMTQgKzIwNCwxNCBAQAogCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJCQlpZiAoKGRhdGEgJiAxKSAhPSAocHJldl9kYXRhICYgMSkpCiAJCQkJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYltpXSwKLQkJCQkJCQkJKGRhdGEgJiAxKSk7CisJCQkJCQkJCWRhdGEgJiAxKTsKIAkJCQlkYXRhID4+PSAxOwogCQkJCXByZXZfZGF0YSA+Pj0gMTsKIAkJCX0KIAkJfQogI2Vsc2UKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYltpXSwgKGRhdGEgJiAxKSk7CisJCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uZGJbaV0sIGRhdGEgJiAxKTsKIAkJCWRhdGEgPj49IDE7CiAJCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LXN5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtc3lzZnMuYwppbmRleCA0NWY4ZGUzLi5jNGNjNDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtc3lzZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtc3lzZnMuYwpAQCAtMSw1ICsxLDUgQEAKICNpbmNsdWRlICJmYnRmdC5oIgotCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogc3RhdGljIGludCBnZXRfbmV4dF91bG9uZyhjaGFyICoqc3RyX3AsIHVuc2lnbmVkIGxvbmcgKnZhbCwgY2hhciAqc2VwLCBpbnQgYmFzZSkKIHsKQEAgLTM3LDEwICszNyw5IEBACiAKIAlmYnRmdF9wYXJfZGJnKERFQlVHX1NZU0ZTLCBwYXIsICIlc1xuIiwgc3RyKTsKIAotCXRtcCA9IGttYWxsb2Moc2l6ZSsxLCBHRlBfS0VSTkVMKTsKKwl0bXAgPSBrbWVtZHVwKHN0ciwgc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghdG1wKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1jcHkodG1wLCBzdHIsIHNpemUrMSk7CiAKIAkvKiByZXBsYWNlIG9wdGlvbmFsIHNlcGFyYXRvcnMgKi8KIAlzdHJfcCA9IHRtcDsKQEAgLTE1Myw3ICsxNTIsNyBAQAogCiB2b2lkIGZidGZ0X2V4cGFuZF9kZWJ1Z192YWx1ZSh1bnNpZ25lZCBsb25nICpkZWJ1ZykKIHsKLQlzd2l0Y2ggKCpkZWJ1ZyAmIDBiMTExKSB7CisJc3dpdGNoICgqZGVidWcgJiAweDcpIHsKIAljYXNlIDE6CiAJCSpkZWJ1ZyB8PSBERUJVR19MRVZFTF8xOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LmgKaW5kZXggMGRiZjNmOS4uOWZkOThjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LmgKQEAgLTE0Nyw3ICsxNDcsNyBAQAogLyoqCiAgKiBzdHJ1Y3QgZmJ0ZnRfcGxhdGZvcm1fZGF0YSAtIFBhc3NlcyBkaXNwbGF5IHNwZWNpZmljIGRhdGEgdG8gdGhlIGRyaXZlcgogICogQGRpc3BsYXk6IERpc3BsYXkgcHJvcGVydGllcwotICogQGdwaW9zOiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHBpbmFtZSB0byBncGlvIG1hcHBpbmdzCisgKiBAZ3Bpb3M6IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcGlubmFtZSB0byBncGlvIG1hcHBpbmdzCiAgKiBAcm90YXRlOiBEaXNwbGF5IHJvdGF0aW9uIGFuZ2xlCiAgKiBAYmdyOiBMQ0QgQ29udHJvbGxlciBCR1IgYml0CiAgKiBAZnBzOiBGcmFtZXMgcGVyIHNlY29uZCAodGhpcyB3aWxsIGdvIGF3YXksIHVzZSBAZnBzIGluIEBmYnRmdF9kaXNwbGF5KQpAQCAtMjAwLDcgKzIwMCw3IEBACiAgKiBAZ3Bpby5jczogTENEIENoaXAgU2VsZWN0IHdpdGggcGFyYWxsZWwgaW50ZXJmYWNlIGJ1cwogICogQGdwaW8uZGJbMTZdOiBQYXJhbGxlbCBkYXRhYnVzCiAgKiBAZ3Bpby5sZWRbMTZdOiBMZWQgY29udHJvbCBzaWduYWxzCi0gKiBAZ3Bpby5hdXhbMTZdOiBBdXhpbGxhcnkgc2lnbmFscywgbm90IHVzZWQgYnkgY29yZQorICogQGdwaW8uYXV4WzE2XTogQXV4aWxpYXJ5IHNpZ25hbHMsIG5vdCB1c2VkIGJ5IGNvcmUKICAqIEBpbml0X3NlcXVlbmNlOiBQb2ludGVyIHRvIExDRCBpbml0aWFsaXphdGlvbiBhcnJheQogICogQGdhbW1hLmxvY2s6IE11dGV4IGZvciBHYW1tYSBjdXJ2ZSBsb2NraW5nCiAgKiBAZ2FtbWEuY3VydmVzOiBQb2ludGVyIHRvIEdhbW1hIGN1cnZlIGFycmF5CkBAIC0yNTksOSArMjU5LDcgQEAKICNkZWZpbmUgTlVNQVJHUyguLi4pICAoc2l6ZW9mKChpbnRbXSl7X19WQV9BUkdTX199KS9zaXplb2YoaW50KSkKIAogI2RlZmluZSB3cml0ZV9yZWcocGFyLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcGFyLT5mYnRmdG9wcy53cml0ZV9yZWdpc3RlcihwYXIsIE5VTUFSR1MoX19WQV9BUkdTX18pLCBfX1ZBX0FSR1NfXyk7IFwKLX0gd2hpbGUgKDApCisJcGFyLT5mYnRmdG9wcy53cml0ZV9yZWdpc3RlcihwYXIsIE5VTUFSR1MoX19WQV9BUkdTX18pLCBfX1ZBX0FSR1NfXykKIAogLyogZmJ0ZnQtY29yZS5jICovCiBleHRlcm4gdm9pZCBmYnRmdF9kYmdfaGV4KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTMyNiw4ICszMjQsOCBAQAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJCQkJCQkJICAgXAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZHRfaWRzW10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7IC5jb21wYXRpYmxlID0gX2NvbXBhdGlibGUgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7fSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgLmNvbXBhdGlibGUgPSBfY29tcGF0aWJsZSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJe30sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCQkJCQkJCSAgIFwKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGR0X2lkcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMzNyw3ICszMzUsNyBAQAogCS5kcml2ZXIgPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCS5uYW1lICAgPSBfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZHRfaWRzKSwgICAgICAgICAgICAgICAgICAgIFwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGR0X2lkcyksICAgICAgICAgICAgICAgICAgICBcCiAJfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkucHJvYmUgID0gZmJ0ZnRfZHJpdmVyX3Byb2JlX3NwaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCS5yZW1vdmUgPSBmYnRmdF9kcml2ZXJfcmVtb3ZlX3NwaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zNDcsNyArMzQ1LDcgQEAKIAkuZHJpdmVyID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkubmFtZSAgID0gX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJLm93bmVyICA9IFRISVNfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGR0X2lkcyksICAgICAgICAgICAgICAgICAgICBcCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkdF9pZHMpLCAgICAgICAgICAgICAgICAgICAgXAogCX0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJLnByb2JlICA9IGZidGZ0X2RyaXZlcl9wcm9iZV9wZGV2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkucmVtb3ZlID0gZmJ0ZnRfZHJpdmVyX3JlbW92ZV9wZGV2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0X2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0X2RldmljZS5jCmluZGV4IGI5ZjRjMzAuLmRmNmNkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdF9kZXZpY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnRfZGV2aWNlLmMKQEAgLTI5LDggKzI5LDggQEAKIAogI2RlZmluZSBNQVhfR1BJT1MgMzIKIAotc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXZpY2U7Ci1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwX2RldmljZTsKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwX2RldmljZTsKIAogc3RhdGljIGNoYXIgKm5hbWU7CiBtb2R1bGVfcGFyYW0obmFtZSwgY2hhcnAsIDApOwpAQCAtMTA5LDcgKzEwOSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGluaXQsICJJbml0IHNlcXVlbmNlLCB1c2VkIHdpdGggdGhlIGN1c3RvbSBhcmd1bWVudCIpOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgdWxvbmcgLCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWxvbmcsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKICJsZXZlbDogMC03ICh0aGUgcmVtYWluaW5nIDI5IGJpdHMgaXMgZm9yIGFkdmFuY2VkIHVzYWdlKSIpOwogCkBAIC0xMzYsNDMgKzEzNiw2OSBAQAogCQkiMDMgMWQgMDcgMDYgMkUgMkMgMjkgMkQgMkUgMkUgMzcgM0YgMDAgMDAgMDIgMTAiCiAKIHN0YXRpYyBpbnQgaHkyOGJfaW5pdF9zZXF1ZW5jZVtdID0gewotCS0xLDB4MDBlNywweDAwMTAsLTEsMHgwMDAwLDB4MDAwMSwtMSwweDAwMDEsMHgwMTAwLC0xLDB4MDAwMiwweDA3MDAsCi0JLTEsMHgwMDAzLDB4MTAzMCwtMSwweDAwMDQsMHgwMDAwLC0xLDB4MDAwOCwweDAyMDcsLTEsMHgwMDA5LDB4MDAwMCwKLQktMSwweDAwMGEsMHgwMDAwLC0xLDB4MDAwYywweDAwMDEsLTEsMHgwMDBkLDB4MDAwMCwtMSwweDAwMGYsMHgwMDAwLAotCS0xLDB4MDAxMCwweDAwMDAsLTEsMHgwMDExLDB4MDAwNywtMSwweDAwMTIsMHgwMDAwLC0xLDB4MDAxMywweDAwMDAsCi0JLTIsNTAsLTEsMHgwMDEwLDB4MTU5MCwtMSwweDAwMTEsMHgwMjI3LC0yLDUwLC0xLDB4MDAxMiwweDAwOWMsLTIsNTAsCi0JLTEsMHgwMDEzLDB4MTkwMCwtMSwweDAwMjksMHgwMDIzLC0xLDB4MDAyYiwweDAwMGUsLTIsNTAsCi0JLTEsMHgwMDIwLDB4MDAwMCwtMSwweDAwMjEsMHgwMDAwLC0yLDUwLC0xLDB4MDA1MCwweDAwMDAsCi0JLTEsMHgwMDUxLDB4MDBlZiwtMSwweDAwNTIsMHgwMDAwLC0xLDB4MDA1MywweDAxM2YsLTEsMHgwMDYwLDB4YTcwMCwKLQktMSwweDAwNjEsMHgwMDAxLC0xLDB4MDA2YSwweDAwMDAsLTEsMHgwMDgwLDB4MDAwMCwtMSwweDAwODEsMHgwMDAwLAotCS0xLDB4MDA4MiwweDAwMDAsLTEsMHgwMDgzLDB4MDAwMCwtMSwweDAwODQsMHgwMDAwLC0xLDB4MDA4NSwweDAwMDAsCi0JLTEsMHgwMDkwLDB4MDAxMCwtMSwweDAwOTIsMHgwMDAwLC0xLDB4MDA5MywweDAwMDMsLTEsMHgwMDk1LDB4MDExMCwKLQktMSwweDAwOTcsMHgwMDAwLC0xLDB4MDA5OCwweDAwMDAsLTEsMHgwMDA3LDB4MDEzMywtMSwweDAwMjAsMHgwMDAwLAotCS0xLDB4MDAyMSwweDAwMDAsLTIsMTAwLC0zIH07CisJLTEsIDB4MDBlNywgMHgwMDEwLCAtMSwgMHgwMDAwLCAweDAwMDEsCisJLTEsIDB4MDAwMSwgMHgwMTAwLCAtMSwgMHgwMDAyLCAweDA3MDAsCisJLTEsIDB4MDAwMywgMHgxMDMwLCAtMSwgMHgwMDA0LCAweDAwMDAsCisJLTEsIDB4MDAwOCwgMHgwMjA3LCAtMSwgMHgwMDA5LCAweDAwMDAsCisJLTEsIDB4MDAwYSwgMHgwMDAwLCAtMSwgMHgwMDBjLCAweDAwMDEsCisJLTEsIDB4MDAwZCwgMHgwMDAwLCAtMSwgMHgwMDBmLCAweDAwMDAsCisJLTEsIDB4MDAxMCwgMHgwMDAwLCAtMSwgMHgwMDExLCAweDAwMDcsCisJLTEsIDB4MDAxMiwgMHgwMDAwLCAtMSwgMHgwMDEzLCAweDAwMDAsCisJLTIsIDUwLCAtMSwgMHgwMDEwLCAweDE1OTAsIC0xLCAweDAwMTEsCisJMHgwMjI3LCAtMiwgNTAsIC0xLCAweDAwMTIsIDB4MDA5YywgLTIsIDUwLAorCS0xLCAweDAwMTMsIDB4MTkwMCwgLTEsIDB4MDAyOSwgMHgwMDIzLAorCS0xLCAweDAwMmIsIDB4MDAwZSwgLTIsIDUwLAorCS0xLCAweDAwMjAsIDB4MDAwMCwgLTEsIDB4MDAyMSwgMHgwMDAwLAorCS0yLCA1MCwgLTEsIDB4MDA1MCwgMHgwMDAwLAorCS0xLCAweDAwNTEsIDB4MDBlZiwgLTEsIDB4MDA1MiwgMHgwMDAwLAorCS0xLCAweDAwNTMsIDB4MDEzZiwgLTEsIDB4MDA2MCwgMHhhNzAwLAorCS0xLCAweDAwNjEsIDB4MDAwMSwgLTEsIDB4MDA2YSwgMHgwMDAwLAorCS0xLCAweDAwODAsIDB4MDAwMCwgLTEsIDB4MDA4MSwgMHgwMDAwLAorCS0xLCAweDAwODIsIDB4MDAwMCwgLTEsIDB4MDA4MywgMHgwMDAwLAorCS0xLCAweDAwODQsIDB4MDAwMCwgLTEsIDB4MDA4NSwgMHgwMDAwLAorCS0xLCAweDAwOTAsIDB4MDAxMCwgLTEsIDB4MDA5MiwgMHgwMDAwLAorCS0xLCAweDAwOTMsIDB4MDAwMywgLTEsIDB4MDA5NSwgMHgwMTEwLAorCS0xLCAweDAwOTcsIDB4MDAwMCwgLTEsIDB4MDA5OCwgMHgwMDAwLAorCS0xLCAweDAwMDcsIDB4MDEzMywgLTEsIDB4MDAyMCwgMHgwMDAwLAorCS0xLCAweDAwMjEsIDB4MDAwMCwgLTIsIDEwMCwgLTMgfTsKIAogI2RlZmluZSBIWTI4Ql9HQU1NQSBcCiAJIjA0IDFGIDQgNyA3IDAgNyA3IDYgMFxuIiBcCiAJIjBGIDAwIDEgNyA0IDAgMCAwIDYgNyIKIAogc3RhdGljIGludCBwaXRmdF9pbml0X3NlcXVlbmNlW10gPSB7Ci0JLTEsMHgwMSwtMiw1LC0xLDB4MjgsLTEsMHhFRiwweDAzLDB4ODAsMHgwMiwtMSwweENGLDB4MDAsMHhDMSwweDMwLAotCS0xLDB4RUQsMHg2NCwweDAzLDB4MTIsMHg4MSwtMSwweEU4LDB4ODUsMHgwMCwweDc4LAotCS0xLDB4Q0IsMHgzOSwweDJDLDB4MDAsMHgzNCwweDAyLC0xLDB4RjcsMHgyMCwtMSwweEVBLDB4MDAsMHgwMCwKLQktMSwweEMwLDB4MjMsLTEsMHhDMSwweDEwLC0xLDB4QzUsMHgzZSwweDI4LC0xLDB4QzcsMHg4NiwtMSwweDNBLDB4NTUsCi0JLTEsMHhCMSwweDAwLDB4MTgsLTEsMHhCNiwweDA4LDB4ODIsMHgyNywtMSwweEYyLDB4MDAsLTEsMHgyNiwweDAxLAotCS0xLDB4RTAsMHgwRiwweDMxLDB4MkIsMHgwQywweDBFLDB4MDgsMHg0RSwweEYxLDB4MzcsMHgwNywweDEwLDB4MDMsCi0JMHgwRSwweDA5LDB4MDAsLTEsMHhFMSwweDAwLDB4MEUsMHgxNCwweDAzLDB4MTEsMHgwNywweDMxLDB4QzEsMHg0OCwKLQkweDA4LDB4MEYsMHgwQywweDMxLDB4MzYsMHgwRiwtMSwweDExLC0yLDEwMCwtMSwweDI5LC0yLDIwLC0zIH07CisJLTEsIDB4MDEsIC0yLCA1LCAtMSwgMHgyOCwgLTEsIDB4RUYsCisJMHgwMywgMHg4MCwgMHgwMiwgLTEsIDB4Q0YsIDB4MDAsIDB4QzEsIDB4MzAsCisJLTEsIDB4RUQsIDB4NjQsIDB4MDMsIDB4MTIsIDB4ODEsCisJLTEsIDB4RTgsIDB4ODUsIDB4MDAsIDB4NzgsCisJLTEsIDB4Q0IsIDB4MzksIDB4MkMsIDB4MDAsIDB4MzQsIDB4MDIsCisJLTEsIDB4RjcsIDB4MjAsIC0xLCAweEVBLCAweDAwLCAweDAwLAorCS0xLCAweEMwLCAweDIzLCAtMSwgMHhDMSwgMHgxMCwgLTEsIDB4QzUsCisJMHgzZSwgMHgyOCwgLTEsIDB4QzcsIDB4ODYsIC0xLCAweDNBLCAweDU1LAorCS0xLCAweEIxLCAweDAwLCAweDE4LCAtMSwgMHhCNiwgMHgwOCwgMHg4MiwKKwkweDI3LCAtMSwgMHhGMiwgMHgwMCwgLTEsIDB4MjYsIDB4MDEsCisJLTEsIDB4RTAsIDB4MEYsIDB4MzEsIDB4MkIsIDB4MEMsIDB4MEUsIDB4MDgsCisJMHg0RSwgMHhGMSwgMHgzNywgMHgwNywgMHgxMCwgMHgwMywKKwkweDBFLCAweDA5LCAweDAwLCAtMSwgMHhFMSwgMHgwMCwgMHgwRSwgMHgxNCwKKwkweDAzLCAweDExLCAweDA3LCAweDMxLCAweEMxLCAweDQ4LAorCTB4MDgsIDB4MEYsIDB4MEMsIDB4MzEsIDB4MzYsIDB4MEYsIC0xLAorCTB4MTEsIC0yLCAxMDAsIC0xLCAweDI5LCAtMiwgMjAsIC0zIH07CiAKIHN0YXRpYyBpbnQgd2F2ZXNoYXJlMzJiX2luaXRfc2VxdWVuY2VbXSA9IHsKLQktMSwweENCLDB4MzksMHgyQywweDAwLDB4MzQsMHgwMiwtMSwweENGLDB4MDAsMHhDMSwweDMwLAotCS0xLDB4RTgsMHg4NSwweDAwLDB4NzgsLTEsMHhFQSwweDAwLDB4MDAsLTEsMHhFRCwweDY0LDB4MDMsMHgxMiwweDgxLAotCS0xLDB4RjcsMHgyMCwtMSwweEMwLDB4MjMsLTEsMHhDMSwweDEwLC0xLDB4QzUsMHgzZSwweDI4LC0xLDB4QzcsMHg4NiwKLQktMSwweDM2LDB4MjgsLTEsMHgzQSwweDU1LC0xLDB4QjEsMHgwMCwweDE4LC0xLDB4QjYsMHgwOCwweDgyLDB4MjcsCi0JLTEsMHhGMiwweDAwLC0xLDB4MjYsMHgwMSwKLQktMSwweEUwLDB4MEYsMHgzMSwweDJCLDB4MEMsMHgwRSwweDA4LDB4NEUsMHhGMSwweDM3LDB4MDcsMHgxMCwweDAzLDB4MEUsMHgwOSwweDAwLAotCS0xLDB4RTEsMHgwMCwweDBFLDB4MTQsMHgwMywweDExLDB4MDcsMHgzMSwweEMxLDB4NDgsMHgwOCwweDBGLDB4MEMsMHgzMSwweDM2LDB4MEYsCi0JLTEsMHgxMSwtMiwxMjAsLTEsMHgyOSwtMSwweDJjLC0zIH07CisJLTEsIDB4Q0IsIDB4MzksIDB4MkMsIDB4MDAsIDB4MzQsIDB4MDIsCisJLTEsIDB4Q0YsIDB4MDAsIDB4QzEsIDB4MzAsCisJLTEsIDB4RTgsIDB4ODUsIDB4MDAsIDB4NzgsIC0xLCAweEVBLCAweDAwLAorCTB4MDAsIC0xLCAweEVELCAweDY0LCAweDAzLCAweDEyLCAweDgxLAorCS0xLCAweEY3LCAweDIwLCAtMSwgMHhDMCwgMHgyMywgLTEsIDB4QzEsCisJMHgxMCwgLTEsIDB4QzUsIDB4M2UsIDB4MjgsIC0xLCAweEM3LCAweDg2LAorCS0xLCAweDM2LCAweDI4LCAtMSwgMHgzQSwgMHg1NSwgLTEsIDB4QjEsIDB4MDAsCisJMHgxOCwgLTEsIDB4QjYsIDB4MDgsIDB4ODIsIDB4MjcsCisJLTEsIDB4RjIsIDB4MDAsIC0xLCAweDI2LCAweDAxLAorCS0xLCAweEUwLCAweDBGLCAweDMxLCAweDJCLCAweDBDLCAweDBFLCAweDA4LCAweDRFLAorCTB4RjEsIDB4MzcsIDB4MDcsIDB4MTAsIDB4MDMsIDB4MEUsIDB4MDksIDB4MDAsCisJLTEsIDB4RTEsIDB4MDAsIDB4MEUsIDB4MTQsIDB4MDMsIDB4MTEsIDB4MDcsIDB4MzEsCisJMHhDMSwgMHg0OCwgMHgwOCwgMHgwRiwgMHgwQywgMHgzMSwgMHgzNiwgMHgwRiwKKwktMSwgMHgxMSwgLTIsIDEyMCwgLTEsIDB4MjksIC0xLCAweDJjLCAtMyB9OwogCiAvKiBTdXBwb3J0ZWQgZGlzcGxheXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyICovCiBzdGF0aWMgc3RydWN0IGZidGZ0X2RldmljZV9kaXNwbGF5IGRpc3BsYXlzW10gPSB7CkBAIC00NjMsNyArNDg5LDcgQEAKIAkJCQkJLmJ1c3dpZHRoID0gOCwKIAkJCQkJLmJhY2tsaWdodCA9IDEsCiAJCQkJfSwKLQkJCQkuc3RhcnRieXRlID0gMGIwMTExMDAwMCwKKwkJCQkuc3RhcnRieXRlID0gMHg3MCwKIAkJCQkuYmdyID0gdHJ1ZSwKIAkJCQkuZ3Bpb3MgPSAoY29uc3Qgc3RydWN0IGZidGZ0X2dwaW8gW10pIHsKIAkJCQkJeyAicmVzZXQiLCAyNSB9LApAQCAtNDg0LDkgKzUxMCw5IEBACiAJCQkJCS5iYWNrbGlnaHQgPSAxLAogCQkJCQkuaW5pdF9zZXF1ZW5jZSA9IGh5MjhiX2luaXRfc2VxdWVuY2UsCiAJCQkJfSwKLQkJCQkuc3RhcnRieXRlID0gMGIwMTExMDAwMCwKKwkJCQkuc3RhcnRieXRlID0gMHg3MCwKIAkJCQkuYmdyID0gdHJ1ZSwKLQkJCQkuZnBzPSA1MCwKKwkJCQkuZnBzID0gNTAsCiAJCQkJLmdwaW9zID0gKGNvbnN0IHN0cnVjdCBmYnRmdF9ncGlvIFtdKSB7CiAJCQkJCXsgInJlc2V0IiwgMjUgfSwKIAkJCQkJeyAibGVkIiwgMTggfSwKQEAgLTU5Nyw3ICs2MjMsNyBAQAogCQkJCQkuYnVzd2lkdGggPSA4LAogCQkJCQkuYmFja2xpZ2h0ID0gMSwKIAkJCQl9LAotCQkJCS5zdGFydGJ5dGUgPSAwYjAxMTEwMDAwLAorCQkJCS5zdGFydGJ5dGUgPSAweDcwLAogCQkJCS5iZ3IgPSB0cnVlLAogCQkJCS5ncGlvcyA9IChjb25zdCBzdHJ1Y3QgZmJ0ZnRfZ3BpbyBbXSkgewogCQkJCQl7ICJyZXNldCIsIDI1IH0sCkBAIC02NzYsNiArNzAyLDI0IEBACiAJCQl9CiAJCX0KIAl9LCB7CisJCS5uYW1lID0gIm5va2lhNTExMCIsCisJCS5zcGkgPSAmKHN0cnVjdCBzcGlfYm9hcmRfaW5mbykgeworCQkJLm1vZGFsaWFzID0gImZiX2lsaTkxNjMiLAorCQkJLm1heF9zcGVlZF9oeiA9IDEyMDAwMDAwLAorCQkJLm1vZGUgPSBTUElfTU9ERV8wLAorCQkJLnBsYXRmb3JtX2RhdGEgPSAmKHN0cnVjdCBmYnRmdF9wbGF0Zm9ybV9kYXRhKSB7CisJCQkJLmRpc3BsYXkgPSB7CisJCQkJCS5idXN3aWR0aCA9IDgsCisJCQkJCS5iYWNrbGlnaHQgPSAxLAorCQkJCX0sCisJCQkJLmJnciA9IHRydWUsCisJCQkJLmdwaW9zID0gKGNvbnN0IHN0cnVjdCBmYnRmdF9ncGlvIFtdKSB7CisJCQkJCXt9LAorCQkJCX0sCisJCQl9CisJCX0KKwl9LCB7CisKIAkJLm5hbWUgPSAicGlzY3JlZW4iLAogCQkuc3BpID0gJihzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8pIHsKIAkJCS5tb2RhbGlhcyA9ICJmYl9pbGk5NDg2IiwKQEAgLTExMDAsMTQgKzExNDQsMTQgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCQkJaWYgKChkYXRhICYgMSkgIT0gKHByZXZfZGF0YSAmIDEpKQogCQkJCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uZGJbaV0sCi0JCQkJCQkJCShkYXRhICYgMSkpOworCQkJCQkJCQlkYXRhICYgMSk7CiAJCQkJZGF0YSA+Pj0gMTsKIAkJCQlwcmV2X2RhdGEgPj49IDE7CiAJCQl9CiAJCX0KICNlbHNlCiAJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uZGJbaV0sIChkYXRhICYgMSkpOworCQkJZ3Bpb19zZXRfdmFsdWUocGFyLT5ncGlvLmRiW2ldLCBkYXRhICYgMSk7CiAJCQlkYXRhID4+PSAxOwogCQl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mbGV4ZmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mbGV4ZmIuYwppbmRleCA5MDgzMmMzLi5jYTM5ZmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmxleGZiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZsZXhmYi5jCkBAIC00MjMsNyArNDIzLDcgQEAKIAkJCX0KIAkJCXBhci0+ZmJ0ZnRvcHMud3JpdGVfcmVnaXN0ZXIgPSBmYnRmdF93cml0ZV9yZWc4X2J1czk7CiAJCQlwYXItPmZidGZ0b3BzLndyaXRlX3ZtZW0gPSBmYnRmdF93cml0ZV92bWVtMTZfYnVzOTsKLQkJCXNkZXYtPmJpdHNfcGVyX3dvcmQ9OTsKKwkJCXNkZXYtPmJpdHNfcGVyX3dvcmQgPSA5OwogCQkJcmV0ID0gc2Rldi0+bWFzdGVyLT5zZXR1cChzZGV2KTsKIAkJCWlmIChyZXQpIHsKIAkJCQlkZXZfd2FybihkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OWRiODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvaW50ZXJuYWwuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIE5vcmFsZiBUcm9ubmVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfRkJURlRfX0lOVEVSTkFMX0gKKyNkZWZpbmUgX19MSU5VWF9GQlRGVF9JTlRFUk5BTF9ICisKK3ZvaWQgZmJ0ZnRfc3lzZnNfaW5pdChzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpOwordm9pZCBmYnRmdF9zeXNmc19leGl0KHN0cnVjdCBmYnRmdF9wYXIgKnBhcik7Cit2b2lkIGZidGZ0X2V4cGFuZF9kZWJ1Z192YWx1ZSh1bnNpZ25lZCBsb25nICpkZWJ1Zyk7CitpbnQgZmJ0ZnRfZ2FtbWFfcGFyc2Vfc3RyKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzLAorCQkJICBjb25zdCBjaGFyICpzdHIsIGludCBzaXplKTsKKworI2VuZGlmIC8qIF9fTElOVVhfRkJURlRfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZGYwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL0tjb25maWcKQEAgLTAsMCArMSBAQAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2YTAwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACisjIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVycworb2JqLSQoQ09ORklHX0ZTTF9NQ19CVVMpCSs9IGJ1cy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzgyODhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9UT0RPCkBAIC0wLDAgKzEsMTMgQEAKKyogQWRkIFJFQURNRSBmaWxlICh3aXRoIEFTQ0lJIGFydCkgZGVzY3JpYmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4KKyAgRFBBQTIgb2JqZWN0cyBhbmQgaG93IGNvbWJpbmUgdGhlbSB0byBtYWtlIGEgTklDLCBhbiBMUzIgc3dpdGNoLCBldGMuCisgIEFsc28sIGRlZmluZSBhbGwgYWNyb255bXMgdXNlZC4KKworKiBEZWNpZGUgaWYgbXVsdGlwbGUgcm9vdCBmc2wtbWMgYnVzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgcGVyIExpbnV4IGluc3RhbmNlLAorICBhbmQgaWYgc28gYWRkIHN1cHBvcnQgZm9yIHRoaXMuCisKKyogQWRkIGF0IGxlYXN0IG9uZSBkZXZpY2UgZHJpdmVyIGZvciBhIERQQUEyIG9iamVjdCAoY2hpbGQgZGV2aWNlIG9mIHRoZQorICBmc2wtbWMgYnVzKS4KKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4sCitnZXJtYW4ucml2ZXJhQGZyZWVzY2FsZS5jb20sIGRldmVsQGRyaXZlcmRldi5vc3Vvc2wub3JnLAorbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3NzlkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL0tjb25maWcKQEAgLTAsMCArMSwyNCBAQAorIworIyBGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IChNQykgYnVzIGRyaXZlcnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyMKKworY29uZmlnIEZTTF9NQ19CVVMKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXIiCisJZGVwZW5kcyBvbiBPRiAmJiBBUk02NAorCWhlbHAKKwkgIERyaXZlciB0byBlbmFibGUgdGhlIGJ1cyBpbmZyYXN0cnVjdHVyZSBmb3IgdGhlIEZyZWVzY2FsZQorICAgICAgICAgIFFvcklRIE1hbmFnZW1lbnQgQ29tcGxleCAoZnNsLW1jKS4gVGhlIGZzbC1tYyBpcyBhIGhhcmR3YXJlCisJICBtb2R1bGUgb2YgdGhlIFFvcklRIExTMiBTb0NzLCB0aGF0IGRvZXMgcmVzb3VyY2UgbWFuYWdlbWVudAorCSAgZm9yIGhhcmR3YXJlIGJ1aWxkaW5nLWJsb2NrcyBpbiB0aGUgU29DIHRoYXQgY2FuIGJlIHVzZWQKKwkgIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZSBuZXR3b3JraW5nIGhhcmR3YXJlIG9iamVjdHMgc3VjaCBhcworCSAgbmV0d29yayBpbnRlcmZhY2VzIChOSUNzKSwgY3J5cHRvIGFjY2VsZXJhdG9yIGluc3RhbmNlcywKKwkgIG9yIEwyIHN3aXRjaGVzLgorCisJICBPbmx5IGVuYWJsZSB0aGlzIG9wdGlvbiB3aGVuIGJ1aWxkaW5nIHRoZSBrZXJuZWwgZm9yCisJICBGcmVlc2NhbGUgUW9yUUlRIExTMnh4eHggU29Dcy4KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDMzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVycworIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorIworb2JqLSQoQ09ORklHX0ZTTF9NQ19CVVMpICs9IG1jLWJ1cy1kcml2ZXIubworCittYy1idXMtZHJpdmVyLW9ianMgOj0gbWMtYnVzLm8gXAorCQkgICAgICBtYy1zeXMubyBcCisJCSAgICAgIGRwcmMubyBcCisJCSAgICAgIGRwbW5nLm8gXAorCQkgICAgICBkcHJjLWRyaXZlci5vIFwKKwkJICAgICAgbWMtYWxsb2NhdG9yLm8gXAorCQkgICAgICBkcG1jcC5vIFwKKwkJICAgICAgZHBicC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcGJwLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcGJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5YWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwYnAuYwpAQCAtMCwwICsxLDM1OCBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKgorKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisqIGxhdGVyIHZlcnNpb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcGJwLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcGJwLWNtZC5oIgorCitpbnQgZHBicF9vcGVuKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBpbnQgZHBicF9pZCwgdWludDE2X3QgKnRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9PUEVOLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCAwKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgZHBicF9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqdG9rZW4gPSBNQ19DTURfSERSX1JFQURfVE9LRU4oY21kLmhlYWRlcik7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChkcGJwX29wZW4pOworCitpbnQgZHBicF9jbG9zZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9DTE9TRSwgTUNfQ01EX1BSSV9ISUdILAorCQkJCQkgIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CitFWFBPUlRfU1lNQk9MKGRwYnBfY2xvc2UpOworCitpbnQgZHBicF9jcmVhdGUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCWNvbnN0IHN0cnVjdCBkcGJwX2NmZyAqY2ZnLAorCQl1aW50MTZfdCAqdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCSh2b2lkKShjZmcpOyAvKiB1bnVzZWQgKi8KKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX0NSRUFURSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgMCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqdG9rZW4gPSBNQ19DTURfSERSX1JFQURfVE9LRU4oY21kLmhlYWRlcik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwYnBfZGVzdHJveShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9ERVNUUk9ZLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBicF9lbmFibGUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfRU5BQkxFLCBNQ19DTURfUFJJX0xPVywKKwkJCQkJICB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorRVhQT1JUX1NZTUJPTChkcGJwX2VuYWJsZSk7CisKK2ludCBkcGJwX2Rpc2FibGUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfRElTQUJMRSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KK0VYUE9SVF9TWU1CT0woZHBicF9kaXNhYmxlKTsKKworaW50IGRwYnBfaXNfZW5hYmxlZChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4sIGludCAqZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9JU19FTkFCTEVELCBNQ19DTURfUFJJX0xPVywKKwkJCQkJICB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqZW4gPSAoaW50KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAxKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHBicF9yZXNldChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9SRVNFVCwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwYnBfc2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJIHVpbnQxNl90IHRva2VuLAorCQkgdWludDhfdCBpcnFfaW5kZXgsCisJCSB1aW50NjRfdCBpcnFfcGFkZHIsCisJCSB1aW50MzJfdCBpcnFfdmFsLAorCQkgaW50IHVzZXJfaXJxX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfU0VUX0lSUSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDgsIGlycV9pbmRleCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDMyLCBpcnFfdmFsKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygwLCA2NCwgaXJxX3BhZGRyKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygwLCAzMiwgdXNlcl9pcnFfaWQpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwYnBfZ2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJIHVpbnQxNl90IHRva2VuLAorCQkgdWludDhfdCBpcnFfaW5kZXgsCisJCSBpbnQgKnR5cGUsCisJCSB1aW50NjRfdCAqaXJxX3BhZGRyLAorCQkgdWludDMyX3QgKmlycV92YWwsCisJCSBpbnQgKnVzZXJfaXJxX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9HRVRfSVJRLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqaXJxX3ZhbCA9ICh1aW50MzJfdCltY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCSppcnFfcGFkZHIgPSAodWludDY0X3QpbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDY0KTsKKwkqdXNlcl9pcnFfaWQgPSAoaW50KW1jX2RlYyhjbWQucGFyYW1zWzJdLCAwLCAzMik7CisJKnR5cGUgPSAoaW50KW1jX2RlYyhjbWQucGFyYW1zWzJdLCAzMiwgMzIpOworCXJldHVybiAwOworfQorCitpbnQgZHBicF9zZXRfaXJxX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50OF90IGVuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfU0VUX0lSUV9FTkFCTEUsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCA4LCBlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBicF9nZXRfaXJxX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50OF90ICplbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfR0VUX0lSUV9FTkFCTEUsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSplbiA9ICh1aW50OF90KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCA4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRwYnBfc2V0X2lycV9tYXNrKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgICB1aW50MTZfdCB0b2tlbiwKKwkJICAgICAgdWludDhfdCBpcnFfaW5kZXgsCisJCSAgICAgIHVpbnQzMl90IG1hc2spCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9TRVRfSVJRX01BU0ssCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgbWFzayk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBicF9nZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgIHVpbnQxNl90IHRva2VuLAorCQkgICAgICB1aW50OF90IGlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QgKm1hc2spCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX0dFVF9JUlFfTUFTSywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKm1hc2sgPSAodWludDMyX3QpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRwYnBfZ2V0X2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQl1aW50MTZfdCB0b2tlbiwKKwkJCXVpbnQ4X3QgaXJxX2luZGV4LAorCQkJdWludDMyX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfR0VUX0lSUV9TVEFUVVMsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSpzdGF0dXMgPSAodWludDMyX3QpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRwYnBfY2xlYXJfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSAgdWludDE2X3QgdG9rZW4sCisJCQkgIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkJICB1aW50MzJfdCBzdGF0dXMpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9DTEVBUl9JUlFfU1RBVFVTLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIHN0YXR1cyk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBicF9nZXRfYXR0cmlidXRlcyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJc3RydWN0IGRwYnBfYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfR0VUX0FUVFIsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCWF0dHItPmJwaWQgPSAodWludDE2X3QpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDE2LCAxNik7CisJYXR0ci0+aWQgPSAoaW50KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAzMiwgMzIpOworCWF0dHItPnZlcnNpb24ubWFqb3IgPSAodWludDE2X3QpbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDE2KTsKKwlhdHRyLT52ZXJzaW9uLm1pbm9yID0gKHVpbnQxNl90KW1jX2RlYyhjbWQucGFyYW1zWzFdLCAxNiwgMTYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcGJwX2dldF9hdHRyaWJ1dGVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AtY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmMzI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLWNtZC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfRlNMX0RQTUNQX0NNRF9ICisjZGVmaW5lIF9GU0xfRFBNQ1BfQ01EX0gKKworLyogRFBNQ1AgVmVyc2lvbiAqLworI2RlZmluZSBEUE1DUF9WRVJfTUFKT1IJCQkJMgorI2RlZmluZSBEUE1DUF9WRVJfTUlOT1IJCQkJMAorCisvKiBDb21tYW5kIElEcyAqLworI2RlZmluZSBEUE1DUF9DTURJRF9DTE9TRQkJCQkweDgwMAorI2RlZmluZSBEUE1DUF9DTURJRF9PUEVOCQkJCTB4ODBiCisjZGVmaW5lIERQTUNQX0NNRElEX0NSRUFURQkJCQkweDkwYgorI2RlZmluZSBEUE1DUF9DTURJRF9ERVNUUk9ZCQkJCTB4OTAwCisKKyNkZWZpbmUgRFBNQ1BfQ01ESURfR0VUX0FUVFIJCQkJMHgwMDQKKyNkZWZpbmUgRFBNQ1BfQ01ESURfUkVTRVQJCQkJMHgwMDUKKworI2RlZmluZSBEUE1DUF9DTURJRF9TRVRfSVJRCQkJCTB4MDEwCisjZGVmaW5lIERQTUNQX0NNRElEX0dFVF9JUlEJCQkJMHgwMTEKKyNkZWZpbmUgRFBNQ1BfQ01ESURfU0VUX0lSUV9FTkFCTEUJCQkweDAxMgorI2RlZmluZSBEUE1DUF9DTURJRF9HRVRfSVJRX0VOQUJMRQkJCTB4MDEzCisjZGVmaW5lIERQTUNQX0NNRElEX1NFVF9JUlFfTUFTSwkJCTB4MDE0CisjZGVmaW5lIERQTUNQX0NNRElEX0dFVF9JUlFfTUFTSwkJCTB4MDE1CisjZGVmaW5lIERQTUNQX0NNRElEX0dFVF9JUlFfU1RBVFVTCQkJMHgwMTYKKyNkZWZpbmUgRFBNQ1BfQ01ESURfQ0xFQVJfSVJRX1NUQVRVUwkJCTB4MDE3CisKKy8qICAgICAgICAgICAgICAgIGNtZCwgcGFyYW0sIG9mZnNldCwgd2lkdGgsIHR5cGUsIGFyZ19uYW1lICovCisjZGVmaW5lIERQTUNQX0NNRF9DUkVBVEUoY21kLCBjZmcpIFwKKwlNQ19DTURfT1AoY21kLCAwLCAwLCAgMzIsIGludCwgICAgICBjZmctPnBvcnRhbF9pZCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfQ01EX1NFVF9JUlEoY21kLCBpcnFfaW5kZXgsIGlycV9hZGRyLCBpcnFfdmFsLCB1c2VyX2lycV9pZCkgXAorZG8geyBcCisJTUNfQ01EX09QKGNtZCwgMCwgMCwgIDgsICB1aW50OF90LCAgaXJxX2luZGV4KTtcCisJTUNfQ01EX09QKGNtZCwgMCwgMzIsIDMyLCB1aW50MzJfdCwgaXJxX3ZhbCk7XAorCU1DX0NNRF9PUChjbWQsIDEsIDAsICA2NCwgdWludDY0X3QsIGlycV9hZGRyKTsgXAorCU1DX0NNRF9PUChjbWQsIDIsIDAsICAzMiwgaW50LAkgICAgdXNlcl9pcnFfaWQpOyBcCit9IHdoaWxlICgwKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9DTURfR0VUX0lSUShjbWQsIGlycV9pbmRleCkgXAorCU1DX0NNRF9PUChjbWQsIDAsIDMyLCA4LCAgdWludDhfdCwgIGlycV9pbmRleCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfUlNQX0dFVF9JUlEoY21kLCB0eXBlLCBpcnFfYWRkciwgaXJxX3ZhbCwgdXNlcl9pcnFfaWQpIFwKK2RvIHsgXAorCU1DX1JTUF9PUChjbWQsIDAsIDAsICAzMiwgdWludDMyX3QsIGlycV92YWwpOyBcCisJTUNfUlNQX09QKGNtZCwgMSwgMCwgIDY0LCB1aW50NjRfdCwgaXJxX2FkZHIpOyBcCisJTUNfUlNQX09QKGNtZCwgMiwgMCwgIDMyLCBpbnQsCSAgICB1c2VyX2lycV9pZCk7IFwKKwlNQ19SU1BfT1AoY21kLCAyLCAzMiwgMzIsIGludCwJICAgIHR5cGUpOyBcCit9IHdoaWxlICgwKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9DTURfU0VUX0lSUV9FTkFCTEUoY21kLCBpcnFfaW5kZXgsIGVuKSBcCitkbyB7IFwKKwlNQ19DTURfT1AoY21kLCAwLCAwLCAgOCwgIHVpbnQ4X3QsICBlbik7IFwKKwlNQ19DTURfT1AoY21kLCAwLCAzMiwgOCwgIHVpbnQ4X3QsICBpcnFfaW5kZXgpO1wKK30gd2hpbGUgKDApCisKKy8qICAgICAgICAgICAgICAgIGNtZCwgcGFyYW0sIG9mZnNldCwgd2lkdGgsIHR5cGUsIGFyZ19uYW1lICovCisjZGVmaW5lIERQTUNQX0NNRF9HRVRfSVJRX0VOQUJMRShjbWQsIGlycV9pbmRleCkgXAorCU1DX0NNRF9PUChjbWQsIDAsIDMyLCA4LCAgdWludDhfdCwgIGlycV9pbmRleCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfUlNQX0dFVF9JUlFfRU5BQkxFKGNtZCwgZW4pIFwKKwlNQ19SU1BfT1AoY21kLCAwLCAwLCAgOCwgIHVpbnQ4X3QsICBlbikKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfQ01EX1NFVF9JUlFfTUFTSyhjbWQsIGlycV9pbmRleCwgbWFzaykgXAorZG8geyBcCisJTUNfQ01EX09QKGNtZCwgMCwgMCwgIDMyLCB1aW50MzJfdCwgbWFzayk7XAorCU1DX0NNRF9PUChjbWQsIDAsIDMyLCA4LCAgdWludDhfdCwgIGlycV9pbmRleCk7XAorfSB3aGlsZSAoMCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfQ01EX0dFVF9JUlFfTUFTSyhjbWQsIGlycV9pbmRleCkgXAorCU1DX0NNRF9PUChjbWQsIDAsIDMyLCA4LCAgdWludDhfdCwgIGlycV9pbmRleCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfUlNQX0dFVF9JUlFfTUFTSyhjbWQsIG1hc2spIFwKKwlNQ19SU1BfT1AoY21kLCAwLCAwLCAgMzIsIHVpbnQzMl90LCBtYXNrKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9DTURfR0VUX0lSUV9TVEFUVVMoY21kLCBpcnFfaW5kZXgpIFwKKwlNQ19DTURfT1AoY21kLCAwLCAzMiwgOCwgIHVpbnQ4X3QsICBpcnFfaW5kZXgpCisKKy8qICAgICAgICAgICAgICAgIGNtZCwgcGFyYW0sIG9mZnNldCwgd2lkdGgsIHR5cGUsIGFyZ19uYW1lICovCisjZGVmaW5lIERQTUNQX1JTUF9HRVRfSVJRX1NUQVRVUyhjbWQsIHN0YXR1cykgXAorCU1DX1JTUF9PUChjbWQsIDAsIDAsICAzMiwgdWludDMyX3QsIHN0YXR1cykKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfQ01EX0NMRUFSX0lSUV9TVEFUVVMoY21kLCBpcnFfaW5kZXgsIHN0YXR1cykgXAorZG8geyBcCisJTUNfQ01EX09QKGNtZCwgMCwgMCwgIDMyLCB1aW50MzJfdCwgc3RhdHVzKTsgXAorCU1DX0NNRF9PUChjbWQsIDAsIDMyLCA4LCAgdWludDhfdCwgIGlycV9pbmRleCk7XAorfSB3aGlsZSAoMCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwJYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfUlNQX0dFVF9BVFRSSUJVVEVTKGNtZCwgYXR0cikgXAorZG8geyBcCisJTUNfUlNQX09QKGNtZCwgMCwgMzIsIDMyLCBpbnQsCSAgICBhdHRyLT5pZCk7XAorCU1DX1JTUF9PUChjbWQsIDEsIDAsICAxNiwgdWludDE2X3QsIGF0dHItPnZlcnNpb24ubWFqb3IpO1wKKwlNQ19SU1BfT1AoY21kLCAxLCAxNiwgMTYsIHVpbnQxNl90LCBhdHRyLT52ZXJzaW9uLm1pbm9yKTtcCit9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX0ZTTF9EUE1DUF9DTURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5ZGE1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLmMKQEAgLTAsMCArMSwzMDggQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWNtZC5oIgorI2luY2x1ZGUgImRwbWNwLmgiCisjaW5jbHVkZSAiZHBtY3AtY21kLmgiCisKK2ludCBkcG1jcF9vcGVuKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBpbnQgZHBtY3BfaWQsIHVpbnQxNl90ICp0b2tlbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX09QRU4sCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIDApOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBkcG1jcF9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqdG9rZW4gPSBNQ19DTURfSERSX1JFQURfVE9LRU4oY21kLmhlYWRlcik7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZHBtY3BfY2xvc2Uoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX0NMT1NFLCBNQ19DTURfUFJJX0hJR0gsCisJCQkJCSAgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwbWNwX2NyZWF0ZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJIGNvbnN0IHN0cnVjdCBkcG1jcF9jZmcgKmNmZywKKwkJdWludDE2X3QgKnRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfQ1JFQVRFLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCAwKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgY2ZnLT5wb3J0YWxfaWQpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKnRva2VuID0gTUNfQ01EX0hEUl9SRUFEX1RPS0VOKGNtZC5oZWFkZXIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcG1jcF9kZXN0cm95KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUE1DUF9DTURJRF9ERVNUUk9ZLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBtY3BfcmVzZXQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX1JFU0VULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBtY3Bfc2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICB1aW50MTZfdCB0b2tlbiwKKwkJIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkgdWludDY0X3QgaXJxX2FkZHIsCisJCSB1aW50MzJfdCBpcnFfdmFsLAorCQkgaW50IHVzZXJfaXJxX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX1NFVF9JUlEsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCA4LCBpcnFfaW5kZXgpOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCAzMiwgaXJxX3ZhbCk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgNjQsIGlycV9hZGRyKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygwLCAzMiwgdXNlcl9pcnFfaWQpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwbWNwX2dldF9pcnEoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgdWludDE2X3QgdG9rZW4sCisJCSB1aW50OF90IGlycV9pbmRleCwKKwkJIGludCAqdHlwZSwKKwkJIHVpbnQ2NF90ICppcnFfYWRkciwKKwkJIHVpbnQzMl90ICppcnFfdmFsLAorCQkgaW50ICp1c2VyX2lycV9pZCkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX0dFVF9JUlEsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSppcnFfdmFsID0gKHVpbnQzMl90KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisJKmlycV9hZGRyID0gKHVpbnQ2NF90KW1jX2RlYyhjbWQucGFyYW1zWzFdLCAwLCA2NCk7CisJKnVzZXJfaXJxX2lkID0gKGludCltY19kZWMoY21kLnBhcmFtc1syXSwgMCwgMzIpOworCSp0eXBlID0gKGludCltY19kZWMoY21kLnBhcmFtc1syXSwgMzIsIDMyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRwbWNwX3NldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJIHVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50OF90IGVuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX1NFVF9JUlFfRU5BQkxFLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgOCwgZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwbWNwX2dldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJIHVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50OF90ICplbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX0dFVF9JUlFfRU5BQkxFLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqZW4gPSAodWludDhfdCltY19kZWMoY21kLnBhcmFtc1swXSwgMCwgOCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcG1jcF9zZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgICB1aW50MTZfdCB0b2tlbiwKKwkJICAgICAgdWludDhfdCBpcnFfaW5kZXgsCisJCSAgICAgIHVpbnQzMl90IG1hc2spCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfU0VUX0lSUV9NQVNLLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIG1hc2spOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwbWNwX2dldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgIHVpbnQxNl90IHRva2VuLAorCQkgICAgICB1aW50OF90IGlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QgKm1hc2spCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUE1DUF9DTURJRF9HRVRfSVJRX01BU0ssCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSptYXNrID0gKHVpbnQzMl90KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcG1jcF9nZXRfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSB1aW50MTZfdCB0b2tlbiwKKwkJCXVpbnQ4X3QgaXJxX2luZGV4LAorCQkJdWludDMyX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX0dFVF9JUlFfU1RBVFVTLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqc3RhdHVzID0gKHVpbnQzMl90KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcG1jcF9jbGVhcl9pcnFfc3RhdHVzKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJICAgdWludDE2X3QgdG9rZW4sCisJCQkgIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkJICB1aW50MzJfdCBzdGF0dXMpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfQ0xFQVJfSVJRX1NUQVRVUywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBzdGF0dXMpOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwbWNwX2dldF9hdHRyaWJ1dGVzKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJIHVpbnQxNl90IHRva2VuLAorCQkJc3RydWN0IGRwbWNwX2F0dHIgKmF0dHIpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUE1DUF9DTURJRF9HRVRfQVRUUiwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJYXR0ci0+aWQgPSAoaW50KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAzMiwgMzIpOworCWF0dHItPnZlcnNpb24ubWFqb3IgPSAodWludDE2X3QpbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDE2KTsKKwlhdHRyLT52ZXJzaW9uLm1pbm9yID0gKHVpbnQxNl90KW1jX2RlYyhjbWQucGFyYW1zWzFdLCAxNiwgMTYpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3YzIxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9fRlNMX0RQTUNQX0gKKyNkZWZpbmUgX19GU0xfRFBNQ1BfSAorCisvKiBEYXRhIFBhdGggTWFuYWdlbWVudCBDb21tYW5kIFBvcnRhbCBBUEkKKyAqIENvbnRhaW5zIGluaXRpYWxpemF0aW9uIEFQSXMgYW5kIHJ1bnRpbWUgY29udHJvbCBBUElzIGZvciBEUE1DUAorICovCisKK3N0cnVjdCBmc2xfbWNfaW87CisKKy8qKgorICogZHBtY3Bfb3BlbigpIC0gT3BlbiBhIGNvbnRyb2wgc2Vzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQGRwbWNwX2lkOglEUE1DUCB1bmlxdWUgSUQKKyAqIEB0b2tlbjoJUmV0dXJuZWQgdG9rZW47IHVzZSBpbiBzdWJzZXF1ZW50IEFQSSBjYWxscworICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gb3BlbiBhIGNvbnRyb2wgc2Vzc2lvbiBmb3IgYW4KKyAqIGFscmVhZHkgY3JlYXRlZCBvYmplY3Q7IGFuIG9iamVjdCBtYXkgaGF2ZSBiZWVuIGRlY2xhcmVkIGluCisgKiB0aGUgRFBMIG9yIGJ5IGNhbGxpbmcgdGhlIGRwbWNwX2NyZWF0ZSBmdW5jdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHVuaXF1ZSBhdXRoZW50aWNhdGlvbiB0b2tlbiwKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWMgb2JqZWN0IElEIGFuZCB0aGUgc3BlY2lmaWMgTUMKKyAqIHBvcnRhbDsgdGhpcyB0b2tlbiBtdXN0IGJlIHVzZWQgaW4gYWxsIHN1YnNlcXVlbnQgY29tbWFuZHMgZm9yCisgKiB0aGlzIHNwZWNpZmljIG9iamVjdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3Bfb3BlbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgaW50IGRwbWNwX2lkLCB1aW50MTZfdCAqdG9rZW4pOworCisvKiBHZXQgcG9ydGFsIElEIGZyb20gcG9vbCAqLworI2RlZmluZSBEUE1DUF9HRVRfUE9SVEFMX0lEX0ZST01fUE9PTCAoLTEpCisKKy8qKgorICogZHBtY3BfY2xvc2UoKSAtIENsb3NlIHRoZSBjb250cm9sIHNlc3Npb24gb2YgdGhlIG9iamVjdAorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKgorICogQWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIG5vIGZ1cnRoZXIgb3BlcmF0aW9ucyBhcmUKKyAqIGFsbG93ZWQgb24gdGhlIG9iamVjdCB3aXRob3V0IG9wZW5pbmcgYSBuZXcgY29udHJvbCBzZXNzaW9uLgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfY2xvc2Uoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKTsKKworLyoqCisgKiBzdHJ1Y3QgZHBtY3BfY2ZnKCkgLSBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIERQTUNQIGNvbmZpZ3VyYXRpb24KKyAqIEBwb3J0YWxfaWQ6CVBvcnRhbCBJRDsgJ0RQTUNQX0dFVF9QT1JUQUxfSURfRlJPTV9QT09MJyB0byBnZXQgdGhlIHBvcnRhbCBJRAorICoJCWZyb20gcG9vbAorICovCitzdHJ1Y3QgZHBtY3BfY2ZnIHsKKwlpbnQgcG9ydGFsX2lkOworfTsKKworLyoqCisgKiBkcG1jcF9jcmVhdGUoKSAtIENyZWF0ZSB0aGUgRFBNQ1Agb2JqZWN0LgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEBjZmc6CUNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAdG9rZW46CVJldHVybmVkIHRva2VuOyB1c2UgaW4gc3Vic2VxdWVudCBBUEkgY2FsbHMKKyAqCisgKiBDcmVhdGUgdGhlIERQTUNQIG9iamVjdCwgYWxsb2NhdGUgcmVxdWlyZWQgcmVzb3VyY2VzIGFuZAorICogcGVyZm9ybSByZXF1aXJlZCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBUaGUgb2JqZWN0IGNhbiBiZSBjcmVhdGVkIGVpdGhlciBieSBkZWNsYXJpbmcgaXQgaW4gdGhlCisgKiBEUEwgZmlsZSwgb3IgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdW5pcXVlIGF1dGhlbnRpY2F0aW9uIHRva2VuLAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpYyBvYmplY3QgSUQgYW5kIHRoZSBzcGVjaWZpYyBNQworICogcG9ydGFsOyB0aGlzIHRva2VuIG11c3QgYmUgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjYWxscyB0bworICogdGhpcyBzcGVjaWZpYyBvYmplY3QuIEZvciBvYmplY3RzIHRoYXQgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlCisgKiBEUEwgZmlsZSwgY2FsbCBkcG1jcF9vcGVuIGZ1bmN0aW9uIHRvIGdldCBhbiBhdXRoZW50aWNhdGlvbgorICogdG9rZW4gZmlyc3QuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9jcmVhdGUoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSBjb25zdCBzdHJ1Y3QgZHBtY3BfY2ZnCSpjZmcsCisJCXVpbnQxNl90CQkqdG9rZW4pOworCisvKioKKyAqIGRwbWNwX2Rlc3Ryb3koKSAtIERlc3Ryb3kgdGhlIERQTUNQIG9iamVjdCBhbmQgcmVsZWFzZSBhbGwgaXRzIHJlc291cmNlcy4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQTUNQIG9iamVjdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfZGVzdHJveShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pOworCisvKioKKyAqIGRwbWNwX3Jlc2V0KCkgLSBSZXNldCB0aGUgRFBNQ1AsIHJldHVybnMgdGhlIG9iamVjdCB0byBpbml0aWFsIHN0YXRlLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9yZXNldChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pOworCisvKiBJUlEgKi8KKy8qIQorICogQG5hbWUgZHBtY3AgSVJRIEluZGV4IGFuZCBFdmVudHMKKyAqLworI2RlZmluZSBEUE1DUF9JUlFfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKy8qITwgSXJxIGluZGV4ICovCisjZGVmaW5lIERQTUNQX0lSUV9FVkVOVF9DTURfRE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorLyohPCBpcnEgZXZlbnQgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBzdGF0ZSBjaGFuZ2VkICovCisvKiBAfSAqLworCisvKioKKyAqIGRwbWNwX3NldF9pcnEoKSAtIFNldCBJUlEgaW5mb3JtYXRpb24gZm9yIHRoZSBEUE1DUCB0byB0cmlnZ2VyIGFuIGludGVycnVwdC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQTUNQIG9iamVjdAorICogQGlycV9pbmRleDoJSWRlbnRpZmllcyB0aGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQGlycV9hZGRyOglBZGRyZXNzIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvCisgKgkJCQlzaWduYWwgYSBtZXNzYWdlLWJhc2VkIGludGVycnVwdAorICogQGlycV92YWw6CVZhbHVlIHRvIHdyaXRlIGludG8gaXJxX2FkZHIgYWRkcmVzcworICogQHVzZXJfaXJxX2lkOiBBIHVzZXIgZGVmaW5lZCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSVJRCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9zZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgIHVpbnQxNl90CQl0b2tlbiwKKwkJIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJIHVpbnQ2NF90CQlpcnFfYWRkciwKKwkJIHVpbnQzMl90CQlpcnFfdmFsLAorCQkgaW50CQkJdXNlcl9pcnFfaWQpOworCisvKioKKyAqIGRwbWNwX2dldF9pcnEoKSAtIEdldCBJUlEgaW5mb3JtYXRpb24gZnJvbSB0aGUgRFBNQ1AuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAdHlwZToJSW50ZXJydXB0IHR5cGU6IDAgcmVwcmVzZW50cyBtZXNzYWdlIGludGVycnVwdAorICoJCQkJdHlwZSAoYm90aCBpcnFfYWRkciBhbmQgaXJxX3ZhbCBhcmUgdmFsaWQpCisgKiBAaXJxX2FkZHI6CVJldHVybmVkIGFkZHJlc3MgdGhhdCBtdXN0IGJlIHdyaXR0ZW4gdG8KKyAqCQkJCXNpZ25hbCB0aGUgbWVzc2FnZS1iYXNlZCBpbnRlcnJ1cHQKKyAqIEBpcnFfdmFsOglWYWx1ZSB0byB3cml0ZSBpbnRvIGlycV9hZGRyIGFkZHJlc3MKKyAqIEB1c2VyX2lycV9pZDogQSB1c2VyIGRlZmluZWQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElSUQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfZ2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICB1aW50MTZfdAkJdG9rZW4sCisJCSB1aW50OF90CQlpcnFfaW5kZXgsCisJCSBpbnQJCQkqdHlwZSwKKwkJIHVpbnQ2NF90CQkqaXJxX2FkZHIsCisJCSB1aW50MzJfdAkJKmlycV92YWwsCisJCSBpbnQJCQkqdXNlcl9pcnFfaWQpOworCisvKioKKyAqIGRwbWNwX3NldF9pcnFfZW5hYmxlKCkgLSBTZXQgb3ZlcmFsbCBpbnRlcnJ1cHQgc3RhdGUuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAZW46CUludGVycnVwdCBzdGF0ZSAtIGVuYWJsZSA9IDEsIGRpc2FibGUgPSAwCisgKgorICogQWxsb3dzIEdQUCBzb2Z0d2FyZSB0byBjb250cm9sIHdoZW4gaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkLgorICogRWFjaCBpbnRlcnJ1cHQgY2FuIGhhdmUgdXAgdG8gMzIgY2F1c2VzLiAgVGhlIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2wncyB0aGUKKyAqIG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlLiBpZiB0aGUgaW50ZXJydXB0IGlzIGRpc2FibGVkIG5vIGNhdXNlcyB3aWxsIGNhdXNlCisgKiBhbiBpbnRlcnJ1cHQuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9zZXRfaXJxX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSB1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDhfdAkJCWVuKTsKKworLyoqCisgKiBkcG1jcF9nZXRfaXJxX2VuYWJsZSgpIC0gR2V0IG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAZW46CQlSZXR1cm5lZCBpbnRlcnJ1cHQgc3RhdGUgLSBlbmFibGUgPSAxLCBkaXNhYmxlID0gMAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfZ2V0X2lycV9lbmFibGUoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQkgdWludDE2X3QJCXRva2VuLAorCQkJdWludDhfdAkJCWlycV9pbmRleCwKKwkJCXVpbnQ4X3QJCQkqZW4pOworCisvKioKKyAqIGRwbWNwX3NldF9pcnFfbWFzaygpIC0gU2V0IGludGVycnVwdCBtYXNrLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQG1hc2s6CUV2ZW50IG1hc2sgdG8gdHJpZ2dlciBpbnRlcnJ1cHQ7CisgKgkJCWVhY2ggYml0OgorICoJCQkJMCA9IGlnbm9yZSBldmVudAorICoJCQkJMSA9IGNvbnNpZGVyIGV2ZW50IGZvciBhc3NlcnRpbmcgSVJRCisgKgorICogRXZlcnkgaW50ZXJydXB0IGNhbiBoYXZlIHVwIHRvIDMyIGNhdXNlcyBhbmQgdGhlIGludGVycnVwdCBtb2RlbCBzdXBwb3J0cworICogbWFza2luZy91bm1hc2tpbmcgZWFjaCBjYXVzZSBpbmRlcGVuZGVudGx5CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9zZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgICAgICB1aW50MTZfdAkJdG9rZW4sCisJCSAgICAgIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QJCW1hc2spOworCisvKioKKyAqIGRwbWNwX2dldF9pcnFfbWFzaygpIC0gR2V0IGludGVycnVwdCBtYXNrLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQG1hc2s6CVJldHVybmVkIGV2ZW50IG1hc2sgdG8gdHJpZ2dlciBpbnRlcnJ1cHQKKyAqCisgKiBFdmVyeSBpbnRlcnJ1cHQgY2FuIGhhdmUgdXAgdG8gMzIgY2F1c2VzIGFuZCB0aGUgaW50ZXJydXB0IG1vZGVsIHN1cHBvcnRzCisgKiBtYXNraW5nL3VubWFza2luZyBlYWNoIGNhdXNlIGluZGVwZW5kZW50bHkKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbWNwX2dldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgdWludDhfdAkJaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdAkJKm1hc2spOworCisvKioKKyAqIGRwbWNwX2dldF9pcnFfc3RhdHVzKCkgLSBHZXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGFueSBwZW5kaW5nIGludGVycnVwdHMuCisgKgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQHN0YXR1czoJUmV0dXJuZWQgaW50ZXJydXB0cyBzdGF0dXMgLSBvbmUgYml0IHBlciBjYXVzZToKKyAqCQkJMCA9IG5vIGludGVycnVwdCBwZW5kaW5nCisgKgkJCTEgPSBpbnRlcnJ1cHQgcGVuZGluZworICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfZ2V0X2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQkgdWludDE2X3QJCXRva2VuLAorCQkJdWludDhfdAkJCWlycV9pbmRleCwKKwkJCXVpbnQzMl90CQkqc3RhdHVzKTsKKworLyoqCisgKiBkcG1jcF9jbGVhcl9pcnFfc3RhdHVzKCkgLSBDbGVhciBhIHBlbmRpbmcgaW50ZXJydXB0J3Mgc3RhdHVzCisgKgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQHN0YXR1czoJQml0cyB0byBjbGVhciAoVzFDKSAtIG9uZSBiaXQgcGVyIGNhdXNlOgorICoJCQkJCTAgPSBkb24ndCBjaGFuZ2UKKyAqCQkJCQkxID0gY2xlYXIgc3RhdHVzIGJpdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfY2xlYXJfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSAgIHVpbnQxNl90CQl0b2tlbiwKKwkJCSAgdWludDhfdAkJaXJxX2luZGV4LAorCQkJICB1aW50MzJfdAkJc3RhdHVzKTsKKworLyoqCisgKiBzdHJ1Y3QgZHBtY3BfYXR0ciAtIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgRFBNQ1AgYXR0cmlidXRlcworICogQGlkOgkJRFBNQ1Agb2JqZWN0IElECisgKiBAdmVyc2lvbjoJRFBNQ1AgdmVyc2lvbgorICovCitzdHJ1Y3QgZHBtY3BfYXR0ciB7CisJaW50IGlkOworCS8qKgorCSAqIHN0cnVjdCB2ZXJzaW9uIC0gU3RydWN0dXJlIHJlcHJlc2VudGluZyBEUE1DUCB2ZXJzaW9uCisJICogQG1ham9yOglEUE1DUCBtYWpvciB2ZXJzaW9uCisJICogQG1pbm9yOglEUE1DUCBtaW5vciB2ZXJzaW9uCisJICovCisJc3RydWN0IHsKKwkJdWludDE2X3QgbWFqb3I7CisJCXVpbnQxNl90IG1pbm9yOworCX0gdmVyc2lvbjsKK307CisKKy8qKgorICogZHBtY3BfZ2V0X2F0dHJpYnV0ZXMgLSBSZXRyaWV2ZSBEUE1DUCBhdHRyaWJ1dGVzLgorICoKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQTUNQIG9iamVjdAorICogQGF0dHI6CVJldHVybmVkIG9iamVjdCdzIGF0dHJpYnV0ZXMKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbWNwX2dldF9hdHRyaWJ1dGVzKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJIHVpbnQxNl90CQl0b2tlbiwKKwkJCXN0cnVjdCBkcG1jcF9hdHRyCSphdHRyKTsKKworI2VuZGlmIC8qIF9fRlNMX0RQTUNQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbW5nLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmctY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4Y2ZhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbW5nLWNtZC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qCisgZHBtbmctY21kLmgKKworIGRlZmluZXMgcG9ydGFsIGNvbW1hbmRzCisKKyAqLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0ZTTF9EUE1OR19DTURfSAorI2RlZmluZSBfX0ZTTF9EUE1OR19DTURfSAorCisvKiBDb21tYW5kIElEcyAqLworI2RlZmluZSBEUE1OR19DTURJRF9HRVRfQ09OVF9JRAkJCTB4ODMwCisjZGVmaW5lIERQTU5HX0NNRElEX0dFVF9WRVJTSU9OCQkJMHg4MzEKKworI2VuZGlmIC8qIF9fRlNMX0RQTU5HX0NNRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMyOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmcuYwpAQCAtMCwwICsxLDc4IEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqCisqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogbGF0ZXIgdmVyc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwbW5nLmgiCisjaW5jbHVkZSAiZHBtbmctY21kLmgiCisKK2ludCBtY19nZXRfdmVyc2lvbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgc3RydWN0IG1jX3ZlcnNpb24gKm1jX3Zlcl9pbmZvKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNTkdfQ01ESURfR0VUX1ZFUlNJT04sCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIDApOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJbWNfdmVyX2luZm8tPnJldmlzaW9uID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwltY192ZXJfaW5mby0+bWFqb3IgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMzIsIDMyKTsKKwltY192ZXJfaW5mby0+bWlub3IgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgMzIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcG1uZ19nZXRfY29udGFpbmVyX2lkKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBpbnQgKmNvbnRhaW5lcl9pZCkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTU5HX0NNRElEX0dFVF9DT05UX0lELAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCAwKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSpjb250YWluZXJfaWQgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWNtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjAyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWNtZC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qCisgZHByYy1jbWQuaAorCisgZGVmaW5lcyBkcHJjIHBvcnRhbCBjb21tYW5kcworCisgKi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0ZTTF9EUFJDX0NNRF9ICisjZGVmaW5lIF9GU0xfRFBSQ19DTURfSAorCisvKiBEUFJDIFZlcnNpb24gKi8KKyNkZWZpbmUgRFBSQ19WRVJfTUFKT1IJCQkJMworI2RlZmluZSBEUFJDX1ZFUl9NSU5PUgkJCQkwCisKKy8qIENvbW1hbmQgSURzICovCisjZGVmaW5lIERQUkNfQ01ESURfQ0xPU0UJCQkweDgwMAorI2RlZmluZSBEUFJDX0NNRElEX09QRU4JCQkJMHg4MDUKKyNkZWZpbmUgRFBSQ19DTURJRF9DUkVBVEUJCQkweDkwNQorCisjZGVmaW5lIERQUkNfQ01ESURfR0VUX0FUVFIJCQkweDAwNAorI2RlZmluZSBEUFJDX0NNRElEX1JFU0VUX0NPTlQJCQkweDAwNQorCisjZGVmaW5lIERQUkNfQ01ESURfU0VUX0lSUQkJCTB4MDEwCisjZGVmaW5lIERQUkNfQ01ESURfR0VUX0lSUQkJCTB4MDExCisjZGVmaW5lIERQUkNfQ01ESURfU0VUX0lSUV9FTkFCTEUJCTB4MDEyCisjZGVmaW5lIERQUkNfQ01ESURfR0VUX0lSUV9FTkFCTEUJCTB4MDEzCisjZGVmaW5lIERQUkNfQ01ESURfU0VUX0lSUV9NQVNLCQkJMHgwMTQKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfSVJRX01BU0sJCQkweDAxNQorI2RlZmluZSBEUFJDX0NNRElEX0dFVF9JUlFfU1RBVFVTCQkweDAxNgorI2RlZmluZSBEUFJDX0NNRElEX0NMRUFSX0lSUV9TVEFUVVMJCTB4MDE3CisKKyNkZWZpbmUgRFBSQ19DTURJRF9DUkVBVEVfQ09OVAkJCTB4MTUxCisjZGVmaW5lIERQUkNfQ01ESURfREVTVFJPWV9DT05UCQkJMHgxNTIKKyNkZWZpbmUgRFBSQ19DTURJRF9TRVRfUkVTX1FVT1RBCQkweDE1NQorI2RlZmluZSBEUFJDX0NNRElEX0dFVF9SRVNfUVVPVEEJCTB4MTU2CisjZGVmaW5lIERQUkNfQ01ESURfQVNTSUdOCQkJMHgxNTcKKyNkZWZpbmUgRFBSQ19DTURJRF9VTkFTU0lHTgkJCTB4MTU4CisjZGVmaW5lIERQUkNfQ01ESURfR0VUX09CSl9DT1VOVAkJMHgxNTkKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfT0JKCQkJMHgxNUEKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfUkVTX0NPVU5UCQkweDE1QgorI2RlZmluZSBEUFJDX0NNRElEX0dFVF9SRVNfSURTCQkJMHgxNUMKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfT0JKX1JFRwkJCTB4MTVFCisKKyNkZWZpbmUgRFBSQ19DTURJRF9DT05ORUNUCQkJMHgxNjcKKyNkZWZpbmUgRFBSQ19DTURJRF9ESVNDT05ORUNUCQkJMHgxNjgKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfUE9PTAkJCTB4MTY5CisjZGVmaW5lIERQUkNfQ01ESURfR0VUX1BPT0xfQ09VTlQJCTB4MTZBCisjZGVmaW5lIERQUkNfQ01ESURfR0VUX1BPUlRBTF9QQUREUgkJMHgxNkIKKworI2RlZmluZSBEUFJDX0NNRElEX0dFVF9DT05ORUNUSU9OCQkweDE2QworCisjZW5kaWYgLyogX0ZTTF9EUFJDX0NNRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWRyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWMwNmNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1kcml2ZXIuYwpAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIEZyZWVzY2FsZSBkYXRhIHBhdGggcmVzb3VyY2UgY29udGFpbmVyIChEUFJDKSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImRwcmMtY21kLmgiCisKK3N0cnVjdCBkcHJjX2NoaWxkX29ianMgeworCWludCBjaGlsZF9jb3VudDsKKwlzdHJ1Y3QgZHByY19vYmpfZGVzYyAqY2hpbGRfYXJyYXk7Cit9OworCitzdGF0aWMgaW50IF9fZnNsX21jX2RldmljZV9yZW1vdmVfaWZfbm90X2luX21jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZHByY19jaGlsZF9vYmpzICpvYmpzOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXY7CisKKwlXQVJOX09OKCFkZXYpOworCVdBUk5fT04oIWRhdGEpOworCW1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKwlvYmpzID0gZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBvYmpzLT5jaGlsZF9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYyA9ICZvYmpzLT5jaGlsZF9hcnJheVtpXTsKKworCQlpZiAoc3RybGVuKG9ial9kZXNjLT50eXBlKSAhPSAwICYmCisJCSAgICBGU0xfTUNfREVWSUNFX01BVENIKG1jX2Rldiwgb2JqX2Rlc2MpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gb2Jqcy0+Y2hpbGRfY291bnQpCisJCWZzbF9tY19kZXZpY2VfcmVtb3ZlKG1jX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2ZzbF9tY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlXQVJOX09OKCFkZXYpOworCVdBUk5fT04oZGF0YSk7CisJZnNsX21jX2RldmljZV9yZW1vdmUodG9fZnNsX21jX2RldmljZShkZXYpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkcHJjX3JlbW92ZV9kZXZpY2VzIC0gUmVtb3ZlcyBkZXZpY2VzIGZvciBvYmplY3RzIHJlbW92ZWQgZnJvbSBhIERQUkMKKyAqCisgKiBAbWNfYnVzX2RldjogcG9pbnRlciB0byB0aGUgZnNsLW1jIGRldmljZSB0aGF0IHJlcHJlc2VudHMgYSBEUFJDIG9iamVjdAorICogQG9ial9kZXNjX2FycmF5OiBhcnJheSBvZiBvYmplY3QgZGVzY3JpcHRvcnMgZm9yIGNoaWxkIG9iamVjdHMgY3VycmVudGx5CisgKiBwcmVzZW50IGluIHRoZSBEUFJDIGluIHRoZSBNQy4KKyAqIEBudW1fY2hpbGRfb2JqZWN0c19pbl9tYzogbnVtYmVyIG9mIGVudHJpZXMgaW4gb2JqX2Rlc2NfYXJyYXkKKyAqCisgKiBTeW5jaHJvbml6ZXMgdGhlIHN0YXRlIG9mIHRoZSBMaW51eCBidXMgZHJpdmVyIHdpdGggdGhlIGFjdHVhbCBzdGF0ZSBvZgorICogdGhlIE1DIGJ5IHJlbW92aW5nIGRldmljZXMgdGhhdCByZXByZXNlbnQgTUMgb2JqZWN0cyB0aGF0IGhhdmUKKyAqIGJlZW4gZHluYW1pY2FsbHkgcmVtb3ZlZCBpbiB0aGUgcGh5c2ljYWwgRFBSQy4KKyAqLworc3RhdGljIHZvaWQgZHByY19yZW1vdmVfZGV2aWNlcyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiwKKwkJCQlzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2NfYXJyYXksCisJCQkJaW50IG51bV9jaGlsZF9vYmplY3RzX2luX21jKQoreworCWlmIChudW1fY2hpbGRfb2JqZWN0c19pbl9tYyAhPSAwKSB7CisJCS8qCisJCSAqIFJlbW92ZSBjaGlsZCBvYmplY3RzIHRoYXQgYXJlIGluIHRoZSBEUFJDIGluIExpbnV4LAorCQkgKiBidXQgbm90IGluIHRoZSBNQzoKKwkJICovCisJCXN0cnVjdCBkcHJjX2NoaWxkX29ianMgb2JqczsKKworCQlvYmpzLmNoaWxkX2NvdW50ID0gbnVtX2NoaWxkX29iamVjdHNfaW5fbWM7CisJCW9ianMuY2hpbGRfYXJyYXkgPSBvYmpfZGVzY19hcnJheTsKKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZtY19idXNfZGV2LT5kZXYsICZvYmpzLAorCQkJCSAgICAgIF9fZnNsX21jX2RldmljZV9yZW1vdmVfaWZfbm90X2luX21jKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgbm8gY2hpbGQgb2JqZWN0cyBmb3IgdGhpcyBEUFJDIGluIHRoZSBNQy4KKwkJICogU28sIHJlbW92ZSBhbGwgdGhlIGNoaWxkIGRldmljZXMgZnJvbSBMaW51eDoKKwkJICovCisJCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmbWNfYnVzX2Rldi0+ZGV2LCBOVUxMLAorCQkJCSAgICAgIF9fZnNsX21jX2RldmljZV9yZW1vdmUpOworCX0KK30KKworc3RhdGljIGludCBfX2ZzbF9tY19kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYyA9IGRhdGE7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKworCXJldHVybiBGU0xfTUNfREVWSUNFX01BVENIKG1jX2Rldiwgb2JqX2Rlc2MpOworfQorCitzdGF0aWMgc3RydWN0IGZzbF9tY19kZXZpY2UgKmZzbF9tY19kZXZpY2VfbG9va3VwKHN0cnVjdCBkcHJjX29ial9kZXNjCisJCQkJCQkJCSpvYmpfZGVzYywKKwkJCQkJCSAgc3RydWN0IGZzbF9tY19kZXZpY2UKKwkJCQkJCQkJKm1jX2J1c19kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJZGV2ID0gZGV2aWNlX2ZpbmRfY2hpbGQoJm1jX2J1c19kZXYtPmRldiwgb2JqX2Rlc2MsCisJCQkJX19mc2xfbWNfZGV2aWNlX21hdGNoKTsKKworCXJldHVybiBkZXYgPyB0b19mc2xfbWNfZGV2aWNlKGRldikgOiBOVUxMOworfQorCisvKioKKyAqIGNoZWNrX3BsdWdnZWRfc3RhdGVfY2hhbmdlIC0gQ2hlY2sgY2hhbmdlIGluIGFuIE1DIG9iamVjdCdzIHBsdWdnZWQgc3RhdGUKKyAqCisgKiBAbWNfZGV2OiBwb2ludGVyIHRvIHRoZSBmc2wtbWMgZGV2aWNlIGZvciBhIGdpdmVuIE1DIG9iamVjdAorICogQG9ial9kZXNjOiBwb2ludGVyIHRvIHRoZSBNQyBvYmplY3QncyBkZXNjcmlwdG9yIGluIHRoZSBNQworICoKKyAqIElmIHRoZSBwbHVnZ2VkIHN0YXRlIGhhcyBjaGFuZ2VkIGZyb20gdW5wbHVnZ2VkIHRvIHBsdWdnZWQsIHRoZSBmc2wtbWMKKyAqIGRldmljZSBpcyBib3VuZCB0byB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZHJpdmVyLgorICogSWYgdGhlIHBsdWdnZWQgc3RhdGUgaGFzIGNoYW5nZWQgZnJvbSBwbHVnZ2VkIHRvIHVucGx1Z2dlZCwgdGhlIGZzbC1tYworICogZGV2aWNlIGlzIHVuYm91bmQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCBjaGVja19wbHVnZ2VkX3N0YXRlX2NoYW5nZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MpCit7CisJaW50IGVycm9yOworCXVpbnQzMl90IHBsdWdnZWRfZmxhZ19hdF9tYyA9CisJCQkob2JqX2Rlc2MtPnN0YXRlICYgRFBSQ19PQkpfU1RBVEVfUExVR0dFRCk7CisKKwlpZiAocGx1Z2dlZF9mbGFnX2F0X21jICE9CisJICAgIChtY19kZXYtPm9ial9kZXNjLnN0YXRlICYgRFBSQ19PQkpfU1RBVEVfUExVR0dFRCkpIHsKKwkJaWYgKHBsdWdnZWRfZmxhZ19hdF9tYykgeworCQkJbWNfZGV2LT5vYmpfZGVzYy5zdGF0ZSB8PSBEUFJDX09CSl9TVEFURV9QTFVHR0VEOworCQkJZXJyb3IgPSBkZXZpY2VfYXR0YWNoKCZtY19kZXYtPmRldik7CisJCQlpZiAoZXJyb3IgPCAwKSB7CisJCQkJZGV2X2VycigmbWNfZGV2LT5kZXYsCisJCQkJCSJkZXZpY2VfYXR0YWNoKCkgZmFpbGVkOiAlZFxuIiwKKwkJCQkJZXJyb3IpOworCQkJfQorCQl9IGVsc2UgeworCQkJbWNfZGV2LT5vYmpfZGVzYy5zdGF0ZSAmPSB+RFBSQ19PQkpfU1RBVEVfUExVR0dFRDsKKwkJCWRldmljZV9yZWxlYXNlX2RyaXZlcigmbWNfZGV2LT5kZXYpOworCQl9CisJfQorfQorCisvKioKKyAqIGRwcmNfYWRkX25ld19kZXZpY2VzIC0gQWRkcyBkZXZpY2VzIHRvIHRoZSBsb2dpY2FsIGJ1cyBmb3IgYSBEUFJDCisgKgorICogQG1jX2J1c19kZXY6IHBvaW50ZXIgdG8gdGhlIGZzbC1tYyBkZXZpY2UgdGhhdCByZXByZXNlbnRzIGEgRFBSQyBvYmplY3QKKyAqIEBvYmpfZGVzY19hcnJheTogYXJyYXkgb2YgZGV2aWNlIGRlc2NyaXB0b3JzIGZvciBjaGlsZCBkZXZpY2VzIGN1cnJlbnRseQorICogcHJlc2VudCBpbiB0aGUgcGh5c2ljYWwgRFBSQy4KKyAqIEBudW1fY2hpbGRfb2JqZWN0c19pbl9tYzogbnVtYmVyIG9mIGVudHJpZXMgaW4gb2JqX2Rlc2NfYXJyYXkKKyAqCisgKiBTeW5jaHJvbml6ZXMgdGhlIHN0YXRlIG9mIHRoZSBMaW51eCBidXMgZHJpdmVyIHdpdGggdGhlIGFjdHVhbAorICogc3RhdGUgb2YgdGhlIE1DIGJ5IGFkZGluZyBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIG5ld2x5IGRpc2NvdmVyZWQKKyAqIGluIHRoZSBwaHlzaWNhbCBEUFJDLgorICovCitzdGF0aWMgdm9pZCBkcHJjX2FkZF9uZXdfZGV2aWNlcyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiwKKwkJCQkgc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjX2FycmF5LAorCQkJCSBpbnQgbnVtX2NoaWxkX29iamVjdHNfaW5fbWMpCit7CisJaW50IGVycm9yOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jaGlsZF9vYmplY3RzX2luX21jOyBpKyspIHsKKwkJc3RydWN0IGZzbF9tY19kZXZpY2UgKmNoaWxkX2RldjsKKwkJc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjID0gJm9ial9kZXNjX2FycmF5W2ldOworCisJCWlmIChzdHJsZW4ob2JqX2Rlc2MtPnR5cGUpID09IDApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBpZiBkZXZpY2UgaXMgYWxyZWFkeSBrbm93biB0byBMaW51eDoKKwkJICovCisJCWNoaWxkX2RldiA9IGZzbF9tY19kZXZpY2VfbG9va3VwKG9ial9kZXNjLCBtY19idXNfZGV2KTsKKwkJaWYgKGNoaWxkX2RldikgeworCQkJY2hlY2tfcGx1Z2dlZF9zdGF0ZV9jaGFuZ2UoY2hpbGRfZGV2LCBvYmpfZGVzYyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVycm9yID0gZnNsX21jX2RldmljZV9hZGQob2JqX2Rlc2MsIE5VTEwsICZtY19idXNfZGV2LT5kZXYsCisJCQkJCSAgJmNoaWxkX2Rldik7CisJCWlmIChlcnJvciA8IDApCisJCQljb250aW51ZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRwcmNfaW5pdF9hbGxfcmVzb3VyY2VfcG9vbHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCit7CisJaW50IHBvb2xfdHlwZTsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKworCWZvciAocG9vbF90eXBlID0gMDsgcG9vbF90eXBlIDwgRlNMX01DX05VTV9QT09MX1RZUEVTOyBwb29sX3R5cGUrKykgeworCQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KKwkJICAgICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07CisKKwkJcmVzX3Bvb2wtPnR5cGUgPSBwb29sX3R5cGU7CisJCXJlc19wb29sLT5tYXhfY291bnQgPSAwOworCQlyZXNfcG9vbC0+ZnJlZV9jb3VudCA9IDA7CisJCXJlc19wb29sLT5tY19idXMgPSBtY19idXM7CisJCUlOSVRfTElTVF9IRUFEKCZyZXNfcG9vbC0+ZnJlZV9saXN0KTsKKwkJbXV0ZXhfaW5pdCgmcmVzX3Bvb2wtPm11dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRwcmNfY2xlYW51cF9yZXNvdXJjZV9wb29sKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2LAorCQkJCSAgICAgICBlbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlKQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKm5leHQ7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbCA9CisJCQkJCSZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07CisJaW50IGZyZWVfY291bnQgPSAwOworCisJV0FSTl9PTihyZXNfcG9vbC0+dHlwZSAhPSBwb29sX3R5cGUpOworCVdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgIT0gcmVzX3Bvb2wtPm1heF9jb3VudCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzb3VyY2UsIG5leHQsICZyZXNfcG9vbC0+ZnJlZV9saXN0LCBub2RlKSB7CisJCWZyZWVfY291bnQrKzsKKwkJV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSByZXNfcG9vbC0+dHlwZSk7CisJCVdBUk5fT04ocmVzb3VyY2UtPnBhcmVudF9wb29sICE9IHJlc19wb29sKTsKKwkJZGV2bV9rZnJlZSgmbWNfYnVzX2Rldi0+ZGV2LCByZXNvdXJjZSk7CisJfQorCisJV0FSTl9PTihmcmVlX2NvdW50ICE9IHJlc19wb29sLT5mcmVlX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgZHByY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKK3sKKwlpbnQgcG9vbF90eXBlOworCisJZm9yIChwb29sX3R5cGUgPSAwOyBwb29sX3R5cGUgPCBGU0xfTUNfTlVNX1BPT0xfVFlQRVM7IHBvb2xfdHlwZSsrKQorCQlkcHJjX2NsZWFudXBfcmVzb3VyY2VfcG9vbChtY19idXNfZGV2LCBwb29sX3R5cGUpOworfQorCisvKioKKyAqIGRwcmNfc2Nhbl9vYmplY3RzIC0gRGlzY292ZXIgb2JqZWN0cyBpbiBhIERQUkMKKyAqCisgKiBAbWNfYnVzX2RldjogcG9pbnRlciB0byB0aGUgZnNsLW1jIGRldmljZSB0aGF0IHJlcHJlc2VudHMgYSBEUFJDIG9iamVjdAorICoKKyAqIERldGVjdHMgb2JqZWN0cyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIGEgRFBSQyBhbmQgc3luY2hyb25pemVzIHRoZQorICogc3RhdGUgb2YgdGhlIExpbnV4IGJ1cyBkcml2ZXIsIE1DIGJ5IGFkZGluZyBhbmQgcmVtb3ZpbmcKKyAqIGRldmljZXMgYWNjb3JkaW5nbHkuCisgKiBUd28gdHlwZXMgb2YgZGV2aWNlcyBjYW4gYmUgZm91bmQgaW4gYSBEUFJDOiBhbGxvY2F0YWJsZSBvYmplY3RzIChlLmcuLAorICogZHBicCwgZHBtY3ApIGFuZCBub24tYWxsb2NhdGFibGUgZGV2aWNlcyAoZS5nLiwgZHByYywgZHBuaSkuCisgKiBBbGwgYWxsb2NhdGFibGUgZGV2aWNlcyBuZWVkZWQgdG8gYmUgcHJvYmVkIGJlZm9yZSBhbGwgbm9uLWFsbG9jYXRhYmxlCisgKiBkZXZpY2VzLCB0byBlbnN1cmUgdGhhdCBkZXZpY2UgZHJpdmVycyBmb3Igbm9uLWFsbG9jYXRhYmxlCisgKiBkZXZpY2VzIGNhbiBhbGxvY2F0ZSBhbnkgdHlwZSBvZiBhbGxvY2F0YWJsZSBkZXZpY2VzLgorICogVGhhdCBpcywgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBwb29scyBhcmUKKyAqIHBvcHVsYXRlZCBiZWZvcmUgdGhleSBjYW4gZ2V0IGFsbG9jYXRpb24gcmVxdWVzdHMgZnJvbSBwcm9iZSBjYWxsYmFja3MKKyAqIG9mIHRoZSBkZXZpY2UgZHJpdmVycyBmb3IgdGhlIG5vbi1hbGxvY2F0YWJsZSBkZXZpY2VzLgorICovCitpbnQgZHByY19zY2FuX29iamVjdHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCit7CisJaW50IG51bV9jaGlsZF9vYmplY3RzOworCWludCBkcHJjX2dldF9vYmpfZmFpbHVyZXM7CisJaW50IGVycm9yOworCXN0cnVjdCBkcHJjX29ial9kZXNjICpjaGlsZF9vYmpfZGVzY19hcnJheSA9IE5VTEw7CisKKwllcnJvciA9IGRwcmNfZ2V0X29ial9jb3VudChtY19idXNfZGV2LT5tY19pbywKKwkJCQkgICBtY19idXNfZGV2LT5tY19oYW5kbGUsCisJCQkJICAgJm51bV9jaGlsZF9vYmplY3RzKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJm1jX2J1c19kZXYtPmRldiwgImRwcmNfZ2V0X29ial9jb3VudCgpIGZhaWxlZDogJWRcbiIsCisJCQllcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpZiAobnVtX2NoaWxkX29iamVjdHMgIT0gMCkgeworCQlpbnQgaTsKKworCQljaGlsZF9vYmpfZGVzY19hcnJheSA9CisJCSAgICBkZXZtX2ttYWxsb2NfYXJyYXkoJm1jX2J1c19kZXYtPmRldiwgbnVtX2NoaWxkX29iamVjdHMsCisJCQkJICAgICAgIHNpemVvZigqY2hpbGRfb2JqX2Rlc2NfYXJyYXkpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjaGlsZF9vYmpfZGVzY19hcnJheSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qCisJCSAqIERpc2NvdmVyIG9iamVjdHMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHBoeXNpY2FsIERQUkM6CisJCSAqLworCQlkcHJjX2dldF9vYmpfZmFpbHVyZXMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoaWxkX29iamVjdHM7IGkrKykgeworCQkJc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjID0KKwkJCSAgICAmY2hpbGRfb2JqX2Rlc2NfYXJyYXlbaV07CisKKwkJCWVycm9yID0gZHByY19nZXRfb2JqKG1jX2J1c19kZXYtPm1jX2lvLAorCQkJCQkgICAgIG1jX2J1c19kZXYtPm1jX2hhbmRsZSwKKwkJCQkJICAgICBpLCBvYmpfZGVzYyk7CisJCQlpZiAoZXJyb3IgPCAwKSB7CisJCQkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LAorCQkJCQkiZHByY19nZXRfb2JqKGk9JWQpIGZhaWxlZDogJWRcbiIsCisJCQkJCWksIGVycm9yKTsKKwkJCQkvKgorCQkJCSAqIE1hcmsgdGhlIG9iaiBlbnRyeSBhcyAiaW52YWxpZCIsIGJ5IHVzaW5nIHRoZQorCQkJCSAqIGVtcHR5IHN0cmluZyBhcyBvYmogdHlwZToKKwkJCQkgKi8KKwkJCQlvYmpfZGVzYy0+dHlwZVswXSA9ICdcMCc7CisJCQkJb2JqX2Rlc2MtPmlkID0gZXJyb3I7CisJCQkJZHByY19nZXRfb2JqX2ZhaWx1cmVzKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWRldl9kYmcoJm1jX2J1c19kZXYtPmRldiwKKwkJCQkiRGlzY292ZXJlZCBvYmplY3Q6IHR5cGUgJXMsIGlkICVkXG4iLAorCQkJCW9ial9kZXNjLT50eXBlLCBvYmpfZGVzYy0+aWQpOworCQl9CisKKwkJaWYgKGRwcmNfZ2V0X29ial9mYWlsdXJlcyAhPSAwKSB7CisJCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCisJCQkJIiVkIG91dCBvZiAlZCBkZXZpY2VzIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWRcbiIsCisJCQkJZHByY19nZXRfb2JqX2ZhaWx1cmVzLCBudW1fY2hpbGRfb2JqZWN0cyk7CisJCX0KKwl9CisKKwlkcHJjX3JlbW92ZV9kZXZpY2VzKG1jX2J1c19kZXYsIGNoaWxkX29ial9kZXNjX2FycmF5LAorCQkJICAgIG51bV9jaGlsZF9vYmplY3RzKTsKKworCWRwcmNfYWRkX25ld19kZXZpY2VzKG1jX2J1c19kZXYsIGNoaWxkX29ial9kZXNjX2FycmF5LAorCQkJICAgICBudW1fY2hpbGRfb2JqZWN0cyk7CisKKwlpZiAoY2hpbGRfb2JqX2Rlc2NfYXJyYXkpCisJCWRldm1fa2ZyZWUoJm1jX2J1c19kZXYtPmRldiwgY2hpbGRfb2JqX2Rlc2NfYXJyYXkpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkcHJjX3NjYW5fb2JqZWN0cyk7CisKKy8qKgorICogZHByY19zY2FuX2NvbnRhaW5lciAtIFNjYW5zIGEgcGh5c2ljYWwgRFBSQyBhbmQgc3luY2hyb25pemVzIExpbnV4IGJ1cyBzdGF0ZQorICoKKyAqIEBtY19idXNfZGV2OiBwb2ludGVyIHRvIHRoZSBmc2wtbWMgZGV2aWNlIHRoYXQgcmVwcmVzZW50cyBhIERQUkMgb2JqZWN0CisgKgorICogU2NhbnMgdGhlIHBoeXNpY2FsIERQUkMgYW5kIHN5bmNocm9uaXplcyB0aGUgc3RhdGUgb2YgdGhlIExpbnV4CisgKiBidXMgZHJpdmVyIHdpdGggdGhlIGFjdHVhbCBzdGF0ZSBvZiB0aGUgTUMgYnkgYWRkaW5nIGFuZCByZW1vdmluZworICogZGV2aWNlcyBhcyBhcHByb3ByaWF0ZS4KKyAqLworaW50IGRwcmNfc2Nhbl9jb250YWluZXIoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOworCisJZHByY19pbml0X2FsbF9yZXNvdXJjZV9wb29scyhtY19idXNfZGV2KTsKKworCS8qCisJICogRGlzY292ZXIgb2JqZWN0cyBpbiB0aGUgRFBSQzoKKwkgKi8KKwltdXRleF9sb2NrKCZtY19idXMtPnNjYW5fbXV0ZXgpOworCWVycm9yID0gZHByY19zY2FuX29iamVjdHMobWNfYnVzX2Rldik7CisJbXV0ZXhfdW5sb2NrKCZtY19idXMtPnNjYW5fbXV0ZXgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWRwcmNfY2xlYW51cF9hbGxfcmVzb3VyY2VfcG9vbHMobWNfYnVzX2Rldik7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZHByY19zY2FuX2NvbnRhaW5lcik7CisKKy8qKgorICogZHByY19wcm9iZSAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhIERQUkMgaXMgYmVpbmcgYm91bmQgdG8gdGhpcyBkcml2ZXIKKyAqCisgKiBAbWNfZGV2OiBQb2ludGVyIHRvIGZzbC1tYyBkZXZpY2UgcmVwcmVzZW50aW5nIGEgRFBSQworICoKKyAqIEl0IG9wZW5zIHRoZSBwaHlzaWNhbCBEUFJDIGluIHRoZSBNQy4KKyAqIEl0IHNjYW5zIHRoZSBEUFJDIHRvIGRpc2NvdmVyIHRoZSBNQyBvYmplY3RzIGNvbnRhaW5lZCBpbiBpdC4KKyAqIEl0IGNyZWF0ZXMgdGhlIGludGVycnVwdCBwb29sIGZvciB0aGUgTUMgYnVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRFBSQy4KKyAqIEl0IGNvbmZpZ3VyZXMgdGhlIGludGVycnVwdHMgZm9yIHRoZSBEUFJDIGRldmljZSBpdHNlbGYuCisgKi8KK3N0YXRpYyBpbnQgZHByY19wcm9iZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCWludCBlcnJvcjsKKwlzaXplX3QgcmVnaW9uX3NpemU7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfZGV2KTsKKworCWlmIChXQVJOX09OKHN0cmNtcChtY19kZXYtPm9ial9kZXNjLnR5cGUsICJkcHJjIikgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFtY19kZXYtPm1jX2lvKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSBjaGlsZCBEUFJDOgorCQkgKi8KKwkJaWYgKFdBUk5fT04obWNfZGV2LT5vYmpfZGVzYy5yZWdpb25fY291bnQgPT0gMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZWdpb25fc2l6ZSA9IG1jX2Rldi0+cmVnaW9uc1swXS5lbmQgLQorCQkJICAgICAgbWNfZGV2LT5yZWdpb25zWzBdLnN0YXJ0ICsgMTsKKworCQllcnJvciA9IGZzbF9jcmVhdGVfbWNfaW8oJm1jX2Rldi0+ZGV2LAorCQkJCQkgbWNfZGV2LT5yZWdpb25zWzBdLnN0YXJ0LAorCQkJCQkgcmVnaW9uX3NpemUsCisJCQkJCSBOVUxMLCAwLCAmbWNfZGV2LT5tY19pbyk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBkcHJjX29wZW4obWNfZGV2LT5tY19pbywgbWNfZGV2LT5vYmpfZGVzYy5pZCwKKwkJCSAgJm1jX2Rldi0+bWNfaGFuZGxlKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJm1jX2Rldi0+ZGV2LCAiZHByY19vcGVuKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87CisJfQorCisJbXV0ZXhfaW5pdCgmbWNfYnVzLT5zY2FuX211dGV4KTsKKworCS8qCisJICogRGlzY292ZXIgTUMgb2JqZWN0cyBpbiBEUFJDIG9iamVjdDoKKwkgKi8KKwllcnJvciA9IGRwcmNfc2Nhbl9jb250YWluZXIobWNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfb3BlbjsKKworCWRldl9pbmZvKCZtY19kZXYtPmRldiwgIkRQUkMgZGV2aWNlIGJvdW5kIHRvIGRyaXZlciIpOworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX29wZW46CisJKHZvaWQpZHByY19jbG9zZShtY19kZXYtPm1jX2lvLCBtY19kZXYtPm1jX2hhbmRsZSk7CisKK2Vycm9yX2NsZWFudXBfbWNfaW86CisJZnNsX2Rlc3Ryb3lfbWNfaW8obWNfZGV2LT5tY19pbyk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGRwcmNfcmVtb3ZlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgRFBSQyBpcyBiZWluZyB1bmJvdW5kIGZyb20gdGhpcyBkcml2ZXIKKyAqCisgKiBAbWNfZGV2OiBQb2ludGVyIHRvIGZzbC1tYyBkZXZpY2UgcmVwcmVzZW50aW5nIHRoZSBEUFJDCisgKgorICogSXQgcmVtb3ZlcyB0aGUgRFBSQydzIGNoaWxkIG9iamVjdHMgZnJvbSBMaW51eCAobm90IGZyb20gdGhlIE1DKSBhbmQKKyAqIGNsb3NlcyB0aGUgRFBSQyBkZXZpY2UgaW4gdGhlIE1DLgorICogSXQgdGVhcnMgZG93biB0aGUgaW50ZXJydXB0cyB0aGF0IHdlcmUgY29uZmlndXJlZCBmb3IgdGhlIERQUkMgZGV2aWNlLgorICogSXQgZGVzdHJveXMgdGhlIGludGVycnVwdCBwb29sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1DIGJ1cy4KKyAqLworc3RhdGljIGludCBkcHJjX3JlbW92ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCWludCBlcnJvcjsKKworCWlmIChXQVJOX09OKHN0cmNtcChtY19kZXYtPm9ial9kZXNjLnR5cGUsICJkcHJjIikgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChXQVJOX09OKCFtY19kZXYtPm1jX2lvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJm1jX2Rldi0+ZGV2LCBOVUxMLCBfX2ZzbF9tY19kZXZpY2VfcmVtb3ZlKTsKKwlkcHJjX2NsZWFudXBfYWxsX3Jlc291cmNlX3Bvb2xzKG1jX2Rldik7CisJZXJyb3IgPSBkcHJjX2Nsb3NlKG1jX2Rldi0+bWNfaW8sIG1jX2Rldi0+bWNfaGFuZGxlKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlkZXZfZXJyKCZtY19kZXYtPmRldiwgImRwcmNfY2xvc2UoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisKKwlkZXZfaW5mbygmbWNfZGV2LT5kZXYsICJEUFJDIGRldmljZSB1bmJvdW5kIGZyb20gZHJpdmVyIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnNsX21jX2RldmljZV9tYXRjaF9pZCBtYXRjaF9pZF90YWJsZVtdID0geworCXsKKwkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAorCSAub2JqX3R5cGUgPSAiZHByYyIsCisJIC52ZXJfbWFqb3IgPSBEUFJDX1ZFUl9NQUpPUiwKKwkgLnZlcl9taW5vciA9IERQUkNfVkVSX01JTk9SfSwKKwl7LnZlbmRvciA9IDB4MH0sCit9OworCitzdGF0aWMgc3RydWN0IGZzbF9tY19kcml2ZXIgZHByY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSBGU0xfTUNfRFBSQ19EUklWRVJfTkFNRSwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5wbSA9IE5VTEwsCisJCSAgIH0sCisJLm1hdGNoX2lkX3RhYmxlID0gbWF0Y2hfaWRfdGFibGUsCisJLnByb2JlID0gZHByY19wcm9iZSwKKwkucmVtb3ZlID0gZHByY19yZW1vdmUsCit9OworCitpbnQgX19pbml0IGRwcmNfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZnNsX21jX2RyaXZlcl9yZWdpc3RlcigmZHByY19kcml2ZXIpOworfQorCit2b2lkIF9fZXhpdCBkcHJjX2RyaXZlcl9leGl0KHZvaWQpCit7CisJZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKCZkcHJjX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliMjZlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMuYwpAQCAtMCwwICsxLDkxMyBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKgorKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisqIGxhdGVyIHZlcnNpb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcHJjLmgiCisjaW5jbHVkZSAiZHByYy1jbWQuaCIKKworaW50IGRwcmNfb3BlbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgaW50IGNvbnRhaW5lcl9pZCwgdWludDE2X3QgKnRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9PUEVOLCBNQ19DTURfUFJJX0xPVywKKwkJCQkJICAwKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgY29udGFpbmVyX2lkKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSp0b2tlbiA9IE1DX0NNRF9IRFJfUkVBRF9UT0tFTihjbWQuaGVhZGVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcHJjX29wZW4pOworCitpbnQgZHByY19jbG9zZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9DTE9TRSwgTUNfQ01EX1BSSV9ISUdILAorCQkJCQkgIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CitFWFBPUlRfU1lNQk9MKGRwcmNfY2xvc2UpOworCitpbnQgZHByY19jcmVhdGVfY29udGFpbmVyKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJICB1aW50MTZfdCB0b2tlbiwKKwkJCSAgc3RydWN0IGRwcmNfY2ZnICpjZmcsCisJCQkgIGludCAqY2hpbGRfY29udGFpbmVyX2lkLAorCQkJICB1aW50NjRfdCAqY2hpbGRfcG9ydGFsX3BhZGRyKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgMTYsIGNmZy0+aWNpZCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGNmZy0+b3B0aW9ucyk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDMyLCBjZmctPnBvcnRhbF9pZCk7CisKKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9DUkVBVEVfQ09OVCwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKmNoaWxkX2NvbnRhaW5lcl9pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAwLCAzMik7CisJKmNoaWxkX3BvcnRhbF9wYWRkciA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCAwLCA2NCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwcmNfZGVzdHJveV9jb250YWluZXIoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgICB1aW50MTZfdCB0b2tlbiwKKwkJCSAgIGludCBjaGlsZF9jb250YWluZXJfaWQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9ERVNUUk9ZX0NPTlQsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgY2hpbGRfY29udGFpbmVyX2lkKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcHJjX3Jlc2V0X2NvbnRhaW5lcihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSB1aW50MTZfdCB0b2tlbiwKKwkJCSBpbnQgY2hpbGRfY29udGFpbmVyX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfUkVTRVRfQ09OVCwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBjaGlsZF9jb250YWluZXJfaWQpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwcmNfZ2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJIHVpbnQxNl90IHRva2VuLAorCQkgdWludDhfdCBpcnFfaW5kZXgsCisJCSBpbnQgKnR5cGUsCisJCSB1aW50NjRfdCAqaXJxX3BhZGRyLAorCQkgdWludDMyX3QgKmlycV92YWwsCisJCSBpbnQgKnVzZXJfaXJxX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfSVJRLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSppcnFfdmFsID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwkqaXJxX3BhZGRyID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDY0KTsKKwkqdXNlcl9pcnFfaWQgPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMCwgMzIpOworCSp0eXBlID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDMyLCAzMik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwcmNfc2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJIHVpbnQxNl90IHRva2VuLAorCQkgdWludDhfdCBpcnFfaW5kZXgsCisJCSB1aW50NjRfdCBpcnFfcGFkZHIsCisJCSB1aW50MzJfdCBpcnFfdmFsLAorCQkgaW50IHVzZXJfaXJxX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfU0VUX0lSUSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywKKwkJCQkJICB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGlycV92YWwpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDY0LCBpcnFfcGFkZHIpOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDMyLCB1c2VyX2lycV9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY19nZXRfaXJxX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50OF90ICplbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX0lSUV9FTkFCTEUsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSplbiA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCA4KTsKKworCXJldHVybiAwOworfQorCitpbnQgZHByY19zZXRfaXJxX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50OF90IGVuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfU0VUX0lSUV9FTkFCTEUsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCA4LCBlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY19nZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgIHVpbnQxNl90IHRva2VuLAorCQkgICAgICB1aW50OF90IGlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QgKm1hc2spCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9JUlFfTUFTSywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKm1hc2sgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcHJjX3NldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdCBtYXNrKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfU0VUX0lSUV9NQVNLLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIG1hc2spOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwcmNfZ2V0X2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQl1aW50MTZfdCB0b2tlbiwKKwkJCXVpbnQ4X3QgaXJxX2luZGV4LAorCQkJdWludDMyX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX0lSUV9TVEFUVVMsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSpzdGF0dXMgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcHJjX2NsZWFyX2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgIHVpbnQxNl90IHRva2VuLAorCQkJICB1aW50OF90IGlycV9pbmRleCwKKwkJCSAgdWludDMyX3Qgc3RhdHVzKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfQ0xFQVJfSVJRX1NUQVRVUywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBzdGF0dXMpOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwcmNfZ2V0X2F0dHJpYnV0ZXMoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQl1aW50MTZfdCB0b2tlbiwKKwkJCXN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgKmF0dHIpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9BVFRSLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCWF0dHItPmNvbnRhaW5lcl9pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisJYXR0ci0+aWNpZCA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAzMiwgMTYpOworCWF0dHItPm9wdGlvbnMgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgMzIpOworCWF0dHItPnBvcnRhbF9pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAzMiwgMzIpOworCWF0dHItPnZlcnNpb24ubWFqb3IgPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMCwgMTYpOworCWF0dHItPnZlcnNpb24ubWlub3IgPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMTYsIDE2KTsKKworCXJldHVybiAwOworfQorCitpbnQgZHByY19zZXRfcmVzX3F1b3RhKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgICBpbnQgY2hpbGRfY29udGFpbmVyX2lkLAorCQkgICAgICAgY2hhciAqdHlwZSwKKwkJICAgICAgIHVpbnQxNl90IHF1b3RhKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfU0VUX1JFU19RVU9UQSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBjaGlsZF9jb250YWluZXJfaWQpOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCAxNiwgcXVvdGEpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDgsIHR5cGVbMF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDgsIDgsIHR5cGVbMV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzJdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygyNCwgOCwgdHlwZVszXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDgsIHR5cGVbNF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzVdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg0OCwgOCwgdHlwZVs2XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNTYsIDgsIHR5cGVbN10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIHR5cGVbOF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIHR5cGVbOV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzEwXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMjQsIDgsIHR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygzMiwgOCwgdHlwZVsxMl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzEzXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDgsIDgsIHR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg1NiwgOCwgJ1wwJyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY19nZXRfcmVzX3F1b3RhKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgICBpbnQgY2hpbGRfY29udGFpbmVyX2lkLAorCQkgICAgICAgY2hhciAqdHlwZSwKKwkJICAgICAgIHVpbnQxNl90ICpxdW90YSkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX1JFU19RVU9UQSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBjaGlsZF9jb250YWluZXJfaWQpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDgsIHR5cGVbMF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDgsIDgsIHR5cGVbMV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzJdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygyNCwgOCwgdHlwZVszXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDgsIHR5cGVbNF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzVdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg0OCwgOCwgdHlwZVs2XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNTYsIDgsIHR5cGVbN10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIHR5cGVbOF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIHR5cGVbOV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzEwXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMjQsIDgsIHR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygzMiwgOCwgdHlwZVsxMl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzEzXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDgsIDgsIHR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg1NiwgOCwgJ1wwJyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqcXVvdGEgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMzIsIDE2KTsKKworCXJldHVybiAwOworfQorCitpbnQgZHByY19hc3NpZ24oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCXVpbnQxNl90IHRva2VuLAorCQlpbnQgY29udGFpbmVyX2lkLAorCQlzdHJ1Y3QgZHByY19yZXNfcmVxICpyZXNfcmVxKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfQVNTSUdOLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGNvbnRhaW5lcl9pZCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDMyLCByZXNfcmVxLT5vcHRpb25zKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygwLCAzMiwgcmVzX3JlcS0+bnVtKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygzMiwgMzIsIHJlc19yZXEtPmlkX2Jhc2VfYWxpZ24pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIHJlc19yZXEtPnR5cGVbMF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIHJlc19yZXEtPnR5cGVbMV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCByZXNfcmVxLT50eXBlWzJdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgcmVzX3JlcS0+dHlwZVszXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMzIsIDgsIHJlc19yZXEtPnR5cGVbNF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCByZXNfcmVxLT50eXBlWzVdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgcmVzX3JlcS0+dHlwZVs2XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNTYsIDgsIHJlc19yZXEtPnR5cGVbN10pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDAsIDgsIHJlc19yZXEtPnR5cGVbOF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDgsIDgsIHJlc19yZXEtPnR5cGVbOV0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDE2LCA4LCByZXNfcmVxLT50eXBlWzEwXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMjQsIDgsIHJlc19yZXEtPnR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygzMiwgOCwgcmVzX3JlcS0+dHlwZVsxMl0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQwLCA4LCByZXNfcmVxLT50eXBlWzEzXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNDgsIDgsIHJlc19yZXEtPnR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg1NiwgOCwgcmVzX3JlcS0+dHlwZVsxNV0pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwcmNfdW5hc3NpZ24oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgdWludDE2X3QgdG9rZW4sCisJCSAgaW50IGNoaWxkX2NvbnRhaW5lcl9pZCwKKwkJICBzdHJ1Y3QgZHByY19yZXNfcmVxICpyZXNfcmVxKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfVU5BU1NJR04sCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csCisJCQkJCSAgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBjaGlsZF9jb250YWluZXJfaWQpOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCAzMiwgcmVzX3JlcS0+b3B0aW9ucyk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgMzIsIHJlc19yZXEtPm51bSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDMyLCByZXNfcmVxLT5pZF9iYXNlX2FsaWduKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygwLCA4LCByZXNfcmVxLT50eXBlWzBdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg4LCA4LCByZXNfcmVxLT50eXBlWzFdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygxNiwgOCwgcmVzX3JlcS0+dHlwZVsyXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMjQsIDgsIHJlc19yZXEtPnR5cGVbM10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDMyLCA4LCByZXNfcmVxLT50eXBlWzRdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0MCwgOCwgcmVzX3JlcS0+dHlwZVs1XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDgsIDgsIHJlc19yZXEtPnR5cGVbNl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDU2LCA4LCByZXNfcmVxLT50eXBlWzddKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygwLCA4LCByZXNfcmVxLT50eXBlWzhdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg4LCA4LCByZXNfcmVxLT50eXBlWzldKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygxNiwgOCwgcmVzX3JlcS0+dHlwZVsxMF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDI0LCA4LCByZXNfcmVxLT50eXBlWzExXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMzIsIDgsIHJlc19yZXEtPnR5cGVbMTJdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg0MCwgOCwgcmVzX3JlcS0+dHlwZVsxM10pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQ4LCA4LCByZXNfcmVxLT50eXBlWzE0XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNTYsIDgsIHJlc19yZXEtPnR5cGVbMTVdKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcHJjX2dldF9wb29sX2NvdW50KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQlpbnQgKnBvb2xfY291bnQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9QT09MX0NPVU5ULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqcG9vbF9jb3VudCA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwcmNfZ2V0X3Bvb2woc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgdWludDE2X3QgdG9rZW4sCisJCSAgaW50IHBvb2xfaW5kZXgsCisJCSAgY2hhciAqdHlwZSkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX1BPT0wsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csCisJCQkJCSAgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBwb29sX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCXR5cGVbMF0gPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgOCk7CisJdHlwZVsxXSA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCA4LCA4KTsKKwl0eXBlWzJdID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDE2LCA4KTsKKwl0eXBlWzNdID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDI0LCA4KTsKKwl0eXBlWzRdID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDMyLCA4KTsKKwl0eXBlWzVdID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDQwLCA4KTsKKwl0eXBlWzZdID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDQ4LCA4KTsKKwl0eXBlWzddID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDU2LCA4KTsKKwl0eXBlWzhdID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDAsIDgpOworCXR5cGVbOV0gPSBtY19kZWMoY21kLnBhcmFtc1syXSwgOCwgOCk7CisJdHlwZVsxMF0gPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMTYsIDgpOworCXR5cGVbMTFdID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDI0LCA4KTsKKwl0eXBlWzEyXSA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCAzMiwgOCk7CisJdHlwZVsxM10gPSBtY19kZWMoY21kLnBhcmFtc1syXSwgNDAsIDgpOworCXR5cGVbMTRdID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDQ4LCA4KTsKKwl0eXBlWzE1XSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwcmNfZ2V0X29ial9jb3VudChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4sIGludCAqb2JqX2NvdW50KQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfT0JKX0NPVU5ULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqb2JqX2NvdW50ID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDMyLCAzMik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHByY19nZXRfb2JqX2NvdW50KTsKKworaW50IGRwcmNfZ2V0X29iaihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJIHVpbnQxNl90IHRva2VuLAorCQkgaW50IG9ial9pbmRleCwKKwkJIHN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX09CSiwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywKKwkJCQkJICB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIG9ial9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwlvYmpfZGVzYy0+aWQgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMzIsIDMyKTsKKwlvYmpfZGVzYy0+dmVuZG9yID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDE2KTsKKwlvYmpfZGVzYy0+aXJxX2NvdW50ID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDE2LCA4KTsKKwlvYmpfZGVzYy0+cmVnaW9uX2NvdW50ID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDI0LCA4KTsKKwlvYmpfZGVzYy0+c3RhdGUgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMzIsIDMyKTsKKwlvYmpfZGVzYy0+dmVyX21ham9yID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDAsIDE2KTsKKwlvYmpfZGVzYy0+dmVyX21pbm9yID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDE2LCAxNik7CisJb2JqX2Rlc2MtPnR5cGVbMF0gPSBtY19kZWMoY21kLnBhcmFtc1szXSwgMCwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbMV0gPSBtY19kZWMoY21kLnBhcmFtc1szXSwgOCwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbMl0gPSBtY19kZWMoY21kLnBhcmFtc1szXSwgMTYsIDgpOworCW9ial9kZXNjLT50eXBlWzNdID0gbWNfZGVjKGNtZC5wYXJhbXNbM10sIDI0LCA4KTsKKwlvYmpfZGVzYy0+dHlwZVs0XSA9IG1jX2RlYyhjbWQucGFyYW1zWzNdLCAzMiwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbNV0gPSBtY19kZWMoY21kLnBhcmFtc1szXSwgNDAsIDgpOworCW9ial9kZXNjLT50eXBlWzZdID0gbWNfZGVjKGNtZC5wYXJhbXNbM10sIDQ4LCA4KTsKKwlvYmpfZGVzYy0+dHlwZVs3XSA9IG1jX2RlYyhjbWQucGFyYW1zWzNdLCA1NiwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbOF0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgMCwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbOV0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgOCwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbMTBdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDE2LCA4KTsKKwlvYmpfZGVzYy0+dHlwZVsxMV0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgMjQsIDgpOworCW9ial9kZXNjLT50eXBlWzEyXSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCAzMiwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbMTNdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDQwLCA4KTsKKwlvYmpfZGVzYy0+dHlwZVsxNF0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgNDgsIDgpOworCW9ial9kZXNjLT50eXBlWzE1XSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHByY19nZXRfb2JqKTsKKworaW50IGRwcmNfZ2V0X3Jlc19jb3VudChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgIHVpbnQxNl90IHRva2VuLAorCQkgICAgICAgY2hhciAqdHlwZSwKKwkJICAgICAgIGludCAqcmVzX2NvdW50KQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkqcmVzX2NvdW50ID0gMDsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9SRVNfQ09VTlQsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygwLCA4LCB0eXBlWzBdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg4LCA4LCB0eXBlWzFdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygxNiwgOCwgdHlwZVsyXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMjQsIDgsIHR5cGVbM10pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDMyLCA4LCB0eXBlWzRdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg0MCwgOCwgdHlwZVs1XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNDgsIDgsIHR5cGVbNl0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDU2LCA4LCB0eXBlWzddKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygwLCA4LCB0eXBlWzhdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg4LCA4LCB0eXBlWzldKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygxNiwgOCwgdHlwZVsxMF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDI0LCA4LCB0eXBlWzExXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMzIsIDgsIHR5cGVbMTJdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0MCwgOCwgdHlwZVsxM10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQ4LCA4LCB0eXBlWzE0XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNTYsIDgsICdcMCcpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKnJlc19jb3VudCA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHByY19nZXRfcmVzX2NvdW50KTsKKworaW50IGRwcmNfZ2V0X3Jlc19pZHMoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgY2hhciAqdHlwZSwKKwkJICAgICBzdHJ1Y3QgZHByY19yZXNfaWRzX3JhbmdlX2Rlc2MgKnJhbmdlX2Rlc2MpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9SRVNfSURTLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoNDIsIDcsIHJhbmdlX2Rlc2MtPml0ZXJfc3RhdHVzKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygwLCAzMiwgcmFuZ2VfZGVzYy0+YmFzZV9pZCk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDMyLCByYW5nZV9kZXNjLT5sYXN0X2lkKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygwLCA4LCB0eXBlWzBdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg4LCA4LCB0eXBlWzFdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygxNiwgOCwgdHlwZVsyXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMjQsIDgsIHR5cGVbM10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDMyLCA4LCB0eXBlWzRdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0MCwgOCwgdHlwZVs1XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDgsIDgsIHR5cGVbNl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDU2LCA4LCB0eXBlWzddKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygwLCA4LCB0eXBlWzhdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg4LCA4LCB0eXBlWzldKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygxNiwgOCwgdHlwZVsxMF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDI0LCA4LCB0eXBlWzExXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMzIsIDgsIHR5cGVbMTJdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg0MCwgOCwgdHlwZVsxM10pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQ4LCA4LCB0eXBlWzE0XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNTYsIDgsICdcMCcpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJcmFuZ2VfZGVzYy0+aXRlcl9zdGF0dXMgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgNDIsIDcpOworCXJhbmdlX2Rlc2MtPmJhc2VfaWQgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgMzIpOworCXJhbmdlX2Rlc2MtPmxhc3RfaWQgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMzIsIDMyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcHJjX2dldF9yZXNfaWRzKTsKKworaW50IGRwcmNfZ2V0X3BvcnRhbF9wYWRkcihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSAgdWludDE2X3QgdG9rZW4sCisJCQkgIGludCBwb3J0YWxfaWQsCisJCQkgIHVpbnQ2NF90ICpwb3J0YWxfYWRkcikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX1BPUlRBTF9QQUREUiwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBwb3J0YWxfaWQpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKnBvcnRhbF9hZGRyID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDY0KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcHJjX2dldF9wb3J0YWxfcGFkZHIpOworCitpbnQgZHByY19nZXRfb2JqX3JlZ2lvbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJY2hhciAqb2JqX3R5cGUsCisJCQlpbnQgb2JqX2lkLAorCQkJdWludDhfdCByZWdpb25faW5kZXgsCisJCQlzdHJ1Y3QgZHByY19yZWdpb25fZGVzYyAqcmVnaW9uX2Rlc2MpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9PQkpfUkVHLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIG9ial9pZCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoNDgsIDgsIHJlZ2lvbl9pbmRleCk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMCwgOCwgb2JqX3R5cGVbMF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDgsIDgsIG9ial90eXBlWzFdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygxNiwgOCwgb2JqX3R5cGVbMl0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDI0LCA4LCBvYmpfdHlwZVszXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMzIsIDgsIG9ial90eXBlWzRdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg0MCwgOCwgb2JqX3R5cGVbNV0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQ4LCA4LCBvYmpfdHlwZVs2XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNTYsIDgsIG9ial90eXBlWzddKTsKKwljbWQucGFyYW1zWzRdIHw9IG1jX2VuYygwLCA4LCBvYmpfdHlwZVs4XSk7CisJY21kLnBhcmFtc1s0XSB8PSBtY19lbmMoOCwgOCwgb2JqX3R5cGVbOV0pOworCWNtZC5wYXJhbXNbNF0gfD0gbWNfZW5jKDE2LCA4LCBvYmpfdHlwZVsxMF0pOworCWNtZC5wYXJhbXNbNF0gfD0gbWNfZW5jKDI0LCA4LCBvYmpfdHlwZVsxMV0pOworCWNtZC5wYXJhbXNbNF0gfD0gbWNfZW5jKDMyLCA4LCBvYmpfdHlwZVsxMl0pOworCWNtZC5wYXJhbXNbNF0gfD0gbWNfZW5jKDQwLCA4LCBvYmpfdHlwZVsxM10pOworCWNtZC5wYXJhbXNbNF0gfD0gbWNfZW5jKDQ4LCA4LCBvYmpfdHlwZVsxNF0pOworCWNtZC5wYXJhbXNbNF0gfD0gbWNfZW5jKDU2LCA4LCAnXDAnKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCXJlZ2lvbl9kZXNjLT5iYXNlX3BhZGRyID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDY0KTsKKwlyZWdpb25fZGVzYy0+c2l6ZSA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHByY19nZXRfb2JqX3JlZ2lvbik7CisKK2ludCBkcHJjX2Nvbm5lY3Qoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSB1aW50MTZfdCB0b2tlbiwKKwkJIGNvbnN0IHN0cnVjdCBkcHJjX2VuZHBvaW50ICplbmRwb2ludDEsCisJCSBjb25zdCBzdHJ1Y3QgZHByY19lbmRwb2ludCAqZW5kcG9pbnQyKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfQ09OTkVDVCwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywKKwkJCQkJICB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGVuZHBvaW50MS0+aWQpOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCAzMiwgZW5kcG9pbnQxLT5pbnRlcmZhY2VfaWQpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDMyLCBlbmRwb2ludDItPmlkKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygzMiwgMzIsIGVuZHBvaW50Mi0+aW50ZXJmYWNlX2lkKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygwLCA4LCBlbmRwb2ludDEtPnR5cGVbMF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIGVuZHBvaW50MS0+dHlwZVsxXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMTYsIDgsIGVuZHBvaW50MS0+dHlwZVsyXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMjQsIDgsIGVuZHBvaW50MS0+dHlwZVszXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMzIsIDgsIGVuZHBvaW50MS0+dHlwZVs0XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDAsIDgsIGVuZHBvaW50MS0+dHlwZVs1XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDgsIDgsIGVuZHBvaW50MS0+dHlwZVs2XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNTYsIDgsIGVuZHBvaW50MS0+dHlwZVs3XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMCwgOCwgZW5kcG9pbnQxLT50eXBlWzhdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg4LCA4LCBlbmRwb2ludDEtPnR5cGVbOV0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDE2LCA4LCBlbmRwb2ludDEtPnR5cGVbMTBdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygyNCwgOCwgZW5kcG9pbnQxLT50eXBlWzExXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMzIsIDgsIGVuZHBvaW50MS0+dHlwZVsxMl0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQwLCA4LCBlbmRwb2ludDEtPnR5cGVbMTNdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg0OCwgOCwgZW5kcG9pbnQxLT50eXBlWzE0XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNTYsIDgsIGVuZHBvaW50MS0+dHlwZVsxNV0pOworCWNtZC5wYXJhbXNbNV0gfD0gbWNfZW5jKDAsIDgsIGVuZHBvaW50Mi0+dHlwZVswXSk7CisJY21kLnBhcmFtc1s1XSB8PSBtY19lbmMoOCwgOCwgZW5kcG9pbnQyLT50eXBlWzFdKTsKKwljbWQucGFyYW1zWzVdIHw9IG1jX2VuYygxNiwgOCwgZW5kcG9pbnQyLT50eXBlWzJdKTsKKwljbWQucGFyYW1zWzVdIHw9IG1jX2VuYygyNCwgOCwgZW5kcG9pbnQyLT50eXBlWzNdKTsKKwljbWQucGFyYW1zWzVdIHw9IG1jX2VuYygzMiwgOCwgZW5kcG9pbnQyLT50eXBlWzRdKTsKKwljbWQucGFyYW1zWzVdIHw9IG1jX2VuYyg0MCwgOCwgZW5kcG9pbnQyLT50eXBlWzVdKTsKKwljbWQucGFyYW1zWzVdIHw9IG1jX2VuYyg0OCwgOCwgZW5kcG9pbnQyLT50eXBlWzZdKTsKKwljbWQucGFyYW1zWzVdIHw9IG1jX2VuYyg1NiwgOCwgZW5kcG9pbnQyLT50eXBlWzddKTsKKwljbWQucGFyYW1zWzZdIHw9IG1jX2VuYygwLCA4LCBlbmRwb2ludDItPnR5cGVbOF0pOworCWNtZC5wYXJhbXNbNl0gfD0gbWNfZW5jKDgsIDgsIGVuZHBvaW50Mi0+dHlwZVs5XSk7CisJY21kLnBhcmFtc1s2XSB8PSBtY19lbmMoMTYsIDgsIGVuZHBvaW50Mi0+dHlwZVsxMF0pOworCWNtZC5wYXJhbXNbNl0gfD0gbWNfZW5jKDI0LCA4LCBlbmRwb2ludDItPnR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzZdIHw9IG1jX2VuYygzMiwgOCwgZW5kcG9pbnQyLT50eXBlWzEyXSk7CisJY21kLnBhcmFtc1s2XSB8PSBtY19lbmMoNDAsIDgsIGVuZHBvaW50Mi0+dHlwZVsxM10pOworCWNtZC5wYXJhbXNbNl0gfD0gbWNfZW5jKDQ4LCA4LCBlbmRwb2ludDItPnR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzZdIHw9IG1jX2VuYyg1NiwgOCwgZW5kcG9pbnQyLT50eXBlWzE1XSk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY19kaXNjb25uZWN0KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICBjb25zdCBzdHJ1Y3QgZHByY19lbmRwb2ludCAqZW5kcG9pbnQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9ESVNDT05ORUNULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgZW5kcG9pbnQtPmlkKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgMzIsIGVuZHBvaW50LT5pbnRlcmZhY2VfaWQpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDgsIGVuZHBvaW50LT50eXBlWzBdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg4LCA4LCBlbmRwb2ludC0+dHlwZVsxXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMTYsIDgsIGVuZHBvaW50LT50eXBlWzJdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygyNCwgOCwgZW5kcG9pbnQtPnR5cGVbM10pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDMyLCA4LCBlbmRwb2ludC0+dHlwZVs0XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNDAsIDgsIGVuZHBvaW50LT50eXBlWzVdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg0OCwgOCwgZW5kcG9pbnQtPnR5cGVbNl0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDU2LCA4LCBlbmRwb2ludC0+dHlwZVs3XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMCwgOCwgZW5kcG9pbnQtPnR5cGVbOF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIGVuZHBvaW50LT50eXBlWzldKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygxNiwgOCwgZW5kcG9pbnQtPnR5cGVbMTBdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgZW5kcG9pbnQtPnR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygzMiwgOCwgZW5kcG9pbnQtPnR5cGVbMTJdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0MCwgOCwgZW5kcG9pbnQtPnR5cGVbMTNdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgZW5kcG9pbnQtPnR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg1NiwgOCwgZW5kcG9pbnQtPnR5cGVbMTVdKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcHJjX2dldF9jb25uZWN0aW9uKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQkJCWNvbnN0IHN0cnVjdCBkcHJjX2VuZHBvaW50ICplbmRwb2ludDEsCisJCQkJCXN0cnVjdCBkcHJjX2VuZHBvaW50ICplbmRwb2ludDIsCisJCQkJCWludCAqc3RhdGUpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9DT05ORUNUSU9OLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgZW5kcG9pbnQxLT5pZCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDMyLCBlbmRwb2ludDEtPmludGVyZmFjZV9pZCk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgOCwgZW5kcG9pbnQxLT50eXBlWzBdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg4LCA4LCBlbmRwb2ludDEtPnR5cGVbMV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDE2LCA4LCBlbmRwb2ludDEtPnR5cGVbMl0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDI0LCA4LCBlbmRwb2ludDEtPnR5cGVbM10pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDMyLCA4LCBlbmRwb2ludDEtPnR5cGVbNF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQwLCA4LCBlbmRwb2ludDEtPnR5cGVbNV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQ4LCA4LCBlbmRwb2ludDEtPnR5cGVbNl0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDU2LCA4LCBlbmRwb2ludDEtPnR5cGVbN10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIGVuZHBvaW50MS0+dHlwZVs4XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoOCwgOCwgZW5kcG9pbnQxLT50eXBlWzldKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygxNiwgOCwgZW5kcG9pbnQxLT50eXBlWzEwXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMjQsIDgsIGVuZHBvaW50MS0+dHlwZVsxMV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDMyLCA4LCBlbmRwb2ludDEtPnR5cGVbMTJdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0MCwgOCwgZW5kcG9pbnQxLT50eXBlWzEzXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDgsIDgsIGVuZHBvaW50MS0+dHlwZVsxNF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDU2LCA4LCBlbmRwb2ludDEtPnR5cGVbMTVdKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCWVuZHBvaW50Mi0+aWQgPSBtY19kZWMoY21kLnBhcmFtc1szXSwgMCwgMzIpOworCWVuZHBvaW50Mi0+aW50ZXJmYWNlX2lkID0gbWNfZGVjKGNtZC5wYXJhbXNbM10sIDMyLCAzMik7CisJZW5kcG9pbnQyLT50eXBlWzBdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDAsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsxXSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCA4LCA4KTsKKwllbmRwb2ludDItPnR5cGVbMl0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgMTYsIDgpOworCWVuZHBvaW50Mi0+dHlwZVszXSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCAyNCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzRdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDMyLCA4KTsKKwllbmRwb2ludDItPnR5cGVbNV0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgNDAsIDgpOworCWVuZHBvaW50Mi0+dHlwZVs2XSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCA0OCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzddID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDU2LCA4KTsKKwllbmRwb2ludDItPnR5cGVbOF0gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgMCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzldID0gbWNfZGVjKGNtZC5wYXJhbXNbNV0sIDgsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsxMF0gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgMTYsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsxMV0gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgMjQsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsxMl0gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgMzIsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsxM10gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgNDAsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsxNF0gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgNDgsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsxNV0gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgNTYsIDgpOworCSpzdGF0ZSA9IG1jX2RlYyhjbWQucGFyYW1zWzZdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLWFsbG9jYXRvci5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYWxsb2NhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2MjM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLWFsbG9jYXRvci5jCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogRnJlZXNjYWxlIE1DIG9iamVjdCBkZXZpY2UgYWxsb2NhdG9yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcGJwLWNtZC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBjb24tY21kLmgiCisjaW5jbHVkZSAiZHBtY3AtY21kLmgiCisjaW5jbHVkZSAiZHBtY3AuaCIKKworLyoqCisgKiBmc2xfbWNfcmVzb3VyY2VfcG9vbF9hZGRfZGV2aWNlIC0gYWRkIGFsbG9jYXRhYmxlIGRldmljZSB0byBhIHJlc291cmNlCisgKiBwb29sIG9mIGEgZ2l2ZW4gTUMgYnVzCisgKgorICogQG1jX2J1czogcG9pbnRlciB0byB0aGUgTUMgYnVzCisgKiBAcG9vbF90eXBlOiBNQyBidXMgcG9vbCB0eXBlCisgKiBAbWNfZGV2OiBQb2ludGVyIHRvIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UKKyAqCisgKiBJdCBhZGRzIGFuIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgdG8gYSBjb250YWluZXIncyByZXNvdXJjZSBwb29sIG9mCisgKiB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZQorICovCitzdGF0aWMgaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcmVzb3VyY2VfcG9vbF9hZGRfZGV2aWNlKHN0cnVjdCBmc2xfbWNfYnVzCisJCQkJCQkJCSptY19idXMsCisJCQkJCQkJZW51bSBmc2xfbWNfcG9vbF90eXBlCisJCQkJCQkJCXBvb2xfdHlwZSwKKwkJCQkJCQlzdHJ1Y3QgZnNsX21jX2RldmljZQorCQkJCQkJCQkqbWNfZGV2KQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSAmbWNfYnVzLT5tY19kZXY7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlib29sIG11dGV4X2xvY2tlZCA9IGZhbHNlOworCisJaWYgKFdBUk5fT04ocG9vbF90eXBlIDwgMCB8fCBwb29sX3R5cGUgPj0gRlNMX01DX05VTV9QT09MX1RZUEVTKSkKKwkJZ290byBvdXQ7CisJaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKKwkJZ290byBvdXQ7CisJaWYgKFdBUk5fT04obWNfZGV2LT5yZXNvdXJjZSkpCisJCWdvdG8gb3V0OworCisJcmVzX3Bvb2wgPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1twb29sX3R5cGVdOworCWlmIChXQVJOX09OKHJlc19wb29sLT50eXBlICE9IHBvb2xfdHlwZSkpCisJCWdvdG8gb3V0OworCWlmIChXQVJOX09OKHJlc19wb29sLT5tY19idXMgIT0gbWNfYnVzKSkKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCW11dGV4X2xvY2tlZCA9IHRydWU7CisKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWF4X2NvdW50IDwgMCkpCisJCWdvdG8gb3V0OworCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50IDwgMCB8fAorCQkgICAgcmVzX3Bvb2wtPmZyZWVfY291bnQgPiByZXNfcG9vbC0+bWF4X2NvdW50KSkKKwkJZ290byBvdXQ7CisKKwlyZXNvdXJjZSA9IGRldm1fa3phbGxvYygmbWNfYnVzX2Rldi0+ZGV2LCBzaXplb2YoKnJlc291cmNlKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc291cmNlKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZzbF9tY19yZXNvdXJjZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJlc291cmNlLT50eXBlID0gcG9vbF90eXBlOworCXJlc291cmNlLT5pZCA9IG1jX2Rldi0+b2JqX2Rlc2MuaWQ7CisJcmVzb3VyY2UtPmRhdGEgPSBtY19kZXY7CisJcmVzb3VyY2UtPnBhcmVudF9wb29sID0gcmVzX3Bvb2w7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5ub2RlKTsKKwlsaXN0X2FkZF90YWlsKCZyZXNvdXJjZS0+bm9kZSwgJnJlc19wb29sLT5mcmVlX2xpc3QpOworCW1jX2Rldi0+cmVzb3VyY2UgPSByZXNvdXJjZTsKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudCsrOworCXJlc19wb29sLT5tYXhfY291bnQrKzsKKwllcnJvciA9IDA7CitvdXQ6CisJaWYgKG11dGV4X2xvY2tlZCkKKwkJbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGZzbF9tY19yZXNvdXJjZV9wb29sX3JlbW92ZV9kZXZpY2UgLSByZW1vdmUgYW4gYWxsb2NhdGFibGUgZGV2aWNlIGZyb20gYQorICogcmVzb3VyY2UgcG9vbAorICoKKyAqIEBtY19kZXY6IFBvaW50ZXIgdG8gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZQorICoKKyAqIEl0IHBlcm1hbmVudGx5IHJlbW92ZXMgYW4gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSBmcm9tIHRoZSByZXNvdXJjZQorICogcG9vbCwgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgaW4sIGFzIGxvbmcgYXMgaXQgaXMgaW4gdGhlIHBvb2wncyBmcmVlIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9wb29sX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGZzbF9tY19kZXZpY2UKKwkJCQkJCQkJICAgKm1jX2RldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlib29sIG11dGV4X2xvY2tlZCA9IGZhbHNlOworCisJaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKKwkJZ290byBvdXQ7CisKKwlyZXNvdXJjZSA9IG1jX2Rldi0+cmVzb3VyY2U7CisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPmRhdGEgIT0gbWNfZGV2KSkKKwkJZ290byBvdXQ7CisKKwltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpOworCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJcmVzX3Bvb2wgPSByZXNvdXJjZS0+cGFyZW50X3Bvb2w7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wgIT0gJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcmVzb3VyY2UtPnR5cGVdKSkKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCW11dGV4X2xvY2tlZCA9IHRydWU7CisKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWF4X2NvdW50IDw9IDApKQorCQlnb3RvIG91dDsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8PSAwIHx8CisJCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+IHJlc19wb29sLT5tYXhfY291bnQpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgYWxsb2NhdGVkLCBpdHMgcmVzb3VyY2UgaXMgbm90CisJICogaW4gdGhlIGZyZWUgbGlzdCBhbmQgdGh1cywgdGhlIGRldmljZSBjYW5ub3QgYmUgcmVtb3ZlZC4KKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmcmVzb3VyY2UtPm5vZGUpKSB7CisJCWVycm9yID0gLUVCVVNZOworCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCisJCQkiRGV2aWNlICVzIGNhbm5vdCBiZSByZW1vdmVkIGZyb20gcmVzb3VyY2UgcG9vbFxuIiwKKwkJCWRldl9uYW1lKCZtY19kZXYtPmRldikpOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2RlbCgmcmVzb3VyY2UtPm5vZGUpOworCUlOSVRfTElTVF9IRUFEKCZyZXNvdXJjZS0+bm9kZSk7CisJcmVzX3Bvb2wtPmZyZWVfY291bnQtLTsKKwlyZXNfcG9vbC0+bWF4X2NvdW50LS07CisKKwlkZXZtX2tmcmVlKCZtY19idXNfZGV2LT5kZXYsIHJlc291cmNlKTsKKwltY19kZXYtPnJlc291cmNlID0gTlVMTDsKKwllcnJvciA9IDA7CitvdXQ6CisJaWYgKG11dGV4X2xvY2tlZCkKKwkJbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzW10gPSB7CisJW0ZTTF9NQ19QT09MX0RQTUNQXSA9ICJkcG1jcCIsCisJW0ZTTF9NQ19QT09MX0RQQlBdID0gImRwYnAiLAorCVtGU0xfTUNfUE9PTF9EUENPTl0gPSAiZHBjb24iLAorfTsKKworc3RhdGljIGludCBfX211c3RfY2hlY2sgb2JqZWN0X3R5cGVfdG9fcG9vbF90eXBlKGNvbnN0IGNoYXIgKm9iamVjdF90eXBlLAorCQkJCQkJIGVudW0gZnNsX21jX3Bvb2xfdHlwZQorCQkJCQkJCQkqcG9vbF90eXBlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzKTsgaSsrKSB7CisJCWlmIChzdHJjbXAob2JqZWN0X3R5cGUsIGZzbF9tY19wb29sX3R5cGVfc3RyaW5nc1tpXSkgPT0gMCkgeworCQkJKnBvb2xfdHlwZSA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAorCQkJCQkgIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCisJCQkJCSAgc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqKm5ld19yZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OworCWludCBlcnJvciA9IC1FSU5WQUw7CisJYm9vbCBtdXRleF9sb2NrZWQgPSBmYWxzZTsKKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGZzbF9tY19wb29sX3R5cGVfc3RyaW5ncykgIT0KKwkJICAgICBGU0xfTUNfTlVNX1BPT0xfVFlQRVMpOworCisJKm5ld19yZXNvdXJjZSA9IE5VTEw7CisJaWYgKFdBUk5fT04ocG9vbF90eXBlIDwgMCB8fCBwb29sX3R5cGUgPj0gRlNMX01DX05VTV9QT09MX1RZUEVTKSkKKwkJZ290byBlcnJvcjsKKworCXJlc19wb29sID0gJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWNfYnVzICE9IG1jX2J1cykpCisJCWdvdG8gZXJyb3I7CisKKwltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCW11dGV4X2xvY2tlZCA9IHRydWU7CisJcmVzb3VyY2UgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnJlc19wb29sLT5mcmVlX2xpc3QsCisJCQkJCSAgICBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlLCBub2RlKTsKKworCWlmICghcmVzb3VyY2UpIHsKKwkJV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCAhPSAwKTsKKwkJZXJyb3IgPSAtRU5YSU87CisJCWRldl9lcnIoJm1jX2J1c19kZXYtPmRldiwKKwkJCSJObyBtb3JlIHJlc291cmNlcyBvZiB0eXBlICVzIGxlZnRcbiIsCisJCQlmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3NbcG9vbF90eXBlXSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgIT0gcG9vbF90eXBlKSkKKwkJZ290byBlcnJvcjsKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+cGFyZW50X3Bvb2wgIT0gcmVzX3Bvb2wpKQorCQlnb3RvIGVycm9yOworCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50IDw9IDAgfHwKKwkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID4gcmVzX3Bvb2wtPm1heF9jb3VudCkpCisJCWdvdG8gZXJyb3I7CisKKwlsaXN0X2RlbCgmcmVzb3VyY2UtPm5vZGUpOworCUlOSVRfTElTVF9IRUFEKCZyZXNvdXJjZS0+bm9kZSk7CisKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudC0tOworCW11dGV4X3VubG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKKwkqbmV3X3Jlc291cmNlID0gcmVzb3VyY2U7CisJcmV0dXJuIDA7CitlcnJvcjoKKwlpZiAobXV0ZXhfbG9ja2VkKQorCQltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUpOworCit2b2lkIGZzbF9tY19yZXNvdXJjZV9mcmVlKHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlKQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7CisJYm9vbCBtdXRleF9sb2NrZWQgPSBmYWxzZTsKKworCXJlc19wb29sID0gcmVzb3VyY2UtPnBhcmVudF9wb29sOworCWlmIChXQVJOX09OKHJlc291cmNlLT50eXBlICE9IHJlc19wb29sLT50eXBlKSkKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCW11dGV4X2xvY2tlZCA9IHRydWU7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPCAwIHx8CisJCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+PSByZXNfcG9vbC0+bWF4X2NvdW50KSkKKwkJZ290byBvdXQ7CisKKwlpZiAoV0FSTl9PTighbGlzdF9lbXB0eSgmcmVzb3VyY2UtPm5vZGUpKSkKKwkJZ290byBvdXQ7CisKKwlsaXN0X2FkZF90YWlsKCZyZXNvdXJjZS0+bm9kZSwgJnJlc19wb29sLT5mcmVlX2xpc3QpOworCXJlc19wb29sLT5mcmVlX2NvdW50Kys7CitvdXQ6CisJaWYgKG11dGV4X2xvY2tlZCkKKwkJbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3Jlc291cmNlX2ZyZWUpOworCisvKioKKyAqIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUgLSBBbGxvY2F0ZXMgYW4gTUMgcG9ydGFsCisgKgorICogQG1jX2RldjogTUMgZGV2aWNlIGZvciB3aGljaCB0aGUgTUMgcG9ydGFsIGlzIHRvIGJlIGFsbG9jYXRlZAorICogQG1jX2lvX2ZsYWdzOiBGbGFncyBmb3IgdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgYWxsb2NhdGVkCisgKiBNQyBwb3J0YWwuCisgKiBAbmV3X21jX2lvOiBQb2ludGVyIHRvIGFyZWEgd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QKKyAqIHRoYXQgd3JhcHMgdGhlIGFsbG9jYXRlZCBNQyBwb3J0YWwgaXMgdG8gYmUgcmV0dXJuZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbiBNQyBwb3J0YWwgZnJvbSB0aGUgZGV2aWNlJ3MgcGFyZW50IERQUkMsCisgKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIE1DIGJ1cycgcG9vbCBvZiBNQyBwb3J0YWxzIGFuZCB3cmFwcworICogaXQgaW4gYSBuZXcgZnNsX21jX2lvIG9iamVjdC4gSWYgJ21jX2RldicgaXMgYSBEUFJDIGl0c2VsZiwgdGhlCisgKiBwb3J0YWwgaXMgYWxsb2NhdGVkIGZyb20gaXRzIG93biBNQyBidXMuCisgKi8KK2ludCBfX211c3RfY2hlY2sgZnNsX21jX3BvcnRhbF9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAorCQkJCQl1aW50MTZfdCBtY19pb19mbGFncywKKwkJCQkJc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbykKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworCXBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHI7CisJc2l6ZV90IG1jX3BvcnRhbF9zaXplOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19hZGV2OworCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOworCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvID0gTlVMTDsKKworCWlmIChtY19kZXYtPmZsYWdzICYgRlNMX01DX0lTX0RQUkMpIHsKKwkJbWNfYnVzX2RldiA9IG1jX2RldjsKKwl9IGVsc2UgeworCQlpZiAoV0FSTl9PTihtY19kZXYtPmRldi5wYXJlbnQtPmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkKKwkJCXJldHVybiBlcnJvcjsKKworCQltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpOworCX0KKworCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJKm5ld19tY19pbyA9IE5VTEw7CisJZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUobWNfYnVzLCBGU0xfTUNfUE9PTF9EUE1DUCwgJnJlc291cmNlKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwltY19hZGV2ID0gcmVzb3VyY2UtPmRhdGE7CisJaWYgKFdBUk5fT04oIW1jX2FkZXYpKQorCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7CisKKwlpZiAoV0FSTl9PTihtY19hZGV2LT5vYmpfZGVzYy5yZWdpb25fY291bnQgPT0gMCkpCisJCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKKworCW1jX3BvcnRhbF9waHlzX2FkZHIgPSBtY19hZGV2LT5yZWdpb25zWzBdLnN0YXJ0OworCW1jX3BvcnRhbF9zaXplID0gbWNfYWRldi0+cmVnaW9uc1swXS5lbmQgLQorCQkJIG1jX2FkZXYtPnJlZ2lvbnNbMF0uc3RhcnQgKyAxOworCisJaWYgKFdBUk5fT04obWNfcG9ydGFsX3NpemUgIT0gbWNfYnVzX2Rldi0+bWNfaW8tPnBvcnRhbF9zaXplKSkKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOworCisJZXJyb3IgPSBmc2xfY3JlYXRlX21jX2lvKCZtY19idXNfZGV2LT5kZXYsCisJCQkJIG1jX3BvcnRhbF9waHlzX2FkZHIsCisJCQkJIG1jX3BvcnRhbF9zaXplLCByZXNvdXJjZSwKKwkJCQkgbWNfaW9fZmxhZ3MsICZtY19pbyk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOworCisJKm5ld19tY19pbyA9IG1jX2lvOworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX3Jlc291cmNlOgorCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKTsKKworLyoqCisgKiBmc2xfbWNfcG9ydGFsX2ZyZWUgLSBSZXR1cm5zIGFuIE1DIHBvcnRhbCB0byB0aGUgcG9vbCBvZiBmcmVlIE1DIHBvcnRhbHMKKyAqIG9mIGEgZ2l2ZW4gTUMgYnVzCisgKgorICogQG1jX2lvOiBQb2ludGVyIHRvIHRoZSBmc2xfbWNfaW8gb2JqZWN0IHRoYXQgd3JhcHMgdGhlIE1DIHBvcnRhbCB0byBmcmVlCisgKi8KK3ZvaWQgZnNsX21jX3BvcnRhbF9mcmVlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCisJcmVzb3VyY2UgPSBtY19pby0+cmVzb3VyY2U7CisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgIT0gRlNMX01DX1BPT0xfRFBNQ1ApKQorCQlyZXR1cm47CisJaWYgKFdBUk5fT04oIXJlc291cmNlLT5kYXRhKSkKKwkJcmV0dXJuOworCisJZnNsX2Rlc3Ryb3lfbWNfaW8obWNfaW8pOworCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3J0YWxfZnJlZSk7CisKKy8qKgorICogZnNsX21jX3BvcnRhbF9yZXNldCAtIFJlc2V0cyB0aGUgZHBtY3Agb2JqZWN0IGZvciBhIGdpdmVuIGZzbF9tY19pbyBvYmplY3QKKyAqCisgKiBAbWNfaW86IFBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgTUMgcG9ydGFsIHRvIGZyZWUKKyAqLworaW50IGZzbF9tY19wb3J0YWxfcmVzZXQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCit7CisJaW50IGVycm9yOworCXVpbnQxNl90IHRva2VuOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlID0gbWNfaW8tPnJlc291cmNlOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSByZXNvdXJjZS0+ZGF0YTsKKworCWlmIChXQVJOX09OKHJlc291cmNlLT50eXBlICE9IEZTTF9NQ19QT09MX0RQTUNQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoV0FSTl9PTighbWNfZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IGRwbWNwX29wZW4obWNfaW8sIG1jX2Rldi0+b2JqX2Rlc2MuaWQsICZ0b2tlbik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZtY19kZXYtPmRldiwgImRwbWNwX29wZW4oKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGRwbWNwX3Jlc2V0KG1jX2lvLCB0b2tlbik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZtY19kZXYtPmRldiwgImRwbWNwX3Jlc2V0KCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBkcG1jcF9jbG9zZShtY19pbywgdG9rZW4pOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmbWNfZGV2LT5kZXYsICJkcG1jcF9jbG9zZSgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3BvcnRhbF9yZXNldCk7CisKKy8qKgorICogZnNsX21jX29iamVjdF9hbGxvY2F0ZSAtIEFsbG9jYXRlcyBhIE1DIG9iamVjdCBkZXZpY2Ugb2YgdGhlIGdpdmVuCisgKiBwb29sIHR5cGUgZnJvbSBhIGdpdmVuIE1DIGJ1cworICoKKyAqIEBtY19kZXY6IE1DIGRldmljZSBmb3Igd2hpY2ggdGhlIE1DIG9iamVjdCBkZXZpY2UgaXMgdG8gYmUgYWxsb2NhdGVkCisgKiBAcG9vbF90eXBlOiBNQyBidXMgcmVzb3VyY2UgcG9vbCB0eXBlCisgKiBAbmV3X21jX2RldjogUG9pbnRlciB0byBhcmVhIHdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQKKyAqIE1DIG9iamVjdCBkZXZpY2UgaXMgdG8gYmUgcmV0dXJuZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIE1DIG9iamVjdCBkZXZpY2UgZnJvbSB0aGUgZGV2aWNlJ3MgcGFyZW50IERQUkMsCisgKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIE1DIGJ1cycgcG9vbCBvZiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlcyBvZgorICogdGhlIGdpdmVuIHJlc291cmNlIHR5cGUuIG1jX2RldiBjYW5ub3QgYmUgYSBEUFJDIGl0c2VsZi4KKyAqCisgKiBOT1RFOiBwb29sX3R5cGUgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBGU0xfTUNfUE9PTF9NQ1AsIHNpbmNlIE1DCisgKiBwb3J0YWxzIGFyZSBhbGxvY2F0ZWQgdXNpbmcgZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSgpLCBpbnN0ZWFkIG9mCisgKiB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19vYmplY3RfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiwKKwkJCQkJZW51bSBmc2xfbWNfcG9vbF90eXBlIHBvb2xfdHlwZSwKKwkJCQkJc3RydWN0IGZzbF9tY19kZXZpY2UgKipuZXdfbWNfYWRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19hZGV2OworCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOworCisJKm5ld19tY19hZGV2ID0gTlVMTDsKKwlpZiAoV0FSTl9PTihtY19kZXYtPmZsYWdzICYgRlNMX01DX0lTX0RQUkMpKQorCQlnb3RvIGVycm9yOworCisJaWYgKFdBUk5fT04obWNfZGV2LT5kZXYucGFyZW50LT5idXMgIT0gJmZzbF9tY19idXNfdHlwZSkpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoV0FSTl9PTihwb29sX3R5cGUgPT0gRlNMX01DX1BPT0xfRFBNQ1ApKQorCQlnb3RvIGVycm9yOworCisJbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KTsKKwltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOworCWVycm9yID0gZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKG1jX2J1cywgcG9vbF90eXBlLCAmcmVzb3VyY2UpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwltY19hZGV2ID0gcmVzb3VyY2UtPmRhdGE7CisJaWYgKFdBUk5fT04oIW1jX2FkZXYpKQorCQlnb3RvIGVycm9yOworCisJKm5ld19tY19hZGV2ID0gbWNfYWRldjsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWlmIChyZXNvdXJjZSkKKwkJZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOworCisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX29iamVjdF9hbGxvY2F0ZSk7CisKKy8qKgorICogZnNsX21jX29iamVjdF9mcmVlIC0gUmV0dXJucyBhbiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIHRvIHRoZQorICogY29ycmVzcG9uZGluZyByZXNvdXJjZSBwb29sIG9mIGEgZ2l2ZW4gTUMgYnVzLgorICoKKyAqIEBtY19hZGV2OiBQb2ludGVyIHRvIHRoZSBNQyBvYmplY3QgZGV2aWNlCisgKi8KK3ZvaWQgZnNsX21jX29iamVjdF9mcmVlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19hZGV2KQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCisJcmVzb3VyY2UgPSBtY19hZGV2LT5yZXNvdXJjZTsKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+dHlwZSA9PSBGU0xfTUNfUE9PTF9EUE1DUCkpCisJCXJldHVybjsKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+ZGF0YSAhPSBtY19hZGV2KSkKKwkJcmV0dXJuOworCisJZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX29iamVjdF9mcmVlKTsKKworLyoqCisgKiBmc2xfbWNfYWxsb2NhdG9yX3Byb2JlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIGFuIGFsbG9jYXRhYmxlIGRldmljZSBpcworICogYmVpbmcgYWRkZWQgdG8gdGhlIHN5c3RlbQorICovCitzdGF0aWMgaW50IGZzbF9tY19hbGxvY2F0b3JfcHJvYmUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldikKK3sKKwllbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKCFGU0xfTUNfSVNfQUxMT0NBVEFCTEUobWNfZGV2LT5vYmpfZGVzYy50eXBlKSkpCisJCWdvdG8gZXJyb3I7CisKKwltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpOworCWlmIChXQVJOX09OKG1jX2J1c19kZXYtPmRldi5idXMgIT0gJmZzbF9tY19idXNfdHlwZSkpCisJCWdvdG8gZXJyb3I7CisKKwltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOworCWVycm9yID0gb2JqZWN0X3R5cGVfdG9fcG9vbF90eXBlKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgJnBvb2xfdHlwZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWVycm9yID0gZnNsX21jX3Jlc291cmNlX3Bvb2xfYWRkX2RldmljZShtY19idXMsIHBvb2xfdHlwZSwgbWNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yOworCisJZGV2X2luZm8oJm1jX2Rldi0+ZGV2LAorCQkgIkFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgYm91bmQgdG8gZnNsX21jX2FsbG9jYXRvciBkcml2ZXIiKTsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGZzbF9tY19hbGxvY2F0b3JfcmVtb3ZlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIGFuIGFsbG9jYXRhYmxlIGRldmljZSBpcworICogYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0KKyAqLworc3RhdGljIGludCBmc2xfbWNfYWxsb2NhdG9yX3JlbW92ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCWludCBlcnJvciA9IC1FSU5WQUw7CisKKwlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZShtY19kZXYpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJZGV2X2luZm8oJm1jX2Rldi0+ZGV2LAorCQkgIkFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgdW5ib3VuZCBmcm9tIGZzbF9tY19hbGxvY2F0b3IgZHJpdmVyIik7CisJZXJyb3IgPSAwOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmc2xfbWNfZGV2aWNlX21hdGNoX2lkIG1hdGNoX2lkX3RhYmxlW10gPSB7CisJeworCSAudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEUsCisJIC5vYmpfdHlwZSA9ICJkcGJwIiwKKwkgLnZlcl9tYWpvciA9IERQQlBfVkVSX01BSk9SLAorCSAudmVyX21pbm9yID0gRFBCUF9WRVJfTUlOT1IKKwl9LAorCXsKKwkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAorCSAub2JqX3R5cGUgPSAiZHBtY3AiLAorCSAudmVyX21ham9yID0gRFBNQ1BfVkVSX01BSk9SLAorCSAudmVyX21pbm9yID0gRFBNQ1BfVkVSX01JTk9SCisJfSwKKwl7CisJIC52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRSwKKwkgLm9ial90eXBlID0gImRwY29uIiwKKwkgLnZlcl9tYWpvciA9IERQQ09OX1ZFUl9NQUpPUiwKKwkgLnZlcl9taW5vciA9IERQQ09OX1ZFUl9NSU5PUgorCX0sCisJey52ZW5kb3IgPSAweDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBmc2xfbWNfZHJpdmVyIGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImZzbF9tY19hbGxvY2F0b3IiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgLnBtID0gTlVMTCwKKwkJICAgfSwKKwkubWF0Y2hfaWRfdGFibGUgPSBtYXRjaF9pZF90YWJsZSwKKwkucHJvYmUgPSBmc2xfbWNfYWxsb2NhdG9yX3Byb2JlLAorCS5yZW1vdmUgPSBmc2xfbWNfYWxsb2NhdG9yX3JlbW92ZSwKK307CisKK2ludCBfX2luaXQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBmc2xfbWNfZHJpdmVyX3JlZ2lzdGVyKCZmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcik7Cit9CisKK3ZvaWQgX19leGl0IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9tY19hbGxvY2F0b3JfZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLWJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1MTJkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLWJ1cy5jCkBAIC0wLDAgKzEsNzkzIEBACisvKgorICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcG1uZy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSAiZHByYy1jbWQuaCIKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptY19kZXZfY2FjaGU7CisKKy8qKgorICogZnNsX21jX2J1c19tYXRjaCAtIGRldmljZSB0byBkcml2ZXIgbWF0Y2hpbmcgY2FsbGJhY2sKKyAqIEBkZXY6IHRoZSBNQyBvYmplY3QgZGV2aWNlIHN0cnVjdHVyZSB0byBtYXRjaCBhZ2FpbnN0CisgKiBAZHJ2OiB0aGUgZGV2aWNlIGRyaXZlciB0byBzZWFyY2ggZm9yIG1hdGNoaW5nIE1DIG9iamVjdCBkZXZpY2UgaWQKKyAqIHN0cnVjdHVyZXMKKyAqCisgKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZnNsX21jX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJY29uc3Qgc3RydWN0IGZzbF9tY19kZXZpY2VfbWF0Y2hfaWQgKmlkOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisJc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZHJ2KTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJYm9vbCBtYWpvcl92ZXJzaW9uX21pc21hdGNoID0gZmFsc2U7CisJYm9vbCBtaW5vcl92ZXJzaW9uX21pc21hdGNoID0gZmFsc2U7CisKKwlpZiAoV0FSTl9PTighZnNsX21jX2J1c190eXBlLmRldl9yb290KSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIW1jX2Rydi0+bWF0Y2hfaWRfdGFibGUpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB0aGUgb2JqZWN0IGlzIG5vdCAncGx1Z2dlZCcgZG9uJ3QgbWF0Y2guCisJICogT25seSBleGNlcHRpb24gaXMgdGhlIHJvb3QgRFBSQywgd2hpY2ggaXMgYSBzcGVjaWFsIGNhc2UuCisJICovCisJaWYgKChtY19kZXYtPm9ial9kZXNjLnN0YXRlICYgRFBSQ19PQkpfU1RBVEVfUExVR0dFRCkgPT0gMCAmJgorCSAgICAmbWNfZGV2LT5kZXYgIT0gZnNsX21jX2J1c190eXBlLmRldl9yb290KQorCQlnb3RvIG91dDsKKworCS8qCisJICogVHJhdmVyc2UgdGhlIG1hdGNoX2lkIHRhYmxlIG9mIHRoZSBnaXZlbiBkcml2ZXIsIHRyeWluZyB0byBmaW5kCisJICogYSBtYXRjaGluZyBmb3IgdGhlIGdpdmVuIE1DIG9iamVjdCBkZXZpY2UuCisJICovCisJZm9yIChpZCA9IG1jX2Rydi0+bWF0Y2hfaWRfdGFibGU7IGlkLT52ZW5kb3IgIT0gMHgwOyBpZCsrKSB7CisJCWlmIChpZC0+dmVuZG9yID09IG1jX2Rldi0+b2JqX2Rlc2MudmVuZG9yICYmCisJCSAgICBzdHJjbXAoaWQtPm9ial90eXBlLCBtY19kZXYtPm9ial9kZXNjLnR5cGUpID09IDApIHsKKwkJCWlmIChpZC0+dmVyX21ham9yID09IG1jX2Rldi0+b2JqX2Rlc2MudmVyX21ham9yKSB7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWlmIChpZC0+dmVyX21pbm9yICE9IG1jX2Rldi0+b2JqX2Rlc2MudmVyX21pbm9yKQorCQkJCQltaW5vcl92ZXJzaW9uX21pc21hdGNoID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJbWFqb3JfdmVyc2lvbl9taXNtYXRjaCA9IHRydWU7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG1ham9yX3ZlcnNpb25fbWlzbWF0Y2gpIHsKKwkJZGV2X3dhcm4oZGV2LAorCQkJICJNYWpvciB2ZXJzaW9uIG1pc21hdGNoOiBkcml2ZXIgdmVyc2lvbiAldS4ldSwgTUMgb2JqZWN0IHZlcnNpb24gJXUuJXVcbiIsCisJCQkgaWQtPnZlcl9tYWpvciwgaWQtPnZlcl9taW5vciwKKwkJCSBtY19kZXYtPm9ial9kZXNjLnZlcl9tYWpvciwKKwkJCSBtY19kZXYtPm9ial9kZXNjLnZlcl9taW5vcik7CisJfSBlbHNlIGlmIChtaW5vcl92ZXJzaW9uX21pc21hdGNoKSB7CisJCWRldl93YXJuKGRldiwKKwkJCSAiTWlub3IgdmVyc2lvbiBtaXNtYXRjaDogZHJpdmVyIHZlcnNpb24gJXUuJXUsIE1DIG9iamVjdCB2ZXJzaW9uICV1LiV1XG4iLAorCQkJIGlkLT52ZXJfbWFqb3IsIGlkLT52ZXJfbWlub3IsCisJCQkgbWNfZGV2LT5vYmpfZGVzYy52ZXJfbWFqb3IsCisJCQkgbWNfZGV2LT5vYmpfZGVzYy52ZXJfbWlub3IpOworCX0KKworb3V0OgorCWRldl9kYmcoZGV2LCAiJXNtYXRjaGVkXG4iLCBmb3VuZCA/ICIiIDogIm5vdCAiKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qKgorICogZnNsX21jX2J1c191ZXZlbnQgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQKKyAqLworc3RhdGljIGludCBmc2xfbWNfYnVzX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlwcl9kZWJ1ZygiJXMgaW52b2tlZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgYnVzX3R5cGUgZnNsX21jX2J1c190eXBlID0geworCS5uYW1lID0gImZzbC1tYyIsCisJLm1hdGNoID0gZnNsX21jX2J1c19tYXRjaCwKKwkudWV2ZW50ID0gZnNsX21jX2J1c191ZXZlbnQsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2J1c190eXBlKTsKKworc3RhdGljIGludCBmc2xfbWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2OworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisJaW50IGVycm9yOworCisJaWYgKFdBUk5fT04oIWRldi0+ZHJpdmVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpZiAoV0FSTl9PTighbWNfZHJ2LT5wcm9iZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSBtY19kcnYtPnByb2JlKG1jX2Rldik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIk1DIG9iamVjdCBkZXZpY2UgcHJvYmUgY2FsbGJhY2sgZmFpbGVkOiAlZFxuIiwKKwkJCWVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZzbF9tY19kcml2ZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2ID0gdG9fZnNsX21jX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighZGV2LT5kcml2ZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gbWNfZHJ2LT5yZW1vdmUobWNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoZGV2LAorCQkJIk1DIG9iamVjdCBkZXZpY2UgcmVtb3ZlIGNhbGxiYWNrIGZhaWxlZDogJWRcbiIsCisJCQllcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnNsX21jX2RyaXZlcl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisKKwltY19kcnYtPnNodXRkb3duKG1jX2Rldik7Cit9CisKKy8qKgorICogX19mc2xfbWNfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXJzIGEgY2hpbGQgZGV2aWNlIGRyaXZlciB3aXRoIHRoZQorICogTUMgYnVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsaWNpdGx5IGludm9rZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIG9mCisgKiBmc2xfbWMgZGV2aWNlIGRyaXZlcnMsIHdoaWNoIGlzIGdlbmVyYXRlZCBieSB0aGUKKyAqIG1vZHVsZV9mc2xfbWNfZHJpdmVyKCkgbWFjcm8uCisgKi8KK2ludCBfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RyaXZlciwKKwkJCSAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJaW50IGVycm9yOworCisJbWNfZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwltY19kcml2ZXItPmRyaXZlci5idXMgPSAmZnNsX21jX2J1c190eXBlOworCisJaWYgKG1jX2RyaXZlci0+cHJvYmUpCisJCW1jX2RyaXZlci0+ZHJpdmVyLnByb2JlID0gZnNsX21jX2RyaXZlcl9wcm9iZTsKKworCWlmIChtY19kcml2ZXItPnJlbW92ZSkKKwkJbWNfZHJpdmVyLT5kcml2ZXIucmVtb3ZlID0gZnNsX21jX2RyaXZlcl9yZW1vdmU7CisKKwlpZiAobWNfZHJpdmVyLT5zaHV0ZG93bikKKwkJbWNfZHJpdmVyLT5kcml2ZXIuc2h1dGRvd24gPSBmc2xfbWNfZHJpdmVyX3NodXRkb3duOworCisJZXJyb3IgPSBkcml2ZXJfcmVnaXN0ZXIoJm1jX2RyaXZlci0+ZHJpdmVyKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByX2VycigiZHJpdmVyX3JlZ2lzdGVyKCkgZmFpbGVkIGZvciAlczogJWRcbiIsCisJCSAgICAgICBtY19kcml2ZXItPmRyaXZlci5uYW1lLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlwcl9pbmZvKCJNQyBvYmplY3QgZGV2aWNlIGRyaXZlciAlcyByZWdpc3RlcmVkXG4iLAorCQltY19kcml2ZXItPmRyaXZlci5uYW1lKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZnNsX21jX2RyaXZlcl9yZWdpc3Rlcik7CisKKy8qKgorICogZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlcnMgYSBkZXZpY2UgZHJpdmVyIGZyb20gdGhlCisgKiBNQyBidXMKKyAqLwordm9pZCBmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RyaXZlcikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmbWNfZHJpdmVyLT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBnZXRfZHByY19pY2lkKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJIGludCBjb250YWluZXJfaWQsIHVpbnQxNl90ICppY2lkKQoreworCXVpbnQxNl90IGRwcmNfaGFuZGxlOworCXN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgYXR0cjsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRwcmNfb3BlbihtY19pbywgY29udGFpbmVyX2lkLCAmZHByY19oYW5kbGUpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJkcHJjX29wZW4oKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CisJZXJyb3IgPSBkcHJjX2dldF9hdHRyaWJ1dGVzKG1jX2lvLCBkcHJjX2hhbmRsZSwgJmF0dHIpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJkcHJjX2dldF9hdHRyaWJ1dGVzKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGNvbW1vbl9jbGVhbnVwOworCX0KKworCSppY2lkID0gYXR0ci5pY2lkOworCWVycm9yID0gMDsKKworY29tbW9uX2NsZWFudXA6CisJKHZvaWQpZHByY19jbG9zZShtY19pbywgZHByY19oYW5kbGUpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCB0cmFuc2xhdGVfbWNfYWRkcih1aW50NjRfdCBtY19hZGRyLCBwaHlzX2FkZHJfdCAqcGh5c19hZGRyKQoreworCWludCBpOworCXN0cnVjdCBmc2xfbWMgKm1jID0gZGV2X2dldF9kcnZkYXRhKGZzbF9tY19idXNfdHlwZS5kZXZfcm9vdC0+cGFyZW50KTsKKworCWlmIChtYy0+bnVtX3RyYW5zbGF0aW9uX3JhbmdlcyA9PSAwKSB7CisJCS8qCisJCSAqIERvIGlkZW50aXR5IG1hcHBpbmc6CisJCSAqLworCQkqcGh5c19hZGRyID0gbWNfYWRkcjsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1jLT5udW1fdHJhbnNsYXRpb25fcmFuZ2VzOyBpKyspIHsKKwkJc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlICpyYW5nZSA9CisJCQkmbWMtPnRyYW5zbGF0aW9uX3Jhbmdlc1tpXTsKKworCQlpZiAobWNfYWRkciA+PSByYW5nZS0+c3RhcnRfbWNfYWRkciAmJgorCQkgICAgbWNfYWRkciA8IHJhbmdlLT5lbmRfbWNfYWRkcikgeworCQkJKnBoeXNfYWRkciA9IHJhbmdlLT5zdGFydF9waHlzX2FkZHIgKworCQkJCSAgICAgKG1jX2FkZHIgLSByYW5nZS0+c3RhcnRfbWNfYWRkcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IGZzbF9tY19kZXZpY2VfZ2V0X21taW9fcmVnaW9ucyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAorCQkJCQkgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KQoreworCWludCBpOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ2lvbnM7CisJc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjID0gJm1jX2Rldi0+b2JqX2Rlc2M7CisJc3RydWN0IGRldmljZSAqcGFyZW50X2RldiA9IG1jX2Rldi0+ZGV2LnBhcmVudDsKKworCXJlZ2lvbnMgPSBrbWFsbG9jX2FycmF5KG9ial9kZXNjLT5yZWdpb25fY291bnQsCisJCQkJc2l6ZW9mKHJlZ2lvbnNbMF0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ2lvbnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5yZWdpb25fY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZHByY19yZWdpb25fZGVzYyByZWdpb25fZGVzYzsKKworCQllcnJvciA9IGRwcmNfZ2V0X29ial9yZWdpb24obWNfYnVzX2Rldi0+bWNfaW8sCisJCQkJCSAgICBtY19idXNfZGV2LT5tY19oYW5kbGUsCisJCQkJCSAgICBvYmpfZGVzYy0+dHlwZSwKKwkJCQkJICAgIG9ial9kZXNjLT5pZCwgaSwgJnJlZ2lvbl9kZXNjKTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJZGV2X2VycihwYXJlbnRfZGV2LAorCQkJCSJkcHJjX2dldF9vYmpfcmVnaW9uKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQkJZ290byBlcnJvcl9jbGVhbnVwX3JlZ2lvbnM7CisJCX0KKworCQlXQVJOX09OKHJlZ2lvbl9kZXNjLmJhc2VfcGFkZHIgPT0gMHgwKTsKKwkJV0FSTl9PTihyZWdpb25fZGVzYy5zaXplID09IDApOworCQllcnJvciA9IHRyYW5zbGF0ZV9tY19hZGRyKHJlZ2lvbl9kZXNjLmJhc2VfcGFkZHIsCisJCQkJCSAgJnJlZ2lvbnNbaV0uc3RhcnQpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlkZXZfZXJyKHBhcmVudF9kZXYsCisJCQkJIkludmFsaWQgTUMgYWRkcmVzczogJSNsbHhcbiIsCisJCQkJcmVnaW9uX2Rlc2MuYmFzZV9wYWRkcik7CisJCQlnb3RvIGVycm9yX2NsZWFudXBfcmVnaW9uczsKKwkJfQorCisJCXJlZ2lvbnNbaV0uZW5kID0gcmVnaW9uc1tpXS5zdGFydCArIHJlZ2lvbl9kZXNjLnNpemUgLSAxOworCQlyZWdpb25zW2ldLm5hbWUgPSAiZnNsLW1jIG9iamVjdCBNTUlPIHJlZ2lvbiI7CisJCXJlZ2lvbnNbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCX0KKworCW1jX2Rldi0+cmVnaW9ucyA9IHJlZ2lvbnM7CisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfcmVnaW9uczoKKwlrZnJlZShyZWdpb25zKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogQWRkIGEgbmV3bHkgZGlzY292ZXJlZCBNQyBvYmplY3QgZGV2aWNlIHRvIGJlIHZpc2libGUgaW4gTGludXgKKyAqLworaW50IGZzbF9tY19kZXZpY2VfYWRkKHN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYywKKwkJICAgICAgc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYsCisJCSAgICAgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICoqbmV3X21jX2RldikKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IE5VTEw7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IE5VTEw7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKnBhcmVudF9tY19kZXY7CisKKwlpZiAocGFyZW50X2Rldi0+YnVzID09ICZmc2xfbWNfYnVzX3R5cGUpCisJCXBhcmVudF9tY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKHBhcmVudF9kZXYpOworCWVsc2UKKwkJcGFyZW50X21jX2RldiA9IE5VTEw7CisKKwlpZiAoc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHByYyIpID09IDApIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYW4gTUMgYnVzIGRldmljZSBvYmplY3Q6CisJCSAqLworCQltY19idXMgPSBkZXZtX2t6YWxsb2MocGFyZW50X2Rldiwgc2l6ZW9mKCptY19idXMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtY19idXMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltY19kZXYgPSAmbWNfYnVzLT5tY19kZXY7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSByZWd1bGFyIGZzbF9tY19kZXZpY2Ugb2JqZWN0OgorCQkgKi8KKwkJbWNfZGV2ID0ga21lbV9jYWNoZV96YWxsb2MobWNfZGV2X2NhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtY19kZXYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltY19kZXYtPm9ial9kZXNjID0gKm9ial9kZXNjOworCW1jX2Rldi0+bWNfaW8gPSBtY19pbzsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmbWNfZGV2LT5kZXYpOworCW1jX2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudF9kZXY7CisJbWNfZGV2LT5kZXYuYnVzID0gJmZzbF9tY19idXNfdHlwZTsKKwlkZXZfc2V0X25hbWUoJm1jX2Rldi0+ZGV2LCAiJXMuJWQiLCBvYmpfZGVzYy0+dHlwZSwgb2JqX2Rlc2MtPmlkKTsKKworCWlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcHJjIikgPT0gMCkgeworCQlzdHJ1Y3QgZnNsX21jX2lvICptY19pbzI7CisKKwkJbWNfZGV2LT5mbGFncyB8PSBGU0xfTUNfSVNfRFBSQzsKKworCQkvKgorCQkgKiBUbyBnZXQgdGhlIERQUkMncyBJQ0lELCB3ZSBuZWVkIHRvIG9wZW4gdGhlIERQUkMKKwkJICogaW4gZ2V0X2RwcmNfaWNpZCgpLiBGb3IgY2hpbGQgRFBSQ3MsIHdlIGRvIHNvIHVzaW5nIHRoZQorCQkgKiBwYXJlbnQgRFBSQydzIE1DIHBvcnRhbCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCBEUFJDJ3MgTUMKKwkJICogcG9ydGFsLCBpbiBjYXNlIHRoZSBjaGlsZCBEUFJDIGlzIGFscmVhZHkgb3BlbmVkIHdpdGgKKwkJICogaXRzIG93biBwb3J0YWwgKGUuZy4sIHRoZSBEUFJDIHVzZWQgYnkgQUlPUCkuCisJCSAqCisJCSAqIE5PVEU6IFRoZXJlIGNhbm5vdCBiZSBtb3JlIHRoYW4gb25lIGFjdGl2ZSBvcGVuIGZvciBhCisJCSAqIGdpdmVuIE1DIG9iamVjdCwgdXNpbmcgdGhlIHNhbWUgTUMgcG9ydGFsLgorCQkgKi8KKwkJaWYgKHBhcmVudF9tY19kZXYpIHsKKwkJCS8qCisJCQkgKiBkZXZpY2UgYmVpbmcgYWRkZWQgaXMgYSBjaGlsZCBEUFJDIGRldmljZQorCQkJICovCisJCQltY19pbzIgPSBwYXJlbnRfbWNfZGV2LT5tY19pbzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBkZXZpY2UgYmVpbmcgYWRkZWQgaXMgdGhlIHJvb3QgRFBSQyBkZXZpY2UKKwkJCSAqLworCQkJaWYgKFdBUk5fT04oIW1jX2lvKSkgeworCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OworCQkJfQorCisJCQltY19pbzIgPSBtY19pbzsKKworCQkJaWYgKCFmc2xfbWNfYnVzX3R5cGUuZGV2X3Jvb3QpCisJCQkJZnNsX21jX2J1c190eXBlLmRldl9yb290ID0gJm1jX2Rldi0+ZGV2OworCQl9CisKKwkJZXJyb3IgPSBnZXRfZHByY19pY2lkKG1jX2lvMiwgb2JqX2Rlc2MtPmlkLCAmbWNfZGV2LT5pY2lkKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQSBub24tRFBSQyBNQyBvYmplY3QgZGV2aWNlIGhhcyB0byBiZSBhIGNoaWxkIG9mIGFub3RoZXIKKwkJICogTUMgb2JqZWN0IChzcGVjaWZpY2FsbHkgYSBEUFJDIG9iamVjdCkKKwkJICovCisJCW1jX2Rldi0+aWNpZCA9IHBhcmVudF9tY19kZXYtPmljaWQ7CisJCW1jX2Rldi0+ZG1hX21hc2sgPSBGU0xfTUNfREVGQVVMVF9ETUFfTUFTSzsKKwkJbWNfZGV2LT5kZXYuZG1hX21hc2sgPSAmbWNfZGV2LT5kbWFfbWFzazsKKwl9CisKKwkvKgorCSAqIEdldCBNTUlPIHJlZ2lvbnMgZm9yIHRoZSBkZXZpY2UgZnJvbSB0aGUgTUM6CisJICoKKwkgKiBOT1RFOiB0aGUgcm9vdCBEUFJDIGlzIGEgc3BlY2lhbCBjYXNlIGFzIGl0cyBNTUlPIHJlZ2lvbiBpcworCSAqIG9idGFpbmVkIGZyb20gdGhlIGRldmljZSB0cmVlCisJICovCisJaWYgKHBhcmVudF9tY19kZXYgJiYgb2JqX2Rlc2MtPnJlZ2lvbl9jb3VudCAhPSAwKSB7CisJCWVycm9yID0gZnNsX21jX2RldmljZV9nZXRfbW1pb19yZWdpb25zKG1jX2RldiwKKwkJCQkJCSAgICAgICBwYXJlbnRfbWNfZGV2KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7CisJfQorCisJLyoKKwkgKiBUaGUgZGV2aWNlLXNwZWNpZmljIHByb2JlIGNhbGxiYWNrIHdpbGwgZ2V0IGludm9rZWQgYnkgZGV2aWNlX2FkZCgpCisJICovCisJZXJyb3IgPSBkZXZpY2VfYWRkKCZtY19kZXYtPmRldik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKHBhcmVudF9kZXYsCisJCQkiZGV2aWNlX2FkZCgpIGZhaWxlZCBmb3IgZGV2aWNlICVzOiAlZFxuIiwKKwkJCWRldl9uYW1lKCZtY19kZXYtPmRldiksIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX2RldjsKKwl9CisKKwkodm9pZClnZXRfZGV2aWNlKCZtY19kZXYtPmRldik7CisJZGV2X2RiZyhwYXJlbnRfZGV2LCAiQWRkZWQgTUMgb2JqZWN0IGRldmljZSAlc1xuIiwKKwkJZGV2X25hbWUoJm1jX2Rldi0+ZGV2KSk7CisKKwkqbmV3X21jX2RldiA9IG1jX2RldjsKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9kZXY6CisJa2ZyZWUobWNfZGV2LT5yZWdpb25zKTsKKwlpZiAobWNfYnVzKQorCQlkZXZtX2tmcmVlKHBhcmVudF9kZXYsIG1jX2J1cyk7CisJZWxzZQorCQlrbWVtX2NhY2hlX2ZyZWUobWNfZGV2X2NhY2hlLCBtY19kZXYpOworCisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2RldmljZV9hZGQpOworCisvKioKKyAqIGZzbF9tY19kZXZpY2VfcmVtb3ZlIC0gUmVtb3ZlIGEgTUMgb2JqZWN0IGRldmljZSBmcm9tIGJlaW5nIHZpc2libGUgdG8KKyAqIExpbnV4CisgKgorICogQG1jX2RldjogUG9pbnRlciB0byBhIE1DIG9iamVjdCBkZXZpY2Ugb2JqZWN0CisgKi8KK3ZvaWQgZnNsX21jX2RldmljZV9yZW1vdmUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gTlVMTDsKKworCWtmcmVlKG1jX2Rldi0+cmVnaW9ucyk7CisKKwkvKgorCSAqIFRoZSBkZXZpY2Utc3BlY2lmaWMgcmVtb3ZlIGNhbGxiYWNrIHdpbGwgZ2V0IGludm9rZWQgYnkgZGV2aWNlX2RlbCgpCisJICovCisJZGV2aWNlX2RlbCgmbWNfZGV2LT5kZXYpOworCXB1dF9kZXZpY2UoJm1jX2Rldi0+ZGV2KTsKKworCWlmIChzdHJjbXAobWNfZGV2LT5vYmpfZGVzYy50eXBlLCAiZHByYyIpID09IDApIHsKKwkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19kZXYpOworCQlpZiAobWNfZGV2LT5tY19pbykgeworCQkJZnNsX2Rlc3Ryb3lfbWNfaW8obWNfZGV2LT5tY19pbyk7CisJCQltY19kZXYtPm1jX2lvID0gTlVMTDsKKwkJfQorCisJCWlmICgmbWNfZGV2LT5kZXYgPT0gZnNsX21jX2J1c190eXBlLmRldl9yb290KQorCQkJZnNsX21jX2J1c190eXBlLmRldl9yb290ID0gTlVMTDsKKwl9CisKKwlpZiAobWNfYnVzKQorCQlkZXZtX2tmcmVlKG1jX2Rldi0+ZGV2LnBhcmVudCwgbWNfYnVzKTsKKwllbHNlCisJCWttZW1fY2FjaGVfZnJlZShtY19kZXZfY2FjaGUsIG1jX2Rldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZGV2aWNlX3JlbW92ZSk7CisKK3N0YXRpYyBpbnQgcGFyc2VfbWNfcmFuZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIGludCAqcGFkZHJfY2VsbHMsCisJCQkgICBpbnQgKm1jX2FkZHJfY2VsbHMsCisJCQkgICBpbnQgKm1jX3NpemVfY2VsbHMsCisJCQkgICBjb25zdCBfX2JlMzIgKipyYW5nZXNfc3RhcnQsCisJCQkgICB1aW50OF90ICpudW1fcmFuZ2VzKQoreworCWNvbnN0IF9fYmUzMiAqcHJvcDsKKwlpbnQgcmFuZ2VfdHVwbGVfY2VsbF9jb3VudDsKKwlpbnQgcmFuZ2VzX2xlbjsKKwlpbnQgdHVwbGVfbGVuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWNfbm9kZSA9IGRldi0+b2Zfbm9kZTsKKworCSpyYW5nZXNfc3RhcnQgPSBvZl9nZXRfcHJvcGVydHkobWNfbm9kZSwgInJhbmdlcyIsICZyYW5nZXNfbGVuKTsKKwlpZiAoISgqcmFuZ2VzX3N0YXJ0KSB8fCAhcmFuZ2VzX2xlbikgeworCQlkZXZfd2FybihkZXYsCisJCQkgIm1pc3Npbmcgb3IgZW1wdHkgcmFuZ2VzIHByb3BlcnR5IGZvciBkZXZpY2UgdHJlZSBub2RlICclcydcbiIsCisJCQkgbWNfbm9kZS0+bmFtZSk7CisKKwkJKm51bV9yYW5nZXMgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcGFkZHJfY2VsbHMgPSBvZl9uX2FkZHJfY2VsbHMobWNfbm9kZSk7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG1jX25vZGUsICIjYWRkcmVzcy1jZWxscyIsIE5VTEwpOworCWlmIChwcm9wKQorCQkqbWNfYWRkcl9jZWxscyA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwllbHNlCisJCSptY19hZGRyX2NlbGxzID0gKnBhZGRyX2NlbGxzOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShtY19ub2RlLCAiI3NpemUtY2VsbHMiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJKm1jX3NpemVfY2VsbHMgPSBiZTMyX3RvX2NwdXAocHJvcCk7CisJZWxzZQorCQkqbWNfc2l6ZV9jZWxscyA9IG9mX25fc2l6ZV9jZWxscyhtY19ub2RlKTsKKworCXJhbmdlX3R1cGxlX2NlbGxfY291bnQgPSAqcGFkZHJfY2VsbHMgKyAqbWNfYWRkcl9jZWxscyArCisJCQkJICptY19zaXplX2NlbGxzOworCisJdHVwbGVfbGVuID0gcmFuZ2VfdHVwbGVfY2VsbF9jb3VudCAqIHNpemVvZihfX2JlMzIpOworCWlmIChyYW5nZXNfbGVuICUgdHVwbGVfbGVuICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJtYWxmb3JtZWQgcmFuZ2VzIHByb3BlcnR5ICclcydcbiIsIG1jX25vZGUtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqbnVtX3JhbmdlcyA9IHJhbmdlc19sZW4gLyB0dXBsZV9sZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UKKwkJCQkJCSoqcmFuZ2VzLAorCQkJCQkgIHVpbnQ4X3QgKm51bV9yYW5nZXMpCit7CisJaW50IGVycm9yOworCWludCBwYWRkcl9jZWxsczsKKwlpbnQgbWNfYWRkcl9jZWxsczsKKwlpbnQgbWNfc2l6ZV9jZWxsczsKKwlpbnQgaTsKKwljb25zdCBfX2JlMzIgKnJhbmdlc19zdGFydDsKKwljb25zdCBfX2JlMzIgKmNlbGw7CisKKwllcnJvciA9IHBhcnNlX21jX3JhbmdlcyhkZXYsCisJCQkJJnBhZGRyX2NlbGxzLAorCQkJCSZtY19hZGRyX2NlbGxzLAorCQkJCSZtY19zaXplX2NlbGxzLAorCQkJCSZyYW5nZXNfc3RhcnQsCisJCQkJbnVtX3Jhbmdlcyk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKCEoKm51bV9yYW5nZXMpKSB7CisJCS8qCisJCSAqIE1pc3Npbmcgb3IgZW1wdHkgcmFuZ2VzIHByb3BlcnR5ICgicmFuZ2VzOyIpIGZvciB0aGUKKwkJICogJ2ZzbCxxb3JpcS1tYycgbm9kZS4gSW4gdGhpcyBjYXNlLCBpZGVudGl0eSBtYXBwaW5nCisJCSAqIHdpbGwgYmUgdXNlZC4KKwkJICovCisJCSpyYW5nZXMgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwkqcmFuZ2VzID0gZGV2bV9rY2FsbG9jKGRldiwgKm51bV9yYW5nZXMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCEoKnJhbmdlcykpCisJCXJldHVybiAtRU5PTUVNOworCisJY2VsbCA9IHJhbmdlc19zdGFydDsKKwlmb3IgKGkgPSAwOyBpIDwgKm51bV9yYW5nZXM7ICsraSkgeworCQlzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgKnJhbmdlID0gJigqcmFuZ2VzKVtpXTsKKworCQlyYW5nZS0+c3RhcnRfbWNfYWRkciA9IG9mX3JlYWRfbnVtYmVyKGNlbGwsIG1jX2FkZHJfY2VsbHMpOworCQljZWxsICs9IG1jX2FkZHJfY2VsbHM7CisJCXJhbmdlLT5zdGFydF9waHlzX2FkZHIgPSBvZl9yZWFkX251bWJlcihjZWxsLCBwYWRkcl9jZWxscyk7CisJCWNlbGwgKz0gcGFkZHJfY2VsbHM7CisJCXJhbmdlLT5lbmRfbWNfYWRkciA9IHJhbmdlLT5zdGFydF9tY19hZGRyICsKKwkJCQkgICAgIG9mX3JlYWRfbnVtYmVyKGNlbGwsIG1jX3NpemVfY2VsbHMpOworCisJCWNlbGwgKz0gbWNfc2l6ZV9jZWxsczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmc2xfbWNfYnVzX3Byb2JlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByb290IE1DIGJ1cyBpcyBiZWluZworICogYWRkZWQKKyAqLworc3RhdGljIGludCBmc2xfbWNfYnVzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRwcmNfb2JqX2Rlc2Mgb2JqX2Rlc2M7CisJaW50IGVycm9yOworCXN0cnVjdCBmc2xfbWMgKm1jOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX21jX2lvICptY19pbyA9IE5VTEw7CisJaW50IGNvbnRhaW5lcl9pZDsKKwlwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyOworCXVpbnQzMl90IG1jX3BvcnRhbF9zaXplOworCXN0cnVjdCBtY192ZXJzaW9uIG1jX3ZlcnNpb247CisJc3RydWN0IHJlc291cmNlIHJlczsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSb290IE1DIGJ1cyBkZXZpY2UgcHJvYmVkIik7CisKKwltYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYyk7CisKKwkvKgorCSAqIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIE1DIHBvcnRhbCBmb3IgdGhlIHJvb3QgRFBSQzoKKwkgKi8KKwllcnJvciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGRldi0+ZGV2Lm9mX25vZGUsIDAsICZyZXMpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIm9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoKSBmYWlsZWQgZm9yICVzXG4iLAorCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwltY19wb3J0YWxfcGh5c19hZGRyID0gcmVzLnN0YXJ0OworCW1jX3BvcnRhbF9zaXplID0gcmVzb3VyY2Vfc2l6ZSgmcmVzKTsKKwllcnJvciA9IGZzbF9jcmVhdGVfbWNfaW8oJnBkZXYtPmRldiwgbWNfcG9ydGFsX3BoeXNfYWRkciwKKwkJCQkgbWNfcG9ydGFsX3NpemUsIE5VTEwsIDAsICZtY19pbyk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBtY19nZXRfdmVyc2lvbihtY19pbywgJm1jX3ZlcnNpb24pOworCWlmIChlcnJvciAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJtY19nZXRfdmVyc2lvbigpIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBlcnJvcik7CisJCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkgIkZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggRmlybXdhcmUgdmVyc2lvbjogJXUuJXUuJXVcbiIsCisJCSBtY192ZXJzaW9uLm1ham9yLCBtY192ZXJzaW9uLm1pbm9yLCBtY192ZXJzaW9uLnJldmlzaW9uKTsKKworCWlmIChtY192ZXJzaW9uLm1ham9yIDwgTUNfVkVSX01BSk9SKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJFUlJPUjogTUMgZmlybXdhcmUgdmVyc2lvbiBub3Qgc3VwcG9ydGVkIGJ5IGRyaXZlciAoZHJpdmVyIHZlcnNpb246ICV1LiV1KVxuIiwKKwkJCU1DX1ZFUl9NQUpPUiwgTUNfVkVSX01JTk9SKTsKKwkJZXJyb3IgPSAtRU5PVFNVUFA7CisJCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKKwl9CisKKwlpZiAobWNfdmVyc2lvbi5tYWpvciA+IE1DX1ZFUl9NQUpPUikgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJXQVJOSU5HOiBkcml2ZXIgbWF5IG5vdCBzdXBwb3J0IG5ld2VyIE1DIGZpcm13YXJlIGZlYXR1cmVzIChkcml2ZXIgdmVyc2lvbjogJXUuJXUpXG4iLAorCQkJIE1DX1ZFUl9NQUpPUiwgTUNfVkVSX01JTk9SKTsKKwl9CisKKwllcnJvciA9IGdldF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlcygmcGRldi0+ZGV2LAorCQkJCQkgICAgICAgJm1jLT50cmFuc2xhdGlvbl9yYW5nZXMsCisJCQkJCSAgICAgICAmbWMtPm51bV90cmFuc2xhdGlvbl9yYW5nZXMpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKKworCWVycm9yID0gZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZChtY19pbywgJmNvbnRhaW5lcl9pZCk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZCgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCX0KKworCW9ial9kZXNjLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFOworCXN0cmNweShvYmpfZGVzYy50eXBlLCAiZHByYyIpOworCW9ial9kZXNjLmlkID0gY29udGFpbmVyX2lkOworCW9ial9kZXNjLnZlcl9tYWpvciA9IERQUkNfVkVSX01BSk9SOworCW9ial9kZXNjLnZlcl9taW5vciA9IERQUkNfVkVSX01JTk9SOworCW9ial9kZXNjLnJlZ2lvbl9jb3VudCA9IDA7CisKKwllcnJvciA9IGZzbF9tY19kZXZpY2VfYWRkKCZvYmpfZGVzYywgbWNfaW8sICZwZGV2LT5kZXYsICZtY19idXNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87CisKKwltYy0+cm9vdF9tY19idXNfZGV2ID0gbWNfYnVzX2RldjsKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9tY19pbzoKKwlmc2xfZGVzdHJveV9tY19pbyhtY19pbyk7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGZzbF9tY19idXNfcmVtb3ZlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByb290IE1DIGJ1cyBpcyBiZWluZworICogcmVtb3ZlZAorICovCitzdGF0aWMgaW50IGZzbF9tY19idXNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGZzbF9tYyAqbWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChXQVJOX09OKCZtYy0+cm9vdF9tY19idXNfZGV2LT5kZXYgIT0gZnNsX21jX2J1c190eXBlLmRldl9yb290KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmc2xfbWNfZGV2aWNlX3JlbW92ZShtYy0+cm9vdF9tY19idXNfZGV2KTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUm9vdCBNQyBidXMgZGV2aWNlIHJlbW92ZWQiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX21jX2J1c19tYXRjaF90YWJsZVtdID0geworCXsuY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWMiLH0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc2xfbWNfYnVzX21hdGNoX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX21jX2J1c19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiZnNsX21jX2J1cyIsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAucG0gPSBOVUxMLAorCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBmc2xfbWNfYnVzX21hdGNoX3RhYmxlLAorCQkgICB9LAorCS5wcm9iZSA9IGZzbF9tY19idXNfcHJvYmUsCisJLnJlbW92ZSA9IGZzbF9tY19idXNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZnNsX21jX2J1c19kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCW1jX2Rldl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJmc2xfbWNfZGV2aWNlIiwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgZnNsX21jX2RldmljZSksIDAsIDAsCisJCQkJCSBOVUxMKTsKKwlpZiAoIW1jX2Rldl9jYWNoZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBjcmVhdGUgZnNsX21jX2RldmljZSBjYWNoZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVycm9yID0gYnVzX3JlZ2lzdGVyKCZmc2xfbWNfYnVzX3R5cGUpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJmc2wtbWMgYnVzIHR5cGUgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX2NhY2hlOworCX0KKworCXByX2luZm8oImZzbC1tYyBidXMgdHlwZSByZWdpc3RlcmVkXG4iKTsKKworCWVycm9yID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmc2xfbWNfYnVzX2RyaXZlcik7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoInBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX2J1czsKKwl9CisKKwllcnJvciA9IGRwcmNfZHJpdmVyX2luaXQoKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfZHJpdmVyOworCisJZXJyb3IgPSBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9pbml0KCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcl9jbGVhbnVwX2RwcmNfZHJpdmVyOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfZHByY19kcml2ZXI6CisJZHByY19kcml2ZXJfZXhpdCgpOworCitlcnJvcl9jbGVhbnVwX2RyaXZlcjoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZnNsX21jX2J1c19kcml2ZXIpOworCitlcnJvcl9jbGVhbnVwX2J1czoKKwlidXNfdW5yZWdpc3RlcigmZnNsX21jX2J1c190eXBlKTsKKworZXJyb3JfY2xlYW51cF9jYWNoZToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobWNfZGV2X2NhY2hlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKGZzbF9tY19idXNfZHJpdmVyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZnNsX21jX2J1c19kcml2ZXJfZXhpdCh2b2lkKQoreworCWlmIChXQVJOX09OKCFtY19kZXZfY2FjaGUpKQorCQlyZXR1cm47CisKKwlmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9leGl0KCk7CisJZHByY19kcml2ZXJfZXhpdCgpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX2RyaXZlcik7CisJYnVzX3VucmVnaXN0ZXIoJmZzbF9tY19idXNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KG1jX2Rldl9jYWNoZSk7CisJcHJfaW5mbygiTUMgYnVzIHVucmVnaXN0ZXJlZFxuIik7Cit9CisKK21vZHVsZV9leGl0KGZzbF9tY19idXNfZHJpdmVyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1zeXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLXN5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzdmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1zeXMuYwpAQCAtMCwwICsxLDI4NyBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogSS9PIHNlcnZpY2VzIHRvIHNlbmQgTUMgY29tbWFuZHMgdG8gdGhlIE1DIGhhcmR3YXJlCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworLyoqCisgKiBUaW1lb3V0IGluIGppZmZpZXMgdG8gd2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgYW4gTUMgY29tbWFuZAorICovCisjZGVmaW5lIE1DX0NNRF9DT01QTEVUSU9OX1RJTUVPVVRfSklGRklFUyAgIChIWiAvIDIpCS8qIDUwMCBtcyAqLworCisvKgorICogdXNsZWVwX3JhbmdlKCkgbWluIGFuZCBtYXggdmFsdWVzIHVzZWQgdG8gdGhyb3R0bGUgZG93biBwb2xsaW5nCisgKiBpdGVyYXRpb25zIHdoaWxlIHdhaXRpbmcgZm9yIE1DIGNvbW1hbmQgY29tcGxldGlvbgorICovCisjZGVmaW5lIE1DX0NNRF9DT01QTEVUSU9OX1BPTExJTkdfTUlOX1NMRUVQX1VTRUNTICAgIDEwCisjZGVmaW5lIE1DX0NNRF9DT01QTEVUSU9OX1BPTExJTkdfTUFYX1NMRUVQX1VTRUNTICAgIDUwMAorCisjZGVmaW5lIE1DX0NNRF9IRFJfUkVBRF9DTURJRChfaGRyKSBcCisJKCh1aW50MTZfdCltY19kZWMoKF9oZHIpLCBNQ19DTURfSERSX0NNRElEX08sIE1DX0NNRF9IRFJfQ01ESURfUykpCisKKy8qKgorICogQ3JlYXRlcyBhbiBNQyBJL08gb2JqZWN0CisgKgorICogQGRldjogZGV2aWNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUMgSS9PIG9iamVjdAorICogQG1jX3BvcnRhbF9waHlzX2FkZHI6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIE1DIHBvcnRhbCB0byB1c2UKKyAqIEBtY19wb3J0YWxfc2l6ZTogc2l6ZSBpbiBieXRlcyBvZiB0aGUgTUMgcG9ydGFsCisgKiBAcmVzb3VyY2U6IFBvaW50ZXIgdG8gTUMgYnVzIG9iamVjdCBhbGxvY2F0b3IgcmVzb3VyY2UgYXNzb2NpYXRlZAorICogd2l0aCB0aGlzIE1DIEkvTyBvYmplY3Qgb3IgTlVMTCBpZiBub25lLgorICogQGZsYWdzOiBmbGFncyBmb3IgdGhlIG5ldyBNQyBJL08gb2JqZWN0CisgKiBAbmV3X21jX2lvOiBBcmVhIHRvIHJldHVybiBwb2ludGVyIHRvIG5ld2x5IGNyZWF0ZWQgTUMgSS9PIG9iamVjdAorICoKKyAqIFJldHVybnMgJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgX19tdXN0X2NoZWNrIGZzbF9jcmVhdGVfbWNfaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkciwKKwkJCQkgIHVpbnQzMl90IG1jX3BvcnRhbF9zaXplLAorCQkJCSAgc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UsCisJCQkJICB1aW50MzJfdCBmbGFncywgc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbykKK3sKKwlzdHJ1Y3QgZnNsX21jX2lvICptY19pbzsKKwl2b2lkIF9faW9tZW0gKm1jX3BvcnRhbF92aXJ0X2FkZHI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwltY19pbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbWNfaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jX2lvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1jX2lvLT5kZXYgPSBkZXY7CisJbWNfaW8tPmZsYWdzID0gZmxhZ3M7CisJbWNfaW8tPnBvcnRhbF9waHlzX2FkZHIgPSBtY19wb3J0YWxfcGh5c19hZGRyOworCW1jX2lvLT5wb3J0YWxfc2l6ZSA9IG1jX3BvcnRhbF9zaXplOworCW1jX2lvLT5yZXNvdXJjZSA9IHJlc291cmNlOworCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKGRldiwKKwkJCQkgICAgICBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSAgICAgIG1jX3BvcnRhbF9zaXplLAorCQkJCSAgICAgICJtY19wb3J0YWwiKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKGRldiwKKwkJCSJkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQgZm9yIE1DIHBvcnRhbCAlI2xseFxuIiwKKwkJCW1jX3BvcnRhbF9waHlzX2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1jX3BvcnRhbF92aXJ0X2FkZHIgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShkZXYsCisJCQkJCQkgICBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCQkJICAgbWNfcG9ydGFsX3NpemUpOworCWlmICghbWNfcG9ydGFsX3ZpcnRfYWRkcikgeworCQlkZXZfZXJyKGRldiwKKwkJCSJkZXZtX2lvcmVtYXBfbm9jYWNoZSBmYWlsZWQgZm9yIE1DIHBvcnRhbCAlI2xseFxuIiwKKwkJCW1jX3BvcnRhbF9waHlzX2FkZHIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW1jX2lvLT5wb3J0YWxfdmlydF9hZGRyID0gbWNfcG9ydGFsX3ZpcnRfYWRkcjsKKwkqbmV3X21jX2lvID0gbWNfaW87CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfY3JlYXRlX21jX2lvKTsKKworLyoqCisgKiBEZXN0cm95cyBhbiBNQyBJL08gb2JqZWN0CisgKgorICogQG1jX2lvOiBNQyBJL08gb2JqZWN0IHRvIGRlc3Ryb3kKKyAqLwordm9pZCBmc2xfZGVzdHJveV9tY19pbyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbykKK3sKKwlkZXZtX2lvdW5tYXAobWNfaW8tPmRldiwgbWNfaW8tPnBvcnRhbF92aXJ0X2FkZHIpOworCWRldm1fcmVsZWFzZV9tZW1fcmVnaW9uKG1jX2lvLT5kZXYsCisJCQkJbWNfaW8tPnBvcnRhbF9waHlzX2FkZHIsCisJCQkJbWNfaW8tPnBvcnRhbF9zaXplKTsKKworCW1jX2lvLT5wb3J0YWxfdmlydF9hZGRyID0gTlVMTDsKKwlkZXZtX2tmcmVlKG1jX2lvLT5kZXYsIG1jX2lvKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9kZXN0cm95X21jX2lvKTsKKworc3RhdGljIGludCBtY19zdGF0dXNfdG9fZXJyb3IoZW51bSBtY19jbWRfc3RhdHVzIHN0YXR1cykKK3sKKwlzdGF0aWMgY29uc3QgaW50IG1jX3N0YXR1c190b19lcnJvcl9tYXBbXSA9IHsKKwkJW01DX0NNRF9TVEFUVVNfT0tdID0gMCwKKwkJW01DX0NNRF9TVEFUVVNfQVVUSF9FUlJdID0gLUVBQ0NFUywKKwkJW01DX0NNRF9TVEFUVVNfTk9fUFJJVklMRUdFXSA9IC1FUEVSTSwKKwkJW01DX0NNRF9TVEFUVVNfRE1BX0VSUl0gPSAtRUlPLAorCQlbTUNfQ01EX1NUQVRVU19DT05GSUdfRVJSXSA9IC1FTlhJTywKKwkJW01DX0NNRF9TVEFUVVNfVElNRU9VVF0gPSAtRVRJTUVET1VULAorCQlbTUNfQ01EX1NUQVRVU19OT19SRVNPVVJDRV0gPSAtRU5BVkFJTCwKKwkJW01DX0NNRF9TVEFUVVNfTk9fTUVNT1JZXSA9IC1FTk9NRU0sCisJCVtNQ19DTURfU1RBVFVTX0JVU1ldID0gLUVCVVNZLAorCQlbTUNfQ01EX1NUQVRVU19VTlNVUFBPUlRFRF9PUF0gPSAtRU5PVFNVUFAsCisJCVtNQ19DTURfU1RBVFVTX0lOVkFMSURfU1RBVEVdID0gLUVOT0RFViwKKwl9OworCisJaWYgKFdBUk5fT04oKHUzMilzdGF0dXMgPj0gQVJSQVlfU0laRShtY19zdGF0dXNfdG9fZXJyb3JfbWFwKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG1jX3N0YXR1c190b19lcnJvcl9tYXBbc3RhdHVzXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm1jX3N0YXR1c190b19zdHJpbmcoZW51bSBtY19jbWRfc3RhdHVzIHN0YXR1cykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3RhdHVzX3N0cmluZ3NbXSA9IHsKKwkJW01DX0NNRF9TVEFUVVNfT0tdID0gIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIsCisJCVtNQ19DTURfU1RBVFVTX1JFQURZXSA9ICJDb21tYW5kIHJlYWR5IHRvIGJlIHByb2Nlc3NlZCIsCisJCVtNQ19DTURfU1RBVFVTX0FVVEhfRVJSXSA9ICJBdXRoZW50aWNhdGlvbiBlcnJvciIsCisJCVtNQ19DTURfU1RBVFVTX05PX1BSSVZJTEVHRV0gPSAiTm8gcHJpdmlsZWdlIiwKKwkJW01DX0NNRF9TVEFUVVNfRE1BX0VSUl0gPSAiRE1BIG9yIEkvTyBlcnJvciIsCisJCVtNQ19DTURfU1RBVFVTX0NPTkZJR19FUlJdID0gIkNvbmZpZ3VyYXRpb24gZXJyb3IiLAorCQlbTUNfQ01EX1NUQVRVU19USU1FT1VUXSA9ICJPcGVyYXRpb24gdGltZWQgb3V0IiwKKwkJW01DX0NNRF9TVEFUVVNfTk9fUkVTT1VSQ0VdID0gIk5vIHJlc291cmNlcyIsCisJCVtNQ19DTURfU1RBVFVTX05PX01FTU9SWV0gPSAiTm8gbWVtb3J5IGF2YWlsYWJsZSIsCisJCVtNQ19DTURfU1RBVFVTX0JVU1ldID0gIkRldmljZSBpcyBidXN5IiwKKwkJW01DX0NNRF9TVEFUVVNfVU5TVVBQT1JURURfT1BdID0gIlVuc3VwcG9ydGVkIG9wZXJhdGlvbiIsCisJCVtNQ19DTURfU1RBVFVTX0lOVkFMSURfU1RBVEVdID0gIkludmFsaWQgc3RhdGUiCisJfTsKKworCWlmICgodW5zaWduZWQgaW50KXN0YXR1cyA+PSBBUlJBWV9TSVpFKHN0YXR1c19zdHJpbmdzKSkKKwkJcmV0dXJuICJVbmtub3duIE1DIGVycm9yIjsKKworCXJldHVybiBzdGF0dXNfc3RyaW5nc1tzdGF0dXNdOworfQorCisvKioKKyAqIG1jX3dyaXRlX2NvbW1hbmQgLSB3cml0ZXMgYSBjb21tYW5kIHRvIGEgTWFuYWdlbWVudCBDb21wbGV4IChNQykgcG9ydGFsCisgKgorICogQHBvcnRhbDogcG9pbnRlciB0byBhbiBNQyBwb3J0YWwKKyAqIEBjbWQ6IHBvaW50ZXIgdG8gYSBmaWxsZWQgY29tbWFuZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWNfd3JpdGVfY29tbWFuZChzdHJ1Y3QgbWNfY29tbWFuZCBfX2lvbWVtICpwb3J0YWwsCisJCQkJICAgIHN0cnVjdCBtY19jb21tYW5kICpjbWQpCit7CisJaW50IGk7CisKKwkvKiBjb3B5IGNvbW1hbmQgcGFyYW1ldGVycyBpbnRvIHRoZSBwb3J0YWwgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUNfQ01EX05VTV9PRl9QQVJBTVM7IGkrKykKKwkJd3JpdGVxKGNtZC0+cGFyYW1zW2ldLCAmcG9ydGFsLT5wYXJhbXNbaV0pOworCisJLyogc3VibWl0IHRoZSBjb21tYW5kIGJ5IHdyaXRpbmcgdGhlIGhlYWRlciAqLworCXdyaXRlcShjbWQtPmhlYWRlciwgJnBvcnRhbC0+aGVhZGVyKTsKK30KKworLyoqCisgKiBtY19yZWFkX3Jlc3BvbnNlIC0gcmVhZHMgdGhlIHJlc3BvbnNlIGZvciB0aGUgbGFzdCBNQyBjb21tYW5kIGZyb20gYQorICogTWFuYWdlbWVudCBDb21wbGV4IChNQykgcG9ydGFsCisgKgorICogQHBvcnRhbDogcG9pbnRlciB0byBhbiBNQyBwb3J0YWwKKyAqIEByZXNwOiBwb2ludGVyIHRvIGNvbW1hbmQgcmVzcG9uc2UgYnVmZmVyCisgKgorICogUmV0dXJucyBNQ19DTURfU1RBVFVTX09LIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGVudW0gbWNfY21kX3N0YXR1cyBtY19yZWFkX3Jlc3BvbnNlKHN0cnVjdCBtY19jb21tYW5kIF9faW9tZW0gKgorCQkJCQkJICBwb3J0YWwsCisJCQkJCQkgIHN0cnVjdCBtY19jb21tYW5kICpyZXNwKQoreworCWludCBpOworCWVudW0gbWNfY21kX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBDb3B5IGNvbW1hbmQgcmVzcG9uc2UgaGVhZGVyIGZyb20gTUMgcG9ydGFsOiAqLworCXJlc3AtPmhlYWRlciA9IHJlYWRxKCZwb3J0YWwtPmhlYWRlcik7CisJc3RhdHVzID0gTUNfQ01EX0hEUl9SRUFEX1NUQVRVUyhyZXNwLT5oZWFkZXIpOworCWlmIChzdGF0dXMgIT0gTUNfQ01EX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIENvcHkgY29tbWFuZCByZXNwb25zZSBkYXRhIGZyb20gTUMgcG9ydGFsOiAqLworCWZvciAoaSA9IDA7IGkgPCBNQ19DTURfTlVNX09GX1BBUkFNUzsgaSsrKQorCQlyZXNwLT5wYXJhbXNbaV0gPSByZWFkcSgmcG9ydGFsLT5wYXJhbXNbaV0pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBTZW5kcyBhbiBjb21tYW5kIHRvIHRoZSBNQyBkZXZpY2UgdXNpbmcgdGhlIGdpdmVuIE1DIEkvTyBvYmplY3QKKyAqCisgKiBAbWNfaW86IE1DIEkvTyBvYmplY3QgdG8gYmUgdXNlZAorICogQGNtZDogY29tbWFuZCB0byBiZSBzZW50CisgKgorICogUmV0dXJucyAnMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKgorICogTk9URTogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgaW52b2tlZCBmcm9tIGZyb20gYXRvbWljIGNvbnRleHRzLgorICovCitpbnQgbWNfc2VuZF9jb21tYW5kKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBzdHJ1Y3QgbWNfY29tbWFuZCAqY21kKQoreworCWVudW0gbWNfY21kX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzX3VudGlsX3RpbWVvdXQgPQorCSAgICBqaWZmaWVzICsgTUNfQ01EX0NPTVBMRVRJT05fVElNRU9VVF9KSUZGSUVTOworCisJLyoKKwkgKiBTZW5kIGNvbW1hbmQgdG8gdGhlIE1DIGhhcmR3YXJlOgorCSAqLworCW1jX3dyaXRlX2NvbW1hbmQobWNfaW8tPnBvcnRhbF92aXJ0X2FkZHIsIGNtZCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHJlc3BvbnNlIGZyb20gdGhlIE1DIGhhcmR3YXJlOgorCSAqLworCWZvciAoOzspIHsKKwkJc3RhdHVzID0gbWNfcmVhZF9yZXNwb25zZShtY19pby0+cG9ydGFsX3ZpcnRfYWRkciwgY21kKTsKKwkJaWYgKHN0YXR1cyAhPSBNQ19DTURfU1RBVFVTX1JFQURZKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogVE9ETzogV2hlbiBNQyBjb21tYW5kIGNvbXBsZXRpb24gaW50ZXJydXB0cyBhcmUgc3VwcG9ydGVkCisJCSAqIGNhbGwgd2FpdCBmdW5jdGlvbiBoZXJlIGluc3RlYWQgb2YgdXNsZWVwX3JhbmdlKCkKKwkJICovCisJCXVzbGVlcF9yYW5nZShNQ19DTURfQ09NUExFVElPTl9QT0xMSU5HX01JTl9TTEVFUF9VU0VDUywKKwkJCSAgICAgTUNfQ01EX0NPTVBMRVRJT05fUE9MTElOR19NQVhfU0xFRVBfVVNFQ1MpOworCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGppZmZpZXNfdW50aWxfdGltZW91dCkpIHsKKwkJCXByX2RlYnVnKCJNQyBjb21tYW5kIHRpbWVkIG91dCAocG9ydGFsOiAlI2xseCwgb2JqIGhhbmRsZTogJSN4LCBjb21tYW5kOiAlI3gpXG4iLAorCQkJCSBtY19pby0+cG9ydGFsX3BoeXNfYWRkciwKKwkJCQkgKHVuc2lnbmVkIGludCkKKwkJCQkJTUNfQ01EX0hEUl9SRUFEX1RPS0VOKGNtZC0+aGVhZGVyKSwKKwkJCQkgKHVuc2lnbmVkIGludCkKKwkJCQkJTUNfQ01EX0hEUl9SRUFEX0NNRElEKGNtZC0+aGVhZGVyKSk7CisKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJfQorCisJaWYgKHN0YXR1cyAhPSBNQ19DTURfU1RBVFVTX09LKSB7CisJCXByX2RlYnVnKCJNQyBjb21tYW5kIGZhaWxlZDogcG9ydGFsOiAlI2xseCwgb2JqIGhhbmRsZTogJSN4LCBjb21tYW5kOiAlI3gsIHN0YXR1czogJXMgKCUjeClcbiIsCisJCQkgbWNfaW8tPnBvcnRhbF9waHlzX2FkZHIsCisJCQkgKHVuc2lnbmVkIGludClNQ19DTURfSERSX1JFQURfVE9LRU4oY21kLT5oZWFkZXIpLAorCQkJICh1bnNpZ25lZCBpbnQpTUNfQ01EX0hEUl9SRUFEX0NNRElEKGNtZC0+aGVhZGVyKSwKKwkJCSBtY19zdGF0dXNfdG9fc3RyaW5nKHN0YXR1cyksCisJCQkgKHVuc2lnbmVkIGludClzdGF0dXMpOworCisJCXJldHVybiBtY19zdGF0dXNfdG9fZXJyb3Ioc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobWNfc2VuZF9jb21tYW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcGJwLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAtY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkNzBhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC1jbWQuaApAQCAtMCwwICsxLDYwIEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqCisqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogbGF0ZXIgdmVyc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworI2lmbmRlZiBfRlNMX0RQQlBfQ01EX0gKKyNkZWZpbmUgX0ZTTF9EUEJQX0NNRF9ICisKKy8qIERQQlAgVmVyc2lvbiAqLworI2RlZmluZSBEUEJQX1ZFUl9NQUpPUgkJCQkyCisjZGVmaW5lIERQQlBfVkVSX01JTk9SCQkJCTAKKworLyogQ29tbWFuZCBJRHMgKi8KKyNkZWZpbmUgRFBCUF9DTURJRF9DTE9TRQkJCQkweDgwMAorI2RlZmluZSBEUEJQX0NNRElEX09QRU4JCQkJCTB4ODA0CisjZGVmaW5lIERQQlBfQ01ESURfQ1JFQVRFCQkJCTB4OTA0CisjZGVmaW5lIERQQlBfQ01ESURfREVTVFJPWQkJCQkweDkwMAorCisjZGVmaW5lIERQQlBfQ01ESURfRU5BQkxFCQkJCTB4MDAyCisjZGVmaW5lIERQQlBfQ01ESURfRElTQUJMRQkJCQkweDAwMworI2RlZmluZSBEUEJQX0NNRElEX0dFVF9BVFRSCQkJCTB4MDA0CisjZGVmaW5lIERQQlBfQ01ESURfUkVTRVQJCQkJMHgwMDUKKyNkZWZpbmUgRFBCUF9DTURJRF9JU19FTkFCTEVECQkJCTB4MDA2CisKKyNkZWZpbmUgRFBCUF9DTURJRF9TRVRfSVJRCQkJCTB4MDEwCisjZGVmaW5lIERQQlBfQ01ESURfR0VUX0lSUQkJCQkweDAxMQorI2RlZmluZSBEUEJQX0NNRElEX1NFVF9JUlFfRU5BQkxFCQkJMHgwMTIKKyNkZWZpbmUgRFBCUF9DTURJRF9HRVRfSVJRX0VOQUJMRQkJCTB4MDEzCisjZGVmaW5lIERQQlBfQ01ESURfU0VUX0lSUV9NQVNLCQkJCTB4MDE0CisjZGVmaW5lIERQQlBfQ01ESURfR0VUX0lSUV9NQVNLCQkJCTB4MDE1CisjZGVmaW5lIERQQlBfQ01ESURfR0VUX0lSUV9TVEFUVVMJCQkweDAxNgorI2RlZmluZSBEUEJQX0NNRElEX0NMRUFSX0lSUV9TVEFUVVMJCQkweDAxNworCisjZW5kaWYgLyogX0ZTTF9EUEJQX0NNRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNjOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAuaApAQCAtMCwwICsxLDMzMCBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19GU0xfRFBCUF9ICisjZGVmaW5lIF9fRlNMX0RQQlBfSAorCisvKiBEYXRhIFBhdGggQnVmZmVyIFBvb2wgQVBJCisgKiBDb250YWlucyBpbml0aWFsaXphdGlvbiBBUElzIGFuZCBydW50aW1lIGNvbnRyb2wgQVBJcyBmb3IgRFBCUAorICovCisKK3N0cnVjdCBmc2xfbWNfaW87CisKKy8qKgorICogZHBicF9vcGVuKCkgLSBPcGVuIGEgY29udHJvbCBzZXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAZHBicF9pZDoJRFBCUCB1bmlxdWUgSUQKKyAqIEB0b2tlbjoJUmV0dXJuZWQgdG9rZW47IHVzZSBpbiBzdWJzZXF1ZW50IEFQSSBjYWxscworICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gb3BlbiBhIGNvbnRyb2wgc2Vzc2lvbiBmb3IgYW4KKyAqIGFscmVhZHkgY3JlYXRlZCBvYmplY3Q7IGFuIG9iamVjdCBtYXkgaGF2ZSBiZWVuIGRlY2xhcmVkIGluCisgKiB0aGUgRFBMIG9yIGJ5IGNhbGxpbmcgdGhlIGRwYnBfY3JlYXRlIGZ1bmN0aW9uLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdW5pcXVlIGF1dGhlbnRpY2F0aW9uIHRva2VuLAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpYyBvYmplY3QgSUQgYW5kIHRoZSBzcGVjaWZpYyBNQworICogcG9ydGFsOyB0aGlzIHRva2VuIG11c3QgYmUgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjb21tYW5kcyBmb3IKKyAqIHRoaXMgc3BlY2lmaWMgb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX29wZW4oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIGludCBkcGJwX2lkLCB1aW50MTZfdCAqdG9rZW4pOworCisvKioKKyAqIGRwYnBfY2xvc2UoKSAtIENsb3NlIHRoZSBjb250cm9sIHNlc3Npb24gb2YgdGhlIG9iamVjdAorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBCUCBvYmplY3QKKyAqCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgbm8gZnVydGhlciBvcGVyYXRpb25zIGFyZQorICogYWxsb3dlZCBvbiB0aGUgb2JqZWN0IHdpdGhvdXQgb3BlbmluZyBhIG5ldyBjb250cm9sIHNlc3Npb24uCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX2Nsb3NlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbik7CisKKy8qKgorICogc3RydWN0IGRwYnBfY2ZnKCkgLSBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIERQQlAgY29uZmlndXJhdGlvbgorICogQG9wdGlvbnM6CXBsYWNlIGhvbGRlcgorICovCitzdHJ1Y3QgZHBicF9jZmcgeworCXVpbnQzMl90IG9wdGlvbnM7Cit9OworCisvKioKKyAqIGRwYnBfY3JlYXRlKCkgLSBDcmVhdGUgdGhlIERQQlAgb2JqZWN0LgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEBjZmc6CUNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAdG9rZW46CVJldHVybmVkIHRva2VuOyB1c2UgaW4gc3Vic2VxdWVudCBBUEkgY2FsbHMKKyAqCisgKiBDcmVhdGUgdGhlIERQQlAgb2JqZWN0LCBhbGxvY2F0ZSByZXF1aXJlZCByZXNvdXJjZXMgYW5kCisgKiBwZXJmb3JtIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uLgorICoKKyAqIFRoZSBvYmplY3QgY2FuIGJlIGNyZWF0ZWQgZWl0aGVyIGJ5IGRlY2xhcmluZyBpdCBpbiB0aGUKKyAqIERQTCBmaWxlLCBvciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgYXV0aGVudGljYXRpb24gdG9rZW4sCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmljIG9iamVjdCBJRCBhbmQgdGhlIHNwZWNpZmljIE1DCisgKiBwb3J0YWw7IHRoaXMgdG9rZW4gbXVzdCBiZSB1c2VkIGluIGFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvCisgKiB0aGlzIHNwZWNpZmljIG9iamVjdC4gRm9yIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCB1c2luZyB0aGUKKyAqIERQTCBmaWxlLCBjYWxsIGRwYnBfb3BlbiBmdW5jdGlvbiB0byBnZXQgYW4gYXV0aGVudGljYXRpb24KKyAqIHRva2VuIGZpcnN0LgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9jcmVhdGUoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCWNvbnN0IHN0cnVjdCBkcGJwX2NmZwkqY2ZnLAorCQl1aW50MTZfdAkJKnRva2VuKTsKKworLyoqCisgKiBkcGJwX2Rlc3Ryb3koKSAtIERlc3Ryb3kgdGhlIERQQlAgb2JqZWN0IGFuZCByZWxlYXNlIGFsbCBpdHMgcmVzb3VyY2VzLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBCUCBvYmplY3QKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfZGVzdHJveShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pOworCisvKioKKyAqIGRwYnBfZW5hYmxlKCkgLSBFbmFibGUgdGhlIERQQlAuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9lbmFibGUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKTsKKworLyoqCisgKiBkcGJwX2Rpc2FibGUoKSAtIERpc2FibGUgdGhlIERQQlAuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9kaXNhYmxlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbik7CisKKy8qKgorICogZHBicF9pc19lbmFibGVkKCkgLSBDaGVjayBpZiB0aGUgRFBCUCBpcyBlbmFibGVkLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBCUCBvYmplY3QKKyAqIEBlbjoJCVJldHVybnMgJzEnIGlmIG9iamVjdCBpcyBlbmFibGVkOyAnMCcgb3RoZXJ3aXNlCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX2lzX2VuYWJsZWQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuLCBpbnQgKmVuKTsKKworLyoqCisgKiBkcGJwX3Jlc2V0KCkgLSBSZXNldCB0aGUgRFBCUCwgcmV0dXJucyB0aGUgb2JqZWN0IHRvIGluaXRpYWwgc3RhdGUuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9yZXNldChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pOworCisvKioKKyAqIGRwYnBfc2V0X2lycSgpIC0gU2V0IElSUSBpbmZvcm1hdGlvbiBmb3IgdGhlIERQQlAgdG8gdHJpZ2dlciBhbiBpbnRlcnJ1cHQuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGlycV9pbmRleDoJSWRlbnRpZmllcyB0aGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQGlycV9hZGRyOglBZGRyZXNzIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvCisgKgkJCQlzaWduYWwgYSBtZXNzYWdlLWJhc2VkIGludGVycnVwdAorICogQGlycV92YWw6CVZhbHVlIHRvIHdyaXRlIGludG8gaXJxX2FkZHIgYWRkcmVzcworICogQHVzZXJfaXJxX2lkOiBBIHVzZXIgZGVmaW5lZCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSVJRCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX3NldF9pcnEoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSB1aW50MTZfdAkJdG9rZW4sCisJCSB1aW50OF90CQlpcnFfaW5kZXgsCisJCSB1aW50NjRfdAkJaXJxX2FkZHIsCisJCSB1aW50MzJfdAkJaXJxX3ZhbCwKKwkJIGludAkJCXVzZXJfaXJxX2lkKTsKKworLyoqCisgKiBkcGJwX2dldF9pcnEoKSAtIEdldCBJUlEgaW5mb3JtYXRpb24gZnJvbSB0aGUgRFBCUC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQHR5cGU6CUludGVycnVwdCB0eXBlOiAwIHJlcHJlc2VudHMgbWVzc2FnZSBpbnRlcnJ1cHQKKyAqCQkJCXR5cGUgKGJvdGggaXJxX2FkZHIgYW5kIGlycV92YWwgYXJlIHZhbGlkKQorICogQGlycV9hZGRyOglSZXR1cm5lZCBhZGRyZXNzIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvCisgKgkJCQlzaWduYWwgdGhlIG1lc3NhZ2UtYmFzZWQgaW50ZXJydXB0CisgKiBAaXJxX3ZhbDoJVmFsdWUgdG8gd3JpdGUgaW50byBpcnFfYWRkciBhZGRyZXNzCisgKiBAdXNlcl9pcnFfaWQ6IEEgdXNlciBkZWZpbmVkIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBJUlEKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfZ2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJIHVpbnQxNl90CQl0b2tlbiwKKwkJIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJIGludAkJCSp0eXBlLAorCQkgdWludDY0X3QJCSppcnFfYWRkciwKKwkJIHVpbnQzMl90CQkqaXJxX3ZhbCwKKwkJIGludAkJCSp1c2VyX2lycV9pZCk7CisKKy8qKgorICogZHBicF9zZXRfaXJxX2VuYWJsZSgpIC0gU2V0IG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBCUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAZW46CUludGVycnVwdCBzdGF0ZSAtIGVuYWJsZSA9IDEsIGRpc2FibGUgPSAwCisgKgorICogQWxsb3dzIEdQUCBzb2Z0d2FyZSB0byBjb250cm9sIHdoZW4gaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkLgorICogRWFjaCBpbnRlcnJ1cHQgY2FuIGhhdmUgdXAgdG8gMzIgY2F1c2VzLiAgVGhlIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2wncyB0aGUKKyAqIG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlLiBpZiB0aGUgaW50ZXJydXB0IGlzIGRpc2FibGVkIG5vIGNhdXNlcyB3aWxsIGNhdXNlCisgKiBhbiBpbnRlcnJ1cHQuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX3NldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJdWludDE2X3QJCXRva2VuLAorCQkJdWludDhfdAkJCWlycV9pbmRleCwKKwkJCXVpbnQ4X3QJCQllbik7CisKKy8qKgorICogZHBicF9nZXRfaXJxX2VuYWJsZSgpIC0gR2V0IG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBlbjoJCVJldHVybmVkIGludGVycnVwdCBzdGF0ZSAtIGVuYWJsZSA9IDEsIGRpc2FibGUgPSAwCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX2dldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJdWludDE2X3QJCXRva2VuLAorCQkJdWludDhfdAkJCWlycV9pbmRleCwKKwkJCXVpbnQ4X3QJCQkqZW4pOworCisvKioKKyAqIGRwYnBfc2V0X2lycV9tYXNrKCkgLSBTZXQgaW50ZXJydXB0IG1hc2suCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBtYXNrOglFdmVudCBtYXNrIHRvIHRyaWdnZXIgaW50ZXJydXB0OworICoJCQllYWNoIGJpdDoKKyAqCQkJCTAgPSBpZ25vcmUgZXZlbnQKKyAqCQkJCTEgPSBjb25zaWRlciBldmVudCBmb3IgYXNzZXJ0aW5nIElSUQorICoKKyAqIEV2ZXJ5IGludGVycnVwdCBjYW4gaGF2ZSB1cCB0byAzMiBjYXVzZXMgYW5kIHRoZSBpbnRlcnJ1cHQgbW9kZWwgc3VwcG9ydHMKKyAqIG1hc2tpbmcvdW5tYXNraW5nIGVhY2ggY2F1c2UgaW5kZXBlbmRlbnRseQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9zZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgdWludDhfdAkJaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdAkJbWFzayk7CisKKy8qKgorICogZHBicF9nZXRfaXJxX21hc2soKSAtIEdldCBpbnRlcnJ1cHQgbWFzay4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQG1hc2s6CVJldHVybmVkIGV2ZW50IG1hc2sgdG8gdHJpZ2dlciBpbnRlcnJ1cHQKKyAqCisgKiBFdmVyeSBpbnRlcnJ1cHQgY2FuIGhhdmUgdXAgdG8gMzIgY2F1c2VzIGFuZCB0aGUgaW50ZXJydXB0IG1vZGVsIHN1cHBvcnRzCisgKiBtYXNraW5nL3VubWFza2luZyBlYWNoIGNhdXNlIGluZGVwZW5kZW50bHkKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfZ2V0X2lycV9tYXNrKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgICAgICB1aW50MTZfdAkJdG9rZW4sCisJCSAgICAgIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QJCSptYXNrKTsKKworLyoqCisgKiBkcGJwX2dldF9pcnFfc3RhdHVzKCkgLSBHZXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGFueSBwZW5kaW5nIGludGVycnVwdHMuCisgKgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBCUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAc3RhdHVzOglSZXR1cm5lZCBpbnRlcnJ1cHRzIHN0YXR1cyAtIG9uZSBiaXQgcGVyIGNhdXNlOgorICoJCQkwID0gbm8gaW50ZXJydXB0IHBlbmRpbmcKKyAqCQkJMSA9IGludGVycnVwdCBwZW5kaW5nCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX2dldF9pcnFfc3RhdHVzKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJdWludDE2X3QJCXRva2VuLAorCQkJdWludDhfdAkJCWlycV9pbmRleCwKKwkJCXVpbnQzMl90CQkqc3RhdHVzKTsKKworLyoqCisgKiBkcGJwX2NsZWFyX2lycV9zdGF0dXMoKSAtIENsZWFyIGEgcGVuZGluZyBpbnRlcnJ1cHQncyBzdGF0dXMKKyAqCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBzdGF0dXM6CUJpdHMgdG8gY2xlYXIgKFcxQykgLSBvbmUgYml0IHBlciBjYXVzZToKKyAqCQkJCQkwID0gZG9uJ3QgY2hhbmdlCisgKgkJCQkJMSA9IGNsZWFyIHN0YXR1cyBiaXQKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfY2xlYXJfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSAgdWludDE2X3QJCXRva2VuLAorCQkJICB1aW50OF90CQlpcnFfaW5kZXgsCisJCQkgIHVpbnQzMl90CQlzdGF0dXMpOworCisvKioKKyAqIHN0cnVjdCBkcGJwX2F0dHIgLSBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIERQQlAgYXR0cmlidXRlcworICogQGlkOgkJRFBCUCBvYmplY3QgSUQKKyAqIEB2ZXJzaW9uOglEUEJQIHZlcnNpb24KKyAqIEBicGlkOglIYXJkd2FyZSBidWZmZXIgcG9vbCBJRDsgc2hvdWxkIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQgaW4KKyAqCQlhY3F1aXJlL3JlbGVhc2Ugb3BlcmF0aW9ucyBvbiBidWZmZXJzCisgKi8KK3N0cnVjdCBkcGJwX2F0dHIgeworCWludCBpZDsKKwkvKioKKwkgKiBzdHJ1Y3QgdmVyc2lvbiAtIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgRFBCUCB2ZXJzaW9uCisJICogQG1ham9yOglEUEJQIG1ham9yIHZlcnNpb24KKwkgKiBAbWlub3I6CURQQlAgbWlub3IgdmVyc2lvbgorCSAqLworCXN0cnVjdCB7CisJCXVpbnQxNl90IG1ham9yOworCQl1aW50MTZfdCBtaW5vcjsKKwl9IHZlcnNpb247CisJdWludDE2X3QgYnBpZDsKK307CisKKy8qKgorICogZHBicF9nZXRfYXR0cmlidXRlcyAtIFJldHJpZXZlIERQQlAgYXR0cmlidXRlcy4KKyAqCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGF0dHI6CVJldHVybmVkIG9iamVjdCdzIGF0dHJpYnV0ZXMKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfZ2V0X2F0dHJpYnV0ZXMoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQlzdHJ1Y3QgZHBicF9hdHRyCSphdHRyKTsKKworLyoqIEB9ICovCisKKyNlbmRpZiAvKiBfX0ZTTF9EUEJQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcGNvbi1jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcGNvbi1jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc4ZDMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwY29uLWNtZC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyoKKyogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorKiBsYXRlciB2ZXJzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisjaWZuZGVmIF9GU0xfRFBDT05fQ01EX0gKKyNkZWZpbmUgX0ZTTF9EUENPTl9DTURfSAorCisvKiBEUENPTiBWZXJzaW9uICovCisjZGVmaW5lIERQQ09OX1ZFUl9NQUpPUgkJCQkyCisjZGVmaW5lIERQQ09OX1ZFUl9NSU5PUgkJCQkwCisKKy8qIENvbW1hbmQgSURzICovCisjZGVmaW5lIERQQ09OX0NNRElEX0NMT1NFCQkJCTB4ODAwCisjZGVmaW5lIERQQ09OX0NNRElEX09QRU4JCQkJMHg4MDgKKyNkZWZpbmUgRFBDT05fQ01ESURfQ1JFQVRFCQkJCTB4OTA4CisjZGVmaW5lIERQQ09OX0NNRElEX0RFU1RST1kJCQkJMHg5MDAKKworI2RlZmluZSBEUENPTl9DTURJRF9FTkFCTEUJCQkJMHgwMDIKKyNkZWZpbmUgRFBDT05fQ01ESURfRElTQUJMRQkJCQkweDAwMworI2RlZmluZSBEUENPTl9DTURJRF9HRVRfQVRUUgkJCQkweDAwNAorI2RlZmluZSBEUENPTl9DTURJRF9SRVNFVAkJCQkweDAwNQorI2RlZmluZSBEUENPTl9DTURJRF9JU19FTkFCTEVECQkJCTB4MDA2CisKKyNkZWZpbmUgRFBDT05fQ01ESURfU0VUX0lSUQkJCQkweDAxMAorI2RlZmluZSBEUENPTl9DTURJRF9HRVRfSVJRCQkJCTB4MDExCisjZGVmaW5lIERQQ09OX0NNRElEX1NFVF9JUlFfRU5BQkxFCQkJMHgwMTIKKyNkZWZpbmUgRFBDT05fQ01ESURfR0VUX0lSUV9FTkFCTEUJCQkweDAxMworI2RlZmluZSBEUENPTl9DTURJRF9TRVRfSVJRX01BU0sJCQkweDAxNAorI2RlZmluZSBEUENPTl9DTURJRF9HRVRfSVJRX01BU0sJCQkweDAxNQorI2RlZmluZSBEUENPTl9DTURJRF9HRVRfSVJRX1NUQVRVUwkJCTB4MDE2CisjZGVmaW5lIERQQ09OX0NNRElEX0NMRUFSX0lSUV9TVEFUVVMJCQkweDAxNworCisjZGVmaW5lIERQQ09OX0NNRElEX1NFVF9OT1RJRklDQVRJT04JCQkweDEwMAorCisjZW5kaWYgLyogX0ZTTF9EUENPTl9DTURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwbW5nLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBtbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjA1MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwbW5nLmgKQEAgLTAsMCArMSw4MCBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19GU0xfRFBNTkdfSAorI2RlZmluZSBfX0ZTTF9EUE1OR19ICisKKy8qIE1hbmFnZW1lbnQgQ29tcGxleCBHZW5lcmFsIEFQSQorICogQ29udGFpbnMgZ2VuZXJhbCBBUEkgZm9yIHRoZSBNYW5hZ2VtZW50IENvbXBsZXggZmlybXdhcmUKKyAqLworCitzdHJ1Y3QgZnNsX21jX2lvOworCisvKioKKyAqIE1hbmFnZW1lbnQgQ29tcGxleCBmaXJtd2FyZSB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgTUNfVkVSX01BSk9SIDYKKyNkZWZpbmUgTUNfVkVSX01JTk9SIDAKKworLyoqCisgKiBzdHJ1Y3QgbWNfdmVyc29pbgorICogQG1ham9yOiBNYWpvciB2ZXJzaW9uIG51bWJlcjogaW5jcmVtZW50ZWQgb24gQVBJIGNvbXBhdGliaWxpdHkgY2hhbmdlcworICogQG1pbm9yOiBNaW5vciB2ZXJzaW9uIG51bWJlcjogaW5jcmVtZW50ZWQgb24gQVBJIGFkZGl0aW9ucyAodGhhdCBhcmUKKyAqCQliYWNrd2FyZCBjb21wYXRpYmxlKTsgcmVzZXQgd2hlbiBtYWpvciB2ZXJzaW9uIGlzIGluY3JlbWVudGVkCisgKiBAcmV2aXNpb246IEludGVybmFsIHJldmlzaW9uIG51bWJlcjogaW5jcmVtZW50ZWQgb24gaW1wbGVtZW50YXRpb24gY2hhbmdlcworICoJCWFuZC9vciBidWcgZml4ZXMgdGhhdCBoYXZlIG5vIGltcGFjdCBvbiBBUEkKKyAqLworc3RydWN0IG1jX3ZlcnNpb24geworCXVpbnQzMl90IG1ham9yOworCXVpbnQzMl90IG1pbm9yOworCXVpbnQzMl90IHJldmlzaW9uOworfTsKKworLyoqCisgKiBtY19nZXRfdmVyc2lvbigpIC0gUmV0cmlldmVzIHRoZSBNYW5hZ2VtZW50IENvbXBsZXggZmlybXdhcmUKKyAqCQkJdmVyc2lvbiBpbmZvcm1hdGlvbgorICogQG1jX2lvOgkJUG9pbnRlciB0byBvcGFxdWUgSS9PIG9iamVjdAorICogQG1jX3Zlcl9pbmZvOglSZXR1cm5lZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgbWNfZ2V0X3ZlcnNpb24oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHN0cnVjdCBtY192ZXJzaW9uICptY192ZXJfaW5mbyk7CisKKy8qKgorICogZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZCgpIC0gR2V0IGNvbnRhaW5lciBJRCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwb3J0YWwuCisgKiBAbWNfaW86CQlQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEBjb250YWluZXJfaWQ6CVJlcXVlc3RlZCBjb250YWluZXIgSUQKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbW5nX2dldF9jb250YWluZXJfaWQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIGludCAqY29udGFpbmVyX2lkKTsKKworI2VuZGlmIC8qIF9fRlNMX0RQTU5HX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcHJjLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHByYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxODYyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHByYy5oCkBAIC0wLDAgKzEsODAxIEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfRlNMX0RQUkNfSAorI2RlZmluZSBfRlNMX0RQUkNfSAorCisvKiBEYXRhIFBhdGggUmVzb3VyY2UgQ29udGFpbmVyIEFQSQorICogQ29udGFpbnMgRFBSQyBBUEkgZm9yIG1hbmFnaW5nIGFuZCBxdWVyeWluZyBEUEFBIHJlc291cmNlcworICovCisKK3N0cnVjdCBmc2xfbWNfaW87CisKKy8qKgorICogU2V0IHRoaXMgdmFsdWUgYXMgdGhlIGljaWQgdmFsdWUgaW4gZHByY19jZmcgc3RydWN0dXJlIHdoZW4gY3JlYXRpbmcgYQorICogY29udGFpbmVyLCBpbiBjYXNlIHRoZSBJQ0lEIGlzIG5vdCBzZWxlY3RlZCBieSB0aGUgdXNlciBhbmQgc2hvdWxkIGJlCisgKiBhbGxvY2F0ZWQgYnkgdGhlIERQUkMgZnJvbSB0aGUgcG9vbCBvZiBJQ0lEcy4KKyAqLworI2RlZmluZSBEUFJDX0dFVF9JQ0lEX0ZST01fUE9PTAkJCSh1aW50MTZfdCkofigwKSkKKworLyoqCisgKiBTZXQgdGhpcyB2YWx1ZSBhcyB0aGUgcG9ydGFsX2lkIHZhbHVlIGluIGRwcmNfY2ZnIHN0cnVjdHVyZSB3aGVuIGNyZWF0aW5nIGEKKyAqIGNvbnRhaW5lciwgaW4gY2FzZSB0aGUgcG9ydGFsIElEIGlzIG5vdCBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgYnkgdGhlCisgKiB1c2VyIGFuZCBzaG91bGQgYmUgYWxsb2NhdGVkIGJ5IHRoZSBEUFJDIGZyb20gdGhlIHBvb2wgb2YgcG9ydGFsIGlkcy4KKyAqLworI2RlZmluZSBEUFJDX0dFVF9QT1JUQUxfSURfRlJPTV9QT09MCShpbnQpKH4oMCkpCisKKy8qKgorICogZHByY19vcGVuKCkgLSBPcGVuIERQUkMgb2JqZWN0IGZvciB1c2UKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAY29udGFpbmVyX2lkOiBDb250YWluZXIgSUQgdG8gb3BlbgorICogQHRva2VuOglSZXR1cm5lZCB0b2tlbiBvZiBEUFJDIG9iamVjdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICoKKyAqIEB3YXJuaW5nCVJlcXVpcmVkIGJlZm9yZSBhbnkgb3BlcmF0aW9uIG9uIHRoZSBvYmplY3QuCisgKi8KK2ludCBkcHJjX29wZW4oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIGludCBjb250YWluZXJfaWQsIHVpbnQxNl90ICp0b2tlbik7CisKKy8qKgorICogZHByY19jbG9zZSgpIC0gQ2xvc2UgdGhlIGNvbnRyb2wgc2Vzc2lvbiBvZiB0aGUgb2JqZWN0CisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICoKKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBubyBmdXJ0aGVyIG9wZXJhdGlvbnMgYXJlCisgKiBhbGxvd2VkIG9uIHRoZSBvYmplY3Qgd2l0aG91dCBvcGVuaW5nIGEgbmV3IGNvbnRyb2wgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfY2xvc2Uoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKTsKKworLyoqCisgKiBDb250YWluZXIgZ2VuZXJhbCBvcHRpb25zCisgKgorICogVGhlc2Ugb3B0aW9ucyBtYXkgYmUgc2VsZWN0ZWQgYXQgY29udGFpbmVyIGNyZWF0aW9uIGJ5IHRoZSBjb250YWluZXIgY3JlYXRvcgorICogYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgZHByY19nZXRfYXR0cmlidXRlcygpCisgKi8KKworLyogU3Bhd24gUG9saWN5IE9wdGlvbiBhbGxvd2VkIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG5ldyBjb250YWluZXIgaXMgYWxsb3dlZAorICogdG8gc3Bhd24gYW5kIGhhdmUgaXRzIG93biBjaGlsZCBjb250YWluZXJzLgorICovCisjZGVmaW5lIERQUkNfQ0ZHX09QVF9TUEFXTl9BTExPV0VECQkweDAwMDAwMDAxCisKKy8qIEdlbmVyYWwgQ29udGFpbmVyIGFsbG9jYXRpb24gcG9saWN5IC0gSW5kaWNhdGVzIHRoYXQgdGhlIG5ldyBjb250YWluZXIgaXMKKyAqIGFsbG93ZWQgdG8gYWxsb2NhdGUgcmVxdWVzdGVkIHJlc291cmNlcyBmcm9tIGl0cyBwYXJlbnQgY29udGFpbmVyOyBpZiBub3QKKyAqIHNldCwgdGhlIGNvbnRhaW5lciBpcyBvbmx5IGFsbG93ZWQgdG8gdXNlIHJlc291cmNlcyBpbiBpdHMgb3duIHBvb2xzOyBOb3RlCisgKiB0aGF0IHRoaXMgaXMgYSBjb250YWluZXIncyBnbG9iYWwgcG9saWN5LCBidXQgdGhlIHBhcmVudCBjb250YWluZXIgbWF5CisgKiBvdmVycmlkZSBpdCBhbmQgc2V0IHNwZWNpZmljIHF1b3RhIHBlciByZXNvdXJjZSB0eXBlLgorICovCisjZGVmaW5lIERQUkNfQ0ZHX09QVF9BTExPQ19BTExPV0VECQkweDAwMDAwMDAyCisKKy8qIE9iamVjdCBpbml0aWFsaXphdGlvbiBhbGxvd2VkIC0gc29mdHdhcmUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcworICogY29udGFpbmVyIGlzIGFsbG93ZWQgdG8gaW52b2tlIG9iamVjdCBpbml0aWFsaXphdGlvbiBvcGVyYXRpb25zLgorICovCisjZGVmaW5lIERQUkNfQ0ZHX09QVF9PQkpfQ1JFQVRFX0FMTE9XRUQJMHgwMDAwMDAwNAorCisvKiBUb3BvbG9neSBjaGFuZ2UgYWxsb3dlZCAtIHNvZnR3YXJlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqIGNvbnRhaW5lciBpcyBhbGxvd2VkIHRvIGludm9rZSB0b3BvbG9neSBvcGVyYXRpb25zLCBzdWNoIGFzIGF0dGFjaC9kZXRhY2gKKyAqIG9mIG5ldHdvcmsgb2JqZWN0cy4KKyAqLworI2RlZmluZSBEUFJDX0NGR19PUFRfVE9QT0xPR1lfQ0hBTkdFU19BTExPV0VECTB4MDAwMDAwMDgKKworLyogSU9NTVUgYnlwYXNzIC0gaW5kaWNhdGVzIHdoZXRoZXIgb2JqZWN0cyBvZiB0aGlzIGNvbnRhaW5lciBhcmUgcGVybWl0dGVkCisgKiB0byBieXBhc3MgdGhlIElPTU1VLgorICovCisjZGVmaW5lIERQUkNfQ0ZHX09QVF9JT01NVV9CWVBBU1MJCTB4MDAwMDAwMTAKKworLyogQUlPUCAtIEluZGljYXRlcyB0aGF0IGNvbnRhaW5lciBiZWxvbmdzIHRvIEFJT1AuICAqLworI2RlZmluZSBEUFJDX0NGR19PUFRfQUlPUAkJCTB4MDAwMDAwMjAKKworLyoqCisgKiBzdHJ1Y3QgZHByY19jZmcgLSBDb250YWluZXIgY29uZmlndXJhdGlvbiBvcHRpb25zCisgKiBAaWNpZDogQ29udGFpbmVyJ3MgSUNJRDsgaWYgc2V0IHRvICdEUFJDX0dFVF9JQ0lEX0ZST01fUE9PTCcsIGEgZnJlZQorICoJCUlDSUQgdmFsdWUgaXMgYWxsb2NhdGVkIGJ5IHRoZSBEUFJDCisgKiBAcG9ydGFsX2lkOiBQb3J0YWwgSUQ7IGlmIHNldCB0byAnRFBSQ19HRVRfUE9SVEFMX0lEX0ZST01fUE9PTCcsIGEgZnJlZQorICoJCXBvcnRhbCBJRCBpcyBhbGxvY2F0ZWQgYnkgdGhlIERQUkMKKyAqIEBvcHRpb25zOiBDb21iaW5hdGlvbiBvZiAnRFBSQ19DRkdfT1BUXzxYPicgb3B0aW9ucworICovCitzdHJ1Y3QgZHByY19jZmcgeworCXVpbnQxNl90IGljaWQ7CisJaW50IHBvcnRhbF9pZDsKKwl1aW50NjRfdCBvcHRpb25zOworfTsKKworLyoqCisgKiBkcHJjX2NyZWF0ZV9jb250YWluZXIoKSAtIENyZWF0ZSBjaGlsZCBjb250YWluZXIKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAY2ZnOglDaGlsZCBjb250YWluZXIgY29uZmlndXJhdGlvbgorICogQGNoaWxkX2NvbnRhaW5lcl9pZDoJUmV0dXJuZWQgY2hpbGQgY29udGFpbmVyIElECisgKiBAY2hpbGRfcG9ydGFsX3BhZGRyOglSZXR1cm5lZCBiYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlCisgKgkJCQkJY2hpbGQgcG9ydGFsCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2NyZWF0ZV9jb250YWluZXIoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQkgIHVpbnQxNl90CQl0b2tlbiwKKwkJCSAgc3RydWN0IGRwcmNfY2ZnCSpjZmcsCisJCQkgIGludAkJCSpjaGlsZF9jb250YWluZXJfaWQsCisJCQkgIHVpbnQ2NF90CQkqY2hpbGRfcG9ydGFsX3BhZGRyKTsKKworLyoqCisgKiBkcHJjX2Rlc3Ryb3lfY29udGFpbmVyKCkgLSBEZXN0cm95IGNoaWxkIGNvbnRhaW5lci4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAY2hpbGRfY29udGFpbmVyX2lkOglJRCBvZiB0aGUgY29udGFpbmVyIHRvIGRlc3Ryb3kKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgdGhlIGNoaWxkIGNvbnRhaW5lciwgc28gZm9sbG93aW5nIHRoaXMgY2FsbCB0aGUKKyAqIGNoaWxkIGNvbnRhaW5lciBJRCBiZWNvbWVzIGludmFsaWQuCisgKgorICogTm90ZXM6CisgKiAtIEFsbCByZXNvdXJjZXMgYW5kIG9iamVjdHMgb2YgdGhlIGRlc3Ryb3llZCBjb250YWluZXIgYXJlIHJldHVybmVkIHRvIHRoZQorICogcGFyZW50IGNvbnRhaW5lciBvciBkZXN0cm95ZWQgaWYgd2VyZSBjcmVhdGVkIGJlIHRoZSBkZXN0cm95ZWQgY29udGFpbmVyLgorICogLSBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3kgYWxsIHRoZSBjaGlsZCBjb250YWluZXJzIG9mIHRoZSBzcGVjaWZpZWQKKyAqICAgY29udGFpbmVyIHByaW9yIHRvIGRlc3Ryb3lpbmcgdGhlIGNvbnRhaW5lciBpdHNlbGYuCisgKgorICogd2FybmluZzogT25seSB0aGUgcGFyZW50IGNvbnRhaW5lciBpcyBhbGxvd2VkIHRvIGRlc3Ryb3kgYSBjaGlsZCBwb2xpY3kKKyAqCQlDb250YWluZXIgMCBjYW4ndCBiZSBkZXN0cm95ZWQKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqCisgKi8KK2ludCBkcHJjX2Rlc3Ryb3lfY29udGFpbmVyKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJICAgdWludDE2X3QJCXRva2VuLAorCQkJICAgaW50CQkJY2hpbGRfY29udGFpbmVyX2lkKTsKKworLyoqCisgKiBkcHJjX3Jlc2V0X2NvbnRhaW5lciAtIFJlc2V0IGNoaWxkIGNvbnRhaW5lci4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAY2hpbGRfY29udGFpbmVyX2lkOglJRCBvZiB0aGUgY29udGFpbmVyIHRvIHJlc2V0CisgKgorICogSW4gY2FzZSBhIHNvZnR3YXJlIGNvbnRleHQgY3Jhc2hlcyBvciBiZWNvbWVzIG5vbi1yZXNwb25zaXZlLCB0aGUgcGFyZW50CisgKiBtYXkgd2lzaCB0byByZXNldCBpdHMgcmVzb3VyY2VzIGNvbnRhaW5lciBiZWZvcmUgdGhlIHNvZnR3YXJlIGNvbnRleHQgaXMKKyAqIHJlc3RhcnRlZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaW5mb3JtcyBhbGwgb2JqZWN0cyBhc3NpZ25lZCB0byB0aGUgY2hpbGQgY29udGFpbmVyIHRoYXQgdGhlCisgKiBjb250YWluZXIgaXMgYmVpbmcgcmVzZXQsIHNvIHRoZXkgbWF5IHBlcmZvcm0gYW55IGNsZWFudXAgb3BlcmF0aW9ucyB0aGF0IGFyZQorICogbmVlZGVkLiBBbGwgb2JqZWN0cyBoYW5kbGVzIHRoYXQgd2VyZSBvd25lZCBieSB0aGUgY2hpbGQgY29udGFpbmVyIHNoYWxsIGJlCisgKiBjbG9zZWQuCisgKgorICogTm90ZSB0aGF0IHN1Y2ggcmVxdWVzdCBtYXkgYmUgc3VibWl0dGVkIGV2ZW4gaWYgdGhlIGNoaWxkIHNvZnR3YXJlIGNvbnRleHQKKyAqIGhhcyBub3QgY3Jhc2hlZCwgYnV0IHRoZSByZXN1bHRpbmcgb2JqZWN0IGNsZWFudXAgb3BlcmF0aW9ucyB3aWxsIG5vdCBiZQorICogYXdhcmUgb2YgdGhhdC4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfcmVzZXRfY29udGFpbmVyKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJIHVpbnQxNl90IHRva2VuLAorCQkJIGludCBjaGlsZF9jb250YWluZXJfaWQpOworCisvKiBJUlEgKi8KKworLyogTnVtYmVyIG9mIGRwcmMncyBJUlFzICovCisjZGVmaW5lIERQUkNfTlVNX09GX0lSUVMJCTEKKworLyogT2JqZWN0IGlycSBldmVudHMgKi8KKworLyogSVJRIGV2ZW50IC0gSW5kaWNhdGVzIHRoYXQgYSBuZXcgb2JqZWN0IGFzc2lnbmVkIHRvIHRoZSBjb250YWluZXIgKi8KKyNkZWZpbmUgRFBSQ19JUlFfRVZFTlRfT0JKX0FEREVECQkweDAwMDAwMDAxCisvKiBJUlEgZXZlbnQgLSBJbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3Qgd2FzIHVuYXNzaWduZWQgZnJvbSB0aGUgY29udGFpbmVyICovCisjZGVmaW5lIERQUkNfSVJRX0VWRU5UX09CSl9SRU1PVkVECQkweDAwMDAwMDAyCisvKiBJUlEgZXZlbnQgLSBJbmRpY2F0ZXMgdGhhdCByZXNvdXJjZXMgYXNzaWduZWQgdG8gdGhlIGNvbnRhaW5lciAqLworI2RlZmluZSBEUFJDX0lSUV9FVkVOVF9SRVNfQURERUQJCTB4MDAwMDAwMDQKKy8qIElSUSBldmVudCAtIEluZGljYXRlcyB0aGF0IHJlc291cmNlcyB1bmFzc2lnbmVkIGZyb20gdGhlIGNvbnRhaW5lciAqLworI2RlZmluZSBEUFJDX0lSUV9FVkVOVF9SRVNfUkVNT1ZFRAkJMHgwMDAwMDAwOAorLyogSVJRIGV2ZW50IC0gSW5kaWNhdGVzIHRoYXQgb25lIG9mIHRoZSBkZXNjZW5kYW50IGNvbnRhaW5lcnMgdGhhdCBvcGVuZWQgYnkKKyAqIHRoaXMgY29udGFpbmVyIGlzIGRlc3Ryb3llZAorICovCisjZGVmaW5lIERQUkNfSVJRX0VWRU5UX0NPTlRBSU5FUl9ERVNUUk9ZRUQJMHgwMDAwMDAxMAorCisvKiBJUlEgZXZlbnQgLSBJbmRpY2F0ZXMgdGhhdCBvbiBvbmUgb2YgdGhlIGNvbnRhaW5lcidzIG9wZW5lZCBvYmplY3QgaXMKKyAqIGRlc3Ryb3llZAorICovCisjZGVmaW5lIERQUkNfSVJRX0VWRU5UX09CSl9ERVNUUk9ZRUQJCTB4MDAwMDAwMjAKKworLyogSXJxIGV2ZW50IC0gSW5kaWNhdGVzIHRoYXQgb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIGNvbnRhaW5lciAqLworI2RlZmluZSBEUFJDX0lSUV9FVkVOVF9PQkpfQ1JFQVRFRAkJMHgwMDAwMDA0MAorCisvKioKKyAqIGRwcmNfc2V0X2lycSgpIC0gU2V0IElSUSBpbmZvcm1hdGlvbiBmb3IgdGhlIERQUkMgdG8gdHJpZ2dlciBhbiBpbnRlcnJ1cHQuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGlycV9pbmRleDoJSWRlbnRpZmllcyB0aGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQGlycV9hZGRyOglBZGRyZXNzIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvCisgKgkJCXNpZ25hbCBhIG1lc3NhZ2UtYmFzZWQgaW50ZXJydXB0CisgKiBAaXJxX3ZhbDoJVmFsdWUgdG8gd3JpdGUgaW50byBpcnFfYWRkciBhZGRyZXNzCisgKiBAdXNlcl9pcnFfaWQ6IFJldHVybmVkIGEgdXNlciBkZWZpbmVkIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBJUlEKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfc2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJIHVpbnQxNl90CQl0b2tlbiwKKwkJIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJIHVpbnQ2NF90CQlpcnFfYWRkciwKKwkJIHVpbnQzMl90CQlpcnFfdmFsLAorCQkgaW50CQkJdXNlcl9pcnFfaWQpOworCisvKioKKyAqIGRwcmNfZ2V0X2lycSgpIC0gR2V0IElSUSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBEUFJDLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAdHlwZToJUmV0dXJuZWQgaW50ZXJydXB0IHR5cGU6IDAgcmVwcmVzZW50cyBtZXNzYWdlIGludGVycnVwdAorICoJCQl0eXBlIChib3RoIGlycV9hZGRyIGFuZCBpcnFfdmFsIGFyZSB2YWxpZCkKKyAqIEBpcnFfYWRkcjoJUmV0dXJuZWQgYWRkcmVzcyB0aGF0IG11c3QgYmUgd3JpdHRlbiB0bworICoJCQlzaWduYWwgdGhlIG1lc3NhZ2UtYmFzZWQgaW50ZXJydXB0CisgKiBAaXJxX3ZhbDoJVmFsdWUgdG8gd3JpdGUgaW50byBpcnFfYWRkciBhZGRyZXNzCisgKiBAdXNlcl9pcnFfaWQ6IEEgdXNlciBkZWZpbmVkIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBJUlEKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJIHVpbnQxNl90CQl0b2tlbiwKKwkJIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJIGludAkJCSp0eXBlLAorCQkgdWludDY0X3QJCSppcnFfYWRkciwKKwkJIHVpbnQzMl90CQkqaXJxX3ZhbCwKKwkJIGludAkJCSp1c2VyX2lycV9pZCk7CisKKy8qKgorICogZHByY19zZXRfaXJxX2VuYWJsZSgpIC0gU2V0IG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAZW46CQlJbnRlcnJ1cHQgc3RhdGUgLSBlbmFibGUgPSAxLCBkaXNhYmxlID0gMAorICoKKyAqIEFsbG93cyBHUFAgc29mdHdhcmUgdG8gY29udHJvbCB3aGVuIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZC4KKyAqIEVhY2ggaW50ZXJydXB0IGNhbiBoYXZlIHVwIHRvIDMyIGNhdXNlcy4gIFRoZSBlbmFibGUvZGlzYWJsZSBjb250cm9sJ3MgdGhlCisgKiBvdmVyYWxsIGludGVycnVwdCBzdGF0ZS4gaWYgdGhlIGludGVycnVwdCBpcyBkaXNhYmxlZCBubyBjYXVzZXMgd2lsbCBjYXVzZQorICogYW4gaW50ZXJydXB0LgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19zZXRfaXJxX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCXVpbnQxNl90CQl0b2tlbiwKKwkJCXVpbnQ4X3QJCQlpcnFfaW5kZXgsCisJCQl1aW50OF90CQkJZW4pOworCisvKioKKyAqIGRwcmNfZ2V0X2lycV9lbmFibGUoKSAtIEdldCBvdmVyYWxsIGludGVycnVwdCBzdGF0ZS4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAaXJxX2luZGV4OiAgVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBlbjoJCVJldHVybmVkIGludGVycnVwdCBzdGF0ZSAtIGVuYWJsZSA9IDEsIGRpc2FibGUgPSAwCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJdWludDE2X3QJCXRva2VuLAorCQkJdWludDhfdAkJCWlycV9pbmRleCwKKwkJCXVpbnQ4X3QJCQkqZW4pOworCisvKioKKyAqIGRwcmNfc2V0X2lycV9tYXNrKCkgLSBTZXQgaW50ZXJydXB0IG1hc2suCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBtYXNrOglldmVudCBtYXNrIHRvIHRyaWdnZXIgaW50ZXJydXB0OworICoJCQllYWNoIGJpdDoKKyAqCQkJCTAgPSBpZ25vcmUgZXZlbnQKKyAqCQkJCTEgPSBjb25zaWRlciBldmVudCBmb3IgYXNzZXJ0aW5nIGlycQorICoKKyAqIEV2ZXJ5IGludGVycnVwdCBjYW4gaGF2ZSB1cCB0byAzMiBjYXVzZXMgYW5kIHRoZSBpbnRlcnJ1cHQgbW9kZWwgc3VwcG9ydHMKKyAqIG1hc2tpbmcvdW5tYXNraW5nIGVhY2ggY2F1c2UgaW5kZXBlbmRlbnRseQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19zZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgdWludDhfdAkJaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdAkJbWFzayk7CisKKy8qKgorICogZHByY19nZXRfaXJxX21hc2soKSAtIEdldCBpbnRlcnJ1cHQgbWFzay4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQG1hc2s6CVJldHVybmVkIGV2ZW50IG1hc2sgdG8gdHJpZ2dlciBpbnRlcnJ1cHQKKyAqCisgKiBFdmVyeSBpbnRlcnJ1cHQgY2FuIGhhdmUgdXAgdG8gMzIgY2F1c2VzIGFuZCB0aGUgaW50ZXJydXB0IG1vZGVsIHN1cHBvcnRzCisgKiBtYXNraW5nL3VubWFza2luZyBlYWNoIGNhdXNlIGluZGVwZW5kZW50bHkKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X2lycV9tYXNrKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgICAgICB1aW50MTZfdAkJdG9rZW4sCisJCSAgICAgIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QJCSptYXNrKTsKKworLyoqCisgKiBkcHJjX2dldF9pcnFfc3RhdHVzKCkgLSBHZXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGFueSBwZW5kaW5nIGludGVycnVwdHMuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBzdGF0dXM6CVJldHVybmVkIGludGVycnVwdHMgc3RhdHVzIC0gb25lIGJpdCBwZXIgY2F1c2U6CisgKgkJCTAgPSBubyBpbnRlcnJ1cHQgcGVuZGluZworICoJCQkxID0gaW50ZXJydXB0IHBlbmRpbmcKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDMyX3QJCSpzdGF0dXMpOworCisvKioKKyAqIGRwcmNfY2xlYXJfaXJxX3N0YXR1cygpIC0gQ2xlYXIgYSBwZW5kaW5nIGludGVycnVwdCdzIHN0YXR1cworICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAc3RhdHVzOgliaXRzIHRvIGNsZWFyIChXMUMpIC0gb25lIGJpdCBwZXIgY2F1c2U6CisgKgkJCQkJMCA9IGRvbid0IGNoYW5nZQorICoJCQkJCTEgPSBjbGVhciBzdGF0dXMgYml0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2NsZWFyX2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQkgIHVpbnQxNl90CQl0b2tlbiwKKwkJCSAgdWludDhfdAkJaXJxX2luZGV4LAorCQkJICB1aW50MzJfdAkJc3RhdHVzKTsKKworLyoqCisgKiBzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzIC0gQ29udGFpbmVyIGF0dHJpYnV0ZXMKKyAqIEBjb250YWluZXJfaWQ6IENvbnRhaW5lcidzIElECisgKiBAaWNpZDogQ29udGFpbmVyJ3MgSUNJRAorICogQHBvcnRhbF9pZDogQ29udGFpbmVyJ3MgcG9ydGFsIElECisgKiBAb3B0aW9uczogQ29udGFpbmVyJ3Mgb3B0aW9ucyBhcyBzZXQgYXQgY29udGFpbmVyJ3MgY3JlYXRpb24KKyAqIEB2ZXJzaW9uOiBEUFJDIHZlcnNpb24KKyAqLworc3RydWN0IGRwcmNfYXR0cmlidXRlcyB7CisJaW50IGNvbnRhaW5lcl9pZDsKKwl1aW50MTZfdCBpY2lkOworCWludCBwb3J0YWxfaWQ7CisJdWludDY0X3Qgb3B0aW9uczsKKwkvKioKKwkgKiBzdHJ1Y3QgdmVyc2lvbiAtIERQUkMgdmVyc2lvbgorCSAqIEBtYWpvcjogRFBSQyBtYWpvciB2ZXJzaW9uCisJICogQG1pbm9yOiBEUFJDIG1pbm9yIHZlcnNpb24KKwkgKi8KKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBtYWpvcjsKKwkJdWludDE2X3QgbWlub3I7CisJfSB2ZXJzaW9uOworfTsKKworLyoqCisgKiBkcHJjX2dldF9hdHRyaWJ1dGVzKCkgLSBPYnRhaW5zIGNvbnRhaW5lciBhdHRyaWJ1dGVzCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGF0dHJpYnV0ZXMJUmV0dXJuZWQgY29udGFpbmVyIGF0dHJpYnV0ZXMKKyAqCisgKiBSZXR1cm46ICAgICAnMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9hdHRyaWJ1dGVzKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJdWludDE2X3QJCXRva2VuLAorCQkJc3RydWN0IGRwcmNfYXR0cmlidXRlcwkqYXR0cmlidXRlcyk7CisKKy8qKgorICogZHByY19zZXRfcmVzX3F1b3RhKCkgLSBTZXQgYWxsb2NhdGlvbiBwb2xpY3kgZm9yIGEgc3BlY2lmaWMgcmVzb3VyY2Uvb2JqZWN0CisgKgkJdHlwZSBpbiBhIGNoaWxkIGNvbnRhaW5lcgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBjaGlsZF9jb250YWluZXJfaWQ6CUlEIG9mIHRoZSBjaGlsZCBjb250YWluZXIKKyAqIEB0eXBlOglSZXNvdXJjZS9vYmplY3QgdHlwZQorICogQHF1b3RhOglTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvdXJjZXMgb2YJdGhlIHNlbGVjdGVkIHR5cGUKKyAqCQl0aGF0IHRoZSBjaGlsZCBjb250YWluZXIgaXMgYWxsb3dlZCB0byBhbGxvY2F0ZSBmcm9tIGl0cyBwYXJlbnQ7CisgKgkJd2hlbiBxdW90YSBpcyBzZXQgdG8gLTEsIHRoZSBwb2xpY3kgaXMgdGhlIHNhbWUgYXMgY29udGFpbmVyJ3MKKyAqCQlnZW5lcmFsIHBvbGljeS4KKyAqCisgKiBBbGxvY2F0aW9uIHBvbGljeSBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgY29udGFpbmVyIG1heSBhbGxvY2F0ZQorICogcmVzb3VyY2VzIGZyb20gaXRzIHBhcmVudC4gRWFjaCBjb250YWluZXIgaGFzIGEgJ2dsb2JhbCcgYWxsb2NhdGlvbiBwb2xpY3kKKyAqIHRoYXQgaXMgc2V0IHdoZW4gdGhlIGNvbnRhaW5lciBpcyBjcmVhdGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBhbGxvY2F0aW9uIHBvbGljeSBmb3IgYSBzcGVjaWZpYyByZXNvdXJjZSB0eXBlLgorICogVGhlIGRlZmF1bHQgcG9saWN5IGZvciBhbGwgcmVzb3VyY2UgdHlwZXMgbWF0Y2hlcyB0aGUgY29udGFpbmVyJ3MgJ2dsb2JhbCcKKyAqIGFsbG9jYXRpb24gcG9saWN5LgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICoKKyAqIEB3YXJuaW5nCU9ubHkgdGhlIHBhcmVudCBjb250YWluZXIgaXMgYWxsb3dlZCB0byBjaGFuZ2UgYSBjaGlsZCBwb2xpY3kuCisgKi8KK2ludCBkcHJjX3NldF9yZXNfcXVvdGEoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgICAgICB1aW50MTZfdAkJdG9rZW4sCisJCSAgICAgICBpbnQJCWNoaWxkX2NvbnRhaW5lcl9pZCwKKwkJICAgICAgIGNoYXIJCSp0eXBlLAorCQkgICAgICAgdWludDE2X3QJCXF1b3RhKTsKKworLyoqCisgKiBkcHJjX2dldF9yZXNfcXVvdGEoKSAtIEdldHMgdGhlIGFsbG9jYXRpb24gcG9saWN5IG9mIGEgc3BlY2lmaWMKKyAqCQlyZXNvdXJjZS9vYmplY3QgdHlwZSBpbiBhIGNoaWxkIGNvbnRhaW5lcgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBjaGlsZF9jb250YWluZXJfaWQ7CUlEIG9mIHRoZSBjaGlsZCBjb250YWluZXIKKyAqIEB0eXBlOglyZXNvdXJjZS9vYmplY3QgdHlwZQorICogQHF1b3RhOglSZXR1cm5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVzb3VyY2VzIG9mIHRoZSBzZWxlY3RlZCB0eXBlCisgKgkJdGhhdCB0aGUgY2hpbGQgY29udGFpbmVyIGlzIGFsbG93ZWQgdG8gYWxsb2NhdGUgZnJvbSB0aGUgcGFyZW50OworICoJCXdoZW4gcXVvdGEgaXMgc2V0IHRvIC0xLCB0aGUgcG9saWN5IGlzIHRoZSBzYW1lIGFzIGNvbnRhaW5lcidzCisgKgkJZ2VuZXJhbCBwb2xpY3kuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9yZXNfcXVvdGEoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgICAgICB1aW50MTZfdAkJdG9rZW4sCisJCSAgICAgICBpbnQJCWNoaWxkX2NvbnRhaW5lcl9pZCwKKwkJICAgICAgIGNoYXIJCSp0eXBlLAorCQkgICAgICAgdWludDE2X3QJCSpxdW90YSk7CisKKy8qIFJlc291cmNlIHJlcXVlc3Qgb3B0aW9ucyAqLworCisvKiBFeHBsaWNpdCByZXNvdXJjZSBJRCByZXF1ZXN0IC0gVGhlIHJlcXVlc3RlZCBvYmplY3RzL3Jlc291cmNlcworICogYXJlIGV4cGxpY2l0IGFuZCBzZXF1ZW50aWFsIChpbiBjYXNlIG9mIHJlc291cmNlcykuCisgKiBUaGUgYmFzZSBJRCBpcyBnaXZlbiBhdCByZXNfcmVxIGF0IGJhc2VfYWxpZ24gZmllbGQKKyAqLworI2RlZmluZSBEUFJDX1JFU19SRVFfT1BUX0VYUExJQ0lUCQkweDAwMDAwMDAxCisKKy8qIEFsaWduZWQgcmVzb3VyY2VzIHJlcXVlc3QgLSBSZWxldmFudCBvbmx5IGZvciByZXNvdXJjZXMKKyAqIHJlcXVlc3QgKGFuZCBub3Qgb2JqZWN0cykuIEluZGljYXRlcyB0aGF0IHJlc291cmNlcyBiYXNlIElEIHNob3VsZCBiZQorICogc2VxdWVudGlhbCBhbmQgYWxpZ25lZCB0byB0aGUgdmFsdWUgZ2l2ZW4gYXQgZHByY19yZXNfcmVxIGJhc2VfYWxpZ24gZmllbGQKKyAqLworI2RlZmluZSBEUFJDX1JFU19SRVFfT1BUX0FMSUdORUQJCTB4MDAwMDAwMDIKKworLyogUGx1Z2dlZCBGbGFnIC0gUmVsZXZhbnQgb25seSBmb3Igb2JqZWN0IGFzc2lnbm1lbnQgcmVxdWVzdC4KKyAqIEluZGljYXRlcyB0aGF0IGFmdGVyIGFsbCBvYmplY3RzIGFzc2lnbmVkLiBBbiBpbnRlcnJ1cHQgd2lsbCBiZSBpbnZva2VkIGF0CisgKiB0aGUgcmVsZXZhbnQgR1BQLiBUaGUgYXNzaWduZWQgb2JqZWN0IHdpbGwgYmUgbWFya2VkIGFzIHBsdWdnZWQuCisgKiBwbHVnZ2VkIG9iamVjdHMgY2FuJ3QgYmUgYXNzaWduZWQgZnJvbSB0aGVpciBjb250YWluZXIKKyAqLworI2RlZmluZSBEUFJDX1JFU19SRVFfT1BUX1BMVUdHRUQJCTB4MDAwMDAwMDQKKworLyoqCisgKiBzdHJ1Y3QgZHByY19yZXNfcmVxIC0gUmVzb3VyY2UgcmVxdWVzdCBkZXNjcmlwdG9yLCB0byBiZSB1c2VkIGluIGFzc2lnbm1lbnQKKyAqCQkJb3IgdW4tYXNzaWdubWVudCBvZiByZXNvdXJjZXMgYW5kIG9iamVjdHMuCisgKiBAdHlwZTogUmVzb3VyY2Uvb2JqZWN0IHR5cGU6IFJlcHJlc2VudCBhcyBhIE5VTEwgdGVybWluYXRlZCBzdHJpbmcuCisgKglUaGlzIHN0cmluZyBtYXkgcmVjZWl2ZWQgYnkgdXNpbmcgZHByY19nZXRfcG9vbCgpIHRvIGdldCByZXNvdXJjZQorICoJdHlwZSBhbmQgZHByY19nZXRfb2JqKCkgdG8gZ2V0IG9iamVjdCB0eXBlOworICoJTm90ZTogaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFzc2lnbi91bi1hc3NpZ24gRFBSQyBvYmplY3RzCisgKiBAbnVtOiBOdW1iZXIgb2YgcmVzb3VyY2VzCisgKiBAb3B0aW9uczogUmVxdWVzdCBvcHRpb25zOiBjb21iaW5hdGlvbiBvZiBEUFJDX1JFU19SRVFfT1BUXyBvcHRpb25zCisgKiBAaWRfYmFzZV9hbGlnbjogSW4gY2FzZSBvZiBleHBsaWNpdCBhc3NpZ25tZW50IChEUFJDX1JFU19SRVFfT1BUX0VYUExJQ0lUCisgKgkJaXMgc2V0IGF0IG9wdGlvbiksIHRoaXMgZmllbGQgcmVwcmVzZW50cyB0aGUgcmVxdWlyZWQgYmFzZSBJRAorICoJCWZvciByZXNvdXJjZSBhbGxvY2F0aW9uOyBJbiBjYXNlIG9mIGFsaWduZWQgYXNzaWdubWVudAorICoJCShEUFJDX1JFU19SRVFfT1BUX0FMSUdORUQgaXMgc2V0IGF0IG9wdGlvbiksIHRoaXMgZmllbGQKKyAqCQlpbmRpY2F0ZXMgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhlIHJlc291cmNlIElEKHMpIC0KKyAqCQl1c2UgMCBpZiB0aGVyZSBpcyBubyBhbGlnbm1lbnQgb3IgZXhwbGljaXQgSUQgcmVxdWlyZW1lbnRzCisgKi8KK3N0cnVjdCBkcHJjX3Jlc19yZXEgeworCWNoYXIgdHlwZVsxNl07CisJdWludDMyX3QgbnVtOworCXVpbnQzMl90IG9wdGlvbnM7CisJaW50IGlkX2Jhc2VfYWxpZ247Cit9OworCisvKioKKyAqIGRwcmNfYXNzaWduKCkgLSBBc3NpZ25zIG9iamVjdHMgb3IgcmVzb3VyY2UgdG8gYSBjaGlsZCBjb250YWluZXIuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGNvbnRhaW5lcl9pZDogSUQgb2YgdGhlIGNoaWxkIGNvbnRhaW5lcgorICogQHJlc19yZXE6CURlc2NyaWJlcyB0aGUgdHlwZSBhbmQgYW1vdW50IG9mIHJlc291cmNlcyB0bworICoJCQlhc3NpZ24gdG8gdGhlIGdpdmVuIGNvbnRhaW5lcgorICoKKyAqIEFzc2lnbm1lbnQgaXMgdXN1YWxseSBkb25lIGJ5IGEgcGFyZW50ICh0aGlzIERQUkMpIHRvIG9uZSBvZiBpdHMgY2hpbGQKKyAqIGNvbnRhaW5lcnMuCisgKgorICogQWNjb3JkaW5nIHRvIHRoZSBEUFJDIGFsbG9jYXRpb24gcG9saWN5LCB0aGUgYXNzaWduZWQgcmVzb3VyY2VzIG1heSBiZSB0YWtlbgorICogKGFsbG9jYXRlZCkgZnJvbSB0aGUgY29udGFpbmVyJ3MgYW5jZXN0b3JzLCBpZiBub3QgZW5vdWdoIHJlc291cmNlcyBhcmUKKyAqIGF2YWlsYWJsZSBpbiB0aGUgY29udGFpbmVyIGl0c2VsZi4KKyAqCisgKiBUaGUgdHlwZSBvZiBhc3NpZ25tZW50IGRlcGVuZHMgb24gdGhlIGRwcmNfcmVzX3JlcSBvcHRpb25zLCBhcyBmb2xsb3dzOgorICogLSBEUFJDX1JFU19SRVFfT1BUX0VYUExJQ0lUOiBpbmRpY2F0ZXMgdGhhdCBhc3NpZ25lZCByZXNvdXJjZXMgc2hvdWxkIGhhdmUKKyAqICAgdGhlIGV4cGxpY2l0IGJhc2UgSUQgc3BlY2lmaWVkIGF0IHRoZSBpZF9iYXNlX2FsaWduIGZpZWxkIG9mIHJlc19yZXEuCisgKiAtIERQUkNfUkVTX1JFUV9PUFRfQUxJR05FRDogaW5kaWNhdGVzIHRoYXQgdGhlIGFzc2lnbmVkIHJlc291cmNlcyBzaG91bGQgYmUKKyAqICAgYWxpZ25lZCB0byB0aGUgdmFsdWUgZ2l2ZW4gYXQgaWRfYmFzZV9hbGlnbiBmaWVsZCBvZiByZXNfcmVxLgorICogLSBEUFJDX1JFU19SRVFfT1BUX1BMVUdHRUQ6IFJlbGV2YW50IG9ubHkgZm9yIG9iamVjdCBhc3NpZ25tZW50LAorICogICBhbmQgaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBtdXN0IGJlIHNldCB0byB0aGUgcGx1Z2dlZCBzdGF0ZS4KKyAqCisgKiBBIGNvbnRhaW5lciBtYXkgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBpdHMgb3duIElEIGluIG9yZGVyIHRvIGNoYW5nZSBhCisgKiBvYmplY3Qgc3RhdGUgdG8gcGx1Z2dlZCBvciB1bnBsdWdnZWQuCisgKgorICogSWYgSVJRIGluZm9ybWF0aW9uIGhhcyBiZWVuIHNldCBpbiB0aGUgY2hpbGQgRFBSQywgaXQgd2lsbCBzaWduYWwgYW4KKyAqIGludGVycnVwdCBmb2xsb3dpbmcgZXZlcnkgY2hhbmdlIGluIGl0cyBvYmplY3QgYXNzaWdubWVudC4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfYXNzaWduKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQl1aW50MTZfdAkJdG9rZW4sCisJCWludAkJCWNvbnRhaW5lcl9pZCwKKwkJc3RydWN0IGRwcmNfcmVzX3JlcQkqcmVzX3JlcSk7CisKKy8qKgorICogZHByY191bmFzc2lnbigpIC0gVW4tYXNzaWducyBvYmplY3RzIG9yIHJlc291cmNlcyBmcm9tIGEgY2hpbGQgY29udGFpbmVyCisgKgkJYW5kIG1vdmVzIHRoZW0gaW50byB0aGlzIChwYXJlbnQpIERQUkMuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGNoaWxkX2NvbnRhaW5lcl9pZDoJSUQgb2YgdGhlIGNoaWxkIGNvbnRhaW5lcgorICogQHJlc19yZXE6CURlc2NyaWJlcyB0aGUgdHlwZSBhbmQgYW1vdW50IG9mIHJlc291cmNlcyB0byB1bi1hc3NpZ24gZnJvbQorICoJCXRoZSBjaGlsZCBjb250YWluZXIKKyAqCisgKiBVbi1hc3NpZ25tZW50IG9mIG9iamVjdHMgY2FuIHN1Y2NlZWQgb25seSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUKKyAqIHBsdWdnZWQgb3Igb3BlbmVkIHN0YXRlLgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY191bmFzc2lnbihzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICB1aW50MTZfdAkJdG9rZW4sCisJCSAgaW50CQkJY2hpbGRfY29udGFpbmVyX2lkLAorCQkgIHN0cnVjdCBkcHJjX3Jlc19yZXEJKnJlc19yZXEpOworCisvKioKKyAqIGRwcmNfZ2V0X3Bvb2xfY291bnQoKSAtIEdldCB0aGUgbnVtYmVyIG9mIGRwcmMncyBwb29scworICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBwb29sX2NvdW50OglSZXR1cm5lZCBudW1iZXIgb2YgcmVzb3VyY2UgcG9vbHMgaW4gdGhlIGRwcmMKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X3Bvb2xfY291bnQoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQlpbnQJCQkqcG9vbF9jb3VudCk7CisKKy8qKgorICogZHByY19nZXRfcG9vbCgpIC0gR2V0IHRoZSB0eXBlIChzdHJpbmcpIG9mIGEgY2VydGFpbiBkcHJjJ3MgcG9vbAorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBwb29sX2luZGV4OwlJbmRleCBvZiB0aGUgcG9vbCB0byBiZSBxdWVyaWVkICg8IHBvb2xfY291bnQpCisgKiBAdHlwZToJVGhlIHR5cGUgb2YgdGhlIHBvb2wKKyAqCisgKiBUaGUgcG9vbCB0eXBlcyByZXRyaWV2ZWQgb25lIGJ5IG9uZSBieSBpbmNyZW1lbnRpbmcKKyAqIHBvb2xfaW5kZXggdXAgdG8gKG5vdCBpbmNsdWRpbmcpIHRoZSB2YWx1ZSBvZiBwb29sX2NvdW50IHJldHVybmVkCisgKiBmcm9tIGRwcmNfZ2V0X3Bvb2xfY291bnQoKS4gZHByY19nZXRfcG9vbF9jb3VudCgpIG11c3QKKyAqIGJlIGNhbGxlZCBwcmlvciB0byBkcHJjX2dldF9wb29sKCkuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9wb29sKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgIHVpbnQxNl90CQl0b2tlbiwKKwkJICBpbnQJCQlwb29sX2luZGV4LAorCQkgIGNoYXIJCQkqdHlwZSk7CisKKy8qKgorICogZHByY19nZXRfb2JqX2NvdW50KCkgLSBPYnRhaW5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgRFBSQworICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBvYmpfY291bnQ6CU51bWJlciBvZiBvYmplY3RzIGFzc2lnbmVkIHRvIHRoZSBEUFJDCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9vYmpfY291bnQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuLCBpbnQgKm9ial9jb3VudCk7CisKKy8qIE9iamVjdHMgQXR0cmlidXRlcyBGbGFncyAqLworCisvKiBPcGVuZWQgc3RhdGUgLSBJbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3QgaXMgb3BlbiBieSBhdCBsZWFzdCBvbmUgb3duZXIgKi8KKyNkZWZpbmUgRFBSQ19PQkpfU1RBVEVfT1BFTgkJMHgwMDAwMDAwMQorLyogUGx1Z2dlZCBzdGF0ZSAtIEluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgaXMgcGx1Z2dlZCAqLworI2RlZmluZSBEUFJDX09CSl9TVEFURV9QTFVHR0VECQkweDAwMDAwMDAyCisKKy8qKgorICogc3RydWN0IGRwcmNfb2JqX2Rlc2MgLSBPYmplY3QgZGVzY3JpcHRvciwgcmV0dXJuZWQgZnJvbSBkcHJjX2dldF9vYmooKQorICogQHR5cGU6IFR5cGUgb2Ygb2JqZWN0OiBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nCisgKiBAaWQ6IElEIG9mIGxvZ2ljYWwgb2JqZWN0IHJlc291cmNlCisgKiBAdmVuZG9yOiBPYmplY3QgdmVuZG9yIGlkZW50aWZpZXIKKyAqIEB2ZXJfbWFqb3I6IE1ham9yIHZlcnNpb24gbnVtYmVyCisgKiBAdmVyX21pbm9yOiAgTWlub3IgdmVyc2lvbiBudW1iZXIKKyAqIEBpcnFfY291bnQ6IE51bWJlciBvZiBpbnRlcnJ1cHRzIHN1cHBvcnRlZCBieSB0aGUgb2JqZWN0CisgKiBAcmVnaW9uX2NvdW50OiBOdW1iZXIgb2YgbWFwcGFibGUgcmVnaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIG9iamVjdAorICogQHN0YXRlOiBPYmplY3Qgc3RhdGU6IGNvbWJpbmF0aW9uIG9mIERQUkNfT0JKX1NUQVRFXyBzdGF0ZXMKKyAqLworc3RydWN0IGRwcmNfb2JqX2Rlc2MgeworCWNoYXIgdHlwZVsxNl07CisJaW50IGlkOworCXVpbnQxNl90IHZlbmRvcjsKKwl1aW50MTZfdCB2ZXJfbWFqb3I7CisJdWludDE2X3QgdmVyX21pbm9yOworCXVpbnQ4X3QgaXJxX2NvdW50OworCXVpbnQ4X3QgcmVnaW9uX2NvdW50OworCXVpbnQzMl90IHN0YXRlOworfTsKKworLyoqCisgKiBkcHJjX2dldF9vYmooKSAtIEdldCBnZW5lcmFsIGluZm9ybWF0aW9uIG9uIGFuIG9iamVjdAorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBvYmpfaW5kZXg6CUluZGV4IG9mIHRoZSBvYmplY3QgdG8gYmUgcXVlcmllZCAoPCBvYmpfY291bnQpCisgKiBAb2JqX2Rlc2M6CVJldHVybnMgdGhlIHJlcXVlc3RlZCBvYmplY3QgZGVzY3JpcHRvcgorICoKKyAqIFRoZSBvYmplY3QgZGVzY3JpcHRvcnMgYXJlIHJldHJpZXZlZCBvbmUgYnkgb25lIGJ5IGluY3JlbWVudGluZworICogb2JqX2luZGV4IHVwIHRvIChub3QgaW5jbHVkaW5nKSB0aGUgdmFsdWUgb2Ygb2JqX2NvdW50IHJldHVybmVkCisgKiBmcm9tIGRwcmNfZ2V0X29ial9jb3VudCgpLiBkcHJjX2dldF9vYmpfY291bnQoKSBtdXN0CisgKiBiZSBjYWxsZWQgcHJpb3IgdG8gZHByY19nZXRfb2JqKCkuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9vYmooc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSB1aW50MTZfdAkJdG9rZW4sCisJCSBpbnQJCQlvYmpfaW5kZXgsCisJCSBzdHJ1Y3QgZHByY19vYmpfZGVzYwkqb2JqX2Rlc2MpOworCisvKioKKyAqIGRwcmNfZ2V0X3Jlc19jb3VudCgpIC0gT2J0YWlucyB0aGUgbnVtYmVyIG9mIGZyZWUgcmVzb3VyY2VzIHRoYXQgYXJlIGFzc2lnbmVkCisgKgkJdG8gdGhpcyBjb250YWluZXIsIGJ5IHBvb2wgdHlwZQorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEB0eXBlOglwb29sIHR5cGUKKyAqIEByZXNfY291bnQ6CVJldHVybmVkIG51bWJlciBvZiBmcmVlIHJlc291cmNlcyBvZiB0aGUgZ2l2ZW4KKyAqCQkJcmVzb3VyY2UgdHlwZSB0aGF0IGFyZSBhc3NpZ25lZCB0byB0aGlzIERQUkMKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X3Jlc19jb3VudChzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgIGNoYXIJCSp0eXBlLAorCQkgICAgICAgaW50CQkqcmVzX2NvdW50KTsKKworLyoqCisgKiBlbnVtIGRwcmNfaXRlcl9zdGF0dXMgLSBJdGVyYXRpb24gc3RhdHVzCisgKiBARFBSQ19JVEVSX1NUQVRVU19GSVJTVDogUGVyZm9ybSBmaXJzdCBpdGVyYXRpb24KKyAqIEBEUFJDX0lURVJfU1RBVFVTX01PUkU6IEluZGljYXRlcyBtb3JlL25leHQgaXRlcmF0aW9uIGlzIG5lZWRlZAorICogQERQUkNfSVRFUl9TVEFUVVNfTEFTVDogSW5kaWNhdGVzIGxhc3QgaXRlcmF0aW9uCisgKi8KK2VudW0gZHByY19pdGVyX3N0YXR1cyB7CisJRFBSQ19JVEVSX1NUQVRVU19GSVJTVCA9IDAsCisJRFBSQ19JVEVSX1NUQVRVU19NT1JFID0gMSwKKwlEUFJDX0lURVJfU1RBVFVTX0xBU1QgPSAyCit9OworCisvKioKKyAqIHN0cnVjdCBkcHJjX3Jlc19pZHNfcmFuZ2VfZGVzYyAtIFJlc291cmNlIElEIHJhbmdlIGRlc2NyaXB0b3IKKyAqIEBiYXNlX2lkOiBCYXNlIHJlc291cmNlIElEIG9mIHRoaXMgcmFuZ2UKKyAqIEBsYXN0X2lkOiBMYXN0IHJlc291cmNlIElEIG9mIHRoaXMgcmFuZ2UKKyAqIEBpdGVyX3N0YXR1czogSXRlcmF0aW9uIHN0YXR1cyAtIHNob3VsZCBiZSBzZXQgdG8gRFBSQ19JVEVSX1NUQVRVU19GSVJTVCBhdAorICoJZmlyc3QgaXRlcmF0aW9uOyB3aGlsZSB0aGUgcmV0dXJuZWQgbWFya2VyIGlzIERQUkNfSVRFUl9TVEFUVVNfTU9SRSwKKyAqCWFkZGl0aW9uYWwgaXRlcmF0aW9ucyBhcmUgbmVlZGVkLCB1bnRpbCB0aGUgcmV0dXJuZWQgbWFya2VyIGlzCisgKglEUFJDX0lURVJfU1RBVFVTX0xBU1QKKyAqLworc3RydWN0IGRwcmNfcmVzX2lkc19yYW5nZV9kZXNjIHsKKwlpbnQgYmFzZV9pZDsKKwlpbnQgbGFzdF9pZDsKKwllbnVtIGRwcmNfaXRlcl9zdGF0dXMgaXRlcl9zdGF0dXM7Cit9OworCisvKioKKyAqIGRwcmNfZ2V0X3Jlc19pZHMoKSAtIE9idGFpbnMgSURzIG9mIGZyZWUgcmVzb3VyY2VzIGluIHRoZSBjb250YWluZXIKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAdHlwZToJcG9vbCB0eXBlCisgKiBAcmFuZ2VfZGVzYzoJcmFuZ2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19nZXRfcmVzX2lkcyhzdHJ1Y3QgZnNsX21jX2lvCQkJKm1jX2lvLAorCQkgICAgIHVpbnQxNl90CQkJCXRva2VuLAorCQkgICAgIGNoYXIJCQkJKnR5cGUsCisJCSAgICAgc3RydWN0IGRwcmNfcmVzX2lkc19yYW5nZV9kZXNjCSpyYW5nZV9kZXNjKTsKKworLyoqCisgKiBkcHJjX2dldF9wb3J0YWxfcGFkZHIoKSAtIEdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBNQyBwb3J0YWxzCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQHBvcnRhbF9pZDoJTUMgcG9ydGFsIElECisgKiBAcG9ydGFsX2FkZHI6IFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNQyBwb3J0YWwgSUQKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X3BvcnRhbF9wYWRkcihzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSAgdWludDE2X3QJCXRva2VuLAorCQkJICBpbnQJCQlwb3J0YWxfaWQsCisJCQkgIHVpbnQ2NF90CQkqcG9ydGFsX2FkZHIpOworCisvKioKKyAqIHN0cnVjdCBkcHJjX3JlZ2lvbl9kZXNjIC0gTWFwcGFibGUgcmVnaW9uIGRlc2NyaXB0b3IKKyAqIEBiYXNlX3BhZGRyOiBSZWdpb24gYmFzZSBwaHlzaWNhbCBhZGRyZXNzCisgKiBAc2l6ZTogUmVnaW9uIHNpemUgKGluIGJ5dGVzKQorICovCitzdHJ1Y3QgZHByY19yZWdpb25fZGVzYyB7CisJdWludDY0X3QgYmFzZV9wYWRkcjsKKwl1aW50MzJfdCBzaXplOworfTsKKworLyoqCisgKiBkcHJjX2dldF9vYmpfcmVnaW9uKCkgLSBHZXQgcmVnaW9uIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmllZCBvYmplY3QuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQG9ial90eXBlOwlPYmplY3QgdHlwZSBhcyByZXR1cm5lZCBpbiBkcHJjX2dldF9vYmooKQorICogQG9ial9pZDoJVW5pcXVlIG9iamVjdCBpbnN0YW5jZSBhcyByZXR1cm5lZCBpbiBkcHJjX2dldF9vYmooKQorICogQHJlZ2lvbl9pbmRleDogVGhlIHNwZWNpZmljIHJlZ2lvbiB0byBxdWVyeQorICogQHJlZ2lvbl9kZXNjOiAgUmV0dXJucyB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9vYmpfcmVnaW9uKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJdWludDE2X3QJCXRva2VuLAorCQkJY2hhcgkJCSpvYmpfdHlwZSwKKwkJCWludAkJCW9ial9pZCwKKwkJCXVpbnQ4X3QJCQlyZWdpb25faW5kZXgsCisJCQlzdHJ1Y3QgZHByY19yZWdpb25fZGVzYwkqcmVnaW9uX2Rlc2MpOworCisvKioKKyAqIHN0cnVjdCBkcHJjX2VuZHBvaW50IC0gRW5kcG9pbnQgZGVzY3JpcHRpb24gZm9yIGxpbmsgY29ubmVjdC9kaXNjb25uZWN0CisgKgkJCW9wZXJhdGlvbnMKKyAqIEB0eXBlOiBFbmRwb2ludCBvYmplY3QgdHlwZTogTlVMTCB0ZXJtaW5hdGVkIHN0cmluZworICogQGlkOiBFbmRwb2ludCBvYmplY3QgSUQKKyAqIEBpbnRlcmZhY2VfaWQ6IEludGVyZmFjZSBJRDsgc2hvdWxkIGJlIHNldCBmb3IgZW5kcG9pbnRzIHdpdGggbXVsdGlwbGUKKyAqCQlpbnRlcmZhY2VzICgiZHBzdyIsICJkcGRtdXgiKTsgZm9yIG90aGVycywgYWx3YXlzIHNldCB0byAwCisgKi8KK3N0cnVjdCBkcHJjX2VuZHBvaW50IHsKKwljaGFyIHR5cGVbMTZdOworCWludCBpZDsKKwlpbnQgaW50ZXJmYWNlX2lkOworfTsKKworLyoqCisgKiBkcHJjX2Nvbm5lY3QoKSAtIENvbm5lY3QgdHdvIGVuZHBvaW50cyB0byBjcmVhdGUgYSBuZXR3b3JrIGxpbmsgYmV0d2VlbiB0aGVtCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGVuZHBvaW50MToJRW5kcG9pbnQgMSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqIEBlbmRwb2ludDI6CUVuZHBvaW50IDIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2Nvbm5lY3Qoc3RydWN0IGZzbF9tY19pbwkJKm1jX2lvLAorCQkgdWludDE2X3QJCQl0b2tlbiwKKwkJIGNvbnN0IHN0cnVjdCBkcHJjX2VuZHBvaW50CSplbmRwb2ludDEsCisJCSBjb25zdCBzdHJ1Y3QgZHByY19lbmRwb2ludAkqZW5kcG9pbnQyKTsKKworLyoqCisgKiBkcHJjX2Rpc2Nvbm5lY3QoKSAtIERpc2Nvbm5lY3Qgb25lIGVuZHBvaW50IHRvIHJlbW92ZSBpdHMgbmV0d29yayBjb25uZWN0aW9uCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGVuZHBvaW50OglFbmRwb2ludCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZGlzY29ubmVjdChzdHJ1Y3QgZnNsX21jX2lvCQkqbWNfaW8sCisJCSAgICB1aW50MTZfdAkJCXRva2VuLAorCQkgICAgY29uc3Qgc3RydWN0IGRwcmNfZW5kcG9pbnQJKmVuZHBvaW50KTsKKworLyoqCisqIGRwcmNfZ2V0X2Nvbm5lY3Rpb24oKSAtIEdldCBjb25uZWN0ZWQgZW5kcG9pbnQgYW5kIGxpbmsgc3RhdHVzIGlmIGNvbm5lY3Rpb24KKyoJCQlleGlzdHMuCisqIEBtY19pbwkJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisqIEB0b2tlbgkJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyogQGVuZHBvaW50MQlFbmRwb2ludCAxIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworKiBAZW5kcG9pbnQyCVJldHVybmVkIGVuZHBvaW50IDIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisqIEBzdGF0ZToJUmV0dXJuZWQgbGluayBzdGF0ZTogMSAtIGxpbmsgaXMgdXAsIDAgLSBsaW5rIGlzIGRvd24KKyoKKyogUmV0dXJuOiAgICAgJzAnIG9uIFN1Y2Nlc3M7IC1FTkFWQUlMIGlmIGNvbm5lY3Rpb24gZG9lcyBub3QgZXhpc3QuCisqLworaW50IGRwcmNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IGZzbF9tY19pbwkJKm1jX2lvLAorCQkJdWludDE2X3QJCQl0b2tlbiwKKwkJCWNvbnN0IHN0cnVjdCBkcHJjX2VuZHBvaW50CSplbmRwb2ludDEsCisJCQlzdHJ1Y3QgZHByY19lbmRwb2ludAkJKmVuZHBvaW50MiwKKwkJCWludAkJCQkqc3RhdGUpOworCisjZW5kaWYgLyogX0ZTTF9EUFJDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLWNtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTAxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtY21kLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9fRlNMX01DX0NNRF9ICisjZGVmaW5lIF9fRlNMX01DX0NNRF9ICisKKyNkZWZpbmUgTUNfQ01EX05VTV9PRl9QQVJBTVMJNworCisjZGVmaW5lIE1BS0VfVU1BU0s2NChfd2lkdGgpIFwKKwkoKHVpbnQ2NF90KSgoX3dpZHRoKSA8IDY0ID8gKCh1aW50NjRfdCkxIDw8IChfd2lkdGgpKSAtIDEgOiAtMSkpCisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgbWNfZW5jKGludCBsc29mZnNldCwgaW50IHdpZHRoLCB1aW50NjRfdCB2YWwpCit7CisJcmV0dXJuICh1aW50NjRfdCkoKCh1aW50NjRfdCl2YWwgJiBNQUtFX1VNQVNLNjQod2lkdGgpKSA8PCBsc29mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgbWNfZGVjKHVpbnQ2NF90IHZhbCwgaW50IGxzb2Zmc2V0LCBpbnQgd2lkdGgpCit7CisJcmV0dXJuICh1aW50NjRfdCkoKHZhbCA+PiBsc29mZnNldCkgJiBNQUtFX1VNQVNLNjQod2lkdGgpKTsKK30KKworc3RydWN0IG1jX2NvbW1hbmQgeworCXVpbnQ2NF90IGhlYWRlcjsKKwl1aW50NjRfdCBwYXJhbXNbTUNfQ01EX05VTV9PRl9QQVJBTVNdOworfTsKKworZW51bSBtY19jbWRfc3RhdHVzIHsKKwlNQ19DTURfU1RBVFVTX09LID0gMHgwLCAvKiBDb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisJTUNfQ01EX1NUQVRVU19SRUFEWSA9IDB4MSwgLyogUmVhZHkgdG8gYmUgcHJvY2Vzc2VkICovCisJTUNfQ01EX1NUQVRVU19BVVRIX0VSUiA9IDB4MywgLyogQXV0aGVudGljYXRpb24gZXJyb3IgKi8KKwlNQ19DTURfU1RBVFVTX05PX1BSSVZJTEVHRSA9IDB4NCwgLyogTm8gcHJpdmlsZWdlICovCisJTUNfQ01EX1NUQVRVU19ETUFfRVJSID0gMHg1LCAvKiBETUEgb3IgSS9PIGVycm9yICovCisJTUNfQ01EX1NUQVRVU19DT05GSUdfRVJSID0gMHg2LCAvKiBDb25maWd1cmF0aW9uIGVycm9yICovCisJTUNfQ01EX1NUQVRVU19USU1FT1VUID0gMHg3LCAvKiBPcGVyYXRpb24gdGltZWQgb3V0ICovCisJTUNfQ01EX1NUQVRVU19OT19SRVNPVVJDRSA9IDB4OCwgLyogTm8gcmVzb3VyY2VzICovCisJTUNfQ01EX1NUQVRVU19OT19NRU1PUlkgPSAweDksIC8qIE5vIG1lbW9yeSBhdmFpbGFibGUgKi8KKwlNQ19DTURfU1RBVFVTX0JVU1kgPSAweEEsIC8qIERldmljZSBpcyBidXN5ICovCisJTUNfQ01EX1NUQVRVU19VTlNVUFBPUlRFRF9PUCA9IDB4QiwgLyogVW5zdXBwb3J0ZWQgb3BlcmF0aW9uICovCisJTUNfQ01EX1NUQVRVU19JTlZBTElEX1NUQVRFID0gMHhDIC8qIEludmFsaWQgc3RhdGUgKi8KK307CisKKyNkZWZpbmUgTUNfQ01EX0hEUl9DTURJRF9PCTUyCS8qIENvbW1hbmQgSUQgZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIE1DX0NNRF9IRFJfQ01ESURfUwkxMgkvKiBDb21tYW5kIElEIGZpZWxkIHNpemUgKi8KKyNkZWZpbmUgTUNfQ01EX0hEUl9UT0tFTl9PCTM4CS8qIFRva2VuIGZpZWxkIG9mZnNldCAqLworI2RlZmluZSBNQ19DTURfSERSX1RPS0VOX1MJMTAJLyogVG9rZW4gZmllbGQgc2l6ZSAqLworI2RlZmluZSBNQ19DTURfSERSX1NUQVRVU19PCTE2CS8qIFN0YXR1cyBmaWVsZCBvZmZzZXQgKi8KKyNkZWZpbmUgTUNfQ01EX0hEUl9TVEFUVVNfUwk4CS8qIFN0YXR1cyBmaWVsZCBzaXplKi8KKyNkZWZpbmUgTUNfQ01EX0hEUl9QUklfTwkxNQkvKiBQcmlvcml0eSBmaWVsZCBvZmZzZXQgKi8KKyNkZWZpbmUgTUNfQ01EX0hEUl9QUklfUwkxCS8qIFByaW9yaXR5IGZpZWxkIHNpemUgKi8KKworI2RlZmluZSBNQ19DTURfSERSX1JFQURfU1RBVFVTKF9oZHIpIFwKKwkoKGVudW0gbWNfY21kX3N0YXR1cyltY19kZWMoKF9oZHIpLCBcCisJCU1DX0NNRF9IRFJfU1RBVFVTX08sIE1DX0NNRF9IRFJfU1RBVFVTX1MpKQorCisjZGVmaW5lIE1DX0NNRF9IRFJfUkVBRF9UT0tFTihfaGRyKSBcCisJKCh1aW50MTZfdCltY19kZWMoKF9oZHIpLCBNQ19DTURfSERSX1RPS0VOX08sIE1DX0NNRF9IRFJfVE9LRU5fUykpCisKKyNkZWZpbmUgTUNfQ01EX1BSSV9MT1cJCTAgLyogTG93IFByaW9yaXR5IGNvbW1hbmQgaW5kaWNhdGlvbiAqLworI2RlZmluZSBNQ19DTURfUFJJX0hJR0gJCTEgLyogSGlnaCBQcmlvcml0eSBjb21tYW5kIGluZGljYXRpb24gKi8KKworI2RlZmluZSBNQ19FWFRfT1AoX2V4dCwgX3BhcmFtLCBfb2Zmc2V0LCBfd2lkdGgsIF90eXBlLCBfYXJnKSBcCisJKChfZXh0KVtfcGFyYW1dIHw9IG1jX2VuYygoX29mZnNldCksIChfd2lkdGgpLCBfYXJnKSkKKworI2RlZmluZSBNQ19DTURfT1AoX2NtZCwgX3BhcmFtLCBfb2Zmc2V0LCBfd2lkdGgsIF90eXBlLCBfYXJnKSBcCisJKChfY21kKS5wYXJhbXNbX3BhcmFtXSB8PSBtY19lbmMoKF9vZmZzZXQpLCAoX3dpZHRoKSwgX2FyZykpCisKKyNkZWZpbmUgTUNfUlNQX09QKF9jbWQsIF9wYXJhbSwgX29mZnNldCwgX3dpZHRoLCBfdHlwZSwgX2FyZykgXAorCShfYXJnID0gKF90eXBlKW1jX2RlYyhfY21kLnBhcmFtc1tfcGFyYW1dLCAoX29mZnNldCksIChfd2lkdGgpKSkKKworc3RhdGljIGlubGluZSB1aW50NjRfdCBtY19lbmNvZGVfY21kX2hlYWRlcih1aW50MTZfdCBjbWRfaWQsCisJCQkJCSAgICB1aW50OF90IHByaW9yaXR5LAorCQkJCQkgICAgdWludDE2X3QgdG9rZW4pCit7CisJdWludDY0X3QgaGRyOworCisJaGRyID0gbWNfZW5jKE1DX0NNRF9IRFJfQ01ESURfTywgTUNfQ01EX0hEUl9DTURJRF9TLCBjbWRfaWQpOworCWhkciB8PSBtY19lbmMoTUNfQ01EX0hEUl9UT0tFTl9PLCBNQ19DTURfSERSX1RPS0VOX1MsIHRva2VuKTsKKwloZHIgfD0gbWNfZW5jKE1DX0NNRF9IRFJfUFJJX08sIE1DX0NNRF9IRFJfUFJJX1MsIHByaW9yaXR5KTsKKwloZHIgfD0gbWNfZW5jKE1DX0NNRF9IRFJfU1RBVFVTX08sIE1DX0NNRF9IRFJfU1RBVFVTX1MsCisJCSAgICAgICBNQ19DTURfU1RBVFVTX1JFQURZKTsKKworCXJldHVybiBoZHI7Cit9CisKKyNlbmRpZiAvKiBfX0ZTTF9NQ19DTURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0NWY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1wcml2YXRlLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IChNQykgYnVzIHByaXZhdGUgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IEdlcm1hbiBSaXZlcmEgPEdlcm1hbi5SaXZlcmFAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIF9GU0xfTUNfUFJJVkFURV9IXworI2RlZmluZSBfRlNMX01DX1BSSVZBVEVfSF8KKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMuaCIKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjZGVmaW5lIEZTTF9NQ19EUFJDX0RSSVZFUl9OQU1FICAgICJmc2xfbWNfZHByYyIKKworI2RlZmluZSBGU0xfTUNfREVWSUNFX01BVENIKF9tY19kZXYsIF9vYmpfZGVzYykgXAorCShzdHJjbXAoKF9tY19kZXYpLT5vYmpfZGVzYy50eXBlLCAoX29ial9kZXNjKS0+dHlwZSkgPT0gMCAmJiBcCisJIChfbWNfZGV2KS0+b2JqX2Rlc2MuaWQgPT0gKF9vYmpfZGVzYyktPmlkKQorCisjZGVmaW5lIEZTTF9NQ19JU19BTExPQ0FUQUJMRShfb2JqX3R5cGUpIFwKKwkoc3RyY21wKF9vYmpfdHlwZSwgImRwYnAiKSA9PSAwIHx8IFwKKwkgc3RyY21wKF9vYmpfdHlwZSwgImRwbWNwIikgPT0gMCB8fCBcCisJIHN0cmNtcChfb2JqX3R5cGUsICJkcGNvbiIpID09IDApCisKKy8qKgorICogc3RydWN0IGZzbF9tYyAtIFByaXZhdGUgZGF0YSBvZiBhICJmc2wscW9yaXEtbWMiIHBsYXRmb3JtIGRldmljZQorICogQHJvb3RfbWNfYnVzX2RldjogTUMgb2JqZWN0IGRldmljZSByZXByZXNlbnRpbmcgdGhlIHJvb3QgRFBSQworICogQGFkZHJfdHJhbnNsYXRpb25fcmFuZ2VzOiBhcnJheSBvZiBidXMgdG8gc3lzdGVtIGFkZHJlc3MgdHJhbnNsYXRpb24gcmFuZ2VzCisgKi8KK3N0cnVjdCBmc2xfbWMgeworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpyb290X21jX2J1c19kZXY7CisJdWludDhfdCBudW1fdHJhbnNsYXRpb25fcmFuZ2VzOworCXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAqdHJhbnNsYXRpb25fcmFuZ2VzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgLSBidXMgdG8gc3lzdGVtIGFkZHJlc3MgdHJhbnNsYXRpb24KKyAqIHJhbmdlCisgKiBAc3RhcnRfbWNfYWRkcjogU3RhcnQgTUMgYWRkcmVzcyBvZiB0aGUgcmFuZ2UgYmVpbmcgdHJhbnNsYXRlZAorICogQGVuZF9tY19hZGRyOiBNQyBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSByYW5nZSAobGFzdCBNQworICogYWRkcmVzcyBvZiB0aGUgcmFuZ2UgaXMgZW5kX21jX2FkZHIgLSAxKQorICogQHN0YXJ0X3BoeXNfYWRkcjogc3lzdGVtIHBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBzdGFydF9tY19hZGRyCisgKi8KK3N0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSB7CisJdWludDY0X3Qgc3RhcnRfbWNfYWRkcjsKKwl1aW50NjRfdCBlbmRfbWNfYWRkcjsKKwlwaHlzX2FkZHJfdCBzdGFydF9waHlzX2FkZHI7Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAtIFBvb2wgb2YgTUMgcmVzb3VyY2VzIG9mIGEgZ2l2ZW4KKyAqIHR5cGUKKyAqIEB0eXBlOiB0eXBlIG9mIHJlc291cmNlcyBpbiB0aGUgcG9vbAorICogQG1heF9jb3VudDogbWF4aW11bSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIHRoZSBwb29sCisgKiBAZnJlZV9jb3VudDogbnVtYmVyIG9mIGZyZWUgcmVzb3VyY2VzIGluIHRoZSBwb29sCisgKiBAbXV0ZXg6IG11dGV4IHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBvb2wncyBmcmVlIGxpc3QKKyAqIEBmcmVlX2xpc3Q6IGFuY2hvciBub2RlIG9mIGxpc3Qgb2YgZnJlZSByZXNvdXJjZXMgaW4gdGhlIHBvb2wKKyAqIEBtY19idXM6IHBvaW50ZXIgdG8gdGhlIE1DIGJ1cyB0aGF0IG93bnMgdGhpcyByZXNvdXJjZSBwb29sCisgKi8KK3N0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCB7CisJZW51bSBmc2xfbWNfcG9vbF90eXBlIHR5cGU7CisJaW50MTZfdCBtYXhfY291bnQ7CisJaW50MTZfdCBmcmVlX2NvdW50OworCXN0cnVjdCBtdXRleCBtdXRleDsJLyogc2VyaWFsaXplcyBhY2Nlc3MgdG8gZnJlZV9saXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2xpc3Q7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9tY19idXMgLSBsb2dpY2FsIGJ1cyB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcGh5c2ljYWwgRFBSQworICogQG1jX2RldjogZnNsLW1jIGRldmljZSBmb3IgdGhlIGJ1cyBkZXZpY2UgaXRzZWxmLgorICogQHJlc291cmNlX3Bvb2xzOiBhcnJheSBvZiByZXNvdXJjZSBwb29scyAob25lIHBvb2wgcGVyIHJlc291cmNlIHR5cGUpCisgKiBmb3IgdGhpcyBNQyBidXMuIFRoZXNlIHJlc291cmNlcyByZXByZXNlbnQgYWxsb2NhdGFibGUgZW50aXRpZXMKKyAqIGZyb20gdGhlIHBoeXNpY2FsIERQUkMuCisgKiBAc2Nhbl9tdXRleDogU2VyaWFsaXplcyBidXMgc2Nhbm5pbmcKKyAqLworc3RydWN0IGZzbF9tY19idXMgeworCXN0cnVjdCBmc2xfbWNfZGV2aWNlIG1jX2RldjsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgcmVzb3VyY2VfcG9vbHNbRlNMX01DX05VTV9QT09MX1RZUEVTXTsKKwlzdHJ1Y3QgbXV0ZXggc2Nhbl9tdXRleDsgICAgLyogc2VyaWFsaXplcyBidXMgc2Nhbm5pbmcgKi8KK307CisKKyNkZWZpbmUgdG9fZnNsX21jX2J1cyhfbWNfZGV2KSBcCisJY29udGFpbmVyX29mKF9tY19kZXYsIHN0cnVjdCBmc2xfbWNfYnVzLCBtY19kZXYpCisKK2ludCBfX211c3RfY2hlY2sgZnNsX21jX2RldmljZV9hZGQoc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjLAorCQkJCSAgIHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYsCisJCQkJICAgc3RydWN0IGZzbF9tY19kZXZpY2UgKipuZXdfbWNfZGV2KTsKKwordm9pZCBmc2xfbWNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KTsKKworaW50IGRwcmNfc2Nhbl9jb250YWluZXIoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpOworCitpbnQgZHByY19zY2FuX29iamVjdHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpOworCitpbnQgX19pbml0IGRwcmNfZHJpdmVyX2luaXQodm9pZCk7CisKK3ZvaWQgX19leGl0IGRwcmNfZHJpdmVyX2V4aXQodm9pZCk7CisKK2ludCBfX2luaXQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfaW5pdCh2b2lkKTsKKwordm9pZCBfX2V4aXQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfZXhpdCh2b2lkKTsKKworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cywKKwkJCQkJICBlbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlLAorCQkJCQkgIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UKKwkJCQkJCQkgICoqbmV3X3Jlc291cmNlKTsKKwordm9pZCBmc2xfbWNfcmVzb3VyY2VfZnJlZShzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSk7CisKKyNlbmRpZiAvKiBfRlNMX01DX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1zeXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNiNWEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXN5cy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIEludGVyZmFjZSBvZiB0aGUgSS9PIHNlcnZpY2VzIHRvIHNlbmQgTUMgY29tbWFuZHMgdG8gdGhlIE1DIGhhcmR3YXJlCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfRlNMX01DX1NZU19ICisjZGVmaW5lIF9GU0xfTUNfU1lTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKK3N0cnVjdCBmc2xfbWNfcmVzb3VyY2U7CitzdHJ1Y3QgbWNfY29tbWFuZDsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jX2lvIC0gTUMgSS9PIG9iamVjdCB0byBiZSBwYXNzZWQtaW4gdG8gbWNfc2VuZF9jb21tYW5kKCkKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBNYyBJL08gb2JqZWN0CisgKiBAZmxhZ3M6IGZsYWdzIGZvciBtY19zZW5kX2NvbW1hbmQoKQorICogQHBvcnRhbF9zaXplOiBNQyBjb21tYW5kIHBvcnRhbCBzaXplIGluIGJ5dGVzCisgKiBAcG9ydGFsX3BoeXNfYWRkcjogTUMgY29tbWFuZCBwb3J0YWwgcGh5c2ljYWwgYWRkcmVzcworICogQHBvcnRhbF92aXJ0X2FkZHI6IE1DIGNvbW1hbmQgcG9ydGFsIHZpcnR1YWwgYWRkcmVzcworICogQHJlc291cmNlOiBnZW5lcmljIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUMgcG9ydGFsIGlmCisgKiB0aGUgTUMgcG9ydGFsIGNhbWUgZnJvbSBhIHJlc291cmNlIHBvb2wsIG9yIE5VTEwgaWYgdGhlIE1DIHBvcnRhbAorICogaXMgcGVybWFuZW50bHkgYm91bmQgdG8gYSBkZXZpY2UgKGUuZy4sIGEgRFBSQykKKyAqLworc3RydWN0IGZzbF9tY19pbyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IHBvcnRhbF9zaXplOworCXBoeXNfYWRkcl90IHBvcnRhbF9waHlzX2FkZHI7CisJdm9pZCBfX2lvbWVtICpwb3J0YWxfdmlydF9hZGRyOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworfTsKKworaW50IF9fbXVzdF9jaGVjayBmc2xfY3JlYXRlX21jX2lvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHIsCisJCQkJICB1aW50MzJfdCBtY19wb3J0YWxfc2l6ZSwKKwkJCQkgIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlLAorCQkJCSAgdWludDMyX3QgZmxhZ3MsIHN0cnVjdCBmc2xfbWNfaW8gKipuZXdfbWNfaW8pOworCit2b2lkIGZzbF9kZXN0cm95X21jX2lvKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKTsKKworaW50IG1jX3NlbmRfY29tbWFuZChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgc3RydWN0IG1jX2NvbW1hbmQgKmNtZCk7CisKKyNlbmRpZiAvKiBfRlNMX01DX1NZU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDJlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMuaApAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgcHVibGljIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBHZXJtYW4gUml2ZXJhIDxHZXJtYW4uUml2ZXJhQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworI2lmbmRlZiBfRlNMX01DX0hfCisjZGVmaW5lIF9GU0xfTUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwcmMuaCIKKworI2RlZmluZSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRQkweDE5NTcKKworc3RydWN0IGZzbF9tY19kZXZpY2U7CitzdHJ1Y3QgZnNsX21jX2lvOworCisvKioKKyAqIHN0cnVjdCBmc2xfbWNfZHJpdmVyIC0gTUMgb2JqZWN0IGRldmljZSBkcml2ZXIgb2JqZWN0CisgKiBAZHJpdmVyOiBHZW5lcmljIGRldmljZSBkcml2ZXIKKyAqIEBtYXRjaF9pZF90YWJsZTogdGFibGUgb2Ygc3VwcG9ydGVkIGRldmljZSBtYXRjaGluZyBJZHMKKyAqIEBwcm9iZTogRnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQKKyAqIEByZW1vdmU6IEZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzIHJlbW92ZWQKKyAqIEBzaHV0ZG93bjogRnVuY3Rpb24gY2FsbGVkIGF0IHNodXRkb3duIHRpbWUgdG8gcXVpZXNjZSB0aGUgZGV2aWNlCisgKiBAc3VzcGVuZDogRnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgc3RvcHBlZAorICogQHJlc3VtZTogRnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgcmVzdW1lZAorICoKKyAqIEdlbmVyaWMgRFBBQSBkZXZpY2UgZHJpdmVyIG9iamVjdCBmb3IgZGV2aWNlIGRyaXZlcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZAorICogd2l0aCBhIERQUkMgYnVzLiBUaGlzIHN0cnVjdHVyZSBpcyB0byBiZSBlbWJlZGRlZCBpbiBlYWNoIGRldmljZS1zcGVjaWZpYworICogZHJpdmVyIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGZzbF9tY19kcml2ZXIgeworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKKwljb25zdCBzdHJ1Y3QgZnNsX21jX2RldmljZV9tYXRjaF9pZCAqbWF0Y2hfaWRfdGFibGU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBmc2xfbWNfZGV2aWNlICpkZXYpOworCWludCAoKnJlbW92ZSkoc3RydWN0IGZzbF9tY19kZXZpY2UgKmRldik7CisJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgZnNsX21jX2RldmljZSAqZGV2KTsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZnNsX21jX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnJlc3VtZSkoc3RydWN0IGZzbF9tY19kZXZpY2UgKmRldik7Cit9OworCisjZGVmaW5lIHRvX2ZzbF9tY19kcml2ZXIoX2RydikgXAorCWNvbnRhaW5lcl9vZihfZHJ2LCBzdHJ1Y3QgZnNsX21jX2RyaXZlciwgZHJpdmVyKQorCisvKioKKyAqIHN0cnVjdCBmc2xfbWNfZGV2aWNlX21hdGNoX2lkIC0gTUMgb2JqZWN0IGRldmljZSBJZCBlbnRyeSBmb3IgZHJpdmVyIG1hdGNoaW5nCisgKiBAdmVuZG9yOiB2ZW5kb3IgSUQKKyAqIEBvYmpfdHlwZTogTUMgb2JqZWN0IHR5cGUKKyAqIEB2ZXJfbWFqb3I6IE1DIG9iamVjdCB2ZXJzaW9uIG1ham9yIG51bWJlcgorICogQHZlcl9taW5vcjogTUMgb2JqZWN0IHZlcnNpb24gbWlub3IgbnVtYmVyCisgKgorICogVHlwZSBvZiBlbnRyaWVzIGluIHRoZSAiZGV2aWNlIElkIiB0YWJsZSBmb3IgTUMgb2JqZWN0IGRldmljZXMgc3VwcG9ydGVkIGJ5CisgKiBhIE1DIG9iamVjdCBkZXZpY2UgZHJpdmVyLiBUaGUgbGFzdCBlbnRyeSBvZiB0aGUgdGFibGUgaGFzIHZlbmRvciBzZXQgdG8gMHgwCisgKi8KK3N0cnVjdCBmc2xfbWNfZGV2aWNlX21hdGNoX2lkIHsKKwl1aW50MTZfdCB2ZW5kb3I7CisJY29uc3QgY2hhciBvYmpfdHlwZVsxNl07CisJdWludDMyX3QgdmVyX21ham9yOworCXVpbnQzMl90IHZlcl9taW5vcjsKK307CisKKy8qKgorICogZW51bSBmc2xfbWNfcG9vbF90eXBlIC0gVHlwZXMgb2YgYWxsb2NhdGFibGUgTUMgYnVzIHJlc291cmNlcworICoKKyAqIEVudHJpZXMgaW4gdGhlc2UgZW51bSBhcmUgdXNlZCBhcyBpbmRpY2VzIGluIHRoZSBhcnJheSBvZiByZXNvdXJjZQorICogcG9vbHMgb2YgYW4gZnNsX21jX2J1cyBvYmplY3QuCisgKi8KK2VudW0gZnNsX21jX3Bvb2xfdHlwZSB7CisJRlNMX01DX1BPT0xfRFBNQ1AgPSAweDAsICAgIC8qIGNvcnJlc3BvbmRzIHRvICJkcG1jcCIgaW4gdGhlIE1DICovCisJRlNMX01DX1BPT0xfRFBCUCwJICAgIC8qIGNvcnJlc3BvbmRzIHRvICJkcGJwIiBpbiB0aGUgTUMgKi8KKwlGU0xfTUNfUE9PTF9EUENPTiwJICAgIC8qIGNvcnJlc3BvbmRzIHRvICJkcGNvbiIgaW4gdGhlIE1DICovCisKKwkvKgorCSAqIE5PVEU6IE5ldyByZXNvdXJjZSBwb29sIHR5cGVzIG11c3QgYmUgYWRkZWQgYmVmb3JlIHRoaXMgZW50cnkKKwkgKi8KKwlGU0xfTUNfTlVNX1BPT0xfVFlQRVMKK307CisKKy8qKgorICogc3RydWN0IGZzbF9tY19yZXNvdXJjZSAtIE1DIGdlbmVyaWMgcmVzb3VyY2UKKyAqIEB0eXBlOiB0eXBlIG9mIHJlc291cmNlCisgKiBAaWQ6IHVuaXF1ZSBNQyByZXNvdXJjZSBJZCB3aXRoaW4gdGhlIHJlc291cmNlcyBvZiB0aGUgc2FtZSB0eXBlCisgKiBAZGF0YTogcG9pbnRlciB0byByZXNvdXJjZS1zcGVjaWZpYyBkYXRhIGlmIHRoZSByZXNvdXJjZSBpcyBjdXJyZW50bHkKKyAqIGFsbG9jYXRlZCwgb3IgTlVMTCBpZiB0aGUgcmVzb3VyY2UgaXMgbm90IGN1cnJlbnRseSBhbGxvY2F0ZWQuCisgKiBAcGFyZW50X3Bvb2w6IHBvaW50ZXIgdG8gdGhlIHBhcmVudCByZXNvdXJjZSBwb29sIGZyb20gd2hpY2ggdGhpcworICogcmVzb3VyY2UgaXMgYWxsb2NhdGVkIGZyb20uCisgKiBAbm9kZTogTm9kZSBpbiB0aGUgZnJlZSBsaXN0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIHBvb2wKKyAqCisgKiBOT1RFOiBUaGlzIHN0cnVjdHVyZSBpcyB0byBiZSBlbWJlZGRlZCBhcyBhIGZpZWxkIG9mIHNwZWNpZmljCisgKiBNQyByZXNvdXJjZSBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgZnNsX21jX3Jlc291cmNlIHsKKwllbnVtIGZzbF9tY19wb29sX3R5cGUgdHlwZTsKKwlpbnQzMl90IGlkOworCXZvaWQgKmRhdGE7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpwYXJlbnRfcG9vbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Cit9OworCisvKioKKyAqIEJpdCBtYXNrcyBmb3IgYSBNQyBvYmplY3QgZGV2aWNlIChzdHJ1Y3QgZnNsX21jX2RldmljZSkgZmxhZ3MKKyAqLworI2RlZmluZSBGU0xfTUNfSVNfRFBSQwkweDAwMDEKKworLyoqCisgKiBEZWZhdWx0IERNQSBtYXNrIGZvciBkZXZpY2VzIG9uIGEgZnNsLW1jIGJ1cworICovCisjZGVmaW5lIEZTTF9NQ19ERUZBVUxUX0RNQV9NQVNLCSh+MFVMTCkKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jX2RldmljZSAtIE1DIG9iamVjdCBkZXZpY2Ugb2JqZWN0CisgKiBAZGV2OiBMaW51eCBkcml2ZXIgbW9kZWwgZGV2aWNlIG9iamVjdAorICogQGRtYV9tYXNrOiBEZWZhdWx0IERNQSBtYXNrCisgKiBAZmxhZ3M6IE1DIG9iamVjdCBkZXZpY2UgZmxhZ3MKKyAqIEBpY2lkOiBJc29sYXRpb24gY29udGV4dCBJRCBmb3IgdGhlIGRldmljZQorICogQG1jX2hhbmRsZTogTUMgaGFuZGxlIGZvciB0aGUgY29ycmVzcG9uZGluZyBNQyBvYmplY3Qgb3BlbmVkCisgKiBAbWNfaW86IFBvaW50ZXIgdG8gTUMgSU8gb2JqZWN0IGFzc2lnbmVkIHRvIHRoaXMgZGV2aWNlIG9yCisgKiBOVUxMIGlmIG5vbmUuCisgKiBAb2JqX2Rlc2M6IE1DIGRlc2NyaXB0aW9uIG9mIHRoZSBEUEFBIGRldmljZQorICogQHJlZ2lvbnM6IHBvaW50ZXIgdG8gYXJyYXkgb2YgTU1JTyByZWdpb24gZW50cmllcworICogQHJlc291cmNlOiBnZW5lcmljIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1DIG9iamVjdCBkZXZpY2UsIGlmIGFueS4KKyAqCisgKiBHZW5lcmljIGRldmljZSBvYmplY3QgZm9yIE1DIG9iamVjdCBkZXZpY2VzIHRoYXQgYXJlICJhdHRhY2hlZCIgdG8gYQorICogTUMgYnVzLgorICoKKyAqIE5PVEVTOgorICogLSBGb3IgYSBub24tRFBSQyBvYmplY3QgaXRzIGljaWQgaXMgdGhlIHNhbWUgYXMgaXRzIHBhcmVudCBEUFJDJ3MgaWNpZC4KKyAqIC0gVGhlIFNNTVUgbm90aWZpZXIgY2FsbGJhY2sgZ2V0cyBpbnZva2VkIGFmdGVyIGRldmljZV9hZGQoKSBoYXMgYmVlbgorICogICBjYWxsZWQgZm9yIGFuIE1DIG9iamVjdCBkZXZpY2UsIGJ1dCBiZWZvcmUgdGhlIGRldmljZS1zcGVjaWZpYyBwcm9iZQorICogICBjYWxsYmFjayBnZXRzIGNhbGxlZC4KKyAqIC0gRFBfT0JKX0RQUkMgb2JqZWN0cyBhcmUgdGhlIG9ubHkgTUMgb2JqZWN0cyB0aGF0IGhhdmUgYnVpbHQtaW4gTUMKKyAqICAgcG9ydGFscy4gRm9yIGFsbCBvdGhlciBNQyBvYmplY3RzLCB0aGVpciBkZXZpY2UgZHJpdmVycyBhcmUgcmVzcG9uc2libGUgZm9yCisgKiAgIGFsbG9jYXRpbmcgTUMgcG9ydGFscyBmb3IgdGhlbSBieSBjYWxsaW5nIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUoKS4KKyAqIC0gU29tZSB0eXBlcyBvZiBNQyBvYmplY3RzIChlLmcuLCBEUF9PQkpfRFBCUCwgRFBfT0JKX0RQQ09OKSBhcmUKKyAqICAgdHJlYXRlZCBhcyByZXNvdXJjZXMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkL2RlYWxsb2NhdGVkIGZyb20gdGhlCisgKiAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgcG9vbCBpbiB0aGUgb2JqZWN0J3MgcGFyZW50IERQUkMsIHVzaW5nIHRoZQorICogICBmc2xfbWNfb2JqZWN0X2FsbG9jYXRlKCkvZnNsX21jX29iamVjdF9mcmVlKCkgZnVuY3Rpb25zLiBUaGVzZSBNQyBvYmplY3RzCisgKiAgIGFyZSBrbm93biBhcyAiYWxsb2NhdGFibGUiIG9iamVjdHMuIEZvciB0aGVtLCB0aGUgY29ycmVzcG9uZGluZworICogICBmc2xfbWNfZGV2aWNlJ3MgJ3Jlc291cmNlJyBwb2ludHMgdG8gdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2Ugb2JqZWN0LgorICogICBGb3IgTUMgb2JqZWN0cyB0aGF0IGFyZSBub3QgYWxsb2NhdGFibGUgKGUuZy4sIERQX09CSl9EUFJDLCBEUF9PQkpfRFBOSSksCisgKiAgICdyZXNvdXJjZScgaXMgTlVMTC4KKyAqLworc3RydWN0IGZzbF9tY19kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UgZGV2OworCXVpbnQ2NF90IGRtYV9tYXNrOworCXVpbnQxNl90IGZsYWdzOworCXVpbnQxNl90IGljaWQ7CisJdWludDE2X3QgbWNfaGFuZGxlOworCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvOworCXN0cnVjdCBkcHJjX29ial9kZXNjIG9ial9kZXNjOworCXN0cnVjdCByZXNvdXJjZSAqcmVnaW9uczsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKK307CisKKyNkZWZpbmUgdG9fZnNsX21jX2RldmljZShfZGV2KSBcCisJY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBmc2xfbWNfZGV2aWNlLCBkZXYpCisKKy8qCisgKiBtb2R1bGVfZnNsX21jX2RyaXZlcigpIC0gSGVscGVyIG1hY3JvIGZvciBkcml2ZXJzIHRoYXQgZG9uJ3QgZG8KKyAqIGFueXRoaW5nIHNwZWNpYWwgaW4gbW9kdWxlIGluaXQvZXhpdC4gIFRoaXMgZWxpbWluYXRlcyBhIGxvdCBvZgorICogYm9pbGVycGxhdGUuICBFYWNoIG1vZHVsZSBtYXkgb25seSB1c2UgdGhpcyBtYWNybyBvbmNlLCBhbmQKKyAqIGNhbGxpbmcgaXQgcmVwbGFjZXMgbW9kdWxlX2luaXQoKSBhbmQgbW9kdWxlX2V4aXQoKQorICovCisjZGVmaW5lIG1vZHVsZV9mc2xfbWNfZHJpdmVyKF9fZnNsX21jX2RyaXZlcikgXAorCW1vZHVsZV9kcml2ZXIoX19mc2xfbWNfZHJpdmVyLCBmc2xfbWNfZHJpdmVyX3JlZ2lzdGVyLCBcCisJCSAgICAgIGZzbF9tY19kcml2ZXJfdW5yZWdpc3RlcikKKworLyoKKyAqIE1hY3JvIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFCisgKi8KKyNkZWZpbmUgZnNsX21jX2RyaXZlcl9yZWdpc3RlcihkcnYpIFwKKwlfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIoZHJ2LCBUSElTX01PRFVMRSkKKworaW50IF9fbXVzdF9jaGVjayBfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKmZzbF9tY19kcml2ZXIsCisJCQkJCSAgc3RydWN0IG1vZHVsZSAqb3duZXIpOworCit2b2lkIGZzbF9tY19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZnNsX21jX2RyaXZlciAqZHJpdmVyKTsKKworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJCXVpbnQxNl90IG1jX2lvX2ZsYWdzLAorCQkJCQlzdHJ1Y3QgZnNsX21jX2lvICoqbmV3X21jX2lvKTsKKwordm9pZCBmc2xfbWNfcG9ydGFsX2ZyZWUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pOworCitpbnQgZnNsX21jX3BvcnRhbF9yZXNldChzdHJ1Y3QgZnNsX21jX2lvICptY19pbyk7CisKK2ludCBfX211c3RfY2hlY2sgZnNsX21jX29iamVjdF9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAorCQkJCQllbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlLAorCQkJCQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqKm5ld19tY19hZGV2KTsKKwordm9pZCBmc2xfbWNfb2JqZWN0X2ZyZWUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2FkZXYpOworCitleHRlcm4gc3RydWN0IGJ1c190eXBlIGZzbF9tY19idXNfdHlwZTsKKworI2VuZGlmIC8qIF9GU0xfTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfY3MuYwppbmRleCA5MjI0NzhlLi5lNWNjNWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9jcy5jCkBAIC0xNTUsMTUgKzE1NSw0IEBACiAJLnJlc3VtZQkJPSBmdDEwMDBfcmVzdW1lLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgaW5pdF9mdDEwMDBfY3Modm9pZCkKLXsKLQlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmZnQxMDAwX2NzX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2Z0MTAwMF9jcyh2b2lkKQotewotCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmZnQxMDAwX2NzX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfZnQxMDAwX2NzKTsKLW1vZHVsZV9leGl0KGV4aXRfZnQxMDAwX2NzKTsKK21vZHVsZV9wY21jaWFfZHJpdmVyKGZ0MTAwMF9jc19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9kbmxkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2RubGQuYwppbmRleCAwNmIwZTljLi44MzY4M2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2RubGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2RubGQuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAKIHZvaWQgY2FyZF9ib290bG9hZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgKnBkYXRhOwogCXUzMiBzaXplOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIHUxNiBnZXRfaGFuZHNoYWtlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBleHBlY3RlZF92YWx1ZSkKIHsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBoYW5kc2hha2U7CiAJdTMyIHRlbXB4OwogCWludCBsb29wY250OwpAQCAtMTgyLDcgKzE4Miw3IEBACiAKIHZvaWQgcHV0X2hhbmRzaGFrZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaGFuZHNoYWtlX3ZhbHVlKQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIHRlbXB4OwogCiAJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIHUxNiBnZXRfcmVxdWVzdF90eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgcmVxdWVzdF90eXBlOwogCXUzMiB0ZW1weDsKIApAQCAtMjE3LDcgKzIxNyw3IEBACiAKIGxvbmcgZ2V0X3JlcXVlc3RfdmFsdWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCWxvbmcgdmFsdWU7CiAJdTE2IHdfdmFsOwogCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAogdm9pZCBwdXRfcmVxdWVzdF92YWx1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBsb25nIGx2YWx1ZSkKIHsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBzaXplOwogCXUzMiB0ZW1weDsKIApAQCAtMjc2LDggKzI3Niw4IEBACiAJdTE2ICp1c1B0ciA9ICh1MTYgKilwSGRyOwogCXUxNiBjaGtzdW07CiAKLQljaGtzdW0gPSAoKCgoKCh1c1B0clswXSBeIHVzUHRyWzFdKSBeIHVzUHRyWzJdKSBeIHVzUHRyWzNdKSBeCi0JCSAgICB1c1B0cls0XSkgXiB1c1B0cls1XSkgXiB1c1B0cls2XSk7CisJY2hrc3VtID0gKCgoKCh1c1B0clswXSBeIHVzUHRyWzFdKSBeIHVzUHRyWzJdKSBeIHVzUHRyWzNdKSBeCisJCSAgICB1c1B0cls0XSkgXiB1c1B0cls1XSkgXiB1c1B0cls2XTsKIAogCXJldHVybiBjaGtzdW07CiB9CkBAIC0yODUsNyArMjg1LDcgQEAKIGludCBjYXJkX2Rvd25sb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICpwRmlsZVN0YXJ0LAogCQkgIHNpemVfdCBGaWxlTGVuZ3RoKQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IFN0YXR1cyA9IFNVQ0NFU1M7CiAJdTMyIHVpU3RhdGU7CiAJdTE2IGhhbmRzaGFrZTsKQEAgLTcxMywxMCArNzEzLDEwIEBACiAKIAkJCQkvKiBHZXQgYnVmZmVyIGZvciBwcm92aXNpb25pbmcgZGF0YSAqLwogCQkJCXBidWZmZXIgPQotCQkJCQlrbWFsbG9jKCh1c0hkckxlbmd0aCArIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpLAorCQkJCQlrbWFsbG9jKHVzSGRyTGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKSwKIAkJCQkJCUdGUF9BVE9NSUMpOwogCQkJCWlmIChwYnVmZmVyKSB7Ci0JCQkJCW1lbWNweShwYnVmZmVyLCAodm9pZCAqKXBVY0ZpbGUsCisJCQkJCW1lbWNweShwYnVmZmVyLCBwVWNGaWxlLAogCQkJCQkgICAgICAgKHUzMikgKHVzSGRyTGVuZ3RoICsKIAkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpKTsKIAkJCQkJLyogbGluayBwcm92aXNpb25pbmcgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jCmluZGV4IDAxN2MzYjkuLmVlY2ZhMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMKQEAgLTI4LDggKzI4LDggQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtNjcsOCArNjcsNyBAQAogCiAvKiBuZXcga2VybmVsICovCiBNT0RVTEVfQVVUSE9SKCIiKTsKLU1PRFVMRV9ERVNDUklQVElPTgotKCJTdXBwb3J0IGZvciBGbGFyaW9uIEZsYXNoIE9GRE0gTklDIERldmljZS4gU3VwcG9ydCBmb3IgUENNQ0lBIHdoZW4gdXNlZCB3aXRoIGZ0MTAwMF9jcy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgRmxhcmlvbiBGbGFzaCBPRkRNIE5JQyBEZXZpY2UuIFN1cHBvcnQgZm9yIFBDTUNJQSB3aGVuIHVzZWQgd2l0aCBmdDEwMDBfY3MuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiRlQxMDAwIik7CiAKQEAgLTI2Nyw3ICsyNjYsOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICBGdW5jdGlvbjogICBmdDEwMDBfZW5hYmxlX2ludGVycnVwdHMKLSAgRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gd2lsbCBlbmFibGUgaW50ZXJydXB0cyBiYXNlIG9uIHRoZSBjdXJyZW50IGludGVycnVwdCBtYXNrLgorICBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiB3aWxsIGVuYWJsZSBpbnRlcnJ1cHRzIGJhc2Ugb24gdGhlIGN1cnJlbnQKKwkgICAgICAgaW50ZXJydXB0IG1hc2suCiAgIElucHV0OgogICBkZXYgICAgLSBkZXZpY2Ugc3RydWN0dXJlCiAgIE91dHB1dDoKQEAgLTMwMyw2ICszMDMsNDEgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRnVuY3Rpb246CWZ0MTAwMF9yZWFkX2RzcF90aW1lcgorICBEZXNjcmlwdGlvbjoJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgRFNQIHRpbWVyIGFuZCBzdG9yZXMgaXRzIHZhbHVlIGluIHRoZQorCQlEU1BfVElNRSBmaWVsZCBvZiB0aGUgZnQxMDAwX2luZm8gc3RydWN0IHBhc3NlZCBhcyBhcmd1bWVudAorICBJbnB1dDoKKyAgZGV2ICAgIC0gZGV2aWNlIHN0cnVjdHVyZQorICBpbmZvICAgLSBmdDEwMDBfaW5mbyBzdHJ1Y3R1cmUKKyAgT3V0cHV0OgorICBOb25lLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgZnQxMDAwX3JlYWRfZHNwX3RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8pCit7CisJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgeworCQlpbmZvLT5EU1BfVElNRVswXSA9IGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjApOworCQlpbmZvLT5EU1BfVElNRVsxXSA9IGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjEpOworCQlpbmZvLT5EU1BfVElNRVsyXSA9IGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjIpOworCQlpbmZvLT5EU1BfVElNRVszXSA9IGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjMpOworCX0gZWxzZSB7CisJCWluZm8tPkRTUF9USU1FWzBdID0KKwkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMCwKKwkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWCk7CisJCWluZm8tPkRTUF9USU1FWzFdID0KKwkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMSwKKwkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7CisJCWluZm8tPkRTUF9USU1FWzJdID0KKwkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwKKwkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWCk7CisJCWluZm8tPkRTUF9USU1FWzNdID0KKwkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMywKKwkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWCk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIEZ1bmN0aW9uOiAgIGZ0MTAwMF9yZXNldF9hc2ljCiAgIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCB0aGUgQ2FyZCBTZXJ2aWNlIGZ1bmN0aW9uIHRvIHJlc2V0IHRoZQpAQCAtMzI3LDcgKzM2Miw3IEBACiAJICovCiAJaWYgKGluZm8tPkFzaWNJRCA9PSBNQUdORU1JVEVfSUQpIHsKIAkJZnQxMDAwX3dyaXRlX3JlZyhkZXYsIEZUMTAwMF9SRUdfUkVTRVQsCi0JCQkJIChEU1BfUkVTRVRfQklUIHwgQVNJQ19SRVNFVF9CSVQpKTsKKwkJCQkgRFNQX1JFU0VUX0JJVCB8IEFTSUNfUkVTRVRfQklUKTsKIAl9CiAJbWRlbGF5KDEpOwogCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKQEAgLTM2NCw2ICszOTksNyBAQAogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHByb3ZfcmVjb3JkICpwdHI7CisJc3RydWN0IHByb3ZfcmVjb3JkICp0bXA7CiAKIAlpbmZvLT5DYXJkUmVhZHkgPSAwOwogCWluZm8tPlByb2dDb25TdGF0ID0gMDsKQEAgLTM3Myw5ICs0MDksOCBAQAogCS8qIGRlbF90aW1lcigmcG9sbF90aW1lcik7ICovCiAKIAkvKiBNYWtlIHN1cmUgd2UgZnJlZSBhbnkgbWVtb3J5IHJlc2VydmUgZm9yIHByb3Zpc2lvbmluZyAqLwotCXdoaWxlIChsaXN0X2VtcHR5KCZpbmZvLT5wcm92X2xpc3QpID09IDApIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHRyLCB0bXAsICZpbmZvLT5wcm92X2xpc3QsIGxpc3QpIHsKIAkJcHJfZGVidWcoImRlbGV0aW5nIHByb3Zpc2lvbmluZyByZWNvcmRcbiIpOwotCQlwdHIgPSBsaXN0X2VudHJ5KGluZm8tPnByb3ZfbGlzdC5uZXh0LCBzdHJ1Y3QgcHJvdl9yZWNvcmQsIGxpc3QpOwogCQlsaXN0X2RlbCgmcHRyLT5saXN0KTsKIAkJa2ZyZWUocHRyLT5wcHJvdl9kYXRhKTsKIAkJa2ZyZWUocHRyKTsKQEAgLTM4Nyw3ICs0MjIsNyBAQAogCX0gZWxzZSB7CiAJCXByX2RlYnVnKCJyZXNldHRpbmcgQVNJQyBhbmQgRFNQXG4iKTsKIAkJZnQxMDAwX3dyaXRlX3JlZyhkZXYsIEZUMTAwMF9SRUdfUkVTRVQsCi0JCQkJIChEU1BfUkVTRVRfQklUIHwgQVNJQ19SRVNFVF9CSVQpKTsKKwkJCQkgRFNQX1JFU0VUX0JJVCB8IEFTSUNfUkVTRVRfQklUKTsKIAl9CiAKIAkvKiBDb3B5IERTUCBzZXNzaW9uIHJlY29yZCBpbnRvIGluZm8gYmxvY2sgaWYgdGhpcyBpcyBub3QgYSBjb2xkc3RhcnQgKi8KQEAgLTQwNiw3ICs0NDEsOCBAQAogCQkJCQkgRlQxMDAwX0RQUkFNX01BR19SWF9CQVNFKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBNQVhfRFNQX1NFU1NfUkVDIC8gMjsgaSsrKSB7CiAJCQkJaW5mby0+RFNQU2Vzcy5NYWdSZWNbaV0gPQotCQkJCQlpbmwoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19EUERBVEEpOworCQkJCQlpbmwoZGV2LT5iYXNlX2FkZHIKKwkJCQkJCSsgRlQxMDAwX1JFR19NQUdfRFBEQVRBKTsKIAkJCX0KIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5kcHJhbV9sb2NrLCBmbGFncyk7CkBAIC00MzUsMTEgKzQ3MSwxNCBAQAogCQltZGVsYXkoMTApOwogCQlwcl9kZWJ1ZygiVGFrZSBEU1Agb3V0IG9mIHJlc2V0XG4iKTsKIAotCQkvKiBXYWl0IGZvciAweGZlZmUgaW5kaWNhdGluZyBkc3AgcmVhZHkgYmVmb3JlIHN0YXJ0aW5nIGRvd25sb2FkICovCisJCS8qCisJCSAqIFdhaXQgZm9yIDB4ZmVmZSBpbmRpY2F0aW5nIGRzcCByZWFkeSBiZWZvcmUgc3RhcnRpbmcKKwkJICogZG93bmxvYWQKKwkJICovCiAJCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0JCQl0ZW1wd29yZCA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EUFJBTV9GRUZFLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RQUkFNX0ZFRkVfSU5EWCk7CisJCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCisJCQkJCQlGVDEwMDBfTUFHX0RQUkFNX0ZFRkUsCisJCQkJCQlGVDEwMDBfTUFHX0RQUkFNX0ZFRkVfSU5EWCk7CiAJCQlpZiAodGVtcHdvcmQgPT0gMHhmZWZlKQogCQkJCWJyZWFrOwogCQkJbWRlbGF5KDIwKTsKQEAgLTQ1OSwxNiArNDk4LDE1IEBACiAJaWYgKGNhcmRfZG93bmxvYWQoZGV2LCBmd19lbnRyeS0+ZGF0YSwgZndfZW50cnktPnNpemUpKSB7CiAJCXByX2RlYnVnKCJjYXJkIGRvd25sb2FkIHVuc3VjY2Vzc2Z1bFxuIik7CiAJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiY2FyZCBkb3dubG9hZCBzdWNjZXNzZnVsXG4iKTsKIAl9CisJcHJfZGVidWcoImNhcmQgZG93bmxvYWQgc3VjY2Vzc2Z1bFxuIik7CiAKIAltZGVsYXkoMTApOwogCiAJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewogCQkvKgotCQkgKiBOZWVkIHRvIGluaXRpYWxpemUgdGhlIEZJRk8gbGVuZ3RoIGNvdW50ZXIgdG8gemVybyBpbiBvcmRlciB0byBzeW5jIHVwCi0JCSAqIHdpdGggdGhlIERTUAorCQkgKiBOZWVkIHRvIGluaXRpYWxpemUgdGhlIEZJRk8gbGVuZ3RoIGNvdW50ZXIgdG8gemVybyBpbiBvcmRlcgorCQkgKiB0byBzeW5jIHVwIHdpdGggdGhlIERTUAogCQkgKi8KIAkJaW5mby0+Zmlmb19jbnQgPSAwOwogCQlmdDEwMDBfd3JpdGVfZHByYW0oZGV2LCBGVDEwMDBfRklGT19MRU4sIGluZm8tPmZpZm9fY250KTsKQEAgLTU3OCwzMyArNjE2LDcgQEAKIAkJfQogCQlpZiAodGVtcHdvcmQgIT0gaG8pIHsKIAkJCXByX2luZm8oImhlYXJ0YmVhdCBmYWlsZWQgLSBubyBobyBkZXRlY3RlZFxuIik7Ci0JCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMF0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIwKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjEpOwotCQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMik7Ci0JCQkJaW5mby0+RFNQX1RJTUVbM10gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMF0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIwLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIwX0lORFgpOwotCQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMSwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjIsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbM10gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIzLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIzX0lORFgpOwotCQkJfQorCQkJZnQxMDAwX3JlYWRfZHNwX3RpbWVyKGRldiwgaW5mbyk7CiAJCQlpbmZvLT5EcnZFcnJOdW0gPSBEU1BfSEJfSU5GTzsKIAkJCWlmIChmdDEwMDBfcmVzZXRfY2FyZChkZXYpID09IDApIHsKIAkJCQlwcl9pbmZvKCJIYXJkd2FyZSBGYWlsdXJlIERldGVjdGVkIC0gUEMgQ2FyZCBkaXNhYmxlZFxuIik7CkBAIC02MjUsMzMgKzYzNyw3IEBACiAKIAkJaWYgKHRlbXB3b3JkICYgRlQxMDAwX0RCX0hCKSB7CiAJCQlwcl9pbmZvKCJoZWFydGJlYXQgZG9vcmJlbGwgbm90IGNsZWFyIGJ5IGZpcm13YXJlXG4iKTsKLQkJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjApOwotCQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMSk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMl0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIyKTsKLQkJCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjAsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMV0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIxLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIxX0lORFgpOwotCQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKLQkJCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjMsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWCk7Ci0JCQl9CisJCQlmdDEwMDBfcmVhZF9kc3BfdGltZXIoZGV2LCBpbmZvKTsKIAkJCWluZm8tPkRydkVyck51bSA9IERTUF9IQl9JTkZPOwogCQkJaWYgKGZ0MTAwMF9yZXNldF9jYXJkKGRldikgPT0gMCkgewogCQkJCXByX2luZm8oIkhhcmR3YXJlIEZhaWx1cmUgRGV0ZWN0ZWQgLSBQQyBDYXJkIGRpc2FibGVkXG4iKTsKQEAgLTY2NSw4ICs2NTEsOCBAQAogCQkJcmV0dXJuOwogCQl9CiAJCS8qCi0JCSAqIFNldCBkZWRpY2F0ZWQgYXJlYSB0byBoaSBhbmQgcmluZyBhcHByb3ByaWF0ZSBkb29yYmVsbCBhY2NvcmRpbmcKLQkJICogdG8gaGkvaG8gaGVhcnRiZWF0IHByb3RvY29sCisJCSAqIFNldCBkZWRpY2F0ZWQgYXJlYSB0byBoaSBhbmQgcmluZyBhcHByb3ByaWF0ZSBkb29yYmVsbAorCQkgKiBhY2NvcmRpbmcgdG8gaGkvaG8gaGVhcnRiZWF0IHByb3RvY29sCiAJCSAqLwogCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CiAJCQlmdDEwMDBfd3JpdGVfZHByYW0oZGV2LCBGVDEwMDBfSElfSE8sIGhpKTsKQEAgLTY4OCw0NCArNjc0LDIwIEBACiAJCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKQogCQkJCWZ0MTAwMF93cml0ZV9kcHJhbShkZXYsIEZUMTAwMF9ISV9ITywgaGkpOwogCQkJZWxzZQotCQkJCWZ0MTAwMF93cml0ZV9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0hJX0hPLCBoaV9tYWcsIEZUMTAwMF9NQUdfSElfSE9fSU5EWCk7CisJCQkJZnQxMDAwX3dyaXRlX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfSElfSE8sCisJCQkJCQloaV9tYWcsIEZUMTAwMF9NQUdfSElfSE9fSU5EWCk7CiAKIAkJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpCiAJCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9ISV9ITyk7CiAJCQllbHNlCi0JCQkJdGVtcHdvcmQgPSBudG9ocyhmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0hJX0hPLCBGVDEwMDBfTUFHX0hJX0hPX0lORFgpKTsKLQorCQkJCXRlbXB3b3JkID0gbnRvaHMoZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKKwkJCQkJCQlGVDEwMDBfTUFHX0hJX0hPLAorCQkJCQkJCUZUMTAwMF9NQUdfSElfSE9fSU5EWCkpOwogCQl9CiAKIAkJaWYgKHRlbXB3b3JkICE9IGhpKSB7CiAJCQlwcl9pbmZvKCJoZWFydGJlYXQgZmFpbGVkIC0gY2Fubm90IHdyaXRlIGhpIGludG8gRFBSQU1cbiIpOwotCQkJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewotCQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMV0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIxKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjIpOwotCQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMyk7Ci0JCQl9IGVsc2UgewotCQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMCwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjEsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMl0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIyLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIyX0lORFgpOwotCQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMywKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKLQkJCX0KKwkJCWZ0MTAwMF9yZWFkX2RzcF90aW1lcihkZXYsIGluZm8pOwogCQkJaW5mby0+RHJ2RXJyTnVtID0gRFNQX0hCX0lORk87CiAJCQlpZiAoZnQxMDAwX3Jlc2V0X2NhcmQoZGV2KSA9PSAwKSB7CiAJCQkJcHJfaW5mbygiSGFyZHdhcmUgRmFpbHVyZSBEZXRlY3RlZCAtIFBDIENhcmQgZGlzYWJsZWRcbiIpOwpAQCAtNzU2LDcgKzcxOCw4IEBACiAgIE91dHB1dDoKIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGZ0MTAwMF9zZW5kX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgKnB0ZW1wYnVmZmVyLCBpbnQgc2l6ZSwgdTE2IHF0eXBlKQorc3RhdGljIHZvaWQgZnQxMDAwX3NlbmRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqcHRlbXBidWZmZXIsIGludCBzaXplLAorCQkJICAgIHUxNiBxdHlwZSkKIHsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOwpAQCAtODUwLDc0ICs4MTMsNzMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewotCQlzaXplID0gKGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgKnBueHRwaCkpICsgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKTsKKwkJc2l6ZSA9IGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgKnBueHRwaCkKKwkJCSsgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKTsKIAl9IGVsc2UgewotCQlzaXplID0KLQkJCW50b2hzKGZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNgotCQkJICAgICAgKGRldiwgRlQxMDAwX01BR19QSF9MRU4sCi0JCQkgICAgICAgRlQxMDAwX01BR19QSF9MRU5fSU5EWCkpICsgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKTsKKwkJc2l6ZSA9IG50b2hzKGZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfUEhfTEVOLAorCQkJCQkJICAgICAgRlQxMDAwX01BR19QSF9MRU5fSU5EWCkpCisJCQkJKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpOwogCX0KIAlpZiAoc2l6ZSA+IG1heHN6KSB7CiAJCXByX2RlYnVnKCJJbnZhbGlkIGNvbW1hbmQgbGVuZ3RoID0gJWRcbiIsIHNpemUpOwogCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJcHBzZXVkb2hkciA9ICh1MTYgKilwYnVmZmVyOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+ZHByYW1fbG9jaywgZmxhZ3MpOwotCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQlmdDEwMDBfd3JpdGVfcmVnKGRldiwgRlQxMDAwX1JFR19EUFJBTV9BRERSLAotCQkJCQkgRlQxMDAwX0RQUkFNX1JYX0JBU0UgKyAyKTsKLQkJCWZvciAoaSA9IDA7IGkgPD0gKHNpemUgPj4gMSk7IGkrKykgewotCQkJCXRlbXB3b3JkID0KLQkJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19EUFJBTV9EQVRBKTsKLQkJCQkqcGJ1ZmZlcisrID0gbnRvaHModGVtcHdvcmQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZnQxMDAwX3dyaXRlX3JlZyhkZXYsIEZUMTAwMF9SRUdfRFBSQU1fQUREUiwKLQkJCQkJIEZUMTAwMF9EUFJBTV9NQUdfUlhfQkFTRSk7Ci0JCQkqcGJ1ZmZlciA9IGludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RQREFUQUgpOwotCQkJcHJfZGVidWcoInJlY2VpdmVkIGRhdGEgPSAweCV4XG4iLCAqcGJ1ZmZlcik7Ci0JCQlwYnVmZmVyKys7Ci0JCQlmdDEwMDBfd3JpdGVfcmVnKGRldiwgRlQxMDAwX1JFR19EUFJBTV9BRERSLAotCQkJCQkgRlQxMDAwX0RQUkFNX01BR19SWF9CQVNFICsgMSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDw9IChzaXplID4+IDIpOyBpKyspIHsKLQkJCQkqcGJ1ZmZlciA9Ci0JCQkJCWludyhkZXYtPmJhc2VfYWRkciArCi0JCQkJCSAgICBGVDEwMDBfUkVHX01BR19EUERBVEFMKTsKLQkJCQlwYnVmZmVyKys7Ci0JCQkJKnBidWZmZXIgPQotCQkJCQlpbncoZGV2LT5iYXNlX2FkZHIgKwotCQkJCQkgICAgRlQxMDAwX1JFR19NQUdfRFBEQVRBSCk7Ci0JCQkJcGJ1ZmZlcisrOwotCQkJfQotCQkJLyogY29weSBvZGQgYWxpZ25lZCB3b3JkICovCi0JCQkqcGJ1ZmZlciA9IGludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RQREFUQUwpOwotCQkJcHJfZGVidWcoInJlY2VpdmVkIGRhdGEgPSAweCV4XG4iLCAqcGJ1ZmZlcik7Ci0JCQlwYnVmZmVyKys7Ci0JCQkqcGJ1ZmZlciA9IGludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RQREFUQUgpOwotCQkJcHJfZGVidWcoInJlY2VpdmVkIGRhdGEgPSAweCV4XG4iLCAqcGJ1ZmZlcik7Ci0JCQlwYnVmZmVyKys7Ci0JCX0KLQkJaWYgKHNpemUgJiAweDAwMDEpIHsKLQkJCS8qIGNvcHkgb2RkIGJ5dGUgZnJvbSBmaWZvICovCi0JCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfRFBSQU1fREFUQSk7Ci0JCQkqcGJ1ZmZlciA9IG50b2hzKHRlbXB3b3JkKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5kcHJhbV9sb2NrLCBmbGFncyk7Ci0KLQkJLyoKLQkJICogQ2hlY2sgaWYgcHNldWRvIGhlYWRlciBjaGVja3N1bSBpcyBnb29kCi0JCSAqIENhbGN1bGF0ZSBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtCi0JCSAqLwotCQl0ZW1wd29yZCA9ICpwcHNldWRvaGRyKys7Ci0JCWZvciAoaSA9IDE7IGkgPCA3OyBpKyspCi0JCQl0ZW1wd29yZCBePSAqcHBzZXVkb2hkcisrOwotCQlpZiAoKHRlbXB3b3JkICE9ICpwcHNldWRvaGRyKSkgewotCQkJcHJfZGVidWcoIlBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gbWlzbWF0Y2hcbiIpOwotCQkJLyogRHJvcCB0aGlzIG1lc3NhZ2UgKi8KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKIAl9CisJcHBzZXVkb2hkciA9ICh1MTYgKilwYnVmZmVyOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5kcHJhbV9sb2NrLCBmbGFncyk7CisJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgeworCQlmdDEwMDBfd3JpdGVfcmVnKGRldiwgRlQxMDAwX1JFR19EUFJBTV9BRERSLAorCQkJCSBGVDEwMDBfRFBSQU1fUlhfQkFTRSArIDIpOworCQlmb3IgKGkgPSAwOyBpIDw9IChzaXplID4+IDEpOyBpKyspIHsKKwkJCXRlbXB3b3JkID0KKwkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0RBVEEpOworCQkJKnBidWZmZXIrKyA9IG50b2hzKHRlbXB3b3JkKTsKKwkJfQorCX0gZWxzZSB7CisJCWZ0MTAwMF93cml0ZV9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0FERFIsCisJCQkJIEZUMTAwMF9EUFJBTV9NQUdfUlhfQkFTRSk7CisJCSpwYnVmZmVyID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfRFBEQVRBSCk7CisJCXByX2RlYnVnKCJyZWNlaXZlZCBkYXRhID0gMHgleFxuIiwgKnBidWZmZXIpOworCQlwYnVmZmVyKys7CisJCWZ0MTAwMF93cml0ZV9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0FERFIsCisJCQkJIEZUMTAwMF9EUFJBTV9NQUdfUlhfQkFTRSArIDEpOworCQlmb3IgKGkgPSAwOyBpIDw9IChzaXplID4+IDIpOyBpKyspIHsKKwkJCSpwYnVmZmVyID0KKwkJCQlpbncoZGV2LT5iYXNlX2FkZHIgKworCQkJCSAgICBGVDEwMDBfUkVHX01BR19EUERBVEFMKTsKKwkJCXBidWZmZXIrKzsKKwkJCSpwYnVmZmVyID0KKwkJCQlpbncoZGV2LT5iYXNlX2FkZHIgKworCQkJCSAgICBGVDEwMDBfUkVHX01BR19EUERBVEFIKTsKKwkJCXBidWZmZXIrKzsKKwkJfQorCQkvKiBjb3B5IG9kZCBhbGlnbmVkIHdvcmQgKi8KKwkJKnBidWZmZXIgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19EUERBVEFMKTsKKwkJcHJfZGVidWcoInJlY2VpdmVkIGRhdGEgPSAweCV4XG4iLCAqcGJ1ZmZlcik7CisJCXBidWZmZXIrKzsKKwkJKnBidWZmZXIgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19EUERBVEFIKTsKKwkJcHJfZGVidWcoInJlY2VpdmVkIGRhdGEgPSAweCV4XG4iLCAqcGJ1ZmZlcik7CisJCXBidWZmZXIrKzsKKwl9CisJaWYgKHNpemUgJiAweDAwMDEpIHsKKwkJLyogY29weSBvZGQgYnl0ZSBmcm9tIGZpZm8gKi8KKwkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0RBVEEpOworCQkqcGJ1ZmZlciA9IG50b2hzKHRlbXB3b3JkKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+ZHByYW1fbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBDaGVjayBpZiBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtIGlzIGdvb2QKKwkgKiBDYWxjdWxhdGUgcHNldWRvIGhlYWRlciBjaGVja3N1bQorCSAqLworCXRlbXB3b3JkID0gKnBwc2V1ZG9oZHIrKzsKKwlmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorCQl0ZW1wd29yZCBePSAqcHBzZXVkb2hkcisrOworCWlmICh0ZW1wd29yZCAhPSAqcHBzZXVkb2hkcikgeworCQlwcl9kZWJ1ZygiUHNldWRvIGhlYWRlciBjaGVja3N1bSBtaXNtYXRjaFxuIik7CisJCS8qIERyb3AgdGhpcyBtZXNzYWdlICovCisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05NTcsNyArOTE5LDEwIEBACiAKIAlpZiAoZnQxMDAwX3JlY2VpdmVfY21kKGRldiwgJmNtZGJ1ZmZlclswXSwgTUFYX0NNRF9TUVNJWkUsICZ0ZW1wd29yZCkpIHsKIAotCQkvKiBHZXQgdGhlIG1lc3NhZ2UgdHlwZSB3aGljaCBpcyB0b3RhbF9sZW4gKyBQU0VVRE8gaGVhZGVyICsgbXNndHlwZSArIG1lc3NhZ2UgYm9keSAqLworCQkvKgorCQkgKiBHZXQgdGhlIG1lc3NhZ2UgdHlwZSB3aGljaCBpcyB0b3RhbF9sZW4gKyBQU0VVRE8gaGVhZGVyCisJCSAqICsgbXNndHlwZSArIG1lc3NhZ2UgYm9keQorCQkgKi8KIAkJcGRydm1zZyA9IChzdHJ1Y3QgZHJ2X21zZyAqKSZjbWRidWZmZXJbMF07CiAJCW1zZ3R5cGUgPSBudG9ocyhwZHJ2bXNnLT50eXBlKTsKIAkJcHJfZGVidWcoIkNvbW1hbmQgbWVzc2FnZSB0eXBlID0gMHgleFxuIiwgbXNndHlwZSk7CkBAIC05NjgsOCArOTMzLDggQEAKIAkJCXdoaWxlIChsaXN0X2VtcHR5KCZpbmZvLT5wcm92X2xpc3QpID09IDApIHsKIAkJCQlwcl9kZWJ1ZygiU2VuZGluZyBhIHByb3Zpc2lvbmluZyBtZXNzYWdlXG4iKTsKIAkJCQkvKiBNYWtlIHN1cmUgU0xPV1EgZG9vcmJlbGwgaXMgY2xlYXIgKi8KLQkJCQl0ZW1wd29yZCA9Ci0JCQkJCWZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOworCQkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwKKwkJCQkJCQkgICBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKIAkJCQlpID0gMDsKIAkJCQl3aGlsZSAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fVFgpIHsKIAkJCQkJbWRlbGF5KDUpOwpAQCAtOTc3LDkgKzk0Miw4IEBACiAJCQkJCWlmIChpID09IDEwKQogCQkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCXB0ciA9Ci0JCQkJCWxpc3RfZW50cnkoaW5mby0+cHJvdl9saXN0Lm5leHQsCi0JCQkJCQkgICBzdHJ1Y3QgcHJvdl9yZWNvcmQsIGxpc3QpOworCQkJCXB0ciA9IGxpc3RfZW50cnkoaW5mby0+cHJvdl9saXN0Lm5leHQsCisJCQkJCQkgc3RydWN0IHByb3ZfcmVjb3JkLCBsaXN0KTsKIAkJCQlsZW4gPSAqKHUxNiAqKXB0ci0+cHByb3ZfZGF0YTsKIAkJCQlsZW4gPSBodG9ucyhsZW4pOwogCkBAIC05OTgsMTQgKzk2MiwxNSBAQAogCQkJCQkJIHBwc2V1ZG9faGRyLT5jaGVja3N1bSk7CiAJCQkJfQogCi0JCQkJZnQxMDAwX3NlbmRfY21kKGRldiwgKHUxNiAqKXB0ci0+cHByb3ZfZGF0YSwgbGVuLCBTTE9XUV9UWVBFKTsKKwkJCQlmdDEwMDBfc2VuZF9jbWQoZGV2LCAodTE2ICopcHRyLT5wcHJvdl9kYXRhLAorCQkJCQkJbGVuLCBTTE9XUV9UWVBFKTsKIAkJCQlsaXN0X2RlbCgmcHRyLT5saXN0KTsKIAkJCQlrZnJlZShwdHItPnBwcm92X2RhdGEpOwogCQkJCWtmcmVlKHB0cik7CiAJCQl9CiAJCQkvKgotCQkJICogSW5kaWNhdGUgYWRhcHRlciBpcyByZWFkeSB0byB0YWtlIGFwcGxpY2F0aW9uIG1lc3NhZ2VzIGFmdGVyIGFsbAotCQkJICogcHJvdmlzaW9uaW5nIG1lc3NhZ2VzIGFyZSBzZW50CisJCQkgKiBJbmRpY2F0ZSBhZGFwdGVyIGlzIHJlYWR5IHRvIHRha2UgYXBwbGljYXRpb24KKwkJCSAqIG1lc3NhZ2VzIGFmdGVyIGFsbCBwcm92aXNpb25pbmcgbWVzc2FnZXMgYXJlIHNlbnQKIAkJCSAqLwogCQkJaW5mby0+Q2FyZFJlYWR5ID0gMTsKIAkJCWJyZWFrOwpAQCAtMTA5Myw4ICsxMDU4LDggQEAKIAkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAJCQlpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fVFgpIHsKIAkJCQltZGVsYXkoMTApOwotCQkJCXRlbXB3b3JkID0KLQkJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ET09SQkVMTCk7CisJCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LAorCQkJCQkJCSAgIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogCQkJCWlmICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkKIAkJCQkJbWRlbGF5KDEwKTsKIAkJCX0KQEAgLTExMjksNyArMTA5NCw5IEBACiAJCQkJaW5mby0+RFNQSW5mb0Jsa1s4XSA9IDB4NzIwMDsKIAkJCQlpbmZvLT5EU1BJbmZvQmxrWzldID0KIAkJCQkJaHRvbnMoaW5mby0+RFNQSW5mb0Jsa2xlbik7Ci0JCQkJZnQxMDAwX3NlbmRfY21kKGRldiwgKHUxNiAqKWluZm8tPkRTUEluZm9CbGssICh1MTYpKGluZm8tPkRTUEluZm9CbGtsZW4rNCksIDApOworCQkJCWZ0MTAwMF9zZW5kX2NtZChkZXYsIGluZm8tPkRTUEluZm9CbGssCisJCQkJCQkodTE2KShpbmZvLT5EU1BJbmZvQmxrbGVuKzQpLAorCQkJCQkJMCk7CiAJCQl9CiAKIAkJCWJyZWFrOwpAQCAtMTE0Myw4ICsxMTEwLDggQEAKIAkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAJCQlpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fVFgpIHsKIAkJCQltZGVsYXkoMTApOwotCQkJCXRlbXB3b3JkID0KLQkJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ET09SQkVMTCk7CisJCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LAorCQkJCQkJCSAgIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogCQkJCWlmICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkKIAkJCQkJbWRlbGF5KDEwKTsKIAkJCX0KQEAgLTExOTAsNyArMTE1Nyw4IEBACiAJCQkJKnBtc2crKyA9IGNvbnZlcnQud3JkOwogCQkJCSpwbXNnKysgPSBodG9ucyhpbmZvLT5EcnZFcnJOdW0pOwogCi0JCQkJZnQxMDAwX3NlbmRfY21kKGRldiwgKHUxNiAqKSZ0ZW1wYnVmZmVyWzBdLCAodTE2KSgweDAwMTIpLCAwKTsKKwkJCQlmdDEwMDBfc2VuZF9jbWQoZGV2LCAodTE2ICopJnRlbXBidWZmZXJbMF0sCisJCQkJCQkodTE2KSgweDAwMTIpLCAwKTsKIAkJCQlpbmZvLT5EcnZFcnJOdW0gPSAwOwogCQkJfQogCkBAIC0xMjgxLDI4ICsxMjQ5LDMwIEBACiAJCQkJICAgICAgIEZUMTAwMF9NQUdfVE9UQUxfTEVOX0lORFgpKTsKIAkJfQogCQlwcl9kZWJ1ZygidG90YWwgbGVuZ3RoID0gJWRcbiIsIHRvdGFsX2xlbik7Ci0JCWlmICgodG90YWxfbGVuIDwgTUFYX0NNRF9TUVNJWkUpICYmICh0b3RhbF9sZW4gPiBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSkgeworCQlpZiAoKHRvdGFsX2xlbiA8IE1BWF9DTURfU1FTSVpFKQorCQkJCSYmICh0b3RhbF9sZW4gPiBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSkgewogCQkJdG90YWxfbGVuICs9IG54dHBoOwogCQkJLyoKLQkJCSAqIGZ0MTAwMF9yZWFkX3JlZyB3aWxsIHJldHVybiBhIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUgYnl0ZXN3YXAKLQkJCSAqIGluIG9yZGVyIHRvIGdldCBEU1BfUUlEX09GRlNFVC4KKwkJCSAqIGZ0MTAwMF9yZWFkX3JlZyB3aWxsIHJldHVybiBhIHZhbHVlIHRoYXQgbmVlZHMgdG8gYmUKKwkJCSAqIGJ5dGVzd2FwIGluIG9yZGVyIHRvIGdldCBEU1BfUUlEX09GRlNFVC4KIAkJCSAqLwogCQkJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewotCQkJCXBvcnRpZCA9Ci0JCQkJCShmdDEwMDBfcmVhZF9kcHJhbQotCQkJCQkgKGRldiwKLQkJCQkJICBEU1BfUUlEX09GRlNFVCArIEZUMTAwMF9EUFJBTV9SWF9CQVNFICsKLQkJCQkJICAyKSA+PiA4KSAmIDB4ZmY7CisJCQkJcG9ydGlkID0gKGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRFNQX1FJRF9PRkZTRVQKKwkJCQkJCSsgRlQxMDAwX0RQUkFNX1JYX0JBU0UgKyAyKQorCQkJCQkJPj4gOCkgJiAweGZmOwogCQkJfSBlbHNlIHsKIAkJCQlwb3J0aWQgPQotCQkJCQkoZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2CisJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNgogCQkJCQkgKGRldiwgRlQxMDAwX01BR19QT1JUX0lELAotCQkJCQkgIEZUMTAwMF9NQUdfUE9SVF9JRF9JTkRYKSAmIDB4ZmYpOworCQkJCQkgIEZUMTAwMF9NQUdfUE9SVF9JRF9JTkRYKSAmIDB4ZmY7CiAJCQl9CiAJCQlwcl9kZWJ1ZygiRFNQX1FJRCA9IDB4JXhcbiIsIHBvcnRpZCk7CiAKIAkJCWlmIChwb3J0aWQgPT0gRFJJVkVSSUQpIHsKLQkJCQkvKiBXZSBhcmUgYXNzdW1taW5nIG9uZSBkcml2ZXIgbWVzc2FnZSBmcm9tIHRoZSBEU1AgYXQgYSB0aW1lLiAqLworCQkJCS8qCisJCQkJICogV2UgYXJlIGFzc3VtbWluZyBvbmUgZHJpdmVyIG1lc3NhZ2UgZnJvbSB0aGUKKwkJCQkgKiBEU1AgYXQgYSB0aW1lLgorCQkJCSAqLwogCQkJCWZ0MTAwMF9wcm9jX2Rydm1zZyhkZXYpOwogCQkJfQogCQl9CkBAIC0xMzExLDI5ICsxMjgxLDcgQEAKIAogCWlmIChkb29yYmVsbCAmIEZUMTAwMF9EQl9DT05EX1JFU0VUKSB7CiAJCS8qIFJlc2V0IEFTSUMgYW5kIERTUCAqLwotCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMCk7Ci0JCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMSk7Ci0JCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMik7Ci0JCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMyk7Ci0JCX0gZWxzZSB7Ci0JCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIwLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWCk7Ci0JCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIxLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7Ci0JCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIyLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWCk7Ci0JCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIzLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWCk7Ci0JCX0KKwkJZnQxMDAwX3JlYWRfZHNwX3RpbWVyKGRldiwgaW5mbyk7CiAJCWluZm8tPkRydkVyck51bSA9IERTUF9DT05EUkVTRVRfSU5GTzsKIAkJcHJfZGVidWcoIkRTUCBjb25kaXRpb25hbCByZXNldCByZXF1ZXN0ZWRcbiIpOwogCQlmdDEwMDBfcmVzZXRfY2FyZChkZXYpOwpAQCAtMTM3NCwxMzEgKzEzMjIsODQgQEAKIAl1MTYgdGVtcHdvcmQ7CiAKIAlpZiAocGNtY2lhLT5Qa3RJbnRmRXJyID4gTUFYX1BIX0VSUikgewotCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMCk7Ci0JCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMSk7Ci0JCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMik7Ci0JCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMyk7Ci0JCX0gZWxzZSB7Ci0JCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIwLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWCk7Ci0JCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIxLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7Ci0JCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIyLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWCk7Ci0JCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIzLAotCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWCk7Ci0JCX0KKwkJZnQxMDAwX3JlYWRfZHNwX3RpbWVyKGRldiwgaW5mbyk7CiAJCWluZm8tPkRydkVyck51bSA9IERydkVyck51bTsKIAkJZnQxMDAwX3Jlc2V0X2NhcmQoZGV2KTsKIAkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCS8qIEZsdXNoIGNvcnJ1cHRlZCBwa3QgZnJvbSBGSUZPICovCi0JCWkgPSAwOwotCQlkbyB7Ci0JCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CisJfQorCS8qIEZsdXNoIGNvcnJ1cHRlZCBwa3QgZnJvbSBGSUZPICovCisJaSA9IDA7CisJZG8geworCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CisJCQl0ZW1wd29yZCA9CisJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ERklGTyk7CisJCQl0ZW1wd29yZCA9CisJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ERklGT19TVEFUKTsKKwkJfSBlbHNlIHsKKwkJCXRlbXBsb25nID0KKwkJCQlpbmwoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19ERlIpOworCQkJdGVtcHdvcmQgPQorCQkJCWludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RGU1IpOworCQl9CisJCWkrKzsKKwkJLyoKKwkJICogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyB0aGUgQVNJQyBpcyBicm9rZW4uCisJCSAqIFdlIG11c3QgcmVzZXQgdG8gcmVjb3Zlci4KKwkJICovCisJCWlmICgoaSA+IDIwNDgpIHx8ICh0ZW1wd29yZCA9PSAwKSkgeworCQkJZnQxMDAwX3JlYWRfZHNwX3RpbWVyKGRldiwgaW5mbyk7CisJCQlpZiAodGVtcHdvcmQgPT0gMCkgeworCQkJCS8qCisJCQkJICogTGV0J3MgY2hlY2sgaWYgQVNJQyByZWFkcyBhcmUgc3RpbGwgb2sgYnkKKwkJCQkgKiByZWFkaW5nIHRoZSBNYXNrIHJlZ2lzdGVyIHdoaWNoIGlzIG5ldmVyIHplcm8KKwkJCQkgKiBhdCB0aGlzIHBvaW50IG9mIHRoZSBjb2RlLgorCQkJCSAqLwogCQkJCXRlbXB3b3JkID0KLQkJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ERklGTyk7Ci0JCQkJdGVtcHdvcmQgPQotCQkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RGSUZPX1NUQVQpOwotCQkJfSBlbHNlIHsKLQkJCQl0ZW1wbG9uZyA9Ci0JCQkJCWlubChkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RGUik7Ci0JCQkJdGVtcHdvcmQgPQotCQkJCQlpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19ERlNSKTsKLQkJCX0KLQkJCWkrKzsKLQkJCS8qCi0JCQkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gdW5sZXNzIHRoZSBBU0lDIGlzIGJyb2tlbi4KLQkJCSAqIFdlIG11c3QgcmVzZXQgdG8gcmVjb3Zlci4KLQkJCSAqLwotCQkJaWYgKChpID4gMjA0OCkgfHwgKHRlbXB3b3JkID09IDApKSB7Ci0JCQkJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewotCQkJCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsCi0JCQkJCQkJCSAgRlQxMDAwX0RTUF9USU1FUjApOwotCQkJCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsCi0JCQkJCQkJCSAgRlQxMDAwX0RTUF9USU1FUjEpOwotCQkJCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsCi0JCQkJCQkJCSAgRlQxMDAwX0RTUF9USU1FUjIpOwotCQkJCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsCi0JCQkJCQkJCSAgRlQxMDAwX0RTUF9USU1FUjMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIwLAotCQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKLQkJCQkJaW5mby0+RFNQX1RJTUVbMV0gPQotCQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjEsCi0JCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIxX0lORFgpOwotCQkJCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwKLQkJCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWCk7Ci0JCQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIzLAotCQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKLQkJCQl9CisJCQkJCWludyhkZXYtPmJhc2VfYWRkciArCisJCQkJCSAgICBGVDEwMDBfUkVHX1NVUF9JTUFTSyk7CiAJCQkJaWYgKHRlbXB3b3JkID09IDApIHsKIAkJCQkJLyoKLQkJCQkJICogTGV0J3MgY2hlY2sgaWYgQVNJQyByZWFkcyBhcmUgc3RpbGwgb2sgYnkgcmVhZGluZyB0aGUgTWFzayByZWdpc3RlcgotCQkJCQkgKiB3aGljaCBpcyBuZXZlciB6ZXJvIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGNvZGUuCisJCQkJCSAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2UgY2FuIG5vdAorCQkJCQkgKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBU0lDCiAJCQkJCSAqLwotCQkJCQl0ZW1wd29yZCA9Ci0JCQkJCQlpbncoZGV2LT5iYXNlX2FkZHIgKwotCQkJCQkJICAgIEZUMTAwMF9SRUdfU1VQX0lNQVNLKTsKLQkJCQkJaWYgKHRlbXB3b3JkID09IDApIHsKLQkJCQkJCS8qIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2UgY2FuIG5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBU0lDICovCi0JCQkJCQlpbmZvLT5EcnZFcnJOdW0gPQotCQkJCQkJCUZJRk9fRkxVU0hfQkFEQ05UOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogTGV0J3MgYXNzdW1lIHRoYXQgd2UgcmVhbGx5IGZsdXNoIHRoZSBGSUZPICovCi0JCQkJCQlwY21jaWEtPlBrdEludGZFcnIrKzsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQorCQkJCQlpbmZvLT5EcnZFcnJOdW0gPSBGSUZPX0ZMVVNIX0JBRENOVDsKIAkJCQl9IGVsc2UgewotCQkJCQlpbmZvLT5EcnZFcnJOdW0gPSBGSUZPX0ZMVVNIX01BWExJTUlUOworCQkJCQkvKgorCQkJCQkgKiBMZXQncyBhc3N1bWUgdGhhdCB3ZSByZWFsbHkgZmx1c2gKKwkJCQkJICogdGhlIEZJRk8KKwkJCQkJICovCisJCQkJCXBjbWNpYS0+UGt0SW50ZkVycisrOworCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJaW5mby0+RHJ2RXJyTnVtID0gRklGT19GTFVTSF9NQVhMSU1JVDsKIAkJCX0KLQkJCXRlbXB3b3JkID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19TVVBfU1RBVCk7Ci0JCX0gd2hpbGUgKCh0ZW1wd29yZCAmIDB4MDMpICE9IDB4MDMpOwotCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQlpKys7Ci0JCQlwcl9kZWJ1ZygiRmx1c2hpbmcgRklGTyBjb21wbGV0ZSA9ICV4XG4iLCB0ZW1wd29yZCk7Ci0JCQkvKiBGbHVzaCBsYXN0IHdvcmQgaW4gRklGTy4gKi8KLQkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ERklGTyk7Ci0JCQkvKiBVcGRhdGUgRklGTyBjb3VudGVyIGZvciBEU1AgKi8KLQkJCWkgPSBpICogMjsKLQkJCXByX2RlYnVnKCJGbHVzaCBEYXRhIGJ5dGUgY291bnQgdG8gZHNwID0gJWRcbiIsIGkpOwotCQkJaW5mby0+Zmlmb19jbnQgKz0gaTsKLQkJCWZ0MTAwMF93cml0ZV9kcHJhbShkZXYsIEZUMTAwMF9GSUZPX0xFTiwKLQkJCQkJICAgaW5mby0+Zmlmb19jbnQpOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIkZsdXNoaW5nIEZJRk8gY29tcGxldGUgPSAleFxuIiwgdGVtcHdvcmQpOwotCQkJLyogRmx1c2ggbGFzdCB3b3JkIGluIEZJRk8gKi8KLQkJCXRlbXBsb25nID0gaW5sKGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfREZSKTsKLQkJCXRlbXB3b3JkID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19TVVBfU1RBVCk7Ci0JCQlwcl9kZWJ1ZygiRlQxMDAwX1JFR19TVVBfU1RBVCA9IDB4JXhcbiIsIHRlbXB3b3JkKTsKLQkJCXRlbXB3b3JkID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfREZTUik7Ci0JCQlwcl9kZWJ1ZygiRlQxMDAwX1JFR19NQUdfREZTUiA9IDB4JXhcbiIsIHRlbXB3b3JkKTsKKwkJCXJldHVybjsKIAkJfQotCQlpZiAoRHJ2RXJyTnVtKQotCQkJcGNtY2lhLT5Qa3RJbnRmRXJyKys7CisJCXRlbXB3b3JkID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19TVVBfU1RBVCk7CisJfSB3aGlsZSAoKHRlbXB3b3JkICYgMHgwMykgIT0gMHgwMyk7CisJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgeworCQlpKys7CisJCXByX2RlYnVnKCJGbHVzaGluZyBGSUZPIGNvbXBsZXRlID0gJXhcbiIsIHRlbXB3b3JkKTsKKwkJLyogRmx1c2ggbGFzdCB3b3JkIGluIEZJRk8uICovCisJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ERklGTyk7CisJCS8qIFVwZGF0ZSBGSUZPIGNvdW50ZXIgZm9yIERTUCAqLworCQlpID0gaSAqIDI7CisJCXByX2RlYnVnKCJGbHVzaCBEYXRhIGJ5dGUgY291bnQgdG8gZHNwID0gJWRcbiIsIGkpOworCQlpbmZvLT5maWZvX2NudCArPSBpOworCQlmdDEwMDBfd3JpdGVfZHByYW0oZGV2LCBGVDEwMDBfRklGT19MRU4sCisJCQkJICAgaW5mby0+Zmlmb19jbnQpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJGbHVzaGluZyBGSUZPIGNvbXBsZXRlID0gJXhcbiIsIHRlbXB3b3JkKTsKKwkJLyogRmx1c2ggbGFzdCB3b3JkIGluIEZJRk8gKi8KKwkJdGVtcGxvbmcgPSBpbmwoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19ERlIpOworCQl0ZW1wd29yZCA9IGludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfU1VQX1NUQVQpOworCQlwcl9kZWJ1ZygiRlQxMDAwX1JFR19TVVBfU1RBVCA9IDB4JXhcbiIsIHRlbXB3b3JkKTsKKwkJdGVtcHdvcmQgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19ERlNSKTsKKwkJcHJfZGVidWcoIkZUMTAwMF9SRUdfTUFHX0RGU1IgPSAweCV4XG4iLCB0ZW1wd29yZCk7CiAJfQorCWlmIChEcnZFcnJOdW0pCisJCXBjbWNpYS0+UGt0SW50ZkVycisrOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU1Miw3ICsxNDUzLDYgQEAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEyICsgMik7CiAKIAlpZiAoc2tiID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIk5vIE5ldHdvcmsgYnVmZmVycyBhdmFpbGFibGVcbiIpOwogCQkvKiBSZWFkIEhpZ2ggd29yZCB0byBjb21wbGV0ZSAzMiBiaXQgYWNjZXNzICovCiAJCWlmIChpbmZvLT5Bc2ljSUQgPT0gTUFHTkVNSVRFX0lEKQogCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX01BR19ERlJIKTsKQEAgLTE2NzMsNyArMTU3Myw4IEBACiAJaW5mby0+c3RhdHMucnhfYnl0ZXMgKz0gKGxlbiArIDEyKTsKIAogCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJLyogdHJhY2sgaG93IG1hbnkgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgZnJvbSBGSUZPIC0gcm91bmQgdXAgdG8gMTYgYml0IHdvcmQgKi8KKwkJLyogdHJhY2sgaG93IG1hbnkgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgZnJvbSBGSUZPIC0gcm91bmQgdXAgdG8KKwkJICogMTYgYml0IHdvcmQgKi8KIAkJdGVtcHdvcmQgPSBsZW4gKyAxNjsKIAkJaWYgKHRlbXB3b3JkICYgMHgwMSkKIAkJCXRlbXB3b3JkKys7CkBAIC0xNzM3LDkgKzE2MzgsMTEgQEAKIAllbHNlCiAJCXBzZXVkby5ibGsubGVuZ3RoID0gbnRvaHMobGVuKTsKIAotCXBzZXVkby5ibGsuc291cmNlID0gRFNQSUQ7CS8qIE5lZWQgdG8gc3dhcCB0byBnZXQgaW4gY29ycmVjdCBvcmRlciAqLworCXBzZXVkby5ibGsuc291cmNlID0gRFNQSUQ7CS8qIE5lZWQgdG8gc3dhcCB0byBnZXQgaW4gY29ycmVjdAorCQkJCQkgICBvcmRlciAqLwogCXBzZXVkby5ibGsuZGVzdGluYXRpb24gPSBIT1NUSUQ7Ci0JcHNldWRvLmJsay5wb3J0ZGVzdCA9IE5FVFdPUktJRDsJLyogTmVlZCB0byBzd2FwIHRvIGdldCBpbiBjb3JyZWN0IG9yZGVyICovCisJcHNldWRvLmJsay5wb3J0ZGVzdCA9IE5FVFdPUktJRDsJLyogTmVlZCB0byBzd2FwIHRvIGdldCBpbgorCQkJCQkJICAgY29ycmVjdCBvcmRlciAqLwogCXBzZXVkby5ibGsucG9ydHNyYyA9IERTUEFJUklEOwogCXBzZXVkby5ibGsuc2hfc3RyX2lkID0gMDsKIAlwc2V1ZG8uYmxrLmNvbnRyb2wgPSAwOwpAQCAtMTg0Myw3ICsxNzQ2LDggQEAKIHsKIAlmdDEwMDBfcmVzZXRfY2FyZChkZXYpOwogCi0JLyogc2NoZWR1bGUgZnQxMDAwX2hiY2hrIHRvIHBlcmZvcm0gcGVyaW9kaWMgaGVhcnRiZWF0IGNoZWNrcyBvbiBEU1AgYW5kIEFTSUMgKi8KKwkvKiBzY2hlZHVsZSBmdDEwMDBfaGJjaGsgdG8gcGVyZm9ybSBwZXJpb2RpYyBoZWFydGJlYXQgY2hlY2tzIG9uIERTUAorCSAqIGFuZCBBU0lDICovCiAJaW5pdF90aW1lcigmcG9sbF90aW1lcik7CiAJcG9sbF90aW1lci5leHBpcmVzID0gamlmZmllcyArICgyICogSFopOwogCXBvbGxfdGltZXIuZGF0YSA9ICh1X2xvbmcpZGV2OwpAQCAtMTkyOCw3ICsxODMyLDggQEAKIAkvKiBSZWFkIGludGVycnVwdCB0eXBlICovCiAJaW50dHlwZSA9IGZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfU1VQX0lTUik7CiAKLQkvKiBNYWtlIHN1cmUgd2UgcHJvY2VzcyBhbGwgaW50ZXJydXB0IGJlZm9yZSBsZWF2aW5nIHRoZSBJU1IgZHVlIHRvIHRoZSBlZGdlIHRyaWdnZXIgaW50ZXJydXB0IHR5cGUgKi8KKwkvKiBNYWtlIHN1cmUgd2UgcHJvY2VzcyBhbGwgaW50ZXJydXB0IGJlZm9yZSBsZWF2aW5nIHRoZSBJU1IgZHVlIHRvIHRoZQorCSAqIGVkZ2UgdHJpZ2dlciBpbnRlcnJ1cHQgdHlwZSAqLwogCXdoaWxlIChpbnR0eXBlKSB7CiAJCWlmIChpbnR0eXBlICYgSVNSX0RPT1JCRUxMX1BFTkQpCiAJCQlmdDEwMDBfcGFyc2VfZHByYW1fbXNnKGRldik7CkBAIC0xOTM4LDIxICsxODQzLDE4IEBACiAKIAkJCWNudCA9IDA7CiAJCQlkbyB7Ci0JCQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBwYWNrZXRzIGluIHRoZSBEb3dubGluayBGSUZPICovCisJCQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBwYWNrZXRzIGluIHRoZSBEb3dubGluaworCQkJCSAqIEZJRk8gKi8KIAkJCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQkJCXRlbXB3b3JkID0KLQkJCQkJCWZ0MTAwMF9yZWFkX3JlZyhkZXYsCi0JCQkJCQkJCUZUMTAwMF9SRUdfREZJRk9fU1RBVCk7CisJCQkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwKKwkJCQkJCQlGVDEwMDBfUkVHX0RGSUZPX1NUQVQpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXRlbXB3b3JkID0KLQkJCQkJCWZ0MTAwMF9yZWFkX3JlZyhkZXYsCi0JCQkJCQkJCUZUMTAwMF9SRUdfTUFHX0RGU1IpOworCQkJCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX3JlZyhkZXYsCisJCQkJCQkJRlQxMDAwX1JFR19NQUdfREZTUik7CiAJCQkJfQotCQkJCWlmICh0ZW1wd29yZCAmIDB4MWYpIHsKLQkJCQkJZnQxMDAwX2NvcHlfdXBfcGt0KGRldik7Ci0JCQkJfSBlbHNlIHsKKwkJCQlpZiAoISh0ZW1wd29yZCAmIDB4MWYpKQogCQkJCQlicmVhazsKLQkJCQl9CisJCQkJZnQxMDAwX2NvcHlfdXBfcGt0KGRldik7CiAJCQkJY250Kys7CiAJCQl9IHdoaWxlIChjbnQgPCBNQVhfUkNWX0xPT1ApOwogCkBAIC0xOTc1LDYgKzE4NzcsNyBAQAogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHByb3ZfcmVjb3JkICpwdHI7CisJc3RydWN0IHByb3ZfcmVjb3JkICp0bXA7CiAJLyogaW50IGNudDsgKi8KIAogCWluZm8tPkNhcmRSZWFkeSA9IDA7CkBAIC0xOTgzLDggKzE4ODYsNyBAQAogCWZ0MTAwMF9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBmcmVlIGFueSBtZW1vcnkgcmVzZXJ2ZSBmb3IgcHJvdmlzaW9uaW5nICovCi0Jd2hpbGUgKGxpc3RfZW1wdHkoJmluZm8tPnByb3ZfbGlzdCkgPT0gMCkgewotCQlwdHIgPSBsaXN0X2VudHJ5KGluZm8tPnByb3ZfbGlzdC5uZXh0LCBzdHJ1Y3QgcHJvdl9yZWNvcmQsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdHIsIHRtcCwgJmluZm8tPnByb3ZfbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbCgmcHRyLT5saXN0KTsKIAkJa2ZyZWUocHRyLT5wcHJvdl9kYXRhKTsKIAkJa2ZyZWUocHRyKTsKQEAgLTIwMDgsNiArMTkxMCw3IEBACiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmZ0X2luZm87CisKIAlmdF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCAiZnQxMDAwIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwpAQCAtMjAzOCw4ICsxOTQxLDcgQEAKIAlzdHJ1Y3QgZnQxMDAwX3BjbWNpYSAqcGNtY2lhOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKLQlzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGZ0MTAwMG9wcyA9CQkvKiBTbGF2aXVzIDIxLjEwLjIwMDkgZHVlIHRvIGtlcm5lbCBjaGFuZ2VzICovCi0JCXsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGZ0MTAwMG9wcyA9IHsKIAkJCS5uZG9fb3BlbiA9ICZmdDEwMDBfb3BlbiwKIAkJCS5uZG9fc3RvcCA9ICZmdDEwMDBfY2xvc2UsCiAJCQkubmRvX3N0YXJ0X3htaXQgPSAmZnQxMDAwX3N0YXJ0X3htaXQsCkBAIC0yMTAyLDcgKzIwMDQsNyBAQAogCS8qIGRldi0+b3BlbiA9ICZmdDEwMDBfb3BlbjsgKi8KIAkvKiBkZXYtPnN0b3AgPSAmZnQxMDAwX2Nsb3NlOyAqLwogCi0JZGV2LT5uZXRkZXZfb3BzID0gJmZ0MTAwMG9wczsJCS8qIFNsYXZpdXMgMjEuMTAuMjAwOSBkdWUgdG8ga2VybmVsIGNoYW5nZXMgKi8KKwlkZXYtPm5ldGRldl9vcHMgPSAmZnQxMDAwb3BzOwogCiAJcHJfZGVidWcoImRldmljZSBuYW1lID0gJXNcbiIsIGRldi0+bmFtZSk7CiAKQEAgLTIxMTMsNyArMjAxNSw4IEBACiAJCWdvdG8gZXJyX2RldjsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGZ0MTAwMF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikpIHsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGZ0MTAwMF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsCisJCQlkZXYpKSB7CiAJCW5ldGRldl9lcnIoZGV2LCAiQ291bGQgbm90IHJlcXVlc3RfaXJxXG4iKTsKIAkJZ290byBlcnJfZGV2OwogCX0KQEAgLTIxMjMsNyArMjAyNiw3IEBACiAJCWdvdG8gZXJyX2lycTsKIAl9CiAKLQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgewogCQlwcl9kZWJ1ZygiQ291bGQgbm90IHJlZ2lzdGVyIG5ldGRldlxuIik7CiAJCWdvdG8gZXJyX3JlZzsKIAl9CkBAIC0yMTMxLDEzICsyMDM0LDE1IEBACiAJaW5mby0+QXNpY0lEID0gZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19BU0lDX0lEKTsKIAlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CiAJCXByX2RlYnVnKCJFTEVDVFJBQlVaWiBBU0lDXG4iKTsKLQkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiZnQxMDAwLmltZyIsICZsaW5rLT5kZXYpICE9IDApIHsKKwkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiZnQxMDAwLmltZyIsCisJCQkJICAgICAmbGluay0+ZGV2KSAhPSAwKSB7CiAJCQlwcl9pbmZvKCJDb3VsZCBub3Qgb3BlbiBmdDEwMDAuaW1nXG4iKTsKIAkJCWdvdG8gZXJyX3VucmVnOwogCQl9CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoIk1BR05FTUlURSBBU0lDXG4iKTsKLQkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiZnQyMDAwLmltZyIsICZsaW5rLT5kZXYpICE9IDApIHsKKwkJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiZnQyMDAwLmltZyIsCisJCQkJICAgICAmbGluay0+ZGV2KSAhPSAwKSB7CiAJCQlwcl9pbmZvKCJDb3VsZCBub3Qgb3BlbiBmdDIwMDAuaW1nXG4iKTsKIAkJCWdvdG8gZXJyX3VucmVnOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2RlYnVnLmMKaW5kZXggYzhkMjc4Mi4uMmQ3NThmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZGVidWcuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJdG1wLT5kZW50ID0gZGlyOwogCXRtcC0+ZmlsZSA9IGZpbGU7CiAJdG1wLT5pbnRfbnVtYmVyID0gZGV2LT5DYXJkTnVtYmVyOwotCWxpc3RfYWRkKCYodG1wLT5saXN0KSwgJihkZXYtPm5vZGVzLmxpc3QpKTsKKwlsaXN0X2FkZCgmdG1wLT5saXN0LCAmZGV2LT5ub2Rlcy5saXN0KTsKIAogCXByX2RlYnVnKCJyZWdpc3RlcmVkIGRlYnVnZnMgZGlyZWN0b3J5IFwiJXNcIlxuIiwgZGV2LT5EZXZpY2VOYW1lKTsKIApAQCAtMzAxLDcgKzMwMSw3IEBACiAJc3RydWN0IGZ0MTAwMF91c2IgKmRldiA9IChzdHJ1Y3QgZnQxMDAwX3VzYiAqKWlub2RlLT5pX3ByaXZhdGU7CiAJaW50IGksIG51bTsKIAotCW51bSA9IChNSU5PUihpbm9kZS0+aV9yZGV2KSAmIDB4Zik7CisJbnVtID0gTUlOT1IoaW5vZGUtPmlfcmRldikgJiAweGY7CiAJcHJfZGVidWcoIm1pbm9yIG51bWJlcj0lZFxuIiwgbnVtKTsKIAogCWluZm8gPSBmaWxlLT5wcml2YXRlX2RhdGEgPSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CkBAIC0zMTcsOSArMzE3LDggQEAKIAogCS8qIFNlYXJjaCBmb3IgYXZhaWxhYmxlIGFwcGxpY2F0aW9uIGluZm8gYmxvY2sgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9BUFA7IGkrKykgewotCQlpZiAoKGRldi0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSBOVUxMKSkgeworCQlpZiAoKGRldi0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSBOVUxMKSkKIAkJCWJyZWFrOwotCQl9CiAJfQogCiAJLyogRmFpbCBkdWUgdG8gbGFjayBvZiBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrICovCkBAIC00NzgsMTQgKzQ3NywxNCBAQAogCQkvKiBDb25uZWN0IE1lc3NhZ2UgKi8KIAkJcHJfZGVidWcoIklPQ1RMX0ZUMTAwMF9DT05ORUNUXG4iKTsKIAkJQ29ubmVjdGlvbk1zZ1s3OV0gPSAweGZjOwotCQlyZXN1bHQgPSBjYXJkX3NlbmRfY29tbWFuZChmdDEwMDBkZXYsICh1bnNpZ25lZCBzaG9ydCAqKUNvbm5lY3Rpb25Nc2csIDB4NGMpOworCQlyZXN1bHQgPSBjYXJkX3NlbmRfY29tbWFuZChmdDEwMDBkZXYsIENvbm5lY3Rpb25Nc2csIDB4NGMpOwogCiAJCWJyZWFrOwogCWNhc2UgSU9DVExfRElTQ09OTkVDVDoKIAkJLyogRGlzY29ubmVjdCBNZXNzYWdlICovCiAJCXByX2RlYnVnKCJJT0NUTF9GVDEwMDBfRElTQ09OTkVDVFxuIik7CiAJCUNvbm5lY3Rpb25Nc2dbNzldID0gMHhmZDsKLQkJcmVzdWx0ID0gY2FyZF9zZW5kX2NvbW1hbmQoZnQxMDAwZGV2LCAodW5zaWduZWQgc2hvcnQgKilDb25uZWN0aW9uTXNnLCAweDRjKTsKKwkJcmVzdWx0ID0gY2FyZF9zZW5kX2NvbW1hbmQoZnQxMDAwZGV2LCBDb25uZWN0aW9uTXNnLCAweDRjKTsKIAkJYnJlYWs7CiAJY2FzZSBJT0NUTF9HRVRfRFNQX1NUQVRfQ01EOgogCQkvKiBwcl9kZWJ1ZygiSU9DVExfRlQxMDAwX0dFVF9EU1BfU1RBVFxuIik7ICovCkBAIC01NDUsNyArNTQ0LDcgQEAKIAkJaWYgKGZ0MTAwMGRldi0+ZlByb3ZDb21wbGV0ZSA9PSAwKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAKLQkJZnQxMDAwZGV2LT5mQXBwTXNnUGVuZCA9IDE7CisJCWZ0MTAwMGRldi0+ZkFwcE1zZ1BlbmQgPSB0cnVlOwogCiAJCWlmIChpbmZvLT5DYXJkUmVhZHkpIHsKIApAQCAtNTc1LDkgKzU3NCw4IEBACiAJCQl9IGVsc2UgewogCQkJCS8qIENoZWNrIGlmIHRoaXMgbWVzc2FnZSBjYW1lIGZyb20gYSByZWdpc3RlcmVkIGFwcGxpY2F0aW9uICovCiAJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fQVBQOyBpKyspIHsKLQkJCQkJaWYgKGZ0MTAwMGRldi0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgeworCQkJCQlpZiAoZnQxMDAwZGV2LT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZmaWxlLT5mX293bmVyKQogCQkJCQkJYnJlYWs7Ci0JCQkJCX0KIAkJCQl9CiAJCQkJaWYgKGkgPT0gTUFYX05VTV9BUFApIHsKIAkJCQkJcHJfZGVidWcoIk5vIG1hdGNoaW5nIGFwcGxpY2F0aW9uIGZpbGVvYmplY3RcbiIpOwpAQCAtNjI5LDkgKzYyNyw4IEBACiAJCQkJCQlwbXNnID0gKHUxNiAqKSZkcHJhbV9kYXRhLT5wc2V1ZG9oZHI7CiAJCQkJCQlwcHNldWRvX2hkciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKXBtc2c7CiAJCQkJCQl0b3RhbF9sZW4gPSBtc2dzeisyOwotCQkJCQkJaWYgKHRvdGFsX2xlbiAmIDB4MSkgeworCQkJCQkJaWYgKHRvdGFsX2xlbiAmIDB4MSkKIAkJCQkJCQl0b3RhbF9sZW4rKzsKLQkJCQkJCX0KIAogCQkJCQkJLyogSW5zZXJ0IHNsb3cgcXVldWUgc2VxdWVuY2UgbnVtYmVyICovCiAJCQkJCQlwcHNldWRvX2hkci0+c2VxX251bSA9IGluZm8tPnNxdWVzZXFudW0rKzsKQEAgLTY0NSw3ICs2NDIsNyBAQAogCQkJCQkJfQogCQkJCQkJcG1zZysrOwogCQkJCQkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwbXNnOwotCQkJCQkJcmVzdWx0ID0gY2FyZF9zZW5kX2NvbW1hbmQoZnQxMDAwZGV2LCAodW5zaWduZWQgc2hvcnQgKilkcHJhbV9kYXRhLCB0b3RhbF9sZW4rMik7CisJCQkJCQlyZXN1bHQgPSBjYXJkX3NlbmRfY29tbWFuZChmdDEwMDBkZXYsIGRwcmFtX2RhdGEsIHRvdGFsX2xlbisyKTsKIAogCiAJCQkJCQlmdDEwMDBkZXYtPmFwcF9pbmZvW2FwcF9pbmRleF0ublR4TXNnKys7CkBAIC03MjIsNyArNzE5LDcgQEAKIAkJcmVzdWx0ID0gLUVOT1RUWTsKIAkJYnJlYWs7CiAJfQotCWZ0MTAwMGRldi0+ZkFwcE1zZ1BlbmQgPSAwOworCWZ0MTAwMGRldi0+ZkFwcE1zZ1BlbmQgPSBmYWxzZTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC03NDUsNiArNzQyLDcgQEAKIAlzdHJ1Y3QgZnQxMDAwX3VzYiAqZnQxMDAwZGV2OwogCWludCBpOwogCXN0cnVjdCBkcHJhbV9ibGsgKnBkcHJhbV9ibGs7CisJc3RydWN0IGRwcmFtX2JsayAqdG1wOwogCiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNzY2LDkgKzc2NCw4IEBACiAJaWYgKGkgPT0gTUFYX05VTV9BUFApCiAJCXJldHVybiAwOwogCi0Jd2hpbGUgKGxpc3RfZW1wdHkoJmZ0MTAwMGRldi0+YXBwX2luZm9baV0uYXBwX3NxbGlzdCkgPT0gMCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZHByYW1fYmxrLCB0bXAsICZmdDEwMDBkZXYtPmFwcF9pbmZvW2ldLmFwcF9zcWxpc3QsIGxpc3QpIHsKIAkJcHJfZGVidWcoIlJlbW92ZSBhbmQgZnJlZSBtZW1vcnkgcXVldWUgdXAgb24gc2xvdyBxdWV1ZVxuIik7Ci0JCXBkcHJhbV9ibGsgPSBsaXN0X2VudHJ5KGZ0MTAwMGRldi0+YXBwX2luZm9baV0uYXBwX3NxbGlzdC5uZXh0LCBzdHJ1Y3QgZHByYW1fYmxrLCBsaXN0KTsKIAkJbGlzdF9kZWwoJnBkcHJhbV9ibGstPmxpc3QpOwogCQlmdDEwMDBfZnJlZV9idWZmZXIocGRwcmFtX2JsaywgJmZyZWVyY3Zwb29sKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2Rvd25sb2FkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2Rvd25sb2FkLmMKaW5kZXggZTgxMjYzMjUuLjVkZWYzNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZG93bmxvYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2Rvd25sb2FkLmMKQEAgLTIzMCw3ICsyMzAsNyBAQAogCXdoaWxlIChsb29wY250IDwgMTAwKSB7CiAJCWlmIChmdDEwMDBkZXYtPnVzYmJvb3QgPT0gMikgewogCQkJc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIDAsCi0JCQkJCQkgICAgICh1OCAqKSYoZnQxMDAwZGV2LT50ZW1wYnVmWzBdKSwgNjQpOworCQkJCQkJICAgICAodTggKikmZnQxMDAwZGV2LT50ZW1wYnVmWzBdLCA2NCk7CiAJCQlmb3IgKHRlbXAgPSAwOyB0ZW1wIDwgMTY7IHRlbXArKykgewogCQkJCXByX2RlYnVnKCJ0ZW1wYnVmICVkID0gMHgleFxuIiwKIAkJCQkJIHRlbXAsIGZ0MTAwMGRldi0+dGVtcGJ1Zlt0ZW1wXSk7CkBAIC0zNjgsOCArMzY4LDggQEAKIAl1MTYgICBjaGtzdW07CiAKIAotCWNoa3N1bSA9ICgoKCgoKHVzUHRyWzBdIF4gdXNQdHJbMV0pIF4gdXNQdHJbMl0pIF4gdXNQdHJbM10pIF4KLQkJICAgIHVzUHRyWzRdKSBeIHVzUHRyWzVdKSBeIHVzUHRyWzZdKTsKKwljaGtzdW0gPSAoKCgoKHVzUHRyWzBdIF4gdXNQdHJbMV0pIF4gdXNQdHJbMl0pIF4gdXNQdHJbM10pIF4KKwkJICAgIHVzUHRyWzRdKSBeIHVzUHRyWzVdKSBeIHVzUHRyWzZdOwogCiAJcmV0dXJuIGNoa3N1bTsKIH0KQEAgLTUzOCw3ICs1MzgsNyBAQAogCQkJICB1c2Jfc25kYnVsa3BpcGUoZnQxMDAwZGV2LT5kZXYsCiAJCQkJCSAgZnQxMDAwZGV2LT5idWxrX291dF9lbmRwb2ludEFkZHIpLAogCQkJICBmdDEwMDBkZXYtPnR4X2J1ZiwgYnl0ZV9sZW5ndGgsIHVzYl9kbmxkX2NvbXBsZXRlLAotCQkJICAodm9pZCAqKWZ0MTAwMGRldik7CisJCQkgIGZ0MTAwMGRldik7CiAKIAl1c2Jfc3VibWl0X3VyYihmdDEwMDBkZXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7CiAKQEAgLTcwNCw3ICs3MDQsNyBAQAogCQkJCWNhc2UgUkVRVUVTVF9DT0RFX1NFR01FTlQ6CiAJCQkJCXN0YXR1cyA9IHJlcXVlc3RfY29kZV9zZWdtZW50KGZ0MTAwMGRldiwKIAkJCQkJCQkJICAgICAgJnNfZmlsZSwgJmNfZmlsZSwKLQkJCQkJCQkJICAgICAgKGNvbnN0IHU4ICopYm9vdF9lbmQsCisJCQkJCQkJCSAgICAgIGJvb3RfZW5kLAogCQkJCQkJCQkgICAgICB0cnVlKTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKQEAgLTc5OSw3ICs3OTksNyBAQAogCiAJCQkJCXN0YXR1cyA9IHJlcXVlc3RfY29kZV9zZWdtZW50KGZ0MTAwMGRldiwKIAkJCQkJCQkJICAgICAgJnNfZmlsZSwgJmNfZmlsZSwKLQkJCQkJCQkJICAgICAgKGNvbnN0IHU4ICopY29kZV9lbmQsCisJCQkJCQkJCSAgICAgIGNvZGVfZW5kLAogCQkJCQkJCQkgICAgICBmYWxzZSk7CiAKIAkJCQkJYnJlYWs7CkBAIC05NzEsMTEgKzk3MSwxMSBAQAogCiAJCQkJLyogR2V0IGJ1ZmZlciBmb3IgcHJvdmlzaW9uaW5nIGRhdGEgKi8KIAkJCQlwYnVmZmVyID0KLQkJCQkJa21hbGxvYygocHNldWRvX2hlYWRlcl9sZW4gKwotCQkJCQkJIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpLAorCQkJCQlrbWFsbG9jKHBzZXVkb19oZWFkZXJfbGVuICsKKwkJCQkJCSBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpLAogCQkJCQkJR0ZQX0FUT01JQyk7CiAJCQkJaWYgKHBidWZmZXIpIHsKLQkJCQkJbWVtY3B5KHBidWZmZXIsICh2b2lkICopY19maWxlLAorCQkJCQltZW1jcHkocGJ1ZmZlciwgY19maWxlLAogCQkJCQkgICAgICAgKHUzMikgKHBzZXVkb19oZWFkZXJfbGVuICsKIAkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QKIAkJCQkJCQkgICAgIHBzZXVkb19oZHIpKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKaW5kZXggZjBhYzQzOC4uZTZmYjA2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwpAQCAtMzM5LDcgKzMzOSw3IEBACiAJY29tbWFuZGJ1ZiA9IGttYWxsb2Moc2l6ZSArIDIsIEdGUF9LRVJORUwpOwogCWlmICghY29tbWFuZGJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KCh2b2lkICopY29tbWFuZGJ1ZiArIDIsICh2b2lkICopcHRlbXBidWZmZXIsIHNpemUpOworCW1lbWNweSgodm9pZCAqKWNvbW1hbmRidWYgKyAyLCBwdGVtcGJ1ZmZlciwgc2l6ZSk7CiAKIAlpZiAodGVtcCAmIDB4MDEwMCkKIAkJdXNsZWVwX3JhbmdlKDkwMCwgMTEwMCk7CkBAIC00MjksNyArNDI5LDcgQEAKIAkvKiBMZXQncyB1c2UgdGhlIHJlZ2lzdGVyIHByb3ZpZGVkIGJ5IHRoZSBNYWduZW1pdGUgQVNJQyB0byByZXNldCB0aGUKIAkgKiBBU0lDIGFuZCBEU1AuCiAJICovCi0JZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKGZ0MTAwMGRldiwgKERTUF9SRVNFVF9CSVQgfCBBU0lDX1JFU0VUX0JJVCksCisJZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKGZ0MTAwMGRldiwgRFNQX1JFU0VUX0JJVCB8IEFTSUNfUkVTRVRfQklULAogCQkJICAgICAgRlQxMDAwX1JFR19SRVNFVCk7CiAKIAltZGVsYXkoMSk7CkBAIC00NTEsMTYgKzQ1MSwxNSBAQAogCXN0cnVjdCBmdDEwMDBfdXNiICpmdDEwMDBkZXYgPSBpbmZvLT5wcml2OwogCXUxNiB0ZW1wd29yZDsKIAlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnB0cjsKKwlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnRtcDsKIAogCWZ0MTAwMGRldi0+ZkNvbmRSZXNldFBlbmQgPSB0cnVlOwogCWluZm8tPkNhcmRSZWFkeSA9IDA7CiAJZnQxMDAwZGV2LT5mUHJvdkNvbXBsZXRlID0gZmFsc2U7CiAKIAkvKiBNYWtlIHN1cmUgd2UgZnJlZSBhbnkgbWVtb3J5IHJlc2VydmUgZm9yIHByb3Zpc2lvbmluZyAqLwotCXdoaWxlIChsaXN0X2VtcHR5KCZpbmZvLT5wcm92X2xpc3QpID09IDApIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHRyLCB0bXAsICZpbmZvLT5wcm92X2xpc3QsIGxpc3QpIHsKIAkJcHJfZGVidWcoImRlbGV0aW5nIHByb3Zpc2lvbmluZyByZWNvcmRcbiIpOwotCQlwdHIgPQotCQkJbGlzdF9lbnRyeShpbmZvLT5wcm92X2xpc3QubmV4dCwgc3RydWN0IHByb3ZfcmVjb3JkLCBsaXN0KTsKIAkJbGlzdF9kZWwoJnB0ci0+bGlzdCk7CiAJCWtmcmVlKHB0ci0+cHByb3ZfZGF0YSk7CiAJCWtmcmVlKHB0cik7CkBAIC01NDIsNyArNTQxLDcgQEAKIAkJaGRyLnBvcnRkZXN0IF4gaGRyLnBvcnRzcmMgXiBoZHIuc2hfc3RyX2lkIF4gaGRyLmNvbnRyb2w7CiAKIAltZW1jcHkoJnBGdDEwMDBEZXYtPnR4X2J1ZlswXSwgJmhkciwgc2l6ZW9mKGhkcikpOwotCW1lbWNweSgmKHBGdDEwMDBEZXYtPnR4X2J1ZltzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpXSksIHBhY2tldCwgbGVuKTsKKwltZW1jcHkoJnBGdDEwMDBEZXYtPnR4X2J1ZltzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpXSwgcGFja2V0LCBsZW4pOwogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCkBAIC01NTEsNyArNTUwLDcgQEAKIAkJCSAgdXNiX3NuZGJ1bGtwaXBlKHBGdDEwMDBEZXYtPmRldiwKIAkJCQkJICBwRnQxMDAwRGV2LT5idWxrX291dF9lbmRwb2ludEFkZHIpLAogCQkJICBwRnQxMDAwRGV2LT50eF9idWYsIGNvdW50LAotCQkJICBmdDEwMDBfdXNiX3RyYW5zbWl0X2NvbXBsZXRlLCAodm9pZCAqKXBGdDEwMDBEZXYpOworCQkJICBmdDEwMDBfdXNiX3RyYW5zbWl0X2NvbXBsZXRlLCBwRnQxMDAwRGV2KTsKIAogCXQgPSAodTggKilwRnQxMDAwRGV2LT50eF91cmItPnRyYW5zZmVyX2J1ZmZlcjsKIApAQCAtNjA2LDcgKzYwNSw3IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWZ0MTAwMF9jb3B5X2Rvd25fcGt0KGRldiwgKHBkYXRhICsgRU5FVF9IRUFERVJfU0laRSAtIDIpLAorCWZ0MTAwMF9jb3B5X2Rvd25fcGt0KGRldiwgcGRhdGEgKyBFTkVUX0hFQURFUl9TSVpFIC0gMiwKIAkJCSAgICAgc2tiLT5sZW4gLSBFTkVUX0hFQURFUl9TSVpFICsgMik7CiAKIGVycjoKQEAgLTE1NTgsMTkgKzE1NTcsMTkgQEAKIAkJCQkvKiBSZXNldCBBU0lDIGFuZCBEU1AgKi8KIAkJCQlzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwKIAkJCQkJCQkgICAgIEZUMTAwMF9NQUdfRFNQX1RJTUVSMCwKLQkJCQkJCQkgICAgICh1OCAqKSYoaW5mby0+RFNQX1RJTUVbMF0pLAorCQkJCQkJCSAgICAgKHU4ICopJmluZm8tPkRTUF9USU1FWzBdLAogCQkJCQkJCSAgICAgRlQxMDAwX01BR19EU1BfVElNRVIwX0lORFgpOwogCQkJCXN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LAogCQkJCQkJCSAgICAgRlQxMDAwX01BR19EU1BfVElNRVIxLAotCQkJCQkJCSAgICAgKHU4ICopJihpbmZvLT5EU1BfVElNRVsxXSksCisJCQkJCQkJICAgICAodTggKikmaW5mby0+RFNQX1RJTUVbMV0sCiAJCQkJCQkJICAgICBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7CiAJCQkJc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsCiAJCQkJCQkJICAgICBGVDEwMDBfTUFHX0RTUF9USU1FUjIsCi0JCQkJCQkJICAgICAodTggKikmKGluZm8tPkRTUF9USU1FWzJdKSwKKwkJCQkJCQkgICAgICh1OCAqKSZpbmZvLT5EU1BfVElNRVsyXSwKIAkJCQkJCQkgICAgIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKIAkJCQlzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwKIAkJCQkJCQkgICAgIEZUMTAwMF9NQUdfRFNQX1RJTUVSMywKLQkJCQkJCQkgICAgICh1OCAqKSYoaW5mby0+RFNQX1RJTUVbM10pLAorCQkJCQkJCSAgICAgKHU4ICopJmluZm8tPkRTUF9USU1FWzNdLAogCQkJCQkJCSAgICAgRlQxMDAwX01BR19EU1BfVElNRVIzX0lORFgpOwogCQkJCWluZm8tPkNhcmRSZWFkeSA9IDA7CiAJCQkJaW5mby0+RHJ2RXJyTnVtID0gRFNQX0NPTkRSRVNFVF9JTkZPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmMKaW5kZXggYTZiNTVmNC4uM2IzMDNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAogCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmRzcF9mdywgImZ0MzAwMC5pbWciLCAmZGV2LT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRXJyb3IgcmVxdWVzdF9maXJtd2FyZSgpXG4iKTsKKwkJZGV2X2VycihpbnRlcmZhY2UtPnVzYl9kZXYsICJFcnJvciByZXF1ZXN0X2Zpcm13YXJlKClcbiIpOwogCQlnb3RvIGVycl9mdzsKIAl9CiAKQEAgLTE2NCw3ICsxNjQsOCBAQAogCXByX2RlYnVnKCJwZnQxMDAwaW5mbz0lcFxuIiwgcGZ0MTAwMGluZm8pOwogCXJldCA9IGRzcF9yZWxvYWQoZnQxMDAwZGV2KTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiUHJvYmxlbSB3aXRoIERTUCBpbWFnZSBsb2FkaW5nXG4iKTsKKwkJZGV2X2VycihpbnRlcmZhY2UtPnVzYl9kZXYsCisJCQkiUHJvYmxlbSB3aXRoIERTUCBpbWFnZSBsb2FkaW5nXG4iKTsKIAkJZ290byBlcnJfbG9hZDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9md3NlcmlhbC9md3NlcmlhbC5jIGIvZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL2Z3c2VyaWFsLmMKaW5kZXggNzNkZWFlMy4uZmRiMjQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL2Z3c2VyaWFsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL2Z3c2VyaWFsLmMKQEAgLTExODYsNyArMTE4Niw3IEBACiB7CiAJc3RydWN0IGZ3dHR5X3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCi0JZnd0dHlfZGJnKHBvcnQsICJDUlRTQ1RTOiAlZFxuIiwgKENfQ1JUU0NUUyh0dHkpICE9IDApKTsKKwlmd3R0eV9kYmcocG9ydCwgIkNSVFNDVFM6ICVkXG4iLCBDX0NSVFNDVFModHR5KSAhPSAwKTsKIAogCWZ3dHR5X3Byb2ZpbGVfZmlmbyhwb3J0LCBwb3J0LT5zdGF0cy51bnRocm90dGxlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jCmluZGV4IDdjNGE3N2IuLmE4ZDJjZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMKQEAgLTg4OSw3ICs4ODksNyBAQAogCQkvKiBBbGxvY2F0ZSBuZXRkZXYgKi8KIAkJbmV0ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmljKSwgcGRuX2Rldl9uYW1lLAogCQkJCSAgIE5FVF9OQU1FX1VOS05PV04sIGV0aGVyX3NldHVwKTsKLQkJaWYgKG5ldCA9PSBOVUxMKSB7CisJCWlmICghbmV0KSB7CiAJCQlwcl9lcnIoImFsbG9jX25ldGRldiBmYWlsZWRcbiIpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5jCmluZGV4IGQxYWI5OTYuLjgxOTliMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCiAJaWYgKHVyYi0+c3RhdHVzKSB7CiAJCWlmIChtdXhfZGV2LT51c2Jfc3RhdGUgPT0gUE1fTk9STUFMKQotCQkJcHJfZXJyKCIlczogdXJiIHN0YXR1cyBlcnJvciAlZFxuIiwKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlczogdXJiIHN0YXR1cyBlcnJvciAlZFxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQlwdXRfcnhfc3RydWN0KHJ4LCByKTsKIAl9IGVsc2UgewpAQCAtMzQyLDcgKzM0Miw3IEBACiAJc3RydWN0IG11eF90eCAqdCA9IHVyYi0+Y29udGV4dDsKIAogCWlmICh1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgewotCQlwcl9pbmZvKCJDT05OUkVTRVRcbiIpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgIkNPTk5SRVNFVFxuIik7CiAJCWZyZWVfbXV4X3R4KHQpOwogCQlyZXR1cm47CiAJfQpAQCAtNjA4LDcgKzYwOCw3IEBACiAJcnggPSAmbXV4X2Rldi0+cng7CiAKIAlpZiAobXV4X2Rldi0+dXNiX3N0YXRlICE9IFBNX05PUk1BTCkgewotCQlwcl9lcnIoInVzYiBzdXNwZW5kIC0gaW52YWxpZCBzdGF0ZVxuIik7CisJCWRldl9lcnIoaW50Zi0+dXNiX2RldiwgInVzYiBzdXNwZW5kIC0gaW52YWxpZCBzdGF0ZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTYzNyw3ICs2MzcsNyBAQAogCW11eF9kZXYgPSB0dHlfZGV2LT5wcml2X2RldjsKIAogCWlmIChtdXhfZGV2LT51c2Jfc3RhdGUgIT0gUE1fU1VTUEVORCkgewotCQlwcl9lcnIoInVzYiByZXN1bWUgLSBpbnZhbGlkIHN0YXRlXG4iKTsKKwkJZGV2X2VycihpbnRmLT51c2JfZGV2LCAidXNiIHJlc3VtZSAtIGludmFsaWQgc3RhdGVcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMKaW5kZXggZDJhM2IzNS4uZWQxYTEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYwpAQCAtNDgwLDcgKzQ4MCw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4LT50b19ob3N0X2xvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewogCQlpZiAodXJiLT5zdGF0dXMgJiYgdWRldi0+dXNiX3N0YXRlID09IFBNX05PUk1BTCkKLQkJCXByX2VycigiJXM6IHVyYiBzdGF0dXMgZXJyb3IgJWRcbiIsCisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXM6IHVyYiBzdGF0dXMgZXJyb3IgJWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKIAogCQlwdXRfcnhfc3RydWN0KHJ4LCByKTsKQEAgLTU1Nyw3ICs1NTcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAodXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHsKLQkJcHJfaW5mbygiQ09OTlJFU0VUXG4iKTsKKwkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJDT05OUkVTRVRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC01OTAsNyArNTkwLDggQEAKIAlyZXQgPSB1c2Jfc3VibWl0X3VyYih0LT51cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJldCkKLQkJcHJfZXJyKCJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsCisJCQlyZXQpOwogCiAJdXNiX21hcmtfbGFzdF9idXN5KHVzYmRldik7CiAKQEAgLTg0OCw3ICs4NDksNyBAQAogCXVkZXYtPnVzYmRldiA9IHVzYmRldjsKIAlyZXQgPSBpbml0X3VzYih1ZGV2KTsKIAlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoImluaXRfdXNiIGZ1bmMgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihpbnRmLT51c2JfZGV2LCAiaW5pdF91c2IgZnVuYyBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9pbml0X3VzYjsKIAl9CiAJdWRldi0+aW50ZiA9IGludGY7CkBAIC04NjcsNyArODY4LDcgQEAKIAogCXJldCA9IHJlcXVlc3RfbWFjX2FkZHJlc3ModWRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJyZXF1ZXN0IE1hYyBhZGRyZXNzIGZhaWxlZFxuIik7CisJCWRldl9lcnIoaW50Zi0+dXNiX2RldiwgInJlcXVlc3QgTWFjIGFkZHJlc3MgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfbWFjX2FkZHJlc3M7CiAJfQogCkBAIC05MjgsNyArOTI5LDcgQEAKIAl1ZGV2ID0gcGh5X2Rldi0+cHJpdl9kZXY7CiAJcnggPSAmdWRldi0+cng7CiAJaWYgKHVkZXYtPnVzYl9zdGF0ZSAhPSBQTV9OT1JNQUwpIHsKLQkJcHJfZXJyKCJ1c2Igc3VzcGVuZCAtIGludmFsaWQgc3RhdGVcbiIpOworCQlkZXZfZXJyKGludGYtPnVzYl9kZXYsICJ1c2Igc3VzcGVuZCAtIGludmFsaWQgc3RhdGVcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05NjEsNyArOTYyLDcgQEAKIAlyeCA9ICZ1ZGV2LT5yeDsKIAogCWlmICh1ZGV2LT51c2Jfc3RhdGUgIT0gUE1fU1VTUEVORCkgewotCQlwcl9lcnIoInVzYiByZXN1bWUgLSBpbnZhbGlkIHN0YXRlXG4iKTsKKwkJZGV2X2VycihpbnRmLT51c2JfZGV2LCAidXNiIHJlc3VtZSAtIGludmFsaWQgc3RhdGVcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXVkZXYtPnVzYl9zdGF0ZSA9IFBNX05PUk1BTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9xb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9xb3MuYwppbmRleCBhZjI0YzU3Li45NmJmMmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fcW9zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3Fvcy5jCkBAIC01NCw4ICs1NCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFvc19mcmVlX2xpc3QubG9jaywgZmxhZ3MpOwogCi0JZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKLQlyZXR1cm4gZW50cnk7CisJcmV0dXJuIGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX3Fvc19lbnRyeSh2b2lkICplbnRyeSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9zZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fc2Rpby5jCmluZGV4IDdhMGEwZjIuLmE1ZmQwNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9zZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYwpAQCAtMjIzLDggKzIyMyw3IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAocmV0ICE9IC1FTk9NRURJVU0pCiAJCQkJZGV2X2VycigmZnVuYy0+ZGV2LAotCQkJCQkiZ2Rtd21zOiAlcyBlcnJvcjogcmV0ID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOworCQkJCQkiZ2Rtd21zOiAgZXJyb3I6IHJldCA9ICVkXG4iLCByZXQpOwogCQkJZ290byBlbmRfaW87CiAJCX0KIAl9CkBAIC0yMzcsOCArMjM2LDcgQEAKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVOT01FRElVTSkKIAkJCQlkZXZfZXJyKCZmdW5jLT5kZXYsCi0JCQkJCSJnZG13bXM6ICVzIGVycm9yOiByZXQgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJCSJnZG13bXM6ICBlcnJvcjogcmV0ID0gJWRcbiIsIHJldCk7CiAJCQlnb3RvIGVuZF9pbzsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV93aW1heC5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKaW5kZXggOWNhYjU0Yi4uNjFkMTY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMKQEAgLTEyOSwxMSArMTI5LDExIEBACiAJaW50IGlkeDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBldnRfZW50cnkgKmU7CisJc3RydWN0IGV2dF9lbnRyeSAqdG1wOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndtX2V2ZW50LmV2dF9sb2NrLCBmbGFncyk7CiAKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJndtX2V2ZW50LmV2dHEpKSB7Ci0JCWUgPSBsaXN0X2VudHJ5KHdtX2V2ZW50LmV2dHEubmV4dCwgc3RydWN0IGV2dF9lbnRyeSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIHRtcCwgJndtX2V2ZW50LmV2dHEsIGxpc3QpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd21fZXZlbnQuZXZ0X2xvY2ssIGZsYWdzKTsKIAogCQlpZiAoc3NjYW5mKGUtPmRldi0+bmFtZSwgIndtJWQiLCAmaWR4KSA9PSAxKQpAQCAtNzQ5LDcgKzc0OSw3IEBACiAJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqbmljKSwgIndtJWQiLCBORVRfTkFNRV9VTktOT1dOLAogCQkJICAgZXRoZXJfc2V0dXApOwogCi0JaWYgKGRldiA9PSBOVUxMKSB7CisJaWYgKCFkZXYpIHsKIAkJcHJfZXJyKCJhbGxvY19ldGhlcmRldiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ29sZGZpc2gvZ29sZGZpc2hfYXVkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9nb2xkZmlzaC9nb2xkZmlzaF9hdWRpby5jCmluZGV4IGYyMDAzNTkuLjcwMmFlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nb2xkZmlzaC9nb2xkZmlzaF9hdWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nb2xkZmlzaC9nb2xkZmlzaF9hdWRpby5jCkBAIC00MCwxMiArNDAsMTIgQEAKIAlzcGlubG9ja190IGxvY2s7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIAotCWNoYXIgX19pb21lbSAqYnVmZmVyX3ZpcnQ7ICAgICAgLyogY29tYmluZWQgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCWNoYXIgKmJ1ZmZlcl92aXJ0OwkJLyogY29tYmluZWQgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGxvbmcgYnVmZmVyX3BoeXM7ICAgICAgLyogY29tYmluZWQgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCWNoYXIgX19pb21lbSAqd3JpdGVfYnVmZmVyMTsgICAgLyogd3JpdGUgYnVmZmVyIDEgdmlydHVhbCBhZGRyZXNzICovCi0JY2hhciBfX2lvbWVtICp3cml0ZV9idWZmZXIyOyAgICAvKiB3cml0ZSBidWZmZXIgMiB2aXJ0dWFsIGFkZHJlc3MgKi8KLQljaGFyIF9faW9tZW0gKnJlYWRfYnVmZmVyOyAgICAgIC8qIHJlYWQgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCWNoYXIgKndyaXRlX2J1ZmZlcjE7CQkvKiB3cml0ZSBidWZmZXIgMSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwljaGFyICp3cml0ZV9idWZmZXIyOwkJLyogd3JpdGUgYnVmZmVyIDIgdmlydHVhbCBhZGRyZXNzICovCisJY2hhciAqcmVhZF9idWZmZXI7CQkvKiByZWFkIGJ1ZmZlciB2aXJ0dWFsIGFkZHJlc3MgKi8KIAlpbnQgYnVmZmVyX3N0YXR1czsKIAlpbnQgcmVhZF9zdXBwb3J0ZWQ7ICAgICAgICAgLyogdHJ1ZSBpZiB3ZSBoYXZlIGF1ZGlvIGlucHV0IHN1cHBvcnQgKi8KIH07CkBAIC0xMjUsOCArMTI1LDggQEAKIAkJbGVuZ3RoID0gKGNvdW50ID4gUkVBRF9CVUZGRVJfU0laRSA/IFJFQURfQlVGRkVSX1NJWkUgOiBjb3VudCk7CiAJCUFVRElPX1dSSVRFKGRhdGEsIEFVRElPX1NUQVJUX1JFQUQsIGxlbmd0aCk7CiAKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRhdGEtPndhaXQsIChkYXRhLT5idWZmZXJfc3RhdHVzICYKLQkJCQkJIEFVRElPX0lOVF9SRUFEX0JVRkZFUl9GVUxMKSk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkYXRhLT53YWl0LCBkYXRhLT5idWZmZXJfc3RhdHVzICYKKwkJCQkJIEFVRElPX0lOVF9SRUFEX0JVRkZFUl9GVUxMKTsKIAogCQlsZW5ndGggPSBBVURJT19SRUFEKGRhdGEsIEFVRElPX1JFQURfQlVGRkVSX0FWQUlMQUJMRSk7CiAKQEAgLTE0NywxNiArMTQ3LDE2IEBACiAJc3RydWN0IGdvbGRmaXNoX2F1ZGlvICpkYXRhID0gZnAtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKIAlzc2l6ZV90IHJlc3VsdCA9IDA7Ci0JY2hhciBfX2lvbWVtICprYnVmOworCWNoYXIgKmtidWY7CiAKIAl3aGlsZSAoY291bnQgPiAwKSB7CiAJCXNzaXplX3QgY29weSA9IGNvdW50OwogCiAJCWlmIChjb3B5ID4gV1JJVEVfQlVGRkVSX1NJWkUpCiAJCQljb3B5ID0gV1JJVEVfQlVGRkVSX1NJWkU7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkYXRhLT53YWl0LCAoZGF0YS0+YnVmZmVyX3N0YXR1cyAmCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkYXRhLT53YWl0LCBkYXRhLT5idWZmZXJfc3RhdHVzICYKIAkJCQkJKEFVRElPX0lOVF9XUklURV9CVUZGRVJfMV9FTVBUWSB8Ci0JCQkJCUFVRElPX0lOVF9XUklURV9CVUZGRVJfMl9FTVBUWSkpKTsKKwkJCQkJQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8yX0VNUFRZKSk7CiAKIAkJaWYgKChkYXRhLT5idWZmZXJfc3RhdHVzICYgQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8xX0VNUFRZKSAhPSAwKQogCQkJa2J1ZiA9IGRhdGEtPndyaXRlX2J1ZmZlcjE7CkBAIC0yNzMsNyArMjczLDcgQEAKIAlkbWFfYWRkcl90IGJ1Zl9hZGRyOwogCiAJZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQorCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc3Bpbl9sb2NrX2luaXQoJmRhdGEtPmxvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRhdGEtPndhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL2dvbGRmaXNoX25hbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nb2xkZmlzaC9nb2xkZmlzaF9uYW5kLmMKaW5kZXggZDY4ZjIxNi4uMjEzODc3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL2dvbGRmaXNoX25hbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ29sZGZpc2gvZ29sZGZpc2hfbmFuZC5jCkBAIC0zMzAsNyArMzMwLDcgQEAKIAltdGQtPnByaXYgPSBuYW5kOwogCiAJbmFtZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBuYW1lX2xlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmIChuYW1lID09IE5VTEwpCisJaWYgKCFuYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKIAltdGQtPm5hbWUgPSBuYW1lOwogCkBAIC0zODMsNyArMzgzLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAliYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHItPnN0YXJ0LCBQQUdFX1NJWkUpOwotCWlmIChiYXNlID09IE5VTEwpCisJaWYgKCFiYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXZlcnNpb24gPSByZWFkbChiYXNlICsgTkFORF9WRVJTSU9OKTsKQEAgLTM5OSw3ICszOTksNyBAQAogCiAJbmFuZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm5hbmQpICsKIAkJCQlzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSAqIG51bV9kZXYsIEdGUF9LRVJORUwpOwotCWlmIChuYW5kID09IE5VTEwpCisJaWYgKCFuYW5kKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCW11dGV4X2luaXQoJm5hbmQtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYwppbmRleCA2ZGE3Mjg1Li5hM2ExMGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2J1cy1vc20uYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vYnVzLW9zbS5jCmluZGV4IDdhYTAzMzkuLjQzZTM1N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vYnVzLW9zbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vYnVzLW9zbS5jCkBAIC02OSw3ICs2OSw4IEBACiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGQpOwogCWludCByYzsKIAotCWlmICgocmMgPSBpMm9fYnVzX3NjYW4oaTJvX2RldikpKQorCXJjID0gaTJvX2J1c19zY2FuKGkyb19kZXYpOworCWlmIChyYykKIAkJb3NtX3dhcm4oImJ1cyBzY2FuIGZhaWxlZCAlZFxuIiwgcmMpOwogCiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2kyby9jb25maWctb3NtLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2NvbmZpZy1vc20uYwppbmRleCA1MTlmNTJmLi40NTA5MWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2NvbmZpZy1vc20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2NvbmZpZy1vc20uYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjZGVmaW5lIE9TTV9OQU1FCSJjb25maWctb3NtIgogI2RlZmluZSBPU01fVkVSU0lPTgkiMS4zMjMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2RlYnVnLmMKaW5kZXggN2ExNjExNC4uMTJiNzgzYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2RlYnVnLmMKQEAgLTUsNyArNSw3IEBACiAKIHN0YXRpYyB2b2lkIGkyb19yZXBvcnRfdXRpbF9jbWQodTggY21kKTsKIHN0YXRpYyB2b2lkIGkyb19yZXBvcnRfZXhlY19jbWQodTggY21kKTsKLXN0YXRpYyB2b2lkIGkyb19yZXBvcnRfZmFpbF9zdGF0dXModTggcmVxX3N0YXR1cywgdTMyICogbXNnKTsKK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfZmFpbF9zdGF0dXModTggcmVxX3N0YXR1cywgdTMyICptc2cpOwogc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9jb21tb25fc3RhdHVzKHU4IHJlcV9zdGF0dXMpOwogc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9jb21tb25fZHNjKHUxNiBkZXRhaWxlZF9zdGF0dXMpOwogCkBAIC0yMiw3ICsyMiw3IEBACiAJdTE2IGRldGFpbGVkX3N0YXR1cyA9IG1zZ1s0XSAmIDB4RkZGRjsKIAogCWlmIChjbWQgPT0gSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUikKLQkJcmV0dXJuOwkJLy8gTm8gc3RhdHVzIGluIHRoaXMgcmVwbHkKKwkJcmV0dXJuOwkJLyogTm8gc3RhdHVzIGluIHRoaXMgcmVwbHkgKi8KIAogCXByaW50aygiJXMlczogIiwgc2V2ZXJpdHksIHN0cik7CiAKQEAgLTU0LDYgKzU0LDcgQEAKICNpZmRlZiBERUJVRwogCXUzMiAqbXNnID0gKHUzMiAqKSBtOwogCWludCBpOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiRHVtcGluZyBJMk8gbWVzc2FnZSBzaXplICVkIEAgJXBcbiIsCiAJICAgICAgIG1zZ1swXSA+PiAxNiAmIDB4ZmZmZiwgbXNnKTsKIAlmb3IgKGkgPSAwOyBpIDwgKChtc2dbMF0gPj4gMTYpICYgMHhmZmZmKTsgaSsrKQpAQCAtNjYsNyArNjcsNyBAQAogICogRm9sbG93aW5nIGZhaWwgc3RhdHVzIGFyZSBjb21tb24gdG8gYWxsIGNsYXNzZXMuCiAgKiBUaGUgcHJlc2VydmVkIG1lc3NhZ2UgbXVzdCBiZSBoYW5kbGVkIGluIHRoZSByZXBseSBoYW5kbGVyLgogICovCi1zdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2ZhaWxfc3RhdHVzKHU4IHJlcV9zdGF0dXMsIHUzMiAqIG1zZykKK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfZmFpbF9zdGF0dXModTggcmVxX3N0YXR1cywgdTMyICptc2cpCiB7CiAJc3RhdGljIGNoYXIgKkZBSUxfU1RBVFVTW10gPSB7CiAJCSIweDgwIiwJCS8qIG5vdCB1c2VkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9kZXZpY2UuYwppbmRleCAyYWYyMjU1Li5lNDc0OTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vZGV2aWNlLmMKQEAgLTU2NSwxMCArNTY1LDggQEAKIAkJc2l6ZSArPSA0IC0gc2l6ZSAlIDQ7CiAKIAlvcGJsayA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG9wYmxrID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpMm86IG5vIG1lbW9yeSBmb3IgcXVlcnkgYnVmZmVyLlxuIik7CisJaWYgKG9wYmxrID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCW9wYmxrWzBdID0gMTsJCS8qIG9wZXJhdGlvbiBjb3VudCAqLwogCW9wYmxrWzFdID0gMDsJCS8qIHBhZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2kyby9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vZHJpdmVyLmMKaW5kZXggMTExYzNlZC4uMDYxMTliYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2RyaXZlci5jCkBAIC0xMDIsOCArMTAyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkyb19kcml2ZXJzW2ldOyBpKyspCiAJCWlmIChpID49IGkyb19tYXhfZHJpdmVycykgewotCQkJb3NtX2VycigidG9vIG1hbnkgZHJpdmVycyByZWdpc3RlcmVkLCBpbmNyZWFzZSAiCi0JCQkJIm1heF9kcml2ZXJzXG4iKTsKKwkJCW9zbV9lcnIoInRvbyBtYW55IGRyaXZlcnMgcmVnaXN0ZXJlZCwgaW5jcmVhc2UgbWF4X2RyaXZlcnNcbiIpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJvX2RyaXZlcnNfbG9jaywgZmxhZ3MpOwogCQkJcmMgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CkBAIC0yNDQsOCArMjQzLDggQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoIWRydi0+cmVwbHkpKSB7Ci0JCW9zbV9kZWJ1ZygiJXM6IFJlcGx5IHRvIGRyaXZlciAlcywgYnV0IG5vIHJlcGx5IGZ1bmN0aW9uIgotCQkJICAiIGRlZmluZWQhXG4iLCBjLT5uYW1lLCBkcnYtPm5hbWUpOworCQlvc21fZGVidWcoIiVzOiBSZXBseSB0byBkcml2ZXIgJXMsIGJ1dCBubyByZXBseSBmdW5jdGlvbiBkZWZpbmVkIVxuIiwKKwkJCWMtPm5hbWUsIGRydi0+bmFtZSk7CiAJCXJldHVybiAtRUlPOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2kyby9leGVjLW9zbS5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9leGVjLW9zbS5jCmluZGV4IDE2ZDg1N2QuLmRjZTE2ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vZXhlYy1vc20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2V4ZWMtb3NtLmMKQEAgLTUwNyw4ICs1MDcsOCBAQAogCSAqIHRvIGFpZCBpbiBkZWJ1Z2dpbmcuCiAJICoKIAkgKi8KLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5zb2xpY2l0ZWQgbWVzc2FnZSByZXBseSBzZW50IHRvIGNvcmUhIgotCSAgICAgICAiTWVzc2FnZSBkdW1wZWQgdG8gc3lzbG9nXG4iLCBjLT5uYW1lKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5zb2xpY2l0ZWQgbWVzc2FnZSByZXBseSBzZW50IHRvIGNvcmUhIE1lc3NhZ2UgZHVtcGVkIHRvIHN5c2xvZ1xuIiwKKwkJCWMtPm5hbWUpOwogCWkyb19kdW1wX21lc3NhZ2UobXNnKTsKIAogCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fYmxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX2Jsb2NrLmMKaW5kZXggMGExM2M2NC4uNDA2NzU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fYmxvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2kyb19ibG9jay5jCkBAIC04NzEsMTMgKzg3MSwxMyBAQAogCiAJcmV0dXJuIDA7CiAKLSAgICAgIGNvbnRleHRfcmVtb3ZlOgorY29udGV4dF9yZW1vdmU6CiAJaTJvX2NudHh0X2xpc3RfcmVtb3ZlKGMsIHJlcSk7CiAKLSAgICAgIG5vcF9tc2c6Citub3BfbXNnOgogCWkyb19tc2dfbm9wKGMsIG1zZyk7CiAKLSAgICAgIGV4aXQ6CitleGl0OgogCXJldHVybiByYzsKIH07CiAKQEAgLTEwMDIsMTMgKzEwMDIsMTMgQEAKIAogCXJldHVybiBkZXY7CiAKLSAgICAgIGNsZWFudXBfcXVldWU6CitjbGVhbnVwX3F1ZXVlOgogCXB1dF9kaXNrKGdkKTsKIAotICAgICAgY2xlYW51cF9kZXY6CitjbGVhbnVwX2RldjoKIAlrZnJlZShkZXYpOwogCi0gICAgICBleGl0OgorZXhpdDoKIAlyZXR1cm4gRVJSX1BUUihyYyk7CiB9OwogCkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICppMm9fYmxrX2RldjsKIAlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOwotCXN0YXRpYyBpbnQgdW5pdCA9IDA7CisJc3RhdGljIGludCB1bml0OwogCWludCByYzsKIAl1NjQgc2l6ZTsKIAl1MzIgYmxvY2tzaXplOwpAQCAtMTExNSwxMCArMTExNSwxMCBAQAogCiAJcmV0dXJuIDA7CiAKLSAgICAgIGNsYWltX3JlbGVhc2U6CitjbGFpbV9yZWxlYXNlOgogCWkyb19kZXZpY2VfY2xhaW1fcmVsZWFzZShpMm9fZGV2KTsKIAotICAgICAgZXhpdDoKK2V4aXQ6CiAJcmV0dXJuIHJjOwogfTsKIApAQCAtMTE4NywxNiArMTE4NywxNiBAQAogCiAJcmV0dXJuIDA7CiAKLSAgICAgIHVucmVnaXN0ZXJfYmxrZGV2OgordW5yZWdpc3Rlcl9ibGtkZXY6CiAJdW5yZWdpc3Rlcl9ibGtkZXYoSTJPX01BSk9SLCAiaTJvX2Jsb2NrIik7CiAKLSAgICAgIGZyZWVfbWVtcG9vbDoKK2ZyZWVfbWVtcG9vbDoKIAltZW1wb29sX2Rlc3Ryb3koaTJvX2Jsa19yZXFfcG9vbC5wb29sKTsKIAotICAgICAgZnJlZV9zbGFiOgorZnJlZV9zbGFiOgogCWttZW1fY2FjaGVfZGVzdHJveShpMm9fYmxrX3JlcV9wb29sLnNsYWIpOwogCi0gICAgICBleGl0OgorZXhpdDoKIAlyZXR1cm4gcmM7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2kyb19jb25maWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX2NvbmZpZy5jCmluZGV4IDA0YmQzYjYuLmNkN2NhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX2NvbmZpZy5jCkBAIC0zNCw4ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgImNvcmUuaCIKIApAQCAtNjUsNyArNjQsNyBAQAogCXN0cnVjdCBpMm9fY2ZnX2luZm8gKm5leHQ7CiB9Owogc3RhdGljIHN0cnVjdCBpMm9fY2ZnX2luZm8gKm9wZW5fZmlsZXMgPSBOVUxMOwotc3RhdGljIHVsb25nIGkyb19jZmdfaW5mb19pZCA9IDA7CitzdGF0aWMgdWxvbmcgaTJvX2NmZ19pbmZvX2lkOwogCiBzdGF0aWMgaW50IGkyb19jZmdfZ2V0aW9wcyh1bnNpZ25lZCBsb25nIGFyZykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX3Byb2MuYwppbmRleCBhZDg0ZjMzLi43ODBmZWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2kyb19wcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fcHJvYy5jCkBAIC00OCw5ICs0OCw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiAvKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgL3Byb2MgZW50cmllcyAqLwpAQCAtODUsOSArODUsOCBAQAogCXN3aXRjaCAoc2VyaWFsbm9bMF0pIHsKIAljYXNlIEkyT19TTkZPUk1BVF9CSU5BUlk6CS8qIEJpbmFyeSAqLwogCQlzZXFfcHJpbnRmKHNlcSwgIjB4Iik7Ci0JCWZvciAoaSA9IDA7IGkgPCBzZXJpYWxub1sxXTsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzZXJpYWxub1sxXTsgaSsrKQogCQkJc2VxX3ByaW50ZihzZXEsICIlMDJYIiwgc2VyaWFsbm9bMiArIGldKTsKLQkJfQogCQlicmVhazsKIAogCWNhc2UgSTJPX1NORk9STUFUX0FTQ0lJOgkvKiBBU0NJSSAqLwpAQCAtMTAxLDkgKzEwMCw4IEBACiAJCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgJnNlcmlhbG5vWzJdKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHByaW50IGNoYXJzIGZvciBzcGVjaWZpZWQgbGVuZ3RoICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsbm9bMV07IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IHNlcmlhbG5vWzFdOyBpKyspCiAJCQkJc2VxX3ByaW50ZihzZXEsICIlYyIsIHNlcmlhbG5vWzIgKyBpXSk7Ci0JCQl9CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTI2NiwxNiArMjY0LDIyIEBACiB7CiAJc3dpdGNoIChibG9ja19zdGF0dXMpIHsKIAljYXNlIC1FVElNRURPVVQ6Ci0JCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIlRpbWVvdXQgcmVhZGluZyBncm91cCAlcy5cbiIsIGdyb3VwKTsKKwkJc2VxX3ByaW50ZihzZXEsICJUaW1lb3V0IHJlYWRpbmcgZ3JvdXAgJXMuXG4iLCBncm91cCk7CisJCWJyZWFrOwogCWNhc2UgLUVOT01FTToKLQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiTm8gZnJlZSBtZW1vcnkgdG8gcmVhZCB0aGUgdGFibGUuXG4iKTsKKwkJc2VxX3B1dHMoc2VxLCAiTm8gZnJlZSBtZW1vcnkgdG8gcmVhZCB0aGUgdGFibGUuXG4iKTsKKwkJYnJlYWs7CiAJY2FzZSAtSTJPX1BBUkFNU19TVEFUVVNfSU5WQUxJRF9HUk9VUF9JRDoKLQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiR3JvdXAgJXMgbm90IHN1cHBvcnRlZC5cbiIsIGdyb3VwKTsKKwkJc2VxX3ByaW50ZihzZXEsICJHcm91cCAlcyBub3Qgc3VwcG9ydGVkLlxuIiwgZ3JvdXApOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsCi0JCQkJICAiRXJyb3IgcmVhZGluZyBncm91cCAlcy4gQmxvY2tTdGF0dXMgMHglMDJYXG4iLAotCQkJCSAgZ3JvdXAsIC1ibG9ja19zdGF0dXMpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJFcnJvciByZWFkaW5nIGdyb3VwICVzLiBCbG9ja1N0YXR1cyAweCUwMlhcbiIsCisJCQkgICBncm91cCwgLWJsb2NrX3N0YXR1cyk7CisJCWJyZWFrOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY2hhciAqYnVzX3N0cmluZ3NbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vaW9wLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2lvcC5jCmluZGV4IDUyMzM0ZmMuLjIzYmRiZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vaW9wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2kyby9pb3AuYwpAQCAtMTA0Miw3ICsxMDQyLDcgQEAKICAqLwogc3RydWN0IGkyb19jb250cm9sbGVyICppMm9faW9wX2FsbG9jKHZvaWQpCiB7Ci0Jc3RhdGljIGludCB1bml0ID0gMDsJLyogMCBhbmQgMSBhcmUgTlVMTCBJT1AgYW5kIExvY2FsIEhvc3QgKi8KKwlzdGF0aWMgaW50IHVuaXQ7CS8qIDAgYW5kIDEgYXJlIE5VTEwgSU9QIGFuZCBMb2NhbCBIb3N0ICovCiAJc3RydWN0IGkyb19jb250cm9sbGVyICpjOwogCWNoYXIgcG9vbG5hbWVbMzJdOwogCkBAIC0xMDk2LDcgKzEwOTYsOCBAQAogewogCWludCByYzsKIAotCWlmICgocmMgPSBkZXZpY2VfYWRkKCZjLT5kZXZpY2UpKSkgeworCXJjID0gZGV2aWNlX2FkZCgmYy0+ZGV2aWNlKTsKKwlpZiAocmMpIHsKIAkJb3NtX2VycigiJXM6IGNvdWxkIG5vdCBhZGQgY29udHJvbGxlclxuIiwgYy0+bmFtZSk7CiAJCWdvdG8gaW9wX3Jlc2V0OwogCX0KQEAgLTExMDUsMjQgKzExMDYsMjggQEAKIAlvc21faW5mbygiJXM6IFRoaXMgbWF5IHRha2UgYSBmZXcgbWludXRlcyBpZiB0aGVyZSBhcmUgbWFueSBkZXZpY2VzXG4iLAogCQkgYy0+bmFtZSk7CiAKLQlpZiAoKHJjID0gaTJvX2lvcF9hY3RpdmF0ZShjKSkpIHsKKwlyYyA9IGkyb19pb3BfYWN0aXZhdGUoYyk7CisJaWYgKHJjKSB7CiAJCW9zbV9lcnIoIiVzOiBjb3VsZCBub3QgYWN0aXZhdGUgY29udHJvbGxlclxuIiwgYy0+bmFtZSk7CiAJCWdvdG8gZGV2aWNlX2RlbDsKIAl9CiAKIAlvc21fZGVidWcoIiVzOiBidWlsZGluZyBzeXMgdGFibGUuLi5cbiIsIGMtPm5hbWUpOwogCi0JaWYgKChyYyA9IGkyb19zeXN0YWJfYnVpbGQoKSkpCisJcmMgPSBpMm9fc3lzdGFiX2J1aWxkKCk7CisJaWYgKHJjKQogCQlnb3RvIGRldmljZV9kZWw7CiAKIAlvc21fZGVidWcoIiVzOiBvbmxpbmUgY29udHJvbGxlci4uLlxuIiwgYy0+bmFtZSk7CiAKLQlpZiAoKHJjID0gaTJvX2lvcF9vbmxpbmUoYykpKQorCXJjID0gaTJvX2lvcF9vbmxpbmUoYyk7CisJaWYgKHJjKQogCQlnb3RvIGRldmljZV9kZWw7CiAKIAlvc21fZGVidWcoIiVzOiBnZXR0aW5nIExDVC4uLlxuIiwgYy0+bmFtZSk7CiAKLQlpZiAoKHJjID0gaTJvX2V4ZWNfbGN0X2dldChjKSkpCisJcmMgPSBpMm9fZXhlY19sY3RfZ2V0KGMpOworCWlmIChyYykKIAkJZ290byBkZXZpY2VfZGVsOwogCiAJbGlzdF9hZGQoJmMtPmxpc3QsICZpMm9fY29udHJvbGxlcnMpOwpAQCAtMTE5MiwxMyArMTE5NywxNiBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKIAotCWlmICgocmMgPSBpMm9fZHJpdmVyX2luaXQoKSkpCisJcmMgPSBpMm9fZHJpdmVyX2luaXQoKTsKKwlpZiAocmMpCiAJCWdvdG8gZXhpdDsKIAotCWlmICgocmMgPSBpMm9fZXhlY19pbml0KCkpKQorCXJjID0gaTJvX2V4ZWNfaW5pdCgpOworCWlmIChyYykKIAkJZ290byBkcml2ZXJfZXhpdDsKIAotCWlmICgocmMgPSBpMm9fcGNpX2luaXQoKSkpCisJcmMgPSBpMm9fcGNpX2luaXQoKTsKKwlpZiAocmMpCiAJCWdvdG8gZXhlY19leGl0OwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL21lbW9yeS5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9tZW1vcnkuYwppbmRleCA4Zjk1MDlkLi43OGI3MDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTJvL21lbW9yeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vbWVtb3J5LmMKQEAgLTI3MCwxMCArMjcwLDkgQEAKIGludCBpMm9fcG9vbF9hbGxvYyhzdHJ1Y3QgaTJvX3Bvb2wgKnBvb2wsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJIHNpemVfdCBzaXplLCBpbnQgbWluX25yKQogewotCXBvb2wtPm5hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIDEsIEdGUF9LRVJORUwpOworCXBvb2wtPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwogCWlmICghcG9vbC0+bmFtZSkKIAkJZ290byBleGl0OwotCXN0cmNweShwb29sLT5uYW1lLCBuYW1lKTsKIAogCXBvb2wtPnNsYWIgPQogCSAgICBrbWVtX2NhY2hlX2NyZWF0ZShwb29sLT5uYW1lLCBzaXplLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2kyby9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vcGNpLmMKaW5kZXggYjNiOGE2MS4uNDk4MDRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL3BjaS5jCkBAIC0zMjksNyArMzI5LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKChyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgeworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogY291bGRuJ3QgZW5hYmxlIGRldmljZSAlc1xuIiwKIAkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKIAkJcmV0dXJuIHJjOwpAQCAtNDEwLDcgKzQxMSw4IEBACiAjZW5kaWYKIAl9CiAKLQlpZiAoKHJjID0gaTJvX3BjaV9hbGxvYyhjKSkpIHsKKwlyYyA9IGkyb19wY2lfYWxsb2MoYyk7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSAvIElPIGFsbG9jYXRpb24gZm9yIEkyTyBjb250cm9sbGVyICIKIAkJICAgICAgICJmYWlsZWRcbiIsIGMtPm5hbWUpOwogCQlnb3RvIGZyZWVfY29udHJvbGxlcjsKQEAgLTQyMiw3ICs0MjQsOCBAQAogCQlnb3RvIGZyZWVfcGNpOwogCX0KIAotCWlmICgocmMgPSBpMm9faW9wX2FkZChjKSkpCisJcmMgPSBpMm9faW9wX2FkZChjKTsKKwlpZiAocmMpCiAJCWdvdG8gdW5pbnN0YWxsOwogCiAJaWYgKGk5NjApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaAppbmRleCA4NzQ3ZGU1Li5lNmI4YzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKQEAgLTM0LDI0ICszNCwyNCBAQAogI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTUQgICAgICAgMHgzRSAvKiBPcGVyYXRpb24sIHN5c3RlbSBjb21tYW5kIHJlZ2lzdGVyICovCiAKIC8qIE1TQ19DVFJMICovCi0jZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICAoMSA8PCA4KSAgLyogU2VsZi10ZXN0IGVuYWJsZSAqLwotI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRU4JICAgICAgICAoMSA8PCAyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgKDEgPDwgMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KLSNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0RBVEFfUkRZX0RJTzEJKDEgPDwgMCkgIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8xLCAwID0gRElPMCAqLworI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfU0VMRl9URVNUX0VOCSAgICAgICAgQklUKDgpICAvKiBTZWxmLXRlc3QgZW5hYmxlICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgIEJJVCgyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgQklUKDEpICAvKiBEYXRhLXJlYWR5IHBvbGFyaXR5OiAxID0gYWN0aXZlIGhpZ2gsIDAgPSBhY3RpdmUgbG93ICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9ESU8xCUJJVCgwKSAgLyogRGF0YS1yZWFkeSBsaW5lIHNlbGVjdGlvbjogMSA9IERJTzEsIDAgPSBESU8wICovCiAKIC8qIERJQUdfU1RBVCAqLwotI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX0FMQVJNMiAgICAgICAgKDE8PDkpIC8qIEFsYXJtIDIgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KLSNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9BTEFSTTEgICAgICAgICgxPDw4KSAvKiBBbGFybSAxIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfQUxBUk0yICAgICAgICBCSVQoOSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX0FMQVJNMSAgICAgICAgQklUKDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KICNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9TUElfRkFJTF9CSVQgICAzIC8qIFNQSSBjb21tdW5pY2F0aW9ucyBmYWlsdXJlICovCiAjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfRkxBU0hfVVBUX0JJVCAgMiAvKiBGbGFzaCB1cGRhdGUgZmFpbHVyZSAqLwogI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX1BPV0VSX0hJR0hfQklUIDEgLyogUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1IFYgKi8KICNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9QT1dFUl9MT1dfQklUICAwIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAzLjE1IFYgKi8KIAogLyogR0xPQl9DTUQgKi8KLSNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQotI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisjZGVmaW5lIEFESVMxNjIwMV9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCUJJVCgxKQogCi0jZGVmaW5lIEFESVMxNjIwMV9FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBBRElTMTYyMDFfRVJST1JfQUNUSVZFICAgICAgICAgIEJJVCgxNCkKIAogZW51bSBhZGlzMTYyMDFfc2NhbiB7CiAJQURJUzE2MjAxX1NDQU5fQUNDX1gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9jb3JlLmMKaW5kZXggN2VhZTVmZC4uMTBkYjY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYwpAQCAtMTM1LDE0ICsxMzUsMTQgQEAKIAlBRElTX1NVUFBMWV9DSEFOKEFESVMxNjIwMV9TVVBQTFlfT1VULCBBRElTMTYyMDFfU0NBTl9TVVBQTFksIDAsIDEyKSwKIAlBRElTX1RFTVBfQ0hBTihBRElTMTYyMDFfVEVNUF9PVVQsIEFESVMxNjIwMV9TQ0FOX1RFTVAsIDAsIDEyKSwKIAlBRElTX0FDQ0VMX0NIQU4oWCwgQURJUzE2MjAxX1hBQ0NMX09VVCwgQURJUzE2MjAxX1NDQU5fQUNDX1gsCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKIAlBRElTX0FDQ0VMX0NIQU4oWSwgQURJUzE2MjAxX1lBQ0NMX09VVCwgQURJUzE2MjAxX1NDQU5fQUNDX1ksCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKIAlBRElTX0FVWF9BRENfQ0hBTihBRElTMTYyMDFfQVVYX0FEQywgQURJUzE2MjAxX1NDQU5fQVVYX0FEQywgMCwgMTIpLAogCUFESVNfSU5DTElfQ0hBTihYLCBBRElTMTYyMDFfWElOQ0xfT1VULCBBRElTMTYyMDFfU0NBTl9JTkNMSV9YLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCiAJQURJU19JTkNMSV9DSEFOKFgsIEFESVMxNjIwMV9ZSU5DTF9PVVQsIEFESVMxNjIwMV9TQ0FOX0lOQ0xJX1ksCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKIAlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg3KQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKaW5kZXggYWNjNjg4ZC4uNjQyNmUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oCkBAIC0yNSwxNiArMjUsMTYgQEAKICNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EICAgICAgIDB4M0UgLyogT3BlcmF0aW9uLCBzeXN0ZW0gY29tbWFuZCByZWdpc3RlciAqLwogCiAvKiBNU0NfQ1RSTCAqLwotI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCSgxIDw8IDEwKSAvKiBTZWxmLXRlc3QgYXQgcG93ZXItb246IDEgPSBkaXNhYmxlZCwgMCA9IGVuYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1JFVkVSU0VfUk9UX0VOCSgxIDw8IDkpICAvKiBSZXZlcnNlcyByb3RhdGlvbiBvZiBib3RoIGluY2xpbmF0aW9uIG91dHB1dHMgKi8KLSNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpICAvKiBTZWxmLXRlc3QgZW5hYmxlICovCi0jZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLwotI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKSAgLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLwotI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRElPMQkoMSA8PCAwKSAgLyogRGF0YS1yZWFkeSBsaW5lIHNlbGVjdGlvbjogMSA9IERJTzEsIDAgPSBESU8wICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9QV1JVUF9TRUxGX1RFU1QJQklUKDEwKSAvKiBTZWxmLXRlc3QgYXQgcG93ZXItb246IDEgPSBkaXNhYmxlZCwgMCA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1JFVkVSU0VfUk9UX0VOCUJJVCg5KSAgLyogUmV2ZXJzZXMgcm90YXRpb24gb2YgYm90aCBpbmNsaW5hdGlvbiBvdXRwdXRzICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkgIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0VOCSAgICAgICAgQklUKDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0RJTzEJQklUKDApICAvKiBEYXRhLXJlYWR5IGxpbmUgc2VsZWN0aW9uOiAxID0gRElPMSwgMCA9IERJTzAgKi8KIAogLyogRElBR19TVEFUICovCi0jZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwotI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9BTEFSTTIgICAgICAgIEJJVCg5KSAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfQUxBUk0xICAgICAgICBCSVQoOCkgLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwogI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1NFTEZURVNUX0ZBSUxfQklUIDUgLyogU2VsZi10ZXN0IGRpYWdub3N0aWMgZXJyb3IgZmxhZyAqLwogI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1NQSV9GQUlMX0JJVCAgICAgIDMgLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KICNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9GTEFTSF9VUFRfQklUICAgICAyIC8qIEZsYXNoIHVwZGF0ZSBmYWlsdXJlICovCkBAIC00MiwxMSArNDIsMTEgQEAKICNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9QT1dFUl9MT1dfQklUICAgICAwIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAzLjE1IFYgKi8KIAogLyogR0xPQl9DTUQgKi8KLSNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQotI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfQ0xFQVJfU1RBVAkoMTw8NCkKLSNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCSgxPDwxKQorI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfU1dfUkVTRVQJQklUKDcpCisjZGVmaW5lIEFESVMxNjIwM19HTE9CX0NNRF9DTEVBUl9TVEFUCUJJVCg0KQorI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfRkFDVE9SWV9DQUwJQklUKDEpCiAKLSNkZWZpbmUgQURJUzE2MjAzX0VSUk9SX0FDVElWRSAgICAgICAgICAoMTw8MTQpCisjZGVmaW5lIEFESVMxNjIwM19FUlJPUl9BQ1RJVkUgICAgICAgICAgQklUKDE0KQogCiBlbnVtIGFkaXMxNjIwM19zY2FuIHsKIAlBRElTMTYyMDNfU0NBTl9JTkNMSV9YLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfY29yZS5jCmluZGV4IGZiYmU5M2YuLmZiNTkzZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19jb3JlLmMKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAJQURJU19TVVBQTFlfQ0hBTihBRElTMTYyMDNfU1VQUExZX09VVCwgQURJUzE2MjAzX1NDQU5fU1VQUExZLCAwLCAxMiksCiAJQURJU19BVVhfQURDX0NIQU4oQURJUzE2MjAzX0FVWF9BREMsIEFESVMxNjIwM19TQ0FOX0FVWF9BREMsIDAsIDEyKSwKIAlBRElTX0lOQ0xJX0NIQU4oWCwgQURJUzE2MjAzX1hJTkNMX09VVCwgQURJUzE2MjAzX1NDQU5fSU5DTElfWCwKLQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSwgMCwgMTQpLAorCQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSwgMCwgMTQpLAogCS8qIEZpeG1lOiBOb3Qgd2hhdCBpdCBhcHBlYXJzIHRvIGJlIC0gc2VlIGRhdGEgc2hlZXQgKi8KIAlBRElTX0lOQ0xJX0NIQU4oWSwgQURJUzE2MjAzX1lJTkNMX09VVCwgQURJUzE2MjAzX1NDQU5fSU5DTElfWSwKLQkJMCwgMCwgMTQpLAorCQkJMCwgMCwgMTQpLAogCUFESVNfVEVNUF9DSEFOKEFESVMxNjIwM19URU1QX09VVCwgQURJUzE2MjAzX1NDQU5fVEVNUCwgMCwgMTIpLAogCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDUpLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oCmluZGV4IDlmZjk1MGMuLjBiMjNmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApAQCAtMzMsMTUgKzMzLDE1IEBACiAjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRCAgICAgICAweDNFIC8qIE9wZXJhdGlvbiwgc3lzdGVtIGNvbW1hbmQgcmVnaXN0ZXIgKi8KIAogLyogTVNDX0NUUkwgKi8KLSNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX1BXUlVQX1NFTEZfVEVTVAkoMSA8PCAxMCkgLyogU2VsZi10ZXN0IGF0IHBvd2VyLW9uOiAxID0gZGlzYWJsZWQsIDAgPSBlbmFibGVkICovCi0jZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICAoMSA8PCA4KSAgLyogU2VsZi10ZXN0IGVuYWJsZSAqLwotI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfREFUQV9SRFlfRU4JICAgICAgICAoMSA8PCAyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgKDEgPDwgMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KLSNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0RJTzIJKDEgPDwgMCkgIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8yLCAwID0gRElPMSAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCUJJVCgxMCkgLyogU2VsZi10ZXN0IGF0IHBvd2VyLW9uOiAxID0gZGlzYWJsZWQsIDAgPSBlbmFibGVkICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkgIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0VOCSAgICAgICAgQklUKDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0RJTzIJQklUKDApICAvKiBEYXRhLXJlYWR5IGxpbmUgc2VsZWN0aW9uOiAxID0gRElPMiwgMCA9IERJTzEgKi8KIAogLyogRElBR19TVEFUICovCi0jZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwotI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9BTEFSTTIgICAgICAgIEJJVCg5KSAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfQUxBUk0xICAgICAgICBCSVQoOCkgLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwogI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX1NFTEZURVNUX0ZBSUxfQklUIDUgLyogU2VsZi10ZXN0IGRpYWdub3N0aWMgZXJyb3IgZmxhZzogMSA9IGVycm9yIGNvbmRpdGlvbiwKIAkJCQkJCTAgPSBub3JtYWwgb3BlcmF0aW9uICovCiAjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfU1BJX0ZBSUxfQklUICAgICAgMyAvKiBTUEkgY29tbXVuaWNhdGlvbnMgZmFpbHVyZSAqLwpAQCAtNTAsMTEgKzUwLDExIEBACiAjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfUE9XRVJfTE9XX0JJVCAgICAgMCAvKiBQb3dlciBzdXBwbHkgYmVsb3cgMi45NzUgViAqLwogCiAvKiBHTE9CX0NNRCAqLwotI2RlZmluZSBBRElTMTYyMDRfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCi0jZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9DTEVBUl9TVEFUCSgxPDw0KQotI2RlZmluZSBBRElTMTYyMDRfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EX0NMRUFSX1NUQVQJQklUKDQpCisjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9GQUNUT1JZX0NBTAlCSVQoMSkKIAotI2RlZmluZSBBRElTMTYyMDRfRVJST1JfQUNUSVZFICAgICAgICAgICgxPDwxNCkKKyNkZWZpbmUgQURJUzE2MjA0X0VSUk9SX0FDVElWRSAgICAgICAgICBCSVQoMTQpCiAKIGVudW0gYWRpczE2MjA0X3NjYW4gewogCUFESVMxNjIwNF9TQ0FOX0FDQ19YLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jCmluZGV4IDRjOGFjYmMuLmVhMGFjMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9jb3JlLmMKQEAgLTE0MSwxMSArMTQxLDEzIEBACiAJQURJU19BVVhfQURDX0NIQU4oQURJUzE2MjA0X0FVWF9BREMsIEFESVMxNjIwNF9TQ0FOX0FVWF9BREMsIDAsIDEyKSwKIAlBRElTX1RFTVBfQ0hBTihBRElTMTYyMDRfVEVNUF9PVVQsIEFESVMxNjIwNF9TQ0FOX1RFTVAsIDAsIDEyKSwKIAlBRElTX0FDQ0VMX0NIQU4oWCwgQURJUzE2MjA0X1hBQ0NMX09VVCwgQURJUzE2MjA0X1NDQU5fQUNDX1gsCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUykgfCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTQpLAorCQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLAorCQkJMCwgMTQpLAogCUFESVNfQUNDRUxfQ0hBTihZLCBBRElTMTYyMDRfWUFDQ0xfT1VULCBBRElTMTYyMDRfU0NBTl9BQ0NfWSwKLQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpIHwgQklUKElJT19DSEFOX0lORk9fUEVBSyksCisJCQkwLCAxNCksCiAJQURJU19BQ0NFTF9DSEFOKFJPT1RfU1VNX1NRVUFSRURfWF9ZLCBBRElTMTYyMDRfWFlfUlNTX09VVCwKLQkJQURJUzE2MjA0X1NDQU5fQUNDX1hZLCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTQpLAorCQkJQURJUzE2MjA0X1NDQU5fQUNDX1hZLCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTQpLAogCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDUpLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmgKaW5kZXggYWQzOTQ1YS4uODEzNjk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOS5oCkBAIC02MCwyMSArNjAsMjEgQEAKIAogLyogTVNDX0NUUkwgKi8KIC8qIFNlbGYtdGVzdCBhdCBwb3dlci1vbjogMSA9IGRpc2FibGVkLCAwID0gZW5hYmxlZCAqLwotI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCSgxIDw8IDEwKQorI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCUJJVCgxMCkKIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KLSNkZWZpbmUgQURJUzE2MjA5X01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIEFESVMxNjIwOV9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkKIC8qIERhdGEtcmVhZHkgZW5hYmxlOiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCi0jZGVmaW5lIEFESVMxNjIwOV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFESVMxNjIwOV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgIEJJVCgyKQogLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLwotI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkKIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8yLCAwID0gRElPMSAqLwotI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfREFUQV9SRFlfRElPMgkoMSA8PCAwKQorI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfREFUQV9SRFlfRElPMglCSVQoMCkKIAogLyogRElBR19TVEFUICovCiAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCi0jZGVmaW5lIEFESVMxNjIwOV9ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkKKyNkZWZpbmUgQURJUzE2MjA5X0RJQUdfU1RBVF9BTEFSTTIgICAgICAgIEJJVCg5KQogLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwotI2RlZmluZSBBRElTMTYyMDlfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpCisjZGVmaW5lIEFESVMxNjIwOV9ESUFHX1NUQVRfQUxBUk0xICAgICAgICBCSVQoOCkKIC8qIFNlbGYtdGVzdCBkaWFnbm9zdGljIGVycm9yIGZsYWc6IDEgPSBlcnJvciBjb25kaXRpb24sIDAgPSBub3JtYWwgb3BlcmF0aW9uICovCiAjZGVmaW5lIEFESVMxNjIwOV9ESUFHX1NUQVRfU0VMRlRFU1RfRkFJTF9CSVQJNQogLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KQEAgLTg3LDExICs4NywxMSBAQAogI2RlZmluZSBBRElTMTYyMDlfRElBR19TVEFUX1BPV0VSX0xPV19CSVQJMAogCiAvKiBHTE9CX0NNRCAqLwotI2RlZmluZSBBRElTMTYyMDlfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCi0jZGVmaW5lIEFESVMxNjIwOV9HTE9CX0NNRF9DTEVBUl9TVEFUCSgxPDw0KQotI2RlZmluZSBBRElTMTYyMDlfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisjZGVmaW5lIEFESVMxNjIwOV9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjA5X0dMT0JfQ01EX0NMRUFSX1NUQVQJQklUKDQpCisjZGVmaW5lIEFESVMxNjIwOV9HTE9CX0NNRF9GQUNUT1JZX0NBTAlCSVQoMSkKIAotI2RlZmluZSBBRElTMTYyMDlfRVJST1JfQUNUSVZFICAgICAgICAgICgxPDwxNCkKKyNkZWZpbmUgQURJUzE2MjA5X0VSUk9SX0FDVElWRSAgICAgICAgICBCSVQoMTQpCiAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fU1VQUExZCTAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fQUNDX1gJMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfY29yZS5jCmluZGV4IGIyYzdhZWQuLmQxZGMxYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9jb3JlLmMKQEAgLTEzNCwxNCArMTM0LDE0IEBACiAJQURJU19TVVBQTFlfQ0hBTihBRElTMTYyMDlfU1VQUExZX09VVCwgQURJUzE2MjA5X1NDQU5fU1VQUExZLCAwLCAxNCksCiAJQURJU19URU1QX0NIQU4oQURJUzE2MjA5X1RFTVBfT1VULCBBRElTMTYyMDlfU0NBTl9URU1QLCAwLCAxMiksCiAJQURJU19BQ0NFTF9DSEFOKFgsIEFESVMxNjIwOV9YQUNDTF9PVVQsIEFESVMxNjIwOV9TQ0FOX0FDQ19YLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCiAJQURJU19BQ0NFTF9DSEFOKFksIEFESVMxNjIwOV9ZQUNDTF9PVVQsIEFESVMxNjIwOV9TQ0FOX0FDQ19ZLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCiAJQURJU19BVVhfQURDX0NIQU4oQURJUzE2MjA5X0FVWF9BREMsIEFESVMxNjIwOV9TQ0FOX0FVWF9BREMsIDAsIDEyKSwKIAlBRElTX0lOQ0xJX0NIQU4oWCwgQURJUzE2MjA5X1hJTkNMX09VVCwgQURJUzE2MjA5X1NDQU5fSU5DTElfWCwKLQkJMCwgMCwgMTQpLAorCQkJMCwgMCwgMTQpLAogCUFESVNfSU5DTElfQ0hBTihZLCBBRElTMTYyMDlfWUlOQ0xfT1VULCBBRElTMTYyMDlfU0NBTl9JTkNMSV9ZLAotCQkwLCAwLCAxNCksCisJCQkwLCAwLCAxNCksCiAJQURJU19ST1RfQ0hBTihYLCBBRElTMTYyMDlfUk9UX09VVCwgQURJUzE2MjA5X1NDQU5fUk9ULCAwLCAwLCAxNCksCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCkKIH07CkBAIC0xNzgsNyArMTc4LDYgQEAKIAkJQklUKEFESVMxNjIwOV9ESUFHX1NUQVRfUE9XRVJfTE9XX0JJVCksCiB9OwogCi0KIHN0YXRpYyBpbnQgYWRpczE2MjA5X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMC5oCmluZGV4IGE4OTRhZDcuLmVhYjg2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMjAuaApAQCAtNzEsMzUgKzcxLDM1IEBACiAjZGVmaW5lIEFESVMxNjIyMF9DQVBUVVJFX1NJWkUgIDIwNDgKIAogLyogTVNDX0NUUkwgKi8KLSNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpCi0jZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9QT1dFUl9TVVBfQ09NX0FJTjEJKDEgPDwgMSkKLSNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX1BPV0VSX1NVUF9DT01fQUlOMgkoMSA8PCAwKQorI2RlZmluZSBBRElTMTYyMjBfTVNDX0NUUkxfU0VMRl9URVNUX0VOCSAgICAgICAgQklUKDgpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9QT1dFUl9TVVBfQ09NX0FJTjEJQklUKDEpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9QT1dFUl9TVVBfQ09NX0FJTjIJQklUKDApCiAKIC8qIERJT19DVFJMICovCi0jZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8yX0JVU1lfSU5EICAgICAoMzw8NCkKLSNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX0RJTzFfQlVTWV9JTkQgICAgICgzPDwyKQotI2RlZmluZSBBRElTMTYyMjBfTVNDX0NUUkxfRElPMl9BQ1RfSElHSCAgICAgKDE8PDEpCi0jZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8xX0FDVF9ISUdIICAgICAoMTw8MCkKKyNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX0RJTzJfQlVTWV9JTkQgICAgIChCSVQoNSkgfCBCSVQoNCkpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8xX0JVU1lfSU5EICAgICAoQklUKDMpIHwgQklUKDIpKQorI2RlZmluZSBBRElTMTYyMjBfTVNDX0NUUkxfRElPMl9BQ1RfSElHSCAgICAgQklUKDEpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8xX0FDVF9ISUdIICAgICBCSVQoMCkKIAogLyogRElBR19TVEFUICovCiAvKiBBSU4yIHNhbXBsZSA+IEFMTV9NQUcyICovCi0jZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfQUxNX01BRzIgICAgKDE8PDE0KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0FMTV9NQUcyICAgIEJJVCgxNCkKIC8qIEFJTjEgc2FtcGxlID4gQUxNX01BRzEgKi8KLSNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9BTE1fTUFHMSAgICAoMTw8MTMpCisjZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfQUxNX01BRzEgICAgQklUKDEzKQogLyogQWNjZWxlcmF0aW9uIHNhbXBsZSA+IEFMTV9NQUdBICovCi0jZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfQUxNX01BR0EgICAgKDE8PDEyKQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0FMTV9NQUdBICAgIEJJVCgxMikKIC8qIEVycm9yIGNvbmRpdGlvbiBwcm9ncmFtbWVkIGludG8gQUxNX01BR1NbMTE6MF0gYW5kIEFMTV9DVFJMWzU6NF0gaXMgdHJ1ZSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0FMTV9NQUdTICAgICgxPDwxMSkKKyNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9BTE1fTUFHUyAgICBCSVQoMTEpCiAvKiB8UGVhayB2YWx1ZSBpbiBBSU4yIGRhdGEgY2FwdHVyZXwgPiBBTE1fTUFHMiAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUlOMiAgICgxPDwxMCkKKyNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9QRUFLX0FJTjIgICBCSVQoMTApCiAvKiB8UGVhayB2YWx1ZSBpbiBBSU4xIGRhdGEgY2FwdHVyZXwgPiBBTE1fTUFHMSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUlOMSAgICgxPDw5KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUlOMSAgIEJJVCg5KQogLyogfFBlYWsgdmFsdWUgaW4gYWNjZWxlcmF0aW9uIGRhdGEgY2FwdHVyZXwgPiBBTE1fTUFHQSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUNDRUwgICgxPDw4KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUNDRUwgIEJJVCg4KQogLyogRGF0YSByZWFkeSwgY2FwdHVyZSBjb21wbGV0ZSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0RBVEFfUkRZICAgICgxPDw3KQotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0ZMQVNIX0NISwkoMTw8NikKLSNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9TRUxGX1RFU1QJKDE8PDUpCisjZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfREFUQV9SRFkgICAgQklUKDcpCisjZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfRkxBU0hfQ0hLCUJJVCg2KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1NFTEZfVEVTVAlCSVQoNSkKIC8qIENhcHR1cmUgcGVyaW9kIHZpb2xhdGlvbi9pbnRlcnJ1cHRpb24gKi8KICNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9WSU9MQVRJT05fQklUCTQKIC8qIFNQSSBjb21tdW5pY2F0aW9ucyBmYWlsdXJlICovCkBAIC0xMTIsOSArMTEyLDkgQEAKICNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9QT1dFUl9MT1dfQklUCTAKIAogLyogR0xPQl9DTUQgKi8KLSNkZWZpbmUgQURJUzE2MjIwX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQotI2RlZmluZSBBRElTMTYyMjBfR0xPQl9DTURfU0VMRl9URVNUCSgxPDwyKQotI2RlZmluZSBBRElTMTYyMjBfR0xPQl9DTURfUFdSX0RPV04JKDE8PDEpCisjZGVmaW5lIEFESVMxNjIyMF9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjIwX0dMT0JfQ01EX1NFTEZfVEVTVAlCSVQoMikKKyNkZWZpbmUgQURJUzE2MjIwX0dMT0JfQ01EX1BXUl9ET1dOCUJJVCgxKQogCiAjZGVmaW5lIEFESVMxNjIyMF9NQVhfVFggMjA0OAogI2RlZmluZSBBRElTMTYyMjBfTUFYX1JYIDIwNDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwX2NvcmUuYwppbmRleCBkNDc4ZjUxLi5lNDZhOTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMjBfY29yZS5jCkBAIC0yMSwyOSArMjEsMjggQEAKICNpbmNsdWRlICJhZGlzMTYyMjAuaCIKIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRpczE2MjIwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3NpemVfdCByZXQ7Ci0JczE2IHZhbCA9IDA7CisJdTE2IHZhbDsKIAogCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KIAltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQlyZXQgPSBhZGlzX3JlYWRfcmVnXzE2KCZzdC0+YWRpcywgdGhpc19hdHRyLT5hZGRyZXNzLAotCQkJCQkodTE2ICopJnZhbCk7CisJcmV0ID0gYWRpc19yZWFkX3JlZ18xNigmc3QtPmFkaXMsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOwogfQogCiBzdGF0aWMgc3NpemVfdCBhZGlzMTYyMjBfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKQEAgLTc2LDggKzc1LDggQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX3dyaXRlX2NhcHR1cmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCWJvb2wgdmFsOwpAQCAtOTYsMTAgKzk1LDEwIEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjIyMF9jYXB0dXJlX2J1ZmZlcl9yZWFkKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkJCWNoYXIgKmJ1ZiwKLQkJCQkJbG9mZl90IG9mZiwKLQkJCQkJc2l6ZV90IGNvdW50LAotCQkJCQlpbnQgYWRkcikKKwkJCQkJICAgICBjaGFyICpidWYsCisJCQkJCSAgICAgbG9mZl90IG9mZiwKKwkJCQkJICAgICBzaXplX3QgY291bnQsCisJCQkJCSAgICAgaW50IGFkZHIpCiB7CiAJc3RydWN0IGFkaXMxNjIyMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKQEAgLTEzMSwxNSArMTMwLDE0IEBACiAKIAkvKiB3cml0ZSB0aGUgYmVnaW4gcG9zaXRpb24gb2YgY2FwdHVyZSBidWZmZXIgKi8KIAlyZXQgPSBhZGlzX3dyaXRlX3JlZ18xNigmc3QtPmFkaXMsCi0JCQkJCUFESVMxNjIyMF9DQVBUX1BOVFIsCi0JCQkJCW9mZiA+IDEpOworCQkJCUFESVMxNjIyMF9DQVBUX1BOVFIsCisJCQkJb2ZmID4gMSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU87CiAKIAkvKiByZWFkIGNvdW50LzIgdmFsdWVzIGZyb20gY2FwdHVyZSBidWZmZXIgKi8KIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwogCi0KIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMikgewogCQlzdC0+dHhbaV0gPSBBRElTX1JFQURfUkVHKGFkZHIpOwogCQlzdC0+dHhbaSArIDFdID0gMDsKQEAgLTE0OCw3ICsxNDYsNiBAQAogCiAJcmV0ID0gc3BpX3N5bmNfdHJhbnNmZXIoc3QtPmFkaXMuc3BpLCB4ZmVycywgQVJSQVlfU0laRSh4ZmVycykpOwogCWlmIChyZXQpIHsKLQogCQltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE4Miw5ICsxNzksOSBAQAogfTsKIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX2FkYzFfYmluX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAotCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwKLQkJCQlzaXplX3QgY291bnQpCisJCQkJICAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoa29ial90b19kZXYoa29iaikpOwogCkBAIC0yMDMsOSArMjAwLDkgQEAKIH07CiAKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjIyMF9hZGMyX2Jpbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsCi0JCQkJc2l6ZV90IGNvdW50KQorCQkJCSAgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAorCQkJCSAgICAgICBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGtvYmpfdG9fZGV2KGtvYmopKTsKIApAQCAtMjE0LDcgKzIxMSw2IEBACiAJCQkJCUFESVMxNjIyMF9DQVBUX0JVRjIpOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBhZGMyX2JpbiA9IHsKIAkuYXR0ciA9IHsKIAkJLm5hbWUgPSAiaW4xX2JpbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDAuaAppbmRleCBkNDQyZDQ5Li42NmI1YWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwLmgKQEAgLTc0LDMxICs3NCwzMSBAQAogCiAvKiBNU0NfQ1RSTCAqLwogLyogRW5hYmxlcyBzdW0tb2Ytc3F1YXJlcyBvdXRwdXQgKFhZWlBFQUtfT1VUKSAqLwotI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfWFlaUEVBS19PVVRfRU4JKDEgPDwgMTUpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9YWVpQRUFLX09VVF9FTglCSVQoMTUpCiAvKiBFbmFibGVzIHBlYWsgdHJhY2tpbmcgb3V0cHV0IChYUEVBS19PVVQsIFlQRUFLX09VVCwgYW5kIFpQRUFLX09VVCkgKi8KLSNkZWZpbmUgQURJUzE2MjQwX01TQ19DVFJMX1hfWV9aUEVBS19PVVRfRU4JKDEgPDwgMTQpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9YX1lfWlBFQUtfT1VUX0VOCUJJVCgxNCkKIC8qIFNlbGYtdGVzdCBlbmFibGU6IDEgPSBhcHBseSBlbGVjdHJvc3RhdGljIGZvcmNlLCAwID0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjQwX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkKIC8qIERhdGEtcmVhZHkgZW5hYmxlOiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCi0jZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgIEJJVCgyKQogLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLwotI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkKIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8yLCAwID0gRElPMSAqLwotI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfREFUQV9SRFlfRElPMgkoMSA8PCAwKQorI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfREFUQV9SRFlfRElPMglCSVQoMCkKIAogLyogRElBR19TVEFUICovCiAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCi0jZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0yICAgICAgKDE8PDkpCisjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0yICAgICAgQklUKDkpCiAvKiBBbGFybSAxIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCi0jZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0xICAgICAgKDE8PDgpCisjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0xICAgICAgQklUKDgpCiAvKiBDYXB0dXJlIGJ1ZmZlciBmdWxsOiAxID0gY2FwdHVyZSBidWZmZXIgaXMgZnVsbCAqLwotI2RlZmluZSBBRElTMTYyNDBfRElBR19TVEFUX0NQVF9CVUZfRlVMICgxPDw3KQorI2RlZmluZSBBRElTMTYyNDBfRElBR19TVEFUX0NQVF9CVUZfRlVMIEJJVCg3KQogLyogRmxhc2ggdGVzdCwgY2hlY2tzdW0gZmxhZzogMSA9IG1pc21hdGNoLCAwID0gbWF0Y2ggKi8KLSNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9DSEtTVU0gICAgICAoMTw8NikKKyNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9DSEtTVU0gICAgICBCSVQoNikKIC8qIFBvd2VyLW9uLCBzZWxmLXRlc3QgZmxhZzogMSA9IGZhaWx1cmUsIDAgPSBwYXNzICovCiAjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfUFdST05fRkFJTF9CSVQgIDUKIC8qIFBvd2VyLW9uIHNlbGYtdGVzdDogMSA9IGluLXByb2dyZXNzLCAwID0gY29tcGxldGUgKi8KLSNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9QV1JPTl9CVVNZICAoMTw8NCkKKyNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9QV1JPTl9CVVNZICBCSVQoNCkKIC8qIFNQSSBjb21tdW5pY2F0aW9ucyBmYWlsdXJlICovCiAjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfU1BJX0ZBSUxfQklUCTMKIC8qIEZsYXNoIHVwZGF0ZSBmYWlsdXJlICovCkBAIC0xMDksMTEgKzEwOSwxMSBAQAogI2RlZmluZSBBRElTMTYyNDBfRElBR19TVEFUX1BPV0VSX0xPV19CSVQJMAogCiAvKiBHTE9CX0NNRCAqLwotI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfUkVTVU1FCSgxPDw4KQotI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCi0jZGVmaW5lIEFESVMxNjI0MF9HTE9CX0NNRF9TVEFOREJZCSgxPDwyKQorI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfUkVTVU1FCUJJVCg4KQorI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfU1dfUkVTRVQJQklUKDcpCisjZGVmaW5lIEFESVMxNjI0MF9HTE9CX0NNRF9TVEFOREJZCUJJVCgyKQogCi0jZGVmaW5lIEFESVMxNjI0MF9FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBBRElTMTYyNDBfRVJST1JfQUNUSVZFICAgICAgICAgIEJJVCgxNCkKIAogLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgogICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfY29yZS5jCmluZGV4IDNmNDYwODYuLmNiMDc0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9jb3JlLmMKQEAgLTI3LDkgKzI3LDkgQEAKICNpbmNsdWRlICJhZGlzMTYyNDAuaCIKIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjQwX3NwaV9yZWFkX3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYsCi0JCXVuc2lnbmVkIGJpdHMpCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZiwKKwkJCQkJIHVuc2lnbmVkIGJpdHMpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkaXMgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTM5LDIwICszOSwyMCBAQAogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAogCXJldCA9IGFkaXNfcmVhZF9yZWdfMTYoc3QsCi0JCQkJCXRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCQkJICAgICAgIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAodmFsICYgQURJUzE2MjQwX0VSUk9SX0FDVElWRSkKIAkJYWRpc19jaGVja19zdGF0dXMoc3QpOwogCi0JdmFsID0gKChzMTYpKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQpOworCXZhbCA9IChzMTYpKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQ7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjI0MF9yZWFkXzEyYml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCiB7CiAJc3NpemVfdCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CkBAIC0xNzYsMTEgKzE3NiwxNCBAQAogCUFESVNfU1VQUExZX0NIQU4oQURJUzE2MjQwX1NVUFBMWV9PVVQsIEFESVMxNjI0MF9TQ0FOX1NVUFBMWSwgMCwgMTApLAogCUFESVNfQVVYX0FEQ19DSEFOKEFESVMxNjI0MF9BVVhfQURDLCBBRElTMTYyNDBfU0NBTl9BVVhfQURDLCAwLCAxMCksCiAJQURJU19BQ0NFTF9DSEFOKFgsIEFESVMxNjI0MF9YQUNDTF9PVVQsIEFESVMxNjI0MF9TQ0FOX0FDQ19YLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpIHwgQklUKElJT19DSEFOX0lORk9fUEVBSyksIDAsIDEwKSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUykgfCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwKKwkJCTAsIDEwKSwKIAlBRElTX0FDQ0VMX0NIQU4oWSwgQURJUzE2MjQwX1lBQ0NMX09VVCwgQURJUzE2MjQwX1NDQU5fQUNDX1ksCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUykgfCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTApLAorCQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLAorCQkJMCwgMTApLAogCUFESVNfQUNDRUxfQ0hBTihaLCBBRElTMTYyNDBfWkFDQ0xfT1VULCBBRElTMTYyNDBfU0NBTl9BQ0NfWiwKLQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLCAwLCAxMCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpIHwgQklUKElJT19DSEFOX0lORk9fUEVBSyksCisJCQkwLCAxMCksCiAJQURJU19URU1QX0NIQU4oQURJUzE2MjQwX1RFTVBfT1VULCBBRElTMTYyNDBfU0NBTl9URU1QLCAwLCAxMCksCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNikKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHEuaAppbmRleCAwYThlYTgyLi4zZjI0YzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxLmgKQEAgLTE5NCw2ICsxOTQsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGxpczNsMDJkcV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogfQorCiBzdGF0aWMgaW5saW5lIGludCBsaXMzbDAyZHFfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXJldHVybiAwOwpAQCAtMjAzLDYgKzIwNCw3IEBACiB7CiAJcmV0dXJuIDA7CiB9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBsaXMzbDAyZHFfdW5jb25maWd1cmVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9jb3JlLmMKaW5kZXggYjc4YzljNS4uZWJjYWI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX2NvcmUuYwpAQCAtNTU4LDEzICs1NTgsMTEgQEAKIAlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgzKQogfTsKIAotCiBzdGF0aWMgaW50IGxpczNsMDJkcV9yZWFkX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKIAkJCQkgICAgICAgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAogCQkJCSAgICAgICBlbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyKQogewotCiAJdTggdmFsOwogCWludCByZXQ7CiAJdTggbWFzayA9ICgxIDw8IChjaGFuLT5jaGFubmVsMioyICsgKGRpciA9PSBJSU9fRVZfRElSX1JJU0lORykpKTsKQEAgLTY1Niw4ICs2NTQsOCBAQAogCQkJKGNvbnRyb2wgfCBMSVMzTDAyRFFfUkVHX0NUUkxfMl9FTkFCTEVfSU5URVJSVVBUKSA6CiAJCQkoY29udHJvbCAmIH5MSVMzTDAyRFFfUkVHX0NUUkxfMl9FTkFCTEVfSU5URVJSVVBUKTsKIAkJcmV0ID0gbGlzM2wwMmRxX3NwaV93cml0ZV9yZWdfOChpbmRpb19kZXYsCi0JCQkJCSAgICAgICBMSVMzTDAyRFFfUkVHX0NUUkxfMl9BRERSLAotCQkJCQkgICAgICAgY29udHJvbCk7CisJCQkJCQlMSVMzTDAyRFFfUkVHX0NUUkxfMl9BRERSLAorCQkJCQkJY29udHJvbCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yX3JldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKaW5kZXggMWZkOTAwOS4uYjg5MmYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwpAQCAtMTEwLDcgKzExMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbGlzM2wwMmRxX2dldF9idWZmZXJfZWxlbWVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCXU4ICpidWYpCisJCQkJCXU4ICpidWYpCiB7CiAJaW50IHJldCwgaTsKIAl1OCAqcnhfYXJyYXk7CkBAIC0xMTgsOCArMTE4LDggQEAKIAlpbnQgc2Nhbl9jb3VudCA9IGJpdG1hcF93ZWlnaHQoaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAogCQkJCSAgICAgICBpbmRpb19kZXYtPm1hc2tsZW5ndGgpOwogCi0JcnhfYXJyYXkgPSBremFsbG9jKDQgKiBzY2FuX2NvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAocnhfYXJyYXkgPT0gTlVMTCkKKwlyeF9hcnJheSA9IGtjYWxsb2MoNCwgc2Nhbl9jb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF9hcnJheSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0ID0gbGlzM2wwMmRxX3JlYWRfYWxsKGluZGlvX2RldiwgcnhfYXJyYXkpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xNDIsNyArMTQyLDcgQEAKIAljaGFyICpkYXRhOwogCiAJZGF0YSA9IGttYWxsb2MoaW5kaW9fZGV2LT5zY2FuX2J5dGVzLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQorCWlmICghZGF0YSkKIAkJZ290byBkb25lOwogCiAJaWYgKCFiaXRtYXBfZW1wdHkoaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLCBpbmRpb19kZXYtPm1hc2tsZW5ndGgpKQpAQCAtMzMwLDE5ICszMzAsMjEgQEAKIAlpZiAodGVzdF9iaXQoMCwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkgewogCQl0IHw9IExJUzNMMDJEUV9SRUdfQ1RSTF8xX0FYRVNfWF9FTkFCTEU7CiAJCW9uZWVuYWJsZWQgPSB0cnVlOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXQgJj0gfkxJUzNMMDJEUV9SRUdfQ1RSTF8xX0FYRVNfWF9FTkFCTEU7CisJfQogCWlmICh0ZXN0X2JpdCgxLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spKSB7CiAJCXQgfD0gTElTM0wwMkRRX1JFR19DVFJMXzFfQVhFU19ZX0VOQUJMRTsKIAkJb25lZW5hYmxlZCA9IHRydWU7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJdCAmPSB+TElTM0wwMkRRX1JFR19DVFJMXzFfQVhFU19ZX0VOQUJMRTsKKwl9CiAJaWYgKHRlc3RfYml0KDIsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpIHsKIAkJdCB8PSBMSVMzTDAyRFFfUkVHX0NUUkxfMV9BWEVTX1pfRU5BQkxFOwogCQlvbmVlbmFibGVkID0gdHJ1ZTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQl0ICY9IH5MSVMzTDAyRFFfUkVHX0NUUkxfMV9BWEVTX1pfRU5BQkxFOwotCisJfQogCWlmICghb25lZW5hYmxlZCkgLyogd2hhdCBoYXBwZW5zIGluIHRoaXMgY2FzZSBpcyB1bmtub3duICovCiAJCXJldHVybiAtRUlOVkFMOwogCXJldCA9IGxpczNsMDJkcV9zcGlfd3JpdGVfcmVnXzgoaW5kaW9fZGV2LApAQCAtNDEwLDcgKzQxMiw3IEBACiAJCQkJCQkgImxpczNsMDJkcV9jb25zdW1lciVkIiwKIAkJCQkJCSBpbmRpb19kZXYtPmlkKTsKIAotCWlmIChpbmRpb19kZXYtPnBvbGxmdW5jID09IE5VTEwpIHsKKwlpZiAoIWluZGlvX2Rldi0+cG9sbGZ1bmMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCmluZGV4IGIyODRlNWEuLjljOGE5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCkBAIC0zOCw2ICszOCw5IEBACiAgKiBDYW4gcHJvYmFibHkgYWxsZXZpYXRlIHRoaXMgYnkgcmVhZGluZyB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyIG9uIHN0YXJ0LCBidXQKICAqIHRoYXQgaXMgcmVhbGx5IGp1c3QgYnJ1c2hpbmcgdGhlIHByb2JsZW0gdW5kZXIgdGhlIGNhcnBldC4KICAqLworI2lmbmRlZiBfU0NBMzAwMAorI2RlZmluZSBfU0NBMzAwMAorCiAjZGVmaW5lIFNDQTMwMDBfV1JJVEVfUkVHKGEpICgoKGEpIDw8IDIpIHwgMHgwMikKICNkZWZpbmUgU0NBMzAwMF9SRUFEX1JFRyhhKSAoKGEpIDw8IDIpCiAKQEAgLTI3Miw0ICsyNzUsNCBAQAogfQogCiAjZW5kaWYKLQorI2VuZGlmIC8qIF9TQ0EzMDAwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwppbmRleCAzMWZiMjE4Li5iNjE0ZjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKQEAgLTg3MCw3ICs4NzAsNyBAQAogCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSAgICBjaGFyICpidWYpCiB7Ci0JaW50IHJldCwgbGVuOworCWludCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgdmFsOwpAQCAtODgxLDkgKzg4MSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJICAgICAgISEodmFsICYgU0NBMzAwMF9GUkVFX0ZBTExfREVURUNUKSk7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEodmFsICYgU0NBMzAwMF9GUkVFX0ZBTExfREVURUNUKSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMKaW5kZXggZjc2YTI2OC4uODU4OWVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfcmluZy5jCkBAIC0xMjksOSArMTI5LDkgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbnVtX3JlYWQ7CiB9CiAKLXN0YXRpYyBib29sIHNjYTMwMDBfcmluZ19idWZfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKnIpCitzdGF0aWMgc2l6ZV90IHNjYTMwMDBfcmluZ19idWZfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKnIpCiB7Ci0JcmV0dXJuIHItPnN0dWZmdG9yZWFkOworCXJldHVybiByLT5zdHVmZnRvcmVhZCA/IHItPndhdGVybWFyayA6IDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTkyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYwppbmRleCA2ZjhjZTZjLi5mZTU2ZmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYwpAQCAtNDEsMzIgKzQxLDMyIEBACiAJCQkJICAgKiAoUlcsIDE2LWJpdCAoQUQ3NzkyKS8yNC1iaXQgKEFENzE5MikpICovCiAKIC8qIENvbW11bmljYXRpb25zIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzE5Ml9SRUdfQ09NTSkgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTU1fV0VOCQkoMSA8PCA3KSAvKiBXcml0ZSBFbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTU1fV1JJVEUJKDAgPDwgNikgLyogV3JpdGUgT3BlcmF0aW9uICovCi0jZGVmaW5lIEFENzE5Ml9DT01NX1JFQUQJKDEgPDwgNikgLyogUmVhZCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTU1fV0VOCQlCSVQoNykgLyogV3JpdGUgRW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT01NX1dSSVRFCTAgLyogV3JpdGUgT3BlcmF0aW9uICovCisjZGVmaW5lIEFENzE5Ml9DT01NX1JFQUQJQklUKDYpIC8qIFJlYWQgT3BlcmF0aW9uICovCiAjZGVmaW5lIEFENzE5Ml9DT01NX0FERFIoeCkJKCgoeCkgJiAweDcpIDw8IDMpIC8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTU1fQ1JFQUQJKDEgPDwgMikgLyogQ29udGludW91cyBSZWFkIG9mIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTU1fQ1JFQUQJQklUKDIpIC8qIENvbnRpbnVvdXMgUmVhZCBvZiBEYXRhIFJlZ2lzdGVyICovCiAKIC8qIFN0YXR1cyBSZWdpc3RlciBCaXQgRGVzaWduYXRpb25zIChBRDcxOTJfUkVHX1NUQVQpICovCi0jZGVmaW5lIEFENzE5Ml9TVEFUX1JEWQkJKDEgPDwgNykgLyogUmVhZHkgKi8KLSNkZWZpbmUgQUQ3MTkyX1NUQVRfRVJSCQkoMSA8PCA2KSAvKiBFcnJvciAoT3ZlcnJhbmdlLCBVbmRlcnJhbmdlKSAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9OT1JFRgkoMSA8PCA1KSAvKiBFcnJvciBubyBleHRlcm5hbCByZWZlcmVuY2UgKi8KLSNkZWZpbmUgQUQ3MTkyX1NUQVRfUEFSSVRZCSgxIDw8IDQpIC8qIFBhcml0eSAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9DSDMJCSgxIDw8IDIpIC8qIENoYW5uZWwgMyAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9DSDIJCSgxIDw8IDEpIC8qIENoYW5uZWwgMiAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9DSDEJCSgxIDw8IDApIC8qIENoYW5uZWwgMSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9SRFkJCUJJVCg3KSAvKiBSZWFkeSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9FUlIJCUJJVCg2KSAvKiBFcnJvciAoT3ZlcnJhbmdlLCBVbmRlcnJhbmdlKSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9OT1JFRglCSVQoNSkgLyogRXJyb3Igbm8gZXh0ZXJuYWwgcmVmZXJlbmNlICovCisjZGVmaW5lIEFENzE5Ml9TVEFUX1BBUklUWQlCSVQoNCkgLyogUGFyaXR5ICovCisjZGVmaW5lIEFENzE5Ml9TVEFUX0NIMwkJQklUKDIpIC8qIENoYW5uZWwgMyAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9DSDIJCUJJVCgxKSAvKiBDaGFubmVsIDIgKi8KKyNkZWZpbmUgQUQ3MTkyX1NUQVRfQ0gxCQlCSVQoMCkgLyogQ2hhbm5lbCAxICovCiAKIC8qIE1vZGUgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTkyX1JFR19NT0RFKSAqLwogI2RlZmluZSBBRDcxOTJfTU9ERV9TRUwoeCkJKCgoeCkgJiAweDcpIDw8IDIxKSAvKiBPcGVyYXRpb24gTW9kZSBTZWxlY3QgKi8KICNkZWZpbmUgQUQ3MTkyX01PREVfU0VMX01BU0sJKDB4NyA8PCAyMSkgLyogT3BlcmF0aW9uIE1vZGUgU2VsZWN0IE1hc2sgKi8KLSNkZWZpbmUgQUQ3MTkyX01PREVfREFUX1NUQQkoMSA8PCAyMCkgLyogU3RhdHVzIFJlZ2lzdGVyIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBBRDcxOTJfTU9ERV9EQVRfU1RBCUJJVCgyMCkgLyogU3RhdHVzIFJlZ2lzdGVyIHRyYW5zbWlzc2lvbiAqLwogI2RlZmluZSBBRDcxOTJfTU9ERV9DTEtTUkMoeCkJKCgoeCkgJiAweDMpIDw8IDE4KSAvKiBDbG9jayBTb3VyY2UgU2VsZWN0ICovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX1NJTkMzCSgxIDw8IDE1KSAvKiBTSU5DMyBGaWx0ZXIgU2VsZWN0ICovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX0FDWAkJKDEgPDwgMTQpIC8qIEFDIGV4Y2l0YXRpb24gZW5hYmxlKEFENzE5NSBvbmx5KSovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX0VOUEFSCSgxIDw8IDEzKSAvKiBQYXJpdHkgRW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX0NMS0RJVgkoMSA8PCAxMikgLyogQ2xvY2sgZGl2aWRlIGJ5IDIgKEFENzE5MC8yIG9ubHkpKi8KLSNkZWZpbmUgQUQ3MTkyX01PREVfU0NZQ0xFCSgxIDw8IDExKSAvKiBTaW5nbGUgY3ljbGUgY29udmVyc2lvbiAqLwotI2RlZmluZSBBRDcxOTJfTU9ERV9SRUo2MAkoMSA8PCAxMCkgLyogNTAvNjBIeiBub3RjaCBmaWx0ZXIgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfU0lOQzMJQklUKDE1KSAvKiBTSU5DMyBGaWx0ZXIgU2VsZWN0ICovCisjZGVmaW5lIEFENzE5Ml9NT0RFX0FDWAkJQklUKDE0KSAvKiBBQyBleGNpdGF0aW9uIGVuYWJsZShBRDcxOTUgb25seSkqLworI2RlZmluZSBBRDcxOTJfTU9ERV9FTlBBUglCSVQoMTMpIC8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfQ0xLRElWCUJJVCgxMikgLyogQ2xvY2sgZGl2aWRlIGJ5IDIgKEFENzE5MC8yIG9ubHkpKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfU0NZQ0xFCUJJVCgxMSkgLyogU2luZ2xlIGN5Y2xlIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfUkVKNjAJQklUKDEwKSAvKiA1MC82MEh6IG5vdGNoIGZpbHRlciAqLwogI2RlZmluZSBBRDcxOTJfTU9ERV9SQVRFKHgpCSgoeCkgJiAweDNGRikgLyogRmlsdGVyIFVwZGF0ZSBSYXRlIFNlbGVjdCAqLwogCiAvKiBNb2RlIFJlZ2lzdGVyOiBBRDcxOTJfTU9ERV9TRUwgb3B0aW9ucyAqLwpAQCAtOTEsMTQgKzkxLDE0IEBACiAKIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTkyX1JFR19DT05GKSAqLwogCi0jZGVmaW5lIEFENzE5Ml9DT05GX0NIT1AJKDEgPDwgMjMpIC8qIENIT1AgZW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9DT05GX1JFRlNFTAkoMSA8PCAyMCkgLyogUkVGSU4xL1JFRklOMiBSZWZlcmVuY2UgU2VsZWN0ICovCisjZGVmaW5lIEFENzE5Ml9DT05GX0NIT1AJQklUKDIzKSAvKiBDSE9QIGVuYWJsZSAqLworI2RlZmluZSBBRDcxOTJfQ09ORl9SRUZTRUwJQklUKDIwKSAvKiBSRUZJTjEvUkVGSU4yIFJlZmVyZW5jZSBTZWxlY3QgKi8KICNkZWZpbmUgQUQ3MTkyX0NPTkZfQ0hBTih4KQkoKCgxIDw8ICh4KSkgJiAweEZGKSA8PCA4KSAvKiBDaGFubmVsIHNlbGVjdCAqLwogI2RlZmluZSBBRDcxOTJfQ09ORl9DSEFOX01BU0sJKDB4RkYgPDwgOCkgLyogQ2hhbm5lbCBzZWxlY3QgbWFzayAqLwotI2RlZmluZSBBRDcxOTJfQ09ORl9CVVJOCSgxIDw8IDcpIC8qIEJ1cm5vdXQgY3VycmVudCBlbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTkZfUkVGREVUCSgxIDw8IDYpIC8qIFJlZmVyZW5jZSBkZXRlY3QgZW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9DT05GX0JVRgkJKDEgPDwgNCkgLyogQnVmZmVyZWQgTW9kZSBFbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTkZfVU5JUE9MQVIJKDEgPDwgMykgLyogVW5pcG9sYXIvQmlwb2xhciBFbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTkZfQlVSTglCSVQoNykgLyogQnVybm91dCBjdXJyZW50IGVuYWJsZSAqLworI2RlZmluZSBBRDcxOTJfQ09ORl9SRUZERVQJQklUKDYpIC8qIFJlZmVyZW5jZSBkZXRlY3QgZW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT05GX0JVRgkJQklUKDQpIC8qIEJ1ZmZlcmVkIE1vZGUgRW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT05GX1VOSVBPTEFSCUJJVCgzKSAvKiBVbmlwb2xhci9CaXBvbGFyIEVuYWJsZSAqLwogI2RlZmluZSBBRDcxOTJfQ09ORl9HQUlOKHgpCSgoeCkgJiAweDcpIC8qIEdhaW4gU2VsZWN0ICovCiAKICNkZWZpbmUgQUQ3MTkyX0NIX0FJTjFQX0FJTjJNCTAgLyogQUlOMSgrKSAtIEFJTjIoLSkgKi8KQEAgLTExNywxMyArMTE3LDEzIEBACiAjZGVmaW5lIEFENzE5Ml9JRF9NQVNLCQkweDBGCiAKIC8qIEdQT0NPTiBSZWdpc3RlciBCaXQgRGVzaWduYXRpb25zIChBRDcxOTJfUkVHX0dQT0NPTikgKi8KLSNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9CUERTVwkoMSA8PCA2KSAvKiBCcmlkZ2UgcG93ZXItZG93biBzd2l0Y2ggZW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9HUE9DT05fR1AzMkVOCSgxIDw8IDUpIC8qIERpZ2l0YWwgT3V0cHV0IFAzIGFuZCBQMiBlbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9HUDEwRU4JKDEgPDwgNCkgLyogRGlnaXRhbCBPdXRwdXQgUDEgYW5kIFAwIGVuYWJsZSAqLwotI2RlZmluZSBBRDcxOTJfR1BPQ09OX1AzREFUCSgxIDw8IDMpIC8qIFAzIHN0YXRlICovCi0jZGVmaW5lIEFENzE5Ml9HUE9DT05fUDJEQVQJKDEgPDwgMikgLyogUDIgc3RhdGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMURBVAkoMSA8PCAxKSAvKiBQMSBzdGF0ZSAqLwotI2RlZmluZSBBRDcxOTJfR1BPQ09OX1AwREFUCSgxIDw8IDApIC8qIFAwIHN0YXRlICovCisjZGVmaW5lIEFENzE5Ml9HUE9DT05fQlBEU1cJQklUKDYpIC8qIEJyaWRnZSBwb3dlci1kb3duIHN3aXRjaCBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9HUDMyRU4JQklUKDUpIC8qIERpZ2l0YWwgT3V0cHV0IFAzIGFuZCBQMiBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9HUDEwRU4JQklUKDQpIC8qIERpZ2l0YWwgT3V0cHV0IFAxIGFuZCBQMCBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QM0RBVAlCSVQoMykgLyogUDMgc3RhdGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMkRBVAlCSVQoMikgLyogUDIgc3RhdGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMURBVAlCSVQoMSkgLyogUDEgc3RhdGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMERBVAlCSVQoMCkgLyogUDAgc3RhdGUgKi8KIAogI2RlZmluZSBBRDcxOTJfSU5UX0ZSRVFfTUh6CTQ5MTUyMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jCmluZGV4IDRkNDg3MDcuLmQ5OGUyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyODBhLmMKQEAgLTU1LDM3ICs1NSwzNyBAQAogI2RlZmluZSBBRDcyODBBX0NOVlNUX0NPTlRST0wJCTB4MUQgLyogRDcgdG8gRDAsIFJlYWQvd3JpdGUgKi8KIAogLyogQml0cyBhbmQgTWFza3MgKi8KLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfSU5QVVRfQUxMCQkJKDAgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfSU5QVVRfNkNFTExfQVVYMV8zXzQJKDEgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfSU5QVVRfNkNFTEwJCSgyIDw8IDYpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUX1NFTEZfVEVTVAkJKDMgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfQUxMCQkoMCA8PCA0KQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9SRVNfUkVBRF82Q0VMTF9BVVgxXzNfNAkoMSA8PCA0KQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9SRVNfUkVBRF82Q0VMTAkJKDIgPDwgNCkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfTk8JCSgzIDw8IDQpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1NUQVJUX0NOVlNUCQkoMCA8PCAzKQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9TVEFSVF9DUwkJCSgxIDw8IDMpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0FWR19ESVMJCQkoMCA8PCAxKQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfMgkJCSgxIDw8IDEpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0FWR180CQkJKDIgPDwgMSkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfQVZHXzgJCQkoMyA8PCAxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF9BTEwJCQkwCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUXzZDRUxMX0FVWDFfM180CUJJVCg2KQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF82Q0VMTAkJQklUKDcpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUX1NFTEZfVEVTVAkJKEJJVCg3KSB8IEJJVCg2KSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfQUxMCQkwCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1JFU19SRUFEXzZDRUxMX0FVWDFfM180CUJJVCg0KQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9SRVNfUkVBRF82Q0VMTAkJQklUKDUpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1JFU19SRUFEX05PCQkoQklUKDUpIHwgQklUKDQpKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9TVEFSVF9DTlZTVAkJMAorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9TVEFSVF9DUwkJCUJJVCgzKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfRElTCQkJMAorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfMgkJCUJJVCgxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfNAkJCUJJVCgyKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfOAkJCShCSVQoMikgfCBCSVQoMSkpCiAjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0FWRyh4KQkJCSgoeCkgPDwgMSkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX1BXUkROX1NXCQkJKDEgPDwgMCkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX1BXUkROX1NXCQkJQklUKDApCiAKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX1NXUlNUCQkJCSgxIDw8IDcpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV80MDBucwkJCSgwIDw8IDUpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV84MDBucwkJCSgxIDw8IDUpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV8xMjAwbnMJCQkoMiA8PCA1KQotI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfMTYwMG5zCQkJKDMgPDwgNSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX1NXUlNUCQkJCUJJVCg3KQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfNDAwbnMJCQkwCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV84MDBucwkJCUJJVCg1KQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfMTIwMG5zCQkJQklUKDYpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV8xNjAwbnMJCQkoQklUKDYpIHwgQklUKDUpKQogI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUUoeCkJCQkoKHgpIDw8IDUpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9NVVNUX1NFVAkJCSgxIDw8IDQpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9USEVSTUlTVE9SX0VOCQkJKDEgPDwgMykKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0xPQ0tfREVWX0FERFIJCQkoMSA8PCAyKQotI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfSU5DX0RFVl9BRERSCQkJKDEgPDwgMSkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0RBSVNZX0NIQUlOX1JCX0VOCQkoMSA8PCAwKQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfTVVTVF9TRVQJCQlCSVQoNCkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX1RIRVJNSVNUT1JfRU4JCQlCSVQoMykKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0xPQ0tfREVWX0FERFIJCQlCSVQoMikKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0lOQ19ERVZfQUREUgkJCUJJVCgxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfREFJU1lfQ0hBSU5fUkJfRU4JCUJJVCgwKQogCi0jZGVmaW5lIEFENzI4MEFfQUxFUlRfR0VOX1NUQVRJQ19ISUdICQkJKDEgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRUxBWV9TSUdfQ0hBSU5fRE9XTgkJKDMgPDwgNikKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9HRU5fU1RBVElDX0hJR0gJCQlCSVQoNikKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRUxBWV9TSUdfQ0hBSU5fRE9XTgkJKEJJVCg3KSB8IEJJVCg2KSkKIAogI2RlZmluZSBBRDcyODBBX0FMTF9DRUxMUwkJCQkoMHhBRCA8PCAxNikKIApAQCAtNTQ3LDggKzU0Nyw5IEBACiB7CiAJaW50IGRldiwgY2gsIGNudDsKIAotCXN0LT5paW9fYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+aWlvX2F0dHIpICogKHN0LT5zbGF2ZV9udW0gKyAxKSAqCi0JCQkJQUQ3MjgwQV9DRUxMU19QRVJfREVWICogMiwgR0ZQX0tFUk5FTCk7CisJc3QtPmlpb19hdHRyID0ga2NhbGxvYygyLCBzaXplb2YoKnN0LT5paW9fYXR0cikgKgorCQkJICAgICAgIChzdC0+c2xhdmVfbnVtICsgMSkgKiBBRDcyODBBX0NFTExTX1BFUl9ERVYsCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0LT5paW9fYXR0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5oCmluZGV4IDIwNDAwYjAuLjczMjM0N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyODBhLmgKQEAgLTIzLDEwICsyMywxMCBAQAogI2RlZmluZSBBRDcyODBBX0NPTlZfQVZHXzQJCQkyCiAjZGVmaW5lIEFENzI4MEFfQ09OVl9BVkdfOAkJCTMKIAotI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9WSU41CQkoMSA8PCAyKQotI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9WSU40X1ZJTjUJCSgyIDw8IDIpCi0jZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX0FVWDUJCSgxIDw8IDApCi0jZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX0FVWDRfQVVYNQkJKDIgPDwgMCkKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRU1PVkVfVklONQkJQklUKDIpCisjZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX1ZJTjRfVklONQkJQklUKDMpCisjZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX0FVWDUJCUJJVCgwKQorI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9BVVg0X0FVWDUJCUJJVCgxKQogCiBzdHJ1Y3QgYWQ3MjgwX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGFjcXVpc2l0aW9uX3RpbWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NjA2X3JpbmcuYwppbmRleCAzYmYxNzRjLi5hNmY4ZWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNl9yaW5nLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlpbnQgcmV0OwogCiAJYnVmID0ga3phbGxvYyhpbmRpb19kZXYtPnNjYW5fYnl0ZXMsIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkKKwlpZiAoIWJ1ZikKIAkJcmV0dXJuOwogCiAJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX2Zyc3RkYXRhKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYwppbmRleCAyNzNhZGQzLi45ZjAzZmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYwpAQCAtMjQsMTQgKzI0LDE0IEBACiAKICNpbmNsdWRlICJhZDc3ODAuaCIKIAotI2RlZmluZSBBRDc3ODBfUkRZCSgxIDw8IDcpCi0jZGVmaW5lIEFENzc4MF9GSUxURVIJKDEgPDwgNikKLSNkZWZpbmUgQUQ3NzgwX0VSUgkoMSA8PCA1KQotI2RlZmluZSBBRDc3ODBfSUQxCSgxIDw8IDQpCi0jZGVmaW5lIEFENzc4MF9JRDAJKDEgPDwgMykKLSNkZWZpbmUgQUQ3NzgwX0dBSU4JKDEgPDwgMikKLSNkZWZpbmUgQUQ3NzgwX1BBVDEJKDEgPDwgMSkKLSNkZWZpbmUgQUQ3NzgwX1BBVDAJKDEgPDwgMCkKKyNkZWZpbmUgQUQ3NzgwX1JEWQlCSVQoNykKKyNkZWZpbmUgQUQ3NzgwX0ZJTFRFUglCSVQoNikKKyNkZWZpbmUgQUQ3NzgwX0VSUglCSVQoNSkKKyNkZWZpbmUgQUQ3NzgwX0lEMQlCSVQoNCkKKyNkZWZpbmUgQUQ3NzgwX0lEMAlCSVQoMykKKyNkZWZpbmUgQUQ3NzgwX0dBSU4JQklUKDIpCisjZGVmaW5lIEFENzc4MF9QQVQxCUJJVCgxKQorI2RlZmluZSBBRDc3ODBfUEFUMAlCSVQoMCkKIAogc3RydWN0IGFkNzc4MF9jaGlwX2luZm8gewogCXN0cnVjdCBpaW9fY2hhbl9zcGVjCWNoYW5uZWw7CkBAIC0xNjksNyArMTY5LDcgQEAKIAlpbnQgcmV0LCB2b2x0YWdlX3V2ID0gMDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmc3BpLT5kZXYsIHNpemVvZigqc3QpKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYwppbmRleCA4MTYxNzQzLi5kN2M1MjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJICogYmUgc2FtcGxlZCBhcyByZWd1bGFyIExSQURDIGNoYW5uZWxzLiBUaGUgZHJpdmVyIHdpbGwgcmVmdXNlIGFueQogCSAqIGF0dGVtcHQgdG8gc2FtcGxlIHRoZXNlIGNoYW5uZWxzLgogCSAqLwotI2RlZmluZSBDSEFOX01BU0tfVE9VQ0hCVVRUT04JCSgweDMgPDwgMCkKKyNkZWZpbmUgQ0hBTl9NQVNLX1RPVUNIQlVUVE9OCQkoQklUKDEpIHwgQklUKDApKQogI2RlZmluZSBDSEFOX01BU0tfVE9VQ0hTQ1JFRU5fNFdJUkUJKDB4ZiA8PCAyKQogI2RlZmluZSBDSEFOX01BU0tfVE9VQ0hTQ1JFRU5fNVdJUkUJKDB4MWYgPDwgMikKIAllbnVtIG14c19scmFkY190cwl1c2VfdG91Y2hzY3JlZW47CkBAIC0yNjgsMjAgKzI2OCwyMCBAQAogfTsKIAogI2RlZmluZQlMUkFEQ19DVFJMMAkJCQkweDAwCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1RPVUNIX0RFVEVDVF9FTkFCTEUJKDEgPDwgMjMpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1RPVUNIX1NDUkVFTl9UWVBFCSgxIDw8IDIyKQotIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9ZTk5TVwkvKiBZTSAqLwkoMSA8PCAyMSkKLSMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWVBOU1cJLyogWVAgKi8JKDEgPDwgMjApCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1lQUFNXCS8qIFlQICovCSgxIDw8IDE5KQotIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9YTk5TVwkvKiBYTSAqLwkoMSA8PCAxOCkKLSMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWE5QU1cJLyogWE0gKi8JKDEgPDwgMTcpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1hQUFNXCS8qIFhQICovCSgxIDw8IDE2KQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9UT1VDSF9ERVRFQ1RfRU5BQkxFCUJJVCgyMykKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfVE9VQ0hfU0NSRUVOX1RZUEUJQklUKDIyKQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9ZTk5TVwkvKiBZTSAqLwlCSVQoMjEpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1lQTlNXCS8qIFlQICovCUJJVCgyMCkKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWVBQU1cJLyogWVAgKi8JQklUKDE5KQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9YTk5TVwkvKiBYTSAqLwlCSVQoMTgpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1hOUFNXCS8qIFhNICovCUJJVCgxNykKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWFBQU1cJLyogWFAgKi8JQklUKDE2KQogCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1RPVUNIX0RFVEVDVF9FTkFCTEUJKDEgPDwgMjApCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1lNCQkJKDEgPDwgMTkpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1hNCQkJKDEgPDwgMTgpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1lQCQkJKDEgPDwgMTcpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1hQCQkJKDEgPDwgMTYpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1RPVUNIX0RFVEVDVF9FTkFCTEUJQklUKDIwKQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyM19ZTQkJCUJJVCgxOSkKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjNfWE0JCQlCSVQoMTgpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1lQCQkJQklUKDE3KQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyM19YUAkJCUJJVCgxNikKIAogIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9QTEFURV9NQVNLIFwKIAkJKExSQURDX0NUUkwwX01YMjhfVE9VQ0hfREVURUNUX0VOQUJMRSB8IFwKQEAgLTI5NSwxMiArMjk1LDEyIEBACiAJCUxSQURDX0NUUkwwX01YMjNfWVAgfCBMUkFEQ19DVFJMMF9NWDIzX1hQKQogCiAjZGVmaW5lCUxSQURDX0NUUkwxCQkJCTB4MTAKLSNkZWZpbmUJTFJBRENfQ1RSTDFfVE9VQ0hfREVURUNUX0lSUV9FTgkJKDEgPDwgMjQpCisjZGVmaW5lCUxSQURDX0NUUkwxX1RPVUNIX0RFVEVDVF9JUlFfRU4JCUJJVCgyNCkKICNkZWZpbmUJTFJBRENfQ1RSTDFfTFJBRENfSVJRX0VOKG4pCQkoMSA8PCAoKG4pICsgMTYpKQogI2RlZmluZQlMUkFEQ19DVFJMMV9NWDI4X0xSQURDX0lSUV9FTl9NQVNLCSgweDFmZmYgPDwgMTYpCiAjZGVmaW5lCUxSQURDX0NUUkwxX01YMjNfTFJBRENfSVJRX0VOX01BU0sJKDB4MDFmZiA8PCAxNikKICNkZWZpbmUJTFJBRENfQ1RSTDFfTFJBRENfSVJRX0VOX09GRlNFVAkJMTYKLSNkZWZpbmUJTFJBRENfQ1RSTDFfVE9VQ0hfREVURUNUX0lSUQkJKDEgPDwgOCkKKyNkZWZpbmUJTFJBRENfQ1RSTDFfVE9VQ0hfREVURUNUX0lSUQkJQklUKDgpCiAjZGVmaW5lCUxSQURDX0NUUkwxX0xSQURDX0lSUShuKQkJKDEgPDwgKG4pKQogI2RlZmluZQlMUkFEQ19DVFJMMV9NWDI4X0xSQURDX0lSUV9NQVNLCQkweDFmZmYKICNkZWZpbmUJTFJBRENfQ1RSTDFfTVgyM19MUkFEQ19JUlFfTUFTSwkJMHgwMWZmCkBAIC0zMDgsMTMgKzMwOCwxMyBAQAogCiAjZGVmaW5lCUxSQURDX0NUUkwyCQkJCTB4MjAKICNkZWZpbmUJTFJBRENfQ1RSTDJfRElWSURFX0JZX1RXT19PRkZTRVQJMjQKLSNkZWZpbmUJTFJBRENfQ1RSTDJfVEVNUFNFTlNFX1BXRAkJKDEgPDwgMTUpCisjZGVmaW5lCUxSQURDX0NUUkwyX1RFTVBTRU5TRV9QV0QJCUJJVCgxNSkKIAogI2RlZmluZQlMUkFEQ19TVEFUVVMJCQkJMHg0MAotI2RlZmluZQlMUkFEQ19TVEFUVVNfVE9VQ0hfREVURUNUX1JBVwkJKDEgPDwgMCkKKyNkZWZpbmUJTFJBRENfU1RBVFVTX1RPVUNIX0RFVEVDVF9SQVcJCUJJVCgwKQogCiAjZGVmaW5lCUxSQURDX0NIKG4pCQkJCSgweDUwICsgKDB4MTAgKiAobikpKQotI2RlZmluZQlMUkFEQ19DSF9BQ0NVTVVMQVRFCQkJKDEgPDwgMjkpCisjZGVmaW5lCUxSQURDX0NIX0FDQ1VNVUxBVEUJCQlCSVQoMjkpCiAjZGVmaW5lCUxSQURDX0NIX05VTV9TQU1QTEVTX01BU0sJCSgweDFmIDw8IDI0KQogI2RlZmluZQlMUkFEQ19DSF9OVU1fU0FNUExFU19PRkZTRVQJCTI0CiAjZGVmaW5lCUxSQURDX0NIX05VTV9TQU1QTEVTKHgpIFwKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCSAqLwogCW14c19scmFkY19yZWdfd3J0KGxyYWRjLAogCQlMUkFEQ19ERUxBWV9UUklHR0VSKDApIHwgLyogZG9uJ3QgdHJpZ2dlciBBREMgKi8KLQkJTFJBRENfREVMQVlfVFJJR0dFUl9ERUxBWVMoMSA8PCAzKSB8IC8qIHRyaWdnZXIgREVMQVkgdW5pdCMzICovCisJCUxSQURDX0RFTEFZX1RSSUdHRVJfREVMQVlTKEJJVCgzKSkgfCAvKiB0cmlnZ2VyIERFTEFZIHVuaXQjMyAqLwogCQlMUkFEQ19ERUxBWV9LSUNLIHwKIAkJTFJBRENfREVMQVlfREVMQVkobHJhZGMtPnNldHRsaW5nX2RlbGF5KSwKIAkJCUxSQURDX0RFTEFZKDIpKTsKQEAgLTUzMiw3ICs1MzIsNyBAQAogCSAqLwogCW14c19scmFkY19yZWdfd3J0KGxyYWRjLAogCQlMUkFEQ19ERUxBWV9UUklHR0VSKDApIHwgLyogZG9uJ3QgdHJpZ2dlciBBREMgKi8KLQkJTFJBRENfREVMQVlfVFJJR0dFUl9ERUxBWVMoMSA8PCAzKSB8IC8qIHRyaWdnZXIgREVMQVkgdW5pdCMzICovCisJCUxSQURDX0RFTEFZX1RSSUdHRVJfREVMQVlTKEJJVCgzKSkgfCAvKiB0cmlnZ2VyIERFTEFZIHVuaXQjMyAqLwogCQlMUkFEQ19ERUxBWV9LSUNLIHwKIAkJTFJBRENfREVMQVlfREVMQVkobHJhZGMtPnNldHRsaW5nX2RlbGF5KSwgTFJBRENfREVMQVkoMikpOwogfQpAQCAtODUwLDcgKzg1MCw3IEBACiAKIAkvKiBFbmFibGUgdGhlIElSUSBhbmQgc3RhcnQgc2FtcGxpbmcgdGhlIGNoYW5uZWwuICovCiAJbXhzX2xyYWRjX3JlZ19zZXQobHJhZGMsIExSQURDX0NUUkwxX0xSQURDX0lSUV9FTigwKSwgTFJBRENfQ1RSTDEpOwotCW14c19scmFkY19yZWdfc2V0KGxyYWRjLCAxIDw8IDAsIExSQURDX0NUUkwwKTsKKwlteHNfbHJhZGNfcmVnX3NldChscmFkYywgQklUKDApLCBMUkFEQ19DVFJMMCk7CiAKIAkvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9uIHRoZSBjaGFubmVsLCAxIHNlY29uZCBtYXguICovCiAJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZV90aW1lb3V0KCZscmFkYy0+Y29tcGxldGlvbiwgSFopOwpAQCAtOTkzLDcgKzk5Myw3IEBACiAJaW50IGksIGxlbiA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShscmFkYy0+c2NhbGVfYXZhaWxbY2hdKTsgaSsrKQotCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlZC4lMDl1ICIsCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiV1LiUwOXUgIiwKIAkJCSAgICAgICBscmFkYy0+c2NhbGVfYXZhaWxbY2hdW2ldLmludGVnZXIsCiAJCQkgICAgICAgbHJhZGMtPnNjYWxlX2F2YWlsW2NoXVtpXS5uYW5vKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvc3BlYXJfYWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9zcGVhcl9hZGMuYwppbmRleCA4YWQ3MTY5Li5jNTM4MjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9zcGVhcl9hZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9zcGVhcl9hZGMuYwpAQCAtMjksMTEgKzI5LDExIEBACiAjZGVmaW5lIFNQRUFSX0FEQ19DTEtfSElHSCh4KQkJKCgoeCkgJiAweGYpIDw8IDQpCiAKIC8qIEJpdCBkZWZpbml0aW9ucyBmb3IgU1BFQVJfQURDX1NUQVRVUyAqLwotI2RlZmluZSBTUEVBUl9BRENfU1RBVFVTX1NUQVJUX0NPTlZFUlNJT04JKDEgPDwgMCkKKyNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19TVEFSVF9DT05WRVJTSU9OCUJJVCgwKQogI2RlZmluZSBTUEVBUl9BRENfU1RBVFVTX0NIQU5ORUxfTlVNKHgpCQkoKHgpIDw8IDEpCi0jZGVmaW5lIFNQRUFSX0FEQ19TVEFUVVNfQURDX0VOQUJMRQkJKDEgPDwgNCkKKyNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19BRENfRU5BQkxFCQlCSVQoNCkKICNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19BVkdfU0FNUExFKHgpCQkoKHgpIDw8IDUpCi0jZGVmaW5lIFNQRUFSX0FEQ19TVEFUVVNfVlJFRl9JTlRFUk5BTAkJKDEgPDwgOSkKKyNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19WUkVGX0lOVEVSTkFMCQlCSVQoOSkKIAogI2RlZmluZSBTUEVBUl9BRENfREFUQV9NQVNLCQkweDAzZmYKICNkZWZpbmUgU1BFQVJfQURDX0RBVEFfQklUUwkJMTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODMyLmMKaW5kZXggY2Y2ODE1OS4uYTg2MWZlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODMyLmMKQEAgLTI0LDggKzI0LDggQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYWQ5ODMyX2NhbGNfZnJlcXJlZyh1bnNpZ25lZCBsb25nIG1jbGssIHVuc2lnbmVkIGxvbmcgZm91dCkKIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpIGZvdXQgKgotCQkJCSAgICAgKHU2NCkgKCh1NjQpIDFMIDw8IEFEOTgzMl9GUkVRX0JJVFMpOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmcmVxcmVnID0gKHU2NClmb3V0ICoKKwkJCQkgICAgICh1NjQpKCh1NjQpMUwgPDwgQUQ5ODMyX0ZSRVFfQklUUyk7CiAJZG9fZGl2KGZyZXFyZWcsIG1jbGspOwogCXJldHVybiBmcmVxcmVnOwogfQpAQCAtNTksNyArNTksNyBAQAogc3RhdGljIGludCBhZDk4MzJfd3JpdGVfcGhhc2Uoc3RydWN0IGFkOTgzMl9zdGF0ZSAqc3QsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGhhc2UpCiB7Ci0JaWYgKHBoYXNlID4gKDEgPDwgQUQ5ODMyX1BIQVNFX0JJVFMpKQorCWlmIChwaGFzZSA+IEJJVChBRDk4MzJfUEhBU0VfQklUUykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3QtPnBoYXNlX2RhdGFbMF0gPSBjcHVfdG9fYmUxNigoQUQ5ODMyX0NNRF9QSEE4QklUU1cgPDwgQ01EX1NISUZUKSB8CkBAIC04Niw3ICs4Niw3IEBACiAJCWdvdG8gZXJyb3JfcmV0OwogCiAJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0Jc3dpdGNoICgodTMyKSB0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwlzd2l0Y2ggKCh1MzIpdGhpc19hdHRyLT5hZGRyZXNzKSB7CiAJY2FzZSBBRDk4MzJfRlJFUTBITToKIAljYXNlIEFEOTgzMl9GUkVRMUhNOgogCQlyZXQgPSBhZDk4MzJfd3JpdGVfZnJlcXVlbmN5KHN0LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAl9CiAKIAlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnNwaS0+ZGV2LCBzaXplb2YoKnN0KSk7Ci0JaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzIuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5oCmluZGV4IDM4NmY0ZGMuLmQzMjMyM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5oCkBAIC00MiwxMyArNDIsMTMgQEAKICNkZWZpbmUgQUQ5ODMyX0NNRF9TWU5DU0VMU1JDCTB4OAogI2RlZmluZSBBRDk4MzJfQ01EX1NMRUVQUkVTQ0xSCTB4QwogCi0jZGVmaW5lIEFEOTgzMl9GUkVRCQkoMSA8PCAxMSkKKyNkZWZpbmUgQUQ5ODMyX0ZSRVEJCUJJVCgxMSkKICNkZWZpbmUgQUQ5ODMyX1BIQVNFKHgpCQkoKCh4KSAmIDMpIDw8IDkpCi0jZGVmaW5lIEFEOTgzMl9TWU5DCQkoMSA8PCAxMykKLSNkZWZpbmUgQUQ5ODMyX1NFTFNSQwkJKDEgPDwgMTIpCi0jZGVmaW5lIEFEOTgzMl9TTEVFUAkJKDEgPDwgMTMpCi0jZGVmaW5lIEFEOTgzMl9SRVNFVAkJKDEgPDwgMTIpCi0jZGVmaW5lIEFEOTgzMl9DTFIJCSgxIDw8IDExKQorI2RlZmluZSBBRDk4MzJfU1lOQwkJQklUKDEzKQorI2RlZmluZSBBRDk4MzJfU0VMU1JDCQlCSVQoMTIpCisjZGVmaW5lIEFEOTgzMl9TTEVFUAkJQklUKDEzKQorI2RlZmluZSBBRDk4MzJfUkVTRVQJCUJJVCgxMikKKyNkZWZpbmUgQUQ5ODMyX0NMUgkJQklUKDExKQogI2RlZmluZSBDTURfU0hJRlQJCTEyCiAjZGVmaW5lIEFERF9TSElGVAkJOAogI2RlZmluZSBBRDk4MzJfRlJFUV9CSVRTCTMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzNC5jCmluZGV4IDVjODAzMTkuLmQwMmJiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzNC5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWQ5ODM0X2NhbGNfZnJlcXJlZyh1bnNpZ25lZCBsb25nIG1jbGssIHVuc2lnbmVkIGxvbmcgZm91dCkKIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpIGZvdXQgKiAodTY0KSAoMSA8PCBBRDk4MzRfRlJFUV9CSVRTKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpZm91dCAqICh1NjQpQklUKEFEOTgzNF9GUkVRX0JJVFMpOwogCiAJZG9fZGl2KGZyZXFyZWcsIG1jbGspOwogCXJldHVybiBmcmVxcmVnOwpAQCAtNTMsOSArNTMsOSBAQAogfQogCiBzdGF0aWMgaW50IGFkOTgzNF93cml0ZV9waGFzZShzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaGFzZSkKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaGFzZSkKIHsKLQlpZiAocGhhc2UgPiAoMSA8PCBBRDk4MzRfUEhBU0VfQklUUykpCisJaWYgKHBoYXNlID4gQklUKEFEOTgzNF9QSEFTRV9CSVRTKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihhZGRyIHwgcGhhc2UpOwogCkBAIC02Myw5ICs2Myw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkOTgzNF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtNzgsNyArNzgsNyBAQAogCQlnb3RvIGVycm9yX3JldDsKIAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCXN3aXRjaCAoKHUzMikgdGhpc19hdHRyLT5hZGRyZXNzKSB7CisJc3dpdGNoICgodTMyKXRoaXNfYXR0ci0+YWRkcmVzcykgewogCWNhc2UgQUQ5ODM0X1JFR19GUkVRMDoKIAljYXNlIEFEOTgzNF9SRUdfRlJFUTE6CiAJCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKQEAgLTExMSw5ICsxMTEsOSBAQAogCQlicmVhazsKIAljYXNlIEFEOTgzNF9GU0VMOgogCWNhc2UgQUQ5ODM0X1BTRUw6Ci0JCWlmICh2YWwgPT0gMCkKKwkJaWYgKHZhbCA9PSAwKSB7CiAJCQlzdC0+Y29udHJvbCAmPSB+KHRoaXNfYXR0ci0+YWRkcmVzcyB8IEFEOTgzNF9QSU5fU1cpOwotCQllbHNlIGlmICh2YWwgPT0gMSkgeworCQl9IGVsc2UgaWYgKHZhbCA9PSAxKSB7CiAJCQlzdC0+Y29udHJvbCB8PSB0aGlzX2F0dHItPmFkZHJlc3M7CiAJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X1BJTl9TVzsKIAkJfSBlbHNlIHsKQEAgLTE0Miw5ICsxNDIsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZDk4MzRfc3RvcmVfd2F2ZXR5cGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29uc3QgY2hhciAqYnVmLAotCQkJCSBzaXplX3QgbGVuKQorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTE1NCw3ICsxNTQsNyBAQAogCiAJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKLQlzd2l0Y2ggKCh1MzIpIHRoaXNfYXR0ci0+YWRkcmVzcykgeworCXN3aXRjaCAoKHUzMil0aGlzX2F0dHItPmFkZHJlc3MpIHsKIAljYXNlIDA6CiAJCWlmIChzeXNmc19zdHJlcShidWYsICJzaW5lIikpIHsKIAkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfTU9ERTsKQEAgLTE3OSw3ICsxNzksNyBAQAogCQlicmVhazsKIAljYXNlIDE6CiAJCWlmIChzeXNmc19zdHJlcShidWYsICJzcXVhcmUiKSAmJgotCQkJIShzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKSkgeworCQkgICAgIShzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKSkgewogCQkJc3QtPmNvbnRyb2wgJj0gfkFEOTgzNF9NT0RFOwogCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X09QQklURU47CiAJCX0gZWxzZSB7CkBAIC0yMDAsOSArMjAwLDEwIEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKIH0KIAotc3RhdGljIHNzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MF93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCQljaGFyICpidWYpCitzdGF0aWMKK3NzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MF93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMjE4LDEzICsyMTksMTMgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3RyKTsKIH0KIAotCiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG91dF9hbHR2b2x0YWdlMF9vdXQwX3dhdmV0eXBlX2F2YWlsYWJsZSwgU19JUlVHTywKIAkJICAgICAgIGFkOTgzNF9zaG93X291dDBfd2F2ZXR5cGVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKIAotc3RhdGljIHNzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MV93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCQljaGFyICpidWYpCitzdGF0aWMKK3NzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MV93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMzM2LDcgKzMzNyw3IEBACiAJfQogCiAJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpzdCkpOwotCWlmIChpbmRpb19kZXYgPT0gTlVMTCkgeworCWlmICghaW5kaW9fZGV2KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODM0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuaAppbmRleCA4Y2E2ZTUyLi40MGZkZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuaApAQCAtMTAsMzEgKzEwLDMxIEBACiAKIC8qIFJlZ2lzdGVycyAqLwogCi0jZGVmaW5lIEFEOTgzNF9SRUdfQ01ECQkoMCA8PCAxNCkKLSNkZWZpbmUgQUQ5ODM0X1JFR19GUkVRMAkoMSA8PCAxNCkKLSNkZWZpbmUgQUQ5ODM0X1JFR19GUkVRMQkoMiA8PCAxNCkKLSNkZWZpbmUgQUQ5ODM0X1JFR19QSEFTRTAJKDYgPDwgMTMpCi0jZGVmaW5lIEFEOTgzNF9SRUdfUEhBU0UxCSg3IDw8IDEzKQorI2RlZmluZSBBRDk4MzRfUkVHX0NNRAkJMAorI2RlZmluZSBBRDk4MzRfUkVHX0ZSRVEwCUJJVCgxNCkKKyNkZWZpbmUgQUQ5ODM0X1JFR19GUkVRMQlCSVQoMTUpCisjZGVmaW5lIEFEOTgzNF9SRUdfUEhBU0UwCShCSVQoMTUpIHwgQklUKDE0KSkKKyNkZWZpbmUgQUQ5ODM0X1JFR19QSEFTRTEJKEJJVCgxNSkgfCBCSVQoMTQpIHwgQklUKDEzKSkKIAogLyogQ29tbWFuZCBDb250cm9sIEJpdHMgKi8KIAotI2RlZmluZSBBRDk4MzRfQjI4CQkoMSA8PCAxMykKLSNkZWZpbmUgQUQ5ODM0X0hMQgkJKDEgPDwgMTIpCi0jZGVmaW5lIEFEOTgzNF9GU0VMCQkoMSA8PCAxMSkKLSNkZWZpbmUgQUQ5ODM0X1BTRUwJCSgxIDw8IDEwKQotI2RlZmluZSBBRDk4MzRfUElOX1NXCQkoMSA8PCA5KQotI2RlZmluZSBBRDk4MzRfUkVTRVQJCSgxIDw8IDgpCi0jZGVmaW5lIEFEOTgzNF9TTEVFUDEJCSgxIDw8IDcpCi0jZGVmaW5lIEFEOTgzNF9TTEVFUDEyCQkoMSA8PCA2KQotI2RlZmluZSBBRDk4MzRfT1BCSVRFTgkJKDEgPDwgNSkKLSNkZWZpbmUgQUQ5ODM0X1NJR05fUElCCQkoMSA8PCA0KQotI2RlZmluZSBBRDk4MzRfRElWMgkJKDEgPDwgMykKLSNkZWZpbmUgQUQ5ODM0X01PREUJCSgxIDw8IDEpCisjZGVmaW5lIEFEOTgzNF9CMjgJCUJJVCgxMykKKyNkZWZpbmUgQUQ5ODM0X0hMQgkJQklUKDEyKQorI2RlZmluZSBBRDk4MzRfRlNFTAkJQklUKDExKQorI2RlZmluZSBBRDk4MzRfUFNFTAkJQklUKDEwKQorI2RlZmluZSBBRDk4MzRfUElOX1NXCQlCSVQoOSkKKyNkZWZpbmUgQUQ5ODM0X1JFU0VUCQlCSVQoOCkKKyNkZWZpbmUgQUQ5ODM0X1NMRUVQMQkJQklUKDcpCisjZGVmaW5lIEFEOTgzNF9TTEVFUDEyCQlCSVQoNikKKyNkZWZpbmUgQUQ5ODM0X09QQklURU4JCUJJVCg1KQorI2RlZmluZSBBRDk4MzRfU0lHTl9QSUIJCUJJVCg0KQorI2RlZmluZSBBRDk4MzRfRElWMgkJQklUKDMpCisjZGVmaW5lIEFEOTgzNF9NT0RFCQlCSVQoMSkKIAogI2RlZmluZSBBRDk4MzRfRlJFUV9CSVRTCTI4CiAjZGVmaW5lIEFEOTgzNF9QSEFTRV9CSVRTCTEyCiAKLSNkZWZpbmUgUkVTX01BU0soYml0cykJKCgxIDw8IChiaXRzKSkgLSAxKQorI2RlZmluZSBSRVNfTUFTSyhiaXRzKQkoQklUKGJpdHMpIC0gMSkKIAogLyoqCiAgKiBzdHJ1Y3QgYWQ5ODM0X3N0YXRlIC0gZHJpdmVyIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKQEAgLTY5LDcgKzY5LDYgQEAKIAlfX2JlMTYJCQkJZnJlcV9kYXRhWzJdOwogfTsKIAotCiAvKgogICogVE9ETzogc3RydWN0IGFkNzg4N19wbGF0Zm9ybV9kYXRhIG5lZWRzIHRvIGdvIGludG8gaW5jbHVkZS9saW51eC9paW8KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvZGRzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9kZHMuaAppbmRleCA2MTFlMmIwLi5mZTUzZTczMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvZGRzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvZGRzLmgKQEAgLTUsNiArNSw4IEBACiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCisjaWZuZGVmIElJT19ERFNfSF8KKyNkZWZpbmUgSUlPX0REU19IXwogCiAvKioKICAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9vdXRfYWx0dm9sdGFnZVhfZnJlcXVlbmN5WQpAQCAtMTA4LDMgKzExMCw1IEBACiAjZGVmaW5lIElJT19DT05TVF9BVFRSX09VVF9XQVZFVFlQRVNfQVZBSUxBQkxFKF9jaGFubmVsLCBfb3V0cHV0LCBfbW9kZXMpXAogCUlJT19DT05TVF9BVFRSKAkJCQkJCQlcCiAJb3V0X2FsdHZvbHRhZ2UjI19jaGFubmVsIyNfb3V0IyNfb3V0cHV0IyNfd2F2ZXR5cGVfYXZhaWxhYmxlLCBfbW9kZXMpCisKKyNlbmRpZiAvKiBJSU9fRERTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19kdW1teV9ldmdlbi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fZHVtbXlfZXZnZW4uYwppbmRleCA1OWFkNWEzLi4wYzljODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19kdW1teV9ldmdlbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX2R1bW15X2V2Z2VuLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAlpbnQgcmV0LCBpOwogCiAJaWlvX2V2Z2VuID0ga3phbGxvYyhzaXplb2YoKmlpb19ldmdlbiksIEdGUF9LRVJORUwpOwotCWlmIChpaW9fZXZnZW4gPT0gTlVMTCkKKwlpZiAoIWlpb19ldmdlbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpaW9fZXZnZW4tPmJhc2UgPSBpcnFfYWxsb2NfZGVzY3MoLTEsIDAsIElJT19FVkVOVEdFTl9OTywgMCk7CkBAIC0xMDUsNyArMTA1LDcgQEAKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWlmIChpaW9fZXZnZW4gPT0gTlVMTCkKKwlpZiAoIWlpb19ldmdlbikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAltdXRleF9sb2NrKCZpaW9fZXZnZW4tPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYwppbmRleCBlNDUyMDIxLi5iNDdiZjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgpAQCAtNTg5LDcgKzU4OCw3IEBACiAJICogZm9yIGNoaXAgc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24uCiAJICovCiAJaW5kaW9fZGV2ID0gaWlvX2RldmljZV9hbGxvYyhzaXplb2YoKnN0KSk7Ci0JaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15X2J1ZmZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15X2J1ZmZlci5jCmluZGV4IDM2MGE0YzkuLmE2NTFiODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teV9idWZmZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAl1MTYgKmRhdGE7CiAKIAlkYXRhID0ga21hbGxvYyhpbmRpb19kZXYtPnNjYW5fYnl0ZXMsIEdGUF9LRVJORUwpOwotCWlmIChkYXRhID09IE5VTEwpCisJaWYgKCFkYXRhKQogCQlnb3RvIGRvbmU7CiAKIAlpZiAoIWJpdG1hcF9lbXB0eShpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCkpIHsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAJLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gdXNlIC0gaGVyZSBhIGtmaWZvICovCiAJYnVmZmVyID0gaWlvX2tmaWZvX2FsbG9jYXRlKCk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJaWYgKCFidWZmZXIpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpAQCAtMTYxLDcgKzE2MSw3IEBACiAJCQkJCQkgImlpb19zaW1wbGVfZHVtbXlfY29uc3VtZXIlZCIsCiAJCQkJCQkgaW5kaW9fZGV2LT5pZCk7CiAKLQlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYtPnBvbGxmdW5jKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9idWZmZXI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvYWQ1OTMzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuYwppbmRleCA3OTE5NDM5Li5jMTgxMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuYwpAQCAtNzAzLDcgKzcwMyw3IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqc3QpKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAyOC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAyOC5jCmluZGV4IDY0NDBlM2IuLmU1YjJmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMjguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDI4LmMKQEAgLTQ0MSwxNSArNDQxLDE1IEBACiAKIAlyZXQgPSBpc2wyOTAyOF9zZXRfcHJveGltX3NhbXBsaW5nKGNoaXAsIGNoaXAtPnByb3hfc2FtcGxpbmcpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY2hpcC0+ZGV2LCAiJXMoKTogc2V0dGluZyB0aGUgcHJveGltaXR5LCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKGNoaXAtPmRldiwgInNldHRpbmcgdGhlIHByb3hpbWl0eSwgZXJyID0gJWRcbiIsCisJCQlyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGlzbDI5MDI4X3NldF9hbHNfc2NhbGUoY2hpcCwgY2hpcC0+bHV4X3NjYWxlKTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihjaGlwLT5kZXYsICIlcygpOiBzZXR0aW5nIGFscyBzY2FsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCWRldl9lcnIoY2hpcC0+ZGV2LAorCQkJInNldHRpbmcgYWxzIHNjYWxlIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwppbmRleCA4YWZhZThlLi5iNWUxYjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwpAQCAtNDcxLDE0ICs0NzEsMTIgQEAKIHN0YXRpYyBpbnQgdGFvc19jaGlwX29mZihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCByZXQ7CiAKIAkvKiB0dXJuIGRldmljZSBvZmYgKi8KIAljaGlwLT50YW9zX2NoaXBfc3RhdHVzID0gVFNMMjU4WF9DSElQX1NVU1BFTkRFRDsKLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCiAJCQkJCVRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwsCiAJCQkJCTB4MDApOwotCXJldHVybiByZXQ7CiB9CiAKIC8qIFN5c2ZzIEludGVyZmFjZSBGdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMng3eF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDJ4N3hfY29yZS5jCmluZGV4IDRhNWRjMjYuLjAxMGU2MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMng3eF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyeDd4X2NvcmUuYwpAQCAtMzAxLDggKzMwMSw3IEBACiAJLyogc2VsZWN0IHJlZ2lzdGVyIHRvIHdyaXRlICovCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCAoVFNMMlg3WF9DTURfUkVHIHwgcmVnKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogZmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVyICV4XG4iCi0JCQkJLCBfX2Z1bmNfXywgcmVnKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXIgJXhcbiIsIHJlZyk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zMTEsOCArMzEwLDcgQEAKIAlpZiAocmV0ID49IDApCiAJCSp2YWwgPSAodTgpcmV0OwogCWVsc2UKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogZmFpbGVkIHRvIHJlYWQgcmVnaXN0ZXIgJXhcbiIKLQkJCQkJCSwgX19mdW5jX18sIHJlZyk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgcmVnaXN0ZXIgJXhcbiIsIHJlZyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzc3LDcgKzM3NSw3IEBACiAJCQkmYnVmW2ldKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIHJlYWQuIGVycj0leFxuIiwgX19mdW5jX18sIHJldCk7CisJCQkJImZhaWxlZCB0byByZWFkLiBlcnI9JXhcbiIsIHJldCk7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAl9CkBAIC0zODksOCArMzg3LDcgQEAKIAkJCQlUU0wyWDdYX0NNRF9BTFNfSU5UX0NMUikpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkiJXM6IGkyY193cml0ZV9jb21tYW5kIGZhaWxlZCAtIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCQkiaTJjX3dyaXRlX2NvbW1hbmQgZmFpbGVkIC0gZXJyID0gJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0X3VubG9jazsgLyogaGF2ZSBubyBkYXRhLCBzbyByZXR1cm4gZmFpbHVyZSAqLwogCX0KIApAQCAtNDkzLDggKzQ5MCw3IEBACiAJcmV0ID0gdHNsMng3eF9pMmNfcmVhZChjaGlwLT5jbGllbnQsCiAJCShUU0wyWDdYX0NNRF9SRUcgfCBUU0wyWDdYX1NUQVRVUyksICZzdGF0dXMpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkiJXM6IGkyYyBlcnI9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgImkyYyBlcnI9JWRcbiIsIHJldCk7CiAJCWdvdG8gcHJveF9wb2xsX2VycjsKIAl9CiAKQEAgLTU4Myw4ICs1NzksNyBAQAogCQkJKFRTTDJYN1hfQ01EX1JFRyB8IFRTTDJYN1hfQ05UUkwpKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwKLQkJIiVzOiBmYWlsZWQgdG8gd3JpdGUgQ05UUkwgcmVnaXN0ZXIsIHJldD0lZFxuIiwKLQkJX19mdW5jX18sIHJldCk7CisJCQkiZmFpbGVkIHRvIHdyaXRlIENOVFJMIHJlZ2lzdGVyLCByZXQ9JWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02MDAsOCArNTk1LDcgQEAKIAkJCShUU0wyWDdYX0NNRF9SRUcgfCBUU0wyWDdYX0NOVFJMKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byB3cml0ZSBjdHJsIHJlZzogcmV0PSVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCQkiZmFpbGVkIHRvIHdyaXRlIGN0cmwgcmVnOiByZXQ9JWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02MTksOCArNjEzLDggQEAKIAkJcmV0dXJuIGx1eF92YWw7CiAJfQogCi0JZ2Fpbl90cmltX3ZhbCA9ICAoKChjaGlwLT50c2wyeDd4X3NldHRpbmdzLmFsc19jYWxfdGFyZ2V0KQotCQkJKiBjaGlwLT50c2wyeDd4X3NldHRpbmdzLmFsc19nYWluX3RyaW0pIC8gbHV4X3ZhbCk7CisJZ2Fpbl90cmltX3ZhbCA9ICAoKGNoaXAtPnRzbDJ4N3hfc2V0dGluZ3MuYWxzX2NhbF90YXJnZXQpCisJCQkqIGNoaXAtPnRzbDJ4N3hfc2V0dGluZ3MuYWxzX2dhaW5fdHJpbSkgLyBsdXhfdmFsOwogCWlmICgoZ2Fpbl90cmltX3ZhbCA8IDI1MCkgfHwgKGdhaW5fdHJpbV92YWwgPiA0MDAwKSkKIAkJcmV0dXJuIC1FUkFOR0U7CiAKQEAgLTcyMCw3ICs3MTQsNyBAQAogCQkJCVRTTDJYN1hfQ01EX1JFRyArIGksICpkZXZfcmVnKyspOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCi0JCQkiJXM6IGZhaWxlZCBvbiB3cml0ZSB0byByZWcgJWQuXG4iLCBfX2Z1bmNfXywgaSk7CisJCQkJImZhaWxlZCBvbiB3cml0ZSB0byByZWcgJWQuXG4iLCBpKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC04NzEsOCArODY1LDggQEAKIAogCWlmIChjaGlwLT50c2wyeDd4X3NldHRpbmdzLnByb3hfbWF4X3NhbXBsZXNfY2FsID4gTUFYX1NBTVBMRVNfQ0FMKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkJIiVzOiBtYXggcHJveCBzYW1wbGVzIGNhbCBpcyB0b28gYmlnOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBjaGlwLT50c2wyeDd4X3NldHRpbmdzLnByb3hfbWF4X3NhbXBsZXNfY2FsKTsKKwkJCSJtYXggcHJveCBzYW1wbGVzIGNhbCBpcyB0b28gYmlnOiAlZFxuIiwKKwkJCWNoaXAtPnRzbDJ4N3hfc2V0dGluZ3MucHJveF9tYXhfc2FtcGxlc19jYWwpOwogCQljaGlwLT50c2wyeDd4X3NldHRpbmdzLnByb3hfbWF4X3NhbXBsZXNfY2FsID0gTUFYX1NBTVBMRVNfQ0FMOwogCX0KIApAQCAtMTU2Myw4ICsxNTU3LDggQEAKIAkJVFNMMlg3WF9DTURfUFJPWEFMU19JTlRfQ0xSKTsKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBjbGVhciBpcnEgZnJvbSBldmVudCBoYW5kbGVyLiBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQkJIkZhaWxlZCB0byBjbGVhciBpcnEgZnJvbSBldmVudCBoYW5kbGVyLiBlcnIgPSAlZFxuIiwKKwkJCXJldCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xODkzLDggKzE4ODcsOCBAQAogCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50cCwgKFRTTDJYN1hfQ01EX1JFRyB8IFRTTDJYN1hfQ05UUkwpKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnRwLT5kZXYsICIlczogd3JpdGUgdG8gY21kIHJlZyBmYWlsZWQuIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKCZjbGllbnRwLT5kZXYsICJ3cml0ZSB0byBjbWQgcmVnIGZhaWxlZC4gZXJyID0gJWRcbiIsCisJCQlyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0My5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0My5oCmluZGV4IGI3ODRlM2UuLmYzZDBkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzLmgKQEAgLTEwLDcgKzEwLDYgQEAKICAqCiAgKiAqLwogCi0KICNpZm5kZWYgSE1DNTg0M19DT1JFX0gKICNkZWZpbmUgSE1DNTg0M19DT1JFX0gKIApAQCAtMzIsMTYgKzMxLDI0IEBACiAJSE1DNTk4M19JRCwKIH07CiAKKy8qKgorICogc3RydWN0IGhjbTU4NDNfZGF0YQktIGRldmljZSBzcGVjaWZpYyBkYXRhCisgKiBAZGV2OgkJYWN0dWFsIGRldmljZQorICogQGxvY2s6CQl1cGRhdGUgYW5kIHJlYWQgcmVnbWFwIGRhdGEKKyAqIEByZWdtYXA6CQloYXJkd2FyZSBhY2Nlc3MgcmVnaXN0ZXIgbWFwcworICogQHZhcmlhbnQ6CQlkZXNjcmliZSBjaGlwIHZhcmlhbnRzCisgKiBAYnVmZmVyOgkJM3ggMTYtYml0IGNoYW5uZWxzICsgcGFkZGluZyArIDY0LWJpdCB0aW1lc3RhbXAKKyAqKi8KIHN0cnVjdCBobWM1ODQzX2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJY29uc3Qgc3RydWN0IGhtYzU4NDNfY2hpcF9pbmZvICp2YXJpYW50OwotCV9fYmUxNiBidWZmZXJbOF07IC8qIDN4IDE2LWJpdCBjaGFubmVscyArIHBhZGRpbmcgKyA2NC1iaXQgdGltZXN0YW1wICovCisJX19iZTE2IGJ1ZmZlcls4XTsKIH07CiAKIGludCBobWM1ODQzX2NvbW1vbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKLQkJZW51bSBobWM1ODQzX2lkcyBpZCk7CisJCQkgZW51bSBobWM1ODQzX2lkcyBpZCk7CiBpbnQgaG1jNTg0M19jb21tb25fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIGludCBobWM1ODQzX2NvbW1vbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfY29yZS5jCmluZGV4IDkwY2MxOGIuLmZmZmNhM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfY29yZS5jCkBAIC0xLDI1ICsxLDI1IEBACi0vKiAgQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzCi0gICAgQXV0aG9yOiBTaHViaHJhanlvdGkgRGF0dGEgPHNodWJocmFqeW90aUB0aS5jb20+Ci0gICAgQWNrbm93bGVkZ2VtZW50OiBKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiBmb3IgdmFsdWFibGUgaW5wdXRzLgotCi0gICAgU3VwcG9ydCBmb3IgSE1DNTg4MyBhbmQgSE1DNTg4M0wgYnkgUGV0ZXIgTWVlcndhbGQgPHBtZWVyd0BwbWVlcncubmV0Pi4KLQotICAgIFNwbGl0IHRvIG11bHRpcGxlIGZpbGVzIGJ5IEpvc2VmIEdhamR1c2VrIDxhdHhAYXR4Lm5hbWU+IC0gMjAxNAotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qLworLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSB0aGUgSE1DNTg0MyBtdWx0aS1jaGlwIG1vZHVsZSBkZXNpZ25lZAorICogZm9yIGxvdyBmaWVsZCBtYWduZXRpYyBzZW5zaW5nLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIEF1dGhvcjogU2h1YmhyYWp5b3RpIERhdHRhIDxzaHViaHJhanlvdGlAdGkuY29tPgorICogQWNrbm93bGVkZ21lbnQ6IEpvbmF0aGFuIENhbWVyb24gPGppYzIzQGtlcm5lbC5vcmc+IGZvciB2YWx1YWJsZSBpbnB1dHMuCisgKiBTdXBwb3J0IGZvciBITUM1ODgzIGFuZCBITUM1ODgzTCBieSBQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+LgorICogU3BsaXQgdG8gbXVsdGlwbGUgZmlsZXMgYnkgSm9zZWYgR2FqZHVzZWsgPGF0eEBhdHgubmFtZT4gLSAyMDE0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CkBAIC0xMjIsNyArMTIyLDcgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkYXRhLT5yZWdtYXAsIEhNQzU4NDNfTU9ERV9SRUcsCi0JCQlITUM1ODQzX01PREVfTUFTSywgb3BlcmF0aW5nX21vZGUpOworCQkJCSBITUM1ODQzX01PREVfTUFTSywgb3BlcmF0aW5nX21vZGUpOwogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0RBVEFfT1VUX01TQl9SRUdTLAotCQkJdmFsdWVzLCBzaXplb2YodmFsdWVzKSk7CisJCQkgICAgICAgdmFsdWVzLCBzaXplb2YodmFsdWVzKSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTE5OCwxNSArMTk4LDE2IEBACiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0NPTkZJR19SRUdfQSwKLQkJCUhNQzU4NDNfTUVBU19DT05GX01BU0ssIG1lYXNfY29uZik7CisJCQkJIEhNQzU4NDNfTUVBU19DT05GX01BU0ssIG1lYXNfY29uZik7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGhtYzU4NDNfc2hvd19tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkJY2hhciAqYnVmKQorc3RhdGljCitzc2l6ZV90IGhtYzU4NDNfc2hvd19tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKIAl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtMjIwLDEwICsyMjEsMTEgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKIH0KIAotc3RhdGljIHNzaXplX3QgaG1jNTg0M19zZXRfbWVhc3VyZW1lbnRfY29uZmlndXJhdGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCkKK3N0YXRpYworc3NpemVfdCBobWM1ODQzX3NldF9tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKIAl1bnNpZ25lZCBsb25nIG1lYXNfY29uZiA9IDA7CkBAIC0yNDYsOCArMjQ4LDkgQEAKIAkJCWhtYzU4NDNfc2V0X21lYXN1cmVtZW50X2NvbmZpZ3VyYXRpb24sCiAJCQkwKTsKIAotc3RhdGljIHNzaXplX3QgaG1jNTg0M19zaG93X3NhbXBfZnJlcV9hdmFpbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYworc3NpemVfdCBobWM1ODQzX3Nob3dfc2FtcF9mcmVxX2F2YWlsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOwogCXNpemVfdCBsZW4gPSAwOwpAQCAtMjcyLDIwICsyNzUsMjEgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkYXRhLT5yZWdtYXAsIEhNQzU4NDNfQ09ORklHX1JFR19BLAotCQkJSE1DNTg0M19SQVRFX01BU0ssIHJhdGUgPDwgSE1DNTg0M19SQVRFX09GRlNFVCk7CisJCQkJIEhNQzU4NDNfUkFURV9NQVNLLAorCQkJCSByYXRlIDw8IEhNQzU4NDNfUkFURV9PRkZTRVQpOwogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGhtYzU4NDNfZ2V0X3NhbXBfZnJlcV9pbmRleChzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhLAotCQkJCSAgIGludCB2YWwsIGludCB2YWwyKQorCQkJCSAgICAgICBpbnQgdmFsLCBpbnQgdmFsMikKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT52YXJpYW50LT5uX3JlZ3ZhbF90b19zYW1wX2ZyZXE7IGkrKykKIAkJaWYgKHZhbCA9PSBkYXRhLT52YXJpYW50LT5yZWd2YWxfdG9fc2FtcF9mcmVxW2ldWzBdICYmCi0JCQl2YWwyID09IGRhdGEtPnZhcmlhbnQtPnJlZ3ZhbF90b19zYW1wX2ZyZXFbaV1bMV0pCisJCSAgICB2YWwyID09IGRhdGEtPnZhcmlhbnQtPnJlZ3ZhbF90b19zYW1wX2ZyZXFbaV1bMV0pCiAJCQlyZXR1cm4gaTsKIAogCXJldHVybiAtRUlOVkFMOwpAQCAtMjk3LDE1ICszMDEsMTYgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkYXRhLT5yZWdtYXAsIEhNQzU4NDNfQ09ORklHX1JFR19CLAotCQkJSE1DNTg0M19SQU5HRV9HQUlOX01BU0ssCi0JCQlyYW5nZSA8PCBITUM1ODQzX1JBTkdFX0dBSU5fT0ZGU0VUKTsKKwkJCQkgSE1DNTg0M19SQU5HRV9HQUlOX01BU0ssCisJCQkJIHJhbmdlIDw8IEhNQzU4NDNfUkFOR0VfR0FJTl9PRkZTRVQpOwogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBobWM1ODQzX3Nob3dfc2NhbGVfYXZhaWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOwogCkBAIC0zOTYsNyArNDAxLDggQEAKIH0KIAogc3RhdGljIGludCBobWM1ODQzX3dyaXRlX3Jhd19nZXRfZm10KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGxvbmcgbWFzaykKKwkJCQkgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCSAgICAgbG9uZyBtYXNrKQogewogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CkBAIC00MjMsMTQgKzQyOSwxNCBAQAogCX0KIAogCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0RBVEFfT1VUX01TQl9SRUdTLAotCQkJZGF0YS0+YnVmZmVyLCAzICogc2l6ZW9mKF9fYmUxNikpOworCQkJICAgICAgIGRhdGEtPmJ1ZmZlciwgMyAqIHNpemVvZihfX2JlMTYpKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZG9uZTsKIAogCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLT5idWZmZXIsCi0JCWlpb19nZXRfdGltZV9ucygpKTsKKwkJCQkJICAgaWlvX2dldF90aW1lX25zKCkpOwogCiBkb25lOgogCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CkBAIC01MjYsNyArNTMyLDcgQEAKIAl1OCBpZFszXTsKIAogCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0lEX1JFRywKLQkJCWlkLCBBUlJBWV9TSVpFKGlkKSk7CisJCQkgICAgICAgaWQsIEFSUkFZX1NJWkUoaWQpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlpZiAoaWRbMF0gIT0gJ0gnIHx8IGlkWzFdICE9ICc0JyB8fCBpZFsyXSAhPSAnMycpIHsKQEAgLTU1Niw3ICs1NjIsNiBAQAogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBobWM1ODQzX3NjYW5fbWFza3NbXSA9IHsweDcsIDB9OwogCi0KIGludCBobWM1ODQzX2NvbW1vbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gaG1jNTg0M19zZXRfbW9kZShpaW9fcHJpdihkZXZfZ2V0X2RydmRhdGEoZGV2KSksCkBAIC01NjcsMTkgKzU3MiwxOSBAQAogaW50IGhtYzU4NDNfY29tbW9uX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIGhtYzU4NDNfc2V0X21vZGUoaWlvX3ByaXYoZGV2X2dldF9kcnZkYXRhKGRldikpLAotCQkJSE1DNTg0M19NT0RFX1NMRUVQKTsKKwkJCQlITUM1ODQzX01PREVfU0xFRVApOwogfQogRVhQT1JUX1NZTUJPTChobWM1ODQzX2NvbW1vbl9yZXN1bWUpOwogCiBpbnQgaG1jNTg0M19jb21tb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCi0JCWVudW0gaG1jNTg0M19pZHMgaWQpCisJCQkgZW51bSBobWM1ODQzX2lkcyBpZCkKIHsKIAlzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJaW50IHJldDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqZGF0YSkpOwotCWlmIChpbmRpb19kZXYgPT0gTlVMTCkKKwlpZiAoIWluZGlvX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbmRpb19kZXYpOwpAQCAtNjA0LDkgKzYwOSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCi0JCWhtYzU4NDNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwkJCQkJIGhtYzU4NDNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBidWZmZXJfc2V0dXBfZXJyOwogCiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQgPCAwKQpAQCAtNjE2LDYgKzYyMSw4IEBACiAKIGJ1ZmZlcl9jbGVhbnVwOgogCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2J1ZmZlcl9zZXR1cF9lcnI6CisJaG1jNTg0M19zZXRfbW9kZShpaW9fcHJpdihpbmRpb19kZXYpLCBITUM1ODQzX01PREVfU0xFRVApOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGhtYzU4NDNfY29tbW9uX3Byb2JlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX2kyYy5jCmluZGV4IDZhY2Q2MTQuLmZmMDg2NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfaTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0M19pMmMuYwpAQCAtMTksNDggKzE5LDQ4IEBACiAjaW5jbHVkZSAiaG1jNTg0My5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZSBobWM1ODQzX3JlYWRhYmxlX3Jhbmdlc1tdID0gewotCQlyZWdtYXBfcmVnX3JhbmdlKDAsIEhNQzU4NDNfSURfRU5EKSwKKwlyZWdtYXBfcmVnX3JhbmdlKDAsIEhNQzU4NDNfSURfRU5EKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3JlYWRhYmxlX3RhYmxlID0gewotCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzLAotCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3JlYWRhYmxlX3JhbmdlcyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M19yZWFkYWJsZV90YWJsZSA9IHsKKwkueWVzX3JhbmdlcyA9IGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzLAorCS5uX3llc19yYW5nZXMgPSBBUlJBWV9TSVpFKGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzW10gPSB7Ci0JCXJlZ21hcF9yZWdfcmFuZ2UoMCwgSE1DNTg0M19NT0RFX1JFRyksCisJcmVnbWFwX3JlZ19yYW5nZSgwLCBITUM1ODQzX01PREVfUkVHKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3dyaXRhYmxlX3RhYmxlID0gewotCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzLAotCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3dyaXRhYmxlX3JhbmdlcyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M193cml0YWJsZV90YWJsZSA9IHsKKwkueWVzX3JhbmdlcyA9IGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzLAorCS5uX3llc19yYW5nZXMgPSBBUlJBWV9TSVpFKGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGhtYzU4NDNfdm9sYXRpbGVfcmFuZ2VzW10gPSB7Ci0JCXJlZ21hcF9yZWdfcmFuZ2UoSE1DNTg0M19EQVRBX09VVF9NU0JfUkVHUywgSE1DNTg0M19TVEFUVVNfUkVHKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEhNQzU4NDNfREFUQV9PVVRfTVNCX1JFR1MsIEhNQzU4NDNfU1RBVFVTX1JFRyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M192b2xhdGlsZV90YWJsZSA9IHsKLQkJLnllc19yYW5nZXMgPSBobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcywKLQkJLm5feWVzX3JhbmdlcyA9IEFSUkFZX1NJWkUoaG1jNTg0M192b2xhdGlsZV9yYW5nZXMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIGhtYzU4NDNfdm9sYXRpbGVfdGFibGUgPSB7CisJLnllc19yYW5nZXMgPSBobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcywKKwkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgaG1jNTg0M19pMmNfcmVnbWFwX2NvbmZpZyA9IHsKLQkJLnJlZ19iaXRzID0gOCwKLQkJLnZhbF9iaXRzID0gOCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBobWM1ODQzX2kyY19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKIAotCQkucmRfdGFibGUgPSAmaG1jNTg0M19yZWFkYWJsZV90YWJsZSwKLQkJLndyX3RhYmxlID0gJmhtYzU4NDNfd3JpdGFibGVfdGFibGUsCi0JCS52b2xhdGlsZV90YWJsZSA9ICZobWM1ODQzX3ZvbGF0aWxlX3RhYmxlLAorCS5yZF90YWJsZSA9ICZobWM1ODQzX3JlYWRhYmxlX3RhYmxlLAorCS53cl90YWJsZSA9ICZobWM1ODQzX3dyaXRhYmxlX3RhYmxlLAorCS52b2xhdGlsZV90YWJsZSA9ICZobWM1ODQzX3ZvbGF0aWxlX3RhYmxlLAogCi0JCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAogfTsKIAotc3RhdGljIGludCBobWM1ODQzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgaG1jNTg0M19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBobWM1ODQzX2NvbW1vbl9wcm9iZSgmY2xpZW50LT5kZXYsCi0JCQlkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZobWM1ODQzX2kyY19yZWdtYXBfY29uZmlnKSwKKwlyZXR1cm4gaG1jNTg0M19jb21tb25fcHJvYmUoJmNsaS0+ZGV2LAorCQkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpLCAmaG1jNTg0M19pMmNfcmVnbWFwX2NvbmZpZyksCiAJCQlpZC0+ZHJpdmVyX2RhdGEpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX3NwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0M19zcGkuYwppbmRleCA5OGM0YjU3Li44ZTY1OGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX3NwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfc3BpLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAkJcmVnbWFwX3JlZ19yYW5nZSgwLCBITUM1ODQzX0lEX0VORCksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M19yZWFkYWJsZV90YWJsZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3JlYWRhYmxlX3RhYmxlID0gewogCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzLAogCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3JlYWRhYmxlX3JhbmdlcyksCiB9OwpAQCAtMjgsNyArMjgsNyBAQAogCQlyZWdtYXBfcmVnX3JhbmdlKDAsIEhNQzU4NDNfTU9ERV9SRUcpLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIGhtYzU4NDNfd3JpdGFibGVfdGFibGUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M193cml0YWJsZV90YWJsZSA9IHsKIAkJLnllc19yYW5nZXMgPSBobWM1ODQzX3dyaXRhYmxlX3JhbmdlcywKIAkJLm5feWVzX3JhbmdlcyA9IEFSUkFZX1NJWkUoaG1jNTg0M193cml0YWJsZV9yYW5nZXMpLAogfTsKQEAgLTM3LDEyICszNywxMiBAQAogCQlyZWdtYXBfcmVnX3JhbmdlKEhNQzU4NDNfREFUQV9PVVRfTVNCX1JFR1MsIEhNQzU4NDNfU1RBVFVTX1JFRyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M192b2xhdGlsZV90YWJsZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3ZvbGF0aWxlX3RhYmxlID0gewogCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfdm9sYXRpbGVfcmFuZ2VzLAogCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgaG1jNTg0M19zcGlfcmVnbWFwX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBobWM1ODQzX3NwaV9yZWdtYXBfY29uZmlnID0gewogCQkucmVnX2JpdHMgPSA4LAogCQkudmFsX2JpdHMgPSA4LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCmluZGV4IDc4ZThmNTYuLmZmYzdmMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCkBAIC00MTEsNyArNDExLDcgQEAKIAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCi0JdCA9ICgyNzkwMCAvIHZhbCk7CisJdCA9IDI3OTAwIC8gdmFsOwogCWlmICh0ID4gMCkKIAkJdC0tOwogCkBAIC01MTcsMTEgKzUxNyw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIH0KIAogLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwppbmRleCA4MWY2NzMxLi5mMTJiMmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwpAQCAtMjE2LDkgKzIxNiwxMyBAQAogCiBzdGF0aWMgaW50IGFkZTc3NTRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQogeworCWludCByZXQ7CiAJdTggdmFsOwogCi0JYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NTRfT1BNT0RFLCAmdmFsKTsKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1NF9PUE1PREUsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJdmFsIHw9IDEgPDwgNjsgLyogU29mdHdhcmUgQ2hpcCBSZXNldCAqLwogCXJldHVybiBhZGU3NzU0X3NwaV93cml0ZV9yZWdfOChkZXYsIEFERTc3NTRfT1BNT0RFLCB2YWwpOwogfQpAQCAtMzYyLDkgKzM2NiwxNiBAQAogLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCiBzdGF0aWMgaW50IGFkZTc3NTRfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogeworCWludCByZXQ7CiAJdTggdmFsOwogCi0JYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NTRfT1BNT0RFLCAmdmFsKTsKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1NF9PUE1PREUsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHBvd2VyIGRvd24gdGhlIGRldmljZSwgZXJyb3I6ICVkIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCiAJdmFsIHw9IDcgPDwgMzsgIC8qIEFERTc3NTQgcG93ZXJlZCBkb3duICovCiAJcmV0dXJuIGFkZTc3NTRfc3BpX3dyaXRlX3JlZ184KGRldiwgQURFNzc1NF9PUE1PREUsIHZhbCk7CiB9CkBAIC00MzIsNyArNDQzLDcgQEAKIAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCi0JdCA9ICgyNjAwMCAvIHZhbCk7CisJdCA9IDI2MDAwIC8gdmFsOwogCWlmICh0ID4gMCkKIAkJdC0tOwogCkBAIC01MzksMTIgKzU1MCwxNSBAQAogCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KIAlyZXQgPSBhZGU3NzU0X2luaXRpYWxfc2V0dXAoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIHBvd2VyZG93bl9vbl9lcnJvcjsKIAlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBwb3dlcmRvd25fb25fZXJyb3I7CisJcmV0dXJuIHJldDsKIAotCXJldHVybiAwOworcG93ZXJkb3duX29uX2Vycm9yOgorCWFkZTc3NTRfc3RvcF9kZXZpY2UoJmluZGlvX2Rldi0+ZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYwppbmRleCA3MGU5NmIyLi43NzE0MWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9jb3JlLmMKQEAgLTMwMywxNCArMzAzLDE1IEBACiAJaW50IHJldDsKIAl1OCB2YWw7CiAKLQlhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwKLQkJCUFERTc3NThfT1BNT0RFLAotCQkJJnZhbCk7CisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NThfT1BNT0RFLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIG9wbW9kZSByZWdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KIAl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCi0JcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LAotCQkJQURFNzc1OF9PUE1PREUsCi0JCQl2YWwpOwotCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LCBBREU3NzU4X09QTU9ERSwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gd3JpdGUgb3Btb2RlIHJlZ1xuIik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDQ0LDE0ICs0NDUsMTUgQEAKIAlpbnQgcmV0OwogCXU4IHZhbDsKIAotCWFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAotCQkJQURFNzc1OF9PUE1PREUsCi0JCQkmdmFsKTsKKwlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1OF9PUE1PREUsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgb3Btb2RlIHJlZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQogCXZhbCB8PSA3IDw8IDM7ICAvKiBBREU3NzU4IHBvd2VyZWQgZG93biAqLwotCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKLQkJCUFERTc3NThfT1BNT0RFLAotCQkJdmFsKTsKLQorCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwgQURFNzc1OF9PUE1PREUsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHdyaXRlIG9wbW9kZSByZWdcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ4Myw3ICs0ODUsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQogewotCWludCByZXQsIGxlbiA9IDA7CisJaW50IHJldDsKIAl1OCB0OwogCWludCBzcHM7CiAKQEAgLTQ5Niw4ICs0OTgsNyBAQAogCXQgPSAodCA+PiA1KSAmIDB4MzsKIAlzcHMgPSAyNjA0MCAvICgxIDw8IHQpOwogCi0JbGVuID0gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc3NThfd3JpdGVfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTgzMiw3ICs4MzMsNyBAQAogCWlmICghc3QtPnJ4KQogCQlyZXR1cm4gLUVOT01FTTsKIAlzdC0+dHggPSBrY2FsbG9jKEFERTc3NThfTUFYX1RYLCBzaXplb2YoKnN0LT50eCksIEdGUF9LRVJORUwpOwotCWlmIChzdC0+dHggPT0gTlVMTCkgeworCWlmICghc3QtPnR4KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9yeDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYwppbmRleCAzNzkyYjU3Li45YTI0ZTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKQEAgLTExOSwxMCArMTE5LDggQEAKIAlpbnQgcmV0ID0gMDsKIAogCWJ1ZmZlciA9IGlpb19rZmlmb19hbGxvY2F0ZSgpOwotCWlmICghYnVmZmVyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWlpb19kZXZpY2VfYXR0YWNoX2J1ZmZlcihpbmRpb19kZXYsIGJ1ZmZlcik7CiAKQEAgLTEzNCw3ICsxMzIsNyBAQAogCQkJCQkJIGluZGlvX2RldiwKIAkJCQkJCSAiYWRlNzc1OV9jb25zdW1lciVkIiwKIAkJCQkJCSBpbmRpb19kZXYtPmlkKTsKLQlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYtPnBvbGxmdW5jKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfaWlvX2tmaWZvX2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF90cmlnZ2VyLmMKaW5kZXggNmY0NWNlMC4uNWIzNWE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfdHJpZ2dlci5jCkBAIC02Niw3ICs2Niw3IEBACiAJc3QtPnRyaWcgPSBpaW9fdHJpZ2dlcl9hbGxvYygiJXMtZGV2JWQiLAogCQkJCQlzcGlfZ2V0X2RldmljZV9pZChzdC0+dXMpLT5uYW1lLAogCQkJCQlpbmRpb19kZXYtPmlkKTsKLQlpZiAoc3QtPnRyaWcgPT0gTlVMTCkgeworCWlmICghc3QtPnRyaWcpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwppbmRleCBiMGM3ZGJjLi5kYmNlZGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwpAQCAtMjE4LDE1ICsyMTgsMTYgQEAKIAlpbnQgcmV0OwogCXUxNiB2YWw7CiAKLQlhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsCisJcmV0ID0gYWRlNzc1OV9zcGlfcmVhZF9yZWdfMTYoZGV2LAogCQkJQURFNzc1OV9NT0RFLAogCQkJJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCi0JcmV0ID0gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwlyZXR1cm4gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKIAkJCUFERTc3NTlfTU9ERSwKIAkJCXZhbCk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgSUlPX0RFVl9BVFRSX0FFTkVSR1koYWRlNzc1OV9yZWFkXzQwYml0LCBBREU3NzU5X0FFTkVSR1kpOwpAQCAtMzAxLDExICszMDIsMTggQEAKIC8qIFBvd2VyIGRvd24gdGhlIGRldmljZSAqLwogc3RhdGljIGludCBhZGU3NzU5X3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlpbnQgcmV0OwogCXUxNiB2YWw7CiAKLQlhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsCisJcmV0ID0gYWRlNzc1OV9zcGlfcmVhZF9yZWdfMTYoZGV2LAogCQkJQURFNzc1OV9NT0RFLAogCQkJJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcG93ZXIgZG93biB0aGUgZGV2aWNlLCBlcnJvcjogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXZhbCB8PSAxIDw8IDQ7ICAvKiBBRCBjb252ZXJ0ZXJzIGNhbiBiZSB0dXJuZWQgb2ZmICovCiAKIAlyZXR1cm4gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURFNzc1OV9NT0RFLCB2YWwpOwpAQCAtMzc0LDcgKzM4Miw3IEBACiAKIAltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAotCXQgPSAoMjc5MDAgLyB2YWwpOworCXQgPSAyNzkwMCAvIHZhbDsKIAlpZiAodCA+IDApCiAJCXQtLTsKIApAQCAtNDY1LDExICs0NzMsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOworCXJldHVybiBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiB9CiAKIC8qIGZpeG1lLCBjb25maXJtIG9yZGVyaW5nIGluIHRoaXMgZnVuY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1pMmMuYwppbmRleCA1YjMzYzdmLi4wN2NmZTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtaTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jCkBAIC0xNiw4ICsxNiw4IEBACiAjaW5jbHVkZSAiYWRlNzg1NC5oIgogCiBzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTE2IHJlZ19hZGRyZXNzLAotCQl1OCB2YWx1ZSkKKwkJCQkgICB1MTYgcmVnX2FkZHJlc3MsCisJCQkJICAgdTggdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTM1LDggKzM1LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUxNiB2YWx1ZSkKKwkJCQkgICAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgICB1MTYgdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTU1LDggKzU1LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiB2YWx1ZSkKKwkJCQkgICAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgICB1MzIgdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTc2LDggKzc2LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiB2YWx1ZSkKKwkJCQkgICAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgICB1MzIgdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTk4LDggKzk4LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTE2IHJlZ19hZGRyZXNzLAotCQl1OCAqdmFsKQorCQkJCSAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgdTggKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTI0LDggKzEyNCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUxNiAqdmFsKQorCQkJCSAgIHUxNiByZWdfYWRkcmVzcywKKwkJCQkgICB1MTYgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTUwLDggKzE1MCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiAqdmFsKQorCQkJCSAgIHUxNiByZWdfYWRkcmVzcywKKwkJCQkgICB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTc2LDggKzE3Niw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiAqdmFsKQorCQkJCSAgIHUxNiByZWdfYWRkcmVzcywKKwkJCQkgICB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTk1LDIxICsxOTUsMjEgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDI0KSB8IChzdC0+cnhbMV0gPDwgMTYpIHwgKHN0LT5yeFsyXSA8PCA4KSB8IHN0LT5yeFszXTsKKwkqdmFsID0gKHN0LT5yeFswXSA8PCAyNCkgfCAoc3QtPnJ4WzFdIDw8IDE2KSB8CisJCShzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqc3QpKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwpAQCAtMjI0LDkgKzIyNCw3IEBACiAJc3QtPmkyYyA9IGNsaWVudDsKIAlzdC0+aXJxID0gY2xpZW50LT5pcnE7CiAKLQlyZXQgPSBhZGU3ODU0X3Byb2JlKGluZGlvX2RldiwgJmNsaWVudC0+ZGV2KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGFkZTc4NTRfcHJvYmUoaW5kaW9fZGV2LCAmY2xpZW50LT5kZXYpOwogfQogCiBzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jCmluZGV4IDk0ZjczYmIuLjliMjU1YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1zcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtc3BpLmMKQEAgLTI3NCw3ICsyNzQsNiBAQAogCiBzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIApAQCAtMjk0LDEwICsyOTMsNyBAQAogCXN0LT5pcnEgPSBzcGktPmlycTsKIAlzdC0+c3BpID0gc3BpOwogCi0KLQlyZXQgPSBhZGU3ODU0X3Byb2JlKGluZGlvX2RldiwgJnNwaS0+ZGV2KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGFkZTc4NTRfcHJvYmUoaW5kaW9fZGV2LCAmc3BpLT5kZXYpOwogfQogCiBzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oCmluZGV4IDhmMGRlMDIuLmRmYmE1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvbWV0ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL21ldGVyLmgKQEAgLTEsMyArMSw2IEBACisjaWZuZGVmIF9NRVRFUl9ICisjZGVmaW5lIF9NRVRFUl9ICisKICNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KIAogLyogbWV0ZXJpbmcgaWMgdHlwZXMgb2YgYXR0cmlidXRlICovCkBAIC0zOTQsMyArMzk3LDQgQEAKICNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfVlBLTFZMX0VYQyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAogCUlJT19FVkVOVF9BVFRSX1NIKHZwa2x2bF9leGMsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQogCisjZW5kaWYgLyogX01FVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYwppbmRleCBiNGMxNGJhLi43YmMzZTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogCWZjdyA9ICh1bnNpZ25lZCBjaGFyKShzdC0+ZmV4Y2l0ICogKDEgPDwgMTUpIC8gc3QtPmZjbGtpbik7CiAJaWYgKGZjdyA8IEFEMlMxMjEwX01JTl9GQ1cgfHwgZmN3ID4gQUQyUzEyMTBfTUFYX0ZDVykgewotCQlwcl9lcnIoImFkMnMxMjEwOiBGQ1cgb3V0IG9mIHJhbmdlXG4iKTsKKwkJZGV2X2Vycigmc3QtPnNkZXYtPmRldiwgImFkMnMxMjEwOiBGQ1cgb3V0IG9mIHJhbmdlXG4iKTsKIAkJcmV0dXJuIC1FUkFOR0U7CiAJfQogCkBAIC0xOTgsNyArMTk4LDcgQEAKIHsKIAlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X3RvX2lpb19kZXYoZGV2KSk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPmZjbGtpbik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHN0LT5mY2xraW4pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9mY2xraW4oc3RydWN0IGRldmljZSAqZGV2LApAQCAtMjE0LDcgKzIxNCw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAlpZiAoZmNsa2luIDwgQUQyUzEyMTBfTUlOX0NMS0lOIHx8IGZjbGtpbiA+IEFEMlMxMjEwX01BWF9DTEtJTikgewotCQlwcl9lcnIoImFkMnMxMjEwOiBmY2xraW4gb3V0IG9mIHJhbmdlXG4iKTsKKwkJZGV2X2VycihkZXYsICJhZDJzMTIxMDogZmNsa2luIG91dCBvZiByYW5nZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjM3LDcgKzIzNyw3IEBACiB7CiAJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5mZXhjaXQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBzdC0+ZmV4Y2l0KTsKIH0KIAogc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfZmV4Y2l0KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTI1Miw3ICsyNTIsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCWlmIChmZXhjaXQgPCBBRDJTMTIxMF9NSU5fRVhDSVQgfHwgZmV4Y2l0ID4gQUQyUzEyMTBfTUFYX0VYQ0lUKSB7Ci0JCXByX2VycigiYWQyczEyMTA6IGV4Y2l0YXRpb24gZnJlcXVlbmN5IG91dCBvZiByYW5nZVxuIik7CisJCWRldl9lcnIoZGV2LAorCQkJImFkMnMxMjEwOiBleGNpdGF0aW9uIGZyZXF1ZW5jeSBvdXQgb2YgcmFuZ2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJbXV0ZXhfbG9jaygmc3QtPmxvY2spOwpAQCAtMzA3LDcgKzMwOCw4IEBACiAJCWdvdG8gZXJyb3JfcmV0OwogCWlmIChyZXQgJiBBRDJTMTIxMF9NU0JfSVNfSElHSCkgewogCQlyZXQgPSAtRUlPOwotCQlwcl9lcnIoImFkMnMxMjEwOiB3cml0ZSBjb250cm9sIHJlZ2lzdGVyIGZhaWxcbiIpOworCQlkZXZfZXJyKGRldiwKKwkJCSJhZDJzMTIxMDogd3JpdGUgY29udHJvbCByZWdpc3RlciBmYWlsXG4iKTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQogCXN0LT5yZXNvbHV0aW9uCkBAIC0zMTUsNyArMzE3LDcgQEAKIAlpZiAoc3QtPnBkYXRhLT5ncGlvaW4pIHsKIAkJZGF0YSA9IGFkMnMxMjEwX3JlYWRfcmVzb2x1dGlvbl9waW4oc3QpOwogCQlpZiAoZGF0YSAhPSBzdC0+cmVzb2x1dGlvbikKLQkJCXByX3dhcm4oImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CisJCQlkZXZfd2FybihkZXYsICJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOwogCX0gZWxzZQogCQlhZDJzMTIxMF9zZXRfcmVzb2x1dGlvbl9waW4oc3QpOwogCkBAIC0zNDYsNyArMzQ4LDcgQEAKIAogCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMTAsICZ1ZGF0YSk7CiAJaWYgKHJldCB8fCB1ZGF0YSA8IDEwIHx8IHVkYXRhID4gMTYpIHsKLQkJcHJfZXJyKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBvdXQgb2YgcmFuZ2VcbiIpOworCQlkZXZfZXJyKGRldiwgImFkMnMxMjEwOiByZXNvbHV0aW9uIG91dCBvZiByYW5nZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltdXRleF9sb2NrKCZzdC0+bG9jayk7CkBAIC0zNjgsNyArMzcwLDcgQEAKIAlkYXRhID0gcmV0OwogCWlmIChkYXRhICYgQUQyUzEyMTBfTVNCX0lTX0hJR0gpIHsKIAkJcmV0ID0gLUVJTzsKLQkJcHJfZXJyKCJhZDJzMTIxMDogc2V0dGluZyByZXNvbHV0aW9uIGZhaWxcbiIpOworCQlkZXZfZXJyKGRldiwgImFkMnMxMjEwOiBzZXR0aW5nIHJlc29sdXRpb24gZmFpbFxuIik7CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAlzdC0+cmVzb2x1dGlvbgpAQCAtMzc2LDcgKzM3OCw3IEBACiAJaWYgKHN0LT5wZGF0YS0+Z3Bpb2luKSB7CiAJCWRhdGEgPSBhZDJzMTIxMF9yZWFkX3Jlc29sdXRpb25fcGluKHN0KTsKIAkJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCi0JCQlwcl93YXJuKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOworCQkJZGV2X3dhcm4oZGV2LCAiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKIAl9IGVsc2UKIAkJYWQyczEyMTBfc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKIAlyZXQgPSBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmgKaW5kZXggYWVjMGJkY2EuLmM3MTU4ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmgKQEAgLTgsNiArOCw4IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpZm5kZWYgX0FEMlMxMjEwX0gKKyNkZWZpbmUgX0FEMlMxMjEwX0gKIAogc3RydWN0IGFkMnMxMjEwX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIHNhbXBsZTsKQEAgLTE1LDMgKzE3LDQgQEAKIAl1bnNpZ25lZCByZXNbMl07CiAJYm9vbCBncGlvaW47CiB9OworI2VuZGlmIC8qIF9BRDJTMTIxMF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctYmZpbi10aW1lci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLWJmaW4tdGltZXIuYwppbmRleCAyYWY4ZDY3Li4zYzFjOGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctYmZpbi10aW1lci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1iZmluLXRpbWVyLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCWludCByZXQ7CiAKIAlzdCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0ID09IE5VTEwpCisJaWYgKCFzdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzdC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1wZXJpb2RpYy1ydGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1wZXJpb2RpYy1ydGMuYwppbmRleCBhMjRjYWY3Li4wYzE5NzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctcGVyaW9kaWMtcnRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLXBlcmlvZGljLXJ0Yy5jCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0cnVjdCBpaW9fcHJ0Y190cmlnZ2VyX2luZm8gewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Ci0JaW50IGZyZXF1ZW5jeTsKKwl1bnNpZ25lZCBpbnQgZnJlcXVlbmN5OwogCXN0cnVjdCBydGNfdGFzayB0YXNrOwogCWJvb2wgc3RhdGU7CiB9OwpAQCAtMzYsNyArMzYsNyBAQAogCiAJaWYgKHRyaWdfaW5mby0+ZnJlcXVlbmN5ID09IDAgJiYgc3RhdGUpCiAJCXJldHVybiAtRUlOVkFMOwotCWRldl9kYmcoJnRyaWdfaW5mby0+cnRjLT5kZXYsICJ0cmlnZ2VyIGZyZXF1ZW5jeSBpcyAlZFxuIiwKKwlkZXZfZGJnKCZ0cmlnX2luZm8tPnJ0Yy0+ZGV2LCAidHJpZ2dlciBmcmVxdWVuY3kgaXMgJXVcbiIsCiAJCQl0cmlnX2luZm8tPmZyZXF1ZW5jeSk7CiAJcmV0ID0gcnRjX2lycV9zZXRfc3RhdGUodHJpZ19pbmZvLT5ydGMsICZ0cmlnX2luZm8tPnRhc2ssIHN0YXRlKTsKIAlpZiAocmV0ID09IDApCkBAIC02MiwxMCArNjIsMTAgQEAKIHsKIAlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcgPSB0b19paW9fdHJpZ2dlcihkZXYpOwogCXN0cnVjdCBpaW9fcHJ0Y190cmlnZ2VyX2luZm8gKnRyaWdfaW5mbyA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOwotCWludCB2YWw7CisJdW5zaWduZWQgaW50IHZhbDsKIAlpbnQgcmV0OwogCi0JcmV0ID0ga3N0cnRvaW50KGJ1ZiwgMTAsICZ2YWwpOworCXJldCA9IGtzdHJ0b3VpbnQoYnVmLCAxMCwgJnZhbCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKQEAgLTc0LDEwICs3NCw4IEBACiAJCWlmIChyZXQgPT0gMCAmJiB0cmlnX2luZm8tPnN0YXRlICYmIHRyaWdfaW5mby0+ZnJlcXVlbmN5ID09IDApCiAJCQlyZXQgPSBydGNfaXJxX3NldF9zdGF0ZSh0cmlnX2luZm8tPnJ0YywKIAkJCQkJCSZ0cmlnX2luZm8tPnRhc2ssIDEpOwotCX0gZWxzZSBpZiAodmFsID09IDApIHsKLQkJcmV0ID0gcnRjX2lycV9zZXRfc3RhdGUodHJpZ19pbmZvLT5ydGMsICZ0cmlnX2luZm8tPnRhc2ssIDApOwogCX0gZWxzZQotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBydGNfaXJxX3NldF9zdGF0ZSh0cmlnX2luZm8tPnJ0YywgJnRyaWdfaW5mby0+dGFzaywgMCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKQEAgLTEyNiw3ICsxMjQsNyBAQAogCWludCBpLCByZXQ7CiAKIAlmb3IgKGkgPSAwOzsgaSsrKSB7Ci0JCWlmIChwZGF0YVtpXSA9PSBOVUxMKQorCQlpZiAoIXBkYXRhW2ldKQogCQkJYnJlYWs7CiAJCXRyaWcgPSBpaW9fdHJpZ2dlcl9hbGxvYygicGVyaW9kaWMlcyIsIHBkYXRhW2ldKTsKIAkJaWYgKCF0cmlnKSB7CkBAIC0xNDQsNyArMTQyLDcgQEAKIAkJdHJpZy0+b3BzID0gJmlpb19wcnRjX3RyaWdnZXJfb3BzOwogCQkvKiBSVEMgYWNjZXNzICovCiAJCXRyaWdfaW5mby0+cnRjID0gcnRjX2NsYXNzX29wZW4ocGRhdGFbaV0pOwotCQlpZiAodHJpZ19pbmZvLT5ydGMgPT0gTlVMTCkgeworCQlpZiAoIXRyaWdfaW5mby0+cnRjKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcl9mcmVlX3RyaWdfaW5mbzsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2RlYnVnLmgKaW5kZXggMmU1YTllNS4uODI1MWFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19kZWJ1Zy5oCkBAIC0xOTYsNyArMTk2LDcgQEAKIAkgICAgICAgLm1zZ19mbiAgICAgPSBfX2Z1bmNfXywJCQkJXAogCSAgICAgICAubXNnX2xpbmUgICA9IF9fTElORV9fLAkJCQlcCiAJICAgICAgIC5tc2dfY2RscyAgID0gKGNkbHMpCSB9OwkJCVwKLQlkYXRhbmFtZS5tc2dfbWFzayAgID0gKG1hc2spOworCWRhdGFuYW1lLm1zZ19tYXNrICAgPSAobWFzaykKIAogLyoqCiAgKiBGaWx0ZXJzIG91dCBsb2dnaW5nIG1lc3NhZ2VzIGJhc2VkIG9uIG1hc2sgYW5kIHN1YnN5c3RlbS4KQEAgLTI0NCwxMiArMjQ0LDEyIEBACiAKIGludCBsaWJjZnNfZGVidWdfbXNnKHN0cnVjdCBsaWJjZnNfZGVidWdfbXNnX2RhdGEgKm1zZ2RhdGEsCiAJCQkgICAgY29uc3QgY2hhciAqZm9ybWF0MSwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKwlfX3ByaW50ZigyLCAzKTsKIAogaW50IGxpYmNmc19kZWJ1Z192bXNnMihzdHJ1Y3QgbGliY2ZzX2RlYnVnX21zZ19kYXRhICptc2dkYXRhLAogCQkJICAgICAgY29uc3QgY2hhciAqZm9ybWF0MSwKIAkJCSAgICAgIHZhX2xpc3QgYXJncywgY29uc3QgY2hhciAqZm9ybWF0MiwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKKwlfX3ByaW50Zig0LCA1KTsKIAogLyogb3RoZXIgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IHRyYWNlZmlsZSBwcm92aWRlczogKi8KIGludCBjZnNfdHJhY2VfY29weWluX3N0cmluZyhjaGFyICprbmxfYnVmZmVyLCBpbnQga25sX2J1ZmZlcl9ub2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmgKaW5kZXggODA4ZTQ5NC4uYzQwODE0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaGFzaC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2hhc2guaApAQCAtNDY5LDcgKzQ2OSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGNmc19oYXNoX2tleWNweShzdHJ1Y3QgY2ZzX2hhc2ggKmhzLCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqaG5vZGUsIHZvaWQgKmtleSkKIHsKLSAgICAgICAgaWYgKGhzLT5oc19vcHMtPmhzX2tleWNweSkKKwlpZiAoaHMtPmhzX29wcy0+aHNfa2V5Y3B5KQogCQlocy0+aHNfb3BzLT5oc19rZXljcHkoaG5vZGUsIGtleSk7CiB9CiAKQEAgLTc4NSw4ICs3ODUsOCBAQAogCiAvKiBHZW5lcmljIGRlYnVnIGZvcm1hdHRpbmcgcm91dGluZXMgbWFpbmx5IGZvciBwcm9jIGhhbmRsZXIgKi8KIHN0cnVjdCBzZXFfZmlsZTsKLWludCBjZnNfaGFzaF9kZWJ1Z19oZWFkZXIoc3RydWN0IHNlcV9maWxlICptKTsKLWludCBjZnNfaGFzaF9kZWJ1Z19zdHIoc3RydWN0IGNmc19oYXNoICpocywgc3RydWN0IHNlcV9maWxlICptKTsKK3ZvaWQgY2ZzX2hhc2hfZGVidWdfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSk7Cit2b2lkIGNmc19oYXNoX2RlYnVnX3N0cihzdHJ1Y3QgY2ZzX2hhc2ggKmhzLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwogCiAvKgogICogR2VuZXJpYyBkamIyIGhhc2ggYWxnb3JpdGhtIGZvciBjaGFyYWN0ZXIgYXJyYXlzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfa2VybmVsY29tbS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfa2VybmVsY29tbS5oCmluZGV4IGYxOWExMjEuLmE5ODlkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2tlcm5lbGNvbW0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19rZXJuZWxjb21tLmgKQEAgLTU4LDcgKzU4LDcgQEAKIAlfX3U4ICBrdWNfZmxhZ3M7CiAJX191MTYga3VjX21zZ3R5cGU7ICAgIC8qIE1lc3NhZ2UgdHlwZSBvciBvcGNvZGUsIHRyYW5zcG9ydC1zcGVjaWZpYyAqLwogCV9fdTE2IGt1Y19tc2dsZW47ICAgICAvKiBJbmNsdWRpbmcgaGVhZGVyICovCi19IF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKF9fdTY0KSkpKTsKK30gX19hbGlnbmVkKHNpemVvZihfX3U2NCkpOwogCiAjZGVmaW5lIEtVQ19DSEFOR0VMT0dfTVNHX01BWFNJWkUgKHNpemVvZihzdHJ1Y3Qga3VjX2hkcikrQ1JfTUFYU0laRSkKIApAQCAtMTA3LDcgKzEwNyw3IEBACiAJX191MzIgbGtfZ3JvdXA7CiAJX191MzIgbGtfZGF0YTsKIAlfX3UzMiBsa19mbGFnczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgbHVzdHJlX2tlcm5lbGNvbW07Cit9IF9fcGFja2VkIGx1c3RyZV9rZXJuZWxjb21tOwogCiAvKiBVc2Vyc3BhY2UgbWV0aG9kcyAqLwogaW50IGxpYmNmc191a3VjX3N0YXJ0KGx1c3RyZV9rZXJuZWxjb21tICpsLCBpbnQgZ3JvdXBzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaXZhdGUuaAppbmRleCAzZDg2ZmI1Li5mZWY4ODI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcml2YXRlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpdmF0ZS5oCkBAIC0zMzUsOCArMzM1LDggQEAKICNkZWZpbmUgTEFTU0VSVF9BVE9NSUNfWkVSTyhhKQkJICBMQVNTRVJUX0FUT01JQ19FUShhLCAwKQogI2RlZmluZSBMQVNTRVJUX0FUT01JQ19QT1MoYSkJCSAgIExBU1NFUlRfQVRPTUlDX0dUKGEsIDApCiAKLSNkZWZpbmUgQ0ZTX0FMTE9DX1BUUihwdHIpICAgICAgTElCQ0ZTX0FMTE9DKHB0ciwgc2l6ZW9mKCoocHRyKSkpOwotI2RlZmluZSBDRlNfRlJFRV9QVFIocHRyKSAgICAgICBMSUJDRlNfRlJFRShwdHIsIHNpemVvZigqKHB0cikpKTsKKyNkZWZpbmUgQ0ZTX0FMTE9DX1BUUihwdHIpICAgICAgTElCQ0ZTX0FMTE9DKHB0ciwgc2l6ZW9mKCoocHRyKSkpCisjZGVmaW5lIENGU19GUkVFX1BUUihwdHIpICAgICAgIExJQkNGU19GUkVFKHB0ciwgc2l6ZW9mKCoocHRyKSkpCiAKIC8qCiAgKiBwZXJjcHUgcGFydGl0aW9uIGxvY2sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYwppbmRleCA2NTEwMTY5Li4zYmFkNDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jCkBAIC01Myw4ICs1Myw3IEBACiAKIGtpYl9kYXRhX3QJICAgICAga2libG5kX2RhdGE7CiAKLXN0YXRpYyBfX3UzMgota2libG5kX2Nrc3VtKHZvaWQgKnB0ciwgaW50IG5vYikKK3N0YXRpYyBfX3UzMiBraWJsbmRfY2tzdW0odm9pZCAqcHRyLCBpbnQgbm9iKQogewogCWNoYXIgICpjICA9IHB0cjsKIAlfX3UzMiAgc3VtID0gMDsKQEAgLTY2LDggKzY1LDcgQEAKIAlyZXR1cm4gKHN1bSA9PSAwKSA/IDEgOiBzdW07CiB9CiAKLXN0YXRpYyBjaGFyICoKLWtpYmxuZF9tc2d0eXBlMnN0cihpbnQgdHlwZSkKK3N0YXRpYyBjaGFyICpraWJsbmRfbXNndHlwZTJzdHIoaW50IHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBJQkxORF9NU0dfQ09OTlJFUToKQEAgLTEwNSw4ICsxMDMsNyBAQAogCX0KIH0KIAotc3RhdGljIGludAota2libG5kX21zZ3R5cGUyc2l6ZShpbnQgdHlwZSkKK3N0YXRpYyBpbnQga2libG5kX21zZ3R5cGUyc2l6ZShpbnQgdHlwZSkKIHsKIAljb25zdCBpbnQgaGRyX3NpemUgPSBvZmZzZXRvZihraWJfbXNnX3QsIGlibV91KTsKIApAQCAtMTM5LDE1ICsxMzYsMTQgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF91bnBhY2tfcmQoa2liX21zZ190ICptc2csIGludCBmbGlwKQorc3RhdGljIGludCBraWJsbmRfdW5wYWNrX3JkKGtpYl9tc2dfdCAqbXNnLCBpbnQgZmxpcCkKIHsKIAlraWJfcmRtYV9kZXNjX3QgICAqcmQ7CiAJaW50CQlub2I7CiAJaW50CQluOwogCWludAkJaTsKIAotCUxBU1NFUlQgKG1zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX0dFVF9SRVEgfHwKKwlMQVNTRVJUKG1zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX0dFVF9SRVEgfHwKIAkJIG1zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX1BVVF9BQ0spOwogCiAJcmQgPSBtc2ctPmlibV90eXBlID09IElCTE5EX01TR19HRVRfUkVRID8KQEAgLTE2Nyw3ICsxNjMsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlub2IgPSBvZmZzZXRvZiAoa2liX21zZ190LCBpYm1fdSkgKworCW5vYiA9IG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UpICsKIAkgICAgICBraWJsbmRfcmRfbXNnX3NpemUocmQsIG1zZy0+aWJtX3R5cGUsIG4pOwogCiAJaWYgKG1zZy0+aWJtX25vYiA8IG5vYikgewpAQCAtMTg3LDkgKzE4Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLWtpYmxuZF9wYWNrX21zZyAobG5ldF9uaV90ICpuaSwga2liX21zZ190ICptc2csIGludCB2ZXJzaW9uLAotCQkgaW50IGNyZWRpdHMsIGxuZXRfbmlkX3QgZHN0bmlkLCBfX3U2NCBkc3RzdGFtcCkKK3ZvaWQga2libG5kX3BhY2tfbXNnKGxuZXRfbmlfdCAqbmksIGtpYl9tc2dfdCAqbXNnLCBpbnQgdmVyc2lvbiwKKwkJICAgICBpbnQgY3JlZGl0cywgbG5ldF9uaWRfdCBkc3RuaWQsIF9fdTY0IGRzdHN0YW1wKQogewogCWtpYl9uZXRfdCAqbmV0ID0gbmktPm5pX2RhdGE7CiAKQEAgLTIxMiw4ICsyMDcsNyBAQAogCX0KIH0KIAotaW50Ci1raWJsbmRfdW5wYWNrX21zZyhraWJfbXNnX3QgKm1zZywgaW50IG5vYikKK2ludCBraWJsbmRfdW5wYWNrX21zZyhraWJfbXNnX3QgKm1zZywgaW50IG5vYikKIHsKIAljb25zdCBpbnQgaGRyX3NpemUgPSBvZmZzZXRvZihraWJfbXNnX3QsIGlibV91KTsKIAlfX3UzMiAgICAgbXNnX2Nrc3VtOwpAQCAtMjY5LDggKzI2Myw4IEBACiAJaWYgKGZsaXApIHsKIAkJLyogbGVhdmUgbWFnaWMgdW5mbGlwcGVkIGFzIGEgY2x1ZSB0byBwZWVyIGVuZGlhbm5lc3MgKi8KIAkJbXNnLT5pYm1fdmVyc2lvbiA9IHZlcnNpb247Ci0JCUNMQVNTRVJUIChzaXplb2YobXNnLT5pYm1fdHlwZSkgPT0gMSk7Ci0JCUNMQVNTRVJUIChzaXplb2YobXNnLT5pYm1fY3JlZGl0cykgPT0gMSk7CisJCUNMQVNTRVJUKHNpemVvZihtc2ctPmlibV90eXBlKSA9PSAxKTsKKwkJQ0xBU1NFUlQoc2l6ZW9mKG1zZy0+aWJtX2NyZWRpdHMpID09IDEpOwogCQltc2ctPmlibV9ub2IgICAgID0gbXNnX25vYjsKIAkJX19zd2FiNjRzKCZtc2ctPmlibV9zcmNuaWQpOwogCQlfX3N3YWI2NHMoJm1zZy0+aWJtX3NyY3N0YW1wKTsKQEAgLTMyNCw4ICszMTgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQKLWtpYmxuZF9jcmVhdGVfcGVlcihsbmV0X25pX3QgKm5pLCBraWJfcGVlcl90ICoqcGVlcnAsIGxuZXRfbmlkX3QgbmlkKQoraW50IGtpYmxuZF9jcmVhdGVfcGVlcihsbmV0X25pX3QgKm5pLCBraWJfcGVlcl90ICoqcGVlcnAsIGxuZXRfbmlkX3QgbmlkKQogewogCWtpYl9wZWVyX3QJKnBlZXI7CiAJa2liX25ldF90CSpuZXQgPSBuaS0+bmlfZGF0YTsKQEAgLTM1Niw3ICszNDksNyBAQAogCXdyaXRlX2xvY2tfaXJxc2F2ZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKIAkvKiBhbHdheXMgY2FsbGVkIHdpdGggYSByZWYgb24gbmksIHdoaWNoIHByZXZlbnRzIG5pIGJlaW5nIHNodXRkb3duICovCi0JTEFTU0VSVCAobmV0LT5pYm5fc2h1dGRvd24gPT0gMCk7CisJTEFTU0VSVChuZXQtPmlibl9zaHV0ZG93biA9PSAwKTsKIAogCS8qIG5wZWVycyBvbmx5IGdyb3dzIHdpdGggdGhlIGdsb2JhbCBsb2NrIGhlbGQgKi8KIAlhdG9taWNfaW5jKCZuZXQtPmlibl9ucGVlcnMpOwpAQCAtMzY3LDE4ICszNjAsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAota2libG5kX2Rlc3Ryb3lfcGVlciAoa2liX3BlZXJfdCAqcGVlcikKK3ZvaWQga2libG5kX2Rlc3Ryb3lfcGVlcihraWJfcGVlcl90ICpwZWVyKQogewogCWtpYl9uZXRfdCAqbmV0ID0gcGVlci0+aWJwX25pLT5uaV9kYXRhOwogCi0JTEFTU0VSVCAobmV0ICE9IE5VTEwpOwotCUxBU1NFUlQgKGF0b21pY19yZWFkKCZwZWVyLT5pYnBfcmVmY291bnQpID09IDApOwotCUxBU1NFUlQgKCFraWJsbmRfcGVlcl9hY3RpdmUocGVlcikpOwotCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID09IDApOwotCUxBU1NFUlQgKHBlZXItPmlicF9hY2NlcHRpbmcgPT0gMCk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+aWJwX3R4X3F1ZXVlKSk7CisJTEFTU0VSVChuZXQgIT0gTlVMTCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmcGVlci0+aWJwX3JlZmNvdW50KSA9PSAwKTsKKwlMQVNTRVJUKCFraWJsbmRfcGVlcl9hY3RpdmUocGVlcikpOworCUxBU1NFUlQocGVlci0+aWJwX2Nvbm5lY3RpbmcgPT0gMCk7CisJTEFTU0VSVChwZWVyLT5pYnBfYWNjZXB0aW5nID09IDApOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKTsKIAogCUxJQkNGU19GUkVFKHBlZXIsIHNpemVvZigqcGVlcikpOwogCkBAIC0zODksOCArMzgxLDcgQEAKIAlhdG9taWNfZGVjKCZuZXQtPmlibl9ucGVlcnMpOwogfQogCi1raWJfcGVlcl90ICoKLWtpYmxuZF9maW5kX3BlZXJfbG9ja2VkIChsbmV0X25pZF90IG5pZCkKK2tpYl9wZWVyX3QgKmtpYmxuZF9maW5kX3BlZXJfbG9ja2VkKGxuZXRfbmlkX3QgbmlkKQogewogCS8qIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFjY291bnRpbmcgdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlCiAJICogdGhhdCB0aGlzIGNyZWF0ZXMgKi8KQEAgLTM5OCwxMSArMzg5LDExIEBACiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAqdG1wOwogCWtpYl9wZWVyX3QgICAgICAgKnBlZXI7CiAKLQlsaXN0X2Zvcl9lYWNoICh0bXAsIHBlZXJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2godG1wLCBwZWVyX2xpc3QpIHsKIAogCQlwZWVyID0gbGlzdF9lbnRyeSh0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKIAotCQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KKwkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KIAkJCSBwZWVyLT5pYnBfYWNjZXB0aW5nID4gMCB8fAogCQkJICFsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsgIC8qIGFjdGl2ZSBjb25uICovCiAKQEAgLTQxOCwyMCArNDA5LDE4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQKLWtpYmxuZF91bmxpbmtfcGVlcl9sb2NrZWQgKGtpYl9wZWVyX3QgKnBlZXIpCit2b2lkIGtpYmxuZF91bmxpbmtfcGVlcl9sb2NrZWQoa2liX3BlZXJfdCAqcGVlcikKIHsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCi0JTEFTU0VSVCAoa2libG5kX3BlZXJfYWN0aXZlKHBlZXIpKTsKKwlMQVNTRVJUKGtpYmxuZF9wZWVyX2FjdGl2ZShwZWVyKSk7CiAJbGlzdF9kZWxfaW5pdCgmcGVlci0+aWJwX2xpc3QpOwogCS8qIGxvc2UgcGVlcmxpc3QncyByZWYgKi8KIAlraWJsbmRfcGVlcl9kZWNyZWYocGVlcik7CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF9nZXRfcGVlcl9pbmZvKGxuZXRfbmlfdCAqbmksIGludCBpbmRleCwKLQkJICAgICAgbG5ldF9uaWRfdCAqbmlkcCwgaW50ICpjb3VudCkKK3N0YXRpYyBpbnQga2libG5kX2dldF9wZWVyX2luZm8obG5ldF9uaV90ICpuaSwgaW50IGluZGV4LAorCQkJCWxuZXRfbmlkX3QgKm5pZHAsIGludCAqY291bnQpCiB7CiAJa2liX3BlZXJfdAkgICAgKnBlZXI7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgKnB0bXA7CkBAIC00NDIsMTAgKzQzMSwxMCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKSB7CiAKLQkJbGlzdF9mb3JfZWFjaCAocHRtcCwgJmtpYmxuZF9kYXRhLmtpYl9wZWVyc1tpXSkgeworCQlsaXN0X2Zvcl9lYWNoKHB0bXAsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKIAogCQkJcGVlciA9IGxpc3RfZW50cnkocHRtcCwga2liX3BlZXJfdCwgaWJwX2xpc3QpOwotCQkJTEFTU0VSVCAocGVlci0+aWJwX2Nvbm5lY3RpbmcgPiAwIHx8CisJCQlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAogCQkJCSBwZWVyLT5pYnBfYWNjZXB0aW5nID4gMCB8fAogCQkJCSAhbGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7CiAKQEAgLTQ2OCw4ICs0NTcsNyBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2RlbF9wZWVyX2xvY2tlZChraWJfcGVlcl90ICpwZWVyKQorc3RhdGljIHZvaWQga2libG5kX2RlbF9wZWVyX2xvY2tlZChraWJfcGVlcl90ICpwZWVyKQogewogCXN0cnVjdCBsaXN0X2hlYWQJICAgKmN0bXA7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAqY254dDsKQEAgLTQ3OCw3ICs0NjYsNyBAQAogCWlmIChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKSB7CiAJCWtpYmxuZF91bmxpbmtfcGVlcl9sb2NrZWQocGVlcik7CiAJfSBlbHNlIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlIChjdG1wLCBjbnh0LCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShjdG1wLCBjbnh0LCAmcGVlci0+aWJwX2Nvbm5zKSB7CiAJCQljb25uID0gbGlzdF9lbnRyeShjdG1wLCBraWJfY29ubl90LCBpYmNfbGlzdCk7CiAKIAkJCWtpYmxuZF9jbG9zZV9jb25uX2xvY2tlZChjb25uLCAwKTsKQEAgLTQ4OSwxMCArNDc3LDkgQEAKIAkgKiBsYXN0IHJlZiBvbiBpdC4gKi8KIH0KIAotc3RhdGljIGludAota2libG5kX2RlbF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQorc3RhdGljIGludCBraWJsbmRfZGVsX3BlZXIobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBuaWQpCiB7Ci0JTElTVF9IRUFECSAoem9tYmllcyk7CisJTElTVF9IRUFEKHpvbWJpZXMpOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpwdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpwbnh0OwogCWtpYl9wZWVyX3QJICAgICpwZWVyOwpAQCAtNTEyLDkgKzQ5OSw5IEBACiAJfQogCiAJZm9yIChpID0gbG87IGkgPD0gaGk7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHB0bXAsIHBueHQsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0bXAsIHBueHQsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKIAkJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKLQkJCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwKIAkJCQkgcGVlci0+aWJwX2FjY2VwdGluZyA+IDAgfHwKIAkJCQkgIWxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCkBAIC01MjUsNyArNTEyLDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKSB7Ci0JCQkJTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7CisJCQkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsKIAogCQkJCWxpc3Rfc3BsaWNlX2luaXQoJnBlZXItPmlicF90eF9xdWV1ZSwKIAkJCQkJCSAgICAgJnpvbWJpZXMpOwpAQCAtNTQzLDggKzUzMCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMga2liX2Nvbm5fdCAqCi1raWJsbmRfZ2V0X2Nvbm5fYnlfaWR4KGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKK3N0YXRpYyBraWJfY29ubl90ICpraWJsbmRfZ2V0X2Nvbm5fYnlfaWR4KGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKIHsKIAlraWJfcGVlcl90CSAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAqcHRtcDsKQEAgLTU1NiwyNSArNTQyLDI2IEBACiAJcmVhZF9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwogCiAJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2ggKHB0bXAsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKKwkJbGlzdF9mb3JfZWFjaChwdG1wLCAma2libG5kX2RhdGEua2liX3BlZXJzW2ldKSB7CiAKIAkJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKLQkJCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwKIAkJCQkgcGVlci0+aWJwX2FjY2VwdGluZyA+IDAgfHwKIAkJCQkgIWxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCiAJCQlpZiAocGVlci0+aWJwX25pICE9IG5pKQogCQkJCWNvbnRpbnVlOwogCi0JCQlsaXN0X2Zvcl9lYWNoIChjdG1wLCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJCQlsaXN0X2Zvcl9lYWNoKGN0bXAsICZwZWVyLT5pYnBfY29ubnMpIHsKIAkJCQlpZiAoaW5kZXgtLSA+IDApCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga2liX2Nvbm5fdCwKIAkJCQkJCSAgICAgIGliY19saXN0KTsKIAkJCQlraWJsbmRfY29ubl9hZGRyZWYoY29ubik7Ci0JCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLAotCQkJCQkJICAgICAgIGZsYWdzKTsKKwkJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLAorCQkJCQlmbGFncyk7CiAJCQkJcmV0dXJuIGNvbm47CiAJCQl9CiAJCX0KQEAgLTU4NCw4ICs1NzEsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQKLWtpYmxuZF90cmFuc2xhdGVfbXR1KGludCB2YWx1ZSkKK2ludCBraWJsbmRfdHJhbnNsYXRlX210dShpbnQgdmFsdWUpCiB7CiAJc3dpdGNoICh2YWx1ZSkgewogCWRlZmF1bHQ6CkBAIC02MDUsOCArNTkxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfc2V0dXBfbXR1X2xvY2tlZChzdHJ1Y3QgcmRtYV9jbV9pZCAqY21pZCkKK3N0YXRpYyB2b2lkIGtpYmxuZF9zZXR1cF9tdHVfbG9ja2VkKHN0cnVjdCByZG1hX2NtX2lkICpjbWlkKQogewogCWludAkgICBtdHU7CiAKQEAgLTYxNSwxMyArNjAwLDEyIEBACiAJCXJldHVybjsKIAogCW10dSA9IGtpYmxuZF90cmFuc2xhdGVfbXR1KCpraWJsbmRfdHVuYWJsZXMua2liX2liX210dSk7Ci0JTEFTU0VSVCAobXR1ID49IDApOworCUxBU1NFUlQobXR1ID49IDApOwogCWlmIChtdHUgIT0gMCkKIAkJY21pZC0+cm91dGUucGF0aF9yZWMtPm10dSA9IG10dTsKIH0KIAotc3RhdGljIGludAota2libG5kX2dldF9jb21wbGV0aW9uX3ZlY3RvcihraWJfY29ubl90ICpjb25uLCBpbnQgY3B0KQorc3RhdGljIGludCBraWJsbmRfZ2V0X2NvbXBsZXRpb25fdmVjdG9yKGtpYl9jb25uX3QgKmNvbm4sIGludCBjcHQpCiB7CiAJY3B1bWFza190CSptYXNrOwogCWludAkJdmVjdG9yczsKQEAgLTYzOCw4ICs2MjIsOCBAQAogCQlyZXR1cm4gMDsKIAogCS8qIGhhc2ggTklEIHRvIENQVSBpZCBpbiB0aGlzIHBhcnRpdGlvbi4uLiAqLwotCW9mZiA9IGRvX2RpdihuaWQsIGNwdXNfd2VpZ2h0KCptYXNrKSk7Ci0JZm9yX2VhY2hfY3B1X21hc2soaSwgKm1hc2spIHsKKwlvZmYgPSBkb19kaXYobmlkLCBjcHVtYXNrX3dlaWdodChtYXNrKSk7CisJZm9yX2VhY2hfY3B1KGksIG1hc2spIHsKIAkJaWYgKG9mZi0tID09IDApCiAJCQlyZXR1cm4gaSAlIHZlY3RvcnM7CiAJfQpAQCAtNjQ4LDkgKzYzMiw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLWtpYl9jb25uX3QgKgota2libG5kX2NyZWF0ZV9jb25uKGtpYl9wZWVyX3QgKnBlZXIsIHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLAotCQkgICBpbnQgc3RhdGUsIGludCB2ZXJzaW9uKQora2liX2Nvbm5fdCAqa2libG5kX2NyZWF0ZV9jb25uKGtpYl9wZWVyX3QgKnBlZXIsIHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLAorCQkJCWludCBzdGF0ZSwgaW50IHZlcnNpb24pCiB7CiAJLyogQ0FWRUFUIEVNUFRPUjoKIAkgKiBJZiB0aGUgbmV3IGNvbm4gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgaXQgdGFrZXMgb3ZlciB0aGUgY2FsbGVyJ3MKQEAgLTgzNSw3ICs4MTgsNyBAQAogCX0KIAogCS8qIEluaXQgc3VjY2Vzc2Z1bCEgKi8KLQlMQVNTRVJUIChzdGF0ZSA9PSBJQkxORF9DT05OX0FDVElWRV9DT05ORUNUIHx8CisJTEFTU0VSVChzdGF0ZSA9PSBJQkxORF9DT05OX0FDVElWRV9DT05ORUNUIHx8CiAJCSBzdGF0ZSA9PSBJQkxORF9DT05OX1BBU1NJVkVfV0FJVCk7CiAJY29ubi0+aWJjX3N0YXRlID0gc3RhdGU7CiAKQEAgLTg1MSwyMyArODM0LDIyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQKLWtpYmxuZF9kZXN0cm95X2Nvbm4gKGtpYl9jb25uX3QgKmNvbm4pCit2b2lkIGtpYmxuZF9kZXN0cm95X2Nvbm4oa2liX2Nvbm5fdCAqY29ubikKIHsKIAlzdHJ1Y3QgcmRtYV9jbV9pZCAqY21pZCA9IGNvbm4tPmliY19jbWlkOwogCWtpYl9wZWVyX3QJKnBlZXIgPSBjb25uLT5pYmNfcGVlcjsKIAlpbnQJCXJjOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmY29ubi0+aWJjX3JlZmNvdW50KSA9PSAwKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25uLT5pYmNfZWFybHlfcnhzKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X25vb3BzKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlX3JzcnZkKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlX25vY3JlZCkpOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmNvbm4tPmliY19hY3RpdmVfdHhzKSk7Ci0JTEFTU0VSVCAoY29ubi0+aWJjX25vb3BzX3Bvc3RlZCA9PSAwKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfbnNlbmRzX3Bvc3RlZCA9PSAwKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+aWJjX3JlZmNvdW50KSA9PSAwKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY19lYXJseV9yeHMpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY190eF9ub29wcykpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZjb25uLT5pYmNfdHhfcXVldWVfcnNydmQpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY190eF9xdWV1ZV9ub2NyZWQpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY19hY3RpdmVfdHhzKSk7CisJTEFTU0VSVChjb25uLT5pYmNfbm9vcHNfcG9zdGVkID09IDApOworCUxBU1NFUlQoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPT0gMCk7CiAKIAlzd2l0Y2ggKGNvbm4tPmliY19zdGF0ZSkgewogCWRlZmF1bHQ6CkBAIC04NzYsNyArODU4LDcgQEAKIAogCWNhc2UgSUJMTkRfQ09OTl9ESVNDT05ORUNURUQ6CiAJCS8qIGNvbm52YXJzIHNob3VsZCBoYXZlIGJlZW4gZnJlZWQgYWxyZWFkeSAqLwotCQlMQVNTRVJUIChjb25uLT5pYmNfY29ubnZhcnMgPT0gTlVMTCk7CisJCUxBU1NFUlQoY29ubi0+aWJjX2Nvbm52YXJzID09IE5VTEwpOwogCQlicmVhazsKIAogCWNhc2UgSUJMTkRfQ09OTl9JTklUOgpAQCAtODk4LDcgKzg4MCw4IEBACiAKIAlpZiAoY29ubi0+aWJjX3J4cyAhPSBOVUxMKSB7CiAJCUxJQkNGU19GUkVFKGNvbm4tPmliY19yeHMsCi0JCQkgICAgSUJMTkRfUlhfTVNHUyhjb25uLT5pYmNfdmVyc2lvbikgKiBzaXplb2Yoa2liX3J4X3QpKTsKKwkJCSAgICBJQkxORF9SWF9NU0dTKGNvbm4tPmliY192ZXJzaW9uKQorCQkJICAgICAgKiBzaXplb2Yoa2liX3J4X3QpKTsKIAl9CiAKIAlpZiAoY29ubi0+aWJjX2Nvbm52YXJzICE9IE5VTEwpCkBAIC05MTksMTUgKzkwMiwxNCBAQAogCUxJQkNGU19GUkVFKGNvbm4sIHNpemVvZigqY29ubikpOwogfQogCi1pbnQKLWtpYmxuZF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZCAoa2liX3BlZXJfdCAqcGVlciwgaW50IHdoeSkKK2ludCBraWJsbmRfY2xvc2VfcGVlcl9jb25uc19sb2NrZWQoa2liX3BlZXJfdCAqcGVlciwgaW50IHdoeSkKIHsKIAlraWJfY29ubl90CSAgICAgKmNvbm47CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICpjdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAqY254dDsKIAlpbnQJCSAgICAgY291bnQgPSAwOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlIChjdG1wLCBjbnh0LCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGN0bXAsIGNueHQsICZwZWVyLT5pYnBfY29ubnMpIHsKIAkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga2liX2Nvbm5fdCwgaWJjX2xpc3QpOwogCiAJCUNERUJVRyhEX05FVCwgIkNsb3NpbmcgY29ubiAtPiAlcywgdmVyc2lvbjogJXgsIHJlYXNvbjogJWRcbiIsCkBAIC05NDEsMjMgKzkyMywyMyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotaW50Ci1raWJsbmRfY2xvc2Vfc3RhbGVfY29ubnNfbG9ja2VkIChraWJfcGVlcl90ICpwZWVyLAotCQkJCSBpbnQgdmVyc2lvbiwgX191NjQgaW5jYXJuYXRpb24pCitpbnQga2libG5kX2Nsb3NlX3N0YWxlX2Nvbm5zX2xvY2tlZChraWJfcGVlcl90ICpwZWVyLAorCQkJCSAgICAgaW50IHZlcnNpb24sIF9fdTY0IGluY2FybmF0aW9uKQogewogCWtpYl9jb25uX3QJICAgICAqY29ubjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgKmN0bXA7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICpjbnh0OwogCWludAkJICAgICBjb3VudCA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGN0bXAsIGNueHQsICZwZWVyLT5pYnBfY29ubnMpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoY3RtcCwgY254dCwgJnBlZXItPmlicF9jb25ucykgewogCQljb25uID0gbGlzdF9lbnRyeShjdG1wLCBraWJfY29ubl90LCBpYmNfbGlzdCk7CiAKIAkJaWYgKGNvbm4tPmliY192ZXJzaW9uICAgICA9PSB2ZXJzaW9uICYmCiAJCSAgICBjb25uLT5pYmNfaW5jYXJuYXRpb24gPT0gaW5jYXJuYXRpb24pCiAJCQljb250aW51ZTsKIAotCQlDREVCVUcoRF9ORVQsICJDbG9zaW5nIHN0YWxlIGNvbm4gLT4gJXMgdmVyc2lvbjogJXgsIGluY2FybmF0aW9uOiUjbGx4KCV4LCAlI2xseClcbiIsCisJCUNERUJVRyhEX05FVCwKKwkJICAgICAgICJDbG9zaW5nIHN0YWxlIGNvbm4gLT4gJXMgdmVyc2lvbjogJXgsIGluY2FybmF0aW9uOiUjbGx4KCV4LCAlI2xseClcbiIsCiAJCSAgICAgICBsaWJjZnNfbmlkMnN0cihwZWVyLT5pYnBfbmlkKSwKIAkJICAgICAgIGNvbm4tPmliY192ZXJzaW9uLCBjb25uLT5pYmNfaW5jYXJuYXRpb24sCiAJCSAgICAgICB2ZXJzaW9uLCBpbmNhcm5hdGlvbik7CkBAIC05NjksOCArOTUxLDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF9jbG9zZV9tYXRjaGluZ19jb25ucyhsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCkKK3N0YXRpYyBpbnQga2libG5kX2Nsb3NlX21hdGNoaW5nX2Nvbm5zKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQogewogCWtpYl9wZWVyX3QJICAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgKnB0bXA7CkBAIC05OTEsMTAgKzk3MiwxMCBAQAogCX0KIAogCWZvciAoaSA9IGxvOyBpIDw9IGhpOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlIChwdG1wLCBwbnh0LCAma2libG5kX2RhdGEua2liX3BlZXJzW2ldKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdG1wLCBwbnh0LCAma2libG5kX2RhdGEua2liX3BlZXJzW2ldKSB7CiAKIAkJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKLQkJCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwKIAkJCQkgcGVlci0+aWJwX2FjY2VwdGluZyA+IDAgfHwKIAkJCQkgIWxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCkBAIC0xMDE3LDggKzk5OCw3IEBACiAJcmV0dXJuIChjb3VudCA9PSAwKSA/IC1FTk9FTlQgOiAwOwogfQogCi1pbnQKLWtpYmxuZF9jdGwobG5ldF9uaV90ICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoraW50IGtpYmxuZF9jdGwobG5ldF9uaV90ICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBsaWJjZnNfaW9jdGxfZGF0YSAqZGF0YSA9IGFyZzsKIAlpbnQJCSAgICAgICByYyA9IC1FSU5WQUw7CkBAIC0xMDQ5LDcgKzEwMjksNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlMQVNTRVJUIChjb25uLT5pYmNfY21pZCAhPSBOVUxMKTsKKwkJTEFTU0VSVChjb25uLT5pYmNfY21pZCAhPSBOVUxMKTsKIAkJZGF0YS0+aW9jX25pZCA9IGNvbm4tPmliY19wZWVyLT5pYnBfbmlkOwogCQlpZiAoY29ubi0+aWJjX2NtaWQtPnJvdXRlLnBhdGhfcmVjID09IE5VTEwpCiAJCQlkYXRhLT5pb2NfdTMyWzBdID0gMDsgLyogaVdhcnAgaGFzIG5vIHBhdGggTVRVICovCkBAIC0xMDcxLDggKzEwNTEsNyBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZAota2libG5kX3F1ZXJ5IChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgdW5zaWduZWQgbG9uZyAqd2hlbikKK3ZvaWQga2libG5kX3F1ZXJ5KGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkLCB1bnNpZ25lZCBsb25nICp3aGVuKQogewogCXVuc2lnbmVkIGxvbmcJbGFzdF9hbGl2ZSA9IDA7CiAJdW5zaWduZWQgbG9uZwlub3cgPSBjZnNfdGltZV9jdXJyZW50KCk7CkBAIC0xMDg0LDcgKzEwNjMsNyBAQAogCiAJcGVlciA9IGtpYmxuZF9maW5kX3BlZXJfbG9ja2VkKG5pZCk7CiAJaWYgKHBlZXIgIT0gTlVMTCkgewotCQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KKwkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KIAkJCSBwZWVyLT5pYnBfYWNjZXB0aW5nID4gMCB8fAogCQkJICFsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsgIC8qIGFjdGl2ZSBjb25uICovCiAJCWxhc3RfYWxpdmUgPSBwZWVyLT5pYnBfbGFzdF9hbGl2ZTsKQEAgLTExMDMsMTEgKzEwODIsOSBAQAogCUNERUJVRyhEX05FVCwgIlBlZXIgJXMgJXAsIGFsaXZlICVsZCBzZWNzIGFnb1xuIiwKIAkgICAgICAgbGliY2ZzX25pZDJzdHIobmlkKSwgcGVlciwKIAkgICAgICAgbGFzdF9hbGl2ZSA/IGNmc19kdXJhdGlvbl9zZWMobm93IC0gbGFzdF9hbGl2ZSkgOiAtMSk7Ci0JcmV0dXJuOwogfQogCi12b2lkCi1raWJsbmRfZnJlZV9wYWdlcyhraWJfcGFnZXNfdCAqcCkKK3ZvaWQga2libG5kX2ZyZWVfcGFnZXMoa2liX3BhZ2VzX3QgKnApCiB7CiAJaW50CW5wYWdlcyA9IHAtPmlicF9ucGFnZXM7CiAJaW50CWk7CkBAIC0xMTIwLDggKzEwOTcsNyBAQAogCUxJQkNGU19GUkVFKHAsIG9mZnNldG9mKGtpYl9wYWdlc190LCBpYnBfcGFnZXNbbnBhZ2VzXSkpOwogfQogCi1pbnQKLWtpYmxuZF9hbGxvY19wYWdlcyhraWJfcGFnZXNfdCAqKnBwLCBpbnQgY3B0LCBpbnQgbnBhZ2VzKQoraW50IGtpYmxuZF9hbGxvY19wYWdlcyhraWJfcGFnZXNfdCAqKnBwLCBpbnQgY3B0LCBpbnQgbnBhZ2VzKQogewogCWtpYl9wYWdlc190CSpwOwogCWludAkJaTsKQEAgLTExNTEsMTkgKzExMjcsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAota2libG5kX3VubWFwX3J4X2Rlc2NzKGtpYl9jb25uX3QgKmNvbm4pCit2b2lkIGtpYmxuZF91bm1hcF9yeF9kZXNjcyhraWJfY29ubl90ICpjb25uKQogewogCWtpYl9yeF90ICpyeDsKIAlpbnQgICAgICAgaTsKIAotCUxBU1NFUlQgKGNvbm4tPmliY19yeHMgIT0gTlVMTCk7Ci0JTEFTU0VSVCAoY29ubi0+aWJjX2hkZXYgIT0gTlVMTCk7CisJTEFTU0VSVChjb25uLT5pYmNfcnhzICE9IE5VTEwpOworCUxBU1NFUlQoY29ubi0+aWJjX2hkZXYgIT0gTlVMTCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUJMTkRfUlhfTVNHUyhjb25uLT5pYmNfdmVyc2lvbik7IGkrKykgewogCQlyeCA9ICZjb25uLT5pYmNfcnhzW2ldOwogCi0JCUxBU1NFUlQgKHJ4LT5yeF9ub2IgPj0gMCk7IC8qIG5vdCBwb3N0ZWQgKi8KKwkJTEFTU0VSVChyeC0+cnhfbm9iID49IDApOyAvKiBub3QgcG9zdGVkICovCiAKIAkJa2libG5kX2RtYV91bm1hcF9zaW5nbGUoY29ubi0+aWJjX2hkZXYtPmliaF9pYmRldiwKIAkJCQkJS0lCTE5EX1VOTUFQX0FERFIocngsIHJ4X21zZ3VubWFwLApAQCAtMTE3Niw4ICsxMTUxLDcgQEAKIAljb25uLT5pYmNfcnhfcGFnZXMgPSBOVUxMOwogfQogCi12b2lkCi1raWJsbmRfbWFwX3J4X2Rlc2NzKGtpYl9jb25uX3QgKmNvbm4pCit2b2lkIGtpYmxuZF9tYXBfcnhfZGVzY3Moa2liX2Nvbm5fdCAqY29ubikKIHsKIAlraWJfcnhfdCAgICAgICAqcng7CiAJc3RydWN0IHBhZ2UgICAgKnBnOwpAQCAtMTE5NCw5ICsxMTY4LDEwIEBACiAJCXJ4LT5yeF9tc2cgPSAoa2liX21zZ190ICopKCgoY2hhciAqKXBhZ2VfYWRkcmVzcyhwZykpICsgcGdfb2ZmKTsKIAogCQlyeC0+cnhfbXNnYWRkciA9IGtpYmxuZF9kbWFfbWFwX3NpbmdsZShjb25uLT5pYmNfaGRldi0+aWJoX2liZGV2LAotCQkJCQkJICAgICAgIHJ4LT5yeF9tc2csIElCTE5EX01TR19TSVpFLAorCQkJCQkJICAgICAgIHJ4LT5yeF9tc2csCisJCQkJCQkgICAgICAgSUJMTkRfTVNHX1NJWkUsCiAJCQkJCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJTEFTU0VSVCAoIWtpYmxuZF9kbWFfbWFwcGluZ19lcnJvcihjb25uLT5pYmNfaGRldi0+aWJoX2liZGV2LAorCQlMQVNTRVJUKCFraWJsbmRfZG1hX21hcHBpbmdfZXJyb3IoY29ubi0+aWJjX2hkZXYtPmliaF9pYmRldiwKIAkJCQkJCSAgIHJ4LT5yeF9tc2dhZGRyKSk7CiAJCUtJQkxORF9VTk1BUF9BRERSX1NFVChyeCwgcnhfbXNndW5tYXAsIHJ4LT5yeF9tc2dhZGRyKTsKIApAQCAtMTIwNSwyNCArMTE4MCwyMyBAQAogCQkgICAgICAgbG5ldF9wYWdlMnBoeXMocGcpICsgcGdfb2ZmKTsKIAogCQlwZ19vZmYgKz0gSUJMTkRfTVNHX1NJWkU7Ci0JCUxBU1NFUlQgKHBnX29mZiA8PSBQQUdFX1NJWkUpOworCQlMQVNTRVJUKHBnX29mZiA8PSBQQUdFX1NJWkUpOwogCiAJCWlmIChwZ19vZmYgPT0gUEFHRV9TSVpFKSB7CiAJCQlwZ19vZmYgPSAwOwogCQkJaXBnKys7Ci0JCQlMQVNTRVJUIChpcGcgPD0gSUJMTkRfUlhfTVNHX1BBR0VTKGNvbm4tPmliY192ZXJzaW9uKSk7CisJCQlMQVNTRVJUKGlwZyA8PSBJQkxORF9SWF9NU0dfUEFHRVMoY29ubi0+aWJjX3ZlcnNpb24pKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF91bm1hcF90eF9wb29sKGtpYl90eF9wb29sX3QgKnRwbykKK3N0YXRpYyB2b2lkIGtpYmxuZF91bm1hcF90eF9wb29sKGtpYl90eF9wb29sX3QgKnRwbykKIHsKIAlraWJfaGNhX2Rldl90ICAqaGRldiA9IHRwby0+dHBvX2hkZXY7CiAJa2liX3R4X3QgICAgICAgKnR4OwogCWludAkgICAgIGk7CiAKLQlMQVNTRVJUICh0cG8tPnRwb19wb29sLnBvX2FsbG9jYXRlZCA9PSAwKTsKKwlMQVNTRVJUKHRwby0+dHBvX3Bvb2wucG9fYWxsb2NhdGVkID09IDApOwogCiAJaWYgKGhkZXYgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTIzOSw4ICsxMjEzLDcgQEAKIAl0cG8tPnRwb19oZGV2ID0gTlVMTDsKIH0KIAotc3RhdGljIGtpYl9oY2FfZGV2X3QgKgota2libG5kX2N1cnJlbnRfaGRldihraWJfZGV2X3QgKmRldikKK3N0YXRpYyBraWJfaGNhX2Rldl90ICpraWJsbmRfY3VycmVudF9oZGV2KGtpYl9kZXZfdCAqZGV2KQogewogCWtpYl9oY2FfZGV2X3QgKmhkZXY7CiAJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CkBAIC0xMjY1LDggKzEyMzgsNyBAQAogCXJldHVybiBoZGV2OwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX21hcF90eF9wb29sKGtpYl90eF9wb29sX3QgKnRwbykKK3N0YXRpYyB2b2lkIGtpYmxuZF9tYXBfdHhfcG9vbChraWJfdHhfcG9vbF90ICp0cG8pCiB7CiAJa2liX3BhZ2VzX3QgICAgKnR4cGdzID0gdHBvLT50cG9fdHhfcGFnZXM7CiAJa2liX3Bvb2xfdCAgICAgKnBvb2wgID0gJnRwby0+dHBvX3Bvb2w7CkBAIC0xMjc4LDE1ICsxMjUwLDE1IEBACiAJaW50CSAgICAgaXBhZ2U7CiAJaW50CSAgICAgaTsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCWRldiA9IG5ldC0+aWJuX2RldjsKIAogCS8qIHByZS1tYXBwZWQgbWVzc2FnZXMgYXJlIG5vdCBiaWdnZXIgdGhhbiAxIHBhZ2UgKi8KLQlDTEFTU0VSVCAoSUJMTkRfTVNHX1NJWkUgPD0gUEFHRV9TSVpFKTsKKwlDTEFTU0VSVChJQkxORF9NU0dfU0laRSA8PSBQQUdFX1NJWkUpOwogCiAJLyogTm8gZmFuY3kgYXJpdGhtZXRpYyB3aGVuIHdlIGRvIHRoZSBidWZmZXIgY2FsY3VsYXRpb25zICovCi0JQ0xBU1NFUlQgKFBBR0VfU0laRSAlIElCTE5EX01TR19TSVpFID09IDApOworCUNMQVNTRVJUKFBBR0VfU0laRSAlIElCTE5EX01TR19TSVpFID09IDApOwogCiAJdHBvLT50cG9faGRldiA9IGtpYmxuZF9jdXJyZW50X2hkZXYoZGV2KTsKIApAQCAtMTMwMCwyOSArMTI3MiwyOCBAQAogCQl0eC0+dHhfbXNnYWRkciA9IGtpYmxuZF9kbWFfbWFwX3NpbmdsZSgKIAkJCXRwby0+dHBvX2hkZXYtPmliaF9pYmRldiwgdHgtPnR4X21zZywKIAkJCUlCTE5EX01TR19TSVpFLCBETUFfVE9fREVWSUNFKTsKLQkJTEFTU0VSVCAoIWtpYmxuZF9kbWFfbWFwcGluZ19lcnJvcih0cG8tPnRwb19oZGV2LT5pYmhfaWJkZXYsCisJCUxBU1NFUlQoIWtpYmxuZF9kbWFfbWFwcGluZ19lcnJvcih0cG8tPnRwb19oZGV2LT5pYmhfaWJkZXYsCiAJCQkJCQkgICB0eC0+dHhfbXNnYWRkcikpOwogCQlLSUJMTkRfVU5NQVBfQUREUl9TRVQodHgsIHR4X21zZ3VubWFwLCB0eC0+dHhfbXNnYWRkcik7CiAKIAkJbGlzdF9hZGQoJnR4LT50eF9saXN0LCAmcG9vbC0+cG9fZnJlZV9saXN0KTsKIAogCQlwYWdlX29mZnNldCArPSBJQkxORF9NU0dfU0laRTsKLQkJTEFTU0VSVCAocGFnZV9vZmZzZXQgPD0gUEFHRV9TSVpFKTsKKwkJTEFTU0VSVChwYWdlX29mZnNldCA8PSBQQUdFX1NJWkUpOwogCiAJCWlmIChwYWdlX29mZnNldCA9PSBQQUdFX1NJWkUpIHsKIAkJCXBhZ2Vfb2Zmc2V0ID0gMDsKIAkJCWlwYWdlKys7Ci0JCQlMQVNTRVJUIChpcGFnZSA8PSB0eHBncy0+aWJwX25wYWdlcyk7CisJCQlMQVNTRVJUKGlwYWdlIDw9IHR4cGdzLT5pYnBfbnBhZ2VzKTsKIAkJfQogCX0KIH0KIAotc3RydWN0IGliX21yICoKLWtpYmxuZF9maW5kX2RtYV9tcihraWJfaGNhX2Rldl90ICpoZGV2LCBfX3U2NCBhZGRyLCBfX3U2NCBzaXplKQorc3RydWN0IGliX21yICpraWJsbmRfZmluZF9kbWFfbXIoa2liX2hjYV9kZXZfdCAqaGRldiwgX191NjQgYWRkciwgX191NjQgc2l6ZSkKIHsKIAlfX3U2NCAgIGluZGV4OwogCi0JTEFTU0VSVCAoaGRldi0+aWJoX21yc1swXSAhPSBOVUxMKTsKKwlMQVNTRVJUKGhkZXYtPmliaF9tcnNbMF0gIT0gTlVMTCk7CiAKIAlpZiAoaGRldi0+aWJoX25tcnMgPT0gMSkKIAkJcmV0dXJuIGhkZXYtPmliaF9tcnNbMF07CkBAIC0xMzM2LDE0ICsxMzA3LDEzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBpYl9tciAqCi1raWJsbmRfZmluZF9yZF9kbWFfbXIoa2liX2hjYV9kZXZfdCAqaGRldiwga2liX3JkbWFfZGVzY190ICpyZCkKK3N0cnVjdCBpYl9tciAqa2libG5kX2ZpbmRfcmRfZG1hX21yKGtpYl9oY2FfZGV2X3QgKmhkZXYsIGtpYl9yZG1hX2Rlc2NfdCAqcmQpCiB7CiAJc3RydWN0IGliX21yICpwcmV2X21yOwogCXN0cnVjdCBpYl9tciAqbXI7CiAJaW50CSAgIGk7CiAKLQlMQVNTRVJUIChoZGV2LT5pYmhfbXJzWzBdICE9IE5VTEwpOworCUxBU1NFUlQoaGRldi0+aWJoX21yc1swXSAhPSBOVUxMKTsKIAogCWlmICgqa2libG5kX3R1bmFibGVzLmtpYl9tYXBfb25fZGVtYW5kID4gMCAmJgogCSAgICAqa2libG5kX3R1bmFibGVzLmtpYl9tYXBfb25fZGVtYW5kIDw9IHJkLT5yZF9uZnJhZ3MpCkBAIC0xMzcwLDEwICsxMzQwLDkgQEAKIAlyZXR1cm4gbXI7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfZGVzdHJveV9mbXJfcG9vbChraWJfZm1yX3Bvb2xfdCAqcG9vbCkKK3N0YXRpYyB2b2lkIGtpYmxuZF9kZXN0cm95X2Ztcl9wb29sKGtpYl9mbXJfcG9vbF90ICpwb29sKQogewotCUxBU1NFUlQgKHBvb2wtPmZwb19tYXBfY291bnQgPT0gMCk7CisJTEFTU0VSVChwb29sLT5mcG9fbWFwX2NvdW50ID09IDApOwogCiAJaWYgKHBvb2wtPmZwb19mbXJfcG9vbCAhPSBOVUxMKQogCQlpYl9kZXN0cm95X2Ztcl9wb29sKHBvb2wtPmZwb19mbXJfcG9vbCk7CkBAIC0xMzg0LDggKzEzNTMsNyBAQAogCUxJQkNGU19GUkVFKHBvb2wsIHNpemVvZihraWJfZm1yX3Bvb2xfdCkpOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2xfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQorc3RhdGljIHZvaWQga2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2xfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCWtpYl9mbXJfcG9vbF90ICpwb29sOwogCkBAIC0xNDEwLDggKzEzNzgsOCBAQAogCXJldHVybiBtYXgoSUJMTkRfRk1SX1BPT0xfRkxVU0gsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfY3JlYXRlX2Ztcl9wb29sKGtpYl9mbXJfcG9vbHNldF90ICpmcHMsIGtpYl9mbXJfcG9vbF90ICoqcHBfZnBvKQorc3RhdGljIGludCBraWJsbmRfY3JlYXRlX2Ztcl9wb29sKGtpYl9mbXJfcG9vbHNldF90ICpmcHMsCisJCQkJICBraWJfZm1yX3Bvb2xfdCAqKnBwX2ZwbykKIHsKIAkvKiBGTVIgcG9vbCBmb3IgUkRNQSAqLwogCWtpYl9kZXZfdAkgICAgICAgKmRldiA9IGZwcy0+ZnBzX25ldC0+aWJuX2RldjsKQEAgLTE0NTEsOCArMTQxOSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfZmFpbF9mbXJfcG9vbHNldChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBzdHJ1Y3QgbGlzdF9oZWFkICp6b21iaWVzKQorc3RhdGljIHZvaWQga2libG5kX2ZhaWxfZm1yX3Bvb2xzZXQoa2liX2Ztcl9wb29sc2V0X3QgKmZwcywKKwkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqem9tYmllcykKIHsKIAlpZiAoZnBzLT5mcHNfbmV0ID09IE5VTEwpIC8qIGludGlhbGl6ZWQ/ICovCiAJCXJldHVybjsKQEAgLTE0NzMsOCArMTQ0MSw3IEBACiAJc3Bpbl91bmxvY2soJmZwcy0+ZnBzX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2ZpbmlfZm1yX3Bvb2xzZXQoa2liX2Ztcl9wb29sc2V0X3QgKmZwcykKK3N0YXRpYyB2b2lkIGtpYmxuZF9maW5pX2Ztcl9wb29sc2V0KGtpYl9mbXJfcG9vbHNldF90ICpmcHMpCiB7CiAJaWYgKGZwcy0+ZnBzX25ldCAhPSBOVUxMKSB7IC8qIGluaXRpYWxpemVkPyAqLwogCQlraWJsbmRfZGVzdHJveV9mbXJfcG9vbF9saXN0KCZmcHMtPmZwc19mYWlsZWRfcG9vbF9saXN0KTsKQEAgLTE0ODIsOSArMTQ0OSw5IEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfaW5pdF9mbXJfcG9vbHNldChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBpbnQgY3B0LCBraWJfbmV0X3QgKm5ldCwKLQkJCWludCBwb29sX3NpemUsIGludCBmbHVzaF90cmlnZ2VyKQorc3RhdGljIGludCBraWJsbmRfaW5pdF9mbXJfcG9vbHNldChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBpbnQgY3B0LAorCQkJCSAgIGtpYl9uZXRfdCAqbmV0LCBpbnQgcG9vbF9zaXplLAorCQkJCSAgIGludCBmbHVzaF90cmlnZ2VyKQogewogCWtpYl9mbXJfcG9vbF90ICpmcG87CiAJaW50CSAgICAgcmM7CkBAIC0xNTA2LDggKzE0NzMsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludAota2libG5kX2Ztcl9wb29sX2lzX2lkbGUoa2liX2Ztcl9wb29sX3QgKmZwbywgdW5zaWduZWQgbG9uZyBub3cpCitzdGF0aWMgaW50IGtpYmxuZF9mbXJfcG9vbF9pc19pZGxlKGtpYl9mbXJfcG9vbF90ICpmcG8sIHVuc2lnbmVkIGxvbmcgbm93KQogewogCWlmIChmcG8tPmZwb19tYXBfY291bnQgIT0gMCkgLyogc3RpbGwgaW4gdXNlICovCiAJCXJldHVybiAwOwpAQCAtMTUxNiwxMCArMTQ4Miw5IEBACiAJcmV0dXJuIGNmc190aW1lX2FmdGVyZXEobm93LCBmcG8tPmZwb19kZWFkbGluZSk7CiB9CiAKLXZvaWQKLWtpYmxuZF9mbXJfcG9vbF91bm1hcChraWJfZm1yX3QgKmZtciwgaW50IHN0YXR1cykKK3ZvaWQga2libG5kX2Ztcl9wb29sX3VubWFwKGtpYl9mbXJfdCAqZm1yLCBpbnQgc3RhdHVzKQogewotCUxJU1RfSEVBRCAgICAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAlraWJfZm1yX3Bvb2xfdCAgICAqZnBvID0gZm1yLT5mbXJfcG9vbDsKIAlraWJfZm1yX3Bvb2xzZXRfdCAqZnBzID0gZnBvLT5mcG9fb3duZXI7CiAJdW5zaWduZWQgbG9uZwkgbm93ID0gY2ZzX3RpbWVfY3VycmVudCgpOwpAQCAtMTUyNywxMSArMTQ5MiwxMSBAQAogCWludAkJcmM7CiAKIAlyYyA9IGliX2Ztcl9wb29sX3VubWFwKGZtci0+Zm1yX3BmbXIpOwotCUxBU1NFUlQgKHJjID09IDApOworCUxBU1NFUlQocmMgPT0gMCk7CiAKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJcmMgPSBpYl9mbHVzaF9mbXJfcG9vbChmcG8tPmZwb19mbXJfcG9vbCk7Ci0JCUxBU1NFUlQgKHJjID09IDApOworCQlMQVNTRVJUKHJjID09IDApOwogCX0KIAogCWZtci0+Zm1yX3Bvb2wgPSBOVUxMOwpAQCAtMTU1Niw5ICsxNTIxLDggQEAKIAkJa2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2xfbGlzdCgmem9tYmllcyk7CiB9CiAKLWludAota2libG5kX2Ztcl9wb29sX21hcChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBfX3U2NCAqcGFnZXMsIGludCBucGFnZXMsCi0JCSAgICBfX3U2NCBpb3YsIGtpYl9mbXJfdCAqZm1yKQoraW50IGtpYmxuZF9mbXJfcG9vbF9tYXAoa2liX2Ztcl9wb29sc2V0X3QgKmZwcywgX191NjQgKnBhZ2VzLCBpbnQgbnBhZ2VzLAorCQkJX191NjQgaW92LCBraWJfZm1yX3QgKmZtcikKIHsKIAlzdHJ1Y3QgaWJfcG9vbF9mbXIgKnBmbXI7CiAJa2liX2Ztcl9wb29sX3QgICAgICpmcG87CkBAIC0xNTk3LDcgKzE1NjEsOCBAQAogCiAJaWYgKGZwcy0+ZnBzX2luY3JlYXNpbmcpIHsKIAkJc3Bpbl91bmxvY2soJmZwcy0+ZnBzX2xvY2spOwotCQlDREVCVUcoRF9ORVQsICJBbm90aGVyIHRocmVhZCBpcyBhbGxvY2F0aW5nIG5ldyBGTVIgcG9vbCwgd2FpdGluZyBmb3IgaGVyIHRvIGNvbXBsZXRlXG4iKTsKKwkJQ0RFQlVHKERfTkVULAorCQkJIkFub3RoZXIgdGhyZWFkIGlzIGFsbG9jYXRpbmcgbmV3IEZNUiBwb29sLCB3YWl0aW5nIGZvciBoZXIgdG8gY29tcGxldGVcbiIpOwogCQlzY2hlZHVsZSgpOwogCQlnb3RvIGFnYWluOwogCkBAIC0xNjI3LDE3ICsxNTkyLDE1IEBACiAJZ290byBhZ2FpbjsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9maW5pX3Bvb2woa2liX3Bvb2xfdCAqcG9vbCkKK3N0YXRpYyB2b2lkIGtpYmxuZF9maW5pX3Bvb2woa2liX3Bvb2xfdCAqcG9vbCkKIHsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwb29sLT5wb19mcmVlX2xpc3QpKTsKLQlMQVNTRVJUIChwb29sLT5wb19hbGxvY2F0ZWQgPT0gMCk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwb29sLT5wb19mcmVlX2xpc3QpKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKIAogCUNERUJVRyhEX05FVCwgIkZpbmFsaXplICVzIHBvb2xcbiIsIHBvb2wtPnBvX293bmVyLT5wc19uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9pbml0X3Bvb2woa2liX3Bvb2xzZXRfdCAqcHMsIGtpYl9wb29sX3QgKnBvb2wsIGludCBzaXplKQorc3RhdGljIHZvaWQga2libG5kX2luaXRfcG9vbChraWJfcG9vbHNldF90ICpwcywga2liX3Bvb2xfdCAqcG9vbCwgaW50IHNpemUpCiB7CiAJQ0RFQlVHKERfTkVULCAiSW5pdGlhbGl6ZSAlcyBwb29sXG4iLCBwcy0+cHNfbmFtZSk7CiAKQEAgLTE2NDgsOCArMTYxMSw3IEBACiAJcG9vbC0+cG9fc2l6ZSAgICAgPSBzaXplOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2Rlc3Ryb3lfcG9vbF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCitzdGF0aWMgdm9pZCBraWJsbmRfZGVzdHJveV9wb29sX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlraWJfcG9vbF90ICpwb29sOwogCkBAIC0xNjU3LDEzICsxNjE5LDEyIEBACiAJCXBvb2wgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIGtpYl9wb29sX3QsIHBvX2xpc3QpOwogCQlsaXN0X2RlbCgmcG9vbC0+cG9fbGlzdCk7CiAKLQkJTEFTU0VSVCAocG9vbC0+cG9fb3duZXIgIT0gTlVMTCk7CisJCUxBU1NFUlQocG9vbC0+cG9fb3duZXIgIT0gTlVMTCk7CiAJCXBvb2wtPnBvX293bmVyLT5wc19wb29sX2Rlc3Ryb3kocG9vbCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2ZhaWxfcG9vbHNldChraWJfcG9vbHNldF90ICpwcywgc3RydWN0IGxpc3RfaGVhZCAqem9tYmllcykKK3N0YXRpYyB2b2lkIGtpYmxuZF9mYWlsX3Bvb2xzZXQoa2liX3Bvb2xzZXRfdCAqcHMsIHN0cnVjdCBsaXN0X2hlYWQgKnpvbWJpZXMpCiB7CiAJaWYgKHBzLT5wc19uZXQgPT0gTlVMTCkgLyogaW50aWFsaXplZD8gKi8KIAkJcmV0dXJuOwpAQCAtMTY4Miw4ICsxNjQzLDcgQEAKIAlzcGluX3VubG9jaygmcHMtPnBzX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2ZpbmlfcG9vbHNldChraWJfcG9vbHNldF90ICpwcykKK3N0YXRpYyB2b2lkIGtpYmxuZF9maW5pX3Bvb2xzZXQoa2liX3Bvb2xzZXRfdCAqcHMpCiB7CiAJaWYgKHBzLT5wc19uZXQgIT0gTlVMTCkgeyAvKiBpbml0aWFsaXplZD8gKi8KIAkJa2libG5kX2Rlc3Ryb3lfcG9vbF9saXN0KCZwcy0+cHNfZmFpbGVkX3Bvb2xfbGlzdCk7CkBAIC0xNjkxLDEzICsxNjUxLDEyIEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfaW5pdF9wb29sc2V0KGtpYl9wb29sc2V0X3QgKnBzLCBpbnQgY3B0LAotCQkgICAga2liX25ldF90ICpuZXQsIGNoYXIgKm5hbWUsIGludCBzaXplLAotCQkgICAga2liX3BzX3Bvb2xfY3JlYXRlX3QgcG9fY3JlYXRlLAotCQkgICAga2liX3BzX3Bvb2xfZGVzdHJveV90IHBvX2Rlc3Ryb3ksCi0JCSAgICBraWJfcHNfbm9kZV9pbml0X3QgbmRfaW5pdCwKLQkJICAgIGtpYl9wc19ub2RlX2ZpbmlfdCBuZF9maW5pKQorc3RhdGljIGludCBraWJsbmRfaW5pdF9wb29sc2V0KGtpYl9wb29sc2V0X3QgKnBzLCBpbnQgY3B0LAorCQkJICAgICAgIGtpYl9uZXRfdCAqbmV0LCBjaGFyICpuYW1lLCBpbnQgc2l6ZSwKKwkJCSAgICAgICBraWJfcHNfcG9vbF9jcmVhdGVfdCBwb19jcmVhdGUsCisJCQkgICAgICAga2liX3BzX3Bvb2xfZGVzdHJveV90IHBvX2Rlc3Ryb3ksCisJCQkgICAgICAga2liX3BzX25vZGVfaW5pdF90IG5kX2luaXQsCisJCQkgICAgICAga2liX3BzX25vZGVfZmluaV90IG5kX2ZpbmkpCiB7CiAJa2liX3Bvb2xfdAkqcG9vbDsKIAlpbnQJCXJjOwpAQCAtMTcyNyw4ICsxNjg2LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF9wb29sX2lzX2lkbGUoa2liX3Bvb2xfdCAqcG9vbCwgdW5zaWduZWQgbG9uZyBub3cpCitzdGF0aWMgaW50IGtpYmxuZF9wb29sX2lzX2lkbGUoa2liX3Bvb2xfdCAqcG9vbCwgdW5zaWduZWQgbG9uZyBub3cpCiB7CiAJaWYgKHBvb2wtPnBvX2FsbG9jYXRlZCAhPSAwKSAvKiBzdGlsbCBpbiB1c2UgKi8KIAkJcmV0dXJuIDA7CkBAIC0xNzM3LDEwICsxNjk1LDkgQEAKIAlyZXR1cm4gY2ZzX3RpbWVfYWZ0ZXJlcShub3csIHBvb2wtPnBvX2RlYWRsaW5lKTsKIH0KIAotdm9pZAota2libG5kX3Bvb2xfZnJlZV9ub2RlKGtpYl9wb29sX3QgKnBvb2wsIHN0cnVjdCBsaXN0X2hlYWQgKm5vZGUpCit2b2lkIGtpYmxuZF9wb29sX2ZyZWVfbm9kZShraWJfcG9vbF90ICpwb29sLCBzdHJ1Y3QgbGlzdF9oZWFkICpub2RlKQogewotCUxJU1RfSEVBRCAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAlraWJfcG9vbHNldF90ICAqcHMgPSBwb29sLT5wb19vd25lcjsKIAlraWJfcG9vbF90ICAgICAqdG1wOwogCXVuc2lnbmVkIGxvbmcgICAgICBub3cgPSBjZnNfdGltZV9jdXJyZW50KCk7CkBAIC0xNzUwLDcgKzE3MDcsNyBAQAogCWlmIChwcy0+cHNfbm9kZV9maW5pICE9IE5VTEwpCiAJCXBzLT5wc19ub2RlX2ZpbmkocG9vbCwgbm9kZSk7CiAKLQlMQVNTRVJUIChwb29sLT5wb19hbGxvY2F0ZWQgPiAwKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA+IDApOwogCWxpc3RfYWRkKG5vZGUsICZwb29sLT5wb19mcmVlX2xpc3QpOwogCXBvb2wtPnBvX2FsbG9jYXRlZC0tOwogCkBAIC0xNzY4LDggKzE3MjUsNyBAQAogCQlraWJsbmRfZGVzdHJveV9wb29sX2xpc3QoJnpvbWJpZXMpOwogfQogCi1zdHJ1Y3QgbGlzdF9oZWFkICoKLWtpYmxuZF9wb29sX2FsbG9jX25vZGUoa2liX3Bvb2xzZXRfdCAqcHMpCitzdHJ1Y3QgbGlzdF9oZWFkICpraWJsbmRfcG9vbF9hbGxvY19ub2RlKGtpYl9wb29sc2V0X3QgKnBzKQogewogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpub2RlOwogCWtpYl9wb29sX3QJICAgICpwb29sOwpAQCAtMTgzMSw4ICsxNzg3LDcgQEAKIAlnb3RvIGFnYWluOwogfQogCi12b2lkCi1raWJsbmRfcG1yX3Bvb2xfdW5tYXAoa2liX3BoeXNfbXJfdCAqcG1yKQordm9pZCBraWJsbmRfcG1yX3Bvb2xfdW5tYXAoa2liX3BoeXNfbXJfdCAqcG1yKQogewogCWtpYl9wbXJfcG9vbF90ICAgICAgKnBwbyA9IHBtci0+cG1yX3Bvb2w7CiAJc3RydWN0IGliX21yCSptciAgPSBwbXItPnBtcl9tcjsKQEAgLTE4NDMsOCArMTc5OCw3IEBACiAJCWliX2RlcmVnX21yKG1yKTsKIH0KIAotaW50Ci1raWJsbmRfcG1yX3Bvb2xfbWFwKGtpYl9wbXJfcG9vbHNldF90ICpwcHMsIGtpYl9oY2FfZGV2X3QgKmhkZXYsCitpbnQga2libG5kX3Btcl9wb29sX21hcChraWJfcG1yX3Bvb2xzZXRfdCAqcHBzLCBraWJfaGNhX2Rldl90ICpoZGV2LAogCQkgICAga2liX3JkbWFfZGVzY190ICpyZCwgX191NjQgKmlvdmEsIGtpYl9waHlzX21yX3QgKipwcF9wbXIpCiB7CiAJa2liX3BoeXNfbXJfdCAqcG1yOwpAQCAtMTg4OSwxOSArMTg0MywxNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9kZXN0cm95X3Btcl9wb29sKGtpYl9wb29sX3QgKnBvb2wpCitzdGF0aWMgdm9pZCBraWJsbmRfZGVzdHJveV9wbXJfcG9vbChraWJfcG9vbF90ICpwb29sKQogewogCWtpYl9wbXJfcG9vbF90ICpwcG8gPSBjb250YWluZXJfb2YocG9vbCwga2liX3Btcl9wb29sX3QsIHBwb19wb29sKTsKIAlraWJfcGh5c19tcl90ICAqcG1yOworCWtpYl9waHlzX21yX3QgKnRtcDsKIAotCUxBU1NFUlQgKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmcG9vbC0+cG9fZnJlZV9saXN0KSkgewotCQlwbXIgPSBsaXN0X2VudHJ5KHBvb2wtPnBvX2ZyZWVfbGlzdC5uZXh0LAotCQkJCSAgICAga2liX3BoeXNfbXJfdCwgcG1yX2xpc3QpOwotCi0JCUxBU1NFUlQgKHBtci0+cG1yX21yID09IE5VTEwpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbXIsIHRtcCwgJnBvb2wtPnBvX2ZyZWVfbGlzdCwgcG1yX2xpc3QpIHsKKwkJTEFTU0VSVChwbXItPnBtcl9tciA9PSBOVUxMKTsKIAkJbGlzdF9kZWwoJnBtci0+cG1yX2xpc3QpOwogCiAJCWlmIChwbXItPnBtcl9pcGIgIT0gTlVMTCkgewpAQCAtMTkyNyw4ICsxODc4LDggQEAKIAlyZXR1cm4gbWF4KElCTE5EX1BNUl9QT09MLCBzaXplKTsKIH0KIAotc3RhdGljIGludAota2libG5kX2NyZWF0ZV9wbXJfcG9vbChraWJfcG9vbHNldF90ICpwcywgaW50IHNpemUsIGtpYl9wb29sX3QgKipwcF9wbykKK3N0YXRpYyBpbnQga2libG5kX2NyZWF0ZV9wbXJfcG9vbChraWJfcG9vbHNldF90ICpwcywgaW50IHNpemUsCisJCQkJICBraWJfcG9vbF90ICoqcHBfcG8pCiB7CiAJc3RydWN0IGtpYl9wbXJfcG9vbAkqcHBvOwogCXN0cnVjdCBraWJfcG9vbAkJKnBvb2w7CkBAIC0xOTcwLDEzICsxOTIxLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfZGVzdHJveV90eF9wb29sKGtpYl9wb29sX3QgKnBvb2wpCitzdGF0aWMgdm9pZCBraWJsbmRfZGVzdHJveV90eF9wb29sKGtpYl9wb29sX3QgKnBvb2wpCiB7CiAJa2liX3R4X3Bvb2xfdCAgKnRwbyA9IGNvbnRhaW5lcl9vZihwb29sLCBraWJfdHhfcG9vbF90LCB0cG9fcG9vbCk7CiAJaW50CSAgICAgaTsKIAotCUxBU1NFUlQgKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKIAogCWlmICh0cG8tPnRwb190eF9wYWdlcyAhPSBOVUxMKSB7CiAJCWtpYmxuZF91bm1hcF90eF9wb29sKHRwbyk7CkBAIC0yMDI2LDggKzE5NzYsOCBAQAogCXJldHVybiBtYXgoSUJMTkRfVFhfUE9PTCwgbnR4KTsKIH0KIAotc3RhdGljIGludAota2libG5kX2NyZWF0ZV90eF9wb29sKGtpYl9wb29sc2V0X3QgKnBzLCBpbnQgc2l6ZSwga2liX3Bvb2xfdCAqKnBwX3BvKQorc3RhdGljIGludCBraWJsbmRfY3JlYXRlX3R4X3Bvb2woa2liX3Bvb2xzZXRfdCAqcHMsIGludCBzaXplLAorCQkJCSBraWJfcG9vbF90ICoqcHBfcG8pCiB7CiAJaW50CSAgICBpOwogCWludAkgICAgbnBnOwpAQCAtMjExMCw4ICsyMDYwLDcgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF90eF9pbml0KGtpYl9wb29sX3QgKnBvb2wsIHN0cnVjdCBsaXN0X2hlYWQgKm5vZGUpCitzdGF0aWMgdm9pZCBraWJsbmRfdHhfaW5pdChraWJfcG9vbF90ICpwb29sLCBzdHJ1Y3QgbGlzdF9oZWFkICpub2RlKQogewogCWtpYl90eF9wb29sc2V0X3QgKnRwcyA9IGNvbnRhaW5lcl9vZihwb29sLT5wb19vd25lciwga2liX3R4X3Bvb2xzZXRfdCwKIAkJCQkJICAgICB0cHNfcG9vbHNldCk7CkBAIC0yMTIwLDggKzIwNjksNyBAQAogCXR4LT50eF9jb29raWUgPSB0cHMtPnRwc19uZXh0X3R4X2Nvb2tpZSsrOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX25ldF9maW5pX3Bvb2xzKGtpYl9uZXRfdCAqbmV0KQorc3RhdGljIHZvaWQga2libG5kX25ldF9maW5pX3Bvb2xzKGtpYl9uZXRfdCAqbmV0KQogewogCWludAlpOwogCkBAIC0yMTYyLDggKzIxMTAsNyBAQAogCX0KIH0KIAotc3RhdGljIGludAota2libG5kX25ldF9pbml0X3Bvb2xzKGtpYl9uZXRfdCAqbmV0LCBfX3UzMiAqY3B0cywgaW50IG5jcHRzKQorc3RhdGljIGludCBraWJsbmRfbmV0X2luaXRfcG9vbHMoa2liX25ldF90ICpuZXQsIF9fdTMyICpjcHRzLCBpbnQgbmNwdHMpCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQJCWNwdDsKQEAgLTIyOTEsOCArMjIzOCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfaGRldl9nZXRfYXR0cihraWJfaGNhX2Rldl90ICpoZGV2KQorc3RhdGljIGludCBraWJsbmRfaGRldl9nZXRfYXR0cihraWJfaGNhX2Rldl90ICpoZGV2KQogewogCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciAqYXR0cjsKIAlpbnQJCSAgICByYzsKQEAgLTIzMzYsOCArMjI4Miw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfaGRldl9jbGVhbnVwX21ycyhraWJfaGNhX2Rldl90ICpoZGV2KQorc3RhdGljIHZvaWQga2libG5kX2hkZXZfY2xlYW51cF9tcnMoa2liX2hjYV9kZXZfdCAqaGRldikKIHsKIAlpbnQgICAgIGk7CiAKQEAgLTIzNTYsOCArMjMwMSw3IEBACiAJaGRldi0+aWJoX25tcnMgPSAwOwogfQogCi12b2lkCi1raWJsbmRfaGRldl9kZXN0cm95KGtpYl9oY2FfZGV2X3QgKmhkZXYpCit2b2lkIGtpYmxuZF9oZGV2X2Rlc3Ryb3koa2liX2hjYV9kZXZfdCAqaGRldikKIHsKIAlraWJsbmRfaGRldl9jbGVhbnVwX21ycyhoZGV2KTsKIApAQCAtMjM3MCw4ICsyMzE0LDcgQEAKIAlMSUJDRlNfRlJFRShoZGV2LCBzaXplb2YoKmhkZXYpKTsKIH0KIAotc3RhdGljIGludAota2libG5kX2hkZXZfc2V0dXBfbXJzKGtpYl9oY2FfZGV2X3QgKmhkZXYpCitzdGF0aWMgaW50IGtpYmxuZF9oZGV2X3NldHVwX21ycyhraWJfaGNhX2Rldl90ICpoZGV2KQogewogCXN0cnVjdCBpYl9tciAqbXI7CiAJaW50CSAgIGk7CkBAIC0yNDQyLDcgKzIzODUsNyBAQAogCQkJcmV0dXJuIFBUUl9FUlIobXIpOwogCQl9CiAKLQkJTEFTU0VSVCAoaW92YSA9PSBpcGIuYWRkcik7CisJCUxBU1NFUlQoaW92YSA9PSBpcGIuYWRkcik7CiAKIAkJaGRldi0+aWJoX21yc1tpXSA9IG1yOwogCX0KQEAgLTI0NTQsMTQgKzIzOTcsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAota2libG5kX2R1bW15X2NhbGxiYWNrKHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLCBzdHJ1Y3QgcmRtYV9jbV9ldmVudCAqZXZlbnQpCi17ICAgICAgIC8qIERVTU1ZICovCisvKiBEVU1NWSAqLworc3RhdGljIGludCBraWJsbmRfZHVtbXlfY2FsbGJhY2soc3RydWN0IHJkbWFfY21faWQgKmNtaWQsCisJCQkJIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCkKK3sKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAota2libG5kX2Rldl9uZWVkX2ZhaWxvdmVyKGtpYl9kZXZfdCAqZGV2KQorc3RhdGljIGludCBraWJsbmRfZGV2X25lZWRfZmFpbG92ZXIoa2liX2Rldl90ICpkZXYpCiB7CiAJc3RydWN0IHJkbWFfY21faWQgICpjbWlkOwogCXN0cnVjdCBzb2NrYWRkcl9pbiAgc3JjYWRkcjsKQEAgLTI1MTYsMTIgKzI0NTksMTEgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50Ci1raWJsbmRfZGV2X2ZhaWxvdmVyKGtpYl9kZXZfdCAqZGV2KQoraW50IGtpYmxuZF9kZXZfZmFpbG92ZXIoa2liX2Rldl90ICpkZXYpCiB7Ci0JTElTVF9IRUFEICAgICAgKHpvbWJpZV90cG8pOwotCUxJU1RfSEVBRCAgICAgICh6b21iaWVfcHBvKTsKLQlMSVNUX0hFQUQgICAgICAoem9tYmllX2Zwbyk7CisJTElTVF9IRUFEKHpvbWJpZV90cG8pOworCUxJU1RfSEVBRCh6b21iaWVfcHBvKTsKKwlMSVNUX0hFQUQoem9tYmllX2Zwbyk7CiAJc3RydWN0IHJkbWFfY21faWQgICpjbWlkICA9IE5VTEw7CiAJa2liX2hjYV9kZXZfdCAgICAgICpoZGV2ICA9IE5VTEw7CiAJa2liX2hjYV9kZXZfdCAgICAgICpvbGQ7CkBAIC0yNTMyLDcgKzI0NzQsNyBAQAogCWludAkJIHJjID0gMDsKIAlpbnQJCSAgICBpOwogCi0JTEFTU0VSVCAoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyID4gMSB8fAorCUxBU1NFUlQoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyID4gMSB8fAogCQkgZGV2LT5pYmRfY2FuX2ZhaWxvdmVyIHx8CiAJCSBkZXYtPmliZF9oZGV2ID09IE5VTEwpOwogCkBAIC0yNjU1LDExICsyNTk3LDEwIEBACiAJcmV0dXJuIHJjOwogfQogCi12b2lkCi1raWJsbmRfZGVzdHJveV9kZXYgKGtpYl9kZXZfdCAqZGV2KQordm9pZCBraWJsbmRfZGVzdHJveV9kZXYoa2liX2Rldl90ICpkZXYpCiB7Ci0JTEFTU0VSVCAoZGV2LT5pYmRfbm5ldHMgPT0gMCk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmZGV2LT5pYmRfbmV0cykpOworCUxBU1NFUlQoZGV2LT5pYmRfbm5ldHMgPT0gMCk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZkZXYtPmliZF9uZXRzKSk7CiAKIAlsaXN0X2RlbCgmZGV2LT5pYmRfZmFpbF9saXN0KTsKIAlsaXN0X2RlbCgmZGV2LT5pYmRfbGlzdCk7CkBAIC0yNjcwLDggKzI2MTEsNyBAQAogCUxJQkNGU19GUkVFKGRldiwgc2l6ZW9mKCpkZXYpKTsKIH0KIAotc3RhdGljIGtpYl9kZXZfdCAqCi1raWJsbmRfY3JlYXRlX2RldihjaGFyICppZm5hbWUpCitzdGF0aWMga2liX2Rldl90ICpraWJsbmRfY3JlYXRlX2RldihjaGFyICppZm5hbWUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlraWJfZGV2X3QJICpkZXY7CkBAIC0yNzIzLDEzICsyNjYzLDEyIEBACiAJcmV0dXJuIGRldjsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9iYXNlX3NodXRkb3duKHZvaWQpCitzdGF0aWMgdm9pZCBraWJsbmRfYmFzZV9zaHV0ZG93bih2b2lkKQogewogCXN0cnVjdCBraWJfc2NoZWRfaW5mbwkqc2NoZWQ7CiAJaW50CQkJaTsKIAotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9kZXZzKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZraWJsbmRfZGF0YS5raWJfZGV2cykpOwogCiAJQ0RFQlVHKERfTUFMTE9DLCAiYmVmb3JlIExORCBiYXNlIGNsZWFudXA6IGttZW0gJWRcbiIsCiAJICAgICAgIGF0b21pY19yZWFkKCZsaWJjZnNfa21lbW9yeSkpOwpAQCAtMjc0MCwxMiArMjY3OSwxMSBAQAogCiAJY2FzZSBJQkxORF9JTklUX0FMTDoKIAljYXNlIElCTE5EX0lOSVRfREFUQToKLQkJTEFTU0VSVCAoa2libG5kX2RhdGEua2liX3BlZXJzICE9IE5VTEwpOwotCQlmb3IgKGkgPSAwOyBpIDwga2libG5kX2RhdGEua2liX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9wZWVyc1tpXSkpOwotCQl9Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF96b21iaWVzKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF9jb25ucykpOworCQlMQVNTRVJUKGtpYmxuZF9kYXRhLmtpYl9wZWVycyAhPSBOVUxMKTsKKwkJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKQorCQkJTEFTU0VSVChsaXN0X2VtcHR5KCZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZraWJsbmRfZGF0YS5raWJfY29ubmRfem9tYmllcykpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF9jb25ucykpOwogCiAJCS8qIGZsYWcgdGhyZWFkcyB0byB0ZXJtaW5hdGU7IHdha2UgYW5kIHdhaXQgZm9yIHRoZW0gdG8gZGllICovCiAJCWtpYmxuZF9kYXRhLmtpYl9zaHV0ZG93biA9IDE7CkBAIC0yNzYyLDcgKzI3MDAsOCBAQAogCQlpID0gMjsKIAkJd2hpbGUgKGF0b21pY19yZWFkKCZraWJsbmRfZGF0YS5raWJfbnRocmVhZHMpICE9IDApIHsKIAkJCWkrKzsKLQkJCUNERUJVRygoKGkgJiAoLWkpKSA9PSBpKSA/IERfV0FSTklORyA6IERfTkVULCAvKiBwb3dlciBvZiAyPyAqLworCQkJLyogcG93ZXIgb2YgMiA/ICovCisJCQlDREVCVUcoKChpICYgKC1pKSkgPT0gaSkgPyBEX1dBUk5JTkcgOiBEX05FVCwKIAkJCSAgICAgICAiV2FpdGluZyBmb3IgJWQgdGhyZWFkcyB0byB0ZXJtaW5hdGVcbiIsCiAJCQkgICAgICAgYXRvbWljX3JlYWQoJmtpYmxuZF9kYXRhLmtpYl9udGhyZWFkcykpOwogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwpAQCAtMjc5MSw4ICsyNzMwLDcgQEAKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIH0KIAotdm9pZAota2libG5kX3NodXRkb3duIChsbmV0X25pX3QgKm5pKQordm9pZCBraWJsbmRfc2h1dGRvd24obG5ldF9uaV90ICpuaSkKIHsKIAlraWJfbmV0X3QJKm5ldCA9IG5pLT5uaV9kYXRhOwogCXJ3bG9ja190ICAgICAqZ19sb2NrID0gJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jazsKQEAgLTI4NDIsNyArMjc4MCw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCiAJY2FzZSBJQkxORF9JTklUX05PVEhJTkc6Ci0JCUxBU1NFUlQgKGF0b21pY19yZWFkKCZuZXQtPmlibl9uY29ubnMpID09IDApOworCQlMQVNTRVJUKGF0b21pY19yZWFkKCZuZXQtPmlibl9uY29ubnMpID09IDApOwogCiAJCWlmIChuZXQtPmlibl9kZXYgIT0gTlVMTCAmJgogCQkgICAgbmV0LT5pYm5fZGV2LT5pYmRfbm5ldHMgPT0gMCkKQEAgLTI4NjIsMjAgKzI4MDAsMTkgQEAKIG91dDoKIAlpZiAobGlzdF9lbXB0eSgma2libG5kX2RhdGEua2liX2RldnMpKQogCQlraWJsbmRfYmFzZV9zaHV0ZG93bigpOwotCXJldHVybjsKIH0KIAotc3RhdGljIGludAota2libG5kX2Jhc2Vfc3RhcnR1cCh2b2lkKQorc3RhdGljIGludCBraWJsbmRfYmFzZV9zdGFydHVwKHZvaWQpCiB7CiAJc3RydWN0IGtpYl9zY2hlZF9pbmZvCSpzY2hlZDsKIAlpbnQJCQlyYzsKIAlpbnQJCQlpOwogCi0JTEFTU0VSVCAoa2libG5kX2RhdGEua2liX2luaXQgPT0gSUJMTkRfSU5JVF9OT1RISU5HKTsKKwlMQVNTRVJUKGtpYmxuZF9kYXRhLmtpYl9pbml0ID09IElCTE5EX0lOSVRfTk9USElORyk7CiAKIAl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0JbWVtc2V0KCZraWJsbmRfZGF0YSwgMCwgc2l6ZW9mKGtpYmxuZF9kYXRhKSk7IC8qIHplcm8gcG9pbnRlcnMsIGZsYWdzIGV0YyAqLworCS8qIHplcm8gcG9pbnRlcnMsIGZsYWdzIGV0YyAqLworCW1lbXNldCgma2libG5kX2RhdGEsIDAsIHNpemVvZihraWJsbmRfZGF0YSkpOwogCiAJcndsb2NrX2luaXQoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jayk7CiAKQEAgLTI4ODYsOSArMjgyMyw4IEBACiAJTElCQ0ZTX0FMTE9DKGtpYmxuZF9kYXRhLmtpYl9wZWVycywKIAkJICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKgogCQkJICAgIGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZSk7Ci0JaWYgKGtpYmxuZF9kYXRhLmtpYl9wZWVycyA9PSBOVUxMKSB7CisJaWYgKGtpYmxuZF9kYXRhLmtpYl9wZWVycyA9PSBOVUxMKQogCQlnb3RvIGZhaWxlZDsKLQl9CiAJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKQogCQlJTklUX0xJU1RfSEVBRCgma2libG5kX2RhdGEua2liX3BlZXJzW2ldKTsKIApAQCAtMjk1NSw4ICsyODkxLDcgQEAKIAlyZXR1cm4gLUVORVRET1dOOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfc3RhcnRfc2NoZWR1bGVycyhzdHJ1Y3Qga2liX3NjaGVkX2luZm8gKnNjaGVkKQorc3RhdGljIGludCBraWJsbmRfc3RhcnRfc2NoZWR1bGVycyhzdHJ1Y3Qga2liX3NjaGVkX2luZm8gKnNjaGVkKQogewogCWludAlyYyA9IDA7CiAJaW50CW50aHJzOwpAQCAtMjk3NCwxMiArMjkwOSwxMyBAQAogCX0gZWxzZSB7CiAJCUxBU1NFUlQoc2NoZWQtPmlic19udGhyZWFkcyA8PSBzY2hlZC0+aWJzX250aHJlYWRzX21heCk7CiAJCS8qIGluY3JlYXNlIG9uZSB0aHJlYWQgaWYgdGhlcmUgaXMgbmV3IGludGVyZmFjZSAqLwotCQludGhycyA9IChzY2hlZC0+aWJzX250aHJlYWRzIDwgc2NoZWQtPmlic19udGhyZWFkc19tYXgpOworCQludGhycyA9IHNjaGVkLT5pYnNfbnRocmVhZHMgPCBzY2hlZC0+aWJzX250aHJlYWRzX21heDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnRocnM7IGkrKykgewogCQlsb25nCWlkOwogCQljaGFyCW5hbWVbMjBdOworCiAJCWlkID0gS0lCX1RIUkVBRF9JRChzY2hlZC0+aWJzX2NwdCwgc2NoZWQtPmlic19udGhyZWFkcyArIGkpOwogCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJraWJsbmRfc2RfJTAybGRfJTAybGQiLAogCQkJIEtJQl9USFJFQURfQ1BUKGlkKSwgS0lCX1RIUkVBRF9USUQoaWQpKTsKQEAgLTI5OTYsOCArMjkzMiw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfZGV2X3N0YXJ0X3RocmVhZHMoa2liX2Rldl90ICpkZXYsIGludCBuZXdkZXYsIF9fdTMyICpjcHRzLCBpbnQgbmNwdHMpCitzdGF0aWMgaW50IGtpYmxuZF9kZXZfc3RhcnRfdGhyZWFkcyhraWJfZGV2X3QgKmRldiwgaW50IG5ld2RldiwgX191MzIgKmNwdHMsCisJCQkJICAgIGludCBuY3B0cykKIHsKIAlpbnQJY3B0OwogCWludAlyYzsKQEAgLTMwMjIsOCArMjk1OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBraWJfZGV2X3QgKgota2libG5kX2Rldl9zZWFyY2goY2hhciAqaWZuYW1lKQorc3RhdGljIGtpYl9kZXZfdCAqa2libG5kX2Rldl9zZWFyY2goY2hhciAqaWZuYW1lKQogewogCWtpYl9kZXZfdAkqYWxpYXMgPSBOVUxMOwogCWtpYl9kZXZfdAkqZGV2OwpAQCAtMzA1NSw4ICsyOTkwLDcgQEAKIAlyZXR1cm4gYWxpYXM7CiB9CiAKLWludAota2libG5kX3N0YXJ0dXAgKGxuZXRfbmlfdCAqbmkpCitpbnQga2libG5kX3N0YXJ0dXAobG5ldF9uaV90ICpuaSkKIHsKIAljaGFyCQkgICAgICppZm5hbWU7CiAJa2liX2Rldl90CQkqaWJkZXYgPSBOVUxMOwpAQCAtMzA2Niw3ICszMDAwLDcgQEAKIAlpbnQJCSAgICAgICByYzsKIAlpbnQJCQkgIG5ld2RldjsKIAotCUxBU1NFUlQgKG5pLT5uaV9sbmQgPT0gJnRoZV9vMmlibG5kKTsKKwlMQVNTRVJUKG5pLT5uaV9sbmQgPT0gJnRoZV9vMmlibG5kKTsKIAogCWlmIChraWJsbmRfZGF0YS5raWJfaW5pdCA9PSBJQkxORF9JTklUX05PVEhJTkcpIHsKIAkJcmMgPSBraWJsbmRfYmFzZV9zdGFydHVwKCk7CkBAIC0zMDkwLDcgKzMwMjQsNyBAQAogCWlmIChuaS0+bmlfaW50ZXJmYWNlc1swXSAhPSBOVUxMKSB7CiAJCS8qIFVzZSB0aGUgSVBvSUIgaW50ZXJmYWNlIHNwZWNpZmllZCBpbiAnbmV0d29ya3M9JyAqLwogCi0JCUNMQVNTRVJUIChMTkVUX01BWF9JTlRFUkZBQ0VTID4gMSk7CisJCUNMQVNTRVJUKExORVRfTUFYX0lOVEVSRkFDRVMgPiAxKTsKIAkJaWYgKG5pLT5uaV9pbnRlcmZhY2VzWzFdICE9IE5VTEwpIHsKIAkJCUNFUlJPUigiTXVsdGlwbGUgaW50ZXJmYWNlcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCWdvdG8gZmFpbGVkOwpAQCAtMzE1MCwyMiArMzA4NCwyMiBAQAogCXJldHVybiAtRU5FVERPV047CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAota2libG5kX21vZHVsZV9maW5pICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGtpYmxuZF9tb2R1bGVfZmluaSh2b2lkKQogewogCWxuZXRfdW5yZWdpc3Rlcl9sbmQoJnRoZV9vMmlibG5kKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLWtpYmxuZF9tb2R1bGVfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGtpYmxuZF9tb2R1bGVfaW5pdCh2b2lkKQogewogCWludCAgICByYzsKIAotCUNMQVNTRVJUIChzaXplb2Yoa2liX21zZ190KSA8PSBJQkxORF9NU0dfU0laRSk7Ci0JQ0xBU1NFUlQgKG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UuZ2V0LmliZ21fcmQucmRfZnJhZ3NbSUJMTkRfTUFYX1JETUFfRlJBR1NdKQotCQkgIDw9IElCTE5EX01TR19TSVpFKTsKLQlDTEFTU0VSVCAob2Zmc2V0b2Yoa2liX21zZ190LCBpYm1fdS5wdXRhY2suaWJwYW1fcmQucmRfZnJhZ3NbSUJMTkRfTUFYX1JETUFfRlJBR1NdKQotCQkgIDw9IElCTE5EX01TR19TSVpFKTsKKwlDTEFTU0VSVChzaXplb2Yoa2liX21zZ190KSA8PSBJQkxORF9NU0dfU0laRSk7CisJQ0xBU1NFUlQob2Zmc2V0b2Yoa2liX21zZ190LAorCQlpYm1fdS5nZXQuaWJnbV9yZC5yZF9mcmFnc1tJQkxORF9NQVhfUkRNQV9GUkFHU10pCisJCTw9IElCTE5EX01TR19TSVpFKTsKKwlDTEFTU0VSVChvZmZzZXRvZihraWJfbXNnX3QsCisJCWlibV91LnB1dGFjay5pYnBhbV9yZC5yZF9mcmFnc1tJQkxORF9NQVhfUkRNQV9GUkFHU10pCisJCTw9IElCTE5EX01TR19TSVpFKTsKIAogCXJjID0ga2libG5kX3R1bmFibGVzX2luaXQoKTsKIAlpZiAocmMgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuaAppbmRleCBhYjEyOGRlLi5jZDY2NGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5oCkBAIC00Niw4ICs0Niw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYwppbmRleCA0OGQ4ODVkLi5kYmYzNzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jCkBAIC00MSwxOSArNDEsMTkgQEAKICNpbmNsdWRlICJvMmlibG5kLmgiCiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfdHhfZG9uZSAobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4KQora2libG5kX3R4X2RvbmUobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4KQogewogCWxuZXRfbXNnX3QgKmxudG1zZ1syXTsKIAlraWJfbmV0X3QgICpuZXQgPSBuaS0+bmlfZGF0YTsKIAlpbnQJIHJjOwogCWludAkgaTsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOwotCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsJICAgICAgIC8qIG11c3RuJ3QgYmUgcXVldWVkIGZvciBzZW5kaW5nICovCi0JTEFTU0VSVCAodHgtPnR4X3NlbmRpbmcgPT0gMCk7CSAgLyogbXVzdG4ndCBiZSBhd2FpdGluZyBzZW50IGNhbGxiYWNrICovCi0JTEFTU0VSVCAoIXR4LT50eF93YWl0aW5nKTsJICAgICAgLyogbXVzdG4ndCBiZSBhd2FpdGluZyBwZWVyIHJlc3BvbnNlICovCi0JTEFTU0VSVCAodHgtPnR4X3Bvb2wgIT0gTlVMTCk7CisJTEFTU0VSVChuZXQgIT0gTlVMTCk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoIXR4LT50eF9xdWV1ZWQpOwkgICAgICAgLyogbXVzdG4ndCBiZSBxdWV1ZWQgZm9yIHNlbmRpbmcgKi8KKwlMQVNTRVJUKHR4LT50eF9zZW5kaW5nID09IDApOwkgIC8qIG11c3RuJ3QgYmUgYXdhaXRpbmcgc2VudCBjYWxsYmFjayAqLworCUxBU1NFUlQoIXR4LT50eF93YWl0aW5nKTsJICAgICAgLyogbXVzdG4ndCBiZSBhd2FpdGluZyBwZWVyIHJlc3BvbnNlICovCisJTEFTU0VSVCh0eC0+dHhfcG9vbCAhPSBOVUxMKTsKIAogCWtpYmxuZF91bm1hcF90eChuaSwgdHgpOwogCkBAIC02Myw3ICs2Myw3IEBACiAJcmMgPSB0eC0+dHhfc3RhdHVzOwogCiAJaWYgKHR4LT50eF9jb25uICE9IE5VTEwpIHsKLQkJTEFTU0VSVCAobmkgPT0gdHgtPnR4X2Nvbm4tPmliY19wZWVyLT5pYnBfbmkpOworCQlMQVNTRVJUKG5pID09IHR4LT50eF9jb25uLT5pYmNfcGVlci0+aWJwX25pKTsKIAogCQlraWJsbmRfY29ubl9kZWNyZWYodHgtPnR4X2Nvbm4pOwogCQl0eC0+dHhfY29ubiA9IE5VTEw7CkBAIC04NCwxMiArODQsMTIgQEAKIH0KIAogdm9pZAota2libG5kX3R4bGlzdF9kb25lIChsbmV0X25pX3QgKm5pLCBzdHJ1Y3QgbGlzdF9oZWFkICp0eGxpc3QsIGludCBzdGF0dXMpCitraWJsbmRfdHhsaXN0X2RvbmUobG5ldF9uaV90ICpuaSwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LCBpbnQgc3RhdHVzKQogewogCWtpYl90eF90ICp0eDsKIAotCXdoaWxlICghbGlzdF9lbXB0eSAodHhsaXN0KSkgewotCQl0eCA9IGxpc3RfZW50cnkgKHR4bGlzdC0+bmV4dCwga2liX3R4X3QsIHR4X2xpc3QpOworCXdoaWxlICghbGlzdF9lbXB0eSh0eGxpc3QpKSB7CisJCXR4ID0gbGlzdF9lbnRyeSh0eGxpc3QtPm5leHQsIGtpYl90eF90LCB0eF9saXN0KTsKIAogCQlsaXN0X2RlbCgmdHgtPnR4X2xpc3QpOwogCQkvKiBjb21wbGV0ZSBub3cgKi8KQEAgLTExMywxNiArMTEzLDE2IEBACiAJCXJldHVybiBOVUxMOwogCXR4ID0gY29udGFpbmVyX29mKG5vZGUsIGtpYl90eF90LCB0eF9saXN0KTsKIAotCUxBU1NFUlQgKHR4LT50eF9ud3JxID09IDApOwotCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsKLQlMQVNTRVJUICh0eC0+dHhfc2VuZGluZyA9PSAwKTsKLQlMQVNTRVJUICghdHgtPnR4X3dhaXRpbmcpOwotCUxBU1NFUlQgKHR4LT50eF9zdGF0dXMgPT0gMCk7Ci0JTEFTU0VSVCAodHgtPnR4X2Nvbm4gPT0gTlVMTCk7Ci0JTEFTU0VSVCAodHgtPnR4X2xudG1zZ1swXSA9PSBOVUxMKTsKLQlMQVNTRVJUICh0eC0+dHhfbG50bXNnWzFdID09IE5VTEwpOwotCUxBU1NFUlQgKHR4LT50eF91LnBtciA9PSBOVUxMKTsKLQlMQVNTRVJUICh0eC0+dHhfbmZyYWdzID09IDApOworCUxBU1NFUlQodHgtPnR4X253cnEgPT0gMCk7CisJTEFTU0VSVCghdHgtPnR4X3F1ZXVlZCk7CisJTEFTU0VSVCh0eC0+dHhfc2VuZGluZyA9PSAwKTsKKwlMQVNTRVJUKCF0eC0+dHhfd2FpdGluZyk7CisJTEFTU0VSVCh0eC0+dHhfc3RhdHVzID09IDApOworCUxBU1NFUlQodHgtPnR4X2Nvbm4gPT0gTlVMTCk7CisJTEFTU0VSVCh0eC0+dHhfbG50bXNnWzBdID09IE5VTEwpOworCUxBU1NFUlQodHgtPnR4X2xudG1zZ1sxXSA9PSBOVUxMKTsKKwlMQVNTRVJUKHR4LT50eF91LnBtciA9PSBOVUxMKTsKKwlMQVNTRVJUKHR4LT50eF9uZnJhZ3MgPT0gMCk7CiAKIAlyZXR1cm4gdHg7CiB9CkBAIC0xNDMsNyArMTQzLDcgQEAKIH0KIAogaW50Ci1raWJsbmRfcG9zdF9yeCAoa2liX3J4X3QgKnJ4LCBpbnQgY3JlZGl0KQora2libG5kX3Bvc3Rfcngoa2liX3J4X3QgKnJ4LCBpbnQgY3JlZGl0KQogewogCWtpYl9jb25uX3QJICpjb25uID0gcngtPnJ4X2Nvbm47CiAJa2liX25ldF90CSAgKm5ldCA9IGNvbm4tPmliY19wZWVyLT5pYnBfbmktPm5pX2RhdGE7CkBAIC0xNTEsMTQgKzE1MSwxNCBAQAogCXN0cnVjdCBpYl9tciAgICAgICAqbXI7CiAJaW50CQkgcmM7CiAKLQlMQVNTRVJUIChuZXQgIT0gTlVMTCk7Ci0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUIChjcmVkaXQgPT0gSUJMTkRfUE9TVFJYX05PX0NSRURJVCB8fAotCQkgY3JlZGl0ID09IElCTE5EX1BPU1RSWF9QRUVSX0NSRURJVCB8fAotCQkgY3JlZGl0ID09IElCTE5EX1BPU1RSWF9SU1JWRF9DUkVESVQpOworCUxBU1NFUlQobmV0ICE9IE5VTEwpOworCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKKwlMQVNTRVJUKGNyZWRpdCA9PSBJQkxORF9QT1NUUlhfTk9fQ1JFRElUIHx8CisJCWNyZWRpdCA9PSBJQkxORF9QT1NUUlhfUEVFUl9DUkVESVQgfHwKKwkJY3JlZGl0ID09IElCTE5EX1BPU1RSWF9SU1JWRF9DUkVESVQpOwogCiAJbXIgPSBraWJsbmRfZmluZF9kbWFfbXIoY29ubi0+aWJjX2hkZXYsIHJ4LT5yeF9tc2dhZGRyLCBJQkxORF9NU0dfU0laRSk7Ci0JTEFTU0VSVCAobXIgIT0gTlVMTCk7CisJTEFTU0VSVChtciAhPSBOVUxMKTsKIAogCXJ4LT5yeF9zZ2UubGtleSAgID0gbXItPmxrZXk7CiAJcngtPnJ4X3NnZS5hZGRyICAgPSByeC0+cnhfbXNnYWRkcjsKQEAgLTE2OSw4ICsxNjksOCBAQAogCXJ4LT5yeF93cnEubnVtX3NnZSA9IDE7CiAJcngtPnJ4X3dycS53cl9pZCA9IGtpYmxuZF9wdHIyd3JlcWlkKHJ4LCBJQkxORF9XSURfUlgpOwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fSU5JVCk7Ci0JTEFTU0VSVCAocngtPnJ4X25vYiA+PSAwKTsJICAgICAgLyogbm90IHBvc3RlZCAqLworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fSU5JVCk7CisJTEFTU0VSVChyeC0+cnhfbm9iID49IDApOwkgICAgICAvKiBub3QgcG9zdGVkICovCiAKIAlpZiAoY29ubi0+aWJjX3N0YXRlID4gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCkgewogCQlraWJsbmRfZHJvcF9yeChyeCk7CSAgICAgLyogTm8gbW9yZSBwb3N0cyBmb3IgdGhpcyByeCAqLwpAQCAtMjE3LDggKzIxNyw4IEBACiAJbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfYWN0aXZlX3R4cykgewogCQlraWJfdHhfdCAqdHggPSBsaXN0X2VudHJ5KHRtcCwga2liX3R4X3QsIHR4X2xpc3QpOwogCi0JCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsKLQkJTEFTU0VSVCAodHgtPnR4X3NlbmRpbmcgIT0gMCB8fCB0eC0+dHhfd2FpdGluZyk7CisJCUxBU1NFUlQoIXR4LT50eF9xdWV1ZWQpOworCQlMQVNTRVJUKHR4LT50eF9zZW5kaW5nICE9IDAgfHwgdHgtPnR4X3dhaXRpbmcpOwogCiAJCWlmICh0eC0+dHhfY29va2llICE9IGNvb2tpZSkKIAkJCWNvbnRpbnVlOwpAQCAtMjkzLDcgKzI5Myw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfaGFuZGxlX3J4IChraWJfcnhfdCAqcngpCitraWJsbmRfaGFuZGxlX3J4KGtpYl9yeF90ICpyeCkKIHsKIAlraWJfbXNnX3QgICAgKm1zZyA9IHJ4LT5yeF9tc2c7CiAJa2liX2Nvbm5fdCAgICpjb25uID0gcngtPnJ4X2Nvbm47CkBAIC0zMDQsMTEgKzMwNCwxMSBAQAogCWludAkgICByYzI7CiAJaW50CSAgIHBvc3RfY3JlZGl0OwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOwogCi0JQ0RFQlVHIChEX05FVCwgIlJlY2VpdmVkICV4WyVkXSBmcm9tICVzXG4iLAotCQltc2ctPmlibV90eXBlLCBjcmVkaXRzLAotCQlsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOworCUNERUJVRyhEX05FVCwgIlJlY2VpdmVkICV4WyVkXSBmcm9tICVzXG4iLAorCSAgICAgICBtc2ctPmlibV90eXBlLCBjcmVkaXRzLAorCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOwogCiAJaWYgKGNyZWRpdHMgIT0gMCkgewogCQkvKiBIYXZlIEkgcmVjZWl2ZWQgY3JlZGl0cyB0aGF0IHdpbGwgbGV0IG1lIHNlbmQ/ICovCkBAIC0zNzcsOCArMzc3LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIElCTE5EX01TR19QVVRfTkFLOgotCQlDV0FSTiAoIlBVVF9OQUNLIGZyb20gJXNcbiIsCi0JCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOworCQlDV0FSTigiUFVUX05BQ0sgZnJvbSAlc1xuIiwKKwkJICAgICAgbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpKTsKIAkJcG9zdF9jcmVkaXQgPSBJQkxORF9QT1NUUlhfUlNSVkRfQ1JFRElUOwogCQlraWJsbmRfaGFuZGxlX2NvbXBsZXRpb24oY29ubiwgSUJMTkRfTVNHX1BVVF9SRVEsCiAJCQkJCSBtc2ctPmlibV91LmNvbXBsZXRpb24uaWJjbV9zdGF0dXMsCkBAIC00MDIsNyArNDAyLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJTEFTU0VSVCAodHgtPnR4X3dhaXRpbmcpOworCQlMQVNTRVJUKHR4LT50eF93YWl0aW5nKTsKIAkJLyogQ0FWRUFUIEVNUFRPUjogSSBjb3VsZCBiZSByYWNpbmcgd2l0aCB0eF9jb21wbGV0ZSwgYnV0Li4uCiAJCSAqIChhKSBJIGNhbiBvdmVyd3JpdGUgdHhfbXNnIHNpbmNlIG15IHBlZXIgaGFzIHJlY2VpdmVkIGl0IQogCQkgKiAoYikgdHhfd2FpdGluZyBzZXQgdGVsbHMgdHhfY29tcGxldGUoKSBpdCdzIG5vdCBkb25lLiAqLwpAQCAtNDU0LDcgKzQ1NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfcnhfY29tcGxldGUgKGtpYl9yeF90ICpyeCwgaW50IHN0YXR1cywgaW50IG5vYikKK2tpYmxuZF9yeF9jb21wbGV0ZShraWJfcnhfdCAqcngsIGludCBzdGF0dXMsIGludCBub2IpCiB7CiAJa2liX21zZ190ICAgICptc2cgPSByeC0+cnhfbXNnOwogCWtpYl9jb25uX3QgICAqY29ubiA9IHJ4LT5yeF9jb25uOwpAQCAtNDYzLDggKzQ2Myw4IEBACiAJaW50CSAgIHJjOwogCWludAkgICBlcnIgPSAtRUlPOwogCi0JTEFTU0VSVCAobmV0ICE9IE5VTEwpOwotCUxBU1NFUlQgKHJ4LT5yeF9ub2IgPCAwKTsJICAgICAgIC8qIHdhcyBwb3N0ZWQgKi8KKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKHJ4LT5yeF9ub2IgPCAwKTsJICAgICAgIC8qIHdhcyBwb3N0ZWQgKi8KIAlyeC0+cnhfbm9iID0gMDsJCQkgLyogaXNuJ3Qgbm93ICovCiAKIAlpZiAoY29ubi0+aWJjX3N0YXRlID4gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCkKQEAgLTQ3NiwxMiArNDc2LDEyIEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCUxBU1NFUlQgKG5vYiA+PSAwKTsKKwlMQVNTRVJUKG5vYiA+PSAwKTsKIAlyeC0+cnhfbm9iID0gbm9iOwogCiAJcmMgPSBraWJsbmRfdW5wYWNrX21zZyhtc2csIHJ4LT5yeF9ub2IpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUNFUlJPUiAoIkVycm9yICVkIHVucGFja2luZyByeCBmcm9tICVzXG4iLAorCQlDRVJST1IoIkVycm9yICVkIHVucGFja2luZyByeCBmcm9tICVzXG4iLAogCQkJcmMsIGxpYmNmc19uaWQyc3RyKGNvbm4tPmliY19wZWVyLT5pYnBfbmlkKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTQ5MCw3ICs0OTAsNyBAQAogCSAgICBtc2ctPmlibV9kc3RuaWQgIT0gbmktPm5pX25pZCB8fAogCSAgICBtc2ctPmlibV9zcmNzdGFtcCAhPSBjb25uLT5pYmNfaW5jYXJuYXRpb24gfHwKIAkgICAgbXNnLT5pYm1fZHN0c3RhbXAgIT0gbmV0LT5pYm5faW5jYXJuYXRpb24pIHsKLQkJQ0VSUk9SICgiU3RhbGUgcnggZnJvbSAlc1xuIiwKKwkJQ0VSUk9SKCJTdGFsZSByeCBmcm9tICVzXG4iLAogCQkJbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpKTsKIAkJZXJyID0gLUVTVEFMRTsKIAkJZ290byBmYWlsZWQ7CkBAIC01MjUsMTMgKzUyNSwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKgota2libG5kX2t2YWRkcl90b19wYWdlICh1bnNpZ25lZCBsb25nIHZhZGRyKQora2libG5kX2t2YWRkcl90b19wYWdlKHVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAlpZiAoaXNfdm1hbGxvY19hZGRyKCh2b2lkICopdmFkZHIpKSB7Ci0JCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UgKCh2b2lkICopdmFkZHIpOwotCQlMQVNTRVJUIChwYWdlICE9IE5VTEwpOworCQlwYWdlID0gdm1hbGxvY190b19wYWdlKCh2b2lkICopdmFkZHIpOworCQlMQVNTRVJUKHBhZ2UgIT0gTlVMTCk7CiAJCXJldHVybiBwYWdlOwogCX0KICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtNTQyLDggKzU0Miw4IEBACiAJCUxCVUcoKTsKIAl9CiAjZW5kaWYKLQlwYWdlID0gdmlydF90b19wYWdlICh2YWRkcik7Ci0JTEFTU0VSVCAocGFnZSAhPSBOVUxMKTsKKwlwYWdlID0gdmlydF90b19wYWdlKHZhZGRyKTsKKwlMQVNTRVJUKHBhZ2UgIT0gTlVMTCk7CiAJcmV0dXJuIHBhZ2U7CiB9CiAKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCWZvciAoaSA9IDAsIG5wYWdlcyA9IDA7IGkgPCByZC0+cmRfbmZyYWdzOyBpKyspIHsKIAkJZm9yIChzaXplID0gMDsgc2l6ZSA8ICByZC0+cmRfZnJhZ3NbaV0ucmZfbm9iOwogCQkJICAgICAgIHNpemUgKz0gaGRldi0+aWJoX3BhZ2Vfc2l6ZSkgewotCQkJcGFnZXNbbnBhZ2VzICsrXSA9IChyZC0+cmRfZnJhZ3NbaV0ucmZfYWRkciAmCisJCQlwYWdlc1tucGFnZXMrK10gPSAocmQtPnJkX2ZyYWdzW2ldLnJmX2FkZHIgJgogCQkJCQkgICAgaGRldi0+aWJoX3BhZ2VfbWFzaykgKyBzaXplOwogCQl9CiAJfQpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJZnBzID0gbmV0LT5pYm5fZm1yX3BzW2NwdF07CiAJcmMgPSBraWJsbmRfZm1yX3Bvb2xfbWFwKGZwcywgcGFnZXMsIG5wYWdlcywgMCwgJnR4LT50eF91LmZtcik7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3QgbWFwICVkIHBhZ2VzOiAlZFxuIiwgbnBhZ2VzLCByYyk7CisJCUNFUlJPUigiQ2FuJ3QgbWFwICVkIHBhZ2VzOiAlZFxuIiwgbnBhZ2VzLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTcwNiwyNiArNzA2LDI2IEBACiAJaW50CQkgZnJhZ25vYjsKIAlpbnQJCSBwYWdlX29mZnNldDsKIAotCUxBU1NFUlQgKG5vYiA+IDApOwotCUxBU1NFUlQgKG5pb3YgPiAwKTsKLQlMQVNTRVJUIChuZXQgIT0gTlVMTCk7CisJTEFTU0VSVChub2IgPiAwKTsKKwlMQVNTRVJUKG5pb3YgPiAwKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCXdoaWxlIChvZmZzZXQgPj0gaW92LT5pb3ZfbGVuKSB7CiAJCW9mZnNldCAtPSBpb3YtPmlvdl9sZW47CiAJCW5pb3YtLTsKIAkJaW92Kys7Ci0JCUxBU1NFUlQgKG5pb3YgPiAwKTsKKwkJTEFTU0VSVChuaW92ID4gMCk7CiAJfQogCiAJc2cgPSB0eC0+dHhfZnJhZ3M7CiAJZG8gewotCQlMQVNTRVJUIChuaW92ID4gMCk7CisJCUxBU1NFUlQobmlvdiA+IDApOwogCiAJCXZhZGRyID0gKCh1bnNpZ25lZCBsb25nKWlvdi0+aW92X2Jhc2UpICsgb2Zmc2V0OwogCQlwYWdlX29mZnNldCA9IHZhZGRyICYgKFBBR0VfU0laRSAtIDEpOwogCQlwYWdlID0ga2libG5kX2t2YWRkcl90b19wYWdlKHZhZGRyKTsKIAkJaWYgKHBhZ2UgPT0gTlVMTCkgewotCQkJQ0VSUk9SICgiQ2FuJ3QgZmluZCBwYWdlXG4iKTsKKwkJCUNFUlJPUigiQ2FuJ3QgZmluZCBwYWdlXG4iKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKQEAgLTc0OSw3ICs3NDksNyBAQAogfQogCiBzdGF0aWMgaW50Ci1raWJsbmRfc2V0dXBfcmRfa2lvdiAobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4LCBraWJfcmRtYV9kZXNjX3QgKnJkLAora2libG5kX3NldHVwX3JkX2tpb3YobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4LCBraWJfcmRtYV9kZXNjX3QgKnJkLAogCQkgICAgICBpbnQgbmtpb3YsIGxuZXRfa2lvdl90ICpraW92LCBpbnQgb2Zmc2V0LCBpbnQgbm9iKQogewogCWtpYl9uZXRfdAkgICpuZXQgPSBuaS0+bmlfZGF0YTsKQEAgLTc1OCwyMCArNzU4LDIwIEBACiAKIAlDREVCVUcoRF9ORVQsICJuaW92ICVkIG9mZnNldCAlZCBub2IgJWRcbiIsIG5raW92LCBvZmZzZXQsIG5vYik7CiAKLQlMQVNTRVJUIChub2IgPiAwKTsKLQlMQVNTRVJUIChua2lvdiA+IDApOwotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKG5vYiA+IDApOworCUxBU1NFUlQobmtpb3YgPiAwKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCXdoaWxlIChvZmZzZXQgPj0ga2lvdi0+a2lvdl9sZW4pIHsKIAkJb2Zmc2V0IC09IGtpb3YtPmtpb3ZfbGVuOwogCQlua2lvdi0tOwogCQlraW92Kys7Ci0JCUxBU1NFUlQgKG5raW92ID4gMCk7CisJCUxBU1NFUlQobmtpb3YgPiAwKTsKIAl9CiAKIAlzZyA9IHR4LT50eF9mcmFnczsKIAlkbyB7Ci0JCUxBU1NFUlQgKG5raW92ID4gMCk7CisJCUxBU1NFUlQobmtpb3YgPiAwKTsKIAogCQlmcmFnbm9iID0gbWluKChpbnQpKGtpb3YtPmtpb3ZfbGVuIC0gb2Zmc2V0KSwgbm9iKTsKIApAQCAtNzg5LDcgKzc4OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWtpYmxuZF9wb3N0X3R4X2xvY2tlZCAoa2liX2Nvbm5fdCAqY29ubiwga2liX3R4X3QgKnR4LCBpbnQgY3JlZGl0KQora2libG5kX3Bvc3RfdHhfbG9ja2VkKGtpYl9jb25uX3QgKmNvbm4sIGtpYl90eF90ICp0eCwgaW50IGNyZWRpdCkKIAlfX3JlbGVhc2VzKGNvbm4tPmliY19sb2NrKQogCV9fYWNxdWlyZXMoY29ubi0+aWJjX2xvY2spCiB7CkBAIC04MDAsMTYgKzgwMCwxNiBAQAogCWludAkJZG9uZTsKIAlzdHJ1Y3QgaWJfc2VuZF93ciAqYmFkX3dycTsKIAotCUxBU1NFUlQgKHR4LT50eF9xdWV1ZWQpOworCUxBU1NFUlQodHgtPnR4X3F1ZXVlZCk7CiAJLyogV2UgcmVseSBvbiB0aGlzIGZvciBRUCBzaXppbmcgKi8KLQlMQVNTRVJUICh0eC0+dHhfbndycSA+IDApOwotCUxBU1NFUlQgKHR4LT50eF9ud3JxIDw9IDEgKyBJQkxORF9SRE1BX0ZSQUdTKHZlcikpOworCUxBU1NFUlQodHgtPnR4X253cnEgPiAwKTsKKwlMQVNTRVJUKHR4LT50eF9ud3JxIDw9IDEgKyBJQkxORF9SRE1BX0ZSQUdTKHZlcikpOwogCi0JTEFTU0VSVCAoY3JlZGl0ID09IDAgfHwgY3JlZGl0ID09IDEpOwotCUxBU1NFUlQgKGNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzID49IDApOwotCUxBU1NFUlQgKGNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzIDw9IElCTE5EX01TR19RVUVVRV9TSVpFKHZlcikpOwotCUxBU1NFUlQgKGNvbm4tPmliY19jcmVkaXRzID49IDApOwotCUxBU1NFUlQgKGNvbm4tPmliY19jcmVkaXRzIDw9IElCTE5EX01TR19RVUVVRV9TSVpFKHZlcikpOworCUxBU1NFUlQoY3JlZGl0ID09IDAgfHwgY3JlZGl0ID09IDEpOworCUxBU1NFUlQoY29ubi0+aWJjX291dHN0YW5kaW5nX2NyZWRpdHMgPj0gMCk7CisJTEFTU0VSVChjb25uLT5pYmNfb3V0c3RhbmRpbmdfY3JlZGl0cyA8PSBJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXIpKTsKKwlMQVNTRVJUKGNvbm4tPmliY19jcmVkaXRzID49IDApOworCUxBU1NFUlQoY29ubi0+aWJjX2NyZWRpdHMgPD0gSUJMTkRfTVNHX1FVRVVFX1NJWkUodmVyKSk7CiAKIAlpZiAoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPT0gSUJMTkRfQ09OQ1VSUkVOVF9TRU5EUyh2ZXIpKSB7CiAJCS8qIHR4IGNvbXBsZXRpb25zIG91dHN0YW5kaW5nLi4uICovCkBAIC05MjMsNyArOTIzLDcgQEAKIH0KIAogdm9pZAota2libG5kX2NoZWNrX3NlbmRzIChraWJfY29ubl90ICpjb25uKQora2libG5kX2NoZWNrX3NlbmRzKGtpYl9jb25uX3QgKmNvbm4pCiB7CiAJaW50CXZlciA9IGNvbm4tPmliY192ZXJzaW9uOwogCWxuZXRfbmlfdCAqbmkgPSBjb25uLT5pYmNfcGVlci0+aWJwX25pOwpAQCAtOTM4LDEwICs5MzgsMTAgQEAKIAogCXNwaW5fbG9jaygmY29ubi0+aWJjX2xvY2spOwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPD0gSUJMTkRfQ09OQ1VSUkVOVF9TRU5EUyh2ZXIpKTsKLQlMQVNTRVJUICghSUJMTkRfT09CX0NBUEFCTEUodmVyKSB8fAorCUxBU1NFUlQoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPD0gSUJMTkRfQ09OQ1VSUkVOVF9TRU5EUyh2ZXIpKTsKKwlMQVNTRVJUKCFJQkxORF9PT0JfQ0FQQUJMRSh2ZXIpIHx8CiAJCSBjb25uLT5pYmNfbm9vcHNfcG9zdGVkIDw9IElCTE5EX09PQl9NU0dTKHZlcikpOwotCUxBU1NFUlQgKGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzID49IDApOworCUxBU1NFUlQoY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPj0gMCk7CiAKIAl3aGlsZSAoY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPiAwICYmCiAJICAgICAgICFsaXN0X2VtcHR5KCZjb25uLT5pYmNfdHhfcXVldWVfcnNydmQpKSB7CkBAIC05NzQsNyArOTc0LDcgQEAKIAkJCXR4ID0gbGlzdF9lbnRyeShjb25uLT5pYmNfdHhfcXVldWVfbm9jcmVkLm5leHQsCiAJCQkJCSAgICBraWJfdHhfdCwgdHhfbGlzdCk7CiAJCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPmliY190eF9ub29wcykpIHsKLQkJCUxBU1NFUlQgKCFJQkxORF9PT0JfQ0FQQUJMRSh2ZXIpKTsKKwkJCUxBU1NFUlQoIUlCTE5EX09PQl9DQVBBQkxFKHZlcikpOwogCQkJY3JlZGl0ID0gMTsKIAkJCXR4ID0gbGlzdF9lbnRyeShjb25uLT5pYmNfdHhfbm9vcHMubmV4dCwKIAkJCQkJa2liX3R4X3QsIHR4X2xpc3QpOwpAQCAtOTk1LDEzICs5OTUsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF90eF9jb21wbGV0ZSAoa2liX3R4X3QgKnR4LCBpbnQgc3RhdHVzKQora2libG5kX3R4X2NvbXBsZXRlKGtpYl90eF90ICp0eCwgaW50IHN0YXR1cykKIHsKIAlpbnQJICAgZmFpbGVkID0gKHN0YXR1cyAhPSBJQl9XQ19TVUNDRVNTKTsKIAlraWJfY29ubl90ICAgKmNvbm4gPSB0eC0+dHhfY29ubjsKIAlpbnQJICAgaWRsZTsKIAotCUxBU1NFUlQgKHR4LT50eF9zZW5kaW5nID4gMCk7CisJTEFTU0VSVCh0eC0+dHhfc2VuZGluZyA+IDApOwogCiAJaWYgKGZhaWxlZCkgewogCQlpZiAoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpCkBAIC0xMDQ5LDIyICsxMDQ5LDIyIEBACiB9CiAKIHZvaWQKLWtpYmxuZF9pbml0X3R4X21zZyAobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4LCBpbnQgdHlwZSwgaW50IGJvZHlfbm9iKQora2libG5kX2luaXRfdHhfbXNnKGxuZXRfbmlfdCAqbmksIGtpYl90eF90ICp0eCwgaW50IHR5cGUsIGludCBib2R5X25vYikKIHsKIAlraWJfaGNhX2Rldl90ICAgICAqaGRldiA9IHR4LT50eF9wb29sLT50cG9faGRldjsKIAlzdHJ1Y3QgaWJfc2dlICAgICAqc2dlID0gJnR4LT50eF9zZ2VbdHgtPnR4X253cnFdOwogCXN0cnVjdCBpYl9zZW5kX3dyICp3cnEgPSAmdHgtPnR4X3dycVt0eC0+dHhfbndycV07Ci0JaW50CQlub2IgPSBvZmZzZXRvZiAoa2liX21zZ190LCBpYm1fdSkgKyBib2R5X25vYjsKKwlpbnQJCW5vYiA9IG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UpICsgYm9keV9ub2I7CiAJc3RydWN0IGliX21yICAgICAgKm1yOwogCi0JTEFTU0VSVCAodHgtPnR4X253cnEgPj0gMCk7Ci0JTEFTU0VSVCAodHgtPnR4X253cnEgPCBJQkxORF9NQVhfUkRNQV9GUkFHUyArIDEpOwotCUxBU1NFUlQgKG5vYiA8PSBJQkxORF9NU0dfU0laRSk7CisJTEFTU0VSVCh0eC0+dHhfbndycSA+PSAwKTsKKwlMQVNTRVJUKHR4LT50eF9ud3JxIDwgSUJMTkRfTUFYX1JETUFfRlJBR1MgKyAxKTsKKwlMQVNTRVJUKG5vYiA8PSBJQkxORF9NU0dfU0laRSk7CiAKIAlraWJsbmRfaW5pdF9tc2codHgtPnR4X21zZywgdHlwZSwgYm9keV9ub2IpOwogCiAJbXIgPSBraWJsbmRfZmluZF9kbWFfbXIoaGRldiwgdHgtPnR4X21zZ2FkZHIsIG5vYik7Ci0JTEFTU0VSVCAobXIgIT0gTlVMTCk7CisJTEFTU0VSVChtciAhPSBOVUxMKTsKIAogCXNnZS0+bGtleSAgID0gbXItPmxrZXk7CiAJc2dlLT5hZGRyICAgPSB0eC0+dHhfbXNnYWRkcjsKQEAgLTEwODMsNyArMTA4Myw3IEBACiB9CiAKIGludAota2libG5kX2luaXRfcmRtYSAoa2liX2Nvbm5fdCAqY29ubiwga2liX3R4X3QgKnR4LCBpbnQgdHlwZSwKK2tpYmxuZF9pbml0X3JkbWEoa2liX2Nvbm5fdCAqY29ubiwga2liX3R4X3QgKnR4LCBpbnQgdHlwZSwKIAkJICBpbnQgcmVzaWQsIGtpYl9yZG1hX2Rlc2NfdCAqZHN0cmQsIF9fdTY0IGRzdGNvb2tpZSkKIHsKIAlraWJfbXNnX3QJICppYm1zZyA9IHR4LT50eF9tc2c7CkBAIC0xMDk1LDkgKzEwOTUsOSBAQAogCWludAkJZHN0aWR4OwogCWludAkJd3Jrbm9iOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUICh0eC0+dHhfbndycSA9PSAwKTsKLQlMQVNTRVJUICh0eXBlID09IElCTE5EX01TR19HRVRfRE9ORSB8fAorCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKKwlMQVNTRVJUKHR4LT50eF9ud3JxID09IDApOworCUxBU1NFUlQodHlwZSA9PSBJQkxORF9NU0dfR0VUX0RPTkUgfHwKIAkJIHR5cGUgPT0gSUJMTkRfTVNHX1BVVF9ET05FKTsKIAogCXNyY2lkeCA9IGRzdGlkeCA9IDA7CkBAIC0xMTYyLDE5ICsxMTYyLDE5IEBACiAJaWJtc2ctPmlibV91LmNvbXBsZXRpb24uaWJjbV9zdGF0dXMgPSByYzsKIAlpYm1zZy0+aWJtX3UuY29tcGxldGlvbi5pYmNtX2Nvb2tpZSA9IGRzdGNvb2tpZTsKIAlraWJsbmRfaW5pdF90eF9tc2coY29ubi0+aWJjX3BlZXItPmlicF9uaSwgdHgsCi0JCQkgICB0eXBlLCBzaXplb2YgKGtpYl9jb21wbGV0aW9uX21zZ190KSk7CisJCQkgICB0eXBlLCBzaXplb2Yoa2liX2NvbXBsZXRpb25fbXNnX3QpKTsKIAogCXJldHVybiByYzsKIH0KIAogdm9pZAota2libG5kX3F1ZXVlX3R4X2xvY2tlZCAoa2liX3R4X3QgKnR4LCBraWJfY29ubl90ICpjb25uKQora2libG5kX3F1ZXVlX3R4X2xvY2tlZChraWJfdHhfdCAqdHgsIGtpYl9jb25uX3QgKmNvbm4pCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAgICpxOwogCi0JTEFTU0VSVCAodHgtPnR4X253cnEgPiAwKTsJICAgICAgLyogd29yayBpdGVtcyBzZXQgdXAgKi8KLQlMQVNTRVJUICghdHgtPnR4X3F1ZXVlZCk7CSAgICAgICAvKiBub3QgcXVldWVkIGZvciBzZW5kaW5nIGFscmVhZHkgKi8KLQlMQVNTRVJUIChjb25uLT5pYmNfc3RhdGUgPj0gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCk7CisJTEFTU0VSVCh0eC0+dHhfbndycSA+IDApOwkgICAgICAvKiB3b3JrIGl0ZW1zIHNldCB1cCAqLworCUxBU1NFUlQoIXR4LT50eF9xdWV1ZWQpOwkgICAgICAgLyogbm90IHF1ZXVlZCBmb3Igc2VuZGluZyBhbHJlYWR5ICovCisJTEFTU0VSVChjb25uLT5pYmNfc3RhdGUgPj0gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCk7CiAKIAl0eC0+dHhfcXVldWVkID0gMTsKIAl0eC0+dHhfZGVhZGxpbmUgPSBqaWZmaWVzICsgKCpraWJsbmRfdHVuYWJsZXMua2liX3RpbWVvdXQgKiBIWik7CkBAIC0xMTgyLDExICsxMTgyLDExIEBACiAJaWYgKHR4LT50eF9jb25uID09IE5VTEwpIHsKIAkJa2libG5kX2Nvbm5fYWRkcmVmKGNvbm4pOwogCQl0eC0+dHhfY29ubiA9IGNvbm47Ci0JCUxBU1NFUlQgKHR4LT50eF9tc2ctPmlibV90eXBlICE9IElCTE5EX01TR19QVVRfRE9ORSk7CisJCUxBU1NFUlQodHgtPnR4X21zZy0+aWJtX3R5cGUgIT0gSUJMTkRfTVNHX1BVVF9ET05FKTsKIAl9IGVsc2UgewogCQkvKiBQVVRfRE9ORSBmaXJzdCBhdHRhY2hlZCB0byBjb25uIGFzIGEgUFVUX1JFUSAqLwotCQlMQVNTRVJUICh0eC0+dHhfY29ubiA9PSBjb25uKTsKLQkJTEFTU0VSVCAodHgtPnR4X21zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX1BVVF9ET05FKTsKKwkJTEFTU0VSVCh0eC0+dHhfY29ubiA9PSBjb25uKTsKKwkJTEFTU0VSVCh0eC0+dHhfbXNnLT5pYm1fdHlwZSA9PSBJQkxORF9NU0dfUFVUX0RPTkUpOwogCX0KIAogCXN3aXRjaCAodHgtPnR4X21zZy0+aWJtX3R5cGUpIHsKQEAgLTEyMjEsNyArMTIyMSw3IEBACiB9CiAKIHZvaWQKLWtpYmxuZF9xdWV1ZV90eCAoa2liX3R4X3QgKnR4LCBraWJfY29ubl90ICpjb25uKQora2libG5kX3F1ZXVlX3R4KGtpYl90eF90ICp0eCwga2liX2Nvbm5fdCAqY29ubikKIHsKIAlzcGluX2xvY2soJmNvbm4tPmliY19sb2NrKTsKIAlraWJsbmRfcXVldWVfdHhfbG9ja2VkKHR4LCBjb25uKTsKQEAgLTEyNjgsNyArMTI2OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfY29ubmVjdF9wZWVyIChraWJfcGVlcl90ICpwZWVyKQora2libG5kX2Nvbm5lY3RfcGVlcihraWJfcGVlcl90ICpwZWVyKQogewogCXN0cnVjdCByZG1hX2NtX2lkICpjbWlkOwogCWtpYl9kZXZfdAkgKmRldjsKQEAgLTEyNzcsOCArMTI3Nyw4IEBACiAJc3RydWN0IHNvY2thZGRyX2luIGRzdGFkZHI7CiAJaW50CQlyYzsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKLQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDApOworCUxBU1NFUlQobmV0ICE9IE5VTEwpOworCUxBU1NFUlQocGVlci0+aWJwX2Nvbm5lY3RpbmcgPiAwKTsKIAogCWNtaWQgPSBraWJsbmRfcmRtYV9jcmVhdGVfaWQoa2libG5kX2NtX2NhbGxiYWNrLCBwZWVyLCBSRE1BX1BTX1RDUCwKIAkJCQkgICAgIElCX1FQVF9SQyk7CkBAIC0xMzE4LDcgKzEzMTgsNyBAQAogCQlnb3RvIGZhaWxlZDI7CiAJfQogCi0JTEFTU0VSVCAoY21pZC0+ZGV2aWNlICE9IE5VTEwpOworCUxBU1NFUlQoY21pZC0+ZGV2aWNlICE9IE5VTEwpOwogCUNERUJVRyhEX05FVCwgIiVzOiBjb25uZWN0aW9uIGJvdW5kIHRvICVzOiVwSTRoOiVzXG4iLAogCSAgICAgICBsaWJjZnNfbmlkMnN0cihwZWVyLT5pYnBfbmlkKSwgZGV2LT5pYmRfaWZuYW1lLAogCSAgICAgICAmZGV2LT5pYmRfaWZpcCwgY21pZC0+ZGV2aWNlLT5uYW1lKTsKQEAgLTEzMzMsNyArMTMzMyw3IEBACiB9CiAKIHZvaWQKLWtpYmxuZF9sYXVuY2hfdHggKGxuZXRfbmlfdCAqbmksIGtpYl90eF90ICp0eCwgbG5ldF9uaWRfdCBuaWQpCitraWJsbmRfbGF1bmNoX3R4KGxuZXRfbmlfdCAqbmksIGtpYl90eF90ICp0eCwgbG5ldF9uaWRfdCBuaWQpCiB7CiAJa2liX3BlZXJfdAkqcGVlcjsKIAlraWJfcGVlcl90CSpwZWVyMjsKQEAgLTEzNDUsOCArMTM0NSw4IEBACiAJLyogSWYgSSBnZXQgaGVyZSwgSSd2ZSBjb21taXR0ZWQgdG8gc2VuZCwgc28gSSBjb21wbGV0ZSB0aGUgdHggd2l0aAogCSAqIGZhaWx1cmUgb24gYW55IHByb2JsZW1zICovCiAKLQlMQVNTRVJUICh0eCA9PSBOVUxMIHx8IHR4LT50eF9jb25uID09IE5VTEwpOyAvKiBvbmx5IHNldCB3aGVuIGFzc2lnbmVkIGEgY29ubiAqLwotCUxBU1NFUlQgKHR4ID09IE5VTEwgfHwgdHgtPnR4X253cnEgPiAwKTsgICAgIC8qIHdvcmsgaXRlbXMgaGF2ZSBiZWVuIHNldCB1cCAqLworCUxBU1NFUlQodHggPT0gTlVMTCB8fCB0eC0+dHhfY29ubiA9PSBOVUxMKTsgLyogb25seSBzZXQgd2hlbiBhc3NpZ25lZCBhIGNvbm4gKi8KKwlMQVNTRVJUKHR4ID09IE5VTEwgfHwgdHgtPnR4X253cnEgPiAwKTsgICAgIC8qIHdvcmsgaXRlbXMgaGF2ZSBiZWVuIHNldCB1cCAqLwogCiAJLyogRmlyc3QgdGltZSwganVzdCB1c2UgYSByZWFkIGxvY2sgc2luY2UgSSBleHBlY3QgdG8gZmluZCBteSBwZWVyCiAJICogY29ubmVjdGVkICovCkBAIC0xMzc0LDcgKzEzNzQsNyBAQAogCWlmIChwZWVyICE9IE5VTEwpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpIHsKIAkJCS8qIGZvdW5kIGEgcGVlciwgYnV0IGl0J3Mgc3RpbGwgY29ubmVjdGluZy4uLiAqLwotCQkJTEFTU0VSVCAocGVlci0+aWJwX2Nvbm5lY3RpbmcgIT0gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyAhPSAwIHx8CiAJCQkJIHBlZXItPmlicF9hY2NlcHRpbmcgIT0gMCk7CiAJCQlpZiAodHggIT0gTlVMTCkKIAkJCQlsaXN0X2FkZF90YWlsKCZ0eC0+dHhfbGlzdCwKQEAgLTE0MTMsNyArMTQxMyw3IEBACiAJaWYgKHBlZXIyICE9IE5VTEwpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJnBlZXIyLT5pYnBfY29ubnMpKSB7CiAJCQkvKiBmb3VuZCBhIHBlZXIsIGJ1dCBpdCdzIHN0aWxsIGNvbm5lY3RpbmcuLi4gKi8KLQkJCUxBU1NFUlQgKHBlZXIyLT5pYnBfY29ubmVjdGluZyAhPSAwIHx8CisJCQlMQVNTRVJUKHBlZXIyLT5pYnBfY29ubmVjdGluZyAhPSAwIHx8CiAJCQkJIHBlZXIyLT5pYnBfYWNjZXB0aW5nICE9IDApOwogCQkJaWYgKHR4ICE9IE5VTEwpCiAJCQkJbGlzdF9hZGRfdGFpbCgmdHgtPnR4X2xpc3QsCkBAIC0xNDM1LDExICsxNDM1LDExIEBACiAJfQogCiAJLyogQnJhbmQgbmV3IHBlZXIgKi8KLQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA9PSAwKTsKKwlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID09IDApOwogCXBlZXItPmlicF9jb25uZWN0aW5nID0gMTsKIAogCS8qIGFsd2F5cyBjYWxsZWQgd2l0aCBhIHJlZiBvbiBuaSwgd2hpY2ggcHJldmVudHMgbmkgYmVpbmcgc2h1dGRvd24gKi8KLQlMQVNTRVJUICgoKGtpYl9uZXRfdCAqKW5pLT5uaV9kYXRhKS0+aWJuX3NodXRkb3duID09IDApOworCUxBU1NFUlQoKChraWJfbmV0X3QgKiluaS0+bmlfZGF0YSktPmlibl9zaHV0ZG93biA9PSAwKTsKIAogCWlmICh0eCAhPSBOVUxMKQogCQlsaXN0X2FkZF90YWlsKCZ0eC0+dHhfbGlzdCwgJnBlZXItPmlicF90eF9xdWV1ZSk7CkBAIC0xNDU0LDcgKzE0NTQsNyBAQAogfQogCiBpbnQKLWtpYmxuZF9zZW5kIChsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2cpCitraWJsbmRfc2VuZChsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2cpCiB7CiAJbG5ldF9oZHJfdCAgICAgICAqaGRyID0gJmxudG1zZy0+bXNnX2hkcjsKIAlpbnQJICAgICAgIHR5cGUgPSBsbnRtc2ctPm1zZ190eXBlOwpAQCAtMTQ3NiwxMyArMTQ3NiwxMyBAQAogCUNERUJVRyhEX05FVCwgInNlbmRpbmcgJWQgYnl0ZXMgaW4gJWQgZnJhZ3MgdG8gJXNcbiIsCiAJICAgICAgIHBheWxvYWRfbm9iLCBwYXlsb2FkX25pb3YsIGxpYmNmc19pZDJzdHIodGFyZ2V0KSk7CiAKLQlMQVNTRVJUIChwYXlsb2FkX25vYiA9PSAwIHx8IHBheWxvYWRfbmlvdiA+IDApOwotCUxBU1NFUlQgKHBheWxvYWRfbmlvdiA8PSBMTkVUX01BWF9JT1YpOworCUxBU1NFUlQocGF5bG9hZF9ub2IgPT0gMCB8fCBwYXlsb2FkX25pb3YgPiAwKTsKKwlMQVNTRVJUKHBheWxvYWRfbmlvdiA8PSBMTkVUX01BWF9JT1YpOwogCiAJLyogVGhyZWFkIGNvbnRleHQgKi8KLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKIAkvKiBwYXlsb2FkIGlzIGVpdGhlciBhbGwgdmFkZHJzIG9yIGFsbCBwYWdlcyAqLwotCUxBU1NFUlQgKCEocGF5bG9hZF9raW92ICE9IE5VTEwgJiYgcGF5bG9hZF9pb3YgIT0gTlVMTCkpOworCUxBU1NFUlQoIShwYXlsb2FkX2tpb3YgIT0gTlVMTCAmJiBwYXlsb2FkX2lvdiAhPSBOVUxMKSk7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAlkZWZhdWx0OgpAQCAtMTQ5MCw3ICsxNDkwLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAljYXNlIExORVRfTVNHX0FDSzoKLQkJTEFTU0VSVCAocGF5bG9hZF9ub2IgPT0gMCk7CisJCUxBU1NFUlQocGF5bG9hZF9ub2IgPT0gMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBMTkVUX01TR19HRVQ6CkBAIC0xNTkyLDEyICsxNTkyLDEyIEBACiAKIAkvKiBzZW5kIElNTUVESUFURSAqLwogCi0JTEFTU0VSVCAob2Zmc2V0b2Yoa2liX21zZ190LCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkW3BheWxvYWRfbm9iXSkKKwlMQVNTRVJUKG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZFtwYXlsb2FkX25vYl0pCiAJCSA8PSBJQkxORF9NU0dfU0laRSk7CiAKIAl0eCA9IGtpYmxuZF9nZXRfaWRsZV90eChuaSwgdGFyZ2V0Lm5pZCk7CiAJaWYgKHR4ID09IE5VTEwpIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2VuZCAlZCB0byAlczogdHggZGVzY3MgZXhoYXVzdGVkXG4iLAorCQlDRVJST1IoIkNhbid0IHNlbmQgJWQgdG8gJXM6IHR4IGRlc2NzIGV4aGF1c3RlZFxuIiwKIAkJCXR5cGUsIGxpYmNmc19uaWQyc3RyKHRhcmdldC5uaWQpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9yZXBseSAobG5ldF9uaV90ICpuaSwga2liX3J4X3QgKnJ4LCBsbmV0X21zZ190ICpsbnRtc2cpCitraWJsbmRfcmVwbHkobG5ldF9uaV90ICpuaSwga2liX3J4X3QgKnJ4LCBsbmV0X21zZ190ICpsbnRtc2cpCiB7CiAJbG5ldF9wcm9jZXNzX2lkX3QgdGFyZ2V0ID0gbG50bXNnLT5tc2dfdGFyZ2V0OwogCXVuc2lnbmVkIGludCAgICAgIG5pb3YgPSBsbnRtc2ctPm1zZ19uaW92OwpAQCAtMTY4Nyw3ICsxNjg3LDcgQEAKIH0KIAogaW50Ci1raWJsbmRfcmVjdiAobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnLCBpbnQgZGVsYXllZCwKK2tpYmxuZF9yZWN2KGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKmxudG1zZywgaW50IGRlbGF5ZWQsCiAJICAgICB1bnNpZ25lZCBpbnQgbmlvdiwgc3RydWN0IGt2ZWMgKmlvdiwgbG5ldF9raW92X3QgKmtpb3YsCiAJICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWxlbiwgdW5zaWduZWQgaW50IHJsZW4pCiB7CkBAIC0xNzAwLDEwICsxNzAwLDEwIEBACiAJaW50CSAgcG9zdF9jcmVkaXQgPSBJQkxORF9QT1NUUlhfUEVFUl9DUkVESVQ7CiAJaW50CSAgcmMgPSAwOwogCi0JTEFTU0VSVCAobWxlbiA8PSBybGVuKTsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQobWxlbiA8PSBybGVuKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAJLyogRWl0aGVyIGFsbCBwYWdlcyBvciBhbGwgdmFkZHJzICovCi0JTEFTU0VSVCAoIShraW92ICE9IE5VTEwgJiYgaW92ICE9IE5VTEwpKTsKKwlMQVNTRVJUKCEoa2lvdiAhPSBOVUxMICYmIGlvdiAhPSBOVUxMKSk7CiAKIAlzd2l0Y2ggKHJ4bXNnLT5pYm1fdHlwZSkgewogCWRlZmF1bHQ6CkBAIC0xNzEyLDcgKzE3MTIsNyBAQAogCWNhc2UgSUJMTkRfTVNHX0lNTUVESUFURToKIAkJbm9iID0gb2Zmc2V0b2Yoa2liX21zZ190LCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkW3JsZW5dKTsKIAkJaWYgKG5vYiA+IHJ4LT5yeF9ub2IpIHsKLQkJCUNFUlJPUiAoIkltbWVkaWF0ZSBtZXNzYWdlIGZyb20gJXMgdG9vIGJpZzogJWQoJWQpXG4iLAorCQkJQ0VSUk9SKCJJbW1lZGlhdGUgbWVzc2FnZSBmcm9tICVzIHRvbyBiaWc6ICVkKCVkKVxuIiwKIAkJCQlsaWJjZnNfbmlkMnN0cihyeG1zZy0+aWJtX3UuaW1tZWRpYXRlLmliaW1faGRyLnNyY19uaWQpLAogCQkJCW5vYiwgcngtPnJ4X25vYik7CiAJCQlyYyA9IC1FUFJPVE87CkBAIC0xNzI5LDcgKzE3MjksNyBAQAogCQkJCQkgICBJQkxORF9NU0dfU0laRSwgcnhtc2csCiAJCQkJCSAgIG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZCksCiAJCQkJCSAgIG1sZW4pOwotCQlsbmV0X2ZpbmFsaXplIChuaSwgbG50bXNnLCAwKTsKKwkJbG5ldF9maW5hbGl6ZShuaSwgbG50bXNnLCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIElCTE5EX01TR19QVVRfUkVROgpAQCAtMTgxMiwxMyArMTgxMiwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX3RocmVhZF9maW5pICh2b2lkKQora2libG5kX3RocmVhZF9maW5pKHZvaWQpCiB7Ci0JYXRvbWljX2RlYyAoJmtpYmxuZF9kYXRhLmtpYl9udGhyZWFkcyk7CisJYXRvbWljX2RlYygma2libG5kX2RhdGEua2liX250aHJlYWRzKTsKIH0KIAogdm9pZAota2libG5kX3BlZXJfYWxpdmUgKGtpYl9wZWVyX3QgKnBlZXIpCitraWJsbmRfcGVlcl9hbGl2ZShraWJfcGVlcl90ICpwZWVyKQogewogCS8qIFRoaXMgaXMgcmFjeSwgYnV0IGV2ZXJ5b25lJ3Mgb25seSB3cml0aW5nIGNmc190aW1lX2N1cnJlbnQoKSAqLwogCXBlZXItPmlicF9sYXN0X2FsaXZlID0gY2ZzX3RpbWVfY3VycmVudCgpOwpAQCAtMTgyNiw3ICsxODI2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9wZWVyX25vdGlmeSAoa2liX3BlZXJfdCAqcGVlcikKK2tpYmxuZF9wZWVyX25vdGlmeShraWJfcGVlcl90ICpwZWVyKQogewogCWludAkgICBlcnJvciA9IDA7CiAJdW5zaWduZWQgbG9uZyAgICBsYXN0X2FsaXZlID0gMDsKQEAgLTE4NTIsNyArMTg1Miw3IEBACiB9CiAKIHZvaWQKLWtpYmxuZF9jbG9zZV9jb25uX2xvY2tlZCAoa2liX2Nvbm5fdCAqY29ubiwgaW50IGVycm9yKQora2libG5kX2Nsb3NlX2Nvbm5fbG9ja2VkKGtpYl9jb25uX3QgKmNvbm4sIGludCBlcnJvcikKIHsKIAkvKiBUaGlzIGp1c3QgZG9lcyB0aGUgaW1tZWRpYXRlIGhvdXNla2VlcGluZy4gICdlcnJvcicgaXMgemVybyBmb3IgYQogCSAqIG5vcm1hbCBzaHV0ZG93biB3aGljaCBjYW4gaGFwcGVuIG9ubHkgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4KQEAgLTE4NjQsNyArMTg2NCw3IEBACiAJa2liX2Rldl90CSpkZXY7CiAJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CiAKLQlMQVNTRVJUIChlcnJvciAhPSAwIHx8IGNvbm4tPmliY19zdGF0ZSA+PSBJQkxORF9DT05OX0VTVEFCTElTSEVEKTsKKwlMQVNTRVJUKGVycm9yICE9IDAgfHwgY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOwogCiAJaWYgKGVycm9yICE9IDAgJiYgY29ubi0+aWJjX2NvbW1zX2Vycm9yID09IDApCiAJCWNvbm4tPmliY19jb21tc19lcnJvciA9IGVycm9yOwpAQCAtMTg5NCw3ICsxODk0LDcgQEAKIAlsaXN0X2RlbCgmY29ubi0+aWJjX2xpc3QpOwogCS8qIGNvbm5kIChzZWUgYmVsb3cpIHRha2VzIG92ZXIgaWJjX2xpc3QncyByZWYgKi8KIAotCWlmIChsaXN0X2VtcHR5ICgmcGVlci0+aWJwX2Nvbm5zKSAmJiAgICAvKiBubyBtb3JlIGNvbm5zICovCisJaWYgKGxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykgJiYgICAgLyogbm8gbW9yZSBjb25ucyAqLwogCSAgICBraWJsbmRfcGVlcl9hY3RpdmUocGVlcikpIHsJIC8qIHN0aWxsIGluIHBlZXIgdGFibGUgKi8KIAkJa2libG5kX3VubGlua19wZWVyX2xvY2tlZChwZWVyKTsKIApAQCAtMTkzNiwxNCArMTkzNiwxMyBAQAogewogCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CiAJa2liX3J4X3QJKnJ4OworCWtpYl9yeF90ICp0bXA7CiAKIAlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAJTEFTU0VSVChjb25uLT5pYmNfc3RhdGUgPj0gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCk7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmY29ubi0+aWJjX2Vhcmx5X3J4cykpIHsKLQkJcnggPSBsaXN0X2VudHJ5KGNvbm4tPmliY19lYXJseV9yeHMubmV4dCwKLQkJCQkgICAga2liX3J4X3QsIHJ4X2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyeCwgdG1wLCAmY29ubi0+aWJjX2Vhcmx5X3J4cywgcnhfbGlzdCkgewogCQlsaXN0X2RlbCgmcngtPnJ4X2xpc3QpOwogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKQEAgLTE5NTcsMjIgKzE5NTYsMjIgQEAKIHN0YXRpYyB2b2lkCiBraWJsbmRfYWJvcnRfdHhzKGtpYl9jb25uX3QgKmNvbm4sIHN0cnVjdCBsaXN0X2hlYWQgKnR4cykKIHsKLQlMSVNUX0hFQUQgICAgICAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgKnRtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgKm54dDsKIAlraWJfdHhfdAkgICAgKnR4OwogCiAJc3Bpbl9sb2NrKCZjb25uLT5pYmNfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgbnh0LCB0eHMpIHsKLQkJdHggPSBsaXN0X2VudHJ5ICh0bXAsIGtpYl90eF90LCB0eF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsIHR4cykgeworCQl0eCA9IGxpc3RfZW50cnkodG1wLCBraWJfdHhfdCwgdHhfbGlzdCk7CiAKIAkJaWYgKHR4cyA9PSAmY29ubi0+aWJjX2FjdGl2ZV90eHMpIHsKLQkJCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsKLQkJCUxBU1NFUlQgKHR4LT50eF93YWl0aW5nIHx8CisJCQlMQVNTRVJUKCF0eC0+dHhfcXVldWVkKTsKKwkJCUxBU1NFUlQodHgtPnR4X3dhaXRpbmcgfHwKIAkJCQkgdHgtPnR4X3NlbmRpbmcgIT0gMCk7CiAJCX0gZWxzZSB7Ci0JCQlMQVNTRVJUICh0eC0+dHhfcXVldWVkKTsKKwkJCUxBU1NFUlQodHgtPnR4X3F1ZXVlZCk7CiAJCX0KIAogCQl0eC0+dHhfc3RhdHVzID0gLUVDT05OQUJPUlRFRDsKQEAgLTE5ODAsOCArMTk3OSw4IEBACiAKIAkJaWYgKHR4LT50eF9zZW5kaW5nID09IDApIHsKIAkJCXR4LT50eF9xdWV1ZWQgPSAwOwotCQkJbGlzdF9kZWwgKCZ0eC0+dHhfbGlzdCk7Ci0JCQlsaXN0X2FkZCAoJnR4LT50eF9saXN0LCAmem9tYmllcyk7CisJCQlsaXN0X2RlbCgmdHgtPnR4X2xpc3QpOworCQkJbGlzdF9hZGQoJnR4LT50eF9saXN0LCAmem9tYmllcyk7CiAJCX0KIAl9CiAKQEAgLTE5OTEsMTAgKzE5OTAsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9maW5hbGlzZV9jb25uIChraWJfY29ubl90ICpjb25uKQora2libG5kX2ZpbmFsaXNlX2Nvbm4oa2liX2Nvbm5fdCAqY29ubikKIHsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOwotCUxBU1NFUlQgKGNvbm4tPmliY19zdGF0ZSA+IElCTE5EX0NPTk5fSU5JVCk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID4gSUJMTkRfQ09OTl9JTklUKTsKIAogCWtpYmxuZF9zZXRfY29ubl9zdGF0ZShjb25uLCBJQkxORF9DT05OX0RJU0NPTk5FQ1RFRCk7CiAKQEAgLTIwMTYsMjEgKzIwMTUsMjEgQEAKIH0KIAogdm9pZAota2libG5kX3BlZXJfY29ubmVjdF9mYWlsZWQgKGtpYl9wZWVyX3QgKnBlZXIsIGludCBhY3RpdmUsIGludCBlcnJvcikKK2tpYmxuZF9wZWVyX2Nvbm5lY3RfZmFpbGVkKGtpYl9wZWVyX3QgKnBlZXIsIGludCBhY3RpdmUsIGludCBlcnJvcikKIHsKLQlMSVNUX0hFQUQgICAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKIAotCUxBU1NFUlQgKGVycm9yICE9IDApOwotCUxBU1NFUlQgKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChlcnJvciAhPSAwKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGFjdGl2ZSkgewotCQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDApOworCQlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCk7CiAJCXBlZXItPmlicF9jb25uZWN0aW5nLS07CiAJfSBlbHNlIHsKLQkJTEFTU0VSVCAocGVlci0+aWJwX2FjY2VwdGluZyA+IDApOworCQlMQVNTRVJUKHBlZXItPmlicF9hY2NlcHRpbmcgPiAwKTsKIAkJcGVlci0+aWJwX2FjY2VwdGluZy0tOwogCX0KIApAQCAtMjA1MywxNCArMjA1MiwxNCBAQAogCQlwZWVyLT5pYnBfZXJyb3IgPSBlcnJvcjsKIAl9IGVsc2UgewogCQkvKiBDYW4ndCBoYXZlIGJsb2NrZWQgdHJhbnNtaXRzIGlmIHRoZXJlIGFyZSBjb25uZWN0aW9ucyAqLwotCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKTsKIAl9CiAKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKIAlraWJsbmRfcGVlcl9ub3RpZnkocGVlcik7CiAKLQlpZiAobGlzdF9lbXB0eSAoJnpvbWJpZXMpKQorCWlmIChsaXN0X2VtcHR5KCZ6b21iaWVzKSkKIAkJcmV0dXJuOwogCiAJQ05FVEVSUigiRGVsZXRpbmcgbWVzc2FnZXMgZm9yICVzOiBjb25uZWN0aW9uIGZhaWxlZFxuIiwKQEAgLTIwNzQsNiArMjA3Myw3IEBACiB7CiAJa2liX3BlZXJfdAkqcGVlciA9IGNvbm4tPmliY19wZWVyOwogCWtpYl90eF90CSAgKnR4OworCWtpYl90eF90ICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZAkgdHhzOwogCXVuc2lnbmVkIGxvbmcgICAgICBmbGFnczsKIAlpbnQJCWFjdGl2ZTsKQEAgLTIwODQsOCArMjA4NCw4IEBACiAJICAgICAgIGxpYmNmc19uaWQyc3RyKHBlZXItPmlicF9uaWQpLCBhY3RpdmUsCiAJICAgICAgIGNvbm4tPmliY192ZXJzaW9uLCBzdGF0dXMpOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUICgoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QgJiYKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVCgoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QgJiYKIAkJICBwZWVyLT5pYnBfY29ubmVjdGluZyA+IDApIHx8CiAJCSAoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fUEFTU0lWRV9XQUlUICYmCiAJCSAgcGVlci0+aWJwX2FjY2VwdGluZyA+IDApKTsKQEAgLTIxNTAsOCArMjE1MCw3IEBACiAKIAkvKiBTY2hlZHVsZSBibG9ja2VkIHR4cyAqLwogCXNwaW5fbG9jaygmY29ubi0+aWJjX2xvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eSgmdHhzKSkgewotCQl0eCA9IGxpc3RfZW50cnkodHhzLm5leHQsIGtpYl90eF90LCB0eF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHgsIHRtcCwgJnR4cywgdHhfbGlzdCkgewogCQlsaXN0X2RlbCgmdHgtPnR4X2xpc3QpOwogCiAJCWtpYmxuZF9xdWV1ZV90eF9sb2NrZWQodHgsIGNvbm4pOwpAQCAtMjE3Niw3ICsyMTc1LDcgQEAKIH0KIAogc3RhdGljIGludAota2libG5kX3Bhc3NpdmVfY29ubmVjdCAoc3RydWN0IHJkbWFfY21faWQgKmNtaWQsIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKK2tpYmxuZF9wYXNzaXZlX2Nvbm5lY3Qoc3RydWN0IHJkbWFfY21faWQgKmNtaWQsIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKIHsKIAlyd2xvY2tfdAkJKmdfbG9jayA9ICZraWJsbmRfZGF0YS5raWJfZ2xvYmFsX2xvY2s7CiAJa2liX21zZ190CSAgICAgKnJlcW1zZyA9IHByaXY7CkBAIC0yMTk0LDExICsyMTkzLDExIEBACiAJdW5zaWduZWQgbG9uZwkgIGZsYWdzOwogCWludAkJICAgIHJjOwogCXN0cnVjdCBzb2NrYWRkcl9pbiAgICAqcGVlcl9hZGRyOwotCUxBU1NFUlQgKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOwogCiAJLyogY21pZCBpbmhlcml0cyAnY29udGV4dCcgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBsaXN0ZW5lciBpZCAqLwogCWliZGV2ID0gKGtpYl9kZXZfdCAqKWNtaWQtPmNvbnRleHQ7Ci0JTEFTU0VSVCAoaWJkZXYgIT0gTlVMTCk7CisJTEFTU0VSVChpYmRldiAhPSBOVUxMKTsKIAogCW1lbXNldCgmcmVqLCAwLCBzaXplb2YocmVqKSk7CiAJcmVqLmlicl9tYWdpYwkJPSBJQkxORF9NU0dfTUFHSUM7CkBAIC0yMzY2LDggKzIzNjUsOCBAQAogCQlwZWVyID0gcGVlcjI7CiAJfSBlbHNlIHsKIAkJLyogQnJhbmQgbmV3IHBlZXIgKi8KLQkJTEFTU0VSVCAocGVlci0+aWJwX2FjY2VwdGluZyA9PSAwKTsKLQkJTEFTU0VSVCAocGVlci0+aWJwX3ZlcnNpb24gPT0gMCAmJgorCQlMQVNTRVJUKHBlZXItPmlicF9hY2NlcHRpbmcgPT0gMCk7CisJCUxBU1NFUlQocGVlci0+aWJwX3ZlcnNpb24gPT0gMCAmJgogCQkJIHBlZXItPmlicF9pbmNhcm5hdGlvbiA9PSAwKTsKIAogCQlwZWVyLT5pYnBfYWNjZXB0aW5nICAgPSAxOwpAQCAtMjM3NSw3ICsyMzc0LDcgQEAKIAkJcGVlci0+aWJwX2luY2FybmF0aW9uID0gcmVxbXNnLT5pYm1fc3Jjc3RhbXA7CiAKIAkJLyogSSBoYXZlIGEgcmVmIG9uIG5pIHRoYXQgcHJldmVudHMgaXQgYmVpbmcgc2h1dGRvd24gKi8KLQkJTEFTU0VSVCAobmV0LT5pYm5fc2h1dGRvd24gPT0gMCk7CisJCUxBU1NFUlQobmV0LT5pYm5fc2h1dGRvd24gPT0gMCk7CiAKIAkJa2libG5kX3BlZXJfYWRkcmVmKHBlZXIpOwogCQlsaXN0X2FkZF90YWlsKCZwZWVyLT5pYnBfbGlzdCwga2libG5kX25pZDJwZWVybGlzdChuaWQpKTsKQEAgLTIzOTcsNyArMjM5Niw3IEBACiAJY29ubi0+aWJjX2luY2FybmF0aW9uICAgICAgPSByZXFtc2ctPmlibV9zcmNzdGFtcDsKIAljb25uLT5pYmNfY3JlZGl0cwkgID0gSUJMTkRfTVNHX1FVRVVFX1NJWkUodmVyc2lvbik7CiAJY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPSBJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXJzaW9uKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfY3JlZGl0cyArIGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzICsgSUJMTkRfT09CX01TR1ModmVyc2lvbikKKwlMQVNTRVJUKGNvbm4tPmliY19jcmVkaXRzICsgY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgKyBJQkxORF9PT0JfTVNHUyh2ZXJzaW9uKQogCQkgPD0gSUJMTkRfUlhfTVNHUyh2ZXJzaW9uKSk7CiAKIAlhY2ttc2cgPSAmY29ubi0+aWJjX2Nvbm52YXJzLT5jdl9tc2c7CkBAIC0yNDQ5LDcgKzI0NDgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX3JlY29ubmVjdCAoa2liX2Nvbm5fdCAqY29ubiwgaW50IHZlcnNpb24sCitraWJsbmRfcmVjb25uZWN0KGtpYl9jb25uX3QgKmNvbm4sIGludCB2ZXJzaW9uLAogCQkgIF9fdTY0IGluY2FybmF0aW9uLCBpbnQgd2h5LCBraWJfY29ubnBhcmFtc190ICpjcCkKIHsKIAlraWJfcGVlcl90ICAgICpwZWVyID0gY29ubi0+aWJjX3BlZXI7CkBAIC0yNDU3LDggKzI0NTYsOCBAQAogCWludAkgICAgcmV0cnkgPSAwOwogCXVuc2lnbmVkIGxvbmcgIGZsYWdzOwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QpOwotCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCk7ICAgICAvKiAnY29ubicgYXQgbGVhc3QgKi8KKwlMQVNTRVJUKGNvbm4tPmliY19zdGF0ZSA9PSBJQkxORF9DT05OX0FDVElWRV9DT05ORUNUKTsKKwlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCk7ICAgICAvKiAnY29ubicgYXQgbGVhc3QgKi8KIAogCXdyaXRlX2xvY2tfaXJxc2F2ZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKQEAgLTI1MDQsMjAgKzI1MDMsMjAgQEAKIAlDTkVURVJSKCIlczogcmV0cnlpbmcgKCVzKSwgJXgsICV4LCBxdWV1ZV9kZXA6ICVkLCBtYXhfZnJhZzogJWQsIG1zZ19zaXplOiAlZFxuIiwKIAkJbGliY2ZzX25pZDJzdHIocGVlci0+aWJwX25pZCksCiAJCXJlYXNvbiwgSUJMTkRfTVNHX1ZFUlNJT04sIHZlcnNpb24sCi0JCWNwICE9IE5VTEw/IGNwLT5pYmNwX3F1ZXVlX2RlcHRoIDpJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXJzaW9uKSwKLQkJY3AgIT0gTlVMTD8gY3AtPmliY3BfbWF4X2ZyYWdzICAgOiBJQkxORF9SRE1BX0ZSQUdTKHZlcnNpb24pLAotCQljcCAhPSBOVUxMPyBjcC0+aWJjcF9tYXhfbXNnX3NpemU6IElCTE5EX01TR19TSVpFKTsKKwkJY3AgIT0gTlVMTCA/IGNwLT5pYmNwX3F1ZXVlX2RlcHRoICA6IElCTE5EX01TR19RVUVVRV9TSVpFKHZlcnNpb24pLAorCQljcCAhPSBOVUxMID8gY3AtPmliY3BfbWF4X2ZyYWdzICAgIDogSUJMTkRfUkRNQV9GUkFHUyh2ZXJzaW9uKSwKKwkJY3AgIT0gTlVMTCA/IGNwLT5pYmNwX21heF9tc2dfc2l6ZSA6IElCTE5EX01TR19TSVpFKTsKIAogCWtpYmxuZF9jb25uZWN0X3BlZXIocGVlcik7CiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfcmVqZWN0ZWQgKGtpYl9jb25uX3QgKmNvbm4sIGludCByZWFzb24sIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKK2tpYmxuZF9yZWplY3RlZChraWJfY29ubl90ICpjb25uLCBpbnQgcmVhc29uLCB2b2lkICpwcml2LCBpbnQgcHJpdl9ub2IpCiB7CiAJa2liX3BlZXJfdCAgICAqcGVlciA9IGNvbm4tPmliY19wZWVyOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfc3RhdGUgPT0gSUJMTkRfQ09OTl9BQ1RJVkVfQ09OTkVDVCk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QpOwogCiAJc3dpdGNoIChyZWFzb24pIHsKIAljYXNlIElCX0NNX1JFSl9TVEFMRV9DT05OOgpAQCAtMjY1MSw3ICsyNjUwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9jaGVja19jb25ucmVwbHkgKGtpYl9jb25uX3QgKmNvbm4sIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKK2tpYmxuZF9jaGVja19jb25ucmVwbHkoa2liX2Nvbm5fdCAqY29ubiwgdm9pZCAqcHJpdiwgaW50IHByaXZfbm9iKQogewogCWtpYl9wZWVyX3QgICAgKnBlZXIgPSBjb25uLT5pYmNfcGVlcjsKIAlsbmV0X25pX3QgICAgICpuaSAgID0gcGVlci0+aWJwX25pOwpAQCAtMjY2MSw3ICsyNjYwLDcgQEAKIAlpbnQJICAgIHJjICAgPSBraWJsbmRfdW5wYWNrX21zZyhtc2csIHByaXZfbm9iKTsKIAl1bnNpZ25lZCBsb25nICBmbGFnczsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCWlmIChyYyAhPSAwKSB7CiAJCUNFUlJPUigiQ2FuJ3QgdW5wYWNrIGNvbm5hY2sgZnJvbSAlczogJWRcbiIsCkBAIC0yNzMwLDcgKzI3MjksNyBAQAogCWNvbm4tPmliY19pbmNhcm5hdGlvbiAgICAgID0gbXNnLT5pYm1fc3Jjc3RhbXA7CiAJY29ubi0+aWJjX2NyZWRpdHMJICA9CiAJY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPSBJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXIpOwotCUxBU1NFUlQgKGNvbm4tPmliY19jcmVkaXRzICsgY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgKyBJQkxORF9PT0JfTVNHUyh2ZXIpCisJTEFTU0VSVChjb25uLT5pYmNfY3JlZGl0cyArIGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzICsgSUJMTkRfT09CX01TR1ModmVyKQogCQkgPD0gSUJMTkRfUlhfTVNHUyh2ZXIpKTsKIAogCWtpYmxuZF9jb25ucmVxX2RvbmUoY29ubiwgMCk7CkBAIC0yNzQyLDEzICsyNzQxLDEzIEBACiAJICoga2libG5kX2Nvbm5yZXFfZG9uZSgwKSBtb3ZlcyB0aGUgY29ubiBzdGF0ZSB0byBFU1RBQkxJU0hFRCwgYnV0IHRoZW4KIAkgKiBpbW1lZGlhdGVseSB0ZWFycyBpdCBkb3duLiAqLwogCi0JTEFTU0VSVCAocmMgIT0gMCk7CisJTEFTU0VSVChyYyAhPSAwKTsKIAljb25uLT5pYmNfY29tbXNfZXJyb3IgPSByYzsKIAlraWJsbmRfY29ubnJlcV9kb25lKGNvbm4sIDApOwogfQogCiBzdGF0aWMgaW50Ci1raWJsbmRfYWN0aXZlX2Nvbm5lY3QgKHN0cnVjdCByZG1hX2NtX2lkICpjbWlkKQora2libG5kX2FjdGl2ZV9jb25uZWN0KHN0cnVjdCByZG1hX2NtX2lkICpjbWlkKQogewogCWtpYl9wZWVyX3QJICAgICAgKnBlZXIgPSAoa2liX3BlZXJfdCAqKWNtaWQtPmNvbnRleHQ7CiAJa2liX2Nvbm5fdAkgICAgICAqY29ubjsKQEAgLTI5MTMsNyArMjkxMiw3IEBACiAJCQlMQlVHKCk7CiAKIAkJY2FzZSBJQkxORF9DT05OX1BBU1NJVkVfV0FJVDoKLQkJCUNFUlJPUiAoIiVzOiBSRUpFQ1RFRCAlZFxuIiwKKwkJCUNFUlJPUigiJXM6IFJFSkVDVEVEICVkXG4iLAogCQkJCWxpYmNmc19uaWQyc3RyKGNvbm4tPmliY19wZWVyLT5pYnBfbmlkKSwKIAkJCQlldmVudC0+c3RhdHVzKTsKIAkJCWtpYmxuZF9jb25ucmVxX2RvbmUoY29ubiwgLUVDT05OUkVTRVQpOwpAQCAtMjk4NywxNyArMjk4NiwxNyBAQAogCWtpYl90eF90CSAgKnR4OwogCXN0cnVjdCBsaXN0X2hlYWQJKnR0bXA7CiAKLQlsaXN0X2Zvcl9lYWNoICh0dG1wLCB0eHMpIHsKLQkJdHggPSBsaXN0X2VudHJ5ICh0dG1wLCBraWJfdHhfdCwgdHhfbGlzdCk7CisJbGlzdF9mb3JfZWFjaCh0dG1wLCB0eHMpIHsKKwkJdHggPSBsaXN0X2VudHJ5KHR0bXAsIGtpYl90eF90LCB0eF9saXN0KTsKIAogCQlpZiAodHhzICE9ICZjb25uLT5pYmNfYWN0aXZlX3R4cykgewotCQkJTEFTU0VSVCAodHgtPnR4X3F1ZXVlZCk7CisJCQlMQVNTRVJUKHR4LT50eF9xdWV1ZWQpOwogCQl9IGVsc2UgewotCQkJTEFTU0VSVCAoIXR4LT50eF9xdWV1ZWQpOwotCQkJTEFTU0VSVCAodHgtPnR4X3dhaXRpbmcgfHwgdHgtPnR4X3NlbmRpbmcgIT0gMCk7CisJCQlMQVNTRVJUKCF0eC0+dHhfcXVldWVkKTsKKwkJCUxBU1NFUlQodHgtPnR4X3dhaXRpbmcgfHwgdHgtPnR4X3NlbmRpbmcgIT0gMCk7CiAJCX0KIAotCQlpZiAoY2ZzX3RpbWVfYWZ0ZXJlcSAoamlmZmllcywgdHgtPnR4X2RlYWRsaW5lKSkgeworCQlpZiAoY2ZzX3RpbWVfYWZ0ZXJlcShqaWZmaWVzLCB0eC0+dHhfZGVhZGxpbmUpKSB7CiAJCQlDRVJST1IoIlRpbWVkIG91dCB0eDogJXMsICVsdSBzZWNvbmRzXG4iLAogCQkJICAgICAgIGtpYmxuZF9xdWV1ZTJzdHIoY29ubiwgdHhzKSwKIAkJCSAgICAgICBjZnNfZHVyYXRpb25fc2VjKGppZmZpZXMgLSB0eC0+dHhfZGVhZGxpbmUpKTsKQEAgLTMwMTksMTQgKzMwMTgsMTUgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9jaGVja19jb25ucyAoaW50IGlkeCkKK2tpYmxuZF9jaGVja19jb25ucyhpbnQgaWR4KQogewotCUxJU1RfSEVBRCAoY2xvc2VzKTsKLQlMSVNUX0hFQUQgKGNoZWNrc2VuZHMpOworCUxJU1RfSEVBRChjbG9zZXMpOworCUxJU1RfSEVBRChjaGVja3NlbmRzKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICpwZWVycyA9ICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaWR4XTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICpwdG1wOwogCWtpYl9wZWVyX3QgICAgKnBlZXI7CiAJa2liX2Nvbm5fdCAgICAqY29ubjsKKwlraWJfY29ubl90ICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAqY3RtcDsKIAl1bnNpZ25lZCBsb25nICBmbGFnczsKIApAQCAtMzAzNSwxNiArMzAzNSwxNiBAQAogCSAqIHRha2UgYSBsb29rLi4uICovCiAJcmVhZF9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaCAocHRtcCwgcGVlcnMpIHsKLQkJcGVlciA9IGxpc3RfZW50cnkgKHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoKHB0bXAsIHBlZXJzKSB7CisJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKIAotCQlsaXN0X2Zvcl9lYWNoIChjdG1wLCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2goY3RtcCwgJnBlZXItPmlicF9jb25ucykgewogCQkJaW50IHRpbWVkb3V0OwogCQkJaW50IHNlbmRub29wOwogCiAJCQljb25uID0gbGlzdF9lbnRyeShjdG1wLCBraWJfY29ubl90LCBpYmNfbGlzdCk7CiAKLQkJCUxBU1NFUlQgKGNvbm4tPmliY19zdGF0ZSA9PSBJQkxORF9DT05OX0VTVEFCTElTSEVEKTsKKwkJCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOwogCiAJCQlzcGluX2xvY2soJmNvbm4tPmliY19sb2NrKTsKIApAQCAtMzA4MCw5ICszMDgwLDcgQEAKIAkvKiBIYW5kbGUgdGltZW91dCBieSBjbG9zaW5nIHRoZSB3aG9sZQogCSAqIGNvbm5lY3Rpb24uIFdlIGNhbiBvbmx5IGJlIHN1cmUgUkRNQSBhY3Rpdml0eQogCSAqIGhhcyBjZWFzZWQgb25jZSB0aGUgUVAgaGFzIGJlZW4gbW9kaWZpZWQuICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjbG9zZXMpKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5KGNsb3Nlcy5uZXh0LAotCQkJCSAgICAgIGtpYl9jb25uX3QsIGliY19jb25uZF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29ubiwgdG1wLCAmY2xvc2VzLCBpYmNfY29ubmRfbGlzdCkgewogCQlsaXN0X2RlbCgmY29ubi0+aWJjX2Nvbm5kX2xpc3QpOwogCQlraWJsbmRfY2xvc2VfY29ubihjb25uLCAtRVRJTUVET1VUKTsKIAkJa2libG5kX2Nvbm5fZGVjcmVmKGNvbm4pOwpAQCAtMzEwMSwxMSArMzA5OSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX2Rpc2Nvbm5lY3RfY29ubiAoa2liX2Nvbm5fdCAqY29ubikKK2tpYmxuZF9kaXNjb25uZWN0X2Nvbm4oa2liX2Nvbm5fdCAqY29ubikKIHsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOwotCUxBU1NFUlQgKGN1cnJlbnQgPT0ga2libG5kX2RhdGEua2liX2Nvbm5kKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfc3RhdGUgPT0gSUJMTkRfQ09OTl9DTE9TSU5HKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChjdXJyZW50ID09IGtpYmxuZF9kYXRhLmtpYl9jb25uZCk7CisJTEFTU0VSVChjb25uLT5pYmNfc3RhdGUgPT0gSUJMTkRfQ09OTl9DTE9TSU5HKTsKIAogCXJkbWFfZGlzY29ubmVjdChjb25uLT5pYmNfY21pZCk7CiAJa2libG5kX2ZpbmFsaXNlX2Nvbm4oY29ubik7CkBAIC0zMTE0LDcgKzMxMTIsNyBAQAogfQogCiBpbnQKLWtpYmxuZF9jb25uZCAodm9pZCAqYXJnKQora2libG5kX2Nvbm5kKHZvaWQgKmFyZykKIHsKIAl3YWl0X3F1ZXVlX3QgICAgIHdhaXQ7CiAJdW5zaWduZWQgbG9uZyAgICAgIGZsYWdzOwpAQCAtMzEyNSw3ICszMTIzLDcgQEAKIAlpbnQJCXBlZXJfaW5kZXggPSAwOwogCXVuc2lnbmVkIGxvbmcgICAgICBkZWFkbGluZSA9IGppZmZpZXM7CiAKLQljZnNfYmxvY2tfYWxsc2lncyAoKTsKKwljZnNfYmxvY2tfYWxsc2lncygpOwogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWtpYmxuZF9kYXRhLmtpYl9jb25uZCA9IGN1cnJlbnQ7CkBAIC0zMTM2LDcgKzMxMzQsNyBAQAogCiAJCWRyb3BwZWRfbG9jayA9IDA7CiAKLQkJaWYgKCFsaXN0X2VtcHR5ICgma2libG5kX2RhdGEua2liX2Nvbm5kX3pvbWJpZXMpKSB7CisJCWlmICghbGlzdF9lbXB0eSgma2libG5kX2RhdGEua2liX2Nvbm5kX3pvbWJpZXMpKSB7CiAJCQljb25uID0gbGlzdF9lbnRyeShraWJsbmRfZGF0YS4gXAogCQkJCQkgICAgICBraWJfY29ubmRfem9tYmllcy5uZXh0LAogCQkJCQkgICAgICBraWJfY29ubl90LCBpYmNfbGlzdCk7CkBAIC0zMjM5LDcgKzMyMzcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX2NvbXBsZXRlIChzdHJ1Y3QgaWJfd2MgKndjKQora2libG5kX2NvbXBsZXRlKHN0cnVjdCBpYl93YyAqd2MpCiB7CiAJc3dpdGNoIChraWJsbmRfd3JlcWlkMnR5cGUod2MtPndyX2lkKSkgewogCWRlZmF1bHQ6CkBAIC0zNDQwLDkgKzM0MzgsOSBAQAogCXVuc2lnbmVkIGxvbmcgICAgICBmbGFnczsKIAlpbnQJCXJjOwogCi0JTEFTU0VSVCAoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyICE9IDApOworCUxBU1NFUlQoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyICE9IDApOwogCi0JY2ZzX2Jsb2NrX2FsbHNpZ3MgKCk7CisJY2ZzX2Jsb2NrX2FsbHNpZ3MoKTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAl3cml0ZV9sb2NrX2lycXNhdmUoZ2xvY2ssIGZsYWdzKTsKQEAgLTM0NjksNyArMzQ2Nyw3IEBACiAKIAkJCXdyaXRlX2xvY2tfaXJxc2F2ZShnbG9jaywgZmxhZ3MpOwogCi0JCQlMQVNTRVJUIChkZXYtPmliZF9mYWlsb3Zlcik7CisJCQlMQVNTRVJUKGRldi0+aWJkX2ZhaWxvdmVyKTsKIAkJCWRldi0+aWJkX2ZhaWxvdmVyID0gMDsKIAkJCWlmIChyYyA+PSAwKSB7IC8qIERldmljZSBpcyBPSyBvciBmYWlsb3ZlciBzdWNjZWVkICovCiAJCQkJZGV2LT5pYmRfbmV4dF9mYWlsb3ZlciA9IGNmc190aW1lX3NoaWZ0KDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9tb2RwYXJhbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfbW9kcGFyYW1zLmMKaW5kZXggOGI0YThlOS4uZWVkZjAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9tb2RwYXJhbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX21vZHBhcmFtcy5jCkBAIC00NCw3ICs0NCw3IEBACiBtb2R1bGVfcGFyYW0oc2VydmljZSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc2VydmljZSwgInNlcnZpY2UgbnVtYmVyICh3aXRoaW4gUkRNQV9QU19UQ1ApIik7CiAKLXN0YXRpYyBpbnQgY2tzdW0gPSAwOworc3RhdGljIGludCBja3N1bTsKIG1vZHVsZV9wYXJhbShja3N1bSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoY2tzdW0sICJzZXQgbm9uLXplcm8gdG8gZW5hYmxlIG1lc3NhZ2UgKG5vdCBSRE1BKSBjaGVja3N1bXMiKTsKIApAQCAtNzIsMTEgKzcyLDExIEBACiBtb2R1bGVfcGFyYW0ocGVlcl9jcmVkaXRzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwZWVyX2NyZWRpdHMsICIjIGNvbmN1cnJlbnQgc2VuZHMgdG8gMSBwZWVyIik7CiAKLXN0YXRpYyBpbnQgcGVlcl9jcmVkaXRzX2hpdyA9IDA7CitzdGF0aWMgaW50IHBlZXJfY3JlZGl0c19oaXc7CiBtb2R1bGVfcGFyYW0ocGVlcl9jcmVkaXRzX2hpdywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocGVlcl9jcmVkaXRzX2hpdywgIndoZW4gZWFnZXJseSB0byByZXR1cm4gY3JlZGl0cyIpOwogCi1zdGF0aWMgaW50IHBlZXJfYnVmZmVyX2NyZWRpdHMgPSAwOworc3RhdGljIGludCBwZWVyX2J1ZmZlcl9jcmVkaXRzOwogbW9kdWxlX3BhcmFtKHBlZXJfYnVmZmVyX2NyZWRpdHMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBlZXJfYnVmZmVyX2NyZWRpdHMsICIjIHBlci1wZWVyIHJvdXRlciBidWZmZXIgY3JlZGl0cyIpOwogCkBAIC0xMDAsMTUgKzEwMCwxNSBAQAogbW9kdWxlX3BhcmFtKGtlZXBhbGl2ZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moa2VlcGFsaXZlLCAiSWRsZSB0aW1lIGluIHNlY29uZHMgYmVmb3JlIHNlbmRpbmcgYSBrZWVwYWxpdmUiKTsKIAotc3RhdGljIGludCBpYl9tdHUgPSAwOworc3RhdGljIGludCBpYl9tdHU7CiBtb2R1bGVfcGFyYW0oaWJfbXR1LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpYl9tdHUsICJJQiBNVFUgMjU2LzUxMi8xMDI0LzIwNDgvNDA5NiIpOwogCi1zdGF0aWMgaW50IGNvbmN1cnJlbnRfc2VuZHMgPSAwOworc3RhdGljIGludCBjb25jdXJyZW50X3NlbmRzOwogbW9kdWxlX3BhcmFtKGNvbmN1cnJlbnRfc2VuZHMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNvbmN1cnJlbnRfc2VuZHMsICJzZW5kIHdvcmstcXVldWUgc2l6aW5nIik7CiAKLXN0YXRpYyBpbnQgbWFwX29uX2RlbWFuZCA9IDA7CitzdGF0aWMgaW50IG1hcF9vbl9kZW1hbmQ7CiBtb2R1bGVfcGFyYW0obWFwX29uX2RlbWFuZCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobWFwX29uX2RlbWFuZCwgIm1hcCBvbiBkZW1hbmQiKTsKIApAQCAtMTM2LDEyICsxMzYsMTIgQEAKICAqIDE6IGVuYWJsZSBmYWlsb3ZlciBpZiBuZWNlc3NhcnkKICAqIDI6IGZvcmNlIHRvIGZhaWxvdmVyIChmb3IgZGVidWcpCiAgKi8KLXN0YXRpYyBpbnQgZGV2X2ZhaWxvdmVyID0gMDsKK3N0YXRpYyBpbnQgZGV2X2ZhaWxvdmVyOwogbW9kdWxlX3BhcmFtKGRldl9mYWlsb3ZlciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2X2ZhaWxvdmVyLCAiSENBIGZhaWxvdmVyIGZvciBib25kaW5nICgwIG9mZiwgMSBvbiwgb3RoZXIgdmFsdWVzIHJlc2VydmVkKSIpOwogCiAKLXN0YXRpYyBpbnQgcmVxdWlyZV9wcml2aWxlZ2VkX3BvcnQgPSAwOworc3RhdGljIGludCByZXF1aXJlX3ByaXZpbGVnZWRfcG9ydDsKIG1vZHVsZV9wYXJhbShyZXF1aXJlX3ByaXZpbGVnZWRfcG9ydCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVxdWlyZV9wcml2aWxlZ2VkX3BvcnQsICJyZXF1aXJlIHByaXZpbGVnZWQgcG9ydCB3aGVuIGFjY2VwdGluZyBjb25uZWN0aW9uIik7CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogfTsKIAogaW50Ci1raWJsbmRfdHVuYWJsZXNfaW5pdCAodm9pZCkKK2tpYmxuZF90dW5hYmxlc19pbml0KHZvaWQpCiB7CiAJaWYgKGtpYmxuZF90cmFuc2xhdGVfbXR1KCpraWJsbmRfdHVuYWJsZXMua2liX2liX210dSkgPCAwKSB7CiAJCUNFUlJPUigiSW52YWxpZCBpYl9tdHUgJWQsIGV4cGVjdGVkIDI1Ni81MTIvMTAyNC8yMDQ4LzQwOTZcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMKaW5kZXggNTk1NmRiYS4uNzU4NmI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYwpAQCAtNjUsMTUgKzY1LDE1IEBACiB9CiAKIHN0YXRpYyBrc29ja19yb3V0ZV90ICoKLWtzb2NrbmFsX2NyZWF0ZV9yb3V0ZSAoX191MzIgaXBhZGRyLCBpbnQgcG9ydCkKK2tzb2NrbmFsX2NyZWF0ZV9yb3V0ZShfX3UzMiBpcGFkZHIsIGludCBwb3J0KQogewogCWtzb2NrX3JvdXRlX3QgKnJvdXRlOwogCi0JTElCQ0ZTX0FMTE9DIChyb3V0ZSwgc2l6ZW9mICgqcm91dGUpKTsKKwlMSUJDRlNfQUxMT0Mocm91dGUsIHNpemVvZigqcm91dGUpKTsKIAlpZiAocm91dGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlhdG9taWNfc2V0ICgmcm91dGUtPmtzbnJfcmVmY291bnQsIDEpOworCWF0b21pY19zZXQoJnJvdXRlLT5rc25yX3JlZmNvdW50LCAxKTsKIAlyb3V0ZS0+a3Nucl9wZWVyID0gTlVMTDsKIAlyb3V0ZS0+a3Nucl9yZXRyeV9pbnRlcnZhbCA9IDA7CSAvKiBPSyB0byBjb25uZWN0IGF0IGFueSB0aW1lICovCiAJcm91dGUtPmtzbnJfaXBhZGRyID0gaXBhZGRyOwpAQCAtODksNDMgKzg5LDQzIEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX2Rlc3Ryb3lfcm91dGUgKGtzb2NrX3JvdXRlX3QgKnJvdXRlKQora3NvY2tuYWxfZGVzdHJveV9yb3V0ZShrc29ja19yb3V0ZV90ICpyb3V0ZSkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID09IDApOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnJvdXRlLT5rc25yX3JlZmNvdW50KSA9PSAwKTsKIAogCWlmIChyb3V0ZS0+a3Nucl9wZWVyICE9IE5VTEwpCiAJCWtzb2NrbmFsX3BlZXJfZGVjcmVmKHJvdXRlLT5rc25yX3BlZXIpOwogCi0JTElCQ0ZTX0ZSRUUgKHJvdXRlLCBzaXplb2YgKCpyb3V0ZSkpOworCUxJQkNGU19GUkVFKHJvdXRlLCBzaXplb2YoKnJvdXRlKSk7CiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX2NyZWF0ZV9wZWVyIChrc29ja19wZWVyX3QgKipwZWVycCwgbG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCitrc29ja25hbF9jcmVhdGVfcGVlcihrc29ja19wZWVyX3QgKipwZWVycCwgbG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCiB7CiAJa3NvY2tfbmV0X3QgICAqbmV0ID0gbmktPm5pX2RhdGE7CiAJa3NvY2tfcGVlcl90ICAqcGVlcjsKIAotCUxBU1NFUlQgKGlkLm5pZCAhPSBMTkVUX05JRF9BTlkpOwotCUxBU1NFUlQgKGlkLnBpZCAhPSBMTkVUX1BJRF9BTlkpOwotCUxBU1NFUlQgKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChpZC5uaWQgIT0gTE5FVF9OSURfQU5ZKTsKKwlMQVNTRVJUKGlkLnBpZCAhPSBMTkVUX1BJRF9BTlkpOworCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKIAotCUxJQkNGU19BTExPQyAocGVlciwgc2l6ZW9mICgqcGVlcikpOworCUxJQkNGU19BTExPQyhwZWVyLCBzaXplb2YoKnBlZXIpKTsKIAlpZiAocGVlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBlZXItPmtzbnBfbmkgPSBuaTsKIAlwZWVyLT5rc25wX2lkID0gaWQ7Ci0JYXRvbWljX3NldCAoJnBlZXItPmtzbnBfcmVmY291bnQsIDEpOyAgIC8qIDEgcmVmIGZvciBjYWxsZXIgKi8KKwlhdG9taWNfc2V0KCZwZWVyLT5rc25wX3JlZmNvdW50LCAxKTsgICAvKiAxIHJlZiBmb3IgY2FsbGVyICovCiAJcGVlci0+a3NucF9jbG9zaW5nID0gMDsKIAlwZWVyLT5rc25wX2FjY2VwdGluZyA9IDA7CiAJcGVlci0+a3NucF9wcm90byA9IE5VTEw7CiAJcGVlci0+a3NucF9sYXN0X2FsaXZlID0gMDsKIAlwZWVyLT5rc25wX3pjX25leHRfY29va2llID0gU09DS05BTF9LRUVQQUxJVkVfUElORyArIDE7CiAKLQlJTklUX0xJU1RfSEVBRCAoJnBlZXItPmtzbnBfY29ubnMpOwotCUlOSVRfTElTVF9IRUFEICgmcGVlci0+a3NucF9yb3V0ZXMpOwotCUlOSVRfTElTVF9IRUFEICgmcGVlci0+a3NucF90eF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQgKCZwZWVyLT5rc25wX3pjX3JlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+a3NucF9jb25ucyk7CisJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmtzbnBfcm91dGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+a3NucF90eF9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmtzbnBfemNfcmVxX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZwZWVyLT5rc25wX2xvY2spOwogCiAJc3Bpbl9sb2NrX2JoKCZuZXQtPmtzbm5fbG9jayk7CkBAIC0xNDcsMjEgKzE0NywyMSBAQAogfQogCiB2b2lkCi1rc29ja25hbF9kZXN0cm95X3BlZXIgKGtzb2NrX3BlZXJfdCAqcGVlcikKK2tzb2NrbmFsX2Rlc3Ryb3lfcGVlcihrc29ja19wZWVyX3QgKnBlZXIpCiB7CiAJa3NvY2tfbmV0X3QgICAgKm5ldCA9IHBlZXItPmtzbnBfbmktPm5pX2RhdGE7CiAKLQlDREVCVUcgKERfTkVULCAicGVlciAlcyAlcCBkZWxldGVkXG4iLAorCUNERUJVRyhEX05FVCwgInBlZXIgJXMgJXAgZGVsZXRlZFxuIiwKIAkJbGliY2ZzX2lkMnN0cihwZWVyLT5rc25wX2lkKSwgcGVlcik7CiAKLQlMQVNTRVJUIChhdG9taWNfcmVhZCAoJnBlZXItPmtzbnBfcmVmY291bnQpID09IDApOwotCUxBU1NFUlQgKHBlZXItPmtzbnBfYWNjZXB0aW5nID09IDApOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZwZWVyLT5rc25wX2Nvbm5zKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfcm91dGVzKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfdHhfcXVldWUpKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5ICgmcGVlci0+a3NucF96Y19yZXFfbGlzdCkpOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnBlZXItPmtzbnBfcmVmY291bnQpID09IDApOworCUxBU1NFUlQocGVlci0+a3NucF9hY2NlcHRpbmcgPT0gMCk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3JvdXRlcykpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF90eF9xdWV1ZSkpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF96Y19yZXFfbGlzdCkpOwogCi0JTElCQ0ZTX0ZSRUUgKHBlZXIsIHNpemVvZiAoKnBlZXIpKTsKKwlMSUJDRlNfRlJFRShwZWVyLCBzaXplb2YoKnBlZXIpKTsKIAogCS8qIE5CIGEgcGVlcidzIGNvbm5lY3Rpb25zIGFuZCByb3V0ZXMga2VlcCBhIHJlZmVyZW5jZSBvbiB0aGVpciBwZWVyCiAJICogdW50aWwgdGhleSBhcmUgZGVzdHJveWVkLCBzbyB3ZSBjYW4gYmUgYXNzdXJlZCB0aGF0IF9hbGxfIHN0YXRlIHRvCkBAIC0xNzMsMTcgKzE3MywxNyBAQAogfQogCiBrc29ja19wZWVyX3QgKgota3NvY2tuYWxfZmluZF9wZWVyX2xvY2tlZCAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCitrc29ja25hbF9maW5kX3BlZXJfbG9ja2VkKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnBlZXJfbGlzdCA9IGtzb2NrbmFsX25pZDJwZWVybGlzdChpZC5uaWQpOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnRtcDsKIAlrc29ja19wZWVyX3QgICAgICpwZWVyOwogCi0JbGlzdF9mb3JfZWFjaCAodG1wLCBwZWVyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgcGVlcl9saXN0KSB7CiAKLQkJcGVlciA9IGxpc3RfZW50cnkgKHRtcCwga3NvY2tfcGVlcl90LCBrc25wX2xpc3QpOworCQlwZWVyID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKIAotCQlMQVNTRVJUICghcGVlci0+a3NucF9jbG9zaW5nKTsKKwkJTEFTU0VSVCghcGVlci0+a3NucF9jbG9zaW5nKTsKIAogCQlpZiAocGVlci0+a3NucF9uaSAhPSBuaSkKIAkJCWNvbnRpbnVlOwpAQCAtMjAxLDcgKzIwMSw3IEBACiB9CiAKIGtzb2NrX3BlZXJfdCAqCi1rc29ja25hbF9maW5kX3BlZXIgKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQora3NvY2tuYWxfZmluZF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQogewogCWtzb2NrX3BlZXJfdCAgICAgKnBlZXI7CiAKQEAgLTIxNSwzNyArMjE1LDM3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1rc29ja25hbF91bmxpbmtfcGVlcl9sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlcikKK2tzb2NrbmFsX3VubGlua19wZWVyX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIpCiB7CiAJaW50CQlpOwogCV9fdTMyCSAgICAgIGlwOwogCWtzb2NrX2ludGVyZmFjZV90ICppZmFjZTsKIAogCWZvciAoaSA9IDA7IGkgPCBwZWVyLT5rc25wX25fcGFzc2l2ZV9pcHM7IGkrKykgewotCQlMQVNTRVJUIChpIDwgTE5FVF9NQVhfSU5URVJGQUNFUyk7CisJCUxBU1NFUlQoaSA8IExORVRfTUFYX0lOVEVSRkFDRVMpOwogCQlpcCA9IHBlZXItPmtzbnBfcGFzc2l2ZV9pcHNbaV07CiAKIAkJaWZhY2UgPSBrc29ja25hbF9pcDJpZmFjZShwZWVyLT5rc25wX25pLCBpcCk7CiAJCS8qIEFsbCBJUHMgaW4gcGVlci0+a3NucF9wYXNzaXZlX2lwc1tdIGNvbWUgZnJvbSB0aGUKIAkJICogaW50ZXJmYWNlIGxpc3QsIHRoZXJlZm9yZSB0aGUgY2FsbCBtdXN0IHN1Y2NlZWQuICovCi0JCUxBU1NFUlQgKGlmYWNlICE9IE5VTEwpOworCQlMQVNTRVJUKGlmYWNlICE9IE5VTEwpOwogCiAJCUNERUJVRyhEX05FVCwgInBlZXI9JXAgaWZhY2U9JXAga3NuaV9ucm91dGVzPSVkXG4iLAogCQkgICAgICAgcGVlciwgaWZhY2UsIGlmYWNlLT5rc25pX25yb3V0ZXMpOwogCQlpZmFjZS0+a3NuaV9ucGVlcnMtLTsKIAl9CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+a3NucF9yb3V0ZXMpKTsKLQlMQVNTRVJUICghcGVlci0+a3NucF9jbG9zaW5nKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfcm91dGVzKSk7CisJTEFTU0VSVCghcGVlci0+a3NucF9jbG9zaW5nKTsKIAlwZWVyLT5rc25wX2Nsb3NpbmcgPSAxOwotCWxpc3RfZGVsICgmcGVlci0+a3NucF9saXN0KTsKKwlsaXN0X2RlbCgmcGVlci0+a3NucF9saXN0KTsKIAkvKiBsb3NlIHBlZXJsaXN0J3MgcmVmICovCiAJa3NvY2tuYWxfcGVlcl9kZWNyZWYocGVlcik7CiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX2dldF9wZWVyX2luZm8gKGxuZXRfbmlfdCAqbmksIGludCBpbmRleCwKK2tzb2NrbmFsX2dldF9wZWVyX2luZm8obG5ldF9uaV90ICpuaSwgaW50IGluZGV4LAogCQkJbG5ldF9wcm9jZXNzX2lkX3QgKmlkLCBfX3UzMiAqbXlpcCwgX191MzIgKnBlZXJfaXAsCiAJCQlpbnQgKnBvcnQsIGludCAqY29ubl9jb3VudCwgaW50ICpzaGFyZV9jb3VudCkKIHsKQEAgLTI2MSw4ICsyNjEsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGtzb2NrbmFsX2RhdGEua3NuZF9wZWVyX2hhc2hfc2l6ZTsgaSsrKSB7CiAKLQkJbGlzdF9mb3JfZWFjaCAocHRtcCwgJmtzb2NrbmFsX2RhdGEua3NuZF9wZWVyc1tpXSkgewotCQkJcGVlciA9IGxpc3RfZW50cnkgKHB0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKKwkJbGlzdF9mb3JfZWFjaChwdG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlwZWVyID0gbGlzdF9lbnRyeShwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CiAKIAkJCWlmIChwZWVyLT5rc25wX25pICE9IG5pKQogCQkJCWNvbnRpbnVlOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCWxpc3RfZm9yX2VhY2ggKHJ0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgeworCQkJbGlzdF9mb3JfZWFjaChydG1wLCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKIAkJCQlpZiAoaW5kZXgtLSA+IDApCiAJCQkJCWNvbnRpbnVlOwogCkBAIC0zNjQsMTcgKzM2NCwxNyBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfYWRkX3JvdXRlX2xvY2tlZCAoa3NvY2tfcGVlcl90ICpwZWVyLCBrc29ja19yb3V0ZV90ICpyb3V0ZSkKK2tzb2NrbmFsX2FkZF9yb3V0ZV9sb2NrZWQoa3NvY2tfcGVlcl90ICpwZWVyLCBrc29ja19yb3V0ZV90ICpyb3V0ZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7CiAJa3NvY2tfY29ubl90ICAgICAgKmNvbm47CiAJa3NvY2tfcm91dGVfdCAgICAgKnJvdXRlMjsKIAotCUxBU1NFUlQgKCFwZWVyLT5rc25wX2Nsb3NpbmcpOwotCUxBU1NFUlQgKHJvdXRlLT5rc25yX3BlZXIgPT0gTlVMTCk7Ci0JTEFTU0VSVCAoIXJvdXRlLT5rc25yX3NjaGVkdWxlZCk7Ci0JTEFTU0VSVCAoIXJvdXRlLT5rc25yX2Nvbm5lY3RpbmcpOwotCUxBU1NFUlQgKHJvdXRlLT5rc25yX2Nvbm5lY3RlZCA9PSAwKTsKKwlMQVNTRVJUKCFwZWVyLT5rc25wX2Nsb3NpbmcpOworCUxBU1NFUlQocm91dGUtPmtzbnJfcGVlciA9PSBOVUxMKTsKKwlMQVNTRVJUKCFyb3V0ZS0+a3Nucl9zY2hlZHVsZWQpOworCUxBU1NFUlQoIXJvdXRlLT5rc25yX2Nvbm5lY3RpbmcpOworCUxBU1NFUlQocm91dGUtPmtzbnJfY29ubmVjdGVkID09IDApOwogCiAJLyogTEFTU0VSVCh1bmlxdWUpICovCiAJbGlzdF9mb3JfZWFjaCh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgewpAQCAtNDA1LDcgKzQwNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1rc29ja25hbF9kZWxfcm91dGVfbG9ja2VkIChrc29ja19yb3V0ZV90ICpyb3V0ZSkKK2tzb2NrbmFsX2RlbF9yb3V0ZV9sb2NrZWQoa3NvY2tfcm91dGVfdCAqcm91dGUpCiB7CiAJa3NvY2tfcGVlcl90ICAgICAgKnBlZXIgPSByb3V0ZS0+a3Nucl9wZWVyOwogCWtzb2NrX2ludGVyZmFjZV90ICppZmFjZTsKQEAgLTQxMywxNiArNDEzLDE2IEBACiAJc3RydWN0IGxpc3RfaGVhZAkqY3RtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpjbnh0OwogCi0JTEFTU0VSVCAoIXJvdXRlLT5rc25yX2RlbGV0ZWQpOworCUxBU1NFUlQoIXJvdXRlLT5rc25yX2RlbGV0ZWQpOwogCiAJLyogQ2xvc2UgYXNzb2NpYXRlZCBjb25ucyAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZSAoY3RtcCwgY254dCwgJnBlZXItPmtzbnBfY29ubnMpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoY3RtcCwgY254dCwgJnBlZXItPmtzbnBfY29ubnMpIHsKIAkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga3NvY2tfY29ubl90LCBrc25jX2xpc3QpOwogCiAJCWlmIChjb25uLT5rc25jX3JvdXRlICE9IHJvdXRlKQogCQkJY29udGludWU7CiAKLQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQgKGNvbm4sIDApOworCQlrc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZChjb25uLCAwKTsKIAl9CiAKIAlpZiAocm91dGUtPmtzbnJfbXlpcGFkZHIgIT0gMCkgewpAQCAtNDMzLDE5ICs0MzMsMTkgQEAKIAl9CiAKIAlyb3V0ZS0+a3Nucl9kZWxldGVkID0gMTsKLQlsaXN0X2RlbCAoJnJvdXRlLT5rc25yX2xpc3QpOworCWxpc3RfZGVsKCZyb3V0ZS0+a3Nucl9saXN0KTsKIAlrc29ja25hbF9yb3V0ZV9kZWNyZWYocm91dGUpOwkgICAgIC8qIGRyb3AgcGVlcidzIHJlZiAqLwogCi0JaWYgKGxpc3RfZW1wdHkgKCZwZWVyLT5rc25wX3JvdXRlcykgJiYKLQkgICAgbGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfY29ubnMpKSB7CisJaWYgKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfcm91dGVzKSAmJgorCSAgICBsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSkgewogCQkvKiBJJ3ZlIGp1c3QgcmVtb3ZlZCB0aGUgbGFzdCByb3V0ZSB0byBhIHBlZXIgd2l0aCBubyBhY3RpdmUKIAkJICogY29ubmVjdGlvbnMgKi8KLQkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkIChwZWVyKTsKKwkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkKHBlZXIpOwogCX0KIH0KIAogaW50Ci1rc29ja25hbF9hZGRfcGVlciAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwYWRkciwgaW50IHBvcnQpCitrc29ja25hbF9hZGRfcGVlcihsbmV0X25pX3QgKm5pLCBsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXBhZGRyLCBpbnQgcG9ydCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7CiAJa3NvY2tfcGVlcl90ICAgICAgKnBlZXI7CkBAIC00NjMsNyArNDYzLDcgQEAKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0Jcm91dGUgPSBrc29ja25hbF9jcmVhdGVfcm91dGUgKGlwYWRkciwgcG9ydCk7CisJcm91dGUgPSBrc29ja25hbF9jcmVhdGVfcm91dGUoaXBhZGRyLCBwb3J0KTsKIAlpZiAocm91dGUgPT0gTlVMTCkgewogCQlrc29ja25hbF9wZWVyX2RlY3JlZihwZWVyKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00NzIsMjAgKzQ3MiwyMCBAQAogCXdyaXRlX2xvY2tfYmgoJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CiAKIAkvKiBhbHdheXMgY2FsbGVkIHdpdGggYSByZWYgb24gbmksIHNvIHNodXRkb3duIGNhbid0IGhhdmUgc3RhcnRlZCAqLwotCUxBU1NFUlQgKCgoa3NvY2tfbmV0X3QgKikgbmktPm5pX2RhdGEpLT5rc25uX3NodXRkb3duID09IDApOworCUxBU1NFUlQoKChrc29ja19uZXRfdCAqKSBuaS0+bmlfZGF0YSktPmtzbm5fc2h1dGRvd24gPT0gMCk7CiAKLQlwZWVyMiA9IGtzb2NrbmFsX2ZpbmRfcGVlcl9sb2NrZWQgKG5pLCBpZCk7CisJcGVlcjIgPSBrc29ja25hbF9maW5kX3BlZXJfbG9ja2VkKG5pLCBpZCk7CiAJaWYgKHBlZXIyICE9IE5VTEwpIHsKIAkJa3NvY2tuYWxfcGVlcl9kZWNyZWYocGVlcik7CiAJCXBlZXIgPSBwZWVyMjsKIAl9IGVsc2UgewogCQkvKiBwZWVyIHRhYmxlIHRha2VzIG15IHJlZiBvbiBwZWVyICovCi0JCWxpc3RfYWRkX3RhaWwgKCZwZWVyLT5rc25wX2xpc3QsCi0JCQkJICAga3NvY2tuYWxfbmlkMnBlZXJsaXN0IChpZC5uaWQpKTsKKwkJbGlzdF9hZGRfdGFpbCgmcGVlci0+a3NucF9saXN0LAorCQkJCSAgIGtzb2NrbmFsX25pZDJwZWVybGlzdChpZC5uaWQpKTsKIAl9CiAKIAlyb3V0ZTIgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2ggKHRtcCwgJnBlZXItPmtzbnBfcm91dGVzKSB7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQlyb3V0ZTIgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAogCQlpZiAocm91dGUyLT5rc25yX2lwYWRkciA9PSBpcGFkZHIpCkBAIC01MDcsNyArNTA3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtzb2NrbmFsX2RlbF9wZWVyX2xvY2tlZCAoa3NvY2tfcGVlcl90ICpwZWVyLCBfX3UzMiBpcCkKK2tzb2NrbmFsX2RlbF9wZWVyX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIsIF9fdTMyIGlwKQogewogCWtzb2NrX2Nvbm5fdCAgICAgKmNvbm47CiAJa3NvY2tfcm91dGVfdCAgICAqcm91dGU7CkBAIC01MTUsMTIgKzUxNSwxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKm54dDsKIAlpbnQJICAgICAgIG5zaGFyZWQ7CiAKLQlMQVNTRVJUICghcGVlci0+a3NucF9jbG9zaW5nKTsKKwlMQVNTRVJUKCFwZWVyLT5rc25wX2Nsb3NpbmcpOwogCiAJLyogRXh0cmEgcmVmIHByZXZlbnRzIHBlZXIgZGlzYXBwZWFyaW5nIHVudGlsIEknbSBkb25lIHdpdGggaXQgKi8KIAlrc29ja25hbF9wZWVyX2FkZHJlZihwZWVyKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZSAodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIG54dCwgJnBlZXItPmtzbnBfcm91dGVzKSB7CiAJCXJvdXRlID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3JvdXRlX3QsIGtzbnJfbGlzdCk7CiAKIAkJLyogbm8gbWF0Y2ggKi8KQEAgLTUyOSwxMSArNTI5LDExIEBACiAKIAkJcm91dGUtPmtzbnJfc2hhcmVfY291bnQgPSAwOwogCQkvKiBUaGlzIGRlbGV0ZXMgYXNzb2NpYXRlZCBjb25ucyB0b28gKi8KLQkJa3NvY2tuYWxfZGVsX3JvdXRlX2xvY2tlZCAocm91dGUpOworCQlrc29ja25hbF9kZWxfcm91dGVfbG9ja2VkKHJvdXRlKTsKIAl9CiAKIAluc2hhcmVkID0gMDsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgbnh0LCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQlyb3V0ZSA9IGxpc3RfZW50cnkodG1wLCBrc29ja19yb3V0ZV90LCBrc25yX2xpc3QpOwogCQluc2hhcmVkICs9IHJvdXRlLT5rc25yX3NoYXJlX2NvdW50OwogCX0KQEAgLTU0MiwxNSArNTQyLDE1IEBACiAJCS8qIHJlbW92ZSBldmVyeXRoaW5nIGVsc2UgaWYgdGhlcmUgYXJlIG5vIGV4cGxpY2l0IGVudHJpZXMKIAkJICogbGVmdCAqLwogCi0JCWxpc3RfZm9yX2VhY2hfc2FmZSAodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQkJcm91dGUgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAogCQkJLyogd2Ugc2hvdWxkIG9ubHkgYmUgcmVtb3ZpbmcgYXV0by1lbnRyaWVzICovCiAJCQlMQVNTRVJUKHJvdXRlLT5rc25yX3NoYXJlX2NvdW50ID09IDApOwotCQkJa3NvY2tuYWxfZGVsX3JvdXRlX2xvY2tlZCAocm91dGUpOworCQkJa3NvY2tuYWxfZGVsX3JvdXRlX2xvY2tlZChyb3V0ZSk7CiAJCX0KIAotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgbnh0LCAmcGVlci0+a3NucF9jb25ucykgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsICZwZWVyLT5rc25wX2Nvbm5zKSB7CiAJCQljb25uID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX2Nvbm5fdCwga3NuY19saXN0KTsKIAogCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQoY29ubiwgMCk7CkBAIC01NjIsOSArNTYyLDkgQEAKIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfZGVsX3BlZXIgKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkLCBfX3UzMiBpcCkKK2tzb2NrbmFsX2RlbF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkLCBfX3UzMiBpcCkKIHsKLQlMSVNUX0hFQUQgICAgICh6b21iaWVzKTsKKwlMSVNUX0hFQUQoem9tYmllcyk7CiAJc3RydWN0IGxpc3RfaGVhZAkqcHRtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpwbnh0OwogCWtzb2NrX3BlZXJfdCAgICAgICpwZWVyOwpAQCAtNTgzLDkgKzU4Myw5IEBACiAJfQogCiAJZm9yIChpID0gbG87IGkgPD0gaGk7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHB0bXAsIHBueHQsCisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdG1wLCBwbnh0LAogCQkJCQkma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7Ci0JCQlwZWVyID0gbGlzdF9lbnRyeSAocHRtcCwga3NvY2tfcGVlcl90LCBrc25wX2xpc3QpOworCQkJcGVlciA9IGxpc3RfZW50cnkocHRtcCwga3NvY2tfcGVlcl90LCBrc25wX2xpc3QpOwogCiAJCQlpZiAocGVlci0+a3NucF9uaSAhPSBuaSkKIAkJCQljb250aW51ZTsKQEAgLTU5NiwxMiArNTk2LDEyIEBACiAKIAkJCWtzb2NrbmFsX3BlZXJfYWRkcmVmKHBlZXIpOyAgICAgLyogYSByZWYgZm9yIG1lLi4uICovCiAKLQkJCWtzb2NrbmFsX2RlbF9wZWVyX2xvY2tlZCAocGVlciwgaXApOworCQkJa3NvY2tuYWxfZGVsX3BlZXJfbG9ja2VkKHBlZXIsIGlwKTsKIAogCQkJaWYgKHBlZXItPmtzbnBfY2xvc2luZyAmJgogCQkJICAgICFsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3R4X3F1ZXVlKSkgewotCQkJCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpKTsKLQkJCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3JvdXRlcykpOworCQkJCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF9jb25ucykpOworCQkJCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF9yb3V0ZXMpKTsKIAogCQkJCWxpc3Rfc3BsaWNlX2luaXQoJnBlZXItPmtzbnBfdHhfcXVldWUsCiAJCQkJCQkgICAgICZ6b21iaWVzKTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogfQogCiBzdGF0aWMga3NvY2tfY29ubl90ICoKLWtzb2NrbmFsX2dldF9jb25uX2J5X2lkeCAobG5ldF9uaV90ICpuaSwgaW50IGluZGV4KQora3NvY2tuYWxfZ2V0X2Nvbm5fYnlfaWR4KGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKIHsKIAlrc29ja19wZWVyX3QgICAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpwdG1wOwpAQCAtNjMyLDE5ICs2MzIsMTkgQEAKIAlyZWFkX2xvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaCAocHRtcCwgJmtzb2NrbmFsX2RhdGEua3NuZF9wZWVyc1tpXSkgewotCQkJcGVlciA9IGxpc3RfZW50cnkgKHB0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKKwkJbGlzdF9mb3JfZWFjaChwdG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlwZWVyID0gbGlzdF9lbnRyeShwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CiAKLQkJCUxBU1NFUlQgKCFwZWVyLT5rc25wX2Nsb3NpbmcpOworCQkJTEFTU0VSVCghcGVlci0+a3NucF9jbG9zaW5nKTsKIAogCQkJaWYgKHBlZXItPmtzbnBfbmkgIT0gbmkpCiAJCQkJY29udGludWU7CiAKLQkJCWxpc3RfZm9yX2VhY2ggKGN0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCQlsaXN0X2Zvcl9lYWNoKGN0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CiAJCQkJaWYgKGluZGV4LS0gPiAwKQogCQkJCQljb250aW51ZTsKIAotCQkJCWNvbm4gPSBsaXN0X2VudHJ5IChjdG1wLCBrc29ja19jb25uX3QsCisJCQkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga3NvY2tfY29ubl90LAogCQkJCQkJICAgICAgIGtzbmNfbGlzdCk7CiAJCQkJa3NvY2tuYWxfY29ubl9hZGRyZWYoY29ubik7CiAJCQkJcmVhZF91bmxvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CkBAIC02ODEsNyArNjgxLDcgQEAKIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfbG9jYWxfaXB2ZWMgKGxuZXRfbmlfdCAqbmksIF9fdTMyICppcGFkZHJzKQora3NvY2tuYWxfbG9jYWxfaXB2ZWMobG5ldF9uaV90ICpuaSwgX191MzIgKmlwYWRkcnMpCiB7CiAJa3NvY2tfbmV0X3QgICAgICAgKm5ldCA9IG5pLT5uaV9kYXRhOwogCWludAkJaTsKQEAgLTY5MCw3ICs2OTAsNyBAQAogCXJlYWRfbG9jaygma3NvY2tuYWxfZGF0YS5rc25kX2dsb2JhbF9sb2NrKTsKIAogCW5pcCA9IG5ldC0+a3Nubl9uaW50ZXJmYWNlczsKLQlMQVNTRVJUIChuaXAgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CisJTEFTU0VSVChuaXAgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CiAKIAkvKiBPbmx5IG9mZmVyIGludGVyZmFjZXMgZm9yIGFkZGl0aW9uYWwgY29ubmVjdGlvbnMgaWYgSSBoYXZlCiAJICogbW9yZSB0aGFuIG9uZS4gKi8KQEAgLTcwMSw3ICs3MDEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5pcDsgaSsrKSB7CiAJCWlwYWRkcnNbaV0gPSBuZXQtPmtzbm5faW50ZXJmYWNlc1tpXS5rc25pX2lwYWRkcjsKLQkJTEFTU0VSVCAoaXBhZGRyc1tpXSAhPSAwKTsKKwkJTEFTU0VSVChpcGFkZHJzW2ldICE9IDApOwogCX0KIAogCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwpAQCAtNzA5LDcgKzcwOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX21hdGNoX3BlZXJpcCAoa3NvY2tfaW50ZXJmYWNlX3QgKmlmYWNlLCBfX3UzMiAqaXBzLCBpbnQgbmlwcykKK2tzb2NrbmFsX21hdGNoX3BlZXJpcChrc29ja19pbnRlcmZhY2VfdCAqaWZhY2UsIF9fdTMyICppcHMsIGludCBuaXBzKQogewogCWludCAgIGJlc3RfbmV0bWF0Y2ggPSAwOwogCWludCAgIGJlc3RfeG9yICAgICAgPSAwOwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJCWlmIChpcHNbaV0gPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCXRoaXNfeG9yID0gKGlwc1tpXSBeIGlmYWNlLT5rc25pX2lwYWRkcik7CisJCXRoaXNfeG9yID0gaXBzW2ldIF4gaWZhY2UtPmtzbmlfaXBhZGRyOwogCQl0aGlzX25ldG1hdGNoID0gKCh0aGlzX3hvciAmIGlmYWNlLT5rc25pX25ldG1hc2spID09IDApID8gMSA6IDA7CiAKIAkJaWYgKCEoYmVzdCA8IDAgfHwKQEAgLTczNiw3ICs3MzYsNyBAQAogCQliZXN0X3hvciA9IHRoaXNfeG9yOwogCX0KIAotCUxBU1NFUlQgKGJlc3QgPj0gMCk7CisJTEFTU0VSVChiZXN0ID49IDApOwogCXJldHVybiBiZXN0OwogfQogCkBAIC03NjcsOCArNzY3LDggQEAKIAogCXdyaXRlX2xvY2tfYmgoZ2xvYmFsX2xvY2spOwogCi0JTEFTU0VSVCAobl9wZWVyaXBzIDw9IExORVRfTUFYX0lOVEVSRkFDRVMpOwotCUxBU1NFUlQgKG5ldC0+a3Nubl9uaW50ZXJmYWNlcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKKwlMQVNTRVJUKG5fcGVlcmlwcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKKwlMQVNTRVJUKG5ldC0+a3Nubl9uaW50ZXJmYWNlcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKIAogCS8qIE9ubHkgbWF0Y2ggaW50ZXJmYWNlcyBmb3IgYWRkaXRpb25hbCBjb25uZWN0aW9ucwogCSAqIGlmIEkgaGF2ZSA+IDEgaW50ZXJmYWNlICovCkBAIC03OTEsNyArNzkxLDcgQEAKIAogCQl9IGVsc2UgewogCQkJLyogY2hvb3NlIGEgbmV3IGludGVyZmFjZSAqLwotCQkJTEFTU0VSVCAoaSA9PSBwZWVyLT5rc25wX25fcGFzc2l2ZV9pcHMpOworCQkJTEFTU0VSVChpID09IHBlZXItPmtzbnBfbl9wYXNzaXZlX2lwcyk7CiAKIAkJCWJlc3RfaWZhY2UgPSBOVUxMOwogCQkJYmVzdF9uZXRtYXRjaCA9IDA7CkBAIC04MDksNyArODA5LDcgQEAKIAkJCQkJY29udGludWU7CiAKIAkJCQlrID0ga3NvY2tuYWxfbWF0Y2hfcGVlcmlwKGlmYWNlLCBwZWVyaXBzLCBuX3BlZXJpcHMpOwotCQkJCXhvciA9IChpcCBeIHBlZXJpcHNba10pOworCQkJCXhvciA9IGlwIF4gcGVlcmlwc1trXTsKIAkJCQl0aGlzX25ldG1hdGNoID0gKCh4b3IgJiBpZmFjZS0+a3NuaV9uZXRtYXNrKSA9PSAwKSA/IDEgOiAwOwogCiAJCQkJaWYgKCEoYmVzdF9pZmFjZSA9PSBOVUxMIHx8CkBAIC04NzQsNyArODc0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCUxBU1NFUlQgKG5wZWVyX2lwYWRkcnMgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CisJTEFTU0VSVChucGVlcl9pcGFkZHJzIDw9IExORVRfTUFYX0lOVEVSRkFDRVMpOwogCiAJZm9yIChpID0gMDsgaSA8IG5wZWVyX2lwYWRkcnM7IGkrKykgewogCQlpZiAobmV3cm91dGUgIT0gTlVMTCkgewpAQCAtOTExLDcgKzkxMSw3IEBACiAJCWJlc3RfbnJvdXRlcyA9IDA7CiAJCWJlc3RfbmV0bWF0Y2ggPSAwOwogCi0JCUxBU1NFUlQgKG5ldC0+a3Nubl9uaW50ZXJmYWNlcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKKwkJTEFTU0VSVChuZXQtPmtzbm5fbmludGVyZmFjZXMgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CiAKIAkJLyogU2VsZWN0IGludGVyZmFjZSB0byBjb25uZWN0IGZyb20gKi8KIAkJZm9yIChqID0gMDsgaiA8IG5ldC0+a3Nubl9uaW50ZXJmYWNlczsgaisrKSB7CkBAIC05NjEsNyArOTYxLDcgQEAKIH0KIAogaW50Ci1rc29ja25hbF9hY2NlcHQgKGxuZXRfbmlfdCAqbmksIHN0cnVjdCBzb2NrZXQgKnNvY2spCitrc29ja25hbF9hY2NlcHQobG5ldF9uaV90ICpuaSwgc3RydWN0IHNvY2tldCAqc29jaykKIHsKIAlrc29ja19jb25ucmVxX3QgICAgKmNyOwogCWludAkJIHJjOwpAQCAtOTY5LDcgKzk2OSw3IEBACiAJaW50CQkgcGVlcl9wb3J0OwogCiAJcmMgPSBsaWJjZnNfc29ja19nZXRhZGRyKHNvY2ssIDEsICZwZWVyX2lwLCAmcGVlcl9wb3J0KTsKLQlMQVNTRVJUIChyYyA9PSAwKTsJCSAgICAgIC8qIHdlIHN1Y2NlZWRlZCBiZWZvcmUgKi8KKwlMQVNTRVJUKHJjID09IDApOwkJICAgICAgLyogd2Ugc3VjY2VlZGVkIGJlZm9yZSAqLwogCiAJTElCQ0ZTX0FMTE9DKGNyLCBzaXplb2YoKmNyKSk7CiAJaWYgKGNyID09IE5VTEwpIHsKQEAgLTk5MiwxMSArOTkyLDExIEBACiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX2Nvbm5lY3RpbmcgKGtzb2NrX3BlZXJfdCAqcGVlciwgX191MzIgaXBhZGRyKQora3NvY2tuYWxfY29ubmVjdGluZyhrc29ja19wZWVyX3QgKnBlZXIsIF9fdTMyIGlwYWRkcikKIHsKIAlrc29ja19yb3V0ZV90ICAgKnJvdXRlOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAocm91dGUsICZwZWVyLT5rc25wX3JvdXRlcywga3Nucl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyb3V0ZSwgJnBlZXItPmtzbnBfcm91dGVzLCBrc25yX2xpc3QpIHsKIAogCQlpZiAocm91dGUtPmtzbnJfaXBhZGRyID09IGlwYWRkcikKIAkJCXJldHVybiByb3V0ZS0+a3Nucl9jb25uZWN0aW5nOwpAQCAtMTAwNSwxMSArMTAwNSwxMSBAQAogfQogCiBpbnQKLWtzb2NrbmFsX2NyZWF0ZV9jb25uIChsbmV0X25pX3QgKm5pLCBrc29ja19yb3V0ZV90ICpyb3V0ZSwKK2tzb2NrbmFsX2NyZWF0ZV9jb25uKGxuZXRfbmlfdCAqbmksIGtzb2NrX3JvdXRlX3QgKnJvdXRlLAogCQkgICAgICBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgdHlwZSkKIHsKIAlyd2xvY2tfdAkJKmdsb2JhbF9sb2NrID0gJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jazsKLQlMSVNUX0hFQUQgICAgICh6b21iaWVzKTsKKwlMSVNUX0hFQUQoem9tYmllcyk7CiAJbG5ldF9wcm9jZXNzX2lkX3QgIHBlZXJpZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7CiAJX191NjQJICAgICAgaW5jYXJuYXRpb247CkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogCiAJYWN0aXZlID0gKHJvdXRlICE9IE5VTEwpOwogCi0JTEFTU0VSVCAoYWN0aXZlID09ICh0eXBlICE9IFNPQ0tMTkRfQ09OTl9OT05FKSk7CisJTEFTU0VSVChhY3RpdmUgPT0gKHR5cGUgIT0gU09DS0xORF9DT05OX05PTkUpKTsKIAogCUxJQkNGU19BTExPQyhjb25uLCBzaXplb2YoKmNvbm4pKTsKIAlpZiAoY29ubiA9PSBOVUxMKSB7CkBAIC0xMDQxLDE5ICsxMDQxLDE5IEBACiAJY29ubi0+a3NuY19zb2NrID0gc29jazsKIAkvKiAyIHJlZiwgMSBmb3IgY29ubiwgYW5vdGhlciBleHRyYSByZWYgcHJldmVudHMgc29ja2V0CiAJICogYmVpbmcgY2xvc2VkIGJlZm9yZSBlc3RhYmxpc2htZW50IG9mIGNvbm5lY3Rpb24gKi8KLQlhdG9taWNfc2V0ICgmY29ubi0+a3NuY19zb2NrX3JlZmNvdW50LCAyKTsKKwlhdG9taWNfc2V0KCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQsIDIpOwogCWNvbm4tPmtzbmNfdHlwZSA9IHR5cGU7CiAJa3NvY2tuYWxfbGliX3NhdmVfY2FsbGJhY2soc29jaywgY29ubik7Ci0JYXRvbWljX3NldCAoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCwgMSk7IC8qIDEgcmVmIGZvciBtZSAqLworCWF0b21pY19zZXQoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCwgMSk7IC8qIDEgcmVmIGZvciBtZSAqLwogCiAJY29ubi0+a3NuY19yeF9yZWFkeSA9IDA7CiAJY29ubi0+a3NuY19yeF9zY2hlZHVsZWQgPSAwOwogCi0JSU5JVF9MSVNUX0hFQUQgKCZjb25uLT5rc25jX3R4X3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmY29ubi0+a3NuY190eF9xdWV1ZSk7CiAJY29ubi0+a3NuY190eF9yZWFkeSA9IDA7CiAJY29ubi0+a3NuY190eF9zY2hlZHVsZWQgPSAwOwogCWNvbm4tPmtzbmNfdHhfY2FycmllciA9IE5VTEw7Ci0JYXRvbWljX3NldCAoJmNvbm4tPmtzbmNfdHhfbm9iLCAwKTsKKwlhdG9taWNfc2V0KCZjb25uLT5rc25jX3R4X25vYiwgMCk7CiAKIAlMSUJDRlNfQUxMT0MoaGVsbG8sIG9mZnNldG9mKGtzb2NrX2hlbGxvX21zZ190LAogCQkJCSAgICAga3NobV9pcHNbTE5FVF9NQVhfSU5URVJGQUNFU10pKTsKQEAgLTEwNjMsNyArMTA2Myw3IEBACiAJfQogCiAJLyogc3Rhc2ggY29ubidzIGxvY2FsIGFuZCByZW1vdGUgYWRkcnMgKi8KLQlyYyA9IGtzb2NrbmFsX2xpYl9nZXRfY29ubl9hZGRycyAoY29ubik7CisJcmMgPSBrc29ja25hbF9saWJfZ2V0X2Nvbm5fYWRkcnMoY29ubik7CiAJaWYgKHJjICE9IDApCiAJCWdvdG8gZmFpbGVkXzE7CiAKQEAgLTEwOTQsNyArMTA5NCw3IEBACiAjZW5kaWYKIAkJfQogCi0JCXJjID0ga3NvY2tuYWxfc2VuZF9oZWxsbyAobmksIGNvbm4sIHBlZXJpZC5uaWQsIGhlbGxvKTsKKwkJcmMgPSBrc29ja25hbF9zZW5kX2hlbGxvKG5pLCBjb25uLCBwZWVyaWQubmlkLCBoZWxsbyk7CiAJCWlmIChyYyAhPSAwKQogCQkJZ290byBmYWlsZWRfMTsKIAl9IGVsc2UgewpAQCAtMTEwNSwxMyArMTEwNSwxMyBAQAogCQljb25uLT5rc25jX3Byb3RvID0gTlVMTDsKIAl9CiAKLQlyYyA9IGtzb2NrbmFsX3JlY3ZfaGVsbG8gKG5pLCBjb25uLCBoZWxsbywgJnBlZXJpZCwgJmluY2FybmF0aW9uKTsKKwlyYyA9IGtzb2NrbmFsX3JlY3ZfaGVsbG8obmksIGNvbm4sIGhlbGxvLCAmcGVlcmlkLCAmaW5jYXJuYXRpb24pOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZmFpbGVkXzE7CiAKLQlMQVNTRVJUIChyYyA9PSAwIHx8IGFjdGl2ZSk7Ci0JTEFTU0VSVCAoY29ubi0+a3NuY19wcm90byAhPSBOVUxMKTsKLQlMQVNTRVJUIChwZWVyaWQubmlkICE9IExORVRfTklEX0FOWSk7CisJTEFTU0VSVChyYyA9PSAwIHx8IGFjdGl2ZSk7CisJTEFTU0VSVChjb25uLT5rc25jX3Byb3RvICE9IE5VTEwpOworCUxBU1NFUlQocGVlcmlkLm5pZCAhPSBMTkVUX05JRF9BTlkpOwogCiAJY3B0ID0gbG5ldF9jcHRfb2ZfbmlkKHBlZXJpZC5uaWQpOwogCkBAIC0xMTI2LDcgKzExMjYsNyBAQAogCQl3cml0ZV9sb2NrX2JoKGdsb2JhbF9sb2NrKTsKIAogCQkvKiBjYWxsZWQgd2l0aCBhIHJlZiBvbiBuaSwgc28gc2h1dGRvd24gY2FuJ3QgaGF2ZSBzdGFydGVkICovCi0JCUxBU1NFUlQgKCgoa3NvY2tfbmV0X3QgKikgbmktPm5pX2RhdGEpLT5rc25uX3NodXRkb3duID09IDApOworCQlMQVNTRVJUKCgoa3NvY2tfbmV0X3QgKikgbmktPm5pX2RhdGEpLT5rc25uX3NodXRkb3duID09IDApOwogCiAJCXBlZXIyID0ga3NvY2tuYWxfZmluZF9wZWVyX2xvY2tlZChuaSwgcGVlcmlkKTsKIAkJaWYgKHBlZXIyID09IE5VTEwpIHsKQEAgLTExNjYsNyArMTE2Niw3IEBACiAJCSAqIE5CIHJlY3ZfaGVsbG8gbWF5IGhhdmUgcmV0dXJuZWQgRVBST1RPIHRvIHNpZ25hbCBteSBwZWVyCiAJCSAqIHdhbnRzIGEgZGlmZmVyZW50IHByb3RvY29sIHRoYW4gdGhlIG9uZSBJIGFza2VkIGZvci4KIAkJICovCi0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7CiAKIAkJcGVlci0+a3NucF9wcm90byA9IGNvbm4tPmtzbmNfcHJvdG87CiAJCXBlZXItPmtzbnBfaW5jYXJuYXRpb24gPSBpbmNhcm5hdGlvbjsKQEAgLTEyMTEsNyArMTIxMSw3IEBACiAKIAkJCS8qIFJlcGx5IG9uIGEgcGFzc2l2ZSBjb25uZWN0aW9uIGF0dGVtcHQgc28gdGhlIHBlZXIKIAkJCSAqIHJlYWxpc2VzIHdlJ3JlIGNvbm5lY3RlZC4gKi8KLQkJCUxBU1NFUlQgKHJjID09IDApOworCQkJTEFTU0VSVChyYyA9PSAwKTsKIAkJCWlmICghYWN0aXZlKQogCQkJCXJjID0gRUFMUkVBRFk7CiAKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAJICogY3JlYXRlIGFuIGFzc29jaWF0aW9uLiAgVGhpcyBhbGxvd3MgaW5jb21pbmcgY29ubmVjdGlvbnMgY3JlYXRlZAogCSAqIGJ5IHJvdXRlcyBpbiBteSBwZWVyIHRvIG1hdGNoIG15IG93biByb3V0ZSBlbnRyaWVzIHNvIEkgZG9uJ3QKIAkgKiBjb250aW51YWxseSBjcmVhdGUgZHVwbGljYXRlIHJvdXRlcy4gKi8KLQlsaXN0X2Zvcl9lYWNoICh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2godG1wLCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKIAkJcm91dGUgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAogCQlpZiAocm91dGUtPmtzbnJfaXBhZGRyICE9IGNvbm4tPmtzbmNfaXBhZGRyKQpAQCAtMTI2MCw3ICsxMjYwLDcgQEAKIAljb25uLT5rc25jX3R4X2RlYWRsaW5lID0gY2ZzX3RpbWVfc2hpZnQoKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfdGltZW91dCk7CiAJbWIoKTsgICAvKiBvcmRlciB3aXRoIGFkZGluZyB0byBwZWVyJ3MgY29ubiBsaXN0ICovCiAKLQlsaXN0X2FkZCAoJmNvbm4tPmtzbmNfbGlzdCwgJnBlZXItPmtzbnBfY29ubnMpOworCWxpc3RfYWRkKCZjb25uLT5rc25jX2xpc3QsICZwZWVyLT5rc25wX2Nvbm5zKTsKIAlrc29ja25hbF9jb25uX2FkZHJlZihjb25uKTsKIAogCWtzb2NrbmFsX25ld19wYWNrZXQoY29ubiwgMCk7CkBAIC0xMjcyLDggKzEyNzIsOCBAQAogCQlpZiAoY29ubi0+a3NuY19wcm90by0+cHJvX21hdGNoX3R4KGNvbm4sIHR4LCB0eC0+dHhfbm9uYmxrKSA9PSBTT0NLTkFMX01BVENIX05PKQogCQkJCWNvbnRpbnVlOwogCi0JCWxpc3RfZGVsICgmdHgtPnR4X2xpc3QpOwotCQlrc29ja25hbF9xdWV1ZV90eF9sb2NrZWQgKHR4LCBjb25uKTsKKwkJbGlzdF9kZWwoJnR4LT50eF9saXN0KTsKKwkJa3NvY2tuYWxfcXVldWVfdHhfbG9ja2VkKHR4LCBjb25uKTsKIAl9CiAKIAl3cml0ZV91bmxvY2tfYmgoZ2xvYmFsX2xvY2spOwpAQCAtMTM0Myw4ICsxMzQzLDggQEAKIAogIGZhaWxlZF8yOgogCWlmICghcGVlci0+a3NucF9jbG9zaW5nICYmCi0JICAgIGxpc3RfZW1wdHkgKCZwZWVyLT5rc25wX2Nvbm5zKSAmJgotCSAgICBsaXN0X2VtcHR5ICgmcGVlci0+a3NucF9yb3V0ZXMpKSB7CisJICAgIGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpICYmCisJICAgIGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfcm91dGVzKSkgewogCQlsaXN0X2FkZCgmem9tYmllcywgJnBlZXItPmtzbnBfdHhfcXVldWUpOwogCQlsaXN0X2RlbF9pbml0KCZwZWVyLT5rc25wX3R4X3F1ZXVlKTsKIAkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkKHBlZXIpOwpAQCAtMTM4Myw3ICsxMzgzLDcgQEAKIAkJTElCQ0ZTX0ZSRUUoaGVsbG8sIG9mZnNldG9mKGtzb2NrX2hlbGxvX21zZ190LAogCQkJCQkgICAga3NobV9pcHNbTE5FVF9NQVhfSU5URVJGQUNFU10pKTsKIAotCUxJQkNGU19GUkVFIChjb25uLCBzaXplb2YoKmNvbm4pKTsKKwlMSUJDRlNfRlJFRShjb25uLCBzaXplb2YoKmNvbm4pKTsKIAogIGZhaWxlZF8wOgogCWxpYmNmc19zb2NrX3JlbGVhc2Uoc29jayk7CkBAIC0xMzkxLDcgKzEzOTEsNyBAQAogfQogCiB2b2lkCi1rc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZCAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgZXJyb3IpCitrc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZChrc29ja19jb25uX3QgKmNvbm4sIGludCBlcnJvcikKIHsKIAkvKiBUaGlzIGp1c3QgZG9lcyB0aGUgaW1tbWVkaWF0ZSBob3VzZWtlZXBpbmcsIGFuZCBxdWV1ZXMgdGhlCiAJICogY29ubmVjdGlvbiBmb3IgdGhlIHJlYXBlciB0byB0ZXJtaW5hdGUuCkBAIC0xNDAxLDE4ICsxNDAxLDE4IEBACiAJa3NvY2tfY29ubl90ICAgICAgKmNvbm4yOwogCXN0cnVjdCBsaXN0X2hlYWQJKnRtcDsKIAotCUxBU1NFUlQgKHBlZXItPmtzbnBfZXJyb3IgPT0gMCk7Ci0JTEFTU0VSVCAoIWNvbm4tPmtzbmNfY2xvc2luZyk7CisJTEFTU0VSVChwZWVyLT5rc25wX2Vycm9yID09IDApOworCUxBU1NFUlQoIWNvbm4tPmtzbmNfY2xvc2luZyk7CiAJY29ubi0+a3NuY19jbG9zaW5nID0gMTsKIAogCS8qIGtzbmRfZGVhdGhyb3dfY29ubnMgdGFrZXMgb3ZlciBwZWVyJ3MgcmVmICovCi0JbGlzdF9kZWwgKCZjb25uLT5rc25jX2xpc3QpOworCWxpc3RfZGVsKCZjb25uLT5rc25jX2xpc3QpOwogCiAJcm91dGUgPSBjb25uLT5rc25jX3JvdXRlOwogCWlmIChyb3V0ZSAhPSBOVUxMKSB7CiAJCS8qIGRpc3NvY2lhdGUgY29ubiBmcm9tIHJvdXRlLi4uICovCi0JCUxBU1NFUlQgKCFyb3V0ZS0+a3Nucl9kZWxldGVkKTsKLQkJTEFTU0VSVCAoKHJvdXRlLT5rc25yX2Nvbm5lY3RlZCAmICgxIDw8IGNvbm4tPmtzbmNfdHlwZSkpICE9IDApOworCQlMQVNTRVJUKCFyb3V0ZS0+a3Nucl9kZWxldGVkKTsKKwkJTEFTU0VSVCgocm91dGUtPmtzbnJfY29ubmVjdGVkICYgKDEgPDwgY29ubi0+a3NuY190eXBlKSkgIT0gMCk7CiAKIAkJY29ubjIgPSBOVUxMOwogCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnBlZXItPmtzbnBfY29ubnMpIHsKQEAgLTE0MzEsMTkgKzE0MzEsMTkgQEAKIAogI2lmIDAJICAgLyogaXJyZWxldmFudCB3aXRoIG9ubHkgZWFnZXIgcm91dGVzICovCiAJCS8qIG1ha2Ugcm91dGUgbGVhc3QgZmF2b3VyaXRlICovCi0JCWxpc3RfZGVsICgmcm91dGUtPmtzbnJfbGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwgKCZyb3V0ZS0+a3Nucl9saXN0LCAmcGVlci0+a3NucF9yb3V0ZXMpOworCQlsaXN0X2RlbCgmcm91dGUtPmtzbnJfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnJvdXRlLT5rc25yX2xpc3QsICZwZWVyLT5rc25wX3JvdXRlcyk7CiAjZW5kaWYKIAkJa3NvY2tuYWxfcm91dGVfZGVjcmVmKHJvdXRlKTsgICAgIC8qIGRyb3AgY29ubidzIHJlZiBvbiByb3V0ZSAqLwogCX0KIAotCWlmIChsaXN0X2VtcHR5ICgmcGVlci0+a3NucF9jb25ucykpIHsKKwlpZiAobGlzdF9lbXB0eSgmcGVlci0+a3NucF9jb25ucykpIHsKIAkJLyogTm8gbW9yZSBjb25uZWN0aW9ucyB0byB0aGlzIHBlZXIgKi8KIAogCQlpZiAoIWxpc3RfZW1wdHkoJnBlZXItPmtzbnBfdHhfcXVldWUpKSB7CiAJCQlrc29ja190eF90ICp0eDsKIAotCQkJTEFTU0VSVCAoY29ubi0+a3NuY19wcm90byA9PSAma3NvY2tuYWxfcHJvdG9jb2xfdjN4KTsKKwkJCUxBU1NFUlQoY29ubi0+a3NuY19wcm90byA9PSAma3NvY2tuYWxfcHJvdG9jb2xfdjN4KTsKIAogCQkJLyogdGhyb3cgdGhlbSB0byB0aGUgbGFzdCBjb25uZWN0aW9uLi4uLAogCQkJICogdGhlc2UgVFhzIHdpbGwgYmUgc2VuZCB0byAvZGV2L251bGwgYnkgc2NoZWR1bGVyICovCkBAIC0xNDYwLDEwICsxNDYwLDEwIEBACiAJCXBlZXItPmtzbnBfcHJvdG8gPSBOVUxMOwkvKiByZW5lZ290aWF0ZSBwcm90b2NvbCB2ZXJzaW9uICovCiAJCXBlZXItPmtzbnBfZXJyb3IgPSBlcnJvcjsgICAgICAgLyogc3Rhc2ggbGFzdCBjb25uIGNsb3NlIHJlYXNvbiAqLwogCi0JCWlmIChsaXN0X2VtcHR5ICgmcGVlci0+a3NucF9yb3V0ZXMpKSB7CisJCWlmIChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3JvdXRlcykpIHsKIAkJCS8qIEkndmUganVzdCBjbG9zZWQgbGFzdCBjb25uIGJlbG9uZ2luZyB0byBhCiAJCQkgKiBwZWVyIHdpdGggbm8gcm91dGVzIHRvIGl0ICovCi0JCQlrc29ja25hbF91bmxpbmtfcGVlcl9sb2NrZWQgKHBlZXIpOworCQkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkKHBlZXIpOwogCQl9CiAJfQogCkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogfQogCiB2b2lkCi1rc29ja25hbF9wZWVyX2ZhaWxlZCAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcGVlcl9mYWlsZWQoa3NvY2tfcGVlcl90ICpwZWVyKQogewogCWludAlub3RpZnkgPSAwOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9hbGl2ZSA9IDA7CkBAIC0xNDk5LDcgKzE0OTksNyBAQAogCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCiAJaWYgKG5vdGlmeSkKLQkJbG5ldF9ub3RpZnkgKHBlZXItPmtzbnBfbmksIHBlZXItPmtzbnBfaWQubmlkLCAwLAorCQlsbmV0X25vdGlmeShwZWVyLT5rc25wX25pLCBwZWVyLT5rc25wX2lkLm5pZCwgMCwKIAkJCSAgICAgbGFzdF9hbGl2ZSk7CiB9CiAKQEAgLTE1MDksMTEgKzE1MDksMTEgQEAKIAlrc29ja19wZWVyX3QgICAgICpwZWVyID0gY29ubi0+a3NuY19wZWVyOwogCWtzb2NrX3R4X3QgICAgICAgKnR4OwogCWtzb2NrX3R4X3QgICAgICAgKnRtcDsKLQlMSVNUX0hFQUQgICAgKHpsaXN0KTsKKwlMSVNUX0hFQUQoemxpc3QpOwogCiAJLyogTkIgc2FmZSB0byBmaW5hbGl6ZSBUWHMgYmVjYXVzZSBjbG9zaW5nIG9mIHNvY2tldCB3aWxsCiAJICogYWJvcnQgYWxsIGJ1ZmZlcmVkIGRhdGEgKi8KLQlMQVNTRVJUIChjb25uLT5rc25jX3NvY2sgPT0gTlVMTCk7CisJTEFTU0VSVChjb25uLT5rc25jX3NvY2sgPT0gTlVMTCk7CiAKIAlzcGluX2xvY2soJnBlZXItPmtzbnBfbG9jayk7CiAKQEAgLTE1MjEsNyArMTUyMSw3IEBACiAJCWlmICh0eC0+dHhfY29ubiAhPSBjb25uKQogCQkJY29udGludWU7CiAKLQkJTEFTU0VSVCAodHgtPnR4X21zZy5rc21femNfY29va2llc1swXSAhPSAwKTsKKwkJTEFTU0VSVCh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdICE9IDApOwogCiAJCXR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMF0gPSAwOwogCQl0eC0+dHhfemNfYWJvcnRlZCA9IDE7IC8qIG1hcmsgaXQgYXMgbm90LWFja2VkICovCkBAIC0xNTQwLDcgKzE1NDAsNyBAQAogfQogCiB2b2lkCi1rc29ja25hbF90ZXJtaW5hdGVfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfdGVybWluYXRlX2Nvbm4oa3NvY2tfY29ubl90ICpjb25uKQogewogCS8qIFRoaXMgZ2V0cyBjYWxsZWQgYnkgdGhlIHJlYXBlciAoZ3VhcmFudGVlZCB0aHJlYWQgY29udGV4dCkgdG8KIAkgKiBkaXNlbmdhZ2UgdGhlIHNvY2tldCBmcm9tIGl0cyBjYWxsYmFja3MgYW5kIGNsb3NlIGl0LgpAQCAtMTU2MCwxMyArMTU2MCwxMyBAQAogCiAJaWYgKCFjb25uLT5rc25jX3R4X3NjaGVkdWxlZCAmJgogCSAgICAhbGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCAoJmNvbm4tPmtzbmNfdHhfbGlzdCwKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+a3NuY190eF9saXN0LAogCQkJICAgICAgICZzY2hlZC0+a3NzX3R4X2Nvbm5zKTsKIAkJY29ubi0+a3NuY190eF9zY2hlZHVsZWQgPSAxOwogCQkvKiBleHRyYSByZWYgZm9yIHNjaGVkdWxlciAqLwogCQlrc29ja25hbF9jb25uX2FkZHJlZihjb25uKTsKIAotCQl3YWtlX3VwICgmc2NoZWQtPmtzc193YWl0cSk7CisJCXdha2VfdXAoJnNjaGVkLT5rc3Nfd2FpdHEpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZzY2hlZC0+a3NzX2xvY2spOwpAQCAtMTU4Miw3ICsxNTgyLDcgQEAKIAogCWlmIChwZWVyLT5rc25wX2Vycm9yICE9IDApIHsKIAkJLyogcGVlcidzIGxhc3QgY29ubiBjbG9zZWQgaW4gZXJyb3IgKi8KLQkJTEFTU0VSVCAobGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfY29ubnMpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7CiAJCWZhaWxlZCA9IDE7CiAJCXBlZXItPmtzbnBfZXJyb3IgPSAwOyAgICAgLyogYXZvaWQgbXVsdGlwbGUgbm90aWZpY2F0aW9ucyAqLwogCX0KQEAgLTE2MDEsNyArMTYwMSw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX3F1ZXVlX3pvbWJpZV9jb25uIChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9xdWV1ZV96b21iaWVfY29ubihrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJLyogUXVldWUgdGhlIGNvbm4gZm9yIHRoZSByZWFwZXIgdG8gZGVzdHJveSAqLwogCkBAIC0xNjE1LDIwICsxNjE1LDIwIEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX2Rlc3Ryb3lfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfZGVzdHJveV9jb25uKGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKIAl1bnNpZ25lZCBsb25nICAgICAgbGFzdF9yY3Y7CiAKIAkvKiBGaW5hbCBjb3VwLWRlLWdyYWNlIG9mIHRoZSByZWFwZXIgKi8KLQlDREVCVUcgKERfTkVULCAiY29ubmVjdGlvbiAlcFxuIiwgY29ubik7CisJQ0RFQlVHKERfTkVULCAiY29ubmVjdGlvbiAlcFxuIiwgY29ubik7CiAKLQlMQVNTRVJUIChhdG9taWNfcmVhZCAoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCkgPT0gMCk7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQgKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpID09IDApOwotCUxBU1NFUlQgKGNvbm4tPmtzbmNfc29jayA9PSBOVUxMKTsKLQlMQVNTRVJUIChjb25uLT5rc25jX3JvdXRlID09IE5VTEwpOwotCUxBU1NFUlQgKCFjb25uLT5rc25jX3R4X3NjaGVkdWxlZCk7Ci0JTEFTU0VSVCAoIWNvbm4tPmtzbmNfcnhfc2NoZWR1bGVkKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25uLT5rc25jX3R4X3F1ZXVlKSk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+a3NuY19jb25uX3JlZmNvdW50KSA9PSAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpID09IDApOworCUxBU1NFUlQoY29ubi0+a3NuY19zb2NrID09IE5VTEwpOworCUxBU1NFUlQoY29ubi0+a3NuY19yb3V0ZSA9PSBOVUxMKTsKKwlMQVNTRVJUKCFjb25uLT5rc25jX3R4X3NjaGVkdWxlZCk7CisJTEFTU0VSVCghY29ubi0+a3NuY19yeF9zY2hlZHVsZWQpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkpOwogCiAJLyogY29tcGxldGUgY3VycmVudCByZWNlaXZlIGlmIGFueSAqLwogCXN3aXRjaCAoY29ubi0+a3NuY19yeF9zdGF0ZSkgewpAQCAtMTY0MSw3ICsxNjQxLDcgQEAKIAkJICAgICAgIGNvbm4tPmtzbmNfcnhfbm9iX3dhbnRlZCwgY29ubi0+a3NuY19yeF9ub2JfbGVmdCwKIAkJICAgICAgIGNmc19kdXJhdGlvbl9zZWMoY2ZzX3RpbWVfc3ViKGNmc190aW1lX2N1cnJlbnQoKSwKIAkJCQkJCSAgICAgbGFzdF9yY3YpKSk7Ci0JCWxuZXRfZmluYWxpemUgKGNvbm4tPmtzbmNfcGVlci0+a3NucF9uaSwKKwkJbG5ldF9maW5hbGl6ZShjb25uLT5rc25jX3BlZXItPmtzbnBfbmksCiAJCQkgICAgICAgY29ubi0+a3NuY19jb29raWUsIC1FSU8pOwogCQlicmVhazsKIAljYXNlIFNPQ0tOQUxfUlhfTE5FVF9IRUFERVI6CkBAIC0xNjY1LDMwICsxNjY1LDMwIEBACiAJCQkgICAgICAgJmNvbm4tPmtzbmNfaXBhZGRyLCBjb25uLT5rc25jX3BvcnQpOwogCSAgICAgICBicmVhazsKIAlkZWZhdWx0OgotCQlMQlVHICgpOworCQlMQlVHKCk7CiAJCWJyZWFrOwogCX0KIAogCWtzb2NrbmFsX3BlZXJfZGVjcmVmKGNvbm4tPmtzbmNfcGVlcik7CiAKLQlMSUJDRlNfRlJFRSAoY29ubiwgc2l6ZW9mICgqY29ubikpOworCUxJQkNGU19GUkVFKGNvbm4sIHNpemVvZigqY29ubikpOwogfQogCiBpbnQKLWtzb2NrbmFsX2Nsb3NlX3BlZXJfY29ubnNfbG9ja2VkIChrc29ja19wZWVyX3QgKnBlZXIsIF9fdTMyIGlwYWRkciwgaW50IHdoeSkKK2tzb2NrbmFsX2Nsb3NlX3BlZXJfY29ubnNfbG9ja2VkKGtzb2NrX3BlZXJfdCAqcGVlciwgX191MzIgaXBhZGRyLCBpbnQgd2h5KQogewogCWtzb2NrX2Nvbm5fdCAgICAgICAqY29ubjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAqY3RtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAqY254dDsKIAlpbnQJCSBjb3VudCA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGN0bXAsIGNueHQsICZwZWVyLT5rc25wX2Nvbm5zKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5IChjdG1wLCBrc29ja19jb25uX3QsIGtzbmNfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGN0bXAsIGNueHQsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCWNvbm4gPSBsaXN0X2VudHJ5KGN0bXAsIGtzb2NrX2Nvbm5fdCwga3NuY19saXN0KTsKIAogCQlpZiAoaXBhZGRyID09IDAgfHwKIAkJICAgIGNvbm4tPmtzbmNfaXBhZGRyID09IGlwYWRkcikgewogCQkJY291bnQrKzsKLQkJCWtzb2NrbmFsX2Nsb3NlX2Nvbm5fbG9ja2VkIChjb25uLCB3aHkpOworCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQoY29ubiwgd2h5KTsKIAkJfQogCX0KIApAQCAtMTY5Niw3ICsxNjk2LDcgQEAKIH0KIAogaW50Ci1rc29ja25hbF9jbG9zZV9jb25uX2FuZF9zaWJsaW5ncyAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgd2h5KQora3NvY2tuYWxfY2xvc2VfY29ubl9hbmRfc2libGluZ3Moa3NvY2tfY29ubl90ICpjb25uLCBpbnQgd2h5KQogewogCWtzb2NrX3BlZXJfdCAgICAgKnBlZXIgPSBjb25uLT5rc25jX3BlZXI7CiAJX191MzIJICAgICBpcGFkZHIgPSBjb25uLT5rc25jX2lwYWRkcjsKQEAgLTE3MDQsNyArMTcwNCw3IEBACiAKIAl3cml0ZV9sb2NrX2JoKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCi0JY291bnQgPSBrc29ja25hbF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZCAocGVlciwgaXBhZGRyLCB3aHkpOworCWNvdW50ID0ga3NvY2tuYWxfY2xvc2VfcGVlcl9jb25uc19sb2NrZWQocGVlciwgaXBhZGRyLCB3aHkpOwogCiAJd3JpdGVfdW5sb2NrX2JoKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCkBAIC0xNzEyLDcgKzE3MTIsNyBAQAogfQogCiBpbnQKLWtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zIChsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXBhZGRyKQora3NvY2tuYWxfY2xvc2VfbWF0Y2hpbmdfY29ubnMobG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwYWRkcikKIHsKIAlrc29ja19wZWVyX3QgICAgICAgKnBlZXI7CiAJc3RydWN0IGxpc3RfaGVhZAkgKnB0bXA7CkBAIC0xNzMyLDE2ICsxNzMyLDE2IEBACiAJfQogCiAJZm9yIChpID0gbG87IGkgPD0gaGk7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHB0bXAsIHBueHQsCisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdG1wLCBwbnh0LAogCQkJCQkma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CiAKLQkJCXBlZXIgPSBsaXN0X2VudHJ5IChwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CisJCQlwZWVyID0gbGlzdF9lbnRyeShwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CiAKIAkJCWlmICghKChpZC5uaWQgPT0gTE5FVF9OSURfQU5ZIHx8IGlkLm5pZCA9PSBwZWVyLT5rc25wX2lkLm5pZCkgJiYKIAkJCSAgICAgIChpZC5waWQgPT0gTE5FVF9QSURfQU5ZIHx8IGlkLnBpZCA9PSBwZWVyLT5rc25wX2lkLnBpZCkpKQogCQkJCWNvbnRpbnVlOwogCi0JCQljb3VudCArPSBrc29ja25hbF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZCAocGVlciwgaXBhZGRyLCAwKTsKKwkJCWNvdW50ICs9IGtzb2NrbmFsX2Nsb3NlX3BlZXJfY29ubnNfbG9ja2VkKHBlZXIsIGlwYWRkciwgMCk7CiAJCX0KIAl9CiAKQEAgLTE3NTgsNyArMTc1OCw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX25vdGlmeSAobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBnd19uaWQsIGludCBhbGl2ZSkKK2tzb2NrbmFsX25vdGlmeShsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IGd3X25pZCwgaW50IGFsaXZlKQogewogCS8qIFRoZSByb3V0ZXIgaXMgdGVsbGluZyBtZSBzaGUncyBiZWVuIG5vdGlmaWVkIG9mIGEgY2hhbmdlIGluCiAJICogZ2F0ZXdheSBzdGF0ZS4uLi4gKi8KQEAgLTE3NjcsMTIgKzE3NjcsMTIgQEAKIAlpZC5uaWQgPSBnd19uaWQ7CiAJaWQucGlkID0gTE5FVF9QSURfQU5ZOwogCi0JQ0RFQlVHIChEX05FVCwgImd3ICVzICVzXG4iLCBsaWJjZnNfbmlkMnN0cihnd19uaWQpLAorCUNERUJVRyhEX05FVCwgImd3ICVzICVzXG4iLCBsaWJjZnNfbmlkMnN0cihnd19uaWQpLAogCQlhbGl2ZSA/ICJ1cCIgOiAiZG93biIpOwogCiAJaWYgKCFhbGl2ZSkgewogCQkvKiBJZiB0aGUgZ2F0ZXdheSBjcmFzaGVkLCBjbG9zZSBhbGwgb3BlbiBjb25uZWN0aW9ucy4uLiAqLwotCQlrc29ja25hbF9jbG9zZV9tYXRjaGluZ19jb25ucyAoaWQsIDApOworCQlrc29ja25hbF9jbG9zZV9tYXRjaGluZ19jb25ucyhpZCwgMCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3ODEsNyArMTc4MSw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX3F1ZXJ5IChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgdW5zaWduZWQgbG9uZyAqd2hlbikKK2tzb2NrbmFsX3F1ZXJ5KGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkLCB1bnNpZ25lZCBsb25nICp3aGVuKQogewogCWludAkJY29ubmVjdCA9IDE7CiAJdW5zaWduZWQgbG9uZwkgbGFzdF9hbGl2ZSA9IDA7CkBAIC0xNzk4LDcgKzE3OTgsNyBAQAogCQlrc29ja19jb25uX3QgICAgICpjb25uOwogCQlpbnQJICAgICAgIGJ1Zm5vYjsKIAotCQlsaXN0X2Zvcl9lYWNoICh0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2godG1wLCAmcGVlci0+a3NucF9jb25ucykgewogCQkJY29ubiA9IGxpc3RfZW50cnkodG1wLCBrc29ja19jb25uX3QsIGtzbmNfbGlzdCk7CiAJCQlidWZub2IgPSBjb25uLT5rc25jX3NvY2stPnNrLT5za193bWVtX3F1ZXVlZDsKIApAQCAtMTg0Miw3ICsxODQyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtzb2NrbmFsX3B1c2hfcGVlciAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcHVzaF9wZWVyKGtzb2NrX3BlZXJfdCAqcGVlcikKIHsKIAlpbnQJICAgICAgIGluZGV4OwogCWludAkgICAgICAgaTsKQEAgLTE4NTUsOSArMTg1NSw5IEBACiAJCWkgPSAwOwogCQljb25uID0gTlVMTDsKIAotCQlsaXN0X2Zvcl9lYWNoICh0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2godG1wLCAmcGVlci0+a3NucF9jb25ucykgewogCQkJaWYgKGkrKyA9PSBpbmRleCkgewotCQkJCWNvbm4gPSBsaXN0X2VudHJ5ICh0bXAsIGtzb2NrX2Nvbm5fdCwKKwkJCQljb25uID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX2Nvbm5fdCwKIAkJCQkJCSAgICAgICBrc25jX2xpc3QpOwogCQkJCWtzb2NrbmFsX2Nvbm5fYWRkcmVmKGNvbm4pOwogCQkJCWJyZWFrOwpAQCAtMTg2OSwxMyArMTg2OSwxMyBAQAogCQlpZiAoY29ubiA9PSBOVUxMKQogCQkJYnJlYWs7CiAKLQkJa3NvY2tuYWxfbGliX3B1c2hfY29ubiAoY29ubik7CisJCWtzb2NrbmFsX2xpYl9wdXNoX2Nvbm4oY29ubik7CiAJCWtzb2NrbmFsX2Nvbm5fZGVjcmVmKGNvbm4pOwogCX0KIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfcHVzaCAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCitrc29ja25hbF9wdXNoKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQogewogCWtzb2NrX3BlZXJfdCAgICAgICpwZWVyOwogCXN0cnVjdCBsaXN0X2hlYWQJKnRtcDsKQEAgLTE4OTEsNyArMTg5MSw3IEBACiAJCQlpbmRleCA9IDA7CiAJCQlwZWVyID0gTlVMTDsKIAotCQkJbGlzdF9mb3JfZWFjaCAodG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmtzb2NrbmFsX2RhdGEua3NuZF9wZWVyc1tpXSkgewogCQkJCXBlZXIgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcGVlcl90LAogCQkJCQkJICAgICAga3NucF9saXN0KTsKIApAQCAtMTkxMyw3ICsxOTEzLDcgQEAKIAogCQkJaWYgKHBlZXIgIT0gTlVMTCkgewogCQkJCXJjID0gMDsKLQkJCQlrc29ja25hbF9wdXNoX3BlZXIgKHBlZXIpOworCQkJCWtzb2NrbmFsX3B1c2hfcGVlcihwZWVyKTsKIAkJCQlrc29ja25hbF9wZWVyX2RlY3JlZihwZWVyKTsKIAkJCX0KIAkJfQpAQCAtMjAwNSw3ICsyMDA1LDcgQEAKIAkJfQogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbnh0LCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKLQkJcm91dGUgPSBsaXN0X2VudHJ5ICh0bXAsIGtzb2NrX3JvdXRlX3QsIGtzbnJfbGlzdCk7CisJCXJvdXRlID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3JvdXRlX3QsIGtzbnJfbGlzdCk7CiAKIAkJaWYgKHJvdXRlLT5rc25yX215aXBhZGRyICE9IGlwYWRkcikKIAkJCWNvbnRpbnVlOwpAQCAtMjAyMiw3ICsyMDIyLDcgQEAKIAkJY29ubiA9IGxpc3RfZW50cnkodG1wLCBrc29ja19jb25uX3QsIGtzbmNfbGlzdCk7CiAKIAkJaWYgKGNvbm4tPmtzbmNfbXlpcGFkZHIgPT0gaXBhZGRyKQotCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQgKGNvbm4sIDApOworCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQoY29ubiwgMCk7CiAJfQogfQogCkBAIC0yMTM5LDIxICsyMTM5LDIxIEBACiAJY2FzZSBJT0NfTElCQ0ZTX0FERF9QRUVSOgogCQlpZC5uaWQgPSBkYXRhLT5pb2NfbmlkOwogCQlpZC5waWQgPSBMVVNUUkVfU1JWX0xORVRfUElEOwotCQlyZXR1cm4ga3NvY2tuYWxfYWRkX3BlZXIgKG5pLCBpZCwKKwkJcmV0dXJuIGtzb2NrbmFsX2FkZF9wZWVyKG5pLCBpZCwKIAkJCQkJICBkYXRhLT5pb2NfdTMyWzBdLCAvKiBJUCAqLwogCQkJCQkgIGRhdGEtPmlvY191MzJbMV0pOyAvKiBwb3J0ICovCiAKIAljYXNlIElPQ19MSUJDRlNfREVMX1BFRVI6CiAJCWlkLm5pZCA9IGRhdGEtPmlvY19uaWQ7CiAJCWlkLnBpZCA9IExORVRfUElEX0FOWTsKLQkJcmV0dXJuIGtzb2NrbmFsX2RlbF9wZWVyIChuaSwgaWQsCisJCXJldHVybiBrc29ja25hbF9kZWxfcGVlcihuaSwgaWQsCiAJCQkJCSAgZGF0YS0+aW9jX3UzMlswXSk7IC8qIElQICovCiAKIAljYXNlIElPQ19MSUJDRlNfR0VUX0NPTk46IHsKIAkJaW50CSAgIHR4bWVtOwogCQlpbnQJICAgcnhtZW07CiAJCWludAkgICBuYWdsZTsKLQkJa3NvY2tfY29ubl90ICpjb25uID0ga3NvY2tuYWxfZ2V0X2Nvbm5fYnlfaWR4IChuaSwgZGF0YS0+aW9jX2NvdW50KTsKKwkJa3NvY2tfY29ubl90ICpjb25uID0ga3NvY2tuYWxfZ2V0X2Nvbm5fYnlfaWR4KG5pLCBkYXRhLT5pb2NfY291bnQpOwogCiAJCWlmIChjb25uID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTIxNzcsNyArMjE3Nyw3IEBACiAJY2FzZSBJT0NfTElCQ0ZTX0NMT1NFX0NPTk5FQ1RJT046CiAJCWlkLm5pZCA9IGRhdGEtPmlvY19uaWQ7CiAJCWlkLnBpZCA9IExORVRfUElEX0FOWTsKLQkJcmV0dXJuIGtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zIChpZCwKKwkJcmV0dXJuIGtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zKGlkLAogCQkJCQkJICAgICAgZGF0YS0+aW9jX3UzMlswXSk7CiAKIAljYXNlIElPQ19MSUJDRlNfUkVHSVNURVJfTVlOSUQ6CkBAIC0yMjAyLDkgKzIyMDIsOSBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfZnJlZV9idWZmZXJzICh2b2lkKQora3NvY2tuYWxfZnJlZV9idWZmZXJzKHZvaWQpCiB7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQoJmtzb2NrbmFsX2RhdGEua3NuZF9uYWN0aXZlX3R4cykgPT0gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgma3NvY2tuYWxfZGF0YS5rc25kX25hY3RpdmVfdHhzKSA9PSAwKTsKIAogCWlmIChrc29ja25hbF9kYXRhLmtzbmRfc2NoZWRfaW5mbyAhPSBOVUxMKSB7CiAJCXN0cnVjdCBrc29ja19zY2hlZF9pbmZvCSppbmZvOwpAQCAtMjIyMCw4ICsyMjIwLDggQEAKIAkJY2ZzX3BlcmNwdF9mcmVlKGtzb2NrbmFsX2RhdGEua3NuZF9zY2hlZF9pbmZvKTsKIAl9CiAKLQlMSUJDRlNfRlJFRSAoa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzLAotCQkgICAgIHNpemVvZiAoc3RydWN0IGxpc3RfaGVhZCkgKgorCUxJQkNGU19GUkVFKGtzb2NrbmFsX2RhdGEua3NuZF9wZWVycywKKwkJICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKgogCQkgICAgIGtzb2NrbmFsX2RhdGEua3NuZF9wZWVyX2hhc2hfc2l6ZSk7CiAKIAlzcGluX2xvY2soJmtzb2NrbmFsX2RhdGEua3NuZF90eF9sb2NrKTsKQEAgLTIyNTMsMjUgKzIyNTMsMjUgQEAKIAlpbnQJCQlqOwogCiAJQ0RFQlVHKERfTUFMTE9DLCAiYmVmb3JlIE5BTCBjbGVhbnVwOiBrbWVtICVkXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCAoJmxpYmNmc19rbWVtb3J5KSk7Ci0JTEFTU0VSVCAoa3NvY2tuYWxfZGF0YS5rc25kX25uZXRzID09IDApOworCSAgICAgICBhdG9taWNfcmVhZCgmbGliY2ZzX2ttZW1vcnkpKTsKKwlMQVNTRVJUKGtzb2NrbmFsX2RhdGEua3NuZF9ubmV0cyA9PSAwKTsKIAogCXN3aXRjaCAoa3NvY2tuYWxfZGF0YS5rc25kX2luaXQpIHsKIAlkZWZhdWx0OgotCQlMQVNTRVJUICgwKTsKKwkJTEFTU0VSVCgwKTsKIAogCWNhc2UgU09DS05BTF9JTklUX0FMTDoKIAljYXNlIFNPQ0tOQUxfSU5JVF9EQVRBOgotCQlMQVNTRVJUIChrc29ja25hbF9kYXRhLmtzbmRfcGVlcnMgIT0gTlVMTCk7CisJCUxBU1NFUlQoa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzICE9IE5VTEwpOwogCQlmb3IgKGkgPSAwOyBpIDwga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfcGVlcnNbaV0pKTsKKwkJCUxBU1NFUlQobGlzdF9lbXB0eSgma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSk7CiAJCX0KIAogCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtzb2NrbmFsX2RhdGEua3NuZF9uZXRzKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfZW5vbWVtX2Nvbm5zKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfem9tYmllX2Nvbm5zKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfY29ubmRfY29ubnJlcXMpKTsKLQkJTEFTU0VSVCAobGlzdF9lbXB0eSAoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9yb3V0ZXMpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZrc29ja25hbF9kYXRhLmtzbmRfZW5vbWVtX2Nvbm5zKSk7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgma3NvY2tuYWxfZGF0YS5rc25kX3pvbWJpZV9jb25ucykpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9jb25ucmVxcykpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9yb3V0ZXMpKTsKIAogCQlpZiAoa3NvY2tuYWxfZGF0YS5rc25kX3NjaGVkX2luZm8gIT0gTlVMTCkgewogCQkJY2ZzX3BlcmNwdF9mb3JfZWFjaChpbmZvLCBpLApAQCAtMjMzMiwxMyArMjMzMiwxMyBAQAogCX0KIAogCUNERUJVRyhEX01BTExPQywgImFmdGVyIE5BTCBjbGVhbnVwOiBrbWVtICVkXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCAoJmxpYmNmc19rbWVtb3J5KSk7CisJICAgICAgIGF0b21pY19yZWFkKCZsaWJjZnNfa21lbW9yeSkpOwogCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiAKIHN0YXRpYyBfX3U2NAota3NvY2tuYWxfbmV3X2luY2FybmF0aW9uICh2b2lkKQora3NvY2tuYWxfbmV3X2luY2FybmF0aW9uKHZvaWQpCiB7CiAKIAkvKiBUaGUgaW5jYXJuYXRpb24gbnVtYmVyIGlzIHRoZSB0aW1lIHRoaXMgbW9kdWxlIGxvYWRlZCBhbmQgaXQKQEAgLTIzNTQsMTQgKzIzNTQsMTQgQEAKIAlpbnQJCQlyYzsKIAlpbnQJCQlpOwogCi0JTEFTU0VSVCAoa3NvY2tuYWxfZGF0YS5rc25kX2luaXQgPT0gU09DS05BTF9JTklUX05PVEhJTkcpOwotCUxBU1NFUlQgKGtzb2NrbmFsX2RhdGEua3NuZF9ubmV0cyA9PSAwKTsKKwlMQVNTRVJUKGtzb2NrbmFsX2RhdGEua3NuZF9pbml0ID09IFNPQ0tOQUxfSU5JVF9OT1RISU5HKTsKKwlMQVNTRVJUKGtzb2NrbmFsX2RhdGEua3NuZF9ubmV0cyA9PSAwKTsKIAotCW1lbXNldCAoJmtzb2NrbmFsX2RhdGEsIDAsIHNpemVvZiAoa3NvY2tuYWxfZGF0YSkpOyAvKiB6ZXJvIHBvaW50ZXJzICovCisJbWVtc2V0KCZrc29ja25hbF9kYXRhLCAwLCBzaXplb2Yoa3NvY2tuYWxfZGF0YSkpOyAvKiB6ZXJvIHBvaW50ZXJzICovCiAKIAlrc29ja25hbF9kYXRhLmtzbmRfcGVlcl9oYXNoX3NpemUgPSBTT0NLTkFMX1BFRVJfSEFTSF9TSVpFOwotCUxJQkNGU19BTExPQyAoa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzLAotCQkgICAgICBzaXplb2YgKHN0cnVjdCBsaXN0X2hlYWQpICoKKwlMSUJDRlNfQUxMT0Moa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzLAorCQkgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKgogCQkgICAgICBrc29ja25hbF9kYXRhLmtzbmRfcGVlcl9oYXNoX3NpemUpOwogCWlmIChrc29ja25hbF9kYXRhLmtzbmRfcGVlcnMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMzczLDE4ICsyMzczLDE4IEBACiAJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9uZXRzKTsKIAogCXNwaW5fbG9ja19pbml0KCZrc29ja25hbF9kYXRhLmtzbmRfcmVhcGVyX2xvY2spOwotCUlOSVRfTElTVF9IRUFEICgma3NvY2tuYWxfZGF0YS5rc25kX2Vub21lbV9jb25ucyk7Ci0JSU5JVF9MSVNUX0hFQUQgKCZrc29ja25hbF9kYXRhLmtzbmRfem9tYmllX2Nvbm5zKTsKLQlJTklUX0xJU1RfSEVBRCAoJmtzb2NrbmFsX2RhdGEua3NuZF9kZWF0aHJvd19jb25ucyk7CisJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9lbm9tZW1fY29ubnMpOworCUlOSVRfTElTVF9IRUFEKCZrc29ja25hbF9kYXRhLmtzbmRfem9tYmllX2Nvbm5zKTsKKwlJTklUX0xJU1RfSEVBRCgma3NvY2tuYWxfZGF0YS5rc25kX2RlYXRocm93X2Nvbm5zKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrc29ja25hbF9kYXRhLmtzbmRfcmVhcGVyX3dhaXRxKTsKIAogCXNwaW5fbG9ja19pbml0KCZrc29ja25hbF9kYXRhLmtzbmRfY29ubmRfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQgKCZrc29ja25hbF9kYXRhLmtzbmRfY29ubmRfY29ubnJlcXMpOwotCUlOSVRfTElTVF9IRUFEICgma3NvY2tuYWxfZGF0YS5rc25kX2Nvbm5kX3JvdXRlcyk7CisJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9jb25ucmVxcyk7CisJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9yb3V0ZXMpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF93YWl0cSk7CiAKIAlzcGluX2xvY2tfaW5pdCgma3NvY2tuYWxfZGF0YS5rc25kX3R4X2xvY2spOwotCUlOSVRfTElTVF9IRUFEICgma3NvY2tuYWxfZGF0YS5rc25kX2lkbGVfbm9vcF90eHMpOworCUlOSVRfTElTVF9IRUFEKCZrc29ja25hbF9kYXRhLmtzbmRfaWRsZV9ub29wX3R4cyk7CiAKIAkvKiBOQiBtZW1zZXQgYWJvdmUgemVyb3Mgd2hvbGUgb2Yga3NvY2tuYWxfZGF0YSAqLwogCkBAIC0yNDY1LDcgKzI0NjUsNyBAQAogCiAJcmMgPSBrc29ja25hbF90aHJlYWRfc3RhcnQoa3NvY2tuYWxfcmVhcGVyLCBOVUxMLCAic29ja25hbF9yZWFwZXIiKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzcGF3biBzb2NrbmFsIHJlYXBlcjogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzcGF3biBzb2NrbmFsIHJlYXBlcjogJWRcbiIsIHJjKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC0yNDgwLDcgKzI0ODAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfZGVidWdfcGVlcmhhc2ggKGxuZXRfbmlfdCAqbmkpCitrc29ja25hbF9kZWJ1Z19wZWVyaGFzaChsbmV0X25pX3QgKm5pKQogewogCWtzb2NrX3BlZXJfdAkqcGVlciA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZAkqdG1wOwpAQCAtMjQ4OSw4ICsyNDg5LDggQEAKIAlyZWFkX2xvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaCAodG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7Ci0JCQlwZWVyID0gbGlzdF9lbnRyeSAodG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CisJCWxpc3RfZm9yX2VhY2godG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlwZWVyID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKIAogCQkJaWYgKHBlZXItPmtzbnBfbmkgPT0gbmkpCiAJCQkJYnJlYWs7CkBAIC0yNTEyLDcgKzI1MTIsNyBAQAogCQkgICAgICAhbGlzdF9lbXB0eSgmcGVlci0+a3NucF90eF9xdWV1ZSksCiAJCSAgICAgICFsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3pjX3JlcV9saXN0KSk7CiAKLQkJbGlzdF9mb3JfZWFjaCAodG1wLCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKKwkJbGlzdF9mb3JfZWFjaCh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQkJcm91dGUgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAkJCUNXQVJOKCJSb3V0ZTogcmVmICVkLCBzY2hkICVkLCBjb25uICVkLCBjbnRlZCAlZCwgZGVsICVkXG4iLAogCQkJICAgICAgYXRvbWljX3JlYWQoJnJvdXRlLT5rc25yX3JlZmNvdW50KSwKQEAgLTI1MjAsOSArMjUyMCw5IEBACiAJCQkgICAgICByb3V0ZS0+a3Nucl9jb25uZWN0ZWQsIHJvdXRlLT5rc25yX2RlbGV0ZWQpOwogCQl9CiAKLQkJbGlzdF9mb3JfZWFjaCAodG1wLCAmcGVlci0+a3NucF9jb25ucykgeworCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnBlZXItPmtzbnBfY29ubnMpIHsKIAkJCWNvbm4gPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfY29ubl90LCBrc25jX2xpc3QpOwotCQkJQ1dBUk4gKCJDb25uOiByZWYgJWQsIHNyZWYgJWQsIHQgJWQsIGMgJWRcbiIsCisJCQlDV0FSTigiQ29ubjogcmVmICVkLCBzcmVmICVkLCB0ICVkLCBjICVkXG4iLAogCQkJICAgICAgIGF0b21pY19yZWFkKCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpLAogCQkJICAgICAgIGF0b21pY19yZWFkKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpLAogCQkJICAgICAgIGNvbm4tPmtzbmNfdHlwZSwgY29ubi0+a3NuY19jbG9zaW5nKTsKQEAgLTI1MzQsNyArMjUzNCw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX3NodXRkb3duIChsbmV0X25pX3QgKm5pKQora3NvY2tuYWxfc2h1dGRvd24obG5ldF9uaV90ICpuaSkKIHsKIAlrc29ja19uZXRfdCAgICAgICpuZXQgPSBuaS0+bmlfZGF0YTsKIAlpbnQJICAgICAgIGk7CkBAIC0yNTczLDggKzI1NzMsOCBAQAogCXNwaW5fdW5sb2NrX2JoKCZuZXQtPmtzbm5fbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmV0LT5rc25uX25pbnRlcmZhY2VzOyBpKyspIHsKLQkJTEFTU0VSVCAobmV0LT5rc25uX2ludGVyZmFjZXNbaV0ua3NuaV9ucGVlcnMgPT0gMCk7Ci0JCUxBU1NFUlQgKG5ldC0+a3Nubl9pbnRlcmZhY2VzW2ldLmtzbmlfbnJvdXRlcyA9PSAwKTsKKwkJTEFTU0VSVChuZXQtPmtzbm5faW50ZXJmYWNlc1tpXS5rc25pX25wZWVycyA9PSAwKTsKKwkJTEFTU0VSVChuZXQtPmtzbm5faW50ZXJmYWNlc1tpXS5rc25pX25yb3V0ZXMgPT0gMCk7CiAJfQogCiAJbGlzdF9kZWwoJm5ldC0+a3Nubl9saXN0KTsKQEAgLTI3NTcsMTMgKzI3NTcsMTMgQEAKIH0KIAogaW50Ci1rc29ja25hbF9zdGFydHVwIChsbmV0X25pX3QgKm5pKQora3NvY2tuYWxfc3RhcnR1cChsbmV0X25pX3QgKm5pKQogewogCWtzb2NrX25ldF90ICAqbmV0OwogCWludAkgICByYzsKIAlpbnQJICAgaTsKIAotCUxBU1NFUlQgKG5pLT5uaV9sbmQgPT0gJnRoZV9rc29ja2xuZCk7CisJTEFTU0VSVChuaS0+bmlfbG5kID09ICZ0aGVfa3NvY2tsbmQpOwogCiAJaWYgKGtzb2NrbmFsX2RhdGEua3NuZF9pbml0ID09IFNPQ0tOQUxfSU5JVF9OT1RISU5HKSB7CiAJCXJjID0ga3NvY2tuYWxfYmFzZV9zdGFydHVwKCk7CkBAIC0yODQzLDE5ICsyODQzLDE5IEBACiAKIAogc3RhdGljIHZvaWQgX19leGl0Ci1rc29ja25hbF9tb2R1bGVfZmluaSAodm9pZCkKK2tzb2NrbmFsX21vZHVsZV9maW5pKHZvaWQpCiB7CiAJbG5ldF91bnJlZ2lzdGVyX2xuZCgmdGhlX2tzb2NrbG5kKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWtzb2NrbmFsX21vZHVsZV9pbml0ICh2b2lkKQora3NvY2tuYWxfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgICAgcmM7CiAKIAkvKiBjaGVjayBrc25yX2Nvbm5lY3RlZC9jb25uZWN0aW5nIGZpZWxkIGxhcmdlIGVub3VnaCAqLwotCUNMQVNTRVJUIChTT0NLTE5EX0NPTk5fTlRZUEVTIDw9IDQpOwotCUNMQVNTRVJUIChTT0NLTE5EX0NPTk5fQUNLID09IFNPQ0tMTkRfQ09OTl9CVUxLX0lOKTsKKwlDTEFTU0VSVChTT0NLTE5EX0NPTk5fTlRZUEVTIDw9IDQpOworCUNMQVNTRVJUKFNPQ0tMTkRfQ09OTl9BQ0sgPT0gU09DS0xORF9DT05OX0JVTEtfSU4pOwogCiAJLyogaW5pdGlhbGl6ZSB0aGVfa3NvY2tsbmQgKi8KIAl0aGVfa3NvY2tsbmQubG5kX3R5cGUgICAgID0gU09DS0xORDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuaAppbmRleCAwMzQ4OGQyLi5jNTRjOTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5oCkBAIC00MDYsNyArNDA2LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICoKLWtzb2NrbmFsX25pZDJwZWVybGlzdCAobG5ldF9uaWRfdCBuaWQpCitrc29ja25hbF9uaWQycGVlcmxpc3QobG5ldF9uaWRfdCBuaWQpCiB7CiAJdW5zaWduZWQgaW50IGhhc2ggPSAoKHVuc2lnbmVkIGludCluaWQpICUga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOwogCkBAIC00MTQsMjUgKzQxNCwyNSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLWtzb2NrbmFsX2Nvbm5fYWRkcmVmIChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9jb25uX2FkZHJlZihrc29ja19jb25uX3QgKmNvbm4pCiB7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCkgPiAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpID4gMCk7CiAJYXRvbWljX2luYygmY29ubi0+a3NuY19jb25uX3JlZmNvdW50KTsKIH0KIAotZXh0ZXJuIHZvaWQga3NvY2tuYWxfcXVldWVfem9tYmllX2Nvbm4gKGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gdm9pZCBrc29ja25hbF9xdWV1ZV96b21iaWVfY29ubihrc29ja19jb25uX3QgKmNvbm4pOwogZXh0ZXJuIHZvaWQga3NvY2tuYWxfZmluYWxpemVfemNyZXEoa3NvY2tfY29ubl90ICpjb25uKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9jb25uX2RlY3JlZiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfY29ubl9kZWNyZWYoa3NvY2tfY29ubl90ICpjb25uKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkKCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+a3NuY19jb25uX3JlZmNvdW50KSA+IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpKQogCQlrc29ja25hbF9xdWV1ZV96b21iaWVfY29ubihjb25uKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWtzb2NrbmFsX2Nvbm5zb2NrX2FkZHJlZiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfY29ubnNvY2tfYWRkcmVmKGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKIAlpbnQgICByYyA9IC1FU0hVVERPV047CiAKQEAgLTQ0OCwxMSArNDQ4LDExIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfY29ubnNvY2tfZGVjcmVmIChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9jb25uc29ja19kZWNyZWYoa3NvY2tfY29ubl90ICpjb25uKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+a3NuY19zb2NrX3JlZmNvdW50KSA+IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpKSB7Ci0JCUxBU1NFUlQgKGNvbm4tPmtzbmNfY2xvc2luZyk7CisJCUxBU1NFUlQoY29ubi0+a3NuY19jbG9zaW5nKTsKIAkJbGliY2ZzX3NvY2tfcmVsZWFzZShjb25uLT5rc25jX3NvY2spOwogCQljb25uLT5rc25jX3NvY2sgPSBOVUxMOwogCQlrc29ja25hbF9maW5hbGl6ZV96Y3JlcShjb25uKTsKQEAgLTQ2MCw2MSArNDYwLDYxIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfdHhfYWRkcmVmIChrc29ja190eF90ICp0eCkKK2tzb2NrbmFsX3R4X2FkZHJlZihrc29ja190eF90ICp0eCkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmdHgtPnR4X3JlZmNvdW50KSA+IDApOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnR4LT50eF9yZWZjb3VudCkgPiAwKTsKIAlhdG9taWNfaW5jKCZ0eC0+dHhfcmVmY291bnQpOwogfQogCi1leHRlcm4gdm9pZCBrc29ja25hbF90eF9wcmVwIChrc29ja19jb25uX3QgKiwga3NvY2tfdHhfdCAqdHgpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhfZG9uZSAobG5ldF9uaV90ICpuaSwga3NvY2tfdHhfdCAqdHgpOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhfcHJlcChrc29ja19jb25uX3QgKiwga3NvY2tfdHhfdCAqdHgpOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhfZG9uZShsbmV0X25pX3QgKm5pLCBrc29ja190eF90ICp0eCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfdHhfZGVjcmVmIChrc29ja190eF90ICp0eCkKK2tzb2NrbmFsX3R4X2RlY3JlZihrc29ja190eF90ICp0eCkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmdHgtPnR4X3JlZmNvdW50KSA+IDApOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnR4LT50eF9yZWZjb3VudCkgPiAwKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHgtPnR4X3JlZmNvdW50KSkKIAkJa3NvY2tuYWxfdHhfZG9uZShOVUxMLCB0eCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfcm91dGVfYWRkcmVmIChrc29ja19yb3V0ZV90ICpyb3V0ZSkKK2tzb2NrbmFsX3JvdXRlX2FkZHJlZihrc29ja19yb3V0ZV90ICpyb3V0ZSkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CiAJYXRvbWljX2luYygmcm91dGUtPmtzbnJfcmVmY291bnQpOwogfQogCi1leHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3JvdXRlIChrc29ja19yb3V0ZV90ICpyb3V0ZSk7CitleHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3JvdXRlKGtzb2NrX3JvdXRlX3QgKnJvdXRlKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9yb3V0ZV9kZWNyZWYgKGtzb2NrX3JvdXRlX3QgKnJvdXRlKQora3NvY2tuYWxfcm91dGVfZGVjcmVmKGtzb2NrX3JvdXRlX3QgKnJvdXRlKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkICgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJvdXRlLT5rc25yX3JlZmNvdW50KSkKLQkJa3NvY2tuYWxfZGVzdHJveV9yb3V0ZSAocm91dGUpOworCQlrc29ja25hbF9kZXN0cm95X3JvdXRlKHJvdXRlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9wZWVyX2FkZHJlZiAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcGVlcl9hZGRyZWYoa3NvY2tfcGVlcl90ICpwZWVyKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkICgmcGVlci0+a3NucF9yZWZjb3VudCkgPiAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZwZWVyLT5rc25wX3JlZmNvdW50KSA+IDApOwogCWF0b21pY19pbmMoJnBlZXItPmtzbnBfcmVmY291bnQpOwogfQogCi1leHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3BlZXIgKGtzb2NrX3BlZXJfdCAqcGVlcik7CitleHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3BlZXIoa3NvY2tfcGVlcl90ICpwZWVyKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9wZWVyX2RlY3JlZiAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcGVlcl9kZWNyZWYoa3NvY2tfcGVlcl90ICpwZWVyKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkICgmcGVlci0+a3NucF9yZWZjb3VudCkgPiAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZwZWVyLT5rc25wX3JlZmNvdW50KSA+IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwZWVyLT5rc25wX3JlZmNvdW50KSkKLQkJa3NvY2tuYWxfZGVzdHJveV9wZWVyIChwZWVyKTsKKwkJa3NvY2tuYWxfZGVzdHJveV9wZWVyKHBlZXIpOwogfQogCi1pbnQga3NvY2tuYWxfc3RhcnR1cCAobG5ldF9uaV90ICpuaSk7Ci12b2lkIGtzb2NrbmFsX3NodXRkb3duIChsbmV0X25pX3QgKm5pKTsKK2ludCBrc29ja25hbF9zdGFydHVwKGxuZXRfbmlfdCAqbmkpOwordm9pZCBrc29ja25hbF9zaHV0ZG93bihsbmV0X25pX3QgKm5pKTsKIGludCBrc29ja25hbF9jdGwobG5ldF9uaV90ICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLWludCBrc29ja25hbF9zZW5kIChsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2cpOworaW50IGtzb2NrbmFsX3NlbmQobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnKTsKIGludCBrc29ja25hbF9yZWN2KGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKmxudG1zZywKIAkJICBpbnQgZGVsYXllZCwgdW5zaWduZWQgaW50IG5pb3YsCiAJCSAgc3RydWN0IGt2ZWMgKmlvdiwgbG5ldF9raW92X3QgKmtpb3YsCkBAIC01MjIsNDQgKzUyMiw0NCBAQAogaW50IGtzb2NrbmFsX2FjY2VwdChsbmV0X25pX3QgKm5pLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKIAogZXh0ZXJuIGludCBrc29ja25hbF9hZGRfcGVlcihsbmV0X25pX3QgKm5pLCBsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXAsIGludCBwb3J0KTsKLWV4dGVybiBrc29ja19wZWVyX3QgKmtzb2NrbmFsX2ZpbmRfcGVlcl9sb2NrZWQgKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKTsKLWV4dGVybiBrc29ja19wZWVyX3QgKmtzb2NrbmFsX2ZpbmRfcGVlciAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfcGVlcl9mYWlsZWQgKGtzb2NrX3BlZXJfdCAqcGVlcik7Ci1leHRlcm4gaW50IGtzb2NrbmFsX2NyZWF0ZV9jb25uIChsbmV0X25pX3QgKm5pLCBrc29ja19yb3V0ZV90ICpyb3V0ZSwKK2V4dGVybiBrc29ja19wZWVyX3QgKmtzb2NrbmFsX2ZpbmRfcGVlcl9sb2NrZWQobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpOworZXh0ZXJuIGtzb2NrX3BlZXJfdCAqa3NvY2tuYWxfZmluZF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX3BlZXJfZmFpbGVkKGtzb2NrX3BlZXJfdCAqcGVlcik7CitleHRlcm4gaW50IGtzb2NrbmFsX2NyZWF0ZV9jb25uKGxuZXRfbmlfdCAqbmksIGtzb2NrX3JvdXRlX3QgKnJvdXRlLAogCQkJCSBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgdHlwZSk7Ci1leHRlcm4gdm9pZCBrc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZCAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgd2h5KTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX3Rlcm1pbmF0ZV9jb25uIChrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfZGVzdHJveV9jb25uIChrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIGludCAga3NvY2tuYWxfY2xvc2VfcGVlcl9jb25uc19sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlciwKK2V4dGVybiB2b2lkIGtzb2NrbmFsX2Nsb3NlX2Nvbm5fbG9ja2VkKGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50IHdoeSk7CitleHRlcm4gdm9pZCBrc29ja25hbF90ZXJtaW5hdGVfY29ubihrc29ja19jb25uX3QgKmNvbm4pOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfZGVzdHJveV9jb25uKGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gaW50ICBrc29ja25hbF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIsCiAJCQkJCSAgICAgIF9fdTMyIGlwYWRkciwgaW50IHdoeSk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX2Nsb3NlX2Nvbm5fYW5kX3NpYmxpbmdzIChrc29ja19jb25uX3QgKmNvbm4sIGludCB3aHkpOwotZXh0ZXJuIGludCBrc29ja25hbF9jbG9zZV9tYXRjaGluZ19jb25ucyAobG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwYWRkcik7CitleHRlcm4gaW50IGtzb2NrbmFsX2Nsb3NlX2Nvbm5fYW5kX3NpYmxpbmdzKGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50IHdoeSk7CitleHRlcm4gaW50IGtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zKGxuZXRfcHJvY2Vzc19pZF90IGlkLCBfX3UzMiBpcGFkZHIpOwogZXh0ZXJuIGtzb2NrX2Nvbm5fdCAqa3NvY2tuYWxfZmluZF9jb25uX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIsCiAJCQkJCSAgICAgICBrc29ja190eF90ICp0eCwgaW50IG5vbmJsayk7CiAKIGV4dGVybiBpbnQgIGtzb2NrbmFsX2xhdW5jaF9wYWNrZXQobG5ldF9uaV90ICpuaSwga3NvY2tfdHhfdCAqdHgsCiAJCQkJICAgbG5ldF9wcm9jZXNzX2lkX3QgaWQpOwogZXh0ZXJuIGtzb2NrX3R4X3QgKmtzb2NrbmFsX2FsbG9jX3R4KGludCB0eXBlLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBrc29ja25hbF9mcmVlX3R4IChrc29ja190eF90ICp0eCk7CitleHRlcm4gdm9pZCBrc29ja25hbF9mcmVlX3R4KGtzb2NrX3R4X3QgKnR4KTsKIGV4dGVybiBrc29ja190eF90ICprc29ja25hbF9hbGxvY190eF9ub29wKF9fdTY0IGNvb2tpZSwgaW50IG5vbmJsayk7CiBleHRlcm4gdm9pZCBrc29ja25hbF9uZXh0X3R4X2NhcnJpZXIoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX3F1ZXVlX3R4X2xvY2tlZCAoa3NvY2tfdHhfdCAqdHgsIGtzb2NrX2Nvbm5fdCAqY29ubik7Ci1leHRlcm4gdm9pZCBrc29ja25hbF90eGxpc3RfZG9uZSAobG5ldF9uaV90ICpuaSwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LAorZXh0ZXJuIHZvaWQga3NvY2tuYWxfcXVldWVfdHhfbG9ja2VkKGtzb2NrX3R4X3QgKnR4LCBrc29ja19jb25uX3QgKmNvbm4pOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhsaXN0X2RvbmUobG5ldF9uaV90ICpuaSwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LAogCQkJCSAgaW50IGVycm9yKTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX25vdGlmeSAobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBnd19uaWQsIGludCBhbGl2ZSk7Ci1leHRlcm4gdm9pZCBrc29ja25hbF9xdWVyeSAoc3RydWN0IGxuZXRfbmkgKm5pLCBsbmV0X25pZF90IG5pZCwgdW5zaWduZWQgbG9uZyAqd2hlbik7CitleHRlcm4gdm9pZCBrc29ja25hbF9ub3RpZnkobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBnd19uaWQsIGludCBhbGl2ZSk7CitleHRlcm4gdm9pZCBrc29ja25hbF9xdWVyeShzdHJ1Y3QgbG5ldF9uaSAqbmksIGxuZXRfbmlkX3QgbmlkLCB1bnNpZ25lZCBsb25nICp3aGVuKTsKIGV4dGVybiBpbnQga3NvY2tuYWxfdGhyZWFkX3N0YXJ0KGludCAoKmZuKSh2b2lkICphcmcpLCB2b2lkICphcmcsIGNoYXIgKm5hbWUpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfdGhyZWFkX2ZpbmkgKHZvaWQpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfbGF1bmNoX2FsbF9jb25uZWN0aW9uc19sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlcik7Ci1leHRlcm4ga3NvY2tfcm91dGVfdCAqa3NvY2tuYWxfZmluZF9jb25uZWN0YWJsZV9yb3V0ZV9sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlcik7Ci1leHRlcm4ga3NvY2tfcm91dGVfdCAqa3NvY2tuYWxfZmluZF9jb25uZWN0aW5nX3JvdXRlX2xvY2tlZCAoa3NvY2tfcGVlcl90ICpwZWVyKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbmV3X3BhY2tldCAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgc2tpcCk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX3NjaGVkdWxlciAodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfY29ubmQgKHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX3JlYXBlciAodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfc2VuZF9oZWxsbyAobG5ldF9uaV90ICpuaSwga3NvY2tfY29ubl90ICpjb25uLAorZXh0ZXJuIHZvaWQga3NvY2tuYWxfdGhyZWFkX2Zpbmkodm9pZCk7CitleHRlcm4gdm9pZCBrc29ja25hbF9sYXVuY2hfYWxsX2Nvbm5lY3Rpb25zX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIpOworZXh0ZXJuIGtzb2NrX3JvdXRlX3QgKmtzb2NrbmFsX2ZpbmRfY29ubmVjdGFibGVfcm91dGVfbG9ja2VkKGtzb2NrX3BlZXJfdCAqcGVlcik7CitleHRlcm4ga3NvY2tfcm91dGVfdCAqa3NvY2tuYWxfZmluZF9jb25uZWN0aW5nX3JvdXRlX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIpOworZXh0ZXJuIGludCBrc29ja25hbF9uZXdfcGFja2V0KGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50IHNraXApOworZXh0ZXJuIGludCBrc29ja25hbF9zY2hlZHVsZXIodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfY29ubmQodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfcmVhcGVyKHZvaWQgKmFyZyk7CitleHRlcm4gaW50IGtzb2NrbmFsX3NlbmRfaGVsbG8obG5ldF9uaV90ICpuaSwga3NvY2tfY29ubl90ICpjb25uLAogCQkJCWxuZXRfbmlkX3QgcGVlcl9uaWQsIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbyk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX3JlY3ZfaGVsbG8gKGxuZXRfbmlfdCAqbmksIGtzb2NrX2Nvbm5fdCAqY29ubiwKK2V4dGVybiBpbnQga3NvY2tuYWxfcmVjdl9oZWxsbyhsbmV0X25pX3QgKm5pLCBrc29ja19jb25uX3QgKmNvbm4sCiAJCQkJa3NvY2tfaGVsbG9fbXNnX3QgKmhlbGxvLCBsbmV0X3Byb2Nlc3NfaWRfdCAqaWQsCiAJCQkJX191NjQgKmluY2FybmF0aW9uKTsKIGV4dGVybiB2b2lkIGtzb2NrbmFsX3JlYWRfY2FsbGJhY2soa3NvY2tfY29ubl90ICpjb25uKTsKQEAgLTU2OSwxNSArNTY5LDE1IEBACiBleHRlcm4gdm9pZCBrc29ja25hbF9saWJfc2F2ZV9jYWxsYmFjayhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBrc29ja19jb25uX3QgKmNvbm4pOwogZXh0ZXJuIHZvaWQga3NvY2tuYWxfbGliX3NldF9jYWxsYmFjayhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAga3NvY2tfY29ubl90ICpjb25uKTsKIGV4dGVybiB2b2lkIGtzb2NrbmFsX2xpYl9yZXNldF9jYWxsYmFjayhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfbGliX3B1c2hfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbGliX2dldF9jb25uX2FkZHJzIChrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2V0dXBfc29jayAoc3RydWN0IHNvY2tldCAqc28pOwotZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2VuZF9pb3YgKGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpOwotZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2VuZF9raW92IChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX2xpYl9lYWdlcl9hY2sgKGtzb2NrX2Nvbm5fdCAqY29ubik7Ci1leHRlcm4gaW50IGtzb2NrbmFsX2xpYl9yZWN2X2lvdiAoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbGliX3JlY3Zfa2lvdiAoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbGliX2dldF9jb25uX3R1bmFibGVzIChrc29ja19jb25uX3QgKmNvbm4sIGludCAqdHhtZW0sCitleHRlcm4gdm9pZCBrc29ja25hbF9saWJfcHVzaF9jb25uKGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gaW50IGtzb2NrbmFsX2xpYl9nZXRfY29ubl9hZGRycyhrc29ja19jb25uX3QgKmNvbm4pOworZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2V0dXBfc29jayhzdHJ1Y3Qgc29ja2V0ICpzbyk7CitleHRlcm4gaW50IGtzb2NrbmFsX2xpYl9zZW5kX2lvdihrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KTsKK2V4dGVybiBpbnQga3NvY2tuYWxfbGliX3NlbmRfa2lvdihrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX2xpYl9lYWdlcl9hY2soa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfbGliX3JlY3ZfaW92KGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gaW50IGtzb2NrbmFsX2xpYl9yZWN2X2tpb3Yoa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfbGliX2dldF9jb25uX3R1bmFibGVzKGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50ICp0eG1lbSwKIAkJCQkJICAgaW50ICpyeG1lbSwgaW50ICpuYWdsZSk7CiAKIGV4dGVybiBpbnQga3NvY2tuYWxfdHVuYWJsZXNfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYwppbmRleCA5Mjc2MGZlLi5mYTdhZDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jCkBAIC0xMzc0LDkgKzEzNzQsOSBAQAogCiAJc3Bpbl9sb2NrX2JoKCZzY2hlZC0+a3NzX2xvY2spOwogCi0JcmMgPSAoIWtzb2NrbmFsX2RhdGEua3NuZF9zaHV0dGluZ2Rvd24gJiYKKwlyYyA9ICFrc29ja25hbF9kYXRhLmtzbmRfc2h1dHRpbmdkb3duICYmCiAJICAgICAgbGlzdF9lbXB0eSgmc2NoZWQtPmtzc19yeF9jb25ucykgJiYKLQkgICAgICBsaXN0X2VtcHR5KCZzY2hlZC0+a3NzX3R4X2Nvbm5zKSk7CisJICAgICAgbGlzdF9lbXB0eSgmc2NoZWQtPmtzc190eF9jb25ucyk7CiAKIAlzcGluX3VubG9ja19iaCgmc2NoZWQtPmtzc19sb2NrKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguYwppbmRleCA2NmNjNTA5Li5mNWU4YWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmMKQEAgLTM3LDI0ICszNywyNCBAQAogI2luY2x1ZGUgInNvY2tsbmQuaCIKIAogaW50Ci1rc29ja25hbF9saWJfZ2V0X2Nvbm5fYWRkcnMgKGtzb2NrX2Nvbm5fdCAqY29ubikKK2tzb2NrbmFsX2xpYl9nZXRfY29ubl9hZGRycyhrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJaW50IHJjID0gbGliY2ZzX3NvY2tfZ2V0YWRkcihjb25uLT5rc25jX3NvY2ssIDEsCiAJCQkJICAgICAmY29ubi0+a3NuY19pcGFkZHIsCiAJCQkJICAgICAmY29ubi0+a3NuY19wb3J0KTsKIAogCS8qIERpZG4ndCBuZWVkIHRoZSB7Z2V0LHB1dH1jb25uc29jayBkYW5jZSB0byBkZXJlZiBrc25jX3NvY2suLi4gKi8KLQlMQVNTRVJUICghY29ubi0+a3NuY19jbG9zaW5nKTsKKwlMQVNTRVJUKCFjb25uLT5rc25jX2Nsb3NpbmcpOwogCiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiRXJyb3IgJWQgZ2V0dGluZyBzb2NrIHBlZXIgSVBcbiIsIHJjKTsKKwkJQ0VSUk9SKCJFcnJvciAlZCBnZXR0aW5nIHNvY2sgcGVlciBJUFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJcmMgPSBsaWJjZnNfc29ja19nZXRhZGRyKGNvbm4tPmtzbmNfc29jaywgMCwKIAkJCQkgJmNvbm4tPmtzbmNfbXlpcGFkZHIsIE5VTEwpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUNFUlJPUiAoIkVycm9yICVkIGdldHRpbmcgc29jayBsb2NhbCBJUFxuIiwgcmMpOworCQlDRVJST1IoIkVycm9yICVkIGdldHRpbmcgc29jayBsb2NhbCBJUFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC03NSw3ICs3NSw3IEBACiB9CiAKIGludAota3NvY2tuYWxfbGliX3NlbmRfaW92IChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KQora3NvY2tuYWxfbGliX3NlbmRfaW92KGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpCiB7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlpbnQJICAgIG5vYjsKQEAgLTExNyw3ICsxMTcsNyBAQAogfQogCiBpbnQKLWtzb2NrbmFsX2xpYl9zZW5kX2tpb3YgKGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpCitrc29ja25hbF9saWJfc2VuZF9raW92KGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpCiB7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlsbmV0X2tpb3ZfdCAgICpraW92ID0gdHgtPnR4X2tpb3Y7CkBAIC0xMjUsNyArMTI1LDcgQEAKIAlpbnQJICAgIG5vYjsKIAogCS8qIE5vdCBOT09QIG1lc3NhZ2UgKi8KLQlMQVNTRVJUICh0eC0+dHhfbG5ldG1zZyAhPSBOVUxMKTsKKwlMQVNTRVJUKHR4LT50eF9sbmV0bXNnICE9IE5VTEwpOwogCiAJLyogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwogCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuICovCkBAIC0xODUsNyArMTg1LDcgQEAKIH0KIAogdm9pZAota3NvY2tuYWxfbGliX2VhZ2VyX2FjayAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfbGliX2VhZ2VyX2Fjayhrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJaW50CSAgICBvcHQgPSAxOwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBjb25uLT5rc25jX3NvY2s7CkBAIC0xOTYsMTEgKzE5NiwxMSBAQAogCSAqIHBlZXIuICovCiAKIAlrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfUVVJQ0tBQ0ssCi0JCQkgICAgICAgKGNoYXIgKikmb3B0LCBzaXplb2YgKG9wdCkpOworCQkJICAgICAgIChjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOwogfQogCiBpbnQKLWtzb2NrbmFsX2xpYl9yZWN2X2lvdiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfbGliX3JlY3ZfaW92KGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKICNpZiBTT0NLTkFMX1NJTkdMRV9GUkFHX1JYCiAJc3RydWN0IGt2ZWMgIHNjcmF0Y2g7CkBAIC0yMjMsMTMgKzIyMywxMyBAQAogCiAJLyogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwogCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuICovCi0JTEFTU0VSVCAobmlvdiA+IDApOworCUxBU1NFUlQobmlvdiA+IDApOwogCiAJZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykgewogCQlzY3JhdGNoaW92W2ldID0gaW92W2ldOwogCQlub2IgKz0gc2NyYXRjaGlvdltpXS5pb3ZfbGVuOwogCX0KLQlMQVNTRVJUIChub2IgPD0gY29ubi0+a3NuY19yeF9ub2Jfd2FudGVkKTsKKwlMQVNTRVJUKG5vYiA8PSBjb25uLT5rc25jX3J4X25vYl93YW50ZWQpOwogCiAJcmMgPSBrZXJuZWxfcmVjdm1zZyhjb25uLT5rc25jX3NvY2ssICZtc2csCiAJCXNjcmF0Y2hpb3YsIG5pb3YsIG5vYiwgTVNHX0RPTlRXQUlUKTsKQEAgLTI0Myw3ICsyNDMsNyBAQAogCWlmIChzYXZlZF9jc3VtICE9IDApIHsKIAkJLyogYWNjdW11bGF0ZSBjaGVja3N1bSAqLwogCQlmb3IgKGkgPSAwLCBzdW0gPSByYzsgc3VtID4gMDsgaSsrLCBzdW0gLT0gZnJhZ25vYikgewotCQkJTEFTU0VSVCAoaSA8IG5pb3YpOworCQkJTEFTU0VSVChpIDwgbmlvdik7CiAKIAkJCWZyYWdub2IgPSBpb3ZbaV0uaW92X2xlbjsKIAkJCWlmIChmcmFnbm9iID4gc3VtKQpAQCAtMjc4LDcgKzI3OCw3IEBACiAJaWYgKCEqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19yZWN2IHx8IHBhZ2VzID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JTEFTU0VSVCAobmlvdiA8PSBMTkVUX01BWF9JT1YpOworCUxBU1NFUlQobmlvdiA8PSBMTkVUX01BWF9JT1YpOwogCiAJaWYgKG5pb3YgPCAyIHx8CiAJICAgIG5pb3YgPCAqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19yZWN2X21pbl9uZnJhZ3MpCkBAIC0zMDQsNyArMzA0LDcgQEAKIH0KIAogaW50Ci1rc29ja25hbF9saWJfcmVjdl9raW92IChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9saWJfcmVjdl9raW92KGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKICNpZiBTT0NLTkFMX1NJTkdMRV9GUkFHX1JYIHx8ICFTT0NLTkFMX1JJU0tfS01BUF9ERUFETE9DSwogCXN0cnVjdCBrdmVjICAgc2NyYXRjaDsKQEAgLTM0OCwxNCArMzQ4LDE0IEBACiAJCW4gPSBuaW92OwogCX0KIAotCUxBU1NFUlQgKG5vYiA8PSBjb25uLT5rc25jX3J4X25vYl93YW50ZWQpOworCUxBU1NFUlQobm9iIDw9IGNvbm4tPmtzbmNfcnhfbm9iX3dhbnRlZCk7CiAKIAlyYyA9IGtlcm5lbF9yZWN2bXNnKGNvbm4tPmtzbmNfc29jaywgJm1zZywKIAkJCShzdHJ1Y3Qga3ZlYyAqKXNjcmF0Y2hpb3YsIG4sIG5vYiwgTVNHX0RPTlRXQUlUKTsKIAogCWlmIChjb25uLT5rc25jX21zZy5rc21fY3N1bSAhPSAwKSB7CiAJCWZvciAoaSA9IDAsIHN1bSA9IHJjOyBzdW0gPiAwOyBpKyssIHN1bSAtPSBmcmFnbm9iKSB7Ci0JCQlMQVNTRVJUIChpIDwgbmlvdik7CisJCQlMQVNTRVJUKGkgPCBuaW92KTsKIAogCQkJLyogRGFuZyEgaGF2ZSB0byBrbWFwIGFnYWluIGJlY2F1c2UgSSBoYXZlIG5vd2hlcmUgdG8gc3Rhc2ggdGhlCiAJCQkgKiBtYXBwZWQgYWRkcmVzcy4gIEJ1dCBieSBkb2luZyBpdCB3aGlsZSB0aGUgcGFnZSBpcyBzdGlsbApAQCAtNDIzLDcgKzQyMyw3IEBACiB9CiAKIGludAota3NvY2tuYWxfbGliX2dldF9jb25uX3R1bmFibGVzIChrc29ja19jb25uX3QgKmNvbm4sIGludCAqdHhtZW0sIGludCAqcnhtZW0sIGludCAqbmFnbGUpCitrc29ja25hbF9saWJfZ2V0X2Nvbm5fdHVuYWJsZXMoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgKnR4bWVtLCBpbnQgKnJ4bWVtLCBpbnQgKm5hZ2xlKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBjb25uLT5rc25jX3NvY2s7CiAJaW50CSAgICBsZW47CkBAIC00MzEsNyArNDMxLDcgQEAKIAogCXJjID0ga3NvY2tuYWxfY29ubnNvY2tfYWRkcmVmKGNvbm4pOwogCWlmIChyYyAhPSAwKSB7Ci0JCUxBU1NFUlQgKGNvbm4tPmtzbmNfY2xvc2luZyk7CisJCUxBU1NFUlQoY29ubi0+a3NuY19jbG9zaW5nKTsKIAkJKnR4bWVtID0gKnJ4bWVtID0gKm5hZ2xlID0gMDsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQpAQCAtNDU0LDcgKzQ1NCw3IEBACiB9CiAKIGludAota3NvY2tuYWxfbGliX3NldHVwX3NvY2sgKHN0cnVjdCBzb2NrZXQgKnNvY2spCitrc29ja25hbF9saWJfc2V0dXBfc29jayhzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewogCWludAkgICAgIHJjOwogCWludAkgICAgIG9wdGlvbjsKQEAgLTQ3MywxNyArNDczLDE3IEBACiAJbGluZ2VyLmxfbGluZ2VyID0gMDsKIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fTElOR0VSLAotCQkJICAgICAgKGNoYXIgKikmbGluZ2VyLCBzaXplb2YgKGxpbmdlcikpOworCQkJICAgICAgKGNoYXIgKikmbGluZ2VyLCBzaXplb2YobGluZ2VyKSk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2V0IFNPX0xJTkdFUjogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgU09fTElOR0VSOiAlZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJb3B0aW9uID0gLTE7CiAJcmMgPSBrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfTElOR0VSMiwKLQkJCQkgICAgKGNoYXIgKikmb3B0aW9uLCBzaXplb2YgKG9wdGlvbikpOworCQkJCSAgICAoY2hhciAqKSZvcHRpb24sIHNpemVvZihvcHRpb24pKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzZXQgU09fTElOR0VSMjogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgU09fTElOR0VSMjogJWRcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtNDkxLDkgKzQ5MSw5IEBACiAJCW9wdGlvbiA9IDE7CiAKIAkJcmMgPSBrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwKLQkJCQkJICAgIChjaGFyICopJm9wdGlvbiwgc2l6ZW9mIChvcHRpb24pKTsKKwkJCQkJICAgIChjaGFyICopJm9wdGlvbiwgc2l6ZW9mKG9wdGlvbikpOwogCQlpZiAocmMgIT0gMCkgewotCQkJQ0VSUk9SICgiQ2FuJ3QgZGlzYWJsZSBuYWdsZTogJWRcbiIsIHJjKTsKKwkJCUNFUlJPUigiQ2FuJ3QgZGlzYWJsZSBuYWdsZTogJWRcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQogCX0KQEAgLTUwMiw3ICs1MDIsNyBAQAogCQkJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3R4X2J1ZmZlcl9zaXplLAogCQkJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3J4X2J1ZmZlcl9zaXplKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzZXQgYnVmZmVyIHR4ICVkLCByeCAlZCBidWZmZXJzOiAlZFxuIiwKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgYnVmZmVyIHR4ICVkLCByeCAlZCBidWZmZXJzOiAlZFxuIiwKIAkJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3R4X2J1ZmZlcl9zaXplLAogCQkJKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfcnhfYnVmZmVyX3NpemUsIHJjKTsKIAkJcmV0dXJuIHJjOwpAQCAtNTE5LDkgKzUxOSw5IEBACiAKIAlvcHRpb24gPSAoZG9fa2VlcGFsaXZlID8gMSA6IDApOwogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLAotCQkJICAgICAgKGNoYXIgKikmb3B0aW9uLCBzaXplb2YgKG9wdGlvbikpOworCQkJICAgICAgKGNoYXIgKikmb3B0aW9uLCBzaXplb2Yob3B0aW9uKSk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2V0IFNPX0tFRVBBTElWRTogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgU09fS0VFUEFMSVZFOiAlZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC01MjksMjMgKzUyOSwyMyBAQAogCQlyZXR1cm4gMDsKIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RDUCwgVENQX0tFRVBJRExFLAotCQkJCSAgICAoY2hhciAqKSZrZWVwX2lkbGUsIHNpemVvZiAoa2VlcF9pZGxlKSk7CisJCQkJICAgIChjaGFyICopJmtlZXBfaWRsZSwgc2l6ZW9mKGtlZXBfaWRsZSkpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUNFUlJPUiAoIkNhbid0IHNldCBUQ1BfS0VFUElETEU6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiQ2FuJ3Qgc2V0IFRDUF9LRUVQSURMRTogJWRcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RDUCwgVENQX0tFRVBJTlRWTCwKLQkJCQkgICAgKGNoYXIgKikma2VlcF9pbnR2bCwgc2l6ZW9mIChrZWVwX2ludHZsKSk7CisJCQkJICAgIChjaGFyICopJmtlZXBfaW50dmwsIHNpemVvZihrZWVwX2ludHZsKSk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2V0IFRDUF9LRUVQSU5UVkw6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiQ2FuJ3Qgc2V0IFRDUF9LRUVQSU5UVkw6ICVkXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKIAlyYyA9IGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIFNPTF9UQ1AsIFRDUF9LRUVQQ05ULAotCQkJCSAgICAoY2hhciAqKSZrZWVwX2NvdW50LCBzaXplb2YgKGtlZXBfY291bnQpKTsKKwkJCQkgICAgKGNoYXIgKikma2VlcF9jb3VudCwgc2l6ZW9mKGtlZXBfY291bnQpKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzZXQgVENQX0tFRVBDTlQ6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiQ2FuJ3Qgc2V0IFRDUF9LRUVQQ05UOiAlZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC01NTMsNyArNTUzLDcgQEAKIH0KIAogdm9pZAota3NvY2tuYWxfbGliX3B1c2hfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfbGliX3B1c2hfY29ubihrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJc3RydWN0IHNvY2sgICAgKnNrOwogCXN0cnVjdCB0Y3Bfc29jayAqdHA7CkBAIC01NjgsMjkgKzU2OCwyOSBAQAogCXNrID0gY29ubi0+a3NuY19zb2NrLT5zazsKIAl0cCA9IHRjcF9zayhzayk7CiAKLQlsb2NrX3NvY2sgKHNrKTsKKwlsb2NrX3NvY2soc2spOwogCW5vbmFnbGUgPSB0cC0+bm9uYWdsZTsKIAl0cC0+bm9uYWdsZSA9IDE7Ci0JcmVsZWFzZV9zb2NrIChzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoY29ubi0+a3NuY19zb2NrLCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwKLQkJCQkgICAgICAoY2hhciAqKSZ2YWwsIHNpemVvZiAodmFsKSk7Ci0JTEFTU0VSVCAocmMgPT0gMCk7CisJCQkJICAgICAgKGNoYXIgKikmdmFsLCBzaXplb2YodmFsKSk7CisJTEFTU0VSVChyYyA9PSAwKTsKIAotCWxvY2tfc29jayAoc2spOworCWxvY2tfc29jayhzayk7CiAJdHAtPm5vbmFnbGUgPSBub25hZ2xlOwotCXJlbGVhc2Vfc29jayAoc2spOworCXJlbGVhc2Vfc29jayhzayk7CiAKIAlrc29ja25hbF9jb25uc29ja19kZWNyZWYoY29ubik7CiB9CiAKLWV4dGVybiB2b2lkIGtzb2NrbmFsX3JlYWRfY2FsbGJhY2sgKGtzb2NrX2Nvbm5fdCAqY29ubik7Ci1leHRlcm4gdm9pZCBrc29ja25hbF93cml0ZV9jYWxsYmFjayAoa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX3JlYWRfY2FsbGJhY2soa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX3dyaXRlX2NhbGxiYWNrKGtzb2NrX2Nvbm5fdCAqY29ubik7CiAvKgogICogc29ja2V0IGNhbGwgYmFjayBpbiBMaW51eAogICovCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfZGF0YV9yZWFkeSAoc3RydWN0IHNvY2sgKnNrKQora3NvY2tuYWxfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJa3NvY2tfY29ubl90ICAqY29ubjsKIApAQCAtNjAwLDggKzYwMCw4IEBACiAKIAljb25uID0gc2stPnNrX3VzZXJfZGF0YTsKIAlpZiAoY29ubiA9PSBOVUxMKSB7CSAgICAgLyogcmFjZWQgd2l0aCBrc29ja25hbF90ZXJtaW5hdGVfY29ubiAqLwotCQlMQVNTRVJUIChzay0+c2tfZGF0YV9yZWFkeSAhPSAma3NvY2tuYWxfZGF0YV9yZWFkeSk7Ci0JCXNrLT5za19kYXRhX3JlYWR5IChzayk7CisJCUxBU1NFUlQoc2stPnNrX2RhdGFfcmVhZHkgIT0gJmtzb2NrbmFsX2RhdGFfcmVhZHkpOworCQlzay0+c2tfZGF0YV9yZWFkeShzayk7CiAJfSBlbHNlCiAJCWtzb2NrbmFsX3JlYWRfY2FsbGJhY2soY29ubik7CiAKQEAgLTYwOSw3ICs2MDksNyBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfd3JpdGVfc3BhY2UgKHN0cnVjdCBzb2NrICpzaykKK2tzb2NrbmFsX3dyaXRlX3NwYWNlKHN0cnVjdCBzb2NrICpzaykKIHsKIAlrc29ja19jb25uX3QgICpjb25uOwogCWludAkgICAgd3NwYWNlOwpAQCAtNjI5LDEyICs2MjksMTIgQEAKIAkJCQkgICAgICAiIHJlYWR5IiA6ICIgYmxvY2tlZCIpLAogCSAgICAgICAoY29ubiA9PSBOVUxMKSA/ICIiIDogKGNvbm4tPmtzbmNfdHhfc2NoZWR1bGVkID8KIAkJCQkgICAgICAiIHNjaGVkdWxlZCIgOiAiIGlkbGUiKSwKLQkgICAgICAgKGNvbm4gPT0gTlVMTCkgPyAiIiA6IChsaXN0X2VtcHR5ICgmY29ubi0+a3NuY190eF9xdWV1ZSkgPworCSAgICAgICAoY29ubiA9PSBOVUxMKSA/ICIiIDogKGxpc3RfZW1wdHkoJmNvbm4tPmtzbmNfdHhfcXVldWUpID8KIAkJCQkgICAgICAiIGVtcHR5IiA6ICIgcXVldWVkIikpOwogCiAJaWYgKGNvbm4gPT0gTlVMTCkgewkgICAgIC8qIHJhY2VkIHdpdGgga3NvY2tuYWxfdGVybWluYXRlX2Nvbm4gKi8KLQkJTEFTU0VSVCAoc2stPnNrX3dyaXRlX3NwYWNlICE9ICZrc29ja25hbF93cml0ZV9zcGFjZSk7Ci0JCXNrLT5za193cml0ZV9zcGFjZSAoc2spOworCQlMQVNTRVJUKHNrLT5za193cml0ZV9zcGFjZSAhPSAma3NvY2tuYWxfd3JpdGVfc3BhY2UpOworCQlzay0+c2tfd3JpdGVfc3BhY2Uoc2spOwogCiAJCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCQlyZXR1cm47CkBAIC02NDcsNyArNjQ3LDcgQEAKIAkJICogRU5PTUVNIGNoZWNrIGluIGtzb2NrbmFsX3RyYW5zbWl0IGlzIHJhY2UtZnJlZSAodGhpbmsgYWJvdXQKIAkJICogaXQpLiAqLwogCi0JCWNsZWFyX2JpdCAoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQljbGVhcl9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwogCX0KIAogCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmgKaW5kZXggN2E3OTNkMi4uZjU1NjM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5oCkBAIC01MCw4ICs1MCw4IEBACiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9tb2RwYXJhbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbW9kcGFyYW1zLmMKaW5kZXggNjZkNzhjOS4uODZiODhkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9tb2RwYXJhbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX21vZHBhcmFtcy5jCkBAIC03Miw3ICs3Miw3IEBACiBtb2R1bGVfcGFyYW0odHlwZWRfY29ubnMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHR5cGVkX2Nvbm5zLCAidXNlIGRpZmZlcmVudCBzb2NrZXRzIGZvciBidWxrIik7CiAKLXN0YXRpYyBpbnQgbWluX2J1bGsgPSAoMTw8MTApOworc3RhdGljIGludCBtaW5fYnVsayA9IDE8PDEwOwogbW9kdWxlX3BhcmFtKG1pbl9idWxrLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhtaW5fYnVsaywgInNtYWxsZXN0ICdsYXJnZScgbWVzc2FnZSIpOwogCkBAIC0xMjIsNyArMTIyLDcgQEAKIG1vZHVsZV9wYXJhbShub25ibGtfemNhY2ssIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vbmJsa196Y2FjaywgImFsd2F5cyBzZW5kIFpDLUFDSyBvbiBub24tYmxvY2tpbmcgY29ubmVjdGlvbiIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHpjX21pbl9wYXlsb2FkID0gKDE2IDw8IDEwKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgemNfbWluX3BheWxvYWQgPSAxNiA8PCAxMDsKIG1vZHVsZV9wYXJhbSh6Y19taW5fcGF5bG9hZCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoemNfbWluX3BheWxvYWQsICJtaW5pbXVtIHBheWxvYWQgc2l6ZSB0byB6ZXJvIGNvcHkiKTsKIApAQCAtMTgyLDcgKzE4Miw3IEBACiAjZW5kaWYKIAogCWlmICgqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19taW5fcGF5bG9hZCA8ICgyIDw8IDEwKSkKLQkJKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfemNfbWluX3BheWxvYWQgPSAoMiA8PCAxMCk7CisJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3pjX21pbl9wYXlsb2FkID0gMiA8PCAxMDsKIAogCXJldHVybiAwOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYwppbmRleCBiMmY4OGViLi44NTk2NTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX3Byb3RvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9wcm90by5jCkBAIC01NSw4ICs1NSw4IEBACiAJa3NvY2tfdHhfdCAgICAgKnR4ID0gY29ubi0+a3NuY190eF9jYXJyaWVyOwogCiAJLyogQ2FsbGVkIGhvbGRpbmcgQkggbG9jazogY29ubi0+a3NuY19zY2hlZHVsZXItPmtzc19sb2NrICovCi0JTEFTU0VSVCAoIWxpc3RfZW1wdHkoJmNvbm4tPmtzbmNfdHhfcXVldWUpKTsKLQlMQVNTRVJUICh0eCAhPSBOVUxMKTsKKwlMQVNTRVJUKCFsaXN0X2VtcHR5KCZjb25uLT5rc25jX3R4X3F1ZXVlKSk7CisJTEFTU0VSVCh0eCAhPSBOVUxMKTsKIAogCS8qIE5leHQgVFggdGhhdCBjYW4gY2FycnkgWkMtQUNLIG9yIExOZXQgbWVzc2FnZSAqLwogCWlmICh0eC0+dHhfbGlzdC5uZXh0ID09ICZjb25uLT5rc25jX3R4X3F1ZXVlKSB7CkBAIC02NSw3ICs2NSw3IEBACiAJfSBlbHNlIHsKIAkJY29ubi0+a3NuY190eF9jYXJyaWVyID0gbGlzdF9lbnRyeSh0eC0+dHhfbGlzdC5uZXh0LAogCQkJCQkJICAgICAgIGtzb2NrX3R4X3QsIHR4X2xpc3QpOwotCQlMQVNTRVJUIChjb25uLT5rc25jX3R4X2NhcnJpZXItPnR4X21zZy5rc21fdHlwZSA9PSB0eC0+dHhfbXNnLmtzbV90eXBlKTsKKwkJTEFTU0VSVChjb25uLT5rc25jX3R4X2NhcnJpZXItPnR4X21zZy5rc21fdHlwZSA9PSB0eC0+dHhfbXNnLmtzbV90eXBlKTsKIAl9CiB9CiAKQEAgLTc1LDcgKzc1LDcgQEAKIHsKIAlrc29ja190eF90ICp0eCA9IGNvbm4tPmtzbmNfdHhfY2FycmllcjsKIAotCUxBU1NFUlQgKHR4X2FjayA9PSBOVUxMIHx8CisJTEFTU0VSVCh0eF9hY2sgPT0gTlVMTCB8fAogCQkgdHhfYWNrLT50eF9tc2cua3NtX3R5cGUgPT0gS1NPQ0tfTVNHX05PT1ApOwogCiAJLyoKQEAgLTEzOSw3ICsxMzksNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlMQVNTRVJUICh0eC0+dHhfbXNnLmtzbV90eXBlID09IEtTT0NLX01TR19OT09QKTsKKwlMQVNTRVJUKHR4LT50eF9tc2cua3NtX3R5cGUgPT0gS1NPQ0tfTVNHX05PT1ApOwogCiAJLyogVGhlcmUgaXMgYSBub29wIHpjLWFjayBjYW4gYmUgcGlnZ3liYWNrZWQgKi8KIAl0eF9tc2ctPnR4X21zZy5rc21femNfY29va2llc1sxXSA9IHR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMV07CkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJcmV0dXJuIGtzb2NrbmFsX3F1ZXVlX3R4X3pjYWNrX3YyKGNvbm4sIHR4X2FjaywgY29va2llKTsKIAogCS8qIG5vbi1ibG9ja2luZyBaQy1BQ0sgKHRvIHJvdXRlcikgKi8KLQlMQVNTRVJUICh0eF9hY2sgPT0gTlVMTCB8fAorCUxBU1NFUlQodHhfYWNrID09IE5VTEwgfHwKIAkJIHR4X2Fjay0+dHhfbXNnLmtzbV90eXBlID09IEtTT0NLX01TR19OT09QKTsKIAogCXR4ID0gY29ubi0+a3NuY190eF9jYXJyaWVyOwpAQCAtMTg1LDcgKzE4NSw3IEBACiAKIAlpZiAodHgtPnR4X21zZy5rc21femNfY29va2llc1sxXSA9PSBTT0NLTkFMX0tFRVBBTElWRV9QSU5HKSB7CiAJCS8qIHJlcGxhY2UgdGhlIGtlZXBhbGl2ZSBQSU5HIHdpdGggYSByZWFsIEFDSyAqLwotCQlMQVNTRVJUICh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdID09IDApOworCQlMQVNTRVJUKHR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMF0gPT0gMCk7CiAJCXR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMV0gPSBjb29raWU7CiAJCXJldHVybiAxOwogCX0KQEAgLTIyMCw3ICsyMjAsNyBAQAogCQlfX3U2NCAgIHRtcCA9IDA7CiAKIAkJLyogdHdvIHNlcGFyYXRlZCBjb29raWVzOiAoYSsyLCBhKSBvciAoYSsxLCBhKSAqLwotCQlMQVNTRVJUICh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdIC0KKwkJTEFTU0VSVCh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdIC0KIAkJCSB0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzFdIDw9IDIpOwogCiAJCWlmICh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdIC0KQEAgLTQwOCw3ICs0MDgsNyBAQAogCWtzb2NrX3BlZXJfdCAgICAgICpwZWVyID0gY29ubi0+a3NuY19wZWVyOwogCWtzb2NrX3R4X3QJKnR4OwogCWtzb2NrX3R4X3QJKnRtcDsKLQlMSVNUX0hFQUQgICAgICh6bGlzdCk7CisJTElTVF9IRUFEKHpsaXN0KTsKIAlpbnQJCWNvdW50OwogCiAJaWYgKGNvb2tpZTEgPT0gMCkKQEAgLTQ1MCw3ICs0NTAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1rc29ja25hbF9zZW5kX2hlbGxvX3YxIChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbykKK2tzb2NrbmFsX3NlbmRfaGVsbG9fdjEoa3NvY2tfY29ubl90ICpjb25uLCBrc29ja19oZWxsb19tc2dfdCAqaGVsbG8pCiB7CiAJc3RydWN0IHNvY2tldAkqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlsbmV0X2hkcl90CSAgKmhkcjsKQEAgLTUyNiw3ICs1MjYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1rc29ja25hbF9zZW5kX2hlbGxvX3YyIChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbykKK2tzb2NrbmFsX3NlbmRfaGVsbG9fdjIoa3NvY2tfY29ubl90ICpjb25uLCBrc29ja19oZWxsb19tc2dfdCAqaGVsbG8pCiB7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlpbnQJICAgICByYzsKQEAgLTU4NCwxMiArNTg0LDEyIEBACiAJfQogCiAJcmMgPSBsaWJjZnNfc29ja19yZWFkKHNvY2ssICZoZHItPnNyY19uaWQsCi0JCQkgICAgICBzaXplb2YgKCpoZHIpIC0gb2Zmc2V0b2YgKGxuZXRfaGRyX3QsIHNyY19uaWQpLAorCQkJICAgICAgc2l6ZW9mKCpoZHIpIC0gb2Zmc2V0b2YobG5ldF9oZHJfdCwgc3JjX25pZCksCiAJCQkgICAgICB0aW1lb3V0KTsKIAlpZiAocmMgIT0gMCkgewogCQlDRVJST1IoIkVycm9yICVkIHJlYWRpbmcgcmVzdCBvZiBIRUxMTyBoZHIgZnJvbSAlcEk0aFxuIiwKIAkJCXJjLCAmY29ubi0+a3NuY19pcGFkZHIpOwotCQlMQVNTRVJUIChyYyA8IDAgJiYgcmMgIT0gLUVBTFJFQURZKTsKKwkJTEFTU0VSVChyYyA8IDAgJiYgcmMgIT0gLUVBTFJFQURZKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC02MDIsMTIgKzYwMiwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQloZWxsby0+a3NobV9zcmNfbmlkCSA9IGxlNjRfdG9fY3B1IChoZHItPnNyY19uaWQpOwotCWhlbGxvLT5rc2htX3NyY19waWQJID0gbGUzMl90b19jcHUgKGhkci0+c3JjX3BpZCk7Ci0JaGVsbG8tPmtzaG1fc3JjX2luY2FybmF0aW9uID0gbGU2NF90b19jcHUgKGhkci0+bXNnLmhlbGxvLmluY2FybmF0aW9uKTsKLQloZWxsby0+a3NobV9jdHlwZQkgICA9IGxlMzJfdG9fY3B1IChoZHItPm1zZy5oZWxsby50eXBlKTsKLQloZWxsby0+a3NobV9uaXBzCSAgICA9IGxlMzJfdG9fY3B1IChoZHItPnBheWxvYWRfbGVuZ3RoKSAvCi0JCQkJCSBzaXplb2YgKF9fdTMyKTsKKwloZWxsby0+a3NobV9zcmNfbmlkCSA9IGxlNjRfdG9fY3B1KGhkci0+c3JjX25pZCk7CisJaGVsbG8tPmtzaG1fc3JjX3BpZAkgPSBsZTMyX3RvX2NwdShoZHItPnNyY19waWQpOworCWhlbGxvLT5rc2htX3NyY19pbmNhcm5hdGlvbiA9IGxlNjRfdG9fY3B1KGhkci0+bXNnLmhlbGxvLmluY2FybmF0aW9uKTsKKwloZWxsby0+a3NobV9jdHlwZQkgICA9IGxlMzJfdG9fY3B1KGhkci0+bXNnLmhlbGxvLnR5cGUpOworCWhlbGxvLT5rc2htX25pcHMJICAgID0gbGUzMl90b19jcHUoaGRyLT5wYXlsb2FkX2xlbmd0aCkgLworCQkJCQkgc2l6ZW9mKF9fdTMyKTsKIAogCWlmIChoZWxsby0+a3NobV9uaXBzID4gTE5FVF9NQVhfSU5URVJGQUNFUykgewogCQlDRVJST1IoIkJhZCBuaXBzICVkIGZyb20gaXAgJXBJNGhcbiIsCkBAIC02NDUsNyArNjQ1LDcgQEAKIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfcmVjdl9oZWxsb192MiAoa3NvY2tfY29ubl90ICpjb25uLCBrc29ja19oZWxsb19tc2dfdCAqaGVsbG8sIGludCB0aW1lb3V0KQora3NvY2tuYWxfcmVjdl9oZWxsb192Mihrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbywgaW50IHRpbWVvdXQpCiB7CiAJc3RydWN0IHNvY2tldCAgICpzb2NrID0gY29ubi0+a3NuY19zb2NrOwogCWludAkJcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCmluZGV4IGZhY2ViOTUuLjRhMTRlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCkBAIC02NTAsMTUgKzY1MCwxOSBAQAogCiAJcmVjcyA9IGxuZXRfcmVzX2NvbnRhaW5lcnNfY3JlYXRlKExORVRfQ09PS0lFX1RZUEVfTUUsIExORVRfRkxfTUFYX01FUywKIAkJCQkJICBzaXplb2YobG5ldF9tZV90KSk7Ci0JaWYgKHJlY3MgPT0gTlVMTCkKKwlpZiAocmVjcyA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CisJfQogCiAJdGhlX2xuZXQubG5fbWVfY29udGFpbmVycyA9IHJlY3M7CiAKIAlyZWNzID0gbG5ldF9yZXNfY29udGFpbmVyc19jcmVhdGUoTE5FVF9DT09LSUVfVFlQRV9NRCwgTE5FVF9GTF9NQVhfTURTLAogCQkJCQkgIHNpemVvZihsbmV0X2xpYm1kX3QpKTsKLQlpZiAocmVjcyA9PSBOVUxMKQorCWlmIChyZWNzID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKKwl9CiAKIAl0aGVfbG5ldC5sbl9tZF9jb250YWluZXJzID0gcmVjczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYwppbmRleCBhZjE3MWUyLi4yZGM0YzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYwpAQCAtMzcsMTEgKzM3LDExIEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xORVQKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAvKiB0bXAgc3RydWN0IGZvciBwYXJzaW5nIHJvdXRlcyAqLworc3RydWN0IGxuZXRfdGV4dF9idWZfdCB7CSAgICAvKiB0bXAgc3RydWN0IGZvciBwYXJzaW5nIHJvdXRlcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJIGx0Yl9saXN0OwkvKiBzdGFzaCBvbiBsaXN0cyAqLwogCWludAkJbHRiX3NpemU7CS8qIGFsbG9jYXRlZCBzaXplICovCiAJY2hhcgkgICAgICAgbHRiX3RleHRbMF07ICAgICAvKiB0ZXh0IGJ1ZmZlciAqLwotfSBsbmV0X3RleHRfYnVmX3Q7Cit9OwogCiBzdGF0aWMgaW50IGxuZXRfdGJub2I7CQkJLyogdHJhY2sgdGV4dCBidWYgYWxsb2NhdGlvbiAqLwogI2RlZmluZSBMTkVUX01BWF9URVhUQlVGX05PQiAgICAgKDY0PDwxMCkJLyogYm91bmQgYWxsb2NhdGlvbiAqLwpAQCAtMzY1LDE0ICszNjUsMTQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGxuZXRfdGV4dF9idWZfdCAqCitzdGF0aWMgc3RydWN0IGxuZXRfdGV4dF9idWZfdCAqCiBsbmV0X25ld190ZXh0X2J1ZihpbnQgc3RyX2xlbikKIHsKLQlsbmV0X3RleHRfYnVmX3QgKmx0YjsKKwlzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90ICpsdGI7CiAJaW50CSAgICAgIG5vYjsKIAogCS8qIE5CIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdGVybWluYXRpbmcgMCAqLwotCW5vYiA9IG9mZnNldG9mKGxuZXRfdGV4dF9idWZfdCwgbHRiX3RleHRbc3RyX2xlbiArIDFdKTsKKwlub2IgPSBvZmZzZXRvZihzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfdGV4dFtzdHJfbGVuICsgMV0pOwogCWlmIChub2IgPiBMTkVUX1NJTkdMRV9URVhUQlVGX05PQikgewogCQkvKiBfd2F5XyBjb25zZXJ2YXRpdmUgZm9yICJyb3V0ZSBuZXQgZ2F0ZXdheS4uLiIgKi8KIAkJQ0VSUk9SKCJ0ZXh0IGJ1ZmZlciB0b28gYmlnXG4iKTsKQEAgLTM5NSw3ICszOTUsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbG5ldF9mcmVlX3RleHRfYnVmKGxuZXRfdGV4dF9idWZfdCAqbHRiKQorbG5ldF9mcmVlX3RleHRfYnVmKHN0cnVjdCBsbmV0X3RleHRfYnVmX3QgKmx0YikKIHsKIAlsbmV0X3Ribm9iIC09IGx0Yi0+bHRiX3NpemU7CiAJTElCQ0ZTX0ZSRUUobHRiLCBsdGItPmx0Yl9zaXplKTsKQEAgLTQwNCwxMCArNDA0LDEwIEBACiBzdGF0aWMgdm9pZAogbG5ldF9mcmVlX3RleHRfYnVmcyhzdHJ1Y3QgbGlzdF9oZWFkICp0YnMpCiB7Ci0JbG5ldF90ZXh0X2J1Zl90ICAqbHRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICpsdGI7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkodGJzKSkgewotCQlsdGIgPSBsaXN0X2VudHJ5KHRicy0+bmV4dCwgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CisJCWx0YiA9IGxpc3RfZW50cnkodGJzLT5uZXh0LCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CiAKIAkJbGlzdF9kZWwoJmx0Yi0+bHRiX2xpc3QpOwogCQlsbmV0X2ZyZWVfdGV4dF9idWYobHRiKTsKQEAgLTQyMSw3ICs0MjEsNyBAQAogCWNoYXIJICAgICAqc2VwOwogCWludAkgICAgICAgbm9iOwogCWludAkgICAgICAgaTsKLQlsbmV0X3RleHRfYnVmX3QgICpsdGI7CisJc3RydWN0IGxuZXRfdGV4dF9idWZfdCAgKmx0YjsKIAogCUlOSVRfTElTVF9IRUFEKCZwZW5kaW5nKTsKIApAQCAtNDc5LDcgKzQ3OSw3IEBACiB7CiAJaW50CSAgICAgIGxlbjEgPSAoaW50KShzZXAxIC0gc3RyKTsKIAlpbnQJICAgICAgbGVuMiA9IHN0cmxlbihzZXAyICsgMSk7Ci0JbG5ldF90ZXh0X2J1Zl90ICpsdGI7CisJc3RydWN0IGxuZXRfdGV4dF9idWZfdCAqbHRiOwogCiAJTEFTU0VSVCgqc2VwMSA9PSAnWycpOwogCUxBU1NFUlQoKnNlcDIgPT0gJ10nKTsKQEAgLTUzMiwxNCArNTMyLDE4IEBACiAJCWlmIChlbmRpdGVtID09IHBhcnNlZCkJCS8qIG5vIGVtcHR5IGl0ZW1zICovCiAJCQlnb3RvIGZhaWxlZDsKIAotCQlpZiAoc3NjYW5mKHBhcnNlZCwgIiVkLSVkLyVkJW4iLCAmbG8sICZoaSwgJnN0cmlkZSwgJnNjYW5uZWQpIDwgMykgeworCQlpZiAoc3NjYW5mKHBhcnNlZCwgIiVkLSVkLyVkJW4iLCAmbG8sICZoaSwKKwkJCSAgICZzdHJpZGUsICZzY2FubmVkKSA8IDMpIHsKIAogCQkJaWYgKHNzY2FuZihwYXJzZWQsICIlZC0lZCVuIiwgJmxvLCAmaGksICZzY2FubmVkKSA8IDIpIHsKIAogCQkJCS8qIHNpbXBsZSBzdHJpbmcgZW51bWVyYXRpb24gKi8KLQkJCQlpZiAobG5ldF9leHBhbmQxdGIoJnBlbmRpbmcsIHN0ciwgc2VwLCBzZXAyLAotCQkJCQkJICAgcGFyc2VkLCAoaW50KShlbmRpdGVtIC0gcGFyc2VkKSkgIT0gMCkKKwkJCQlpZiAobG5ldF9leHBhbmQxdGIoCisJCQkJICAgICAmcGVuZGluZywgc3RyLCBzZXAsIHNlcDIsCisJCQkJICAgICBwYXJzZWQsCisJCQkJICAgICAoaW50KShlbmRpdGVtIC0gcGFyc2VkKSkgIT0gMCkgewogCQkJCQlnb3RvIGZhaWxlZDsKKwkJCQl9CiAKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTYzMiw3ICs2MzYsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnRtcDI7CiAJX191MzIJICAgICBuZXQ7CiAJbG5ldF9uaWRfdAluaWQ7Ci0JbG5ldF90ZXh0X2J1Zl90ICAqbHRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICpsdGI7CiAJaW50CSAgICAgICByYzsKIAljaGFyCSAgICAgKnNlcDsKIAljaGFyCSAgICAgKnRva2VuID0gc3RyOwpAQCAtNjg4LDcgKzY5Miw4IEBACiAJCWxpc3RfYWRkX3RhaWwodG1wMSwgdG1wMik7CiAKIAkJd2hpbGUgKHRtcDEgIT0gdG1wMikgewotCQkJbHRiID0gbGlzdF9lbnRyeSh0bXAxLCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKKwkJCWx0YiA9IGxpc3RfZW50cnkodG1wMSwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwKKwkJCQkJIGx0Yl9saXN0KTsKIAogCQkJcmMgPSBsbmV0X3N0cjJ0YnNfZXhwYW5kKHRtcDEtPm5leHQsIGx0Yi0+bHRiX3RleHQpOwogCQkJaWYgKHJjIDwgMCkKQEAgLTcyOCwxMiArNzMzLDEzIEBACiAJTEFTU0VSVCghbGlzdF9lbXB0eSgmZ2F0ZXdheXMpKTsKIAogCWxpc3RfZm9yX2VhY2godG1wMSwgJm5ldHMpIHsKLQkJbHRiID0gbGlzdF9lbnRyeSh0bXAxLCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKKwkJbHRiID0gbGlzdF9lbnRyeSh0bXAxLCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CiAJCW5ldCA9IGxpYmNmc19zdHIybmV0KGx0Yi0+bHRiX3RleHQpOwogCQlMQVNTRVJUKG5ldCAhPSBMTkVUX05JRE5FVChMTkVUX05JRF9BTlkpKTsKIAogCQlsaXN0X2Zvcl9lYWNoKHRtcDIsICZnYXRld2F5cykgewotCQkJbHRiID0gbGlzdF9lbnRyeSh0bXAyLCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKKwkJCWx0YiA9IGxpc3RfZW50cnkodG1wMiwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwKKwkJCQkJIGx0Yl9saXN0KTsKIAkJCW5pZCA9IGxpYmNmc19zdHIybmlkKGx0Yi0+bHRiX3RleHQpOwogCQkJTEFTU0VSVChuaWQgIT0gTE5FVF9OSURfQU5ZKTsKIApAQCAtNzY2LDEwICs3NzIsMTAgQEAKIHN0YXRpYyBpbnQKIGxuZXRfcGFyc2Vfcm91dGVfdGJzKHN0cnVjdCBsaXN0X2hlYWQgKnRicywgaW50ICppbV9hX3JvdXRlcikKIHsKLQlsbmV0X3RleHRfYnVmX3QgICAqbHRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICAqbHRiOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KHRicykpIHsKLQkJbHRiID0gbGlzdF9lbnRyeSh0YnMtPm5leHQsIGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOworCQlsdGIgPSBsaXN0X2VudHJ5KHRicy0+bmV4dCwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOwogCiAJCWlmIChsbmV0X3BhcnNlX3JvdXRlKGx0Yi0+bHRiX3RleHQsIGltX2Ffcm91dGVyKSA8IDApIHsKIAkJCWxuZXRfZnJlZV90ZXh0X2J1ZnModGJzKTsKQEAgLTkwMyw4ICs5MDksOCBAQAogCWludAkgICAgICAgb2Zmc2V0ID0gMDsKIAlpbnQJICAgICAgIG9mZnNldDI7CiAJaW50CSAgICAgICBsZW47Ci0JbG5ldF90ZXh0X2J1Zl90ICAqdGI7Ci0JbG5ldF90ZXh0X2J1Zl90ICAqdGIyOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICp0YjsKKwlzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90ICAqdGIyOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnQ7CiAJY2hhcgkgICAgICpzZXA7CiAJY2hhcgkgICAgICpicmFja2V0OwpAQCAtOTEzLDcgKzkxOSw3IEBACiAJTEFTU0VSVCghbGlzdF9lbXB0eShuZXRzKSk7CiAJTEFTU0VSVChuZXRzLT5uZXh0ID09IG5ldHMtPnByZXYpOyAgICAgLyogc2luZ2xlIGVudHJ5ICovCiAKLQl0YiA9IGxpc3RfZW50cnkobmV0cy0+bmV4dCwgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CisJdGIgPSBsaXN0X2VudHJ5KG5ldHMtPm5leHQsIHN0cnVjdCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKIAogCWZvciAoOzspIHsKIAkJc2VwID0gc3RyY2hyKHRiLT5sdGJfdGV4dCwgJywnKTsKQEAgLTk0OSw3ICs5NTUsNyBAQAogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaCh0LCBuZXRzKSB7Ci0JCQl0YjIgPSBsaXN0X2VudHJ5KHQsIGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOworCQkJdGIyID0gbGlzdF9lbnRyeSh0LCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CiAKIAkJCWlmICh0YjIgPT0gdGIpCiAJCQkJY29udGludWU7CkBAIC05ODgsOCArOTk0LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgY3VycmVudF9uZXRzOwogCXN0cnVjdCBsaXN0X2hlYWQJICp0OwogCXN0cnVjdCBsaXN0X2hlYWQJICp0MjsKLQlsbmV0X3RleHRfYnVmX3QgICAgKnRiOwotCWxuZXRfdGV4dF9idWZfdCAgICAqdGIyOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICAgKnRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICAgKnRiMjsKIAlfX3UzMgkgICAgICAgbmV0MTsKIAlfX3UzMgkgICAgICAgbmV0MjsKIAlpbnQJCSBsZW47CkBAIC0xMDEyLDcgKzEwMTgsNyBAQAogCXJjID0gMDsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcmF3X2VudHJpZXMpKSB7Ci0JCXRiID0gbGlzdF9lbnRyeShyYXdfZW50cmllcy5uZXh0LCBsbmV0X3RleHRfYnVmX3QsCisJCXRiID0gbGlzdF9lbnRyeShyYXdfZW50cmllcy5uZXh0LCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LAogCQkJCSAgICBsdGJfbGlzdCk7CiAKIAkJc3RybmNweShzb3VyY2UsIHRiLT5sdGJfdGV4dCwgc2l6ZW9mKHNvdXJjZSktMSk7CkBAIC0xMDM5LDEyICsxMDQ1LDEyIEBACiAKIAkJZHVwID0gMDsKIAkJbGlzdF9mb3JfZWFjaCh0LCAmY3VycmVudF9uZXRzKSB7Ci0JCQl0YiA9IGxpc3RfZW50cnkodCwgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CisJCQl0YiA9IGxpc3RfZW50cnkodCwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOwogCQkJbmV0MSA9IGxuZXRfbmV0c3BlYzJuZXQodGItPmx0Yl90ZXh0KTsKIAkJCUxBU1NFUlQobmV0MSAhPSBMTkVUX05JRE5FVChMTkVUX05JRF9BTlkpKTsKIAogCQkJbGlzdF9mb3JfZWFjaCh0MiwgJm1hdGNoZWRfbmV0cykgewotCQkJCXRiMiA9IGxpc3RfZW50cnkodDIsIGxuZXRfdGV4dF9idWZfdCwKKwkJCQl0YjIgPSBsaXN0X2VudHJ5KHQyLCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LAogCQkJCQkJICAgICBsdGJfbGlzdCk7CiAJCQkJbmV0MiA9IGxuZXRfbmV0c3BlYzJuZXQodGIyLT5sdGJfdGV4dCk7CiAJCQkJTEFTU0VSVChuZXQyICE9IExORVRfTklETkVUKExORVRfTklEX0FOWSkpOwpAQCAtMTA2NSw3ICsxMDcxLDcgQEAKIAkJfQogCiAJCWxpc3RfZm9yX2VhY2hfc2FmZSh0LCB0MiwgJmN1cnJlbnRfbmV0cykgewotCQkJdGIgPSBsaXN0X2VudHJ5KHQsIGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOworCQkJdGIgPSBsaXN0X2VudHJ5KHQsIHN0cnVjdCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKIAogCQkJbGlzdF9kZWwoJnRiLT5sdGJfbGlzdCk7CiAJCQlsaXN0X2FkZF90YWlsKCZ0Yi0+bHRiX2xpc3QsICZtYXRjaGVkX25ldHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLWVxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYwppbmRleCA4NjNjYzM3Li41NDcwMTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYwpAQCAtODEsOSArODEsOCBAQAogCiAJY291bnQgPSBjZnNfcG93ZXIyX3JvdW5kdXAoY291bnQpOwogCi0JaWYgKGNhbGxiYWNrICE9IExORVRfRVFfSEFORExFUl9OT05FICYmIGNvdW50ICE9IDApIHsKKwlpZiAoY2FsbGJhY2sgIT0gTE5FVF9FUV9IQU5ETEVSX05PTkUgJiYgY291bnQgIT0gMCkKIAkJQ1dBUk4oIkVRIGNhbGxiYWNrIGlzIGd1YXJhbnRlZWQgdG8gZ2V0IGV2ZXJ5IGV2ZW50LCBkbyB5b3Ugc3RpbGwgd2FudCB0byBzZXQgZXFjb3VudCAlZCBmb3IgcG9sbGluZyBldmVudCB3aGljaCB3aWxsIGhhdmUgbG9ja2luZyBvdmVyaGVhZD8gUGxlYXNlIGNvbnRhY3Qgd2l0aCBkZXZlbG9wZXIgdG8gY29uZmlybVxuIiwgY291bnQpOwotCX0KIAogCS8qIGNvdW50IGNhbiBiZSAwIGlmIG9ubHkgbmVlZCBjYWxsYmFjaywgd2UgY2FuIGVsaW1pbmF0ZQogCSAqIG92ZXJoZWFkIG9mIGVucXVldWUgZXZlbnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKaW5kZXggMzIyNWMwNi4uODlkNjYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAJCWxtZC0+bWRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwogCi0JCWlmICgodW1kLT5vcHRpb25zICYgTE5FVF9NRF9NQVhfU0laRSkgIT0gMCAmJiAvKiBtYXggc2l6ZSB1c2VkICovCisJCWlmICgodW1kLT5vcHRpb25zICYgTE5FVF9NRF9NQVhfU0laRSkgIT0gMCAmJiAvKiB1c2UgbWF4IHNpemUgKi8KIAkJICAgICh1bWQtPm1heF9zaXplIDwgMCB8fAogCQkgICAgIHVtZC0+bWF4X3NpemUgPiB0b3RhbF9sZW5ndGgpKSAvKiBpbGxlZ2FsIG1heF9zaXplICovCiAJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tb3ZlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbW92ZS5jCmluZGV4IDBmNTNjNzYuLmMyZmI3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tb3ZlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1vdmUuYwpAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIAlMQVNTRVJUKG1kLT5tZF9vZmZzZXQgPT0gMCk7CiAKIAlybGVuZ3RoID0gaGRyLT5wYXlsb2FkX2xlbmd0aDsKLQltbGVuZ3RoID0gbWluX3QoaW50LCBybGVuZ3RoLCBtZC0+bWRfbGVuZ3RoKTsKKwltbGVuZ3RoID0gbWluX3QodWludCwgcmxlbmd0aCwgbWQtPm1kX2xlbmd0aCk7CiAKIAlpZiAobWxlbmd0aCA8IHJsZW5ndGggJiYKIAkgICAgKG1kLT5tZF9vcHRpb25zICYgTE5FVF9NRF9UUlVOQ0FURSkgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jCmluZGV4IGM5M2FlODUuLjQ1YjU3NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3BlZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9wZWVyLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAogCWNmc19wZXJjcHRfZm9yX2VhY2gocHRhYmxlLCBpLCB0aGVfbG5ldC5sbl9wZWVyX3RhYmxlcykgewogCQloYXNoID0gcHRhYmxlLT5wdF9oYXNoOwotCQlpZiAoaGFzaCA9PSBOVUxMKSAvKiBub3QgaW50aWFsaXplZCAqLworCQlpZiAoaGFzaCA9PSBOVUxMKSAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KIAkJCWJyZWFrOwogCiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmcHRhYmxlLT5wdF9kZWF0aHJvdykpOwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJfQogCiAJY2ZzX3BlcmNwdF9mb3JfZWFjaChwdGFibGUsIGksIHRoZV9sbmV0LmxuX3BlZXJfdGFibGVzKSB7Ci0JCUxJU1RfSEVBRAkoZGVhdGhyb3cpOworCQlMSVNUX0hFQUQoZGVhdGhyb3cpOwogCQlsbmV0X3BlZXJfdAkqbHA7CiAKIAkJbG5ldF9uZXRfbG9jayhpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKaW5kZXggNTJlYzBhYi4uODUxMGJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKQEAgLTEwNyw3ICsxMDcsOCBAQAogfQogCiB2b2lkCi1sbmV0X25vdGlmeV9sb2NrZWQobG5ldF9wZWVyX3QgKmxwLCBpbnQgbm90aWZ5bG5kLCBpbnQgYWxpdmUsIHVuc2lnbmVkIGxvbmcgd2hlbikKK2xuZXRfbm90aWZ5X2xvY2tlZChsbmV0X3BlZXJfdCAqbHAsIGludCBub3RpZnlsbmQsIGludCBhbGl2ZSwKKwkJICAgdW5zaWduZWQgbG9uZyB3aGVuKQogewogCWlmICh0aW1lX2JlZm9yZSh3aGVuLCBscC0+bHBfdGltZXN0YW1wKSkgeyAvKiBvdXQgb2YgZGF0ZSBpbmZvcm1hdGlvbiAqLwogCQlDREVCVUcoRF9ORVQsICJPdXQgb2YgZGF0ZVxuIik7CkBAIC0yMjUsNyArMjI2LDcgQEAKIH0KIAogbG5ldF9yZW1vdGVuZXRfdCAqCi1sbmV0X2ZpbmRfbmV0X2xvY2tlZCAoX191MzIgbmV0KQorbG5ldF9maW5kX25ldF9sb2NrZWQoX191MzIgbmV0KQogewogCWxuZXRfcmVtb3RlbmV0X3QJKnJuZXQ7CiAJc3RydWN0IGxpc3RfaGVhZAkJKnRtcDsKQEAgLTI2OSwxMiArMjcwLDExIEBACiAJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAJY2ZzX3NyYW5kKHR2LnR2X3NlYyBeIHNlZWRbMF0sIHR2LnR2X3VzZWMgXiBzZWVkWzFdKTsKIAlzZWVkZWQgPSAxOwotCXJldHVybjsKIH0KIAogLyogTkIgZXhwZWN0cyBMTkVUX0xPQ0sgaGVsZCAqLwogc3RhdGljIHZvaWQKLWxuZXRfYWRkX3JvdXRlX3RvX3JuZXQgKGxuZXRfcmVtb3RlbmV0X3QgKnJuZXQsIGxuZXRfcm91dGVfdCAqcm91dGUpCitsbmV0X2FkZF9yb3V0ZV90b19ybmV0KGxuZXRfcmVtb3RlbmV0X3QgKnJuZXQsIGxuZXRfcm91dGVfdCAqcm91dGUpCiB7CiAJdW5zaWduZWQgaW50ICAgICAgbGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgICAgICBvZmZzZXQgPSAwOwpAQCAtMjgyLDEzICsyODIsMTMgQEAKIAogCWxuZXRfc2h1ZmZsZV9zZWVkKCk7CiAKLQlsaXN0X2Zvcl9lYWNoIChlLCAmcm5ldC0+bHJuX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2goZSwgJnJuZXQtPmxybl9yb3V0ZXMpIHsKIAkJbGVuKys7CiAJfQogCiAJLyogbGVuKzEgcG9zaXRpb25zIHRvIGFkZCBhIG5ldyBlbnRyeSwgYWxzbyBwcmV2ZW50cyBkaXZpc2lvbiBieSAwICovCiAJb2Zmc2V0ID0gY2ZzX3JhbmQoKSAlIChsZW4gKyAxKTsKLQlsaXN0X2Zvcl9lYWNoIChlLCAmcm5ldC0+bHJuX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2goZSwgJnJuZXQtPmxybl9yb3V0ZXMpIHsKIAkJaWYgKG9mZnNldCA9PSAwKQogCQkJYnJlYWs7CiAJCW9mZnNldC0tOwpAQCAtMzU0LDE3ICszNTQsMTYgQEAKIAkJTElCQ0ZTX0ZSRUUocm91dGUsIHNpemVvZigqcm91dGUpKTsKIAkJTElCQ0ZTX0ZSRUUocm5ldCwgc2l6ZW9mKCpybmV0KSk7CiAKLQkJaWYgKHJjID09IC1FSE9TVFVOUkVBQ0gpIHsgLyogZ2F0ZXdheSBpcyBub3Qgb24gYSBsb2NhbCBuZXQgKi8KKwkJaWYgKHJjID09IC1FSE9TVFVOUkVBQ0gpIC8qIGdhdGV3YXkgaXMgbm90IG9uIGEgbG9jYWwgbmV0ICovCiAJCQlyZXR1cm4gMDsJLyogaWdub3JlIHRoZSByb3V0ZSBlbnRyeSAqLwotCQl9IGVsc2UgewotCQkJQ0VSUk9SKCJFcnJvciAlZCBjcmVhdGluZyByb3V0ZSAlcyAlZCAlc1xuIiwgcmMsCi0JCQkgICAgICAgbGliY2ZzX25ldDJzdHIobmV0KSwgaG9wcywKLQkJCSAgICAgICBsaWJjZnNfbmlkMnN0cihnYXRld2F5KSk7Ci0JCX0KKwkJQ0VSUk9SKCJFcnJvciAlZCBjcmVhdGluZyByb3V0ZSAlcyAlZCAlc1xuIiwgcmMsCisJCSAgICAgICBsaWJjZnNfbmV0MnN0cihuZXQpLCBob3BzLAorCQkgICAgICAgbGliY2ZzX25pZDJzdHIoZ2F0ZXdheSkpOworCiAJCXJldHVybiByYzsKIAl9CiAKLQlMQVNTRVJUICghdGhlX2xuZXQubG5fc2h1dGRvd24pOworCUxBU1NFUlQoIXRoZV9sbmV0LmxuX3NodXRkb3duKTsKIAogCXJuZXQyID0gbG5ldF9maW5kX25ldF9sb2NrZWQobmV0KTsKIAlpZiAocm5ldDIgPT0gTlVMTCkgewpAQCAtMzc1LDcgKzM3NCw3IEBACiAKIAkvKiBTZWFyY2ggZm9yIGEgZHVwbGljYXRlIHJvdXRlIChpdCdzIGEgTk9PUCBpZiBpdCBpcykgKi8KIAlhZGRfcm91dGUgPSAxOwotCWxpc3RfZm9yX2VhY2ggKGUsICZybmV0Mi0+bHJuX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2goZSwgJnJuZXQyLT5scm5fcm91dGVzKSB7CiAJCWxuZXRfcm91dGVfdCAqcm91dGUyID0gbGlzdF9lbnRyeShlLCBsbmV0X3JvdXRlX3QsIGxyX2xpc3QpOwogCiAJCWlmIChyb3V0ZTItPmxyX2dhdGV3YXkgPT0gcm91dGUtPmxyX2dhdGV3YXkpIHsKQEAgLTM4NCw3ICszODMsNyBAQAogCQl9CiAKIAkJLyogb3VyIGxvb2t1cHMgbXVzdCBiZSB0cnVlICovCi0JCUxBU1NFUlQgKHJvdXRlMi0+bHJfZ2F0ZXdheS0+bHBfbmlkICE9IGdhdGV3YXkpOworCQlMQVNTRVJUKHJvdXRlMi0+bHJfZ2F0ZXdheS0+bHBfbmlkICE9IGdhdGV3YXkpOwogCX0KIAogCWlmIChhZGRfcm91dGUpIHsKQEAgLTU0Niw3ICs1NDUsNyBAQAogfQogCiB2b2lkCi1sbmV0X2Rlc3Ryb3lfcm91dGVzICh2b2lkKQorbG5ldF9kZXN0cm95X3JvdXRlcyh2b2lkKQogewogCWxuZXRfZGVsX3JvdXRlKExORVRfTklETkVUKExORVRfTklEX0FOWSksIExORVRfTklEX0FOWSk7CiB9CkBAIC02MDYsNyArNjA1LDYgQEAKIAkJX19zd2FiNjRzKCZzdGF0LT5uc19uaWQpOwogCQlfX3N3YWIzMnMoJnN0YXQtPm5zX3N0YXR1cyk7CiAJfQotCXJldHVybjsKIH0KIAogLyoqCkBAIC03NTgsMTMgKzc1NiwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJICAqZW50cnk7CiAJaW50CQkgIGFsbF9rbm93bjsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORyk7CisJTEFTU0VSVCh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOwogCiAJZm9yICg7OykgewogCQlpbnQJY3B0ID0gbG5ldF9uZXRfbG9ja19jdXJyZW50KCk7CiAKIAkJYWxsX2tub3duID0gMTsKLQkJbGlzdF9mb3JfZWFjaCAoZW50cnksICZ0aGVfbG5ldC5sbl9yb3V0ZXJzKSB7CisJCWxpc3RfZm9yX2VhY2goZW50cnksICZ0aGVfbG5ldC5sbl9yb3V0ZXJzKSB7CiAJCQlydHIgPSBsaXN0X2VudHJ5KGVudHJ5LCBsbmV0X3BlZXJfdCwgbHBfcnRyX2xpc3QpOwogCiAJCQlpZiAocnRyLT5scF9hbGl2ZV9jb3VudCA9PSAwKSB7CkBAIC04ODYsNyArODg0LDcgQEAKIAl9CiAJcmNkLT5yY2RfcGluZ2luZm8gPSBwaTsKIAotCUxBU1NFUlQgKCFMTmV0SGFuZGxlSXNJbnZhbGlkKHRoZV9sbmV0LmxuX3JjX2VxaCkpOworCUxBU1NFUlQoIUxOZXRIYW5kbGVJc0ludmFsaWQodGhlX2xuZXQubG5fcmNfZXFoKSk7CiAJcmMgPSBMTmV0TURCaW5kKChsbmV0X21kX3Qpey5zdGFydCAgICAgPSBwaSwKIAkJCQkgICAgLnVzZXJfcHRyICA9IHJjZCwKIAkJCQkgICAgLmxlbmd0aCAgICA9IExORVRfUElOR0lORk9fU0laRSwKQEAgLTkyOSw3ICs5MjcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1sbmV0X3JvdXRlcl9jaGVja19pbnRlcnZhbCAobG5ldF9wZWVyX3QgKnJ0cikKK2xuZXRfcm91dGVyX2NoZWNrX2ludGVydmFsKGxuZXRfcGVlcl90ICpydHIpCiB7CiAJaW50IHNlY3M7CiAKQEAgLTk0Miw3ICs5NDAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbG5ldF9waW5nX3JvdXRlcl9sb2NrZWQgKGxuZXRfcGVlcl90ICpydHIpCitsbmV0X3Bpbmdfcm91dGVyX2xvY2tlZChsbmV0X3BlZXJfdCAqcnRyKQogewogCWxuZXRfcmNfZGF0YV90ICpyY2QgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgICAgICBub3cgPSBjZnNfdGltZV9jdXJyZW50KCk7CkBAIC0xMDEwLDcgKzEwMDgsNiBAQAogCX0KIAogCWxuZXRfcGVlcl9kZWNyZWZfbG9ja2VkKHJ0cik7Ci0JcmV0dXJuOwogfQogCiBpbnQKQEAgLTEwMTksNyArMTAxNiw3IEBACiAJaW50CSAgcmM7CiAJaW50CSAgZXFzejsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfU0hVVERPV04pOworCUxBU1NFUlQodGhlX2xuZXQubG5fcmNfc3RhdGUgPT0gTE5FVF9SQ19TVEFURV9TSFVURE9XTik7CiAKIAlpZiAoY2hlY2tfcm91dGVyc19iZWZvcmVfdXNlICYmCiAJICAgIGRlYWRfcm91dGVyX2NoZWNrX2ludGVydmFsIDw9IDApIHsKQEAgLTEwNjcsMTQgKzEwNjQsMTQgQEAKIH0KIAogdm9pZAotbG5ldF9yb3V0ZXJfY2hlY2tlcl9zdG9wICh2b2lkKQorbG5ldF9yb3V0ZXJfY2hlY2tlcl9zdG9wKHZvaWQpCiB7CiAJaW50IHJjOwogCiAJaWYgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfU0hVVERPV04pCiAJCXJldHVybjsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORyk7CisJTEFTU0VSVCh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOwogCXRoZV9sbmV0LmxuX3JjX3N0YXRlID0gTE5FVF9SQ19TVEFURV9TVE9QUElORzsKIAogCS8qIGJsb2NrIHVudGlsIGV2ZW50IGNhbGxiYWNrIHNpZ25hbHMgZXhpdCAqLwpAQCAtMTA4Miw4ICsxMDc5LDcgQEAKIAlMQVNTRVJUKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfU0hVVERPV04pOwogCiAJcmMgPSBMTmV0RVFGcmVlKHRoZV9sbmV0LmxuX3JjX2VxaCk7Ci0JTEFTU0VSVCAocmMgPT0gMCk7Ci0JcmV0dXJuOworCUxBU1NFUlQocmMgPT0gMCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMTc4LDcgKzExNzQsNyBAQAogCiAJY2ZzX2Jsb2NrX2FsbHNpZ3MoKTsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORyk7CisJTEFTU0VSVCh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOwogCiAJd2hpbGUgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORykgewogCQlfX3U2NAl2ZXJzaW9uOwpAQCAtMTI5MSwxMSArMTI4NywxMSBAQAogCWlmIChyYnAtPnJicF9uYnVmZmVycyA9PSAwKSAvKiBub3QgaW5pdGlhbGl6ZWQgb3IgYWxyZWFkeSBmcmVlZCAqLwogCQlyZXR1cm47CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZyYnAtPnJicF9tc2dzKSk7Ci0JTEFTU0VSVCAocmJwLT5yYnBfY3JlZGl0cyA9PSByYnAtPnJicF9uYnVmZmVycyk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZyYnAtPnJicF9tc2dzKSk7CisJTEFTU0VSVChyYnAtPnJicF9jcmVkaXRzID09IHJicC0+cmJwX25idWZmZXJzKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcmJwLT5yYnBfYnVmcykpIHsKLQkJTEFTU0VSVCAocmJwLT5yYnBfY3JlZGl0cyA+IDApOworCQlMQVNTRVJUKHJicC0+cmJwX2NyZWRpdHMgPiAwKTsKIAogCQlyYiA9IGxpc3RfZW50cnkocmJwLT5yYnBfYnVmcy5uZXh0LAogCQkJCSAgICBsbmV0X3J0cmJ1Zl90LCByYl9saXN0KTsKQEAgLTEzMDQsOCArMTMwMCw4IEBACiAJCW5idWZmZXJzKys7CiAJfQogCi0JTEFTU0VSVCAocmJwLT5yYnBfbmJ1ZmZlcnMgPT0gbmJ1ZmZlcnMpOwotCUxBU1NFUlQgKHJicC0+cmJwX2NyZWRpdHMgPT0gbmJ1ZmZlcnMpOworCUxBU1NFUlQocmJwLT5yYnBfbmJ1ZmZlcnMgPT0gbmJ1ZmZlcnMpOworCUxBU1NFUlQocmJwLT5yYnBfY3JlZGl0cyA9PSBuYnVmZmVycyk7CiAKIAlyYnAtPnJicF9uYnVmZmVycyA9IHJicC0+cmJwX2NyZWRpdHMgPSAwOwogfQpAQCAtMTMxNyw3ICsxMzEzLDcgQEAKIAlpbnQJICAgIGk7CiAKIAlpZiAocmJwLT5yYnBfbmJ1ZmZlcnMgIT0gMCkgewotCQlMQVNTRVJUIChyYnAtPnJicF9uYnVmZmVycyA9PSBuYnVmcyk7CisJCUxBU1NFUlQocmJwLT5yYnBfbmJ1ZmZlcnMgPT0gbmJ1ZnMpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTEzMzcsMTAgKzEzMzMsMTAgQEAKIAogCQkvKiBObyBhbGxvY2F0aW9uICJ1bmRlciBmaXJlIiAqLwogCQkvKiBPdGhlcndpc2Ugd2UnZCBuZWVkIGNvZGUgdG8gc2NoZWR1bGUgYmxvY2tlZCBtc2dzIGV0YyAqLwotCQlMQVNTRVJUICghdGhlX2xuZXQubG5fcm91dGluZyk7CisJCUxBU1NFUlQoIXRoZV9sbmV0LmxuX3JvdXRpbmcpOwogCX0KIAotCUxBU1NFUlQgKHJicC0+cmJwX2NyZWRpdHMgPT0gbmJ1ZnMpOworCUxBU1NFUlQocmJwLT5yYnBfY3JlZGl0cyA9PSBuYnVmcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzUsNyArMTQzMSw3IEBACiBsbmV0X3J0cnBvb2xzX2FsbG9jKGludCBpbV9hX3JvdXRlcikKIHsKIAlsbmV0X3J0cmJ1ZnBvb2xfdCAqcnRycDsKLQlpbnQJbGFyZ2VfcGFnZXMgPSAoTE5FVF9NVFUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludAlsYXJnZV9wYWdlczsKIAlpbnQJc21hbGxfcGFnZXMgPSAxOwogCWludAlucmJfdGlueTsKIAlpbnQJbnJiX3NtYWxsOwpAQCAtMTQ0Myw2ICsxNDM5LDggQEAKIAlpbnQJcmM7CiAJaW50CWk7CiAKKwlsYXJnZV9wYWdlcyA9IChMTkVUX01UVSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKIAlpZiAoIXN0cmNtcChmb3J3YXJkaW5nLCAiIikpIHsKIAkJLyogbm90IHNldCBlaXRoZXIgd2F5ICovCiAJCWlmICghaW1fYV9yb3V0ZXIpCkBAIC0xNTEzLDE2ICsxNTExLDE2IEBACiAJdW5zaWduZWQgbG9uZwkJbm93ID0gY2ZzX3RpbWVfY3VycmVudCgpOwogCWludAkJCWNwdCA9IGxuZXRfY3B0X29mX25pZChuaWQpOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCAoKSk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0ICgpKTsKIAotCUNERUJVRyAoRF9ORVQsICIlcyBub3RpZnlpbmcgJXM6ICVzXG4iLAorCUNERUJVRyhEX05FVCwgIiVzIG5vdGlmeWluZyAlczogJXNcbiIsCiAJCShuaSA9PSBOVUxMKSA/ICJ1c2Vyc3BhY2UiIDogbGliY2ZzX25pZDJzdHIobmktPm5pX25pZCksCiAJCWxpYmNmc19uaWQyc3RyKG5pZCksCiAJCWFsaXZlID8gInVwIiA6ICJkb3duIik7CiAKIAlpZiAobmkgIT0gTlVMTCAmJgogCSAgICBMTkVUX05JRE5FVChuaS0+bmlfbmlkKSAhPSBMTkVUX05JRE5FVChuaWQpKSB7Ci0JCUNXQVJOICgiSWdub3Jpbmcgbm90aWZpY2F0aW9uIG9mICVzICVzIGJ5ICVzIChkaWZmZXJlbnQgbmV0KVxuIiwKKwkJQ1dBUk4oIklnbm9yaW5nIG5vdGlmaWNhdGlvbiBvZiAlcyAlcyBieSAlcyAoZGlmZmVyZW50IG5ldClcbiIsCiAJCQlsaWJjZnNfbmlkMnN0cihuaWQpLCBhbGl2ZSA/ICJiaXJ0aCIgOiAiZGVhdGgiLAogCQkJbGliY2ZzX25pZDJzdHIobmktPm5pX25pZCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NzcsMjEgKzE1NzUsMjAgQEAKIEVYUE9SVF9TWU1CT0wobG5ldF9ub3RpZnkpOwogCiB2b2lkCi1sbmV0X2dldF90dW5hYmxlcyAodm9pZCkKK2xuZXRfZ2V0X3R1bmFibGVzKHZvaWQpCiB7Ci0JcmV0dXJuOwogfQogCiAjZWxzZQogCiBpbnQKLWxuZXRfbm90aWZ5IChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgaW50IGFsaXZlLCB1bnNpZ25lZCBsb25nIHdoZW4pCitsbmV0X25vdGlmeShsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgaW50IGFsaXZlLCB1bnNpZ25lZCBsb25nIHdoZW4pCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCiB2b2lkCi1sbmV0X3JvdXRlcl9jaGVja2VyICh2b2lkKQorbG5ldF9yb3V0ZXJfY2hlY2tlcih2b2lkKQogewogCXN0YXRpYyB0aW1lX3QgbGFzdDsKIAlzdGF0aWMgaW50ICAgIHJ1bm5pbmc7CkBAIC0xNjQzLDcgKzE2NDAsNyBAQAogCQkJYWJvcnQoKTsKIAkJfQogCi0JCUxBU1NFUlQgKHJjID09IDEpOworCQlMQVNTRVJUKHJjID09IDEpOwogCiAJCWxuZXRfcm91dGVyX2NoZWNrZXJfZXZlbnQoJmV2KTsKIAl9CkBAIC0xNjU1LDI2ICsxNjUyLDI1IEBACiAJCXJldHVybjsKIAl9CiAKLQlMQVNTRVJUICh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOworCUxBU1NFUlQodGhlX2xuZXQubG5fcmNfc3RhdGUgPT0gTE5FVF9SQ19TVEFURV9SVU5OSU5HKTsKIAogCWxuZXRfbmV0X2xvY2soMCk7CiAKIAl2ZXJzaW9uID0gdGhlX2xuZXQubG5fcm91dGVyc192ZXJzaW9uOwotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHJ0ciwgJnRoZV9sbmV0LmxuX3JvdXRlcnMsIGxwX3J0cl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShydHIsICZ0aGVfbG5ldC5sbl9yb3V0ZXJzLCBscF9ydHJfbGlzdCkgewogCQlsbmV0X3Bpbmdfcm91dGVyX2xvY2tlZChydHIpOwotCQlMQVNTRVJUICh2ZXJzaW9uID09IHRoZV9sbmV0LmxuX3JvdXRlcnNfdmVyc2lvbik7CisJCUxBU1NFUlQodmVyc2lvbiA9PSB0aGVfbG5ldC5sbl9yb3V0ZXJzX3ZlcnNpb24pOwogCX0KIAogCWxuZXRfbmV0X3VubG9jaygwKTsKIAogCXJ1bm5pbmcgPSAwOyAvKiBsb2NrIG9ubHkgbmVlZGVkIGZvciB0aGUgcmVjdXJzaW9uIGNoZWNrICovCi0JcmV0dXJuOwogfQogCiAvKiBOQiBsbmV0X3BlZXJzX3N0YXJ0X2Rvd24gZGVwZW5kcyBvbiBtZSwKICAqIHNvIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcGVlciBjcmVhdGlvbiAqLwogdm9pZAotbG5ldF9nZXRfdHVuYWJsZXMgKHZvaWQpCitsbmV0X2dldF90dW5hYmxlcyh2b2lkKQogewogCWNoYXIgKnM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9icndfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKaW5kZXggNDYzZGEwNy4uNjU4ZjQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKQEAgLTE3NSw3ICsxNzUsNiBAQAogCX0KIAogCUxCVUcoKTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25jdGwuYwppbmRleCBmYmZmODRjLi4wNDVmZTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbmN0bC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlpZiAoYXJncy0+bHN0aW9fZ3JwX2tleSAhPSBjb25zb2xlX3Nlc3Npb24uc2VzX2tleSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKLQlpZiAoYXJncy0+bHN0aW9fZ3JwX25hbWVwID09IE5VTEx8fAorCWlmIChhcmdzLT5sc3Rpb19ncnBfbmFtZXAgPT0gTlVMTCB8fAogCSAgICBhcmdzLT5sc3Rpb19ncnBfbm1sZW4gPD0gMCB8fAogCSAgICBhcmdzLT5sc3Rpb19ncnBfbm1sZW4gPiBMU1RfTkFNRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg1Nyw2MiArODU3LDYyIEBACiAJbWVtc2V0KCZjb25zb2xlX3Nlc3Npb24uc2VzX3RyYW5zX3N0YXQsIDAsIHNpemVvZihsc3Rjb25fdHJhbnNfc3RhdF90KSk7CiAKIAlzd2l0Y2ggKG9wYykgewotCQljYXNlIExTVElPX1NFU1NJT05fTkVXOgotCQkJcmMgPSBsc3Rfc2Vzc2lvbl9uZXdfaW9jdGwoKGxzdGlvX3Nlc3Npb25fbmV3X2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19TRVNTSU9OX0VORDoKLQkJCXJjID0gbHN0X3Nlc3Npb25fZW5kX2lvY3RsKChsc3Rpb19zZXNzaW9uX2VuZF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fU0VTU0lPTl9JTkZPOgotCQkJcmMgPSBsc3Rfc2Vzc2lvbl9pbmZvX2lvY3RsKChsc3Rpb19zZXNzaW9uX2luZm9fYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0RFQlVHOgotCQkJcmMgPSBsc3RfZGVidWdfaW9jdGwoKGxzdGlvX2RlYnVnX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19HUk9VUF9BREQ6Ci0JCQlyYyA9IGxzdF9ncm91cF9hZGRfaW9jdGwoKGxzdGlvX2dyb3VwX2FkZF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fR1JPVVBfREVMOgotCQkJcmMgPSBsc3RfZ3JvdXBfZGVsX2lvY3RsKChsc3Rpb19ncm91cF9kZWxfYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0dST1VQX1VQREFURToKLQkJCXJjID0gbHN0X2dyb3VwX3VwZGF0ZV9pb2N0bCgobHN0aW9fZ3JvdXBfdXBkYXRlX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19OT0RFU19BREQ6Ci0JCQlyYyA9IGxzdF9ub2Rlc19hZGRfaW9jdGwoKGxzdGlvX2dyb3VwX25vZGVzX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19HUk9VUF9MSVNUOgotCQkJcmMgPSBsc3RfZ3JvdXBfbGlzdF9pb2N0bCgobHN0aW9fZ3JvdXBfbGlzdF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fR1JPVVBfSU5GTzoKLQkJCXJjID0gbHN0X2dyb3VwX2luZm9faW9jdGwoKGxzdGlvX2dyb3VwX2luZm9fYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0JBVENIX0FERDoKLQkJCXJjID0gbHN0X2JhdGNoX2FkZF9pb2N0bCgobHN0aW9fYmF0Y2hfYWRkX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19CQVRDSF9TVEFSVDoKLQkJCXJjID0gbHN0X2JhdGNoX3J1bl9pb2N0bCgobHN0aW9fYmF0Y2hfcnVuX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19CQVRDSF9TVE9QOgotCQkJcmMgPSBsc3RfYmF0Y2hfc3RvcF9pb2N0bCgobHN0aW9fYmF0Y2hfc3RvcF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fQkFUQ0hfUVVFUlk6Ci0JCQlyYyA9IGxzdF9iYXRjaF9xdWVyeV9pb2N0bCgobHN0aW9fYmF0Y2hfcXVlcnlfYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0JBVENIX0xJU1Q6Ci0JCQlyYyA9IGxzdF9iYXRjaF9saXN0X2lvY3RsKChsc3Rpb19iYXRjaF9saXN0X2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19CQVRDSF9JTkZPOgotCQkJcmMgPSBsc3RfYmF0Y2hfaW5mb19pb2N0bCgobHN0aW9fYmF0Y2hfaW5mb19hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fVEVTVF9BREQ6Ci0JCQlyYyA9IGxzdF90ZXN0X2FkZF9pb2N0bCgobHN0aW9fdGVzdF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fU1RBVF9RVUVSWToKLQkJCXJjID0gbHN0X3N0YXRfcXVlcnlfaW9jdGwoKGxzdGlvX3N0YXRfYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmMgPSAtRUlOVkFMOworCWNhc2UgTFNUSU9fU0VTU0lPTl9ORVc6CisJCXJjID0gbHN0X3Nlc3Npb25fbmV3X2lvY3RsKChsc3Rpb19zZXNzaW9uX25ld19hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX1NFU1NJT05fRU5EOgorCQlyYyA9IGxzdF9zZXNzaW9uX2VuZF9pb2N0bCgobHN0aW9fc2Vzc2lvbl9lbmRfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19TRVNTSU9OX0lORk86CisJCXJjID0gbHN0X3Nlc3Npb25faW5mb19pb2N0bCgobHN0aW9fc2Vzc2lvbl9pbmZvX2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fREVCVUc6CisJCXJjID0gbHN0X2RlYnVnX2lvY3RsKChsc3Rpb19kZWJ1Z19hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0dST1VQX0FERDoKKwkJcmMgPSBsc3RfZ3JvdXBfYWRkX2lvY3RsKChsc3Rpb19ncm91cF9hZGRfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19HUk9VUF9ERUw6CisJCXJjID0gbHN0X2dyb3VwX2RlbF9pb2N0bCgobHN0aW9fZ3JvdXBfZGVsX2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fR1JPVVBfVVBEQVRFOgorCQlyYyA9IGxzdF9ncm91cF91cGRhdGVfaW9jdGwoKGxzdGlvX2dyb3VwX3VwZGF0ZV9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX05PREVTX0FERDoKKwkJcmMgPSBsc3Rfbm9kZXNfYWRkX2lvY3RsKChsc3Rpb19ncm91cF9ub2Rlc19hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0dST1VQX0xJU1Q6CisJCXJjID0gbHN0X2dyb3VwX2xpc3RfaW9jdGwoKGxzdGlvX2dyb3VwX2xpc3RfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19HUk9VUF9JTkZPOgorCQlyYyA9IGxzdF9ncm91cF9pbmZvX2lvY3RsKChsc3Rpb19ncm91cF9pbmZvX2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fQkFUQ0hfQUREOgorCQlyYyA9IGxzdF9iYXRjaF9hZGRfaW9jdGwoKGxzdGlvX2JhdGNoX2FkZF9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0JBVENIX1NUQVJUOgorCQlyYyA9IGxzdF9iYXRjaF9ydW5faW9jdGwoKGxzdGlvX2JhdGNoX3J1bl9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0JBVENIX1NUT1A6CisJCXJjID0gbHN0X2JhdGNoX3N0b3BfaW9jdGwoKGxzdGlvX2JhdGNoX3N0b3BfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19CQVRDSF9RVUVSWToKKwkJcmMgPSBsc3RfYmF0Y2hfcXVlcnlfaW9jdGwoKGxzdGlvX2JhdGNoX3F1ZXJ5X2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fQkFUQ0hfTElTVDoKKwkJcmMgPSBsc3RfYmF0Y2hfbGlzdF9pb2N0bCgobHN0aW9fYmF0Y2hfbGlzdF9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0JBVENIX0lORk86CisJCXJjID0gbHN0X2JhdGNoX2luZm9faW9jdGwoKGxzdGlvX2JhdGNoX2luZm9fYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19URVNUX0FERDoKKwkJcmMgPSBsc3RfdGVzdF9hZGRfaW9jdGwoKGxzdGlvX3Rlc3RfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19TVEFUX1FVRVJZOgorCQlyYyA9IGxzdF9zdGF0X3F1ZXJ5X2lvY3RsKChsc3Rpb19zdGF0X2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKIAl9CiAKIAlpZiAoY29weV90b191c2VyKGRhdGEtPmlvY19wYnVmMiwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfdHJhbnNfc3RhdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jCmluZGV4IDFlMGFmYzIuLjJiNWY1M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYwpAQCAtNjQsNyArNjQsNyBAQAogc3RhdGljIHZvaWQKIGxzdGNvbl9ub2RlX2dldChsc3Rjb25fbm9kZV90ICpuZCkKIHsKLQlMQVNTRVJUIChuZC0+bmRfcmVmID49IDEpOworCUxBU1NFUlQobmQtPm5kX3JlZiA+PSAxKTsKIAogCW5kLT5uZF9yZWYrKzsKIH0KQEAgLTc1LDcgKzc1LDcgQEAKIAlsc3Rjb25fbmRsaW5rX3QgKm5kbDsKIAl1bnNpZ25lZCBpbnQgICAgIGlkeCA9IExORVRfTklEQUREUihpZC5uaWQpICUgTFNUX0dMT0JBTF9IQVNIU0laRTsKIAotCUxBU1NFUlQgKGlkLm5pZCAhPSBMTkVUX05JRF9BTlkpOworCUxBU1NFUlQoaWQubmlkICE9IExORVRfTklEX0FOWSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5kbCwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2hhc2hbaWR4XSwgbmRsX2hsaW5rKSB7CiAJCWlmIChuZGwtPm5kbF9ub2RlLT5uZF9pZC5uaWQgIT0gaWQubmlkIHx8CkBAIC0xMTksMTUgKzExOSwxNSBAQAogewogCWxzdGNvbl9uZGxpbmtfdCAgKm5kbDsKIAotCUxBU1NFUlQgKG5kLT5uZF9yZWYgPiAwKTsKKwlMQVNTRVJUKG5kLT5uZF9yZWYgPiAwKTsKIAogCWlmICgtLW5kLT5uZF9yZWYgPiAwKQogCQlyZXR1cm47CiAKIAluZGwgPSAobHN0Y29uX25kbGlua190ICopKG5kICsgMSk7CiAKLQlMQVNTRVJUICghbGlzdF9lbXB0eSgmbmRsLT5uZGxfbGluaykpOwotCUxBU1NFUlQgKCFsaXN0X2VtcHR5KCZuZGwtPm5kbF9obGluaykpOworCUxBU1NFUlQoIWxpc3RfZW1wdHkoJm5kbC0+bmRsX2xpbmspKTsKKwlMQVNTRVJUKCFsaXN0X2VtcHR5KCZuZGwtPm5kbF9obGluaykpOwogCiAJLyogcmVtb3ZlIGZyb20gc2Vzc2lvbiAqLwogCWxpc3RfZGVsKCZuZGwtPm5kbF9saW5rKTsKQEAgLTE4NCw4ICsxODQsOCBAQAogc3RhdGljIHZvaWQKIGxzdGNvbl9uZGxpbmtfcmVsZWFzZShsc3Rjb25fbmRsaW5rX3QgKm5kbCkKIHsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZuZGwtPm5kbF9saW5rKSk7Ci0JTEFTU0VSVCAoIWxpc3RfZW1wdHkoJm5kbC0+bmRsX2hsaW5rKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZuZGwtPm5kbF9saW5rKSk7CisJTEFTU0VSVCghbGlzdF9lbXB0eSgmbmRsLT5uZGxfaGxpbmspKTsKIAogCWxpc3RfZGVsKCZuZGwtPm5kbF9obGluayk7IC8qIGRlbGV0ZSBmcm9tIGhhc2ggKi8KIAlsc3Rjb25fbm9kZV9wdXQobmRsLT5uZGxfbm9kZSk7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAlsc3Rjb25fZ3JvdXBfZHJhaW4oZ3JwLCAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBMU1RfTk9ERV9IQVNIU0laRTsgaSsrKSB7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmdycC0+Z3JwX25kbF9oYXNoW2ldKSk7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgmZ3JwLT5ncnBfbmRsX2hhc2hbaV0pKTsKIAl9CiAKIAlMSUJDRlNfRlJFRShncnAsIG9mZnNldG9mKGxzdGNvbl9ncm91cF90LApAQCAtNTUyLDggKzU1Miw4IEBACiAJbHN0Y29uX2dyb3VwX3QJICpncnA7CiAJaW50CQkgICAgIHJjOwogCi0JTEFTU0VSVCAoY291bnQgPiAwKTsKLQlMQVNTRVJUIChpZHNfdXAgIT0gTlVMTCk7CisJTEFTU0VSVChjb3VudCA+IDApOworCUxBU1NFUlQoaWRzX3VwICE9IE5VTEwpOwogCiAJcmMgPSBsc3Rjb25fZ3JvdXBfZmluZChuYW1lLCAmZ3JwKTsKIAlpZiAocmMgIT0gMCkgewpAQCAtNzI2LDggKzcyNiw4IEBACiB7CiAJbHN0Y29uX2dyb3VwX3QgKmdycDsKIAotCUxBU1NFUlQgKGluZGV4ID49IDApOwotCUxBU1NFUlQgKG5hbWVfdXAgIT0gTlVMTCk7CisJTEFTU0VSVChpbmRleCA+PSAwKTsKKwlMQVNTRVJUKG5hbWVfdXAgIT0gTlVMTCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdycCwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfZ3JwX2xpc3QsIGdycF9saW5rKSB7CiAJCWlmIChpbmRleC0tID09IDApIHsKQEAgLTc0OCwxMCArNzQ4LDEwIEBACiAJaW50CSAgICAgICBjb3VudCA9IDA7CiAJaW50CSAgICAgICBpbmRleCA9IDA7CiAKLQlMQVNTRVJUIChpbmRleF9wICE9IE5VTEwgJiYgY291bnRfcCAhPSBOVUxMKTsKLQlMQVNTRVJUIChkZW50c191cCAhPSBOVUxMKTsKLQlMQVNTRVJUICgqaW5kZXhfcCA+PSAwKTsKLQlMQVNTRVJUICgqY291bnRfcCA+IDApOworCUxBU1NFUlQoaW5kZXhfcCAhPSBOVUxMICYmIGNvdW50X3AgIT0gTlVMTCk7CisJTEFTU0VSVChkZW50c191cCAhPSBOVUxMKTsKKwlMQVNTRVJUKCppbmRleF9wID49IDApOworCUxBU1NFUlQoKmNvdW50X3AgPiAwKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobmRsLCBoZWFkLCBuZGxfbGluaykgewogCQlpZiAoaW5kZXgrKyA8ICppbmRleF9wKQpAQCAtOTA1LDggKzkwNSw4IEBACiB7CiAJbHN0Y29uX2JhdGNoX3QgICAgKmJhdDsKIAotCUxBU1NFUlQgKG5hbWVfdXAgIT0gTlVMTCk7Ci0JTEFTU0VSVCAoaW5kZXggPj0gMCk7CisJTEFTU0VSVChuYW1lX3VwICE9IE5VTEwpOworCUxBU1NFUlQoaW5kZXggPj0gMCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJhdCwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfYmF0X2xpc3QsIGJhdF9saW5rKSB7CiAJCWlmIChpbmRleC0tID09IDApIHsKQEAgLTEwOTMsNyArMTA5Myw3IEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZiYXQtPmJhdF90ZXN0X2xpc3QpKSB7CiAJCXRlc3QgPSBsaXN0X2VudHJ5KGJhdC0+YmF0X3Rlc3RfbGlzdC5uZXh0LAogCQkJCSAgICAgIGxzdGNvbl90ZXN0X3QsIHRlc19saW5rKTsKLQkJTEFTU0VSVCAobGlzdF9lbXB0eSgmdGVzdC0+dGVzX3RyYW5zX2xpc3QpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZ0ZXN0LT50ZXNfdHJhbnNfbGlzdCkpOwogCiAJCWxpc3RfZGVsKCZ0ZXN0LT50ZXNfbGluayk7CiAKQEAgLTExMDQsNyArMTEwNCw3IEBACiAJCQkJCSAgIHRlc19wYXJhbVt0ZXN0LT50ZXNfcGFyYW1sZW5dKSk7CiAJfQogCi0JTEFTU0VSVCAobGlzdF9lbXB0eSgmYmF0LT5iYXRfdHJhbnNfbGlzdCkpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmYmF0LT5iYXRfdHJhbnNfbGlzdCkpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZiYXQtPmJhdF9jbGlfbGlzdCkpIHsKIAkJbmRsID0gbGlzdF9lbnRyeShiYXQtPmJhdF9jbGlfbGlzdC5uZXh0LApAQCAtMTEyMyw4ICsxMTIzLDggQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTFNUX05PREVfSEFTSFNJWkU7IGkrKykgewotCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZiYXQtPmJhdF9jbGlfaGFzaFtpXSkpOwotCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZiYXQtPmJhdF9zcnZfaGFzaFtpXSkpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmJhdC0+YmF0X2NsaV9oYXNoW2ldKSk7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgmYmF0LT5iYXRfc3J2X2hhc2hbaV0pKTsKIAl9CiAKIAlMSUJDRlNfRlJFRShiYXQtPmJhdF9jbGlfaGFzaCwKQEAgLTExNDQsMTAgKzExNDQsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICpoZWFkOwogCiAJdGVzdCA9IChsc3Rjb25fdGVzdF90ICopYXJnOwotCUxBU1NFUlQgKHRlc3QgIT0gTlVMTCk7CisJTEFTU0VSVCh0ZXN0ICE9IE5VTEwpOwogCiAJYmF0Y2ggPSB0ZXN0LT50ZXNfYmF0Y2g7Ci0JTEFTU0VSVCAoYmF0Y2ggIT0gTlVMTCk7CisJTEFTU0VSVChiYXRjaCAhPSBOVUxMKTsKIAogCWlmICh0ZXN0LT50ZXNfb25lc2lkZSAmJgogCSAgICB0cmFuc29wID09IExTVF9UUkFOU19UU0JTUlZBREQpCkBAIC0xMTYxLDEzICsxMTYxLDEzIEBACiAJCWhlYWQgPSAmYmF0Y2gtPmJhdF9jbGlfbGlzdDsKIAogCX0gZWxzZSB7Ci0JCUxBU1NFUlQgKHRyYW5zb3AgPT0gTFNUX1RSQU5TX1RTQlNSVkFERCk7CisJCUxBU1NFUlQodHJhbnNvcCA9PSBMU1RfVFJBTlNfVFNCU1JWQUREKTsKIAogCQloYXNoID0gYmF0Y2gtPmJhdF9zcnZfaGFzaDsKIAkJaGVhZCA9ICZiYXRjaC0+YmF0X3Nydl9saXN0OwogCX0KIAotCUxBU1NFUlQgKG5kLT5uZF9pZC5uaWQgIT0gTE5FVF9OSURfQU5ZKTsKKwlMQVNTRVJUKG5kLT5uZF9pZC5uaWQgIT0gTE5FVF9OSURfQU5ZKTsKIAogCWlmIChsc3Rjb25fbmRsaW5rX2ZpbmQoaGFzaCwgbmQtPm5kX2lkLCAmbmRsLCAxKSAhPSAwKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExODYsOCArMTE4Niw4IEBACiAJaW50CQkgICAgIHRyYW5zb3A7CiAJaW50CQkgICAgIHJjOwogCi0JTEFTU0VSVCAodGVzdC0+dGVzX3NyY19ncnAgIT0gTlVMTCk7Ci0JTEFTU0VSVCAodGVzdC0+dGVzX2RzdF9ncnAgIT0gTlVMTCk7CisJTEFTU0VSVCh0ZXN0LT50ZXNfc3JjX2dycCAhPSBOVUxMKTsKKwlMQVNTRVJUKHRlc3QtPnRlc19kc3RfZ3JwICE9IE5VTEwpOwogCiAJdHJhbnNvcCA9IExTVF9UUkFOU19UU0JTUlZBREQ7CiAJZ3JwICA9IHRlc3QtPnRlc19kc3RfZ3JwOwpAQCAtMTM4Miw3ICsxMzgyLDcgQEAKIHsKIAlzcnBjX2JhdGNoX3JlcGx5X3QgKnJlcCA9ICZtc2ctPm1zZ19ib2R5LmJhdF9yZXBseTsKIAotCUxBU1NFUlQgKHRyYW5zb3AgPT0gTFNUX1RSQU5TX1RTQkNMSVFSWSB8fAorCUxBU1NFUlQodHJhbnNvcCA9PSBMU1RfVFJBTlNfVFNCQ0xJUVJZIHx8CiAJCSB0cmFuc29wID09IExTVF9UUkFOU19UU0JTUlZRUlkpOwogCiAJLyogcG9zaXRpdmUgZXJybm8sIGZyYW1ld29yayBlcnJvciBjb2RlICovCkBAIC0xNjkxLDcgKzE2OTEsNyBAQAogewogCWxuZXRfcHJvY2Vzc19pZF90ICAgICAgaWQ7CiAKLQlMQVNTRVJUIChjb25zb2xlX3Nlc3Npb24uc2VzX3N0YXRlID09IExTVF9TRVNTSU9OX05PTkUpOworCUxBU1NFUlQoY29uc29sZV9zZXNzaW9uLnNlc19zdGF0ZSA9PSBMU1RfU0VTU0lPTl9OT05FKTsKIAogCUxOZXRHZXRJZCgxLCAmaWQpOwogCXNpZC0+c2VzX25pZCAgID0gaWQubmlkOwpAQCAtMTgwNiw3ICsxODA2LDcgQEAKIAlsc3Rjb25fYmF0Y2hfdCAgICAgKmJhdDsKIAlpbnQJCSByYyA9IDA7CiAKLQlMQVNTRVJUIChjb25zb2xlX3Nlc3Npb24uc2VzX3N0YXRlID09IExTVF9TRVNTSU9OX0FDVElWRSk7CisJTEFTU0VSVChjb25zb2xlX3Nlc3Npb24uc2VzX3N0YXRlID09IExTVF9TRVNTSU9OX0FDVElWRSk7CiAKIAlyYyA9IGxzdGNvbl9ycGNfdHJhbnNfbmRsaXN0KCZjb25zb2xlX3Nlc3Npb24uc2VzX25kbF9saXN0LAogCQkJCSAgICAgTlVMTCwgTFNUX1RSQU5TX1NFU0VORCwgTlVMTCwKQEAgLTE4NDYsMTMgKzE4NDYsMTMgQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfZ3JwX2xpc3QpKSB7CiAJCWdycCA9IGxpc3RfZW50cnkoY29uc29sZV9zZXNzaW9uLnNlc19ncnBfbGlzdC5uZXh0LAogCQkJCSAgICAgbHN0Y29uX2dyb3VwX3QsIGdycF9saW5rKTsKLQkJTEFTU0VSVCAoZ3JwLT5ncnBfcmVmID09IDEpOworCQlMQVNTRVJUKGdycC0+Z3JwX3JlZiA9PSAxKTsKIAogCQlsc3Rjb25fZ3JvdXBfcHV0KGdycCk7CiAJfQogCiAJLyogYWxsIG5vZGVzIHNob3VsZCBiZSByZWxlYXNlZCAqLwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2xpc3QpKTsKIAogCWNvbnNvbGVfc2Vzc2lvbi5zZXNfc2h1dGRvd24gPSAwOwogCWNvbnNvbGVfc2Vzc2lvbi5zZXNfZXhwaXJlZCAgPSAwOwpAQCAtMTg5Miw3ICsxODkyLDcgQEAKIH0KIAogc3RhdGljIGludAotbHN0Y29uX2FjY2VwdG9yX2hhbmRsZSAoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKK2xzdGNvbl9hY2NlcHRvcl9oYW5kbGUoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKIHsKIAlzcnBjX21zZ190CSpyZXAgID0gJnJwYy0+c3JwY19yZXBseW1zZzsKIAlzcnBjX21zZ190CSpyZXEgID0gJnJwYy0+c3JwY19yZXFzdGJ1Zi0+YnVmX21zZzsKQEAgLTIwMjYsNyArMjAyNiw3IEBACiAJbHN0Y29uX2luaXRfYWNjZXB0b3Jfc2VydmljZSgpOwogCiAJcmMgPSBzcnBjX2FkZF9zZXJ2aWNlKCZsc3Rjb25fYWNjZXB0b3Jfc2VydmljZSk7Ci0JTEFTU0VSVCAocmMgIT0gLUVCVVNZKTsKKwlMQVNTRVJUKHJjICE9IC1FQlVTWSk7CiAJaWYgKHJjICE9IDApIHsKIAkJTElCQ0ZTX0ZSRUUoY29uc29sZV9zZXNzaW9uLnNlc19uZGxfaGFzaCwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBMU1RfR0xPQkFMX0hBU0hTSVpFKTsKQEAgLTIwNzgsMTMgKzIwNzgsMTMgQEAKIAogCW11dGV4X3VubG9jaygmY29uc29sZV9zZXNzaW9uLnNlc19tdXRleCk7CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25zb2xlX3Nlc3Npb24uc2VzX25kbF9saXN0KSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29uc29sZV9zZXNzaW9uLnNlc19ncnBfbGlzdCkpOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfYmF0X2xpc3QpKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25zb2xlX3Nlc3Npb24uc2VzX3RyYW5zX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfZ3JwX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfYmF0X2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfdHJhbnNfbGlzdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IExTVF9OT0RFX0hBU0hTSVpFOyBpKyspIHsKLQkJTEFTU0VSVCAobGlzdF9lbXB0eSgmY29uc29sZV9zZXNzaW9uLnNlc19uZGxfaGFzaFtpXSkpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2hhc2hbaV0pKTsKIAl9CiAKIAlMSUJDRlNfRlJFRShjb25zb2xlX3Nlc3Npb24uc2VzX25kbF9oYXNoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmgKaW5kZXggZjk2MDE3NC4uZTQxY2E4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5oCkBAIC0xODIsNiArMTgyLDkgQEAKIAlyZXR1cm4gJmhhc2hbaWR4XTsKIH0KIAoraW50IGxzdGNvbl9jb25zb2xlX2luaXQodm9pZCk7CitpbnQgbHN0Y29uX2lvY3RsX2VudHJ5KHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBsaWJjZnNfaW9jdGxfZGF0YSAqZGF0YSk7CitpbnQgbHN0Y29uX2NvbnNvbGVfZmluaSh2b2lkKTsKIGV4dGVybiBpbnQgbHN0Y29uX3Nlc3Npb25fbWF0Y2gobHN0X3NpZF90IHNpZCk7CiBleHRlcm4gaW50IGxzdGNvbl9zZXNzaW9uX25ldyhjaGFyICpuYW1lLCBpbnQga2V5LCB1bnNpZ25lZCB2ZXJzaW9uLAogCQkJICAgICAgaW50IHRpbWVvdXQsIGludCBmbGFncywgbHN0X3NpZF90ICpzaWRfdXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2ZyYW1ld29yay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2ZyYW1ld29yay5jCmluZGV4IDU3MDkxNDguLmE5M2E5MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9mcmFtZXdvcmsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvZnJhbWV3b3JrLmMKQEAgLTExNSwxOCArMTE1LDE4IEBACiB9IHNmd19kYXRhOwogCiAvKiBmb3J3YXJkIHJlZidzICovCi1pbnQgc2Z3X3N0b3BfYmF0Y2ggKHNmd19iYXRjaF90ICp0c2IsIGludCBmb3JjZSk7Ci12b2lkIHNmd19kZXN0cm95X3Nlc3Npb24gKHNmd19zZXNzaW9uX3QgKnNuKTsKK2ludCBzZndfc3RvcF9iYXRjaChzZndfYmF0Y2hfdCAqdHNiLCBpbnQgZm9yY2UpOwordm9pZCBzZndfZGVzdHJveV9zZXNzaW9uKHNmd19zZXNzaW9uX3QgKnNuKTsKIAogc3RhdGljIGlubGluZSBzZndfdGVzdF9jYXNlX3QgKgogc2Z3X2ZpbmRfdGVzdF9jYXNlKGludCBpZCkKIHsKIAlzZndfdGVzdF9jYXNlX3QgKnRzYzsKIAotCUxBU1NFUlQgKGlkIDw9IFNSUENfU0VSVklDRV9NQVhfSUQpOwotCUxBU1NFUlQgKGlkID4gU1JQQ19GUkFNRVdPUktfU0VSVklDRV9NQVhfSUQpOworCUxBU1NFUlQoaWQgPD0gU1JQQ19TRVJWSUNFX01BWF9JRCk7CisJTEFTU0VSVChpZCA+IFNSUENfRlJBTUVXT1JLX1NFUlZJQ0VfTUFYX0lEKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzYywgJnNmd19kYXRhLmZ3X3Rlc3RzLCB0c2NfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodHNjLCAmc2Z3X2RhdGEuZndfdGVzdHMsIHRzY19saXN0KSB7CiAJCWlmICh0c2MtPnRzY19zcnZfc2VydmljZS0+c3ZfaWQgPT0gaWQpCiAJCQlyZXR1cm4gdHNjOwogCX0KQEAgLTEzNSwxMiArMTM1LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQKLXNmd19yZWdpc3Rlcl90ZXN0IChzcnBjX3NlcnZpY2VfdCAqc2VydmljZSwgc2Z3X3Rlc3RfY2xpZW50X29wc190ICpjbGlvcHMpCitzZndfcmVnaXN0ZXJfdGVzdChzcnBjX3NlcnZpY2VfdCAqc2VydmljZSwgc2Z3X3Rlc3RfY2xpZW50X29wc190ICpjbGlvcHMpCiB7CiAJc2Z3X3Rlc3RfY2FzZV90ICp0c2M7CiAKIAlpZiAoc2Z3X2ZpbmRfdGVzdF9jYXNlKHNlcnZpY2UtPnN2X2lkKSAhPSBOVUxMKSB7Ci0JCUNFUlJPUiAoIkZhaWxlZCB0byByZWdpc3RlciB0ZXN0ICVzICglZClcbiIsCisJCUNFUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIHRlc3QgJXMgKCVkKVxuIiwKIAkJCXNlcnZpY2UtPnN2X25hbWUsIHNlcnZpY2UtPnN2X2lkKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQpAQCAtMTU3LDE3ICsxNTcsMTcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNmd19hZGRfc2Vzc2lvbl90aW1lciAodm9pZCkKK3Nmd19hZGRfc2Vzc2lvbl90aW1lcih2b2lkKQogewogCXNmd19zZXNzaW9uX3QgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIAlzdHRfdGltZXJfdCAgICp0aW1lciA9ICZzbi0+c25fdGltZXI7CiAKLQlMQVNTRVJUICghc2Z3X2RhdGEuZndfc2h1dHRpbmdkb3duKTsKKwlMQVNTRVJUKCFzZndfZGF0YS5md19zaHV0dGluZ2Rvd24pOwogCiAJaWYgKHNuID09IE5VTEwgfHwgc24tPnNuX3RpbWVvdXQgPT0gMCkKIAkJcmV0dXJuOwogCi0JTEFTU0VSVCAoIXNuLT5zbl90aW1lcl9hY3RpdmUpOworCUxBU1NFUlQoIXNuLT5zbl90aW1lcl9hY3RpdmUpOwogCiAJc24tPnNuX3RpbWVyX2FjdGl2ZSA9IDE7CiAJdGltZXItPnN0dF9leHBpcmVzID0gY2ZzX3RpbWVfYWRkKHNuLT5zbl90aW1lb3V0LApAQCAtMTc3LDE0ICsxNzcsMTQgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X2RlbF9zZXNzaW9uX3RpbWVyICh2b2lkKQorc2Z3X2RlbF9zZXNzaW9uX3RpbWVyKHZvaWQpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwogCiAJaWYgKHNuID09IE5VTEwgfHwgIXNuLT5zbl90aW1lcl9hY3RpdmUpCiAJCXJldHVybiAwOwogCi0JTEFTU0VSVCAoc24tPnNuX3RpbWVvdXQgIT0gMCk7CisJTEFTU0VSVChzbi0+c25fdGltZW91dCAhPSAwKTsKIAogCWlmIChzdHRfZGVsX3RpbWVyKCZzbi0+c25fdGltZXIpKSB7IC8qIHRpbWVyIGRlZnVzZWQgKi8KIAkJc24tPnNuX3RpbWVyX2FjdGl2ZSA9IDA7CkBAIC0xOTUsNyArMTk1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNmd19kZWFjdGl2YXRlX3Nlc3Npb24gKHZvaWQpCitzZndfZGVhY3RpdmF0ZV9zZXNzaW9uKHZvaWQpCiAJX19tdXN0X2hvbGQoJnNmd19kYXRhLmZ3X2xvY2spCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIAlpZiAoc24gPT0gTlVMTCkgcmV0dXJuOwogCi0JTEFTU0VSVCAoIXNuLT5zbl90aW1lcl9hY3RpdmUpOworCUxBU1NFUlQoIXNuLT5zbl90aW1lcl9hY3RpdmUpOwogCiAJc2Z3X2RhdGEuZndfc2Vzc2lvbiA9IE5VTEw7CiAJYXRvbWljX2luYygmc2Z3X2RhdGEuZndfbnpvbWJpZXMpOwpAQCAtMjE5LDcgKzIxOSw3IEBACiAKIAlzcGluX2xvY2soJnNmd19kYXRhLmZ3X2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNiLCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2IsICZzbi0+c25fYmF0Y2hlcywgYmF0X2xpc3QpIHsKIAkJaWYgKHNmd19iYXRjaF9hY3RpdmUodHNiKSkgewogCQkJbmFjdGl2ZSsrOwogCQkJc2Z3X3N0b3BfYmF0Y2godHNiLCAxKTsKQEAgLTIzOSwxNiArMjM5LDE2IEBACiAKIAogc3RhdGljIHZvaWQKLXNmd19zZXNzaW9uX2V4cGlyZWQgKHZvaWQgKmRhdGEpCitzZndfc2Vzc2lvbl9leHBpcmVkKHZvaWQgKmRhdGEpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBkYXRhOwogCiAJc3Bpbl9sb2NrKCZzZndfZGF0YS5md19sb2NrKTsKIAotCUxBU1NFUlQgKHNuLT5zbl90aW1lcl9hY3RpdmUpOwotCUxBU1NFUlQgKHNuID09IHNmd19kYXRhLmZ3X3Nlc3Npb24pOworCUxBU1NFUlQoc24tPnNuX3RpbWVyX2FjdGl2ZSk7CisJTEFTU0VSVChzbiA9PSBzZndfZGF0YS5md19zZXNzaW9uKTsKIAotCUNXQVJOICgiU2Vzc2lvbiBleHBpcmVkISBzaWQ6ICVzLSVsbHUsIG5hbWU6ICVzXG4iLAorCUNXQVJOKCJTZXNzaW9uIGV4cGlyZWQhIHNpZDogJXMtJWxsdSwgbmFtZTogJXNcbiIsCiAJICAgICAgIGxpYmNmc19uaWQyc3RyKHNuLT5zbl9pZC5zZXNfbmlkKSwKIAkgICAgICAgc24tPnNuX2lkLnNlc19zdGFtcCwgJnNuLT5zbl9uYW1lWzBdKTsKIApAQCAtMjkwLDcgKzI5MCw3IEBACiAJc3RydWN0IHNycGNfc2VydmljZQkqc3YJPSBycGMtPnNycGNfc2NkLT5zY2Rfc3ZjOwogCWludAkJCXN0YXR1cwk9IHJwYy0+c3JwY19zdGF0dXM7CiAKLQlDREVCVUcgKERfTkVULAorCUNERUJVRyhEX05FVCwKIAkJIkluY29taW5nIGZyYW1ld29yayBSUEMgZG9uZTogc2VydmljZSAlcywgcGVlciAlcywgc3RhdHVzICVzOiVkXG4iLAogCQlzdi0+c3ZfbmFtZSwgbGliY2ZzX2lkMnN0cihycGMtPnNycGNfcGVlciksCiAJCXN3aV9zdGF0ZTJzdHIocnBjLT5zcnBjX3dpLnN3aV9zdGF0ZSksCkBAIC0zMDIsMTMgKzMwMiwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotc2Z3X2NsaWVudF9ycGNfZmluaSAoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKK3Nmd19jbGllbnRfcnBjX2Zpbmkoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKIHsKLQlMQVNTRVJUIChycGMtPmNycGNfYnVsay5ia19uaW92ID09IDApOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQoJnJwYy0+Y3JwY19yZWZjb3VudCkgPT0gMCk7CisJTEFTU0VSVChycGMtPmNycGNfYnVsay5ia19uaW92ID09IDApOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZycGMtPmNycGNfcmVmY291bnQpID09IDApOwogCi0JQ0RFQlVHIChEX05FVCwKKwlDREVCVUcoRF9ORVQsCiAJCSJPdXRnb2luZyBmcmFtZXdvcmsgUlBDIGRvbmU6IHNlcnZpY2UgJWQsIHBlZXIgJXMsIHN0YXR1cyAlczolZDolZFxuIiwKIAkJcnBjLT5jcnBjX3NlcnZpY2UsIGxpYmNmc19pZDJzdHIocnBjLT5jcnBjX2Rlc3QpLAogCQlzd2lfc3RhdGUyc3RyKHJwYy0+Y3JwY193aS5zd2lfc3RhdGUpLApAQCAtMzI0LDE0ICszMjQsMTQgQEAKIH0KIAogc3RhdGljIHNmd19iYXRjaF90ICoKLXNmd19maW5kX2JhdGNoIChsc3RfYmlkX3QgYmlkKQorc2Z3X2ZpbmRfYmF0Y2gobHN0X2JpZF90IGJpZCkKIHsKIAlzZndfc2Vzc2lvbl90ICpzbiA9IHNmd19kYXRhLmZ3X3Nlc3Npb247CiAJc2Z3X2JhdGNoX3QgICAqYmF0OwogCi0JTEFTU0VSVCAoc24gIT0gTlVMTCk7CisJTEFTU0VSVChzbiAhPSBOVUxMKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKGJhdCwgJnNuLT5zbl9iYXRjaGVzLCBiYXRfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmF0LCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CiAJCWlmIChiYXQtPmJhdF9pZC5iYXRfaWQgPT0gYmlkLmJhdF9pZCkKIAkJCXJldHVybiBiYXQ7CiAJfQpAQCAtMzQwLDEyICszNDAsMTIgQEAKIH0KIAogc3RhdGljIHNmd19iYXRjaF90ICoKLXNmd19iaWQyYmF0Y2ggKGxzdF9iaWRfdCBiaWQpCitzZndfYmlkMmJhdGNoKGxzdF9iaWRfdCBiaWQpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwogCXNmd19iYXRjaF90ICAgKmJhdDsKIAotCUxBU1NFUlQgKHNuICE9IE5VTEwpOworCUxBU1NFUlQoc24gIT0gTlVMTCk7CiAKIAliYXQgPSBzZndfZmluZF9iYXRjaChiaWQpOwogCWlmIChiYXQgIT0gTlVMTCkKQEAgLTM2Niw3ICszNjYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZndfZ2V0X3N0YXRzIChzcnBjX3N0YXRfcmVxc3RfdCAqcmVxdWVzdCwgc3JwY19zdGF0X3JlcGx5X3QgKnJlcGx5KQorc2Z3X2dldF9zdGF0cyhzcnBjX3N0YXRfcmVxc3RfdCAqcmVxdWVzdCwgc3JwY19zdGF0X3JlcGx5X3QgKnJlcGx5KQogewogCXNmd19zZXNzaW9uX3QgICpzbiA9IHNmd19kYXRhLmZ3X3Nlc3Npb247CiAJc2Z3X2NvdW50ZXJzX3QgKmNudCA9ICZyZXBseS0+c3RyX2Z3OwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJY250LT56b21iaWVfc2Vzc2lvbnMgPSBhdG9taWNfcmVhZCgmc2Z3X2RhdGEuZndfbnpvbWJpZXMpOwogCiAJY250LT5hY3RpdmVfYmF0Y2hlcyA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSAoYmF0LCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiYXQsICZzbi0+c25fYmF0Y2hlcywgYmF0X2xpc3QpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZiYXQtPmJhdF9uYWN0aXZlKSA+IDApCiAJCQljbnQtPmFjdGl2ZV9iYXRjaGVzKys7CiAJfQpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJLyogYnJhbmQgbmV3IG9yIGNyZWF0ZSBieSBmb3JjZSAqLwogCUxJQkNGU19BTExPQyhzbiwgc2l6ZW9mKHNmd19zZXNzaW9uX3QpKTsKIAlpZiAoc24gPT0gTlVMTCkgewotCQlDRVJST1IgKCJEcm9wcGluZyBSUEMgKG1rc24pIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS5cbiIpOworCQlDRVJST1IoIkRyb3BwaW5nIFJQQyAobWtzbikgdW5kZXIgbWVtb3J5IHByZXNzdXJlLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNDc4LDcgKzQ3OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNmd19yZW1vdmVfc2Vzc2lvbiAoc3JwY19ybXNuX3JlcXN0X3QgKnJlcXVlc3QsIHNycGNfcm1zbl9yZXBseV90ICpyZXBseSkKK3Nmd19yZW1vdmVfc2Vzc2lvbihzcnBjX3Jtc25fcmVxc3RfdCAqcmVxdWVzdCwgc3JwY19ybXNuX3JlcGx5X3QgKnJlcGx5KQogewogCXNmd19zZXNzaW9uX3QgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIApAQCAtNTEwLDcgKzUxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNmd19kZWJ1Z19zZXNzaW9uIChzcnBjX2RlYnVnX3JlcXN0X3QgKnJlcXVlc3QsIHNycGNfZGVidWdfcmVwbHlfdCAqcmVwbHkpCitzZndfZGVidWdfc2Vzc2lvbihzcnBjX2RlYnVnX3JlcXN0X3QgKnJlcXVlc3QsIHNycGNfZGVidWdfcmVwbHlfdCAqcmVwbHkpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwogCkBAIC01MzEsMTMgKzUzMSwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotc2Z3X3Rlc3RfcnBjX2ZpbmkgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzZndfdGVzdF9ycGNfZmluaShzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewogCXNmd190ZXN0X3VuaXRfdCAgICAgKnRzdSA9IHJwYy0+Y3JwY19wcml2OwogCXNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSA9IHRzdS0+dHN1X2luc3RhbmNlOwogCiAJLyogQ2FsbGVkIHdpdGggaG9sZCBvZiB0c2ktPnRzaV9sb2NrICovCi0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7CiAJbGlzdF9hZGQoJnJwYy0+Y3JwY19saXN0LCAmdHNpLT50c2lfZnJlZV9ycGNzKTsKIH0KIApAQCAtNjA4LDcgKzYwOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zZndfZGVzdHJveV90ZXN0X2luc3RhbmNlIChzZndfdGVzdF9pbnN0YW5jZV90ICp0c2kpCitzZndfZGVzdHJveV90ZXN0X2luc3RhbmNlKHNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSkKIHsKIAlzcnBjX2NsaWVudF9ycGNfdCAqcnBjOwogCXNmd190ZXN0X3VuaXRfdCAgICp0c3U7CkBAIC02MTcsOSArNjE3LDkgQEAKIAogCXRzaS0+dHNpX29wcy0+dHNvX2ZpbmkodHNpKTsKIAotCUxBU1NFUlQgKCF0c2ktPnRzaV9zdG9wcGluZyk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmdHNpLT50c2lfYWN0aXZlX3JwY3MpKTsKLQlMQVNTRVJUICghc2Z3X3Rlc3RfYWN0aXZlKHRzaSkpOworCUxBU1NFUlQoIXRzaS0+dHNpX3N0b3BwaW5nKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnRzaS0+dHNpX2FjdGl2ZV9ycGNzKSk7CisJTEFTU0VSVCghc2Z3X3Rlc3RfYWN0aXZlKHRzaSkpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0c2ktPnRzaV91bml0cykpIHsKIAkJdHN1ID0gbGlzdF9lbnRyeSh0c2ktPnRzaV91bml0cy5uZXh0LApAQCAtNjQyLDEyICs2NDIsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNmd19kZXN0cm95X2JhdGNoIChzZndfYmF0Y2hfdCAqdHNiKQorc2Z3X2Rlc3Ryb3lfYmF0Y2goc2Z3X2JhdGNoX3QgKnRzYikKIHsKIAlzZndfdGVzdF9pbnN0YW5jZV90ICp0c2k7CiAKLQlMQVNTRVJUICghc2Z3X2JhdGNoX2FjdGl2ZSh0c2IpKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZ0c2ItPmJhdF9saXN0KSk7CisJTEFTU0VSVCghc2Z3X2JhdGNoX2FjdGl2ZSh0c2IpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnRzYi0+YmF0X2xpc3QpKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmdHNiLT5iYXRfdGVzdHMpKSB7CiAJCXRzaSA9IGxpc3RfZW50cnkodHNiLT5iYXRfdGVzdHMubmV4dCwKQEAgLTY2MSwxMiArNjYxLDEyIEBACiB9CiAKIHZvaWQKLXNmd19kZXN0cm95X3Nlc3Npb24gKHNmd19zZXNzaW9uX3QgKnNuKQorc2Z3X2Rlc3Ryb3lfc2Vzc2lvbihzZndfc2Vzc2lvbl90ICpzbikKIHsKIAlzZndfYmF0Y2hfdCAqYmF0Y2g7CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZzbi0+c25fbGlzdCkpOwotCUxBU1NFUlQgKHNuICE9IHNmd19kYXRhLmZ3X3Nlc3Npb24pOworCUxBU1NFUlQobGlzdF9lbXB0eSgmc24tPnNuX2xpc3QpKTsKKwlMQVNTRVJUKHNuICE9IHNmd19kYXRhLmZ3X3Nlc3Npb24pOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZzbi0+c25fYmF0Y2hlcykpIHsKIAkJYmF0Y2ggPSBsaXN0X2VudHJ5KHNuLT5zbl9iYXRjaGVzLm5leHQsCkBAIC02ODUsMTMgKzY4NSwxMyBAQAogewogCXNycGNfdGVzdF9yZXFzdF90ICpyZXEgPSAmbXNnLT5tc2dfYm9keS50ZXNfcmVxc3Q7CiAKLQlMQVNTRVJUIChtc2ctPm1zZ190eXBlID09IFNSUENfTVNHX1RFU1RfUkVRU1QpOwotCUxBU1NFUlQgKHJlcS0+dHNyX2lzX2NsaWVudCk7CisJTEFTU0VSVChtc2ctPm1zZ190eXBlID09IFNSUENfTVNHX1RFU1RfUkVRU1QpOworCUxBU1NFUlQocmVxLT50c3JfaXNfY2xpZW50KTsKIAogCWlmIChtc2ctPm1zZ19tYWdpYyA9PSBTUlBDX01TR19NQUdJQykKIAkJcmV0dXJuOyAvKiBubyBmbGlwcGluZyBuZWVkZWQgKi8KIAotCUxBU1NFUlQgKG1zZy0+bXNnX21hZ2ljID09IF9fc3dhYjMyKFNSUENfTVNHX01BR0lDKSk7CisJTEFTU0VSVChtc2ctPm1zZ19tYWdpYyA9PSBfX3N3YWIzMihTUlBDX01TR19NQUdJQykpOwogCiAJaWYgKHJlcS0+dHNyX3NlcnZpY2UgPT0gU1JQQ19TRVJWSUNFX0JSVykgewogCQlpZiAoKG1zZy0+bXNnX3Nlc19mZWF0cyAmIExTVF9GRUFUX0JVTEtfTEVOKSA9PSAwKSB7CkBAIC03MjEsMTIgKzcyMSwxMiBAQAogCQlyZXR1cm47CiAJfQogCi0JTEJVRyAoKTsKKwlMQlVHKCk7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgaW50Ci1zZndfYWRkX3Rlc3RfaW5zdGFuY2UgKHNmd19iYXRjaF90ICp0c2IsIHNycGNfc2VydmVyX3JwY190ICpycGMpCitzZndfYWRkX3Rlc3RfaW5zdGFuY2Uoc2Z3X2JhdGNoX3QgKnRzYiwgc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKIHsKIAlzcnBjX21zZ190CSAgKm1zZyA9ICZycGMtPnNycGNfcmVxc3RidWYtPmJ1Zl9tc2c7CiAJc3JwY190ZXN0X3JlcXN0X3QgICAqcmVxID0gJm1zZy0+bXNnX2JvZHkudGVzX3JlcXN0OwpAQCAtNzM5LDcgKzczOSw3IEBACiAKIAlMSUJDRlNfQUxMT0ModHNpLCBzaXplb2YoKnRzaSkpOwogCWlmICh0c2kgPT0gTlVMTCkgewotCQlDRVJST1IgKCJDYW4ndCBhbGxvY2F0ZSB0ZXN0IGluc3RhbmNlIGZvciBiYXRjaDogJWxsdVxuIiwKKwkJQ0VSUk9SKCJDYW4ndCBhbGxvY2F0ZSB0ZXN0IGluc3RhbmNlIGZvciBiYXRjaDogJWxsdVxuIiwKIAkJCXRzYi0+YmF0X2lkLmJhdF9pZCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTc2NCw3ICs3NjQsNyBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JTEFTU0VSVCAoIXNmd19iYXRjaF9hY3RpdmUodHNiKSk7CisJTEFTU0VSVCghc2Z3X2JhdGNoX2FjdGl2ZSh0c2IpKTsKIAogCWlmICghdHNpLT50c2lfaXNfY2xpZW50KSB7CiAJCS8qIGl0J3MgdGVzdCBzZXJ2ZXIsIGp1c3QgYWRkIGl0IHRvIHRzYiAqLwpAQCAtNzcyLDggKzc3Miw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCUxBU1NFUlQgKGJrICE9IE5VTEwpOwotCUxBU1NFUlQgKGJrLT5ia19uaW92ICogU0ZXX0lEX1BFUl9QQUdFID49ICh1bnNpZ25lZCBpbnQpbmRlc3QpOworCUxBU1NFUlQoYmsgIT0gTlVMTCk7CisJTEFTU0VSVChiay0+YmtfbmlvdiAqIFNGV19JRF9QRVJfUEFHRSA+PSAodW5zaWduZWQgaW50KW5kZXN0KTsKIAlMQVNTRVJUKCh1bnNpZ25lZCBpbnQpYmstPmJrX2xlbiA+PQogCQlzaXplb2YobG5ldF9wcm9jZXNzX2lkX3BhY2tlZF90KSAqIG5kZXN0KTsKIApAQCAtNzg2LDcgKzc4Niw3IEBACiAJCWludAkJICAgICAgIGo7CiAKIAkJZGVzdHMgPSBwYWdlX2FkZHJlc3MoYmstPmJrX2lvdnNbaSAvIFNGV19JRF9QRVJfUEFHRV0ua2lvdl9wYWdlKTsKLQkJTEFTU0VSVCAoZGVzdHMgIT0gTlVMTCk7ICAvKiBteSBwYWdlcyBhcmUgd2l0aGluIEtWTSBhbHdheXMgKi8KKwkJTEFTU0VSVChkZXN0cyAhPSBOVUxMKTsgIC8qIG15IHBhZ2VzIGFyZSB3aXRoaW4gS1ZNIGFsd2F5cyAqLwogCQlpZCA9IGRlc3RzW2kgJSBTRldfSURfUEVSX1BBR0VdOwogCQlpZiAobXNnLT5tc2dfbWFnaWMgIT0gU1JQQ19NU0dfTUFHSUMpCiAJCQlzZndfdW5wYWNrX2lkKGlkKTsKQEAgLTc5NSw3ICs3OTUsNyBAQAogCQkJTElCQ0ZTX0FMTE9DKHRzdSwgc2l6ZW9mKHNmd190ZXN0X3VuaXRfdCkpOwogCQkJaWYgKHRzdSA9PSBOVUxMKSB7CiAJCQkJcmMgPSAtRU5PTUVNOwotCQkJCUNFUlJPUiAoIkNhbid0IGFsbG9jYXRlIHRzdSBmb3IgJWRcbiIsCisJCQkJQ0VSUk9SKCJDYW4ndCBhbGxvY2F0ZSB0c3UgZm9yICVkXG4iLAogCQkJCQl0c2ktPnRzaV9zZXJ2aWNlKTsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQpAQCAtODE1LDE5ICs4MTUsMTkgQEAKIAl9CiAKIGVycm9yOgotCUxBU1NFUlQgKHJjICE9IDApOworCUxBU1NFUlQocmMgIT0gMCk7CiAJc2Z3X2Rlc3Ryb3lfdGVzdF9pbnN0YW5jZSh0c2kpOwogCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQKLXNmd190ZXN0X3VuaXRfZG9uZSAoc2Z3X3Rlc3RfdW5pdF90ICp0c3UpCitzZndfdGVzdF91bml0X2RvbmUoc2Z3X3Rlc3RfdW5pdF90ICp0c3UpCiB7CiAJc2Z3X3Rlc3RfaW5zdGFuY2VfdCAqdHNpID0gdHN1LT50c3VfaW5zdGFuY2U7CiAJc2Z3X2JhdGNoX3QJICp0c2IgPSB0c2ktPnRzaV9iYXRjaDsKIAlzZndfc2Vzc2lvbl90ICAgICAgICpzbiA9IHRzYi0+YmF0X3Nlc3Npb247CiAKLQlMQVNTRVJUIChzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJTEFTU0VSVChzZndfdGVzdF9hY3RpdmUodHNpKSk7CiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnRzaS0+dHNpX25hY3RpdmUpKQogCQlyZXR1cm47CkBAIC04NDcsOSArODQ3LDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCUxBU1NFUlQgKCFsaXN0X2VtcHR5KCZzbi0+c25fbGlzdCkpOyAvKiBJJ20gYSB6b21iaWUhICovCisJTEFTU0VSVCghbGlzdF9lbXB0eSgmc24tPnNuX2xpc3QpKTsgLyogSSdtIGEgem9tYmllISAqLwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNiLCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2IsICZzbi0+c25fYmF0Y2hlcywgYmF0X2xpc3QpIHsKIAkJaWYgKHNmd19iYXRjaF9hY3RpdmUodHNiKSkgewogCQkJc3Bpbl91bmxvY2soJnNmd19kYXRhLmZ3X2xvY2spOwogCQkJcmV0dXJuOwpAQCAtODY0LDcgKzg2NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zZndfdGVzdF9ycGNfZG9uZSAoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKK3Nmd190ZXN0X3JwY19kb25lKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJc2Z3X3Rlc3RfdW5pdF90ICAgICAqdHN1ID0gcnBjLT5jcnBjX3ByaXY7CiAJc2Z3X3Rlc3RfaW5zdGFuY2VfdCAqdHNpID0gdHN1LT50c3VfaW5zdGFuY2U7CkBAIC04NzQsOCArODc0LDggQEAKIAogCXNwaW5fbG9jaygmdHNpLT50c2lfbG9jayk7CiAKLQlMQVNTRVJUIChzZndfdGVzdF9hY3RpdmUodHNpKSk7Ci0JTEFTU0VSVCAoIWxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7CisJTEFTU0VSVChzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJTEFTU0VSVCghbGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKIAogCWxpc3RfZGVsX2luaXQoJnJwYy0+Y3JwY19saXN0KTsKIApAQCAtOTA5LDEzICs5MDksMTMgQEAKIAogCXNwaW5fbG9jaygmdHNpLT50c2lfbG9jayk7CiAKLQlMQVNTRVJUIChzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJTEFTU0VSVChzZndfdGVzdF9hY3RpdmUodHNpKSk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnRzaS0+dHNpX2ZyZWVfcnBjcykpIHsKIAkJLyogcGljayByZXF1ZXN0IGZyb20gYnVmZmVyICovCiAJCXJwYyA9IGxpc3RfZW50cnkodHNpLT50c2lfZnJlZV9ycGNzLm5leHQsCiAJCQkJICAgICBzcnBjX2NsaWVudF9ycGNfdCwgY3JwY19saXN0KTsKLQkJTEFTU0VSVCAobmJsayA9PSBycGMtPmNycGNfYnVsay5ia19uaW92KTsKKwkJTEFTU0VSVChuYmxrID09IHJwYy0+Y3JwY19idWxrLmJrX25pb3YpOwogCQlsaXN0X2RlbF9pbml0KCZycGMtPmNycGNfbGlzdCk7CiAJfQogCkBAIC05NDMsMjAgKzk0MywyMCBAQAogfQogCiBzdGF0aWMgaW50Ci1zZndfcnVuX3Rlc3QgKHN3aV93b3JraXRlbV90ICp3aSkKK3Nmd19ydW5fdGVzdChzd2lfd29ya2l0ZW1fdCAqd2kpCiB7CiAJc2Z3X3Rlc3RfdW5pdF90ICAgICAqdHN1ID0gd2ktPnN3aV93b3JraXRlbS53aV9kYXRhOwogCXNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSA9IHRzdS0+dHN1X2luc3RhbmNlOwogCXNycGNfY2xpZW50X3JwY190ICAgKnJwYyA9IE5VTEw7CiAKLQlMQVNTRVJUICh3aSA9PSAmdHN1LT50c3Vfd29ya2VyKTsKKwlMQVNTRVJUKHdpID09ICZ0c3UtPnRzdV93b3JrZXIpOwogCiAJaWYgKHRzaS0+dHNpX29wcy0+dHNvX3ByZXBfcnBjKHRzdSwgdHN1LT50c3VfZGVzdCwgJnJwYykgIT0gMCkgewotCQlMQVNTRVJUIChycGMgPT0gTlVMTCk7CisJCUxBU1NFUlQocnBjID09IE5VTEwpOwogCQlnb3RvIHRlc3RfZG9uZTsKIAl9CiAKLQlMQVNTRVJUIChycGMgIT0gTlVMTCk7CisJTEFTU0VSVChycGMgIT0gTlVMTCk7CiAKIAlzcGluX2xvY2soJnRzaS0+dHNpX2xvY2spOwogCkBAIC05OTMsNyArOTkzLDcgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X3J1bl9iYXRjaCAoc2Z3X2JhdGNoX3QgKnRzYikKK3Nmd19ydW5fYmF0Y2goc2Z3X2JhdGNoX3QgKnRzYikKIHsKIAlzd2lfd29ya2l0ZW1fdCAgICAgICp3aTsKIAlzZndfdGVzdF91bml0X3QgICAgICp0c3U7CkBAIC0xMDA1LDE2ICsxMDA1LDE2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzaSwgJnRzYi0+YmF0X3Rlc3RzLCB0c2lfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodHNpLCAmdHNiLT5iYXRfdGVzdHMsIHRzaV9saXN0KSB7CiAJCWlmICghdHNpLT50c2lfaXNfY2xpZW50KSAvKiBza2lwIHNlcnZlciBpbnN0YW5jZXMgKi8KIAkJCWNvbnRpbnVlOwogCi0JCUxBU1NFUlQgKCF0c2ktPnRzaV9zdG9wcGluZyk7Ci0JCUxBU1NFUlQgKCFzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJCUxBU1NFUlQoIXRzaS0+dHNpX3N0b3BwaW5nKTsKKwkJTEFTU0VSVCghc2Z3X3Rlc3RfYWN0aXZlKHRzaSkpOwogCiAJCWF0b21pY19pbmMoJnRzYi0+YmF0X25hY3RpdmUpOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzdSwgJnRzaS0+dHNpX3VuaXRzLCB0c3VfbGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRzdSwgJnRzaS0+dHNpX3VuaXRzLCB0c3VfbGlzdCkgewogCQkJYXRvbWljX2luYygmdHNpLT50c2lfbmFjdGl2ZSk7CiAJCQl0c3UtPnRzdV9sb29wID0gdHNpLT50c2lfbG9vcDsKIAkJCXdpID0gJnRzdS0+dHN1X3dvcmtlcjsKQEAgLTEwMjksNyArMTAyOSw3IEBACiB9CiAKIGludAotc2Z3X3N0b3BfYmF0Y2ggKHNmd19iYXRjaF90ICp0c2IsIGludCBmb3JjZSkKK3Nmd19zdG9wX2JhdGNoKHNmd19iYXRjaF90ICp0c2IsIGludCBmb3JjZSkKIHsKIAlzZndfdGVzdF9pbnN0YW5jZV90ICp0c2k7CiAJc3JwY19jbGllbnRfcnBjX3QgICAqcnBjOwpAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNpLCAmdHNiLT5iYXRfdGVzdHMsIHRzaV9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2ksICZ0c2ItPmJhdF90ZXN0cywgdHNpX2xpc3QpIHsKIAkJc3Bpbl9sb2NrKCZ0c2ktPnRzaV9sb2NrKTsKIAogCQlpZiAoIXRzaS0+dHNpX2lzX2NsaWVudCB8fApAQCAtMTA3MSw3ICsxMDcxLDcgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X3F1ZXJ5X2JhdGNoIChzZndfYmF0Y2hfdCAqdHNiLCBpbnQgdGVzdGlkeCwgc3JwY19iYXRjaF9yZXBseV90ICpyZXBseSkKK3Nmd19xdWVyeV9iYXRjaChzZndfYmF0Y2hfdCAqdHNiLCBpbnQgdGVzdGlkeCwgc3JwY19iYXRjaF9yZXBseV90ICpyZXBseSkKIHsKIAlzZndfdGVzdF9pbnN0YW5jZV90ICp0c2k7CiAKQEAgLTEwODMsNyArMTA4Myw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzaSwgJnRzYi0+YmF0X3Rlc3RzLCB0c2lfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodHNpLCAmdHNiLT5iYXRfdGVzdHMsIHRzaV9saXN0KSB7CiAJCWlmICh0ZXN0aWR4LS0gPiAxKQogCQkJY29udGludWU7CiAKQEAgLTEwOTUsNyArMTA5NSw3IEBACiB9CiAKIHZvaWQKLXNmd19mcmVlX3BhZ2VzIChzcnBjX3NlcnZlcl9ycGNfdCAqcnBjKQorc2Z3X2ZyZWVfcGFnZXMoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKIHsKIAlzcnBjX2ZyZWVfYnVsayhycGMtPnNycGNfYnVsayk7CiAJcnBjLT5zcnBjX2J1bGsgPSBOVUxMOwpAQCAtMTExNiw3ICsxMTE2LDcgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X2FkZF90ZXN0IChzcnBjX3NlcnZlcl9ycGNfdCAqcnBjKQorc2Z3X2FkZF90ZXN0KHNycGNfc2VydmVyX3JwY190ICpycGMpCiB7CiAJc2Z3X3Nlc3Npb25fdCAgICAgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIAlzcnBjX3Rlc3RfcmVwbHlfdCAqcmVwbHkgPSAmcnBjLT5zcnBjX3JlcGx5bXNnLm1zZ19ib2R5LnRlc19yZXBseTsKQEAgLTExNDcsNyArMTE0Nyw3IEBACiAKIAliYXQgPSBzZndfYmlkMmJhdGNoKHJlcXVlc3QtPnRzcl9iaWQpOwogCWlmIChiYXQgPT0gTlVMTCkgewotCQlDRVJST1IgKCJEcm9wcGluZyBSUEMgKCVzKSBmcm9tICVzIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS5cbiIsCisJCUNFUlJPUigiRHJvcHBpbmcgUlBDICglcykgZnJvbSAlcyB1bmRlciBtZW1vcnkgcHJlc3N1cmUuXG4iLAogCQkJcnBjLT5zcnBjX3NjZC0+c2NkX3N2Yy0+c3ZfbmFtZSwKIAkJCWxpYmNmc19pZDJzdHIocnBjLT5zcnBjX3BlZXIpKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMTc1LDcgKzExNzUsNyBAQAogCX0KIAogCXJjID0gc2Z3X2FkZF90ZXN0X2luc3RhbmNlKGJhdCwgcnBjKTsKLQlDREVCVUcgKHJjID09IDAgPyBEX05FVCA6IERfV0FSTklORywKKwlDREVCVUcocmMgPT0gMCA/IERfTkVUIDogRF9XQVJOSU5HLAogCQkiJXMgdGVzdDogc3YgJWQgJXMsIGxvb3AgJWQsIGNvbmN1ciAlZCwgbmRlc3QgJWRcbiIsCiAJCXJjID09IDAgPyAiQWRkZWQiIDogIkZhaWxlZCB0byBhZGQiLCByZXF1ZXN0LT50c3Jfc2VydmljZSwKIAkJcmVxdWVzdC0+dHNyX2lzX2NsaWVudCA/ICJjbGllbnQiIDogInNlcnZlciIsCkBAIC0xMTg2LDcgKzExODYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZndfY29udHJvbF9iYXRjaCAoc3JwY19iYXRjaF9yZXFzdF90ICpyZXF1ZXN0LCBzcnBjX2JhdGNoX3JlcGx5X3QgKnJlcGx5KQorc2Z3X2NvbnRyb2xfYmF0Y2goc3JwY19iYXRjaF9yZXFzdF90ICpyZXF1ZXN0LCBzcnBjX2JhdGNoX3JlcGx5X3QgKnJlcGx5KQogewogCXNmd19zZXNzaW9uX3QgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIAlpbnQJICAgIHJjID0gMDsKQEAgLTEyODUsNyArMTI4NSw3IEBACiAKIAlzd2l0Y2ggKHN2LT5zdl9pZCkgewogCWRlZmF1bHQ6Ci0JCUxCVUcgKCk7CisJCUxCVUcoKTsKIAljYXNlIFNSUENfU0VSVklDRV9URVNUOgogCQlyYyA9IHNmd19hZGRfdGVzdChycGMpOwogCQlicmVhazsKQEAgLTEzODcsOCArMTM4Nyw4IEBACiAKIAlzcGluX2xvY2soJnNmd19kYXRhLmZ3X2xvY2spOwogCi0JTEFTU0VSVCAoIXNmd19kYXRhLmZ3X3NodXR0aW5nZG93bik7Ci0JTEFTU0VSVCAoc2VydmljZSA8PSBTUlBDX0ZSQU1FV09SS19TRVJWSUNFX01BWF9JRCk7CisJTEFTU0VSVCghc2Z3X2RhdGEuZndfc2h1dHRpbmdkb3duKTsKKwlMQVNTRVJUKHNlcnZpY2UgPD0gU1JQQ19GUkFNRVdPUktfU0VSVklDRV9NQVhfSUQpOwogCiAJaWYgKG5idWxraW92ID09IDAgJiYgIWxpc3RfZW1wdHkoJnNmd19kYXRhLmZ3X3pvbWJpZV9ycGNzKSkgewogCQlycGMgPSBsaXN0X2VudHJ5KHNmd19kYXRhLmZ3X3pvbWJpZV9ycGNzLm5leHQsCkBAIC0xNDE2LDEzICsxNDE2LDEzIEBACiB9CiAKIHZvaWQKLXNmd191bnBhY2tfbWVzc2FnZSAoc3JwY19tc2dfdCAqbXNnKQorc2Z3X3VucGFja19tZXNzYWdlKHNycGNfbXNnX3QgKm1zZykKIHsKIAlpZiAobXNnLT5tc2dfbWFnaWMgPT0gU1JQQ19NU0dfTUFHSUMpCiAJCXJldHVybjsgLyogbm8gZmxpcHBpbmcgbmVlZGVkICovCiAKIAkvKiBzcnBjIG1vZHVsZSBzaG91bGQgZ3VhcmFudGVlIEkgd291bGRuJ3QgZ2V0IGNyYXAgKi8KLQlMQVNTRVJUIChtc2ctPm1zZ19tYWdpYyA9PSBfX3N3YWIzMihTUlBDX01TR19NQUdJQykpOworCUxBU1NFUlQobXNnLT5tc2dfbWFnaWMgPT0gX19zd2FiMzIoU1JQQ19NU0dfTUFHSUMpKTsKIAogCWlmIChtc2ctPm1zZ190eXBlID09IFNSUENfTVNHX1NUQVRfUkVRU1QpIHsKIAkJc3JwY19zdGF0X3JlcXN0X3QgKnJlcSA9ICZtc2ctPm1zZ19ib2R5LnN0YXRfcmVxc3Q7CkBAIC0xNTU1LDEyICsxNTU1LDEyIEBACiAJCXJldHVybjsKIAl9CiAKLQlMQlVHICgpOworCUxCVUcoKTsKIAlyZXR1cm47CiB9CiAKIHZvaWQKLXNmd19hYm9ydF9ycGMgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzZndfYWJvcnRfcnBjKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJTEFTU0VSVChhdG9taWNfcmVhZCgmcnBjLT5jcnBjX3JlZmNvdW50KSA+IDApOwogCUxBU1NFUlQocnBjLT5jcnBjX3NlcnZpY2UgPD0gU1JQQ19GUkFNRVdPUktfU0VSVklDRV9NQVhfSUQpOwpAQCAtMTU3MiwxNCArMTU3MiwxNCBAQAogfQogCiB2b2lkCi1zZndfcG9zdF9ycGMgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzZndfcG9zdF9ycGMoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKIHsKIAlzcGluX2xvY2soJnJwYy0+Y3JwY19sb2NrKTsKIAotCUxBU1NFUlQgKCFycGMtPmNycGNfY2xvc2VkKTsKLQlMQVNTRVJUICghcnBjLT5jcnBjX2Fib3J0ZWQpOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7Ci0JTEFTU0VSVCAoIXNmd19kYXRhLmZ3X3NodXR0aW5nZG93bik7CisJTEFTU0VSVCghcnBjLT5jcnBjX2Nsb3NlZCk7CisJTEFTU0VSVCghcnBjLT5jcnBjX2Fib3J0ZWQpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKKwlMQVNTRVJUKCFzZndfZGF0YS5md19zaHV0dGluZ2Rvd24pOwogCiAJcnBjLT5jcnBjX3RpbWVvdXQgPSBycGNfdGltZW91dDsKIAlzcnBjX3Bvc3RfcnBjKHJwYyk7CkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogCiAKIGludAotc2Z3X3N0YXJ0dXAgKHZvaWQpCitzZndfc3RhcnR1cCh2b2lkKQogewogCWludAkgICAgICBpOwogCWludAkgICAgICByYzsKQEAgLTE2NDgsMTMgKzE2NDgsMTMgQEAKIAogCiAJaWYgKHNlc3Npb25fdGltZW91dCA8IDApIHsKLQkJQ0VSUk9SICgiU2Vzc2lvbiB0aW1lb3V0IG11c3QgYmUgbm9uLW5lZ2F0aXZlOiAlZFxuIiwKKwkJQ0VSUk9SKCJTZXNzaW9uIHRpbWVvdXQgbXVzdCBiZSBub24tbmVnYXRpdmU6ICVkXG4iLAogCQkJc2Vzc2lvbl90aW1lb3V0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHJwY190aW1lb3V0IDwgMCkgewotCQlDRVJST1IgKCJSUEMgdGltZW91dCBtdXN0IGJlIG5vbi1uZWdhdGl2ZTogJWRcbiIsCisJCUNFUlJPUigiUlBDIHRpbWVvdXQgbXVzdCBiZSBub24tbmVnYXRpdmU6ICVkXG4iLAogCQkJcnBjX3RpbWVvdXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNjc4LDIxICsxNjc4LDIxIEBACiAJYnJ3X2luaXRfdGVzdF9jbGllbnQoKTsKIAlicndfaW5pdF90ZXN0X3NlcnZpY2UoKTsKIAlyYyA9IHNmd19yZWdpc3Rlcl90ZXN0KCZicndfdGVzdF9zZXJ2aWNlLCAmYnJ3X3Rlc3RfY2xpZW50KTsKLQlMQVNTRVJUIChyYyA9PSAwKTsKKwlMQVNTRVJUKHJjID09IDApOwogCiAJcGluZ19pbml0X3Rlc3RfY2xpZW50KCk7CiAJcGluZ19pbml0X3Rlc3Rfc2VydmljZSgpOwogCXJjID0gc2Z3X3JlZ2lzdGVyX3Rlc3QoJnBpbmdfdGVzdF9zZXJ2aWNlLCAmcGluZ190ZXN0X2NsaWVudCk7Ci0JTEFTU0VSVCAocmMgPT0gMCk7CisJTEFTU0VSVChyYyA9PSAwKTsKIAogCWVycm9yID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh0c2MsICZzZndfZGF0YS5md190ZXN0cywgdHNjX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRzYywgJnNmd19kYXRhLmZ3X3Rlc3RzLCB0c2NfbGlzdCkgewogCQlzdiA9IHRzYy0+dHNjX3Nydl9zZXJ2aWNlOwogCiAJCXJjID0gc3JwY19hZGRfc2VydmljZShzdik7Ci0JCUxBU1NFUlQgKHJjICE9IC1FQlVTWSk7CisJCUxBU1NFUlQocmMgIT0gLUVCVVNZKTsKIAkJaWYgKHJjICE9IDApIHsKLQkJCUNXQVJOICgiRmFpbGVkIHRvIGFkZCAlcyBzZXJ2aWNlOiAlZFxuIiwKKwkJCUNXQVJOKCJGYWlsZWQgdG8gYWRkICVzIHNlcnZpY2U6ICVkXG4iLAogCQkJICAgICAgIHN2LT5zdl9uYW1lLCByYyk7CiAJCQllcnJvciA9IHJjOwogCQl9CkBAIC0xNzA5LDkgKzE3MDksOSBAQAogCQkJc3YtPnN2X2J1bGtfcmVhZHkgPSBzZndfYnVsa19yZWFkeTsKIAogCQlyYyA9IHNycGNfYWRkX3NlcnZpY2Uoc3YpOwotCQlMQVNTRVJUIChyYyAhPSAtRUJVU1kpOworCQlMQVNTRVJUKHJjICE9IC1FQlVTWSk7CiAJCWlmIChyYyAhPSAwKSB7Ci0JCQlDV0FSTiAoIkZhaWxlZCB0byBhZGQgJXMgc2VydmljZTogJWRcbiIsCisJCQlDV0FSTigiRmFpbGVkIHRvIGFkZCAlcyBzZXJ2aWNlOiAlZFxuIiwKIAkJCSAgICAgICBzdi0+c3ZfbmFtZSwgcmMpOwogCQkJZXJyb3IgPSByYzsKIAkJfQpAQCAtMTczMyw3ICsxNzMzLDcgQEAKIH0KIAogdm9pZAotc2Z3X3NodXRkb3duICh2b2lkKQorc2Z3X3NodXRkb3duKHZvaWQpCiB7CiAJc3JwY19zZXJ2aWNlX3QJKnN2OwogCXNmd190ZXN0X2Nhc2VfdAkqdHNjOwpAQCAtMTc2Niw3ICsxNzY2LDcgQEAKIAkJc3JwY19yZW1vdmVfc2VydmljZShzdik7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNjLCAmc2Z3X2RhdGEuZndfdGVzdHMsIHRzY19saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2MsICZzZndfZGF0YS5md190ZXN0cywgdHNjX2xpc3QpIHsKIAkJc3YgPSB0c2MtPnRzY19zcnZfc2VydmljZTsKIAkJc3JwY19zaHV0ZG93bl9zZXJ2aWNlKHN2KTsKIAkJc3JwY19yZW1vdmVfc2VydmljZShzdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvbW9kdWxlLmMKaW5kZXggZmFmNDA5OC4uN2FkNjJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9tb2R1bGUuYwpAQCAtODcsNyArODcsNiBAQAogCWRlZmF1bHQ6CiAJCUxCVUcoKTsKIAl9Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcGluZ190ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcGluZ190ZXN0LmMKaW5kZXggZDhjMGRmNi4uNjQ0MDY5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3BpbmdfdGVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9waW5nX3Rlc3QuYwpAQCAtNzAsMTkgKzcwLDE5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1waW5nX2NsaWVudF9maW5pIChzZndfdGVzdF9pbnN0YW5jZV90ICp0c2kpCitwaW5nX2NsaWVudF9maW5pKHNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSkKIHsKIAlzZndfc2Vzc2lvbl90ICpzbiA9IHRzaS0+dHNpX2JhdGNoLT5iYXRfc2Vzc2lvbjsKIAlpbnQJICAgIGVycm9yczsKIAotCUxBU1NFUlQgKHNuICE9IE5VTEwpOwotCUxBU1NFUlQgKHRzaS0+dHNpX2lzX2NsaWVudCk7CisJTEFTU0VSVChzbiAhPSBOVUxMKTsKKwlMQVNTRVJUKHRzaS0+dHNpX2lzX2NsaWVudCk7CiAKIAllcnJvcnMgPSBhdG9taWNfcmVhZCgmc24tPnNuX3BpbmdfZXJyb3JzKTsKIAlpZiAoZXJyb3JzKQotCQlDV0FSTiAoIiVkIHBpbmdzIGhhdmUgZmFpbGVkLlxuIiwgZXJyb3JzKTsKKwkJQ1dBUk4oIiVkIHBpbmdzIGhhdmUgZmFpbGVkLlxuIiwgZXJyb3JzKTsKIAllbHNlCi0JCUNERUJVRyAoRF9ORVQsICJQaW5nIHRlc3QgZmluaXNoZWQgT0suXG4iKTsKKwkJQ0RFQlVHKERfTkVULCAiUGluZyB0ZXN0IGZpbmlzaGVkIE9LLlxuIik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTExOCw3ICsxMTgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcGluZ19jbGllbnRfZG9uZV9ycGMgKHNmd190ZXN0X3VuaXRfdCAqdHN1LCBzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQorcGluZ19jbGllbnRfZG9uZV9ycGMoc2Z3X3Rlc3RfdW5pdF90ICp0c3UsIHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJc2Z3X3Rlc3RfaW5zdGFuY2VfdCAqdHNpID0gdHN1LT50c3VfaW5zdGFuY2U7CiAJc2Z3X3Nlc3Npb25fdCAgICAgICAqc24gPSB0c2ktPnRzaV9iYXRjaC0+YmF0X3Nlc3Npb247CkBAIC0xMjYsMTIgKzEyNiwxMiBAQAogCXNycGNfcGluZ19yZXBseV90ICAgKnJlcGx5ID0gJnJwYy0+Y3JwY19yZXBseW1zZy5tc2dfYm9keS5waW5nX3JlcGx5OwogCXN0cnVjdCB0aW1ldmFsICAgICAgIHR2OwogCi0JTEFTU0VSVCAoc24gIT0gTlVMTCk7CisJTEFTU0VSVChzbiAhPSBOVUxMKTsKIAogCWlmIChycGMtPmNycGNfc3RhdHVzICE9IDApIHsKIAkJaWYgKCF0c2ktPnRzaV9zdG9wcGluZykgLyogcnBjIGNvdWxkIGhhdmUgYmVlbiBhYm9ydGVkICovCiAJCQlhdG9taWNfaW5jKCZzbi0+c25fcGluZ19lcnJvcnMpOwotCQlDRVJST1IgKCJVbmFibGUgdG8gcGluZyAlcyAoJWQpOiAlZFxuIiwKKwkJQ0VSUk9SKCJVbmFibGUgdG8gcGluZyAlcyAoJWQpOiAlZFxuIiwKIAkJCWxpYmNmc19pZDJzdHIocnBjLT5jcnBjX2Rlc3QpLAogCQkJcmVxc3QtPnBucl9zZXEsIHJwYy0+Y3JwY19zdGF0dXMpOwogCQlyZXR1cm47CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlpZiAocmVwbHktPnBucl9tYWdpYyAhPSBMU1RfUElOR19URVNUX01BR0lDKSB7CiAJCXJwYy0+Y3JwY19zdGF0dXMgPSAtRUJBRE1TRzsKIAkJYXRvbWljX2luYygmc24tPnNuX3BpbmdfZXJyb3JzKTsKLQkJQ0VSUk9SICgiQmFkIG1hZ2ljICV1IGZyb20gJXMsICV1IGV4cGVjdGVkLlxuIiwKKwkJQ0VSUk9SKCJCYWQgbWFnaWMgJXUgZnJvbSAlcywgJXUgZXhwZWN0ZWQuXG4iLAogCQkJcmVwbHktPnBucl9tYWdpYywgbGliY2ZzX2lkMnN0cihycGMtPmNycGNfZGVzdCksCiAJCQlMU1RfUElOR19URVNUX01BR0lDKTsKIAkJcmV0dXJuOwpAQCAtMTU1LDE0ICsxNTUsMTQgQEAKIAlpZiAocmVwbHktPnBucl9zZXEgIT0gcmVxc3QtPnBucl9zZXEpIHsKIAkJcnBjLT5jcnBjX3N0YXR1cyA9IC1FQkFETVNHOwogCQlhdG9taWNfaW5jKCZzbi0+c25fcGluZ19lcnJvcnMpOwotCQlDRVJST1IgKCJCYWQgc2VxICV1IGZyb20gJXMsICV1IGV4cGVjdGVkLlxuIiwKKwkJQ0VSUk9SKCJCYWQgc2VxICV1IGZyb20gJXMsICV1IGV4cGVjdGVkLlxuIiwKIAkJCXJlcGx5LT5wbnJfc2VxLCBsaWJjZnNfaWQyc3RyKHJwYy0+Y3JwY19kZXN0KSwKIAkJCXJlcXN0LT5wbnJfc2VxKTsKIAkJcmV0dXJuOwogCX0KIAogCWNmc19mc190aW1ldmFsKCZ0dik7Ci0JQ0RFQlVHIChEX05FVCwgIiVkIHJlcGx5IGluICV1IHVzZWNcbiIsIHJlcGx5LT5wbnJfc2VxLAorCUNERUJVRyhEX05FVCwgIiVkIHJlcGx5IGluICV1IHVzZWNcbiIsIHJlcGx5LT5wbnJfc2VxLAogCQkodW5zaWduZWQpKCh0di50dl9zZWMgLSAodW5zaWduZWQpcmVxc3QtPnBucl90aW1lX3NlYykgKiAxMDAwMDAwCiAJCQkgICArICh0di50dl91c2VjIC0gcmVxc3QtPnBucl90aW1lX3VzZWMpKSk7CiAJcmV0dXJuOwpAQCAtMTc3LDIwICsxNzcsMjAgQEAKIAlzcnBjX3BpbmdfcmVxc3RfdCAqcmVxID0gJnJlcXN0bXNnLT5tc2dfYm9keS5waW5nX3JlcXN0OwogCXNycGNfcGluZ19yZXBseV90ICpyZXAgPSAmcnBjLT5zcnBjX3JlcGx5bXNnLm1zZ19ib2R5LnBpbmdfcmVwbHk7CiAKLQlMQVNTRVJUIChzdi0+c3ZfaWQgPT0gU1JQQ19TRVJWSUNFX1BJTkcpOworCUxBU1NFUlQoc3YtPnN2X2lkID09IFNSUENfU0VSVklDRV9QSU5HKTsKIAogCWlmIChyZXFzdG1zZy0+bXNnX21hZ2ljICE9IFNSUENfTVNHX01BR0lDKSB7Ci0JCUxBU1NFUlQgKHJlcXN0bXNnLT5tc2dfbWFnaWMgPT0gX19zd2FiMzIoU1JQQ19NU0dfTUFHSUMpKTsKKwkJTEFTU0VSVChyZXFzdG1zZy0+bXNnX21hZ2ljID09IF9fc3dhYjMyKFNSUENfTVNHX01BR0lDKSk7CiAKIAkJX19zd2FiMzJzKCZyZXEtPnBucl9zZXEpOwogCQlfX3N3YWIzMnMoJnJlcS0+cG5yX21hZ2ljKTsKIAkJX19zd2FiNjRzKCZyZXEtPnBucl90aW1lX3NlYyk7CiAJCV9fc3dhYjY0cygmcmVxLT5wbnJfdGltZV91c2VjKTsKIAl9Ci0JTEFTU0VSVCAocmVxc3Rtc2ctPm1zZ190eXBlID09IHNycGNfc2VydmljZTJyZXF1ZXN0KHN2LT5zdl9pZCkpOworCUxBU1NFUlQocmVxc3Rtc2ctPm1zZ190eXBlID09IHNycGNfc2VydmljZTJyZXF1ZXN0KHN2LT5zdl9pZCkpOwogCiAJaWYgKHJlcS0+cG5yX21hZ2ljICE9IExTVF9QSU5HX1RFU1RfTUFHSUMpIHsKLQkJQ0VSUk9SICgiVW5leHBlY3RlZCBtYWdpYyAlMDh4IGZyb20gJXNcbiIsCisJCUNFUlJPUigiVW5leHBlY3RlZCBtYWdpYyAlMDh4IGZyb20gJXNcbiIsCiAJCQlyZXEtPnBucl9tYWdpYywgbGliY2ZzX2lkMnN0cihycGMtPnNycGNfcGVlcikpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMKaW5kZXggMWY3ZDlhNi4uMDgwNzg4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYwpAQCAtNzEsMTYgKzcxLDE2IEBACiB9CiAKIC8qIGZvcndhcmQgcmVmJ3MgKi8KLWludCBzcnBjX2hhbmRsZV9ycGMgKHN3aV93b3JraXRlbV90ICp3aSk7CitpbnQgc3JwY19oYW5kbGVfcnBjKHN3aV93b3JraXRlbV90ICp3aSk7CiAKLXZvaWQgc3JwY19nZXRfY291bnRlcnMgKHNycGNfY291bnRlcnNfdCAqY250KQordm9pZCBzcnBjX2dldF9jb3VudGVycyhzcnBjX2NvdW50ZXJzX3QgKmNudCkKIHsKIAlzcGluX2xvY2soJnNycGNfZGF0YS5ycGNfZ2xvY2spOwogCSpjbnQgPSBzcnBjX2RhdGEucnBjX2NvdW50ZXJzOwogCXNwaW5fdW5sb2NrKCZzcnBjX2RhdGEucnBjX2dsb2NrKTsKIH0KIAotdm9pZCBzcnBjX3NldF9jb3VudGVycyAoY29uc3Qgc3JwY19jb3VudGVyc190ICpjbnQpCit2b2lkIHNycGNfc2V0X2NvdW50ZXJzKGNvbnN0IHNycGNfY291bnRlcnNfdCAqY250KQogewogCXNwaW5fbG9jaygmc3JwY19kYXRhLnJwY19nbG9jayk7CiAJc3JwY19kYXRhLnJwY19jb3VudGVycyA9ICpjbnQ7CkBAIC0xMDIsMTYgKzEwMiwxNyBAQAogfQogCiB2b2lkCi1zcnBjX2ZyZWVfYnVsayAoc3JwY19idWxrX3QgKmJrKQorc3JwY19mcmVlX2J1bGsoc3JwY19idWxrX3QgKmJrKQogewogCWludAkgaTsKIAlzdHJ1Y3QgcGFnZSAqcGc7CiAKLQlMQVNTRVJUIChiayAhPSBOVUxMKTsKKwlMQVNTRVJUKGJrICE9IE5VTEwpOwogCiAJZm9yIChpID0gMDsgaSA8IGJrLT5ia19uaW92OyBpKyspIHsKIAkJcGcgPSBiay0+YmtfaW92c1tpXS5raW92X3BhZ2U7Ci0JCWlmIChwZyA9PSBOVUxMKSBicmVhazsKKwkJaWYgKHBnID09IE5VTEwpCisJCQlicmVhazsKIAogCQlfX2ZyZWVfcGFnZShwZyk7CiAJfQpAQCAtMTYwLDcgKzE2MSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgX191NjQKLXNycGNfbmV4dF9pZCAodm9pZCkKK3NycGNfbmV4dF9pZCh2b2lkKQogewogCV9fdTY0IGlkOwogCkBAIC0zMzUsNyArMzM2LDcgQEAKIH0KIAogaW50Ci1zcnBjX3JlbW92ZV9zZXJ2aWNlIChzcnBjX3NlcnZpY2VfdCAqc3YpCitzcnBjX3JlbW92ZV9zZXJ2aWNlKHNycGNfc2VydmljZV90ICpzdikKIHsKIAlpbnQgaWQgPSBzdi0+c3ZfaWQ7CiAKQEAgLTM2Myw4ICszNjQsOCBAQAogCXJjID0gTE5ldE1FQXR0YWNoKHBvcnRhbCwgcGVlciwgbWF0Y2hiaXRzLCAwLCBMTkVUX1VOTElOSywKIAkJCSAgbG9jYWwgPyBMTkVUX0lOU19MT0NBTCA6IExORVRfSU5TX0FGVEVSLCAmbWVoKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJMTmV0TUVBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOwotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJQ0VSUk9SKCJMTmV0TUVBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTM3NywxNSArMzc4LDE1IEBACiAKIAlyYyA9IExOZXRNREF0dGFjaChtZWgsIG1kLCBMTkVUX1VOTElOSywgbWRoKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJMTmV0TURBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOwotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJQ0VSUk9SKCJMTmV0TURBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCiAJCXJjID0gTE5ldE1FVW5saW5rKG1laCk7Ci0JCUxBU1NFUlQgKHJjID09IDApOworCQlMQVNTRVJUKHJjID09IDApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlDREVCVUcgKERfTkVULAorCUNERUJVRyhEX05FVCwKIAkJIlBvc3RlZCBwYXNzaXZlIFJETUE6IHBlZXIgJXMsIHBvcnRhbCAlZCwgbWF0Y2hiaXRzICUjbGx4XG4iLAogCQlsaWJjZnNfaWQyc3RyKHBlZXIpLCBwb3J0YWwsIG1hdGNoYml0cyk7CiAJcmV0dXJuIDA7CkBAIC00MDgsOCArNDA5LDggQEAKIAogCXJjID0gTE5ldE1EQmluZChtZCwgTE5FVF9VTkxJTkssIG1kaCk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiTE5ldE1EQmluZCBmYWlsZWQ6ICVkXG4iLCByYyk7Ci0JCUxBU1NFUlQgKHJjID09IC1FTk9NRU0pOworCQlDRVJST1IoIkxOZXRNREJpbmQgZmFpbGVkOiAlZFxuIiwgcmMpOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQyMCwxMyArNDIxLDEzIEBACiAJCXJjID0gTE5ldFB1dChzZWxmLCAqbWRoLCBMTkVUX05PQUNLX1JFUSwgcGVlciwKIAkJCSAgICAgcG9ydGFsLCBtYXRjaGJpdHMsIDAsIDApOwogCX0gZWxzZSB7Ci0JCUxBU1NFUlQgKChvcHRpb25zICYgTE5FVF9NRF9PUF9HRVQpICE9IDApOworCQlMQVNTRVJUKChvcHRpb25zICYgTE5FVF9NRF9PUF9HRVQpICE9IDApOwogCiAJCXJjID0gTE5ldEdldChzZWxmLCAqbWRoLCBwZWVyLCBwb3J0YWwsIG1hdGNoYml0cywgMCk7CiAJfQogCiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiTE5ldCVzKCVzLCAlZCwgJWxsZCkgZmFpbGVkOiAlZFxuIiwKKwkJQ0VSUk9SKCJMTmV0JXMoJXMsICVkLCAlbGxkKSBmYWlsZWQ6ICVkXG4iLAogCQkJKChvcHRpb25zICYgTE5FVF9NRF9PUF9QVVQpICE9IDApID8gIlB1dCIgOiAiR2V0IiwKIAkJCWxpYmNmc19pZDJzdHIocGVlciksIHBvcnRhbCwgbWF0Y2hiaXRzLCByYyk7CiAKQEAgLTQzNCw5ICs0MzUsOSBAQAogCQkgKiB3aXRoIGZhaWx1cmUsIHNvIGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIHN1Y2Nlc3MgaGVyZS4KIAkJICovCiAJCXJjID0gTE5ldE1EVW5saW5rKCptZGgpOwotCQlMQVNTRVJUIChyYyA9PSAwKTsKKwkJTEFTU0VSVChyYyA9PSAwKTsKIAl9IGVsc2UgewotCQlDREVCVUcgKERfTkVULAorCQlDREVCVUcoRF9ORVQsCiAJCQkiUG9zdGVkIGFjdGl2ZSBSRE1BOiBwZWVyICVzLCBwb3J0YWwgJXUsIG1hdGNoYml0cyAlI2xseFxuIiwKIAkJCWxpYmNmc19pZDJzdHIocGVlciksIHBvcnRhbCwgbWF0Y2hiaXRzKTsKIAl9CkBAIC03ODgsNyArNzg5LDcgQEAKIH0KIAogc3RhdGljIGludAotc3JwY19zZW5kX3JlcXVlc3QgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzcnBjX3NlbmRfcmVxdWVzdChzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewogCXNycGNfZXZlbnRfdCAqZXYgPSAmcnBjLT5jcnBjX3JlcXN0ZXY7CiAJaW50CSAgIHJjOwpAQCAtODAxLDE0ICs4MDIsMTQgQEAKIAkJCQkgICAgICZycGMtPmNycGNfcmVxc3Rtc2csIHNpemVvZihzcnBjX21zZ190KSwKIAkJCQkgICAgICZycGMtPmNycGNfcmVxc3RtZGgsIGV2KTsKIAlpZiAocmMgIT0gMCkgewotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJTEFTU0VSVChyYyA9PSAtRU5PTUVNKTsKIAkJZXYtPmV2X2ZpcmVkID0gMTsgIC8qIG5vIG1vcmUgZXZlbnQgZXhwZWN0ZWQgKi8KIAl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50Ci1zcnBjX3ByZXBhcmVfcmVwbHkgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzcnBjX3ByZXBhcmVfcmVwbHkoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKIHsKIAlzcnBjX2V2ZW50X3QgKmV2ID0gJnJwYy0+Y3JwY19yZXBseWV2OwogCV9fdTY0CSppZCA9ICZycGMtPmNycGNfcmVxc3Rtc2cubXNnX2JvZHkucmVxc3QucnB5aWQ7CkBAIC04MjUsMTQgKzgyNiwxNCBAQAogCQkJCSAgICBMTkVUX01EX09QX1BVVCwgcnBjLT5jcnBjX2Rlc3QsCiAJCQkJICAgICZycGMtPmNycGNfcmVwbHltZGgsIGV2KTsKIAlpZiAocmMgIT0gMCkgewotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJTEFTU0VSVChyYyA9PSAtRU5PTUVNKTsKIAkJZXYtPmV2X2ZpcmVkID0gMTsgIC8qIG5vIG1vcmUgZXZlbnQgZXhwZWN0ZWQgKi8KIAl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50Ci1zcnBjX3ByZXBhcmVfYnVsayAoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKK3NycGNfcHJlcGFyZV9idWxrKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJc3JwY19idWxrX3QgICpiayA9ICZycGMtPmNycGNfYnVsazsKIAlzcnBjX2V2ZW50X3QgKmV2ID0gJnJwYy0+Y3JwY19idWxrZXY7CkBAIC04NDAsOSArODQxLDEwIEBACiAJaW50CSAgIHJjOwogCWludAkgICBvcHQ7CiAKLQlMQVNTRVJUIChiay0+YmtfbmlvdiA8PSBMTkVUX01BWF9JT1YpOworCUxBU1NFUlQoYmstPmJrX25pb3YgPD0gTE5FVF9NQVhfSU9WKTsKIAotCWlmIChiay0+YmtfbmlvdiA9PSAwKSByZXR1cm4gMDsgLyogbm90aGluZyB0byBkbyAqLworCWlmIChiay0+YmtfbmlvdiA9PSAwKQorCQlyZXR1cm4gMDsgLyogbm90aGluZyB0byBkbyAqLwogCiAJb3B0ID0gYmstPmJrX3NpbmsgPyBMTkVUX01EX09QX1BVVCA6IExORVRfTURfT1BfR0VUOwogCW9wdCB8PSBMTkVUX01EX0tJT1Y7CkBAIC04NTcsMTQgKzg1OSwxNCBAQAogCQkJCSAgICAmYmstPmJrX2lvdnNbMF0sIGJrLT5ia19uaW92LCBvcHQsCiAJCQkJICAgIHJwYy0+Y3JwY19kZXN0LCAmYmstPmJrX21kaCwgZXYpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUxBU1NFUlQgKHJjID09IC1FTk9NRU0pOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCQlldi0+ZXZfZmlyZWQgPSAxOyAgLyogbm8gbW9yZSBldmVudCBleHBlY3RlZCAqLwogCX0KIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQKLXNycGNfZG9fYnVsayAoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKK3NycGNfZG9fYnVsayhzcnBjX3NlcnZlcl9ycGNfdCAqcnBjKQogewogCXNycGNfZXZlbnRfdCAgKmV2ID0gJnJwYy0+c3JwY19ldjsKIAlzcnBjX2J1bGtfdCAgICpiayA9IHJwYy0+c3JwY19idWxrOwpAQCAtODcyLDcgKzg3NCw3IEBACiAJaW50CSAgICByYzsKIAlpbnQJICAgIG9wdDsKIAotCUxBU1NFUlQgKGJrICE9IE5VTEwpOworCUxBU1NFUlQoYmsgIT0gTlVMTCk7CiAKIAlvcHQgPSBiay0+Ymtfc2luayA/IExORVRfTURfT1BfR0VUIDogTE5FVF9NRF9PUF9QVVQ7CiAJb3B0IHw9IExORVRfTURfS0lPVjsKQEAgLTg5OCwxMSArOTAwLDExIEBACiAJc3RydWN0IHNycGNfc2VydmljZQkqc3YgID0gc2NkLT5zY2Rfc3ZjOwogCXNycGNfYnVmZmVyX3QJCSpidWZmZXI7CiAKLQlMQVNTRVJUIChzdGF0dXMgIT0gMCB8fCBycGMtPnNycGNfd2kuc3dpX3N0YXRlID09IFNXSV9TVEFURV9ET05FKTsKKwlMQVNTRVJUKHN0YXR1cyAhPSAwIHx8IHJwYy0+c3JwY193aS5zd2lfc3RhdGUgPT0gU1dJX1NUQVRFX0RPTkUpOwogCiAJcnBjLT5zcnBjX3N0YXR1cyA9IHN0YXR1czsKIAotCUNERUJVR19MSU1JVCAoc3RhdHVzID09IDAgPyBEX05FVCA6IERfTkVURVJST1IsCisJQ0RFQlVHX0xJTUlUKHN0YXR1cyA9PSAwID8gRF9ORVQgOiBEX05FVEVSUk9SLAogCQkiU2VydmVyIFJQQyAlcCBkb25lOiBzZXJ2aWNlICVzLCBwZWVyICVzLCBzdGF0dXMgJXM6JWRcbiIsCiAJCXJwYywgc3YtPnN2X25hbWUsIGxpYmNmc19pZDJzdHIocnBjLT5zcnBjX3BlZXIpLAogCQlzd2lfc3RhdGUyc3RyKHJwYy0+c3JwY193aS5zd2lfc3RhdGUpLCBzdGF0dXMpOwpAQCAtOTg1LDcgKzk4Nyw3IEBACiAKIAlzd2l0Y2ggKHdpLT5zd2lfc3RhdGUpIHsKIAlkZWZhdWx0OgotCQlMQlVHICgpOworCQlMQlVHKCk7CiAJY2FzZSBTV0lfU1RBVEVfTkVXQk9STjogewogCQlzcnBjX21zZ190CSAgICptc2c7CiAJCXNycGNfZ2VuZXJpY19yZXBseV90ICpyZXBseTsKQEAgLTEwMjMsMTIgKzEwMjUsMTIgQEAKIAkJCWlmIChyYyA9PSAwKQogCQkJCXJldHVybiAwOyAvKiB3YWl0IGZvciBidWxrICovCiAKLQkJCUxBU1NFUlQgKGV2LT5ldl9maXJlZCk7CisJCQlMQVNTRVJUKGV2LT5ldl9maXJlZCk7CiAJCQlldi0+ZXZfc3RhdHVzID0gcmM7CiAJCX0KIAl9CiAJY2FzZSBTV0lfU1RBVEVfQlVMS19TVEFSVEVEOgotCQlMQVNTRVJUIChycGMtPnNycGNfYnVsayA9PSBOVUxMIHx8IGV2LT5ldl9maXJlZCk7CisJCUxBU1NFUlQocnBjLT5zcnBjX2J1bGsgPT0gTlVMTCB8fCBldi0+ZXZfZmlyZWQpOwogCiAJCWlmIChycGMtPnNycGNfYnVsayAhPSBOVUxMKSB7CiAJCQlyYyA9IGV2LT5ldl9zdGF0dXM7CkBAIC0xMDU1LDcgKzEwNTcsNyBAQAogCQkJICAgICAgIHJwYywgcnBjLT5zcnBjX2J1bGssIHN2LT5zdl9pZCk7CiAJCQlDRVJST1IoIkV2ZW50OiBzdGF0dXMgJWQsIHR5cGUgJWQsIGxuZXQgJWRcbiIsCiAJCQkgICAgICAgZXYtPmV2X3N0YXR1cywgZXYtPmV2X3R5cGUsIGV2LT5ldl9sbmV0KTsKLQkJCUxBU1NFUlQgKGV2LT5ldl9maXJlZCk7CisJCQlMQVNTRVJUKGV2LT5ldl9maXJlZCk7CiAJCX0KIAogCQl3aS0+c3dpX3N0YXRlID0gU1dJX1NUQVRFX0RPTkU7CkBAIC0xMDY3LDExICsxMDY5LDExIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zcnBjX2NsaWVudF9ycGNfZXhwaXJlZCAodm9pZCAqZGF0YSkKK3NycGNfY2xpZW50X3JwY19leHBpcmVkKHZvaWQgKmRhdGEpCiB7CiAJc3JwY19jbGllbnRfcnBjX3QgKnJwYyA9IGRhdGE7CiAKLQlDV0FSTiAoIkNsaWVudCBSUEMgZXhwaXJlZDogc2VydmljZSAlZCwgcGVlciAlcywgdGltZW91dCAlZC5cbiIsCisJQ1dBUk4oIkNsaWVudCBSUEMgZXhwaXJlZDogc2VydmljZSAlZCwgcGVlciAlcywgdGltZW91dCAlZC5cbiIsCiAJICAgICAgIHJwYy0+Y3JwY19zZXJ2aWNlLCBsaWJjZnNfaWQyc3RyKHJwYy0+Y3JwY19kZXN0KSwKIAkgICAgICAgcnBjLT5jcnBjX3RpbWVvdXQpOwogCkBAIC0xMDg4LDExICsxMDkwLDEyIEBACiB9CiAKIGlubGluZSB2b2lkCi1zcnBjX2FkZF9jbGllbnRfcnBjX3RpbWVyIChzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQorc3JwY19hZGRfY2xpZW50X3JwY190aW1lcihzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewogCXN0dF90aW1lcl90ICp0aW1lciA9ICZycGMtPmNycGNfdGltZXI7CiAKLQlpZiAocnBjLT5jcnBjX3RpbWVvdXQgPT0gMCkgcmV0dXJuOworCWlmIChycGMtPmNycGNfdGltZW91dCA9PSAwKQorCQlyZXR1cm47CiAKIAlJTklUX0xJU1RfSEVBRCgmdGltZXItPnN0dF9saXN0KTsKIAl0aW1lci0+c3R0X2RhdGEgICAgPSBycGM7CkBAIC0xMTA5LDcgKzExMTIsNyBAQAogICogVXBvbiBleGl0IHRoZSBSUEMgZXhwaXJ5IHRpbWVyIGlzIG5vdCBxdWV1ZWQgYW5kIHRoZSBoYW5kbGVyIGlzIG5vdAogICogcnVubmluZyBvbiBhbnkgQ1BVLiAqLwogc3RhdGljIHZvaWQKLXNycGNfZGVsX2NsaWVudF9ycGNfdGltZXIgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzcnBjX2RlbF9jbGllbnRfcnBjX3RpbWVyKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJLyogdGltZXIgbm90IHBsYW50ZWQgb3IgYWxyZWFkeSBleHBsb2RlZCAqLwogCWlmIChycGMtPmNycGNfdGltZW91dCA9PSAwKQpAQCAtMTEzMCw3ICsxMTMzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNycGNfY2xpZW50X3JwY19kb25lIChzcnBjX2NsaWVudF9ycGNfdCAqcnBjLCBpbnQgc3RhdHVzKQorc3JwY19jbGllbnRfcnBjX2RvbmUoc3JwY19jbGllbnRfcnBjX3QgKnJwYywgaW50IHN0YXR1cykKIHsKIAlzd2lfd29ya2l0ZW1fdCAqd2kgPSAmcnBjLT5jcnBjX3dpOwogCkBAIC0xMTQ0LDcgKzExNDcsNyBAQAogCiAJc3JwY19kZWxfY2xpZW50X3JwY190aW1lcihycGMpOwogCi0JQ0RFQlVHX0xJTUlUICgoc3RhdHVzID09IDApID8gRF9ORVQgOiBEX05FVEVSUk9SLAorCUNERUJVR19MSU1JVCgoc3RhdHVzID09IDApID8gRF9ORVQgOiBEX05FVEVSUk9SLAogCQkiQ2xpZW50IFJQQyBkb25lOiBzZXJ2aWNlICVkLCBwZWVyICVzLCBzdGF0dXMgJXM6JWQ6JWRcbiIsCiAJCXJwYy0+Y3JwY19zZXJ2aWNlLCBsaWJjZnNfaWQyc3RyKHJwYy0+Y3JwY19kZXN0KSwKIAkJc3dpX3N0YXRlMnN0cih3aS0+c3dpX3N0YXRlKSwgcnBjLT5jcnBjX2Fib3J0ZWQsIHN0YXR1cyk7CkBAIC0xMTU3LDcgKzExNjAsNyBAQAogCSAqICAgc2NoZWR1bGluZyBtZS4KIAkgKiBDYW5jZWwgcGVuZGluZyBzY2hlZHVsZXMgYW5kIHByZXZlbnQgZnV0dXJlIHNjaGVkdWxlIGF0dGVtcHRzOgogCSAqLwotCUxBU1NFUlQgKCFzcnBjX2V2ZW50X3BlbmRpbmcocnBjKSk7CisJTEFTU0VSVCghc3JwY19ldmVudF9wZW5kaW5nKHJwYykpOwogCXN3aV9leGl0X3dvcmtpdGVtKHdpKTsKIAogCXNwaW5fdW5sb2NrKCZycGMtPmNycGNfbG9jayk7CkBAIC0xMTY4LDcgKzExNzEsNyBAQAogCiAvKiBzZW5kcyBhbiBvdXRnb2luZyBSUEMgKi8KIGludAotc3JwY19zZW5kX3JwYyAoc3dpX3dvcmtpdGVtX3QgKndpKQorc3JwY19zZW5kX3JwYyhzd2lfd29ya2l0ZW1fdCAqd2kpCiB7CiAJaW50CQlyYyA9IDA7CiAJc3JwY19jbGllbnRfcnBjX3QgKnJwYzsKQEAgLTExNzksOCArMTE4Miw4IEBACiAKIAlycGMgPSB3aS0+c3dpX3dvcmtpdGVtLndpX2RhdGE7CiAKLQlMQVNTRVJUIChycGMgIT0gTlVMTCk7Ci0JTEFTU0VSVCAod2kgPT0gJnJwYy0+Y3JwY193aSk7CisJTEFTU0VSVChycGMgIT0gTlVMTCk7CisJTEFTU0VSVCh3aSA9PSAmcnBjLT5jcnBjX3dpKTsKIAogCXJlcGx5ID0gJnJwYy0+Y3JwY19yZXBseW1zZzsKIAlkb19idWxrID0gcnBjLT5jcnBjX2J1bGsuYmtfbmlvdiA+IDA7CkBAIC0xMTk2LDkgKzExOTksOSBAQAogCiAJc3dpdGNoICh3aS0+c3dpX3N0YXRlKSB7CiAJZGVmYXVsdDoKLQkJTEJVRyAoKTsKKwkJTEJVRygpOwogCWNhc2UgU1dJX1NUQVRFX05FV0JPUk46Ci0JCUxBU1NFUlQgKCFzcnBjX2V2ZW50X3BlbmRpbmcocnBjKSk7CisJCUxBU1NFUlQoIXNycGNfZXZlbnRfcGVuZGluZyhycGMpKTsKIAogCQlyYyA9IHNycGNfcHJlcGFyZV9yZXBseShycGMpOwogCQlpZiAocmMgIT0gMCkgewpAQCAtMTIwNyw3ICsxMjEwLDggQEAKIAkJfQogCiAJCXJjID0gc3JwY19wcmVwYXJlX2J1bGsocnBjKTsKLQkJaWYgKHJjICE9IDApIGJyZWFrOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOwogCiAJCXdpLT5zd2lfc3RhdGUgPSBTV0lfU1RBVEVfUkVRVUVTVF9TVUJNSVRURUQ7CiAJCXJjID0gc3JwY19zZW5kX3JlcXVlc3QocnBjKTsKQEAgLTEyMTcsMjAgKzEyMjEsMjQgQEAKIAkJLyogQ0FWRUFUIEVNUFRPUjogcnF0ZXYsIHJweWV2LCBhbmQgYnVsa2V2IG1heSBjb21lIGluIGFueQogCQkgKiBvcmRlcjsgaG93ZXZlciwgdGhleSdyZSBwcm9jZXNzZWQgaW4gYSBzdHJpY3Qgb3JkZXI6CiAJCSAqIHJxdCwgcnB5LCBhbmQgYnVsay4gKi8KLQkJaWYgKCFycGMtPmNycGNfcmVxc3Rldi5ldl9maXJlZCkgYnJlYWs7CisJCWlmICghcnBjLT5jcnBjX3JlcXN0ZXYuZXZfZmlyZWQpCisJCQlicmVhazsKIAogCQlyYyA9IHJwYy0+Y3JwY19yZXFzdGV2LmV2X3N0YXR1czsKLQkJaWYgKHJjICE9IDApIGJyZWFrOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOwogCiAJCXdpLT5zd2lfc3RhdGUgPSBTV0lfU1RBVEVfUkVRVUVTVF9TRU5UOwogCQkvKiBwZXJoYXBzIG1vcmUgZXZlbnRzLCBmYWxsIHRocnUgKi8KIAljYXNlIFNXSV9TVEFURV9SRVFVRVNUX1NFTlQ6IHsKIAkJc3JwY19tc2dfdHlwZV90IHR5cGUgPSBzcnBjX3NlcnZpY2UycmVwbHkocnBjLT5jcnBjX3NlcnZpY2UpOwogCi0JCWlmICghcnBjLT5jcnBjX3JlcGx5ZXYuZXZfZmlyZWQpIGJyZWFrOworCQlpZiAoIXJwYy0+Y3JwY19yZXBseWV2LmV2X2ZpcmVkKQorCQkJYnJlYWs7CiAKIAkJcmMgPSBycGMtPmNycGNfcmVwbHlldi5ldl9zdGF0dXM7Ci0JCWlmIChyYyAhPSAwKSBicmVhazsKKwkJaWYgKHJjICE9IDApCisJCQlicmVhazsKIAogCQlzcnBjX3VucGFja19tc2dfaGRyKHJlcGx5KTsKIAkJaWYgKHJlcGx5LT5tc2dfdHlwZSAhPSB0eXBlIHx8CkBAIC0xMjU0LDcgKzEyNjIsOCBAQAogCQl3aS0+c3dpX3N0YXRlID0gU1dJX1NUQVRFX1JFUExZX1JFQ0VJVkVEOwogCX0KIAljYXNlIFNXSV9TVEFURV9SRVBMWV9SRUNFSVZFRDoKLQkJaWYgKGRvX2J1bGsgJiYgIXJwYy0+Y3JwY19idWxrZXYuZXZfZmlyZWQpIGJyZWFrOworCQlpZiAoZG9fYnVsayAmJiAhcnBjLT5jcnBjX2J1bGtldi5ldl9maXJlZCkKKwkJCWJyZWFrOwogCiAJCXJjID0gZG9fYnVsayA/IHJwYy0+Y3JwY19idWxrZXYuZXZfc3RhdHVzIDogMDsKIApAQCAtMTI5Miw3ICsxMzAxLDcgQEAKIH0KIAogc3JwY19jbGllbnRfcnBjX3QgKgotc3JwY19jcmVhdGVfY2xpZW50X3JwYyAobG5ldF9wcm9jZXNzX2lkX3QgcGVlciwgaW50IHNlcnZpY2UsCitzcnBjX2NyZWF0ZV9jbGllbnRfcnBjKGxuZXRfcHJvY2Vzc19pZF90IHBlZXIsIGludCBzZXJ2aWNlLAogCQkJaW50IG5idWxraW92LCBpbnQgYnVsa2xlbiwKIAkJCXZvaWQgKCpycGNfZG9uZSkoc3JwY19jbGllbnRfcnBjX3QgKiksCiAJCQl2b2lkICgqcnBjX2ZpbmkpKHNycGNfY2xpZW50X3JwY190ICopLCB2b2lkICpwcml2KQpAQCAtMTMxMSwxNSArMTMyMCwxNSBAQAogCiAvKiBjYWxsZWQgd2l0aCBycGMtPmNycGNfbG9jayBoZWxkICovCiB2b2lkCi1zcnBjX2Fib3J0X3JwYyAoc3JwY19jbGllbnRfcnBjX3QgKnJwYywgaW50IHdoeSkKK3NycGNfYWJvcnRfcnBjKHNycGNfY2xpZW50X3JwY190ICpycGMsIGludCB3aHkpCiB7Ci0JTEFTU0VSVCAod2h5ICE9IDApOworCUxBU1NFUlQod2h5ICE9IDApOwogCiAJaWYgKHJwYy0+Y3JwY19hYm9ydGVkIHx8IC8qIGFscmVhZHkgYWJvcnRlZCAqLwogCSAgICBycGMtPmNycGNfY2xvc2VkKSAgICAvKiBjYWxsYmFjayBpbW1pbmVudCAqLwogCQlyZXR1cm47CiAKLQlDREVCVUcgKERfTkVULAorCUNERUJVRyhEX05FVCwKIAkJIkFib3J0aW5nIFJQQzogc2VydmljZSAlZCwgcGVlciAlcywgc3RhdGUgJXMsIHdoeSAlZFxuIiwKIAkJcnBjLT5jcnBjX3NlcnZpY2UsIGxpYmNmc19pZDJzdHIocnBjLT5jcnBjX2Rlc3QpLAogCQlzd2lfc3RhdGUyc3RyKHJwYy0+Y3JwY193aS5zd2lfc3RhdGUpLCB3aHkpOwpAQCAtMTMzMiwxMiArMTM0MSwxMiBAQAogCiAvKiBjYWxsZWQgd2l0aCBycGMtPmNycGNfbG9jayBoZWxkICovCiB2b2lkCi1zcnBjX3Bvc3RfcnBjIChzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQorc3JwY19wb3N0X3JwYyhzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewotCUxBU1NFUlQgKCFycGMtPmNycGNfYWJvcnRlZCk7Ci0JTEFTU0VSVCAoc3JwY19kYXRhLnJwY19zdGF0ZSA9PSBTUlBDX1NUQVRFX1JVTk5JTkcpOworCUxBU1NFUlQoIXJwYy0+Y3JwY19hYm9ydGVkKTsKKwlMQVNTRVJUKHNycGNfZGF0YS5ycGNfc3RhdGUgPT0gU1JQQ19TVEFURV9SVU5OSU5HKTsKIAotCUNERUJVRyAoRF9ORVQsICJQb3N0aW5nIFJQQzogcGVlciAlcywgc2VydmljZSAlZCwgdGltZW91dCAlZFxuIiwKKwlDREVCVUcoRF9ORVQsICJQb3N0aW5nIFJQQzogcGVlciAlcywgc2VydmljZSAlZCwgdGltZW91dCAlZFxuIiwKIAkJbGliY2ZzX2lkMnN0cihycGMtPmNycGNfZGVzdCksIHJwYy0+Y3JwY19zZXJ2aWNlLAogCQlycGMtPmNycGNfdGltZW91dCk7CiAKQEAgLTE0MDMsNyArMTQxMiw3IEBACiAJc3JwY19tc2dfdAkqbXNnOwogCXNycGNfbXNnX3R5cGVfdCAgICB0eXBlOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAKIAlpZiAoZXYtPnN0YXR1cyAhPSAwKSB7CiAJCXNwaW5fbG9jaygmc3JwY19kYXRhLnJwY19nbG9jayk7CkBAIC0xNDE3LDcgKzE0MjYsNyBAQAogCWRlZmF1bHQ6CiAJCUNFUlJPUigiVW5rbm93biBldmVudDogc3RhdHVzICVkLCB0eXBlICVkLCBsbmV0ICVkXG4iLAogCQkgICAgICAgcnBjZXYtPmV2X3N0YXR1cywgcnBjZXYtPmV2X3R5cGUsIHJwY2V2LT5ldl9sbmV0KTsKLQkJTEJVRyAoKTsKKwkJTEJVRygpOwogCWNhc2UgU1JQQ19SRVFVRVNUX1NFTlQ6CiAJCWlmIChldi0+c3RhdHVzID09IDAgJiYgZXYtPnR5cGUgIT0gTE5FVF9FVkVOVF9VTkxJTkspIHsKIAkJCXNwaW5fbG9jaygmc3JwY19kYXRhLnJwY19nbG9jayk7CkBAIC0xNDM2LDcgKzE0NDUsNyBAQAogCQkJICAgICAgICZjcnBjLT5jcnBjX3JlcGx5ZXYsICZjcnBjLT5jcnBjX2J1bGtldik7CiAJCQlDRVJST1IoIkJhZCBldmVudDogc3RhdHVzICVkLCB0eXBlICVkLCBsbmV0ICVkXG4iLAogCQkJICAgICAgIHJwY2V2LT5ldl9zdGF0dXMsIHJwY2V2LT5ldl90eXBlLCBycGNldi0+ZXZfbG5ldCk7Ci0JCQlMQlVHICgpOworCQkJTEJVRygpOwogCQl9CiAKIAkJc3Bpbl9sb2NrKCZjcnBjLT5jcnBjX2xvY2spOwpAQCAtMTQ1OCwxMCArMTQ2NywxMCBAQAogCiAJCXNwaW5fbG9jaygmc2NkLT5zY2RfbG9jayk7CiAKLQkJTEFTU0VSVCAoZXYtPnVubGlua2VkKTsKLQkJTEFTU0VSVCAoZXYtPnR5cGUgPT0gTE5FVF9FVkVOVF9QVVQgfHwKKwkJTEFTU0VSVChldi0+dW5saW5rZWQpOworCQlMQVNTRVJUKGV2LT50eXBlID09IExORVRfRVZFTlRfUFVUIHx8CiAJCQkgZXYtPnR5cGUgPT0gTE5FVF9FVkVOVF9VTkxJTkspOwotCQlMQVNTRVJUIChldi0+dHlwZSAhPSBMTkVUX0VWRU5UX1VOTElOSyB8fAorCQlMQVNTRVJUKGV2LT50eXBlICE9IExORVRfRVZFTlRfVU5MSU5LIHx8CiAJCQkgc3YtPnN2X3NodXR0aW5nZG93bik7CiAKIAkJYnVmZmVyID0gY29udGFpbmVyX29mKGV2LT5tZC5zdGFydCwgc3JwY19idWZmZXJfdCwgYnVmX21zZyk7CkBAIC0xNTM2LDcgKzE1NDUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU1JQQ19CVUxLX0dFVF9SUExEOgotCQlMQVNTRVJUIChldi0+dHlwZSA9PSBMTkVUX0VWRU5UX1NFTkQgfHwKKwkJTEFTU0VSVChldi0+dHlwZSA9PSBMTkVUX0VWRU5UX1NFTkQgfHwKIAkJCSBldi0+dHlwZSA9PSBMTkVUX0VWRU5UX1JFUExZIHx8CiAJCQkgZXYtPnR5cGUgPT0gTE5FVF9FVkVOVF9VTkxJTkspOwogCkBAIC0xNTc0LDcgKzE1ODMsNyBAQAogCiAKIGludAotc3JwY19zdGFydHVwICh2b2lkKQorc3JwY19zdGFydHVwKHZvaWQpCiB7CiAJaW50IHJjOwogCkBAIC0xNTkwLDcgKzE1OTksNyBAQAogCiAJcmMgPSBMTmV0TklJbml0KExVU1RSRV9TUlZfTE5FVF9QSUQpOwogCWlmIChyYyA8IDApIHsKLQkJQ0VSUk9SICgiTE5ldE5JSW5pdCgpIGhhcyBmYWlsZWQ6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiTE5ldE5JSW5pdCgpIGhhcyBmYWlsZWQ6ICVkXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTE2MjIsNyArMTYzMSw3IEBACiB9CiAKIHZvaWQKLXNycGNfc2h1dGRvd24gKHZvaWQpCitzcnBjX3NodXRkb3duKHZvaWQpCiB7CiAJaW50IGk7CiAJaW50IHJjOwpAQCAtMTYzMywxNCArMTY0MiwxNCBAQAogCiAJc3dpdGNoIChzdGF0ZSkgewogCWRlZmF1bHQ6Ci0JCUxCVUcgKCk7CisJCUxCVUcoKTsKIAljYXNlIFNSUENfU1RBVEVfUlVOTklORzoKIAkJc3Bpbl9sb2NrKCZzcnBjX2RhdGEucnBjX2dsb2NrKTsKIAogCQlmb3IgKGkgPSAwOyBpIDw9IFNSUENfU0VSVklDRV9NQVhfSUQ7IGkrKykgewogCQkJc3JwY19zZXJ2aWNlX3QgKnN2ID0gc3JwY19kYXRhLnJwY19zZXJ2aWNlc1tpXTsKIAotCQkJTEFTU0VSVEYgKHN2ID09IE5VTEwsCisJCQlMQVNTRVJURihzdiA9PSBOVUxMLAogCQkJCSAgInNlcnZpY2Ugbm90IGVtcHR5OiBpZCAlZCwgbmFtZSAlc1xuIiwKIAkJCQkgIGksIHN2LT5zdl9uYW1lKTsKIAkJfQpAQCAtMTY1Miw5ICsxNjYxLDkgQEAKIAljYXNlIFNSUENfU1RBVEVfRVFfSU5JVDoKIAkJcmMgPSBMTmV0Q2xlYXJMYXp5UG9ydGFsKFNSUENfRlJBTUVXT1JLX1JFUVVFU1RfUE9SVEFMKTsKIAkJcmMgPSBMTmV0Q2xlYXJMYXp5UG9ydGFsKFNSUENfUkVRVUVTVF9QT1JUQUwpOwotCQlMQVNTRVJUIChyYyA9PSAwKTsKKwkJTEFTU0VSVChyYyA9PSAwKTsKIAkJcmMgPSBMTmV0RVFGcmVlKHNycGNfZGF0YS5ycGNfbG5ldF9lcSk7Ci0JCUxBU1NFUlQgKHJjID09IDApOyAvKiB0aGUgRVEgc2hvdWxkIGhhdmUgbm8gdXNlciBieSBub3cgKi8KKwkJTEFTU0VSVChyYyA9PSAwKTsgLyogdGhlIEVRIHNob3VsZCBoYXZlIG5vIHVzZXIgYnkgbm93ICovCiAKIAljYXNlIFNSUENfU1RBVEVfTklfSU5JVDoKIAkJTE5ldE5JRmluaSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2xwcm9jX2ZpZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2xwcm9jX2ZpZC5jCmluZGV4IDZhMjFmMDcuLjc4MzkzOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9scHJvY19maWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvbHByb2NfZmlkLmMKQEAgLTEyMCwxNSArMTIwLDE0IEBACiBscHJvY2ZzX2ZpZF9zcGFjZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqc2VxID0gKHN0cnVjdCBsdV9jbGllbnRfc2VxICopbS0+cHJpdmF0ZTsKLQlpbnQgcmM7CiAKIAlMQVNTRVJUKHNlcSAhPSBOVUxMKTsKIAogCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKLQlyYyA9IHNlcV9wcmludGYobSwgIlslI2xseCAtICUjbGx4XToleDolc1xuIiwgUFJBTkdFKCZzZXEtPmxjc19zcGFjZSkpOworCXNlcV9wcmludGYobSwgIlslI2xseCAtICUjbGx4XToleDolc1xuIiwgUFJBTkdFKCZzZXEtPmxjc19zcGFjZSkpOwogCW11dGV4X3VubG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBscHJvY2ZzX2ZpZF93aWR0aF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xNzAsMzAgKzE2OSwyOCBAQAogbHByb2Nmc19maWRfd2lkdGhfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7CiAJc3RydWN0IGx1X2NsaWVudF9zZXEgKnNlcSA9IChzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqKW0tPnByaXZhdGU7Ci0JaW50IHJjOwogCiAJTEFTU0VSVChzZXEgIT0gTlVMTCk7CiAKIAltdXRleF9sb2NrKCZzZXEtPmxjc19tdXRleCk7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBzZXEtPmxjc193aWR0aCk7CisJc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgc2VxLT5sY3Nfd2lkdGgpOwogCW11dGV4X3VubG9jaygmc2VxLT5sY3NfbXV0ZXgpOwogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBscHJvY2ZzX2ZpZF9maWRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCiB7CiAJc3RydWN0IGx1X2NsaWVudF9zZXEgKnNlcSA9IChzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqKW0tPnByaXZhdGU7Ci0JaW50IHJjOwogCiAJTEFTU0VSVChzZXEgIT0gTlVMTCk7CiAKIAltdXRleF9sb2NrKCZzZXEtPmxjc19tdXRleCk7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sIERGSUQiXG4iLCBQRklEKCZzZXEtPmxjc19maWQpKTsKKwlzZXFfcHJpbnRmKG0sIERGSUQgIlxuIiwgUEZJRCgmc2VxLT5sY3NfZmlkKSk7CiAJbXV0ZXhfdW5sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTIwMSwxNyArMTk4LDE3IEBACiB7CiAJc3RydWN0IGx1X2NsaWVudF9zZXEgKnNlcSA9IChzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqKW0tPnByaXZhdGU7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaTsKLQlpbnQgcmM7CiAKIAlMQVNTRVJUKHNlcSAhPSBOVUxMKTsKIAogCWlmIChzZXEtPmxjc19leHAgIT0gTlVMTCkgewogCQljbGkgPSAmc2VxLT5sY3NfZXhwLT5leHBfb2JkLT51LmNsaTsKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlc1xuIiwgY2xpLT5jbF90YXJnZXRfdXVpZC51dWlkKTsKKwkJc2VxX3ByaW50ZihtLCAiJXNcbiIsIGNsaS0+Y2xfdGFyZ2V0X3V1aWQudXVpZCk7CiAJfSBlbHNlIHsKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlc1xuIiwgc2VxLT5sY3Nfc3J2LT5sc3NfbmFtZSk7CisJCXNlcV9wcmludGYobSwgIiVzXG4iLCBzZXEtPmxjc19zcnYtPmxzc19uYW1lKTsKIAl9Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiAKIExQUk9DX1NFUV9GT1BTKGxwcm9jZnNfZmlkX3NwYWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaAppbmRleCA2MTI1YmJlLi42OGJlYzc2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaApAQCAtMTQyLDcgKzE0Miw3IEBACiBpbnQgZmxkX2NsaWVudF9ycGMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJICAgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UsIF9fdTMyIGZsZF9vcCk7CiAKLSNpZiBkZWZpbmVkIChDT05GSUdfUFJPQ19GUykKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQogZXh0ZXJuIHN0cnVjdCBscHJvY2ZzX3ZhcnMgZmxkX2NsaWVudF9wcm9jX2xpc3RbXTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCmluZGV4IGI4ZDE3ZTEuLjZhYzIyNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCkBAIC0yMTcsMTAgKzIxNyw5IEBACiAJCUNFUlJPUigiJXM6IEF0dGVtcHQgdG8gYWRkIHRhcmdldCAlcyAoaWR4ICVsbHUpIG9uIGZseSAtIHNraXAgaXRcbiIsCiAJCQlmbGQtPmxjZl9uYW1lLCBuYW1lLCB0YXItPmZ0X2lkeCk7CiAJCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCUNERUJVRyhEX0lORk8sICIlczogQWRkaW5nIHRhcmdldCAlcyAoaWR4ICVsbHUpXG4iLAotCQkgICAgICAgZmxkLT5sY2ZfbmFtZSwgbmFtZSwgdGFyLT5mdF9pZHgpOwogCX0KKwlDREVCVUcoRF9JTkZPLCAiJXM6IEFkZGluZyB0YXJnZXQgJXMgKGlkeCAlbGx1KVxuIiwKKwkJCWZsZC0+bGNmX25hbWUsIG5hbWUsIHRhci0+ZnRfaWR4KTsKIAogCU9CRF9BTExPQ19QVFIodGFyZ2V0KTsKIAlpZiAodGFyZ2V0ID09IE5VTEwpCkBAIC0yODAsNyArMjc5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZmxkX3R5cGVfcHJvY19kaXI7CiAKLSNpZiBkZWZpbmVkIChDT05GSUdfUFJPQ19GUykKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQogc3RhdGljIGludCBmbGRfY2xpZW50X3Byb2NfaW5pdChzdHJ1Y3QgbHVfY2xpZW50X2ZsZCAqZmxkKQogewogCWludCByYzsKQEAgLTMyNyw3ICszMjYsNiBAQAogCiB2b2lkIGZsZF9jbGllbnRfcHJvY19maW5pKHN0cnVjdCBsdV9jbGllbnRfZmxkICpmbGQpCiB7Ci0JcmV0dXJuOwogfQogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKGZsZF9jbGllbnRfcHJvY19maW5pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9scHJvY19mbGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9scHJvY19mbGQuYwppbmRleCA4YzVhNjU3Li5mNTNmZGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvbHByb2NfZmxkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2xwcm9jX2ZsZC5jCkBAIC0xNjgsNCArMTY4LDUgQEAKIAl7ICJ0YXJnZXRzIiwgJmZsZF9wcm9jX3RhcmdldHNfZm9wcyB9LAogCXsgImhhc2giLCAmZmxkX3Byb2NfaGFzaF9mb3BzIH0sCiAJeyAiY2FjaGVfZmx1c2giLCAmZmxkX3Byb2NfY2FjaGVfZmx1c2hfZm9wcyB9LAotCXsgTlVMTCB9fTsKKwl7IE5VTEwgfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaAppbmRleCA4YTI1Y2Y2Li5kMDMwODQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oCkBAIC02NzksNyArNjc5LDcgQEAKIAl9CQkJCSAgICAgICBcCiB9IHdoaWxlICgwKQogI2RlZmluZSBMUFJPQ0ZTX0NMSU1QX0VYSVQob2JkKQkJIFwKLQl1cF9yZWFkKCYob2JkKS0+dS5jbGkuY2xfc2VtKTsKKwl1cF9yZWFkKCYob2JkKS0+dS5jbGkuY2xfc2VtKQogCiAKIC8qIHdyaXRlIHRoZSBuYW1lIyNfc2VxX3Nob3cgZnVuY3Rpb24sIGNhbGwgTFBST0NfU0VRX0ZPUFNfUk8gZm9yIHJlYWQtb25seQpAQCAtNzIzLDcgKzcyMyw3IEBACiAJCXJldHVybiBscHJvY2ZzX3dyXyMjdHlwZShmaWxlLCBidWZmZXIsCQkJXAogCQkJCQkgY291bnQsIHNlcS0+cHJpdmF0ZSk7CQlcCiAJfQkJCQkJCQkJXAotCUxQUk9DX1NFUV9GT1BTKG5hbWUjI18jI3R5cGUpOworCUxQUk9DX1NFUV9GT1BTKG5hbWUjI18jI3R5cGUpCiAKICNkZWZpbmUgTFBST0NfU0VRX0ZPUFNfV1JfT05MWShuYW1lLCB0eXBlKQkJCQlcCiAJc3RhdGljIHNzaXplX3QgbmFtZSMjXyMjdHlwZSMjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAkJXApAQCAtNzQwLDcgKzc0MCw3IEBACiAJCS5vcGVuCT0gbmFtZSMjXyMjdHlwZSMjX29wZW4sCQkJCVwKIAkJLndyaXRlCT0gbmFtZSMjXyMjdHlwZSMjX3dyaXRlLAkJCVwKIAkJLnJlbGVhc2UgPSBscHJvY2ZzX3NpbmdsZV9yZWxlYXNlLAkJCVwKLQl9OworCX0KIAogLyogbHByb2NfcHRscnBjLmMgKi8KIHN0cnVjdCBwdGxycGNfcmVxdWVzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVfb2JqZWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1X29iamVjdC5oCmluZGV4IDJkZGIyYjAuLmM4Y2M0OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVfb2JqZWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdV9vYmplY3QuaApAQCAtMTkyLDcgKzE5Miw3IEBACiAgKi8KIHR5cGVkZWYgaW50ICgqbHVfcHJpbnRlcl90KShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkgICAgdm9pZCAqY29va2llLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CisJX19wcmludGYoMywgNCk7CiAKIC8qKgogICogT3BlcmF0aW9ucyBzcGVjaWZpYyBmb3IgcGFydGljdWxhciBsdV9vYmplY3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCmluZGV4IDgzYmMwYTkuLmJhYzk5MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCkBAIC0xMDc1LDcgKzEwNzUsNyBAQAogdm9pZCBfbGRsbV9sb2NrX2RlYnVnKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssCiAJCSAgICAgIHN0cnVjdCBsaWJjZnNfZGVidWdfbXNnX2RhdGEgKmRhdGEsCiAJCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKwlfX3ByaW50ZigzLCA0KTsKIAogLyoqCiAgKiBSYXRlLWxpbWl0ZWQgdmVyc2lvbiBvZiBsb2NrIHByaW50aW5nIGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaW1wb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaAppbmRleCA1MWYzZTk4Li5kY2M4MDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaApAQCAtMjE4LDYgKzIxOCw4IEBACiAJYXRvbWljX3QJICAgICAgaW1wX3RpbWVvdXRzOwogCS8qKiBDdXJyZW50IGltcG9ydCBzdGF0ZSAqLwogCWVudW0gbHVzdHJlX2ltcF9zdGF0ZSAgICAgaW1wX3N0YXRlOworCS8qKiBMYXN0IHJlcGxheSBzdGF0ZSAqLworCWVudW0gbHVzdHJlX2ltcF9zdGF0ZQkgIGltcF9yZXBsYXlfc3RhdGU7CiAJLyoqIEhpc3Rvcnkgb2YgaW1wb3J0IHN0YXRlcyAqLwogCXN0cnVjdCBpbXBvcnRfc3RhdGVfaGlzdCAgaW1wX3N0YXRlX2hpc3RbSU1QX1NUQVRFX0hJU1RfTEVOXTsKIAlpbnQJCSAgICAgICBpbXBfc3RhdGVfaGlzdF9pZHg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCmluZGV4IDM2Mzk2ZDEuLmUyODA1YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oCkBAIC0xNjczLDcgKzE2NzMsNyBAQAogCiB2b2lkIF9kZWJ1Z19yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCXN0cnVjdCBsaWJjZnNfZGVidWdfbXNnX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKwlfX3ByaW50ZigzLCA0KTsKIAogLyoqCiAgKiBIZWxwZXIgdGhhdCBkZWNpZGVzIGlmIHdlIG5lZWQgdG8gcHJpbnQgcmVxdWVzdCBhY2NvcmRpbmcgdG8gY3VycmVudCBkZWJ1ZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmgKaW5kZXggNGEyOTI2MS4uMzRiNWZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oCkBAIC03Miw2ICs3Miw3IEBACiBzdHJ1Y3QgbHVfZGV2aWNlX3R5cGU7CiAKIC8qIGdlbm9wcy5jICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBvYmRfdHlwZXM7CiBzdHJ1Y3Qgb2JkX2V4cG9ydCAqY2xhc3NfY29ubjJleHBvcnQoc3RydWN0IGx1c3RyZV9oYW5kbGUgKik7CiBpbnQgY2xhc3NfcmVnaXN0ZXJfdHlwZShzdHJ1Y3Qgb2JkX29wcyAqLCBzdHJ1Y3QgbWRfb3BzICosCiAJCQlzdHJ1Y3QgbHByb2Nmc192YXJzICosIGNvbnN0IGNoYXIgKm5tLApAQCAtMjIyLDIwICsyMjMsMjAgQEAKIAogI2VuZGlmCiAKLSNkZWZpbmUgY2xhc3NfZXhwb3J0X3JwY19pbmMoZXhwKQkJCQkgICAgICAgXAotKHsJCQkJCQkJCSAgICAgIFwKLQlhdG9taWNfaW5jKCYoZXhwKS0+ZXhwX3JwY19jb3VudCk7CQkJICBcCi0JQ0RFQlVHKERfSU5GTywgIlJQQyBHRVR0aW5nIGV4cG9ydCAlcCA6IG5ldyBycGNfY291bnQgJWRcbiIsICAgIFwKLQkgICAgICAgKGV4cCksIGF0b21pY19yZWFkKCYoZXhwKS0+ZXhwX3JwY19jb3VudCkpOwkgIFwKLX0pCitzdGF0aWMgaW5saW5lIHZvaWQgY2xhc3NfZXhwb3J0X3JwY19pbmMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCkKK3sKKwlhdG9taWNfaW5jKCYoZXhwKS0+ZXhwX3JwY19jb3VudCk7CisJQ0RFQlVHKERfSU5GTywgIlJQQyBHRVR0aW5nIGV4cG9ydCAlcCA6IG5ldyBycGNfY291bnQgJWRcbiIsCisJICAgICAgIChleHApLCBhdG9taWNfcmVhZCgmKGV4cCktPmV4cF9ycGNfY291bnQpKTsKK30KIAotI2RlZmluZSBjbGFzc19leHBvcnRfcnBjX2RlYyhleHApCQkJCSAgICAgICBcCi0oewkJCQkJCQkJICAgICAgXAotCUxBU1NFUlRfQVRPTUlDX1BPUygmZXhwLT5leHBfcnBjX2NvdW50KTsJCQlcCi0JYXRvbWljX2RlYygmKGV4cCktPmV4cF9ycGNfY291bnQpOwkJCSAgXAotCUNERUJVRyhEX0lORk8sICJSUEMgUFVUdGluZyBleHBvcnQgJXAgOiBuZXcgcnBjX2NvdW50ICVkXG4iLCAgICBcCi0JICAgICAgIChleHApLCBhdG9taWNfcmVhZCgmKGV4cCktPmV4cF9ycGNfY291bnQpKTsJICBcCi19KQorc3RhdGljIGlubGluZSB2b2lkIGNsYXNzX2V4cG9ydF9ycGNfZGVjKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApCit7CisJTEFTU0VSVF9BVE9NSUNfUE9TKCZleHAtPmV4cF9ycGNfY291bnQpOworCWF0b21pY19kZWMoJihleHApLT5leHBfcnBjX2NvdW50KTsKKwlDREVCVUcoRF9JTkZPLCAiUlBDIFBVVHRpbmcgZXhwb3J0ICVwIDogbmV3IHJwY19jb3VudCAlZFxuIiwKKwkgICAgICAgKGV4cCksIGF0b21pY19yZWFkKCYoZXhwKS0+ZXhwX3JwY19jb3VudCkpOworfQogCiAjZGVmaW5lIGNsYXNzX2V4cG9ydF9sb2NrX2dldChleHAsIGxvY2spCQkJCVwKICh7CQkJCQkJCQkgICAgICBcCkBAIC0zMzIsMjUgKzMzMywyOSBAQAogCiAvKiBFbnN1cmUgb2JkX3NldHVwOiB1c2VkIGZvciBjbGVhbnVwIHdoaWNoIG11c3QgYmUgY2FsbGVkCiAgICB3aGlsZSBvYmQgaXMgc3RvcHBpbmcgKi8KLSNkZWZpbmUgT0JEX0NIRUNLX0RFVihvYmQpCQkJCSAgICAgIFwKLWRvIHsJCQkJCQkJICAgIFwKLQlpZiAoIShvYmQpKSB7CQkJCQkgICBcCi0JCUNFUlJPUigiTlVMTCBkZXZpY2VcbiIpOwkJCVwKLQkJcmV0dXJuIC1FTk9ERVY7CQkJCVwKLQl9CQkJCQkJICAgICAgIFwKLX0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIGludCBvYmRfY2hlY2tfZGV2KHN0cnVjdCBvYmRfZGV2aWNlICpvYmQpCit7CisJaWYgKCFvYmQpIHsKKwkJQ0VSUk9SKCJOVUxMIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KIAogLyogZW5zdXJlIG9iZF9zZXR1cCBhbmQgIW9iZF9zdG9wcGluZyAqLwotI2RlZmluZSBPQkRfQ0hFQ0tfREVWX0FDVElWRShvYmQpCQkJICAgICAgIFwKLWRvIHsJCQkJCQkJICAgIFwKLQlPQkRfQ0hFQ0tfREVWKG9iZCk7CQkJCSAgICAgXAotCWlmICghKG9iZCktPm9iZF9zZXRfdXAgfHwgKG9iZCktPm9iZF9zdG9wcGluZykgewlcCi0JCUNFUlJPUigiRGV2aWNlICVkIG5vdCBzZXR1cFxuIiwJCSBcCi0JCSAgICAgICAob2JkKS0+b2JkX21pbm9yKTsJCSAgICAgICBcCi0JCXJldHVybiAtRU5PREVWOwkJCQlcCi0JfQkJCQkJCSAgICAgICBcCi19IHdoaWxlICgwKQorc3RhdGljIGlubGluZSBpbnQgb2JkX2NoZWNrX2Rldl9hY3RpdmUoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCkKK3sKKwlpbnQgcmM7CiAKKwlyYyA9IG9iZF9jaGVja19kZXYob2JkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlpZiAoIW9iZC0+b2JkX3NldF91cCB8fCBvYmQtPm9iZF9zdG9wcGluZykgeworCQlDRVJST1IoIkRldmljZSAlZCBub3Qgc2V0dXBcbiIsIG9iZC0+b2JkX21pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiByYzsKK30KIAogI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQogI2RlZmluZSBPQkRfQ09VTlRFUl9PRkZTRVQob3ApCQkJCSAgXApAQCAtNTkzLDcgKzU5OCw5IEBACiAJaW50IHJjOwogCURFQ0xBUkVfTFVfVkFSUyhsZHQsIGQpOwogCi0JT0JEX0NIRUNLX0RFVihvYmQpOworCXJjID0gb2JkX2NoZWNrX2RldihvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCWxkdCA9IG9iZC0+b2JkX3R5cGUtPnR5cF9sdTsKIAlkID0gb2JkLT5vYmRfbHVfZGV2OwogCWlmIChsZHQgIT0gTlVMTCAmJiBkICE9IE5VTEwpIHsKQEAgLTYxOSw3ICs2MjYsOSBAQAogCWludCByYzsKIAlERUNMQVJFX0xVX1ZBUlMobGR0LCBkKTsKIAotCU9CRF9DSEVDS19ERVYob2JkKTsKKwlyYyA9IG9iZF9jaGVja19kZXYob2JkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCWxkdCA9IG9iZC0+b2JkX3R5cGUtPnR5cF9sdTsKIAlkID0gb2JkLT5vYmRfbHVfZGV2OwpAQCAtNjY3LDcgKzY3Niw5IEBACiAJaW50IHJjOwogCURFQ0xBUkVfTFVfVkFSUyhsZHQsIGQpOwogCi0JT0JEX0NIRUNLX0RFVihvYmQpOworCXJjID0gb2JkX2NoZWNrX2RldihvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJb2JkLT5vYmRfcHJvY2Vzc19jb25mID0gMTsKIAlsZHQgPSBvYmQtPm9iZF90eXBlLT50eXBfbHU7CkBAIC04ODUsNyArODk2LDkgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gaW1wLT5pbXBfb2JkOwogCWludCByYzsKIAotCU9CRF9DSEVDS19ERVZfQUNUSVZFKG9iZCk7CisJcmMgPSBvYmRfY2hlY2tfZGV2X2FjdGl2ZShvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCU9CRF9DSEVDS19EVF9PUChvYmQsIGFkZF9jb25uLCAtRU9QTk9UU1VQUCk7CiAJT0JEX0NPVU5URVJfSU5DUkVNRU5UKG9iZCwgYWRkX2Nvbm4pOwogCkBAIC04OTgsNyArOTExLDkgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gaW1wLT5pbXBfb2JkOwogCWludCByYzsKIAotCU9CRF9DSEVDS19ERVZfQUNUSVZFKG9iZCk7CisJcmMgPSBvYmRfY2hlY2tfZGV2X2FjdGl2ZShvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCU9CRF9DSEVDS19EVF9PUChvYmQsIGRlbF9jb25uLCAtRU9QTk9UU1VQUCk7CiAJT0JEX0NPVU5URVJfSU5DUkVNRU5UKG9iZCwgZGVsX2Nvbm4pOwogCkBAIC05MzIsNyArOTQ3LDkgQEAKIAlfX3U2NCBvY2YgPSBkYXRhID8gZGF0YS0+b2NkX2Nvbm5lY3RfZmxhZ3MgOiAwOyAvKiBmb3IgcG9zdC1jb25kaXRpb24KIAkJCQkJCSAgICogY2hlY2sgKi8KIAotCU9CRF9DSEVDS19ERVZfQUNUSVZFKG9iZCk7CisJcmMgPSBvYmRfY2hlY2tfZGV2X2FjdGl2ZShvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCU9CRF9DSEVDS19EVF9PUChvYmQsIGNvbm5lY3QsIC1FT1BOT1RTVVBQKTsKIAlPQkRfQ09VTlRFUl9JTkNSRU1FTlQob2JkLCBjb25uZWN0KTsKIApAQCAtOTU0LDcgKzk3MSw5IEBACiAJX191NjQgb2NmID0gZCA/IGQtPm9jZF9jb25uZWN0X2ZsYWdzIDogMDsgLyogZm9yIHBvc3QtY29uZGl0aW9uCiAJCQkJCQkgICAqIGNoZWNrICovCiAKLQlPQkRfQ0hFQ0tfREVWX0FDVElWRShvYmQpOworCXJjID0gb2JkX2NoZWNrX2Rldl9hY3RpdmUob2JkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAlPQkRfQ0hFQ0tfRFRfT1Aob2JkLCByZWNvbm5lY3QsIDApOwogCU9CRF9DT1VOVEVSX0lOQ1JFTUVOVChvYmQsIHJlY29ubmVjdCk7CiAKQEAgLTEyNzksNyArMTI5OCw5IEBACiB7CiAJaW50IHJjOwogCi0JT0JEX0NIRUNLX0RFVihvYmQpOworCXJjID0gb2JkX2NoZWNrX2RldihvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJLyogdGhlIGNoZWNrIGZvciBhc3luY19yZWNvdiBpcyBhIGNvbXBsZXRlIGhhY2sgLSBJJ20gaGVyZWJ5CiAJICAgb3ZlcmxvYWRpbmcgdGhlIG1lYW5pbmcgdG8gYWxzbyBtZWFuICJ0aGlzIHdhcyBjYWxsZWQgZnJvbQpAQCAtMTM4MCw3ICsxNDAxLDExIEBACiBzdGF0aWMgaW5saW5lIGludCBvYmRfcmVnaXN0ZXJfb2JzZXJ2ZXIoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwKIAkJCQkJc3RydWN0IG9iZF9kZXZpY2UgKm9ic2VydmVyKQogewotCU9CRF9DSEVDS19ERVYob2JkKTsKKwlpbnQgcmM7CisKKwlyYyA9IG9iZF9jaGVja19kZXYob2JkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAlkb3duX3dyaXRlKCZvYmQtPm9iZF9vYnNlcnZlcl9saW5rX3NlbSk7CiAJaWYgKG9iZC0+b2JkX29ic2VydmVyICYmIG9ic2VydmVyKSB7CiAJCXVwX3dyaXRlKCZvYmQtPm9iZF9vYnNlcnZlcl9saW5rX3NlbSk7CkBAIC0xODk1LDYgKzE5MjAsOCBAQAogCiAvKiBjbGFzc19vYmQuYyAqLwogZXh0ZXJuIGNoYXIgb2JkX2pvYmlkX25vZGVbXTsKK2V4dGVybiBzdHJ1Y3QgbWlzY2RldmljZSBvYmRfcHNkZXY7CitleHRlcm4gc3BpbmxvY2tfdCBvYmRfdHlwZXNfbG9jazsKIAogLyogcHJuZy5jICovCiAjZGVmaW5lIGxsX2dlbmVyYXRlX3JhbmRvbV91dWlkKHV1aWRfb3V0KSBjZnNfZ2V0X3JhbmRvbV9ieXRlcyh1dWlkX291dCwgc2l6ZW9mKGNsYXNzX3V1aWRfdCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sY2xpZW50L2xjb21tb25fY2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jCmluZGV4IDIzMDk1YmIuLmFiNmNiNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jCkBAIC04MjgsNyArODI4LDggQEAKIAkJCQkgKiAtLWJ1ZyAxNzMzNiAqLwogCQkJCWxvZmZfdCBzaXplID0gY2xfaXNpemVfcmVhZChpbm9kZSk7CiAJCQkJbG9mZl90IGN1cl9pbmRleCA9IHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQkJbG9mZl90IHNpemVfaW5kZXggPSAoKHNpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJCQlsb2ZmX3Qgc2l6ZV9pbmRleCA9IChzaXplIC0gMSkgPj4KKwkJCQkJCSAgICBQQUdFX0NBQ0hFX1NISUZUOwogCiAJCQkJaWYgKChzaXplID09IDAgJiYgY3VyX2luZGV4ICE9IDApIHx8CiAJCQkJICAgIHNpemVfaW5kZXggPCBjdXJfaW5kZXgpCkBAIC0xMjYzLDcgKzEyNjQsNyBAQAogCQlyZXR1cm4gZ2VuOwogCX0KIAotCWdlbiA9IChmaWRfZmxhdHRlbihmaWQpID4+IDMyKTsKKwlnZW4gPSBmaWRfZmxhdHRlbihmaWQpID4+IDMyOwogCXJldHVybiBnZW47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9leHRlbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9leHRlbnQuYwppbmRleCBhODllZWJhLi5mZDliMDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZXh0ZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2V4dGVudC5jCkBAIC0xNTEsNyArMTUxLDggQEAKIAogCUxBU1NFUlQobW9kZSAhPSAwKTsKIAlMQVNTRVJUKElTX1BPMihtb2RlKSk7Ci0JZm9yIChpbmRleCA9IC0xOyBtb2RlOyBpbmRleCsrLCBtb2RlID4+PSAxKSA7CisJZm9yIChpbmRleCA9IC0xOyBtb2RlOyBpbmRleCsrKQorCQltb2RlID4+PSAxOwogCUxBU1NFUlQoaW5kZXggPCBMQ0tfTU9ERV9OVU0pOwogCXJldHVybiBpbmRleDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmgKaW5kZXggMjBlNjRjZC4uNzBiOTA5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmgKQEAgLTEzMSwxMiArMTMxLDEyIEBACiAJdW5pb24gbGRsbV9nbF9kZXNjCQkqZ2xfZGVzYzsgLyogZ2xpbXBzZSBBU1QgZGVzY3JpcHRvciAqLwogfTsKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gbGRsbV9kZXNjX2FzdF90IHsKIAlMRExNX1dPUktfQkxfQVNULAogCUxETE1fV09SS19DUF9BU1QsCiAJTERMTV9XT1JLX1JFVk9LRV9BU1QsCiAJTERMTV9XT1JLX0dMX0FTVAotfSBsZGxtX2Rlc2NfYXN0X3Q7Cit9OwogCiB2b2lkIGxkbG1fZ3JhbnRfbG9jayhzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrLCBzdHJ1Y3QgbGlzdF9oZWFkICp3b3JrX2xpc3QpOwogaW50IGxkbG1fZmlsbF9sdmIoc3RydWN0IGxkbG1fbG9jayAqbG9jaywgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLApAQCAtMTU1LDcgKzE1NSw3IEBACiB2b2lkIGxkbG1fYWRkX2FzdF93b3JrX2l0ZW0oc3RydWN0IGxkbG1fbG9jayAqbG9jaywgc3RydWN0IGxkbG1fbG9jayAqbmV3LAogCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCk7CiBpbnQgbGRsbV9ydW5fYXN0X3dvcmsoc3RydWN0IGxkbG1fbmFtZXNwYWNlICpucywgc3RydWN0IGxpc3RfaGVhZCAqcnBjX2xpc3QsCi0JCSAgICAgIGxkbG1fZGVzY19hc3RfdCBhc3RfdHlwZSk7CisJCSAgICAgIGVudW0gbGRsbV9kZXNjX2FzdF90IGFzdF90eXBlKTsKIGludCBsZGxtX3dvcmtfZ2xfYXN0X2xvY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqcnFzZXQsIHZvaWQgKm9wYXEpOwogaW50IGxkbG1fbG9ja19yZW1vdmVfZnJvbV9scnUoc3RydWN0IGxkbG1fbG9jayAqbG9jayk7CiBpbnQgbGRsbV9sb2NrX3JlbW92ZV9mcm9tX2xydV9ub2xvY2soc3RydWN0IGxkbG1fbG9jayAqbG9jayk7CkBAIC0xNzcsNiArMTc3LDEwIEBACiB2b2lkIGxkbG1faGFuZGxlX2JsX2NhbGxiYWNrKHN0cnVjdCBsZGxtX25hbWVzcGFjZSAqbnMsCiAJCQkgICAgIHN0cnVjdCBsZGxtX2xvY2tfZGVzYyAqbGQsIHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spOwogCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmxkbG1fcmVzb3VyY2Vfc2xhYjsKKworLyogbGRsbV9sb2NrZC5jICYgbGRsbV9sb2NrLmMgKi8KK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqbGRsbV9sb2NrX3NsYWI7CiAKIC8qIGxkbG1fZXh0ZW50LmMgKi8KIHZvaWQgbGRsbV9leHRlbnRfYWRkX2xvY2soc3RydWN0IGxkbG1fcmVzb3VyY2UgKnJlcywgc3RydWN0IGxkbG1fbG9jayAqbG9jayk7CkBAIC0yMDcsOSArMjExLDkgQEAKIC8qIGludGVydmFsIHRyZWUsIGZvciBMRExNX0VYVEVOVC4gKi8KIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqbGRsbV9pbnRlcnZhbF9zbGFiOyAvKiBzbGFiIGNhY2hlIGZvciBsZGxtX2ludGVydmFsICovCiBleHRlcm4gdm9pZCBsZGxtX2ludGVydmFsX2F0dGFjaChzdHJ1Y3QgbGRsbV9pbnRlcnZhbCAqbiwgc3RydWN0IGxkbG1fbG9jayAqbCk7Ci1leHRlcm4gc3RydWN0IGxkbG1faW50ZXJ2YWwgKmxkbG1faW50ZXJ2YWxfZGV0YWNoKHN0cnVjdCBsZGxtX2xvY2sgKmwpOwotZXh0ZXJuIHN0cnVjdCBsZGxtX2ludGVydmFsICpsZGxtX2ludGVydmFsX2FsbG9jKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spOwotZXh0ZXJuIHZvaWQgbGRsbV9pbnRlcnZhbF9mcmVlKHN0cnVjdCBsZGxtX2ludGVydmFsICpub2RlKTsKK3N0cnVjdCBsZGxtX2ludGVydmFsICpsZGxtX2ludGVydmFsX2RldGFjaChzdHJ1Y3QgbGRsbV9sb2NrICpsKTsKK3N0cnVjdCBsZGxtX2ludGVydmFsICpsZGxtX2ludGVydmFsX2FsbG9jKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spOwordm9pZCBsZGxtX2ludGVydmFsX2ZyZWUoc3RydWN0IGxkbG1faW50ZXJ2YWwgKm5vZGUpOwogLyogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHJlcyBsb2NrIGhlbGQgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxkbG1fZXh0ZW50ICoKIGxkbG1faW50ZXJ2YWxfZXh0ZW50KHN0cnVjdCBsZGxtX2ludGVydmFsICpub2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMKaW5kZXggODE5MTAwNS4uODRiMTExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jCkBAIC0xNTEsOCArMTUxLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobGRsbV9pdDJzdHIpOwogCi1leHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmxkbG1fbG9ja19zbGFiOwotCiAKIHZvaWQgbGRsbV9yZWdpc3Rlcl9pbnRlbnQoc3RydWN0IGxkbG1fbmFtZXNwYWNlICpucywgbGRsbV9yZXNfcG9saWN5IGFyZykKIHsKQEAgLTE4MDUsNyArMTgwMyw3IEBACiAgKiBvbmUuCiAgKi8KIGludCBsZGxtX3J1bl9hc3Rfd29yayhzdHJ1Y3QgbGRsbV9uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgbGlzdF9oZWFkICpycGNfbGlzdCwKLQkJICAgICAgbGRsbV9kZXNjX2FzdF90IGFzdF90eXBlKQorCQkgICAgICBlbnVtIGxkbG1fZGVzY19hc3RfdCBhc3RfdHlwZSkKIHsKIAlzdHJ1Y3QgbGRsbV9jYl9zZXRfYXJnICphcmc7CiAJc2V0X3Byb2R1Y2VyX2Z1bmMgICAgICAgd29ya19hc3RfbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMKaW5kZXggOThmYmQzZi4uMDhhOTFmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMKQEAgLTU1LDggKzU1LDYgQEAKIG1vZHVsZV9wYXJhbShsZGxtX2NwdHMsIGNoYXJwLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobGRsbV9jcHRzLCAiQ1BVIHBhcnRpdGlvbnMgbGRsbSB0aHJlYWRzIHNob3VsZCBydW4gb24iKTsKIAotZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpsZGxtX3Jlc291cmNlX3NsYWI7Ci1leHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmxkbG1fbG9ja19zbGFiOwogc3RhdGljIHN0cnVjdCBtdXRleAlsZGxtX3JlZl9tdXRleDsKIHN0YXRpYyBpbnQgbGRsbV9yZWZjb3VudDsKIApAQCAtMTU0LDcgKzE1Miw3IEBACiAJaWYgKGxvY2stPmxfZmxhZ3MgJiBMRExNX0ZMX0NBTkNFTF9PTl9CTE9DSykKIAkJbG9jay0+bF9mbGFncyB8PSBMRExNX0ZMX0NBTkNFTDsKIAotCWRvX2FzdCA9ICghbG9jay0+bF9yZWFkZXJzICYmICFsb2NrLT5sX3dyaXRlcnMpOworCWRvX2FzdCA9ICFsb2NrLT5sX3JlYWRlcnMgJiYgIWxvY2stPmxfd3JpdGVyczsKIAl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCiAJaWYgKGRvX2FzdCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Bvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9wb29sLmMKaW5kZXggZDIwZDI3Ny4uYTlmNDgzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Bvb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcG9vbC5jCkBAIC0xNDEsOCArMTQxLDYgQEAKICAqLwogI2RlZmluZSBMRExNX1BPT0xfU0xWX1NISUZUICgxMCkKIAotZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbGRsbV9uc19wcm9jX2RpcjsKLQogc3RhdGljIGlubGluZSBfX3U2NCBkcnUoX191NjQgdmFsLCBfX3UzMiBzaGlmdCwgaW50IHJvdW5kX3VwKQogewogCXJldHVybiAodmFsICsgKHJvdW5kX3VwID8gKDEgPDwgc2hpZnQpIC0gMSA6IDApKSA+PiBzaGlmdDsKQEAgLTY4OSw4ICs2ODcsOCBAQAogCQkJICAgICAgIiAgR1A6ICAlZFxuIiwKIAkJCSAgICAgIGdyYW50X3N0ZXAsIGdyYW50X3BsYW4pOwogCX0KLQlzZXFfcHJpbnRmKG0sICIgIEdSOiAgJWRcbiIgIiAgQ1I6ICAlZFxuIiAiICBHUzogICVkXG4iCi0JCSAgICAgICIgIEc6ICAgJWRcbiIgIiAgTDogICAlZFxuIiwKKwlzZXFfcHJpbnRmKG0sICIgIEdSOiAgJWRcbiAgQ1I6ICAlZFxuICBHUzogICVkXG4iCisJCSAgICAgICIgIEc6ICAgJWRcbiAgTDogICAlZFxuIiwKIAkJICAgICAgZ3JhbnRfcmF0ZSwgY2FuY2VsX3JhdGUsIGdyYW50X3NwZWVkLAogCQkgICAgICBncmFudGVkLCBsaW1pdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jCmluZGV4IDI4N2RhMzIuLjRmNzEzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJaW50IGRvX2FzdDsKIAogCWxvY2stPmxfZmxhZ3MgfD0gTERMTV9GTF9DQlBFTkRJTkc7Ci0JZG9fYXN0ID0gKCFsb2NrLT5sX3JlYWRlcnMgJiYgIWxvY2stPmxfd3JpdGVycyk7CisJZG9fYXN0ID0gIWxvY2stPmxfcmVhZGVycyAmJiAhbG9jay0+bF93cml0ZXJzOwogCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAKIAlpZiAoZG9fYXN0KSB7CkBAIC0xNzc5LDcgKzE3NzksNiBAQAogCQlpZiAob3BhcXVlICE9IE5VTEwgJiYgbG9jay0+bF9hc3RfZGF0YSAhPSBvcGFxdWUpIHsKIAkJCUxETE1fRVJST1IobG9jaywgImRhdGEgJXAgZG9lc24ndCBtYXRjaCBvcGFxdWUgJXAiLAogCQkJCSAgIGxvY2stPmxfYXN0X2RhdGEsIG9wYXF1ZSk7Ci0JCQkvL0xCVUcoKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXNvdXJjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKaW5kZXggYzZmNjJhOS4uZjc1MGQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKQEAgLTYyLDcgKzYyLDcgQEAKIExJU1RfSEVBRChsZGxtX2NsaV9pbmFjdGl2ZV9uYW1lc3BhY2VfbGlzdCk7CiAKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbGRsbV90eXBlX3Byb2NfZGlyID0gTlVMTDsKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbGRsbV9uc19wcm9jX2RpciA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpsZGxtX25zX3Byb2NfZGlyID0gTlVMTDsKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbGRsbV9zdmNfcHJvY19kaXIgPSBOVUxMOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGxkbG1fY2FuY2VsX3VudXNlZF9sb2Nrc19iZWZvcmVfcmVwbGF5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL01ha2VmaWxlCmluZGV4IGZjZWNiZDIuLjI5OTZhNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiBsaWJjZnMtbGludXgtb2JqcyA6PSBsaW51eC10cmFjZWZpbGUubyBsaW51eC1kZWJ1Zy5vCiBsaWJjZnMtbGludXgtb2JqcyArPSBsaW51eC1wcmltLm8gbGludXgtY3B1Lm8KIGxpYmNmcy1saW51eC1vYmpzICs9IGxpbnV4LXRjcGlwLm8KLWxpYmNmcy1saW51eC1vYmpzICs9IGxpbnV4LXByb2MubyBsaW51eC1jdXJwcm9jLm8KK2xpYmNmcy1saW51eC1vYmpzICs9IGxpbnV4LWN1cnByb2MubwogbGliY2ZzLWxpbnV4LW9ianMgKz0gbGludXgtbW9kdWxlLm8KIGxpYmNmcy1saW51eC1vYmpzICs9IGxpbnV4LWNyeXB0by5vCiBsaWJjZnMtbGludXgtb2JqcyArPSBsaW51eC1jcnlwdG8tYWRsZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYwppbmRleCA3NmM2MmU4Li4wMjFjOTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYwpAQCAtNDA5LDggKzQwOSw4IEBACiAJaWYgKG1heCA+IGNmc190cmFjZV9tYXhfZGVidWdfbWIoKSB8fCBtYXggPCBudW1fcG9zc2libGVfY3B1cygpKSB7CiAJCW1heCA9IFRDRF9NQVhfUEFHRVM7CiAJfSBlbHNlIHsKLQkJbWF4ID0gKG1heCAvIG51bV9wb3NzaWJsZV9jcHVzKCkpOwotCQltYXggPSBtYXggPDwgKDIwIC0gUEFHRV9DQUNIRV9TSElGVCk7CisJCW1heCA9IG1heCAvIG51bV9wb3NzaWJsZV9jcHVzKCk7CisJCW1heCA8PD0gKDIwIC0gUEFHRV9DQUNIRV9TSElGVCk7CiAJfQogCXJjID0gY2ZzX3RyYWNlZmlsZV9pbml0KG1heCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9oYXNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvaGFzaC5jCmluZGV4IGVjM2EyYTguLmE1NTU2N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9oYXNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2hhc2guYwpAQCAtMjAwOCwxMyArMjAwOCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChjZnNfaGFzaF9yZWhhc2hfa2V5KTsKIAotaW50IGNmc19oYXNoX2RlYnVnX2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit2b2lkIGNmc19oYXNoX2RlYnVnX2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiUtKnMlNnMlNnMlNnMlNnMlNnMlNnMlNnMlN3MlOHMlOHMlOHMlc1xuIiwKLQkJIENGU19IQVNIX0JJR05BTUVfTEVOLAotCQkgIm5hbWUiLCAiY3VyIiwgIm1pbiIsICJtYXgiLCAidGhldGEiLCAidC1taW4iLCAidC1tYXgiLAotCQkgImZsYWdzIiwgInJlaGFzaCIsICJjb3VudCIsICJtYXhkZXAiLCAibWF4ZGVwYiIsCi0JCSAiIGRpc3RyaWJ1dGlvbiIpOworCXNlcV9wcmludGYobSwgIiUtKnMgICBjdXIgICBtaW4gICBtYXggdGhldGEgdC1taW4gdC1tYXggZmxhZ3MgcmVoYXNoICAgY291bnQgIG1heGRlcCBtYXhkZXBiIGRpc3RyaWJ1dGlvblxuIiwKKwkJICAgQ0ZTX0hBU0hfQklHTkFNRV9MRU4sICJuYW1lIik7CiB9CiBFWFBPUlRfU1lNQk9MKGNmc19oYXNoX2RlYnVnX2hlYWRlcik7CiAKQEAgLTIwNDIsNyArMjAzOSw3IEBACiAJICAgICAgIENGU19IQVNIX1JIX05CS1QoaHMpIDogQ0ZTX0hBU0hfTkJLVChocyk7CiB9CiAKLWludCBjZnNfaGFzaF9kZWJ1Z19zdHIoc3RydWN0IGNmc19oYXNoICpocywgc3RydWN0IHNlcV9maWxlICptKQordm9pZCBjZnNfaGFzaF9kZWJ1Z19zdHIoc3RydWN0IGNmc19oYXNoICpocywgc3RydWN0IHNlcV9maWxlICptKQogewogCWludAkJICAgIGRpc3RbOF0gPSB7IDAsIH07CiAJaW50CQkgICAgbWF4ZGVwICA9IC0xOwpAQCAtMjA5Nyw3ICsyMDk0LDUgQEAKIAkJc2VxX3ByaW50ZihtLCAiJWQlYyIsICBkaXN0W2ldLCAoaSA9PSA3KSA/ICdcbicgOiAnLycpOwogCiAJY2ZzX2hhc2hfdW5sb2NrKGhzLCAwKTsKLQotCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChjZnNfaGFzaF9kZWJ1Z19zdHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jCmluZGV4IDA1Zjc1OTUuLmNjM2FiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jcHUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3B1LmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQl9CiAKIAkJdG1wICs9IHJjOwotCQlmb3JfZWFjaF9jcHVfbWFzayhqLCAqY3B0YWItPmN0Yl9wYXJ0c1tpXS5jcHRfY3B1bWFzaykgeworCQlmb3JfZWFjaF9jcHUoaiwgY3B0YWItPmN0Yl9wYXJ0c1tpXS5jcHRfY3B1bWFzaykgewogCQkJcmMgPSBzbnByaW50Zih0bXAsIGxlbiwgIiVkICIsIGopOwogCQkJbGVuIC09IHJjOwogCQkJaWYgKGxlbiA8PSAwKSB7CkBAIC0yNDAsOCArMjQwLDggQEAKIAlMQVNTRVJUKGNwdCA9PSBDRlNfQ1BUX0FOWSB8fCAoY3B0ID49IDAgJiYgY3B0IDwgY3B0YWItPmN0Yl9ucGFydHMpKTsKIAogCXJldHVybiBjcHQgPT0gQ0ZTX0NQVF9BTlkgPwotCSAgICAgICBjcHVzX3dlaWdodCgqY3B0YWItPmN0Yl9jcHVtYXNrKSA6Ci0JICAgICAgIGNwdXNfd2VpZ2h0KCpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spOworCSAgICAgICBjcHVtYXNrX3dlaWdodChjcHRhYi0+Y3RiX2NwdW1hc2spIDoKKwkgICAgICAgY3B1bWFza193ZWlnaHQoY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKTsKIH0KIEVYUE9SVF9TWU1CT0woY2ZzX2NwdF93ZWlnaHQpOwogCkBAIC0yNTEsOCArMjUxLDEwIEBACiAJTEFTU0VSVChjcHQgPT0gQ0ZTX0NQVF9BTlkgfHwgKGNwdCA+PSAwICYmIGNwdCA8IGNwdGFiLT5jdGJfbnBhcnRzKSk7CiAKIAlyZXR1cm4gY3B0ID09IENGU19DUFRfQU5ZID8KLQkgICAgICAgYW55X29ubGluZV9jcHUoKmNwdGFiLT5jdGJfY3B1bWFzaykgIT0gTlJfQ1BVUyA6Ci0JICAgICAgIGFueV9vbmxpbmVfY3B1KCpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spICE9IE5SX0NQVVM7CisJICAgICAgIGNwdW1hc2tfYW55X2FuZChjcHRhYi0+Y3RiX2NwdW1hc2ssCisJCQkgICAgICAgY3B1X29ubGluZV9tYXNrKSA8IG5yX2NwdV9pZHMgOgorCSAgICAgICBjcHVtYXNrX2FueV9hbmQoY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrLAorCQkJICAgICAgIGNwdV9vbmxpbmVfbWFzaykgPCBucl9jcHVfaWRzOwogfQogRVhQT1JUX1NZTUJPTChjZnNfY3B0X29ubGluZSk7CiAKQEAgLTI4Myw3ICsyODUsNyBAQAogCiAJTEFTU0VSVChjcHQgPj0gMCAmJiBjcHQgPCBjcHRhYi0+Y3RiX25wYXJ0cyk7CiAKLQlpZiAoY3B1IDwgMCB8fCBjcHUgPj0gTlJfQ1BVUyB8fCAhY3B1X29ubGluZShjcHUpKSB7CisJaWYgKGNwdSA8IDAgfHwgY3B1ID49IG5yX2NwdV9pZHMgfHwgIWNwdV9vbmxpbmUoY3B1KSkgewogCQlDREVCVUcoRF9JTkZPLCAiQ1BVICVkIGlzIGludmFsaWQgb3IgaXQncyBvZmZsaW5lXG4iLCBjcHUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yOTYsMTEgKzI5OCwxMSBAQAogCiAJY3B0YWItPmN0Yl9jcHUyY3B0W2NwdV0gPSBjcHQ7CiAKLQlMQVNTRVJUKCFjcHVfaXNzZXQoY3B1LCAqY3B0YWItPmN0Yl9jcHVtYXNrKSk7Ci0JTEFTU0VSVCghY3B1X2lzc2V0KGNwdSwgKmNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfY3B1bWFzaykpOworCUxBU1NFUlQoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHRhYi0+Y3RiX2NwdW1hc2spKTsKKwlMQVNTRVJUKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKSk7CiAKLQljcHVfc2V0KGNwdSwgKmNwdGFiLT5jdGJfY3B1bWFzayk7Ci0JY3B1X3NldChjcHUsICpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spOworCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwdGFiLT5jdGJfY3B1bWFzayk7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKTsKIAogCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwogCkBAIC0zMjQsNyArMzI2LDcgQEAKIAogCUxBU1NFUlQoY3B0ID09IENGU19DUFRfQU5ZIHx8IChjcHQgPj0gMCAmJiBjcHQgPCBjcHRhYi0+Y3RiX25wYXJ0cykpOwogCi0JaWYgKGNwdSA8IDAgfHwgY3B1ID49IE5SX0NQVVMpIHsKKwlpZiAoY3B1IDwgMCB8fCBjcHUgPj0gbnJfY3B1X2lkcykgewogCQlDREVCVUcoRF9JTkZPLCAiSW52YWxpZCBDUFUgaWQgJWRcbiIsIGNwdSk7CiAJCXJldHVybjsKIAl9CkBAIC0zNDQsMTEgKzM0NiwxMSBAQAogCQlyZXR1cm47CiAJfQogCi0JTEFTU0VSVChjcHVfaXNzZXQoY3B1LCAqY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKSk7Ci0JTEFTU0VSVChjcHVfaXNzZXQoY3B1LCAqY3B0YWItPmN0Yl9jcHVtYXNrKSk7CisJTEFTU0VSVChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKSk7CisJTEFTU0VSVChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B0YWItPmN0Yl9jcHVtYXNrKSk7CiAKLQljcHVfY2xlYXIoY3B1LCAqY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKTsKLQljcHVfY2xlYXIoY3B1LCAqY3B0YWItPmN0Yl9jcHVtYXNrKTsKKwljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfY3B1bWFzayk7CisJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHRhYi0+Y3RiX2NwdW1hc2spOwogCWNwdGFiLT5jdGJfY3B1MmNwdFtjcHVdID0gLTE7CiAKIAlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKQEAgLTM1NiwyMiArMzU4LDIyIEBACiAJTEFTU0VSVChub2RlX2lzc2V0KG5vZGUsICpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X25vZGVtYXNrKSk7CiAJTEFTU0VSVChub2RlX2lzc2V0KG5vZGUsICpjcHRhYi0+Y3RiX25vZGVtYXNrKSk7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKSB7CisJZm9yX2VhY2hfY3B1KGksIGNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfY3B1bWFzaykgewogCQkvKiB0aGlzIENQVCBoYXMgb3RoZXIgQ1BVIGJlbG9uZ2luZyB0byB0aGlzIG5vZGU/ICovCiAJCWlmIChjcHVfdG9fbm9kZShpKSA9PSBub2RlKQogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGkgPT0gTlJfQ1BVUykKKwlpZiAoaSA+PSBucl9jcHVfaWRzKQogCQlub2RlX2NsZWFyKG5vZGUsICpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X25vZGVtYXNrKTsKIAotCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHRhYi0+Y3RiX2NwdW1hc2spIHsKKwlmb3JfZWFjaF9jcHUoaSwgY3B0YWItPmN0Yl9jcHVtYXNrKSB7CiAJCS8qIHRoaXMgQ1BULXRhYmxlIGhhcyBvdGhlciBDUFUgYmVsb25naW5nIHRvIHRoaXMgbm9kZT8gKi8KIAkJaWYgKGNwdV90b19ub2RlKGkpID09IG5vZGUpCiAJCQlicmVhazsKIAl9CiAKLQlpZiAoaSA9PSBOUl9DUFVTKQorCWlmIChpID49IG5yX2NwdV9pZHMpCiAJCW5vZGVfY2xlYXIobm9kZSwgKmNwdGFiLT5jdGJfbm9kZW1hc2spOwogCiAJcmV0dXJuOwpAQCAtMzgzLDEzICszODUsMTQgQEAKIHsKIAlpbnQJaTsKIAotCWlmIChjcHVzX3dlaWdodCgqbWFzaykgPT0gMCB8fCBhbnlfb25saW5lX2NwdSgqbWFzaykgPT0gTlJfQ1BVUykgeworCWlmIChjcHVtYXNrX3dlaWdodChtYXNrKSA9PSAwIHx8CisJICAgIGNwdW1hc2tfYW55X2FuZChtYXNrLCBjcHVfb25saW5lX21hc2spID49IG5yX2NwdV9pZHMpIHsKIAkJQ0RFQlVHKERfSU5GTywgIk5vIG9ubGluZSBDUFUgaXMgZm91bmQgaW4gdGhlIENQVSBtYXNrIGZvciBDUFUgcGFydGl0aW9uICVkXG4iLAogCQkgICAgICAgY3B0KTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgKm1hc2spIHsKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykgewogCQlpZiAoIWNmc19jcHRfc2V0X2NwdShjcHRhYiwgY3B0LCBpKSkKIAkJCXJldHVybiAwOwogCX0KQEAgLTQwMyw3ICs0MDYsNyBAQAogewogCWludAlpOwogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgKm1hc2spCisJZm9yX2VhY2hfY3B1KGksIG1hc2spCiAJCWNmc19jcHRfdW5zZXRfY3B1KGNwdGFiLCBjcHQsIGkpOwogfQogRVhQT1JUX1NZTUJPTChjZnNfY3B0X3Vuc2V0X2NwdW1hc2spOwpAQCAtNDkzLDcgKzQ5Niw3IEBACiAJfQogCiAJZm9yICg7IGNwdCA8PSBsYXN0OyBjcHQrKykgewotCQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKQorCQlmb3JfZWFjaF9jcHUoaSwgY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKQogCQkJY2ZzX2NwdF91bnNldF9jcHUoY3B0YWIsIGNwdCwgaSk7CiAJfQogfQpAQCAtNTU0LDcgKzU1Nyw3IEBACiBpbnQKIGNmc19jcHRfb2ZfY3B1KHN0cnVjdCBjZnNfY3B0X3RhYmxlICpjcHRhYiwgaW50IGNwdSkKIHsKLQlMQVNTRVJUKGNwdSA+PSAwICYmIGNwdSA8IE5SX0NQVVMpOworCUxBU1NFUlQoY3B1ID49IDAgJiYgY3B1IDwgbnJfY3B1X2lkcyk7CiAKIAlyZXR1cm4gY3B0YWItPmN0Yl9jcHUyY3B0W2NwdV07CiB9CkBAIC01NzgsMTQgKzU4MSwxNCBAQAogCQlub2RlbWFzayA9IGNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfbm9kZW1hc2s7CiAJfQogCi0JaWYgKGFueV9vbmxpbmVfY3B1KCpjcHVtYXNrKSA9PSBOUl9DUFVTKSB7CisJaWYgKGNwdW1hc2tfYW55X2FuZChjcHVtYXNrLCBjcHVfb25saW5lX21hc2spID49IG5yX2NwdV9pZHMpIHsKIAkJQ0VSUk9SKCJObyBvbmxpbmUgQ1BVIGZvdW5kIGluIENQVSBwYXJ0aXRpb24gJWQsIGRpZCBzb21lb25lIGRvIENQVSBob3RwbHVnIG9uIHN5c3RlbT8gWW91IG1pZ2h0IG5lZWQgdG8gcmVsb2FkIEx1c3RyZSBtb2R1bGVzIHRvIGtlZXAgc3lzdGVtIHdvcmtpbmcgd2VsbC5cbiIsCiAJCSAgICAgICBjcHQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJaWYgKGNwdV9pc3NldChpLCAqY3B1bWFzaykpCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGksIGNwdW1hc2spKQogCQkJY29udGludWU7CiAKIAkJcmMgPSBzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrKTsKQEAgLTYxNiwxNCArNjE5LDE0IEBACiAKIAlMQVNTRVJUKG51bWJlciA+IDApOwogCi0JaWYgKG51bWJlciA+PSBjcHVzX3dlaWdodCgqbm9kZSkpIHsKLQkJd2hpbGUgKCFjcHVzX2VtcHR5KCpub2RlKSkgewotCQkJY3B1ID0gZmlyc3RfY3B1KCpub2RlKTsKKwlpZiAobnVtYmVyID49IGNwdW1hc2tfd2VpZ2h0KG5vZGUpKSB7CisJCXdoaWxlICghY3B1bWFza19lbXB0eShub2RlKSkgeworCQkJY3B1ID0gY3B1bWFza19maXJzdChub2RlKTsKIAogCQkJcmMgPSBjZnNfY3B0X3NldF9jcHUoY3B0YWIsIGNwdCwgY3B1KTsKIAkJCWlmICghcmMpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQljcHVfY2xlYXIoY3B1LCAqbm9kZSk7CisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG5vZGUpOwogCQl9CiAJCXJldHVybiAwOwogCX0KQEAgLTYzNiwyNyArNjM5LDI3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdoaWxlICghY3B1c19lbXB0eSgqbm9kZSkpIHsKLQkJY3B1ID0gZmlyc3RfY3B1KCpub2RlKTsKKwl3aGlsZSAoIWNwdW1hc2tfZW1wdHkobm9kZSkpIHsKKwkJY3B1ID0gY3B1bWFza19maXJzdChub2RlKTsKIAogCQkvKiBnZXQgY3B1bWFzayBmb3IgY29yZXMgaW4gdGhlIHNhbWUgc29ja2V0ICovCiAJCWNmc19jcHVfY29yZV9zaWJsaW5ncyhjcHUsIHNvY2tldCk7Ci0JCWNwdXNfYW5kKCpzb2NrZXQsICpzb2NrZXQsICpub2RlKTsKKwkJY3B1bWFza19hbmQoc29ja2V0LCBzb2NrZXQsIG5vZGUpOwogCi0JCUxBU1NFUlQoIWNwdXNfZW1wdHkoKnNvY2tldCkpOworCQlMQVNTRVJUKCFjcHVtYXNrX2VtcHR5KHNvY2tldCkpOwogCi0JCXdoaWxlICghY3B1c19lbXB0eSgqc29ja2V0KSkgeworCQl3aGlsZSAoIWNwdW1hc2tfZW1wdHkoc29ja2V0KSkgewogCQkJaW50ICAgICBpOwogCiAJCQkvKiBnZXQgY3B1bWFzayBmb3IgaHRzIGluIHRoZSBzYW1lIGNvcmUgKi8KIAkJCWNmc19jcHVfaHRfc2libGluZ3MoY3B1LCBjb3JlKTsKLQkJCWNwdXNfYW5kKCpjb3JlLCAqY29yZSwgKm5vZGUpOworCQkJY3B1bWFza19hbmQoY29yZSwgY29yZSwgbm9kZSk7CiAKLQkJCUxBU1NFUlQoIWNwdXNfZW1wdHkoKmNvcmUpKTsKKwkJCUxBU1NFUlQoIWNwdW1hc2tfZW1wdHkoY29yZSkpOwogCi0JCQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY29yZSkgewotCQkJCWNwdV9jbGVhcihpLCAqc29ja2V0KTsKLQkJCQljcHVfY2xlYXIoaSwgKm5vZGUpOworCQkJZm9yX2VhY2hfY3B1KGksIGNvcmUpIHsKKwkJCQljcHVtYXNrX2NsZWFyX2NwdShpLCBzb2NrZXQpOworCQkJCWNwdW1hc2tfY2xlYXJfY3B1KGksIG5vZGUpOwogCiAJCQkJcmMgPSBjZnNfY3B0X3NldF9jcHUoY3B0YWIsIGNwdCwgaSk7CiAJCQkJaWYgKCFyYykgewpAQCAtNjY3LDcgKzY3MCw3IEBACiAJCQkJaWYgKC0tbnVtYmVyID09IDApCiAJCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJY3B1ID0gZmlyc3RfY3B1KCpzb2NrZXQpOworCQkJY3B1ID0gY3B1bWFza19maXJzdChzb2NrZXQpOwogCQl9CiAJfQogCkBAIC03NjcsNyArNzcwLDcgQEAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKSB7CiAJCWNmc19ub2RlX3RvX2NwdW1hc2soaSwgbWFzayk7CiAKLQkJd2hpbGUgKCFjcHVzX2VtcHR5KCptYXNrKSkgeworCQl3aGlsZSAoIWNwdW1hc2tfZW1wdHkobWFzaykpIHsKIAkJCXN0cnVjdCBjZnNfY3B1X3BhcnRpdGlvbiAqcGFydDsKIAkJCWludCAgICBuOwogCkBAIC03NzYsMjQgKzc3OSwyNCBAQAogCiAJCQlwYXJ0ID0gJmNwdGFiLT5jdGJfcGFydHNbY3B0XTsKIAotCQkJbiA9IG51bSAtIGNwdXNfd2VpZ2h0KCpwYXJ0LT5jcHRfY3B1bWFzayk7CisJCQluID0gbnVtIC0gY3B1bWFza193ZWlnaHQocGFydC0+Y3B0X2NwdW1hc2spOwogCQkJTEFTU0VSVChuID4gMCk7CiAKIAkJCXJjID0gY2ZzX2NwdF9jaG9vc2VfbmNwdXMoY3B0YWIsIGNwdCwgbWFzaywgbik7CiAJCQlpZiAocmMgPCAwKQogCQkJCWdvdG8gZmFpbGVkOwogCi0JCQlMQVNTRVJUKG51bSA+PSBjcHVzX3dlaWdodCgqcGFydC0+Y3B0X2NwdW1hc2spKTsKLQkJCWlmIChudW0gPT0gY3B1c193ZWlnaHQoKnBhcnQtPmNwdF9jcHVtYXNrKSkKKwkJCUxBU1NFUlQobnVtID49IGNwdW1hc2tfd2VpZ2h0KHBhcnQtPmNwdF9jcHVtYXNrKSk7CisJCQlpZiAobnVtID09IGNwdW1hc2tfd2VpZ2h0KHBhcnQtPmNwdF9jcHVtYXNrKSkKIAkJCQljcHQrKzsKIAkJfQogCX0KIAogCWlmIChjcHQgIT0gbmNwdCB8fAotCSAgICBudW0gIT0gY3B1c193ZWlnaHQoKmNwdGFiLT5jdGJfcGFydHNbbmNwdCAtIDFdLmNwdF9jcHVtYXNrKSkgeworCSAgICBudW0gIT0gY3B1bWFza193ZWlnaHQoY3B0YWItPmN0Yl9wYXJ0c1tuY3B0IC0gMV0uY3B0X2NwdW1hc2spKSB7CiAJCUNFUlJPUigiRXhwZWN0ICVkKCVkKSBDUFUgcGFydGl0aW9ucyBidXQgZ290ICVkKCVkKSwgQ1BVIGhvdHBsdWcvdW5wbHVnIHdoaWxlIHNldHRpbmc/XG4iLAogCQkgICAgICAgY3B0YWItPmN0Yl9ucGFydHMsIG51bSwgY3B0LAotCQkgICAgICAgY3B1c193ZWlnaHQoKmNwdGFiLT5jdGJfcGFydHNbbmNwdCAtIDFdLmNwdF9jcHVtYXNrKSk7CisJCSAgICAgICBjcHVtYXNrX3dlaWdodChjcHRhYi0+Y3RiX3BhcnRzW25jcHQgLSAxXS5jcHRfY3B1bWFzaykpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTg0NSw3ICs4NDgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQloaWdoID0gbm9kZSA/IE1BWF9OVU1OT0RFUyAtIDEgOiBOUl9DUFVTIC0gMTsKKwloaWdoID0gbm9kZSA/IE1BWF9OVU1OT0RFUyAtIDEgOiBucl9jcHVfaWRzIC0gMTsKIAogCWNwdGFiID0gY2ZzX2NwdF90YWJsZV9hbGxvYyhuY3B0KTsKIAlpZiAoY3B0YWIgPT0gTlVMTCkgewpAQCAtOTY1LDcgKzk2OCw4IEBACiAJCW11dGV4X2xvY2soJmNwdF9kYXRhLmNwdF9tdXRleCk7CiAJCS8qIGlmIGFsbCBIVHMgaW4gYSBjb3JlIGFyZSBvZmZsaW5lLCBpdCBtYXkgYnJlYWsgYWZmaW5pdHkgKi8KIAkJY2ZzX2NwdV9odF9zaWJsaW5ncyhjcHUsIGNwdF9kYXRhLmNwdF9jcHVtYXNrKTsKLQkJd2FybiA9IGFueV9vbmxpbmVfY3B1KCpjcHRfZGF0YS5jcHRfY3B1bWFzaykgPj0gbnJfY3B1X2lkczsKKwkJd2FybiA9IGNwdW1hc2tfYW55X2FuZChjcHRfZGF0YS5jcHRfY3B1bWFzaywKKwkJCQkgICAgICAgY3B1X29ubGluZV9tYXNrKSA+PSBucl9jcHVfaWRzOwogCQltdXRleF91bmxvY2soJmNwdF9kYXRhLmNwdF9tdXRleCk7CiAJCUNERUJVRyh3YXJuID8gRF9XQVJOSU5HIDogRF9JTkZPLAogCQkgICAgICAgIkx1c3RyZTogY2FuJ3Qgc3VwcG9ydCBDUFUgcGx1Zy1vdXQgd2VsbCBub3csIHBlcmZvcm1hbmNlIGFuZCBzdGFiaWxpdHkgY291bGQgYmUgaW1wYWN0ZWQgW0NQVSAldSBhY3Rpb246ICVseF1cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1kZWJ1Zy5jCmluZGV4IDEyMDA1YTcuLjQ1NDVkNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1kZWJ1Zy5jCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogCiAjIGRlZmluZSBERUJVR19TVUJTWVNURU0gU19MTkVUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtbW9kdWxlLmMKaW5kZXggYTVlZmZjZC4uZTk2MmY4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1tb2R1bGUuYwpAQCAtNTcsNyArNTcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaGRyLT5pb2NfbGVuICsgYnVmID49IGVuZCkgeworCWlmIChoZHItPmlvY19sZW4gPj0gZW5kIC0gYnVmKSB7CiAJCUNFUlJPUigiUE9SVEFMUzogdXNlciBidWZmZXIgZXhjZWVkcyBrZXJuZWwgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByaW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1wcmltLmMKaW5kZXggMTlmNDA1ZS4uODM4ZjVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByaW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJpbS5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgiCiAKICNpZiBkZWZpbmVkKENPTkZJR19LR0RCKQotI2luY2x1ZGUgPGFzbS9rZ2RiLmg+CisjaW5jbHVkZSA8bGludXgva2dkYi5oPgogI2VuZGlmCiAKIC8qKgpAQCAtMTE3LDExICsxMTcsMTIgQEAKIHZvaWQgY2ZzX2VudGVyX2RlYnVnZ2VyKHZvaWQpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfS0dEQikKLS8vCUJSRUFLUE9JTlQoKTsKKwkvKiBCUkVBS1BPSU5UKCk7ICovCiAjZWxzZQogCS8qIG5vdGhpbmcgKi8KICNlbmRpZgogfQorRVhQT1JUX1NZTUJPTChjZnNfZW50ZXJfZGVidWdnZXIpOwogCiAKIHNpZ3NldF90CkBAIC0xMzgsNiArMTM5LDcgQEAKIAogCXJldHVybiBvbGQ7CiB9CitFWFBPUlRfU1lNQk9MKGNmc19ibG9ja19hbGxzaWdzKTsKIAogc2lnc2V0X3QgY2ZzX2Jsb2NrX3NpZ3ModW5zaWduZWQgbG9uZyBzaWdzKQogewpAQCAtMTUxLDYgKzE1Myw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCXJldHVybiBvbGQ7CiB9CitFWFBPUlRfU1lNQk9MKGNmc19ibG9ja19zaWdzKTsKIAogLyogQmxvY2sgYWxsIHNpZ25hbHMgZXhjZXB0IGZvciB0aGUgQHNpZ3MgKi8KIHNpZ3NldF90IGNmc19ibG9ja19zaWdzaW52KHVuc2lnbmVkIGxvbmcgc2lncykKQEAgLTE2Niw5ICsxNjksMTAgQEAKIAogCXJldHVybiBvbGQ7CiB9CitFWFBPUlRfU1lNQk9MKGNmc19ibG9ja19zaWdzaW52KTsKIAogdm9pZAotY2ZzX3Jlc3RvcmVfc2lncyAoc2lnc2V0X3Qgb2xkKQorY2ZzX3Jlc3RvcmVfc2lncyhzaWdzZXRfdCBvbGQpCiB7CiAJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CiAKQEAgLTE3NywxMiArMTgxLDE0IEBACiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKGNmc19yZXN0b3JlX3NpZ3MpOwogCiBpbnQKIGNmc19zaWduYWxfcGVuZGluZyh2b2lkKQogewogCXJldHVybiBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKIH0KK0VYUE9SVF9TWU1CT0woY2ZzX3NpZ25hbF9wZW5kaW5nKTsKIAogdm9pZAogY2ZzX2NsZWFyX3NpZ3BlbmRpbmcodm9pZCkKQEAgLTE5MywyNSArMTk5LDE5IEBACiAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl9TSUdQRU5ESU5HKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MKGNmc19jbGVhcl9zaWdwZW5kaW5nKTsKIAogaW50CiBsaWJjZnNfYXJjaF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGxpYmNmc19hcmNoX2luaXQpOwogCiB2b2lkCiBsaWJjZnNfYXJjaF9jbGVhbnVwKHZvaWQpCiB7CiAJcmV0dXJuOwogfQotCi1FWFBPUlRfU1lNQk9MKGxpYmNmc19hcmNoX2luaXQpOwogRVhQT1JUX1NZTUJPTChsaWJjZnNfYXJjaF9jbGVhbnVwKTsKLUVYUE9SVF9TWU1CT0woY2ZzX2VudGVyX2RlYnVnZ2VyKTsKLUVYUE9SVF9TWU1CT0woY2ZzX2Jsb2NrX2FsbHNpZ3MpOwotRVhQT1JUX1NZTUJPTChjZnNfYmxvY2tfc2lncyk7Ci1FWFBPUlRfU1lNQk9MKGNmc19ibG9ja19zaWdzaW52KTsKLUVYUE9SVF9TWU1CT0woY2ZzX3Jlc3RvcmVfc2lncyk7Ci1FWFBPUlRfU1lNQk9MKGNmc19zaWduYWxfcGVuZGluZyk7Ci1FWFBPUlRfU1lNQk9MKGNmc19jbGVhcl9zaWdwZW5kaW5nKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1wcm9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MzllMzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NyArMCwwIEBACi0vKgotICogR1BMIEhFQURFUiBTVEFSVAotICoKLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKLSAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCi0gKiBodHRwOi8vd3d3LnN1bi5jb20vc29mdHdhcmUvcHJvZHVjdHMvbHVzdHJlL2RvY3MvR1BMdjIucGRmCi0gKgotICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi0gKiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgotICogaGF2ZSBhbnkgcXVlc3Rpb25zLgotICoKLSAqIEdQTCBIRUFERVIgRU5ECi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKi8KLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMdXN0cmUsIGh0dHA6Ly93d3cubHVzdHJlLm9yZy8KLSAqIEx1c3RyZSBpcyBhIHRyYWRlbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKgotICogbGliY2ZzL2xpYmNmcy9saW51eC9saW51eC1wcm9jLmMKLSAqCi0gKiBBdXRob3I6IFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+Ci0gKiBBdXRob3I6IFBldGVyIEouIEJyYWFtIDxicmFhbUBjbHVzdGVyZnMuY29tPgotICogQXV0aG9yOiBQaGlsIFNjaHdhbiA8cGhpbEBjbHVzdGVyZnMuY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdWlvLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotCi0jIGRlZmluZSBERUJVR19TVUJTWVNURU0gU19MTkVUCi0KLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaCIKLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLSNpbmNsdWRlICIuLi90cmFjZWZpbGUuaCIKLQotc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpsbmV0X3RhYmxlX2hlYWRlciA9IE5VTEw7Ci1leHRlcm4gY2hhciBsbmV0X3VwY2FsbFsxMDI0XTsKLS8qKgotICogVGhlIHBhdGggb2YgZGVidWcgbG9nIGR1bXAgdXBjYWxsIHNjcmlwdC4KLSAqLwotZXh0ZXJuIGNoYXIgbG5ldF9kZWJ1Z19sb2dfdXBjYWxsWzEwMjRdOwotCi0jZGVmaW5lIENUTF9MTkVUCSgweDEwMCkKLWVudW0gewotCVBTREVWX0RFQlVHID0gMSwJICAvKiBjb250cm9sIGRlYnVnZ2luZyAqLwotCVBTREVWX1NVQlNZU1RFTV9ERUJVRywgICAgLyogY29udHJvbCBkZWJ1Z2dpbmcgKi8KLQlQU0RFVl9QUklOVEssCSAgICAgLyogZm9yY2UgYWxsIG1lc3NhZ2VzIHRvIGNvbnNvbGUgKi8KLQlQU0RFVl9DT05TT0xFX1JBVEVMSU1JVCwgIC8qIHJhdGVsaW1pdCBjb25zb2xlIG1lc3NhZ2VzICovCi0JUFNERVZfQ09OU09MRV9NQVhfREVMQVlfQ1MsIC8qIG1heGltdW0gZGVsYXkgb3ZlciB3aGljaCB3ZSBza2lwIG1lc3NhZ2VzICovCi0JUFNERVZfQ09OU09MRV9NSU5fREVMQVlfQ1MsIC8qIGluaXRpYWwgZGVsYXkgb3ZlciB3aGljaCB3ZSBza2lwIG1lc3NhZ2VzICovCi0JUFNERVZfQ09OU09MRV9CQUNLT0ZGLCAgICAvKiBkZWxheSBpbmNyZWFzZSBmYWN0b3IgKi8KLQlQU0RFVl9ERUJVR19QQVRILAkgLyogY3Jhc2hkdW1wIGxvZyBsb2NhdGlvbiAqLwotCVBTREVWX0RFQlVHX0RVTVBfUEFUSCwgICAgLyogY3Jhc2hkdW1wIHRyYWNlbG9nIGxvY2F0aW9uICovCi0JUFNERVZfQ1BUX1RBQkxFLAkgIC8qIGluZm9ybWF0aW9uIGFib3V0IGNwdSBwYXJ0aXRpb25zICovCi0JUFNERVZfTE5FVF9VUENBTEwsCS8qIFVzZXIgbW9kZSB1cGNhbGwgc2NyaXB0ICAqLwotCVBTREVWX0xORVRfTUVNVVNFRCwgICAgICAgLyogYnl0ZXMgY3VycmVudGx5IFBPUlRBTF9BTExPQ2F0ZWQgKi8KLQlQU0RFVl9MTkVUX0NBVEFTVFJPUEhFLCAgIC8qIGlmIHdlIGhhdmUgTEJVR2dlZCBvciBwYW5pYydkICovCi0JUFNERVZfTE5FVF9QQU5JQ19PTl9MQlVHLCAvKiBmbGFnIHRvIHBhbmljIG9uIExCVUcgKi8KLQlQU0RFVl9MTkVUX0RVTVBfS0VSTkVMLCAgIC8qIHNuYXBzaG90IGtlcm5lbCBkZWJ1ZyBidWZmZXIgdG8gZmlsZSAqLwotCVBTREVWX0xORVRfREFFTU9OX0ZJTEUsICAgLyogc3Bvb2wga2VybmVsIGRlYnVnIGJ1ZmZlciB0byBmaWxlICovCi0JUFNERVZfTE5FVF9ERUJVR19NQiwgICAgICAvKiBzaXplIG9mIGRlYnVnIGJ1ZmZlciAqLwotCVBTREVWX0xORVRfREVCVUdfTE9HX1VQQ0FMTCwgLyogZGVidWcgbG9nIHVwY2FsbCBzY3JpcHQgKi8KLQlQU0RFVl9MTkVUX1dBVENIRE9HX1JBVEVMSU1JVCwgIC8qIHJhdGVsaW1pdCB3YXRjaGRvZyBtZXNzYWdlcyAgKi8KLQlQU0RFVl9MTkVUX0ZPUkNFX0xCVUcsICAgIC8qIGhvb2sgdG8gZm9yY2UgYW4gTEJVRyAqLwotCVBTREVWX0xORVRfRkFJTF9MT0MsICAgICAgLyogY29udHJvbCB0ZXN0IGZhaWx1cmVzIGluc3RydW1lbnRhdGlvbiAqLwotCVBTREVWX0xORVRfRkFJTF9WQUwsICAgICAgLyogdXNlcmRhdGEgZm9yIGZhaWwgbG9jICovCi19OwotCi1zdGF0aWMgaW50IHByb2NfY2FsbF9oYW5kbGVyKHZvaWQgKmRhdGEsIGludCB3cml0ZSwgbG9mZl90ICpwcG9zLAotCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCi0JCWludCAoKmhhbmRsZXIpKHZvaWQgKmRhdGEsIGludCB3cml0ZSwKLQkJbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IGxlbikpCi17Ci0JaW50IHJjID0gaGFuZGxlcihkYXRhLCB3cml0ZSwgKnBwb3MsIGJ1ZmZlciwgKmxlbnApOwotCi0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHdyaXRlKSB7Ci0JCSpwcG9zICs9ICpsZW5wOwotCX0gZWxzZSB7Ci0JCSpsZW5wID0gcmM7Ci0JCSpwcG9zICs9IHJjOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3Byb2NfZG9iaXRtYXNrcyh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCi0JCQkgICAgIGxvZmZfdCBwb3MsIHZvaWQgX191c2VyICpidWZmZXIsIGludCBub2IpCi17Ci0JY29uc3QgaW50ICAgICB0bXBzdHJsZW4gPSA1MTI7Ci0JY2hhcgkgKnRtcHN0cjsKLQlpbnQJICAgcmM7Ci0JdW5zaWduZWQgaW50ICptYXNrID0gZGF0YTsKLQlpbnQJICAgaXNfc3Vic3lzID0gKG1hc2sgPT0gJmxpYmNmc19zdWJzeXN0ZW1fZGVidWcpID8gMSA6IDA7Ci0JaW50CSAgIGlzX3ByaW50ayA9IChtYXNrID09ICZsaWJjZnNfcHJpbnRrKSA/IDEgOiAwOwotCi0JcmMgPSBjZnNfdHJhY2VfYWxsb2NhdGVfc3RyaW5nX2J1ZmZlcigmdG1wc3RyLCB0bXBzdHJsZW4pOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmICghd3JpdGUpIHsKLQkJbGliY2ZzX2RlYnVnX21hc2syc3RyKHRtcHN0ciwgdG1wc3RybGVuLCAqbWFzaywgaXNfc3Vic3lzKTsKLQkJcmMgPSBzdHJsZW4odG1wc3RyKTsKLQotCQlpZiAocG9zID49IHJjKSB7Ci0JCQlyYyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhidWZmZXIsIG5vYiwKLQkJCQkJCSAgICAgIHRtcHN0ciArIHBvcywgIlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlyYyA9IGNmc190cmFjZV9jb3B5aW5fc3RyaW5nKHRtcHN0ciwgdG1wc3RybGVuLCBidWZmZXIsIG5vYik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWNmc190cmFjZV9mcmVlX3N0cmluZ19idWZmZXIodG1wc3RyLCB0bXBzdHJsZW4pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJcmMgPSBsaWJjZnNfZGVidWdfc3RyMm1hc2sobWFzaywgdG1wc3RyLCBpc19zdWJzeXMpOwotCQkvKiBBbHdheXMgcHJpbnQgTEJVRy9MQVNTRVJUIHRvIGNvbnNvbGUsIHNvIGtlZXAgdGhpcyBtYXNrICovCi0JCWlmIChpc19wcmludGspCi0JCQkqbWFzayB8PSBEX0VNRVJHOwotCX0KLQotCWNmc190cmFjZV9mcmVlX3N0cmluZ19idWZmZXIodG1wc3RyLCB0bXBzdHJsZW4pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBwcm9jX2RvYml0bWFza3Moc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiBwcm9jX2NhbGxfaGFuZGxlcih0YWJsZS0+ZGF0YSwgd3JpdGUsIHBwb3MsIGJ1ZmZlciwgbGVucCwKLQkJCQkgX19wcm9jX2RvYml0bWFza3MpOwotfQotCi1zdGF0aWMgaW50IG1pbl93YXRjaGRvZ19yYXRlbGltaXQgPSAwOwkgIC8qIGRpc2FibGUgcmF0ZWxpbWl0aW5nICovCi1zdGF0aWMgaW50IG1heF93YXRjaGRvZ19yYXRlbGltaXQgPSAoMjQqNjAqNjApOyAvKiBsaW1pdCB0byBvbmNlIHBlciBkYXkgKi8KLQotc3RhdGljIGludCBfX3Byb2NfZHVtcF9rZXJuZWwodm9pZCAqZGF0YSwgaW50IHdyaXRlLAotCQkJICAgICAgbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IG5vYikKLXsKLQlpZiAoIXdyaXRlKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBjZnNfdHJhY2VfZHVtcF9kZWJ1Z19idWZmZXJfdXNyc3RyKGJ1ZmZlciwgbm9iKTsKLX0KLQotc3RhdGljIGludCBwcm9jX2R1bXBfa2VybmVsKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAotCQkJCSBfX3Byb2NfZHVtcF9rZXJuZWwpOwotfQotCi1zdGF0aWMgaW50IF9fcHJvY19kYWVtb25fZmlsZSh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCi0JCQkgICAgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQotewotCWlmICghd3JpdGUpIHsKLQkJaW50IGxlbiA9IHN0cmxlbihjZnNfdHJhY2VmaWxlKTsKLQotCQlpZiAocG9zID49IGxlbikKLQkJCXJldHVybiAwOwotCi0JCXJldHVybiBjZnNfdHJhY2VfY29weW91dF9zdHJpbmcoYnVmZmVyLCBub2IsCi0JCQkJCQljZnNfdHJhY2VmaWxlICsgcG9zLCAiXG4iKTsKLQl9Ci0KLQlyZXR1cm4gY2ZzX3RyYWNlX2RhZW1vbl9jb21tYW5kX3VzcnN0cihidWZmZXIsIG5vYik7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvY19kYWVtb25fZmlsZShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiBwcm9jX2NhbGxfaGFuZGxlcih0YWJsZS0+ZGF0YSwgd3JpdGUsIHBwb3MsIGJ1ZmZlciwgbGVucCwKLQkJCQkgX19wcm9jX2RhZW1vbl9maWxlKTsKLX0KLQotc3RhdGljIGludCBfX3Byb2NfZGVidWdfbWIodm9pZCAqZGF0YSwgaW50IHdyaXRlLAotCQkJICAgbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IG5vYikKLXsKLQlpZiAoIXdyaXRlKSB7Ci0JCWNoYXIgdG1wc3RyWzMyXTsKLQkJaW50ICBsZW4gPSBzbnByaW50Zih0bXBzdHIsIHNpemVvZih0bXBzdHIpLCAiJWQiLAotCQkJCSAgICBjZnNfdHJhY2VfZ2V0X2RlYnVnX21iKCkpOwotCi0JCWlmIChwb3MgPj0gbGVuKQotCQkJcmV0dXJuIDA7Ci0KLQkJcmV0dXJuIGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhidWZmZXIsIG5vYiwgdG1wc3RyICsgcG9zLAotCQkgICAgICAgIlxuIik7Ci0JfQotCi0JcmV0dXJuIGNmc190cmFjZV9zZXRfZGVidWdfbWJfdXNyc3RyKGJ1ZmZlciwgbm9iKTsKLX0KLQotc3RhdGljIGludCBwcm9jX2RlYnVnX21iKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAotCQkJCSBfX3Byb2NfZGVidWdfbWIpOwotfQotCi1zdGF0aWMgaW50IHByb2NfY29uc29sZV9tYXhfZGVsYXlfY3Moc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKLQkJCQkgICAgIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcmMsIG1heF9kZWxheV9jczsKLQlzdHJ1Y3QgY3RsX3RhYmxlIGR1bW15ID0gKnRhYmxlOwotCWxvbmcgZDsKLQotCWR1bW15LmRhdGEgPSAmbWF4X2RlbGF5X2NzOwotCWR1bW15LnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjOwotCi0JaWYgKCF3cml0ZSkgeyAvKiByZWFkICovCi0JCW1heF9kZWxheV9jcyA9IGNmc19kdXJhdGlvbl9zZWMobGliY2ZzX2NvbnNvbGVfbWF4X2RlbGF5ICogMTAwKTsKLQkJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiB3cml0ZSAqLwotCW1heF9kZWxheV9jcyA9IDA7Ci0JcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCWlmIChtYXhfZGVsYXlfY3MgPD0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkID0gY2ZzX3RpbWVfc2Vjb25kcyhtYXhfZGVsYXlfY3MpIC8gMTAwOwotCWlmIChkID09IDAgfHwgZCA8IGxpYmNmc19jb25zb2xlX21pbl9kZWxheSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbGliY2ZzX2NvbnNvbGVfbWF4X2RlbGF5ID0gZDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBwcm9jX2NvbnNvbGVfbWluX2RlbGF5X2NzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCi0JCQkJICAgICBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IHJjLCBtaW5fZGVsYXlfY3M7Ci0Jc3RydWN0IGN0bF90YWJsZSBkdW1teSA9ICp0YWJsZTsKLQlsb25nIGQ7Ci0KLQlkdW1teS5kYXRhID0gJm1pbl9kZWxheV9jczsKLQlkdW1teS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYzsKLQotCWlmICghd3JpdGUpIHsgLyogcmVhZCAqLwotCQltaW5fZGVsYXlfY3MgPSBjZnNfZHVyYXRpb25fc2VjKGxpYmNmc19jb25zb2xlX21pbl9kZWxheSAqIDEwMCk7Ci0JCXJjID0gcHJvY19kb2ludHZlYygmZHVtbXksIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogd3JpdGUgKi8KLQltaW5fZGVsYXlfY3MgPSAwOwotCXJjID0gcHJvY19kb2ludHZlYygmZHVtbXksIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlpZiAobWluX2RlbGF5X2NzIDw9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZCA9IGNmc190aW1lX3NlY29uZHMobWluX2RlbGF5X2NzKSAvIDEwMDsKLQlpZiAoZCA9PSAwIHx8IGQgPiBsaWJjZnNfY29uc29sZV9tYXhfZGVsYXkpCi0JCXJldHVybiAtRUlOVkFMOwotCWxpYmNmc19jb25zb2xlX21pbl9kZWxheSA9IGQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvY19jb25zb2xlX2JhY2tvZmYoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcmMsIGJhY2tvZmY7Ci0Jc3RydWN0IGN0bF90YWJsZSBkdW1teSA9ICp0YWJsZTsKLQotCWR1bW15LmRhdGEgPSAmYmFja29mZjsKLQlkdW1teS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYzsKLQotCWlmICghd3JpdGUpIHsgLyogcmVhZCAqLwotCQliYWNrb2ZmPSBsaWJjZnNfY29uc29sZV9iYWNrb2ZmOwotCQlyYyA9IHByb2NfZG9pbnR2ZWMoJmR1bW15LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIHdyaXRlICovCi0JYmFja29mZiA9IDA7Ci0JcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCWlmIChiYWNrb2ZmIDw9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbGliY2ZzX2NvbnNvbGVfYmFja29mZiA9IGJhY2tvZmY7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbGliY2ZzX2ZvcmNlX2xidWcoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKLQkJCSAgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JaWYgKHdyaXRlKQotCQlMQlVHKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvY19mYWlsX2xvYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJIHZvaWQgX191c2VyICpidWZmZXIsCi0JCQkgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IHJjOwotCWxvbmcgb2xkX2ZhaWxfbG9jID0gY2ZzX2ZhaWxfbG9jOwotCi0JcmMgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLQlpZiAob2xkX2ZhaWxfbG9jICE9IGNmc19mYWlsX2xvYykKLQkJd2FrZV91cCgmY2ZzX3JhY2Vfd2FpdHEpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX3Byb2NfY3B0X3RhYmxlKHZvaWQgKmRhdGEsIGludCB3cml0ZSwKLQkJCSAgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQotewotCWNoYXIgKmJ1ZiA9IE5VTEw7Ci0JaW50ICAgbGVuID0gNDA5NjsKLQlpbnQgICByYyAgPSAwOwotCi0JaWYgKHdyaXRlKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JTEFTU0VSVChjZnNfY3B0X3RhYmxlICE9IE5VTEwpOwotCi0Jd2hpbGUgKDEpIHsKLQkJTElCQ0ZTX0FMTE9DKGJ1ZiwgbGVuKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJcmMgPSBjZnNfY3B0X3RhYmxlX3ByaW50KGNmc19jcHRfdGFibGUsIGJ1ZiwgbGVuKTsKLQkJaWYgKHJjID49IDApCi0JCQlicmVhazsKLQotCQlpZiAocmMgPT0gLUVGQklHKSB7Ci0JCQlMSUJDRlNfRlJFRShidWYsIGxlbik7Ci0JCQlsZW4gPDw9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAocG9zID49IHJjKSB7Ci0JCXJjID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBjZnNfdHJhY2VfY29weW91dF9zdHJpbmcoYnVmZmVyLCBub2IsIGJ1ZiArIHBvcywgTlVMTCk7Ci0gb3V0OgotCWlmIChidWYgIT0gTlVMTCkKLQkJTElCQ0ZTX0ZSRUUoYnVmLCBsZW4pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBwcm9jX2NwdF90YWJsZShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAotCQkJCSBfX3Byb2NfY3B0X3RhYmxlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgbG5ldF90YWJsZVtdID0gewotCS8qCi0JICogTkIgTm8gLnN0cmF0ZWd5IGVudHJpZXMgaGF2ZSBiZWVuIHByb3ZpZGVkIHNpbmNlIHN5c2N0bCg4KSBwcmVmZXJzCi0JICogdG8gZ28gdmlhIC9wcm9jIGZvciBwb3J0YWJpbGl0eS4KLQkgKi8KLQl7Ci0JCS5wcm9jbmFtZSA9ICJkZWJ1ZyIsCi0JCS5kYXRhICAgICA9ICZsaWJjZnNfZGVidWcsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9iaXRtYXNrcywKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gInN1YnN5c3RlbV9kZWJ1ZyIsCi0JCS5kYXRhICAgICA9ICZsaWJjZnNfc3Vic3lzdGVtX2RlYnVnLAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvYml0bWFza3MsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJwcmludGsiLAotCQkuZGF0YSAgICAgPSAmbGliY2ZzX3ByaW50aywKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCi0JCS5tb2RlICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2JpdG1hc2tzLAotCX0sCi0JewotCQkucHJvY25hbWUgPSAiY29uc29sZV9yYXRlbGltaXQiLAotCQkuZGF0YSAgICAgPSAmbGliY2ZzX2NvbnNvbGVfcmF0ZWxpbWl0LAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJjb25zb2xlX21heF9kZWxheV9jZW50aXNlY3MiLAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NvbnNvbGVfbWF4X2RlbGF5X2NzCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJjb25zb2xlX21pbl9kZWxheV9jZW50aXNlY3MiLAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NvbnNvbGVfbWluX2RlbGF5X2NzCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJjb25zb2xlX2JhY2tvZmYiLAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NvbnNvbGVfYmFja29mZgotCX0sCi0KLQl7Ci0JCS5wcm9jbmFtZSA9ICJkZWJ1Z19wYXRoIiwKLQkJLmRhdGEgICAgID0gbGliY2ZzX2RlYnVnX2ZpbGVfcGF0aF9hcnIsCi0JCS5tYXhsZW4gICA9IHNpemVvZihsaWJjZnNfZGVidWdfZmlsZV9wYXRoX2FyciksCi0JCS5tb2RlICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb3N0cmluZywKLQl9LAotCi0JewotCQkucHJvY25hbWUgPSAiY3B1X3BhcnRpdGlvbl90YWJsZSIsCi0JCS5tYXhsZW4gICA9IDEyOCwKLQkJLm1vZGUgICAgID0gMDQ0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NwdF90YWJsZSwKLQl9LAotCi0JewotCQkucHJvY25hbWUgPSAidXBjYWxsIiwKLQkJLmRhdGEgICAgID0gbG5ldF91cGNhbGwsCi0JCS5tYXhsZW4gICA9IHNpemVvZihsbmV0X3VwY2FsbCksCi0JCS5tb2RlICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb3N0cmluZywKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImRlYnVnX2xvZ191cGNhbGwiLAotCQkuZGF0YSAgICAgPSBsbmV0X2RlYnVnX2xvZ191cGNhbGwsCi0JCS5tYXhsZW4gICA9IHNpemVvZihsbmV0X2RlYnVnX2xvZ191cGNhbGwpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9zdHJpbmcsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJsbmV0X21lbXVzZWQiLAotCQkuZGF0YSAgICAgPSAoaW50ICopJmxpYmNmc19rbWVtb3J5LmNvdW50ZXIsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJjYXRhc3Ryb3BoZSIsCi0JCS5kYXRhICAgICA9ICZsaWJjZnNfY2F0YXN0cm9waGUsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJwYW5pY19vbl9sYnVnIiwKLQkJLmRhdGEgICAgID0gJmxpYmNmc19wYW5pY19vbl9sYnVnLAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUgPSAiZHVtcF9rZXJuZWwiLAotCQkubWF4bGVuICAgPSAyNTYsCi0JCS5tb2RlICAgICA9IDAyMDAsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kdW1wX2tlcm5lbCwKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImRhZW1vbl9maWxlIiwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLm1heGxlbiAgID0gMjU2LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZGFlbW9uX2ZpbGUsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJkZWJ1Z19tYiIsCi0JCS5tb2RlICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kZWJ1Z19tYiwKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gIndhdGNoZG9nX3JhdGVsaW1pdCIsCi0JCS5kYXRhICAgICA9ICZsaWJjZnNfd2F0Y2hkb2dfcmF0ZWxpbWl0LAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKLQkJLmV4dHJhMSAgID0gJm1pbl93YXRjaGRvZ19yYXRlbGltaXQsCi0JCS5leHRyYTIgICA9ICZtYXhfd2F0Y2hkb2dfcmF0ZWxpbWl0LAotCX0sCi0JewotCQkucHJvY25hbWUgPSAiZm9yY2VfbGJ1ZyIsCi0JCS5kYXRhICAgICA9IE5VTEwsCi0JCS5tYXhsZW4gICA9IDAsCi0JCS5tb2RlICAgICA9IDAyMDAsCi0JCS5wcm9jX2hhbmRsZXIgPSAmbGliY2ZzX2ZvcmNlX2xidWcKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImZhaWxfbG9jIiwKLQkJLmRhdGEgICAgID0gJmNmc19mYWlsX2xvYywKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGNmc19mYWlsX2xvYyksCi0JCS5tb2RlICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19mYWlsX2xvYwotCX0sCi0JewotCQkucHJvY25hbWUgPSAiZmFpbF92YWwiLAotCQkuZGF0YSAgICAgPSAmY2ZzX2ZhaWxfdmFsLAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjCi0JfSwKLQl7Ci0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdG9wX3RhYmxlW10gPSB7Ci0JewotCQkucHJvY25hbWUgPSAibG5ldCIsCi0JCS5tb2RlICAgICA9IDA1NTUsCi0JCS5kYXRhICAgICA9IE5VTEwsCi0JCS5tYXhsZW4gICA9IDAsCi0JCS5jaGlsZCAgICA9IGxuZXRfdGFibGUsCi0JfSwKLQl7Ci0JfQotfTsKLQotaW50IGluc2VydF9wcm9jKHZvaWQpCi17Ci0JaWYgKGxuZXRfdGFibGVfaGVhZGVyID09IE5VTEwpCi0JCWxuZXRfdGFibGVfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHRvcF90YWJsZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcmVtb3ZlX3Byb2Modm9pZCkKLXsKLQlpZiAobG5ldF90YWJsZV9oZWFkZXIgIT0gTlVMTCkKLQkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobG5ldF90YWJsZV9oZWFkZXIpOwotCi0JbG5ldF90YWJsZV9oZWFkZXIgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXRjcGlwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtdGNwaXAuYwppbmRleCBjZDJmYzAxLi5mMjQ2MmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtdGNwaXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtdGNwaXAuYwpAQCAtNTQzLDE5ICs1NDMsMTcgQEAKIAogCW5ld3NvY2stPm9wcyA9IHNvY2stPm9wczsKIAotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JYWRkX3dhaXRfcXVldWUoc2tfc2xlZXAoc29jay0+c2spLCAmd2FpdCk7Ci0KIAlyYyA9IHNvY2stPm9wcy0+YWNjZXB0KHNvY2ssIG5ld3NvY2ssIE9fTk9OQkxPQ0spOwogCWlmIChyYyA9PSAtRUFHQUlOKSB7CiAJCS8qIE5vdGhpbmcgcmVhZHksIHNvIHdhaXQgZm9yIGFjdGl2aXR5ICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFkZF93YWl0X3F1ZXVlKHNrX3NsZWVwKHNvY2stPnNrKSwgJndhaXQpOwogCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZShza19zbGVlcChzb2NrLT5zayksICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJcmMgPSBzb2NrLT5vcHMtPmFjY2VwdChzb2NrLCBuZXdzb2NrLCBPX05PTkJMT0NLKTsKIAl9CiAKLQlyZW1vdmVfd2FpdF9xdWV1ZShza19zbGVlcChzb2NrLT5zayksICZ3YWl0KTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCiAJaWYgKHJjICE9IDApCiAJCWdvdG8gZmFpbGVkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbW9kdWxlLmMKaW5kZXggN2RjNzdkZC4uZjBlZTc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9tb2R1bGUuYwpAQCAtMzMsMTUgKzMzLDgyIEBACiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMdXN0cmUsIGh0dHA6Ly93d3cubHVzdHJlLm9yZy8KICAqIEx1c3RyZSBpcyBhIHRyYWRlbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKLSNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTE5FVAorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKworIyBkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTE5FVAogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgiCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfY3J5cHRvLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9sbmV0L2xuZXQuaCIKICNpbmNsdWRlICJ0cmFjZWZpbGUuaCIKIAorTU9EVUxFX0FVVEhPUigiUGV0ZXIgSi4gQnJhYW0gPGJyYWFtQGNsdXN0ZXJmcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvcnRhbHMgdjMuMSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitleHRlcm4gc3RydWN0IG1pc2NkZXZpY2UgbGliY2ZzX2RldjsKK2V4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIGNmc190cmFjZWZpbGVfc2VtOworZXh0ZXJuIHN0cnVjdCBtdXRleCBjZnNfdHJhY2VfdGhyZWFkX211dGV4OworZXh0ZXJuIHN0cnVjdCBjZnNfd2lfc2NoZWQgKmNmc19zY2hlZF9yZWhhc2g7CitleHRlcm4gdm9pZCBsaWJjZnNfaW5pdF9uaWRzdHJpbmdzKHZvaWQpOworCitzdGF0aWMgaW50IGluc2VydF9wcm9jKHZvaWQpOworc3RhdGljIHZvaWQgcmVtb3ZlX3Byb2Modm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqbG5ldF90YWJsZV9oZWFkZXI7CitleHRlcm4gY2hhciBsbmV0X3VwY2FsbFsxMDI0XTsKKy8qKgorICogVGhlIHBhdGggb2YgZGVidWcgbG9nIGR1bXAgdXBjYWxsIHNjcmlwdC4KKyAqLworZXh0ZXJuIGNoYXIgbG5ldF9kZWJ1Z19sb2dfdXBjYWxsWzEwMjRdOworCisjZGVmaW5lIENUTF9MTkVUCSgweDEwMCkKKworZW51bSB7CisJUFNERVZfREVCVUcgPSAxLAkgIC8qIGNvbnRyb2wgZGVidWdnaW5nICovCisJUFNERVZfU1VCU1lTVEVNX0RFQlVHLCAgICAvKiBjb250cm9sIGRlYnVnZ2luZyAqLworCVBTREVWX1BSSU5USywJICAgICAvKiBmb3JjZSBhbGwgbWVzc2FnZXMgdG8gY29uc29sZSAqLworCVBTREVWX0NPTlNPTEVfUkFURUxJTUlULCAgLyogcmF0ZWxpbWl0IGNvbnNvbGUgbWVzc2FnZXMgKi8KKwlQU0RFVl9DT05TT0xFX01BWF9ERUxBWV9DUywgLyogbWF4aW11bSBkZWxheSBvdmVyIHdoaWNoIHdlIHNraXAgbWVzc2FnZXMgKi8KKwlQU0RFVl9DT05TT0xFX01JTl9ERUxBWV9DUywgLyogaW5pdGlhbCBkZWxheSBvdmVyIHdoaWNoIHdlIHNraXAgbWVzc2FnZXMgKi8KKwlQU0RFVl9DT05TT0xFX0JBQ0tPRkYsICAgIC8qIGRlbGF5IGluY3JlYXNlIGZhY3RvciAqLworCVBTREVWX0RFQlVHX1BBVEgsCSAvKiBjcmFzaGR1bXAgbG9nIGxvY2F0aW9uICovCisJUFNERVZfREVCVUdfRFVNUF9QQVRILCAgICAvKiBjcmFzaGR1bXAgdHJhY2Vsb2cgbG9jYXRpb24gKi8KKwlQU0RFVl9DUFRfVEFCTEUsCSAgLyogaW5mb3JtYXRpb24gYWJvdXQgY3B1IHBhcnRpdGlvbnMgKi8KKwlQU0RFVl9MTkVUX1VQQ0FMTCwJLyogVXNlciBtb2RlIHVwY2FsbCBzY3JpcHQgICovCisJUFNERVZfTE5FVF9NRU1VU0VELCAgICAgICAvKiBieXRlcyBjdXJyZW50bHkgUE9SVEFMX0FMTE9DYXRlZCAqLworCVBTREVWX0xORVRfQ0FUQVNUUk9QSEUsICAgLyogaWYgd2UgaGF2ZSBMQlVHZ2VkIG9yIHBhbmljJ2QgKi8KKwlQU0RFVl9MTkVUX1BBTklDX09OX0xCVUcsIC8qIGZsYWcgdG8gcGFuaWMgb24gTEJVRyAqLworCVBTREVWX0xORVRfRFVNUF9LRVJORUwsICAgLyogc25hcHNob3Qga2VybmVsIGRlYnVnIGJ1ZmZlciB0byBmaWxlICovCisJUFNERVZfTE5FVF9EQUVNT05fRklMRSwgICAvKiBzcG9vbCBrZXJuZWwgZGVidWcgYnVmZmVyIHRvIGZpbGUgKi8KKwlQU0RFVl9MTkVUX0RFQlVHX01CLCAgICAgIC8qIHNpemUgb2YgZGVidWcgYnVmZmVyICovCisJUFNERVZfTE5FVF9ERUJVR19MT0dfVVBDQUxMLCAvKiBkZWJ1ZyBsb2cgdXBjYWxsIHNjcmlwdCAqLworCVBTREVWX0xORVRfV0FUQ0hET0dfUkFURUxJTUlULCAgLyogcmF0ZWxpbWl0IHdhdGNoZG9nIG1lc3NhZ2VzICAqLworCVBTREVWX0xORVRfRk9SQ0VfTEJVRywgICAgLyogaG9vayB0byBmb3JjZSBhbiBMQlVHICovCisJUFNERVZfTE5FVF9GQUlMX0xPQywgICAgICAvKiBjb250cm9sIHRlc3QgZmFpbHVyZXMgaW5zdHJ1bWVudGF0aW9uICovCisJUFNERVZfTE5FVF9GQUlMX1ZBTCwgICAgICAvKiB1c2VyZGF0YSBmb3IgZmFpbCBsb2MgKi8KK307CisKIHN0YXRpYyB2b2lkIGtwb3J0YWxfbWVtaG9nX2ZyZWUgKHN0cnVjdCBsaWJjZnNfZGV2aWNlX3VzZXJzdGF0ZSAqbGR1KQogewogCXN0cnVjdCBwYWdlICoqbGV2ZWwwcCA9ICZsZHUtPmxkdV9tZW1ob2dfcm9vdF9wYWdlOwpAQCAtMzIwLDE5ICszODcsNiBAQAogCWxpYmNmc19pb2N0bAogfTsKIAotZXh0ZXJuIGludCBpbnNlcnRfcHJvYyh2b2lkKTsKLWV4dGVybiB2b2lkIHJlbW92ZV9wcm9jKHZvaWQpOwotTU9EVUxFX0FVVEhPUigiUGV0ZXIgSi4gQnJhYW0gPGJyYWFtQGNsdXN0ZXJmcy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBvcnRhbHMgdjMuMSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1leHRlcm4gc3RydWN0IG1pc2NkZXZpY2UgbGliY2ZzX2RldjsKLWV4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIGNmc190cmFjZWZpbGVfc2VtOwotZXh0ZXJuIHN0cnVjdCBtdXRleCBjZnNfdHJhY2VfdGhyZWFkX211dGV4OwotZXh0ZXJuIHN0cnVjdCBjZnNfd2lfc2NoZWQgKmNmc19zY2hlZF9yZWhhc2g7Ci0KLWV4dGVybiB2b2lkIGxpYmNmc19pbml0X25pZHN0cmluZ3Modm9pZCk7Ci0KIHN0YXRpYyBpbnQgaW5pdF9saWJjZnNfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJjOwpAQCAtMzQ3LDcgKzQwMSw3IEBACiAKIAlyYyA9IGxpYmNmc19kZWJ1Z19pbml0KDUgKiAxMDI0ICogMTAyNCk7CiAJaWYgKHJjIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkx1c3RyZUVycm9yOiBsaWJjZnNfZGVidWdfaW5pdDogJWRcbiIsIHJjKTsKKwkJcHJfZXJyKCJMdXN0cmVFcnJvcjogbGliY2ZzX2RlYnVnX2luaXQ6ICVkXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTQzMywxMiArNDg3LDQ5MCBAQAogCiAJcmMgPSBsaWJjZnNfZGVidWdfY2xlYW51cCgpOwogCWlmIChyYykKLQkJcHJpbnRrKEtFUk5fRVJSICJMdXN0cmVFcnJvcjogbGliY2ZzX2RlYnVnX2NsZWFudXA6ICVkXG4iLAotCQkgICAgICAgcmMpOworCQlwcl9lcnIoIkx1c3RyZUVycm9yOiBsaWJjZnNfZGVidWdfY2xlYW51cDogJWRcbiIsIHJjKTsKIAogCWxpYmNmc19hcmNoX2NsZWFudXAoKTsKIH0KIAorc3RhdGljIGludCBwcm9jX2NhbGxfaGFuZGxlcih2b2lkICpkYXRhLCBpbnQgd3JpdGUsIGxvZmZfdCAqcHBvcywKKwkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlpbnQgKCpoYW5kbGVyKSh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCisJCWxvZmZfdCBwb3MsIHZvaWQgX191c2VyICpidWZmZXIsIGludCBsZW4pKQoreworCWludCByYyA9IGhhbmRsZXIoZGF0YSwgd3JpdGUsICpwcG9zLCBidWZmZXIsICpsZW5wKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmICh3cml0ZSkgeworCQkqcHBvcyArPSAqbGVucDsKKwl9IGVsc2UgeworCQkqbGVucCA9IHJjOworCQkqcHBvcyArPSByYzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19wcm9jX2RvYml0bWFza3Modm9pZCAqZGF0YSwgaW50IHdyaXRlLAorCQkJICAgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQoreworCWNvbnN0IGludCAgICAgdG1wc3RybGVuID0gNTEyOworCWNoYXIJICp0bXBzdHI7CisJaW50CSAgIHJjOworCXVuc2lnbmVkIGludCAqbWFzayA9IGRhdGE7CisJaW50CSAgIGlzX3N1YnN5cyA9IChtYXNrID09ICZsaWJjZnNfc3Vic3lzdGVtX2RlYnVnKSA/IDEgOiAwOworCWludAkgICBpc19wcmludGsgPSAobWFzayA9PSAmbGliY2ZzX3ByaW50aykgPyAxIDogMDsKKworCXJjID0gY2ZzX3RyYWNlX2FsbG9jYXRlX3N0cmluZ19idWZmZXIoJnRtcHN0ciwgdG1wc3RybGVuKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIXdyaXRlKSB7CisJCWxpYmNmc19kZWJ1Z19tYXNrMnN0cih0bXBzdHIsIHRtcHN0cmxlbiwgKm1hc2ssIGlzX3N1YnN5cyk7CisJCXJjID0gc3RybGVuKHRtcHN0cik7CisKKwkJaWYgKHBvcyA+PSByYykgeworCQkJcmMgPSAwOworCQl9IGVsc2UgeworCQkJcmMgPSBjZnNfdHJhY2VfY29weW91dF9zdHJpbmcoYnVmZmVyLCBub2IsCisJCQkJCQkgICAgICB0bXBzdHIgKyBwb3MsICJcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBjZnNfdHJhY2VfY29weWluX3N0cmluZyh0bXBzdHIsIHRtcHN0cmxlbiwgYnVmZmVyLCBub2IpOworCQlpZiAocmMgPCAwKSB7CisJCQljZnNfdHJhY2VfZnJlZV9zdHJpbmdfYnVmZmVyKHRtcHN0ciwgdG1wc3RybGVuKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXJjID0gbGliY2ZzX2RlYnVnX3N0cjJtYXNrKG1hc2ssIHRtcHN0ciwgaXNfc3Vic3lzKTsKKwkJLyogQWx3YXlzIHByaW50IExCVUcvTEFTU0VSVCB0byBjb25zb2xlLCBzbyBrZWVwIHRoaXMgbWFzayAqLworCQlpZiAoaXNfcHJpbnRrKQorCQkJKm1hc2sgfD0gRF9FTUVSRzsKKwl9CisKKwljZnNfdHJhY2VfZnJlZV9zdHJpbmdfYnVmZmVyKHRtcHN0ciwgdG1wc3RybGVuKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19kb2JpdG1hc2tzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gcHJvY19jYWxsX2hhbmRsZXIodGFibGUtPmRhdGEsIHdyaXRlLCBwcG9zLCBidWZmZXIsIGxlbnAsCisJCQkJIF9fcHJvY19kb2JpdG1hc2tzKTsKK30KKworc3RhdGljIGludCBtaW5fd2F0Y2hkb2dfcmF0ZWxpbWl0OwkgIC8qIGRpc2FibGUgcmF0ZWxpbWl0aW5nICovCitzdGF0aWMgaW50IG1heF93YXRjaGRvZ19yYXRlbGltaXQgPSAoMjQqNjAqNjApOyAvKiBsaW1pdCB0byBvbmNlIHBlciBkYXkgKi8KKworc3RhdGljIGludCBfX3Byb2NfZHVtcF9rZXJuZWwodm9pZCAqZGF0YSwgaW50IHdyaXRlLAorCQkJICAgICAgbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IG5vYikKK3sKKwlpZiAoIXdyaXRlKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBjZnNfdHJhY2VfZHVtcF9kZWJ1Z19idWZmZXJfdXNyc3RyKGJ1ZmZlciwgbm9iKTsKK30KKworc3RhdGljIGludCBwcm9jX2R1bXBfa2VybmVsKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAorCQkJCSBfX3Byb2NfZHVtcF9rZXJuZWwpOworfQorCitzdGF0aWMgaW50IF9fcHJvY19kYWVtb25fZmlsZSh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCisJCQkgICAgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQoreworCWlmICghd3JpdGUpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihjZnNfdHJhY2VmaWxlKTsKKworCQlpZiAocG9zID49IGxlbikKKwkJCXJldHVybiAwOworCisJCXJldHVybiBjZnNfdHJhY2VfY29weW91dF9zdHJpbmcoYnVmZmVyLCBub2IsCisJCQkJCQljZnNfdHJhY2VmaWxlICsgcG9zLCAiXG4iKTsKKwl9CisKKwlyZXR1cm4gY2ZzX3RyYWNlX2RhZW1vbl9jb21tYW5kX3VzcnN0cihidWZmZXIsIG5vYik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19kYWVtb25fZmlsZShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBwcm9jX2NhbGxfaGFuZGxlcih0YWJsZS0+ZGF0YSwgd3JpdGUsIHBwb3MsIGJ1ZmZlciwgbGVucCwKKwkJCQkgX19wcm9jX2RhZW1vbl9maWxlKTsKK30KKworc3RhdGljIGludCBfX3Byb2NfZGVidWdfbWIodm9pZCAqZGF0YSwgaW50IHdyaXRlLAorCQkJICAgbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IG5vYikKK3sKKwlpZiAoIXdyaXRlKSB7CisJCWNoYXIgdG1wc3RyWzMyXTsKKwkJaW50ICBsZW4gPSBzbnByaW50Zih0bXBzdHIsIHNpemVvZih0bXBzdHIpLCAiJWQiLAorCQkJCSAgICBjZnNfdHJhY2VfZ2V0X2RlYnVnX21iKCkpOworCisJCWlmIChwb3MgPj0gbGVuKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhidWZmZXIsIG5vYiwgdG1wc3RyICsgcG9zLAorCQkgICAgICAgIlxuIik7CisJfQorCisJcmV0dXJuIGNmc190cmFjZV9zZXRfZGVidWdfbWJfdXNyc3RyKGJ1ZmZlciwgbm9iKTsKK30KKworc3RhdGljIGludCBwcm9jX2RlYnVnX21iKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAorCQkJCSBfX3Byb2NfZGVidWdfbWIpOworfQorCitzdGF0aWMgaW50IHByb2NfY29uc29sZV9tYXhfZGVsYXlfY3Moc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJCQkgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmMsIG1heF9kZWxheV9jczsKKwlzdHJ1Y3QgY3RsX3RhYmxlIGR1bW15ID0gKnRhYmxlOworCWxvbmcgZDsKKworCWR1bW15LmRhdGEgPSAmbWF4X2RlbGF5X2NzOworCWR1bW15LnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjOworCisJaWYgKCF3cml0ZSkgeyAvKiByZWFkICovCisJCW1heF9kZWxheV9jcyA9IGNmc19kdXJhdGlvbl9zZWMobGliY2ZzX2NvbnNvbGVfbWF4X2RlbGF5ICogMTAwKTsKKwkJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiB3cml0ZSAqLworCW1heF9kZWxheV9jcyA9IDA7CisJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCWlmIChtYXhfZGVsYXlfY3MgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkID0gY2ZzX3RpbWVfc2Vjb25kcyhtYXhfZGVsYXlfY3MpIC8gMTAwOworCWlmIChkID09IDAgfHwgZCA8IGxpYmNmc19jb25zb2xlX21pbl9kZWxheSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGliY2ZzX2NvbnNvbGVfbWF4X2RlbGF5ID0gZDsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcm9jX2NvbnNvbGVfbWluX2RlbGF5X2NzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCQkJICAgICBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJjLCBtaW5fZGVsYXlfY3M7CisJc3RydWN0IGN0bF90YWJsZSBkdW1teSA9ICp0YWJsZTsKKwlsb25nIGQ7CisKKwlkdW1teS5kYXRhID0gJm1pbl9kZWxheV9jczsKKwlkdW1teS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYzsKKworCWlmICghd3JpdGUpIHsgLyogcmVhZCAqLworCQltaW5fZGVsYXlfY3MgPSBjZnNfZHVyYXRpb25fc2VjKGxpYmNmc19jb25zb2xlX21pbl9kZWxheSAqIDEwMCk7CisJCXJjID0gcHJvY19kb2ludHZlYygmZHVtbXksIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogd3JpdGUgKi8KKwltaW5fZGVsYXlfY3MgPSAwOworCXJjID0gcHJvY19kb2ludHZlYygmZHVtbXksIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlpZiAobWluX2RlbGF5X2NzIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZCA9IGNmc190aW1lX3NlY29uZHMobWluX2RlbGF5X2NzKSAvIDEwMDsKKwlpZiAoZCA9PSAwIHx8IGQgPiBsaWJjZnNfY29uc29sZV9tYXhfZGVsYXkpCisJCXJldHVybiAtRUlOVkFMOworCWxpYmNmc19jb25zb2xlX21pbl9kZWxheSA9IGQ7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19jb25zb2xlX2JhY2tvZmYoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmMsIGJhY2tvZmY7CisJc3RydWN0IGN0bF90YWJsZSBkdW1teSA9ICp0YWJsZTsKKworCWR1bW15LmRhdGEgPSAmYmFja29mZjsKKwlkdW1teS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYzsKKworCWlmICghd3JpdGUpIHsgLyogcmVhZCAqLworCQliYWNrb2ZmID0gbGliY2ZzX2NvbnNvbGVfYmFja29mZjsKKwkJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiB3cml0ZSAqLworCWJhY2tvZmYgPSAwOworCXJjID0gcHJvY19kb2ludHZlYygmZHVtbXksIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlpZiAoYmFja29mZiA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpYmNmc19jb25zb2xlX2JhY2tvZmYgPSBiYWNrb2ZmOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxpYmNmc19mb3JjZV9sYnVnKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkgICAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWlmICh3cml0ZSkKKwkJTEJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfZmFpbF9sb2Moc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCByYzsKKwlsb25nIG9sZF9mYWlsX2xvYyA9IGNmc19mYWlsX2xvYzsKKworCXJjID0gcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKG9sZF9mYWlsX2xvYyAhPSBjZnNfZmFpbF9sb2MpCisJCXdha2VfdXAoJmNmc19yYWNlX3dhaXRxKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19wcm9jX2NwdF90YWJsZSh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCisJCQkgICAgbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IG5vYikKK3sKKwljaGFyICpidWYgPSBOVUxMOworCWludCAgIGxlbiA9IDQwOTY7CisJaW50ICAgcmMgID0gMDsKKworCWlmICh3cml0ZSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCUxBU1NFUlQoY2ZzX2NwdF90YWJsZSAhPSBOVUxMKTsKKworCXdoaWxlICgxKSB7CisJCUxJQkNGU19BTExPQyhidWYsIGxlbik7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJjID0gY2ZzX2NwdF90YWJsZV9wcmludChjZnNfY3B0X3RhYmxlLCBidWYsIGxlbik7CisJCWlmIChyYyA+PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHJjID09IC1FRkJJRykgeworCQkJTElCQ0ZTX0ZSRUUoYnVmLCBsZW4pOworCQkJbGVuIDw8PSAxOworCQkJY29udGludWU7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHBvcyA+PSByYykgeworCQlyYyA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gY2ZzX3RyYWNlX2NvcHlvdXRfc3RyaW5nKGJ1ZmZlciwgbm9iLCBidWYgKyBwb3MsIE5VTEwpOworIG91dDoKKwlpZiAoYnVmICE9IE5VTEwpCisJCUxJQkNGU19GUkVFKGJ1ZiwgbGVuKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19jcHRfdGFibGUoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBwcm9jX2NhbGxfaGFuZGxlcih0YWJsZS0+ZGF0YSwgd3JpdGUsIHBwb3MsIGJ1ZmZlciwgbGVucCwKKwkJCQkgX19wcm9jX2NwdF90YWJsZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGxuZXRfdGFibGVbXSA9IHsKKwkvKgorCSAqIE5CIE5vIC5zdHJhdGVneSBlbnRyaWVzIGhhdmUgYmVlbiBwcm92aWRlZCBzaW5jZSBzeXNjdGwoOCkgcHJlZmVycworCSAqIHRvIGdvIHZpYSAvcHJvYyBmb3IgcG9ydGFiaWxpdHkuCisJICovCisJeworCQkucHJvY25hbWUgPSAiZGVidWciLAorCQkuZGF0YSAgICAgPSAmbGliY2ZzX2RlYnVnLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvYml0bWFza3MsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJzdWJzeXN0ZW1fZGVidWciLAorCQkuZGF0YSAgICAgPSAmbGliY2ZzX3N1YnN5c3RlbV9kZWJ1ZywKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2JpdG1hc2tzLAorCX0sCisJeworCQkucHJvY25hbWUgPSAicHJpbnRrIiwKKwkJLmRhdGEgICAgID0gJmxpYmNmc19wcmludGssCisJCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAorCQkubW9kZSAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9iaXRtYXNrcywKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gImNvbnNvbGVfcmF0ZWxpbWl0IiwKKwkJLmRhdGEgICAgID0gJmxpYmNmc19jb25zb2xlX3JhdGVsaW1pdCwKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCQkucHJvY25hbWUgPSAiY29uc29sZV9tYXhfZGVsYXlfY2VudGlzZWNzIiwKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19jb25zb2xlX21heF9kZWxheV9jcworCX0sCisJeworCQkucHJvY25hbWUgPSAiY29uc29sZV9taW5fZGVsYXlfY2VudGlzZWNzIiwKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19jb25zb2xlX21pbl9kZWxheV9jcworCX0sCisJeworCQkucHJvY25hbWUgPSAiY29uc29sZV9iYWNrb2ZmIiwKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19jb25zb2xlX2JhY2tvZmYKKwl9LAorCisJeworCQkucHJvY25hbWUgPSAiZGVidWdfcGF0aCIsCisJCS5kYXRhICAgICA9IGxpYmNmc19kZWJ1Z19maWxlX3BhdGhfYXJyLAorCQkubWF4bGVuICAgPSBzaXplb2YobGliY2ZzX2RlYnVnX2ZpbGVfcGF0aF9hcnIpLAorCQkubW9kZSAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9zdHJpbmcsCisJfSwKKworCXsKKwkJLnByb2NuYW1lID0gImNwdV9wYXJ0aXRpb25fdGFibGUiLAorCQkubWF4bGVuICAgPSAxMjgsCisJCS5tb2RlICAgICA9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19jcHRfdGFibGUsCisJfSwKKworCXsKKwkJLnByb2NuYW1lID0gInVwY2FsbCIsCisJCS5kYXRhICAgICA9IGxuZXRfdXBjYWxsLAorCQkubWF4bGVuICAgPSBzaXplb2YobG5ldF91cGNhbGwpLAorCQkubW9kZSAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9zdHJpbmcsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJkZWJ1Z19sb2dfdXBjYWxsIiwKKwkJLmRhdGEgICAgID0gbG5ldF9kZWJ1Z19sb2dfdXBjYWxsLAorCQkubWF4bGVuICAgPSBzaXplb2YobG5ldF9kZWJ1Z19sb2dfdXBjYWxsKSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2Rvc3RyaW5nLAorCX0sCisJeworCQkucHJvY25hbWUgPSAibG5ldF9tZW11c2VkIiwKKwkJLmRhdGEgICAgID0gKGludCAqKSZsaWJjZnNfa21lbW9yeS5jb3VudGVyLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUgPSAiY2F0YXN0cm9waGUiLAorCQkuZGF0YSAgICAgPSAmbGliY2ZzX2NhdGFzdHJvcGhlLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUgPSAicGFuaWNfb25fbGJ1ZyIsCisJCS5kYXRhICAgICA9ICZsaWJjZnNfcGFuaWNfb25fbGJ1ZywKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gImR1bXBfa2VybmVsIiwKKwkJLm1heGxlbiAgID0gMjU2LAorCQkubW9kZSAgICAgPSAwMjAwLAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZHVtcF9rZXJuZWwsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJkYWVtb25fZmlsZSIsCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5tYXhsZW4gICA9IDI1NiwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RhZW1vbl9maWxlLAorCX0sCisJeworCQkucHJvY25hbWUgPSAiZGVidWdfbWIiLAorCQkubW9kZSAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZGVidWdfbWIsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJ3YXRjaGRvZ19yYXRlbGltaXQiLAorCQkuZGF0YSAgICAgPSAmbGliY2ZzX3dhdGNoZG9nX3JhdGVsaW1pdCwKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5leHRyYTEgICA9ICZtaW5fd2F0Y2hkb2dfcmF0ZWxpbWl0LAorCQkuZXh0cmEyICAgPSAmbWF4X3dhdGNoZG9nX3JhdGVsaW1pdCwKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gImZvcmNlX2xidWciLAorCQkuZGF0YSAgICAgPSBOVUxMLAorCQkubWF4bGVuICAgPSAwLAorCQkubW9kZSAgICAgPSAwMjAwLAorCQkucHJvY19oYW5kbGVyID0gJmxpYmNmc19mb3JjZV9sYnVnCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJmYWlsX2xvYyIsCisJCS5kYXRhICAgICA9ICZjZnNfZmFpbF9sb2MsCisJCS5tYXhsZW4gICA9IHNpemVvZihjZnNfZmFpbF9sb2MpLAorCQkubW9kZSAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZmFpbF9sb2MKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gImZhaWxfdmFsIiwKKwkJLmRhdGEgICAgID0gJmNmc19mYWlsX3ZhbCwKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYworCX0sCisJeworCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHRvcF90YWJsZVtdID0geworCXsKKwkJLnByb2NuYW1lID0gImxuZXQiLAorCQkubW9kZSAgICAgPSAwNTU1LAorCQkuZGF0YSAgICAgPSBOVUxMLAorCQkubWF4bGVuICAgPSAwLAorCQkuY2hpbGQgICAgPSBsbmV0X3RhYmxlLAorCX0sCisJeworCX0KK307CisKK3N0YXRpYyBpbnQgaW5zZXJ0X3Byb2Modm9pZCkKK3sKKwlpZiAobG5ldF90YWJsZV9oZWFkZXIgPT0gTlVMTCkKKwkJbG5ldF90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUodG9wX3RhYmxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3Byb2Modm9pZCkKK3sKKwlpZiAobG5ldF90YWJsZV9oZWFkZXIgIT0gTlVMTCkKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobG5ldF90YWJsZV9oZWFkZXIpOworCisJbG5ldF90YWJsZV9oZWFkZXIgPSBOVUxMOworfQorCiBNT0RVTEVfVkVSU0lPTigiMS4wLjAiKTsKKwogbW9kdWxlX2luaXQoaW5pdF9saWJjZnNfbW9kdWxlKTsKIG1vZHVsZV9leGl0KGV4aXRfbGliY2ZzX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdHJhY2VmaWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdHJhY2VmaWxlLmMKaW5kZXggZWI2NWI1MC4uYzg2Mzk0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3RyYWNlZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy90cmFjZWZpbGUuYwpAQCAtNTMsNyArNTMsNyBAQAogbG9uZyBsb25nIGNmc190cmFjZWZpbGVfc2l6ZSA9IENGU19UUkFDRUZJTEVfU0laRTsKIHN0YXRpYyBzdHJ1Y3QgdHJhY2VmaWxlZF9jdGwgdHJhY2VfdGN0bDsKIHN0cnVjdCBtdXRleCBjZnNfdHJhY2VfdGhyZWFkX211dGV4Owotc3RhdGljIGludCB0aHJlYWRfcnVubmluZyA9IDA7CitzdGF0aWMgaW50IHRocmVhZF9ydW5uaW5nOwogCiBzdGF0aWMgYXRvbWljX3QgY2ZzX3RhZ2VfYWxsb2NhdGVkID0gQVRPTUlDX0lOSVQoMCk7CiAKQEAgLTIyNCw4ICsyMjQsNyBAQAogCSAqLwogCiAJaWYgKGxlbiA+IFBBR0VfQ0FDSEVfU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJjb3dhcmRseSByZWZ1c2luZyB0byB3cml0ZSAlbHUgYnl0ZXMgaW4gYSBwYWdlXG4iLCBsZW4pOworCQlwcl9lcnIoImNvd2FyZGx5IHJlZnVzaW5nIHRvIHdyaXRlICVsdSBieXRlcyBpbiBhIHBhZ2VcbiIsIGxlbik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtNjg4LDggKzY4Nyw4IEBACiAJaWYgKElTX0VSUihmaWxwKSkgewogCQlyYyA9IFBUUl9FUlIoZmlscCk7CiAJCWZpbHAgPSBOVUxMOwotCQlwcmludGsoS0VSTl9FUlIgIkx1c3RyZUVycm9yOiBjYW4ndCBvcGVuICVzIGZvciBkdW1wOiByYyAlZFxuIiwKLQkJICAgICAgZmlsZW5hbWUsIHJjKTsKKwkJcHJfZXJyKCJMdXN0cmVFcnJvcjogY2FuJ3Qgb3BlbiAlcyBmb3IgZHVtcDogcmMgJWRcbiIsCisJCQlmaWxlbmFtZSwgcmMpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTcyNiw3ICs3MjUsNyBAQAogCU1NU1BBQ0VfQ0xPU0U7CiAJcmMgPSB2ZnNfZnN5bmMoZmlscCwgMSk7CiAJaWYgKHJjKQotCQlwcmludGsoS0VSTl9FUlIgInN5bmMgcmV0dXJucyAlZFxuIiwgcmMpOworCQlwcl9lcnIoInN5bmMgcmV0dXJucyAlZFxuIiwgcmMpOwogY2xvc2U6CiAJZmlscF9jbG9zZShmaWxwLCBOVUxMKTsKIG91dDoKQEAgLTEwNDgsMjIgKzEwNDcsMjEgQEAKIAkJCWludCBpOwogCiAJCQlwcmludGsoS0VSTl9BTEVSVCAiTHVzdHJlOiB0cmFjZSBwYWdlcyBhcmVuJ3QgZW1wdHlcbiIpOwotCQkJcHJpbnRrKEtFUk5fRVJSICJ0b3RhbCBjcHVzKCVkKTogIiwKLQkJCSAgICAgICBudW1fcG9zc2libGVfY3B1cygpKTsKKwkJCXByX2VycigidG90YWwgY3B1cyglZCk6ICIsCisJCQkJbnVtX3Bvc3NpYmxlX2NwdXMoKSk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgaSsrKQogCQkJCWlmIChjcHVfb25saW5lKGkpKQotCQkJCQlwcmludGsoS0VSTl9FUlIgIiVkKG9uKSAiLCBpKTsKKwkJCQkJcHJfY29udCgiJWQob24pICIsIGkpOwogCQkJCWVsc2UKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlZChvZmYpICIsIGkpOwotCQkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCQkJCQlwcl9jb250KCIlZChvZmYpICIsIGkpOworCQkJcHJfY29udCgiXG4iKTsKIAogCQkJaSA9IDA7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGFnZSwgdG1wLCAmcGMucGNfcGFnZXMsCiAJCQkJCQkgICAgIGxpbmthZ2UpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJwYWdlICVkIGJlbG9uZ3MgdG8gY3B1ICVkXG4iLAotCQkJCSAgICAgICArK2ksIHRhZ2UtPmNwdSk7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlRoZXJlIGFyZSAlZCBwYWdlcyB1bndyaXR0ZW5cbiIsCi0JCQkgICAgICAgaSk7CisJCQkJcHJfZXJyKCJwYWdlICVkIGJlbG9uZ3MgdG8gY3B1ICVkXG4iLAorCQkJCQkrK2ksIHRhZ2UtPmNwdSk7CisJCQlwcl9lcnIoIlRoZXJlIGFyZSAlZCBwYWdlcyB1bndyaXR0ZW5cbiIsIGkpOwogCQl9CiAJCV9fTEFTU0VSVChsaXN0X2VtcHR5KCZwYy5wY19wYWdlcykpOwogZW5kX2xvb3A6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvd29ya2l0ZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jCmluZGV4IGM0YWZhZWEuLjQ4MDA5YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jCkBAIC00NDIsNyArNDQyLDcgQEAKIH0KIAogdm9pZAotY2ZzX3dpX3NodXRkb3duICh2b2lkKQorY2ZzX3dpX3NodXRkb3duKHZvaWQpCiB7CiAJc3RydWN0IGNmc193aV9zY2hlZAkqc2NoZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2RjYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMKaW5kZXggZGRmMWZhOS4uZmUxZmQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCXJjID0gbWRfZmluZF9jYmRhdGEoc2JpLT5sbF9tZF9leHAsIGxsX2lub2RlMmZpZChpbm9kZSksCiAJCQkgICAgcmV0dXJuX2lmX2VxdWFsLCBOVUxMKTsKIAlpZiAocmMgIT0gMCkKLQkJIHJldHVybiByYzsKKwkJcmV0dXJuIHJjOwogCiAJbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwogCWlmIChsc20gPT0gTlVMTCkKQEAgLTMzOSwxMyArMzM5LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgbGxfcmV2YWxpZGF0ZV9uZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlpbnQgcmM7Ci0KIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVwZCwgZmxhZ3M9JXVcbiIsCiAJICAgICAgIGRlbnRyeSwgZmxhZ3MpOwogCi0JcmMgPSBsbF9yZXZhbGlkYXRlX2RlbnRyeShkZW50cnksIGZsYWdzKTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIGxsX3JldmFsaWRhdGVfZGVudHJ5KGRlbnRyeSwgZmxhZ3MpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKaW5kZXggYTE4MjAxOS4uYTViYzY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+ICAgLyogZm9yIHdhaXRfb25fYnVmZmVyICovCiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CkBAIC0xNTE4LDYgKzE1MTgsNyBAQAogCQkJbHVtcCA9IChzdHJ1Y3QgbG92X3VzZXJfbWQgKilhcmc7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgbG92X3VzZXJfbWRzX2RhdGEgKmxtZHA7CisKIAkJCWxtZHAgPSAoc3RydWN0IGxvdl91c2VyX21kc19kYXRhICopYXJnOwogCQkJbHVtcCA9ICZsbWRwLT5sbWRfbG1tOwogCQl9CkBAIC0xOTA5LDIxICsxOTEwLDIxIEBACiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJc3dpdGNoIChvcmlnaW4pIHsKLQkJY2FzZSBTRUVLX1NFVDoKLQkJCWJyZWFrOwotCQljYXNlIFNFRUtfQ1VSOgotCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0VFS19FTkQ6Ci0JCQlpZiAob2Zmc2V0ID4gMCkKLQkJCQlnb3RvIG91dDsKLQkJCWlmIChhcGkzMikKLQkJCQlvZmZzZXQgKz0gTExfRElSX0VORF9PRkZfMzJCSVQ7Ci0JCQllbHNlCi0JCQkJb2Zmc2V0ICs9IExMX0RJUl9FTkRfT0ZGOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CisJY2FzZSBTRUVLX1NFVDoKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIFNFRUtfRU5EOgorCQlpZiAob2Zmc2V0ID4gMCkKIAkJCWdvdG8gb3V0OworCQlpZiAoYXBpMzIpCisJCQlvZmZzZXQgKz0gTExfRElSX0VORF9PRkZfMzJCSVQ7CisJCWVsc2UKKwkJCW9mZnNldCArPSBMTF9ESVJfRU5EX09GRjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG9mZnNldCA+PSAwICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKaW5kZXggNWViZWU2Yy4uODVlNzRkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJCW9wX2RhdGEtPm9wX2xlYXNlX2hhbmRsZSA9IG9jaC0+b2NoX2xlYXNlX2hhbmRsZTsKIAkJb3BfZGF0YS0+b3BfYXR0ci5pYV92YWxpZCB8PSBBVFRSX1NJWkUgfCBBVFRSX0JMT0NLUzsKIAl9Ci0JZXBvY2hfY2xvc2UgPSAob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9FUE9DSF9DTE9TRSk7CisJZXBvY2hfY2xvc2UgPSBvcF9kYXRhLT5vcF9mbGFncyAmIE1GX0VQT0NIX0NMT1NFOwogCXJjID0gbWRfY2xvc2UobWRfZXhwLCBvcF9kYXRhLCBvY2gtPm9jaF9tb2QsICZyZXEpOwogCWlmIChyYyA9PSAtRUFHQUlOKSB7CiAJCS8qIFRoaXMgY2xvc2UgbXVzdCBoYXZlIHRoZSBlcG9jaCBjbG9zZWQuICovCkBAIC0xOTcsNiArMTk3LDcgQEAKIAl9CiAJaWYgKHJjID09IDAgJiYgb3BfZGF0YS0+b3BfYmlhcyAmIE1EU19IU01fUkVMRUFTRSkgewogCQlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7CisKIAkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJCWlmICghKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMUkVMRUFTRUQpKQogCQkJcmMgPSAtRUJVU1k7CkBAIC0yNjksNyArMjcwLDcgQEAKIAlpbnQgbG9ja21vZGU7CiAJX191NjQgZmxhZ3MgPSBMRExNX0ZMX0JMT0NLX0dSQU5URUQgfCBMRExNX0ZMX1RFU1RfTE9DSzsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraDsKLQlsZGxtX3BvbGljeV9kYXRhX3QgcG9saWN5ID0gey5sX2lub2RlYml0cz17TURTX0lOT0RFTE9DS19PUEVOfX07CisJbGRsbV9wb2xpY3lfZGF0YV90IHBvbGljeSA9IHsubF9pbm9kZWJpdHMgPSB7TURTX0lOT0RFTE9DS19PUEVOfX07CiAJaW50IHJjID0gMDsKIAogCS8qIGNsZWFyIGdyb3VwIGxvY2ssIGlmIHByZXNlbnQgKi8KQEAgLTY5Miw3ICs2OTMsNyBAQAogb3V0X29jaF9mcmVlOgogCWlmIChyYykgewogCQlpZiAob2NoX3AgJiYgKm9jaF9wKSB7Ci0JCQlPQkRfRlJFRSgqb2NoX3AsIHNpemVvZiAoc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlKSk7CisJCQlPQkRfRlJFRSgqb2NoX3AsIHNpemVvZihzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUpKTsKIAkJCSpvY2hfcCA9IE5VTEw7IC8qIE9CRF9GUkVFIHdyaXRlcyBzb21lIG1hZ2ljIHRoZXJlICovCiAJCQkoKm9jaF91c2Vjb3VudCktLTsKIAkJfQpAQCAtMTcxMSw2ICsxNzEyLDEyIEBACiAJZm1fa2V5Lm9hLm9fb2kgPSBsc20tPmxzbV9vaTsKIAlmbV9rZXkub2Eub192YWxpZCA9IE9CRF9NRF9GTElEIHwgT0JEX01EX0ZMR1JPVVA7CiAKKwlpZiAoaV9zaXplX3JlYWQoaW5vZGUpID09IDApIHsKKwkJcmMgPSBsbF9nbGltcHNlX3NpemUoaW5vZGUpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwl9CisKIAlvYmRvX2Zyb21faW5vZGUoJmZtX2tleS5vYSwgaW5vZGUsIE9CRF9NRF9GTFNJWkUpOwogCW9iZG9fc2V0X3BhcmVudF9maWQoJmZtX2tleS5vYSwgJmxsX2kyaW5mbyhpbm9kZSktPmxsaV9maWQpOwogCS8qIElmIGZpbGVzaXplIGlzIDAsIHRoZW4gdGhlcmUgd291bGQgYmUgbm8gb2JqZWN0cyBmb3IgbWFwcGluZyAqLwpAQCAtMjgyMSw3ICsyODI4LDcgQEAKIAlpbnQgaTsKIAogCWlmICghaW5vZGUpCi0JICAgICAgIHJldHVybiAwOworCQlyZXR1cm4gMDsKIAogCWZpZCA9ICZsbF9pMmluZm8oaW5vZGUpLT5sbGlfZmlkOwogCUNERUJVRyhEX0lORk8sICJ0cnlpbmcgdG8gbWF0Y2ggcmVzICJERklEIiBtb2RlICVzXG4iLCBQRklEKGZpZCksCkBAIC0zMjMzLDYgKzMyNDAsNyBAQAogCiAJcmV0dXJuIGluX2RhdGE7CiB9CitFWFBPUlRfU1lNQk9MKGxsX2lvY29udHJvbF9yZWdpc3Rlcik7CiAKIHZvaWQgbGxfaW9jb250cm9sX3VucmVnaXN0ZXIodm9pZCAqbWFnaWMpCiB7CkBAIC0zMjU3LDggKzMyNjUsNiBAQAogCiAJQ1dBUk4oImRpZG4ndCBmaW5kIGlvY29udHJvbCByZWdpc3RlciBibG9jayB3aXRoIG1hZ2ljOiAlcFxuIiwgbWFnaWMpOwogfQotCi1FWFBPUlRfU1lNQk9MKGxsX2lvY29udHJvbF9yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MKGxsX2lvY29udHJvbF91bnJlZ2lzdGVyKTsKIAogc3RhdGljIGVudW0gbGxpb2NfaXRlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKaW5kZXggMjFiNGE1MC4uYTk0YmEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCkBAIC0yODQsMTAgKzI4NCw4IEBACiAJTEFTU0VSVChleHBfY29ubmVjdF9zb20obGxfaTJtZGV4cChpbm9kZSkpKTsKIAogCW9wX2RhdGEgPSBremFsbG9jKHNpemVvZigqb3BfZGF0YSksIEdGUF9OT0ZTKTsKLQlpZiAoIW9wX2RhdGEpIHsKLQkJQ0VSUk9SKCJjYW4ndCBhbGxvY2F0ZSBvcF9kYXRhXG4iKTsKKwlpZiAoIW9wX2RhdGEpCiAJCXJldHVybjsKLQl9CiAKIAlsbF9wcmVwYXJlX2RvbmVfd3JpdGluZyhpbm9kZSwgb3BfZGF0YSwgJm9jaCk7CiAJLyogSWYgdGhlcmUgaXMgbm8gQG9jaCwgd2UgZG8gbm90IGRvIERfVyB5ZXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCmluZGV4IDBjMWI1ODMuLmJmMWVjMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCkBAIC04NywxMSArODcsMTAgQEAKIAogCXNpX21lbWluZm8oJnNpKTsKIAlwYWdlcyA9IHNpLnRvdGFscmFtIC0gc2kudG90YWxoaWdoOwotCWlmIChwYWdlcyA+PiAoMjAgLSBQQUdFX0NBQ0hFX1NISUZUKSA8IDUxMikgeworCWlmIChwYWdlcyA+PiAoMjAgLSBQQUdFX0NBQ0hFX1NISUZUKSA8IDUxMikKIAkJbHJ1X3BhZ2VfbWF4ID0gcGFnZXMgLyAyOwotCX0gZWxzZSB7CisJZWxzZQogCQlscnVfcGFnZV9tYXggPSAocGFnZXMgLyA0KSAqIDM7Ci0JfQogCiAJLyogaW5pdGlhbGl6ZSBscnUgZGF0YSAqLwogCWF0b21pY19zZXQoJnNiaS0+bGxfY2FjaGUuY2NjX3VzZXJzLCAwKTsKQEAgLTYyMSw3ICs2MjAsNyBAQAogCXJjID0gb2JkX2dldF9pbmZvKE5VTEwsIHNiaS0+bGxfbWRfZXhwLCBzaXplb2YoS0VZX01BWF9FQVNJWkUpLAogCQkJICBLRVlfTUFYX0VBU0laRSwgJnNpemUsIGxtbXNpemUsIE5VTEwpOwogCWlmIChyYykKLQkJQ0VSUk9SKCJHZXQgbWF4IG1kc2l6ZSBlcnJvciByYyAlZCBcbiIsIHJjKTsKKwkJQ0VSUk9SKCJHZXQgbWF4IG1kc2l6ZSBlcnJvciByYyAlZFxuIiwgcmMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtOTc4LDE5ICs5NzcsMTcgQEAKIAlDREVCVUcoRF9DT05GSUcsICJGb3VuZCBwcm9maWxlICVzOiBtZGM9JXMgb3NjPSVzXG4iLCBwcm9maWxlbm0sCiAJICAgICAgIGxwcm9mLT5scF9tZCwgbHByb2YtPmxwX2R0KTsKIAotCWR0ID0ga3phbGxvYyhzdHJsZW4obHByb2YtPmxwX2R0KSArIGluc3RsZW4gKyAyLCBHRlBfTk9GUyk7CisJZHQgPSBrYXNwcmludGYoR0ZQX05PRlMsICIlcy0lcCIsIGxwcm9mLT5scF9kdCwgY2ZnLT5jZmdfaW5zdGFuY2UpOwogCWlmICghZHQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfZnJlZTsKIAl9Ci0Jc3ByaW50ZihkdCwgIiVzLSVwIiwgbHByb2YtPmxwX2R0LCBjZmctPmNmZ19pbnN0YW5jZSk7CiAKLQltZCA9IGt6YWxsb2Moc3RybGVuKGxwcm9mLT5scF9tZCkgKyBpbnN0bGVuICsgMiwgR0ZQX05PRlMpOworCW1kID0ga2FzcHJpbnRmKEdGUF9OT0ZTLCAiJXMtJXAiLCBscHJvZi0+bHBfbWQsIGNmZy0+Y2ZnX2luc3RhbmNlKTsKIAlpZiAoIW1kKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQotCXNwcmludGYobWQsICIlcy0lcCIsIGxwcm9mLT5scF9tZCwgY2ZnLT5jZmdfaW5zdGFuY2UpOwogCiAJLyogY29ubmVjdGlvbnMsIHJlZ2lzdHJhdGlvbnMsIHNiIHNldHVwICovCiAJZXJyID0gY2xpZW50X2NvbW1vbl9maWxsX3N1cGVyKHNiLCBtZCwgZHQsIG1udCk7CkBAIC0xNDMyLDcgKzE0MjksNyBAQAogCiAJaWYgKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfU0laRSB8CiAJCQkgICAgICBBVFRSX0FUSU1FIHwgQVRUUl9BVElNRV9TRVQgfAotCQkJICAgICAgQVRUUl9NVElNRSB8IEFUVFJfTVRJTUVfU0VUKSkKKwkJCSAgICAgIEFUVFJfTVRJTUUgfCBBVFRSX01USU1FX1NFVCkpIHsKIAkJLyogRm9yIHRydW5jYXRlIGFuZCB1dGltZXMgc2VuZGluZyBhdHRyaWJ1dGVzIHRvIE9TVHMsIHNldHRpbmcKIAkJICogbXRpbWUvYXRpbWUgdG8gdGhlIHBhc3Qgd2lsbCBiZSBwZXJmb3JtZWQgdW5kZXIgUFcgWzA6RU9GXQogCQkgKiBleHRlbnQgbG9jayAobmV3X3NpemU6RU9GIGZvciB0cnVuY2F0ZSkuICBJdCBtYXkgc2VlbQpAQCAtMTQ0NCw2ICsxNDQxLDcgQEAKIAkJcmMgPSBsbF9zZXRhdHRyX29zdChpbm9kZSwgYXR0cik7CiAJCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKIAkJCXVwX3dyaXRlKCZsbGktPmxsaV90cnVuY19zZW0pOworCX0KIG91dDoKIAlpZiAob3BfZGF0YSkgewogCQlpZiAob3BfZGF0YS0+b3BfaW9lcG9jaCkgewpAQCAtMTYwOCw3ICsxNjA2LDcgQEAKIAlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtID0gbWQtPmxzbTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCi0JTEFTU0VSVCAoKGxzbSAhPSBOVUxMKSA9PSAoKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMRUFTSVpFKSAhPSAwKSk7CisJTEFTU0VSVCgobHNtICE9IE5VTEwpID09ICgoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpICE9IDApKTsKIAlpZiAobHNtICE9IE5VTEwpIHsKIAkJaWYgKCFsbGktPmxsaV9oYXNfc21kICYmCiAJCSAgICAhKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfTEFZT1VUX0xPQ0spKQpAQCAtMjE1Miw3ICsyMTUwLDggQEAKIAlwdHIgPSBzdHJyY2hyKGx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIDApLCAnLScpOwogCWlmICghcHRyIHx8ICEqKCsrcHRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHNzY2FuZihwdHIsICIlbHgiLCAmeCkgIT0gMSkKKwlyYyA9IGtzdHJ0b3VsKHB0ciwgMTYsICZ4KTsKKwlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc2IgPSAodm9pZCAqKXg7CiAJLyogVGhpcyBiZXR0ZXIgYmUgYSByZWFsIEx1c3RyZSBzdXBlcmJsb2NrISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCmluZGV4IDQ3OWJmNDIuLmE5MDIxNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCXZpby0+dS5mYXVsdC5mdF92bXBhZ2UgICAgPSBOVUxMOwogCQl2aW8tPnUuZmF1bHQuZmF1bHQuZnRfdm1mID0gdm1mOwogCQl2aW8tPnUuZmF1bHQuZmF1bHQuZnRfZmxhZ3MgPSAwOwotCQl2aW8tPnUuZmF1bHQuZmF1bHQuZnRfZmxhZ3NfdmFsaWQgPSAwOworCQl2aW8tPnUuZmF1bHQuZmF1bHQuZnRfZmxhZ3NfdmFsaWQgPSBmYWxzZTsKIAogCQlyZXN1bHQgPSBjbF9pb19sb29wKGVudiwgaW8pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxvb3AuYwppbmRleCAwMzEyNDg4Li40MTNhODQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMKQEAgLTEwMCw4ICsxMDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpYi5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKQEAgLTM0OSw3ICszNDgsNyBAQAogCSAgICAgICBvbGRfYmlvLT5iaV9pdGVyLmJpX3NpemUpOwogCiAJc3Bpbl9sb2NrX2lycSgmbG8tPmxvX2xvY2spOwotCWluYWN0aXZlID0gKGxvLT5sb19zdGF0ZSAhPSBMTE9PUF9CT1VORCk7CisJaW5hY3RpdmUgPSBsby0+bG9fc3RhdGUgIT0gTExPT1BfQk9VTkQ7CiAJc3Bpbl91bmxvY2tfaXJxKCZsby0+bG9fbG9jayk7CiAJaWYgKGluYWN0aXZlKQogCQlnb3RvIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xwcm9jX2xsaXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9scHJvY19sbGl0ZS5jCmluZGV4IGFhYTEzYmQuLjgzYTliODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xwcm9jX2xsaXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbHByb2NfbGxpdGUuYwpAQCAtNTksNyArNTksNyBAQAogCQkJCWNmc190aW1lX3NoaWZ0XzY0KC1PQkRfU1RBVEZTX0NBQ0hFX1NFQ09ORFMpLAogCQkJCU9CRF9TVEFURlNfTk9ERUxBWSk7CiAJaWYgKCFyYykKLQkgICAgICByYyA9IHNlcV9wcmludGYobSwgIiV1XG4iLCBvc2ZzLm9zX2JzaXplKTsKKwkJc2VxX3ByaW50ZihtLCAiJXVcbiIsIG9zZnMub3NfYnNpemUpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtODIsOCArODIsOSBAQAogCQl3aGlsZSAoYmxrX3NpemUgPj49IDEpCiAJCQlyZXN1bHQgPDw9IDE7CiAKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOwogCX0KKwogCXJldHVybiByYzsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX2tieXRlc3RvdGFsKTsKQEAgLTEwNSw4ICsxMDYsOSBAQAogCQl3aGlsZSAoYmxrX3NpemUgPj49IDEpCiAJCQlyZXN1bHQgPDw9IDE7CiAKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOwogCX0KKwogCXJldHVybiByYzsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX2tieXRlc2ZyZWUpOwpAQCAtMTI4LDggKzEzMCw5IEBACiAJCXdoaWxlIChibGtfc2l6ZSA+Pj0gMSkKIAkJCXJlc3VsdCA8PD0gMTsKIAotCQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CiAJfQorCiAJcmV0dXJuIHJjOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfa2J5dGVzYXZhaWwpOwpAQCAtMTQ1LDcgKzE0OCw4IEBACiAJCQkJY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQkJT0JEX1NUQVRGU19OT0RFTEFZKTsKIAlpZiAoIXJjKQotCQkgcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBvc2ZzLm9zX2ZpbGVzKTsKKwkJc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgb3Nmcy5vc19maWxlcyk7CisKIAlyZXR1cm4gcmM7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsbF9maWxlc3RvdGFsKTsKQEAgLTE2MSw3ICsxNjUsOCBAQAogCQkJCWNmc190aW1lX3NoaWZ0XzY0KC1PQkRfU1RBVEZTX0NBQ0hFX1NFQ09ORFMpLAogCQkJCU9CRF9TVEFURlNfTk9ERUxBWSk7CiAJaWYgKCFyYykKLQkJIHJjID0gc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgb3Nmcy5vc19mZnJlZSk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIG9zZnMub3NfZmZyZWUpOworCiAJcmV0dXJuIHJjOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfZmlsZXNmcmVlKTsKQEAgLTE2OSwxNiArMTc0LDE1IEBACiBzdGF0aWMgaW50IGxsX2NsaWVudF90eXBlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoKHN0cnVjdCBzdXBlcl9ibG9jayAqKW0tPnByaXZhdGUpOwotCWludCByYzsKIAogCUxBU1NFUlQoc2JpICE9IE5VTEwpOwogCiAJaWYgKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfUk1UX0NMSUVOVCkKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICJyZW1vdGUgY2xpZW50XG4iKTsKKwkJc2VxX3B1dHMobSwgInJlbW90ZSBjbGllbnRcbiIpOwogCWVsc2UKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICJsb2NhbCBjbGllbnRcbiIpOworCQlzZXFfcHV0cyhtLCAibG9jYWwgY2xpZW50XG4iKTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX2NsaWVudF90eXBlKTsKIApAQCAtMTg3LDcgKzE5MSw4IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiltLT5wcml2YXRlOwogCiAJTEFTU0VSVChzYiAhPSBOVUxMKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXNcbiIsIHNiLT5zX3R5cGUtPm5hbWUpOworCXNlcV9wcmludGYobSwgIiVzXG4iLCBzYi0+c190eXBlLT5uYW1lKTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX2ZzdHlwZSk7CiAKQEAgLTE5Niw3ICsyMDEsOCBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSAoc3RydWN0IHN1cGVyX2Jsb2NrICopbS0+cHJpdmF0ZTsKIAogCUxBU1NFUlQoc2IgIT0gTlVMTCk7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVzXG4iLCBsbF9zMnNiaShzYiktPmxsX3NiX3V1aWQudXVpZCk7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIGxsX3Myc2JpKHNiKS0+bGxfc2JfdXVpZC51dWlkKTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX3NiX3V1aWQpOwogCkBAIC0zNTMsMTcgKzM1OSwxOCBAQAogCiAJbWF4X2NhY2hlZF9tYiA9IGNhY2hlLT5jY2NfbHJ1X21heCA+PiBzaGlmdDsKIAl1bnVzZWRfbWIgPSBhdG9taWNfcmVhZCgmY2FjaGUtPmNjY19scnVfbGVmdCkgPj4gc2hpZnQ7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwKLQkJCSJ1c2VyczogJWRcbiIKLQkJCSJtYXhfY2FjaGVkX21iOiAlZFxuIgotCQkJInVzZWRfbWI6ICVkXG4iCi0JCQkidW51c2VkX21iOiAlZFxuIgotCQkJInJlY2xhaW1fY291bnQ6ICV1XG4iLAotCQkJYXRvbWljX3JlYWQoJmNhY2hlLT5jY2NfdXNlcnMpLAotCQkJbWF4X2NhY2hlZF9tYiwKLQkJCW1heF9jYWNoZWRfbWIgLSB1bnVzZWRfbWIsCi0JCQl1bnVzZWRfbWIsCi0JCQljYWNoZS0+Y2NjX2xydV9zaHJpbmtlcnMpOworCXNlcV9wcmludGYobSwKKwkJICAgInVzZXJzOiAlZFxuIgorCQkgICAibWF4X2NhY2hlZF9tYjogJWRcbiIKKwkJICAgInVzZWRfbWI6ICVkXG4iCisJCSAgICJ1bnVzZWRfbWI6ICVkXG4iCisJCSAgICJyZWNsYWltX2NvdW50OiAldVxuIiwKKwkJICAgYXRvbWljX3JlYWQoJmNhY2hlLT5jY2NfdXNlcnMpLAorCQkgICBtYXhfY2FjaGVkX21iLAorCQkgICBtYXhfY2FjaGVkX21iIC0gdW51c2VkX21iLAorCQkgICB1bnVzZWRfbWIsCisJCSAgIGNhY2hlLT5jY2NfbHJ1X3Nocmlua2Vycyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxsX21heF9jYWNoZWRfbWJfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNDY3LDcgKzQ3NCw4IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfQ0hFQ0tTVU0pID8gMSA6IDApOworCXNlcV9wcmludGYobSwgIiV1XG4iLCAoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9DSEVDS1NVTSkgPyAxIDogMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxsX2NoZWNrc3VtX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTUwMyw3ICs1MTEsOCBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVsdVxuIiwgbGxfczJzYmkoc2IpLT5sbF9tYXhfcndfY2h1bmspOworCXNlcV9wcmludGYobSwgIiVsdVxuIiwgbGxfczJzYmkoc2IpLT5sbF9tYXhfcndfY2h1bmspOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsbF9tYXhfcndfY2h1bmtfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNTI1LDE1ICs1MzQsMTQgQEAKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAotCWlmIChsbF9zMnNiaShzYiktPmxsX3N0YXRzX3RyYWNrX3R5cGUgPT0gdHlwZSkgewotCQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsCi0JCQkJbGxfczJzYmkoc2IpLT5sbF9zdGF0c190cmFja19pZCk7CisJaWYgKGxsX3Myc2JpKHNiKS0+bGxfc3RhdHNfdHJhY2tfdHlwZSA9PSB0eXBlKQorCQlzZXFfcHJpbnRmKG0sICIlZFxuIiwgbGxfczJzYmkoc2IpLT5sbF9zdGF0c190cmFja19pZCk7CisJZWxzZSBpZiAobGxfczJzYmkoc2IpLT5sbF9zdGF0c190cmFja190eXBlID09IFNUQVRTX1RSQUNLX0FMTCkKKwkJc2VxX3B1dHMobSwgIjAgKGFsbClcbiIpOworCWVsc2UKKwkJc2VxX3B1dHMobSwgInVudHJhY2tlZFxuIik7CiAKLQl9IGVsc2UgaWYgKGxsX3Myc2JpKHNiKS0+bGxfc3RhdHNfdHJhY2tfdHlwZSA9PSBTVEFUU19UUkFDS19BTEwpIHsKLQkJcmV0dXJuIHNlcV9wcmludGYobSwgIjAgKGFsbClcbiIpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBzZXFfcHJpbnRmKG0sICJ1bnRyYWNrZWRcbiIpOwotCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBsbF93cl90cmFja19pZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LApAQCAtNjAxLDcgKzYwOSw4IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgc2JpLT5sbF9zYV9tYXgpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBzYmktPmxsX3NhX21heCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxsX3N0YXRhaGVhZF9tYXhfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNjMxLDggKzY0MCw4IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwKLQkJCXNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfQUdMX0VOQUJMRUQgPyAxIDogMCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfQUdMX0VOQUJMRUQgPyAxIDogMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxsX3N0YXRhaGVhZF9hZ2xfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNjYxLDEzICs2NzAsMTQgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwKLQkJCSJzdGF0YWhlYWQgdG90YWw6ICV1XG4iCi0JCQkic3RhdGFoZWFkIHdyb25nOiAldVxuIgotCQkJImFnbCB0b3RhbDogJXVcbiIsCi0JCQlhdG9taWNfcmVhZCgmc2JpLT5sbF9zYV90b3RhbCksCi0JCQlhdG9taWNfcmVhZCgmc2JpLT5sbF9zYV93cm9uZyksCi0JCQlhdG9taWNfcmVhZCgmc2JpLT5sbF9hZ2xfdG90YWwpKTsKKwlzZXFfcHJpbnRmKG0sCisJCSAgICJzdGF0YWhlYWQgdG90YWw6ICV1XG4iCisJCSAgICJzdGF0YWhlYWQgd3Jvbmc6ICV1XG4iCisJCSAgICJhZ2wgdG90YWw6ICV1XG4iLAorCQkgICBhdG9taWNfcmVhZCgmc2JpLT5sbF9zYV90b3RhbCksCisJCSAgIGF0b21pY19yZWFkKCZzYmktPmxsX3NhX3dyb25nKSwKKwkJICAgYXRvbWljX3JlYWQoJnNiaS0+bGxfYWdsX3RvdGFsKSk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsbF9zdGF0YWhlYWRfc3RhdHMpOwogCkBAIC02NzYsOCArNjg2LDggQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLAotCQkJKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfTEFaWVNUQVRGUykgPyAxIDogMCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfTEFaWVNUQVRGUyA/IDEgOiAwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbGxfbGF6eXN0YXRmc19zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC03MTIsMTEgKzcyMiwxMiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBlYWxlbik7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGVhbGVuKTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX21heF9lYXNpemUpOwogCi1zdGF0aWMgaW50IGxsX2RlZnVsdF9lYXNpemVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQorc3RhdGljIGludCBsbF9kZWZhdWx0X2Vhc2l6ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKQEAgLTcyNyw5ICs3MzgsMTAgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgZWFsZW4pOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBlYWxlbik7CisJcmV0dXJuIDA7CiB9Ci1MUFJPQ19TRVFfRk9QU19STyhsbF9kZWZ1bHRfZWFzaXplKTsKK0xQUk9DX1NFUV9GT1BTX1JPKGxsX2RlZmF1bHRfZWFzaXplKTsKIAogc3RhdGljIGludCBsbF9tYXhfY29va2llc2l6ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CkBAIC03NDIsMTEgKzc1NCwxMiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBjb29raWVsZW4pOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBjb29raWVsZW4pOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfbWF4X2Nvb2tpZXNpemUpOwogCi1zdGF0aWMgaW50IGxsX2RlZnVsdF9jb29raWVzaXplX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3N0YXRpYyBpbnQgbGxfZGVmYXVsdF9jb29raWVzaXplX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwpAQCAtNzU3LDkgKzc3MCwxMCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBjb29raWVsZW4pOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBjb29raWVsZW4pOworCXJldHVybiAwOwogfQotTFBST0NfU0VRX0ZPUFNfUk8obGxfZGVmdWx0X2Nvb2tpZXNpemUpOworTFBST0NfU0VRX0ZPUFNfUk8obGxfZGVmYXVsdF9jb29raWVzaXplKTsKIAogc3RhdGljIGludCBsbF9zYmlfZmxhZ3Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewpAQCAtNzg5LDExICs4MDMsMTAgQEAKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwotCWludCByYzsKIAotCXJjID0gc2VxX3ByaW50ZihtLCAiJXVcbiIsIHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCk7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxsX3hhdHRyX2NhY2hlX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTg0OSw5ICs4NjIsOSBAQAogCXsgInN0YXRhaGVhZF9zdGF0cyIsICAmbGxfc3RhdGFoZWFkX3N0YXRzX2ZvcHMsIE5VTEwsIDAgfSwKIAl7ICJsYXp5c3RhdGZzIiwgICAgICAgJmxsX2xhenlzdGF0ZnNfZm9wcywgTlVMTCB9LAogCXsgIm1heF9lYXNpemUiLCAgICAgICAmbGxfbWF4X2Vhc2l6ZV9mb3BzLCBOVUxMLCAwIH0sCi0JeyAiZGVmYXVsdF9lYXNpemUiLCAgICZsbF9kZWZ1bHRfZWFzaXplX2ZvcHMsIE5VTEwsIDAgfSwKKwl7ICJkZWZhdWx0X2Vhc2l6ZSIsICAgJmxsX2RlZmF1bHRfZWFzaXplX2ZvcHMsIE5VTEwsIDAgfSwKIAl7ICJtYXhfY29va2llc2l6ZSIsICAgJmxsX21heF9jb29raWVzaXplX2ZvcHMsIE5VTEwsIDAgfSwKLQl7ICJkZWZhdWx0X2Nvb2tpZXNpemUiLCAmbGxfZGVmdWx0X2Nvb2tpZXNpemVfZm9wcywgTlVMTCwgMCB9LAorCXsgImRlZmF1bHRfY29va2llc2l6ZSIsICZsbF9kZWZhdWx0X2Nvb2tpZXNpemVfZm9wcywgTlVMTCwgMCB9LAogCXsgInNiaV9mbGFncyIsCSAgICAgICZsbF9zYmlfZmxhZ3NfZm9wcywgTlVMTCwgMCB9LAogCXsgInhhdHRyX2NhY2hlIiwgICAgICAmbGxfeGF0dHJfY2FjaGVfZm9wcywgTlVMTCwgMCB9LAogCXsgTlVMTCB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYwppbmRleCA4OTBhYzE5Li40OWYxY2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKQEAgLTgzLDcgKzgzLDggQEAKIAogCWxsaS0+bGxpX2ZpZCA9IGJvZHktPmZpZDE7CiAJaWYgKHVubGlrZWx5KCEoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxUWVBFKSkpIHsKLQkJQ0VSUk9SKCJDYW4gbm90IGluaXRpYWxpemUgaW5vZGUgIiBERklEICIgd2l0aG91dCBvYmplY3QgdHlwZTogdmFsaWQgPSAlI2xseFxuIiwKKwkJQ0VSUk9SKCJDYW4gbm90IGluaXRpYWxpemUgaW5vZGUgIiBERklECisJCSAgICAgICAiIHdpdGhvdXQgb2JqZWN0IHR5cGU6IHZhbGlkID0gJSNsbHhcbiIsCiAJCSAgICAgICBQRklEKCZsbGktPmxsaV9maWQpLCBib2R5LT52YWxpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTYwMCw3ICs2MDEsOCBAQAogCWxvbmcgbG9uZyBsb29rdXBfZmxhZ3MgPSBMT09LVVBfT1BFTjsKIAlpbnQgcmMgPSAwOwogCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6bmFtZT0lcGQsZGlyPSVsdS8ldSglcCksZmlsZSAlcCxvcGVuX2ZsYWdzICV4LG1vZGUgJXggb3BlbmVkICVkXG4iLAorCUNERUJVRyhEX1ZGU1RSQUNFLAorCSAgICAgICAiVkZTIE9wOm5hbWU9JXBkLGRpcj0lbHUvJXUoJXApLGZpbGUgJXAsb3Blbl9mbGFncyAleCxtb2RlICV4IG9wZW5lZCAlZFxuIiwKIAkgICAgICAgZGVudHJ5LCBkaXItPmlfaW5vLAogCSAgICAgICBkaXItPmlfZ2VuZXJhdGlvbiwgZGlyLCBmaWxlLCBvcGVuX2ZsYWdzLCBtb2RlLCAqb3BlbmVkKTsKIApAQCAtOTc0LDExICs5NzYsMTIgQEAKICAqIEluc3RlYWQsIGxsX2RkZWxldGUoKSBhbmQgbGxfZF9pcHV0KCkgd2lsbCB1cGRhdGUgaXQgYmFzZWQgdXBvbiBpZiB0aGVyZQogICogaXMgYW55IGxvY2sgZXhpc3RpbmcuIFRoZXkgd2lsbCByZWN5Y2xlIGRlbnRyaWVzIGFuZCBpbm9kZXMgYmFzZWQgdXBvbiBsb2NrcwogICogdG9vLiBiPTIwNDMzICovCi1zdGF0aWMgaW50IGxsX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgbGxfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKIAlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAlpbnQgcmM7CisKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVwZCxkaXI9JWx1LyV1KCVwKVxuIiwKIAkgICAgICAgZGVudHJ5LCBkaXItPmlfaW5vLCBkaXItPmlfZ2VuZXJhdGlvbiwgZGlyKTsKIApAQCAtMTAzMyw3ICsxMDM2LDcgQEAKIAkgICAgICAgZGVudHJ5LCBkaXItPmlfaW5vLCBkaXItPmlfZ2VuZXJhdGlvbiwgZGlyKTsKIAogCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBOVUxMLAotCQkJCSAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgCisJCQkJICAgICBkZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCSAgICAgZGVudHJ5LT5kX25hbWUubGVuLAogCQkJCSAgICAgU19JRkRJUiwgTFVTVFJFX09QQ19BTlksIE5VTEwpOwogCWlmIChJU19FUlIob3BfZGF0YSkpCkBAIC0xMTExLDEwICsxMTE0LDkgQEAKIAlpbnQgZXJyOwogCiAJQ0RFQlVHKERfVkZTVFJBQ0UsCi0JICAgICAgICJWRlMgT3A6b2xkbmFtZT0lcGQsc3JjX2Rpcj0lbHUvJXUoJXApLG5ld25hbWU9JXBkLCIKLQkgICAgICAgInRndF9kaXI9JWx1LyV1KCVwKVxuIiwgb2xkX2RlbnRyeSwKLQkgICAgICAgb2xkX2Rpci0+aV9pbm8sIG9sZF9kaXItPmlfZ2VuZXJhdGlvbiwgb2xkX2RpciwgbmV3X2RlbnRyeSwKLQkgICAgICAgbmV3X2Rpci0+aV9pbm8sIG5ld19kaXItPmlfZ2VuZXJhdGlvbiwgbmV3X2Rpcik7CisJICAgICAgICJWRlMgT3A6b2xkbmFtZT0lcGQsc3JjX2Rpcj0lbHUvJXUoJXApLG5ld25hbWU9JXBkLHRndF9kaXI9JWx1LyV1KCVwKVxuIiwKKwkgICAgICAgb2xkX2RlbnRyeSwgb2xkX2Rpci0+aV9pbm8sIG9sZF9kaXItPmlfZ2VuZXJhdGlvbiwgb2xkX2RpciwKKwkgICAgICAgbmV3X2RlbnRyeSwgbmV3X2Rpci0+aV9pbm8sIG5ld19kaXItPmlfZ2VuZXJhdGlvbiwgbmV3X2Rpcik7CiAKIAlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIG9sZF9kaXIsIG5ld19kaXIsIE5VTEwsIDAsIDAsCiAJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYwppbmRleCAxMGEwNDIxLi45OTFkMjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC03NTAsNyArNzUwLDcgQEAKIAkJLyogTm90ZTogd2Ugb25seSB0cmltIHRoZSBSUEMsIGluc3RlYWQgb2YgZXh0ZW5kaW5nIHRoZSBSUEMKIAkJICogdG8gdGhlIGJvdW5kYXJ5LCBzbyB0byBhdm9pZCByZWFkaW5nIHRvbyBtdWNoIHBhZ2VzIGR1cmluZwogCQkgKiByYW5kb20gcmVhZGluZy4gKi8KLQkJcnBjX2JvdW5kYXJ5ID0gKChlbmQgKyAxKSAmICh+KFBUTFJQQ19NQVhfQlJXX1BBR0VTIC0gMSkpKTsKKwkJcnBjX2JvdW5kYXJ5ID0gKGVuZCArIDEpICYgKH4oUFRMUlBDX01BWF9CUldfUEFHRVMgLSAxKSk7CiAJCWlmIChycGNfYm91bmRhcnkgPiAwKQogCQkJcnBjX2JvdW5kYXJ5LS07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYwppbmRleCAyZjIxMzA0Li45MTQ0MmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jCkBAIC00NCw3ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKaW5kZXggNmFkOWRkMC4uYjc1NTYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAlzdHJ1Y3QgcXN0cgkgICAgIHNlX3FzdHI7CiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHNhaV9nZW5lcmF0aW9uID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2FpX2dlbmVyYXRpb247CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNhaV9nZW5lcmF0aW9uX2xvY2spOwogCiBzdGF0aWMgaW5saW5lIGludCBsbF9zYV9lbnRyeV91bmhhc2hlZChzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQpAQCAtNzA2LDExICs3MDYsMjEgQEAKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmxsaSA9IGxsX2kyaW5mbyhkaXIpOwogCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpID0gTlVMTDsKIAlzdHJ1Y3QgbGxfc2FfZW50cnkgICAgICAgKmVudHJ5OworCV9fdTY0CQkJICBoYW5kbGUgPSAwOwogCWludAkJICAgICAgIHdha2V1cDsKIAogCWlmIChpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9MT09LVVBfTkVHKSkKIAkJcmMgPSAtRU5PRU5UOwogCisJaWYgKHJjID09IDApIHsKKwkJLyogcmVsZWFzZSBpYml0cyBsb2NrIEFTQVAgdG8gYXZvaWQgZGVhZGxvY2sgd2hlbiBzdGF0YWhlYWQKKwkJICogdGhyZWFkIGVucXVldWVzIGxvY2sgb24gcGFyZW50IGluIHJlYWRkaXIgYW5kIGFub3RoZXIKKwkJICogcHJvY2VzcyBlbnF1ZXVlcyBsb2NrIG9uIGNoaWxkIHdpdGggcGFyZW50IGxvY2sgaGVsZCwgZWcuCisJCSAqIHVubGluay4gKi8KKwkJaGFuZGxlID0gaXQtPmQubHVzdHJlLml0X2xvY2tfaGFuZGxlOworCQlsbF9pbnRlbnRfZHJvcF9sb2NrKGl0KTsKKwl9CisKIAlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwogCS8qIHN0YWxlIGVudHJ5ICovCiAJaWYgKHVubGlrZWx5KGxsaS0+bGxpX3NhaSA9PSBOVUxMIHx8CkBAIC03NDUsOCArNzU1LDcgQEAKIAkJCSAqIHdoZW4gc3RhdGFoZWFkIHRocmVhZCB0cmllcyB0byBlbnF1ZXVlIGxvY2sgb24gcGFyZW50CiAJCQkgKiBmb3IgcmVhZHBhZ2UgYW5kIG90aGVyIHRyaWVzIHRvIGVucXVldWUgbG9jayBvbiBjaGlsZAogCQkJICogd2l0aCBwYXJlbnQncyBsb2NrIGhlbGQsIGZvciBleGFtcGxlOiB1bmxpbmsuICovCi0JCQllbnRyeS0+c2VfaGFuZGxlID0gaXQtPmQubHVzdHJlLml0X2xvY2tfaGFuZGxlOwotCQkJbGxfaW50ZW50X2Ryb3BfbG9jayhpdCk7CisJCQllbnRyeS0+c2VfaGFuZGxlID0gaGFuZGxlOwogCQkJd2FrZXVwID0gc2FfcmVjZWl2ZWRfZW1wdHkoc2FpKTsKIAkJCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5zZV9saXN0LAogCQkJCQkgICZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N1cGVyMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N1cGVyMjUuYwppbmRleCA3YzFlMDJhLi5hNDk0ZjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdXBlcjI1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3VwZXIyNS5jCkBAIC0xNTIsOSArMTUyLDcgQEAKIAogCWRvX2dldHRpbWVvZmRheSgmdHYpOwogCWNmc19zcmFuZCh0di50dl9zZWMgXiBzZWVkWzBdLCB0di50dl91c2VjIF4gc2VlZFsxXSk7Ci0KLQlpbml0X3RpbWVyKCZsbF9jYXBhX3RpbWVyKTsKLQlsbF9jYXBhX3RpbWVyLmZ1bmN0aW9uID0gbGxfY2FwYV90aW1lcl9jYWxsYmFjazsKKwlzZXR1cF90aW1lcigmbGxfY2FwYV90aW1lciwgbGxfY2FwYV90aW1lcl9jYWxsYmFjaywgMCk7CiAJcmMgPSBsbF9jYXBhX3RocmVhZF9zdGFydCgpOwogCWlmIChyYyAhPSAwKQogCQlnb3RvIG91dF9wcm9jOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2Rldi5jCmluZGV4IDVhMTA3OGEuLmZkZTQxZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfZGV2LmMKQEAgLTYzLDEyICs2MywxMiBAQAogCXsKIAkJLmNrZF9jYWNoZSA9ICZ2dnBfdGhyZWFkX2ttZW0sCiAJCS5ja2RfbmFtZSAgPSAidnZwX3RocmVhZF9rbWVtIiwKLQkJLmNrZF9zaXplICA9IHNpemVvZiAoc3RydWN0IHZ2cF90aHJlYWRfaW5mbyksCisJCS5ja2Rfc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHZ2cF90aHJlYWRfaW5mbyksCiAJfSwKIAl7CiAJCS5ja2RfY2FjaGUgPSAmdnZwX3Nlc3Npb25fa21lbSwKIAkJLmNrZF9uYW1lICA9ICJ2dnBfc2Vzc2lvbl9rbWVtIiwKLQkJLmNrZF9zaXplICA9IHNpemVvZiAoc3RydWN0IHZ2cF9zZXNzaW9uKQorCQkuY2tkX3NpemUgID0gc2l6ZW9mKHN0cnVjdCB2dnBfc2Vzc2lvbikKIAl9LAogCXsKIAkJLmNrZF9jYWNoZSA9IE5VTEwKQEAgLTkwLDYgKzkwLDcgQEAKIAkJCSBzdHJ1Y3QgbHVfY29udGV4dF9rZXkgKmtleSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdnZwX3RocmVhZF9pbmZvICppbmZvID0gZGF0YTsKKwogCU9CRF9TTEFCX0ZSRUVfUFRSKGluZm8sIHZ2cF90aHJlYWRfa21lbSk7CiB9CiAKQEAgLTEwOCw2ICsxMDksNyBAQAogCQkJCSBzdHJ1Y3QgbHVfY29udGV4dF9rZXkgKmtleSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdnZwX3Nlc3Npb24gKnNlc3Npb24gPSBkYXRhOworCiAJT0JEX1NMQUJfRlJFRV9QVFIoc2Vzc2lvbiwgdnZwX3Nlc3Npb25fa21lbSk7CiB9CiAKQEAgLTI4Niw3ICsyODgsNyBAQAogCiAJaWQtPnZwaV9pbmRleCAgPSBwb3MgJiAweGZmZmZmZmZmOwogCWlkLT52cGlfZGVwdGggID0gKHBvcyA+PiBQR0NfREVQVEhfU0hJRlQpICYgMHhmOwotCWlkLT52cGlfYnVja2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpcG9zID4+IFBHQ19PQkpfU0hJRlQpOworCWlkLT52cGlfYnVja2V0ID0gKHVuc2lnbmVkIGxvbmcgbG9uZylwb3MgPj4gUEdDX09CSl9TSElGVDsKIH0KIAogc3RhdGljIGxvZmZfdCB2dnBfcGdjYWNoZV9pZF9wYWNrKHN0cnVjdCB2dnBfcGdjYWNoZV9pZCAqaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYwppbmRleCBlMmJhZGYxLi42OWVhOTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKQEAgLTEzMiwxNCArMTMyLDEwIEBACiAJCSAgICAgICB4YXR0ci0+eGVfbmFtZWxlbik7CiAJCWdvdG8gZXJyX25hbWU7CiAJfQotCXhhdHRyLT54ZV92YWx1ZSA9IGt6YWxsb2MoeGF0dHJfdmFsX2xlbiwgR0ZQX05PRlMpOwotCWlmICgheGF0dHItPnhlX3ZhbHVlKSB7Ci0JCUNERUJVRyhEX0NBQ0hFLCAiZmFpbGVkIHRvIGFsbG9jIHhhdHRyIHZhbHVlICVkXG4iLAotCQkgICAgICAgeGF0dHJfdmFsX2xlbik7CisJeGF0dHItPnhlX3ZhbHVlID0ga21lbWR1cCh4YXR0cl92YWwsIHhhdHRyX3ZhbF9sZW4sIEdGUF9OT0ZTKTsKKwlpZiAoIXhhdHRyLT54ZV92YWx1ZSkKIAkJZ290byBlcnJfdmFsdWU7Ci0JfQogCi0JbWVtY3B5KHhhdHRyLT54ZV92YWx1ZSwgeGF0dHJfdmFsLCB4YXR0cl92YWxfbGVuKTsKIAl4YXR0ci0+eGVfdmFsbGVuID0geGF0dHJfdmFsX2xlbjsKIAlsaXN0X2FkZCgmeGF0dHItPnhlX2xpc3QsIGNhY2hlKTsKIApAQCAtMjk5LDEzICsyOTUsMTggQEAKIAogCiAJbXV0ZXhfbG9jaygmbGxpLT5sbGlfeGF0dHJzX2VucV9sb2NrKTsKLQkvKiBUcnkgbWF0Y2hpbmcgZmlyc3QuICovCi0JbW9kZSA9IGxsX3Rha2VfbWRfbG9jayhpbm9kZSwgTURTX0lOT0RFTE9DS19YQVRUUiwgJmxvY2toLCAwLCBMQ0tfUFIpOwotCWlmIChtb2RlICE9IDApIHsKLQkJLyogZmFrZSBvaXQgaW4gbWRjX3JldmFsaWRhdGVfbG9jaygpIG1hbm5lciAqLwotCQlvaXQtPmQubHVzdHJlLml0X2xvY2tfaGFuZGxlID0gbG9ja2guY29va2llOwotCQlvaXQtPmQubHVzdHJlLml0X2xvY2tfbW9kZSA9IG1vZGU7Ci0JCWdvdG8gb3V0OworCS8qIGlub2RlIG1heSBoYXZlIGJlZW4gc2hydW5rIGFuZCByZWNyZWF0ZWQsIHNvIGRhdGEgaXMgZ29uZSwgbWF0Y2ggbG9jaworCSAqIG9ubHkgd2hlbiBkYXRhIGV4aXN0cy4gKi8KKwlpZiAobGxfeGF0dHJfY2FjaGVfdmFsaWQobGxpKSkgeworCQkvKiBUcnkgbWF0Y2hpbmcgZmlyc3QuICovCisJCW1vZGUgPSBsbF90YWtlX21kX2xvY2soaW5vZGUsIE1EU19JTk9ERUxPQ0tfWEFUVFIsICZsb2NraCwgMCwKKwkJCQkgICAgICAgTENLX1BSKTsKKwkJaWYgKG1vZGUgIT0gMCkgeworCQkJLyogZmFrZSBvaXQgaW4gbWRjX3JldmFsaWRhdGVfbG9jaygpIG1hbm5lciAqLworCQkJb2l0LT5kLmx1c3RyZS5pdF9sb2NrX2hhbmRsZSA9IGxvY2toLmNvb2tpZTsKKwkJCW9pdC0+ZC5sdXN0cmUuaXRfbG9ja19tb2RlID0gbW9kZTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJLyogRW5xdWV1ZSBpZiB0aGUgbG9jayBpc24ndCBjYWNoZWQgbG9jYWxseS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCmluZGV4IGI3NzlmNDcuLmI5NDU5ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYwpAQCAtNDMsNyArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCkBAIC00ODcsNyArNDg3LDcgQEAKIAkJX191MzIgb2xkc2l6ZSA9IDA7CiAKIAkJd2hpbGUgKG5ld3NpemUgPCBpbmRleCArIDEpCi0JCQluZXdzaXplID0gbmV3c2l6ZSA8PCAxOworCQkJbmV3c2l6ZSA8PD0gMTsKIAkJT0JEX0FMTE9DKG5ld3RndHMsIHNpemVvZigqbmV3dGd0cykgKiBuZXdzaXplKTsKIAkJaWYgKG5ld3RndHMgPT0gTlVMTCkgewogCQkJbG12X2luaXRfdW5sb2NrKGxtdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKaW5kZXggNWJlNDE3Ni4uMjJlNWMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgorI2luY2x1ZGUgImxtdl9pbnRlcm5hbC5oIgogCiBzdGF0aWMgaW50IGxtdl9udW1vYmRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewpAQCAtNDgsNyArNDksOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJZGVzYyA9ICZkZXYtPnUubG12LmRlc2M7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBkZXNjLT5sZF90Z3RfY291bnQpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBkZXNjLT5sZF90Z3RfY291bnQpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obG12X251bW9iZCk7CiAKQEAgLTgyLDcgKzg0LDggQEAKIAogCUxBU1NFUlQoZGV2ICE9IE5VTEwpOwogCWxtdiA9ICZkZXYtPnUubG12OwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgcGxhY2VtZW50X3BvbGljeTJuYW1lKGxtdi0+bG12X3BsYWNlbWVudCkpOworCXNlcV9wcmludGYobSwgIiVzXG4iLCBwbGFjZW1lbnRfcG9saWN5Mm5hbWUobG12LT5sbXZfcGxhY2VtZW50KSk7CisJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgTUFYX1BPTElDWV9TVFJJTkdfU0laRSA2NApAQCAtMTMwLDcgKzEzMyw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sbXYuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX2FjdGl2ZV90Z3RfY291bnQpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBkZXNjLT5sZF9hY3RpdmVfdGd0X2NvdW50KTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxtdl9hY3RpdmVvYmQpOwogCkBAIC0xNDEsNyArMTQ1LDggQEAKIAogCUxBU1NFUlQoZGV2ICE9IE5VTEwpOwogCWxtdiA9ICZkZXYtPnUubG12OwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgbG12LT5kZXNjLmxkX3V1aWQudXVpZCk7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIGxtdi0+ZGVzYy5sZF91dWlkLnV1aWQpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obG12X2Rlc2NfdXVpZCk7CiAKQEAgLTE3MSw4ICsxNzYsMTAgQEAKIAogCWlmICh0Z3QgPT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNlcV9wcmludGYocCwgIiVkOiAlcyAlc0FDVElWRVxuIiwgdGd0LT5sdGRfaWR4LAotCQkJICB0Z3QtPmx0ZF91dWlkLnV1aWQsIHRndC0+bHRkX2FjdGl2ZSA/ICIiIDogIklOIik7CisJc2VxX3ByaW50ZihwLCAiJWQ6ICVzICVzQUNUSVZFXG4iLAorCQkgICB0Z3QtPmx0ZF9pZHgsIHRndC0+bHRkX3V1aWQudXVpZCwKKwkJICAgdGd0LT5sdGRfYWN0aXZlID8gIiIgOiAiSU4iKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsbXZfdGd0X3NvcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9kZXYuYwppbmRleCA3OTZhMDE1Li43MTFiODM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZGV2LmMKQEAgLTYwLDcgKzYwLDcgQEAKIHN0cnVjdCBrbWVtX2NhY2hlICpsb3ZfbG9ja19saW5rX2ttZW07CiAKIC8qKiBMb2NrIGNsYXNzIG9mIGxvdl9kZXZpY2U6OmxkX211dGV4LiAqLwotc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGNsX2xvdl9kZXZpY2VfbXV0ZXhfY2xhc3M7CitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGNsX2xvdl9kZXZpY2VfbXV0ZXhfY2xhc3M7CiAKIHN0cnVjdCBsdV9rbWVtX2Rlc2NyIGxvdl9jYWNoZXNbXSA9IHsKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKaW5kZXggZTllYzM5Yy4uMmJjZmFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYwpAQCAtMjA5LDggKzIwOSw4IEBACiAJcmV0dXJuIGxzbV9sbW1fdmVyaWZ5X2NvbW1vbihsbW0sIGxtbV9ieXRlcywgKnN0cmlwZV9jb3VudCk7CiB9CiAKLWludCBsc21fdW5wYWNrbWRfdjEoc3RydWN0IGxvdl9vYmQgKmxvdiwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJICAgIHN0cnVjdCBsb3ZfbWRzX21kX3YxICpsbW0pCitzdGF0aWMgaW50IGxzbV91bnBhY2ttZF92MShzdHJ1Y3QgbG92X29iZCAqbG92LCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAorCQkJICAgc3RydWN0IGxvdl9tZHNfbWRfdjEgKmxtbSkKIHsKIAlzdHJ1Y3QgbG92X29pbmZvICpsb2k7CiAJaW50IGk7CkBAIC0yMjcsNiArMjI3LDkgQEAKIAkJb3N0aWRfbGVfdG9fY3B1KCZsbW0tPmxtbV9vYmplY3RzW2ldLmxfb3N0X29pLCAmbG9pLT5sb2lfb2kpOwogCQlsb2ktPmxvaV9vc3RfaWR4ID0gbGUzMl90b19jcHUobG1tLT5sbW1fb2JqZWN0c1tpXS5sX29zdF9pZHgpOwogCQlsb2ktPmxvaV9vc3RfZ2VuID0gbGUzMl90b19jcHUobG1tLT5sbW1fb2JqZWN0c1tpXS5sX29zdF9nZW4pOworCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxvaSkpCisJCQljb250aW51ZTsKKwogCQlpZiAobG9pLT5sb2lfb3N0X2lkeCA+PSBsb3YtPmRlc2MubGRfdGd0X2NvdW50KSB7CiAJCQlDRVJST1IoIk9TVCBpbmRleCAlZCBtb3JlIHRoYW4gT1NUIGNvdW50ICVkXG4iLAogCQkJICAgICAgIGxvaS0+bG9pX29zdF9pZHgsIGxvdi0+ZGVzYy5sZF90Z3RfY291bnQpOwpAQCAtMjg3LDggKzI5MCw4IEBACiAJCQkJICAgICAqc3RyaXBlX2NvdW50KTsKIH0KIAotaW50IGxzbV91bnBhY2ttZF92MyhzdHJ1Y3QgbG92X29iZCAqbG92LCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAotCQkgICAgc3RydWN0IGxvdl9tZHNfbWQgKmxtbXYxKQorc3RhdGljIGludCBsc21fdW5wYWNrbWRfdjMoc3RydWN0IGxvdl9vYmQgKmxvdiwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgIHN0cnVjdCBsb3ZfbWRzX21kICpsbW12MSkKIHsKIAlzdHJ1Y3QgbG92X21kc19tZF92MyAqbG1tOwogCXN0cnVjdCBsb3Zfb2luZm8gKmxvaTsKQEAgLTMxNCw2ICszMTcsOSBAQAogCQlvc3RpZF9sZV90b19jcHUoJmxtbS0+bG1tX29iamVjdHNbaV0ubF9vc3Rfb2ksICZsb2ktPmxvaV9vaSk7CiAJCWxvaS0+bG9pX29zdF9pZHggPSBsZTMyX3RvX2NwdShsbW0tPmxtbV9vYmplY3RzW2ldLmxfb3N0X2lkeCk7CiAJCWxvaS0+bG9pX29zdF9nZW4gPSBsZTMyX3RvX2NwdShsbW0tPmxtbV9vYmplY3RzW2ldLmxfb3N0X2dlbik7CisJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChsb2ktPmxvaV9vc3RfaWR4ID49IGxvdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKIAkJCUNFUlJPUigiT1NUIGluZGV4ICVkIG1vcmUgdGhhbiBPU1QgY291bnQgJWRcbiIsCiAJCQkgICAgICAgbG9pLT5sb2lfb3N0X2lkeCwgbG92LT5kZXNjLmxkX3RndF9jb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2ludGVybmFsLmgKaW5kZXggOGM4NTA4Yi4uYjY0NGFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaApAQCAtMzA0LDQgKzMwNCwxNiBAQAogCXJldHVybiBsc207CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBsb3Zfb2luZm9faXNfZHVtbXkoY29uc3Qgc3RydWN0IGxvdl9vaW5mbyAqbG9pKQoreworCWlmICh1bmxpa2VseShsb2ktPmxvaV9vaS5vaS5vaV9pZCA9PSAwICYmCisJCSAgICAgbG9pLT5sb2lfb2kub2kub2lfc2VxID09IDAgJiYKKwkJICAgICBsb2ktPmxvaV9vc3RfaWR4ID09IDAgJiYKKwkJICAgICBsb2ktPmxvaV9vc3RfZ2VuID09IDApKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYwppbmRleCBmMWY2ZGIzLi5jZjk2ZTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCkBAIC0xNDgsNiArMTQ4LDkgQEAKIAlMQVNTRVJUKHN1Yi0+c3ViX2VudiA9PSBOVUxMKTsKIAlMQVNTRVJUKHN1Yi0+c3ViX3N0cmlwZSA8IGxpby0+bGlzX3N0cmlwZV9jb3VudCk7CiAKKwlpZiAodW5saWtlbHkobG92X3IwKGxvdiktPmxvX3N1YltzdHJpcGVdID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTzsKKwogCXJlc3VsdCA9IDA7CiAJc3ViLT5zdWJfaW9faW5pdGlhbGl6ZWQgPSAwOwogCXN1Yi0+c3ViX2JvcnJvd2VkID0gMDsKQEAgLTM5MSw3ICszOTQsMTYgQEAKIAkJCQkJICAgZW5kcG9zLCAmc3RhcnQsICZlbmQpKQogCQkJY29udGludWU7CiAKLQkJZW5kID0gbG92X29mZnNldF9tb2QoZW5kLCArMSk7CisJCWlmICh1bmxpa2VseShsb3ZfcjAobGlvLT5saXNfb2JqZWN0KS0+bG9fc3ViW3N0cmlwZV0gPT0gTlVMTCkpIHsKKwkJCWlmIChpb3MtPmNpc19pby0+Y2lfdHlwZSA9PSBDSVRfUkVBRCB8fAorCQkJICAgIGlvcy0+Y2lzX2lvLT5jaV90eXBlID09IENJVF9XUklURSB8fAorCQkJICAgIGlvcy0+Y2lzX2lvLT5jaV90eXBlID09IENJVF9GQVVMVCkKKwkJCQlyZXR1cm4gLUVJTzsKKworCQkJY29udGludWU7CisJCX0KKworCQllbmQgPSBsb3Zfb2Zmc2V0X21vZChlbmQsIDEpOwogCQlzdWIgPSBsb3Zfc3ViX2dldChlbnYsIGxpbywgc3RyaXBlKTsKIAkJaWYgKCFJU19FUlIoc3ViKSkgewogCQkJbG92X2lvX3N1Yl9pbmhlcml0KHN1Yi0+c3ViX2lvLCBsaW8sIHN0cmlwZSwKQEAgLTkxMyw3ICs5MjUsNyBAQAogCQlicmVhazsKIAljYXNlIENJVF9GU1lOQzoKIAljYXNlIENJVF9TRVRBVFRSOgotCQlyZXN1bHQgPSArMTsKKwkJcmVzdWx0ID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBDSVRfV1JJVEU6CiAJCXJlc3VsdCA9IC1FQkFERjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9sb2NrLmMKaW5kZXggNDllNjk0Mi4uZjJlY2E1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9sb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9sb2NrLmMKQEAgLTMwOCw3ICszMDgsOCBAQAogCQkgKiBYWFggZm9yIHdpZGUgc3RyaXBpbmcgc21hcnRlciBhbGdvcml0aG0gaXMgZGVzaXJhYmxlLAogCQkgKiBicmVha2luZyBvdXQgb2YgdGhlIGxvb3AsIGVhcmx5LgogCQkgKi8KLQkJaWYgKGxvdl9zdHJpcGVfaW50ZXJzZWN0cyhsb28tPmxvX2xzbSwgaSwKKwkJaWYgKGxpa2VseShyMC0+bG9fc3ViW2ldICE9IE5VTEwpICYmCisJCSAgICBsb3Zfc3RyaXBlX2ludGVyc2VjdHMobG9vLT5sb19sc20sIGksCiAJCQkJCSAgZmlsZV9zdGFydCwgZmlsZV9lbmQsICZzdGFydCwgJmVuZCkpCiAJCQlucisrOwogCX0KQEAgLTMyNiw3ICszMjcsOCBAQAogCSAqIHRvcC1sb2NrLgogCSAqLwogCWZvciAoaSA9IDAsIG5yID0gMDsgaSA8IHIwLT5sb19ucjsgKytpKSB7Ci0JCWlmIChsb3Zfc3RyaXBlX2ludGVyc2VjdHMobG9vLT5sb19sc20sIGksCisJCWlmIChsaWtlbHkocjAtPmxvX3N1YltpXSAhPSBOVUxMKSAmJgorCQkgICAgbG92X3N0cmlwZV9pbnRlcnNlY3RzKGxvby0+bG9fbHNtLCBpLAogCQkJCQkgIGZpbGVfc3RhcnQsIGZpbGVfZW5kLCAmc3RhcnQsICZlbmQpKSB7CiAJCQlzdHJ1Y3QgY2xfbG9ja19kZXNjciAqZGVzY3I7CiAKQEAgLTkxNCwxMCArOTE2LDIyIEBACiAJICovCiAJc3RhcnQgPSBjbF9vZmZzZXQoJmxvdi0+bG9fY2wsIGRlc2NyLT5jbGRfc3RhcnQpOwogCWVuZCAgID0gY2xfb2Zmc2V0KCZsb3YtPmxvX2NsLCBkZXNjci0+Y2xkX2VuZCArIDEpIC0gMTsKLQlyZXN1bHQgPSBlbmQgLSBzdGFydCA8PSBsc20tPmxzbV9zdHJpcGVfc2l6ZSAmJgotCQkgc3RyaXBlID09IGxvdl9zdHJpcGVfbnVtYmVyKGxzbSwgc3RhcnQpICYmCi0JCSBzdHJpcGUgPT0gbG92X3N0cmlwZV9udW1iZXIobHNtLCBlbmQpOwotCWlmIChyZXN1bHQpIHsKKwlyZXN1bHQgPSAwOworCS8qIGdsaW1wc2Ugc2hvdWxkIHdvcmsgb24gdGhlIG9iamVjdCB3aXRoIExPViBFQSBob2xlLiAqLworCWlmIChlbmQgLSBzdGFydCA8PSBsc20tPmxzbV9zdHJpcGVfc2l6ZSkgeworCQlpbnQgaWR4OworCisJCWlkeCA9IGxvdl9zdHJpcGVfbnVtYmVyKGxzbSwgc3RhcnQpOworCQlpZiAoaWR4ID09IHN0cmlwZSB8fAorCQkgICAgdW5saWtlbHkobG92X3IwKGxvdiktPmxvX3N1YltpZHhdID09IE5VTEwpKSB7CisJCQlpZHggPSBsb3Zfc3RyaXBlX251bWJlcihsc20sIGVuZCk7CisJCQlpZiAoaWR4ID09IHN0cmlwZSB8fAorCQkJICAgIHVubGlrZWx5KGxvdl9yMChsb3YpLT5sb19zdWJbaWR4XSA9PSBOVUxMKSkKKwkJCQlyZXN1bHQgPSAxOworCQl9CisJfQorCisJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCXN0cnVjdCBjbF9sb2NrX2Rlc2NyICpzdWJkID0gJmxvdl9lbnZfaW5mbyhlbnYpLT5sdGlfbGRlc2NyOwogCQl1NjQgc3ViX3N0YXJ0OwogCQl1NjQgc3ViX2VuZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCmluZGV4IGVhNTAzZDIuLjAyNzgxNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYwpAQCAtNTUzLDcgKzU1Myw3IEBACiAKIAkJbmV3c2l6ZSA9IG1heF90KF9fdTMyLCBsb3YtPmxvdl90Z3Rfc2l6ZSwgMik7CiAJCXdoaWxlIChuZXdzaXplIDwgaW5kZXggKyAxKQotCQkJbmV3c2l6ZSA9IG5ld3NpemUgPDwgMTsKKwkJCW5ld3NpemUgPDw9IDE7CiAJCU9CRF9BTExPQyhuZXd0Z3RzLCBzaXplb2YoKm5ld3RndHMpICogbmV3c2l6ZSk7CiAJCWlmIChuZXd0Z3RzID09IE5VTEwpIHsKIAkJCW11dGV4X3VubG9jaygmbG92LT5sb3ZfbG9jayk7CkBAIC0xMDExLDkgKzEwMTEsMTMgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJaWYgKGxzbS0+bHNtX29pbmZvW2ldLT5sb2lfb3N0X2lkeCA9PSBvc3RfaWR4KSB7Ci0JCQlpZiAob3N0aWRfaWQoJmxzbS0+bHNtX29pbmZvW2ldLT5sb2lfb2kpICE9Ci0JCQkJCW9zdGlkX2lkKCZzcmNfb2EtPm9fb2kpKSB7CisJCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IGxzbS0+bHNtX29pbmZvW2ldOworCisJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsb2ktPmxvaV9vc3RfaWR4ID09IG9zdF9pZHgpIHsKKwkJCWlmIChvc3RpZF9pZCgmbG9pLT5sb2lfb2kpICE9IG9zdGlkX2lkKCZzcmNfb2EtPm9fb2kpKSB7CiAJCQkJcmMgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0OwogCQkJfQpAQCAtMTMwNSwxMCArMTMwOSwxNCBAQAogCQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCBzdWJtZDsKIAkJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gbHNtLT5sc21fb2luZm9baV07CiAKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFsb3YtPmxvdl90Z3RzW2xvaS0+bG9pX29zdF9pZHhdKSB7Ci0JCQlDREVCVUcoRF9IQSwgImxvdiBpZHggJWQgTlVMTCBcbiIsIGxvaS0+bG9pX29zdF9pZHgpOworCQkJQ0RFQlVHKERfSEEsICJsb3YgaWR4ICVkIE5VTExcbiIsIGxvaS0+bG9pX29zdF9pZHgpOwogCQkJY29udGludWU7CiAJCX0KKwogCQlzdWJtZC5sc21fb2kgPSBsb2ktPmxvaV9vaTsKIAkJc3VibWQubHNtX3N0cmlwZV9jb3VudCA9IDA7CiAJCXJjID0gb2JkX2ZpbmRfY2JkYXRhKGxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0tPmx0ZF9leHAsCkBAIC0xNjAxLDkgKzE2MDksOSBAQAogICogXHBhcmFtIGZtX2VuZCBsb2dpY2FsIGVuZCBvZiBtYXBwaW5nCiAgKiBccGFyYW0gc3RhcnRfc3RyaXBlIHN0YXJ0aW5nIHN0cmlwZSB3aWxsIGJlIHJldHVybmVkIGluIHRoaXMKICAqLwotdTY0IGZpZW1hcF9jYWxjX2ZtX2VuZF9vZmZzZXQoc3RydWN0IGxsX3VzZXJfZmllbWFwICpmaWVtYXAsCi0JCQkJICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgdTY0IGZtX3N0YXJ0LAotCQkJCSAgIHU2NCBmbV9lbmQsIGludCAqc3RhcnRfc3RyaXBlKQorc3RhdGljIHU2NCBmaWVtYXBfY2FsY19mbV9lbmRfb2Zmc2V0KHN0cnVjdCBsbF91c2VyX2ZpZW1hcCAqZmllbWFwLAorCQkJCSAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgdTY0IGZtX3N0YXJ0LAorCQkJCSAgICAgdTY0IGZtX2VuZCwgaW50ICpzdGFydF9zdHJpcGUpCiB7CiAJdTY0IGxvY2FsX2VuZCA9IGZpZW1hcC0+Zm1fZXh0ZW50c1swXS5mZV9sb2dpY2FsOwogCXU2NCBsdW5fc3RhcnQsIGx1bl9lbmQ7CkBAIC0xNjE2LDggKzE2MjQsMTIgQEAKIAogCS8qIEZpbmQgb3V0IHN0cmlwZV9ubyBmcm9tIG9zdF9pbmRleCBzYXZlZCBpbiB0aGUgZmVfZGV2aWNlICovCiAJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChsc20tPmxzbV9vaW5mb1tpXS0+bG9pX29zdF9pZHggPT0KLQkJCQkJZmllbWFwLT5mbV9leHRlbnRzWzBdLmZlX2RldmljZSkgeworCQlzdHJ1Y3QgbG92X29pbmZvICpvaW5mbyA9IGxzbS0+bHNtX29pbmZvW2ldOworCisJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkob2luZm8pKQorCQkJY29udGludWU7CisKKwkJaWYgKG9pbmZvLT5sb2lfb3N0X2lkeCA9PSBmaWVtYXAtPmZtX2V4dGVudHNbMF0uZmVfZGV2aWNlKSB7CiAJCQlzdHJpcGVfbm8gPSBpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE2NTgsMTcgKzE2NzAsMTcgQEAKICAqCiAgKiBccmV0dmFsIGxhc3Rfc3RyaXBlIHJldHVybiB0aGUgbGFzdCBzdHJpcGUgb2YgdGhlIG1hcHBpbmcKICAqLwotaW50IGZpZW1hcF9jYWxjX2xhc3Rfc3RyaXBlKHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sIHU2NCBmbV9zdGFydCwKLQkJCSAgICB1NjQgZm1fZW5kLCBpbnQgc3RhcnRfc3RyaXBlLAotCQkJICAgIGludCAqc3RyaXBlX2NvdW50KQorc3RhdGljIGludCBmaWVtYXBfY2FsY19sYXN0X3N0cmlwZShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCB1NjQgZm1fc3RhcnQsCisJCQkJICAgdTY0IGZtX2VuZCwgaW50IHN0YXJ0X3N0cmlwZSwKKwkJCQkgICBpbnQgKnN0cmlwZV9jb3VudCkKIHsKIAlpbnQgbGFzdF9zdHJpcGU7CiAJdTY0IG9iZF9zdGFydCwgb2JkX2VuZDsKIAlpbnQgaSwgajsKIAogCWlmIChmbV9lbmQgLSBmbV9zdGFydCA+IGxzbS0+bHNtX3N0cmlwZV9zaXplICogbHNtLT5sc21fc3RyaXBlX2NvdW50KSB7Ci0JCWxhc3Rfc3RyaXBlID0gKHN0YXJ0X3N0cmlwZSA8IDEgPyBsc20tPmxzbV9zdHJpcGVfY291bnQgLSAxIDoKLQkJCQkJCQkgICAgICBzdGFydF9zdHJpcGUgLSAxKTsKKwkJbGFzdF9zdHJpcGUgPSBzdGFydF9zdHJpcGUgPCAxID8gbHNtLT5sc21fc3RyaXBlX2NvdW50IC0gMSA6CisJCQkJCQkJICAgICAgc3RhcnRfc3RyaXBlIC0gMTsKIAkJKnN0cmlwZV9jb3VudCA9IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsKIAl9IGVsc2UgewogCQlmb3IgKGogPSAwLCBpID0gc3RhcnRfc3RyaXBlOyBqIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OwpAQCAtMTY5NCwxMCArMTcwNiwxMCBAQAogICogXHBhcmFtIGV4dF9jb3VudCBudW1iZXIgb2YgZXh0ZW50cyB0byBiZSBjb3BpZWQKICAqIFxwYXJhbSBjdXJyZW50X2V4dGVudCB3aGVyZSB0byBzdGFydCBjb3B5aW5nIGluIG1haW4gZXh0ZW50IGFycmF5CiAgKi8KLXZvaWQgZmllbWFwX3ByZXBhcmVfYW5kX2NvcHlfZXh0cyhzdHJ1Y3QgbGxfdXNlcl9maWVtYXAgKmZpZW1hcCwKLQkJCQkgIHN0cnVjdCBsbF9maWVtYXBfZXh0ZW50ICpsY2xfZm1fZXh0LAotCQkJCSAgaW50IG9zdF9pbmRleCwgdW5zaWduZWQgaW50IGV4dF9jb3VudCwKLQkJCQkgIGludCBjdXJyZW50X2V4dGVudCkKK3N0YXRpYyB2b2lkIGZpZW1hcF9wcmVwYXJlX2FuZF9jb3B5X2V4dHMoc3RydWN0IGxsX3VzZXJfZmllbWFwICpmaWVtYXAsCisJCQkJCSBzdHJ1Y3QgbGxfZmllbWFwX2V4dGVudCAqbGNsX2ZtX2V4dCwKKwkJCQkJIGludCBvc3RfaW5kZXgsIHVuc2lnbmVkIGludCBleHRfY291bnQsCisJCQkJCSBpbnQgY3VycmVudF9leHRlbnQpCiB7CiAJY2hhciAqdG87CiAJaW50IGV4dDsKQEAgLTE3OTUsNiArMTgwNywxMSBAQAogCQkJCQkgICAmbHVuX3N0YXJ0LCAmb2JkX29iamVjdF9lbmQpKSA9PSAwKQogCQkJY29udGludWU7CiAKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsc20tPmxzbV9vaW5mb1tjdXJfc3RyaXBlXSkpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisKIAkJLyogSWYgdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiBGSUVNQVAgY2FsbCBhbmQgd2UgYXJlIG9uCiAJCSAqIHN0YXJ0aW5nIHN0cmlwZSB0aGVuIGx1bl9zdGFydCBuZWVkcyB0byBiZSBzZXQgdG8KIAkJICogZm1fZW5kX29mZnNldCAqLwpAQCAtMTk4NSw2ICsyMDAyLDkgQEAKIAkJICogYmUgTlVMTCBhbmQgd29uJ3QgbWF0Y2ggdGhlIGxvY2sncyBleHBvcnQuICovCiAJCWZvciAoaSA9IDA7IGkgPCBsc20tPmxzbV9zdHJpcGVfY291bnQ7IGkrKykgewogCQkJbG9pID0gbHNtLT5sc21fb2luZm9baV07CisJCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxvaSkpCisJCQkJY29udGludWU7CisKIAkJCWlmICghbG92LT5sb3ZfdGd0c1tsb2ktPmxvaV9vc3RfaWR4XSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChsb3YtPmxvdl90Z3RzW2xvaS0+bG9pX29zdF9pZHhdLT5sdGRfZXhwID09CkBAIC0yMjkwLDcgKzIzMTAsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RydWN0IG9iZF9vcHMgbG92X29iZF9vcHMgPSB7CitzdGF0aWMgc3RydWN0IG9iZF9vcHMgbG92X29iZF9vcHMgPSB7CiAJLm9fb3duZXIJICAgICAgID0gVEhJU19NT0RVTEUsCiAJLm9fc2V0dXAJICAgICAgID0gbG92X3NldHVwLAogCS5vX3ByZWNsZWFudXAJICA9IGxvdl9wcmVjbGVhbnVwLApAQCAtMjMyNCw3ICsyMzQ0LDcgQEAKIAogc3RydWN0IGttZW1fY2FjaGUgKmxvdl9vaW5mb19zbGFiOwogCi1pbnQgX19pbml0IGxvdl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBsb3ZfaW5pdCh2b2lkKQogewogCXN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzIGx2YXJzID0geyBOVUxMIH07CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKaW5kZXggNGNhYjczMC4uYTIyMzQyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xPVgogCiAjaW5jbHVkZSAibG92X2NsX2ludGVybmFsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sY2xpZW50LmgiCiAKIC8qKiBcYWRkdG9ncm91cCBsb3YKICAqICBAewpAQCAtMjMwLDYgKzIzMSw5IEBACiAJCQlzdHJ1Y3QgbG92X29pbmZvICpvaW5mbyA9IGxzbS0+bHNtX29pbmZvW2ldOwogCQkJaW50IG9zdF9pZHggPSBvaW5mby0+bG9pX29zdF9pZHg7CiAKKwkJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkob2luZm8pKQorCQkJCWNvbnRpbnVlOworCiAJCQlyZXN1bHQgPSBvc3RpZF90b19maWQob2ZpZCwgJm9pbmZvLT5sb2lfb2ksCiAJCQkJCSAgICAgIG9pbmZvLT5sb2lfb3N0X2lkeCk7CiAJCQlpZiAocmVzdWx0ICE9IDApCkBAIC01NjMsNyArNTY3LDcgQEAKIC8qKgogICogUmV0dXJuIGxvdl9sYXlvdXRfdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBsc20KICAqLwotZW51bSBsb3ZfbGF5b3V0X3R5cGUgbG92X3R5cGUoc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKK3N0YXRpYyBlbnVtIGxvdl9sYXlvdXRfdHlwZSBsb3ZfdHlwZShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQogewogCWlmIChsc20gPT0gTlVMTCkKIAkJcmV0dXJuIExMVF9FTVBUWTsKQEAgLTk3Myw2ICs5NzcsMTAgQEAKIAkJCUxBU1NFUlQobHNtICE9IE5VTEwpOwogCQkJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7CiAJCQkJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gbHNtLT5sc21fb2luZm9baV07CisKKwkJCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxvaSkpCisJCQkJCWNvbnRpbnVlOworCiAJCQkJaWYgKGxvaS0+bG9pX2FyLmFyX3JjICYmICFyYykKIAkJCQkJcmMgPSBsb2ktPmxvaV9hci5hcl9yYzsKIAkJCQlsb2ktPmxvaV9hci5hcl9yYyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3Bvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jCmluZGV4IDBlMGVhNjAuLmQ5NjE2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jCkBAIC03MSw3ICs3MSw3IEBACiAJfQogfQogCi12b2lkIGxvdl9wb29sX3B1dHJlZl9sb2NrZWQoc3RydWN0IHBvb2xfZGVzYyAqcG9vbCkKK3N0YXRpYyB2b2lkIGxvdl9wb29sX3B1dHJlZl9sb2NrZWQoc3RydWN0IHBvb2xfZGVzYyAqcG9vbCkKIHsKIAlDREVCVUcoRF9JTkZPLCAicG9vbCAlcFxuIiwgcG9vbCk7CiAJTEFTU0VSVChhdG9taWNfcmVhZCgmcG9vbC0+cG9vbF9yZWZjb3VudCkgPiAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKaW5kZXggNzM1OGI5ZC4uOTMzZTJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKQEAgLTI5OSw2ICsyOTksOSBAQAogCQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKIAogCQlsb2kgPSBvaW5mby0+b2lfbWQtPmxzbV9vaW5mb1tpXTsKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKIAkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CiAJCQlpZiAob2luZm8tPm9pX29hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRVBPQ0gpIHsKQEAgLTM4NCw2ICszODcsOSBAQAogCQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKIAogCQlsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKIAkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CiAJCQljb250aW51ZTsKQEAgLTQ5Nyw2ICs1MDMsOSBAQAogCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBvaW5mby0+b2lfbWQtPmxzbV9vaW5mb1tpXTsKIAkJc3RydWN0IGxvdl9yZXF1ZXN0ICpyZXE7CiAKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKIAkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9scHJvY19sb3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9scHJvY19sb3YuYwppbmRleCBjOTlmMmY0Li4xNzRjYmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbHByb2NfbG92LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xwcm9jX2xvdi5jCkBAIC0zNSw3ICszNSw3IEBACiAgKi8KICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfQ0xBU1MKIAotI2luY2x1ZGUgPGFzbS9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtNDgsNyArNDgsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJZGVzYyA9ICZkZXYtPnUubG92LmRlc2M7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVsbHVcbiIsIGRlc2MtPmxkX2RlZmF1bHRfc3RyaXBlX3NpemUpOworCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIGRlc2MtPmxkX2RlZmF1bHRfc3RyaXBlX3NpemUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsb3Zfc3RyaXBlc2l6ZV9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC03OSw3ICs4MCw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sb3YuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0KTsKKwlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBkZXNjLT5sZF9kZWZhdWx0X3N0cmlwZV9vZmZzZXQpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsb3Zfc3RyaXBlb2Zmc2V0X3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTEwOSw3ICsxMTEsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJZGVzYyA9ICZkZXYtPnUubG92LmRlc2M7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBkZXNjLT5sZF9wYXR0ZXJuKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgZGVzYy0+bGRfcGF0dGVybik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxvdl9zdHJpcGV0eXBlX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTEzOSw4ICsxNDIsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJZGVzYyA9ICZkZXYtPnUubG92LmRlc2M7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLAotCQkJKF9fczE2KShkZXNjLT5sZF9kZWZhdWx0X3N0cmlwZV9jb3VudCArIDEpIC0gMSk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIChfX3MxNikoZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfY291bnQgKyAxKSAtIDEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsb3Zfc3RyaXBlY291bnRfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMTcwLDcgKzE3Myw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sb3YuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX3RndF9jb3VudCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX3RndF9jb3VudCk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsb3ZfbnVtb2JkKTsKIApAQCAtMTgxLDcgKzE4NSw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sb3YuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX2FjdGl2ZV90Z3RfY291bnQpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBkZXNjLT5sZF9hY3RpdmVfdGd0X2NvdW50KTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxvdl9hY3RpdmVvYmQpOwogCkBAIC0xOTIsNyArMTk3LDggQEAKIAogCUxBU1NFUlQoZGV2ICE9IE5VTEwpOwogCWxvdiA9ICZkZXYtPnUubG92OwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgbG92LT5kZXNjLmxkX3V1aWQudXVpZCk7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIGxvdi0+ZGVzYy5sZF91dWlkLnV1aWQpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obG92X2Rlc2NfdXVpZCk7CiAKQEAgLTIyOCwxMiArMjM0LDE0IEBACiBzdGF0aWMgaW50IGxvdl90Z3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQogewogCXN0cnVjdCBsb3ZfdGd0X2Rlc2MgKnRndCA9IHY7Ci0JcmV0dXJuIHNlcV9wcmludGYocCwgIiVkOiAlcyAlc0FDVElWRVxuIiwgdGd0LT5sdGRfaW5kZXgsCi0JCQkgIG9iZF91dWlkMnN0cigmdGd0LT5sdGRfdXVpZCksCi0JCQkgIHRndC0+bHRkX2FjdGl2ZSA/ICIiIDogIklOIik7CisKKwlzZXFfcHJpbnRmKHAsICIlZDogJXMgJXNBQ1RJVkVcbiIsCisJCSAgIHRndC0+bHRkX2luZGV4LCBvYmRfdXVpZDJzdHIoJnRndC0+bHRkX3V1aWQpLAorCQkgICB0Z3QtPmx0ZF9hY3RpdmUgPyAiIiA6ICJJTiIpOworCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG92X3RndF9zb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb3ZfdGd0X3NvcHMgPSB7CiAJLnN0YXJ0ID0gbG92X3RndF9zZXFfc3RhcnQsCiAJLnN0b3AgPSBsb3ZfdGd0X3NlcV9zdG9wLAogCS5uZXh0ID0gbG92X3RndF9zZXFfbmV4dCwKQEAgLTI2Miw3ICsyNzAsNyBAQAogTFBST0NfU0VRX0ZPUFNfUk9fVFlQRShsb3YsIGtieXRlc2ZyZWUpOwogTFBST0NfU0VRX0ZPUFNfUk9fVFlQRShsb3YsIGtieXRlc2F2YWlsKTsKIAotc3RydWN0IGxwcm9jZnNfdmFycyBscHJvY2ZzX2xvdl9vYmRfdmFyc1tdID0geworc3RhdGljIHN0cnVjdCBscHJvY2ZzX3ZhcnMgbHByb2Nmc19sb3Zfb2JkX3ZhcnNbXSA9IHsKIAl7ICJ1dWlkIiwJICAmbG92X3V1aWRfZm9wcywJICBOVUxMLCAwIH0sCiAJeyAic3RyaXBlc2l6ZSIsICAgJmxvdl9zdHJpcGVzaXplX2ZvcHMsICAgTlVMTCB9LAogCXsgInN0cmlwZW9mZnNldCIsICZsb3Zfc3RyaXBlb2Zmc2V0X2ZvcHMsIE5VTEwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9scHJvY19tZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9scHJvY19tZGMuYwppbmRleCBjNzkxOTQxLi5hY2ZlMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbHByb2NfbWRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL2xwcm9jX21kYy5jCkBAIC0zOCwxNyArMzgsMTggQEAKICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKKyNpbmNsdWRlICJtZGNfaW50ZXJuYWwuaCIKIAogc3RhdGljIGludCBtZGNfbWF4X3JwY3NfaW5fZmxpZ2h0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7Ci0JaW50IHJjOwogCiAJY2xpZW50X29iZF9saXN0X2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sICIldVxuIiwgY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCk7CiAJY2xpZW50X29iZF9saXN0X3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbWRjX21heF9ycGNzX2luX2ZsaWdodF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCmluZGV4IGVmMjc0NDcuLmY4ZWY1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCkBAIC00ODEsNiArNDgxLDkgQEAKIAkJcmV0dXJuIC1FUFJPVE87CiAKIAlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cigmaW5pdF91c2VyX25zLCBidWYsIGJvZHktPmFjbHNpemUpOworCWlmIChhY2wgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKIAlpZiAoSVNfRVJSKGFjbCkpIHsKIAkJcmMgPSBQVFJfRVJSKGFjbCk7CiAJCUNFUlJPUigiY29udmVydCB4YXR0ciB0byBhY2w6ICVkXG4iLCByYyk7CkBAIC0yNzA3LDE0ICsyNzEwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG1kY19pbml0KHZvaWQpCiB7Ci0JaW50IHJjOwogCXN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzIGx2YXJzID0geyBOVUxMIH07CiAKIAlscHJvY2ZzX21kY19pbml0X3ZhcnMoJmx2YXJzKTsKIAotCXJjID0gY2xhc3NfcmVnaXN0ZXJfdHlwZSgmbWRjX29iZF9vcHMsICZtZGNfbWRfb3BzLCBsdmFycy5tb2R1bGVfdmFycywKKwlyZXR1cm4gY2xhc3NfcmVnaXN0ZXJfdHlwZSgmbWRjX29iZF9vcHMsICZtZGNfbWRfb3BzLCBsdmFycy5tb2R1bGVfdmFycywKIAkJCQkgTFVTVFJFX01EQ19OQU1FLCBOVUxMKTsKLQlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIC8qX19leGl0Ki8gbWRjX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21nYy9tZ2NfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKaW5kZXggNjBkMmIwZi4uNzk0N2FlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKQEAgLTk1LDcgKzk1LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobWdjX2ZzbmFtZTJyZXNpZCk7CiAKLWludCBtZ2NfbG9nbmFtZTJyZXNpZChjaGFyICpsb2duYW1lLCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlc19pZCwgaW50IHR5cGUpCitzdGF0aWMgaW50IG1nY19sb2duYW1lMnJlc2lkKGNoYXIgKmxvZ25hbWUsIHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzX2lkLCBpbnQgdHlwZSkKIHsKIAljaGFyICpuYW1lX2VuZDsKIAlpbnQgbGVuOwpAQCAtMTYwLDcgKzE2MCw3IEBACiB7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZDsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqZm91bmQgPSBOVUxMOwotCXZvaWQgKgkJICAgaW5zdGFuY2U7CisJdm9pZCAqaW5zdGFuY2U7CiAKIAlMQVNTRVJUKGxvZ25hbWUgIT0gTlVMTCk7CiAKQEAgLTQ1MiwxMCArNDUyLDE0IEBACiBpbnQgbHByb2Nmc19tZ2NfcmRfaXJfc3RhdGUoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBkYXRhOwotCXN0cnVjdCBvYmRfaW1wb3J0ICAgICAgICppbXAgPSBvYmQtPnUuY2xpLmNsX2ltcG9ydDsKLQlzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkID0gJmltcC0+aW1wX2Nvbm5lY3RfZGF0YTsKKwlzdHJ1Y3Qgb2JkX2ltcG9ydCAgICAgICAqaW1wOworCXN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2Q7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZDsKIAorCUxQUk9DRlNfQ0xJTVBfQ0hFQ0sob2JkKTsKKwlpbXAgPSBvYmQtPnUuY2xpLmNsX2ltcG9ydDsKKwlvY2QgPSAmaW1wLT5pbXBfY29ubmVjdF9kYXRhOworCiAJc2VxX3ByaW50ZihtLCAiaW1wZXJhdGl2ZV9yZWNvdmVyeTogJXNcbiIsCiAJCSAgICAgIE9DRF9IQVNfRkxBRyhvY2QsIElNUF9SRUNPVikgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiKTsKIAlzZXFfcHJpbnRmKG0sICJjbGllbnRfc3RhdGU6XG4iKTsKQEAgLTQ3MCw2ICs0NzQsNyBAQAogCX0KIAlzcGluX3VubG9jaygmY29uZmlnX2xpc3RfbG9jayk7CiAKKwlMUFJPQ0ZTX0NMSU1QX0VYSVQob2JkKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtNDc5LDkgKzQ4NCwxMSBAQAogI2RlZmluZSBSUV9OT1cgICAgIDB4MgogI2RlZmluZSBSUV9MQVRFUiAgIDB4NAogI2RlZmluZSBSUV9TVE9QICAgIDB4OAotc3RhdGljIGludAkJICAgIHJxX3N0YXRlID0gMDsKKyNkZWZpbmUgUlFfUFJFQ0xFQU5VUCAgMHgxMAorc3RhdGljIGludCBycV9zdGF0ZTsKIHN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdAkgICAgcnFfd2FpdHE7CiBzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHJxX2V4aXQpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihycV9zdGFydCk7CiAKIHN0YXRpYyB2b2lkIGRvX3JlcXVldWUoc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZCkKIHsKQEAgLTUxMCw2ICs1MTcsOCBAQAogCiBzdGF0aWMgaW50IG1nY19yZXF1ZXVlX3RocmVhZCh2b2lkICpkYXRhKQogeworCWJvb2wgZmlyc3QgPSB0cnVlOworCiAJQ0RFQlVHKERfTUdDLCAiU3RhcnRpbmcgcmVxdWV1ZSB0aHJlYWRcbiIpOwogCiAJLyogS2VlcCB0cnlpbmcgZmFpbGVkIGxvY2tzIHBlcmlvZGljYWxseSAqLwpAQCAtNTI2LDEzICs1MzUsMTkgQEAKIAkJcnFfc3RhdGUgJj0gfihSUV9OT1cgfCBSUV9MQVRFUik7CiAJCXNwaW5fdW5sb2NrKCZjb25maWdfbGlzdF9sb2NrKTsKIAorCQlpZiAoZmlyc3QpIHsKKwkJCWZpcnN0ID0gZmFsc2U7CisJCQljb21wbGV0ZSgmcnFfc3RhcnQpOworCQl9CisKIAkJLyogQWx3YXlzIHdhaXQgYSBmZXcgc2Vjb25kcyB0byBhbGxvdyB0aGUgc2VydmVyIHdobwogCQkgICBjYXVzZWQgdGhlIGxvY2sgcmV2b2NhdGlvbiB0byBmaW5pc2ggaXRzIHNldHVwLCBwbHVzIHNvbWUKIAkJICAgcmFuZG9tIHNvIGV2ZXJ5b25lIGRvZXNuJ3QgdHJ5IHRvIHJlY29ubmVjdCBhdCBvbmNlLiAqLwogCQl0byA9IE1HQ19USU1FT1VUX01JTl9TRUNPTkRTICogSFo7CiAJCXRvICs9IHJhbmQgKiBIWiAvIDEwMDsgLyogcmFuZCBpcyBjZW50aS1zZWNvbmRzICovCiAJCWx3aSA9IExXSV9USU1FT1VUKHRvLCBOVUxMLCBOVUxMKTsKLQkJbF93YWl0X2V2ZW50KHJxX3dhaXRxLCBycV9zdGF0ZSAmIFJRX1NUT1AsICZsd2kpOworCQlsX3dhaXRfZXZlbnQocnFfd2FpdHEsIHJxX3N0YXRlICYgKFJRX1NUT1AgfCBSUV9QUkVDTEVBTlVQKSwKKwkJCSAgICAgJmx3aSk7CiAKIAkJLyoKIAkJICogaXRlcmF0ZSAmIHByb2Nlc3NpbmcgdGhyb3VnaCB0aGUgbGlzdC4gZm9yIGVhY2ggY2xkLCBwcm9jZXNzCkBAIC01NDUsNiArNTYwLDcgQEAKIAkJY2xkX3ByZXYgPSBOVUxMOwogCiAJCXNwaW5fbG9jaygmY29uZmlnX2xpc3RfbG9jayk7CisJCXJxX3N0YXRlICY9IH5SUV9QUkVDTEVBTlVQOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsZCwgJmNvbmZpZ19sbG9nX2xpc3QsCiAJCQkJCWNsZF9saXN0X2NoYWluKSB7CiAJCQlpZiAoIWNsZC0+Y2xkX2xvc3Rsb2NrKQpAQCAtNjYxLDI0ICs2NzcsMjYgQEAKIHN0YXRpYyBpbnQgbWdjX3ByZWNsZWFudXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwgZW51bSBvYmRfY2xlYW51cF9zdGFnZSBzdGFnZSkKIHsKIAlpbnQgcmMgPSAwOworCWludCB0ZW1wOwogCiAJc3dpdGNoIChzdGFnZSkgewogCWNhc2UgT0JEX0NMRUFOVVBfRUFSTFk6CiAJCWJyZWFrOwogCWNhc2UgT0JEX0NMRUFOVVBfRVhQT1JUUzoKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1nY19jb3VudCkpIHsKLQkJCWludCBydW5uaW5nOworCQkJTEFTU0VSVChycV9zdGF0ZSAmIFJRX1JVTk5JTkcpOwogCQkJLyogc3RvcCByZXF1ZXVlIHRocmVhZCAqLwotCQkJc3Bpbl9sb2NrKCZjb25maWdfbGlzdF9sb2NrKTsKLQkJCXJ1bm5pbmcgPSBycV9zdGF0ZSAmIFJRX1JVTk5JTkc7Ci0JCQlpZiAocnVubmluZykKLQkJCQlycV9zdGF0ZSB8PSBSUV9TVE9QOwotCQkJc3Bpbl91bmxvY2soJmNvbmZpZ19saXN0X2xvY2spOwotCQkJaWYgKHJ1bm5pbmcpIHsKLQkJCQl3YWtlX3VwKCZycV93YWl0cSk7Ci0JCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcnFfZXhpdCk7Ci0JCQl9CisJCQl0ZW1wID0gUlFfU1RPUDsKKwkJfSBlbHNlIHsKKwkJCS8qIHdha2V1cCByZXF1ZXVlIHRocmVhZCB0byBjbGVhbiBvdXIgY2xkICovCisJCQl0ZW1wID0gUlFfTk9XIHwgUlFfUFJFQ0xFQU5VUDsKIAkJfQorCQlzcGluX2xvY2soJmNvbmZpZ19saXN0X2xvY2spOworCQlycV9zdGF0ZSB8PSB0ZW1wOworCQlzcGluX3VubG9jaygmY29uZmlnX2xpc3RfbG9jayk7CisJCXdha2VfdXAoJnJxX3dhaXRxKTsKKwkJaWYgKHRlbXAgJiBSUV9TVE9QKQorCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcnFfZXhpdCk7CiAJCW9iZF9jbGVhbnVwX2NsaWVudF9pbXBvcnQob2JkKTsKIAkJcmMgPSBtZ2NfbGxvZ19maW5pKE5VTEwsIG9iZCk7CiAJCWlmIChyYyAhPSAwKQpAQCAtNjkwLDggKzcwOCw2IEBACiAKIHN0YXRpYyBpbnQgbWdjX2NsZWFudXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCkKIHsKLQlpbnQgcmM7Ci0KIAkvKiBDT01QQVRfMTQ2IC0gb2xkIGNvbmZpZyBsb2dzIG1heSBoYXZlIGFkZGVkIHByb2ZpbGVzIHdlIGRvbid0CiAJICAga25vdyBhYm91dCAqLwogCWlmIChvYmQtPm9iZF90eXBlLT50eXBfcmVmY250IDw9IDEpCkBAIC03MDEsOCArNzE3LDcgQEAKIAlscHJvY2ZzX29iZF9jbGVhbnVwKG9iZCk7CiAJcHRscnBjZF9kZWNyZWYoKTsKIAotCXJjID0gY2xpZW50X29iZF9jbGVhbnVwKG9iZCk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBjbGllbnRfb2JkX2NsZWFudXAob2JkKTsKIH0KIAogc3RhdGljIGludCBtZ2Nfc2V0dXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwgc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpCkBAIC03NDAsNiArNzU1LDcgQEAKIAkJfQogCQkvKiByYyBpcyB0aGUgdGFza19zdHJ1Y3QgcG9pbnRlciBvZiBtZ2NfcmVxdWV1ZV90aHJlYWQuICovCiAJCXJjID0gMDsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmcnFfc3RhcnQpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTk1MSw3ICs5NjcsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IG1nY19zZXRfaW5mb19hc3luYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCitzdGF0aWMgaW50IG1nY19zZXRfaW5mb19hc3luYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCSAgICAgICB1MzIga2V5bGVuLCB2b2lkICprZXksIHUzMiB2YWxsZW4sCiAJCSAgICAgICB2b2lkICp2YWwsIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCkKIHsKQEAgLTE3MjcsNyArMTc0Myw3IEBACiAJLm9fcHJvY2Vzc19jb25maWcgPSBtZ2NfcHJvY2Vzc19jb25maWcsCiB9OwogCi1pbnQgX19pbml0IG1nY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtZ2NfaW5pdCh2b2lkKQogewogCXJldHVybiBjbGFzc19yZWdpc3Rlcl90eXBlKCZtZ2Nfb2JkX29wcywgTlVMTCwgTlVMTCwKIAkJCQkgICBMVVNUUkVfTUdDX05BTUUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbGFzc19vYmQuYwppbmRleCAyOTQ1NmUxLi5kNGI3NGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbGFzc19vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbGFzc19vYmQuYwpAQCAtNDM3LDggKzQzNyw2IEBACiAJcmV0dXJuIGVycjsKIH0gLyogY2xhc3NfaGFuZGxlX2lvY3RsICovCiAKLWV4dGVybiBzdHJ1Y3QgbWlzY2RldmljZSBvYmRfcHNkZXY7Ci0KICNkZWZpbmUgT0JEX0lOSVRfQ0hFQ0sKIGludCBvYmRfaW5pdF9jaGVja3Modm9pZCkKIHsKQEAgLTUwOCw3ICs1MDYsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiBzcGlubG9ja190IG9iZF90eXBlc19sb2NrOwogI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQogZXh0ZXJuIGludCBjbGFzc19wcm9jZnNfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgY2xhc3NfcHJvY2ZzX2NsZWFuKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZHRfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kdF9vYmplY3QuYwppbmRleCBlN2JlMjZlLi5iMWVlZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kdF9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kdF9vYmplY3QuYwpAQCAtNDI0LDExICs0MjQsOCBAQAogLyogZHQgY2xhc3MgaW5pdCBmdW5jdGlvbi4gKi8KIGludCBkdF9nbG9iYWxfaW5pdCh2b2lkKQogewotCWludCByZXN1bHQ7Ci0KIAlMVV9DT05URVhUX0tFWV9JTklUKCZkdF9rZXkpOwotCXJlc3VsdCA9IGx1X2NvbnRleHRfa2V5X3JlZ2lzdGVyKCZkdF9rZXkpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIGx1X2NvbnRleHRfa2V5X3JlZ2lzdGVyKCZkdF9rZXkpOwogfQogCiB2b2lkIGR0X2dsb2JhbF9maW5pKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCmluZGV4IDgyNTA4MjEuLjY2YjU2NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCkBAIC00MywxNyArNDMsMTYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKIAotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgb2JkX3R5cGVzOwogc3BpbmxvY2tfdCBvYmRfdHlwZXNfbG9jazsKIAogc3RydWN0IGttZW1fY2FjaGUgKm9iZF9kZXZpY2VfY2FjaGVwOwogc3RydWN0IGttZW1fY2FjaGUgKm9iZG9fY2FjaGVwOwogRVhQT1JUX1NZTUJPTChvYmRvX2NhY2hlcCk7Ci1zdHJ1Y3Qga21lbV9jYWNoZSAqaW1wb3J0X2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW1wb3J0X2NhY2hlcDsKIAotc3RydWN0IGxpc3RfaGVhZCAgICAgIG9iZF96b21iaWVfaW1wb3J0czsKLXN0cnVjdCBsaXN0X2hlYWQgICAgICBvYmRfem9tYmllX2V4cG9ydHM7Ci1zcGlubG9ja190ICBvYmRfem9tYmllX2ltcGV4cF9sb2NrOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgICAgICBvYmRfem9tYmllX2ltcG9ydHM7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAgICAgIG9iZF96b21iaWVfZXhwb3J0czsKK3N0YXRpYyBzcGlubG9ja190ICBvYmRfem9tYmllX2ltcGV4cF9sb2NrOwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9pbXBleHBfbm90aWZ5KHZvaWQpOwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9leHBvcnRfYWRkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApOwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9pbXBvcnRfYWRkKHN0cnVjdCBvYmRfaW1wb3J0ICppbXApOwpAQCAtOTMwLDcgKzkyOSw3IEBACiBFWFBPUlRfU1lNQk9MKGNsYXNzX3VubGlua19leHBvcnQpOwogCiAvKiBJbXBvcnQgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KLXZvaWQgY2xhc3NfaW1wb3J0X2Rlc3Ryb3koc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKK3N0YXRpYyB2b2lkIGNsYXNzX2ltcG9ydF9kZXN0cm95KHN0cnVjdCBvYmRfaW1wb3J0ICppbXApCiB7CiAJQ0RFQlVHKERfSU9DVEwsICJkZXN0cm95aW5nIGltcG9ydCAlcCBmb3IgJXNcbiIsIGltcCwKIAkJaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSk7CkBAIC0xMTI3LDcgKzExMjYsNyBAQAogRVhQT1JUX1NZTUJPTChjbGFzc19jb25uZWN0KTsKIAogLyogaWYgZXhwb3J0IGlzIGludm9sdmVkIGluIHJlY292ZXJ5IHRoZW4gY2xlYW4gdXAgcmVsYXRlZCB0aGluZ3MgKi8KLXZvaWQgY2xhc3NfZXhwb3J0X3JlY292ZXJ5X2NsZWFudXAoc3RydWN0IG9iZF9leHBvcnQgKmV4cCkKK3N0YXRpYyB2b2lkIGNsYXNzX2V4cG9ydF9yZWNvdmVyeV9jbGVhbnVwKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIApAQCAtMTIyMSw3ICsxMjIwLDcgQEAKIAlpZiAoZXhwKSB7CiAJCWludCBjb25uZWN0ZWQ7CiAJCXNwaW5fbG9jaygmZXhwLT5leHBfbG9jayk7Ci0JCWNvbm5lY3RlZCA9IChleHAtPmV4cF9jb25uX2NudCA+IDApOworCQljb25uZWN0ZWQgPSBleHAtPmV4cF9jb25uX2NudCA+IDA7CiAJCXNwaW5fdW5sb2NrKCZleHAtPmV4cF9sb2NrKTsKIAkJcmV0dXJuIGNvbm5lY3RlZDsKIAl9CkBAIC0xNTU5LDcgKzE1NTgsNyBAQAogRVhQT1JUX1NZTUJPTChvYmRfZXhwb3J0c19iYXJyaWVyKTsKIAogLyogVG90YWwgYW1vdW50IG9mIHpvbWJpZXMgdG8gYmUgZGVzdHJveWVkICovCi1zdGF0aWMgaW50IHpvbWJpZXNfY291bnQgPSAwOworc3RhdGljIGludCB6b21iaWVzX2NvdW50OwogCiAvKioKICAqIGtpbGwgem9tYmllIGltcG9ydHMgYW5kIGV4cG9ydHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKaW5kZXggYjk0YWVhYy4uMDY5NDRiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKQEAgLTIxNywyMyArMjE3LDI1IEBACiAKIAogI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQotaW50IG9iZF9wcm9jX3ZlcnNpb25fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQorc3RhdGljIGludCBvYmRfcHJvY192ZXJzaW9uX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAibHVzdHJlOiAlc1xua2VybmVsOiAlc1xuYnVpbGQ6ICAlc1xuIiwKLQkJCUxVU1RSRV9WRVJTSU9OX1NUUklORywgInBhdGNobGVzc19jbGllbnQiLAotCQkJQlVJTERfVkVSU0lPTik7CisJc2VxX3ByaW50ZihtLCAibHVzdHJlOiAlc1xua2VybmVsOiAlc1xuYnVpbGQ6ICAlc1xuIiwKKwkJICAgTFVTVFJFX1ZFUlNJT05fU1RSSU5HLCAicGF0Y2hsZXNzX2NsaWVudCIsIEJVSUxEX1ZFUlNJT04pOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob2JkX3Byb2NfdmVyc2lvbik7CiAKIGludCBvYmRfcHJvY19waW5nZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgIm9uIik7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsICJvbiIpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob2JkX3Byb2NfcGluZ2VyKTsKIAogc3RhdGljIGludCBvYmRfcHJvY19oZWFsdGhfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCWludCByYyA9IDAsIGk7CisJYm9vbCBoZWFsdGh5ID0gdHJ1ZTsKKwlpbnQgaTsKIAogCWlmIChsaWJjZnNfY2F0YXN0cm9waGUpCiAJCXNlcV9wcmludGYobSwgIkxCVUdcbiIpOwpAQCAtMjU1LDI1ICsyNTcsMjcgQEAKIAogCQlpZiAob2JkX2hlYWx0aF9jaGVjayhOVUxMLCBvYmQpKSB7CiAJCQlzZXFfcHJpbnRmKG0sICJkZXZpY2UgJXMgcmVwb3J0ZWQgdW5oZWFsdGh5XG4iLAotCQkJCSAgICAgIG9iZC0+b2JkX25hbWUpOwotCQkJcmMrKzsKKwkJCQkgICBvYmQtPm9iZF9uYW1lKTsKKwkJCWhlYWx0aHkgPSBmYWxzZTsKIAkJfQogCQljbGFzc19kZWNyZWYob2JkLCBfX2Z1bmNfXywgY3VycmVudCk7CiAJCXJlYWRfbG9jaygmb2JkX2Rldl9sb2NrKTsKIAl9CiAJcmVhZF91bmxvY2soJm9iZF9kZXZfbG9jayk7CiAKLQlpZiAocmMgPT0gMCkKLQkJcmV0dXJuIHNlcV9wcmludGYobSwgImhlYWx0aHlcbiIpOworCWlmIChoZWFsdGh5KQorCQlzZXFfcHV0cyhtLCAiaGVhbHRoeVxuIik7CisJZWxzZQorCQlzZXFfcHV0cyhtLCAiTk9UIEhFQUxUSFlcbiIpOwogCi0Jc2VxX3ByaW50ZihtLCAiTk9UIEhFQUxUSFlcbiIpOwogCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob2JkX3Byb2NfaGVhbHRoKTsKIAogc3RhdGljIGludCBvYmRfcHJvY19qb2JpZF92YXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkX2pvYmlkX3Zhcik7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIG9iZF9qb2JpZF92YXIpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBvYmRfcHJvY19qb2JpZF92YXJfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMjk5LDcgKzMwMyw4IEBACiAKIHN0YXRpYyBpbnQgb2JkX3Byb2Nfam9iaWRfbmFtZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVzXG4iLCBvYmRfam9iaWRfdmFyKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkX2pvYmlkX3Zhcik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9iZF9wcm9jX2pvYmlkX25hbWVfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMzc4LDEwICszODMsMTEgQEAKIAllbHNlCiAJCXN0YXR1cyA9ICItLSI7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihwLCAiJTNkICVzICVzICVzICVzICVkXG4iLAotCQkJICAoaW50KWluZGV4LCBzdGF0dXMsIG9iZC0+b2JkX3R5cGUtPnR5cF9uYW1lLAotCQkJICBvYmQtPm9iZF9uYW1lLCBvYmQtPm9iZF91dWlkLnV1aWQsCi0JCQkgIGF0b21pY19yZWFkKCZvYmQtPm9iZF9yZWZjb3VudCkpOworCXNlcV9wcmludGYocCwgIiUzZCAlcyAlcyAlcyAlcyAlZFxuIiwKKwkJICAgKGludClpbmRleCwgc3RhdHVzLCBvYmQtPm9iZF90eXBlLT50eXBfbmFtZSwKKwkJICAgb2JkLT5vYmRfbmFtZSwgb2JkLT5vYmRfdXVpZC51dWlkLAorCQkgICBhdG9taWNfcmVhZCgmb2JkLT5vYmRfcmVmY291bnQpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IHNlcV9vcGVyYXRpb25zIG9iZF9kZXZpY2VfbGlzdF9zb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtc3lzY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYwppbmRleCBkZDQ2ZTczLi40YjYyZDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYwpAQCAtNzksNiArNzksNyBAQAogfTsKIAogCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGludCBwcm9jX3NldF90aW1lb3V0KHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTIwNSw3ICsyMDYsNyBAQAogCQkJQ0VSUk9SKCJSZWZ1c2luZyB0byBzZXQgbWF4IGRpcnR5IHBhZ2VzIHRvICV1LCB3aGljaCBpcyBtb3JlIHRoYW4gOTAlJSBvZiBhdmFpbGFibGUgUkFNOyBzZXR0aW5nIHRvICVsdVxuIiwKIAkJCSAgICAgICBvYmRfbWF4X2RpcnR5X3BhZ2VzLAogCQkJICAgICAgICgodG90YWxyYW1fcGFnZXMgLyAxMCkgKiA5KSk7Ci0JCQlvYmRfbWF4X2RpcnR5X3BhZ2VzID0gKCh0b3RhbHJhbV9wYWdlcyAvIDEwKSAqIDkpOworCQkJb2JkX21heF9kaXJ0eV9wYWdlcyA9ICh0b3RhbHJhbV9wYWdlcyAvIDEwKSAqIDk7CiAJCX0gZWxzZSBpZiAob2JkX21heF9kaXJ0eV9wYWdlcyA8IDQgPDwgKDIwIC0gUEFHRV9DQUNIRV9TSElGVCkpIHsKIAkJCW9iZF9tYXhfZGlydHlfcGFnZXMgPSA0IDw8ICgyMCAtIFBBR0VfQ0FDSEVfU0hJRlQpOwogCQl9CkBAIC0yNTgsNyArMjU5LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBvYmRfdGFibGVbXSA9IHsKIAl7CiAJCS5wcm9jbmFtZSA9ICJ0aW1lb3V0IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCmluZGV4IDRiODUwZmMuLmM4ZjZhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYwpAQCAtNTI2LDggKzUyNiw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGxsb2dfY2F0X2NhbmNlbF9yZWNvcmRzKTsKIAotaW50IGxsb2dfY2F0X3Byb2Nlc3NfY2IoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdF9sbGgsCi0JCQlzdHJ1Y3QgbGxvZ19yZWNfaGRyICpyZWMsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGxsb2dfY2F0X3Byb2Nlc3NfY2IoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAorCQkJICAgICAgIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0X2xsaCwKKwkJCSAgICAgICBzdHJ1Y3QgbGxvZ19yZWNfaGRyICpyZWMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGxsb2dfcHJvY2Vzc19kYXRhICpkID0gZGF0YTsKIAlzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMgKmxpciA9IChzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMgKilyZWM7CkBAIC02OTEsNyArNjkyLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobGxvZ19jYXRfcmV2ZXJzZV9wcm9jZXNzKTsKIAotaW50IGxsb2dfY2F0X3NldF9maXJzdF9pZHgoc3RydWN0IGxsb2dfaGFuZGxlICpjYXRoYW5kbGUsIGludCBpbmRleCkKK3N0YXRpYyBpbnQgbGxvZ19jYXRfc2V0X2ZpcnN0X2lkeChzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdGhhbmRsZSwgaW50IGluZGV4KQogewogCXN0cnVjdCBsbG9nX2xvZ19oZHIgKmxsaCA9IGNhdGhhbmRsZS0+bGdoX2hkcjsKIAlpbnQgaSwgYml0bWFwX3NpemUsIGlkeDsKQEAgLTc1MCw3ICs3NTEsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGNhdF9jYW5jZWxfY2IoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdGhhbmRsZSwKK3N0YXRpYyBpbnQgY2F0X2NhbmNlbF9jYihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0aGFuZGxlLAogCQkgIHN0cnVjdCBsbG9nX3JlY19oZHIgKnJlYywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMJKmxpciA9IChzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMgKilyZWM7CkBAIC03OTQsNyArNzk1LDYgQEAKIAogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0woY2F0X2NhbmNlbF9jYik7CiAKIC8qIGhlbHBlciB0byBpbml0aWFsaXplIGNhdGFsb2cgbGxvZyBhbmQgcHJvY2VzcyBpdCB0byBjYW5jZWwgKi8KIGludCBsbG9nX2NhdF9pbml0X2FuZF9wcm9jZXNzKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCmluZGV4IGRkYWI5NGQuLmMxNzFjNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAKICNpZiBkZWZpbmVkIChDT05GSUdfUFJPQ19GUykKIAotc3RhdGljIGludCBscHJvY2ZzX25vX3BlcmNwdV9zdGF0cyA9IDA7CitzdGF0aWMgaW50IGxwcm9jZnNfbm9fcGVyY3B1X3N0YXRzOwogbW9kdWxlX3BhcmFtKGxwcm9jZnNfbm9fcGVyY3B1X3N0YXRzLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhscHJvY2ZzX25vX3BlcmNwdV9zdGF0cywgIkRvIG5vdCBhbGxvYyBwZXJjcHUgZGF0YSBmb3IgbHByb2NmcyBzdGF0cyIpOwogCkBAIC0zNzcsNyArMzc3LDggQEAKIC8qIEdlbmVyaWMgY2FsbGJhY2tzICovCiBpbnQgbHByb2Nmc19yZF91aW50KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsICoodW5zaWduZWQgaW50ICopZGF0YSk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsICoodW5zaWduZWQgaW50ICopZGF0YSk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGxwcm9jZnNfcmRfdWludCk7CiAKQEAgLTQwMyw3ICs0MDQsOCBAQAogCiBpbnQgbHByb2Nmc19yZF91NjQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCAqKF9fdTY0ICopZGF0YSk7CisJc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgKihfX3U2NCAqKWRhdGEpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX3U2NCk7CiAKQEAgLTQxMSw3ICs0MTMsOCBAQAogewogCWF0b21pY190ICphdG9tID0gZGF0YTsKIAlMQVNTRVJUKGF0b20gIT0gTlVMTCk7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLCBhdG9taWNfcmVhZChhdG9tKSk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIGF0b21pY19yZWFkKGF0b20pKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9hdG9taWMpOwogCkBAIC00MzksNyArNDQyLDggQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZGF0YTsKIAogCUxBU1NFUlQob2JkICE9IE5VTEwpOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkLT5vYmRfdXVpZC51dWlkKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkLT5vYmRfdXVpZC51dWlkKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF91dWlkKTsKIApAQCAtNDQ4LDcgKzQ1Miw4IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IGRhdGE7CiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXNcbiIsIGRldi0+b2JkX25hbWUpOworCXNlcV9wcmludGYobSwgIiVzXG4iLCBkZXYtPm9iZF9uYW1lKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9uYW1lKTsKIApAQCAtNDYwLDcgKzQ2NSw4IEBACiAJCQkgICAgY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQkgICAgT0JEX1NUQVRGU19OT0RFTEFZKTsKIAlpZiAoIXJjKQotCQlyYyA9IHNlcV9wcmludGYobSwgIiV1XG4iLCBvc2ZzLm9zX2JzaXplKTsKKwkJc2VxX3ByaW50ZihtLCAiJXVcbiIsIG9zZnMub3NfYnNpemUpOworCiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX2Jsa3NpemUpOwpAQCAtNDc5LDggKzQ4NSw5IEBACiAJCXdoaWxlIChibGtfc2l6ZSA+Pj0gMSkKIAkJCXJlc3VsdCA8PD0gMTsKIAotCQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CiAJfQorCiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX2tieXRlc3RvdGFsKTsKQEAgLTQ5OSw4ICs1MDYsOSBAQAogCQl3aGlsZSAoYmxrX3NpemUgPj49IDEpCiAJCQlyZXN1bHQgPDw9IDE7CiAKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOwogCX0KKwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9rYnl0ZXNmcmVlKTsKQEAgLTUxOSw4ICs1MjcsOSBAQAogCQl3aGlsZSAoYmxrX3NpemUgPj49IDEpCiAJCQlyZXN1bHQgPDw9IDE7CiAKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOwogCX0KKwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9rYnl0ZXNhdmFpbCk7CkBAIC01MzMsNyArNTQyLDcgQEAKIAkJCSAgICBjZnNfdGltZV9zaGlmdF82NCgtT0JEX1NUQVRGU19DQUNIRV9TRUNPTkRTKSwKIAkJCSAgICBPQkRfU1RBVEZTX05PREVMQVkpOwogCWlmICghcmMpCi0JCXJjID0gc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgb3Nmcy5vc19maWxlcyk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIG9zZnMub3NfZmlsZXMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNTQ3LDcgKzU1Niw4IEBACiAJCQkgICAgY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQkgICAgT0JEX1NUQVRGU19OT0RFTEFZKTsKIAlpZiAoIXJjKQotCQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIG9zZnMub3NfZmZyZWUpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBvc2ZzLm9zX2ZmcmVlKTsKKwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9maWxlc2ZyZWUpOwpAQCAtNTU3LDE3ICs1NjcsMTggQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZGF0YTsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wOwogCWNoYXIgKmltcF9zdGF0ZV9uYW1lID0gTlVMTDsKLQlpbnQgcmMgPSAwOwogCiAJTEFTU0VSVChvYmQgIT0gTlVMTCk7CiAJTFBST0NGU19DTElNUF9DSEVDSyhvYmQpOwogCWltcCA9IG9iZC0+dS5jbGkuY2xfaW1wb3J0OwogCWltcF9zdGF0ZV9uYW1lID0gcHRscnBjX2ltcG9ydF9zdGF0ZV9uYW1lKGltcC0+aW1wX3N0YXRlKTsKLQlyYyA9IHNlcV9wcmludGYobSwgIiVzXHQlcyVzXG4iLCBvYmQyY2xpX3RndChvYmQpLCBpbXBfc3RhdGVfbmFtZSwKLQkJCWltcC0+aW1wX2RlYWN0aXZlID8gIlx0REVBQ1RJVkFURUQiIDogIiIpOworCXNlcV9wcmludGYobSwgIiVzXHQlcyVzXG4iLAorCQkgICBvYmQyY2xpX3RndChvYmQpLCBpbXBfc3RhdGVfbmFtZSwKKwkJICAgaW1wLT5pbXBfZGVhY3RpdmUgPyAiXHRERUFDVElWQVRFRCIgOiAiIik7CiAKIAlMUFJPQ0ZTX0NMSU1QX0VYSVQob2JkKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9zZXJ2ZXJfdXVpZCk7CiAKQEAgLTU3NSwxOSArNTg2LDE5IEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGRhdGE7CiAJc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpjb25uOwotCWludCByYyA9IDA7CiAKIAlMQVNTRVJUKG9iZCAhPSBOVUxMKTsKIAogCUxQUk9DRlNfQ0xJTVBfQ0hFQ0sob2JkKTsKIAljb25uID0gb2JkLT51LmNsaS5jbF9pbXBvcnQtPmltcF9jb25uZWN0aW9uOwogCWlmIChjb25uICYmIG9iZC0+dS5jbGkuY2xfaW1wb3J0KQotCQlyYyA9IHNlcV9wcmludGYobSwgIiVzXG4iLCBjb25uLT5jX3JlbW90ZV91dWlkLnV1aWQpOworCQlzZXFfcHJpbnRmKG0sICIlc1xuIiwgY29ubi0+Y19yZW1vdGVfdXVpZC51dWlkKTsKIAllbHNlCi0JCXJjID0gc2VxX3ByaW50ZihtLCAiJXNcbiIsICI8bm9uZT4iKTsKKwkJc2VxX3B1dHMobSwgIjxub25lPlxuIik7CiAKIAlMUFJPQ0ZTX0NMSU1QX0VYSVQob2JkKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9jb25uX3V1aWQpOwogCkBAIC05MjQsNyArOTM1LDggQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZGF0YTsKIAogCUxBU1NFUlQob2JkICE9IE5VTEwpOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgb2JkLT5vYmRfbnVtX2V4cG9ydHMpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBvYmQtPm9iZF9udW1fZXhwb3J0cyk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGxwcm9jZnNfcmRfbnVtX2V4cG9ydHMpOwogCkBAIC05MzMsNyArOTQ1LDggQEAKIAlzdHJ1Y3Qgb2JkX3R5cGUgKmNsYXNzID0gKHN0cnVjdCBvYmRfdHlwZSAqKSBkYXRhOwogCiAJTEFTU0VSVChjbGFzcyAhPSBOVUxMKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsIGNsYXNzLT50eXBfcmVmY250KTsKKwlzZXFfcHJpbnRmKG0sICIlZFxuIiwgY2xhc3MtPnR5cF9yZWZjbnQpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX251bXJlZnMpOwogCkBAIC0xMjAwLDQxICsxMjEzLDMzIEBACiAJc3RydWN0IGxwcm9jZnNfY291bnRlcl9oZWFkZXIgICAqaGRyOwogCXN0cnVjdCBscHJvY2ZzX2NvdW50ZXIgICAgICAgICAgIGN0cjsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggICAgPSAqKGxvZmZfdCAqKXY7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgICAgID0gMDsKIAogCWlmIChpZHggPT0gMCkgewogCQlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJCWRvX2dldHRpbWVvZmRheSgmbm93KTsKLQkJcmMgPSBzZXFfcHJpbnRmKHAsICIlLTI1cyAlbHUuJWx1IHNlY3MudXNlY3NcbiIsCi0JCQkJInNuYXBzaG90X3RpbWUiLCBub3cudHZfc2VjLCAodW5zaWduZWQgbG9uZylub3cudHZfdXNlYyk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7CisJCXNlcV9wcmludGYocCwgIiUtMjVzICVsdS4lbHUgc2Vjcy51c2Vjc1xuIiwKKwkJCSAgICJzbmFwc2hvdF90aW1lIiwKKwkJCSAgIG5vdy50dl9zZWMsICh1bnNpZ25lZCBsb25nKW5vdy50dl91c2VjKTsKIAl9CisKIAloZHIgPSAmc3RhdHMtPmxzX2NudF9oZWFkZXJbaWR4XTsKIAlscHJvY2ZzX3N0YXRzX2NvbGxlY3Qoc3RhdHMsIGlkeCwgJmN0cik7CiAKLQlpZiAoY3RyLmxjX2NvdW50ID09IDApCi0JCWdvdG8gb3V0OworCWlmIChjdHIubGNfY291bnQgIT0gMCkgeworCQlzZXFfcHJpbnRmKHAsICIlLTI1cyAlbGxkIHNhbXBsZXMgWyVzXSIsCisJCQkgICBoZHItPmxjX25hbWUsIGN0ci5sY19jb3VudCwgaGRyLT5sY191bml0cyk7CiAKLQlyYyA9IHNlcV9wcmludGYocCwgIiUtMjVzICVsbGQgc2FtcGxlcyBbJXNdIiwgaGRyLT5sY19uYW1lLAotCQkJY3RyLmxjX2NvdW50LCBoZHItPmxjX3VuaXRzKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKChoZHItPmxjX2NvbmZpZyAmIExQUk9DRlNfQ05UUl9BVkdNSU5NQVgpICYmIChjdHIubGNfY291bnQgPiAwKSkgewotCQlyYyA9IHNlcV9wcmludGYocCwgIiAlbGxkICVsbGQgJWxsZCIsCi0JCQkJY3RyLmxjX21pbiwgY3RyLmxjX21heCwgY3RyLmxjX3N1bSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQkJaWYgKGhkci0+bGNfY29uZmlnICYgTFBST0NGU19DTlRSX1NURERFVikKLQkJCXJjID0gc2VxX3ByaW50ZihwLCAiICVsbGQiLCBjdHIubGNfc3Vtc3F1YXJlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OworCQlpZiAoKGhkci0+bGNfY29uZmlnICYgTFBST0NGU19DTlRSX0FWR01JTk1BWCkgJiYKKwkJICAgIChjdHIubGNfY291bnQgPiAwKSkgeworCQkJc2VxX3ByaW50ZihwLCAiICVsbGQgJWxsZCAlbGxkIiwKKwkJCQkgICBjdHIubGNfbWluLCBjdHIubGNfbWF4LCBjdHIubGNfc3VtKTsKKwkJCWlmIChoZHItPmxjX2NvbmZpZyAmIExQUk9DRlNfQ05UUl9TVERERVYpCisJCQkJc2VxX3ByaW50ZihwLCAiICVsbGQiLCBjdHIubGNfc3Vtc3F1YXJlKTsKKwkJfQorCQlzZXFfcHV0YyhwLCAnXG4nKTsKIAl9Ci0JcmMgPSBzZXFfcHJpbnRmKHAsICJcbiIpOwotb3V0OgotCXJldHVybiAocmMgPCAwKSA/IHJjIDogMDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxwcm9jZnNfc3RhdHNfc2VxX3NvcHMgPSB7CkBAIC0xNjA2LDggKzE2MTEsOSBAQAogCiBpbnQgbHByb2Nmc19uaWRfc3RhdHNfY2xlYXJfcmVhZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVzXG4iLAotCQkJICAiV3JpdGUgaW50byB0aGlzIGZpbGUgdG8gY2xlYXIgYWxsIG5pZCBzdGF0cyBhbmQgc3RhbGUgbmlkIGVudHJpZXMiKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwKKwkJICAgIldyaXRlIGludG8gdGhpcyBmaWxlIHRvIGNsZWFyIGFsbCBuaWQgc3RhdHMgYW5kIHN0YWxlIG5pZCBlbnRyaWVzIik7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGxwcm9jZnNfbmlkX3N0YXRzX2NsZWFyX3JlYWQpOwogCkBAIC0yMDQxLDEyICsyMDQ3LDEyIEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IGRhdGE7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCByYzsKIAogCWNsaWVudF9vYmRfbGlzdF9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gc2VxX3ByaW50ZihtLCAiJWRcbiIsIGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCBjbGktPmNsX21heF9wYWdlc19wZXJfcnBjKTsKIAljbGllbnRfb2JkX2xpc3RfdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX29iZF9yZF9tYXhfcGFnZXNfcGVyX3JwYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKaW5kZXggODNiZjE2OGMuLjIwYzA3NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCkBAIC0xMzA4LDcgKzEzMDgsNyBAQAogICogbHVfY29udGV4dF9yZWZpbGwoKS4gTm8gbG9ja2luZyBpcyBwcm92aWRlZCwgYXMgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duCiAgKiBhcmUgc3VwcG9zZWQgdG8gYmUgZXh0ZXJuYWxseSBzZXJpYWxpemVkLgogICovCi1zdGF0aWMgdW5zaWduZWQga2V5X3NldF92ZXJzaW9uID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBrZXlfc2V0X3ZlcnNpb247CiAKIC8qKgogICogUmVnaXN0ZXIgbmV3IGtleS4KQEAgLTE3NjksOCArMTc2OSw2IEBACiBpbnQgbHVfZW52X3JlZmlsbF9ieV90YWdzKHN0cnVjdCBsdV9lbnYgKmVudiwgX191MzIgY3RhZ3MsCiAJCQkgIF9fdTMyIHN0YWdzKQogewotCWludCAgICByZXN1bHQ7Ci0KIAlpZiAoKGVudi0+bGVfY3R4LmxjX3RhZ3MgJiBjdGFncykgIT0gY3RhZ3MpIHsKIAkJZW52LT5sZV9jdHgubGNfdmVyc2lvbiA9IDA7CiAJCWVudi0+bGVfY3R4LmxjX3RhZ3MgfD0gY3RhZ3M7CkBAIC0xNzgxLDkgKzE3NzksNyBAQAogCQllbnYtPmxlX3Nlcy0+bGNfdGFncyB8PSBzdGFnczsKIAl9CiAKLQlyZXN1bHQgPSBsdV9lbnZfcmVmaWxsKGVudik7Ci0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBsdV9lbnZfcmVmaWxsKGVudik7CiB9CiBFWFBPUlRfU1lNQk9MKGx1X2Vudl9yZWZpbGxfYnlfdGFncyk7CiAKQEAgLTIwMTQsMTggKzIwMTAsMTkgQEAKIAltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKIAlsdV9zaXRlX3N0YXRzX2dldChzLT5sc19vYmpfaGFzaCwgJnN0YXRzLCAxKTsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZC8lZCAlZC8lZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKLQkJCXN0YXRzLmxzc19idXN5LAotCQkJc3RhdHMubHNzX3RvdGFsLAotCQkJc3RhdHMubHNzX3BvcHVsYXRlZCwKLQkJCUNGU19IQVNIX05ITElTVChzLT5sc19vYmpfaGFzaCksCi0JCQlzdGF0cy5sc3NfbWF4X3NlYXJjaCwKLQkJCWxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0NSRUFURUQpLAotCQkJbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfQ0FDSEVfSElUKSwKLQkJCWxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0NBQ0hFX01JU1MpLAotCQkJbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfQ0FDSEVfUkFDRSksCi0JCQlsc19zdGF0c19yZWFkKHMtPmxzX3N0YXRzLCBMVV9TU19DQUNIRV9ERUFUSF9SQUNFKSwKLQkJCWxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0xSVV9QVVJHRUQpKTsKKwlzZXFfcHJpbnRmKG0sICIlZC8lZCAlZC8lZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJICAgc3RhdHMubHNzX2J1c3ksCisJCSAgIHN0YXRzLmxzc190b3RhbCwKKwkJICAgc3RhdHMubHNzX3BvcHVsYXRlZCwKKwkJICAgQ0ZTX0hBU0hfTkhMSVNUKHMtPmxzX29ial9oYXNoKSwKKwkJICAgc3RhdHMubHNzX21heF9zZWFyY2gsCisJCSAgIGxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0NSRUFURUQpLAorCQkgICBsc19zdGF0c19yZWFkKHMtPmxzX3N0YXRzLCBMVV9TU19DQUNIRV9ISVQpLAorCQkgICBsc19zdGF0c19yZWFkKHMtPmxzX3N0YXRzLCBMVV9TU19DQUNIRV9NSVNTKSwKKwkJICAgbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfQ0FDSEVfUkFDRSksCisJCSAgIGxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0NBQ0hFX0RFQVRIX1JBQ0UpLAorCQkgICBsc19zdGF0c19yZWFkKHMtPmxzX3N0YXRzLCBMVV9TU19MUlVfUFVSR0VEKSk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGx1X3NpdGVfc3RhdHNfcHJpbnQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCmluZGV4IDNjMGM5MTAuLjM0MzdiMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCkBAIC02NDUsMTAgKzY0NSwxMCBAQAogfQogCiAvKioqIFNFUlZFUiBOQU1FICoqKgotICogPEZTTkFNRT48U0VQRVJBVE9SPjxUWVBFPjxJTkRFWD4KKyAqIDxGU05BTUU+PFNFUEFSQVRPUj48VFlQRT48SU5ERVg+CiAgKiBGU05BTUUgaXMgYmV0d2VlbiAxIGFuZCA4IGNoYXJhY3RlcnMgKGluY2x1c2l2ZSkuCiAgKglFeGNsdWRlZCBjaGFyYWN0ZXJzIGFyZSAnLycgYW5kICc6JwotICogU0VQRVJBVE9SIGlzIGVpdGhlciAnOicgb3IgJy0nCisgKiBTRVBBUkFUT1IgaXMgZWl0aGVyICc6JyBvciAnLScKICAqIFRZUEU6ICJPU1QiLCAiTURUIiwgZXRjLgogICogSU5ERVg6IEhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5kZXgKICAqLwpAQCAtMTI4Niw3ICsxMjg2LDcgQEAKIAlyZXR1cm4gbW91bnRfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsICZsbWQyLCBsdXN0cmVfZmlsbF9zdXBlcik7CiB9CiAKLXZvaWQgbHVzdHJlX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyB2b2lkIGx1c3RyZV9raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGx1c3RyZV9zYl9pbmZvICpsc2kgPSBzMmxzaShzYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYwppbmRleCA1ZjZkOTQ0Li5kNTQyZTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCkBAIC0xNDYsNiArMTQ2LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGVjaG9fdGhyZWFkX2luZm8gKmVjaG9fZW52X2luZm8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52KQogewogCXN0cnVjdCBlY2hvX3RocmVhZF9pbmZvICppbmZvOworCiAJaW5mbyA9IGx1X2NvbnRleHRfa2V5X2dldCgmZW52LT5sZV9jdHgsICZlY2hvX3RocmVhZF9rZXkpOwogCUxBU1NFUlQoaW5mbyAhPSBOVUxMKTsKIAlyZXR1cm4gaW5mbzsKQEAgLTE5NSwyMiArMTk2LDIyIEBACiAJewogCQkuY2tkX2NhY2hlID0gJmVjaG9fbG9ja19rbWVtLAogCQkuY2tkX25hbWUgID0gImVjaG9fbG9ja19rbWVtIiwKLQkJLmNrZF9zaXplICA9IHNpemVvZiAoc3RydWN0IGVjaG9fbG9jaykKKwkJLmNrZF9zaXplICA9IHNpemVvZihzdHJ1Y3QgZWNob19sb2NrKQogCX0sCiAJewogCQkuY2tkX2NhY2hlID0gJmVjaG9fb2JqZWN0X2ttZW0sCiAJCS5ja2RfbmFtZSAgPSAiZWNob19vYmplY3Rfa21lbSIsCi0JCS5ja2Rfc2l6ZSAgPSBzaXplb2YgKHN0cnVjdCBlY2hvX29iamVjdCkKKwkJLmNrZF9zaXplICA9IHNpemVvZihzdHJ1Y3QgZWNob19vYmplY3QpCiAJfSwKIAl7CiAJCS5ja2RfY2FjaGUgPSAmZWNob190aHJlYWRfa21lbSwKIAkJLmNrZF9uYW1lICA9ICJlY2hvX3RocmVhZF9rbWVtIiwKLQkJLmNrZF9zaXplICA9IHNpemVvZiAoc3RydWN0IGVjaG9fdGhyZWFkX2luZm8pCisJCS5ja2Rfc2l6ZSAgPSBzaXplb2Yoc3RydWN0IGVjaG9fdGhyZWFkX2luZm8pCiAJfSwKIAl7CiAJCS5ja2RfY2FjaGUgPSAmZWNob19zZXNzaW9uX2ttZW0sCiAJCS5ja2RfbmFtZSAgPSAiZWNob19zZXNzaW9uX2ttZW0iLAotCQkuY2tkX3NpemUgID0gc2l6ZW9mIChzdHJ1Y3QgZWNob19zZXNzaW9uX2luZm8pCisJCS5ja2Rfc2l6ZSAgPSBzaXplb2Yoc3RydWN0IGVjaG9fc2Vzc2lvbl9pbmZvKQogCX0sCiAJewogCQkuY2tkX2NhY2hlID0gTlVMTApAQCAtNjM3LDYgKzYzOCw3IEBACiAJCQkgc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXksIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGVjaG9fdGhyZWFkX2luZm8gKmluZm8gPSBkYXRhOworCiAJT0JEX1NMQUJfRlJFRV9QVFIoaW5mbywgZWNob190aHJlYWRfa21lbSk7CiB9CiAKQEAgLTY2Nyw2ICs2NjksNyBAQAogCQkJCSBzdHJ1Y3QgbHVfY29udGV4dF9rZXkgKmtleSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZWNob19zZXNzaW9uX2luZm8gKnNlc3Npb24gPSBkYXRhOworCiAJT0JEX1NMQUJfRlJFRV9QVFIoc2Vzc2lvbiwgZWNob19zZXNzaW9uX2ttZW0pOwogfQogCkBAIC03ODMsNiArNzg2LDcgQEAKIAlzd2l0Y2ggKGNsZWFudXApIHsKIAljYXNlIDQ6IHsKIAkJaW50IHJjMjsKKwogCQlyYzIgPSBlY2hvX2NsaWVudF9jbGVhbnVwKG9iZCk7CiAJCWlmIChyYzIpCiAJCQlDRVJST1IoIkNsZWFudXAgb2JkIGRldmljZSAlcyBlcnJvciglZClcbiIsCkBAIC05NTgsMTEgKzk2MiwxMyBAQAogCWlmIChkLT5lZF9uZXh0KSB7CiAJCWlmICghZC0+ZWRfbmV4dF9pc2xvdikgewogCQkJc3RydWN0IGxvdl9vaW5mbyAqb2luZm8gPSBsc20tPmxzbV9vaW5mb1swXTsKKwogCQkJTEFTU0VSVChvaW5mbyAhPSBOVUxMKTsKIAkJCW9pbmZvLT5sb2lfb2kgPSBsc20tPmxzbV9vaTsKIAkJCWNvbmYtPmVvY19jbC51LmNvY19vaW5mbyA9IG9pbmZvOwogCQl9IGVsc2UgewogCQkJc3RydWN0IGx1c3RyZV9tZCAqbWQ7CisKIAkJCW1kID0gJmluZm8tPmV0aV9tZDsKIAkJCW1lbXNldChtZCwgMCwgc2l6ZW9mKCptZCkpOwogCQkJbWQtPmxzbSA9IGxzbTsKQEAgLTEwMTEsNiArMTAxNyw3IEBACiAJLyogYW4gZXh0ZXJuYWwgZnVuY3Rpb24gdG8ga2lsbCBhbiBvYmplY3Q/ICovCiAJaWYgKGVjby0+ZW9fZGVsZXRlZCkgewogCQlzdHJ1Y3QgbHVfb2JqZWN0X2hlYWRlciAqbG9oID0gb2JqLT5jb19sdS5sb19oZWFkZXI7CisKIAkJTEFTU0VSVCgmZWNvLT5lb19oZHIgPT0gbHVoMmNvaChsb2gpKTsKIAkJc2V0X2JpdChMVV9PQkpFQ1RfSEVBUkRfQkFOU0hFRSwgJmxvaC0+bG9oX2ZsYWdzKTsKIAl9CkBAIC0xMDIyLDcgKzEwMjksNyBAQAogCiBzdGF0aWMgaW50IGNsX2VjaG9fZW5xdWV1ZTAoc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgZWNob19vYmplY3QgKmVjbywKIAkJCSAgICB1NjQgc3RhcnQsIHU2NCBlbmQsIGludCBtb2RlLAotCQkJICAgIF9fdTY0ICpjb29raWUgLCBfX3UzMiBlbnFmbGFncykKKwkJCSAgICBfX3U2NCAqY29va2llLCBfX3UzMiBlbnFmbGFncykKIHsKIAlzdHJ1Y3QgY2xfaW8gKmlvOwogCXN0cnVjdCBjbF9sb2NrICpsY2s7CkBAIC0xMTA2LDggKzExMTMsOCBAQAogCiAJTEFTU0VSVChlYyAhPSBOVUxMKTsKIAlzcGluX2xvY2soJmVjLT5lY19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoIChlbCwgJmVjLT5lY19sb2NrcykgewotCQllY2wgPSBsaXN0X2VudHJ5IChlbCwgc3RydWN0IGVjaG9fbG9jaywgZWxfY2hhaW4pOworCWxpc3RfZm9yX2VhY2goZWwsICZlYy0+ZWNfbG9ja3MpIHsKKwkJZWNsID0gbGlzdF9lbnRyeShlbCwgc3RydWN0IGVjaG9fbG9jaywgZWxfY2hhaW4pOwogCQlDREVCVUcoRF9JTkZPLCAiZWNsOiAlcCwgY29va2llOiAlI2xseFxuIiwgZWNsLCBlY2wtPmVsX2Nvb2tpZSk7CiAJCWZvdW5kID0gKGVjbC0+ZWxfY29va2llID09IGNvb2tpZSk7CiAJCWlmIChmb3VuZCkgewpAQCAtMTE1Miw2ICsxMTU5LDcgQEAKIAogCWNsX3BhZ2VfbGlzdF9mb3JfZWFjaF9zYWZlKGNscCwgdGVtcCwgJnF1ZXVlLT5jMl9xaW4pIHsKIAkJaW50IHJjOworCiAJCXJjID0gY2xfcGFnZV9jYWNoZV9hZGQoZW52LCBpbywgY2xwLCBDUlRfV1JJVEUpOwogCQlpZiAocmMgPT0gMCkKIAkJCWNvbnRpbnVlOwpAQCAtMTI1NywyMCArMTI2NSwyMCBAQAogc3RhdGljIHU2NCBsYXN0X29iamVjdF9pZDsKIAogc3RhdGljIGludAotZWNob19jb3B5b3V0X2xzbSAoc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgdm9pZCAqX3Vsc20sIGludCB1bHNtX25vYikKK2VjaG9fY29weW91dF9sc20oc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgdm9pZCAqX3Vsc20sIGludCB1bHNtX25vYikKIHsKIAlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqdWxzbSA9IF91bHNtOwogCWludCBub2IsIGk7CiAKLQlub2IgPSBvZmZzZXRvZiAoc3RydWN0IGxvdl9zdHJpcGVfbWQsIGxzbV9vaW5mb1tsc20tPmxzbV9zdHJpcGVfY291bnRdKTsKKwlub2IgPSBvZmZzZXRvZihzdHJ1Y3QgbG92X3N0cmlwZV9tZCwgbHNtX29pbmZvW2xzbS0+bHNtX3N0cmlwZV9jb3VudF0pOwogCWlmIChub2IgPiB1bHNtX25vYikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY29weV90b191c2VyICh1bHNtLCBsc20sIHNpemVvZigqdWxzbSkpKQorCWlmIChjb3B5X3RvX3VzZXIodWxzbSwgbHNtLCBzaXplb2YoKnVsc20pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJaWYgKGNvcHlfdG9fdXNlciAodWxzbS0+bHNtX29pbmZvW2ldLCBsc20tPmxzbV9vaW5mb1tpXSwKKwkJaWYgKGNvcHlfdG9fdXNlcih1bHNtLT5sc21fb2luZm9baV0sIGxzbS0+bHNtX29pbmZvW2ldLAogCQkJCSAgICAgIHNpemVvZihsc20tPmxzbV9vaW5mb1swXSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtMTI3OCwxNiArMTI4NiwxNiBAQAogfQogCiBzdGF0aWMgaW50Ci1lY2hvX2NvcHlpbl9sc20gKHN0cnVjdCBlY2hvX2RldmljZSAqZWQsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCitlY2hvX2NvcHlpbl9sc20oc3RydWN0IGVjaG9fZGV2aWNlICplZCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKIAkJIHZvaWQgKnVsc20sIGludCB1bHNtX25vYikKIHsKIAlzdHJ1Y3QgZWNob19jbGllbnRfb2JkICplYyA9IGVkLT5lZF9lYzsKIAlpbnQJCSAgICAgaTsKIAotCWlmICh1bHNtX25vYiA8IHNpemVvZiAoKmxzbSkpCisJaWYgKHVsc21fbm9iIDwgc2l6ZW9mKCpsc20pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjb3B5X2Zyb21fdXNlciAobHNtLCB1bHNtLCBzaXplb2YgKCpsc20pKSkKKwlpZiAoY29weV9mcm9tX3VzZXIobHNtLCB1bHNtLCBzaXplb2YoKmxzbSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChsc20tPmxzbV9zdHJpcGVfY291bnQgPiBlYy0+ZWNfbnN0cmlwZXMgfHwKQEAgLTEzMjAsNyArMTMyOCw3IEBACiAJaWYgKChvYS0+b192YWxpZCAmIE9CRF9NRF9GTElEKSA9PSAwICYmIC8qIG5vIG9iaiBpZCAqLwogCSAgICAob25fdGFyZ2V0IHx8CQkgICAgICAgLyogc2V0X3N0cmlwZSAqLwogCSAgICAgZWMtPmVjX25zdHJpcGVzICE9IDApKSB7CSAgIC8qIExPViAqLwotCQlDRVJST1IgKCJObyB2YWxpZCBvaWRcbiIpOworCQlDRVJST1IoIk5vIHZhbGlkIG9pZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTMzMyw3ICsxMzQxLDcgQEAKIAlpZiAodWxzbSAhPSBOVUxMKSB7CiAJCWludCBpLCBpZHg7CiAKLQkJcmMgPSBlY2hvX2NvcHlpbl9sc20gKGVkLCBsc20sIHVsc20sIHVsc21fbm9iKTsKKwkJcmMgPSBlY2hvX2NvcHlpbl9sc20oZWQsIGxzbSwgdWxzbSwgdWxzbV9ub2IpOwogCQlpZiAocmMgIT0gMCkKIAkJCWdvdG8gZmFpbGVkOwogCkBAIC0xNDA5LDcgKzE0MTcsNyBAQAogCiAJaWYgKChvYS0+b192YWxpZCAmIE9CRF9NRF9GTElEKSA9PSAwIHx8IG9zdGlkX2lkKCZvYS0+b19vaSkgPT0gMCkgewogCQkvKiBkaXNhbGxvdyB1c2Ugb2Ygb2JqZWN0IGlkIDAgKi8KLQkJQ0VSUk9SICgiTm8gdmFsaWQgb2lkXG4iKTsKKwkJQ0VSUk9SKCJObyB2YWxpZCBvaWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE0NTksNyArMTQ2Nyw3IEBACiAJd2lkdGggPSBzdHJpcGVfc2l6ZSAqIHN0cmlwZV9jb3VudDsKIAogCS8qIHdvZmZzZXQgPSBvZmZzZXQgd2l0aGluIGEgd2lkdGg7IG9mZnNldCA9IHdob2xlIG51bWJlciBvZiB3aWR0aHMgKi8KLQl3b2Zmc2V0ID0gZG9fZGl2IChvZmZzZXQsIHdpZHRoKTsKKwl3b2Zmc2V0ID0gZG9fZGl2KG9mZnNldCwgd2lkdGgpOwogCiAJc3RyaXBlX2luZGV4ID0gd29mZnNldCAvIHN0cmlwZV9zaXplOwogCkBAIC0xNTE3LDEzICsxNTI1LDEzIEBACiAJZm9yIChyYyA9IGRlbHRhID0gMDsgZGVsdGEgPCBQQUdFX0NBQ0hFX1NJWkU7IGRlbHRhICs9IE9CRF9FQ0hPX0JMT0NLX1NJWkUpIHsKIAkJc3RyaXBlX29mZiA9IG9mZnNldCArIGRlbHRhOwogCQlzdHJpcGVfaWQgPSBpZDsKLQkJZWNob19nZXRfc3RyaXBlX29mZl9pZCAobHNtLCAmc3RyaXBlX29mZiwgJnN0cmlwZV9pZCk7CisJCWVjaG9fZ2V0X3N0cmlwZV9vZmZfaWQobHNtLCAmc3RyaXBlX29mZiwgJnN0cmlwZV9pZCk7CiAKIAkJcmMyID0gYmxvY2tfZGVidWdfY2hlY2soInRlc3RfYnJ3IiwKIAkJCQkJYWRkciArIGRlbHRhLCBPQkRfRUNIT19CTE9DS19TSVpFLAogCQkJCQlzdHJpcGVfb2ZmLCBzdHJpcGVfaWQpOwogCQlpZiAocmMyICE9IDApIHsKLQkJCUNFUlJPUiAoIkVycm9yIGluIGVjaG8gb2JqZWN0ICUjbGx4XG4iLCBpZCk7CisJCQlDRVJST1IoIkVycm9yIGluIGVjaG8gb2JqZWN0ICUjbGx4XG4iLCBpZCk7CiAJCQlyYyA9IHJjMjsKIAkJfQogCX0KQEAgLTE1ODMsNyArMTU5MSw3IEBACiAJICAgICBpIDwgbnBhZ2VzOwogCSAgICAgaSsrLCBwZ3ArKywgb2ZmICs9IFBBR0VfQ0FDSEVfU0laRSkgewogCi0JCUxBU1NFUlQgKHBncC0+cGcgPT0gTlVMTCk7ICAgICAgLyogZm9yIGNsZWFudXAgKi8KKwkJTEFTU0VSVChwZ3AtPnBnID09IE5VTEwpOyAgICAgIC8qIGZvciBjbGVhbnVwICovCiAKIAkJcmMgPSAtRU5PTUVNOwogCQlPQkRfUEFHRV9BTExPQyhwZ3AtPnBnLCBnZnBfbWFzayk7CkBAIC0xNjE1LDYgKzE2MjMsNyBAQAogCiAJCWlmICh2ZXJpZnkpIHsKIAkJCWludCB2cmM7CisKIAkJCXZyYyA9IGVjaG9fY2xpZW50X3BhZ2VfZGVidWdfY2hlY2sobHNtLCBwZ3AtPnBnLAogCQkJCQkJCSAgIG9zdGlkX2lkKCZvYS0+b19vaSksCiAJCQkJCQkJICAgcGdwLT5vZmYsIHBncC0+Y291bnQpOwpAQCAtMTgxMiw3ICsxODIxLDcgQEAKIAkgICAgKG5vYiAmICh+Q0ZTX1BBR0VfTUFTSykpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmMgPSBlY2hvX2dldF9vYmplY3QgKCZlY28sIGVkLCBvYSk7CisJcmMgPSBlY2hvX2dldF9vYmplY3QoJmVjbywgZWQsIG9hKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCkBAIC0xOTExLDYgKzE5MjAsNyBAQAogCQlyYyA9IGVjaG9fZ2V0X29iamVjdCgmZWNvLCBlZCwgb2EpOwogCQlpZiAocmMgPT0gMCkgewogCQkJc3RydWN0IG9iZF9pbmZvIG9pbmZvID0geyB7IHsgMCB9IH0gfTsKKwogCQkJb2luZm8ub2lfbWQgPSBlY28tPmVvX2xzbTsKIAkJCW9pbmZvLm9pX29hID0gb2E7CiAJCQlyYyA9IG9iZF9nZXRhdHRyKGVudiwgZWMtPmVjX2V4cCwgJm9pbmZvKTsKQEAgLTE5MjcsNiArMTkzNyw3IEBACiAJCXJjID0gZWNob19nZXRfb2JqZWN0KCZlY28sIGVkLCBvYSk7CiAJCWlmIChyYyA9PSAwKSB7CiAJCQlzdHJ1Y3Qgb2JkX2luZm8gb2luZm8gPSB7IHsgeyAwIH0gfSB9OworCiAJCQlvaW5mby5vaV9vYSA9IG9hOwogCQkJb2luZm8ub2lfbWQgPSBlY28tPmVvX2xzbTsKIApAQCAtMTk5Miw3ICsyMDAzLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlkZWZhdWx0OgotCQlDRVJST1IgKCJlY2hvX2lvY3RsKCk6IHVucmVjb2duaXNlZCBpb2N0bCAlI3hcbiIsIGNtZCk7CisJCUNFUlJPUigiZWNob19pb2N0bCgpOiB1bnJlY29nbmlzZWQgaW9jdGwgJSN4XG4iLCBjbWQpOwogCQlyYyA9IC1FTk9UVFk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIwMzQsOCArMjA0NSw4IEBACiAJfQogCiAJc3Bpbl9sb2NrX2luaXQoJmVjLT5lY19sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCAoJmVjLT5lY19vYmplY3RzKTsKLQlJTklUX0xJU1RfSEVBRCAoJmVjLT5lY19sb2Nrcyk7CisJSU5JVF9MSVNUX0hFQUQoJmVjLT5lY19vYmplY3RzKTsKKwlJTklUX0xJU1RfSEVBRCgmZWMtPmVjX2xvY2tzKTsKIAllYy0+ZWNfdW5pcXVlID0gMDsKIAllYy0+ZWNfbnN0cmlwZXMgPSAwOwogCkBAIC0yMTU4LDcgKzIxNjksNiBAQAogc3RhdGljIGludCBfX2luaXQgb2JkZWNob19pbml0KHZvaWQpCiB7CiAJc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgbHZhcnM7Ci0JaW50IHJjOwogCiAJTENPTlNPTEVfSU5GTygiRWNobyBPQkQgZHJpdmVyOyBodHRwOi8vd3d3Lmx1c3RyZS5vcmcvXG4iKTsKIApAQCAtMjE2Nyw5ICsyMTc3LDcgQEAKIAlscHJvY2ZzX2VjaG9faW5pdF92YXJzKCZsdmFycyk7CiAKIAotCXJjID0gZWNob19jbGllbnRfaW5pdCgpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiBlY2hvX2NsaWVudF9pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIC8qX19leGl0Ki8gb2JkZWNob19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2xwcm9jX2VjaG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vbHByb2NfZWNoby5jCmluZGV4IDFkM2JmNmMuLjBiZWI5N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vbHByb2NfZWNoby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vbHByb2NfZWNoby5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAKLSNpZiBkZWZpbmVkIChDT05GSUdfUFJPQ19GUykKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQogTFBST0NfU0VRX0ZPUFNfUk9fVFlQRShlY2hvLCB1dWlkKTsKIHN0YXRpYyBzdHJ1Y3QgbHByb2Nmc192YXJzIGxwcm9jZnNfZWNob19vYmRfdmFyc1tdID0gewogCXsgInV1aWQiLAkgJmVjaG9fdXVpZF9mb3BzLAlOVUxMLCAwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2MvbHByb2Nfb3NjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2MvbHByb2Nfb3NjLmMKaW5kZXggMTc5NWQzYS4uMTVhNjYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL2xwcm9jX29zYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9scHJvY19vc2MuYwpAQCAtMzUsNyArMzUsNyBAQAogICovCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0NMQVNTCiAKLSNpbmNsdWRlIDxhc20vc3RhdGZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2tzdW0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKQEAgLTQ1LDEyICs0NSwxMiBAQAogc3RhdGljIGludCBvc2NfYWN0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKLQlpbnQgcmM7CiAKIAlMUFJPQ0ZTX0NMSU1QX0NIRUNLKGRldik7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sICIlZFxuIiwgIWRldi0+dS5jbGkuY2xfaW1wb3J0LT5pbXBfZGVhY3RpdmUpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCAhZGV2LT51LmNsaS5jbF9pbXBvcnQtPmltcF9kZWFjdGl2ZSk7CiAJTFBST0NGU19DTElNUF9FWElUKGRldik7Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19hY3RpdmVfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtODAsMTIgKzgwLDEyIEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCByYzsKIAogCWNsaWVudF9vYmRfbGlzdF9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0KTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQpOwogCWNsaWVudF9vYmRfbGlzdF91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19tYXhfcnBjc19pbl9mbGlnaHRfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMTY0LDE2ICsxNjQsMTUgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7CiAJaW50IHNoaWZ0ID0gMjAgLSBQQUdFX0NBQ0hFX1NISUZUOwotCWludCByYzsKIAotCXJjID0gc2VxX3ByaW50ZihtLAotCQkgICAgICAidXNlZF9tYjogJWRcbiIKLQkJICAgICAgImJ1c3lfY250OiAlZFxuIiwKLQkJICAgICAgKGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSArCi0JCQlhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpID4+IHNoaWZ0LAotCQkgICAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpOworCXNlcV9wcmludGYobSwKKwkJICAgInVzZWRfbWI6ICVkXG4iCisJCSAgICJidXN5X2NudDogJWRcbiIsCisJCSAgIChhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgKworCQkgICAgYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpKSA+PiBzaGlmdCwKKwkJICAgYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpKTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogLyogc2hyaW5rIHRoZSBudW1iZXIgb2YgY2FjaGluZyBwYWdlcyB0byBhIHNwZWNpZmljIG51bWJlciAqLwpAQCAtMjE1LDEyICsyMTQsMTIgQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7Ci0JaW50IHJjOwogCiAJY2xpZW50X29iZF9saXN0X2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sICIlbHVcbiIsIGNsaS0+Y2xfZGlydHkpOworCXNlcV9wcmludGYobSwgIiVsdVxuIiwgY2xpLT5jbF9kaXJ0eSk7CiAJY2xpZW50X29iZF9saXN0X3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKG9zY19jdXJfZGlydHlfYnl0ZXMpOwogCkBAIC0yMjgsMTIgKzIyNywxMiBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmZGV2LT51LmNsaTsKLQlpbnQgcmM7CiAKIAljbGllbnRfb2JkX2xpc3RfbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyYyA9IHNlcV9wcmludGYobSwgIiVsdVxuIiwgY2xpLT5jbF9hdmFpbF9ncmFudCk7CisJc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBjbGktPmNsX2F2YWlsX2dyYW50KTsKIAljbGllbnRfb2JkX2xpc3RfdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBvc2NfY3VyX2dyYW50X2J5dGVzX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTI3NCwxMiArMjczLDEyIEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCByYzsKIAogCWNsaWVudF9vYmRfbGlzdF9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBjbGktPmNsX2xvc3RfZ3JhbnQpOworCXNlcV9wcmludGYobSwgIiVsdVxuIiwgY2xpLT5jbF9sb3N0X2dyYW50KTsKIAljbGllbnRfb2JkX2xpc3RfdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKKworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob3NjX2N1cl9sb3N0X2dyYW50X2J5dGVzKTsKIApAQCAtMjg5LDggKzI4OCw4IEBACiAKIAlpZiAob2JkID09IE5VTEwpCiAJCXJldHVybiAwOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZFxuIiwKLQkJCW9iZC0+dS5jbGkuY2xfZ3JhbnRfc2hyaW5rX2ludGVydmFsKTsKKwlzZXFfcHJpbnRmKG0sICIlZFxuIiwgb2JkLT51LmNsaS5jbF9ncmFudF9zaHJpbmtfaW50ZXJ2YWwpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBvc2NfZ3JhbnRfc2hyaW5rX2ludGVydmFsX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTMyMyw4ICszMjIsOCBAQAogCWlmIChvYmQgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsCi0JCQlvYmQtPnUuY2xpLmNsX2NoZWNrc3VtID8gMSA6IDApOworCXNlcV9wcmludGYobSwgIiVkXG4iLCBvYmQtPnUuY2xpLmNsX2NoZWNrc3VtID8gMSA6IDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBvc2NfY2hlY2tzdW1fc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNDA1LDcgKzQwNCw4IEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IG0tPnByaXZhdGU7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGF0b21pY19yZWFkKCZvYmQtPnUuY2xpLmNsX3Jlc2VuZHMpKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgYXRvbWljX3JlYWQoJm9iZC0+dS5jbGkuY2xfcmVzZW5kcykpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBvc2NfcmVzZW5kX2NvdW50X3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTQzMyw3ICs0MzMsOCBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBvc2NfZGV2aWNlICpvZCAgPSBvYmQyb3NjX2RldihvYmQpOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBvZC0+b2RfY29udGVudGlvbl90aW1lKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgb2QtPm9kX2NvbnRlbnRpb25fdGltZSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19jb250ZW50aW9uX3NlY29uZHNfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNDUzLDcgKzQ1NCw4IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IG9zY19kZXZpY2UgKm9kICA9IG9iZDJvc2NfZGV2KG9iZCk7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIG9kLT5vZF9sb2NrbGVzc190cnVuY2F0ZSk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIG9kLT5vZF9sb2NrbGVzc190cnVuY2F0ZSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19sb2NrbGVzc190cnVuY2F0ZV9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC00NzEsOCArNDczLDkgQEAKIHN0YXRpYyBpbnQgb3NjX2Rlc3Ryb3lzX2luX2ZsaWdodF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IG0tPnByaXZhdGU7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLAotCQkJYXRvbWljX3JlYWQoJm9iZC0+dS5jbGkuY2xfZGVzdHJveV9pbl9mbGlnaHQpKTsKKworCXNlcV9wcmludGYobSwgIiV1XG4iLCBhdG9taWNfcmVhZCgmb2JkLT51LmNsaS5jbF9kZXN0cm95X2luX2ZsaWdodCkpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob3NjX2Rlc3Ryb3lzX2luX2ZsaWdodCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYwppbmRleCA3MDIyZWQ0Li5kNDRiM2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCkBAIC0yNjEzLDcgKzI2MTMsNyBAQAogCX0KIAlvc2Nfb2JqZWN0X3VubG9jayhvYmopOwogCi0Jb3NjX2lvX3VucGx1ZyhlbnYsIGNsaSwgb2JqLCBQRExfUE9MSUNZX1JPVU5EKTsKKwlvc2NfaW9fdW5wbHVnX2FzeW5jKGVudiwgY2xpLCBvYmopOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKaW5kZXggZmFkNGMxMy4uM2M3MzAwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYwpAQCAtNDE3LDcgKzQxNyw3IEBACiAKIAkJCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkgewogCQkJCWF0dHItPmNhdF9zaXplID0gYXR0ci0+Y2F0X2ttcyA9IHNpemU7Ci0JCQkJY2xfdmFsaWQgPSAoQ0FUX1NJWkUgfCBDQVRfS01TKTsKKwkJCQljbF92YWxpZCA9IENBVF9TSVpFIHwgQ0FUX0tNUzsKIAkJCX0KIAkJCWlmIChpYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKSB7CiAJCQkJYXR0ci0+Y2F0X210aW1lID0gbHZiLT5sdmJfbXRpbWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfbG9jay5jCmluZGV4IDQ0NTY1NTcuLjM1MGFkNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfbG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfbG9jay5jCkBAIC0xMDEwLDcgKzEwMTAsNyBAQAogCXN0cnVjdCBjbF9sb2NrX2Rlc2NyICAgICpkZXNjciAgID0gJmxvY2stPmNsbF9kZXNjcjsKIAlzdHJ1Y3QgY2xfb2JqZWN0X2hlYWRlciAqaGRyICAgICA9IGNsX29iamVjdF9oZWFkZXIoZGVzY3ItPmNsZF9vYmopOwogCXN0cnVjdCBjbF9sb2NrCSAgKnNjYW47Ci0Jc3RydWN0IGNsX2xvY2sJICAqY29uZmxpY3Q9IE5VTEw7CisJc3RydWN0IGNsX2xvY2sJICAqY29uZmxpY3QgPSBOVUxMOwogCWludCBsb2NrbGVzcwkJICAgICA9IG9zY19sb2NrX2lzX2xvY2tsZXNzKG9sY2spOwogCWludCByYwkJCSAgID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYwppbmRleCAwYWRmYTcwLi5kN2E5YjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYwpAQCAtMTE2NSw4ICsxMTY1LDggQEAKIHN0YXRpYyBpbmxpbmUgaW50IGNhbl9tZXJnZV9wYWdlcyhzdHJ1Y3QgYnJ3X3BhZ2UgKnAxLCBzdHJ1Y3QgYnJ3X3BhZ2UgKnAyKQogewogCWlmIChwMS0+ZmxhZyAhPSBwMi0+ZmxhZykgewotCQl1bnNpZ25lZCBtYXNrID0gfihPQkRfQlJXX0ZST01fR1JBTlR8IE9CRF9CUldfTk9DQUNIRXwKLQkJCQkgIE9CRF9CUldfU1lOQ3xPQkRfQlJXX0FTWU5DfE9CRF9CUldfTk9RVU9UQSk7CisJCXVuc2lnbmVkIG1hc2sgPSB+KE9CRF9CUldfRlJPTV9HUkFOVCB8IE9CRF9CUldfTk9DQUNIRSB8CisJCQkJICBPQkRfQlJXX1NZTkMgfCBPQkRfQlJXX0FTWU5DfE9CRF9CUldfTk9RVU9UQSk7CiAKIAkJLyogd2FybiBpZiB3ZSB0cnkgdG8gY29tYmluZSBmbGFncyB0aGF0IHdlIGRvbid0IGtub3cgdG8gYmUKIAkJICogc2FmZSB0byBjb21iaW5lICovCkBAIC0xODgwLDYgKzE4ODAsNyBAQAogCWludAkJCQlwYWdlX2NvdW50ID0gMDsKIAlpbnQJCQkJaTsKIAlpbnQJCQkJcmM7CisJc3RydWN0IG9zdF9ib2R5CQkJKmJvZHk7CiAJTElTVF9IRUFEKHJwY19saXN0KTsKIAogCUxBU1NFUlQoIWxpc3RfZW1wdHkoZXh0X2xpc3QpKTsKQEAgLTE5ODEsNiArMTk4Miw4IEBACiAJICogbGF0ZXIgc2V0YXR0ciBiZWZvcmUgZWFybGllciBCUlcgKGFzIGRldGVybWluZWQgYnkgdGhlIHJlcXVlc3QgeGlkKSwKIAkgKiB0aGUgT1NUIHdpbGwgbm90IHVzZSBCUlcgdGltZXN0YW1wcy4gIFNhZGx5LCB0aGVyZSBpcyBubyBvYnZpb3VzCiAJICogd2F5IHRvIGRvIHRoaXMgaW4gYSBzaW5nbGUgY2FsbC4gIGJ1ZyAxMDE1MCAqLworCWJvZHkgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT1NUX0JPRFkpOworCWNyYXR0ci0+Y3JhX29hID0gJmJvZHktPm9hOwogCWNsX3JlcV9hdHRyX3NldChlbnYsIGNsZXJxLCBjcmF0dHIsCiAJCQlPQkRfTURfRkxNVElNRXxPQkRfTURfRkxDVElNRXxPQkRfTURfRkxBVElNRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYwppbmRleCA0ODgyZGQwLi4wMzU3ZjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCkBAIC0yODUsMTQgKzI4NSwyNyBAQAogCXRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOwogCiAJTEFTU0VSVChyZXEtPnJxX2ltcG9ydCk7Ci0JYXQgPSAmcmVxLT5ycV9pbXBvcnQtPmltcF9hdDsKKworCWlmIChzZXJ2aWNlX3RpbWUgPiBub3cgLSByZXEtPnJxX3NlbnQgKyAzKSB7CisJCS8qIGJ6MTY0MDgsIGhvd2V2ZXIsIHRoaXMgY2FuIGFsc28gaGFwcGVuIGlmIGVhcmx5IHJlcGx5CisJCSAqIGlzIGxvc3QgYW5kIGNsaWVudCBSUEMgaXMgZXhwaXJlZCBhbmQgcmVzZW50LCBlYXJseSByZXBseQorCQkgKiBvciByZXBseSBvZiBvcmlnaW5hbCBSUEMgY2FuIHN0aWxsIGJlIGZpdCBpbiByZXBseSBidWZmZXIKKwkJICogb2YgcmVzZW50IFJQQywgbm93IGNsaWVudCBpcyBtZWFzdXJpbmcgdGltZSBmcm9tIHRoZQorCQkgKiByZXNlbnQgdGltZSwgYnV0IHNlcnZlciBzZW50IGJhY2sgc2VydmljZSB0aW1lIG9mIG9yaWdpbmFsCisJCSAqIFJQQy4KKwkJICovCisJCUNERUJVRygobHVzdHJlX21zZ19nZXRfZmxhZ3MocmVxLT5ycV9yZXFtc2cpICYgTVNHX1JFU0VOVCkgPworCQkgICAgICAgRF9BREFQVFRPIDogRF9XQVJOSU5HLAorCQkgICAgICAgIlJlcG9ydGVkIHNlcnZpY2UgdGltZSAldSA+IHRvdGFsIG1lYXN1cmVkIHRpbWUgIgorCQkgICAgICAgQ0ZTX0RVUkFUSU9OX1QiXG4iLCBzZXJ2aWNlX3RpbWUsCisJCSAgICAgICBjZnNfdGltZV9zdWIobm93LCByZXEtPnJxX3NlbnQpKTsKKwkJcmV0dXJuOworCX0KIAogCS8qIE5ldHdvcmsgbGF0ZW5jeSBpcyB0b3RhbCB0aW1lIGxlc3Mgc2VydmVyIHByb2Nlc3NpbmcgdGltZSAqLwotCW5sID0gbWF4X3QoaW50LCBub3cgLSByZXEtPnJxX3NlbnQgLSBzZXJ2aWNlX3RpbWUsIDApICsgMS8qc3Qgcm91bmRpbmcqLzsKLQlpZiAoc2VydmljZV90aW1lID4gbm93IC0gcmVxLT5ycV9zZW50ICsgMyAvKiBiejE2NDA4ICovKQotCQlDV0FSTigiUmVwb3J0ZWQgc2VydmljZSB0aW1lICV1ID4gdG90YWwgbWVhc3VyZWQgdGltZSAiCi0JCSAgICAgIENGU19EVVJBVElPTl9UIlxuIiwgc2VydmljZV90aW1lLAotCQkgICAgICBjZnNfdGltZV9zdWIobm93LCByZXEtPnJxX3NlbnQpKTsKKwlubCA9IG1heF90KGludCwgbm93IC0gcmVxLT5ycV9zZW50IC0KKwkJCXNlcnZpY2VfdGltZSwgMCkgKyAxOyAvKiBzdCByb3VuZGluZyAqLworCWF0ID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfYXQ7CiAKIAlvbGRubCA9IGF0X21lYXN1cmVkKCZhdC0+aWF0X25ldF9sYXRlbmN5LCBubCk7CiAJaWYgKG9sZG5sICE9IDApCkBAIC00NjgsNyArNDgxLDYgQEAKIAkJbGlzdF9hZGRfdGFpbCgmcmVxLT5ycV9saXN0LCAmcG9vbC0+cHJwX3JlcV9saXN0KTsKIAl9CiAJc3Bpbl91bmxvY2soJnBvb2wtPnBycF9sb2NrKTsKLQlyZXR1cm47CiB9CiBFWFBPUlRfU1lNQk9MKHB0bHJwY19hZGRfcnFzX3RvX3Bvb2wpOwogCkBAIC0xNDM5LDEyICsxNDUxLDExIEBACiAJCWlmIChyZXEtPnJxX2VycikgewogCQkJcmVxLT5ycV9zdGF0dXMgPSByYzsKIAkJCXJldHVybiAxOwotCQl9IGVsc2UgewotCQkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwotCQkJcmVxLT5ycV93YWl0X2N0eCA9IDE7Ci0JCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKLQkJCXJldHVybiAwOwogCQl9CisJCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKKwkJcmVxLT5ycV93YWl0X2N0eCA9IDE7CisJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOworCQlyZXR1cm4gMDsKIAl9CiAKIAlDREVCVUcoRF9SUENUUkFDRSwgIlNlbmRpbmcgUlBDIHBuYW1lOmNsdXVpZDpwaWQ6eGlkOm5pZDpvcGMgJXM6JXM6JWQ6JWxsdTolczolZFxuIiwKQEAgLTIxOTIsNyArMjIwMyw3IEBACiAJaWYgKHNldC0+c2V0X2ludGVycHJldCAhPSBOVUxMKSB7CiAJCWludCAoKmludGVycHJldGVyKShzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpzZXQsIHZvaWQgKiwgaW50KSA9CiAJCQlzZXQtPnNldF9pbnRlcnByZXQ7Ci0JCXJjID0gaW50ZXJwcmV0ZXIgKHNldCwgc2V0LT5zZXRfYXJnLCByYyk7CisJCXJjID0gaW50ZXJwcmV0ZXIoc2V0LCBzZXQtPnNldF9hcmcsIHJjKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgcHRscnBjX3NldF9jYmRhdGEgKmNiZGF0YSwgKm47CiAJCWludCBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY29ubmVjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2Nvbm5lY3Rpb24uYwppbmRleCAyYTg3NWFiLi43ZTI3Mzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY29ubmVjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMKQEAgLTE4NCw2ICsxODQsNyBAQAogY29ubl9rZXkoc3RydWN0IGhsaXN0X25vZGUgKmhub2RlKQogewogCXN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqY29ubjsKKwogCWNvbm4gPSBobGlzdF9lbnRyeShobm9kZSwgc3RydWN0IHB0bHJwY19jb25uZWN0aW9uLCBjX2hhc2gpOwogCXJldHVybiAmY29ubi0+Y19wZWVyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCmluZGV4IDRjZWI5MGQuLmQ1ZmM2ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKQEAgLTYzLDYgKzYzLDE5IEBACiBzdGF0aWMgdm9pZCBfX2ltcG9ydF9zZXRfc3RhdGUoc3RydWN0IG9iZF9pbXBvcnQgKmltcCwKIAkJCSAgICAgICBlbnVtIGx1c3RyZV9pbXBfc3RhdGUgc3RhdGUpCiB7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgTFVTVFJFX0lNUF9DTE9TRUQ6CisJY2FzZSBMVVNUUkVfSU1QX05FVzoKKwljYXNlIExVU1RSRV9JTVBfRElTQ09OOgorCWNhc2UgTFVTVFJFX0lNUF9DT05ORUNUSU5HOgorCQlicmVhazsKKwljYXNlIExVU1RSRV9JTVBfUkVQTEFZX1dBSVQ6CisJCWltcC0+aW1wX3JlcGxheV9zdGF0ZSA9IExVU1RSRV9JTVBfUkVQTEFZX0xPQ0tTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbXAtPmltcF9yZXBsYXlfc3RhdGUgPSBMVVNUUkVfSU1QX1JFUExBWTsKKwl9CisKIAlpbXAtPmltcF9zdGF0ZSA9IHN0YXRlOwogCWltcC0+aW1wX3N0YXRlX2hpc3RbaW1wLT5pbXBfc3RhdGVfaGlzdF9pZHhdLmlzaF9zdGF0ZSA9IHN0YXRlOwogCWltcC0+aW1wX3N0YXRlX2hpc3RbaW1wLT5pbXBfc3RhdGVfaGlzdF9pZHhdLmlzaF90aW1lID0KQEAgLTk2Niw3ICs5NzksNyBAQAogCQkJaW1wLT5pbXBfcmVzZW5kX3JlcGxheSA9IDE7CiAJCQlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiAKLQkJCUlNUE9SVF9TRVRfU1RBVEUoaW1wLCBMVVNUUkVfSU1QX1JFUExBWSk7CisJCQlJTVBPUlRfU0VUX1NUQVRFKGltcCwgaW1wLT5pbXBfcmVwbGF5X3N0YXRlKTsKIAkJfSBlbHNlIHsKIAkJCUlNUE9SVF9TRVRfU1RBVEUoaW1wLCBMVVNUUkVfSU1QX1JFQ09WRVIpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKaW5kZXggYmJlZjY2NmIuLmE0MjMzNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKQEAgLTgxMSw4ICs4MTEsOCBAQAogCS5ybWZfbmFtZSAgICA9IChuYW1lKSwJCQkJICBcCiAJLnJtZl9mbGFncyAgID0gKGZsYWdzKSwJCQkJIFwKIAkucm1mX3NpemUgICAgPSAoc2l6ZSksCQkJCSAgXAotCS5ybWZfc3dhYmJlciA9ICh2b2lkICgqKSh2b2lkKikpKHN3YWJiZXIpLAkgICAgICBcCi0JLnJtZl9kdW1wZXIgID0gKHZvaWQgKCopKHZvaWQqKSkoZHVtcGVyKQkJXAorCS5ybWZfc3dhYmJlciA9ICh2b2lkICgqKSh2b2lkICopKShzd2FiYmVyKSwJICAgICAgXAorCS5ybWZfZHVtcGVyICA9ICh2b2lkICgqKSh2b2lkICopKShkdW1wZXIpCQlcCiB9CiAKIHN0cnVjdCByZXFfbXNnX2ZpZWxkIFJNRl9HRU5FUklDX0RBVEEgPQpAQCAtMTgzOSw3ICsxODM5LDcgQEAKIAlMQVNTRVJURihvZmZzZXQgPiAwLCAiJXM6JXMsIG9mZj0lZCwgbG9jPSVkXG4iLAogCQkJICAgIHBpbGwtPnJjX2ZtdC0+cmZfbmFtZSwKIAkJCSAgICBmaWVsZC0+cm1mX25hbWUsIG9mZnNldCwgbG9jKTsKLQlvZmZzZXQgLS07CisJb2Zmc2V0LS07CiAKIAlMQVNTRVJUKDAgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IFJFUV9NQVhfRklFTERfTlIpOwogCXJldHVybiBvZmZzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKaW5kZXggMGUyMDcxYi4uOTUzM2FiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJcmV0dXJuIGxsX2VvcGNvZGVfdGFibGVbb3Bjb2RlXS5vcG5hbWU7CiB9CiAKLSNpZiBkZWZpbmVkIChDT05GSUdfUFJPQ19GUykKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQogc3RhdGljIHZvaWQgcHRscnBjX2xwcm9jZnNfcmVnaXN0ZXIoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LCBjaGFyICpkaXIsCiAJCQkJICAgIGNoYXIgKm5hbWUsCiAJCQkJICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnByb2Nyb290X3JldCwKQEAgLTI2Nyw3ICsyNjcsOCBAQAogCXB0bHJwY19zZXJ2aWNlX2Zvcl9lYWNoX3BhcnQoc3ZjcHQsIGksIHN2YykKIAkJdG90YWwgKz0gc3ZjcHQtPnNjcF9oaXN0X25ycWJkczsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZFxuIiwgdG90YWwpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCB0b3RhbCk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhwdGxycGNfbHByb2Nmc19yZXFfaGlzdG9yeV9sZW4pOwogCkBAIC0yODIsNyArMjgzLDggQEAKIAlwdGxycGNfc2VydmljZV9mb3JfZWFjaF9wYXJ0KHN2Y3B0LCBpLCBzdmMpCiAJCXRvdGFsICs9IHN2Yy0+c3J2X2hpc3RfbnJxYmRzX2NwdF9tYXg7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsIHRvdGFsKTsKKwlzZXFfcHJpbnRmKG0sICIlZFxuIiwgdG90YWwpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMzI3LDggKzMyOSw4IEBACiB7CiAJc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMgPSBtLT5wcml2YXRlOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLAotCQkJc3ZjLT5zcnZfbnRocnNfY3B0X2luaXQgKiBzdmMtPnNydl9uY3B0cyk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIHN2Yy0+c3J2X250aHJzX2NwdF9pbml0ICogc3ZjLT5zcnZfbmNwdHMpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMzcxLDcgKzM3Myw4IEBACiAJcHRscnBjX3NlcnZpY2VfZm9yX2VhY2hfcGFydChzdmNwdCwgaSwgc3ZjKQogCQl0b3RhbCArPSBzdmNwdC0+c2NwX250aHJzX3J1bm5pbmc7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsIHRvdGFsKTsKKwlzZXFfcHJpbnRmKG0sICIlZFxuIiwgdG90YWwpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ocHRscnBjX2xwcm9jZnNfdGhyZWFkc19zdGFydGVkKTsKIApAQCAtMzgwLDggKzM4Myw4IEBACiB7CiAJc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMgPSBtLT5wcml2YXRlOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLAotCQkJc3ZjLT5zcnZfbnRocnNfY3B0X2xpbWl0ICogc3ZjLT5zcnZfbmNwdHMpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCBzdmMtPnNydl9udGhyc19jcHRfbGltaXQgKiBzdmMtPnNydl9uY3B0cyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0xMDI2LDcgKzEwMjksOCBAQAogc3RhdGljIGludCBwdGxycGNfbHByb2Nmc19ocF9yYXRpb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMgPSBtLT5wcml2YXRlOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZCIsIHN2Yy0+c3J2X2hwcmVxX3JhdGlvKTsKKwlzZXFfcHJpbnRmKG0sICIlZCIsIHN2Yy0+c3J2X2hwcmVxX3JhdGlvKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgcHRscnBjX2xwcm9jZnNfaHBfcmF0aW9fc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMTA4Myw3ICsxMDg3LDcgQEAKIAkJIC5kYXRhCSAgICAgPSBzdmN9LAogCQl7TlVMTH0KIAl9OwotCXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlcV9oaXN0b3J5X2ZvcHMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVxX2hpc3RvcnlfZm9wcyA9IHsKIAkJLm93bmVyICAgICAgID0gVEhJU19NT0RVTEUsCiAJCS5vcGVuCT0gcHRscnBjX2xwcm9jZnNfc3ZjX3JlcV9oaXN0b3J5X29wZW4sCiAJCS5yZWFkCT0gc2VxX3JlYWQsCkBAIC0xMzI0LDEzICsxMzI4LDEyIEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IG9iZF9pbXBvcnQgKmltcCA9IG9iZC0+dS5jbGkuY2xfaW1wb3J0OwotCWludCByYzsKIAogCUxQUk9DRlNfQ0xJTVBfQ0hFQ0sob2JkKTsKLQlyYyA9IHNlcV9wcmludGYobSwgIiVkXG4iLCAhaW1wLT5pbXBfbm9fcGluZ2VyX3JlY292ZXIpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCAhaW1wLT5pbXBfbm9fcGluZ2VyX3JlY292ZXIpOwogCUxQUk9DRlNfQ0xJTVBfRVhJVChvYmQpOwogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX3Bpbmdlcl9yZWNvdik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYwppbmRleCBmNzE1ZTlhLi4yZmEyNTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCkBAIC0zODMsMTIgKzM4MywxMyBAQAogCQkgICAgICAgcmVxLT5ycV9leHBvcnQtPmV4cF9vYmQtPm9iZF9taW5vcik7CiAJfQogCi0JLyogSW4gb3JkZXIgdG8ga2VlcCBpbnRlcm9wcmFiaWxpdHkgd2l0aCB0aGUgY2xpZW50ICg8IDIuMykgd2hpY2gKKwkvKiBJbiBvcmRlciB0byBrZWVwIGludGVyb3BlcmFiaWxpdHkgd2l0aCB0aGUgY2xpZW50ICg8IDIuMykgd2hpY2gKIAkgKiBkb2Vzbid0IGhhdmUgcGJfam9iaWQgaW4gcHRscnBjX2JvZHksIFdlIGhhdmUgdG8gc2hyaW5rIHRoZQogCSAqIHB0bHJwY19ib2R5IGluIHJlcGx5IGJ1ZmZlciB0byBwdGxycGNfYm9keV92Miwgb3RoZXJ3aXNlLCB0aGUKIAkgKiByZXBseSBidWZmZXIgb24gY2xpZW50IHdpbGwgYmUgb3ZlcmZsb3cuCiAJICoKLQkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbmV2ZXIgd2UgZHJvcCB0aGUgaW50ZXJvcHJhYmlsaXR5IHdpdGggc3VjaCBjbGllbnQuCisJICogWFhYIFJlbW92ZSB0aGlzIHdoZW5ldmVyIHdlIGRyb3AgdGhlIGludGVyb3BlcmFiaWxpdHkgd2l0aAorCSAqIHN1Y2ggY2xpZW50LgogCSAqLwogCXJlcS0+cnFfcmVwbGVuID0gbHVzdHJlX3Nocmlua19tc2cocmVxLT5ycV9yZXBtc2csIDAsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgcHRscnBjX2JvZHlfdjIpLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ucnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ucnMuYwppbmRleCBkNWZkNzIxLi44MWFkNzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbnJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25ycy5jCkBAIC0xNTUsOSArMTU1LDggQEAKIHsKIAlzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnRtcCA9IG5ycy0+bnJzX3BvbGljeV9wcmltYXJ5OwogCi0JaWYgKHRtcCA9PSBOVUxMKSB7CisJaWYgKHRtcCA9PSBOVUxMKQogCQlyZXR1cm47Ci0JfQogCiAJbnJzLT5ucnNfcG9saWN5X3ByaW1hcnkgPSBOVUxMOwogCkBAIC05MTIsNyArOTExLDYgQEAKIHN0YXRpYyBpbnQgbnJzX3N2Y3B0X3NldHVwX2xvY2tlZDAoc3RydWN0IHB0bHJwY19ucnMgKm5ycywKIAkJCQkgICBzdHJ1Y3QgcHRscnBjX3NlcnZpY2VfcGFydCAqc3ZjcHQpCiB7Ci0JaW50CQkJCXJjOwogCWVudW0gcHRscnBjX25yc19xdWV1ZV90eXBlCXF1ZXVlOwogCiAJTEFTU0VSVChtdXRleF9pc19sb2NrZWQoJm5yc19jb3JlLm5yc19tdXRleCkpOwpAQCAtOTMwLDkgKzkyOCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJm5ycy0+bnJzX3BvbGljeV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmbnJzLT5ucnNfcG9saWN5X3F1ZXVlZCk7CiAKLQlyYyA9IG5yc19yZWdpc3Rlcl9wb2xpY2llc19sb2NrZWQobnJzKTsKLQotCXJldHVybiByYzsKKwlyZXR1cm4gbnJzX3JlZ2lzdGVyX3BvbGljaWVzX2xvY2tlZChucnMpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYwppbmRleCAyZjQ1Zjc2NS4uYjUxYWY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYwpAQCAtMTE3LDEzICsxMTcsMTMgQEAKIC8qIGVhcmx5IHJlcGx5IHNpemUgKi8KIGludCBsdXN0cmVfbXNnX2Vhcmx5X3NpemUodm9pZCkKIHsKLQlzdGF0aWMgaW50IHNpemUgPSAwOworCXN0YXRpYyBpbnQgc2l6ZTsKIAlpZiAoIXNpemUpIHsKLQkJLyogQWx3YXlzIHJlcGx5IG9sZCBwdGxycGNfYm9keV92MiB0byBrZWVwIGludGVyb3ByYWJpbGl0eQorCQkvKiBBbHdheXMgcmVwbHkgb2xkIHB0bHJwY19ib2R5X3YyIHRvIGtlZXAgaW50ZXJvcGVyYWJpbGl0eQogCQkgKiB3aXRoIHRoZSBvbGQgY2xpZW50ICg8IDIuMykgd2hpY2ggZG9lc24ndCBoYXZlIHBiX2pvYmlkCiAJCSAqIGluIHRoZSBwdGxycGNfYm9keS4KIAkJICoKLQkJICogWFhYIFJlbW92ZSB0aGlzIHdoZW5ldmVyIHdlIGRyb3AgaW50ZXJvcHJhYmlsaXR5IHdpdGggc3VjaAorCQkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbmV2ZXIgd2UgZHJvcCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggc3VjaAogCQkgKiAgICAgY2xpZW50LgogCQkgKi8KIAkJX191MzIgcGJsZW4gPSBzaXplb2Yoc3RydWN0IHB0bHJwY19ib2R5X3YyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9waW5nZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9waW5nZXIuYwppbmRleCAzNDBkOThhLi45ZGJkYTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGluZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jCkBAIC01NDUsNyArNTQ1LDcgQEAKICNkZWZpbmUgUEVUX1JFQURZICAgICAxCiAjZGVmaW5lIFBFVF9URVJNSU5BVEUgMgogCi1zdGF0aWMgaW50CSAgICAgICBwZXRfcmVmY291bnQgPSAwOworc3RhdGljIGludCBwZXRfcmVmY291bnQ7CiBzdGF0aWMgaW50CSAgICAgICBwZXRfc3RhdGU7CiBzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgcGV0X3dhaXRxOwogTElTVF9IRUFEKHBldF9saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNfaW50ZXJuYWwuaAppbmRleCA3ZmUyZTU4Li5hNjZkYzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY19pbnRlcm5hbC5oCkBAIC03Niw3ICs3Niw3IEBACiBpbnQgbHVzdHJlX3VucGFja19yZXFfcHRscnBjX2JvZHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBvZmZzZXQpOwogaW50IGx1c3RyZV91bnBhY2tfcmVwX3B0bHJwY19ib2R5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgb2Zmc2V0KTsKIAotI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQorI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCiB2b2lkIHB0bHJwY19scHJvY2ZzX3JlZ2lzdGVyX3NlcnZpY2Uoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2VudHJ5LAogCQkJCSAgICAgc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMpOwogdm9pZCBwdGxycGNfbHByb2Nmc191bnJlZ2lzdGVyX3NlcnZpY2Uoc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMpOwpAQCAtMjYzLDcgKzI2Myw3IEBACiBpbnQgc3B0bHJwY19wcm9jX2VuY19wb29sX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7CiAKIC8qIHNlY19scHJvYy5jICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX1BST0NfRlMpCisjaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKIGludCAgc3B0bHJwY19scHJvY19pbml0KHZvaWQpOwogdm9pZCBzcHRscnBjX2xwcm9jX2Zpbmkodm9pZCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKaW5kZXggNDYyMWI3MS4uMGMxNzhlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCkBAIC04NSw3ICs4NSw3IEBACiBzdGF0aWMgc3RydWN0IHB0bHJwY2QgKnB0bHJwY2RzOwogCiBzdHJ1Y3QgbXV0ZXggcHRscnBjZF9tdXRleDsKLXN0YXRpYyBpbnQgcHRscnBjZF91c2VycyA9IDA7CitzdGF0aWMgaW50IHB0bHJwY2RfdXNlcnM7CiAKIHZvaWQgcHRscnBjZF93YWtlKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQogewpAQCAtNTExLDEwICs1MTEsMTAgQEAKICNpZiBkZWZpbmVkKENPTkZJR19OVU1BKQogCXsKIAkJaW50IGk7Ci0JCW1hc2sgPSAqY3B1bWFza19vZl9ub2RlKGNwdV90b19ub2RlKGluZGV4KSk7CisJCWNwdW1hc2tfY29weSgmbWFzaywgY3B1bWFza19vZl9ub2RlKGNwdV90b19ub2RlKGluZGV4KSkpOwogCQlmb3IgKGkgPSBtYXg7IGkgPCBudW1fb25saW5lX2NwdXMoKTsgaSsrKQotCQkJY3B1X2NsZWFyKGksIG1hc2spOwotCQlwYy0+cGNfbnBhcnRuZXJzID0gY3B1c193ZWlnaHQobWFzaykgLSAxOworCQkJY3B1bWFza19jbGVhcl9jcHUoaSwgJm1hc2spOworCQlwYy0+cGNfbnBhcnRuZXJzID0gY3B1bWFza193ZWlnaHQoJm1hc2spIC0gMTsKIAkJc2V0X2JpdChMSU9EX0JJTkQsICZwYy0+cGNfZmxhZ3MpOwogCX0KICNlbHNlCkBAIC01NTQsNyArNTU0LDcgQEAKIAkJCQkgKiB0aGF0IGFyZSBhbHJlYWR5IGluaXRpYWxpemVkCiAJCQkJICovCiAJCQkJZm9yIChwaWR4ID0gMCwgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0JCQkJCWlmIChjcHVfaXNzZXQoaSwgbWFzaykpIHsKKwkJCQkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoaSwgJm1hc2spKSB7CiAJCQkJCQlwcGMgPSAmcHRscnBjZHMtPnBkX3RocmVhZHNbaV07CiAJCQkJCQlwYy0+cGNfcGFydG5lcnNbcGlkeCsrXSA9IHBwYzsKIAkJCQkJCXBwYy0+cGNfcGFydG5lcnNbcHBjLT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMKaW5kZXggMGRhYmQ4My4uYzA1YTg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMKQEAgLTEyNSw1MiArMTI1LDUwIEBACiAgKi8KIGludCBzcHRscnBjX3Byb2NfZW5jX3Bvb2xfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCWludCAgICAgcmM7Ci0KIAlzcGluX2xvY2soJnBhZ2VfcG9vbHMuZXBwX2xvY2spOwogCi0JcmMgPSBzZXFfcHJpbnRmKG0sCi0JCSAgICAgICJwaHlzaWNhbCBwYWdlczoJICAlbHVcbiIKLQkJICAgICAgInBhZ2VzIHBlciBwb29sOgkgICVsdVxuIgotCQkgICAgICAibWF4IHBhZ2VzOgkgICAgICAgJWx1XG4iCi0JCSAgICAgICJtYXggcG9vbHM6CSAgICAgICAldVxuIgotCQkgICAgICAidG90YWwgcGFnZXM6CSAgICAgJWx1XG4iCi0JCSAgICAgICJ0b3RhbCBmcmVlOgkgICAgICAlbHVcbiIKLQkJICAgICAgImlkbGUgaW5kZXg6CSAgICAgICVsdS8xMDBcbiIKLQkJICAgICAgImxhc3Qgc2hyaW5rOgkgICAgICVsZHNcbiIKLQkJICAgICAgImxhc3QgYWNjZXNzOgkgICAgICVsZHNcbiIKLQkJICAgICAgIm1heCBwYWdlcyByZWFjaGVkOiAgICAgICAlbHVcbiIKLQkJICAgICAgImdyb3dzOgkJICAgJXVcbiIKLQkJICAgICAgImdyb3dzIGZhaWx1cmU6CSAgICV1XG4iCi0JCSAgICAgICJzaHJpbmtzOgkJICV1XG4iCi0JCSAgICAgICJjYWNoZSBhY2Nlc3M6CSAgICAlbHVcbiIKLQkJICAgICAgImNhY2hlIG1pc3Npbmc6CSAgICVsdVxuIgotCQkgICAgICAibG93IGZyZWUgbWFyazoJICAgJWx1XG4iCi0JCSAgICAgICJtYXggd2FpdHF1ZXVlIGRlcHRoOiAgICAgJXVcbiIKLQkJICAgICAgIm1heCB3YWl0IHRpbWU6CSAgICJDRlNfVElNRV9UIi8ldVxuIgotCQkgICAgICAsCi0JCSAgICAgIHRvdGFscmFtX3BhZ2VzLAotCQkgICAgICBQQUdFU19QRVJfUE9PTCwKLQkJICAgICAgcGFnZV9wb29scy5lcHBfbWF4X3BhZ2VzLAotCQkgICAgICBwYWdlX3Bvb2xzLmVwcF9tYXhfcG9vbHMsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX3RvdGFsX3BhZ2VzLAotCQkgICAgICBwYWdlX3Bvb2xzLmVwcF9mcmVlX3BhZ2VzLAotCQkgICAgICBwYWdlX3Bvb2xzLmVwcF9pZGxlX2lkeCwKLQkJICAgICAgZ2V0X3NlY29uZHMoKSAtIHBhZ2VfcG9vbHMuZXBwX2xhc3Rfc2hyaW5rLAotCQkgICAgICBnZXRfc2Vjb25kcygpIC0gcGFnZV9wb29scy5lcHBfbGFzdF9hY2Nlc3MsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF9wYWdlcywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfZ3Jvd3MsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X2dyb3dfZmFpbHMsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X3Nocmlua3MsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X2FjY2VzcywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfbWlzc2luZ3MsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X2xvd2ZyZWUsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93cWxlbiwKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfbWF4X3dhaXQsIEhaCi0JCSAgICAgKTsKKwlzZXFfcHJpbnRmKG0sCisJCSAgICJwaHlzaWNhbCBwYWdlczoJICAlbHVcbiIKKwkJICAgInBhZ2VzIHBlciBwb29sOgkgICVsdVxuIgorCQkgICAibWF4IHBhZ2VzOgkgICAgICAgJWx1XG4iCisJCSAgICJtYXggcG9vbHM6CSAgICAgICAldVxuIgorCQkgICAidG90YWwgcGFnZXM6CSAgICAgJWx1XG4iCisJCSAgICJ0b3RhbCBmcmVlOgkgICAgICAlbHVcbiIKKwkJICAgImlkbGUgaW5kZXg6CSAgICAgICVsdS8xMDBcbiIKKwkJICAgImxhc3Qgc2hyaW5rOgkgICAgICVsZHNcbiIKKwkJICAgImxhc3QgYWNjZXNzOgkgICAgICVsZHNcbiIKKwkJICAgIm1heCBwYWdlcyByZWFjaGVkOiAgICAgICAlbHVcbiIKKwkJICAgImdyb3dzOgkJICAgJXVcbiIKKwkJICAgImdyb3dzIGZhaWx1cmU6CSAgICV1XG4iCisJCSAgICJzaHJpbmtzOgkJICV1XG4iCisJCSAgICJjYWNoZSBhY2Nlc3M6CSAgICAlbHVcbiIKKwkJICAgImNhY2hlIG1pc3Npbmc6CSAgICVsdVxuIgorCQkgICAibG93IGZyZWUgbWFyazoJICAgJWx1XG4iCisJCSAgICJtYXggd2FpdHF1ZXVlIGRlcHRoOiAgICAgJXVcbiIKKwkJICAgIm1heCB3YWl0IHRpbWU6CSAgICIgQ0ZTX1RJTUVfVCAiLyV1XG4iLAorCQkgICB0b3RhbHJhbV9wYWdlcywKKwkJICAgUEFHRVNfUEVSX1BPT0wsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX21heF9wYWdlcywKKwkJICAgcGFnZV9wb29scy5lcHBfbWF4X3Bvb2xzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF90b3RhbF9wYWdlcywKKwkJICAgcGFnZV9wb29scy5lcHBfZnJlZV9wYWdlcywKKwkJICAgcGFnZV9wb29scy5lcHBfaWRsZV9pZHgsCisJCSAgIGdldF9zZWNvbmRzKCkgLSBwYWdlX3Bvb2xzLmVwcF9sYXN0X3NocmluaywKKwkJICAgZ2V0X3NlY29uZHMoKSAtIHBhZ2VfcG9vbHMuZXBwX2xhc3RfYWNjZXNzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfcGFnZXMsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X2dyb3dzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9ncm93X2ZhaWxzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9zaHJpbmtzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9hY2Nlc3MsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X21pc3NpbmdzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9sb3dmcmVlLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfd3FsZW4sCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93YWl0LAorCQkgICBIWik7CiAKIAlzcGluX3VubG9jaygmcGFnZV9wb29scy5lcHBfbG9jayk7Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGVuY19wb29sc19yZWxlYXNlX2ZyZWVfcGFnZXMobG9uZyBucGFnZXMpCkBAIC0zNjUsOCArMzYzLDggQEAKIAkgKi8KIAljdXJfbnBvb2xzID0gKHBhZ2VfcG9vbHMuZXBwX3RvdGFsX3BhZ2VzICsgUEFHRVNfUEVSX1BPT0wgLSAxKSAvCiAJCSAgICAgUEFHRVNfUEVSX1BPT0w7Ci0JZW5kX25wb29scyA9IChwYWdlX3Bvb2xzLmVwcF90b3RhbF9wYWdlcyArIG5wYWdlcyArIFBBR0VTX1BFUl9QT09MIC0gMSkgLwotCQkgICAgIFBBR0VTX1BFUl9QT09MOworCWVuZF9ucG9vbHMgPSAocGFnZV9wb29scy5lcHBfdG90YWxfcGFnZXMgKyBucGFnZXMgKyBQQUdFU19QRVJfUE9PTCAtIDEpCisJCSAgICAgLyBQQUdFU19QRVJfUE9PTDsKIAlMQVNTRVJUKGVuZF9ucG9vbHMgPD0gcGFnZV9wb29scy5lcHBfbWF4X3Bvb2xzKTsKIAogCW5wX2lkeCA9IDA7CkBAIC04MTYsOSArODE0LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHN3YWJiZWQpIHsKKwlpZiAoc3dhYmJlZCkKIAkJX19zd2FiMzJzKCZic2QtPmJzZF9ub2IpOwotCX0KIAogCWlmICh1bmxpa2VseShic2QtPmJzZF92ZXJzaW9uICE9IDApKSB7CiAJCUNFUlJPUigiVW5leHBlY3RlZCB2ZXJzaW9uICV1XG4iLCBic2QtPmJzZF92ZXJzaW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCmluZGV4IDYzNWIxMmIuLjhlNjE0MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYwpAQCAtNTQzLDcgKzU0Myw2IEBACiAJaWYgKHRjLT50Y190aHJfZmFjdG9yICE9IDApIHsKIAkJaW50CSAgZmFjdG9yID0gdGMtPnRjX3Rocl9mYWN0b3I7CiAJCWNvbnN0IGludCBmYWRlID0gNDsKLQkJY3B1bWFza190IG1hc2s7CiAKIAkJLyoKIAkJICogVXNlciB3YW50cyB0byBpbmNyZWFzZSBudW1iZXIgb2YgdGhyZWFkcyB3aXRoIGZvcgpAQCAtNTU3LDggKzU1Niw4IEBACiAJCSAqIGhhdmUgdG9vIG1hbnkgdGhyZWFkcyBubyBtYXR0ZXIgaG93IG1hbnkgY29yZXMvSFRzCiAJCSAqIHRoZXJlIGFyZS4KIAkJICovCi0JCWNwdW1hc2tfY29weSgmbWFzaywgdG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soMCkpOwotCQlpZiAoY3B1c193ZWlnaHQobWFzaykgPiAxKSB7IC8qIHdlaWdodCBpcyAjIG9mIEhUcyAqLworCQkvKiB3ZWlnaHQgaXMgIyBvZiBIVHMgKi8KKwkJaWYgKGNwdW1hc2tfd2VpZ2h0KHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKDApKSA+IDEpIHsKIAkJCS8qIGRlcHJlc3MgdGhyZWFkIGZhY3RvciBmb3IgaHlwZXItdGhyZWFkICovCiAJCQlmYWN0b3IgPSBmYWN0b3IgLSAoZmFjdG9yID4+IDEpICsgKGZhY3RvciA+PiAzKTsKIAkJfQpAQCAtMjc1Miw3ICsyNzUxLDYgQEAKIAogaW50IHB0bHJwY19ocl9pbml0KHZvaWQpCiB7Ci0JY3B1bWFza190CQkJbWFzazsKIAlzdHJ1Y3QgcHRscnBjX2hyX3BhcnRpdGlvbgkqaHJwOwogCXN0cnVjdCBwdGxycGNfaHJfdGhyZWFkCQkqaHJ0OwogCWludAkJCQlyYzsKQEAgLTI3NzAsOCArMjc2OCw3IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwdGxycGNfaHIuaHJfd2FpdHEpOwogCi0JY3B1bWFza19jb3B5KCZtYXNrLCB0b3BvbG9neV90aHJlYWRfY3B1bWFzaygwKSk7Ci0Jd2VpZ2h0ID0gY3B1c193ZWlnaHQobWFzayk7CisJd2VpZ2h0ID0gY3B1bWFza193ZWlnaHQodG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soMCkpOwogCiAJY2ZzX3BlcmNwdF9mb3JfZWFjaChocnAsIGksIHB0bHJwY19oci5ocl9wYXJ0aXRpb25zKSB7CiAJCWhycC0+aHJwX2NwdCA9IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmMKaW5kZXggNTM4MjUwNi4uZjI4ZmZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYwpAQCAtMTQ0OCw4ICsxNDQ4LDggQEAKIAkJLyogQmxvY2sgQSBtYXRjaCwgb25seSBkYXRhIHdpdGhvdXQgY3JjIGVycm9ycyB0YWtlbiAqLwogCQlpZiAoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpXSA9PSBCQ00yMDQ4X1JEU19CTE9DS19BKSB7CiAKLQkJCXBpID0gKChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2krMV0gPDwgOCkgKwotCQkJCWJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsyXSk7CisJCQlwaSA9IChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2krMV0gPDwgOCkgKworCQkJCWJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsyXTsKIAogCQkJaWYgKCFiZGV2LT5yZHNfaW5mby5yZHNfcGkpIHsKIAkJCQliZGV2LT5yZHNfaW5mby5yZHNfcGkgPSBwaTsKQEAgLTE1MDMsOCArMTUwMyw4IEBACiAJaWYgKChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2ldICYgQkNNMjA0OF9SRFNfQkxPQ0tfTUFTSykgPT0KIAkJQkNNMjA0OF9SRFNfQkxPQ0tfQikgewogCi0JCXJ0X2lkID0gKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSAmCi0JCQlCQ00yMDQ4X1JEU19CTE9DS19NQVNLKTsKKwkJcnRfaWQgPSBiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2krMV0gJgorCQkJQkNNMjA0OF9SRFNfQkxPQ0tfTUFTSzsKIAkJcnRfZ3JvdXBfYiA9IGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSAmCiAJCQlCQ00yMDQ4X1JEU19HUk9VUF9BQl9NQVNLOwogCQlydF9hYiA9IGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsyXSAmCkBAIC0xNzkyLDcgKzE3OTIsNyBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlkYXRhX2J1ZmZlciA9IGt6YWxsb2MoQkNNMjA0OF9NQVhfUkRTX1JBRElPX1RFWFQqNSwgR0ZQX0tFUk5FTCk7CisJZGF0YV9idWZmZXIgPSBrY2FsbG9jKEJDTTIwNDhfTUFYX1JEU19SQURJT19URVhULCA1LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGFfYnVmZmVyKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gdW5sb2NrOwpAQCAtMjI0NSw4ICsyMjQ1LDcgQEAKIAogCQl0bXBidWZbaV0gPSBiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2JkZXYtPnJkX2luZGV4K2krMl07CiAJCXRtcGJ1ZltpKzFdID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtiZGV2LT5yZF9pbmRleCtpKzFdOwotCQl0bXBidWZbaSsyXSA9ICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtiZGV2LT5yZF9pbmRleCtpXQotCQkJCSYgMHhmMCkgPj4gNCk7CisJCXRtcGJ1ZltpKzJdID0gKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbYmRldi0+cmRfaW5kZXggKyBpXSAmIDB4ZjApID4+IDQ7CiAJCWlmICgoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtiZGV2LT5yZF9pbmRleCtpXSAmCiAJCQlCQ00yMDQ4X1JEU19DUkNfTUFTSykgPT0gQkNNMjA0OF9SRFNfQ1JDX1VOUkVDT1ZBUkFCTEUpCiAJCQl0bXBidWZbaSsyXSB8PSAweDgwOwpAQCAtMjcxOCwyMiArMjcxNyw3IEBACiAJLmlkX3RhYmxlCT0gYmNtMjA0OF9pZCwKIH07CiAKLS8qCi0gKglNb2R1bGUgSW50ZXJmYWNlCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGJjbTIwNDhfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlwcl9pbmZvKEJDTTIwNDhfRFJJVkVSX0RFU0MgIlxuIik7Ci0KLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmJjbTIwNDhfaTJjX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChiY20yMDQ4X21vZHVsZV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGJjbTIwNDhfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmYmNtMjA0OF9pMmNfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGJjbTIwNDhfbW9kdWxlX2V4aXQpOworbW9kdWxlX2kyY19kcml2ZXIoYmNtMjA0OF9pMmNfZHJpdmVyKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUihCQ00yMDQ4X0RSSVZFUl9BVVRIT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCmluZGV4IDY1N2VhNDguLjY5MmJhM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXBpcGVpZi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pcGlwZWlmLmMKaW5kZXggODdkNDJlMS4uMTdlMTA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pcGlwZWlmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pcGlwZWlmLmMKQEAgLTIwOSwxMCArMjA5LDEwIEBACiAJLyogQ29tYmluZSBhbGwgdGhlIGZpZWxkcyB0byBtYWtlIENGRzEgcmVnaXN0ZXIgb2YgSVBJUEVJRiAqLwogCXRtcCA9IHZhbCA9IGdldF9vbmVzaG90X21vZGUoaXBpcGVpZi0+aW5wdXQpOwogCWlmICh0bXAgPCAwKSB7Ci0JCXByX2VycigiaXBpcGVpZjogbGlua3Mgc2V0dXAgcmVxdWlyZWQiKTsKKwkJZGV2X2Vycigmc2QtPmRldm5vZGUtPmRldiwgImlwaXBlaWY6IGxpbmtzIHNldHVwIHJlcXVpcmVkIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQl2YWwgPSB2YWwgPDwgT05FU0hPVF9TSElGVDsKKwl2YWwgPDw9IE9ORVNIT1RfU0hJRlQ7CiAKIAlpcGlwZWlmX3NvdXJjZSA9IGlwaXBlaWZfZ2V0X3NvdXJjZShpcGlwZWlmKTsKIAl2YWwgfD0gaXBpcGVpZl9zb3VyY2UgPDwgSU5QU1JDX1NISUZUOwpAQCAtNzQ3LDcgKzc0Nyw2IEBACiAJCQkuY2xpcCA9IDQwOTUsCiAJCX0sCiAJfTsKLQltZW1zZXQoJmlwaXBlaWYtPmNvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBpcGlwZWlmX3BhcmFtcykpOwogCW1lbWNweSgmaXBpcGVpZi0+Y29uZmlnLCAmaXBpcGVpZl9kZWZhdWx0cywKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcGlwZWlmX3BhcmFtcykpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9yZXNpemVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X3Jlc2l6ZXIuYwppbmRleCA3NWU3MGUxLi43Y2M4ZDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X3Jlc2l6ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X3Jlc2l6ZXIuYwpAQCAtOTA3LDcgKzkwNyw2IEBACiAJCQkub3V0X2Nocl9wb3MgPSBWUEZFX0lQSVBFX1lVVjQyMl9DSFJfUE9TX0NPU0lURSwKIAkJfSwKIAl9OwotCW1lbXNldCgmcmVzaXplci0+Y29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IHJlc2l6ZXJfcGFyYW1zKSk7CiAJbWVtY3B5KCZyZXNpemVyLT5jb25maWcsICZyc3pfZGVmYXVsdF9jb25maWcsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVzaXplcl9wYXJhbXMpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV9tY19jYXB0dXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfbWNfY2FwdHVyZS5jCmluZGV4IGEzNTBhMjAuLjU3NDI2MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV9tY19jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX21jX2NhcHR1cmUuYwpAQCAtMjI2LDggKzIyNiw4IEBACiAJaWYgKCF2cGZlX2NmZy0+bnVtX2Nsb2NrcykKIAkJcmV0dXJuIDA7CiAKLQl2cGZlX2Rldi0+Y2xrcyA9IGt6YWxsb2ModnBmZV9jZmctPm51bV9jbG9ja3MgKgotCQkJCSAgIHNpemVvZihzdHJ1Y3QgY2xvY2sgKiksIEdGUF9LRVJORUwpOworCXZwZmVfZGV2LT5jbGtzID0ga2NhbGxvYyh2cGZlX2NmZy0+bnVtX2Nsb2NrcywKKwkJCQkgc2l6ZW9mKHN0cnVjdCBjbG9jayAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHZwZmVfZGV2LT5jbGtzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zNDYsNyArMzQ2LDggQEAKIAlpMmNfYWRhcCA9IGkyY19nZXRfYWRhcHRlcigxKTsKIAludW1fc3ViZGV2cyA9IHZwZmVfY2ZnLT5udW1fc3ViZGV2czsKIAl2cGZlX2Rldi0+c2QgPQotCQkgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX3N1YmRldiAqKSpudW1fc3ViZGV2cywgR0ZQX0tFUk5FTCk7CisJCSAga2NhbGxvYyhudW1fc3ViZGV2cywgc2l6ZW9mKHN0cnVjdCB2NGwyX3N1YmRldiAqKSwKKwkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKHZwZmVfZGV2LT5zZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYwppbmRleCA5Y2U3ZDk5Li4zMzViOThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYwpAQCAtMjA4LDggKzIwOCw3IEBACiAJcmV0dmFsID0gbGlyY191bnJlZ2lzdGVyX2RyaXZlcihtaW5vcik7CiAJaWYgKHJldHZhbCkKIAkJZGV2X2VycigmY29udGV4dC0+dXNiZGV2LT5kZXYsCi0JCQkiOiAlczogdW5hYmxlIHRvIGRlcmVnaXN0ZXIgZnJvbSBsaXJjKCVkKSIsCi0JCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwkJCSJ1bmFibGUgdG8gZGVyZWdpc3RlciBmcm9tIGxpcmMoJWQpIiwgcmV0dmFsKTsKIAllbHNlCiAJCWRldl9pbmZvKCZjb250ZXh0LT51c2JkZXYtPmRldiwKIAkJCSAiRGVyZWdpc3RlcmVkIGlNT04gZHJpdmVyIChtaW5vcjolZClcbiIsIG1pbm9yKTsKQEAgLTI0MSw5ICsyNDAsOCBAQAogCWNvbnRleHQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CiAKIAlpZiAoIWNvbnRleHQpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkiJXM6IG5vIGNvbnRleHQgZm91bmQgZm9yIG1pbm9yICVkXG4iLAotCQkJX19mdW5jX18sIHN1Ym1pbm9yKTsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJubyBjb250ZXh0IGZvdW5kIGZvciBtaW5vciAlZFxuIiwKKwkJCXN1Ym1pbm9yKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTMzOSwxMyArMzM3LDEzIEBACiAJY29udGV4dC0+dHhfdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAogCWluaXRfY29tcGxldGlvbigmY29udGV4dC0+dHguZmluaXNoZWQpOwotCWF0b21pY19zZXQoJihjb250ZXh0LT50eC5idXN5KSwgMSk7CisJYXRvbWljX3NldCgmY29udGV4dC0+dHguYnVzeSwgMSk7CiAKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihjb250ZXh0LT50eF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXR2YWwpIHsKLQkJYXRvbWljX3NldCgmKGNvbnRleHQtPnR4LmJ1c3kpLCAwKTsKLQkJZGV2X2VycigmY29udGV4dC0+dXNiZGV2LT5kZXYsCi0JCQkiJXM6IGVycm9yIHN1Ym1pdHRpbmcgdXJiKCVkKVxuIiwgX19mdW5jX18sIHJldHZhbCk7CisJCWF0b21pY19zZXQoJmNvbnRleHQtPnR4LmJ1c3ksIDApOworCQlkZXZfZXJyKCZjb250ZXh0LT51c2JkZXYtPmRldiwgImVycm9yIHN1Ym1pdHRpbmcgdXJiKCVkKVxuIiwKKwkJCXJldHZhbCk7CiAJfSBlbHNlIHsKIAkJLyogV2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlIChvciBhYm9ydCkgKi8KIAkJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CkBAIC0zNTksOCArMzU3LDcgQEAKIAkJcmV0dmFsID0gY29udGV4dC0+dHguc3RhdHVzOwogCQlpZiAocmV0dmFsKQogCQkJZGV2X2VycigmY29udGV4dC0+dXNiZGV2LT5kZXYsCi0JCQkJIiVzOiBwYWNrZXQgdHggZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIHJldHZhbCk7CisJCQkJInBhY2tldCB0eCBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKIAl9CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNDM3LDggKzQzNCw4IEBACiAJCXJldHZhbCA9IHNlbmRfcGFja2V0KGNvbnRleHQpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlkZXZfZXJyKCZjb250ZXh0LT51c2JkZXYtPmRldiwKLQkJCQkiJXM6IHNlbmQgcGFja2V0IGZhaWxlZCBmb3IgcGFja2V0ICMlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc2VxLzIpOworCQkJCSJzZW5kIHBhY2tldCBmYWlsZWQgZm9yIHBhY2tldCAjJWRcbiIsCisJCQkJc2VxIC8gMik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0gZWxzZSB7CiAJCQlzZXEgKz0gMjsKQEAgLTQ1NCw4ICs0NTEsOCBAQAogCQlyZXR2YWwgPSBzZW5kX3BhY2tldChjb250ZXh0KTsKIAkJaWYgKHJldHZhbCkKIAkJCWRldl9lcnIoJmNvbnRleHQtPnVzYmRldi0+ZGV2LAotCQkJCSIlczogc2VuZCBwYWNrZXQgZmFpbGVkIGZvciBwYWNrZXQgIyVkXG4iLAotCQkJCQlfX2Z1bmNfXywgc2VxLzIpOworCQkJCSJzZW5kIHBhY2tldCBmYWlsZWQgZm9yIHBhY2tldCAjJWRcbiIsCisJCQkJc2VxIC8gMik7CiAJfQogCiBleGl0OgpAQCAtODc3LDggKzg3NCw3IEBACiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoY29udGV4dC0+cnhfdXJiLCBHRlBfS0VSTkVMKTsKIAogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycihkZXYsICIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkIGZvciBpbnRmMCAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJldHZhbCk7CisJCWRldl9lcnIoZGV2LCAidXNiX3N1Ym1pdF91cmIgZmFpbGVkIGZvciBpbnRmMCAoJWQpXG4iLCByZXR2YWwpOwogCQlhbGxvY19zdGF0dXMgPSA4OwogCQlnb3RvIHVubG9jazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKaW5kZXggMTljNWMyMS4uYzE0MDgzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwpAQCAtMTYxLDggKzE2MSw4IEBACiAJCQkgICAgIHx8IChub3cudHZfc2VjID09IHR2LnR2X3NlYwogCQkJCSAmJiBub3cudHZfdXNlYyA8IHR2LnR2X3VzZWMpKSk7CiAKLQl0aW1lZWxhcHNlZCA9ICgobm93LnR2X3NlYyArIDEgLSB0di50dl9zZWMpKjEwMDAwMDAKLQkJICAgICArIChub3cudHZfdXNlYyAtIHR2LnR2X3VzZWMpKTsKKwl0aW1lZWxhcHNlZCA9IChub3cudHZfc2VjICsgMSAtIHR2LnR2X3NlYykqMTAwMDAwMAorCQkgICAgICsgKG5vdy50dl91c2VjIC0gdHYudHZfdXNlYyk7CiAJaWYgKGNvdW50ID49IDEwMDAgJiYgdGltZWVsYXBzZWQgPiAwKSB7CiAJCWlmIChkZWZhdWx0X3RpbWVyID09IDApIHsKIAkJCS8qIGF1dG9kZXRlY3QgdGltZXIgKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJd2hpbGUgKGNvdW50IDwgbikgewogCQlpZiAocnB0ciAhPSB3cHRyKSB7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1Zitjb3VudCwgKGNoYXIgKikgJnJidWZbcnB0cl0sCisJCQlpZiAoY29weV90b191c2VyKGJ1Zitjb3VudCwgJnJidWZbcnB0cl0sCiAJCQkJCSBzaXplb2YoaW50KSkpIHsKIAkJCQlyZXN1bHQgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCmluZGV4IDRhMjY4MjAuLjllNTY3NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKQEAgLTE3MCw5ICsxNzAsNiBAQAogCWtmcmVlKGNvbnRleHQtPmRyaXZlci0+cmJ1Zik7CiAJa2ZyZWUoY29udGV4dC0+ZHJpdmVyKTsKIAlrZnJlZShjb250ZXh0KTsKLQotCWlmIChkZWJ1ZykKLQkJcHJfaW5mbygiJXM6IGNvbnRleHQgZGVsZXRlZFxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyX2Zyb21fbGlyYyhzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dCkKQEAgLTE4MiwxMCArMTc5LDEyIEBACiAKIAlyZXR2YWwgPSBsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKG1pbm9yKTsKIAlpZiAocmV0dmFsKQotCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZGVyZWdpc3RlciBmcm9tIGxpcmMgKCVkKVxuIiwKKwkJZGV2X2VycigmY29udGV4dC0+ZGV2LT5kZXYsCisJCQkiJXM6IHVuYWJsZSB0byBkZXJlZ2lzdGVyIGZyb20gbGlyYyAoJWQpXG4iLAogCQkgICAgICAgX19mdW5jX18sIHJldHZhbCk7CiAJZWxzZQotCQlwcl9pbmZvKCJEZXJlZ2lzdGVyZWQgU2FzZW0gZHJpdmVyIChtaW5vcjolZClcbiIsIG1pbm9yKTsKKwkJZGV2X2luZm8oJmNvbnRleHQtPmRldi0+ZGV2LAorCQkgICAgICAgICAiRGVyZWdpc3RlcmVkIFNhc2VtIGRyaXZlciAobWlub3I6JWQpXG4iLCBtaW5vcik7CiAKIH0KIApAQCAtMjE0LDkgKzIxMyw4IEBACiAJY29udGV4dCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAogCWlmICghY29udGV4dCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCSIlczogbm8gY29udGV4dCBmb3VuZCBmb3IgbWlub3IgJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3VibWlub3IpOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIm5vIGNvbnRleHQgZm91bmQgZm9yIG1pbm9yICVkXG4iLAorCQkJc3VibWlub3IpOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzMyLDEzICszMzAsMTMgQEAKIAljb250ZXh0LT50eF91cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCiAJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LT50eC5maW5pc2hlZCk7Ci0JYXRvbWljX3NldCgmKGNvbnRleHQtPnR4LmJ1c3kpLCAxKTsKKwlhdG9taWNfc2V0KCZjb250ZXh0LT50eC5idXN5LCAxKTsKIAogCXJldHZhbCA9ICB1c2Jfc3VibWl0X3VyYihjb250ZXh0LT50eF91cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXR2YWwpIHsKLQkJYXRvbWljX3NldCgmKGNvbnRleHQtPnR4LmJ1c3kpLCAwKTsKLQkJZGV2X2VycigmY29udGV4dC0+ZGV2LT5kZXYsICIlczogZXJyb3Igc3VibWl0dGluZyB1cmIgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXR2YWwpOworCQlhdG9taWNfc2V0KCZjb250ZXh0LT50eC5idXN5LCAwKTsKKwkJZGV2X2VycigmY29udGV4dC0+ZGV2LT5kZXYsICJlcnJvciBzdWJtaXR0aW5nIHVyYiAoJWQpXG4iLAorCQkJcmV0dmFsKTsKIAl9IGVsc2UgewogCQkvKiBXYWl0IGZvciB0cmFuc21pc3Npb24gdG8gY29tcGxldGUgKG9yIGFib3J0KSAqLwogCQltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKQEAgLTM0OCw4ICszNDYsNyBAQAogCQlyZXR2YWwgPSBjb250ZXh0LT50eC5zdGF0dXM7CiAJCWlmIChyZXR2YWwpCiAJCQlkZXZfZXJyKCZjb250ZXh0LT5kZXYtPmRldiwKLQkJCQkiJXM6IHBhY2tldCB0eCBmYWlsZWQgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwkJCQkicGFja2V0IHR4IGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOwogCX0KIAogCXJldHVybiByZXR2YWw7CkBAIC0zODksNyArMzg2LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWRhdGFfYnVmID0gbWVtZHVwX3VzZXIoKHZvaWQgY29uc3QgX191c2VyICopYnVmLCBuX2J5dGVzKTsKKwlkYXRhX2J1ZiA9IG1lbWR1cF91c2VyKGJ1Ziwgbl9ieXRlcyk7CiAJaWYgKElTX0VSUihkYXRhX2J1ZikpIHsKIAkJcmV0dmFsID0gUFRSX0VSUihkYXRhX2J1Zik7CiAJCWRhdGFfYnVmID0gTlVMTDsKQEAgLTQ0NCw4ICs0NDEsNyBAQAogCQlyZXR2YWwgPSBzZW5kX3BhY2tldChjb250ZXh0KTsKIAkJaWYgKHJldHZhbCkgewogCQkJZGV2X2VycigmY29udGV4dC0+ZGV2LT5kZXYsCi0JCQkJIiVzOiBzZW5kIHBhY2tldCBmYWlsZWQgZm9yIHBhY2tldCAjJWRcbiIsCi0JCQkJX19mdW5jX18sIGkpOworCQkJCSJzZW5kIHBhY2tldCBmYWlsZWQgZm9yIHBhY2tldCAjJWRcbiIsIGkpOwogCQkJZ290byBleGl0OwogCQl9CiAJfQpAQCAtNTA5LDggKzUwNSw3IEBACiAKIAlpZiAocmV0dmFsKQogCQlkZXZfZXJyKCZjb250ZXh0LT5kZXYtPmRldiwKLQkJCSIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkIGZvciBpcl9vcGVuICglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwkJCSJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgZm9yIGlyX29wZW4gKCVkKVxuIiwgcmV0dmFsKTsKIAllbHNlIHsKIAkJY29udGV4dC0+aXJfaXNvcGVuID0gMTsKIAkJZGV2X2luZm8oJmNvbnRleHQtPmRldi0+ZGV2LCAiSVIgcG9ydCBvcGVuZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zZXJpYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2VyaWFsLmMKaW5kZXggMTk2MjhkMC4uZGM3OTg0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zZXJpYWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkvKiBIb3cgbWFueSBjbG9ja3MgaW4gYSBtaWNyb3NlY29uZD8sIGF2b2lkaW5nIGxvbmcgbG9uZyBkaXZpZGUgKi8KIAl3b3JrID0gbG9vcHNfcGVyX3NlYzsKIAl3b3JrICo9IDQyOTU7ICAvKiA0Mjk1ID0gMl4zMiAvIDFlNiAqLwotCWNvbnZfdXNfdG9fY2xvY2tzID0gKHdvcmsgPj4gMzIpOworCWNvbnZfdXNfdG9fY2xvY2tzID0gd29yayA+PiAzMjsKIAogCS8qCiAJICogQ2FycmllciBwZXJpb2QgaW4gY2xvY2tzLCBhcHByb2FjaCBnb29kIHVwIHRvIDMyR0h6IGNsb2NrLApAQCAtNzg0LDcgKzc4NCw3IEBACiAKIAlyZXN1bHQgPSBkZXZtX3JlcXVlc3RfaXJxKCZkZXYtPmRldiwgaXJxLCBsaXJjX2lycV9oYW5kbGVyLAogCQkJICAgICAoc2hhcmVfaXJxID8gSVJRRl9TSEFSRUQgOiAwKSwKLQkJCSAgICAgTElSQ19EUklWRVJfTkFNRSwgKHZvaWQgKikmaGFyZHdhcmUpOworCQkJICAgICBMSVJDX0RSSVZFUl9OQU1FLCAmaGFyZHdhcmUpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCWlmIChyZXN1bHQgPT0gLUVCVVNZKQogCQkJZGV2X2VycigmZGV2LT5kZXYsICJJUlEgJWQgYnVzeVxuIiwgaXJxKTsKQEAgLTgzOCw3ICs4MzgsNyBAQAogCQkJCW5oaWdoKys7CiAJCQltc2xlZXAoNDApOwogCQl9Ci0JCXNlbnNlID0gKG5sb3cgPj0gbmhpZ2ggPyAxIDogMCk7CisJCXNlbnNlID0gbmxvdyA+PSBuaGlnaCA/IDEgOiAwOwogCQlkZXZfaW5mbygmZGV2LT5kZXYsICJhdXRvLWRldGVjdGVkIGFjdGl2ZSAlcyByZWNlaXZlclxuIiwKIAkJCSBzZW5zZSA/ICJsb3ciIDogImhpZ2giKTsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2lyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Npci5jCmluZGV4IDM5ZjQ3MzMuLjI5MDg3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2lyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zaXIuYwpAQCAtNjgzLDkgKzY4Myw3IEBACiAJfQogCXByX2luZm8oIkkvTyBwb3J0IDB4JS40eCwgSVJRICVkLlxuIiwgaW8sIGlycSk7CiAKLQlpbml0X3RpbWVyKCZ0aW1lcmxpc3QpOwotCXRpbWVybGlzdC5mdW5jdGlvbiA9IHNpcl90aW1lb3V0OwotCXRpbWVybGlzdC5kYXRhID0gMHhhYmFkY2FmZTsKKwlzZXR1cF90aW1lcigmdGltZXJsaXN0LCBzaXJfdGltZW91dCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfemlsb2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfemlsb2cuYwppbmRleCBlMTY2MjdjLi4yNjFlMjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3ppbG9nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY196aWxvZy5jCkBAIC0xMzQxLDggKzEzNDEsNyBAQAogCXN0cnVjdCBJUiAqaXIgPSBmaWxlcC0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGlyID09IE5VTEwpIHsKLQkJZGV2X2Vycihpci0+bC5kZXYsCi0JCQkiY2xvc2U6IG5vIHByaXZhdGVfZGF0YSBhdHRhY2hlZCB0byB0aGUgZmlsZSFcbiIpOworCQlwcl9lcnIoImlyOiBjbG9zZTogbm8gcHJpdmF0ZV9kYXRhIGF0dGFjaGVkIHRvIHRoZSBmaWxlIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL21uODg0NzIvbW44ODQ3Mi5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL21uODg0NzIvbW44ODQ3Mi5jCmluZGV4IDZlZWJlNTYuLjJhNjg1ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tbjg4NDcyL21uODg0NzIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbW44ODQ3Mi9tbjg4NDcyLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCQkJcmVtYWluaW5nIC09IChkZXYtPmkyY193cl9tYXggLSAxKSkgewogCQlsZW4gPSByZW1haW5pbmc7CiAJCWlmIChsZW4gPiAoZGV2LT5pMmNfd3JfbWF4IC0gMSkpCi0JCQlsZW4gPSAoZGV2LT5pMmNfd3JfbWF4IC0gMSk7CisJCQlsZW4gPSBkZXYtPmkyY193cl9tYXggLSAxOwogCiAJCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKGRldi0+cmVnbWFwWzBdLCAweGY2LAogCQkJCSZmdy0+ZGF0YVtmdy0+c2l6ZSAtIHJlbWFpbmluZ10sIGxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbW44ODQ3My9tbjg4NDczLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbW44ODQ3My9tbjg4NDczLmMKaW5kZXggYTMzMzc0NC4uNWJhZWIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL21uODg0NzMvbW44ODQ3My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tbjg4NDczL21uODg0NzMuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgIm1uODg0NzNfcHJpdi5oIgogCiBzdGF0aWMgaW50IG1uODg0NzNfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICpzKQorCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICpzKQogewogCXMtPm1pbl9kZWxheV9tcyA9IDEwMDA7CiAJcmV0dXJuIDA7CkBAIC0zMywxMCArMzMsMTQgQEAKIAl1OCBkZWxpdmVyeV9zeXN0ZW1fdmFsLCBpZl92YWxbM10sIGJ3X3ZhbFs3XTsKIAogCWRldl9kYmcoJmNsaWVudC0+ZGV2LAotCQkJImRlbGl2ZXJ5X3N5c3RlbT0ldSBtb2R1bGF0aW9uPSV1IGZyZXF1ZW5jeT0ldSBiYW5kd2lkdGhfaHo9JXUgc3ltYm9sX3JhdGU9JXUgaW52ZXJzaW9uPSVkIHN0cmVhbV9pZD0lZFxuIiwKLQkJCWMtPmRlbGl2ZXJ5X3N5c3RlbSwgYy0+bW9kdWxhdGlvbiwKLQkJCWMtPmZyZXF1ZW5jeSwgYy0+YmFuZHdpZHRoX2h6LCBjLT5zeW1ib2xfcmF0ZSwKLQkJCWMtPmludmVyc2lvbiwgYy0+c3RyZWFtX2lkKTsKKwkJImRlbGl2ZXJ5X3N5c3RlbT0ldSBtb2R1bGF0aW9uPSV1IGZyZXF1ZW5jeT0ldSBiYW5kd2lkdGhfaHo9JXUgc3ltYm9sX3JhdGU9JXUgaW52ZXJzaW9uPSVkIHN0cmVhbV9pZD0lZFxuIiwKKwkJYy0+ZGVsaXZlcnlfc3lzdGVtLAorCQljLT5tb2R1bGF0aW9uLAorCQljLT5mcmVxdWVuY3ksCisJCWMtPmJhbmR3aWR0aF9oeiwKKwkJYy0+c3ltYm9sX3JhdGUsCisJCWMtPmludmVyc2lvbiwKKwkJYy0+c3RyZWFtX2lkKTsKIAogCWlmICghZGV2LT53YXJtKSB7CiAJCXJldCA9IC1FQUdBSU47CkBAIC0xMTIsNyArMTE2LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJRiBmcmVxdWVuY3kgJWQgbm90IHN1cHBvcnRlZFxuIiwKLQkJCQlpZl9mcmVxdWVuY3kpOworCQkJaWZfZnJlcXVlbmN5KTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CiAJfQpAQCAtMjI5LDcgKzIzMyw3IEBACiAJfQogCiAJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiZG93bmxvYWRpbmcgZmlybXdhcmUgZnJvbSBmaWxlICclcydcbiIsCi0JCQlmd19maWxlKTsKKwkJIGZ3X2ZpbGUpOwogCiAJcmV0ID0gcmVnbWFwX3dyaXRlKGRldi0+cmVnbWFwWzBdLCAweGY1LCAweDAzKTsKIAlpZiAocmV0KQpAQCAtMjM5LDEzICsyNDMsMTMgQEAKIAkJCXJlbWFpbmluZyAtPSAoZGV2LT5pMmNfd3JfbWF4IC0gMSkpIHsKIAkJbGVuID0gcmVtYWluaW5nOwogCQlpZiAobGVuID4gKGRldi0+aTJjX3dyX21heCAtIDEpKQotCQkJbGVuID0gKGRldi0+aTJjX3dyX21heCAtIDEpOworCQkJbGVuID0gZGV2LT5pMmNfd3JfbWF4IC0gMTsKIAogCQlyZXQgPSByZWdtYXBfYnVsa193cml0ZShkZXYtPnJlZ21hcFswXSwgMHhmNiwKLQkJCQkmZnctPmRhdGFbZnctPnNpemUgLSByZW1haW5pbmddLCBsZW4pOworCQkJCQkmZnctPmRhdGFbZnctPnNpemUgLSByZW1haW5pbmddLCBsZW4pOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZpcm13YXJlIGRvd25sb2FkIGZhaWxlZD0lZFxuIiwKLQkJCQkJcmV0KTsKKwkJCQlyZXQpOwogCQkJZ290byBlcnI7CiAJCX0KIAl9CkBAIC0zMjUsNyArMzI5LDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgbW44ODQ3M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBtbjg4NDczX2NvbmZpZyAqY29uZmlnID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgbW44ODQ3M19kZXYgKmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3MuYwppbmRleCA0NGI4MWEyLi5lMGFkNWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzcy5jCkBAIC0xMTYwLDggKzExNjAsOCBAQAogCQlzdWJkZXYgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZpc3MtPnY0bDJfZGV2LCBhZGFwdGVyLAogCQkJCWJvYXJkX2luZm8tPmJvYXJkX2luZm8sIE5VTEwpOwogCQlpZiAoc3ViZGV2ID09IE5VTEwpIHsKLQkJCWRldl9lcnIoaXNzLT5kZXYsICIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIHN1YmRldiAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgYm9hcmRfaW5mby0+Ym9hcmRfaW5mby0+dHlwZSk7CisJCQlkZXZfZXJyKGlzcy0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHN1YmRldiAlc1xuIiwKKwkJCQlib2FyZF9pbmZvLT5ib2FyZF9pbmZvLT50eXBlKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTExODUsMTYgKzExODUsMTYgQEAKIAlpc3MtPm1lZGlhX2Rldi5saW5rX25vdGlmeSA9IGlzc19waXBlbGluZV9saW5rX25vdGlmeTsKIAlyZXQgPSBtZWRpYV9kZXZpY2VfcmVnaXN0ZXIoJmlzcy0+bWVkaWFfZGV2KTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGlzcy0+ZGV2LCAiJXM6IE1lZGlhIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKKwkJZGV2X2Vycihpc3MtPmRldiwgIk1lZGlhIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCisJCQlyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCWlzcy0+djRsMl9kZXYubWRldiA9ICZpc3MtPm1lZGlhX2RldjsKIAlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcihpc3MtPmRldiwgJmlzcy0+djRsMl9kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaXNzLT5kZXYsICIlczogVjRMMiBkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCWRldl9lcnIoaXNzLT5kZXYsICJWNEwyIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCisJCQlyZXQpOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0xMjUyLDggKzEyNTIsOCBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoaXNzLT5kZXYsICIlczogaW52YWxpZCBpbnRlcmZhY2UgdHlwZSAldVxuIiwKLQkJCQlfX2Z1bmNfXywgc3ViZGV2cy0+aW50ZXJmYWNlKTsKKwkJCWRldl9lcnIoaXNzLT5kZXYsICJpbnZhbGlkIGludGVyZmFjZSB0eXBlICV1XG4iLAorCQkJCXN1YmRldnMtPmludGVyZmFjZSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBkb25lOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmMKaW5kZXggNjk1NTA0NC4uNTU5MzhjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc192aWRlby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfdmlkZW8uYwpAQCAtMTIyMSw4ICsxMjIxLDcgQEAKIAlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnZpZGVvLT52aWRlbywgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKHZpZGVvLT5pc3MtPmRldiwKLQkJCSIlczogY291bGQgbm90IHJlZ2lzdGVyIHZpZGVvIGRldmljZSAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCQkiY291bGQgbm90IHJlZ2lzdGVyIHZpZGVvIGRldmljZSAoJWQpXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tdDI5Zl9zcGluYW5kL210MjlmX3NwaW5hbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tdDI5Zl9zcGluYW5kL210MjlmX3NwaW5hbmQuYwppbmRleCAzYjE5MWZjLi43Mjg1YzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbXQyOWZfc3BpbmFuZC9tdDI5Zl9zcGluYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL210MjlmX3NwaW5hbmQvbXQyOWZfc3BpbmFuZC5jCkBAIC03NzAsNyArNzcwLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBOQU5EX0NNRF9SRUFESUQ6CiAJCXN0YXRlLT5idWZfcHRyID0gMDsKLQkJc3BpbmFuZF9yZWFkX2lkKGluZm8tPnNwaSwgKHU4ICopc3RhdGUtPmJ1Zik7CisJCXNwaW5hbmRfcmVhZF9pZChpbmZvLT5zcGksIHN0YXRlLT5idWYpOwogCQlicmVhazsKIAljYXNlIE5BTkRfQ01EX1BBUkFNOgogCQlzdGF0ZS0+YnVmX3B0ciA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwppbmRleCBlOGFhZTA5Li44YWUwMTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJICogQWxsb2NhdGUgb3VyIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUgYW5kIGF0dGFjaCBpdCB0byB0aGUgZGV2aWNlLgogCSAqLwogCWFkYXB0ZXIgPSAoc3RydWN0IHhscl9hZGFwdGVyICopCi0JCWRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoYWRhcHRlciksIEdGUF9LRVJORUwpOworCQlkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCphZGFwdGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhZGFwdGVyKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvS2NvbmZpZwppbmRleCA5NDc1ZTIwLi5lM2E4OWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL0tjb25maWcKQEAgLTYsNiArNiw5IEBACiAJICAgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGEgblZpZGlhIGNvbXBsaWFudCBlbWJlZGRlZAogCSAgICBjb250cm9sbGVyLgogCisJICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorICAgICAgICAgICAgY2FsbGVkIG1mZC1udmVjCisKIGNvbmZpZyBLRVlCT0FSRF9OVkVDCiAJdHJpc3RhdGUgIktleWJvYXJkIG9uIG5WaWRpYSBjb21wbGlhbnQgRUMiCiAJZGVwZW5kcyBvbiBNRkRfTlZFQyAmJiBJTlBVVApAQCAtMTMsNiArMTYsOSBAQAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYSBrZXlib2FyZCBjb25uZWN0ZWQgdG8KIAkgIGEgblZpZGlhIGNvbXBsaWFudCBlbWJlZGRlZCBjb250cm9sbGVyLgogCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKyAgICAgICAgICBjYWxsZWQga2V5Ym9hcmQtbnZlYworCiBjb25maWcgU0VSSU9fTlZFQ19QUzIKIAl0cmlzdGF0ZSAiUFMyIG9uIG5WaWRpYSBFQyIKIAlkZXBlbmRzIG9uIE1GRF9OVkVDICYmIFNFUklPCkBAIC0yMCw2ICsyNiwxMCBAQAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYSBUb3VjaHBhZCAvIE1vdXNlIGNvbm5lY3RlZAogCSAgdG8gYSBuVmlkaWEgY29tcGxpYW50IGVtYmVkZGVkIGNvbnRyb2xsZXIuCiAKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorICAgICAgICAgIGNhbGxlZCBzZXJpby1udmVjLXBzMgorCisKIGNvbmZpZyBOVkVDX1BPV0VSCiAJdHJpc3RhdGUgIk5WRUMgY2hhcmdlciBhbmQgYmF0dGVyeSIKIAlkZXBlbmRzIG9uIE1GRF9OVkVDICYmIFBPV0VSX1NVUFBMWQpAQCAtMjcsOSArMzcsMTcgQEAKIAkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJ5IGFuZCBjaGFyZ2VyIGludGVyZmFjZSBmb3IKIAkgIG5WaWRpYSBjb21wbGlhbnQgZW1iZWRkZWQgY29udHJvbGxlcnMuCiAKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorICAgICAgICAgIGNhbGxlZCBudmVjLXBvd2VyCisKKwogY29uZmlnIE5WRUNfUEFaMDAKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgT0VNIHNwZWNpZmljIGZ1bmN0aW9ucyBvbiBDb21wYWwgUEFaMDAgYmFzZWQgZGV2aWNlcyIKIAlkZXBlbmRzIG9uIE1GRF9OVkVDICYmIExFRFNfQ0xBU1MKIAloZWxwCiAJICBTYXkgWSB0byBlbmFibGUgY29udHJvbCBvZiB0aGUgeWVsbG93IHNpZGUgbGVkcyBvbiBDb21wYWwgUEFaMDAgYmFzZWQKIAkgIGRldmljZXMsIGUuZy4gVG9zaGJpYSBBQzEwMCBhbmQgRHluYWJvb2tzIEFaIG5ldGJvb2tzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKyAgICAgICAgICBjYWxsZWQgbnZlYy1wYXowMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMKaW5kZXggNTg2OGViYi4uMWJkYzhkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYwpAQCAtODAzLDcgKzgwMyw3IEBACiAJfQogCiAJbnZlYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG52ZWNfY2hpcCksIEdGUF9LRVJORUwpOwotCWlmIChudmVjID09IE5VTEwpCisJaWYgKCFudmVjKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG52ZWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wYXowMC5jIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wYXowMC5jCmluZGV4IGYwY2VhMGUuLjY4MTQ2YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcGF6MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BhejAwLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWxlZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmxlZCksIEdGUF9LRVJORUwpOwotCWlmIChsZWQgPT0gTlVMTCkKKwlpZiAoIWxlZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlsZWQtPmNkZXYubWF4X2JyaWdodG5lc3MgPSBOVkVDX0xFRF9NQVg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3Bvd2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3Bvd2VyLmMKaW5kZXggMzBiNjZjMy4uMDRhNzQwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wb3dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcG93ZXIuYwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCiAJcG93ZXIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBudmVjX3Bvd2VyKSwgR0ZQX05PV0FJVCk7Ci0JaWYgKHBvd2VyID09IE5VTEwpCisJaWYgKCFwb3dlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgcG93ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMKaW5kZXggNGZkNjNjMi4uNmViYmM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BzMi5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAljaGFyIG1vdXNlX3Jlc2V0W10gPSB7IE5WRUNfUFMyLCBTRU5EX0NPTU1BTkQsIFBTTU9VU0VfUlNULCAzIH07CiAKIAlzZXJfZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc2VyaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2VyX2RldiA9PSBOVUxMKQorCWlmICghc2VyX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzZXJfZGV2LT5pZC50eXBlID0gU0VSSU9fUFNfUFNUSFJVOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCmluZGV4IDFkYWViMzEuLjllNTQ3NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKQEAgLTIxNCwxNSArMjE0LDE0IEBACiAvKioKICAqIGVudW0gY3ZteF91c2JfcGlwZV9mbGFncyAtIGludGVybmFsIGZsYWdzIGZvciBhIHBpcGUuCiAgKgotICogQF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQ6IFVzZWQgaW50ZXJuYWxseSB0byBkZXRlcm1pbmUgaWYgYSBwaXBlIGlzCi0gKgkJCQkgICAgIGFjdGl2ZWx5IHVzaW5nIGhhcmR3YXJlLiBEbyBub3QgdXNlLgotICogQF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc6IFVzZWQgaW50ZXJuYWxseSB0byBkZXRlcm1pbmUgaWYgYSBoaWdoCi0gKgkJCQkgICAgIHNwZWVkIHBpcGUgaXMgaW4gdGhlIHBpbmcgc3RhdGUuIERvIG5vdAotICoJCQkJICAgICB1c2UuCisgKiBAQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQ6IFVzZWQgaW50ZXJuYWxseSB0byBkZXRlcm1pbmUgaWYgYSBwaXBlIGlzCisgKgkJCQkgICBhY3RpdmVseSB1c2luZyBoYXJkd2FyZS4KKyAqIEBDVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORzogVXNlZCBpbnRlcm5hbGx5IHRvIGRldGVybWluZSBpZiBhIGhpZ2ggc3BlZWQKKyAqCQkJCSAgIHBpcGUgaXMgaW4gdGhlIHBpbmcgc3RhdGUuCiAgKi8KIGVudW0gY3ZteF91c2JfcGlwZV9mbGFncyB7Ci0JX19DVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRAk9IDEgPDwgMTcsCi0JX19DVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORwk9IDEgPDwgMTgsCisJQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQJPSAxIDw8IDE3LAorCUNWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HCT0gMSA8PCAxOCwKIH07CiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGZhaWxlZCB0cmFuc2FjdGlvbnMgKi8KQEAgLTIzMSwxNSArMjMwLDYgQEAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGhhcmR3YXJlIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgVVNCIGJsb2NrICovCiAjZGVmaW5lIE1BWF9DSEFOTkVMUwkJOAogCi0vKiBUaGUgaGlnaGVzdCB2YWxpZCBVU0IgZGV2aWNlIGFkZHJlc3MgKi8KLSNkZWZpbmUgTUFYX1VTQl9BRERSRVNTCQkxMjcKLQotLyogVGhlIGhpZ2hlc3QgdmFsaWQgVVNCIGVuZHBvaW50IG51bWJlciAqLwotI2RlZmluZSBNQVhfVVNCX0VORFBPSU5UCTE1Ci0KLS8qIFRoZSBoaWdoZXN0IHZhbGlkIHBvcnQgbnVtYmVyIG9uIGEgaHViICovCi0jZGVmaW5lIE1BWF9VU0JfSFVCX1BPUlQJMTUKLQogLyoKICAqIFRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgY2FuIHRyYW5zZmVyIGEgbWF4aW11bSBvZiB0aGlzIG51bWJlciBvZiBieXRlcyBpbiBlYWNoCiAgKiB0cmFuc2Zlci4gVGhlIGZpZWxkIGlzIDE5IGJpdHMgd2lkZQpAQCAtNDAzLDE2ICszOTMsMTggQEAKIAlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgdXNiOwogfTsKIAotLyogVGhpcyBtYWNybyBzcGlucyBvbiBhIGZpZWxkIHdhaXRpbmcgZm9yIGl0IHRvIHJlYWNoIGEgdmFsdWUgKi8KLSNkZWZpbmUgQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKGFkZHJlc3MsIHR5cGUsIGZpZWxkLCBvcCwgdmFsdWUsIHRpbWVvdXRfdXNlYylcCisvKiBUaGlzIG1hY3JvIHNwaW5zIG9uIGEgcmVnaXN0ZXIgd2FpdGluZyBmb3IgaXQgdG8gcmVhY2ggYSBjb25kaXRpb24uICovCisjZGVmaW5lIENWTVhfV0FJVF9GT1JfRklFTEQzMihhZGRyZXNzLCBfdW5pb24sIGNvbmQsIHRpbWVvdXRfdXNlYykJICAgIFwKIAkoe2ludCByZXN1bHQ7CQkJCQkJCSAgICBcCiAJZG8gewkJCQkJCQkJICAgIFwKIAkJdWludDY0X3QgZG9uZSA9IGN2bXhfZ2V0X2N5Y2xlKCkgKyAodWludDY0X3QpdGltZW91dF91c2VjICogXAogCQkJb2N0ZW9uX2dldF9jbG9ja19yYXRlKCkgLyAxMDAwMDAwOwkJICAgIFwKLQkJdHlwZSBjOwkJCQkJCQkgICAgXAorCQl1bmlvbiBfdW5pb24gYzsJCQkJCQkgICAgXAorCQkJCQkJCQkJICAgIFwKIAkJd2hpbGUgKDEpIHsJCQkJCQkgICAgXAotCQkJYy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBhZGRyZXNzKTsJICAgIFwKLQkJCWlmIChjLnMuZmllbGQgb3AgKHZhbHVlKSkgewkJCSAgICBcCisJCQljLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBhZGRyZXNzKTsJICAgIFwKKwkJCQkJCQkJCSAgICBcCisJCQlpZiAoY29uZCkgewkJCQkJICAgIFwKIAkJCQlyZXN1bHQgPSAwOwkJCQkgICAgXAogCQkJCWJyZWFrOwkJCQkJICAgIFwKIAkJCX0gZWxzZSBpZiAoY3ZteF9nZXRfY3ljbGUoKSA+IGRvbmUpIHsJCSAgICBcCkBAIC00MjgsMTIgKzQyMCwxMyBAQAogICogVGhpcyBtYWNybyBsb2dpY2FsbHkgc2V0cyBhIHNpbmdsZSBmaWVsZCBpbiBhIENTUi4gSXQgZG9lcyB0aGUgc2VxdWVuY2UKICAqIHJlYWQsIG1vZGlmeSwgYW5kIHdyaXRlCiAgKi8KLSNkZWZpbmUgVVNCX1NFVF9GSUVMRDMyKGFkZHJlc3MsIHR5cGUsIGZpZWxkLCB2YWx1ZSkJCVwKKyNkZWZpbmUgVVNCX1NFVF9GSUVMRDMyKGFkZHJlc3MsIF91bmlvbiwgZmllbGQsIHZhbHVlKQkJXAogCWRvIHsJCQkJCQkJXAotCQl0eXBlIGM7CQkJCQkJXAotCQljLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIGFkZHJlc3MpOwlcCisJCXVuaW9uIF91bmlvbiBjOwkJCQkJXAorCQkJCQkJCQlcCisJCWMudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIGFkZHJlc3MpOwlcCiAJCWMucy5maWVsZCA9IHZhbHVlOwkJCQlcCi0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBhZGRyZXNzLCBjLnUzMik7CVwKKwkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBhZGRyZXNzLCBjLnUzMik7CVwKIAl9IHdoaWxlICgwKQogCiAvKiBSZXR1cm5zIHRoZSBJTyBhZGRyZXNzIHRvIHB1c2gvcG9wIHN0dWZmIGRhdGEgZnJvbSB0aGUgRklGT3MgKi8KQEAgLTQ0Miw3ICs0MzUsNiBAQAogCiAvKioKICAqIHN0cnVjdCBvY3Rlb25fdGVtcF9idWZmZXIgLSBhIGJvdW5jZSBidWZmZXIgZm9yIFVTQiB0cmFuc2ZlcnMKLSAqIEB0ZW1wX2J1ZmZlcjogdGhlIG5ld2x5IGFsbG9jYXRlZCB0ZW1wb3JhcnkgYnVmZmVyIChpbmNsdWRpbmcgbWV0YS1kYXRhKQogICogQG9yaWdfYnVmZmVyOiB0aGUgb3JpZ2luYWwgYnVmZmVyIHBhc3NlZCBieSB0aGUgVVNCIHN0YWNrCiAgKiBAZGF0YToJIHRoZSBuZXdseSBhbGxvY2F0ZWQgdGVtcG9yYXJ5IGJ1ZmZlciAoZXhjbHVkaW5nIG1ldGEtZGF0YSkKICAqCkBAIC00NTEsNyArNDQzLDYgQEAKICAqIHJlcHJlc2VudHMgaXQuCiAgKi8KIHN0cnVjdCBvY3Rlb25fdGVtcF9idWZmZXIgewotCXZvaWQgKnRlbXBfYnVmZmVyOwogCXZvaWQgKm9yaWdfYnVmZmVyOwogCXU4IGRhdGFbMF07CiB9OwpAQCAtNDg5LDcgKzQ4MCw2IEBACiAJaWYgKCF0ZW1wKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXRlbXAtPnRlbXBfYnVmZmVyID0gdGVtcDsKIAl0ZW1wLT5vcmlnX2J1ZmZlciA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWlmICh1c2JfdXJiX2Rpcl9vdXQodXJiKSkKIAkJbWVtY3B5KHRlbXAtPmRhdGEsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLApAQCAtNTIwLDcgKzUxMCw3IEBACiAJCSAgICAgICB1cmItPmFjdHVhbF9sZW5ndGgpOwogCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdGVtcC0+b3JpZ19idWZmZXI7CiAJdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FMSUdORURfVEVNUF9CVUZGRVI7Ci0Ja2ZyZWUodGVtcC0+dGVtcF9idWZmZXIpOworCWtmcmVlKHRlbXApOwogfQogCiAvKioKQEAgLTU2Niw4ICs1NTYsOCBAQAogICoKICAqIFJldHVybnM6IFJlc3VsdCBvZiB0aGUgcmVhZAogICovCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fY3ZteF91c2JfcmVhZF9jc3IzMihzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJICAgICB1aW50NjRfdCBhZGRyZXNzKQorc3RhdGljIGlubGluZSB1aW50MzJfdCBjdm14X3VzYl9yZWFkX2NzcjMyKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQkgICB1aW50NjRfdCBhZGRyZXNzKQogewogCXVpbnQzMl90IHJlc3VsdCA9IGN2bXhfcmVhZDY0X3VpbnQzMihhZGRyZXNzIF4gNCk7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTU4Myw0NSArNTczLDEzIEBACiAgKiBAYWRkcmVzczogNjRiaXQgYWRkcmVzcyB0byB3cml0ZQogICogQHZhbHVlOiAgIFZhbHVlIHRvIHdyaXRlCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkgIHVpbnQ2NF90IGFkZHJlc3MsIHVpbnQzMl90IHZhbHVlKQorc3RhdGljIGlubGluZSB2b2lkIGN2bXhfdXNiX3dyaXRlX2NzcjMyKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQl1aW50NjRfdCBhZGRyZXNzLCB1aW50MzJfdCB2YWx1ZSkKIHsKIAljdm14X3dyaXRlNjRfdWludDMyKGFkZHJlc3MgXiA0LCB2YWx1ZSk7CiAJY3ZteF9yZWFkNjRfdWludDY0KENWTVhfVVNCTlhfRE1BMF9JTkJfQ0hOMCh1c2ItPmluZGV4KSk7CiB9CiAKLQotLyoqCi0gKiBSZWFkIGEgVVNCIDY0Yml0IENTUi4gSXQgbG9ncyB0aGUgdmFsdWUgaW4gYSByZWFkYWJsZSBmb3JtYXQgaWYKLSAqIGRlYnVnZ2luZyBpcyBvbi4KLSAqCi0gKiBAdXNiOiAgICAgVVNCIGJsb2NrIHRoaXMgYWNjZXNzIGlzIGZvcgotICogQGFkZHJlc3M6IDY0Yml0IGFkZHJlc3MgdG8gcmVhZAotICoKLSAqIFJldHVybnM6IFJlc3VsdCBvZiB0aGUgcmVhZAotICovCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IF9fY3ZteF91c2JfcmVhZF9jc3I2NChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJICAgICB1aW50NjRfdCBhZGRyZXNzKQotewotCXVpbnQ2NF90IHJlc3VsdCA9IGN2bXhfcmVhZDY0X3VpbnQ2NChhZGRyZXNzKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogV3JpdGUgYSBVU0IgNjRiaXQgQ1NSLiBJdCBsb2dzIHRoZSB2YWx1ZSBpbiBhIHJlYWRhYmxlIGZvcm1hdAotICogaWYgZGVidWdnaW5nIGlzIG9uLgotICoKLSAqIEB1c2I6ICAgICBVU0IgYmxvY2sgdGhpcyBhY2Nlc3MgaXMgZm9yCi0gKiBAYWRkcmVzczogNjRiaXQgYWRkcmVzcyB0byB3cml0ZQotICogQHZhbHVlOiAgIFZhbHVlIHRvIHdyaXRlCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2N2bXhfdXNiX3dyaXRlX2NzcjY0KHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkgIHVpbnQ2NF90IGFkZHJlc3MsIHVpbnQ2NF90IHZhbHVlKQotewotCWN2bXhfd3JpdGU2NF91aW50NjQoYWRkcmVzcywgdmFsdWUpOwotfQotCiAvKioKICAqIFJldHVybiBub24gemVybyBpZiB0aGlzIHBpcGUgY29ubmVjdHMgdG8gYSBub24gSElHSCBzcGVlZAogICogZGV2aWNlIHRocm91Z2ggYSBoaWdoIHNwZWVkIGh1Yi4KQEAgLTYzMSw4ICs1ODksOCBAQAogICoKICAqIFJldHVybnM6IE5vbiB6ZXJvIGlmIHdlIG5lZWQgdG8gZG8gc3BsaXQgdHJhbnNhY3Rpb25zCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJICAgICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUpCitzdGF0aWMgaW5saW5lIGludCBjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQkgICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUpCiB7CiAJcmV0dXJuIHBpcGUtPmRldmljZV9zcGVlZCAhPSBDVk1YX1VTQl9TUEVFRF9ISUdIICYmCiAJICAgICAgIHVzYi0+dXNiY3hfaHBydC5zLnBydHNwZCA9PSBDVk1YX1VTQl9TUEVFRF9ISUdIOwpAQCAtNjQ2LDQ4ICs2MDQsMTE5IEBACiAgKgogICogUmV0dXJuczogUElEIGZvciBwaXBlCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlKQorc3RhdGljIGlubGluZSBpbnQgY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlKQogewogCWlmIChwaXBlLT5waWRfdG9nZ2xlKQogCQlyZXR1cm4gMjsgLyogRGF0YTEgKi8KIAlyZXR1cm4gMDsgLyogRGF0YTAgKi8KIH0KIAorc3RhdGljIHZvaWQgY3ZteF9maWZvX3NldHVwKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiKQoreworCXVuaW9uIGN2bXhfdXNiY3hfZ2h3Y2ZnMyB1c2JjeF9naHdjZmczOworCXVuaW9uIGN2bXhfdXNiY3hfZ25wdHhmc2l6IG5wc2l6OworCXVuaW9uIGN2bXhfdXNiY3hfaHB0eGZzaXogcHNpejsKKworCXVzYmN4X2dod2NmZzMudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCQlDVk1YX1VTQkNYX0dIV0NGRzModXNiLT5pbmRleCkpOworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBVU0JDX0dSWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIG9mIHRoZSByZWNlaXZlCisJICogRklGTyAoMjUlKS4KKwkgKi8KKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlhGU0laKHVzYi0+aW5kZXgpLCBjdm14X3VzYmN4X2dyeGZzaXosCisJCQlyeGZkZXAsIHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNCk7CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIFVTQkNfR05QVFhGU0laIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgc2l6ZSBhbmQgdGhlIHN0YXJ0CisJICogYWRkcmVzcyBvZiB0aGUgbm9uLXBlcmlvZGljIHRyYW5zbWl0IEZJRk8gZm9yIG5vbnBlcmlvZGljCisJICogdHJhbnNhY3Rpb25zICg1MCUpLgorCSAqLworCW5wc2l6LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dOUFRYRlNJWih1c2ItPmluZGV4KSk7CisJbnBzaXoucy5ucHR4ZmRlcCA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gMjsKKwlucHNpei5zLm5wdHhmc3RhZGRyID0gdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0OworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HTlBUWEZTSVoodXNiLT5pbmRleCksIG5wc2l6LnUzMik7CisKKwkvKgorCSAqIFByb2dyYW0gdGhlIFVTQkNfSFBUWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIGFuZCBzdGFydAorCSAqIGFkZHJlc3Mgb2YgdGhlIHBlcmlvZGljIHRyYW5zbWl0IEZJRk8gZm9yIHBlcmlvZGljIHRyYW5zYWN0aW9ucworCSAqICgyNSUpLgorCSAqLworCXBzaXoudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBUWEZTSVoodXNiLT5pbmRleCkpOworCXBzaXoucy5wdHhmc2l6ZSA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNDsKKwlwc2l6LnMucHR4ZnN0YWRkciA9IDMgKiB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7CisJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpLCBwc2l6LnUzMik7CisKKwkvKiBGbHVzaCBhbGwgRklGT3MgKi8KKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJY3ZteF91c2JjeF9ncnN0Y3RsLCB0eGZudW0sIDB4MTApOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQljdm14X3VzYmN4X2dyc3RjdGwsIHR4ZmZsc2gsIDEpOworCUNWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQkgICAgICBjdm14X3VzYmN4X2dyc3RjdGwsIGMucy50eGZmbHNoID09IDAsIDEwMCk7CisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCWN2bXhfdXNiY3hfZ3JzdGN0bCwgcnhmZmxzaCwgMSk7CisJQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCSAgICAgIGN2bXhfdXNiY3hfZ3JzdGN0bCwgYy5zLnJ4ZmZsc2ggPT0gMCwgMTAwKTsKK30KKworLyoqCisgKiBTaHV0ZG93biBhIFVTQiBwb3J0IGFmdGVyIGEgY2FsbCB0byBjdm14X3VzYl9pbml0aWFsaXplKCkuCisgKiBUaGUgcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQgd2l0aCBhbGwgcGlwZXMgY2xvc2VkIHdoZW4gdGhpcworICogZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIEB1c2I6IFVTQiBkZXZpY2Ugc3RhdGUgcG9wdWxhdGVkIGJ5IGN2bXhfdXNiX2luaXRpYWxpemUoKS4KKyAqCisgKiBSZXR1cm5zOiAwIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBjdm14X3VzYl9zaHV0ZG93bihzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKK3sKKwl1bmlvbiBjdm14X3VzYm54X2Nsa19jdGwgdXNibl9jbGtfY3RsOworCisJLyogTWFrZSBzdXJlIGFsbCBwaXBlcyBhcmUgY2xvc2VkICovCisJaWYgKCFsaXN0X2VtcHR5KCZ1c2ItPmlkbGVfcGlwZXMpIHx8CisJICAgICFsaXN0X2VtcHR5KCZ1c2ItPmFjdGl2ZV9waXBlc1tDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VU10pIHx8CisJICAgICFsaXN0X2VtcHR5KCZ1c2ItPmFjdGl2ZV9waXBlc1tDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFRdKSB8fAorCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTF0pIHx8CisJICAgICFsaXN0X2VtcHR5KCZ1c2ItPmFjdGl2ZV9waXBlc1tDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLXSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBEaXNhYmxlIHRoZSBjbG9ja3MgYW5kIHB1dCB0aGVtIGluIHBvd2VyIG9uIHJlc2V0ICovCisJdXNibl9jbGtfY3RsLnU2NCA9IGN2bXhfcmVhZDY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOworCXVzYm5fY2xrX2N0bC5zLmVuYWJsZSA9IDE7CisJdXNibl9jbGtfY3RsLnMucG9yID0gMTsKKwl1c2JuX2Nsa19jdGwucy5oY2xrX3JzdCA9IDE7CisJdXNibl9jbGtfY3RsLnMucHJzdCA9IDA7CisJdXNibl9jbGtfY3RsLnMuaHJzdCA9IDA7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksIHVzYm5fY2xrX2N0bC51NjQpOworCXJldHVybiAwOworfQorCiAvKioKICAqIEluaXRpYWxpemUgYSBVU0IgcG9ydCBmb3IgdXNlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkKICAqIG90aGVyIGFjY2VzcyB0byB0aGUgT2N0ZW9uIFVTQiBwb3J0IGlzIG1hZGUuIFRoZSBwb3J0IHN0YXJ0cwogICogb2ZmIGluIHRoZSBkaXNhYmxlZCBzdGF0ZS4KICAqCi0gKiBAdXNiOgkgUG9pbnRlciB0byBhbiBlbXB0eSBzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUKLSAqCQkgdGhhdCB3aWxsIGJlIHBvcHVsYXRlZCBieSB0aGUgaW5pdGlhbGl6ZSBjYWxsLgotICoJCSBUaGlzIHN0cnVjdHVyZSBpcyB0aGVuIHBhc3NlZCB0byBhbGwgb3RoZXIgVVNCCi0gKgkJIGZ1bmN0aW9ucy4KLSAqIEB1c2JfcG9ydF9udW1iZXI6Ci0gKgkJIFdoaWNoIE9jdGVvbiBVU0IgcG9ydCB0byBpbml0aWFsaXplLgorICogQGRldjoJIFBvaW50ZXIgdG8gc3RydWN0IGRldmljZSBmb3IgbG9nZ2luZyBwdXJwb3Nlcy4KKyAqIEB1c2I6CSBQb2ludGVyIHRvIHN0cnVjdCBjdm14X3VzYl9zdGF0ZS4KICAqCiAgKiBSZXR1cm5zOiAwIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqLwotc3RhdGljIGludCBjdm14X3VzYl9pbml0aWFsaXplKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJICAgICAgIGludCB1c2JfcG9ydF9udW1iZXIsCi0JCQkgICAgICAgZW51bSBjdm14X3VzYl9pbml0aWFsaXplX2ZsYWdzIGZsYWdzKQorc3RhdGljIGludCBjdm14X3VzYl9pbml0aWFsaXplKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKIHsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgZGl2aXNvcjsKKwlpbnQgcmV0cmllcyA9IDA7CisJdW5pb24gY3ZteF91c2JjeF9oY2ZnIHVzYmN4X2hjZmc7CiAJdW5pb24gY3ZteF91c2JueF9jbGtfY3RsIHVzYm5fY2xrX2N0bDsKKwl1bmlvbiBjdm14X3VzYmN4X2dpbnRzdHMgdXNiY19naW50c3RzOworCXVuaW9uIGN2bXhfdXNiY3hfZ2FoYmNmZyB1c2JjeF9nYWhiY2ZnOworCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zayB1c2JjeF9naW50bXNrOworCXVuaW9uIGN2bXhfdXNiY3hfZ3VzYmNmZyB1c2JjeF9ndXNiY2ZnOwogCXVuaW9uIGN2bXhfdXNibnhfdXNicF9jdGxfc3RhdHVzIHVzYm5fdXNicF9jdGxfc3RhdHVzOwotCWludCBpOwogCi0JLyogQXQgZmlyc3QgYWxsb3cgMC0xIGZvciB0aGUgdXNiIHBvcnQgbnVtYmVyICovCi0JaWYgKCh1c2JfcG9ydF9udW1iZXIgPCAwKSB8fCAodXNiX3BvcnRfbnVtYmVyID4gMSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVtc2V0KHVzYiwgMCwgc2l6ZW9mKCp1c2IpKTsKLQl1c2ItPmluaXRfZmxhZ3MgPSBmbGFnczsKLQotCS8qIEluaXRpYWxpemUgdGhlIFVTQiBzdGF0ZSBzdHJ1Y3R1cmUgKi8KLQl1c2ItPmluZGV4ID0gdXNiX3BvcnRfbnVtYmVyOwotCUlOSVRfTElTVF9IRUFEKCZ1c2ItPmlkbGVfcGlwZXMpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHVzYi0+YWN0aXZlX3BpcGVzKTsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmdXNiLT5hY3RpdmVfcGlwZXNbaV0pOwotCityZXRyeToKIAkvKgogCSAqIFBvd2VyIE9uIFJlc2V0IGFuZCBQSFkgSW5pdGlhbGl6YXRpb24KIAkgKgpAQCAtNjk2LDggKzcyNSw3IEBACiAJICogMmEuIFdyaXRlIFVTQk4wLzFfQ0xLX0NUTFtQT1JdID0gMSBhbmQKIAkgKiAgICAgVVNCTjAvMV9DTEtfQ1RMW0hSU1QsUFJTVCxIQ0xLX1JTVF0gPSAwCiAJICovCi0JdXNibl9jbGtfY3RsLnU2NCA9Ci0JCV9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSk7CisJdXNibl9jbGtfY3RsLnU2NCA9IGN2bXhfcmVhZDY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOwogCXVzYm5fY2xrX2N0bC5zLnBvciA9IDE7CiAJdXNibl9jbGtfY3RsLnMuaHJzdCA9IDA7CiAJdXNibl9jbGtfY3RsLnMucHJzdCA9IDA7CkBAIC03MjIsNyArNzUwLDggQEAKIAkJCS8qIEZyb20gQ041MlhYIG1hbnVhbCAqLwogCQkJdXNibl9jbGtfY3RsLnMucF9ydHlwZSA9IDE7CiAKLQkJc3dpdGNoIChmbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfQ0xPQ0tfTUhaX01BU0spIHsKKwkJc3dpdGNoICh1c2ItPmluaXRfZmxhZ3MgJgorCQkJQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19DTE9DS19NSFpfTUFTSykgewogCQljYXNlIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfQ0xPQ0tfMTJNSFo6CiAJCQl1c2JuX2Nsa19jdGwucy5wX2Nfc2VsID0gMDsKIAkJCWJyZWFrOwpAQCAtNzUyLDIwICs3ODEsMTcgQEAKIAkgKiAgICAgc2V0dGluZyBVU0JOMC8xX0NMS19DVExbRU5BQkxFXSA9IDEuIERpdmlkZSB0aGUgY29yZSBjbG9jayBkb3duCiAJICogICAgIHN1Y2ggdGhhdCBVU0IgaXMgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gMTI1TWh6CiAJICovCi0JewotCQlpbnQgZGl2aXNvciA9IERJVl9ST1VORF9VUChvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKSwgMTI1MDAwMDAwKTsKLQkJLyogTG93ZXIgdGhhbiA0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHByb3Blcmx5ICovCi0JCWlmIChkaXZpc29yIDwgNCkKLQkJCWRpdmlzb3IgPSA0OwotCQl1c2JuX2Nsa19jdGwucy5kaXZpZGUgPSBkaXZpc29yOwotCQl1c2JuX2Nsa19jdGwucy5kaXZpZGUyID0gMDsKLQl9Ci0JX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX2Nsa19jdGwudTY0KTsKKwlkaXZpc29yID0gRElWX1JPVU5EX1VQKG9jdGVvbl9nZXRfY2xvY2tfcmF0ZSgpLCAxMjUwMDAwMDApOworCS8qIExvd2VyIHRoYW4gNCBkb2Vzbid0IHNlZW0gdG8gd29yayBwcm9wZXJseSAqLworCWlmIChkaXZpc29yIDwgNCkKKwkJZGl2aXNvciA9IDQ7CisJdXNibl9jbGtfY3RsLnMuZGl2aWRlID0gZGl2aXNvcjsKKwl1c2JuX2Nsa19jdGwucy5kaXZpZGUyID0gMDsKKwljdm14X3dyaXRlNjRfdWludDY0KENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwgdXNibl9jbGtfY3RsLnU2NCk7CisKIAkvKiAyZC4gV3JpdGUgVVNCTjAvMV9DTEtfQ1RMW0hDTEtfUlNUXSA9IDEgKi8KIAl1c2JuX2Nsa19jdGwucy5oY2xrX3JzdCA9IDE7Ci0JX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX2Nsa19jdGwudTY0KTsKKwljdm14X3dyaXRlNjRfdWludDY0KENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwgdXNibl9jbGtfY3RsLnU2NCk7CiAJLyogMmUuICBXYWl0IDY0IGNvcmUtY2xvY2sgY3ljbGVzIGZvciBIQ0xLIHRvIHN0YWJpbGl6ZSAqLwogCWN2bXhfd2FpdCg2NCk7CiAJLyoKQEAgLTc3NCw4ICs4MDAsNyBAQAogCSAqICAgIFVTQk5fQ0xLX0NUTFtQT1JdID0gMAogCSAqLwogCXVzYm5fY2xrX2N0bC5zLnBvciA9IDA7Ci0JX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX2Nsa19jdGwudTY0KTsKKwljdm14X3dyaXRlNjRfdWludDY0KENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwgdXNibl9jbGtfY3RsLnU2NCk7CiAJLyogNC4gV2FpdCAxIG1zIGZvciBQSFkgY2xvY2sgdG8gc3RhcnQgKi8KIAltZGVsYXkoMSk7CiAJLyoKQEAgLTc4MywxMSArODA4LDExIEBACiAJICogICAgVVNCUCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXI6CiAJICogICAgVVNCTl9VU0JQX0NUTF9TVEFUVVNbQVRFX1JFU0VUXSA9IDEKIAkgKi8KLQl1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLAotCQkJQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCkpOworCXVzYm5fdXNicF9jdGxfc3RhdHVzLnU2NCA9CisJCWN2bXhfcmVhZDY0X3VpbnQ2NChDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSk7CiAJdXNibl91c2JwX2N0bF9zdGF0dXMucy5hdGVfcmVzZXQgPSAxOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQpOworCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCksCisJCQkgICAgdXNibl91c2JwX2N0bF9zdGF0dXMudTY0KTsKIAkvKiA2LiBXYWl0IDEwIGN5Y2xlcyAqLwogCWN2bXhfd2FpdCgxMCk7CiAJLyoKQEAgLTc5NSwyMyArODIwLDIyIEBACiAJICogICAgVVNCTl9VU0JQX0NUTF9TVEFUVVNbQVRFX1JFU0VUXSA9IDAKIAkgKi8KIAl1c2JuX3VzYnBfY3RsX3N0YXR1cy5zLmF0ZV9yZXNldCA9IDA7Ci0JX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsIENWTVhfVVNCTlhfVVNCUF9DVExfU1RBVFVTKHVzYi0+aW5kZXgpLAotCQkJICAgICAgIHVzYm5fdXNicF9jdGxfc3RhdHVzLnU2NCk7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSwKKwkJCSAgICB1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQpOwogCS8qCiAJICogOC4gUHJvZ3JhbSB0aGUgUEhZIHJlc2V0IGZpZWxkIGluIHRoZSBVU0JOIGNsb2NrLWNvbnRyb2wgcmVnaXN0ZXI6CiAJICogICAgVVNCTl9DTEtfQ1RMW1BSU1RdID0gMQogCSAqLwogCXVzYm5fY2xrX2N0bC5zLnByc3QgPSAxOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl9jbGtfY3RsLnU2NCk7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksIHVzYm5fY2xrX2N0bC51NjQpOwogCS8qCiAJICogOS4gUHJvZ3JhbSB0aGUgVVNCUCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VsZWN0IGhvc3Qgb3IKIAkgKiAgICBkZXZpY2UgbW9kZS4gVVNCTl9VU0JQX0NUTF9TVEFUVVNbSFNUX01PREVdID0gMCBmb3IgaG9zdCwgPSAxIGZvcgogCSAqICAgIGRldmljZQogCSAqLwogCXVzYm5fdXNicF9jdGxfc3RhdHVzLnMuaHN0X21vZGUgPSAwOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQpOworCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCksCisJCQkgICAgdXNibl91c2JwX2N0bF9zdGF0dXMudTY0KTsKIAkvKiAxMC4gV2FpdCAxIHVzICovCiAJdWRlbGF5KDEpOwogCS8qCkBAIC04MTksMTIgKzg0MywxMCBAQAogCSAqICAgICBVU0JOX0NMS19DVExbSFJTVF0gPSAxCiAJICovCiAJdXNibl9jbGtfY3RsLnMuaHJzdCA9IDE7Ci0JX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX2Nsa19jdGwudTY0KTsKKwljdm14X3dyaXRlNjRfdWludDY0KENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwgdXNibl9jbGtfY3RsLnU2NCk7CiAJLyogMTIuIFByb2NlZWQgdG8gVVNCIGNvcmUgaW5pdGlhbGl6YXRpb24gKi8KIAl1c2JuX2Nsa19jdGwucy5lbmFibGUgPSAxOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl9jbGtfY3RsLnU2NCk7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksIHVzYm5fY2xrX2N0bC51NjQpOwogCXVkZWxheSgxKTsKIAogCS8qCkBAIC04NDUsMjkgKzg2NywxNiBAQAogCSAqICAgIFVTQkNfR0FIQkNGR1tQVFhGRU1QTFZMXQogCSAqICAgIEdsb2JhbCBpbnRlcnJ1cHQgbWFzaywgVVNCQ19HQUhCQ0ZHW0dMQkxJTlRSTVNLXSA9IDEKIAkgKi8KLQl7Ci0JCXVuaW9uIGN2bXhfdXNiY3hfZ2FoYmNmZyB1c2JjeF9nYWhiY2ZnOwotCQkvKiBEdWUgdG8gYW4gZXJyYXRhLCBDTjMxWFggZG9lc24ndCBzdXBwb3J0IERNQSAqLwotCQlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjMxWFgpKQotCQkJdXNiLT5pbml0X2ZsYWdzIHw9IENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BOwotCQl1c2JjeF9nYWhiY2ZnLnUzMiA9IDA7Ci0JCXVzYmN4X2dhaGJjZmcucy5kbWFlbiA9ICEodXNiLT5pbml0X2ZsYWdzICYKLQkJCQkJICBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSk7Ci0JCWlmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkKLQkJCS8qIE9ubHkgdXNlIG9uZSBjaGFubmVsIHdpdGggbm9uIERNQSAqLwotCQkJdXNiLT5pZGxlX2hhcmR3YXJlX2NoYW5uZWxzID0gMHgxOwotCQllbHNlIGlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONVhYWCkpCi0JCQkvKiBDTjVYWFggaGF2ZSBhbiBlcnJhdGEgd2l0aCBjaGFubmVsIDMgKi8KLQkJCXVzYi0+aWRsZV9oYXJkd2FyZV9jaGFubmVscyA9IDB4Zjc7Ci0JCWVsc2UKLQkJCXVzYi0+aWRsZV9oYXJkd2FyZV9jaGFubmVscyA9IDB4ZmY7Ci0JCXVzYmN4X2dhaGJjZmcucy5oYnN0bGVuID0gMDsKLQkJdXNiY3hfZ2FoYmNmZy5zLm5wdHhmZW1wbHZsID0gMTsKLQkJdXNiY3hfZ2FoYmNmZy5zLnB0eGZlbXBsdmwgPSAxOwotCQl1c2JjeF9nYWhiY2ZnLnMuZ2xibGludHJtc2sgPSAxOwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HQUhCQ0ZHKHVzYi0+aW5kZXgpLAotCQkJCSAgICAgICB1c2JjeF9nYWhiY2ZnLnUzMik7Ci0JfQorCXVzYmN4X2dhaGJjZmcudTMyID0gMDsKKwl1c2JjeF9nYWhiY2ZnLnMuZG1hZW4gPSAhKHVzYi0+aW5pdF9mbGFncyAmCisJCQkJICBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSk7CisJdXNiY3hfZ2FoYmNmZy5zLmhic3RsZW4gPSAwOworCXVzYmN4X2dhaGJjZmcucy5ucHR4ZmVtcGx2bCA9IDE7CisJdXNiY3hfZ2FoYmNmZy5zLnB0eGZlbXBsdmwgPSAxOworCXVzYmN4X2dhaGJjZmcucy5nbGJsaW50cm1zayA9IDE7CisJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dBSEJDRkcodXNiLT5pbmRleCksCisJCQkgICAgIHVzYmN4X2dhaGJjZmcudTMyKTsKKwogCS8qCiAJICogMy4gUHJvZ3JhbSB0aGUgZm9sbG93aW5nIGZpZWxkcyBpbiBVU0JDX0dVU0JDRkcgcmVnaXN0ZXIuCiAJICogICAgSFMvRlMgdGltZW91dCBjYWxpYnJhdGlvbiwgVVNCQ19HVVNCQ0ZHW1RPVVRDQUxdID0gMApAQCAtODc1LDE1NCArODg0LDk4IEBACiAJICogICAgVVNCIHR1cm5hcm91bmQgdGltZSwgVVNCQ19HVVNCQ0ZHW1VTQlRSRFRJTV0gPSAweDUKIAkgKiAgICBQSFkgbG93LXBvd2VyIGNsb2NrIHNlbGVjdCwgVVNCQ19HVVNCQ0ZHW1BIWUxQV1JDTEtTRUxdID0gMAogCSAqLwotCXsKLQkJdW5pb24gY3ZteF91c2JjeF9ndXNiY2ZnIHVzYmN4X2d1c2JjZmc7CisJdXNiY3hfZ3VzYmNmZy51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJCUNWTVhfVVNCQ1hfR1VTQkNGRyh1c2ItPmluZGV4KSk7CisJdXNiY3hfZ3VzYmNmZy5zLnRvdXRjYWwgPSAwOworCXVzYmN4X2d1c2JjZmcucy5kZHJzZWwgPSAwOworCXVzYmN4X2d1c2JjZmcucy51c2J0cmR0aW0gPSAweDU7CisJdXNiY3hfZ3VzYmNmZy5zLnBoeWxwd3JjbGtzZWwgPSAwOworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HVVNCQ0ZHKHVzYi0+aW5kZXgpLAorCQkJICAgICB1c2JjeF9ndXNiY2ZnLnUzMik7CiAKLQkJdXNiY3hfZ3VzYmNmZy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfR1VTQkNGRyh1c2ItPmluZGV4KSk7Ci0JCXVzYmN4X2d1c2JjZmcucy50b3V0Y2FsID0gMDsKLQkJdXNiY3hfZ3VzYmNmZy5zLmRkcnNlbCA9IDA7Ci0JCXVzYmN4X2d1c2JjZmcucy51c2J0cmR0aW0gPSAweDU7Ci0JCXVzYmN4X2d1c2JjZmcucy5waHlscHdyY2xrc2VsID0gMDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR1VTQkNGRyh1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgdXNiY3hfZ3VzYmNmZy51MzIpOwotCX0KIAkvKgogCSAqIDQuIFRoZSBzb2Z0d2FyZSBtdXN0IHVubWFzayB0aGUgZm9sbG93aW5nIGJpdHMgaW4gdGhlIFVTQkNfR0lOVE1TSwogCSAqICAgIHJlZ2lzdGVyLgogCSAqICAgIE9URyBpbnRlcnJ1cHQgbWFzaywgVVNCQ19HSU5UTVNLW09UR0lOVE1TS10gPSAxCiAJICogICAgTW9kZSBtaXNtYXRjaCBpbnRlcnJ1cHQgbWFzaywgVVNCQ19HSU5UTVNLW01PREVNSVNNU0tdID0gMQogCSAqLwotCXsKLQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrIHVzYmN4X2dpbnRtc2s7Ci0JCWludCBjaGFubmVsOworCXVzYmN4X2dpbnRtc2sudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCQlDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCkpOworCXVzYmN4X2dpbnRtc2sucy5vdGdpbnRtc2sgPSAxOworCXVzYmN4X2dpbnRtc2sucy5tb2RlbWlzbXNrID0gMTsKKwl1c2JjeF9naW50bXNrLnMuaGNoaW50bXNrID0gMTsKKwl1c2JjeF9naW50bXNrLnMuc29mbXNrID0gMDsKKwkvKiBXZSBuZWVkIFJYIEZJRk8gaW50ZXJydXB0cyBpZiB3ZSBkb24ndCBoYXZlIERNQSAqLworCWlmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkKKwkJdXNiY3hfZ2ludG1zay5zLnJ4Zmx2bG1zayA9IDE7CisJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQkgICAgIHVzYmN4X2dpbnRtc2sudTMyKTsKIAotCQl1c2JjeF9naW50bXNrLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQkJQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpKTsKLQkJdXNiY3hfZ2ludG1zay5zLm90Z2ludG1zayA9IDE7Ci0JCXVzYmN4X2dpbnRtc2sucy5tb2RlbWlzbXNrID0gMTsKLQkJdXNiY3hfZ2ludG1zay5zLmhjaGludG1zayA9IDE7Ci0JCXVzYmN4X2dpbnRtc2sucy5zb2Ztc2sgPSAwOwotCQkvKiBXZSBuZWVkIFJYIEZJRk8gaW50ZXJydXB0cyBpZiB3ZSBkb24ndCBoYXZlIERNQSAqLwotCQlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpCi0JCQl1c2JjeF9naW50bXNrLnMucnhmbHZsbXNrID0gMTsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgdXNiY3hfZ2ludG1zay51MzIpOworCS8qCisJICogRGlzYWJsZSBhbGwgY2hhbm5lbCBpbnRlcnJ1cHRzLiBXZSdsbCBlbmFibGUgdGhlbSBwZXIgY2hhbm5lbCBsYXRlci4KKwkgKi8KKwlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgODsgY2hhbm5lbCsrKQorCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJICAgICBDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQkgICAgIDApOwogCi0JCS8qCi0JCSAqIERpc2FibGUgYWxsIGNoYW5uZWwgaW50ZXJydXB0cy4gV2UnbGwgZW5hYmxlIHRoZW0gcGVyIGNoYW5uZWwKLQkJICogbGF0ZXIuCi0JCSAqLwotCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgODsgY2hhbm5lbCsrKQotCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCi0JCQkJQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksIDApOwotCX0KKwkvKgorCSAqIEhvc3QgUG9ydCBJbml0aWFsaXphdGlvbgorCSAqCisJICogMS4gUHJvZ3JhbSB0aGUgaG9zdC1wb3J0IGludGVycnVwdC1tYXNrIGZpZWxkIHRvIHVubWFzaywKKwkgKiAgICBVU0JDX0dJTlRNU0tbUFJUSU5UXSA9IDEKKwkgKi8KKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJY3ZteF91c2JjeF9naW50bXNrLCBwcnRpbnRtc2ssIDEpOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCisJCQljdm14X3VzYmN4X2dpbnRtc2ssIGRpc2Nvbm5pbnRtc2ssIDEpOwogCi0JewotCQkvKgotCQkgKiBIb3N0IFBvcnQgSW5pdGlhbGl6YXRpb24KLQkJICoKLQkJICogMS4gUHJvZ3JhbSB0aGUgaG9zdC1wb3J0IGludGVycnVwdC1tYXNrIGZpZWxkIHRvIHVubWFzaywKLQkJICogICAgVVNCQ19HSU5UTVNLW1BSVElOVF0gPSAxCi0JCSAqLwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgcHJ0aW50bXNrLCAxKTsKLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIGRpc2Nvbm5pbnRtc2ssIDEpOwotCQkvKgotCQkgKiAyLiBQcm9ncmFtIHRoZSBVU0JDX0hDRkcgcmVnaXN0ZXIgdG8gc2VsZWN0IGZ1bGwtc3BlZWQgaG9zdAotCQkgKiAgICBvciBoaWdoLXNwZWVkIGhvc3QuCi0JCSAqLwotCQl7Ci0JCQl1bmlvbiBjdm14X3VzYmN4X2hjZmcgdXNiY3hfaGNmZzsKKwkvKgorCSAqIDIuIFByb2dyYW0gdGhlIFVTQkNfSENGRyByZWdpc3RlciB0byBzZWxlY3QgZnVsbC1zcGVlZCBob3N0CisJICogICAgb3IgaGlnaC1zcGVlZCBob3N0LgorCSAqLworCXVzYmN4X2hjZmcudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSk7CisJdXNiY3hfaGNmZy5zLmZzbHNzdXBwID0gMDsKKwl1c2JjeF9oY2ZnLnMuZnNsc3BjbGtzZWwgPSAwOworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0ZHKHVzYi0+aW5kZXgpLCB1c2JjeF9oY2ZnLnUzMik7CiAKLQkJCXVzYmN4X2hjZmcudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQkJQ1ZNWF9VU0JDWF9IQ0ZHKHVzYi0+aW5kZXgpKTsKLQkJCXVzYmN4X2hjZmcucy5mc2xzc3VwcCA9IDA7Ci0JCQl1c2JjeF9oY2ZnLnMuZnNsc3BjbGtzZWwgPSAwOwotCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCi0JCQkJCUNWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSwKLQkJCQkJdXNiY3hfaGNmZy51MzIpOwotCQl9Ci0JCS8qCi0JCSAqIDMuIFByb2dyYW0gdGhlIHBvcnQgcG93ZXIgYml0IHRvIGRyaXZlIFZCVVMgb24gdGhlIFVTQiwKLQkJICogICAgVVNCQ19IUFJUW1BSVFBXUl0gPSAxCi0JCSAqLwotCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0cHdyLCAxKTsKKwljdm14X2ZpZm9fc2V0dXAodXNiKTsKIAotCQkvKgotCQkgKiBTdGVwcyA0LTE1IGZyb20gdGhlIG1hbnVhbCBhcmUgZG9uZSBsYXRlciBpbiB0aGUgcG9ydCBlbmFibGUKLQkJICovCi0JfQotCi0JcmV0dXJuIDA7CisJLyoKKwkgKiBJZiB0aGUgY29udHJvbGxlciBpcyBnZXR0aW5nIHBvcnQgZXZlbnRzIHJpZ2h0IGFmdGVyIHRoZSByZXNldCwgaXQKKwkgKiBtZWFucyB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiBUcnkgcmVzZXR0aW5nIHRoZSBjb250cm9sbGVyIGFnYWluCisJICogaW4gc3VjaCBjYXNlLiBUaGlzIGlzIHNlZW4gdG8gaGFwcGVuIGFmdGVyIGNvbGQgYm9vdCBvbiBEU1ItMTAwME4uCisJICovCisJdXNiY19naW50c3RzLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQkgICAgICAgQ1ZNWF9VU0JDWF9HSU5UU1RTKHVzYi0+aW5kZXgpKTsKKwljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR0lOVFNUUyh1c2ItPmluZGV4KSwKKwkJCSAgICAgdXNiY19naW50c3RzLnUzMik7CisJZGV2X2RiZyhkZXYsICJnaW50c3RzIGFmdGVyIHJlc2V0OiAweCV4XG4iLCAoaW50KXVzYmNfZ2ludHN0cy51MzIpOworCWlmICghdXNiY19naW50c3RzLnMuZGlzY29ubmludCAmJiAhdXNiY19naW50c3RzLnMucHJ0aW50KQorCQlyZXR1cm4gMDsKKwlpZiAocmV0cmllcysrID49IDUpCisJCXJldHVybiAtRUFHQUlOOworCWRldl9pbmZvKGRldiwgImNvbnRyb2xsZXIgcmVzZXQgZmFpbGVkIChnaW50c3RzPTB4JXgpIC0gcmV0cnlpbmdcbiIsCisJCSAoaW50KXVzYmNfZ2ludHN0cy51MzIpOworCW1zbGVlcCg1MCk7CisJY3ZteF91c2Jfc2h1dGRvd24odXNiKTsKKwltc2xlZXAoNTApOworCWdvdG8gcmV0cnk7CiB9CiAKLQogLyoqCi0gKiBTaHV0ZG93biBhIFVTQiBwb3J0IGFmdGVyIGEgY2FsbCB0byBjdm14X3VzYl9pbml0aWFsaXplKCkuCi0gKiBUaGUgcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQgd2l0aCBhbGwgcGlwZXMgY2xvc2VkIHdoZW4gdGhpcwotICogZnVuY3Rpb24gaXMgY2FsbGVkLgotICoKLSAqIEB1c2I6IFVTQiBkZXZpY2Ugc3RhdGUgcG9wdWxhdGVkIGJ5IGN2bXhfdXNiX2luaXRpYWxpemUoKS4KLSAqCi0gKiBSZXR1cm5zOiAwIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotc3RhdGljIGludCBjdm14X3VzYl9zaHV0ZG93bihzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKLXsKLQl1bmlvbiBjdm14X3VzYm54X2Nsa19jdGwgdXNibl9jbGtfY3RsOwotCi0JLyogTWFrZSBzdXJlIGFsbCBwaXBlcyBhcmUgY2xvc2VkICovCi0JaWYgKCFsaXN0X2VtcHR5KCZ1c2ItPmlkbGVfcGlwZXMpIHx8Ci0JICAgICFsaXN0X2VtcHR5KCZ1c2ItPmFjdGl2ZV9waXBlc1tDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VU10pIHx8Ci0JICAgICFsaXN0X2VtcHR5KCZ1c2ItPmFjdGl2ZV9waXBlc1tDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFRdKSB8fAotCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTF0pIHx8Ci0JICAgICFsaXN0X2VtcHR5KCZ1c2ItPmFjdGl2ZV9waXBlc1tDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLXSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQkvKiBEaXNhYmxlIHRoZSBjbG9ja3MgYW5kIHB1dCB0aGVtIGluIHBvd2VyIG9uIHJlc2V0ICovCi0JdXNibl9jbGtfY3RsLnU2NCA9IF9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsCi0JCQlDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOwotCXVzYm5fY2xrX2N0bC5zLmVuYWJsZSA9IDE7Ci0JdXNibl9jbGtfY3RsLnMucG9yID0gMTsKLQl1c2JuX2Nsa19jdGwucy5oY2xrX3JzdCA9IDE7Ci0JdXNibl9jbGtfY3RsLnMucHJzdCA9IDA7Ci0JdXNibl9jbGtfY3RsLnMuaHJzdCA9IDA7Ci0JX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsIENWTVhfVVNCTlhfQ0xLX0NUTCh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX2Nsa19jdGwudTY0KTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqIEVuYWJsZSBhIFVTQiBwb3J0LiBBZnRlciB0aGlzIGNhbGwgc3VjY2VlZHMsIHRoZSBVU0IgcG9ydCBpcworICogUmVzZXQgYSBVU0IgcG9ydC4gQWZ0ZXIgdGhpcyBjYWxsIHN1Y2NlZWRzLCB0aGUgVVNCIHBvcnQgaXMKICAqIG9ubGluZSBhbmQgc2VydmljaW5nIHJlcXVlc3RzLgogICoKICAqIEB1c2I6IFVTQiBkZXZpY2Ugc3RhdGUgcG9wdWxhdGVkIGJ5IGN2bXhfdXNiX2luaXRpYWxpemUoKS4KLSAqCi0gKiBSZXR1cm5zOiAwIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqLwotc3RhdGljIGludCBjdm14X3VzYl9lbmFibGUoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCitzdGF0aWMgdm9pZCBjdm14X3VzYl9yZXNldF9wb3J0KHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiKQogewotCXVuaW9uIGN2bXhfdXNiY3hfZ2h3Y2ZnMyB1c2JjeF9naHdjZmczOwotCi0JdXNiLT51c2JjeF9ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwotCi0JLyoKLQkgKiBJZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGVuYWJsZWQgdGhlIGp1c3QgcmV0dXJuLiBXZSBkb24ndCBuZWVkIHRvIGRvCi0JICogYW55dGhpbmcKLQkgKi8KLQlpZiAodXNiLT51c2JjeF9ocHJ0LnMucHJ0ZW5hKQotCQlyZXR1cm4gMDsKLQotCS8qIElmIHRoZXJlIGlzIG5vdGhpbmcgcGx1Z2dlZCBpbnRvIHRoZSBwb3J0IHRoZW4gZmFpbCBpbW1lZGlhdGVseSAqLwotCWlmICghdXNiLT51c2JjeF9ocHJ0LnMucHJ0Y29ubnN0cykKLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJdXNiLT51c2JjeF9ocHJ0LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQkJICBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwogCiAJLyogUHJvZ3JhbSB0aGUgcG9ydCByZXNldCBiaXQgdG8gc3RhcnQgdGhlIHJlc2V0IHByb2Nlc3MgKi8KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsCisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgY3ZteF91c2JjeF9ocHJ0LAogCQkJcHJ0cnN0LCAxKTsKIAogCS8qCkBAIC0xMDMyLDc1ICs5ODUsMTUgQEAKIAltZGVsYXkoNTApOwogCiAJLyogUHJvZ3JhbSB0aGUgcG9ydCByZXNldCBiaXQgdG8gMCwgVVNCQ19IUFJUW1BSVFJTVF0gPSAwICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LAorCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIGN2bXhfdXNiY3hfaHBydCwKIAkJCXBydHJzdCwgMCk7CiAKLQkvKiBXYWl0IGZvciB0aGUgVVNCQ19IUFJUW1BSVEVOQV0uICovCi0JaWYgKENWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9ocHJ0LCBwcnRlbmEsID09LCAxLCAxMDAwMDApKQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQogCS8qCiAJICogUmVhZCB0aGUgcG9ydCBzcGVlZCBmaWVsZCB0byBnZXQgdGhlIGVudW1lcmF0ZWQgc3BlZWQsCiAJICogVVNCQ19IUFJUW1BSVFNQRF0uCiAJICovCi0JdXNiLT51c2JjeF9ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwotCXVzYmN4X2dod2NmZzMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCUNWTVhfVVNCQ1hfR0hXQ0ZHMyh1c2ItPmluZGV4KSk7Ci0KLQkvKgotCSAqIDEzLiBQcm9ncmFtIHRoZSBVU0JDX0dSWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIG9mIHRoZQotCSAqICAgICByZWNlaXZlIEZJRk8gKDI1JSkuCi0JICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JYRlNJWih1c2ItPmluZGV4KSwKLQkJCXVuaW9uIGN2bXhfdXNiY3hfZ3J4ZnNpeiwgcnhmZGVwLAotCQkJdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0KTsKLQkvKgotCSAqIDE0LiBQcm9ncmFtIHRoZSBVU0JDX0dOUFRYRlNJWiByZWdpc3RlciB0byBzZWxlY3QgdGhlIHNpemUgYW5kIHRoZQotCSAqICAgICBzdGFydCBhZGRyZXNzIG9mIHRoZSBub24tIHBlcmlvZGljIHRyYW5zbWl0IEZJRk8gZm9yIG5vbnBlcmlvZGljCi0JICogICAgIHRyYW5zYWN0aW9ucyAoNTAlKS4KLQkgKi8KLQl7Ci0JCXVuaW9uIGN2bXhfdXNiY3hfZ25wdHhmc2l6IHNpejsKLQotCQlzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0dOUFRYRlNJWih1c2ItPmluZGV4KSk7Ci0JCXNpei5zLm5wdHhmZGVwID0gdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyAyOwotCQlzaXoucy5ucHR4ZnN0YWRkciA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR05QVFhGU0laKHVzYi0+aW5kZXgpLAotCQkJCSAgICAgICBzaXoudTMyKTsKLQl9Ci0JLyoKLQkgKiAxNS4gUHJvZ3JhbSB0aGUgVVNCQ19IUFRYRlNJWiByZWdpc3RlciB0byBzZWxlY3QgdGhlIHNpemUgYW5kIHN0YXJ0Ci0JICogICAgIGFkZHJlc3Mgb2YgdGhlIHBlcmlvZGljIHRyYW5zbWl0IEZJRk8gZm9yIHBlcmlvZGljIHRyYW5zYWN0aW9ucwotCSAqICAgICAoMjUlKS4KLQkgKi8KLQl7Ci0JCXVuaW9uIGN2bXhfdXNiY3hfaHB0eGZzaXogc2l6OwotCi0JCXNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfSFBUWEZTSVoodXNiLT5pbmRleCkpOwotCQlzaXoucy5wdHhmc2l6ZSA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNDsKLQkJc2l6LnMucHR4ZnN0YWRkciA9IDMgKiB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpLAotCQkJCSAgICAgICBzaXoudTMyKTsKLQl9Ci0JLyogRmx1c2ggYWxsIEZJRk9zICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKLQkJCXVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgdHhmbnVtLCAweDEwKTsKLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAotCQkJdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLCB0eGZmbHNoLCAxKTsKLQlDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAotCQkJICAgICAgdW5pb24gY3ZteF91c2JjeF9ncnN0Y3RsLAotCQkJICAgICAgdHhmZmxzaCwgPT0sIDAsIDEwMCk7Ci0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKLQkJCXVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgcnhmZmxzaCwgMSk7Ci0JQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKLQkJCSAgICAgIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwKLQkJCSAgICAgIHJ4ZmZsc2gsID09LCAwLCAxMDApOwotCi0JcmV0dXJuIDA7CisJdXNiLT51c2JjeF9ocHJ0LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQkJICBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwogfQogCiAKQEAgLTExMTcsNyArMTAxMCw3IEBACiBzdGF0aWMgaW50IGN2bXhfdXNiX2Rpc2FibGUoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCiB7CiAJLyogRGlzYWJsZSB0aGUgcG9ydCAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCBjdm14X3VzYmN4X2hwcnQsCiAJCQlwcnRlbmEsIDEpOwogCXJldHVybiAwOwogfQpAQCAtMTE0Miw4ICsxMDM1LDcgQEAKIAogCW1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7CiAKLQl1c2JjX2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCUNWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CisJdXNiY19ocHJ0LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOwogCXJlc3VsdC5wb3J0X2VuYWJsZWQgPSB1c2JjX2hwcnQucy5wcnRlbmE7CiAJcmVzdWx0LnBvcnRfb3Zlcl9jdXJyZW50ID0gdXNiY19ocHJ0LnMucHJ0b3ZyY3VycmFjdDsKIAlyZXN1bHQucG9ydF9wb3dlcmVkID0gdXNiY19ocHJ0LnMucHJ0cHdyOwpAQCAtMTIyMyw0MSArMTExNSwxMyBAQAogewogCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlOwogCi0JaWYgKHVubGlrZWx5KChkZXZpY2VfYWRkciA8IDApIHx8IChkZXZpY2VfYWRkciA+IE1BWF9VU0JfQUREUkVTUykpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkoKGVuZHBvaW50X251bSA8IDApIHx8IChlbmRwb2ludF9udW0gPiBNQVhfVVNCX0VORFBPSU5UKSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseShkZXZpY2Vfc3BlZWQgPiBDVk1YX1VTQl9TUEVFRF9MT1cpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkoKG1heF9wYWNrZXQgPD0gMCkgfHwgKG1heF9wYWNrZXQgPiAxMDI0KSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseSh0cmFuc2Zlcl90eXBlID4gQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KCh0cmFuc2Zlcl9kaXIgIT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgJiYKLQkJKHRyYW5zZmVyX2RpciAhPSBDVk1YX1VTQl9ESVJFQ1RJT05fSU4pKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KGludGVydmFsIDwgMCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseSgodHJhbnNmZXJfdHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MKSAmJiBpbnRlcnZhbCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseShtdWx0aV9jb3VudCA8IDApKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkoKGRldmljZV9zcGVlZCAhPSBDVk1YX1VTQl9TUEVFRF9ISUdIKSAmJgotCQkobXVsdGlfY291bnQgIT0gMCkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkoKGh1Yl9kZXZpY2VfYWRkciA8IDApIHx8Ci0JCShodWJfZGV2aWNlX2FkZHIgPiBNQVhfVVNCX0FERFJFU1MpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KChodWJfcG9ydCA8IDApIHx8IChodWJfcG9ydCA+IE1BWF9VU0JfSFVCX1BPUlQpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlwaXBlID0ga3phbGxvYyhzaXplb2YoKnBpcGUpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBpcGUpCiAJCXJldHVybiBOVUxMOwogCWlmICgoZGV2aWNlX3NwZWVkID09IENWTVhfVVNCX1NQRUVEX0hJR0gpICYmCiAJCSh0cmFuc2Zlcl9kaXIgPT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgJiYKIAkJKHRyYW5zZmVyX3R5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSykpCi0JCXBpcGUtPmZsYWdzIHw9IF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc7CisJCXBpcGUtPmZsYWdzIHw9IENWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOwogCXBpcGUtPmRldmljZV9hZGRyID0gZGV2aWNlX2FkZHI7CiAJcGlwZS0+ZW5kcG9pbnRfbnVtID0gZW5kcG9pbnRfbnVtOwogCXBpcGUtPmRldmljZV9zcGVlZCA9IGRldmljZV9zcGVlZDsKQEAgLTEyNzIsNyArMTEzNiw3IEBACiAJICovCiAJaWYgKCFpbnRlcnZhbCkKIAkJaW50ZXJ2YWwgPSAxOwotCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgeworCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJcGlwZS0+aW50ZXJ2YWwgPSBpbnRlcnZhbCo4OwogCQkvKiBGb3JjZSBzdGFydCBzcGxpdHMgdG8gYmUgc2NoZWR1bGUgb24gdUZyYW1lIDAgKi8KIAkJcGlwZS0+bmV4dF90eF9mcmFtZSA9ICgodXNiLT5mcmFtZV9udW1iZXIrNykmfjcpICsKQEAgLTEzMDQsNyArMTE2OCw3IEBACiAgKgogICogQHVzYjoJVVNCIGRldmljZSBzdGF0ZSBwb3B1bGF0ZWQgYnkgY3ZteF91c2JfaW5pdGlhbGl6ZSgpLgogICovCi1zdGF0aWMgdm9pZCBfX2N2bXhfdXNiX3BvbGxfcnhfZmlmbyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKK3N0YXRpYyB2b2lkIGN2bXhfdXNiX3BvbGxfcnhfZmlmbyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKIHsKIAl1bmlvbiBjdm14X3VzYmN4X2dyeHN0c3BoIHJ4X3N0YXR1czsKIAlpbnQgY2hhbm5lbDsKQEAgLTEzMTIsOCArMTE3Niw4IEBACiAJdWludDY0X3QgYWRkcmVzczsKIAl1aW50MzJfdCAqcHRyOwogCi0Jcnhfc3RhdHVzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQlDVk1YX1VTQkNYX0dSWFNUU1BIKHVzYi0+aW5kZXgpKTsKKwlyeF9zdGF0dXMudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCSAgICBDVk1YX1VTQkNYX0dSWFNUU1BIKHVzYi0+aW5kZXgpKTsKIAkvKiBPbmx5IHJlYWQgZGF0YSBpZiBJTiBkYXRhIGlzIHRoZXJlICovCiAJaWYgKHJ4X3N0YXR1cy5zLnBrdHN0cyAhPSAyKQogCQlyZXR1cm47CkBAIC0xMzI3LDE4ICsxMTkxLDE3IEBACiAJCXJldHVybjsKIAogCS8qIEdldCB3aGVyZSB0aGUgRE1BIGVuZ2luZSB3b3VsZCBoYXZlIHdyaXR0ZW4gdGhpcyBkYXRhICovCi0JYWRkcmVzcyA9IF9fY3ZteF91c2JfcmVhZF9jc3I2NCh1c2IsCi0JCQlDVk1YX1VTQk5YX0RNQTBfSU5CX0NITjAodXNiLT5pbmRleCkgKyBjaGFubmVsKjgpOworCWFkZHJlc3MgPSBjdm14X3JlYWQ2NF91aW50NjQoQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpICsKKwkJCQkgICAgIGNoYW5uZWwgKiA4KTsKIAogCXB0ciA9IGN2bXhfcGh5c190b19wdHIoYWRkcmVzcyk7Ci0JX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsCi0JCQkgICAgICAgQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpICsgY2hhbm5lbCo4LAotCQkJICAgICAgIGFkZHJlc3MgKyBieXRlcyk7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0RNQTBfSU5CX0NITjAodXNiLT5pbmRleCkgKyBjaGFubmVsICogOCwKKwkJCSAgICBhZGRyZXNzICsgYnl0ZXMpOwogCiAJLyogTG9vcCB3cml0aW5nIHRoZSBGSUZPIGRhdGEgZm9yIHRoaXMgcGFja2V0IGludG8gbWVtb3J5ICovCiAJd2hpbGUgKGJ5dGVzID4gMCkgewotCQkqcHRyKysgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCVVTQl9GSUZPX0FERFJFU1MoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCQkqcHRyKysgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJVVNCX0ZJRk9fQUREUkVTUyhjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAJCWJ5dGVzIC09IDQ7CiAJfQogCUNWTVhfU1lOQ1c7CkBAIC0xMzU2LDggKzEyMTksOCBAQAogICogUmV0dXJuczogTm9uIHplcm8gaWYgdGhlIGhhcmR3YXJlIGZpZm8gd2FzIHRvbyBzbWFsbCBhbmQgbmVlZHMKICAqCSAgICB0byBiZSBzZXJ2aWNlZCBhZ2Fpbi4KICAqLwotc3RhdGljIGludCBfX2N2bXhfdXNiX2ZpbGxfdHhfaHcoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJIHN0cnVjdCBjdm14X3VzYl90eF9maWZvICpmaWZvLCBpbnQgYXZhaWxhYmxlKQorc3RhdGljIGludCBjdm14X3VzYl9maWxsX3R4X2h3KHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJICAgICAgIHN0cnVjdCBjdm14X3VzYl90eF9maWZvICpmaWZvLCBpbnQgYXZhaWxhYmxlKQogewogCS8qCiAJICogV2UncmUgZG9uZSBlaXRoZXIgd2hlbiB0aGVyZSBpc24ndCBhbnltb3JlIHNwYWNlIG9yIHRoZSBzb2Z0d2FyZSBGSUZPCkBAIC0xNDEyLDM4ICsxMjc1LDM0IEBACiAgKgogICogQHVzYjoJVVNCIGRldmljZSBzdGF0ZSBwb3B1bGF0ZWQgYnkgY3ZteF91c2JfaW5pdGlhbGl6ZSgpLgogICovCi1zdGF0aWMgdm9pZCBfX2N2bXhfdXNiX3BvbGxfdHhfZmlmbyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKK3N0YXRpYyB2b2lkIGN2bXhfdXNiX3BvbGxfdHhfZmlmbyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKIHsKIAlpZiAodXNiLT5wZXJpb2RpYy5oZWFkICE9IHVzYi0+cGVyaW9kaWMudGFpbCkgewogCQl1bmlvbiBjdm14X3VzYmN4X2hwdHhzdHMgdHhfc3RhdHVzOwogCi0JCXR4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfSFBUWFNUUyh1c2ItPmluZGV4KSk7Ci0JCWlmIChfX2N2bXhfdXNiX2ZpbGxfdHhfaHcodXNiLCAmdXNiLT5wZXJpb2RpYywKLQkJCQkJICB0eF9zdGF0dXMucy5wdHhmc3BjYXZhaWwpKQorCQl0eF9zdGF0dXMudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfSFBUWFNUUyh1c2ItPmluZGV4KSk7CisJCWlmIChjdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+cGVyaW9kaWMsCisJCQkJCXR4X3N0YXR1cy5zLnB0eGZzcGNhdmFpbCkpCiAJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAotCQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCi0JCQkJCXB0eGZlbXBtc2ssIDEpOworCQkJCQljdm14X3VzYmN4X2dpbnRtc2ssIHB0eGZlbXBtc2ssIDEpOwogCQllbHNlCiAJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAotCQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCi0JCQkJCXB0eGZlbXBtc2ssIDApOworCQkJCQljdm14X3VzYmN4X2dpbnRtc2ssIHB0eGZlbXBtc2ssIDApOwogCX0KIAogCWlmICh1c2ItPm5vbnBlcmlvZGljLmhlYWQgIT0gdXNiLT5ub25wZXJpb2RpYy50YWlsKSB7CiAJCXVuaW9uIGN2bXhfdXNiY3hfZ25wdHhzdHMgdHhfc3RhdHVzOwogCi0JCXR4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfR05QVFhTVFModXNiLT5pbmRleCkpOwotCQlpZiAoX19jdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+bm9ucGVyaW9kaWMsCi0JCQkJCSAgdHhfc3RhdHVzLnMubnB0eGZzcGNhdmFpbCkpCisJCXR4X3N0YXR1cy51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJQ1ZNWF9VU0JDWF9HTlBUWFNUUyh1c2ItPmluZGV4KSk7CisJCWlmIChjdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+bm9ucGVyaW9kaWMsCisJCQkJCXR4X3N0YXR1cy5zLm5wdHhmc3BjYXZhaWwpKQogCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAotCQkJCQlucHR4ZmVtcG1zaywgMSk7CisJCQkJCWN2bXhfdXNiY3hfZ2ludG1zaywgbnB0eGZlbXBtc2ssIDEpOwogCQllbHNlCiAJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAotCQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssCi0JCQkJCW5wdHhmZW1wbXNrLCAwKTsKKwkJCQkJY3ZteF91c2JjeF9naW50bXNrLCBucHR4ZmVtcG1zaywgMCk7CiAJfQogfQogCkBAIC0xNDU0LDcgKzEzMTMsNyBAQAogICogQHVzYjoJICBVU0IgZGV2aWNlIHN0YXRlIHBvcHVsYXRlZCBieSBjdm14X3VzYl9pbml0aWFsaXplKCkuCiAgKiBAY2hhbm5lbDoJICBDaGFubmVsIG51bWJlciB0byBnZXQgcGFja2V0IGZyb20KICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9maWxsX3R4X2ZpZm8oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsIGludCBjaGFubmVsKQorc3RhdGljIHZvaWQgY3ZteF91c2JfZmlsbF90eF9maWZvKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBpbnQgY2hhbm5lbCkKIHsKIAl1bmlvbiBjdm14X3VzYmN4X2hjY2hhcnggaGNjaGFyOwogCXVuaW9uIGN2bXhfdXNiY3hfaGNzcGx0eCB1c2JjX2hjc3BsdDsKQEAgLTE0NjIsMTQgKzEzMjEsMTQgQEAKIAlzdHJ1Y3QgY3ZteF91c2JfdHhfZmlmbyAqZmlmbzsKIAogCS8qIFdlIG9ubHkgbmVlZCB0byBmaWxsIGRhdGEgb24gb3V0Ym91bmQgY2hhbm5lbHMgKi8KLQloY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwloY2NoYXIudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCWlmIChoY2NoYXIucy5lcGRpciAhPSBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKQogCQlyZXR1cm47CiAKIAkvKiBPVVQgU3BsaXRzIG9ubHkgaGF2ZSBkYXRhIG9uIHRoZSBzdGFydCBhbmQgbm90IHRoZSBjb21wbGV0ZSAqLwotCXVzYmNfaGNzcGx0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQlDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCXVzYmNfaGNzcGx0LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAJaWYgKHVzYmNfaGNzcGx0LnMuc3BsdGVuYSAmJiB1c2JjX2hjc3BsdC5zLmNvbXBzcGx0KQogCQlyZXR1cm47CiAKQEAgLTE0NzcsOCArMTMzNiw4IEBACiAJICogRmluZCBvdXQgaG93IG1hbnkgYnl0ZXMgd2UgbmVlZCB0byBmaWxsIGFuZCBjb252ZXJ0IGl0IGludG8gMzJiaXQKIAkgKiB3b3Jkcy4KIAkgKi8KLQl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjdHNpei51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCWlmICghdXNiY19oY3RzaXoucy54ZmVyc2l6ZSkKIAkJcmV0dXJuOwogCkBAIC0xNDg5LDI4ICsxMzQ4LDI4IEBACiAJCWZpZm8gPSAmdXNiLT5ub25wZXJpb2RpYzsKIAogCWZpZm8tPmVudHJ5W2ZpZm8tPmhlYWRdLmNoYW5uZWwgPSBjaGFubmVsOwotCWZpZm8tPmVudHJ5W2ZpZm8tPmhlYWRdLmFkZHJlc3MgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLAotCQkJQ1ZNWF9VU0JOWF9ETUEwX09VVEJfQ0hOMCh1c2ItPmluZGV4KSArIGNoYW5uZWwqOCk7CisJZmlmby0+ZW50cnlbZmlmby0+aGVhZF0uYWRkcmVzcyA9CisJCWN2bXhfcmVhZDY0X3VpbnQ2NChDVk1YX1VTQk5YX0RNQTBfT1VUQl9DSE4wKHVzYi0+aW5kZXgpICsKKwkJCQkgICBjaGFubmVsICogOCk7CiAJZmlmby0+ZW50cnlbZmlmby0+aGVhZF0uc2l6ZSA9ICh1c2JjX2hjdHNpei5zLnhmZXJzaXplKzMpPj4yOwogCWZpZm8tPmhlYWQrKzsKIAlpZiAoZmlmby0+aGVhZCA+IE1BWF9DSEFOTkVMUykKIAkJZmlmby0+aGVhZCA9IDA7CiAKLQlfX2N2bXhfdXNiX3BvbGxfdHhfZmlmbyh1c2IpOworCWN2bXhfdXNiX3BvbGxfdHhfZmlmbyh1c2IpOwogfQogCiAvKioKICAqIFBlcmZvcm0gY2hhbm5lbCBzcGVjaWZpYyBzZXR1cCBmb3IgQ29udHJvbCB0cmFuc2FjdGlvbnMuIEFsbAotICogdGhlIGdlbmVyaWMgc3R1ZmYgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBkb25lIGluCi0gKiBfX2N2bXhfdXNiX3N0YXJ0X2NoYW5uZWwoKQorICogdGhlIGdlbmVyaWMgc3R1ZmYgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBkb25lIGluIGN2bXhfdXNiX3N0YXJ0X2NoYW5uZWwoKS4KICAqCiAgKiBAdXNiOgkgIFVTQiBkZXZpY2Ugc3RhdGUgcG9wdWxhdGVkIGJ5IGN2bXhfdXNiX2luaXRpYWxpemUoKS4KICAqIEBjaGFubmVsOgkgIENoYW5uZWwgdG8gc2V0dXAKICAqIEBwaXBlOgkgIFBpcGUgZm9yIGNvbnRyb2wgdHJhbnNhY3Rpb24KICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9zdGFydF9jaGFubmVsX2NvbnRyb2woc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCSAgICAgaW50IGNoYW5uZWwsCi0JCQkJCSAgICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUpCitzdGF0aWMgdm9pZCBjdm14X3VzYl9zdGFydF9jaGFubmVsX2NvbnRyb2woc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJCSAgIGludCBjaGFubmVsLAorCQkJCQkgICBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSkKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2hjZCAqcHJpdiA9IGN2bXhfdXNiX3RvX29jdGVvbih1c2IpOwogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBvY3Rlb25fdG9faGNkKHByaXYpOwpAQCAtMTUyNSw4ICsxMzg0LDggQEAKIAlpbnQgcGFja2V0c190b190cmFuc2ZlcjsKIAl1bmlvbiBjdm14X3VzYmN4X2hjdHNpenggdXNiY19oY3RzaXo7CiAKLQl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjdHNpei51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCiAJc3dpdGNoICh0cmFuc2FjdGlvbi0+c3RhZ2UpIHsKIAljYXNlIENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MOgpAQCAtMTUzOCw3MiArMTM5Nyw3MiBAQAogCQlieXRlc190b190cmFuc2ZlciA9IHNpemVvZigqaGVhZGVyKTsKIAkJLyogQWxsIENvbnRyb2wgb3BlcmF0aW9ucyBzdGFydCB3aXRoIGEgc2V0dXAgZ29pbmcgT1VUICovCiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKKwkJCQljdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAogCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQpOwogCQkvKgogCQkgKiBTZXR1cCBzZW5kIHRoZSBjb250cm9sIGhlYWRlciBpbnN0ZWFkIG9mIHRoZSBidWZmZXIgZGF0YS4gVGhlCiAJCSAqIGJ1ZmZlciBkYXRhIHdpbGwgYmUgdXNlZCBpbiB0aGUgbmV4dCBzdGFnZQogCQkgKi8KLQkJX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsCi0JCQlDVk1YX1VTQk5YX0RNQTBfT1VUQl9DSE4wKHVzYi0+aW5kZXgpICsgY2hhbm5lbCo4LAotCQkJdHJhbnNhY3Rpb24tPmNvbnRyb2xfaGVhZGVyKTsKKwkJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0RNQTBfT1VUQl9DSE4wKHVzYi0+aW5kZXgpICsKKwkJCQkJY2hhbm5lbCAqIDgsCisJCQkJICAgIHRyYW5zYWN0aW9uLT5jb250cm9sX2hlYWRlcik7CiAJCWJyZWFrOwogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU0VUVVBfU1BMSVRfQ09NUExFVEU6CiAJCXVzYmNfaGN0c2l6LnMucGlkID0gMzsgLyogU2V0dXAgKi8KIAkJYnl0ZXNfdG9fdHJhbnNmZXIgPSAwOwogCQkvKiBBbGwgQ29udHJvbCBvcGVyYXRpb25zIHN0YXJ0IHdpdGggYSBzZXR1cCBnb2luZyBPVVQgKi8KIAkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAorCQkJCWN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCiAJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCk7CiAKIAkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKKwkJCQljdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBDVk1YX1VTQl9TVEFHRV9EQVRBOgotCQl1c2JjX2hjdHNpei5zLnBpZCA9IF9fY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOwotCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwkJdXNiY19oY3RzaXoucy5waWQgPSBjdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CisJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJCWlmIChoZWFkZXItPmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pCiAJCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSAwOwogCQkJZWxzZSBpZiAoYnl0ZXNfdG9fdHJhbnNmZXIgPiBwaXBlLT5tYXhfcGFja2V0KQogCQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gcGlwZS0+bWF4X3BhY2tldDsKIAkJfQogCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCisJCQkJY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKIAkJCQkoKGhlYWRlci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPwogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4gOgogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSk7CiAJCWJyZWFrOwogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfREFUQV9TUExJVF9DT01QTEVURToKLQkJdXNiY19oY3RzaXoucy5waWQgPSBfX2N2bXhfdXNiX2dldF9kYXRhX3BpZChwaXBlKTsKKwkJdXNiY19oY3RzaXoucy5waWQgPSBjdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CiAJCWlmICghKGhlYWRlci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikpCiAJCQlieXRlc190b190cmFuc2ZlciA9IDA7CiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKKwkJCQljdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAogCQkJCSgoaGVhZGVyLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA/CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9JTiA6CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQpKTsKIAkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKKwkJCQljdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVM6Ci0JCXVzYmNfaGN0c2l6LnMucGlkID0gX19jdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CisJCXVzYmNfaGN0c2l6LnMucGlkID0gY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOwogCQlieXRlc190b190cmFuc2ZlciA9IDA7CiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKKwkJCQljdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAogCQkJCSgoaGVhZGVyLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA/CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQgOgogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4pKTsKIAkJYnJlYWs7CiAJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVNfU1BMSVRfQ09NUExFVEU6Ci0JCXVzYmNfaGN0c2l6LnMucGlkID0gX19jdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CisJCXVzYmNfaGN0c2l6LnMucGlkID0gY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOwogCQlieXRlc190b190cmFuc2ZlciA9IDA7CiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKKwkJCQljdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAogCQkJCSgoaGVhZGVyLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA/CiAJCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQgOgogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4pKTsKIAkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKKwkJCQljdm14X3VzYmN4X2hjc3BsdHgsIGNvbXBzcGx0LCAxKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNjQ2LDggKzE1MDUsOCBAQAogCXVzYmNfaGN0c2l6LnMueGZlcnNpemUgPSBieXRlc190b190cmFuc2ZlcjsKIAl1c2JjX2hjdHNpei5zLnBrdGNudCA9IHBhY2tldHNfdG9fdHJhbnNmZXI7CiAKLQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJICAgICAgIHVzYmNfaGN0c2l6LnUzMik7CisJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkgICAgIHVzYmNfaGN0c2l6LnUzMik7CiB9CiAKIApAQCAtMTY1OCw5ICsxNTE3LDggQEAKICAqIEBjaGFubmVsOgkgIENoYW5uZWwgdG8gc2V0dXAKICAqIEBwaXBlOgkgIFBpcGUgdG8gc3RhcnQKICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9zdGFydF9jaGFubmVsKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCSAgICAgaW50IGNoYW5uZWwsCi0JCQkJICAgICBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSkKK3N0YXRpYyB2b2lkIGN2bXhfdXNiX3N0YXJ0X2NoYW5uZWwoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsIGludCBjaGFubmVsLAorCQkJCSAgIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlKQogewogCXN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24gPQogCQlsaXN0X2ZpcnN0X2VudHJ5KCZwaXBlLT50cmFuc2FjdGlvbnMsIHR5cGVvZigqdHJhbnNhY3Rpb24pLApAQCAtMTY3Miw3ICsxNTMwLDcgQEAKIAkvKiBBdHRhY2ggdGhlIGNoYW5uZWwgdG8gdGhlIHBpcGUgKi8KIAl1c2ItPnBpcGVfZm9yX2NoYW5uZWxbY2hhbm5lbF0gPSBwaXBlOwogCXBpcGUtPmNoYW5uZWwgPSBjaGFubmVsOwotCXBpcGUtPmZsYWdzIHw9IF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQ7CisJcGlwZS0+ZmxhZ3MgfD0gQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQ7CiAKIAkvKiBNYXJrIHRoaXMgY2hhbm5lbCBhcyBpbiB1c2UgKi8KIAl1c2ItPmlkbGVfaGFyZHdhcmVfY2hhbm5lbHMgJj0gfigxPDxjaGFubmVsKTsKQEAgLTE2ODQsMTIgKzE1NDIsMTIgQEAKIAkJdW5pb24gY3ZteF91c2JjeF9oYWludG1zayB1c2JjX2hhaW50bXNrOwogCiAJCS8qIENsZWFyIGFsbCBjaGFubmVsIHN0YXR1cyBiaXRzICovCi0JCXVzYmNfaGNpbnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJCXVzYmNfaGNpbnQudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKLQkJCQkgICAgICAgQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJICAgICAgIHVzYmNfaGNpbnQudTMyKTsKKwkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJICAgICB1c2JjX2hjaW50LnUzMik7CiAKIAkJdXNiY19oY2ludG1zay51MzIgPSAwOwogCQl1c2JjX2hjaW50bXNrLnMuY2hobHRkbXNrID0gMTsKQEAgLTE3MDIsNyArMTU2MCw3IEBACiAJCQl1c2JjX2hjaW50bXNrLnMuZnJtb3ZydW5tc2sgPSAxOwogCQkJdXNiY19oY2ludG1zay5zLmJibGVycm1zayA9IDE7CiAJCQl1c2JjX2hjaW50bXNrLnMueGFjdGVycm1zayA9IDE7Ci0JCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwkJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJCQkvKgogCQkJCSAqIFNwbGl0cyBkb24ndCBnZW5lcmF0ZSB4ZmVyY29tcGwsIHNvIHdlIG5lZWQKIAkJCQkgKiBBQ0sgYW5kIE5ZRVQuCkBAIC0xNzE0LDIxICsxNTcyLDIxIEBACiAJCQl1c2JjX2hjaW50bXNrLnMuc3RhbGxtc2sgPSAxOwogCQkJdXNiY19oY2ludG1zay5zLnhmZXJjb21wbG1zayA9IDE7CiAJCX0KLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKIAkJCQlDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLCB1c2ItPmluZGV4KSwKIAkJCQl1c2JjX2hjaW50bXNrLnUzMik7CiAKIAkJLyogRW5hYmxlIHRoZSBjaGFubmVsIGludGVycnVwdCB0byBwcm9wYWdhdGUgKi8KLQkJdXNiY19oYWludG1zay51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQl1c2JjX2hhaW50bXNrLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAogCQkJCQlDVk1YX1VTQkNYX0hBSU5UTVNLKHVzYi0+aW5kZXgpKTsKIAkJdXNiY19oYWludG1zay5zLmhhaW50bXNrIHw9IDE8PGNoYW5uZWw7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAotCQkJCQlDVk1YX1VTQkNYX0hBSU5UTVNLKHVzYi0+aW5kZXgpLAotCQkJCQl1c2JjX2hhaW50bXNrLnUzMik7CisJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQUlOVE1TSyh1c2ItPmluZGV4KSwKKwkJCQkgICAgIHVzYmNfaGFpbnRtc2sudTMyKTsKIAl9CiAKLQkvKiBTZXR1cCB0aGUgbG9jYXRpb25zIHRoZSBETUEgZW5naW5lcyB1c2UgICovCisJLyogU2V0dXAgdGhlIGxvY2F0aW9uIHRoZSBETUEgZW5naW5lIHVzZXMuICovCiAJeworCQl1aW50NjRfdCByZWc7CiAJCXVpbnQ2NF90IGRtYV9hZGRyZXNzID0gdHJhbnNhY3Rpb24tPmJ1ZmZlciArCiAJCQkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CiAKQEAgLTE3MzcsMTMgKzE1OTUsMTEgQEAKIAkJCQkJdHJhbnNhY3Rpb24tPmlzb19wYWNrZXRzWzBdLm9mZnNldCArCiAJCQkJCXRyYW5zYWN0aW9uLT5hY3R1YWxfYnl0ZXM7CiAKLQkJX19jdm14X3VzYl93cml0ZV9jc3I2NCh1c2IsCi0JCQlDVk1YX1VTQk5YX0RNQTBfT1VUQl9DSE4wKHVzYi0+aW5kZXgpICsgY2hhbm5lbCo4LAotCQkJZG1hX2FkZHJlc3MpOwotCi0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLAotCQkJQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpICsgY2hhbm5lbCo4LAotCQkJZG1hX2FkZHJlc3MpOworCQlpZiAocGlwZS0+dHJhbnNmZXJfZGlyID09IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpCisJCQlyZWcgPSBDVk1YX1VTQk5YX0RNQTBfT1VUQl9DSE4wKHVzYi0+aW5kZXgpOworCQllbHNlCisJCQlyZWcgPSBDVk1YX1VTQk5YX0RNQTBfSU5CX0NITjAodXNiLT5pbmRleCk7CisJCWN2bXhfd3JpdGU2NF91aW50NjQocmVnICsgY2hhbm5lbCAqIDgsIGRtYV9hZGRyZXNzKTsKIAl9CiAKIAkvKiBTZXR1cCBib3RoIHRoZSBzaXplIG9mIHRoZSB0cmFuc2ZlciBhbmQgdGhlIFNQTElUIGNoYXJhY3RlcmlzdGljcyAqLwpAQCAtMTc2Nyw3ICsxNjIzLDcgQEAKIAkJICogV2UgbmVlZCB0byBkbyBzcGxpdCB0cmFuc2FjdGlvbnMgd2hlbiB3ZSBhcmUgdGFsa2luZyB0byBub24KIAkJICogaGlnaCBzcGVlZCBkZXZpY2VzIHRoYXQgYXJlIGJlaGluZCBhIGhpZ2ggc3BlZWQgaHViCiAJCSAqLwotCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwkJaWYgKGN2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgewogCQkJLyoKIAkJCSAqIE9uIHRoZSBzdGFydCBzcGxpdCBwaGFzZSAoc3RhZ2UgaXMgZXZlbikgcmVjb3JkIHRoZQogCQkJICogZnJhbWUgbnVtYmVyIHdlIHdpbGwgbmVlZCB0byBzZW5kIHRoZSBzcGxpdCBjb21wbGV0ZS4KQEAgLTE4OTgsMTggKzE3NTQsMTkgQEAKIAkJdXNiY19oY3RzaXoucy5wa3RjbnQgPSBwYWNrZXRzX3RvX3RyYW5zZmVyOwogCiAJCS8qIFVwZGF0ZSB0aGUgREFUQTAvREFUQTEgdG9nZ2xlICovCi0JCXVzYmNfaGN0c2l6LnMucGlkID0gX19jdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CisJCXVzYmNfaGN0c2l6LnMucGlkID0gY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOwogCQkvKgogCQkgKiBIaWdoIHNwZWVkIHBpcGVzIG1heSBuZWVkIGEgaGFyZHdhcmUgcGluZyBiZWZvcmUgdGhleSBzdGFydAogCQkgKi8KLQkJaWYgKHBpcGUtPmZsYWdzICYgX19DVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORykKKwkJaWYgKHBpcGUtPmZsYWdzICYgQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkcpCiAJCQl1c2JjX2hjdHNpei5zLmRvcG5nID0gMTsKIAotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKLQkJCQkgICAgICAgQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCSAgICAgICB1c2JjX2hjc3BsdC51MzIpOwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsCi0JCQkJCXVzYi0+aW5kZXgpLCB1c2JjX2hjdHNpei51MzIpOworCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJICAgICBDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJICAgICB1c2JjX2hjc3BsdC51MzIpOworCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJICAgICBDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJICAgICB1c2JjX2hjdHNpei51MzIpOwogCX0KIAogCS8qIFNldHVwIHRoZSBIb3N0IENoYW5uZWwgQ2hhcmFjdGVyaXN0aWNzIFJlZ2lzdGVyICovCkBAIC0xOTI4LDcgKzE3ODUsNyBAQAogCQkgKiBpbW1lZGlhdGUgcmV0cmllcyBvZiBmYWlsdXJlLiBUaGVzZSByZXRyaWVzIGhhcHBlbiB0b28KIAkJICogcXVpY2tseSwgc28gd2UgZGlzYWJsZSB0aGVzZSBlbnRpcmVseSBmb3Igc3BsaXRzCiAJCSAqLwotCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCisJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCiAJCQl1c2JjX2hjY2hhci5zLmVjID0gMTsKIAkJZWxzZSBpZiAocGlwZS0+bXVsdGlfY291bnQgPCAxKQogCQkJdXNiY19oY2NoYXIucy5lYyA9IDE7CkBAIC0xOTQ1LDIxICsxODAyLDIxIEBACiAJCXVzYmNfaGNjaGFyLnMuZXBkaXIgPSBwaXBlLT50cmFuc2Zlcl9kaXI7CiAJCXVzYmNfaGNjaGFyLnMuZXBudW0gPSBwaXBlLT5lbmRwb2ludF9udW07CiAJCXVzYmNfaGNjaGFyLnMubXBzID0gcGlwZS0+bWF4X3BhY2tldDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCi0JCQkJICAgICAgIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgdXNiY19oY2NoYXIudTMyKTsKKwkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCSAgICAgdXNiY19oY2NoYXIudTMyKTsKIAl9CiAKIAkvKiBEbyB0cmFuc2FjdGlvbiB0eXBlIHNwZWNpZmljIGZpeHVwcyBhcyBuZWVkZWQgKi8KIAlzd2l0Y2ggKHRyYW5zYWN0aW9uLT50eXBlKSB7CiAJY2FzZSBDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MOgotCQlfX2N2bXhfdXNiX3N0YXJ0X2NoYW5uZWxfY29udHJvbCh1c2IsIGNoYW5uZWwsIHBpcGUpOworCQljdm14X3VzYl9zdGFydF9jaGFubmVsX2NvbnRyb2wodXNiLCBjaGFubmVsLCBwaXBlKTsKIAkJYnJlYWs7CiAJY2FzZSBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLOgogCWNhc2UgQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUOgogCQlicmVhazsKIAljYXNlIENWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTOgotCQlpZiAoIV9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CisJCWlmICghY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CiAJCQkvKgogCQkJICogSVNPIHRyYW5zYWN0aW9ucyByZXF1aXJlIGRpZmZlcmVudCBQSURzIGRlcGVuZGluZyBvbgogCQkJICogZGlyZWN0aW9uIGFuZCBob3cgbWFueSBwYWNrZXRzIGFyZSBuZWVkZWQKQEAgLTE5NjksMzIgKzE4MjYsMzAgQEAKIAkJCQkJVVNCX1NFVF9GSUVMRDMyKAogCQkJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsCiAJCQkJCQkJCSAgIHVzYi0+aW5kZXgpLAotCQkJCQkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4LAotCQkJCQkJcGlkLCAwKTsKKwkJCQkJCWN2bXhfdXNiY3hfaGN0c2l6eCwgcGlkLCAwKTsKIAkJCQllbHNlIC8qIE5lZWQgTURBVEEgKi8KIAkJCQkJVVNCX1NFVF9GSUVMRDMyKAogCQkJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsCiAJCQkJCQkJCSAgIHVzYi0+aW5kZXgpLAotCQkJCQkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4LAotCQkJCQkJcGlkLCAzKTsKKwkJCQkJCWN2bXhfdXNiY3hfaGN0c2l6eCwgcGlkLCAzKTsKIAkJCX0KIAkJfQogCQlicmVhazsKIAl9CiAJewogCQl1bmlvbiBjdm14X3VzYmN4X2hjdHNpenggdXNiY19oY3RzaXogPSB7LnUzMiA9Ci0JCQlfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKX07CiAJCXRyYW5zYWN0aW9uLT54ZmVyc2l6ZSA9IHVzYmNfaGN0c2l6LnMueGZlcnNpemU7CiAJCXRyYW5zYWN0aW9uLT5wa3RjbnQgPSB1c2JjX2hjdHNpei5zLnBrdGNudDsKIAl9CiAJLyogUmVtZWJlciB3aGVuIHdlIHN0YXJ0IGEgc3BsaXQgdHJhbnNhY3Rpb24gKi8KLQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCisJaWYgKGN2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkKIAkJdXNiLT5hY3RpdmVfc3BsaXQgPSB0cmFuc2FjdGlvbjsKIAlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBjaGVuYSwgMSk7CisJCQljdm14X3VzYmN4X2hjY2hhcngsIGNoZW5hLCAxKTsKIAlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpCi0JCV9fY3ZteF91c2JfZmlsbF90eF9maWZvKHVzYiwgY2hhbm5lbCk7CisJCWN2bXhfdXNiX2ZpbGxfdHhfZmlmbyh1c2IsIGNoYW5uZWwpOwogfQogCiAKQEAgLTIwMDcsNyArMTg2Miw3IEBACiAgKgogICogUmV0dXJuczogUGlwZSBvciBOVUxMIGlmIG5vbmUgYXJlIHJlYWR5CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUoCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3BpcGUgKmN2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSgKIAkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCiAJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCXVpbnQ2NF90IGN1cnJlbnRfZnJhbWUpCkBAIC0yMDE4LDcgKzE4NzMsNyBAQAogCQlzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnQgPQogCQkJbGlzdF9maXJzdF9lbnRyeSgmcGlwZS0+dHJhbnNhY3Rpb25zLCB0eXBlb2YoKnQpLAogCQkJCQkgbm9kZSk7Ci0JCWlmICghKHBpcGUtPmZsYWdzICYgX19DVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRCkgJiYgdCAmJgorCQlpZiAoIShwaXBlLT5mbGFncyAmIENWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEKSAmJiB0ICYmCiAJCQkocGlwZS0+bmV4dF90eF9mcmFtZSA8PSBjdXJyZW50X2ZyYW1lKSAmJgogCQkJKChwaXBlLT5zcGxpdF9zY19mcmFtZSA9PSAtMSkgfHwKIAkJCSAoKCgoaW50KWN1cnJlbnRfZnJhbWUgLSAoaW50KXBpcGUtPnNwbGl0X3NjX2ZyYW1lKQpAQCAtMjAzOSw3ICsxODk0LDcgQEAKICAqIEB1c2I6CSBVU0IgZGV2aWNlIHN0YXRlIHBvcHVsYXRlZCBieSBjdm14X3VzYl9pbml0aWFsaXplKCkuCiAgKiBAaXNfc29mOgkgVHJ1ZSBpZiB0aGlzIHNjaGVkdWxlIHdhcyBjYWxsZWQgb24gYSBTT0YgaW50ZXJydXB0LgogICovCi1zdGF0aWMgdm9pZCBfX2N2bXhfdXNiX3NjaGVkdWxlKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBpbnQgaXNfc29mKQorc3RhdGljIHZvaWQgY3ZteF91c2Jfc2NoZWR1bGUoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsIGludCBpc19zb2YpCiB7CiAJaW50IGNoYW5uZWw7CiAJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGU7CkBAIC0yMDUyLDEyICsxOTA3LDEyIEBACiAJCSAqIGF0IHRoZSBlbmQgb2YgYSBmcmFtZSBhbmQgY2F1c2UgYW4gb3ZlcnJ1bi4KIAkJICovCiAJCXVuaW9uIGN2bXhfdXNiY3hfaGZudW0gaGZudW0gPSB7Ci0JCQkudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCS51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKIAkJCQkJCUNWTVhfVVNCQ1hfSEZOVU0odXNiLT5pbmRleCkpCiAJCX07CiAKIAkJdW5pb24gY3ZteF91c2JjeF9oZmlyIGhmaXIgPSB7Ci0JCQkudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCS51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKIAkJCQkJCUNWTVhfVVNCQ1hfSEZJUih1c2ItPmluZGV4KSkKIAkJfTsKIApAQCAtMjA3OSwyMyArMTkzNCwyMyBAQAogCQkJICogd2F5IHdlIGFyZSBzdXJlIHRoYXQgdGhlIHBlcmlvZGljIGRhdGEgaXMgc2VudCBpbiB0aGUKIAkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUKIAkJCSAqLwotCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCXBpcGUgPSBjdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAogCQkJCQl1c2ItPmFjdGl2ZV9waXBlcyArCiAJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTLAogCQkJCQl1c2ItPmZyYW1lX251bWJlcik7CiAJCQlpZiAobGlrZWx5KCFwaXBlKSkKLQkJCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAorCQkJCXBpcGUgPSBjdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAogCQkJCQkJdXNiLT5hY3RpdmVfcGlwZXMgKwogCQkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBULAogCQkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwogCQl9CiAJCWlmIChsaWtlbHkoIXBpcGUpKSB7Ci0JCQlwaXBlID0gX19jdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAorCQkJcGlwZSA9IGN2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCiAJCQkJCXVzYi0+YWN0aXZlX3BpcGVzICsKIAkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTCwKIAkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwogCQkJaWYgKGxpa2VseSghcGlwZSkpCi0JCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCQlwaXBlID0gY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKIAkJCQkJCXVzYi0+YWN0aXZlX3BpcGVzICsKIAkJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0JVTEssCiAJCQkJCQl1c2ItPmZyYW1lX251bWJlcik7CkBAIC0yMTAzLDcgKzE5NTgsNyBAQAogCQlpZiAoIXBpcGUpCiAJCQlicmVhazsKIAotCQlfX2N2bXhfdXNiX3N0YXJ0X2NoYW5uZWwodXNiLCBjaGFubmVsLCBwaXBlKTsKKwkJY3ZteF91c2Jfc3RhcnRfY2hhbm5lbCh1c2IsIGNoYW5uZWwsIHBpcGUpOwogCX0KIAogZG9uZToKQEAgLTIxMjIsNyArMTk3Nyw3IEBACiAJCX0KIAl9CiAJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywgc29mbXNrLCBuZWVkX3NvZik7CisJCQljdm14X3VzYmN4X2dpbnRtc2ssIHNvZm1zaywgbmVlZF9zb2YpOwogfQogCiBzdGF0aWMgdm9pZCBvY3Rlb25fdXNiX3VyYl9jb21wbGV0ZV9jYWxsYmFjayhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKQEAgLTIyMjYsMTEgKzIwODEsMTAgQEAKICAqIEBjb21wbGV0ZV9jb2RlOgogICoJCSBDb21wbGV0aW9uIGNvZGUKICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAotCQkJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAotCQkJCXN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCi0JCQkJZW51bSBjdm14X3VzYl9jb21wbGV0ZSBjb21wbGV0ZV9jb2RlKQorc3RhdGljIHZvaWQgY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZShzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkgICAgICBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKKwkJCQkgICAgICBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAorCQkJCSAgICAgIGVudW0gY3ZteF91c2JfY29tcGxldGUgY29tcGxldGVfY29kZSkKIHsKIAkvKiBJZiB0aGlzIHdhcyBhIHNwbGl0IHRoZW4gY2xlYXIgb3VyIHNwbGl0IGluIHByb2dyZXNzIG1hcmtlciAqLwogCWlmICh1c2ItPmFjdGl2ZV9zcGxpdCA9PSB0cmFuc2FjdGlvbikKQEAgLTIyOTYsNyArMjE1MCw3IEBACiAgKgogICogUmV0dXJuczogVHJhbnNhY3Rpb24gb3IgTlVMTCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbigKK3N0YXRpYyBzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKmN2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbigKIAkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKIAkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKIAkJCQllbnVtIGN2bXhfdXNiX3RyYW5zZmVyIHR5cGUsCkBAIC0yMzQyLDcgKzIxOTYsNyBAQAogCQkgKiBXZSBtYXkgbmVlZCB0byBzY2hlZHVsZSB0aGUgcGlwZSBpZiB0aGlzIHdhcyB0aGUgaGVhZCBvZiB0aGUKIAkJICogcGlwZS4KIAkJICovCi0JCV9fY3ZteF91c2Jfc2NoZWR1bGUodXNiLCAwKTsKKwkJY3ZteF91c2Jfc2NoZWR1bGUodXNiLCAwKTsKIAl9CiAKIAlyZXR1cm4gdHJhbnNhY3Rpb247CkBAIC0yMzYzLDE0ICsyMjE3LDE0IEBACiAJCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKIAkJCQkJCXN0cnVjdCB1cmIgKnVyYikKIHsKLQlyZXR1cm4gX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24odXNiLCBwaXBlLCBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLLAotCQkJCQkgICAgIHVyYi0+dHJhbnNmZXJfZG1hLAotCQkJCQkgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQkJICAgICAwLCAvKiBjb250cm9sX2hlYWRlciAqLwotCQkJCQkgICAgIDAsIC8qIGlzb19zdGFydF9mcmFtZSAqLwotCQkJCQkgICAgIDAsIC8qIGlzb19udW1iZXJfcGFja2V0cyAqLwotCQkJCQkgICAgIE5VTEwsIC8qIGlzb19wYWNrZXRzICovCi0JCQkJCSAgICAgdXJiKTsKKwlyZXR1cm4gY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHVzYiwgcGlwZSwgQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSywKKwkJCQkJICAgdXJiLT50cmFuc2Zlcl9kbWEsCisJCQkJCSAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQkJICAgMCwgLyogY29udHJvbF9oZWFkZXIgKi8KKwkJCQkJICAgMCwgLyogaXNvX3N0YXJ0X2ZyYW1lICovCisJCQkJCSAgIDAsIC8qIGlzb19udW1iZXJfcGFja2V0cyAqLworCQkJCQkgICBOVUxMLCAvKiBpc29fcGFja2V0cyAqLworCQkJCQkgICB1cmIpOwogfQogCiAKQEAgLTIzODgsMTUgKzIyNDIsMTUgQEAKIAkJCQkJCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlLAogCQkJCQkJc3RydWN0IHVyYiAqdXJiKQogewotCXJldHVybiBfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsCi0JCQkJCSAgICAgQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBULAotCQkJCQkgICAgIHVyYi0+dHJhbnNmZXJfZG1hLAotCQkJCQkgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQkJICAgICAwLCAvKiBjb250cm9sX2hlYWRlciAqLwotCQkJCQkgICAgIDAsIC8qIGlzb19zdGFydF9mcmFtZSAqLwotCQkJCQkgICAgIDAsIC8qIGlzb19udW1iZXJfcGFja2V0cyAqLwotCQkJCQkgICAgIE5VTEwsIC8qIGlzb19wYWNrZXRzICovCi0JCQkJCSAgICAgdXJiKTsKKwlyZXR1cm4gY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHVzYiwgcGlwZSwKKwkJCQkJICAgQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBULAorCQkJCQkgICB1cmItPnRyYW5zZmVyX2RtYSwKKwkJCQkJICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJCQkgICAwLCAvKiBjb250cm9sX2hlYWRlciAqLworCQkJCQkgICAwLCAvKiBpc29fc3RhcnRfZnJhbWUgKi8KKwkJCQkJICAgMCwgLyogaXNvX251bWJlcl9wYWNrZXRzICovCisJCQkJCSAgIE5VTEwsIC8qIGlzb19wYWNrZXRzICovCisJCQkJCSAgIHVyYik7CiB9CiAKIApAQCAtMjQyMSwxNCArMjI3NSwxNCBAQAogCWlmICgoaGVhZGVyLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA9PSAwKQogCQlidWZmZXJfbGVuZ3RoID0gbGUxNl90b19jcHUoaGVhZGVyLT53TGVuZ3RoKTsKIAotCXJldHVybiBfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsCi0JCQkJCSAgICAgQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTCwKLQkJCQkJICAgICB1cmItPnRyYW5zZmVyX2RtYSwgYnVmZmVyX2xlbmd0aCwKLQkJCQkJICAgICBjb250cm9sX2hlYWRlciwKLQkJCQkJICAgICAwLCAvKiBpc29fc3RhcnRfZnJhbWUgKi8KLQkJCQkJICAgICAwLCAvKiBpc29fbnVtYmVyX3BhY2tldHMgKi8KLQkJCQkJICAgICBOVUxMLCAvKiBpc29fcGFja2V0cyAqLwotCQkJCQkgICAgIHVyYik7CisJcmV0dXJuIGN2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsCisJCQkJCSAgIENWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0wsCisJCQkJCSAgIHVyYi0+dHJhbnNmZXJfZG1hLCBidWZmZXJfbGVuZ3RoLAorCQkJCQkgICBjb250cm9sX2hlYWRlciwKKwkJCQkJICAgMCwgLyogaXNvX3N0YXJ0X2ZyYW1lICovCisJCQkJCSAgIDAsIC8qIGlzb19udW1iZXJfcGFja2V0cyAqLworCQkJCQkgICBOVUxMLCAvKiBpc29fcGFja2V0cyAqLworCQkJCQkgICB1cmIpOwogfQogCiAKQEAgLTI0NDksMTQgKzIzMDMsMTQgQEAKIAlzdHJ1Y3QgY3ZteF91c2JfaXNvX3BhY2tldCAqcGFja2V0czsKIAogCXBhY2tldHMgPSAoc3RydWN0IGN2bXhfdXNiX2lzb19wYWNrZXQgKikgdXJiLT5zZXR1cF9wYWNrZXQ7Ci0JcmV0dXJuIF9fY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHVzYiwgcGlwZSwKLQkJCQkJICAgICBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUywKLQkJCQkJICAgICB1cmItPnRyYW5zZmVyX2RtYSwKLQkJCQkJICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQkJCSAgICAgMCwgLyogY29udHJvbF9oZWFkZXIgKi8KLQkJCQkJICAgICB1cmItPnN0YXJ0X2ZyYW1lLAotCQkJCQkgICAgIHVyYi0+bnVtYmVyX29mX3BhY2tldHMsCi0JCQkJCSAgICAgcGFja2V0cywgdXJiKTsKKwlyZXR1cm4gY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHVzYiwgcGlwZSwKKwkJCQkJICAgQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMsCisJCQkJCSAgIHVyYi0+dHJhbnNmZXJfZG1hLAorCQkJCQkgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJCSAgIDAsIC8qIGNvbnRyb2xfaGVhZGVyICovCisJCQkJCSAgIHVyYi0+c3RhcnRfZnJhbWUsCisJCQkJCSAgIHVyYi0+bnVtYmVyX29mX3BhY2tldHMsCisJCQkJCSAgIHBhY2tldHMsIHVyYik7CiB9CiAKIApAQCAtMjQ4MiwxNSArMjMzNiwxNSBAQAogCSAqIHRyZWF0IGl0IHNwZWNpYWwKIAkgKi8KIAlpZiAobGlzdF9maXJzdF9lbnRyeSgmcGlwZS0+dHJhbnNhY3Rpb25zLCB0eXBlb2YoKnRyYW5zYWN0aW9uKSwgbm9kZSkgPT0KLQkgICAgdHJhbnNhY3Rpb24gJiYgKHBpcGUtPmZsYWdzICYgX19DVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRCkpIHsKKwkgICAgdHJhbnNhY3Rpb24gJiYgKHBpcGUtPmZsYWdzICYgQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQpKSB7CiAJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCB1c2JjX2hjY2hhcjsKIAogCQl1c2ItPnBpcGVfZm9yX2NoYW5uZWxbcGlwZS0+Y2hhbm5lbF0gPSBOVUxMOwotCQlwaXBlLT5mbGFncyAmPSB+X19DVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRDsKKwkJcGlwZS0+ZmxhZ3MgJj0gfkNWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEOwogCiAJCUNWTVhfU1lOQ1c7CiAKLQkJdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJdXNiY19oY2NoYXIudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKHBpcGUtPmNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAkJLyoKIAkJICogSWYgdGhlIGNoYW5uZWwgaXNuJ3QgZW5hYmxlZCB0aGVuIHRoZSB0cmFuc2FjdGlvbiBhbHJlYWR5CkBAIC0yNDk4LDE0ICsyMzUyLDE0IEBACiAJCSAqLwogCQlpZiAodXNiY19oY2NoYXIucy5jaGVuYSkgewogCQkJdXNiY19oY2NoYXIucy5jaGRpcyA9IDE7Ci0JCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKIAkJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKHBpcGUtPmNoYW5uZWwsCiAJCQkJCQl1c2ItPmluZGV4KSwKIAkJCQkJdXNiY19oY2NoYXIudTMyKTsKIAkJfQogCX0KLQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKLQkJCQkgICAgQ1ZNWF9VU0JfQ09NUExFVEVfQ0FOQ0VMKTsKKwljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJICBDVk1YX1VTQl9DT01QTEVURV9DQU5DRUwpOwogCXJldHVybiAwOwogfQogCkBAIC0yNTcwLDggKzI0MjQsNyBAQAogCWludCBmcmFtZV9udW1iZXI7CiAJdW5pb24gY3ZteF91c2JjeF9oZm51bSB1c2JjX2hmbnVtOwogCi0JdXNiY19oZm51bS51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJQ1ZNWF9VU0JDWF9IRk5VTSh1c2ItPmluZGV4KSk7CisJdXNiY19oZm51bS51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IRk5VTSh1c2ItPmluZGV4KSk7CiAJZnJhbWVfbnVtYmVyID0gdXNiY19oZm51bS5zLmZybnVtOwogCiAJcmV0dXJuIGZyYW1lX251bWJlcjsKQEAgLTI1ODYsNyArMjQzOSw3IEBACiAgKgogICogUmV0dXJuczogWmVybyBvbiBzdWNjZXNzCiAgKi8KLXN0YXRpYyBpbnQgX19jdm14X3VzYl9wb2xsX2NoYW5uZWwoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsIGludCBjaGFubmVsKQorc3RhdGljIGludCBjdm14X3VzYl9wb2xsX2NoYW5uZWwoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsIGludCBjaGFubmVsKQogewogCXN0cnVjdCBvY3Rlb25faGNkICpwcml2ID0gY3ZteF91c2JfdG9fb2N0ZW9uKHVzYik7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IG9jdGVvbl90b19oY2QocHJpdik7CkBAIC0yNjAyLDExICsyNDU1LDExIEBACiAJaW50IGJ1ZmZlcl9zcGFjZV9sZWZ0OwogCiAJLyogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cyBiaXRzIGZvciB0aGUgY2hhbm5lbCAqLwotCXVzYmNfaGNpbnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCUNWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjaW50LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCUNWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCWlmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkgewotCQl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQl1c2JjX2hjY2hhci51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKIAkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCiAJCWlmICh1c2JjX2hjY2hhci5zLmNoZW5hICYmIHVzYmNfaGNjaGFyLnMuY2hkaXMpIHsKQEAgLTI2MTUsNyArMjQ2OCw3IEBACiAJCQkgKiBpbnRlcnJ1cHQgSU4gdHJhbnNmZXJzIHRvIGdldCBzdHVjayB1bnRpbCB3ZSBkbyBhCiAJCQkgKiB3cml0ZSBvZiBIQ0NIQVJYIHdpdGhvdXQgY2hhbmdpbmcgdGhpbmdzCiAJCQkgKi8KLQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAogCQkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwKIAkJCQkJCQkgICB1c2ItPmluZGV4KSwKIAkJCQkJdXNiY19oY2NoYXIudTMyKTsKQEAgLTI2MzIsMTIgKzI0ODUsMTIgQEAKIAkJCQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBDSEhMVEQgKi8KIAkJCQloY2ludG1zay51MzIgPSAwOwogCQkJCWhjaW50bXNrLnMuY2hobHRkbXNrID0gMTsKLQkJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCiAJCQkJCQlDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLAogCQkJCQkJCXVzYi0+aW5kZXgpLAogCQkJCQkJaGNpbnRtc2sudTMyKTsKIAkJCQl1c2JjX2hjY2hhci5zLmNoZGlzID0gMTsKLQkJCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCiAJCQkJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwKIAkJCQkJCQl1c2ItPmluZGV4KSwKIAkJCQkJCXVzYmNfaGNjaGFyLnUzMik7CkBAIC0yNjYzLDkgKzI1MTYsNyBAQAogCX0KIAogCS8qIERpc2FibGUgdGhlIGNoYW5uZWwgaW50ZXJydXB0cyBub3cgdGhhdCBpdCBpcyBkb25lICovCi0JX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCi0JCQkJQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJMCk7CisJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDSU5UTVNLWChjaGFubmVsLCB1c2ItPmluZGV4KSwgMCk7CiAJdXNiLT5pZGxlX2hhcmR3YXJlX2NoYW5uZWxzIHw9ICgxPDxjaGFubmVsKTsKIAogCS8qIE1ha2Ugc3VyZSB0aGlzIGNoYW5uZWwgaXMgdGllZCB0byBhIHZhbGlkIHBpcGUgKi8KQEAgLTI2ODMsMTUgKzI1MzQsMTUgQEAKIAkgKiBmdW5jdGlvbiB3aWxsIGZpZ3VyZSBvdXQgd2hpY2ggcGlwZSBuZWVkcyB0byBnbwogCSAqLwogCXVzYi0+cGlwZV9mb3JfY2hhbm5lbFtjaGFubmVsXSA9IE5VTEw7Ci0JcGlwZS0+ZmxhZ3MgJj0gfl9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQ7CisJcGlwZS0+ZmxhZ3MgJj0gfkNWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEOwogCiAJLyoKIAkgKiBSZWFkIHRoZSBjaGFubmVsIGNvbmZpZyBpbmZvIHNvIHdlIGNhbiBmaWd1cmUgb3V0IGhvdyBtdWNoIGRhdGEKIAkgKiB0cmFuc2ZlcnJlZAogCSAqLwotCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJdXNiY19oY2NoYXIudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQlDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwotCXVzYmNfaGN0c2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJdXNiY19oY3RzaXoudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQlDVk1YX1VTQkNYX0hDVFNJWlgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCiAJLyoKQEAgLTI3NjYsNyArMjYxNywxOCBAQAogCWlmICgocGlwZS0+ZGV2aWNlX3NwZWVkID09IENWTVhfVVNCX1NQRUVEX0hJR0gpICYmCiAJCShwaXBlLT50cmFuc2Zlcl90eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0JVTEspICYmCiAJCShwaXBlLT50cmFuc2Zlcl9kaXIgPT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkpCi0JCXBpcGUtPmZsYWdzIHw9IF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc7CisJCXBpcGUtPmZsYWdzIHw9IENWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOworCisJaWYgKHVubGlrZWx5KFdBUk5fT05fT05DRShieXRlc190aGlzX3RyYW5zZmVyIDwgMCkpKSB7CisJCS8qCisJCSAqIEluIHNvbWUgcmFyZSBjYXNlcyB0aGUgRE1BIGVuZ2luZSBzZWVtcyB0byBnZXQgc3R1Y2sgYW5kCisJCSAqIGtlZXBzIHN1YnN0cmFjdGluZyBzYW1lIGJ5dGUgY291bnQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gSW4KKwkJICogc3VjaCBjYXNlIHdlIGp1c3QgbmVlZCB0byBmYWlsIGV2ZXJ5IHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCQkgIENWTVhfVVNCX0NPTVBMRVRFX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJaWYgKHVzYmNfaGNpbnQucy5zdGFsbCkgewogCQkvKgpAQCAtMjc3Niw1MiArMjYzOCwyNCBAQAogCQkgKiB0aGUgYWN0dWFsIGJ5dGVzIHRyYW5zZmVycmVkCiAJCSAqLwogCQlwaXBlLT5waWRfdG9nZ2xlID0gMDsKLQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCi0JCQkJCSAgICBDVk1YX1VTQl9DT01QTEVURV9TVEFMTCk7CisJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJICBDVk1YX1VTQl9DT01QTEVURV9TVEFMTCk7CiAJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMueGFjdGVycikgewogCQkvKgotCQkgKiBXZSBrbm93IGF0IGxlYXN0IG9uZSBwYWNrZXQgd29ya2VkIGlmIHdlIGdldCBhIEFDSyBvciBOQUsuCi0JCSAqIFJlc2V0IHRoZSByZXRyeSBjb3VudGVyCisJCSAqIFhhY3RFcnIgYXMgYSByZXNwb25zZSBtZWFucyB0aGUgZGV2aWNlIHNpZ25hbGVkCisJCSAqIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSB0cmFuc2Zlci4gRm9yIGV4YW1wbGUsIFBJRAorCQkgKiB0b2dnbGUgZXJyb3JzIGNhdXNlIHRoZXNlLgogCQkgKi8KLQkJaWYgKHVzYmNfaGNpbnQucy5uYWsgfHwgdXNiY19oY2ludC5zLmFjaykKLQkJCXRyYW5zYWN0aW9uLT5yZXRyaWVzID0gMDsKLQkJdHJhbnNhY3Rpb24tPnJldHJpZXMrKzsKLQkJaWYgKHRyYW5zYWN0aW9uLT5yZXRyaWVzID4gTUFYX1JFVFJJRVMpIHsKLQkJCS8qCi0JCQkgKiBYYWN0RXJyIGFzIGEgcmVzcG9uc2UgbWVhbnMgdGhlIGRldmljZSBzaWduYWxlZAotCQkJICogc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIHRyYW5zZmVyLiBGb3IgZXhhbXBsZSwgUElECi0JCQkgKiB0b2dnbGUgZXJyb3JzIGNhdXNlIHRoZXNlCi0JCQkgKi8KLQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAotCQkJCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX1hBQ1RFUlIpOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIElmIHRoaXMgd2FzIGEgc3BsaXQgdGhlbiBjbGVhciBvdXIgc3BsaXQgaW4gcHJvZ3Jlc3MKLQkJCSAqIG1hcmtlcgotCQkJICovCi0JCQlpZiAodXNiLT5hY3RpdmVfc3BsaXQgPT0gdHJhbnNhY3Rpb24pCi0JCQkJdXNiLT5hY3RpdmVfc3BsaXQgPSBOVUxMOwotCQkJLyoKLQkJCSAqIFJld2luZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2FjdGlvbiBieSBhbmRpbmcKLQkJCSAqIG9mZiB0aGUgc3BsaXQgY29tcGxldGUgYml0Ci0JCQkgKi8KLQkJCXRyYW5zYWN0aW9uLT5zdGFnZSAmPSB+MTsKLQkJCXBpcGUtPnNwbGl0X3NjX2ZyYW1lID0gLTE7Ci0JCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwotCQkJaWYgKHBpcGUtPm5leHRfdHhfZnJhbWUgPCB1c2ItPmZyYW1lX251bWJlcikKLQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lID0KLQkJCQkJdXNiLT5mcmFtZV9udW1iZXIgKyBwaXBlLT5pbnRlcnZhbCAtCi0JCQkJCSh1c2ItPmZyYW1lX251bWJlciAtCi0JCQkJCSBwaXBlLT5uZXh0X3R4X2ZyYW1lKSAlIHBpcGUtPmludGVydmFsOwotCQl9CisJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJICBDVk1YX1VTQl9DT01QTEVURV9YQUNURVJSKTsKIAl9IGVsc2UgaWYgKHVzYmNfaGNpbnQucy5iYmxlcnIpIHsKIAkJLyogQmFiYmxlIEVycm9yIChCYmxFcnIpICovCi0JCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAotCQkJCQkgICAgQ1ZNWF9VU0JfQ09NUExFVEVfQkFCQkxFRVJSKTsKKwkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCQkgIENWTVhfVVNCX0NPTVBMRVRFX0JBQkJMRUVSUik7CiAJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMuZGF0YXRnbGVycikgewogCQkvKiBEYXRhIHRvZ2dsZSBlcnJvciAqLwotCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKLQkJCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX0RBVEFUR0xFUlIpOworCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJCSAgQ1ZNWF9VU0JfQ09NUExFVEVfREFUQVRHTEVSUik7CiAJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMubnlldCkgewogCQkvKgogCQkgKiBOWUVUIGFzIGEgcmVzcG9uc2UgaXMgb25seSBhbGxvd2VkIGluIHRocmVlIGNhc2VzOiBhcyBhCkBAIC0yODI5LDcgKzI2NjMsNyBAQAogCQkgKiBhcyBhIHJlc3BvbnNlIHRvIGEgYnVsayBvdXQuIFRoZSBwaW5nIGNhc2UgaXMgaGFuZGxlZCBieQogCQkgKiBoYXJkd2FyZSwgc28gd2Ugb25seSBoYXZlIHNwbGl0cyBhbmQgYnVsayBvdXQKIAkJICovCi0JCWlmICghX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwkJaWYgKCFjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJCXRyYW5zYWN0aW9uLT5yZXRyaWVzID0gMDsKIAkJCS8qCiAJCQkgKiBJZiB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gZ28gdGhlbiB3ZSBuZWVkIHRvIHRyeQpAQCAtMjgzNyw3ICsyNjcxLDcgQEAKIAkJCSAqLwogCQkJaWYgKChidWZmZXJfc3BhY2VfbGVmdCA9PSAwKSB8fAogCQkJCShieXRlc19pbl9sYXN0X3BhY2tldCA8IHBpcGUtPm1heF9wYWNrZXQpKQotCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCisJCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCiAJCQkJCQl0cmFuc2FjdGlvbiwKIAkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQl9IGVsc2UgewpAQCAtMjg2OSw3ICsyNzAzLDcgQEAKIAkJICogU2luY2Ugd2UgZ290IGFuIEFDSywgd2Uga25vdyB3ZSBkb24ndCBuZWVkIHRvIGRvIGEgcGluZyBvbgogCQkgKiB0aGlzIHBpcGUKIAkJICovCi0JCXBpcGUtPmZsYWdzICY9IH5fX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOworCQlwaXBlLT5mbGFncyAmPSB+Q1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc7CiAKIAkJc3dpdGNoICh0cmFuc2FjdGlvbi0+dHlwZSkgewogCQljYXNlIENWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0w6CkBAIC0yODc3LDEyICsyNzExLDEyIEBACiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MOgogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTF9TUExJVF9DT01QTEVURToKIAkJCQkvKiBUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlICovCi0JCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKKwkJCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKIAkJCQkJdHJhbnNhY3Rpb24sIENWTVhfVVNCX0NPTVBMRVRFX0VSUk9SKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU0VUVVA6CiAJCQkJcGlwZS0+cGlkX3RvZ2dsZSA9IDE7Ci0JCQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQorCQkJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCiAJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CiAJCQkJCQlDVk1YX1VTQl9TVEFHRV9TRVRVUF9TUExJVF9DT01QTEVURTsKIAkJCQllbHNlIHsKQEAgLTI5MDksNyArMjc0Myw3IEBACiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9EQVRBOgotCQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgeworCQkJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KIAkJCQkJCUNWTVhfVVNCX1NUQUdFX0RBVEFfU1BMSVRfQ09NUExFVEU7CiAJCQkJCS8qCkBAIC0yOTQ3LDE2ICsyNzgxLDE2IEBACiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVM6Ci0JCQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQorCQkJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCiAJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CiAJCQkJCQlDVk1YX1VTQl9TVEFHRV9TVEFUVVNfU1BMSVRfQ09NUExFVEU7CiAJCQkJZWxzZQotCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAorCQkJCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKIAkJCQkJCXRyYW5zYWN0aW9uLAogCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX1NUQVRVU19TUExJVF9DT01QTEVURToKLQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAorCQkJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAogCQkJCQkJdHJhbnNhY3Rpb24sCiAJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQlicmVhazsKQEAgLTI5NzAsNyArMjgwNCw3IEBACiAJCQkgKiBGb3Igc3BsaXRzIHdlIG5lZWQgdG8gY29udGludWUgdGhlIHRyYW5zZmVyIGlmIG1vcmUKIAkJCSAqIGRhdGEgaXMgbmVlZGVkCiAJCQkgKi8KLQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgeworCQkJaWYgKGN2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgewogCQkJCWlmICh0cmFuc2FjdGlvbi0+c3RhZ2UgPT0KIAkJCQkJCUNWTVhfVVNCX1NUQUdFX05PTl9DT05UUk9MKQogCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQpAQCAtMjk4Niw3ICsyODIwLDcgQEAKIAkJCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQpCiAJCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPQogCQkJCQkJCQlwaXBlLT5pbnRlcnZhbDsKLQkJCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoCisJCQkJCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKIAkJCQkJCQkJdXNiLAogCQkJCQkJCQlwaXBlLAogCQkJCQkJCQl0cmFuc2FjdGlvbiwKQEAgLTMwMDIsNyArMjgzNiw3IEBACiAJCQkJICAgICBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSAmJgogCQkJCSAgICAodXNiY19oY2ludC5zLm5haykpCiAJCQkJCXBpcGUtPmZsYWdzIHw9Ci0JCQkJCQlfX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOworCQkJCQkJQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc7CiAJCQkJaWYgKCFidWZmZXJfc3BhY2VfbGVmdCB8fAogCQkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPAogCQkJCQkgcGlwZS0+bWF4X3BhY2tldCkpIHsKQEAgLTMwMTAsMTUgKzI4NDQsMTQgQEAKIAkJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCkKIAkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0KIAkJCQkJCQlwaXBlLT5pbnRlcnZhbDsKLQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwKLQkJCQkJCXBpcGUsCisJCQkJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAogCQkJCQkJdHJhbnNhY3Rpb24sCiAJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUzoKLQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgeworCQkJaWYgKGN2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgewogCQkJCS8qCiAJCQkJICogSVNPQ0hST05PVVMgT1VUIHNwbGl0cyBkb24ndCByZXF1aXJlIGEKIAkJCQkgKiBjb21wbGV0ZSBzcGxpdCBzdGFnZS4gSW5zdGVhZCB0aGV5IHVzZSBhCkBAIC0zMDM5LDEwICsyODcyLDggQEAKIAkJCQkJCShieXRlc190aGlzX3RyYW5zZmVyIDwgMTg4KSkgewogCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPQogCQkJCQkJCXBpcGUtPmludGVydmFsOwotCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAotCQkJCQkJCXVzYiwKLQkJCQkJCQlwaXBlLAotCQkJCQkJCXRyYW5zYWN0aW9uLAorCQkJCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsCisJCQkJCQkJcGlwZSwgdHJhbnNhY3Rpb24sCiAJCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewpAQCAtMzA1OSw3ICsyODkwLDcgQEAKIAkJCQkJCQkgcGlwZS0+bWF4X3BhY2tldCkpIHsKIAkJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9CiAJCQkJCQkJCXBpcGUtPmludGVydmFsOwotCQkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKKwkJCQkJCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAogCQkJCQkJCQl1c2IsCiAJCQkJCQkJCXBpcGUsCiAJCQkJCQkJCXRyYW5zYWN0aW9uLApAQCAtMzA3MSw4ICsyOTAyLDcgQEAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0gcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwKLQkJCQkJCXBpcGUsCisJCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCiAJCQkJCQl0cmFuc2FjdGlvbiwKIAkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJfQpAQCAtMzExMCw3ICsyOTQwLDcgQEAKIAkJCSAqIFdlIGdldCBjaGFubmVsIGhhbHRlZCBpbnRlcnJ1cHRzIHdpdGggbm8gcmVzdWx0IGJpdHMKIAkJCSAqIHNldHMgd2hlbiB0aGUgY2FibGUgaXMgdW5wbHVnZ2VkCiAJCQkgKi8KLQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAogCQkJCQlDVk1YX1VTQl9DT01QTEVURV9FUlJPUik7CiAJCX0KIAl9CkBAIC0zMTQ0LDIxICsyOTc0LDE5IEBACiAJcHJlZmV0Y2hfcmFuZ2UodXNiLCBzaXplb2YoKnVzYikpOwogCiAJLyogVXBkYXRlIHRoZSBmcmFtZSBjb3VudGVyICovCi0JdXNiY19oZm51bS51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCQkJQ1ZNWF9VU0JDWF9IRk5VTSh1c2ItPmluZGV4KSk7CisJdXNiY19oZm51bS51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IRk5VTSh1c2ItPmluZGV4KSk7CiAJaWYgKCh1c2ItPmZyYW1lX251bWJlciYweDNmZmYpID4gdXNiY19oZm51bS5zLmZybnVtKQogCQl1c2ItPmZyYW1lX251bWJlciArPSAweDQwMDA7CiAJdXNiLT5mcmFtZV9udW1iZXIgJj0gfjB4M2ZmZnVsbDsKIAl1c2ItPmZyYW1lX251bWJlciB8PSB1c2JjX2hmbnVtLnMuZnJudW07CiAKIAkvKiBSZWFkIHRoZSBwZW5kaW5nIGludGVycnVwdHMgKi8KLQl1c2JjX2dpbnRzdHMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQkJCUNWTVhfVVNCQ1hfR0lOVFNUUyh1c2ItPmluZGV4KSk7CisJdXNiY19naW50c3RzLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQkgICAgICAgQ1ZNWF9VU0JDWF9HSU5UU1RTKHVzYi0+aW5kZXgpKTsKIAogCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIG5vdyB0aGF0IHdlIGtub3cgYWJvdXQgdGhlbSAqLwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfR0lOVFNUUyh1c2ItPmluZGV4KSwKLQkJCQl1c2JjX2dpbnRzdHMudTMyKTsKKwljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR0lOVFNUUyh1c2ItPmluZGV4KSwKKwkJCSAgICAgdXNiY19naW50c3RzLnUzMik7CiAKIAlpZiAodXNiY19naW50c3RzLnMucnhmbHZsKSB7CiAJCS8qCkBAIC0zMTY5LDEyICsyOTk3LDEyIEBACiAJCSAqIEluIERNQSBtb2RlIHRoaXMgaXMgaGFuZGxlZCBieSBoYXJkd2FyZQogCQkgKi8KIAkJaWYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKQotCQkJX19jdm14X3VzYl9wb2xsX3J4X2ZpZm8odXNiKTsKKwkJCWN2bXhfdXNiX3BvbGxfcnhfZmlmbyh1c2IpOwogCX0KIAlpZiAodXNiY19naW50c3RzLnMucHR4ZmVtcCB8fCB1c2JjX2dpbnRzdHMucy5ucHR4ZmVtcCkgewogCQkvKiBGaWxsIHRoZSBUeCBGSUZPcyB3aGVuIG5vdCBpbiBETUEgbW9kZSAqLwogCQlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpCi0JCQlfX2N2bXhfdXNiX3BvbGxfdHhfZmlmbyh1c2IpOworCQkJY3ZteF91c2JfcG9sbF90eF9maWZvKHVzYik7CiAJfQogCWlmICh1c2JjX2dpbnRzdHMucy5kaXNjb25uaW50IHx8IHVzYmNfZ2ludHN0cy5zLnBydGludCkgewogCQl1bmlvbiBjdm14X3VzYmN4X2hwcnQgdXNiY19ocHJ0OwpAQCAtMzE5NCwxMSArMzAyMiwxMSBAQAogCQkgKi8KIAkJb2N0ZW9uX3VzYl9wb3J0X2NhbGxiYWNrKHVzYik7CiAJCS8qIENsZWFyIHRoZSBwb3J0IGNoYW5nZSBiaXRzICovCi0JCXVzYmNfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CisJCXVzYmNfaHBydC51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKIAkJdXNiY19ocHJ0LnMucHJ0ZW5hID0gMDsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgdXNiY19ocHJ0LnUzMik7CisJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLAorCQkJCSAgICAgdXNiY19ocHJ0LnUzMik7CiAJfQogCWlmICh1c2JjX2dpbnRzdHMucy5oY2hpbnQpIHsKIAkJLyoKQEAgLTMyMTUsMTggKzMwNDMsMTggQEAKIAkJICovCiAJCXVuaW9uIGN2bXhfdXNiY3hfaGFpbnQgdXNiY19oYWludDsKIAotCQl1c2JjX2hhaW50LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCXVzYmNfaGFpbnQudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQkJCUNWTVhfVVNCQ1hfSEFJTlQodXNiLT5pbmRleCkpOwogCQl3aGlsZSAodXNiY19oYWludC51MzIpIHsKIAkJCWludCBjaGFubmVsOwogCiAJCQljaGFubmVsID0gX19mbHModXNiY19oYWludC51MzIpOwotCQkJX19jdm14X3VzYl9wb2xsX2NoYW5uZWwodXNiLCBjaGFubmVsKTsKKwkJCWN2bXhfdXNiX3BvbGxfY2hhbm5lbCh1c2IsIGNoYW5uZWwpOwogCQkJdXNiY19oYWludC51MzIgXj0gMTw8Y2hhbm5lbDsKIAkJfQogCX0KIAotCV9fY3ZteF91c2Jfc2NoZWR1bGUodXNiLCB1c2JjX2dpbnRzdHMucy5zb2YpOworCWN2bXhfdXNiX3NjaGVkdWxlKHVzYiwgdXNiY19naW50c3RzLnMuc29mKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzUxMCw2ICszMzM4LDcgQEAKIAlzdHJ1Y3Qgb2N0ZW9uX2hjZCAqcHJpdiA9IGhjZF90b19vY3Rlb24oaGNkKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoY2QtPnNlbGYuY29udHJvbGxlcjsKIAlzdHJ1Y3QgY3ZteF91c2JfcG9ydF9zdGF0dXMgdXNiX3BvcnRfc3RhdHVzOworCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiID0gJnByaXYtPnVzYjsKIAlpbnQgcG9ydF9zdGF0dXM7CiAJc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzY4NywxMyArMzUxNiwxOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKIAkJCWRldl9kYmcoZGV2LCAiIFBPV0VSXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJLyoKKwkJCSAqIFByb2dyYW0gdGhlIHBvcnQgcG93ZXIgYml0IHRvIGRyaXZlIFZCVVMgb24gdGhlIFVTQi4KKwkJCSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksCisJCQkJCWN2bXhfdXNiY3hfaHBydCwgcHJ0cHdyLCAxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CiAJCQlkZXZfZGJnKGRldiwgIiBSRVNFVFxuIik7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJY3ZteF91c2JfZGlzYWJsZSgmcHJpdi0+dXNiKTsKLQkJCWlmIChjdm14X3VzYl9lbmFibGUoJnByaXYtPnVzYikpCi0JCQkJZGV2X2RiZyhkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHRoZSBwb3J0XG4iKTsKKwkJCWN2bXhfdXNiX3Jlc2V0X3BvcnQoJnByaXYtPnVzYik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0lORElDQVRPUjoKQEAgLTM3NDEsNyArMzU3NSw2IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3Qgb2N0ZW9uX2hjZCAqcHJpdjsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIGNsb2NrX3JhdGUgPSA0ODAwMDAwMDsKIAlib29sIGlzX2NyeXN0YWxfY2xvY2sgPSBmYWxzZTsKIAljb25zdCBjaGFyICpjbG9ja190eXBlOwpAQCAtMzgzOCwyMCArMzY3MSwzMyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCi0Jc3RhdHVzID0gY3ZteF91c2JfaW5pdGlhbGl6ZSgmcHJpdi0+dXNiLCB1c2JfbnVtLCBpbml0aWFsaXplX2ZsYWdzKTsKKwlwcml2LT51c2IuaW5pdF9mbGFncyA9IGluaXRpYWxpemVfZmxhZ3M7CisKKwkvKiBJbml0aWFsaXplIHRoZSBVU0Igc3RhdGUgc3RydWN0dXJlICovCisJcHJpdi0+dXNiLmluZGV4ID0gdXNiX251bTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dXNiLmlkbGVfcGlwZXMpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByaXYtPnVzYi5hY3RpdmVfcGlwZXMpOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZwcml2LT51c2IuYWN0aXZlX3BpcGVzW2ldKTsKKworCS8qIER1ZSB0byBhbiBlcnJhdGEsIENOMzFYWCBkb2Vzbid0IHN1cHBvcnQgRE1BICovCisJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zMVhYKSkgeworCQlwcml2LT51c2IuaW5pdF9mbGFncyB8PSBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQTsKKwkJLyogT25seSB1c2Ugb25lIGNoYW5uZWwgd2l0aCBub24gRE1BICovCisJCXByaXYtPnVzYi5pZGxlX2hhcmR3YXJlX2NoYW5uZWxzID0gMHgxOworCX0gZWxzZSBpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjVYWFgpKSB7CisJCS8qIENONVhYWCBoYXZlIGFuIGVycmF0YSB3aXRoIGNoYW5uZWwgMyAqLworCQlwcml2LT51c2IuaWRsZV9oYXJkd2FyZV9jaGFubmVscyA9IDB4Zjc7CisJfSBlbHNlIHsKKwkJcHJpdi0+dXNiLmlkbGVfaGFyZHdhcmVfY2hhbm5lbHMgPSAweGZmOworCX0KKworCXN0YXR1cyA9IGN2bXhfdXNiX2luaXRpYWxpemUoZGV2LCAmcHJpdi0+dXNiKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9kYmcoZGV2LCAiVVNCIGluaXRpYWxpemF0aW9uIGZhaWxlZCB3aXRoICVkXG4iLCBzdGF0dXMpOwogCQlrZnJlZShoY2QpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JLyogVGhpcyBkZWxheSBpcyBuZWVkZWQgZm9yIENOMzAxMCwgYnV0IEkgZG9uJ3Qga25vdyB3aHkuLi4gKi8KLQltZGVsYXkoMTApOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQljdm14X3VzYl9wb2xsKCZwcml2LT51c2IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQogCXN0YXR1cyA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCAwKTsKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9kYmcoZGV2LCAiVVNCIGFkZCBIQ0QgZmFpbGVkIHdpdGggJWRcbiIsIHN0YXR1cyk7CkBAIC0zODg1LDcgKzM3MzEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBvY3Rlb25fdXNiX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvY3Rlb25fdXNiX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJjYXZpdW0sb2N0ZW9uLTU3NTAtdXNiYyIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuaCBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuaAppbmRleCA0MmZlNGZlLi4zZTM1MWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5oCkBAIC00Nyw2ICs0Nyw4IEBACiAjaWZuZGVmIF9fT0NURU9OX0hDRF9IX18KICNkZWZpbmUgX19PQ1RFT05fSENEX0hfXwogCisjaW5jbHVkZSA8YXNtL2JpdGZpZWxkLmg+CisKICNkZWZpbmUgQ1ZNWF9VU0JDWEJBU0UgMHgwMDAxNkYwMDEwMDAwMDAwdWxsCiAjZGVmaW5lIENWTVhfVVNCQ1hSRUcxKHJlZywgYmlkKSBcCiAJKENWTVhfQUREX0lPX1NFRyhDVk1YX1VTQkNYQkFTRSB8IHJlZykgKyBcCkBAIC0xNDMsMTMgKzE0NSwxNCBAQAogCSAqCSogMSdiMTogVW5tYXNrIHRoZSBpbnRlcnJ1cHQgYXNzZXJ0aW9uIHRvIHRoZSBhcHBsaWNhdGlvbi4KIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9nYWhiY2ZnX3MgewotCQl1aW50MzJfdCByZXNlcnZlZF85XzMxCTogMjM7Ci0JCXVpbnQzMl90IHB0eGZlbXBsdmwJOiAxOwotCQl1aW50MzJfdCBucHR4ZmVtcGx2bAk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzZfNgk6IDE7Ci0JCXVpbnQzMl90IGRtYWVuCQk6IDE7Ci0JCXVpbnQzMl90IGhic3RsZW4JOiA0OwotCQl1aW50MzJfdCBnbGJsaW50cm1zawk6IDE7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfOV8zMQk6IDIzLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHB0eGZlbXBsdmwJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5wdHhmZW1wbHZsCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF82XzYJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGRtYWVuCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaGJzdGxlbgk6IDQsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZ2xibGludHJtc2sJOiAxLAorCQk7KSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTIwOSwxNiArMjEyLDE3IEBACiAJICoJKiBPdGhlcnM6IFJlc2VydmVkCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ2h3Y2ZnM19zIHsKLQkJdWludDMyX3QgZGZpZm9kZXB0aAkJCQk6IDE2OwotCQl1aW50MzJfdCByZXNlcnZlZF8xM18xNQkJCQk6IDM7Ci0JCXVpbnQzMl90IGFoYnBoeXN5bmMJCQkJOiAxOwotCQl1aW50MzJfdCByc3R0eXBlCQkJCTogMTsKLQkJdWludDMyX3Qgb3B0ZmVhdHVyZQkJCQk6IDE7Ci0JCXVpbnQzMl90IHZlbmRvcl9jb250cm9sX2ludGVyZmFjZV9zdXBwb3J0CTogMTsKLQkJdWludDMyX3QgaTJjX3NlbGVjdGlvbgkJCQk6IDE7Ci0JCXVpbnQzMl90IG90Z2VuCQkJCQk6IDE7Ci0JCXVpbnQzMl90IHBrdHNpemV3aWR0aAkJCQk6IDM7Ci0JCXVpbnQzMl90IHhmZXJzaXpld2lkdGgJCQkJOiA0OworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGRmaWZvZGVwdGgJCQk6IDE2LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzEzXzE1CQk6IDMsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgYWhicGh5c3luYwkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByc3R0eXBlCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG9wdGZlYXR1cmUJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdmVuZG9yX2NvbnRyb2xfaW50ZXJmYWNlX3N1cHBvcnQgOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGkyY19zZWxlY3Rpb24JCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgb3RnZW4JCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBrdHNpemV3aWR0aAkJCTogMywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB4ZmVyc2l6ZXdpZHRoCQkJOiA0LAorCQk7KSkpKSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTI3NSwzOCArMjc5LDM5IEBACiAJICogQG1vZGVtaXNtc2s6IE1vZGUgTWlzbWF0Y2ggSW50ZXJydXB0IE1hc2sgKE1vZGVNaXNNc2spCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ2ludG1za19zIHsKLQkJdWludDMyX3Qgd2t1cGludG1zawkJOiAxOwotCQl1aW50MzJfdCBzZXNzcmVxaW50bXNrCQk6IDE7Ci0JCXVpbnQzMl90IGRpc2Nvbm5pbnRtc2sJCTogMTsKLQkJdWludDMyX3QgY29uaWRzdHNjaG5nbXNrCTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMjdfMjcJCTogMTsKLQkJdWludDMyX3QgcHR4ZmVtcG1zawkJOiAxOwotCQl1aW50MzJfdCBoY2hpbnRtc2sJCTogMTsKLQkJdWludDMyX3QgcHJ0aW50bXNrCQk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzIzXzIzCQk6IDE7Ci0JCXVpbnQzMl90IGZldHN1c3Btc2sJCTogMTsKLQkJdWludDMyX3QgaW5jb21wbHBtc2sJCTogMTsKLQkJdWludDMyX3QgaW5jb21waXNvaW5tc2sJCTogMTsKLQkJdWludDMyX3Qgb2VwaW50bXNrCQk6IDE7Ci0JCXVpbnQzMl90IGluZXBpbnRtc2sJCTogMTsKLQkJdWludDMyX3QgZXBtaXNtc2sJCTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTZfMTYJCTogMTsKLQkJdWludDMyX3QgZW9wZm1zawkJOiAxOwotCQl1aW50MzJfdCBpc29vdXRkcm9wbXNrCQk6IDE7Ci0JCXVpbnQzMl90IGVudW1kb25lbXNrCQk6IDE7Ci0JCXVpbnQzMl90IHVzYnJzdG1zawkJOiAxOwotCQl1aW50MzJfdCB1c2JzdXNwbXNrCQk6IDE7Ci0JCXVpbnQzMl90IGVybHlzdXNwbXNrCQk6IDE7Ci0JCXVpbnQzMl90IGkyY2ludAkJCTogMTsKLQkJdWludDMyX3QgdWxwaWNraW50bXNrCQk6IDE7Ci0JCXVpbnQzMl90IGdvdXRuYWtlZmZtc2sJCTogMTsKLQkJdWludDMyX3QgZ2lubmFrZWZmbXNrCQk6IDE7Ci0JCXVpbnQzMl90IG5wdHhmZW1wbXNrCQk6IDE7Ci0JCXVpbnQzMl90IHJ4Zmx2bG1zawkJOiAxOwotCQl1aW50MzJfdCBzb2Ztc2sJCQk6IDE7Ci0JCXVpbnQzMl90IG90Z2ludG1zawkJOiAxOwotCQl1aW50MzJfdCBtb2RlbWlzbXNrCQk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzBfMAkJOiAxOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHdrdXBpbnRtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBzZXNzcmVxaW50bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZGlzY29ubmludG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNvbmlkc3RzY2huZ21zawk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMjdfMjcJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHB0eGZlbXBtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBoY2hpbnRtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRpbnRtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8yM18yMwk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZmV0c3VzcG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGluY29tcGxwbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaW5jb21waXNvaW5tc2sJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG9lcGludG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGluZXBpbnRtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBlcG1pc21zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzE2XzE2CTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBlb3BmbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaXNvb3V0ZHJvcG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVudW1kb25lbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdXNicnN0bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdXNic3VzcG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVybHlzdXNwbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaTJjaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdWxwaWNraW50bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZ291dG5ha2VmZm1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGdpbm5ha2VmZm1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5wdHhmZW1wbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcnhmbHZsbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgc29mbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgb3RnaW50bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbW9kZW1pc21zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzBfMAkJOiAxLAorCQk7KSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkKIAl9IHM7CiB9OwogCkBAIC01MDQsMzggKzUwOSwzOSBAQAogCSAqCSogMSdiMTogSG9zdCBtb2RlCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ2ludHN0c19zIHsKLQkJdWludDMyX3Qgd2t1cGludAk6IDE7Ci0JCXVpbnQzMl90IHNlc3NyZXFpbnQJOiAxOwotCQl1aW50MzJfdCBkaXNjb25uaW50CTogMTsKLQkJdWludDMyX3QgY29uaWRzdHNjaG5nCTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMjdfMjcJOiAxOwotCQl1aW50MzJfdCBwdHhmZW1wCTogMTsKLQkJdWludDMyX3QgaGNoaW50CQk6IDE7Ci0JCXVpbnQzMl90IHBydGludAkJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF8yM18yMwk6IDE7Ci0JCXVpbnQzMl90IGZldHN1c3AJOiAxOwotCQl1aW50MzJfdCBpbmNvbXBscAk6IDE7Ci0JCXVpbnQzMl90IGluY29tcGlzb2luCTogMTsKLQkJdWludDMyX3Qgb2VwaW50CQk6IDE7Ci0JCXVpbnQzMl90IGllcGludAkJOiAxOwotCQl1aW50MzJfdCBlcG1pcwkJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF8xNl8xNgk6IDE7Ci0JCXVpbnQzMl90IGVvcGYJCTogMTsKLQkJdWludDMyX3QgaXNvb3V0ZHJvcAk6IDE7Ci0JCXVpbnQzMl90IGVudW1kb25lCTogMTsKLQkJdWludDMyX3QgdXNicnN0CQk6IDE7Ci0JCXVpbnQzMl90IHVzYnN1c3AJOiAxOwotCQl1aW50MzJfdCBlcmx5c3VzcAk6IDE7Ci0JCXVpbnQzMl90IGkyY2ludAkJOiAxOwotCQl1aW50MzJfdCB1bHBpY2tpbnQJOiAxOwotCQl1aW50MzJfdCBnb3V0bmFrZWZmCTogMTsKLQkJdWludDMyX3QgZ2lubmFrZWZmCTogMTsKLQkJdWludDMyX3QgbnB0eGZlbXAJOiAxOwotCQl1aW50MzJfdCByeGZsdmwJCTogMTsKLQkJdWludDMyX3Qgc29mCQk6IDE7Ci0JCXVpbnQzMl90IG90Z2ludAkJOiAxOwotCQl1aW50MzJfdCBtb2RlbWlzCTogMTsKLQkJdWludDMyX3QgY3VybW9kCQk6IDE7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgd2t1cGludAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHNlc3NyZXFpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkaXNjb25uaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgY29uaWRzdHNjaG5nCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMjdfMjcJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHB0eGZlbXAJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBoY2hpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8yM18yMwk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZmV0c3VzcAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGluY29tcGxwCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaW5jb21waXNvaW4JCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBvZXBpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpZXBpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBlcG1pcwkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xNl8xNgk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZW9wZgkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpc29vdXRkcm9wCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZW51bWRvbmUJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB1c2Jyc3QJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB1c2JzdXNwCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZXJseXN1c3AJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpMmNpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB1bHBpY2tpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBnb3V0bmFrZWZmCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZ2lubmFrZWZmCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnB0eGZlbXAJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByeGZsdmwJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBzb2YJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgb3RnaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbW9kZW1pcwkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGN1cm1vZAkJOiAxLAorCQk7KSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkKIAl9IHM7CiB9OwogCkBAIC01NjAsOCArNTY2LDkgQEAKIAkgKglUcmFuc21pdCBGSUZPIFJBTS4KIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9nbnB0eGZzaXpfcyB7Ci0JCXVpbnQzMl90IG5wdHhmZGVwCTogMTY7Ci0JCXVpbnQzMl90IG5wdHhmc3RhZGRyCTogMTY7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnB0eGZkZXAJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBucHR4ZnN0YWRkcgk6IDE2LAorCQk7KSkKIAl9IHM7CiB9OwogCkBAIC02MTAsMTAgKzYxNywxMSBAQAogCSAqCSogT3RoZXJzOiBSZXNlcnZlZAogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2ducHR4c3RzX3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8zMV8zMQk6IDE7Ci0JCXVpbnQzMl90IG5wdHhxdG9wCTogNzsKLQkJdWludDMyX3QgbnB0eHFzcGNhdmFpbAk6IDg7Ci0JCXVpbnQzMl90IG5wdHhmc3BjYXZhaWwJOiAxNjsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8zMV8zMQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnB0eHF0b3AJCTogNywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBucHR4cXNwY2F2YWlsCQk6IDgsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnB0eGZzcGNhdmFpbAkJOiAxNiwKKwkJOykpKSkKIAl9IHM7CiB9OwogCkBAIC03MzEsMTYgKzczOSwxNyBAQAogCSAqCXNlbGVjdGVkLCB0aGUgUEhZIGRvbWFpbiBoYXMgdG8gYmUgcmVzZXQgZm9yIHByb3BlciBvcGVyYXRpb24uCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ3JzdGN0bF9zIHsKLQkJdWludDMyX3QgYWhiaWRsZQk6IDE7Ci0JCXVpbnQzMl90IGRtYXJlcQkJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF8xMV8yOQk6IDE5OwotCQl1aW50MzJfdCB0eGZudW0JCTogNTsKLQkJdWludDMyX3QgdHhmZmxzaAk6IDE7Ci0JCXVpbnQzMl90IHJ4ZmZsc2gJOiAxOwotCQl1aW50MzJfdCBpbnRrbnFmbHNoCTogMTsKLQkJdWludDMyX3QgZnJtY250cnJzdAk6IDE7Ci0JCXVpbnQzMl90IGhzZnRyc3QJOiAxOwotCQl1aW50MzJfdCBjc2Z0cnN0CTogMTsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBhaGJpZGxlCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZG1hcmVxCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTFfMjkJOiAxOSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB0eGZudW0JCTogNSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB0eGZmbHNoCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcnhmZmxzaAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGludGtucWZsc2gJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBmcm1jbnRycnN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaHNmdHJzdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNzZnRyc3QJCTogMSwKKwkJOykpKSkpKSkpKSkKIAl9IHM7CiB9OwogCkBAIC03NjIsOCArNzcxLDkgQEAKIAkgKgkqIE1heGltdW0gdmFsdWUgaXMgMzI3NjgKIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9ncnhmc2l6X3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xNl8zMQk6IDE2OwotCQl1aW50MzJfdCByeGZkZXAJCTogMTY7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTZfMzEJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByeGZkZXAJCTogMTYsCisJCTspKQogCX0gczsKIH07CiAKQEAgLTgwNCwxMSArODE0LDEyIEBACiAJICoJcGFja2V0IGJlbG9uZ3MuCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ3J4c3RzcGhfcyB7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzIxXzMxCTogMTE7Ci0JCXVpbnQzMl90IHBrdHN0cwkJOiA0OwotCQl1aW50MzJfdCBkcGlkCQk6IDI7Ci0JCXVpbnQzMl90IGJjbnQJCTogMTE7Ci0JCXVpbnQzMl90IGNobnVtCQk6IDQ7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMjFfMzEJOiAxMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwa3RzdHMJCTogNCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkcGlkCQkJOiAyLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGJjbnQJCQk6IDExLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNobnVtCQkJOiA0LAorCQk7KSkpKSkKIAl9IHM7CiB9OwogCkBAIC04ODQsMTkgKzg5NSwyMCBAQAogCSAqCSogT25lIDQ4LU1IeiBQSFkgY2xvY2sgPSAwLjI1IGJpdCB0aW1lcwogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2d1c2JjZmdfcyB7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzE3XzMxCTogMTU7Ci0JCXVpbnQzMl90IG90Z2kyY3NlbAk6IDE7Ci0JCXVpbnQzMl90IHBoeWxwd3JjbGtzZWwJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF8xNF8xNAk6IDE7Ci0JCXVpbnQzMl90IHVzYnRyZHRpbQk6IDQ7Ci0JCXVpbnQzMl90IGhucGNhcAkJOiAxOwotCQl1aW50MzJfdCBzcnBjYXAJCTogMTsKLQkJdWludDMyX3QgZGRyc2VsCQk6IDE7Ci0JCXVpbnQzMl90IHBoeXNlbAkJOiAxOwotCQl1aW50MzJfdCBmc2ludGYJCTogMTsKLQkJdWludDMyX3QgdWxwaV91dG1pX3NlbAk6IDE7Ci0JCXVpbnQzMl90IHBoeWlmCQk6IDE7Ci0JCXVpbnQzMl90IHRvdXRjYWwJOiAzOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzE3XzMxCTogMTUsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgb3RnaTJjc2VsCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcGh5bHB3cmNsa3NlbAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzE0XzE0CTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB1c2J0cmR0aW0JCTogNCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBobnBjYXAJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBzcnBjYXAJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkZHJzZWwJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwaHlzZWwJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBmc2ludGYJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB1bHBpX3V0bWlfc2VsCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcGh5aWYJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdG91dGNhbAkJOiAzLAorCQk7KSkpKSkpKSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTkyMCw4ICs5MzIsOSBAQAogCSAqCU9uZSBiaXQgcGVyIGNoYW5uZWw6IEJpdCAwIGZvciBDaGFubmVsIDAsIGJpdCAxNSBmb3IgQ2hhbm5lbCAxNQogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hhaW50X3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xNl8zMQk6IDE2OwotCQl1aW50MzJfdCBoYWludAkJOiAxNjsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xNl8zMQk6IDE2LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGhhaW50CQkJOiAxNiwKKwkJOykpCiAJfSBzOwogfTsKIApAQCAtOTQ0LDggKzk1Nyw5IEBACiAJICoJT25lIGJpdCBwZXIgY2hhbm5lbDogQml0IDAgZm9yIGNoYW5uZWwgMCwgYml0IDE1IGZvciBjaGFubmVsIDE1CiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGFpbnRtc2tfcyB7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzE2XzMxCTogMTY7Ci0JCXVpbnQzMl90IGhhaW50bXNrCTogMTY7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTZfMzEJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBoYWludG1zawkJOiAxNiwKKwkJOykpCiAJfSBzOwogfTsKIApAQCAtMTAxNCwxNyArMTAyOCwxOCBAQAogCSAqCUluZGljYXRlcyB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBlbmRwb2ludC4KIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9oY2NoYXJ4X3MgewotCQl1aW50MzJfdCBjaGVuYQkJOiAxOwotCQl1aW50MzJfdCBjaGRpcwkJOiAxOwotCQl1aW50MzJfdCBvZGRmcm0JCTogMTsKLQkJdWludDMyX3QgZGV2YWRkcgk6IDc7Ci0JCXVpbnQzMl90IGVjCQk6IDI7Ci0JCXVpbnQzMl90IGVwdHlwZQkJOiAyOwotCQl1aW50MzJfdCBsc3BkZGV2CTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTZfMTYJOiAxOwotCQl1aW50MzJfdCBlcGRpcgkJOiAxOwotCQl1aW50MzJfdCBlcG51bQkJOiA0OwotCQl1aW50MzJfdCBtcHMJCTogMTE7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgY2hlbmEJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgY2hkaXMJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgb2RkZnJtCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZGV2YWRkcgkJOiA3LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVjCQkJOiAyLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVwdHlwZQkJOiAyLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGxzcGRkZXYJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xNl8xNgk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZXBkaXIJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZXBudW0JCQk6IDQsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbXBzCQkJOiAxMSwKKwkJOykpKSkpKSkpKSkpCiAJfSBzOwogfTsKIApAQCAtMTA2OSw5ICsxMDg0LDEwIEBACiAJICoJKiAyJ2IxMTogUmVzZXJ2ZWQKIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9oY2ZnX3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8zXzMxCTogMjk7Ci0JCXVpbnQzMl90IGZzbHNzdXBwCTogMTsKLQkJdWludDMyX3QgZnNsc3BjbGtzZWwJOiAyOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzNfMzEJOiAyOSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBmc2xzc3VwcAk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZnNsc3BjbGtzZWwJOiAyLAorCQk7KSkpCiAJfSBzOwogfTsKIApAQCAtMTExMCwxOCArMTEyNiwxOSBAQAogCSAqCVRyYW5zZmVyIGNvbXBsZXRlZCBub3JtYWxseSB3aXRob3V0IGFueSBlcnJvcnMuCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGNpbnR4X3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xMV8zMQk6IDIxOwotCQl1aW50MzJfdCBkYXRhdGdsZXJyCTogMTsKLQkJdWludDMyX3QgZnJtb3ZydW4JOiAxOwotCQl1aW50MzJfdCBiYmxlcnIJCTogMTsKLQkJdWludDMyX3QgeGFjdGVycgk6IDE7Ci0JCXVpbnQzMl90IG55ZXQJCTogMTsKLQkJdWludDMyX3QgYWNrCQk6IDE7Ci0JCXVpbnQzMl90IG5hawkJOiAxOwotCQl1aW50MzJfdCBzdGFsbAkJOiAxOwotCQl1aW50MzJfdCBhaGJlcnIJCTogMTsKLQkJdWludDMyX3QgY2hobHRkCQk6IDE7Ci0JCXVpbnQzMl90IHhmZXJjb21wbAk6IDE7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTFfMzEJOiAyMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkYXRhdGdsZXJyCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZnJtb3ZydW4JCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBiYmxlcnIJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB4YWN0ZXJyCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnlldAkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBhY2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbmFrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHN0YWxsCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGFoYmVycgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNoaGx0ZAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHhmZXJjb21wbAkJOiAxLAorCQk7KSkpKSkpKSkpKSkpCiAJfSBzOwogfTsKIApAQCAtMTE1MSwxOCArMTE2OCwxOSBAQAogCSAqIEB4ZmVyY29tcGxtc2s6IFRyYW5zZmVyIENvbXBsZXRlZCBNYXNrIChYZmVyQ29tcGxNc2spCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGNpbnRtc2t4X3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xMV8zMQk6IDIxOwotCQl1aW50MzJfdCBkYXRhdGdsZXJybXNrCTogMTsKLQkJdWludDMyX3QgZnJtb3ZydW5tc2sJOiAxOwotCQl1aW50MzJfdCBiYmxlcnJtc2sJOiAxOwotCQl1aW50MzJfdCB4YWN0ZXJybXNrCTogMTsKLQkJdWludDMyX3QgbnlldG1zawk6IDE7Ci0JCXVpbnQzMl90IGFja21zawkJOiAxOwotCQl1aW50MzJfdCBuYWttc2sJCTogMTsKLQkJdWludDMyX3Qgc3RhbGxtc2sJOiAxOwotCQl1aW50MzJfdCBhaGJlcnJtc2sJOiAxOwotCQl1aW50MzJfdCBjaGhsdGRtc2sJOiAxOwotCQl1aW50MzJfdCB4ZmVyY29tcGxtc2sJOiAxOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzExXzMxCQk6IDIxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGRhdGF0Z2xlcnJtc2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZnJtb3ZydW5tc2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgYmJsZXJybXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHhhY3RlcnJtc2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnlldG1zawkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBhY2ttc2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbmFrbXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHN0YWxsbXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGFoYmVycm1zawkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBjaGhsdGRtc2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgeGZlcmNvbXBsbXNrCQkJOiAxLAorCQk7KSkpKSkpKSkpKSkpCiAJfSBzOwogfTsKIApAQCAtMTIwMSwxMiArMTIxOSwxMyBAQAogCSAqCXRyYW5zbGF0b3IuCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGNzcGx0eF9zIHsKLQkJdWludDMyX3Qgc3BsdGVuYQk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzE3XzMwCTogMTQ7Ci0JCXVpbnQzMl90IGNvbXBzcGx0CTogMTsKLQkJdWludDMyX3QgeGFjdHBvcwk6IDI7Ci0JCXVpbnQzMl90IGh1YmFkZHIJOiA3OwotCQl1aW50MzJfdCBwcnRhZGRyCTogNzsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBzcGx0ZW5hCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzE3XzMwCQk6IDE0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNvbXBzcGx0CQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHhhY3Rwb3MJCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaHViYWRkcgkJCTogNywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRhZGRyCQkJOiA3LAorCQk7KSkpKSkpCiAJfSBzOwogfTsKIApAQCAtMTI0NiwxMCArMTI2NSwxMSBAQAogCSAqCXNpemUgZm9yIElOIHRyYW5zYWN0aW9ucyAocGVyaW9kaWMgYW5kIG5vbi1wZXJpb2RpYykuCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGN0c2l6eF9zIHsKLQkJdWludDMyX3QgZG9wbmcJCTogMTsKLQkJdWludDMyX3QgcGlkCQk6IDI7Ci0JCXVpbnQzMl90IHBrdGNudAkJOiAxMDsKLQkJdWludDMyX3QgeGZlcnNpemUJOiAxOTsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkb3BuZwkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwaWQJCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcGt0Y250CQk6IDEwLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHhmZXJzaXplCQk6IDE5LAorCQk7KSkpKQogCX0gczsKIH07CiAKQEAgLTEyODMsOCArMTMwMyw5IEBACiAJICoJKiAxIG1zIChQSFkgY2xvY2sgZnJlcXVlbmN5IGZvciBGUy9MUykKIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9oZmlyX3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xNl8zMQk6IDE2OwotCQl1aW50MzJfdCBmcmludAkJOiAxNjsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xNl8zMQkJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBmcmludAkJCQk6IDE2LAorCQk7KSkKIAl9IHM7CiB9OwogCkBAIC0xMzEyLDggKzEzMzMsOSBAQAogCSAqCVVTQiwgYW5kIGlzIHJlc2V0IHRvIDAgd2hlbiBpdCByZWFjaGVzIDE2J2gzRkZGLgogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hmbnVtX3MgewotCQl1aW50MzJfdCBmcnJlbQk6IDE2OwotCQl1aW50MzJfdCBmcm51bQk6IDE2OworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGZycmVtCQk6IDE2LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGZybnVtCQk6IDE2LAorCQk7KSkKIAl9IHM7CiB9OwogCkBAIC0xNDM5LDIxICsxNDYxLDIyIEBACiAJICoJKiAxOiBBIGRldmljZSBpcyBhdHRhY2hlZCB0byB0aGUgcG9ydC4KIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9ocHJ0X3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xOV8zMQk6IDEzOwotCQl1aW50MzJfdCBwcnRzcGQJCTogMjsKLQkJdWludDMyX3QgcHJ0dHN0Y3RsCTogNDsKLQkJdWludDMyX3QgcHJ0cHdyCQk6IDE7Ci0JCXVpbnQzMl90IHBydGxuc3RzCTogMjsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfOV85CTogMTsKLQkJdWludDMyX3QgcHJ0cnN0CQk6IDE7Ci0JCXVpbnQzMl90IHBydHN1c3AJOiAxOwotCQl1aW50MzJfdCBwcnRyZXMJCTogMTsKLQkJdWludDMyX3QgcHJ0b3ZyY3VycmNobmcJOiAxOwotCQl1aW50MzJfdCBwcnRvdnJjdXJyYWN0CTogMTsKLQkJdWludDMyX3QgcHJ0ZW5jaG5nCTogMTsKLQkJdWludDMyX3QgcHJ0ZW5hCQk6IDE7Ci0JCXVpbnQzMl90IHBydGNvbm5kZXQJOiAxOwotCQl1aW50MzJfdCBwcnRjb25uc3RzCTogMTsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xOV8zMQk6IDEzLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydHNwZAkJOiAyLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydHRzdGN0bAkJOiA0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydHB3cgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydGxuc3RzCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfOV85CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0cnN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0c3VzcAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydHJlcwkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydG92cmN1cnJjaG5nCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRvdnJjdXJyYWN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0ZW5jaG5nCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0ZW5hCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0Y29ubmRldAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydGNvbm5zdHMJCTogMSwKKwkJOykpKSkpKSkpKSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTE0NzYsOCArMTQ5OSw5IEBACiAJICogQHB0eGZzdGFkZHI6IEhvc3QgUGVyaW9kaWMgVHhGSUZPIFN0YXJ0IEFkZHJlc3MgKFBUeEZTdEFkZHIpCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaHB0eGZzaXpfcyB7Ci0JCXVpbnQzMl90IHB0eGZzaXplCTogMTY7Ci0JCXVpbnQzMl90IHB0eGZzdGFkZHIJOiAxNjsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwdHhmc2l6ZQk6IDE2LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHB0eGZzdGFkZHIJOiAxNiwKKwkJOykpCiAJfSBzOwogfTsKIApAQCAtMTUzMSw5ICsxNTU1LDEwIEBACiAJICoJKiBPdGhlcnM6IFJlc2VydmVkCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaHB0eHN0c19zIHsKLQkJdWludDMyX3QgcHR4cXRvcAk6IDg7Ci0JCXVpbnQzMl90IHB0eHFzcGNhdmFpbAk6IDg7Ci0JCXVpbnQzMl90IHB0eGZzcGNhdmFpbAk6IDE2OworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHB0eHF0b3AJOiA4LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHB0eHFzcGNhdmFpbAk6IDgsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHR4ZnNwY2F2YWlsCTogMTYsCisJCTspKSkKIAl9IHM7CiB9OwogCkBAIC0xNjM2LDIxICsxNjYxLDIyIEBACiAJICoJdW50aWwgQUZURVIgdGhpcyBmaWVsZCBpcyBzZXQgYW5kIHRoZW4gcmVhZC4KIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JueF9jbGtfY3RsX3MgewotCQl1aW50NjRfdCByZXNlcnZlZF8yMF82Mwk6IDQ0OwotCQl1aW50NjRfdCBkaXZpZGUyCTogMjsKLQkJdWludDY0X3QgaGNsa19yc3QJOiAxOwotCQl1aW50NjRfdCBwX3hfb24JCTogMTsKLQkJdWludDY0X3QgcF9ydHlwZQk6IDI7Ci0JCXVpbnQ2NF90IHBfY29tX29uCTogMTsKLQkJdWludDY0X3QgcF9jX3NlbAk6IDI7Ci0JCXVpbnQ2NF90IGNkaXZfYnlwCTogMTsKLQkJdWludDY0X3Qgc2RfbW9kZQk6IDI7Ci0JCXVpbnQ2NF90IHNfYmlzdAkJOiAxOwotCQl1aW50NjRfdCBwb3IJCTogMTsKLQkJdWludDY0X3QgZW5hYmxlCQk6IDE7Ci0JCXVpbnQ2NF90IHByc3QJCTogMTsKLQkJdWludDY0X3QgaHJzdAkJOiAxOwotCQl1aW50NjRfdCBkaXZpZGUJCTogMzsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCByZXNlcnZlZF8yMF82Mwk6IDQ0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGRpdmlkZTIJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBoY2xrX3JzdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHBfeF9vbgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHBfcnR5cGUJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBwX2NvbV9vbgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHBfY19zZWwJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBjZGl2X2J5cAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHNkX21vZGUJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBzX2Jpc3QJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBwb3IJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgZW5hYmxlCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgcHJzdAkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBocnN0CQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGRpdmlkZQkJOiAzLAorCQk7KSkpKSkpKSkpKSkpKSkpCiAJfSBzOwogfTsKIApAQCAtMTc3OCw0MSArMTgwNCw0MiBAQAogCSAqCWRlLWFzc2VydGlvbi4KIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JueF91c2JwX2N0bF9zdGF0dXNfcyB7Ci0JCXVpbnQ2NF90IHR4cmlzZXR1bmUJCTogMTsKLQkJdWludDY0X3QgdHh2cmVmdHVuZQkJOiA0OwotCQl1aW50NjRfdCB0eGZzbHN0dW5lCQk6IDQ7Ci0JCXVpbnQ2NF90IHR4aHN4dnR1bmUJCTogMjsKLQkJdWludDY0X3Qgc3FyeHR1bmUJCTogMzsKLQkJdWludDY0X3QgY29tcGRpc3R1bmUJCTogMzsKLQkJdWludDY0X3Qgb3RndHVuZQkJOiAzOwotCQl1aW50NjRfdCBvdGdkaXNhYmxlCQk6IDE7Ci0JCXVpbnQ2NF90IHBvcnRyZXNldAkJOiAxOwotCQl1aW50NjRfdCBkcnZ2YnVzCQk6IDE7Ci0JCXVpbnQ2NF90IGxzYmlzdAkJCTogMTsKLQkJdWludDY0X3QgZnNiaXN0CQkJOiAxOwotCQl1aW50NjRfdCBoc2Jpc3QJCQk6IDE7Ci0JCXVpbnQ2NF90IGJpc3RfZG9uZQkJOiAxOwotCQl1aW50NjRfdCBiaXN0X2VycgkJOiAxOwotCQl1aW50NjRfdCB0ZGF0YV9vdXQJCTogNDsKLQkJdWludDY0X3Qgc2lkZHEJCQk6IDE7Ci0JCXVpbnQ2NF90IHR4cHJlZW1waGFzaXN0dW5lCTogMTsKLQkJdWludDY0X3QgZG1hX2Jtb2RlCQk6IDE7Ci0JCXVpbnQ2NF90IHVzYmNfZW5kCQk6IDE7Ci0JCXVpbnQ2NF90IHVzYnBfYmlzdAkJOiAxOwotCQl1aW50NjRfdCB0Y2xrCQkJOiAxOwotCQl1aW50NjRfdCBkcF9wdWxsZAkJOiAxOwotCQl1aW50NjRfdCBkbV9wdWxsZAkJOiAxOwotCQl1aW50NjRfdCBoc3RfbW9kZQkJOiAxOwotCQl1aW50NjRfdCB0dW5pbmcJCQk6IDQ7Ci0JCXVpbnQ2NF90IHR4X2JzX2VuaAkJOiAxOwotCQl1aW50NjRfdCB0eF9ic19lbgkJOiAxOwotCQl1aW50NjRfdCBsb29wX2VuYgkJOiAxOwotCQl1aW50NjRfdCB2dGVzdF9lbmIJCTogMTsKLQkJdWludDY0X3QgYmlzdF9lbmIJCTogMTsKLQkJdWludDY0X3QgdGRhdGFfc2VsCQk6IDE7Ci0JCXVpbnQ2NF90IHRhZGRyX2luCQk6IDQ7Ci0JCXVpbnQ2NF90IHRkYXRhX2luCQk6IDg7Ci0JCXVpbnQ2NF90IGF0ZV9yZXNldAkJOiAxOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHR4cmlzZXR1bmUJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0eHZyZWZ0dW5lCQk6IDQsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdHhmc2xzdHVuZQkJOiA0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHR4aHN4dnR1bmUJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBzcXJ4dHVuZQkJOiAzLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGNvbXBkaXN0dW5lCQk6IDMsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3Qgb3RndHVuZQkJOiAzLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IG90Z2Rpc2FibGUJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBwb3J0cmVzZXQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBkcnZ2YnVzCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgbHNiaXN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgZnNiaXN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgaHNiaXN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgYmlzdF9kb25lCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgYmlzdF9lcnIJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0ZGF0YV9vdXQJCTogNCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBzaWRkcQkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0eHByZWVtcGhhc2lzdHVuZQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgZG1hX2Jtb2RlCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdXNiY19lbmQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB1c2JwX2Jpc3QJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0Y2xrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGRwX3B1bGxkCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgZG1fcHVsbGQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBoc3RfbW9kZQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHR1bmluZwkJOiA0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHR4X2JzX2VuaAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHR4X2JzX2VuCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgbG9vcF9lbmIJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB2dGVzdF9lbmIJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBiaXN0X2VuYgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHRkYXRhX3NlbAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHRhZGRyX2luCQk6IDQsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdGRhdGFfaW4JCTogOCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBhdGVfcmVzZXQJCTogMSwKKwkJOykpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCiAJfSBzOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwppbmRleCBlYmZhOWM5Li40MGRhYjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwpAQCAtMTMwLDE5ICsxMzAsNiBAQAogCX0KIH0KIAotdm9pZCBjdm1fb2N0X3NldF9jYXJyaWVyKHN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYsCi0JCQkgY3ZteF9oZWxwZXJfbGlua19pbmZvX3QgbGlua19pbmZvKQotewotCWN2bV9vY3Rfbm90ZV9jYXJyaWVyKHByaXYsIGxpbmtfaW5mbyk7Ci0JaWYgKGxpbmtfaW5mby5zLmxpbmtfdXApIHsKLQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHByaXYtPm5ldGRldikpCi0JCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPm5ldGRldik7Ci0JfSBlbHNlIHsKLQkJaWYgKG5ldGlmX2NhcnJpZXJfb2socHJpdi0+bmV0ZGV2KSkKLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7Ci0JfQotfQotCiB2b2lkIGN2bV9vY3RfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5oIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmgKaW5kZXggZWNjZmNjNS4uNjE5MWIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmgKQEAgLTQwLDUgKzQwLDggQEAKICNlbmRpZiAvKiBDT05GSUdfWEZSTSAqLwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGN2bV9vY3RfZXRodG9vbF9vcHM7CisKK2V4dGVybiB2b2lkIG9jdGVvbl9tZGlvYnVzX2ZvcmNlX21vZF9kZXBlbmNlbmN5KHZvaWQpOworCiBpbnQgY3ZtX29jdF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIGludCBjdm1fb2N0X3BoeV9zZXR1cF9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKaW5kZXggNDYwZTg1NC4uZjUzOWQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYwpAQCAtNTczLDggKzU3Myw2IEBACiAjZW5kaWYKIH07CiAKLWV4dGVybiB2b2lkIG9jdGVvbl9tZGlvYnVzX2ZvcmNlX21vZF9kZXBlbmNlbmN5KHZvaWQpOwotCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpjdm1fb2N0X29mX2dldF9jaGlsZCgKIAkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgaW50IHJlZ192YWwpCiB7CkBAIC04NTksNyArODU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgY3ZtX29jdF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY3ZtX29jdF9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi0zODYwLXBpcCIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5jCmluZGV4IGJjN2U2NjQuLmQxMTVmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uYwpAQCAtMTgsOCArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3poY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3poY2QuYwppbmRleCA4NTQzYmIyLi41ZmY0NzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296aGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemhjZC5jCkBAIC0yODAsMTcgKzI4MCwyMCBAQAogICovCiBzdGF0aWMgc3RydWN0IG96X2VuZHBvaW50ICpvel9lcF9hbGxvYyhpbnQgYnVmZmVyX3NpemUsIGdmcF90IG1lbV9mbGFncykKIHsKLQlzdHJ1Y3Qgb3pfZW5kcG9pbnQgKmVwID0KLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IG96X2VuZHBvaW50KStidWZmZXJfc2l6ZSwgbWVtX2ZsYWdzKTsKLQlpZiAoZXApIHsKLQkJSU5JVF9MSVNUX0hFQUQoJmVwLT51cmJfbGlzdCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZlcC0+bGluayk7Ci0JCWVwLT5jcmVkaXQgPSAtMTsKLQkJaWYgKGJ1ZmZlcl9zaXplKSB7Ci0JCQllcC0+YnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKLQkJCWVwLT5idWZmZXIgPSAodTggKikoZXArMSk7Ci0JCX0KKwlzdHJ1Y3Qgb3pfZW5kcG9pbnQgKmVwOworCisJZXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3pfZW5kcG9pbnQpK2J1ZmZlcl9zaXplLCBtZW1fZmxhZ3MpOworCWlmICghZXApCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJmVwLT51cmJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5saW5rKTsKKwllcC0+Y3JlZGl0ID0gLTE7CisJaWYgKGJ1ZmZlcl9zaXplKSB7CisJCWVwLT5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQllcC0+YnVmZmVyID0gKHU4ICopKGVwKzEpOwogCX0KKwogCXJldHVybiBlcDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vem1haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3ptYWluLmMKaW5kZXggN2Q2ZWY0Yy4uNzRlZjM0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vem1haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296bWFpbi5jCkBAIC0zNCwxMSArMzQsMjEgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgb3p3cGFuX2luaXQodm9pZCkKIHsKLQlvel9jZGV2X3JlZ2lzdGVyKCk7Ci0Jb3pfcHJvdG9jb2xfaW5pdChnX25ldF9kZXYpOworCWludCBlcnI7CisKKwllcnIgPSBvel9jZGV2X3JlZ2lzdGVyKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBvel9wcm90b2NvbF9pbml0KGdfbmV0X2Rldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfcHJvdG9jb2w7CiAJb3pfYXBwX2VuYWJsZShPWl9BUFBJRF9VU0IsIDEpOwogCW96X2FwcHNfaW5pdCgpOwogCXJldHVybiAwOworCitlcnJfcHJvdG9jb2w6CisJb3pfY2Rldl9kZXJlZ2lzdGVyKCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmMKaW5kZXggODUyYzI4OC4uMDIxZDc0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venBkLmMKQEAgLTEwMiwzNCArMTAyLDM2IEBACiAgKi8KIHN0cnVjdCBvel9wZCAqb3pfcGRfYWxsb2MoY29uc3QgdTggKm1hY19hZGRyKQogewotCXN0cnVjdCBvel9wZCAqcGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3pfcGQpLCBHRlBfQVRPTUlDKTsKKwlzdHJ1Y3Qgb3pfcGQgKnBkOworCWludCBpOwogCi0JaWYgKHBkKSB7Ci0JCWludCBpOworCXBkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG96X3BkKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwZCkKKwkJcmV0dXJuIE5VTEw7CiAKLQkJYXRvbWljX3NldCgmcGQtPnJlZl9jb3VudCwgMik7Ci0JCWZvciAoaSA9IDA7IGkgPCBPWl9OQl9BUFBTOyBpKyspCi0JCQlzcGluX2xvY2tfaW5pdCgmcGQtPmFwcF9sb2NrW2ldKTsKLQkJcGQtPmxhc3RfcnhfcGt0X251bSA9IDB4ZmZmZmZmZmY7Ci0JCW96X3BkX3NldF9zdGF0ZShwZCwgT1pfUERfU19JRExFKTsKLQkJcGQtPm1heF90eF9zaXplID0gT1pfTUFYX1RYX1NJWkU7Ci0JCWV0aGVyX2FkZHJfY29weShwZC0+bWFjX2FkZHIsIG1hY19hZGRyKTsKLQkJb3pfZWx0X2J1Zl9pbml0KCZwZC0+ZWx0X2J1ZmYpOwotCQlzcGluX2xvY2tfaW5pdCgmcGQtPnR4X2ZyYW1lX2xvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmcGQtPnR4X3F1ZXVlKTsKLQkJSU5JVF9MSVNUX0hFQUQoJnBkLT5mYXJld2VsbF9saXN0KTsKLQkJcGQtPmxhc3Rfc2VudF9mcmFtZSA9ICZwZC0+dHhfcXVldWU7Ci0JCXNwaW5fbG9ja19pbml0KCZwZC0+c3RyZWFtX2xvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmcGQtPnN0cmVhbV9saXN0KTsKLQkJdGFza2xldF9pbml0KCZwZC0+aGVhcnRiZWF0X3Rhc2tsZXQsIG96X3BkX2hlYXJ0YmVhdF9oYW5kbGVyLAotCQkJCQkJCSh1bnNpZ25lZCBsb25nKXBkKTsKLQkJdGFza2xldF9pbml0KCZwZC0+dGltZW91dF90YXNrbGV0LCBvel9wZF90aW1lb3V0X2hhbmRsZXIsCi0JCQkJCQkJKHVuc2lnbmVkIGxvbmcpcGQpOwotCQlocnRpbWVyX2luaXQoJnBkLT5oZWFydGJlYXQsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7Ci0JCWhydGltZXJfaW5pdCgmcGQtPnRpbWVvdXQsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7Ci0JCXBkLT5oZWFydGJlYXQuZnVuY3Rpb24gPSBvel9wZF9oZWFydGJlYXRfZXZlbnQ7Ci0JCXBkLT50aW1lb3V0LmZ1bmN0aW9uID0gb3pfcGRfdGltZW91dF9ldmVudDsKLQl9CisJYXRvbWljX3NldCgmcGQtPnJlZl9jb3VudCwgMik7CisJZm9yIChpID0gMDsgaSA8IE9aX05CX0FQUFM7IGkrKykKKwkJc3Bpbl9sb2NrX2luaXQoJnBkLT5hcHBfbG9ja1tpXSk7CisJcGQtPmxhc3RfcnhfcGt0X251bSA9IDB4ZmZmZmZmZmY7CisJb3pfcGRfc2V0X3N0YXRlKHBkLCBPWl9QRF9TX0lETEUpOworCXBkLT5tYXhfdHhfc2l6ZSA9IE9aX01BWF9UWF9TSVpFOworCWV0aGVyX2FkZHJfY29weShwZC0+bWFjX2FkZHIsIG1hY19hZGRyKTsKKwlvel9lbHRfYnVmX2luaXQoJnBkLT5lbHRfYnVmZik7CisJc3Bpbl9sb2NrX2luaXQoJnBkLT50eF9mcmFtZV9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcGQtPnR4X3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmcGQtPmZhcmV3ZWxsX2xpc3QpOworCXBkLT5sYXN0X3NlbnRfZnJhbWUgPSAmcGQtPnR4X3F1ZXVlOworCXNwaW5fbG9ja19pbml0KCZwZC0+c3RyZWFtX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZwZC0+c3RyZWFtX2xpc3QpOworCXRhc2tsZXRfaW5pdCgmcGQtPmhlYXJ0YmVhdF90YXNrbGV0LCBvel9wZF9oZWFydGJlYXRfaGFuZGxlciwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKXBkKTsKKwl0YXNrbGV0X2luaXQoJnBkLT50aW1lb3V0X3Rhc2tsZXQsIG96X3BkX3RpbWVvdXRfaGFuZGxlciwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKXBkKTsKKwlocnRpbWVyX2luaXQoJnBkLT5oZWFydGJlYXQsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJaHJ0aW1lcl9pbml0KCZwZC0+dGltZW91dCwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwlwZC0+aGVhcnRiZWF0LmZ1bmN0aW9uID0gb3pfcGRfaGVhcnRiZWF0X2V2ZW50OworCXBkLT50aW1lb3V0LmZ1bmN0aW9uID0gb3pfcGRfdGltZW91dF9ldmVudDsKKwogCXJldHVybiBwZDsKIH0KIApAQCAtNjUyLDggKzY1NCw5IEBACiAgKi8KIGludCBvel9pc29jX3N0cmVhbV9jcmVhdGUoc3RydWN0IG96X3BkICpwZCwgdTggZXBfbnVtKQogewotCXN0cnVjdCBvel9pc29jX3N0cmVhbSAqc3QgPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3pfaXNvY19zdHJlYW0pLCBHRlBfQVRPTUlDKTsKKwlzdHJ1Y3Qgb3pfaXNvY19zdHJlYW0gKnN0OworCisJc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3pfaXNvY19zdHJlYW0pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXN0KQogCQlyZXR1cm4gLUVOT01FTTsKIAlzdC0+ZXBfbnVtID0gZXBfbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uYwppbmRleCAzZDNhM2E4Li4xYmEyNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cHJvdG8uYwpAQCAtOTgsNyArOTgsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KLQlvel9oZHItPmNvbnRyb2wgPSAoT1pfUFJPVE9DT0xfVkVSU0lPTjw8T1pfVkVSU0lPTl9TSElGVCk7CisJb3pfaGRyLT5jb250cm9sID0gT1pfUFJPVE9DT0xfVkVSU0lPTjw8T1pfVkVSU0lPTl9TSElGVDsKIAlvel9oZHItPmxhc3RfcGt0X251bSA9IDA7CiAJcHV0X3VuYWxpZ25lZCgwLCAmb3pfaGRyLT5wa3RfbnVtKTsKIAllbHQtPnR5cGUgPSBPWl9FTFRfQ09OTkVDVF9SU1A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCmluZGV4IDZlZDM1YjYuLmVhNTRmYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jCkBAIC0zMzUsMTEgKzMzNSwxMSBAQAogICogTENEIHR5cGVzCiAgKi8KICNkZWZpbmUgTENEX1RZUEVfTk9ORQkJMAotI2RlZmluZSBMQ0RfVFlQRV9PTEQJCTEKLSNkZWZpbmUgTENEX1RZUEVfS1MwMDc0CQkyCi0jZGVmaW5lIExDRF9UWVBFX0hBTlRST05JWAkzCi0jZGVmaW5lIExDRF9UWVBFX05FWENPTQkJNAotI2RlZmluZSBMQ0RfVFlQRV9DVVNUT00JCTUKKyNkZWZpbmUgTENEX1RZUEVfQ1VTVE9NCQkxCisjZGVmaW5lIExDRF9UWVBFX09MRAkJMgorI2RlZmluZSBMQ0RfVFlQRV9LUzAwNzQJCTMKKyNkZWZpbmUgTENEX1RZUEVfSEFOVFJPTklYCTQKKyNkZWZpbmUgTENEX1RZUEVfTkVYQ09NCQk1CiAKIC8qCiAgKiBrZXlwYWQgdHlwZXMKQEAgLTQ3Myw4ICs0NzMsNiBAQAogCiBzdGF0aWMgaW50IGtleXBhZF9pbml0aWFsaXplZDsKIAotc3RhdGljIGNoYXIgaW5pdF9pbl9wcm9ncmVzczsKLQogc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfY21kKShpbnQpOwogc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfZGF0YSkoaW50KTsKIHN0YXRpYyB2b2lkICgqbGNkX2NsZWFyX2Zhc3QpKHZvaWQpOwpAQCAtNTAyLDcgKzUwMCw3IEBACiBzdGF0aWMgaW50IGxjZF90eXBlID0gTk9UX1NFVDsKIG1vZHVsZV9wYXJhbShsY2RfdHlwZSwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobGNkX3R5cGUsCi0JCSAiTENEIHR5cGU6IDA9bm9uZSwgMT1vbGQgLy8sIDI9c2VyaWFsIGtzMDA3NCwgMz1oYW50cm9uaXggLy8sIDQ9bmV4Y29tIC8vLCA1PWNvbXBpbGVkLWluIik7CisJCSAiTENEIHR5cGU6IDA9bm9uZSwgMT1jb21waWxlZC1pbiwgMj1vbGQsIDM9c2VyaWFsIGtzMDA3NCwgND1oYW50cm9uaXgsIDU9bmV4Y29tIik7CiAKIHN0YXRpYyBpbnQgbGNkX2hlaWdodCA9IE5PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX2hlaWdodCwgaW50LCAwMDAwKTsKQEAgLTE3MTgsOSArMTcxNiw2IEBACiAKIHN0YXRpYyB2b2lkIGtleXBhZF9zZW5kX2tleShjb25zdCBjaGFyICpzdHJpbmcsIGludCBtYXhfbGVuKQogewotCWlmIChpbml0X2luX3Byb2dyZXNzKQotCQlyZXR1cm47Ci0KIAkvKiBzZW5kIHRoZSBrZXkgdG8gdGhlIGRldmljZSBvbmx5IGlmIGEgcHJvY2VzcyBpcyBhdHRhY2hlZCB0byBpdC4gKi8KIAlpZiAoIWF0b21pY19yZWFkKCZrZXlwYWRfYXZhaWxhYmxlKSkgewogCQl3aGlsZSAobWF4X2xlbi0tICYmIGtleXBhZF9idWZsZW4gPCBLRVlQQURfQlVGRkVSICYmICpzdHJpbmcpIHsKQEAgLTIwMTAsMTAgKzIwMDUsOCBAQAogCWlmIChzY2FuX3RpbWVyLmZ1bmN0aW9uICE9IE5VTEwpCiAJCXJldHVybjsJCS8qIGFscmVhZHkgc3RhcnRlZCAqLwogCi0JaW5pdF90aW1lcigmc2Nhbl90aW1lcik7CisJc2V0dXBfdGltZXIoJnNjYW5fdGltZXIsICh2b2lkICopJnBhbmVsX3NjYW5fdGltZXIsIDApOwogCXNjYW5fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBJTlBVVF9QT0xMX1RJTUU7Ci0Jc2Nhbl90aW1lci5kYXRhID0gMDsKLQlzY2FuX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikmcGFuZWxfc2Nhbl90aW1lcjsKIAlhZGRfdGltZXIoJnNjYW5fdGltZXIpOwogfQogCkBAIC0yMjM2LDYgKzIyMjksNyBAQAogCQlpZiAobWlzY19yZWdpc3Rlcigma2V5cGFkX2RldikpCiAJCQlnb3RvIGVycl9sY2RfdW5yZWc7CiAJfQorCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGFuZWxfbm90aWZpZXIpOwogCXJldHVybjsKIAogZXJyX2xjZF91bnJlZzoKQEAgLTIyNTcsNiArMjI1MSw4IEBACiAJCXJldHVybjsKIAl9CiAKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGFuZWxfbm90aWZpZXIpOworCiAJaWYgKGtleXBhZC5lbmFibGVkICYmIGtleXBhZF9pbml0aWFsaXplZCkgewogCQltaXNjX2RlcmVnaXN0ZXIoJmtleXBhZF9kZXYpOwogCQlrZXlwYWRfaW5pdGlhbGl6ZWQgPSAwOwpAQCAtMjI4MSw3ICsyMjc3LDcgQEAKIC8qIGluaXQgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgX19pbml0IHBhbmVsX2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JaW50IHNlbGVjdGVkX2tleXBhZF90eXBlID0gTk9UX1NFVDsKKwlpbnQgc2VsZWN0ZWRfa2V5cGFkX3R5cGUgPSBOT1RfU0VULCBlcnI7CiAKIAkvKiB0YWtlIGNhcmUgb2YgYW4gZXZlbnR1YWwgcHJvZmlsZSAqLwogCXN3aXRjaCAocHJvZmlsZSkgewpAQCAtMjMyNCwyNiArMjMyMCw2IEBACiAJfQogCiAJLyoKLQkgKiBJbml0IGxjZCBzdHJ1Y3Qgd2l0aCBsb2FkLXRpbWUgdmFsdWVzIHRvIHByZXNlcnZlIGV4YWN0IGN1cnJlbnQKLQkgKiBmdW5jdGlvbmFsaXR5IChhdCBsZWFzdCBmb3Igbm93KS4KLQkgKi8KLQlsY2QuaGVpZ2h0ID0gbGNkX2hlaWdodDsKLQlsY2Qud2lkdGggPSBsY2Rfd2lkdGg7Ci0JbGNkLmJ3aWR0aCA9IGxjZF9id2lkdGg7Ci0JbGNkLmh3aWR0aCA9IGxjZF9od2lkdGg7Ci0JbGNkLmNoYXJzZXQgPSBsY2RfY2hhcnNldDsKLQlsY2QucHJvdG8gPSBsY2RfcHJvdG87Ci0JbGNkLnBpbnMuZSA9IGxjZF9lX3BpbjsKLQlsY2QucGlucy5ycyA9IGxjZF9yc19waW47Ci0JbGNkLnBpbnMucncgPSBsY2RfcndfcGluOwotCWxjZC5waW5zLmNsID0gbGNkX2NsX3BpbjsKLQlsY2QucGlucy5kYSA9IGxjZF9kYV9waW47Ci0JbGNkLnBpbnMuYmwgPSBsY2RfYmxfcGluOwotCi0JLyogTGVhdmUgaXQgZm9yIG5vdywganVzdCBpbiBjYXNlICovCi0JbGNkLmVzY19zZXEubGVuID0gLTE7Ci0KLQkvKgogCSAqIE92ZXJ3cml0ZSBzZWxlY3Rpb24gd2l0aCBtb2R1bGUgcGFyYW0gdmFsdWVzIChib3RoIGtleXBhZCBhbmQgbGNkKSwKIAkgKiB3aGVyZSB0aGUgZGVwcmVjYXRlZCBwYXJhbXMgaGF2ZSBsb3dlciBwcmlvLgogCSAqLwpAQCAtMjM2MSw2ICsyMzM3LDI4IEBACiAKIAlsY2QuZW5hYmxlZCA9IChzZWxlY3RlZF9sY2RfdHlwZSA+IDApOwogCisJaWYgKGxjZC5lbmFibGVkKSB7CisJCS8qCisJCSAqIEluaXQgbGNkIHN0cnVjdCB3aXRoIGxvYWQtdGltZSB2YWx1ZXMgdG8gcHJlc2VydmUgZXhhY3QKKwkJICogY3VycmVudCBmdW5jdGlvbmFsaXR5IChhdCBsZWFzdCBmb3Igbm93KS4KKwkJICovCisJCWxjZC5oZWlnaHQgPSBsY2RfaGVpZ2h0OworCQlsY2Qud2lkdGggPSBsY2Rfd2lkdGg7CisJCWxjZC5id2lkdGggPSBsY2RfYndpZHRoOworCQlsY2QuaHdpZHRoID0gbGNkX2h3aWR0aDsKKwkJbGNkLmNoYXJzZXQgPSBsY2RfY2hhcnNldDsKKwkJbGNkLnByb3RvID0gbGNkX3Byb3RvOworCQlsY2QucGlucy5lID0gbGNkX2VfcGluOworCQlsY2QucGlucy5ycyA9IGxjZF9yc19waW47CisJCWxjZC5waW5zLnJ3ID0gbGNkX3J3X3BpbjsKKwkJbGNkLnBpbnMuY2wgPSBsY2RfY2xfcGluOworCQlsY2QucGlucy5kYSA9IGxjZF9kYV9waW47CisJCWxjZC5waW5zLmJsID0gbGNkX2JsX3BpbjsKKworCQkvKiBMZWF2ZSBpdCBmb3Igbm93LCBqdXN0IGluIGNhc2UgKi8KKwkJbGNkLmVzY19zZXEubGVuID0gLTE7CisJfQorCiAJc3dpdGNoIChzZWxlY3RlZF9rZXlwYWRfdHlwZSkgewogCWNhc2UgS0VZUEFEX1RZUEVfT0xEOgogCQlrZXlwYWRfcHJvZmlsZSA9IG9sZF9rZXlwYWRfcHJvZmlsZTsKQEAgLTIzNzYsMjcgKzIzNzQsMTcgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogdGVsbHMgdmFyaW91cyBzdWJzeXN0ZW1zIGFib3V0IHRoZSBmYWN0IHRoYXQgd2UgYXJlIGluaXRpYWxpemluZyAqLwotCWluaXRfaW5fcHJvZ3Jlc3MgPSAxOwotCi0JaWYgKHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kcml2ZXIpKSB7Ci0JCXByX2VycigiY291bGQgbm90IHJlZ2lzdGVyIHdpdGggcGFycG9ydC4gQWJvcnRpbmcuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCiAJaWYgKCFsY2QuZW5hYmxlZCAmJiAha2V5cGFkLmVuYWJsZWQpIHsKLQkJLyogbm8gZGV2aWNlIGVuYWJsZWQsIGxldCdzIHJlbGVhc2UgdGhlIHBhcnBvcnQgKi8KLQkJaWYgKHBwcnQpIHsKLQkJCXBhcnBvcnRfcmVsZWFzZShwcHJ0KTsKLQkJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHBydCk7Ci0JCQlwcHJ0ID0gTlVMTDsKLQkJfQotCQlwYXJwb3J0X3VucmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kcml2ZXIpOworCQkvKiBubyBkZXZpY2UgZW5hYmxlZCwgbGV0J3MgZXhpdCAqLwogCQlwcl9lcnIoImRyaXZlciB2ZXJzaW9uICIgUEFORUxfVkVSU0lPTiAiIGRpc2FibGVkLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGFuZWxfbm90aWZpZXIpOworCWVyciA9IHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZwYW5lbF9kcml2ZXIpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJjb3VsZCBub3QgcmVnaXN0ZXIgd2l0aCBwYXJwb3J0LiBBYm9ydGluZy5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KIAogCWlmIChwcHJ0KQogCQlwcl9pbmZvKCJkcml2ZXIgdmVyc2lvbiAiIFBBTkVMX1ZFUlNJT04KQEAgLTI0MDUsMTUgKzIzOTMsMTEgQEAKIAllbHNlCiAJCXByX2luZm8oImRyaXZlciB2ZXJzaW9uICIgUEFORUxfVkVSU0lPTgogCQkJIiBub3QgeWV0IHJlZ2lzdGVyZWRcbiIpOwotCS8qIHRlbGxzIHZhcmlvdXMgc3Vic3lzdGVtcyBhYm91dCB0aGUgZmFjdCB0aGF0IGluaXRpYWxpemF0aW9uCi0JICAgaXMgZmluaXNoZWQgKi8KLQlpbml0X2luX3Byb2dyZXNzID0gMDsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHBhbmVsX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7Ci0JdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBhbmVsX25vdGlmaWVyKTsKIAogCWlmIChzY2FuX3RpbWVyLmZ1bmN0aW9uICE9IE5VTEwpCiAJCWRlbF90aW1lcl9zeW5jKCZzY2FuX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYwppbmRleCBkYTE5MTQ1Li5lNjVlZTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8d2lmaS5oPgogI2luY2x1ZGUgPGllZWU4MDIxMS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKIApAQCAtNzgsMTEgKzc5LDggQEAKIAlpZiAodHJ1ZSkgewogCQl1OCAqcCwgKmRzdF9pZSwgKnByZW1haW5kZXJfaWUgPSBOVUxMOwogCQl1OCAqcGJhY2t1cF9yZW1haW5kZXJfaWUgPSBOVUxMOwotCQlfX2xlMTYgdGltX2JpdG1hcF9sZTsKIAkJdWludCBvZmZzZXQsIHRtcF9sZW4sIHRpbV9pZWxlbiwgdGltX2llX29mZnNldCwgcmVtYWluZGVyX2llbGVuOwogCi0JCXRpbV9iaXRtYXBfbGUgPSBjcHVfdG9fbGUxNihwc3RhcHJpdi0+dGltX2JpdG1hcCk7Ci0KIAkJcCA9IHJ0d19nZXRfaWUocGllICsgX0ZJWEVEX0lFX0xFTkdUSF8sIF9USU1fSUVfLCAmdGltX2llbGVuLCBwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCAtIF9GSVhFRF9JRV9MRU5HVEhfKTsKIAkJaWYgKHAgIT0gTlVMTCAmJiB0aW1faWVsZW4gPiAwKSB7CiAJCQl0aW1faWVsZW4gKz0gMjsKQEAgLTEzNyw5ICsxMzUsOSBAQAogCQkJKmRzdF9pZSsrID0gMDsKIAogCQlpZiAodGltX2llbGVuID09IDQpIHsKLQkJCSpkc3RfaWUrKyA9ICoodTggKikmdGltX2JpdG1hcF9sZTsKKwkJCSpkc3RfaWUrKyA9IHBzdGFwcml2LT50aW1fYml0bWFwICYgMHhmZjsKIAkJfSBlbHNlIGlmICh0aW1faWVsZW4gPT0gNSkgewotCQkJbWVtY3B5KGRzdF9pZSwgJnRpbV9iaXRtYXBfbGUsIDIpOworCQkJcHV0X3VuYWxpZ25lZF9sZTE2KHBzdGFwcml2LT50aW1fYml0bWFwLCBkc3RfaWUpOwogCQkJZHN0X2llICs9IDI7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKaW5kZXggNGI0MzQ2Mi4uODliNWU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCkBAIC0zMjUsNyArMzI1LDggQEAKIAlpZiAocmVzID09IF9TVUNDRVNTKSB7CiAJCXBtbG1lcHJpdi0+c2Nhbl9zdGFydF90aW1lID0gamlmZmllczsKIAotCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIFNDQU5OSU5HX1RJTUVPVVQpOworCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoU0NBTk5JTkdfVElNRU9VVCkpOwogCiAJCXJ0d19sZWRfY29udHJvbChwYWRhcHRlciwgTEVEX0NUTF9TSVRFX1NVUlZFWSk7CiAKQEAgLTEyMzQsOSArMTIzNSwxMSBAQAogCWlmIChwY21kLT5yZXMgPT0gSDJDX0RST1BQRUQpIHsKIAkJLyogVE9ETzogY2FuY2VsIHRpbWVyIGFuZCBkbyB0aW1lb3V0IGhhbmRsZXIgZGlyZWN0bHkuLi4gKi8KIAkJLyogbmVlZCB0byBtYWtlIHRpbWVvdXQgaGFuZGxlck9TIGluZGVwZW5kZW50ICovCi0JCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJfSBlbHNlIGlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCAxKTsKKwkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIlxuICoqKioqKioqRXJyb3I6IE1nbnRBY3RydHdfc2V0XzgwMl8xMV9ic3NpZF9MSVNUX1NDQU4gRmFpbCAqKioqKioqKioqKipcblxuLiIpKTsKIAl9CiAKQEAgLTEyNzAsMTAgKzEyNzMsMTIgQEAKIAlpZiAocGNtZC0+cmVzID09IEgyQ19EUk9QUEVEKSB7CiAJCS8qIFRPRE86IGNhbmNlbCB0aW1lciBhbmQgZG8gdGltZW91dCBoYW5kbGVyIGRpcmVjdGx5Li4uICovCiAJCS8qIG5lZWQgdG8gbWFrZSB0aW1lb3V0IGhhbmRsZXJPUyBpbmRlcGVuZGVudCAqLwotCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAxKTsKKwkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJfSBlbHNlIGlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLCAoIioqKioqKioqRXJyb3I6cnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUgV2FpdCBTZW1hICBGYWlsICoqKioqKioqKioqKlxuIikpOwotCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAxKTsKKwkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJfQogCiAJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKQEAgLTEyOTEsNyArMTI5Niw4IEBACiAKIAlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbiAqKioqKioqKkVycm9yOiBydHdfY3JlYXRlYnNzX2NtZF9jYWxsYmFjayAgRmFpbCAqKioqKioqKioqKipcblxuLiIpKTsKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCX0KIAogCWRlbF90aW1lcl9zeW5jKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYwppbmRleCA4ODE2ZDExLi5iNjY3NDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAl3aGlsZSAoKHJ0ZW1wOCAhPSAweEZGKSAmJiAoZUZ1c2VfQWRkciA8IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFKSkgewogCQkvKiAgQ2hlY2sgUEcgaGVhZGVyIGZvciBzZWN0aW9uIG51bS4gKi8KIAkJaWYgKChydGVtcDggJiAweDFGKSA9PSAweDBGKSB7CQkvKiBleHRlbmRlZCBoZWFkZXIgKi8KLQkJCXUxdGVtcCA9ICgocnRlbXA4ICYgMHhFMCkgPj4gNSk7CisJCQl1MXRlbXAgPSAocnRlbXA4ICYgMHhFMCkgPj4gNTsKIAkJCXJ0ZW1wOCA9ICoocGh5bWFwK2VGdXNlX0FkZHIpOwogCQkJaWYgKChydGVtcDggJiAweDBGKSA9PSAweDBGKSB7CiAJCQkJZUZ1c2VfQWRkcisrOwpAQCAtMTUwLDEyICsxNTAsMTIgQEAKIAkJCQljb250aW51ZTsKIAkJCX0gZWxzZSB7CiAJCQkJb2Zmc2V0ID0gKChydGVtcDggJiAweEYwKSA+PiAxKSB8IHUxdGVtcDsKLQkJCQl3cmVuID0gKHJ0ZW1wOCAmIDB4MEYpOworCQkJCXdyZW4gPSBydGVtcDggJiAweDBGOwogCQkJCWVGdXNlX0FkZHIrKzsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCW9mZnNldCA9ICgocnRlbXA4ID4+IDQpICYgMHgwZik7Ci0JCQl3cmVuID0gKHJ0ZW1wOCAmIDB4MGYpOworCQkJb2Zmc2V0ID0gKHJ0ZW1wOCA+PiA0KSAmIDB4MGY7CisJCQl3cmVuID0gcnRlbXA4ICYgMHgwZjsKIAkJfQogCiAJCWlmIChvZmZzZXQgPCBFRlVTRV9NQVhfU0VDVElPTl84OEUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCmluZGV4IGYyYzNjYTcuLjExYjc4MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+CiAKIHU4IFJUV19XUEFfT1VJX1RZUEVbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OwotdTE2IFJUV19XUEFfVkVSU0lPTiA9IDE7CiB1OCBXUEFfQVVUSF9LRVlfTUdNVF9OT05FW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDAgfTsKIHU4IFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVhbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OwogdTggV1BBX0FVVEhfS0VZX01HTVRfUFNLX09WRVJfODAyXzFYW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDIgfTsKQEAgLTY2Myw3ICs2NjIsNyBAQAogCiAJLyogU2VhcmNoIHJlcXVpcmVkIFdQQSBvciBXUEEyIElFIGFuZCBjb3B5IHRvIHNlY19pZVtdICovCiAKLQljbnQgPSAoX1RJTUVTVEFNUF8gKyBfQkVBQ09OX0lURVJWQUxfICsgX0NBUEFCSUxJVFlfKTsKKwljbnQgPSBfVElNRVNUQU1QXyArIF9CRUFDT05fSVRFUlZBTF8gKyBfQ0FQQUJJTElUWV87CiAKIAlzZWNfaWR4ID0gMDsKIApAQCAtNzg5LDcgKzc4OCw3IEBACiAgKgogICogUmV0dXJuczogdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmljIFdQUyBhdHRyaWJ1dGUgZm91bmQsIG9yIE5VTEwKICAqLwotdTggKnJ0d19nZXRfd3BzX2F0dHIodTggKndwc19pZSwgdWludCB3cHNfaWVsZW4sIHUxNiB0YXJnZXRfYXR0cl9pZCAsIHU4ICpidWZfYXR0ciwgdTMyICpsZW5fYXR0cikKK3U4ICpydHdfZ2V0X3dwc19hdHRyKHU4ICp3cHNfaWUsIHVpbnQgd3BzX2llbGVuLCB1MTYgdGFyZ2V0X2F0dHJfaWQsIHU4ICpidWZfYXR0ciwgdTMyICpsZW5fYXR0cikKIHsKIAl1OCAqYXR0cl9wdHIgPSBOVUxMOwogCXU4ICp0YXJnZXRfYXR0cl9wdHIgPSBOVUxMOwpAQCAtNzk5LDcgKzc5OCw3IEBACiAJCSpsZW5fYXR0ciA9IDA7CiAKIAlpZiAoKHdwc19pZVswXSAhPSBfVkVORE9SX1NQRUNJRklDX0lFXykgfHwKLQkgICAgKG1lbWNtcCh3cHNfaWUgKyAyLCB3cHNfb3VpICwgNCkpKQorCSAgICAobWVtY21wKHdwc19pZSArIDIsIHdwc19vdWksIDQpKSkKIAkJcmV0dXJuIGF0dHJfcHRyOwogCiAJLyogIDYgPSAxKEVsZW1lbnQgSUQpICsgMShMZW5ndGgpICsgNChXUFMgT1VJKSAqLwpAQCAtODM1LDcgKzgzNCw3IEBACiAgKgogICogUmV0dXJuczogdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmljIFdQUyBhdHRyaWJ1dGUgY29udGVudCBmb3VuZCwgb3IgTlVMTAogICovCi11OCAqcnR3X2dldF93cHNfYXR0cl9jb250ZW50KHU4ICp3cHNfaWUsIHVpbnQgd3BzX2llbGVuLCB1MTYgdGFyZ2V0X2F0dHJfaWQgLCB1OCAqYnVmX2NvbnRlbnQsIHVpbnQgKmxlbl9jb250ZW50KQordTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudCh1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkLCB1OCAqYnVmX2NvbnRlbnQsIHVpbnQgKmxlbl9jb250ZW50KQogewogCXU4ICphdHRyX3B0cjsKIAl1MzIgYXR0cl9sZW47CkBAIC0xMjM5LDcgKzEyMzgsNyBAQAogCX0gZWxzZSB7CiAJCXBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCA9IEVOQ1JZUF9QUk9UT0NPTF9PUEVOU1lTOwogCX0KLQlydHdfZ2V0X3NlY19pZShwbmV0d29yay0+bmV0d29yay5JRXMgLCBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCwgTlVMTCwgJnJzbl9sZW4sIE5VTEwsICZ3cGFfbGVuKTsKKwlydHdfZ2V0X3NlY19pZShwbmV0d29yay0+bmV0d29yay5JRXMsIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoLCBOVUxMLCAmcnNuX2xlbiwgTlVMTCwgJndwYV9sZW4pOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d19nZXRfYmNuX2luZm86IHNzaWQgPSVzXG4iLCBwbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQpKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfZ2V0X2Jjbl9pbmZvOiB3cGFfbGVuID0lZCByc25fbGVuID0lZFxuIiwgd3BhX2xlbiwgcnNuX2xlbikpOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoInJ0d19nZXRfYmNuX2luZm86IHNzaWQgPSVzXG4iLCBwbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCmluZGV4IDJmYWY2YjJlLi45NjkxNTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKQEAgLTg2LDcgKzg2LDggQEAKIAkJc2VsZWN0X3JldCA9IHJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlKHBtbG1lcHJpdik7CiAJCWlmIChzZWxlY3RfcmV0ID09IF9TVUNDRVNTKSB7CiAJCQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQkJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIE1BWF9KT0lOX1RJTUVPVVQpOworCQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTUFYX0pPSU5fVElNRU9VVCkpOwogCQl9IGVsc2UgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSA9PSB0cnVlKSB7CiAJCQkJLyogIHN1Ym1pdCBjcmVhdGVic3NfY21kIHRvIGNoYW5nZSB0byBhIEFESE9DX01BU1RFUiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbGVkLmMKaW5kZXggMWI4MjY0Yi4uOTQ0MDVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2xlZC5jCkBAIC0yMiw5ICsyMiw5IEBACiAvKgkJQ2FsbGJhY2sgZnVuY3Rpb24gb2YgTEVEIEJsaW5rVGltZXIsICovCiAvKgkJaXQganVzdCBzY2hlZHVsZXMgdG8gY29ycmVzcG9uZGluZyBCbGlua1dvcmtJdGVtL2xlZF9ibGlua19oZGwgKi8KIC8qICAqLwotdm9pZCBCbGlua1RpbWVyQ2FsbGJhY2sodm9pZCAqZGF0YSkKK3ZvaWQgQmxpbmtUaW1lckNhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgTEVEXzg3MXggKnBMZWQgPSBkYXRhOworCXN0cnVjdCBMRURfODcxeCAqcExlZCA9IChzdHJ1Y3QgTEVEXzg3MXggKilkYXRhOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHBMZWQtPnBhZGFwdGVyOwogCiAJaWYgKChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgfHwgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkpCkBAIC03Miw3ICs3Miw4IEBACiAKIAlSZXNldExlZFN0YXR1cyhwTGVkKTsKIAotCV9pbml0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LCBCbGlua1RpbWVyQ2FsbGJhY2ssIHBMZWQpOworCXNldHVwX3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIEJsaW5rVGltZXJDYWxsYmFjaywKKwkJICAgICh1bnNpZ25lZCBsb25nKXBMZWQpOwogCiAJSU5JVF9XT1JLKCYocExlZC0+QmxpbmtXb3JrSXRlbSksIEJsaW5rV29ya0l0ZW1DYWxsYmFjayk7CiB9CkBAIC0xMjIsMTQgKzEyMywxNiBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfTk9STUFMOgogCQlpZiAocExlZC0+YkxlZE9uKQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfU0NBTjoKIAkJcExlZC0+QmxpbmtUaW1lcy0tOwpAQCAtMTQzLDcgKzE0Niw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJCQllbHNlCiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxMl9sZWRfY18sIF9kcnZfaW5mb18sICgiQ3VyckxlZFN0YXRlICVkXG4iLCBwTGVkLT5DdXJyTGVkU3RhdGUpKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTUyLDcgKzE1Niw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJCQllbHNlCiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxMl9sZWRfY18sIF9kcnZfaW5mb18sICgiQ3VyckxlZFN0YXRlICVkXG4iLCBwTGVkLT5DdXJyTGVkU3RhdGUpKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xNjEsNyArMTY2LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfVFhSWDoKQEAgLTE3Niw3ICsxODIsOCBAQAogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQkJZWxzZQogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MTJfbGVkX2NfLCBfZHJ2X2luZm9fLCAoIkN1cnJMZWRTdGF0ZSAlZFxuIiwgcExlZC0+Q3VyckxlZFN0YXRlKSk7CiAJCQl9IGVsc2UgaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTE4NSw3ICsxOTIsOCBAQAogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQkJZWxzZQogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MTJfbGVkX2NfLCBfZHJ2X2luZm9fLCAoIkN1cnJMZWRTdGF0ZSAlZFxuIiwgcExlZC0+Q3VyckxlZFN0YXRlKSk7CiAJCQl9CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMDsKQEAgLTE5NSw3ICsyMDMsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTOgpAQCAtMjAzLDcgKzIxMiw4IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUDoJLyogV1BTIHN1Y2Nlc3MgKi8KIAkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gUlRXX0xFRF9PTikKQEAgLTIxOCwxNCArMjI4LDE1IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzEyX2xlZF9jXywgX2Rydl9pbmZvXywgKCJDdXJyTGVkU3RhdGUgJWRcbiIsIHBMZWQtPkN1cnJMZWRTdGF0ZSkpOwogCiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yNjIsNyArMjczLDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX0xJTks6CkBAIC0yODMsNyArMjk1LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NJVEVfU1VSVkVZOgpAQCAtMzExLDcgKzMyNCw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQkgfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfVFg6CkBAIC0zMzQsNyArMzQ4LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFM6IC8qIHdhaXQgdW50aWwgeGlucGluIGZpbmlzaCAqLwpAQCAtMzYyLDcgKzM3Nyw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQkgfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RPUF9XUFM6CkBAIC0zODksMTEgKzQwNSwxMiBAQAogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTX1NUT1A7CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0gZWxzZSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CkBAIC00MDcsNyArNDI0LDggQEAKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwppbmRleCBkNDYzMmRhLi42YzkxYWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwpAQCAtNjY1LDcgKzY2NSw4IEBACiAJCQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7CiAKIAkJCQlpZiAocnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUocG1sbWVwcml2KSA9PSBfU1VDQ0VTUykgewotCQkJCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCBNQVhfSk9JTl9USU1FT1VUKTsKKwkJCQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNQVhfSk9JTl9USU1FT1VUKSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJc3RydWN0IHdsYW5fYnNzaWRfZXggICAgKnBkZXZfbmV0d29yayA9ICYoYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrKTsKIAkJCQkJdTggKnBpYnNzID0gYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrLk1hY0FkZHJlc3M7CkBAIC02OTIsNyArNjkzLDggQEAKIAkJCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwogCQkJc19yZXQgPSBydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZShwbWxtZXByaXYpOwogCQkJaWYgKF9TVUNDRVNTID09IHNfcmV0KSB7Ci0JCQkgICAgIF9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIE1BWF9KT0lOX1RJTUVPVVQpOworCQkJICAgICBtb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCisJCQkJICAgICAgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1BWF9KT0lOX1RJTUVPVVQpKTsKIAkJCX0gZWxzZSBpZiAoc19yZXQgPT0gMikgeyAvKiB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgZm9yIGpvaW4gKi8KIAkJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwogCQkJCXJ0d19pbmRpY2F0ZV9jb25uZWN0KGFkYXB0ZXIpOwpAQCAtMTEyNywxNCArMTEyOSwxNiBAQAogCiAJfSBlbHNlIGlmIChwbmV0d29yay0+am9pbl9yZXMgPT0gLTQpIHsKIAkJcnR3X3Jlc2V0X3NlY3VyaXR5cHJpdihhZGFwdGVyKTsKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCiAJCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkgPT0gdHJ1ZSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJmYWlsISBjbGVhciBfRldfVU5ERVJfTElOS0lORyBeXl5md19zdGF0ZT0leFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOwogCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKIAkJfQogCX0gZWxzZSB7IC8qIGlmIGpvaW5fcmVzIDwgMCAoam9pbiBmYWlscyksIHRoZW4gdHJ5IGFnYWluICovCi0JCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIDEpOworCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKIAl9CiAKQEAgLTEzNjAsOSArMTM2NCw5IEBACiAqIF9ydHdfam9pbl90aW1lb3V0X2hhbmRsZXIgLSBUaW1lb3V0L2ZhbGl1cmUgaGFuZGxlciBmb3IgQ01EIEpvaW5Cc3MKICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gc3RydWN0IGFkYXB0ZXIgc3RydWN0dXJlCiAqLwotdm9pZCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyICh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQordm9pZCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyICh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBmdW5jdGlvbl9jb250ZXh0OworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7CiAJaW50IGRvX2pvaW5fcjsKIApAQCAtMTQwMiw5ICsxNDA2LDkgQEAKICogcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyIC0gVGltZW91dC9GYWxpdXJlIGhhbmRsZXIgZm9yIENNRCBTaXRlU3VydmV5CiAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHN0cnVjdCBhZGFwdGVyIHN0cnVjdHVyZQogKi8KLXZvaWQgcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyICh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQordm9pZCBydHdfc2Nhbl90aW1lb3V0X2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGZ1bmN0aW9uX2NvbnRleHQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKIAogCURCR184OEUoRlVOQ19BRFBUX0ZNVCIgZndfc3RhdGU9JXhcbiIsIEZVTkNfQURQVF9BUkcoYWRhcHRlciksIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwpAQCAtMTQyOSw5ICsxNDMzLDkgQEAKIAl9CiB9CiAKLXZvaWQgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxkZXIodm9pZCAqZnVuY3Rpb25fY29udGV4dCkKK3ZvaWQgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxkZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZnVuY3Rpb25fY29udGV4dDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWRhdGE7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCiAJaWYgKCFhZGFwdGVyKQpAQCAtMTQ0OSw3ICsxNDUzLDggQEAKIAkJcnR3X2F1dG9fc2Nhbl9oYW5kbGVyKGFkYXB0ZXIpOwogCX0KIGV4aXQ6Ci0JX3NldF90aW1lcigmYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsIDIwMDApOworCW1vZF90aW1lcigmYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwogfQogCiAjZGVmaW5lIFJUV19TQ0FOX1JFU1VMVF9FWFBJUkUgMjAwMApAQCAtMjAzNyw3ICsyMDQyLDcgQEAKIAlwID0gcnR3X2dldF9pZShwaWUrc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSksIF9IVF9DQVBBQklMSVRZX0lFXywgJmxlbiwgaWVfbGVuLXNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKTsKIAlpZiAocCAmJiBsZW4gPiAwKSB7CiAJCXBodF9jYXBpZSA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKikocCsyKTsKLQkJbWF4X2FtcGR1X3N6ID0gKHBodF9jYXBpZS0+YW1wZHVfcGFyYW1zX2luZm8gJiBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0ZBQ1RPUik7CisJCW1heF9hbXBkdV9zeiA9IHBodF9jYXBpZS0+YW1wZHVfcGFyYW1zX2luZm8gJiBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0ZBQ1RPUjsKIAkJbWF4X2FtcGR1X3N6ID0gMSA8PCAobWF4X2FtcGR1X3N6KzMpOyAvKiAgbWF4X2FtcGR1X3N6IChrYnl0ZXMpOyAqLwogCQlwaHRwcml2LT5yeF9hbXBkdV9tYXhsZW4gPSBtYXhfYW1wZHVfc3o7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCmluZGV4IGNkMTJkZDcuLmJlOWUzNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKQEAgLTE2MzksNyArMTYzOSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBSVFdfV0xBTl9BQ1RJT05fQUREQkFfUkVTUDogLyogQUREQkEgcmVzcG9uc2UgKi8KIAkJCXN0YXR1cyA9IGdldF91bmFsaWduZWRfbGUxNigmZnJhbWVfYm9keVszXSk7Ci0JCQl0aWQgPSAoKGZyYW1lX2JvZHlbNV0gPj4gMikgJiAweDcpOworCQkJdGlkID0gKGZyYW1lX2JvZHlbNV0gPj4gMikgJiAweDc7CiAJCQlpZiAoc3RhdHVzID09IDApIHsJLyogc3VjY2Vzc2Z1bCAqLwogCQkJCURCR184OEUoImFnZ19lbmFibGUgZm9yIFRJRD0lZFxuIiwgdGlkKTsKIAkJCQlwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAgfD0gMSA8PCB0aWQ7CkBAIC0yNDkxLDcgKzI0OTEsNyBAQAogCiAJCS8qIHNldHRpbmcgSVYgZm9yIGF1dGggc2VxICMzICovCiAJCWlmICgocG1sbWVpbmZvLT5hdXRoX3NlcSA9PSAzKSAmJiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9TVEFURSkgJiYgKHVzZV9zaGFyZWRfa2V5ID09IDEpKSB7Ci0JCQl2YWwzMiA9ICgocG1sbWVpbmZvLT5pdisrKSB8IChwbWxtZWluZm8tPmtleV9pbmRleCA8PCAzMCkpOworCQkJdmFsMzIgPSAocG1sbWVpbmZvLT5pdisrKSB8IChwbWxtZWluZm8tPmtleV9pbmRleCA8PCAzMCk7CiAJCQlsZV90bXAzMiA9IGNwdV90b19sZTMyKHZhbDMyKTsKIAkJCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCA0LCAodW5zaWduZWQgY2hhciAqKSZsZV90bXAzMiwgJihwYXR0cmliLT5wa3RsZW4pKTsKIApAQCAtMzMzMSw3ICszMzMxLDcgQEAKIAkJCX0gd2hpbGUgKHBtbG1laW5mby0+ZGlhbG9nVG9rZW4gPT0gMCk7CiAJCQlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMSwgJihwbWxtZWluZm8tPmRpYWxvZ1Rva2VuKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKIAotCQkJQkFfcGFyYV9zZXQgPSAoMHgxMDAyIHwgKChzdGF0dXMgJiAweGYpIDw8IDIpKTsgLyogaW1tZWRpYXRlIGFjayAmIDY0IGJ1ZmZlciBzaXplICovCisJCQlCQV9wYXJhX3NldCA9IDB4MTAwMiB8ICgoc3RhdHVzICYgMHhmKSA8PCAyKTsgLyogaW1tZWRpYXRlIGFjayAmIDY0IGJ1ZmZlciBzaXplICovCiAJCQlsZV90bXAgPSBjcHVfdG9fbGUxNihCQV9wYXJhX3NldCk7CiAJCQlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMiwgKHVuc2lnbmVkIGNoYXIgKikoJihsZV90bXApKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKIApAQCAtMzk3Miw4ICszOTcyLDggQEAKIAkJLyogYW5kIGVuYWJsZSBhIHRpbWVyICovCiAJCWJlYWNvbl90aW1lb3V0ID0gZGVjaWRlX3dhaXRfZm9yX2JlYWNvbl90aW1lb3V0KHBtbG1laW5mby0+YmNuX2ludGVydmFsKTsKIAkJc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIGJlYWNvbl90aW1lb3V0KTsKLQkJX3NldF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyLAotCQkJICAgKFJFQVVUSF9UTyAqIFJFQVVUSF9MSU1JVCkgKyAoUkVBU1NPQ19UTypSRUFTU09DX0xJTUlUKSArIGJlYWNvbl90aW1lb3V0KTsKKwkJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuYXNzb2NfdGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKChSRUFVVEhfVE8gKiBSRUFVVEhfTElNSVQpICsgKFJFQVNTT0NfVE8gKiBSRUFTU09DX0xJTUlUKSArIGJlYWNvbl90aW1lb3V0KSk7CiAKIAkJcG1sbWVpbmZvLT5zdGF0ZSA9IFdJRklfRldfQVVUSF9OVUxMIHwgV0lGSV9GV19TVEFUSU9OX1NUQVRFOwogCX0gZWxzZSBpZiAoY2FwcyZjYXBfSUJTUykgeyAvKiBhZGhvYyBjbGllbnQgKi8KQEAgLTQyNDcsNyArNDI0Nyw3IEBACiAJaWYgKHBjbWRfb2JqID09IE5VTEwpCiAJCXJldHVybjsKIAotCWNtZHN6ID0gKHNpemVvZihzdHJ1Y3Qgc3VydmV5X2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN1cnZleV9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7CiAJcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwogCWlmIChwZXZ0Y21kID09IE5VTEwpIHsKIAkJa2ZyZWUocGNtZF9vYmopOwpAQCAtNDI5OSw3ICs0Mjk5LDcgQEAKIAlpZiAocGNtZF9vYmogPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAocGV2dGNtZCA9PSBOVUxMKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQzNDUsNyArNDM0NSw3IEBACiAJaWYgKHBjbWRfb2JqID09IE5VTEwpCiAJCXJldHVybjsKIAotCWNtZHN6ID0gKHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOworCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBqb2luYnNzX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKIAlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7CiAJaWYgKHBldnRjbWQgPT0gTlVMTCkgewogCQlrZnJlZShwY21kX29iaik7CkBAIC00Mzk4LDcgKzQzOTgsNyBAQAogCWlmIChwY21kX29iaiA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQljbWRzeiA9IChzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOworCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdGFkZWxfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAocGV2dGNtZCA9PSBOVUxMKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQ0MjgsNyArNDQyOCw3IEBACiAJaWYgKHBzdGEpCiAJCW1hY19pZCA9IChpbnQpcHN0YS0+bWFjX2lkOwogCWVsc2UKLQkJbWFjX2lkID0gKC0xKTsKKwkJbWFjX2lkID0gLTE7CiAKIAlwZGVsX3N0YV9ldnQtPm1hY19pZCA9IG1hY19pZDsKIApAQCAtNDQ1Myw3ICs0NDUzLDcgQEAKIAlpZiAocGNtZF9vYmogPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGFzc29jX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAocGV2dGNtZCA9PSBOVUxMKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQ4MzUsOSArNDgzNSw5IEBACiAJfQogfQogCi12b2lkIHN1cnZleV90aW1lcl9oZGwodm9pZCAqZnVuY3Rpb25fY29udGV4dCkKK3ZvaWQgc3VydmV5X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gZnVuY3Rpb25fY29udGV4dDsKKwlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCBjbWRfb2JqCSpwaDJjOwogCXN0cnVjdCBzaXRlc3VydmV5X3Bhcm0JKnBzdXJ2ZXlQYXJhOwogCXN0cnVjdCBjbWRfcHJpdgkJCQkJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwpAQCAtNDg3NSw5ICs0ODc1LDkgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgbGlua190aW1lcl9oZGwodm9pZCAqZnVuY3Rpb25fY29udGV4dCkKK3ZvaWQgbGlua190aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWZ1bmN0aW9uX2NvbnRleHQ7CisJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKQEAgLTQ5MTIsOSArNDkxMiw5IEBACiAJcmV0dXJuOwogfQogCi12b2lkIGFkZGJhX3RpbWVyX2hkbCh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQordm9pZCBhZGRiYV90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IGZ1bmN0aW9uX2NvbnRleHQ7CisJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKWRhdGE7CiAJc3RydWN0IGh0X3ByaXYJKnBodHByaXY7CiAKIAlpZiAoIXBzdGEpCkBAIC01MzU2LDcgKzUzNTYsNyBAQAogCiAJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBwYXJtLT5hZGRyKTsKIAkJaWYgKHBzdGEpIHsKLQkJCWN0cmwgPSAoQklUKDE1KSB8ICgocHBhcm0tPmFsZ29yaXRobSkgPDwgMikpOworCQkJY3RybCA9IEJJVCgxNSkgfCAoKHBwYXJtLT5hbGdvcml0aG0pIDw8IDIpOwogCiAJCQlEQkdfODhFKCJyODcxeF9zZXRfc3Rha2V5X2hkbCgpOiBlbmNfYWxnb3JpdGhtPSVkXG4iLCBwcGFybS0+YWxnb3JpdGhtKTsKIApAQCAtNTM2NSw3ICs1MzY1LDcgQEAKIAkJCQlyZXR1cm4gSDJDX1JFSkVDVEVEOwogCQkJfQogCi0JCQljYW1faWQgPSAocHN0YS0+bWFjX2lkICsgMyk7LyogMH4zIGZvciBkZWZhdWx0IGtleSwgY21kX2lkID0gbWFjaWQgKyAzLCBtYWNpZCA9IGFpZCsxOyAqLworCQkJY2FtX2lkID0gcHN0YS0+bWFjX2lkICsgMzsvKiAwfjMgZm9yIGRlZmF1bHQga2V5LCBjbWRfaWQgPSBtYWNpZCArIDMsIG1hY2lkID0gYWlkKzE7ICovCiAKIAkJCURCR184OEUoIldyaXRlIENBTSwgbWFjX2FkZHIgPSV4OiV4OiV4OiV4OiV4OiV4LCBjYW1fZW50cnk9JWRcbiIsIHBwYXJtLT5hZGRyWzBdLAogCQkJCXBwYXJtLT5hZGRyWzFdLCBwcGFybS0+YWRkclsyXSwgcHBhcm0tPmFkZHJbM10sIHBwYXJtLT5hZGRyWzRdLApAQCAtNTQwNiw3ICs1NDA2LDggQEAKIAlpZiAoKChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTKSAmJiAocG1sbWVpbmZvLT5IVF9lbmFibGUpKSB8fAogCSAgICAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkpIHsKIAkJaXNzdWVfYWN0aW9uX0JBKHBhZGFwdGVyLCBwcGFybS0+YWRkciwgUlRXX1dMQU5fQUNUSU9OX0FEREJBX1JFUSwgKHUxNilwcGFybS0+dGlkKTsKLQkJX3NldF90aW1lcigmcHN0YS0+YWRkYmFfcmV0cnlfdGltZXIsIEFEREJBX1RPKTsKKwkJbW9kX3RpbWVyKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQUREQkFfVE8pKTsKIAl9IGVsc2UgewogCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgJj0gfkJJVChwcGFybS0+dGlkKTsKIAl9CkBAIC01NDMwLDE1ICs1NDMxLDE0IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlwdHhCZWFjb25fcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgR0ZQX0tFUk5FTCk7CisJcHR4QmVhY29uX3Bhcm0gPSBrbWVtZHVwKCYocG1sbWVpbmZvLT5uZXR3b3JrKSwKKwkJCQlzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBHRlBfS0VSTkVMKTsKIAlpZiAocHR4QmVhY29uX3Bhcm0gPT0gTlVMTCkgewogCQlrZnJlZShwaDJjKTsKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQltZW1jcHkocHR4QmVhY29uX3Bhcm0sICYocG1sbWVpbmZvLT5uZXR3b3JrKSwgc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSk7Ci0KIAlsZW5fZGlmZiA9IHVwZGF0ZV9oaWRkZW5fc3NpZChwdHhCZWFjb25fcGFybS0+SUVzK19CRUFDT05fSUVfT0ZGU0VUXywKIAkJCQkgICAgICBwdHhCZWFjb25fcGFybS0+SUVMZW5ndGgtX0JFQUNPTl9JRV9PRkZTRVRfLAogCQkJCSAgICAgIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCmluZGV4IGRmNDYzYTI5Li5lYzBhOGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYwpAQCAtMjgxLDkgKzI4MSw5IEBACiAJcHdycHJpdi0+cHNfcHJvY2Vzc2luZyA9IGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBwd3Jfc3RhdGVfY2hlY2tfaGFuZGxlcih2b2lkICpGdW5jdGlvbkNvbnRleHQpCitzdGF0aWMgdm9pZCBwd3Jfc3RhdGVfY2hlY2tfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWRhdGE7CiAJcnR3X3BzX2NtZChwYWRhcHRlcik7CiB9CiAKQEAgLTU0NCw3ICs1NDQsOSBAQAogCiAJcHdyY3RybHByaXYtPmJ0Y29leF9yZm9uID0gZmFsc2U7CiAKLQlfaW5pdF90aW1lcigmKHB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgcHdyX3N0YXRlX2NoZWNrX2hhbmRsZXIsICh1OCAqKXBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcHdyY3RybHByaXYtPnB3cl9zdGF0ZV9jaGVja190aW1lciwKKwkJICAgIHB3cl9zdGF0ZV9jaGVja19oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwogfQogCiBpbmxpbmUgdm9pZCBydHdfc2V0X2lwc19kZW55KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIG1zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwppbmRleCBiZDc5ZTllLi5jZGE3MjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgIDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAKIH07CiAKLXZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbChSVFdfVElNRVJfSERMX0FSR1MpOwordm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIHZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpCiB7CkBAIC05OCw3ICs5OCw5IEBACiAKIAlyZXMgPSBydHdfaGFsX2luaXRfcmVjdl9wcml2KHBhZGFwdGVyKTsKIAotCV9pbml0X3RpbWVyKCZwcmVjdnByaXYtPnNpZ25hbF9zdGF0X3RpbWVyLCBwYWRhcHRlci0+cG5ldGRldiwgUlRXX1RJTUVSX0hETF9OQU1FKHNpZ25hbF9zdGF0KSwgcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwcmVjdnByaXYtPnNpZ25hbF9zdGF0X3RpbWVyLAorCQkgICAgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbCwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKIAogCXByZWN2cHJpdi0+c2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWwgPSAxMDAwOyAvKiBtcyAqLwogCkBAIC0xOTI3LDcgKzE5MjksOCBAQAogCiAJLyogcmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXIocGFkYXB0ZXIsIHByZW9yZGVyX2N0cmwsIHRydWUpOyAqLwogCWlmIChyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihwYWRhcHRlciwgcHJlb3JkZXJfY3RybCwgZmFsc2UpKSB7Ci0JCV9zZXRfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwgUkVPUkRFUl9XQUlUX1RJTUUpOworCQltb2RfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUkVPUkRFUl9XQUlUX1RJTUUpKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CkBAIC0xOTQ1LDkgKzE5NDgsOSBAQAogCXJldHVybiBfRkFJTDsKIH0KIAotdm9pZCBydHdfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlcih2b2lkICpwY29udGV4dCkKK3ZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCA9IHBjb250ZXh0OworCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCA9IChzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKilkYXRhOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZW9yZGVyX2N0cmwtPnBhZGFwdGVyOwogCXN0cnVjdCBfX3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7CiAKQEAgLTE5NTcsNyArMTk2MCw4IEBACiAJc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwogCiAJaWYgKHJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyKHBhZGFwdGVyLCBwcmVvcmRlcl9jdHJsLCB0cnVlKSA9PSB0cnVlKQotCQlfc2V0X3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsIFJFT1JERVJfV0FJVF9USU1FKTsKKwkJbW9kX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFT1JERVJfV0FJVF9USU1FKSk7CiAKIAlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKIH0KQEAgLTIxMzAsOSArMjEzNCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKFJUV19USU1FUl9IRExfQVJHUykKK3ZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCByZWN2X3ByaXYgKnJlY3Zwcml2ID0gJmFkYXB0ZXItPnJlY3Zwcml2OwogCiAJdTMyIHRtcF9zLCB0bXBfcTsKQEAgLTIxNTksNyArMjE2Myw3IEBACiAKIAkJLyogdXBkYXRlIHZhbHVlIG9mIHNpZ25hbF9zdHJlbmd0aCwgcnNzaSwgc2lnbmFsX3F1YWwgKi8KIAkJaWYgKGNoZWNrX2Z3c3RhdGUoJmFkYXB0ZXItPm1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSA9PSBmYWxzZSkgewotCQkJdG1wX3MgPSAoYXZnX3NpZ25hbF9zdHJlbmd0aCsoX2FscGhhLTEpKnJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGgpOworCQkJdG1wX3MgPSBhdmdfc2lnbmFsX3N0cmVuZ3RoKyhfYWxwaGEtMSkqcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aDsKIAkJCWlmICh0bXBfcyAlIF9hbHBoYSkKIAkJCQl0bXBfcyA9IHRtcF9zL19hbHBoYSArIDE7CiAJCQllbHNlCkBAIC0yMTY3LDcgKzIxNzEsNyBAQAogCQkJaWYgKHRtcF9zID4gMTAwKQogCQkJCXRtcF9zID0gMTAwOwogCi0JCQl0bXBfcSA9IChhdmdfc2lnbmFsX3F1YWwrKF9hbHBoYS0xKSpyZWN2cHJpdi0+c2lnbmFsX3F1YWwpOworCQkJdG1wX3EgPSBhdmdfc2lnbmFsX3F1YWwrKF9hbHBoYS0xKSpyZWN2cHJpdi0+c2lnbmFsX3F1YWw7CiAJCQlpZiAodG1wX3EgJSBfYWxwaGEpCiAJCQkJdG1wX3EgPSB0bXBfcS9fYWxwaGEgKyAxOwogCQkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCmluZGV4IGJkOGQ2MGEuLmQ4NzBhNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKQEAgLTg1NCw3ICs4NTQsNyBAQAogCXU4IGFkZDFiWzRdOwogCXU4IGFkZDFiZjdbNF07CiAJdTggcm90bFs0XTsKLQl1OCBzd2FwX2hhbGZzWzRdOworCXU4IHN3YXBfaGFsdmVzWzRdOwogCXU4IGFuZGY3WzRdOwogCXU4IHJvdHJbNF07CiAJdTggdGVtcFs0XTsKQEAgLTg2NiwxMCArODY2LDEwIEBACiAJCQlhZGQxYltpXSA9IDB4MDA7CiAJfQogCi0Jc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbHZlcyAqLwotCXN3YXBfaGFsZnNbMV0gPSBpblszXTsKLQlzd2FwX2hhbGZzWzJdID0gaW5bMF07Ci0Jc3dhcF9oYWxmc1szXSA9IGluWzFdOworCXN3YXBfaGFsdmVzWzBdID0gaW5bMl07ICAgIC8qIFN3YXAgaGFsdmVzICovCisJc3dhcF9oYWx2ZXNbMV0gPSBpblszXTsKKwlzd2FwX2hhbHZlc1syXSA9IGluWzBdOworCXN3YXBfaGFsdmVzWzNdID0gaW5bMV07CiAKIAlyb3RsWzBdID0gaW5bM107CS8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLwogCXJvdGxbMV0gPSBpblswXTsKQEAgLTkwMCw3ICs5MDAsNyBAQAogCXJvdHJbM10gPSB0ZW1wWzBdOwogCiAJeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOwotCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLCB0ZW1wYik7CisJeG9yXzMyKHN3YXBfaGFsdmVzLCByb3RsLCB0ZW1wYik7CiAJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwogfQogCkBAIC0xMDc5LDcgKzEwNzksNyBAQAogCXVpbnQJZnJ0eXBlICA9IEdldEZyYW1lVHlwZShwZnJhbWUpOwogCXVpbnQJZnJzdWJ0eXBlICA9IEdldEZyYW1lU3ViVHlwZShwZnJhbWUpOwogCi0JZnJzdWJ0eXBlID0gZnJzdWJ0eXBlPj40OworCWZyc3VidHlwZSA+Pj0gNDsKIAogCW1lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwogCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIxLCAwLCAxNik7CkBAIC0xMTIyLDcgKzExMjIsNyBAQAogCW51bV9ibG9ja3MgPSBwbGVuIC8gMTY7CiAKIAkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KLQlwYXlsb2FkX2luZGV4ID0gKGhkcmxlbiArIDgpOworCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwogCiAJLyogQ2FsY3VsYXRlIE1JQyAqLwogCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKQEAgLTEyNzcsNyArMTI3Nyw3IEBACiAvKgl1aW50CW9mZnNldCA9IDA7ICovCiAJdWludAlmcnR5cGUgID0gR2V0RnJhbWVUeXBlKHBmcmFtZSk7CiAJdWludAlmcnN1YnR5cGUgID0gR2V0RnJhbWVTdWJUeXBlKHBmcmFtZSk7Ci0JZnJzdWJ0eXBlID0gZnJzdWJ0eXBlPj40OworCWZyc3VidHlwZSA+Pj0gNDsKIAogCW1lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwogCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIxLCAwLCAxNik7CkBAIC0xMzY2LDcgKzEzNjYsNyBAQAogCW51bV9ibG9ja3MgPSAocGxlbi04KSAvIDE2OwogCiAJLyogRmluZCBzdGFydCBvZiBwYXlsb2FkICovCi0JcGF5bG9hZF9pbmRleCA9IChoZHJsZW4gKyA4KTsKKwlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKIAogCS8qIENhbGN1bGF0ZSBNSUMgKi8KIAlhZXMxMjhrMTI4ZChrZXksIG1pY19pdiwgYWVzX291dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zcmVzZXQuYwppbmRleCBjZDRlMzQ0Li5lNzI1YTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3Jlc2V0LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogCWlmIChXSUZJX1NUQVRVU19TVUNDRVNTICE9IHBzcnRwcml2LT5XaWZpX0Vycm9yX1N0YXR1cykgewogCQlEQkdfODhFKCI9PT4lcyBlcnJvcl9zdGF0dXMoMHgleClcbiIsIF9fZnVuY19fLCBwc3J0cHJpdi0+V2lmaV9FcnJvcl9TdGF0dXMpOwotCQlzdGF0dXMgPSAocHNydHByaXYtPldpZmlfRXJyb3JfU3RhdHVzICYgKH4oVVNCX1JFQURfUE9SVF9GQUlMfFVTQl9XUklURV9QT1JUX0ZBSUwpKSk7CisJCXN0YXR1cyA9IHBzcnRwcml2LT5XaWZpX0Vycm9yX1N0YXR1cyAmICh+KFVTQl9SRUFEX1BPUlRfRkFJTHxVU0JfV1JJVEVfUE9SVF9GQUlMKSk7CiAJfQogCURCR184OEUoIj09PiAlcyB3aWZpX3N0YXR1cygweCV4KVxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCmluZGV4IGEzZmZjNjkuLjJiMzcxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYwpAQCAtODgsMzUgKzg4LDI1IEBACiAKIHVuc2lnbmVkIGNoYXIgbmV0d29ya3R5cGVfdG9fcmFpZCh1bnNpZ25lZCBjaGFyIG5ldHdvcmtfdHlwZSkKIHsKLQl1bnNpZ25lZCBjaGFyIHJhaWQ7Ci0KIAlzd2l0Y2ggKG5ldHdvcmtfdHlwZSkgewogCWNhc2UgV0lSRUxFU1NfMTFCOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfQjsKLQkJYnJlYWs7CisJCXJldHVybiBSQVRSX0lOWF9XSVJFTEVTU19COwogCWNhc2UgV0lSRUxFU1NfMTFBOgogCWNhc2UgV0lSRUxFU1NfMTFHOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfRzsKLQkJYnJlYWs7CisJCXJldHVybiBSQVRSX0lOWF9XSVJFTEVTU19HOwogCWNhc2UgV0lSRUxFU1NfMTFCRzoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0dCOwotCQlicmVhazsKKwkJcmV0dXJuIFJBVFJfSU5YX1dJUkVMRVNTX0dCOwogCWNhc2UgV0lSRUxFU1NfMTFfMjROOgogCWNhc2UgV0lSRUxFU1NfMTFfNU46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19OOwotCQlicmVhazsKKwkJcmV0dXJuIFJBVFJfSU5YX1dJUkVMRVNTX047CiAJY2FzZSBXSVJFTEVTU18xMUFfNU46CiAJY2FzZSBXSVJFTEVTU18xMUdfMjROOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfTkc7Ci0JCWJyZWFrOworCQlyZXR1cm4gIFJBVFJfSU5YX1dJUkVMRVNTX05HOwogCWNhc2UgV0lSRUxFU1NfMTFCR18yNE46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19OR0I7Ci0JCWJyZWFrOworCQlyZXR1cm4gUkFUUl9JTlhfV0lSRUxFU1NfTkdCOwogCWRlZmF1bHQ6Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19HQjsKLQkJYnJlYWs7CisJCXJldHVybiBSQVRSX0lOWF9XSVJFTEVTU19HQjsKIAl9Ci0JcmV0dXJuIHJhaWQ7CiB9CiAKIHU4IGp1ZGdlX25ldHdvcmtfdHlwZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKQpAQCAtMTQ2LDQ3ICsxMzYsMzQgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgcmF0ZXRibF92YWxfMndpZmlyYXRlKHVuc2lnbmVkIGNoYXIgcmF0ZSkKIHsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7Ci0KIAlzd2l0Y2ggKHJhdGUgJiAweDdmKSB7CiAJY2FzZSAwOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CiAJY2FzZSAxOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CiAJY2FzZSAyOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CiAJY2FzZSAzOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKLQkJYnJlYWs7CisJCXJldHVybiBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKIAljYXNlIDQ6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwogCWNhc2UgNToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV85TUI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSUVFRTgwMjExX09GRE1fUkFURV85TUI7CiAJY2FzZSA2OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSUVFRTgwMjExX09GRE1fUkFURV8xMk1COwogCWNhc2UgNzoKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV8xOE1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKIAljYXNlIDg6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKLQkJYnJlYWs7CisJCXJldHVybiBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CiAJY2FzZSA5OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSUVFRTgwMjExX09GRE1fUkFURV8zNk1COwogCWNhc2UgMTA6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKLQkJYnJlYWs7CisJCXJldHVybiBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CiAJY2FzZSAxMToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV81NE1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIHZhbDsKIH0KIAogc3RhdGljIGludCBpc19iYXNpY3JhdGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyIHJhdGUpCkBAIC00ODUsMTQgKzQ2MiwxNCBAQAogCWZvciAoaiA9IDU7IGogPj0gMDsgai0tKSB7CiAJCXN3aXRjaCAoaikgewogCQljYXNlIDA6Ci0JCQl2YWwgPSAoY3RybCB8IChtYWNbMF0gPDwgMTYpIHwgKG1hY1sxXSA8PCAyNCkpOworCQkJdmFsID0gY3RybCB8IChtYWNbMF0gPDwgMTYpIHwgKG1hY1sxXSA8PCAyNCk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJdmFsID0gKG1hY1syXSB8IChtYWNbM10gPDwgOCkgfCAobWFjWzRdIDw8IDE2KSB8IChtYWNbNV0gPDwgMjQpKTsKKwkJCXZhbCA9IG1hY1syXSB8IChtYWNbM10gPDwgOCkgfCAobWFjWzRdIDw8IDE2KSB8IChtYWNbNV0gPDwgMjQpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlpID0gKGogLSAyKSA8PCAyOwotCQkJdmFsID0gKGtleVtpXSB8IChrZXlbaSsxXSA8PCA4KSB8IChrZXlbaSsyXSA8PCAxNikgfCAoa2V5W2krM10gPDwgMjQpKTsKKwkJCXZhbCA9IGtleVtpXSB8IChrZXlbaSsxXSA8PCA4KSB8IChrZXlbaSsyXSA8PCAxNikgfCAoa2V5W2krM10gPDwgMjQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTg3LDcgKzU2NCw3IEBACiAJCS8qIEFJRlMgPSBBSUZTTiAqIHNsb3QgdGltZSArIFNJRlMgLSByMnQgcGh5IGRlbGF5ICovCiAJCUFJRlMgPSAocG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uQUNJX0FJRlNOICYgMHgwZikgKiBwbWxtZWluZm8tPnNsb3RUaW1lICsgYVNpZnNUaW1lOwogCi0JCUVDV01pbiA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4MGYpOworCQlFQ1dNaW4gPSBwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4MGY7CiAJCUVDV01heCA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4ZjApID4+IDQ7CiAJCVRYT1AgPSBsZTE2X3RvX2NwdShwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5UWE9QX2xpbWl0KTsKIApAQCAtNjU5LDggKzYzNiw2IEBACiAJCXB4bWl0cHJpdi0+d21tX3BhcmFfc2VxW2ldID0gaW54W2ldOwogCQlEQkdfODhFKCJ3bW1fcGFyYV9zZXEoJWQpOiAlZFxuIiwgaSwgcHhtaXRwcml2LT53bW1fcGFyYV9zZXFbaV0pOwogCX0KLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgYndtb2RlX3VwZGF0ZV9jaGVjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBuZGlzXzgwMl8xMV92YXJfaWUgKnBJRSkKQEAgLTc2NiwxNCArNzQxLDE0IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBtb2RpZnkgZnJvbSAgZncgYnkgVGhvbWFzIDIwMTAvMTEvMTcgKi8KIAkJCWlmICgocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MykgPiAocElFLT5kYXRhW2ldICYgMHgzKSkKLQkJCQltYXhfQU1QRFVfbGVuID0gKHBJRS0+ZGF0YVtpXSAmIDB4Myk7CisJCQkJbWF4X0FNUERVX2xlbiA9IHBJRS0+ZGF0YVtpXSAmIDB4MzsKIAkJCWVsc2UKLQkJCQltYXhfQU1QRFVfbGVuID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDMpOworCQkJCW1heF9BTVBEVV9sZW4gPSBwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhICYgMHgzOwogCiAJCQlpZiAoKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+IChwSUUtPmRhdGFbaV0gJiAweDFjKSkKLQkJCQltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKTsKKwkJCQltaW5fTVBEVV9zcGFjaW5nID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MWM7CiAJCQllbHNlCi0JCQkJbWluX01QRFVfc3BhY2luZyA9IChwSUUtPmRhdGFbaV0gJiAweDFjKTsKKwkJCQltaW5fTVBEVV9zcGFjaW5nID0gcElFLT5kYXRhW2ldICYgMHgxYzsKIAogCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSA9IG1heF9BTVBEVV9sZW4gfCBtaW5fTVBEVV9zcGFjaW5nOwogCQl9CkBAIC03ODgsNyArNzYzLDYgQEAKIAkJZWxzZQogCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbaV0gJj0gTUNTX3JhdGVfMlJbaV07CiAJfQotCXJldHVybjsKIH0KIAogdm9pZCBIVF9pbmZvX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgbmRpc184MDJfMTFfdmFyX2llICpwSUUpCkBAIC04MDksNyArNzgzLDYgQEAKIAogCXBtbG1laW5mby0+SFRfaW5mb19lbmFibGUgPSAxOwogCW1lbWNweSgmKHBtbG1laW5mby0+SFRfaW5mbyksIHBJRS0+ZGF0YSwgcElFLT5MZW5ndGgpOwotCXJldHVybjsKIH0KIAogdm9pZCBIVE9uQXNzb2NSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMTIyMSw0OCArMTE5NCwzNiBAQAogCiBzdGF0aWMgaW50IHdpZmlyYXRlMl9yYXRldGJsX2lueCh1bnNpZ25lZCBjaGFyIHJhdGUpCiB7Ci0JaW50CWlueCA9IDA7CiAJcmF0ZSA9IHJhdGUgJiAweDdmOwogCiAJc3dpdGNoIChyYXRlKSB7CiAJY2FzZSA1NCoyOgotCQlpbnggPSAxMTsKLQkJYnJlYWs7CisJCXJldHVybiAxMTsKIAljYXNlIDQ4KjI6Ci0JCWlueCA9IDEwOwotCQlicmVhazsKKwkJcmV0dXJuIDEwOwogCWNhc2UgMzYqMjoKLQkJaW54ID0gOTsKLQkJYnJlYWs7CisJCXJldHVybiA5OwogCWNhc2UgMjQqMjoKLQkJaW54ID0gODsKLQkJYnJlYWs7CisJCXJldHVybiA4OwogCWNhc2UgMTgqMjoKLQkJaW54ID0gNzsKLQkJYnJlYWs7CisJCXJldHVybiA3OwogCWNhc2UgMTIqMjoKLQkJaW54ID0gNjsKLQkJYnJlYWs7CisJCXJldHVybiA2OwogCWNhc2UgOSoyOgotCQlpbnggPSA1OwotCQlicmVhazsKKwkJcmV0dXJuIDU7CiAJY2FzZSA2KjI6Ci0JCWlueCA9IDQ7Ci0JCWJyZWFrOworCQlyZXR1cm4gNDsKIAljYXNlIDExKjI6Ci0JCWlueCA9IDM7Ci0JCWJyZWFrOworCQlyZXR1cm4gMzsKIAljYXNlIDExOgotCQlpbnggPSAyOwotCQlicmVhazsKKwkJcmV0dXJuIDI7CiAJY2FzZSAyKjI6Ci0JCWlueCA9IDE7Ci0JCWJyZWFrOworCQlyZXR1cm4gMTsKIAljYXNlIDEqMjoKLQkJaW54ID0gMDsKLQkJYnJlYWs7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gaW54OwogfQogCiB1bnNpZ25lZCBpbnQgdXBkYXRlX2Jhc2ljX3JhdGUodW5zaWduZWQgY2hhciAqcHRuLCB1bnNpZ25lZCBpbnQgcHRuX3N6KQpAQCAtMTI5NSw3ICsxMjU2LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQltYXNrID0gKChwSFRfY2Fwcy0+dS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVswXSA8PCAxMikgfCAocEhUX2NhcHMtPnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbMV0gPDwgMjApKTsKKwltYXNrID0gKHBIVF9jYXBzLT51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlWzBdIDw8IDEyKSB8IChwSFRfY2Fwcy0+dS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVsxXSA8PCAyMCk7CiAKIAlyZXR1cm4gbWFzazsKIH0KQEAgLTEzMDksNyArMTI3MCw3IEBACiAJaWYgKCEocG1sbWVpbmZvLT5IVF9lbmFibGUpKQogCQlyZXR1cm4gX0ZBSUw7CiAKLQlpZiAoKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX1JBTElOSykpCisJaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX1JBTElOSykKIAkJcmV0dXJuIF9GQUlMOwogCiAJYml0X29mZnNldCA9IChwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmIEhUX0NIQU5ORUxfV0lEVEhfNDApID8gNiA6IDU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCmluZGV4IDdhNzFkZjEuLmZkYTE2OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCkBAIC0xNjM0LDIzICsxNjM0LDE1IEBACiAKIAlweG1pdHByaXYtPmh3eG1pdF9lbnRyeSA9IEhXWE1JVF9FTlRSWTsKIAotCXB4bWl0cHJpdi0+aHd4bWl0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBod194bWl0KSAqIHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5LCBHRlBfS0VSTkVMKTsKKwlweG1pdHByaXYtPmh3eG1pdHMgPSBrY2FsbG9jKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5LAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBod194bWl0KSwgR0ZQX0tFUk5FTCk7CiAKIAlod3htaXRzID0gcHhtaXRwcml2LT5od3htaXRzOwogCi0JaWYgKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ID09IDUpIHsKLQkJaHd4bWl0c1swXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+Ym1fcGVuZGluZzsKLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dm9fcGVuZGluZzsKLQkJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dmlfcGVuZGluZzsKLQkJaHd4bWl0c1szXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmtfcGVuZGluZzsKLQkJaHd4bWl0c1s0XSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKLQl9IGVsc2UgaWYgKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ID09IDQpIHsKLQkJaHd4bWl0c1swXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dm9fcGVuZGluZzsKLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dmlfcGVuZGluZzsKLQkJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKLQkJaHd4bWl0c1szXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmtfcGVuZGluZzsKLQl9IGVsc2UgewotCX0KKwlod3htaXRzWzBdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT52b19wZW5kaW5nOworCWh3eG1pdHNbMV0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPnZpX3BlbmRpbmc7CisJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKKwlod3htaXRzWzNdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT5ia19wZW5kaW5nOwogfQogCiB2b2lkIHJ0d19mcmVlX2h3eG1pdHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbDgxODhFUmF0ZUFkYXB0aXZlLmMKaW5kZXggM2M2NTFkNS4uMDgyZjBjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWw4MTg4RVJhdGVBZGFwdGl2ZS5jCkBAIC0xMTUsMTcgKzExNSwyMSBAQAogCX0KIAlwUmFJbmZvLT5ScHRUaW1lID0gRHluYW1pY1R4UlBUVGltaW5nW2lkeF07CiAKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsICgicFJhSW5mby0+UnB0VGltZSA9IDB4JXhcbiIsIHBSYUluZm8tPlJwdFRpbWUpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsCisJCQkoInBSYUluZm8tPlJwdFRpbWUgPSAweCV4XG4iLCBwUmFJbmZvLT5ScHRUaW1lKSk7CiB9CiAKLXN0YXRpYyBpbnQgb2RtX1JhdGVEb3duXzgxODhFKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0sIHN0cnVjdCBvZG1fcmFfaW5mbyAqcFJhSW5mbykKK3N0YXRpYyBpbnQgb2RtX1JhdGVEb3duXzgxODhFKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0sCisJCQkJc3RydWN0IG9kbV9yYV9pbmZvICpwUmFJbmZvKQogewogCXU4IFJhdGVJRCwgTG93ZXN0UmF0ZSwgSGlnaGVzdFJhdGU7CiAJdTggaTsKIAotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsICgiPT09PT0+b2RtX1JhdGVEb3duXzgxODhFKClcbiIpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLAorCQkJT0RNX0RCR19UUkFDRSwgKCI9PT09PT5vZG1fUmF0ZURvd25fODE4OEUoKVxuIikpOwogCWlmIChOVUxMID09IHBSYUluZm8pIHsKLQkJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELCAoIm9kbV9SYXRlRG93bl84MTg4RSgpOiBwUmFJbmZvIGlzIE5VTExcbiIpKTsKKwkJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELAorCQkJCSgib2RtX1JhdGVEb3duXzgxODhFKCk6IHBSYUluZm8gaXMgTlVMTFxuIikpOwogCQlyZXR1cm4gLTE7CiAJfQogCVJhdGVJRCA9IHBSYUluZm8tPlByZVJhdGU7CkBAIC0xNjcsMTAgKzE3MSwxNSBAQAogCiAJcFJhSW5mby0+RGVjaXNpb25SYXRlID0gUmF0ZUlEOwogCW9kbV9TZXRUeFJQVFRpbWluZ184MTg4RShkbV9vZG0sIHBSYUluZm8sIDIpOwotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwgKCJSYXRlIGRvd24sIFJQVCBUaW1pbmcgZGVmYXVsdFxuIikpOwotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsICgiUkFXYWl0aW5nQ291bnRlciAlZCwgUkFQZW5kaW5nQ291bnRlciAlZCIsIHBSYUluZm8tPlJBV2FpdGluZ0NvdW50ZXIsIHBSYUluZm8tPlJBUGVuZGluZ0NvdW50ZXIpKTsKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsICgiUmF0ZSBkb3duIHRvIFJhdGVJRCAlZCBSYXRlU0dJICVkXG4iLCBSYXRlSUQsIHBSYUluZm8tPlJhdGVTR0kpKTsKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLCAoIjw9PT09PSBvZG1fUmF0ZURvd25fODE4OEUoKVxuIikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsCisJCQlPRE1fREJHX0xPVUQsICgiUmF0ZSBkb3duLCBSUFQgVGltaW5nIGRlZmF1bHRcbiIpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAorCQkJKCJSQVdhaXRpbmdDb3VudGVyICVkLCBSQVBlbmRpbmdDb3VudGVyICVkIiwKKwkJCSBwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyLCBwUmFJbmZvLT5SQVBlbmRpbmdDb3VudGVyKSk7CisJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELAorCQkJKCJSYXRlIGRvd24gdG8gUmF0ZUlEICVkIFJhdGVTR0kgJWRcbiIsIFJhdGVJRCwgcFJhSW5mby0+UmF0ZVNHSSkpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCisJCQkoIjw9PT09PSBvZG1fUmF0ZURvd25fODE4OEUoKVxuIikpOwogCXJldHVybiAwOwogfQogCkBAIC0xODIsOSArMTkxLDExIEBACiAJdTggUmF0ZUlELCBIaWdoZXN0UmF0ZTsKIAl1OCBpOwogCi0JT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19UUkFDRSwgKCI9PT09PT5vZG1fUmF0ZVVwXzgxODhFKClcbiIpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLAorCQkJT0RNX0RCR19UUkFDRSwgKCI9PT09PT5vZG1fUmF0ZVVwXzgxODhFKClcbiIpKTsKIAlpZiAoTlVMTCA9PSBwUmFJbmZvKSB7Ci0JCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwgKCJvZG1fUmF0ZVVwXzgxODhFKCk6IHBSYUluZm8gaXMgTlVMTFxuIikpOworCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsCisJCQkJKCJvZG1fUmF0ZVVwXzgxODhFKCk6IHBSYUluZm8gaXMgTlVMTFxuIikpOwogCQlyZXR1cm4gLTE7CiAJfQogCVJhdGVJRCA9IHBSYUluZm8tPlByZVJhdGU7CkBAIC0yMDAsNyArMjExLDggQEAKIAkJZ290byBSYXRlVXBmaW5pc2g7CiAJfQogCW9kbV9TZXRUeFJQVFRpbWluZ184MTg4RShkbV9vZG0sIHBSYUluZm8sIDApOwotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwgKCJvZG1fUmF0ZVVwXzgxODhFKCk6RGVjcmVhc2UgUlBUIFRpbWluZ1xuIikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwKKwkJCSgib2RtX1JhdGVVcF84MTg4RSgpOkRlY3JlYXNlIFJQVCBUaW1pbmdcbiIpKTsKIAogCWlmIChSYXRlSUQgPCBIaWdoZXN0UmF0ZSkgewogCQlmb3IgKGkgPSBSYXRlSUQrMTsgaSA8PSBIaWdoZXN0UmF0ZTsgaSsrKSB7CkBAIC0yMTgsMTUgKzIzMCwyMCBAQAogCQlSYXRlSUQgPSBIaWdoZXN0UmF0ZTsKIAl9CiBSYXRlVXBmaW5pc2g6Ci0JaWYgKHBSYUluZm8tPlJBV2FpdGluZ0NvdW50ZXIgPT0gKDQrUGVuZGluZ0ZvclJhdGVVcEZhaWxbcFJhSW5mby0+UkFQZW5kaW5nQ291bnRlcl0pKQorCWlmIChwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyID09CisJCSg0K1BlbmRpbmdGb3JSYXRlVXBGYWlsW3BSYUluZm8tPlJBUGVuZGluZ0NvdW50ZXJdKSkKIAkJcFJhSW5mby0+UkFXYWl0aW5nQ291bnRlciA9IDA7CiAJZWxzZQogCQlwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyKys7CiAKIAlwUmFJbmZvLT5EZWNpc2lvblJhdGUgPSBSYXRlSUQ7Ci0JT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELCAoIlJhdGUgdXAgdG8gUmF0ZUlEICVkXG4iLCBSYXRlSUQpKTsKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLCAoIlJBV2FpdGluZ0NvdW50ZXIgJWQsIFJBUGVuZGluZ0NvdW50ZXIgJWQiLCBwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyLCBwUmFJbmZvLT5SQVBlbmRpbmdDb3VudGVyKSk7Ci0JT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19UUkFDRSwgKCI8PT09PT0gb2RtX1JhdGVVcF84MTg4RSgpXG4iKSk7CisJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELAorCQkJKCJSYXRlIHVwIHRvIFJhdGVJRCAlZFxuIiwgUmF0ZUlEKSk7CisJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19UUkFDRSwKKwkJCSgiUkFXYWl0aW5nQ291bnRlciAlZCwgUkFQZW5kaW5nQ291bnRlciAlZCIsCisJCQkgcFJhSW5mby0+UkFXYWl0aW5nQ291bnRlciwgcFJhSW5mby0+UkFQZW5kaW5nQ291bnRlcikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsCisJCQlPRE1fREJHX1RSQUNFLCAoIjw9PT09PSBvZG1fUmF0ZVVwXzgxODhFKClcbiIpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQzLDExICsyNjAsMTIgQEAKIAkJc3RydWN0IG9kbV9yYV9pbmZvICpwUmFJbmZvCiAJKQogewotCXU4IFJhdGVJRCA9IDAsIFJ0eVB0SUQgPSAwLCBQZW5hbHR5SUQxID0gMCwgUGVuYWx0eUlEMiA9IDA7CisJdTggUmF0ZUlEID0gMCwgUnR5UHRJRCA9IDAsIFBlbmFsdHlJRDEgPSAwLCBQZW5hbHR5SUQyID0gMCwgaSA9IDA7CiAJLyogdTMyIHBvb2xfcmV0cnk7ICovCiAJc3RhdGljIHU4IER5bmFtaWNUeFJQVFRpbWluZ0NvdW50ZXI7CiAKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLCAoIj09PT09Pm9kbV9SYXRlRGVjaXNpb25fODE4OEUoKVxuIikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCisJCQkoIj09PT09Pm9kbV9SYXRlRGVjaXNpb25fODE4OEUoKVxuIikpOwogCiAJaWYgKHBSYUluZm8tPkFjdGl2ZSAmJiAocFJhSW5mby0+VE9UQUwgPiAwKSkgeyAvKiAgU1RBIHVzZWQgYW5kIGRhdGEgcGFja2V0IGV4aXRzICovCiAJCWlmICgocFJhSW5mby0+UnNzaVN0YVJBIDwgKHBSYUluZm8tPlByZVJzc2lTdGFSQSAtIDMpKSB8fApAQCAtMjY4LDE0ICsyODYsMTQgQEAKIAogCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAogCQkJICAgICAoIiBOc2NEb3duIGluaXQgaXMgJWRcbiIsIHBSYUluZm8tPk5zY0Rvd24pKTsKLQkJcFJhSW5mby0+TnNjRG93biArPSBwUmFJbmZvLT5SVFlbMF0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDFdWzBdOwotCQlwUmFJbmZvLT5Oc2NEb3duICs9IHBSYUluZm8tPlJUWVsxXSAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bMV07Ci0JCXBSYUluZm8tPk5zY0Rvd24gKz0gcFJhSW5mby0+UlRZWzJdICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQxXVsyXTsKLQkJcFJhSW5mby0+TnNjRG93biArPSBwUmFJbmZvLT5SVFlbM10gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDFdWzNdOwotCQlwUmFJbmZvLT5Oc2NEb3duICs9IHBSYUluZm8tPlJUWVs0XSAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bNF07CisKKwkJZm9yIChpID0gMCA7IGkgPD0gNCA7IGkrKykKKwkJCXBSYUluZm8tPk5zY0Rvd24gKz0gcFJhSW5mby0+UlRZW2ldICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQxXVtpXTsKKwogCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAotCQkJICAgICAoIiBOc2NEb3duIGlzICVkLCB0b3RhbCpwZW5hbHR5WzVdIGlzICVkXG4iLAotCQkJICAgICBwUmFJbmZvLT5Oc2NEb3duLCAocFJhSW5mby0+VE9UQUwgKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDFdWzVdKSkpOworCQkJICAgICAoIiBOc2NEb3duIGlzICVkLCB0b3RhbCpwZW5hbHR5WzVdIGlzICVkXG4iLCBwUmFJbmZvLT5Oc2NEb3duLAorCQkJICAgICAgKHBSYUluZm8tPlRPVEFMICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQxXVs1XSkpKTsKKwogCQlpZiAocFJhSW5mby0+TnNjRG93biA+IChwUmFJbmZvLT5UT1RBTCAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bNV0pKQogCQkJcFJhSW5mby0+TnNjRG93biAtPSBwUmFJbmZvLT5UT1RBTCAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bNV07CiAJCWVsc2UKQEAgLTI4NSwxNCArMzAzLDE0IEBACiAJCVBlbmFsdHlJRDIgPSBSRVRSWV9QRU5BTFRZX1VQX0lEWFtSYXRlSURdOwogCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAogCQkJICAgICAoIiBOc2NVcCBpbml0IGlzICVkXG4iLCBwUmFJbmZvLT5Oc2NVcCkpOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbMF0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzBdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbMV0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzFdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbMl0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzJdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbM10gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzNdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbNF0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzRdOworCisJCWZvciAoaSA9IDAgOyBpIDw9IDQgOyBpKyspCisJCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbaV0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdW2ldOworCiAJCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCiAJCQkgICAgICgiTnNjVXAgaXMgJWQsIHRvdGFsKnVwWzVdIGlzICVkXG4iLAogCQkJICAgICBwUmFJbmZvLT5Oc2NVcCwgKHBSYUluZm8tPlRPVEFMICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQyXVs1XSkpKTsKKwogCQlpZiAocFJhSW5mby0+TnNjVXAgPiAocFJhSW5mby0+VE9UQUwgKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzVdKSkKIAkJCXBSYUluZm8tPk5zY1VwIC09IHBSYUluZm8tPlRPVEFMICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQyXVs1XTsKIAkJZWxzZQpAQCAtNDg3LDcgKzUwNSw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlqID0gaiA+PiAxOworCWogPj49IDE7CiAJdGVtcF9zdGFnZSA9IChwUmFJbmZvLT5QVFN0YWdlICsgMSkgPj4gMTsKIAlpZiAodGVtcF9zdGFnZSA+IGopCiAJCXN0YWdlX2lkID0gdGVtcF9zdGFnZS1qOwpAQCAtNTM4LDYgKzU1Niw3IEBACiAJc3RydWN0IG9kbV9yYV9pbmZvICpwUmFJbmZvID0gJmRtX29kbS0+UkFJbmZvW21hY2lkXTsKIAl1OCBXaXJlbGVzc01vZGUgPSAweEZGOyAvKiBpbnZhbGlkIHZhbHVlICovCiAJdTggbWF4X3JhdGVfaWR4ID0gMHgxMzsgLyogTUNTNyAqLworCiAJaWYgKGRtX29kbS0+cFdpcmVsZXNzTW9kZSAhPSBOVUxMKQogCQlXaXJlbGVzc01vZGUgPSAqKGRtX29kbS0+cFdpcmVsZXNzTW9kZSk7CiAKQEAgLTYxOCw3ICs2MzcsNyBAQAogCiAJaWYgKChOVUxMID09IGRtX29kbSkgfHwgKG1hY2lkID49IEFTU09DSUFURV9FTlRSWV9OVU0pKQogCQlyZXR1cm4gMDsKLQlEZWNpc2lvblJhdGUgPSAoZG1fb2RtLT5SQUluZm9bbWFjaWRdLkRlY2lzaW9uUmF0ZSk7CisJRGVjaXNpb25SYXRlID0gZG1fb2RtLT5SQUluZm9bbWFjaWRdLkRlY2lzaW9uUmF0ZTsKIAlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAogCQkoIiBtYWNpZCA9JWQgRGVjaXNpb25SYXRlID0gMHgleFxuIiwgbWFjaWQsIERlY2lzaW9uUmF0ZSkpOwogCXJldHVybiBEZWNpc2lvblJhdGU7CkBAIC02MzAsNyArNjQ5LDcgQEAKIAogCWlmICgoTlVMTCA9PSBkbV9vZG0pIHx8IChtYWNpZCA+PSBBU1NPQ0lBVEVfRU5UUllfTlVNKSkKIAkJcmV0dXJuIDA7Ci0JUFRTdGFnZSA9IChkbV9vZG0tPlJBSW5mb1ttYWNpZF0uUFRTdGFnZSk7CisJUFRTdGFnZSA9IGRtX29kbS0+UkFJbmZvW21hY2lkXS5QVFN0YWdlOwogCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCiAJCSAgICAgKCJtYWNpZCA9JWQgUFRTdGFnZSA9IDB4JXhcbiIsIG1hY2lkLCBQVFN0YWdlKSk7CiAJcmV0dXJuIFBUU3RhZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2JiX2NmZy5jCmluZGV4IDFlOTYzYmYuLjhlYjJiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2JiX2NmZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2JiX2NmZy5jCkBAIC01MTEsNjIgKzUxMSw3MSBAQAogc3RhdGljIHZvaWQgc3RvcmVfcHdyaW5kZXhfb2Zmc2V0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKQogewogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJIHU4IHB3ckdycENudCA9IGhhbF9kYXRhLT5wd3JHcm91cENudDsKIAogCWlmIChyZWdhZGRyID09IHJUeEFHQ19BX1JhdGUxOF8wNikKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMF0gPSBkYXRhOworCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcHdyR3JwQ250XVswXSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0FfUmF0ZTU0XzI0KQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVsxXSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzFdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQV9DQ0sxX01jczMyKQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs2XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzZdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEgJiYgYml0bWFzayA9PSAweGZmZmZmZjAwKQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs3XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzddID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQV9NY3MwM19NY3MwMCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMl0gPSBkYXRhOworCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcHdyR3JwQ250XVsyXSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0FfTWNzMDdfTWNzMDQpCi0JCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtoYWxfZGF0YS0+cHdyR3JvdXBDbnRdWzNdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bM10gPSBkYXRhOwogCWlmIChyZWdhZGRyID09IHJUeEFHQ19BX01jczExX01jczA4KQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs0XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzRdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQV9NY3MxNV9NY3MxMikgewotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs1XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzVdID0gZGF0YTsKIAkJaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMVIpCiAJCQloYWxfZGF0YS0+cHdyR3JvdXBDbnQrKzsKIAl9CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0JfUmF0ZTE4XzA2KQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs4XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzhdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9SYXRlNTRfMjQpCi0JCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtoYWxfZGF0YS0+cHdyR3JvdXBDbnRdWzldID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bOV0gPSBkYXRhOwogCWlmIChyZWdhZGRyID09IHJUeEFHQ19CX0NDSzFfNTVfTWNzMzIpCi0JCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtoYWxfZGF0YS0+cHdyR3JvdXBDbnRdWzE0XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzE0XSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIGJpdG1hc2sgPT0gMHgwMDAwMDBmZikKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTVdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTVdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MwM19NY3MwMCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTBdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTBdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MwN19NY3MwNCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTFdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTFdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MxMV9NY3MwOCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTJdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTJdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MxNV9NY3MxMikgewotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVsxM10gPSBkYXRhOworCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcHdyR3JwQ250XVsxM10gPSBkYXRhOwogCQlpZiAoaGFsX2RhdGEtPnJmX3R5cGUgIT0gUkZfMVQxUikKIAkJCWhhbF9kYXRhLT5wd3JHcm91cENudCsrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgcnRsX2FkZHJfZGVsYXkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgYWRkciwgdTMyIGJpdF9tYXNrLCB1MzIgZGF0YSkKK3N0YXRpYyB2b2lkIHJ0bF9hZGRyX2RlbGF5KHN0cnVjdCBhZGFwdGVyICphZGFwdCwKKwkJCXUzMiBhZGRyLCB1MzIgYml0X21hc2ssIHUzMiBkYXRhKQogewotCWlmIChhZGRyID09IDB4ZmUpIHsKKwlzd2l0Y2ggKGFkZHIpIHsKKwljYXNlIDB4ZmU6CiAJCW1zbGVlcCg1MCk7Ci0JfSBlbHNlIGlmIChhZGRyID09IDB4ZmQpIHsKKwkJYnJlYWs7CisJY2FzZSAweGZkOgogCQltZGVsYXkoNSk7Ci0JfSBlbHNlIGlmIChhZGRyID09IDB4ZmMpIHsKKwkJYnJlYWs7CisJY2FzZSAweGZjOgogCQltZGVsYXkoMSk7Ci0JfSBlbHNlIGlmIChhZGRyID09IDB4ZmIpIHsKKwkJYnJlYWs7CisJY2FzZSAweGZiOgogCQl1ZGVsYXkoNTApOwotCX0gZWxzZSBpZiAoYWRkciA9PSAweGZhKSB7CisJCWJyZWFrOworCWNhc2UgMHhmYToKIAkJdWRlbGF5KDUpOwotCX0gZWxzZSBpZiAoYWRkciA9PSAweGY5KSB7CisJCWJyZWFrOworCWNhc2UgMHhmOToKIAkJdWRlbGF5KDEpOwotCX0gZWxzZXsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJc3RvcmVfcHdyaW5kZXhfb2Zmc2V0KGFkYXB0LCBhZGRyLCBiaXRfbWFzaywgZGF0YSk7CiAJfQogfQpAQCAtNTkxLDg0ICs2MDAsOTAgQEAKIHN0YXRpYyB2b2lkIHJ0bDg4ZV9waHlfaW5pdF9iYl9yZl9yZWdpc3Rlcl9kZWZpbml0aW9uKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkJKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBiYl9yZWdfZGVmICAgICAgICAgICAgICAgKnJlZ1s0XTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOworCXJlZ1tSRl9QQVRIX0FdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0pOworCXJlZ1tSRl9QQVRIX0JdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0pOworCXJlZ1tSRl9QQVRIX0NdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10pOworCXJlZ1tSRl9QQVRIX0RdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfRF0pOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0NdLnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfQV0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CisJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CisJcmVnW1JGX1BBVEhfQ10tPnJmaW50ZnMgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1c7CisJcmVnW1JGX1BBVEhfRF0tPnJmaW50ZnMgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1c7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmbyA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZvID0gckZQR0EwX1hCX1JGSW50ZXJmYWNlT0U7CisJcmVnW1JGX1BBVEhfQV0tPnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfQ10tPnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfRF0tPnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmZSA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZlID0gckZQR0EwX1hCX1JGSW50ZXJmYWNlT0U7CisJcmVnW1JGX1BBVEhfQV0tPnJmaW50Zm8gPSByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRTsKKwlyZWdbUkZfUEFUSF9CXS0+cmZpbnRmbyA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcjsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyOworCXJlZ1tSRl9QQVRIX0FdLT5yZmludGZlID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7CisJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZmUgPSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hBQl9SRlBhcmFtZXRlcjsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0NdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWENEX1JGUGFyYW1ldGVyOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKKwlyZWdbUkZfUEFUSF9BXS0+cmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyOworCXJlZ1tSRl9QQVRIX0JdLT5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXI7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfRF0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7CisJcmVnW1JGX1BBVEhfQl0tPnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOworCXJlZ1tSRl9QQVRIX0NdLT5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKKwlyZWdbUkZfUEFUSF9EXS0+cmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQ0RfUkZQYXJhbWV0ZXI7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmSFNTSVBhcmExID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxOworCXJlZ1tSRl9QQVRIX0FdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOworCXJlZ1tSRl9QQVRIX0JdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOworCXJlZ1tSRl9QQVRIX0NdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOworCXJlZ1tSRl9QQVRIX0RdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMjsKKwlyZWdbUkZfUEFUSF9BXS0+cmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7CisJcmVnW1JGX1BBVEhfQl0tPnJmSFNTSVBhcmExID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2w7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKKwlyZWdbUkZfUEFUSF9BXS0+cmZIU1NJUGFyYTIgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjI7CisJcmVnW1JGX1BBVEhfQl0tPnJmSFNTSVBhcmEyID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEFBR0NDb3JlMTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZBR0NDb250cm9sMSA9IHJPRkRNMF9YQkFHQ0NvcmUxOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hDQUdDQ29yZTE7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWERBR0NDb3JlMTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sOworCXJlZ1tSRl9QQVRIX0JdLT5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7CisJcmVnW1JGX1BBVEhfQ10tPnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKKwlyZWdbUkZfUEFUSF9EXS0+cmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZBR0NDb250cm9sMiA9IHJPRkRNMF9YQkFHQ0NvcmUyOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hDQUdDQ29yZTI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWERBR0NDb3JlMjsKKwlyZWdbUkZfUEFUSF9BXS0+cmZBR0NDb250cm9sMSA9IHJPRkRNMF9YQUFHQ0NvcmUxOworCXJlZ1tSRl9QQVRIX0JdLT5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hCQUdDQ29yZTE7CisJcmVnW1JGX1BBVEhfQ10tPnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWENBR0NDb3JlMTsKKwlyZWdbUkZfUEFUSF9EXS0+cmZBR0NDb250cm9sMSA9IHJPRkRNMF9YREFHQ0NvcmUxOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2U7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2U7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0NdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2U7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YRFJ4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfQV0tPnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKKwlyZWdbUkZfUEFUSF9CXS0+cmZBR0NDb250cm9sMiA9IHJPRkRNMF9YQkFHQ0NvcmUyOworCXJlZ1tSRl9QQVRIX0NdLT5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hDQUdDQ29yZTI7CisJcmVnW1JGX1BBVEhfRF0tPnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWERBR0NDb3JlMjsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZlJ4QUZFID0gck9GRE0wX1hBUnhBRkU7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmUnhBRkUgPSByT0ZETTBfWEJSeEFGRTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZSeEFGRSA9IHJPRkRNMF9YQ1J4QUZFOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZlJ4QUZFID0gck9GRE0wX1hEUnhBRkU7CisJcmVnW1JGX1BBVEhfQV0tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfQl0tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfQ10tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfRF0tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YRFJ4SVFJbWJhbGFuY2U7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hBVHhJUUltYmFsYW5jZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hDVHhJUUltYmFsYW5jZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfRF0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hEVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZSeEFGRSA9IHJPRkRNMF9YQVJ4QUZFOworCXJlZ1tSRl9QQVRIX0JdLT5yZlJ4QUZFID0gck9GRE0wX1hCUnhBRkU7CisJcmVnW1JGX1BBVEhfQ10tPnJmUnhBRkUgPSByT0ZETTBfWENSeEFGRTsKKwlyZWdbUkZfUEFUSF9EXS0+cmZSeEFGRSA9IHJPRkRNMF9YRFJ4QUZFOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmVHhBRkUgPSByT0ZETTBfWEFUeEFGRTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeEFGRSA9IHJPRkRNMF9YQlR4QUZFOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZlR4QUZFID0gck9GRE0wX1hDVHhBRkU7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmVHhBRkUgPSByT0ZETTBfWERUeEFGRTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hBVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9CXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9DXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hDVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9EXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hEVHhJUUltYmFsYW5jZTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQV9MU1NJUmVhZEJhY2s7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hCX0xTU0lSZWFkQmFjazsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWENfTFNTSVJlYWRCYWNrOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YRF9MU1NJUmVhZEJhY2s7CisJcmVnW1JGX1BBVEhfQV0tPnJmVHhBRkUgPSByT0ZETTBfWEFUeEFGRTsKKwlyZWdbUkZfUEFUSF9CXS0+cmZUeEFGRSA9IHJPRkRNMF9YQlR4QUZFOworCXJlZ1tSRl9QQVRIX0NdLT5yZlR4QUZFID0gck9GRE0wX1hDVHhBRkU7CisJcmVnW1JGX1BBVEhfRF0tPnJmVHhBRkUgPSByT0ZETTBfWERUeEFGRTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkxTU0lSZWFkQmFja1BpID0gVHJhbnNjZWl2ZXJBX0hTUElfUmVhZGJhY2s7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmTFNTSVJlYWRCYWNrUGkgPSBUcmFuc2NlaXZlckJfSFNQSV9SZWFkYmFjazsKKwlyZWdbUkZfUEFUSF9BXS0+cmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrOworCXJlZ1tSRl9QQVRIX0JdLT5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQl9MU1NJUmVhZEJhY2s7CisJcmVnW1JGX1BBVEhfQ10tPnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hDX0xTU0lSZWFkQmFjazsKKwlyZWdbUkZfUEFUSF9EXS0+cmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWERfTFNTSVJlYWRCYWNrOworCisJcmVnW1JGX1BBVEhfQV0tPnJmTFNTSVJlYWRCYWNrUGkgPSBUcmFuc2NlaXZlckFfSFNQSV9SZWFkYmFjazsKKwlyZWdbUkZfUEFUSF9CXS0+cmZMU1NJUmVhZEJhY2tQaSA9IFRyYW5zY2VpdmVyQl9IU1BJX1JlYWRiYWNrOwogfQogCiBzdGF0aWMgYm9vbCBjb25maWdfcGFyYWZpbGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2Z3LmMKaW5kZXggM2IyODc1NC4uYTcxYzU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9mdy5jCkBAIC0xNTQsOSArMTU0LDggQEAKIAkJCWJyZWFrOwogCX0gd2hpbGUgKGNvdW50ZXIrKyA8IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCk7CiAKLQlpZiAoY291bnRlciA+PSBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpIHsKKwlpZiAoY291bnRlciA+PSBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpCiAJCWdvdG8gZXhpdDsKLQl9CiAKIAl2YWx1ZTMyID0gdXNiX3JlYWQzMihhZGFwdCwgUkVHX01DVUZXREwpOwogCXZhbHVlMzIgfD0gTUNVRldETF9SRFk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCmluZGV4IDA2NDc3ZTguLjI4YjVlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCkBAIC03NDEsMTMgKzc0MSwxMyBAQAogCiAJcmV0X3ZhbHVlID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTFfMTFOLCBiTWFza0RXb3JkKTsKIAlGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0JRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCA9ICgocmV0X3ZhbHVlJjB4ZmZmZjAwMDApPj4xNik7CisJRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7CiAJcmV0X3ZhbHVlID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTJfMTFOLCBiTWFza0RXb3JkKTsKIAlGYWxzZUFsbUNudC0+Q250X09GRE1fQ0NBID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgPSAoKHJldF92YWx1ZSYweGZmZmYwMDAwKT4+MTYpOworCUZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCk+PjE2OwogCXJldF92YWx1ZSA9IHBoeV9xdWVyeV9iYl9yZWcoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEUzXzExTiwgYk1hc2tEV29yZCk7CiAJRmFsc2VBbG1DbnQtPkNudF9SYXRlX0lsbGVnYWwgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0JRmFsc2VBbG1DbnQtPkNudF9DcmM4X2ZhaWwgPSAoKHJldF92YWx1ZSYweGZmZmYwMDAwKT4+MTYpOworCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKIAlyZXRfdmFsdWUgPSBwaHlfcXVlcnlfYmJfcmVnKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4sIGJNYXNrRFdvcmQpOwogCUZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwgPSAocmV0X3ZhbHVlJjB4ZmZmZik7CiAKQEAgLTc1Nyw3ICs3NTcsNyBAQAogCiAJcmV0X3ZhbHVlID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdGVyLCBPRE1fUkVHX1NDX0NOVF8xMU4sIGJNYXNrRFdvcmQpOwogCUZhbHNlQWxtQ250LT5DbnRfQldfTFNDID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfQldfVVNDID0gKChyZXRfdmFsdWUmMHhmZmZmMDAwMCk+PjE2KTsKKwlGYWxzZUFsbUNudC0+Q250X0JXX1VTQyA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7CiAKIAkvKiBob2xkIGNjayBjb3VudGVyICovCiAJcGh5X3NldF9iYl9yZWcoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwgQklUMTIsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX0hXQ29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fSFdDb25maWcuYwppbmRleCAyOWY4N2RmLi4zNmFmZTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fSFdDb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fSFdDb25maWcuYwpAQCAtMTIzLDggKzEyMyw4IEBACiAJCS8qIDIwMTEuMTEuMjggTHVrZUxlZTogODhFIHVzZSBkaWZmZXJlbnQgTE5BICYgVkdBIGdhaW4gdGFibGUgKi8KIAkJLyogVGhlIFJTU0kgZm9ybXVsYSBzaG91bGQgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBnYWluIHRhYmxlICovCiAJCS8qIEluIDg4RSwgY2NrX2hpZ2hwd3IgaXMgYWx3YXlzIHNldCB0byAxICovCi0JCUxOQV9pZHggPSAoKGNja19hZ2NfcnB0ICYgMHhFMCkgPj4gNSk7Ci0JCVZHQV9pZHggPSAoY2NrX2FnY19ycHQgJiAweDFGKTsKKwkJTE5BX2lkeCA9IChjY2tfYWdjX3JwdCAmIDB4RTApID4+IDU7CisJCVZHQV9pZHggPSBjY2tfYWdjX3JwdCAmIDB4MUY7CiAJCXN3aXRjaCAoTE5BX2lkeCkgewogCQljYXNlIDc6CiAJCQlpZiAoVkdBX2lkeCA8PSAyNykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKaW5kZXggM2Y2NjNmZS4uNmU0YzNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlpZiAoYml0bWFzayAhPSBiTWFza0RXb3JkKSB7IC8qIGlmIG5vdCAiZG91YmxlIHdvcmQiIHdyaXRlICovCiAJCW9yaWdpbmFsX3ZhbHVlID0gdXNiX3JlYWQzMihhZGFwdCwgcmVnYWRkcik7CiAJCWJpdF9zaGlmdCA9IGNhbF9iaXRfc2hpZnQoYml0bWFzayk7Ci0JCWRhdGEgPSAoKG9yaWdpbmFsX3ZhbHVlICYgKH5iaXRtYXNrKSkgfCAoZGF0YSA8PCBiaXRfc2hpZnQpKTsKKwkJZGF0YSA9IChvcmlnaW5hbF92YWx1ZSAmICh+Yml0bWFzaykpIHwgKGRhdGEgPDwgYml0X3NoaWZ0KTsKIAl9CiAKIAl1c2Jfd3JpdGUzMihhZGFwdCwgcmVnYWRkciwgZGF0YSk7CkBAIC03MiwxMiArNzIsMTAgQEAKIAl1MzIgcmV0ID0gMDsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlzdHJ1Y3QgYmJfcmVnX2RlZiAqcGh5cmVnID0gJmhhbF9kYXRhLT5QSFlSZWdEZWZbcmZwYXRoXTsKLQl1MzIgbmV3b2Zmc2V0OwogCXUzMiB0bXBsb25nLCB0bXBsb25nMjsKIAl1OCByZnBpX2VuYWJsZSA9IDA7CiAKIAlvZmZzZXQgJj0gMHhmZjsKLQluZXdvZmZzZXQgPSBvZmZzZXQ7CiAKIAl0bXBsb25nID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdCwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCBiTWFza0RXb3JkKTsKIAlpZiAocmZwYXRoID09IFJGX1BBVEhfQSkKQEAgLTg3LDcgKzg1LDcgQEAKIAkJCQkJICAgIGJNYXNrRFdvcmQpOwogCiAJdG1wbG9uZzIgPSAodG1wbG9uZzIgJiAofmJMU1NJUmVhZEFkZHJlc3MpKSB8Ci0JCSAgIChuZXdvZmZzZXQ8PDIzKSB8IGJMU1NJUmVhZEVkZ2U7CisJCSAgIChvZmZzZXQ8PDIzKSB8IGJMU1NJUmVhZEVkZ2U7CiAKIAlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCBiTWFza0RXb3JkLAogCQkgICAgICAgdG1wbG9uZyYofmJMU1NJUmVhZEVkZ2UpKTsKQEAgLTExOSwxMCArMTE3LDkgQEAKIAl1MzIgZGF0YV9hbmRfYWRkciA9IDA7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJc3RydWN0IGJiX3JlZ19kZWYgKnBoeXJlZyA9ICZoYWxfZGF0YS0+UEhZUmVnRGVmW3JmcGF0aF07Ci0JdTMyIG5ld29mZnNldDsKIAotCW5ld29mZnNldCA9IG9mZnNldCAmIDB4ZmY7Ci0JZGF0YV9hbmRfYWRkciA9ICgobmV3b2Zmc2V0PDwyMCkgfCAoZGF0YSYweDAwMGZmZmZmKSkgJiAweDBmZmZmZmZmOworCW9mZnNldCAmPSAweGZmOworCWRhdGFfYW5kX2FkZHIgPSAoKG9mZnNldDw8MjApIHwgKGRhdGEmMHgwMDBmZmZmZikpICYgMHgwZmZmZmZmZjsKIAlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgcGh5cmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCBkYXRhX2FuZF9hZGRyKTsKIH0KIApAQCAtMTQ2LDcgKzE0Myw3IEBACiAJaWYgKGJpdF9tYXNrICE9IGJSRlJlZ09mZnNldE1hc2spIHsKIAkJb3JpZ2luYWxfdmFsdWUgPSByZl9zZXJpYWxfcmVhZChhZGFwdCwgcmZfcGF0aCwgcmVnX2FkZHIpOwogCQliaXRfc2hpZnQgPSAgY2FsX2JpdF9zaGlmdChiaXRfbWFzayk7Ci0JCWRhdGEgPSAoKG9yaWdpbmFsX3ZhbHVlICYgKH5iaXRfbWFzaykpIHwgKGRhdGEgPDwgYml0X3NoaWZ0KSk7CisJCWRhdGEgPSAob3JpZ2luYWxfdmFsdWUgJiAofmJpdF9tYXNrKSkgfCAoZGF0YSA8PCBiaXRfc2hpZnQpOwogCX0KIAogCXJmX3NlcmlhbF93cml0ZShhZGFwdCwgcmZfcGF0aCwgcmVnX2FkZHIsIGRhdGEpOwpAQCAtMzA0LDIxICszMDEsOCBAQAogCX0KIAogCS8qIFNldCBSRiByZWxhdGVkIHJlZ2lzdGVyICovCi0Jc3dpdGNoIChoYWxfZGF0YS0+cmZfY2hpcCkgewotCWNhc2UgUkZfODIyNToKLQkJYnJlYWs7Ci0JY2FzZSBSRl84MjU2OgotCQlicmVhazsKLQljYXNlIFJGXzgyNTg6Ci0JCWJyZWFrOwotCWNhc2UgUkZfUFNFVURPXzExTjoKLQkJYnJlYWs7Ci0JY2FzZSBSRl82MDUyOgorCWlmIChoYWxfZGF0YS0+cmZfY2hpcCA9PSBSRl82MDUyKQogCQlydGw4OGV1X3BoeV9yZjYwNTJfc2V0X2JhbmR3aWR0aChhZGFwdCwgaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlcpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CiB9CiAKIHZvaWQgcGh5X3NldF9id19tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCwKQEAgLTM2MSw3ICszNDUsNiBAQAogewogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXU4IHRtcGNoYW5uZWwgPSBoYWxfZGF0YS0+Q3VycmVudENoYW5uZWw7Ci0JYm9vbCAgcmVzdWx0ID0gdHJ1ZTsKIAogCWlmIChoYWxfZGF0YS0+cmZfY2hpcCA9PSBSRl9QU0VVRE9fMTFOKQogCQlyZXR1cm47CkBAIC0zNzEsMzQgKzM1NCwyOCBAQAogCiAJaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsID0gY2hhbm5lbDsKIAotCWlmICgoIWFkYXB0LT5iRHJpdmVyU3RvcHBlZCkgJiYgKCFhZGFwdC0+YlN1cnByaXNlUmVtb3ZlZCkpIHsKKwlpZiAoKCFhZGFwdC0+YkRyaXZlclN0b3BwZWQpICYmICghYWRhcHQtPmJTdXJwcmlzZVJlbW92ZWQpKQogCQlwaHlfc3dfY2hubF9jYWxsYmFjayhhZGFwdCwgY2hhbm5lbCk7Ci0KLQkJaWYgKCFyZXN1bHQpCi0JCQloYWxfZGF0YS0+Q3VycmVudENoYW5uZWwgPSB0bXBjaGFubmVsOwotCi0JfSBlbHNlIHsKKwllbHNlCiAJCWhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbCA9IHRtcGNoYW5uZWw7Ci0JfQogfQogCiAjZGVmaW5lIE9ETV9UWFBXUlRSQUNLX01BWF9JRFhfODhFICA2CiAKIHN0YXRpYyB1OCBnZXRfcmlnaHRfY2hubF9mb3JfaXFrKHU4IGNobmwpCiB7CisJdTggcGxhY2U7CiAJdTggY2hhbm5lbF9hbGxbT0RNX1RBUkdFVF9DSE5MX05VTV8yR181R10gPSB7Ci0JCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKIAkJMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUwLCA1MiwgNTQsIDU2LCA1OCwgNjAsIDYyLCA2NCwKIAkJMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQsIDExNiwgMTE4LCAxMjAsIDEyMiwKIAkJMTI0LCAxMjYsIDEyOCwgMTMwLCAxMzIsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQ5LCAxNTEsIDE1MywKIAkJMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NQogCX07Ci0JdTggcGxhY2UgPSBjaG5sOwogCiAJaWYgKGNobmwgPiAxNCkgewotCQlmb3IgKHBsYWNlID0gMTQ7IHBsYWNlIDwgc2l6ZW9mKGNoYW5uZWxfYWxsKTsgcGxhY2UrKykgeworCQlmb3IgKHBsYWNlID0gMDsgcGxhY2UgPCBzaXplb2YoY2hhbm5lbF9hbGwpOyBwbGFjZSsrKSB7CiAJCQlpZiAoY2hhbm5lbF9hbGxbcGxhY2VdID09IGNobmwpCi0JCQkJcmV0dXJuIHBsYWNlLTEzOworCQkJCXJldHVybiArK3BsYWNlOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNDE2LDEyICszOTMsMTIgQEAKIAogCQlpZiAoZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSA8PSBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQmFzZSkgewogCQkJKmRpcmVjdGlvbiA9IDE7Ci0JCQlwd3JfdmFsdWUgPSAoZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbUJhc2UgLQotCQkJCSAgICAgZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSk7CisJCQlwd3JfdmFsdWUgPSBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQmFzZSAtCisJCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtOwogCQl9IGVsc2UgewogCQkJKmRpcmVjdGlvbiA9IDI7Ci0JCQlwd3JfdmFsdWUgPSAoZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSAtCi0JCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQmFzZSk7CisJCQlwd3JfdmFsdWUgPSBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtIC0KKwkJCQkgICAgIGRtX29kbS0+QmJTd2luZ0lkeE9mZG1CYXNlOwogCQl9CiAKIAl9IGVsc2UgaWYgKHR5cGUgPT0gMSkgeyAvKiBGb3IgQ0NLIGFkanVzdC4gKi8KQEAgLTQzMSwxMiArNDA4LDEyIEBACiAKIAkJaWYgKGRtX29kbS0+QmJTd2luZ0lkeENjayA8PSBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlKSB7CiAJCQkqZGlyZWN0aW9uID0gMTsKLQkJCXB3cl92YWx1ZSA9IChkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlIC0KLQkJCQkgICAgIGRtX29kbS0+QmJTd2luZ0lkeENjayk7CisJCQlwd3JfdmFsdWUgPSBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlIC0KKwkJCQkgICAgIGRtX29kbS0+QmJTd2luZ0lkeENjazsKIAkJfSBlbHNlIHsKIAkJCSpkaXJlY3Rpb24gPSAyOwotCQkJcHdyX3ZhbHVlID0gKGRtX29kbS0+QmJTd2luZ0lkeENjayAtCi0JCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlKTsKKwkJCXB3cl92YWx1ZSA9IGRtX29kbS0+QmJTd2luZ0lkeENjayAtCisJCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlOwogCQl9CiAKIAl9CkBAIC00NjUsMTUgKzQ0MiwxMyBAQAogCXU4IHRoZXJtYWxfdmFsID0gMCwgZGVsdGEsIGRlbHRhX2xjaywgZGVsdGFfaXFrLCBvZmZzZXQ7CiAJdTggdGhlcm1hbF9hdmdfY291bnQgPSAwOwogCXUzMiB0aGVybWFsX2F2ZyA9IDA7Ci0JczMyIGVsZV9hID0gMCwgZWxlX2QsIHRlbXBfY2NrLCB4LCB2YWx1ZTMyOwotCXMzMiB5LCBlbGVfYyA9IDA7CisJczMyIGVsZV9kLCB0ZW1wX2NjazsKIAlzOCBvZmRtX2luZGV4WzJdLCBjY2tfaW5kZXggPSAwOwogCXM4IG9mZG1faW5kZXhfb2xkWzJdID0gezAsIDB9LCBjY2tfaW5kZXhfb2xkID0gMDsKIAl1MzIgaSA9IDAsIGogPSAwOwogCWJvb2wgaXMydCA9IGZhbHNlOwogCiAJdTggb2ZkbV9taW5faW5kZXggPSA2LCByZjsgLyogT0ZETSBCQiBTd2luZyBzaG91bGQgYmUgbGVzcyB0aGFuICszLjBkQiAqLwotCXU4IGluZGV4Zm9yY2hhbm5lbCA9IDA7CiAJczggb2ZkbV9pbmRleF9tYXBwaW5nWzJdW2luZGV4X21hcHBpbmdfTlVNXzg4RV0gPSB7CiAJCS8qIDIuNEcsIGRlY3JlYXNlIHBvd2VyICovCiAJCXswLCAwLCAyLCAzLCA0LCA0LCA1LCA2LCA3LCA3LCA4LCA5LCAxMCwgMTAsIDExfSwKQEAgLTUyOSwxOCArNTA0LDEyIEBACiAJCXRlbXBfY2NrID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uUmVnQTI0OwogCiAJCWZvciAoaSA9IDA7IGkgPCBDQ0tfVEFCTEVfU0laRTsgaSsrKSB7Ci0JCQlpZiAoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYkNDS2luQ0gxNCkgewotCQkJCWlmIChtZW1jbXAoJnRlbXBfY2NrLCAmQ0NLU3dpbmdUYWJsZV9DaDE0W2ldWzJdLCA0KSkgeworCQkJaWYgKChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iQ0NLaW5DSDE0ICYmCisJCQkJbWVtY21wKCZ0ZW1wX2NjaywgJkNDS1N3aW5nVGFibGVfQ2gxNFtpXVsyXSwgNCkpIHx8CisJCQkJbWVtY21wKCZ0ZW1wX2NjaywgJkNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl0sIDQpKSB7CiAJCQkJCWNja19pbmRleF9vbGQgPSAodTgpaTsKIAkJCQkJZG1fb2RtLT5CYlN3aW5nSWR4Q2NrQmFzZSA9ICh1OClpOwogCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtZW1jbXAoJnRlbXBfY2NrLCAmQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXSwgNCkpIHsKLQkJCQkJY2NrX2luZGV4X29sZCA9ICh1OClpOwotCQkJCQlkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlID0gKHU4KWk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAkJCX0KIAkJfQogCkBAIC01NzAsMjcgKzUzOSwxOSBAQAogCQlpZiAodGhlcm1hbF9hdmdfY291bnQpCiAJCQl0aGVybWFsX3ZhbCA9ICh1OCkodGhlcm1hbF9hdmcgLyB0aGVybWFsX2F2Z19jb3VudCk7CiAKLQkJaWYgKGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJSZWxvYWR0eHBvd2VyaW5kZXgpIHsKLQkJCWRlbHRhID0gdGhlcm1hbF92YWwgPiBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID8KLQkJCQkodGhlcm1hbF92YWwgLSBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSA6Ci0JCQkJKGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSB0aGVybWFsX3ZhbCk7Ci0JCQlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iUmVsb2FkdHhwb3dlcmluZGV4ID0gZmFsc2U7Ci0JCQlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIpIHsKLQkJCWRlbHRhID0gKHRoZXJtYWxfdmFsID4gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlKSA/Ci0JCQkJKHRoZXJtYWxfdmFsIC0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlKSA6Ci0JCQkJKGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLlRoZXJtYWxWYWx1ZSAtIHRoZXJtYWxfdmFsKTsKLQkJfSBlbHNlIHsKLQkJCWRlbHRhID0gdGhlcm1hbF92YWwgPiBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID8KLQkJCQkodGhlcm1hbF92YWwgLSBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSA6Ci0JCQkJKGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSB0aGVybWFsX3ZhbCk7CisJCWlmIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIgJiYKKwkJCSFkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iUmVsb2FkdHhwb3dlcmluZGV4KQorCQkJZGVsdGEgPSBhYnModGhlcm1hbF92YWwgLSBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWUpOworCQllbHNlIHsKKwkJCWRlbHRhID0gYWJzKHRoZXJtYWxfdmFsIC0gaGFsX2RhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcik7CisJCQlpZiAoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYlJlbG9hZHR4cG93ZXJpbmRleCkgeworCQkJCWRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJSZWxvYWR0eHBvd2VyaW5kZXggPSBmYWxzZTsKKwkJCQlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIgPSBmYWxzZTsKKwkJCX0KIAkJfQotCQlkZWx0YV9sY2sgPSAodGhlcm1hbF92YWwgPiBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfTENLKSA/Ci0JCQkgICAgKHRoZXJtYWxfdmFsIC0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlX0xDSykgOgotCQkJICAgIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfTENLIC0gdGhlcm1hbF92YWwpOwotCQlkZWx0YV9pcWsgPSAodGhlcm1hbF92YWwgPiBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfSVFLKSA/Ci0JCQkgICAgKHRoZXJtYWxfdmFsIC0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlX0lRSykgOgotCQkJICAgIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfSVFLIC0gdGhlcm1hbF92YWwpOworCisJCWRlbHRhX2xjayA9IGFicyhkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfTENLIC0gdGhlcm1hbF92YWwpOworCQlkZWx0YV9pcWsgPSBhYnMoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlX0lRSyAtIHRoZXJtYWxfdmFsKTsKIAogCQkvKiBEZWx0YSB0ZW1wZXJhdHVyZSBpcyBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiAyMCBjZW50aWdyYWRlLiovCiAJCWlmICgoZGVsdGFfbGNrID49IDgpKSB7CkBAIC01OTksOSArNTYwLDggQEAKIAkJfQogCiAJCWlmIChkZWx0YSA+IDAgJiYgZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVHhQb3dlclRyYWNrQ29udHJvbCkgewotCQkJZGVsdGEgPSB0aGVybWFsX3ZhbCA+IGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPwotCQkJCSh0aGVybWFsX3ZhbCAtIGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIDoKLQkJCQkoaGFsX2RhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciAtIHRoZXJtYWxfdmFsKTsKKwkJCWRlbHRhID0gYWJzKGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSB0aGVybWFsX3ZhbCk7CisKIAkJCS8qIGNhbGN1bGF0ZSBuZXcgT0ZETSAvIENDSyBvZmZzZXQgKi8KIAkJCWlmICh0aGVybWFsX3ZhbCA+IGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpCiAJCQkJaiA9IDE7CkBAIC02MTYsMTcgKzU3NiwxNyBAQAogCQkJfQogCQkJaWYgKG9mZnNldCA+PSBpbmRleF9tYXBwaW5nX05VTV84OEUpCiAJCQkJb2Zmc2V0ID0gaW5kZXhfbWFwcGluZ19OVU1fODhFLTE7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykKLQkJCQlvZmRtX2luZGV4W2ldID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uT0ZETV9pbmRleFtpXSArIG9mZG1faW5kZXhfbWFwcGluZ1tqXVtvZmZzZXRdOwotCQkJY2NrX2luZGV4ID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uQ0NLX2luZGV4ICsgb2ZkbV9pbmRleF9tYXBwaW5nW2pdW29mZnNldF07CiAKKwkJCS8qIFVwZGF0aW5nIG9mZG1faW5kZXggdmFsdWVzIHdpdGggbmV3IE9GRE0gLyBDQ0sgb2Zmc2V0ICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykgeworCQkJCW9mZG1faW5kZXhbaV0gPSBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5PRkRNX2luZGV4W2ldICsgb2ZkbV9pbmRleF9tYXBwaW5nW2pdW29mZnNldF07CiAJCQkJaWYgKG9mZG1faW5kZXhbaV0gPiBPRkRNX1RBQkxFX1NJWkVfOTJELTEpCiAJCQkJCW9mZG1faW5kZXhbaV0gPSBPRkRNX1RBQkxFX1NJWkVfOTJELTE7CiAJCQkJZWxzZSBpZiAob2ZkbV9pbmRleFtpXSA8IG9mZG1fbWluX2luZGV4KQogCQkJCQlvZmRtX2luZGV4W2ldID0gb2ZkbV9taW5faW5kZXg7CiAJCQl9CiAKKwkJCWNja19pbmRleCA9IGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLkNDS19pbmRleCArIG9mZG1faW5kZXhfbWFwcGluZ1tqXVtvZmZzZXRdOwogCQkJaWYgKGNja19pbmRleCA+IENDS19UQUJMRV9TSVpFLTEpCiAJCQkJY2NrX2luZGV4ID0gQ0NLX1RBQkxFX1NJWkUtMTsKIAkJCWVsc2UgaWYgKGNja19pbmRleCA8IDApCkBAIC02MzcsMTEgKzU5Nyw2IEBACiAJCQlpZiAoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVHhQb3dlclRyYWNrQ29udHJvbCkgewogCQkJCWRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJEb25lVHhwb3dlciA9IHRydWU7CiAKLQkJCQkvKiBBZHVqc3QgT0ZETSBBbnRfQSBhY2NvcmRpbmcgdG8gSVFLIHJlc3VsdCAqLwotCQkJCWVsZV9kID0gKE9GRE1Td2luZ1RhYmxlWyh1OClvZmRtX2luZGV4WzBdXSAmIDB4RkZDMDAwMDApPj4yMjsKLQkJCQl4ID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uSVFLTWF0cml4UmVnU2V0dGluZ1tpbmRleGZvcmNoYW5uZWxdLlZhbHVlWzBdWzBdOwotCQkJCXkgPSBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5JUUtNYXRyaXhSZWdTZXR0aW5nW2luZGV4Zm9yY2hhbm5lbF0uVmFsdWVbMF1bMV07Ci0KIAkJCQkvKiAgUmV2c2UgVFggcG93ZXIgdGFibGUuICovCiAJCQkJZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSA9ICh1OClvZmRtX2luZGV4WzBdOwogCQkJCWRtX29kbS0+QmJTd2luZ0lkeENjayA9ICh1OCljY2tfaW5kZXg7CkBAIC02NTUsNTMgKzYxMCw2IEBACiAJCQkJCWRtX29kbS0+QmJTd2luZ0lkeENja0N1cnJlbnQgPSBkbV9vZG0tPkJiU3dpbmdJZHhDY2s7CiAJCQkJCWRtX29kbS0+QmJTd2luZ0ZsYWdDY2sgPSB0cnVlOwogCQkJCX0KLQotCQkJCWlmICh4ICE9IDApIHsKLQkJCQkJaWYgKCh4ICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCXggPSB4IHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX2EgPSAoKHggKiBlbGVfZCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQkJLyogbmV3IGVsZW1lbnQgQyA9IGVsZW1lbnQgRCB4IFkgKi8KLQkJCQkJaWYgKCh5ICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCXkgPSB5IHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX2MgPSAoKHkgKiBlbGVfZCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQl9Ci0KLQkJCQlpZiAoaXMydCkgewotCQkJCQllbGVfZCA9IChPRkRNU3dpbmdUYWJsZVsodTgpb2ZkbV9pbmRleFsxXV0gJiAweEZGQzAwMDAwKT4+MjI7Ci0KLQkJCQkJLyogbmV3IGVsZW1lbnQgQSA9IGVsZW1lbnQgRCB4IFggKi8KLQkJCQkJeCA9IGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLklRS01hdHJpeFJlZ1NldHRpbmdbaW5kZXhmb3JjaGFubmVsXS5WYWx1ZVswXVs0XTsKLQkJCQkJeSA9IGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLklRS01hdHJpeFJlZ1NldHRpbmdbaW5kZXhmb3JjaGFubmVsXS5WYWx1ZVswXVs1XTsKLQotCQkJCQlpZiAoKHggIT0gMCkgJiYgKCooZG1fb2RtLT5wQmFuZFR5cGUpID09IE9ETV9CQU5EXzJfNEcpKSB7Ci0JCQkJCQlpZiAoKHggJiAweDAwMDAwMjAwKSAhPSAwKQkvKiBjb25zaWRlciBtaW51cyAqLwotCQkJCQkJCXggPSB4IHwgMHhGRkZGRkMwMDsKLQkJCQkJCWVsZV9hID0gKCh4ICogZWxlX2QpPj44KSYweDAwMDAwM0ZGOwotCi0JCQkJCQkvKiBuZXcgZWxlbWVudCBDID0gZWxlbWVudCBEIHggWSAqLwotCQkJCQkJaWYgKCh5ICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCQl5ID0geSB8IDB4RkZGRkZDMDA7Ci0JCQkJCQllbGVfYyA9ICgoeSAqIGVsZV9kKT4+OCkmMHgwMDAwM0ZGOwotCi0JCQkJCQkvKiB3dGl0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODggYW5kIHJlZ0M5QywgZWxlbWVudCBCIGlzIGFsd2F5cyAwICovCi0JCQkJCQl2YWx1ZTMyID0gKGVsZV9kPDwyMikgfCAoKGVsZV9jJjB4M0YpPDwxNikgfCBlbGVfYTsKLQkJCQkJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCB2YWx1ZTMyKTsKLQotCQkJCQkJdmFsdWUzMiA9IChlbGVfYyYweDAwMDAwM0MwKT4+NjsKLQkJCQkJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCByT0ZETTBfWERUeEFGRSwgYk1hc2tINEJpdHMsIHZhbHVlMzIpOwotCi0JCQkJCQl2YWx1ZTMyID0gKCh4ICogZWxlX2QpPj43KSYweDAxOwotCQkJCQkJcGh5X3NldF9iYl9yZWcoYWRhcHQsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQyOCwgdmFsdWUzMik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgT0ZETVN3aW5nVGFibGVbKHU4KW9mZG1faW5kZXhbMV1dKTsKLQkJCQkJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCByT0ZETTBfWERUeEFGRSwgYk1hc2tINEJpdHMsIDB4MDApOwotCQkJCQkJcGh5X3NldF9iYl9yZWcoYWRhcHQsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQyOCwgMHgwMCk7Ci0JCQkJCX0KLQotCQkJCX0KLQogCQkJfQogCQl9CiAKQEAgLTEwMzMsMTEgKzk0MSwxMSBAQAogCXUzMiBwYXRoX29uOwogCXUzMiBpOwogCi0JcGF0aF9vbiA9IGlzX3BhdGhfYV9vbiA/IDB4MDRkYjI1YTQgOiAweDBiMWIyNWE0OwogCWlmICghaXMydCkgewogCQlwYXRoX29uID0gMHgwYmRiMjVhMDsKIAkJcGh5X3NldF9iYl9yZWcoYWRhcHQsIGFkZGFfcmVnWzBdLCBiTWFza0RXb3JkLCAweDBiMWIyNWEwKTsKIAl9IGVsc2UgeworCQlwYXRoX29uID0gaXNfcGF0aF9hX29uID8gMHgwNGRiMjVhNCA6IDB4MGIxYjI1YTQ7CiAJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCBhZGRhX3JlZ1swXSwgYk1hc2tEV29yZCwgcGF0aF9vbik7CiAJfQogCkBAIC0xMDc3LDI3ICs5ODUsMTkgQEAKIHN0YXRpYyBib29sIHNpbXVsYXJpdHlfY29tcGFyZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHMzMiByZXN1bHRhW11bOF0sCiAJCQkgICAgICAgdTggYzEsIHU4IGMyKQogewotCXUzMiBpLCBqLCBkaWZmLCBzaW1fYml0bWFwLCBib3VuZCA9IDA7CisJdTMyIGksIGosIGRpZmYsIHNpbV9iaXRtYXAgPSAwLCBib3VuZDsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OwogCXU4IGZpbmFsX2NhbmRpZGF0ZVsyXSA9IHsweEZGLCAweEZGfTsJLyogZm9yIHBhdGggQSBhbmQgcGF0aCBCICovCiAJYm9vbCByZXN1bHQgPSB0cnVlOwotCWJvb2wgaXMydDsKIAlzMzIgdG1wMSA9IDAsIHRtcDIgPSAwOwogCiAJaWYgKChkbV9vZG0tPlJGVHlwZSA9PSBPRE1fMlQyUikgfHwgKGRtX29kbS0+UkZUeXBlID09IE9ETV8yVDNSKSB8fAogCSAgICAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUNFIpKQotCQlpczJ0ID0gdHJ1ZTsKLQllbHNlCi0JCWlzMnQgPSBmYWxzZTsKLQotCWlmIChpczJ0KQogCQlib3VuZCA9IDg7CiAJZWxzZQogCQlib3VuZCA9IDQ7CiAKLQlzaW1fYml0bWFwID0gMDsKLQogCWZvciAoaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7CiAJCWlmICgoaSA9PSAxKSB8fCAoaSA9PSAzKSB8fCAoaSA9PSA1KSB8fCAoaSA9PSA3KSkgewogCQkJaWYgKChyZXN1bHRhW2MxXVtpXSAmIDB4MDAwMDAyMDApICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9wd3JzZXFjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3B3cnNlcWNtZC5jCmluZGV4IGJlMDY2M2UuLjczZTFmOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3B3cnNlcWNtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3B3cnNlcWNtZC5jCkBAIC0xMDksNyArMTA5LDYgQEAKIAkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAogCQkJCQkgKCJydGw4OGV1X3B3cnNlcWNtZHBhcnNpbmc6IFBXUl9DTURfRU5EXG4iKSk7CiAJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKIAkJCQkJICgicnRsODhldV9wd3JzZXFjbWRwYXJzaW5nOiBVbmtub3duIENNRCEhXG4iKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmYuYwppbmRleCBlZWE0YzhhLi4wOTcwOTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMjoJLyogIEJldHRlciByZWd1bGF0b3J5ICovCiAJCQkJLyogIGRvbid0IGluY3JlYXNlIGFueSBwb3dlciBkaWZmICovCi0JCQl3cml0ZV92YWwgPSAoKGluZGV4IDwgMikgPyBwb3dlcmJhc2UwW3JmXSA6IHBvd2VyYmFzZTFbcmZdKTsKKwkJCXdyaXRlX3ZhbCA9IChpbmRleCA8IDIpID8gcG93ZXJiYXNlMFtyZl0gOiBwb3dlcmJhc2UxW3JmXTsKIAkJCWJyZWFrOwogCQljYXNlIDM6CS8qICBDdXN0b21lciBkZWZpbmVkIHBvd2VyIGRpZmYuICovCiAJCQkJLyogIGluY3JlYXNlIHBvd2VyIGRpZmYgZGVmaW5lZCBieSBjdXN0b21lci4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKaW5kZXggNWRjMTFjYS4uNDU1ZWNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKQEAgLTM4LDEyICszOCwxMiBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAljb25kID0gY29uZGl0aW9uICYgMHgwMDAwRkYwMDsKLQljb25kID0gY29uZCA+PiA4OworCWNvbmQgPj49IDg7CiAJaWYgKChfaW50ZXJmYWNlICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MDcpCiAJCXJldHVybiBmYWxzZTsKIAogCWNvbmQgPSBjb25kaXRpb24gJiAweDAwRkYwMDAwOwotCWNvbmQgPSBjb25kID4+IDE2OworCWNvbmQgPj49IDE2OwogCWlmICgoX3BsYXRmb3JtICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MEYpCiAJCXJldHVybiBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCmluZGV4IDMyMjJkOGQuLjc5MDRkMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYwpAQCAtNTk2LDcgKzU5Niw4IEBACiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CiAKIAlpZiAoIUF1dG9Mb2FkRmFpbCkKLQkJcEhhbERhdGEtPkJvYXJkVHlwZSA9ICgoaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05fODhFXSYweEUwKT4+NSk7CisJCXBIYWxEYXRhLT5Cb2FyZFR5cGUgPSAoaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05fODhFXQorCQkJCQkmIDB4RTApID4+IDU7CiAJZWxzZQogCQlwSGFsRGF0YS0+Qm9hcmRUeXBlID0gMDsKIAlEQkdfODhFKCJCb2FyZCBUeXBlOiAweCUyeFxuIiwgcEhhbERhdGEtPkJvYXJkVHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYwppbmRleCBiYzI3NWIyLi4wNmQxZTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKQEAgLTQyLDcgKzQyLDcgQEAKIAlfcnR3X2luaXRfcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X2J1Zl9xdWV1ZSk7CiAKIAlwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYgPQotCQlremFsbG9jKE5SX1JFQ1ZCVUZGICogc2l6ZW9mKHN0cnVjdCByZWN2X2J1ZiksIEdGUF9LRVJORUwpOworCQlrY2FsbG9jKE5SX1JFQ1ZCVUZGLCBzaXplb2Yoc3RydWN0IHJlY3ZfYnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9yZWN2X2J1ZiA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKaW5kZXggMTQ2NTBlOS4uN2IwMWQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCkBAIC0xMDk2LDEwICsxMDk2LDggQEAKIAkJbWVtY3B5KGVlcHJvbS0+bWFjX2FkZHIsICZod2luZm9bRUVQUk9NX01BQ19BRERSXzg4RVVdLCBFVEhfQUxFTik7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X25vdGljZV8sCi0JCSAoIkhhbF9FZnVzZVBhcnNlTUFDQWRkcl84MTg4RVU6IFBlcm1hbmVudCBBZGRyZXNzID0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsCi0JCSBlZXByb20tPm1hY19hZGRyWzBdLCBlZXByb20tPm1hY19hZGRyWzFdLAotCQkgZWVwcm9tLT5tYWNfYWRkclsyXSwgZWVwcm9tLT5tYWNfYWRkclszXSwKLQkJIGVlcHJvbS0+bWFjX2FkZHJbNF0sIGVlcHJvbS0+bWFjX2FkZHJbNV0pKTsKKwkJICgiSGFsX0VmdXNlUGFyc2VNQUNBZGRyXzgxODhFVTogUGVybWFuZW50IEFkZHJlc3MgPSAlcE1cbiIsCisJCSBlZXByb20tPm1hY19hZGRyKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMzUyLDcgKzEzNTAsNyBAQAogCiAJCQkvKiAgU2V0IFJUUyBpbml0aWFsIHJhdGUgKi8KIAkJCXdoaWxlIChCcmF0ZUNmZyA+IDB4MSkgewotCQkJCUJyYXRlQ2ZnID0gKEJyYXRlQ2ZnID4+IDEpOworCQkJCUJyYXRlQ2ZnID4+PSAxOwogCQkJCVJhdGVJbmRleCsrOwogCQkJfQogCQkJLyogIFppdiAtIENoZWNrICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWVlZTgwMjExLmgKaW5kZXggMzI5OTU3MS4uOGZkMzVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZWVlODAyMTEuaApAQCAtMTIyLDcgKzEyMiw2IEBACiAKICNkZWZpbmUgV1BBX1NFTEVDVE9SX0xFTiA0CiBleHRlcm4gdTggUlRXX1dQQV9PVUlfVFlQRVtdOwotZXh0ZXJuIHUxNiBSVFdfV1BBX1ZFUlNJT047CiBleHRlcm4gdTggV1BBX0FVVEhfS0VZX01HTVRfTk9ORVtdOwogZXh0ZXJuIHU4IFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVhbXTsKIGV4dGVybiB1OCBXUEFfQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVhbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCmluZGV4IDNhMjc0NzcuLjUxNWU5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaApAQCAtNzYsMjUgKzc2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnB0aW1lciwKLQkJCSAgICAgICBzdHJ1Y3QgIG5ldF9kZXZpY2UgKm5pY19oZGwsCi0JCQkgICAgICAgdm9pZCAqcGZ1bmMsIHZvaWQgKmNudHgpCi17Ci0JcHRpbWVyLT5mdW5jdGlvbiA9IHBmdW5jOwotCXB0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNudHg7Ci0JaW5pdF90aW1lcihwdGltZXIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3NldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqcHRpbWVyLCB1MzIgZGVsYXlfdGltZSkKLXsKLQltb2RfdGltZXIocHRpbWVyICwgKGppZmZpZXMrbXNlY3NfdG9famlmZmllcyhkZWxheV90aW1lKSkpOwotfQotCi0jZGVmaW5lIFJUV19USU1FUl9IRExfQVJHUyB2b2lkICpGdW5jdGlvbkNvbnRleHQKLSNkZWZpbmUgUlRXX1RJTUVSX0hETF9OQU1FKG5hbWUpIHJ0d18jI25hbWUjI190aW1lcl9oZGwKLSNkZWZpbmUgUlRXX0RFQ0xBUkVfVElNRVJfSERMKG5hbWUpIFwKLQl2b2lkIFJUV19USU1FUl9IRExfTkFNRShuYW1lKShSVFdfVElNRVJfSERMX0FSR1MpCi0KIHN0YXRpYyBpbmxpbmUgaW50IHJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewogCXJldHVybiAgbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBuZXRkZXYsIDApKSAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19sZWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbGVkLmgKaW5kZXggMjNmMGNmZS4uN2E1MzAzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19sZWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2xlZC5oCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkJCShhZGFwdCktPmxlZHByaXYuTGVkQ29udHJvbEhhbmRsZXIoKGFkYXB0KSwgKGFjdGlvbikpOyBcCiAJfSB3aGlsZSAoMCkKIAotdm9pZCBCbGlua1RpbWVyQ2FsbGJhY2sodm9pZCAqZGF0YSk7Cit2b2lkIEJsaW5rVGltZXJDYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCBCbGlua1dvcmtJdGVtQ2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogdm9pZCBSZXNldExlZFN0YXR1cyhzdHJ1Y3QgTEVEXzg3MXggKnBMZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAppbmRleCA4ZDgzZjdjLi4zZjdkMWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaApAQCAtNTUxLDEwICs1NTEsMTAgQEAKIAogdm9pZCBydHdfZ2V0X2VuY3J5cHRfZGVjcnlwdF9mcm9tX3JlZ2lzdHJ5cHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiAKLXZvaWQgX3J0d19qb2luX3RpbWVvdXRfaGFuZGxlcih2b2lkICpmdW5jdGlvbl9jb250ZXh0KTsKLXZvaWQgcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyKHZvaWQgKmZ1bmN0aW9uX2NvbnRleHQpOwordm9pZCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCi12b2lkIHJ0d19keW5hbWljX2NoZWNrX3RpbWVyX2hhbmRsZGVyKHZvaWQgKmZ1bmN0aW9uX2NvbnRleHQpOwordm9pZCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGRlcih1bnNpZ25lZCBsb25nIGRhdGEpOwogI2RlZmluZSBydHdfaXNfc2Nhbl9kZW55KGFkYXB0ZXIpIGZhbHNlCiAjZGVmaW5lIHJ0d19jbGVhcl9zY2FuX2RlbnkoYWRhcHRlcikgZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIHJ0d19zZXRfc2Nhbl9kZW55X3RpbWVyX2hkbChhZGFwdGVyKSBkbyB7fSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAppbmRleCA0ZjA1YWVlLi4yYmViZjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCkBAIC02NDUsMTkgKzY0NSwxNyBAQAogCiB2b2lkIGxpbmtlZF9zdGF0dXNfY2hrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKLXZvaWQgc3VydmV5X3RpbWVyX2hkbCh2b2lkICpmdW5jdGlvbl9jb250ZXh0KTsKLXZvaWQgbGlua190aW1lcl9oZGwodm9pZCAqZnVudGlvbl9jb250ZXh0KTsKLXZvaWQgYWRkYmFfdGltZXJfaGRsKHZvaWQgKmZ1bmN0aW9uX2NvbnRleHQpOwordm9pZCBzdXJ2ZXlfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGxpbmtfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGFkZGJhX3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpOwogCiAjZGVmaW5lIHNldF9zdXJ2ZXlfdGltZXIobWxtZWV4dCwgbXMpIFwKLQlkbyB7IFwKLQkJX3NldF90aW1lcigmKG1sbWVleHQpLT5zdXJ2ZXlfdGltZXIsIChtcykpOyBcCi0JfSB3aGlsZSAoMCkKKwltb2RfdGltZXIoJm1sbWVleHQtPnN1cnZleV90aW1lciwgamlmZmllcyArCVwKKwkJICBtc2Vjc190b19qaWZmaWVzKG1zKSkKIAogI2RlZmluZSBzZXRfbGlua190aW1lcihtbG1lZXh0LCBtcykgXAotCWRvIHsgXAotCQlfc2V0X3RpbWVyKCYobWxtZWV4dCktPmxpbmtfdGltZXIsIChtcykpOyBcCi0JfSB3aGlsZSAoMCkKKwltb2RfdGltZXIoJm1sbWVleHQtPmxpbmtfdGltZXIsIGppZmZpZXMgKwlcCisJCSAgbXNlY3NfdG9famlmZmllcyhtcykpCiAKIGludCBjY2tyYXRlc19pbmNsdWRlZCh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbik7CiBpbnQgY2NrcmF0ZXNvbmx5X2luY2x1ZGVkKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKaW5kZXggNTRkZmJmMC4uYWExZmQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKQEAgLTIzMyw5ICsyMzMsOCBAQAogI2RlZmluZSBSVFdfUFdSX1NUQVRFX0NIS19JTlRFUlZBTCAyMDAwCiAKICNkZWZpbmUgX3J0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKHB3cmN0cmxwcml2LCBtcykgXAotCWRvIHsgXAotCQlfc2V0X3RpbWVyKCYocHdyY3RybHByaXYpLT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIsIChtcykpOyBcCi0JfSB3aGlsZSAoMCkKKwltb2RfdGltZXIoJnB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIsCVwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtcykpCiAKICNkZWZpbmUgcnR3X3NldF9wd3Jfc3RhdGVfY2hlY2tfdGltZXIocHdyY3RybCkJCQlcCiAJX3J0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKChwd3JjdHJsKSwJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKaW5kZXggZjBjMjZlZi4uZWIxYWMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKQEAgLTIxNiw4ICsyMTYsOCBAQAogfTsKIAogI2RlZmluZSBydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKHJlY3Zwcml2KQkJCVwKLQlfc2V0X3RpbWVyKCYocmVjdnByaXYpLT5zaWduYWxfc3RhdF90aW1lciwJCVwKLQkJICAgKHJlY3Zwcml2KS0+c2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWwpCisJbW9kX3RpbWVyKCYocmVjdnByaXYpLT5zaWduYWxfc3RhdF90aW1lciwgamlmZmllcyArCVwKKwkJICBtc2Vjc190b19qaWZmaWVzKChyZWN2cHJpdiktPnNpZ25hbF9zdGF0X3NhbXBsaW5nX2ludGVydmFsKSkKIAogc3RydWN0IHN0YV9yZWN2X3ByaXYgewogCXNwaW5sb2NrX3QgbG9jazsKQEAgLTI3OCw3ICsyNzgsNyBAQAogCQkJICAgICAgc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwogdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCi12b2lkIHJ0d19yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyKHZvaWQgKnBjb250ZXh0KTsKK3ZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIAogc3RhdGljIGlubGluZSB1OCAqZ2V0X3J4bWVtKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCmluZGV4IDY2ZDYwYWEuLmU5NzIzYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc2VjdXJpdHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmgKQEAgLTI0NSwxMCArMjQ1LDYgQEAKIH07CiAKIGV4dGVybiBjb25zdCB1MzIgVGUwWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlMVsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZTJbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGUzWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlNFsyNTZdOwogZXh0ZXJuIGNvbnN0IHUzMiBUZDBbMjU2XTsKIGV4dGVybiBjb25zdCB1MzIgVGQxWzI1Nl07CiBleHRlcm4gY29uc3QgdTMyIFRkMlsyNTZdOwpAQCAtMjY5LDI4ICsyNjUsNiBAQAogI2RlZmluZSBURTEoaSkgcm90cihUZTBbKChpKSA+PiAxNikgJiAweGZmXSwgOCkKICNkZWZpbmUgVEUyKGkpIHJvdHIoVGUwWygoaSkgPj4gOCkgJiAweGZmXSwgMTYpCiAjZGVmaW5lIFRFMyhpKSByb3RyKFRlMFsoaSkgJiAweGZmXSwgMjQpCi0jZGVmaW5lIFRFNDEoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA8PCA4KSAmIDB4ZmYwMDAwMDApCi0jZGVmaW5lIFRFNDIoaSkgKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkKLSNkZWZpbmUgVEU0MyhpKSAoVGUwWygoaSkgPj4gOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApCi0jZGVmaW5lIFRFNDQoaSkgKChUZTBbKGkpICYgMHhmZl0gPj4gOCkgJiAweDAwMDAwMGZmKQotI2RlZmluZSBURTQyMShpKSAoKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdIDw8IDgpICYgMHhmZjAwMDAwMCkKLSNkZWZpbmUgVEU0MzIoaSkgKFRlMFsoKGkpID4+IDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKQotI2RlZmluZSBURTQ0MyhpKSAoVGUwWyhpKSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkKLSNkZWZpbmUgVEU0MTQoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA+PiA4KSAmIDB4MDAwMDAwZmYpCi0jZGVmaW5lIFRFNChpKSAoKFRlMFsoaSldID4+IDgpICYgMHgwMDAwMDBmZikKLQotI2RlZmluZSBURDAoaSkgVGQwWygoaSkgPj4gMjQpICYgMHhmZl0KLSNkZWZpbmUgVEQxKGkpIHJvdHIoVGQwWygoaSkgPj4gMTYpICYgMHhmZl0sIDgpCi0jZGVmaW5lIFREMihpKSByb3RyKFRkMFsoKGkpID4+IDgpICYgMHhmZl0sIDE2KQotI2RlZmluZSBURDMoaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQotI2RlZmluZSBURDQxKGkpIChUZDRzWygoaSkgPj4gMjQpICYgMHhmZl0gPDwgMjQpCi0jZGVmaW5lIFRENDIoaSkgKFRkNHNbKChpKSA+PiAxNikgJiAweGZmXSA8PCAxNikKLSNkZWZpbmUgVEQ0MyhpKSAoVGQ0c1soKGkpID4+IDgpICYgMHhmZl0gPDwgOCkKLSNkZWZpbmUgVEQ0NChpKSAoVGQ0c1soaSkgJiAweGZmXSkKLSNkZWZpbmUgVEQwXyhpKSBUZDBbKGkpICYgMHhmZl0KLSNkZWZpbmUgVEQxXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgOCkKLSNkZWZpbmUgVEQyXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgMTYpCi0jZGVmaW5lIFREM18oaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQogCiAjZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiBcCiAJCQkoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKaW5kZXggOGRiZGZhZi4uYTg5Mjc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCkBAIC0zMDEsMjIgKzMwMSwxMiBAQAogI2RlZmluZSBHZXRQcml2YWN5KHBidWYpCQkJCQlcCiAJKCgoKihfX2xlMTYgKikocGJ1ZikpICYgY3B1X3RvX2xlMTYoX1BSSVZBQ1lfKSkgIT0gMCkKIAotI2RlZmluZSBDbGVhclByaXZhY3kocGJ1ZikJXAotCSooX19sZTE2ICopKHBidWYpICY9ICh+Y3B1X3RvX2xlMTYoX1BSSVZBQ1lfKSkKLQotCiAjZGVmaW5lIEdldE9yZGVyKHBidWYpCQkJCQlcCiAJKCgoKihfX2xlMTYgKikocGJ1ZikpICYgY3B1X3RvX2xlMTYoX09SREVSXykpICE9IDApCiAKICNkZWZpbmUgR2V0RnJhbWVUeXBlKHBidWYpCQkJCVwKIAkobGUxNl90b19jcHUoKihfX2xlMTYgKikocGJ1ZikpICYgKEJJVCgzKSB8IEJJVCgyKSkpCiAKLSNkZWZpbmUgU2V0RnJhbWVUeXBlKHBidWYsIHR5cGUpCVwKLQlkbyB7CVwKLQkJKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSAmPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KH4oQklUKDMpIHwgQklUKDIpKSk7IFwKLQkJKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSB8PSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHR5cGUpOyBcCi0JfSB3aGlsZSAoMCkKLQogI2RlZmluZSBHZXRGcmFtZVN1YlR5cGUocGJ1ZikJKGxlMTZfdG9fY3B1KCooX19sZTE2ICopKHBidWYpKSAmIChCSVQoNykgfFwKIAkgQklUKDYpIHwgQklUKDUpIHwgQklUKDQpIHwgQklUKDMpIHwgQklUKDIpKSkKIApAQCAtMzMzLDE3ICszMjMsNiBAQAogI2RlZmluZSBHZXRGcmFnTnVtKHBidWYpCQkJXAogCShsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSgoc2l6ZV90KShwYnVmKSArIDIyKSkgJiAweDBmKQogCi0jZGVmaW5lIEdldFR1cGxlQ2FjaGUocGJ1ZikJCQlcCi0JKGNwdV90b19sZTE2KCoodW5zaWduZWQgc2hvcnQgKikoKHNpemVfdCkocGJ1ZikgKyAyMikpKQotCi0jZGVmaW5lIFNldEZyYWdOdW0ocGJ1ZiwgbnVtKSBcCi0JZG8geyAgICBcCi0JCSoodW5zaWduZWQgc2hvcnQgKikoKHNpemVfdCkocGJ1ZikgKyAyMikgPSBcCi0JCQkoKCoodW5zaWduZWQgc2hvcnQgKikoKHNpemVfdCkocGJ1ZikgKyAyMikpICYJXAotCQkJbGUxNl90b19jcHUofigweDAwMGYpKSkgfCBcCi0JCQljcHVfdG9fbGUxNigweDBmICYgKG51bSkpOyAgICAgXAotCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgU2V0U2VxTnVtKHBidWYsIG51bSkgXAogCWRvIHsgICAgXAogCQkqKF9fbGUxNiAqKSgoc2l6ZV90KShwYnVmKSArIDIyKSA9IFwKQEAgLTM3MCwxNSArMzQ5LDggQEAKIAogI2RlZmluZSBHZXRBTXNkdShwYnVmKSAoKChsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKXBidWYpKSA+PiA3KSAmIDB4MSkKIAotI2RlZmluZSBTZXRBTXNkdShwYnVmLCBhbXNkdSkJXAotCSooX19sZTE2ICopKHBidWYpIHw9IGNwdV90b19sZTE2KChhbXNkdSAmIDEpIDw8IDcpCi0KICNkZWZpbmUgR2V0QWlkKHBidWYpCShsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSgoc2l6ZV90KShwYnVmKSArIDIpKSAmIDB4M2ZmZikKIAotI2RlZmluZSBHZXRUaWQocGJ1ZikJKGxlMTZfdG9fY3B1KCooX19sZTE2ICopKChzaXplX3QpKHBidWYpICsJXAotCQkJKCgoR2V0VG9EcyhwYnVmKTw8MSkgfCBHZXRGckRzKHBidWYpKSA9PSAzID8JXAotCQkJMzAgOiAyNCkpKSAmIDB4MDAwZikKLQogI2RlZmluZSBHZXRBZGRyMVB0cihwYnVmKQkoKHVuc2lnbmVkIGNoYXIgKikoKHNpemVfdCkocGJ1ZikgKyA0KSkKIAogI2RlZmluZSBHZXRBZGRyMlB0cihwYnVmKQkoKHVuc2lnbmVkIGNoYXIgKikoKHNpemVfdCkocGJ1ZikgKyAxMCkpCkBAIC05MTYsNyArODg4LDcgQEAKICNkZWZpbmUJUDJQX1NUQVRVU19GQUlMX0lOQ09NUEFUSUJMRV9QUk9WU0lPTgkJMHgwQQogI2RlZmluZQlQMlBfU1RBVFVTX0ZBSUxfVVNFUl9SRUpFQ1QJCQkweDBCCiAKLS8qCVZhbHVlIG9mIEludmlhdGlvbiBGbGFncyBBdHRyaWJ1dGUgKi8KKy8qCVZhbHVlIG9mIEludml0YXRpb24gRmxhZ3MgQXR0cmlidXRlICovCiAjZGVmaW5lCVAyUF9JTlZJVEFUSU9OX0ZMQUdTX1BFUlNJU1RFTlQJCQlCSVQoMCkKIAogI2RlZmluZQlETVBfUDJQX0RFVkNBUF9TVVBQT1JUCShQMlBfREVWQ0FQX1NFUlZJQ0VfRElTQ09WRVJZIHwgXApAQCAtOTcwLDcgKzk0Miw3IEBACiAKICNkZWZpbmUJUDJQX1dJTERDQVJEX1NTSURfTEVOCQkJNwogCi0vKiBkZWZhdWx0IHZhbHVlLCB1c2VkIHdoZW46ICgxKXAycCBkaXNhYmVkIG9yICgyKXAycCBlbmFibGVkCisvKiBkZWZhdWx0IHZhbHVlLCB1c2VkIHdoZW46ICgxKXAycCBkaXNhYmxlZCBvciAoMilwMnAgZW5hYmxlZAogICogYnV0IG9ubHkgZG8gMSBzY2FuIHBoYXNlICovCiAjZGVmaW5lCVAyUF9GSU5EUEhBU0VfRVhfTk9ORQkJMAogLyogIHVzZWQgd2hlbiBwMnAgZW5hYmxlZCBhbmQgd2FudCB0byBkbyAxIHNjYW4gcGhhc2UgYW5kCkBAIC0xMDM1LDEzICsxMDA3LDEzIEBACiAJUDJQX1NUQVRFX1RYX1BST1ZJU0lPTl9ESVNfUkVRID0gNiwKIAlQMlBfU1RBVEVfUlhfUFJPVklTSU9OX0RJU19SU1AgPSA3LAogCVAyUF9TVEFURV9SWF9QUk9WSVNJT05fRElTX1JFUSA9IDgsCi0JLyogRG9pbmcgdGhlIGdyb3VwIG93bmVyIG5lZ29pdGF0aW9uIGhhbmRzaGFrZSAqLworCS8qIERvaW5nIHRoZSBncm91cCBvd25lciBuZWdvdGlhdGlvbiBoYW5kc2hha2UgKi8KIAlQMlBfU1RBVEVfR09ORUdPX0lORyA9IDksCi0JLyogZmluaXNoIHRoZSBncm91cCBuZWdvaXRhdGlvbiBoYW5kc2hha2Ugd2l0aCBzdWNjZXNzICovCisJLyogZmluaXNoIHRoZSBncm91cCBuZWdvdGlhdGlvbiBoYW5kc2hha2Ugd2l0aCBzdWNjZXNzICovCiAJUDJQX1NUQVRFX0dPTkVHT19PSyA9IDEwLAotCS8qIGZpbmlzaCB0aGUgZ3JvdXAgbmVnb2l0YXRpb24gaGFuZHNoYWtlIHdpdGggZmFpbHVyZSAqLworCS8qIGZpbmlzaCB0aGUgZ3JvdXAgbmVnb3RpYXRpb24gaGFuZHNoYWtlIHdpdGggZmFpbHVyZSAqLwogCVAyUF9TVEFURV9HT05FR09fRkFJTCA9IDExLAotCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludmlhdGlvbiByZXF1ZXN0IGFuZCBtYXRjaCB3aXRoIHRoZSBwcm9maWxlLiAqLworCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludml0YXRpb24gcmVxdWVzdCBhbmQgbWF0Y2ggd2l0aCB0aGUgcHJvZmlsZS4gKi8KIAlQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX01BVENIID0gMTIsCiAJLyogRG9pbmcgdGhlIFAyUCBXUFMgKi8KIAlQMlBfU1RBVEVfUFJPVklTSU9OSU5HX0lORyA9IDEzLApAQCAtMTA1MSwxNyArMTAyMywxNyBAQAogCVAyUF9TVEFURV9UWF9JTlZJVEVfUkVRID0gMTUsCiAJLyogUmVjZWl2aW5nIHRoZSBQMlAgSW52aXRhdGlvbiByZXNwb25zZSAqLwogCVAyUF9TVEFURV9SWF9JTlZJVEVfUkVTUF9PSyA9IDE2LAotCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludmlhdGlvbiByZXF1ZXN0IGFuZCBkaXNtYXRjaCB3aXRoIHRoZSBwcm9maWxlLiAqLworCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludml0YXRpb24gcmVxdWVzdCBhbmQgZGlzbWF0Y2ggd2l0aCB0aGUgcHJvZmlsZS4gKi8KIAlQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX0RJU01BVENIID0gMTcsCi0JLyogcmVjZWl2aW5nIHRoZSBQMlAgSW52aWF0aW9uIHJlcXVlc3QgYW5kIHRoaXMgd2lmaSBpcyBHTy4gKi8KKwkvKiByZWNlaXZpbmcgdGhlIFAyUCBJbnZpdGF0aW9uIHJlcXVlc3QgYW5kIHRoaXMgd2lmaSBpcyBHTy4gKi8KIAlQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX0dPID0gMTgsCi0JLyogcmVjZWl2aW5nIHRoZSBQMlAgSW52aWF0aW9uIHJlcXVlc3QgdG8gam9pbiBhbiBleGlzdGluZyBQMlAgR3JvdXAuICovCisJLyogcmVjZWl2aW5nIHRoZSBQMlAgSW52aXRhdGlvbiByZXF1ZXN0IHRvIGpvaW4gYW4gZXhpc3RpbmcgUDJQIEdyb3VwLiAqLwogCVAyUF9TVEFURV9SRUNWX0lOVklURV9SRVFfSk9JTiA9IDE5LAotCS8qIHJlY3ZlaW5nIHRoZSBQMlAgSW52aWF0aW9uIHJlc3BvbnNlIHdpdGggZmFpbHVyZSAqLworCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludml0YXRpb24gcmVzcG9uc2Ugd2l0aCBmYWlsdXJlICovCiAJUDJQX1NUQVRFX1JYX0lOVklURV9SRVNQX0ZBSUwgPSAyMCwKLQkvKiByZWNlaXZpbmcgcDJwIG5lZ29pdGF0aW9uIHJlc3BvbnNlIHdpdGggaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSAqLworCS8qIHJlY2VpdmluZyBwMnAgbmVnb3RpYXRpb24gcmVzcG9uc2Ugd2l0aCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlICovCiAJUDJQX1NUQVRFX1JYX0lORk9SX05PUkVBRFkgPSAyMSwKLQkvKiBzZW5kaW5nIHAycCBuZWdvaXRhdGlvbiByZXNwb25zZSB3aXRoIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgKi8KKwkvKiBzZW5kaW5nIHAycCBuZWdvdGlhdGlvbiByZXNwb25zZSB3aXRoIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgKi8KIAlQMlBfU1RBVEVfVFhfSU5GT1JfTk9SRUFEWSA9IDIyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dsYW5fYnNzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaAppbmRleCA1M2IxYmQ4Li44NWI5OWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaApAQCAtMTU2LDE2ICsxNTYsNiBAQAogCU5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCiB9OwogCi0vKiAgS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQgKi8KLXN0cnVjdCBuZGlzXzgwMl8xMV9rZXkgewotCXUzMiAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvKiAgTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCi0JdTMyICAgICAgICAgICBLZXlJbmRleDsKLQl1MzIgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLyogIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBjaGFyIEJTU0lEW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgS2V5UlNDOwotCXU4ICAgICAgICAgICBLZXlNYXRlcmlhbFszMl07ICAvKiB2YXIgbGVuIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZCAqLwotfTsKLQogc3RydWN0IG5kaXNfODAyXzExX3JlbW92ZV9rZXkgewogCXUzMiAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAvKiAgTGVuZ3RoICovCiAJdTMyICAgICAgICAgICAgICAgICAgIEtleUluZGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKaW5kZXggMjRhOGY1YS4uOTZjMWMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCkBAIC0zMiw2ICszMiw4IEBACiAKICNpbmNsdWRlIDxydHdfaW9sLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKICNpbmNsdWRlICJvc2RlcF9pbnRmLmgiCiAKICNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCShTSU9DSVdGSVJTVFBSSVYgKyAzMCkKQEAgLTkyLDcgKzk0LDcgQEAKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSk7CiAKIAl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCiAJREJHXzg4RV9MRVZFTChfZHJ2X2Fsd2F5c18sICJpbmRpY2F0ZSBkaXNhc3NvY1xuIik7CiAJd2lyZWxlc3Nfc2VuZF9ldmVudChwYWRhcHRlci0+cG5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CkBAIC04MjcsNyArODI5LDcgQEAKIAkJZm9yIChqID0gMDsgaiA8IE5VTV9QTUtJRF9DQUNIRTsgaisrKSB7CiAJCQlpZiAoIW1lbWNtcChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3Rbal0uQnNzaWQsIHN0cklzc3VlQnNzaWQsIEVUSF9BTEVOKSkgewogCQkJCS8qICBCU1NJRCBpcyBtYXRjaGVkLCB0aGUgc2FtZSBBUCA9PiBSZW1vdmUgdGhpcyBQTUtJRCBpbmZvcm1hdGlvbiBhbmQgcmVzZXQgaXQuICovCi0JCQkJbWVtc2V0KHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtqXS5Cc3NpZCwgMHgwMCwgRVRIX0FMRU4pOworCQkJCWV0aF96ZXJvX2FkZHIocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2pdLkJzc2lkKTsKIAkJCQlwc2VjdXJpdHlwcml2LT5QTUtJRExpc3Rbal0uYlVzZWQgPSBmYWxzZTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEwMjgsNyArMTAzMCw3IEBACiAKIAl3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAotCW1lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHdycXUtPmFwX2FkZHIuc2FfZGF0YSk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfd3hfZ2V0X3dhcFxuIikpOwogCkBAIC0xMDM3LDcgKzEwMzksNyBAQAogCSAgICAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgPT0gdHJ1ZSkpCiAJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHBjdXJfYnNzLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS0+YXBfYWRkci5zYV9kYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5NiwxMSArMTc5OCw5IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCWludCByZXQ7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAKLQlyZXQgPSBydHdfc2V0X3dwYV9pZShwYWRhcHRlciwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBydHdfc2V0X3dwYV9pZShwYWRhcHRlciwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCBydHdfd3hfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYwppbmRleCAxYjg5MmM0Li5iYWZmMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9tbG1lX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvbWxtZV9saW51eC5jCkBAIC0yOSw5ICsyOSwxMiBAQAogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLQlfaW5pdF90aW1lcigmKHBtbG1lcHJpdi0+YXNzb2NfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgX3J0d19qb2luX3RpbWVvdXRfaGFuZGxlciwgcGFkYXB0ZXIpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlciwgcGFkYXB0ZXIpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT5keW5hbWljX2Noa190aW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGRlciwgcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5keW5hbWljX2Noa190aW1lciwKKwkJICAgIHJ0d19keW5hbWljX2NoZWNrX3RpbWVyX2hhbmRsZGVyLCAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CiB9CiAKIHZvaWQgcnR3X29zX2luZGljYXRlX2Nvbm5lY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCkBAIC02MCw3ICs2Myw2IEBACiAJCS8qICBXZSBoYXZlIHRvIGJhY2t1cCB0aGUgUE1LIGluZm9ybWF0aW9uIGZvciBXaUZpIFBNSyBDYWNoaW5nIHRlc3QgaXRlbS4gKi8KIAkJLyogIEJhY2t1cCB0aGUgYnRraXBfY291bnRlcm1lYXN1cmUgaW5mb3JtYXRpb24uICovCiAJCS8qICBXaGVuIHRoZSBjb3VudGVybWVhc3VyZSBpcyB0cmlnZ2VyLCB0aGUgZHJpdmVyIGhhdmUgdG8gZGlzY29ubmVjdCB3aXRoIEFQIGZvciA2MCBzZWNvbmRzLiAqLwotCQltZW1zZXQoJmJhY2t1cF9wbWtpZFswXSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBydF9wbWtpZF9saXN0KSAqIE5VTV9QTUtJRF9DQUNIRSk7CiAJCW1lbWNweSgmYmFja3VwX3Bta2lkWzBdLCAmYWRhcHRlci0+c2VjdXJpdHlwcml2LlBNS0lETGlzdFswXSwgc2l6ZW9mKHN0cnVjdCBydF9wbWtpZF9saXN0KSAqIE5VTV9QTUtJRF9DQUNIRSk7CiAJCWJhY2t1cF9pbmRleCA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJREluZGV4OwogCQliYWNrdXBfY291bnRlciA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZTsKQEAgLTEzMSwxNSArMTMzLDE4IEBACiAKIHZvaWQgaW5pdF9hZGRiYV9yZXRyeV90aW1lcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKIHsKLQlfaW5pdF90aW1lcigmcHN0YS0+YWRkYmFfcmV0cnlfdGltZXIsIHBhZGFwdGVyLT5wbmV0ZGV2LCBhZGRiYV90aW1lcl9oZGwsIHBzdGEpOworCXNldHVwX3RpbWVyKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lciwgYWRkYmFfdGltZXJfaGRsLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcHN0YSk7CiB9CiAKIHZvaWQgaW5pdF9tbG1lX2V4dF90aW1lcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0CW1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAotCV9pbml0X3RpbWVyKCZwbWxtZWV4dC0+c3VydmV5X3RpbWVyLCBwYWRhcHRlci0+cG5ldGRldiwgc3VydmV5X3RpbWVyX2hkbCwgcGFkYXB0ZXIpOwotCV9pbml0X3RpbWVyKCZwbWxtZWV4dC0+bGlua190aW1lciwgcGFkYXB0ZXItPnBuZXRkZXYsIGxpbmtfdGltZXJfaGRsLCBwYWRhcHRlcik7CisJc2V0dXBfdGltZXIoJnBtbG1lZXh0LT5zdXJ2ZXlfdGltZXIsIHN1cnZleV90aW1lcl9oZGwsCisJCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CisJc2V0dXBfdGltZXIoJnBtbG1lZXh0LT5saW5rX3RpbWVyLCBsaW5rX3RpbWVyX2hkbCwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKIH0KIAogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCmluZGV4IDg4YTkwOWMuLjc1MGM4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYwpAQCAtMzgsNyArMzgsNyBAQAogI2RlZmluZSBSVFdfTk9UQ0hfRklMVEVSIDAgLyogMDpEaXNhYmxlLCAxOkVuYWJsZSwgKi8KIAogLyogbW9kdWxlIHBhcmFtIGRlZmF1bHRzICovCi1zdGF0aWMgaW50IHJ0d19jaGlwX3ZlcnNpb24gPSAweDAwOworc3RhdGljIGludCBydHdfY2hpcF92ZXJzaW9uOwogc3RhdGljIGludCBydHdfcmZpbnRmcyA9IEhXUEk7CiBzdGF0aWMgaW50IHJ0d19sYmttb2RlOy8qIFJUTDg3MTJfQUlSX1RSWDsgKi8KIHN0YXRpYyBpbnQgcnR3X25ldHdvcmtfbW9kZSA9IE5kaXM4MDJfMTFJQlNTOy8qIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsgaW5mcmEsIGFkLWhvYywgYXV0byAqLwpAQCAtOTk4LDcgKzk5OCw4IEBACiAJfQogCXBhZGFwdGVyLT5uZXRfY2xvc2VkID0gZmFsc2U7CiAKLQlfc2V0X3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsIDIwMDApOworCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmR5bmFtaWNfY2hrX3RpbWVyLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKIAogCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKIAlydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcigmcGFkYXB0ZXItPnB3cmN0cmxwcml2KTsKQEAgLTEwNTIsNyArMTA1Myw4IEBACiAJCXBhZGFwdGVyLT5pbnRmX3N0YXJ0KHBhZGFwdGVyKTsKIAogCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCV9zZXRfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lciwgNTAwMCk7CisJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpOwogCiAJIHJldHVybiBfU1VDQ0VTUzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCmluZGV4IDA1NDI3YzQuLjA1NzAxMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKQEAgLTE5Myw3ICsxOTMsOCBAQAogCiB2b2lkIHJ0d19pbml0X3JlY3ZfdGltZXIoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsKQogewotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZW9yZGVyX2N0cmwtPnBhZGFwdGVyOwogCi0JX2luaXRfdGltZXIoJihwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIsIHByZW9yZGVyX2N0cmwpOworCXNldHVwX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCisJCSAgICBydHdfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXByZW9yZGVyX2N0cmwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKaW5kZXggYmVlMzljMi4uZWYzYzczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCkBAIC0xNzksNyArMTc5LDcgQEAKIHsKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIit1c2JfaW50Zl9zdG9wXG4iKSk7CiAKLQkvKiBkaXNhYmVsX2h3X2ludGVycnVwdCAqLworCS8qIGRpc2FibGVfaHdfaW50ZXJydXB0ICovCiAJaWYgKCFwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewogCQkvKiBkZXZpY2Ugc3RpbGwgZXhpc3RzLCBzbyBkcml2ZXIgY2FuIGRvIGkvbyBvcGVyYXRpb24gKi8KIAkJLyogVE9ETzogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwppbmRleCA4MGU3ZWY5Li43ZTU5OWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCkBAIC01MzAsNiArNTMwLDcgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOworCiAJcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcGFkYXB0ZXItPnJlY3Zwcml2LnByZWN2X2J1ZjsKIAogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CkBAIC01NTIsNyArNTUzLDYgQEAKIAl1MTYgaW5kZXg7CiAJdTE2IGxlbjsKIAl1OCBkYXRhOwotCWludCByZXQ7CiAKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDA7Lyogd3JpdGVfb3V0ICovCkBAIC01NjAsOCArNTYwLDggQEAKIAl3dmFsdWUgPSAodTE2KShhZGRyJjB4MDAwMGZmZmYpOwogCWxlbiA9IDE7CiAJZGF0YSA9IHZhbDsKLQlyZXQgPSB1c2JjdHJsX3ZlbmRvcnJlcShhZGFwdGVyLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdXNiY3RybF92ZW5kb3JyZXEoYWRhcHRlciwgcmVxdWVzdCwgd3ZhbHVlLAorCQkJCSBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogfQogCiBpbnQgdXNiX3dyaXRlMTYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MTYgdmFsKQpAQCAtNTcyLDcgKzU3Miw2IEBACiAJdTE2IGluZGV4OwogCXUxNiBsZW47CiAJX19sZTMyIGRhdGE7Ci0JaW50IHJldDsKIAogCiAJcmVxdWVzdCA9IDB4MDU7CkBAIC01ODQsMTAgKzU4MywxMCBAQAogCiAJZGF0YSA9IGNwdV90b19sZTMyKHZhbCAmIDB4MDAwMGZmZmYpOwogCi0JcmV0ID0gdXNiY3RybF92ZW5kb3JyZXEoYWRhcHRlciwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOworCXJldHVybiB1c2JjdHJsX3ZlbmRvcnJlcShhZGFwdGVyLCByZXF1ZXN0LCB3dmFsdWUsCisJCQkJIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7CiAKIAotCXJldHVybiByZXQ7CiB9CiAKIGludCB1c2Jfd3JpdGUzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiB2YWwpCkBAIC01OTgsNyArNTk3LDYgQEAKIAl1MTYgaW5kZXg7CiAJdTE2IGxlbjsKIAlfX2xlMzIgZGF0YTsKLQlpbnQgcmV0OwogCiAKIAlyZXF1ZXN0ID0gMHgwNTsKQEAgLTYwOSwxMCArNjA3LDEwIEBACiAJbGVuID0gNDsKIAlkYXRhID0gY3B1X3RvX2xlMzIodmFsKTsKIAotCXJldCA9IHVzYmN0cmxfdmVuZG9ycmVxKGFkYXB0ZXIsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKKwlyZXR1cm4gdXNiY3RybF92ZW5kb3JyZXEoYWRhcHRlciwgcmVxdWVzdCwgd3ZhbHVlLAorCQkJCSBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogCiAKLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCB1c2Jfd3JpdGVfcG9ydF9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaAppbmRleCBlZWVhNTAyNi4uYWFkMzM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaApAQCAtNzQsMTYgKzc0LDExIEBACiAJKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuID4gMCkKIAogI2RlZmluZSBJU19FUVVBTF9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKQkJXAotCSBlcU1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkKKwkgZXRoZXJfYWRkcl9lcXVhbF91bmFsaWduZWQoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBcCisJX19wVGEpCiAjZGVmaW5lIFVQREFURV9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKQkJXAogCWNwTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQogCi0jZGVmaW5lIElTX0NPVU5UUllfSUVfQ0hBTkdFRChfX3BJZWVlRGV2LCBfX0llKSBcCi0JKCgoX19JZSkuTGVuZ3RoID09IDAgfHwgKF9fSWUpLkxlbmd0aCAhPQlcCi0JR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8JXAotCWZhbHNlIDogKCFtZW1jbXAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVCdWYsCVwKLQkoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkKLQogI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQogI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpCQkJCVwKIAkgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTBQX3J0bDgyNTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MFBfcnRsODI1Ni5jCmluZGV4IDBlNmJkZDIuLjAxZDIyMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MFBfcnRsODI1Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MFBfcnRsODI1Ni5jCkBAIC00Nyw4ICs0Nyw4IEBACiAJCQkJCQkweDBlLCBiTWFzazEyQml0cywgMHgwMjEpOwogCiAJCQl9IGVsc2UgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiUEhZX1NldFJGODI1NkJhbmR3aWR0aCgpOiAiCi0JCQkJCSAidW5rbm93biBoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CiAJCQl9CiAKIAkJCWJyZWFrOwpAQCAtNjYsMTUgKzY2LDE2IEBACiAJCQkJCQkgMHgwZSwgYk1hc2sxMkJpdHMsIDB4MGUxKTsKIAogCQkJfSBlbHNlIHsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogIgotCQkJCQkgInVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJCSAiUEhZX1NldFJGODI1NkJhbmR3aWR0aCgpOiB1bmtub3duIGhhcmR3YXJlIHZlcnNpb25cbiIpOwogCQkJfQogCiAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gIgotCQkJCSAiQmFuZHdpZHRoOiAlI1hcbiIsIEJhbmR3aWR0aCk7CisJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biBCYW5kd2lkdGg6ICUjWFxuIiwKKwkJCQkgQmFuZHdpZHRoKTsKIAkJCWJyZWFrOwogCiAJCX0KQEAgLTEzOCw4ICsxMzksOSBAQAogCQlydFN0YXR1cyA9IHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihkZXYsIEhXOTBfQkxPQ0tfUkYsCiAJCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCk7CiAJCWlmICghcnRTdGF0dXMpIHsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiUEhZX1JGODI1Nl9Db25maWcoKTpDaGVjayAiCi0JCQkJICJSYWRpb1slZF0gRmFpbCEhXG4iLCBlUkZQYXRoKTsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCSAiUEhZX1JGODI1Nl9Db25maWcoKTpDaGVjayBSYWRpb1slZF0gRmFpbCEhXG4iLAorCQkJCSBlUkZQYXRoKTsKIAkJCWdvdG8gcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDsKIAkJfQogCkBAIC0xNTUsOSArMTU3LDEwIEBACiAJCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCiAJCQkJCQkgUmVnT2ZmU2V0VG9CZUNoZWNrLAogCQkJCQkJIGJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgIgotCQkJCQkgInZhbHVlOiAleFxuIiwgZVJGUGF0aCwKLQkJCQkJIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLAorCQkJCQkgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwKKwkJCQkJIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywKKwkJCQkJIFJGM19GaW5hbF9WYWx1ZSk7CiAJCQkJUmV0cnlUaW1lcy0tOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xNzAsOSArMTczLDEwIEBACiAJCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCiAJCQkJCQkgUmVnT2ZmU2V0VG9CZUNoZWNrLAogCQkJCQkJIGJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgIgotCQkJCQkgInZhbHVlOiAleFxuIiwgZVJGUGF0aCwKLQkJCQkJICBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwKKwkJCQkJICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsCisJCQkJCSBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssCisJCQkJCSBSRjNfRmluYWxfVmFsdWUpOwogCQkJCVJldHJ5VGltZXMtLTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTg1LDkgKzE4OSwxMCBAQAogCQkJCQkJKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCiAJCQkJCQlSZWdPZmZTZXRUb0JlQ2hlY2ssCiAJCQkJCQliTWFzazEyQml0cyk7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9SRiwgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsICIKLQkJCQkJICJ2YWx1ZTogJXhcbiIsIGVSRlBhdGgsCi0JCQkJCSBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwKKwkJCQkJICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsCisJCQkJCSBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssCisJCQkJCSBSRjNfRmluYWxfVmFsdWUpOwogCQkJCVJldHJ5VGltZXMtLTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTk5LDkgKzIwNCwxMCBAQAogCQkJCVJGM19GaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LAogCQkJCQkgICAgICAgKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCiAJCQkJCSAgICAgICBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgIgotCQkJCQkgInZhbHVlOiAleFxuIiwgZVJGUGF0aCwKLQkJCQkJICBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwKKwkJCQkJICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsCisJCQkJCSBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssCisJCQkJCSBSRjNfRmluYWxfVmFsdWUpOwogCQkJCVJldHJ5VGltZXMtLTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjIxLDggKzIyNyw5IEBACiAJCX0KIAogCQlpZiAocmV0KSB7Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKCk6IgotCQkJCSAiUmFkaW9bJWRdIEZhaWwhISIsIGVSRlBhdGgpOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICJwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZSgpOlJhZGlvWyVkXSBGYWlsISEiLAorCQkJCSBlUkZQYXRoKTsKIAkJCWdvdG8gcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuYwppbmRleCAyYjE0MzBkLi5lY2RkMmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2NtZHBrdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfY21kcGt0LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogCWRvIHsKIAkJaWYgKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKLQkJCWZyYWdfbGVuZ3RoID0gZnJhZ190aHJlc2hvbGQgOworCQkJZnJhZ19sZW5ndGggPSBmcmFnX3RocmVzaG9sZDsKIAkJCWJMYXN0SW5pUGt0ID0gMDsKIAogCQl9IGVsc2UgewpAQCAtMTY1LDcgKzE2NSw3IEBACiAKIHN0YXRpYyB2b2lkIGNtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnBtc2cpCiB7Ci0Jc3RydWN0IGNtcGtfaW50cl9zdGEgcnhfaW50cl9zdGF0dXM7CS8qICovCisJc3RydWN0IGNtcGtfaW50cl9zdGEgcnhfaW50cl9zdGF0dXM7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCiAJRE1FU0coIi0tLT4gY21wa19IYW5kbGVfSW50ZXJydXB0X1N0YXR1cygpXG4iKTsKQEAgLTMzMiw0NCArMzMyLDQ0IEBACiAKIAkJc3dpdGNoIChlbGVtZW50X2lkKSB7CiAJCWNhc2UgUlhfVFhfRkVFREJBQ0s6Ci0JCQlSVF9UUkFDRShDT01QX0NNRFBLVCwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOiIKLQkJCQkgIlJYX1RYX0ZFRURCQUNLXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfQ01EUEtULAorCQkJCSAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6UlhfVFhfRkVFREJBQ0tcbiIpOwogCQkJY21wa19oYW5kbGVfdHhfZmVlZGJhY2soZGV2LCBwY21kX2J1ZmYpOwogCQkJY21kX2xlbmd0aCA9IENNUEtfUlhfVFhfRkJfU0laRTsKIAkJCWJyZWFrOwogCQljYXNlIFJYX0lOVEVSUlVQVF9TVEFUVVM6Ci0JCQlSVF9UUkFDRShDT01QX0NNRFBLVCwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOiIKLQkJCQkgIlJYX0lOVEVSUlVQVF9TVEFUVVNcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsCisJCQkJICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpSWF9JTlRFUlJVUFRfU1RBVFVTXG4iKTsKIAkJCWNtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMoZGV2LCBwY21kX2J1ZmYpOwogCQkJY21kX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgY21wa19pbnRyX3N0YSk7CiAJCQlicmVhazsKIAkJY2FzZSBCT1RIX1FVRVJZX0NPTkZJRzoKLQkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgotCQkJCSAiQk9USF9RVUVSWV9DT05GSUdcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsCisJCQkJICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpCT1RIX1FVRVJZX0NPTkZJR1xuIik7CiAJCQljbXBrX2hhbmRsZV9xdWVyeV9jb25maWdfcngoZGV2LCBwY21kX2J1ZmYpOwogCQkJY21kX2xlbmd0aCA9IENNUEtfQk9USF9RVUVSWV9DT05GSUdfU0laRTsKIAkJCWJyZWFrOwogCQljYXNlIFJYX1RYX1NUQVRVUzoKLQkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgotCQkJCSAiUlhfVFhfU1RBVFVTXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfQ01EUEtULAorCQkJCSAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6UlhfVFhfU1RBVFVTXG4iKTsKIAkJCWNtcGtfaGFuZGxlX3R4X3N0YXR1cyhkZXYsIHBjbWRfYnVmZik7CiAJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9TVFNfU0laRTsKIAkJCWJyZWFrOwogCQljYXNlIFJYX1RYX1BFUl9QS1RfRkVFREJBQ0s6Ci0JCQlSVF9UUkFDRShDT01QX0NNRFBLVCwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOiIKLQkJCQkgIlJYX1RYX1BFUl9QS1RfRkVFREJBQ0tcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsCisJCQkJICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpSWF9UWF9QRVJfUEtUX0ZFRURCQUNLXG4iKTsKIAkJCWNtZF9sZW5ndGggPSBDTVBLX1JYX1RYX0ZCX1NJWkU7CiAJCQlicmVhazsKIAkJY2FzZSBSWF9UWF9SQVRFX0hJU1RPUlk6Ci0JCQlSVF9UUkFDRShDT01QX0NNRFBLVCwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOiIKLQkJCQkgIlJYX1RYX0hJU1RPUllcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsCisJCQkJICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpSWF9UWF9ISVNUT1JZXG4iKTsKIAkJCWNtcGtfaGFuZGxlX3R4X3JhdGVfaGlzdG9yeShkZXYsIHBjbWRfYnVmZik7CiAJCQljbWRfbGVuZ3RoID0gQ01QS19UWF9SQUhJU19TSVpFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAKLQkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgotCQkJCSAidW5rbm93biBDTUQgRWxlbWVudFxuIik7CisJCQlSVF9UUkFDRShDT01QX0NNRFBLVCwKKwkJCQkgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOnVua25vd24gQ01EIEVsZW1lbnRcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfY21kcGt0LmgKaW5kZXggMjMyMTllMS4uMjY5MzY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2NtZHBrdC5oCkBAIC0zMywyOCArMzMsMjggQEAKIHN0cnVjdCBjbXBrX3R4ZmIgewogCXU4CWVsZW1lbnRfaWQ7CiAJdTgJbGVuZ3RoOwotCXU4CVRJRDo0OwkJCQkvKiAqLwotCXU4CWZhaWxfcmVhc29uOjM7CQkvKiAqLworCXU4CVRJRDo0OworCXU4CWZhaWxfcmVhc29uOjM7CiAJdTgJdG9rOjE7Ci0JdTgJcmVzZXJ2ZTE6NDsJCQkvKiAqLwotCXU4CXBrdF90eXBlOjI7CQkvKiAqLwotCXU4CWJhbmR3aWR0aDoxOwkJLyogKi8KLQl1OAlxb3NfcGt0OjE7CQkJLyogKi8KKwl1OAlyZXNlcnZlMTo0OworCXU4CXBrdF90eXBlOjI7CisJdTgJYmFuZHdpZHRoOjE7CisJdTgJcW9zX3BrdDoxOwogCi0JdTgJcmVzZXJ2ZTI7CQkJLyogKi8KLQl1OAlyZXRyeV9jbnQ7CQkJLyogKi8KLQl1MTYJcGt0X2lkOwkJCQkvKiAqLworCXU4CXJlc2VydmUyOworCXU4CXJldHJ5X2NudDsKKwl1MTYJcGt0X2lkOwogCi0JdTE2CXNlcV9udW07CQkJLyogKi8KKwl1MTYJc2VxX251bTsKIAl1OAlzX3JhdGU7CiAJdTgJZl9yYXRlOwogCi0JdTgJc19ydHNfcmF0ZTsJCQkvKiAqLwotCXU4CWZfcnRzX3JhdGU7CQkJLyogKi8KLQl1MTYJcGt0X2xlbmd0aDsJCQkvKiAqLworCXU4CXNfcnRzX3JhdGU7CisJdTgJZl9ydHNfcmF0ZTsKKwl1MTYJcGt0X2xlbmd0aDsKIAotCXUxNglyZXNlcnZlMzsJCQkvKiAqLwotCXUxNglkdXJhdGlvbjsJCQkvKiAqLworCXUxNglyZXNlcnZlMzsKKwl1MTYJZHVyYXRpb247CiB9OwogCiBzdHJ1Y3QgY21wa19pbnRyX3N0YSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9kZXYuYwppbmRleCA1NTJkOTQzLi4yODY5NjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZGV2LmMKQEAgLTIyNCw4ICsyMjQsOCBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0lORk8gIlNldEh3UmVnODE4NSgpOiBpbnZhbGlkIEFDSTogJWQgIVxuIiwKLQkJCSAgICAgICBlQUNJKTsKKwkJCW5ldGRldl9pbmZvKGRldiwgIlNldEh3UmVnODE4NSgpOiBpbnZhbGlkIEFDSTogJWQgIVxuIiwKKwkJCQkgICAgZUFDSSk7CiAJCQlicmVhazsKIAkJfQogCQlwcml2LT5ydGxsaWItPlNldEh3UmVnSGFuZGxlcihkZXYsIEhXX1ZBUl9BQ01fQ1RSTCwKQEAgLTI2Myw5ICsyNjMsOSBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCVJUX1RSQUNFKENPTVBfUU9TLCAiU2V0SHdSZWc4MTg1KCk6IFtIV19WQVJfIgotCQkJCQkgIkFDTV9DVFJMXSBhY20gc2V0IGZhaWxlZDogZUFDSSBpcyAiCi0JCQkJCSAiJWRcbiIsIGVBQ0kpOworCQkJCVJUX1RSQUNFKENPTVBfUU9TLAorCQkJCQkgIlNldEh3UmVnODE4NSgpOiBbSFdfVkFSX0FDTV9DVFJMXSBhY20gc2V0IGZhaWxlZDogZUFDSSBpcyAlZFxuIiwKKwkJCQkJIGVBQ0kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMjg3LDggKzI4Nyw5IEBACiAJCQl9CiAJCX0KIAotCQlSVF9UUkFDRShDT01QX1FPUywgIlNldEh3UmVnODE5MHBjaSgpOiBbSFdfVkFSX0FDTV9DVFJMXSBXcml0ZSIKLQkJCSAiIDB4JVhcbiIsIEFjbUN0cmwpOworCQlSVF9UUkFDRShDT01QX1FPUywKKwkJCSAiU2V0SHdSZWc4MTkwcGNpKCk6IFtIV19WQVJfQUNNX0NUUkxdIFdyaXRlIDB4JVhcbiIsCisJCQkgQWNtQ3RybCk7CiAJCXdyaXRlX25pY19ieXRlKGRldiwgQWNtSHdDdHJsLCBBY21DdHJsKTsKIAkJYnJlYWs7CiAJfQpAQCAtMzM0LDE3ICszMzUsMTcgQEAKIAl9CiAKIAlpZiAoIXByaXYtPkF1dG9sb2FkRmFpbEZsYWcpIHsKLQkJcHJpdi0+ZWVwcm9tX3ZpZCA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1ZJRCA+PiAxKSk7Ci0JCXByaXYtPmVlcHJvbV9kaWQgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9ESUQgPj4gMSkpOworCQlwcml2LT5lZXByb21fdmlkID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9WSUQgPj4gMSk7CisJCXByaXYtPmVlcHJvbV9kaWQgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX0RJRCA+PiAxKTsKIAogCQl1c1ZhbHVlID0gZXByb21fcmVhZChkZXYsICh1MTYpKEVFUFJPTV9DdXN0b21lcl9JRD4+MSkpID4+IDg7CiAJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gKHU4KSh1c1ZhbHVlICYgMHhmZik7Ci0JCXVzVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9JQ1ZlcnNpb25fQ2hhbm5lbFBsYW4+PjEpKTsKKwkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fSUNWZXJzaW9uX0NoYW5uZWxQbGFuPj4xKTsKIAkJcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuID0gdXNWYWx1ZSYweGZmOwotCQlJQ19WZXJzaW9uID0gKCh1c1ZhbHVlJjB4ZmYwMCk+PjgpOworCQlJQ19WZXJzaW9uID0gKHVzVmFsdWUgJiAweGZmMDApPj44OwogCiAJCUlDVmVyODE5MiA9IChJQ19WZXJzaW9uJjB4Zik7Ci0JCUlDVmVyODI1NiA9ICgoSUNfVmVyc2lvbiYweGYwKT4+NCk7CisJCUlDVmVyODI1NiA9IChJQ19WZXJzaW9uICYgMHhmMCk+PjQ7CiAJCVJUX1RSQUNFKENPTVBfSU5JVCwgIlxuSUNWZXI4MTkyID0gMHgleFxuIiwgSUNWZXI4MTkyKTsKIAkJUlRfVFJBQ0UoQ09NUF9JTklULCAiXG5JQ1ZlcjgyNTYgPSAweCV4XG4iLCBJQ1ZlcjgyNTYpOwogCQlpZiAoSUNWZXI4MTkyID09IDB4MikgewpAQCAtNDI0LDcgKzQyNSw3IEBACiAJCWlmIChwcml2LT5lcHJvbXR5cGUgPT0gRUVQUk9NXzkzQzQ2KSB7CiAJCQlpZiAoIXByaXYtPkF1dG9sb2FkRmFpbEZsYWcpIHsKIAkJCQl1c1ZhbHVlID0gZXByb21fcmVhZChkZXYsCi0JCQkJCSAgKEVFUFJPTV9UeFB3RGlmZl9DcnlzdGFsQ2FwID4+IDEpKTsKKwkJCQkJICBFRVBST01fVHhQd0RpZmZfQ3J5c3RhbENhcCA+PiAxKTsKIAkJCQlwcml2LT5FRVBST01BbnRQd0RpZmYgPSAodXNWYWx1ZSYweDBmZmYpOwogCQkJCXByaXYtPkVFUFJPTUNyeXN0YWxDYXAgPSAodTgpKCh1c1ZhbHVlICYgMHhmMDAwKQogCQkJCQkJCSA+PiAxMik7CkBAIC00NDgsMTIgKzQ0OSwxMiBAQAogCQkJCQl1c1ZhbHVlID0gRUVQUk9NX0RlZmF1bHRfVHhQb3dlcjsKIAkJCQkqKCh1MTYgKikoJnByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpXSkpID0KIAkJCQkJCQkJIHVzVmFsdWU7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiQ0NLIFR4IFBvd2VyIExldmVsLCBJbmRleCIKLQkJCQkJICIgJWQgPSAweCUwMnhcbiIsIGksCi0JCQkJCSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tbaV0pOwotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIkNDSyBUeCBQb3dlciBMZXZlbCwgSW5kZXgiCi0JCQkJCSAiICVkID0gMHglMDJ4XG4iLCBpKzEsCi0JCQkJCSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tbaSsxXSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULAorCQkJCQkgIkNDSyBUeCBQb3dlciBMZXZlbCwgSW5kZXggJWQgPSAweCUwMnhcbiIsCisJCQkJCSBpLCBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tbaV0pOworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwKKwkJCQkJICJDQ0sgVHggUG93ZXIgTGV2ZWwsIEluZGV4ICVkID0gMHglMDJ4XG4iLAorCQkJCQkgaSsxLCBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tbaSsxXSk7CiAJCQl9CiAJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkgKz0gMikgewogCQkJCWlmICghcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykKQEAgLTQ2NCwxMSArNDY1LDEyIEBACiAJCQkJCXVzVmFsdWUgPSBFRVBST01fRGVmYXVsdF9UeFBvd2VyOwogCQkJCSooKHUxNiAqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1tpXSkpCiAJCQkJCQkJID0gdXNWYWx1ZTsKLQkJCQlSVF9UUkFDRShDT01QX0lOSVQsICJPRkRNIDIuNEcgVHggUG93ZXIgTGV2ZWwsIgotCQkJCQkgIiBJbmRleCAlZCA9IDB4JTAyeFxuIiwgaSwKLQkJCQkJIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbaV0pOwotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9GRE0gMi40RyBUeCBQb3dlciBMZXZlbCwiCi0JCQkJCSAiIEluZGV4ICVkID0gMHglMDJ4XG4iLCBpICsgMSwKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsCisJCQkJCSAiT0ZETSAyLjRHIFR4IFBvd2VyIExldmVsLCBJbmRleCAlZCA9IDB4JTAyeFxuIiwKKwkJCQkJIGksIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbaV0pOworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwKKwkJCQkJICJPRkRNIDIuNEcgVHggUG93ZXIgTGV2ZWwsIEluZGV4ICVkID0gMHglMDJ4XG4iLAorCQkJCQkgaSArIDEsCiAJCQkJCSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHW2krMV0pOwogCQkJfQogCQl9CkBAIC00ODMsMTUgKzQ4NSwxNSBAQAogCQkJCQkgcHJpdi0+RUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZjsKIAkJCXByaXYtPkFudGVubmFUeFB3RGlmZlswXSA9IChwcml2LT5FRVBST01BbnRQd0RpZmYgJgogCQkJCQkJICAgIDB4Zik7Ci0JCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV0gPSAoKHByaXYtPkVFUFJPTUFudFB3RGlmZiAmCi0JCQkJCQkgICAgMHhmMCk+PjQpOwotCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzJdID0gKChwcml2LT5FRVBST01BbnRQd0RpZmYgJgotCQkJCQkJICAgIDB4ZjAwKT4+OCk7CisJCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV0gPSAocHJpdi0+RUVQUk9NQW50UHdEaWZmICYKKwkJCQkJCQkweGYwKSA+PiA0OworCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzJdID0gKHByaXYtPkVFUFJPTUFudFB3RGlmZiAmCisJCQkJCQkJMHhmMDApID4+IDg7CiAJCQlwcml2LT5DcnlzdGFsQ2FwID0gcHJpdi0+RUVQUk9NQ3J5c3RhbENhcDsKIAkJCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IChwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgJgogCQkJCQkJIDB4Zik7Ci0JCQlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSAoKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCi0JCQkJCQkgMHhmMCk+PjQpOworCQkJcHJpdi0+VGhlcm1hbE1ldGVyWzFdID0gKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCisJCQkJCQkgICAgIDB4ZjApID4+IDQ7CiAJCX0gZWxzZSBpZiAocHJpdi0+ZXByb210eXBlID09IEVFUFJPTV85M0M1NikgewogCiAJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CkBAIC01MjUsMjEgKzUyNywyMSBAQAogCQkJCQkgcHJpdi0+RUVQUk9NUmZDT2ZkbUNobmxUeFB3TGV2ZWxbMl07CiAJCQl9CiAJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKLQkJCQlSVF9UUkFDRShDT01QX0lOSVQsICJwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQSIKLQkJCQkJICJbJWRdID0gMHgleFxuIiwgaSwKLQkJCQkJIHByaXYtPlR4UG93ZXJMZXZlbENDS19BW2ldKTsKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsCisJCQkJCSAicHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbJWRdID0gMHgleFxuIiwKKwkJCQkJIGksIHByaXYtPlR4UG93ZXJMZXZlbENDS19BW2ldKTsKIAkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgInByaXYtPlR4UG93ZXJMZXZlbE9GRE0iCi0JCQkJCSAiMjRHX0FbJWRdID0gMHgleFxuIiwgaSwKLQkJCQkJIHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQVtpXSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULAorCQkJCQkgInByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQVslZF0gPSAweCV4XG4iLAorCQkJCQkgaSwgcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BW2ldKTsKIAkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgInByaXYtPlR4UG93ZXJMZXZlbENDS19DIgotCQkJCQkgIlslZF0gPSAweCV4XG4iLCBpLAotCQkJCQkgcHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbaV0pOworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwKKwkJCQkJICJwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQ1slZF0gPSAweCV4XG4iLAorCQkJCQkgaSwgcHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbaV0pOwogCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCi0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAicHJpdi0+VHhQb3dlckxldmVsT0ZETSIKLQkJCQkJICIyNEdfQ1slZF0gPSAweCV4XG4iLCBpLAotCQkJCQkgcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19DW2ldKTsKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsCisJCQkJCSAicHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19DWyVkXSA9IDB4JXhcbiIsCisJCQkJCSBpLCBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbaV0pOwogCQkJcHJpdi0+TGVnYWN5SFRUeFBvd2VyRGlmZiA9CiAJCQkJIHByaXYtPkVFUFJPTUxlZ2FjeUhUVHhQb3dlckRpZmY7CiAJCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0gPSAwOwpAQCAtNTQ4LDggKzU1MCw4IEBACiAJCQlwcml2LT5DcnlzdGFsQ2FwID0gcHJpdi0+RUVQUk9NQ3J5c3RhbENhcDsKIAkJCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IChwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgJgogCQkJCQkJIDB4Zik7Ci0JCQlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSAoKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCi0JCQkJCQkgMHhmMCk+PjQpOworCQkJcHJpdi0+VGhlcm1hbE1ldGVyWzFdID0gKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCisJCQkJCQkgICAgIDB4ZjApID4+IDQ7CiAJCX0KIAl9CiAKQEAgLTczNSw4ICs3MzcsOSBAQAogCWVsc2UgaWYgKHByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID09IEZXX1NUQVRVU181X1JFQURZKQogCQl1bFJlZ1JlYWQgfD0gQ1BVX0dFTl9GSVJNV0FSRV9SRVNFVDsKIAllbHNlCi0JCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJST1IgaW4gJXMoKTogdW5kZWZpbmVkIGZpcm13YXJlIHN0YXRlKCVkKSIKLQkJCSAiXG4iLCBfX2Z1bmNfXywgICBwcml2LT5wRmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyk7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICJFUlJPUiBpbiAlcygpOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGUoJWQpXG4iLAorCQkJIF9fZnVuY19fLCAgIHByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzKTsKIAogCXdyaXRlX25pY19kd29yZChkZXYsIENQVV9HRU4sIHVsUmVnUmVhZCk7CiAKQEAgLTc2Niw4ICs3NjksOCBAQAogCQllbHNlIGlmIChwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5WF9NQUNfTE9PUEJBQ0spCiAJCQl1bFJlZ1JlYWQgfD0gQ1BVX0NDS19MT09QQkFDSzsKIAkJZWxzZQotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXJpb3VzIGVycm9yOiB3cm9uZyBsb29wYmFjayIKLQkJCQkgIiBtb2RlIHNldHRpbmdcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICJTZXJpb3VzIGVycm9yOiB3cm9uZyBsb29wYmFjayBtb2RlIHNldHRpbmdcbiIpOwogCiAJCXdyaXRlX25pY19kd29yZChkZXYsIENQVV9HRU4sIHVsUmVnUmVhZCk7CiAKQEAgLTg4MywxNSArODg2LDE1IEBACiAJCQkgIF9fZnVuY19fKTsKIAkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9mZiwgUkZfQ0hBTkdFX0JZX1NXLCB0cnVlKTsKIAl9IGVsc2UgaWYgKHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfUFMpIHsKLQkJUlRfVFJBQ0UoKENPTVBfSU5JVHxDT01QX1JGfENPTVBfUE9XRVIpLCAiJXMoKTogVHVybiBvZmYgUkYgZm9yIgotCQkJICIgUmZPZmZSZWFzb24oJWQpIC0tLS0tLS0tLS1cbiIsIF9fZnVuY19fLAotCQkJIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24pOworCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkZ8Q09NUF9QT1dFUiksCisJCQkgIiVzKCk6IFR1cm4gb2ZmIFJGIGZvciBSZk9mZlJlYXNvbiglZCkgLS0tLS0tLS0tLVxuIiwKKwkJCSBfX2Z1bmNfXywgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbik7CiAJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPZmYsIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24sCiAJCQkJICAgIHRydWUpOwogCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiA+PSBSRl9DSEFOR0VfQllfSVBTKSB7Ci0JCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRnxDT01QX1BPV0VSKSwgIiVzKCk6IFR1cm4gb2ZmIFJGIGZvciIKLQkJCSAiIFJmT2ZmUmVhc29uKCVkKSAtLS0tLS0tLS0tXG4iLCBfX2Z1bmNfXywKLQkJCSBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uKTsKKwkJUlRfVFJBQ0UoKENPTVBfSU5JVHxDT01QX1JGfENPTVBfUE9XRVIpLAorCQkJICIlcygpOiBUdXJuIG9mZiBSRiBmb3IgUmZPZmZSZWFzb24oJWQpIC0tLS0tLS0tLS1cbiIsCisJCQkgX19mdW5jX18sIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24pOwogCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT2ZmLCBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uLAogCQkJCSAgICB0cnVlKTsKIAl9IGVsc2UgewpAQCAtOTM5LDE3ICs5NDIsMTcgQEAKIAkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA9IDA7CiAJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0KIAkJCQkgIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlciIKLQkJCQkgInRyYWNraW5naW5kZXhfaW5pdGlhbCA9ICVkXG4iLAorCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9pbml0aWFsID0gJWRcbiIsCiAJCQkJIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXIiCi0JCQkJICJ0cmFja2luZ2luZGV4X3JlYWxfX2luaXRpYWwgPSAlZFxuIiwKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF9faW5pdGlhbCA9ICVkXG4iLAogCQkJCSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCk7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Q0NLUHJlc2VudCIKLQkJCQkgIkF0dGVudHVhdGlvbl9kaWZmZXJlbmNlX2luaXRpYWwgPSAlZFxuIiwKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2VfaW5pdGlhbCA9ICVkXG4iLAogCQkJCSAgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlKTsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5DQ0tQcmVzZW50IgotCQkJCSAiQXR0ZW50dWF0aW9uX2luaXRpYWwgPSAlZFxuIiwKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2luaXRpYWwgPSAlZFxuIiwKIAkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbik7CiAJCQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IGZhbHNlOwogCQl9CkBAIC0xMTY5LDggKzExNzIsOSBAQAogCQlRdWV1ZVNlbGVjdCA9IFFTTFRfSElHSDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJUcmFuc21pdFRDQigpOiBJbXBvc3NpYmxlIFF1ZXVlIFNlbGVjdGlvbjoiCi0JCQkgIiAlZFxuIiwgUXVldWVJRCk7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICJUcmFuc21pdFRDQigpOiBJbXBvc3NpYmxlIFF1ZXVlIFNlbGVjdGlvbjogJWRcbiIsCisJCQkgUXVldWVJRCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gUXVldWVTZWxlY3Q7CkBAIC0xMzYxLDkgKzEzNjUsMTAgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlSVF9UUkFDRShDT01QX1JFQ1YsICJId1JhdGVUb01SYXRlOTAoKTogTm9uIHN1cHBvcnRlZCIKLQkJCQkgIlJhdGUgWyV4XSwgYklzSFQgPSAlZCEhIVxuIiwgcmF0ZSwgYklzSFQpOwotCQkJCQkJICBicmVhazsKKwkJCVJUX1RSQUNFKENPTVBfUkVDViwKKwkJCQkgIkh3UmF0ZVRvTVJhdGU5MCgpOiBOb24gc3VwcG9ydGVkUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLAorCQkJCSByYXRlLCBiSXNIVCk7CisJCQlicmVhazsKIAkJfQogCiAJfSBlbHNlIHsKQEAgLTE0MjEsOCArMTQyNiw5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJUlRfVFJBQ0UoQ09NUF9SRUNWLCAiSHdSYXRlVG9NUmF0ZTkwKCk6IE5vbiBzdXBwb3J0ZWQgIgotCQkJCSAiUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLCByYXRlLCBiSXNIVCk7CisJCQlSVF9UUkFDRShDT01QX1JFQ1YsCisJCQkJICJId1JhdGVUb01SYXRlOTAoKTogTm9uIHN1cHBvcnRlZCBSYXRlIFsleF0sIGJJc0hUID0gJWQhISFcbiIsCisJCQkJIHJhdGUsIGJJc0hUKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTUyNyw3ICsxNTMzLDcgQEAKIAkJcHJpdi0+c3RhdHMubnVtcXJ5X3BoeXN0YXR1c0NDSysrOwogCQlpZiAoIXJlZzgyNF9iaXQ5KSB7CiAJCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweGMwOwotCQkJcmVwb3J0ID0gcmVwb3J0Pj42OworCQkJcmVwb3J0ID4+PSA2OwogCQkJc3dpdGNoIChyZXBvcnQpIHsKIAkJCWNhc2UgMHgzOgogCQkJCXJ4X3B3cl9hbGwgPSAtMzUgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYKQEAgLTE1NDcsNyArMTU1Myw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDYwOwotCQkJcmVwb3J0ID0gcmVwb3J0Pj41OworCQkJcmVwb3J0ID4+PSA1OwogCQkJc3dpdGNoIChyZXBvcnQpIHsKIAkJCWNhc2UgMHgzOgogCQkJCXJ4X3B3cl9hbGwgPSAtMzUgLQpAQCAtMTczNyw4ICsxNzQzLDggQEAKIAkJCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHByaXYtPnJ0bGxpYi0+ZGV2LAogCQkJICAgIHJmcGF0aCkpCiAJCQkJY29udGludWU7Ci0JCQlSVF9UUkFDRShDT01QX0RCRywgIkphY2tlbiAtPiBwUHJldmlvdXNzdGF0cy0+UnhNSU1PIgotCQkJCSAiU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSAgPSAlZFxuIiwKKwkJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJCSAiSmFja2VuIC0+IHBQcmV2aW91c3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdICA9ICVkXG4iLAogCQkJCSBwcmV2X3N0LT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdKTsKIAkJCWlmIChwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9PSAwKSB7CiAJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQpAQCAtMTc2MSw4ICsxNzY3LDggQEAKIAkJCQkgICAocHJldl9zdC0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSkpIC8KIAkJCQkgICAoUlhfU01PT1RIKTsKIAkJCX0KLQkJCVJUX1RSQUNFKENPTVBfREJHLCAiSmFja2VuIC0+IHByaXYtPlJ4U3RhdHMuUnhSU1NJIgotCQkJCSAiUGVyY2VudGFnZVtyZlBhdGhdICA9ICVkXG4iLAorCQkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkJICJKYWNrZW4gLT4gcHJpdi0+UnhTdGF0cy5SeFJTU0lQZXJjZW50YWdlW3JmUGF0aF0gID0gJWRcbiIsCiAJCQkJIHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKTsKIAkJfQogCX0KQEAgLTIwMTksNiArMjAyNSw3IEBACiAJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnhfZndpbmZvICpwRHJ2SW5mbyA9IE5VTEw7CiAKIAlzdGF0cy0+YklDViA9IHBkZXNjLT5JQ1Y7CiAJc3RhdHMtPmJDUkMgPSBwZGVzYy0+Q1JDMzI7CkBAIC0yMDQwLDUxICsyMDQ3LDQ5IEBACiAJCQkJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQrKzsKIAkJfQogCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHJ4X2Z3aW5mbyAqcERydkluZm8gPSBOVUxMOwotCi0JCXN0YXRzLT5SeERydkluZm9TaXplID0gcGRlc2MtPlJ4RHJ2SW5mb1NpemU7Ci0JCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gKChwZGVzYy0+U2hpZnQpJjB4MDMpOwotCQlzdGF0cy0+RGVjcnlwdGVkID0gIXBkZXNjLT5TV0RlYzsKLQotCQlwRHJ2SW5mbyA9IChzdHJ1Y3QgcnhfZndpbmZvICopKHNrYi0+ZGF0YSArIHN0YXRzLT5SeEJ1ZlNoaWZ0KTsKLQotCQlzdGF0cy0+cmF0ZSA9IEh3UmF0ZVRvTVJhdGU5MCgoYm9vbClwRHJ2SW5mby0+UnhIVCwKLQkJCQkJICAgICAodTgpcERydkluZm8tPlJ4UmF0ZSk7Ci0JCXN0YXRzLT5iU2hvcnRQcmVhbWJsZSA9IHBEcnZJbmZvLT5TUExDUDsKLQotCQlydGw4MTkyX1VwZGF0ZVJlY2VpdmVkUmF0ZUhpc3RvZ3JhbVN0YXRpc3RpY3MoZGV2LCBzdGF0cyk7Ci0KLQkJc3RhdHMtPmJJc0FNUERVID0gKHBEcnZJbmZvLT5QYXJ0QWdnciA9PSAxKTsKLQkJc3RhdHMtPmJGaXJzdE1QRFUgPSAocERydkluZm8tPlBhcnRBZ2dyID09IDEpICYmCi0JCQkJICAgIChwRHJ2SW5mby0+Rmlyc3RBR0dSID09IDEpOwotCi0JCXN0YXRzLT5UaW1lU3RhbXBMb3cgPSBwRHJ2SW5mby0+VFNGTDsKLQkJc3RhdHMtPlRpbWVTdGFtcEhpZ2ggPSByZWFkX25pY19kd29yZChkZXYsIFRTRlIrNCk7Ci0KLQkJcnRsODE5eF9VcGRhdGVSeFBrdFRpbWVTdGFtcChkZXYsIHN0YXRzKTsKLQotCQlpZiAoKHN0YXRzLT5SeEJ1ZlNoaWZ0ICsgc3RhdHMtPlJ4RHJ2SW5mb1NpemUpID4gMCkKLQkJCXN0YXRzLT5iU2hpZnQgPSAxOwotCi0JCXN0YXRzLT5SeElzNDBNSHpQYWNrZXQgPSBwRHJ2SW5mby0+Qlc7Ci0KLQkJcnRsODE5Ml9UcmFuc2xhdGVSeFNpZ25hbFN0dWZmKGRldiwgc2tiLCBzdGF0cywgcGRlc2MsCi0JCQkJCSAgICAgICBwRHJ2SW5mbyk7Ci0KLQkJaWYgKHBEcnZJbmZvLT5GaXJzdEFHR1IgPT0gMSB8fCBwRHJ2SW5mby0+UGFydEFnZ3IgPT0gMSkKLQkJCVJUX1RSQUNFKENPTVBfUlhERVNDLCAicERydkluZm8tPkZpcnN0QUdHUiA9ICVkLCIKLQkJCQkgIiBwRHJ2SW5mby0+UGFydEFnZ3IgPSAlZFxuIiwKLQkJCQkgcERydkluZm8tPkZpcnN0QUdHUiwgcERydkluZm8tPlBhcnRBZ2dyKTsKLQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQvKnNDcmNMbmcqLyk7Ci0KLQotCQlzdGF0cy0+cGFja2V0bGVuZ3RoID0gc3RhdHMtPkxlbmd0aC00OwotCQlzdGF0cy0+ZnJhZ2xlbmd0aCA9IHN0YXRzLT5wYWNrZXRsZW5ndGg7Ci0JCXN0YXRzLT5mcmFnb2Zmc2V0ID0gMDsKLQkJc3RhdHMtPm50b3RhbGZyYWcgPSAxOwotCQlyZXR1cm4gdHJ1ZTsKIAl9CisKKwlzdGF0cy0+UnhEcnZJbmZvU2l6ZSA9IHBkZXNjLT5SeERydkluZm9TaXplOworCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gKChwZGVzYy0+U2hpZnQpJjB4MDMpOworCXN0YXRzLT5EZWNyeXB0ZWQgPSAhcGRlc2MtPlNXRGVjOworCisJcERydkluZm8gPSAoc3RydWN0IHJ4X2Z3aW5mbyAqKShza2ItPmRhdGEgKyBzdGF0cy0+UnhCdWZTaGlmdCk7CisKKwlzdGF0cy0+cmF0ZSA9IEh3UmF0ZVRvTVJhdGU5MCgoYm9vbClwRHJ2SW5mby0+UnhIVCwKKwkJCQkgICAgICh1OClwRHJ2SW5mby0+UnhSYXRlKTsKKwlzdGF0cy0+YlNob3J0UHJlYW1ibGUgPSBwRHJ2SW5mby0+U1BMQ1A7CisKKwlydGw4MTkyX1VwZGF0ZVJlY2VpdmVkUmF0ZUhpc3RvZ3JhbVN0YXRpc3RpY3MoZGV2LCBzdGF0cyk7CisKKwlzdGF0cy0+YklzQU1QRFUgPSAocERydkluZm8tPlBhcnRBZ2dyID09IDEpOworCXN0YXRzLT5iRmlyc3RNUERVID0gKHBEcnZJbmZvLT5QYXJ0QWdnciA9PSAxKSAmJgorCQkJICAgIChwRHJ2SW5mby0+Rmlyc3RBR0dSID09IDEpOworCisJc3RhdHMtPlRpbWVTdGFtcExvdyA9IHBEcnZJbmZvLT5UU0ZMOworCXN0YXRzLT5UaW1lU3RhbXBIaWdoID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUU0ZSKzQpOworCisJcnRsODE5eF9VcGRhdGVSeFBrdFRpbWVTdGFtcChkZXYsIHN0YXRzKTsKKworCWlmICgoc3RhdHMtPlJ4QnVmU2hpZnQgKyBzdGF0cy0+UnhEcnZJbmZvU2l6ZSkgPiAwKQorCQlzdGF0cy0+YlNoaWZ0ID0gMTsKKworCXN0YXRzLT5SeElzNDBNSHpQYWNrZXQgPSBwRHJ2SW5mby0+Qlc7CisKKwlydGw4MTkyX1RyYW5zbGF0ZVJ4U2lnbmFsU3R1ZmYoZGV2LCBza2IsIHN0YXRzLCBwZGVzYywKKwkJCQkgICAgICAgcERydkluZm8pOworCisJaWYgKHBEcnZJbmZvLT5GaXJzdEFHR1IgPT0gMSB8fCBwRHJ2SW5mby0+UGFydEFnZ3IgPT0gMSkKKwkJUlRfVFJBQ0UoQ09NUF9SWERFU0MsCisJCQkgInBEcnZJbmZvLT5GaXJzdEFHR1IgPSAlZCwgcERydkluZm8tPlBhcnRBZ2dyID0gJWRcbiIsCisJCQkgcERydkluZm8tPkZpcnN0QUdHUiwgcERydkluZm8tPlBhcnRBZ2dyKTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKKworCisJc3RhdHMtPnBhY2tldGxlbmd0aCA9IHN0YXRzLT5MZW5ndGgtNDsKKwlzdGF0cy0+ZnJhZ2xlbmd0aCA9IHN0YXRzLT5wYWNrZXRsZW5ndGg7CisJc3RhdHMtPmZyYWdvZmZzZXQgPSAwOworCXN0YXRzLT5udG90YWxmcmFnID0gMTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBydGw4MTkyX2hhbHRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIHJlc2V0KQpAQCAtMjEzMiw3ICsyMTM3LDYgQEAKIAkJc2tiX3F1ZXVlX3B1cmdlKCZwcml2LT5ydGxsaWItPnNrYl9hZ2dRW2ldKTsKIAogCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+c2tiX3F1ZXVlKTsKLQlyZXR1cm47CiB9CiAKIHZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjE5MSw4ICsyMTk1LDcgQEAKIAogCXByaXYtPnJ0bGxpYi0+c29mdG1hY19mZWF0dXJlcyAgPSBJRUVFX1NPRlRNQUNfU0NBTiB8CiAJCUlFRUVfU09GVE1BQ19BU1NPQ0lBVEUgfCBJRUVFX1NPRlRNQUNfUFJPQkVSUSB8Ci0JCUlFRUVfU09GVE1BQ19QUk9CRVJTIHwgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIC8qIHwKLQkJSUVFRV9TT0ZUTUFDX0JFQUNPTlMqLzsKKwkJSUVFRV9TT0ZUTUFDX1BST0JFUlMgfCBJRUVFX1NPRlRNQUNfVFhfUVVFVUU7CiAKIAlwcml2LT5ydGxsaWItPnR4X2hlYWRyb29tID0gc2l6ZW9mKHN0cnVjdCB0eF9md2luZm9fODE5MHBjaSk7CiAKQEAgLTIzMDgsOCArMjMxMSw3IEBACiAJICAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBSYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKSkpKSB7CiAJCWlmIChyeF9jaGtfY250IDwgMikKIAkJCXJldHVybiBiU3R1Y2s7Ci0JCWVsc2UKLQkJCXJ4X2Noa19jbnQgPSAwOworCQlyeF9jaGtfY250ID0gMDsKIAl9IGVsc2UgaWYgKCgoKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkgJiYKIAkJICAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IFJhdGVBZGFwdGl2ZVRIX0xvd180ME0pKSB8fAogCQkoKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkgJiYKQEAgLTIzMTcsMTMgKzIzMTksMTEgQEAKIAkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBWZXJ5TG93UlNTSSkgewogCQlpZiAocnhfY2hrX2NudCA8IDQpCiAJCQlyZXR1cm4gYlN0dWNrOwotCQllbHNlCi0JCQlyeF9jaGtfY250ID0gMDsKKwkJcnhfY2hrX2NudCA9IDA7CiAJfSBlbHNlIHsKIAkJaWYgKHJ4X2Noa19jbnQgPCA4KQogCQkJcmV0dXJuIGJTdHVjazsKLQkJZWxzZQotCQkJcnhfY2hrX2NudCA9IDA7CisJCXJ4X2Noa19jbnQgPSAwOwogCX0KIAogCkBAIC0yNDEzLDUgKzI0MTMsNCBAQAogCWVudW0gd2lyZWxlc3NfbW9kZSBXaXJlbGVzc01vZGUsCiAJc3RydWN0IGNoYW5uZWxfYWNjZXNzX3NldHRpbmcgKkNobmxBY2Nlc3NTZXR0aW5nKQogewotCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZmlybXdhcmUuYwppbmRleCAyZTI4NzQ0Li5jNDY1Zjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Zpcm13YXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9maXJtd2FyZS5jCkBAIC0zNiw3ICszNiw2IEBACiAJCQkgICAgIHUzMiBidWZmZXJfbGVuKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKLQlib29sCQkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKIAl1MTYJCSAgICBmcmFnX3RocmVzaG9sZDsKIAl1MTYJCSAgICBmcmFnX2xlbmd0aCwgZnJhZ19vZmZzZXQgPSAwOwogCWludAkJICAgIGk7CkBAIC01MSw3ICs1MCw3IEBACiAJZnJhZ190aHJlc2hvbGQgPSBwZmlybXdhcmUtPmNtZHBhY2tldF9mcmFnX3RocmVzb2xkOwogCWRvIHsKIAkJaWYgKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKLQkJCWZyYWdfbGVuZ3RoID0gZnJhZ190aHJlc2hvbGQgOworCQkJZnJhZ19sZW5ndGggPSBmcmFnX3RocmVzaG9sZDsKIAkJCWJMYXN0SW5pUGt0ID0gMDsKIAogCQl9IGVsc2UgewpAQCAtODQsOCArODMsOCBAQAogCQlpZiAoIXByaXYtPnJ0bGxpYi0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldiwgdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KSB8fAogCQkgICAgKCFza2JfcXVldWVfZW1wdHkoJnByaXYtPnJ0bGxpYi0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pKSB8fAogCQkgICAgKHByaXYtPnJ0bGxpYi0+cXVldWVfc3RvcCkpIHsKLQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICI9PT09PT09PT09PT09PT09PT09PiB0eCAiCi0JCQkJICJmdWxsIVxuIik7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLAorCQkJCSAiPT09PT09PT09PT09PT09PT09PT4gdHggZnVsbCFcbiIpOwogCQkJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPnJ0bGxpYi0+c2tiX3dhaXRRCiAJCQkJCVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLCBza2IpOwogCQl9IGVsc2UgewpAQCAtOTksNyArOTgsNyBAQAogCiAJd3JpdGVfbmljX2J5dGUoZGV2LCBUUFBvbGwsIFRQUG9sbF9DUSk7CiAKLQlyZXR1cm4gcnRfc3RhdHVzOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgYm9vbCBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTA4LDcgKzEwNyw3IEBACiAJdTMyCQlDUFVfc3RhdHVzID0gMDsKIAl1bnNpZ25lZCBsb25nICAgdGltZW91dDsKIAotCXRpbWVvdXQgPSBqaWZmaWVzICsgTVNFQ1MoMjAwKTsKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwKTsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJQ1BVX3N0YXR1cyA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CiAJCWlmIChDUFVfc3RhdHVzICYgQ1BVX0dFTl9QVVRfQ09ERV9PSykKQEAgLTEyOCw3ICsxMjcsNyBAQAogCQkgICAgICAgKHU4KSgoQ1BVX3N0YXR1c3xDUFVfR0VOX1BXUl9TVEJfQ1BVKSYweGZmKSk7CiAJbWRlbGF5KDEpOwogCi0JdGltZW91dCA9IGppZmZpZXMgKyBNU0VDUygyMDApOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKIAkJaWYgKENQVV9zdGF0dXMmQ1BVX0dFTl9CT09UX1JEWSkKQEAgLTE1Niw3ICsxNTUsNyBAQAogCXUzMglDUFVfc3RhdHVzID0gMDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKLQl0aW1lb3V0ID0gamlmZmllcyArIE1TRUNTKDIwKTsKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKIAkJaWYgKENQVV9zdGF0dXMmQ1BVX0dFTl9GSVJNX1JEWSkKQEAgLTE5Nyw4ICsxOTYsOCBAQAogCQlpZiAocnRfc3RhdHVzKQogCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfM19UVVJOT05fQ1BVOwogCQllbHNlCi0JCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub24iCi0JCQkJICJDUFUgZmFpbCFcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwKKwkJCQkgIkNQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVIGZhaWwhXG4iKTsKIAogCQlicmVhazsKIApAQCAtMjEwLDggKzIwOSw5IEBACiAJCWlmIChydF9zdGF0dXMpCiAJCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU181X1JFQURZOwogCQllbHNlCi0JCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiQ1BVY2hlY2tfZmlybXdhcmVfcmVhZHkgZmFpbCIKLQkJCQkgIiglZCkhXG4iLCBydF9zdGF0dXMpOworCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwKKwkJCQkgIkNQVWNoZWNrX2Zpcm13YXJlX3JlYWR5IGZhaWwoJWQpIVxuIiwKKwkJCQkgcnRfc3RhdHVzKTsKIAogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjQ2LDggKzI0Niw4IEBACiAJCXJzdF9vcHQgPSBPUFRfRklSTVdBUkVfUkVTRVQ7CiAJCXN0YXJ0aW5nX3N0YXRlID0gRldfSU5JVF9TVEVQMl9EQVRBOwogCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJQbGF0Zm9ybUluaXRGaXJtd2FyZTogdW5kZWZpbmVkIgotCQkJICIgZmlybXdhcmUgc3RhdGVcbiIpOworCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLAorCQkJICJQbGF0Zm9ybUluaXRGaXJtd2FyZTogdW5kZWZpbmVkIGZpcm13YXJlIHN0YXRlXG4iKTsKIAl9CiAKIAlmb3IgKGluaXRfc3RlcCA9IHN0YXJ0aW5nX3N0YXRlOyBpbml0X3N0ZXAgPD0gRldfSU5JVF9TVEVQMl9EQVRBOwpAQCAtMjY2LDE0ICsyNjYsMTQgQEAKIAkJCQkJCSAgICAgIGZ3X25hbWVbaW5pdF9zdGVwXSwKIAkJCQkJCSAgICAgICZwcml2LT5wZGV2LT5kZXYpOwogCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgInJlcXVlc3QgZmlybXdhcmUgZmFpbCFcbiIpOworCQkJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLAorCQkJCQkJICJyZXF1ZXN0IGZpcm13YXJlIGZhaWwhXG4iKTsKIAkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOwogCQkJCX0KIAkJCQlpZiAoZndfZW50cnktPnNpemUgPgogCQkJCSAgICBzaXplb2YocGZpcm13YXJlLT5maXJtd2FyZV9idWZbaW5pdF9zdGVwXSkpIHsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgImltZyBmaWxlIHNpemUgIgotCQkJCQkJICJleGNlZWQgdGhlIGNvbnRhaW5lciBzdHJ1Y3QgIgotCQkJCQkJICJidWZmZXIgZmFpbCFcbiIpOworCQkJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLAorCQkJCQkJICJpbWcgZmlsZSBzaXplIGV4Y2VlZCB0aGUgY29udGFpbmVyIHN0cnVjdCBidWZmZXIgZmFpbCFcbiIpOwogCQkJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CiAJCQkJfQogCkBAIC0zMDEsMTMgKzMwMSwxMSBAQAogCQlmaWxlX2xlbmd0aCA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemVbaW5pdF9zdGVwXTsKIAogCQlydF9zdGF0dXMgPSBmd19kb3dubG9hZF9jb2RlKGRldiwgbWFwcGVkX2ZpbGUsIGZpbGVfbGVuZ3RoKTsKLQkJaWYgKCFydF9zdGF0dXMpIHsKKwkJaWYgKCFydF9zdGF0dXMpCiAJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7Ci0JCX0KIAotCQlpZiAoIWZpcm13YXJlX2NoZWNrX3JlYWR5KGRldiwgaW5pdF9zdGVwKSkgeworCQlpZiAoIWZpcm13YXJlX2NoZWNrX3JlYWR5KGRldiwgaW5pdF9zdGVwKSkKIAkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKLQkJfQogCX0KIAogCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJGaXJtd2FyZSBEb3dubG9hZCBTdWNjZXNzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuaAppbmRleCAwMTk4MzZiLi5kODA0ODc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9od2ltZy5oCkBAIC0zNCwxOCArMzQsMTggQEAKICNkZWZpbmUgUEhZX1JFR18xVDJSQXJyYXlMZW5ndGhQY2lFIDI5NgogZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVBIWV9SRUdfMVQyUkFycmF5W1BIWV9SRUdfMVQyUkFycmF5TGVuZ3RoUGNpRV07CiAjZGVmaW5lIFJhZGlvQV9BcnJheUxlbmd0aFBjaUUgMjQ2Ci1leHRlcm4gdTMyIFJ0bDgxOTJQY2lFUmFkaW9BX0FycmF5W1JhZGlvQV9BcnJheUxlbmd0aFBjaUVdIDsKK2V4dGVybiB1MzIgUnRsODE5MlBjaUVSYWRpb0FfQXJyYXlbUmFkaW9BX0FycmF5TGVuZ3RoUGNpRV07CiAjZGVmaW5lIFJhZGlvQl9BcnJheUxlbmd0aFBjaUUgNzgKLWV4dGVybiB1MzIgUnRsODE5MlBjaUVSYWRpb0JfQXJyYXlbUmFkaW9CX0FycmF5TGVuZ3RoUGNpRV0gOworZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvQl9BcnJheVtSYWRpb0JfQXJyYXlMZW5ndGhQY2lFXTsKICNkZWZpbmUgUmFkaW9DX0FycmF5TGVuZ3RoUGNpRSAyCi1leHRlcm4gdTMyIFJ0bDgxOTJQY2lFUmFkaW9DX0FycmF5W1JhZGlvQ19BcnJheUxlbmd0aFBjaUVdIDsKK2V4dGVybiB1MzIgUnRsODE5MlBjaUVSYWRpb0NfQXJyYXlbUmFkaW9DX0FycmF5TGVuZ3RoUGNpRV07CiAjZGVmaW5lIFJhZGlvRF9BcnJheUxlbmd0aFBjaUUgMgotZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvRF9BcnJheVtSYWRpb0RfQXJyYXlMZW5ndGhQY2lFXSA7CitleHRlcm4gdTMyIFJ0bDgxOTJQY2lFUmFkaW9EX0FycmF5W1JhZGlvRF9BcnJheUxlbmd0aFBjaUVdOwogI2RlZmluZSBNQUNQSFlfQXJyYXlMZW5ndGhQY2lFIDE4Ci1leHRlcm4gdTMyIFJ0bDgxOTJQY2lFTUFDUEhZX0FycmF5W01BQ1BIWV9BcnJheUxlbmd0aFBjaUVdIDsKK2V4dGVybiB1MzIgUnRsODE5MlBjaUVNQUNQSFlfQXJyYXlbTUFDUEhZX0FycmF5TGVuZ3RoUGNpRV07CiAjZGVmaW5lIE1BQ1BIWV9BcnJheV9QR0xlbmd0aFBjaUUgMzAKLWV4dGVybiB1MzIgUnRsODE5MlBjaUVNQUNQSFlfQXJyYXlfUEdbTUFDUEhZX0FycmF5X1BHTGVuZ3RoUGNpRV0gOworZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRU1BQ1BIWV9BcnJheV9QR1tNQUNQSFlfQXJyYXlfUEdMZW5ndGhQY2lFXTsKICNkZWZpbmUgQUdDVEFCX0FycmF5TGVuZ3RoUGNpRSAzODQKLWV4dGVybiB1MzIgUnRsODE5MlBjaUVBR0NUQUJfQXJyYXlbQUdDVEFCX0FycmF5TGVuZ3RoUGNpRV0gOworZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRUFHQ1RBQl9BcnJheVtBR0NUQUJfQXJyYXlMZW5ndGhQY2lFXTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9waHkuYwppbmRleCA4YzA4ZWY2Li40NjY0YTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfcGh5LmMKQEAgLTk0LDcgKzk0LDYgQEAKIAkJd3JpdGVfbmljX2R3b3JkKGRldiwgZHdSZWdBZGRyLCBOZXdWYWx1ZSk7CiAJfSBlbHNlCiAJCXdyaXRlX25pY19kd29yZChkZXYsIGR3UmVnQWRkciwgZHdEYXRhKTsKLQlyZXR1cm47CiB9CiAKIHUzMiBydGw4MTkyX1F1ZXJ5QkJSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGR3UmVnQWRkciwgdTMyIGR3Qml0TWFzaykKQEAgLTEzNiw4ICsxMzUsOCBAQAogCQl9IGVsc2UKIAkJCU5ld09mZnNldCA9IE9mZnNldDsKIAl9IGVsc2UgewotCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIgotCQkJICIgdG8gYmUgODI1NlxuIik7CisJCVJUX1RSQUNFKChDT01QX1BIWXxDT01QX0VSUiksCisJCQkgImNoZWNrIFJGIHR5cGUgaGVyZSwgbmVlZCB0byBiZSA4MjU2XG4iKTsKIAkJTmV3T2Zmc2V0ID0gT2Zmc2V0OwogCX0KIAlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGJMU1NJUmVhZEFkZHJlc3MsCkBAIC0xOTIsOCArMTkxLDggQEAKIAkJfSBlbHNlCiAJCQlOZXdPZmZzZXQgPSBPZmZzZXQ7CiAJfSBlbHNlIHsKLQkJUlRfVFJBQ0UoKENPTVBfUEhZfENPTVBfRVJSKSwgImNoZWNrIFJGIHR5cGUgaGVyZSwgbmVlZCB0byBiZSIKLQkJCSAiIDgyNTZcbiIpOworCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLAorCQkJICJjaGVjayBSRiB0eXBlIGhlcmUsIG5lZWQgdG8gYmUgODI1NlxuIik7CiAJCU5ld09mZnNldCA9IE9mZnNldDsKIAl9CiAKQEAgLTIxNSw3ICsyMTQsNiBAQAogCQl9CiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHgzMDAsIDB4Myk7CiAJfQotCXJldHVybjsKIH0KIAogdm9pZCBydGw4MTkyX3BoeV9TZXRSRlJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBlbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoLApAQCAtMjU2LDcgKzI1NCw2IEBACiAJCX0gZWxzZQogCQkJcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShkZXYsIGVSRlBhdGgsIFJlZ0FkZHIsIERhdGEpOwogCX0KLQlyZXR1cm47CiB9CiAKIHUzMiBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsCkBAIC0zMDcsNyArMzA0LDcgQEAKIAl9CiAJcmV0dXJuIHJlYWRfbmljX2R3b3JkKGRldiwgUkZfREFUQSk7CiAKLX0JLyogcGh5X0Z3UkZTZXJpYWxSZWFkICovCit9CiAKIHN0YXRpYyB2b2lkIHBoeV9Gd1JGU2VyaWFsV3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQllbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoLApAQCAtMzI4LDcgKzMyNSw3IEBACiAJfQogCXdyaXRlX25pY19kd29yZChkZXYsIFFQTlIsIERhdGEpOwogCi19CS8qIHBoeV9Gd1JGU2VyaWFsV3JpdGUgKi8KK30KIAogCiB2b2lkIHJ0bDgxOTJfcGh5X2NvbmZpZ21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzQ4LDggKzM0NSw4IEBACiAJCXBkd0FycmF5ID0gUnRsODE5WE1BQ1BIWV9BcnJheTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGR3QXJyYXlMZW47IGkgKz0gMykgewotCQlSVF9UUkFDRShDT01QX0RCRywgIlRoZSBSdGw4MTkwTUFDUEhZX0FycmF5WzBdIGlzICV4IFJ0bDgxOTBNQUMiCi0JCQkgIlBIWV9BcnJheVsxXSBpcyAleCBSdGw4MTkwTUFDUEhZX0FycmF5WzJdIGlzICV4XG4iLAorCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCSAiVGhlIFJ0bDgxOTBNQUNQSFlfQXJyYXlbMF0gaXMgJXggUnRsODE5ME1BQ1BIWV9BcnJheVsxXSBpcyAleCBSdGw4MTkwTUFDUEhZX0FycmF5WzJdIGlzICV4XG4iLAogCQkJIHBkd0FycmF5W2ldLCBwZHdBcnJheVtpKzFdLCBwZHdBcnJheVtpKzJdKTsKIAkJaWYgKHBkd0FycmF5W2ldID09IDB4MzE4KQogCQkJcGR3QXJyYXlbaSsyXSA9IDB4MDAwMDA4MDA7CkBAIC0zODMsOCArMzgwLDggQEAKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2ldLAogCQkJCQkgYk1hc2tEV29yZCwKIAkJCQkJIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVbaSsxXSk7Ci0JCQlSVF9UUkFDRShDT01QX0RCRywgImk6ICV4LCBUaGUgUnRsODE5eFVzYlBIWV9SRUdBcnJheSIKLQkJCQkgIlswXSBpcyAleCBSdGw4MTl4VXNiUEhZX1JFR0FycmF5WzFdIGlzICV4XG4iLAorCQkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkJICJpOiAleCwgVGhlIFJ0bDgxOXhVc2JQSFlfUkVHQXJyYXlbMF0gaXMgJXggUnRsODE5eFVzYlBIWV9SRUdBcnJheVsxXSBpcyAleFxuIiwKIAkJCQkgaSwgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZVtpXSwKIAkJCQkgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZVtpKzFdKTsKIAkJfQpAQCAtMzkzLDEzICszOTAsMTIgQEAKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2ldLAogCQkJCQkgYk1hc2tEV29yZCwKIAkJCQkJIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbaSsxXSk7Ci0JCQlSVF9UUkFDRShDT01QX0RCRywgImk6JXgsIFRoZSBydGw4MTlYQUdDVEFCX0FycmF5WzBdICIKLQkJCQkgImlzICV4IHJ0bDgxOVhBR0NUQUJfQXJyYXlbMV0gaXMgJXhcbiIsIGksCi0JCQkJIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbaV0sCisJCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCQkgImk6JXgsIFRoZSBydGw4MTlYQUdDVEFCX0FycmF5WzBdIGlzICV4IHJ0bDgxOVhBR0NUQUJfQXJyYXlbMV0gaXMgJXhcbiIsCisJCQkJIGksIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbaV0sCiAJCQkJIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbaSsxXSk7CiAJCX0KIAl9Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBydGw4MTkyX0luaXRCQlJGUmVnRGVmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01MTEsOCArNTA3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgQ2hlY2tUaW1lczsgaSsrKSB7CiAJCXN3aXRjaCAoQ2hlY2tCbG9jaykgewogCQljYXNlIEhXOTBfQkxPQ0tfTUFDOgotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfQ2hlY2tCQlJGT0soKTogTmV2ZXIgV3JpdGUgIgotCQkJCSAiMHgxMDAgaGVyZSEiKTsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCSAiUEhZX0NoZWNrQkJSRk9LKCk6IE5ldmVyIFdyaXRlIDB4MTAwIGhlcmUhIik7CiAJCQlicmVhazsKIAogCQljYXNlIEhXOTBfQkxPQ0tfUEhZMDoKQEAgLTU0MSw4ICs1MzcsOSBAQAogCiAKIAkJaWYgKGR3UmVnUmVhZCAhPSBXcml0ZURhdGFbaV0pIHsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiPT09PT5lcnJvcj09PT09ZHdSZWdSZWFkOiAleCwgIgotCQkJCSAiV3JpdGVEYXRhOiAleFxuIiwgZHdSZWdSZWFkLCBXcml0ZURhdGFbaV0pOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICI9PT09PmVycm9yPT09PT1kd1JlZ1JlYWQ6ICV4LCBXcml0ZURhdGE6ICV4XG4iLAorCQkJCSBkd1JlZ1JlYWQsIFdyaXRlRGF0YVtpXSk7CiAJCQlyZXQgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQl9CkBAIC01NzAsOCArNTY3LDkgQEAKIAkJCQkJIChlbnVtIGh3OTBfYmxvY2spZUNoZWNrSXRlbSwKIAkJCQkJIChlbnVtIHJmOTBfcmFkaW9fcGF0aCkwKTsKIAkJaWYgKCFydFN0YXR1cykgewotCQkJUlRfVFJBQ0UoKENPTVBfRVJSIHwgQ09NUF9QSFkpLCAiUEhZX1JGODI1Nl9Db25maWcoKToiCi0JCQkJICJDaGVjayBQSFklZCBGYWlsISFcbiIsIGVDaGVja0l0ZW0tMSk7CisJCQlSVF9UUkFDRSgoQ09NUF9FUlIgfCBDT01QX1BIWSksCisJCQkJICJQSFlfUkY4MjU2X0NvbmZpZygpOkNoZWNrIFBIWSVkIEZhaWwhIVxuIiwKKwkJCQkgZUNoZWNrSXRlbS0xKTsKIAkJCXJldHVybiBydFN0YXR1czsKIAkJfQogCX0KQEAgLTYyOCw4ICs2MjYsOCBAQAogCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsxXSA9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSk7CiAJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzJdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxKTsKIAlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bM10gPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEpOwotCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRlZmF1bHQgaW5pdGlhbCBnYWluIChjNTA9MHgleCwgYzU4PTB4JXgsICIKLQkJImM2MD0weCV4LCBjNjg9MHgleClcbiIsCisJUlRfVFJBQ0UoQ09NUF9JTklULAorCQkgIkRlZmF1bHQgaW5pdGlhbCBnYWluIChjNTA9MHgleCwgYzU4PTB4JXgsIGM2MD0weCV4LCBjNjg9MHgleClcbiIsCiAJCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblswXSwgcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzFdLAogCQlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMl0sIHByaXYtPkRlZmF1bHRJbml0aWFsR2FpblszXSk7CiAKQEAgLTYzOCw3ICs2MzYsNiBAQAogCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRlZmF1bHQgZnJhbWVzeW5jICgweCV4KSA9IDB4JXhcbiIsCiAJCXJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKIAlwcml2LT5TaWZzVGltZSA9IHJlYWRfbmljX3dvcmQoZGV2LCBTSUZTKTsKLQlyZXR1cm47CiB9CiAKIHZvaWQgcnRsODE5Ml9waHlfc2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQpAQCAtNjkyLDcgKzY4OSw2IEBACiAJCQkgX19mdW5jX18pOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuOwogfQogCiBib29sIHJ0bDgxOTJfcGh5X1JGQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03MjEsNyArNzE3LDYgQEAKIAogdm9pZCBydGw4MTkyX3BoeV91cGRhdGVJbml0R2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybjsKIH0KIAogdTggcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtODA3LDExICs4MDIsMTAgQEAKIAljYXNlIFJGXzgyNTg6CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAidW5rbm93biByZiBjaGlwIElEIGluIHJ0bDgxOTJfU2V0VHhQb3dlciIKLQkJCSAiTGV2ZWwoKVxuIik7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICJ1bmtub3duIHJmIGNoaXAgSUQgaW4gcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoKVxuIik7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB1OCBydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShzdHJ1Y3Qgc3dfY2hubF9jbWQgKkNtZFRhYmxlLApAQCAtODIyLDE1ICs4MTYsMTQgQEAKIAlzdHJ1Y3Qgc3dfY2hubF9jbWQgKnBDbWQ7CiAKIAlpZiAoQ21kVGFibGUgPT0gTlVMTCkgewotCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9TZXRTd0NobmxDbWRBcnJheSgpOiBDbWRUYWJsZSBjYW5ub3QgIgotCQkJICJiZSBOVUxMLlxuIik7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICJwaHlfU2V0U3dDaG5sQ21kQXJyYXkoKTogQ21kVGFibGUgY2Fubm90IGJlIE5VTEwuXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoQ21kVGFibGVJZHggPj0gQ21kVGFibGVTeikgewotCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9TZXRTd0NobmxDbWRBcnJheSgpOiBBY2Nlc3MgaW52YWxpZCIKLQkJCSAiIGluZGV4LCBwbGVhc2UgY2hlY2sgc2l6ZSBvZiB0aGUgdGFibGUsIENtZFRhYmxlSWR4OiIKLQkJCSAiJWQsIENtZFRhYmxlU3o6JWRcbiIsCi0JCQkJQ21kVGFibGVJZHgsIENtZFRhYmxlU3opOworCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCSAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IEFjY2VzcyBpbnZhbGlkIGluZGV4LCBwbGVhc2UgY2hlY2sgc2l6ZSBvZiB0aGUgdGFibGUsIENtZFRhYmxlSWR4OiVkLCBDbWRUYWJsZVN6OiVkXG4iLAorCQkJIENtZFRhYmxlSWR4LCBDbWRUYWJsZVN6KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtODgzLDggKzg3Niw5IEBACiAJCXN3aXRjaCAocHJpdi0+cmZfY2hpcCkgewogCQljYXNlIFJGXzgyMjU6CiAJCQlpZiAoIShjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSAxNCkpIHsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEgIgotCQkJCQkgIjgyMjU6ICVkXG4iLCBjaGFubmVsKTsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJICJpbGxlZ2FsIGNoYW5uZWwgZm9yIFplYnJhIDgyMjU6ICVkXG4iLAorCQkJCQkgY2hhbm5lbCk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoaWVlZS0+UmZEZXBlbmRDbWQsCkBAIC04OTgsOCArODkyLDkgQEAKIAogCQljYXNlIFJGXzgyNTY6CiAJCQlpZiAoIShjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSAxNCkpIHsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEiCi0JCQkJCSAiIDgyNTY6ICVkXG4iLCBjaGFubmVsKTsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJICJpbGxlZ2FsIGNoYW5uZWwgZm9yIFplYnJhIDgyNTY6ICVkXG4iLAorCQkJCQkgY2hhbm5lbCk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoaWVlZS0+UmZEZXBlbmRDbWQsCkBAIC05MjAsNyArOTE1LDYgQEAKIAkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5rbm93biBSRkNoaXBJRDogJWRcbiIsCiAJCQkJIHByaXYtPnJmX2NoaXApOwogCQkJcmV0dXJuIGZhbHNlOwotCQkJYnJlYWs7CiAJCX0KIAogCkBAIC05MzgsMTMgKzkzMiwxMSBAQAogCQkJfQogCiAJCQlpZiAoQ3VycmVudENtZCAmJiBDdXJyZW50Q21kLT5DbWRJRCA9PSBDbWRJRF9FbmQpIHsKLQkJCQlpZiAoKCpzdGFnZSkgPT0gMikgeworCQkJCWlmICgoKnN0YWdlKSA9PSAyKQogCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQkoKnN0YWdlKSsrOwotCQkJCQkoKnN0ZXApID0gMDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQorCQkJCSgqc3RhZ2UpKys7CisJCQkJKCpzdGVwKSA9IDA7CisJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCWlmICghQ3VycmVudENtZCkKQEAgLTk5Niw3ICs5ODgsNyBAQAogCSAgICAgICZwcml2LT5Td0NobmxTdGVwLCAmZGVsYXkpKSB7CiAJCWlmIChkZWxheSA+IDApCiAJCQltc2xlZXAoZGVsYXkpOwotCQlpZiAoSVNfTklDX0RPV04ocHJpdikpCisJCWlmICghcHJpdi0+dXApCiAJCQlicmVhazsKIAl9CiB9CkBAIC0xMDIwLDcgKzEwMTIsNyBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAogCVJUX1RSQUNFKENPTVBfUEhZLCAiPT09PT0+JXMoKVxuIiwgX19mdW5jX18pOwotCWlmIChJU19OSUNfRE9XTihwcml2KSkgeworCWlmICghcHJpdi0+dXApIHsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBFUlIgISEgZHJpdmVyIGlzIG5vdCB1cFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMTA2MCw3ICsxMDUyLDcgQEAKIAlwcml2LT5Td0NobmxTdGFnZSA9IDA7CiAJcHJpdi0+U3dDaG5sU3RlcCA9IDA7CiAKLQlpZiAoIUlTX05JQ19ET1dOKHByaXYpKQorCWlmIChwcml2LT51cCkKIAkJcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oZGV2KTsKIAlwcml2LT5Td0NobmxJblByb2dyZXNzID0gZmFsc2U7CiAJcmV0dXJuIHRydWU7CkBAIC0xMDgzLDggKzEwNzUsOCBAQAogCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA8IDApCiAJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gMDsKIAotCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiMjBNLCBwcml2LT5DQ0tQcmVzZW50IgotCQkJICJBdHRlbnR1YXRpb24gPSAlZFxuIiwKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCSAiMjBNLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsCiAJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbik7CiAKIAkJaWYgKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYKQEAgLTExMDUsOCArMTA5Nyw4IEBACiAJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQgKwogCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwogCi0JCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICI0ME0sIHByaXYtPkNDS1ByZXNlbnQiCi0JCQkgIkF0dGVudHVhdGlvbiA9ICVkXG4iLAorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJICI0ME0sIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAlZFxuIiwKIAkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKIAkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPgogCQkgICAgKENDS1R4QkJHYWluVGFibGVMZW5ndGggLSAxKSkKQEAgLTExNDYsMTUgKzExMzgsMTUgQEAKIAkJaWYgKHByaXYtPlJlY29yZF9DQ0tfMjBNaW5kZXggPT0gMCkKIAkJCXByaXYtPlJlY29yZF9DQ0tfMjBNaW5kZXggPSA2OwogCQlwcml2LT5DQ0tfaW5kZXggPSBwcml2LT5SZWNvcmRfQ0NLXzIwTWluZGV4OwotCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiMjBNSHosIENDS19UeF9Qb3dlcl9UcmFja19CV18iCi0JCQkgIlN3aXRjaF9UaGVybWFsTWV0ZXIoKSxDQ0tfaW5kZXggPSAlZFxuIiwKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCSAiMjBNSHosIENDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2hfVGhlcm1hbE1ldGVyKCksQ0NLX2luZGV4ID0gJWRcbiIsCiAJCQkgcHJpdi0+Q0NLX2luZGV4KTsKIAlicmVhazsKIAogCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKIAkJcHJpdi0+Q0NLX2luZGV4ID0gcHJpdi0+UmVjb3JkX0NDS180ME1pbmRleDsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIjQwTUh6LCBDQ0tfVHhfUG93ZXJfVHJhY2tfQldfIgotCQkJICJTd2l0Y2hfVGhlcm1hbE1ldGVyKCksIENDS19pbmRleCA9ICVkXG4iLAorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJICI0ME1IeiwgQ0NLX1R4X1Bvd2VyX1RyYWNrX0JXX1N3aXRjaF9UaGVybWFsTWV0ZXIoKSwgQ0NLX2luZGV4ID0gJWRcbiIsCiAJCQkgcHJpdi0+Q0NLX2luZGV4KTsKIAlicmVhazsKIAl9CkBAIC0xMTc3LDE2ICsxMTY5LDE3IEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCXU4IHJlZ0J3T3BNb2RlOwogCi0JUlRfVFJBQ0UoQ09NUF9TV0JXLCAiPT0+cnRsODE5Ml9TZXRCV01vZGVXb3JrSXRlbSgpICBTd2l0Y2ggdG8gJXMgIgotCQkgImJhbmR3aWR0aFxuIiwgcHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwID8KLQkJICIyME1IeiIgOiAiNDBNSHoiKTsKKwlSVF9UUkFDRShDT01QX1NXQlcsCisJCSAiPT0+cnRsODE5Ml9TZXRCV01vZGVXb3JrSXRlbSgpICBTd2l0Y2ggdG8gJXMgYmFuZHdpZHRoXG4iLAorCQkgcHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwID8KKwkJCSAiMjBNSHoiIDogIjQwTUh6Iik7CiAKIAogCWlmIChwcml2LT5yZl9jaGlwID09IFJGX1BTRVVET18xMU4pIHsKIAkJcHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQotCWlmIChJU19OSUNfRE9XTihwcml2KSkgeworCWlmICghcHJpdi0+dXApIHsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBFUlIhISBkcml2ZXIgaXMgbm90IHVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CkBAIC0xMjA0LDggKzExOTcsOSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0Q2hhbm5lbEJhbmR3aWR0aDgxOXhVc2IoKTogdW5rbm93biAiCi0JCQkgIkJhbmR3aWR0aDogJSNYXG4iLCBwcml2LT5DdXJyZW50Q2hhbm5lbEJXKTsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkgIlNldENoYW5uZWxCYW5kd2lkdGg4MTl4VXNiKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIsCisJCQkgcHJpdi0+Q3VycmVudENoYW5uZWxCVyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTI0NSw4ICsxMjM5LDkgQEAKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDAwMTAwMDAwLCAwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRDaGFubmVsQmFuZHdpZHRoODE5eFVzYigpOiB1bmtub3duICIKLQkJCSAiQmFuZHdpZHRoOiAlI1hcbiIsIHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCSAiU2V0Q2hhbm5lbEJhbmR3aWR0aDgxOXhVc2IoKTogdW5rbm93biBCYW5kd2lkdGg6ICUjWFxuIiwKKwkJCSBwcml2LT5DdXJyZW50Q2hhbm5lbEJXKTsKIAkJYnJlYWs7CiAKIAl9CkBAIC0xMzA5LDExICsxMzA0LDExIEBACiAJdTMyIEJpdE1hc2s7CiAJdTggaW5pdGlhbF9nYWluOwogCi0JaWYgKCFJU19OSUNfRE9XTihwcml2KSkgeworCWlmIChwcml2LT51cCkgewogCQlzd2l0Y2ggKE9wZXJhdGlvbikgewogCQljYXNlIElHX0JhY2t1cDoKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIklHX0JhY2t1cCwgYmFja3VwIHRoZSBpbml0aWFsIgotCQkJCSAiIGdhaW4uXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwKKwkJCQkgIklHX0JhY2t1cCwgYmFja3VwIHRoZSBpbml0aWFsIGdhaW4uXG4iKTsKIAkJCWluaXRpYWxfZ2FpbiA9IFNDQU5fUlhfSU5JVElBTF9HQUlOOwogCQkJQml0TWFzayA9IGJNYXNrQnl0ZTA7CiAJCQlpZiAoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PQpAQCAtMTMzNSwxNiArMTMzMCwyMSBAQAogCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LAogCQkJCQkJICAgIHJDQ0swX0NDQSwgQml0TWFzayk7CiAKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNTAgaXMiCi0JCQkJICIgJXhcbiIsIHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNTggaXMiCi0JCQkJICIgJXhcbiIsIHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNjAgaXMiCi0JCQkJICIgJXhcbiIsIHByaXYtPmluaXRnYWluX2JhY2t1cC54Y2FnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNjggaXMiCi0JCQkJICIgJXhcbiIsIHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhhMGEgaXMiCi0JCQkJICIgJXhcbiIsIHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLAorCQkJCSAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM1MCBpcyAleFxuIiwKKwkJCQkgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLAorCQkJCSAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM1OCBpcyAleFxuIiwKKwkJCQkgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLAorCQkJCSAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2MCBpcyAleFxuIiwKKwkJCQkgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLAorCQkJCSAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2OCBpcyAleFxuIiwKKwkJCQkgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLAorCQkJCSAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGEwYSBpcyAleFxuIiwKKwkJCQkgcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CiAKIAkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gaW5pdGlhbCBnYWluID0gMHgleFxuIiwKIAkJCQkgaW5pdGlhbF9nYWluKTsKQEAgLTEzNTcsOCArMTM1Nyw4IEBACiAJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCBQT1dFUl9ERVRFQ1RJT05fVEgpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUdfUmVzdG9yZToKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIklHX1Jlc3RvcmUsIHJlc3RvcmUgdGhlIGluaXRpYWwgIgotCQkJCSAiZ2Fpbi5cbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLAorCQkJCSAiSUdfUmVzdG9yZSwgcmVzdG9yZSB0aGUgaW5pdGlhbCBnYWluLlxuIik7CiAJCQlCaXRNYXNrID0gMHg3ZjsKIAkJCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09CiAJCQkgICAgRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCkBAIC0xMzc2LDE2ICsxMzc2LDIxIEBACiAJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBCaXRNYXNrLAogCQkJCQkgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKIAotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM1MCIKLQkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM1OCIKLQkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM2MCIKLQkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM2OCIKLQkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGEwYSIKLQkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzUwIGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzU4IGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzYwIGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzY4IGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YTBhIGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKIAogCQkJcnRsODE5Ml9waHlfc2V0VHhQb3dlcihkZXYsCiAJCQkJCSBwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKQEAgLTE0NDcsOCArMTQ1Miw4IEBACiAJCQkJfSB3aGlsZSAoIXJ0c3RhdHVzICYmIChJbml0aWxpemVDb3VudCA+IDApKTsKIAogCQkJCWlmICghcnRzdGF0dXMpIHsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOkluaXRpYWxpemUgQWRhIgotCQkJCQkJICJwdGVyIGZhaWwscmV0dXJuXG4iLAorCQkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJCSAiJXMoKTpJbml0aWFsaXplIEFkYXB0ZXIgZmFpbCxyZXR1cm5cbiIsCiAJCQkJCQkgX19mdW5jX18pOwogCQkJCQlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CiAJCQkJCXJldHVybiBmYWxzZTsKQEAgLTE0OTIsMTkgKzE0OTcsMTYgQEAKIAkJCQkJUXVldWVJRCsrOwogCQkJCQljb250aW51ZTsKIAkJCQl9IGVsc2UgewotCQkJCQlSVF9UUkFDRSgoQ09NUF9QT1dFUnxDT01QX1JGKSwgImVSZiBPZmYiCi0JCQkJCQkgIi9TbGVlcDogJWQgdGltZXMgVGNiQnVzeVF1ZXVlIgotCQkJCQkJICJbJWRdICE9MCBiZWZvcmUgZG96ZSFcbiIsCisJCQkJCVJUX1RSQUNFKChDT01QX1BPV0VSfENPTVBfUkYpLAorCQkJCQkJICJlUmYgT2ZmL1NsZWVwOiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBiZWZvcmUgZG96ZSFcbiIsCiAJCQkJCQkgKGkrMSksIFF1ZXVlSUQpOwogCQkJCQl1ZGVsYXkoMTApOwogCQkJCQlpKys7CiAJCQkJfQogCiAJCQkJaWYgKGkgPj0gTUFYX0RPWkVfV0FJVElOR19USU1FU185eCkgewotCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLCAiXG5cblxuIFRpbWVPdXQhISAiCi0JCQkJCQkgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogZVJmT2ZmIgotCQkJCQkJICI6ICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIgotCQkJCQkJICIhPSAwICEhIVxuIiwKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwKKwkJCQkJCSAiXG5cblxuIFRpbWVPdXQhISBTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IGVSZk9mZjogJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAhPSAwICEhIVxuIiwKIAkJCQkJCSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4LAogCQkJCQkJIFF1ZXVlSUQpOwogCQkJCQlicmVhazsKQEAgLTE1MTQsOCArMTUxNiw4IEBACiAJCQlicmVhazsKIAogCQljYXNlIGVSZk9mZjoKLQkJCVJUX1RSQUNFKENPTVBfUFMsICJTZXRSRlBvd2VyU3RhdGU4MTkwKCkgZVJmT2ZmLyIKLQkJCQkgIlNsZWVwICFcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9QUywKKwkJCQkgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKSBlUmZPZmYvU2xlZXAgIVxuIik7CiAKIAkJCWZvciAoUXVldWVJRCA9IDAsIGkgPSAwOyBRdWV1ZUlEIDwgTUFYX1RYX1FVRVVFOyApIHsKIAkJCQlyaW5nID0gJnByaXYtPnR4X3JpbmdbUXVldWVJRF07CkBAIC0xNTI0LDE5ICsxNTI2LDE2IEBACiAJCQkJCVF1ZXVlSUQrKzsKIAkJCQkJY29udGludWU7CiAJCQkJfSBlbHNlIHsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgImVSZiBPZmYvU2xlZXA6ICVkIgotCQkJCQkJICIgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAhPTAgYiIKLQkJCQkJCSAiZWZvcmUgZG96ZSFcbiIsIChpKzEpLAotCQkJCQkJIFF1ZXVlSUQpOworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLAorCQkJCQkJICJlUmYgT2ZmL1NsZWVwOiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBiZWZvcmUgZG96ZSFcbiIsCisJCQkJCQkgKGkrMSksIFF1ZXVlSUQpOwogCQkJCQl1ZGVsYXkoMTApOwogCQkJCQlpKys7CiAJCQkJfQogCiAJCQkJaWYgKGkgPj0gTUFYX0RPWkVfV0FJVElOR19USU1FU185eCkgewotCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLCAiXG5cblxuIFNldFplYnJhOiAiCi0JCQkJCQkgIlJGUG93ZXJTdGF0ZTgxODVCKCk6IGVSZk9mZjoiCi0JCQkJCQkgIiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICIKLQkJCQkJCSAiIT0gMCAhISFcbiIsCisJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsCisJCQkJCQkgIlxuXG5cbiBTZXRaZWJyYTogUkZQb3dlclN0YXRlODE4NUIoKTogZVJmT2ZmOiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9IDAgISEhXG4iLAogCQkJCQkJIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXgsCiAJCQkJCQkgUXVldWVJRCk7CiAJCQkJCWJyZWFrOwpAQCAtMTU1Niw4ICsxNTU1LDkgQEAKIAogCQlkZWZhdWx0OgogCQkJYlJlc3VsdCA9IGZhbHNlOwotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IHVua25vd24gc3RhdGUiCi0JCQkJICIgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCSAiU2V0UkZQb3dlclN0YXRlODE5MCgpOiB1bmtub3duIHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwKKwkJCQkgZVJGUG93ZXJTdGF0ZSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNTc2LDggKzE1NzYsOCBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0UkZQb3dlclN0YXRlODE5MCgpOiBVbmtub3duICIKLQkJCQkgIlJGIHR5cGVcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICJTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IFVua25vd24gUkYgdHlwZVxuIik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTE1OTksOCArMTU5OSw4IEBACiAJCSBlUkZQb3dlclN0YXRlKTsKIAlpZiAoZVJGUG93ZXJTdGF0ZSA9PSBwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgJiYKIAkgICAgcHJpdi0+Ykh3UmZPZmZBY3Rpb24gPT0gMCkgewotCQlSVF9UUkFDRShDT01QX1BTLCAiPC0tLS0tLS0tLSBTZXRSRlBvd2VyU3RhdGUoKTogZGlzY2FyZCB0aGUgIgotCQkJICJyZXF1ZXN0IGZvciBlUkZQb3dlclN0YXRlKCVkKSBpcyB0aGUgc2FtZS5cbiIsCisJCVJUX1RSQUNFKENPTVBfUFMsCisJCQkgIjwtLS0tLS0tLS0gU2V0UkZQb3dlclN0YXRlKCk6IGRpc2NhcmQgdGhlIHJlcXVlc3QgZm9yIGVSRlBvd2VyU3RhdGUoJWQpIGlzIHRoZSBzYW1lLlxuIiwKIAkJCSBlUkZQb3dlclN0YXRlKTsKIAkJcmV0dXJuIGJSZXN1bHQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5eEVfcGh5cmVnLmgKaW5kZXggOTcwMjk4Yi4uMDNlZWUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOXhFX3BoeXJlZy5oCkBAIC04ODgsMTMgKzg4OCw2IEBACiAjZGVmaW5lIGJPRkRNUEhZMF9FbmQgICAgICAgICAgICAgMHhjZmYKICNkZWZpbmUgYk9GRE1QSFkxX0VuZCAgICAgICAgICAgICAweGRmZgogCi0vKiNkZWZpbmUgbWF4IGRlYnVnIGl0ZW0gaW4gZWFjaCBkZWJ1ZyBwYWdlCi0jZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMCAgICAgICAgMHg5Ci0jZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMSAgICAgICAgMHgzCi0jZGVmaW5lIGJNYXhJdGVtX1BIWV8xMUIgICAgICAgICAgMHgxNgotI2RlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTAgICAgICAgIDB4MjkKLSNkZWZpbmUgYk1heEl0ZW1fT0ZETV9QSFkxICAgICAgICAweDAgKi8KLQogI2RlZmluZSBiUE1BQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MAogI2RlZmluZSBiV01BQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MQogI2RlZmluZSBiV05JQ0NvbnRyb2wgICAgICAgICAgICAgIDB4MgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY2FtLmMKaW5kZXggODllYTcwYi4uNDFiMDI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NhbS5jCkBAIC04Niw5ICs4Niw5IEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOwogCi0JUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT09PT09PT09PT4lcygpOkVudHJ5Tm8gaXMgJWQsS2V5SW5kZXggaXMgIgotCQkgIiVkLEtleVR5cGUgaXMgJWQsaXNfbWVzaCBpcyAlZFxuIiwgX19mdW5jX18sIEVudHJ5Tm8sCi0JCSBLZXlJbmRleCwgS2V5VHlwZSwgaXNfbWVzaCk7CisJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCSAiPT09PT09PT09PT0+JXMoKTpFbnRyeU5vIGlzICVkLEtleUluZGV4IGlzICVkLEtleVR5cGUgaXMgJWQsaXNfbWVzaCBpcyAlZFxuIiwKKwkJIF9fZnVuY19fLCBFbnRyeU5vLCBLZXlJbmRleCwgS2V5VHlwZSwgaXNfbWVzaCk7CiAJaWYgKCFpc19tZXNoKSB7CiAJCWllZWUtPnN3Y2FtdGFibGVbRW50cnlOb10uYnVzZWQgPSB0cnVlOwogCQlpZWVlLT5zd2NhbXRhYmxlW0VudHJ5Tm9dLmtleV9pbmRleCA9IEtleUluZGV4OwpAQCAtMTE1LDIxICsxMTUsMjAgQEAKIAkJCWlmIChwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uID4gUkZfQ0hBTkdFX0JZX0lQUykgewogCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogUkYgaXMgT0ZGLlxuIiwKIAkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybiA7Ci0JCQl9IGVsc2UgewotCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7Ci0JCQkJSVBTTGVhdmUoZGV2KTsKLQkJCQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwkJCQlyZXR1cm47CiAJCQl9CisJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJSVBTTGVhdmUoZGV2KTsKKwkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOwogCQl9CiAJfQogCXByaXYtPnJ0bGxpYi0+aXNfc2V0X2tleSA9IHRydWU7CiAJaWYgKEVudHJ5Tm8gPj0gVE9UQUxfQ0FNX0VOVFJZKQogCQlSVF9UUkFDRShDT01QX0VSUiwgImNhbSBlbnRyeSBleGNlZWRzIGluIHNldEtleSgpXG4iKTsKIAotCVJUX1RSQUNFKENPTVBfU0VDLCAiPT09PT50byBzZXRLZXkoKSwgZGV2OiVwLCBFbnRyeU5vOiVkLCBLZXlJbmRleDolZCwiCi0JCSAiS2V5VHlwZTolZCwgTWFjQWRkciAlcE1cbiIsIGRldiwgRW50cnlObywgS2V5SW5kZXgsCi0JCSBLZXlUeXBlLCBNYWNBZGRyKTsKKwlSVF9UUkFDRShDT01QX1NFQywKKwkJICI9PT09PnRvIHNldEtleSgpLCBkZXY6JXAsIEVudHJ5Tm86JWQsIEtleUluZGV4OiVkLEtleVR5cGU6JWQsIE1hY0FkZHIgJXBNXG4iLAorCQkgZGV2LCBFbnRyeU5vLCBLZXlJbmRleCwgS2V5VHlwZSwgTWFjQWRkcik7CiAKIAlpZiAoRGVmYXVsdEtleSkKIAkJdXNDb25maWcgfD0gQklUMTUgfCAoS2V5VHlwZTw8Mik7CkBAIC0xOTIsNyArMTkxLDcgQEAKIAkJZm9yIChFbnRyeUlkID0gMDsgRW50cnlJZCA8IDQ7IEVudHJ5SWQrKykgewogCQkJTWFjQWRkciA9IENBTV9DT05TVF9BRERSW0VudHJ5SWRdOwogCQkJaWYgKHByaXYtPnJ0bGxpYi0+c3djYW10YWJsZVtFbnRyeUlkXS5idXNlZCkgewotCQkJCXNldEtleShkZXYsIEVudHJ5SWQgLCBFbnRyeUlkLAorCQkJCXNldEtleShkZXYsIEVudHJ5SWQsIEVudHJ5SWQsCiAJCQkJICAgICAgIHByaXYtPnJ0bGxpYi0+cGFpcndpc2Vfa2V5X3R5cGUsIE1hY0FkZHIsCiAJCQkJICAgICAgIDAsICh1MzIgKikoJnByaXYtPnJ0bGxpYi0+c3djYW10YWJsZQogCQkJCSAgICAgIFtFbnRyeUlkXS5rZXlfYnVmWzBdKSk7CkBAIC0yNDQsOCArMjQzLDggQEAKIAkJCQkgICAgICAgKHUzMiAqKSgmcHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlWzBdLmtleV9idWZbMF0pCiAJCQkJICAgICApOwogCQkJfSBlbHNlIHsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIj09PT4lcygpOkVSUiEhIEFESE9DIFRLSVAgIgotCQkJCQkgIixidXQgMCBlbnRyeSBpcyBoYXZlIG5vIGRhdGFcbiIsCisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJCSAiPT09PiVzKCk6RVJSISEgQURIT0MgVEtJUCAsYnV0IDAgZW50cnkgaXMgaGF2ZSBubyBkYXRhXG4iLAogCQkJCQkgX19mdW5jX18pOwogCQkJCXJldHVybjsKIAkJCX0KQEAgLTI1NCw3ICsyNTMsNyBAQAogCQlNYWNBZGRyID0gQ0FNX0NPTlNUX0JST0FEOwogCQlmb3IgKEVudHJ5SWQgPSAxOyBFbnRyeUlkIDwgNDsgRW50cnlJZCsrKSB7CiAJCQlpZiAocHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlW0VudHJ5SWRdLmJ1c2VkKSB7Ci0JCQkJc2V0S2V5KGRldiwgRW50cnlJZCAsIEVudHJ5SWQsCisJCQkJc2V0S2V5KGRldiwgRW50cnlJZCwgRW50cnlJZCwKIAkJCQkgICAgICAgcHJpdi0+cnRsbGliLT5ncm91cF9rZXlfdHlwZSwKIAkJCQkgICAgICAgTWFjQWRkciwgMCwKIAkJCQkgICAgICAgKHUzMiAqKSgmcHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlW0VudHJ5SWRdLmtleV9idWZbMF0pKTsKQEAgLTI2MywxMyArMjYyLDEzIEBACiAKIAkJaWYgKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CiAJCQlpZiAocHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlWzBdLmJ1c2VkKSB7Ci0JCQkJc2V0S2V5KGRldiwgMCAsIDAsCisJCQkJc2V0S2V5KGRldiwgMCwgMCwKIAkJCQkJcHJpdi0+cnRsbGliLT5ncm91cF9rZXlfdHlwZSwKIAkJCQkJQ0FNX0NPTlNUX0FERFJbMF0sIDAsCiAJCQkJCSh1MzIgKikoJnByaXYtPnJ0bGxpYi0+c3djYW10YWJsZVswXS5rZXlfYnVmWzBdKSk7CiAJCQl9IGVsc2UgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiPT09PiVzKCk6RVJSISEgQURIT0MgQ0NNUCAsIgotCQkJCQkgImJ1dCAwIGVudHJ5IGlzIGhhdmUgbm8gZGF0YVxuIiwKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJICI9PT0+JXMoKTpFUlIhISBBREhPQyBDQ01QICxidXQgMCBlbnRyeSBpcyBoYXZlIG5vIGRhdGFcbiIsCiAJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYwppbmRleCA1NjE1YzgwLi4zNTJkMzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAKIHZvaWQgd3JpdGVfbmljX2lvX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsIHU4IHkpCiB7Ci0JdTMyIHU0YlBhZ2UgPSAoeCA+PiA4KTsKKwl1MzIgdTRiUGFnZSA9IHggPj4gODsKIAl1OCB1MVBhZ2VNYXNrID0gMDsKIAlib29sCWJJc0xlZ2FsUGFnZSA9IGZhbHNlOwogCkBAIC0xNTQsNyArMTU0LDcgQEAKIAogdm9pZCB3cml0ZV9uaWNfaW9fd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTE2IHkpCiB7Ci0JdTMyIHU0YlBhZ2UgPSAoeCA+PiA4KTsKKwl1MzIgdTRiUGFnZSA9IHggPj4gODsKIAl1OCB1MVBhZ2VNYXNrID0gMDsKIAlib29sCWJJc0xlZ2FsUGFnZSA9IGZhbHNlOwogCkBAIC0xNzcsNyArMTc3LDcgQEAKIAogdm9pZCB3cml0ZV9uaWNfaW9fZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsIHUzMiB5KQogewotCXUzMiB1NGJQYWdlID0gKHggPj4gOCk7CisJdTMyIHU0YlBhZ2UgPSB4ID4+IDg7CiAJdTggdTFQYWdlTWFzayA9IDA7CiAJYm9vbAliSXNMZWdhbFBhZ2UgPSBmYWxzZTsKIApAQCAtMTk5LDI0ICsxOTksMjMgQEAKIAogdTggcmVhZF9uaWNfaW9fYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKIHsKLQl1MzIgdTRiUGFnZSA9ICh4ID4+IDgpOworCXUzMiB1NGJQYWdlID0geCA+PiA4OwogCXU4IHUxUGFnZU1hc2sgPSAwOwogCWJvb2wJYklzTGVnYWxQYWdlID0gZmFsc2U7CiAJdTgJRGF0YSA9IDA7CiAKLQlpZiAodTRiUGFnZSA9PSAwKSB7CisJaWYgKHU0YlBhZ2UgPT0gMCkKIAkJcmV0dXJuIDB4ZmYmaW5iKGRldi0+YmFzZV9hZGRyICsgeCk7Ci0JfSBlbHNlIHsKLQkJYklzTGVnYWxQYWdlID0gUGxhdGZvcm1JT0NoZWNrUGFnZUxlZ2FsQW5kR2V0UmVnTWFzayh1NGJQYWdlLAotCQkJCQkJCSZ1MVBhZ2VNYXNrKTsKLQkJaWYgKGJJc0xlZ2FsUGFnZSkgewotCQkJdTggdTFiUHNyID0gcmVhZF9uaWNfaW9fYnl0ZShkZXYsIFBTUik7CiAKLQkJCXdyaXRlX25pY19pb19ieXRlKGRldiwgUFNSLCAoKHUxYlBzciAmIHUxUGFnZU1hc2spIHwKLQkJCQkJICAodTgpdTRiUGFnZSkpOwotCQkJRGF0YSA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCAoeCAmIDB4ZmYpKTsKLQkJCXdyaXRlX25pY19pb19ieXRlKGRldiwgUFNSLCAodTFiUHNyICYgdTFQYWdlTWFzaykpOwotCQl9CisJYklzTGVnYWxQYWdlID0gUGxhdGZvcm1JT0NoZWNrUGFnZUxlZ2FsQW5kR2V0UmVnTWFzayh1NGJQYWdlLAorCQkJCQkJCSAgICAgJnUxUGFnZU1hc2spOworCWlmIChiSXNMZWdhbFBhZ2UpIHsKKwkJdTggdTFiUHNyID0gcmVhZF9uaWNfaW9fYnl0ZShkZXYsIFBTUik7CisKKwkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAorCQkJCSAgKHU4KXU0YlBhZ2UpKTsKKwkJRGF0YSA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCAoeCAmIDB4ZmYpKTsKKwkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7CiAJfQogCiAJcmV0dXJuIERhdGE7CkBAIC0yMjQsMjUgKzIyMywyMiBAQAogCiB1MTYgcmVhZF9uaWNfaW9fd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKIHsKLQl1MzIgdTRiUGFnZSA9ICh4ID4+IDgpOworCXUzMiB1NGJQYWdlID0geCA+PiA4OwogCXU4IHUxUGFnZU1hc2sgPSAwOwogCWJvb2wJYklzTGVnYWxQYWdlID0gZmFsc2U7CiAJdTE2CURhdGEgPSAwOwogCi0JaWYgKHU0YlBhZ2UgPT0gMCkgeworCWlmICh1NGJQYWdlID09IDApCiAJCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyB4KTsKLQl9IGVsc2UgewotCQliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCi0JCQkgICAgICAgJnUxUGFnZU1hc2spOwotCQlpZiAoYklzTGVnYWxQYWdlKSB7Ci0JCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKKwliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCisJCQkJCQkJICAgICAmdTFQYWdlTWFzayk7CisJaWYgKGJJc0xlZ2FsUGFnZSkgeworCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKIAotCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAotCQkJCQkgICh1OCl1NGJQYWdlKSk7Ci0JCQlEYXRhID0gcmVhZF9uaWNfaW9fd29yZChkZXYsICh4ICYgMHhmZikpOwotCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7Ci0KLQkJfQorCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKCh1MWJQc3IgJiB1MVBhZ2VNYXNrKSB8CisJCQkJICAodTgpdTRiUGFnZSkpOworCQlEYXRhID0gcmVhZF9uaWNfaW9fd29yZChkZXYsICh4ICYgMHhmZikpOworCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKHUxYlBzciAmIHUxUGFnZU1hc2spKTsKIAl9CiAKIAlyZXR1cm4gRGF0YTsKQEAgLTI1MCwyNSArMjQ2LDIyIEBACiAKIHUzMiByZWFkX25pY19pb19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKIHsKLQl1MzIgdTRiUGFnZSA9ICh4ID4+IDgpOworCXUzMiB1NGJQYWdlID0geCA+PiA4OwogCXU4IHUxUGFnZU1hc2sgPSAwOwogCWJvb2wJYklzTGVnYWxQYWdlID0gZmFsc2U7CiAJdTMyCURhdGEgPSAwOwogCi0JaWYgKHU0YlBhZ2UgPT0gMCkgeworCWlmICh1NGJQYWdlID09IDApCiAJCXJldHVybiBpbmwoZGV2LT5iYXNlX2FkZHIgKyB4KTsKLQl9IGVsc2UgewotCQliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCi0JCQkgICAgICAgJnUxUGFnZU1hc2spOwotCQlpZiAoYklzTGVnYWxQYWdlKSB7Ci0JCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKKwliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCisJCSAgICAgICAmdTFQYWdlTWFzayk7CisJaWYgKGJJc0xlZ2FsUGFnZSkgeworCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKIAotCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAotCQkJCQkgICh1OCl1NGJQYWdlKSk7Ci0JCQlEYXRhID0gcmVhZF9uaWNfaW9fZHdvcmQoZGV2LCAoeCAmIDB4ZmYpKTsKLQkJCXdyaXRlX25pY19pb19ieXRlKGRldiwgUFNSLCAodTFiUHNyICYgdTFQYWdlTWFzaykpOwotCi0JCX0KKwkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAorCQkJCSAgKHU4KXU0YlBhZ2UpKTsKKwkJRGF0YSA9IHJlYWRfbmljX2lvX2R3b3JkKGRldiwgKHggJiAweGZmKSk7CisJCXdyaXRlX25pY19pb19ieXRlKGRldiwgUFNSLCAodTFiUHNyICYgdTFQYWdlTWFzaykpOwogCX0KIAogCXJldHVybiBEYXRhOwpAQCAtMzI2LDggKzMxOSw4IEBACiAJdTE2CQkJUkZXYWl0Q291bnRlciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCi0JUlRfVFJBQ0UoKENPTVBfUFMgfCBDT01QX1JGKSwgIj09PT5NZ250QWN0U2V0X1JGX1N0YXRlKCk6ICIKLQkJICJTdGF0ZVRvU2V0KCVkKVxuIiwgU3RhdGVUb1NldCk7CisJUlRfVFJBQ0UoKENPTVBfUFMgfCBDT01QX1JGKSwKKwkJICI9PT0+TWdudEFjdFNldF9SRl9TdGF0ZSgpOiBTdGF0ZVRvU2V0KCVkKVxuIiwgU3RhdGVUb1NldCk7CiAKIAlQcm90ZWN0T3JOb3QgPSBmYWxzZTsKIApAQCAtMzM4LDIyICszMzEsMTkgQEAKIAkJCWlmIChwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFnKTsKIAkJCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLAotCQkJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogUkYgQ2hhbmdlIGluICIKLQkJCQkJICJwcm9ncmVzcyEgV2FpdCB0byBzZXQuLlN0YXRlVG9TZXQiCi0JCQkJCSAiKCVkKS5cbiIsIFN0YXRlVG9TZXQpOworCQkJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogUkYgQ2hhbmdlIGluIHByb2dyZXNzISBXYWl0IHRvIHNldC4uU3RhdGVUb1NldCglZCkuXG4iLAorCQkJCQkgU3RhdGVUb1NldCk7CiAKIAkJCQl3aGlsZSAocHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzKSB7CiAJCQkJCVJGV2FpdENvdW50ZXIrKzsKIAkJCQkJUlRfVFJBQ0UoKENPTVBfUFMgfCBDT01QX1JGKSwKLQkJCQkJCSAiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBXYWl0IDEiCi0JCQkJCQkgIiBtcyAoJWQgdGltZXMpLi4uXG4iLAorCQkJCQkJICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFdhaXQgMSBtcyAoJWQgdGltZXMpLi4uXG4iLAogCQkJCQkJIFJGV2FpdENvdW50ZXIpOwogCQkJCQltZGVsYXkoMSk7CiAKIAkJCQkJaWYgKFJGV2FpdENvdW50ZXIgPiAxMDApIHsKLQkJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiTWdudEFjdFNldF8iCi0JCQkJCQkJICJSRl9TdGF0ZSgpOiBXYWl0IHRvbyAiCi0JCQkJCQkJICJsb2duIHRvIHNldCBSRlxuIik7CisJCQkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogV2FpdCB0b28gbG9nbiB0byBzZXQgUkZcbiIpOwogCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQl9CiAJCQkJfQpAQCAtMzgzLDkgKzM3Myw4IEBACiAJCQkgICAgQ2hhbmdlU291cmNlID49IFJGX0NIQU5HRV9CWV9IVykKIAkJCQliQ29ubmVjdEJ5U1NJRCA9IHRydWU7CiAJCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLCAiTWdudEFjdFNldF9SRl9TdGF0ZSAtICIKLQkJCQkgImVSZm9uIHJlamVjdCBwTWdudEluZm8tPlJmT2ZmUmVhc29uPSAweCV4LCIKLQkJCQkgIiBDaGFuZ2VTb3VyY2U9MHglWFxuIiwKKwkJCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksCisJCQkJICJNZ250QWN0U2V0X1JGX1N0YXRlIC0gZVJmb24gcmVqZWN0IHBNZ250SW5mby0+UmZPZmZSZWFzb249IDB4JXgsIENoYW5nZVNvdXJjZT0weCVYXG4iLAogCQkJCSAgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiwgQ2hhbmdlU291cmNlKTsKIAl9CiAKQEAgLTQyMSw4ICs0MTAsOCBAQAogCX0KIAogCWlmIChiQWN0aW9uQWxsb3dlZCkgewotCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLCAiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBBY3Rpb24gaXMiCi0JCQkgIiBhbGxvd2VkLi4uLiBTdGF0ZVRvU2V0KCVkKSwgUmZPZmZSZWFzb24oJSNYKVxuIiwKKwkJUlRfVFJBQ0UoKENPTVBfUFMgfCBDT01QX1JGKSwKKwkJCSAiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBBY3Rpb24gaXMgYWxsb3dlZC4uLi4gU3RhdGVUb1NldCglZCksIFJmT2ZmUmVhc29uKCUjWClcbiIsCiAJCQkgU3RhdGVUb1NldCwgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbik7CiAJCVBIWV9TZXRSRlBvd2VyU3RhdGUoZGV2LCBTdGF0ZVRvU2V0KTsKIAkJaWYgKFN0YXRlVG9TZXQgPT0gZVJmT24pIHsKQEAgLTQzNCwxMCArNDIzLDkgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6ICIKLQkJCSAiQWN0aW9uIGlzIHJlamVjdGVkLi4uLiBTdGF0ZVRvU2V0KCVkKSwgQ2hhbmdlU291cmNlIgotCQkJICIoJSNYKSwgUmZPZmZSZWFzb24oJSNYKVxuIiwgU3RhdGVUb1NldCwgQ2hhbmdlU291cmNlLAotCQkJIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24pOworCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLAorCQkJICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyByZWplY3RlZC4uLi4gU3RhdGVUb1NldCglZCksIENoYW5nZVNvdXJjZSglI1gpLCBSZk9mZlJlYXNvbiglI1gpXG4iLAorCQkJIFN0YXRlVG9TZXQsIENoYW5nZVNvdXJjZSwgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbik7CiAJfQogCiAJaWYgKCFQcm90ZWN0T3JOb3QpIHsKQEAgLTQ2MCw5ICs0NDgsOSBAQAogCSogYmV0d2VlbiB0aGUgdGFpbCBhbmQgdGhlIGhlYWQKIAkqLwogCWlmICgocHJpbyA9PSBNR05UX1FVRVVFKSAmJiAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpID4gMTApKQotCQlSVF9UUkFDRShDT01QX0RCRywgIi0tLS0tWyVkXS0tLS0tLS0tLXJpbmctPmlkeD0lZCAiCi0JCQkgInF1ZXVlX2xlbj0lZC0tLS0tLS0tLVxuIiwgcHJpbywgcmluZy0+aWR4LAotCQkJIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSk7CisJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJICItLS0tLVslZF0tLS0tLS0tLS1yaW5nLT5pZHg9JWQgcXVldWVfbGVuPSVkLS0tLS0tLS0tXG4iLAorCQkJIHByaW8sIHJpbmctPmlkeCwgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKTsKIAlyZXR1cm4gc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpOwogfQogCkBAIC00ODEsNyArNDY5LDcgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKIAlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVFhUSU1FT1VUIik7CisJbmV0ZGV2X2luZm8oZGV2LCAiVFhUSU1FT1VUIik7CiB9CiAKIHZvaWQgcnRsODE5Ml9pcnFfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01MjYsOCArNTE0LDkgQEAKIAkJaWYgKHByaXYtPmRvdDExQ3VycmVudFByZWFtYmxlTW9kZSAhPSBQUkVBTUJMRV9TSE9SVCkgewogCQkJU2hvcnRQcmVhbWJsZSA9IHRydWU7CiAJCQlwcml2LT5kb3QxMUN1cnJlbnRQcmVhbWJsZU1vZGUgPSBQUkVBTUJMRV9TSE9SVDsKLQkJCVJUX1RSQUNFKENPTVBfREJHLCAiJXMoKTogV0xBTl9DQVBBQklMSVRZX1NIT1JUXyIKLQkJCQkgIlBSRUFNQkxFXG4iLCBfX2Z1bmNfXyk7CisJCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCQkgIiVzKCk6IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRVxuIiwKKwkJCQkgX19mdW5jX18pOwogCQkJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfQUNLX1BSRUFNQkxFLAogCQkJCQkodW5zaWduZWQgY2hhciAqKSZTaG9ydFByZWFtYmxlKTsKIAkJfQpAQCAtNTM1LDggKzUyNCw5IEBACiAJCWlmIChwcml2LT5kb3QxMUN1cnJlbnRQcmVhbWJsZU1vZGUgIT0gUFJFQU1CTEVfTE9ORykgewogCQkJU2hvcnRQcmVhbWJsZSA9IGZhbHNlOwogCQkJcHJpdi0+ZG90MTFDdXJyZW50UHJlYW1ibGVNb2RlID0gUFJFQU1CTEVfTE9ORzsKLQkJCVJUX1RSQUNFKENPTVBfREJHLCAiJXMoKTogV0xBTl9DQVBBQklMSVRZX0xPTkdfIgotCQkJCSAiUFJFQU1CTEVcbiIsIF9fZnVuY19fKTsKKwkJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJCSAiJXMoKTogV0xBTl9DQVBBQklMSVRZX0xPTkdfUFJFQU1CTEVcbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJCXByaXYtPnJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0FDS19QUkVBTUJMRSwKIAkJCQkJICAgICAgKHVuc2lnbmVkIGNoYXIgKikmU2hvcnRQcmVhbWJsZSk7CiAJCX0KQEAgLTU5Nyw4ICs1ODcsOCBAQAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKQogCQlnb3RvIHN1Y2Nlc3M7Ci0JUlRfVFJBQ0UoQ09NUF9RT1MsICJxb3MgYWN0aXZlIHByb2Nlc3Mgd2l0aCBhc3NvY2lhdGUgcmVzcG9uc2UgIgotCQkgInJlY2VpdmVkXG4iKTsKKwlSVF9UUkFDRShDT01QX1FPUywKKwkJICJxb3MgYWN0aXZlIHByb2Nlc3Mgd2l0aCBhc3NvY2lhdGUgcmVzcG9uc2UgcmVjZWl2ZWRcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8ICBRT1NfUVVFVUVfTlVNOyBpKyspCiAJCXByaXYtPnJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0FDX1BBUkFNLCAodTggKikoJmkpKTsKQEAgLTYxOCw3ICs2MDgsNyBAQAogCWlmIChwcml2LT5ydGxsaWItPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKSkKKwlpZiAocHJpdi0+cnRsbGliLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfTUFTSykgewpAQCAtNjM0LDggKzYyNCw4IEBACiAJCQkJbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQ7CiAJcHJpdi0+cnRsbGliLT53bW1fYWNtID0gbmV0d29yay0+cW9zX2RhdGEud21tX2FjbTsKIAkJCXF1ZXVlX3dvcmtfcnNsKHByaXYtPnByaXZfd3EsICZwcml2LT5xb3NfYWN0aXZhdGUpOwotCQkJUlRfVFJBQ0UoQ09NUF9RT1MsICJRb1MgcGFyYW1ldGVycyBjaGFuZ2UgY2FsbCAiCi0JCQkJCSJxb3NfYWN0aXZhdGVcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9RT1MsCisJCQkJICJRb1MgcGFyYW1ldGVycyBjaGFuZ2UgY2FsbCBxb3NfYWN0aXZhdGVcbiIpOwogCQl9CiAJfSBlbHNlIHsKIAkJbWVtY3B5KCZwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzLApAQCAtNjQzLDggKzYzMyw4IEBACiAKIAkJaWYgKChuZXR3b3JrLT5xb3NfZGF0YS5hY3RpdmUgPT0gMSkgJiYgKGFjdGl2ZV9uZXR3b3JrID09IDEpKSB7CiAJCQlxdWV1ZV93b3JrX3JzbChwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKLQkJCVJUX1RSQUNFKENPTVBfUU9TLCAiUW9TIHdhcyBkaXNhYmxlZCBjYWxsIHFvc18iCi0JCQkJICJhY3RpdmF0ZVxuIik7CisJCQlSVF9UUkFDRShDT01QX1FPUywKKwkJCQkgIlFvUyB3YXMgZGlzYWJsZWQgY2FsbCBxb3NfYWN0aXZhdGVcbiIpOwogCQl9CiAJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IDA7CiAJCW5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7CkBAIC02NzksNyArNjY5LDcgQEAKIAlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKQogCQlyZXR1cm4gMDsKIAotCWlmICgocHJpdi0+cnRsbGliLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpKQorCWlmIChwcml2LT5ydGxsaWItPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnRsbGliLT5sb2NrLCBmbGFncyk7CkBAIC03NTEsOCArNzQxLDYgQEAKIAlwcml2LT5vcHMtPnR4X2ZpbGxfZGVzY3JpcHRvcihkZXYsIHBkZXNjLCB0Y2JfZGVzYywgcG5ld3NrYik7CiAJX19za2JfcXVldWVfdGFpbCgmcmluZy0+cXVldWUsIHBuZXdza2IpOwogCXBkZXNjLT5PV04gPSAxOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBydGw4MTkyX3N0b3BfYmVhY29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC04NjYsNyArODU0LDYgQEAKIAl9IGVsc2UgewogCQltZW1zZXQoaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOwogCX0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB1OCBydGw4MTkyX2dldFN1cHBvcnRlZFdpcmVsZWVNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC05MDksOCArODk2LDkgQEAKIAkJfSBlbHNlIGlmICgoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9CKSkgewogCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQjsKIAkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKSwgTm8gdmFsaWQgd2lyZWxlc3MgbW9kZSAiCi0JCQkJICJzdXBwb3J0ZWQgKCV4KSEhIVxuIiwgX19mdW5jX18sIGJTdXBwb3J0TW9kZSk7CisJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkgIiVzKCksIE5vIHZhbGlkIHdpcmVsZXNzIG1vZGUgc3VwcG9ydGVkICgleCkhISFcbiIsCisJCQkJIF9fZnVuY19fLCBiU3VwcG9ydE1vZGUpOwogCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQjsKIAkJfQogCX0KQEAgLTEwMjUsOCArMTAxMyw5IEBACiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KLQkJUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT0+JXMoKTpSRiBpcyBpbiBwcm9ncmVzcywgbmVlZCB0byB3YWl0ICIKLQkJCSAidW50aWwgcmYgY2hhbmdlIGlzIGRvbmUuXG4iLCBfX2Z1bmNfXyk7CisJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJICI9PT0+JXMoKTpSRiBpcyBpbiBwcm9ncmVzcywgbmVlZCB0byB3YWl0IHVudGlsIHJmIGNoYW5nZSBpcyBkb25lLlxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCW1kZWxheSgxKTsKIAkJUkZJblByb2dyZXNzVGltZU91dCsrOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOwpAQCAtMTIxMiw4ICsxMjAxLDggQEAKIAlwcml2LT5BY21Db250cm9sID0gMDsKIAlwcml2LT5wRmlybXdhcmUgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfZmlybXdhcmUpKTsKIAlpZiAoIXByaXYtPnBGaXJtd2FyZSkKLQkJcHJpbnRrKEtFUk5fRVJSICJydGw4MTkyZTogVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlICIKLQkJICAgICAgICJmb3IgZmlybXdhcmVcbiIpOworCQluZXRkZXZfZXJyKGRldiwKKwkJCSAgICJydGw4MTkyZTogVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBmaXJtd2FyZVxuIik7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5yeF9xdWV1ZSk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+c2tiX3F1ZXVlKTsKQEAgLTEyNzgsMTQgKzEyNjcsMTUgQEAKIAogCWlmICgocHJpdi0+cmZfY2hpcCAhPSBSRl84MjI1KSAmJiAocHJpdi0+cmZfY2hpcCAhPSBSRl84MjU2KQogCQkJJiYgKHByaXYtPnJmX2NoaXAgIT0gUkZfNjA1MikpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlczogdW5rbm93biByZiBjaGlwLCBjYW4ndCBzZXQgY2hhbm5lbCAiCi0JCQkgIm1hcFxuIiwgX19mdW5jX18pOworCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCSAiJXM6IHVua25vd24gcmYgY2hpcCwgY2FuJ3Qgc2V0IGNoYW5uZWwgbWFwXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChwcml2LT5DaGFubmVsUGxhbiA+PSBDT1VOVFJZX0NPREVfTUFYKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJ0bDgxOXhfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byAiCi0JCSAgICAgICAiZGVmYXVsdC5cbiIpOworCQluZXRkZXZfaW5mbyhkZXYsCisJCQkgICAgInJ0bDgxOXhfaW5pdDpFcnJvciBjaGFubmVsIHBsYW4hIFNldCB0byBkZWZhdWx0LlxuIik7CiAJCXByaXYtPkNoYW5uZWxQbGFuID0gQ09VTlRSWV9DT0RFX0ZDQzsKIAl9CiAJUlRfVFJBQ0UoQ09NUF9JTklULCAiQ2hhbm5lbCBwbGFuIGlzICVkXG4iLCBwcml2LT5DaGFubmVsUGxhbik7CkBAIC0xMzI5LDE1ICsxMzE5LDE1IEBACiAJcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOwogCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcnRsODE5Ml9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCSAgICBkZXYtPm5hbWUsIGRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhbGxvY2F0aW5nIElSUSAlZCIsIGRldi0+aXJxKTsKKwkJbmV0ZGV2X2VycihkZXYsICJFcnJvciBhbGxvY2F0aW5nIElSUSAlZCIsIGRldi0+aXJxKTsKIAkJcmV0dXJuIC0xOwotCX0gZWxzZSB7Ci0JCXByaXYtPmlycSA9IGRldi0+aXJxOwotCQlSVF9UUkFDRShDT01QX0lOSVQsICJJUlEgJWRcbiIsIGRldi0+aXJxKTsKIAl9CiAKKwlwcml2LT5pcnEgPSBkZXYtPmlycTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJJUlEgJWRcbiIsIGRldi0+aXJxKTsKKwogCWlmIChydGw4MTkyX3BjaV9pbml0ZGVzY3JpbmcoZGV2KSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRW5kb3BvaW50cyBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJbmV0ZGV2X2VycihkZXYsICJFbmRvcG9pbnRzIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOwogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTEzNTcsNyArMTM0Nyw3IEBACiAJCWlmICgoaSA9PSBUWENNRF9RVUVVRSkgfHwgKGkgPT0gSENDQV9RVUVVRSkpCiAJCQljb250aW51ZTsKIAkJaWYgKHNrYl9xdWV1ZV9sZW4oJigmcHJpdi0+dHhfcmluZ1tpXSktPnF1ZXVlKSA+IDApIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIj09PT50eCBxdWV1ZSBpcyBub3QgZW1wdHk6JWQsICVkXG4iLAorCQkJbmV0ZGV2X2luZm8oZGV2LCAiPT09PnR4IHF1ZXVlIGlzIG5vdCBlbXB0eTolZCwgJWRcbiIsCiAJCQkgICAgICAgaSwgc2tiX3F1ZXVlX2xlbigmKCZwcml2LT50eF9yaW5nW2ldKS0+cXVldWUpKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xNDA2LDE3ICsxMzk2LDE4IEBACiAJCQl0Y2JfZGVzYy0+blN0dWNrQ291bnQrKzsKIAkJCWJDaGVja0Z3VHhDbnQgPSB0cnVlOwogCQkJaWYgKHRjYl9kZXNjLT5uU3R1Y2tDb3VudCA+IDEpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFF1ZXVlSUQ9JWQgdGNiX2Rlc2MtPm4iCi0JCQkJICAgICAgICJTdHVja0NvdW50PSVkXG4iLCBfX2Z1bmNfXywgUXVldWVJRCwKLQkJCQkgICAgICAgdGNiX2Rlc2MtPm5TdHVja0NvdW50KTsKKwkJCQluZXRkZXZfaW5mbyhkZXYsCisJCQkJCSAgICAiJXM6IFF1ZXVlSUQ9JWQgdGNiX2Rlc2MtPm5TdHVja0NvdW50PSVkXG4iLAorCQkJCQkgICAgX19mdW5jX18sIFF1ZXVlSUQsCisJCQkJCSAgICB0Y2JfZGVzYy0+blN0dWNrQ291bnQpOwogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoYkNoZWNrRndUeENudCkgewogCQlpZiAocHJpdi0+b3BzLT5UeENoZWNrU3R1Y2tIYW5kbGVyKGRldikpIHsKLQkJCVJUX1RSQUNFKENPTVBfUkVTRVQsICJUeENoZWNrU3R1Y2soKTogRncgaW5kaWNhdGVzIG5vIgotCQkJCSAiIFR4IGNvbmRpdGlvbiFcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwKKwkJCQkgIlR4Q2hlY2tTdHVjaygpOiBGdyBpbmRpY2F0ZXMgbm8gVHggY29uZGl0aW9uIVxuIik7CiAJCQlyZXR1cm4gUkVTRVRfVFlQRV9TSUxFTlQ7CiAJCX0KIAl9CkBAIC0xNDU1LDEzICsxNDQ2LDEzIEBACiAKIAlpZiAoVHhSZXNldFR5cGUgPT0gUkVTRVRfVFlQRV9OT1JNQUwgfHwKIAkgICAgUnhSZXNldFR5cGUgPT0gUkVTRVRfVFlQRV9OT1JNQUwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogVHhSZXNldFR5cGUgaXMgJWQsIFJ4UmVzZXRUeXBlIGlzICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIFR4UmVzZXRUeXBlLCBSeFJlc2V0VHlwZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIiVzKCk6IFR4UmVzZXRUeXBlIGlzICVkLCBSeFJlc2V0VHlwZSBpcyAlZFxuIiwKKwkJCSAgICBfX2Z1bmNfXywgVHhSZXNldFR5cGUsIFJ4UmVzZXRUeXBlKTsKIAkJcmV0dXJuIFJFU0VUX1RZUEVfTk9STUFMOwogCX0gZWxzZSBpZiAoVHhSZXNldFR5cGUgPT0gUkVTRVRfVFlQRV9TSUxFTlQgfHwKIAkJICAgUnhSZXNldFR5cGUgPT0gUkVTRVRfVFlQRV9TSUxFTlQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogVHhSZXNldFR5cGUgaXMgJWQsIFJ4UmVzZXRUeXBlIGlzICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIFR4UmVzZXRUeXBlLCBSeFJlc2V0VHlwZSk7CisJCW5ldGRldl9pbmZvKGRldiwgIiVzKCk6IFR4UmVzZXRUeXBlIGlzICVkLCBSeFJlc2V0VHlwZSBpcyAlZFxuIiwKKwkJCSAgICBfX2Z1bmNfXywgVHhSZXNldFR5cGUsIFJ4UmVzZXRUeXBlKTsKIAkJcmV0dXJuIFJFU0VUX1RZUEVfU0lMRU5UOwogCX0gZWxzZSB7CiAJCXJldHVybiBSRVNFVF9UWVBFX05PUkVTRVQ7CkBAIC0xNTA2LDkgKzE0OTcsMTAgQEAKIAkJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkKIAkJCUxlaXN1cmVQU0xlYXZlKGRldik7CiAKLQkJaWYgKElTX05JQ19ET1dOKHByaXYpKSB7Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6dGhlIGRyaXZlciBpcyBub3QgdXAhICIKLQkJCQkgInJldHVyblxuIiwgX19mdW5jX18pOworCQlpZiAocHJpdi0+dXApIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCSAiJXMoKTp0aGUgZHJpdmVyIGlzIG5vdCB1cCEgcmV0dXJuXG4iLAorCQkJCSBfX2Z1bmNfXyk7CiAJCQl1cCgmcHJpdi0+d3hfc2VtKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTUxNyw4ICsxNTA5LDkgQEAKIAkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6PT09PT09PnN0YXJ0IHRvIGRvd24gdGhlIGRyaXZlclxuIiwKIAkJCSAgX19mdW5jX18pOwogCQltZGVsYXkoMTAwMCk7Ci0JCVJUX1RSQUNFKENPTVBfUkVTRVQsICIlcygpOjExMTExMTExMTExMTExMTExMTExMTExMT09PT09PT5zdGFydCIKLQkJCSAiIHRvIGRvd24gdGhlIGRyaXZlclxuIiwgX19mdW5jX18pOworCQlSVF9UUkFDRShDT01QX1JFU0VULAorCQkJICIlcygpOjExMTExMTExMTExMTExMTExMTExMTExMT09PT09PT5zdGFydCB0byBkb3duIHRoZSBkcml2ZXJcbiIsCisJCQkgX19mdW5jX18pOwogCiAJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQogCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwpAQCAtMTUzMSw3ICsxNTI0LDcgQEAKIAogCQlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgewogCQkJU0VNX0RPV05fSUVFRV9XWCgmaWVlZS0+d3hfc2VtKTsKLQkJCXByaW50ayhLRVJOX0lORk8gImllZWUtPnN0YXRlIGlzIFJUTExJQl9MSU5LRURcbiIpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiaWVlZS0+c3RhdGUgaXMgUlRMTElCX0xJTktFRFxuIik7CiAJCQlydGxsaWJfc3RvcF9zZW5kX2JlYWNvbnMocHJpdi0+cnRsbGliKTsKIAkJCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKQEAgLTE1MzksMjkgKzE1MzIsMzEgQEAKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJCQlTRU1fVVBfSUVFRV9XWCgmaWVlZS0+d3hfc2VtKTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImllZWUtPnN0YXRlIGlzIE5PVCBMSU5LRURcbiIpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiaWVlZS0+c3RhdGUgaXMgTk9UIExJTktFRFxuIik7CiAJCQlydGxsaWJfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPnJ0bGxpYiwgMCAsIHRydWUpOwogCQl9CiAKIAkJZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKGRldik7CiAKIAkJdXAoJnByaXYtPnd4X3NlbSk7Ci0JCVJUX1RSQUNFKENPTVBfUkVTRVQsICIlcygpOjw9PT09PT09PT09ZG93biBwcm9jZXNzIGlzICIKLQkJCSAiZmluaXNoZWRcbiIsIF9fZnVuY19fKTsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwKKwkJCSAiJXMoKTo8PT09PT09PT09PWRvd24gcHJvY2VzcyBpcyBmaW5pc2hlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAKIAkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6PD09PT09PT09PT09dXAgcHJvY2VzcyBzdGFydFxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJlc2V0X3N0YXR1cyA9IF9ydGw4MTkyX3VwKGRldiwgdHJ1ZSk7CiAKLQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6PD09PT09PT09PT09dXAgcHJvY2VzcyBpcyAiCi0JCQkgImZpbmlzaGVkXG4iLCBfX2Z1bmNfXyk7CisJCVJUX1RSQUNFKENPTVBfUkVTRVQsCisJCQkgIiVzKCk6PD09PT09PT09PT09dXAgcHJvY2VzcyBpcyBmaW5pc2hlZFxuIiwgX19mdW5jX18pOwogCQlpZiAocmVzZXRfc3RhdHVzID09IC0xKSB7CiAJCQlpZiAocmVzZXRfdGltZXMgPCAzKSB7CiAJCQkJcmVzZXRfdGltZXMrKzsKIAkJCQlnb3RvIFJFU0VUX1NUQVJUOwogCQkJfSBlbHNlIHsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIiBFUlIhISEgJXMoKTogIFJlc2V0ICIKLQkJCQkJICJGYWlsZWQhIVxuIiwgX19mdW5jX18pOworCQkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCQkgIiBFUlIhISEgJXMoKTogIFJlc2V0IEZhaWxlZCEhXG4iLAorCQkJCQkgX19mdW5jX18pOwogCQkJfQogCQl9CiAKQEAgLTE2NTAsNyArMTY0NSw3IEBACiAJYm9vbAliSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGZhbHNlOwogCWJvb2wgYkVudGVyUFMgPSBmYWxzZTsKIAotCWlmIChJU19OSUNfRE9XTihwcml2KSB8fCBwcml2LT5iSHdSYWRpb09mZikKKwlpZiAoIXByaXYtPnVwIHx8IHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm47CiAKIAlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA+PSBSVExMSUJfTElOS0VEKSB7CkBAIC0xNjcwLDggKzE2NjUsOCBAQAogCQkJaWYgKChpZWVlLT5Qb3dlclNhdmVDb250cm9sLlJldHVyblBvaW50ID09CiAJCQkgICAgIElQU19DQUxMQkFDS19OT05FKSAmJgogCQkJICAgICAoIWllZWUtPmJOZXRQcm9taXNjdW91c01vZGUpKSB7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9QUywgIj09PT09PT09PT09PT09PT09PT09PmhhaGE6ICIKLQkJCQkJICJJUFNFbnRlcigpXG4iKTsKKwkJCQlSVF9UUkFDRShDT01QX1BTLAorCQkJCQkgIj09PT09PT09PT09PT09PT09PT09PmhhaGE6IElQU0VudGVyKClcbiIpOwogCQkJCUlQU0VudGVyKGRldik7CiAJCQl9CiAJCX0KQEAgLTE3MzYsOCArMTczMSw5IEBACiAJCQlpZiAoaWVlZS0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpCiAJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQkJCXByaW50ayhLRVJOX0lORk8gIj09PT4lcygpOiBBUCBpcyBwb3dlciBvZmYsIGNoYW46JWQsIgotCQkJICAgICAgICIgY29ubmVjdCBhbm90aGVyIG9uZVxuIiwgX19mdW5jX18sIHByaXYtPmNoYW4pOworCQkJbmV0ZGV2X2luZm8oZGV2LAorCQkJCSAgICAiPT09PiVzKCk6IEFQIGlzIHBvd2VyIG9mZiwgY2hhbjolZCwgY29ubmVjdCBhbm90aGVyIG9uZVxuIiwKKwkJCQkgICAgX19mdW5jX18sIHByaXYtPmNoYW4pOwogCiAJCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElORzsKIApAQCAtMTc5Myw3ICsxNzg5LDcgQEAKIAogCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPndhdGNoX2RvZ193cSwgMCk7CiAJbW9kX3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIsIGppZmZpZXMgKwotCQkgIE1TRUNTKFJUTExJQl9XQVRDSF9ET0dfVElNRSkpOworCQkgIG1zZWNzX3RvX2ppZmZpZXMoUlRMTElCX1dBVENIX0RPR19USU1FKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODgyLDcgKzE4NzgsNyBAQAogCQkJCSAgICBNQVhfREVWX0FERFJfU0laRSk7CiAJdTggcXVldWVfaW5kZXggPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CiAKLQlpZiAoKHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpIHx8IElTX05JQ19ET1dOKHByaXYpIHx8CisJaWYgKChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKSB8fCAhcHJpdi0+dXAgfHwKIAkgICAgIHByaXYtPmJSZXNldEluUHJvZ3Jlc3MpIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKQEAgLTE5MDIsOCArMTg5OCw2IEBACiAJCQkJCQkgcHJpdi0+cnRsbGliLT50eF9oZWFkcm9vbSk7CiAJCXByaXYtPnJ0bGxpYi0+c3RhdHMudHhfcGFja2V0cysrOwogCX0KLQotCXJldHVybjsKIH0KIAogaW50IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xOTE2LDcgKzE5MTAsNyBAQAogCiAJaWYgKHF1ZXVlX2luZGV4ICE9IFRYQ01EX1FVRVVFKSB7CiAJCWlmICgocHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgfHwKLQkJICAgICBJU19OSUNfRE9XTihwcml2KSB8fCBwcml2LT5iUmVzZXRJblByb2dyZXNzKSB7CisJCSAgICAgIXByaXYtPnVwIHx8IHByaXYtPmJSZXNldEluUHJvZ3Jlc3MpIHsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE5MjYsMTcgKzE5MjAsMTYgQEAKIAlpZiAocXVldWVfaW5kZXggPT0gVFhDTURfUVVFVUUpIHsKIAkJcnRsODE5Ml90eF9jbWQoZGV2LCBza2IpOwogCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKLQkJdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAxOwotCQl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKLQkJdGNiX2Rlc2MtPmJUeEVuYWJsZUZ3Q2FsY0R1ciA9IDE7Ci0JCXNrYl9wdXNoKHNrYiwgcHJpdi0+cnRsbGliLT50eF9oZWFkcm9vbSk7Ci0JCXJldCA9IHJ0bDgxOTJfdHgoZGV2LCBza2IpOwotCQlpZiAocmV0ICE9IDApCi0JCQlrZnJlZV9za2Ioc2tiKTsKIAl9CiAKKwl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKKwl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CisJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDE7CisJdGNiX2Rlc2MtPmJUeEVuYWJsZUZ3Q2FsY0R1ciA9IDE7CisJc2tiX3B1c2goc2tiLCBwcml2LT5ydGxsaWItPnR4X2hlYWRyb29tKTsKKwlyZXQgPSBydGw4MTkyX3R4KGRldiwgc2tiKTsKKwlpZiAocmV0ICE9IDApCisJCWtmcmVlX3NrYihza2IpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE5ODcsOCArMTk4MCw2IEBACiAKIAlfX3NrYl9xdWV1ZV90YWlsKCZyaW5nLT5xdWV1ZSwgc2tiKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwogfQogCiBzaG9ydCBydGw4MTkyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0yMDA3LDkgKzE5OTgsOSBAQAogCXUzMiBmd2luZm9fc2l6ZSA9IDA7CiAKIAlpZiAocHJpdi0+YmRpc2FibGVfbmljKSB7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiJXM6IEVSUiEhIE5pYyBpcyBkaXNhYmxlZCEgQ2FuJ3QgdHggcGFja2V0IgotCQkJICIgbGVuPSVkIHFpZHg9JWQhISFcbiIsIF9fZnVuY19fLCBza2ItPmxlbiwKLQkJCSB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpOworCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCSAiJXM6IEVSUiEhIE5pYyBpcyBkaXNhYmxlZCEgQ2FuJ3QgdHggcGFja2V0IGxlbj0lZCBxaWR4PSVkISEhXG4iLAorCQkJIF9fZnVuY19fLCBza2ItPmxlbiwgdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKIAkJcmV0dXJuIHNrYi0+bGVuOwogCX0KIApAQCAtMjA0Niw4ICsyMDM3LDggQEAKIAogCXBkZXNjID0gJnJpbmctPmRlc2NbaWR4XTsKIAlpZiAoKHBkZXNjLT5PV04gPT0gMSkgJiYgKHRjYl9kZXNjLT5xdWV1ZV9pbmRleCAhPSBCRUFDT05fUVVFVUUpKSB7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiTm8gbW9yZSBUWCBkZXNjQCVkLCByaW5nLT5pZHggPSAlZCwgaWR4ID0gIgotCQkJICIlZCwgc2tibGVuID0gMHgleCBxdWV1ZWxlbj0lZCIsCisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICJObyBtb3JlIFRYIGRlc2NAJWQsIHJpbmctPmlkeCA9ICVkLCBpZHggPSAlZCwgc2tibGVuID0gMHgleCBxdWV1ZWxlbj0lZCIsCiAJCQkgdGNiX2Rlc2MtPnF1ZXVlX2luZGV4LCByaW5nLT5pZHgsIGlkeCwgc2tiLT5sZW4sCiAJCQkgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKQEAgLTIzMzIsNzYgKzIzMjMsNzQgQEAKIAkJCQkJW3ByaXYtPnJ4X2lkeFtyeF9xdWV1ZV9pZHhdXTsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnJ4X2J1ZltyeF9xdWV1ZV9pZHhdCiAJCQkJICAgICAgW3ByaXYtPnJ4X2lkeFtyeF9xdWV1ZV9pZHhdXTsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CiAKLQkJaWYgKHBkZXNjLT5PV04pIHsKKwkJaWYgKHBkZXNjLT5PV04pCiAJCQlyZXR1cm47CisJCWlmICghcHJpdi0+b3BzLT5yeF9xdWVyeV9zdGF0dXNfZGVzY3JpcHRvcihkZXYsICZzdGF0cywKKwkJcGRlc2MsIHNrYikpCisJCQlnb3RvIGRvbmU7CisJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4YnVmZmVyc2l6ZSk7CisJCS8qIGlmIGFsbG9jYXRpb24gb2YgbmV3IHNrYiBmYWlsZWQgLSBkcm9wIGN1cnJlbnQgcGFja2V0CisJCSAqIGFuZCByZXVzZSBza2IKKwkJICovCisJCWlmICh1bmxpa2VseSghbmV3X3NrYikpCisJCQlnb3RvIGRvbmU7CisKKwkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCSooKGRtYV9hZGRyX3QgKilza2ItPmNiKSwKKwkJCQlwcml2LT5yeGJ1ZmZlcnNpemUsCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlza2JfcHV0KHNrYiwgcGRlc2MtPkxlbmd0aCk7CisJCXNrYl9yZXNlcnZlKHNrYiwgc3RhdHMuUnhEcnZJbmZvU2l6ZSArCisJCQlzdGF0cy5SeEJ1ZlNoaWZ0KTsKKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQvKnNDcmNMbmcqLyk7CisJCXJ0bGxpYl9oZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfMWFkZHIgKilza2ItPmRhdGE7CisJCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocnRsbGliX2hkci0+YWRkcjEpKSB7CisJCQkvKiB1bmljYXN0IHBhY2tldCAqLworCQkJdW5pY2FzdF9wYWNrZXQgPSB0cnVlOworCQl9CisJCWZjID0gbGUxNl90b19jcHUocnRsbGliX2hkci0+ZnJhbWVfY3RsKTsKKwkJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCQlpZiAodHlwZSA9PSBSVExMSUJfRlRZUEVfTUdNVCkKKwkJCWJMZWRCbGlua2luZyA9IGZhbHNlOworCisJCWlmIChiTGVkQmxpbmtpbmcpCisJCQlpZiAocHJpdi0+cnRsbGliLT5MZWRDb250cm9sSGFuZGxlcikKKwkJCQlwcml2LT5ydGxsaWItPkxlZENvbnRyb2xIYW5kbGVyKGRldiwKKwkJCQkJCQlMRURfQ1RMX1JYKTsKKworCQlpZiAoc3RhdHMuYkNSQykgeworCQkJaWYgKHR5cGUgIT0gUlRMTElCX0ZUWVBFX01HTVQpCisJCQkJcHJpdi0+c3RhdHMucnhkYXRhY3JjZXJyKys7CisJCQllbHNlCisJCQkJcHJpdi0+c3RhdHMucnhtZ210Y3JjZXJyKys7CisJCX0KKworCQlza2JfbGVuID0gc2tiLT5sZW47CisKKwkJaWYgKCFydGxsaWJfcngocHJpdi0+cnRsbGliLCBza2IsICZzdGF0cykpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCX0gZWxzZSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwkJCXByaXYtPnN0YXRzLnJ4b2srKzsKKwkJCWlmICh1bmljYXN0X3BhY2tldCkKKwkJCQlwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCArPSBza2JfbGVuOworCQl9CiAKLQkJCWlmICghcHJpdi0+b3BzLT5yeF9xdWVyeV9zdGF0dXNfZGVzY3JpcHRvcihkZXYsICZzdGF0cywKLQkJCXBkZXNjLCBza2IpKQotCQkJCWdvdG8gZG9uZTsKLQkJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4YnVmZmVyc2l6ZSk7Ci0JCQkvKiBpZiBhbGxvY2F0aW9uIG9mIG5ldyBza2IgZmFpbGVkIC0gZHJvcCBjdXJyZW50IHBhY2tldAotCQkJKiBhbmQgcmV1c2Ugc2tiICovCi0JCQlpZiAodW5saWtlbHkoIW5ld19za2IpKQotCQkJCWdvdG8gZG9uZTsKKwkJc2tiID0gbmV3X3NrYjsKKwkJc2tiLT5kZXYgPSBkZXY7CiAKLQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKLQkJCQkJKigoZG1hX2FkZHJfdCAqKXNrYi0+Y2IpLAotCQkJCQlwcml2LT5yeGJ1ZmZlcnNpemUsCi0JCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0KLQkJCXNrYl9wdXQoc2tiLCBwZGVzYy0+TGVuZ3RoKTsKLQkJCXNrYl9yZXNlcnZlKHNrYiwgc3RhdHMuUnhEcnZJbmZvU2l6ZSArCi0JCQkJc3RhdHMuUnhCdWZTaGlmdCk7Ci0JCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKLQkJCXJ0bGxpYl9oZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfMWFkZHIgKilza2ItPmRhdGE7Ci0JCQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHJ0bGxpYl9oZHItPmFkZHIxKSkgewotCQkJCS8qIHVuaWNhc3QgcGFja2V0ICovCi0JCQkJdW5pY2FzdF9wYWNrZXQgPSB0cnVlOwotCQkJfQotCQkJZmMgPSBsZTE2X3RvX2NwdShydGxsaWJfaGRyLT5mcmFtZV9jdGwpOwotCQkJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOwotCQkJaWYgKHR5cGUgPT0gUlRMTElCX0ZUWVBFX01HTVQpCi0JCQkJYkxlZEJsaW5raW5nID0gZmFsc2U7Ci0KLQkJCWlmIChiTGVkQmxpbmtpbmcpCi0JCQkJaWYgKHByaXYtPnJ0bGxpYi0+TGVkQ29udHJvbEhhbmRsZXIpCi0JCQkJCXByaXYtPnJ0bGxpYi0+TGVkQ29udHJvbEhhbmRsZXIoZGV2LAotCQkJCQkJCQlMRURfQ1RMX1JYKTsKLQotCQkJaWYgKHN0YXRzLmJDUkMpIHsKLQkJCQlpZiAodHlwZSAhPSBSVExMSUJfRlRZUEVfTUdNVCkKLQkJCQkJcHJpdi0+c3RhdHMucnhkYXRhY3JjZXJyKys7Ci0JCQkJZWxzZQotCQkJCQlwcml2LT5zdGF0cy5yeG1nbXRjcmNlcnIrKzsKLQkJCX0KLQotCQkJc2tiX2xlbiA9IHNrYi0+bGVuOwotCi0JCQlpZiAoIXJ0bGxpYl9yeChwcml2LT5ydGxsaWIsIHNrYiwgJnN0YXRzKSkgewotCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQl9IGVsc2UgewotCQkJCXByaXYtPnN0YXRzLnJ4b2srKzsKLQkJCQlpZiAodW5pY2FzdF9wYWNrZXQpCi0JCQkJCXByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0ICs9IHNrYl9sZW47Ci0JCQl9Ci0KLQkJCXNrYiA9IG5ld19za2I7Ci0JCQlza2ItPmRldiA9IGRldjsKLQotCQkJcHJpdi0+cnhfYnVmW3J4X3F1ZXVlX2lkeF1bcHJpdi0+cnhfaWR4W3J4X3F1ZXVlX2lkeF1dID0KLQkJCQkJCQkJCSBza2I7Ci0JCQkqKChkbWFfYWRkcl90ICopIHNrYi0+Y2IpID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwKLQkJCQkJCSAgICBza2JfdGFpbF9wb2ludGVyX3JzbChza2IpLAotCQkJCQkJICAgIHByaXYtPnJ4YnVmZmVyc2l6ZSwKLQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wZGV2LAotCQkJCQkJICAqKChkbWFfYWRkcl90ICopc2tiLT5jYikpKSB7Ci0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisJCXByaXYtPnJ4X2J1ZltyeF9xdWV1ZV9pZHhdW3ByaXYtPnJ4X2lkeFtyeF9xdWV1ZV9pZHhdXSA9CisJCQkJCQkJCSBza2I7CisJCSooKGRtYV9hZGRyX3QgKikgc2tiLT5jYikgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgICAgc2tiX3RhaWxfcG9pbnRlcl9yc2woc2tiKSwKKwkJCQkJICAgIHByaXYtPnJ4YnVmZmVyc2l6ZSwKKwkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+cGRldiwKKwkJCQkJICAqKChkbWFfYWRkcl90ICopc2tiLT5jYikpKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuOwogCQl9CiBkb25lOgogCQlwZGVzYy0+QnVmZmVyQWRkcmVzcyA9ICooKGRtYV9hZGRyX3QgKilza2ItPmNiKTsKQEAgLTI1NjcsNyArMjU1Niw3IEBACiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwogCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSk7CiAKIAlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7CiAJdXAoJnByaXYtPnd4X3NlbSk7CkBAIC0yODY5LDcgKzI4NTgsOCBAQAogCiAJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7CiAJCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIlVuYWJsZSB0byBvYnRhaW4gMzJiaXQgRE1BIGZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zXG4iKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJVbmFibGUgdG8gb2J0YWluIDMyYml0IERNQSBmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CiAJCQlnb3RvIGVycl9wY2lfZGlzYWJsZTsKIAkJfQogCX0KQEAgLTI5MDIsNyArMjg5Miw4IEBACiAJCWdvdG8gZXJyX3JlbF9ydGxsaWI7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5IG1hcHBlZCBzcGFjZSBzdGFydDogMHglMDhseFxuIiwgcG1lbV9zdGFydCk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIk1lbW9yeSBtYXBwZWQgc3BhY2Ugc3RhcnQ6IDB4JTA4bHhcbiIsCisJCSBwbWVtX3N0YXJ0KTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwbWVtX3N0YXJ0LCBwbWVtX2xlbiwgRFJWX05BTUUpKSB7CiAJCVJUX1RSQUNFKENPTVBfRVJSLCAicmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZCEiKTsKIAkJZ290byBlcnJfcmVsX3J0bGxpYjsKQEAgLTI5NDAsOCArMjkzMSw4IEBACiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaICogMzsKIAogCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGlmbmFtZSkgPCAwKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9vcHM6IGRldm5hbWUgYWxyZWFkeSB0YWtlbiEgVHJ5aW5nICIKLQkJCSAid2xhbiUlZC4uLlxuIik7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwKKwkJCSAiT29wczogZGV2bmFtZSBhbHJlYWR5IHRha2VuISBUcnlpbmcgd2xhbiUlZC4uLlxuIik7CiAJCQlkZXZfYWxsb2NfbmFtZShkZXYsIGlmbmFtZSk7CiAJfQogCkBAIC0yOTgxLDcgKzI5NzIsNyBAQAogc3RhdGljIHZvaWQgcnRsODE5Ml9wY2lfZGlzY29ubmVjdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2IDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdjsKIAl1MzIgaTsKIAogCWlmIChkZXYpIHsKQEAgLTMwMDQsNyArMjk5NSw3IEBACiAJCQlydGw4MTkyX2ZyZWVfdHhfcmluZyhkZXYsIGkpOwogCiAJCWlmIChwcml2LT5pcnEpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIkZyZWVpbmcgaXJxICVkXG4iLCBkZXYtPmlycSk7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRnJlZWluZyBpcnEgJWRcbiIsIGRldi0+aXJxKTsKIAkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCQkJcHJpdi0+aXJxID0gMDsKIAkJfQpAQCAtMzAzMiw3ICszMDIzLDcgQEAKIAlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQogCQkJCQkoJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpKTsKIAotCWlmIChJU19OSUNfRE9XTihwcml2KSkgeworCWlmICghcHJpdi0+dXApIHsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlIhISEgJXMoKTogRHJpdmVyIGlzIGFscmVhZHkgZG93biFcbiIsCiAJCQkgX19mdW5jX18pOwogCQlwcml2LT5iZGlzYWJsZV9uaWMgPSBmYWxzZTsKQEAgLTMwNTksNyArMzA1MCw2IEBACiB9CiBib29sIE5pY0lGRGlzYWJsZU5JQyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWJvb2wJc3RhdHVzID0gdHJ1ZTsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJdTggdG1wX3N0YXRlID0gMDsKIApAQCAtMzA3NCwxMyArMzA2NCwxMyBAQAogCXByaXYtPm9wcy0+c3RvcF9hZGFwdGVyKGRldiwgZmFsc2UpOwogCVJUX1RSQUNFKENPTVBfUFMsICI8PT09PT09PT09JXMoKVxuIiwgX19mdW5jX18pOwogCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcnRsODE5Ml9wY2lfbW9kdWxlX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJcbkxpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIFJUTDgxOTJFIFdMQU4gY2FyZHNcbiIpOwotCXByaW50ayhLRVJOX0lORk8gIkNvcHlyaWdodCAoYykgMjAwNy0yMDA4LCBSZWFsc2lsIFdsYW4gRHJpdmVyXG4iKTsKKwlwcl9pbmZvKCJcbkxpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIFJUTDgxOTJFIFdMQU4gY2FyZHNcbiIpOworCXByX2luZm8oIkNvcHlyaWdodCAoYykgMjAwNy0yMDA4LCBSZWFsc2lsIFdsYW4gRHJpdmVyXG4iKTsKIAogCWlmICgwICE9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJ0bDgxOTJfcGNpX2RyaXZlcikpIHsKIAkJRE1FU0coIk5vIGRldmljZSBmb3VuZCIpOwpAQCAtMzEwNiw3ICszMDk2LDcgQEAKIAlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKHByaXYtPnByaXZfd3EsICZwcml2LT5ncGlvX2NoYW5nZV9yZl93cSwgMCk7CiAKIAltb2RfdGltZXIoJnByaXYtPmdwaW9fcG9sbGluZ190aW1lciwgamlmZmllcyArCi0JCSAgTVNFQ1MoUlRMTElCX1dBVENIX0RPR19USU1FKSk7CisJCSAgbXNlY3NfdG9famlmZmllcyhSVExMSUJfV0FUQ0hfRE9HX1RJTUUpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaAppbmRleCBkMTQzOGMyLi5kMzY1YWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaApAQCAtOTgsMTQgKzk4LDggQEAKICNkZWZpbmUgQklUKF9pKQkJCQkoMTw8KF9pKSkKICNlbmRpZgogCi0jZGVmaW5lIElTX05JQ19ET1dOKHByaXYpCSghKHByaXYpLT51cCkKLQogI2RlZmluZSBJU19BREFQVEVSX1NFTkRTX0JFQUNPTihkZXYpIDAKIAotI2RlZmluZSBJU19VTkRFUl8xMU5fQUVTX01PREUoX3J0bGxpYikJCVwKLQkoKF9ydGxsaWItPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IHRydWUpICYmIFwKLQkoX3J0bGxpYi0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfQ0NNUCkpCi0KICNkZWZpbmUgSEFMX01FTU9SWV9NQVBQRURfSU9fUkFOR0VfODE5MFBDSQkweDEwMDAKICNkZWZpbmUgSEFMX0hXX1BDSV9SRVZJU0lPTl9JRF84MTkwUENJCQkJMHgwMAogI2RlZmluZSBIQUxfTUVNT1JZX01BUFBFRF9JT19SQU5HRV84MTkyUENJRQkweDQwMDAKQEAgLTEwMDQsMTQgKzk5OCwxNCBAQAogCiB1OCByZWFkX25pY19pb19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKIHUzMiByZWFkX25pY19pb19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Ci11MTYgcmVhZF9uaWNfaW9fd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordTE2IHJlYWRfbmljX2lvX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwogdm9pZCB3cml0ZV9uaWNfaW9fYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTggeSk7CiB2b2lkIHdyaXRlX25pY19pb193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1MTYgeSk7CiB2b2lkIHdyaXRlX25pY19pb19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTMyIHkpOwogCiB1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKIHUzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Ci11MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwogdm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTggeSk7CiB2b2lkIHdyaXRlX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1MTYgeSk7CiB2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTMyIHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9kbS5jCmluZGV4IGI4ODkxYzYuLmRmNGJiY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2RtLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCWJvb2wgYnNob3J0X2dpX2VuYWJsZWQgPSBmYWxzZTsKIAlzdGF0aWMgdTggcGluZ19yc3NpX3N0YXRlOwogCi0JaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJaWYgKCFwcml2LT51cCkgewogCQlSVF9UUkFDRShDT01QX1JBVEUsICI8LS0tLSBkbV9jaGVja19yYXRlX2FkYXB0aXZlKCk6IGRyaXZlciBpcyBnb2luZyB0byB1bmxvYWRcbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMzc4LDE5ICszNzgsMTYgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKIAlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwIHx8Ci0JICAgIXByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJhdXRvc3dpdGNoX2VuYWJsZSkgeworCSAgICFwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iYXV0b3N3aXRjaF9lbmFibGUpCiAJCXJldHVybjsKKwlpZiAocHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID09IGZhbHNlKSB7CisJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9CisJCSAgICBwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfNDBNaHp0bzIwTWh6KQorCQkJcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gdHJ1ZTsKIAl9IGVsc2UgewotCQlpZiAocHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID09IGZhbHNlKSB7Ci0JCQlpZiAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PQotCQkJICAgIHByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF80ME1oenRvMjBNaHopCi0JCQkJcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49Ci0JCQkgICAgcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2gudGhyZXNob2xkXzIwTWh6dG80ME1oeikKLQkJCQlwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSBmYWxzZTsKLQotCQl9CisJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49CisJCSAgICBwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfMjBNaHp0bzQwTWh6KQorCQkJcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gZmFsc2U7CiAJfQogfQogCkBAIC01MDEsNyArNDk4LDcgQEAKIAkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBGV19CdXN5X0ZsYWcsIDApOwogCQkJCQlyZXR1cm47CiAJCQkJfQotCQkJCWlmICgocHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlICE9IGVSZk9uKSkgeworCQkJCWlmIChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgIT0gZVJmT24pIHsKIAkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKIAkJCQkJCSAid2UgYXJlIGluIHBvd2VyIHNhdmUsIHNvIHJldHVyblxuIik7CiAJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7CkBAIC01ODEsMTQ4ICs1NzgsMTQ4IEBACiAJCQkJCSAicHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9ICVkXG4iLAogCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbik7CiAJCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA8IFRTU0lfMTNkQm0gLSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykgewotCQkJCQlpZiAoUkZfVHlwZSA9PSBSRl8yVDRSKSB7CisJCQl9CisJCQlpZiAoQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA8IFRTU0lfMTNkQm0gLSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykgeworCQkJCWlmIChSRl9UeXBlID09IFJGXzJUNFIpIHsKIAotCQkJCQkJaWYgKChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKSAmJgotCQkJCQkJICAgIChwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKSkgewotCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleC0tOwotCQkJCQkJCWlmIChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA+IDQpIHsKLQkJCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKLQkJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCi0JCQkJCQkJCQkgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKLQkJCQkJCQkJCSBiTWFza0RXb3JkLAotCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07Ci0JCQkJCQkJaWYgKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkgewotCQkJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOwotCQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKLQkJCQkJCQkJCSByT0ZETTBfWENUeElRSW1iYWxhbmNlLAotCQkJCQkJCQkJIGJNYXNrRFdvcmQsCi0JCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCQkJCQkJIGJNYXNrRFdvcmQsCi0JCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAotCQkJCQkJCQkJIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsCi0JCQkJCQkJCQkgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA+IDApIHsKLQkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKLQkJCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KSB7Ci0JCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsLS07Ci0JCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAotCQkJCQkJCQkJCSByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCQkJCQkJCSBiTWFza0RXb3JkLAotCQkJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZQotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCQkJCQkJIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlWzRdLnR4YmJnYWluX3ZhbHVlKTsKLQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKFJGX1R5cGUgPT0gUkZfMlQ0UikgewotCQkJCQkJaWYgKChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPAotCQkJCQkJICAgIFR4QkJHYWluVGFibGVMZW5ndGggLSAxKSAmJgotCQkJCQkJICAgIChwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPAotCQkJCQkJICAgIFR4QkJHYWluVGFibGVMZW5ndGggLSAxKSkgewotCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCsrOwotCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7CisJCQkJCWlmICgocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkgJiYKKwkJCQkJICAgIChwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKSkgeworCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07CisJCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KSB7CisJCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKIAkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKIAkJCQkJCQkJIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCiAJCQkJCQkJCSBiTWFza0RXb3JkLAotCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGUKLQkJCQkJCQkJIFtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCsrOwotCQkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7CisJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQkJfQorCisJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKKwkJCQkJCWlmIChwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA+IDQpIHsKKwkJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOwogCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAogCQkJCQkJCQkgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwKIAkJCQkJCQkJIGJNYXNrRFdvcmQsCiAJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKLQkJCQkJCQkJIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkJCSBiTWFza0RXb3JkLAotCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDFdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKLQkJCQkJCQkJIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsCi0JCQkJCQkJCSBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMV0udHhiYmdhaW5fdmFsdWUpOwogCQkJCQkJfQogCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA8IChUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMSkpIHsKLQkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKLQkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOwotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAorCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCisJCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkJCSByT0ZETTBfWENUeElRSW1iYWxhbmNlLAorCQkJCQkJCQkgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA+IDApIHsKKwkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleC0tOworCQkJCQkJaWYgKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkgeworCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsLS07CisJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkJCQkgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKIAkJCQkJCQkJCSBiTWFza0RXb3JkLAogCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKLQkJCQkJCQkJCSBiTWFza0RXb3JkLAotCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKFJGX1R5cGUgPT0gUkZfMlQ0UikgewotCQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UKLQkJCQkJCT0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4IC0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ19kZWZhdWx0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZQotCQkJCQkJPSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCAtIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKLQkJCQl9Ci0KLQkJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0KLQkJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQgKwotCQkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKLQkJCQllbHNlCi0JCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQotCQkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fNDBNZGVmYXVsdCArCi0JCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwotCi0JCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPiAoQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xKSkKLQkJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IENDS1R4QkJHYWluVGFibGVMZW5ndGgtMTsKLQkJCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA8IDApCi0JCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAwOwotCi0JCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPiAtMSAmJgotCQkJCSAgICBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uIDwgQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aCkgewotCQkJCQlpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJgotCQkJCQkgICAgIXByaXYtPmJjY2tfaW5fY2gxNCkgewotCQkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gdHJ1ZTsKLQkJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpIHsKLQkJCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOwotCQkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCQkJCX0KIAkJCQkJfSBlbHNlCi0JCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOwotCQkJCX0KLQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAotCQkJCQkgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA9ICVkXG4iLAotCQkJCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKLQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAotCQkJCQkgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID0gJWRcbiIsCi0JCQkJCSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCk7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKLQkJCQkJICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPSAlZFxuIiwKLQkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSk7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKLQkJCQkJICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsCi0JCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAorCQkJCQkJCQkgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWUpOwogCi0JCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA8PSAtMTIgfHwgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID49IDI0KSB7Ci0JCQkJCXByaXYtPnJ0bGxpYi0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSB0cnVlOwotCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFB3X1RyYWNrX0ZsYWcsIDApOwotCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEZXX0J1c3lfRmxhZywgMCk7Ci0JCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ0eCBwb3dlciB0cmFjay0tLT5saW1pdGVkXG4iKTsKLQkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKFJGX1R5cGUgPT0gUkZfMlQ0UikgeworCQkJCQlpZiAoKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA8CisJCQkJCSAgICBUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMSkgJiYKKwkJCQkJICAgIChwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPAorCQkJCQkgICAgVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDEpKSB7CisJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKKwkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7CisJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkgYk1hc2tEV29yZCwKKwkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGUKKwkJCQkJCQkgW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKKwkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7CisJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkgYk1hc2tEV29yZCwKKwkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAorCQkJCQkJCSByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAorCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMV0udHhiYmdhaW5fdmFsdWUpOworCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkJIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsCisJCQkJCQkJIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4IDwgKFR4QkJHYWluVGFibGVMZW5ndGggLSAxKSkgeworCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4Kys7CisJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOworCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCisJCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJfSBlbHNlCisJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMV0udHhiYmdhaW5fdmFsdWUpOwogCQkJCX0KIAkJCX0KKwkJCWlmIChSRl9UeXBlID09IFJGXzJUNFIpIHsKKwkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UKKwkJCQkJPSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggLSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7CisJCQl9IGVsc2UgeworCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZQorCQkJCQk9IHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsIC0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ19kZWZhdWx0OworCQkJfQorCisJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQorCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl8yME1kZWZhdWx0ICsKKwkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKwkJCWVsc2UKKwkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0KKwkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fNDBNZGVmYXVsdCArCisJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisKKwkJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID4gKENDS1R4QkJHYWluVGFibGVMZW5ndGgtMSkpCisJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IENDS1R4QkJHYWluVGFibGVMZW5ndGgtMTsKKwkJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uIDwgMCkKKwkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gMDsKKworCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPiAtMSAmJgorCQkJICAgIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPCBDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoKSB7CisJCQkJaWYgKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYKKwkJCQkgICAgIXByaXYtPmJjY2tfaW5fY2gxNCkgeworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOworCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOworCQkJCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpIHsKKwkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gZmFsc2U7CisJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQkJfSBlbHNlCisJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQl9CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCSAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsCisJCQkJIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCSAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwKKwkJCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA9ICVkXG4iLAorCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAlZFxuIiwKKwkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbik7CisKKwkJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPD0gLTEyIHx8IHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA+PSAyNCkgeworCQkJCXByaXYtPnJ0bGxpYi0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSB0cnVlOworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBGV19CdXN5X0ZsYWcsIDApOworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ0eCBwb3dlciB0cmFjay0tLT5saW1pdGVkXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisKIAkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7CiAJCQlBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gMDsKIAkJCWZvciAoayA9IDA7IGsgPCA1OyBrKyspCkBAIC03NTcsOCArNzU0LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IENDS19UYWJsZV9sZW5ndGg7IGkrKykgewogCQkJaWYgKFRlbXBDQ2sgPT0gKHUzMilDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzBdKSB7CiAJCQkJcHJpdi0+Q0NLX2luZGV4ID0gKHU4KSBpOwotCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJJbml0aWFsIHJlZzB4JXgiCi0JCQkJCSAiID0gMHgleCwgQ0NLX2luZGV4ID0gMHgleFxuIiwKKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCQkgIkluaXRpYWwgcmVnMHgleCA9IDB4JXgsIENDS19pbmRleCA9IDB4JXhcbiIsCiAJCQkJCSByQ0NLMF9UeEZpbHRlcjEsIFRlbXBDQ2ssCiAJCQkJCSBwcml2LT5DQ0tfaW5kZXgpOwogCQkJCWJyZWFrOwpAQCAtODAzLDggKzgwMCw4IEBACiAKIAlwcml2LT5SZWNvcmRfQ0NLXzIwTWluZGV4ID0gdG1wQ0NLMjBNaW5kZXg7CiAJcHJpdi0+UmVjb3JkX0NDS180ME1pbmRleCA9IHRtcENDSzQwTWluZGV4OwotCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZWNvcmRfQ0NLXzIwTWluZGV4IC8gUmVjb3JkX0NDS180MCIKLQkJICJNaW5kZXggPSAlZCAvICVkLlxuIiwKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkgIlJlY29yZF9DQ0tfMjBNaW5kZXggLyBSZWNvcmRfQ0NLXzQwTWluZGV4ID0gJWQgLyAlZC5cbiIsCiAJCSBwcml2LT5SZWNvcmRfQ0NLXzIwTWluZGV4LCBwcml2LT5SZWNvcmRfQ0NLXzQwTWluZGV4KTsKIAogCWlmIChwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmCkBAIC0xNDAxLDEzICsxMzk4LDEyIEBACiAJCVR4UG93ZXJDaGVja0NudCA9IDU7CiAJZWxzZQogCQlUeFBvd2VyQ2hlY2tDbnQgPSAyOwotCWlmICghcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcpIHsKKwlpZiAoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQogCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJaWYgKHByaXYtPnR4cG93ZXJfY291bnQgIDw9IFR4UG93ZXJDaGVja0NudCkgewotCQkJcHJpdi0+dHhwb3dlcl9jb3VudCsrOwotCQkJcmV0dXJuOwotCQl9CisKKwlpZiAocHJpdi0+dHhwb3dlcl9jb3VudCAgPD0gVHhQb3dlckNoZWNrQ250KSB7CisJCXByaXYtPnR4cG93ZXJfY291bnQrKzsKKwkJcmV0dXJuOwogCX0KIAogCWlmICghVE1fVHJpZ2dlcikgewpAQCAtMTQxOSwxNCArMTQxNSwxMiBAQAogCQl9CiAJCVRNX1RyaWdnZXIgPSAxOwogCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkgICAgcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PlNjaGVkdWxlIFR4UG93ZXJUcmFja2luZ1dvcmtJdGVtXG4iKTsKLQotCQlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKHByaXYtPnByaXZfd3EsICZwcml2LT50eHBvd2VyX3RyYWNraW5nX3dxLCAwKTsKLQkJVE1fVHJpZ2dlciA9IDA7Ci0JCX0KLQogCX0KKwluZXRkZXZfaW5mbyhkZXYsICI9PT09PT09PT09PT09PT0+U2NoZWR1bGUgVHhQb3dlclRyYWNraW5nV29ya0l0ZW1cbiIpOworCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsIDApOworCVRNX1RyaWdnZXIgPSAwOworCit9CiAKIHN0YXRpYyB2b2lkIGRtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTE0NDYsNyArMTQ0MCw3IEBACiAJVGVtcFZhbCA9IDA7CiAJaWYgKCFiSW5DSDE0KSB7CiAJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdICsKLQkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV08PDgpKSA7CisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdPDw4KSk7CiAKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CiAJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdICsKQEAgLTE0NTUsMTIgKzE0NDksMTIgQEAKIAkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV08PDI0KSk7CiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQsIFRlbXBWYWwpOwogCQlUZW1wVmFsID0gKHUzMikocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs2XSArCi0JCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzddPDw4KSkgOworCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs3XTw8OCkpOwogCiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIGJNYXNrTFdvcmQsIFRlbXBWYWwpOwogCX0gZWxzZSB7CiAJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gKwotCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdPDw4KSkgOworCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdPDw4KSk7CiAKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CiAJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gKwpAQCAtMTQ2OSw3ICsxNDYzLDcgQEAKIAkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs1XTw8MjQpKTsKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMiwgYk1hc2tEV29yZCwgVGVtcFZhbCk7CiAJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gKwotCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzddPDw4KSkgOworCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzddPDw4KSk7CiAKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CiAJfQpAQCAtMTQ4NSw3ICsxNDc5LDcgQEAKIAlUZW1wVmFsID0gMDsKIAlpZiAoIWJJbkNIMTQpIHsKIAkJVGVtcFZhbCA9CUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVswXSArCi0JCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bMV08PDgpIDsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVsxXTw8OCk7CiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrSFdvcmQsIFRlbXBWYWwpOwogCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCiAJCQlyQ0NLMF9UeEZpbHRlcjEsIFRlbXBWYWwpOwpAQCAtMTQ5NywxNCArMTQ5MSwxNCBAQAogCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCiAJCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOwogCQlUZW1wVmFsID0JQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzZdICsKLQkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVs3XTw8OCkgOworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzddPDw4KTsKIAogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfRGVidWdQb3J0LCBiTWFza0xXb3JkLCBUZW1wVmFsKTsKIAkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkNDSyBub3QgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAogCQkJckNDSzBfRGVidWdQb3J0LCBUZW1wVmFsKTsKIAl9IGVsc2UgewogCQlUZW1wVmFsID0JQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bMF0gKwotCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bMV08PDgpIDsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzFdPDw4KTsKIAogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIxLCBiTWFza0hXb3JkLCBUZW1wVmFsKTsKIAkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkNDSyBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCkBAIC0xNTE3LDcgKzE1MTEsNyBAQAogCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKIAkJCXJDQ0swX1R4RmlsdGVyMiwgVGVtcFZhbCk7CiAJCVRlbXBWYWwgPQlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs2XSArCi0JCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs3XTw8OCkgOworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bN108PDgpOwogCiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIGJNYXNrTFdvcmQsIFRlbXBWYWwpOwogCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKQEAgLTE1NjksNyArMTU2Myw3IEBACiAJdTMyCXJlZ19yYXRyID0gcHJpdi0+cmF0ZV9hZGFwdGl2ZS5sYXN0X3JhdHI7CiAJdTMyIHJhdHJfdmFsdWU7CiAKLQlpZiAoSVNfTklDX0RPV04ocHJpdikpIHsKKwlpZiAoIXByaXYtPnVwKSB7CiAJCVJUX1RSQUNFKENPTVBfUkFURSwgIjwtLS0tIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoKTogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xODMwLDEyICsxODI0LDExIEBACiAJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSAmJgogCQkocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpKQogCQlyZXR1cm47Ci0JaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpIHsKKwlpZiAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpIHsKIAkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9PSBETV9TVEFfRElHX09GRiAmJgogCQkJKHByaXYtPnJlc2V0X2NvdW50ID09IHJlc2V0X2NudCkpCiAJCQlyZXR1cm47Ci0JCWVsc2UKLQkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKIAogCQlkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9IERNX1NUQV9ESUdfTUFYOwogCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPSBETV9TVEFfRElHX09GRjsKQEAgLTE4NTcsMTkgKzE4NTAsMTggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSkgeworCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpIHsKIAkJdTggcmVzZXRfZmxhZyA9IDA7CiAKIAkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9PSBETV9TVEFfRElHX09OICYmCiAJCSAgICAocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250KSkgewogCQkJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihkZXYpOwogCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJaWYgKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKLQkJCQlyZXNldF9mbGFnID0gMTsKLQotCQkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CiAJCX0KKwkJaWYgKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkKKwkJCXJlc2V0X2ZsYWcgPSAxOworCisJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OwogCiAJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT047CiAKQEAgLTE5MTEsOCArMTkwMyw3IEBACiAJCWlmIChkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9PSBETV9TVEFfRElHX09OICYmCiAJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250X2hpZ2hwd3IpKQogCQkJcmV0dXJuOwotCQllbHNlCi0JCQlkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9IERNX1NUQV9ESUdfT047CisJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19PTjsKIAogCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQogCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDEwKTsKQEAgLTE5MjIsOCArMTkxMyw3IEBACiAJCWlmIChkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9PSBETV9TVEFfRElHX09GRiAmJgogCQkJKHByaXYtPnJlc2V0X2NvdW50ID09IHJlc2V0X2NudF9oaWdocHdyKSkKIAkJCXJldHVybjsKLQkJZWxzZQotCQkJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPSBETV9TVEFfRElHX09GRjsKKwkJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPSBETV9TVEFfRElHX09GRjsKIAogCQlpZiAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9sb3d0aHJlc2ggJiYKIAkJCSBwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpIHsKQEAgLTIwMDgsNyArMTk5OCw3IEBACiAJCWlmIChkbV9kaWd0YWJsZS5DdXJTVEFDb25uZWN0U3RhdGUgPT0gRElHX1NUQV9DT05ORUNUKSB7CiAJCQlpZiAoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2gpCiAJCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9ISUdIX1BPV0VSOwotCQkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpCisJCQllbHNlIGlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpCiAJCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9MT1dfUE9XRVI7CiAJCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgJiYKIAkJCQkJKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCkpCkBAIC0yMDY1LDkgKzIwNTUsOSBAQAogCiAJaWYgKGRtX2RpZ3RhYmxlLlByZVNUQUNvbm5lY3RTdGF0ZSA9PSBkbV9kaWd0YWJsZS5DdXJTVEFDb25uZWN0U3RhdGUpIHsKIAkJaWYgKGRtX2RpZ3RhYmxlLkN1clNUQUNvbm5lY3RTdGF0ZSA9PSBESUdfU1RBX0NPTk5FQ1QpIHsKLQkJCWlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkKKwkJCWlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpCiAJCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBESUdfQ1NfUkFUSU9fTE9XRVI7Ci0JCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkpCisJCQllbHNlIGlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKQogCQkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0hJR0hFUjsKIAkJCWVsc2UKIAkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IGRtX2RpZ3RhYmxlLnByZWNzX3JhdGlvX3N0YXRlOwpAQCAtMjEzMSwxMCArMjEyMSwxMCBAQAogCQlzdGF0aWMgaW50IHdiX3RtcDsKIAogCQlpZiAod2JfdG1wID09IDApIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzKCk6aW90IHBlZXIgaXMgJXMsIGJzc2lkOiIKLQkJCSAgICAgICAiICVwTVxuIiwgX19mdW5jX18sCi0JCQkgICAgICAgcGVlcm5hbWVbcEhUSW5mby0+SU9UUGVlcl0sCi0JCQkgICAgICAgcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOworCQkJbmV0ZGV2X2luZm8oZGV2LAorCQkJCSAgICAiJXMoKTppb3QgcGVlciBpcyAlcywgYnNzaWQ6ICVwTVxuIiwKKwkJCQkgICAgX19mdW5jX18sIHBlZXJuYW1lW3BIVEluZm8tPklPVFBlZXJdLAorCQkJCSAgICBwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5ic3NpZCk7CiAJCQl3Yl90bXAgPSAxOwogCQl9CiAJfQpAQCAtMjYzOCw5ICsyNjI4LDEwIEBACiAJCX0KIAkJcHJpdi0+cmF0ZV9yZWNvcmQgPSByYXRlX2NvdW50OwogCQlwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkID0gcmF0ZV9jb3VudF9kaWZmOwotCQlSVF9UUkFDRShDT01QX0hBTERNLCAicmF0ZVJlY29yZCAlZCByYXRlQ291bnQgJWQsIHJhdGUiCi0JCQkgIkNvdW50ZGlmZiAlZCBiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLAotCQkJIHJhdGVfY291bnQsIHJhdGVfY291bnRfZGlmZiwgcHJpdi0+YnN3aXRjaF9mc3luYyk7CisJCVJUX1RSQUNFKENPTVBfSEFMRE0sCisJCQkgInJhdGVSZWNvcmQgJWQgcmF0ZUNvdW50ICVkLCByYXRlQ291bnRkaWZmICVkIGJTd2l0Y2hGc3luYyAlZFxuIiwKKwkJCSBwcml2LT5yYXRlX3JlY29yZCwgcmF0ZV9jb3VudCwgcmF0ZV9jb3VudF9kaWZmLAorCQkJIHByaXYtPmJzd2l0Y2hfZnN5bmMpOwogCQlpZiAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+CiAJCSAgICBwcml2LT5ydGxsaWItPmZzeW5jX3Jzc2lfdGhyZXNob2xkICYmCiAJCSAgICBiU3dpdGNoRnJvbUNvdW50RGlmZikgewpAQCAtMjY2NSwxNCArMjY1NiwxNCBAQAogCQkJaWYgKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKIAkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOwogCQkJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKwotCQkJCSBNU0VDUyhwcml2LT5ydGxsaWItPmZzeW5jX3RpbWVfaW50ZXJ2YWwgKgorCQkJCSBtc2Vjc190b19qaWZmaWVzKHByaXYtPnJ0bGxpYi0+ZnN5bmNfdGltZV9pbnRlcnZhbCAqCiAJCQkJIHByaXYtPnJ0bGxpYi0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsKTsKIAkJCWFkZF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOwogCQl9IGVsc2UgewogCQkJaWYgKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKIAkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOwogCQkJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKwotCQkJCSBNU0VDUyhwcml2LT5ydGxsaWItPmZzeW5jX3RpbWVfaW50ZXJ2YWwpOworCQkJCSBtc2Vjc190b19qaWZmaWVzKHByaXYtPnJ0bGxpYi0+ZnN5bmNfdGltZV9pbnRlcnZhbCk7CiAJCQlhZGRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKIAkJfQogCX0gZWxzZSB7CkBAIC0yNjg1LDkgKzI2NzYsMTAgQEAKIAkJd3JpdGVfbmljX2R3b3JkKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWM1MmNkKTsKIAl9CiAJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIkNvbnRpbnVlRGlmZkNvdW50ICVkXG4iLCBwcml2LT5Db250aW51ZURpZmZDb3VudCk7Ci0JUlRfVFJBQ0UoQ09NUF9IQUxETSwgInJhdGVSZWNvcmQgJWQgcmF0ZUNvdW50ICVkLCByYXRlQ291bnRkaWZmICVkICIKLQkJICJiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LAotCQkgcmF0ZV9jb3VudF9kaWZmLCBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKKwlSVF9UUkFDRShDT01QX0hBTERNLAorCQkgInJhdGVSZWNvcmQgJWQgcmF0ZUNvdW50ICVkLCByYXRlQ291bnRkaWZmICVkIGJTd2l0Y2hGc3luYyAlZFxuIiwKKwkJIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LCByYXRlX2NvdW50X2RpZmYsCisJCSBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKIH0KIAogc3RhdGljIHZvaWQgZG1fU3RhcnRIV0ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yNzYyLDcgKzI3NTQsNyBAQAogCWlmICh0aW1lcl9wZW5kaW5nKCZwcml2LT5mc3luY190aW1lcikpCiAJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7CiAJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKwotCQkJCSAgICBNU0VDUyhwcml2LT5ydGxsaWItPmZzeW5jX3RpbWVfaW50ZXJ2YWwpOworCQkJCSAgICBtc2Vjc190b19qaWZmaWVzKHByaXYtPnJ0bGxpYi0+ZnN5bmNfdGltZV9pbnRlcnZhbCk7CiAJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CiAKIAl3cml0ZV9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4NDY1YzEyY2QpOwpAQCAtMjc3OCwxMiArMjc3MCwxNCBAQAogCXN0YXRpYyB1OCByZWdfYzM4X1N0YXRlID0gUmVnQzM4X0RlZmF1bHQ7CiAJc3RhdGljIHUzMiByZXNldF9jbnQ7CiAKLQlSVF9UUkFDRShDT01QX0hBTERNLCAiUlNTSSAlZCBUaW1lSW50ZXJ2YWwgJWQgTXVsdGlwbGVUaW1lSW50ZXJ2YWwgIgotCQkgIiVkXG4iLCBwcml2LT5ydGxsaWItPmZzeW5jX3Jzc2lfdGhyZXNob2xkLAorCVJUX1RSQUNFKENPTVBfSEFMRE0sCisJCSAiUlNTSSAlZCBUaW1lSW50ZXJ2YWwgJWQgTXVsdGlwbGVUaW1lSW50ZXJ2YWwgJWRcbiIsCisJCSBwcml2LT5ydGxsaWItPmZzeW5jX3Jzc2lfdGhyZXNob2xkLAogCQkgcHJpdi0+cnRsbGliLT5mc3luY190aW1lX2ludGVydmFsLAogCQkgcHJpdi0+cnRsbGliLT5mc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWwpOwotCVJUX1RSQUNFKENPTVBfSEFMRE0sICJSYXRlQml0bWFwIDB4JXggRmlyc3REaWZmUmF0ZVRocmVzaG9sZCAlZCBTZWNvbmQiCi0JCSAiRGlmZlJhdGVUaHJlc2hvbGQgJWRcbiIsIHByaXYtPnJ0bGxpYi0+ZnN5bmNfcmF0ZV9iaXRtYXAsCisJUlRfVFJBQ0UoQ09NUF9IQUxETSwKKwkJICJSYXRlQml0bWFwIDB4JXggRmlyc3REaWZmUmF0ZVRocmVzaG9sZCAlZCBTZWNvbmREaWZmUmF0ZVRocmVzaG9sZCAlZFxuIiwKKwkJIHByaXYtPnJ0bGxpYi0+ZnN5bmNfcmF0ZV9iaXRtYXAsCiAJCSBwcml2LT5ydGxsaWItPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkLAogCQkgcHJpdi0+cnRsbGliLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2RtLmgKaW5kZXggYWI0NGE5YS4uM2YwMmUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9kbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfZG0uaApAQCAtMjU1LDE0ICsyNTUsNiBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIERNX0FQSW5pdEdhaW5DaGFuZ2VOb3RpZnkoRXZlbnQpCQlcCi0JewkJCQkJCVwKLQkJZG1fZGlndGFibGUuQ3VyQVBDb25uZWN0U3RhdGUgPSBFdmVudDsJXAotCX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hcmNvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBleHRlcm4gIHZvaWQgICAgaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wY2kuYwppbmRleCAyYWQ5MmVlLi41MWY1M2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcGNpLmMKQEAgLTY1LDI3ICs2NSwzMiBAQAogCWlmIChEZXZpY2VJRCA9PSAweDgxNzIpIHsKIAkJc3dpdGNoIChSZXZpc2lvbklEKSB7CiAJCWNhc2UgSEFMX0hXX1BDSV9SRVZJU0lPTl9JRF84MTkyUENJRToKLQkJCXByaW50ayhLRVJOX0lORk8gIkFkYXB0ZXIoODE5MiBQQ0ktRSkgaXMgZm91bmQgLSAiCi0JCQkgICAgICAgIkRldmljZUlEPSV4XG4iLCBEZXZpY2VJRCk7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiQWRhcHRlcig4MTkyIFBDSS1FKSBpcyBmb3VuZCAtIERldmljZUlEPSV4XG4iLAorCQkJCSBEZXZpY2VJRCk7CiAJCQlwcml2LT5jYXJkXzgxOTIgPSBOSUNfODE5MkU7CiAJCQlicmVhazsKIAkJY2FzZSBIQUxfSFdfUENJX1JFVklTSU9OX0lEXzgxOTJTRToKLQkJCXByaW50ayhLRVJOX0lORk8gIkFkYXB0ZXIoODE5MlNFKSBpcyBmb3VuZCAtICIKLQkJCSAgICAgICAiRGV2aWNlSUQ9JXhcbiIsIERldmljZUlEKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJBZGFwdGVyKDgxOTJTRSkgaXMgZm91bmQgLSBEZXZpY2VJRD0leFxuIiwKKwkJCQkgRGV2aWNlSUQpOwogCQkJcHJpdi0+Y2FyZF84MTkyID0gTklDXzgxOTJTRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVU5LTk9XTiBuaWMgdHlwZSglNHg6JTR4KVxuIiwKLQkJCSAgICAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSk7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiVU5LTk9XTiBuaWMgdHlwZSglNHg6JTR4KVxuIiwKKwkJCQkgcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpOwogCQkJcHJpdi0+Y2FyZF84MTkyID0gTklDX1VOS05PV047CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAl9CiAKIAlpZiAocHJpdi0+b3BzLT5uaWNfdHlwZSAhPSBwcml2LT5jYXJkXzgxOTIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRGV0ZWN0IGluZm8oJXgpIGFuZCBoYXJkd2FyZSBpbmZvKCV4KSBub3QgbWF0Y2ghXG4iLAotCQkJCXByaXYtPm9wcy0+bmljX3R5cGUsIHByaXYtPmNhcmRfODE5Mik7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBzZWxlY3QgcHJvcGVyIGRyaXZlciBiZWZvcmUgaW5zdGFsbCEhISFcbiIpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJICJEZXRlY3QgaW5mbygleCkgYW5kIGhhcmR3YXJlIGluZm8oJXgpIG5vdCBtYXRjaCFcbiIsCisJCQkgcHJpdi0+b3BzLT5uaWNfdHlwZSwgcHJpdi0+Y2FyZF84MTkyKTsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCSAiUGxlYXNlIHNlbGVjdCBwcm9wZXIgZHJpdmVyIGJlZm9yZSBpbnN0YWxsISEhIVxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcG0uYwppbmRleCAwYjRmNzY0Li5jYTZlY2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wbS5jCkBAIC0yOSwxNCArMjksMTQgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJdTMyCXVsUmVnUmVhZDsKIAotCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT4gcjgxOTJFIHN1c3BlbmQgY2FsbC5cbiIpOworCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PT09PT4gcjgxOTJFIHN1c3BlbmQgY2FsbC5cbiIpOwogCWRlbF90aW1lcl9zeW5jKCZwcml2LT5ncGlvX3BvbGxpbmdfdGltZXIpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmdwaW9fY2hhbmdlX3JmX3dxKTsKIAlwcml2LT5wb2xsaW5nX3RpbWVyX29uID0gMDsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlJUTDgxOVhFOlVJIGlzIG9wZW4gb3V0IG9mIHN1c3BlbmQgIgotCQkgICAgICAgImZ1bmN0aW9uXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LAorCQkJICAgICJSVEw4MTlYRTpVSSBpcyBvcGVuIG91dCBvZiBzdXNwZW5kIGZ1bmN0aW9uXG4iKTsKIAkJZ290byBvdXRfcGNpX3N1c3BlbmQ7CiAJfQogCkBAIC01NywxMCArNTcsMTAgQEAKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCBNYWNCbGtDdHJsLCAweGEpOwogCX0KIG91dF9wY2lfc3VzcGVuZDoKLQlwcmludGsoInI4MTkyRSBzdXBwb3J0IFdPTCBjYWxsPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P1xuIik7CisJbmV0ZGV2X2luZm8oZGV2LCAicjgxOTJFIHN1cHBvcnQgV09MIGNhbGw/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/XG4iKTsKIAlpZiAocHJpdi0+cnRsbGliLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgInI4MTkyRSBzdXBwb3J0IFdPTCBjYWxsISEhISEhISIKLQkJCSAiISEhISEhISEhISEuXG4iKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwKKwkJCSAicjgxOTJFIHN1cHBvcnQgV09MIGNhbGwhISEhISEhISEhISEhISEhISEuXG4iKTsKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLApAQCAtNzksMTQgKzc5LDEzIEBACiAJaW50IGVycjsKIAl1MzIgdmFsOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT5yODE5MkUgcmVzdW1lIGNhbGwuXG4iKTsKKwluZXRkZXZfaW5mbyhkZXYsICI9PT09PT09PT09PT09PT09PnI4MTkyRSByZXN1bWUgY2FsbC5cbiIpOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQgb24gcmVzdW1lXG4iLAotCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X2VycihkZXYsICJwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQgb24gcmVzdW1lXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CkBAIC0xMDEsOCArMTAwLDggQEAKIAkJY2hlY2tfcmZjdHJsX2dwaW9fdGltZXIoKHVuc2lnbmVkIGxvbmcpZGV2KTsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlJUTDgxOVhFOlVJIGlzIG9wZW4gb3V0IG9mIHJlc3VtZSAiCi0JCSAgICAgICAiZnVuY3Rpb25cbiIpOworCQluZXRkZXZfaW5mbyhkZXYsCisJCQkgICAgIlJUTDgxOVhFOlVJIGlzIG9wZW4gb3V0IG9mIHJlc3VtZSBmdW5jdGlvblxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wcy5jCmluZGV4IDQ4NTZiNzYuLjBiYmZmZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BzLmMKQEAgLTM3LDggKzM3LDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOwogCWlmIChwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOwotCQlSVF9UUkFDRShDT01QX0RCRywgInJ0bDgxOTJfaHdfc2xlZXBfZG93bigpOiBSRiBDaGFuZ2UgaW4gIgotCQkJICJwcm9ncmVzcyFcbiIpOworCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCSAicnRsODE5Ml9od19zbGVlcF9kb3duKCk6IFJGIENoYW5nZSBpbiBwcm9ncmVzcyFcbiIpOwogCQlyZXR1cm47CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKQEAgLTY0LDEwICs2NCwxMSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7Ci0JCVJUX1RSQUNFKENPTVBfREJHLCAicnRsODE5Ml9od193YWtldXAoKTogUkYgQ2hhbmdlIGluICIKLQkJCSAicHJvZ3Jlc3MhXG4iKTsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkgInJ0bDgxOTJfaHdfd2FrZXVwKCk6IFJGIENoYW5nZSBpbiBwcm9ncmVzcyFcbiIpOwogCQlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKHByaXYtPnJ0bGxpYi0+d3EsCi0JCQkJICAgICAgICZwcml2LT5ydGxsaWItPmh3X3dha2V1cF93cSwgTVNFQ1MoMTApKTsKKwkJCQkgICAgICAgJnByaXYtPnJ0bGxpYi0+aHdfd2FrZXVwX3dxLAorCQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOwpAQCAtOTUsMTggKzk2LDE4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOwogCi0JdGltZSAtPSBNU0VDUyg4KzE2KzcpOworCXRpbWUgLT0gbXNlY3NfdG9famlmZmllcyg4ICsgMTYgKyA3KTsKIAotCWlmICgodGltZSAtIGppZmZpZXMpIDw9IE1TRUNTKE1JTl9TTEVFUF9USU1FKSkgeworCWlmICgodGltZSAtIGppZmZpZXMpIDw9IG1zZWNzX3RvX2ppZmZpZXMoTUlOX1NMRUVQX1RJTUUpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssIGZsYWdzKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidG9vIHNob3J0IHRvIHNsZWVwOjolbGxkIDwgJWxkXG4iLAotCQkgICAgICAgdGltZSAtIGppZmZpZXMsIE1TRUNTKE1JTl9TTEVFUF9USU1FKSk7CisJCW5ldGRldl9pbmZvKGRldiwgInRvbyBzaG9ydCB0byBzbGVlcDo6JWxsZCA8ICVsZFxuIiwKKwkJCSAgICB0aW1lIC0gamlmZmllcywgbXNlY3NfdG9famlmZmllcyhNSU5fU0xFRVBfVElNRSkpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKCh0aW1lIC0gamlmZmllcykgPiBNU0VDUyhNQVhfU0xFRVBfVElNRSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT0+dG9vIGxvbmcgdG8gc2xlZXA6JWxsZCA+ICVsZFxuIiwKLQkJICAgICAgIHRpbWUgLSBqaWZmaWVzLCAgTVNFQ1MoTUFYX1NMRUVQX1RJTUUpKTsKKwlpZiAoKHRpbWUgLSBqaWZmaWVzKSA+IG1zZWNzX3RvX2ppZmZpZXMoTUFYX1NMRUVQX1RJTUUpKSB7CisJCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PnRvbyBsb25nIHRvIHNsZWVwOiVsbGQgPiAlbGRcbiIsCisJCQkgICAgdGltZSAtIGppZmZpZXMsIG1zZWNzX3RvX2ppZmZpZXMoTUFYX1NMRUVQX1RJTUUpKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtMjAxLDEyICsyMDIsMTEgQEAKIAkJCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6IFJGIGlzIE9GRi5cbiIsCiAJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT0+JXMoKTogSVBTTGVhdmVcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fKTsKLQkJCQlxdWV1ZV93b3JrX3JzbChwcml2LT5ydGxsaWItPndxLAotCQkJCQkgICAgICAgJnByaXYtPnJ0bGxpYi0+aXBzX2xlYXZlX3dxKTsKIAkJCX0KKwkJCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PT4lcygpOiBJUFNMZWF2ZVxuIiwKKwkJCQkgICAgX19mdW5jX18pOworCQkJcXVldWVfd29ya19yc2wocHJpdi0+cnRsbGliLT53cSwKKwkJCQkgICAgICAgJnByaXYtPnJ0bGxpYi0+aXBzX2xlYXZlX3dxKTsKIAkJfQogCX0KIH0KQEAgLTIzOSw4ICsyMzksOCBAQAogCQlwcml2LT5ydGxsaWItPnN0YV9zbGVlcCA9IExQU19JU19XQUtFOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCYocHJpdi0+cnRsbGliLT5tZ210X3R4X2xvY2spLCBmbGFncyk7Ci0JCVJUX1RSQUNFKENPTVBfREJHLCAiTFBTIGxlYXZlOiBub3RpZnkgQVAgd2UgYXJlIGF3YWtlZCIKLQkJCSAiICsrKysrKysrKysgU2VuZE51bGxGdW5jdGlvbkRhdGFcbiIpOworCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCSAiTFBTIGxlYXZlOiBub3RpZnkgQVAgd2UgYXJlIGF3YWtlZCArKysrKysrKysrIFNlbmROdWxsRnVuY3Rpb25EYXRhXG4iKTsKIAkJcnRsbGliX3N0YV9wc19zZW5kX251bGxfZnJhbWUocHJpdi0+cnRsbGliLCAwKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHByaXYtPnJ0bGxpYi0+bWdtdF90eF9sb2NrKSwgZmxhZ3MpOwogCX0KQEAgLTI1NSw4ICsyNTUsOCBAQAogCQkJCQkmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCk7CiAKIAlSVF9UUkFDRShDT01QX1BTLCAiTGVpc3VyZVBTRW50ZXIoKS4uLlxuIik7Ci0JUlRfVFJBQ0UoQ09NUF9QUywgInBQU0MtPmJMZWlzdXJlUHMgPSAlZCwgaWVlZS0+cHMgPSAlZCxwUFNDLT5McHNJZGxlIgotCQkgIkNvdW50IGlzICVkLFJUX0NIRUNLX0ZPUl9IQU5HX1BFUklPRCBpcyAlZFxuIiwKKwlSVF9UUkFDRShDT01QX1BTLAorCQkgInBQU0MtPmJMZWlzdXJlUHMgPSAlZCwgaWVlZS0+cHMgPSAlZCxwUFNDLT5McHNJZGxlQ291bnQgaXMgJWQsUlRfQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EIGlzICVkXG4iLAogCQkgcFBTQy0+YkxlaXN1cmVQcywgcHJpdi0+cnRsbGliLT5wcywgcFBTQy0+THBzSWRsZUNvdW50LAogCQkgUlRfQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EKTsKIApAQCAtMjcxLDggKzI3MSw4IEBACiAKIAkJCWlmIChwcml2LT5ydGxsaWItPnBzID09IFJUTExJQl9QU19ESVNBQkxFRCkgewogCi0JCQkJUlRfVFJBQ0UoQ09NUF9MUFMsICJMZWlzdXJlUFNFbnRlcigpOiBFbnRlciAiCi0JCQkJCSAiODAyLjExIHBvd2VyIHNhdmUgbW9kZS4uLlxuIik7CisJCQkJUlRfVFJBQ0UoQ09NUF9MUFMsCisJCQkJCSAiTGVpc3VyZVBTRW50ZXIoKTogRW50ZXIgODAyLjExIHBvd2VyIHNhdmUgbW9kZS4uLlxuIik7CiAKIAkJCQlpZiAoIXBQU0MtPmJGd0N0cmxMUFMpIHsKIAkJCQkJaWYgKHByaXYtPnJ0bGxpYi0+U2V0RndDbWRIYW5kbGVyKQpAQCAtMzAxLDggKzMwMSw4IEBACiAKIAlpZiAocFBTQy0+YkxlaXN1cmVQcykgewogCQlpZiAocHJpdi0+cnRsbGliLT5wcyAhPSBSVExMSUJfUFNfRElTQUJMRUQpIHsKLQkJCVJUX1RSQUNFKENPTVBfTFBTLCAiTGVpc3VyZVBTTGVhdmUoKTogQnVzeSBUcmFmZmljICwgIgotCQkJCSAiTGVhdmUgODAyLjExIHBvd2VyIHNhdmUuLlxuIik7CisJCQlSVF9UUkFDRShDT01QX0xQUywKKwkJCQkgIkxlaXN1cmVQU0xlYXZlKCk6IEJ1c3kgVHJhZmZpYyAsIExlYXZlIDgwMi4xMSBwb3dlciBzYXZlLi5cbiIpOwogCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShkZXYsCiAJCQkJCSBSVExMSUJfUFNfRElTQUJMRUQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKaW5kZXggZGYwMzIzZi4uOGQ2YTEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYwpAQCAtNjcsNyArNjcsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC04Nyw3ICs4Nyw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTExNSw5ICsxMTUsMTAgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKSB7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTpIdyBpcyBSYWRpbyBPZmYsIHdlIGNhbid0IHNldCAiCi0JCQkgIlBvd2VyLHJldHVyblxuIiwgX19mdW5jX18pOworCWlmIChwcml2LT5iSHdSYWRpb09mZikgeworCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCSAiJXMoKTpIdyBpcyBSYWRpbyBPZmYsIHdlIGNhbid0IHNldCBQb3dlcixyZXR1cm5cbiIsCisJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTE0NSw3ICsxNDYsNyBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC0yNTQsMTAgKzI1NSwxMSBAQAogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHNldCByYWRpbyAhIGV4dHJhIGlzICVkXG4iLCBfX2Z1bmNfXywgKmV4dHJhKTsKKwluZXRkZXZfaW5mbyhkZXYsICIlcygpOiBzZXQgcmFkaW8gISBleHRyYSBpcyAlZFxuIiwgX19mdW5jX18sICpleHRyYSk7CiAJaWYgKCgqZXh0cmEgIT0gMCkgJiYgKCpleHRyYSAhPSAxKSkgewotCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6IHNldCByYWRpbyBhbiBlcnIgdmFsdWUsbXVzdCAwKHJhZGlvICIKLQkJCSAib2ZmKSBvciAxKHJhZGlvIG9uKVxuIiwgX19mdW5jX18pOworCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCSAiJXMoKTogc2V0IHJhZGlvIGFuIGVyciB2YWx1ZSxtdXN0IDAocmFkaW8gb2ZmKSBvciAxKHJhZGlvIG9uKVxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXVwKCZwcml2LT53eF9zZW0pOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMjc3LDggKzI3OSw4IEBACiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogc2V0IGxwcyBhd2FrZSBpbnRlcnZhbCAhIGV4dHJhIGlzICVkXG4iLAotCSAgICAgICBfX2Z1bmNfXywgKmV4dHJhKTsKKwluZXRkZXZfaW5mbyhkZXYsICIlcygpOiBzZXQgbHBzIGF3YWtlIGludGVydmFsICEgZXh0cmEgaXMgJWRcbiIsCisJCSAgICBfX2Z1bmNfXywgKmV4dHJhKTsKIAogCXBQU0MtPlJlZ01heExQU0F3YWtlSW50dmwgPSAqZXh0cmE7CiAJdXAoJnByaXYtPnd4X3NlbSk7CkBAIC0yOTMsOCArMjk1LDkgQEAKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiBmb3JjZSBMUFMgISBleHRyYSBpcyAlZCAoMSBpcyBvcGVuIDAgaXMgIgotCSAgICAgICAiY2xvc2UpXG4iLCBfX2Z1bmNfXywgKmV4dHJhKTsKKwluZXRkZXZfaW5mbyhkZXYsCisJCSAgICAiJXMoKTogZm9yY2UgTFBTICEgZXh0cmEgaXMgJWQgKDEgaXMgb3BlbiAwIGlzIGNsb3NlKVxuIiwKKwkJICAgIF9fZnVuY19fLCAqZXh0cmEpOwogCXByaXYtPmZvcmNlX2xwcyA9ICpleHRyYTsKIAl1cCgmcHJpdi0+d3hfc2VtKTsKIAlyZXR1cm4gMDsKQEAgLTMwOCwxMSArMzExLDExIEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCXU4IGMgPSAqZXh0cmE7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiPT09PT0+JXMoKSwgKmV4dHJhOiV4LCBkZWJ1Z2ZsYWc6JXhcbiIsIF9fZnVuY19fLAotCSAgICAgICAqZXh0cmEsIHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQpOworCW5ldGRldl9pbmZvKGRldiwgIj09PT09PiVzKCksICpleHRyYToleCwgZGVidWdmbGFnOiV4XG4iLCBfX2Z1bmNfXywKKwkJICAgICpleHRyYSwgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCk7CiAJaWYgKGMgPiAwKQogCQlydF9nbG9iYWxfZGVidWdfY29tcG9uZW50IHw9ICgxPDxjKTsKIAllbHNlCkBAIC0zMjksNyArMzMyLDcgQEAKIAllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CiAJaW50IHJldDsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMzQzLDEzICszNDYsMTIgQEAKIAkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJCXVwKCZwcml2LT53eF9zZW0pOwogCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PiVzKCk6ICIKLQkJCQkJICAgICAgICJJUFNMZWF2ZVxuIiwgX19mdW5jX18pOwotCQkJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOwotCQkJCQlJUFNMZWF2ZShkZXYpOwotCQkJCQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKIAkJCQl9CisJCQkJbmV0ZGV2X2luZm8oZGV2LCAgIj09PT09PT09PT4lcygpOiBJUFNMZWF2ZVxuIiwKKwkJCQkJICAgIF9fZnVuY19fKTsKKwkJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCUlQU0xlYXZlKGRldik7CisJCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CiAJCQl9CiAJCX0KIAl9CkBAIC00NzAsOSArNDcyLDkgQEAKIAkJCXJldHVybiAwOwogCX0KIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT0+JXMoKTogaHdyYWRpbyBvZmZcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7CisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKSB7CisJCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PT09PT09PT0+JXMoKTogaHdyYWRpbyBvZmZcbiIsCisJCQkgICAgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKQEAgLTUwMCwxNyArNTAyLDE3IEBACiAJCQlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpIHsKIAkJCQlpZiAocHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiA+CiAJCQkJICAgIFJGX0NIQU5HRV9CWV9JUFMpIHsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBSRiBpcyAiCi0JCQkJCQkgIk9GRi5cbiIsIF9fZnVuY19fKTsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJCQkgIiVzKCk6IFJGIGlzIE9GRi5cbiIsCisJCQkJCQkgX19mdW5jX18pOwogCQkJCQl1cCgmcHJpdi0+d3hfc2VtKTsKIAkJCQkJcmV0dXJuIC0xOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUX1RSQUNFKENPTVBfUFMsICI9PT09PT09PT0+JXMoKTogIgotCQkJCQkJICJJUFNMZWF2ZVxuIiwgX19mdW5jX18pOwotCQkJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOwotCQkJCQlJUFNMZWF2ZShkZXYpOwotCQkJCQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKIAkJCQl9CisJCQkJUlRfVFJBQ0UoQ09NUF9QUywgIj09PT09PT09PT4lcygpOiBJUFNMZWF2ZVxuIiwKKwkJCQkJIF9fZnVuY19fKTsKKwkJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCUlQU0xlYXZlKGRldik7CisJCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CiAJCQl9CiAJCX0KIAkJcnRsbGliX3N0b3Bfc2Nhbihwcml2LT5ydGxsaWIpOwpAQCAtNTUyLDcgKzU1NCw3IEBACiAJaWYgKCFwcml2LT51cCkKIAkJcmV0dXJuIC1FTkVURE9XTjsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIApAQCAtNTcyLDEzICs1NzQsMTAgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJaW50IHJldDsKIAotCWlmICgocnRsbGliX2FjdF9zY2FubmluZyhwcml2LT5ydGxsaWIsIGZhbHNlKSkgJiYKLQkgICAgIShwcml2LT5ydGxsaWItPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpIHsKLQkJOwkvKiBUT0RPIC0gZ2V0IHJpZCBvZiBpZiAqLwotCX0KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkgewotCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT0+JXMoKTpodyByYWRpbyBvZmYsb3IgUmYgc3RhdGUgaXMgIgotCQkgICAgICAgImVSZk9mZiwgcmV0dXJuXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKSB7CisJCW5ldGRldl9pbmZvKGRldiwKKwkJCSAgICAiPT09PT09PT09PiVzKCk6aHcgcmFkaW8gb2ZmLG9yIFJmIHN0YXRlIGlzIGVSZk9mZiwgcmV0dXJuXG4iLAorCQkJICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC02NDIsNyArNjQxLDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtNjY5LDcgKzY2OCw3IEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWlmICh3cnF1LT5mcmFnLmRpc2FibGVkKQpAQCAtNzA4LDEyICs3MDcsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JaWYgKChydGxsaWJfYWN0X3NjYW5uaW5nKHByaXYtPnJ0bGxpYiwgZmFsc2UpKSAmJgotCSAgICAhKHByaXYtPnJ0bGxpYi0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKSkgewotCQk7CS8qIFRPRE8gLSBnZXQgcmlkIG9mIGlmICovCi0JfQotCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC03NjMsMTAgKzc1Nyw3IEBACiAJCQkgICAgIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzfSB9OwogCWludCBpOwogCi0JaWYgKChydGxsaWJfYWN0X3NjYW5uaW5nKHByaXYtPnJ0bGxpYiwgZmFsc2UpKSAmJgotCSAgICEocHJpdi0+cnRsbGliLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pKQotCQk7CS8qIFRPRE8gLSBnZXQgcmlkIG9mIGlmICovCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWlmICghcHJpdi0+dXApCkBAIC04MzgsNyArODI5LDggQEAKIAkJCXNldF9zd2NhbShkZXYsIGtleV9pZHgsIGtleV9pZHgsIEtFWV9UWVBFX1dFUDEwNCwKIAkJCQkgIHplcm9fYWRkcltrZXlfaWR4XSwgMCwgaHdrZXksIDApOwogCQl9IGVsc2UgewotCQkJIHByaW50ayhLRVJOX0lORk8gIndyb25nIHR5cGUgaW4gV0VQLCBub3QgV0VQNDAgYW5kIFdFUDEwNFxuIik7CisJCQluZXRkZXZfaW5mbyhkZXYsCisJCQkJICAgICJ3cm9uZyB0eXBlIGluIFdFUCwgbm90IFdFUDQwIGFuZCBXRVAxMDRcbiIpOwogCQl9CiAJfQogCkBAIC04NTUsNyArODQ3LDcgQEAKIAlpbnQgKnBhcm1zID0gKGludCAqKXA7CiAJaW50IG1vZGUgPSBwYXJtc1swXTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlwcml2LT5ydGxsaWItPmFjdGl2ZV9zY2FuID0gbW9kZTsKQEAgLTg3Myw3ICs4NjUsNyBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtOTU2LDcgKzk0OCw3IEBACiAKIAlzaG9ydCBlcnIgPSAwOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC05ODMsNyArOTc1LDcgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTEwNjQsNyArMTA1Niw3IEBACiAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTEwODIsNyArMTA3NCw3IEBACiAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTEwOTksNyArMTA5MSw3IEBACiAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTExNjAsOCArMTE1MiwxMCBAQAogCQkJKHJ0bGxpYl9FbmFibGVJbnRlbFByb21pc2N1b3VzTW9kZShkZXYsIGZhbHNlKSkgOgogCQkJKHJ0bGxpYl9EaXNhYmxlSW50ZWxQcm9taXNjdW91c01vZGUoZGV2LCBmYWxzZSkpOwogCi0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT0+JXMoKSwgb24gPSAlZCwgZmlsdGVyIHNyYyBzdGEgPSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBiUHJvbWlzY3VvdXNPbiwgYkZpbHRlclNvdXJjZVN0YXRpb25GcmFtZSk7CisJCW5ldGRldl9pbmZvKGRldiwKKwkJCSAgICAiPT09PT09PT4lcygpLCBvbiA9ICVkLCBmaWx0ZXIgc3JjIHN0YSA9ICVkXG4iLAorCQkJICAgIF9fZnVuY19fLCBiUHJvbWlzY3VvdXNPbiwKKwkJCSAgICBiRmlsdGVyU291cmNlU3RhdGlvbkZyYW1lKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTIyNywxMSArMTIyMSwxMCBAQAogCUlXX0lPQ1RMKFNJT0NTSVdFTkNPREVFWFQpID0gcjgxOTJfd3hfc2V0X2VuY19leHQsCiB9OwogCi0vKgotICogdGhlIGZvbGxvd2luZyBydWxlIG5lZWQgdG8gYmUgZm9sbG93aW5nLAorLyogdGhlIGZvbGxvd2luZyBydWxlIG5lZWQgdG8gYmUgZm9sbG93aW5nLAogICogT2RkIDogZ2V0ICh3b3JsZCBhY2Nlc3MpLAogICogZXZlbiA6IHNldCAocm9vdCBhY2Nlc3MpCi0gKiAqLworICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyByODE5Ml9wcml2YXRlX2FyZ3NbXSA9IHsKIAl7CiAJCVNJT0NJV0ZJUlNUUFJJViArIDB4MCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X0JBUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfQkFQcm9jLmMKaW5kZXggMDQxNWUwMi4uMjYyNThlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfQkFQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfQkFQcm9jLmMKQEAgLTI2LDcgKzI2LDcgQEAKIHsKIAlwQkEtPmJWYWxpZCA9IHRydWU7CiAJaWYgKFRpbWUgIT0gMCkKLQkJbW9kX3RpbWVyKCZwQkEtPlRpbWVyLCBqaWZmaWVzICsgTVNFQ1MoVGltZSkpOworCQltb2RfdGltZXIoJnBCQS0+VGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRpbWUpKTsKIH0KIAogc3RhdGljIHZvaWQgRGVBY3RpdmF0ZUJBRW50cnkoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBiYV9yZWNvcmQgKnBCQSkKQEAgLTgzLDkgKzgzLDkgQEAKIAl1OCAqdGFnID0gTlVMTDsKIAl1MTYgbGVuID0gaWVlZS0+dHhfaGVhZHJvb20gKyA5OwogCi0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUkFDRSB8IFJUTExJQl9ETF9CQSwgIj09PT09PT09PiVzKCksIGZyYW1lKCVkKSIKLQkJICAgICAiIHNlbnRkIHRvOiAlcE0sIGllZWUtPmRldjolcFxuIiwgX19mdW5jX18sCi0JCSAgICAgdHlwZSwgRHN0LCBpZWVlLT5kZXYpOworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFJBQ0UgfCBSVExMSUJfRExfQkEsCisJCSAgICAgIj09PT09PT09PiVzKCksIGZyYW1lKCVkKSBzZW50ZCB0bzogJXBNLCBpZWVlLT5kZXY6JXBcbiIsCisJCSAgICAgX19mdW5jX18sIHR5cGUsIERzdCwgaWVlZS0+ZGV2KTsKIAlpZiAocEJBID09IE5VTEwpIHsKIAkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJwQkEgaXMgTlVMTFxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMTQ4LDkgKzE0OCw4IEBACiAKIAlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1RSQUNFIHwgUlRMTElCX0RMX0JBLAotCQkJICAgICAiPT09PT09PT0+JXMoKSwgUmVhc29uIgotCQkJICAgICAiQ29kZSglZCkgc2VudGQgdG86ICVwTVxuIiwgX19mdW5jX18sCi0JCQkgICAgIFJlYXNvbkNvZGUsIGRzdCk7CisJCQkgICAgICI9PT09PT09PT4lcygpLCBSZWFzb25Db2RlKCVkKSBzZW50ZCB0bzogJXBNXG4iLAorCQkJICAgICBfX2Z1bmNfXywgUmVhc29uQ29kZSwgZHN0KTsKIAogCW1lbXNldCgmRGVsYmFQYXJhbVNldCwgMCwgMik7CiAKQEAgLTIwMyw4ICsyMDIsOCBAQAogCQlSVF9UUkFDRShDT01QX0RCRywgIj09PT0+dG8gc2VuZCBBRERCQVJFUSEhISEhXG4iKTsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAl9IGVsc2UgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiIKLQkJCSAgICAgIiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fZnVuY19fKTsKIAl9CiB9CiAKQEAgLTIxNyw4ICsyMTYsOCBAQAogCWlmIChza2IpCiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJZWxzZQotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiIKLQkJCSAgICAgIiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fZnVuY19fKTsKIH0KIAogc3RhdGljIHZvaWQgcnRsbGliX3NlbmRfREVMQkEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICpkc3QsCkBAIC0yMzEsOCArMjMwLDggQEAKIAlpZiAoc2tiKQogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCWVsc2UKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuY3Rpb24iCi0JCQkgICAgICIgJXMoKVxuIiwgX19mdW5jX18pOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiAlcygpXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIGludCBydGxsaWJfcnhfQUREQkFSZXEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0yNDcsOCArMjQ2LDkgQEAKIAlzdHJ1Y3QgcnhfdHNfcmVjb3JkICpwVFMgPSBOVUxMOwogCiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSArIDkpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUkVRKCVkIC8gIgotCQkJICAgICAiJWQpXG4iLCAoaW50KXNrYi0+bGVuLAorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIiBJbnZhbGlkIHNrYiBsZW4gaW4gQkFSRVEoJWQgLyAlZClcbiIsCisJCQkgICAgIChpbnQpc2tiLT5sZW4sCiAJCQkgICAgIChpbnQpKHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikgKyA5KSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yNjksOCArMjY5LDggQEAKIAkgICAgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKSB8fAogCSAgICAoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9SRUpFQ1RfQUREQkFfUkVRKSkgewogCQlyYyA9IEFEREJBX1NUQVRVU19SRUZVU0VEOwotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIkZhaWxlZCB0byByZXBseSBvbiBBRERCQV9SRVEgYXMgIgotCQkJICAgICAic29tZSBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQpXG4iLAorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIkZhaWxlZCB0byByZXBseSBvbiBBRERCQV9SRVEgYXMgc29tZSBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQpXG4iLAogCQkJICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlLAogCQkJICAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCk7CiAJCWdvdG8gT25BRERCQVJlcV9GYWlsOwpAQCAtMjg1LDggKzI4NSw4IEBACiAKIAlpZiAocEJhUGFyYW1TZXQtPmZpZWxkLkJBUG9saWN5ID09IEJBX1BPTElDWV9ERUxBWUVEKSB7CiAJCXJjID0gQUREQkFfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiQkEgUG9saWN5IGlzIG5vdCBjb3JyZWN0IGluICIKLQkJCSAgICAgIiVzKClcbiIsIF9fZnVuY19fKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJCQSBQb2xpY3kgaXMgbm90IGNvcnJlY3QgaW4gJXMoKVxuIiwgX19mdW5jX18pOwogCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKIAl9CiAKQEAgLTMzMyw4ICszMzMsOSBAQAogCXUxNgkJCVJlYXNvbkNvZGU7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpICsgOSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gQkFSU1AoJWQgLyAiCi0JCQkgICAgICIlZClcbiIsIChpbnQpc2tiLT5sZW4sCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiSW52YWxpZCBza2IgbGVuIGluIEJBUlNQKCVkIC8gJWQpXG4iLAorCQkJICAgICAoaW50KXNrYi0+bGVuLAogCQkJICAgICAoaW50KShzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpICsgOSkpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzUxLDggKzM1Miw4IEBACiAJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCAgfHwKIAkgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UgfHwKIAkgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9PSBmYWxzZSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInJlamVjdCB0byBBRERCQV9SU1AgYXMgc29tZSBjYXBhYiIKLQkJCSAgICAgImlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQsICVkKVxuIiwKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJyZWplY3QgdG8gQUREQkFfUlNQIGFzIHNvbWUgY2FwYWJpbGl0eSBpcyBub3QgcmVhZHkoJWQsICVkLCAlZClcbiIsCiAJCQkgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUsCiAJCQkgICAgIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0LAogCQkJICAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlKTsKQEAgLTM3NCwxOCArMzc1LDE5IEBACiAKIAogCWlmIChwQWRtaXR0ZWRCQS0+YlZhbGlkID09IHRydWUpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIgotCQkJICAgICAiIERyb3AgYmVjYXVzZSBhbHJlYWR5IGFkbWl0IGl0IVxuIik7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsCisJCQkgICAgICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiBEcm9wIGJlY2F1c2UgYWxyZWFkeSBhZG1pdCBpdCFcbiIpOwogCQlyZXR1cm4gLTE7CiAJfSBlbHNlIGlmICgocFBlbmRpbmdCQS0+YlZhbGlkID09IGZhbHNlKSB8fAogCQkgICAoKnBEaWFsb2dUb2tlbiAhPSBwUGVuZGluZ0JBLT5EaWFsb2dUb2tlbikpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gIgotCQkJICAgICAiQkEgaW52YWxpZCwgREVMQkEhXG4iKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiBCQSBpbnZhbGlkLCBERUxCQSFcbiIpOwogCQlSZWFzb25Db2RlID0gREVMQkFfUkVBU09OX1VOS05PV05fQkE7CiAJCWdvdG8gT25BRERCQVJzcF9SZWplY3Q7CiAJfSBlbHNlIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIEJBICIKLQkJCSAgICAgImlzIGFkbWl0dGVkISBTdGF0dXMgY29kZTolWFxuIiwgKnBTdGF0dXNDb2RlKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwKKwkJCSAgICAgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIEJBIGlzIGFkbWl0dGVkISBTdGF0dXMgY29kZTolWFxuIiwKKwkJCSAgICAgKnBTdGF0dXNDb2RlKTsKIAkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcFBlbmRpbmdCQSk7CiAJfQogCkBAIC00MzIsMTYgKzQzNCwxNyBAQAogCXU4ICpkc3QgPSBOVUxMOwogCiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSArIDYpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIERFTEJBKCVkIC8iCi0JCQkgICAgICIgJWQpXG4iLCAoaW50KXNrYi0+bGVuLAorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIkludmFsaWQgc2tiIGxlbiBpbiBERUxCQSglZCAvICVkKVxuIiwKKwkJCSAgICAgKGludClza2ItPmxlbiwKIAkJCSAgICAgKGludCkoc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSArIDYpKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDAgIHx8CiAJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAicmVjZWl2ZWQgREVMQkEgd2hpbGUgUU9TIG9yIEhUICIKLQkJCSAgICAgImlzIG5vdCBzdXBwb3J0ZWQoJWQsICVkKVxuIiwKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJyZWNlaXZlZCBERUxCQSB3aGlsZSBRT1Mgb3IgSFQgaXMgbm90IHN1cHBvcnRlZCglZCwgJWQpXG4iLAogCQkJICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuIHFvc19kYXRhLmFjdGl2ZSwKIAkJCSAgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpOwogCQlyZXR1cm4gLTE7CkBAIC00NTksOCArNDYyLDkgQEAKIAogCQlpZiAoIUdldFRzKGllZWUsIChzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKiopJnBSeFRzLCBkc3QsCiAJCSAgICAodTgpcERlbEJhUGFyYW1TZXQtPmZpZWxkLlRJRCwgUlhfRElSLCBmYWxzZSkpIHsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAgImNhbid0IGdldCBUUyBmb3IgUlhUUyBpbiAiCi0JCQkJICAgICAiJXMoKS5kc3Q6ICVwTSBUSUQ6JWRcbiIsIF9fZnVuY19fLCBkc3QsCisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCQkgICAgICJjYW4ndCBnZXQgVFMgZm9yIFJYVFMgaW4gJXMoKS5kc3Q6ICVwTSBUSUQ6JWRcbiIsCisJCQkJICAgICBfX2Z1bmNfXywgZHN0LAogCQkJCSAgICAgKHU4KXBEZWxCYVBhcmFtU2V0LT5maWVsZC5USUQpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC00NzEsOCArNDc1LDkgQEAKIAogCQlpZiAoIUdldFRzKGllZWUsIChzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKiopJnBUeFRzLCBkc3QsCiAJCQkgICAodTgpcERlbEJhUGFyYW1TZXQtPmZpZWxkLlRJRCwgVFhfRElSLCBmYWxzZSkpIHsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAgImNhbid0IGdldCBUUyBmb3IgVFhUUyBpbiAiCi0JCQkJICAgICAiJXMoKVxuIiwgX19mdW5jX18pOworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkJICAgICAiY2FuJ3QgZ2V0IFRTIGZvciBUWFRTIGluICVzKClcbiIsCisJCQkJICAgICBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X0hULmgKaW5kZXggMTNmNDEwNS4uZjcwNzZkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVC5oCkBAIC03Nyw0MyArNzcsNiBAQAogCUNITkxPUF9TV0NITkwgPSAzLAogfTsKIAotI2RlZmluZSBDSEhMT1BfSU5fUFJPR1JFU1MoX3BIVEluZm8pCVwKLQkJKChfcEhUSW5mbyktPkNobmxPcCA+IENITkxPUF9OT05FKSA/IHRydWUgOiBmYWxzZQotCi0vKgotdW5pb24gaHRfY2FwYWJpbGl0eSB7Ci0JdTE2CVNob3J0RGF0YTsKLQl1OAlDaGFyRGF0YVsyXTsKLQlzdHJ1Y3QKLQl7Ci0JCXUxNglBZHZDb2Rpbmc6MTsKLQkJdTE2CUNobFdpZHRoOjE7Ci0JCXUxNglNaW1vUHdyU2F2ZToyOwotCQl1MTYJR3JlZW5GaWVsZDoxOwotCQl1MTYJU2hvcnRHSTIwTWh6OjE7Ci0JCXUxNglTaG9ydEdJNDBNaHo6MTsKLQkJdTE2CVNUQkM6MTsKLQkJdTE2CUJlYW1Gb3JtOjE7Ci0JCXUxNglEZWxheUJBOjE7Ci0JCXUxNglNYXhBTVNEVVNpemU6MTsKLQkJdTE2CURzc0NDazoxOwotCQl1MTYJUFNNUDoxOwotCQl1MTYJUnN2ZDozOwotCX1GaWVsZDsKLX07Ci0KLXVuaW9uIGh0X2NhcGFiaWxpdHlfbWFjcGFyYSB7Ci0JdTgJU2hvcnREYXRhOwotCXU4CUNoYXJEYXRhWzFdOwotCXN0cnVjdAotCXsKLQkJdTgJTWF4UnhBTVBEVToyOwotCQl1OAlNUERVRGVuc2l0eToyOwotCQl1OAlSc3ZkOjQ7Ci0JfUZpZWxkOwotfTsKLSovCi0KIGVudW0gaHRfYWN0aW9uIHsKIAlBQ1RfUkVDT01NQU5EX1dJRFRICQk9IDAsCiAJQUNUX01JTU9fUFdSX1NBVkUJCT0gMSwKQEAgLTM4MCwxNiArMzQzLDYgQEAKIGV4dGVybiB1OCBNQ1NfRklMVEVSX0FMTFsxNl07CiBleHRlcm4gdTggTUNTX0ZJTFRFUl8xU1NbMTZdOwogCi0jZGVmaW5lIFBJQ0tfUkFURShfbkxlZ2FjeVJhdGUsIF9uTWNzUmF0ZSkJXAotCQkoKF9uTWNzUmF0ZSA9PSAwKSA/IChfbkxlZ2FjeVJhdGUmMHg3ZikgOiAoX25NY3NSYXRlKSkKLSNkZWZpbmUJTEVHQUNZX1dJUkVMRVNTX01PREUJSUVFRV9NT0RFX01BU0sKLQotI2RlZmluZSBDVVJSRU5UX1JBVEUoV2lyZWxlc3NNb2RlLCBMZWdhY3lSYXRlLCBIVFJhdGUpCVwKLQkJCSgoV2lyZWxlc3NNb2RlICYgKExFR0FDWV9XSVJFTEVTU19NT0RFKSkgIT0gMCkgPyBcCi0JCQkoTGVnYWN5UmF0ZSkgOiAoUElDS19SQVRFKExlZ2FjeVJhdGUsIEhUUmF0ZSkpCi0KLQotCiAjZGVmaW5lCVJBVEVfQURQVF8xU1NfTUFTSwkJMHhGRgogI2RlZmluZQlSQVRFX0FEUFRfMlNTX01BU0sJCTB4RjAKICNkZWZpbmUJUkFURV9BRFBUX01DUzMyX01BU0sJCTB4MDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X0hUUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFRQcm9jLmMKaW5kZXggMWVhNDI2Yi4uN2YxMDMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFRQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFRQcm9jLmMKQEAgLTExNywxNjAgKzExNyw2IEBACiAJcEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUgPSAzMDsKIH0KIAotdm9pZCBIVERlYnVnSFRDYXBhYmlsaXR5KHU4ICpDYXBJRSwgdTggKlRpdGxlU3RyaW5nKQotewotCi0Jc3RhdGljIHU4CUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307Ci0Jc3RydWN0IGh0X2NhcGFiX2VsZSAqcENhcEVMRTsKLQotCWlmICghbWVtY21wKENhcElFLCBFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIkVXQyBJRSBpbiAlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JCXBDYXBFTEUgPSAoc3RydWN0IGh0X2NhcGFiX2VsZSAqKSgmQ2FwSUVbNF0pOwotCX0gZWxzZQotCQlwQ2FwRUxFID0gKHN0cnVjdCBodF9jYXBhYl9lbGUgKikoJkNhcElFWzBdKTsKLQotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICI8TG9nIEhUIENhcGFiaWxpdHk+LiBDYWxsZWQgYnkgJXNcbiIsCi0JCSAgICAgVGl0bGVTdHJpbmcpOwotCi0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdFN1cHBvcnRlZCBDaGFubmVsIFdpZHRoID0gJXNcbiIsCi0JCSAgICAgKHBDYXBFTEUtPkNobFdpZHRoKSA/ICIyME1IeiIgOiAiMjAvNDBNSHoiKTsKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0U3VwcG9ydCBTaG9ydCBHSSBmb3IgMjBNID0gJXNcbiIsCi0JCSAgICAgKHBDYXBFTEUtPlNob3J0R0kyME1oeikgPyAiWUVTIiA6ICJOTyIpOwotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciA0ME0gPSAlc1xuIiwKLQkJICAgICAocENhcEVMRS0+U2hvcnRHSTQwTWh6KSA/ICJZRVMiIDogIk5PIik7Ci0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdFN1cHBvcnQgVFggU1RCQyA9ICVzXG4iLAotCQkgICAgIChwQ2FwRUxFLT5UeFNUQkMpID8gIllFUyIgOiAiTk8iKTsKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0TWF4IEFNU0RVIFNpemUgPSAlc1xuIiwKLQkJICAgICAocENhcEVMRS0+TWF4QU1TRFVTaXplKSA/ICIzODM5IiA6ICI3OTM1Iik7Ci0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdFN1cHBvcnQgQ0NLIGluIDIwLzQwIG1vZGUgPSAlc1xuIiwKLQkJICAgICAocENhcEVMRS0+RHNzQ0NrKSA/ICJZRVMiIDogIk5PIik7Ci0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdE1heCBBTVBEVSBGYWN0b3IgPSAlZFxuIiwKLQkJICAgICBwQ2FwRUxFLT5NYXhSeEFNUERVRmFjdG9yKTsKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0TVBEVSBEZW5zaXR5ID0gJWRcbiIsCi0JCSAgICAgcENhcEVMRS0+TVBEVURlbnNpdHkpOwotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRNQ1MgUmF0ZSBTZXQgPSBbJXhdWyV4XVsleF1bJXhdWyV4XVxuIiwKLQkJICAgICBwQ2FwRUxFLT5NQ1NbMF0sIHBDYXBFTEUtPk1DU1sxXSwgcENhcEVMRS0+TUNTWzJdLAotCQkgICAgIHBDYXBFTEUtPk1DU1szXSwgcENhcEVMRS0+TUNTWzRdKTsKLQlyZXR1cm47Ci0KLX0KLQotdm9pZCBIVERlYnVnSFRJbmZvKHU4ICpJbmZvSUUsIHU4ICpUaXRsZVN0cmluZykKLXsKLQotCXN0YXRpYyB1OAlFV0MxMU5IVEluZm9bXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDM0fTsKLQlzdHJ1Y3QgaHRfaW5mb19lbGUgKnBIVEluZm9FbGU7Ci0KLQlpZiAoIW1lbWNtcChJbmZvSUUsIEVXQzExTkhUSW5mbywgc2l6ZW9mKEVXQzExTkhUSW5mbykpKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJFV0MgSUUgaW4gJXMoKVxuIiwgX19mdW5jX18pOwotCQlwSFRJbmZvRWxlID0gKHN0cnVjdCBodF9pbmZvX2VsZSAqKSgmSW5mb0lFWzRdKTsKLQl9IGVsc2UKLQkJcEhUSW5mb0VsZSA9IChzdHJ1Y3QgaHRfaW5mb19lbGUgKikoJkluZm9JRVswXSk7Ci0KLQotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICI8TG9nIEhUIEluZm9ybWF0aW9uIEVsZW1lbnQ+LiAiCi0JCSAgICAgIkNhbGxlZCBieSAlc1xuIiwgVGl0bGVTdHJpbmcpOwotCi0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlx0UHJpbWFyeSBjaGFubmVsID0gJWRcbiIsCi0JCSAgICAgcEhUSW5mb0VsZS0+Q29udHJvbENobCk7Ci0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlx0U2Vub25kYXJ5IGNoYW5uZWwgPSIpOwotCXN3aXRjaCAocEhUSW5mb0VsZS0+RXh0Q2hsT2Zmc2V0KSB7Ci0JY2FzZSAwOgotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiTm90IFByZXNlbnRcbiIpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJVcHBlciBjaGFubmVsXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiUmVzZXJ2ZWQuIEVvb3JvISEhXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiTG93ZXIgQ2hhbm5lbFxuIik7Ci0JCWJyZWFrOwotCX0KLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiXHRSZWNvbW1lbmRlZCBjaGFubmVsIHdpZHRoID0gJXNcbiIsCi0JCSAgICAgKHBIVEluZm9FbGUtPlJlY29tbWVtZGVkVHhXaWR0aCkgPyAiMjBNaHoiIDogIjQwTWh6Iik7Ci0KLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiXHRPcGVyYXRpb24gbW9kZSBmb3IgcHJvdGVjdGlvbiA9ICIpOwotCXN3aXRjaCAocEhUSW5mb0VsZS0+T3B0TW9kZSkgewotCWNhc2UgMDoKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIk5vIFByb3RlY3Rpb25cbiIpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlN1Z2dlc3QgdG8gb3BlbiBwcm90ZWN0aW9uXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiSFQgbWl4ZWQgbW9kZVxuIik7Ci0JCWJyZWFrOwotCX0KLQotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJcdEJhc2ljIE1DUyBSYXRlIFNldCA9IFsleF1bJXhdWyV4XVsleF0iCi0JCSAgICAgIlsleF1cbiIsIHBIVEluZm9FbGUtPkJhc2ljTVNDWzBdLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1sxXSwKLQkJICAgICBwSFRJbmZvRWxlLT5CYXNpY01TQ1syXSwgcEhUSW5mb0VsZS0+QmFzaWNNU0NbM10sCi0JCSAgICAgcEhUSW5mb0VsZS0+QmFzaWNNU0NbNF0pOwotfQotCi1zdGF0aWMgYm9vbCBJc0hUSGFsZk5tb2RlNDBCYW5kd2lkdGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCi17Ci0JYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7Ci0Jc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCi0JaWYgKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotCWVsc2UgaWYgKHBIVEluZm8tPmJSZWdCVzQwTUh6ID09IGZhbHNlKQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotCWVsc2UgaWYgKCFpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCi0JCXJldFZhbHVlID0gZmFsc2U7Ci0JZWxzZSBpZiAoKChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpLT5DaGxXaWR0aCkKLQkJcmV0VmFsdWUgPSB0cnVlOwotCWVsc2UKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotc3RhdGljIGJvb2wgSXNIVEhhbGZObW9kZVNHSShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgYm9vbCBpczQwTUh6KQotewotCWJvb2wJCQlyZXRWYWx1ZSA9IGZhbHNlOwotCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLQotCWlmIChwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSkKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLQllbHNlIGlmICghaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotCWVsc2UgaWYgKGlzNDBNSHopIHsKLQkJaWYgKCgoc3RydWN0IGh0X2NhcGFiX2VsZSAqKQotCQkgICAgKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpLT5TaG9ydEdJNDBNaHopCi0JCQlyZXRWYWx1ZSA9IHRydWU7Ci0JCWVsc2UKLQkJCXJldFZhbHVlID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJaWYgKCgoc3RydWN0IGh0X2NhcGFiX2VsZSAqKQotCQkgICAocEhUSW5mby0+UGVlckhUQ2FwQnVmKSktPlNob3J0R0kyME1oeikKLQkJCXJldFZhbHVlID0gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0VmFsdWUgPSBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXUxNiBIVEhhbGZNY3NUb0RhdGFSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBuTWNzUmF0ZSkKLXsKLQotCXU4CWlzNDBNSHo7Ci0JdTgJaXNTaG9ydEdJOwotCi0JaXM0ME1IeiAgPSAgKElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChpZWVlKSkgPyAxIDogMDsKLQlpc1Nob3J0R0kgPSAoSXNIVEhhbGZObW9kZVNHSShpZWVlLCBpczQwTUh6KSkgPyAxIDogMDsKLQotCXJldHVybiBNQ1NfREFUQV9SQVRFW2lzNDBNSHpdW2lzU2hvcnRHSV1bKG5NY3NSYXRlICYgMHg3ZildOwotfQotCi0KIHUxNiBIVE1jc1RvRGF0YVJhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG5NY3NSYXRlKQogewogCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKQEAgLTI4OSwyNSArMTM1LDIyIEBACiAJdTgJaXM0ME1IeiA9IDA7CiAJdTgJaXNTaG9ydEdJID0gMDsKIAotCWlmIChuRGF0YVJhdGUgPCAxMikgeworCWlmIChuRGF0YVJhdGUgPCAxMikKIAkJcmV0dXJuIENDS09GRE1SYXRlW25EYXRhUmF0ZV07Ci0JfSBlbHNlIHsKLQkJaWYgKG5EYXRhUmF0ZSA+PSAweDEwICYmIG5EYXRhUmF0ZSA8PSAweDFmKSB7Ci0JCQlpczQwTUh6ID0gMDsKLQkJCWlzU2hvcnRHSSA9IDA7Ci0JCX0gZWxzZSBpZiAobkRhdGFSYXRlID49IDB4MjAgICYmIG5EYXRhUmF0ZSA8PSAweDJmKSB7Ci0JCQlpczQwTUh6ID0gMTsKLQkJCWlzU2hvcnRHSSA9IDA7Ci0KLQkJfSBlbHNlIGlmIChuRGF0YVJhdGUgPj0gMHgzMCAgJiYgbkRhdGFSYXRlIDw9IDB4M2YpIHsKLQkJCWlzNDBNSHogPSAwOwotCQkJaXNTaG9ydEdJID0gMTsKLQkJfSBlbHNlIGlmIChuRGF0YVJhdGUgPj0gMHg0MCAgJiYgbkRhdGFSYXRlIDw9IDB4NGYpIHsKLQkJCWlzNDBNSHogPSAxOwotCQkJaXNTaG9ydEdJID0gMTsKLQkJfQotCQlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldW25EYXRhUmF0ZSYweGZdOworCWlmIChuRGF0YVJhdGUgPj0gMHgxMCAmJiBuRGF0YVJhdGUgPD0gMHgxZikgeworCQlpczQwTUh6ID0gMDsKKwkJaXNTaG9ydEdJID0gMDsKKwl9IGVsc2UgaWYgKG5EYXRhUmF0ZSA+PSAweDIwICAmJiBuRGF0YVJhdGUgPD0gMHgyZikgeworCQlpczQwTUh6ID0gMTsKKwkJaXNTaG9ydEdJID0gMDsKKwl9IGVsc2UgaWYgKG5EYXRhUmF0ZSA+PSAweDMwICAmJiBuRGF0YVJhdGUgPD0gMHgzZikgeworCQlpczQwTUh6ID0gMDsKKwkJaXNTaG9ydEdJID0gMTsKKwl9IGVsc2UgaWYgKG5EYXRhUmF0ZSA+PSAweDQwICAmJiBuRGF0YVJhdGUgPD0gMHg0ZikgeworCQlpczQwTUh6ID0gMTsKKwkJaXNTaG9ydEdJID0gMTsKIAl9CisJcmV0dXJuIE1DU19EQVRBX1JBVEVbaXM0ME1Iel1baXNTaG9ydEdJXVtuRGF0YVJhdGUmMHhmXTsKIH0KIAogYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQpAQCAtMzg2LDkgKzIyOSw3IEBACiAKIHN0YXRpYyBib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCiB7Ci0JYm9vbCByZXRWYWx1ZSA9IGZhbHNlOwotCi0JcmV0dXJuIHJldFZhbHVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1NUd29TcGF0aWFsU3RyZWFtKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQpAQCAtNDUwLDggKzI5MSw4IEBACiAJc3RydWN0IGh0X2NhcGFiX2VsZSAqcENhcEVMRSA9IE5VTEw7CiAKIAlpZiAoKHBvc0hUQ2FwID09IE5VTEwpIHx8IChwSFQgPT0gTlVMTCkpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJwb3NIVENhcCBvciBwSFRJbmZvIGNhbid0IGJlICIKLQkJCSAgICAgIm51bGwgaW4gSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudCgpXG4iKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJwb3NIVENhcCBvciBwSFRJbmZvIGNhbid0IGJlIG51bGwgaW4gSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudCgpXG4iKTsKIAkJcmV0dXJuOwogCX0KIAltZW1zZXQocG9zSFRDYXAsIDAsICpsZW4pOwpAQCAtNDg3LDkgKzMyOCw5IEBACiAJcENhcEVMRS0+TFNpZ1R4b3BQcm90ZWN0ID0gMDsKIAogCi0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlRYIEhUIGNhcC9pbmZvIGVsZSBCVz0lZCBNYXhBTVNEVVNpemU6JWQgIgotCQkgICAgICJEc3NDQ2s6JWRcbiIsIHBDYXBFTEUtPkNobFdpZHRoLCBwQ2FwRUxFLT5NYXhBTVNEVVNpemUsCi0JCSAgICAgcENhcEVMRS0+RHNzQ0NrKTsKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULAorCQkgICAgICJUWCBIVCBjYXAvaW5mbyBlbGUgQlc9JWQgTWF4QU1TRFVTaXplOiVkIERzc0NDazolZFxuIiwKKwkJICAgICBwQ2FwRUxFLT5DaGxXaWR0aCwgcENhcEVMRS0+TWF4QU1TRFVTaXplLCBwQ2FwRUxFLT5Ec3NDQ2spOwogCiAJaWYgKElzRW5jcnlwdCkgewogCQlwQ2FwRUxFLT5NUERVRGVuc2l0eQk9IDc7CkBAIC01MzIsOCArMzczLDggQEAKIAlzdHJ1Y3QgaHRfaW5mb19lbGUgKnBIVEluZm9FbGUgPSAoc3RydWN0IGh0X2luZm9fZWxlICopcG9zSFRJbmZvOwogCiAJaWYgKChwb3NIVEluZm8gPT0gTlVMTCkgfHwgKHBIVEluZm9FbGUgPT0gTlVMTCkpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJwb3NIVEluZm8gb3IgcEhUSW5mb0VsZSBjYW4ndCBiZSAiCi0JCQkgICAgICJudWxsIGluIEhUQ29uc3RydWN0SW5mb0VsZW1lbnQoKVxuIik7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAicG9zSFRJbmZvIG9yIHBIVEluZm9FbGUgY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdEluZm9FbGVtZW50KClcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC01NzIsOCArNDEzLDggQEAKIAkJCQl1OCAqbGVuKQogewogCWlmIChwb3NSVDJSVEFnZyA9PSBOVUxMKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAicG9zUlQyUlRBZ2cgY2FuJ3QgYmUgbnVsbCBpbiAiCi0JCQkgICAgICJIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudCgpXG4iKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJwb3NSVDJSVEFnZyBjYW4ndCBiZSBudWxsIGluIEhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KClcbiIpOwogCQlyZXR1cm47CiAJfQogCW1lbXNldChwb3NSVDJSVEFnZywgMCwgKmxlbik7CkBAIC01OTYsOCArNDM3LDggQEAKIAl1OCBpOwogCiAJaWYgKHBPcGVyYXRlTUNTID09IE5VTEwpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJwT3BlcmF0ZU1DUyBjYW4ndCBiZSBudWxsIgotCQkJICAgICAiIGluIEhUX1BpY2tNQ1NSYXRlKClcbiIpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgInBPcGVyYXRlTUNTIGNhbid0IGJlIG51bGwgaW4gSFRfUGlja01DU1JhdGUoKVxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTYzMSw4ICs0NzIsOCBAQAogCXU4CQlhdmFpbGFibGVNY3NSYXRlWzE2XTsKIAogCWlmIChwTUNTUmF0ZVNldCA9PSBOVUxMIHx8IHBNQ1NGaWx0ZXIgPT0gTlVMTCkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBNQ1NSYXRlU2V0IG9yIHBNQ1NGaWx0ZXIgY2FuJ3QgIgotCQkJICAgICAiYmUgbnVsbCBpbiBIVEdldEhpZ2hlc3RNQ1NSYXRlKClcbiIpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgInBNQ1NSYXRlU2V0IG9yIHBNQ1NGaWx0ZXIgY2FuJ3QgYmUgbnVsbCBpbiBIVEdldEhpZ2hlc3RNQ1NSYXRlKClcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQpAQCAtNjU0LDcgKzQ5NSw3IEBACiAJCQkJCSAgICBIVE1jc1RvRGF0YVJhdGUoaWVlZSwgbWNzUmF0ZSkpCiAJCQkJCQltY3NSYXRlID0gKDgqaStqKTsKIAkJCQl9Ci0JCQkJYml0TWFwID0gYml0TWFwPj4xOworCQkJCWJpdE1hcCA+Pj0gMTsKIAkJCX0KIAkJfQogCX0KQEAgLTY5Nyw4ICs1MzgsOCBAQAogCXN0YXRpYyB1OCBFV0MxMU5IVEluZm9bXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDM0fTsKIAogCWlmIChwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIjw9PT0gSFRPbkFzc29jUnNwKCk6ICIKLQkJCSAgICAgIkhUX0RJU0FCTEVcbiIpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIjw9PT0gSFRPbkFzc29jUnNwKCk6IEhUX0RJU0FCTEVcbiIpOwogCQlyZXR1cm47CiAJfQogCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICI9PT0+IEhUT25Bc3NvY1JzcF93cSgpOiBIVF9FTkFCTEVcbiIpOwpAQCAtODc4LDcgKzcxOSw4IEBACiAKIAlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiPT09PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOwogCS8qIHVubWFyayBiRW5hYmxlSFQgZmxhZyBoZXJlIGlzIHRoZSBzYW1lIHJlYXNvbiB3aHkgdW5tYXJrZWQgaW4KLQkgKiBmdW5jdGlvbiBydGxsaWJfc29mdG1hY19uZXdfbmV0LiBXQiAyMDA4LjA5LjEwKi8KKwkgKiBmdW5jdGlvbiBydGxsaWJfc29mdG1hY19uZXdfbmV0LiBXQiAyMDA4LjA5LjEwCisJICovCiAJaWYgKHBOZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCkgewogCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7CiAJCXBIVEluZm8tPmVQZWVySFRTcGVjVmVyID0gcE5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyOwpAQCAtOTk5LDggKzg0MSw4IEBACiB7CiAJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KSB7CiAJCWlmICgoSXNRb1NEYXRhRnJhbWUocEZyYW1lKSAmJiBGcmFtZV9PcmRlcihwRnJhbWUpKSA9PSAxKSB7Ci0JCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiSFQgQ09OVFJPTCBGSUxFRCAiCi0JCQkJICAgICAiRVhJU1QhIVxuIik7CisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULAorCQkJCSAgICAgIkhUIENPTlRST0wgRklMRUQgRVhJU1QhIVxuIik7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfUW9zLmgKaW5kZXggOTczMzQyYi4uNTVlZjdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfUW9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfUW9zLmgKQEAgLTE5LDggKzE5LDYgQEAKICNpZm5kZWYgX19JTkNfUU9TX1RZUEVfSAogI2RlZmluZSBfX0lOQ19RT1NfVFlQRV9ICiAKLSNpbmNsdWRlICJydGxsaWJfZW5kaWFuZnJlZS5oIgotCiAjZGVmaW5lIEJJVDAJCSAgICAweDAwMDAwMDAxCiAjZGVmaW5lIEJJVDEJCSAgICAweDAwMDAwMDAyCiAjZGVmaW5lIEJJVDIJCSAgICAweDAwMDAwMDA0CkBAIC0zNDAsMTggKzMzOCw2IEBACiB9OwogCiAjZGVmaW5lIFFCU1NfTE9BRF9TSVpFCQkJCTUKLSNkZWZpbmUgR0VUX1FCU1NfTE9BRF9TVEFfQ09VTlQoX19wU3RhcnQpCVwKLQkJUmVhZEVGMkJ5dGUoX19wU3RhcnQpCi0jZGVmaW5lIFNFVF9RQlNTX0xPQURfU1RBX0NPVU5UKF9fcFN0YXJ0LCBfX1ZhbHVlKQlcCi0JCVdyaXRlRUYyQnl0ZShfX3BTdGFydCwgX19WYWx1ZSkKLSNkZWZpbmUgR0VUX1FCU1NfTE9BRF9DSE5MX1VUSUxJWkFUSU9OKF9fcFN0YXJ0KQlcCi0JCVJlYWRFRjFCeXRlKCh1OCAqKShfX3BTdGFydCkgKyAyKQotI2RlZmluZSBTRVRfUUJTU19MT0FEX0NITkxfVVRJTElaQVRJT04oX19wU3RhcnQsIF9fVmFsdWUpCVwKLQkJV3JpdGVFRjFCeXRlKCh1OCAqKShfX3BTdGFydCkgKyAyLCBfX1ZhbHVlKQotI2RlZmluZSBHRVRfUUJTU19MT0FEX0FWQUlMQUJMRV9DQVBBQ0lUWShfX3BTdGFydCkJXAotCQlSZWFkRUYyQnl0ZSgodTggKikoX19wU3RhcnQpICsgMykKLSNkZWZpbmUgU0VUX1FCU1NfTE9BRF9BVkFJTEFCTEVfQ0FQQUNJVFkoX19wU3RhcnQsIF9fVmFsdWUpIFwKLQkJV3JpdGVFRjJCeXRlKCh1OCAqKShfX3BTdGFydCkgKyAzLCBfX1ZhbHVlKQogCiBzdHJ1Y3QgYnNzX3FvcyB7CiAJUU9TX01PREUgYmRRb1NNb2RlOwpAQCAtMzY3LDEwICszNTMsNiBAQAogCWJvb2wgYlFCc3NMb2FkVmFsaWQ7CiB9OwogCi0jZGVmaW5lIHNRb1NDdGxMbmcJMgotI2RlZmluZSBRT1NfQ1RSTF9MRU4oX1Fvc01vZGUpCSgoX1Fvc01vZGUgPiBRT1NfRElTQUJMRSkgPyBzUW9TQ3RsTG5nIDogMCkKLQotCiAjZGVmaW5lIElzQUNWYWxpZChhYykJCSgoYWMgPj0gMCAmJiBhYyA8PSA3KSA/IHRydWUgOiBmYWxzZSkKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1RTUHJvYy5jCmluZGV4IDI5NDg0N2QuLjdkNzdkMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1RTUHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1RTUHJvYy5jCkBAIC01OCw5ICs1OCw5IEBACiAJCQkJCXBSeFRzLT5SeEluZGljYXRlU2VxID0KIAkJCQkJICAgICAgKHBSeFRzLT5SeEluZGljYXRlU2VxICsgMSkgJSA0MDk2OwogCi0JCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9SRU9SREVSLCAiJXMoKTogSW5kaWNhdGUiCi0JCQkJCSAgICAgIiBTZXFOdW06ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJICAgICBwUmVvcmRlckVudHJ5LT5TZXFOdW0pOworCQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwKKwkJCQkJICAgICAiJXMoKTogSW5kaWNhdGUgU2VxTnVtOiAlZFxuIiwKKwkJCQkJICAgICBfX2Z1bmNfXywgcFJlb3JkZXJFbnRyeS0+U2VxTnVtKTsKIAkJCQlpZWVlLT5zdGF0c19JbmRpY2F0ZUFycmF5W2luZGV4XSA9CiAJCQkJCQkJIHBSZW9yZGVyRW50cnktPnByeGI7CiAJCQkJaW5kZXgrKzsKQEAgLTc4LDggKzc4LDggQEAKIAkJcFJ4VHMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gMHhmZmZmOwogCiAJCWlmIChpbmRleCA+IFJFT1JERVJfV0lOX1NJWkUpIHsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKToiCi0JCQkJICAgICAiIFJ4IFJlb3JkZXIgc3RydWN0IGJ1ZmZlciBmdWxsISFcbiIpOworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkJICAgICAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKTogUnggUmVvcmRlciBzdHJ1Y3QgYnVmZmVyIGZ1bGwhIVxuIik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksCiAJCQkJCSAgICAgICBmbGFncyk7CiAJCQlyZXR1cm47CkBAIC05MSw3ICs5MSw3IEBACiAJaWYgKGJQa3RJbkJ1ZiAmJiAocFJ4VHMtPlJ4VGltZW91dEluZGljYXRlU2VxID09IDB4ZmZmZikpIHsKIAkJcFJ4VHMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gcFJ4VHMtPlJ4SW5kaWNhdGVTZXE7CiAJCW1vZF90aW1lcigmcFJ4VHMtPlJ4UGt0UGVuZGluZ1RpbWVyLCAgamlmZmllcyArCi0JCQkgIE1TRUNTKGllZWUtPnBIVEluZm8tPlJ4UmVvcmRlclBlbmRpbmdUaW1lKSk7CisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoaWVlZS0+cEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUpKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGllZWUtPnJlb3JkZXJfc3BpbmxvY2spLCBmbGFncyk7CiB9CkBAIC0xMDQsOCArMTA0LDggQEAKIAkJCQkgICAgIFR4VHNSZWNvcmRbbnVtXSk7CiAKIAlUc0luaXRBZGRCQShpZWVlLCBwVHhUcywgQkFfUE9MSUNZX0lNTUVESUFURSwgZmFsc2UpOwotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsICJUc0FkZEJhUHJvY2VzcygpOiBBRERCQSBSZXEgaXMgIgotCQkgICAgICJzdGFydGVkISFcbiIpOworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsCisJCSAgICAgIlRzQWRkQmFQcm9jZXNzKCk6IEFEREJBIFJlcSBpcyBzdGFydGVkISFcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBSZXNldFRzQ29tbW9uSW5mbyhzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKnBUc0NvbW1vbkluZm8pCkBAIC0yMjMsNyArMjIzLDcgQEAKIAogCWlmIChJbmFjdFRpbWUgIT0gMCkKIAkJbW9kX3RpbWVyKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyLCBqaWZmaWVzICsKLQkJCSAgTVNFQ1MoSW5hY3RUaW1lKSk7CisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoSW5hY3RUaW1lKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKlNlYXJjaEFkbWl0VFJTdHJlYW0oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCkBAIC0zMTEsMTggKzMxMSwyNCBAQAogCSAgIHU4ICpBZGRyLCB1OCBUSUQsIGVudW0gdHJfc2VsZWN0IFR4UnhTZWxlY3QsIGJvb2wgYkFkZE5ld1RzKQogewogCXU4CVVQID0gMDsKKwl1bmlvbiB0c3BlY19ib2R5IFRTcGVjOworCXVuaW9uIHFvc190c2luZm8gKnBUU0luZm8gPSAmVFNwZWMuZi5UU0luZm87CisJc3RydWN0IGxpc3RfaGVhZCAqcFVudXNlZExpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCAqcEFkZG1pdExpc3Q7CisJZW51bSBkaXJlY3Rpb25fdmFsdWUgRGlyOwogCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKEFkZHIpKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiRVJSISBnZXQgVFMgZm9yIEJyb2FkY2FzdCBvciAiCi0JCQkgICAgICJNdWx0aWNhc3RcbiIpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIkVSUiEgZ2V0IFRTIGZvciBCcm9hZGNhc3Qgb3IgTXVsdGljYXN0XG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9PSAwKSB7CiAJCVVQID0gMDsKIAl9IGVsc2UgewogCQlpZiAoIUlzQUNWYWxpZChUSUQpKSB7Ci0JCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIkVSUiEgaW4gJXMoKSwgVElEKCVkKSBpcyAiCi0JCQkJICAgICAibm90IHZhbGlkXG4iLCBfX2Z1bmNfXywgVElEKTsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJCSAgICAgIkVSUiEgaW4gJXMoKSwgVElEKCVkKSBpcyBub3QgdmFsaWRcbiIsCisJCQkJICAgICBfX2Z1bmNfXywgVElEKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC0zNDcsNzcgKzM1Myw3MCBAQAogCX0KIAogCSpwcFRTID0gU2VhcmNoQWRtaXRUUlN0cmVhbShpZWVlLCBBZGRyLCBVUCwgVHhSeFNlbGVjdCk7Ci0JaWYgKCpwcFRTICE9IE5VTEwpIHsKKwlpZiAoKnBwVFMgIT0gTlVMTCkKIAkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLQkJaWYgKCFiQWRkTmV3VHMpIHsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFMsICJhZGQgbmV3IFRTIGZhaWxlZCIKLQkJCQkgICAgICIodGlkOiVkKVxuIiwgVVApOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJdW5pb24gdHNwZWNfYm9keSBUU3BlYzsKLQkJCXVuaW9uIHFvc190c2luZm8gKnBUU0luZm8gPSAmVFNwZWMuZi5UU0luZm87Ci0JCQlzdHJ1Y3QgbGlzdF9oZWFkICpwVW51c2VkTGlzdCA9Ci0JCQkJKFR4UnhTZWxlY3QgPT0gVFhfRElSKSA/CisKKwlpZiAoIWJBZGROZXdUcykgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1RTLAorCQkJICAgICAiYWRkIG5ldyBUUyBmYWlsZWQodGlkOiVkKVxuIiwgVVApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcFVudXNlZExpc3QgPSAoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8KIAkJCQkoJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KSA6CiAJCQkJKCZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CiAKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKnBBZGRtaXRMaXN0ID0KLQkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8KKwlwQWRkbWl0TGlzdCA9IChUeFJ4U2VsZWN0ID09IFRYX0RJUikgPwogCQkJCSgmaWVlZS0+VHhfVFNfQWRtaXRfTGlzdCkgOgogCQkJCSgmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCk7CiAKLQkJCWVudW0gZGlyZWN0aW9uX3ZhbHVlIERpciA9Ci0JCQkJIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSA/Ci0JCQkJICgoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8gRElSX0RPV04gOiBESVJfVVApIDoKLQkJCQkgKChUeFJ4U2VsZWN0ID09IFRYX0RJUikgPyBESVJfVVAgOiBESVJfRE9XTik7Ci0JCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1RTLCAidG8gYWRkIFRzXG4iKTsKLQkJCWlmICghbGlzdF9lbXB0eShwVW51c2VkTGlzdCkpIHsKLQkJCQkoKnBwVFMpID0gbGlzdF9lbnRyeShwVW51c2VkTGlzdC0+bmV4dCwKLQkJCQkJICBzdHJ1Y3QgdHNfY29tbW9uX2luZm8sIExpc3QpOwotCQkJCWxpc3RfZGVsX2luaXQoJigqcHBUUyktPkxpc3QpOwotCQkJCWlmIChUeFJ4U2VsZWN0ID09IFRYX0RJUikgewotCQkJCQlzdHJ1Y3QgdHhfdHNfcmVjb3JkICp0bXAgPQotCQkJCQkJY29udGFpbmVyX29mKCpwcFRTLAotCQkJCQkJc3RydWN0IHR4X3RzX3JlY29yZCwKLQkJCQkJCVRzQ29tbW9uSW5mbyk7Ci0JCQkJCVJlc2V0VHhUc0VudHJ5KHRtcCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RydWN0IHJ4X3RzX3JlY29yZCAqdG1wID0KLQkJCQkJCSBjb250YWluZXJfb2YoKnBwVFMsCi0JCQkJCQkgc3RydWN0IHJ4X3RzX3JlY29yZCwKLQkJCQkJCSBUc0NvbW1vbkluZm8pOwotCQkJCQlSZXNldFJ4VHNFbnRyeSh0bXApOwotCQkJCX0KKwlEaXIgPSAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgPworCQkJCSgoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8gRElSX0RPV04gOiBESVJfVVApIDoKKwkJCQkoKFR4UnhTZWxlY3QgPT0gVFhfRElSKSA/IERJUl9VUCA6IERJUl9ET1dOKTsKIAotCQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFMsICJ0byBpbml0IGN1cnJlbnQgVFMiCi0JCQkJCSAgICAgIiwgVVA6JWQsIERpcjolZCwgYWRkcjogJXBNIgotCQkJCQkgICAgICIgcHBUcz0lcFxuIiwgVVAsIERpciwKLQkJCQkJICAgICAgQWRkciwgKnBwVFMpOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjVHJhZmZpY1R5cGUgPSAwOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjVFNJRCA9IFVQOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjRGlyZWN0aW9uID0gRGlyOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjQWNjZXNzUG9saWN5ID0gMTsKLQkJCQlwVFNJbmZvLT5maWVsZC51Y0FnZ3JlZ2F0aW9uID0gMDsKLQkJCQlwVFNJbmZvLT5maWVsZC51Y1BTQiA9IDA7Ci0JCQkJcFRTSW5mby0+ZmllbGQudWNVUCA9IFVQOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjVFNJbmZvQWNrUG9saWN5ID0gMDsKLQkJCQlwVFNJbmZvLT5maWVsZC51Y1NjaGVkdWxlID0gMDsKLQotCQkJCU1ha2VUU0VudHJ5KCpwcFRTLCBBZGRyLCAmVFNwZWMsIE5VTEwsIDAsIDApOwotCQkJCUFkbWl0VFMoaWVlZSwgKnBwVFMsIDApOwotCQkJCWxpc3RfYWRkX3RhaWwoJigoKnBwVFMpLT5MaXN0KSwgcEFkZG1pdExpc3QpOwotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiRVJSISFpbiBmdW5jdGlvbiAiCi0JCQkJCSAgICAgIiVzKCkgVGhlcmUgaXMgbm90IGVub3VnaCBkaXI9JWQiCi0JCQkJCSAgICAgIigwPXVwIGRvd249MSkgVFMgcmVjb3JkIHRvIGJlICIKLQkJCQkJICAgICAidXNlZCEhIiwgX19mdW5jX18sIERpcik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQorCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFMsICJ0byBhZGQgVHNcbiIpOworCWlmICghbGlzdF9lbXB0eShwVW51c2VkTGlzdCkpIHsKKwkJKCpwcFRTKSA9IGxpc3RfZW50cnkocFVudXNlZExpc3QtPm5leHQsCisJCQkgIHN0cnVjdCB0c19jb21tb25faW5mbywgTGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJigqcHBUUyktPkxpc3QpOworCQlpZiAoVHhSeFNlbGVjdCA9PSBUWF9ESVIpIHsKKwkJCXN0cnVjdCB0eF90c19yZWNvcmQgKnRtcCA9CisJCQkJY29udGFpbmVyX29mKCpwcFRTLAorCQkJCXN0cnVjdCB0eF90c19yZWNvcmQsCisJCQkJVHNDb21tb25JbmZvKTsKKwkJCVJlc2V0VHhUc0VudHJ5KHRtcCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcnhfdHNfcmVjb3JkICp0bXAgPQorCQkJCSBjb250YWluZXJfb2YoKnBwVFMsCisJCQkJIHN0cnVjdCByeF90c19yZWNvcmQsCisJCQkJIFRzQ29tbW9uSW5mbyk7CisJCQlSZXNldFJ4VHNFbnRyeSh0bXApOwogCQl9CisKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUywKKwkJCSAgICAgInRvIGluaXQgY3VycmVudCBUUywgVVA6JWQsIERpcjolZCwgYWRkcjogJXBNIHBwVHM9JXBcbiIsCisJCQkgICAgIFVQLCBEaXIsIEFkZHIsICpwcFRTKTsKKwkJcFRTSW5mby0+ZmllbGQudWNUcmFmZmljVHlwZSA9IDA7CisJCXBUU0luZm8tPmZpZWxkLnVjVFNJRCA9IFVQOworCQlwVFNJbmZvLT5maWVsZC51Y0RpcmVjdGlvbiA9IERpcjsKKwkJcFRTSW5mby0+ZmllbGQudWNBY2Nlc3NQb2xpY3kgPSAxOworCQlwVFNJbmZvLT5maWVsZC51Y0FnZ3JlZ2F0aW9uID0gMDsKKwkJcFRTSW5mby0+ZmllbGQudWNQU0IgPSAwOworCQlwVFNJbmZvLT5maWVsZC51Y1VQID0gVVA7CisJCXBUU0luZm8tPmZpZWxkLnVjVFNJbmZvQWNrUG9saWN5ID0gMDsKKwkJcFRTSW5mby0+ZmllbGQudWNTY2hlZHVsZSA9IDA7CisKKwkJTWFrZVRTRW50cnkoKnBwVFMsIEFkZHIsICZUU3BlYywgTlVMTCwgMCwgMCk7CisJCUFkbWl0VFMoaWVlZSwgKnBwVFMsIDApOworCQlsaXN0X2FkZF90YWlsKCYoKCpwcFRTKS0+TGlzdCksIHBBZGRtaXRMaXN0KTsKKworCQlyZXR1cm4gdHJ1ZTsKIAl9CisKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJICAgICAiRVJSISFpbiBmdW5jdGlvbiAlcygpIFRoZXJlIGlzIG5vdCBlbm91Z2ggZGlyPSVkKDA9dXAgZG93bj0xKSBUUyByZWNvcmQgdG8gYmUgdXNlZCEhIiwKKwkJICAgICBfX2Z1bmNfXywgRGlyKTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyB2b2lkIFJlbW92ZVRzRW50cnkoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCB0c19jb21tb25faW5mbyAqcFRzLApAQCAtNDM4LDggKzQzNyw4IEBACiAJCQlwUnhSZW9yZGVyRW50cnkgPSAoc3RydWN0IHJ4X3Jlb3JkZXJfZW50cnkgKikKIAkJCQkJbGlzdF9lbnRyeShwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LAogCQkJCQlzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSwgTGlzdCk7Ci0JCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1JFT1JERVIsICIlcygpOiBEZWxldGUgU2VxTnVtICIKLQkJCQkgICAgICIlZCFcbiIsIF9fZnVuY19fLAorCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9SRU9SREVSLAorCQkJCSAgICAgIiVzKCk6IERlbGV0ZSBTZXFOdW0gJWQhXG4iLCBfX2Z1bmNfXywKIAkJCQkgICAgIHBSeFJlb3JkZXJFbnRyeS0+U2VxTnVtKTsKIAkJCWxpc3RfZGVsX2luaXQoJnBSeFJlb3JkZXJFbnRyeS0+TGlzdCk7CiAJCQl7CkBAIC00NjcsNyArNDY2LDcgQEAKIHsKIAlzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKnBUUywgKnBUbXBUUzsKIAotCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PlJlbW92ZVBlZXJUUywgJXBNXG4iLCBBZGRyKTsKKwluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICI9PT09PT09PT09PT5SZW1vdmVQZWVyVFMsICVwTVxuIiwgQWRkcik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpIHsKIAkJaWYgKG1lbWNtcChwVFMtPkFkZHIsIEFkZHIsIDYpID09IDApIHsKQEAgLTQ3OSw3ICs0NzgsOCBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfQWRtaXRfTGlzdCwgTGlzdCkgewogCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT5yZW1vdmUgVHhfVFNfYWRtaW5fbGlzdFxuIik7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICI9PT09PnJlbW92ZSBUeF9UU19hZG1pbl9saXN0XG4iKTsKIAkJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBUWF9ESVIpOwogCQkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKIAkJCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKQEAgLTUzOSwxMyArNTM5LDEzIEBACiAJCXBUeFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID0gdHJ1ZTsKIAogCQlpZiAocFR4VFMtPmJBZGRCYVJlcURlbGF5ZWQpIHsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsICJUc1N0YXJ0QWRkQmFQcm9jZXNzKCk6ICIKLQkJCQkgICAgICJEZWxheWVkIFN0YXJ0IEFEREJBIGFmdGVyIDYwIHNlYyEhXG4iKTsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsCisJCQkJICAgICAiVHNTdGFydEFkZEJhUHJvY2VzcygpOiBEZWxheWVkIFN0YXJ0IEFEREJBIGFmdGVyIDYwIHNlYyEhXG4iKTsKIAkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcyArCi0JCQkJICBNU0VDUyhUU19BRERCQV9ERUxBWSkpOworCQkJCSAgbXNlY3NfdG9famlmZmllcyhUU19BRERCQV9ERUxBWSkpOwogCQl9IGVsc2UgewotCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIlRzU3RhcnRBZGRCYVByb2Nlc3MoKTogIgotCQkJCSAgICAgIkltbWVkaWF0ZWx5IFN0YXJ0IEFEREJBIG5vdyEhXG4iKTsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsCisJCQkJICAgICAiVHNTdGFydEFkZEJhUHJvY2VzcygpOiBJbW1lZGlhdGVseSBTdGFydCBBRERCQSBub3chIVxuIik7CiAJCQltb2RfdGltZXIoJnBUeFRTLT5Uc0FkZEJhVGltZXIsIGppZmZpZXMrMTApOwogCQl9CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmgKaW5kZXggY2VmMmRjMi4uM2M4YjcwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaApAQCAtNjYsMjUgKzY2LDggQEAKICNkZWZpbmUgSVdfQ1VTVE9NX01BWAkyNTYJLyogSW4gYnl0ZXMgKi8KICNlbmRpZgogCi0jaWZuZGVmIGNvbnRhaW5lcl9vZgotLyoqCi0gKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgotICogQHR5cGU6ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCi0gKiBAbWVtYmVyOiAgICAgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KLSAqCi0gKi8KLSNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJICAgICAgXAotCWNvbnN0IHR5cGVvZigoKHR5cGUgKikwKS0+bWVtYmVyKSpfX21wdHIgPSAocHRyKTsgICAgXAotCSh0eXBlICopKChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSk7IH0pCi0jZW5kaWYKLQogI2RlZmluZSBza2JfdGFpbF9wb2ludGVyX3JzbChza2IpIHNrYl90YWlsX3BvaW50ZXIoc2tiKQogCi0jZGVmaW5lIEVYUE9SVF9TWU1CT0xfUlNMKHgpIEVYUE9SVF9TWU1CT0woeCkKLQotCiAjZGVmaW5lIHF1ZXVlX2RlbGF5ZWRfd29ya19yc2woeCwgeSwgeikgcXVldWVfZGVsYXllZF93b3JrKHgsIHksIHopCiAjZGVmaW5lIElOSVRfREVMQVlFRF9XT1JLX1JTTCh4LCB5LCB6KSBJTklUX0RFTEFZRURfV09SSyh4LCB5KQogCkBAIC00ODIsOSArNDY1LDYgQEAKICNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgogCiAjZGVmaW5lIE1BWF9JRV9MRU4gIDB4ZmYKLSNkZWZpbmUgUlRfQVNTRVJUX1JFVChfRXhwKSBkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgUlRfQVNTRVJUX1JFVF9WQUxVRShfRXhwLCBSZXQpCQlcCi0JZG8ge30gd2hpbGUgKDApCiAKIHN0cnVjdCBpZWVlX3BhcmFtIHsKIAl1MzIgY21kOwpAQCAtNTI1LDE3ICs1MDUsMTcgQEAKICNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKICNlbmRpZgogCi0jZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKICNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnNsICBtc2xlZXBfaW50ZXJydXB0aWJsZQogCiAjZGVmaW5lIFJUTExJQl9EQVRBX0xFTgkJMjMwNAogLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgotICAgNi4yLjEuMS4yLgotCi0gICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgotICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcwotICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCi0gICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKyAqIDYuMi4xLjEuMi4KKyAqCisgKiBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICogYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICogcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgKiBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykKKyAqLwogI2RlZmluZSBSVExMSUJfMUFERFJfTEVOIDEwCiAjZGVmaW5lIFJUTExJQl8yQUREUl9MRU4gMTYKICNkZWZpbmUgUlRMTElCXzNBRERSX0xFTiAyNApAQCAtNzExLDIwICs2OTEsMTMgQEAKICNkZWZpbmUgUlRMTElCX0RFQlVHX0RBVEEobGV2ZWwsIGRhdGEsIGRhdGFsZW4pCVwKIAlkbyB7CQkJCQkJCVwKIAkJaWYgKChydGxsaWJfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSA9PSAobGV2ZWwpKSB7CVwKLQkJCWludCBpOwkJCQkJXAotCQkJdTggKnBkYXRhID0gKHU4ICopZGF0YTsJCQlcCiAJCQlwcmludGsoS0VSTl9ERUJVRyAicnRsbGliOiAlcygpXG4iLCBfX2Z1bmNfXyk7CVwKLQkJCWZvciAoaSA9IDA7IGkgPCAoaW50KShkYXRhbGVuKTsgaSsrKQl7CVwKLQkJCQlwcmludGsoIiUyLjJ4ICIsIHBkYXRhW2ldKTsJCVwKLQkJCQlpZiAoKGkrMSklMTYgPT0gMCkJCQlcCi0JCQkJCXByaW50aygiXG4iKTsJXAotCQkJfQkJCQlcCi0JCQlwcmludGsoIlxuIik7CQkJXAorCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoS0VSTl9ERUJVRywgRFVNUF9QUkVGSVhfTk9ORSwgXAorCQkJCQkgICAgIGRhdGEsIGRhdGFsZW4pOyBcCiAJCX0JCQkJCVwKIAl9IHdoaWxlICgwKQogCi0vKgotICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisvKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKICAqCiAgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCiAgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CkBAIC03NDMsOCArNzE2LDYgQEAKICAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKICAqCiAgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCi0gKgotICoKICAqLwogCiAjZGVmaW5lIFJUTExJQl9ETF9JTkZPCSAgKDE8PDApCkBAIC03NjksOCArNzQwLDggQEAKICNkZWZpbmUgUlRMTElCX0RMX1RSQUNFCSAgICgxPDwyOSkKICNkZWZpbmUgUlRMTElCX0RMX0RBVEEJICAgKDE8PDMwKQogI2RlZmluZSBSVExMSUJfRExfRVJSCSAgICgxPDwzMSkKLSNkZWZpbmUgUlRMTElCX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAicnRsbGliOiAiIGYsICMjIGEpCi0jZGVmaW5lIFJUTExJQl9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgInJ0bGxpYjogIiBmLCAjIyBhKQorI2RlZmluZSBSVExMSUJfRVJST1IoZiwgYS4uLikgcHJfZXJyKCJydGxsaWI6ICIgZiwgIyMgYSkKKyNkZWZpbmUgUlRMTElCX1dBUk5JTkcoZiwgYS4uLikgcHJfd2FybigicnRsbGliOiAiIGYsICMjIGEpCiAjZGVmaW5lIFJUTExJQl9ERUJVR19JTkZPKGYsIGEuLi4pICAgUlRMTElCX0RFQlVHKFJUTExJQl9ETF9JTkZPLCBmLCAjIyBhKQogCiAjZGVmaW5lIFJUTExJQl9ERUJVR19XWChmLCBhLi4uKSAgICAgUlRMTElCX0RFQlVHKFJUTExJQl9ETF9XWCwgZiwgIyMgYSkKQEAgLTc4NCwyNiArNzU1LDYgQEAKICNkZWZpbmUgUlRMTElCX0RFQlVHX1JYKGYsIGEuLi4pICBSVExMSUJfREVCVUcoUlRMTElCX0RMX1JYLCBmLCAjIyBhKQogI2RlZmluZSBSVExMSUJfREVCVUdfUU9TKGYsIGEuLi4pICBSVExMSUJfREVCVUcoUlRMTElCX0RMX1FPUywgZiwgIyMgYSkKIAotLyogQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMjIuICovCi0jZGVmaW5lIE1BWF9TVFJfTEVOICAgICA2NAotLyogSSB3YW50IHRvIHNlZSBBU0NJSSAzMyB0byAxMjYgb25seS4gT3RoZXJ3aXNlLCBJIHByaW50ICc/Jy4gKi8KLSNkZWZpbmUgUFJJTlRBQkxFKF9jaCkgIChfY2ggPiAnIScgJiYgX2NoIDwgJ34nKQotI2RlZmluZSBSVExMSUJfUFJJTlRfU1RSKF9Db21wLCBfVGl0bGVTdHJpbmcsIF9QdHIsIF9MZW4pCQlcCi0JaWYgKChfQ29tcCkgJiBsZXZlbCkgewkJCQkJICAgICAgIFwKLQkJaW50CSAgICAgX19pOwkJCQkgICAgXAotCQl1OCAgc3RydWN0IGJ1ZmZlcltNQVhfU1RSX0xFTl07CQkJCVwKLQkJaW50IGxlbmd0aCA9IChfTGVuIDwgTUFYX1NUUl9MRU4pID8gX0xlbiA6IChNQVhfU1RSX0xFTi0xKSA7XAotCQltZW1zZXQoc3RydWN0IGJ1ZmZlciwgMCwgTUFYX1NUUl9MRU4pOwkJXAotCQltZW1jcHkoc3RydWN0IGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoKTsJCVwKLQkJZm9yIChfX2kgPSAwOyBfX2kgPCBNQVhfU1RSX0xFTjsgX19pKyspIHsJCVwKLQkJCWlmICghUFJJTlRBQkxFKHN0cnVjdCBidWZmZXJbX19pXSkpCQlcCi0JCQkJc3RydWN0IGJ1ZmZlcltfX2ldID0gJz8nOwkJXAotCQl9CQkJCQkJCVwKLQkJc3RydWN0IGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsJCQkJXAotCQlwcmludGsoS0VSTl9JTkZPICJSdGw4MTl4OiAiKTsJCQkJXAotCQlwcmludGsoX1RpdGxlU3RyaW5nKTsJCQkJCVwKLQkJcHJpbnRrKCI6ICVkLCA8JXM+XG4iLCBfTGVuLCBzdHJ1Y3QgYnVmZmVyKTsJCVwKLQl9CiAjaWZuZGVmIEVUSF9QX1BBRQogI2RlZmluZSBFVEhfUF9QQUUgMHg4ODhFIC8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCiAjZGVmaW5lIEVUSF9QX0lQCTB4MDgwMAkJLyogSW50ZXJuZXQgUHJvdG9jb2wgcGFja2V0CSovCkBAIC0xMDIyLDcgKzk3Myw4IEBACiAvKiBJRUVFIDgwMi4xMSByZXF1aXJlcyB0aGF0IFNUQSBzdXBwb3J0cyBjb25jdXJyZW50IHJlY2VwdGlvbiBvZiBhdCBsZWFzdAogICogdGhyZWUgZnJhZ21lbnRlZCBmcmFtZXMuIFRoaXMgZGVmaW5lIGNhbiBiZSBpbmNyZWFzZWQgdG8gc3VwcG9ydCBtb3JlCiAgKiBjb25jdXJyZW50IGZyYW1lcywgYnV0IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGVhY2ggZW50cnkgY2FuIGNvbnN1bWUgYWJvdXQKLSAqIDIga0Igb2YgUkFNIGFuZCBpbmNyZWFzaW5nIGNhY2hlIHNpemUgd2lsbCBzbG93IGRvd24gZnJhbWUgcmVhc3NlbWJseS4gKi8KKyAqIDIga0Igb2YgUkFNIGFuZCBpbmNyZWFzaW5nIGNhY2hlIHNpemUgd2lsbCBzbG93IGRvd24gZnJhbWUgcmVhc3NlbWJseS4KKyAqLwogI2RlZmluZSBSVExMSUJfRlJBR19DQUNIRV9MRU4gNAogCiBzdHJ1Y3QgcnRsbGliX2ZyYWdfZW50cnkgewpAQCAtMTEwMCwxNiArMTA1MiwxNSBAQAogfSBfX3BhY2tlZDsKIAogCi0vKgotIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKLSAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8Ci0gICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKLURlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIGZyYW1lICB8ICBmY3MgfAotICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfAkgfAkgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAotICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi1Ub3RhbDogMjgtMjM0MCBieXRlcwotKi8KKy8qIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKyAqICAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8CisgKiAgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKKyAqIERlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIGZyYW1lICB8ICBmY3MgfAorICogICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfCAgICAgICAgIHwgICAgICAgICB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgKiAgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAqIFRvdGFsOiAyOC0yMzQwIGJ5dGVzCisgKi8KIAogLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCiBlbnVtIHJ0bGxpYl9tZmllIHsKQEAgLTExNDcsNyArMTA5OCw4IEBACiAKIC8qIE1pbmltYWwgaGVhZGVyOyBjYW4gYmUgdXNlZCBmb3IgcGFzc2luZyA4MDIuMTEgZnJhbWVzIHdpdGggc3VmZmljaWVudAogICogaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB1bmRlcmx5aW5nIGRhdGEgdHlwZSBpcyBhY3R1YWxseQotICogc3RvcmVkIGluIHRoZSBkYXRhLiAqLworICogc3RvcmVkIGluIHRoZSBkYXRhLgorICovCiBzdHJ1Y3QgcnRsbGliX3BzcG9sbF9oZHIgewogCV9fbGUxNiBmcmFtZV9jdGw7CiAJX19sZTE2IGFpZDsKQEAgLTEyNTcsNyArMTIwOSw4IEBACiAJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKIAlfX2xlMTYgY2FwYWJpbGl0eTsKIAkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIEZIIHBhcmFtcywgRFMgcGFyYW1zLAotCSAqIENGIHBhcmFtcywgSUJTUyBwYXJhbXMsIFRJTSAoaWYgYmVhY29uKSwgUlNOICovCisJICogQ0YgcGFyYW1zLCBJQlNTIHBhcmFtcywgVElNIChpZiBiZWFjb24pLCBSU04KKwkgKi8KIAlzdHJ1Y3QgcnRsbGliX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07CiB9IF9fcGFja2VkOwogCkBAIC0xMzMyLDcgKzEyODUsOCBAQAogLyogTUFYX1JBVEVTX0xFTkdUSCBuZWVkcyB0byBiZSAxMi4gIFRoZSBzcGVjIHNheXMgOCwgYW5kIG1hbnkgQVBzCiAgKiBvbmx5IHVzZSA4LCBhbmQgdGhlbiB1c2UgZXh0ZW5kZWQgcmF0ZXMgZm9yIHRoZSByZW1haW5pbmcgc3VwcG9ydGVkCiAgKiByYXRlcy4gIE90aGVyIEFQcywgaG93ZXZlciwgc3RpY2sgYWxsIG9mIHRoZWlyIHN1cHBvcnRlZCByYXRlcyBvbiB0aGUKLSAqIG1haW4gcmF0ZXMgaW5mb3JtYXRpb24gZWxlbWVudC4uLiAqLworICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uCisgKi8KICNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSAkJICAoKHU4KTEyKQogI2RlZmluZSBNQVhfUkFURVNfRVhfTEVOR1RICSAgICAgICAoKHU4KTE2KQogI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVAkJICA5NgpAQCAtMTUxOSwyMiArMTQ3MywyMSBAQAogCXU4IGxlbjsKIH0gX19wYWNrZWQ7CiAKLS8qCi0gKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKKy8qIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cwogICoKLQl1MTYgYXV0aF9hbGdvcml0aG07Ci0JdTE2IGF1dGhfc2VxdWVuY2U7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKLQl1MTYgY2FwYWJpbGl0eTsKLQl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKLQl1MTYgbGlzdGVuX2ludGVydmFsOwotCXN0cnVjdCB7Ci0JCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKLQl9IF9fcGFja2VkOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCXUxNiByZWFzb247Ci0JdTE2IHN0YXR1czsKLSovCisgKiB1MTYgYXV0aF9hbGdvcml0aG07CisgKiB1MTYgYXV0aF9zZXF1ZW5jZTsKKyAqIHUxNiBiZWFjb25faW50ZXJ2YWw7CisgKiB1MTYgY2FwYWJpbGl0eTsKKyAqIHU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworICogdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKyAqIHN0cnVjdCB7CisgKiAgIHUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKyAqIH0gX19wYWNrZWQ7CisgKiB1MzIgdGltZV9zdGFtcFsyXTsKKyAqIHUxNiByZWFzb247CisgKiB1MTYgc3RhdHVzOworICovCiAKICNkZWZpbmUgUlRMTElCX0RFRkFVTFRfVFhfRVNTSUQgIlBlbmd1aW4iCiAjZGVmaW5lIFJUTExJQl9ERUZBVUxUX0JBU0lDX1JBVEUgMgpAQCAtMTY3MCw3ICsxNjIzLDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCi0jaWYgMQogZW51bSBydGxsaWJfc3RhdGUgewogCiAJLyogdGhlIGNhcmQgaXMgbm90IGxpbmtlZCBhdCBhbGwgKi8KQEAgLTE3MDgsMTcgKzE2NjAsNiBAQAogCSAqLwogCVJUTExJQl9MSU5LRURfU0NBTk5JTkcsCiB9OwotI2Vsc2UKLWVudW0gcnRsbGliX3N0YXRlIHsKLQlSVExMSUJfVU5JTklUSUFMSVpFRCA9IDAsCi0JUlRMTElCX0lOSVRJQUxJWkVELAotCVJUTExJQl9BU1NPQ0lBVElORywKLQlSVExMSUJfQVNTT0NJQVRFRCwKLQlSVExMSUJfQVVUSEVOVElDQVRJTkcsCi0JUlRMTElCX0FVVEhFTlRJQ0FURUQsCi0JUlRMTElCX1NIVVRET1dOCi19OwotI2VuZGlmCiAKICNkZWZpbmUgREVGQVVMVF9NQVhfU0NBTl9BR0UgKDE1ICogSFopCiAjZGVmaW5lIERFRkFVTFRfRlRTIDIzNDYKQEAgLTE3MzYsMTEgKzE2NzcsNiBAQAogI2RlZmluZSBSVExMSUJfNTJHSFpfTUFYX0NIQU5ORUwgMTY1CiAjZGVmaW5lIFJUTExJQl81MkdIWl9DSEFOTkVMUyAoUlRMTElCXzUyR0haX01BWF9DSEFOTkVMIC0gXAogCQkJCSAgUlRMTElCXzUyR0haX01JTl9DSEFOTkVMICsgMSkKLSNpZm5kZWYgZXFNYWNBZGRyCi0jZGVmaW5lIGVxTWFjQWRkcihhLCBiKQkJCQkJXAotCSgoKGEpWzBdID09IChiKVswXSAmJiAoYSlbMV0gPT0gKGIpWzFdICYmIChhKVsyXSA9PSAoYilbMl0gJiYJXAotCShhKVszXSA9PSAoYilbM10gJiYgKGEpWzRdID09IChiKVs0XSAmJiAoYSlbNV0gPT0gKGIpWzVdKSA/IDEgOiAwKQotI2VuZGlmCiBzdHJ1Y3QgdHhfcGVuZGluZyB7CiAJaW50IGZyYWc7CiAJc3RydWN0IHJ0bGxpYl90eGIgKnR4YjsKQEAgLTIxNDksMTQgKzIwODUsMTYgQEAKIAlzcGlubG9ja190IHdwYXhfc3VpdGxpc3RfbG9jazsKIAogCWludCB0eF9oZWFkcm9vbTsgLyogU2V0IHRvIHNpemUgb2YgYW55IGFkZGl0aW9uYWwgcm9vbSBuZWVkZWQgYXQgZnJvbnQKLQkJCSAgKiBvZiBhbGxvY2F0ZWQgVHggU0tCcyAqLworCQkJICAqIG9mIGFsbG9jYXRlZCBUeCBTS0JzCisJCQkgICovCiAJdTMyIGNvbmZpZzsKIAogCS8qIFdFUCBhbmQgb3RoZXIgZW5jcnlwdGlvbiByZWxhdGVkIHNldHRpbmdzIGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KIAlpbnQgb3Blbl93ZXA7IC8qIFNldCB0byAxIHRvIGFsbG93IHVuZW5jcnlwdGVkIGZyYW1lcyAqLwogCWludCBhdXRoX21vZGU7CiAJaW50IHJlc2V0X29uX2tleWNoYW5nZTsgLyogU2V0IHRvIDEgaWYgdGhlIEhXIG5lZWRzIHRvIGJlIHJlc2V0IG9uCi0JCQkJICogV0VQIGtleSBjaGFuZ2VzICovCisJCQkJICogV0VQIGtleSBjaGFuZ2VzCisJCQkJICovCiAKIAkvKiBJZiB0aGUgaG9zdCBwZXJmb3JtcyB7ZW4sZGV9Y3J5cHRpb24sIHRoZW4gc2V0IHRvIDEgKi8KIAlpbnQgaG9zdF9lbmNyeXB0OwpAQCAtMjI3Niw3ICsyMjE0LDcgQEAKIAlzaG9ydCByYXdfdHg7CiAJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCiAJc2hvcnQgcXVldWVfc3RvcDsKLQlzaG9ydCBzY2FubmluZ19jb250aW51ZSA7CisJc2hvcnQgc2Nhbm5pbmdfY29udGludWU7CiAJc2hvcnQgcHJvdG9fc3RhcnRlZDsKIAlzaG9ydCBwcm90b19zdG9wcHBpbmc7CiAKQEAgLTI0MjYsNyArMjM2NCw3IEBACiAJLyogT0sgdGhpcyBpcyBjb21wbGVtZW50aW5nIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KIAl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLQkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvLgogCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLiB0aGUgZHJpdmVyIHNob3VsZCBlbnN1cmUKIAkgKiB0aGUgcmFkaW8gaGFzIGJlZW4gc3dpdGNoZWQgYmVmb3JlIHJldHVybi4KIAkgKi8KQEAgLTI1MjAsNyArMjQ1OCw4IEBACiAJdm9pZCAoKnJ0bGxpYl9yZmtpbGxfcG9sbCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIAkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgZGF0YQotCSAqIGFsbG9jYXRlZCBiZXlvbmQgdGhpcyBzdHJ1Y3R1cmUgYnkgYWxsb2NfcnRsbGliICovCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19ydGxsaWIKKwkgKi8KIAl1OCBwcml2WzBdOwogfTsKIApAQCAtMjU0OSw3ICsyNDg4LDggQEAKIAogLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2UgdGhlIG5ldGlmIHF1ZXVlCiAgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQotICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuCisgKi8KICNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQogCiAvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKQEAgLTI1ODYsMTEgKzI1MjYsOSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBydGxsaWJfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCiB7Ci0JLyoKLQkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkvKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKIAkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCiAJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcwotCSAqCiAJICovCiAJaWYgKChtb2RlICYgSUVFRV9BKSAmJgogCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIFJUTExJQl9PRkRNX01PRFVMQVRJT04pICYmCkBAIC0yODgyLDggKzI4MjAsNiBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CiAjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKLWV4dGVybiB2b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTggKkNhcElFLCB1OCAqVGl0bGVTdHJpbmcpOwotZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUSW5mbyh1OCAqSW5mb0lFLCB1OCAqVGl0bGVTdHJpbmcpOwogCiB2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKIAkJCWVudW0gaHRfY2hhbm5lbF93aWR0aCBCYW5kd2lkdGgsCkBAIC0yOTA2LDExICsyODQyLDEwIEBACiBleHRlcm4gdTggSFRHZXRIaWdoZXN0TUNTUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKnBNQ1NSYXRlU2V0LAogCQkJICAgICAgdTggKnBNQ1NGaWx0ZXIpOwogZXh0ZXJuIHU4IE1DU19GSUxURVJfQUxMW107Ci1leHRlcm4gdTE2IE1DU19EQVRBX1JBVEVbMl1bMl1bNzddIDsKK2V4dGVybiB1MTYgTUNTX0RBVEFfUkFURVsyXVsyXVs3N107CiBleHRlcm4gdTggSFRDQ2hlY2soc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICpwRnJhbWUpOwogZXh0ZXJuIHZvaWQgSFRSZXNldElPVFNldHRpbmcoc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8pOwogZXh0ZXJuIGJvb2wgSXNIVEhhbGZObW9kZUFQcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7Ci1leHRlcm4gdTE2IEhUSGFsZk1jc1RvRGF0YVJhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG5NY3NSYXRlKTsKIGV4dGVybiB1MTYgSFRNY3NUb0RhdGFSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBuTWNzUmF0ZSk7CiBleHRlcm4gdTE2ICBUeENvdW50VG9EYXRhUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggbkRhdGFSYXRlKTsKIGV4dGVybiBpbnQgcnRsbGliX3J4X0FEREJBUmVxKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHQuYwppbmRleCA2MGMwY2VkLi4xZTZhZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5jCkBAIC02Miw4ICs2Miw5IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoaW5mby0+bG9jaywgZmxhZ3MpOwogCXJ0bGxpYl9jcnlwdF9kZWluaXRfZW50cmllcyhpbmZvLCAwKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmluZm8tPmNyeXB0X2RlaW5pdF9saXN0KSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudHJpZXMgcmVtYWluaW5nIGluIGRlbGF5ZWQgY3J5cHQgIgotCQkgICAgICAgImRlbGV0aW9uIGxpc3RcbiIsIGluZm8tPm5hbWUpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiBlbnRyaWVzIHJlbWFpbmluZyBpbiBkZWxheWVkIGNyeXB0IGRlbGV0aW9uIGxpc3RcbiIsCisJCSAgICAgICBpbmZvLT5uYW1lKTsKIAkJaW5mby0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CiAJCWFkZF90aW1lcigmaW5mby0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKIAl9CkBAIC04Niw3ICs4Nyw4IEBACiAKIAkvKiBtdXN0IG5vdCBydW4gb3BzLT5kZWluaXQoKSB3aGlsZSB0aGVyZSBtYXkgYmUgcGVuZGluZyBlbmNyeXB0IG9yCiAJICogZGVjcnlwdCBvcGVyYXRpb25zLiBVc2UgYSBsaXN0IG9mIGRlbGF5ZWQgZGVpbml0cyB0byBhdm9pZCBuZWVkaW5nCi0JICogbG9ja2luZy4gKi8KKwkgKiBsb2NraW5nLgorCSAqLwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoaW5mby0+bG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkKCZ0bXAtPmxpc3QsICZpbmZvLT5jcnlwdF9kZWluaXRfbGlzdCk7CkBAIC0xNDUsOCArMTQ3LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChkZWxfYWxnKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgotCQkgICAgICAgIiclcydcbiIsIG9wcy0+bmFtZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gJyVzJ1xuIiwKKwkJICAgICAgIG9wcy0+bmFtZSk7CiAJCWtmcmVlKGRlbF9hbGcpOwogCX0KIApAQCAtMjM3LDggKzIzOSw5IEBACiAJCXN0cnVjdCBydGxsaWJfY3J5cHRvX2FsZyAqYWxnID0KIAkJCShzdHJ1Y3QgcnRsbGliX2NyeXB0b19hbGcgKikgcHRyOwogCQlsaXN0X2RlbChwdHIpOwotCQlwcmludGsoS0VSTl9ERUJVRyAicnRsbGliX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKLQkJICAgICAgICInJXMnIChkZWluaXQpXG4iLCBhbGctPm9wcy0+bmFtZSk7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAicnRsbGliX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICclcycgKGRlaW5pdClcbiIsCisJCSAgICAgICBhbGctPm9wcy0+bmFtZSk7CiAJCWtmcmVlKGFsZyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0LmgKaW5kZXggZTE3N2M5Mi4uYjhjZjU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHQuaApAQCAtMTcsOCArMTcsNyBAQAogICogbW9yZSBkZXRhaWxzLgogICovCiAKLS8qCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBydGxsaWIgY3J5cHRvIG1vZHVsZS4KKy8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHJ0bGxpYiBjcnlwdG8gbW9kdWxlLgogICovCiAjaWZuZGVmIFJUTExJQl9DUllQVF9ICiAjZGVmaW5lIFJUTExJQl9DUllQVF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfY2NtcC5jCmluZGV4IDAxZjg1ZGIuLjdkNDg2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfY2NtcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfY2NtcC5jCkBAIC02OSw4ICs2OSw3IEBACiAKIAlwcml2LT50Zm0gPSAodm9pZCAqKWNyeXB0b19hbGxvY19jaXBoZXIoImFlcyIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+dGZtKSkgewotCQlwcl9kZWJ1ZygicnRsbGliX2NyeXB0X2NjbXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCSAgICAgICAiY3J5cHRvIEFQSSBhZXNcbiIpOworCQlwcl9kZWJ1ZygicnRsbGliX2NyeXB0X2NjbXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjcnlwdG8gQVBJIGFlc1xuIik7CiAJCXByaXYtPnRmbSA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0xMjEsMTAgKzEyMCw3IEBACiAJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CiAJYTRfaW5jbHVkZWQgPSAoKGZjICYgKFJUTExJQl9GQ1RMX1RPRFMgfCBSVExMSUJfRkNUTF9GUk9NRFMpKSA9PQogCQkgICAgICAgKFJUTExJQl9GQ1RMX1RPRFMgfCBSVExMSUJfRkNUTF9GUk9NRFMpKTsKLQkvKgotCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBSVExMSUJfRlRZUEVfREFUQSkgJiYKLQkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDA4KSk7Ci0JKi8KKwogCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBSVExMSUJfRlRZUEVfREFUQSkgJiYKIAkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDgwKSk7CiAJYWFkX2xlbiA9IDIyOwpAQCAtMTQxLDcgKzEzNyw4IEBACiAJICogRmxhZyAoSW5jbHVkZSBhdXRoZW50aWNhdGlvbiBoZWFkZXIsIE09MyAoOC1vY3RldCBNSUMpLAogCSAqICAgICAgIEw9MSAoMi1vY3RldCBEbGVuKSkKIAkgKiBOb25jZTogMHgwMCB8IEEyIHwgUE4KLQkgKiBEbGVuICovCisJICogRGxlbgorCSAqLwogCWIwWzBdID0gMHg1OTsKIAliMFsxXSA9IHFjOwogCW1lbWNweShiMCArIDIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKQEAgLTI3OCwyMyArMjc1LDIyIEBACiAJa2V5aWR4ID0gcG9zWzNdOwogCWlmICghKGtleWlkeCAmICgxIDw8IDUpKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7Ci0JCQlwcl9kZWJ1ZygiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IHdpdGhvdXQgRXh0SVYiCi0JCQkgICAgICAgIiBmbGFnIGZyb20gJXBNXG4iLCBoZHItPmFkZHIyKTsKKwkJCXByX2RlYnVnKCJDQ01QOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViBmbGFnIGZyb20gJXBNXG4iLAorCQkJCSBoZHItPmFkZHIyKTsKIAkJfQogCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycysrOwogCQlyZXR1cm4gLTI7CiAJfQogCWtleWlkeCA+Pj0gNjsKIAlpZiAoa2V5LT5rZXlfaWR4ICE9IGtleWlkeCkgewotCQlwcl9kZWJ1ZygiQ0NNUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSAiCi0JCSAgICAgICAia2V5aWR4PSVkIHByaXY9JXBcbiIsIGtleS0+a2V5X2lkeCwga2V5aWR4LCBwcml2KTsKKwkJcHJfZGVidWcoIkNDTVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUga2V5aWR4PSVkIHByaXY9JXBcbiIsCisJCQkga2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOwogCQlyZXR1cm4gLTY7CiAJfQogCWlmICgha2V5LT5rZXlfc2V0KSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByX2RlYnVnKCJDQ01QOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAlcE0iCi0JCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCi0JCQkgICAgICAgIiBrZXlcbiIsIGhkci0+YWRkcjIsIGtleWlkeCk7CisJCQlwcl9kZWJ1ZygiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gJXBNIHdpdGgga2V5aWQ9JWQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29uZmlndXJlZCBrZXlcbiIsCisJCQkJIGhkci0+YWRkcjIsIGtleWlkeCk7CiAJCX0KIAkJcmV0dXJuIC0zOwogCX0KQEAgLTM0MSw4ICszMzcsOCBAQAogCiAJCWlmIChtZW1jbXAobWljLCBhLCBDQ01QX01JQ19MRU4pICE9IDApIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCQlwcl9kZWJ1ZygiQ0NNUDogZGVjcnlwdCBmYWlsZWQ6IFNUQT0iCi0JCQkJIiAlcE1cbiIsIGhkci0+YWRkcjIpOworCQkJCXByX2RlYnVnKCJDQ01QOiBkZWNyeXB0IGZhaWxlZDogU1RBPSAlcE1cbiIsCisJCQkJCSBoZHItPmFkZHIyKTsKIAkJCX0KIAkJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9ycysrOwogCQkJcmV0dXJuIC01OwpAQCAtNDE5LDkgKzQxNSw3IEBACiAJc3RydWN0IHJ0bGxpYl9jY21wX2RhdGEgKmNjbXAgPSBwcml2OwogCiAJc2VxX3ByaW50ZihtLAotCQkgICAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkICIKLQkJICAgInR4X3BuPSVwTSByeF9wbj0lcE0gIgotCQkgICAiZm9ybWF0X2Vycm9ycz0lZCByZXBsYXlzPSVkIGRlY3J5cHRfZXJyb3JzPSVkXG4iLAorCQkgICAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkIHR4X3BuPSVwTSByeF9wbj0lcE0gZm9ybWF0X2Vycm9ycz0lZCByZXBsYXlzPSVkIGRlY3J5cHRfZXJyb3JzPSVkXG4iLAogCQkgICBjY21wLT5rZXlfaWR4LCBjY21wLT5rZXlfc2V0LAogCQkgICBjY21wLT50eF9wbiwgY2NtcC0+cnhfcG4sCiAJCSAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF90a2lwLmMKaW5kZXggNzhkYjJiNi4uNjU2YjRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF90a2lwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF90a2lwLmMKQEAgLTY2LDggKzY2LDggQEAKIAlwcml2LT50eF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsCiAJCQlDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9hcmM0KSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicnRsbGliX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCQkJImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAicnRsbGliX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjcnlwdG8gQVBJIGFyYzRcbiIpOwogCQlwcml2LT50eF90Zm1fYXJjNCA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC03NSw4ICs3NSw4IEBACiAJcHJpdi0+dHhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAogCQkJQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT50eF90Zm1fbWljaGFlbCkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgotCQkJCSJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJydGxsaWJfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOwogCQlwcml2LT50eF90Zm1fbWljaGFlbCA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC04NCw4ICs4NCw4IEBACiAJcHJpdi0+cnhfdGZtX2FyYzQgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLAogCQkJQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fYXJjNCkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgotCQkJCSJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgInJ0bGxpYl9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvIEFQSSBhcmM0XG4iKTsKIAkJcHJpdi0+cnhfdGZtX2FyYzQgPSBOVUxMOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtOTMsOCArOTMsOCBAQAogCXByaXYtPnJ4X3RmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX2hhc2goIm1pY2hhZWxfbWljIiwgMCwKIAkJCUNSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+cnhfdGZtX21pY2hhZWwpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKLQkJCQkiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAicnRsbGliX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKIAkJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBOVUxMOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjQ5LDcgKzI0OSw4IEBACiAJCQkgICAgICAgdTE2IElWMTYpCiB7CiAJLyogTWFrZSB0ZW1wb3JhcnkgYXJlYSBvdmVybGFwIFdFUCBzZWVkIHNvIHRoYXQgdGhlIGZpbmFsIGNvcHkgY2FuIGJlCi0JICogYXZvaWRlZCBvbiBsaXR0bGUgZW5kaWFuIGhvc3RzLiAqLworCSAqIGF2b2lkZWQgb24gbGl0dGxlIGVuZGlhbiBob3N0cy4KKwkgKi8KIAl1MTYgKlBQSyA9ICh1MTYgKikgJldFUFNlZWRbNF07CiAKIAkvKiBTdGVwIDEgLSBtYWtlIGNvcHkgb2YgVFRBSyBhbmQgYnJpbmcgaW4gVFNDICovCkBAIC0yNzYsNyArMjc3LDggQEAKIAlQUEtbNV0gKz0gUm90UjEoUFBLWzRdKTsKIAogCS8qIFN0ZXAgMyAtIGJyaW5nIGluIGxhc3Qgb2YgVEsgYml0cywgYXNzaWduIDI0LWJpdCBXRVAgSVYgdmFsdWUKLQkgKiBXRVBTZWVkWzAuLjJdIGlzIHRyYW5zbWl0dGVkIGFzIFdFUCBJViAqLworCSAqIFdFUFNlZWRbMC4uMl0gaXMgdHJhbnNtaXR0ZWQgYXMgV0VQIElWCisJICovCiAJV0VQU2VlZFswXSA9IEhpOChJVjE2KTsKIAlXRVBTZWVkWzFdID0gKEhpOChJVjE2KSB8IDB4MjApICYgMHg3RjsKIAlXRVBTZWVkWzJdID0gTG84KElWMTYpOwpAQCAtMzk5LDIyICs0MDEsMjQgQEAKIAlrZXlpZHggPSBwb3NbM107CiAJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKLQkJCSAgICAgICAiIGZsYWcgZnJvbSAlcE1cbiIsIGhkci0+YWRkcjIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiVEtJUDogcmVjZWl2ZWQgcGFja2V0IHdpdGhvdXQgRXh0SVYgZmxhZyBmcm9tICVwTVxuIiwKKwkJCSAgICAgICBoZHItPmFkZHIyKTsKIAkJfQogCQlyZXR1cm4gLTI7CiAJfQogCWtleWlkeCA+Pj0gNjsKIAlpZiAodGtleS0+a2V5X2lkeCAhPSBrZXlpZHgpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUgIgotCQkgICAgICAgImtleWlkeD0lZCBwcml2PSVwXG4iLCB0a2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIlRLSVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUga2V5aWR4PSVkIHByaXY9JXBcbiIsCisJCSAgICAgICB0a2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOwogCQlyZXR1cm4gLTY7CiAJfQogCWlmICghdGtleS0+a2V5X3NldCkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gJXBNIgotCQkJICAgICAgICIgd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIgotCQkJICAgICAgICIga2V5XG4iLCBoZHItPmFkZHIyLCBrZXlpZHgpOworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiVEtJUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gJXBNIHdpdGgga2V5aWQ9JWQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29uZmlndXJlZCBrZXlcbiIsCisJCQkgICAgICAgaGRyLT5hZGRyMiwga2V5aWR4KTsKIAkJfQogCQlyZXR1cm4gLTM7CiAJfQpAQCAtNDI3LDEwICs0MzEsMTAgQEAKIAkJICAgIChpdjMyID09IHRrZXktPnJ4X2l2MzIgJiYgaXYxNiA8PSB0a2V5LT5yeF9pdjE2KSkgJiYKIAkJICAgIHRrZXktPmluaXRpYWxpemVkKSB7CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIKLQkJCQkgICAgICAgIiAlcE0gcHJldmlvdXMgVFNDICUwOHglMDR4IHJlY2VpdmVkICIKLQkJCQkgICAgICAiVFNDICUwOHglMDR4XG4iLCBoZHItPmFkZHIyLAotCQkJCSAgICAgIHRrZXktPnJ4X2l2MzIsIHRrZXktPnJ4X2l2MTYsIGl2MzIsIGl2MTYpOworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICJUS0lQOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0gJXBNIHByZXZpb3VzIFRTQyAlMDh4JTA0eCByZWNlaXZlZCBUU0MgJTA4eCUwNHhcbiIsCisJCQkJICAgICAgIGhkci0+YWRkcjIsIHRrZXktPnJ4X2l2MzIsIHRrZXktPnJ4X2l2MTYsCisJCQkJICAgICAgIGl2MzIsIGl2MTYpOwogCQkJfQogCQkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5cysrOwogCQkJcmV0dXJuIC00OwpAQCAtNDUxLDggKzQ1NSw4IEBACiAJCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRrZXktPnJ4X3RmbV9hcmM0LCByYzRrZXksIDE2KTsKIAkJaWYgKGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgJnNnLCAmc2csIHBsZW4gKyA0KSkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICI6IFRLSVA6IGZhaWxlZCB0byBkZWNyeXB0ICIKLQkJCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICVwTVxuIiwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiOiBUS0lQOiBmYWlsZWQgdG8gZGVjcnlwdCByZWNlaXZlZCBwYWNrZXQgZnJvbSAlcE1cbiIsCiAJCQkJICAgICAgIGhkci0+YWRkcjIpOwogCQkJfQogCQkJcmV0dXJuIC03OwpAQCAtNDY4LDEyICs0NzIsMTQgQEAKIAkJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIpIHsKIAkJCQkvKiBQcmV2aW91c2x5IGNhY2hlZCBQaGFzZTEgcmVzdWx0IHdhcyBhbHJlYWR5CiAJCQkJICogbG9zdCwgc28gaXQgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkIGZvciB0aGUKLQkJCQkgKiBuZXh0IHBhY2tldC4gKi8KKwkJCQkgKiBuZXh0IHBhY2tldC4KKwkJCQkgKi8KIAkJCQl0a2V5LT5yeF9waGFzZTFfZG9uZSA9IDA7CiAJCQl9CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IElDViBlcnJvciBkZXRlY3RlZDogU1RBPSIKLQkJCQkiICVwTVxuIiwgaGRyLT5hZGRyMik7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIlRLSVA6IElDViBlcnJvciBkZXRlY3RlZDogU1RBPSAlcE1cbiIsCisJCQkJICAgICAgIGhkci0+YWRkcjIpOwogCQkJfQogCQkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzKys7CiAJCQlyZXR1cm4gLTU7CkBAIC00ODIsNyArNDg4LDggQEAKIAl9CiAKIAkvKiBVcGRhdGUgcmVhbCBjb3VudGVycyBvbmx5IGFmdGVyIE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBoYXMKLQkgKiBjb21wbGV0ZWQgKi8KKwkgKiBjb21wbGV0ZWQKKwkgKi8KIAl0a2V5LT5yeF9pdjMyX25ldyA9IGl2MzI7CiAJdGtleS0+cnhfaXYxNl9uZXcgPSBpdjE2OwogCkBAIC01MDIsNyArNTA5LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CiAKIAlpZiAodGZtX21pY2hhZWwgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNoYWVsX21pYzogdGZtX21pY2hhZWwgPT0gTlVMTFxuIik7CisJCXByX3dhcm4oIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlzZ19pbml0X3RhYmxlKHNnLCAyKTsKQEAgLTU1Nyw4ICs1NjQsOCBAQAogCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CiAKIAlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCA4IHx8IHNrYi0+bGVuIDwgaGRyX2xlbikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBwYWNrZXQgZm9yIE1pY2hhZWwgTUlDIGFkZCAiCi0JCSAgICAgICAiKHRhaWxyb29tPSVkIGhkcl9sZW49JWQgc2tiLT5sZW49JWQpXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIkludmFsaWQgcGFja2V0IGZvciBNaWNoYWVsIE1JQyBhZGQgKHRhaWxyb29tPSVkIGhkcl9sZW49JWQgc2tiLT5sZW49JWQpXG4iLAogCQkgICAgICAgc2tiX3RhaWxyb29tKHNrYiksIGhkcl9sZW4sIHNrYi0+bGVuKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTYyMSwxNCArNjI4LDE0IEBACiAJCXN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHI7CiAKIAkJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNaWNoYWVsIE1JQyB2ZXJpZmljYXRpb24gZmFpbGVkIGZvciAiCi0JCSAgICAgICAiTVNEVSBmcm9tICVwTSBrZXlpZHg9JWRcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yIE1TRFUgZnJvbSAlcE0ga2V5aWR4PSVkXG4iLAogCQkgICAgICAgc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICJOL0EiLCBoZHItPmFkZHIyLAogCQkgICAgICAga2V5aWR4KTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVkXG4iLAogCQkgICAgICAgbWVtY21wKG1pYywgc2tiLT5kYXRhICsgc2tiLT5sZW4gLSA4LCA4KSAhPSAwKTsKIAkJaWYgKHNrYi0+ZGV2KSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJza2ItPmRldiAhPSBOVUxMXG4iKTsKKwkJCXByX2luZm8oInNrYi0+ZGV2ICE9IE5VTExcbiIpOwogCQkJcnRsbGliX21pY2hhZWxfbWljX2ZhaWx1cmUoc2tiLT5kZXYsIGhkciwga2V5aWR4KTsKIAkJfQogCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzKys7CkBAIC02MzYsNyArNjQzLDggQEAKIAl9CiAKIAkvKiBVcGRhdGUgVFNDIGNvdW50ZXJzIGZvciBSWCBub3cgdGhhdCB0aGUgcGFja2V0IHZlcmlmaWNhdGlvbiBoYXMKLQkgKiBjb21wbGV0ZWQuICovCisJICogY29tcGxldGVkLgorCSAqLwogCXRrZXktPnJ4X2l2MzIgPSB0a2V5LT5yeF9pdjMyX25ldzsKIAl0a2V5LT5yeF9pdjE2ID0gdGtleS0+cnhfaXYxNl9uZXc7CiAKQEAgLTcxNywxMCArNzI1LDcgQEAKIAlzdHJ1Y3QgcnRsbGliX3RraXBfZGF0YSAqdGtpcCA9IHByaXY7CiAKIAlzZXFfcHJpbnRmKG0sCi0JCSAgICJrZXlbJWRdIGFsZz1US0lQIGtleV9zZXQ9JWQgIgotCQkgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJICAgInJ4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCi0JCSAgICJyZXBsYXlzPSVkIGljdl9lcnJvcnM9JWQgbG9jYWxfbWljX2ZhaWx1cmVzPSVkXG4iLAorCQkgICAia2V5WyVkXSBhbGc9VEtJUCBrZXlfc2V0PSVkIHR4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCByeF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggcmVwbGF5cz0lZCBpY3ZfZXJyb3JzPSVkIGxvY2FsX21pY19mYWlsdXJlcz0lZFxuIiwKIAkJICAgdGtpcC0+a2V5X2lkeCwgdGtpcC0+a2V5X3NldCwKIAkJICAgKHRraXAtPnR4X2l2MzIgPj4gMjQpICYgMHhmZiwKIAkJICAgKHRraXAtPnR4X2l2MzIgPj4gMTYpICYgMHhmZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3dlcC5jCmluZGV4IDc1ZTdiMDIuLjIxZDdlZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfd2VwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF93ZXAuYwpAQCAtNDQsMTUgKzQ0LDEzIEBACiAKIAlwcml2LT50eF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbSkpIHsKLQkJcHJfZGVidWcoInJ0bGxpYl9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJfZGVidWcoInJ0bGxpYl9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjcnlwdG8gQVBJIGFyYzRcbiIpOwogCQlwcml2LT50eF90Zm0gPSBOVUxMOwogCQlnb3RvIGZhaWw7CiAJfQogCXByaXYtPnJ4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+cnhfdGZtKSkgewotCQlwcl9kZWJ1ZygicnRsbGliX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKLQkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcl9kZWJ1ZygicnRsbGliX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byBBUEkgYXJjNFxuIik7CiAJCXByaXYtPnJ4X3RmbSA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0xMDgsOSArMTA2LDggQEAKIAogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDQgfHwgc2tiX3RhaWxyb29tKHNrYikgPCA0IHx8CiAJICAgIHNrYi0+bGVuIDwgaGRyX2xlbil7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3IhISEgaGVhZHJvb209JWQgdGFpbHJvb209JWQgc2tibGVuPSVkIgotCQkgICAgICAgIiBoZHJfbGVuPSVkXG4iLCBza2JfaGVhZHJvb20oc2tiKSwgc2tiX3RhaWxyb29tKHNrYiksCi0JCSAgICAgICBza2ItPmxlbiwgaGRyX2xlbik7CisJCXByX2VycigiRXJyb3IhISEgaGVhZHJvb209JWQgdGFpbHJvb209JWQgc2tibGVuPSVkIGhkcl9sZW49JWRcbiIsCisJCSAgICAgICBza2JfaGVhZHJvb20oc2tiKSwgc2tiX3RhaWxyb29tKHNrYiksIHNrYi0+bGVuLCBoZHJfbGVuKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CkBAIC0xMjQsNyArMTIxLDggQEAKIAogCS8qIEZsdWhyZXIsIE1hbnRpbiwgYW5kIFNoYW1pciBoYXZlIHJlcG9ydGVkIHdlYWtuZXNzZXMgaW4gdGhlIGtleQogCSAqIHNjaGVkdWxpbmcgYWxnb3JpdGhtIG9mIFJDNC4gQXQgbGVhc3QgSVZzIChLZXlCeXRlICsgMywgMHhmZiwgTikKLQkgKiBjYW4gYmUgdXNlZCB0byBzcGVlZHVwIGF0dGFja3MsIHNvIGF2b2lkIHVzaW5nIHRoZW0uICovCisJICogY2FuIGJlIHVzZWQgdG8gc3BlZWR1cCBhdHRhY2tzLCBzbyBhdm9pZCB1c2luZyB0aGVtLgorCSAqLwogCWlmICgod2VwLT5pdiAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB7CiAJCXU4IEIgPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2RlYnVnLmgKaW5kZXggNzUzN2RhZS4uMTE5NzI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfZGVidWcuaApAQCAtODAsOSArODAsOSBAQAogI2RlZmluZSBhc3NlcnQoZXhwcikgXAogZG8gewlcCiAJaWYgKCEoZXhwcikpIHsJCQkJICBcCi0JCXByaW50ayhLRVJOX0lORk8gIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsIFwKKwkJcHJfaW5mbygiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsbGluZT0lZFxuIiwgXAogCQkjZXhwciwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXyk7CSAgXAogCX0JXAotfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfZW5kaWFuZnJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9lbmRpYW5mcmVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODlmYTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9lbmRpYW5mcmVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotI2lmbmRlZiBfX0lOQ19FTkRJQU5GUkVFX0gKLSNkZWZpbmUgX19JTkNfRU5ESUFORlJFRV9ICi0KLS8qCi0gKglDYWxsIGVuZGlhbiBmcmVlIGZ1bmN0aW9uIHdoZW4KLSAqCQkxLiBSZWFkL3dyaXRlIHBhY2tldCBjb250ZW50LgotICoJCTIuIEJlZm9yZSB3cml0ZSBpbnRlZ2VyIHRvIElPLgotICoJCTMuIEFmdGVyIHJlYWQgaW50ZWdlciBmcm9tIElPLgotICovCi0KLSNkZWZpbmUgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4gMTIzNCAgICAvKiBMU0IgZmlyc3Q6IGkzODYsIHZheCAqLwotI2RlZmluZSBfX01BQ0hJTkVfQklHX0VORElBTiAgICA0MzIxICAgIC8qIE1TQiBmaXJzdDogNjgwMDAsIGlibSwgbmV0LCBwcGMgKi8KLQotI2RlZmluZSBCWVRFX09SREVSIF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCi0KLSNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIEVGMUJ5dGUoX3ZhbCkJCQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgRUYyQnl0ZShfdmFsKQkJCSgodTE2KShfdmFsKSkKLSNkZWZpbmUgRUY0Qnl0ZShfdmFsKQkJCSgodTMyKShfdmFsKSkKLQotI2Vsc2UKLSNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBFRjJCeXRlKF92YWwpCQkJXAotCSgoKCgodTE2KShfdmFsKSkmMHgwMGZmKTw8OCl8KCgoKHUxNikoX3ZhbCkpJjB4ZmYwMCk+PjgpKQotI2RlZmluZSBFRjRCeXRlKF92YWwpCQkJXAotCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCi0JKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KXxcCi0JKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KXxcCi0JKCgoKHUzMikoX3ZhbCkpJjB4ZmYwMDAwMDApPj4yNCkpCi0jZW5kaWYKLQotI2RlZmluZSBSZWFkRUYxQnl0ZShfcHRyKQkJRUYxQnl0ZSgqKCh1OCAqKShfcHRyKSkpCi0jZGVmaW5lIFJlYWRFRjJCeXRlKF9wdHIpCQlFRjJCeXRlKCooKHUxNiAqKShfcHRyKSkpCi0jZGVmaW5lIFJlYWRFRjRCeXRlKF9wdHIpCQlFRjRCeXRlKCooKHUzMiAqKShfcHRyKSkpCi0KLSNkZWZpbmUgV3JpdGVFRjFCeXRlKF9wdHIsIF92YWwpCSgoKigodTggKikoX3B0cikpKSA9IEVGMUJ5dGUoX3ZhbCkpCi0jZGVmaW5lIFdyaXRlRUYyQnl0ZShfcHRyLCBfdmFsKQkoKCooKHUxNiAqKShfcHRyKSkpID0gRUYyQnl0ZShfdmFsKSkKLSNkZWZpbmUgV3JpdGVFRjRCeXRlKF9wdHIsIF92YWwpCSgoKigodTMyICopKF9wdHIpKSkgPSBFRjRCeXRlKF92YWwpKQotI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLSNkZWZpbmUgSDJOMUJZVEUoX3ZhbCkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIEgyTjJCWVRFKF92YWwpCSgoKCgodTE2KShfdmFsKSkmMHgwMGZmKTw8OCl8XAotCQkJKCgoKHUxNikoX3ZhbCkpJjB4ZmYwMCk+PjgpKQotI2RlZmluZSBIMk40QllURShfdmFsKQkoKCgoKHUzMikoX3ZhbCkpJjB4MDAwMDAwZmYpPDwyNCl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4ZmYwMDAwMDApPj4yNCkpCi0jZWxzZQotI2RlZmluZSBIMk4xQllURShfdmFsKQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBIMk4yQllURShfdmFsKQkJCSgodTE2KShfdmFsKSkKLSNkZWZpbmUgSDJONEJZVEUoX3ZhbCkJCQkoKHUzMikoX3ZhbCkpCi0jZW5kaWYKLQotI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLSNkZWZpbmUgTjJIMUJZVEUoX3ZhbCkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIE4ySDJCWVRFKF92YWwpCSgoKCgodTE2KShfdmFsKSkmMHgwMGZmKTw8OCl8XAotCQkJKCgoKHUxNikoX3ZhbCkpJjB4ZmYwMCk+PjgpKQotI2RlZmluZSBOMkg0QllURShfdmFsKQkoKCgoKHUzMikoX3ZhbCkpJjB4MDAwMDAwZmYpPDwyNCl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KQl8XAotCQkJKCgoKHUzMikoX3ZhbCkpJjB4ZmYwMDAwMDApPj4yNCkpCi0jZWxzZQotI2RlZmluZSBOMkgxQllURShfdmFsKQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBOMkgyQllURShfdmFsKQkJCSgodTE2KShfdmFsKSkKLSNkZWZpbmUgTjJINEJZVEUoX3ZhbCkJCQkoKHUzMikoX3ZhbCkpCi0jZW5kaWYKLQotI2RlZmluZSBCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pICgweEZGRkZGRkZGID4+ICgzMiAtIChfX0JpdExlbikpKQotI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fQml0T2Zmc2V0LCBfX0JpdExlbikJCQlcCi0JKEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKLQotI2RlZmluZSBMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BTdGFydCkgKEVGNEJ5dGUoKigodTMyICopKF9fcFN0YXJ0KSkpKQotCi0jZGVmaW5lIExFX0JJVFNfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgKExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSA+PiAoX19CaXRPZmZzZXQpKSBcCi0JICAmIFwKLQkgIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgXAotCSkKLQotI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCSggXAotCSAgTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpIFwKLQkgICYgXAotCSAgKH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzMyKF9fQml0T2Zmc2V0LCBfX0JpdExlbikpIFwKLQkpCi0KLSNkZWZpbmUgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCi0JKDB4RkZGRiA+PiAoMTYgLSAoX19CaXRMZW4pKSkKLQotI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAotCShCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCi0KLSNkZWZpbmUgTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpIFwKLQkoRUYyQnl0ZSgqKCh1MTYgKikoX19wU3RhcnQpKSkpCi0KLSNkZWZpbmUgTEVfQklUU19UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICAoTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkpIFwKLQkgICYgXAotCSAgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCi0JKQotCi0jZGVmaW5lIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSBcCi0JKDB4RkYgPj4gKDggLSAoX19CaXRMZW4pKSkKLQotI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQotCi0jZGVmaW5lIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSBcCi0JKEVGMUJ5dGUoKigodTggKikoX19wU3RhcnQpKSkpCi0KLSNkZWZpbmUgTEVfQklUU19UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICAoTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkpIFwKLQkgICYgXAotCSAgQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIFwKLQkpCi0KLSNkZWZpbmUJTl9CWVRFX0FMSUdNRU5UKF9fVmFsdWUsIF9fQWxpZ21lbnQpCQkJXAotCSAoKF9fQWxpZ21lbnQgPT0gMSkgPyAoX19WYWx1ZSkgOiAoKChfX1ZhbHVlICsgX19BbGlnbWVudCAtIDEpIC8gXAotCV9fQWxpZ21lbnQpICogX19BbGlnbWVudCkpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX21vZHVsZS5jCmluZGV4IDBjZjM4MDkuLjMyY2M4ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYwpAQCAtNzIsMTEgKzcyLDggQEAKIAlpZWVlLT5uZXR3b3JrcyA9IGt6YWxsb2MoCiAJCU1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBydGxsaWJfbmV0d29yayksCiAJCUdGUF9LRVJORUwpOwotCWlmICghaWVlZS0+bmV0d29ya3MpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zXG4iLAotCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwlpZiAoIWllZWUtPm5ldHdvcmtzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MSwxMCArMTU4LDkgQEAKIAlydGxsaWJfc29mdG1hY19pbml0KGllZWUpOwogCiAJaWVlZS0+cEhUSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9oaV90aHJvdWdocHV0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGllZWUtPnBIVEluZm8gPT0gTlVMTCkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgImNhbid0IGFsbG9jIG1lbW9yeSBmb3IgSFRJbmZvXG4iKTsKKwlpZiAoaWVlZS0+cEhUSW5mbyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl9CisKIAlIVFVwZGF0ZURlZmF1bHRTZXR0aW5nKGllZWUpOwogCUhUSW5pdGlhbGl6ZUhUSW5mbyhpZWVlKTsKIAlUU0luaXRpYWxpemUoaWVlZSk7CkBAIC0yMDcsNyArMjAzLDkgQEAKIAogc3RhdGljIGludCBzaG93X2RlYnVnX2xldmVsKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiMHglMDhYXG4iLCBydGxsaWJfZGVidWdfbGV2ZWwpOworCXNlcV9wcmludGYobSwgIjB4JTA4WFxuIiwgcnRsbGliX2RlYnVnX2xldmVsKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfcnguYwppbmRleCAxNjY0MDQwLi5mZTNlN2UxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfcnguYwpAQCAtMTQzLDcgKzE0Myw4IEBACiAJCW1lbWNweShlbnRyeS0+ZHN0X2FkZHIsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKIAl9IGVsc2UgewogCQkvKiByZWNlaXZlZCBhIGZyYWdtZW50IG9mIGEgZnJhbWUgZm9yIHdoaWNoIHRoZSBoZWFkIGZyYWdtZW50Ci0JCSAqIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWNlaXZlZCAqLworCQkgKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQKKwkJICovCiAJCWVudHJ5ID0gcnRsbGliX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIGZyYWcsIHRpZCwgaGRyLT5hZGRyMiwKIAkJCQkJCSAgaGRyLT5hZGRyMSk7CiAJCWlmIChlbnRyeSAhPSBOVUxMKSB7CkBAIC0xOTksNyArMjAwLDggQEAKICAqCiAgKiBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgbWFuYWdlbWVudCBjb250cm9sIGZyYW1lcwogICoKLSAqIENhbGxlZCBieSBydGxsaWJfcnggKi8KKyAqIENhbGxlZCBieSBydGxsaWJfcngKKyAqLwogc3RhdGljIGlubGluZSBpbnQKIHJ0bGxpYl9yeF9mcmFtZV9tZ210KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLApAQCAtMjI0LDggKzIyNiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCi0vKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLworLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24KKyAqIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpCisgKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gPSB7CiAJMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMAogfTsKQEAgLTM5NCwxMCArMzk3LDkgQEAKIAkJfQogCQlpZiAocCA9PSAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKIAkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWVfaWJzc19zZXEpLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghZW50cnkpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW5ub3QgbWFsbG9jIG5ldyBtYWMgZW50cnlcbiIpOworCQkJaWYgKCFlbnRyeSkKIAkJCQlyZXR1cm4gMDsKLQkJCX0KKwogCQkJbWVtY3B5KGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pOwogCQkJZW50cnktPnNlcV9udW1bdGlkXSA9IHNlcTsKIAkJCWVudHJ5LT5mcmFnX251bVt0aWRdID0gZnJhZzsKQEAgLTQ4Myw3ICs0ODUsOCBAQAogCQkJICAgIGV0aGVydHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aGVydHlwZSAhPSBFVEhfUF9JUFgpIHx8CiAJCQkgICAgbWVtY21wKHN1Yl9za2ItPmRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpID09IDApKSB7CiAJCQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uCi0JCQkJICogYW5kIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCQkJICogYW5kIHJlcGxhY2UgRXRoZXJUeXBlCisJCQkJICovCiAJCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKIAkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5zcmMsIEVUSF9BTEVOKTsKIAkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5kc3QsIEVUSF9BTEVOKTsKQEAgLTUyNCw3ICs1MjcsOSBAQAogCWRlbF90aW1lcl9zeW5jKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnBUUy0+UnhQZW5kaW5nUGt0TGlzdCkpIHsKIAkJaWYgKFJmZENudCA+PSBSRU9SREVSX1dJTl9TSVpFKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLT4lcygpIGVycm9yISBSZmRDbnQgPj0gUkVPUkRFUl9XSU5fU0laRVxuIiwgX19mdW5jX18pOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCSAgICAiLS0tLS0tLS0tLS0tLS0+JXMoKSBlcnJvciEgUmZkQ250ID49IFJFT1JERVJfV0lOX1NJWkVcbiIsCisJCQkJICAgIF9fZnVuY19fKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTU4MSw4ICs1ODYsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JLyoKLQkgKiBTbGlkaW5nIHdpbmRvdyBtYW5pcHVsYXRpb24uIENvbmRpdGlvbnMgaW5jbHVkZXM6CisJLyogU2xpZGluZyB3aW5kb3cgbWFuaXB1bGF0aW9uLiBDb25kaXRpb25zIGluY2x1ZGVzOgogCSAqIDEuIEluY29taW5nIFNlcU51bSBpcyBlcXVhbCB0byBXaW5TdGFydCA9PldpbmRvdyBzaGlmdCAxCiAJICogMi4gSW5jb21pbmcgU2VxTnVtIGlzIGxhcmdlciB0aGFuIHRoZSBXaW5FbmQgPT4gV2luZG93IHNoaWZ0IE4KIAkgKi8KQEAgLTU5NywxMyArNjAxLDEyIEBACiAJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIldpbmRvdyBTaGlmdCEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLCBwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CiAJfQogCi0JLyoKLQkgKiBJbmRpY2F0aW9uIHByb2Nlc3MuCisJLyogSW5kaWNhdGlvbiBwcm9jZXNzLgogCSAqIEFmdGVyIFBhY2tldCBkcm9wcGluZyBhbmQgU2xpZGluZyBXaW5kb3cgc2hpZnRpbmcgYXMgYWJvdmUsIHdlIGNhbgogCSAqIG5vdyBqdXN0IGluZGljYXRlIHRoZSBwYWNrZXRzIHdpdGggdGhlIFNlcU51bSBzbWFsbGVyIHRoYW4gbGF0ZXN0CiAJICogV2luU3RhcnQgYW5kIHN0cnVjdCBidWZmZXIgb3RoZXIgcGFja2V0cy4KLQkgKi8KLQkvKiBGb3IgUnggUmVvcmRlciBjb25kaXRpb246CisJICoKKwkgKiBGb3IgUnggUmVvcmRlciBjb25kaXRpb246CiAJICogMS4gQWxsIHBhY2tldHMgd2l0aCBTZXFOdW0gc21hbGxlciB0aGFuIFdpblN0YXJ0ID0+IEluZGljYXRlCiAJICogMi4gQWxsIHBhY2tldHMgd2l0aCBTZXFOdW0gbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8KIAkgKgkgV2luU3RhcnQgPT4gQnVmZmVyIGl0LgpAQCAtNjQ2LDggKzY0OSw3IEBACiAJCQkJCSBwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogUGFja2V0cyBhcmUgZHJvcHBlZCBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCByZW9yZGVyCisJCQkvKiBQYWNrZXRzIGFyZSBkcm9wcGVkIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHJlb3JkZXIKIAkJCSAqIGVudHJpZXMuIFRoaXMgcGFydCBzaG91bGQgYmUgbW9kaWZpZWQhISBXZSBjYW4ganVzdAogCQkJICogaW5kaWNhdGUgYWxsIHRoZSBwYWNrZXRzIGluIHN0cnVjdCBidWZmZXIgYW5kIGdldAogCQkJICogcmVvcmRlciBlbnRyaWVzLgpAQCAtNjk3LDcgKzY5OSw4IEBACiAJfQogCiAJLyogSGFuZGxpbmcgcGVuZGluZyB0aW1lci4gU2V0IHRoaXMgdGltZXIgdG8gcHJldmVudCBmcm9tIGxvbmcgdGltZQotCSAqIFJ4IGJ1ZmZlcmluZy4qLworCSAqIFJ4IGJ1ZmZlcmluZy4KKwkgKi8KIAlpZiAoaW5kZXggPiAwKSB7CiAJCWlmICh0aW1lcl9wZW5kaW5nKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKSkKIAkJCWRlbF90aW1lcl9zeW5jKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKQEAgLTcxOCw3ICs3MjEsNyBAQAogCQkJICAgICBfX2Z1bmNfXyk7CiAJCXBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSBwVFMtPlJ4SW5kaWNhdGVTZXE7CiAJCW1vZF90aW1lcigmcFRTLT5SeFBrdFBlbmRpbmdUaW1lciwgamlmZmllcyArCi0JCQkgIE1TRUNTKHBIVEluZm8tPlJ4UmVvcmRlclBlbmRpbmdUaW1lKSk7CisJCQkgIG1zZWNzX3RvX2ppZmZpZXMocEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUpKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGllZWUtPnJlb3JkZXJfc3BpbmxvY2spLCBmbGFncyk7CiB9CkBAIC03ODIsNjkgKzc4NSw3NCBAQAogCQltZW1jcHkocnhiLT5kc3QsIGRzdCwgRVRIX0FMRU4pOwogCQlyeGItPnN1YmZyYW1lc1swXS0+ZGV2ID0gaWVlZS0+ZGV2OwogCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlyeGItPm5yX3N1YmZyYW1lcyA9IDA7Ci0JCW1lbWNweShyeGItPnNyYywgc3JjLCBFVEhfQUxFTik7Ci0JCW1lbWNweShyeGItPmRzdCwgZHN0LCBFVEhfQUxFTik7Ci0JCXdoaWxlIChza2ItPmxlbiA+IEVUSEVSTkVUX0hFQURFUl9TSVpFKSB7Ci0JCQkvKiBPZmZzZXQgMTIgZGVub3RlIDIgbWFjIGFkZHJlc3MgKi8KLQkJCW5TdWJmcmFtZV9MZW5ndGggPSAqKCh1MTYgKikoc2tiLT5kYXRhICsgMTIpKTsKLQkJCW5TdWJmcmFtZV9MZW5ndGggPSAoblN1YmZyYW1lX0xlbmd0aCA+PiA4KSArCi0JCQkJCSAgIChuU3ViZnJhbWVfTGVuZ3RoIDw8IDgpOworCX0KIAotCQkJaWYgKHNrYi0+bGVuIDwgKEVUSEVSTkVUX0hFQURFUl9TSVpFICsgblN1YmZyYW1lX0xlbmd0aCkpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgcFJmZC0+blRvdGFsU3ViZnJhbWUgOiAlZFxuIixcCi0JCQkJICAgICAgIF9fZnVuY19fLCByeGItPm5yX3N1YmZyYW1lcyk7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEEtTVNEVSBwYXJzZSBlcnJvciEhIFN1YmZyYW1lIExlbmd0aDogJWRcbiIsIF9fZnVuY19fLAotCQkJCSAgICAgICBuU3ViZnJhbWVfTGVuZ3RoKTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJuUmVtYWluX0xlbmd0aCBpcyAlZCBhbmQgblN1YmZyYW1lX0xlbmd0aCBpcyA6ICVkXG4iLCBza2ItPmxlbiwKLQkJCQkgICAgICAgblN1YmZyYW1lX0xlbmd0aCk7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiVGhlIFBhY2tldCBTZXFOdW0gaXMgJWRcbiIsIFNlcU51bSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisJcnhiLT5ucl9zdWJmcmFtZXMgPSAwOworCW1lbWNweShyeGItPnNyYywgc3JjLCBFVEhfQUxFTik7CisJbWVtY3B5KHJ4Yi0+ZHN0LCBkc3QsIEVUSF9BTEVOKTsKKwl3aGlsZSAoc2tiLT5sZW4gPiBFVEhFUk5FVF9IRUFERVJfU0laRSkgeworCQkvKiBPZmZzZXQgMTIgZGVub3RlIDIgbWFjIGFkZHJlc3MgKi8KKwkJblN1YmZyYW1lX0xlbmd0aCA9ICooKHUxNiAqKShza2ItPmRhdGEgKyAxMikpOworCQluU3ViZnJhbWVfTGVuZ3RoID0gKG5TdWJmcmFtZV9MZW5ndGggPj4gOCkgKworCQkJCSAgIChuU3ViZnJhbWVfTGVuZ3RoIDw8IDgpOwogCi0JCQkvKiBtb3ZlIHRoZSBkYXRhIHBvaW50IHRvIGRhdGEgY29udGVudCAqLwotCQkJc2tiX3B1bGwoc2tiLCBFVEhFUk5FVF9IRUFERVJfU0laRSk7Ci0KLQkJCS8qIGFsdGVyZWQgYnkgY2xhcmsgMy8zMC8yMDEwCi0JCQkgKiBUaGUgc3RydWN0IGJ1ZmZlciBzaXplIG9mIHRoZSBza2IgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyCi0JCQkgKiBtdXN0IGJlIGxlc3MgdGhhbiA1MDAwLCBvciB0aGUgZGVmcmFnZWQgSVAgZGF0YWdyYW0KLQkJCSAqIGluIHRoZSBJUCBsYXllciB3aWxsIGV4Y2VlZCAiaXBmcmFnX2hpZ2hfdHJlc2giIGFuZCBiZQotCQkJICogZGlzY2FyZGVkLiBzbyB0aGVyZSBtdXN0IG5vdCB1c2UgdGhlIGZ1bmN0aW9uCi0JCQkgKiAic2tiX2NvcHkiIGFuZCAic2tiX2Nsb25lIiBmb3IgInNrYiIuCi0JCQkgKi8KLQotCQkJLyogQWxsb2NhdGUgbmV3IHNrYiBmb3IgcmVsZWFzaW5nIHRvIHVwcGVyIGxheWVyICovCi0JCQlzdWJfc2tiID0gZGV2X2FsbG9jX3NrYihuU3ViZnJhbWVfTGVuZ3RoICsgMTIpOwotCQkJaWYgKCFzdWJfc2tiKQotCQkJCXJldHVybiAwOwotCQkJc2tiX3Jlc2VydmUoc3ViX3NrYiwgMTIpOwotCQkJZGF0YV9wdHIgPSAodTggKilza2JfcHV0KHN1Yl9za2IsIG5TdWJmcmFtZV9MZW5ndGgpOwotCQkJbWVtY3B5KGRhdGFfcHRyLCBza2ItPmRhdGEsIG5TdWJmcmFtZV9MZW5ndGgpOwotCi0JCQlzdWJfc2tiLT5kZXYgPSBpZWVlLT5kZXY7Ci0JCQlyeGItPnN1YmZyYW1lc1tyeGItPm5yX3N1YmZyYW1lcysrXSA9IHN1Yl9za2I7Ci0JCQlpZiAocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7Ci0JCQkJUlRMTElCX0RFQlVHX1JYKCJQYXJzZVN1YmZyYW1lKCk6IFRvbyBtYW55IFN1YmZyYW1lcyEgUGFja2V0cyBkcm9wcGVkIVxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlza2JfcHVsbChza2IsIG5TdWJmcmFtZV9MZW5ndGgpOwotCi0JCQlpZiAoc2tiLT5sZW4gIT0gMCkgewotCQkJCW5QYWRkaW5nX0xlbmd0aCA9IDQgLSAoKG5TdWJmcmFtZV9MZW5ndGggKwotCQkJCQkJICBFVEhFUk5FVF9IRUFERVJfU0laRSkgJSA0KTsKLQkJCQlpZiAoblBhZGRpbmdfTGVuZ3RoID09IDQpCi0JCQkJCW5QYWRkaW5nX0xlbmd0aCA9IDA7Ci0KLQkJCQlpZiAoc2tiLT5sZW4gPCBuUGFkZGluZ19MZW5ndGgpCi0JCQkJCXJldHVybiAwOwotCi0JCQkJc2tiX3B1bGwoc2tiLCBuUGFkZGluZ19MZW5ndGgpOwotCQkJfQorCQlpZiAoc2tiLT5sZW4gPCAoRVRIRVJORVRfSEVBREVSX1NJWkUgKyBuU3ViZnJhbWVfTGVuZ3RoKSkgeworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCSAgICAiJXM6IEEtTVNEVSBwYXJzZSBlcnJvciEhIHBSZmQtPm5Ub3RhbFN1YmZyYW1lIDogJWRcbiIsCisJCQkJICAgIF9fZnVuY19fLCByeGItPm5yX3N1YmZyYW1lcyk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgU3ViZnJhbWUgTGVuZ3RoOiAlZFxuIiwKKwkJCQkgICAgX19mdW5jX18sIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCSAgICAiblJlbWFpbl9MZW5ndGggaXMgJWQgYW5kIG5TdWJmcmFtZV9MZW5ndGggaXMgOiAlZFxuIiwKKwkJCQkgICAgc2tiLT5sZW4sIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCSAgICAiVGhlIFBhY2tldCBTZXFOdW0gaXMgJWRcbiIsCisJCQkJICAgIFNlcU51bSk7CisJCQlyZXR1cm4gMDsKIAkJfQogCi0JCXJldHVybiByeGItPm5yX3N1YmZyYW1lczsKKwkJLyogbW92ZSB0aGUgZGF0YSBwb2ludCB0byBkYXRhIGNvbnRlbnQgKi8KKwkJc2tiX3B1bGwoc2tiLCBFVEhFUk5FVF9IRUFERVJfU0laRSk7CisKKwkJLyogYWx0ZXJlZCBieSBjbGFyayAzLzMwLzIwMTAKKwkJICogVGhlIHN0cnVjdCBidWZmZXIgc2l6ZSBvZiB0aGUgc2tiIGluZGljYXRlZCB0byB1cHBlciBsYXllcgorCQkgKiBtdXN0IGJlIGxlc3MgdGhhbiA1MDAwLCBvciB0aGUgZGVmcmFnZWQgSVAgZGF0YWdyYW0KKwkJICogaW4gdGhlIElQIGxheWVyIHdpbGwgZXhjZWVkICJpcGZyYWdfaGlnaF90cmVzaCIgYW5kIGJlCisJCSAqIGRpc2NhcmRlZC4gc28gdGhlcmUgbXVzdCBub3QgdXNlIHRoZSBmdW5jdGlvbgorCQkgKiAic2tiX2NvcHkiIGFuZCAic2tiX2Nsb25lIiBmb3IgInNrYiIuCisJCSAqLworCisJCS8qIEFsbG9jYXRlIG5ldyBza2IgZm9yIHJlbGVhc2luZyB0byB1cHBlciBsYXllciAqLworCQlzdWJfc2tiID0gZGV2X2FsbG9jX3NrYihuU3ViZnJhbWVfTGVuZ3RoICsgMTIpOworCQlpZiAoIXN1Yl9za2IpCisJCQlyZXR1cm4gMDsKKwkJc2tiX3Jlc2VydmUoc3ViX3NrYiwgMTIpOworCQlkYXRhX3B0ciA9ICh1OCAqKXNrYl9wdXQoc3ViX3NrYiwgblN1YmZyYW1lX0xlbmd0aCk7CisJCW1lbWNweShkYXRhX3B0ciwgc2tiLT5kYXRhLCBuU3ViZnJhbWVfTGVuZ3RoKTsKKworCQlzdWJfc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJCXJ4Yi0+c3ViZnJhbWVzW3J4Yi0+bnJfc3ViZnJhbWVzKytdID0gc3ViX3NrYjsKKwkJaWYgKHJ4Yi0+bnJfc3ViZnJhbWVzID49IE1BWF9TVUJGUkFNRV9DT1VOVCkgeworCQkJUlRMTElCX0RFQlVHX1JYKCJQYXJzZVN1YmZyYW1lKCk6IFRvbyBtYW55IFN1YmZyYW1lcyEgUGFja2V0cyBkcm9wcGVkIVxuIik7CisJCQlicmVhazsKKwkJfQorCQlza2JfcHVsbChza2IsIG5TdWJmcmFtZV9MZW5ndGgpOworCisJCWlmIChza2ItPmxlbiAhPSAwKSB7CisJCQluUGFkZGluZ19MZW5ndGggPSA0IC0gKChuU3ViZnJhbWVfTGVuZ3RoICsKKwkJCQkJICBFVEhFUk5FVF9IRUFERVJfU0laRSkgJSA0KTsKKwkJCWlmIChuUGFkZGluZ19MZW5ndGggPT0gNCkKKwkJCQluUGFkZGluZ19MZW5ndGggPSAwOworCisJCQlpZiAoc2tiLT5sZW4gPCBuUGFkZGluZ19MZW5ndGgpCisJCQkJcmV0dXJuIDA7CisKKwkJCXNrYl9wdWxsKHNrYiwgblBhZGRpbmdfTGVuZ3RoKTsKKwkJfQogCX0KKworCXJldHVybiByeGItPm5yX3N1YmZyYW1lczsKIH0KIAogCkBAIC04NTksNyArODY3LDggQEAKIAloZHJsZW4gPSBydGxsaWJfZ2V0X2hkcmxlbihmYyk7CiAJaWYgKEhUQ0NoZWNrKGllZWUsIHNrYi0+ZGF0YSkpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaW5kIEhUQ0NvbnRyb2whXG4iLCBfX2Z1bmNfXyk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICIlczogZmluZCBIVENDb250cm9sIVxuIiwKKwkJCQkgICAgX19mdW5jX18pOwogCQloZHJsZW4gKz0gNDsKIAkJcnhfc3RhdHMtPmJDb250YWluSFRDID0gdHJ1ZTsKIAl9CkBAIC05NjYsNyArOTc1LDggQEAKIAl9CiAKIAkvKiBOdWxsZnVuYyBmcmFtZXMgbWF5IGhhdmUgUFMtYml0IHNldCwgc28gdGhleSBtdXN0IGJlIHBhc3NlZCB0bwotCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4gKi8KKwkgKiBob3N0YXBfaGFuZGxlX3N0YV9yeCgpIGJlZm9yZSBiZWluZyBkcm9wcGVkIGhlcmUuCisJICovCiAJaWYgKCFpZWVlLT5JbnRlbFByb21pc2N1b3VzTW9kZUluZm8uYlByb21pc2N1b3VzT24pIHsKIAkJaWYgKHN0eXBlICE9IFJUTExJQl9TVFlQRV9EQVRBICYmCiAJCSAgICBzdHlwZSAhPSBSVExMSUJfU1RZUEVfREFUQV9DRkFDSyAmJgpAQCAtMTAwOCw3ICsxMDE4LDggQEAKIAogCQkqY3J5cHQgPSBpZWVlLT5jcnlwdF9pbmZvLmNyeXB0W2lkeF07CiAJCS8qIGFsbG93IE5VTEwgZGVjcnlwdCB0byBpbmRpY2F0ZSBhbiBzdGF0aW9uIHNwZWNpZmljIG92ZXJyaWRlCi0JCSAqIGZvciBkZWZhdWx0IGVuY3J5cHRpb24gKi8KKwkJICogZm9yIGRlZmF1bHQgZW5jcnlwdGlvbgorCQkgKi8KIAkJaWYgKCpjcnlwdCAmJiAoKCpjcnlwdCktPm9wcyA9PSBOVUxMIHx8CiAJCQkgICAgICAoKmNyeXB0KS0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkpCiAJCQkqY3J5cHQgPSBOVUxMOwpAQCAtMTAxNyw3ICsxMDI4LDggQEAKIAkJCS8qIFRoaXMgc2VlbXMgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNvbWUgKG11bHRpY2FzdD8pCiAJCQkgKiBmcmFtZXMgZnJvbSBvdGhlciB0aGFuIGN1cnJlbnQgQlNTLCBzbyBqdXN0IGRyb3AgdGhlCiAJCQkgKiBmcmFtZXMgc2lsZW50bHkgaW5zdGVhZCBvZiBmaWxsaW5nIHN5c3RlbSBsb2cgd2l0aAotCQkJICogdGhlc2UgcmVwb3J0cy4gKi8KKwkJCSAqIHRoZXNlIHJlcG9ydHMuCisJCQkgKi8KIAkJCVJUTExJQl9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCAobm90IHNldCkgKFNBPSAlcE0pXG4iLAogCQkJCQkgICAgIGhkci0+YWRkcjIpOwogCQkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CkBAIC0xMDQ5LDcgKzEwNjEsNyBAQAogCiAJa2V5aWR4ID0gcnRsbGliX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCk7CiAJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBSVExMSUJfRkNUTF9XRVApICYmIChrZXlpZHggPCAwKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogZGVjcnlwdCBmcmFtZSBlcnJvclxuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICIlczogZGVjcnlwdCBmcmFtZSBlcnJvclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xMDcyLDE5ICsxMDg0LDIyIEBACiAJCQlmbGVuIC09IGhkcmxlbjsKIAogCQlpZiAoZnJhZ19za2ItPnRhaWwgKyBmbGVuID4gZnJhZ19za2ItPmVuZCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhvc3QgZGVjcnlwdGVkIGFuZCByZWFzc2VtYmxlZCBmcmFtZSBkaWQgbm90IGZpdCBza2JcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOworCQkJbmV0ZGV2X3dhcm4oaWVlZS0+ZGV2LAorCQkJCSAgICAiJXM6IGhvc3QgZGVjcnlwdGVkIGFuZCByZWFzc2VtYmxlZCBmcmFtZSBkaWQgbm90IGZpdCBza2JcbiIsCisJCQkJICAgIF9fZnVuY19fKTsKIAkJCXJ0bGxpYl9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCiAJCWlmIChmcmFnID09IDApIHsKIAkJCS8qIGNvcHkgZmlyc3QgZnJhZ21lbnQgKGluY2x1ZGluZyBmdWxsIGhlYWRlcnMpIGludG8KLQkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhZ21lbnQgY2FjaGUgc2tiICovCisJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IGNhY2hlIHNrYgorCQkJICovCiAJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSwgZmxlbik7CiAJCX0gZWxzZSB7CiAJCQkvKiBhcHBlbmQgZnJhbWUgcGF5bG9hZCB0byB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudAotCQkJICogY2FjaGUgc2tiICovCisJCQkgKiBjYWNoZSBza2IKKwkJCSAqLwogCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEgKyBoZHJsZW4sCiAJCQkgICAgICAgZmxlbik7CiAJCX0KQEAgLTEwOTQsMjIgKzExMDksMjUgQEAKIAkJaWYgKGZjICYgUlRMTElCX0ZDVExfTU9SRUZSQUdTKSB7CiAJCQkvKiBtb3JlIGZyYWdtZW50cyBleHBlY3RlZCAtIGxlYXZlIHRoZSBza2IgaW4gZnJhZ21lbnQKIAkJCSAqIGNhY2hlIGZvciBub3c7IGl0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHVwcGVyIGxheWVycwotCQkJICogYWZ0ZXIgYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQgKi8KKwkJCSAqIGFmdGVyIGFsbCBmcmFnbWVudHMgaGF2ZSBiZWVuIHJlY2VpdmVkCisJCQkgKi8KIAkJCXJldHVybiAtMjsKIAkJfQogCiAJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IGFuZCB0aGUgZnJhbWUgd2lsbCBiZQotCQkgKiBkZWxpdmVyZWQsIHNvIHJlbW92ZSBza2IgZnJvbSBmcmFnbWVudCBjYWNoZSAqLworCQkgKiBkZWxpdmVyZWQsIHNvIHJlbW92ZSBza2IgZnJvbSBmcmFnbWVudCBjYWNoZQorCQkgKi8KIAkJc2tiID0gZnJhZ19za2I7CiAJCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CiAJCXJ0bGxpYl9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKIAl9CiAKIAkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBNU0RVIHBheWxvYWQ7IHBvc3NpYmx5IHN0aWxsCi0JICogZW5jcnlwdGVkL2F1dGhlbnRpY2F0ZWQgKi8KKwkgKiBlbmNyeXB0ZWQvYXV0aGVudGljYXRlZAorCSAqLwogCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgUlRMTElCX0ZDVExfV0VQKSAmJgogCQlydGxsaWJfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KGllZWUsIHNrYiwga2V5aWR4LCBjcnlwdCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ID09PmRlY3J5cHQgbXNkdSBlcnJvclxuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICIlczogPT0+ZGVjcnlwdCBtc2R1IGVycm9yXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTExMTksNyArMTEzNyw4IEBACiAJCSAgICBydGxsaWJfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CiAKIAkJCS8qIHBhc3MgdW5lbmNyeXB0ZWQgRUFQT0wgZnJhbWVzIGV2ZW4gaWYgZW5jcnlwdGlvbiBpcwotCQkJICogY29uZmlndXJlZCAqLworCQkJICogY29uZmlndXJlZAorCQkJICovCiAJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKIAkJCQkyNCk7CiAJCQlSVExMSUJfREVCVUdfRUFQKCJSWDogSUVFRSA4MDIuMVggRUFQT0wgZnJhbWU6ICVzXG4iLApAQCAtMTE0OSw3ICsxMTY4LDcgQEAKIAl9CiAKIAlpZiAocnRsbGliX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlg6IElFRUU4MDIuMVggRUFQT0wgZnJhbWUhXG4iKTsKKwkJbmV0ZGV2X3dhcm4oaWVlZS0+ZGV2LCAiUlg6IElFRUU4MDIuMVggRUFQT0wgZnJhbWUhXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE1OCw3ICsxMTc3LDcgQEAKIHsKIAlpZiAodW5pY2FzdCkgewogCi0JCWlmICgoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkpIHsKKwkJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9MSU5LRUQpIHsKIAkJCWlmICgoKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgKwogCQkJICAgIGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCkgPiA4KSB8fAogCQkJICAgIChpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeFVuaWNhc3RPa0luUGVyaW9kID4gMikpIHsKQEAgLTExODEsOCArMTIwMCw4IEBACiAJaW50IGkgPSAwOwogCiAJaWYgKHJ4YiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiByeGIgaXMgTlVMTCEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiA7CisJCW5ldGRldl9pbmZvKGRldiwgIiVzOiByeGIgaXMgTlVMTCEhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgewpAQCAtMTE5Niw3ICsxMjE1LDggQEAKIAkJCQlldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAogCQkJCW1lbWNtcChzdWJfc2tiLT5kYXRhLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgewogCQkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKLQkJCQkgKiByZXBsYWNlIEV0aGVyVHlwZSAqLworCQkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlCisJCQkJICovCiAJCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKIAkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKIAkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKQEAgLTEyMjYsNyArMTI0Niw2IEBACiAJCX0KIAl9CiAJa2ZyZWUocnhiKTsKLQlyeGIgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IHJ0bGxpYl9yeF9JbmZyYUFkaG9jKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTI2Myw3ICsxMjgyLDggQEAKIAkvKkZpbHRlciBwa3QgaGFzIHRvbyBzbWFsbCBsZW5ndGggKi8KIAloZHJsZW4gPSBydGxsaWJfcnhfZ2V0X2hkcmxlbihpZWVlLCBza2IsIHJ4X3N0YXRzKTsKIAlpZiAoc2tiLT5sZW4gPCBoZHJsZW4pIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTpFUlIhISEgc2tiLT5sZW4gaXMgc21hbGxlciB0aGFuIGhkcmxlblxuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhkZXYsICIlcygpOkVSUiEhISBza2ItPmxlbiBpcyBzbWFsbGVyIHRoYW4gaGRybGVuXG4iLAorCQkJICAgIF9fZnVuY19fKTsKIAkJZ290byByeF9kcm9wcGVkOwogCX0KIApAQCAtMTM0NSwxMSArMTM2NSw5IEBACiAJLyogc2tiOiBoZHIgKyAocG9zc2libGUgcmVhc3NlbWJsZWQpIGZ1bGwgcGxhaW50ZXh0IHBheWxvYWQgKi8KIAlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOwogCXJ4YiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydGxsaWJfcnhiKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJ4YiA9PSBOVUxMKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAotCQkJICAgICAiJXMoKToga21hbGxvYyByeGIgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwlpZiAocnhiID09IE5VTEwpCiAJCWdvdG8gcnhfZHJvcHBlZDsKLQl9CisKIAkvKiB0byBwYXJzZSBhbXNkdSBwYWNrZXRzICovCiAJLyogcW9zIGRhdGEgcGFja2V0cyAmIHJlc2VydmVkIGJpdCBpcyAxICovCiAJaWYgKHBhcnNlX3N1YmZyYW1lKGllZWUsIHNrYiwgcnhfc3RhdHMsIHJ4Yiwgc3JjLCBkc3QpID09IDApIHsKQEAgLTEzOTAsNyArMTQwOCw4IEBACiAKIAkvKiBSZXR1cm5pbmcgMCBpbmRpY2F0ZXMgdG8gY2FsbGVyIHRoYXQgd2UgaGF2ZSBub3QgaGFuZGxlZCB0aGUgU0tCLS0KIAkgKiBzbyBpdCBpcyBzdGlsbCBhbGxvY2F0ZWQgYW5kIGNhbiBiZSB1c2VkIGFnYWluIGJ5IHVuZGVybHlpbmcKLQkgKiBoYXJkd2FyZSBhcyBhIERNQSB0YXJnZXQgKi8KKwkgKiBoYXJkd2FyZSBhcyBhIERNQSB0YXJnZXQKKwkgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQwOCwxMyArMTQyNywxNiBAQAogCXNpemVfdCBoZHJsZW4gPSBydGxsaWJfZ2V0X2hkcmxlbihmYyk7CiAKIAlpZiAoc2tiLT5sZW4gPCBoZHJsZW4pIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTpFUlIhISEgc2tiLT5sZW4gaXMgc21hbGxlciB0aGFuIGhkcmxlblxuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkgICAgIiVzKCk6RVJSISEhIHNrYi0+bGVuIGlzIHNtYWxsZXIgdGhhbiBoZHJsZW5cbiIsCisJCQkgICAgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoSFRDQ2hlY2soaWVlZSwgc2tiLT5kYXRhKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpbmQgSFRDQ29udHJvbCFcbiIsIF9fZnVuY19fKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzOiBGaW5kIEhUQ0NvbnRyb2whXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7CiAJCWhkcmxlbiArPSA0OwogCX0KIApAQCAtMTQzMywxOCArMTQ1NSwxOSBAQAogCiAvKiBBbGwgcmVjZWl2ZWQgZnJhbWVzIGFyZSBzZW50IHRvIHRoaXMgZnVuY3Rpb24uIEBza2IgY29udGFpbnMgdGhlIGZyYW1lIGluCiAgKiBJRUVFIDgwMi4xMSBmb3JtYXQsIGkuZS4sIGluIHRoZSBmb3JtYXQgaXQgd2FzIHNlbnQgb3ZlciBhaXIuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gKi8KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLgorICovCiBpbnQgcnRsbGliX3J4KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCiB7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoKE5VTEwgPT0gaWVlZSkgfHwgKE5VTEwgPT0gc2tiKSB8fCAoTlVMTCA9PSByeF9zdGF0cykpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElucHV0IHBhcmFtZXRlcnMgTlVMTCFcbiIsIF9fZnVuY19fKTsKKwkJcHJfaW5mbygiJXM6IElucHV0IHBhcmFtZXRlcnMgTlVMTCFcbiIsIF9fZnVuY19fKTsKIAkJZ290byByeF9kcm9wcGVkOwogCX0KIAlpZiAoc2tiLT5sZW4gPCAxMCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogU0tCIGxlbmd0aCA8IDEwXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzOiBTS0IgbGVuZ3RoIDwgMTBcbiIsIF9fZnVuY19fKTsKIAkJZ290byByeF9kcm9wcGVkOwogCX0KIApAQCAtMTQ2NCw3ICsxNDg3LDcgQEAKIAkJcmV0ID0gcnRsbGliX3J4X01lc2goaWVlZSwgc2tiLCByeF9zdGF0cyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8iJXM6IEVSUiBpdyBtb2RlISEhXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzOiBFUlIgaXcgbW9kZSEhIVxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAl9CiAKQEAgLTE0NzksMTAgKzE1MDIsNyBAQAogCiBzdGF0aWMgdTggcW9zX291aVtRT1NfT1VJX0xFTl0gPSB7IDB4MDAsIDB4NTAsIDB4RjIgfTsKIAotLyoKLSogTWFrZSB0aGVyIHN0cnVjdHVyZSB3ZSByZWFkIGZyb20gdGhlIGJlYWNvbiBwYWNrZXQgaGFzCi0qIHRoZSByaWdodCB2YWx1ZXMKLSovCisvKiBNYWtlIHRoZXIgc3RydWN0dXJlIHdlIHJlYWQgZnJvbSB0aGUgYmVhY29uIHBhY2tldCBoYXMgdGhlIHJpZ2h0IHZhbHVlcyAqLwogc3RhdGljIGludCBydGxsaWJfdmVyaWZ5X3Fvc19pbmZvKHN0cnVjdCBydGxsaWJfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQKIAkJCQkgICAgICppbmZvX2VsZW1lbnQsIGludCBzdWJfdHlwZSkKIHsKQEAgLTE1MDAsOSArMTUyMCw3IEBACiB9CiAKIAotLyoKLSAqIFBhcnNlIGEgUW9TIHBhcmFtZXRlciBlbGVtZW50Ci0gKi8KKy8qIFBhcnNlIGEgUW9TIHBhcmFtZXRlciBlbGVtZW50ICovCiBzdGF0aWMgaW50IHJ0bGxpYl9yZWFkX3Fvc19wYXJhbV9lbGVtZW50KHN0cnVjdCBydGxsaWJfcW9zX3BhcmFtZXRlcl9pbmZvCiAJCQkJCSAgICAqZWxlbWVudF9wYXJhbSwgc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQKIAkJCQkJICAgICppbmZvX2VsZW1lbnQpCkBAIC0xNTI2LDkgKzE1NDQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBQYXJzZSBhIFFvUyBpbmZvcm1hdGlvbiBlbGVtZW50Ci0gKi8KKy8qIFBhcnNlIGEgUW9TIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KIHN0YXRpYyBpbnQgcnRsbGliX3JlYWRfcW9zX2luZm9fZWxlbWVudChzdHJ1Y3QKIAkJCQkJICAgcnRsbGliX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50CiAJCQkJCSAgICplbGVtZW50X2luZm8sIHN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50CkBAIC0xNTU3LDkgKzE1NzMsNyBAQAogfQogCiAKLS8qCi0gKiBXcml0ZSBRb1MgcGFyYW1ldGVycyBmcm9tIHRoZSBhYyBwYXJhbWV0ZXJzLgotICovCisvKiBXcml0ZSBRb1MgcGFyYW1ldGVycyBmcm9tIHRoZSBhYyBwYXJhbWV0ZXJzLiAqLwogc3RhdGljIGludCBydGxsaWJfcW9zX2NvbnZlcnRfYWNfdG9fcGFyYW1ldGVycyhzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJfaW5mbyAqcGFyYW1fZWxtLAogCQlzdHJ1Y3QgcnRsbGliX3Fvc19kYXRhICpxb3NfZGF0YSkKIHsKQEAgLTE2MTgsOCArMTYzMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiB3ZSBoYXZlIGEgZ2VuZXJpYyBkYXRhIGVsZW1lbnQgd2hpY2ggaXQgbWF5IGNvbnRhaW4gUW9TIGluZm9ybWF0aW9uIG9yCisvKiB3ZSBoYXZlIGEgZ2VuZXJpYyBkYXRhIGVsZW1lbnQgd2hpY2ggaXQgbWF5IGNvbnRhaW4gUW9TIGluZm9ybWF0aW9uIG9yCiAgKiBwYXJhbWV0ZXJzIGVsZW1lbnQuIGNoZWNrIHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IGxlbmd0aCB0byBkZWNpZGUKICAqIHdoaWNoIHR5cGUgdG8gcmVhZAogICovCkBAIC0xNzA1LDcgKzE3MTgsOSBAQAogCiAJCQlpZiAoIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpIHsKIAkJCQlpZiAocnRsbGliX2FjdF9zY2FubmluZyhpZWVlLCBmYWxzZSkgJiYgaWVlZS0+Rmlyc3RJZV9JblNjYW4pCi0JCQkJCXByaW50ayhLRVJOX0lORk8gIlJlY2VpdmVkIGJlYWNvbiBDb250cnlJRSwgU1NJRDogPCVzPlxuIiwgbmV0d29yay0+c3NpZCk7CisJCQkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCQkJCSAgICAiUmVjZWl2ZWQgYmVhY29uIENvbnRyeUlFLCBTU0lEOiA8JXM+XG4iLAorCQkJCQkJICAgIG5ldHdvcmstPnNzaWQpOwogCQkJCURvdDExZF9VcGRhdGVDb3VudHJ5SWUoaWVlZSwgYWRkcjIsIGluZm9fZWxlbWVudC0+bGVuLCBpbmZvX2VsZW1lbnQtPmRhdGEpOwogCQkJfQogCQl9CkBAIC0xNzM5LDcgKzE3NTQsOCBAQAogCQkJCQkgICAgIGxlbmd0aCwgaW5mb19lbGVtZW50LT5pZCk7CiAJCQkvKiBXZSBzdG9wIHByb2Nlc3NpbmcgYnV0IGRvbid0IHJldHVybiBhbiBlcnJvciBoZXJlCiAJCQkgKiBiZWNhdXNlIHNvbWUgbWlzYmVoYXZpb3VyIEFQcyBicmVhayB0aGlzIHJ1bGUuIGllLgotCQkJICogT3Jpbm9jbyBBUDEwMDAuICovCisJCQkgKiBPcmlub2NvIEFQMTAwMC4KKwkJCSAqLwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTkwOCw3ICsxOTI0LDcgQEAKIAkJCQkgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgogCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzMykgewogCi0JCQkJCQl0bXBfaHRjYXBfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCAodTgpTUFYX0lFX0xFTik7CisJCQkJCQl0bXBfaHRjYXBfbGVuID0gbWluX3QodTgsIGluZm9fZWxlbWVudC0+bGVuLCBNQVhfSUVfTEVOKTsKIAkJCQkJCWlmICh0bXBfaHRjYXBfbGVuICE9IDApIHsKIAkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKIAkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID0gdG1wX2h0Y2FwX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKSA/CkBAIC0xOTMyLDcgKzE5NDgsNyBAQAogCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg5MCAmJgogCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgogCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMzQpIHsKLQkJCQkJdG1wX2h0aW5mb19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sICh1OClNQVhfSUVfTEVOKTsKKwkJCQkJdG1wX2h0aW5mb19sZW4gPSBtaW5fdCh1OCwgaW5mb19lbGVtZW50LT5sZW4sIE1BWF9JRV9MRU4pOwogCQkJCQlpZiAodG1wX2h0aW5mb19sZW4gIT0gMCkgewogCQkJCQkJbmV0d29yay0+YnNzaHQuYmRIVFNwZWNWZXIgPSBIVF9TUEVDX1ZFUl9FV0M7CiAJCQkJCQlpZiAodG1wX2h0aW5mb19sZW4pIHsKQEAgLTE5NTMsNyArMTk2OSw3IEBACiAJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHhlMCAmJgogCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKIAkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyKSB7Ci0JCQkJCQlodF9yZWFsdGVrX2FnZ19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sICh1OClNQVhfSUVfTEVOKTsKKwkJCQkJCWh0X3JlYWx0ZWtfYWdnX2xlbiA9IG1pbl90KHU4LCBpbmZvX2VsZW1lbnQtPmxlbiwgTUFYX0lFX0xFTik7CiAJCQkJCQltZW1jcHkoaHRfcmVhbHRla19hZ2dfYnVmLCBpbmZvX2VsZW1lbnQtPmRhdGEsIGluZm9fZWxlbWVudC0+bGVuKTsKIAkJCQkJfQogCQkJCQlpZiAoaHRfcmVhbHRla19hZ2dfbGVuID49IDUpIHsKQEAgLTIwODMsNyArMjA5OSw3IEBACiAJCWNhc2UgTUZJRV9UWVBFX0hUX0NBUDoKIAkJCVJUTExJQl9ERUJVR19TQ0FOKCJNRklFX1RZUEVfSFRfQ0FQOiAlZCBieXRlc1xuIiwKIAkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7Ci0JCQl0bXBfaHRjYXBfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCAodTgpTUFYX0lFX0xFTik7CisJCQl0bXBfaHRjYXBfbGVuID0gbWluX3QodTgsIGluZm9fZWxlbWVudC0+bGVuLCBNQVhfSUVfTEVOKTsKIAkJCWlmICh0bXBfaHRjYXBfbGVuICE9IDApIHsKIAkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKIAkJCQluZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID0gdG1wX2h0Y2FwX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKSA/CkBAIC0yMTEwLDcgKzIxMjYsNyBAQAogCQljYXNlIE1GSUVfVFlQRV9IVF9JTkZPOgogCQkJUlRMTElCX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9IVF9JTkZPOiAlZCBieXRlc1xuIiwKIAkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7Ci0JCQl0bXBfaHRpbmZvX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgKHU4KU1BWF9JRV9MRU4pOworCQkJdG1wX2h0aW5mb19sZW4gPSBtaW5fdCh1OCwgaW5mb19lbGVtZW50LT5sZW4sIE1BWF9JRV9MRU4pOwogCQkJaWYgKHRtcF9odGluZm9fbGVuKSB7CiAJCQkJbmV0d29yay0+YnNzaHQuYmRIVFNwZWNWZXIgPSBIVF9TUEVDX1ZFUl9JRUVFOwogCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuID0gdG1wX2h0aW5mb19sZW4gPgpAQCAtMjE0Miw4ICsyMTU4LDggQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIE1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSOgotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIlFvUyBFcnJvciBuZWVkIHRvIHBhcnNlIFFPU19QQVJBTUVURVIgSUVcbiIpOworCQkJbmV0ZGV2X2VycihpZWVlLT5kZXYsCisJCQkJICAgIlFvUyBFcnJvciBuZWVkIHRvIHBhcnNlIFFPU19QQVJBTUVURVIgSUVcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNRklFX1RZUEVfQ09VTlRSWToKQEAgLTIxOTIsMTMgKzIyMDgsNiBAQAogCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yaywKIAlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpzdGF0cykKIHsKLQotCS8qCi0JbmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID0gMDsKLQluZXR3b3JrLT5xb3NfZGF0YS5zdXBwb3J0ZWQgPSAwOwotCW5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50ID0gMDsKLQluZXR3b3JrLT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPSAwOwotCSovCiAJbWVtc2V0KCZuZXR3b3JrLT5xb3NfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfcW9zX2RhdGEpKTsKIAogCS8qIFB1bGwgb3V0IGZpeGVkIGZpZWxkIGRhdGEgKi8KQEAgLTIyOTEsNyArMjMwMCw4IEBACiAJLyogQSBuZXR3b3JrIGlzIG9ubHkgYSBkdXBsaWNhdGUgaWYgdGhlIGNoYW5uZWwsIEJTU0lELCBFU1NJRAogCSAqIGFuZCB0aGUgY2FwYWJpbGl0eSBmaWVsZCAoaW4gcGFydGljdWxhciBJQlNTIGFuZCBCU1MpIGFsbCBtYXRjaC4KIAkgKiBXZSB0cmVhdCBhbGwgPGhpZGRlbj4gd2l0aCB0aGUgc2FtZSBCU1NJRCBhbmQgY2hhbm5lbAotCSAqIGFzIG9uZSBuZXR3b3JrICovCisJICogYXMgb25lIG5ldHdvcmsKKwkgKi8KIAlyZXR1cm4gKCgoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSB8fCAoIXNzaWRicm9hZCkpICYmCiAJCShzcmMtPmNoYW5uZWwgPT0gZHN0LT5jaGFubmVsKSAmJgogCQkhbWVtY21wKHNyYy0+YnNzaWQsIGRzdC0+YnNzaWQsIEVUSF9BTEVOKSAmJgpAQCAtMjQyMiw3ICsyNDMyLDcgQEAKIHN0YXRpYyBpbnQgSXNQYXNzaXZlQ2hhbm5lbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliLCB1OCBjaGFubmVsKQogewogCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IEludmFsaWQgQ2hhbm5lbFxuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhydGxsaWItPmRldiwgIiVzKCk6IEludmFsaWQgQ2hhbm5lbFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI0MzUsNyArMjQ0NSw3IEBACiBpbnQgcnRsbGliX2xlZ2FsX2NoYW5uZWwoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKnJ0bGxpYiwgdTggY2hhbm5lbCkKIHsKIAlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlcygpOiBJbnZhbGlkIENoYW5uZWxcbiIsIF9fZnVuY19fKTsKKwkJbmV0ZGV2X2luZm8ocnRsbGliLT5kZXYsICIlcygpOiBJbnZhbGlkIENoYW5uZWxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChydGxsaWItPmFjdGl2ZV9jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCkBAIC0yNTAxLDggKzI1MTEsOSBAQAogCWlmIChXTEFOX0ZDX0dFVF9TVFlQRShsZTE2X3RvX2NwdShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpKSA9PQogCSAgICBSVExMSUJfU1RZUEVfUFJPQkVfUkVTUCkgewogCQlpZiAoSXNQYXNzaXZlQ2hhbm5lbChpZWVlLCBuZXR3b3JrLT5jaGFubmVsKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBwcm9iZSByZXNwb25zZSBhdCBjaGFubmVsKCVkKS5cbiIsCi0JCQkgICAgICAgbmV0d29yay0+Y2hhbm5lbCk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwKKwkJCQkgICAgbmV0d29yay0+Y2hhbm5lbCk7CiAJCQlnb3RvIGZyZWVfbmV0d29yazsKIAkJfQogCX0KQEAgLTI1MTIsMTAgKzI1MjMsMTIgQEAKIAkgKgogCSAqIE5PVEU6ICBUaGlzIHNlYXJjaCBpcyBkZWZpbml0ZWx5IG5vdCBvcHRpbWl6ZWQuICBPbmNlIGl0cyBkb2luZwogCSAqCXRoZSAicmlnaHQgdGhpbmciIHdlJ2xsIG9wdGltaXplIGl0IGZvciBlZmZpY2llbmN5IGlmCi0JICoJbmVjZXNzYXJ5ICovCisJICoJbmVjZXNzYXJ5CisJICovCiAKIAkvKiBTZWFyY2ggZm9yIHRoaXMgZW50cnkgaW4gdGhlIGxpc3QgYW5kIHVwZGF0ZSBpdCBpZiBpdCBpcwotCSAqIGFscmVhZHkgdGhlcmUuICovCisJICogYWxyZWFkeSB0aGVyZS4KKwkgKi8KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJaWYgKGlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBuZXR3b3JrLApAQCAtMjU0NCw3ICsyNTU3LDggQEAKIAl9CiAKIAkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGVuIGdldCBhIG5ldyBuZXR3b3JrIHNsb3QgdG8gaW5pdGlhbGl6ZQotCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbiAqLworCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbgorCSAqLwogCWlmICgmdGFyZ2V0LT5saXN0ID09ICZpZWVlLT5uZXR3b3JrX2xpc3QpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KSkgewogCQkJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2xvdHMsIGV4cGlyZSB0aGUgb2xkZXN0ICovCkBAIC0yNjExLDcgKzI2MjUsNiBAQAogCX0KIGZyZWVfbmV0d29yazoKIAlrZnJlZShuZXR3b3JrKTsKLQlyZXR1cm47CiB9CiAKIHZvaWQgcnRsbGliX3J4X21ndChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKaW5kZXggZDk5MmE3NS4uMjNiN2E0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKQEAgLTY4LDcgKzY4LDggQEAKIAl9CiAKIAkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcKLQkgKiBtaWdodCBzdXBwb3J0ICovCisJICogbWlnaHQgc3VwcG9ydAorCSAqLwogCSp0YWdfcCA9IHRhZzsKIH0KIApAQCAtODksNyArOTAsOCBAQAogCQkqdGFnKysgPSBSVExMSUJfQkFTSUNfUkFURV9NQVNLIHwgUlRMTElCX09GRE1fUkFURV81NE1COwogCX0KIAkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQKLQkgKiBzdXBwb3J0ICovCisJICogc3VwcG9ydAorCSAqLwogCSp0YWdfcCA9IHRhZzsKIH0KIApAQCAtMTI0LDcgKzEyNiw3IEBACiAJKnRhZysrID0gMHgwMDsKIAogCSp0YWdfcCA9IHRhZzsKLQlwcmludGsoS0VSTl9BTEVSVCAiVGhpcyBpcyBlbmFibGUgdHVyYm8gbW9kZSBJRSBwcm9jZXNzXG4iKTsKKwluZXRkZXZfYWxlcnQoaWVlZS0+ZGV2LCAiVGhpcyBpcyBlbmFibGUgdHVyYm8gbW9kZSBJRSBwcm9jZXNzXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgZW5xdWV1ZV9tZ210KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTMzLDggKzEzNSw3IEBACiAKIAluaCA9IChpZWVlLT5tZ210X3F1ZXVlX2hlYWQgKyAxKSAlIE1HTVRfUVVFVUVfTlVNOwogCi0vKgotICogaWYgdGhlIHF1ZXVlIGlzIGZ1bGwgYnV0IHdlIGhhdmUgbmV3ZXIgZnJhbWVzIHRoZW4KKy8qIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dCB3ZSBoYXZlIG5ld2VyIGZyYW1lcyB0aGVuCiAgKiBqdXN0IG92ZXJ3cml0ZXMgdGhlIG9sZGVzdC4KICAqCiAgKiBpZiAobmggPT0gaWVlZS0+bWdtdF9xdWV1ZV90YWlsKQpAQCAtMTg4LDcgKzE4OSw3IEBACiAKIAlpZiAoUXVlcnlSYXRlID09IDApIHsKIAkJUXVlcnlSYXRlID0gMTI7Ci0JCXByaW50ayhLRVJOX0lORk8gIk5vIEJhc2ljUmF0ZSBmb3VuZCEhXG4iKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiTm8gQmFzaWNSYXRlIGZvdW5kISFcbiIpOwogCX0KIAlyZXR1cm4gUXVlcnlSYXRlOwogfQpAQCAtMjczLDEyICsyNzQsMTQgQEAKIAkJaWYgKCFpZWVlLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoaWVlZS0+ZGV2LCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpIHx8CiAJCSAgICAoc2tiX3F1ZXVlX2xlbigmaWVlZS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pICE9IDApIHx8CiAJCSAgICAoaWVlZS0+cXVldWVfc3RvcCkpIHsKLQkJCS8qIGluc2VydCB0aGUgc2tiIHBhY2tldCB0byB0aGUgbWFuYWdlbWVudCBxdWV1ZSAqLwotCQkJLyogYXMgZm9yIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLCBpdCBkb2VzIG5vdCBuZWVkCisJCQkvKiBpbnNlcnQgdGhlIHNrYiBwYWNrZXQgdG8gdGhlIG1hbmFnZW1lbnQgcXVldWUKKwkJCSAqCisJCQkgKiBhcyBmb3IgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24sIGl0IGRvZXMgbm90IG5lZWQKIAkJCSAqIHRvIGNoZWNrIGl0IGFueSBtb3JlLgotCQkJICogKi8KLQkJCXByaW50ayhLRVJOX0lORk8gIiVzKCk6aW5zZXJ0IHRvIHdhaXRxdWV1ZSwgcXVldWVfaW5kZXgiCi0JCQkgICAgICAgIjolZCFcbiIsIF9fZnVuY19fLCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpOworCQkJICovCisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkgICAgICAgIiVzKCk6aW5zZXJ0IHRvIHdhaXRxdWV1ZSwgcXVldWVfaW5kZXg6JWQhXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpOwogCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLAogCQkJCSAgICAgICBza2IpOwogCQl9IGVsc2UgewpAQCAtNDAxLDcgKzQwNCw3IEBACiAKIAlpZiAoaWVlZS0+YmVhY29uX3R4aW5nICYmIGllZWUtPmllZWVfdXApCiAJCW1vZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyLCBqaWZmaWVzICsKLQkJCSAgKE1TRUNTKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLSA1KSkpOworCQkJICAobXNlY3NfdG9famlmZmllcyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC0gNSkpKTsKIH0KIAogCkBAIC00MTYsNDAgKzQxOSwzMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CiB9CiAKLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqCSAgICAgIEVuYWJsZSBuZXR3b3JrIG1vbml0b3IgbW9kZSwgYWxsIHJ4IHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KLSAqLworLyogRW5hYmxlcyBuZXR3b3JrIG1vbml0b3IgbW9kZSwgYWxsIHJ4IHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4gKi8KIHZvaWQgcnRsbGliX0VuYWJsZU5ldE1vbml0b3JNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCWJvb2wgYkluaXRTdGF0ZSkKIHsKIAlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2X3JzbChkZXYpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT0+RW50ZXIgTW9uaXRvciBNb2RlXG4iKTsKKwluZXRkZXZfaW5mbyhkZXYsICI9PT09PT09PT5FbnRlciBNb25pdG9yIE1vZGVcbiIpOwogCiAJaWVlZS0+QWxsb3dBbGxEZXN0QWRkckhhbmRsZXIoZGV2LCB0cnVlLCAhYkluaXRTdGF0ZSk7CiB9CiAKIAotLyoKLSAqICAgICAgRGVzY3JpcHRpb246Ci0gKgkgICAgICBEaXNhYmxlIG5ldHdvcmsgbmV0d29yayBtb25pdG9yIG1vZGUsIG9ubHkgcGFja2V0cyBkZXN0aW5hdGVkIHRvCi0gKgkgICAgICB1cyB3aWxsIGJlIHJlY2VpdmVkLgorLyogRGlzYWJsZXMgbmV0d29yayBtb25pdG9yIG1vZGUuIE9ubHkgcGFja2V0cyBkZXN0aW5hdGVkIHRvCisgKiB1cyB3aWxsIGJlIHJlY2VpdmVkLgogICovCiB2b2lkIHJ0bGxpYl9EaXNhYmxlTmV0TW9uaXRvck1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJYm9vbCBiSW5pdFN0YXRlKQogewogCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXZfcnNsKGRldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT5FeGl0IE1vbml0b3IgTW9kZVxuIik7CisJbmV0ZGV2X2luZm8oZGV2LCAiPT09PT09PT0+RXhpdCBNb25pdG9yIE1vZGVcbiIpOwogCiAJaWVlZS0+QWxsb3dBbGxEZXN0QWRkckhhbmRsZXIoZGV2LCBmYWxzZSwgIWJJbml0U3RhdGUpOwogfQogCiAKLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZW5hYmxlcyB0aGUgc3BlY2lhbGl6ZWQgcHJvbWlzY3VvdXMgbW9kZSByZXF1aXJlZCBieSBJbnRlbC4KKy8qIEVuYWJsZXMgdGhlIHNwZWNpYWxpemVkIHByb21pc2N1b3VzIG1vZGUgcmVxdWlyZWQgYnkgSW50ZWwuCiAgKiBJbiB0aGlzIG1vZGUsIEludGVsIGludGVuZHMgdG8gaGVhciB0cmFmZmljcyBmcm9tL3RvIG90aGVyIFNUQXMgaW4gdGhlCiAgKiBzYW1lIEJTUy4gVGhlcmVmb3JlIHdlIGRvbid0IGhhdmUgdG8gZGlzYWJsZSBjaGVja2luZyBCU1NJRCBhbmQgd2Ugb25seSBuZWVkCiAgKiB0byBhbGxvdyBhbGwgZGVzdC4gQlVUOiBpZiB3ZSBlbmFibGUgY2hlY2tpbmcgQlNTSUQgdGhlbiB3ZSBjYW4ndCByZWN2CkBAIC00NjIsNyArNDU4LDcgQEAKIAogCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXZfcnNsKGRldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT5FbnRlciBJbnRlbCBQcm9taXNjdW91cyBNb2RlXG4iKTsKKwluZXRkZXZfaW5mbyhkZXYsICI9PT09PT09PT5FbnRlciBJbnRlbCBQcm9taXNjdW91cyBNb2RlXG4iKTsKIAogCWllZWUtPkFsbG93QWxsRGVzdEFkZHJIYW5kbGVyKGRldiwgdHJ1ZSwgIWJJbml0U3RhdGUpOwogCWllZWUtPlNldEh3UmVnSGFuZGxlcihkZXYsIEhXX1ZBUl9DRUNIS19CU1NJRCwKQEAgLTQ3MywxMCArNDY5LDggQEAKIEVYUE9SVF9TWU1CT0wocnRsbGliX0VuYWJsZUludGVsUHJvbWlzY3VvdXNNb2RlKTsKIAogCi0vKgotICogRGVzY3JpcHRpb246Ci0gKgkgICAgICBUaGlzIGRpc2FibGVzIHRoZSBzcGVjaWFsaXplZCBwcm9taXNjdW91cyBtb2RlIHJlcXVpcmVkIGJ5IEludGVsLgotICoJICAgICAgU2VlIE1nbnRFbmFibGVJbnRlbFByb21pc2N1b3VzTW9kZSBmb3IgZGV0YWlsLgorLyogRGlzYWJsZXMgdGhlIHNwZWNpYWxpemVkIHByb21pc2N1b3VzIG1vZGUgcmVxdWlyZWQgYnkgSW50ZWwuCisgKiBTZWUgTWdudEVuYWJsZUludGVsUHJvbWlzY3VvdXNNb2RlIGZvciBkZXRhaWwuCiAgKi8KIHZvaWQgcnRsbGliX0Rpc2FibGVJbnRlbFByb21pc2N1b3VzTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQlib29sIGJJbml0U3RhdGUpCkBAIC00ODUsNyArNDc5LDcgQEAKIAogCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXZfcnNsKGRldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT5FeGl0IEludGVsIFByb21pc2N1b3VzIE1vZGVcbiIpOworCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PkV4aXQgSW50ZWwgUHJvbWlzY3VvdXMgTW9kZVxuIik7CiAKIAlpZWVlLT5BbGxvd0FsbERlc3RBZGRySGFuZGxlcihkZXYsIGZhbHNlLCAhYkluaXRTdGF0ZSk7CiAJaWVlZS0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0NFQ0hLX0JTU0lELApAQCAtNTY5LDcgKzU2Myw4IEBACiAJCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKQogCQkJZ290byBvdXQ7CiAJCWlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PnN5bmNfc2Nhbl9odXJyeXVwIG91dFxuIik7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICI9PT09PT09PT09PT0+c3luY19zY2FuX2h1cnJ5dXAgb3V0XG4iKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTYxNCw4ICs2MDksOSBAQAogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKIAogCWlmIChpZWVlLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgewotCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT0+JXMoKTpyZiBzdGF0ZSBpcyBlUmZPZmYsIHJldHVyblxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJICAgICI9PT09PT0+JXMoKTpyZiBzdGF0ZSBpcyBlUmZPZmYsIHJldHVyblxuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0MTsKIAl9CiAKQEAgLTYzOSw3ICs2MzUsNyBAQAogCQlydGxsaWJfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlLCAwKTsKIAogCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2woaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsCi0JCQkgICAgICAgTVNFQ1MoUlRMTElCX1NPRlRNQUNfU0NBTl9USU1FKSk7CisJCQkgICAgICAgbXNlY3NfdG9famlmZmllcyhSVExMSUJfU09GVE1BQ19TQ0FOX1RJTUUpKTsKIAogCXVwKCZpZWVlLT5zY2FuX3NlbSk7CiAJcmV0dXJuOwpAQCAtMTIzOCw4ICsxMjM0LDggQEAKIAlQTUtDYWNoZUlkeCA9IFNlY0lzSW5QTUtJRExpc3QoaWVlZSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKIAlpZiAoUE1LQ2FjaGVJZHggPj0gMCkgewogCQl3cGFfaWVfbGVuICs9IDE4OwotCQlwcmludGsoS0VSTl9JTkZPICJbUE1LIGNhY2hlXTogV1BBMiBJRSBsZW5ndGg6ICV4XG4iLAotCQkgICAgICAgd3BhX2llX2xlbik7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIltQTUsgY2FjaGVdOiBXUEEyIElFIGxlbmd0aDogJXhcbiIsCisJCQkgICAgd3BhX2llX2xlbik7CiAJfQogCWxlbiA9IHNpemVvZihzdHJ1Y3QgcnRsbGliX2Fzc29jX3JlcXVlc3RfZnJhbWUpICsgMgogCQkrIGJlYWNvbi0+c3NpZF9sZW4KQEAgLTE0MTgsOCArMTQxNCw5IEBACiAJaWYgKGllZWUtPmFzc29jcmVxX2llcykKIAkJbWVtY3B5KGllZWUtPmFzc29jcmVxX2llcywgaWVzLCBpZWVlLT5hc3NvY3JlcV9pZXNfbGVuKTsKIAllbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKVdhcm5pbmc6IGNhbid0IGFsbG9jIG1lbW9yeSBmb3IgYXNzb2NyZXEiCi0JCSAgICAgICAiX2llc1xuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkgICAgIiVzKClXYXJuaW5nOiBjYW4ndCBhbGxvYyBtZW1vcnkgZm9yIGFzc29jcmVxX2llc1xuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CiAJCWllZWUtPmFzc29jcmVxX2llc19sZW4gPSAwOwogCX0KIAlyZXR1cm4gc2tiOwpAQCAtMTQ3NCw3ICsxNDcxLDcgQEAKIAlpZiAoIXNrYikKIAkJcnRsbGliX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKIAllbHNlIHsKLQkJaWVlZS0+c3RhdGUgPSBSVExMSUJfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgOworCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORzsKIAkJUlRMTElCX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSkgewpAQCAtMTUwMyw4ICsxNTAwLDcgQEAKIAkJKihjKyspID0gY2hsZW47CiAJCW1lbWNweShjLCBjaGFsbGVuZ2UsIGNobGVuKTsKIAotCQlSVExMSUJfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgIgotCQkJCSAgInJlc3BvbnNlXG4iKTsKKwkJUlRMTElCX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIHJlc3BvbnNlXG4iKTsKIAogCQlydGxsaWJfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2IsCiAJCQkJCXNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikpOwpAQCAtMTU0Myw5ICsxNTM5LDkgQEAKIAkJCQkgICAgIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiAJc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKnBQU0MgPSAoc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKikKIAkJCQkJKCYoaWVlZS0+UG93ZXJTYXZlQ29udHJvbCkpOwotCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJBc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseVxuIik7CiAJaWYgKCFpZWVlLT5pc19zaWxlbnRfcmVzZXQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAibm9ybWFsIGFzc29jaWF0ZVxuIik7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIm5vcm1hbCBhc3NvY2lhdGVcbiIpOwogCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CiAJfQogCkBAIC0xNTU0LDIwICsxNTUwLDIwIEBACiAJaWYgKHJ0bGxpYl9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKIAkgICAoaWVlZS0+bW9kdWxhdGlvbiAmIFJUTExJQl9PRkRNX01PRFVMQVRJT04pKSB7CiAJCWllZWUtPnJhdGUgPSAxMDg7Ci0JCXByaW50ayhLRVJOX0lORk8iVXNpbmcgRyByYXRlczolZFxuIiwgaWVlZS0+cmF0ZSk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIlVzaW5nIEcgcmF0ZXM6JWRcbiIsIGllZWUtPnJhdGUpOwogCX0gZWxzZSB7CiAJCWllZWUtPnJhdGUgPSAyMjsKIAkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9CKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiVXNpbmcgQiByYXRlczolZFxuIiwgaWVlZS0+cmF0ZSk7CiAJfQogCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAmJiBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQsIGh0IGVuYWJsZWRcbiIpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCwgaHQgZW5hYmxlZFxuIik7CiAJCUhUT25Bc3NvY1JzcChpZWVlKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCwgaHQgbm90ICIKLQkJICAgICAgICJlbmFibGVkKCVkLCAlZClcbiIsCi0JCSAgICAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwKLQkJICAgICAgIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCSAgICAiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQsIGh0IG5vdCBlbmFibGVkKCVkLCAlZClcbiIsCisJCQkgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQsCisJCQkgICAgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKTsKIAkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKIAl9CiAJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDIgKiAoMSArCkBAIC0xNTgyLDcgKzE1NzgsNyBAQAogCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CiAKIAlpZiAoaWVlZS0+aXNfc2lsZW50X3Jlc2V0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInNpbGVudCByZXNldCBhc3NvY2lhdGVcbiIpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJzaWxlbnQgcmVzZXQgYXNzb2NpYXRlXG4iKTsKIAkJaWVlZS0+aXNfc2lsZW50X3Jlc2V0ID0gZmFsc2U7CiAJfQogCkBAIC0xNjIzLDggKzE2MTksOSBAQAogCQkgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwogCUhUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOwogCWlmIChpZWVlLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgewotCQlSVF9UUkFDRShDT01QX0RCRywgIj09PT09PT09PT09PT0+JXMoKTpSZiBzdGF0ZSBpcyBlUmZPZmYsIgotCQkJICIgc2NoZWR1bGUgaXBzbGVhdmUgd3EgYWdhaW4scmV0dXJuXG4iLCBfX2Z1bmNfXyk7CisJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJICI9PT09PT09PT09PT09PiVzKCk6UmYgc3RhdGUgaXMgZVJmT2ZmLCBzY2hlZHVsZSBpcHNsZWF2ZSB3cSBhZ2FpbixyZXR1cm5cbiIsCisJCQkgX19mdW5jX18pOwogCQlpZiAoaWVlZS0+cnRsbGliX2lwc19sZWF2ZV93cSAhPSBOVUxMKQogCQkJaWVlZS0+cnRsbGliX2lwc19sZWF2ZV93cShpZWVlLT5kZXYpOwogCQl1cCgmaWVlZS0+d3hfc2VtKTsKQEAgLTE3MDUsOCArMTcwMiw4IEBACiAJCSAgICghYXBzZXQgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSB8fAogCQkgICAoaWVlZS0+aXNfcm9hbWluZyAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpKSB7CiAJCQkvKiBpZiB0aGUgZXNzaWQgaXMgaGlkZGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUKLQkJCSogZXNzaWQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JCQkqLworCQkJICogZXNzaWQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCisJCQkgKi8KIAkJCWlmICghc3NpZGJyb2FkKSB7CiAJCQkJc3RybmNweSh0bXBfc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCiAJCQkJCUlXX0VTU0lEX01BWF9TSVpFKTsKQEAgLTE3MTksMTUgKzE3MTYsMTUgQEAKIAkJCQkJSVdfRVNTSURfTUFYX1NJWkUpOwogCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHRtcF9zc2lkX2xlbjsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0lORk8iTGlua2luZyB3aXRoICVzLGNoYW5uZWw6JWQsIHFvczolZCwgIgotCQkJICAgICAgICJteUhUOiVkLCBuZXR3b3JrSFQ6JWQsIG1vZGU6JXggY3VyX25ldC5mbGFncyIKLQkJCSAgICAgICAiOjB4JXhcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLAotCQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsLAotCQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQsCi0JCQkgICAgICAgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhULAotCQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCwKLQkJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSwKLQkJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuZmxhZ3MpOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCSAgICAiTGlua2luZyB3aXRoICVzLGNoYW5uZWw6JWQsIHFvczolZCwgbXlIVDolZCwgbmV0d29ya0hUOiVkLCBtb2RlOiV4IGN1cl9uZXQuZmxhZ3M6MHgleFxuIiwKKwkJCQkgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCisJCQkJICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsLAorCQkJCSAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkLAorCQkJCSAgICBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQsCisJCQkJICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCwKKwkJCQkgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUsCisJCQkJICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5mbGFncyk7CiAKIAkJCWlmICgocnRsbGliX2FjdF9zY2FubmluZyhpZWVlLCBmYWxzZSkpICYmCiAJCQkgICAhKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpCkBAIC0xNzU4LDExICsxNzU1LDExIEBACiAJCQkJCShpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikpIHsKIAkJCQkJaWVlZS0+cmF0ZSA9IDEwODsKIAkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKKwkJCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiVXNpbmcgRyByYXRlc1xuIik7CiAJCQkJfSBlbHNlIHsKIAkJCQkJaWVlZS0+cmF0ZSA9IDIyOwogCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0IpOwotCQkJCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXNcbiIpOworCQkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJVc2luZyBCIHJhdGVzXG4iKTsKIAkJCQl9CiAJCQkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKIAkJCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9MSU5LRUQ7CkBAIC0xOTY1LDcgKzE5NjIsNyBAQAogCWlmIChhc3NvY19ycV9wYXJzZShza2IsIGRlc3QpICE9IC0xKQogCQlydGxsaWJfcmVzcF90b19hc3NvY19ycShpZWVlLCBkZXN0KTsKIAotCXByaW50ayhLRVJOX0lORk8iTmV3IGNsaWVudCBhc3NvY2lhdGVkOiAlcE1cbiIsIGRlc3QpOworCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIk5ldyBjbGllbnQgYXNzb2NpYXRlZDogJXBNXG4iLCBkZXN0KTsKIH0KIAogdm9pZCBydGxsaWJfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKQpAQCAtMjAwNCwxMyArMjAwMSwxNiBAQAogCXRpbWVvdXQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOwogCWllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGEgPSBSVExMSUJfRFRJTV9JTlZBTElEOwogCS8qIHRoZXJlJ3Mgbm8gbmVlZCB0byBub2ZpdHkgQVAgdGhhdCBJIGZpbmQgeW91IGJ1ZmZlcmVkCi0JICogd2l0aCBicm9hZGNhc3QgcGFja2V0ICovCisJICogd2l0aCBicm9hZGNhc3QgcGFja2V0CisJICovCiAJaWYgKGR0aW0gJiAoUlRMTElCX0RUSU1fVUNBU1QgJiBpZWVlLT5wcykpCiAJCXJldHVybiAyOwogCi0JaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmRldi0+dHJhbnNfc3RhcnQgKyBNU0VDUyh0aW1lb3V0KSkpCisJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsCisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSkpCiAJCXJldHVybiAwOwotCWlmICghdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5sYXN0X3J4X3BzX3RpbWUgKyBNU0VDUyh0aW1lb3V0KSkpCisJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsCisJCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKSkKIAkJcmV0dXJuIDA7CiAJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSkgJiYKIAkgICAgKGllZWUtPm1nbXRfcXVldWVfdGFpbCAhPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpKQpAQCAtMjA2MCw3ICsyMDYwLDcgQEAKIAkJCX0KIAogCQkqdGltZSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWUKLQkJCSsgTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqCisJCQkrIG1zZWNzX3RvX2ppZmZpZXMoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqCiAJCQlMUFNBd2FrZUludHZsX3RtcCk7CiAJfQogCX0KQEAgLTIwODEsMTAgKzIwODEsOSBAQAogCWlmICgoaWVlZS0+cHMgPT0gUlRMTElCX1BTX0RJU0FCTEVEIHx8CiAJICAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKIAkgICAgIGllZWUtPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpKSB7Ci0JCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PT0+JXMoKTogbm8gbmVlZCB0byBwcyx3YWtlIHVwISEgIgotCQkJICJpZWVlLT5wcyBpcyAlZCwgaWVlZS0+aXdfbW9kZSBpcyAlZCwgaWVlZS0+c3RhdGUiCi0JCQkgIiBpcyAlZFxuIiwgX19mdW5jX18sIGllZWUtPnBzLCBpZWVlLT5pd19tb2RlLAotCQkJICBpZWVlLT5zdGF0ZSk7CisJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJICI9PT09PT4lcygpOiBubyBuZWVkIHRvIHBzLHdha2UgdXAhISBpZWVlLT5wcyBpcyAlZCwgaWVlZS0+aXdfbW9kZSBpcyAlZCwgaWVlZS0+c3RhdGUgaXMgJWRcbiIsCisJCQkgX19mdW5jX18sIGllZWUtPnBzLCBpZWVlLT5pd19tb2RlLCBpZWVlLT5zdGF0ZSk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CiAJCXJ0bGxpYl9zdGFfd2FrZXVwKGllZWUsIDEpOwogCkBAIC0yMTk5LDggKzIxOTgsOCBAQAogCXU4IGNhdGVnb3J5ID0gMDsKIAogCWlmIChhY3QgPT0gTlVMTCkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgImVycm9yIHRvIGdldCBwYXlsb2FkIG9mICIKLQkJCSAgICAgImFjdGlvbiBmcmFtZVxuIik7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiZXJyb3IgdG8gZ2V0IHBheWxvYWQgb2YgYWN0aW9uIGZyYW1lXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjIyMyw3ICsyMjIyLDYgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0JcmV0dXJuOwogfQogCiBpbmxpbmUgaW50IHJ0bGxpYl9yeF9hc3NvY19yZXNwKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMjI4NSwxNiArMjI4MywxOCBAQAogCQkJCW1lbWNweShpZWVlLT5hc3NvY3Jlc3BfaWVzLCBpZXMsCiAJCQkJICAgICAgIGllZWUtPmFzc29jcmVzcF9pZXNfbGVuKTsKIAkJCWVsc2UgewotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzKClXYXJuaW5nOiBjYW4ndCBhbGxvYyAiCi0JCQkJICAgICAgICJtZW1vcnkgZm9yIGFzc29jcmVzcF9pZXNcbiIsIF9fZnVuY19fKTsKKwkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJCSAgICAiJXMoKVdhcm5pbmc6IGNhbid0IGFsbG9jIG1lbW9yeSBmb3IgYXNzb2NyZXNwX2llc1xuIiwKKwkJCQkJICAgIF9fZnVuY19fKTsKIAkJCQlpZWVlLT5hc3NvY3Jlc3BfaWVzX2xlbiA9IDA7CiAJCQl9CiAJCQlydGxsaWJfYXNzb2NpYXRlX2NvbXBsZXRlKGllZWUpOwogCQl9IGVsc2UgewogCQkJLyogYWlkIGNvdWxkIG5vdCBiZWVuIGFsbG9jYXRlZCAqLwogCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfZXJyKys7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLAotCQkJCWVycmNvZGUpOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCSAgICAiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKKwkJCQkgICAgZXJyY29kZSk7CiAJCQlSVExMSUJfREVCVUdfTUdNVCgKIAkJCQkiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKIAkJCQllcnJjb2RlKTsKQEAgLTIzMDgsNzIgKzIzMDgsNzEgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW5saW5lIGludCBydGxsaWJfcnhfYXV0aChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCitzdGF0aWMgdm9pZCBydGxsaWJfcnhfYXV0aF9yZXNwKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXUxNiBlcnJjb2RlOwogCXU4ICpjaGFsbGVuZ2U7CiAJaW50IGNobGVuID0gMDsKIAlib29sIGJTdXBwb3J0Tm1vZGUgPSB0cnVlLCBiSGFsZlN1cHBvcnRObW9kZSA9IGZhbHNlOwogCisJZXJyY29kZSA9IGF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pOworCisJaWYgKGVycmNvZGUpIHsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOworCQlSVExMSUJfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gcmVzcG9zZSBzdGF0dXMgY29kZSAweCV4IiwKKwkJCQkgIGVycmNvZGUpOworCisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCSAgICAiQXV0aGVudGljYXRpb24gcmVzcG9zZSBzdGF0dXMgY29kZSAweCV4IiwgZXJyY29kZSk7CisJCXJ0bGxpYl9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSkgeworCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKKwkJaWYgKCEoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkpIHsKKwkJCWlmICghaWVlZS0+R2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcoaWVlZS0+ZGV2KSkgeworCQkJCWlmIChJc0hUSGFsZk5tb2RlQVBzKGllZWUpKSB7CisJCQkJCWJTdXBwb3J0Tm1vZGUgPSB0cnVlOworCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJYlN1cHBvcnRObW9kZSA9IGZhbHNlOworCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBEdW1teSB3aXJsZXNzIG1vZGUgc2V0dGluZyB0byBhdm9pZCBlbmNyeXB0aW9uIGlzc3VlICovCisJCWlmIChiU3VwcG9ydE5tb2RlKSB7CisJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LAorCQkJCQkgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSk7CisJCX0gZWxzZSB7CisJCQkvKlRPRE8qLworCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKKwkJfQorCisJCWlmICgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RykgJiYKKwkJICAgIGJIYWxmU3VwcG9ydE5tb2RlKSB7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICI9PT09PT0+ZW50ZXIgaGFsZiBOIG1vZGVcbiIpOworCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9IGZhbHNlOworCQl9CisJCXJ0bGxpYl9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7CisJfSBlbHNlIHsKKwkJcnRsbGliX2F1dGhfY2hhbGxlbmdlKGllZWUsIGNoYWxsZW5nZSwgIGNobGVuKTsKKwl9Cit9CisKK2lubGluZSBpbnQgcnRsbGliX3J4X2F1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzKQoreworCiAJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSB7CiAJCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgJiYKIAkJICAgIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSB7CiAJCQlSVExMSUJfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2UiKTsKLQotCQkJZXJyY29kZSA9IGF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pOwotCQkJaWYgKDAgPT0gZXJyY29kZSkgewotCQkJCWlmIChpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKSB7Ci0JCQkJCWllZWUtPnN0YXRlID0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7Ci0JCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOwotCQkJCQlpZiAoIShpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gJgotCQkJCQkgICAgSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkpIHsKLQkJCQkJCWlmICghaWVlZS0+R2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcoaWVlZS0+ZGV2KSkgewotCQkJCQkJCWlmIChJc0hUSGFsZk5tb2RlQVBzKGllZWUpKSB7Ci0JCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSB0cnVlOwotCQkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IHRydWU7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYlN1cHBvcnRObW9kZSA9IGZhbHNlOwotCQkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvKiBEdW1teSB3aXJsZXNzIG1vZGUgc2V0dGluZyB0byBhdm9pZAotCQkJCQkgKiBlbmNyeXB0aW9uIGlzc3VlICovCi0JCQkJCWlmIChiU3VwcG9ydE5tb2RlKSB7Ci0JCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LAotCQkJCQkJICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLypUT0RPKi8KLQkJCQkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLT5kZXYsCi0JCQkJCQkJCSAgICAgIElFRUVfRyk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0KLQkJCQkJICAgIElFRUVfTl8yNEcgJiYgYkhhbGZTdXBwb3J0Tm1vZGUpIHsKLQkJCQkJCXByaW50ayhLRVJOX0lORk8gIj09PT09PT5lbnRlciAiCi0JCQkJCQkgICAgICAgImhhbGYgTiBtb2RlXG4iKTsKLQkJCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9Ci0JCQkJCQkJCQkgdHJ1ZTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPQotCQkJCQkJCQkJIGZhbHNlOwotCi0JCQkJCXJ0bGxpYl9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcnRsbGliX2F1dGhfY2hhbGxlbmdlKGllZWUsIGNoYWxsZW5nZSwKLQkJCQkJCQkgICAgICBjaGxlbik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7Ci0JCQkJUlRMTElCX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2UiCi0JCQkJCQkgICIgc3RhdHVzIGNvZGUgMHgleCIsIGVycmNvZGUpOwotCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiQXV0aGVudGljYXRpb24gcmVzcG9zZSAiCi0JCQkJICAgICAgICJzdGF0dXMgY29kZSAweCV4IiwgZXJyY29kZSk7Ci0JCQkJcnRsbGliX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQkJCX0KLQorCQkJcnRsbGliX3J4X2F1dGhfcmVzcChpZWVlLCBza2IpOwogCQl9IGVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKIAkJCXJ0bGxpYl9yeF9hdXRoX3JxKGllZWUsIHNrYik7CiAJCX0KQEAgLTIzODksMTUgKzIzODgsMTUgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBGSVhNRSBmb3Igbm93IHJlcGVhdCBhbGwgdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZQotCSogYm90aCBmb3IgZGlzYXNzb2NpYXRpb24gYW5kIGRlYXV0aGVudGljYXRpb24KLQkqLworCSAqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCisJICovCiAJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKIAkgICAgaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCAmJgogCSAgICAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgewotCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PnJlY2VpdmVkIGRpc2Fzc29jL2RlYXV0aCgleCkgIgotCQkgICAgICAgImZyYW1lLCByZWFzb24gY29kZToleFxuIiwKLQkJICAgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSwKLQkJICAgICAgICgoc3RydWN0IHJ0bGxpYl9kaXNhc3NvYyAqKXNrYi0+ZGF0YSktPnJlYXNvbik7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCSAgICAiPT09PT09PT09PT5yZWNlaXZlZCBkaXNhc3NvYy9kZWF1dGgoJXgpIGZyYW1lLCByZWFzb24gY29kZToleFxuIiwKKwkJCSAgICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCksCisJCQkgICAgKChzdHJ1Y3QgcnRsbGliX2Rpc2Fzc29jICopc2tiLT5kYXRhKS0+cmVhc29uKTsKIAkJaWVlZS0+c3RhdGUgPSBSVExMSUJfQVNTT0NJQVRJTkc7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOwogCQlpZWVlLT5pc19yb2FtaW5nID0gdHJ1ZTsKQEAgLTI0NTAsNyArMjQ0OSw2IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtMTsKLQkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjQ5NCwxNiArMjQ5MiwxNyBAQAogCQlpZWVlLT5zdGF0cy5tdWx0aWNhc3QrKzsKIAogCS8qIGlmIHhtaXQgYXZhaWxhYmxlLCBqdXN0IHhtaXQgaXQgaW1tZWRpYXRlbHksIGVsc2UganVzdCBpbnNlcnQgaXQgdG8KLQkgKiB0aGUgd2FpdCBxdWV1ZSAqLworCSAqIHRoZSB3YWl0IHF1ZXVlCisJICovCiAJZm9yIChpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykgewogCQlxdWV1ZV9sZW4gPSBza2JfcXVldWVfbGVuKCZpZWVlLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKTsKLQkJaWYgKChxdWV1ZV9sZW4gICE9IDApIHx8XAorCQlpZiAoKHF1ZXVlX2xlbiAgIT0gMCkgfHwKIAkJICAgICghaWVlZS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGllZWUtPmRldiwgcXVldWVfaW5kZXgpKSB8fAogCQkgICAgKGllZWUtPnF1ZXVlX3N0b3ApKSB7Ci0JCQkvKiBpbnNlcnQgdGhlIHNrYiBwYWNrZXQgdG8gdGhlIHdhaXQgcXVldWUgKi8KLQkJCS8qIGFzIGZvciB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgaXQgZG9lcyBub3QgbmVlZAorCQkJLyogaW5zZXJ0IHRoZSBza2IgcGFja2V0IHRvIHRoZSB3YWl0IHF1ZXVlCisJCQkgKiBhcyBmb3IgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24sIGl0IGRvZXMgbm90IG5lZWQKIAkJCSAqIHRvIGNoZWNrIGl0IGFueSBtb3JlLgotCQkJICogKi8KKwkJCSAqLwogCQkJaWYgKHF1ZXVlX2xlbiA8IDIwMCkKIAkJCQlza2JfcXVldWVfdGFpbCgmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSwKIAkJCQkJICAgICAgIHR4Yi0+ZnJhZ21lbnRzW2ldKTsKQEAgLTI1MzMsMTMgKzI1MzIsMTIgQEAKIAkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApIHsKIAkJCWllZWUtPnR4X3BlbmRpbmcuZnJhZyA9IGk7CiAJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0KLQkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCi0JCQkJaWVlZS0+dHhfcGVuZGluZy50eGItPmZyYWdtZW50c1tpXSwKLQkJCQlpZWVlLT5kZXYsIGllZWUtPnJhdGUpOwotCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOwogCQl9CisKKwkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCWllZWUtPnR4X3BlbmRpbmcudHhiLT5mcmFnbWVudHNbaV0sCisJCQlpZWVlLT5kZXYsIGllZWUtPnJhdGUpOworCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJfQogCiAJcnRsbGliX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKQEAgLTI2ODgsNyArMjY4Niw3IEBACiAJICogb24gdGhlIHNlbWFwaG9yZQogCSAqLwogCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkgewotCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09b2ggZHJpdmVyIGRvd24gcmV0dXJuXG4iKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiPT09PT09PT09PW9oIGRyaXZlciBkb3duIHJldHVyblxuIik7CiAJCXJldHVybjsKIAl9CiAJZG93bigmaWVlZS0+d3hfc2VtKTsKQEAgLTI3MjQsNyArMjcyMiw3IEBACiAKIAkvKiB0aGUgbmV0d29yayBkZWZpbml0aXZlbHkgaXMgbm90IGhlcmUuLiBjcmVhdGUgYSBuZXcgY2VsbCAqLwogCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTk9MSU5LKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNyZWF0aW5nIG5ldyBJQlNTIGNlbGxcbiIpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJjcmVhdGluZyBuZXcgSUJTUyBjZWxsXG4iKTsKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBpZWVlLT5JYnNzU3RhcnRDaG5sOwogCQlpZiAoIWllZWUtPndhcF9zZXQpCiAJCQlydGxsaWJfcmFuZG9taXplX2NlbGwoaWVlZSk7CkBAIC0yNzc4LDcgKzI3NzYsNyBAQAogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IGllZWUtPm1vZGUgPSAlZFxuIiwgX19mdW5jX18sIGllZWUtPm1vZGUpOworCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzKCk6IGllZWUtPm1vZGUgPSAlZFxuIiwgX19mdW5jX18sIGllZWUtPm1vZGUpOwogCWlmICgoaWVlZS0+bW9kZSA9PSBJRUVFX05fMjRHKSB8fCAoaWVlZS0+bW9kZSA9PSBJRUVFX05fNUcpKQogCQlIVFVzZURlZmF1bHRTZXR0aW5nKGllZWUpOwogCWVsc2UKQEAgLTI4MDgsNyArMjgwNiw4IEBACiAKIGlubGluZSB2b2lkIHJ0bGxpYl9zdGFydF9pYnNzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewotCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2woaWVlZS0+d3EsICZpZWVlLT5zdGFydF9pYnNzX3dxLCBNU0VDUygxNTApKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwKKwkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKDE1MCkpOwogfQogCiAvKiB0aGlzIGlzIGNhbGxlZCBvbmx5IGluIHVzZXIgY29udGV4dCwgd2l0aCB3eF9zZW0gaGVsZCAqLwpAQCAtMjg4MSwxOCArMjg4MCwxOCBAQAogCQlnb3RvIGV4aXQ7CiAKIAkvKiB1bnRpbCB3ZSBkbyBub3Qgc2V0IHRoZSBzdGF0ZSB0byBSVExMSUJfTk9MSU5LCi0JKiB0aGVyZSBhcmUgbm8gcG9zc2liaWxpdHkgdG8gaGF2ZSBzb21lb25lIGVsc2UgdHJ5aW5nCi0JKiB0byBzdGFydCBhbiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgKHdlIGdldCBoZXJlIHdpdGgKLQkqIGllZWUtPnN0YXRlID0gUlRMTElCX0FTU09DSUFUSU5HKS4KLQkqIFdoZW4gd2Ugc2V0IHRoZSBzdGF0ZSB0byBSVExMSUJfTk9MSU5LIGl0IGlzIHBvc3NpYmxlCi0JKiB0aGF0IHRoZSBSWCBwYXRoIHJ1biBhbiBhdHRlbXB0IHRvIGFzc29jaWF0ZSwgYnV0Ci0JKiBib3RoIHJ0bGxpYl9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzIGFuZCB0aGUKLQkqIFJYIHBhdGggd29ya3Mgd2l0aCBpZWVlLT5sb2NrIGhlbGQgc28gdGhlcmUgYXJlIG5vCi0JKiBwcm9ibGVtcy4gSWYgd2UgYXJlIHN0aWxsIGRpc2Fzc29jaWF0ZWQgdGhlbiBzdGFydCBhIHNjYW4uCi0JKiB0aGUgbG9jayBoZXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgbm8gb25lIHRyeSB0byBzdGFydAotCSogYW4gYXNzb2NpYXRpb24gcHJvY2VkdXJlIHdoZW4gd2UgaGF2ZSBqdXN0IGNoZWNrZWQgdGhlCi0JKiBzdGF0ZSBhbmQgd2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHRoZSBzY2FuLgotCSovCisJICogdGhlcmUgYXJlIG5vIHBvc3NpYmlsaXR5IHRvIGhhdmUgc29tZW9uZSBlbHNlIHRyeWluZworCSAqIHRvIHN0YXJ0IGFuIGFzc29jaWF0aW9uIHByb2NlZHVyZSAod2UgZ2V0IGhlcmUgd2l0aAorCSAqIGllZWUtPnN0YXRlID0gUlRMTElCX0FTU09DSUFUSU5HKS4KKwkgKiBXaGVuIHdlIHNldCB0aGUgc3RhdGUgdG8gUlRMTElCX05PTElOSyBpdCBpcyBwb3NzaWJsZQorCSAqIHRoYXQgdGhlIFJYIHBhdGggcnVuIGFuIGF0dGVtcHQgdG8gYXNzb2NpYXRlLCBidXQKKwkgKiBib3RoIHJ0bGxpYl9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzIGFuZCB0aGUKKwkgKiBSWCBwYXRoIHdvcmtzIHdpdGggaWVlZS0+bG9jayBoZWxkIHNvIHRoZXJlIGFyZSBubworCSAqIHByb2JsZW1zLiBJZiB3ZSBhcmUgc3RpbGwgZGlzYXNzb2NpYXRlZCB0aGVuIHN0YXJ0IGEgc2Nhbi4KKwkgKiB0aGUgbG9jayBoZXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgbm8gb25lIHRyeSB0byBzdGFydAorCSAqIGFuIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aGVuIHdlIGhhdmUganVzdCBjaGVja2VkIHRoZQorCSAqIHN0YXRlIGFuZCB3ZSBhcmUgZ29pbmcgdG8gc3RhcnQgdGhlIHNjYW4uCisJICovCiAJaWVlZS0+YmVpbnJldHJ5ID0gdHJ1ZTsKIAlpZWVlLT5zdGF0ZSA9IFJUTExJQl9OT0xJTks7CiAKQEAgLTMxODAsOCArMzE3OSw5IEBACiBzdGF0aWMgaW50IHJ0bGxpYl93cGFfZW5hYmxlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCiB7CiAJLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3cGFfc3VwcGxpY2FudCBsb2FkcyBhbmQgY2xvc2VzIHRoZSBkcml2ZXIKLQkgKiBpbnRlcmZhY2UuICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgV1BBXG4iLCB2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisJICogaW50ZXJmYWNlLgorCSAqLworCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzIFdQQVxuIiwgdmFsdWUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOwogCWllZWUtPndwYV9lbmFibGVkID0gdmFsdWU7CiAJbWVtc2V0KGllZWUtPmFwX21hY19hZGRyLCAwLCA2KTsKIAlyZXR1cm4gMDsKQEAgLTMyMTIsNyArMzIxMiw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBNTE1FIHJlcXVlc3Q6ICVkXG4iLCBjb21tYW5kKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiVW5rbm93biBNTE1FIHJlcXVlc3Q6ICVkXG4iLCBjb21tYW5kKTsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJfQogCkBAIC0zMzQzLDcgKzMzNDMsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gIlVua25vd24gV1BBIHBhcmFtOiAlZFxuIiwgbmFtZSk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIlVua25vd24gV1BBIHBhcmFtOiAlZFxuIiwgbmFtZSk7CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCX0KIApAQCAtMzM2OSw4ICszMzY5LDggQEAKIAlpZiAocGFyYW1fbGVuICE9CiAJICAgIChpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSkgKwogCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkxlbiBtaXNtYXRjaCAlZCwgJWRcbiIsIHBhcmFtX2xlbiwKLQkJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiTGVuIG1pc21hdGNoICVkLCAlZFxuIiwgcGFyYW1fbGVuLAorCQkJICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBhcmFtLT5zdGFfYWRkcikpIHsKQEAgLTM0MTAsOCArMzQxMCw4IEBACiAJCW9wcyA9IGxpYjgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CiAJfQogCWlmIChvcHMgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJ1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwKLQkJICAgICAgIHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgInVua25vd24gY3J5cHRvIGFsZyAnJXMnXG4iLAorCQkJICAgIHBhcmFtLT51LmNyeXB0LmFsZyk7CiAJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CkBAIC0zNDIxLDEyICszNDIxLDExIEBACiAKIAkJbGliODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoJmllZWUtPmNyeXB0X2luZm8sIGNyeXB0KTsKIAotCQluZXdfY3J5cHQgPSBrbWFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7CisJCW5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBkb25lOwogCQl9Ci0JCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgbGliODAyMTFfY3J5cHRfZGF0YSkpOwogCQluZXdfY3J5cHQtPm9wcyA9IG9wczsKIAkJaWYgKG5ld19jcnlwdC0+b3BzKQogCQkJbmV3X2NyeXB0LT5wcml2ID0KQEAgLTM0NDYsNyArMzQ0NSw3IEBACiAJICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkocGFyYW0tPnUuY3J5cHQua2V5LAogCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuLCBwYXJhbS0+dS5jcnlwdC5zZXEsCiAJICAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKIAkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQ7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKQEAgLTM0ODYsMTIgKzM0ODUsMTMgQEAKIAkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCiAJICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKIAkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KLQkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLgorCSAqLwogCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKIAkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCiAJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYKIAkgICAgaWVlZS0+cmVzZXRfcG9ydChpZWVlLT5kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJlc2V0X3BvcnQgZmFpbGVkXG4iKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAicmVzZXRfcG9ydCBmYWlsZWRcbiIpOwogCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVEOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0zNjM0LDggKzM2MzQsOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gIlVua25vd24gV1BBIHN1cHBsaWNhbnQgcmVxdWVzdDogJWRcbiIsCi0JCSAgICAgICBwYXJhbS0+Y21kKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiVW5rbm93biBXUEEgc3VwcGxpY2FudCByZXF1ZXN0OiAlZFxuIiwKKwkJCSAgICBwYXJhbS0+Y21kKTsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOwogCX0KQEAgLTM3NDksOSArMzc0OSw5IEBACiAJCSAgICAgICBFVEhfQUxFTik7CiAJZWxzZSB7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogVGVsbCB1c2VyIHNwYWNlIGRpc2Nvbm5lY3RlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzKCk6IFRlbGwgdXNlciBzcGFjZSBkaXNjb25uZWN0ZWRcbiIsCisJCQkgICAgX19mdW5jX18pOworCQlldGhfemVyb19hZGRyKHdycXUuYXBfYWRkci5zYV9kYXRhKTsKIAl9CiAJd2lyZWxlc3Nfc2VuZF9ldmVudChpZWVlLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWNfd3guYwppbmRleCA4MzVmM2Q3Li45NzE1YTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWNfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWNfd3guYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJCWllZWUtPnN0YXRlICE9IFJUTExJQl9MSU5LRURfU0NBTk5JTkcgJiYKIAkJaWVlZS0+d2FwX3NldCA9PSAwKQogCi0JCW1lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcih3cnF1LT5hcF9hZGRyLnNhX2RhdGEpOwogCWVsc2UKIAkJbWVtY3B5KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwKIAkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOwpAQCAtNTI3LDggKzUyNyw4IEBACiAJZWxzZQogCQlpZWVlLT5yYXdfdHggPSAwOwogCi0JcHJpbnRrKEtFUk5fSU5GTyJyYXcgVFggaXMgJXNcbiIsCi0JICAgICAgaWVlZS0+cmF3X3R4ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAicmF3IFRYIGlzICVzXG4iLAorCQkgICAgaWVlZS0+cmF3X3R4ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAKIAlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKIAkJaWYgKHByZXYgPT0gMCAmJiBpZWVlLT5yYXdfdHgpIHsKQEAgLTU3NSw4ICs1NzUsOSBAQAogCWlmICgoIWllZWUtPnN0YV93YWtlX3VwKSB8fAogCSAgICAoIWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKSB8fAogCSAgICAoIWllZWUtPnBzX2lzX3F1ZXVlX2VtcHR5KSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIiVzKCk6IFBTIG1vZGUgaXMgdHJpZWQgdG8gYmUgdXNlICIKLQkJCSAgICAgImJ1dCBkcml2ZXIgbWlzc2VkIGEgY2FsbGJhY2tcblxuIiwgX19mdW5jX18pOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIiVzKCk6IFBTIG1vZGUgaXMgdHJpZWQgdG8gYmUgdXNlIGJ1dCBkcml2ZXIgbWlzc2VkIGEgY2FsbGJhY2tcblxuIiwKKwkJCSAgICAgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKaW5kZXggNGY2OGZmZS4uM2IxNTk2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYwpAQCAtNTMsMTAyICs1Myw5OSBAQAogCiAjaW5jbHVkZSAicnRsbGliLmgiCiAKLS8qCi0KLQotODAyLjExIERhdGEgRnJhbWUKLQotCi04MDIuMTEgZnJhbWVfY29udHJvbCBmb3IgZGF0YSBmcmFtZXMgLSAyIGJ5dGVzCi0gICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLWJpdHMgfCAwICB8ICAxICB8ICAyICB8ICAzICB8ICA0ICB8ICA1ICB8ICA2ICB8ICA3ICB8ICA4ICB8ICA5ICB8ICBhICB8ICBiICB8ICBjICB8ICBkICB8ICBlICAgfAotICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18Ci12YWwgIHwgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgeCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgMCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgIHwKLSAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAotZGVzYyB8IF4tdmVyLV4gIHwgIF50eXBlLV4gIHwgIF4tLS0tLXN1YnR5cGUtLS0tLV4gIHwgdG8gIHxmcm9tIHxtb3JlIHxyZXRyeXwgcHdyIHxtb3JlIHx3ZXAgICB8Ci0gICAgIHwJICB8CSAgIHwgeD0wIGRhdGEseD0xIGRhdGErYWNrIHwgRFMgIHwgRFMgIHxmcmFnIHwgICAgIHwgbWdtIHxkYXRhIHwgICAgICB8Ci0gICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLQkJCQkJCSAgICAvXAotCQkJCQkJICAgIHwKLTgwMi4xMSBEYXRhIEZyYW1lCQkJCSAgIHwKLQkgICAsLS0tLS0tLS0tICdjdHJsJyBleHBhbmRzIHRvID4tLS0tLS0tLS0tLScKLQkgIHwKLSAgICAgICwtLSctLS0sLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAotICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18Ci1EZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBGcmFtZSAgfCAgZmNzIHwKLSAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwJIHwJIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKLSAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwJIHwtLS0tLS0nCi1Ub3RhbDogMjggbm9uLWRhdGEgYnl0ZXMJCQkJIGAtLS0tLi0tLS0nCi0JCQkJCQkJICAgICAgfAotICAgICAgIC4tICdGcmFtZSBkYXRhJyBleHBhbmRzIHRvIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi0gICAgICAgfAotICAgICAgIFYKLSAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi1CeXRlcyB8ICAxICAgfCAgMSAgIHwgICAgMSAgICB8ICAgIDMgICAgIHwgIDIgICB8ICAwLTIzMDQgfAotICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwKLURlc2MuIHwgU05BUCB8IFNOQVAgfCBDb250cm9sIHxFdGggVHVubmVsfCBUeXBlIHwgSVAgICAgICB8Ci0gICAgICB8IERTQVAgfCBTU0FQIHwJIHwJICB8ICAgICAgfCBQYWNrZXQgIHwKLSAgICAgIHwgMHhBQSB8IDB4QUEgfDB4MDMgKFVJKXwweDAwLTAwLUY4fCAgICAgIHwJIHwKLSAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwJIHwKLVRvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzCQkJIGAtLS0tLi0tLS0nCi0JCQkJCQkgICAgIHwKLSAgICAgICAuLSAnSVAgUGFja2V0JyBleHBhbmRzLCBpZiBXRVAgZW5hYmxlZCwgdG8gPC0tJwotICAgICAgIHwKLSAgICAgICBWCi0gICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi1CeXRlcyB8ICA0ICB8ICAgMC0yMjk2ICB8ICA0ICB8Ci0gICAgICB8LS0tLS18LS0tLS0tLS0tLS18LS0tLS18Ci1EZXNjLiB8IElWICB8IEVuY3J5cHRlZCB8IElDViB8Ci0gICAgICB8ICAgICB8IElQIFBhY2tldCB8ICAgICB8Ci0gICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi1Ub3RhbDogOCBub24tZGF0YSBieXRlcwotCi0KLTgwMi4zIEV0aGVybmV0IERhdGEgRnJhbWUKLQotICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotQnl0ZXMgfCAgIDYgICB8ICAgNiAgIHwgIDIgICB8ICBWYXJpYWJsZSB8ICAgNCAgfAotICAgICAgfC0tLS0tLS18LS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfAotRGVzYy4gfCBEZXN0LiB8IFNvdXJjZXwgVHlwZSB8IElQIFBhY2tldCB8ICBmY3MgfAotICAgICAgfCAgTUFDICB8ICBNQUMgIHwgICAgICB8CSAgIHwgICAgICB8Ci0gICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi1Ub3RhbDogMTggbm9uLWRhdGEgYnl0ZXMKLQotSW4gdGhlIGV2ZW50IHRoYXQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZCwgdGhlIGluY29taW5nIHBheWxvYWQgaXMgc3BsaXQgaW50bwotTiBwYXJ0cyBvZiBzaXplIGllZWUtPmZ0cy4gIFRoZSBmaXJzdCBmcmFnbWVudCBjb250YWlucyB0aGUgU05BUCBoZWFkZXIgYW5kIHRoZQotcmVtYWluaW5nIHBhY2tldHMgYXJlIGp1c3QgZGF0YS4KLQotSWYgZW5jcnlwdGlvbiBpcyBlbmFibGVkLCBlYWNoIGZyYWdtZW50IHBheWxvYWQgc2l6ZSBpcyByZWR1Y2VkIGJ5IGVub3VnaCBzcGFjZQotdG8gYWRkIHRoZSBwcmVmaXggYW5kIHBvc3RmaXggKElWIGFuZCBJQ1YgdG90YWxsaW5nIDggYnl0ZXMgaW4gdGhlIGNhc2Ugb2YgV0VQKQotU28gaWYgeW91IGhhdmUgMTUwMCBieXRlcyBvZiBwYXlsb2FkIHdpdGggaWVlZS0+ZnRzIHNldCB0byA1MDAgd2l0aG91dAotZW5jcnlwdGlvbiBpdCB3aWxsIHRha2UgMyBmcmFtZXMuICBXaXRoIFdFUCBpdCB3aWxsIHRha2UgNCBmcmFtZXMgYXMgdGhlCi1wYXlsb2FkIG9mIGVhY2ggZnJhbWUgaXMgcmVkdWNlZCB0byA0OTIgYnl0ZXMuCi0KLSogU0tCIHZpc3VhbGl6YXRpb24KLSoKLSogICwtIHNrYi0+ZGF0YQotKiB8Ci0qIHwgICAgRVRIRVJORVQgSEVBREVSCSwtPC0tIFBBWUxPQUQKLSogfAkJCSAgIHwgICAgIDE0IGJ5dGVzIGZyb20gc2tiLT5kYXRhCi0qIHwgIDIgYnl0ZXMgZm9yIFR5cGUgLS0+ICxULiB8ICAgICAoc2l6ZW9mIGV0aGhkcikKLSogfAkJICAgICAgIHwgfCB8Ci0qIHwsLURlc3QuLS0uICwtLVNyYy4tLS0uIHwgfCB8Ci0qIHwgIDYgYnl0ZXN8IHwgNiBieXRlcyB8IHwgfCB8Ci0qIHYJIHwgfAkgfCB8IHwgfAotKiAwCSB8IHYgICAgICAgMSB8IHYgfCB2CSAgIDIKLSogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1Ci0qICAgICBeICAgICB8IF4JIHwgXiB8Ci0qICAgICB8ICAgICB8IHwJIHwgfCB8Ci0qICAgICB8ICAgICB8IHwJIHwgYFQnIDwtLS0tIDIgYnl0ZXMgZm9yIFR5cGUKLSogICAgIHwgICAgIHwgfAkgfAotKiAgICAgfCAgICAgfCAnLS0tU05BUC0tJyA8LS0tLS0tLS0gNiBieXRlcyBmb3IgU05BUAotKiAgICAgfCAgICAgfAotKiAgICAgYC1JVi0tJyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0gNCBieXRlcyBmb3IgSVYgKFdFUCkKLSoKLSogICAgICBTTkFQIEhFQURFUgotKgotKi8KKy8qIDgwMi4xMSBEYXRhIEZyYW1lCisgKgorICoKKyAqIDgwMi4xMSBmcmFtZV9jb250cm9sIGZvciBkYXRhIGZyYW1lcyAtIDIgYnl0ZXMKKyAqICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogYml0cyB8IDAgIHwgIDEgIHwgIDIgIHwgIDMgIHwgIDQgIHwgIDUgIHwgIDYgIHwgIDcgIHwgIDggIHwgIDkgIHwgIGEgIHwgIGIgIHwgIGMgIHwgIGQgIHwgIGUgICB8CisgKiAgICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKKyAqIHZhbCAgfCAwICB8ICAwICB8ICAwICB8ICAxICB8ICB4ICB8ICAwICB8ICAwICB8ICAwICB8ICAxICB8ICAwICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICAgfAorICogICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18CisgKiBkZXNjIHwgXi12ZXItXiAgfCAgXnR5cGUtXiAgfCAgXi0tLS0tc3VidHlwZS0tLS0tXiAgfCB0byAgfGZyb20gfG1vcmUgfHJldHJ5fCBwd3IgfG1vcmUgfHdlcCAgIHwKKyAqICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICB8IHg9MCBkYXRhLHg9MSBkYXRhK2FjayB8IERTICB8IERTICB8ZnJhZyB8ICAgICB8IG1nbSB8ZGF0YSB8ICAgICAgfAorICogICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIDgwMi4xMSBEYXRhIEZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgLC0tLS0tLS0tLSAnY3RybCcgZXhwYW5kcyB0byA+LS0tLS0tLS0tLS0nCisgKiAgICAgICAgICB8CisgKiAgICAgICAsLS0nLS0tLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiBCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAqICAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorICogRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgRnJhbWUgIHwgIGZjcyB8CisgKiAgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAqICAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICB8LS0tLS0tJworICogVG90YWw6IDI4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYC0tLS0uLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgIC4tICdGcmFtZSBkYXRhJyBleHBhbmRzIHRvIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgKiAgICAgICAgfAorICogICAgICAgIFYKKyAqICAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiBCeXRlcyB8ICAxICAgfCAgMSAgIHwgICAgMSAgICB8ICAgIDMgICAgIHwgIDIgICB8ICAwLTIzMDQgfAorICogICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwKKyAqIERlc2MuIHwgU05BUCB8IFNOQVAgfCBDb250cm9sIHxFdGggVHVubmVsfCBUeXBlIHwgSVAgICAgICB8CisgKiAgICAgICB8IERTQVAgfCBTU0FQIHwgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8IFBhY2tldCAgfAorICogICAgICAgfCAweEFBIHwgMHhBQSB8MHgwMyAoVUkpfDB4MDAtMDAtRjh8ICAgICAgfCAgICAgICAgIHwKKyAqICAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICB8CisgKiBUb3RhbDogOCBub24tZGF0YSBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgLi0gJ0lQIFBhY2tldCcgZXhwYW5kcywgaWYgV0VQIGVuYWJsZWQsIHRvIDwtLScKKyAqICAgICAgICB8CisgKiAgICAgICAgVgorICogICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogQnl0ZXMgfCAgNCAgfCAgIDAtMjI5NiAgfCAgNCAgfAorICogICAgICAgfC0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tfAorICogRGVzYy4gfCBJViAgfCBFbmNyeXB0ZWQgfCBJQ1YgfAorICogICAgICAgfCAgICAgfCBJUCBQYWNrZXQgfCAgICAgfAorICogICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICogVG90YWw6IDggbm9uLWRhdGEgYnl0ZXMKKyAqCisgKgorICogODAyLjMgRXRoZXJuZXQgRGF0YSBGcmFtZQorICoKKyAqICAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyAqIEJ5dGVzIHwgICA2ICAgfCAgIDYgICB8ICAyICAgfCAgVmFyaWFibGUgfCAgIDQgIHwKKyAqICAgICAgIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLXwKKyAqIERlc2MuIHwgRGVzdC4gfCBTb3VyY2V8IFR5cGUgfCBJUCBQYWNrZXQgfCAgZmNzIHwKKyAqICAgICAgIHwgIE1BQyAgfCAgTUFDICB8ICAgICAgfAkgICB8ICAgICAgfAorICogICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICogVG90YWw6IDE4IG5vbi1kYXRhIGJ5dGVzCisgKgorICogSW4gdGhlIGV2ZW50IHRoYXQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZCwgdGhlIGluY29taW5nIHBheWxvYWQgaXMgc3BsaXQgaW50bworICogTiBwYXJ0cyBvZiBzaXplIGllZWUtPmZ0cy4gIFRoZSBmaXJzdCBmcmFnbWVudCBjb250YWlucyB0aGUgU05BUCBoZWFkZXIgYW5kIHRoZQorICogcmVtYWluaW5nIHBhY2tldHMgYXJlIGp1c3QgZGF0YS4KKyAqCisgKiBJZiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGVhY2ggZnJhZ21lbnQgcGF5bG9hZCBzaXplIGlzIHJlZHVjZWQgYnkgZW5vdWdoIHNwYWNlCisgKiB0byBhZGQgdGhlIHByZWZpeCBhbmQgcG9zdGZpeCAoSVYgYW5kIElDViB0b3RhbGxpbmcgOCBieXRlcyBpbiB0aGUgY2FzZSBvZiBXRVApCisgKiBTbyBpZiB5b3UgaGF2ZSAxNTAwIGJ5dGVzIG9mIHBheWxvYWQgd2l0aCBpZWVlLT5mdHMgc2V0IHRvIDUwMCB3aXRob3V0CisgKiBlbmNyeXB0aW9uIGl0IHdpbGwgdGFrZSAzIGZyYW1lcy4gIFdpdGggV0VQIGl0IHdpbGwgdGFrZSA0IGZyYW1lcyBhcyB0aGUKKyAqIHBheWxvYWQgb2YgZWFjaCBmcmFtZSBpcyByZWR1Y2VkIHRvIDQ5MiBieXRlcy4KKyAqCisgKiBTS0IgdmlzdWFsaXphdGlvbgorICoKKyAqICwtIHNrYi0+ZGF0YQorICogfAorICogfCAgICBFVEhFUk5FVCBIRUFERVIgICAgICAgICwtPC0tIFBBWUxPQUQKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAxNCBieXRlcyBmcm9tIHNrYi0+ZGF0YQorICogfCAgMiBieXRlcyBmb3IgVHlwZSAtLT4gLFQuIHwgICAgIChzaXplb2YgZXRoaGRyKQorICogfCAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyAqIHwsLURlc3QuLS0uICwtLVNyYy4tLS0uIHwgfCB8CisgKiB8ICA2IGJ5dGVzfCB8IDYgYnl0ZXMgfCB8IHwgfAorICogdiAgICAgICAgIHwgfCAgICAgICAgIHwgfCB8IHwKKyAqIDAgICAgICAgICB8IHYgICAgICAgMSB8IHYgfCB2ICAgICAgICAgICAyCisgKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKKyAqICAgICBeICAgICB8IF4gICAgICAgICB8IF4gfAorICogICAgIHwgICAgIHwgfCAgICAgICAgIHwgfCB8CisgKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCBgVCcgPC0tLS0gMiBieXRlcyBmb3IgVHlwZQorICogICAgIHwgICAgIHwgfCAgICAgICAgIHwKKyAqICAgICB8ICAgICB8ICctLS1TTkFQLS0nIDwtLS0tLS0tLSA2IGJ5dGVzIGZvciBTTkFQCisgKiAgICAgfCAgICAgfAorICogICAgIGAtSVYtLScgPC0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgYnl0ZXMgZm9yIElWIChXRVApCisgKgorICogICAgICBTTkFQIEhFQURFUgorICoKKyAqLwogCiBzdGF0aWMgdTggUDgwMl8xSF9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweGY4IH07CiBzdGF0aWMgdTggUkZDMTA0Ml9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweDAwIH07CkBAIC0xODUsMTQgKzE4MiwxNyBAQAogCWNyeXB0ID0gaWVlZS0+Y3J5cHRfaW5mby5jcnlwdFtpZWVlLT5jcnlwdF9pbmZvLnR4X2tleWlkeF07CiAKIAlpZiAoIShjcnlwdCAmJiBjcnlwdC0+b3BzKSkgewotCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT0+JXMoKSwgY3J5cHQgaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICI9PT09PT09PT0+JXMoKSwgY3J5cHQgaXMgbnVsbFxuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CiAJLyogVG8gZW5jcnlwdCwgZnJhbWUgZm9ybWF0IGlzOgotCSAqIElWICg0IGJ5dGVzKSwgY2xlYXIgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVApLCBJQ1YgKDQgYnl0ZXMpICovCisJICogSVYgKDQgYnl0ZXMpLCBjbGVhciBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCksIElDViAoNCBieXRlcykKKwkgKi8KIAogCS8qIEhvc3QtYmFzZWQgSUVFRSA4MDIuMTEgZnJhZ21lbnRhdGlvbiBmb3IgVFggaXMgbm90IHlldCBzdXBwb3J0ZWQsIHNvCi0JICogY2FsbCBib3RoIE1TRFUgYW5kIE1QRFUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgZnJvbSBoZXJlLiAqLworCSAqIGNhbGwgYm90aCBNU0RVIGFuZCBNUERVIGVuY3J5cHRpb24gZnVuY3Rpb25zIGZyb20gaGVyZS4KKwkgKi8KIAlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKIAlyZXMgPSAwOwogCWlmIChjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUpCkBAIC0yMDIsOCArMjAyLDggQEAKIAogCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOwogCWlmIChyZXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmNyeXB0aW9uIGZhaWxlZDogbGVuPSVkLlxuIiwKLQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgZnJhZy0+bGVuKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXM6IEVuY3J5cHRpb24gZmFpbGVkOiBsZW49JWQuXG4iLAorCQkJICAgIGllZWUtPmRldi0+bmFtZSwgZnJhZy0+bGVuKTsKIAkJaWVlZS0+aWVlZV9zdGF0cy50eF9kaXNjYXJkcysrOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzExLDcgKzMxMSw3IEBACiAJaWYgKHBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpIHsKIAkJaWYgKCFHZXRUcyhpZWVlLCAoc3RydWN0IHRzX2NvbW1vbl9pbmZvICoqKSgmcFR4VHMpLCBoZHItPmFkZHIxLAogCQkgICAgc2tiLT5wcmlvcml0eSwgVFhfRElSLCB0cnVlKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IGdldCBUU1xuIiwgX19mdW5jX18pOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXM6IGNhbid0IGdldCBUU1xuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLmJWYWxpZCA9PSBmYWxzZSkgewpAQCAtNDEyLDYgKzQxMiw4IEBACiAJCQkJCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbzsKKwogCXRjYl9kZXNjLT5iUlRTU1RCQwkJCT0gZmFsc2U7CiAJdGNiX2Rlc2MtPmJSVFNVc2VTaG9ydEdJCQk9IGZhbHNlOwogCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCQkJPSBmYWxzZTsKQEAgLTQzNCw1MCArNDM2LDUwIEBACiAJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOwogCQl9CiAJCXJldHVybjsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJfQogCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAocEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEYpIHsKLQkJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZQk9IHRydWU7Ci0JCQkJdGNiX2Rlc2MtPnJ0c19yYXRlICA9CU1HTl8yNE07Ci0JCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChwSFRJbmZvLT5JT1RBY3Rpb24gJiAoSFRfSU9UX0FDVF9GT1JDRURfUlRTIHwKLQkJCQkgICBIVF9JT1RfQUNUX1BVUkVfTl9NT0RFKSkgewotCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKLQkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgID0JTUdOXzI0TTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnVzZXByb3RlY3Rpb24pIHsKLQkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7Ci0JCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUgPSB0cnVlOwotCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgICYmIHBIVEluZm8tPmJFbmFibGVIVCkgewotCQkJCXU4IEhUT3BNb2RlID0gcEhUSW5mby0+Q3VycmVudE9wTW9kZTsKKwlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKIAotCQkJCWlmICgocEhUSW5mby0+YkN1ckJXNDBNSHogJiYgKEhUT3BNb2RlID09IDIgfHwKLQkJCQkgICAgIEhUT3BNb2RlID09IDMpKSB8fAotCQkJCSAgICAgKCFwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiBIVE9wTW9kZSA9PSAzKSkgewotCQkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOwotCQkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChza2ItPmxlbiA+IGllZWUtPnJ0cykgewotCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07Ci0JCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHRjYl9kZXNjLT5iQU1QRFVFbmFibGUpIHsKLQkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOwotCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIE5PX1BST1RFQ1RJT047CisJd2hpbGUgKHRydWUpIHsKKwkJaWYgKHBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGKSB7CisJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZQk9IHRydWU7CisJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgID0JTUdOXzI0TTsKKwkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHBIVEluZm8tPklPVEFjdGlvbiAmIChIVF9JT1RfQUNUX0ZPUkNFRF9SVFMgfAorCQkJICAgSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkpIHsKKwkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5ydHNfcmF0ZSAgPQlNR05fMjRNOworCQkJYnJlYWs7CiAJCX0KKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbikgeworCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAgJiYgcEhUSW5mby0+YkVuYWJsZUhUKSB7CisJCQl1OCBIVE9wTW9kZSA9IHBIVEluZm8tPkN1cnJlbnRPcE1vZGU7CisKKwkJCWlmICgocEhUSW5mby0+YkN1ckJXNDBNSHogJiYgKEhUT3BNb2RlID09IDIgfHwKKwkJCSAgICAgSFRPcE1vZGUgPT0gMykpIHx8CisJCQkgICAgICghcEhUSW5mby0+YkN1ckJXNDBNSHogJiYgSFRPcE1vZGUgPT0gMykpIHsKKwkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoc2tiLT5sZW4gPiBpZWVlLT5ydHMpIHsKKwkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CisJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlpZiAodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgeworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCQlnb3RvIE5PX1BST1RFQ1RJT047CiAJfQogCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKIAkJdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gdHJ1ZTsKQEAgLTU0OSw2ICs1NTEsMTcgQEAKIAl9CiB9CiAKK3N0YXRpYyB1OCBydGxsaWJfY3VycmVudF9yYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5tb2RlICYgSUVFRV9NT0RFX01BU0spCisJCXJldHVybiBpZWVlLT5yYXRlOworCisJaWYgKGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSkKKwkJcmV0dXJuIGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZTsKKwllbHNlCisJCXJldHVybiBpZWVlLT5yYXRlICYgMHg3RjsKK30KKwogaW50IHJ0bGxpYl94bWl0X2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSAoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKikKQEAgLTU3NywyMSArNTkwLDIxIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogCS8qIElmIHRoZXJlIGlzIG5vIGRyaXZlciBoYW5kbGVyIHRvIHRha2UgdGhlIFRYQiwgZG9uJ3QgYm90aGVyCi0JICogY3JlYXRpbmcgaXQuLi4gKi8KKwkgKiBjcmVhdGluZyBpdC4uLgorCSAqLwogCWlmICgoIWllZWUtPmhhcmRfc3RhcnRfeG1pdCAmJiAhKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJgogCSAgIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpIHx8CiAJICAgKCghaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCAmJgogCSAgIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKSkpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyB4bWl0IGhhbmRsZXIuXG4iLAotCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJbmV0ZGV2X3dhcm4oaWVlZS0+ZGV2LCAiTm8geG1pdCBoYW5kbGVyLlxuIik7CiAJCWdvdG8gc3VjY2VzczsKIAl9CiAKIAogCWlmIChsaWtlbHkoaWVlZS0+cmF3X3R4ID09IDApKSB7CiAJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IFNOQVBfU0laRSArIHNpemVvZih1MTYpKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCi0JCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCW5ldGRldl93YXJuKGllZWUtPmRldiwgInNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQkJICAgIHNrYi0+bGVuKTsKIAkJCWdvdG8gc3VjY2VzczsKIAkJfQogCQkvKiBTYXZlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzICovCkBAIC02MDQsOSArNjE3LDggQEAKIAkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CiAJCQl0eGIgPSBydGxsaWJfYWxsb2NfdHhiKDEsIHNrYi0+bGVuLCBHRlBfQVRPTUlDKTsKIAkJCWlmICh1bmxpa2VseSghdHhiKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgIgotCQkJCSAgICAgICAiVFhCXG4iLAotCQkJCWllZWUtPmRldi0+bmFtZSk7CisJCQkJbmV0ZGV2X3dhcm4oaWVlZS0+ZGV2LAorCQkJCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIpOwogCQkJCWdvdG8gZmFpbGVkOwogCQkJfQogCkBAIC02MzYsOCArNjQ4LDggQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0gZWxzZSBpZiAoRVRIX1BfQVJQID09IGV0aGVyX3R5cGUpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT5ESENQICIKLQkJCQkgICAgICAgIlByb3RvY29sIHN0YXJ0IHR4IEFSUCBwa3QhIVxuIik7CisJCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCQkgICAgIj09PT09PT09PT09PT09PT09PkRIQ1AgUHJvdG9jb2wgc3RhcnQgdHggQVJQIHBrdCEhXG4iKTsKIAkJCQliZGhjcCA9IHRydWU7CiAJCQkJaWVlZS0+TFBTRGVsYXlDbnQgPQogCQkJCQkgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnRpbS50aW1fY291bnQ7CkBAIC02ODAsNyArNjkyLDggQEAKIAkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgewogCQkJZmMgfD0gUlRMTElCX0ZDVExfVE9EUzsKIAkJCS8qIFRvIERTOiBBZGRyMSA9IEJTU0lELCBBZGRyMiA9IFNBLAotCQkJQWRkcjMgPSBEQSAqLworCQkJICogQWRkcjMgPSBEQQorCQkJICovCiAJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLAogCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCAmc3JjLCBFVEhfQUxFTik7CkBAIC02OTEsNyArNzA0LDggQEAKIAkJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgJmRlc3QsIEVUSF9BTEVOKTsKIAkJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJCS8qIG5vdCBGcm9tL1RvIERTOiBBZGRyMSA9IERBLCBBZGRyMiA9IFNBLAotCQkJQWRkcjMgPSBCU1NJRCAqLworCQkJICogQWRkcjMgPSBCU1NJRAorCQkJICovCiAJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOwogCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIHNyYywgRVRIX0FMRU4pOwogCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwKQEAgLTcwMyw3ICs3MTcsOCBAQAogCQloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZmMpOwogCiAJCS8qIERldGVybWluZSBmcmFnbWVudGF0aW9uIHNpemUgYmFzZWQgb24gZGVzdGluYXRpb24gKG11bHRpY2FzdAotCQkqIGFuZCBicm9hZGNhc3QgYXJlIG5vdCBmcmFnbWVudGVkKSAqLworCQkgKiBhbmQgYnJvYWRjYXN0IGFyZSBub3QgZnJhZ21lbnRlZCkKKwkJICovCiAJCWlmIChiSXNNdWx0aWNhc3QpIHsKIAkJCWZyYWdfc2l6ZSA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKIAkJCXFvc19jdGwgfD0gUU9TX0NUTF9OT1RDT05UQUlOX0FDSzsKQEAgLTcxNywxMCArNzMyLDExIEBACiAKIAkJLyogaW4gY2FzZSB3ZSBhcmUgYSBjbGllbnQgdmVyaWZ5IGFjbSBpcyBub3Qgc2V0IGZvciB0aGlzIGFjICovCiAJCXdoaWxlICh1bmxpa2VseShpZWVlLT53bW1fYWNtICYgKDB4MDEgPDwgc2tiLT5wcmlvcml0eSkpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJza2ItPnByaW9yaXR5ID0gJXhcbiIsIHNrYi0+cHJpb3JpdHkpOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAic2tiLT5wcmlvcml0eSA9ICV4XG4iLAorCQkJCSAgICBza2ItPnByaW9yaXR5KTsKIAkJCWlmICh3bWVfZG93bmdyYWRlX2FjKHNrYikpCiAJCQkJYnJlYWs7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJjb252ZXJ0ZWQgc2tiLT5wcmlvcml0eSA9ICV4XG4iLAorCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiY29udmVydGVkIHNrYi0+cHJpb3JpdHkgPSAleFxuIiwKIAkJCSAgICAgICBza2ItPnByaW9yaXR5KTsKIAkJIH0KIAkJCXFvc19jdGwgfD0gc2tiLT5wcmlvcml0eTsKQEAgLTczMSwxNCArNzQ3LDE2IEBACiAJCS8qIERldGVybWluZSBhbW91bnQgb2YgcGF5bG9hZCBwZXIgZnJhZ21lbnQuICBSZWdhcmRsZXNzIG9mIGlmCiAJCSAqIHRoaXMgc3RhY2sgaXMgcHJvdmlkaW5nIHRoZSBmdWxsIDgwMi4xMSBoZWFkZXIsIG9uZSB3aWxsCiAJCSAqIGV2ZW50dWFsbHkgYmUgYWZmaXhlZCB0byB0aGlzIGZyYWdtZW50IC0tIHNvIHdlIG11c3QgYWNjb3VudAotCQkgKiBmb3IgaXQgd2hlbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIHBheWxvYWQgc3BhY2UuICovCisJCSAqIGZvciBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4KKwkJICovCiAJCWJ5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gaGRyX2xlbjsKIAkJaWYgKGllZWUtPmNvbmZpZyAmCiAJCSAgIChDRkdfUlRMTElCX0NPTVBVVEVfRkNTIHwgQ0ZHX1JUTExJQl9SRVNFUlZFX0ZDUykpCiAJCQlieXRlc19wZXJfZnJhZyAtPSBSVExMSUJfRkNTX0xFTjsKIAogCQkvKiBFYWNoIGZyYWdtZW50IG1heSBuZWVkIHRvIGhhdmUgcm9vbSBmb3IgZW5jcnlwdGluZwotCQkgKiBwcmUvcG9zdGZpeCAqLworCQkgKiBwcmUvcG9zdGZpeAorCQkgKi8KIAkJaWYgKGVuY3J5cHQpIHsKIAkJCWJ5dGVzX3Blcl9mcmFnIC09IGNyeXB0LT5vcHMtPmV4dHJhX21wZHVfcHJlZml4X2xlbiArCiAJCQkJY3J5cHQtPm9wcy0+ZXh0cmFfbXBkdV9wb3N0Zml4X2xlbiArCkBAIC03NDYsNyArNzY0LDggQEAKIAkJCQljcnlwdC0+b3BzLT5leHRyYV9tc2R1X3Bvc3RmaXhfbGVuOwogCQl9CiAJCS8qIE51bWJlciBvZiBmcmFnbWVudHMgaXMgdGhlIHRvdGFsIGJ5dGVzX3Blcl9mcmFnIC8KLQkJKiBwYXlsb2FkX3Blcl9mcmFnbWVudCAqLworCQkgKiBwYXlsb2FkX3Blcl9mcmFnbWVudAorCQkgKi8KIAkJbnJfZnJhZ3MgPSBieXRlcyAvIGJ5dGVzX3Blcl9mcmFnOwogCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlcyAlIGJ5dGVzX3Blcl9mcmFnOwogCQlpZiAoYnl0ZXNfbGFzdF9mcmFnKQpAQCAtNzU2LDEyICs3NzUsMTIgQEAKIAogCQkvKiBXaGVuIHdlIGFsbG9jYXRlIHRoZSBUWEIgd2UgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUKIAkJICogcmVzZXJ2ZSBhbmQgZnVsbCBmcmFnbWVudCBieXRlcyAoYnl0ZXNfcGVyX2ZyYWcgZG9lc24ndAotCQkgKiBpbmNsdWRlIHByZWZpeCwgcG9zdGZpeCwgaGVhZGVyLCBGQ1MsIGV0Yy4pICovCisJCSAqIGluY2x1ZGUgcHJlZml4LCBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikKKwkJICovCiAJCXR4YiA9IHJ0bGxpYl9hbGxvY190eGIobnJfZnJhZ3MsIGZyYWdfc2l6ZSArCiAJCQkJICAgICAgIGllZWUtPnR4X2hlYWRyb29tLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHVubGlrZWx5KCF0eGIpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIiwKLQkJCWllZWUtPmRldi0+bmFtZSk7CisJCQluZXRkZXZfd2FybihpZWVlLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iKTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9CiAJCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKQEAgLTgwMSw3ICs4MjAsOCBAQAogCQkJbWVtY3B5KGZyYWdfaGRyLCAmaGVhZGVyLCBoZHJfbGVuKTsKIAogCQkJLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgZnJhZ21lbnQsIHRoZW4gYWRkIHRoZQotCQkJICogTU9SRUZSQUdTIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbCAqLworCQkJICogTU9SRUZSQUdTIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbAorCQkJICovCiAJCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKIAkJCQlmcmFnX2hkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoCiAJCQkJCWZjIHwgUlRMTElCX0ZDVExfTU9SRUZSQUdTKTsKQEAgLTgzNiw3ICs4NTYsOCBAQAogCiAJCQkvKiBFbmNyeXB0aW9uIHJvdXRpbmUgd2lsbCBtb3ZlIHRoZSBoZWFkZXIgZm9yd2FyZCBpbgogCQkJICogb3JkZXIgdG8gaW5zZXJ0IHRoZSBJViBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZQotCQkJICogcGF5bG9hZCAqLworCQkJICogcGF5bG9hZAorCQkJICovCiAJCQlpZiAoZW5jcnlwdCkKIAkJCQlydGxsaWJfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2JfZnJhZywKIAkJCQkJCQloZHJfbGVuKTsKQEAgLTg1OCwxNSArODc5LDE0IEBACiAJCX0KIAl9IGVsc2UgewogCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCi0JCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCW5ldGRldl93YXJuKGllZWUtPmRldiwgInNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQkJICAgIHNrYi0+bGVuKTsKIAkJCWdvdG8gc3VjY2VzczsKIAkJfQogCiAJCXR4YiA9IHJ0bGxpYl9hbGxvY190eGIoMSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoIXR4YikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCi0JCQlpZWVlLT5kZXYtPm5hbWUpOworCQkJbmV0ZGV2X3dhcm4oaWVlZS0+ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIik7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCkBAIC05MDYsOCArOTI2LDcgQEAKIAkJCWlmICh0Y2JfZGVzYy0+Yk11bHRpY2FzdCB8fCAgdGNiX2Rlc2MtPmJCcm9hZGNhc3QpCiAJCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IGllZWUtPmJhc2ljX3JhdGU7CiAJCQllbHNlCi0JCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IENVUlJFTlRfUkFURShpZWVlLT5tb2RlLAotCQkJCQlpZWVlLT5yYXRlLCBpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUpOworCQkJCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSBydGxsaWJfY3VycmVudF9yYXRlKGllZWUpOwogCiAJCQlpZiAoYmRoY3ApIHsKIAkJCQlpZiAoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYwppbmRleCA5ZTBmOTc1Li42MjM0YWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgInJ0bGxpYi5oIgogc3RydWN0IG1vZGVzX3VuaXQgewogCWNoYXIgKm1vZGVfc3RyaW5nOwpAQCAtNjUsNyArNjUsNyBAQAogCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0FQOwogCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIG5ldHdvcmstPmJzc2lkLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQpOwogCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLAogCQkJCQkgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwogCS8qIFJlbWFpbmluZyBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBwcm92aWRlIHRoZW0gKi8KQEAgLTc0LDcgKzc0LDcgQEAKIAlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOwogCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOwogCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA+IDApIHsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW4obmV0d29yay0+c3NpZF9sZW4sICh1OCkzMik7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluX3QodTgsIG5ldHdvcmstPnNzaWRfbGVuLCAzMik7CiAJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLAogCQkJCQkJIG5ldHdvcmstPnNzaWQpOwogCX0gZWxzZSBpZiAobmV0d29yay0+aGlkZGVuX3NzaWRfbGVuID09IDApIHsKQEAgLTgyLDcgKzgyLDcgQEAKIAkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9yc2woaW5mbywgc3RhcnQsIHN0b3AsCiAJCQkJCQkgJml3ZSwgIjxoaWRkZW4+Iik7CiAJfSBlbHNlIHsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW4obmV0d29yay0+aGlkZGVuX3NzaWRfbGVuLCAodTgpMzIpOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbl90KHU4LCBuZXR3b3JrLT5oaWRkZW5fc3NpZF9sZW4sIDMyKTsKIAkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsCiAJCQkJCQkgbmV0d29yay0+aGlkZGVuX3NzaWQpOwogCX0KQEAgLTExMyw4ICsxMTMsNiBAQAogCiAJLyogQWRkIGZyZXF1ZW5jeS9jaGFubmVsICovCiAJaXdlLmNtZCA9IFNJT0NHSVdGUkVROwotLyoJaXdlLnUuZnJlcS5tID0gcnRsbGliX2ZyZXF1ZW5jeShuZXR3b3JrLT5jaGFubmVsLCBuZXR3b3JrLT5tb2RlKTsKLQlpd2UudS5mcmVxLmUgPSAzOyAqLwogCWl3ZS51LmZyZXEubSA9IG5ldHdvcmstPmNoYW5uZWw7CiAJaXdlLnUuZnJlcS5lID0gMDsKIAlpd2UudS5mcmVxLmkgPSAwOwpAQCAtMjQxLDcgKzIzOSw4IEBACiAJfQogCiAJLyogQWRkIEVYVFJBOiBBZ2UgdG8gZGlzcGxheSBzZWNvbmRzIHNpbmNlIGxhc3QgYmVhY29uL3Byb2JlIHJlc3BvbnNlCi0JICogZm9yIGdpdmVuIG5ldHdvcmsuICovCisJICogZm9yIGdpdmVuIG5ldHdvcmsuCisJICovCiAJaXdlLmNtZCA9IElXRVZDVVNUT007CiAJcCA9IGN1c3RvbTsKIAlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLApAQCAtMjgyLDggKzI4MSw3IEBACiAJCQlldiA9IHJ0bDgxOXhfdHJhbnNsYXRlX3NjYW4oaWVlZSwgZXYsIHN0b3AsIG5ldHdvcmssCiAJCQkJCQkgICAgaW5mbyk7CiAJCWVsc2UKLQkJCVJUTExJQl9ERUJVR19TQ0FOKCJOb3Qgc2hvd2luZyBuZXR3b3JrICclcyAoIgotCQkJCSIgJXBNKScgZHVlIHRvIGFnZSAoJWx1bXMpLlxuIiwKKwkJCVJUTExJQl9ERUJVR19TQ0FOKCJOb3Qgc2hvd2luZyBuZXR3b3JrICclcyAoICVwTSknIGR1ZSB0byBhZ2UgKCVsdW1zKS5cbiIsCiAJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCiAJCQkJCSAgICAgbmV0d29yay0+c3NpZF9sZW4pLAogCQkJCW5ldHdvcmstPmJzc2lkLApAQCAtMzM4LDEzICszMzYsMTQgQEAKIAkJCVJUTExJQl9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24uXG4iKTsKIAogCQkvKiBDaGVjayBhbGwgdGhlIGtleXMgdG8gc2VlIGlmIGFueSBhcmUgc3RpbGwgY29uZmlndXJlZCwKLQkJICogYW5kIGlmIG5vIGtleSBpbmRleCB3YXMgcHJvdmlkZWQsIGRlLWluaXQgdGhlbSBhbGwgKi8KKwkJICogYW5kIGlmIG5vIGtleSBpbmRleCB3YXMgcHJvdmlkZWQsIGRlLWluaXQgdGhlbSBhbGwKKwkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBOVU1fV0VQX0tFWVM7IGkrKykgewogCQkJaWYgKGllZWUtPmNyeXB0X2luZm8uY3J5cHRbaV0gIT0gTlVMTCkgewogCQkJCWlmIChrZXlfcHJvdmlkZWQpCiAJCQkJCWJyZWFrOwogCQkJCWxpYjgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KCZpZWVlLT5jcnlwdF9pbmZvLAotCQkJCQkJCSAgICAmaWVlZS0+Y3J5cHRfaW5mby5jcnlwdFtpXSk7CisJCQkJCQkgICAgJmllZWUtPmNyeXB0X2luZm8uY3J5cHRbaV0pOwogCQkJfQogCQl9CiAKQEAgLTM2NSw3ICszNjQsOCBAQAogCWlmICgqY3J5cHQgIT0gTlVMTCAmJiAoKmNyeXB0KS0+b3BzICE9IE5VTEwgJiYKIAkgICAgc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJSLVdFUCIpICE9IDApIHsKIAkJLyogY2hhbmdpbmcgdG8gdXNlIFdFUDsgZGVpbml0IHByZXZpb3VzbHkgdXNlZCBhbGdvcml0aG0KLQkJICogb24gdGhpcyBrZXkgKi8KKwkJICogb24gdGhpcyBrZXkKKwkJICovCiAJCWxpYjgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KCZpZWVlLT5jcnlwdF9pbmZvLCBjcnlwdCk7CiAJfQogCkBAIC0zOTAsOSArMzkwLDkgQEAKIAkJCWtmcmVlKG5ld19jcnlwdCk7CiAJCQluZXdfY3J5cHQgPSBOVUxMOwogCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGluaXRpYWxpemUgV0VQOiAiCi0JCQkgICAgICAgImxvYWQgbW9kdWxlIHJ0bGxpYl9jcnlwdF93ZXBcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCW5ldGRldl93YXJuKGRldiwKKwkJCQkgICAgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6IGxvYWQgbW9kdWxlIHJ0bGxpYl9jcnlwdF93ZXBcbiIsCisJCQkJICAgIGRldi0+bmFtZSk7CiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KIAkJKmNyeXB0ID0gbmV3X2NyeXB0OwpAQCAtNDEzLDcgKzQxMyw4IEBACiAJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKIAkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CiAJCS8qIFRoaXMgZW5zdXJlcyBhIGtleSB3aWxsIGJlIGFjdGl2YXRlZCBpZiBubyBrZXkgaXMKLQkJICogZXhwbGljaXRseSBzZXQgKi8KKwkJICogZXhwbGljaXRseSBzZXQKKwkJICovCiAJCWlmIChrZXkgPT0gc2VjLmFjdGl2ZV9rZXkpCiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CiAJCWllZWUtPmNyeXB0X2luZm8udHhfa2V5aWR4ID0ga2V5OwpAQCAtNDIzLDExICs0MjQsOSBAQAogCQkJCQkgICAgIE5VTEwsICgqY3J5cHQpLT5wcml2KTsKIAkJaWYgKGxlbiA9PSAwKSB7CiAJCQkvKiBTZXQgYSBkZWZhdWx0IGtleSBvZiBhbGwgMCAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBrZXkgJWQgdG8gYWxsIHplcm8uXG4iLAorCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiU2V0dGluZyBrZXkgJWQgdG8gYWxsIHplcm8uXG4iLAogCQkJCQkgICBrZXkpOwogCi0JCQlSVExMSUJfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvIGFsbCB6ZXJvLlxuIiwKLQkJCQkJICAga2V5KTsKIAkJCW1lbXNldChzZWMua2V5c1trZXldLCAwLCAxMyk7CiAJCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIDEzLCBOVUxMLAogCQkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOwpAQCAtNDM3LDggKzQzNiw4IEBACiAKIAkJLyogTm8ga2V5IGRhdGEgLSBqdXN0IHNldCB0aGUgZGVmYXVsdCBUWCBrZXkgaW5kZXggKi8KIAkJaWYgKGtleV9wcm92aWRlZCkgewotCQkJUlRMTElCX0RFQlVHX1dYKAotCQkJCSJTZXR0aW5nIGtleSAlZCB0byBkZWZhdWx0IFR4IGtleS5cbiIsIGtleSk7CisJCQlSVExMSUJfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvIGRlZmF1bHQgVHgga2V5LlxuIiwKKwkJCQkJa2V5KTsKIAkJCWllZWUtPmNyeXB0X2luZm8udHhfa2V5aWR4ID0ga2V5OwogCQkJc2VjLmFjdGl2ZV9rZXkgPSBrZXk7CiAJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CkBAIC00NTQsNyArNDUzLDggQEAKIAkJCSAgICJPUEVOIiA6ICJTSEFSRUQgS0VZIik7CiAKIAkvKiBGb3Igbm93IHdlIGp1c3Qgc3VwcG9ydCBXRVAsIHNvIG9ubHkgc2V0IHRoYXQgc2VjdXJpdHkgbGV2ZWwuLi4KLQkgKiBUT0RPOiBXaGVuIFdQQSBpcyBhZGRlZCB0aGlzIGlzIG9uZSBwbGFjZSB0aGF0IG5lZWRzIHRvIGNoYW5nZSAqLworCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlCisJICovCiAJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKIAlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsgLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCiAKQEAgLTQ2NSwxMSArNDY1LDEyIEBACiAJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZwogCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCiAJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCi0JICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4KKwkgKi8KIAlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCiAJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgogCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQluZXRkZXZfZGJnKGRldiwgIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwpAQCAtNTk2LDcgKzU5Nyw3IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYWxnIG5hbWU6JXNcbiIsIGFsZyk7CisJbmV0ZGV2X2luZm8oZGV2LCAiYWxnIG5hbWU6JXNcbiIsIGFsZyk7CiAKIAlvcHMgPSBsaWI4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOwogCWlmIChvcHMgPT0gTlVMTCkgewpAQCAtNjA4LDkgKzYwOSw3IEBACiAJCW9wcyA9IGxpYjgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CiAJfQogCWlmIChvcHMgPT0gTlVMTCkgewotCQlSVExMSUJfREVCVUdfV1goIiVzOiB1bmtub3duIGNyeXB0byBhbGcgJWRcbiIsCi0JCQkJICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7Ci0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PnVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwgZXh0LT5hbGcpOworCQluZXRkZXZfaW5mbyhkZXYsICI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KQEAgLTY0MSw4ICs2NDAsNyBAQAogCWlmIChleHQtPmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKIAkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShleHQtPmtleSwgZXh0LT5rZXlfbGVuLCBleHQtPnJ4X3NlcSwKIAkJCQkgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7Ci0JCVJUTExJQl9ERUJVR19XWCgiJXM6IGtleSBzZXR0aW5nIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KQEAgLTc1OSw5ICs3NTcsOSBAQAogCiAJY2FzZSBJV19NTE1FX0RJU0FTU09DOgogCQlpZiAoZGVhdXRoKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZGlzYXV0aCBwYWNrZXQgIVxuIik7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJkaXNhdXRoIHBhY2tldCAhXG4iKTsKIAkJZWxzZQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZGlzIGFzc29jaWF0ZSBwYWNrZXQhXG4iKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgImRpcyBhc3NvY2lhdGUgcGFja2V0IVxuIik7CiAKIAkJaWVlZS0+Y2Fubm90X25vdGlmeSA9IHRydWU7CiAKQEAgLTc5Nyw4ICs3OTUsNyBAQAogCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CiAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6Ci0JCS8qCi0JCSAqIEhvc3QgQVAgZHJpdmVyIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzIGFuZCBhbGxvd3MKKwkJLyogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cwogCQkgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KIAkJICovCiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKaW5kZXggOTBhY2U3OS4uODJkNjAzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCkBAIC02LDcgKzYsNyBAQAogewogCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKIAotCXBEb3QxMWRJbmZvLT5iRW5hYmxlZCA9IDA7CisJcERvdDExZEluZm8tPmJFbmFibGVkID0gZmFsc2U7CiAKIAlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsKIAlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oCmluZGV4IGJkNzVlMjkuLjhhZTY3M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaApAQCAtNTMsNyArNTMsNyBAQAogCiAjZGVmaW5lIENJRV9XQVRDSERPR19USCAxCiAjZGVmaW5lIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cpCi0jZGVmaW5lIFJFU0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpID0gMAorI2RlZmluZSBSRVNFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwKQogI2RlZmluZSBVUERBVEVfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpICgrK0dFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikpCiAKICNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaAppbmRleCBiNDRhYTE3Li4wZjUzYzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTYwNiwzMyArNjA2LDYgQEAKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1JYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JYLCBmLCAjIyBhKQogI2RlZmluZSBJRUVFODAyMTFfREVCVUdfUU9TKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1FPUywgZiwgIyMgYSkKIAotI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKLS8qIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTIyLiAqLwotI2RlZmluZSBNQVhfU1RSX0xFTiAgICAgNjQKLS8qIEkgd2FudCB0byBzZWUgQVNDSUkgMzMgdG8gMTI2IG9ubHkuIE90aGVyd2lzZSwgSSBwcmludCAnPycuIEFubmllLCAyMDA1LTExLTIyLiovCi0jZGVmaW5lIFBSSU5UQUJMRShfY2gpICAoX2NoPichJyAmJiBfY2g8J34nKQotI2RlZmluZSBJRUVFODAyMTFfUFJJTlRfU1RSKF9Db21wLCBfVGl0bGVTdHJpbmcsIF9QdHIsIF9MZW4pCQkJCQlcCi0JCQlpZigoX0NvbXApICYgbGV2ZWwpCQkJCQkJCVwKLQkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlpbnQgICAgICAgICAgICAgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCXU4ICBidWZmZXJbTUFYX1NUUl9MRU5dOwkJCQkJXAotCQkJCWludCBsZW5ndGggPSAoX0xlbjxNQVhfU1RSX0xFTik/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSkgOwlcCi0JCQkJbWVtc2V0KGJ1ZmZlciwgMCwgTUFYX1NUUl9MRU4pOwkJCQkJXAotCQkJCW1lbWNweShidWZmZXIsICh1OCAqKV9QdHIsIGxlbmd0aCApOwkJCQlcCi0JCQkJZm9yKCBfX2k9MDsgX19pPE1BWF9TVFJfTEVOOyBfX2krKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCSAgICAgaWYoICFQUklOVEFCTEUoYnVmZmVyW19faV0pICkgICBidWZmZXJbX19pXSA9ICc/JzsJCVwKLQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCWJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJcHJpbnRrKCJSdGw4MTl4OiAiKTsJCQkJCQlcCi0JCQkJcHJpbnRrKF9UaXRsZVN0cmluZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJcHJpbnRrKCI6ICVkLCA8JXM+XG4iLCBfTGVuLCBidWZmZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQl9Ci0jZWxzZQotI2RlZmluZSBJRUVFODAyMTFfUFJJTlRfU1RSKF9Db21wLCBfVGl0bGVTdHJpbmcsIF9QdHIsIF9MZW4pICBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+IC8qIEFSUEhSRF9FVEhFUiAqLwogCiAjaWZuZGVmIFdJUkVMRVNTX1NQWQpAQCAtNjYxLDcgKzYzNCw3IEBACiAJdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLwogCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLwogCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgU05BUF9TSVpFIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyKQogCkBAIC05OTYsNyArOTY5LDcgQEAKIAl1OCBrZXlzW1dFUF9LRVlTXVtTQ01fS0VZX0xFTl07CiAJdTggbGV2ZWw7CiAJdTE2IGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAKIC8qCkBAIC0xMDUxLDE0ICsxMDI0LDE0IEBACiAJX19sZTE2IGZyYW1lX2N0bDsKIAlfX2xlMTYgZHVyYXRpb25faWQ7CiAJdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIgewogCV9fbGUxNiBmcmFtZV9jdGw7CiAJX19sZTE2IGR1cmF0aW9uX2lkOwogCXU4IGFkZHIxW0VUSF9BTEVOXTsKIAl1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8yYWRkciB7CiAJX19sZTE2IGZyYW1lX2N0bDsKQEAgLTEwNjYsNyArMTAzOSw3IEBACiAJdTggYWRkcjFbRVRIX0FMRU5dOwogCXU4IGFkZHIyW0VUSF9BTEVOXTsKIAl1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7CiAJX19sZTE2IGZyYW1lX2N0bDsKQEAgLTEwNzYsNyArMTA0OSw3IEBACiAJdTggYWRkcjNbRVRIX0FMRU5dOwogCV9fbGUxNiBzZXFfY3RsOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyIHsKIAlfX2xlMTYgZnJhbWVfY3RsOwpAQCAtMTA4Nyw3ICsxMDYwLDcgQEAKIAlfX2xlMTYgc2VxX2N0bDsKIAl1OCBhZGRyNFtFVEhfQUxFTl07CiAJdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgewogCV9fbGUxNiBmcmFtZV9jdGw7CkBAIC0xMDk4LDcgKzEwNzEsNyBAQAogCV9fbGUxNiBzZXFfY3RsOwogCXU4IHBheWxvYWRbMF07CiAJX19sZTE2IHFvc19jdGw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zIHsKIAlfX2xlMTYgZnJhbWVfY3RsOwpAQCAtMTExMCwxMyArMTA4MywxMyBAQAogCXU4IGFkZHI0W0VUSF9BTEVOXTsKIAl1OCBwYXlsb2FkWzBdOwogCV9fbGUxNiBxb3NfY3RsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CiAJdTggaWQ7CiAJdTggbGVuOwogCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKQEAgLTExMjUsMTggKzEwOTgsMTggQEAKIAlfX2xlMTYgc3RhdHVzOwogCS8qY2hhbGxlbmdlKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKIAlfX2xlMTYgcmVhc29uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKIAkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKQEAgLTExNDYsNyArMTExOSw3IEBACiAJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBGSCBwYXJhbXMsIERTIHBhcmFtcywKIAkgKiBDRiBwYXJhbXMsIElCU1MgcGFyYW1zLCBUSU0gKGlmIGJlYWNvbiksIFJTTiAqLwogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyogQWxpYXMgYmVhY29uIGZvciBwcm9iZV9yZXNwb25zZSAqLwogI2RlZmluZSBpZWVlODAyMTFfYmVhY29uIGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZQpAQCAtMTE1Nyw3ICsxMTMwLDcgQEAKIAlfX2xlMTYgbGlzdGVuX2ludGVydmFsOwogCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgUlNOICovCiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX3JlYXNzb2NfcmVxdWVzdF9mcmFtZSB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwpAQCAtMTE2Niw3ICsxMTM5LDcgQEAKIAl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKIAkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLwogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwpAQCAtMTE3NCw3ICsxMTQ3LDcgQEAKIAlfX2xlMTYgc3RhdHVzOwogCV9fbGUxNiBhaWQ7CiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV90eGIgewogCXU4IG5yX2ZyYWdzOwpAQCAtMTE5MSw3ICsxMTY0LDcgQEAKIHN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIgewogCXU4IG5yX2Rydl9hZ2dfZnJhbWVzOwogCXN0cnVjdCBza19idWZmICp0eF9hZ2dfZnJhbWVzW01BWF9UWF9BR0dfQ09VTlRdOwotfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNQVhfU1VCRlJBTUVfQ09VTlQJCSAgNjQKIHN0cnVjdCBpZWVlODAyMTFfcnhiIHsKQEAgLTExOTksNyArMTE3Miw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnN1YmZyYW1lc1tNQVhfU1VCRlJBTUVfQ09VTlRdOwogCXU4IGRzdFtFVEhfQUxFTl07CiAJdTggc3JjW0VUSF9BTEVOXTsKLX1fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHR5cGVkZWYgdW5pb24gX2ZyYW1lcW9zIHsKIAl1MTYgc2hvcnRkYXRhOwpAQCAtMTI2NywxOSArMTI0MCwxOSBAQAogCXU4IHF1aV9zdWJ0eXBlOwogCXU4IHZlcnNpb247CiAJdTggYWNfaW5mbzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9xb3NfYWNfcGFyYW1ldGVyIHsKIAl1OCBhY2lfYWlmc247CiAJdTggZWN3X21pbl9tYXg7CiAJX19sZTE2IHR4X29wX2xpbWl0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbyB7CiAJc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCBpbmZvX2VsZW1lbnQ7CiAJdTggcmVzZXJ2ZWQ7CiAJc3RydWN0IGllZWU4MDIxMV9xb3NfYWNfcGFyYW1ldGVyIGFjX3BhcmFtc19yZWNvcmRbUU9TX1FVRVVFX05VTV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgewogCV9fbGUxNiBjd19taW5bUU9TX1FVRVVFX05VTV07CkBAIC0xMjg3LDcgKzEyNjAsNyBAQAogCXU4IGFpZnNbUU9TX1FVRVVFX05VTV07CiAJdTggZmxhZ1tRT1NfUVVFVUVfTlVNXTsKIAlfX2xlMTYgdHhfb3BfbGltaXRbUU9TX1FVRVVFX05VTV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfcW9zX2RhdGEgewogCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKQEAgLTEzMDAsNyArMTI3Myw3IEBACiBzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzIHsKIAl1OCB0aW1fY291bnQ7CiAJdTggdGltX3BlcmlvZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLy8jZWxzZQogc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gewpAQCAtMTMxMyw3ICsxMjg2LDcgQEAKIAl1OCBhY19kaXJfdGlkOwogCXU4IGFjX3VwX3BzYjsKIAl1OCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CiAJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOwpAQCAtMTMzMiw3ICsxMzA1LDcgQEAKIAl1MzIgbWluX3BoeV9yYXRlOwogCXUxNiBzdXJwX2JhbmRfYWxsb3c7CiAJdTE2IG1lZGl1bV90aW1lOwotfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIGVudW0gZWFwX3R5cGUgewogCUVBUF9QQUNLRVQgPSAwLAogCUVBUE9MX1NUQVJULApAQCAtMTM3MSw3ICsxMzQ0LDcgQEAKIAl1OCB2ZXJzaW9uOwogCXU4IHR5cGU7CiAJdTE2IGxlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9zb2Z0bWFjX3N0YXRzewogCXVuc2lnbmVkIGludCByeF9hc3Nfb2s7CkBAIC0xNDAxLDcgKzEzNzQsNyBAQAogc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIHsKIAl1OCBpZDsKIAl1OCBsZW47Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKQEAgLTE0MTQsNyArMTM4Nyw3IEBACiAJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKIAlzdHJ1Y3QgewogCQl1MTYgYXNzb2NpYXRpb25faWQ6MTQsIHJlc2VydmVkOjI7Ci0JfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJfSBfX3BhY2tlZDsKIAl1MzIgdGltZV9zdGFtcFsyXTsKIAl1MTYgcmVhc29uOwogCXUxNiBzdGF0dXM7CkBAIC0xNDc1LDcgKzE0NDgsNyBAQAogCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKIAl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CiAJdTE2IGV0aGVyX3R5cGU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2lmbmRlZiBFVEhFUlRZUEVfUEFFCiAjZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCkBAIC0xNDg0LDI0ICsxNDU3LDYgQEAKICNkZWZpbmUJRVRIRVJUWVBFX0lQCTB4MDgwMAkJLyogSVAgcHJvdG9jb2wgKi8KICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdCBfYnNzX2h0ewotCi0JYm9vbAkJCQlzdXBwb3J0X2h0OwotCi0JLy8gSFQgcmVsYXRlZCBlbGVtZW50cwotCXU4CQkJCQlodF9jYXBfYnVmWzMyXTsKLQl1MTYJCQkJCWh0X2NhcF9sZW47Ci0JdTgJCQkJCWh0X2luZm9fYnVmWzMyXTsKLQl1MTYJCQkJCWh0X2luZm9fbGVuOwotCi0JSFRfU1BFQ19WRVIJCQlodF9zcGVjX3ZlcjsKLQkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKLQkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7Ci0KLQlib29sCQkJCWFnZ3JlZ2F0aW9uOwotCWJvb2wJCQkJbG9uZ19zbG90X3RpbWU7Ci19YnNzX2h0LCAqcGJzc19odDsKLQogdHlwZWRlZiBlbnVtIF9lcnBfdHsKIAlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCiAJRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKaW5kZXggNTUzMzIyMS4uMzk5NTYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCkBAIC0xMSwxMiArMTEsMTEgQEAKICAqCiAgKi8KIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgogCkBAIC02Niw4ICs2NSw4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMCk7CiAJaWYgKCFsaXN0X2VtcHR5KCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRyaWVzIHJlbWFpbmluZyBpbiBkZWxheWVkIGNyeXB0ICIKLQkJICAgICAgICJkZWxldGlvbiBsaXN0XG4iLCBpZWVlLT5kZXYtPm5hbWUpOworCQluZXRkZXZfZGJnKGllZWUtPmRldiwgIiVzOiBlbnRyaWVzIHJlbWFpbmluZyBpbiBkZWxheWVkIGNyeXB0IGRlbGV0aW9uIGxpc3RcbiIsCisJCQkJaWVlZS0+ZGV2LT5uYW1lKTsKIAkJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CiAJCWFkZF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKIAl9CkBAIC0xMTgsNyArMTE3LDcgQEAKIAlsaXN0X2FkZCgmYWxnLT5saXN0LCAmaGNyeXB0LT5hbGdzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKIAotCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHJlZ2lzdGVyZWQgYWxnb3JpdGhtICclcydcbiIsCisJcHJfZGVidWcoImllZWU4MDIxMV9jcnlwdDogcmVnaXN0ZXJlZCBhbGdvcml0aG0gJyVzJ1xuIiwKIAkgICAgICAgb3BzLT5uYW1lKTsKIAogCXJldHVybiAwOwpAQCAtMTQ2LDggKzE0NSw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoZGVsX2FsZykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKLQkJICAgICAgICInJXMnXG4iLCBvcHMtPm5hbWUpOworCQlwcl9kZWJ1ZygiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICclcydcbiIsCisJCQkJb3BzLT5uYW1lKTsKIAkJa2ZyZWUoZGVsX2FsZyk7CiAJfQogCkBAIC0yMzIsOCArMjMxLDggQEAKIAkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQogCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CiAJCWxpc3RfZGVsKHB0cik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgotCQkgICAgICAgIiclcycgKGRlaW5pdClcbiIsIGFsZy0+b3BzLT5uYW1lKTsKKwkJcHJfZGVidWcoImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnIChkZWluaXQpXG4iLAorCQkJCWFsZy0+b3BzLT5uYW1lKTsKIAkJa2ZyZWUoYWxnKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwppbmRleCAxNDNiNjgyLi43ODg3MDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCkBAIC05LDcgKzksNiBAQAogICogbW9yZSBkZXRhaWxzLgogICovCiAKLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xOCw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgpAQCAtMTMwLDkgKzEyOSw5IEBACiAJcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgogCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4MDgpKTsKIAkqLwotCS8vIGZpeGVkIGJ5IERhdmlkIDoyMDA2LjkuNgotCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKLQkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDgwKSk7CisJLyogZml4ZWQgYnkgRGF2aWQgOjIwMDYuOS42ICovCisJcWNfaW5jbHVkZWQgPSAoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCisJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHg4MCk7CiAJYWFkX2xlbiA9IDIyOwogCWlmIChhNF9pbmNsdWRlZCkKIAkJYWFkX2xlbiArPSA2OwpAQCAtMjA5LDcgKzIwOCw3IEBACiAJcG9zID0gc2tiX3B1c2goc2tiLCBDQ01QX0hEUl9MRU4pOwogCW1lbW1vdmUocG9zLCBwb3MgKyBDQ01QX0hEUl9MRU4sIGhkcl9sZW4pOwogCXBvcyArPSBoZHJfbGVuOwotLy8JbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CisJLyogbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7ICovCiAKIAlpID0gQ0NNUF9QTl9MRU4gLSAxOwogCXdoaWxlIChpID49IDApIHsKQEAgLTIzOSw3ICsyMzgsNyBAQAogCQl1OCAqZSA9IGtleS0+dHhfZTsKIAkJdTggKnMwID0ga2V5LT50eF9zMDsKIAotCQkvL21pYyBpcyBtb3ZlZCB0byBoZXJlIGJ5IGpvaG4KKwkJLyogbWljIGlzIG1vdmVkIHRvIGhlcmUgYnkgam9obiAqLwogCQltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKIAogCQljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIGtleS0+dHhfcG4sIGRhdGFfbGVuLCBiMCwgYiwgczApOwpAQCAtNDQ0LDcgKzQ0Myw3IEBACiAKIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKQogewotLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCS8qIHByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsgKi8KIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwppbmRleCBmY2M5MGE1Li5lODE1YzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCkBAIC05LDcgKzksNiBAQAogICogbW9yZSBkZXRhaWxzLgogICovCiAKLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xOCw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNpbmNsdWRlICJpZWVlODAyMTEuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwppbmRleCA4YzFiZjFmLi4wYTE3Zjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtOSwxMyArOSwxMiBAQAogICogbW9yZSBkZXRhaWxzLgogICovCiAKLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKQEAgLTQ5LDE0ICs0OCwxNCBAQAogCiAJcHJpdi0+dHhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT50eF90Zm0pKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQlwcl9kZWJ1ZygiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKIAkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOwogCQlwcml2LT50eF90Zm0gPSBOVUxMOwogCQlnb3RvIGZhaWw7CiAJfQogCXByaXYtPnJ4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+cnhfdGZtKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJcHJfZGVidWcoImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCiAJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKIAkJcHJpdi0+cnhfdGZtID0gTlVMTDsKIAkJZ290byBmYWlsOwpAQCAtMTEwLDYgKzEwOSw3IEBACiAJdTMyIGNyYzsKIAl1OCAqaWN2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDQgfHwgc2tiX3RhaWxyb29tKHNrYikgPCA0IHx8CiAJICAgIHNrYi0+bGVuIDwgaGRyX2xlbikKIAkJcmV0dXJuIC0xOwpAQCAtMTI4LDYgKzEyOCw3IEBACiAJICogY2FuIGJlIHVzZWQgdG8gc3BlZWR1cCBhdHRhY2tzLCBzbyBhdm9pZCB1c2luZyB0aGVtLiAqLwogCWlmICgod2VwLT5pdiAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB7CiAJCXU4IEIgPSAod2VwLT5pdiA+PiAxNikgJiAweGZmOworCiAJCWlmIChCID49IDMgJiYgQiA8IGtsZW4pCiAJCQl3ZXAtPml2ICs9IDB4MDEwMDsKIAl9CkBAIC0xODAsNiArMTgxLDcgQEAKIAl1MzIgY3JjOwogCXU4IGljdls0XTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKIAlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCkKIAkJcmV0dXJuIC0xOwogCkBAIC0yNTYsNiArMjU4LDcgQEAKIHN0YXRpYyBjaGFyICpwcmlzbTJfd2VwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwogCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9V0VQIGxlbj0lZFxuIiwKIAkJICAgICB3ZXAtPmtleV9pZHgsIHdlcC0+a2V5X2xlbik7CiAJcmV0dXJuIHA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCmluZGV4IGFmYmQwOWQuLjMxMjMzZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0zMSw3ICszMSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorLyogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CkBAIC0xMzMsMTUgKzEzMywxNCBAQAogCWllZWUtPmllZWU4MDJfMXggPSAxOyAvKiBEZWZhdWx0IHRvIHN1cHBvcnRpbmcgODAyLjF4ICovCiAKIAlJTklUX0xJU1RfSEVBRCgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOwotCWluaXRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7Ci0JaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOwotCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcjsKKwlzZXR1cF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLAorCQkgICAgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyLCAodW5zaWduZWQgbG9uZylpZWVlKTsKIAogCXNwaW5fbG9ja19pbml0KCZpZWVlLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaWVlZS0+Yndfc3BpbmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKTsKLQkvL2FkZGVkIGJ5IFdCCisJLyogYWRkZWQgYnkgV0IgKi8KIAlhdG9taWNfc2V0KCYoaWVlZS0+YXRtX2NobmxvcCksIDApOwogCWF0b21pY19zZXQoJihpZWVlLT5hdG1fc3didyksIDApOwogCkBAIC0xNTMsNyArMTUyLDcgQEAKIAlpZWVlLT5pZWVlODAyXzF4ID0gMTsKIAlpZWVlLT5yYXdfdHggPSAwOwogCS8vaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IC8vZGVmYWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgotCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7IC8vZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5LgorCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7IC8qIGRpc2FibGUgaHdzZWMsIHN3aXRjaCBpdCBvbiB3aGVuIG5lY2Vzc2FyeS4gKi8KIAogCWllZWU4MDIxMV9zb2Z0bWFjX2luaXQoaWVlZSk7CiAKQEAgLTE2NCw3ICsxNjMsNyBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAJSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhpZWVlKTsKLQlIVEluaXRpYWxpemVIVEluZm8oaWVlZSk7IC8vbWF5IG1vdmUgdG8gb3RoZXIgcGxhY2UuCisJSFRJbml0aWFsaXplSFRJbmZvKGllZWUpOyAvKiBtYXkgbW92ZSB0byBvdGhlciBwbGFjZS4gKi8KIAlUU0luaXRpYWxpemUoaWVlZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykKQEAgLTE3Niw3ICsxNzUsNyBAQAogCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CiAJfQogCi0vL1RoZXNlIGZ1bmN0aW9uIHdlcmUgYWRkZWQgdG8gbG9hZCBjcnlwdGUgbW9kdWxlIGF1dG9seQorLyogVGhlc2UgZnVuY3Rpb24gd2VyZSBhZGRlZCB0byBsb2FkIGNyeXB0ZSBtb2R1bGUgYXV0b2x5ICovCiAJaWVlZTgwMjExX3RraXBfbnVsbCgpOwogCWllZWU4MDIxMV93ZXBfbnVsbCgpOwogCWllZWU4MDIxMV9jY21wX251bGwoKTsKQEAgLTE5NSw3ICsxOTQsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaTsKLQkvL3N0cnVjdCBsaXN0X2hlYWQgKnAsICpxOworCS8qIHN0cnVjdCBsaXN0X2hlYWQgKnAsICpxOyAqLwogLy8JZGVsX3RpbWVyX3N5bmMoJmllZWUtPlN3QndUaW1lcik7CiAJa2ZyZWUoaWVlZS0+cEhUSW5mbyk7CiAJaWVlZS0+cEhUSW5mbyA9IE5VTEw7CkBAIC0yMzksMTMgKzIzOCwxNSBAQAogCS8vCQkgICAgSUVFRTgwMjExX0RMX1JFT1JERVJ8CiAvLwkJCSAgICBJRUVFODAyMTFfRExfVFJBQ0UgIHwKIAkJCSAgICAvL0lFRUU4MDIxMV9ETF9EQVRBCXwKLQkJCSAgICBJRUVFODAyMTFfRExfRVJSCSAgLy9hd2F5bHMgb3BlbiB0aGlzIGZsYWdzIHRvIHNob3cgZXJyb3Igb3V0CisJCQkgICAgSUVFRTgwMjExX0RMX0VSUgkgIC8qIGF3YXlscyBvcGVuIHRoaXMgZmxhZ3MgdG8gc2hvdyBlcnJvciBvdXQgKi8KIAkJCSAgICA7CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppZWVlODAyMTFfcHJvYzsKIAogc3RhdGljIGludCBzaG93X2RlYnVnX2xldmVsKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiMHglMDhYXG4iLCBpZWVlODAyMTFfZGVidWdfbGV2ZWwpOworCXNlcV9wcmludGYobSwgIjB4JTA4WFxuIiwgaWVlZTgwMjExX2RlYnVnX2xldmVsKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKQEAgLTI4NCw3ICsyODUsNyBAQAogCQkJCSIgcHJvYyBkaXJlY3RvcnlcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JZSA9IHByb2NfY3JlYXRlKCJkZWJ1Z19sZXZlbCIsIFNfSVJVR08gfCBTX0lXVVNSLCAKKwllID0gcHJvY19jcmVhdGUoImRlYnVnX2xldmVsIiwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCQkgICAgICBpZWVlODAyMTFfcHJvYywgJmZvcHMpOwogCWlmICghZSkgewogCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOwpAQCAtMzAzLDcgKzMwNCw2IEBACiAJfQogfQogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCBkNDAxZGJmLi45ZmJiNTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTIyLDcgKzIyLDYgQEAKIAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CkBAIC0zOSw3ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgpAQCAtNTYsNyArNTUsNyBAQAogCiAJc2tiX3B1bGwoc2tiLCBpZWVlODAyMTFfZ2V0X2hkcmxlbihmYykpOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjExX1JBVyk7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjExX1JBVyk7CiAJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CiAJbmV0aWZfcngoc2tiKTsKIH0KQEAgLTIyMiw4ICsyMjEsOCBAQAogCiAJcnhfc3RhdHMtPmxlbiA9IHNrYi0+bGVuOwogCWllZWU4MDIxMV9yeF9tZ3QoaWVlZSwoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKilza2ItPmRhdGEscnhfc3RhdHMpOwotCS8vaWYgKChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSAmJiAobWVtY21wKGhkci0+YWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pKSkKLQlpZiAoKG1lbWNtcChoZHItPmFkZHIxLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpKS8vdXNlIEFERFIxIHRvIHBlcmZvcm0gYWRkcmVzcyBtYXRjaGluZyBmb3IgTWFuYWdlbWVudCBmcmFtZXMKKwkvKiBpZiAoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmIChtZW1jbXAoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTikpKSAqLworCWlmICgobWVtY21wKGhkci0+YWRkcjEsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkpLyogdXNlIEFERFIxIHRvIHBlcmZvcm0gYWRkcmVzcyBtYXRjaGluZyBmb3IgTWFuYWdlbWVudCBmcmFtZXMgKi8KIAl7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXJldHVybiAwOwpAQCAtNjA5LDEyICs2MDgsMTIgQEAKIAlib29sCQkJYk1hdGNoV2luU3RhcnQgPSBmYWxzZSwgYlBrdEluQnVmID0gZmFsc2U7CiAJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBTZXEgaXMgJWQscFRTLT5SeEluZGljYXRlU2VxIGlzICVkLCBXaW5TaXplIGlzICVkXG4iLF9fZnVuY19fLFNlcU51bSxwVFMtPlJ4SW5kaWNhdGVTZXEsV2luU2l6ZSk7CiAJLyogUnggUmVvcmRlciBpbml0aWFsaXplIGNvbmRpdGlvbi4qLwotCWlmKHBUUy0+UnhJbmRpY2F0ZVNlcSA9PSAweGZmZmYpIHsKKwlpZiAocFRTLT5SeEluZGljYXRlU2VxID09IDB4ZmZmZikgewogCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSBTZXFOdW07CiAJfQogCiAJLyogRHJvcCBvdXQgdGhlIHBhY2tldCB3aGljaCBTZXFOdW0gaXMgc21hbGxlciB0aGFuIFdpblN0YXJ0ICovCi0JaWYoU05fTEVTUyhTZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpIHsKKwlpZiAoU05fTEVTUyhTZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpIHsKIAkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCJQYWNrZXQgRHJvcCEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLAogCQkJCSBwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CiAJCXBIVEluZm8tPlJ4UmVvcmRlckRyb3BDb3VudGVyKys7CkBAIC03MTcsNyArNzE2LDcgQEAKIAkJICAgIFNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFRTLT5SeEluZGljYXRlU2VxKSkKIAkJewogCQkJLyogVGhpcyBwcm90ZWN0IGJ1ZmZlciBmcm9tIG92ZXJmbG93LiAqLwotCQkJaWYoaW5kZXggPj0gUkVPUkRFUl9XSU5fU0laRSkgeworCQkJaWYgKGluZGV4ID49IFJFT1JERVJfV0lOX1NJWkUpIHsKIAkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IEJ1ZmZlciBvdmVyZmxvdyEhIFxuIik7CiAJCQkJYlBrdEluQnVmID0gdHJ1ZTsKIAkJCQlicmVhazsKQEAgLTc0MSw3ICs3NDAsNyBAQAogCX0KIAogCS8qIEhhbmRsaW5nIHBlbmRpbmcgdGltZXIuIFNldCB0aGlzIHRpbWVyIHRvIHByZXZlbnQgZnJvbSBsb25nIHRpbWUgUnggYnVmZmVyaW5nLiovCi0JaWYoaW5kZXg+MCkgeworCWlmIChpbmRleD4wKSB7CiAJCS8vIENhbmNlbCBwcmV2aW91cyBwZW5kaW5nIHRpbWVyLgogCS8vCWRlbF90aW1lcl9zeW5jKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKIAkJcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsKQEAgLTc1NCw3ICs3NTMsNyBAQAogCQlpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBwcnhiSW5kaWNhdGVBcnJheSwgaW5kZXgpOwogCX0KIAotCWlmKGJQa3RJbkJ1ZiAmJiBwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxPT0weGZmZmYpIHsKKwlpZiAoYlBrdEluQnVmICYmIHBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXE9PTB4ZmZmZikgewogCQkvLyBTZXQgbmV3IHBlbmRpbmcgdGltZXIuCiAJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogU0VUIHJ4IHRpbWVvdXQgdGltZXJcbiIsIF9fZnVuY19fKTsKIAkJcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IHBUUy0+UnhJbmRpY2F0ZVNlcTsKQEAgLTc4NCwxNiArNzgzLDE2IEBACiAJLyoganVzdCBmb3IgZGVidWcgcHVycG9zZSAqLwogCVNlcU51bSA9IFdMQU5fR0VUX1NFUV9TRVEobGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKSk7CiAKLQlpZigoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkmJlwKKwlpZiAoKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpJiZcCiAJCQkoKChmcmFtZXFvcyAqKShza2ItPmRhdGEgKyBJRUVFODAyMTFfM0FERFJfTEVOKSktPmZpZWxkLnJlc2VydmVkKSkgewogCQliSXNBZ2dyZWdhdGVGcmFtZSA9IHRydWU7CiAJfQogCi0JaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCWlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CiAJCUxMQ09mZnNldCArPSAyOwogCX0KIAotCWlmKHJ4X3N0YXRzLT5iQ29udGFpbkhUQykgeworCWlmIChyeF9zdGF0cy0+YkNvbnRhaW5IVEMpIHsKIAkJTExDT2Zmc2V0ICs9IHNIVENMbmc7CiAJfQogCS8vcHJpbnRrKCJDaGtMZW5ndGggPSAlZFxuIiwgTExDT2Zmc2V0KTsKQEAgLTgyNyw3ICs4MjYsNyBAQAogCQkJLy89PW09PT5jaGFuZ2UgdGhlIGxlbmd0aCBvcmRlcgogCQkJblN1YmZyYW1lX0xlbmd0aCA9IChuU3ViZnJhbWVfTGVuZ3RoPj44KSArIChuU3ViZnJhbWVfTGVuZ3RoPDw4KTsKIAotCQkJaWYoc2tiLT5sZW48KEVUSEVSTkVUX0hFQURFUl9TSVpFICsgblN1YmZyYW1lX0xlbmd0aCkpIHsKKwkJCWlmIChza2ItPmxlbjwoRVRIRVJORVRfSEVBREVSX1NJWkUgKyBuU3ViZnJhbWVfTGVuZ3RoKSkgewogCQkJCXByaW50aygiJXM6IEEtTVNEVSBwYXJzZSBlcnJvciEhIHBSZmQtPm5Ub3RhbFN1YmZyYW1lIDogJWRcbiIsXAogCQkJCQkJX19mdW5jX18sIHJ4Yi0+bnJfc3ViZnJhbWVzKTsKIAkJCQlwcmludGsoIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISBTdWJmcmFtZSBMZW5ndGg6ICVkXG4iLF9fZnVuY19fLCBuU3ViZnJhbWVfTGVuZ3RoKTsKQEAgLTg1MywxOSArODUyLDE5IEBACiAJCQltZW1jcHkoZGF0YV9wdHIsIHNrYi0+ZGF0YSwgblN1YmZyYW1lX0xlbmd0aCk7CiAjZW5kaWYKIAkJCXJ4Yi0+c3ViZnJhbWVzW3J4Yi0+bnJfc3ViZnJhbWVzKytdID0gc3ViX3NrYjsKLQkJCWlmKHJ4Yi0+bnJfc3ViZnJhbWVzID49IE1BWF9TVUJGUkFNRV9DT1VOVCkgeworCQkJaWYgKHJ4Yi0+bnJfc3ViZnJhbWVzID49IE1BWF9TVUJGUkFNRV9DT1VOVCkgewogCQkJCUlFRUU4MDIxMV9ERUJVR19SWCgiUGFyc2VTdWJmcmFtZSgpOiBUb28gbWFueSBTdWJmcmFtZXMhIFBhY2tldHMgZHJvcHBlZCFcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJc2tiX3B1bGwoc2tiLCBuU3ViZnJhbWVfTGVuZ3RoKTsKIAotCQkJaWYoc2tiLT5sZW4gIT0gMCkgeworCQkJaWYgKHNrYi0+bGVuICE9IDApIHsKIAkJCQluUGFkZGluZ19MZW5ndGggPSA0IC0gKChuU3ViZnJhbWVfTGVuZ3RoICsgRVRIRVJORVRfSEVBREVSX1NJWkUpICUgNCk7Ci0JCQkJaWYoblBhZGRpbmdfTGVuZ3RoID09IDQpIHsKKwkJCQlpZiAoblBhZGRpbmdfTGVuZ3RoID09IDQpIHsKIAkJCQkJblBhZGRpbmdfTGVuZ3RoID0gMDsKIAkJCQl9CiAKLQkJCQlpZihza2ItPmxlbiA8IG5QYWRkaW5nX0xlbmd0aCkgeworCQkJCWlmIChza2ItPmxlbiA8IG5QYWRkaW5nX0xlbmd0aCkgewogCQkJCQlyZXR1cm4gMDsKIAkJCQl9CiAKQEAgLTkzOSwxMiArOTM4LDEyIEBACiAJZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKIAloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihmYyk7CiAKLQlpZihIVENDaGVjayhpZWVlLCBza2ItPmRhdGEpKQorCWlmIChIVENDaGVjayhpZWVlLCBza2ItPmRhdGEpKQogCXsKIAkJaWYobmV0X3JhdGVsaW1pdCgpKQogCQlwcmludGsoImZpbmQgSFRDQ29udHJvbFxuIik7CiAJCWhkcmxlbiArPSA0OwotCQlyeF9zdGF0cy0+YkNvbnRhaW5IVEMgPSAxOworCQlyeF9zdGF0cy0+YkNvbnRhaW5IVEMgPSB0cnVlOwogCX0KIAogCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwpAQCAtMTI3NCwxMyArMTI3MywxMyBAQAogCX0KICovCiAvL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgotCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgJiYgSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKQorCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlICYmIElzUW9TRGF0YUZyYW1lKHNrYi0+ZGF0YSkKIAkJJiYgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQogCXsKIAkJVElEID0gRnJhbWVfUW9TVElEKHNrYi0+ZGF0YSk7CiAJCVNlcU51bSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOwogCQlHZXRUcyhpZWVlLChQVFNfQ09NTU9OX0lORk8gKikgJnBUUyxoZHItPmFkZHIyLFRJRCxSWF9ESVIsdHJ1ZSk7Ci0JCWlmKFRJRCAhPTAgJiYgVElEICE9MykKKwkJaWYgKFRJRCAhPTAgJiYgVElEICE9MykKIAkJewogCQkJaWVlZS0+YmlzX2FueV9ub25iZXBrdHMgPSB0cnVlOwogCQl9CkBAIC0xMjkwLDcgKzEyODksNyBAQAogCXBheWxvYWQgPSBza2ItPmRhdGEgKyBoZHJsZW47CiAJLy9ldGhlcnR5cGUgPSAocGF5bG9hZFs2XSA8PCA4KSB8IHBheWxvYWRbN107CiAJcnhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeGIpLCBHRlBfQVRPTUlDKTsKLQlpZihyeGIgPT0gTlVMTCkKKwlpZiAocnhiID09IE5VTEwpCiAJewogCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwiJXMoKToga21hbGxvYyByeGIgZXJyb3JcbiIsX19mdW5jX18pOwogCQlnb3RvIHJ4X2Ryb3BwZWQ7CkBAIC0xMzM2LDcgKzEzMzUsNyBAQAogCiAJCQkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKIAkJCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc3ViX3NrYi0+bGVuOwotCQkJCWlmKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRzdCkpIHsKKwkJCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSkgewogCQkJCQlzdGF0cy0+bXVsdGljYXN0Kys7CiAJCQkJfQogCkBAIC0xNTkwLDE0ICsxNTg5LDE0IEBACiAJdTggKmFkZHIyCiApCiB7Ci0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAl7Ci0JCWlmKGluZm9fZWxlbWVudC0+bGVuIT0gMCkKKwkJaWYgKGluZm9fZWxlbWVudC0+bGVuIT0gMCkKIAkJewogCQkJbWVtY3B5KG5ldHdvcmstPkNvdW50cnlJZUJ1ZiwgaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbik7CiAJCQluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSBpbmZvX2VsZW1lbnQtPmxlbjsKIAotCQkJaWYoIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCQlpZiAoIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCiAJCQl7CiAJCQkJRG90MTFkX1VwZGF0ZUNvdW50cnlJZShpZWVlLCBhZGRyMiwgaW5mb19lbGVtZW50LT5sZW4sIGluZm9fZWxlbWVudC0+ZGF0YSk7CiAJCQl9CkBAIC0xNjA4LDcgKzE2MDcsNyBAQAogCQkvLyBzb21lIEFQIChlLmcuIENpc2NvIDEyNDIpIGRvbid0IGluY2x1ZGUgY291bnRyeSBJRSBpbiB0aGVpcgogCQkvLyBwcm9iZSByZXNwb25zZSBmcmFtZS4KIAkJLy8KLQkJaWYoSVNfRVFVQUxfQ0lFX1NSQyhpZWVlLCBhZGRyMikgKQorCQlpZiAoSVNfRVFVQUxfQ0lFX1NSQyhpZWVlLCBhZGRyMikgKQogCQl7CiAJCQlVUERBVEVfQ0lFX1dBVENIRE9HKGllZWUpOwogCQl9CkBAIC0xNzA1LDcgKzE3MDQsNyBAQAogI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKIAkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0KIAkJCQkJICAgICAgKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLAotCQkJCQkgICAgICBuZXR3b3JrLT5yYXRlc1tpXSk7CisJCQkJCSAgICAgIG5ldHdvcmstPnJhdGVzX2V4W2ldKTsKICNlbmRpZgogCQkJCWlmIChpZWVlODAyMTFfaXNfb2ZkbV9yYXRlCiAJCQkJICAgIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CkBAIC0xODg4LDcgKzE4ODcsNyBAQAogCiAJCQkvL2lmKHRtcF9odGNhcF9sZW4gIT0wICB8fCAgdG1wX2h0aW5mb19sZW4gIT0gMCkKIAkJCXsKLQkJCQlpZigoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCWlmICgoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgogCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKIAkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDA1ICYmCiAJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhiNSkgfHwKQEAgLTE5NDAsNyArMTkzOSw3IEBACiAJCQllbHNlCiAJCQkJbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ID0gZmFsc2U7CiAJCQkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUCBvZiBjaXNjbwotCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPiA0ICYmCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPiA0ICYmCiAJCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKIAkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg0MCAmJgogCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDk2ICYmCkBAIC0xOTc2LDcgKzE5NzUsNyBAQAogCQkJCQluZXR3b3JrLT5iQ2N4Um1FbmFibGUgPSBmYWxzZTsKIAkJCQl9CiAJCQl9Ci0JCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+IDQgICYmCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPiA0ICAmJgogCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCiAJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NDAgJiYKIAkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg5NiAmJgpAQCAtMjI5Niw3ICsyMjk1LDcgQEAKIAlkc3QtPnJhdGVzX2xlbiA9IHNyYy0+cmF0ZXNfbGVuOwogCW1lbWNweShkc3QtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4X2xlbik7CiAJZHN0LT5yYXRlc19leF9sZW4gPSBzcmMtPnJhdGVzX2V4X2xlbjsKLQlpZihzcmMtPnNzaWRfbGVuID4gMCkKKwlpZiAoc3JjLT5zc2lkX2xlbiA+IDApCiAJewogCQltZW1zZXQoZHN0LT5zc2lkLCAwLCBkc3QtPnNzaWRfbGVuKTsKIAkJZHN0LT5zc2lkX2xlbiA9IHNyYy0+c3NpZF9sZW47CkBAIC0yMzUyLDcgKzIzNTEsNyBAQAogCQlkc3QtPnFvc19kYXRhLnBhcmFtX2NvdW50ID0gc3JjLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKIAl9CiAKLQlpZihkc3QtPnFvc19kYXRhLnN1cHBvcnRlZCA9PSAxKSB7CisJaWYgKGRzdC0+cW9zX2RhdGEuc3VwcG9ydGVkID09IDEpIHsKIAkJZHN0LT5Rb1NfRW5hYmxlID0gMTsKIAkJaWYoZHN0LT5zc2lkX2xlbikKIAkJCUlFRUU4MDIxMV9ERUJVR19RT1MKQEAgLTIzNjcsNyArMjM2Niw3IEBACiAKIAkvKiBkc3QtPmxhc3RfYXNzb2NpYXRlIGlzIG5vdCBvdmVyd3JpdHRlbiAqLwogCWRzdC0+d21tX2luZm8gPSBzcmMtPndtbV9pbmZvOyAvL3N1cmUgdG8gZXhpc3QgaW4gYmVhY29uIG9yIHByb2JlIHJlc3BvbnNlIGZyYW1lLgotCWlmKHNyYy0+d21tX3BhcmFtWzBdLmFjX2FjaV9hY21fYWlmc258fCBcCisJaWYgKHNyYy0+d21tX3BhcmFtWzBdLmFjX2FjaV9hY21fYWlmc258fCBcCiAJICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbnx8IFwKIAkgICBzcmMtPndtbV9wYXJhbVsyXS5hY19hY2lfYWNtX2FpZnNufHwgXAogCSAgIHNyYy0+d21tX3BhcmFtWzNdLmFjX2FjaV9hY21fYWlmc24pIHsKQEAgLTI0NTYsNyArMjQ1NSw3IEBACiAKIAlpZiAoIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkpCiAJCXJldHVybjsKLQlpZihpZWVlLT5iR2xvYmFsRG9tYWluKQorCWlmIChpZWVlLT5iR2xvYmFsRG9tYWluKQogCXsKIAkJaWYgKFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0gSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApCiAJCXsKQEAgLTI0NzIsNyArMjQ3MSw3IEBACiAJCQllbHNlCiAJCQl7CiAJCQkJLy8gRmlsdGVyIG92ZXIgY2hhbm5lbCBjaDEyfjE0Ci0JCQkJaWYobmV0d29yay5jaGFubmVsID4gMTEpCisJCQkJaWYgKG5ldHdvcmsuY2hhbm5lbCA+IDExKQogCQkJCXsKIAkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKIAkJCQkJcmV0dXJuOwpAQCAtMjQ5Myw3ICsyNDkyLDcgQEAKIAkJCWVsc2UKIAkJCXsKIAkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKLQkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxNCkKKwkJCQlpZiAobmV0d29yay5jaGFubmVsID4gMTQpCiAJCQkJewogCQkJCQlwcmludGsoIkdldFNjYW5JbmZvKCk6IEZvciBHbG9iYWwgRG9tYWluLCBmaWx0ZXIgYmVhY29uIGF0IGNoYW5uZWwoJWQpLlxuIixuZXR3b3JrLmNoYW5uZWwpOwogCQkJCQlyZXR1cm47CkBAIC0yNTE0LDkgKzI1MTMsOSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCWlmKGlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yaywgaWVlZSkpIHsKKwlpZiAoaXNfc2FtZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrLCBpZWVlKSkgewogCQl1cGRhdGVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yayk7Ci0JCWlmKChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHIHx8IGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfRykKKwkJaWYgKChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHIHx8IGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfRykKIAkJJiYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlcnBfaW5mb192YWxpZCl7CiAJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5lcnBfdmFsdWUmIEVSUF9Vc2VQcm90ZWN0aW9uKQogCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uID0gdHJ1ZTsKQEAgLTI2MDYsNyArMjYwNSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCWlmIChpc19iZWFjb24oYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSYmaXNfc2FtZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrLCBpZWVlKSYmXAogCQkoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpIHsKLQkJaWYoaWVlZS0+aGFuZGxlX2JlYWNvbiAhPSBOVUxMKSB7CisJCWlmIChpZWVlLT5oYW5kbGVfYmVhY29uICE9IE5VTEwpIHsKIAkJCWllZWUtPmhhbmRsZV9iZWFjb24oaWVlZS0+ZGV2LGJlYWNvbiwmaWVlZS0+Y3VycmVudF9uZXR3b3JrKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCBkMTQ3MTg3Li5jMjM4ODgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC02Miw3ICs2Miw3IEBACiB7CiAJdTggKnRhZyA9ICp0YWdfcDsKIAotCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgewogCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVM7CiAJCSp0YWcrKyA9IDQ7CiAJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwpAQCAtNzksNyArNzksNyBAQAogewogCXU4ICp0YWcgPSAqdGFnX3A7CiAKLQkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKwkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSB7CiAKIAkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTX0VYOwogCQkqdGFnKysgPSA4OwpAQCAtMTkyLDcgKzE5Miw3IEBACiAJZWxzZQogCQlyYXRlID0gaWVlZS0+YmFzaWNfcmF0ZSAmIDB4N2Y7CiAKLQlpZihyYXRlID09IDApeworCWlmIChyYXRlID09IDApIHsKIAkJLy8gMjAwNS4wMS4yNiwgYnkgcmNuamtvLgogCQlpZihpZWVlLT5tb2RlID09IElFRUVfQXx8CiAJCSAgIGllZWUtPm1vZGU9PSBJRUVFX05fNUd8fApAQCAtMzY5LDcgKzM2OSw3IEBACiAJLy91bnNpZ25lZCBsb25nIGZsYWdzOwogCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKIAotCWlmIChza2IpeworCWlmIChza2IpIHsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CiAJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCkBAIC0zNzgsNyArMzc4LDcgQEAKIC8vCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKIAogCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKLQlpZihpZWVlLT5iZWFjb25fdHhpbmcgJiYgaWVlZS0+aWVlZV91cCl7CisJaWYgKGllZWUtPmJlYWNvbl90eGluZyAmJiBpZWVlLT5pZWVlX3VwKSB7CiAvLwkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmJlYWNvbl90aW1lcikpCiAvLwkJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKIAkJbW9kX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIsamlmZmllcysoTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbC01KSkpOwpAQCAtNDA0LDcgKzQwNCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXEoaWVlZSk7Ci0JaWYgKHNrYil7CisJaWYgKHNrYikgewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JxKys7CiAJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCkBAIC00MTMsNyArNDEzLDcgQEAKIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYgKGllZWUtPmFjdGl2ZV9zY2FuICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlEpKXsKKwlpZiAoaWVlZS0+YWN0aXZlX3NjYW4gJiYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUSkpIHsKIAkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7CiAJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOwogCX0KQEAgLTU4Nyw3ICs1ODcsNyBAQAogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKIC8vCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSl7CisJaWYgKGllZWUtPnNjYW5uaW5nID09IDEpIHsKIAkJaWVlZS0+c2Nhbm5pbmcgPSAwOwogCiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CkBAIC02MDksMTUgKzYwOSwxNSBAQAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewotCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCQlpZiAoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKIAkJewogCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwogCQl9CiAJfQogCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pewotCQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCl7CisJCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKSB7CiAJCQlpZWVlLT5zY2FubmluZyA9IDE7CiAJCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIDApOwogCQl9CkBAIC02MjksOSArNjI5LDkgQEAKIC8qIGNhbGxlZCB3aXRoIHd4X3NlbSBoZWxkICovCiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewotCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCQlpZiAoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKIAkJewogCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwogCQl9CkBAIC03MzksNyArNzM5LDcgQEAKIAlIVENvbnN0cnVjdEluZm9FbGVtZW50KGllZWUsdG1wX2h0X2luZm9fYnVmLCZ0bXBfaHRfaW5mb19sZW4sIGVuY3J5cHQpOwogCiAKLQlpZihwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikKKwlpZiAocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCiAJewogCQl0bXBfZ2VuZXJpY19pZV9idWYgPSBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyOwogCQl0bXBfZ2VuZXJpY19pZV9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcik7CkBAIC04MDMsNyArODAzLDcgQEAKIAkqKHRhZysrKSA9IDE7CiAJKih0YWcrKykgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKIAotCWlmKGF0aW1fbGVuKXsKKwlpZiAoYXRpbV9sZW4pIHsKIAkJKih0YWcrKykgPSBNRklFX1RZUEVfSUJTU19TRVQ7CiAJCSoodGFnKyspID0gMjsKIApAQCAtODEyLDEyICs4MTIsMTIgQEAKIAkJdGFnKz0yOwogCX0KIAotCWlmKGVycF9sZW4peworCWlmIChlcnBfbGVuKSB7CiAJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKIAkJKih0YWcrKykgPSAxOwogCQkqKHRhZysrKSA9IGVycGluZm9fY29udGVudDsKIAl9Ci0JaWYocmF0ZV9leF9sZW4peworCWlmIChyYXRlX2V4X2xlbikgewogCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFU19FWDsKIAkJKih0YWcrKykgPSByYXRlX2V4X2xlbi0yOwogCQltZW1jcHkodGFnLCBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXgsIHJhdGVfZXhfbGVuLTIpOwpAQCAtODc3LDcgKzg3Nyw3IEBACiAJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKIAllbHNlIGNyeXB0ID0gTlVMTDsKIAotCWVuY3J5cHQgPSAoY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisJZW5jcnlwdCA9IGNyeXB0ICYmIGNyeXB0LT5vcHM7CiAKIAlpZiAoZW5jcnlwdCkKIAkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOwpAQCAtMTAxNiwxMiArMTAxNiwxMiBAQAogCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJiAoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsIldFUCIpIHx8IHdwYV9pZV9sZW4pKTsKIAogCS8vSW5jbHVkZSBIaWdoIFRocm91cHV0IGNhcGFiaWxpdHkgJiYgUmVhbHRlayBwcm9wcmlldGFyeQotCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpCisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpCiAJewogCQlodF9jYXBfYnVmID0gKHU4ICopJihpZWVlLT5wSFRJbmZvLT5TZWxmSFRDYXApOwogCQlodF9jYXBfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CiAJCUhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoaWVlZSwgaHRfY2FwX2J1ZiwgJmh0X2NhcF9sZW4sIGVuY3J5cHQpOwotCQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24pCisJCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24pCiAJCXsKIAkJCXJlYWx0ZWtfaWVfYnVmID0gaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcjsKIAkJCXJlYWx0ZWtfaWVfbGVuID0gc2l6ZW9mKCBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyKTsKQEAgLTEwMjksMTYgKzEwMjksMTYgQEAKIAogCQl9CiAJfQotCWlmKGllZWUtPnFvc19zdXBwb3J0KXsKKwlpZiAoaWVlZS0+cW9zX3N1cHBvcnQpIHsKIAkJd21tX2luZm9fbGVuID0gYmVhY29uLT5xb3NfZGF0YS5zdXBwb3J0ZWQ/OTowOwogCX0KIAogCi0JaWYoYmVhY29uLT5iQ2tpcFN1cHBvcnRlZCkKKwlpZiAoYmVhY29uLT5iQ2tpcFN1cHBvcnRlZCkKIAl7CiAJCWNraXBfaWVfbGVuID0gMzArMjsKIAl9Ci0JaWYoYmVhY29uLT5iQ2N4Um1FbmFibGUpCisJaWYgKGJlYWNvbi0+YkNjeFJtRW5hYmxlKQogCXsKIAkJY2N4cm1faWVfbGVuID0gNisyOwogCX0KQEAgLTExNDEsNyArMTE0MSw3IEBACiAJCXRhZyArPSBvc0NjeEFpcm9uZXRJRS5MZW5ndGg7CiAJfQogCi0JaWYoYmVhY29uLT5iQ2N4Um1FbmFibGUpCisJaWYgKGJlYWNvbi0+YkNjeFJtRW5hYmxlKQogCXsKIAkJc3RhdGljIHU4IENjeFJtQ2FwQnVmW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgMHgwMSwgMHgwMH07CiAJCU9DVEVUX1NUUklORyBvc0NjeFJtQ2FwOwpAQCAtMTE2OCw4ICsxMTY4LDggQEAKIAkJdGFnICs9IG9zQ2N4VmVyTnVtLkxlbmd0aDsKIAl9CiAJLy9IVCBjYXAgZWxlbWVudAotCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpewotCQlpZihpZWVlLT5wSFRJbmZvLT5lUGVlckhUU3BlY1ZlciAhPSBIVF9TUEVDX1ZFUl9FV0MpCisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICYmIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkgeworCQlpZiAoaWVlZS0+cEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgIT0gSFRfU1BFQ19WRVJfRVdDKQogCQl7CiAJCQl0YWcgPSBza2JfcHV0KHNrYiwgaHRfY2FwX2xlbik7CiAJCQkqdGFnKysgPSBNRklFX1RZUEVfSFRfQ0FQOwpAQCAtMTE4MiwyMiArMTE4MiwyMiBAQAogCiAJLy9jaG9vc2Ugd2hhdCB3cGFfc3VwcGxpY2FudCBnaXZlcyB0byBhc3NvY2lhdGUuCiAJdGFnID0gc2tiX3B1dChza2IsIHdwYV9pZV9sZW4pOwotCWlmICh3cGFfaWVfbGVuKXsKKwlpZiAod3BhX2llX2xlbikgewogCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOwogCX0KIAogCXRhZyA9IHNrYl9wdXQoc2tiLCB3bW1faW5mb19sZW4pOwotCWlmKHdtbV9pbmZvX2xlbikgeworCWlmICh3bW1faW5mb19sZW4pIHsKIAkgIGllZWU4MDIxMV9XTU1fSW5mbyhpZWVlLCAmdGFnKTsKIAl9CiAjaWZkZWYgVEhPTUFTX1RVUkJPCiAJdGFnID0gc2tiX3B1dChza2IsIHR1cmJvX2luZm9fbGVuKTsKLQlpZih0dXJib19pbmZvX2xlbikgeworCWlmICh0dXJib19pbmZvX2xlbikgewogCQlpZWVlODAyMTFfVFVSQk9fSW5mbyhpZWVlLCAmdGFnKTsKIAl9CiAjZW5kaWYKIAotCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpeworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAmJiBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpIHsKIAkJaWYoaWVlZS0+cEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgPT0gSFRfU1BFQ19WRVJfRVdDKQogCQl7CiAJCQl0YWcgPSBza2JfcHV0KHNrYiwgaHRfY2FwX2xlbik7CkBAIC0xMjA3LDcgKzEyMDcsNyBAQAogCQkJdGFnICs9IGh0X2NhcF9sZW4gLTI7CiAJCX0KIAotCQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24peworCQlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uKSB7CiAJCQl0YWcgPSBza2JfcHV0KHNrYiwgcmVhbHRla19pZV9sZW4pOwogCQkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CiAJCQkqdGFnKysgPSByZWFsdGVrX2llX2xlbiAtIDI7CkBAIC0xMjczLDcgKzEyNzMsNyBAQAogCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJCS8vQlVHT04gd2hlbiB5b3UgdHJ5IHRvIGFkZF90aW1lciB0d2ljZSwgdXNpbmcgbW9kX3RpbWVyIG1heSBiZSBiZXR0ZXIsIGpvaG4wNzA5Ci0JCWlmKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKSB7CiAJCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKIAkJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAkJfQpAQCAtMTM1OCw3ICsxMzU4LDcgQEAKIAl9CiAJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDIgKiAoMSArIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwvNTAwKTsKIAkvLyBUbyBwcmV2ZW50IHRoZSBpbW1lZGlhdGVseSBjYWxsaW5nIHdhdGNoX2RvZyBhZnRlciBhc3NvY2lhdGlvbi4KLQlpZihpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9PTB8fGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9PTAgKQorCWlmIChpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9PTB8fGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9PTAgKQogCXsKIAkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID0gMTsKIAkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0gMTsKQEAgLTEzNzEsNyArMTM3MSw3IEBACiAJZWxzZSBpZihpZWVlLT5pc19zaWxlbnRfcmVzZXQgPT0gMSkKIAl7CiAJCXByaW50aygiPT09PT09PT09PT09PT09PT09PnNpbGVudCByZXNldCBhc3NvY2lhdGVcbiIpOwotCQlpZWVlLT5pc19zaWxlbnRfcmVzZXQgPSAwOworCQlpZWVlLT5pc19zaWxlbnRfcmVzZXQgPSBmYWxzZTsKIAl9CiAKIAlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKQEAgLTE0MzAsNyArMTQzMCw3IEBACiAJCXJldHVybjsKIAogCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpeworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CiAJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgQVAgTUFDLCB3ZSBuZWVkIGFsc28gdGhlIGVzc2lkCiAJCSAqIFRoaXMgY291bGQgYmUgb2J0YWluZWQgYnkgYmVhY29ucyBvciwgaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QKIAkJICogYnJvYWRjYXN0IGl0LCBpdCBjYW4gYmUgcHV0IG1hbnVhbGx5LgpAQCAtMTQ1OCwxMyArMTQ1OCwxMyBAQAogCQkJCS8qIGlmIHRoZSBlc3NpZCBpcyBoaWRkZW4gcmVwbGFjZSBpdCB3aXRoIHRoZQogCQkJCSogZXNzaWQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCiAJCQkJKi8KLQkJCQlpZiAoIXNzaWRicm9hZCl7CisJCQkJaWYgKCFzc2lkYnJvYWQpIHsKIAkJCQkJc3RybmNweSh0bXBfc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKIAkJCQkJdG1wX3NzaWRfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOwogCQkJCX0KIAkJCQltZW1jcHkoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgbmV0LCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CiAKLQkJCQlpZiAoIXNzaWRicm9hZCl7CisJCQkJaWYgKCFzc2lkYnJvYWQpIHsKIAkJCQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgdG1wX3NzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKIAkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gdG1wX3NzaWRfbGVuOwogCQkJCX0KQEAgLTE1NDEsMTYgKzE1NDEsMTYgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOwogCXU4ICp0OwotCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKKwlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpIHsKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsc2tiLT5sZW4pOwogCQlyZXR1cm4gMHhjYWZlOwogCX0KIAkqY2hhbGxlbmdlID0gTlVMTDsKIAlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKikgc2tiLT5kYXRhOwotCWlmKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArMykpeworCWlmIChza2ItPmxlbiA+IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKyAzKSkgewogCQl0ID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOwogCi0JCWlmKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKXsKKwkJaWYgKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKSB7CiAJCQkqY2hsZW4gPSAqKHQrKyk7CiAJCQkqY2hhbGxlbmdlID0ga21lbWR1cCh0LCAqY2hsZW4sIEdGUF9BVE9NSUMpOwogCQkJaWYgKCEqY2hhbGxlbmdlKQpAQCAtMTU2Nyw3ICsxNTY3LDcgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOwogCi0JaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpeworCWlmIChza2ItPmxlbiA8IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgLSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgewogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiAlZFxuIixza2ItPmxlbik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xNjAxLDcgKzE2MDEsNyBAQAogCXRhZyA9IHNrYi0+ZGF0YSArIHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICk7CiAKIAl3aGlsZSAodGFnKzEgPCBza2JlbmQpewotCQlpZiAoKnRhZyA9PSAwKXsKKwkJaWYgKCp0YWcgPT0gMCkgewogCQkJc3NpZCA9IHRhZysyOwogCQkJc3NpZGxlbiA9ICoodGFnKzEpOwogCQkJYnJlYWs7CkBAIC0xNjQyLDcgKzE2NDIsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKnJlc3BvbnNlX2hlYWQ7CiAJdTE2IHN0YXR1c19jb2RlOwogCi0JaWYgKHNrYi0+bGVuIDwgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSl7CisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKSB7CiAJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLCBza2ItPmxlbik7CiAJCXJldHVybiAweGNhZmU7CiAJfQpAQCAtMTY3Miw3ICsxNjcyLDcgQEAKIAkvL0lFRUU4MDIxMURNRVNHKCJSeCBwcm9iZSIpOwogCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfcHJvYmVfcnErKzsKIAkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOwotCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKXsKKwlpZiAocHJvYmVfcnFfcGFyc2UoaWVlZSwgc2tiLCBkZXN0KSkgewogCQkvL0lFRUU4MDIxMURNRVNHKCJXYXMgZm9yIG1lISIpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JzKys7CiAJCWllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKGllZWUsIGRlc3QpOwpAQCAtMTcwMyw3ICsxNzAzLDcgQEAKIAkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19ycSsrOwotCWlmIChhc3NvY19ycV9wYXJzZShza2IsZGVzdCkgIT0gLTEpeworCWlmIChhc3NvY19ycV9wYXJzZShza2IsIGRlc3QpICE9IC0xKSB7CiAJCWllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKGllZWUsIGRlc3QpOwogCX0KIApAQCAtMTc1NSwxMyArMTc1NSwxMyBAQAogCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICE9IGllZWUtPm1nbXRfcXVldWVfaGVhZCkpCiAJCXJldHVybiAwOwogCi0JaWYodGltZV9sKXsKKwlpZiAodGltZV9sKSB7CiAJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCiAJCQkrIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsCiAJCQkqIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkgKiAxMDAwOwogCX0KIAotCWlmKHRpbWVfaCl7CisJaWYgKHRpbWVfaCkgewogCQkqdGltZV9oID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVsxXTsKIAkJaWYodGltZV9sICYmICp0aW1lX2wgPCBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdKQogCQkJKnRpbWVfaCArPSAxOwpAQCAtMTc4Miw3ICsxNzgyLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKLQlpZigoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8CisJaWYgKChpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQgfHwKIAkJaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBIHx8CiAJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpKXsKIApAQCAtMTg0MSw4ICsxODQxLDggQEAKIAogdm9pZCBpZWVlODAyMTFfc3RhX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpCiB7Ci0JaWYoaWVlZS0+c3RhX3NsZWVwID09IDApewotCQlpZihubCl7CisJaWYgKGllZWUtPnN0YV9zbGVlcCA9PSAwKSB7CisJCWlmIChubCkgewogCQkJcHJpbnRrKCJXYXJuaW5nOiBkcml2ZXIgaXMgcHJvYmFibHkgZmFpbGluZyB0byByZXBvcnQgVFggcHMgZXJyb3JcbiIpOwogCQkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKIAkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwpAQCAtMTg1Niw3ICsxODU2LDcgQEAKIAogCWllZWUtPnN0YV9zbGVlcCA9IDA7CiAKLQlpZihubCl7CisJaWYgKG5sKSB7CiAJCWllZWUtPnBzX3JlcXVlc3RfdHhfYWNrKGllZWUtPmRldik7CiAJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwogCX0KQEAgLTE4NzAsNyArMTg3MCw3IEBACiAKIAlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMil7CiAJCS8qIE51bGwgZnJhbWUgd2l0aCBQUyBiaXQgc2V0ICovCi0JCWlmKHN1Y2Nlc3MpeworCQlpZiAoc3VjY2VzcykgewogCQkJaWVlZS0+c3RhX3NsZWVwID0gMTsKIAkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldixpZWVlLT5wc190aCxpZWVlLT5wc190bCk7CiAJCX0KQEAgLTE4ODEsNyArMTg4MSw3IEBACiAJLyogMjExMTIwMDUgLSB0eCBhZ2FpbiBudWxsIHdpdGhvdXQgUFMgYml0IGlmIGxvc3QgKi8KIAllbHNlIHsKIAotCQlpZigoaWVlZS0+c3RhX3NsZWVwID09IDApICYmICFzdWNjZXNzKXsKKwkJaWYgKChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgJiYgIXN1Y2Nlc3MpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CiAJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKQEAgLTE5MjAsNiArMTkyMCw2NiBAQAogCXJldHVybjsKIAogfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY2hlY2tfYXV0aF9yZXNwb25zZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIGRlZmF1bHQgc3VwcG9ydCBOIG1vZGUsIGRpc2FibGUgaGFsZk5tb2RlICovCisJYm9vbCBiU3VwcG9ydE5tb2RlID0gdHJ1ZSwgYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwl1MTYgZXJyY29kZTsKKwl1OCAqY2hhbGxlbmdlOworCWludCBjaGxlbiA9IDA7CisJdTMyIGlvdEFjdGlvbjsKKworCWVycmNvZGUgPSBhdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKTsKKwlpZiAoIWVycmNvZGUpIHsKKwkJaWYgKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpIHsKKwkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7CisJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKKwkJCWlvdEFjdGlvbiA9IGllZWUtPnBIVEluZm8tPklPVEFjdGlvbjsKKwkJCWlmICghKGlvdEFjdGlvbiAmIEhUX0lPVF9BQ1RfUFVSRV9OX01PREUpKSB7CisJCQkJaWYgKCFpZWVlLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhpZWVlLT5kZXYpKSB7CisJCQkJCS8qIFdFUCBvciBUS0lQIGVuY3J5cHRpb24gKi8KKwkJCQkJaWYgKElzSFRIYWxmTm1vZGVBUHMoaWVlZSkpIHsKKwkJCQkJCWJTdXBwb3J0Tm1vZGUgPSB0cnVlOworCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSB0cnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJYlN1cHBvcnRObW9kZSA9IGZhbHNlOworCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwkJCQkJfQorCQkJCQluZXRkZXZfZGJnKGllZWUtPmRldiwgIlNFQyglZCwgJWQpXG4iLAorCQkJCQkJCWJTdXBwb3J0Tm1vZGUsCisJCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUpOworCQkJCX0KKwkJCX0KKwkJCS8qIER1bW15IHdpcmxlc3MgbW9kZSBzZXR0aW5nLSBhdm9pZCBlbmNyeXB0aW9uIGlzc3VlICovCisJCQlpZiAoYlN1cHBvcnRObW9kZSkgeworCQkJCS8qIE4gbW9kZSBzZXR0aW5nICovCisJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwKKwkJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogYi9nIG1vZGUgc2V0dGluZyAtIFRPRE8gKi8KKwkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOworCQkJfQorCisJCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RyAmJgorCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9PSB0cnVlKSB7CisJCQkJbmV0ZGV2X2RiZyhpZWVlLT5kZXYsICJlbnRlciBoYWxmIE4gbW9kZVxuIik7CisJCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0gdHJ1ZTsKKwkJCX0gZWxzZQorCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9IGZhbHNlOworCisJCQlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKGllZWUpOworCQl9IGVsc2UgeworCQkJaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKGllZWUsIGNoYWxsZW5nZSwgY2hsZW4pOworCQl9CisJfSBlbHNlIHsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aCByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4IiwgZXJyY29kZSk7CisJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJfQorfQorCiBpbmxpbmUgaW50CiBpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKQEAgLTE5MjcsMTIgKzE5ODcsOSBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOwogCXUxNiBlcnJjb2RlOwotCXU4ICpjaGFsbGVuZ2U7Ci0JaW50IGNobGVuPTA7CiAJaW50IGFpZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvY19yZXNwOwogLy8Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudDsKLQlib29sIGJTdXBwb3J0Tm1vZGUgPSB0cnVlLCBiSGFsZlN1cHBvcnRObW9kZSA9IGZhbHNlOyAvL2RlZmF1bHQgc3VwcG9ydCBOIG1vZGUsIGRpc2FibGUgaGFsZk5tb2RlCiAKIAlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCkKIAkJcmV0dXJuIDA7CkBAIC0xOTY3LDcgKzIwMjQsNyBAQAogCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7CiAJCQkJLyogc3RhdGlvbiBzdXBwb3J0IHFvcyAqLwogCQkJCS8qIExldCB0aGUgcmVnaXN0ZXIgc2V0dGluZyBkZWZhdWx0bHkgd2l0aCBMZWdhY3kgc3RhdGlvbiAqLwotCQkJCWlmKGllZWUtPnFvc19zdXBwb3J0KSB7CisJCQkJaWYgKGllZWUtPnFvc19zdXBwb3J0KSB7CiAJCQkJCWFzc29jX3Jlc3AgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqKXNrYi0+ZGF0YTsKIAkJCQkJbWVtc2V0KG5ldHdvcmssIDAsIHNpemVvZigqbmV0d29yaykpOwogCQkJCQlpZiAoaWVlZTgwMjExX3BhcnNlX2luZm9fcGFyYW0oaWVlZSxhc3NvY19yZXNwLT5pbmZvX2VsZW1lbnQsXApAQCAtMjAxMyw2OCArMjA3MCwxNiBAQAogCiAJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKIAotCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpewotCQkJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyAmJgotCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSB7CisJCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HCisJCQkJJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CiAKLQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIik7Ci0KLQkJCQkJZXJyY29kZSA9IGF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pOwotCQkJCQlpZiAoIWVycmNvZGUpIHsKLQkJCQkJCWlmKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpewotCQkJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7Ci0JCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX29rKys7Ci0JCQkJCQkJaWYoIShpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24mSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoIWllZWUtPkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKGllZWUtPmRldikpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCQkJLy8gV0VQIG9yIFRLSVAgZW5jcnlwdGlvbgotCQkJCQkJCQkJaWYoSXNIVEhhbGZObW9kZUFQcyhpZWVlKSkKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQliU3VwcG9ydE5tb2RlID0gdHJ1ZTsKLQkJCQkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IHRydWU7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJYlN1cHBvcnRObW9kZSA9IGZhbHNlOwotCQkJCQkJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCXByaW50aygiPT09PT09PT09PT50byBsaW5rIHdpdGggQVAgdXNpbmcgU0VDKCVkLCAlZCkiLCBiU3VwcG9ydE5tb2RlLCBiSGFsZlN1cHBvcnRObW9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJLyogRHVtbXkgd2lybGVzcyBtb2RlIHNldHRpbmcgdG8gYXZvaWQgZW5jcnlwdGlvbiBpc3N1ZSAqLwotCQkJCQkJCWlmKGJTdXBwb3J0Tm1vZGUpIHsKLQkJCQkJCQkJLy9OIG1vZGUgc2V0dGluZwotCQkJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBcCi0JCQkJCQkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUpOwotCQkJCQkJCX1lbHNlewotCQkJCQkJCQkvL2IvZyBtb2RlIHNldHRpbmcKLQkJCQkJCQkJLypUT0RPKi8KLQkJCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RyAmJiBiSGFsZlN1cHBvcnRObW9kZSA9PSB0cnVlKQotCQkJCQkJCXsKLQkJCQkJCQkJcHJpbnRrKCI9PT09PT09PT09PT09PT0+ZW50ZXJuIGhhbGYgTiBtb2RlXG4iKTsKLQkJCQkJCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPSBmYWxzZTsKLQotCQkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlewotCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOwotCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXgiLGVycmNvZGUpOwotCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQkJCQkJfQotCi0JCQkJfWVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpewotCQkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOwotCQkJCX0KKwkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aCByZXNwb25zZSIpOworCQkJCWllZWU4MDIxMV9jaGVja19hdXRoX3Jlc3BvbnNlKGllZWUsIHNrYik7CisJCQl9IGVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOwogCQkJfQorCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgpAQCAtMjExMCwyNyArMjExNSwyNiBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwogCX0KIAogCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAlyZXR1cm4gMDsKIH0KIAotLyogZm9sbG93aW5nIGFyZSBmb3IgYSBzaW1wbGVyIFRYIHF1ZXVlIG1hbmFnZW1lbnQuCi0gKiBJbnN0ZWFkIG9mIHVzaW5nIG5ldGlmX1tzdG9wL3dha2VdX3F1ZXVlIHRoZSBkcml2ZXIKLSAqIHdpbGwgdXNlcyB0aGVzZSB0d28gZnVuY3Rpb24gKHBsdXMgYSByZXNldCBvbmUpLCB0aGF0Ci0gKiB3aWxsIGludGVybmFsbHkgdXNlcyB0aGUga2VybmVsIG5ldGlmXyogYW5kIHRha2VzCi0gKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCi0gKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0Ci0gKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQotICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KLSAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgotICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KLSAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQotICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAorLyogVGhlIGZvbGxvd2luZyBhcmUgZm9yIGEgc2ltcGxlciBUWCBxdWV1ZSBtYW5hZ2VtZW50LgorICogSW5zdGVhZCBvZiB1c2luZyBuZXRpZl9bc3RvcC93YWtlXV9xdWV1ZSwgdGhlIGRyaXZlcgorICogd2lsbCB1c2UgdGhlc2UgdHdvIGZ1bmN0aW9ucyAocGx1cyBhIHJlc2V0IG9uZSkgdGhhdAorICogd2lsbCBpbnRlcm5hbGx5IGNhbGwgdGhlIGtlcm5lbCBuZXRpZl8qIGFuZCB0YWtlIGNhcmUKKyAqIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCisgKiBTbywgdGhlIGRyaXZlciByZWNlaXZlcyBhIGZyYWdtZW50IGF0IGEgdGltZSBhbmQgbWlnaHQKKyAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50cywgd2l0aG91dCB0YWtpbmcKKyAqIGNhcmUgdG8gaGF2ZSBlbm91Z2ggcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgorICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkcyBpdHMgb3duCisgKiBkZXNjcmlwdG9yLiBUaHVzLCBqdXN0IGtlZXBpbmcgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbm90IGVub3VnaC4gSWYgdGhlCisgKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QsIHRoZW4geW91IHdvdWxkIG5lZWQKICAqIHRvIGtlZXAgTiBmcmVlIGRlc2NyaXB0b3JzIHdoZXJlCi0gKiBOID0gTUFYX1BBQ0tFVF9TSVpFIC8gTUlOX0ZSQUdfVFJFU0hPTEQKKyAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19USFJFU0hPTEQuCiAgKiBJbiB0aGlzIHdheSB5b3UgbmVlZCBqdXN0IG9uZSBhbmQgdGhlIDgwMi4xMSBzdGFjawogICogd2lsbCB0YWtlIGNhcmUgb2YgYnVmZmVyaW5nIGZyYWdtZW50cyBhbmQgcGFzcyB0aGVtIHRvCiAgKiB0byB0aGUgZHJpdmVyIGxhdGVyLCB3aGVuIGl0IHdha2VzIHRoZSBxdWV1ZS4KQEAgLTIxNTIsNyArMjE1Niw3IEBACiAJaWVlZS0+c3RhdHMudHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CiAJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOwogCXRjYl9kZXNjID0gKGNiX2Rlc2MgKikodHhiLT5mcmFnbWVudHNbMF0tPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwotCWlmKHRjYl9kZXNjLT5iTXVsdGljYXN0KSB7CisJaWYgKHRjYl9kZXNjLT5iTXVsdGljYXN0KSB7CiAJCWllZWUtPnN0YXRzLm11bHRpY2FzdCsrOwogCX0KIAkvKiBpZiB4bWl0IGF2YWlsYWJsZSwganVzdCB4bWl0IGl0IGltbWVkaWF0ZWx5LCBlbHNlIGp1c3QgaW5zZXJ0IGl0IHRvIHRoZSB3YWl0IHF1ZXVlICovCkBAIC0yMjI0LDcgKzIyMjgsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAlpbml0X21nbXRfcXVldWUoaWVlZSk7Ci0JaWYgKGllZWUtPnR4X3BlbmRpbmcudHhiKXsKKwlpZiAoaWVlZS0+dHhfcGVuZGluZy50eGIpIHsKIAkJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKIAkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOwogCX0KQEAgLTIyNDYsNyArMjI1MCw3IEBACiAKIAlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKIAotCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKXsKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpIHsKIAkJd2hpbGUgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIChza2IgPSBkZXF1ZXVlX21nbXQoaWVlZSkpKXsKIAogCQkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CkBAIC0yMjY1LDcgKzIyNjksNyBAQAogCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBpZWVlLT50eF9wZW5kaW5nLnR4YikKIAkJaWVlZTgwMjExX3Jlc3VtZV90eChpZWVlKTsKIAotCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpIHsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4YXdha2UrKzsKIAkJbmV0aWZfd2FrZV9xdWV1ZShpZWVlLT5kZXYpOwogCX0KQEAgLTIyODAsNyArMjI4NCw3IEBACiAJLy91bnNpZ25lZCBsb25nIGZsYWdzOwogCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwogCi0JaWYgKCEgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSkgewogCQluZXRpZl9zdG9wX3F1ZXVlKGllZWUtPmRldik7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eHN0b3ArKzsKIAl9CkBAIC0yMzAxLDcgKzIzMDUsNyBAQAogewogCWllZWUtPmFzc29jX2lkID0gMTsKIAotCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKSB7CiAJCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCiAJCQlJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCwKIAkJCUlXX0VTU0lEX01BWF9TSVpFKTsKQEAgLTIzMjUsNyArMjMyOSw3IEBACiAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0JaWYoaWVlZS0+cmF3X3R4KXsKKwlpZiAoaWVlZS0+cmF3X3R4KSB7CiAKIAkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCiAJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CkBAIC0yMzQ1LDEzICsyMzQ5LDEzIEBACiAJICogKGFib3J0KSB0aGlzIHdxICh3aGVuIHN5bmNybyBzY2FubmluZykgYmVmb3JlIHNsZWVwaW5nCiAJICogb24gdGhlIHNlbWFwaG9yZQogCSAqLwotCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKXsKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpIHsKIAkJcHJpbnRrKCI9PT09PT09PT09b2ggZHJpdmVyIGRvd24gcmV0dXJuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKIAkJc3RyY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHN0cmxlbihJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CiAJCWllZWUtPnNzaWRfc2V0ID0gMTsKQEAgLTIzODIsNyArMjM4Niw3IEBACiAJCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhpZWVlKTsKIAogCS8qIHRoZSBuZXR3b3JrIGRlZmluaXRpdmVseSBpcyBub3QgaGVyZS4uIGNyZWF0ZSBhIG5ldyBjZWxsICovCi0JaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSB7CiAJCXByaW50aygiY3JlYXRpbmcgbmV3IElCU1MgY2VsbFxuIik7CiAJCWlmKCFpZWVlLT53YXBfc2V0KQogCQkJaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKGllZWUpOwpAQCAtMjQ1Niw5ICsyNDYwLDkgQEAKIAkvLyBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKIAkvLyBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCiAJLy8KLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICYmICFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpICYmICFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQogCXsKLQkJaWYoISBpZWVlLT5iR2xvYmFsRG9tYWluKQorCQlpZiAoISBpZWVlLT5iR2xvYmFsRG9tYWluKQogCQl7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTI0NzksNyArMjQ4Myw3IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykgewogCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7CiAJCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOwogCX0KQEAgLTI2MzMsNyArMjYzNyw3IEBACiAKIAlpZWVlLT5wcm90b19zdGFydGVkID0gMTsKIAotCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKXsKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMCkgewogCQlkb3sKIAkJCWNoKys7CiAJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCkBAIC0yNzE5LDE2ICsyNzIzLDE0IEBACiAJaWVlZS0+c3RhX2VkY2FfcGFyYW1bMl0gPSAweDAwNUU0MzQyOwogCWllZWUtPnN0YV9lZGNhX3BhcmFtWzNdID0gMHgwMDJGMzI2MjsKIAlpZWVlLT5hZ2dyZWdhdGlvbiA9IHRydWU7Ci0JaWVlZS0+ZW5hYmxlX3J4X2ltbV9CQSA9IDE7CisJaWVlZS0+ZW5hYmxlX3J4X2ltbV9CQSA9IHRydWU7CiAJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOwogCi0JaW5pdF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKLQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7Ci0JaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYjsKKwlzZXR1cF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyLCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpaWVlZSk7CiAKLQlpbml0X3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOwotCWllZWUtPmJlYWNvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGllZWU7Ci0JaWVlZS0+YmVhY29uX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiOworCXNldHVwX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIsIGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYiwKKwkJICAgICh1bnNpZ25lZCBsb25nKWllZWUpOwogCiAJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKIApAQCAtMzAyNywxMiArMzAyOSwxMSBAQAogCiAJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CiAKLQkJbmV3X2NyeXB0ID0ga21hbGxvYyhzaXplb2YoKm5ld19jcnlwdCksIEdGUF9LRVJORUwpOworCQluZXdfY3J5cHQgPSBremFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CiAJCW5ld19jcnlwdC0+b3BzID0gb3BzOwogCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKIAkJCW5ld19jcnlwdC0+cHJpdiA9CkBAIC0zMTQwLDcgKzMxNDEsNyBAQAogCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJCXNrYiA9IGllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbixpZWVlLGFzUnNuKTsKLQkJaWYgKHNrYil7CisJCWlmIChza2IpIHsKIAkJCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCQkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiAJCX0KQEAgLTMxNTUsNyArMzE1Niw3IEBACiAJZG93bigmaWVlZS0+d3hfc2VtKTsKIAkvL0lFRUVfREVCVUdfSU5GTygid3BhX3N1cHBsaWNhbnQ6IGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKIAotCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKXsKKwlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlX3BhcmFtKSB8fCAhcC0+cG9pbnRlcikgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMjEwLDcgKzMyMTEsNyBAQAogCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQogCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQoaWVlZS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0wobm90aWZ5X3d4X2Fzc29jX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwppbmRleCA2NDQzNjhkLi43MTRmYmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCkBAIC0zNiw3ICszNiw3IEBACiAKIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCi0JaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CiAJCXJldCA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgogCQlpZWVlLT53YXBfc2V0ID09IDApCiAKLQkJbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUtPmFwX2FkZHIuc2FfZGF0YSk7CiAJZWxzZQogCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLAogCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CkBAIC0xNDgsMTIgKzE0OCwxMiBAQAogCiAJZG93bigmaWVlZS0+d3hfc2VtKTsKIAkvKiB1c2UgaWZjb25maWcgaHcgZXRoZXIgKi8KLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICh0ZW1wLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKXsKKwlpZiAodGVtcC0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CiAJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKIAkvLyBUbyBwcmV2ZW50IHRoZSBpbW1lZGlhdGVseSBjYWxsaW5nIHdhdGNoX2RvZyBhZnRlciBzY2FuLgotCWlmKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCisJaWYgKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCiAJewogCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QgPSAxOwogCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPSAxOwpAQCAtMzY5LDcgKzM2OSw3IEBACiAKIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEoaWVlZS0+cHJvdG9fc3RhcnRlZCkpeworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCAhKGllZWUtPnByb3RvX3N0YXJ0ZWQpKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MDAsMTIgKzQwMCwxMiBAQAogCiAJcHJvdG9fc3RhcnRlZCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7CiAKLQlpZiAod3JxdS0+ZXNzaWQubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpeworCWlmICh3cnF1LT5lc3NpZC5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkgewogCQlyZXQ9IC1FMkJJRzsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKIAkJcmV0PSAtMTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDY5LDkgKzQ2OSw5IEBACiAJcHJpbnRrKEtFUk5fSU5GTyJyYXcgVFggaXMgJXNcbiIsCiAJICAgICAgaWVlZS0+cmF3X3R4ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAKLQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCiAJewotCQlpZihwcmV2ID09IDAgJiYgaWVlZS0+cmF3X3R4KXsKKwkJaWYgKHByZXYgPT0gMCAmJiBpZWVlLT5yYXdfdHgpIHsKIAkJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQogCQkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiAJaW50IHJldCA9IDA7CiAJZG93bigmaWVlZS0+d3hfc2VtKTsKIAotCWlmICh3cnF1LT5wb3dlci5kaXNhYmxlZCl7CisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKSB7CiAJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX0RJU0FCTEVEOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNTcyLDcgKzU3Miw3IEBACiB7CiAJZG93bigmaWVlZS0+d3hfc2VtKTsKIAotCWlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCl7CisJaWYgKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCkgewogCQl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDE7CiAJCWdvdG8gZXhpdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwppbmRleCBmY2E3M2M3Li45ZjY4YzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTMyLDcgKzMyLDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgpAQCAtNTU0LDE2ICs1NTMsMTYgQEAKICNpZmRlZiBUT19ET19MSVNUCiAJaWYoIUlzRGF0YUZyYW1lKHBGcmFtZSkpCiAJewotCQlwVGNiLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gVFJVRTsKLQkJcFRjYi0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gVFJVRTsKKwkJcFRjYi0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IHRydWU7CisJCXBUY2ItPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IHRydWU7CiAJCXBUY2ItPlJBVFJJbmRleCA9IDc7CiAJCXJldHVybjsKIAl9CiAKIAlpZihwTWdudEluZm8tPkZvcmNlZERhdGFSYXRlIT0gMCkKIAl7Ci0JCXBUY2ItPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSBUUlVFOwotCQlwVGNiLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSBUUlVFOworCQlwVGNiLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gdHJ1ZTsKKwkJcFRjYi0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gdHJ1ZTsKIAkJcmV0dXJuOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCmluZGV4IDFiNDYyM2MuLjYxOGQyY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKQEAgLTQ2LDE0ICs0NiwxNCBAQAogCXU4CQkJYlNlbmRERUxCQSA9IGZhbHNlOwogCiAJLy8gRGVsZXRlIHBlbmRpbmcgQkEKLQlpZihwUGVuZGluZ0JhLT5iVmFsaWQpCisJaWYgKHBQZW5kaW5nQmEtPmJWYWxpZCkKIAl7CiAJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBQZW5kaW5nQmEpOwogCQliU2VuZERFTEJBID0gdHJ1ZTsKIAl9CiAKIAkvLyBEZWxldGUgYWRtaXR0ZWQgQkEKLQlpZihwQWRtaXR0ZWRCYS0+YlZhbGlkKQorCWlmIChwQWRtaXR0ZWRCYS0+YlZhbGlkKQogCXsKIAkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQmEpOwogCQliU2VuZERFTEJBID0gdHJ1ZTsKQEAgLTc0LDcgKzc0LDcgQEAKIAlQQkFfUkVDT1JECQlwQmEgPSAmcFJ4VHMtPlJ4QWRtaXR0ZWRCQVJlY29yZDsKIAl1OAkJCWJTZW5kREVMQkEgPSBmYWxzZTsKIAotCWlmKHBCYS0+YlZhbGlkKQorCWlmIChwQmEtPmJWYWxpZCkKIAl7CiAJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCYSk7CiAJCWJTZW5kREVMQkEgPSB0cnVlOwpAQCAtMzYzLDcgKzM2Myw3IEBACiAKIAlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PnJ4IEFEREJBUkVRIGZyb20gOiVwTVxuIiwgZHN0KTsKIC8vc29tZSBvdGhlciBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSBub3cuCi0JaWYoCShpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDApIHx8CisJaWYgKChpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDApIHx8CiAJCShpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSkpIC8vfHwKIAkvLwkoaWVlZS0+cFN0YVFvcy0+YkVuYWJsZVJ4SW1tQkEgPT0gZmFsc2UpCSkKIAl7CkBAIC0zNzMsNyArMzczLDcgQEAKIAl9CiAJLy8gU2VhcmNoIGZvciByZWxhdGVkIHRyYWZmaWMgc3RyZWFtLgogCS8vIElmIHRoZXJlIGlzIG5vIG1hdGNoZWQgVFMsIHJlamVjdCB0aGUgQUREQkEgcmVxdWVzdC4KLQlpZigJIUdldFRzKAorCWlmICghR2V0VHMoCiAJCQlpZWVlLAogCQkJKFBUU19DT01NT05fSU5GTyAqKSgmcFRTKSwKIAkJCWRzdCwKQEAgLTM5MCw3ICszOTAsNyBAQAogCS8vIFdlIGNhbiBkbyBtdWNoIG1vcmUgY2hlY2sgaGVyZSwgaW5jbHVkaW5nIEJ1ZmZlclNpemUsIEFNU0RVX1N1cHBvcnQsIFBvbGljeSwgU3RhcnRTZXFDdHJsLi4uCiAJLy8gSSB3YW50IHRvIGNoZWNrIFN0YXJ0U2VxQ3RybCB0byBtYWtlIHN1cmUgd2hlbiB3ZSBzdGFydCBhZ2dyZWdhdGlvbiEhIQogCS8vCi0JaWYocEJhUGFyYW1TZXQtPmZpZWxkLkJBUG9saWN5ID09IEJBX1BPTElDWV9ERUxBWUVEKQorCWlmIChwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCiAJewogCQlyYyA9IEFEREJBX1NUQVRVU19JTlZBTElEX1BBUkFNOwogCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIkJBIFBvbGljeSBpcyBub3QgY29ycmVjdCBpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CkBAIC01MjIsNyArNTIyLDcgQEAKIAkJLy8gV2UgY2FuIGNvbXBhcmUgdGhlIHZhbHVlIG9mIEJBIHBhcmFtZXRlciBzZXQgdGhhdCBQZWVyIHJldHVybmVkIGFuZCBTZWxmIHNlbnQuCiAJCS8vIElmIGl0IGlzIE9LLCB0aGVuIGFkbWl0dGVkLiBPciB3ZSBjYW4gc2VuZCBERUxCQSB0byBjYW5jZWwgQkEgbWVjaGFuaXNtLgogCQkvLwotCQlpZihwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCisJCWlmIChwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCiAJCXsKIAkJCS8vIFNpbmNlIHRoaXMgaXMgYSBraW5kIG9mIEFEREJBIGZhaWxlZCwgd2UgZGVsYXkgbmV4dCBBRERCQSBwcm9jZXNzLgogCQkJcFRTLT5iQWRkQmFSZXFEZWxheWVkID0gdHJ1ZTsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9PSAwIHx8CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCB8fAogCQlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCiAJewogCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInJlY2VpdmVkIERFTEJBIHdoaWxlIFFPUyBvciBIVCBpcyBub3Qgc3VwcG9ydGVkKCVkLCAlZClcbiIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpOwpAQCAtNjAwLDcgKzYwMCw3IEBACiAJewogCQlQUlhfVFNfUkVDT1JECXBSeFRzOwogCi0JCWlmKCAhR2V0VHMoCisJCWlmICghR2V0VHMoCiAJCQkJaWVlZSwKIAkJCQkoUFRTX0NPTU1PTl9JTkZPICopJnBSeFRzLAogCQkJCWRzdCwKQEAgLTYxOCw3ICs2MTgsNyBAQAogCXsKIAkJUFRYX1RTX1JFQ09SRAlwVHhUczsKIAotCQlpZighR2V0VHMoCisJCWlmICghR2V0VHMoCiAJCQlpZWVlLAogCQkJKFBUU19DT01NT05fSU5GTyAqKSZwVHhUcywKIAkJCWRzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYwppbmRleCBlNjBkOTI2Li5jMjU4OGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCkBAIC00NzEsMTIgKzQ3MSwxMCBAQAogc3RhdGljIGJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1NUd29TcGF0aWFsU3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJCQkJIHU4ICpQZWVyTWFjQWRkcikKIHsKLQlib29sIHJldFZhbHVlID0gZmFsc2U7Ci0KICNpZmRlZiBUT0RPCiAJLy8gQXBwbHkgZm9yIDgxOXUgb25seQogI2VuZGlmCi0JcmV0dXJuIHJldFZhbHVlOworCXJldHVybiBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00ODgsMTEgKzQ4Niw4IEBACiAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdTggSFRJT1RBY3RJc0Rpc2FibGVFRENBVHVyYm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJICAgICB1OCAqUGVlck1hY0FkZHIpCi17Ci0JdTgJcmV0VmFsdWUgPSBmYWxzZTsJLy8gZGVmYXVsdCBlbmFibGUgRURDQSBUdXJibyBtb2RlLgotCS8vIFNldCBzcGVjaWZpYyBFRENBIHBhcmFtZXRlciBmb3IgZGlmZmVyZW50IEFQIGluIERNIGhhbmRsZXIuCi0KLQlyZXR1cm4gcmV0VmFsdWU7Cit7CS8qIGRlZmF1bHQgZW5hYmxlIEVEQ0EgVHVyYm8gbW9kZS4gKi8KKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTA4LDcgKzUwMyw3IEBACiAJLy8gMjAwOC8wMS8yNSBNSCBKdWRlZyBpZiB3ZSBuZWVkIHRvIHVzZSBPRkRNIHRvIHNuZWQgTUdOVCBmcmFtZSBmb3IgYnJvYWRjb20gQVAuCiAJLy8gMjAwOC8wMS8yOCBNSCBXZSBtdXN0IHByZXZlbnQgdGhhdCB3ZSBzZWxlY3QgbnVsbCBic3NpZCB0byBsaW5rLgogCi0JaWYobmV0d29yay0+YnJvYWRjb21fY2FwX2V4aXN0KQorCWlmIChuZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QpCiAJewogCQlyZXRWYWx1ZSA9IDE7CiAJfQpAQCAtNjI1LDcgKzYyMCw3IEBACiAKIAkvLyAyMDA4LjA2LjEyCiAJLy8gRm9yIFJUTDgxOVgsIGlmIHBhaXJ3aXNla2V5ID0gd2VwL3RraXAsIGFwIGlzIHJhbGluaywgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KLQlpZihpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCisJaWYgKGllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKIAl7CiAJCWludCBpOwogCQlmb3IoaSA9IDE7IGk8IDE2OyBpKyspCkBAIC03NTIsNyArNzQ3LDcgQEAKIAkqcG9zUlQyUlRBZ2crKyA9IDB4MDE7CiAJKnBvc1JUMlJUQWdnID0gMHgxMDsvLypwb3NSVDJSVEFnZyA9IDB4MDI7CiAKLQlpZihpZWVlLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkgeworCWlmIChpZWVlLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkgewogCQkqcG9zUlQyUlRBZ2cgfD0gMHgwODsvL1JUX0hUX0NBUF9VU0VfV09XOwogCX0KIApAQCAtODc5LDE3ICs4NzQsMTcgQEAKIAogCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCiAJewotCQlpZihhdmFpbGFibGVNY3NSYXRlW2ldICE9IDApCisJCWlmIChhdmFpbGFibGVNY3NSYXRlW2ldICE9IDApCiAJCXsKIAkJCWJpdE1hcCA9IGF2YWlsYWJsZU1jc1JhdGVbaV07CiAJCQlmb3IoaiA9IDA7IGogPCA4OyBqKyspCiAJCQl7Ci0JCQkJaWYoKGJpdE1hcCUyKSAhPSAwKQorCQkJCWlmICgoYml0TWFwJTIpICE9IDApCiAJCQkJewogCQkJCQlpZihIVE1jc1RvRGF0YVJhdGUoaWVlZSwgKDgqaStqKSkgPiBIVE1jc1RvRGF0YVJhdGUoaWVlZSwgbWNzUmF0ZSkpCiAJCQkJCQltY3NSYXRlID0gKDgqaStqKTsKIAkJCQl9Ci0JCQkJYml0TWFwID0gYml0TWFwPj4xOworCQkJCWJpdE1hcCA+Pj0gMTsKIAkJCX0KIAkJfQogCX0KQEAgLTEwNjcsNyArMTA2Miw3IEBACiAKIAkvLyBMYW5oc2luOiBtYXJrIGZvciB0bXAgdG8gYXZvaWQgZGVhdXRoIGJ5IGFwIGZyb20gIHMzCiAJLy9pZihtZW1jbXAocE1nbnRJbmZvLT5Cc3NpZCwgTkVUR0VBUjgzNEJ2Ml9CUk9BRENPTSwgMyk9PTApCi0JaWYoMCkKKwlpZiAoMCkKIAkJewogCiAJCQlwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gZmFsc2U7CkBAIC0xMzAzLDcgKzEyOTgsNyBAQAogLy8JUEhUX0NBUEFCSUxJVFlfRUxFCQlwUGVlckhUQ2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZjsKIAlQSFRfSU5GT1JNQVRJT05fRUxFCQlwUGVlckhUSW5mbyA9IChQSFRfSU5GT1JNQVRJT05fRUxFKXBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZjsKIAotCWlmKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCWlmIChwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkKIAl7CiAJCS8vCiAJCS8vIENvbmZpZyBjdXJyZW50IG9wZXJhdGlvbiBtb2RlLgpAQCAtMTMyOCw3ICsxMzIzLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdTggSFRDQ2hlY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwRnJhbWUpCiB7Ci0JaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpCisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQogCXsKIAkJaWYgKChJc1FvU0RhdGFGcmFtZShwRnJhbWUpICYmIEZyYW1lX09yZGVyKHBGcmFtZSkpID09IDEpIHsKIAkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJIVCBDT05UUk9MIEZJTEVEIEVYSVNUISFcbiIpOwpAQCAtMTM1Nyw3ICsxMzUyLDcgQEAKIC8vCQlyZXR1cm47CiAKIC8vCXNwaW5fbG9ja19pcnFzYXZlKCYoaWVlZS0+Yndfc3BpbmxvY2spLCBmbGFncyk7Ci0JaWYocEhUSW5mby0+YlN3QndJblByb2dyZXNzKSB7CisJaWYgKHBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcykgewogLy8JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5id19zcGlubG9jayksIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UUy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmgKaW5kZXggN2VkNzI0My4uODczOTY5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmgKQEAgLTEsMTQgKzEsMTQgQEAKICNpZm5kZWYgX1RTVFlQRV9IXwogI2RlZmluZSBfVFNUWVBFX0hfCiAjaW5jbHVkZSAicnRsODE5eF9Rb3MuaCIKLSNkZWZpbmUgVFNfU0VUVVBfVElNRU9VVAk2MCAgLy8gSW4gbWlsbGlzZWNvbmQKKyNkZWZpbmUgVFNfU0VUVVBfVElNRU9VVAk2MCAgLyogIEluIG1pbGxpc2Vjb25kICovCiAjZGVmaW5lIFRTX0lOQUNUX1RJTUVPVVQJNjAKICNkZWZpbmUgVFNfQUREQkFfREVMQVkJCTYwCiAKICNkZWZpbmUgVE9UQUxfVFNfTlVNCQkxNgogI2RlZmluZSBUQ0xBU19OVU0JCTQKIAotLy8gVGhpcyBkZWZpbmUgdGhlIFR4L1J4IGRpcmVjdGlvbnMKKy8qICBUaGlzIGRlZmluZSB0aGUgVHgvUnggZGlyZWN0aW9ucyAqLwogdHlwZWRlZiBlbnVtIF9UUl9TRUxFQ1QgewogCVRYX0RJUiA9IDAsCiAJUlhfRElSID0gMSwKQEAgLTI4LDkgKzI4LDkgQEAKIHR5cGVkZWYgc3RydWN0IF9UWF9UU19SRUNPUkR7CiAJVFNfQ09NTU9OX0lORk8JCVRzQ29tbW9uSW5mbzsKIAl1MTYJCQkJVHhDdXJTZXE7Ci0JQkFfUkVDT1JECQkJVHhQZW5kaW5nQkFSZWNvcmQ7CS8vIEZvciBCQSBPcmlnaW5hdG9yCi0JQkFfUkVDT1JECQkJVHhBZG1pdHRlZEJBUmVjb3JkOwkvLyBGb3IgQkEgT3JpZ2luYXRvcgotLy8JUU9TX0RMX1JFQ09SRAkJRExSZWNvcmQ7CisJQkFfUkVDT1JECQkJVHhQZW5kaW5nQkFSZWNvcmQ7CS8qICBGb3IgQkEgT3JpZ2luYXRvciAqLworCUJBX1JFQ09SRAkJCVR4QWRtaXR0ZWRCQVJlY29yZDsJLyogIEZvciBCQSBPcmlnaW5hdG9yICovCisvKiAJUU9TX0RMX1JFQ09SRAkJRExSZWNvcmQ7ICovCiAJdTgJCQkJYkFkZEJhUmVxSW5Qcm9ncmVzczsKIAl1OAkJCQliQWRkQmFSZXFEZWxheWVkOwogCXU4CQkJCWJVc2luZ0JhOwpAQCAtNDQsMTEgKzQ0LDExIEBACiAJdTE2CQkJCVJ4VGltZW91dEluZGljYXRlU2VxOwogCXN0cnVjdCBsaXN0X2hlYWQJCVJ4UGVuZGluZ1BrdExpc3Q7CiAJc3RydWN0IHRpbWVyX2xpc3QJCVJ4UGt0UGVuZGluZ1RpbWVyOwotCUJBX1JFQ09SRAkJCVJ4QWRtaXR0ZWRCQVJlY29yZDsJIC8vIEZvciBCQSBSZWNpcGllbnQKKwlCQV9SRUNPUkQJCQlSeEFkbWl0dGVkQkFSZWNvcmQ7CSAvKiAgRm9yIEJBIFJlY2lwaWVudCAqLwogCXUxNgkJCQlSeExhc3RTZXFOdW07CiAJdTgJCQkJUnhMYXN0RnJhZ051bTsKIAl1OAkJCQludW07Ci0vLwlRT1NfRExfUkVDT1JECQlETFJlY29yZDsKKy8qIAlRT1NfRExfUkVDT1JECQlETFJlY29yZDsgKi8KIH0gUlhfVFNfUkVDT1JELCAqUFJYX1RTX1JFQ09SRDsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKaW5kZXggYWNhYTcyMy4uZWE5MmZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYwpAQCAtMTU2LDI2ICsxNTYsMTYgQEAKIAkJcFR4VFMtPm51bSA9IGNvdW50OwogCQkvLyBUaGUgdGltZXJzIGZvciB0aGUgb3BlcmF0aW9uIG9mIFRyYWZmaWMgU3RyZWFtIGFuZCBCbG9jayBBY2suCiAJCS8vIERMUyByZWxhdGVkIHRpbWVyIHdpbGwgYmUgYWRkIGhlcmUgaW4gdGhlIGZ1dHVyZSEhCi0JCWluaXRfdGltZXIoJnBUeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lcik7Ci0JCXBUeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFR4VFM7Ci0JCXBUeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lci5mdW5jdGlvbiA9IFRzU2V0dXBUaW1lT3V0OwotCi0JCWluaXRfdGltZXIoJnBUeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lcik7Ci0JCXBUeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFR4VFM7Ci0JCXBUeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lci5mdW5jdGlvbiA9IFRzSW5hY3RUaW1lb3V0OwotCi0JCWluaXRfdGltZXIoJnBUeFRTLT5Uc0FkZEJhVGltZXIpOwotCQlwVHhUUy0+VHNBZGRCYVRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlRzQWRkQmFUaW1lci5mdW5jdGlvbiA9IFRzQWRkQmFQcm9jZXNzOwotCi0JCWluaXRfdGltZXIoJnBUeFRTLT5UeFBlbmRpbmdCQVJlY29yZC5UaW1lcik7Ci0JCXBUeFRTLT5UeFBlbmRpbmdCQVJlY29yZC5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFR4VFM7Ci0JCXBUeFRTLT5UeFBlbmRpbmdCQVJlY29yZC5UaW1lci5mdW5jdGlvbiA9IEJhU2V0dXBUaW1lT3V0OwotCi0JCWluaXRfdGltZXIoJnBUeFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIpOwotCQlwVHhUUy0+VHhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lci5mdW5jdGlvbiA9IFR4QmFJbmFjdFRpbWVvdXQ7Ci0KKwkJc2V0dXBfdGltZXIoJnBUeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lciwgVHNTZXR1cFRpbWVPdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpcFR4VFMpOworCQlzZXR1cF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLCBUc0luYWN0VGltZW91dCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylwVHhUUyk7CisJCXNldHVwX3RpbWVyKCZwVHhUUy0+VHNBZGRCYVRpbWVyLCBUc0FkZEJhUHJvY2VzcywKKwkJCSAgICAodW5zaWduZWQgbG9uZylwVHhUUyk7CisJCXNldHVwX3RpbWVyKCZwVHhUUy0+VHhQZW5kaW5nQkFSZWNvcmQuVGltZXIsIEJhU2V0dXBUaW1lT3V0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKXBUeFRTKTsKKwkJc2V0dXBfdGltZXIoJnBUeFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIsCisJCQkgICAgVHhCYUluYWN0VGltZW91dCwgKHVuc2lnbmVkIGxvbmcpcFR4VFMpOwogCQlSZXNldFR4VHNFbnRyeShwVHhUUyk7CiAJCWxpc3RfYWRkX3RhaWwoJnBUeFRTLT5Uc0NvbW1vbkluZm8uTGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKIAkJcFR4VFMrKzsKQEAgLTE4OSwyMyArMTc5LDE0IEBACiAJewogCQlwUnhUUy0+bnVtID0gY291bnQ7CiAJCUlOSVRfTElTVF9IRUFEKCZwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdCk7Ci0KLQkJaW5pdF90aW1lcigmcFJ4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyKTsKLQkJcFJ4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwUnhUUzsKLQkJcFJ4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmZ1bmN0aW9uID0gVHNTZXR1cFRpbWVPdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFJ4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyKTsKLQkJcFJ4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwUnhUUzsKLQkJcFJ4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmZ1bmN0aW9uID0gVHNJbmFjdFRpbWVvdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFJ4VFMtPlJ4QWRtaXR0ZWRCQVJlY29yZC5UaW1lcik7Ci0JCXBSeFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOwotCQlwUnhUUy0+UnhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gUnhCYUluYWN0VGltZW91dDsKLQotCQlpbml0X3RpbWVyKCZwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIpOwotCQlwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOwotCQlwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIuZnVuY3Rpb24gPSBSeFBrdFBlbmRpbmdUaW1lb3V0OwotCisJCXNldHVwX3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIsIFRzU2V0dXBUaW1lT3V0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKXBSeFRTKTsKKwkJc2V0dXBfdGltZXIoJnBSeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lciwgVHNJbmFjdFRpbWVvdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpcFJ4VFMpOworCQlzZXR1cF90aW1lcigmcFJ4VFMtPlJ4QWRtaXR0ZWRCQVJlY29yZC5UaW1lciwKKwkJCSAgICBSeEJhSW5hY3RUaW1lb3V0LCAodW5zaWduZWQgbG9uZylwUnhUUyk7CisJCXNldHVwX3RpbWVyKCZwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIsIFJ4UGt0UGVuZGluZ1RpbWVvdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpcFJ4VFMpOwogCQlSZXNldFJ4VHNFbnRyeShwUnhUUyk7CiAJCWxpc3RfYWRkX3RhaWwoJnBSeFRTLT5Uc0NvbW1vbkluZm8uTGlzdCwgJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKIAkJcFJ4VFMrKzsKQEAgLTI4OCw3ICsyNjksNyBAQAogCS8vZm9yKGRpciA9IERJUl9VUDsgZGlyIDw9IERJUl9CSV9ESVI7IGRpcisrKQogCWZvcihkaXIgPSAwOyBkaXIgPD0gRElSX0JJX0RJUjsgZGlyKyspCiAJewotCQlpZihzZWFyY2hfZGlyW2Rpcl0gPT1mYWxzZSApCisJCWlmICghc2VhcmNoX2RpcltkaXJdKQogCQkJY29udGludWU7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkocFJldCwgcHNlYXJjaF9saXN0LCBMaXN0KXsKIAkvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUywgIkFERDolcE0sIFRJRDolZCwgZGlyOiVkXG4iLCBwUmV0LT5BZGRyLCBwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y1RTSUQsIHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjRGlyZWN0aW9uKTsKQEAgLTQwMCw4ICszODEsNyBAQAogCX0KIAllbHNlCiAJewotCQlpZihiQWRkTmV3VHMgPT0gZmFsc2UpCi0JCXsKKwkJaWYgKCFiQWRkTmV3VHMpIHsKIAkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFMsICJhZGQgbmV3IFRTIGZhaWxlZCh0aWQ6JWQpXG4iLCBVUCk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5jCmluZGV4IDE4NjgzNTIuLmUwMDAzMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCVR4QUdDID0gcG93ZXJsZXZlbDsKIAotCWlmIChwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPT0gVFJVRSkgeworCWlmIChwcml2LT5iRHluYW1pY1R4TG93UG93ZXIpIHsKIAkJaWYgKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKIAkJCVR4QUdDID0gMHgyMjsKIAkJZWxzZQpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCQlwcml2LT5Qd3JfVHJhY2sgPSB3cml0ZVZhbF90bXA7CiAJCX0KIAotCQlpZiAocHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9PSBUUlVFKSB7CisJCWlmIChwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyKSB7CiAJCQkvKkFkZCBieSBKYWNrZW4gMjAwOC8wMy8wNgogCQkJICpFbWlseSwgMjAwODA2MTMuIFNldCBsb3cgdHggcG93ZXIgZm9yIGJvdGggTUNTIGFuZCBsZWdhY3kgT0ZETQogCQkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuaAppbmRleCBmYTZkZDM3Li42ZTU2NjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmgKQEAgLTEzLDggKzEzLDkgQEAKICNpZm5kZWYgUlRMODIyNUgKICNkZWZpbmUgUlRMODIyNUgKIAotI2RlZmluZSBSVEw4MTlYX1RPVEFMX1JGX1BBVEggMiAvL2ZvciA4MTkyVQotZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1NkJhbmR3aWR0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICwgSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgpOworI2RlZmluZSBSVEw4MTlYX1RPVEFMX1JGX1BBVEggMiAvKiBmb3IgODE5MlUgKi8KK2V4dGVybiB2b2lkIFBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCk7CiBleHRlcm4gdm9pZCBQSFlfUkY4MjU2X0NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1NkNDS1R4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgJcG93ZXJsZXZlbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmgKaW5kZXggYzlkOGMxMC4uNmMyZTQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaApAQCAtNDAsOCArNDAsNiBAQAogI2RlZmluZSBSVEw4MTkyVQogI2RlZmluZSBSVEw4MTl4VV9NT0RVTEVfTkFNRSAicnRsODE5eFUiCiAvKiBIVyBzZWN1cml0eSAqLwotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgMQogI2RlZmluZSBNQVhfS0VZX0xFTiAgICAgNjEKICNkZWZpbmUgS0VZX0JVRl9TSVpFICAgIDUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwppbmRleCBlMDMxYTI1Li5hNDc5NWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwpAQCAtNDA4LDkgKzQwOCw4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE5Ml9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgcnRsODE5Ml9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUFJPQ0ZTIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODI3LDcgKzgyNiw2IEBACiAJCW5ldGRldl93YXJuKGRldiwgInNrYl9xdWV1ZSBub3QgZW1wdHlcbiIpOwogCiAJc2tiX3F1ZXVlX3B1cmdlKCZwcml2LT5za2JfcXVldWUpOwotCXJldHVybjsKIH0KIAogaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQpAQCAtOTY2LDggKzk2NCw2IEBACiAJcmV0ID0gcnRsODE5Ml90eChkZXYsIHNrYik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47CiB9CiAKIC8qIFRoaXMgaXMgYSByb3VnaCBhdHRlbXB0IHRvIFRYIGEgZnJhbWUKQEAgLTE3NjYsNyArMTc2Miw3IEBACiB9CiAjZW5kaWYKIAotZXh0ZXJuIHZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBydGw4MTkyX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwpAQCAtMTk3MSw3ICsxOTY3LDcgQEAKIH0KIAogCi12b2lkIHJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CkBAIC0yMDY3LDcgKzIwNjMsNiBAQAogCQltZW1jcHkoaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgaWVlZS0+UmVnSFRTdXBwUmF0ZVNldCwgMTYpOwogCWVsc2UKIAkJbWVtc2V0KGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB1OCBydGw4MTkyX2dldFN1cHBvcnRlZFdpcmVsZWVNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMDc4LDEwICsyMDczLDEwIEBACiAJY2FzZSBSRl84MjI1OgogCWNhc2UgUkZfODI1NjoKIAljYXNlIFJGX1BTRVVET18xMU46Ci0JCXJldCA9IChXSVJFTEVTU19NT0RFX05fMjRHfFdJUkVMRVNTX01PREVfR3xXSVJFTEVTU19NT0RFX0IpOworCQlyZXQgPSBXSVJFTEVTU19NT0RFX05fMjRHfFdJUkVMRVNTX01PREVfR3xXSVJFTEVTU19NT0RFX0I7CiAJCWJyZWFrOwogCWNhc2UgUkZfODI1ODoKLQkJcmV0ID0gKFdJUkVMRVNTX01PREVfQXxXSVJFTEVTU19NT0RFX05fNUcpOworCQlyZXQgPSBXSVJFTEVTU19NT0RFX0F8V0lSRUxFU1NfTU9ERV9OXzVHOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSBXSVJFTEVTU19NT0RFX0I7CkBAIC0yMTQzLDcgKzIxMzgsNyBAQAogCS8vZm9yIHNpbGVudCByZXNldAogCXByaXYtPklycFBlbmRpbmdDb3VudCA9IDE7CiAJcHJpdi0+UmVzZXRQcm9ncmVzcyA9IFJFU0VUX1RZUEVfTk9SRVNFVDsKLQlwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQgPSAwOworCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9IGZhbHNlOwogCXByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayA9IGZhbHNlOwogCXByaXYtPmZvcmNlX3Jlc2V0ID0gZmFsc2U7CiAKQEAgLTIyNDcsOSArMjI0Miw5IEBACiAJbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwogfQogCi1leHRlcm4gIHZvaWQgICAgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAotdm9pZCBydGw4MTkyX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaXJxX3J4X3Rhc2tsZXQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwogLy9pbml0IHRhc2tsZXQgYW5kIHdhaXRfcXVldWUgaGVyZS4gb25seSAyLjYgYWJvdmUga2VybmVsIGlzIGNvbnNpZGVyZWQKICNkZWZpbmUgRFJWX05BTUUgIndsYW4wIgogc3RhdGljIHZvaWQgcnRsODE5Ml9pbml0X3ByaXZfdGFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjMxMCwxMSArMjMwNSwxMSBAQAogCX0KIAogCWlmIChiTG9hZF9Gcm9tX0VFUE9NKSB7Ci0JCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVklEPj4xKSk7CisJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9WSUQ+PjEpOwogCQlwcml2LT5lZXByb21fdmlkID0gZW5kaWFuX3N3YXAoJnRtcFZhbHVlKTsKLQkJcHJpdi0+ZWVwcm9tX3BpZCA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1BJRD4+MSkpOwotCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX0NoYW5uZWxQbGFuPj4xKSk7Ci0JCXByaXYtPmVlcHJvbV9DaGFubmVsUGxhbiA9ICgodG1wVmFsdWUmMHhmZjAwKT4+OCk7CisJCXByaXYtPmVlcHJvbV9waWQgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX1BJRD4+MSk7CisJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9DaGFubmVsUGxhbj4+MSk7CisJCXByaXYtPmVlcHJvbV9DaGFubmVsUGxhbiA9ICh0bXBWYWx1ZSAmIDB4ZmYwMCk+Pjg7CiAJCXByaXYtPmJ0eHBvd2VyZGF0YV9yZWFkZnJvbUVFUE9STSA9IHRydWU7CiAJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gZXByb21fcmVhZChkZXYsIChFRVBST01fQ3VzdG9tZXJfSUQ+PjEpKSA+Pjg7CiAJfSBlbHNlIHsKQEAgLTIzOTcsNyArMjM5Miw4IEBACiAJCQl9CiAJCX0gZWxzZSBpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMSkgewogCQkJaWYgKGJMb2FkX0Zyb21fRUVQT00pIHsKLQkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjE+PjEpKTsKKwkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LAorCQkJCQkJRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjEgPj4gMSk7CiAJCQkJdG1wVmFsdWUgPSAodG1wVmFsdWUgJiAweGZmMDApID4+IDg7CiAJCQl9IGVsc2UgewogCQkJCXRtcFZhbHVlID0gMHgxMDsKQEAgLTI0MTAsNyArMjQwNiw4IEBACiAJCQkJdG1wVmFsdWUgPSAweDEwMTA7CiAJCQkqKCh1MTYgKikoJnByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS19WMVsxXSkpID0gdG1wVmFsdWU7CiAJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKLQkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0R19WMT4+MSkpOworCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsCisJCQkJCUVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEdfVjEgPj4gMSk7CiAJCQllbHNlCiAJCQkJdG1wVmFsdWUgPSAweDEwMTA7CiAJCQkqKCh1MTYgKikoJnByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMF0pKSA9IHRtcFZhbHVlOwpAQCAtMjQ1Myw3ICsyNDUwLDcgQEAKIAkJLy8gQW50ZW5uYSBCIGdhaW4gb2Zmc2V0IHRvIGFudGVubmEgQSwgYml0MH4zCiAJCXByaXYtPkFudGVubmFUeFB3RGlmZlswXSA9IChwcml2LT5FRVBST01UeFBvd2VyRGlmZiAmIDB4Zik7CiAJCS8vIEFudGVubmEgQyBnYWluIG9mZnNldCB0byBhbnRlbm5hIEEsIGJpdDR+NwotCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV0gPSAoKHByaXYtPkVFUFJPTVR4UG93ZXJEaWZmICYgMHhmMCk+PjQpOworCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV0gPSAocHJpdi0+RUVQUk9NVHhQb3dlckRpZmYgJiAweGYwKT4+NDsKIAkJLy8gQ3J5c3RhbENhcCwgYml0MTJ+MTUKIAkJcHJpdi0+Q3J5c3RhbENhcCA9IHByaXYtPkVFUFJPTUNyeXN0YWxDYXA7CiAJCS8vIFRoZXJtYWxNZXRlciwgYml0MH4zIGZvciBSRklDMSwgYml0NH43IGZvciBSRklDMgpAQCAtMjUwNSw3ICsyNTAyLDYgQEAKIAkvL3dlIG5lZWQgaW5pdCBESUcgUkFUUiB0YWJsZSBoZXJlIGFnYWluLgogCiAJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIjw9PT09PT09PT09PSVzKClcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBzaG9ydCBydGw4MTkyX2dldF9jaGFubmVsX21hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjU0Nyw5ICsyNTQzLDggQEAKIAlydGw4MTkyX3JlYWRfZWVwcm9tX2luZm8oZGV2KTsKIAlydGw4MTkyX2dldF9jaGFubmVsX21hcChkZXYpOwogCWluaXRfaGFsX2RtKGRldik7Ci0JaW5pdF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKLQlwcml2LT53YXRjaF9kb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKLQlwcml2LT53YXRjaF9kb2dfdGltZXIuZnVuY3Rpb24gPSB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2s7CisJc2V0dXBfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lciwgd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIAlpZiAocnRsODE5Ml91c2JfaW5pdGVuZHBvaW50cyhkZXYpICE9IDApIHsKIAkJRE1FU0coIkVuZG9wb2ludHMgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjY4Niw3ICsyNjgxLDcgQEAKIAogCXJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgJmR3UmVnUmVhZCk7CiAJaWYgKHByaXYtPkxvb3BiYWNrTW9kZSA9PSBSVEw4MTl4VV9OT19MT09QQkFDSykKLQkJZHdSZWdSZWFkID0gKChkd1JlZ1JlYWQgJiBDUFVfR0VOX05PX0xPT1BCQUNLX01TSykgfCBDUFVfR0VOX05PX0xPT1BCQUNLX1NFVCk7CisJCWR3UmVnUmVhZCA9IChkd1JlZ1JlYWQgJiBDUFVfR0VOX05PX0xPT1BCQUNLX01TSykgfCBDUFVfR0VOX05PX0xPT1BCQUNLX1NFVDsKIAllbHNlIGlmIChwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5eFVfTUFDX0xPT1BCQUNLKQogCQlkd1JlZ1JlYWQgfD0gQ1BVX0NDS19MT09QQkFDSzsKIAllbHNlCkBAIC0yNzY3LDcgKzI3NjIsNyBAQAogCS8vCiAjaWZkZWYgVE9fRE9fTElTVAogCWlmIChBZGFwdGVyLT5SZXNldFByb2dyZXNzID09IFJFU0VUX1RZUEVfTk9SRVNFVCkgewotCQlpZiAocE1nbnRJbmZvLT5SZWdSZk9mZiA9PSBUUlVFKSB7IC8qIFVzZXIgZGlzYWJsZSBSRiB2aWEgcmVnaXN0cnkuICovCisJCWlmIChwTWdudEluZm8tPlJlZ1JmT2ZmID09IHRydWUpIHsgLyogVXNlciBkaXNhYmxlIFJGIHZpYSByZWdpc3RyeS4gKi8KIAkJCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRiksIERCR19MT1VELCAoIkluaXRpYWxpemVBZGFwdGVyODE5eFVzYigpOiBUdXJuIG9mZiBSRiBmb3IgUmVnUmZPZmYgLS0tLS0tLS0tLVxuIikpOwogCQkJTWdudEFjdFNldF9SRl9TdGF0ZShBZGFwdGVyLCBlUmZPZmYsIFJGX0NIQU5HRV9CWV9TVyk7CiAJCQkvLyBUaG9zZSBhY3Rpb25zIHdpbGwgYmUgZGlzY2FyZCBpbiBNZ250QWN0U2V0X1JGX1N0YXRlIGJlY2F1c2Ugb2YgdGhlIHNhbWUgc3RhdGUKQEAgLTI4MTQsMTUgKzI4MDksMTUgQEAKIAkJdTggdG1wdmFsdWU7CiAJCXJlYWRfbmljX2J5dGUoZGV2LCAweDMwMSwgJnRtcHZhbHVlKTsKIAkJaWYgKHRtcHZhbHVlID09IDB4MDMpIHsKLQkJCXByaXYtPmJEY3V0ID0gVFJVRTsKKwkJCXByaXYtPmJEY3V0ID0gdHJ1ZTsKIAkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJELWN1dFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlwcml2LT5iRGN1dCA9IEZBTFNFOworCQkJcHJpdi0+YkRjdXQgPSBmYWxzZTsKIAkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDLWN1dFxuIik7CiAJCX0KIAkJZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nKGRldik7CiAKLQkJaWYgKHByaXYtPmJEY3V0ID09IFRSVUUpIHsKKwkJaWYgKHByaXYtPmJEY3V0KSB7CiAJCQl1MzIgaSwgVGVtcENDazsKIAkJCXUzMiB0bXBSZWdBID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgVHhCQkdhaW5UYWJsZUxlbmd0aDsgaSsrKSB7CkBAIC0yODc0LDExICsyODY5LDExIEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXUxNgkJUmVnVHhDb3VudGVyOwotCWJvb2wJCWJTdHVjayA9IEZBTFNFOworCWJvb2wJCWJTdHVjayA9IGZhbHNlOwogCXJlYWRfbmljX3dvcmQoZGV2LCAweDEyOCwgJlJlZ1R4Q291bnRlcik7CiAJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6UmVnVHhDb3VudGVyIGlzICVkLFR4Q291bnRlciBpcyAlZFxuIiwgX19mdW5jX18sIFJlZ1R4Q291bnRlciwgcHJpdi0+VHhDb3VudGVyKTsKIAlpZiAocHJpdi0+VHhDb3VudGVyID09IFJlZ1R4Q291bnRlcikKLQkJYlN0dWNrID0gVFJVRTsKKwkJYlN0dWNrID0gdHJ1ZTsKIAogCXByaXYtPlR4Q291bnRlciA9IFJlZ1R4Q291bnRlcjsKIApAQCAtMjkyMCw3ICsyOTE1LDcgQEAKIHsKIAl1MTYJUmVnUnhDb3VudGVyOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlib29sIGJTdHVjayA9IEZBTFNFOworCWJvb2wgYlN0dWNrID0gZmFsc2U7CiAJc3RhdGljIHU4CXJ4X2Noa19jbnQ7CiAJcmVhZF9uaWNfd29yZChkZXYsIDB4MTMwLCAmUmVnUnhDb3VudGVyKTsKIAlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTogUmVnUnhDb3VudGVyIGlzICVkLFJ4Q291bnRlciBpcyAlZFxuIiwgX19mdW5jX18sIFJlZ1J4Q291bnRlciwgcHJpdi0+UnhDb3VudGVyKTsKQEAgLTI5NTEsNyArMjk0Niw3IEBACiAJfQogCiAJaWYgKHByaXYtPlJ4Q291bnRlciA9PSBSZWdSeENvdW50ZXIpCi0JCWJTdHVjayA9IFRSVUU7CisJCWJTdHVjayA9IHRydWU7CiAKIAlwcml2LT5SeENvdW50ZXIgPSBSZWdSeENvdW50ZXI7CiAKQEAgLTI5NjEsMTAgKzI5NTYsMTAgQEAKIHN0YXRpYyBSRVNFVF9UWVBFIFJ4Q2hlY2tTdHVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlib29sICAgICAgICBiUnhDaGVjayA9IEZBTFNFOworCWJvb2wgICAgICAgIGJSeENoZWNrID0gZmFsc2U7CiAKIAlpZiAocHJpdi0+SXJwUGVuZGluZ0NvdW50ID4gMSkKLQkJYlJ4Q2hlY2sgPSBUUlVFOworCQliUnhDaGVjayA9IHRydWU7CiAKIAlpZiAoYlJ4Q2hlY2spIHsKIAkJaWYgKEhhbFJ4Q2hlY2tTdHVjazgxOXhVc2IoZGV2KSkgewpAQCAtMzAyMSw5ICszMDE2LDkgQEAKIAogfQogCi12b2lkIHJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotaW50IF9ydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IHJ0bDgxOTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKK3N0YXRpYyBpbnQgX3J0bDgxOTJfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJ0bDgxOTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIAogCkBAIC0zNjQyLDcgKzM2MzcsNyBAQAogCQkJCXJldF9yYXRlID0gTUdOX01DUzE1OwogCQkJCWJyZWFrOwogCQkJY2FzZSBERVNDOTBfUkFURU1DUzMyOgotCQkJCXJldF9yYXRlID0gKDB4ODB8MHgyMCk7CisJCQkJcmV0X3JhdGUgPSAweDgwfDB4MjA7CiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6CkBAIC00MDM4LDcgKzQwMzMsNyBAQAogCiAJCWlmICghcHJpdi0+YkNja0hpZ2hQb3dlcikgewogCQkJcmVwb3J0ID0gcGNja19idWYtPmNja19hZ2NfcnB0ICYgMHhjMDsKLQkJCXJlcG9ydCA9IHJlcG9ydD4+NjsKKwkJCXJlcG9ydCA+Pj0gNjsKIAkJCXN3aXRjaCAocmVwb3J0KSB7CiAJCQkJLy9GaXhlZCBieSBKYWNrZW4gZnJvbSBCcnlhbnQgMjAwOC0wMy0yMAogCQkJCS8vT3JpZ2luYWwgdmFsdWUgaXMgLTM4ICwgLTI2ICwgLTE0ICwgLTIKQEAgLTQwNTgsNyArNDA1Myw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDYwOwotCQkJcmVwb3J0ID0gcmVwb3J0Pj41OworCQkJcmVwb3J0ID4+PSA1OwogCQkJc3dpdGNoIChyZXBvcnQpIHsKIAkJCWNhc2UgMHgzOgogCQkJCXJ4X3B3cl9hbGwgPSAtMzUgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKQEAgLTQyMDgsNyArNDIwMyw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CiAJYm9vbCBicGFja2V0X21hdGNoX2Jzc2lkLCBicGFja2V0X3Rvc2VsZjsKLQlib29sIGJQYWNrZXRCZWFjb24gPSBGQUxTRSwgYlRvU2VsZkJBID0gRkFMU0U7CisJYm9vbCBiUGFja2V0QmVhY29uID0gZmFsc2UsIGJUb1NlbGZCQSA9IGZhbHNlOwogCXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICBwcmV2aW91c19zdGF0czsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOy8vYnkgYW15CiAJdTE2IGZjLCB0eXBlOwpAQCAtNDIyNyw5ICs0MjIyLDkgQEAKIAlwcmFkZHIgPSBoZHItPmFkZHIxOwogCiAJLyogQ2hlY2sgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpcyBhY2NlcHRhYmxlLiAqLwotCWJwYWNrZXRfbWF0Y2hfYnNzaWQgPSAoKElFRUU4MDIxMV9GVFlQRV9DVEwgIT0gdHlwZSkgJiYKKwlicGFja2V0X21hdGNoX2Jzc2lkID0gKElFRUU4MDIxMV9GVFlQRV9DVEwgIT0gdHlwZSkgJiYKIAkJCSAgICAgICAoZXFNYWNBZGRyKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCAgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykgPyBoZHItPmFkZHIxIDogKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSA/IGhkci0+YWRkcjIgOiBoZHItPmFkZHIzKSkKLQkJCSAgICAgICAmJiAoIXBzdGF0cy0+Ykh3RXJyb3IpICYmICghcHN0YXRzLT5iQ1JDKSAmJiAoIXBzdGF0cy0+YklDVikpOworCQkJICAgICAgICYmICghcHN0YXRzLT5iSHdFcnJvcikgJiYgKCFwc3RhdHMtPmJDUkMpICYmICghcHN0YXRzLT5iSUNWKTsKIAlicGFja2V0X3Rvc2VsZiA9ICBicGFja2V0X21hdGNoX2Jzc2lkICYgKGVxTWFjQWRkcihwcmFkZHIsIHByaXYtPmllZWU4MDIxMS0+ZGV2LT5kZXZfYWRkcikpOwogCiAJaWYgKFdMQU5fRkNfR0VUX0ZSQU1FVFlQRShmYykgPT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikKQEAgLTQ0NzQsMTMgKzQ0NjksMTAgQEAKIAkJc2tiX3B1bGwoc2tiLCBzdGF0cy0+UnhCdWZTaGlmdCArIHN0YXRzLT5SeERydkluZm9TaXplKTsKIAl9CiAKLQkvKiBmb3IgZGVidWcgMjAwOC41LjI5ICovCi0KLQkvL2FkZGVkIGJ5IHZpdmksIGZvciBNUCwgMjAwODAxMDgKLQlzdGF0cy0+UnhJczQwTUh6UGFja2V0ID0gZHJpdmVyX2luZm8tPkJXOwotCWlmIChzdGF0cy0+UnhEcnZJbmZvU2l6ZSAhPSAwKQorCWlmIChkcml2ZXJfaW5mbykgeworCQlzdGF0cy0+UnhJczQwTUh6UGFja2V0ID0gZHJpdmVyX2luZm8tPkJXOwogCQlUcmFuc2xhdGVSeFNpZ25hbFN0dWZmODE5eFVzYihza2IsIHN0YXRzLCBkcml2ZXJfaW5mbyk7Ci0KKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxOTJfcnhfbm9tYWwoc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYwppbmRleCBlZTZiOTM2Li4xMmRkMTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCkBAIC0zNiwxMSArMzYsMTIgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRGVidWcgdmFyaWFibGUgPyAqLwotZGlnX3QJZG1fZGlndGFibGU7CitzdHJ1Y3QgZGlnIGRtX2RpZ3RhYmxlOwogLyogU3RvcmUgY3VycmVudCBzb2Z0d2FyZSB3cml0ZSByZWdpc3RlciBjb250ZW50IGZvciBNQUMgUEhZLiAqLwogdTgJCWRtX3NoYWRvd1sxNl1bMjU2XSA9IHsgezB9IH07CiAvKiBGb3IgRHluYW1pYyBSeCBQYXRoIFNlbGVjdGlvbiBieSBTaWduYWwgU3RyZW5ndGggKi8KLURSeFBhdGhTZWwJRE1fUnhQYXRoU2VsVGFibGU7CitzdHJ1Y3QgZHluYW1pY19yeF9wYXRoX3NlbCBETV9SeFBhdGhTZWxUYWJsZTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKQEAgLTUwMiw3ICs1MDMsNyBAQAogc3RhdGljIHZvaWQgZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVFNTSShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlib29sCQkJCQkJYkhpZ2hwb3dlcnN0YXRlLCB2aXZpZmxhZyA9IEZBTFNFOworCWJvb2wJCQkJCQliSGlnaHBvd2Vyc3RhdGUsIHZpdmlmbGFnID0gZmFsc2U7CiAJRENNRF9UWENNRF9UCQkJdHhfY21kOwogCXU4CQkJCQkJcG93ZXJsZXZlbE9GRE0yNEc7CiAJaW50CQkJCQkJaSA9IDAsIGogPSAwLCBrID0gMDsKQEAgLTU1OCwxMyArNTU5LDEzIEBACiAJCQkvKiBjaGVjayBpZiB0aGUgcmVwb3J0IHZhbHVlIGlzIHJpZ2h0ICovCiAJCQlmb3IgKGsgPSAwOyBrIDwgNTsgaysrKSB7CiAJCQkJaWYgKHRtcF9yZXBvcnRba10gPD0gMjApIHsKLQkJCQkJdml2aWZsYWcgPSBUUlVFOworCQkJCQl2aXZpZmxhZyA9IHRydWU7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJCWlmICh2aXZpZmxhZyA9PSBUUlVFKSB7CisJCQlpZiAodml2aWZsYWcgPT0gdHJ1ZSkgewogCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOwotCQkJCXZpdmlmbGFnID0gRkFMU0U7CisJCQkJdml2aWZsYWcgPSBmYWxzZTsKIAkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAid2UgZmlsdGVyZWQgdGhlIGRhdGFcbiIpOwogCQkJCWZvciAoayA9IDA7IGsgPCA1OyBrKyspCiAJCQkJCXRtcF9yZXBvcnRba10gPSAwOwpAQCAtNTg3LDcgKzU4OCw3IEBACiAJCQkJZGVsdGEgPSBUU1NJXzEzZEJtIC0gQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcjsKIAogCQkJaWYgKGRlbHRhIDw9IEVfRk9SX1RYX1BPV0VSX1RSQUNLKSB7Ci0JCQkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7CisJCQkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IHRydWU7CiAJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CiAJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInR4IHBvd2VyIHRyYWNrIGlzIGRvbmVcbiIpOwogCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKQEAgLTYyNCwxMCArNjI1LDEwIEBACiAKIAkJCWlmIChwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPiAtMSAmJiBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPCAyMykgewogCQkJCWlmIChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpIHsKLQkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gVFJVRTsKKwkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gdHJ1ZTsKIAkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKIAkJCQl9IGVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgIT0gMTQgJiYgcHJpdi0+YmNja19pbl9jaDE0KSB7Ci0JCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IEZBTFNFOworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBmYWxzZTsKIAkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKIAkJCQl9IGVsc2UKIAkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKQEAgLTYzOCw3ICs2MzksNyBAQAogCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9ICVkXG4iLCBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24pOwogCiAJCQlpZiAocHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPD0gLTEyIHx8IHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlID49IDI0KSB7Ci0JCQkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7CisJCQkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IHRydWU7CiAJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CiAJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInR4IHBvd2VyIHRyYWNrLS0tPmxpbWl0ZWRcbiIpOwogCQkJCXJldHVybjsKQEAgLTY1MSw3ICs2NTIsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7CisJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IHRydWU7CiAJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CiB9CiAKQEAgLTY4NCw3ICs2ODUsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IFRSVUU7CisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IHRydWU7CiAJCS8qcEhhbERhdGEtPlRYUG93ZXJjb3VudCA9IDA7Ki8KIAkJcmV0dXJuOwogCX0KQEAgLTcxNyw3ICs3MTgsNyBAQAogCQlpZiAodG1wQ0NLNDBNaW5kZXggPj0gQ0NLX1RhYmxlX2xlbmd0aCkKIAkJCXRtcENDSzQwTWluZGV4ID0gQ0NLX1RhYmxlX2xlbmd0aC0xOwogCX0gZWxzZSB7Ci0JCXRtcHZhbCA9ICgodTgpdG1wUmVnQSAtIHByaXYtPlRoZXJtYWxNZXRlclswXSk7CisJCXRtcHZhbCA9ICh1OCl0bXBSZWdBIC0gcHJpdi0+VGhlcm1hbE1ldGVyWzBdOwogCiAJCWlmICh0bXB2YWwgPj0gNikgLyogaGlnaGVyIHRlbXBlcmF0dXJlICovCiAJCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDA7IC8qIG1heCB0byArNmRCICovCkBAIC03MzQsMTAgKzczNSwxMCBAQAogCQl0bXBDQ0tpbmRleCA9IHRtcENDSzIwTWluZGV4OwogCiAJaWYgKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkgewotCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOworCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOwogCQlDQ0tTd2luZ05lZWRVcGRhdGUgPSAxOwogCX0gZWxzZSBpZiAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpIHsKLQkJcHJpdi0+YmNja19pbl9jaDE0ID0gRkFMU0U7CisJCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOwogCQlDQ0tTd2luZ05lZWRVcGRhdGUgPSAxOwogCX0KIApAQCAtNzY1LDcgKzc2Niw3IEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCByODE5Ml9wcml2LCB0eHBvd2VyX3RyYWNraW5nX3dxKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7CiAKLQlpZiAocHJpdi0+YkRjdXQgPT0gVFJVRSkKKwlpZiAocHJpdi0+YkRjdXQgPT0gdHJ1ZSkKIAkJZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVFNTSShkZXYpOwogCWVsc2UKIAkJZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVGhlcm1hbE1ldGVyKGRldik7CkBAIC0xMjczLDkgKzEyNzQsOSBAQAogCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOwogCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOwogCi0JcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSBUUlVFOworCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gdHJ1ZTsKIAlwcml2LT50eHBvd2VyX2NvdW50ICAgICAgID0gMDsKLQlwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQgPSBGQUxTRTsKKwlwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQgPSBmYWxzZTsKIAogfQogCkBAIC0xMjg5LDE4ICsxMjkwLDE4IEBACiAJICogMy13aXJlIGJ5IGRyaXZlciBjYXVzZXMgUkYgdG8gZ28gaW50byBhIHdyb25nIHN0YXRlLgogCSAqLwogCWlmIChwcml2LT5pZWVlODAyMTEtPkZ3UldSRikKLQkJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSBUUlVFOworCQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IHRydWU7CiAJZWxzZQotCQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IEZBTFNFOworCQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IGZhbHNlOwogCXByaXYtPnR4cG93ZXJfY291bnQgICAgICAgPSAwOwotCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IEZBTFNFOworCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IGZhbHNlOwogfQogCiB2b2lkIGRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iRGN1dCA9PSBUUlVFKQorCWlmIChwcml2LT5iRGN1dCA9PSB0cnVlKQogCQlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RTU0koZGV2KTsKIAllbHNlCiAJCWRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKGRldik7CkBAIC0xMzU2LDcgKzEzNTcsNyBAQAogI2lmZGVmIFJUTDgxOTBQCiAJZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVFNTSShkZXYpOwogI2Vsc2UKLQlpZiAocHJpdi0+YkRjdXQgPT0gVFJVRSkKKwlpZiAocHJpdi0+YkRjdXQgPT0gdHJ1ZSkKIAkJZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVFNTSShkZXYpOwogCWVsc2UKIAkJZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKGRldik7CkBAIC0xNDY2LDcgKzE0NjcsNyBAQAogewkvKiAgZG1fQ0NLVHhQb3dlckFkanVzdCAqLwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iRGN1dCA9PSBUUlVFKQorCWlmIChwcml2LT5iRGN1dCA9PSB0cnVlKQogCQlkbV9DQ0tUeFBvd2VyQWRqdXN0X1RTU0koZGV2LCBiaW5jaDE0KTsKIAllbHNlCiAJCWRtX0NDS1R4UG93ZXJBZGp1c3RfVGhlcm1hbE1ldGVyKGRldiwgYmluY2gxNCk7CkBAIC0xNjI4LDggKzE2MjksOCBAQAogCQlkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2ggPSBkbV92YWx1ZTsKIAl9IGVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSCkgewogCQlkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfaGlnaHRocmVzaCA9IGRtX3ZhbHVlOwotCX0gZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSFBXUl9ISUdIKSB7Ci0JCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gZG1fdmFsdWU7CisJfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1RIUkVTSF9ISUdIUFdSX0xPVykgeworCQlkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoID0gZG1fdmFsdWU7CiAJfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX0VOQUJMRSkgewogCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7CiAJCWRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZwk9IHRydWU7CkBAIC0yMjcwLDEwICsyMjcxLDEwIEBACiAJCQkJLyogIEZvciBFYWNoIHRpbWUgdXBkYXRpbmcgRURDQSBwYXJhbWV0ZXIsIHJlc2V0IEVEQ0EgdHVyYm8gbW9kZSBzdGF0dXMuICovCiAJCQkJZG1faW5pdF9lZGNhX3R1cmJvKGRldik7CiAJCQkJdTFiQUlGUyA9IHFvc19wYXJhbWV0ZXJzLT5haWZzWzBdICogKChtb2RlJihJRUVFX0d8SUVFRV9OXzI0RykpID8gOSA6IDIwKSArIGFTaWZzVGltZTsKLQkJCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocW9zX3BhcmFtZXRlcnMtPnR4X29wX2xpbWl0WzBdKSkgPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpfAorCQkJCXU0YkFjUGFyYW0gPSAoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT50eF9vcF9saW1pdFswXSkpIDw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKIAkJCQkJKCgodTMyKShxb3NfcGFyYW1ldGVycy0+Y3dfbWF4WzBdKSkgPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAogCQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19taW5bMF0pKSA8PCBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCl8Ci0JCQkJCSgodTMyKXUxYkFJRlMgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKwkJCQkJKCh1MzIpdTFiQUlGUyA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCk7CiAJCQkJLyp3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIHU0YkFjUGFyYW0pOyovCiAJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgRURDQVBBUkFfQkUsICB1NGJBY1BhcmFtKTsKIApAQCAtMjMxNCw3ICsyMzE1LDcgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CiAKLQlwcml2LT5pZWVlODAyMTEtPmJDVFNUb1NlbGZFbmFibGUgPSBUUlVFOworCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IHRydWU7CiAJcHJpdi0+aWVlZTgwMjExLT5DVFNUb1NlbGZUSCA9IENUU1RvU2VsZlRIVmFsOwogfQogCkBAIC0yMzI3LDcgKzIzMjgsNyBAQAogCXVuc2lnbmVkIGxvbmcJCQkJCQljdXJUeE9rQ250ID0gMDsKIAl1bnNpZ25lZCBsb25nCQkJCQkJY3VyUnhPa0NudCA9IDA7CiAKLQlpZiAocHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlICE9IFRSVUUpIHsKKwlpZiAocHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlICE9IHRydWUpIHsKIAkJcEhUSW5mby0+SU9UQWN0aW9uICY9IH5IVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRjsKIAkJcmV0dXJuOwogCX0KQEAgLTI0MTksOSArMjQyMCw5IEBACiAJLyogQ2hlY2sgQml0IDAtMywgaXQgbWVhbnMgaWYgUkYgQS1EIGlzIGVuYWJsZWQuICovCiAJZm9yIChpID0gMDsgaSA8IFJGOTBfUEFUSF9NQVg7IGkrKykgewogCQlpZiAocmZwYXRoICYgKDB4MDE8PGkpKQotCQkJcHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSA9IDE7CisJCQlwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldID0gdHJ1ZTsKIAkJZWxzZQotCQkJcHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSA9IDA7CisJCQlwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldID0gZmFsc2U7CiAJfQogCWlmICghRE1fUnhQYXRoU2VsVGFibGUuRW5hYmxlKQogCQlyZXR1cm47CkBAIC0yNjgxLDEwICsyNjgyLDggQEAKIAlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZCA9IDIwMDsKIAlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKIAlwcml2LT5mcmFtZXN5bmNNb25pdG9yID0gMTsJLyogY3VycmVudCBkZWZhdWx0IDB4YzM4IG1vbml0b3Igb24gKi8KLQotCWluaXRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKLQlwcml2LT5mc3luY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OwotCXByaXYtPmZzeW5jX3RpbWVyLmZ1bmN0aW9uID0gZG1fZnN5bmNfdGltZXJfY2FsbGJhY2s7CisJc2V0dXBfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyLCBkbV9mc3luY190aW1lcl9jYWxsYmFjaywKKwkJICAgICh1bnNpZ25lZCBsb25nKWRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGRtX2RlSW5pdF9mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oCmluZGV4IDMwMDhmOTEuLjZjZDMyZWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5oCkBAIC02Nyw3ICs2Nyw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogMjAwNy8xMC8wNCBNSCBEZWZpbmUgdXBwZXIgYW5kIGxvd2VyIHRocmVzaG9sZCBvZiBESUcgZW5hYmxlIG9yIGRpc2FibGUuICovCi10eXBlZGVmIHN0cnVjdCBfZHluYW1pY19pbml0aWFsX2dhaW5fdGhyZXNob2xkXyB7CitzdHJ1Y3QgZGlnIHsKIAl1OAkJZGlnX2VuYWJsZV9mbGFnOwogCXU4CQlkaWdfYWxnb3JpdGhtOwogCXU4CQlkYmdfbW9kZTsKQEAgLTk4LDcgKzk4LDcgQEAKIAlib29sCQlpbml0aWFsZ2Fpbl9sb3dlcmJvdW5kX3N0YXRlOwogCiAJbG9uZwkJcnNzaV92YWw7Ci19IGRpZ190OworfTsKIAogdHlwZWRlZiBlbnVtIHRhZ19keW5hbWljX2luaXRfZ2Fpbl9zdGF0ZV9kZWZpbml0aW9uIHsKIAlETV9TVEFfRElHX09GRiA9IDAsCkBAIC0xNjMsNyArMTYzLDcgQEAKIAlESUdfQ1NfUkFUSU9fSElHSEVSID0gMSwKIAlESUdfQ1NfTUFYCiB9IGRtX2RpZ19jc19yYXRpb19lOwotdHlwZWRlZiBzdHJ1Y3QgX0R5bmFtaWNfUnhfUGF0aF9TZWxlY3Rpb25fIHsKK3N0cnVjdCBkeW5hbWljX3J4X3BhdGhfc2VsIHsKIAl1OAkJRW5hYmxlOwogCXU4CQlEYmdNb2RlOwogCXU4CQljY2tfbWV0aG9kOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJdTgJCXJmX3Jzc2lbNF07CiAJdTgJCXJmX2VuYWJsZV9yc3NpX3RoWzRdOwogCWxvbmcJCWNja19wd2RiX3N0YVs0XTsKLX0gRFJ4UGF0aFNlbDsKK307CiAKIHR5cGVkZWYgZW51bSB0YWdfQ0NLX1J4X1BhdGhfTWV0aG9kX0RlZmluaXRpb24gewogCUNDS19SeF9WZXJzaW9uXzEgPSAwLApAQCAtMjAwLDkgKzIwMCw5IEBACiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1leHRlcm4gZGlnX3QgZG1fZGlndGFibGU7CitleHRlcm4gc3RydWN0IGRpZyBkbV9kaWd0YWJsZTsKIGV4dGVybiB1OCBkbV9zaGFkb3dbMTZdWzI1Nl07Ci1leHRlcm4gRFJ4UGF0aFNlbCBETV9SeFBhdGhTZWxUYWJsZTsKK2V4dGVybiBzdHJ1Y3QgZHluYW1pY19yeF9wYXRoX3NlbCBETV9SeFBhdGhTZWxUYWJsZTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYwppbmRleCAzNjFkMmQwLi44MzU5NzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CiAKLQlwcmludGsoIiVzKCk6IGZvcmNlIHJlc2V0ICEgZXh0cmEgaXMgJWRcbiIsIF9fZnVuY19fLCAqZXh0cmEpOworCW5ldGRldl9kYmcoZGV2LCAiJXMoKTogZm9yY2UgcmVzZXQgISBleHRyYSBpcyAlZFxuIiwgX19mdW5jX18sICpleHRyYSk7CiAJcHJpdi0+Zm9yY2VfcmVzZXQgPSAqZXh0cmE7CiAJdXAoJnByaXYtPnd4X3NlbSk7CiAJcmV0dXJuIDA7CkBAIC0zMzUsNyArMzM1LDcgQEAKIAlpZiAoIXByaXYtPnVwKQogCQlyZXR1cm4gLUVORVRET1dOOwogCi0JaWYgKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID09IHRydWUpCisJaWYgKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljKQogCQlyZXR1cm4gLUVBR0FJTjsKIAlpZiAod3JxdS0+ZGF0YS5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkgewogCQlzdHJ1Y3QgaXdfc2Nhbl9yZXEgKnJlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEgKiliOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5oCmluZGV4IGFlN2E2MTcuLmQ2YTJkOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmgKQEAgLTEsMjAgKzEsMjEgQEAKIC8qCi0JVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMwotCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KLQlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorICogVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMworICogQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorICogUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYworICogU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKyAqCisgKiBXZSB3YW50IHRvIHRoYW5rIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0CisgKiBBdXRob3JzLgorICovCiAKLQlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgotCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCi0JUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCi0KLQlXZSB3YW50IHRvIHRoYW5rIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCi0qLwotCi0vKiB0aGlzIGZpbGUgKHdpbGwpIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycyovCisvKiB0aGlzIGZpbGUgKHdpbGwpIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycyAqLwogCiAjaWZuZGVmIFI4MTgwX1dYX0gKICNkZWZpbmUgUjgxODBfV1hfSAotLy8jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KIAogZXh0ZXJuIHN0cnVjdCBpd19oYW5kbGVyX2RlZiByODE5Ml93eF9oYW5kbGVyc19kZWY7CiAvKiBFbmFibGUgIHRoZSBydGw4MTl4X2NvcmUuYyB0byBzaGFyZSB0aGlzIGZ1bmN0aW9uLCBkYXZpZCAyMDA4LjkuMjIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYwppbmRleCBjMjMwYmUyLi5kMjdiMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jCkBAIC0zNyw3ICszNyw2IEBACiAJYm9vbAkJICAgIHJ0X3N0YXR1cyA9IHRydWU7CiAJdTE2CQkgICAgZnJhZ190aHJlc2hvbGQ7CiAJdTE2CQkgICAgZnJhZ19sZW5ndGgsIGZyYWdfb2Zmc2V0ID0gMDsKLQkvL3UxNgkJICAgIHRvdGFsX3NpemU7CiAJaW50CQkgICAgaTsKIAogCXJ0X2Zpcm13YXJlCSAgICAqcGZpcm13YXJlID0gcHJpdi0+cEZpcm13YXJlOwpAQCAtNDgsNyArNDcsNyBAQAogCXU4CQkgICAgaW5kZXg7CiAKIAlmaXJtd2FyZV9pbml0X3BhcmFtKGRldik7Ci0JLy9GcmFnbWVudGF0aW9uIG1pZ2h0IGJlIHJlcXVpcmVkCisJLyogRnJhZ21lbnRhdGlvbiBtaWdodCBiZSByZXF1aXJlZCAqLwogCWZyYWdfdGhyZXNob2xkID0gcGZpcm13YXJlLT5jbWRwYWNrZXRfZnJhZ190aHJlc29sZDsKIAlkbyB7CiAJCWlmICgoYnVmZmVyX2xlbiAtIGZyYWdfb2Zmc2V0KSA+IGZyYWdfdGhyZXNob2xkKSB7CkBAIC0xMDcsMTkgKzEwNiwyMCBAQAogCiB9CiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByb2NlZHVyZTogICAgQ2hlY2sgd2hldGhlciBtYWluIGNvZGUgaXMgZG93bmxvYWQgT0suIElmIE9LLCB0dXJuIG9uIENQVQotLy8KLS8vIERlc2NyaXB0aW9uOiAgIENQVSByZWdpc3RlciBsb2NhdGVzIGluIGRpZmZlcmVudCBwYWdlIGFnYWluc3QgZ2VuZXJhbCByZWdpc3Rlci4KLS8vCQkJICAgIFN3aXRjaCB0byBDUFUgcmVnaXN0ZXIgaW4gdGhlIGJlZ2luIGFuZCBzd2l0Y2ggYmFjayBiZWZvcmUgcmV0dXJuCi0vLwotLy8KLS8vIEFyZ3VtZW50czogICBUaGUgcG9pbnRlciBvZiB0aGUgYWRhcHRlcgotLy8KLS8vIFJldHVybnM6Ci0vLyAgICAgICAgTkRJU19TVEFUVVNfRkFJTFVSRSAtIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaG91bGQgYmUgdGVybWluYXRlZAotLy8gICAgICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MgLSBpZiBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHN1Y2Nlc3MKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBQcm9jZWR1cmU6CUNoZWNrIHdoZXRoZXIgbWFpbiBjb2RlIGlzIGRvd25sb2FkIE9LLiBJZiBPSywgdHVybiBvbiBDUFUKKyAqCisgKiBEZXNjcmlwdGlvbjoJQ1BVIHJlZ2lzdGVyIGxvY2F0ZXMgaW4gZGlmZmVyZW50IHBhZ2UgYWdhaW5zdCBnZW5lcmFsIHJlZ2lzdGVyLgorICoJICAgIFN3aXRjaCB0byBDUFUgcmVnaXN0ZXIgaW4gdGhlIGJlZ2luIGFuZCBzd2l0Y2ggYmFjayBiZWZvcmUgcmV0dXJuCisgKgorICoKKyAqIEFyZ3VtZW50czogICBUaGUgcG9pbnRlciBvZiB0aGUgYWRhcHRlcgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgTkRJU19TVEFUVVNfRkFJTFVSRSAtIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzaG91bGQKKyAqCQkJCWJlIHRlcm1pbmF0ZWQKKyAqICAgICAgICBORElTX1NUQVRVU19TVUNDRVNTIC0gaWYgZmlybXdhcmUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzdWNjZXNzCisgKi8KIHN0YXRpYyBib29sIENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJYm9vbAkJcnRfc3RhdHVzID0gdHJ1ZTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiBDUFVDaGVja01haW5Db2RlT0tBbmRUdXJuT25DUFVfRmFpbDoKIAlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiBpbiAlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JcnRfc3RhdHVzID0gRkFMU0U7CisJcnRfc3RhdHVzID0gZmFsc2U7CiAJcmV0dXJuIHJ0X3N0YXR1czsKIH0KIApAQCAtMjAxLDcgKzIwMSw3IEBACiBib29sIGluaXRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdgkqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JYm9vbAkJCXJ0X3N0YXR1cyA9IFRSVUU7CisJYm9vbAkJCXJ0X3N0YXR1cyA9IHRydWU7CiAKIAl1MzIJCQlmaWxlX2xlbmd0aCA9IDA7CiAJdTgJCQkqbWFwcGVkX2ZpbGUgPSBOVUxMOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCS8qIGl0IGlzIGNhbGxlZCBieSByZXNldCAqLwogCQlyc3Rfb3B0ID0gT1BUX1NZU1RFTV9SRVNFVDsKIAkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAwX0JPT1Q7Ci0JCS8vIFRPRE86IHN5c3RlbSByZXNldAorCQkvKiBUT0RPOiBzeXN0ZW0gcmVzZXQgKi8KIAogCX0gZWxzZSBpZiAocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpIHsKIAkJLyogaXQgaXMgY2FsbGVkIGJ5IEluaXRpYWxpemUgKi8KQEAgLTI4MSw3ICsyODEsNyBAQAogCQlpZiAocnN0X29wdCA9PSBPUFRfU1lTVEVNX1JFU0VUKQogCQkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAKLQkJaWYgKHJ0X3N0YXR1cyAhPSBUUlVFKQorCQlpZiAoIXJ0X3N0YXR1cykKIAkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKIAogCQlzd2l0Y2ggKGluaXRfc3RlcCkgewpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCQkgKiB3aWxsIHNldCBwb2xsaW5nIGJpdCB3aGVuIGZpcm13YXJlIGNvZGUgaXMgYWxzbyBjb25maWd1cmVkCiAJCQkgKi8KIAkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzFfTU9WRV9CT09UX0NPREU7Ci0JCQkvL21kZWxheSgxMDAwKTsKKwkJCS8qIG1kZWxheSgxMDAwKTsgKi8KIAkJCS8qCiAJCQkgKiBUbyBpbml0aWFsaXplIElNRU0sIENQVSBtb3ZlIGNvZGUgIGZyb20gMHg4MDAwMDA4MCwKIAkJCSAqIGhlbmNlLCB3ZSBzZW5kIDB4ODAgYnl0ZSBwYWNrZXQKQEAgLTMwNCw3ICszMDQsNyBAQAogCiAJCQkvKiBDaGVjayBQdXQgQ29kZSBPSyBhbmQgVHVybiBPbiBDUFUgKi8KIAkJCXJ0X3N0YXR1cyA9IENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKGRldik7Ci0JCQlpZiAocnRfc3RhdHVzICE9IFRSVUUpIHsKKwkJCWlmICghcnRfc3RhdHVzKSB7CiAJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVSBmYWlsIVxuIik7CiAJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOwogCQkJfQpAQCAtMzE4LDcgKzMxOCw3IEBACiAJCQltZGVsYXkoMSk7CiAKIAkJCXJ0X3N0YXR1cyA9IENQVWNoZWNrX2Zpcm13YXJlX3JlYWR5KGRldik7Ci0JCQlpZiAocnRfc3RhdHVzICE9IFRSVUUpIHsKKwkJCWlmICghcnRfc3RhdHVzKSB7CiAJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJDUFVjaGVja19maXJtd2FyZV9yZWFkeSBmYWlsKCVkKSFcbiIscnRfc3RhdHVzKTsKIAkJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CiAJCQl9CkBAIC0zMzAsMTMgKzMzMCwxMSBAQAogCX0KIAogCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJGaXJtd2FyZSBEb3dubG9hZCBTdWNjZXNzXG4iKTsKLQkvL2Fzc2VydChwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfNV9SRUFEWSwgKCJGaXJtd2FyZSBEb3dubG9hZCBGYWlsXG4iKSk7Ci0KIAlyZXR1cm4gcnRfc3RhdHVzOwogCiBkb3dubG9hZF9maXJtd2FyZV9mYWlsOgogCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSIGluICVzKClcbiIsIF9fZnVuY19fKTsKLQlydF9zdGF0dXMgPSBGQUxTRTsKKwlydF9zdGF0dXMgPSBmYWxzZTsKIAlyZXR1cm4gcnRfc3RhdHVzOwogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYwppbmRleCAwNTg5NjAyLi5lNWRiYWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKQEAgLTEwNiwxMCArMTA2LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZHMgc3BlY2lmaWMgYml0cyBmcm9tIEJCIHJlZ2lzdGVyCiAgKiBpbnB1dDogICAgIG5ldF9kZXZpY2UJKmRldgotICogICAgICAgICAgICB1MzIJIAlyZWdfYWRkciAgIC8vdGFyZ2V0IGFkZHIgdG8gYmUgcmVhZGJhY2sKLSAqICAgICAgICAgICAgdTMyCSAJYml0bWFzayAgICAvL3RhZ2V0IGJpdCBwb3MgdG8gYmUgcmVhZGJhY2sKKyAqICAgICAgICAgICAgdTMyCQlyZWdfYWRkciAgIC8vdGFyZ2V0IGFkZHIgdG8gYmUgcmVhZGJhY2sKKyAqICAgICAgICAgICAgdTMyCQliaXRtYXNrICAgIC8vdGFnZXQgYml0IHBvcyB0byBiZSByZWFkYmFjawogICogb3V0cHV0OiAgICBub25lCi0gKiByZXR1cm46ICAgIHUzMgkgCWRhdGEgICAgICAgLy90aGUgcmVhZGJhY2sgcmVnaXN0ZXIgdmFsdWUKKyAqIHJldHVybjogICAgdTMyCQlkYXRhICAgICAgIC8vdGhlIHJlYWRiYWNrIHJlZ2lzdGVyIHZhbHVlCiAgKiBub3RpY2U6CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcmVnX2FkZHIsIHUzMiBiaXRtYXNrKQpAQCAtMzUyLDE2ICszNTIsMTQgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKHByaXYtPlJmX01vZGUgPT0gUkZfT1BfQnlfRlcpIHsKIAkJcmVnID0gcGh5X0Z3UkZTZXJpYWxSZWFkKGRldiwgZVJGUGF0aCwgcmVnX2FkZHIpOwotCQliaXRzaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGJpdG1hc2spOwotCQlyZWcgPSAocmVnICYgYml0bWFzaykgPj4gYml0c2hpZnQ7CiAJCXVkZWxheSgyMDApOwotCQlyZXR1cm4gcmVnOwogCX0gZWxzZSB7CiAJCXJlZyA9IHJ0bDgxOTJfcGh5X1JGU2VyaWFsUmVhZChkZXYsIGVSRlBhdGgsIHJlZ19hZGRyKTsKLQkJYml0c2hpZnQgPSAgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdChiaXRtYXNrKTsKLQkJcmVnID0gKHJlZyAmIGJpdG1hc2spID4+IGJpdHNoaWZ0OwotCQlyZXR1cm4gcmVnOwogCX0KKwliaXRzaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGJpdG1hc2spOworCXJlZyA9IChyZWcgJiBiaXRtYXNrKSA+PiBiaXRzaGlmdDsKKwlyZXR1cm4gcmVnOworCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ3OCw3ICs0NzYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWRzIEJCIHBhcmFtZXRlcnMgZnJvbSBoZWFkZXIgZmlsZSB3ZSBnZW5lcmF0ZSwKICAqICAgICAgICAgICAgYW5kIGRvIHJlZ2lzdGVyIHJlYWQvd3JpdGUKLSAqIGlucHV0OiAgICAgbmV0X2RldmljZSAJKmRldgorICogaW5wdXQ6ICAgICBuZXRfZGV2aWNlCSpkZXYKICAqIG91dHB1dDogICAgbm9uZQogICogcmV0dXJuOiAgICBub25lCiAgKiBub3RpY2U6ICAgIEJCIHBhcmFtZXRlcnMgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCkBAIC04MjUsOCArODIzLDggQEAKIAl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZSwgMHgwMCk7CiAJaWYgKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09ICh1OClWRVJTSU9OXzgxOXhVX0EpIHsKIAkJLyogQW50ZW5uYSBnYWluIG9mZnNldCBmcm9tIEIvQy9EIHRvIEEgKi8KLQkJcmVnX3UzMiA9IChwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV08PDQgfAotCQkJICAgcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdKTsKKwkJcmVnX3UzMiA9IHByaXYtPkFudGVubmFUeFB3RGlmZlsxXTw8NCB8CisJCQkgICBwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF07CiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfVHhHYWluU3RhZ2UsIChiWEJUeEFHQ3xiWENUeEFHQyksCiAJCQkJIHJlZ191MzIpOwogCkBAIC05MDAsNyArODk4LDcgQEAKIAlyZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCAmcHJpdi0+ZnJhbWVzeW5jKTsKIAlyZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAmdG1wKTsKIAlwcml2LT5mcmFtZXN5bmNDMzQgPSB0bXA7Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCAiRGVmYXVsdCBmcmFtZXN5bmMgKDB4JXgpID0gMHgleCBcbiIsCisJUlRfVFJBQ0UoQ09NUF9JTklULCAiRGVmYXVsdCBmcmFtZXN5bmMgKDB4JXgpID0gMHgleFxuIiwKIAkJck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOwogCiAJLyogUmVhZCBTSUZTIChzYXZlIHRoZSB2YWx1ZSByZWFkIGZvbWUgTUFDUEhZX1JFRy50eHQpICovCkBAIC0xMTAxLDcgKzEwOTksNyBAQAogCWlmIChlUkZQb3dlclN0YXRlID09IHByaXYtPmllZWU4MDIxMS0+ZVJGUG93ZXJTdGF0ZSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKHByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcykKIAkJcmV0dXJuIGZhbHNlOwogCiAJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xMTg3LDcgKzExODUsNyBAQAogCQkJCS8qIFR1cm4gb24gUkYgd2UgYXJlIHN0aWxsIGxpbmtlZCwgd2hpY2ggbWlnaHQKIAkJCQkgICBoYXBwZW4gd2hlbiB3ZSBxdWlja2x5IHR1cm4gb2ZmIGFuZCBvbiBIVyBSRi4KIAkJCQkgKi8KLQkJCQlpZiAocE1nbnRJbmZvLT5iTWVkaWFDb25uZWN0ID09IFRSVUUpCisJCQkJaWYgKHBNZ250SW5mby0+Yk1lZGlhQ29ubmVjdCkKIAkJCQkJQWRhcHRlci0+SGFsRnVuYy5MZWRDb250cm9sSGFuZGxlcihBZGFwdGVyLCBMRURfQ1RMX0xJTkspOwogCQkJCWVsc2UKIAkJCQkJLyogVHVybiBvZmYgTEVEIGlmIFJGIGlzIG5vdCBPTi4gKi8KQEAgLTEzNDQsNyArMTM0Miw2IEBACiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmtub3duIFJGQ2hpcElEOiAlZFxuIiwgcHJpdi0+cmZfY2hpcCk7CiAJCXJldHVybiB0cnVlOwotCQlicmVhazsKIAl9CiAKIApAQCAtMTM2NSwxMSArMTM2MiwxMCBAQAogCQkJaWYgKCgqc3RhZ2UpID09IDIpIHsKIAkJCQkoKmRlbGF5KSA9IEN1cnJlbnRDbWQtPm1zRGVsYXk7CiAJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCSgqc3RhZ2UpKys7Ci0JCQkJKCpzdGVwKSA9IDA7Ci0JCQkJY29udGludWU7CiAJCQl9CisJCQkoKnN0YWdlKSsrOworCQkJKCpzdGVwKSA9IDA7CisJCQljb250aW51ZTsKIAkJfQogCiAJCXN3aXRjaCAoQ3VycmVudENtZC0+Q21kSUQpIHsKQEAgLTE1NzksMTAgKzE1NzUsMTAgQEAKIAkJCSBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24pOwogCiAJCWlmIChwcml2LT5jaGFuID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpIHsKLQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IFRSVUU7CisJCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOwogCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKIAkJfSBlbHNlIGlmIChwcml2LT5jaGFuICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkgewotCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gRkFMU0U7CisJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBmYWxzZTsKIAkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CiAJCX0gZWxzZSB7CiAJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOwpAQCAtMTc0NiwxMyArMTc0MiwxMyBAQAogCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YTBhIGlzICV4XG4iLAogCQkJIHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOwogCi0JCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gaW5pdGlhbCBnYWluID0gMHgleCBcbiIsCisJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gaW5pdGlhbCBnYWluID0gMHgleFxuIiwKIAkJCSBpbml0aWFsX2dhaW4pOwogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOwogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOwogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOwogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOwotCQlSVF9UUkFDRShDT01QX1NDQU4sICJXcml0ZSBzY2FuIDB4YTBhID0gMHgleCBcbiIsCisJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gMHhhMGEgPSAweCV4XG4iLAogCQkJIFBPV0VSX0RFVEVDVElPTl9USCk7CiAJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIFBPV0VSX0RFVEVDVElPTl9USCk7CiAJCWJyZWFrOwpAQCAtMTc5Myw3ICsxNzg5LDcgQEAKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlSVF9UUkFDRShDT01QX1NDQU4sICJVbmtub3duIElHIE9wZXJhdGlvbi4gXG4iKTsKKwkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiVW5rbm93biBJRyBPcGVyYXRpb24uXG4iKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaGFsX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2hhbF9pbml0LmMKaW5kZXggMzI0ZGEzNC4uMGExYzYzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaGFsX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9oYWxfaW5pdC5jCkBAIC05Miw3ICs5Miw3IEBACiAKIHN0YXRpYyB2b2lkIGZpbGxfZndwcml2KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBmd19wcml2ICpwZndwcml2KQogewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmogPSAoc3RydWN0IGR2b2JqX3ByaXYgKikmcGFkYXB0ZXItPmR2b2JqcHJpdjsKKwlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqID0gJnBhZGFwdGVyLT5kdm9ianByaXY7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAKIAltZW1zZXQocGZ3cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBmd19wcml2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9tbG1lX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9tbG1lX2xpbnV4LmMKaW5kZXggMzU0YmQwMy4uOGM1YTQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvbWxtZV9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL21sbWVfbGludXguYwpAQCAtMzIsNjAgKzMyLDYxIEBACiAjaW5jbHVkZSAiZHJ2X3R5cGVzLmgiCiAjaW5jbHVkZSAibWxtZV9vc2RlcC5oIgogCi1zdGF0aWMgdm9pZCBzaXRlc3VydmV5X2N0cmxfaGFuZGxlcih2b2lkICpGdW5jdGlvbkNvbnRleHQpCitzdGF0aWMgdm9pZCBzaXRlc3VydmV5X2N0cmxfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopZGF0YTsKIAogCV9yODcxMl9zaXRlc3VydmV5X2N0cmxfaGFuZGxlcihhZGFwdGVyKTsKLQlfc2V0X3RpbWVyKCZhZGFwdGVyLT5tbG1lcHJpdi5zaXRlc3VydmV5Y3RybC5zaXRlc3VydmV5X2N0cmxfdGltZXIsCi0JCSAgIDMwMDApOworCW1vZF90aW1lcigmYWRhcHRlci0+bWxtZXByaXYuc2l0ZXN1cnZleWN0cmwuc2l0ZXN1cnZleV9jdHJsX3RpbWVyLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDMwMDApKTsKIH0KIAotc3RhdGljIHZvaWQgam9pbl90aW1lb3V0X2hhbmRsZXIgKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCkKK3N0YXRpYyB2b2lkIGpvaW5fdGltZW91dF9oYW5kbGVyICh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopZGF0YTsKIAogCV9yODcxMl9qb2luX3RpbWVvdXRfaGFuZGxlcihhZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgX3NjYW5fdGltZW91dF9oYW5kbGVyICh2b2lkICpGdW5jdGlvbkNvbnRleHQpCitzdGF0aWMgdm9pZCBfc2Nhbl90aW1lb3V0X2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilkYXRhOwogCiAJcjg3MTJfc2Nhbl90aW1lb3V0X2hhbmRsZXIoYWRhcHRlcik7CiB9CiAKLXN0YXRpYyB2b2lkIGRoY3BfdGltZW91dF9oYW5kbGVyICh2b2lkICpGdW5jdGlvbkNvbnRleHQpCitzdGF0aWMgdm9pZCBkaGNwX3RpbWVvdXRfaGFuZGxlciAodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKWRhdGE7CiAKIAlfcjg3MTJfZGhjcF90aW1lb3V0X2hhbmRsZXIoYWRhcHRlcik7CiB9CiAKLXN0YXRpYyB2b2lkIHdkZ190aW1lb3V0X2hhbmRsZXIgKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCkKK3N0YXRpYyB2b2lkIHdkZ190aW1lb3V0X2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilkYXRhOwogCiAJX3I4NzEyX3dkZ190aW1lb3V0X2hhbmRsZXIoYWRhcHRlcik7CiAKLQlfc2V0X3RpbWVyKCZhZGFwdGVyLT5tbG1lcHJpdi53ZGdfdGltZXIsIDIwMDApOworCW1vZF90aW1lcigmYWRhcHRlci0+bWxtZXByaXYud2RnX3RpbWVyLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKIH0KIAogdm9pZCByODcxMl9pbml0X21sbWVfdGltZXIoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCi0JX2luaXRfdGltZXIoJihwbWxtZXByaXYtPmFzc29jX3RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsCi0JCSAgICBqb2luX3RpbWVvdXRfaGFuZGxlciwgKHBtbG1lcHJpdi0+bmljX2hkbCkpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT5zaXRlc3VydmV5Y3RybC5zaXRlc3VydmV5X2N0cmxfdGltZXIpLAotCQkgICAgcGFkYXB0ZXItPnBuZXRkZXYsIHNpdGVzdXJ2ZXlfY3RybF9oYW5kbGVyLAotCQkgICAgKHU4ICopKHBtbG1lcHJpdi0+bmljX2hkbCkpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsCi0JCSAgICBfc2Nhbl90aW1lb3V0X2hhbmRsZXIsIChwbWxtZXByaXYtPm5pY19oZGwpKTsKLQlfaW5pdF90aW1lcigmKHBtbG1lcHJpdi0+ZGhjcF90aW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LAotCQkgICAgZGhjcF90aW1lb3V0X2hhbmRsZXIsICh1OCAqKShwbWxtZXByaXYtPm5pY19oZGwpKTsKLQlfaW5pdF90aW1lcigmKHBtbG1lcHJpdi0+d2RnX3RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsCi0JCSAgICB3ZGdfdGltZW91dF9oYW5kbGVyLCAodTggKikocG1sbWVwcml2LT5uaWNfaGRsKSk7CisJc2V0dXBfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIGpvaW5fdGltZW91dF9oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPnNpdGVzdXJ2ZXljdHJsLnNpdGVzdXJ2ZXlfY3RybF90aW1lciwKKwkJICAgIHNpdGVzdXJ2ZXlfY3RybF9oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIF9zY2FuX3RpbWVvdXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5kaGNwX3RpbWVyLCBkaGNwX3RpbWVvdXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcG1sbWVwcml2LT53ZGdfdGltZXIsIHdkZ190aW1lb3V0X2hhbmRsZXIsCisJCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CiB9CiAKIHZvaWQgcjg3MTJfb3NfaW5kaWNhdGVfY29ubmVjdChzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xMTcsOSArMTE4LDkgQEAKIAkJCQkJICAgYnRraXBfY291bnRlcm1lYXN1cmU7CiAJCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSZhZGFwdGVyLT5zZWN1cml0eXByaXYsIDAsCiAJCQkgc2l6ZW9mKHN0cnVjdCBzZWN1cml0eV9wcml2KSk7Ci0JCV9pbml0X3RpbWVyKCYoYWRhcHRlci0+c2VjdXJpdHlwcml2LnRraXBfdGltZXIpLAotCQkJICAgIGFkYXB0ZXItPnBuZXRkZXYsIHI4NzEyX3VzZV90a2lwa2V5X2hhbmRsZXIsCi0JCQkgICAgYWRhcHRlcik7CisJCXNldHVwX3RpbWVyKCZhZGFwdGVyLT5zZWN1cml0eXByaXYudGtpcF90aW1lciwKKwkJCSAgICByODcxMl91c2VfdGtpcGtleV9oYW5kbGVyLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWFkYXB0ZXIpOwogCQkvKiBSZXN0b3JlIHRoZSBQTUsgaW5mb3JtYXRpb24gdG8gc2VjdXJpdHlwcml2IHN0cnVjdHVyZQogCQkgKiBmb3IgdGhlIGZvbGxvd2luZyBjb25uZWN0aW9uLiAqLwogCQltZW1jcHkoJmFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJRExpc3RbMF0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYwppbmRleCAxM2RlYmI1Li42ZTc3NmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBzdGF0aWMgaW50IHI4NzF4X25ldF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihwbmV0ZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAogCWlmIChwYWRhcHRlci0+YnVwID09IGZhbHNlKQpAQCAtMTg3LDcgKzE4Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcjg3MXhfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICYocGFkYXB0ZXItPnJlY3Zwcml2KTsKIApAQCAtMjIxLDcgKzIyMSw3IEBACiAJCXN0cmNweShpZm5hbWUsICJ3bGFuJWQiKTsKIAkJZGV2X2FsbG9jX25hbWUocG5ldGRldiwgaWZuYW1lKTsKIAl9Ci0JcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KHBuZXRkZXYpOworCXBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJcGFkYXB0ZXItPnBuZXRkZXYgPSBwbmV0ZGV2OwogCXByX2luZm8oInI4NzEydTogcmVnaXN0ZXIgcnRsODcxMl9uZXRkZXZfb3BzIHRvIG5ldGRldl9vcHNcbiIpOwogCXBuZXRkZXYtPm5ldGRldl9vcHMgPSAmcnRsODcxMl9uZXRkZXZfb3BzOwpAQCAtMjU1LDIwICsyNTUsMjAgQEAKIAogc3RhdGljIHZvaWQgc3RhcnRfZHJ2X3RpbWVycyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKQogewotCV9zZXRfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi5zaXRlc3VydmV5Y3RybC5zaXRlc3VydmV5X2N0cmxfdGltZXIsCi0JCSAgIDUwMDApOwotCV9zZXRfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi53ZGdfdGltZXIsIDIwMDApOworCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LnNpdGVzdXJ2ZXljdHJsLnNpdGVzdXJ2ZXlfY3RybF90aW1lciwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CisJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYud2RnX3RpbWVyLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKIH0KIAogdm9pZCByODcxMl9zdG9wX2Rydl90aW1lcnMoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcikKIHsKLQlfY2FuY2VsX3RpbWVyX2V4KCZwYWRhcHRlci0+bWxtZXByaXYuYXNzb2NfdGltZXIpOwotCV9jYW5jZWxfdGltZXJfZXgoJnBhZGFwdGVyLT5zZWN1cml0eXByaXYudGtpcF90aW1lcik7Ci0JX2NhbmNlbF90aW1lcl9leCgmcGFkYXB0ZXItPm1sbWVwcml2LnNjYW5fdG9fdGltZXIpOwotCV9jYW5jZWxfdGltZXJfZXgoJnBhZGFwdGVyLT5tbG1lcHJpdi5kaGNwX3RpbWVyKTsKLQlfY2FuY2VsX3RpbWVyX2V4KCZwYWRhcHRlci0+bWxtZXByaXYud2RnX3RpbWVyKTsKLQlfY2FuY2VsX3RpbWVyX2V4KCZwYWRhcHRlci0+bWxtZXByaXYuc2l0ZXN1cnZleWN0cmwuCi0JCQkgc2l0ZXN1cnZleV9jdHJsX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi50a2lwX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LnNjYW5fdG9fdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuZGhjcF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi53ZGdfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuc2l0ZXN1cnZleWN0cmwuc2l0ZXN1cnZleV9jdHJsX3RpbWVyKTsKIH0KIAogc3RhdGljIHU4IGluaXRfZGVmYXVsdF92YWx1ZShzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMzIyLDggKzMyMiw4IEBACiAJX3I4NzEyX2luaXRfcmVjdl9wcml2KCZwYWRhcHRlci0+cmVjdnByaXYsIHBhZGFwdGVyKTsKIAltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdiwgMCwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBzZWN1cml0eV9wcml2KSk7Ci0JX2luaXRfdGltZXIoJihwYWRhcHRlci0+c2VjdXJpdHlwcml2LnRraXBfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwKLQkJICAgIHI4NzEyX3VzZV90a2lwa2V5X2hhbmRsZXIsIHBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi50a2lwX3RpbWVyLAorCQkgICAgcjg3MTJfdXNlX3RraXBrZXlfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwogCV9yODcxMl9pbml0X3N0YV9wcml2KCZwYWRhcHRlci0+c3RhcHJpdik7CiAJcGFkYXB0ZXItPnN0YXByaXYucGFkYXB0ZXIgPSBwYWRhcHRlcjsKIAlyODcxMl9pbml0X2JjbWNfc3RhaW5mbyhwYWRhcHRlcik7CkBAIC0zODQsNyArMzg0LDcgQEAKICAqLwogc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAogCW11dGV4X2xvY2soJnBhZGFwdGVyLT5tdXRleF9zdGFydCk7CiAJaWYgKHBhZGFwdGVyLT5idXAgPT0gZmFsc2UpIHsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogICovCiBzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAKIAkvKiBDbG9zZSBMRUQqLwogCXBhZGFwdGVyLT5sZWRwcml2LkxlZENvbnRyb2xIYW5kbGVyKHBhZGFwdGVyLCBMRURfQ1RMX1BPV0VSX09GRik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKaW5kZXggMzYzNDhkOS4uMGE3ZjU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaApAQCAtNjAsMjYgKzYwLDYgQEAKICNkZWZpbmUgTElTVF9DT05UQUlOT1IocHRyLCB0eXBlLCBtZW1iZXIpIFwKIAkoKHR5cGUgKikoKGNoYXIgKikocHRyKS0oU0laRV9UKSgmKCh0eXBlICopMCktPm1lbWJlcikpKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnB0aW1lciwKLQkJCSAgICAgICBzdHJ1Y3QgIG5ldF9kZXZpY2UgKnBhZGFwdGVyLAotCQkJICAgICAgIHZvaWQgKnBmdW5jLCB2b2lkICpjbnR4KQotewotCXB0aW1lci0+ZnVuY3Rpb24gPSBwZnVuYzsKLQlwdGltZXItPmRhdGEgPSAoYWRkcl90KWNudHg7Ci0JaW5pdF90aW1lcihwdGltZXIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3NldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqcHRpbWVyLCB1MzIgZGVsYXlfdGltZSkKLXsKLQltb2RfdGltZXIocHRpbWVyLCAoamlmZmllcyttc2Vjc190b19qaWZmaWVzKGRlbGF5X3RpbWUpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfY2FuY2VsX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICpwdGltZXIsIHU4ICpiY2FuY2VsbGVkKQotewotCWRlbF90aW1lcihwdGltZXIpOwotCSpiY2FuY2VsbGVkID0gdHJ1ZTsgLyp0cnVlID09MTsgZmFsc2U9PTAqLwotfQotCiAjaWZuZGVmIEJJVAogCSNkZWZpbmUgQklUKHgpCSgxIDw8ICh4KSkKICNlbmRpZgpAQCAtMTA2LDExICs4Niw2IEBACiAJc2NoZWR1bGVfdGltZW91dChkZWx0YSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfY2FuY2VsX3RpbWVyX2V4KHN0cnVjdCB0aW1lcl9saXN0ICpwdGltZXIpCi17Ci0JcmV0dXJuIGRlbF90aW1lcihwdGltZXIpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfc2lnbmFsc190aHJlYWQodm9pZCkKIHsKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X2xpbnV4LmMKaW5kZXggNDA5YzhjOC4uNzk5YTBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYwpAQCAtOTYsNyArOTYsNyBAQAogCWVsc2UKIAkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKIAlldi5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGV2LnNyY19hZGRyLnNhX2RhdGEsICZwbWxtZXByaXYtPmFzc29jX2Jzc2lkWzBdLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KGV2LnNyY19hZGRyLnNhX2RhdGEsICZwbWxtZXByaXYtPmFzc29jX2Jzc2lkWzBdKTsKIAltZW1zZXQoJndycXUsIDB4MDAsIHNpemVvZih3cnF1KSk7CiAJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZihldik7CiAJd2lyZWxlc3Nfc2VuZF9ldmVudChwYWRhcHRlci0+cG5ldGRldiwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLCAmd3JxdSwKQEAgLTEzNywxOCArMTM3LDE3IEBACiAJIHByZWN2cHJpdi0+cnhfZHJvcCsrOwogfQogCi1zdGF0aWMgdm9pZCBfcjg3MTJfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlciAodm9pZCAqRnVuY3Rpb25Db250ZXh0KQorc3RhdGljIHZvaWQgX3I4NzEyX3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwgPQotCQkJIChzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKilGdW5jdGlvbkNvbnRleHQ7CisJCQkgKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqKWRhdGE7CiAKIAlyODcxMl9yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyKHByZW9yZGVyX2N0cmwpOwogfQogCiB2b2lkIHI4NzEyX2luaXRfcmVjdl90aW1lcihzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IHByZW9yZGVyX2N0cmwtPnBhZGFwdGVyOwotCi0JX2luaXRfdGltZXIoJihwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwKLQkJICAgIF9yODcxMl9yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyLCBwcmVvcmRlcl9jdHJsKTsKKwlzZXR1cF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyLAorCQkgICAgIF9yODcxMl9yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyLAorCQkgICAgICh1bnNpZ25lZCBsb25nKXByZW9yZGVyX2N0cmwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMKaW5kZXggNjJlNTNjYy4uMDA3ZjBhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jCkBAIC05NSw3ICs5NSw3IEBACiAJCQl2YWwzMiA9IHI4NzEyX3JlYWQzMihwYWRhcHRlciwgSU9DTURfREFUQV9SRUcpOwogCQllbHNlIC8qIHRpbWUgb3V0ICovCiAJCQl2YWwzMiA9IDA7Ci0JCXZhbDMyID0gdmFsMzIgPj4gNDsKKwkJdmFsMzIgPj49IDQ7CiAJCXBhZGFwdGVyLT5yZWN2cHJpdi5md19yc3NpID0KIAkJCSAodTgpcjg3MTJfc2lnbmFsX3NjYWxlX21hcHBpbmcodmFsMzIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jCmluZGV4IDU2ZThhZGQuLmYxZDQ3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9sZWQuYwpAQCAtOTcsNyArOTcsOCBAQAogCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAlwTGVkLT5CbGlua1RpbWVzID0gMDsKIAlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1VOS05PV047Ci0JX2luaXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgbmljLCBCbGlua1RpbWVyQ2FsbGJhY2ssIHBMZWQpOworCXNldHVwX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBCbGlua1RpbWVyQ2FsbGJhY2ssCisJCSAgICAodW5zaWduZWQgbG9uZylwTGVkKTsKIAlJTklUX1dPUksoJnBMZWQtPkJsaW5rV29ya0l0ZW0sIEJsaW5rV29ya0l0ZW1DYWxsYmFjayk7CiB9CiAKQEAgLTEwNyw3ICsxMDgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBEZUluaXRMZWQ4NzF4KHN0cnVjdCBMRURfODcxeCAqcExlZCkKIHsKLQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkvKiBXZSBzaG91bGQgcmVzZXQgYkxlZEJsaW5rSW5Qcm9ncmVzcyBpZiB3ZSBjYW5jZWwKIAkgKiB0aGUgTGVkQ29udHJvbFRpbWVyLCAqLwogCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTI1OCwyMSArMjU5LDIxIEBACiAJCS8qIFNjaGVkdWxlIGEgdGltZXIgdG8gdG9nZ2xlIExFRCBzdGF0ZS4gKi8KIAkJc3dpdGNoIChwTGVkLT5DdXJyTGVkU3RhdGUpIHsKIAkJY2FzZSBMRURfQkxJTktfTk9STUFMOgotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQkJYnJlYWs7CiAJCWNhc2UgTEVEX0JMSU5LX1NMT1dMWToKIAkJY2FzZSBMRURfQkxJTktfU3RhcnRUb0JsaW5rOgotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCkpOwogCQkJYnJlYWs7CiAJCWNhc2UgTEVEX0JMSU5LX1dQUzoKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkJTEVEX0JMSU5LX0xPTkdfSU5URVJWQUwpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xPTkdfSU5URVJWQUwpKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCkpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0zMTUsMTYgKzMxNiwxNiBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCSAgIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19OT1JNQUw6CiAJCWlmIChwTGVkLT5iTGVkT24pCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX1NDQU5fQkxJTks6CiAJCXBMZWQtPkJsaW5rVGltZXMtLTsKQEAgLTMzOCw4ICszMzksOCBAQAogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCQllbHNlCiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCQkgICBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQl9IGVsc2UgaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwpAQCAtMzQ3LDggKzM0OCw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJCWVsc2UKIAkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CkBAIC0zNTYsOCArMzU3LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfVFhSWF9CTElOSzoKQEAgLTM3Miw4ICszNzMsOCBAQAogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCQllbHNlCiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCQkgICBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQl9IGVsc2UgaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwpAQCAtMzgxLDggKzM4Miw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJCWVsc2UKIAkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0KIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAwOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMzkxLDggKzM5Miw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CkBAIC00MDAsMTQgKzQwMSwxNCBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUDoJLyogV1BTIHN1Y2Nlc3MgKi8KIAkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQkJYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCQl9IGVsc2UKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwpAQCAtNDE4LDggKzQxOSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJYnJlYWs7CkBAIC00NjAsOCArNDYxLDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfVFhSWF9CTElOSzoKQEAgLTQ4NCw4ICs0ODUsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTUyOCw4ICs1MjksOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9UWFJYX0JMSU5LOgpAQCAtNTU0LDggKzU1NSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CkBAIC01NjMsMTQgKzU2NCwxNCBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUDoJLypXUFMgc3VjY2VzcyovCiAJCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikgewogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpKTsKIAkJCWJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAkJfSBlbHNlCiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKQEAgLTYxMCwxOCArNjExLDE4IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1N0YXJ0VG9CbGluazoKIAkJaWYgKHBMZWQtPmJMZWRPbikgewogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCX0gZWxzZSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX1NDQU5fQkxJTks6CkBAIC02MzUsMTYgKzYzNiwxNiBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9UWFJYX0JMSU5LOgpAQCAtNjU4LDI3ICs2NTksMjcgQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkgaWYgKHBMZWQtPmJMZWRPbikKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQUzoKIAkJaWYgKHBMZWQtPmJMZWRPbikgewogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCX0gZWxzZSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQU19TVE9QOgkvKldQUyBhdXRoZW50aWNhdGlvbiBmYWlsKi8KQEAgLTY4Niw3ICs2ODcsOCBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUF9PVkVSTEFQOgkvKldQUyBzZXNzaW9uIG92ZXJsYXAgKi8KIAkJcExlZC0+QmxpbmtUaW1lcy0tOwpAQCAtNjk5LDE1ICs3MDEsMTUgQEAKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAxMDsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNzM0LDE2ICs3MzYsMTYgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CiAJCQlpZiAoIXBMZWQtPmJMZWRPbikKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJaWYgKHBMZWQtPmJMZWRPbikKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfVFhSWF9CTElOSzoKQEAgLTc1NCwxNiArNzU2LDE2IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwogCQkJaWYgKCFwTGVkLT5iTGVkT24pCi0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJIGlmIChwTGVkLT5iTGVkT24pCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNzk3LDggKzc5OSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CkBAIC04MDYsNyArODA4LDggQEAKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC04OTUsMTEgKzg5OCwxMSBAQAogCQkJICBJU19MRURfV1BTX0JMSU5LSU5HKHBMZWQpKQogCQkJCXJldHVybjsKIAkJCWlmIChwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTkwOCw4ICs5MTEsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfTElOSzoKQEAgLTkxOCwxMSArOTIxLDExIEBACiAJCQkgICAgSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTkzMSw4ICs5MzQsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU0lURV9TVVJWRVk6CkBAIC05NDMsMTUgKzk0NiwxNSBAQAogCQkJaWYgKElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJIHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtOTYxLDggKzk2NCw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQkgfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfVFg6CkBAIC05NzIsMTEgKzk3NSwxMSBAQAogCQkJICAgIElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtOTg2LDggKzk4OSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIApAQCAtOTk1LDE5ICs5OTgsMTkgQEAKIAljYXNlIExFRF9DVExfU1RBUlRfV1BTX0JPVFRPTjoKIAkJIGlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID09IGZhbHNlKSB7CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQkgcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlpZiAocExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTEwMTYsNDQgKzEwMTksNDUgQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTOgogCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJIHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpCi0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQllbHNlCiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwogCQlpZiAocExlZC0+YkxlZE9uKSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQl9IGVsc2UgewogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTA2MiwzMyArMTA2NiwzNCBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCSAgIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTExMTEsNyArMTExNiw3IEBACiAJCQkJcmV0dXJuOwogCiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTEyMSw4ICsxMTI2LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCSB9CiAJCWJyZWFrOwogCkBAIC0xMTQwLDggKzExNDUsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTExNDksMzIgKzExNTQsMzQgQEAKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBMRURfQ1RMX1NUQVJUX1dQUzogLyp3YWl0IHVudGlsIHhpbnBpbiBmaW5pc2gqLwogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFNfQk9UVE9OOgogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9PSBmYWxzZSkgewogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCSB9CiAJCWJyZWFrOwogCkBAIC0xMTgyLDE0ICsxMTg5LDE2IEBACiAJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAKIAljYXNlIExFRF9DVExfU1RPUF9XUFNfRkFJTDoKIAkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBMRURfQ1RMX1NUQVJUX1RPX0xJTks6CkBAIC0xMTk3LDI1ICsxMjA2LDI3IEBACiAJCWlmICghSVNfTEVEX0JMSU5LSU5HKHBMZWQpKSB7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEyMzcsNyArMTI0OCw3IEBACiAJCQlpZiAoSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTI0Nyw4ICsxMjU4LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1RYOgpAQCAtMTI2NSw4ICsxMjc2LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9MSU5LOgpAQCAtMTI3NSwyNCArMTI4NiwyNSBAQAogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFM6IC8qIHdhaXQgdW50aWwgeGlucGluIGZpbmlzaCAqLwogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFNfQk9UVE9OOgogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9PSBmYWxzZSkgewogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTMwMSw1OSArMTMxMyw2MyBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RPUF9XUFM6CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJihwTGVkLT5CbGlua1RpbWVyKSk7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZQogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFNfU1RPUDsKIAkJaWYgKHBMZWQtPmJMZWRPbikgewogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpKTsKIAkJfSBlbHNlIHsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVE9QX1dQU19GQUlMOgogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVEFSVF9UT19MSU5LOgogCWNhc2UgTEVEX0NUTF9OT19MSU5LOgogCQlpZiAoIUlTX0xFRF9CTElOS0lORyhwTGVkKSkgewogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0xMzcyLDM0ICsxMzg4LDM1IEBACiAJY2FzZSBMRURfQ1RMX1NUQVJUX1RPX0xJTks6CiAJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkMS0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQxLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJaWYgKHBMZWQxLT5iTGVkT24pCi0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkU3RhcnRUb0xpbmtCbGlua0luUHJvZ3Jlc3MgPT0gZmFsc2UpIHsKIAkJCWlmIChwTGVkLT5DdXJyTGVkU3RhdGUgPT0gTEVEX1NDQU5fQkxJTksgfHwKIAkJCSAgICBJU19MRURfV1BTX0JMSU5LSU5HKHBMZWQpKQogCQkJCXJldHVybjsKIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFN0YXJ0VG9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TdGFydFRvQmxpbms7CiAJCQlpZiAocExlZC0+YkxlZE9uKSB7CiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCQkgICBMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCkpOwogCQkJfSBlbHNlIHsKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkJICAgTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCk7CisJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJCX0KIAkJfQogCQlicmVhazsKQEAgLTE0MDksMTEgKzE0MjYsMTIgQEAKIAkJaWYgKExlZEFjdGlvbiA9PSBMRURfQ1RMX0xJTkspIHsKIAkJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewogCQkJCXBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQxLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQxLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQkJaWYgKHBMZWQxLT5iTGVkT24pCi0JCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQkJfQogCQl9CiAJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID09IGZhbHNlKSB7CkBAIC0xNDIxLDcgKzE0MzksNyBAQAogCQkJICAgIElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTQzMCw4ICsxNDQ4LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NJVEVfU1VSVkVZOgpAQCAtMTQ0MiwxMSArMTQ2MCwxMSBAQAogCQkJaWYgKElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNDU2LDggKzE0NzQsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfVFg6CkBAIC0xNDY3LDcgKzE0ODUsNyBAQAogCQkJICAgIElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTQ3Nyw0OSArMTQ5NSw1MCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUQVJUX1dQUzogLyp3YWl0IHVudGlsIHhpbnBpbiBmaW5pc2gqLwogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFNfQk9UVE9OOgogCQlpZiAocExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCXBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZDEtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCYocExlZDEtPkJsaW5rVGltZXIpKTsKIAkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJaWYgKHBMZWQxLT5iTGVkT24pCi0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID09IGZhbHNlKSB7CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQUzsKIAkJCWlmIChwTGVkLT5iTGVkT24pIHsKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCQl9IGVsc2UgewogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCQkgICBMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQkJfQogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVE9QX1dQUzoJLypXUFMgY29ubmVjdCBzdWNjZXNzKi8KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNTI4LDEyICsxNTQ3LDEyIEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVE9QX1dQU19GQUlMOgkvKldQUyBhdXRoZW50aWNhdGlvbiBmYWlsKi8KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNTQyLDExICsxNTYxLDExIEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCS8qTEVEMSBzZXR0aW5ncyovCiAJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkMS0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQxLT5CbGlua1RpbWVyKTsKIAkJZWxzZQogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwpAQCAtMTU1NCwxMSArMTU3MywxMiBAQAogCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVE9QX1dQU19GQUlMX09WRVJMQVA6CS8qV1BTIHNlc3Npb24gb3ZlcmxhcCovCiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTU2NywxMSArMTU4NywxMSBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCSAgIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkvKkxFRDEgc2V0dGluZ3MqLwogCQlpZiAocExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpCi0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZDEtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkMS0+QmxpbmtUaW1lcik7CiAJCWVsc2UKIAkJCXBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFNfU1RPUF9PVkVSTEFQOwpAQCAtMTU4MCwzNyArMTYwMCwzOCBAQAogCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRTdGFydFRvTGlua0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRTdGFydFRvTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQxLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZDEtPkJsaW5rVGltZXIpOwogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9VTktOT1dOOwpAQCAtMTY0MSw3ICsxNjYyLDggQEAKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwogCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAljYXNlIExFRF9DVExfU0lURV9TVVJWRVk6CiAJCWlmICgocG1sbWVwcml2LT5zaXRlc3VydmV5Y3RybC50cmFmZmljX2J1c3kpICYmCkBAIC0xNjQ5LDcgKzE2NzEsNyBAQAogCQkJOyAvKiBkdW1teSBicmFuY2ggKi8KIAkJZWxzZSBpZiAocExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPT0gZmFsc2UpIHsKIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNjU5LDggKzE2ODEsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfVFg6CkBAIC0xNjc1LDE1ICsxNjk3LDE1IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwpAQCAtMTcxMSw3ICsxNzMzLDcgQEAKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwogCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCW1vZF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9UWDoKIAljYXNlIExFRF9DVExfUlg6CkBAIC0xNzI2LDE1ICsxNzQ4LDE1IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RBUlRfV1BTOiAvKndhaXQgdW50aWwgeGlucGluIGZpbmlzaCovCiAJY2FzZSBMRURfQ1RMX1NUQVJUX1dQU19CT1RUT046CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID09IGZhbHNlKSB7CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNzQzLDI5ICsxNzY1LDMwIEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVE9QX1dQU19GQUlMOgogCWNhc2UgTEVEX0NUTF9TVE9QX1dQUzoKIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKIAkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKaW5kZXggY2Q4YjQ0NC4uNTAyMjdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKQEAgLTE2MSwxMiArMTYxLDEyIEBACiAJdTE2IGRydmluZm9fc3ogPSAwOwogCiAJZHJ2aW5mb19zeiA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkmMHgwMDBmMDAwMCk+PjE2OwotCWRydmluZm9fc3ogPSBkcnZpbmZvX3N6PDwzOworCWRydmluZm9fc3ogPDw9IDM7CiAJLypUT0RPOgogCSAqIE9mZnNldCAwICovCiAJcGF0dHJpYi0+YmRlY3J5cHRlZCA9ICgobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApICYgQklUKDI3KSkgPj4gMjcpCiAJCQkJID8gMCA6IDE7Ci0JcGF0dHJpYi0+Y3JjX2VyciA9ICgobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApICYgQklUKDE0KSkgPj4gMTQpOworCXBhdHRyaWItPmNyY19lcnIgPSAobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApICYgQklUKDE0KSkgPj4gMTQ7CiAJLypPZmZzZXQgNCovCiAJLypPZmZzZXQgOCovCiAJLypPZmZzZXQgMTIqLwpAQCAtNDM1LDggKzQzNSw4IEBACiAJcG9mZnNldCA9ICh1OCAqKXByeGNtZGJ1ZjsKIAl2b2Zmc2V0ID0gKih1aW50ICopcG9mZnNldDsKIAlwcnhzdGF0ID0gKHN0cnVjdCByZWN2X3N0YXQgKilwcnhjbWRidWY7Ci0JZHJ2aW5mb19zeiA9ICgobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApICYgMHgwMDBmMDAwMCkgPj4gMTYpOwotCWRydmluZm9fc3ogPSBkcnZpbmZvX3N6IDw8IDM7CisJZHJ2aW5mb19zeiA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiAweDAwMGYwMDAwKSA+PiAxNjsKKwlkcnZpbmZvX3N6IDw8PSAzOwogCXBvZmZzZXQgKz0gUlhERVNDX1NJWkUgKyBkcnZpbmZvX3N6OwogCWRvIHsKIAkJdm9mZnNldCAgPSAqKHVpbnQgKilwb2Zmc2V0OwpAQCAtNjA0LDEyICs2MDQsMTIgQEAKIAkgKi8KIAlpZiAocjg3MTJfcmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXIocGFkYXB0ZXIsIHByZW9yZGVyX2N0cmwsIGZhbHNlKSA9PQogCSAgICB0cnVlKSB7Ci0JCV9zZXRfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwKLQkJCSAgIFJFT1JERVJfV0FJVF9USU1FKTsKKwkJbW9kX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFT1JERVJfV0FJVF9USU1FKSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jaywgaXJxbCk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrLCBpcnFsKTsKLQkJX2NhbmNlbF90aW1lcl9leCgmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKKwkJZGVsX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwogCX0KIAlyZXR1cm4gX1NVQ0NFU1M7CiBfZXJyX2V4aXQ6CkBAIC03NDksNyArNzQ5LDcgQEAKIAkJICovCiAJCWlmICghY2NrX2hpZ2hwd3IpIHsKIAkJCXJlcG9ydCA9IHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4YzA7Ci0JCQlyZXBvcnQgPSByZXBvcnQgPj4gNjsKKwkJCXJlcG9ydCA+Pj0gNjsKIAkJCXN3aXRjaCAocmVwb3J0KSB7CiAJCQkvKiBNb2RpZnkgdGhlIFJGIFJOQSBnYWluIHZhbHVlIHRvIC00MCwgLTIwLAogCQkJICogLTIsIDE0IGJ5IEplbnl1J3Mgc3VnZ2VzdGlvbgpAQCAtNzc1LDcgKzc3NSw3IEBACiAJCX0gZWxzZSB7CiAJCQlyZXBvcnQgPSAoKHU4KShsZTMyX3RvX2NwdShwcGh5X3N0YXQtPnBoeWR3MSkgPj4gOCkpICYKIAkJCQkgMHg2MDsKLQkJCXJlcG9ydCA9IHJlcG9ydCA+PiA1OworCQkJcmVwb3J0ID4+PSA1OwogCQkJc3dpdGNoIChyZXBvcnQpIHsKIAkJCWNhc2UgMHgzOgogCQkJCXJ4X3B3cl9hbGwgPSAtNDAgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmCkBAIC0xMDM5LDcgKzEwMzksNyBAQAogCQlmcmFnID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcyKSA+PiAxMikgJiAweGY7CiAJCS8qIHVpbnQgMl4zID0gOCBieXRlcyAqLwogCQlkcnZpbmZvX3N6ID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSAmIDB4MDAwZjAwMDApID4+IDE2OwotCQlkcnZpbmZvX3N6ID0gZHJ2aW5mb19zejw8MzsKKwkJZHJ2aW5mb19zeiA8PD0gMzsKIAkJaWYgKHBrdF9sZW4gPD0gMCkKIAkJCWdvdG8gIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwogCQkvKiBRb3MgZGF0YSwgd2lyZWxlc3MgbGFuIGhlYWRlciBsZW5ndGggaXMgMjYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCmluZGV4IGZlNWUzMTUuLjFhMWMzOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYwpAQCAtMjQ3LDcgKzI0Nyw4IEBACiAJfQogCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7CiAJcjg3MTJfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwotCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgU0NBTk5JTkdfVElNRU9VVCk7CisJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoU0NBTk5JTkdfVElNRU9VVCkpOwogCXBhZGFwdGVyLT5sZWRwcml2LkxlZENvbnRyb2xIYW5kbGVyKHBhZGFwdGVyLCBMRURfQ1RMX1NJVEVfU1VSVkVZKTsKIAlwYWRhcHRlci0+YmxuRW5hYmxlUnhGRjBGaWx0ZXIgPSAwOwogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTUzMCw4ICs1MzEsOCBAQAogCSAqIHRoZSBkcml2ZXIganVzdCBoYXMgdGhlIGJzc2lkIGluZm9ybWF0aW9uIGZvciBQTUtJRExpc3Qgc2VhcmNoaW5nLgogCSAqLwogCWlmIChwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkID09IGZhbHNlKQotCQltZW1jcHkoJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0sCi0JCQkmcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzc1swXSwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkoJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0sCisJCQkJJnBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3NbMF0pOwogCXBzZWNuZXR3b3JrLT5JRUxlbmd0aCA9IHI4NzEyX3Jlc3RydWN0X3NlY19pZShwYWRhcHRlciwKIAkJCQkJCSZwbmV0d29yay0+bmV0d29yay5JRXNbMF0sCiAJCQkJCQkmcHNlY25ldHdvcmstPklFc1swXSwKQEAgLTY4Miw3ICs2ODMsNyBAQAogCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzZXRzdGFrZXlfcGFyYSwgX1NldFN0YUtleV9DTURfKTsKIAlwaDJjLT5yc3AgPSAodTggKikgcHNldHN0YWtleV9yc3A7CiAJcGgyYy0+cnNwc3ogPSBzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcnNwKTsKLQltZW1jcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBzdGEtPmh3YWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHN0YS0+aHdhZGRyKTsKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCiAJCXBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtID0gKHVuc2lnbmVkIGNoYXIpCiAJCQkJCSAgICBwc2VjdXJpdHlwcml2LT5Qcml2YWN5QWxncnRobTsKQEAgLTc4NCw3ICs3ODUsNyBAQAogCX0KIAlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc2V0TWFjQWRkcl9wYXJhLAogCQkJCSAgIF9TZXRNYWNBZGRyZXNzX0NNRF8pOwotCW1lbWNweShwc2V0TWFjQWRkcl9wYXJhLT5NYWNBZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwc2V0TWFjQWRkcl9wYXJhLT5NYWNBZGRyLCBtYWNfYWRkcik7CiAJcjg3MTJfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KQEAgLTgxMyw3ICs4MTQsNyBAQAogCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzZXRhc3NvY3N0YV9wYXJhLCBfU2V0QXNzb2NTdGFfQ01EXyk7CiAJcGgyYy0+cnNwID0gKHU4ICopIHBzZXRhc3NvY3N0YV9yc3A7CiAJcGgyYy0+cnNwc3ogPSBzaXplb2Yoc3RydWN0IHNldF9hc3NvY3N0YV9yc3ApOwotCW1lbWNweShwc2V0YXNzb2NzdGFfcGFyYS0+YWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHNldGFzc29jc3RhX3BhcmEtPmFkZHIsIG1hY19hZGRyKTsKIAlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtODkwLDcgKzg5MSw4IEBACiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAogCWlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpCi0JCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIDEpOworCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAlyODcxMl9mcmVlX2NtZF9vYmoocGNtZCk7CiB9CiAKQEAgLTg5OCw3ICs5MDAsNiBAQAogCQkJCSAgc3RydWN0IGNtZF9vYmogKnBjbWQpCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFMOwotCXU4IHRpbWVyX2NhbmNlbGxlZDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnB3bGFuID0gTlVMTDsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwpAQCAtOTA3LDggKzkwOCw5IEBACiAJc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmspOwogCiAJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7Ci0JX2NhbmNlbF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgJnRpbWVyX2NhbmNlbGxlZCk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOworCWRlbF90aW1lcl9zeW5jKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyKTsKICNpZmRlZiBfX0JJR19FTkRJQU4KIAkvKiBlbmRpYW5fY29udmVydCAqLwogCXBuZXR3b3JrLT5MZW5ndGggPSBsZTMyX3RvX2NwdShwbmV0d29yay0+TGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2VlcHJvbS5jCmluZGV4IDJmMTQ1ZDYuLjUwMzM5ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfZWVwcm9tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9lZXByb20uYwpAQCAtNjQsNyArNjQsNyBAQAogCQl1ZGVsYXkoQ0xPQ0tfUkFURSk7CiAJCXVwX2NsayhwYWRhcHRlciwgJngpOwogCQlkb3duX2NsayhwYWRhcHRlciwgJngpOwotCQltYXNrID0gbWFzayA+PiAxOworCQltYXNrID4+PSAxOwogCX0gd2hpbGUgKG1hc2spOwogCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlKQogCQlnb3RvIG91dDsKQEAgLTgzLDcgKzgzLDcgQEAKIAl4ICY9IH4oX0VFRE8gfCBfRUVESSk7CiAJZCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJZCA9IGQgPDwgMTsKKwkJZCA8PD0gMTsKIAkJdXBfY2xrKHBhZGFwdGVyLCAmeCk7CiAJCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlKQogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMKaW5kZXggOWJiMzY0Zi4uNDJmYmEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYwpAQCAtNDYsNiArNDYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKwogCiAjZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkoU0lPQ0lXRklSU1RQUklWICsgMHgxRSkKIApAQCAtMTEyLDcgKzExNCw3IEBACiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwogCiAJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHdycXUuYXBfYWRkci5zYV9kYXRhKTsKIAl3aXJlbGVzc19zZW5kX2V2ZW50KHBhZGFwdGVyLT5wbmV0ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIH0KIApAQCAtMTI5LDcgKzEzMSw4IEBACiAJCW1lbWNweShwc3RhLT50a2lwcnhtaWNrZXkuIHNrZXksICYocGFyYW0tPnUuY3J5cHQuCiAJCQlrZXlbMjRdKSwgOCk7CiAJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuIGJ1c2V0a2lwa2V5ID0gZmFsc2U7Ci0JCV9zZXRfdGltZXIoJnBhZGFwdGVyLT5zZWN1cml0eXByaXYudGtpcF90aW1lciwgNTApOworCQltb2RfdGltZXIoJnBhZGFwdGVyLT5zZWN1cml0eXByaXYudGtpcF90aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKIAl9CiAJcjg3MTJfc2V0c3Rha2V5X2NtZChwYWRhcHRlciwgKHVuc2lnbmVkIGNoYXIgKilwc3RhLCB0cnVlKTsKIH0KQEAgLTE1Myw4ICsxNTYsOCBAQAogCQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5wb3dlcl9tZ250ID4gUFNfTU9ERV9BQ1RJVkUpIHsKIAkJCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQgIT0gcGFkYXB0ZXItPgogCQkJICAgIHB3cmN0cmxwcml2LnB3cl9tb2RlKQotCQkJCV9zZXRfdGltZXIoJihwYWRhcHRlci0+bWxtZXByaXYuZGhjcF90aW1lciksCi0JCQkJCSAgIDYwMDAwKTsKKwkJCQltb2RfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi5kaGNwX3RpbWVyLAorCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYwMDAwKSk7CiAJCX0KIAl9CiB9CkBAIC0xODIsNyArMTg1LDcgQEAKIAkvKiBBUCBNQUMgYWRkcmVzcyAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CiAJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwogCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKIAkvKiBBZGQgdGhlIEVTU0lEICovCiAJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKQEAgLTM2MCw3ICszNjMsNyBAQAogCiBzdGF0aWMgaW50IHdwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXQgPSAwOwogCiAJaWYgKCh2YWx1ZSAmIEFVVEhfQUxHX1NIQVJFRF9LRVkpICYmICh2YWx1ZSAmIEFVVEhfQUxHX09QRU5fU1lTVEVNKSkgewpAQCAtMzkyLDcgKzM5NSw3IEBACiAJaW50IHJldCA9IDA7CiAJdTMyIHdlcF9rZXlfaWR4LCB3ZXBfa2V5X2xlbiA9IDA7CiAJc3RydWN0IE5ESVNfODAyXzExX1dFUAkgKnB3ZXAgPSBOVUxMOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAKQEAgLTYyNiw3ICs2MjksNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIGh0X2llbGVuID0gMDsKIAljaGFyICpwOwogCXU4IGh0X2NhcCA9IGZhbHNlOwpAQCAtNjgyLDcgKzY4NSw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICZ3cnF1LT5mcmVxOwogCWludCByYyA9IDA7CiAKQEAgLTcxOCw3ICs3MjEsNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgbmRpc193bGFuX2Jzc2lkX2V4ICpwY3VyX2JzcyA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcms7CiAKQEAgLTczNyw3ICs3NDAsNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAllbnVtIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgbmV0d29ya1R5cGU7CiAKIAlzd2l0Y2ggKHdycXUtPm1vZGUpIHsKQEAgLTc2OCw3ICs3NzEsNyBAQAogc3RhdGljIGludCByODcxMV93eF9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpID09IHRydWUpCkBAIC03ODcsNyArNzkwLDcgQEAKIAkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKIAkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0IGl3X3Bta3NhICpwUE1LID0gKHN0cnVjdCBpd19wbWtzYSAqKSBleHRyYTsKIAl1OCBzdHJaZXJvTWFjQWRkcmVzc1tFVEhfQUxFTl0gPSB7MHgwMH07CkBAIC04NTEsOCArODU0LDcgQEAKIAkJCSAgICBzdHJJc3N1ZUJzc2lkLCBFVEhfQUxFTikpIHsKIAkJCQkvKiBCU1NJRCBpcyBtYXRjaGVkLCB0aGUgc2FtZSBBUCA9PiBSZW1vdmUKIAkJCQkgKiB0aGlzIFBNS0lEIGluZm9ybWF0aW9uIGFuZCByZXNldCBpdC4gKi8KLQkJCQltZW1zZXQocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2pdLkJzc2lkLAotCQkJCQkweDAwLCBFVEhfQUxFTik7CisJCQkJZXRoX3plcm9fYWRkcihwc2VjdXJpdHlwcml2LT5QTUtJRExpc3Rbal0uQnNzaWQpOwogCQkJCXBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtqXS5iVXNlZCA9IGZhbHNlOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTA1OSw3ICsxMDYxLDcgQEAKIAkJCSBjaGFyICpleHRyYSkKIHsKIAlpbnQgcmV0ID0gLUVJTlBST0dSRVNTOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgIF9fcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKnRlbXAgPSAoc3RydWN0IHNvY2thZGRyICopYXdycTsKQEAgLTExMDgsMTYgKzExMTAsMTYgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBuZGlzX3dsYW5fYnNzaWRfZXggKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKIAogCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCB8IFdJRklfQURIT0NfTUFTVEVSX1NUQVRFIHwKIAkJCQkgICAgIFdJRklfQVBfU1RBVEUpKQotCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCBwY3VyX2Jzcy0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCBwY3VyX2Jzcy0+TWFjQWRkcmVzcyk7CiAJZWxzZQotCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS0+YXBfYWRkci5zYV9kYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEyNiw3ICsxMTI4LDcgQEAKIAkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopIGV4dHJhOwogCiAJaWYgKG1sbWUgPT0gTlVMTCkKQEAgLTExNTgsNyArMTE2MCw3IEBACiAJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJdTggc3RhdHVzID0gdHJ1ZTsKIApAQCAtMTIwNyw3ICsxMjA5LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCAgX19xdWV1ZSAqcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKQEAgLTEyNjEsNyArMTI2Myw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgIF9fcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayA9IE5VTEw7CkBAIC0xMzI0LDcgKzEzMjYsNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IG5kaXNfd2xhbl9ic3NpZF9leCAqcGN1cl9ic3MgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwogCXUzMiBsZW4sIHJldCA9IDA7CkBAIC0xMzQ0LDcgKzEzNDYsNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiB0YXJnZXRfcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWU7CiAJdTMyIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKIAl1MzIgcmF0ZXZhbHVlID0gMDsKQEAgLTE0MTYsNyArMTQxOCw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBuZGlzX3dsYW5fYnNzaWRfZXggKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwpAQCAtMTQ3Myw3ICsxNDc1LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXdycXUtPnJ0cy52YWx1ZSA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucnRzX3RocmVzaDsKIAl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLwpAQCAtMTQ4NCw3ICsxNDg2LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmICh3cnF1LT5mcmFnLmRpc2FibGVkKQogCQlwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW4gPSBNQVhfRlJBR19USFJFU0hPTEQ7CkBAIC0xNTAxLDcgKzE1MDMsNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXdycXUtPmZyYWcudmFsdWUgPSBwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW47CiAJd3JxdS0+ZnJhZy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCkBAIC0xNTI3LDcgKzE1MjksNyBAQAogCXN0cnVjdCBORElTXzgwMl8xMV9XRVAJIHdlcDsKIAllbnVtIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aG1vZGU7CiAJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJa2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKIAltZW1zZXQoJndlcCwgMCwgc2l6ZW9mKHN0cnVjdCBORElTXzgwMl8xMV9XRVApKTsKQEAgLTE2MTksNyArMTYyMSw3IEBACiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQogewogCXVpbnQga2V5LCByZXQgPSAwOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKIAlzdHJ1Y3QJbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmKHBhZGFwdGVyLT5tbG1lcHJpdik7CiAKQEAgLTE2OTEsNyArMTY5Myw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAKIAlyZXR1cm4gcjg3MXhfc2V0X3dwYV9pZShwYWRhcHRlciwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKIH0KQEAgLTE3MDAsNyArMTcwMiw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9IChzdHJ1Y3QgaXdfcGFyYW0gKikmKHdycXUtPnBhcmFtKTsKIAlpbnQgcGFyYW1pZDsKIAlpbnQgcGFyYW12YWw7CkBAIC0xODQ3LDcgKzE4NDksNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIGFkZHI7CiAJdTMyIGRhdGEzMjsKIApAQCAtMTg2NCw3ICsxODY2LDcgQEAKIAkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIGFkZHI7CiAJdTMyIGRhdGEzMjsKIApAQCAtMTg5Miw3ICsxODk0LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKnAgPSAmd3JxdS0+ZGF0YTsKIAlzdHJ1Y3Qgb2lkX3Bhcl9wcml2IG9pZF9wYXI7CiAJc3RydWN0IG1wX2lvY3RsX2hhbmRsZXIgKnBoYW5kbGVyOwpAQCAtMTkxMCwxMyArMTkxMiw5IEBACiAJYnNldCA9ICh1OCkocC0+ZmxhZ3MgJiAweEZGRkYpOwogCWxlbiA9IHAtPmxlbmd0aDsKIAlwcGFybWJ1ZiA9IE5VTEw7Ci0JcHBhcm1idWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBwYXJtYnVmID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBfcjg3MXhfbXBfaW9jdGxfaGRsX2V4aXQ7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcihwcGFybWJ1ZiwgcC0+cG9pbnRlciwgbGVuKSkgewotCQlyZXQgPSAtRUZBVUxUOworCXBwYXJtYnVmID0gbWVtZHVwX3VzZXIocC0+cG9pbnRlciwgbGVuKTsKKwlpZiAoSVNfRVJSKHBwYXJtYnVmKSkgeworCQlyZXQgPSBQVFJfRVJSKHBwYXJtYnVmKTsKIAkJZ290byBfcjg3MXhfbXBfaW9jdGxfaGRsX2V4aXQ7CiAJfQogCXBvaWRwYXJhbSA9IChzdHJ1Y3QgbXBfaW9jdGxfcGFyYW0gKilwcGFybWJ1ZjsKQEAgLTE5NzUsNyArMTk3Myw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgIF9fcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKnBkYXRhID0gJndycXUtPmRhdGE7CkBAIC0yMDQ2LDcgKzIwNDQsNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKnBkYXRhID0gJndycXUtPmRhdGE7CiAKIAlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgfHwgKHBkYXRhID09IE5VTEwpKQpAQCAtMjA2MSw3ICsyMDU5LDcgQEAKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19wb2ludCAqcGRhdGEgPSAmd3JxdS0+ZGF0YTsKIAlpbnQgY2hfcGxhbiA9IC0xOwogCkBAIC0yMDgxLDcgKzIwNzksNyBAQAogCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKnBkYXRhID0gJndycXUtPmRhdGE7CiAJdTMyICAgdTMyd3BzX3N0YXJ0ID0gMDsKIApAQCAtMjEwNSw3ICsyMTAzLDcgQEAKIAogc3RhdGljIGludCB3cGFfc2V0X3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG5hbWUsIHUzMiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc3dpdGNoIChuYW1lKSB7CiAJY2FzZSBJRUVFX1BBUkFNX1dQQV9FTkFCTEVEOgpAQCAtMjE1Nyw3ICsyMTU1LDcgQEAKIAogc3RhdGljIGludCB3cGFfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgY29tbWFuZCwgdTMyIHJlYXNvbikKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBJRUVFX01MTUVfU1RBX0RFQVVUSDoKQEAgLTIxNzgsNyArMjE3Niw3IEBACiB7CiAJc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtOwogCWludCByZXQgPSAwOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlX3BhcmFtKSB8fCAhcC0+cG9pbnRlcikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzMxLDcgKzIzMjksNyBAQAogCiBzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4NzF4X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X3N0YXRpc3RpY3MgKnBpd3N0YXRzID0gJnBhZGFwdGVyLT5pd3N0YXRzOwogCWludCB0bXBfbGV2ZWwgPSAwOwogCWludCB0bXBfcXVhbCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYwppbmRleCA2MzE4YTBlLi4yMjI2MmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMKQEAgLTg1LDcgKzg1LDggQEAKIAogCQlyZXQgPSByODcxMl9zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FuKHBtbG1lcHJpdik7CiAJCWlmIChyZXQgPT0gX1NVQ0NFU1MpCi0JCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCBNQVhfSk9JTl9USU1FT1VUKTsKKwkJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1BWF9KT0lOX1RJTUVPVVQpKTsKIAkJZWxzZSB7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7CiAJCQkJLyogc3VibWl0IHI4NzEyX2NyZWF0ZWJzc19jbWQgdG8gY2hhbmdlIHRvIGFuCkBAIC0yNjUsOCArMjY2LDcgQEAKIAkJLyogY2xlYXIgV0lGSV9TVEFUSU9OX1NUQVRFOyBXSUZJX0FQX1NUQVRFOyBXSUZJX0FESE9DX1NUQVRFOwogCQkgKiBXSUZJX0FESE9DX01BU1RFUl9TVEFURSAqLwogCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFIHwgV0lGSV9BUF9TVEFURSB8Ci0JCQkgICAgICBXSUZJX0FESE9DX1NUQVRFIHwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgfAotCQkJICAgICAgV0lGSV9BUF9TVEFURSk7CisJCQkgICAgICBXSUZJX0FESE9DX1NUQVRFIHwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpOwogCQlzd2l0Y2ggKG5ldHdvcmt0eXBlKSB7CiAJCWNhc2UgTmRpczgwMl8xMUlCU1M6CiAJCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21sbWUuYwppbmRleCA5NzdhODMzLi5mYjJiMTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21sbWUuYwpAQCAtNTgyLDkgKzU4Miw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBtbG1lcHJpdi0+bG9jaywgaXJxTCk7CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpID09IHRydWUpIHsKLQkJdTggdGltZXJfY2FuY2VsbGVkOwotCi0JCV9jYW5jZWxfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgJnRpbWVyX2NhbmNlbGxlZCk7CisJCWRlbF90aW1lcl9zeW5jKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIpOwogCiAJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKIAl9CkBAIC01OTYsOCArNTk0LDggQEAKIAogCQkJCWlmIChyODcxMl9zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FuKHBtbG1lcHJpdikKIAkJCQkgICAgPT0gX1NVQ0NFU1MpCi0JCQkJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkJCQkgICBNQVhfSk9JTl9USU1FT1VUKTsKKwkJCQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCBqaWZmaWVzICsKKwkJCQkJCSAgbXNlY3NfdG9famlmZmllcyhNQVhfSk9JTl9USU1FT1VUKSk7CiAJCQkJZWxzZSB7CiAJCQkJCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcmsgPQogCQkJCQkgICYoYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrKTsKQEAgLTYyMiw4ICs2MjAsOCBAQAogCQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7CiAJCQlpZiAocjg3MTJfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2NhbihwbWxtZXByaXYpID09CiAJCQkgICAgX1NVQ0NFU1MpCi0JCQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKLQkJCQkJICAgTUFYX0pPSU5fVElNRU9VVCk7CisJCQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCBqaWZmaWVzICsKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKE1BWF9KT0lOX1RJTUVPVVQpKTsKIAkJCWVsc2UKIAkJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwogCQl9CkBAIC02NzksNyArNjc3LDggQEAKIAlwYWRhcHRlci0+bGVkcHJpdi5MZWRDb250cm9sSGFuZGxlcihwYWRhcHRlciwgTEVEX0NUTF9MSU5LKTsKIAlyODcxMl9vc19pbmRpY2F0ZV9jb25uZWN0KHBhZGFwdGVyKTsKIAlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5wb3dlcl9tZ250ID4gUFNfTU9ERV9BQ1RJVkUpCi0JCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+ZGhjcF90aW1lciwgNjAwMDApOworCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+ZGhjcF90aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNjAwMDApKTsKIH0KIAogCkBAIC02OTcsNyArNjk2LDcgQEAKIAl9CiAJaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSAhPQogCSAgICBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQpIHsKLQkJX2NhbmNlbF90aW1lcl9leCgmcG1sbWVwcml2LT5kaGNwX3RpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+ZGhjcF90aW1lcik7CiAJCXI4NzEyX3NldF9wc19tb2RlKHBhZGFwdGVyLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQsCiAJCQkJICBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnNtYXJ0X3BzKTsKIAl9CkBAIC03MTYsNyArNzE1LDYgQEAKIHZvaWQgcjg3MTJfam9pbmJzc19ldmVudF9jYWxsYmFjayhzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpwYnVmKQogewogCXVuc2lnbmVkIGxvbmcgaXJxTCA9IDAsIGlycUwyOwotCXU4IHRpbWVyX2NhbmNlbGxlZDsKIAlzdHJ1Y3Qgc3RhX2luZm8JKnB0YXJnZXRfc3RhID0gTlVMTCwgKnBjdXJfc3RhID0gTlVMTDsKIAlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwpAQCAtNzI3LDYgKzcyNSw4IEBACiAKIAlpZiAoc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpID09IDQgKiBzaXplb2YodTMyKSkgewogCQlwbmV0d29yayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFwbmV0d29yaykKKwkJCXJldHVybjsKIAkJbWVtY3B5KCh1OCAqKXBuZXR3b3JrKzE2LCAodTggKilwYnVmICsgOCwKIAkJCXNpemVvZihzdHJ1Y3Qgd2xhbl9uZXR3b3JrKSAtIDE2KTsKIAl9IGVsc2UKQEAgLTkxMCwxMyArOTEwLDEzIEBACiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkKIAkJCQk9PSB0cnVlKQogCQkJCXI4NzEyX2luZGljYXRlX2Nvbm5lY3QoYWRhcHRlcik7Ci0JCQlfY2FuY2VsX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAotCQkJCSAgICAgICZ0aW1lcl9jYW5jZWxsZWQpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIpOwogCQl9IGVsc2UKIAkJCWdvdG8gaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s7CiAJfSBlbHNlIHsKIAkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykgPT0gdHJ1ZSkgewotCQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CisJCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwogCQl9CiAJfQpAQCAtMTU5OSwxNyArMTU5OSwxNSBAQAogCWlFbnRyeSA9IFNlY0lzSW5QTUtJRExpc3QoYWRhcHRlciwgcG1sbWVwcml2LT5hc3NvY19ic3NpZCk7CiAJaWYgKGlFbnRyeSA8IDApCiAJCXJldHVybiBpZWxlbmd0aDsKLQllbHNlIHsKLQkJaWYgKGF1dGhtb2RlID09IF9XUEEyX0lFX0lEXykgewotCQkJb3V0X2llW2llbGVuZ3RoXSA9IDE7Ci0JCQlpZWxlbmd0aCsrOwotCQkJb3V0X2llW2llbGVuZ3RoXSA9IDA7CS8qUE1LSUQgY291bnQgPSAweDAxMDAqLwotCQkJaWVsZW5ndGgrKzsKLQkJCW1lbWNweSgmb3V0X2llW2llbGVuZ3RoXSwKLQkJCQkmcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2lFbnRyeV0uUE1LSUQsIDE2KTsKLQkJCWllbGVuZ3RoICs9IDE2OwotCQkJb3V0X2llWzEzXSArPSAxODsvKlBNS0lEIGxlbmd0aCA9IDIrMTYqLwotCQl9CisJaWYgKGF1dGhtb2RlID09IF9XUEEyX0lFX0lEXykgeworCQlvdXRfaWVbaWVsZW5ndGhdID0gMTsKKwkJaWVsZW5ndGgrKzsKKwkJb3V0X2llW2llbGVuZ3RoXSA9IDA7CS8qUE1LSUQgY291bnQgPSAweDAxMDAqLworCQlpZWxlbmd0aCsrOworCQltZW1jcHkoJm91dF9pZVtpZWxlbmd0aF0sCisJCQkmcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2lFbnRyeV0uUE1LSUQsIDE2KTsKKwkJaWVsZW5ndGggKz0gMTY7CisJCW91dF9pZVsxM10gKz0gMTg7LypQTUtJRCBsZW5ndGggPSAyKzE2Ki8KIAl9CiAJcmV0dXJuIGllbGVuZ3RoOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jCmluZGV4IDNkOTEzYjkuLjI2MjAxZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMKQEAgLTMyNyw4ICszMjcsOCBAQAogCXUzMiBUeEFHQ09mZnNldF9CLCBUeEFHQ09mZnNldF9DLCBUeEFHQ09mZnNldF9ELCB0bXBBR0M7CiAKIAlUeEFHQ09mZnNldF9CID0gKHVsVHhBR0NPZmZzZXQmMHgwMDAwMDBmZik7Ci0JVHhBR0NPZmZzZXRfQyA9ICgodWxUeEFHQ09mZnNldCYweDAwMDBmZjAwKT4+OCk7Ci0JVHhBR0NPZmZzZXRfRCA9ICgodWxUeEFHQ09mZnNldCYweDAwZmYwMDAwKT4+MTYpOworCVR4QUdDT2Zmc2V0X0MgPSAodWxUeEFHQ09mZnNldCAmIDB4MDAwMGZmMDApPj44OworCVR4QUdDT2Zmc2V0X0QgPSAodWxUeEFHQ09mZnNldCAmIDB4MDBmZjAwMDApPj4xNjsKIAl0bXBBR0MgPSAoVHhBR0NPZmZzZXRfRDw8OCB8IFR4QUdDT2Zmc2V0X0M8PDQgfCBUeEFHQ09mZnNldF9CKTsKIAlzZXRfYmJfcmVnKHBBZGFwdGVyLCByRlBHQTBfVHhHYWluU3RhZ2UsCiAJCQkoYlhCVHhBR0N8YlhDVHhBR0N8YlhEVHhBR0MpLCB0bXBBR0MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9wd3JjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYwppbmRleCBlZDI4NDRkLi5hYWE1ODQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAKIAlpZiAocHdycHJpdi0+Y3B3bV90b2cgPT0gKChwcmVwb3J0cHdyc3RhdGUtPnN0YXRlKSAmIDB4ODApKQogCQlyZXR1cm47Ci0JX2NhbmNlbF90aW1lcl9leCgmcGFkYXB0ZXItPnB3cmN0cmxwcml2LiBycHdtX2NoZWNrX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPnB3cmN0cmxwcml2LnJwd21fY2hlY2tfdGltZXIpOwogCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKIAlwd3Jwcml2LT5jcHdtID0gKHByZXBvcnRwd3JzdGF0ZS0+c3RhdGUpICYgMHhmOwogCWlmIChwd3Jwcml2LT5jcHdtID49IFBTX1NUQVRFX1MyKSB7CkBAIC0xNjUsOSArMTY1LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJwd21fY2hlY2tfaGFuZGxlciAodm9pZCAqRnVuY3Rpb25Db250ZXh0KQorc3RhdGljIHZvaWQgcnB3bV9jaGVja19oYW5kbGVyICh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopZGF0YTsKIAogCV9ycHdtX2NoZWNrX2hhbmRsZXIoYWRhcHRlcik7CiB9CkBAIC0xODYsOCArMTg2LDggQEAKIAlyODcxMl93cml0ZTgocGFkYXB0ZXIsIDB4MTAyNUZFNTgsIDApOwogCUlOSVRfV09SSygmcHdyY3RybHByaXYtPlNldFBTTW9kZVdvcmtJdGVtLCBTZXRQU01vZGVXb3JrSXRlbUNhbGxiYWNrKTsKIAlJTklUX1dPUksoJnB3cmN0cmxwcml2LT5ycHdtX3dvcmtpdGVtLCBycHdtX3dvcmtpdGVtX2NhbGxiYWNrKTsKLQlfaW5pdF90aW1lcigmKHB3cmN0cmxwcml2LT5ycHdtX2NoZWNrX3RpbWVyKSwKLQkJICAgIHBhZGFwdGVyLT5wbmV0ZGV2LCBycHdtX2NoZWNrX2hhbmRsZXIsICh1OCAqKXBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcHdyY3RybHByaXYtPnJwd21fY2hlY2tfdGltZXIsIHJwd21fY2hlY2tfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKaW5kZXggMDZmMTVmOC4uMDQ2YTQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKQEAgLTUxNyw4ICs1MTcsNyBAQAogCQlyZXR1cm4gX0ZBSUw7CiAJaWYgKHBzdGEgPT0gTlVMTCkKIAkJcmV0dXJuIF9GQUlMOwotCWVsc2UKLQkJcHJlY3ZfZnJhbWUtPnUuaGRyLnBzdGEgPSBwc3RhOworCXByZWN2X2ZyYW1lLT51Lmhkci5wc3RhID0gcHN0YTsKIAlwYXR0cmliLT5hbXNkdSA9IDA7CiAJLyogcGFyc2luZyBRQyBmaWVsZCAqLwogCWlmIChwYXR0cmliLT5xb3MgPT0gMSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jCmluZGV4IGM2NTNhZDYuLmJjZDFhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCXU4ICpwOwogCXUzMiAgY3JjOwogCi0JaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDApCisJaWYgKCFiY3JjMzJpbml0aWFsaXplZCkKIAkJY3JjMzJfaW5pdCgpOwogCWNyYyA9IDB4ZmZmZmZmZmY7IC8qIHByZWxvYWQgc2hpZnQgcmVnaXN0ZXIsIHBlciBDUkMtMzIgc3BlYyAqLwogCWZvciAocCA9IGJ1ZjsgbGVuID4gMDsgKytwLCAtLWxlbikKQEAgLTEwNDUsNyArMTA0NSw3IEBACiAJdWludAlmcnR5cGUgID0gR2V0RnJhbWVUeXBlKHBmcmFtZSk7CiAJdWludAlmcnN1YnR5cGUgID0gR2V0RnJhbWVTdWJUeXBlKHBmcmFtZSk7CiAKLQlmcnN1YnR5cGUgPSBmcnN1YnR5cGUgPj4gNDsKKwlmcnN1YnR5cGUgPj49IDQ7CiAJbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7CiAJbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjEsIDAsIDE2KTsKIAltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMiwgMCwgMTYpOwpAQCAtMTA4Niw3ICsxMDg2LDcgQEAKIAlwYXlsb2FkX3JlbWFpbmRlciA9IHBsZW4gJSAxNjsKIAludW1fYmxvY2tzID0gcGxlbiAvIDE2OwogCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLwotCXBheWxvYWRfaW5kZXggPSAoaGRybGVuICsgOCk7CisJcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7CiAJLyogQ2FsY3VsYXRlIE1JQyAqLwogCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKIAliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKQEAgLTEyMTYsNyArMTIxNiw3IEBACiAJdWludCBmcnR5cGUgID0gR2V0RnJhbWVUeXBlKHBmcmFtZSk7CiAJdWludCBmcnN1YnR5cGUgID0gR2V0RnJhbWVTdWJUeXBlKHBmcmFtZSk7CiAKLQlmcnN1YnR5cGUgPSBmcnN1YnR5cGUgPj4gNDsKKwlmcnN1YnR5cGUgPj49IDQ7CiAJbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7CiAJbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjEsIDAsIDE2KTsKIAltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMiwgMCwgMTYpOwpAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIAlwYXlsb2FkX3JlbWFpbmRlciA9IChwbGVuIC0gOCkgJSAxNjsKIAludW1fYmxvY2tzID0gKHBsZW4gLSA4KSAvIDE2OwogCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLwotCXBheWxvYWRfaW5kZXggPSAoaGRybGVuICsgOCk7CisJcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7CiAJLyogQ2FsY3VsYXRlIE1JQyAqLwogCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKIAliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKQEAgLTEzOTIsOSArMTM5Miw5IEBACiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCi12b2lkIHI4NzEyX3VzZV90a2lwa2V5X2hhbmRsZXIodm9pZCAqRnVuY3Rpb25Db250ZXh0KQordm9pZCByODcxMl91c2VfdGtpcGtleV9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKWRhdGE7CiAKIAlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5ID0gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaAppbmRleCBjNzMyYWVhLi4yMjk1ZjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oCkBAIC0yMTYsNyArMjE2LDcgQEAKIHUzMiByODcxMl9hZXNfZGVjcnlwdChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAgKnByZWN2ZnJhbWUpOwogdTMyIHI4NzEyX3RraXBfZGVjcnlwdChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAgKnByZWN2ZnJhbWUpOwogdm9pZCByODcxMl93ZXBfZGVjcnlwdChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAgKnByZWN2ZnJhbWUpOwotdm9pZCByODcxMl91c2VfdGtpcGtleV9oYW5kbGVyKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCk7Cit2b2lkIHI4NzEyX3VzZV90a2lwa2V5X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIAogI2VuZGlmCS8qX19SVEw4NzFYX1NFQ1VSSVRZX0hfICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc3RhX21ndC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMKaW5kZXggMTc1MjEyMS4uN2JiOTZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCSAqIGNhbmNlbCByZW9yZGVyaW5nX2N0cmxfdGltZXIgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0JCV9jYW5jZWxfdGltZXJfZXgoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwogCX0KIAlzcGluX2xvY2soJihwZnJlZV9zdGFfcXVldWUtPmxvY2spKTsKIAkvKiBpbnNlcnQgaW50byBmcmVlX3N0YV9xdWV1ZTsgMjAwNjExMTQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKaW5kZXggYTI4YWYwMy4uMmU0ZmE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKQEAgLTIwMywxMyArMjAzLDEyIEBACiAJcGF0dHJpYi0+ZXRoZXJfdHlwZSA9IG50b2hzKGV0aGVyaGRyLmhfcHJvdG8pOwogCiB7Ci0JdTggYm9vbDsKIAkvKklmIGRyaXZlciB4bWl0IEFSUCBwYWNrZXQsIGRyaXZlciBjYW4gc2V0IHBzIG1vZGUgdG8gaW5pdGlhbAogCSAqIHNldHRpbmcuIEl0IHN0YW5kcyBmb3IgZ2V0dGluZyBESENQIG9yIGZpeCBJUC4qLwogCWlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4MDgwNikgewogCQlpZiAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnB3cl9tb2RlICE9CiAJCSAgICBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQpIHsKLQkJCV9jYW5jZWxfdGltZXIoJihwbWxtZXByaXYtPmRoY3BfdGltZXIpLCAmYm9vbCk7CisJCQlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5kaGNwX3RpbWVyKTsKIAkJCXI4NzEyX3NldF9wc19tb2RlKHBhZGFwdGVyLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LgogCQkJCXBvd2VyX21nbnQsIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuc21hcnRfcHMpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmgKaW5kZXggNzNkN2NkMi4uMTdmNTEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dpZmkuaApAQCAtMjM1LDExICsyMzUsNiBAQAogI2RlZmluZSBHZXRQcml2YWN5KHBidWYpCSgoKCoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikpICYgXAogCQkJCWxlMTZfdG9fY3B1KF9QUklWQUNZXykpICE9IDApCiAKLSNkZWZpbmUgQ2xlYXJQcml2YWN5KHBidWYpICh7IFwKLQkqKHVuc2lnbmVkIHNob3J0ICopKHBidWYpICY9ICh+Y3B1X3RvX2xlMTYoX1BSSVZBQ1lfKSk7IFwKLX0pCi0KLQogI2RlZmluZSBHZXRPcmRlcihwYnVmKQkoKCgqKHVuc2lnbmVkIHNob3J0ICopKHBidWYpKSAmIFwKIAkJCWxlMTZfdG9fY3B1KF9PUkRFUl8pKSAhPSAwKQogCkBAIC0yNDgsOSArMjQzLDkgQEAKIAogI2RlZmluZSBTZXRGcmFtZVR5cGUocGJ1ZiwgdHlwZSkJXAogCWRvIHsJXAotCQkqKHVuc2lnbmVkIHNob3J0ICopKHBidWYpICY9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYofihCSVQoMykgfCBcCisJCSoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikgJj0gY3B1X3RvX2xlMTYofihCSVQoMykgfCBcCiAJCUJJVCgyKSkpOyBcCi0JCSoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikgfD0gX19jb25zdGFudF9jcHVfdG9fbGUxNih0eXBlKTsgXAorCQkqKHVuc2lnbmVkIHNob3J0ICopKHBidWYpIHw9IGNwdV90b19sZTE2KHR5cGUpOyBcCiAJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBHZXRGcmFtZVN1YlR5cGUocGJ1ZikJKGNwdV90b19sZTE2KCoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikpICYgXApAQCAtMjcwLDE2ICsyNjUsNiBAQAogI2RlZmluZSBHZXRGcmFnTnVtKHBidWYpCShjcHVfdG9fbGUxNigqKHVuc2lnbmVkIHNob3J0ICopKChhZGRyX3QpXAogCQkJCShwYnVmKSArIDIyKSkgJiAweDBmKQogCi0jZGVmaW5lIEdldFR1cGxlQ2FjaGUocGJ1ZikJKGNwdV90b19sZTE2KCoodW5zaWduZWQgc2hvcnQgKilcCi0JCQkJKChhZGRyX3QpKHBidWYpICsgMjIpKSkKLQotI2RlZmluZSBTZXRGcmFnTnVtKHBidWYsIG51bSkgKHsgXAotCSoodW5zaWduZWQgc2hvcnQgKikoKGFkZHJfdCkocGJ1ZikgKyAyMikgPSBcCi0JKCgqKHVuc2lnbmVkIHNob3J0ICopKChhZGRyX3QpKHBidWYpICsgMjIpKSAmIFwKLQlsZTE2X3RvX2NwdSh+KDB4MDAwZikpKSB8IFwKLQljcHVfdG9fbGUxNigweDBmICYgKG51bSkpOyAgICAgXAotfSkKLQogI2RlZmluZSBTZXRTZXFOdW0ocGJ1ZiwgbnVtKSAoeyBcCiAJKih1bnNpZ25lZCBzaG9ydCAqKSgoYWRkcl90KShwYnVmKSArIDIyKSA9IFwKIAkoKCoodW5zaWduZWQgc2hvcnQgKikoKGFkZHJfdCkocGJ1ZikgKyAyMikpICYgXApAQCAtMzA2LDE3ICsyOTEsOSBAQAogCiAjZGVmaW5lIEdldEFNc2R1KHBidWYpICgoKGxlMTZfdG9fY3B1KCoodW5zaWduZWQgc2hvcnQgKilwYnVmKSkgPj4gNykgJiAweDEpCiAKLSNkZWZpbmUgU2V0QU1zZHUocGJ1ZiwgYW1zZHUpICh7IFwKLQkqKHVuc2lnbmVkIHNob3J0ICopKHBidWYpIHw9IGNwdV90b19sZTE2KChhbXNkdSAmIDEpIDw8IDcpOyBcCi19KQotCiAjZGVmaW5lIEdldEFpZChwYnVmKQkoY3B1X3RvX2xlMTYoKih1bnNpZ25lZCBzaG9ydCAqKSgoYWRkcl90KShwYnVmKSArIDIpKSBcCiAJCQkmIDB4M2ZmZikKIAotI2RlZmluZSBHZXRUaWQocGJ1ZikJKGNwdV90b19sZTE2KCoodW5zaWduZWQgc2hvcnQgKikoKGFkZHJfdCkocGJ1ZikgKyBcCi0JCQkoKChHZXRUb0RzKHBidWYpIDw8IDEpfEdldEZyRHMocGJ1ZikpID09IDMgPyBcCi0JCQkzMCA6IDI0KSkpICYgMHgwMDBmKQotCiAjZGVmaW5lIEdldEFkZHIxUHRyKHBidWYpCSgodW5zaWduZWQgY2hhciAqKSgoYWRkcl90KShwYnVmKSArIDQpKQogCiAjZGVmaW5lIEdldEFkZHIyUHRyKHBidWYpCSgodW5zaWduZWQgY2hhciAqKSgoYWRkcl90KShwYnVmKSArIDEwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYwppbmRleCAwMzliNTk4Li5kMTVmYjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9saW51eC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIGludCByODcxMl94bWl0X2VudHJ5KF9wa3QgKnBrdCwgc3RydWN0ICBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewogCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gTlVMTDsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAJaW50IHJldCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfYXAuYwppbmRleCBjNjMyN2MwLi42NDU2Njg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2FwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19hcC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8d2lmaS5oPgogI2luY2x1ZGUgPHJ0bDg3MjNhX2NtZC5oPgogI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV01NX09VSTIzQVtdOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV1BTX09VSTIzQVtdOwpAQCAtNzIsMTEgKzczLDggQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmtfbWxtZWV4dCA9ICZwbWxtZWluZm8tPm5ldHdvcms7CiAJdW5zaWduZWQgY2hhciAqcGllID0gcG5ldHdvcmtfbWxtZWV4dC0+SUVzOwogCXU4ICpwLCAqZHN0X2llLCAqcHJlbWFpbmRlcl9pZSA9IE5VTEwsICpwYmFja3VwX3JlbWFpbmRlcl9pZSA9IE5VTEw7Ci0JX19sZTE2IHRpbV9iaXRtYXBfbGU7CiAJdWludCBvZmZzZXQsIHRtcF9sZW4sIHRpbV9pZWxlbiwgdGltX2llX29mZnNldCwgcmVtYWluZGVyX2llbGVuOwogCi0JdGltX2JpdG1hcF9sZSA9IGNwdV90b19sZTE2KHBzdGFwcml2LT50aW1fYml0bWFwKTsKLQogCXAgPSBydHdfZ2V0X2llMjNhKHBpZSwgV0xBTl9FSURfVElNLCAmdGltX2llbGVuLAogCQkJICBwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCk7CiAJaWYgKHAgIT0gTlVMTCAmJiB0aW1faWVsZW4gPiAwKSB7CkBAIC0xNDMsOSArMTQxLDkgQEAKIAkJKmRzdF9pZSsrID0gMDsKIAogCWlmICh0aW1faWVsZW4gPT0gNCkgewotCQkqZHN0X2llKysgPSAqKHU4ICopJnRpbV9iaXRtYXBfbGU7CisJCSpkc3RfaWUrKyA9IHBzdGFwcml2LT50aW1fYml0bWFwICYgMHhmZjsKIAl9IGVsc2UgaWYgKHRpbV9pZWxlbiA9PSA1KSB7Ci0JCW1lbWNweShkc3RfaWUsICZ0aW1fYml0bWFwX2xlLCAyKTsKKwkJcHV0X3VuYWxpZ25lZF9sZTE2KHBzdGFwcml2LT50aW1fYml0bWFwLCBkc3RfaWUpOwogCQlkc3RfaWUgKz0gMjsKIAl9CiAKQEAgLTI2MiwxNSArMjYwLDE3IEBACiAJCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwogCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKIAotCQkJREJHXzg3MjNBKCJhc29jIGV4cGlyZSAiTUFDX0ZNVCIsIHN0YXRlID0gMHgleFxuIiwgTUFDX0FSRyhwc3RhLT5od2FkZHIpLCBwc3RhLT5zdGF0ZSk7CisJCQlEQkdfODcyM0EoImFzb2MgZXhwaXJlICVwTSwgc3RhdGUgPSAweCV4XG4iLAorCQkJCSAgcHN0YS0+aHdhZGRyLCBwc3RhLT5zdGF0ZSk7CiAJCQl1cGRhdGVkID0gYXBfZnJlZV9zdGEyM2EocGFkYXB0ZXIsIHBzdGEsIGZhbHNlLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJCX0gZWxzZSB7CiAJCQkvKiBUT0RPOiBBZ2luZyBtZWNoYW5pc20gdG8gZGlnZXN0IGZyYW1lcyBpbiBzbGVlcF9xIHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHhtaXRmcmFtZSAqLwogCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPiAoTlJfWE1JVEZSQU1FL3BzdGFwcml2LT5hc29jX2xpc3RfY250KQogCQkJCSYmIHBhZGFwdGVyLT54bWl0cHJpdi5mcmVlX3htaXRmcmFtZV9jbnQgPCAoKE5SX1hNSVRGUkFNRS9wc3RhcHJpdi0+YXNvY19saXN0X2NudCkvMikKIAkJCSkgewotCQkJCURCR184NzIzQSgiJXMgc3RhOiJNQUNfRk1UIiwgc2xlZXBxX2xlbjoldSwgZnJlZV94bWl0ZnJhbWVfY250OiV1LCBhc29jX2xpc3RfY250OiV1LCBjbGVhciBzbGVlcF9xXG4iLCBfX2Z1bmNfXywKLQkJCQkJICBNQUNfQVJHKHBzdGEtPmh3YWRkciksCisJCQkJREJHXzg3MjNBKCIlcyBzdGE6JXBNLCBzbGVlcHFfbGVuOiV1LCBmcmVlX3htaXRmcmFtZV9jbnQ6JXUsIGFzb2NfbGlzdF9jbnQ6JXUsIGNsZWFyIHNsZWVwX3FcbiIsCisJCQkJCSAgX19mdW5jX18sCisJCQkJCSAgcHN0YS0+aHdhZGRyLAogCQkJCQkgIHBzdGEtPnNsZWVwcV9sZW4sCiAJCQkJCSAgcGFkYXB0ZXItPnhtaXRwcml2LmZyZWVfeG1pdGZyYW1lX2NudCwKIAkJCQkJICBwc3RhcHJpdi0+YXNvY19saXN0X2NudCk7CkBAIC0zMDcsNyArMzA3LDggQEAKIAogCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCsrOwogCQlpZiAocmV0ID09IF9TVUNDRVNTKSB7Ci0JCQlEQkdfODcyM0EoImFzb2MgY2hlY2ssIHN0YSgiIE1BQ19GTVQgIikgaXMgYWxpdmVcbiIsIE1BQ19BUkcocHN0YS0+aHdhZGRyKSk7CisJCQlEQkdfODcyM0EoImFzb2MgY2hlY2ssIHN0YSglcE0pIGlzIGFsaXZlXG4iLAorCQkJCSAgcHN0YS0+aHdhZGRyKTsKIAkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87CiAJCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA9IDA7CiAJCQljb250aW51ZTsKQEAgLTMxOSw3ICszMjAsOCBAQAogCiAJCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250ID0gMDsKIAotCQlEQkdfODcyM0EoImFzb2MgZXhwaXJlICJNQUNfRk1UIiwgc3RhdGUgPSAweCV4XG4iLCBNQUNfQVJHKHBzdGEtPmh3YWRkciksIHBzdGEtPnN0YXRlKTsKKwkJREJHXzg3MjNBKCJhc29jIGV4cGlyZSAlcE0sIHN0YXRlID0gMHgleFxuIiwKKwkJCSAgcHN0YS0+aHdhZGRyLCBwc3RhLT5zdGF0ZSk7CiAJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZwc3RhLT5hc29jX2xpc3QpKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwpAQCAtNzg1LDYgKzc4Nyw3IEBACiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBic3NfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcms7CiAJdTggKmllID0gcGJzc19uZXR3b3JrLT5JRXM7CiAJdTggKnBidWYgPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZTsKKwogCWxlbiAtPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKIAkvKiBTU0lEICovCiAJLyogU3VwcG9ydGVkIHJhdGVzICovCkBAIC0xMDQ1LDcgKzEwNDgsNyBAQAogCXN0cnVjdCB3bGFuX2FjbF9wb29sICpwYWNsX2xpc3QgPSAmcHN0YXByaXYtPmFjbF9saXN0OwogCXN0cnVjdCBydHdfcXVldWUgKnBhY2xfbm9kZV9xID0gJnBhY2xfbGlzdC0+YWNsX25vZGVfcTsKIAotCURCR184NzIzQSgiJXMoYWNsX251bSA9JWQpID0iIE1BQ19GTVQgIlxuIiwgX19mdW5jX18sIHBhY2xfbGlzdC0+bnVtLCBNQUNfQVJHKGFkZHIpKTsKKwlEQkdfODcyM0EoIiVzKGFjbF9udW0gPSVkKSA9JXBNXG4iLCBfX2Z1bmNfXywgcGFjbF9saXN0LT5udW0sIGFkZHIpOwogCiAJaWYgKChOVU1fQUNMLTEpIDwgcGFjbF9saXN0LT5udW0pCiAJCXJldHVybiAtMTsKQEAgLTE0NzcsOCArMTQ4MCw4IEBACiAJaWYgKHBzdGEtPmZsYWdzICYgV0xBTl9TVEFfSFQpIHsKIAkJdTE2IGh0X2NhcGFiID0gbGUxNl90b19jcHUocHN0YS0+aHRwcml2Lmh0X2NhcC5jYXBfaW5mbyk7CiAKLQkJREJHXzg3MjNBKCJIVDogU1RBICIgTUFDX0ZNVCAiIEhUIENhcGFiaWxpdGllcyAiCi0JCQkgICAiSW5mbzogMHglMDR4XG4iLCBNQUNfQVJHKHBzdGEtPmh3YWRkciksIGh0X2NhcGFiKTsKKwkJREJHXzg3MjNBKCJIVDogU1RBICVwTSBIVCBDYXBhYmlsaXRpZXMgSW5mbzogMHglMDR4XG4iLAorCQkJICBwc3RhLT5od2FkZHIsIGh0X2NhcGFiKTsKIAogCQlpZiAocHN0YS0+bm9faHRfc2V0KSB7CiAJCQlwc3RhLT5ub19odF9zZXQgPSAwOwpAQCAtMTQ5MCwxMCArMTQ5Myw5IEBACiAJCQkJcHN0YS0+bm9faHRfZ2Zfc2V0ID0gMTsKIAkJCQlwbWxtZXByaXYtPm51bV9zdGFfaHRfbm9fZ2YrKzsKIAkJCX0KLQkJCURCR184NzIzQSgiJXMgU1RBICIgTUFDX0ZNVCAiIC0gbm8gIgotCQkJCSAgICJncmVlbmZpZWxkLCBudW0gb2Ygbm9uLWdmIHN0YXRpb25zICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBNQUNfQVJHKHBzdGEtPmh3YWRkciksCi0JCQkJICAgcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmKTsKKwkJCURCR184NzIzQSgiJXMgU1RBICVwTSAtIG5vIGdyZWVuZmllbGQsIG51bSBvZiBub24tZ2Ygc3RhdGlvbnMgJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgcHN0YS0+aHdhZGRyLAorCQkJCSAgcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmKTsKIAkJfQogCiAJCWlmICgoaHRfY2FwYWIgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkgPT0gMCkgewpAQCAtMTUwMSwxMCArMTUwMyw5IEBACiAJCQkJcHN0YS0+aHRfMjBtaHpfc2V0ID0gMTsKIAkJCQlwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHorKzsKIAkJCX0KLQkJCURCR184NzIzQSgiJXMgU1RBICIgTUFDX0ZNVCAiIC0gMjAgTUh6IEhULCAiCi0JCQkJICAgIm51bSBvZiAyME1IeiBIVCBTVEFzICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBNQUNfQVJHKHBzdGEtPmh3YWRkciksCi0JCQkJICAgcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6KTsKKwkJCURCR184NzIzQSgiJXMgU1RBICVwTSAtIDIwIE1IeiBIVCwgbnVtIG9mIDIwTUh6IEhUIFNUQXMgJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgcHN0YS0+aHdhZGRyLAorCQkJCSAgcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6KTsKIAkJfQogCiAJfSBlbHNlIHsKQEAgLTE1MTMsMTAgKzE1MTQsOSBAQAogCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0Kys7CiAJCX0KIAkJaWYgKHBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikgewotCQkJREJHXzg3MjNBKCIlcyBTVEEgIiBNQUNfRk1UCi0JCQkJICAgIiAtIG5vIEhULCBudW0gb2Ygbm9uLUhUIHN0YXRpb25zICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBNQUNfQVJHKHBzdGEtPmh3YWRkciksCi0JCQkJICAgcG1sbWVwcml2LT5udW1fc3RhX25vX2h0KTsKKwkJCURCR184NzIzQSgiJXMgU1RBICVwTSAtIG5vIEhULCBudW0gb2Ygbm9uLUhUIHN0YXRpb25zICVkXG4iLAorCQkJCSAgX19mdW5jX18sIHBzdGEtPmh3YWRkciwKKwkJCQkgIHBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2NtZC5jCmluZGV4IDI0NDdhNTYuLjQ2YWVhMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19jbWQuYwpAQCAtMjk5LDkgKzI5OSw4IEBACiAJCXBjbWRfY2FsbGJhY2sgPQlydHdfY21kX2NhbGxiYWNrW3BjbWQtPmNtZGNvZGVdLmNhbGxiYWNrOwogCQlpZiAoIXBjbWRfY2FsbGJhY2spIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkJICgibWxtZV9jbWRfaGRsKCk6IHBjbWRfY2FsbGJhY2sgPSAweCVwLCAiCi0JCQkJICAiY21kY29kZSA9IDB4JXhcbiIsCi0JCQkJICBwY21kX2NhbGxiYWNrLCBwY21kLT5jbWRjb2RlKSk7CisJCQkJICJtbG1lX2NtZF9oZGwoKTogcGNtZF9jYWxsYmFjayA9IDB4JXAsIGNtZGNvZGUgPSAweCV4XG4iLAorCQkJCSBwY21kX2NhbGxiYWNrLCBwY21kLT5jbWRjb2RlKTsKIAkJCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBuZWVkIGNvbnNpZGVyIHRoYXQgZnJlZSBjbWRfb2JqIGluCkBAIC0zMTAsOCArMzA5LDggQEAKIAkJfQogCX0gZWxzZSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoIiVzOiBjbWRjb2RlID0gMHgleCBjYWxsYmFjayBub3QgZGVmaW5lZCFcbiIsCi0JCQkgIF9fZnVuY19fLCBwY21kLT5jbWRjb2RlKSk7CisJCQkgIiVzOiBjbWRjb2RlID0gMHgleCBjYWxsYmFjayBub3QgZGVmaW5lZCFcbiIsCisJCQkgX19mdW5jX18sIHBjbWQtPmNtZGNvZGUpOwogCQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwogCX0KIH0KQEAgLTM0Myw3ICszNDIsNyBAQAogCXJ0d19mcmVlX25ldHdvcmtfcXVldWUyM2EocGFkYXB0ZXIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6IGZsdXNoIG5ldHdvcmsgcXVldWVcbiIsIF9fZnVuY19fKSk7CisJCSAiJXM6IGZsdXNoIG5ldHdvcmsgcXVldWVcbiIsIF9fZnVuY19fKTsKIAogCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzdXJ2ZXlQYXJhLAogCQkJCSAgIEdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSkpOwpAQCAtNDEyLDEyICs0MTEsMTIgQEAKIAogCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkJICgiIGNyZWF0ZWJzcyBmb3IgQW55IFNTaWQ6JXNcbiIsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkKSk7CisJCQkgImNyZWF0ZWJzcyBmb3IgQW55IFNTaWQ6JXNcbiIsCisJCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwogCX0gZWxzZSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCIgY3JlYXRlYnNzIGZvciBTU2lkOiVzXG4iLAotCQkJICBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCkpOworCQkJICJjcmVhdGVic3MgZm9yIFNTaWQ6JXNcbiIsCisJCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwogCX0KIAogCXBjbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwpAQCAtNDYwLDE5ICs0NTksMTggQEAKIAogCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkJICgiK0pvaW4gY21kOiBBbnkgU1NpZFxuIikpOworCQkJICIrSm9pbiBjbWQ6IEFueSBTU2lkXG4iKTsKIAl9IGVsc2UgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgKCIrSm9pbiBjbWQ6IFNTaWQgPVslc11cbiIsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkKSk7CisJCQkgIitKb2luIGNtZDogU1NpZCA9WyVzXVxuIiwKKwkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7CiAJfQogCiAJcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwY21kKSB7CiAJCXJlcyA9IF9GQUlMOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJydHdfam9pbmJzc19jbWQyM2E6IG1lbW9yeSBhbGxvY2F0ZSBmb3IgY21kX29iaiAiCi0JCQkgICJmYWlsISEhXG4iKSk7CisJCQkgInJ0d19qb2luYnNzX2NtZDIzYTogbWVtb3J5IGFsbG9jYXRlIGZvciBjbWRfb2JqIGZhaWwhISFcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC00OTcsNyArNDk1LDcgQEAKIAkJcmVzID0gX0ZBSUw7CiAKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X2pvaW5ic3NfY21kMjNhIDpwc2VjbmV0d29yayA9PSBOVUxMISEhXG4iKSk7CisJCQkgInJ0d19qb2luYnNzX2NtZDIzYSA6cHNlY25ldHdvcmsgPT0gTlVMTCEhIVxuIik7CiAKIAkJZ290byBleGl0OwogCX0KQEAgLTU5OSw3ICs1OTcsNyBAQAogCWludCByZXMgPSBfU1VDQ0VTUzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywKLQkJICgiK3J0d19kaXNhc3NvY19jbWQyM2FcbiIpKTsKKwkJICIrcnR3X2Rpc2Fzc29jX2NtZDIzYVxuIik7CiAKIAkvKiBwcmVwYXJlIGNtZCBwYXJhbWV0ZXIgKi8KIAlwYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbSksIEdGUF9BVE9NSUMpOwpAQCAtMTI5MSw4ICsxMjg5LDcgQEAKIAkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gKioqKioqKipFcnJvcjogTWdudEFjdHJ0d19zZXRfODAyXzExX2Jzc2lkMjNhXyIKLQkJCSAgIkxJU1RfU0NBTiBGYWlsICoqKioqKioqKioqKlxuXG4uIikpOworCQkJICIqKioqKioqKkVycm9yOiBNZ250QWN0cnR3X3NldF84MDJfMTFfYnNzaWQyM2FfTElTVF9TQ0FOIEZhaWwgKioqKioqKioqKioqXG4iKTsKIAl9CiAKIAkvKiAgZnJlZSBjbWQgKi8KQEAgLTEzMDksNyArMTMwNiw3IEBACiAJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiAqKipFcnJvcjogZGlzY29ubmVjdF9jbWRfY2FsbGJhY2sgRmFpbCAqKipcbi4iKSk7CisJCQkgIioqKkVycm9yOiBkaXNjb25uZWN0X2NtZF9jYWxsYmFjayBGYWlsICoqKlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEzMjksOCArMTMyNiw3IEBACiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAl9IGVsc2UgaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIqKioqKioqKkVycm9yOnJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkXyIKLQkJCSAgInF1ZXVlIFdhaXQgU2VtYSAgRmFpbCAqKioqKioqKioqKipcbiIpKTsKKwkJCSAiKioqKioqKipFcnJvcjpydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZSBXYWl0IFNlbWEgIEZhaWwgKioqKioqKioqKioqXG4iKTsKIAkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJfQpAQCAtMTM0OSw4ICsxMzQ1LDcgQEAKIAogCWlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gKioqKioqKipFcnJvcjogcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2sgICIKLQkJCSAgIkZhaWwgKioqKioqKioqKioqXG5cbi4iKSk7CisJCQkgIioqKioqKioqRXJyb3I6IHJ0d19jcmVhdGVic3NfY21kMjNhX2NhbGxiYWNrICBGYWlsICoqKioqKioqKioqKlxuIik7CiAJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCX0KQEAgLTEzNjYsOSArMTM2MSw4IEBACiAJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXBzdGEpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuQ2FuJ3QgYWxsb2Mgc3RhX2luZm8gd2hlbiAiCi0JCQkJCSAgImNyZWF0ZWJzc19jbWRfY2FsbGJhY2tcbiIpKTsKLQkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbCA7CisJCQkJCSAiQ2FuJ3QgYWxsb2Mgc3RhX2luZm8gd2hlbiBjcmVhdGVic3NfY21kX2NhbGxiYWNrXG4iKTsKKwkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbDsKIAkJCX0KIAkJfQogCkBAIC0xMzgyLDggKzEzNzYsNyBAQAogCQkJcHdsYW4gPSBydHdfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSk7CiAJCQlpZiAoIXB3bGFuKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJcbiBFcnJvcjogIGNhbid0IGdldCBwd2xhbiBpbiAiCi0JCQkJCSAgInJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiXG4iKSk7CisJCQkJCSAiRXJyb3I6ICBjYW4ndCBnZXQgcHdsYW4gaW4gcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2JcbiIpOwogCQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CiAJCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWw7CiAJCQl9CkBAIC0xNDMyLDggKzE0MjUsNyBAQAogCiAJaWYgKCFwc3RhKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuRVJST1I6IHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrMjNhID0+ICIKLQkJCSAgImNhbid0IGdldCBzdGFfaW5mb1xuXG4iKSk7CisJCQkgIkVSUk9SOiBydHdfc2V0c3RhS2V5X2NtZHJzcF9jYWxsYmFjazIzYSA9PiBjYW4ndCBnZXQgc3RhX2luZm9cbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xNDU3LDggKzE0NDksNyBAQAogCiAJaWYgKHBzdGEgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbkVSUk9SOiBzZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhYyA9PiBjYW4ndCAiCi0JCQkgICJnZXQgc3RhX2luZm9cblxuIikpOworCQkJICJFUlJPUjogc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWMgPT4gY2FuJ3QgZ2V0IHN0YV9pbmZvXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19lZnVzZS5jCmluZGV4IGE2ZGVkZGMuLjkyYTM0ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfZWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2VmdXNlLmMKQEAgLTMwNCw4ICszMDQsNyBAQAogCQl9CiAJCWRhdGEgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCk7CiAJCXJldHVybiBkYXRhOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCXJldHVybiAweEZGOwogfS8qIEVGVVNFX1JlYWQxQnl0ZTIzYSAqLwogCkBAIC0zMzYsNyArMzM1LDYgQEAKIAl1MzIJayA9IDA7CiAJdTE2CWNvbnRlbnRMZW4gPSAwOwogCi0JLyogUlRfVFJBQ0UoQ09NUF9FRlVTRSwgREJHX0xPVUQsICgiQWRkciA9JXggRGF0YSA9JXhcbiIsIEFkZHJlc3MsIFZhbHVlKSk7ICovCiAJRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKEFkYXB0ZXIsIEVGVVNFX1dJRkksCiAJCQkJIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTiwKIAkJCQkgKHZvaWQgKikmY29udGVudExlbik7CkBAIC00MDUsOCArNDAzLDYgQEAKIAl1OAl0bXBpZHggPSAwOwogCWludAliUmVzdWx0OwogCi0JLyogUlRfVFJBQ0UoQ09NUF9FRlVTRSwgREJHX0xPVUQsICgiQWRkciA9ICV4IERhdGEgPSV4XG4iLCBhZGRyLCBkYXRhKSk7ICovCi0KIAkvKiByZXR1cm4JMDsgKi8KIAogCS8qICAtLS0tLS0tLS0tLS0tLS0tLWUtZnVzZSByZWcgY3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfaWVlZTgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2llZWU4MDIxMS5jCmluZGV4IGJiYmNmYzguLmNkZDdiYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19pZWVlODAyMTEuYwpAQCAtNDcyLDggKzQ3Miw4IEBACiAJCWxlZnQgLT0gV1BBX1NFTEVDVE9SX0xFTjsKIAl9IGVsc2UgaWYgKGxlZnQgPiAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogaWUgbGVuZ3RoIG1pc21hdGNoLCAldSB0b28gbXVjaCIsCi0JCQkgIF9fZnVuY19fLCBsZWZ0KSk7CisJCQkgIiVzOiBpZSBsZW5ndGggbWlzbWF0Y2gsICV1IHRvbyBtdWNoXG4iLAorCQkJIF9fZnVuY19fLCBsZWZ0KTsKIAogCQlyZXR1cm4gX0ZBSUw7CiAJfQpAQCAtNDg3LDkgKzQ4Nyw4IEBACiAKIAkJaWYgKGNvdW50ID09IDAgfHwgbGVmdCA8IGNvdW50ICogV1BBX1NFTEVDVE9SX0xFTikgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkgKCIlczogaWUgY291bnQgYm90Y2ggKHBhaXJ3aXNlKSwgIgotCQkJCSAgImNvdW50ICV1IGxlZnQgJXUiLCBfX2Z1bmNfXywKLQkJCQkgIGNvdW50LCBsZWZ0KSk7CisJCQkJICIlczogaWUgY291bnQgYm90Y2ggKHBhaXJ3aXNlKSwgY291bnQgJXUgbGVmdCAldVxuIiwKKwkJCQkgX19mdW5jX18sIGNvdW50LCBsZWZ0KTsKIAkJCXJldHVybiBfRkFJTDsKIAkJfQogCkBAIC01MDEsNyArNTAwLDcgQEAKIAkJfQogCX0gZWxzZSBpZiAobGVmdCA9PSAxKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogaWUgdG9vIHNob3J0IChmb3Iga2V5IG1nbXQpIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6IGllIHRvbyBzaG9ydCAoZm9yIGtleSBtZ210KVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCkBAIC01MTAsOCArNTA5LDggQEAKIAkJCXBvcyArPSAyOwogCQkJaWYgKCFtZW1jbXAocG9zLCBSVFdfV1BBX09VSTIzQV9UWVBFLCA0KSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCIlcyA6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwKLQkJCQkJICBfX2Z1bmNfXykpOworCQkJCQkgIiVzIDogdGhlcmUgaGFzIDgwMi4xeCBhdXRoXG4iLAorCQkJCQkgX19mdW5jX18pOwogCQkJCSppc184MDIxeCA9IDE7CiAJCQl9CiAJCX0KQEAgLTU0OSw4ICs1NDgsOCBAQAogCQlsZWZ0IC09IFJTTl9TRUxFQ1RPUl9MRU47CiAJfSBlbHNlIGlmIChsZWZ0ID4gMCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IGllIGxlbmd0aCBtaXNtYXRjaCwgJXUgdG9vIG11Y2giLAotCQkJICBfX2Z1bmNfXywgbGVmdCkpOworCQkJICIlczogaWUgbGVuZ3RoIG1pc21hdGNoLCAldSB0b28gbXVjaFxuIiwKKwkJCSBfX2Z1bmNfXywgbGVmdCk7CiAJCXJldHVybiBfRkFJTDsKIAl9CiAKQEAgLTU2Myw5ICs1NjIsOCBAQAogCiAJCWlmIChjb3VudCA9PSAwIHx8IGxlZnQgPCBjb3VudCAqIFJTTl9TRUxFQ1RPUl9MRU4pIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiJXM6IGllIGNvdW50IGJvdGNoIChwYWlyd2lzZSksICIKLQkJCQkgICJjb3VudCAldSBsZWZ0ICV1IiwKLQkJCQkgIF9fZnVuY19fLCBjb3VudCwgbGVmdCkpOworCQkJCSAiJXM6IGllIGNvdW50IGJvdGNoIChwYWlyd2lzZSksIGNvdW50ICV1IGxlZnQgJXVcbiIsCisJCQkJIF9fZnVuY19fLCBjb3VudCwgbGVmdCk7CiAJCQlyZXR1cm4gX0ZBSUw7CiAJCX0KIApAQCAtNTc3LDcgKzU3NSw3IEBACiAJCX0KIAl9IGVsc2UgaWYgKGxlZnQgPT0gMSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IGllIHRvbyBzaG9ydCAoZm9yIGtleSBtZ210KSIsICBfX2Z1bmNfXykpOworCQkJICIlczogaWUgdG9vIHNob3J0IChmb3Iga2V5IG1nbXQpXG4iLCAgX19mdW5jX18pOwogCiAJCXJldHVybiBfRkFJTDsKIAl9CkBAIC01ODcsOCArNTg1LDggQEAKIAkJCXBvcyArPSAyOwogCQkJaWYgKCFtZW1jbXAocG9zLCBTVUlURV8xWCwgNCkpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiJXMgKCk6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwKLQkJCQkJICBfX2Z1bmNfXykpOworCQkJCQkgIiVzICgpOiB0aGVyZSBoYXMgODAyLjF4IGF1dGhcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJKmlzXzgwMjF4ID0gMTsKIAkJCX0KIAkJfQpAQCAtNzAwLDcgKzY5OCw3IEBACiAKIAlpZiAocGJ1ZiAmJiBwYnVmWzFdID4gMCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCSAoInJ0d19nZXRfY2lwaGVyX2luZm86IHdwYV9pZWxlbjogJWQiLCBwYnVmWzFdKSk7CisJCQkgInJ0d19nZXRfY2lwaGVyX2luZm86IHdwYV9pZWxlbjogJWRcbiIsIHBidWZbMV0pOwogCQlyID0gcnR3X3BhcnNlX3dwYV9pZTIzYShwYnVmLCBwYnVmWzFdICsgMiwgJmdyb3VwX2NpcGhlciwKIAkJCQkgICAgICZwYWlyd2lzZV9jaXBoZXIsICZpczgwMjF4KTsKIAkJaWYgKHIgPT0gX1NVQ0NFU1MpIHsKQEAgLTcwOCwxMCArNzA2LDkgQEAKIAkJCXBuZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlcjsKIAkJCXBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4ID0gaXM4MDIxeDsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIiVzOiBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwgaXNfIgotCQkJCSAgIjgwMjF4IGlzICVkIiwgX19mdW5jX18sCi0JCQkJICBwbmV0d29yay0+QmNuSW5mby5wYWlyd2lzZV9jaXBoZXIsCi0JCQkJICBwbmV0d29yay0+QmNuSW5mby5pc184MDIxeCkpOworCQkJCSAiJXM6IHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCBpc184MDIxeCBpcyAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciwKKwkJCQkgcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXgpOwogCQkJcmV0ID0gX1NVQ0NFU1M7CiAJCX0KIAl9IGVsc2UgewpAQCAtNzE5LDI0ICs3MTYsMjMgQEAKIAogCQlpZiAocGJ1ZiAmJiBwYnVmWzFdID4gMCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiZ2V0IFJTTiBJRVxuIikpOworCQkJCSAiZ2V0IFJTTiBJRVxuIik7CiAJCQlyID0gcnR3X3BhcnNlX3dwYTJfaWUyM2EocGJ1ZiwgcGJ1ZlsxXSArIDIsCiAJCQkJCSAgICAgICZncm91cF9jaXBoZXIsICZwYWlyd2lzZV9jaXBoZXIsCiAJCQkJCSAgICAgICZpczgwMjF4KTsKIAkJCWlmIChyID09IF9TVUNDRVNTKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoImdldCBSU04gSUUgIE9LISEhXG4iKSk7CisJCQkJCSAiZ2V0IFJTTiBJRSAgT0shISFcbiIpOwogCQkJCXBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciA9CiAJCQkJCXBhaXJ3aXNlX2NpcGhlcjsKIAkJCQlwbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7CiAJCQkJcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXggPSBpczgwMjF4OwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCIlczogcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQsIgotCQkJCQkgICJwbmV0d29yay0+Z3JvdXBfY2lwaGVyIGlzICVkLCAiCi0JCQkJCSAgImlzXzgwMjF4IGlzICVkIiwgX19mdW5jX18sCi0JCQkJCSAgcG5ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyLAotCQkJCQkgIHBuZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlciwKLQkJCQkJICBwbmV0d29yay0+QmNuSW5mby5pc184MDIxeCkpOworCQkJCQkgIiVzOiBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCxwbmV0d29yay0+Z3JvdXBfY2lwaGVyIGlzICVkLCBpc184MDIxeCBpcyAlZFxuIiwKKwkJCQkJIF9fZnVuY19fLAorCQkJCQkgcG5ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyLAorCQkJCQkgcG5ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyLAorCQkJCQkgcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXgpOwogCQkJCXJldCA9IF9TVUNDRVNTOwogCQkJfQogCQl9CkBAIC03NTksNyArNzU1LDcgQEAKIAkJcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sID0gRU5DUllQX1BST1RPQ09MX09QRU5TWVM7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6IHNzaWQgPSVzXG4iLCBfX2Z1bmNfXywgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkKSk7CisJCSAiJXM6IHNzaWQgPSVzXG4iLCBfX2Z1bmNfXywgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkKTsKIAogCXBpZSA9IHBuZXR3b3JrLT5uZXR3b3JrLklFczsKIAlwaWVfbGVuID0gcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGg7CkBAIC03NzYsMTEgKzc3MiwxMSBAQAogCQkJcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sID0gRU5DUllQX1BST1RPQ09MX1dFUDsKIAl9CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOiBwbmV0d29yay0+ZW5jcnlwX3Byb3RvY29sIGlzICV4XG4iLCBfX2Z1bmNfXywKLQkJICBwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wpKTsKKwkJICIlczogcG5ldHdvcmstPmVuY3J5cF9wcm90b2NvbCBpcyAleFxuIiwgX19mdW5jX18sCisJCSBwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wpOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlczogcG5ldHdvcmstPmVuY3J5cF9wcm90b2NvbCBpcyAleFxuIiwgX19mdW5jX18sCi0JCSAgcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sKSk7CisJCSAiJXM6IHBuZXR3b3JrLT5lbmNyeXBfcHJvdG9jb2wgaXMgJXhcbiIsIF9fZnVuY19fLAorCQkgcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sKTsKIAlydHdfZ2V0X2NpcGhlcl9pbmZvKHBuZXR3b3JrKTsKIAogCS8qIGdldCBid21vZGUgYW5kIGNoX29mZnNldCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYwppbmRleCA3Mjk5ZWYwLi4zYzA5ZWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYwpAQCAtOTQsNyArOTQsNyBAQAogdm9pZCBydHdfZnJlZV9tbG1lX3ByaXYyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQogewogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAoInJ0d19mcmVlX21sbWVfcHJpdjIzYVxuIikpOworCQkgInJ0d19mcmVlX21sbWVfcHJpdjIzYVxuIik7CiAKIAlydHcyM2FfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShwbWxtZXByaXYpOwogfQpAQCAtMTk2LDkgKzE5Niw4IEBACiAJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAogCSAgICAhY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCSAoInJ0d19pZl91cDIzYTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkiLCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkgIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSk7CisJCQkgInJ0d19pZl91cDIzYTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCisJCQkgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCk7CiAJCXJlcyA9IGZhbHNlOwogCX0gZWxzZQogCQlyZXMgPSAgdHJ1ZTsKQEAgLTIzOCw5ICsyMzcsOSBAQAogCQlwbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwogCiAJaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkgewotCQlEQkdfODcyM0EoInJvYW1pbmcgZnJvbSAlcygiTUFDX0ZNVCIpLCBsZW5ndGg6JWRcbiIsCisJCURCR184NzIzQSgicm9hbWluZyBmcm9tICVzKCVwTSksIGxlbmd0aDolZFxuIiwKIAkJCSAgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICBNQUNfQVJHKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpLAorCQkJICBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAogCQkJICBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKTsKIAkJbWVtY3B5KCZwbWxtZXByaXYtPmFzc29jX3NzaWQsICZwbmV0d29yay0+bmV0d29yay5Tc2lkLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7CkBAIC00NjYsNyArNDY1LDcgQEAKIAkJaWYgKCFwbmV0d29yaykgewogCQkJaWYgKCFvbGRlc3QpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJcblxuXG5zb21ldGhpbmcgd3JvbmcgaGVyZVxuXG5cbiIpKTsKKwkJCQkJICJzb21ldGhpbmcgd3JvbmcgaGVyZVxuIik7CiAJCQkJZ290byBleGl0OwogCQkJfQogCQkJcG5ldHdvcmsgPSBvbGRlc3Q7CkBAIC01NjgsMTMgKzU2Nyw2IEBACiAJcmV0dXJuIGJzZWxlY3RlZDsKIH0KIAotLyogVE9ETzogUGVycnkgOiBGb3IgUG93ZXIgTWFuYWdlbWVudCAqLwotdm9pZCBydHdfYXRpbWRvbmVfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgKCJyZWNlaXZlIGF0aW1kb25lX2V2ZXRcbiIpKTsKLX0KLQogdm9pZCBydHdfc3VydmV5X2V2ZW50X2NiMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpCiB7CiAJdTMyIGxlbjsKQEAgLTU4NSwxMyArNTc3LDEyIEBACiAJcG5ldHdvcmsgPSBzdXJ2ZXktPmJzczsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfc3VydmV5X2V2ZW50X2NiMjNhLCBzc2lkPSVzXG4iLCBwbmV0d29yay0+U3NpZC5zc2lkKSk7CisJCSAicnR3X3N1cnZleV9ldmVudF9jYjIzYSwgc3NpZD0lc1xuIiwgcG5ldHdvcmstPlNzaWQuc3NpZCk7CiAKIAlsZW4gPSBnZXRfd2xhbl9ic3NpZF9leF9zeihwbmV0d29yayk7CiAJaWYgKGxlbiA+IChzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gKioqKnJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2E6IHJldHVybiBhIHdyb25nICIKLQkJCSAgImJzcyAqKipcbiIpKTsKKwkJCSAiKioqKnJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2E6IHJldHVybiBhIHdyb25nIGJzcyAqKipcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC01OTksOCArNTkwLDYgQEAKIAogCS8qICB1cGRhdGUgSUJTU19uZXR3b3JrICdzIHRpbWVzdGFtcCAqLwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCS8qIFJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAgICJydHdfc3VydmV5X2V2ZW50X2NiMjNhIDogV0lGSV9BREhPQ19NQVNURVJfU1RBVEVcblxuIik7ICovCiAJCWlmIChldGhlcl9hZGRyX2VxdWFsKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzLAogCQkJCSAgICAgcG5ldHdvcmstPk1hY0FkZHJlc3MpKSB7CiAJCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICppYnNzX3dsYW47CkBAIC02NjAsOCArNjQ5LDggQEAKIAl9CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgicnR3X3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2syM2E6IGZ3X3N0YXRlOiV4XG5cbiIsCi0JCSAgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOworCQkgInJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhOiBmd19zdGF0ZToleFxuIiwKKwkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewogCQlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyKTsKQEAgLTY2OSw4ICs2NTgsOCBAQAogCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIm5pYyBzdGF0dXMgPSV4LCBzdXJ2ZXkgZG9uZSBldmVudCBjb21lcyB0b28gbGF0ZSFcbiIsCi0JCQkgIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKKwkJCSAibmljIHN0YXR1cyA9JXgsIHN1cnZleSBkb25lIGV2ZW50IGNvbWVzIHRvbyBsYXRlIVxuIiwKKwkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKIAl9CiAKIAlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKCZhZGFwdGVyLT5yZWN2cHJpdik7CkBAIC03MjUsNyArNzE0LDcgQEAKIAlzdHJ1Y3QgcnR3X3F1ZXVlICpzY2FuX3F1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkLCAqcHRlbXA7CiAKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLCAoIitmcmVlX3NjYW5xdWV1ZVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sICIrZnJlZV9zY2FucXVldWVcbiIpOwogCXNwaW5fbG9ja19iaCgmc2Nhbl9xdWV1ZS0+bG9jayk7CiAKIAlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbl9xdWV1ZSk7CkBAIC03NTIsMTEgKzc0MSwxMSBAQAogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAoIitydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2FcbiIpKTsKKwkJICIrcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhXG4iKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgidGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcz0iTUFDX0ZNVCIgc3NpZD0lc1xuIiwKLQkJICBNQUNfQVJHKHRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpLAotCQkgIHRndF9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCkpOworCQkgInRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3M9JXBNIHNzaWQ9JXNcbiIsCisJCSB0Z3RfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAorCQkgdGd0X25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkKTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFfFdJRklfQVBfU1RBVEUpKSB7CiAJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJmFkYXB0ZXItPnN0YXByaXYsCkBAIC03ODgsNyArNzc3LDcgQEAKIAkJcHdsYW4tPmZpeGVkID0gZmFsc2U7CiAJZWxzZQogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhIDogcHdsYW49PSBOVUxMXG4iKSk7CisJCQkgInJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYSA6IHB3bGFuPT0gTlVMTFxuIik7CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSAmJgogCSAgICBhZGFwdGVyLT5zdGFwcml2LmFzb2Nfc3RhX2NvdW50ID09IDEpCkBAIC04MDgsNyArNzk3LDcgQEAKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICgiK3J0d19pbmRpY2F0ZV9jb25uZWN0MjNhXG4iKSk7CisJCSAiK3J0d19pbmRpY2F0ZV9jb25uZWN0MjNhXG4iKTsKIAogCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwogCkBAIC04MjgsOCArODE3LDggQEAKIAlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgKCItcnR3X2luZGljYXRlX2Nvbm5lY3QyM2E6IGZ3X3N0YXRlPTB4JTA4eFxuIiwKLQkJICBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CisJCSAiLXJ0d19pbmRpY2F0ZV9jb25uZWN0MjNhOiBmd19zdGF0ZT0weCUwOHhcbiIsCisJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKIH0KIAogLyoKQEAgLTg0MCw3ICs4MjksNyBAQAogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgKCIrcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2FcbiIpKTsKKwkJICIrcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2FcbiIpOwogCiAJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HfFdJRklfVU5ERVJfV1BTKTsKIApAQCAtOTk4LDggKzk4Nyw5IEBACiAJREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAoIlxuZndfc3RhdGU6JXgsIEJTU0lEOiJNQUNfRk1UIlxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSwKLQkJICBNQUNfQVJHKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKSk7CisJCSAiZndfc3RhdGU6JXgsIEJTU0lEOiVwTVxuIiwKKwkJIGdldF9md3N0YXRlKHBtbG1lcHJpdiksCisJCSBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKIAogCS8qICB3aHkgbm90IHVzZSBwdGFyZ2V0X3dsYW4/PyAqLwogCW1lbWNweSgmY3VyX25ldHdvcmstPm5ldHdvcmssICZwbmV0d29yay0+bmV0d29yaywKQEAgLTEwNDIsNyArMTAzMiw3IEBACiAJZGVmYXVsdDoKIAkJcG1sbWVwcml2LT5md19zdGF0ZSA9IFdJRklfTlVMTF9TVEFURTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIkludmFsaWQgbmV0d29ya19tb2RlXG4iKSk7CisJCQkgIkludmFsaWQgbmV0d29ya19tb2RlXG4iKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMDc3LDE2ICsxMDY3LDE2IEBACiAJYm9vbCB0aGVfc2FtZV9tYWNhZGRyOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAoImpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrIHJlY2VpdmVkIHdpdGggcmVzPSVkXG4iLAotCQkgIHBuZXR3b3JrLT5qb2luX3JlcykpOworCQkgImpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrIHJlY2VpdmVkIHdpdGggcmVzPSVkXG4iLAorCQkgcG5ldHdvcmstPmpvaW5fcmVzKTsKIAogCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiQEBAQEAgICBqb2luYnNzIGV2ZW50IGNhbGwgYmFjayAgZm9yIEFueSBTU2lkXG4iKSk7CisJCQkgIkBAQEBAICAgam9pbmJzcyBldmVudCBjYWxsIGJhY2sgIGZvciBBbnkgU1NpZFxuIik7CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIkBAQEBAICAgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgZm9yIFNTaWQ6JXNcbiIsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkKSk7CisJCQkgIkBAQEBAICAgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgZm9yIFNTaWQ6JXNcbiIsCisJCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwogCX0KIAogCWlmIChldGhlcl9hZGRyX2VxdWFsKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCkBAIC0xMDk4LDE1ICsxMDg4LDE0IEBACiAJcG5ldHdvcmstPm5ldHdvcmsuTGVuZ3RoID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3ooJnBuZXR3b3JrLT5uZXR3b3JrKTsKIAlpZiAocG5ldHdvcmstPm5ldHdvcmsuTGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiXG5cbiAqKipqb2luYnNzX2V2dF9jYWxsYmFjayByZXR1cm4gYSB3cm9uZyBic3MgIgotCQkJICAiKioqXG5cbiIpKTsKKwkJCSAiKioqam9pbmJzc19ldnRfY2FsbGJhY2sgcmV0dXJuIGEgd3JvbmcgYnNzICoqKlxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgiXG4gcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgISEgX2VudGVyX2NyaXRpY2FsXG4iKSk7CisJCSAicnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgISEgX2VudGVyX2NyaXRpY2FsXG4iKTsKIAogCWlmIChwbmV0d29yay0+am9pbl9yZXMgPiAwKSB7CiAJCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwpAQCAtMTE1NSw4ICsxMTQ0LDcgQEAKIAkJCQkJCQkgICAgICBwbmV0d29yayk7CiAJCQllbHNlIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJDYW4ndCBmaW5kIHB0YXJnZXRfd2xhbiB3aGVuICIKLQkJCQkJICAiam9pbmJzc19ldmVudCBjYWxsYmFja1xuIikpOworCQkJCQkgIkNhbid0IGZpbmQgcHRhcmdldF93bGFuIHdoZW4gam9pbmJzc19ldmVudCBjYWxsYmFja1xuIik7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKIAkJCQlnb3RvIGlnbm9yZV9qb2luYnNzX2NhbGxiYWNrOwogCQkJfQpAQCAtMTE2OSw4ICsxMTU3LDcgQEAKIAkJCQlpZiAoIXB0YXJnZXRfc3RhKSB7CiAJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLAogCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAoIkNhbid0IHVwZGF0ZSBzdGFpbmZvIHdoZW4gIgotCQkJCQkJICAiam9pbmJzc19ldmVudCBjYWxsYmFja1xuIikpOworCQkJCQkJICJDYW4ndCB1cGRhdGUgc3RhaW5mbyB3aGVuIGpvaW5ic3NfZXZlbnQgY2FsbGJhY2tcbiIpOwogCQkJCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwogCQkJCQlnb3RvIGlnbm9yZV9qb2luYnNzX2NhbGxiYWNrOwogCQkJCX0KQEAgLTExODMsMTkgKzExNzAsMTkgQEAKIAkJCQkvKiBhZGhvYyBtb2RlIHdpbGwgcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EKIAkJCQkgICB3aGVuIHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhICovCiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoImFkaG9jIG1vZGUsIGZ3X3N0YXRlOiV4IiwKLQkJCQkJICBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CisJCQkJCSAiYWRob2MgbW9kZSwgZndfc3RhdGU6JXhcbiIsCisJCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKIAkJCX0KIAogCQkJLyogczUuIENhbmNsZSBhc3NvY190aW1lciAqLwogCQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIpOwogCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJDYW5jbGUgYXNzb2NfdGltZXJcbiIpKTsKKwkJCQkgIkNhbmNsZSBhc3NvY190aW1lclxuIik7CiAJCX0gZWxzZSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAoInJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiIGVycjogZndfc3RhdGU6JXgiLAotCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CisJCQkJICJydHcyM2Ffam9pbmJzc19ldmVudF9jYiBlcnI6IGZ3X3N0YXRlOiV4XG4iLAorCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CiAJCQlnb3RvIGlnbm9yZV9qb2luYnNzX2NhbGxiYWNrOwogCQl9CkBAIC0xMjA5LDggKzExOTYsOCBAQAogCiAJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAoImZhaWwhIGNsZWFyIF9GV19VTkRFUl9MSU5LSU5HIF5eXmZ3X3N0YXRlPSIKLQkJCQkgICIleFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOworCQkJCSAiZmFpbCEgY2xlYXIgX0ZXX1VOREVSX0xJTktJTkcgXl5eZndfc3RhdGU9JXhcbiIsCisJCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMjYxLDggKzEyNDgsNyBAQAogCWlmIChwc3RhICE9IE5VTEwpIHsKIAkJLyogdGhlIHN0YSBoYXZlIGJlZW4gaW4gc3RhX2luZm9fcXVldWUgPT4gZG8gbm90aGluZyAqLwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiRXJyb3I6IHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhOiBzdGEgaGFzICIKLQkJCSAgImJlZW4gaW4gc3RhX2hhc2hfcXVldWVcbiIpKTsKKwkJCSAiRXJyb3I6IHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhOiBzdGEgaGFzIGJlZW4gaW4gc3RhX2hhc2hfcXVldWVcbiIpOwogCQkvKiBiZXR3ZWVuIGRydiBoYXMgcmVjZWl2ZWQgdGhpcyBldmVudCBiZWZvcmUgYW5kCiAJCSAgIGZ3IGhhdmUgbm90IHlldCB0byBzZXQga2V5IHRvIENBTV9FTlRSWSkgKi8KIAkJcmV0dXJuOwpAQCAtMTI3Miw4ICsxMjU4LDcgQEAKIAkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwc3RhKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJDYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuICIKLQkJCSAgInJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhXG4iKSk7CisJCQkgIkNhbid0IGFsbG9jIHN0YV9pbmZvIHdoZW4gcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2FcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMzMwLDggKzEzMTUsNyBAQAogCWVsc2UKIAkJbWFjX2lkID0gcHN0YWRlbC0+bWFjX2lkOwogCi0JREJHXzg3MjNBKCIlcyhtYWNfaWQ9JWQpPSIgTUFDX0ZNVCAiXG4iLCBfX2Z1bmNfXywgbWFjX2lkLAotCQkgIE1BQ19BUkcocHN0YWRlbC0+bWFjYWRkcikpOworCURCR184NzIzQSgiJXMobWFjX2lkPSVkKT0lcE1cbiIsIF9fZnVuY19fLCBtYWNfaWQsIHBzdGFkZWwtPm1hY2FkZHIpOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKIAkJcmV0dXJuOwpAQCAtMTU4MiwxMyArMTU2NiwxMiBAQAogCX0KIAogCWlmICh1cGRhdGVkKSB7Ci0JCURCR184NzIzQSgiW2J5X2Jzc2lkOiV1XVthc3NvY19zc2lkOiVzXVt0b19yb2FtaW5nOiV1XSAiCi0JCQkgICJuZXcgY2FuZGlkYXRlOiAlcygiTUFDX0ZNVCIpIHJzc2k6JWRcbiIsCisJCURCR184NzIzQSgiW2J5X2Jzc2lkOiV1XVthc3NvY19zc2lkOiVzXVt0b19yb2FtaW5nOiV1XSBuZXcgY2FuZGlkYXRlOiAlcyglcE0pIHJzc2k6JWRcbiIsCiAJCQkgIHBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQsCiAJCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkLAogCQkJICBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nLAogCQkJICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICBNQUNfQVJHKCgqY2FuZGlkYXRlKS0+bmV0d29yay5NYWNBZGRyZXNzKSwKKwkJCSAgKCpjYW5kaWRhdGUpLT5uZXR3b3JrLk1hY0FkZHJlc3MsCiAJCQkgIChpbnQpKCpjYW5kaWRhdGUpLT5uZXR3b3JrLlJzc2kpOwogCX0KIApAQCAtMTY1Myw4ICsxNjM2LDggQEAKIAkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwogCQlpZiAoIXBuZXR3b3JrKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAoIiVzOiByZXR1cm4gX0ZBSUw6KHBuZXR3b3JrID09IE5VTEwpXG4iLAotCQkJCSAgX19mdW5jX18pKTsKKwkJCQkgIiVzOiByZXR1cm4gX0ZBSUw6KHBuZXR3b3JrID09IE5VTEwpXG4iLAorCQkJCSBfX2Z1bmNfXyk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIApAQCAtMTY4MCw3ICsxNjYzLDcgQEAKIAlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgKCJzd2l0Y2hpbmcgdG8gYWRob2MgbWFzdGVyXG4iKSk7CisJCSAic3dpdGNoaW5nIHRvIGFkaG9jIG1hc3RlclxuIik7CiAKIAltZW1jcHkoJnBkZXZfbmV0d29yay0+U3NpZCwgJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7CkBAIC0xNjkzLDcgKzE2NzYsNyBAQAogCXJldCA9IHJ0d19jcmVhdGVic3NfY21kMjNhKGFkYXB0ZXIpOwogCWlmIChyZXQgIT0gX1NVQ0NFU1MpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIkVycm9yID0+cnR3X2NyZWF0ZWJzc19jbWQyM2Egc3RhdHVzIEZBSUxcbiIpKTsKKwkJCSAiRXJyb3IgPT5ydHdfY3JlYXRlYnNzX2NtZDIzYSBzdGF0dXMgRkFJTFxuIik7CiAJfSBlbHNlICB7CiAJCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwogCX0KQEAgLTE3MzksOSArMTcyMiwxMCBAQAogCQlyZXQgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXM6IGNhbmRpZGF0ZTogJXMoIk1BQ19GTVQiLCBjaDoldSlcbiIsIF9fZnVuY19fLAorCQlEQkdfODcyM0EoIiVzOiBjYW5kaWRhdGU6ICVzKCVwTSwgY2g6JXUpXG4iLAorCQkJICBfX2Z1bmNfXywKIAkJCSAgY2FuZGlkYXRlLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgTUFDX0FSRyhjYW5kaWRhdGUtPm5ldHdvcmsuTWFjQWRkcmVzcyksCisJCQkgIGNhbmRpZGF0ZS0+bmV0d29yay5NYWNBZGRyZXNzLAogCQkJICBjYW5kaWRhdGUtPm5ldHdvcmsuRFNDb25maWcpOwogCX0KIApAQCAtMTc4MSw4ICsxNzY1LDggQEAKIAlwY21kLT5yc3BzeiA9IDA7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgKCJhZnRlciBlbnF1ZXVlIHNldF9hdXRoX2NtZCwgYXV0aF9tb2RlPSV4XG4iLAotCQkgIHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0pKTsKKwkJICJhZnRlciBlbnF1ZXVlIHNldF9hdXRoX2NtZCwgYXV0aF9tb2RlPSV4XG4iLAorCQkgcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSk7CiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwogCkBAIC0xODIyLDE1ICsxODA2LDEzIEBACiAJCXBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodW5zaWduZWQgY2hhcikKIAkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5OwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gcnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAiCi0JCQkgICIodW5zaWduZWQgY2hhcilwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSAiCi0JCQkgICI9JWRcbiIsIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0pKTsKKwkJCSAicnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodW5zaWduZWQgY2hhcilwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9JWRcbiIsCisJCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSk7CiAJfSBlbHNlIHsKIAkJcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gcnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodTgpIgotCQkJICAicHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9JWRcbiIsCi0JCQkgIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0pKTsKKwkJCSAicnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodTgpcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9JWRcbiIsCisJCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSk7CiAJfQogCXBzZXRrZXlwYXJtLT5rZXlpZCA9IGtleWlkOy8qIDB+MyAqLwogCXBzZXRrZXlwYXJtLT5zZXRfdHggPSBzZXRfdHg7CkBAIC0xODQxLDggKzE4MjMsOCBAQAogCQkgIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0sIHBzZXRrZXlwYXJtLT5rZXlpZCwKIAkJICBwbWxtZXByaXYtPmtleV9tYXNrKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgKCJcbiBydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9JWQgcHNldGtleXBhcm0tPiIKLQkJICAia2V5aWQgPSAodTgpa2V5aWQgPSVkXG4iLCBwc2V0a2V5cGFybS0+YWxnb3JpdGhtLCBrZXlpZCkpOworCQkgInJ0d19zZXRfa2V5MjNhOiBwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0lZCBwc2V0a2V5cGFybS0+a2V5aWQgPSAodTgpa2V5aWQgPSVkXG4iLAorCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSwga2V5aWQpOwogCiAJc3dpdGNoIChwc2V0a2V5cGFybS0+YWxnb3JpdGhtKSB7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKQEAgLTE4NjksOSArMTg1MSw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiBydHdfc2V0X2tleTIzYTpwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtIgotCQkJICAiID0gJXggKG11c3QgYmUgMSBvciAyIG9yIDQgb3IgNSlcbiIsCi0JCQkgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0pKTsKKwkJCSAicnR3X3NldF9rZXkyM2E6cHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9ICV4IChtdXN0IGJlIDEgb3IgMiBvciA0IG9yIDUpXG4iLAorCQkJIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0pOwogCQlyZXMgPSBfRkFJTDsKIAkJa2ZyZWUocGNtZCk7CiAJCWtmcmVlKHBzZXRrZXlwYXJtKTsKQEAgLTE5OTgsOCArMTk3OSw4IEBACiAJdWludCBuZGlzc2VjdXJpdHl0eXBlID0gcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXM7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCIrcnR3X3Jlc3RydWN0X3NlY19pZTIzYTogbmRpc2F1dGhtb2RlPSVkICIKLQkJICAibmRpc3NlY3VyaXR5dHlwZT0lZFxuIiwgbmRpc2F1dGhtb2RlLCBuZGlzc2VjdXJpdHl0eXBlKSk7CisJCSAiK3J0d19yZXN0cnVjdF9zZWNfaWUyM2E6IG5kaXNhdXRobW9kZT0lZCBuZGlzc2VjdXJpdHl0eXBlPSVkXG4iLAorCQkgbmRpc2F1dGhtb2RlLCBuZGlzc2VjdXJpdHl0eXBlKTsKIAogCWllbGVuZ3RoID0gMDsKIAlpZiAobmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fApAQCAtMjA2NSw4ICsyMDQ2LDggQEAKIAogCXBkZXZfbmV0d29yay0+RFNDb25maWcgPSBwcmVnaXN0cnlwcml2LT5jaGFubmVsOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJwcmVnaXN0cnlwcml2LT5jaGFubmVsID0lZCwgcGRldl9uZXR3b3JrLT5EU0NvbmZpZyA9IDB4JXhcbiIsCi0JCSAgcHJlZ2lzdHJ5cHJpdi0+Y2hhbm5lbCwgcGRldl9uZXR3b3JrLT5EU0NvbmZpZykpOworCQkgInByZWdpc3RyeXByaXYtPmNoYW5uZWwgPSVkLCBwZGV2X25ldHdvcmstPkRTQ29uZmlnID0gMHgleFxuIiwKKwkJIHByZWdpc3RyeXByaXYtPmNoYW5uZWwsIHBkZXZfbmV0d29yay0+RFNDb25maWcpOwogCiAJaWYgKGN1cl9uZXR3b3JrLT5uZXR3b3JrLmlmbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJcGRldl9uZXR3b3JrLT5BVElNV2luZG93ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZV9leHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZV9leHQuYwppbmRleCAwZTBmNzNjLi4xOTZiZWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWVfZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19tbG1lX2V4dC5jCkBAIC02NTcsOCArNjU3LDggQEAKIAogCWlmIChpbmRleCA+IDEzKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJDdXJyZW50bHkgd2UgZG8gbm90IHN1cHBvcnQgcmVzZXJ2ZWQgc3ViLWZyLXR5cGUgPSIKLQkJCSAgIiVkXG4iLCBpbmRleCkpOworCQkJICJDdXJyZW50bHkgd2UgZG8gbm90IHN1cHBvcnQgcmVzZXJ2ZWQgc3ViLWZyLXR5cGUgPSVkXG4iLAorCQkJIGluZGV4KTsKIAkJcmV0dXJuOwogCX0KIAlwdGFibGUgKz0gaW5kZXg7CkBAIC05NjgsOCArOTY4LDcgQEAKIAlwc3RhdCA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc2EpOwogCWlmICghcHN0YXQpIHsKIAkJLyogIGFsbG9jYXRlIGEgbmV3IG9uZSAqLwotCQlEQkdfODcyM0EoImdvaW5nIHRvIGFsbG9jIHN0YWluZm8gZm9yIHNhID0iTUFDX0ZNVCJcbiIsCi0JCQkgIE1BQ19BUkcoc2EpKTsKKwkJREJHXzg3MjNBKCJnb2luZyB0byBhbGxvYyBzdGFpbmZvIGZvciBzYSA9JXBNXG4iLCBzYSk7CiAJCXBzdGF0ID0gcnR3X2FsbG9jX3N0YWluZm8yM2EocHN0YXByaXYsIHNhLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFwc3RhdCkgewogCQkJREJHXzg3MjNBKCIgRXhjZWVkIHRoZSB1cHBlciBsaW1pdCBvZiBzdXBwb3J0ZWQgIgpAQCAtMTM5Niw4ICsxMzk1LDggQEAKIAkvKiBub3cgcGFyc2UgYWxsIGllZWU4MDJfMTEgaWUgdG8gcG9pbnQgdG8gZWxlbXMgKi8KIAogCWlmIChydHdfdmFsaWRhdGVfZnJhbWVfaWVzKHBvcywgbGVmdCkpIHsKLQkJREJHXzg3MjNBKCJTVEEgIiBNQUNfRk1UICIgc2VudCBpbnZhbGlkIGFzc29jaWF0aW9uIHJlcXVlc3RcbiIsCi0JCQkgIE1BQ19BUkcocHN0YXQtPmh3YWRkcikpOworCQlEQkdfODcyM0EoIlNUQSAlcE0gc2VudCBpbnZhbGlkIGFzc29jaWF0aW9uIHJlcXVlc3RcbiIsCisJCQkgIHBzdGF0LT5od2FkZHIpOwogCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwogCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwogCX0KQEAgLTE0MDcsOCArMTQwNiw4IEBACiAJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1NJRCwgcG9zLCBsZWZ0KTsKIAlpZiAoIXAgfHwgcFsxXSA9PSAwKSB7CiAJCS8qICBicm9hZGNhc3Qgc3NpZCwgaG93ZXZlciBpdCBpcyBub3QgYWxsb3dlZCBpbiBhc3NvY3JlcSAqLwotCQlEQkdfODcyM0EoIlNUQSAiIE1BQ19GTVQgIiBzZW50IGludmFsaWQgYXNzb2NpYXRpb24gcmVxdWVzdCAiCi0JCQkgICJsYWNraW5nIGFuIFNTSURcbiIsIE1BQ19BUkcocHN0YXQtPmh3YWRkcikpOworCQlEQkdfODcyM0EoIlNUQSAlcE0gc2VudCBpbnZhbGlkIGFzc29jaWF0aW9uIHJlcXVlc3QgbGFja2luZyBhbiBTU0lEXG4iLAorCQkJICBwc3RhdC0+aHdhZGRyKTsKIAkJc3RhdHVzID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKIAkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKIAl9IGVsc2UgewpAQCAtMTUzNyw5ICsxNTM2LDggQEAKIAkJaW50IGNvcHlfbGVuOwogCiAJCWlmIChwc2VjdXJpdHlwcml2LT53cGFfcHNrID09IDApIHsKLQkJCURCR184NzIzQSgiU1RBICIgTUFDX0ZNVCAiOiBXUEEvUlNOIElFIGluIGFzc29jaWF0aW9uICIKLQkJCSJyZXF1ZXN0LCBidXQgQVAgZG9uJ3Qgc3VwcG9ydCBXUEEvUlNOXG4iLAotCQkJCSAgTUFDX0FSRyhwc3RhdC0+aHdhZGRyKSk7CisJCQlEQkdfODcyM0EoIlNUQSAlcE06IFdQQS9SU04gSUUgaW4gYXNzb2NpYXRpb24gcmVxdWVzdCwgYnV0IEFQIGRvbid0IHN1cHBvcnQgV1BBL1JTTlxuIiwKKwkJCQkgIHBzdGF0LT5od2FkZHIpOwogCiAJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19JTlZBTElEX0lFOwogCkBAIC0xNjE0LDggKzE2MTIsOCBAQAogCQkJCQllbHNlCiAJCQkJCQlwc3RhdC0+dWFwc2RfYmUgPSAwOwogCisJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlicmVhazsKIAkJCX0gZWxzZSB7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xNjQ1LDggKzE2NDMsOCBAQAogCWlmIChwc3RhdC0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCAmJgogCSAgICAocHN0YXQtPndwYTJfcGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQIHx8CiAJICAgICBwc3RhdC0+d3BhX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfVEtJUCkpIHsKLQkJREJHXzg3MjNBKCJIVDogIiBNQUNfRk1UICIgdHJpZWQgdG8gdXNlIFRLSVAgd2l0aCBIVCAiCi0JCQkgICJhc3NvY2lhdGlvblxuIiwgTUFDX0FSRyhwc3RhdC0+aHdhZGRyKSk7CisJCURCR184NzIzQSgiSFQ6ICVwTSB0cmllZCB0byB1c2UgVEtJUCB3aXRoIEhUIGFzc29jaWF0aW9uXG4iLAorCQkJICBwc3RhdC0+aHdhZGRyKTsKIAogCQkvKiBzdGF0dXMgPSBXTEFOX1NUQVRVU19DSVBIRVJfUkVKRUNURURfUEVSX1BPTElDWTsgKi8KIAkJLyogZ290byBPbkFzc29jUmVxMjNhRmFpbDsgKi8KQEAgLTI2ODcsNyArMjY4NSw3IEBACiAJdTggYmNfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICgiKyVzXG4iLCBfX2Z1bmNfXykpOworCQkgIislc1xuIiwgX19mdW5jX18pOwogCiAJcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwogCWlmICghcG1nbnRmcmFtZSkKQEAgLTI3NTgsNyArMjc1Niw3IEBACiAJcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICgiaXNzdWluZyBwcm9iZV9yZXEsIHR4X2xlbiA9JWRcbiIsIHBhdHRyaWItPmxhc3RfdHhjbWRzeikpOworCQkgImlzc3VpbmcgcHJvYmVfcmVxLCB0eF9sZW4gPSVkXG4iLCBwYXR0cmliLT5sYXN0X3R4Y21kc3opOwogCiAJaWYgKHdhaXRfYWNrKSB7CiAJCXJldCA9IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0X2FjazIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7CkBAIC0yODA2LDE3ICsyODA0LDE2IEBACiAKIAlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7CiAJCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAiTUFDX0ZNVCIsIGNoOiV1JXMsICVkLyVkICIKLQkJCQkgICJpbiAldSBtc1xuIiwJX19mdW5jX18sCi0JCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIE1BQ19BUkcoZGEpLCBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTPyIsIGFja2VkIjoiIiwgaSwgdHJ5X2NudCwKKwkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAorCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAorCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCisJCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKIAkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7CiAJCWVsc2UKIAkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCiAJCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCiAJCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTPyIsIGFja2VkIjoiIiwgaSwgdHJ5X2NudCwKKwkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAogCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKIAl9CiBleGl0OgpAQCAtMzQ2MCwxNyArMzQ1NywxNiBAQAogCiAJaWYgKHRyeV9jbnQgJiYgd2FpdF9tcykgewogCQlpZiAoZGEpCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gIk1BQ19GTVQiLCBjaDoldSVzLCAlZC8lZCAiCi0JCQkJICAiaW4gJXUgbXNcbiIsIF9fZnVuY19fLAotCQkJCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBNQUNfQVJHKGRhKSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUz8iLCBhY2tlZCI6IiIsIGksIHRyeV9jbnQsCisJCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gJXBNLCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKKwkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKKwkJCQkgIGRhLCBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAorCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCiAJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogCQllbHNlCiAJCQlEQkdfODcyM0EoIiVzKCVzKTosIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAogCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAogCQkJCSAgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUz8iLCBhY2tlZCI6IiIsIGksIHRyeV9jbnQsCisJCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKIAkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7CiAJfQogZXhpdDoKQEAgLTM1ODcsMTcgKzM1ODMsMTYgQEAKIAogCWlmICh0cnlfY250ICYmIHdhaXRfbXMpIHsKIAkJaWYgKGRhKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICJNQUNfRk1UIiwgY2g6JXUlcywgJWQvJWQgIgotCQkJCSAgImluICV1IG1zXG4iLCBfX2Z1bmNfXywKLQkJCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgTUFDX0FSRyhkYSksIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1M/IiwgYWNrZWQiOiIiLCBpLCB0cnlfY250LAorCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICVwTSwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCisJCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCisJCQkJICBkYSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKKwkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAogCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKIAkJZWxzZQogCQkJREJHXzg3MjNBKCIlcyglcyk6LCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKIAkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKIAkJCQkgIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1M/IiwgYWNrZWQiOiIiLCBpLCB0cnlfY250LAorCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCiAJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogCX0KIGV4aXQ6CkBAIC0zNjE1LDcgKzM2MTAsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwogCWludCByZXQgPSBfRkFJTDsKIAotCS8qIERCR184NzIzQSgiJXMgdG8gIk1BQ19GTVQiXG4iLCBfX2Z1bmNfXywgTUFDX0FSRyhkYSkpOyAqLworCS8qIERCR184NzIzQSgiJXMgdG8gJXBNXG4iLCBfX2Z1bmNfXywgZGEpOyAqLwogCiAJcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwogCWlmICghcG1nbnRmcmFtZSkKQEAgLTM2NjAsNyArMzY1NSw3IEBACiBpbnQgaXNzdWVfZGVhdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAogCQkgICAgdW5zaWduZWQgc2hvcnQgcmVhc29uKQogewotCURCR184NzIzQSgiJXMgdG8gIk1BQ19GTVQiXG4iLCBfX2Z1bmNfXywgTUFDX0FSRyhkYSkpOworCURCR184NzIzQSgiJXMgdG8gJXBNXG4iLCBfX2Z1bmNfXywgZGEpOwogCXJldHVybiBfaXNzdWVfZGVhdXRoKHBhZGFwdGVyLCBkYSwgcmVhc29uLCBmYWxzZSk7CiB9CiAKQEAgLTM2OTIsMTcgKzM2ODcsMTYgQEAKIAogCWlmICh0cnlfY250ICYmIHdhaXRfbXMpIHsKIAkJaWYgKGRhKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICJNQUNfRk1UIiwgY2g6JXUlcywgJWQvJWQgIgotCQkJCSAgImluICV1IG1zXG4iLCBfX2Z1bmNfXywKLQkJCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgTUFDX0FSRyhkYSksIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1M/IiwgYWNrZWQiOiIiLCBpLCB0cnlfY250LAorCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICVwTSwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCisJCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCisJCQkJICBkYSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKKwkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAogCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKIAkJZWxzZQogCQkJREJHXzg3MjNBKCIlcyglcyk6LCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKIAkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKIAkJCQkgIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1M/IiwgYWNrZWQiOiIiLCBpLCB0cnlfY250LAorCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCiAJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogCX0KIGV4aXQ6CkBAIC0zNzE5LDggKzM3MTMsOCBAQAogCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAotCURCR184NzIzQSgiJXMoJXMpOiByYSA9Ik1BQ19GTVQiLCBjaDoldSwgb2Zmc2V0OiV1XG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgTUFDX0FSRyhyYSksIG5ld19jaCwgY2hfb2Zmc2V0KTsKKwlEQkdfODcyM0EoIiVzKCVzKTogcmE9JXBNLCBjaDoldSwgb2Zmc2V0OiV1XG4iLAorCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgcmEsIG5ld19jaCwgY2hfb2Zmc2V0KTsKIAogCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKIAlpZiAoIXBtZ250ZnJhbWUpCkBAIC0zNzY3LDcgKzM3NjEsNiBAQAogewogCXUxNiBzdGFydF9zZXE7CiAJdTE2IEJBX3BhcmFfc2V0OwotCXUxNiBCQV90aW1lb3V0X3ZhbHVlOwogCXUxNiBCQV9zdGFydGluZ19zZXFjdHJsOwogCXUxNiBCQV9wYXJhOwogCWludCBtYXhfcnhfYW1wZHVfZmFjdG9yOwpAQCAtMzg0MiwxNiArMzgzNSwxNCBAQAogCQkJCUlFRUU4MDIxMV9BRERCQV9QQVJBTV9CVUZfU0laRV9NQVNLOwogCQl9IGVsc2UgewogCQkJLyogaW1tZWRpYXRlIGFjayAmIDY0IGJ1ZmZlciBzaXplICovCi0JCQlCQV9wYXJhX3NldCA9ICgweDEwMDIgfCAoKHN0YXR1cyAmIDB4ZikgPDwgMikpOworCQkJQkFfcGFyYV9zZXQgPSAweDEwMDIgfCAoKHN0YXR1cyAmIDB4ZikgPDwgMik7CiAJCX0KIAogCQlwdXRfdW5hbGlnbmVkX2xlMTYoQkFfcGFyYV9zZXQsCiAJCQkJICAgJm1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiKTsKIAotCQlCQV90aW1lb3V0X3ZhbHVlID0gNTAwMDsvKiAgNW1zICovCi0JCUJBX3RpbWVvdXRfdmFsdWUgPSBjcHVfdG9fbGUxNihCQV90aW1lb3V0X3ZhbHVlKTsKLQkJcHV0X3VuYWxpZ25lZF9sZTE2KEJBX3RpbWVvdXRfdmFsdWUsCi0JCQkJICAgJm1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLnRpbWVvdXQpOworCQkvKiAgNW1zICovCisJCXB1dF91bmFsaWduZWRfbGUxNig1MDAwLCAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEudGltZW91dCk7CiAKIAkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcmFkZHIpOwogCQlpZiAocHN0YSkgewpAQCAtNDM0Nyw3ICs0MzM4LDggQEAKIAogCQkvKiBpc3N1ZSBiZWFjb24gKi8KIAkJaWYgKHNlbmRfYmVhY29uMjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJpc3N1aW5nIGJlYWNvbiBmcmFtZSBmYWlsLi4uLlxuIikpOworCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKKwkJCQkgImlzc3VpbmcgYmVhY29uIGZyYW1lIGZhaWwuLi4uXG4iKTsKIAogCQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAtMSk7CiAJCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKQEAgLTQ1MzEsNyArNDUyMyw3IEBACiAKIAkJcCArPSAzOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkJICgiJXM6IDgwMi4xMWQgY291bnRyeSA9JXNcbiIsIF9fZnVuY19fLCBjb3VudHJ5KSk7CisJCQkgIiVzOiA4MDIuMTFkIGNvdW50cnkgPSVzXG4iLCBfX2Z1bmNfXywgY291bnRyeSk7CiAKIAkJaSA9IDA7CiAJCXdoaWxlICgoaWUgLSBwKSA+PSAzKSB7CkBAIC00NzA4LDkgKzQ3MDAsOCBAQAogCiAJCQkJY2hwbGFuX25ld1tpXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJCSAoIiVzOiBjaGFuZ2UgY2hhbm5lbCAlZCBzY2FuIHR5cGUgIgotCQkJCQkgICJmcm9tIHBhc3NpdmUgdG8gYWN0aXZlXG4iLAotCQkJCQkgIF9fZnVuY19fLCBjaGFubmVsKSk7CisJCQkJCSAiJXM6IGNoYW5nZSBjaGFubmVsICVkIHNjYW4gdHlwZSBmcm9tIHBhc3NpdmUgdG8gYWN0aXZlXG4iLAorCQkJCQkgX19mdW5jX18sIGNoYW5uZWwpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KQEAgLTQ3NDUsNyArNDczNiw3IEBACiAJaWYgKCFwY21kX29iaikKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKKwljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3VydmV5X2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKIAlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwZXZ0Y21kKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQ3OTYsNyArNDc4Nyw3IEBACiAJaWYgKCFwY21kX29iaikKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBldnRjbWQpIHsKIAkJa2ZyZWUocGNtZF9vYmopOwpAQCAtNDg0MCw3ICs0ODMxLDcgQEAKIAlpZiAoIXBjbWRfb2JqKQogCQlyZXR1cm47CiAKLQljbWRzeiA9IChzaXplb2Yoc3RydWN0IGpvaW5ic3NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKKwljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7CiAJcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwogCWlmICghcGV2dGNtZCkgewogCQlrZnJlZShwY21kX29iaik7CkBAIC00ODkwLDcgKzQ4ODEsNyBAQAogCWlmICghcGNtZF9vYmopCiAJCXJldHVybjsKIAotCWNtZHN6ID0gKHNpemVvZihzdHJ1Y3Qgc3RhZGVsX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7CiAJcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwogCWlmICghcGV2dGNtZCkgewogCQlrZnJlZShwY21kX29iaik7CkBAIC00OTE4LDcgKzQ5MDksNyBAQAogCWlmIChwc3RhKQogCQltYWNfaWQgPSAoaW50KXBzdGEtPm1hY19pZDsKIAllbHNlCi0JCW1hY19pZCA9ICgtMSk7CisJCW1hY19pZCA9IC0xOwogCiAJcGRlbF9zdGFfZXZ0LT5tYWNfaWQgPSBtYWNfaWQ7CiAKQEAgLTQ5NDQsNyArNDkzNSw3IEBACiAJaWYgKCFwY21kX29iaikKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGFzc29jX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBldnRjbWQpIHsKIAkJa2ZyZWUocGNtZF9vYmopOwpAQCAtNTk1MSw3ICs1OTQyLDcgQEAKIAogCQkJLyogMH4zIGZvciBkZWZhdWx0IGtleSwgY21kX2lkID0gbWFjaWQgKyAzLAogCQkJICAgbWFjaWQgPSBhaWQrMTsgKi8KLQkJCWNhbV9pZCA9IChwc3RhLT5tYWNfaWQgKyAzKTsKKwkJCWNhbV9pZCA9IHBzdGEtPm1hY19pZCArIDM7CiAKIAkJCURCR184NzIzQSgiV3JpdGUgQ0FNLCBtYWNfYWRkciA9JXg6JXg6JXg6JXg6JXg6JXgsICIKIAkJCQkgICJjYW1fZW50cnkgPSVkXG4iLCBwcGFybS0+YWRkclswXSwKQEAgLTYwNjYsNyArNjA1Nyw3IEBACiAJLyogIGNoZWNraW5nIGlmIGV2ZW50IGNvZGUgaXMgdmFsaWQgKi8KIAlpZiAoZXZ0X2NvZGUgPj0gTUFYX0MySEVWVCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbkV2ZW50IENvZGUoJWQpIG1pc21hdGNoIVxuIiwgZXZ0X2NvZGUpKTsKKwkJCSAiRXZlbnQgQ29kZSglZCkgbWlzbWF0Y2ghXG4iLCBldnRfY29kZSk7CiAJCWdvdG8gX2Fib3J0X2V2ZW50XzsKIAl9CiAKQEAgLTYwNzQsOCArNjA2NSw4IEBACiAJaWYgKHdsYW5ldmVudHNbZXZ0X2NvZGVdLnBhcm1zaXplICE9IDAgJiYKIAkgICAgd2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUgIT0gZXZ0X3N6KSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuRXZlbnQoJWQpIFBhcm0gU2l6ZSBtaXNtYXRjaCAoJWQgdnMgJWQpIVxuIiwKLQkJCSAgZXZ0X2NvZGUsIHdsYW5ldmVudHNbZXZ0X2NvZGVdLnBhcm1zaXplLCBldnRfc3opKTsKKwkJCSAiRXZlbnQoJWQpIFBhcm0gU2l6ZSBtaXNtYXRjaCAoJWQgdnMgJWQpIVxuIiwKKwkJCSBldnRfY29kZSwgd2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUsIGV2dF9zeik7CiAJCWdvdG8gX2Fib3J0X2V2ZW50XzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfcHdyY3RybC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMKaW5kZXggZTJkNTFhZi4uNzQ4OGExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMKQEAgLTIwMiwxNyArMjAyLDE3IEBACiAKIAlpZiAocHdycHJpdi0+cnB3bSA9PSBwc2x2KSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkoIiVzOiBBbHJlYWR5IHNldCBycHdtWzB4JTAyWF0sIG5ldyA9IDB4JTAyWCFcbiIsCi0JCQkgX19mdW5jX18sIHB3cnByaXYtPnJwd20sIHBzbHYpKTsKKwkJCSAiJXM6IEFscmVhZHkgc2V0IHJwd21bMHglMDJYXSwgbmV3ID0gMHglMDJYIVxuIiwKKwkJCSBfX2Z1bmNfXywgcHdycHJpdi0+cnB3bSwgcHNsdik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gdHJ1ZSB8fAogCSAgICBwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfZXJyXywKLQkJCSAoIiVzOiBTdXJwcmlzZVJlbW92ZWQoJWQpIGh3X2luaXRfY29tcGxldGVkKCVkKVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkLAotCQkJICBwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQpKTsKKwkJCSAiJXM6IFN1cnByaXNlUmVtb3ZlZCglZCkgaHdfaW5pdF9jb21wbGV0ZWQoJWQpXG4iLAorCQkJIF9fZnVuY19fLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCwKKwkJCSBwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQpOwogCiAJCXB3cnByaXYtPmNwd20gPSBQU19TVEFURV9TNDsKIApAQCAtMjIxLDIyICsyMjEsMjEgQEAKIAogCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IGNoYW5nZSBwb3dlciBzdGF0ZSgweCUwMlgpIHdoZW4gRHJpdmVyU3RvcHBlZFxuIiwKLQkJCSAgX19mdW5jX18sIHBzbHYpKTsKKwkJCSAiJXM6IGNoYW5nZSBwb3dlciBzdGF0ZSgweCUwMlgpIHdoZW4gRHJpdmVyU3RvcHBlZFxuIiwKKwkJCSBfX2Z1bmNfXywgcHNsdik7CiAKIAkJaWYgKHBzbHYgPCBQU19TVEFURV9TMikgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfZXJyXywKLQkJCQkgKCIlczogUmVqZWN0IHRvIGVudGVyIFBTX1NUQVRFKDB4JTAyWCkgbG93ZXIgIgotCQkJCSAgInRoYW4gUzIgd2hlbiBEcml2ZXJTdG9wcGVkISFcbiIsCi0JCQkJICBfX2Z1bmNfXywgcHNsdikpOworCQkJCSAiJXM6IFJlamVjdCB0byBlbnRlciBQU19TVEFURSgweCUwMlgpIGxvd2VyIHRoYW4gUzIgd2hlbiBEcml2ZXJTdG9wcGVkISFcbiIsCisJCQkJIF9fZnVuY19fLCBwc2x2KTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAogCXJwd20gPSBwc2x2IHwgcHdycHJpdi0+dG9nOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAoInJ0d19zZXRfcnB3bTIzYTogcnB3bSA9IDB4JTAyeCBjcHdtID0gMHglMDJ4XG4iLAotCQkgIHJwd20sIHB3cnByaXYtPmNwd20pKTsKKwkJICJydHdfc2V0X3Jwd20yM2E6IHJwd20gPSAweCUwMnggY3B3bSA9IDB4JTAyeFxuIiwKKwkJIHJwd20sIHB3cnByaXYtPmNwd20pOwogCiAJcHdycHJpdi0+cnB3bSA9IHBzbHY7CiAKQEAgLTI4MiwxMiArMjgxLDEyIEBACiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9ub3RpY2VfLAotCQkJICgiJXM6IFBvd2VyTW9kZSA9JWQgU21hcnRfUFMgPSVkXG4iLAotCQkJICBfX2Z1bmNfXywgcHNfbW9kZSwgc21hcnRfcHMpKTsKKwkJICIlczogUG93ZXJNb2RlID0lZCBTbWFydF9QUyA9JWRcbiIsCisJCSBfX2Z1bmNfXywgcHNfbW9kZSwgc21hcnRfcHMpOwogCiAJaWYgKHBzX21vZGUgPiBQTV9DYXJkX0Rpc2FibGUpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfZXJyXywKLQkJCSAoInBzX21vZGU6JWQgZXJyb3JcbiIsIHBzX21vZGUpKTsKKwkJCSAicHNfbW9kZTolZCBlcnJvclxuIiwgcHNfbW9kZSk7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMKaW5kZXggNTU5ZGRkZS4uMjc0YTRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMKQEAgLTI5OSwxMiArMjk5LDkgQEAKIAogCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAoIlxuIHJlY3ZmcmFtZV9jaGttaWM6cHJ4YXR0cmliLT5lbmNyeXB0ID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpKTsKKwkJCSAicmVjdmZyYW1lX2Noa21pYzpwcnhhdHRyaWItPmVuY3J5cHQgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIik7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiXG4gcmVjdmZyYW1lX2Noa21pYzpkYSA9IDB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoiCi0JCQkgICIweCUwMng6MHglMDJ4XG4iLCBwcnhhdHRyaWItPnJhWzBdLAotCQkJICBwcnhhdHRyaWItPnJhWzFdLCBwcnhhdHRyaWItPnJhWzJdLCBwcnhhdHRyaWItPnJhWzNdLAotCQkJICBwcnhhdHRyaWItPnJhWzRdLCBwcnhhdHRyaWItPnJhWzVdKSk7CisJCQkgInJlY3ZmcmFtZV9jaGttaWM6ZGEgPSAlcE1cbiIsIHByeGF0dHJpYi0+cmEpOwogCiAJCS8qIGNhbGN1bGF0ZSBtaWMgY29kZSAqLwogCQlpZiAoc3RhaW5mbyAhPSBOVUxMKSB7CkBAIC0zMTIsMTQgKzMwOSwxMyBAQAogCQkJCW1pY2tleSA9ICZwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwcnhtaWNrZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXlbMF07CiAKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiXG4gcmVjdmZyYW1lX2Noa21pYzogYmNtYyBrZXlcbiIpKTsKKwkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOiBiY21jIGtleVxuIik7CiAKIAkJCQlpZiAoIXBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5KSB7CiAJCQkJCXJlcyA9IF9GQUlMOwogCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKIAkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgKCJcbiByZWN2ZnJhbWVfY2hrbWljOmRpZG4ndCAiCi0JCQkJCQkgICJpbnN0YWxsIGdyb3VwIGtleSEhISEhIVxuIikpOworCQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOmRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSFcbiIpOwogCQkJCQlEQkdfODcyM0EoIlxuIHJlY3ZmcmFtZV9jaGttaWM6ZGlkbid0ICIKIAkJCQkJCSAgImluc3RhbGwgZ3JvdXAga2V5ISEhISEhXG4iKTsKIAkJCQkJZ290byBleGl0OwpAQCAtMzI3LDggKzMyMyw3IEBACiAJCQl9IGVsc2UgewogCQkJCW1pY2tleSA9ICZzdGFpbmZvLT5kb3QxMXRraXByeG1pY2tleS5za2V5WzBdOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuIHJlY3ZmcmFtZV9jaGttaWM6IHVuaWNhc3QgIgotCQkJCQkgICJrZXlcbiIpKTsKKwkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOiB1bmljYXN0IGtleVxuIik7CiAJCQl9CiAKIAkJCS8qIGljdl9sZW4gaW5jbHVkZWQgdGhlIG1pYyBjb2RlICovCkBAIC0zMzksOSArMzM0LDggQEAKIAkJCQlwcnhhdHRyaWItPml2X2xlbjsKIAogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiXG4gcHJ4YXR0cmliLT5pdl9sZW4gPSVkIHByeGF0dHJpYi0+aWN2X2xlbiA9IgotCQkJCSAgIiVkXG4iLCBwcnhhdHRyaWItPml2X2xlbiwKLQkJCQkgIHByeGF0dHJpYi0+aWN2X2xlbikpOworCQkJCSAicHJ4YXR0cmliLT5pdl9sZW4gPSVkIHByeGF0dHJpYi0+aWN2X2xlbiA9JWRcbiIsCisJCQkJIHByeGF0dHJpYi0+aXZfbGVuLCBwcnhhdHRyaWItPmljdl9sZW4pOwogCiAJCQkvKiBjYXJlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KIAkJCXJ0d19zZWNjYWxjdGtpcG1pYzIzYShtaWNrZXksIHBmcmFtZSwgcGF5bG9hZCwKQEAgLTM1NiwxMCArMzUwLDkgQEAKIAkJCQlpZiAobWljY29kZVtpXSAhPSAqKHBmcmFtZW1pYyArIGkpKSB7CiAJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAogCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAoInJlY3ZmcmFtZV9jaGttaWM6bWljY29kZSIKLQkJCQkJCSAgIlslZF0oJTAyeCkgIT0gKihwZnJhbWVtaWMrIgotCQkJCQkJICAiJWQpKCUwMngpICIsIGksIG1pY2NvZGVbaV0sCi0JCQkJCQkgIGksICoocGZyYW1lbWljICsgaSkpKTsKKwkJCQkJCSAicmVjdmZyYW1lX2Noa21pYzptaWNjb2RlWyVkXSglMDJ4KSAhPSAqKHBmcmFtZW1pYyslZCkoJTAyeClcbiIsCisJCQkJCQkgaSwgbWljY29kZVtpXSwKKwkJCQkJCSBpLCAqKHBmcmFtZW1pYyArIGkpKTsKIAkJCQkJYm1pY19lcnIgPSB0cnVlOwogCQkJCX0KIAkJCX0KQEAgLTM2OCw1MSArMzYxLDQ0IEBACiAJCQkJaW50IGk7CiAKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJcbiAqKHBmcmFtZW1pYy04KS0qKHBmcmFtZW1pYy0xKSA9IgotCQkJCQkgICIweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OiIKLQkJCQkJICAiMHglMDJ4OjB4JTAyeDoweCUwMnhcbiIsCi0JCQkJCSAgKihwZnJhbWVtaWMgLSA4KSwgKihwZnJhbWVtaWMgLSA3KSwKLQkJCQkJICAqKHBmcmFtZW1pYyAtIDYpLCAqKHBmcmFtZW1pYyAtIDUpLAotCQkJCQkgICoocGZyYW1lbWljIC0gNCksICoocGZyYW1lbWljIC0gMyksCi0JCQkJCSAgKihwZnJhbWVtaWMgLSAyKSwgKihwZnJhbWVtaWMgLSAxKSkpOworCQkJCQkgIioocGZyYW1lbWljLTgpLSoocGZyYW1lbWljLTEpID0weCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4XG4iLAorCQkJCQkgKihwZnJhbWVtaWMgLSA4KSwgKihwZnJhbWVtaWMgLSA3KSwKKwkJCQkJICoocGZyYW1lbWljIC0gNiksICoocGZyYW1lbWljIC0gNSksCisJCQkJCSAqKHBmcmFtZW1pYyAtIDQpLCAqKHBmcmFtZW1pYyAtIDMpLAorCQkJCQkgKihwZnJhbWVtaWMgLSAyKSwgKihwZnJhbWVtaWMgLSAxKSk7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiXG4gKihwZnJhbWVtaWMtMTYpLSoocGZyYW1lbWljLTkpID0iCi0JCQkJCSAgIjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6IgotCQkJCQkgICIweCUwMng6MHglMDJ4OjB4JTAyeFxuIiwKLQkJCQkJICAqKHBmcmFtZW1pYyAtIDE2KSwgKihwZnJhbWVtaWMgLSAxNSksCi0JCQkJCSAgKihwZnJhbWVtaWMgLSAxNCksICoocGZyYW1lbWljIC0gMTMpLAotCQkJCQkgICoocGZyYW1lbWljIC0gMTIpLCAqKHBmcmFtZW1pYyAtIDExKSwKLQkJCQkJICAqKHBmcmFtZW1pYyAtIDEwKSwgKihwZnJhbWVtaWMgLSA5KSkpOworCQkJCQkgIioocGZyYW1lbWljLTE2KS0qKHBmcmFtZW1pYy05KSA9MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeFxuIiwKKwkJCQkJICoocGZyYW1lbWljIC0gMTYpLCAqKHBmcmFtZW1pYyAtIDE1KSwKKwkJCQkJICoocGZyYW1lbWljIC0gMTQpLCAqKHBmcmFtZW1pYyAtIDEzKSwKKwkJCQkJICoocGZyYW1lbWljIC0gMTIpLCAqKHBmcmFtZW1pYyAtIDExKSwKKwkJCQkJICoocGZyYW1lbWljIC0gMTApLCAqKHBmcmFtZW1pYyAtIDkpKTsKIAogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuID09PT09PSBkZW1wIHBhY2tldCAobGVuID0lZCkgPT09PT09IgotCQkJCQkgICJcbiIsIHByZWN2ZnJhbWUtPnBrdC0+bGVuKSk7CisJCQkJCSAiPT09PT09IGRlbXAgcGFja2V0IChsZW4gPSVkKSA9PT09PT1cbiIsCisJCQkJCSBwcmVjdmZyYW1lLT5wa3QtPmxlbik7CiAJCQkJZm9yIChpID0gMDsgaSA8IHByZWN2ZnJhbWUtPnBrdC0+bGVuOyBpID0gaSArIDgpIHsKIAkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCi0JCQkJCQkgX2Rydl9lcnJfLCAoIjB4JTAyeDoweCUwMng6MHgiCi0JCQkJCQkJICAgICIlMDJ4OjB4JTAyeDoweCUwIgotCQkJCQkJCSAgICAiMng6MHglMDJ4OjB4JTAyeCIKLQkJCQkJCQkgICAgIjoweCUwMngiLAotCQkJCQkJCSAgICAqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKSwqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzEpLAotCQkJCQkJCSAgICAqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzIpLCoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krMyksCi0JCQkJCQkJICAgICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krNCksKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSs1KSwKLQkJCQkJCQkgICAgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSs2KSwqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzcpKSk7CisJCQkJCQkgX2Rydl9lcnJfLAorCQkJCQkJICIweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4XG4iLAorCQkJCQkJICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2kpLAorCQkJCQkJICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krMSksCisJCQkJCQkgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSsyKSwKKwkJCQkJCSAqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzMpLAorCQkJCQkJICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krNCksCisJCQkJCQkgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSs1KSwKKwkJCQkJCSAqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzYpLAorCQkJCQkJICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krNykpOwogCQkJCX0KIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJcbiA9PT09PT0gZGVtcCBwYWNrZXQgZW5kIFtsZW4gPSVkXSIKLQkJCQkJICAiPT09PT09XG4iLCBwcmVjdmZyYW1lLT5wa3QtPmxlbikpOworCQkJCQkgIj09PT09PSBkZW1wIHBhY2tldCBlbmQgW2xlbiA9JWRdPT09PT09XG4iLAorCQkJCQkgcHJlY3ZmcmFtZS0+cGt0LT5sZW4pOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuIGhyZGxlbiA9JWQsXG4iLAotCQkJCQkgIHByeGF0dHJpYi0+aGRybGVuKSk7CisJCQkJCSAiaHJkbGVuID0lZFxuIiwgcHJ4YXR0cmliLT5oZHJsZW4pOwogCiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICgicmEgPSAweCUuMnggMHglLjJ4IDB4JS4yeCAweCUuMnggMHglLiIKLQkJCQkJICAiMnggMHglLjJ4IHBzZWN1cml0eXByaXYtPiIKLQkJCQkJICAiYmluc3RhbGxHcnBrZXkgPSVkICIsCi0JCQkJCSAgcHJ4YXR0cmliLT5yYVswXSwgcHJ4YXR0cmliLT5yYVsxXSwKLQkJCQkJICBwcnhhdHRyaWItPnJhWzJdLCBwcnhhdHRyaWItPnJhWzNdLAotCQkJCQkgIHByeGF0dHJpYi0+cmFbNF0sIHByeGF0dHJpYi0+cmFbNV0sCi0JCQkJCSAgcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkpKTsKKwkJCQkJICJyYSA9ICVwTSBwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9JWRcbiIsCisJCQkJCSBwcnhhdHRyaWItPnJhLAorCQkJCQkgcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkpOwogCiAJCQkJLyogIGRvdWJsZSBjaGVjayBrZXlfaW5kZXggZm9yIHNvbWUgdGltaW5nCiAJCQkJICAgIGlzc3VlLCBjYW5ub3QgY29tcGFyZSB3aXRoCkBAIC00MjYsMTYgKzQxMiwxNyBAQAogCQkJCWlmICgocHJ4YXR0cmliLT5iZGVjcnlwdGVkID09IHRydWUpICYmCiAJCQkJICAgIChicnB0X21pY2Vycm9yID09IHRydWUpKSB7CiAJCQkJCXJ0d19oYW5kbGVfdGtpcF9taWNfZXJyMjNhKGFkYXB0ZXIsICh1OClpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwcnhhdHRyaWItPnJhKSk7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiIG1pYyBlcnJvciA6cHJ4YXR0cmliLT5iZGVjcnlwdGVkID0lZCAiLCBwcnhhdHRyaWItPmJkZWNyeXB0ZWQpKTsKKwkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKKwkJCQkJCSAibWljIGVycm9yIDpwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPSVkXG4iLAorCQkJCQkJIHByeGF0dHJpYi0+YmRlY3J5cHRlZCk7CiAJCQkJCURCR184NzIzQSgiIG1pYyBlcnJvciA6cHJ4YXR0cmliLT4iCiAJCQkJCQkgICJiZGVjcnlwdGVkID0lZFxuIiwKIAkJCQkJCSAgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKIAkJCQl9IGVsc2UgewogCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKIAkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgKCIgbWljIGVycm9yIDpwcnhhdHRyaWItPiIKLQkJCQkJCSAgImJkZWNyeXB0ZWQgPSVkICIsCi0JCQkJCQkgIHByeGF0dHJpYi0+YmRlY3J5cHRlZCkpOworCQkJCQkJICJtaWMgZXJyb3IgOnByeGF0dHJpYi0+YmRlY3J5cHRlZCA9JWRcbiIsCisJCQkJCQkgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKIAkJCQkJREJHXzg3MjNBKCIgbWljIGVycm9yIDpwcnhhdHRyaWItPiIKIAkJCQkJCSAgImJkZWNyeXB0ZWQgPSVkXG4iLAogCQkJCQkJICBwcnhhdHRyaWItPmJkZWNyeXB0ZWQpOwpAQCAtNDQ5LDE0ICs0MzYsMTIgQEAKIAkJCQkJcHNlY3VyaXR5cHJpdi0+YmNoZWNrX2dycGtleSA9IDE7CiAJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAogCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAoInBzZWN1cml0eXByaXYtPmJjaGVja19ncnAiCi0JCQkJCQkgICJrZXkgPSB0cnVlIikpOworCQkJCQkJICJwc2VjdXJpdHlwcml2LT5iY2hlY2tfZ3Jwa2V5ID0gdHJ1ZVxuIik7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJyZWN2ZnJhbWVfY2hrbWljOiBydHdfZ2V0X3N0YWluZm8yM2EgPT0iCi0JCQkJICAiTlVMTCEhIVxuIikpOworCQkJCSAicmVjdmZyYW1lX2Noa21pYzogcnR3X2dldF9zdGFpbmZvMjNhID09TlVMTCEhIVxuIik7CiAJCX0KIAogCQlza2JfdHJpbShwcmVjdmZyYW1lLT5wa3QsIHByZWN2ZnJhbWUtPnBrdC0+bGVuIC0gOCk7CkBAIC00ODEsOCArNDY2LDggQEAKIAlpbnQgcmVzID0gX1NVQ0NFU1M7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICgicHJ4c3RhdC0+ZGVjcnlwdGVkID0leCBwcnhhdHRyaWItPmVuY3J5cHQgPSAweCUwM3hcbiIsCi0JCSAgcHJ4YXR0cmliLT5iZGVjcnlwdGVkLCBwcnhhdHRyaWItPmVuY3J5cHQpKTsKKwkJICJwcnhzdGF0LT5kZWNyeXB0ZWQgPSV4IHByeGF0dHJpYi0+ZW5jcnlwdCA9IDB4JTAzeFxuIiwKKwkJIHByeGF0dHJpYi0+YmRlY3J5cHRlZCwgcHJ4YXR0cmliLT5lbmNyeXB0KTsKIAogCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgPiAwKSB7CiAJCXU4ICppdiA9IHByZWN2X2ZyYW1lLT5wa3QtPmRhdGEgKyBwcnhhdHRyaWItPmhkcmxlbjsKQEAgLTU2NSw4ICs1NTAsOCBAQAogCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBzdGFfYWRkcik7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICgiIyMjIyMjIyNwb3J0Y3RybDphZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSA9IgotCQkgICIlZFxuIiwgYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0pKTsKKwkJICIjIyMjIyMjI3BvcnRjdHJsOmFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID0lZFxuIiwKKwkJIGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtKTsKIAogCXBydG5mcmFtZSA9IHByZWN2X2ZyYW1lOwogCkBAIC01ODAsOCArNTY1LDcgQEAKIAkJCS8qIGJsb2NrZWQgKi8KIAkJCS8qIG9ubHkgYWNjZXB0IEVBUE9MIGZyYW1lICovCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCIjIyMjIyMjI3BvcnRjdHJsOnBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IgotCQkJCSAgIjFcbiIpKTsKKwkJCQkgIiMjIyMjIyMjcG9ydGN0cmw6cHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0xXG4iKTsKIAogCQkJaWYgKGV0aGVyX3R5cGUgIT0gZWFwb2xfdHlwZSkgewogCQkJCS8qIGZyZWUgdGhpcyBmcmFtZSAqLwpAQCAtNjA4LDggKzU5Miw4IEBACiAKIAlpZiAodGlkID4gMTUpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCSAoInJlY3ZfZGVjYWNoZSwgKHRpZD4xNSkhIHNlcV9jdHJsID0gMHgleCwgdGlkID0gMHgleFxuIiwKLQkJCSAgc2VxX2N0cmwsIHRpZCkpOworCQkJICJyZWN2X2RlY2FjaGUsICh0aWQ+MTUpISBzZXFfY3RybCA9IDB4JXgsIHRpZCA9IDB4JXhcbiIsCisJCQkgc2VxX2N0cmwsIHRpZCk7CiAKIAkJcmV0dXJuIF9GQUlMOwogCX0KQEAgLTYxNyw5ICs2MDEsOCBAQAogCWlmICgxKSB7IC8qIGlmIChicmV0cnkpICovCiAJCWlmIChzZXFfY3RybCA9PSBwcnhjYWNoZS0+dGlkX3J4c2VxW3RpZF0pIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICgicmVjdl9kZWNhY2hlLCBzZXFfY3RybCA9IDB4JXgsIHRpZCA9IDB4JXgsICIKLQkJCQkgICJ0aWRfcnhzZXEgPSAweCV4XG4iLAotCQkJCSAgc2VxX2N0cmwsIHRpZCwgcHJ4Y2FjaGUtPnRpZF9yeHNlcVt0aWRdKSk7CisJCQkJICJyZWN2X2RlY2FjaGUsIHNlcV9jdHJsID0gMHgleCwgdGlkID0gMHgleCwgdGlkX3J4c2VxID0gMHgleFxuIiwKKwkJCQkgc2VxX2N0cmwsIHRpZCwgcHJ4Y2FjaGUtPnRpZF9yeHNlcVt0aWRdKTsKIAogCQkJcmV0dXJuIF9GQUlMOwogCQl9CkBAIC03NzcsNyArNzYwLDcgQEAKIAkJLyogIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KIAkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPnNyYykpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiIFNBID09IG15c2VsZlxuIikpOworCQkJCSAiU0EgPT0gbXlzZWxmXG4iKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC04MDAsOCArNzgzLDcgQEAKIAkJICAgIGFuZCBEQSBpcyBteSBtYWMtYWRkcmVzcyAqLwogCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPnNyYykpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiYnNzaWQgIT0gVEEgdW5kZXIgU1RBVElPTl9NT0RFOyBkcm9wICIKLQkJCQkgICJwa3RcbiIpKTsKKwkJCQkgImJzc2lkICE9IFRBIHVuZGVyIFNUQVRJT05fTU9ERTsgZHJvcCBwa3RcbiIpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTg0Myw3ICs4MjUsOCBAQAogCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc3RhX2FkZHIpOyAvKiAgZ2V0IGFwX2luZm8gKi8KIAogCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgc3RhMnN0YV9kYXRhX2ZyYW1lIDsgZHJvcCBwa3RcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKKwkJCSAiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgc3RhMnN0YV9kYXRhX2ZyYW1lIDsgZHJvcCBwa3RcbiIpOwogCQlyZXQgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTg3OSw3ICs4NjIsNyBAQAogCQkvKiBmaWx0ZXIgcGFja2V0cyB0aGF0IFNBIGlzIG15c2VsZiBvciBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCiAJCWlmIChldGhlcl9hZGRyX2VxdWFsKG15aHdhZGRyLCBwYXR0cmliLT5zcmMpKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoIiBTQSA9PSBteXNlbGZcbiIpKTsKKwkJCQkgIlNBID09IG15c2VsZlxuIik7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtODg3LDggKzg3MCw4IEBACiAJCS8qICBkYSBzaG91bGQgYmUgZm9yIG1lICovCiAJCWlmICghZXRoZXJfYWRkcl9lcXVhbChteWh3YWRkciwgcGF0dHJpYi0+ZHN0KSAmJiAhYm1jYXN0KSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkoIiBhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgREEgZmFpbDsgREEgPSIKLQkJCQkgTUFDX0ZNVCJcbiIsIE1BQ19BUkcocGF0dHJpYi0+ZHN0KSkpOworCQkJCSAiYXAyc3RhX2RhdGFfZnJhbWU6ICBjb21wYXJlIERBIGZhaWxlZDsgREE9JXBNXG4iLAorCQkJCSBwYXR0cmliLT5kc3QpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTg5OCwxNSArODgxLDE0IEBACiAJCSAgICBldGhlcl9hZGRyX2VxdWFsKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiKSB8fAogCQkgICAgIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQpKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkoIiBhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgQlNTSUQgZmFpbCA7ICIKLQkJCQkgIkJTU0lEID0iTUFDX0ZNVCJcbiIsIE1BQ19BUkcocGF0dHJpYi0+YnNzaWQpKSk7CisJCQkJICJhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgQlNTSUQgZmFpbGVkOyBCU1NJRD0lcE1cbiIsCisJCQkJIHBhdHRyaWItPmJzc2lkKTsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIm15YnNzaWQgPSJNQUNfRk1UIlxuIiwgTUFDX0FSRyhteWJzc2lkKSkpOworCQkJCSAibXlic3NpZD0lcE1cbiIsIG15YnNzaWQpOwogCiAJCQlpZiAoIWJtY2FzdCkgewotCQkJCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHRoZSBub25hc3NvY2lhdGVkICIKLQkJCQkJICAiYXAgPSIgTUFDX0ZNVCAiIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJCQkgIE1BQ19BUkcocGF0dHJpYi0+YnNzaWQpKTsKKwkJCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byB0aGUgbm9uYXNzb2NpYXRlZCBhcD0lcE0gZm9yIHRoZSByZWFzb24oNylcbiIsCisJCQkJCSAgcGF0dHJpYi0+YnNzaWQpOwogCQkJCWlzc3VlX2RlYXV0aDIzYShhZGFwdGVyLCBwYXR0cmliLT5ic3NpZCwKIAkJCQkJICAgICBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEpOwogCQkJfQpAQCAtOTIzLDggKzkwNSw3IEBACiAKIAkJaWYgKCpwc3RhID09IE5VTEwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiYXAyc3RhOiBjYW4ndCBnZXQgcHN0YSB1bmRlciBTVEFUSU9OX01PREUgOyIKLQkJCQkgICIgZHJvcCBwa3RcbiIpKTsKKwkJCQkgImFwMnN0YTogY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgU1RBVElPTl9NT0RFOyBkcm9wIHBrdFxuIik7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtOTUyLDcgKzkzMyw3IEBACiAJCSpwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5ic3NpZCk7CiAJCWlmICgqcHN0YSA9PSBOVUxMKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoImNhbid0IGdldCBwc3RhIHVuZGVyIE1QX01PREUgOyBkcm9wIHBrdFxuIikpOworCQkJCSAiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgTVBfTU9ERSA7IGRyb3AgcGt0XG4iKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC05NjQsOSArOTQ1LDggQEAKIAkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPmRzdCkgJiYgIWJtY2FzdCkgewogCQkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPmJzc2lkKTsKIAkJCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gdGhlIGFwID0iIE1BQ19GTVQKLQkJCQkJICAiIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJCQkgIE1BQ19BUkcocGF0dHJpYi0+YnNzaWQpKTsKKwkJCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byB0aGUgYXA9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAorCQkJCQkgIHBhdHRyaWItPmJzc2lkKTsKIAogCQkJCWlzc3VlX2RlYXV0aDIzYShhZGFwdGVyLCBwYXR0cmliLT5ic3NpZCwKIAkJCQkJICAgICBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEpOwpAQCAtMTAxMCwxMCArOTkwLDkgQEAKIAkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnNyYyk7CiAJCWlmICgqcHN0YSA9PSBOVUxMKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoImNhbid0IGdldCBwc3RhIHVuZGVyIEFQX01PREU7IGRyb3AgcGt0XG4iKSk7Ci0JCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byBzdGEgPSIgTUFDX0ZNVAotCQkJCSAgIiBmb3IgdGhlIHJlYXNvbig3KVxuIiwKLQkJCQkgIE1BQ19BUkcocGF0dHJpYi0+c3JjKSk7CisJCQkJICJjYW4ndCBnZXQgcHN0YSB1bmRlciBBUF9NT0RFOyBkcm9wIHBrdFxuIik7CisJCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byBzdGE9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAorCQkJCSAgcGF0dHJpYi0+c3JjKTsKIAogCQkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPnNyYywKIAkJCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7CkBAIC0xMDQzLDggKzEwMjIsOCBAQAogCQkJcmV0ID0gUlRXX1JYX0hBTkRMRUQ7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KLQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gc3RhID0iIE1BQ19GTVQgIiBmb3IgdGhlIHJlYXNvbig3KVxuIiwKLQkJCSAgTUFDX0FSRyhwYXR0cmliLT5zcmMpKTsKKwkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gc3RhPSVwTSBmb3IgdGhlIHJlYXNvbig3KVxuIiwKKwkJCSAgcGF0dHJpYi0+c3JjKTsKIAkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPnNyYywKIAkJCSAgICAgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBKTsKIAkJcmV0ID0gUlRXX1JYX0hBTkRMRUQ7CkBAIC0xMjE0LDEyICsxMTkzLDEyIEBACiAJLyogc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OyAqLwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCSAoIit2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWVcbiIpKTsKKwkJICIrdmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lXG4iKTsKIAogCXByZWN2X2ZyYW1lID0gcmVjdmZyYW1lX2Noa19kZWZyYWcyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKIAlpZiAocHJlY3ZfZnJhbWUgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJICgiJXM6IGZyYWdtZW50IHBhY2tldFxuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6IGZyYWdtZW50IHBhY2tldFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gX1NVQ0NFU1M7CiAJfQogCkBAIC0xMzA1LDcgKzEyODQsNyBAQAogCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIGhkci0+YWRkcjEpOwogCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIGhkci0+YWRkcjIpOwogCQlyZXQgPSBfRkFJTDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCIgY2FzZSAzXG4iKSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICJjYXNlIDNcbiIpOwogCQlicmVhazsKIAl9CiAKQEAgLTEzMTQsNyArMTI5Myw3IEBACiAKIAlpZiAoIXBzdGEpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAoIiBhZnRlciB0b19mcl9kc19jaGs7IHBzdGEgPT0gTlVMTFxuIikpOworCQkJICJhZnRlciB0b19mcl9kc19jaGs7IHBzdGEgPT0gTlVMTFxuIik7CiAJCXJldCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTM1NywyNiArMTMzNiwyNSBAQAogCWlmIChyZWN2X2RlY2FjaGUocHJlY3ZfZnJhbWUsIGJyZXRyeSwgJnBzdGEtPnN0YV9yZWN2cHJpdi5yeGNhY2hlKSA9PQogCSAgICBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICgiZGVjYWNoZSA6IGRyb3AgcGt0XG4iKSk7CisJCQkgImRlY2FjaGUgOiBkcm9wIHBrdFxuIik7CiAJCXJldCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKHBhdHRyaWItPnByaXZhY3kpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWU6cGF0dHJpYi0+cHJpdmFjeSA9JXhcbiIsCi0JCQkgcGF0dHJpYi0+cHJpdmFjeSkpOworCQkJICJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWU6cGF0dHJpYi0+cHJpdmFjeSA9JXhcbiIsCisJCQkgcGF0dHJpYi0+cHJpdmFjeSk7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiXG4gXl5eXl5eXl5eXl5pc19tdWx0aWNhc3RfZXRoZXJfYWRkciIKLQkJCSAgIihwYXR0cmliLT5yYSgweCUwMngpKSA9JWReXl5eXl5eXl5eXl5eXl42XG4iLAotCQkJICBwYXR0cmliLT5yYVswXSwKLQkJCSAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpKSk7CisJCQkgIl5eXl5eXl5eXl5eaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEoMHglMDJ4KSkgPSVkXl5eXl5eXl5eXl5eXl5eNlxuIiwKKwkJCSBwYXR0cmliLT5yYVswXSwKKwkJCSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpOwogCiAJCUdFVF9FTkNSWV9BTEdPKHBzZWN1cml0eXByaXYsIHBzdGEsIHBhdHRyaWItPmVuY3J5cHQsCiAJCQkgICAgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpKTsKIAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAoIlxuIHBhdHRyaWItPmVuY3J5cHQgPSVkXG4iLCBwYXR0cmliLT5lbmNyeXB0KSk7CisJCQkgInBhdHRyaWItPmVuY3J5cHQgPSVkXG4iLCBwYXR0cmliLT5lbmNyeXB0KTsKIAogCQlzd2l0Y2ggKHBhdHRyaWItPmVuY3J5cHQpIHsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKQEAgLTE0NTcsNyArMTQzNSw3IEBACiAJLyogYWRkIHZlcnNpb24gY2hrICovCiAJaWYgKHZlciAhPSAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUgZmFpbCEgKHZlciE9IDApXG4iKSk7CisJCQkgInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZSBmYWlsISAodmVyIT0gMClcbiIpOwogCQlyZXR2YWwgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTE0ODIsNyArMTQ2MCw3IEBACiAJCXJldHZhbCA9IHZhbGlkYXRlX3JlY3ZfbWdudF9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSk7CiAJCWlmIChyZXR2YWwgPT0gX0ZBSUwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgidmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lIGZhaWxcbiIpKTsKKwkJCQkgInZhbGlkYXRlX3JlY3ZfbWdudF9mcmFtZSBmYWlsXG4iKTsKIAkJfQogCQlyZXR2YWwgPSBfRkFJTDsgLyogIG9ubHkgZGF0YSBmcmFtZSByZXR1cm4gX1NVQ0NFU1MgKi8KIAkJYnJlYWs7CkBAIC0xNDkwLDcgKzE0NjgsNyBAQAogCQlyZXR2YWwgPSB2YWxpZGF0ZV9yZWN2X2N0cmxfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwogCQlpZiAocmV0dmFsID09IF9GQUlMKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoInZhbGlkYXRlX3JlY3ZfY3RybF9mcmFtZSBmYWlsXG4iKSk7CisJCQkJICJ2YWxpZGF0ZV9yZWN2X2N0cmxfZnJhbWUgZmFpbFxuIik7CiAJCX0KIAkJcmV0dmFsID0gX0ZBSUw7IC8qICBvbmx5IGRhdGEgZnJhbWUgcmV0dXJuIF9TVUNDRVNTICovCiAJCWJyZWFrOwpAQCAtMTQ5OSwxMyArMTQ3NywxMyBAQAogCQlyZXR2YWwgPSB2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwogCQlpZiAocmV0dmFsID09IF9GQUlMKSB7CiAJCQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmYWRhcHRlci0+cmVjdnByaXY7Ci0JCQkvKiBSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZSBmYWlsXG4iKSk7ICovCisKIAkJCXByZWN2cHJpdi0+cnhfZHJvcCsrOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUgZmFpbCEgdHlwZSA9IDB4JXhcbiIsIHR5cGUpKTsKKwkJCSAidmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lIGZhaWwhIHR5cGUgPSAweCV4XG4iLCB0eXBlKTsKIAkJcmV0dmFsID0gX0ZBSUw7CiAJCWJyZWFrOwogCX0KQEAgLTE1NTIsOCArMTUzMCw4IEBACiAJbGVuID0gc2tiLT5sZW4gLSBoZHJsZW47CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICgiXG4gPT09IHBhdHRyaWItPmhkcmxlbjogJXgsICBwYXR0cmliLT5pdl9sZW46JXggPT09XG5cbiIsCi0JCSAgcGF0dHJpYi0+aGRybGVuLCAgcGF0dHJpYi0+aXZfbGVuKSk7CisJCSAiPT09IHBhdHRyaWItPmhkcmxlbjogJXgsICBwYXR0cmliLT5pdl9sZW46JXggPT09XG4iLAorCQkgcGF0dHJpYi0+aGRybGVuLCAgcGF0dHJpYi0+aXZfbGVuKTsKIAogCXBhdHRyaWItPmV0aF90eXBlID0gZXRoX3R5cGU7CiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgewpAQCAtMTY2NSw3ICsxNjQzLDcgQEAKIAlydHdfZnJlZV9yZWN2ZnJhbWUyM2FfcXVldWUoZGVmcmFnX3EpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCSAoIlBlcmZvcm1hbmNlIGRlZnJhZyEhISEhXG4iKSk7CisJCSAiUGVyZm9ybWFuY2UgZGVmcmFnISEhISFcbiIpOwogCiAKIApAQCAtMTczNiw4ICsxNzE0LDggQEAKIAkJCS8qIHNwaW5fdW5sb2NrKCZwZGVmcmFnX3EtPmxvY2spOyAqLwogCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJFbnF1ZXVxOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKLQkJCQkgIGlzbWZyYWcsIGZyYWdudW0pKTsKKwkJCQkgIkVucXVldXE6IGlzbWZyYWcgPSAlZCwgZnJhZ251bSA9ICVkXG4iLAorCQkJCSBpc21mcmFnLCBmcmFnbnVtKTsKIAogCQkJcHJ0bmZyYW1lID0gTlVMTDsKIApAQCAtMTc0Nyw4ICsxNzI1LDggQEAKIAkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7CiAJCQlwcnRuZnJhbWUgPSBOVUxMOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJGcmVlIGJlY2F1c2UgcGRlZnJhZ19xID09IE5VTEw6IGlzbWZyYWcgPSAiCi0JCQkJICAiJWQsIGZyYWdudW0gPSAlZFxuIiwgaXNtZnJhZywgZnJhZ251bSkpOworCQkJCSAiRnJlZSBiZWNhdXNlIHBkZWZyYWdfcSA9PSBOVUxMOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKKwkJCQkgaXNtZnJhZywgZnJhZ251bSk7CiAJCX0KIAl9CiAKQEAgLTE3NjMsOCArMTc0MSw4IEBACiAKIAkJCS8qIGNhbGwgcmVjdmZyYW1lX2RlZnJhZyB0byBkZWZyYWcgKi8KIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoImRlZnJhZzogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCi0JCQkJICBpc21mcmFnLCBmcmFnbnVtKSk7CisJCQkJICJkZWZyYWc6IGlzbWZyYWcgPSAlZCwgZnJhZ251bSA9ICVkXG4iLAorCQkJCSBpc21mcmFnLCBmcmFnbnVtKTsKIAkJCXByZWN2X2ZyYW1lID0gcmVjdmZyYW1lX2RlZnJhZyhwYWRhcHRlciwgcGRlZnJhZ19xKTsKIAkJCXBydG5mcmFtZSA9IHByZWN2X2ZyYW1lOwogCQl9IGVsc2UgewpAQCAtMTc3Myw4ICsxNzUxLDggQEAKIAkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7CiAJCQlwcnRuZnJhbWUgPSBOVUxMOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJGcmVlIGJlY2F1c2UgcGRlZnJhZ19xID09IE5VTEw6IGlzbWZyYWcgPSAiCi0JCQkJICAiJWQsIGZyYWdudW0gPSAlZFxuIiwgaXNtZnJhZywgZnJhZ251bSkpOworCQkJCSAiRnJlZSBiZWNhdXNlIHBkZWZyYWdfcSA9PSBOVUxMOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKKwkJCQkgaXNtZnJhZywgZnJhZ251bSk7CiAJCX0KIAogCX0KQEAgLTE3ODMsOCArMTc2MSw3IEBACiAJCS8qIGFmdGVyIGRlZnJhZyB3ZSBtdXN0IGNoZWNrIHRraXAgbWljIGNvZGUgKi8KIAkJaWYgKHJlY3ZmcmFtZV9jaGttaWMocGFkYXB0ZXIsICBwcnRuZnJhbWUpID09IF9GQUlMKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoInJlY3ZmcmFtZV9jaGttaWMocGFkYXB0ZXIsICBwcnRuZnJhbWUpID09IgotCQkJCSAgIl9GQUlMXG4iKSk7CisJCQkJICJyZWN2ZnJhbWVfY2hrbWljKHBhZGFwdGVyLCAgcHJ0bmZyYW1lKSA9PV9GQUlMXG4iKTsKIAkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcnRuZnJhbWUpOwogCQkJcHJ0bmZyYW1lID0gTlVMTDsKIAkJfQpAQCAtMTg4Myw3ICsxODYwLDYgQEAKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKFNOX0VRVUFMKHBuZXh0YXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5zZXFfbnVtKSkgewogCQkJLyogRHVwbGljYXRlIGVudHJ5IGlzIGZvdW5kISEgRG8gbm90IGluc2VydCBjdXJyZW50IGVudHJ5LiAqLwotCQkJLyogUlRfVFJBQ0UoQ09NUF9SWF9SRU9SREVSLCBEQkdfVFJBQ0UsICgiSW5zZXJ0UnhSZW9yZGVyTGlzdCgpOiBEdXBsaWNhdGUgcGFja2V0IGlzIGRyb3BwZWQhISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIsIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKSk7ICovCiAKIAkJCS8qIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7ICovCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0xOTA0LDcgKzE4ODAsNiBAQAogCS8qIHNwaW5fdW5sb2NrX2V4KCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOyAqLwogCS8qIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7ICovCiAKLQkvKiBSVF9UUkFDRShDT01QX1JYX1JFT1JERVIsIERCR19UUkFDRSwgKCJJbnNlcnRSeFJlb3JkZXJMaXN0KCk6IFBrdCBpbnNlcnQgaW50byBidWZmZXIhISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIsIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKSk7ICovCiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTE5NTYsMTAgKzE5MzEsOSBAQAogCiAJCWlmICghU05fTEVTUyhwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsIHBhdHRyaWItPnNlcV9udW0pKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAoInJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyOiBpbmRpY2F0ZSA9JWQgIgotCQkJCSAgInNlcSA9JWQgYW1zZHUgPSVkXG4iLAotCQkJCSAgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLAotCQkJCSAgcGF0dHJpYi0+c2VxX251bSwgcGF0dHJpYi0+YW1zZHUpKTsKKwkJCQkgInJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyOiBpbmRpY2F0ZSA9JWQgc2VxID0lZCBhbXNkdSA9JWRcbiIsCisJCQkJIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwKKwkJCQkgcGF0dHJpYi0+c2VxX251bSwgcGF0dHJpYi0+YW1zZHUpOwogCiAJCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwogCQkJbGlzdF9kZWxfaW5pdCgmcHJmcmFtZS0+bGlzdCk7CkBAIC0yMDIxLDggKzE5OTUsNyBAQAogCQkJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gZmFsc2UpICYmCiAJCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJCSAoIkBAQEAgIHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlciAtIgotCQkJCQkgICJyZWN2X2Z1bmMgcmVjdl9pbmRpY2F0ZXBrdFxuIikpOworCQkJCQkgIkBAQEAgIHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlciAtcmVjdl9mdW5jIHJlY3ZfaW5kaWNhdGVwa3RcbiIpOwogCiAJCQkJcnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EocGFkYXB0ZXIsIHByZnJhbWUpOwogCQkJCXJldHVybiBfU1VDQ0VTUzsKQEAgLTIwNTUsOCArMjAyOCw4IEBACiAJc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJICgicmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyOiBpbmRpY2F0ZSA9JWQgc2VxID0lZFxuIiwKLQkJICBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsIHBhdHRyaWItPnNlcV9udW0pKTsKKwkJICJyZWN2X2luZGljYXRlcGt0X3Jlb3JkZXI6IGluZGljYXRlID0lZCBzZXEgPSVkXG4iLAorCQkgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLCBwYXR0cmliLT5zZXFfbnVtKTsKIAogCS8qIHMyLiBjaGVjayBpZiB3aW5zdGFydF9iKGluZGljYXRlX3NlcSkgbmVlZHMgdG8gYmVlbiB1cGRhdGVkICovCiAJaWYgKCFjaGVja19pbmRpY2F0ZV9zZXEocHJlb3JkZXJfY3RybCwgcGF0dHJpYi0+c2VxX251bSkpIHsKQEAgLTIxNDksNyArMjEyMiw3IEBACiAJCXJldHZhbCA9IHdsYW5oZHJfdG9fZXRoaGRyKHByZnJhbWUpOwogCQlpZiAocmV0dmFsICE9IF9TVUNDRVNTKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoIndsYW5oZHJfdG9fZXRoaGRyOiBkcm9wIHBrdFxuIikpOworCQkJCSAid2xhbmhkcl90b19ldGhoZHI6IGRyb3AgcGt0XG4iKTsKIAkJCXJldHVybiByZXR2YWw7CiAJCX0KIApAQCAtMjE1NywxOSArMjEzMCwxNiBAQAogCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewogCQkJLyogaW5kaWNhdGUgdGhpcyByZWN2X2ZyYW1lICovCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAoIkBAQEAgcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cy0gIgotCQkJCSAgInJlY3ZfZnVuYyByZWN2X2luZGljYXRlcGt0XG4iKSk7CisJCQkJICJAQEBAIHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMtIHJlY3ZfZnVuYyByZWN2X2luZGljYXRlcGt0XG4iKTsKIAkJCXJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKIAkJfSBlbHNlIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICgiQEBAQCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzLSAiCi0JCQkJICAicmVjdl9mdW5jIGZyZWVfaW5kaWNhdGVwa3RcbiIpKTsKKwkJCQkgIkBAQEAgcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cy0gcmVjdl9mdW5jIGZyZWVfaW5kaWNhdGVwa3RcbiIpOwogCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAoInJlY3ZfZnVuYzpiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJCSAgImJTdXJwcmlzZVJlbW92ZWQoJWQpIiwKLQkJCQkgIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCQkgIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSk7CisJCQkJICJyZWN2X2Z1bmM6YkRyaXZlclN0b3BwZWQoJWQpIE9SIGJTdXJwcmlzZVJlbW92ZWQoJWQpXG4iLAorCQkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCisJCQkJIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKIAkJCXJldHZhbCA9IF9GQUlMOwogCQkJcmV0dXJuIHJldHZhbDsKIAkJfQpAQCAtMjE4OCw3ICsyMTU4LDcgQEAKIAlyZXQgPSB2YWxpZGF0ZV9yZWN2X2ZyYW1lKHBhZGFwdGVyLCByZnJhbWUpOwogCWlmIChyZXQgIT0gX1NVQ0NFU1MpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJyZWN2X2Z1bmM6IHZhbGlkYXRlX3JlY3ZfZnJhbWUgZmFpbCEgZHJvcCBwa3RcbiIpKTsKKwkJCSAicmVjdl9mdW5jOiB2YWxpZGF0ZV9yZWN2X2ZyYW1lIGZhaWwhIGRyb3AgcGt0XG4iKTsKIAkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHJmcmFtZSk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMjA4LDcgKzIxNzgsNyBAQAogCXByZnJhbWUgPSBkZWNyeXB0b3IocGFkYXB0ZXIsIHByZnJhbWUpOwogCWlmIChwcmZyYW1lID09IE5VTEwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAoImRlY3J5cHRvcjogZHJvcCBwa3RcbiIpKTsKKwkJCSAiZGVjcnlwdG9yOiBkcm9wIHBrdFxuIik7CiAJCXJldCA9IF9GQUlMOwogCQlnb3RvIF9yZWN2X2RhdGFfZHJvcDsKIAl9CkBAIC0yMjE2LDcgKzIxODYsNyBAQAogCXByZnJhbWUgPSByZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShwYWRhcHRlciwgcHJmcmFtZSk7CiAJaWYgKCFwcmZyYW1lKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJyZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYTogZHJvcCBwa3RcbiIpKTsKKwkJCSAicmVjdmZyYW1lX2Noa19kZWZyYWcyM2E6IGRyb3AgcGt0XG4iKTsKIAkJZ290byBfcmVjdl9kYXRhX2Ryb3A7CiAJfQogCkBAIC0yMjM1LDcgKzIyMDUsNyBAQAogCXByZnJhbWUgPSBwb3J0Y3RybChwYWRhcHRlciwgcHJmcmFtZSk7CiAJaWYgKCFwcmZyYW1lKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJwb3J0Y3RybDogZHJvcCBwa3RcbiIpKTsKKwkJCSAicG9ydGN0cmw6IGRyb3AgcGt0XG4iKTsKIAkJcmV0ID0gX0ZBSUw7CiAJCWdvdG8gX3JlY3ZfZGF0YV9kcm9wOwogCX0KQEAgLTIyNDUsNyArMjIxNSw3IEBACiAJcmV0ID0gcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyhwYWRhcHRlciwgcHJmcmFtZSk7CiAJaWYgKHJldCAhPSBfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICgicmVjdl9mdW5jOiBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzIGZhaWwhXG4iKSk7CisJCQkgInJlY3ZfZnVuYzogcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyBmYWlsIVxuIik7CiAJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShvcmlnX3ByZnJhbWUpOy8qIGZyZWUgdGhpcyByZWN2X2ZyYW1lICovCiAJCWdvdG8gX3JlY3ZfZGF0YV9kcm9wOwogCX0KQEAgLTIzMzQsOCArMjMwNCw4IEBACiAKIAkvKiB1cGRhdGUgdmFsdWUgb2Ygc2lnbmFsX3N0cmVuZ3RoLCByc3NpLCBzaWduYWxfcXVhbCAqLwogCWlmICghY2hlY2tfZndzdGF0ZSgmYWRhcHRlci0+bWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7Ci0JCXRtcF9zID0gKGF2Z19zaWduYWxfc3RyZW5ndGggKyAoX2FscGhhIC0gMSkgKgotCQkJIHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGgpOworCQl0bXBfcyA9IGF2Z19zaWduYWxfc3RyZW5ndGggKyAoX2FscGhhIC0gMSkgKgorCQkJIHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGg7CiAJCWlmICh0bXBfcyAlX2FscGhhKQogCQkJdG1wX3MgPSB0bXBfcyAvIF9hbHBoYSArIDE7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYwppbmRleCA3MTVhNDc0Li5hZjUzYzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zZWN1cml0eS5jCkBAIC0zMSwxMSArMzEsMTEgQEAKIAogc3RhdGljIHZvaWQgYXJjZm91cl9pbml0KHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgsIHU4ICprZXksIHUzMiBrZXlfbGVuKQogewotCXUzMgl0LCB1OwotCXUzMglrZXlpbmRleDsKLQl1MzIJc3RhdGVpbmRleDsKKwl1MzIgdCwgdTsKKwl1MzIga2V5aW5kZXg7CisJdTMyIHN0YXRlaW5kZXg7CiAJdTggKnN0YXRlOwotCXUzMgljb3VudGVyOworCXUzMiBjb3VudGVyOwogCiAJc3RhdGUgPSBwYXJjNGN0eC0+c3RhdGU7CiAJcGFyYzRjdHgtPnggPSAwOwpAQCAtNTUsNyArNTUsOCBAQAogCX0KIAogfQotc3RhdGljIHUzMiBhcmNmb3VyX2J5dGUoCXN0cnVjdCBhcmM0Y29udGV4dAkqcGFyYzRjdHgpCisKK3N0YXRpYyB1MzIgYXJjZm91cl9ieXRlKHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgpCiB7CiAJdTMyIHg7CiAJdTMyIHk7CkBAIC03NSwxOSArNzYsMTYgQEAKIAlyZXR1cm4gc3RhdGVbKHN4ICsgc3kpICYgMHhmZl07CiB9CiAKLXN0YXRpYyB2b2lkIGFyY2ZvdXJfZW5jcnlwdCgJc3RydWN0IGFyYzRjb250ZXh0CSpwYXJjNGN0eCwKLQl1OCAqZGVzdCwKLQl1OCAqc3JjLAotCXUzMiBsZW4pCitzdGF0aWMgdm9pZCBhcmNmb3VyX2VuY3J5cHQoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCwgdTggKmRlc3QsCisJCQkgICAgdTggKnNyYywgdTMyIGxlbikKIHsKLQl1MzIJaTsKKwl1MzIgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJZGVzdFtpXSA9IHNyY1tpXSBeICh1bnNpZ25lZCBjaGFyKWFyY2ZvdXJfYnl0ZShwYXJjNGN0eCk7Ci0KIH0KIAotc3RhdGljIGludCBiY3JjMzJpbml0aWFsaXplZCA9IDA7CitzdGF0aWMgaW50IGJjcmMzMmluaXRpYWxpemVkOwogc3RhdGljIHUzMiBjcmMzMl90YWJsZVsyNTZdOwogCiBzdGF0aWMgdTggY3JjMzJfcmV2ZXJzZUJpdCh1OCBkYXRhKQpAQCAtMTAxLDQ2ICs5OSw0OCBAQAogCiBzdGF0aWMgdm9pZCBjcmMzMl9pbml0KHZvaWQpCiB7CisJaW50IGksIGo7CisJdTMyIGM7CisJdTggKnAsICpwMTsKKwl1OCBrOwogCiAJaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDEpCiAJCXJldHVybjsKLQllbHNlewotCQlpbnQgaSwgajsKLQkJdTMyIGM7Ci0JCXU4ICpwID0gKHU4ICopJmMsICpwMTsKLQkJdTggazsKIAotCQljID0gMHgxMjM0MDAwMDsKKwlwID0gKHU4ICopICZjOworCWMgPSAweDEyMzQwMDAwOwogCi0JCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotCQkJayA9IGNyYzMyX3JldmVyc2VCaXQoKHU4KWkpOwotCQkJZm9yIChjID0gKCh1MzIpaykgPDwgMjQsIGogPSA4OyBqID4gMDsgLS1qKSB7Ci0JCQkJYyA9IGMgJiAweDgwMDAwMDAwID8gKGMgPDwgMSkgXiBDUkMzMl9QT0xZIDogKGMgPDwgMSk7Ci0JCQl9Ci0JCQlwMSA9ICh1OCAqKSZjcmMzMl90YWJsZVtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJayA9IGNyYzMyX3JldmVyc2VCaXQoKHU4KWkpOwogCi0JCQlwMVswXSA9IGNyYzMyX3JldmVyc2VCaXQocFszXSk7Ci0JCQlwMVsxXSA9IGNyYzMyX3JldmVyc2VCaXQocFsyXSk7Ci0JCQlwMVsyXSA9IGNyYzMyX3JldmVyc2VCaXQocFsxXSk7Ci0JCQlwMVszXSA9IGNyYzMyX3JldmVyc2VCaXQocFswXSk7Ci0JCX0KLQkJYmNyYzMyaW5pdGlhbGl6ZWQgPSAxOworCQlmb3IgKGMgPSAoKHUzMilrKSA8PCAyNCwgaiA9IDg7IGogPiAwOyAtLWopCisJCQljID0gYyAmIDB4ODAwMDAwMDAgPyAoYyA8PCAxKSBeIENSQzMyX1BPTFkgOiAoYyA8PCAxKTsKKworCQlwMSA9ICh1OCAqKSZjcmMzMl90YWJsZVtpXTsKKworCQlwMVswXSA9IGNyYzMyX3JldmVyc2VCaXQocFszXSk7CisJCXAxWzFdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzJdKTsKKwkJcDFbMl0gPSBjcmMzMl9yZXZlcnNlQml0KHBbMV0pOworCQlwMVszXSA9IGNyYzMyX3JldmVyc2VCaXQocFswXSk7CiAJfQorCisJYmNyYzMyaW5pdGlhbGl6ZWQgPSAxOwogfQogCiBzdGF0aWMgdTMyIGdldGNyYzMyKHU4ICpidWYsIGludCBsZW4pCiB7CiAJdTggKnA7Ci0JdTMyICBjcmM7CisJdTMyIGNyYzsKIAotCWlmIChiY3JjMzJpbml0aWFsaXplZCA9PSAwKSBjcmMzMl9pbml0KCk7CisJaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDApCisJCWNyYzMyX2luaXQoKTsKIAotCWNyYyA9IDB4ZmZmZmZmZmY7ICAgICAgIC8qIHByZWxvYWQgc2hpZnQgcmVnaXN0ZXIsIHBlciBDUkMtMzIgc3BlYyAqLworCWNyYyA9IDB4ZmZmZmZmZmY7IC8qIHByZWxvYWQgc2hpZnQgcmVnaXN0ZXIsIHBlciBDUkMtMzIgc3BlYyAqLwogCiAJZm9yIChwID0gYnVmOyBsZW4gPiAwOyArK3AsIC0tbGVuKQotCQljcmMgPSBjcmMzMl90YWJsZVsgKGNyYyBeICpwKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKKwkJY3JjID0gY3JjMzJfdGFibGVbKGNyYyBeICpwKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKIAotCXJldHVybiB+Y3JjOyAgICAvKiB0cmFuc21pdCBjb21wbGVtZW50LCBwZXIgQ1JDLTMyIHNwZWMgKi8KKwlyZXR1cm4gfmNyYzsgLyogdHJhbnNtaXQgY29tcGxlbWVudCwgcGVyIENSQy0zMiBzcGVjICovCiB9CiAKIC8qIE5lZWQgdG8gY29uc2lkZXIgdGhlIGZyYWdtZW50ICBzaXR1YXRpb24gKi8KQEAgLTE1Miw3ICsxNTIsNyBAQAogCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7CiAJaW50IGN1cmZyYWdudW0sIGxlbmd0aCwgaW5kZXg7CiAJdTMyIGtleWxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcGF5bG9hZCwgKml2OyAgICAvKiB3ZXBrZXkgKi8KKwl1OCAqcGZyYW1lLCAqcGF5bG9hZCwgKml2OyAvKiB3ZXBrZXkgKi8KIAl1OCB3ZXBrZXlbMTZdOwogCXU4IGh3X2hkcl9vZmZzZXQgPSAwOwogCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKQEAgLTE4NCw3ICsxODQsNyBAQAogCQlpZiAoKGN1cmZyYWdudW0gKyAxKSA9PSBwYXR0cmliLT5ucl9mcmFncykgewogCQkJLyogdGhlIGxhc3QgZnJhZ21lbnQgKi8KIAkJCWxlbmd0aCA9IHBhdHRyaWItPmxhc3RfdHhjbWRzeiAtIHBhdHRyaWItPmhkcmxlbiAtCi0JCQkJcGF0dHJpYi0+aXZfbGVuLSBwYXR0cmliLT5pY3ZfbGVuOworCQkJCXBhdHRyaWItPml2X2xlbiAtIHBhdHRyaWItPmljdl9sZW47CiAKIAkJCSooKHUzMiAqKWNyYykgPSBjcHVfdG9fbGUzMihnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGgpKTsKIApAQCAtMjEwLDcgKzIxMCw3IEBACiAJCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7CiAJLyogIGV4Y2x1ZGUgSUNWICovCi0JdTggY3JjWzRdOworCXUzMiBhY3R1YWxfY3JjLCBleHBlY3RlZF9jcmM7CiAJc3RydWN0IGFyYzRjb250ZXh0IG15Y29udGV4dDsKIAlpbnQgbGVuZ3RoOwogCXUzMiBrZXlsZW5ndGg7CkBAIC0yNDMsMTkgKzI0MywxNCBAQAogCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwogCiAJLyogY2FsY3VsYXRlIGljdiBhbmQgY29tcGFyZSB0aGUgaWN2ICovCi0JKigodTMyICopY3JjKSA9IGxlMzJfdG9fY3B1KGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCAtIDQpKTsKKwlhY3R1YWxfY3JjID0gbGUzMl90b19jcHUoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoIC0gNCkpOworCWV4cGVjdGVkX2NyYyA9IGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWRfbGUzMigmcGF5bG9hZFtsZW5ndGggLSA0XSkpOwogCi0JaWYgKGNyY1szXSAhPSBwYXlsb2FkW2xlbmd0aCAtIDFdIHx8IGNyY1syXSAhPSBwYXlsb2FkW2xlbmd0aCAtIDJdIHx8Ci0JICAgIGNyY1sxXSAhPSBwYXlsb2FkW2xlbmd0aCAtIDNdIHx8IGNyY1swXSAhPSBwYXlsb2FkW2xlbmd0aCAtIDRdKSB7CisJaWYgKGFjdHVhbF9jcmMgIT0gZXhwZWN0ZWRfY3JjKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X3dlcF9kZWNyeXB0MjNhOmljdiBlcnJvciBjcmNbM10oJXgpIT0gcGF5bG9hZCIKLQkJCSAgIltsZW5ndGgtMV0oJXgpIHx8IGNyY1syXSgleCkhPSBwYXlsb2FkW2xlbmd0aC0yXSgleCkiCi0JCQkgICIgfHwgY3JjWzFdKCV4KSE9IHBheWxvYWRbbGVuZ3RoLTNdKCV4KSB8fCBjcmNbMF0oJXgpIgotCQkJICAiIT0gcGF5bG9hZFtsZW5ndGgtNF0oJXgpXG4iLAotCQkJICBjcmNbM10sIHBheWxvYWRbbGVuZ3RoIC0gMV0sCi0JCQkgIGNyY1syXSwgcGF5bG9hZFtsZW5ndGggLSAyXSwKLQkJCSAgY3JjWzFdLCBwYXlsb2FkW2xlbmd0aCAtIDNdLAotCQkJICBjcmNbMF0sIHBheWxvYWRbbGVuZ3RoIC0gNF0pKTsKKwkJCSAiJXM6aWN2IENSQyBtaXNtYXRjaDogIgorCQkJICJhY3R1YWw6ICUwOHgsIGV4cGVjdGVkOiAlMDh4XG4iLAorCQkJIF9fZnVuY19fLCBhY3R1YWxfY3JjLCBleHBlY3RlZF9jcmMpOwogCX0KIH0KIApAQCAtMjY3LDkgKzI2Miw4IEBACiAJczMyIGk7CiAJdTMyIHJlcyA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpPDQ7IGkrKykgewotCQlyZXMgfD0gKCh1MzIpKCpwKyspKSA8PCAoOCppKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJcmVzIHw9ICgodTMyKSgqcCsrKSkgPDwgKDggKiBpKTsKIAogCXJldHVybiByZXM7CiB9CkBAIC0yNzksNyArMjczLDcgQEAKIHsKIAlsb25nIGk7CiAKLQlmb3IgKGkgPSAwOyBpPDQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJKnArKyA9ICh1OCkgKHZhbCAmIDB4ZmYpOwogCQl2YWwgPj49IDg7CiAJfQpAQCAtMzEyLDcgKzMwNiw3IEBACiB7CiAKIAkvKiAgQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlciAqLwotCXBtaWNkYXRhLT5NIHw9ICgodW5zaWduZWQgbG9uZyliKSA8PCAoOCpwbWljZGF0YS0+bkJ5dGVzSW5NKTsKKwlwbWljZGF0YS0+TSB8PSAoKHVuc2lnbmVkIGxvbmcpYikgPDwgKDggKiBwbWljZGF0YS0+bkJ5dGVzSW5NKTsKIAlwbWljZGF0YS0+bkJ5dGVzSW5NKys7CiAJLyogIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4gKi8KIAlpZiAocG1pY2RhdGEtPm5CeXRlc0luTSA+PSA0KSB7CkBAIC0zMzYsNyArMzMwLDcgQEAKIHsKIAogCS8qICBUaGlzIGlzIHNpbXBsZSAqLwotCXdoaWxlKG5ieXRlcyA+IDApIHsKKwl3aGlsZSAobmJ5dGVzID4gMCkgewogCQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgKnNyYysrKTsKIAkJbmJ5dGVzLS07CiAJfQpAQCAtMzUzLDEyICszNDcsMTEgQEAKIAlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7CiAJcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDApOwogCS8qICBhbmQgdGhlbiB6ZXJvZXMgdW50aWwgdGhlIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDQgKi8KLQl3aGlsZShwbWljZGF0YS0+bkJ5dGVzSW5NICE9IDApIHsKKwl3aGlsZSAocG1pY2RhdGEtPm5CeXRlc0luTSAhPSAwKQogCQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7Ci0JfQogCS8qICBUaGUgYXBwZW5kQnl0ZSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVzdWx0LiAqLwogCXNlY21pY3B1dHVpbnQzMihkc3QsIHBtaWNkYXRhLT5MKTsKLQlzZWNtaWNwdXR1aW50MzIoZHN0KzQsIHBtaWNkYXRhLT5SKTsKKwlzZWNtaWNwdXR1aW50MzIoZHN0ICsgNCwgcG1pY2RhdGEtPlIpOwogCS8qICBSZXNldCB0byB0aGUgZW1wdHkgbWVzc2FnZS4gKi8KIAlzZWNtaWNjbGVhcihwbWljZGF0YSk7CiAKQEAgLTM2OCwyMyArMzYxLDIyIEBACiAJCQkgICB1OCAqbWljX2NvZGUsIHU4IHByaSkKIHsKIAotCXN0cnVjdCBtaWNfZGF0YQltaWNkYXRhOwotCXU4IHByaW9yaXR5WzRdPXsweDAsIDB4MCwgMHgwLCAweDB9OworCXN0cnVjdCBtaWNfZGF0YSBtaWNkYXRhOworCXU4IHByaW9yaXR5WzRdID0gezB4MCwgMHgwLCAweDAsIDB4MH07CiAKIAlydHdfc2VjbWljc2V0a2V5MjNhKCZtaWNkYXRhLCBrZXkpOwotCXByaW9yaXR5WzBdPSBwcmk7CisJcHJpb3JpdHlbMF0gPSBwcmk7CiAKIAkvKiBNaWNoYWVsIE1JQyBwc2V1ZG8gaGVhZGVyOiBEQSwgU0EsIDMgeCAwLCBQcmlvcml0eSAqLwotCWlmIChoZWFkZXJbMV0mMSkgeyAgIC8qIFRvRFMgPT0gMSAqLwotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxNl0sIDYpOyAgLyogREEgKi8KLQkJaWYgKGhlYWRlclsxXSYyKSAgLyogRnJvbSBEcyA9PSAxICovCisJaWYgKGhlYWRlclsxXSYxKSB7IC8qIFRvRFMgPT0gMSAqLworCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxNl0sIDYpOyAvKiBEQSAqLworCQlpZiAoaGVhZGVyWzFdJjIpIC8qIEZyb20gRHMgPT0gMSAqLwogCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsyNF0sIDYpOwogCQllbHNlCiAJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzEwXSwgNik7Ci0JfQotCWVsc2V7CS8qIFRvRFMgPT0gMCAqLwotCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzRdLCA2KTsgICAvKiBEQSAqLwotCQlpZiAoaGVhZGVyWzFdJjIpICAvKiBGcm9tIERzID09IDEgKi8KKwl9IGVsc2UgeyAvKiBUb0RTID09IDAgKi8KKwkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlcls0XSwgNik7IC8qIERBICovCisJCWlmIChoZWFkZXJbMV0mMikgLyogRnJvbSBEcyA9PSAxICovCiAJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzE2XSwgNik7CiAJCWVsc2UKIAkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbMTBdLCA2KTsKQEAgLTQwMywxMSArMzk1LDExIEBACiAjZGVmaW5lICAgTG84KHYxNikgICAoKHU4KSgodjE2KSAgICAgICAmIDB4MDBGRikpCiAjZGVmaW5lICAgSGk4KHYxNikgICAoKHU4KSgoKHYxNikgPj4gOCkgJiAweDAwRkYpKQogI2RlZmluZSAgTG8xNih2MzIpICAgKCh1MTYpKCh2MzIpICAgICAgICYgMHhGRkZGKSkKLSNkZWZpbmUgIEhpMTYodjMyKSAgICgodTE2KSgoKHYzMikgPj4xNikgJiAweEZGRkYpKQorI2RlZmluZSAgSGkxNih2MzIpICAgKCh1MTYpKCgodjMyKSA+PiAxNikgJiAweEZGRkYpKQogI2RlZmluZSAgTWsxNihoaSwgbG8pICgobG8pIF4gKCgodTE2KShoaSkpIDw8IDgpKQogCi0vKiBzZWxlY3QgdGhlIE50aCAxNi1iaXQgd29yZCBvZiB0aGUgdGVtcG9yYWwga2V5IHVuc2lnbmVkIGNoYXIgYXJyYXkgVEtbXSAgICovCi0jZGVmaW5lICBUSzE2KE4pICAgICBNazE2KHRrWzIqKE4pKzFdLCB0a1syKihOKV0pCisvKiBzZWxlY3QgdGhlIE50aCAxNi1iaXQgd29yZCBvZiB0aGUgdGVtcG9yYWwga2V5IHVuc2lnbmVkIGNoYXIgYXJyYXkgVEtbXSAqLworI2RlZmluZSAgVEsxNihOKSAgICAgTWsxNih0a1syICogKE4pICsgMV0sIHRrWzIgKiAoTildKQogCiAvKiBTLWJveCBsb29rdXA6IDE2IGJpdHMgLS0+IDE2IGJpdHMgKi8KICNkZWZpbmUgX1NfKHYxNikgICAgIChTYm94MVswXVtMbzgodjE2KV0gXiBTYm94MVsxXVtIaTgodjE2KV0pCkBAIC00MjAsNzYgKzQxMiw3NiBAQAogI2RlZmluZSBSQzRfS0VZX1NJWkUgICAgIDE2ICAgIC8qIDEyOC1iaXQgUkM0S0VZICgxMDQgYml0cyB1bmtub3duKSAqLwogCiAvKiAyLXVuc2lnbmVkIGNoYXIgYnkgMi11bnNpZ25lZCBjaGFyIHN1YnNldCBvZiB0aGUgZnVsbCBBRVMgUy1ib3ggdGFibGUgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTYm94MVsyXVsyNTZdPSAgICAgICAvKiBTYm94IGZvciBoYXNoIChjYW4gYmUgaW4gUk9NKSAgICAgKi8KLXsgewotICAgMHhDNkE1LCAweEY4ODQsIDB4RUU5OSwgMHhGNjhELCAweEZGMEQsIDB4RDZCRCwgMHhERUIxLCAweDkxNTQsCi0gICAweDYwNTAsIDB4MDIwMywgMHhDRUE5LCAweDU2N0QsIDB4RTcxOSwgMHhCNTYyLCAweDRERTYsIDB4RUM5QSwKLSAgIDB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAotICAgMHg0MUVDLCAweEIzNjcsIDB4NUZGRCwgMHg0NUVBLCAweDIzQkYsIDB4NTNGNywgMHhFNDk2LCAweDlCNUIsCi0gICAweDc1QzIsIDB4RTExQywgMHgzREFFLCAweDRDNkEsIDB4NkM1QSwgMHg3RTQxLCAweEY1MDIsIDB4ODM0RiwKLSAgIDB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAotICAgMHgwODBDLCAweDk1NTIsIDB4NDY2NSwgMHg5RDVFLCAweDMwMjgsIDB4MzdBMSwgMHgwQTBGLCAweDJGQjUsCi0gICAweDBFMDksIDB4MjQzNiwgMHgxQjlCLCAweERGM0QsIDB4Q0QyNiwgMHg0RTY5LCAweDdGQ0QsIDB4RUE5RiwKLSAgIDB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAotICAgMHhBNEY2LCAweDc2NEQsIDB4Qjc2MSwgMHg3RENFLCAweDUyN0IsIDB4REQzRSwgMHg1RTcxLCAweDEzOTcsCi0gICAweEE2RjUsIDB4Qjk2OCwgMHgwMDAwLCAweEMxMkMsIDB4NDA2MCwgMHhFMzFGLCAweDc5QzgsIDB4QjZFRCwKLSAgIDB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAotICAgMHhCQjZCLCAweEM1MkEsIDB4NEZFNSwgMHhFRDE2LCAweDg2QzUsIDB4OUFENywgMHg2NjU1LCAweDExOTQsCi0gICAweDhBQ0YsIDB4RTkxMCwgMHgwNDA2LCAweEZFODEsIDB4QTBGMCwgMHg3ODQ0LCAweDI1QkEsIDB4NEJFMywKLSAgIDB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAotICAgMHg2M0RGLCAweDc3QzEsIDB4QUY3NSwgMHg0MjYzLCAweDIwMzAsIDB4RTUxQSwgMHhGRDBFLCAweEJGNkQsCi0gICAweDgxNEMsIDB4MTgxNCwgMHgyNjM1LCAweEMzMkYsIDB4QkVFMSwgMHgzNUEyLCAweDg4Q0MsIDB4MkUzOSwKLSAgIDB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAotICAgMHhDMEEwLCAweDE5OTgsIDB4OUVEMSwgMHhBMzdGLCAweDQ0NjYsIDB4NTQ3RSwgMHgzQkFCLCAweDBCODMsCi0gICAweDhDQ0EsIDB4QzcyOSwgMHg2QkQzLCAweDI4M0MsIDB4QTc3OSwgMHhCQ0UyLCAweDE2MUQsIDB4QUQ3NiwKLSAgIDB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAotICAgMHg5RjVELCAweEJENkUsIDB4NDNFRiwgMHhDNEE2LCAweDM5QTgsIDB4MzFBNCwgMHhEMzM3LCAweEYyOEIsCi0gICAweEQ1MzIsIDB4OEI0MywgMHg2RTU5LCAweERBQjcsIDB4MDE4QywgMHhCMTY0LCAweDlDRDIsIDB4NDlFMCwKLSAgIDB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAotICAgMHg2RkQ1LCAweEYwODgsIDB4NEE2RiwgMHg1QzcyLCAweDM4MjQsIDB4NTdGMSwgMHg3M0M3LCAweDk3NTEsCi0gICAweENCMjMsIDB4QTE3QywgMHhFODlDLCAweDNFMjEsIDB4OTZERCwgMHg2MURDLCAweDBEODYsIDB4MEY4NSwKLSAgIDB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAotICAgMHhDMkEzLCAweDZBNUYsIDB4QUVGOSwgMHg2OUQwLCAweDE3OTEsIDB4OTk1OCwgMHgzQTI3LCAweDI3QjksCi0gICAweEQ5MzgsIDB4RUIxMywgMHgyQkIzLCAweDIyMzMsIDB4RDJCQiwgMHhBOTcwLCAweDA3ODksIDB4MzNBNywKLSAgIDB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAotICAgMHgwMzhGLCAweDU5RjgsIDB4MDk4MCwgMHgxQTE3LCAweDY1REEsIDB4RDczMSwgMHg4NEM2LCAweEQwQjgsCi0gICAweDgyQzMsIDB4MjlCMCwgMHg1QTc3LCAweDFFMTEsIDB4N0JDQiwgMHhBOEZDLCAweDZERDYsIDB4MkMzQSwKLSAgfSwKLQotICB7ICAvKiBzZWNvbmQgaGFsZiBvZiB0YWJsZSBpcyB1bnNpZ25lZCBjaGFyLXJldmVyc2VkIHZlcnNpb24gb2YgZmlyc3QhICovCi0gICAweEE1QzYsIDB4ODRGOCwgMHg5OUVFLCAweDhERjYsIDB4MERGRiwgMHhCREQ2LCAweEIxREUsIDB4NTQ5MSwKLSAgIDB4NTA2MCwgMHgwMzAyLCAweEE5Q0UsIDB4N0Q1NiwgMHgxOUU3LCAweDYyQjUsIDB4RTY0RCwgMHg5QUVDLAotICAgMHg0NThGLCAweDlEMUYsIDB4NDA4OSwgMHg4N0ZBLCAweDE1RUYsIDB4RUJCMiwgMHhDOThFLCAweDBCRkIsCi0gICAweEVDNDEsIDB4NjdCMywgMHhGRDVGLCAweEVBNDUsIDB4QkYyMywgMHhGNzUzLCAweDk2RTQsIDB4NUI5QiwKLSAgIDB4QzI3NSwgMHgxQ0UxLCAweEFFM0QsIDB4NkE0QywgMHg1QTZDLCAweDQxN0UsIDB4MDJGNSwgMHg0RjgzLAotICAgMHg1QzY4LCAweEY0NTEsIDB4MzREMSwgMHgwOEY5LCAweDkzRTIsIDB4NzNBQiwgMHg1MzYyLCAweDNGMkEsCi0gICAweDBDMDgsIDB4NTI5NSwgMHg2NTQ2LCAweDVFOUQsIDB4MjgzMCwgMHhBMTM3LCAweDBGMEEsIDB4QjUyRiwKLSAgIDB4MDkwRSwgMHgzNjI0LCAweDlCMUIsIDB4M0RERiwgMHgyNkNELCAweDY5NEUsIDB4Q0Q3RiwgMHg5RkVBLAotICAgMHgxQjEyLCAweDlFMUQsIDB4NzQ1OCwgMHgyRTM0LCAweDJEMzYsIDB4QjJEQywgMHhFRUI0LCAweEZCNUIsCi0gICAweEY2QTQsIDB4NEQ3NiwgMHg2MUI3LCAweENFN0QsIDB4N0I1MiwgMHgzRURELCAweDcxNUUsIDB4OTcxMywKLSAgIDB4RjVBNiwgMHg2OEI5LCAweDAwMDAsIDB4MkNDMSwgMHg2MDQwLCAweDFGRTMsIDB4Qzg3OSwgMHhFREI2LAotICAgMHhCRUQ0LCAweDQ2OEQsIDB4RDk2NywgMHg0QjcyLCAweERFOTQsIDB4RDQ5OCwgMHhFOEIwLCAweDRBODUsCi0gICAweDZCQkIsIDB4MkFDNSwgMHhFNTRGLCAweDE2RUQsIDB4QzU4NiwgMHhENzlBLCAweDU1NjYsIDB4OTQxMSwKLSAgIDB4Q0Y4QSwgMHgxMEU5LCAweDA2MDQsIDB4ODFGRSwgMHhGMEEwLCAweDQ0NzgsIDB4QkEyNSwgMHhFMzRCLAotICAgMHhGM0EyLCAweEZFNUQsIDB4QzA4MCwgMHg4QTA1LCAweEFEM0YsIDB4QkMyMSwgMHg0ODcwLCAweDA0RjEsCi0gICAweERGNjMsIDB4QzE3NywgMHg3NUFGLCAweDYzNDIsIDB4MzAyMCwgMHgxQUU1LCAweDBFRkQsIDB4NkRCRiwKLSAgIDB4NEM4MSwgMHgxNDE4LCAweDM1MjYsIDB4MkZDMywgMHhFMUJFLCAweEEyMzUsIDB4Q0M4OCwgMHgzOTJFLAotICAgMHg1NzkzLCAweEYyNTUsIDB4ODJGQywgMHg0NzdBLCAweEFDQzgsIDB4RTdCQSwgMHgyQjMyLCAweDk1RTYsCi0gICAweEEwQzAsIDB4OTgxOSwgMHhEMTlFLCAweDdGQTMsIDB4NjY0NCwgMHg3RTU0LCAweEFCM0IsIDB4ODMwQiwKLSAgIDB4Q0E4QywgMHgyOUM3LCAweEQzNkIsIDB4M0MyOCwgMHg3OUE3LCAweEUyQkMsIDB4MUQxNiwgMHg3NkFELAotICAgMHgzQkRCLCAweDU2NjQsIDB4NEU3NCwgMHgxRTE0LCAweERCOTIsIDB4MEEwQywgMHg2QzQ4LCAweEU0QjgsCi0gICAweDVEOUYsIDB4NkVCRCwgMHhFRjQzLCAweEE2QzQsIDB4QTgzOSwgMHhBNDMxLCAweDM3RDMsIDB4OEJGMiwKLSAgIDB4MzJENSwgMHg0MzhCLCAweDU5NkUsIDB4QjdEQSwgMHg4QzAxLCAweDY0QjEsIDB4RDI5QywgMHhFMDQ5LAotICAgMHhCNEQ4LCAweEZBQUMsIDB4MDdGMywgMHgyNUNGLCAweEFGQ0EsIDB4OEVGNCwgMHhFOTQ3LCAweDE4MTAsCi0gICAweEQ1NkYsIDB4ODhGMCwgMHg2RjRBLCAweDcyNUMsIDB4MjQzOCwgMHhGMTU3LCAweEM3NzMsIDB4NTE5NywKLSAgIDB4MjNDQiwgMHg3Q0ExLCAweDlDRTgsIDB4MjEzRSwgMHhERDk2LCAweERDNjEsIDB4ODYwRCwgMHg4NTBGLAotICAgMHg5MEUwLCAweDQyN0MsIDB4QzQ3MSwgMHhBQUNDLCAweEQ4OTAsIDB4MDUwNiwgMHgwMUY3LCAweDEyMUMsCi0gICAweEEzQzIsIDB4NUY2QSwgMHhGOUFFLCAweEQwNjksIDB4OTExNywgMHg1ODk5LCAweDI3M0EsIDB4QjkyNywKLSAgIDB4MzhEOSwgMHgxM0VCLCAweEIzMkIsIDB4MzMyMiwgMHhCQkQyLCAweDcwQTksIDB4ODkwNywgMHhBNzMzLAotICAgMHhCNjJELCAweDIyM0MsIDB4OTIxNSwgMHgyMEM5LCAweDQ5ODcsIDB4RkZBQSwgMHg3ODUwLCAweDdBQTUsCi0gICAweDhGMDMsIDB4Rjg1OSwgMHg4MDA5LCAweDE3MUEsIDB4REE2NSwgMHgzMUQ3LCAweEM2ODQsIDB4QjhEMCwKLSAgIDB4QzM4MiwgMHhCMDI5LCAweDc3NUEsIDB4MTExRSwgMHhDQjdCLCAweEZDQTgsIDB4RDY2RCwgMHgzQTJDLAotICB9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgU2JveDFbMl1bMjU2XSA9IHsKKwkvKiBTYm94IGZvciBoYXNoIChjYW4gYmUgaW4gUk9NKSAqLworCXsKKwkJMHhDNkE1LCAweEY4ODQsIDB4RUU5OSwgMHhGNjhELCAweEZGMEQsIDB4RDZCRCwgMHhERUIxLCAweDkxNTQsCisJCTB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAorCQkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKKwkJMHg0MUVDLCAweEIzNjcsIDB4NUZGRCwgMHg0NUVBLCAweDIzQkYsIDB4NTNGNywgMHhFNDk2LCAweDlCNUIsCisJCTB4NzVDMiwgMHhFMTFDLCAweDNEQUUsIDB4NEM2QSwgMHg2QzVBLCAweDdFNDEsIDB4RjUwMiwgMHg4MzRGLAorCQkweDY4NUMsIDB4NTFGNCwgMHhEMTM0LCAweEY5MDgsIDB4RTI5MywgMHhBQjczLCAweDYyNTMsIDB4MkEzRiwKKwkJMHgwODBDLCAweDk1NTIsIDB4NDY2NSwgMHg5RDVFLCAweDMwMjgsIDB4MzdBMSwgMHgwQTBGLCAweDJGQjUsCisJCTB4MEUwOSwgMHgyNDM2LCAweDFCOUIsIDB4REYzRCwgMHhDRDI2LCAweDRFNjksIDB4N0ZDRCwgMHhFQTlGLAorCQkweDEyMUIsIDB4MUQ5RSwgMHg1ODc0LCAweDM0MkUsIDB4MzYyRCwgMHhEQ0IyLCAweEI0RUUsIDB4NUJGQiwKKwkJMHhBNEY2LCAweDc2NEQsIDB4Qjc2MSwgMHg3RENFLCAweDUyN0IsIDB4REQzRSwgMHg1RTcxLCAweDEzOTcsCisJCTB4QTZGNSwgMHhCOTY4LCAweDAwMDAsIDB4QzEyQywgMHg0MDYwLCAweEUzMUYsIDB4NzlDOCwgMHhCNkVELAorCQkweEQ0QkUsIDB4OEQ0NiwgMHg2N0Q5LCAweDcyNEIsIDB4OTRERSwgMHg5OEQ0LCAweEIwRTgsIDB4ODU0QSwKKwkJMHhCQjZCLCAweEM1MkEsIDB4NEZFNSwgMHhFRDE2LCAweDg2QzUsIDB4OUFENywgMHg2NjU1LCAweDExOTQsCisJCTB4OEFDRiwgMHhFOTEwLCAweDA0MDYsIDB4RkU4MSwgMHhBMEYwLCAweDc4NDQsIDB4MjVCQSwgMHg0QkUzLAorCQkweEEyRjMsIDB4NURGRSwgMHg4MEMwLCAweDA1OEEsIDB4M0ZBRCwgMHgyMUJDLCAweDcwNDgsIDB4RjEwNCwKKwkJMHg2M0RGLCAweDc3QzEsIDB4QUY3NSwgMHg0MjYzLCAweDIwMzAsIDB4RTUxQSwgMHhGRDBFLCAweEJGNkQsCisJCTB4ODE0QywgMHgxODE0LCAweDI2MzUsIDB4QzMyRiwgMHhCRUUxLCAweDM1QTIsIDB4ODhDQywgMHgyRTM5LAorCQkweDkzNTcsIDB4NTVGMiwgMHhGQzgyLCAweDdBNDcsIDB4QzhBQywgMHhCQUU3LCAweDMyMkIsIDB4RTY5NSwKKwkJMHhDMEEwLCAweDE5OTgsIDB4OUVEMSwgMHhBMzdGLCAweDQ0NjYsIDB4NTQ3RSwgMHgzQkFCLCAweDBCODMsCisJCTB4OENDQSwgMHhDNzI5LCAweDZCRDMsIDB4MjgzQywgMHhBNzc5LCAweEJDRTIsIDB4MTYxRCwgMHhBRDc2LAorCQkweERCM0IsIDB4NjQ1NiwgMHg3NDRFLCAweDE0MUUsIDB4OTJEQiwgMHgwQzBBLCAweDQ4NkMsIDB4QjhFNCwKKwkJMHg5RjVELCAweEJENkUsIDB4NDNFRiwgMHhDNEE2LCAweDM5QTgsIDB4MzFBNCwgMHhEMzM3LCAweEYyOEIsCisJCTB4RDUzMiwgMHg4QjQzLCAweDZFNTksIDB4REFCNywgMHgwMThDLCAweEIxNjQsIDB4OUNEMiwgMHg0OUUwLAorCQkweEQ4QjQsIDB4QUNGQSwgMHhGMzA3LCAweENGMjUsIDB4Q0FBRiwgMHhGNDhFLCAweDQ3RTksIDB4MTAxOCwKKwkJMHg2RkQ1LCAweEYwODgsIDB4NEE2RiwgMHg1QzcyLCAweDM4MjQsIDB4NTdGMSwgMHg3M0M3LCAweDk3NTEsCisJCTB4Q0IyMywgMHhBMTdDLCAweEU4OUMsIDB4M0UyMSwgMHg5NkRELCAweDYxREMsIDB4MEQ4NiwgMHgwRjg1LAorCQkweEUwOTAsIDB4N0M0MiwgMHg3MUM0LCAweENDQUEsIDB4OTBEOCwgMHgwNjA1LCAweEY3MDEsIDB4MUMxMiwKKwkJMHhDMkEzLCAweDZBNUYsIDB4QUVGOSwgMHg2OUQwLCAweDE3OTEsIDB4OTk1OCwgMHgzQTI3LCAweDI3QjksCisJCTB4RDkzOCwgMHhFQjEzLCAweDJCQjMsIDB4MjIzMywgMHhEMkJCLCAweEE5NzAsIDB4MDc4OSwgMHgzM0E3LAorCQkweDJEQjYsIDB4M0MyMiwgMHgxNTkyLCAweEM5MjAsIDB4ODc0OSwgMHhBQUZGLCAweDUwNzgsIDB4QTU3QSwKKwkJMHgwMzhGLCAweDU5RjgsIDB4MDk4MCwgMHgxQTE3LCAweDY1REEsIDB4RDczMSwgMHg4NEM2LCAweEQwQjgsCisJCTB4ODJDMywgMHgyOUIwLCAweDVBNzcsIDB4MUUxMSwgMHg3QkNCLCAweEE4RkMsIDB4NkRENiwgMHgyQzNBLAorCX0sCisJeyAvKiBzZWNvbmQgaGFsZiBvZiB0YWJsZSBpcyB1bnNpZ25lZCBjaGFyLXJldmVyc2VkIHZlcnNpb24gb2YgZmlyc3QhICovCisJCTB4QTVDNiwgMHg4NEY4LCAweDk5RUUsIDB4OERGNiwgMHgwREZGLCAweEJERDYsIDB4QjFERSwgMHg1NDkxLAorCQkweDUwNjAsIDB4MDMwMiwgMHhBOUNFLCAweDdENTYsIDB4MTlFNywgMHg2MkI1LCAweEU2NEQsIDB4OUFFQywKKwkJMHg0NThGLCAweDlEMUYsIDB4NDA4OSwgMHg4N0ZBLCAweDE1RUYsIDB4RUJCMiwgMHhDOThFLCAweDBCRkIsCisJCTB4RUM0MSwgMHg2N0IzLCAweEZENUYsIDB4RUE0NSwgMHhCRjIzLCAweEY3NTMsIDB4OTZFNCwgMHg1QjlCLAorCQkweEMyNzUsIDB4MUNFMSwgMHhBRTNELCAweDZBNEMsIDB4NUE2QywgMHg0MTdFLCAweDAyRjUsIDB4NEY4MywKKwkJMHg1QzY4LCAweEY0NTEsIDB4MzREMSwgMHgwOEY5LCAweDkzRTIsIDB4NzNBQiwgMHg1MzYyLCAweDNGMkEsCisJCTB4MEMwOCwgMHg1Mjk1LCAweDY1NDYsIDB4NUU5RCwgMHgyODMwLCAweEExMzcsIDB4MEYwQSwgMHhCNTJGLAorCQkweDA5MEUsIDB4MzYyNCwgMHg5QjFCLCAweDNEREYsIDB4MjZDRCwgMHg2OTRFLCAweENEN0YsIDB4OUZFQSwKKwkJMHgxQjEyLCAweDlFMUQsIDB4NzQ1OCwgMHgyRTM0LCAweDJEMzYsIDB4QjJEQywgMHhFRUI0LCAweEZCNUIsCisJCTB4RjZBNCwgMHg0RDc2LCAweDYxQjcsIDB4Q0U3RCwgMHg3QjUyLCAweDNFREQsIDB4NzE1RSwgMHg5NzEzLAorCQkweEY1QTYsIDB4NjhCOSwgMHgwMDAwLCAweDJDQzEsIDB4NjA0MCwgMHgxRkUzLCAweEM4NzksIDB4RURCNiwKKwkJMHhCRUQ0LCAweDQ2OEQsIDB4RDk2NywgMHg0QjcyLCAweERFOTQsIDB4RDQ5OCwgMHhFOEIwLCAweDRBODUsCisJCTB4NkJCQiwgMHgyQUM1LCAweEU1NEYsIDB4MTZFRCwgMHhDNTg2LCAweEQ3OUEsIDB4NTU2NiwgMHg5NDExLAorCQkweENGOEEsIDB4MTBFOSwgMHgwNjA0LCAweDgxRkUsIDB4RjBBMCwgMHg0NDc4LCAweEJBMjUsIDB4RTM0QiwKKwkJMHhGM0EyLCAweEZFNUQsIDB4QzA4MCwgMHg4QTA1LCAweEFEM0YsIDB4QkMyMSwgMHg0ODcwLCAweDA0RjEsCisJCTB4REY2MywgMHhDMTc3LCAweDc1QUYsIDB4NjM0MiwgMHgzMDIwLCAweDFBRTUsIDB4MEVGRCwgMHg2REJGLAorCQkweDRDODEsIDB4MTQxOCwgMHgzNTI2LCAweDJGQzMsIDB4RTFCRSwgMHhBMjM1LCAweENDODgsIDB4MzkyRSwKKwkJMHg1NzkzLCAweEYyNTUsIDB4ODJGQywgMHg0NzdBLCAweEFDQzgsIDB4RTdCQSwgMHgyQjMyLCAweDk1RTYsCisJCTB4QTBDMCwgMHg5ODE5LCAweEQxOUUsIDB4N0ZBMywgMHg2NjQ0LCAweDdFNTQsIDB4QUIzQiwgMHg4MzBCLAorCQkweENBOEMsIDB4MjlDNywgMHhEMzZCLCAweDNDMjgsIDB4NzlBNywgMHhFMkJDLCAweDFEMTYsIDB4NzZBRCwKKwkJMHgzQkRCLCAweDU2NjQsIDB4NEU3NCwgMHgxRTE0LCAweERCOTIsIDB4MEEwQywgMHg2QzQ4LCAweEU0QjgsCisJCTB4NUQ5RiwgMHg2RUJELCAweEVGNDMsIDB4QTZDNCwgMHhBODM5LCAweEE0MzEsIDB4MzdEMywgMHg4QkYyLAorCQkweDMyRDUsIDB4NDM4QiwgMHg1OTZFLCAweEI3REEsIDB4OEMwMSwgMHg2NEIxLCAweEQyOUMsIDB4RTA0OSwKKwkJMHhCNEQ4LCAweEZBQUMsIDB4MDdGMywgMHgyNUNGLCAweEFGQ0EsIDB4OEVGNCwgMHhFOTQ3LCAweDE4MTAsCisJCTB4RDU2RiwgMHg4OEYwLCAweDZGNEEsIDB4NzI1QywgMHgyNDM4LCAweEYxNTcsIDB4Qzc3MywgMHg1MTk3LAorCQkweDIzQ0IsIDB4N0NBMSwgMHg5Q0U4LCAweDIxM0UsIDB4REQ5NiwgMHhEQzYxLCAweDg2MEQsIDB4ODUwRiwKKwkJMHg5MEUwLCAweDQyN0MsIDB4QzQ3MSwgMHhBQUNDLCAweEQ4OTAsIDB4MDUwNiwgMHgwMUY3LCAweDEyMUMsCisJCTB4QTNDMiwgMHg1RjZBLCAweEY5QUUsIDB4RDA2OSwgMHg5MTE3LCAweDU4OTksIDB4MjczQSwgMHhCOTI3LAorCQkweDM4RDksIDB4MTNFQiwgMHhCMzJCLCAweDMzMjIsIDB4QkJEMiwgMHg3MEE5LCAweDg5MDcsIDB4QTczMywKKwkJMHhCNjJELCAweDIyM0MsIDB4OTIxNSwgMHgyMEM5LCAweDQ5ODcsIDB4RkZBQSwgMHg3ODUwLCAweDdBQTUsCisJCTB4OEYwMywgMHhGODU5LCAweDgwMDksIDB4MTcxQSwgMHhEQTY1LCAweDMxRDcsIDB4QzY4NCwgMHhCOEQwLAorCQkweEMzODIsIDB4QjAyOSwgMHg3NzVBLCAweDExMUUsIDB4Q0I3QiwgMHhGQ0E4LCAweEQ2NkQsIDB4M0EyQywKKwl9CiB9OwogCiAgLyoKQEAgLTUxMyw3ICs1MDUsNyBAQAogewogCWludCAgaTsKIAotCS8qIEluaXRpYWxpemUgdGhlIDgwIGJpdHMgb2YgUDFLW10gZnJvbSBJVjMyIGFuZCBUQVswLi41XSAgICAgKi8KKwkvKiBJbml0aWFsaXplIHRoZSA4MCBiaXRzIG9mIFAxS1tdIGZyb20gSVYzMiBhbmQgVEFbMC4uNV0gKi8KIAlwMWtbMF0gICAgICA9IExvMTYoaXYzMik7CiAJcDFrWzFdICAgICAgPSBIaTE2KGl2MzIpOwogCXAxa1syXSAgICAgID0gTWsxNih0YVsxXSwgdGFbMF0pOyAvKiB1c2UgVEFbXSBhcyBsaXR0bGUtZW5kaWFuICovCkBAIC01MjIsMTQgKzUxNCwxNCBAQAogCiAJLyogTm93IGNvbXB1dGUgYW4gdW5iYWxhbmNlZCBGZWlzdGVsIGNpcGhlciB3aXRoIDgwLWJpdCBibG9jayAqLwogCS8qIHNpemUgb24gdGhlIDgwLWJpdCBibG9jayBQMUtbXSwgdXNpbmcgdGhlIDEyOC1iaXQga2V5IFRLW10gKi8KLQlmb3IgKGkgPSAwOyBpIDwgUEhBU0UxX0xPT1BfQ05UIDtpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUEhBU0UxX0xPT1BfQ05UOyBpKyspIHsKIAkJLyogRWFjaCBhZGQgb3BlcmF0aW9uIGhlcmUgaXMgbW9kIDIqKjE2ICovCi0JCXAxa1swXSArPSBfU18ocDFrWzRdIF4gVEsxNigoaSYxKSswKSk7Ci0JCXAxa1sxXSArPSBfU18ocDFrWzBdIF4gVEsxNigoaSYxKSsyKSk7Ci0JCXAxa1syXSArPSBfU18ocDFrWzFdIF4gVEsxNigoaSYxKSs0KSk7Ci0JCXAxa1szXSArPSBfU18ocDFrWzJdIF4gVEsxNigoaSYxKSs2KSk7Ci0JCXAxa1s0XSArPSBfU18ocDFrWzNdIF4gVEsxNigoaSYxKSswKSk7Ci0JCXAxa1s0XSArPSAgKHVuc2lnbmVkIHNob3J0KWk7ICAgICAgICAgICAgICAgICAgICAvKiBhdm9pZCAic2xpZGUgYXR0YWNrcyIgKi8KKwkJcDFrWzBdICs9IF9TXyhwMWtbNF0gXiBUSzE2KChpICYgMSkgKyAwKSk7CisJCXAxa1sxXSArPSBfU18ocDFrWzBdIF4gVEsxNigoaSAmIDEpICsgMikpOworCQlwMWtbMl0gKz0gX1NfKHAxa1sxXSBeIFRLMTYoKGkgJiAxKSArIDQpKTsKKwkJcDFrWzNdICs9IF9TXyhwMWtbMl0gXiBUSzE2KChpICYgMSkgKyA2KSk7CisJCXAxa1s0XSArPSBfU18ocDFrWzNdIF4gVEsxNigoaSAmIDEpICsgMCkpOworCQlwMWtbNF0gKz0gICh1bnNpZ25lZCBzaG9ydCkgaTsgLyogYXZvaWQgInNsaWRlIGF0dGFja3MiICovCiAJCX0KIAogfQpAQCAtNTYwLDQyICs1NTIsNDQgQEAKIHN0YXRpYyB2b2lkIHBoYXNlMih1OCAqcmM0a2V5LCBjb25zdCB1OCAqdGssIGNvbnN0IHUxNiAqcDFrLCB1MTYgaXYxNikKIHsKIAlpbnQgIGk7Ci0JdTE2IFBQS1s2XTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBrZXkgZm9yIG1peGluZyAgICAqLworCXUxNiBQUEtbNl07IC8qIHRlbXBvcmFyeSBrZXkgZm9yIG1peGluZyAgICAqLwogCi0JLyogTm90ZTogYWxsIGFkZHMgaW4gdGhlIFBQS1tdIGVxdWF0aW9ucyBiZWxvdyBhcmUgbW9kIDIqKjE2ICAgICAgICAgKi8KLQlmb3IgKGkgPSAwO2k8NTtpKyspIFBQS1tpXT0gcDFrW2ldOyAgICAgIC8qIGZpcnN0LCBjb3B5IFAxSyB0byBQUEsgICAgICAqLwotCQlQUEtbNV0gID0gIHAxa1s0XSAraXYxNjsgICAgICAgICAgICAgLyogbmV4dCwgIGFkZCBpbiBJVjE2ICAgICAgICAgICovCisJLyogTm90ZTogYWxsIGFkZHMgaW4gdGhlIFBQS1tdIGVxdWF0aW9ucyBiZWxvdyBhcmUgbW9kIDIqKjE2ICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJUFBLW2ldID0gcDFrW2ldOyAvKiBmaXJzdCwgY29weSBQMUsgdG8gUFBLICovCiAKLQkvKiBCaWplY3RpdmUgbm9uLWxpbmVhciBtaXhpbmcgb2YgdGhlIDk2IGJpdHMgb2YgUFBLWzAuLjVdICAgICAgICAgICAqLwotCVBQS1swXSArPSAgICBfU18oUFBLWzVdIF4gVEsxNigwKSk7ICAgLyogTWl4IGtleSBpbiBlYWNoICJyb3VuZCIgICAgICovCi0JUFBLWzFdICs9ICAgIF9TXyhQUEtbMF0gXiBUSzE2KDEpKTsKLQlQUEtbMl0gKz0gICAgX1NfKFBQS1sxXSBeIFRLMTYoMikpOwotCVBQS1szXSArPSAgICBfU18oUFBLWzJdIF4gVEsxNigzKSk7Ci0JUFBLWzRdICs9ICAgIF9TXyhQUEtbM10gXiBUSzE2KDQpKTsKLQlQUEtbNV0gKz0gICAgX1NfKFBQS1s0XSBeIFRLMTYoNSkpOyAgIC8qIFRvdGFsICMgUy1ib3ggbG9va3VwcyA9PSA2ICAqLworCVBQS1s1XSA9IHAxa1s0XSArIGl2MTY7IC8qIG5leHQsICBhZGQgaW4gSVYxNiAqLwogCi0JLyogRmluYWwgc3dlZXA6IGJpamVjdGl2ZSwgImxpbmVhciIuIFJvdGF0ZXMga2lsbCBMU0IgY29ycmVsYXRpb25zICAgKi8KKwkvKiBCaWplY3RpdmUgbm9uLWxpbmVhciBtaXhpbmcgb2YgdGhlIDk2IGJpdHMgb2YgUFBLWzAuLjVdICovCisJUFBLWzBdICs9IF9TXyhQUEtbNV0gXiBUSzE2KDApKTsgLyogTWl4IGtleSBpbiBlYWNoICJyb3VuZCIgKi8KKwlQUEtbMV0gKz0gX1NfKFBQS1swXSBeIFRLMTYoMSkpOworCVBQS1syXSArPSBfU18oUFBLWzFdIF4gVEsxNigyKSk7CisJUFBLWzNdICs9IF9TXyhQUEtbMl0gXiBUSzE2KDMpKTsKKwlQUEtbNF0gKz0gX1NfKFBQS1szXSBeIFRLMTYoNCkpOworCVBQS1s1XSArPSBfU18oUFBLWzRdIF4gVEsxNig1KSk7IC8qIFRvdGFsICMgUy1ib3ggbG9va3VwcyA9PSA2ICovCisKKwkvKiBGaW5hbCBzd2VlcDogYmlqZWN0aXZlLCAibGluZWFyIi4gUm90YXRlcyBraWxsIExTQiBjb3JyZWxhdGlvbnMgKi8KIAlQUEtbMF0gKz0gIFJvdFIxKFBQS1s1XSBeIFRLMTYoNikpOwotCVBQS1sxXSArPSAgUm90UjEoUFBLWzBdIF4gVEsxNig3KSk7ICAgLyogVXNlIGFsbCBvZiBUS1tdIGluIFBoYXNlMiAgICovCisJUFBLWzFdICs9ICBSb3RSMShQUEtbMF0gXiBUSzE2KDcpKTsgLyogVXNlIGFsbCBvZiBUS1tdIGluIFBoYXNlMiAqLwogCVBQS1syXSArPSAgUm90UjEoUFBLWzFdKTsKIAlQUEtbM10gKz0gIFJvdFIxKFBQS1syXSk7CiAJUFBLWzRdICs9ICBSb3RSMShQUEtbM10pOwogCVBQS1s1XSArPSAgUm90UjEoUFBLWzRdKTsKIAkvKiBOb3RlOiBBdCB0aGlzIHBvaW50LCBmb3IgYSBnaXZlbiBrZXkgVEtbMC4uMTVdLCB0aGUgOTYtYml0IG91dHB1dCAqLwogCS8qICAgICAgIHZhbHVlIFBQS1swLi41XSBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSwgYXMgYSBmdW5jdGlvbiAgICovCi0JLyogICAgICAgb2YgdGhlIDk2LWJpdCAiaW5wdXQiIHZhbHVlICAge1RBLCBJVjMyLCBJVjE2fS4gVGhhdCBpcywgUDFLICAqLwotCS8qICAgICAgIGlzIG5vdyBhIGtleWVkIHBlcm11dGF0aW9uIG9mIHtUQSwgSVYzMiwgSVYxNn0uICAgICAgICAgICAgICAgKi8KKwkvKiAgICAgICBvZiB0aGUgOTYtYml0ICJpbnB1dCIgdmFsdWUgICB7VEEsIElWMzIsIElWMTZ9LiBUaGF0IGlzLCAgICAqLworCS8qICAgICAgIFAxSyBpcyBub3cgYSBrZXllZCBwZXJtdXRhdGlvbiBvZiB7VEEsIElWMzIsIElWMTZ9LiAgICAgICAgICovCiAKIAkvKiBTZXQgUkM0S0VZWzAuLjNdLCB3aGljaCBpbmNsdWRlcyAiY2xlYXJ0ZXh0IiBwb3J0aW9uIG9mIFJDNCBrZXkgICAqLwotCXJjNGtleVswXSA9IEhpOChpdjE2KTsgICAgICAgICAgICAgICAgLyogUkM0S0VZWzAuLjJdIGlzIHRoZSBXRVAgSVYgICovCi0JcmM0a2V5WzFdID0gKEhpOChpdjE2KSB8IDB4MjApICYgMHg3RjsgLyogSGVscCBhdm9pZCB3ZWFrIChGTVMpIGtleXMgICovCisJcmM0a2V5WzBdID0gSGk4KGl2MTYpOyAgICAgICAgICAgICAgICAgLyogUkM0S0VZWzAuLjJdIGlzIHRoZSBXRVAgSVYgKi8KKwlyYzRrZXlbMV0gPSAoSGk4KGl2MTYpIHwgMHgyMCkgJiAweDdGOyAvKiBIZWxwIGF2b2lkIHdlYWsgKEZNUykga2V5cyAqLwogCXJjNGtleVsyXSA9IExvOChpdjE2KTsKIAlyYzRrZXlbM10gPSBMbzgoKFBQS1s1XSBeIFRLMTYoMCkpID4+IDEpOwogCi0JLyogQ29weSA5NiBiaXRzIG9mIFBQS1swLi41XSB0byBSQzRLRVlbNC4uMTVdICAobGl0dGxlLWVuZGlhbikgICAgICAgKi8KLQlmb3IgKGkgPSAwO2k8NjtpKyspIHsKLQkJcmM0a2V5WzQrMippXSA9IExvOChQUEtbaV0pOwotCQlyYzRrZXlbNSsyKmldID0gSGk4KFBQS1tpXSk7CisJLyogQ29weSA5NiBiaXRzIG9mIFBQS1swLi41XSB0byBSQzRLRVlbNC4uMTVdICAobGl0dGxlLWVuZGlhbikgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXJjNGtleVs0ICsgMiAqIGldID0gTG84KFBQS1tpXSk7CisJCXJjNGtleVs1ICsgMiAqIGldID0gSGk4KFBQS1tpXSk7CiAJfQogCiB9CkBAIC02MDQsOTcgKzU5OCwxMDcgQEAKIGludCBydHdfdGtpcF9lbmNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKIHsKLQl1MTYJcG5sOwotCXUzMglwbmg7Ci0JdTgJcmM0a2V5WzE2XTsKLQl1OCAgIHR0a2V5WzE2XTsKLQl1OAljcmNbNF07Ci0JdTggICBod19oZHJfb2Zmc2V0ID0gMDsKKwl1MTYgcG5sOworCXUzMiBwbmg7CisJdTggcmM0a2V5WzE2XTsKKwl1OCB0dGtleVsxNl07CisJdTggY3JjWzRdOworCXU4IGh3X2hkcl9vZmZzZXQgPSAwOwogCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7Ci0JaW50CQkJY3VyZnJhZ251bSwgbGVuZ3RoOwotCXUzMglwcndza2V5bGVuOwotCXU4CSpwZnJhbWUsICpwYXlsb2FkLCAqaXYsICpwcndza2V5OworCWludCBjdXJmcmFnbnVtLCBsZW5ndGg7CisJdTMyIHByd3NrZXlsZW47CisJdTggKnBmcmFtZSwgKnBheWxvYWQsICppdiwgKnByd3NrZXk7CiAJdW5pb24gcG40OCBkb3QxMXR4cG47Ci0Jc3RydWN0CXN0YV9pbmZvCQkqc3RhaW5mbzsKLQlzdHJ1Y3QJcGt0X2F0dHJpYgkgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdAlzZWN1cml0eV9wcml2CSpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0CXhtaXRfcHJpdgkJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CisJc3RydWN0IHN0YV9pbmZvICpzdGFpbmZvOworCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKKwlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OworCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCisJaWYgKHBhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkKKwkJcmV0dXJuIF9GQUlMOworCiAJaWYgKCFweG1pdGZyYW1lLT5idWZfYWRkcikKIAkJcmV0dXJuIF9GQUlMOwogCiAJaHdfaGRyX29mZnNldCA9IFRYREVTQ19PRkZTRVQ7CiAKIAlwZnJhbWUgPSBweG1pdGZyYW1lLT5idWZfYWRkciArIGh3X2hkcl9vZmZzZXQ7CisKKwlpZiAocGF0dHJpYi0+cHN0YSkKKwkJc3RhaW5mbyA9IHBhdHRyaWItPnBzdGE7CisJZWxzZSB7CisJCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvKClcbiIsIF9fZnVuY19fKTsKKwkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCisJCQkJCSAgICAgJnBhdHRyaWItPnJhWzBdKTsKKwl9CisKKwlpZiAoc3RhaW5mbyA9PSBOVUxMKSB7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAorCQkJICIlczogc3RhaW5mbyA9PSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7CisJCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBfRkFJTDsKKwl9CisKKwlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKKwkJICIlczogc3RhaW5mbyE9IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKKworCWlmICghKHN0YWluZm8tPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKKwkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sIHN0YWluZm8tPnN0YXRlKTsKKwkJcmV0dXJuIF9GQUlMOworCX0KKworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpCisJCXByd3NrZXkgPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleTsKKwllbHNlCisJCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOworCisJcHJ3c2tleWxlbiA9IDE2OworCiAJLyogNCBzdGFydCB0byBlbmNyeXB0IGVhY2ggZnJhZ21lbnQgKi8KLQlpZiAocGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCWlmIChwYXR0cmliLT5wc3RhKQotCQkJc3RhaW5mbyA9IHBhdHRyaWItPnBzdGE7Ci0JCWVsc2UgewotCQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8oKVxuIiwgX19mdW5jX18pOwotCQkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCQkgICAgICZwYXR0cmliLT5yYVswXSk7CisJZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPm5yX2ZyYWdzOyBjdXJmcmFnbnVtKyspIHsKKwkJaXYgPSBwZnJhbWUgKyBwYXR0cmliLT5oZHJsZW47CisJCXBheWxvYWQgPSBwZnJhbWUgKyBwYXR0cmliLT5pdl9sZW4gKyBwYXR0cmliLT5oZHJsZW47CisKKwkJR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbik7CisKKwkJcG5sID0gKHUxNikoZG90MTF0eHBuLnZhbCk7CisJCXBuaCA9ICh1MzIpKGRvdDExdHhwbi52YWw+PjE2KTsKKworCQlwaGFzZTEoKHUxNiAqKSZ0dGtleVswXSwgcHJ3c2tleSwgJnBhdHRyaWItPnRhWzBdLCBwbmgpOworCisJCXBoYXNlMigmcmM0a2V5WzBdLCBwcndza2V5LCAodTE2ICopJnR0a2V5WzBdLCBwbmwpOworCisJCWlmICgoY3VyZnJhZ251bSArIDEpID09IHBhdHRyaWItPm5yX2ZyYWdzKSB7IC8qIDQgdGhlIGxhc3QgZnJhZ21lbnQgKi8KKwkJCWxlbmd0aCA9IChwYXR0cmliLT5sYXN0X3R4Y21kc3ogLQorCQkJCSAgcGF0dHJpYi0+aGRybGVuIC0KKwkJCQkgIHBhdHRyaWItPml2X2xlbiAtCisJCQkJICBwYXR0cmliLT5pY3ZfbGVuKTsKKworCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2luZm9fLAorCQkJCSAicGF0dHJpYi0+aXZfbGVuID0leCwgcGF0dHJpYi0+aWN2X2xlbiA9JXhcbiIsCisJCQkJIHBhdHRyaWItPml2X2xlbiwKKwkJCQkgcGF0dHJpYi0+aWN2X2xlbik7CisJCQkqKCh1MzIgKiljcmMpID0gY3B1X3RvX2xlMzIoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoKSk7CisKKwkJCWFyY2ZvdXJfaW5pdCgmbXljb250ZXh0LCByYzRrZXksIDE2KTsKKwkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOworCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsIGNyYywgNCk7CisKKwkJfSBlbHNlIHsKKwkJCWxlbmd0aCA9IChweG1pdHByaXYtPmZyYWdfbGVuIC0KKwkJCQkgIHBhdHRyaWItPmhkcmxlbiAtCisJCQkJICBwYXR0cmliLT5pdl9sZW4gLQorCQkJCSAgcGF0dHJpYi0+aWN2X2xlbik7CisKKwkJCSooKHUzMiAqKWNyYykgPSBjcHVfdG9fbGUzMihnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGgpKTsKKwkJCWFyY2ZvdXJfaW5pdCgmbXljb250ZXh0LCByYzRrZXksIDE2KTsKKwkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOworCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsIGNyYywgNCk7CisKKwkJCXBmcmFtZSArPSBweG1pdHByaXYtPmZyYWdfbGVuOworCQkJcGZyYW1lICA9IFBUUl9BTElHTihwZnJhbWUsIDQpOwogCQl9Ci0KLQkJaWYgKHN0YWluZm8hPSBOVUxMKSB7Ci0KLQkJCWlmICghKHN0YWluZm8tPnN0YXRlICZfRldfTElOS0VEKSkgewotCQkJCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsIF9fZnVuY19fLCBzdGFpbmZvLT5zdGF0ZSk7Ci0JCQkJcmV0dXJuIF9GQUlMOwotCQkJfQotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJydHdfdGtpcF9lbmNyeXB0MjNhOiBzdGFpbmZvIT0gTlVMTCEhIVxuIikpOwotCi0JCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpKQotCQkJCXByd3NrZXkgPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleTsKLQkJCWVsc2UKLQkJCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKLQotCQkJcHJ3c2tleWxlbiA9IDE2OwotCi0JCQlmb3IgKGN1cmZyYWdudW0gPSAwO2N1cmZyYWdudW08cGF0dHJpYi0+bnJfZnJhZ3M7Y3VyZnJhZ251bSsrKSB7Ci0JCQkJaXYgPSBwZnJhbWUrcGF0dHJpYi0+aGRybGVuOwotCQkJCXBheWxvYWQgPSBwZnJhbWUrcGF0dHJpYi0+aXZfbGVuK3BhdHRyaWItPmhkcmxlbjsKLQotCQkJCUdFVF9US0lQX1BOKGl2LCBkb3QxMXR4cG4pOwotCi0JCQkJcG5sID0gKHUxNikoZG90MTF0eHBuLnZhbCk7Ci0JCQkJcG5oID0gKHUzMikoZG90MTF0eHBuLnZhbD4+MTYpOwotCi0JCQkJcGhhc2UxKCh1MTYgKikmdHRrZXlbMF0sIHByd3NrZXksJnBhdHRyaWItPnRhWzBdLCBwbmgpOwotCi0JCQkJcGhhc2UyKCZyYzRrZXlbMF0sIHByd3NrZXksICh1MTYgKikmdHRrZXlbMF0sIHBubCk7Ci0KLQkJCQlpZiAoKGN1cmZyYWdudW0rMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsJLyogNCB0aGUgbGFzdCBmcmFnbWVudCAqLwotCQkJCQlsZW5ndGggPSBwYXR0cmliLT5sYXN0X3R4Y21kc3otcGF0dHJpYi0+aGRybGVuLXBhdHRyaWItPml2X2xlbi0gcGF0dHJpYi0+aWN2X2xlbjsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2luZm9fLCAoInBhdHRyaWItPml2X2xlbiA9JXgsIHBhdHRyaWItPmljdl9sZW4gPSV4XG4iLCBwYXR0cmliLT5pdl9sZW4sIHBhdHRyaWItPmljdl9sZW4pKTsKLQkJCQkJKigodTMyICopY3JjKSA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOy8qIG1vZGlmaWVkIGJ5IEFteSovCi0KLQkJCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOwotCQkJCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQkJCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQrbGVuZ3RoLCBjcmMsIDQpOwotCi0JCQkJfQotCQkJCWVsc2V7Ci0JCQkJCWxlbmd0aCA9IHB4bWl0cHJpdi0+ZnJhZ19sZW4tcGF0dHJpYi0+aGRybGVuLXBhdHRyaWItPml2X2xlbi1wYXR0cmliLT5pY3ZfbGVuIDsKLQkJCQkJKigodTMyICopY3JjKSA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOy8qIG1vZGlmaWVkIGJ5IEFteSovCi0JCQkJCWFyY2ZvdXJfaW5pdCgmbXljb250ZXh0LCByYzRrZXksIDE2KTsKLQkJCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7Ci0JCQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkK2xlbmd0aCwgY3JjLCA0KTsKLQotCQkJCXBmcmFtZSs9IHB4bWl0cHJpdi0+ZnJhZ19sZW47Ci0JCQkJcGZyYW1lID0gUFRSX0FMSUdOKHBmcmFtZSwgNCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJZWxzZXsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLCAoInJ0d190a2lwX2VuY3J5cHQyM2E6IHN0YWluZm8gPT0gTlVMTCEhIVxuIikpOwotCQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJCXJlcyA9IF9GQUlMOwotCQl9Ci0KIAl9CiAKIAlyZXR1cm4gcmVzOwpAQCAtNzA2LDcyICs3MTAsNzYgQEAKIHsKIAl1MTYgcG5sOwogCXUzMiBwbmg7Ci0JdTggICByYzRrZXlbMTZdOwotCXU4ICAgdHRrZXlbMTZdOwotCXU4CWNyY1s0XTsKKwl1OCByYzRrZXlbMTZdOworCXU4IHR0a2V5WzE2XTsKKwl1MzIgYWN0dWFsX2NyYywgZXhwZWN0ZWRfY3JjOwogCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7Ci0JaW50CWxlbmd0aDsKLQl1MzIJcHJ3c2tleWxlbjsKLQl1OAkqcGZyYW1lLCAqcGF5bG9hZCwgKml2LCAqcHJ3c2tleTsKKwlpbnQgbGVuZ3RoOworCXUzMiBwcndza2V5bGVuOworCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXYsICpwcndza2V5OwogCXVuaW9uIHBuNDggZG90MTF0eHBuOwotCXN0cnVjdAlzdGFfaW5mbwkJKnN0YWluZm87Ci0Jc3RydWN0CXJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0CXNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87CisJc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7CisJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwogCWludCByZXMgPSBfU1VDQ0VTUzsKIAorCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkKKwkJcmV0dXJuIF9GQUlMOworCiAJcGZyYW1lID0gc2tiLT5kYXRhOwogCi0JLyogNCBzdGFydCB0byBkZWNyeXB0IHJlY3ZmcmFtZSAqLwotCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCi0JCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LAotCQkJCQkgICAgICZwcnhhdHRyaWItPnRhWzBdKTsKLQkJaWYgKHN0YWluZm8hPSBOVUxMKSB7Ci0KLQkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwcnhhdHRyaWItPnJhKSkgewotCQkJCWlmIChwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9PSAwKSB7Ci0JCQkJCXJlcyA9IF9GQUlMOwotCQkJCQlEQkdfODcyM0EoIiVzOnJ4IGJjL21jIHBhY2tldHMsIGJ1dCBkaWRuJ3QgaW5zdGFsbCBncm91cCBrZXkhISEhISEhISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9Ci0JCQkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXk7Ci0JCQkJcHJ3c2tleWxlbiA9IDE2OwotCQkJfSBlbHNlIHsKLQkJCSAgICAgICAgUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sICgicnR3X3RraXBfZGVjcnlwdDIzYTogc3RhaW5mbyE9IE5VTEwhISFcbiIpKTsKLQkJCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKLQkJCQlwcndza2V5bGVuID0gMTY7Ci0JCQl9Ci0KLQkJCWl2ID0gcGZyYW1lK3ByeGF0dHJpYi0+aGRybGVuOwotCQkJcGF5bG9hZCA9IHBmcmFtZStwcnhhdHRyaWItPml2X2xlbitwcnhhdHRyaWItPmhkcmxlbjsKLQkJCWxlbmd0aCA9IHNrYi0+bGVuIC0gcHJ4YXR0cmliLT5oZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW47Ci0KLQkJCUdFVF9US0lQX1BOKGl2LCBkb3QxMXR4cG4pOwotCi0JCQlwbmwgPSAodTE2KShkb3QxMXR4cG4udmFsKTsKLQkJCXBuaCA9ICh1MzIpKGRvdDExdHhwbi52YWw+PjE2KTsKLQotCQkJcGhhc2UxKCh1MTYgKikmdHRrZXlbMF0sIHByd3NrZXksJnByeGF0dHJpYi0+dGFbMF0sIHBuaCk7Ci0JCQlwaGFzZTIoJnJjNGtleVswXSwgcHJ3c2tleSwgKHVuc2lnbmVkIHNob3J0ICopJnR0a2V5WzBdLCBwbmwpOwotCi0JCQkvKiA0IGRlY3J5cHQgcGF5bG9hZCBpbmNsdWRlIGljdiAqLwotCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7Ci0KLQkJCSooKHUzMiAqKWNyYykgPSBsZTMyX3RvX2NwdShnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGgtNCkpOwotCi0JCQlpZiAoY3JjWzNdIT0gcGF5bG9hZFtsZW5ndGgtMV0gfHwgY3JjWzJdIT0gcGF5bG9hZFtsZW5ndGgtMl0gfHwgY3JjWzFdIT0gcGF5bG9hZFtsZW5ndGgtM10gfHwgY3JjWzBdIT0gcGF5bG9hZFtsZW5ndGgtNF0pCi0JCQl7Ci0JCQkgICAgUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sICgicnR3X3dlcF9kZWNyeXB0MjNhOmljdiBlcnJvciBjcmNbM10oJXgpIT0gcGF5bG9hZFtsZW5ndGgtMV0oJXgpIHx8IGNyY1syXSgleCkhPSBwYXlsb2FkW2xlbmd0aC0yXSgleCkgfHwgY3JjWzFdKCV4KSE9IHBheWxvYWRbbGVuZ3RoLTNdKCV4KSB8fCBjcmNbMF0oJXgpIT0gcGF5bG9hZFtsZW5ndGgtNF0oJXgpXG4iLAotCQkJCQkJY3JjWzNdLCBwYXlsb2FkW2xlbmd0aC0xXSwgY3JjWzJdLCBwYXlsb2FkW2xlbmd0aC0yXSwgY3JjWzFdLCBwYXlsb2FkW2xlbmd0aC0zXSwgY3JjWzBdLCBwYXlsb2FkW2xlbmd0aC00XSkpOwotCQkJCXJlcyA9IF9GQUlMOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sICgicnR3X3RraXBfZGVjcnlwdDIzYTogc3RhaW5mbyA9PSBOVUxMISEhXG4iKSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJfQorCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LAorCQkJCSAgICAgJnByeGF0dHJpYi0+dGFbMF0pOworCWlmIChzdGFpbmZvID09IE5VTEwpIHsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCisJCQkgIiVzOiBzdGFpbmZvID09IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIF9GQUlMOwogCX0KKworCS8qIDQgc3RhcnQgdG8gZGVjcnlwdCByZWN2ZnJhbWUgKi8KKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKKwkJaWYgKHBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5ID09IDApIHsKKwkJCXJlcyA9IF9GQUlMOworCQkJREJHXzg3MjNBKCIlczpyeCBiYy9tYyBwYWNrZXRzLCBidXQgZGlkbid0IGluc3RhbGwgZ3JvdXAga2V5ISEhISEhISEhIVxuIiwgX19mdW5jX18pOworCQkJZ290byBleGl0OworCQl9CisJCXByd3NrZXkgPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W3ByeGF0dHJpYi0+a2V5X2luZGV4XS5za2V5OworCQlwcndza2V5bGVuID0gMTY7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCisJCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOworCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKKwkJcHJ3c2tleWxlbiA9IDE2OworCX0KKworCWl2ID0gcGZyYW1lICsgcHJ4YXR0cmliLT5oZHJsZW47CisJcGF5bG9hZCA9IHBmcmFtZSArIHByeGF0dHJpYi0+aXZfbGVuICsgcHJ4YXR0cmliLT5oZHJsZW47CisJbGVuZ3RoID0gc2tiLT5sZW4gLSBwcnhhdHRyaWItPmhkcmxlbiAtIHByeGF0dHJpYi0+aXZfbGVuOworCisJR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbik7CisKKwlwbmwgPSAodTE2KShkb3QxMXR4cG4udmFsKTsKKwlwbmggPSAodTMyKShkb3QxMXR4cG4udmFsPj4xNik7CisKKwlwaGFzZTEoKHUxNiAqKSZ0dGtleVswXSwgcHJ3c2tleSwgJnByeGF0dHJpYi0+dGFbMF0sIHBuaCk7CisJcGhhc2UyKCZyYzRrZXlbMF0sIHByd3NrZXksICh1bnNpZ25lZCBzaG9ydCAqKSZ0dGtleVswXSwgcG5sKTsKKworCS8qIDQgZGVjcnlwdCBwYXlsb2FkIGluY2x1ZGUgaWN2ICovCisJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOworCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOworCisJYWN0dWFsX2NyYyA9IGxlMzJfdG9fY3B1KGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCAtIDQpKTsKKwlleHBlY3RlZF9jcmMgPSBsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkX2xlMzIoJnBheWxvYWRbbGVuZ3RoIC0gNF0pKTsKKworCWlmIChhY3R1YWxfY3JjICE9IGV4cGVjdGVkX2NyYykgeworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKKwkJCSAiJXM6aWN2IENSQyBtaXNtYXRjaDogIgorCQkJICJhY3R1YWw6ICUwOHgsIGV4cGVjdGVkOiAlMDh4XG4iLAorCQkJIF9fZnVuY19fLCBhY3R1YWxfY3JjLCBleHBlY3RlZF9jcmMpOworCQlyZXMgPSBfRkFJTDsKKwl9CisKIGV4aXQ6CiAJcmV0dXJuIHJlczsKIH0KQEAgLTgyOSw3ICs4MzcsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDtpPDE2OyBpKyspCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCW91dFtpXSA9IGFbaV0gXiBiW2ldOwogfQogCkBAIC04NTAsOCArODU4LDcgQEAKIHsKIAl1OCByY29uOwogCXU4IHNib3hfa2V5WzRdOwotCXU4IHJjb25fdGFibGVbMTJdID0KLQl7CisJdTggcmNvbl90YWJsZVsxMl0gPSB7CiAJCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCiAJCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKIAl9OwpAQCAtODc2LDEwICs4ODMsOCBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaTwgMTY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlvdXRbaV0gPSBzYm94KGluW2ldKTsKLQl9Ci0KIH0KIAogc3RhdGljIHZvaWQgc2hpZnRfcm93KHU4ICppbiwgdTggKm91dCkKQEAgLTkxNiwxOSArOTIxLDE5IEBACiAJdTggdGVtcFs0XTsKIAl1OCB0ZW1wYls0XTsKIAotCWZvciAoaSA9IDAgOyBpPDQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJaWYgKChpbltpXSAmIDB4ODApID09IDB4ODApCi0JCSAgICBhZGQxYltpXSA9IDB4MWI7CisJCQlhZGQxYltpXSA9IDB4MWI7CiAJCWVsc2UKLQkJICAgIGFkZDFiW2ldID0gMHgwMDsKKwkJCWFkZDFiW2ldID0gMHgwMDsKIAl9CiAKLQlzd2FwX2hhbGZzWzBdID0gaW5bMl07ICAgIC8qIFN3YXAgaGFsZnMgKi8KKwlzd2FwX2hhbGZzWzBdID0gaW5bMl07IC8qIFN3YXAgaGFsZnMgKi8KIAlzd2FwX2hhbGZzWzFdID0gaW5bM107CiAJc3dhcF9oYWxmc1syXSA9IGluWzBdOwogCXN3YXBfaGFsZnNbM10gPSBpblsxXTsKIAotCXJvdGxbMF0gPSBpblszXTsgICAgICAgIC8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLworCXJvdGxbMF0gPSBpblszXTsgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCiAJcm90bFsxXSA9IGluWzBdOwogCXJvdGxbMl0gPSBpblsxXTsKIAlyb3RsWzNdID0gaW5bMl07CkBAIC05MzgsMTEgKzk0MywxMCBAQAogCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOwogCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOwogCi0JZm9yIChpID0gMzsgaT4wOyBpLS0pIHsgLyogbG9naWNhbCBzaGlmdCBsZWZ0IDEgYml0ICovCisJZm9yIChpID0gMzsgaSA+IDA7IGktLSkgeyAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KIAkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOwotCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKSB7Ci0JCSAgICBhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOwotCQl9CisJCWlmICgoYW5kZjdbaSAtIDFdICYgMHg4MCkgPT0gMHg4MCkKKwkJCWFuZGY3W2ldID0gKGFuZGY3W2ldIHwgMHgwMSk7CiAJfQogCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKIAlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKQEAgLTk1MSw3ICs5NTUsNyBAQAogCiAJeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKIAotCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KKwl0ZW1wWzBdID0gcm90clswXTsgLyogUm90YXRlIHJpZ2h0IDggYml0cyAqLwogCXJvdHJbMF0gPSByb3RyWzFdOwogCXJvdHJbMV0gPSByb3RyWzJdOwogCXJvdHJbMl0gPSByb3RyWzNdOwpAQCAtOTcxLDI1ICs5NzUsMjYgQEAKIAl1OCBpbnRlcm1lZGlhdGViWzE2XTsKIAl1OCByb3VuZF9rZXlbMTZdOwogCi0JZm9yIChpID0gMDsgaTwxNjsgaSsrKSByb3VuZF9rZXlbaV0gPSBrZXlbaV07CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXJvdW5kX2tleVtpXSA9IGtleVtpXTsKIAogCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKSB7CiAJCWlmIChyb3VuZCA9PSAwKSB7Ci0JCSAgICB4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7Ci0JCSAgICBuZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwogCQl9IGVsc2UgaWYgKHJvdW5kID09IDEwKSB7Ci0JCSAgICBieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJICAgIHNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJICAgIHhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJeG9yXzEyOChpbnRlcm1lZGlhdGViLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwogCQl9IGVsc2UgeyAvKiAxIC0gOSAqLwotCQkgICAgYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0JCSAgICBzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0JCSAgICBtaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzBdLCAmaW50ZXJtZWRpYXRlYVswXSk7Ci0JCSAgICBtaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzRdLCAmaW50ZXJtZWRpYXRlYVs0XSk7Ci0JCSAgICBtaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzhdLCAmaW50ZXJtZWRpYXRlYVs4XSk7Ci0JCSAgICBtaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzEyXSwgJmludGVybWVkaWF0ZWFbMTJdKTsKLQkJICAgIHhvcl8xMjgoaW50ZXJtZWRpYXRlYSwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLQkJICAgIG5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzBdLCAmaW50ZXJtZWRpYXRlYVswXSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzRdLCAmaW50ZXJtZWRpYXRlYVs0XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzhdLCAmaW50ZXJtZWRpYXRlYVs4XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzEyXSwgJmludGVybWVkaWF0ZWFbMTJdKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYSwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwogCQl9CiAJfQogCkBAIC0xMDA2LDkgKzEwMTEsOSBAQAogCiAJbWljX2l2WzBdID0gMHg1OTsKIAlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAgICAvKiBRb1NfVEMgICAgICAgICAgICovCisJCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgLyogUW9TX1RDICAgICAgICAqLwogCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KKwkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgNy00ICovCiAJaWYgKCFxY19leGlzdHMpCiAJCW1pY19pdlsxXSA9IDB4MDA7CiAJZm9yIChpID0gMjsgaSA8IDg7IGkrKykKQEAgLTEwMjgsMTUgKzEwMzMsMTUgQEAKIHsKIAltaWNfaGVhZGVyMVswXSA9ICh1OCkoKGhlYWRlcl9sZW5ndGggLSAyKSAvIDI1Nik7CiAJbWljX2hlYWRlcjFbMV0gPSAodTgpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOwotCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7ICAgIC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCi0JbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsgICAgLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KLQltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07ICAgICAgIC8qIEExICovCisJbWljX2hlYWRlcjFbMl0gPSBtcGR1WzBdICYgMHhjZjsgLyogTXV0ZSBDRiBwb2xsICYgQ0YgYWNrIGJpdHMgKi8KKwltaWNfaGVhZGVyMVszXSA9IG1wZHVbMV0gJiAweGM3OyAvKiBNdXRlIHJldHJ5LCBtb3JlIGRhdGEgYW5kIHB3ciBtZ3QgYml0cyAqLworCW1pY19oZWFkZXIxWzRdID0gbXBkdVs0XTsgLyogQTEgKi8KIAltaWNfaGVhZGVyMVs1XSA9IG1wZHVbNV07CiAJbWljX2hlYWRlcjFbNl0gPSBtcGR1WzZdOwogCW1pY19oZWFkZXIxWzddID0gbXBkdVs3XTsKIAltaWNfaGVhZGVyMVs4XSA9IG1wZHVbOF07CiAJbWljX2hlYWRlcjFbOV0gPSBtcGR1WzldOwotCW1pY19oZWFkZXIxWzEwXSA9IG1wZHVbMTBdOyAgICAgLyogQTIgKi8KKwltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsgLyogQTIgKi8KIAltaWNfaGVhZGVyMVsxMV0gPSBtcGR1WzExXTsKIAltaWNfaGVhZGVyMVsxMl0gPSBtcGR1WzEyXTsKIAltaWNfaGVhZGVyMVsxM10gPSBtcGR1WzEzXTsKQEAgLTEwNDYsNyArMTA1MSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGNvbnN0cnVjdF9taWNfaGVhZGVyMigpICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBCdWlsZHMgdGhlIGxhc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICAqLwogLyogaGVhZGVyIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDU1LDkgKzEwNjAsMTAgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGk8MTY7IGkrKykgbWljX2hlYWRlcjJbaV09IDB4MDA7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCW1pY19oZWFkZXIyW2ldID0gMHgwMDsKIAotCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07ICAgIC8qIEEzICovCisJbWljX2hlYWRlcjJbMF0gPSBtcGR1WzE2XTsgLyogQTMgKi8KIAltaWNfaGVhZGVyMlsxXSA9IG1wZHVbMTddOwogCW1pY19oZWFkZXIyWzJdID0gbXBkdVsxOF07CiAJbWljX2hlYWRlcjJbM10gPSBtcGR1WzE5XTsKQEAgLTEwNjgsOCArMTA3NCw4IEBACiAJbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KIAogCWlmICghcWNfZXhpc3RzICYmIGE0X2V4aXN0cykgewotCQlmb3IgKGkgPSAwO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCi0KKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCW1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAvKiBBNCAqLwogCX0KIAogCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgewpAQCAtMTA3OCw3ICsxMDg0LDggQEAKIAl9CiAKIAlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgewotCQlmb3IgKGkgPSAwO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQltaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgLyogQTQgKi8KIAogCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7CiAJCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKQEAgLTEwOTYsMTkgKzExMDMsMjEgQEAKIHsKIAlpbnQgaSA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIGN0cl9wcmVsb2FkW2ldID0gMHgwMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCiAJaSA9IDA7CiAKLQljdHJfcHJlbG9hZFswXSA9IDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgKi8KKwljdHJfcHJlbG9hZFswXSA9IDB4MDE7IC8qIGZsYWcgKi8KIAlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQkJY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgLyogUW9DX0NvbnRyb2wgKi8KKwkJY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7IC8qIFFvQ19Db250cm9sICovCiAJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQogCQljdHJfcHJlbG9hZFsxXSA9IG1wZHVbMjRdICYgMHgwZjsKIAogCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisJCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07IC8qIGN0cl9wcmVsb2FkWzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KIAlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbMTMgLSBpXTsgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCisJCWN0cl9wcmVsb2FkW2ldID0gcG5fdmVjdG9yWzEzIC0gaV07IC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLwogCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvKiBDdHIgKi8KIAljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKIApAQCAtMTEyOCw4ICsxMTM3LDggQEAKIAogc3RhdGljIGludCBhZXNfY2lwaGVyKHU4ICprZXksIHVpbnQgaGRybGVuLCB1OCAqcGZyYW1lLCB1aW50IHBsZW4pCiB7Ci0JdWludAlxY19leGlzdHMsIGE0X2V4aXN0cywgaSwgaiwgcGF5bG9hZF9yZW1haW5kZXIsCi0JCW51bV9ibG9ja3MsIHBheWxvYWRfaW5kZXg7CisJdWludCBxY19leGlzdHMsIGE0X2V4aXN0cywgaSwgaiwgcGF5bG9hZF9yZW1haW5kZXIsCisJICAgICBudW1fYmxvY2tzLCBwYXlsb2FkX2luZGV4OwogCXU4IHBuX3ZlY3Rvcls2XTsKIAl1OCBtaWNfaXZbMTZdOwogCXU4IG1pY19oZWFkZXIxWzE2XTsKQEAgLTExNzcsMTIgKzExODYsMTIgQEAKIAl9IGVsc2UgewogCQlxY19leGlzdHMgPSAwOwogCX0KLQlwbl92ZWN0b3JbMF09IHBmcmFtZVtoZHJsZW5dOwotCXBuX3ZlY3RvclsxXT0gcGZyYW1lW2hkcmxlbisxXTsKLQlwbl92ZWN0b3JbMl09IHBmcmFtZVtoZHJsZW4rNF07Ci0JcG5fdmVjdG9yWzNdPSBwZnJhbWVbaGRybGVuKzVdOwotCXBuX3ZlY3Rvcls0XT0gcGZyYW1lW2hkcmxlbis2XTsKLQlwbl92ZWN0b3JbNV09IHBmcmFtZVtoZHJsZW4rN107CisJcG5fdmVjdG9yWzBdID0gcGZyYW1lW2hkcmxlbl07CisJcG5fdmVjdG9yWzFdID0gcGZyYW1lW2hkcmxlbiArIDFdOworCXBuX3ZlY3RvclsyXSA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKKwlwbl92ZWN0b3JbM10gPSBwZnJhbWVbaGRybGVuICsgNV07CisJcG5fdmVjdG9yWzRdID0gcGZyYW1lW2hkcmxlbiArIDZdOworCXBuX3ZlY3Rvcls1XSA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKIAogCWNvbnN0cnVjdF9taWNfaXYobWljX2l2LCBxY19leGlzdHMsIGE0X2V4aXN0cywgcGZyYW1lLCBwbGVuLCBwbl92ZWN0b3IpOwogCkBAIC0xMTkzLDcgKzEyMDIsNyBAQAogCW51bV9ibG9ja3MgPSBwbGVuIC8gMTY7CiAKIAkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KLQlwYXlsb2FkX2luZGV4ID0gKGhkcmxlbiArIDgpOworCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwogCiAJLyogQ2FsY3VsYXRlIE1JQyAqLwogCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKQEAgLTEyMjQsMTIgKzEyMzMsMTIgQEAKIAogCS8qIEluc2VydCBNSUMgaW50byBwYXlsb2FkICovCiAJZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGZyYW1lW3BheWxvYWRfaW5kZXgral0gPSBtaWNbal07CisJCXBmcmFtZVtwYXlsb2FkX2luZGV4ICsgal0gPSBtaWNbal07CiAKIAlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CiAJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsCi0JCQkJICAgICAgcGZyYW1lLCBwbl92ZWN0b3IsIGkrMSk7CisJCQkJICAgICAgcGZyYW1lLCBwbl92ZWN0b3IsIGkgKyAxKTsKIAkJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CiAJCWJpdHdpc2VfeG9yKGFlc19vdXQsICZwZnJhbWVbcGF5bG9hZF9pbmRleF0sIGNoYWluX2J1ZmZlcik7CiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQpAQCAtMTI0MSwxNSArMTI1MCwxNSBAQAogCQkgKiBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKIAkJICovCiAJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBmcmFtZSwKLQkJCQkgICAgICBwbl92ZWN0b3IsIG51bV9ibG9ja3MrMSk7CisJCQkJICAgICAgcG5fdmVjdG9yLCBudW1fYmxvY2tzICsgMSk7CiAKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCiAJCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKIAkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gcGZyYW1lW3BheWxvYWRfaW5kZXgral07CisJCQlwYWRkZWRfYnVmZmVyW2pdID0gcGZyYW1lW3BheWxvYWRfaW5kZXggKyBqXTsKIAkJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CiAJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjtqKyspCisJCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQogCQkJcGZyYW1lW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07CiAJfQogCkBAIC0xMjYwLDExICsxMjY5LDExIEBACiAJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCiAJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwogCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbaitoZHJsZW4rOCtwbGVuXTsKKwkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtqICsgaGRybGVuICsgOCArIHBsZW5dOwogCiAJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CiAJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQlmb3IgKGogPSAwOyBqIDwgODtqKyspCisJZm9yIChqID0gMDsgaiA8IDg7IGorKykKIAkJcGZyYW1lW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CkBAIC0xMjcyLDExICsxMjgxLDExIEBACiAKIGludCBydHdfYWVzX2VuY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKIAkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewkvKiAgZXhjbHVkZSBJQ1YgKi8KK3sJLyogZXhjbHVkZSBJQ1YgKi8KIAkvKiBJbnRlcm1lZGlhdGUgQnVmZmVycyAqLwogCWludCBjdXJmcmFnbnVtLCBsZW5ndGg7CiAJdTMyIHByd3NrZXlsZW47Ci0JdTggKnBmcmFtZSwgKnByd3NrZXk7CS8qICAqcGF5bG9hZCwqaXYgKi8KKwl1OCAqcGZyYW1lLCAqcHJ3c2tleTsKIAl1OCBod19oZHJfb2Zmc2V0ID0gMDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87CiAJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwpAQCAtMTMwNCwxOCArMTMxMywxOCBAQAogCiAJaWYgKCFzdGFpbmZvKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X2Flc19lbmNyeXB0MjNhOiBzdGFpbmZvID09IE5VTEwhISFcbiIpKTsKKwkJCSAiJXM6IHN0YWluZm8gPT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwogCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBvdXQ7CiAJfQotCWlmICghKHN0YWluZm8tPnN0YXRlICZfRldfTElOS0VEKSkgeworCWlmICghKHN0YWluZm8tPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKIAkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwKIAkJCSAgX19mdW5jX18sIHN0YWluZm8tPnN0YXRlKTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJICgicnR3X2Flc19lbmNyeXB0MjNhOiBzdGFpbmZvIT0gTlVMTCEhIVxuIikpOworCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwogCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSkKIAkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5OwpAQCAtMTM0NSwxMiArMTM1NCwxMSBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQgYWVzX2RlY2lwaGVyKHU4ICprZXksIHVpbnQJaGRybGVuLAotCQkJdTggKnBmcmFtZSwgdWludCBwbGVuKQorc3RhdGljIGludCBhZXNfZGVjaXBoZXIodTggKmtleSwgdWludCBoZHJsZW4sIHU4ICpwZnJhbWUsIHVpbnQgcGxlbikKIHsKLQlzdGF0aWMgdTgJbWVzc2FnZVtNQVhfTVNHX1NJWkVdOwotCXVpbnQJcWNfZXhpc3RzLCBhNF9leGlzdHMsIGksIGosIHBheWxvYWRfcmVtYWluZGVyLAotCQkJbnVtX2Jsb2NrcywgcGF5bG9hZF9pbmRleDsKKwlzdGF0aWMgdTggbWVzc2FnZVtNQVhfTVNHX1NJWkVdOworCXVpbnQgcWNfZXhpc3RzLCBhNF9leGlzdHMsIGksIGosIHBheWxvYWRfcmVtYWluZGVyLAorCSAgICAgbnVtX2Jsb2NrcywgcGF5bG9hZF9pbmRleDsKIAlpbnQgcmVzID0gX1NVQ0NFU1M7CiAJdTggcG5fdmVjdG9yWzZdOwogCXU4IG1pY19pdlsxNl07CkBAIC0xMzc1LDE2ICsxMzgzLDE2IEBACiAKIAkvKiBzdGFydCB0byBkZWNyeXB0IHRoZSBwYXlsb2FkICovCiAKLQludW1fYmxvY2tzID0gKHBsZW4tOCkgLyAxNjsgLyogcGxlbiBpbmNsdWRpbmcgbGxjLCBwYXlsb2FkX2xlbmd0aCBhbmQgbWljKSAqLworCW51bV9ibG9ja3MgPSAocGxlbiAtIDgpIC8gMTY7IC8qIHBsZW4gaW5jbHVkaW5nIGxsYywgcGF5bG9hZF9sZW5ndGggYW5kIG1pYykgKi8KIAotCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4tOCkgJSAxNjsKKwlwYXlsb2FkX3JlbWFpbmRlciA9IChwbGVuIC0gOCkgJSAxNjsKIAogCXBuX3ZlY3RvclswXSAgPSBwZnJhbWVbaGRybGVuXTsKLQlwbl92ZWN0b3JbMV0gID0gcGZyYW1lW2hkcmxlbisxXTsKLQlwbl92ZWN0b3JbMl0gID0gcGZyYW1lW2hkcmxlbis0XTsKLQlwbl92ZWN0b3JbM10gID0gcGZyYW1lW2hkcmxlbis1XTsKLQlwbl92ZWN0b3JbNF0gID0gcGZyYW1lW2hkcmxlbis2XTsKLQlwbl92ZWN0b3JbNV0gID0gcGZyYW1lW2hkcmxlbis3XTsKKwlwbl92ZWN0b3JbMV0gID0gcGZyYW1lW2hkcmxlbiArIDFdOworCXBuX3ZlY3RvclsyXSAgPSBwZnJhbWVbaGRybGVuICsgNF07CisJcG5fdmVjdG9yWzNdICA9IHBmcmFtZVtoZHJsZW4gKyA1XTsKKwlwbl92ZWN0b3JbNF0gID0gcGZyYW1lW2hkcmxlbiArIDZdOworCXBuX3ZlY3Rvcls1XSAgPSBwZnJhbWVbaGRybGVuICsgN107CiAKIAlpZiAoKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpIHx8CiAJICAgIChoZHJsZW4gPT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcikpKSkKQEAgLTE0MTMsMTMgKzE0MjEsMTMgQEAKIAkJcWNfZXhpc3RzID0gMDsKIAl9CiAKLQkvKiAgbm93LCBkZWNyeXB0IHBmcmFtZSB3aXRoIGhkcmxlbiBvZmZzZXQgYW5kIHBsZW4gbG9uZyAqLworCS8qIG5vdywgZGVjcnlwdCBwZnJhbWUgd2l0aCBoZHJsZW4gb2Zmc2V0IGFuZCBwbGVuIGxvbmcgKi8KIAogCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OyAvKiAgOCBpcyBmb3IgZXh0aXYgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKIAkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywKLQkJCQkgICAgICBwZnJhbWUsIHBuX3ZlY3RvciwgaSsxKTsKKwkJCQkgICAgICBwZnJhbWUsIHBuX3ZlY3RvciwgaSArIDEpOwogCiAJCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwogCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmcGZyYW1lW3BheWxvYWRfaW5kZXhdLCBjaGFpbl9idWZmZXIpOwpAQCAtMTQzMywxMiArMTQ0MSwxMiBAQAogCQkgKiBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKIAkJICovCiAJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBmcmFtZSwKLQkJCQkgICAgICBwbl92ZWN0b3IsIG51bV9ibG9ja3MrMSk7CisJCQkJICAgICAgcG5fdmVjdG9yLCBudW1fYmxvY2tzICsgMSk7CiAKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCiAJCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKIAkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gcGZyYW1lW3BheWxvYWRfaW5kZXgral07CisJCQlwYWRkZWRfYnVmZmVyW2pdID0gcGZyYW1lW3BheWxvYWRfaW5kZXggKyBqXTsKIAkJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CiAJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CiAJCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQpAQCAtMTQ0NiwyNyArMTQ1NCwyNyBAQAogCX0KIAogCS8qIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGUgbWljICovCi0JaWYgKChoZHJsZW4gK3BsZW4rOCkgPD0gTUFYX01TR19TSVpFKQotCQltZW1jcHkobWVzc2FnZSwgcGZyYW1lLCAoaGRybGVuK3BsZW4rOCkpOyAvKiA4IGlzIGZvciBleHQgaXYgbGVuICovCisJaWYgKChoZHJsZW4gKyBwbGVuICsgOCkgPD0gTUFYX01TR19TSVpFKQorCQltZW1jcHkobWVzc2FnZSwgcGZyYW1lLCAoaGRybGVuICsgcGxlbiArIDgpKTsgLyogOCBpcyBmb3IgZXh0IGl2IGxlbiAqLwogCiAJcG5fdmVjdG9yWzBdID0gcGZyYW1lW2hkcmxlbl07Ci0JcG5fdmVjdG9yWzFdID0gcGZyYW1lW2hkcmxlbisxXTsKLQlwbl92ZWN0b3JbMl0gPSBwZnJhbWVbaGRybGVuKzRdOwotCXBuX3ZlY3RvclszXSA9IHBmcmFtZVtoZHJsZW4rNV07Ci0JcG5fdmVjdG9yWzRdID0gcGZyYW1lW2hkcmxlbis2XTsKLQlwbl92ZWN0b3JbNV0gPSBwZnJhbWVbaGRybGVuKzddOworCXBuX3ZlY3RvclsxXSA9IHBmcmFtZVtoZHJsZW4gKyAxXTsKKwlwbl92ZWN0b3JbMl0gPSBwZnJhbWVbaGRybGVuICsgNF07CisJcG5fdmVjdG9yWzNdID0gcGZyYW1lW2hkcmxlbiArIDVdOworCXBuX3ZlY3Rvcls0XSA9IHBmcmFtZVtoZHJsZW4gKyA2XTsKKwlwbl92ZWN0b3JbNV0gPSBwZnJhbWVbaGRybGVuICsgN107CiAKIAljb25zdHJ1Y3RfbWljX2l2KG1pY19pdiwgcWNfZXhpc3RzLCBhNF9leGlzdHMsIG1lc3NhZ2UsCi0JCQkgcGxlbi04LCBwbl92ZWN0b3IpOworCQkJIHBsZW4gLSA4LCBwbl92ZWN0b3IpOwogCiAJY29uc3RydWN0X21pY19oZWFkZXIxKG1pY19oZWFkZXIxLCBoZHJsZW4sIG1lc3NhZ2UpOwogCWNvbnN0cnVjdF9taWNfaGVhZGVyMihtaWNfaGVhZGVyMiwgbWVzc2FnZSwgYTRfZXhpc3RzLCBxY19leGlzdHMpOwogCi0JcGF5bG9hZF9yZW1haW5kZXIgPSAocGxlbi04KSAlIDE2OwotCW51bV9ibG9ja3MgPSAocGxlbi04KSAvIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4gLSA4KSAlIDE2OworCW51bV9ibG9ja3MgPSAocGxlbiAtIDgpIC8gMTY7CiAKIAkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KLQlwYXlsb2FkX2luZGV4ID0gKGhkcmxlbiArIDgpOworCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwogCiAJLyogQ2FsY3VsYXRlIE1JQyAqLwogCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKQEAgLTE0ODcsNyArMTQ5NSw3IEBACiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQogCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7CiAJCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkgICAgcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbcGF5bG9hZF9pbmRleCsrXTsKKwkJCXBhZGRlZF9idWZmZXJbal0gPSBtZXNzYWdlW3BheWxvYWRfaW5kZXgrK107CiAJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CiAJCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKIAl9CkBAIC0xNDk3LDEyICsxNTA1LDEyIEBACiAKIAkvKiBJbnNlcnQgTUlDIGludG8gcGF5bG9hZCAqLwogCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCW1lc3NhZ2VbcGF5bG9hZF9pbmRleCtqXSA9IG1pY1tqXTsKKwkJbWVzc2FnZVtwYXlsb2FkX2luZGV4ICsgal0gPSBtaWNbal07CiAKIAlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKLQlmb3IgKGkgPSAwOyBpPCBudW1fYmxvY2tzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7CiAJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsCi0JCQkJICAgICAgbWVzc2FnZSwgcG5fdmVjdG9yLCBpKzEpOworCQkJCSAgICAgIG1lc3NhZ2UsIHBuX3ZlY3RvciwgaSArIDEpOwogCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKIAkJYml0d2lzZV94b3IoYWVzX291dCwgJm1lc3NhZ2VbcGF5bG9hZF9pbmRleF0sIGNoYWluX2J1ZmZlcik7CiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQpAQCAtMTUxNCwxMiArMTUyMiwxMiBAQAogCQkgKiBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKIAkJICovCiAJCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsCi0JCQkJICAgICAgbWVzc2FnZSwgcG5fdmVjdG9yLCBudW1fYmxvY2tzKzEpOworCQkJCSAgICAgIG1lc3NhZ2UsIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcyArIDEpOwogCiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJIHBhZGRlZF9idWZmZXJbal0gPSAweDAwOworCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7CiAJCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbcGF5bG9hZF9pbmRleCtqXTsKKwkJCXBhZGRlZF9idWZmZXJbal0gPSBtZXNzYWdlW3BheWxvYWRfaW5kZXggKyBqXTsKIAkJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CiAJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CiAJCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQpAQCAtMTUzMyw3ICsxNTQxLDcgQEAKIAlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKIAkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7CiAJZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbaitoZHJsZW4rOCtwbGVuLThdOworCQlwYWRkZWRfYnVmZmVyW2pdID0gbWVzc2FnZVtqICsgaGRybGVuICsgOCArIHBsZW4gLSA4XTsKIAogCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwogCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CkBAIC0xNTQyLDEyICsxNTUwLDE2IEBACiAKIAkvKiBjb21wYXJlIHRoZSBtaWMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChwZnJhbWVbaGRybGVuKzgrcGxlbi04K2ldICE9IG1lc3NhZ2VbaGRybGVuKzgrcGxlbi04K2ldKSB7CisJCWlmIChwZnJhbWVbaGRybGVuICsgOCArIHBsZW4gLSA4ICsgaV0gIT0gbWVzc2FnZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiYWVzX2RlY2lwaGVyOm1pYyBjaGVjayBlcnJvciBtaWNbJWRdOiBwZnJhbWUoJXgpICE9IG1lc3NhZ2UoJXgpXG4iLAotCQkJCSBpLCBwZnJhbWVbaGRybGVuKzgrcGxlbi04K2ldLCBtZXNzYWdlW2hkcmxlbis4K3BsZW4tOCtpXSkpOwotCQkJREJHXzg3MjNBKCJhZXNfZGVjaXBoZXI6bWljIGNoZWNrIGVycm9yIG1pY1slZF06IHBmcmFtZSgleCkgIT0gbWVzc2FnZSgleClcbiIsCi0JCQkJICBpLCBwZnJhbWVbaGRybGVuKzgrcGxlbi04K2ldLCBtZXNzYWdlW2hkcmxlbis4K3BsZW4tOCtpXSk7CisJCQkJICIlczptaWMgY2hlY2sgZXJyb3IgbWljWyVkXTogcGZyYW1lKCV4KSAhPSBtZXNzYWdlKCV4KVxuIiwKKwkJCQkgX19mdW5jX18sIGksCisJCQkJIHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSwKKwkJCQkgbWVzc2FnZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSk7CisJCQlEQkdfODcyM0EoIiVzOm1pYyBjaGVjayBlcnJvciBtaWNbJWRdOiBwZnJhbWUoJXgpICE9IG1lc3NhZ2UoJXgpXG4iLAorCQkJCSAgX19mdW5jX18sIGksCisJCQkJICBwZnJhbWVbaGRybGVuICsgOCArIHBsZW4gLSA4ICsgaV0sCisJCQkJICBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKTsKIAkJCXJlcyA9IF9GQUlMOwogCQl9CiAJfQpAQCAtMTU2Miw3ICsxNTc0LDcgQEAKIAlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdmZyYW1lLT5wa3Q7CiAJaW50IGxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcHJ3c2tleTsJLyogICpwYXlsb2FkLCppdiAqLworCXU4ICpwZnJhbWUsICpwcndza2V5OwogCWludCByZXMgPSBfU1VDQ0VTUzsKIAogCXBmcmFtZSA9IHNrYi0+ZGF0YTsKQEAgLTE1NzMsMTcgKzE1ODUsMTggQEAKIAlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgJnByeGF0dHJpYi0+dGFbMF0pOwogCWlmICghc3RhaW5mbykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAoInJ0d19hZXNfZW5jcnlwdDIzYTogc3RhaW5mbyA9PSBOVUxMISEhXG4iKSk7CisJCQkgIiVzOiBzdGFpbmZvID09IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJICgicnR3X2Flc19kZWNyeXB0MjNhOiBzdGFpbmZvIT0gTlVMTCEhIVxuIikpOworCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwogCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSB7Ci0JCS8qIGluIGNvbmN1cnJlbnQgd2Ugc2hvdWxkIHVzZSBzdyBkZWNyeXB0IGluIGdyb3VwIGtleSwKLQkJICAgc28gd2UgcmVtb3ZlIHRoaXMgbWVzc2FnZSAqLworCQkvKiBpbiBjb25jdXJyZW50IHdlIHNob3VsZCB1c2Ugc3cgZGVjcnlwdCBpbgorCQkgKiBncm91cCBrZXksIHNvIHdlIHJlbW92ZSB0aGlzIG1lc3NhZ2UKKwkJICovCiAJCWlmICghcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkpIHsKIAkJCXJlcyA9IF9GQUlMOwogCQkJREJHXzg3MjNBKCIlczpyeCBiYy9tYyBwYWNrZXRzLCBidXQgZGlkbid0IGluc3RhbGwgIgpAQCAtMTYxMyw5ICsxNjI2LDEwIEBACiB7CiAJc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJeXl5ydHdfdXNlX3RraXBrZXlfaGFuZGxlcjIzYSBeXl5cbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKKwkJICJeXl4lcyBeXl5cbiIsIF9fZnVuY19fKTsKIAlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5ID0gMTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJICgiXl5ecnR3X3VzZV90a2lwa2V5X2hhbmRsZXIyM2EgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9JWReXl5cbiIsCi0JCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KSk7CisJCSAiXl5eJXMgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9JWReXl5cbiIsCisJCSBfX2Z1bmNfXywgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3N0YV9tZ3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc3RhX21ndC5jCmluZGV4IGQxNzk5OGQuLmIwNmJmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc3RhX21ndC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc3RhX21ndC5jCkBAIC0xMzYsMTAgKzEzNiwxMCBAQAogCWluZGV4ID0gd2lmaV9tYWNfaGFzaChod2FkZHIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18sIF9kcnZfaW5mb18sCi0JCSAoInJ0d19hbGxvY19zdGFpbmZvMjNhOiBpbmRleCAgPSAleCIsIGluZGV4KSk7CisJCSAicnR3X2FsbG9jX3N0YWluZm8yM2E6IGluZGV4ICA9ICV4XG4iLCBpbmRleCk7CiAJaWYgKGluZGV4ID49IE5VTV9TVEEpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18sIF9kcnZfZXJyXywKLQkJCSAoIkVSUk9SID0+IHJ0d19hbGxvY19zdGFpbmZvMjNhOiBpbmRleCA+PSBOVU1fU1RBIikpOworCQkJICJFUlJPUiA9PiBydHdfYWxsb2Nfc3RhaW5mbzIzYTogaW5kZXggPj0gTlVNX1NUQVxuIik7CiAJCXBzdGEgPSBOVUxMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTYwLDggKzE2MCw4IEBACiAJCQkmd1J4U2VxSW5pdGlhbFZhbHVlLCAyKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJhbGxvYyBudW1iZXJfJWQgc3RhaW5mbyAgd2l0aCBod2FkZHIgPSAlcE1cbiIsCi0JCSBwc3RhcHJpdi0+YXNvY19zdGFfY291bnQsIGh3YWRkcikpOworCQkgImFsbG9jIG51bWJlcl8lZCBzdGFpbmZvICB3aXRoIGh3YWRkciA9ICVwTVxuIiwKKwkJIHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCwgaHdhZGRyKTsKIAogCWluaXRfYWRkYmFfcmV0cnlfdGltZXIyM2EocHN0YSk7CiAKQEAgLTI0OSwxMCArMjQ5LDggQEAKIAogCWxpc3RfZGVsX2luaXQoJnBzdGEtPmhhc2hfbGlzdCk7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18sIF9kcnZfZXJyXywKLQkJKCJcbiBmcmVlIG51bWJlcl8lZCBzdGFpbmZvICB3aXRoIGh3YWRkciA9IDB4JS4yeCAweCUuMnggMHglLjJ4IDB4JS4yeCAweCUuMnggMHglLjJ4XG4iLAotCQkJcHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50LCBwc3RhLT5od2FkZHJbMF0sCi0JCQlwc3RhLT5od2FkZHJbMV0sIHBzdGEtPmh3YWRkclsyXSwgcHN0YS0+aHdhZGRyWzNdLAotCQkJcHN0YS0+aHdhZGRyWzRdLCBwc3RhLT5od2FkZHJbNV0pKTsKKwkJICJmcmVlIG51bWJlcl8lZCBzdGFpbmZvICB3aXRoIGh3YWRkciA9ICVwTVxuIiwKKwkJIHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCwgcHN0YS0+aHdhZGRyKTsKIAlwc3RhcHJpdi0+YXNvY19zdGFfY291bnQtLTsKIAogCS8qICByZS1pbml0IHN0YV9pbmZvOyAyMDA2MTExNCAgd2lsbCBiZSBpbml0IGluIGFsbG9jX3N0YWluZm8gKi8KQEAgLTM5Nyw3ICszOTUsNyBAQAogCWlmIChwc3RhID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJydHdfYWxsb2Nfc3RhaW5mbzIzYSBmYWlsIikpOworCQkJICJydHdfYWxsb2Nfc3RhaW5mbzIzYSBmYWlsXG4iKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAJLyogIGRlZmF1bHQgYnJvYWRjYXN0ICYgbXVsdGljYXN0IHVzZSBtYWNpZCAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3dsYW5fdXRpbC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d193bGFuX3V0aWwuYwppbmRleCA2OWQ5ZTBmLi41MjgwMzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfd2xhbl91dGlsLmMKQEAgLTg3Niw5ICs4NzYsOSBAQAogCX0KIAogCWlmICghZXRoZXJfYWRkcl9lcXVhbChjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBtZ210LT5ic3NpZCkpIHsKLQkJREJHXzg3MjNBKCIlczogbGlua2VkIGJ1dCByZWN2IG90aGVyIGJzc2lkIGJjbiIKLQkJCSAgTUFDX0ZNVCBNQUNfRk1UICJcbiIsIF9fZnVuY19fLCBNQUNfQVJHKG1nbXQtPmJzc2lkKSwKLQkJCSAgTUFDX0FSRyhjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSk7CisJCURCR184NzIzQSgiJXM6IGxpbmtlZCBidXQgcmVjdiBvdGhlciBic3NpZCBiY24gJXBNICVwTVxuIiwKKwkJCSAgX19mdW5jX18sIG1nbXQtPmJzc2lkLAorCQkJICBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KIApAQCAtOTI2LDEwICs5MjYsOSBAQAogCX0KIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlcyBic3NpZC5Tc2lkLlNzaWQ6JXMgYnNzaWQuU3NpZC5Tc2lkTGVuZ3RoOiVkICIKLQkJICAiY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkOiVzIGxlbjolZFxuIiwgX19mdW5jX18sCi0JCSAgc3NpZCwgc3NpZF9sZW4sIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJICBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKSk7CisJCSAiJXMgYnNzaWQuU3NpZC5Tc2lkOiVzIGJzc2lkLlNzaWQuU3NpZExlbmd0aDolZCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQ6JXMgbGVuOiVkXG4iLAorCQkgX19mdW5jX18sIHNzaWQsIHNzaWRfbGVuLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCisJCSBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKTsKIAogCWlmIChzc2lkX2xlbiAhPSBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuIHx8IHNzaWRfbGVuID4gMzIgfHwKIAkgICAgKHNzaWRfbGVuICYmCkBAIC05NDcsOCArOTQ2LDggQEAKIAkJcHJpdmFjeSA9IDA7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgiJXMoKTogY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSBpcyAlZCwgYnNzaWQuUHJpdmFjeSAiCi0JCSAgImlzICVkXG4iLCBfX2Z1bmNfXywgY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSwgcHJpdmFjeSkpOworCQkgIiVzKCk6IGN1cl9uZXR3b3JrLT5uZXR3b3JrLlByaXZhY3kgaXMgJWQsIGJzc2lkLlByaXZhY3kgaXMgJWRcbiIsCisJCSBfX2Z1bmNfXywgY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSwgcHJpdmFjeSk7CiAJaWYgKGN1cl9uZXR3b3JrLT5uZXR3b3JrLlByaXZhY3kgIT0gcHJpdmFjeSkgewogCQlEQkdfODcyM0EoIiVzKCksIHByaXZhY3kgaXMgbm90IG1hdGNoIHJldHVybiBGQUlMXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gX21pc21hdGNoOwpAQCAtOTYyLDEwICs5NjEsOSBAQAogCQkJCQkJICZwYWlyd2lzZV9jaXBoZXIsICZpc184MDIxeCk7CiAJCQlpZiAociA9PSBfU1VDQ0VTUykKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiJXMgcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQsICIKLQkJCQkJICAicG5ldHdvcmstPmdyb3VwX2NpcGhlcjogJWQsIGlzXzgwMnggIgotCQkJCQkgICI6ICVkXG4iLCBfX2Z1bmNfXywgcGFpcndpc2VfY2lwaGVyLAotCQkJCQkgIGdyb3VwX2NpcGhlciwgaXNfODAyMXgpKTsKKwkJCQkJICIlcyBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwgcG5ldHdvcmstPmdyb3VwX2NpcGhlcjogJWQsIGlzXzgwMnggOiAlZFxuIiwKKwkJCQkJIF9fZnVuY19fLCBwYWlyd2lzZV9jaXBoZXIsCisJCQkJCSBncm91cF9jaXBoZXIsIGlzXzgwMjF4KTsKIAkJCX0KIAl9IGVsc2UgewogCQlwID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULApAQCAtOTc3LDEwICs5NzUsOSBAQAogCQkJCQkJJnBhaXJ3aXNlX2NpcGhlciwgJmlzXzgwMjF4KTsKIAkJCWlmIChyID09IF9TVUNDRVNTKQogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCIlcyBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwgIgotCQkJCQkgICJncm91cF9jaXBoZXIgaXMgJWQsIGlzXzgwMjF4IGlzICIKLQkJCQkJICAiJWRcbiIsIF9fZnVuY19fLCBwYWlyd2lzZV9jaXBoZXIsCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLCBpc184MDIxeCkpOworCQkJCQkgIiVzIHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCBncm91cF9jaXBoZXIgaXMgJWQsIGlzXzgwMjF4IGlzICVkXG4iLAorCQkJCQkgX19mdW5jX18sIHBhaXJ3aXNlX2NpcGhlciwKKwkJCQkJIGdyb3VwX2NpcGhlciwgaXNfODAyMXgpOwogCQl9IGVsc2UgewogCQkJaWYgKHByaXZhY3kpCiAJCQkJY3J5cHRvID0gRU5DUllQX1BST1RPQ09MX1dFUDsKQEAgLTk5Niw4ICs5OTMsOCBAQAogCiAJaWYgKGNyeXB0byA9PSBFTkNSWVBfUFJPVE9DT0xfV1BBIHx8IGNyeXB0byA9PSBFTkNSWVBfUFJPVE9DT0xfV1BBMikgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiJXMgY3VyX25ldHdvcmstPmdyb3VwX2NpcGhlciBpcyAlZDogJWRcbiIsIF9fZnVuY19fLAotCQkJICBjdXJfbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIsIGdyb3VwX2NpcGhlcikpOworCQkJICIlcyBjdXJfbmV0d29yay0+Z3JvdXBfY2lwaGVyIGlzICVkOiAlZFxuIiwgX19mdW5jX18sCisJCQkgY3VyX25ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyLCBncm91cF9jaXBoZXIpOwogCQlpZiAocGFpcndpc2VfY2lwaGVyICE9IGN1cl9uZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciB8fAogCQkgICAgZ3JvdXBfY2lwaGVyICE9IGN1cl9uZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlcikgewogCQkJREJHXzg3MjNBKCIlcyBwYWlyd2lzZV9jaXBoZXIoJXg6JXgpIG9yIGdyb3VwX2NpcGhlciAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfeG1pdC5jCmluZGV4IDFjODJkZmYuLmE0YjZiYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfeG1pdC5jCkBAIC00NjMsOSArNDYzLDcgQEAKIAkJCQkJLyogIDY3IDogVURQIEJPT1RQIHNlcnZlciAqLwogCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywKIAkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgKCI9PT09PT09PT09PT09PT09PT09PT09IgotCQkJCQkJICAidXBkYXRlX2F0dHJpYjogZ2V0IERIQ1AgIgotCQkJCQkJICAiUGFja2V0XG4iKSk7CisJCQkJCQkgIj09PT09PT09PT09PT09PT09PT09PT11cGRhdGVfYXR0cmliOiBnZXQgREhDUCBQYWNrZXRcbiIpOwogCQkJCQlwYXR0cmliLT5kaGNwX3BrdCA9IDE7CiAJCQkJfQogCQkJfQpAQCAtNDkzLDggKzQ5MSw4IEBACiAJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnJhKTsKIAkJaWYgKHBzdGEgPT0gTlVMTCkgeyAvKiAgaWYgd2UgY2Fubm90IGdldCBwc3RhID0+IGRycnAgdGhlIHBrdCAqLwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfYWxlcnRfLAotCQkJCSAoIlxudXBkYXRlX2F0dHJpYiA9PiBnZXQgc3RhX2luZm8gZmFpbCwgcmE6IgotCQkJCSAgTUFDX0ZNVCJcbiIsIE1BQ19BUkcocGF0dHJpYi0+cmEpKSk7CisJCQkJICJ1cGRhdGVfYXR0cmliID0+IGdldCBzdGFfaW5mbyBmYWlsLCByYTolcE1cbiIsCisJCQkJIHBhdHRyaWItPnJhKTsKIAkJCXJlcyA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSAmJgpAQCAtNTExLDggKzUwOSw4IEBACiAJfSBlbHNlIHsKIAkJLyogIGlmIHdlIGNhbm5vdCBnZXQgcHN0YSA9PiBkcm9wIHRoZSBwa3QgKi8KIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfYWxlcnRfLAotCQkJICgiXG51cGRhdGVfYXR0cmliID0+IGdldCBzdGFfaW5mbyBmYWlsLCByYToiIE1BQ19GTVQKLQkJCSAgIlxuIiwgTUFDX0FSRyhwYXR0cmliLT5yYSkpKTsKKwkJCSAidXBkYXRlX2F0dHJpYiA9PiBnZXQgc3RhX2luZm8gZmFpbCwgcmE6JXBNXG4iLAorCQkJIHBhdHRyaWItPnJhKTsKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC01NDQsMTYgKzU0MiwxNSBAQAogCiAJaWYgKHBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuIHBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWVcbiIpKTsKKwkJCSAicHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZVxuIik7CiAKIAkJcGF0dHJpYi0+ZW5jcnlwdCA9IDA7CiAKIAkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgJiYKIAkJICAgICFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiXG5wc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PSB0cnVlLCAgIgotCQkJCSAgInBhdHRyaWItPmV0aGVyX3R5cGUoJS40eCkgIT0gMHg4ODhlXG4iLAotCQkJCSAgcGF0dHJpYi0+ZXRoZXJfdHlwZSkpOworCQkJCSAicHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZSwgIHBhdHRyaWItPmV0aGVyX3R5cGUoJS40eCkgIT0gMHg4ODhlXG4iLAorCQkJCSBwYXR0cmliLT5ldGhlcl90eXBlKTsKIAkJCXJlcyA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC01OTQsOSArNTkxLDggQEAKIAogCQlpZiAoIXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiXG5wYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwIgotCQkJCSAgImtleSglZCkgPT0gZmFsc2UgZHJvcCBwYWNrZXRcbiIsCi0JCQkJICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KSk7CisJCQkJICJwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KCVkKSA9PSBmYWxzZSBkcm9wIHBhY2tldFxuIiwKKwkJCQkgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSk7CiAJCQlyZXMgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtNjA0LDggKzYwMCw4IEBACiAJCWJyZWFrOwogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJwYXR0cmliLT5lbmNyeXB0ID0lZCAoV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUClcbiIsCi0JCQkgIHBhdHRyaWItPmVuY3J5cHQpKTsKKwkJCSAicGF0dHJpYi0+ZW5jcnlwdCA9JWQgKFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApXG4iLAorCQkJIHBhdHRyaWItPmVuY3J5cHQpOwogCQlwYXR0cmliLT5pdl9sZW4gPSBJRUVFODAyMTFfQ0NNUF9IRFJfTEVOOwogCQlwYXR0cmliLT5pY3ZfbGVuID0gSUVFRTgwMjExX0NDTVBfTUlDX0xFTjsKIAkJYnJlYWs7CkBAIC02MTcsMTcgKzYxMywxNyBAQAogCX0KIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJ1cGRhdGVfYXR0cmliOiBlbmNyeXB0ID0lZFxuIiwgcGF0dHJpYi0+ZW5jcnlwdCkpOworCQkgInVwZGF0ZV9hdHRyaWI6IGVuY3J5cHQgPSVkXG4iLCBwYXR0cmliLT5lbmNyeXB0KTsKIAogCWlmIChwYXR0cmliLT5lbmNyeXB0ICYmICFwc2VjdXJpdHlwcml2LT5od19kZWNyeXB0ZWQpIHsKIAkJcGF0dHJpYi0+YnN3ZW5jID0gdHJ1ZTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAoInVwZGF0ZV9hdHRyaWI6IGVuY3J5cHQgPSVkIGJzd2VuYyA9IHRydWVcbiIsCi0JCQkgIHBhdHRyaWItPmVuY3J5cHQpKTsKKwkJCSAidXBkYXRlX2F0dHJpYjogZW5jcnlwdCA9JWQgYnN3ZW5jID0gdHJ1ZVxuIiwKKwkJCSBwYXR0cmliLT5lbmNyeXB0KTsKIAl9IGVsc2UgewogCQlwYXR0cmliLT5ic3dlbmMgPSBmYWxzZTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJ1cGRhdGVfYXR0cmliOiBic3dlbmMgPSBmYWxzZVxuIikpOworCQkJICJ1cGRhdGVfYXR0cmliOiBic3dlbmMgPSBmYWxzZVxuIik7CiAJfQogCXVwZGF0ZV9hdHRyaWJfcGh5X2luZm8ocGF0dHJpYiwgcHN0YSk7CiAKQEAgLTcyNiwyMCArNzIyLDE4IEBACiAJCQkgICAgIGN1cmZyYWdudW0rKykgewogCQkJCXBheWxvYWQgPSBQVFJfQUxJR04ocGF5bG9hZCwgNCk7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiPT09IGN1cmZyYWdudW0gPSVkLCBwZnJhbWUgPSAweCUuMngsICIKLQkJCQkJICAiMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCIKLQkJCQkJICAiJS4yeCwgMHglLjJ4LCAweCUuMngsISEhXG4iLAotCQkJCQkgIGN1cmZyYWdudW0sICpwYXlsb2FkLCAqKHBheWxvYWQgKyAxKSwKLQkJCQkJICAqKHBheWxvYWQgKyAyKSwgKihwYXlsb2FkICsgMyksCi0JCQkJCSAgKihwYXlsb2FkICsgNCksICoocGF5bG9hZCArIDUpLAotCQkJCQkgICoocGF5bG9hZCArIDYpLCAqKHBheWxvYWQgKyA3KSkpOworCQkJCQkgIj09PSBjdXJmcmFnbnVtID0lZCwgcGZyYW1lID0gMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsISEhXG4iLAorCQkJCQkgY3VyZnJhZ251bSwgKnBheWxvYWQsICoocGF5bG9hZCArIDEpLAorCQkJCQkgKihwYXlsb2FkICsgMiksICoocGF5bG9hZCArIDMpLAorCQkJCQkgKihwYXlsb2FkICsgNCksICoocGF5bG9hZCArIDUpLAorCQkJCQkgKihwYXlsb2FkICsgNiksICoocGF5bG9hZCArIDcpKTsKIAogCQkJCXBheWxvYWQgPSBwYXlsb2FkICsgcGF0dHJpYi0+aGRybGVuICsKIAkJCQkJcGF0dHJpYi0+aXZfbGVuOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoImN1cmZyYWdudW0gPSVkIHBhdHRyaWItPmhkcmxlbiA9JWQgIgotCQkJCQkgICJwYXR0cmliLT5pdl9sZW4gPSVkIiwgY3VyZnJhZ251bSwKLQkJCQkJICBwYXR0cmliLT5oZHJsZW4sIHBhdHRyaWItPml2X2xlbikpOworCQkJCQkgImN1cmZyYWdudW0gPSVkIHBhdHRyaWItPmhkcmxlbiA9JWQgcGF0dHJpYi0+aXZfbGVuID0lZFxuIiwKKwkJCQkJIGN1cmZyYWdudW0sCisJCQkJCSBwYXR0cmliLT5oZHJsZW4sIHBhdHRyaWItPml2X2xlbik7CiAJCQkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsKIAkJCQkJbGVuZ3RoID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6IC0KIAkJCQkJCXBhdHRyaWItPmhkcmxlbiAtCkBAIC03NjEsMjUgKzc1NSwyMSBAQAogCQkJCQkJcGF0dHJpYi0+aWN2X2xlbjsKIAkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sCiAJCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICgiY3VyZnJhZ251bSA9JWQgbGVuZ3RoID0lZCAiCi0JCQkJCQkgICJwYXR0cmliLT5pY3ZfbGVuID0lZCIsCi0JCQkJCQkgIGN1cmZyYWdudW0sIGxlbmd0aCwKLQkJCQkJCSAgcGF0dHJpYi0+aWN2X2xlbikpOworCQkJCQkJICJjdXJmcmFnbnVtID0lZCBsZW5ndGggPSVkIHBhdHRyaWItPmljdl9sZW4gPSVkXG4iLAorCQkJCQkJIGN1cmZyYWdudW0sIGxlbmd0aCwKKwkJCQkJCSBwYXR0cmliLT5pY3ZfbGVuKTsKIAkJCQl9CiAJCQl9CiAJCQlydHdfc2VjZ2V0bWljMjNhKCZtaWNkYXRhLCAmbWljWzBdKTsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgieG1pdGZyYW1lX2FkZG1pYzogYmVmb3JlIGFkZCBtaWMgY29kZSEhXG4iKSk7CisJCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBiZWZvcmUgYWRkIG1pYyBjb2RlISFcbiIpOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ4bWl0ZnJhbWVfYWRkbWljOiBwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSIKLQkJCQkgICIlZCEhIVxuIiwgcGF0dHJpYi0+bGFzdF90eGNtZHN6KSk7CisJCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSVkISEhXG4iLAorCQkJCSBwYXR0cmliLT5sYXN0X3R4Y21kc3opOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ4bWl0ZnJhbWVfYWRkbWljOiBtaWNbMF09IDB4JS4yeCAsIG1pY1sxXT0iCi0JCQkJICAiMHglLjJ4ICwgbWljWzJdPSAweCUuMnggLCBtaWNbM109IDB4JS4yeFxuIgotCQkJCSAgIm1pY1s0XT0gMHglLjJ4ICwgbWljWzVdPSAweCUuMnggLCBtaWNbNl09IDB4JS4yeCAiCi0JCQkJICAiLCBtaWNbN109IDB4JS4yeCAhISEhXG4iLCBtaWNbMF0sIG1pY1sxXSwKLQkJCQkgIG1pY1syXSwgbWljWzNdLCBtaWNbNF0sIG1pY1s1XSwgbWljWzZdLAotCQkJCSAgbWljWzddKSk7CisJCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBtaWNbMF09IDB4JS4yeCAsIG1pY1sxXT0weCUuMnggLCBtaWNbMl09IDB4JS4yeCAsIG1pY1szXT0gMHglLjJ4XG5taWNbNF09IDB4JS4yeCAsIG1pY1s1XT0gMHglLjJ4ICwgbWljWzZdPSAweCUuMnggLCBtaWNbN109IDB4JS4yeCAhISEhXG4iLAorCQkJCSBtaWNbMF0sIG1pY1sxXSwgbWljWzJdLCBtaWNbM10sCisJCQkJIG1pY1s0XSwgbWljWzVdLCBtaWNbNl0sIG1pY1s3XSk7CiAJCQkvKiBhZGQgbWljIGNvZGUgIGFuZCBhZGQgdGhlIG1pYyBjb2RlIGxlbmd0aAogCQkJICAgaW4gbGFzdF90eGNtZHN6ICovCiAKQEAgLTc4NywyNSArNzc3LDI0IEBACiAJCQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogKz0gODsKIAogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiXG4gPT09PT09PT0gbGFzdCBwa3QgPT09PT09PT1cbiIpKTsKKwkJCQkgIj09PT09PT09IGxhc3QgcGt0ID09PT09PT09XG4iKTsKIAkJCXBheWxvYWQgPSBwYXlsb2FkIC0gcGF0dHJpYi0+bGFzdF90eGNtZHN6ICsgODsKIAkJCWZvciAoY3VyZnJhZ251bSA9IDA7IGN1cmZyYWdudW0gPCBwYXR0cmliLT5sYXN0X3R4Y21kc3o7Ci0JCQkgICAgIGN1cmZyYWdudW0gPSBjdXJmcmFnbnVtICsgOCkKKwkJCSAgICAgY3VyZnJhZ251bSA9IGN1cmZyYWdudW0gKyA4KSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoIiAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgIgotCQkJCQkgICIgJS4yeCwgICUuMngsICAlLjJ4ICIsCi0JCQkJCSAgKihwYXlsb2FkICsgY3VyZnJhZ251bSksCi0JCQkJCSAgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDEpLAotCQkJCQkgICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAyKSwKLQkJCQkJICAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgMyksCi0JCQkJCSAgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDQpLAotCQkJCQkgICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA1KSwKLQkJCQkJICAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgNiksCi0JCQkJCSAgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDcpKSk7Ci0JCQl9IGVsc2UgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoInhtaXRmcmFtZV9hZGRtaWM6IHJ0d19nZXRfc3RhaW5mbzIzYSA9PSIKLQkJCQkJICAiTlVMTCEhIVxuIikpOworCQkJCQkgIiUuMngsICAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4XG4iLAorCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSksCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgMSksCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgMiksCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgMyksCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgNCksCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgNSksCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgNiksCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgNykpOworCQkJfQorCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKKwkJCQkgInhtaXRmcmFtZV9hZGRtaWM6IHJ0d19nZXRfc3RhaW5mbzIzYSA9PU5VTEwhISFcbiIpOwogCQl9CiAJfQogCkBAIC04MjEsNyArODEwLDcgQEAKIAlpZiAocGF0dHJpYi0+YnN3ZW5jKSB7CiAJCS8qIERCR184NzIzQSgic3RhcnQgeG1pdGZyYW1lX3N3ZW5jcnlwdFxuIik7ICovCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2FsZXJ0XywKLQkJCSAoIiMjIyB4bWl0ZnJhbWVfc3dlbmNyeXB0XG4iKSk7CisJCQkgIiMjIyB4bWl0ZnJhbWVfc3dlbmNyeXB0XG4iKTsKIAkJc3dpdGNoIChwYXR0cmliLT5lbmNyeXB0KSB7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgpAQCAtODM5LDcgKzgyOCw3IEBACiAKIAl9IGVsc2UgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkJICgiIyMjIHhtaXRmcmFtZV9od2VuY3J5cHRcbiIpKTsKKwkJCSAiIyMjIHhtaXRmcmFtZV9od2VuY3J5cHRcbiIpOwogCX0KIAogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTkxNiw3ICs5MDUsOSBAQAogCQkJCXFvc19vcHRpb24gPSB0cnVlOwogCQl9CiAJCWVsc2UgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCJmd19zdGF0ZToleCBpcyBub3QgYWxsb3dlZCB0byB4bWl0IGZyYW1lXG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CisJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAorCQkJCSAiZndfc3RhdGU6JXggaXMgbm90IGFsbG93ZWQgdG8geG1pdCBmcmFtZVxuIiwKKwkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7CiAJCQlyZXMgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMTExNyw3ICsxMTA4LDcgQEAKIAogCWlmIChydHdfbWFrZV93bGFuaGRyKHBhZGFwdGVyLCBtZW1fc3RhcnQsIHBhdHRyaWIpID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogcnR3X21ha2Vfd2xhbmhkciBmYWlsOyBkcm9wIHBrdFxuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6IHJ0d19tYWtlX3dsYW5oZHIgZmFpbDsgZHJvcCBwa3RcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xMTcyLDExICsxMTYzLDEwIEBACiAJCQltZW1jcHkocGZyYW1lLCBwYXR0cmliLT5pdiwgcGF0dHJpYi0+aXZfbGVuKTsKIAogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfbm90aWNlXywKLQkJCQkgKCJydHdfeG1pYWZyYW1lX2NvYWxlc2NlMjNhOiBrZXlpZCA9JWQgcGF0dHJpYiIKLQkJCQkgICItPml2WzNdPSUuMnggcGZyYW1lID0lLjJ4ICUuMnggJS4yeCAlLjJ4XG4iLAotCQkJCSAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lLZXlJbmRleCwKLQkJCQkgIHBhdHRyaWItPml2WzNdLCAqcGZyYW1lLCAqKHBmcmFtZSsxKSwKLQkJCQkgICoocGZyYW1lKzIpLCAqKHBmcmFtZSszKSkpOworCQkJCSAicnR3X3htaWFmcmFtZV9jb2FsZXNjZTIzYToga2V5aWQgPSVkIHBhdHRyaWItPml2WzNdPSUuMnggcGZyYW1lID0lLjJ4ICUuMnggJS4yeCAlLjJ4XG4iLAorCQkJCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUtleUluZGV4LAorCQkJCSBwYXR0cmliLT5pdlszXSwgKnBmcmFtZSwgKihwZnJhbWUrMSksCisJCQkJICoocGZyYW1lKzIpLCAqKHBmcmFtZSszKSk7CiAJCQlwZnJhbWUgKz0gcGF0dHJpYi0+aXZfbGVuOwogCQkJbXBkdV9sZW4gLT0gcGF0dHJpYi0+aXZfbGVuOwogCQl9CkBAIC0xMjIzLDggKzEyMTMsOCBAQAogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAoIiVzOiBUaGVyZSdyZSBzdGlsbCBzb21ldGhpbmcgaW4gcGFja2V0IVxuIiwKLQkJCQkgIF9fZnVuY19fKSk7CisJCQkJICIlczogVGhlcmUncmUgc3RpbGwgc29tZXRoaW5nIGluIHBhY2tldCFcbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJfQogCQloZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKIApAQCAtMTIzNCw3ICsxMjI0LDcgQEAKIAogCWlmICh4bWl0ZnJhbWVfYWRkbWljKHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICgieG1pdGZyYW1lX2FkZG1pYyhwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUxcbiIpKTsKKwkJCSAieG1pdGZyYW1lX2FkZG1pYyhwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUxcbiIpOwogCQlEQkdfODcyM0EoInhtaXRmcmFtZV9hZGRtaWMocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMXG4iKTsKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKQEAgLTE0NjIsOCArMTQ1Miw4IEBACiAKIAlpZiAobGlzdF9lbXB0eSgmcGZyZWVfeG1pdF9xdWV1ZS0+cXVldWUpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgicnR3X2FsbG9jX3htaXRmcmFtZTolZFxuIiwKLQkJCSAgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpKTsKKwkJCSAicnR3X2FsbG9jX3htaXRmcmFtZTolZFxuIiwKKwkJCSBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCk7CiAJCXB4ZnJhbWUgPSAgTlVMTDsKIAl9IGVsc2UgewogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyZWVfeG1pdF9xdWV1ZSk7CkBAIC0xNDc1LDggKzE0NjUsOCBAQAogCQlsaXN0X2RlbF9pbml0KCZweGZyYW1lLT5saXN0KTsKIAkJcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQtLTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJydHdfYWxsb2NfeG1pdGZyYW1lKCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwKLQkJCSAgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpKTsKKwkJCSAicnR3X2FsbG9jX3htaXRmcmFtZSgpOmZyZWVfeG1pdGZyYW1lX2NudCA9JWRcbiIsCisJCQkgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV94bWl0X3F1ZXVlLT5sb2NrKTsKQEAgLTE0OTUsNyArMTQ4NSw5IEBACiAJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CiAKIAlpZiAobGlzdF9lbXB0eSgmcXVldWUtPnF1ZXVlKSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCJydHdfYWxsb2NfeG1pdGZyYW1lMjNhX2V4dDolZFxuIiwgcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250KSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAorCQkJICJydHdfYWxsb2NfeG1pdGZyYW1lMjNhX2V4dDolZFxuIiwKKwkJCSBweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQpOwogCQlweGZyYW1lID0gIE5VTEw7CiAJfSBlbHNlIHsKIAkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKQEAgLTE1MDQsNyArMTQ5Niw5IEBACiAKIAkJbGlzdF9kZWxfaW5pdCgmcHhmcmFtZS0+bGlzdCk7CiAJCXB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudC0tOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCJydHdfYWxsb2NfeG1pdGZyYW1lMjNhX2V4dCgpOmZyZWVfeG1pdGZyYW1lX2NudCA9JWRcbiIsIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCkpOworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKKwkJCSAicnR3X2FsbG9jX3htaXRmcmFtZTIzYV9leHQoKTpmcmVlX3htaXRmcmFtZV9jbnQgPSVkXG4iLAorCQkJIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKQEAgLTE1MjEsNyArMTUxNSw4IEBACiAJc3RydWN0IHNrX2J1ZmYgKnBuZGlzX3BrdCA9IE5VTEw7CiAKIAlpZiAocHhtaXRmcmFtZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sICgiPT09PT09IHJ0d19mcmVlX3htaXRmcmFtZTIzYSgpOnB4bWl0ZnJhbWUgPT0gTlVMTCEhISEhISEhISFcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKKwkJCSAiPT09PT09IHJ0d19mcmVlX3htaXRmcmFtZTIzYSgpOnB4bWl0ZnJhbWUgPT0gTlVMTCEhISEhISEhISFcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xNTQzLDEwICsxNTM4LDE0IEBACiAJbGlzdF9hZGRfdGFpbCgmcHhtaXRmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZChxdWV1ZSkpOwogCWlmIChweG1pdGZyYW1lLT5leHRfdGFnID09IDApIHsKIAkJcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQrKzsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZGVidWdfLCAoInJ0d19mcmVlX3htaXRmcmFtZTIzYSgpOmZyZWVfeG1pdGZyYW1lX2NudCA9JWRcbiIsIHB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250KSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2RlYnVnXywKKwkJCSAicnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwKKwkJCSBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCk7CiAJfSBlbHNlIGlmIChweG1pdGZyYW1lLT5leHRfdGFnID09IDEpIHsKIAkJcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250Kys7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2RlYnVnXywgKCJydHdfZnJlZV94bWl0ZnJhbWUyM2EoKTpmcmVlX3hmcmFtZV9leHRfY250ID0lZFxuIiwgcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250KSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2RlYnVnXywKKwkJCSAicnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6ZnJlZV94ZnJhbWVfZXh0X2NudCA9JWRcbiIsCisJCQkgcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250KTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwpAQCAtMTU4NSw4ICsxNTg0LDcgQEAKIHsKIAlpZiAocnR3X3htaXQyM2FfY2xhc3NpZmllcihwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAoInJ0d194bWl0ZnJhbWVfZW5xdWV1ZTIzYTogZHJvcCB4bWl0IHBrdCBmb3IgIgotCQkJICAiY2xhc3NpZmllciBmYWlsXG4iKSk7CisJCQkgInJ0d194bWl0ZnJhbWVfZW5xdWV1ZTIzYTogZHJvcCB4bWl0IHBrdCBmb3IgY2xhc3NpZmllciBmYWlsXG4iKTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KIApAQCAtMTY3NSwyNiArMTY3MywzMCBAQAogCWNhc2UgMjoKIAkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LmJrX3E7CiAJCSooYWMpID0gMzsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICgicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IEJLXG4iKSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAorCQkJICJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogQktcbiIpOwogCQlicmVhazsKIAljYXNlIDQ6CiAJY2FzZSA1OgogCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYudmlfcTsKIAkJKihhYykgPSAxOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogVklcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCisJCQkgInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBWSVxuIik7CiAJCWJyZWFrOwogCWNhc2UgNjoKIAljYXNlIDc6CiAJCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi52b19xOwogCQkqKGFjKSA9IDA7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBWT1xuIikpOworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKKwkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IFZPXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAwOgogCWNhc2UgMzoKIAlkZWZhdWx0OgogCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmVfcTsKIAkJKihhYykgPSAyOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogQkVcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCisJCQkgInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBCRVxuIik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gcHR4c2VydnE7CkBAIC0xNzI1LDcgKzE3MjcsNyBAQAogCQlyZXMgPSBfRkFJTDsKIAkJREJHXzg3MjNBKCJydHdfeG1pdDIzYV9jbGFzc2lmaWVyOiBwc3RhID09IE5VTExcbiIpOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X3htaXQyM2FfY2xhc3NpZmllcjogcHN0YSA9PSBOVUxMXG4iKSk7CisJCQkgInJ0d194bWl0MjNhX2NsYXNzaWZpZXI6IHBzdGEgPT0gTlVMTFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAJaWYgKCEocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSkgewpAQCAtMTg3NiwxNCArMTg3OCwxNSBAQAogCiAJaWYgKHB4bWl0ZnJhbWUgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAoInJ0d194bWl0MjNhOiBubyBtb3JlIHB4bWl0ZnJhbWVcbiIpKTsKKwkJCSAicnR3X3htaXQyM2E6IG5vIG1vcmUgcHhtaXRmcmFtZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlyZXMgPSB1cGRhdGVfYXR0cmliKHBhZGFwdGVyLCBza2IsICZweG1pdGZyYW1lLT5hdHRyaWIpOwogCiAJaWYgKHJlcyA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywgKCJydHdfeG1pdDIzYTogdXBkYXRlIGF0dHJpYiBmYWlsXG4iKSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfeG1pdF9vc2RlcF9jXywgX2Rydl9lcnJfLAorCQkJICJydHdfeG1pdDIzYTogdXBkYXRlIGF0dHJpYiBmYWlsXG4iKTsKIAkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcHhtaXRmcmFtZSk7CiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxETU91dFNyYzg3MjNBX0NFLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxETU91dFNyYzg3MjNBX0NFLmMKaW5kZXggMTc5YTFiYS4uM2Y5ZWM5ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxETU91dFNyYzg3MjNBX0NFLmMKQEAgLTIzLDkgKzIzLDggQEAKICNkZWZpbmUJCURQS19ERUxUQV9NQVBQSU5HX05VTQkxMwogI2RlZmluZQkJaW5kZXhfbWFwcGluZ19IUF9OVU0JMTUKIC8qIDA5MTIxMiBjaGl5b2tvbGluICovCi1zdGF0aWMJdm9pZAotb2RtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcl85MkMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQorc3RhdGljIHZvaWQKK29kbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXJfOTJDKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKIHsKIAlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7CkBAIC0zNSw3ICszNCw2IEBACiAJczggT0ZETV9pbmRleFsyXSwgQ0NLX2luZGV4ID0gMCwgT0ZETV9pbmRleF9vbGRbMl0gPSB7MH07CiAJczggQ0NLX2luZGV4X29sZCA9IDA7CiAJaW50IGkgPSAwOwotCWJvb2wgaXMyVCA9IElTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCk7CiAJdTggT0ZETV9taW5faW5kZXggPSA2LCByZjsgLyogT0ZETSBCQiBTd2luZyBzaG91bGQgYmUgbGVzcyB0aGFuICszLjBkQiovCiAJdTggVGhlcm1hbFZhbHVlX0hQX2NvdW50ID0gMDsKIAl1MzIgVGhlcm1hbFZhbHVlX0hQID0gMDsKQEAgLTYwLDE1ICs1OCwxNSBAQAogCXJ0bDg3MjNhX3BoeV9hcF9jYWxpYnJhdGUoQWRhcHRlciwgKFRoZXJtYWxWYWx1ZSAtCiAJCQkJICBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSk7CiAKLQlpZiAoaXMyVCkKKwlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKIAkJcmYgPSAyOwogCWVsc2UKIAkJcmYgPSAxOwogCiAJaWYgKFRoZXJtYWxWYWx1ZSkgewogCQkvKiBRdWVyeSBPRkRNIHBhdGggQSBkZWZhdWx0IHNldHRpbmcJICovCi0JCWVsZV9EID0gUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKLQkJCQkgICAgICAgYk1hc2tEV29yZCkmYk1hc2tPRkRNX0Q7CisJCWVsZV9EID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlKSAmCisJCQliTWFza09GRE1fRDsKIAkJZm9yIChpID0gMDsgaSA8IE9GRE1fVEFCTEVfU0laRV85MkM7IGkrKykgewogCQkJLyogZmluZCB0aGUgaW5kZXggKi8KIAkJCWlmIChlbGVfRCA9PSAoT0ZETVN3aW5nVGFibGUyM0FbaV0mYk1hc2tPRkRNX0QpKSB7CkBAIC03OCw5ICs3NiwxMCBAQAogCQl9CiAKIAkJLyogUXVlcnkgT0ZETSBwYXRoIEIgZGVmYXVsdCBzZXR0aW5nICAqLwotCQlpZiAoaXMyVCkgewotCQkJZWxlX0QgPSBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLAotCQkJCQkgICAgICAgYk1hc2tEV29yZCkmYk1hc2tPRkRNX0Q7CisJCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKSB7CisJCQllbGVfRCA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwKKwkJCQkJCSByT0ZETTBfWEJUeElRSW1iYWxhbmNlKTsKKwkJCWVsZV9EICY9IGJNYXNrT0ZETV9EOwogCQkJZm9yIChpID0gMDsgaSA8IE9GRE1fVEFCTEVfU0laRV85MkM7IGkrKykgewkvKiBmaW5kIHRoZSBpbmRleCAgKi8KIAkJCQlpZiAoZWxlX0QgPT0gKE9GRE1Td2luZ1RhYmxlMjNBW2ldJmJNYXNrT0ZETV9EKSkgewogCQkJCQlPRkRNX2luZGV4X29sZFsxXSA9ICh1OClpOwpAQCAtOTAsOCArODksNyBAQAogCQl9CiAKIAkJLyogUXVlcnkgQ0NLIGRlZmF1bHQgc2V0dGluZyBGcm9tIDB4YTI0ICovCi0JCVRlbXBDQ2sgPSBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCByQ0NLMF9UeEZpbHRlcjIsCi0JCQkJCSBiTWFza0RXb3JkKSZiTWFza0NDSzsKKwkJVGVtcENDayA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckNDSzBfVHhGaWx0ZXIyKSAmIGJNYXNrQ0NLOwogCQlmb3IgKGkgPSAwIDsgaSA8IENDS19UQUJMRV9TSVpFIDsgaSsrKSB7CiAJCQlpZiAocGRtcHJpdi0+YkNDS2luQ0gxNCkgewogCQkJCWlmICghbWVtY21wKCZUZW1wQ0NrLApAQCAtMjI0LDEyICsyMjIsMTMgQEAKIAkJCX0KIAogCQkJaWYgKENDS19pbmRleCA+IChDQ0tfVEFCTEVfU0laRS0xKSkKLQkJCQlDQ0tfaW5kZXggPSAoQ0NLX1RBQkxFX1NJWkUtMSk7CisJCQkJQ0NLX2luZGV4ID0gQ0NLX1RBQkxFX1NJWkUtMTsKIAkJCWVsc2UgaWYgKENDS19pbmRleCA8IDApCiAJCQkJQ0NLX2luZGV4ID0gMDsKIAkJfQogCi0JCWlmIChwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sICYmIChkZWx0YSAhPSAwIHx8IGRlbHRhX0hQICE9IDApKSB7CisJCWlmIChwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sICYmCisJCSAgICAoZGVsdGEgIT0gMCB8fCBkZWx0YV9IUCAhPSAwKSkgewogCQkJLyogQWR1anN0IE9GRE0gQW50X0EgYWNjb3JkaW5nIHRvIElRSyByZXN1bHQgKi8KIAkJCWVsZV9EID0gKE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMF1dICYgMHhGRkMwMDAwMCk+PjIyOwogCQkJWCA9IHBkbXByaXYtPlJlZ0U5NDsKQEAgLTI0Nyw3ICsyNDYsOSBAQAogCiAJCQkJLyogd3JpdGUgbmV3IGVsZW1lbnRzIEEsIEMsIEQgdG8gcmVnQzgwIGFuZCByZWdDOTQsIGVsZW1lbnQgQiBpcyBhbHdheXMgMCAqLwogCQkJCXZhbHVlMzIgPSAoZWxlX0Q8PDIyKXwoKGVsZV9DJjB4M0YpPDwxNil8ZWxlX0E7Ci0JCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHZhbHVlMzIpOworCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCisJCQkJCQkgIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCisJCQkJCQkgIHZhbHVlMzIpOwogCiAJCQkJdmFsdWUzMiA9IChlbGVfQyYweDAwMDAwM0MwKT4+NjsKIAkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hDVHhBRkUsIGJNYXNrSDRCaXRzLCB2YWx1ZTMyKTsKQEAgLTI2MCw5ICsyNjEsOSBAQAogCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwKIAkJCQkJICAgICBCSVQoMjkpLCB2YWx1ZTMyKTsKIAkJCX0gZWxzZSB7Ci0JCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCSAgICAgYk1hc2tEV29yZCwKLQkJCQkJICAgICBPRkRNU3dpbmdUYWJsZTIzQVtPRkRNX2luZGV4WzBdXSk7CisJCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwKKwkJCQkJCSAgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCSAgT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9pbmRleFswXV0pOwogCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfWENUeEFGRSwKIAkJCQkJICAgICBiTWFza0g0Qml0cywgMHgwMCk7CiAJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLApAQCAtMjkwLDcgKzI5MSw3IEBACiAJCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyOSwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bN10pOwogCQkJfQogCi0JCQlpZiAoaXMyVCkgeworCQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKIAkJCQllbGVfRCA9IChPRkRNU3dpbmdUYWJsZTIzQVsodTgpT0ZETV9pbmRleFsxXV0gJiAweEZGQzAwMDAwKT4+MjI7CiAKIAkJCQkvKiBuZXcgZWxlbWVudCBBID0gZWxlbWVudCBEIHggWCAqLwpAQCAtMzA5LDcgKzMxMCw3IEBACiAKIAkJCQkJLyogd3JpdGUgbmV3IGVsZW1lbnRzIEEsIEMsIEQgdG8gcmVnQzg4IGFuZCByZWdDOUMsIGVsZW1lbnQgQiBpcyBhbHdheXMgMCAqLwogCQkJCQl2YWx1ZTMyID0gKGVsZV9EPDwyMil8KChlbGVfQyYweDNGKTw8MTYpIHwgZWxlX0E7Ci0JCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCB2YWx1ZTMyKTsKKwkJCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgdmFsdWUzMik7CiAKIAkJCQkJdmFsdWUzMiA9IChlbGVfQyYweDAwMDAwM0MwKT4+NjsKIAkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YRFR4QUZFLCBiTWFza0g0Qml0cywgdmFsdWUzMik7CkBAIC0zMjQsMTAgKzMyNSw5IEBACiAJCQkJCQkgICAgIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAogCQkJCQkJICAgICBCSVQoMjUpLCB2YWx1ZTMyKTsKIAkJCQl9IGVsc2UgewotCQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwKLQkJCQkJCSAgICAgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwKLQkJCQkJCSAgICAgYk1hc2tEV29yZCwKLQkJCQkJCSAgICAgT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9pbmRleFsxXV0pOworCQkJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLAorCQkJCQkJCSAgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkgIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMV1dKTsKIAkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsCiAJCQkJCQkgICAgIHJPRkRNMF9YRFR4QUZFLAogCQkJCQkJICAgICBiTWFza0g0Qml0cywgMHgwMCk7CkBAIC0zNjEsMTQgKzM2MSwxMCBAQAogCW9kbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXJfOTJDKEFkYXB0ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBvZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKK3ZvaWQgcnRsODcyM2Ffb2RtX2NoZWNrX3R4X3Bvd2VyX3RyYWNraW5nKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKIHsKIAlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IGRtX29kbV90ICpwb2RtcHJpdiA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQotCWlmICghKHBvZG1wcml2LT5TdXBwb3J0QWJpbGl0eSAmIE9ETV9SRl9UWF9QV1JfVFJBQ0spKQotCQlyZXR1cm47CiAKIAlpZiAoIXBkbXByaXYtPlRNX1RyaWdnZXIpIHsJCS8qIGF0IGxlYXN0IGRlbGF5IDEgc2VjICovCiAJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX1RfTUVURVIsIGJSRlJlZ09mZnNldE1hc2ssIDB4NjApOwpAQCAtMzgxLDExICszNzcsNiBAQAogCX0KIH0KIAotdm9pZCBydGw4NzIzYV9vZG1fY2hlY2tfdHhfcG93ZXJfdHJhY2tpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCW9kbV9DaGVja1RYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoQWRhcHRlcik7Ci19Ci0KIC8qCUlRSyAqLwogI2RlZmluZSBNQVhfVE9MRVJBTkNFCQk1CiAjZGVmaW5lIElRS19ERUxBWV9USU1FCQkxCS8qIG1zICovCkBAIC0zOTcsMzYgKzM4OCwzNyBAQAogCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwogCiAJLyogcGF0aC1BIElRSyBzZXR0aW5nICovCi0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByVHhfSVFLX1RvbmVfQSwgYk1hc2tEV29yZCwgMHgxMDAwOGMxZik7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByUnhfSVFLX1RvbmVfQSwgYk1hc2tEV29yZCwgMHgxMDAwOGMxZik7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByVHhfSVFLX1BJX0EsIGJNYXNrRFdvcmQsIDB4ODIxNDAxMDIpOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1RvbmVfQSwgMHgxMDAwOGMxZik7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9BLCAweDEwMDA4YzFmKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19QSV9BLCAweDgyMTQwMTAyKTsKIAotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgclJ4X0lRS19QSV9BLCBiTWFza0RXb3JkLCBjb25maWdQYXRoQiA/IDB4MjgxNjAyMDIgOgorCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByUnhfSVFLX1BJX0EsIGNvbmZpZ1BhdGhCID8gMHgyODE2MDIwMiA6CiAJCUlTXzgxeHhDX1ZFTkRPUl9VTUNfQl9DVVQocEhhbERhdGEtPlZlcnNpb25JRCk/MHgyODE2MDIwMjoweDI4MTYwNTAyKTsKIAogCS8qIHBhdGgtQiBJUUsgc2V0dGluZyAqLwogCWlmIChjb25maWdQYXRoQikgewotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9CLCBiTWFza0RXb3JkLCAweDEwMDA4YzIyKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByUnhfSVFLX1RvbmVfQiwgYk1hc2tEV29yZCwgMHgxMDAwOGMyMik7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgclR4X0lRS19QSV9CLCBiTWFza0RXb3JkLCAweDgyMTQwMTAyKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByUnhfSVFLX1BJX0IsIGJNYXNrRFdvcmQsIDB4MjgxNjAyMDIpOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19Ub25lX0IsIDB4MTAwMDhjMjIpOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19Ub25lX0IsIDB4MTAwMDhjMjIpOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19QSV9CLCAweDgyMTQwMTAyKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfUElfQiwgMHgyODE2MDIwMik7CiAJfQogCiAJLyogTE8gY2FsaWJyYXRpb24gc2V0dGluZyAqLwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgcklRS19BR0NfUnNwLCBiTWFza0RXb3JkLCAweDAwMTAyOGQxKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfUnNwLCAweDAwMTAyOGQxKTsKIAogCS8qIE9uZSBzaG90LCBwYXRoIEEgTE9LICYgSVFLICovCi0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIGJNYXNrRFdvcmQsIDB4ZjkwMDAwMDApOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgcklRS19BR0NfUHRzLCBiTWFza0RXb3JkLCAweGY4MDAwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfUHRzLCAweGY5MDAwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfUHRzLCAweGY4MDAwMDAwKTsKIAogCS8qICBkZWxheSB4IG1zICovCi0JdWRlbGF5KElRS19ERUxBWV9USU1FKjEwMDApOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oSVFLX0RFTEFZX1RJTUUqMTAwMCk7ICovCisJLyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbihJUUtfREVMQVlfVElNRSoxMDAwKTsgKi8KKwl1ZGVsYXkoSVFLX0RFTEFZX1RJTUUqMTAwMCk7CiAKIAkvKiAgQ2hlY2sgZmFpbGVkICovCi0JcmVnRUFDID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yLCBiTWFza0RXb3JkKTsKLQlyZWdFOTQgPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSwgYk1hc2tEV29yZCk7Ci0JcmVnRTlDID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSwgYk1hc2tEV29yZCk7Ci0JcmVnRUE0ID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0FfMiwgYk1hc2tEV29yZCk7CisJcmVnRUFDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpOworCXJlZ0U5NCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0EpOworCXJlZ0U5QyA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSk7CisJcmVnRUE0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQV8yKTsKIAogCWlmICghKHJlZ0VBQyAmIEJJVCgyOCkpICYmCiAJICAgICgoKHJlZ0U5NCAmIDB4MDNGRjAwMDApPj4xNikgIT0gMHgxNDIpICYmCkBAIC00MzUsNyArNDI3LDcgQEAKIAllbHNlCQkJLyogaWYgVHggbm90IE9LLCBpZ25vcmUgUnggKi8KIAkJcmV0dXJuIHJlc3VsdDsKIAotCWlmICghKHJlZ0VBQyAmIEJJVCgyNykpICYmCQkvKiBpZiBUeCBpcyBPSywgY2hlY2sgd2hldGhlciBSeCBpcyBPSyAqLworCWlmICghKHJlZ0VBQyAmIEJJVCgyNykpICYmIC8qIGlmIFR4IGlzIE9LLCBjaGVjayB3aGV0aGVyIFJ4IGlzIE9LICovCiAJICAgICgoKHJlZ0VBNCAmIDB4MDNGRjAwMDApPj4xNikgIT0gMHgxMzIpICYmCiAJICAgICgoKHJlZ0VBQyAmIDB4MDNGRjAwMDApPj4xNikgIT0gMHgzNikpCiAJCXJlc3VsdCB8PSAweDAyOwpAQCAtNDUwLDE4ICs0NDIsMTggQEAKIAl1OCByZXN1bHQgPSAweDAwOwogCiAJLyogT25lIHNob3QsIHBhdGggQiBMT0sgJiBJUUsgKi8KLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJJUUtfQUdDX0NvbnQsIGJNYXNrRFdvcmQsIDB4MDAwMDAwMDIpOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgcklRS19BR0NfQ29udCwgYk1hc2tEV29yZCwgMHgwMDAwMDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJJUUtfQUdDX0NvbnQsIDB4MDAwMDAwMDIpOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19Db250LCAweDAwMDAwMDAwKTsKIAogCS8qICBkZWxheSB4IG1zICovCiAJdWRlbGF5KElRS19ERUxBWV9USU1FKjEwMDApOwogCiAJLyogIENoZWNrIGZhaWxlZCAqLwotCXJlZ0VBQyA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMiwgYk1hc2tEV29yZCk7Ci0JcmVnRUI0ID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IsIGJNYXNrRFdvcmQpOwotCXJlZ0VCQyA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0IsIGJNYXNrRFdvcmQpOwotCXJlZ0VDNCA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByUnhfUG93ZXJfQmVmb3JlX0lRS19CXzIsIGJNYXNrRFdvcmQpOwotCXJlZ0VDQyA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0JfMiwgYk1hc2tEV29yZCk7CisJcmVnRUFDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpOworCXJlZ0VCNCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IpOworCXJlZ0VCQyA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQik7CisJcmVnRUM0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yKTsKKwlyZWdFQ0MgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0JfMik7CiAKIAlpZiAoIShyZWdFQUMgJiBCSVQoMzEpKSAmJgogCSAgICAoKChyZWdFQjQgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MTQyKSAmJgpAQCAtNDk0LDIyICs0ODYsMjcgQEAKIAlpZiAoZmluYWxfY2FuZGlkYXRlID09IDB4RkYpIHsKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoYklRS09LKSB7Ci0JCU9sZHZhbF8wID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkKSA+PiAyMikgJiAweDNGRjsKKwkJT2xkdmFsXzAgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlKTsKKwkJT2xkdmFsXzAgPSAoT2xkdmFsXzAgPj4gMjIpICYgMHgzRkY7CiAKIAkJWCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzBdOwogCQlpZiAoKFggJiAweDAwMDAwMjAwKSAhPSAwKQogCQkJWCA9IFggfCAweEZGRkZGQzAwOwogCQlUWDBfQSA9IChYICogT2xkdmFsXzApID4+IDg7CiAJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgMHgzRkYsIFRYMF9BKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDMxKSwgKChYICogT2xkdmFsXzA+PjcpICYgMHgxKSk7CisJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgzMSksCisJCQkgICAgICgoWCAqIE9sZHZhbF8wPj43KSAmIDB4MSkpOwogCiAJCVkgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVsxXTsKIAkJaWYgKChZICYgMHgwMDAwMDIwMCkgIT0gMCkKIAkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKIAkJVFgwX0MgPSAoWSAqIE9sZHZhbF8wKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQ1R4QUZFLCAweEYwMDAwMDAwLCAoKFRYMF9DJjB4M0MwKT4+NikpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIDB4MDAzRjAwMDAsIChUWDBfQyYweDNGKSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyOSksICgoWSAqIE9sZHZhbF8wPj43KSAmIDB4MSkpOworCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQ1R4QUZFLCAweEYwMDAwMDAwLAorCQkJICAgICAoKFRYMF9DJjB4M0MwKT4+NikpOworCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIDB4MDAzRjAwMDAsCisJCQkgICAgIChUWDBfQyYweDNGKSk7CisJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyOSksCisJCQkgICAgICgoWSAqIE9sZHZhbF8wPj43KSAmIDB4MSkpOwogCiAJCWlmIChiVHhPbmx5KSB7CiAJCQlEQkdfODcyM0EoIl9QSFlfUGF0aEFGaWxsSVFLTWF0cml4IG9ubHkgVHggT0tcbiIpOwpAQCAtNTM3LDIyICs1MzQsMjcgQEAKIAlpZiAoZmluYWxfY2FuZGlkYXRlID09IDB4RkYpIHsKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoYklRS09LKSB7Ci0JCU9sZHZhbF8xID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkKSA+PiAyMikgJiAweDNGRjsKKwkJT2xkdmFsXzEgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlKTsKKwkJT2xkdmFsXzEgPSAoT2xkdmFsXzEgPj4gMjIpICYgMHgzRkY7CiAKIAkJWCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzRdOwogCQlpZiAoKFggJiAweDAwMDAwMjAwKSAhPSAwKQogCQkJWCA9IFggfCAweEZGRkZGQzAwOwogCQlUWDFfQSA9IChYICogT2xkdmFsXzEpID4+IDg7CiAJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgMHgzRkYsIFRYMV9BKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI3KSwgKChYICogT2xkdmFsXzE+PjcpICYgMHgxKSk7CisJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyNyksCisJCQkgICAgICgoWCAqIE9sZHZhbF8xID4+IDcpICYgMHgxKSk7CiAKIAkJWSA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzVdOwogCQlpZiAoKFkgJiAweDAwMDAwMjAwKSAhPSAwKQogCQkJWSA9IFkgfCAweEZGRkZGQzAwOwogCQlUWDFfQyA9IChZICogT2xkdmFsXzEpID4+IDg7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hEVHhBRkUsIDB4RjAwMDAwMDAsICgoVFgxX0MmMHgzQzApPj42KSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgMHgwMDNGMDAwMCwgKFRYMV9DJjB4M0YpKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI1KSwgKChZICogT2xkdmFsXzE+PjcpICYgMHgxKSk7CisJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hEVHhBRkUsIDB4RjAwMDAwMDAsCisJCQkgICAgICgoVFgxX0MgJiAweDNDMCkgPj4gNikpOworCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIDB4MDAzRjAwMDAsCisJCQkgICAgIChUWDFfQyAmIDB4M0YpKTsKKwkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI1KSwKKwkJCSAgICAgKChZICogT2xkdmFsXzEgPj4gNykgJiAweDEpKTsKIAogCQlpZiAoYlR4T25seSkKIAkJCXJldHVybjsKQEAgLTU3MywxMSArNTc1LDEyIEBACiAJdTMyIGk7CiAKIAlmb3IgKGkgPSAwIDsgaSA8IFJlZ2lzdGVyTnVtIDsgaSsrKSB7Ci0JCUFEREFCYWNrdXBbaV0gPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgQUREQVJlZ1tpXSwgYk1hc2tEV29yZCk7CisJCUFEREFCYWNrdXBbaV0gPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCBBRERBUmVnW2ldKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9QSFlfU2F2ZU1BQ1JlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgKk1BQ1JlZywgdTMyICpNQUNCYWNrdXApCitzdGF0aWMgdm9pZCBfUEhZX1NhdmVNQUNSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpNQUNSZWcsCisJCQkJICB1MzIgKk1BQ0JhY2t1cCkKIHsKIAl1MzIgaTsKIApAQCAtNTg3LDE2ICs1OTAsMTkgQEAKIAlNQUNCYWNrdXBbaV0gPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCBNQUNSZWdbaV0pOwogfQogCi1zdGF0aWMgdm9pZCBfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpBRERBUmVnLCB1MzIgKkFEREFCYWNrdXAsIHUzMiBSZWdpZXN0ZXJOdW0pCitzdGF0aWMgdm9pZCBfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwKKwkJCQkgICAgIHUzMiAqQUREQVJlZywgdTMyICpBRERBQmFja3VwLAorCQkJCSAgICAgdTMyIFJlZ2llc3Rlck51bSkKIHsKIAl1MzIgaTsKIAogCWZvciAoaSA9IDAgOyBpIDwgUmVnaWVzdGVyTnVtIDsgaSsrKSB7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgQUREQVJlZ1tpXSwgYk1hc2tEV29yZCwgQUREQUJhY2t1cFtpXSk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBBRERBUmVnW2ldLCBBRERBQmFja3VwW2ldKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9QSFlfUmVsb2FkTUFDUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKK3N0YXRpYyB2b2lkIF9QSFlfUmVsb2FkTUFDUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCisJCQkJICAgIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKIHsKIAl1MzIgaTsKIApAQCAtNjA2LDcgKzYxMiw4IEBACiAJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgTUFDQmFja3VwW2ldKTsKIH0KIAotc3RhdGljIHZvaWQgX1BIWV9QYXRoQUREQU9uKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiAqQUREQVJlZywgYm9vbCBpc1BhdGhBT24sIGJvb2wgaXMyVCkKK3N0YXRpYyB2b2lkIF9QSFlfUGF0aEFEREFPbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgKkFEREFSZWcsCisJCQkgICAgYm9vbCBpc1BhdGhBT24sIGJvb2wgaXMyVCkKIHsKIAl1MzIgcGF0aE9uOwogCXUzMiBpOwpAQCAtNjE0LDE2ICs2MjEsMTcgQEAKIAlwYXRoT24gPSBpc1BhdGhBT24gPyAweDA0ZGIyNWE0IDogMHgwYjFiMjVhNDsKIAlpZiAoIWlzMlQpIHsKIAkJcGF0aE9uID0gMHgwYmRiMjVhMDsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCBBRERBUmVnWzBdLCBiTWFza0RXb3JkLCAweDBiMWIyNWEwKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbMF0sIDB4MGIxYjI1YTApOwogCX0gZWxzZSB7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgQUREQVJlZ1swXSwgYk1hc2tEV29yZCwgcGF0aE9uKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbMF0sIHBhdGhPbik7CiAJfQogCiAJZm9yIChpID0gMSA7IGkgPCBJUUtfQUREQV9SRUdfTlVNIDsgaSsrKQotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIEFEREFSZWdbaV0sIGJNYXNrRFdvcmQsIHBhdGhPbik7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBBRERBUmVnW2ldLCBwYXRoT24pOwogfQogCi1zdGF0aWMgdm9pZCBfUEhZX01BQ1NldHRpbmdDYWxpYnJhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgKk1BQ1JlZywgdTMyICpNQUNCYWNrdXApCitzdGF0aWMgdm9pZCBfUEhZX01BQ1NldHRpbmdDYWxpYnJhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLAorCQkJCSAgICAgICB1MzIgKk1BQ1JlZywgdTMyICpNQUNCYWNrdXApCiB7CiAJdTMyIGkgPSAwOwogCkBAIC02MzgsOSArNjQ2LDkgQEAKIAogc3RhdGljIHZvaWQgX1BIWV9QYXRoQVN0YW5kQnkoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcikKIHsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9JUUssIGJNYXNrRFdvcmQsIDB4MCk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCAweDg0MCwgYk1hc2tEV29yZCwgMHgwMDAxMDAwMCk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfSVFLLCBiTWFza0RXb3JkLCAweDgwODAwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX0lRSywgMHgwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgMHg4NDAsIDB4MDAwMTAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByRlBHQTBfSVFLLCAweDgwODAwMDAwKTsKIH0KIAogc3RhdGljIHZvaWQgX1BIWV9QSU1vZGVTd2l0Y2goc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgYm9vbCBQSU1vZGUpCkBAIC02NDgsOCArNjU2LDggQEAKIAl1MzIgbW9kZTsKIAogCW1vZGUgPSBQSU1vZGUgPyAweDAxMDAwMTAwIDogMHgwMTAwMDAwMDsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIDB4ODIwLCBiTWFza0RXb3JkLCBtb2RlKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIDB4ODI4LCBiTWFza0RXb3JkLCBtb2RlKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgMHg4MjAsIG1vZGUpOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCAweDgyOCwgbW9kZSk7CiB9CiAKIC8qCkBAIC02NjAsOSArNjY4LDkgQEAKIAl1MzIgaSwgaiwgZGlmZiwgU2ltdWxhcml0eUJpdE1hcCwgYm91bmQgPSAwOwogCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwogCXU4IGZpbmFsX2NhbmRpZGF0ZVsyXSA9IHsweEZGLCAweEZGfTsJLyogZm9yIHBhdGggQSBhbmQgcGF0aCBCICovCi0JYm9vbCBiUmVzdWx0ID0gdHJ1ZSwgaXMyVCA9IElTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCk7CisJYm9vbCBiUmVzdWx0ID0gdHJ1ZTsKIAotCWlmIChpczJUKQorCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQogCQlib3VuZCA9IDg7CiAJZWxzZQogCQlib3VuZCA9IDQ7CkBAIC02OTksNyArNzA3LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJCXJlc3VsdFszXVtpXSA9IHJlc3VsdFtjMV1baV07CiAJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKCEoU2ltdWxhcml0eUJpdE1hcCAmIDB4RjApICYmIGlzMlQpIHsKKwl9IGVsc2UgaWYgKCEoU2ltdWxhcml0eUJpdE1hcCAmIDB4RjApICYmIHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKIAkJLyogcGF0aCBCIE9LICovCiAJCWZvciAoaSA9IDQ7IGkgPCA4OyBpKyspCiAJCQlyZXN1bHRbM11baV0gPSByZXN1bHRbYzFdW2ldOwpAQCAtNzQ2LDcgKzc1NCw3IEBACiAJdTMyIGJidmFsdWU7CiAKIAlpZiAodCA9PSAwKSB7Ci0JCWJidmFsdWUgPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgckZQR0EwX1JGTU9ELCBiTWFza0RXb3JkKTsKKwkJYmJ2YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCk7CiAKIAkJLyogIFNhdmUgQUREQSBwYXJhbWV0ZXJzLCB0dXJuIFBhdGggQSBBRERBIG9uICovCiAJCV9QSFlfU2F2ZUFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIEFEREFfUkVHLCBwZG1wcml2LT5BRERBX2JhY2t1cCwgSVFLX0FEREFfUkVHX05VTSk7CkBAIC03NjYsNDggKzc3NCw1MCBAQAogCX0KIAogCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1JGTU9ELCBCSVQoMjQpLCAweDAwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCBiTWFza0RXb3JkLCAweDAzYTA1NjAwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9UUk11eFBhciwgYk1hc2tEV29yZCwgMHgwMDA4MDBlNCk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1csIGJNYXNrRFdvcmQsIDB4MjIyMDQwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwgMHgwM2EwNTYwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJPRkRNMF9UUk11eFBhciwgMHgwMDA4MDBlNCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgMHgyMjIwNDAwMCk7CiAJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1csIEJJVCgxMCksIDB4MDEpOwogCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXLCBCSVQoMjYpLCAweDAxKTsKIAlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBCSVQoMTApLCAweDAwKTsKIAlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQl9SRkludGVyZmFjZU9FLCBCSVQoMTApLCAweDAwKTsKIAogCWlmIChpczJUKSB7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIsIGJNYXNrRFdvcmQsIDB4MDAwMTAwMDApOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyLCBiTWFza0RXb3JkLCAweDAwMDEwMDAwKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsCisJCQkJICByRlBHQTBfWEFfTFNTSVBhcmFtZXRlciwgMHgwMDAxMDAwMCk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAorCQkJCSAgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMTAwMDApOwogCX0KIAogCS8qIE1BQyBzZXR0aW5ncyAqLwogCV9QSFlfTUFDU2V0dGluZ0NhbGlicmF0aW9uKHBBZGFwdGVyLCBJUUtfTUFDX1JFRywgcGRtcHJpdi0+SVFLX01BQ19iYWNrdXApOwogCiAJLyogUGFnZSBCIGluaXQgKi8KLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJDb25maWdfQW50QSwgYk1hc2tEV29yZCwgMHgwMDA4MDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJDb25maWdfQW50QSwgMHgwMDA4MDAwMCk7CiAKIAlpZiAoaXMyVCkKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByQ29uZmlnX0FudEIsIGJNYXNrRFdvcmQsIDB4MDAwODAwMDApOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckNvbmZpZ19BbnRCLCAweDAwMDgwMDAwKTsKIAogCS8qICBJUSBjYWxpYnJhdGlvbiBzZXR0aW5nICovCi0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfSVFLLCBiTWFza0RXb3JkLCAweDgwODAwMDAwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJUeF9JUUssIGJNYXNrRFdvcmQsIDB4MDEwMDdjMDApOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgclJ4X0lRSywgYk1hc2tEV29yZCwgMHgwMTAwNDgwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLLCAweDAxMDA3YzAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRSywgMHgwMTAwNDgwMCk7CiAKIAlmb3IgKGkgPSAwIDsgaSA8IHJldHJ5Q291bnQgOyBpKyspIHsKIAkJUGF0aEFPSyA9IF9QSFlfUGF0aEFfSVFLKHBBZGFwdGVyLCBpczJUKTsKIAkJaWYgKFBhdGhBT0sgPT0gMHgwMykgewogCQkJCURCR184NzIzQSgiUGF0aCBBIElRSyBTdWNjZXNzISFcbiIpOwotCQkJCXJlc3VsdFt0XVswXSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSwgYk1hc2tEV29yZCkmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzFdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0EsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCXJlc3VsdFt0XVsyXSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQV8yLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bM10gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bMF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSkmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzFdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSkmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzJdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0FfMikmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzNdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yKSYweDNGRjAwMDApPj4xNjsKIAkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGkgPT0gKHJldHJ5Q291bnQtMSkgJiYgUGF0aEFPSyA9PSAweDAxKSB7CiAJCQkvKiBUeCBJUUsgT0sgKi8KIAkJCURCR184NzIzQSgiUGF0aCBBIElRSyBPbmx5ICBUeCBTdWNjZXNzISFcbiIpOwogCi0JCQlyZXN1bHRbdF1bMF0gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0EsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OwotCQkJcmVzdWx0W3RdWzFdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0EsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OworCQkJcmVzdWx0W3RdWzBdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0EpJjB4M0ZGMDAwMCk+PjE2OworCQkJcmVzdWx0W3RdWzFdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSkmMHgzRkYwMDAwKT4+MTY7CiAJCX0KIAl9CiAKQEAgLTgyNSwxNiArODM1LDE2IEBACiAJCQlQYXRoQk9LID0gX1BIWV9QYXRoQl9JUUsocEFkYXB0ZXIpOwogCQkJaWYgKFBhdGhCT0sgPT0gMHgwMykgewogCQkJCURCR184NzIzQSgiUGF0aCBCIElRSyBTdWNjZXNzISFcbiIpOwotCQkJCXJlc3VsdFt0XVs0XSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQiwgYk1hc2tEV29yZCkmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzVdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0IsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCXJlc3VsdFt0XVs2XSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bN10gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQl8yLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bNF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQikmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzVdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQikmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzZdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0JfMikmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzddID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQl8yKSYweDNGRjAwMDApPj4xNjsKIAkJCQlicmVhazsKIAkJCX0gZWxzZSBpZiAoaSA9PSAocmV0cnlDb3VudCAtIDEpICYmIFBhdGhCT0sgPT0gMHgwMSkgewogCQkJCS8qIFR4IElRSyBPSyAqLwogCQkJCURCR184NzIzQSgiUGF0aCBCIE9ubHkgVHggSVFLIFN1Y2Nlc3MhIVxuIik7Ci0JCQkJcmVzdWx0W3RdWzRdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19CLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bNV0gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQiwgYk1hc2tEV29yZCkmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzRdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IpJjB4M0ZGMDAwMCk+PjE2OworCQkJCXJlc3VsdFt0XVs1XSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0IpJjB4M0ZGMDAwMCk+PjE2OwogCQkJfQogCQl9CiAKQEAgLTg0NCw3ICs4NTQsNyBAQAogCX0KIAogCS8qIEJhY2sgdG8gQkIgbW9kZSwgbG9hZCBvcmlnaW5hbCB2YWx1ZSAqLwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX0lRSywgYk1hc2tEV29yZCwgMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDApOwogCiAJaWYgKHQgIT0gMCkgewogCQlpZiAoIXBkbXByaXYtPmJSZlBpRW5hYmxlKSB7CkBAIC04NjIsMTQgKzg3MiwxNiBAQAogCQlfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19CQl9SRUdfOTJDLCBwZG1wcml2LT5JUUtfQkJfYmFja3VwLCBJUUtfQkJfUkVHX05VTSk7CiAKIAkJLyogIFJlc3RvcmUgUlggaW5pdGlhbCBnYWluICovCi0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIsIGJNYXNrRFdvcmQsIDB4MDAwMzJlZDMpOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwKKwkJCQkgIHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyLCAweDAwMDMyZWQzKTsKIAkJaWYgKGlzMlQpIHsKLQkJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIGJNYXNrRFdvcmQsIDB4MDAwMzJlZDMpOworCQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsCisJCQkJCSAgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMzJlZDMpOwogCQl9CiAKIAkJLyogbG9hZCAweGUzMCBJUUMgZGVmYXVsdCB2YWx1ZSAqLwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCBiTWFza0RXb3JkLCAweDAxMDA4YzAwKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByUnhfSVFLX1RvbmVfQSwgYk1hc2tEV29yZCwgMHgwMTAwOGMwMCk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1RvbmVfQSwgMHgwMTAwOGMwMCk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByUnhfSVFLX1RvbmVfQSwgMHgwMTAwOGMwMCk7CiAKIAl9CiB9CkBAIC05ODAsMTIgKzk5MiwxMCBAQAogCWlzMTNzaW11bGFyID0gZmFsc2U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCWlmIChJU185MkNfU0VSSUFMKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7Ci0JCQkgX1BIWV9JUUNhbGlicmF0ZShwQWRhcHRlciwgcmVzdWx0LCBpLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCS8qICBGb3IgODhDIDFUMVIgKi8KKwkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCisJCQlfUEhZX0lRQ2FsaWJyYXRlKHBBZGFwdGVyLCByZXN1bHQsIGksIHRydWUpOworCQllbHNlIC8qICBGb3IgODhDIDFUMVIgKi8KIAkJCV9QSFlfSVFDYWxpYnJhdGUocEFkYXB0ZXIsIHJlc3VsdCwgaSwgZmFsc2UpOwotCQl9CiAKIAkJaWYgKGkgPT0gMSkgewogCQkJaXMxMnNpbXVsYXIgPSBfUEhZX1NpbXVsYXJpdHlDb21wYXJlKHBBZGFwdGVyLCByZXN1bHQsIDAsIDEpOwpAQCAtMTA1Myw5ICsxMDYzLDEwIEBACiAJaWYgKChSZWdFOTQgIT0gMCkvKiYmKFJlZ0VBNCAhPSAwKSovKQogCQlfUEhZX1BhdGhBRmlsbElRS01hdHJpeChwQWRhcHRlciwgYlBhdGhBT0ssIHJlc3VsdCwgZmluYWxfY2FuZGlkYXRlLCAoUmVnRUE0ID09IDApKTsKIAotCWlmIChJU185MkNfU0VSSUFMKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7CisJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKIAkJaWYgKChSZWdFQjQgIT0gMCkvKiYmKFJlZ0VDNCAhPSAwKSovKQotCQlfUEhZX1BhdGhCRmlsbElRS01hdHJpeChwQWRhcHRlciwgYlBhdGhCT0ssIHJlc3VsdCwgZmluYWxfY2FuZGlkYXRlLCAoUmVnRUM0ID09IDApKTsKKwkJCV9QSFlfUGF0aEJGaWxsSVFLTWF0cml4KHBBZGFwdGVyLCBiUGF0aEJPSywgcmVzdWx0LAorCQkJCQkJZmluYWxfY2FuZGlkYXRlLCAoUmVnRUM0ID09IDApKTsKIAl9CiAKIAlfUEhZX1NhdmVBRERBUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfQkJfUkVHXzkyQywgcGRtcHJpdi0+SVFLX0JCX2JhY2t1cF9yZWNvdmVyLCA5KTsKQEAgLTEwNzQsMTIgKzEwODUsMTAgQEAKIAlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fUFJPQ0VTUykKIAkJcmV0dXJuOwogCi0JaWYgKElTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKKwlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKIAkJX1BIWV9MQ0NhbGlicmF0ZShwQWRhcHRlciwgdHJ1ZSk7Ci0JfSBlbHNlIHsKLQkJLyogIEZvciA4OEMgMVQxUiAqLworCWVsc2UJLyogIEZvciA4OEMgMVQxUiAqLwogCQlfUEhZX0xDQ2FsaWJyYXRlKHBBZGFwdGVyLCBmYWxzZSk7Ci0JfQogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX0JCLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX0JCLmMKaW5kZXggOWQ0ZjZiZS4uZThjYWI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9CQi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfQkIuYwpAQCAtMzAsMTIgKzMwLDEyIEBACiAJCXJldHVybiBmYWxzZTsKIAogCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDBGRjAwOwotCWNvbmQgPSBjb25kID4+IDg7CisJY29uZCA+Pj0gODsKIAlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKIAkJcmV0dXJuIGZhbHNlOwogCiAJY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA9IGNvbmQgPj4gMTY7CisJY29uZCA+Pj0gMTY7CiAJaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwpAQCAtMjE1LDE3ICsyMTUsMTUgQEAKIAogdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19BR0NfVEFCXzFUXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKIHsKLQogCXUzMiBoZXg7CiAJdTMyIGk7CiAJdTggcGxhdGZvcm0gPSAweDA0OwotCXU4IGludGVyZmFjZVZhbHVlICAgPSBwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlOwogCXU4IGJvYXJkID0gcERNX09kbS0+Qm9hcmRUeXBlOwogCXUzMiBBcnJheUxlbiA9IHNpemVvZihBcnJheV9BR0NfVEFCXzFUXzg3MjNBKS9zaXplb2YodTMyKTsKIAl1MzIgKkFycmF5ID0gQXJyYXlfQUdDX1RBQl8xVF84NzIzQTsKIAogCWhleCA9IGJvYXJkOwotCWhleCArPSBpbnRlcmZhY2VWYWx1ZSA8PCA4OworCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKIAloZXggKz0gcGxhdGZvcm0gPDwgMTY7CiAJaGV4ICs9IDB4RkYwMDAwMDA7CiAJZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKQEAgLTIzNCwxMSArMjMyLDExIEBACiAKIAkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwogCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHBETV9PZG0sIHYxLCBiTWFza0RXb3JkLCB2Mik7CisJCQlvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7CiAJCQljb250aW51ZTsKIAkJfSBlbHNlIHsKIAkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiAgRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzLiAqLworCQkJCS8qIERpc2NhcmQgdGhlIGZvbGxvd2luZyAob2Zmc2V0LCBkYXRhKSBwYWlycyAqLwogCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgogCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKQEAgLTI0NiwxMiArMjQ0LDEzIEBACiAJCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJaSAtPSAyOyAvKiAgcHJldmVudCBmcm9tIGZvci1sb29wICs9IDIgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJLyogIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvIGVuZCBvZiBpZi1lbHNlLiAqLworCQkJCS8qICBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bworCQkJCSAgICBlbmQgb2YgaWYtZWxzZS4gKi8KIAkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKIAkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCiAJCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKSB7Ci0JCQkJCW9kbV9Db25maWdCQl9BR0NfODcyM0EocERNX09kbSwgdjEsIGJNYXNrRFdvcmQsIHYyKTsKKwkJCQkJb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShwRE1fT2RtLCB2MSwgdjIpOwogCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCX0KIAkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCBBcnJheUxlbiAtIDIpCkBAIC00NjcsMTMgKzQ2NiwxMiBAQAogCXUzMiBoZXggPSAwOwogCXUzMiBpID0gMDsKIAl1OCAgcGxhdGZvcm0gPSAweDA0OwotCXU4ICBpbnRlcmZhY2VWYWx1ZSA9IHBETV9PZG0tPlN1cHBvcnRJbnRlcmZhY2U7CiAJdTggIGJvYXJkID0gcERNX09kbS0+Qm9hcmRUeXBlOwogCXUzMiBBcnJheUxlbiA9IHNpemVvZihBcnJheV9QSFlfUkVHXzFUXzg3MjNBKS9zaXplb2YodTMyKTsKIAl1MzIgKkFycmF5ID0gQXJyYXlfUEhZX1JFR18xVF84NzIzQTsKIAogCWhleCArPSBib2FyZDsKLQloZXggKz0gaW50ZXJmYWNlVmFsdWUgPDwgODsKKwloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7CiAJaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwogCWhleCArPSAweEZGMDAwMDAwOwogCWZvciAoaSA9IDA7IGkgPCBBcnJheUxlbjsgaSArPSAyKSB7CkBAIC00ODIsMTEgKzQ4MCwxMSBAQAogCiAJCS8qICBUaGlzIChvZmZzZXQsIGRhdGEpIHBhaXIgbWVldHMgdGhlIGNvbmRpdGlvbi4gKi8KIAkJaWYgKHYxIDwgMHhDRENEQ0RDRCkgewotCQkJb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShwRE1fT2RtLCB2MSwgYk1hc2tEV29yZCwgdjIpOworCQkJb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShwRE1fT2RtLCB2MSwgdjIpOwogCQkJY29udGludWU7CiAJCX0gZWxzZSB7CiAJCQlpZiAoIUNoZWNrQ29uZGl0aW9uKEFycmF5W2ldLCBoZXgpKSB7Ci0JCQkJLyogIERpc2NhcmQgdGhlIGZvbGxvd2luZyAob2Zmc2V0LCBkYXRhKSBwYWlycy4gKi8KKwkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KIAkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKIAkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCkBAIC00OTQsMTIgKzQ5MiwxMyBAQAogCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCiAJCQl9IGVsc2UgewotCQkJCS8qICBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0byBlbmQgb2YgaWYtZWxzZS4gKi8KKwkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8KKwkJCQkgICAgZW5kIG9mIGlmLWVsc2UuICovCiAJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCiAJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgogCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCBiTWFza0RXb3JkLCB2Mik7CisJCQkJCW9kbV9Db25maWdCQl9QSFlfODcyM0EocERNX09kbSwgdjEsIHYyKTsKIAkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQl9CiAJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQpAQCAtNTIwLDE2ICs1MTksMTUgQEAKIAogdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19QSFlfUkVHX01QXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKIHsKLQl1MzIgICAgIGhleCAgICAgICAgID0gMDsKLQl1MzIgICAgIGkgICAgICAgICAgID0gMDsKLQl1OCAgICAgcGxhdGZvcm0gICAgPSAweDA0OwotCXU4ICAgICBpbnRlcmZhY2VWYWx1ZSAgID0gcERNX09kbS0+U3VwcG9ydEludGVyZmFjZTsKLQl1OCAgICAgYm9hcmQgICAgICAgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7Ci0JdTMyICAgICBBcnJheUxlbiAgICA9IHNpemVvZihBcnJheV9QSFlfUkVHX01QXzg3MjNBKS9zaXplb2YodTMyKTsKLQl1MzIgKkFycmF5ICAgICAgID0gQXJyYXlfUEhZX1JFR19NUF84NzIzQTsKKwl1MzIgaGV4ID0gMDsKKwl1MzIgaTsKKwl1OCBwbGF0Zm9ybSA9IDB4MDQ7CisJdTggYm9hcmQgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7CisJdTMyIEFycmF5TGVuID0gc2l6ZW9mKEFycmF5X1BIWV9SRUdfTVBfODcyM0EpL3NpemVvZih1MzIpOworCXUzMiAqQXJyYXkgPSBBcnJheV9QSFlfUkVHX01QXzg3MjNBOwogCiAJaGV4ICs9IGJvYXJkOwotCWhleCArPSBpbnRlcmZhY2VWYWx1ZSA8PCA4OworCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKIAloZXggKz0gcGxhdGZvcm0gPDwgMTY7CiAJaGV4ICs9IDB4RkYwMDAwMDA7CiAJZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKQEAgLTUzOCwxMSArNTM2LDExIEBACiAKIAkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwogCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCBiTWFza0RXb3JkLCB2Mik7CisJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7CiAJCQljb250aW51ZTsKIAkJfSBlbHNlIHsKIAkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMuICovCisJCQkJLyogRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzICovCiAJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCiAJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgpAQCAtNTUwLDEyICs1NDgsMTMgQEAKIAkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwogCQkJfSBlbHNlIHsKLQkJCQkvKiBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0byBlbmQgb2YgaWYtZWxzZS4gKi8KKwkJCQkvKiBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bworCQkJCSAgIGVuZCBvZiBpZi1lbHNlLiAqLwogCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgogCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKIAkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBBcnJheUxlbiAtIDIpIHsKLQkJCQkJb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShwRE1fT2RtLCB2MSwgYk1hc2tEV29yZCwgdjIpOworCQkJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7CiAJCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJfQogCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfTUFDLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX01BQy5jCmluZGV4IDEyMDcxNDUuLjkzYjJkMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfTUFDLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9NQUMuYwpAQCAtMzAsMTIgKzMwLDEyIEBACiAJCXJldHVybiBmYWxzZTsKIAogCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDBGRjAwOwotCWNvbmQgPSBjb25kID4+IDg7CisJY29uZCA+Pj0gODsKIAlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKIAkJcmV0dXJuIGZhbHNlOwogCiAJY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA9IGNvbmQgPj4gMTY7CisJY29uZCA+Pj0gMTY7CiAJaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwpAQCAtMTQ0LDEzICsxNDQsMTIgQEAKIAl1MzIgICAgIGhleCAgICAgICAgID0gMDsKIAl1MzIgICAgIGkgICAgICAgICAgID0gMDsKIAl1OCAgICAgcGxhdGZvcm0gICAgPSAweDA0OwotCXU4ICAgICBpbnRlcmZhY2VWYWx1ZSAgID0gcERNX09kbS0+U3VwcG9ydEludGVyZmFjZTsKIAl1OCAgICAgYm9hcmQgICAgICAgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7CiAJdTMyICAgICBBcnJheUxlbiAgICA9IHNpemVvZihBcnJheV9NQUNfUkVHXzg3MjNBKS9zaXplb2YodTMyKTsKIAl1MzIgKkFycmF5ICAgICAgID0gQXJyYXlfTUFDX1JFR184NzIzQTsKIAogCWhleCArPSBib2FyZDsKLQloZXggKz0gaW50ZXJmYWNlVmFsdWUgPDwgODsKKwloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7CiAJaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwogCWhleCArPSAweEZGMDAwMDAwOwogCWZvciAoaSA9IDA7IGkgPCBBcnJheUxlbjsgaSArPSAyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX1JGLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX1JGLmMKaW5kZXggMDA0ODBmNS4uZGJmNTcxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9SRi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfUkYuYwpAQCAtMzAsMTIgKzMwLDEyIEBACiAJCXJldHVybiBmYWxzZTsKIAogCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDBGRjAwOwotCWNvbmQgPSBjb25kID4+IDg7CisJY29uZCA+Pj0gODsKIAlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKIAkJcmV0dXJuIGZhbHNlOwogCiAJY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA9IGNvbmQgPj4gMTY7CisJY29uZCA+Pj0gMTY7CiAJaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwpAQCAtMjE0LDEzICsyMTQsMTIgQEAKIAl1MzIgICAgIGhleCAgICAgICAgID0gMDsKIAl1MzIgICAgIGkgICAgICAgICAgID0gMDsKIAl1OCAgICAgcGxhdGZvcm0gICAgPSAweDA0OwotCXU4ICAgICBpbnRlcmZhY2VWYWx1ZSAgID0gcERNX09kbS0+U3VwcG9ydEludGVyZmFjZTsKIAl1OCAgICAgYm9hcmQgICAgICAgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7CiAJdTMyICAgICBBcnJheUxlbiAgICA9IHNpemVvZihBcnJheV9SYWRpb0FfMVRfODcyM0EpL3NpemVvZih1MzIpOwogCXUzMiAqQXJyYXkgPSBBcnJheV9SYWRpb0FfMVRfODcyM0E7CiAKIAloZXggKz0gYm9hcmQ7Ci0JaGV4ICs9IGludGVyZmFjZVZhbHVlIDw8IDg7CisJaGV4ICs9IE9ETV9JVFJGX1VTQiA8PCA4OwogCWhleCArPSBwbGF0Zm9ybSA8PCAxNjsKIAloZXggKz0gMHhGRjAwMDAwMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsUHdyU2VxQ21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxQd3JTZXFDbWQuYwppbmRleCAzMzc3N2QyLi5hZTA5MGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxQd3JTZXFDbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxQd3JTZXFDbWQuYwpAQCAtNTksMTcgKzU5LDE1IEBACiAJCVB3ckNmZ0NtZCA9IFB3clNlcUNtZFtBcnlJZHhdOwogCiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBvZmZzZXQoJSN4KSBjdXRfbXNrKCUjeCkgIgotCQkJICAiZmFiX21zayglI3gpIGludGVyZmFjZV9tc2soJSN4KSBiYXNlKCUjeCkgY21kKCUjeCkgIgotCQkJICAibXNrKCUjeCkgdmFsdWUoJSN4KVxuIiwKLQkJCSAgR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCksCi0JCQkgIEdFVF9QV1JfQ0ZHX0NVVF9NQVNLKFB3ckNmZ0NtZCksCi0JCQkgIEdFVF9QV1JfQ0ZHX0ZBQl9NQVNLKFB3ckNmZ0NtZCksCi0JCQkgIEdFVF9QV1JfQ0ZHX0lOVEZfTUFTSyhQd3JDZmdDbWQpLAotCQkJICBHRVRfUFdSX0NGR19CQVNFKFB3ckNmZ0NtZCksCi0JCQkgIEdFVF9QV1JfQ0ZHX0NNRChQd3JDZmdDbWQpLAotCQkJICBHRVRfUFdSX0NGR19NQVNLKFB3ckNmZ0NtZCksCi0JCQkgIEdFVF9QV1JfQ0ZHX1ZBTFVFKFB3ckNmZ0NtZCkpKTsKKwkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogb2Zmc2V0KCUjeCkgY3V0X21zayglI3gpIGZhYl9tc2soJSN4KSBpbnRlcmZhY2VfbXNrKCUjeCkgYmFzZSglI3gpIGNtZCglI3gpIG1zayglI3gpIHZhbHVlKCUjeClcbiIsCisJCQkgR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCksCisJCQkgR0VUX1BXUl9DRkdfQ1VUX01BU0soUHdyQ2ZnQ21kKSwKKwkJCSBHRVRfUFdSX0NGR19GQUJfTUFTSyhQd3JDZmdDbWQpLAorCQkJIEdFVF9QV1JfQ0ZHX0lOVEZfTUFTSyhQd3JDZmdDbWQpLAorCQkJIEdFVF9QV1JfQ0ZHX0JBU0UoUHdyQ2ZnQ21kKSwKKwkJCSBHRVRfUFdSX0NGR19DTUQoUHdyQ2ZnQ21kKSwKKwkJCSBHRVRfUFdSX0NGR19NQVNLKFB3ckNmZ0NtZCksCisJCQkgR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSk7CiAKIAkJLyogMiBPbmx5IEhhbmRsZSB0aGUgY29tbWFuZCB3aG9zZSBGQUIsIENVVCwgYW5kIEludGVyZmFjZSBhcmUKIAkJICAgbWF0Y2hlZCAqLwpAQCAtNzksMTQgKzc3LDEyIEBACiAJCQlzd2l0Y2ggKEdFVF9QV1JfQ0ZHX0NNRChQd3JDZmdDbWQpKSB7CiAJCQljYXNlIFBXUl9DTURfUkVBRDoKIAkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiAiCi0JCQkJCSAgIlBXUl9DTURfUkVBRFxuIikpOworCQkJCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IFBXUl9DTURfUkVBRFxuIik7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgUFdSX0NNRF9XUklURToKIAkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiAiCi0JCQkJCSAgIlBXUl9DTURfV1JJVEVcbiIpKTsKKwkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX1dSSVRFXG4iKTsKIAkJCQlvZmZzZXQgPSBHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKTsKIAogCQkJCS8qICBSZWFkIHRoZSB2YWx1ZSBmcm9tIHN5c3RlbSByZWdpc3RlciAqLwpAQCAtMTAyLDggKzk4LDcgQEAKIAogCQkJY2FzZSBQV1JfQ01EX1BPTExJTkc6CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogIgotCQkJCQkgICJQV1JfQ01EX1BPTExJTkdcbiIpKTsKKwkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX1BPTExJTkdcbiIpOwogCiAJCQkJYlBvbGxpbmdCaXQgPSBmYWxzZTsKIAkJCQlvZmZzZXQgPSBHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKTsKQEAgLTEzMSw4ICsxMjYsNyBAQAogCiAJCQljYXNlIFBXUl9DTURfREVMQVk6CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogIgotCQkJCQkgICJQV1JfQ01EX0RFTEFZXG4iKSk7CisJCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9ERUxBWVxuIik7CiAJCQkJaWYgKEdFVF9QV1JfQ0ZHX1ZBTFVFKFB3ckNmZ0NtZCkgPT0KIAkJCQkgICAgUFdSU0VRX0RFTEFZX1VTKQogCQkJCQl1ZGVsYXkoR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCkpOwpAQCAtMTQ1LDE1ICsxMzksMTIgQEAKIAkJCQkvKiAgV2hlbiB0aGlzIGNvbW1hbmQgaXMgcGFyc2VkLCBlbmQKIAkJCQkgICAgdGhlIHByb2Nlc3MgKi8KIAkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiAiCi0JCQkJCSAgIlBXUl9DTURfRU5EXG4iKSk7CisJCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9FTkRcbiIpOwogCQkJCXJldHVybiB0cnVlOwotCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogIgotCQkJCQkgICJVbmtub3duIENNRCEhXG4iKSk7CisJCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogVW5rbm93biBDTUQhIVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL2hhbF9jb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL2hhbF9jb20uYwppbmRleCBiZjRjYWUyLi41MzBkYjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfY29tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2NvbS5jCkBAIC0yMiw0NiArMjIsNiBAQAogCiAjZGVmaW5lIF9IQUxfSU5JVF9DXwogCi12b2lkIGR1bXBfY2hpcF9pbmZvMjNhKHN0cnVjdCBoYWxfdmVyc2lvbiBDaGlwVmVyc2lvbikKLXsKLQlpbnQgY250ID0gMDsKLQl1OCBidWZbMTI4XTsKLQotCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiQ2hpcCBWZXJzaW9uIEluZm86IENISVBfODcyM0FfIik7Ci0KLQljbnQgKz0gc3ByaW50ZigoYnVmICsgY250KSwgIiVzXyIsIElTX05PUk1BTF9DSElQKENoaXBWZXJzaW9uKSA/Ci0JCSAgICAgICAiTm9ybWFsX0NoaXAiIDogIlRlc3RfQ2hpcCIpOwotCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiJXNfIiwKLQkJICAgICAgIElTX0NISVBfVkVORE9SX1RTTUMoQ2hpcFZlcnNpb24pID8gIlRTTUMiIDogIlVNQyIpOwotCWlmIChJU19BX0NVVChDaGlwVmVyc2lvbikpCi0JCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiQV9DVVRfIik7Ci0JZWxzZSBpZiAoSVNfQl9DVVQoQ2hpcFZlcnNpb24pKQotCQljbnQgKz0gc3ByaW50ZigoYnVmICsgY250KSwgIkJfQ1VUXyIpOwotCWVsc2UgaWYgKElTX0NfQ1VUKENoaXBWZXJzaW9uKSkKLQkJY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICJDX0NVVF8iKTsKLQllbHNlIGlmIChJU19EX0NVVChDaGlwVmVyc2lvbikpCi0JCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiRF9DVVRfIik7Ci0JZWxzZSBpZiAoSVNfRV9DVVQoQ2hpcFZlcnNpb24pKQotCQljbnQgKz0gc3ByaW50ZigoYnVmICsgY250KSwgIkVfQ1VUXyIpOwotCWVsc2UKLQkJY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICJVTktOT1dOX0NVVCglZClfIiwKLQkJCSAgICAgICBDaGlwVmVyc2lvbi5DVVRWZXJzaW9uKTsKLQotCWlmIChJU18xVDFSKENoaXBWZXJzaW9uKSkKLQkJY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICIxVDFSXyIpOwotCWVsc2UgaWYgKElTXzFUMlIoQ2hpcFZlcnNpb24pKQotCQljbnQgKz0gc3ByaW50ZigoYnVmICsgY250KSwgIjFUMlJfIik7Ci0JZWxzZSBpZiAoSVNfMlQyUihDaGlwVmVyc2lvbikpCi0JCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiMlQyUl8iKTsKLQllbHNlCi0JCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiVU5LTk9XTl9SRlRZUEUoJWQpXyIsCi0JCQkgICAgICAgQ2hpcFZlcnNpb24uUkZUeXBlKTsKLQotCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiUm9tVmVyKCVkKVxuIiwgQ2hpcFZlcnNpb24uUk9NVmVyKTsKLQotCURCR184NzIzQSgiJXMiLCBidWYpOwotfQotCiAjZGVmaW5lCUVFUFJPTV9DSEFOTkVMX1BMQU5fQllfSFdfTUFTSwkweDgwCiAKIC8qIHJldHVybiB0aGUgZmluYWwgY2hhbm5lbCBwbGFuIGRlY2lzaW9uICovCkBAIC0yMzEsMTMgKzE5MSwxMSBAQAogCXJhdGVfaW5kZXggPSAwOwogCS8qICBTZXQgUlRTIGluaXRpYWwgcmF0ZSAqLwogCXdoaWxlIChicmF0ZV9jZmcgPiAweDEpIHsKLQkJYnJhdGVfY2ZnID0gKGJyYXRlX2NmZyA+PiAxKTsKKwkJYnJhdGVfY2ZnID4+PSAxOwogCQlyYXRlX2luZGV4Kys7CiAJfQogCQkvKiAgWml2IC0gQ2hlY2sgKi8KIAlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfSU5JUlRTX1JBVEVfU0VMLCByYXRlX2luZGV4KTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgX09uZU91dFBpcGVNYXBwaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCkBAIC00MzcsOSArMzk1LDYgQEAKIAkJaWYgKE1pblNwYWNpbmdUb1NldCA8IFNlY01pblNwYWNlKQogCQkJTWluU3BhY2luZ1RvU2V0ID0gU2VjTWluU3BhY2U7CiAKLQkJLyogUlRfVFJBQ0UoQ09NUF9NTE1FLCBEQkdfTE9VRCwKLQkJICAgKCJTZXQgSFdfVkFSX0FNUERVX01JTl9TUEFDRTogJSN4XG4iLAotCQkgICBwYWRhcHRlci0+TWdudEluZm8uTWluU3BhY2VDZmcpKTsgKi8KIAkJTWluU3BhY2luZ1RvU2V0IHw9CiAJCQlydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19BTVBEVV9NSU5fU1BBQ0UpICYgMHhmODsKIAkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FNUERVX01JTl9TUEFDRSwKQEAgLTQ3OSw5ICs0MzQsNiBAQAogCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FHR0xFTl9MTVQgKyBpbmRleCwKIAkJCQkJIHBSZWdUb1NldFtpbmRleF0pOwogCQl9Ci0KLQkJLyogUlRfVFJBQ0UoQ09NUF9NTE1FLCBEQkdfTE9VRCwKLQkJICAgKCJTZXQgSFdfVkFSX0FNUERVX0ZBQ1RPUjogJSN4XG4iLCBGYWN0b3JUb1NldCkpOyAqLwogCX0KIH0KIApAQCAtNjY2LDE0ICs2MTgsOCBAQAogCQkvKiAgd3JpdGUgY29udGVudCAwIGlzIGVxdWFsbCB0byBtYXJrIGludmFsaWQgKi8KIAkJLyogZGVsYXlfbXMoNDApOyAqLwogCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgV0NBTUksIHVsQ29udGVudCk7Ci0JCS8qIFJUX1RSQUNFKENPTVBfU0VDLCBEQkdfTE9VRCwKLQkJICAgKCJydGw4NzIzYV9jYW1fZW1wdHlfZW50cnkoKTogV1JJVEUgQTQ6ICVseFxuIiwKLQkJICAgdWxDb250ZW50KSk7Ki8KIAkJLyogZGVsYXlfbXMoNDApOyAqLwogCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0NBTUNNRCwgdWxDb21tYW5kKTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19MT1VELAotCQkgICAoInJ0bDg3MjNhX2NhbV9lbXB0eV9lbnRyeSgpOiBXUklURSBBMDogJWx4XG4iLAotCQkgICB1bENvbW1hbmQpKTsqLwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYwppbmRleCA1MjY5YjQ2Li5lYzU0M2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYwpAQCAtMTg5LDI1ICsxODksMTYgQEAKIAogLyogRU5ELS0tLS0tLS0tQkIgUE9XRVIgU0FWRS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrMjNhQ0UyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQogdm9pZCBvZG1fRHluYW1pY1R4UG93ZXIyM2FJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7CiAKLXZvaWQgb2RtX1JTU0lNb25pdG9yQ2hlY2syM2FDRShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOworc3RhdGljIHZvaWQgb2RtX1JTU0lNb25pdG9yQ2hlY2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKIHZvaWQgb2RtX0R5bmFtaWNUeFBvd2VyMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7CiAKLXZvaWQgb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgT0RNX1RYUG93ZXJUcmFja2luZ0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7CitzdGF0aWMgdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKIAogdm9pZCBvZG1fUmF0ZUFkYXB0aXZlTWFza0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKIAotdm9pZCBvZG1fVFhQb3dlclRyYWNraW5nVGhlcm1hbE1ldGVySW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi12b2lkIG9kbV9UWFBvd2VyVHJhY2tpbmdJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0NoZWNrQ0UyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKK3N0YXRpYyB2b2lkIG9kbV9UWFBvd2VyVHJhY2tpbmdJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7CiAKIHN0YXRpYyB2b2lkIG9kbV9FZGNhVHVyYm9DaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwogc3RhdGljIHZvaWQgT0RNX0VkY2FUdXJib0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKQEAgLTIxNiwxNiArMjA3LDE2IEBACiAjZGVmaW5lCVJ4RGVmYXVsdEFudDIJCTB4NTY5YQogCiBib29sIG9kbV9TdGFEZWZBbnRTZWwoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotIHUzMiBPRkRNX0FudDFfQ250LAotIHUzMiBPRkRNX0FudDJfQ250LAotIHUzMiBDQ0tfQW50MV9DbnQsCi0gdTMyIENDS19BbnQyX0NudCwKLSB1OCAqcERlZkFudAorCXUzMiBPRkRNX0FudDFfQ250LAorCXUzMiBPRkRNX0FudDJfQ250LAorCXUzMiBDQ0tfQW50MV9DbnQsCisJdTMyIENDS19BbnQyX0NudCwKKwl1OCAqcERlZkFudAogCSk7CiAKIHZvaWQgb2RtX1NldFJ4SWRsZUFudChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCiAJdTggQW50LAotICAgYm9vbCAgIGJEdWFsUGF0aAorCWJvb2wgICBiRHVhbFBhdGgKICk7CiAKIC8qIDMgRXhwb3J0IEludGVyZmFjZSAqLwpAQCAtMjQxLDcgKzIzMiw3IEBACiAKIAlvZG0yM2FfRHluQkJQU0luaXQocERNX09kbSk7CiAJb2RtX0R5bmFtaWNUeFBvd2VyMjNhSW5pdChwRE1fT2RtKTsKLQlvZG1fVFhQb3dlclRyYWNraW5nSW5pdDIzYShwRE1fT2RtKTsKKwlvZG1fVFhQb3dlclRyYWNraW5nSW5pdChwRE1fT2RtKTsKIAlPRE1fRWRjYVR1cmJvSW5pdDIzYShwRE1fT2RtKTsKIH0KIApAQCAtMjU4LDcgKzI0OSw3IEBACiAJb2RtX0NtbkluZm9VcGRhdGVfRGVidWcyM2EocERNX09kbSk7CiAJb2RtX0NvbW1vbkluZm9TZWxmVXBkYXRlKHBIYWxEYXRhKTsKIAlvZG1fRmFsc2VBbGFybUNvdW50ZXJTdGF0aXN0aWNzMjNhKHBETV9PZG0pOwotCW9kbV9SU1NJTW9uaXRvckNoZWNrMjNhKHBETV9PZG0pOworCW9kbV9SU1NJTW9uaXRvckNoZWNrKHBETV9PZG0pOwogCiAJLyogODcyM0Egb3IgODE4OUVTIHBsYXRmb3JtICovCiAJLyogTmVpbENoZW4tLTIwMTItLTA4LS0yNC0tICovCkBAIC0yNzcsMTQgKzI2OCwxMSBAQAogCWlmIChwd3JjdHJscHJpdi0+YnBvd2VyX3NhdmluZykKIAkJcmV0dXJuOwogCi0Jb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrMjNhKHBETV9PZG0pOworCW9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzayhwRE1fT2RtKTsKIAogCW9kbV9EeW5hbWljQkJQb3dlclNhdmluZzIzYShwRE1fT2RtKTsKIAotCU9ETV9UWFBvd2VyVHJhY2tpbmdDaGVjazIzYShwRE1fT2RtKTsKIAlvZG1fRWRjYVR1cmJvQ2hlY2syM2EocERNX09kbSk7Ci0KLQlvZG1fZHRjKHBETV9PZG0pOwogfQogCiAvKiAgKi8KQEAgLTMwMiwxMSArMjkwLDYgQEAKIAkvKiAgKi8KIAlzd2l0Y2gJKENtbkluZm8pIHsKIAkvKiAgRml4ZWQgT0RNIHZhbHVlLiAqLwotCWNhc2UJT0RNX0NNTklORk9fUExBVEZPUk06Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fSU5URVJGQUNFOgotCQlwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlID0gKHU4KVZhbHVlOwotCQlicmVhazsKIAljYXNlCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUDoKIAkJcERNX09kbS0+YklzTVBDaGlwID0gKHU4KVZhbHVlOwogCQlicmVhazsKQEAgLTMxOSw5ICszMDIsNiBAQAogCWNhc2UJT0RNX0NNTklORk9fRkFCX1ZFUjoKIAkJcERNX09kbS0+RmFiVmVyc2lvbiA9ICh1OClWYWx1ZTsKIAkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SRl9UWVBFOgotCQlwRE1fT2RtLT5SRlR5cGUgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwogCWNhc2UJT0RNX0NNTklORk9fQk9BUkRfVFlQRToKIAkJcERNX09kbS0+Qm9hcmRUeXBlID0gKHU4KVZhbHVlOwogCQlicmVhazsKQEAgLTMzNCw5ICszMTQsNiBAQAogCWNhc2UJT0RNX0NNTklORk9fRVhUX1RSU1c6CiAJCXBETV9PZG0tPkV4dFRSU1cgPSAodTgpVmFsdWU7CiAJCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUEFUQ0hfSUQ6Ci0JCXBETV9PZG0tPlBhdGNoSUQgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwogCWNhc2UJT0RNX0NNTklORk9fQklOSENUX1RFU1Q6CiAJCXBETV9PZG0tPmJJbkhjdFRlc3QgPSAoYm9vbClWYWx1ZTsKIAkJYnJlYWs7CkBAIC0zNTEsMTUgKzMyOCw2IEBACiAJCS8qIGRvIG5vdGhpbmcgKi8KIAkJYnJlYWs7CiAJfQotCi0JLyogICovCi0JLyogIFR4IHBvd2VyIHRyYWNraW5nIEJCIHN3aW5nIHRhYmxlLiAqLwotCS8qICBUaGUgYmFzZSBpbmRleCA9IDEyLiArKCgxMi1uKS8yKWRCIDEzfj8/ID0gZGVjcmVhc2UgdHggcHdyIGJ5IC0oKG4tMTIpLzIpZEIgKi8KLQkvKiAgKi8KLQlwRE1fT2RtLT5CYlN3aW5nSWR4T2ZkbQkJCT0gMTI7IC8qICBTZXQgZGVmYWx1dCB2YWx1ZSBhcyBpbmRleCAxMi4gKi8KLQlwRE1fT2RtLT5CYlN3aW5nSWR4T2ZkbUN1cnJlbnQJPSAxMjsKLQlwRE1fT2RtLT5CYlN3aW5nRmxhZ09mZG0JCT0gZmFsc2U7Ci0KIH0KIAogdm9pZCBPRE1fQ21uSW5mb1B0ckFycmF5SG9vazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gb2RtX2NtbmluZm8gQ21uSW5mbywKQEAgLTM4Myw5ICszNTEsNiBAQAogewogCS8qICBUaGlzIGluaXQgdmFyaWFibGUgbWF5IGJlIGNoYW5nZWQgaW4gcnVuIHRpbWUuICovCiAJc3dpdGNoCShDbW5JbmZvKSB7Ci0JY2FzZQlPRE1fQ01OSU5GT19SRl9UWVBFOgotCQlwRE1fT2RtLT5SRlR5cGUgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwogCWNhc2UJT0RNX0NNTklORk9fV0lGSV9ESVJFQ1Q6CiAJCXBETV9PZG0tPmJXSUZJX0RpcmVjdCA9IChib29sKVZhbHVlOwogCQlicmVhazsKQEAgLTQxNCwxMyArMzc5LDE4IEBACiAKIH0KIAotdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbQotCSkKK3ZvaWQgb2RtX0NvbW1vbkluZm9TZWxmSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCiB7Ci0JcERNX09kbS0+YkNja0hpZ2hQb3dlciA9Ci0JCShib29sKSBPRE1fR2V0QkJSZWcocERNX09kbSwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCBCSVQoOSkpOworCXUzMiB2YWwzMjsKKworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihwRE1fT2RtLT5BZGFwdGVyLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIpOworCWlmICh2YWwzMiAmIEJJVCg5KSkKKwkJcERNX09kbS0+YkNja0hpZ2hQb3dlciA9IHRydWU7CisJZWxzZQorCQlwRE1fT2RtLT5iQ2NrSGlnaFBvd2VyID0gZmFsc2U7CisJCQogCXBETV9PZG0tPlJGUGF0aFJ4RW5hYmxlID0KLQkJKHU4KSBPRE1fR2V0QkJSZWcocERNX09kbSwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4MEYpOworCQlydGw4NzIzYXVfcmVhZDMyKHBETV9PZG0tPkFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlKSAmIDB4MEY7CiAKIAlPRE1fSW5pdERlYnVnU2V0dGluZzIzYShwRE1fT2RtKTsKIH0KQEAgLTQzMiwxNSArNDAyLDYgQEAKIAl1OCBFbnRyeUNudCA9IDA7CiAJdTggaTsKIAotCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzQwKSB7Ci0JCWlmIChwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQyA9PSAxKQotCQkJcERNX09kbS0+Q29udHJvbENoYW5uZWwgPSBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwgLSAyOwotCQllbHNlIGlmIChwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQyA9PSAyKQotCQkJcERNX09kbS0+Q29udHJvbENoYW5uZWwgPSBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwgKyAyOwotCX0gZWxzZSB7Ci0JCXBETV9PZG0tPkNvbnRyb2xDaGFubmVsID0gcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBPRE1fQVNTT0NJQVRFX0VOVFJZX05VTTsgaSsrKSB7CiAJCXBFbnRyeSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKIAkJaWYgKHBFbnRyeSkKQEAgLTQ1NiwxNiArNDE3LDEzIEBACiB7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIm9kbV9DbW5JbmZvSW5pdF9EZWJ1ZzIzYSA9PT5cbiIpKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiU3VwcG9ydEFiaWxpdHkgPSAweCV4XG4iLCBwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0SW50ZXJmYWNlID0lZFxuIiwgcERNX09kbS0+U3VwcG9ydEludGVyZmFjZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0SUNUeXBlID0gMHgleFxuIiwgcERNX09kbS0+U3VwcG9ydElDVHlwZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJDdXRWZXJzaW9uID0lZFxuIiwgcERNX09kbS0+Q3V0VmVyc2lvbikpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJGYWJWZXJzaW9uID0lZFxuIiwgcERNX09kbS0+RmFiVmVyc2lvbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJSRlR5cGUgPSVkXG4iLCBwRE1fT2RtLT5SRlR5cGUpKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiQm9hcmRUeXBlID0lZFxuIiwgcERNX09kbS0+Qm9hcmRUeXBlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dExOQSA9JWRcbiIsIHBETV9PZG0tPkV4dExOQSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJFeHRQQSA9JWRcbiIsIHBETV9PZG0tPkV4dFBBKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dFRSU1cgPSVkXG4iLCBwRE1fT2RtLT5FeHRUUlNXKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlBhdGNoSUQgPSVkXG4iLCBwRE1fT2RtLT5QYXRjaElEKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJJbkhjdFRlc3QgPSVkXG4iLCBwRE1fT2RtLT5iSW5IY3RUZXN0KSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJXSUZJVGVzdCA9JWRcbiIsIHBETV9PZG0tPmJXSUZJVGVzdCkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJiRHVhbE1hY1NtYXJ0Q29uY3VycmVudCA9JWRcbiIsIHBETV9PZG0tPmJEdWFsTWFjU21hcnRDb25jdXJyZW50KSk7CkBAIC00ODEsMTggKzQzOSwxOSBAQAogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJSU1NJX01pbiA9JWRcbiIsIHBETV9PZG0tPlJTU0lfTWluKSk7CiB9CiAKLXZvaWQgT0RNX1dyaXRlX0RJRzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTggQ3VycmVudElHSQotCSkKK3ZvaWQgT0RNX1dyaXRlX0RJRzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCXU4IEN1cnJlbnRJR0kpCiB7CisJc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKIAlzdHJ1Y3QgZGlnX3QgKnBETV9EaWdUYWJsZSA9ICZwRE1fT2RtLT5ETV9EaWdUYWJsZTsKLQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJPRE1fUkVHKElHSV9BLCBwRE1fT2RtKSA9IDB4JXgsIE9ETV9CSVQoSUdJLCBwRE1fT2RtKSA9IDB4JXggXG4iLAotCQlPRE1fUkVHKElHSV9BLCBwRE1fT2RtKSwgT0RNX0JJVChJR0ksIHBETV9PZG0pKSk7CisJdTMyIHZhbDMyOwogCiAJaWYgKHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSAhPSBDdXJyZW50SUdJKSB7Ci0JCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHKElHSV9BLCBwRE1fT2RtKSwgT0RNX0JJVChJR0ksIHBETV9PZG0pLCBDdXJyZW50SUdJKTsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIkN1cnJlbnRJR0koMHglMDJ4KS4gXG4iLCBDdXJyZW50SUdJKSk7CisJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0lHSV9BXzExTik7CisJCXZhbDMyICY9IH5PRE1fQklUX0lHSV8xMU47CisJCXZhbDMyIHw9IEN1cnJlbnRJR0k7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfSUdJX0FfMTFOLCB2YWwzMik7CisJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKKwkJCSAgICAgKCJDdXJyZW50SUdJKDB4JTAyeCkuIFxuIiwgQ3VycmVudElHSSkpOwogCQlwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSBDdXJyZW50SUdJOwogCX0KIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCkBAIC01MTUsMTEgKzQ3NCwxMCBAQAogCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJK1JTU0lfT0ZGU0VUX0RJRzsKIAliRndDdXJyZW50SW5QU01vZGUgPSBwQWRhcHRlci0+cHdyY3RybHByaXYuYkZ3Q3VycmVudEluUFNNb2RlOwogCi0JLyogT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJR19MUFMsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCkgPT0+XG4iKSk7ICovCi0KIAkvKiAgVXNpbmcgRlcgUFMgbW9kZSB0byBtYWtlIElHSSAqLwogCWlmIChiRndDdXJyZW50SW5QU01vZGUpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIi0tLU5laWwtLS1vZG1fRElHMjNhIGlzIGluIExQUyBtb2RlXG4iKSk7CisJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKKwkJCSAgICAgKCItLS1OZWlsLS0tb2RtX0RJRzIzYSBpcyBpbiBMUFMgbW9kZVxuIikpOwogCQkvKiBBZGp1c3QgYnkgIEZBIGluIExQUyBNT0RFICovCiAJCWlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPiBETV9ESUdfRkFfVEgyX0xQUykKIAkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJKzI7CkBAIC01NDUsMTUgKzUwMywxNyBAQAogCSBlbHNlIGlmIChDdXJyZW50SUdJIDwgUlNTSV9Mb3dlcikKIAkJQ3VycmVudElHSSA9IFJTU0lfTG93ZXI7CiAKLQlPRE1fV3JpdGVfRElHMjNhKHBETV9PZG0sIEN1cnJlbnRJR0kpOy8qIE9ETV9Xcml0ZV9ESUcyM2EocERNX09kbSwgcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlKTsgKi8KLQorCU9ETV9Xcml0ZV9ESUcyM2EocERNX09kbSwgQ3VycmVudElHSSk7CiB9CiAKIHZvaWQgb2RtX0RJRzIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewogCXN0cnVjdCBkaWdfdCAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOworCXUzMiB2YWwzMjsKIAotCXBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9ICh1OCkgT0RNX0dldEJCUmVnKHBETV9PZG0sIE9ETV9SRUcoSUdJX0EsIHBETV9PZG0pLCBPRE1fQklUKElHSSwgcERNX09kbSkpOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihwRE1fT2RtLT5BZGFwdGVyLCBPRE1fUkVHX0lHSV9BXzExTik7CisJcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gdmFsMzIgJiBPRE1fQklUX0lHSV8xMU47CisKIAlwRE1fRGlnVGFibGUtPlJzc2lMb3dUaHJlc2gJPSBETV9ESUdfVEhSRVNIX0xPVzsKIAlwRE1fRGlnVGFibGUtPlJzc2lIaWdoVGhyZXNoCT0gRE1fRElHX1RIUkVTSF9ISUdIOwogCXBETV9EaWdUYWJsZS0+RkFMb3dUaHJlc2gJPSBETV9GQUxTRUFMQVJNX1RIUkVTSF9MT1c7CkBAIC01OTEsMjYgKzU1MSwyMiBAQAogCXU4IGRtX2RpZ19tYXgsIGRtX2RpZ19taW47CiAJdTggQ3VycmVudElHSSA9IHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZTsKIAotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCkgPT0+XG4iKSk7Ci0JLyogaWYgKCEocERNX09kbS0+U3VwcG9ydEFiaWxpdHkgJiAoT0RNX0JCX0RJR3xPRE1fQkJfRkFfQ05UKSkpICovCi0JaWYgKCghKHBETV9PZG0tPlN1cHBvcnRBYmlsaXR5Jk9ETV9CQl9ESUcpKSB8fCAoIShwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSZPRE1fQkJfRkFfQ05UKSkpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJICAgICAoIm9kbV9ESUcyM2EoKSBSZXR1cm46IFN1cHBvcnRBYmlsaXR5IE9ETV9CQl9ESUcgb3IgT0RNX0JCX0ZBX0NOVCBpcyBkaXNhYmxlZFxuIikpOwotCQlyZXR1cm47Ci0JfQotCisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAorCQkgICAgICgib2RtX0RJRzIzYSgpID09PlxuIikpOwogCWlmIChhZGFwdGVyLT5tbG1lcHJpdi5iU2NhbkluUHJvY2VzcykgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpIFJldHVybjogSW4gU2NhbiBQcm9ncmVzcyBcbiIpKTsKKwkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAorCQkJICAgICAoIm9kbV9ESUcyM2EoKSBSZXR1cm46IEluIFNjYW4gUHJvZ3Jlc3MgXG4iKSk7CiAJCXJldHVybjsKIAl9CiAKIAlESUdfRHluYW1pY19NSU4gPSBwRE1fRGlnVGFibGUtPkRJR19EeW5hbWljX01JTl8wOwogCUZpcnN0Q29ubmVjdCA9IChwRE1fT2RtLT5iTGlua2VkKSAmJiAoIXBETV9EaWdUYWJsZS0+Yk1lZGlhQ29ubmVjdF8wKTsKLQlGaXJzdERpc0Nvbm5lY3QgPSAoIXBETV9PZG0tPmJMaW5rZWQpICYmIChwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMCk7CisJRmlyc3REaXNDb25uZWN0ID0gKCFwRE1fT2RtLT5iTGlua2VkKSAmJgorCQkocERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzApOwogCiAJLyogMSBCb3VuZGFyeSBEZWNpc2lvbiAqLwogCWlmICgocERNX09kbS0+U3VwcG9ydElDVHlwZSAmIE9ETV9SVEw4NzIzQSkgJiYKLQkgICAgKChwRE1fT2RtLT5Cb2FyZFR5cGUgPT0gT0RNX0JPQVJEX0hJR0hQV1IpIHx8IHBETV9PZG0tPkV4dExOQSkpIHsKKwkgICAgKHBETV9PZG0tPkJvYXJkVHlwZSA9PSBPRE1fQk9BUkRfSElHSFBXUiB8fCBwRE1fT2RtLT5FeHRMTkEpKSB7CiAJCWRtX2RpZ19tYXggPSBETV9ESUdfTUFYX05JQ19IUDsKIAkJZG1fZGlnX21pbiA9IERNX0RJR19NSU5fTklDX0hQOwogCQlESUdfTWF4T2ZNaW4gPSBETV9ESUdfTUFYX0FQX0hQOwpAQCAtNzY0LDMxICs3MjAsMjkgQEAKIAogdm9pZCBvZG1fRmFsc2VBbGFybUNvdW50ZXJTdGF0aXN0aWNzMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKIHsKLQl1MzIgcmV0X3ZhbHVlOworCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7CiAJc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzICpGYWxzZUFsbUNudCA9ICZwRE1fT2RtLT5GYWxzZUFsbUNudDsKLQotCWlmICghKHBETV9PZG0tPlN1cHBvcnRBYmlsaXR5ICYgT0RNX0JCX0ZBX0NOVCkpCi0JCXJldHVybjsKKwl1MzIgcmV0X3ZhbHVlLCB2YWwzMjsKIAogCS8qIGhvbGQgb2ZkbSBjb3VudGVyICovCi0JIC8qIGhvbGQgcGFnZSBDIGNvdW50ZXIgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTiwgQklUKDMxKSwgMSk7CisJLyogaG9sZCBwYWdlIEMgY291bnRlciAqLworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOKTsKKwl2YWwzMiB8PSBCSVQoMzEpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4sIHZhbDMyKTsKIAkvKiBob2xkIHBhZ2UgRCBjb3VudGVyICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgQklUKDMxKSwgMSk7Ci0JcmV0X3ZhbHVlID0KLQkJT0RNX0dldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfT0ZETV9GQV9UWVBFMV8xMU4sIGJNYXNrRFdvcmQpOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4pOworCXZhbDMyIHw9IEJJVCgzMSk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCB2YWwzMik7CisJcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTFfMTFOKTsKIAlGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0JRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCA9ICgocmV0X3ZhbHVlJjB4ZmZmZjAwMDApPj4xNik7Ci0JcmV0X3ZhbHVlID0KLQkJT0RNX0dldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfT0ZETV9GQV9UWVBFMl8xMU4sIGJNYXNrRFdvcmQpOworCUZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCk+PjE2OworCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEUyXzExTik7CiAJRmFsc2VBbG1DbnQtPkNudF9PRkRNX0NDQSA9IChyZXRfdmFsdWUmMHhmZmZmKTsKLQlGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsID0gKChyZXRfdmFsdWUmMHhmZmZmMDAwMCk+PjE2KTsKLQlyZXRfdmFsdWUgPQotCQlPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1RZUEUzXzExTiwgYk1hc2tEV29yZCk7CisJRmFsc2VBbG1DbnQtPkNudF9QYXJpdHlfRmFpbCA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7CisJcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTNfMTFOKTsKIAlGYWxzZUFsbUNudC0+Q250X1JhdGVfSWxsZWdhbCA9IChyZXRfdmFsdWUmMHhmZmZmKTsKLQlGYWxzZUFsbUNudC0+Q250X0NyYzhfZmFpbCA9ICgocmV0X3ZhbHVlJjB4ZmZmZjAwMDApPj4xNik7Ci0JcmV0X3ZhbHVlID0KLQkJT0RNX0dldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4sIGJNYXNrRFdvcmQpOworCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKKwlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4pOwogCUZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwgPSAocmV0X3ZhbHVlJjB4ZmZmZik7CiAKIAlGYWxzZUFsbUNudC0+Q250X09mZG1fZmFpbCA9IEZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgKwpAQCAtNzk4LDE1ICs3NTIsMTYgQEAKIAkJRmFsc2VBbG1DbnQtPkNudF9GYXN0X0ZzeW5jICsKIAkJRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbDsKIAkvKiBob2xkIGNjayBjb3VudGVyICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIEJJVCgxMiksIDEpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOLCBCSVQoMTQpLCAxKTsKKwl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTik7CisJdmFsMzIgfD0gKEJJVCgxMikgfCBCSVQoMTQpKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOLCB2YWwzMik7CiAKLQlyZXRfdmFsdWUgPSBPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfRkFfTFNCXzExTiwgYk1hc2tCeXRlMCk7CisJcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9MU0JfMTFOKSAmIDB4ZmY7CiAJRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCA9IHJldF92YWx1ZTsKLQlyZXRfdmFsdWUgPSBPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfRkFfTVNCXzExTiwgYk1hc2tCeXRlMyk7Ci0JRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCArPSAgKHJldF92YWx1ZSAmIDB4ZmYpIDw8IDg7CisJcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9NU0JfMTFOKSA+PiAxNjsKKwlGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsICs9IChyZXRfdmFsdWUgJiAweGZmMDApOwogCi0JcmV0X3ZhbHVlID0gT0RNX0dldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfQ0NLX0NDQV9DTlRfMTFOLCBiTWFza0RXb3JkKTsKKwlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0NDQV9DTlRfMTFOKTsKIAlGYWxzZUFsbUNudC0+Q250X0NDS19DQ0EgPQogCQkoKHJldF92YWx1ZSYweEZGKTw8OCkgfCAoKHJldF92YWx1ZSYweEZGMDApPj44KTsKIApAQCAtODIzLDI2ICs3NzgsMzkgQEAKIAogCWlmIChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlID49IE9ETV9SVEw4NzIzQSkgewogCQkvKiByZXNldCBmYWxzZSBhbGFybSBjb3VudGVyIHJlZ2lzdGVycyAqLwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOLCBCSVQoMzEpLCAxKTsKLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfT0ZETV9GQV9SU1RDXzExTiwgQklUKDMxKSwgMCk7Ci0JCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIEJJVCgyNyksIDEpOwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCBCSVQoMjcpLCAwKTsKKwkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1RDXzExTik7CisJCXZhbDMyIHw9IEJJVCgzMSk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1RDXzExTiwgdmFsMzIpOworCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOKTsKKwkJdmFsMzIgJj0gfkJJVCgzMSk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1RDXzExTiwgdmFsMzIpOworCisJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4pOworCQl2YWwzMiB8PSBCSVQoMjcpOworCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIHZhbDMyKTsKKwkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTik7CisJCXZhbDMyICY9IH5CSVQoMjcpOworCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIHZhbDMyKTsKKwogCQkvKiB1cGRhdGUgb2ZkbSBjb3VudGVyICovCiAJCSAvKiB1cGRhdGUgcGFnZSBDIGNvdW50ZXIgKi8KLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4sIEJJVCgzMSksIDApOworCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTik7CisJCXZhbDMyICY9IH5CSVQoMzEpOworCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOLCB2YWwzMik7CisKIAkJIC8qIHVwZGF0ZSBwYWdlIEQgY291bnRlciAqLwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCBCSVQoMzEpLCAwKTsKKwkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTik7CisJCXZhbDMyICY9IH5CSVQoMzEpOworCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIHZhbDMyKTsKIAogCQkvKiByZXNldCBDQ0sgQ0NBIGNvdW50ZXIgKi8KLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sCi0JCQkgICAgIEJJVCgxMykgfCBCSVQoMTIpLCAwKTsKLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sCi0JCQkgICAgIEJJVCgxMykgfCBCSVQoMTIpLCAyKTsKLQkJLyogcmVzZXQgQ0NLIEZBIGNvdW50ZXIgKi8KLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sCi0JCQkgICAgIEJJVCgxNSkgfCBCSVQoMTQpLCAwKTsKLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sCi0JCQkgICAgIEJJVCgxNSkgfCBCSVQoMTQpLCAyKTsKKwkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4pOworCQl2YWwzMiAmPSB+KEJJVCgxMikgfCBCSVQoMTMpIHwgQklUKDE0KSB8IEJJVCgxNSkpOworCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOLCB2YWwzMik7CisKKwkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4pOworCQl2YWwzMiB8PSAoQklUKDEzKSB8IEJJVCgxNSkpOworCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOLCB2YWwzMik7CiAJfQogCiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0ZBX0NOVCwgT0RNX0RCR19MT1VELApAQCAtODU5LDkgKzgyNywxMiBAQAogCQkgICAgICgiQ250X0NyYzhfZmFpbCA9JWQsIENudF9NY3NfZmFpbCA9JWRcbiIsCiAJCSAgICAgIEZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsLCBGYWxzZUFsbUNudC0+Q250X01jc19mYWlsKSk7CiAKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsICgiQ250X0Nja19mYWlsID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwgKCJDbnRfT2ZkbV9mYWlsID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9PZmRtX2ZhaWwpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsICgiVG90YWwgRmFsc2UgQWxhcm0gPSVkXG4iLCBGYWxzZUFsbUNudC0+Q250X2FsbCkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoIkNudF9DY2tfZmFpbCA9JWRcbiIsIEZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJDbnRfT2ZkbV9mYWlsID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9PZmRtX2ZhaWwpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJUb3RhbCBGYWxzZSBBbGFybSA9JWRcbiIsIEZhbHNlQWxtQ250LT5DbnRfYWxsKSk7CiB9CiAKIC8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC04NzMsMTYgKzg0NCwxMyBAQAogCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cyAqRmFsc2VBbG1DbnQgPSAmcERNX09kbS0+RmFsc2VBbG1DbnQ7CiAJdTggQ3VyQ0NLX0NDQVRocmVzOwogCi0JaWYgKCEocERNX09kbS0+U3VwcG9ydEFiaWxpdHkgJiAoT0RNX0JCX0NDS19QRHxPRE1fQkJfRkFfQ05UKSkpCi0JCXJldHVybjsKLQogCWlmIChwRE1fT2RtLT5FeHRMTkEpCiAJCXJldHVybjsKIAogCWlmIChwRE1fT2RtLT5iTGlua2VkKSB7CiAJCWlmIChwRE1fT2RtLT5SU1NJX01pbiA+IDI1KSB7CiAJCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweGNkOwotCQl9IGVsc2UgaWYgKChwRE1fT2RtLT5SU1NJX01pbiA8PSAyNSkgJiYgKHBETV9PZG0tPlJTU0lfTWluID4gMTApKSB7CisJCX0gZWxzZSBpZiAocERNX09kbS0+UlNTSV9NaW4gPD0gMjUgJiYgcERNX09kbS0+UlNTSV9NaW4gPiAxMCkgewogCQkJQ3VyQ0NLX0NDQVRocmVzID0gMHg4MzsKIAkJfSBlbHNlIHsKIAkJCWlmIChGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsID4gMTAwMCkKQEAgLTkwNSwxMCArODczLDEwIEBACiAJc3RydWN0IGRpZ190ICpwRE1fRGlnVGFibGUgPSAmcERNX09kbS0+RE1fRGlnVGFibGU7CiAKIAlpZiAocERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXMgIT0gQ3VyQ0NLX0NDQVRocmVzKQotCQlPRE1fV3JpdGUxQnl0ZShwRE1fT2RtLCBPRE1fUkVHKENDS19DQ0EsIHBETV9PZG0pLCBDdXJDQ0tfQ0NBVGhyZXMpOworCQlydGw4NzIzYXVfd3JpdGU4KHBETV9PZG0tPkFkYXB0ZXIsIE9ETV9SRUcoQ0NLX0NDQSwgcERNX09kbSksCisJCQkJIEN1ckNDS19DQ0FUaHJlcyk7CiAJcERNX0RpZ1RhYmxlLT5QcmVDQ0tfQ0NBVGhyZXMgPSBwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlczsKIAlwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyA9IEN1ckNDS19DQ0FUaHJlczsKLQogfQogCiAvKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtOTM0LDIwICs5MDIsMTkgQEAKIHZvaWQgT0RNX1JGX1NhdmluZzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IGJGb3JjZUluTm9ybWFsKQogewogCXN0cnVjdCBkeW5hbWljX3B3cl9zYXYgKnBETV9QU1RhYmxlID0gJnBETV9PZG0tPkRNX1BTVGFibGU7CisJc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKKwl1MzIgdmFsMzI7CiAJdTggUnNzaV9VcF9ib3VuZCA9IDMwOwogCXU4IFJzc2lfTG93X2JvdW5kID0gMjU7Ci0JaWYgKHBETV9PZG0tPlBhdGNoSUQgPT0gNDApIHsgLyogUlRfQ0lEXzgxOXhfRlVOQUlfVFYgKi8KLQkJUnNzaV9VcF9ib3VuZCA9IDUwOwotCQlSc3NpX0xvd19ib3VuZCA9IDQ1OwotCX0KIAlpZiAocERNX1BTVGFibGUtPmluaXRpYWxpemUgPT0gMCkgewogCi0JCXBETV9QU1RhYmxlLT5SZWc4NzQgPSAoT0RNX0dldEJCUmVnKHBETV9PZG0sIDB4ODc0LCBiTWFza0RXb3JkKSYweDFDQzAwMCk+PjE0OworCQlwRE1fUFNUYWJsZS0+UmVnODc0ID0KKwkJCXJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpICYgMHgxQ0MwMDA7CiAJCXBETV9QU1RhYmxlLT5SZWdDNzAgPQotCQkJKE9ETV9HZXRCQlJlZyhwRE1fT2RtLCAweGM3MCwgYk1hc2tEV29yZCkgJiBCSVQoMykpID4+MzsKLQkJcERNX1BTVGFibGUtPlJlZzg1QyA9IChPRE1fR2V0QkJSZWcocERNX09kbSwgMHg4NWMsIGJNYXNrRFdvcmQpJjB4RkYwMDAwMDApPj4yNDsKLQkJcERNX1BTVGFibGUtPlJlZ0E3NCA9IChPRE1fR2V0QkJSZWcocERNX09kbSwgMHhhNzQsIGJNYXNrRFdvcmQpJjB4RjAwMCk+PjEyOwotCQkvKiBSZWc4MTggPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgMHg4MTgsIGJNYXNrRFdvcmQpOyAqLworCQkJcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGM3MCkgJiBCSVQoMyk7CisJCXBETV9QU1RhYmxlLT5SZWc4NUMgPQorCQkJcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg1YykgJiAweEZGMDAwMDAwOworCQlwRE1fUFNUYWJsZS0+UmVnQTc0ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGE3NCkgJiAweEYwMDA7CiAJCXBETV9QU1RhYmxlLT5pbml0aWFsaXplID0gMTsKIAl9CiAKQEAgLTk3MywyNiArOTQwLDc0IEBACiAKIAlpZiAocERNX1BTVGFibGUtPlByZVJGU3RhdGUgIT0gcERNX1BTVGFibGUtPkN1clJGU3RhdGUpIHsKIAkJaWYgKHBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID09IFJGX1NhdmUpIHsKLQkJCS8qICA8dHlubGlfbm90ZT4gODcyMyBSU1NJIHJlcG9ydCB3aWxsIGJlIHdyb25nLiBTZXQgMHg4NzRbNV09IDEgd2hlbiBlbnRlciBCQiBwb3dlciBzYXZpbmcgbW9kZS4gKi8KKwkJCS8qICA8dHlubGlfbm90ZT4gODcyMyBSU1NJIHJlcG9ydCB3aWxsIGJlIHdyb25nLgorCQkJICogU2V0IDB4ODc0WzVdPSAxIHdoZW4gZW50ZXIgQkIgcG93ZXIgc2F2aW5nIG1vZGUuICovCiAJCQkvKiAgU3VnZ2VzdGVkIGJ5IFNEMyBZdS1OYW4uIDIwMTEuMDEuMjAuICovCi0JCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpCi0JCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODc0LCBCSVQoNSksIDB4MSk7IC8qIFJlZzg3NFs1XT0gMWInMSAqLwotCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODc0LCAweDFDMDAwMCwgMHgyKTsgLyogUmVnODc0WzIwOjE4XT0gMydiMDEwICovCi0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHhjNzAsIEJJVCgzKSwgMCk7IC8qIFJlZ0M3MFszXT0gMSdiMCAqLwotCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODVjLCAweEZGMDAwMDAwLCAweDYzKTsgLyogUmVnODVDWzMxOjI0XT0gMHg2MyAqLwotCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODc0LCAweEMwMDAsIDB4Mik7IC8qIFJlZzg3NFsxNToxNF09IDInYjEwICovCi0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHhhNzQsIDB4RjAwMCwgMHgzKTsgLyogUmVnQTc1Wzc6NF09IDB4MyAqLwotCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODE4LCBCSVQoMjgpLCAweDApOyAvKiBSZWc4MThbMjhdPSAxJ2IwICovCi0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4MTgsIEJJVCgyOCksIDB4MSk7IC8qIFJlZzgxOFsyOF09IDEnYjEgKi8KKwkJCS8qIFJlZzg3NFs1XT0gMWInMSAqLworCQkJaWYgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPT0gT0RNX1JUTDg3MjNBKSB7CisJCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKKwkJCQl2YWwzMiB8PSBCSVQoNSk7CisJCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKKwkJCX0KKwkJCS8qIFJlZzg3NFsyMDoxOF09IDMnYjAxMCAqLworCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKKwkJCXZhbDMyICY9IH4oQklUKDE4KSB8IEJJVCgyMCkpOworCQkJdmFsMzIgfD0gQklUKDE5KTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7CisJCQkvKiBSZWdDNzBbM109IDEnYjAgKi8KKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGM3MCk7CisJCQl2YWwzMiAmPSB+QklUKDMpOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhjNzAsIHZhbDMyKTsKKwkJCS8qIFJlZzg1Q1szMToyNF09IDB4NjMgKi8KKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg1Yyk7CisJCQl2YWwzMiAmPSAweDAwZmZmZmZmOworCQkJdmFsMzIgfD0gMHg2MzAwMDAwMDsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODVjLCB2YWwzMik7CisJCQkvKiBSZWc4NzRbMTU6MTRdPSAyJ2IxMCAqLworCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKKwkJCXZhbDMyICY9IH5CSVQoMTQpOworCQkJdmFsMzIgfD0gQklUKDE1KTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7CisJCQkvKiBSZWdBNzVbNzo0XT0gMHgzICovCisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhhNzQpOworCQkJdmFsMzIgJj0gfihCSVQoMTQpIHwgQklUKDE1KSk7CisJCQl2YWwzMiB8PSAoQklUKDEyKSB8IEJJVCgxMykpOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhhNzQsIHZhbDMyKTsKKwkJCS8qIFJlZzgxOFsyOF09IDEnYjAgKi8KKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgxOCk7CisJCQl2YWwzMiAmPSB+QklUKDI4KTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODE4LCB2YWwzMik7CisJCQkvKiBSZWc4MThbMjhdPSAxJ2IxICovCisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4MTgpOworCQkJdmFsMzIgfD0gQklUKDI4KTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODE4LCB2YWwzMik7CiAJCX0gZWxzZSB7Ci0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4NzQsIDB4MUNDMDAwLCBwRE1fUFNUYWJsZS0+UmVnODc0KTsKLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweGM3MCwgQklUKDMpLCBwRE1fUFNUYWJsZS0+UmVnQzcwKTsKLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweDg1YywgMHhGRjAwMDAwMCwgcERNX1BTVGFibGUtPlJlZzg1Qyk7Ci0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHhhNzQsIDB4RjAwMCwgcERNX1BTVGFibGUtPlJlZ0E3NCk7Ci0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4MTgsIEJJVCgyOCksIDB4MCk7CisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOworCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZzg3NDsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7CisJCQorCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKTsKKwkJCXZhbDMyIHw9IHBETV9QU1RhYmxlLT5SZWdDNzA7CisJCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGM3MCwgdmFsMzIpOwogCi0JCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpCi0JCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODc0LCBCSVQoNSksIDB4MCk7IC8qIFJlZzg3NFs1XT0gMWInMCAqLworCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODVjKTsKKwkJCXZhbDMyIHw9IHBETV9QU1RhYmxlLT5SZWc4NUM7CisJCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDg1YywgdmFsMzIpOworCisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhhNzQpOworCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZ0E3NDsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4YTc0LCB2YWwzMik7CisKKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgxOCk7CisJCQl2YWwzMiAmPSB+QklUKDI4KTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODE4LCB2YWwzMik7CisKKwkJCS8qIFJlZzg3NFs1XT0gMWInMCAqLworCQkJaWYgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPT0gT0RNX1JUTDg3MjNBKSB7CisJCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKKwkJCQl2YWwzMiAmPSB+QklUKDUpOworCQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7CisJCQl9CiAJCX0KIAkJcERNX1BTVGFibGUtPlByZVJGU3RhdGUgPSBwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZTsKIAl9CkBAIC0xMDEwLDEwICsxMDI1LDYgQEAKIAlzdHJ1Y3Qgb2RtX3JhdGVfYWRhcHQgKnBPZG1SQSA9ICZwRE1fT2RtLT5SYXRlQWRhcHRpdmU7CiAKIAlwT2RtUkEtPlR5cGUgPSBETV9UeXBlX0J5RHJpdmVyOwotCWlmIChwT2RtUkEtPlR5cGUgPT0gRE1fVHlwZV9CeURyaXZlcikKLQkJcERNX09kbS0+YlVzZVJBTWFzayA9IHRydWU7Ci0JZWxzZQotCQlwRE1fT2RtLT5iVXNlUkFNYXNrID0gZmFsc2U7CiAKIAlwT2RtUkEtPlJBVFJTdGF0ZSA9IERNX1JBVFJfU1RBX0lOSVQ7CiAJcE9kbVJBLT5IaWdoUlNTSVRocmVzaCA9IDUwOwpAQCAtMTA1Nyw3ICsxMDY4LDggQEAKIAkJYnJlYWs7CiAJY2FzZSAoT0RNX1dNX0J8T0RNX1dNX0d8T0RNX1dNX04yNEcpOgogCWNhc2UgKE9ETV9XTV9BfE9ETV9XTV9CfE9ETV9XTV9HfE9ETV9XTV9OMjRHKToKLQkJaWYgKHBETV9PZG0tPlJGVHlwZSA9PSBPRE1fMVQyUiB8fCBwRE1fT2RtLT5SRlR5cGUgPT0gT0RNXzFUMVIpIHsKKwkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMlIgfHwKKwkJICAgIHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMVIpIHsKIAkJCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpIHsKIAkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZjAwMDA7CiAJCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7CkBAIC0xMDg2LDIyICsxMDk4LDIyIEBACiAJZGVmYXVsdDoKIAkJLyogY2FzZSBXSVJFTEVTU18xMV8yNE46ICovCiAJCS8qIGNhc2UgV0lSRUxFU1NfMTFfNU46ICovCi0JCWlmIChwRE1fT2RtLT5SRlR5cGUgPT0gUkZfMVQyUikKKwkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMlIpCiAJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZmZmZmY7CiAJCWVsc2UKIAkJCXJhdGVfYml0bWFwID0gMHgwZmZmZmZmZjsKIAkJYnJlYWs7CiAJfQogCi0JLyogcHJpbnRrKCIlcyA9PT4gcnNzaV9sZXZlbDoweCUwMngsIFdpcmVsZXNzTW9kZToweCUwMngsIHJhdGVfYml0bWFwOjB4JTA4eCBcbiIsIF9fZnVuY19fLCByc3NpX2xldmVsLCBXaXJlbGVzc01vZGUsIHJhdGVfYml0bWFwKTsgKi8KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19MT1VELCAoIiA9PT4gcnNzaV9sZXZlbDoweCUwMngsIFdpcmVsZXNzTW9kZToweCUwMngsIHJhdGVfYml0bWFwOjB4JTA4eCBcbiIsIHJzc2lfbGV2ZWwsIFdpcmVsZXNzTW9kZSwgcmF0ZV9iaXRtYXApKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19MT1VELAorCSgiID09PiByc3NpX2xldmVsOjB4JTAyeCwgV2lyZWxlc3NNb2RlOjB4JTAyeCwgcmF0ZV9iaXRtYXA6MHglMDh4IFxuIiwKKwkgcnNzaV9sZXZlbCwgV2lyZWxlc3NNb2RlLCByYXRlX2JpdG1hcCkpOwogCiAJcmV0dXJuIHJhdGVfYml0bWFwOwotCiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOglvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2EoKQorICogRnVuY3Rpb246CW9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzaygpCiAgKgogICogT3ZlcnZpZXc6CVVwZGF0ZSByYXRlIHRhYmxlIG1hc2sgYWNjb3JkaW5nIHRvIHJzc2kKICAqCkBAIC0xMTE2LDUxICsxMTI4LDM1IEBACiAgKjA1LzI3LzIwMDkJaHBmYW4JQ3JlYXRlIFZlcnNpb24gMC4KICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIG9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCitzdGF0aWMgdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewotCWlmICghKHBETV9PZG0tPlN1cHBvcnRBYmlsaXR5ICYgT0RNX0JCX1JBX01BU0spKQotCQlyZXR1cm47Ci0JLyogICovCi0JLyogIDIwMTEvMDkvMjkgTUggSW4gSFcgaW50ZWdyYXRpb24gZmlyc3Qgc3RhZ2UsIHdlIHByb3ZpZGUgNCBkaWZmZXJlbnQgaGFuZGxlIHRvIG9wZXJhdGUgKi8KLQkvKiAgYXQgdGhlIHNhbWUgdGltZS4gSW4gdGhlIHN0YWdlMi8zLCB3ZSBuZWVkIHRvIHByaXZlIHVuaXZlcnNhbCBpbnRlcmZhY2UgYW5kIG1lcmdlIGFsbCAqLwotCS8qICBIVyBkeW5hbWljIG1lY2hhbmlzbS4gKi8KLQkvKiAgKi8KLQlvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2FDRTIzYShwRE1fT2RtKTsKLX0KLQotdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2FDRTIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17CisJc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7CisJdTMyIHNtb290aGVkOwogCXU4IGk7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcgkgPSAgcERNX09kbS0+QWRhcHRlcjsKIAogCWlmIChwQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHsKIAkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX1JBX01BU0ssIE9ETV9EQkdfVFJBQ0UsCi0JCQkgICAgICgiPC0tLS0gb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrMjNhKCk6IGRyaXZlciBpcyBnb2luZyB0byB1bmxvYWRcbiIpKTsKKwkJCSAgICAgKCI8LS0tLSAlczogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIiwKKwkJCSAgICAgIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXBETV9PZG0tPmJVc2VSQU1hc2spIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX1JBX01BU0ssIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCI8LS0tLSBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2EoKTogZHJpdmVyIGRvZXMgbm90IGNvbnRyb2wgcmF0ZSBhZGFwdGl2ZSBtYXNrXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBwcmludGsoIj09PiAlcyBcbiIsIF9fZnVuY19fKTsgKi8KLQogCWZvciAoaSA9IDA7IGkgPCBPRE1fQVNTT0NJQVRFX0VOVFJZX05VTTsgaSsrKSB7CiAJCXN0cnVjdCBzdGFfaW5mbyAqcHN0YXQgPSBwRE1fT2RtLT5wT0RNX1N0YUluZm9baV07CiAJCWlmIChwc3RhdCkgewotCQkJaWYgKE9ETV9SQVN0YXRlQ2hlY2syM2EocERNX09kbSwgcHN0YXQtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwgZmFsc2UsICZwc3RhdC0+cnNzaV9sZXZlbCkpIHsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19MT1VELAorCQkJc21vb3RoZWQgPSBwc3RhdC0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOworCQkJaWYgKE9ETV9SQVN0YXRlQ2hlY2syM2EocERNX09kbSwgc21vb3RoZWQsIGZhbHNlLAorCQkJCQkJJnBzdGF0LT5yc3NpX2xldmVsKSkgeworCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9SQV9NQVNLLAorCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwKIAkJCQkJICAgICAoIlJTU0k6JWQsIFJTU0lfTEVWRUw6JWRcbiIsCi0JCQkJCSAgICAgcHN0YXQtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwKLQkJCQkJICAgICBwc3RhdC0+cnNzaV9sZXZlbCkpOwotCQkJCXJ0d19oYWxfdXBkYXRlX3JhX21hc2syM2EocHN0YXQsIHBzdGF0LT5yc3NpX2xldmVsKTsKKwkJCQkJICAgICAgc21vb3RoZWQsCisJCQkJCSAgICAgIHBzdGF0LT5yc3NpX2xldmVsKSk7CisJCQkJcnR3X2hhbF91cGRhdGVfcmFfbWFzazIzYShwc3RhdCwKKwkJCQkJCQkgIHBzdGF0LT5yc3NpX2xldmVsKTsKIAkJCX0KLQogCQl9CiAJfQotCiB9CiAKIC8qICBSZXR1cm4gVmFsdWU6IGJvb2wgKi8KQEAgLTExODksNyArMTE4NSw4IEBACiAJCUxvd1JTU0lUaHJlc2hGb3JSQSArPSBHb1VwR2FwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlPRE1fUlRfQVNTRVJUKHBETV9PZG0sIGZhbHNlLCAoIndyb25nIHJzc2kgbGV2ZWwgc2V0dGluZyAlZCAhIiwgKnBSQVRSU3RhdGUpKTsKKwkJT0RNX1JUX0FTU0VSVChwRE1fT2RtLCBmYWxzZSwgKCJ3cm9uZyByc3NpIGxldmVsIHNldHRpbmcgJWQgISIsCisJCQkJCSAgICAgICAqcFJBVFJTdGF0ZSkpOwogCQlicmVhazsKIAl9CiAKQEAgLTEyMjcsMjQgKzEyMjQsOCBAQAogCXBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9IFR4SGlnaFB3ckxldmVsX05vcm1hbDsKIH0KIAotdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JLyogIEZvciBBUC9BRFNMIHVzZSBzdHJ1Y3QgcnRsODcyM2FfcHJpdiAqICovCi0JLyogIEZvciBDRS9OSUMgdXNlIHN0cnVjdCBydHdfYWRhcHRlciAqICovCi0KLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSAmIE9ETV9CQl9SU1NJX01PTklUT1IpKQotCQlyZXR1cm47Ci0KLQkvKiAgMjAxMS8wOS8yOSBNSCBJbiBIVyBpbnRlZ3JhdGlvbiBmaXJzdCBzdGFnZSwgd2UgcHJvdmlkZSA0IGRpZmZlcmVudCBoYW5kbGUgdG8gb3BlcmF0ZSAqLwotCS8qICBhdCB0aGUgc2FtZSB0aW1lLiBJbiB0aGUgc3RhZ2UyLzMsIHdlIG5lZWQgdG8gcHJpdmUgdW5pdmVyc2FsIGludGVyZmFjZSBhbmQgbWVyZ2UgYWxsICovCi0JLyogIEhXIGR5bmFtaWMgbWVjaGFuaXNtLiAqLwotCW9kbV9SU1NJTW9uaXRvckNoZWNrMjNhQ0UocERNX09kbSk7Ci19CS8qICBvZG1fUlNTSU1vbml0b3JDaGVjazIzYSAqLwotCiBzdGF0aWMgdm9pZAotRmluZE1pbmltdW1SU1NJKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIKLQkpCitGaW5kTWluaW11bVJTU0koc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcikKIHsKIAlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKIAlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwpAQCAtMTI1MiwyMSArMTIzMywyMiBAQAogCiAJLyogMSAxLkRldGVybWluZSB0aGUgbWluaW11bSBSU1NJICovCiAKLQlpZiAoKCFwRE1fT2RtLT5iTGlua2VkKSAmJgotCSAgICAocGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9PSAwKSkKKwlpZiAoIXBETV9PZG0tPmJMaW5rZWQgJiYgIXBkbXByaXYtPkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpCiAJCXBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNID0gMDsKIAllbHNlCi0JCXBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNID0gcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKKwkJcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPQorCQkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKIH0KIAotdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjazIzYUNFKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKK3N0YXRpYyB2b2lkIG9kbV9SU1NJTW9uaXRvckNoZWNrKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKIHsKIAlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwogCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlpbnQJaTsKLQlpbnQJdG1wRW50cnlNYXhQV0RCID0gMCwgdG1wRW50cnlNaW5QV0RCID0gMHhmZjsKKwlpbnQgaTsKKwlpbnQgTWF4REIgPSAwLCBNaW5EQiA9IDB4ZmY7CiAJdTggc3RhX2NudCA9IDA7CisJdTMyIHRtcGRiOwogCXUzMiBQV0RCX3Jzc2lbTlVNX1NUQV0gPSB7MH07LyogMH4xNV06TUFDSUQsIFsxNn4zMV06UFdEQl9yc3NpICovCiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCkBAIC0xMjc2LDM3ICsxMjU4LDM2IEBACiAJZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKIAkJcHN0YSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKIAkJaWYgKHBzdGEpIHsKLQkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCB0bXBFbnRyeU1pblBXREIpCi0JCQkJdG1wRW50cnlNaW5QV0RCID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOworCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IE1pbkRCKQorCQkJCU1pbkRCID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwogCi0JCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID4gdG1wRW50cnlNYXhQV0RCKQotCQkJCXRtcEVudHJ5TWF4UFdEQiA9IHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKKwkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPiBNYXhEQikKKwkJCQlNYXhEQiA9IHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKIAotCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiAhPSAoLTEpKQotCQkJCVBXREJfcnNzaVtzdGFfY250KytdID0gKHBzdGEtPm1hY19pZCB8IChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI8PDE2KSk7CisJCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCICE9IC0xKSB7CisJCQkJdG1wZGIgPSBwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7CisJCQkJUFdEQl9yc3NpW3N0YV9jbnQrK10gPSBwc3RhLT5tYWNfaWQgfAorCQkJCQkodG1wZGIgPDwgMTYpOworCQkJfQogCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHN0YV9jbnQ7IGkrKykgewotCQlpZiAoUFdEQl9yc3NpW2ldICE9ICgwKSkgewotCQkJaWYgKHBIYWxEYXRhLT5md19yYWN0cmwpIC8qICBSZXBvcnQgZXZlcnkgc3RhJ3MgUlNTSSB0byBGVyAqLwotCQkJCXJ0bDg3MjNhX3NldF9yc3NpX2NtZChBZGFwdGVyLCAodTggKikmUFdEQl9yc3NpW2ldKTsKLQkJfQorCQlpZiAoUFdEQl9yc3NpW2ldICE9ICgwKSkKKwkJCXJ0bDg3MjNhX3NldF9yc3NpX2NtZChBZGFwdGVyLCAodTggKikmUFdEQl9yc3NpW2ldKTsKIAl9CiAKLQlpZiAodG1wRW50cnlNYXhQV0RCICE9IDApCS8qICBJZiBhc3NvY2lhdGVkIGVudHJ5IGlzIGZvdW5kICovCi0JCXBkbXByaXYtPkVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSB0bXBFbnRyeU1heFBXREI7Ci0JZWxzZQotCQlwZG1wcml2LT5FbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKKwlwZG1wcml2LT5FbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gTWF4REI7CiAKLQlpZiAodG1wRW50cnlNaW5QV0RCICE9IDB4ZmYpIC8qICBJZiBhc3NvY2lhdGVkIGVudHJ5IGlzIGZvdW5kICovCi0JCXBkbXByaXYtPkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSB0bXBFbnRyeU1pblBXREI7CisJaWYgKE1pbkRCICE9IDB4ZmYpIC8qICBJZiBhc3NvY2lhdGVkIGVudHJ5IGlzIGZvdW5kICovCisJCXBkbXByaXYtPkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBNaW5EQjsKIAllbHNlCiAJCXBkbXByaXYtPkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAwOwogCiAJRmluZE1pbmltdW1SU1NJKEFkYXB0ZXIpOy8qIGdldCBwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSAqLwogCi0JT0RNX0NtbkluZm9VcGRhdGUyM2EoJnBIYWxEYXRhLT5vZG1wcml2LCBPRE1fQ01OSU5GT19SU1NJX01JTiwgcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0pOworCU9ETV9DbW5JbmZvVXBkYXRlMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgT0RNX0NNTklORk9fUlNTSV9NSU4sCisJCQkgICAgIHBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNKTsKIH0KIAogLyogZW5kaWYgKi8KQEAgLTEzMTQsMTIgKzEyOTUsNyBAQAogLyogMyBUeCBQb3dlciBUcmFja2luZyAqLwogLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotdm9pZCBvZG1fVFhQb3dlclRyYWNraW5nSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jb2RtX1RYUG93ZXJUcmFja2luZ1RoZXJtYWxNZXRlckluaXQyM2EocERNX09kbSk7Ci19Ci0KLXZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ1RoZXJtYWxNZXRlckluaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQorc3RhdGljIHZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0luaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewogCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7CiAJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKQEAgLTEzMjksNDIgKzEzMDUsMzMgQEAKIAlwZG1wcml2LT5UWFBvd2VyY291bnQgPSAwOwogCXBkbXByaXYtPmJUWFBvd2VyVHJhY2tpbmdJbml0ID0gZmFsc2U7CiAJcGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCA9IHRydWU7Ci0JTVNHXzg3MjNBKCJwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sID0gJWRcbiIsIHBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wpOworCU1TR184NzIzQSgicGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCA9ICVkXG4iLAorCQkgIHBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wpOwogCiAJcERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLlR4UG93ZXJUcmFja0NvbnRyb2wgPSB0cnVlOwogfQogCi12b2lkIE9ETV9UWFBvd2VyVHJhY2tpbmdDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JLyogIEZvciBBUC9BRFNMIHVzZSBzdHJ1Y3QgcnRsODcyM2FfcHJpdiAqICovCi0JLyogIEZvciBDRS9OSUMgdXNlIHN0cnVjdCBydHdfYWRhcHRlciAqICovCi0KLQkvKiAgMjAxMS8wOS8yOSBNSCBJbiBIVyBpbnRlZ3JhdGlvbiBmaXJzdCBzdGFnZSwgd2UgcHJvdmlkZSA0IGRpZmZlcmVudCBoYW5kbGUgdG8gb3BlcmF0ZSAqLwotCS8qICBhdCB0aGUgc2FtZSB0aW1lLiBJbiB0aGUgc3RhZ2UyLzMsIHdlIG5lZWQgdG8gcHJpdmUgdW5pdmVyc2FsIGludGVyZmFjZSBhbmQgbWVyZ2UgYWxsICovCi0JLyogIEhXIGR5bmFtaWMgbWVjaGFuaXNtLiAqLwotCW9kbV9UWFBvd2VyVHJhY2tpbmdDaGVja0NFMjNhKHBETV9PZG0pOwotfQotCi12b2lkIG9kbV9UWFBvd2VyVHJhY2tpbmdDaGVja0NFMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLX0KLQogLyogRURDQSBUdXJibyAqLwogc3RhdGljIHZvaWQgT0RNX0VkY2FUdXJib0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewotCiAJc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKIAogCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSBmYWxzZTsKLQlwRE1fT2RtLT5ETV9FRENBX1RhYmxlLmJJc0N1clJETFN0YXRlID0gZmFsc2U7CiAJQWRhcHRlci0+cmVjdnByaXYuYklzQW55Tm9uQkVQa3RzID0gZmFsc2U7CiAKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIFZPIFBBUkFNOiAweCV4XG4iLCBPRE1fUmVhZDRCeXRlKHBETV9PZG0sIE9ETV9FRENBX1ZPX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgVkkgUEFSQU06IDB4JXhcbiIsIE9ETV9SZWFkNEJ5dGUocERNX09kbSwgT0RNX0VEQ0FfVklfUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBCRSBQQVJBTTogMHgleFxuIiwgT0RNX1JlYWQ0Qnl0ZShwRE1fT2RtLCBPRE1fRURDQV9CRV9QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIEJLIFBBUkFNOiAweCV4XG4iLCBPRE1fUmVhZDRCeXRlKHBETV9PZG0sIE9ETV9FRENBX0JLX1BBUkFNKSkpOwotCi19CS8qICBPRE1fSW5pdEVkY2FUdXJibyAqLworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJPcmdpbmlhbCBWTyBQQVJBTTogMHgleFxuIiwKKwkJICAgICAgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9WT19QQVJBTSkpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELAorCQkgICAgICgiT3JnaW5pYWwgVkkgUEFSQU06IDB4JXhcbiIsCisJCSAgICAgIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfVklfUEFSQU0pKSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoIk9yZ2luaWFsIEJFIFBBUkFNOiAweCV4XG4iLAorCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX0JFX1BBUkFNKSkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJPcmdpbmlhbCBCSyBQQVJBTTogMHgleFxuIiwKKwkJICAgICAgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9CS19QQVJBTSkpKTsKK30KIAogc3RhdGljIHZvaWQgb2RtX0VkY2FUdXJib0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKIHsKQEAgLTEzNzcsMTkgKzEzNDQsMTggQEAKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKIAl1MzIgdHJhZmZpY0luZGV4OwogCXUzMiBlZGNhX3BhcmFtOwotCXU2NCBjdXJfdHhfYnl0ZXMgPSAwOwotCXU2NCBjdXJfcnhfYnl0ZXMgPSAwOwotCXU4IGJidGNoYW5nZSA9IGZhbHNlOworCXU2NCBjdXJfdHhfYnl0ZXM7CisJdTY0IGN1cl9yeF9ieXRlczsKIAogCS8qICBGb3IgQVAvQURTTCB1c2Ugc3RydWN0IHJ0bDg3MjNhX3ByaXYgKiAqLwogCS8qICBGb3IgQ0UvTklDIHVzZSBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKiAqLwogCi0JLyogIDIwMTEvMDkvMjkgTUggSW4gSFcgaW50ZWdyYXRpb24gZmlyc3Qgc3RhZ2UsIHdlIHByb3ZpZGUgNCBkaWZmZXJlbnQgaGFuZGxlIHRvIG9wZXJhdGUgKi8KLQkvKiAgYXQgdGhlIHNhbWUgdGltZS4gSW4gdGhlIHN0YWdlMi8zLCB3ZSBuZWVkIHRvIHByaXZlIHVuaXZlcnNhbCBpbnRlcmZhY2UgYW5kIG1lcmdlIGFsbCAqLwotCS8qICBIVyBkeW5hbWljIG1lY2hhbmlzbS4gKi8KLQotCWlmICghKHBETV9PZG0tPlN1cHBvcnRBYmlsaXR5ICYgT0RNX01BQ19FRENBX1RVUkJPKSkKLQkJcmV0dXJuOworCS8qCisJICogMjAxMS8wOS8yOSBNSCBJbiBIVyBpbnRlZ3JhdGlvbiBmaXJzdCBzdGFnZSwgd2UgcHJvdmlkZSA0CisJICogZGlmZmVyZW50IGhhbmRsZSB0byBvcGVyYXRlIGF0IHRoZSBzYW1lIHRpbWUuIEluIHRoZSBzdGFnZTIvMywKKwkgKiB3ZSBuZWVkIHRvIHByaXZlIHVuaXZlcnNhbCBpbnRlcmZhY2UgYW5kIG1lcmdlIGFsbCBIVyBkeW5hbWljCisJICogbWVjaGFuaXNtLgorCSAqLwogCiAJaWYgKChwcmVncHJpdi0+d2lmaV9zcGVjID09IDEpKS8qICAocG1sbWVpbmZvLT5IVF9lbmFibGUgPT0gMCkpICovCiAJCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKQEAgLTE0MDEsNyArMTM2Nyw3IEBACiAJCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKIAogCS8qICBDaGVjayBpZiB0aGUgc3RhdHVzIG5lZWRzIHRvIGJlIGNoYW5nZWQuICovCi0JaWYgKChiYnRjaGFuZ2UpIHx8ICghcHJlY3Zwcml2LT5iSXNBbnlOb25CRVBrdHMpKSB7CisJaWYgKCFwcmVjdnByaXYtPmJJc0FueU5vbkJFUGt0cykgewogCQljdXJfdHhfYnl0ZXMgPSBweG1pdHByaXYtPnR4X2J5dGVzIC0gcHhtaXRwcml2LT5sYXN0X3R4X2J5dGVzOwogCQljdXJfcnhfYnl0ZXMgPSBwcmVjdnByaXYtPnJ4X2J5dGVzIC0gcHJlY3Zwcml2LT5sYXN0X3J4X2J5dGVzOwogCkBAIC0xNDU0LDI5ICsxNDIwLDM3IEBACiAJcHJlY3Zwcml2LT5sYXN0X3J4X2J5dGVzID0gcHJlY3Zwcml2LT5yeF9ieXRlczsKIH0KIAotdTMyIEdldFBTRERhdGEoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1bnNpZ25lZCBpbnQgcG9pbnQsIHU4IGluaXRpYWxfZ2Fpbl9wc2QpCit1MzIgR2V0UFNERGF0YShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHVuc2lnbmVkIGludCBwb2ludCwKKwkgICAgICAgdTggaW5pdGlhbF9nYWluX3BzZCkKIHsKLQl1MzIgcHNkX3JlcG9ydDsKKwlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOworCXUzMiBwc2RfcmVwb3J0LCB2YWwzMjsKIAogCS8qIFNldCBEQ08gZnJlcXVlbmN5IGluZGV4LCBvZmZzZXQgPSAoNDBNSHovU2FtcGxlUHRzKSpwb2ludCAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweDgwOCwgMHgzRkYsIHBvaW50KTsKKwl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4MDgpOworCXZhbDMyICY9IH4weDNmZjsKKwl2YWwzMiB8PSAocG9pbnQgJiAweDNmZik7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MDgsIHZhbDMyKTsKIAogCS8qIFN0YXJ0IFBTRCBjYWxjdWxhdGlvbiwgUmVnODA4WzIyXT0gMC0+MSAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweDgwOCwgQklUKDIyKSwgMSk7CisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODA4KTsKKwl2YWwzMiB8PSBCSVQoMjIpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODA4LCB2YWwzMik7CiAJLyogTmVlZCB0byB3YWl0IGZvciBIVyBQU0QgcmVwb3J0ICovCiAJdWRlbGF5KDMwKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4MDgsIEJJVCgyMiksIDApOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgwOCk7CisJdmFsMzIgJj0gfkJJVCgyMik7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MDgsIHZhbDMyKTsKIAkvKiBSZWFkIFBTRCByZXBvcnQsIFJlZzhCNFsxNTowXSAqLwotCXBzZF9yZXBvcnQgPSBPRE1fR2V0QkJSZWcocERNX09kbSwgMHg4QjQsIGJNYXNrRFdvcmQpICYgMHgwMDAwRkZGRjsKKwlwc2RfcmVwb3J0ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDhCNCkgJiAweDAwMDBGRkZGOwogCi0JcHNkX3JlcG9ydCA9ICh1MzIpKENvbnZlcnRUb19kQjIzYShwc2RfcmVwb3J0KSkrKHUzMikoaW5pdGlhbF9nYWluX3BzZC0weDFjKTsKKwlwc2RfcmVwb3J0ID0gKHUzMikoQ29udmVydFRvX2RCMjNhKHBzZF9yZXBvcnQpKSArCisJCSh1MzIpKGluaXRpYWxfZ2Fpbl9wc2QtMHgxYyk7CiAKIAlyZXR1cm4gcHNkX3JlcG9ydDsKIH0KIAotdTMyCi1Db252ZXJ0VG9fZEIyM2EoCi0JdTMyIFZhbHVlKQordTMyIENvbnZlcnRUb19kQjIzYSh1MzIgVmFsdWUpCiB7CiAJdTggaTsKIAl1OCBqOwpAQCAtMTUwNCw3ICsxNDc4LDggQEAKIAogLyogICovCiAvKiAgRGVzY3JpcHRpb246ICovCi0vKlNldCBTaW5nbGUvRHVhbCBBbnRlbm5hIGRlZmF1bHQgc2V0dGluZyBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZG8gZGV0ZWN0aW9uIGluIGFkdmFuY2UuICovCisvKiBTZXQgU2luZ2xlL0R1YWwgQW50ZW5uYSBkZWZhdWx0IHNldHRpbmcgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90CisgKiBkbyBkZXRlY3Rpb24gaW4gYWR2YW5jZS4gKi8KIC8qICAqLwogLyogIEFkZGVkIGJ5IEpvc2VwaCwgMjAxMi4wMy4yMiAqLwogLyogICovCkBAIC0xNTE4LDE4ICsxNDkzLDEzIEBACiAKIC8qIDIgODcyM0EgQU5UIERFVEVDVCAqLwogCi1zdGF0aWMgdm9pZCBvZG1fUEhZX1NhdmVBRkVSZWdpc3RlcnMoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMiAqQUZFUmVnLAotCXUzMiAqQUZFQmFja3VwLAotCXUzMiBSZWdpc3Rlck51bQotCSkKK3N0YXRpYyB2b2lkIG9kbV9QSFlfU2F2ZUFGRVJlZ2lzdGVycyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiAqQUZFUmVnLAorCQkJCSAgICAgdTMyICpBRkVCYWNrdXAsIHUzMiBSZWdpc3Rlck51bSkKIHsKIAl1MzIgaTsKIAotCS8qIFJUUFJJTlQoRklOSVQsIElOSVRfSVFLLCAoIlNhdmUgQUREQSBwYXJhbWV0ZXJzLlxuIikpOyAqLwogCWZvciAoaSA9IDAgOyBpIDwgUmVnaXN0ZXJOdW0gOyBpKyspCi0JCUFGRUJhY2t1cFtpXSA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCBBRkVSZWdbaV0sIGJNYXNrRFdvcmQpOworCQlBRkVCYWNrdXBbaV0gPSBydGw4NzIzYXVfcmVhZDMyKHBETV9PZG0tPkFkYXB0ZXIsIEFGRVJlZ1tpXSk7CiB9CiAKIHN0YXRpYyB2b2lkIG9kbV9QSFlfUmVsb2FkQUZFUmVnaXN0ZXJzKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyICpBRkVSZWcsCkBAIC0xNTM4LDcgKzE1MDgsNyBAQAogCXUzMiBpOwogCiAJZm9yIChpID0gMCA7IGkgPCBSZWdpZXN0ZXJOdW07IGkrKykKLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIEFGRVJlZ1tpXSwgYk1hc2tEV29yZCwgQUZFQmFja3VwW2ldKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocERNX09kbS0+QWRhcHRlciwgQUZFUmVnW2ldLCBBRkVCYWNrdXBbaV0pOwogfQogCiAvKiAyIDg3MjNBIEFOVCBERVRFQ1QgKi8KQEAgLTE1NDgsOSArMTUxOCwxMCBAQAogYm9vbCBPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBtb2RlKQogewogCXN0cnVjdCBzd19hbnRfc3cgKnBETV9TV0FUX1RhYmxlID0gJnBETV9PZG0tPkRNX1NXQVRfVGFibGU7CisJc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKIAl1MzIgQ3VycmVudENoYW5uZWwsIFJmTG9vcFJlZzsKIAl1OCBuOwotCXUzMiBSZWc4OGMsIFJlZ2MwOCwgUmVnODc0LCBSZWdjNTA7CisJdTMyIFJlZzg4YywgUmVnYzA4LCBSZWc4NzQsIFJlZ2M1MCwgdmFsMzI7CiAJdTggaW5pdGlhbF9nYWluID0gMHg1YTsKIAl1MzIgUFNEX3JlcG9ydF90bXA7CiAJdTMyIEFudEFfcmVwb3J0ID0gMHgwLCBBbnRCX3JlcG9ydCA9IDB4MCwgQW50T19yZXBvcnQgPSAweDA7CkBAIC0xNTczLDcyICsxNTQ0LDgwIEBACiAJCXJldHVybiBiUmVzdWx0OwogCS8qIDEgQmFja3VwIEN1cnJlbnQgUkYvQkIgU2V0dGluZ3MgKi8KIAotCUN1cnJlbnRDaGFubmVsID0gT0RNX0dldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgT0RNX0NIQU5ORUwsIGJSRlJlZ09mZnNldE1hc2spOworCUN1cnJlbnRDaGFubmVsID0gT0RNX0dldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgT0RNX0NIQU5ORUwsCisJCQkJICAgICAgYlJGUmVnT2Zmc2V0TWFzayk7CiAJUmZMb29wUmVnID0gT0RNX0dldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwMCwgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBPRE1fRFBEVCwgQW50ZW5uYV9BKTsgIC8qICBjaGFuZ2UgdG8gQW50ZW5uYSBBICovCisJLyogIGNoYW5nZSB0byBBbnRlbm5hIEEgKi8KKwl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UpOworCXZhbDMyICY9IH4weDMwMDsKKwl2YWwzMiB8PSAweDEwMDsJCS8qIEVuYWJsZSBhbnRlbm5hIEEgKi8KKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgdmFsMzIpOworCiAJLyogIFN0ZXAgMTogVVNFIElRSyB0byB0cmFuc21pdHRlciBzaW5nbGUgdG9uZSAqLwogCiAJdWRlbGF5KDEwKTsKIAogCS8qIFN0b3JlIEEgUGF0aCBSZWdpc3RlciA4OGMsIGMwOCwgODc0LCBjNTAgKi8KLQlSZWc4OGMgPSBPRE1fR2V0QkJSZWcocERNX09kbSwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIGJNYXNrRFdvcmQpOwotCVJlZ2MwOCA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCByT0ZETTBfVFJNdXhQYXIsIGJNYXNrRFdvcmQpOwotCVJlZzg3NCA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1csIGJNYXNrRFdvcmQpOwotCVJlZ2M1MCA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCByT0ZETTBfWEFBR0NDb3JlMSwgYk1hc2tEV29yZCk7CisJUmVnODhjID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCk7CisJUmVnYzA4ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIpOworCVJlZzg3NCA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXKTsKKwlSZWdjNTAgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJPRkRNMF9YQUFHQ0NvcmUxKTsKIAogCS8qICBTdG9yZSBBRkUgUmVnaXN0ZXJzICovCiAJb2RtX1BIWV9TYXZlQUZFUmVnaXN0ZXJzKHBETV9PZG0sIEFGRV9SRUdfODcyM0EsIEFGRV9CYWNrdXAsIDE2KTsKIAogCS8qIFNldCBQU0QgMTI4IHB0cyAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfUFNERnVuY3Rpb24sIEJJVCgxNCkgfCBCSVQoMTUpLCAweDApOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfUFNERnVuY3Rpb24pOworCXZhbDMyICY9IH4oQklUKDE0KSB8IEJJVCgxNSkpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9QU0RGdW5jdGlvbiwgdmFsMzIpOwogCiAJLyogIFRvIFNFVCBDSDEgdG8gZG8gKi8KLQlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCBPRE1fQ0hBTk5FTCwgYlJGUmVnT2Zmc2V0TWFzaywgMHgwMSk7ICAgICAvKiBDaGFubmVsIDEgKi8KKwlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCBPRE1fQ0hBTk5FTCwgYlJGUmVnT2Zmc2V0TWFzaywgMHgwMSk7CiAKIAkvKiAgQUZFIGFsbCBvbiBzdGVwICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJSeF9XYWl0X0NDQSwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJUeF9DQ0tfUkZPTiwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJUeF9DQ0tfQkJPTiwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJUeF9PRkRNX1JGT04sIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByVHhfT0ZETV9CQk9OLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X1RvX1J4LCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X1RvX1R4LCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X0NDSywgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJSeF9PRkRNLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X1dhaXRfUklGUywgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJSeF9UT19SeCwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJTdGFuZGJ5LCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclNsZWVwLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclBNUERfQU5BRU4sIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfWENEX1N3aXRjaENvbnRyb2wsIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByQmx1ZV9Ub290aCwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfQ0NLX1JGT04sIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9DQ0tfQkJPTiwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X09GRE1fUkZPTiwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X09GRE1fQkJPTiwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X1RvX1J4LCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfVG9fVHgsIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9DQ0ssIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9PRkRNLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfV2FpdF9SSUZTLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfVE9fUngsIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJTdGFuZGJ5LCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByU2xlZXAsIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJQTVBEX0FOQUVOLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWENEX1N3aXRjaENvbnRyb2wsIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJCbHVlX1Rvb3RoLCAweDZGREIyNUE0KTsKIAogCS8qICAzIHdpcmUgRGlzYWJsZSAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgYk1hc2tEV29yZCwgMHhDQ0YwMDBDMCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIDB4Q0NGMDAwQzApOwogCiAJLyogQkIgSVFLIFNldHRpbmcgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgck9GRE0wX1RSTXV4UGFyLCBiTWFza0RXb3JkLCAweDAwMDgwMEU0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCBiTWFza0RXb3JkLCAweDIyMjA4MDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIsIDB4MDAwODAwRTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgMHgyMjIwODAwMCk7CiAKIAkvKiBJUUsgc2V0dGluZyB0b25lQCA0LjM0TWh6ICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJUeF9JUUtfVG9uZV9BLCBiTWFza0RXb3JkLCAweDEwMDA4QzFDKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X0lRSywgYk1hc2tEV29yZCwgMHgwMTAwN2MwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0lRS19Ub25lX0EsIDB4MTAwMDhDMUMpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9JUUssIDB4MDEwMDdjMDApOwogCiAJLyogUGFnZSBCIGluaXQgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckNvbmZpZ19BbnRBLCBiTWFza0RXb3JkLCAweDAwMDgwMDAwKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckNvbmZpZ19BbnRBLCBiTWFza0RXb3JkLCAweDBmNjAwMDAwKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X0lRSywgYk1hc2tEV29yZCwgMHgwMTAwNDgwMCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJSeF9JUUtfVG9uZV9BLCBiTWFza0RXb3JkLCAweDEwMDA4YzFmKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X0lRS19QSV9BLCBiTWFza0RXb3JkLCAweDgyMTUwMDA4KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X0lRS19QSV9BLCBiTWFza0RXb3JkLCAweDI4MTUwMDA4KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgcklRS19BR0NfUnNwLCBiTWFza0RXb3JkLCAweDAwMTAyOGQwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByQ29uZmlnX0FudEEsIDB4MDAwODAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJDb25maWdfQW50QSwgMHgwZjYwMDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRSywgMHgwMTAwNDgwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MTAwMDhjMWYpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9JUUtfUElfQSwgMHg4MjE1MDAwOCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRS19QSV9BLCAweDI4MTUwMDA4KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBySVFLX0FHQ19Sc3AsIDB4MDAxMDI4ZDApOwogCiAJLyogUkYgbG9vcCBTZXR0aW5nICovCiAJT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwLCAweEZGRkZGLCAweDUwMDA4KTsKIAogCS8qIElRSyBTaW5nbGUgdG9uZSBzdGFydCAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfSVFLLCBiTWFza0RXb3JkLCAweDgwODAwMDAwKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgcklRS19BR0NfUHRzLCBiTWFza0RXb3JkLCAweGY4MDAwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfSVFLLCAweDgwODAwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjgwMDAwMDApOwogCXVkZWxheSgxMDAwKTsKIAlQU0RfcmVwb3J0X3RtcCA9IDB4MDsKIApAQCAtMTY1MCw3ICsxNjI5LDEwIEBACiAKIAlQU0RfcmVwb3J0X3RtcCA9IDB4MDsKIAotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgMHgzMDAsIEFudGVubmFfQik7ICAvKiAgY2hhbmdlIHRvIEFudGVubmEgQiAqLworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSk7CisJdmFsMzIgJj0gfjB4MzAwOworCXZhbDMyIHw9IDB4MjAwOwkJLyogRW5hYmxlIGFudGVubmEgQiAqLworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCB2YWwzMik7CiAJdWRlbGF5KDEwKTsKIAogCWZvciAobiA9IDA7IG4gPCAyOyBuKyspIHsKQEAgLTE2NjAsNyArMTY0MiwxMCBAQAogCX0KIAogCS8qICBjaGFuZ2UgdG8gb3BlbiBjYXNlICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCAweDMwMCwgMCk7ICAvKiAgY2hhbmdlIHRvIEFudCBBIGFuZCBCIGFsbCBvcGVuIGNhc2UgKi8KKwkvKiAgY2hhbmdlIHRvIEFudCBBIGFuZCBCIGFsbCBvcGVuIGNhc2UgKi8KKwl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UpOworCXZhbDMyICY9IH4weDMwMDsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgdmFsMzIpOwogCXVkZWxheSgxMCk7CiAKIAlmb3IgKG4gPSAwOyBuIDwgMjsgbisrKSB7CkBAIC0xNjcwLDI1ICsxNjU1LDM2IEBACiAJfQogCiAJLyogQ2xvc2UgSVFLIFNpbmdsZSBUb25lIGZ1bmN0aW9uICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9JUUssIGJNYXNrRFdvcmQsIDB4MDAwMDAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4MDAwMDAwMDApOwogCVBTRF9yZXBvcnRfdG1wID0gMHgwOwogCiAJLyogMSBSZXR1cm4gdG8gYW50YW5uYSBBICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCAweDMwMCwgQW50ZW5uYV9BKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIGJNYXNrRFdvcmQsIFJlZzg4Yyk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJPRkRNMF9UUk11eFBhciwgYk1hc2tEV29yZCwgUmVnYzA4KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCBiTWFza0RXb3JkLCBSZWc4NzQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByT0ZETTBfWEFBR0NDb3JlMSwgMHg3RiwgMHg0MCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJPRkRNMF9YQUFHQ0NvcmUxLCBiTWFza0RXb3JkLCBSZWdjNTApOwotCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzaywgQ3VycmVudENoYW5uZWwpOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSk7CisJdmFsMzIgJj0gfjB4MzAwOworCXZhbDMyIHw9IDB4MTAwOwkJLyogRW5hYmxlIGFudGVubmEgQSAqLworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCB2YWwzMik7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIFJlZzg4Yyk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1RSTXV4UGFyLCBSZWdjMDgpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgUmVnODc0KTsKKwl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEpOworCXZhbDMyICY9IH4weDdmOworCXZhbDMyIHw9IDB4NDA7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEsIHZhbDMyKTsKKworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJPRkRNMF9YQUFHQ0NvcmUxLCBSZWdjNTApOworCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzaywKKwkJICAgICBDdXJyZW50Q2hhbm5lbCk7CiAJT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwMCwgYlJGUmVnT2Zmc2V0TWFzaywgUmZMb29wUmVnKTsKIAogCS8qIFJlbG9hZCBBRkUgUmVnaXN0ZXJzICovCiAJb2RtX1BIWV9SZWxvYWRBRkVSZWdpc3RlcnMocERNX09kbSwgQUZFX1JFR184NzIzQSwgQUZFX0JhY2t1cCwgMTYpOwogCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJwc2RfcmVwb3J0X0FbJWRdPSAlZCBcbiIsIDI0MTYsIEFudEFfcmVwb3J0KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJwc2RfcmVwb3J0X0JbJWRdPSAlZCBcbiIsIDI0MTYsIEFudEJfcmVwb3J0KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJwc2RfcmVwb3J0X09bJWRdPSAlZCBcbiIsIDI0MTYsIEFudE9fcmVwb3J0KSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoInBzZF9yZXBvcnRfQVslZF09ICVkIFxuIiwgMjQxNiwgQW50QV9yZXBvcnQpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELAorCQkgICAgICgicHNkX3JlcG9ydF9CWyVkXT0gJWQgXG4iLCAyNDE2LCBBbnRCX3JlcG9ydCkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJwc2RfcmVwb3J0X09bJWRdPSAlZCBcbiIsIDI0MTYsIEFudE9fcmVwb3J0KSk7CiAKIAkvKiAyIFRlc3QgQW50IEIgYmFzZWQgb24gQW50IEEgaXMgT04gKi8KIAlpZiAobW9kZSA9PSBBTlRURVNUQikgewpAQCAtMTcxMCwzMCArMTcwNiwzMyBAQAogCQlpZiAoKEFudE9fcmVwb3J0ID49IDEwMCkgJiAoQW50T19yZXBvcnQgPCAxMTgpKSB7CiAJCQlpZiAoQW50QV9yZXBvcnQgPiAoQW50T19yZXBvcnQrMSkpIHsKIAkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQV9PTiA9IGZhbHNlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiQW50IEEgaXMgT0ZGIikpOworCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAorCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQSBpcyBPRkYiKSk7CiAJCQl9IGVsc2UgewogCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gdHJ1ZTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoIkFudCBBIGlzIE9OIikpOworCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAorCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQSBpcyBPTiIpKTsKIAkJCX0KIAogCQkJaWYgKEFudEJfcmVwb3J0ID4gKEFudE9fcmVwb3J0KzIpKSB7CiAJCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSBmYWxzZTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoIkFudCBCIGlzIE9GRiIpKTsKKwkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwKKwkJCQkJICAgICBPRE1fREJHX0xPVUQsICgiQW50IEIgaXMgT0ZGIikpOwogCQkJfSBlbHNlIHsKIAkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IHRydWU7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJBbnQgQiBpcyBPTiIpKTsKKwkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwKKwkJCQkJICAgICBPRE1fREJHX0xPVUQsICgiQW50IEIgaXMgT04iKSk7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoIk9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbigpOiBOZWVkIHRvIGNoZWNrIGFnYWluXG4iKSk7Ci0JCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gdHJ1ZTsgLyogIFNldCBBbnRlbm5hIEEgb24gYXMgZGVmYXVsdCAqLwotCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IGZhbHNlOyAvKiAgU2V0IEFudGVubmEgQiBvZmYgYXMgZGVmYXVsdCAqLworCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELAorCQkoIk9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbigpOiBOZWVkIHRvIGNoZWNrIGFnYWluXG4iKSk7CisJCS8qICBTZXQgQW50ZW5uYSBBIG9uIGFzIGRlZmF1bHQgKi8KKwkJcERNX1NXQVRfVGFibGUtPkFOVEFfT04gPSB0cnVlOworCQkvKiAgU2V0IEFudGVubmEgQiBvZmYgYXMgZGVmYXVsdCAqLworCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IGZhbHNlOwogCQliUmVzdWx0ID0gZmFsc2U7CiAJfQotCXJldHVybiBiUmVzdWx0OwotfQogCi0vKiBKdXN0aW46IEFjY29yZGluZyB0byB0aGUgY3VycmVudCBSUlNJIHRvIGFkanVzdCBSZXNwb25zZSBGcmFtZSBUWCBwb3dlciwgMjAxMi8xMS8wNSAqLwotdm9pZCBvZG1fZHRjKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKKwlyZXR1cm4gYlJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9IV0NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMKaW5kZXggMzNhYWZhMC4uN2I5Nzk5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMKQEAgLTMzLDI0ICszMywyMyBAQAogewogCXMzMiBSZXRTaWcgPSAwOwogCi0JaWYgKChwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlICA9PSBPRE1fSVRSRl9VU0IpIHx8IChwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlICA9PSBPRE1fSVRSRl9TRElPKSkgewotCQlpZiAoQ3VyclNpZyA+PSA1MSAmJiBDdXJyU2lnIDw9IDEwMCkKLQkJCVJldFNpZyA9IDEwMDsKLQkJZWxzZSBpZiAoQ3VyclNpZyA+PSA0MSAmJiBDdXJyU2lnIDw9IDUwKQotCQkJUmV0U2lnID0gODAgKyAoKEN1cnJTaWcgLSA0MCkqMik7Ci0JCWVsc2UgaWYgKEN1cnJTaWcgPj0gMzEgJiYgQ3VyclNpZyA8PSA0MCkKLQkJCVJldFNpZyA9IDY2ICsgKEN1cnJTaWcgLSAzMCk7Ci0JCWVsc2UgaWYgKEN1cnJTaWcgPj0gMjEgJiYgQ3VyclNpZyA8PSAzMCkKLQkJCVJldFNpZyA9IDU0ICsgKEN1cnJTaWcgLSAyMCk7Ci0JCWVsc2UgaWYgKEN1cnJTaWcgPj0gMTAgJiYgQ3VyclNpZyA8PSAyMCkKLQkJCVJldFNpZyA9IDQyICsgKCgoQ3VyclNpZyAtIDEwKSAqIDIpIC8gMyk7Ci0JCWVsc2UgaWYgKEN1cnJTaWcgPj0gNSAmJiBDdXJyU2lnIDw9IDkpCi0JCQlSZXRTaWcgPSAyMiArICgoKEN1cnJTaWcgLSA1KSAqIDMpIC8gMik7Ci0JCWVsc2UgaWYgKEN1cnJTaWcgPj0gMSAmJiBDdXJyU2lnIDw9IDQpCi0JCQlSZXRTaWcgPSA2ICsgKCgoQ3VyclNpZyAtIDEpICogMykgLyAyKTsKLQkJZWxzZQotCQkJUmV0U2lnID0gQ3VyclNpZzsKLQl9CisJaWYgKEN1cnJTaWcgPj0gNTEgJiYgQ3VyclNpZyA8PSAxMDApCisJCVJldFNpZyA9IDEwMDsKKwllbHNlIGlmIChDdXJyU2lnID49IDQxICYmIEN1cnJTaWcgPD0gNTApCisJCVJldFNpZyA9IDgwICsgKChDdXJyU2lnIC0gNDApKjIpOworCWVsc2UgaWYgKEN1cnJTaWcgPj0gMzEgJiYgQ3VyclNpZyA8PSA0MCkKKwkJUmV0U2lnID0gNjYgKyAoQ3VyclNpZyAtIDMwKTsKKwllbHNlIGlmIChDdXJyU2lnID49IDIxICYmIEN1cnJTaWcgPD0gMzApCisJCVJldFNpZyA9IDU0ICsgKEN1cnJTaWcgLSAyMCk7CisJZWxzZSBpZiAoQ3VyclNpZyA+PSAxMCAmJiBDdXJyU2lnIDw9IDIwKQorCQlSZXRTaWcgPSA0MiArICgoKEN1cnJTaWcgLSAxMCkgKiAyKSAvIDMpOworCWVsc2UgaWYgKEN1cnJTaWcgPj0gNSAmJiBDdXJyU2lnIDw9IDkpCisJCVJldFNpZyA9IDIyICsgKCgoQ3VyclNpZyAtIDUpICogMykgLyAyKTsKKwllbHNlIGlmIChDdXJyU2lnID49IDEgJiYgQ3VyclNpZyA8PSA0KQorCQlSZXRTaWcgPSA2ICsgKCgoQ3VyclNpZyAtIDEpICogMykgLyAyKTsKKwllbHNlCisJCVJldFNpZyA9IEN1cnJTaWc7CisKIAlyZXR1cm4gUmV0U2lnOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fUmVnQ29uZmlnODcyM0EuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9SZWdDb25maWc4NzIzQS5jCmluZGV4IDg4ZTAxMjYuLjM0MmRlYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9SZWdDb25maWc4NzIzQS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9SZWdDb25maWc4NzIzQS5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKKyNpbmNsdWRlICJ1c2Jfb3BzX2xpbnV4LmgiCiAKIHZvaWQKIG9kbV9Db25maWdSRlJlZ184NzIzQSgKQEAgLTQzLDYyICs0NCw0NSBAQAogCX0KIH0KIAotdm9pZCBvZG1fQ29uZmlnTUFDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1MzIJCUFkZHIsCi0JdTgJCURhdGEKLQkpCit2b2lkIG9kbV9Db25maWdNQUNfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgYWRkciwgdTgJZGF0YSkKIHsKLQlPRE1fV3JpdGUxQnl0ZShwRE1fT2RtLCBBZGRyLCBEYXRhKTsKKwlydGw4NzIzYXVfd3JpdGU4KHBETV9PZG0tPkFkYXB0ZXIsIGFkZHIsIGRhdGEpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9JTklULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCI9PT0+IE9ETV9Db25maWdNQUNXaXRoSGVhZGVyRmlsZTIzYTogW01BQ19SRUddICUwOFggJTA4WFxuIiwKLQkJICAgICBBZGRyLCBEYXRhKSk7CisJCSAgICAgKCI9PT0+ICVzOiBbTUFDX1JFR10gJTA4WCAlMDhYXG4iLCBfX2Z1bmNfXywgYWRkciwgZGF0YSkpOwogfQogCi12b2lkCi1vZG1fQ29uZmlnQkJfQUdDXzg3MjNBKAotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1MzIJCUFkZHIsCi0JdTMyCQlCaXRtYXNrLAotCXUzMgkJRGF0YQotICApCit2b2lkIG9kbV9Db25maWdCQl9BR0NfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgYWRkciwgdTMyIGRhdGEpCiB7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIEFkZHIsIEJpdG1hc2ssIERhdGEpOworCXJ0bDg3MjNhdV93cml0ZTMyKHBETV9PZG0tPkFkYXB0ZXIsIGFkZHIsIGRhdGEpOwogCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KIAl1ZGVsYXkoMSk7CiAKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiBPRE1fQ29uZmlnQkJXaXRoSGVhZGVyRmlsZTIzYTogW0FHQ19UQUJdICUwOFggJTA4WFxuIiwKLQkJICAgICBBZGRyLCBEYXRhKSk7CisJCSAgICAgKCI9PT0+ICVzOiBbQUdDX1RBQl0gJTA4WCAlMDhYXG4iLCBfX2Z1bmNfXywgYWRkciwgZGF0YSkpOwogfQogCiB2b2lkCi1vZG1fQ29uZmlnQkJfUEhZXzg3MjNBKAotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1MzIJCUFkZHIsCi0JdTMyCQlCaXRtYXNrLAotCXUzMgkJRGF0YQotICApCitvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKQogewotCWlmIChBZGRyID09IDB4ZmUpCisJaWYgKGFkZHIgPT0gMHhmZSkKIAkJbXNsZWVwKDUwKTsKLQllbHNlIGlmIChBZGRyID09IDB4ZmQpCisJZWxzZSBpZiAoYWRkciA9PSAweGZkKQogCQltZGVsYXkoNSk7Ci0JZWxzZSBpZiAoQWRkciA9PSAweGZjKQorCWVsc2UgaWYgKGFkZHIgPT0gMHhmYykKIAkJbWRlbGF5KDEpOwotCWVsc2UgaWYgKEFkZHIgPT0gMHhmYikKKwllbHNlIGlmIChhZGRyID09IDB4ZmIpCiAJCXVkZWxheSg1MCk7Ci0JZWxzZSBpZiAoQWRkciA9PSAweGZhKQorCWVsc2UgaWYgKGFkZHIgPT0gMHhmYSkKIAkJdWRlbGF5KDUpOwotCWVsc2UgaWYgKEFkZHIgPT0gMHhmOSkKKwllbHNlIGlmIChhZGRyID09IDB4ZjkpCiAJCXVkZWxheSgxKTsKLQllbHNlIGlmIChBZGRyID09IDB4YTI0KQotCQlwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uUmVnQTI0ID0gRGF0YTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgQWRkciwgQml0bWFzaywgRGF0YSk7CisJZWxzZSBpZiAoYWRkciA9PSAweGEyNCkKKwkJcERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLlJlZ0EyNCA9IGRhdGE7CisJcnRsODcyM2F1X3dyaXRlMzIocERNX09kbS0+QWRhcHRlciwgYWRkciwgZGF0YSk7CiAKIAkvKiAgQWRkIDF1cyBkZWxheSBiZXR3ZWVuIEJCL1JGIHJlZ2lzdGVyIHNldHRpbmcuICovCiAJdWRlbGF5KDEpOwogCiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0lOSVQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIj09PT4gT0RNX0NvbmZpZ0JCV2l0aEhlYWRlckZpbGUyM2E6IFtQSFlfUkVHXSAlMDhYICUwOFhcbiIsCi0JCSAgICAgQWRkciwgRGF0YSkpOworCQkgICAgICgiPT09PiAlczogW1BIWV9SRUddICUwOFggJTA4WFxuIiwgX19mdW5jX18sIGFkZHIsIGRhdGEpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMKaW5kZXggYzkxMmFiOC4uY2IyYmRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMKQEAgLTIyLDMgKzIyLDE4IEBACiB9CiAKIHUzMiBHbG9iYWxEZWJ1Z0xldmVsMjNBOworCit2b2lkIHJ0X3RyYWNlKGludCBjb21wLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJfaW5mbyhEUklWRVJfUFJFRklYICIgWzB4JTA4eCwlZF0gJXBWIiwgY29tcCwgbGV2ZWwsICZ2YWYpOworCisJdmFfZW5kKGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2ludGVyZmFjZS5jCmluZGV4IGYwM2Y2ZDRhLi5kOGY2NzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1faW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2ludGVyZmFjZS5jCkBAIC0yMyw5NiArMjMsNiBAQAogLyogICovCiAjaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgogCi11OCBPRE1fUmVhZDFCeXRlKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1MzIJCQlSZWdBZGRyCi0JKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlyZXR1cm4gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJlZ0FkZHIpOwotfQotCi11MTYgT0RNX1JlYWQyQnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlyZXR1cm4gcnRsODcyM2F1X3JlYWQxNihBZGFwdGVyLCBSZWdBZGRyKTsKLX0KLQotdTMyIE9ETV9SZWFkNEJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkcikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCi0JcmV0dXJuIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUmVnQWRkcik7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlMUJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTggRGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSZWdBZGRyLCBEYXRhKTsKLX0KLQotdm9pZCBPRE1fV3JpdGUyQnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MTYgRGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUmVnQWRkciwgRGF0YSk7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlNEJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTMyIERhdGEpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJlZ0FkZHIsIERhdGEpOwotfQotCi12b2lkIE9ETV9TZXRNQUNSZWcoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJUmVnQWRkciwKLQl1MzIJCUJpdE1hc2ssCi0JdTMyCQlEYXRhCi0JKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgUmVnQWRkciwgQml0TWFzaywgRGF0YSk7Ci19Ci0KLXUzMiBPRE1fR2V0TUFDUmVnKAotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1MzIJCVJlZ0FkZHIsCi0JdTMyCQlCaXRNYXNrCi0JKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlyZXR1cm4gUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgUmVnQWRkciwgQml0TWFzayk7Ci19Ci0KLXZvaWQgT0RNX1NldEJCUmVnKAotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1MzIJCVJlZ0FkZHIsCi0JdTMyCQlCaXRNYXNrLAotCXUzMgkJRGF0YQotCSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFJlZ0FkZHIsIEJpdE1hc2ssIERhdGEpOwotfQotCi11MzIgT0RNX0dldEJCUmVnKAotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1MzIJCVJlZ0FkZHIsCi0JdTMyCQlCaXRNYXNrCi0JKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlyZXR1cm4gUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgUmVnQWRkciwgQml0TWFzayk7Ci19Ci0KIHZvaWQgT0RNX1NldFJGUmVnKAogCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKIAllbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2J0LWNvZXhpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2J0LWNvZXhpc3QuYwppbmRleCA3M2NmZGRkLi5jZjE1ZjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9idC1jb2V4aXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfYnQtY29leGlzdC5jCkBAIC0xNTU0LDcgKzE1NTQsOCBAQAogCQlwQnRTZWMtPmJVc2VkSHdFbmNyeXB0ID0gdHJ1ZTsKIAllbHNlCiAJCXBCdFNlYy0+YlVzZWRId0VuY3J5cHQgPSBmYWxzZTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfaW5mb18sICgiJXM6IGJVc2VkSHdFbmNyeXB0ID0lZFxuIiwgX19mdW5jX18sIHBCdFNlYy0+YlVzZWRId0VuY3J5cHQpKTsKKwlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfaW5mb18sCisJCSAiJXM6IGJVc2VkSHdFbmNyeXB0ID0lZFxuIiwgX19mdW5jX18sIHBCdFNlYy0+YlVzZWRId0VuY3J5cHQpOwogCiAJcEJ0U2VjLT5SU05JRS5PY3RldCA9IHBCdFNlYy0+UlNOSUVCdWY7CiB9CkBAIC0zMjA4LDcgKzMyMDksNyBAQAogCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnREaXNjb25uZWN0UGh5TGluaysrOwogCiAJUExIID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlQaHlzTGlua0Rpc2Nvbm5lY3RSZWFzb24gPSAoKigodTggKilwSGNpQ21kLT5EYXRhKzEpKTsKKwlQaHlzTGlua0Rpc2Nvbm5lY3RSZWFzb24gPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGErMSk7CiAJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LICBQaHlIYW5kbGUgPSAweCV4LCBSZWFzb24gPSAweCV4XG4iLAogCQlQTEgsIFBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbikpOwogCkBAIC00NTE4LDggKzQ1MTksOCBAQAogCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19DT05ORUNUX0NPTVBMRVRFXG4iKSk7CiAKIAkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0pPSU5FUikgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLAotCQkJCSBfZHJ2X2luZm9fLCAoIlN0YXRlQ29ubmVjdGluZyBcbiIpKTsKKwkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9pbmZvXywKKwkJCQkgIlN0YXRlQ29ubmVjdGluZ1xuIik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSzoKQEAgLTU3OTYsNyArNTc5Nyw3IEBACiBidGRtXzFBbnRVcGRhdGVIYWxSQU1hc2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hY19pZCwgdTMyIGZpbHRlcikKIHsKIAl1OCBpbml0X3JhdGUgPSAwOwotCXU4IHJhaWQ7CisJdTggcmFpZCwgYXJnOwogCXUzMiBtYXNrOwogCXU4IHNob3J0R0lyYXRlID0gZmFsc2U7CiAJaW50IHN1cHBvcnRSYXRlTnVtID0gMDsKQEAgLTU4NjAsMjYgKzU4NjEsMTYgQEAKIAltYXNrICY9IH5maWx0ZXI7CiAJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EobWFzaykmMHgzZjsKIAotCWlmIChwSGFsRGF0YS0+ZndfcmFjdHJsKSB7Ci0JCXU4IGFyZyA9IDA7CisJYXJnID0gbWFjX2lkJjB4MWY7LyogTUFDSUQgKi8KKwlhcmcgfD0gQklUKDcpOworCWlmICh0cnVlID09IHNob3J0R0lyYXRlKQorCQlhcmcgfD0gQklUKDUpOwogCi0JCWFyZyA9IG1hY19pZCYweDFmOy8qIE1BQ0lEICovCi0JCWFyZyB8PSBCSVQoNyk7Ci0JCWlmICh0cnVlID09IHNob3J0R0lyYXRlKQotCQkJYXJnIHw9IEJJVCg1KTsKKwlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCisJCSgiW0JUQ29leF0sIFVwZGF0ZSBGVyBSQUlEIGVudHJ5LCBNQVNLID0gMHglMDh4LCAiCisJCSAiYXJnID0gMHglMDJ4XG4iLCBtYXNrLCBhcmcpKTsKIAotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkoIltCVENvZXhdLCBVcGRhdGUgRlcgUkFJRCBlbnRyeSwgTUFTSyA9IDB4JTA4eCwgIgotCQkJICJhcmcgPSAweCUwMnhcbiIsIG1hc2ssIGFyZykpOwotCi0JCXJ0bDg3MjNhX3NldF9yYWlkX2NtZChwYWRhcHRlciwgbWFzaywgYXJnKTsKLQl9IGVsc2UgewotCQlpZiAoc2hvcnRHSXJhdGUpCi0JCQlpbml0X3JhdGUgfD0gQklUKDYpOwotCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19JTklEQVRBX1JBVEVfU0VMICsgbWFjX2lkLAotCQkJCSBpbml0X3JhdGUpOwotCX0KKwlydGw4NzIzYV9zZXRfcmFpZF9jbWQocGFkYXB0ZXIsIG1hc2ssIGFyZyk7CiAKIAlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7CiAJcGRtcHJpdi0+SU5JREFUQV9SQVRFW21hY19pZF0gPSBpbml0X3JhdGU7CkBAIC0xMTIwNiwxNSArMTExOTcsMTcgQEAKIAlwSGFsRGF0YS0+YnRfY29leGlzdC5idF9yYWRpb3NoYXJlZHR5cGUgPSBwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoUmFkaW9TaGFyZWQ7CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJCVCBDb2V4aXN0YW5jZSA9IDB4JXhcbiIsIHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKSk7CisJCSAiQlQgQ29leGlzdGFuY2UgPSAweCV4XG4iLCBydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSk7CiAKIAlpZiAocnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpIHsKIAkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gPT0gQW50X3gyKSB7CiAJCQlCVERNX1NldEJ0Q29leEN1cnJBbnROdW0ocGFkYXB0ZXIsIDIpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCJCbHVlVG9vdGggQlRfQW50X051bSA9IEFudHgyXG4iKSk7CisJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAorCQkJCSAiQmx1ZVRvb3RoIEJUX0FudF9OdW0gPSBBbnR4MlxuIik7CiAJCX0gZWxzZSBpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDEpIHsKIAkJCUJURE1fU2V0QnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgMSk7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIkJsdWVUb290aCBCVF9BbnRfTnVtID0gQW50eDFcbiIpKTsKKwkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCisJCQkJICJCbHVlVG9vdGggQlRfQW50X051bSA9IEFudHgxXG4iKTsKIAkJfQogCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iQlRCdXN5VHJhZmZpYyA9IGZhbHNlOwogCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iQlRUcmFmZmljTW9kZVNldCA9IGZhbHNlOwpAQCAtMTEyMjMsOCArMTEyMTYsOCBAQAogCQlwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlID0gMDsKIAogCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiYnRfcmFkaW9zaGFyZWRUeXBlID0gMHgleFxuIiwKLQkJCSBwSGFsRGF0YS0+YnRfY29leGlzdC5idF9yYWRpb3NoYXJlZHR5cGUpKTsKKwkJCSAiYnRfcmFkaW9zaGFyZWRUeXBlID0gMHgleFxuIiwKKwkJCSBwSGFsRGF0YS0+YnRfY29leGlzdC5idF9yYWRpb3NoYXJlZHR5cGUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYwppbmRleCA3YjU2NDExLi4xMWUxMTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYwpAQCAtMTQyLDMyICsxNDIsMTggQEAKIC8qIGFyZ1s1XSA9IFNob3J0IEdJICovCiB2b2lkIHJ0bDg3MjNhX2FkZF9yYXRlYXRpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgYml0bWFwLCB1OCBhcmcsIHU4IHJzc2lfbGV2ZWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0JdTggbWFjaWQgPSBhcmcmMHgxZjsKLQl1OCByYWlkID0gKGJpdG1hcD4+MjgpICYgMHgwZjsKKwlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKKwl1OCBtYWNpZCA9IGFyZyAmIDB4MWY7CisJdTMyIHJhaWQgPSBiaXRtYXAgJiAweGYwMDAwMDAwOwogCiAJYml0bWFwICY9IDB4MGZmZmZmZmY7CiAJaWYgKHJzc2lfbGV2ZWwgIT0gRE1fUkFUUl9TVEFfSU5JVCkKIAkJYml0bWFwID0gT0RNX0dldF9SYXRlX0JpdG1hcDIzYShwSGFsRGF0YSwgbWFjaWQsIGJpdG1hcCwKIAkJCQkJCXJzc2lfbGV2ZWwpOwogCi0JYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOworCWJpdG1hcCB8PSByYWlkOwogCi0JaWYgKHBIYWxEYXRhLT5md19yYWN0cmwgPT0gdHJ1ZSkgewotCQlydGw4NzIzYV9zZXRfcmFpZF9jbWQocEFkYXB0ZXIsIGJpdG1hcCwgYXJnKTsKLQl9IGVsc2UgewotCQl1OCBpbml0X3JhdGUsIHNob3J0R0lyYXRlID0gZmFsc2U7Ci0KLQkJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EoYml0bWFwJjB4MGZmZmZmZmYpJjB4M2Y7Ci0KLQkJc2hvcnRHSXJhdGUgPSAoYXJnJkJJVCg1KSkgPyB0cnVlOmZhbHNlOwotCi0JCWlmIChzaG9ydEdJcmF0ZSA9PSB0cnVlKQotCQkJaW5pdF9yYXRlIHw9IEJJVCg2KTsKLQotCQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBSRUdfSU5JREFUQV9SQVRFX1NFTCArIG1hY2lkLAotCQkJCSBpbml0X3JhdGUpOwotCX0KKwlydGw4NzIzYV9zZXRfcmFpZF9jbWQocEFkYXB0ZXIsIGJpdG1hcCwgYXJnKTsKIH0KIAogdm9pZCBydGw4NzIzYV9zZXRfRndQd3JNb2RlX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBNb2RlKQpAQCAtMTgzLDEwICsxNjksOCBAQAogCSAgICBwcmV2ZW50IGNvbmZpY3Rpbmcgc2V0dGluZyBpbiBGdyBwb3dlciAqLwogCS8qICBzYXZpbmcgc2VxdWVuY2UuIDIwMTAuMDYuMDcuIEFkZGVkIGJ5IHR5bmxpLgogCSAgICBTdWdnZXN0ZWQgYnkgU0QzIHlzY2hhbmcuICovCi0JaWYgKChNb2RlICE9IFBTX01PREVfQUNUSVZFKSAmJgotCSAgICAoIUlTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCkpKSB7CisJaWYgKE1vZGUgIT0gUFNfTU9ERV9BQ1RJVkUgJiYgcEhhbERhdGEtPnJmX3R5cGUgIT0gUkZfMlQyUikKIAkJT0RNX1JGX1NhdmluZzIzYSgmcEhhbERhdGEtPm9kbXByaXYsIHRydWUpOwotCX0KIAogCUgyQ1NldFB3ck1vZGUuTW9kZSA9IE1vZGU7CiAJSDJDU2V0UHdyTW9kZS5TbWFydFBTID0gcHdycHJpdi0+c21hcnRfcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfZG0uYwppbmRleCBmYTgyNmIwLi4xZTgzMWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2RtLmMKQEAgLTk0LDggKzk0LDYgQEAKIAltZW1zZXQocERNX09kbSwgMCwgc2l6ZW9mKCpwRE1fT2RtKSk7CiAKIAlwRE1fT2RtLT5BZGFwdGVyID0gQWRhcHRlcjsKLQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fUExBVEZPUk0sIDB4MDQpOwotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19JTlRFUkZBQ0UsIFJUV19VU0IpOy8qIFJUTDg3MVhfSENJX1RZUEUgKi8KIAogCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19JQ19UWVBFLCBPRE1fUlRMODcyM0EpOwogCkBAIC0xMTksMTUgKzExNyw3IEBACiAJCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19FWFRfTE5BLCB0cnVlKTsKIAkJT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0VYVF9QQSwgdHJ1ZSk7CiAJfQotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19QQVRDSF9JRCwgcEhhbERhdGEtPkN1c3RvbWVySUQpOwogCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19CV0lGSV9URVNULCBBZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKTsKLQotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKQotCQlPRE1fQ21uSW5mb1VwZGF0ZTIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19SRl9UWVBFLCBPRE1fMVQxUik7Ci0JZWxzZSBpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKLQkJT0RNX0NtbkluZm9VcGRhdGUyM2EocERNX09kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzJUMlIpOwotCWVsc2UgaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMlIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlMjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX1JGX1RZUEUsIE9ETV8xVDJSKTsKIH0KIAogc3RhdGljIHZvaWQgVXBkYXRlX09ETV9Db21JbmZvXzg3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKQEAgLTEzNiwxNiArMTI2LDcgQEAKIAlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7CiAJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKIAlpbnQgaTsKLQlwZG1wcml2LT5Jbml0T0RNRmxhZyA9CU9ETV9CQl9ESUcJCXwKLQkJCQlPRE1fQkJfUkFfTUFTSwkJfAotCQkJCU9ETV9CQl9EWU5BTUlDX1RYUFdSCXwKLQkJCQlPRE1fQkJfRkFfQ05UCQl8Ci0JCQkJT0RNX0JCX1JTU0lfTU9OSVRPUgl8Ci0JCQkJT0RNX0JCX0NDS19QRAkJfAotCQkJCU9ETV9CQl9QV1JfU0FWRQkJfAotCQkJCU9ETV9NQUNfRURDQV9UVVJCTwl8Ci0JCQkJT0RNX1JGX1RYX1BXUl9UUkFDSwl8Ci0JCQkJT0RNX1JGX0NBTElCUkFUSU9OOworCXBkbXByaXYtPkluaXRPRE1GbGFnID0gMDsKIAkvKiAgUG9pbnRlciByZWZlcmVuY2UgKi8KIAlydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3NldChBZGFwdGVyLCBEWU5BTUlDX0FMTF9GVU5DX0VOQUJMRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2hhbF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9oYWxfaW5pdC5jCmluZGV4IGE1ZWFkZDQuLjA0ZDAxODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2hhbF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfaGFsX2luaXQuYwpAQCAtOTUsNyArOTUsNyBAQAogCQkJZ290byBleGl0OwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJfV3JpdGVGVyBEb25lLSBmb3IgTm9ybWFsIGNoaXAuXG4iKSk7CisJCSAiX1dyaXRlRlcgRG9uZS0gZm9yIE5vcm1hbCBjaGlwLlxuIik7CiAKIGV4aXQ6CiAJcmV0dXJuIHJldDsKQEAgLTExNSwxMyArMTE1LDEzIEBACiAKIAlpZiAoY291bnRlciA+PSBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IGNoa3N1bSByZXBvcnQgZmFpbCEgUkVHX01DVUZXREw6MHglMDh4XG4iLAotCQkJICBfX2Z1bmNfXywgdmFsdWUzMikpOworCQkJICIlczogY2hrc3VtIHJlcG9ydCBmYWlsISBSRUdfTUNVRldETDoweCUwOHhcbiIsCisJCQkgX19mdW5jX18sIHZhbHVlMzIpOwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOiBDaGVja3N1bSByZXBvcnQgT0shIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwgX19mdW5jX18sCi0JCSAgdmFsdWUzMikpOworCQkgIiVzOiBDaGVja3N1bSByZXBvcnQgT0shIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwgX19mdW5jX18sCisJCSB2YWx1ZTMyKTsKIAogCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfTUNVRldETCk7CiAJdmFsdWUzMiB8PSBNQ1VGV0RMX1JEWTsKQEAgLTEzNCwxNyArMTM0LDE2IEBACiAJCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfTUNVRldETCk7CiAJCWlmICh2YWx1ZTMyICYgV0lOVElOSV9SRFkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiJXM6IFBvbGxpbmcgRlcgcmVhZHkgc3VjY2VzcyEhICIKLQkJCQkgICJSRUdfTUNVRldETDoweCUwOHhcbiIsCi0JCQkJICBfX2Z1bmNfXywgdmFsdWUzMikpOworCQkJCSAiJXM6IFBvbGxpbmcgRlcgcmVhZHkgc3VjY2VzcyEhIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwKKwkJCQkgX19mdW5jX18sIHZhbHVlMzIpOwogCQkJcmV0dXJuIF9TVUNDRVNTOwogCQl9CiAJCXVkZWxheSg1KTsKIAl9IHdoaWxlIChjb3VudGVyKysgPCBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkgKCIlczogUG9sbGluZyBGVyByZWFkeSBmYWlsISEgUkVHX01DVUZXREw6MHglMDh4XG4iLAotCQkgIF9fZnVuY19fLCB2YWx1ZTMyKSk7CisJCSAiJXM6IFBvbGxpbmcgRlcgcmVhZHkgZmFpbCEhIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwKKwkJIF9fZnVuY19fLCB2YWx1ZTMyKTsKIAlyZXR1cm4gX0ZBSUw7CiB9CiAKQEAgLTE3Myw4ICsxNzIsOCBAQAogCQkJdTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxKTsKIAkJfQogCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiLSVzOiA4MDUxIHJlc2V0IHN1Y2Nlc3MgKCVkKVxuIiwgX19mdW5jX18sCi0JCQkgIERlbGF5KSk7CisJCQkgIi0lczogODA1MSByZXNldCBzdWNjZXNzICglZClcbiIsIF9fZnVuY19fLAorCQkJIERlbGF5KTsKIAogCQlpZiAoKERlbGF5ID09IDApKSB7CiAJCQkvKiBmb3JjZSBmaXJtd2FyZSByZXNldCAqLwpAQCAtMjA2LDEzICsyMDUsMTIgQEAKIAlpbnQgZndfc2l6ZTsKIAlzdGF0aWMgaW50IGxvZ192ZXJzaW9uOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCIrJXNcbiIsIF9fZnVuY19fKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgIislc1xuIiwgX19mdW5jX18pOwogCiAJaWYgKElTXzg3MjNBX0FfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7CiAJCWZ3X25hbWUgPSAicnRsd2lmaS9ydGw4NzIzYXVmd19BLmJpbiI7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJydGw4NzIzYV9GaXJtd2FyZURvd25sb2FkOiBSODcyM0Z3SW1hZ2VBcnJheV9VTUMgIgotCQkJICAiZm9yIFJUTDg3MjNBIEEgQ1VUXG4iKSk7CisJCQkgInJ0bDg3MjNhX0Zpcm13YXJlRG93bmxvYWQ6IFI4NzIzRndJbWFnZUFycmF5X1VNQyBmb3IgUlRMODcyM0EgQSBDVVRcbiIpOwogCX0gZWxzZSBpZiAoSVNfODcyM0FfQl9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKIAkJLyogIFdMQU4gRncuICovCiAJCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYyA9PSAxKSB7CkBAIC0yMzQsNyArMjMyLDcgQEAKIAkJLyogIDxSb2dlcl9UT0RPPiBXZSBzaG91bGQgZG93bmxvYWQgcHJvcGVyIFJBTSBDb2RlIGhlcmUKIAkJICAgIHRvIG1hdGNoIHRoZSBST00gY29kZS4gKi8KIAkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IHVua25vdyB2ZXJzaW9uIVxuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6IHVua25vd24gdmVyc2lvbiFcbiIsIF9fZnVuY19fKTsKIAkJcnRTdGF0dXMgPSBfRkFJTDsKIAkJZ290byBFeGl0OwogCX0KQEAgLTMxOSwxMSArMzE3LDExIEBACiAJcnRTdGF0dXMgPSBfRldGcmVlVG9HbyhwYWRhcHRlcik7CiAJaWYgKF9TVUNDRVNTICE9IHJ0U3RhdHVzKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAoIkRMIEZpcm13YXJlIGZhaWxlZCFcbiIpKTsKKwkJCSAiREwgRmlybXdhcmUgZmFpbGVkIVxuIik7CiAJCWdvdG8gRXhpdDsKIAl9CiAJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiRmlybXdhcmUgaXMgcmVhZHkgdG8gcnVuIVxuIikpOworCQkgIkZpcm13YXJlIGlzIHJlYWR5IHRvIHJ1biFcbiIpOwogCiBFeGl0OgogCWtmcmVlKGZpcm13YXJlX2J1Zik7CkBAIC00MjQsMTUgKzQyMiwxNCBAQAogCQkJb2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlSGVhZGVyKTsKIAogCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLCAmZWZ1c2VFeHRIZHIpOwotCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZUV4dEhkcikpIHsKKwkJCWlmIChBTExfV09SRFNfRElTQUJMRUQoZWZ1c2VFeHRIZHIpKQogCQkJCWNvbnRpbnVlOwotCQkJfQogCiAJCQlvZmZzZXQgfD0gKChlZnVzZUV4dEhkciAmIDB4RjApID4+IDEpOwotCQkJd2RlbiA9IChlZnVzZUV4dEhkciAmIDB4MEYpOworCQkJd2RlbiA9IGVmdXNlRXh0SGRyICYgMHgwRjsKIAkJfSBlbHNlIHsKLQkJCW9mZnNldCA9ICgoZWZ1c2VIZWFkZXIgPj4gNCkgJiAweDBmKTsKLQkJCXdkZW4gPSAoZWZ1c2VIZWFkZXIgJiAweDBmKTsKKwkJCW9mZnNldCA9IChlZnVzZUhlYWRlciA+PiA0KSAmIDB4MGY7CisJCQl3ZGVuID0gZWZ1c2VIZWFkZXIgJiAweDBmOwogCQl9CiAKIAkJaWYgKG9mZnNldCA8IEVGVVNFX01BWF9TRUNUSU9OXzg3MjNBKSB7CkBAIC01MjQsMTUgKzUyMSwxNCBAQAogCiAJCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLAogCQkJCQkgICAgICAmZWZ1c2VFeHRIZHIpOwotCQkJCWlmIChBTExfV09SRFNfRElTQUJMRUQoZWZ1c2VFeHRIZHIpKSB7CisJCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZUV4dEhkcikpCiAJCQkJCWNvbnRpbnVlOwotCQkJCX0KIAogCQkJCW9mZnNldCB8PSAoKGVmdXNlRXh0SGRyICYgMHhGMCkgPj4gMSk7Ci0JCQkJd2RlbiA9IChlZnVzZUV4dEhkciAmIDB4MEYpOworCQkJCXdkZW4gPSBlZnVzZUV4dEhkciAmIDB4MEY7CiAJCQl9IGVsc2UgewotCQkJCW9mZnNldCA9ICgoZWZ1c2VIZWFkZXIgPj4gNCkgJiAweDBmKTsKLQkJCQl3ZGVuID0gKGVmdXNlSGVhZGVyICYgMHgwZik7CisJCQkJb2Zmc2V0ID0gKGVmdXNlSGVhZGVyID4+IDQpICYgMHgwZjsKKwkJCQl3ZGVuID0gZWZ1c2VIZWFkZXIgJiAweDBmOwogCQkJfQogCiAJCQlpZiAob2Zmc2V0IDwgRUZVU0VfQlRfTUFYX1NFQ1RJT04pIHsKQEAgLTYzMCw5ICs2MjYsOCBAQAogCQkJaG9mZnNldCA9IEdFVF9IRFJfT0ZGU0VUXzJfMChlZnVzZV9kYXRhKTsKIAkJCWVmdXNlX2FkZHIrKzsKIAkJCWVmdXNlX09uZUJ5dGVSZWFkMjNhKHBhZGFwdGVyLCBlZnVzZV9hZGRyLCAmZWZ1c2VfZGF0YSk7Ci0JCQlpZiAoQUxMX1dPUkRTX0RJU0FCTEVEKGVmdXNlX2RhdGEpKSB7CisJCQlpZiAoQUxMX1dPUkRTX0RJU0FCTEVEKGVmdXNlX2RhdGEpKQogCQkJCWNvbnRpbnVlOwotCQkJfQogCiAJCQlob2Zmc2V0IHw9ICgoZWZ1c2VfZGF0YSAmIDB4RjApID4+IDEpOwogCQkJaHdvcmRlbiA9IGVmdXNlX2RhdGEgJiAweDBGOwpAQCAtNzIxLDkgKzcxNiw4IEBACiAJCX0KIAogCQkvKiAgQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGVjayBuZXh0IGJhbmsgZWZ1c2UgKi8KLQkJaWYgKGVmdXNlX2FkZHIgPCByZXRVMikgeworCQlpZiAoZWZ1c2VfYWRkciA8IHJldFUyKQogCQkJYnJlYWs7CS8qICBkb24ndCBuZWVkIHRvIGNoZWNrIG5leHQgYmFuay4gKi8KLQkJfQogCX0KIAogCXJldFUyID0gKChiYW5rIC0gMSkgKiBFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4pICsgZWZ1c2VfYWRkcjsKQEAgLTc0NCw3ICs3MzgsNyBAQAogCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfU1lTX0NGRyk7CiAJQ2hpcFZlcnNpb24uSUNUeXBlID0gQ0hJUF84NzIzQTsKIAlDaGlwVmVyc2lvbi5DaGlwVHlwZSA9ICgodmFsdWUzMiAmIFJUTF9JRCkgPyBURVNUX0NISVAgOiBOT1JNQUxfQ0hJUCk7Ci0JQ2hpcFZlcnNpb24uUkZUeXBlID0gUkZfVFlQRV8xVDFSOworCXBIYWxEYXRhLT5yZl90eXBlID0gUkZfMVQxUjsKIAlDaGlwVmVyc2lvbi5WZW5kb3JUeXBlID0KIAkJKCh2YWx1ZTMyICYgVkVORE9SX0lEKSA/IENISVBfVkVORE9SX1VNQyA6IENISVBfVkVORE9SX1RTTUMpOwogCUNoaXBWZXJzaW9uLkNVVFZlcnNpb24gPSAodmFsdWUzMiAmIENISVBfVkVSX1JUTF9NQVNLKSA+PiBDSElQX1ZFUl9SVExfU0hJRlQ7CS8qICBJQyB2ZXJzaW9uIChDVVQpICovCkBAIC03NTUsNyArNzQ5LDcgQEAKIAogCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfR1BJT19PVVRTVFMpOwogCS8qICBST00gY29kZSB2ZXJzaW9uLiAqLwotCUNoaXBWZXJzaW9uLlJPTVZlciA9ICgodmFsdWUzMiAmIFJGX1JMX0lEKSA+PiAyMCk7CisJQ2hpcFZlcnNpb24uUk9NVmVyID0gKHZhbHVlMzIgJiBSRl9STF9JRCkgPj4gMjA7CiAKIAkvKiAgRm9yIG11bHRpLWZ1bmN0aW9uIGNvbnNpZGVyYXRpb24uIEFkZGVkIGJ5IFJvZ2VyLCAyMDEwLjEwLjA2LiAqLwogCXBIYWxEYXRhLT5NdWx0aUZ1bmMgPSBSVF9NVUxUSV9GVU5DX05PTkU7CkBAIC03NjgsMTYgKzc2Miw4IEBACiAJcEhhbERhdGEtPlBvbGFyaXR5Q3RsID0KIAkJKCh2YWx1ZTMyICYgV0xfSFdQRE5fU0wpID8gUlRfUE9MQVJJVFlfSElHSF9BQ1QgOgogCQkgUlRfUE9MQVJJVFlfTE9XX0FDVCk7Ci0JZHVtcF9jaGlwX2luZm8yM2EoQ2hpcFZlcnNpb24pOwogCXBIYWxEYXRhLT5WZXJzaW9uSUQgPSBDaGlwVmVyc2lvbjsKIAotCWlmIChJU18xVDJSKENoaXBWZXJzaW9uKSkKLQkJcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDJSOwotCWVsc2UgaWYgKElTXzJUMlIoQ2hpcFZlcnNpb24pKQotCQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzJUMlI7Ci0JZWxzZQotCQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMVI7Ci0KIAlNU0dfODcyM0EoIlJGX1R5cGUgaXMgJXghIVxuIiwgcEhhbERhdGEtPnJmX3R5cGUpOwogfQogCkBAIC04MzEsNyArODE3LDcgQEAKIAkgICAgd2UgcmVjb3JkIHRoZSB2YWx1ZSAqLwogCS8qICB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIHJlZ2lzdGVyIHRvIGEgZ2xvYmFsIHZhcmlhYmxlLiAqLwogCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiK1Jlc3VtZVR4QmVhY29uXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICIrUmVzdW1lVHhCZWFjb25cbiIpOwogCiAJcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsIHw9IEJJVCg2KTsKIAlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCArIDIsCkBAIC04NDksNyArODM1LDcgQEAKIAkgICAgd2UgcmVjb3JkIHRoZSB2YWx1ZSAqLwogCS8qICB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIHJlZ2lzdGVyIHRvIGEgZ2xvYmFsIHZhcmlhYmxlLiAqLwogCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiK1N0b3BUeEJlYWNvblxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiK1N0b3BUeEJlYWNvblxuIik7CiAKIAlwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJj0gfkJJVCg2KTsKIAlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCArIDIsCkBAIC05OTUsNyArOTgxLDcgQEAKIAlzd2l0Y2ggKGMyaF9ldnQtPmlkKSB7CiAJY2FzZSBDMkhfREJHOgogCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiQzJIQ29tbWFuZEhhbmRsZXI6ICVzXG4iLCBjMmhfZXZ0LT5wYXlsb2FkKSk7CisJCQkgIkMySENvbW1hbmRIYW5kbGVyOiAlc1xuIiwgYzJoX2V2dC0+cGF5bG9hZCk7CiAJCWJyZWFrOwogCiAJY2FzZSBDMkhfQ0NYX1RYX1JQVDoKQEAgLTEwMDUsMjIgKzk5MSwyMiBAQAogCQlicmVhazsKIAljYXNlIEMySF9IV19JTkZPX0VYQ0g6CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJbQlRdLCBDMkhfSFdfSU5GT19FWENIXG4iKSk7CisJCQkgIltCVF0sIEMySF9IV19JTkZPX0VYQ0hcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgYzJoX2V2dC0+cGxlbjsgaSsrKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIltCVF0sIHRtcEJ1ZlslZF09IDB4JXhcbiIsIGksCi0JCQkJICBjMmhfZXZ0LT5wYXlsb2FkW2ldKSk7CisJCQkJICJbQlRdLCB0bXBCdWZbJWRdPSAweCV4XG4iLCBpLAorCQkJCSBjMmhfZXZ0LT5wYXlsb2FkW2ldKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQzJIX0MySF9IMkNfVEVTVDoKIAkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIltCVF0sIEMySF9IMkNfVEVTVFxuIikpOworCQkJICJbQlRdLCBDMkhfSDJDX1RFU1RcbiIpOwogCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiW0JUXSwgdG1wQnVmWzBdL1sxXS9bMl0vWzNdL1s0XT0gMHgleC8gMHgleC8gIgotCQkJICAiMHgleC8gMHgleC8gMHgleFxuIiwgYzJoX2V2dC0+cGF5bG9hZFswXSwKLQkJCSAgYzJoX2V2dC0+cGF5bG9hZFsxXSwgYzJoX2V2dC0+cGF5bG9hZFsyXSwKLQkJCSAgYzJoX2V2dC0+cGF5bG9hZFszXSwgYzJoX2V2dC0+cGF5bG9hZFs0XSkpOworCQkJICJbQlRdLCB0bXBCdWZbMF0vWzFdL1syXS9bM10vWzRdPSAweCV4LyAweCV4LyAweCV4LyAweCV4LyAweCV4XG4iLAorCQkJIGMyaF9ldnQtPnBheWxvYWRbMF0sCisJCQkgYzJoX2V2dC0+cGF5bG9hZFsxXSwgYzJoX2V2dC0+cGF5bG9hZFsyXSwKKwkJCSBjMmhfZXZ0LT5wYXlsb2FkWzNdLCBjMmhfZXZ0LT5wYXlsb2FkWzRdKTsKIAkJYnJlYWs7CiAKIAljYXNlIEMySF9CVF9JTkZPOgpAQCAtMTA5NSw3ICsxMDgxLDYgQEAKIAlwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7CiAKIAkvKiAgaW5pdCBkZWZhdWx0IHZhbHVlICovCi0JcEhhbERhdGEtPmZ3X3JhY3RybCA9IGZhbHNlOwogCXBIYWxEYXRhLT5iSVFLSW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAlpZiAoIXBhZGFwdGVyLT5wd3JjdHJscHJpdi5ia2VlcGZ3YWxpdmUpCiAJCXBIYWxEYXRhLT5MYXN0SE1FQm94TnVtID0gMDsKQEAgLTExNDksMTQgKzExMzQsMTMgQEAKIAkvKiBwb2xsaW5nICovCiAJZG8gewogCQl2YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIExMVFJlZyk7Ci0JCWlmIChfTExUX05PX0FDVElWRSA9PSBfTExUX09QX1ZBTFVFKHZhbHVlKSkgeworCQlpZiAoX0xMVF9OT19BQ1RJVkUgPT0gX0xMVF9PUF9WQUxVRSh2YWx1ZSkpCiAJCQlicmVhazsKLQkJfQogCiAJCWlmIChjb3VudCA+IFBPTExJTkdfTExUX1RIUkVTSE9MRCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAoIkZhaWxlZCB0byBwb2xsaW5nIHdyaXRlIExMVCBkb25lIGF0ICIKLQkJCQkgICJhZGRyZXNzICVkIVxuIiwgYWRkcmVzcykpOworCQkJCSAiRmFpbGVkIHRvIHBvbGxpbmcgd3JpdGUgTExUIGRvbmUgYXQgYWRkcmVzcyAlZCFcbiIsCisJCQkJIGFkZHJlc3MpOwogCQkJc3RhdHVzID0gX0ZBSUw7CiAJCQlicmVhazsKIAkJfQpAQCAtMTE3NCwxNiArMTE1OCwxNCBAQAogCiAJZm9yIChpID0gMDsgaSA8ICh0eHBrdGJ1Zl9ibmR5IC0gMSk7IGkrKykgewogCQlzdGF0dXMgPSBfTExUV3JpdGUocGFkYXB0ZXIsIGksIGkgKyAxKTsKLQkJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykgeworCQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQogCQkJcmV0dXJuIHN0YXR1czsKLQkJfQogCX0KIAogCS8qICBlbmQgb2YgbGlzdCAqLwogCXN0YXR1cyA9IF9MTFRXcml0ZShwYWRhcHRlciwgKHR4cGt0YnVmX2JuZHkgLSAxKSwgMHhGRik7Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykgeworCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCiAJCXJldHVybiBzdGF0dXM7Ci0JfQogCiAJLyogIE1ha2UgdGhlIG90aGVyIHBhZ2VzIGFzIHJpbmcgYnVmZmVyICovCiAJLyogIFRoaXMgcmluZyBidWZmZXIgaXMgdXNlZCBhcyBiZWFjb24gYnVmZmVyIGlmIHdlIGNvbmZpZyB0aGlzCkBAIC0xMTkxLDE2ICsxMTczLDE0IEBACiAJLyogIE90aGVyd2lzZSB1c2VkIGFzIGxvY2FsIGxvb3BiYWNrIGJ1ZmZlci4gKi8KIAlmb3IgKGkgPSB0eHBrdGJ1Zl9ibmR5OyBpIDwgTGFzdF9FbnRyeV9PZl9UeFBrdEJ1ZjsgaSsrKSB7CiAJCXN0YXR1cyA9IF9MTFRXcml0ZShwYWRhcHRlciwgaSwgKGkgKyAxKSk7Ci0JCWlmIChfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKwkJaWYgKF9TVUNDRVNTICE9IHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7Ci0JCX0KIAl9CiAKIAkvKiAgTGV0IGxhc3QgZW50cnkgcG9pbnQgdG8gdGhlIHN0YXJ0IGVudHJ5IG9mIHJpbmcgYnVmZmVyICovCiAJc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCBMYXN0X0VudHJ5X09mX1R4UGt0QnVmLCB0eHBrdGJ1Zl9ibmR5KTsKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKSB7CisJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKIAkJcmV0dXJuIHN0YXR1czsKLQl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTI3Miw4ICsxMjUyLDYgQEAKIAogCS8qICAyMDEwLzA4LzEyIE1IIFdlIG5lZWQgdG8gc2V0IEJCL0dMQkFMIHJlc2V0IHRvIHNhdmUgcG93ZXIKIAkgICAgZm9yIFNTIG1vZGUuICovCi0KLS8qCVJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsICgiPT09PT09PiBSRiBvZmYgYW5kIHJlc2V0IEJCLlxuIikpOyAqLwogfQogCiBzdGF0aWMgdm9pZCBfUmVzZXREaWdpdGFsUHJvY2VkdXJlMV85MkMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKQEAgLTE0MDIsOCArMTM4MCw2IEBACiAJCXZhbHVlOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0xET1YxMkRfQ1RSTCk7CiAJCXZhbHVlOCAmPSB+TERWMTJfRU47CiAJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRE9WMTJEX0NUUkwsIHZhbHVlOCk7Ci0vKgkJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKLQkJKCIgUkVHX0xET1YxMkRfQ1RSTCBSZWcweDIxOjB4JTAyeC5cbiIsIHZhbHVlOCkpOyAqLwogCX0KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQzNSw5ICsxNDExLDkgQEAKIC8qICBIVyBBdXRvIHN0YXRlIG1hY2hpbmUgKi8KIGludCBDYXJkRGlzYWJsZUhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmVzZXRNQ1UpCiB7Ci0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7CisJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQogCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JfQorCiAJLyogIFJGIE9mZiBTZXF1ZW5jZSA9PT09ICovCiAJX0Rpc2FibGVSRkFGRUFuZFJlc2V0QkI4MTkyQyhwYWRhcHRlcik7CiAKQEAgLTE0NTEsNyArMTQyNyw3IEBACiAJX0Rpc2FibGVBbmFsb2cocGFkYXB0ZXIsIGZhbHNlKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCI9PT09PT0+IENhcmQgZGlzYWJsZSBmaW5pc2hlZC5cbiIpKTsKKwkJICI9PT09PT0+IENhcmQgZGlzYWJsZSBmaW5pc2hlZC5cbiIpOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTQ1OSw5ICsxNDM1LDggQEAKIC8qICB3aXRob3V0IEhXIEF1dG8gc3RhdGUgbWFjaGluZSAqLwogaW50IENhcmREaXNhYmxlV2l0aG91dEhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKIHsKLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKKwlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCiAJCXJldHVybiBfU1VDQ0VTUzsKLQl9CiAKIAkvKiAgUkYgT2ZmIFNlcXVlbmNlID09PT0gKi8KIAlfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHBhZGFwdGVyKTsKQEAgLTE0NzgsOCArMTQ1Myw2IEBACiAJLyogICA9PT09IERpc2FibGUgYW5hbG9nIHNlcXVlbmNlID09PSAqLwogCV9EaXNhYmxlQW5hbG9nKHBhZGFwdGVyLCB0cnVlKTsKIAotCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX0xPVUQsCi0JICAgKCI8PT09PT09IENhcmQgRGlzYWJsZSBXaXRob3V0IEhXU00gLlxuIikpOyAqLwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtMTQ5Niw3ICsxNDY5LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgKCJBdXRvTG9hZCBGYWlsIHJlcG9ydGVkIGZyb20gQ1I5MzQ2ISFcbiIpKTsKKwkJCSAiQXV0b0xvYWQgRmFpbCByZXBvcnRlZCBmcm9tIENSOTM0NiEhXG4iKTsKIAkJLyogdXBkYXRlIHRvIGRlZmF1bHQgdmFsdWUgMHhGRiAqLwogCQlpZiAoIXBFRVBST00tPkVlcHJvbU9yRWZ1c2UpCiAJCQlFRlVTRV9TaGFkb3dNYXBVcGRhdGUyM2EocGFkYXB0ZXIsIEVGVVNFX1dJRkkpOwpAQCAtMTUyMSw3ICsxNDk0LDcgQEAKIAl9CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJFRVBST00gSUQgPSAweCUwNHhcbiIsIEVFUFJPTUlkKSk7CisJCSAiRUVQUk9NIElEID0gMHglMDR4XG4iLCBFRVBST01JZCk7CiB9CiAKIHN0YXRpYyB2b2lkIEhhbF9FRVZhbHVlQ2hlY2sodTggRUVUeXBlLCB2b2lkICpwSW5WYWx1ZSwgdm9pZCAqcE91dFZhbHVlKQpAQCAtMTUzNiw5ICsxNTA5LDggQEAKIAkJCSpwT3V0ID0gKnBJbjsKIAkJZWxzZSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAoIkVFVFlQRV9UWF9QV1IsIHZhbHVlID0lZCBpcyBpbnZhbGlkLCBzZXQgIgotCQkJCSAgInRvIGRlZmF1bHQgPSAweCV4XG4iLAotCQkJCSAgKnBJbiwgRUVQUk9NX0RlZmF1bHRfVHhQb3dlckxldmVsKSk7CisJCQkJICJFRVRZUEVfVFhfUFdSLCB2YWx1ZSA9JWQgaXMgaW52YWxpZCwgc2V0IHRvIGRlZmF1bHQgPSAweCV4XG4iLAorCQkJCSAqcEluLCBFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWwpOwogCQkJKnBPdXQgPSBFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWw7CiAJCX0KIAl9CkBAIC0xNjc2LDM1ICsxNjQ4LDM0IEBACiAJZm9yIChyZlBhdGggPSAwOyByZlBhdGggPCBSRl9QQVRIX01BWDsgcmZQYXRoKyspIHsKIAkJZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJSRigldSktQ2goJXUpIFtDQ0sgLyBIVDQwXzFTIC8gSFQ0MF8yU10gPSAiCi0JCQkJICAiWzB4JXggLyAweCV4IC8gMHgleF1cbiIsCi0JCQkJICByZlBhdGgsIGNoLAotCQkJCSAgcEhhbERhdGEtPlR4UHdyTGV2ZWxDY2tbcmZQYXRoXVtjaF0sCi0JCQkJICBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMVNbcmZQYXRoXVtjaF0sCi0JCQkJICBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMlNbcmZQYXRoXVtjaF0pKTsKKwkJCQkgIlJGKCV1KS1DaCgldSkgW0NDSyAvIEhUNDBfMVMgLyBIVDQwXzJTXSA9IFsweCV4IC8gMHgleCAvIDB4JXhdXG4iLAorCQkJCSByZlBhdGgsIGNoLAorCQkJCSBwSGFsRGF0YS0+VHhQd3JMZXZlbENja1tyZlBhdGhdW2NoXSwKKwkJCQkgcEhhbERhdGEtPlR4UHdyTGV2ZWxIVDQwXzFTW3JmUGF0aF1bY2hdLAorCQkJCSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMlNbcmZQYXRoXVtjaF0pOwogCiAJCX0KIAl9CiAJZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiUkYtQSBIdDIwIHRvIEhUNDAgRGlmZlsldV0gPSAweCV4KCVkKVxuIiwgY2gsCi0JCQkgIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdLAotCQkJICBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0FdW2NoXSkpOworCQkJICJSRi1BIEh0MjAgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXgoJWQpXG4iLCBjaCwKKwkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0FdW2NoXSwKKwkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0FdW2NoXSk7CiAJfQogCWZvciAoY2ggPSAwOyBjaCA8IENIQU5ORUxfTUFYX05VTUJFUjsgY2grKykKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJSRi1BIExlZ2FjeSB0byBIdDQwIERpZmZbJXVdID0gMHgleFxuIiwgY2gsCi0JCQkgIHBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltSRl9QQVRIX0FdW2NoXSkpOworCQkJICJSRi1BIExlZ2FjeSB0byBIdDQwIERpZmZbJXVdID0gMHgleFxuIiwgY2gsCisJCQkgcEhhbERhdGEtPlR4UHdyTGVnYWN5SHREaWZmW1JGX1BBVEhfQV1bY2hdKTsKIAlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJSRi1CIEh0MjAgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXgoJWQpXG4iLCBjaCwKLQkJCSAgcEhhbERhdGEtPlR4UHdySHQyMERpZmZbUkZfUEFUSF9CXVtjaF0sCi0JCQkgIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQl1bY2hdKSk7CisJCQkgIlJGLUIgSHQyMCB0byBIVDQwIERpZmZbJXVdID0gMHgleCglZClcbiIsIGNoLAorCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQl1bY2hdLAorCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQl1bY2hdKTsKIAl9CiAJZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKQogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIlJGLUIgTGVnYWN5IHRvIEhUNDAgRGlmZlsldV0gPSAweCV4XG4iLCBjaCwKLQkJCSAgcEhhbERhdGEtPlR4UHdyTGVnYWN5SHREaWZmW1JGX1BBVEhfQl1bY2hdKSk7CisJCQkgIlJGLUIgTGVnYWN5IHRvIEhUNDAgRGlmZlsldV0gPSAweCV4XG4iLCBjaCwKKwkJCSBwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbUkZfUEFUSF9CXVtjaF0pOwogCWlmICghQXV0b0xvYWRGYWlsKSB7CiAJCXN0cnVjdCByZWdpc3RyeV9wcml2ICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAkJaWYgKHJlZ2lzdHJ5X3Bhci0+cmVndWxhdG9yeV90aWQgPT0gMHhmZikgewpAQCAtMTcyMSw3ICsxNjkyLDcgQEAKIAkJcEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkgPSAwOwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiRUVQUk9NUmVndWxhdG9yeSA9IDB4JXhcbiIsIHBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5KSk7CisJCSAiRUVQUk9NUmVndWxhdG9yeSA9IDB4JXhcbiIsIHBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5KTsKIAogCWlmICghQXV0b0xvYWRGYWlsKQogCQlwSGFsRGF0YS0+YlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk0gPSB0cnVlOwpAQCAtMTc0Nyw4ICsxNzE4LDggQEAKIAkJLyogIGVlcHJvbSBzcGVjICovCiAJCXRlbXB2YWwgPSBod2luZm9bUkZfT1BUSU9ONF84NzIzQV07CiAJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnROdW0gPSAodGVtcHZhbCAmIDB4MSk7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb24gPSAoKHRlbXB2YWwgJiAweDEwKSA+PiA0KTsKLQkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFJhZGlvU2hhcmVkID0gKCh0ZW1wdmFsICYgMHgyMCkgPj4gNSk7CisJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb24gPSAodGVtcHZhbCAmIDB4MTApID4+IDQ7CisJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhSYWRpb1NoYXJlZCA9ICh0ZW1wdmFsICYgMHgyMCkgPj4gNTsKIAl9IGVsc2UgewogCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQ29leGlzdCA9IDA7CiAJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhUeXBlID0gQlRfUlRMODcyM0E7CkBAIC0xNzcxLDggKzE3NDIsOCBAQAogCWVsc2UKIAkJcEhhbERhdGEtPkVFUFJPTVZlcnNpb24gPSAxOwogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJIYWxfRWZ1c2VQYXJzZUVFUFJPTVZlcigpLCBFRVZlciA9ICVkXG4iLAotCQkgIHBIYWxEYXRhLT5FRVBST01WZXJzaW9uKSk7CisJCSAiSGFsX0VmdXNlUGFyc2VFRVBST01WZXIoKSwgRUVWZXIgPSAlZFxuIiwKKwkJIHBIYWxEYXRhLT5FRVBST01WZXJzaW9uKTsKIH0KIAogdm9pZApAQCAtMTgwNSwxMCArMTc3NiwxMCBAQAogCQlwSGFsRGF0YS0+RUVQUk9NU3ViQ3VzdG9tZXJJRCA9IDA7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJFRVBST00gQ3VzdG9tZXIgSUQ6IDB4JTJ4XG4iLCBwSGFsRGF0YS0+RUVQUk9NQ3VzdG9tZXJJRCkpOworCQkgIkVFUFJPTSBDdXN0b21lciBJRDogMHglMnhcbiIsIHBIYWxEYXRhLT5FRVBST01DdXN0b21lcklEKTsKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiRUVQUk9NIFN1YkN1c3RvbWVyIElEOiAweCUwMnhcbiIsCi0JCSAgcEhhbERhdGEtPkVFUFJPTVN1YkN1c3RvbWVySUQpKTsKKwkJICJFRVBST00gU3ViQ3VzdG9tZXIgSUQ6IDB4JTAyeFxuIiwKKwkJIHBIYWxEYXRhLT5FRVBST01TdWJDdXN0b21lcklEKTsKIH0KIAogdm9pZApAQCAtMTgzNyw4ICsxODA4LDggQEAKIAkJcEhhbERhdGEtPkNyeXN0YWxDYXAgPSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwXzg3MjNBOwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6IENyeXN0YWxDYXAgPSAweCUyeFxuIiwgX19mdW5jX18sCi0JCSAgcEhhbERhdGEtPkNyeXN0YWxDYXApKTsKKwkJICIlczogQ3J5c3RhbENhcCA9IDB4JTJ4XG4iLCBfX2Z1bmNfXywKKwkJIHBIYWxEYXRhLT5DcnlzdGFsQ2FwKTsKIH0KIAogdm9pZApAQCAtMTg3NSw5ICsxODQ2LDggQEAKIAkvKiAgQ2xlYXIgZmlyc3QgKi8KIAlwdHhkZXNjLT50eGR3NyAmPSBjcHVfdG9fbGUzMigweGZmZmYwMDAwKTsKIAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspCiAJCWNoZWNrc3VtIF49IGxlMTZfdG9fY3B1KCoodXNQdHIgKyBpbmRleCkpOwotCX0KIAogCXB0eGRlc2MtPnR4ZHc3IHw9IGNwdV90b19sZTMyKGNoZWNrc3VtICYgMHgwMDAwZmZmZik7CiB9CkBAIC0xOTI1LDkgKzE4OTUsOCBAQAogCQlwdHhkZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMigoOCA8PCAyOCkpOwogCX0KIAotCWlmICh0cnVlID09IElzQlRRb3NOdWxsKSB7CisJaWYgKHRydWUgPT0gSXNCVFFvc051bGwpCiAJCXB0eGRlc2MtPnR4ZHcyIHw9IGNwdV90b19sZTMyKEJJVCgyMykpOwkvKiAgQlQgTlVMTCAqLwotCX0KIAogCS8qIG9mZnNldCAxNiAqLwogCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg4KSk7CS8qIGRyaXZlciB1c2VzIHJhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3BoeWNmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMKaW5kZXggMTlkYzVlMy4uNDZhMzA2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMKQEAgLTEyMSwxOCArMTIxLDE1IEBACiB7CiAJdTMyIE9yaWdpbmFsVmFsdWUsIEJpdFNoaWZ0OwogCi0JLyogUlRfVFJBQ0UoQ09NUF9SRiwgREJHX1RSQUNFLCAoIi0tLT5QSFlfU2V0QkJSZWcoKTogUmVnQWRkciglI2x4KSwgQml0TWFzayglI2x4KSwgRGF0YSglI2x4KVxuIiwgUmVnQWRkciwgQml0TWFzaywgRGF0YSkpOyAqLwotCiAJaWYgKEJpdE1hc2sgIT0gYk1hc2tEV29yZCkgey8qIGlmIG5vdCAiZG91YmxlIHdvcmQiIHdyaXRlICovCiAJCU9yaWdpbmFsVmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIFJlZ0FkZHIpOwogCQlCaXRTaGlmdCA9IHBoeV9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKLQkJRGF0YSA9ICgoT3JpZ2luYWxWYWx1ZSAmICh+Qml0TWFzaykpIHwgKERhdGEgPDwgQml0U2hpZnQpKTsKKwkJRGF0YSA9IChPcmlnaW5hbFZhbHVlICYgKH5CaXRNYXNrKSkgfCAoRGF0YSA8PCBCaXRTaGlmdCk7CiAJfQogCiAJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUmVnQWRkciwgRGF0YSk7CiAKIAkvKiBSVFBSSU5UKEZQSFksIFBIWV9CQlcsICgiQkJXIE1BU0sgPSAweCVseCBBZGRyWzB4JWx4XT0gMHglbHhcbiIsIEJpdE1hc2ssIFJlZ0FkZHIsIERhdGEpKTsgKi8KLQkvKiBSVF9UUkFDRShDT01QX1JGLCBEQkdfVFJBQ0UsICgiPC0tLVBIWV9TZXRCQlJlZygpOiBSZWdBZGRyKCUjbHgpLCBCaXRNYXNrKCUjbHgpLCBEYXRhKCUjbHgpXG4iLCBSZWdBZGRyLCBCaXRNYXNrLCBEYXRhKSk7ICovCiB9CiAKIC8qICAqLwpAQCAtMTkwLDI1ICsxODcsMjQgQEAKIAkvKiAgRm9yIDkyUyBMU1NJIFJlYWQgUkZMU1NJUmVhZCAqLwogCS8qICBGb3IgUkYgQS9CIHdyaXRlIDB4ODI0LzgyYyhkb2VzIG5vdCB3b3JrIGluIHRoZSBmdXR1cmUpICovCiAJLyogIFdlIG11c3QgdXNlIDB4ODI0IGZvciBSRiBBIGFuZCBCIHRvIGV4ZWN1dGUgcmVhZCB0cmlnZ2VyICovCi0JdG1wbG9uZyA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMiwgYk1hc2tEV29yZCk7CisJdG1wbG9uZyA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyKTsKIAlpZiAoZVJGUGF0aCA9PSBSRl9QQVRIX0EpCiAJCXRtcGxvbmcyID0gdG1wbG9uZzsKIAllbHNlCi0JCXRtcGxvbmcyID0gUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsCi0JCQkJCSAgYk1hc2tEV29yZCk7CisJCXRtcGxvbmcyID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBwUGh5UmVnLT5yZkhTU0lQYXJhMik7CiAKIAl0bXBsb25nMiA9ICh0bXBsb25nMiAmIH5iTFNTSVJlYWRBZGRyZXNzKSB8CiAJCShOZXdPZmZzZXQgPDwgMjMpIHwgYkxTU0lSZWFkRWRnZTsJLyogVDY1IFJGICovCiAKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLAotCQkgICAgIGJNYXNrRFdvcmQsIHRtcGxvbmcgJiAofmJMU1NJUmVhZEVkZ2UpKTsKKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsCisJCQkgIHRtcGxvbmcgJiAofmJMU1NJUmVhZEVkZ2UpKTsKIAl1ZGVsYXkoMTApOy8qICBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEwKTsgKi8KIAotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgYk1hc2tEV29yZCwgdG1wbG9uZzIpOworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCB0bXBsb25nMik7CiAJdWRlbGF5KDEwMCk7LyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxMDApOyAqLwogCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMiwgYk1hc2tEV29yZCwKLQkJICAgICB0bXBsb25nIHwgYkxTU0lSZWFkRWRnZSk7CisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLAorCQkJICB0bXBsb25nIHwgYkxTU0lSZWFkRWRnZSk7CiAJdWRlbGF5KDEwKTsvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEwKTsgKi8KIAogCWlmIChlUkZQYXRoID09IFJGX1BBVEhfQSkKQEAgLTMxOSw5ICszMTUsNyBAQAogCS8qICAqLwogCS8qICBXcml0ZSBPcGVyYXRpb24gKi8KIAkvKiAgKi8KLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgYk1hc2tEV29yZCwgRGF0YUFuZEFkZHIpOwotCS8qIFJUUFJJTlQoRlBIWSwgUEhZX1JGVywgKCJSRlctJWQgQWRkclsweCVseF09IDB4JWx4XG4iLCBlUkZQYXRoLCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBEYXRhQW5kQWRkcikpOyAqLwotCisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgRGF0YUFuZEFkZHIpOwogfQogCiAvKioKQEAgLTM5Miw3ICszODYsNyBAQAogCWlmIChCaXRNYXNrICE9IGJSRlJlZ09mZnNldE1hc2spIHsKIAkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfUkZTZXJpYWxSZWFkKEFkYXB0ZXIsIGVSRlBhdGgsIFJlZ0FkZHIpOwogCQlCaXRTaGlmdCA9ICBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JCURhdGEgPSAoKE9yaWdpbmFsX1ZhbHVlICYgKH5CaXRNYXNrKSkgfCAoRGF0YSA8PCBCaXRTaGlmdCkpOworCQlEYXRhID0gKE9yaWdpbmFsX1ZhbHVlICYgKH5CaXRNYXNrKSkgfCAoRGF0YSA8PCBCaXRTaGlmdCk7CiAJfQogCiAJcGh5X1JGU2VyaWFsV3JpdGUoQWRhcHRlciwgZVJGUGF0aCwgUmVnQWRkciwgRGF0YSk7CkBAIC00MTksNyArNDEzLDYgQEAKIGludCBQSFlfTUFDQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQogewogCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JYm9vbCBpczkyQyA9IElTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCk7CiAKIAkvKiAgKi8KIAkvKiAgQ29uZmlnIE1BQyAqLwpAQCAtNDI3LDkgKzQyMCw5IEBACiAJT0RNX1JlYWRBbmRDb25maWdfTUFDX1JFR184NzIzQSgmcEhhbERhdGEtPm9kbXByaXYpOwogCiAJLyogIDIwMTAuMDcuMTMgQU1QRFUgYWdncmVnYXRpb24gbnVtYmVyIDkgKi8KLQkvKiBydHdfd3JpdGUxNihBZGFwdGVyLCBSRUdfTUFYX0FHR1JfTlVNLCBNQVhfQUdHUl9OVU0pOyAqLwogCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX01BWF9BR0dSX05VTSwgMHgwQSk7Ci0JaWYgKGlzOTJDICYmIChCT0FSRF9VU0JfRE9OR0xFID09IHBIYWxEYXRhLT5Cb2FyZFR5cGUpKQorCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSICYmCisJICAgIEJPQVJEX1VTQl9ET05HTEUgPT0gcEhhbERhdGEtPkJvYXJkVHlwZSkKIAkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweDQwLCAweDA0KTsKIAogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTU1MiwxMzEgKzU0NSw1MSBAQAogCiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfUmF0ZTE4XzA2KSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzBdID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzBdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVswXSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9SYXRlNTRfMjQpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMV0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMV0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzFdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX0NDSzFfTWNzMzIpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bNl0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bNl0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzZdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX0NDSzExX0FfQ0NLMl8xMSAmJiBCaXRNYXNrID09IDB4ZmZmZmZmMDApIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bN10gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bN10gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzddKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczAzX01jczAwKSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzJdID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzJdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVsyXSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9NY3MwN19NY3MwNCkgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVszXSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVszXSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bM10pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfTWNzMTFfTWNzMDgpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bNF0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bNF0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzRdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczE1X01jczEyKSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzVdID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzVdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVs1XSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9SYXRlMThfMDYpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bOF0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bOF0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzhdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX1JhdGU1NF8yNCkgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs5XSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVs5XSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bOV0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMV81NV9NY3MzMikgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxNF0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMTRdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxNF0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIEJpdE1hc2sgPT0gMHgwMDAwMDBmZikgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxNV0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMTVdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxNV0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfTWNzMDNfTWNzMDApIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMTBdID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzEwXSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bMTBdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczA3X01jczA0KSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzExXSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxMV0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzExXSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9NY3MxMV9NY3MwOCkgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxMl0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMTJdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxMl0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfTWNzMTVfTWNzMTIpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMTNdID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzEzXSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bMTNdKSk7ICovCiAJCXBIYWxEYXRhLT5wd3JHcm91cENudCsrOwogCX0KIH0KQEAgLTgzMSw3ICs3NDQsNyBAQAogCQkJICAgICAoQ3J5c3RhbENhcCB8IChDcnlzdGFsQ2FwIDw8IDYpKSk7CiAJfQogCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFJFR19MRE9BMTVfQ1RSTCwgYk1hc2tEV29yZCwgMHgwMTU3MjUwNSk7CisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0xET0ExNV9DVFJMLCAweDAxNTcyNTA1KTsKIAlyZXR1cm4gcnRTdGF0dXM7CiB9CiAKQEAgLTkyMCwxMCArODMzLDYgQEAKIAl1OCByZWdCd09wTW9kZTsKIAl1OCByZWdSUlNSX1JTQzsKIAotCS8qICBUaGVyZSBpcyBubyA0ME1IeiBtb2RlIGluIFJGXzgyMjUuICovCi0JaWYgKHBIYWxEYXRhLT5yZl9jaGlwID09IFJGXzgyMjUpCi0JCXJldHVybjsKLQogCWlmIChBZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkKIAkJcmV0dXJuOwogCkBAIC05ODIsMTAgKzg5MSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJLypSVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsCi0JCSAgKCJQSFlfU2V0QldNb2RlMjNhQ2FsbGJhY2s4MTkyQygpOiB1bmtub3duIEJhbmR3aWR0aDogJSNYXG4iIFwKLQkJICAsIHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKSk7Ki8KLQkJCWJyZWFrOworCQlicmVhazsKIAl9CiAJLyogU2tpcCBvdmVyIHNldHRpbmcgb2YgSi1tb2RlIGluIEJCIHJlZ2lzdGVyIGhlcmUuIERlZmF1bHQgdmFsdWUKIAkgICBpcyAiTm9uZSBKIG1vZGUiLiBFbWlseSAyMDA3MDMxNSAqLwpAQCAtOTk0LDQxICs5MDAsOCBAQAogCS8qIE5vd0wgPSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoQWRhcHRlciwgVFNGUik7ICovCiAJLyogTm93SCA9IFBsYXRmb3JtRUZJT1JlYWQ0Qnl0ZShBZGFwdGVyLCBUU0ZSKzQpOyAqLwogCS8qIEVuZFRpbWUgPSAoKHU2NClOb3dIIDw8IDMyKSArIE5vd0w7ICovCi0JLyogUlRfVFJBQ0UoQ09NUF9TQ0FOLCBEQkdfTE9VRCwgKCJTZXRCV01vZGUyM2FDYWxsYmFjazgxOTBQY2k6IHRpbWUKLQkgICBvZiBTZXRCV01vZGUyM2EgPSAlSTY0ZCB1cyFcbiIsIChFbmRUaW1lIC0gQmVnaW5UaW1lKSkpOyAqLwogCi0JLyogMzwzPlNldCBSRiByZWxhdGVkIHJlZ2lzdGVyICovCi0Jc3dpdGNoIChwSGFsRGF0YS0+cmZfY2hpcCkgewotCWNhc2UgUkZfODIyNToKLQkJLyogUEhZX1NldFJGODIyNUJhbmR3aWR0aChBZGFwdGVyLAotCQkgICBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyk7ICovCi0JCWJyZWFrOwotCi0JY2FzZSBSRl84MjU2OgotCQkvKiAgUGxlYXNlIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGluIEhhbDgxOTBQY2lQaHk4MjU2LmMgKi8KLQkJLyogUEhZX1NldFJGODI1NkJhbmR3aWR0aChBZGFwdGVyLAotCQkgICBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyk7ICovCi0JCWJyZWFrOwotCi0JY2FzZSBSRl84MjU4OgotCQkvKiAgUGxlYXNlIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGluIEhhbDgxOTBQY2lQaHk4MjU4LmMgKi8KLQkJLyogIFBIWV9TZXRSRjgyNThCYW5kd2lkdGgoKTsgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFJGXzYwNTI6Ci0JCXJ0bDg3MjNhX3BoeV9yZjYwNTJzZXRfYncoQWRhcHRlciwgcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIFJUX0FTU0VSVChmYWxzZSwgKCJVbmtub3duIFJGQ2hpcElEOiAlZFxuIiwKLQkJICAgcEhhbERhdGEtPlJGQ2hpcElEKSk7ICovCi0JCWJyZWFrOwotCX0KLQotCS8qIHBIYWxEYXRhLT5TZXRCV01vZGUyM2FJblByb2dyZXNzID0gZmFsc2U7ICovCi0KLQkvKiBSVF9UUkFDRShDT01QX1NDQU4sIERCR19MT1VELAotCSAgICgiPD09IFBIWV9TZXRCV01vZGUyM2FDYWxsYmFjazgxOTJDKCkgXG4iKSk7ICovCisJcnRsODcyM2FfcGh5X3JmNjA1MnNldF9idyhBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyk7CiB9CiAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9yZjYwNTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jCmluZGV4IDFhYWQ0MzguLjNlM2YxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jCkBAIC0yNjcsOCArMjY3LDggQEAKIAkJCWJyZWFrOwogCQljYXNlIDI6CS8qICBCZXR0ZXIgcmVndWxhdG9yeSAqLwogCQkJLyogIGRvbid0IGluY3JlYXNlIGFueSBwb3dlciBkaWZmICovCi0JCQl3cml0ZVZhbCA9ICgoaW5kZXggPCAyKSA/IHBvd2VyQmFzZTBbcmZdIDoKLQkJCQkgICAgcG93ZXJCYXNlMVtyZl0pOworCQkJd3JpdGVWYWwgPSAoaW5kZXggPCAyKSA/IHBvd2VyQmFzZTBbcmZdIDoKKwkJCQkgICAgcG93ZXJCYXNlMVtyZl07CiAJCQlicmVhazsKIAkJY2FzZSAzOgkvKiAgQ3VzdG9tZXIgZGVmaW5lZCBwb3dlciBkaWZmLiAqLwogCQkJY2hubEdyb3VwID0gMDsKQEAgLTM1Myw3ICszNTMsNyBAQAogCQllbHNlCiAJCQlSZWdPZmZzZXQgPSBSZWdPZmZzZXRfQltpbmRleF07CiAKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFJlZ09mZnNldCwgYk1hc2tEV29yZCwgd3JpdGVWYWwpOworCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSZWdPZmZzZXQsIHdyaXRlVmFsKTsKIAogCQkvKiAgMjAxMDA1MTE1IEpvc2VwaDogU2V0IFR4IFBvd2VyIGRpZmYgZm9yIFR4IHBvd2VyCiAJCSAgICB0cmFpbmluZyBtZWNoYW5pc20uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3JlY3YuYwppbmRleCA2MDc1YjZkLi4wZmVjODRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV9yZWN2LmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlpZiAoIXByZWN2cHJpdi0+cHJlY3ZfYnVmKSB7CiAJCXJlcyA9IF9GQUlMOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICgiYWxsb2MgcmVjdl9idWYgZmFpbCFcbiIpKTsKKwkJCSAiYWxsb2MgcmVjdl9idWYgZmFpbCFcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xOTQsOCArMTk0LDggQEAKIAlib29sIG1hdGNoYnNzaWQgPSBmYWxzZTsKIAl1OCAqYnNzaWQ7CiAKLQltYXRjaGJzc2lkID0gKCFpZWVlODAyMTFfaXNfY3RsKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkJICAgICAgIXBhdHRyaWItPmljdl9lcnIgJiYgIXBhdHRyaWItPmNyY19lcnIpOworCW1hdGNoYnNzaWQgPSAhaWVlZTgwMjExX2lzX2N0bChoZHItPmZyYW1lX2NvbnRyb2wpICYmCisJCSAgICAgICFwYXR0cmliLT5pY3ZfZXJyICYmICFwYXR0cmliLT5jcmNfZXJyOwogCiAJaWYgKG1hdGNoYnNzaWQpIHsKIAkJc3dpdGNoIChoZHItPmZyYW1lX2NvbnRyb2wgJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV94bWl0LmMKaW5kZXggMTc1OTQ4Ny4uNmJmODdmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfeG1pdC5jCkBAIC00Miw3ICs0Miw3IEBACiAKIHN0YXRpYyB2b2lkIHJ0bDgxOTJjdV9jYWxfdHhkZXNjX2Noa3N1bShzdHJ1Y3QgdHhfZGVzYwkqcHR4ZGVzYykKIHsKLQkJdTE2CSp1c1B0ciA9ICh1MTYgKilwdHhkZXNjOworCQlfX2xlMTYJKnVzUHRyID0gKF9fbGUxNiAqKXB0eGRlc2M7CiAJCXUzMiBjb3VudCA9IDE2OwkJLyogICgzMiBieXRlcyAvIDIgYnl0ZXMgcGVyIFhPUikgPT4gMTYgdGltZXMgKi8KIAkJdTMyIGluZGV4OwogCQl1MTYgY2hlY2tzdW0gPSAwOwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJfQogfQogCi1zdGF0aWMgczMyIHVwZGF0ZV90eGRlc2Moc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsIHU4ICpwbWVtLCBzMzIgc3osIHU4IGJhZ2dfcGt0KQorc3RhdGljIHMzMiB1cGRhdGVfdHhkZXNjKHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCB1OCAqcG1lbSwgczMyIHN6KQogewogCWludAlwdWxsID0gMDsKIAl1aW50CXFzZWw7CkBAIC0xNDMsNyArMTQzLDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKIAlpbnQJYm1jc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7CiAKLQlpZiAoKCFiYWdnX3BrdCkgJiYgKHVyYl96ZXJvX3BhY2tldF9jaGsocGFkYXB0ZXIsIHN6KSA9PSAwKSkgeworCWlmICh1cmJfemVyb19wYWNrZXRfY2hrKHBhZGFwdGVyLCBzeikgPT0gMCkgewogCQlwdHhkZXNjID0gKHN0cnVjdCB0eF9kZXNjICopKHBtZW0rUEFDS0VUX09GRlNFVF9TWik7CiAJCXB1bGwgPSAxOwogCQlweG1pdGZyYW1lLT5wa3Rfb2Zmc2V0LS07CkBAIC0yNzIsNyArMjcyLDggQEAKIAlpZiAoYm1jc3QpCiAJCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKEJJVCgyNCkpOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICgib2Zmc2V0MC10eGRlc2MgPSAweCV4XG4iLCBwdHhkZXNjLT50eGR3MCkpOworCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAorCQkgIm9mZnNldDAtdHhkZXNjID0gMHgleFxuIiwgcHR4ZGVzYy0+dHhkdzApOwogCiAJLyogb2Zmc2V0IDQgKi8KIAkvKiAgcGt0X29mZnNldCwgdW5pdDo4IGJ5dGVzIHBhZGRpbmcgKi8KQEAgLTMwMyw3ICszMDQsNyBAQAogCiAJbWVtX2FkZHIgPSBweG1pdGZyYW1lLT5idWZfYWRkcjsKIAotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInJ0d19kdW1wX3hmcmFtZSgpXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICJydHdfZHVtcF94ZnJhbWUoKVxuIik7CiAKIAlmb3IgKHQgPSAwOyB0IDwgcGF0dHJpYi0+bnJfZnJhZ3M7IHQrKykgewogCQlpZiAoaW5uZXJfcmV0ICE9IF9TVUNDRVNTICYmIHJldCA9PSBfU1VDQ0VTUykKQEAgLTMxMSw3ICszMTIsNyBAQAogCiAJCWlmICh0ICE9IChwYXR0cmliLT5ucl9mcmFncyAtIDEpKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAoInBhdHRyaWItPm5yX2ZyYWdzID0lZFxuIiwgcGF0dHJpYi0+bnJfZnJhZ3MpKTsKKwkJCQkgInBhdHRyaWItPm5yX2ZyYWdzID0lZFxuIiwgcGF0dHJpYi0+bnJfZnJhZ3MpOwogCiAJCQlzeiA9IHB4bWl0cHJpdi0+ZnJhZ19sZW47CiAJCQlzeiA9IHN6IC0gNCAtIHBhdHRyaWItPmljdl9sZW47CkBAIC0zMjAsNyArMzIxLDcgQEAKIAkJCXN6ID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6OwogCQl9CiAKLQkJcHVsbCA9IHVwZGF0ZV90eGRlc2MocHhtaXRmcmFtZSwgbWVtX2FkZHIsIHN6LCBmYWxzZSk7CisJCXB1bGwgPSB1cGRhdGVfdHhkZXNjKHB4bWl0ZnJhbWUsIG1lbV9hZGRyLCBzeik7CiAKIAkJaWYgKHB1bGwpIHsKIAkJCW1lbV9hZGRyICs9IFBBQ0tFVF9PRkZTRVRfU1o7IC8qIHB1bGwgdHhkZXNjIGhlYWQgKi8KQEAgLTMzOCw3ICszMzksNyBAQAogCQlydHdfY291bnRfdHhfc3RhdHMyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUsIHN6KTsKIAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoInJ0d193cml0ZV9wb3J0LCB3X3N6ID0lZFxuIiwgd19zeikpOworCQkJICJydHdfd3JpdGVfcG9ydCwgd19zeiA9JWRcbiIsIHdfc3opOwogCiAJCW1lbV9hZGRyICs9IHdfc3o7CiAKQEAgLTM2NSw3ICszNjYsNyBAQAogCXBod3htaXRzID0gcHhtaXRwcml2LT5od3htaXRzOwogCWh3ZW50cnkgPSBweG1pdHByaXYtPmh3eG1pdF9lbnRyeTsKIAotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInhtaXRmcmFtZV9jb21wbGV0ZSgpXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICJ4bWl0ZnJhbWVfY29tcGxldGUoKVxuIik7CiAKIAlpZiAocHhtaXRidWYgPT0gTlVMTCkgewogCQlweG1pdGJ1ZiA9IHJ0d19hbGxvY194bWl0YnVmMjNhKHB4bWl0cHJpdik7CkBAIC0zODgsNyArMzg5LDggQEAKIAkJCXJ0d19vc194bWl0X2NvbXBsZXRlMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsvKiBhbHdheXMgcmV0dXJuIG5kaXNfcGFja2V0IGFmdGVyIHJ0d194bWl0ZnJhbWVfY29hbGVzY2UyM2EgKi8KIAkJfQogCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInhtaXRmcmFtZV9jb21wbGV0ZSgpOiBydHdfZHVtcF94ZnJhbWVcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCisJCQkgInhtaXRmcmFtZV9jb21wbGV0ZSgpOiBydHdfZHVtcF94ZnJhbWVcbiIpOwogCiAJCWlmIChyZXMgPT0gX1NVQ0NFU1MpIHsKIAkJCXJ0d19kdW1wX3hmcmFtZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7CkBAIC00ODEsNyArNDgzLDcgQEAKIAogCWlmIChyZXMgIT0gX1NVQ0NFU1MpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJwcmVfeG1pdGZyYW1lOiBlbnF1ZXVlIHhtaXRmcmFtZSBmYWlsXG4iKSk7CisJCQkgInByZV94bWl0ZnJhbWU6IGVucXVldWUgeG1pdGZyYW1lIGZhaWxcbiIpOwogCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKIAogCQkvKiAgVHJpY2ssIG1ha2UgdGhlIHN0YXRpc3RpY3MgY29ycmVjdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX2hhbGluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9oYWxpbml0LmMKaW5kZXggYWRiZjFjMi4uNDJhZTI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX2hhbGluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2JfaGFsaW5pdC5jCkBAIC00NDcsMjIgKzQ0Nyw4IEBACiBzdGF0aWMgdm9pZCBfSW5pdFJGVHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlib29sIGlzOTJDVSA9IElTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCk7CiAKLQlwSGFsRGF0YS0+cmZfY2hpcCA9IFJGXzYwNTI7Ci0KLQlpZiAoIWlzOTJDVSkgewotCQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMVI7Ci0JCURCR184NzIzQSgiU2V0IFJGIENoaXAgSUQgdG8gUkZfNjA1MiBhbmQgUkYgdHlwZSB0byAxVDFSLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiAgVE9ETzogQ29uc2lkZXIgdGhhdCBFRVBST00gc2V0IDkyQ1UgdG8gMVQxUiBsYXRlci4gKi8KLQkvKiAgRm9yY2UgdG8gb3ZlcndyaXRlIHNldHRpbmcgYWNjb3JkaW5nIHRvIGNoaXAgdmVyc2lvbi4gSWdub3JlCi0JICAgIEVFUFJPTSBzZXR0aW5nLiAqLwotCS8qIHBIYWxEYXRhLT5SRl9UeXBlID0gaXM5MkNVID8gUkZfMlQyUiA6IFJGXzFUMVI7ICovCi0JTVNHXzg3MjNBKCJTZXQgUkYgQ2hpcCBJRCB0byBSRl82MDUyIGFuZCBSRiB0eXBlIHRvICVkLlxuIiwKLQkJICBwSGFsRGF0YS0+cmZfdHlwZSk7CisJcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwogfQogCiAvKiAgU2V0IENDSyBhbmQgT0ZETSBCbG9jayAiT04iICovCkBAIC01MzAsNyArNTE2LDcgQEAKIAkvKiAgQ2hlY2sgaWYgTUFDIGhhcyBhbHJlYWR5IHBvd2VyIG9uLiBieSB0eW5saS4gMjAxMS4wNS4yNy4gKi8KIAl2YWw4ID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19DUik7CiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOiBSRUdfQ1IgMHgxMDAgPSAweCUwMnhcbiIsIF9fZnVuY19fLCB2YWw4KSk7CisJCSAiJXM6IFJFR19DUiAweDEwMCA9IDB4JTAyeFxuIiwgX19mdW5jX18sIHZhbDgpOwogCS8qIEZpeCA5MkRVLVZDIFMzIGhhbmcgd2l0aCB0aGUgcmVhc29uIGlzIHRoYXQgc2Vjb25kYXJ5IG1hYyBpcyBub3QKIAkgICBpbml0aWFsaXplZC4gKi8KIAkvKiAweDEwMCB2YWx1ZSBvZiBmaXJzdCBtYWMgaXMgMHhFQSB3aGlsZSAweDEwMCB2YWx1ZSBvZiBzZWNvbmRhcnkKQEAgLTU0MCwxMyArNTI2LDEzIEBACiAJfSBlbHNlIHsKIAkJbWFjX29uID0gdHJ1ZTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCIlczogTUFDIGhhcyBhbHJlYWR5IHBvd2VyIG9uXG4iLCBfX2Z1bmNfXykpOworCQkJICIlczogTUFDIGhhcyBhbHJlYWR5IHBvd2VyIG9uXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJc3RhdHVzID0gX0luaXRQb3dlck9uKEFkYXB0ZXIpOwogCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAoIkZhaWxlZCB0byBpbml0IHBvd2VyIG9uIVxuIikpOworCQkJICJGYWlsZWQgdG8gaW5pdCBwb3dlciBvbiFcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC01NjEsNyArNTQ3LDcgQEAKIAkJc3RhdHVzID0gIEluaXRMTFRUYWJsZTIzYShBZGFwdGVyLCBib3VuZGFyeSk7CiAJCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiRmFpbGVkIHRvIGluaXQgTExUIHRhYmxlXG4iKSk7CisJCQkJICJGYWlsZWQgdG8gaW5pdCBMTFQgdGFibGVcbiIpOwogCQkJZ290byBleGl0OwogCQl9CiAJfQpAQCAtNTcyLDEyICs1NTgsMTAgQEAKIAlzdGF0dXMgPSBydGw4NzIzYV9GaXJtd2FyZURvd25sb2FkKEFkYXB0ZXIpOwogCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpIHsKIAkJQWRhcHRlci0+YkZXUmVhZHkgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmZ3X3JhY3RybCA9IGZhbHNlOwogCQlEQkdfODcyM0EoImZ3IGRvd25sb2FkIGZhaWwhXG4iKTsKIAkJZ290byBleGl0OwogCX0gZWxzZSB7CiAJCUFkYXB0ZXItPmJGV1JlYWR5ID0gdHJ1ZTsKLQkJcEhhbERhdGEtPmZ3X3JhY3RybCA9IHRydWU7CiAJCURCR184NzIzQSgiZncgZG93bmxvYWQgb2shXG4iKTsKIAl9CiAKQEAgLTYyNSwxNyArNjA5LDIyIEBACiAJfQogCiAJLyogcmVkdWNpbmcgODBNIHNwdXIgKi8KLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwsIGJNYXNrRFdvcmQsIDB4MDM4MTgwOGQpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBSRUdfQUZFX1BMTF9DVFJMLCBiTWFza0RXb3JkLCAweGYwZmZmZjgzKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgYk1hc2tEV29yZCwgMHhmMGZmZmY4Mik7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIGJNYXNrRFdvcmQsIDB4ZjBmZmZmODMpOworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19BRkVfWFRBTF9DVFJMLCAweDAzODE4MDhkKTsKKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfQUZFX1BMTF9DVFJMLCAweGYwZmZmZjgzKTsKKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfQUZFX1BMTF9DVFJMLCAweGYwZmZmZjgyKTsKKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfQUZFX1BMTF9DVFJMLCAweGYwZmZmZjgzKTsKIAogCS8qIFJGU1cgQ29udHJvbCAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfVHhJbmZvLCBiTWFza0RXb3JkLCAweDAwMDAwMDAzKTsJLyogMHg4MDRbMTRdPSAwICovCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgYk1hc2tEV29yZCwgMHgwNzAwMDc2MCk7CS8qIDB4ODcwWzY6NV09IGInMTEgKi8KLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIGJNYXNrRFdvcmQsIDB4NjZGNjAyMTApOyAvKiAweDg2MFs2OjVdPSBiJzAwICovCisJLyogMHg4MDRbMTRdPSAwICovCisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1R4SW5mbywgMHgwMDAwMDAwMyk7CisJLyogMHg4NzBbNjo1XT0gYicxMSAqLworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgMHgwNzAwMDc2MCk7CisJLyogMHg4NjBbNjo1XT0gYicwMCAqLworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCAweDY2RjYwMjEwKTsKIAotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIiVzOiAweDg3MCA9IHZhbHVlIDB4JXhcbiIsIF9fZnVuY19fLCBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCAweDg3MCwgYk1hc2tEV29yZCkpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKKwkJICIlczogMHg4NzAgPSB2YWx1ZSAweCV4XG4iLCBfX2Z1bmNfXywKKwkJIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgMHg4NzApKTsKIAogCS8qICAqLwogCS8qICBKb3NlcGggTm90ZTogS2VlcCBSZlJlZ0NobmxWYWwgZm9yIGxhdGVyIHVzZS4gKi8KQEAgLTc0NywxNSArNzM2LDE2IEBACiAKIAlydGw4NzIzYV9Jbml0SGFsRG0oQWRhcHRlcik7CiAKLQl2YWw4ID0gKChXaUZpTmF2VXBwZXJVcyArIEhBTF84NzIzQV9OQVZfVVBQRVJfVU5JVCAtIDEpIC8KLQkJSEFMXzg3MjNBX05BVl9VUFBFUl9VTklUKTsKKwl2YWw4ID0gKFdpRmlOYXZVcHBlclVzICsgSEFMXzg3MjNBX05BVl9VUFBFUl9VTklUIC0gMSkgLworCQlIQUxfODcyM0FfTkFWX1VQUEVSX1VOSVQ7CiAJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfTkFWX1VQUEVSLCB2YWw4KTsKIAogCS8qICAyMDExLzAzLzA5IE1IIGRlYnVnIG9ubHksIFVNQy1CIGN1dCBwYXNzIDI1MDAgUzUgdGVzdCwgYnV0IHdlIG5lZWQgdG8gZmluIHJvb3QgY2F1c2UuICovCiAJaWYgKCgocnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByRlBHQTBfUkZNT0QpICYgMHhGRjAwMDAwMCkgIT0KIAkgICAgIDB4ODMwMDAwMDApKSB7CiAJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfUkZNT0QsIEJJVCgyNCksIDEpOwotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLCAoIiVzOiBJUUsgZmFpbCByZWNvcnZlclxuIiwgX19mdW5jX18pKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKKwkJCSAiJXM6IElRSyBmYWlsIHJlY292ZXJcbiIsIF9fZnVuY19fKTsKIAl9CiAKIAkvKiBhY2sgZm9yIHhtaXQgbWdtdCBmcmFtZXMuICovCkBAIC04MDYsMTkgKzc5NiwxOCBAQAogCiAJCS8qIEFGRSAqLwogCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCBiTWFza0RXb3JkLAotCQkJCSAgICAgMHg2M0RCMjVBMCk7CisJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4NjNEQjI1QTApOwogCQllbHNlIGlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMVQxUikKLQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIGJNYXNrRFdvcmQsCi0JCQkJICAgICAweDYzMUIyNUEwKTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgMHg2MzFCMjVBMCk7CiAKIAkJLyogIDQuIGlzc3VlIDMtd2lyZSBjb21tYW5kIHRoYXQgUkYgc2V0IHRvIFJ4IGlkbGUKIAkJICAgIG1vZGUuIFRoaXMgaXMgdXNlZCB0byByZS13cml0ZSB0aGUgUlggaWRsZSBtb2RlLiAqLwogCQkvKiAgV2UgY2FuIG9ubHkgcHJ2aWRlIGEgdXN1YWwgdmFsdWUgaW5zdGVhZCBhbmQgdGhlbgogCQkgICAgSFcgd2lsbCBtb2RpZnkgdGhlIHZhbHVlIGJ5IGl0c2VsZi4gKi8KLQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwgMCwgYlJGUmVnT2Zmc2V0TWFzaywgMHgzMkQ5NSk7CisJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0FDLAorCQkJICAgICBiUkZSZWdPZmZzZXRNYXNrLCAweDMyRDk1KTsKIAkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKSB7Ci0JCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9CLCAwLAorCQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQiwgUkZfQUMsCiAJCQkJICAgICBiUkZSZWdPZmZzZXRNYXNrLCAweDMyRDk1KTsKIAkJfQogCQlicmVhazsKQEAgLTgyOSw3ICs4MTgsNyBAQAogCQllbHNlCiAJCQlzcHMwICY9IH4oQklUKDApIHwgQklUKDMpKTsKIAotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sICgiU1MgTFZMMVxuIikpOworCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sICJTUyBMVkwxXG4iKTsKIAkJLyogIERpc2FibGUgUkYgYW5kIEJCIG9ubHkgZm9yIFNlbGVjdFN1c3BlbmQuICovCiAKIAkJLyogIDEuIFNldCBCQi9SRiB0byBzaHV0ZG93bi4gKi8KQEAgLTg0MCwxMyArODI5LDExIEBACiAJCQkJCQlmb3IgcGFja2V0IGRldGVjdGlvbiAqLwogCQkvKgkoNCkgUmVnODAwWzFdID0gMQllbmFibGUgcHJlYW1ibGUgcG93ZXIgc2F2aW5nICovCiAJCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfUkYwXSA9Ci0JCQlQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCByRlBHQTBfWEFCX1JGUGFyYW1ldGVyLAotCQkJCSAgICAgICBiTWFza0RXb3JkKTsKKwkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1hBQl9SRlBhcmFtZXRlcik7CiAJCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfUkYxXSA9Ci0JCQlQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwKLQkJCQkgICAgICAgYk1hc2tEV29yZCk7CisJCQlydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlKTsKIAkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19SRjJdID0KLQkJCVBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYk1hc2tEV29yZCk7CisJCQlydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCk7CiAJCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMlQyUikgewogCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsCiAJCQkJICAgICAweDM4MDAzOCwgMCk7CkBAIC04NTgsMTggKzg0NSwxNiBAQAogCiAJCS8qICAyIC5BRkUgY29udHJvbCByZWdpc3RlciB0byBwb3dlciBkb3duLiBiaXRbMzA6MjJdICovCiAJCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfQUZFMF0gPQotCQkJUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCBiTWFza0RXb3JkKTsKKwkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBKTsKIAkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgYk1hc2tEV29yZCwKLQkJCQkgICAgIDB4MDBEQjI1QTApOworCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDAwREIyNUEwKTsKIAkJZWxzZSBpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzFUMVIpCi0JCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCBiTWFza0RXb3JkLAotCQkJCSAgICAgMHgwMDFCMjVBMCk7CisJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4MDAxQjI1QTApOwogCiAJCS8qICAzLiBpc3N1ZSAzLXdpcmUgY29tbWFuZCB0aGF0IFJGIHNldCB0byBwb3dlciBkb3duLiovCi0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIDAsIGJSRlJlZ09mZnNldE1hc2ssIDApOworCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9BQywgYlJGUmVnT2Zmc2V0TWFzaywgMCk7CiAJCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMlQyUikKLQkJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0IsIDAsCisJCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9CLCBSRl9BQywKIAkJCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIDApOwogCiAJCS8qICA0LiBGb3JjZSBQRk0gLCBkaXNhYmxlIFNQUzE4X0xET19NYXJjb19CbG9jayAqLwpAQCAtOTQ5LDE0ICs5MzQsMTQgQEAKIAogCXN0YXR1cyA9IF9TVUNDRVNTOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiPT09PiB1c2JfaW5pcnBfaW5pdFxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiPT09PiB1c2JfaW5pcnBfaW5pdFxuIik7CiAKIAkvKiBpc3N1ZSBSeCBpcnAgdG8gcmVjZWl2ZSBkYXRhICovCiAJcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcHJlY3Zwcml2LT5wcmVjdl9idWY7CiAJZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZCVUZGOyBpKyspIHsKIAkJaWYgKHJ0bDg3MjNhdV9yZWFkX3BvcnQoQWRhcHRlciwgMCwgcHJlY3ZidWYpID09IF9GQUlMKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl9yeF9pbml0OiB1c2JfcmVhZF9wb3J0IGVycm9yXG4iKSk7CisJCQkJICJ1c2JfcnhfaW5pdDogdXNiX3JlYWRfcG9ydCBlcnJvclxuIik7CiAJCQlzdGF0dXMgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtOTY0LDcgKzk0OSw3IEBACiAJfQogCWlmIChydGw4NzIzYXVfcmVhZF9pbnRlcnJ1cHQoQWRhcHRlcikgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAoIiVzOiB1c2JfcmVhZF9pbnRlcnJ1cHQgZXJyb3JcbiIsIF9fZnVuY19fKSk7CisJCQkgIiVzOiB1c2JfcmVhZF9pbnRlcnJ1cHQgZXJyb3JcbiIsIF9fZnVuY19fKTsKIAkJc3RhdHVzID0gX0ZBSUw7CiAJfQogCXBIYWxEYXRhLT5JbnRyTWFza1swXSA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUkVHX1VTQl9ISU1SKTsKQEAgLTk3Myw3ICs5NTgsNyBAQAogCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUiwgcEhhbERhdGEtPkludHJNYXNrWzBdKTsKIGV4aXQ6CiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIjw9PT0gdXNiX2luaXJwX2luaXRcbiIpKTsKKwkJICI8PT09IHVzYl9pbmlycF9pbml0XG4iKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC05ODIsNyArOTY3LDcgQEAKIAlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIlxuID09PT4gdXNiX3J4X2RlaW5pdFxuIikpOworCQkgIj09PT4gdXNiX3J4X2RlaW5pdFxuIik7CiAJcnRsODcyM2F1X3JlYWRfcG9ydF9jYW5jZWwoQWRhcHRlcik7CiAJcEhhbERhdGEtPkludHJNYXNrWzBdID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSRUdfVVNCX0hJTVIpOwogCU1TR184NzIzQSgiJXMgcEhhbERhdGEtPkludHJNYXNrID0gMHglMDR4XG4iLCBfX2Z1bmNfXywKQEAgLTk5MCw3ICs5NzUsNyBAQAogCXBIYWxEYXRhLT5JbnRyTWFza1swXSA9IDB4MDsKIAlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfVVNCX0hJTVIsIHBIYWxEYXRhLT5JbnRyTWFza1swXSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIlxuIDw9PT0gdXNiX3J4X2RlaW5pdFxuIikpOworCQkgIjw9PT0gdXNiX3J4X2RlaW5pdFxuIik7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC0xMDM3LDExICsxMDIyLDEwIEBACiAJfQogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfbm90aWNlXywKLQkJICgiSGFsX0VmdXNlUGFyc2VNQUNBZGRyXzg3MjNBVTogUGVybWFuZW50IEFkZHJlc3MgPSUwMng6JTAyeDoiCi0JCSAgIiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgcEVFUFJPTS0+bWFjX2FkZHJbMF0sIHBFRVBST00tPm1hY19hZGRyWzFdLAotCQkgIHBFRVBST00tPm1hY19hZGRyWzJdLCBwRUVQUk9NLT5tYWNfYWRkclszXSwKLQkJICBwRUVQUk9NLT5tYWNfYWRkcls0XSwgcEVFUFJPTS0+bWFjX2FkZHJbNV0pKTsKKwkJICJIYWxfRWZ1c2VQYXJzZU1BQ0FkZHJfODcyM0FVOiBQZXJtYW5lbnQgQWRkcmVzcyA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSBwRUVQUk9NLT5tYWNfYWRkclswXSwgcEVFUFJPTS0+bWFjX2FkZHJbMV0sCisJCSBwRUVQUk9NLT5tYWNfYWRkclsyXSwgcEVFUFJPTS0+bWFjX2FkZHJbM10sCisJCSBwRUVQUk9NLT5tYWNfYWRkcls0XSwgcEVFUFJPTS0+bWFjX2FkZHJbNV0pOwogfQogCiBzdGF0aWMgdm9pZCByZWFkQWRhcHRlckluZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKQEAgLTExMDIsMTMgKzEwODYsNiBAQAogCXJlYWRBZGFwdGVySW5mbyhBZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgX1JlYWRSRlR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+cmZfY2hpcCA9IFJGXzYwNTI7Ci19Ci0KIC8qICAqLwogLyoJRGVzY3JpcHRpb246ICovCiAvKgkJV2Ugc2hvdWxkIHNldCBFZnVzZSBjZWxsIHNlbGVjdGlvbiB0byBXaUZpIGNlbGwgaW4gZGVmYXVsdC4gKi8KQEAgLTExMzgsMTIgKzExMTUsOCBAQAogCiAJaGFsX0VmdXNlQ2VsbFNlbChBZGFwdGVyKTsKIAotCV9SZWFkUkZUeXBlKEFkYXB0ZXIpOy8qIHJmX2NoaXAgLT4gX0luaXRSRlR5cGUoKSAqLwogCV9SZWFkUFJPTUNvbnRlbnQoQWRhcHRlcik7CiAKLQkvKiBNU0dfODcyM0EoIiVzKCkoZG9uZSksIHJmX2NoaXAgPSAweCV4LCByZl90eXBlID0gMHgleFxuIiwKLQkgICBfX2Z1bmNfXywgcEhhbERhdGEtPnJmX2NoaXAsIHBIYWxEYXRhLT5yZl90eXBlKTsgKi8KLQogCU1TR184NzIzQSgiPD09PT0gX1JlYWRBZGFwdGVySW5mbzg3MjNBVSBpbiAlZCBtc1xuIiwKIAkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogfQpAQCAtMTE5Miw4ICsxMTY1LDYgQEAKIAl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1dBUk5JTkcsICgiR2V0SGFsRGVmVmFyODE5MkNVc2IoKTogIgotCQkgICAiVW5rb3duIHZhcmlhYmxlOiAlZCFcbiIsIGVWYXJpYWJsZSkpOyAqLwogCQliUmVzdWx0ID0gX0ZBSUw7CiAJCWJyZWFrOwogCX0KQEAgLTEyMTEsNyArMTE4Miw3IEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXU4IGluaXRfcmF0ZSwgbmV0d29ya1R5cGUsIHJhaWQ7CisJdTggaW5pdF9yYXRlLCBuZXR3b3JrVHlwZSwgcmFpZCwgYXJnOwogCXUzMiBtYXNrLCByYXRlX2JpdG1hcDsKIAl1OCBzaG9ydEdJcmF0ZSA9IGZhbHNlOwogCWludCBzdXBwb3J0UmF0ZU51bTsKQEAgLTEyODMsMjcgKzEyNTQsMTUgQEAKIAogCWluaXRfcmF0ZSA9IGdldF9oaWdoZXN0X3JhdGVfaWR4MjNhKG1hc2spICYgMHgzZjsKIAotCWlmIChwSGFsRGF0YS0+ZndfcmFjdHJsID09IHRydWUpIHsKLQkJdTggYXJnID0gMDsKKwlhcmcgPSBtYWNfaWQgJiAweDFmOy8qIE1BQ0lEICovCisJYXJnIHw9IEJJVCg3KTsKIAotCQlhcmcgPSBtYWNfaWQgJiAweDFmOy8qIE1BQ0lEICovCisJaWYgKHNob3J0R0lyYXRlID09IHRydWUpCisJCWFyZyB8PSBCSVQoNSk7CiAKLQkJYXJnIHw9IEJJVCg3KTsKKwlEQkdfODcyM0EoInVwZGF0ZSByYWlkIGVudHJ5LCBtYXNrID0gMHgleCwgYXJnID0gMHgleFxuIiwgbWFzaywgYXJnKTsKIAotCQlpZiAoc2hvcnRHSXJhdGUgPT0gdHJ1ZSkKLQkJCWFyZyB8PSBCSVQoNSk7Ci0KLQkJREJHXzg3MjNBKCJ1cGRhdGUgcmFpZCBlbnRyeSwgbWFzayA9IDB4JXgsIGFyZyA9IDB4JXhcbiIsCi0JCQkgIG1hc2ssIGFyZyk7Ci0KLQkJcnRsODcyM2Ffc2V0X3JhaWRfY21kKHBhZGFwdGVyLCBtYXNrLCBhcmcpOwotCX0gZWxzZSB7Ci0JCWlmIChzaG9ydEdJcmF0ZSA9PSB0cnVlKQotCQkJaW5pdF9yYXRlIHw9IEJJVCg2KTsKLQotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAoUkVHX0lOSURBVEFfUkFURV9TRUwgKyBtYWNfaWQpLAotCQkJCSBpbml0X3JhdGUpOwotCX0KKwlydGw4NzIzYV9zZXRfcmFpZF9jbWQocGFkYXB0ZXIsIG1hc2ssIGFyZyk7CiAKIAkvKiBzZXQgcmFfaWQgKi8KIAlwc3RhLT5yYWlkID0gcmFpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9vcHNfbGludXguYwppbmRleCBhNmQxNmFkLi4zNzFlNmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX29wc19saW51eC5jCkBAIC0yOTcsMTQgKzI5NywxMiBAQAogCQljYXNlIC1FTk9ERVY6CiAJCWNhc2UgLUVTSFVURE9XTjoKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YlN1cnByaXNlUmVtb3ZlZCA9IgotCQkJCSAgInRydWVcbiIpKTsKKwkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YlN1cnByaXNlUmVtb3ZlZCA9dHJ1ZVxuIik7CiAJCQkvKiBGYWxsIFRocm91Z2ggaGVyZSAqLwogCQljYXNlIC1FTk9FTlQ6CiAJCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCA9IgotCQkJCSAgInRydWVcbiIpKTsKKwkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQgPXRydWVcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgLUVQUk9UTzoKIAkJCWJyZWFrOwpAQCAtMzY3LDE2ICszNjUsMTYgQEAKIAogCWRvIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJyZWN2YnVmMnJlY3ZmcmFtZTogcnhkZXNjID0gb2Zmc3NldCAwOjB4JTA4eCwgIgotCQkJICAiNDoweCUwOHgsIDg6MHglMDh4LCBDOjB4JTA4eFxuIiwgcHJ4c3RhdC0+cnhkdzAsCi0JCQkgIHByeHN0YXQtPnJ4ZHcxLCBwcnhzdGF0LT5yeGR3MiwgcHJ4c3RhdC0+cnhkdzQpKTsKKwkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHJ4ZGVzYyA9IG9mZnNzZXQgMDoweCUwOHgsIDQ6MHglMDh4LCA4OjB4JTA4eCwgQzoweCUwOHhcbiIsCisJCQkgcHJ4c3RhdC0+cnhkdzAsIHByeHN0YXQtPnJ4ZHcxLAorCQkJIHByeHN0YXQtPnJ4ZHcyLCBwcnhzdGF0LT5yeGR3NCk7CiAKIAkJcHJ4c3RhdCA9IChzdHJ1Y3QgcmVjdl9zdGF0ICopcGJ1ZjsKIAogCQlwcmVjdmZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYShwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJaWYgKCFwcmVjdmZyYW1lKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoInJlY3ZidWYycmVjdmZyYW1lOiBwcmVjdmZyYW1lID09IE5VTExcbiIpKTsKKwkJCQkgInJlY3ZidWYycmVjdmZyYW1lOiBwcmVjdmZyYW1lID09IE5VTExcbiIpOwogCQkJREJHXzg3MjNBKCIlcygpLSVkOiBydHdfYWxsb2NfcmVjdmZyYW1lMjNhKCkgZmFpbGVkISBSWCAiCiAJCQkJICAiRHJvcCFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlnb3RvIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwpAQCAtNDAwLDcgKzM5OCw3IEBACiAKIAkJaWYgKHBhdHRyaWItPnBrdF9sZW4gPD0gMCB8fCBwa3Rfb2Zmc2V0ID4gdHJhbnNmZXJfbGVuKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJyZWN2YnVmMnJlY3ZmcmFtZTogcGt0X2xlbjw9IDBcbiIpKTsKKwkJCQkgInJlY3ZidWYycmVjdmZyYW1lOiBwa3RfbGVuPD0gMFxuIik7CiAJCQlEQkdfODcyM0EoIiVzKCktJWQ6IFJYIFdhcm5pbmchXG4iLAogCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdmZyYW1lKTsKQEAgLTQ3MSw4ICs0NjksNyBAQAogCiAJCWlmIChydHdfcmVjdl9lbnRyeTIzYShwcmVjdmZyYW1lKSAhPSBfU1VDQ0VTUykKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgicmVjdmJ1ZjJyZWN2ZnJhbWU6IHJ0d19yZWN2X2VudHJ5MjNhIgotCQkJCSAgIihwcmVjdmZyYW1lKSAhPSBfU1VDQ0VTU1xuIikpOworCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHJ0d19yZWN2X2VudHJ5MjNhKHByZWN2ZnJhbWUpICE9IF9TVUNDRVNTXG4iKTsKIAogCQlwa3RfY250LS07CiAJCXRyYW5zZmVyX2xlbiAtPSBwa3Rfb2Zmc2V0OwpAQCAtNTIwLDE2ICs1MTcsMTUgQEAKIAlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCSAoInVzYl9yZWFkX3BvcnRfY29tcGxldGUhISFcbiIpKTsKKwkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlISEhXG4iKTsKIAogCXByZWN2cHJpdi0+cnhfcGVuZGluZ19jbnQtLTsKIAogCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKIAkgICAgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQoJWQpIE9SICIKLQkJCSAgImJTdXJwcmlzZVJlbW92ZWQoJWQpXG4iLCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkgIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSk7CisJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQoJWQpIE9SIGJTdXJwcmlzZVJlbW92ZWQoJWQpXG4iLAorCQkJIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwogCiAJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyEgYkRyaXZlclN0b3BwZWQoJWQpIE9SICIKIAkJCSAgImJTdXJwcmlzZVJlbW92ZWQoJWQpIGJSZWFkUG9ydENhbmNlbCglZClcbiIsCkBAIC01NDIsOSArNTM4LDcgQEAKIAkJaWYgKHB1cmItPmFjdHVhbF9sZW5ndGggPiBNQVhfUkVDVkJVRl9TWiB8fAogCQkgICAgcHVyYi0+YWN0dWFsX2xlbmd0aCA8IFJYREVTQ19TSVpFKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOiAocHVyYi0+YWN0dWFsXyIKLQkJCQkgICJsZW5ndGggPiBNQVhfUkVDVkJVRl9TWikgfHwgKHB1cmItPmFjdHVhbF8iCi0JCQkJICAibGVuZ3RoIDwgUlhERVNDX1NJWkUpXG4iKSk7CisJCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOiAocHVyYi0+YWN0dWFsX2xlbmd0aCA+IE1BWF9SRUNWQlVGX1NaKSB8fCAocHVyYi0+YWN0dWFsX2xlbmd0aCA8IFJYREVTQ19TSVpFKVxuIik7CiAJCQlydGw4NzIzYXVfcmVhZF9wb3J0KHBhZGFwdGVyLCAwLCBwcmVjdmJ1Zik7CiAJCQlEQkdfODcyM0EoIiVzKCktJWQ6IFJYIFdhcm5pbmchXG4iLAogCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKQEAgLTU2NCw4ICs1NTgsOCBAQAogCQl9CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlIDogcHVyYi0+c3RhdHVzKCVkKSAhPSAwIFxuIiwKLQkJCSAgcHVyYi0+c3RhdHVzKSk7CisJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGUgOiBwdXJiLT5zdGF0dXMoJWQpICE9IDBcbiIsCisJCQkgcHVyYi0+c3RhdHVzKTsKIAkJc2tiX3B1dChwcmVjdmJ1Zi0+cHNrYiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCXByZWN2YnVmLT5wc2tiID0gTlVMTDsKIApAQCAtNTgzLDE0ICs1NzcsMTIgQEAKIAkJY2FzZSAtRU5PREVWOgogCQljYXNlIC1FU0hVVERPV046CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJTdXJwcmlzZSIKLQkJCQkgICJSZW1vdmVkID0gdHJ1ZVxuIikpOworCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkID0gdHJ1ZVxuIik7CiAJCQkvKiBJbnRlbnRpb25hbCBmYWxsIHRocm91Z2ggaGVyZSAqLwogCQljYXNlIC1FTk9FTlQ6CiAJCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgidXNiX3JlYWRfcG9ydF9jb21wbGV0ZToiCi0JCQkJICAiYkRyaXZlclN0b3BwZWQgPSB0cnVlXG4iKSk7CisJCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkID0gdHJ1ZVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSAtRVBST1RPOgogCQljYXNlIC1FT1ZFUkZMT1c6CkBAIC02MjAsMTQgKzYxMiwxMyBAQAogCiAJaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ1c2JfcmVhZF9wb3J0OihwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwiCi0JCQkgICJwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkhISFcbiIpKTsKKwkJCSAidXNiX3JlYWRfcG9ydDoocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8cGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpISEhXG4iKTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KIAogCWlmICghcHJlY3ZidWYpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ1c2JfcmVhZF9wb3J0OnByZWN2YnVmID09IE5VTExcbiIpKTsKKwkJCSAidXNiX3JlYWRfcG9ydDpwcmVjdmJ1ZiA9PSBOVUxMXG4iKTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KIApAQCAtNjM4LDcgKzYyOSw4IEBACiAJaWYgKCFwcmVjdmJ1Zi0+cHNrYikgewogCQlwcmVjdmJ1Zi0+cHNrYiA9IG5ldGRldl9hbGxvY19za2IoYWRhcHRlci0+cG5ldGRldiwgTUFYX1JFQ1ZCVUZfU1ogKyBSRUNWQlVGRl9BTElHTl9TWik7CiAJCWlmIChwcmVjdmJ1Zi0+cHNrYiA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgKCJpbml0X3JlY3ZidWYoKTogYWxsb2Nfc2tiIGZhaWwhXG4iKSk7CisJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKKwkJCQkgImluaXRfcmVjdmJ1ZigpOiBhbGxvY19za2IgZmFpbCFcbiIpOwogCQkJcmV0dXJuIF9GQUlMOwogCQl9CiAKQEAgLTY2MSw4ICs2NTMsOCBAQAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmICgoZXJyKSAmJiAoZXJyICE9IC1FUEVSTSkpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJjYW5ub3Qgc3VibWl0IHJ4IGluLXRva2VuKGVyciA9IDB4JS44eCksIFVSQl9TVEFUVVMgIgotCQkJICAiPSAweCUuOHgiLCBlcnIsIHB1cmItPnN0YXR1cykpOworCQkJICJjYW5ub3Qgc3VibWl0IHJ4IGluLXRva2VuKGVyciA9IDB4JS44eCksIFVSQl9TVEFUVVMgPSAweCUuOHhcbiIsCisJCQkgZXJyLCBwdXJiLT5zdGF0dXMpOwogCQlEQkdfODcyM0EoImNhbm5vdCBzdWJtaXQgcnggaW4tdG9rZW4oZXJyID0gMHglMDh4KSwgdXJiX3N0YXR1cyAiCiAJCQkgICI9ICVkXG4iLCBlcnIsIHB1cmItPnN0YXR1cyk7CiAJCXJldCA9IF9GQUlMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5Q2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlDZmcuaAppbmRleCAyMjQ3ZDk4Li5iY2YzNjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlDZmcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlDZmcuaApAQCAtMTYsOSArMTYsNiBAQAogI2lmbmRlZiBfX0lOQ19IQUw4NzIzUEhZQ0ZHX0hfXwogI2RlZmluZSBfX0lOQ19IQUw4NzIzUEhZQ0ZHX0hfXwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTUFYX0FHR1JfTlVNCTB4MDkwOQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGVudW0gUkZfUkFESU9fUEFUSCB7CiAJUkZfUEFUSF9BID0gMCwJCQkvKiBSYWRpbyBQYXRoIEEgKi8KQEAgLTM5LDE1ICszNiw2IEBACiAJV0lSRUxFU1NfTU9ERV9BQwk9IEJJVCg2KQogfTsKIAotLyogQkIvUkYgcmVsYXRlZCAqLwotZW51bSByZl90eXBlXzgxOTBwIHsKLQlSRl9UWVBFX01JTiwJCS8qICAwICovCi0JUkZfODIyNSA9IDEsCQkvKiAgMSAxMWIvZyBSRiBmb3IgdmVyaWZpY2F0aW9uIG9ubHkgKi8KLQlSRl84MjU2ID0gMiwJCS8qICAyIDExYi9nL24gKi8KLQlSRl84MjU4ID0gMywJCS8qICAzIDExYS9iL2cvbiBSRiAqLwotCVJGXzYwNTIgPSA0LAkJLyogIDQgMTFiL2cvbiBSRiAqLwotfTsKLQogc3RydWN0IGJiX3JlZ19kZWZpbmUgewogCXUzMiByZmludGZzOwkJLyogIHNldCBzb2Z0d2FyZSBjb250cm9sOiAqLwogCQkJCS8qCQkweDg3MH4weDg3N1s4IGJ5dGVzXSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFZlckRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFZlckRlZi5oCmluZGV4IDYwN2I3MWYuLjJhMGU0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxWZXJEZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsVmVyRGVmLmgKQEAgLTUxLDMwICs1MSwxNyBAQAogCUNISVBfVkVORE9SX1VNQwkJPQkxLAogfTsKIAotZW51bSBoYWxfcmZfdHlwZSB7Ci0JUkZfVFlQRV8xVDFSCT0JMCwKLQlSRl9UWVBFXzFUMlIJPQkxLAotCVJGX1RZUEVfMlQyUgk9CTIsCi0JUkZfVFlQRV8yVDNSCT0JMywKLQlSRl9UWVBFXzJUNFIJPQk0LAotCVJGX1RZUEVfM1QzUgk9CTUsCi0JUkZfVFlQRV8zVDRSCT0JNiwKLQlSRl9UWVBFXzRUNFIJPQk3LAotfTsKLQogc3RydWN0IGhhbF92ZXJzaW9uIHsKIAllbnVtIGhhbF9pY190eXBlCUlDVHlwZTsKIAllbnVtIGhhbF9jaGlwX3R5cGUJQ2hpcFR5cGU7CiAJZW51bSBoYWxfY3V0X3ZlcnNpb24JQ1VUVmVyc2lvbjsKIAllbnVtIGhhbF92ZW5kb3IJCVZlbmRvclR5cGU7Ci0JZW51bSBoYWxfcmZfdHlwZQlSRlR5cGU7CiAJdTgJCQlST01WZXI7CiB9OwogCiAvKiAgR2V0IGVsZW1lbnQgKi8KICNkZWZpbmUgR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKQkoKHZlcnNpb24pLklDVHlwZSkKICNkZWZpbmUgR0VUX0NWSURfQ0hJUF9UWVBFKHZlcnNpb24pCSgodmVyc2lvbikuQ2hpcFR5cGUpCi0jZGVmaW5lIEdFVF9DVklEX1JGX1RZUEUodmVyc2lvbikJKCh2ZXJzaW9uKS5SRlR5cGUpCiAjZGVmaW5lIEdFVF9DVklEX01BTlVGQUNUVUVSKHZlcnNpb24pCSgodmVyc2lvbikuVmVuZG9yVHlwZSkKICNkZWZpbmUgR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikJKCh2ZXJzaW9uKS5DVVRWZXJzaW9uKQogI2RlZmluZSBHRVRfQ1ZJRF9ST01fVkVSU0lPTih2ZXJzaW9uKQkoKCh2ZXJzaW9uKS5ST01WZXIpICYgUk9NX1ZFUlNJT05fTUFTSykKQEAgLTEwOCwxNyArOTUsOCBAQAogI2RlZmluZSBJU19DSElQX1ZFTkRPUl9VTUModmVyc2lvbikJCVwKIAkoKEdFVF9DVklEX01BTlVGQUNUVUVSKHZlcnNpb24pID09IENISVBfVkVORE9SX1VNQykgPyB0cnVlIDogZmFsc2UpCiAKLSNkZWZpbmUgSVNfMVQxUih2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX1JGX1RZUEUodmVyc2lvbikgPT0gUkZfVFlQRV8xVDFSKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSVNfMVQyUih2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX1JGX1RZUEUodmVyc2lvbikgPT0gUkZfVFlQRV8xVDJSKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSVNfMlQyUih2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX1JGX1RZUEUodmVyc2lvbikgPT0gUkZfVFlQRV8yVDJSKSA/IHRydWUgOiBmYWxzZSkKLQogLyogQ2hpcCB2ZXJzaW9uIE1hY3JvLiAtLSAqLwogCi0jZGVmaW5lIElTXzkyQ19TRVJJQUwodmVyc2lvbikJCQkJCVwKLQkoKElTXzgxWFhDKHZlcnNpb24pICYmIElTXzJUMlIodmVyc2lvbikpID8gdHJ1ZSA6IGZhbHNlKQogI2RlZmluZSBJU184MXh4Q19WRU5ET1JfVU1DX0FfQ1VUKHZlcnNpb24pCQkJXAogCShJU184MVhYQyh2ZXJzaW9uKT8oSVNfQ0hJUF9WRU5ET1JfVU1DKHZlcnNpb24pID8JXAogCShJU19BX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSkgOiBmYWxzZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfY29tLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2NvbS5oCmluZGV4IDdjMzE4NjUuLjljNTAzMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfY29tLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9jb20uaApAQCAtNjUsMzYgKzY1LDYgQEAKICNkZWZpbmUgUkFURV8zNk0JCQkJQklUKDkpCiAjZGVmaW5lIFJBVEVfNDhNCQkJCUJJVCgxMCkKICNkZWZpbmUgUkFURV81NE0JCQkJQklUKDExKQotLyogTUNTIDEgU3BhdGlhbCBTdHJlYW0gKi8KLSNkZWZpbmUgUkFURV9NQ1MwCQkJCUJJVCgxMikKLSNkZWZpbmUgUkFURV9NQ1MxCQkJCUJJVCgxMykKLSNkZWZpbmUgUkFURV9NQ1MyCQkJCUJJVCgxNCkKLSNkZWZpbmUgUkFURV9NQ1MzCQkJCUJJVCgxNSkKLSNkZWZpbmUgUkFURV9NQ1M0CQkJCUJJVCgxNikKLSNkZWZpbmUgUkFURV9NQ1M1CQkJCUJJVCgxNykKLSNkZWZpbmUgUkFURV9NQ1M2CQkJCUJJVCgxOCkKLSNkZWZpbmUgUkFURV9NQ1M3CQkJCUJJVCgxOSkKLS8qIE1DUyAyIFNwYXRpYWwgU3RyZWFtICovCi0jZGVmaW5lIFJBVEVfTUNTOAkJCQlCSVQoMjApCi0jZGVmaW5lIFJBVEVfTUNTOQkJCQlCSVQoMjEpCi0jZGVmaW5lIFJBVEVfTUNTMTAJCQkJQklUKDIyKQotI2RlZmluZSBSQVRFX01DUzExCQkJCUJJVCgyMykKLSNkZWZpbmUgUkFURV9NQ1MxMgkJCQlCSVQoMjQpCi0jZGVmaW5lIFJBVEVfTUNTMTMJCQkJQklUKDI1KQotI2RlZmluZSBSQVRFX01DUzE0CQkJCUJJVCgyNikKLSNkZWZpbmUgUkFURV9NQ1MxNQkJCQlCSVQoMjcpCi0KLS8qICBBTEwgQ0NLIFJhdGUgKi8KLSNkZWZpbmUJUkFURV9BTExfQ0NLCShSQVRSXzFNIHwgUkFUUl8yTSB8IFJBVFJfNTVNIHwgUkFUUl8xMU0pCi0jZGVmaW5lCVJBVEVfQUxMX09GRE1fQUcJCQkJXAotCShSQVRSXzZNIHwgUkFUUl85TSB8IFJBVFJfMTJNIHwgUkFUUl8xOE0gfCBSQVRSXzI0TXwgXAotCSBSQVRSXzM2TXxSQVRSXzQ4TXxSQVRSXzU0TSkKLSNkZWZpbmUJUkFURV9BTExfT0ZETV8xU1MJCQkJXAotCShSQVRSX01DUzAgfCBSQVRSX01DUzEgfCBSQVRSX01DUzIgfCBSQVRSX01DUzMgfAlcCi0JIFJBVFJfTUNTNCB8IFJBVFJfTUNTNSB8IFJBVFJfTUNTNiB8IFJBVFJfTUNTNykKLSNkZWZpbmUJUkFURV9BTExfT0ZETV8yU1MJCQkJXAotCShSQVRSX01DUzggfCBSQVRSX01DUzkgfCBSQVRSX01DUzEwIHwgUkFUUl9NQ1MxMXwJXAotCSBSQVRSX01DUzEyIHwgUkFUUl9NQ1MxMyB8IFJBVFJfTUNTMTQgfCBSQVRSX01DUzE1KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUeCBEZXNjIGRlZmluaXRpb24gTWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIHByYWdtYSBtYXJrIC0tIFR4IERlc2MgcmVsYXRlZCBkZWZpbml0aW9uLiAtLSAqLwpAQCAtMTQ2LDcgKzExNiw2IEBACiAjZGVmaW5lIFJFR19OT0FfREVTQ19DT1VOVAkJCTB4MDVFQwogCiAjaW5jbHVkZSAiSGFsVmVyRGVmLmgiCi12b2lkIGR1bXBfY2hpcF9pbmZvMjNhKHN0cnVjdCBoYWxfdmVyc2lvbglDaGlwVmVyc2lvbik7CiAKIAogdTgJLyogcmV0dXJuIHRoZSBmaW5hbCBjaGFubmVsIHBsYW4gZGVjaXNpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfaW50Zi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmgKaW5kZXggNDA0YWNiNS4uYjkyNGQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmgKQEAgLTE4LDEzICsxOCw2IEBACiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogCi1lbnVtIFJUTDg3MVhfSENJX1RZUEUgewotCVJUV19QQ0lFCT0gQklUKDApLAotCVJUV19VU0IJCT0gQklUKDEpLAotCVJUV19TRElPCT0gQklUKDIpLAotCVJUV19HU1BJCT0gQklUKDMpLAotfTsKLQogZW51bSBfQ0hJUF9UWVBFIHsKIAlOVUxMX0NISVBfVFlQRSwKIAlSVEw4NzEyXzgxODhTXzgxOTFTXzgxOTJTLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2llZWU4MDIxMS5oCmluZGV4IGNiMjNjZDAuLjNhYTQwYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaWVlZTgwMjExLmgKQEAgLTE3MSwyMCArMTcxLDYgQEAKICNkZWZpbmUgV0xBTl9SRUFTT05fSk9JTl9XUk9OR19DSEFOTkVMICAgICAgIDY1NTM0CiAjZGVmaW5lIFdMQU5fUkVBU09OX0VYUElSQVRJT05fQ0hLIDY1NTM1CiAKLQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMICgxPDwwKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSAoMTw8MSkKLSNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFICgxPDwyKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURSAoMTw8MykKLSNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSyAweDcKLQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQotCi0jZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQotCiAjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4JCQk0CiAjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTgk4CiAKQEAgLTI2NSw5ICsyNTEsNiBAQAogPiAwOiBUSUQKICovCiAKLSNkZWZpbmUgTUFDX0ZNVCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiCi0jZGVmaW5lIE1BQ19BUkcoeCkgKCh1OCopKHgpKVswXSwoKHU4KikoeCkpWzFdLCgodTgqKSh4KSlbMl0sKCh1OCopKHgpKVszXSwoKHU4KikoeCkpWzRdLCgodTgqKSh4KSlbNV0KLQogI2RlZmluZSBNQVhUSUQJMTYKIAogI2RlZmluZSBXTUVfT1VJX1RZUEUgMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbS5oCmluZGV4IDVhMDU2MWUuLjI0ZjJmMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtLmgKQEAgLTE1OCwyNyArMTU4LDYgQEAKIAl1MzIJQ250X0JXX0xTQzsJLyogR2FyeSAqLwogfTsKIAotc3RydWN0IHByaV9jY2EgewotCXU4CQlQcmlDQ0FfZmxhZzsKLQl1OAkJaW50Zl9mbGFnOwotCXU4CQlpbnRmX3R5cGU7Ci0JdTgJCUR1cFJUU19mbGFnOwotCXU4CQlNb25pdG9yX2ZsYWc7Ci19OwotCi1zdHJ1Y3QgcnhfaHAgewotCXU4CQlSWEhQX2ZsYWc7Ci0JdTgJCVBTRF9mdW5jX3RyaWdnZXI7Ci0JdTgJCVBTRF9iaXRtYXBfUlhIUFs4MF07Ci0JdTgJCVByZV9JR0k7Ci0JdTgJCUN1cl9JR0k7Ci0JdTgJCVByZV9wd190aDsKLQl1OAkJQ3VyX3B3X3RoOwotCWJvb2wJCUZpcnN0X3RpbWVfZW50ZXI7Ci0JYm9vbAkJUlhIUF9lbmFibGU7Ci0JdTgJCVRQX01vZGU7Ci19OwotCiAjZGVmaW5lIEFTU09DSUFURV9FTlRSWV9OVU0JCQkJCTMyIC8qICBNYXggc2l6ZSBvZiBBc29jRW50cnlbXS4gKi8KICNkZWZpbmUJT0RNX0FTU09DSUFURV9FTlRSWV9OVU0JCQkJQVNTT0NJQVRFX0VOVFJZX05VTQogCkBAIC0yMjcsNyArMjA2LDYgQEAKIAogc3RydWN0IGVkY2FfdHVyYm8gewogCWJvb2wgYkN1cnJlbnRUdXJib0VEQ0E7Ci0JYm9vbCBiSXNDdXJSRExTdGF0ZTsKIAl1MzIJcHJ2X3RyYWZmaWNfaWR4OyAvKiAgZWRjYSB0dXJibyAqLwogfTsKIApAQCAtMjk4LDE4ICsyNzYsMTQgQEAKIAkvKiAgRml4ZWQgdmFsdWU6ICovCiAJLyogICovCiAKLQlPRE1fQ01OSU5GT19QTEFURk9STSA9IDAsCi0JT0RNX0NNTklORk9fSU5URVJGQUNFLAkJCQkvKiAgZW51bSBvZG1faW50ZXJmYWNlX2RlZiAqLwotCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUCwKLQlPRE1fQ01OSU5GT19JQ19UWVBFLAkJCQkJLyogIGVudW0gb2RtX2ljX3R5cGVfZGVmICovCi0JT0RNX0NNTklORk9fQ1VUX1ZFUiwJCQkJCS8qICBlbnVtIG9kbV9jdXRfdmVyc2lvbiAqLwotCU9ETV9DTU5JTkZPX0ZBQl9WRVIsCQkJCQkvKiAgZW51bSBvZG1fZmFiX3ZlcnNpb24gKi8KLQlPRE1fQ01OSU5GT19SRl9UWVBFLAkJCQkJLyogIGVudW0gcmZfcGF0aF9kZWYgb3IgZW51bSBvZG1fcmZfdHlwZT8gKi8KLQlPRE1fQ01OSU5GT19CT0FSRF9UWVBFLAkJCQkvKiAgZW51bSBvZG1fYm9hcmRfdHlwZSAqLwotCU9ETV9DTU5JTkZPX0VYVF9MTkEsCQkJCQkvKiAgdHJ1ZSAqLworCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUCA9IDIsCisJT0RNX0NNTklORk9fSUNfVFlQRSwJCQkvKiAgZW51bSBvZG1faWNfdHlwZV9kZWYgKi8KKwlPRE1fQ01OSU5GT19DVVRfVkVSLAkJCS8qICBlbnVtIG9kbV9jdXRfdmVyc2lvbiAqLworCU9ETV9DTU5JTkZPX0ZBQl9WRVIsCQkJLyogIGVudW0gb2RtX2ZhYl92ZXJzaW9uICovCisJT0RNX0NNTklORk9fQk9BUkRfVFlQRSwJCQkvKiAgZW51bSBvZG1fYm9hcmRfdHlwZSAqLworCU9ETV9DTU5JTkZPX0VYVF9MTkEsCQkJLyogIHRydWUgKi8KIAlPRE1fQ01OSU5GT19FWFRfUEEsCiAJT0RNX0NNTklORk9fRVhUX1RSU1csCi0JT0RNX0NNTklORk9fUEFUQ0hfSUQsCQkJCS8qIENVU1RPTUVSIElEICovCiAJT0RNX0NNTklORk9fQklOSENUX1RFU1QsCiAJT0RNX0NNTklORk9fQldJRklfVEVTVCwKIAlPRE1fQ01OSU5GT19TTUFSVF9DT05DVVJSRU5ULApAQCAtMzQ4LDI5ICszMjIsNyBAQAogLyogIERlZmluZSBPRE0gc3VwcG9ydCBhYmlsaXR5LiAgT0RNX0NNTklORk9fQUJJTElUWSAqLwogZW51bSB7CiAJLyogIEJCIE9ETSBzZWN0aW9uIEJJVCAwLTE1ICovCi0JT0RNX0JCX0RJRwkJCQk9IEJJVCgwKSwKLQlPRE1fQkJfUkFfTUFTSwkJCQk9IEJJVCgxKSwKLQlPRE1fQkJfRFlOQU1JQ19UWFBXUgkJCT0gQklUKDIpLAotCU9ETV9CQl9GQV9DTlQJCQkJPSBCSVQoMyksCi0JT0RNX0JCX1JTU0lfTU9OSVRPUgkJCT0gQklUKDQpLAotCU9ETV9CQl9DQ0tfUEQJCQkJPSBCSVQoNSksCiAJT0RNX0JCX0FOVF9ESVYJCQkJPSBCSVQoNiksCi0JT0RNX0JCX1BXUl9TQVZFCQkJCT0gQklUKDcpLAotCU9ETV9CQl9QV1JfVFJBSU4JCQk9IEJJVCg4KSwKLQlPRE1fQkJfUkFURV9BREFQVElWRQkJCT0gQklUKDkpLAotCU9ETV9CQl9QQVRIX0RJVgkJCQk9IEJJVCgxMCksCi0JT0RNX0JCX1BTRAkJCQk9IEJJVCgxMSksCi0JT0RNX0JCX1JYSFAJCQkJPSBCSVQoMTIpLAotCi0JLyogIE1BQyBETSBzZWN0aW9uIEJJVCAxNi0yMyAqLwotCU9ETV9NQUNfRURDQV9UVVJCTwkJCT0gQklUKDE2KSwKLQlPRE1fTUFDX0VBUkxZX01PREUJCQk9IEJJVCgxNyksCi0KLQkvKiAgUkYgT0RNIHNlY3Rpb24gQklUIDI0LTMxICovCi0JT0RNX1JGX1RYX1BXUl9UUkFDSwkJCT0gQklUKDI0KSwKLQlPRE1fUkZfUlhfR0FJTl9UUkFDSwkJCT0gQklUKDI1KSwKLQlPRE1fUkZfQ0FMSUJSQVRJT04JCQk9IEJJVCgyNiksCi0KIH07CiAKIC8qCU9ETV9DTU5JTkZPX0lOVEVSRkFDRSAqLwpAQCAtNDA5LDcgKzM2MSw2IEBACiAJT0RNX1VNQwkJPQkxLAogfTsKIAotLyogIE9ETV9DTU5JTkZPX1JGX1RZUEUgKi8KIC8qICBGb3IgZXhhbXBsZSAxVDJSIChBK0FCID0gQklUMHxCSVQ0fEJJVDUpICovCiBlbnVtIHJmX3BhdGhfZGVmIHsKIAlPRE1fUkZfVFhfQQk9CUJJVCgwKSwKQEAgLTQyMiwxOCArMzczLDYgQEAKIAlPRE1fUkZfUlhfRAk9CUJJVCg3KSwKIH07CiAKLQotZW51bSBvZG1fcmZfdHlwZSB7Ci0JT0RNXzFUMVIJPQkwLAotCU9ETV8xVDJSCT0JMSwKLQlPRE1fMlQyUgk9CTIsCi0JT0RNXzJUM1IJPQkzLAotCU9ETV8yVDRSCT0JNCwKLQlPRE1fM1QzUgk9CTUsCi0JT0RNXzNUNFIJPQk2LAotCU9ETV80VDRSCT0JNywKLX07Ci0KIC8qICBPRE0gRHluYW1pYyBjb21tb24gaW5mbyB2YWx1ZSBkZWZpbml0aW9uICovCiAKIGVudW0gb2RtX21hY19waHlfbW9kZSB7CkBAIC01ODcsMzMgKzUyNiw2IEBACiAJdTgJYkRQUGF0aEJPSzsKIH07CiAKLS8qICBPRE0gRHluYW1pYyBjb21tb24gaW5mbyB2YWx1ZSBkZWZpbml0aW9uICovCi1zdHJ1Y3Qgb2RtX2ZhdF90IHsKLQl1OAlCc3NpZFs2XTsKLQl1OAlhbnRzZWxfcnhfa2VlcF8wOwotCXU4CWFudHNlbF9yeF9rZWVwXzE7Ci0JdTgJYW50c2VsX3J4X2tlZXBfMjsKLQl1MzIJYW50U3VtUlNTSVs3XTsKLQl1MzIJYW50UlNTSWNudFs3XTsKLQl1MzIJYW50QXZlUlNTSVs3XTsKLQl1OAlGQVRfU3RhdGU7Ci0JdTMyCVRyYWluSWR4OwotCXU4CWFudHNlbF9hW09ETV9BU1NPQ0lBVEVfRU5UUllfTlVNXTsKLQl1OAlhbnRzZWxfYltPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07Ci0JdTgJYW50c2VsX2NbT0RNX0FTU09DSUFURV9FTlRSWV9OVU1dOwotCXUzMglNYWluQW50X1N1bVtPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07Ci0JdTMyCUF1eEFudF9TdW1bT0RNX0FTU09DSUFURV9FTlRSWV9OVU1dOwotCXUzMglNYWluQW50X0NudFtPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07Ci0JdTMyCUF1eEFudF9DbnRbT0RNX0FTU09DSUFURV9FTlRSWV9OVU1dOwotCXU4CVJ4SWRsZUFudDsKLQlib29sCWJCZWNvbWVMaW5rZWQ7Ci19OwotCi1lbnVtIGZhdF9zdGF0ZSB7Ci0JRkFUX05PUk1BTF9TVEFURQkJPSAwLAotCUZBVF9UUkFJTklOR19TVEFURQkJPSAxLAotfTsKLQogZW51bSBhbnRfZGlmX3R5cGUgewogCU5PX0FOVERJVgkJCT0gMHhGRiwKIAlDR19UUlhfSFdfQU5URElWCQk9IDB4MDEsCkBAIC02MzYsNyArNTQ4LDYgQEAKIC8qICBPRE0gSEFORExFLCBEUklWRVIgTkVFRFMgTk9UIFRPIEhPT0stLS0tLS0gKi8KIAlib29sCQkJYkNja0hpZ2hQb3dlcjsKIAl1OAkJCVJGUGF0aFJ4RW5hYmxlOwkJLyogIE9ETV9DTU5JTkZPX1JGUEFUSF9FTkFCTEUgKi8KLQl1OAkJCUNvbnRyb2xDaGFubmVsOwogLyogIE9ETSBIQU5ETEUsIERSSVZFUiBORUVEUyBOT1QgVE8gSE9PSy0tLS0tLSAqLwogCiAvKiAxICBDT01NT04gSU5GT1JNQVRJT04gKi8KQEAgLTY0NSwxNiArNTU2LDEyIEBACiAvKiBIT09LIEJFRk9SRSBSRUcgSU5JVC0tLS0tLS0tLS0tICovCiAJLyogIE9ETSBTdXBwb3J0IEFiaWxpdHkgRElHL1JBVFIvVFhfUFdSX1RSQUNLLyChS6FLID0gMS8yLzMvoUsgKi8KIAl1MzIJCQlTdXBwb3J0QWJpbGl0eTsKLQkvKiAgT0RNIFBDSUUvVVNCL1NESU8vR1NQSSA9IDAvMS8yLzMgKi8KLQl1OAkJCVN1cHBvcnRJbnRlcmZhY2U7CiAJLyogIE9ETSBjb21wb3NpdGUgb3IgaW5kZXBlbmRlbnQuIEJpdCBvcmllbnRlZC8gOTJDKzkyRCsgLi4uLiBvciBhbnkgb3RoZXIgdHlwZSA9IDEvMi8zLy4uLiAqLwogCXUzMgkJCVN1cHBvcnRJQ1R5cGU7CiAJLyogIEN1dCBWZXJzaW9uIFRlc3RDaGlwL0EtY3V0L0ItY3V0Li4uID0gMC8xLzIvMy8uLi4gKi8KIAl1OAkJCUN1dFZlcnNpb247CiAJLyogIEZhYiBWZXJzaW9uIFRTTUMvVU1DID0gMC8xICovCiAJdTgJCQlGYWJWZXJzaW9uOwotCS8qICBSRiBUeXBlIDRUNFIvM1QzUi8yVDJSLzFUMlIvMVQxUi8uLi4gKi8KLQl1OAkJCVJGVHlwZTsKIAkvKiAgQm9hcmQgVHlwZSBOb3JtYWwvSGlnaFBvd2VyL01pbmlDYXJkL1NMSU0vQ29tYm8vLi4uID0gMC8xLzIvMy80Ly4uLiAqLwogCXU4CQkJQm9hcmRUeXBlOwogCS8qICB3aXRoIGV4dGVybmFsIExOQSAgTk8vWWVzID0gMC8xICovCkBAIC02NjMsNyArNTcwLDYgQEAKIAl1OAkJCUV4dFBBOwogCS8qICB3aXRoIGV4dGVybmFsIFRSU1cgIE5PL1llcyA9IDAvMSAqLwogCXU4CQkJRXh0VFJTVzsKLQl1OAkJCVBhdGNoSUQ7IC8qIEN1c3RvbWVyIElEICovCiAJYm9vbAkJCWJJbkhjdFRlc3Q7CiAJYm9vbAkJCWJXSUZJVGVzdDsKIApAQCAtNzAzLDE0ICs2MDksNiBAQAogCS8qICAyMDEyLzAxLzEyIE1IIEZvciBNUCwgd2UgbmVlZCB0byByZWR1Y2Ugb25lIGFycmF5IHBvaW50ZXIgZm9yIGRlZmF1bHQgcG9ydC4/PyAqLwogCXN0cnVjdCBzdGFfaW5mbyAqCQlwT0RNX1N0YUluZm9bT0RNX0FTU09DSUFURV9FTlRSWV9OVU1dOwogCi0JLyogICovCi0JLyogIDIwMTIvMDIvMTQgTUggQWRkIHRvIHNoYXJlIDg4RSByYSB3aXRoIG90aGVyIFNXIHRlYW0uICovCi0JLyogIFdlIG5lZWQgdG8gY29sZWxjdCBhbGwgc3VwcG9ydCBhYmlsaXQgdG8gYSBwcm9wZXIgYXJlYS4gKi8KLQkvKiAgKi8KLQlib29sCQkJCVJhU3VwcG9ydDg4RTsKLQotCS8qICBEZWZpbmUgLi4uLi4uLi4uLi4gKi8KLQogCS8qICBMYXRlc3QgcGFja2V0IHBoeSBpbmZvIChPRE0gd3JpdGUpICovCiAJc3RydWN0IG9kbV9waHlfZGJnX2luZm8JIFBoeURiZ0luZm87CiAJLyogUEhZX0lORk9fODhFCQlQaHlJbmZvOyAqLwpAQCAtNzI4LDExICs2MjYsOCBAQAogCS8qICAqLwogCS8qIE9ETSBTdHJ1Y3R1cmUgKi8KIAkvKiAgKi8KLQlzdHJ1Y3Qgb2RtX2ZhdF90CQlETV9GYXRUYWJsZTsKIAlzdHJ1Y3QgZGlnX3QJRE1fRGlnVGFibGU7CiAJc3RydWN0IGR5bmFtaWNfcHdyX3NhdgkJRE1fUFNUYWJsZTsKLQlzdHJ1Y3QgcHJpX2NjYQlETV9QcmlDQ0E7Ci0Jc3RydWN0IHJ4X2hwCQlETV9SWEhQX1RhYmxlOwogCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cwlGYWxzZUFsbUNudDsKIAlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMJRmxhc2VBbG1DbnRCdWRkeUFkYXB0ZXI7CiAJc3RydWN0IHN3X2FudF9zdwkJRE1fU1dBVF9UYWJsZTsKQEAgLTc0NSwzMiArNjQwLDExIEBACiAJLyogICovCiAKIAkvKiBQU0QgKi8KLQlib29sCQkJYlVzZXJBc3NpZ25MZXZlbDsKLQl1OAkJCVJTU0lfQlQ7CQkJLyogY29tZSBmcm9tIEJUICovCi0JYm9vbAkJCWJQU0RpblByb2Nlc3M7Ci0KLQkvKiBmb3IgcmF0ZSBhZGFwdGl2ZSwgaW4gZmFjdCwgIDg4Yy85MmMgZncgd2lsbCBoYW5kbGUgdGhpcyAqLwotCXU4CQkJYlVzZVJBTWFzazsKLQorCXU4CQkJUlNTSV9CVDsJCS8qIGNvbWUgZnJvbSBCVCAqLwogCXN0cnVjdCBvZG1fcmF0ZV9hZGFwdAlSYXRlQWRhcHRpdmU7CiAKIAogCXN0cnVjdCBvZG1fcmZfY2FsX3QJUkZDYWxpYnJhdGVJbmZvOwotCi0JLyogICovCi0JLyogIFRYIHBvd2VyIHRyYWNraW5nICovCi0JLyogICovCi0JdTgJCQlCYlN3aW5nSWR4T2ZkbTsKLQl1OAkJCUJiU3dpbmdJZHhPZmRtQ3VycmVudDsKLQl1OAkJCUJiU3dpbmdJZHhPZmRtQmFzZTsKLQlib29sCQkJQmJTd2luZ0ZsYWdPZmRtOwotCXU4CQkJQmJTd2luZ0lkeENjazsKLQl1OAkJCUJiU3dpbmdJZHhDY2tDdXJyZW50OwotCXU4CQkJQmJTd2luZ0lkeENja0Jhc2U7Ci0JYm9vbAkJCUJiU3dpbmdGbGFnQ2NrOwotCS8qICAqLwotCS8qICBPRE0gc3lzdGVtIHJlc291cmNlLiAqLwotCS8qICAqLwogfTsJLyogIERNX0R5bmFtaWNfTWVjaGFuaXNtX1N0cnVjdHVyZSAqLwogCiBlbnVtIG9kbV9yZl9jb250ZW50IHsKQEAgLTk4Myw2ICs4NTcsNCBAQAogCiBib29sIE9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbihzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IG1vZGUpOwogCi12b2lkIG9kbV9kdGMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0NvbmZpZzg3MjNBLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0NvbmZpZzg3MjNBLmgKaW5kZXggYTZjZmI2ZC4uZjJhNTRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9SZWdDb25maWc4NzIzQS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnQ29uZmlnODcyM0EuaApAQCAtMjAsOSArMjAsOCBAQAogCiB2b2lkIG9kbV9Db25maWdNQUNfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQWRkciwgdTggRGF0YSk7CiAKLXZvaWQgb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBBZGRyLAotCQkJICAgIHUzMiBCaXRtYXNrLCB1MzIgRGF0YSk7Cit2b2lkIG9kbV9Db25maWdCQl9BR0NfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgYWRkciwgdTMyIGRhdGEpOwogCi12b2lkIG9kbV9Db25maWdCQl9QSFlfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQWRkciwgdTMyIEJpdG1hc2ssIHUzMiBEYXRhKTsKK3ZvaWQgb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSk7CiAKICNlbmRpZiAvKiAgZW5kIG9mIFNVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oCmluZGV4IGVhMzUwNzAuLjFkM2JmMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaApAQCAtNTQsMTcgKzU0LDYgQEAKIC8qICA9PT09PT09PT09PSBFWHRlcm4gRnVuY3Rpb24gUHJvdG90eXBlICovCiAvKiAgKi8KIAotCi11OCBPRE1fUmVhZDFCeXRlKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpOwotdTE2IE9ETV9SZWFkMkJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkcik7Ci11MzIgT0RNX1JlYWQ0Qnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKTsKLXZvaWQgT0RNX1dyaXRlMUJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTggRGF0YSk7Ci12b2lkIE9ETV9Xcml0ZTJCeXRlKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUxNiBEYXRhKTsKLXZvaWQgT0RNX1dyaXRlNEJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTMyIERhdGEpOwotdm9pZCBPRE1fU2V0TUFDUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7Ci11MzIgT0RNX0dldE1BQ1JlZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzayk7Ci12b2lkIE9ETV9TZXRCQlJlZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaywgdTMyIERhdGEpOwotdTMyIE9ETV9HZXRCQlJlZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzayk7CiB2b2lkIE9ETV9TZXRSRlJlZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLAogCQkgIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaywgdTMyIERhdGEpOwogdTMyIE9ETV9HZXRSRlJlZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2hhbC5oCmluZGV4IGUxNDYzMzYuLmFkM2E0NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9oYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfaGFsLmgKQEAgLTI3MCw3ICsyNzAsNiBAQAogCXUxNglCYXNpY1JhdGVTZXQ7CiAKIAkvKiByZl9jdHJsICovCi0JdTgJcmZfY2hpcDsKIAl1OAlyZl90eXBlOwogCXU4CU51bVRvdGFsUkZQYXRoOwogCkBAIC0zNDgsNyArMzQ3LDYgQEAKIAkvKiBmb3IgaG9zdCBtZXNzYWdlIHRvIGZ3ICovCiAJdTgJTGFzdEhNRUJveE51bTsKIAotCXU4CWZ3X3JhY3RybDsKIAl1OAlSZWdUeFBhdXNlOwogCS8qICBCZWFjb24gZnVuY3Rpb24gcmVsYXRlZCBnbG9iYWwgdmFyaWFibGUuICovCiAJdTgJUmVnRndId1R4UUN0cmw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2RlYnVnLmgKaW5kZXggYjZiMDE3My4uMTU5MTgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZGVidWcuaApAQCAtMTYzLDE0ICsxNjMsMTMgQEAKIAogZXh0ZXJuIHUzMiBHbG9iYWxEZWJ1Z0xldmVsMjNBOwogCitfX3ByaW50ZigzLCA0KQordm9pZCBydF90cmFjZShpbnQgY29tcCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKLSNkZWZpbmUgUlRfVFJBQ0UoX0NvbXAsIF9MZXZlbCwgRm10KQkJCQkJXAorI2RlZmluZSBSVF9UUkFDRShfQ29tcCwgX0xldmVsLCBGbXQsIC4uLikJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoX0xldmVsIDw9IEdsb2JhbERlYnVnTGV2ZWwyM0EpIHsJCQkJXAotCQlwcl9pbmZvKCIlcyBbMHglMDh4LCVkXSIsIERSSVZFUl9QUkVGSVgsCQlcCi0JCQkgKHVuc2lnbmVkIGludClfQ29tcCwgX0xldmVsKTsJCQlcCi0JCXByX2luZm8gRm10OwkJCQkJCVwKLQl9CQkJCQkJCQlcCisJaWYgKF9MZXZlbCA8PSBHbG9iYWxEZWJ1Z0xldmVsMjNBKQkJCQlcCisJCXJ0X3RyYWNlKF9Db21wLCBfTGV2ZWwsIEZtdCwgIyNfX1ZBX0FSR1NfXyk7CQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFJUX1BSSU5UX0RBVEEoX0NvbXAsIF9MZXZlbCwgX1RpdGxlU3RyaW5nLCBfSGV4RGF0YSwJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL2lvY3RsX2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jCmluZGV4IDUzN2JkODIuLmIxMzllZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL2lvY3RsX2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvaW9jdGxfY2ZnODAyMTEuYwpAQCAtNzI5LDcgKzcyOSw3IEBACiAJaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKIAkgICAga2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfZXJyXywKLQkJCSAoIndwYV9zZXRfZW5jcnlwdGlvbiwgY3J5cHQuYWxnID0gV0VQXG4iKSk7CisJCQkgIndwYV9zZXRfZW5jcnlwdGlvbiwgY3J5cHQuYWxnID0gV0VQXG4iKTsKIAkJREJHXzg3MjNBKCJ3cGFfc2V0X2VuY3J5cHRpb24sIGNyeXB0LmFsZyA9IFdFUFxuIik7CiAKIAkJaWYgKHBzZWN1cml0eXByaXYtPmJXZXBEZWZhdWx0S2V5SWR4U2V0ID09IDApIHsKQEAgLTEwNzYsOCArMTA3Niw3IEBACiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JREJHXzg3MjNBKCIlcyglcyk6IG1hYyA9IiBNQUNfRk1UICJcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lLAotCQkgIE1BQ19BUkcobWFjKSk7CisJREJHXzg3MjNBKCIlcyglcyk6IG1hYz0lcE1cbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBtYWMpOwogCiAJLyogZm9yIGluZnJhLi9QMlBDbGllbnQgbW9kZSAqLwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgpAQCAtMTA4NSw4ICsxMDg0LDggQEAKIAkJc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKIAogCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWFjLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSkgewotCQkJREJHXzg3MjNBKCIlcywgbWlzbWF0Y2ggYnNzaWQgPSIgTUFDX0ZNVCAiXG4iLCBfX2Z1bmNfXywKLQkJCQkgIE1BQ19BUkcoY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcykpOworCQkJREJHXzg3MjNBKCIlcywgbWlzbWF0Y2ggYnNzaWQ9JXBNXG4iLAorCQkJCSAgX19mdW5jX18sIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwogCQkJcmV0ID0gLUVOT0VOVDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtMTEyOCwxNCArMTEyNywxNCBAQAogCW9sZF9tb2RlID0gY3VyX25ldHdvcmstPm5ldHdvcmsuaWZtb2RlOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCIrJXM6IG9sZCA9JWQgbmV3ID0lZCBmd19zdGF0ZSA9IDB4JTA4eFxuIiwgX19mdW5jX18sCi0JCSAgb2xkX21vZGUsIGlmbW9kZSwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOworCQkgIislczogb2xkID0lZCBuZXcgPSVkIGZ3X3N0YXRlID0gMHglMDh4XG4iLCBfX2Z1bmNfXywKKwkJIG9sZF9tb2RlLCBpZm1vZGUsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogCiAJaWYgKG9sZF9tb2RlICE9IGlmbW9kZSkgewogCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIiBjaGFuZ2UgbW9kZSEiKSk7CisJCQkgImNoYW5nZSBtb2RlIVxuIik7CiAKIAkJaWYgKG9sZF9tb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CiAJCSAgICBvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfR08pIHsKQEAgLTExOTUsMTAgKzExOTQsNiBAQAogCiAJCS8qIFNlY0NsZWFyQWxsS2V5cyhhZGFwdGVyKTsgKi8KIAotCQkvKiBSVF9UUkFDRShDT01QX09JRF9TRVQsIERCR19MT1VELAotCQkgICAoInNldF9pbmZyYXN0cnVjdHVyZTogZndfc3RhdGU6JXggYWZ0ZXIgY2hhbmdpbmcgbW9kZVxuIiwgKi8KLQkJLyogZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOyAqLwotCiAJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogCX0KIApAQCAtMTYwMyw3ICsxNTk4LDcgQEAKIAkJCSAgcGllW2kgKyA0XSwgcGllW2kgKyA1XSwgcGllW2kgKyA2XSwgcGllW2kgKyA3XSk7CiAJaWYgKGllbGVuIDwgUlNOX0hFQURFUl9MRU4pIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfZXJyXywKLQkJCSAoIkllIGxlbiB0b28gc2hvcnQgJWRcbiIsIChpbnQpaWVsZW4pKTsKKwkJCSAiSWUgbGVuIHRvbyBzaG9ydCAlZFxuIiwgKGludClpZWxlbik7CiAJCXJldCA9IC0xOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTcyNiwxMSArMTcyMSwxMCBAQAogCQlydGw4NzIzYV9vZmZfcmNyX2FtKHBhZGFwdGVyKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfc2V0X3dwYV9pZTogcGFpcndpc2VfY2lwaGVyID0gMHglMDh4IHBhZGFwdGVyLT4iCi0JCSAgInNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9JWQgcGFkYXB0ZXItPiIKLQkJICAic2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9JWRcbiIsIHBhaXJ3aXNlX2NpcGhlciwKLQkJICBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzLAotCQkgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlKSk7CisJCSAicnR3X3NldF93cGFfaWU6IHBhaXJ3aXNlX2NpcGhlciA9IDB4JTA4eCBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0lZCBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9JWRcbiIsCisJCSBwYWlyd2lzZV9jaXBoZXIsCisJCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzLAorCQkgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGUpOwogCiBleGl0OgogCWlmIChyZXQpCkBAIC0xNzQ2LDcgKzE3NDAsNyBAQAogCiAJaWYgKGtleWlkID49IE5VTV9XRVBfS0VZUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczprZXlpZD40ID0+ZmFpbFxuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6a2V5aWQ+NCA9PmZhaWxcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xNzU1LDQ1ICsxNzQ5LDQ1IEBACiAJY2FzZSBXTEFOX0tFWV9MRU5fV0VQNDA6CiAJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIiVzOndlcC0+S2V5TGVuZ3RoID0gNVxuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6d2VwLT5LZXlMZW5ndGggPSA1XG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgV0xBTl9LRVlfTEVOX1dFUDEwNDoKIAkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIiVzOndlcC0+S2V5TGVuZ3RoID0gMTNcbiIsIF9fZnVuY19fKSk7CisJCQkgIiVzOndlcC0+S2V5TGVuZ3RoID0gMTNcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IDA7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCIlczp3ZXAtPktleUxlbmd0aCE9IDUgb3IgMTNcbiIsIF9fZnVuY19fKSk7CisJCQkgIiVzOndlcC0+S2V5TGVuZ3RoIT0gNSBvciAxM1xuIiwgX19mdW5jX18pOwogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOmJlZm9yZSBtZW1jcHksIHdlcC0+S2V5TGVuZ3RoID0gMHgleCBrZXlpZCA9JXhcbiIsCi0JCSAgX19mdW5jX18sIHdlcC0+a2V5bGVuLCBrZXlpZCkpOworCQkgIiVzOmJlZm9yZSBtZW1jcHksIHdlcC0+S2V5TGVuZ3RoID0gMHgleCBrZXlpZCA9JXhcbiIsCisJCSBfX2Z1bmNfXywgd2VwLT5rZXlsZW4sIGtleWlkKTsKIAogCW1lbWNweSgmcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0sIHdlcCwgc2l6ZW9mKHN0cnVjdCBydHdfd2VwX2tleSkpOwogCiAJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXggPSBrZXlpZDsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOnNlY3VyaXR5IGtleSBtYXRlcmlhbCA6ICIKLQkJICAiJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXhcbiIsIF9fZnVuY19fLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVswXSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMV0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzJdLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVszXSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNF0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzVdLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs2XSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbN10sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzhdLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs5XSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMTBdLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxMV0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzEyXSkpOworCQkgIiVzOnNlY3VyaXR5IGtleSBtYXRlcmlhbCA6ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLAorCQkgX19mdW5jX18sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMF0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMV0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMl0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbM10sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNF0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNV0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNl0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbN10sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbOF0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbOV0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMTBdLAorCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzExXSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxMl0pOwogCiAJcmVzID0gcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsIHBzZWN1cml0eXByaXYsIGtleWlkLCAxKTsKIApAQCAtMTgxNSw3ICsxODA5LDcgQEAKIAogCWlmIChwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLAotCQkJICgic2V0X3NzaWQ6IGh3X2luaXRfY29tcGxldGVkID09IGZhbHNlID0+ZXhpdCEhIVxuIikpOworCQkJICJzZXRfc3NpZDogaHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UgPT5leGl0ISEhXG4iKTsKIAkJc3RhdHVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xODI4LDcgKzE4MjIsNyBAQAogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgic2V0X3NzaWQ6IF9GV19MSU5LRUR8fFdJRklfQURIT0NfTUFTVEVSX1NUQVRFXG4iKSk7CisJCQkgInNldF9zc2lkOiBfRldfTElOS0VEfHxXSUZJX0FESE9DX01BU1RFUl9TVEFURVxuIik7CiAKIAkJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PQogCQkgICAgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuICYmCkBAIC0xODM3LDkgKzE4MzEsOSBAQAogCQkJICAgIG5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbikpIHsKIAkJCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLAotCQkJCQkgX2Rydl9lcnJfLCAoIk5ldyBTU0lEIGlzIHNhbWUgU1NJRCwgIgotCQkJCQkJICAgICAiZndfc3RhdGUgPSAweCUwOHhcbiIsCi0JCQkJCQkgICAgIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKKwkJCQkJIF9kcnZfZXJyXywKKwkJCQkJICJOZXcgU1NJRCBpcyBzYW1lIFNTSUQsIGZ3X3N0YXRlID0gMHglMDh4XG4iLAorCQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7CiAKIAkJCQlpZiAocnR3X2lzX3NhbWVfaWJzczIzYShwYWRhcHRlciwgcG5ldHdvcmspKSB7CiAJCQkJCS8qCkBAIC0xODc1LDE1ICsxODY5LDE1IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIlNldCBTU0lEIG5vdCB0aGUgc2FtZSBzc2lkXG4iKSk7CisJCQkJICJTZXQgU1NJRCBub3QgdGhlIHNhbWUgc3NpZFxuIik7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoInNldF9zc2lkID1bJXNdIGxlbiA9IDB4JXhcbiIsCi0JCQkJICBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCQkgIG5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbikpOworCQkJCSAic2V0X3NzaWQgPVslc10gbGVuID0gMHgleFxuIiwKKwkJCQkgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCisJCQkJIG5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbik7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoImFzc29jX3NzaWQgPVslc10gbGVuID0gMHgleFxuIiwKLQkJCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkLAotCQkJCSAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWRfbGVuKSk7CisJCQkJICJhc3NvY19zc2lkID1bJXNdIGxlbiA9IDB4JXhcbiIsCisJCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkLAorCQkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4pOwogCiAJCQlydHdfZGlzYXNzb2NfY21kMjNhKHBhZGFwdGVyLCAwLCB0cnVlKTsKIApAQCAtMTk0Nyw3ICsxOTQxLDcgQEAKIAogZXhpdDoKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCi0JCSAoIi0lczogc3RhdHVzID0lZFxuIiwgX19mdW5jX18sIHN0YXR1cykpOworCQkgIi0lczogc3RhdHVzID0lZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTk4OSw3ICsxOTgzLDcgQEAKIAlEQkdfODcyM0EoInNzaWQgPSVzLCBsZW4gPSV6dVxuIiwgc21lLT5zc2lkLCBzbWUtPnNzaWRfbGVuKTsKIAogCWlmIChzbWUtPmJzc2lkKQotCQlEQkdfODcyM0EoImJzc2lkID0iIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhzbWUtPmJzc2lkKSk7CisJCURCR184NzIzQSgiYnNzaWQ9JXBNXG4iLCBzbWUtPmJzc2lkKTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSB7CiAJCXJldCA9IC1FQlVTWTsKQEAgLTI1MjMsOCArMjUxNyw4IEBACiAKIAkJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilkb3QxMV9oZHI7CiAKLQkJREJHXzg3MjNBKCJSVFdfVHg6ZGEgPSIgTUFDX0ZNVCAiIHZpYSAlcyglcylcbiIsCi0JCQkgIE1BQ19BUkcobWdtdC0+ZGEpLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7CisJCURCR184NzIzQSgiUlRXX1R4OmRhPSVwTSB2aWEgJXMoJXMpXG4iLAorCQkJICBtZ210LT5kYSwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwogCQljYXRlZ29yeSA9IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OwogCQlhY3Rpb24gPSBtZ210LT51LmFjdGlvbi51LndtZV9hY3Rpb24uYWN0aW9uX2NvZGU7CiAJCURCR184NzIzQSgiUlRXX1R4OmNhdGVnb3J5KCV1KSwgYWN0aW9uKCV1KVxuIiwKQEAgLTI4NzcsNyArMjg3MSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JREJHXzg3MjNBKCJmcmVlIHN0YSBtYWNhZGRyID0iIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhtYWMpKTsKKwlEQkdfODcyM0EoImZyZWUgc3RhIG1hY2FkZHI9JXBNXG4iLCBtYWMpOwogCiAJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hYykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzA1Myw4ICszMDQ3LDcgQEAKIAljZmc4MDIxMV9tZ210X3R4X3N0YXR1cyhwYWRhcHRlci0+cnR3X3dkZXYsICpjb29raWUsIGJ1ZiwgbGVuLCBhY2ssCiAJCQkJR0ZQX0tFUk5FTCk7CiAKLQlEQkdfODcyM0EoIlJUV19UeDp0eF9jaCA9JWQsIGRhID0iIE1BQ19GTVQgIlxuIiwgdHhfY2gsCi0JCSAgTUFDX0FSRyhoZHItPmRhKSk7CisJREJHXzg3MjNBKCJSVFdfVHg6dHhfY2ggPSVkLCBkYSA9JXBNXG4iLCB0eF9jaCwgaGRyLT5kYSk7CiAJY2F0ZWdvcnkgPSBoZHItPnUuYWN0aW9uLmNhdGVnb3J5OwogCWFjdGlvbiA9IGhkci0+dS5hY3Rpb24udS53bWVfYWN0aW9uLmFjdGlvbl9jb2RlOwogCURCR184NzIzQSgiUlRXX1R4OmNhdGVnb3J5KCV1KSwgYWN0aW9uKCV1KVxuIiwgY2F0ZWdvcnksIGFjdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9vc19pbnRmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvb3NfaW50ZnMuYwppbmRleCAxYjIzZWIxLi44MzY5NjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9vc19pbnRmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL29zX2ludGZzLmMKQEAgLTM0LDcgKzM0LDcgQEAKIE1PRFVMRV9GSVJNV0FSRSgicnRsd2lmaS9ydGw4NzIzYXVmd19CX05vQlQuYmluIik7CiAKIC8qIG1vZHVsZSBwYXJhbSBkZWZhdWx0cyAqLwotc3RhdGljIGludCBydHdfY2hpcF92ZXJzaW9uID0gMHgwMDsKK3N0YXRpYyBpbnQgcnR3X2NoaXBfdmVyc2lvbjsKIHN0YXRpYyBpbnQgcnR3X3JmaW50ZnMgPSBIV1BJOwogc3RhdGljIGludCBydHdfZGVidWcgPSAxOwogCkBAIC0zNDIsNyArMzQyLDcgQEAKIHsKIAlpZiAoZGV2X2FsbG9jX25hbWUocG5ldGRldiwgaWZuYW1lKSA8IDApIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiZGV2X2FsbG9jX25hbWUsIGZhaWwhXG4iKSk7CisJCQkgImRldl9hbGxvY19uYW1lLCBmYWlsIVxuIik7CiAJfQogCW5ldGlmX2NhcnJpZXJfb2ZmKHBuZXRkZXYpOwogCXJldHVybiAwOwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKIAotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiK2luaXRfbmV0X2RldlxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIraW5pdF9uZXRfZGV2XG4iKTsKIAogCXBuZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IHJ0d19hZGFwdGVyKSwgNCk7CiAJaWYgKCFwbmV0ZGV2KQpAQCAtNDU2LDExICs0NTYsMTEgQEAKIHsKIAlpbnQgcmV0OCA9IF9TVUNDRVNTOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCIrcnR3X2luaXRfZHJ2X3N3MjNhXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIitydHdfaW5pdF9kcnZfc3cyM2FcbiIpOwogCiAJaWYgKHJ0d19pbml0X2NtZF9wcml2MjNhKCZwYWRhcHRlci0+Y21kcHJpdikgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gQ2FuJ3QgaW5pdCBjbWRfcHJpdlxuIikpOworCQkJICJDYW4ndCBpbml0IGNtZF9wcml2XG4iKTsKIAkJcmV0OCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNDY5LDE0ICs0NjksMTQgQEAKIAogCWlmIChydHdfaW5pdF9ldnRfcHJpdjIzYSgmcGFkYXB0ZXItPmV2dHByaXYpID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuIENhbid0IGluaXQgZXZ0X3ByaXZcbiIpKTsKKwkJCSAiQ2FuJ3QgaW5pdCBldnRfcHJpdlxuIik7CiAJCXJldDggPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KIAogCWlmIChydHdfaW5pdF9tbG1lX3ByaXYyM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuIENhbid0IGluaXQgbWxtZV9wcml2XG4iKSk7CisJCQkgIkNhbid0IGluaXQgbWxtZV9wcml2XG4iKTsKIAkJcmV0OCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNDg0LDcgKzQ4NCw3IEBACiAKIAlpZiAoaW5pdF9tbG1lX2V4dF9wcml2MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiBDYW4ndCBpbml0IG1sbWVfZXh0X3ByaXZcbiIpKTsKKwkJCSAiQ2FuJ3QgaW5pdCBtbG1lX2V4dF9wcml2XG4iKTsKIAkJcmV0OCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNTIxLDQwICs1MjEsNDAgQEAKIAogZXhpdDoKIAotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiLXJ0d19pbml0X2Rydl9zdzIzYVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICItcnR3X2luaXRfZHJ2X3N3MjNhXG4iKTsKIAlyZXR1cm4gcmV0ODsKIH0KIAogdm9pZCBydHdfY2FuY2VsX2FsbF90aW1lcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQogewogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sCi0JCSAoIitydHdfY2FuY2VsX2FsbF90aW1lcjIzYVxuIikpOworCQkgIitydHdfY2FuY2VsX2FsbF90aW1lcjIzYVxuIik7CiAKIAlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyKTsKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlczpjYW5jZWwgYXNzb2NpYXRpb24gdGltZXIgY29tcGxldGUhXG4iLCBfX2Z1bmNfXykpOworCQkgIiVzOmNhbmNlbCBhc3NvY2lhdGlvbiB0aW1lciBjb21wbGV0ZSFcbiIsIF9fZnVuY19fKTsKIAogCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuc2Nhbl90b190aW1lcik7CiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6Y2FuY2VsIHNjYW5fdG9fdGltZXIhXG4iLCBfX2Z1bmNfXykpOworCQkgIiVzOmNhbmNlbCBzY2FuX3RvX3RpbWVyIVxuIiwgX19mdW5jX18pOwogCiAJZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lcik7CiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6Y2FuY2VsIGR5bmFtaWNfY2hrX3RpbWVyIVxuIiwgX19mdW5jX18pKTsKKwkJICIlczpjYW5jZWwgZHluYW1pY19jaGtfdGltZXIhXG4iLCBfX2Z1bmNfXyk7CiAKIAlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPnB3cmN0cmxwcml2LnB3cl9zdGF0ZV9jaGVja190aW1lcik7CiAKIAlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LnNldF9zY2FuX2RlbnlfdGltZXIpOwogCXJ0d19jbGVhcl9zY2FuX2RlbnkocGFkYXB0ZXIpOwogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOmNhbmNlbCBzZXRfc2Nhbl9kZW55X3RpbWVyIVxuIiwgX19mdW5jX18pKTsKKwkJICIlczpjYW5jZWwgc2V0X3NjYW5fZGVueV90aW1lciFcbiIsIF9fZnVuY19fKTsKIAogCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0YXRfdGltZXIpOwogfQogCiBpbnQgcnR3X2ZyZWVfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCiB7Ci0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCI9PT5ydHdfZnJlZV9kcnZfc3cyM2EiKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIj09PnJ0d19mcmVlX2Rydl9zdzIzYVxuIik7CiAKIAlmcmVlX21sbWVfZXh0X3ByaXYyM2EoJnBhZGFwdGVyLT5tbG1lZXh0cHJpdik7CiAKQEAgLTU3NCw3ICs1NzQsNyBAQAogCWtmcmVlKHBhZGFwdGVyLT5IYWxEYXRhKTsKIAlwYWRhcHRlci0+SGFsRGF0YSA9IE5VTEw7CiAKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIi1ydHdfZnJlZV9kcnZfc3cyM2FcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLXJ0d19mcmVlX2Rydl9zdzIzYVxuIik7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC01OTQsOCArNTk0LDggQEAKIAkJcmV0ID0gX0ZBSUw7CiAJCWdvdG8gZXJyb3JfcmVnaXN0ZXJfbmV0ZGV2OwogCX0KLQlEQkdfODcyM0EoIiVzLCBNQUMgQWRkcmVzcyAoaWYlZCkgPSAiIE1BQ19GTVQgIlxuIiwgX19mdW5jX18sCi0JCSAgKHBhZGFwdGVyLT5pZmFjZV9pZCArIDEpLCBNQUNfQVJHKHBuZXRkZXYtPmRldl9hZGRyKSk7CisJREJHXzg3MjNBKCIlcywgTUFDIEFkZHJlc3MgKGlmJWQpID0gJXBNXG4iLAorCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+aWZhY2VfaWQgKyAxLCBwbmV0ZGV2LT5kZXZfYWRkcik7CiAJcmV0dXJuIHJldDsKIAogZXJyb3JfcmVnaXN0ZXJfbmV0ZGV2OgpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJaW50IHJldCA9IDA7CiAJaW50IHN0YXR1czsKIAotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiKzg3MXhfZHJ2IC0gZGV2X29wZW5cbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiKzg3MXhfZHJ2IC0gZGV2X29wZW5cbiIpOwogCURCR184NzIzQSgiKzg3MXhfZHJ2IC0gZHJ2X29wZW4sIGJ1cCA9JWRcbiIsIHBhZGFwdGVyLT5idXApOwogCiAJbXV0ZXhfbG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPmh3X2luaXRfbXV0ZXgpOwpAQCAtNjYyLDEyICs2NjIsMTEgQEAKIAkJc3RhdHVzID0gcnRsODcyM2F1X2hhbF9pbml0KHBhZGFwdGVyKTsKIAkJaWYgKHN0YXR1cyA9PSBfRkFJTCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInJ0bDg3MXhfaGFsX2luaXQoKTogQ2FuJ3QgaW5pdCBoL3chXG4iKSk7CisJCQkJICJydGw4NzF4X2hhbF9pbml0KCk6IENhbid0IGluaXQgaC93IVxuIik7CiAJCQlnb3RvIG5ldGRldl9vcGVuMjNhX2Vycm9yOwogCQl9CiAKLQkJREJHXzg3MjNBKCJNQUMgQWRkcmVzcyA9ICJNQUNfRk1UIlxuIiwKLQkJCSAgTUFDX0FSRyhwbmV0ZGV2LT5kZXZfYWRkcikpOworCQlEQkdfODcyM0EoIk1BQyBBZGRyZXNzID0gJXBNXG4iLCBwbmV0ZGV2LT5kZXZfYWRkcik7CiAKIAkJaWYgKGluaXRfaHdfbWxtZV9leHQyM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7CiAJCQlEQkdfODcyM0EoImNhbid0IGluaXQgbWxtZV9leHRfcHJpdlxuIik7CkBAIC02OTUsNyArNjk0LDcgQEAKIAllbHNlCiAJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhwbmV0ZGV2KTsKIAotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiLTg3MXhfZHJ2IC0gZGV2X29wZW5cbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLTg3MXhfZHJ2IC0gZGV2X29wZW5cbiIpOwogCURCR184NzIzQSgiLTg3MXhfZHJ2IC0gZHJ2X29wZW4sIGJ1cCA9JWRcbiIsIHBhZGFwdGVyLT5idXApOwogZXhpdDoKIAltdXRleF91bmxvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5od19pbml0X211dGV4KTsKQEAgLTcwOCw3ICs3MDcsNyBAQAogCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhwbmV0ZGV2KTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJICgiLTg3MXhfZHJ2IC0gZGV2X29wZW4sIGZhaWwhXG4iKSk7CisJCSAiLTg3MXhfZHJ2IC0gZGV2X29wZW4sIGZhaWwhXG4iKTsKIAlEQkdfODcyM0EoIi04NzF4X2RydiAtIGRydl9vcGVuIGZhaWwsIGJ1cCA9JWRcbiIsIHBhZGFwdGVyLT5idXApOwogCiAJcmV0ID0gLTE7CkBAIC03MjksNyArNzI4LDcgQEAKIAlzdGF0dXMgPSBydGw4NzIzYXVfaGFsX2luaXQocGFkYXB0ZXIpOwogCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiaXBzX25ldGRydl9vcGVuKCk6IENhbid0IGluaXQgaC93IVxuIikpOworCQkJICJpcHNfbmV0ZHJ2X29wZW4oKTogQ2FuJ3QgaW5pdCBoL3chXG4iKTsKIAkJZ290byBuZXRkZXZfb3BlbjIzYV9lcnJvcjsKIAl9CiAKQEAgLTgwNyw3ICs4MDYsNyBAQAogewogCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiKzg3MXhfZHJ2IC0gZHJ2X2Nsb3NlXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIis4NzF4X2RydiAtIGRydl9jbG9zZVxuIik7CiAKIAlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IHRydWU7CiAKQEAgLTgzNSw3ICs4MzQsNyBAQAogCiAJcnR3X3NjYW5fYWJvcnQyM2EocGFkYXB0ZXIpOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItODcxeF9kcnYgLSBkcnZfY2xvc2VcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLTg3MXhfZHJ2IC0gZHJ2X2Nsb3NlXG4iKTsKIAlEQkdfODcyM0EoIi04NzF4X2RydiAtIGRydl9jbG9zZSwgYnVwID0lZFxuIiwgcGFkYXB0ZXItPmJ1cCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3JlY3ZfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3JlY3ZfbGludXguYwppbmRleCBiY2Q5NzBiLi4wODRiNTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9yZWN2X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvcmVjdl9saW51eC5jCkBAIC04MSwxOSArODEsMTkgQEAKIAlza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwogCWlmICghc2tiKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpza2IgPT0gTlVMTCEhISFcbiIpKTsKKwkJCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpza2IgPT0gTlVMTCEhISFcbiIpOwogCQlnb3RvIF9yZWN2X2luZGljYXRlcGt0X2Ryb3A7CiAJfQogCiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSgpOnNrYiAhPSBOVUxMICEhIVxuIikpOworCQkgInJ0d19yZWN2X2luZGljYXRlcGt0MjNhKCk6c2tiICE9IE5VTEwgISEhXG4iKTsKIAlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAoInJ0d19yZWN2X2luZGljYXRlcGt0MjNhKCk6cHJlY3ZfZnJhbWUtPmhkci5yeF9kYXRhID0lcFxuIiwKLQkJICBwcmVjdl9mcmFtZS0+cGt0LT5kYXRhKSk7CisJCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpwcmVjdl9mcmFtZS0+aGRyLnJ4X2RhdGEgPSVwXG4iLAorCQkgcHJlY3ZfZnJhbWUtPnBrdC0+ZGF0YSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJcbiBza2ItPmhlYWQgPSVwIHNrYi0+ZGF0YSA9JXAgc2tiLT50YWlsID0lcCBza2ItPmVuZCA9JXAgc2tiLT5sZW4gPSVkXG4iLAotCQkgIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAotCQkgIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgc2tiX2VuZF9wb2ludGVyKHNrYiksIHNrYi0+bGVuKSk7CisJCSAic2tiLT5oZWFkID0lcCBza2ItPmRhdGEgPSVwIHNrYi0+dGFpbCA9JXAgc2tiLT5lbmQgPSVwIHNrYi0+bGVuID0lZFxuIiwKKwkJIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAorCQkgc2tiX3RhaWxfcG9pbnRlcihza2IpLCBza2JfZW5kX3BvaW50ZXIoc2tiKSwgc2tiLT5sZW4pOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSA9PSB0cnVlKSB7CiAJCXN0cnVjdCBza19idWZmICpwc2tiMiA9IE5VTEw7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJlY3ZfZnJhbWUpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJcbiBydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSA6YWZ0ZXIgbmV0aWZfcnghISEhXG4iKSk7CisJCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EgOmFmdGVyIG5ldGlmX3J4ISEhIVxuIik7CiAJcmV0dXJuIF9TVUNDRVNTOwogCiBfcmVjdl9pbmRpY2F0ZXBrdF9kcm9wOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9pbnRmLmMKaW5kZXggMDU3NTViOC4uMjdiM2E1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2JfaW50Zi5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAogCWlmIChydHdfaW5pdF9pbnRmX3ByaXYocGR2b2JqcHJpdikgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gQ2FuJ3QgSU5JVCBydHdfaW5pdF9pbnRmX3ByaXZcbiIpKTsKKwkJCSAiQ2FuJ3QgSU5JVCBydHdfaW5pdF9pbnRmX3ByaXZcbiIpOwogCQlnb3RvIGZyZWVfZHZvYmo7CiAJfQogCS8qIDMgbWlzYyAqLwpAQCAtMjEzLDcgKzIxMyw3IEBACiAKIHZvaWQgcnRsODcyM2FfdXNiX2ludGZfc3RvcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQogewotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiK3VzYl9pbnRmX3N0b3BcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3VzYl9pbnRmX3N0b3BcbiIpOwogCiAJLyogZGlzYWJsZV9od19pbnRlcnJ1cHQgKi8KIAlpZiAoIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJICogVE9ETzoKIAkJICovCiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2VcbiIpKTsKKwkJCSAiU3VycHJpc2VSZW1vdmVkID09IGZhbHNlXG4iKTsKIAl9CiAKIAkvKiBjYW5jZWwgaW4gaXJwICovCkBAIC0yMzEsMTMgKzIzMSwxNCBAQAogCXJ0bDg3MjNhdV93cml0ZV9wb3J0X2NhbmNlbChwYWRhcHRlcik7CiAKIAkvKiB0b2RvOmNhbmNlbCBvdGhlciBpcnBzICovCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCItdXNiX2ludGZfc3RvcFxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICItdXNiX2ludGZfc3RvcFxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0d19kZXZfdW5sb2FkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IHN1Ym1pdF9jdHggKnBhY2tfdHhfb3BzID0gJnBhZGFwdGVyLT54bWl0cHJpdi5hY2tfdHhfb3BzOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiK3J0d19kZXZfdW5sb2FkXG4iKSk7CisKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kZXZfdW5sb2FkXG4iKTsKIAogCWlmIChwYWRhcHRlci0+YnVwKSB7CiAJCURCR184NzIzQSgiPT09PiBydHdfZGV2X3VubG9hZFxuIik7CkBAIC0yNjEsMTAgKzI2MiwxMCBAQAogCQlwYWRhcHRlci0+YnVwID0gZmFsc2U7CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoInI4NzF4X2Rldl91bmxvYWQoKTpwYWRhcHRlci0+YnVwID09IGZhbHNlXG4iKSk7CisJCQkgInI4NzF4X2Rldl91bmxvYWQoKTpwYWRhcHRlci0+YnVwID09IGZhbHNlXG4iKTsKIAl9CiAJREJHXzg3MjNBKCI8PT09IHJ0d19kZXZfdW5sb2FkXG4iKTsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIi1ydHdfZGV2X3VubG9hZFxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICItcnR3X2Rldl91bmxvYWRcbiIpOwogfQogCiBzdGF0aWMgaW50IHJ0d19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQpAQCAtNDM1LDcgKzQzNiw3IEBACiAJLyogc3RlcCA1LiAqLwogCWlmIChydHdfaW5pdF9kcnZfc3cyM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJJbml0aWFsaXplIGRyaXZlciBzb2Z0d2FyZSByZXNvdXJjZSBGYWlsZWQhXG4iKSk7CisJCQkgIkluaXRpYWxpemUgZHJpdmVyIHNvZnR3YXJlIHJlc291cmNlIEZhaWxlZCFcbiIpOwogCQlnb3RvIGZyZWVfaGFsX2RhdGE7CiAJfQogCkBAIC01MzMsMTMgKzUzNCwxMyBAQAogCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iajsKIAlpbnQgc3RhdHVzID0gX0ZBSUw7CiAKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIitydHdfZHJ2X2luaXRcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kcnZfaW5pdFxuIik7CiAKIAkvKiBJbml0aWFsaXplIGR2b2JqX3ByaXYgKi8KIAlkdm9iaiA9IHVzYl9kdm9ial9pbml0KHB1c2JfaW50Zik7CiAJaWYgKCFkdm9iaikgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiaW5pdGlhbGl6ZSBkZXZpY2Ugb2JqZWN0IHByaXYgRmFpbGVkIVxuIikpOworCQkJICJpbml0aWFsaXplIGRldmljZSBvYmplY3QgcHJpdiBGYWlsZWQhXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNTU0LDcgKzU1NSw3IEBACiAJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKIAkJZ290byBmcmVlX2lmMTsKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkgKCItODcxeF9kcnYgLSBkcnZfaW5pdCwgc3VjY2VzcyFcbiIpKTsKKwkJICItODcxeF9kcnYgLSBkcnZfaW5pdCwgc3VjY2VzcyFcbiIpOwogCiAJc3RhdHVzID0gX1NVQ0NFU1M7CiAKQEAgLTU4Niw3ICs1ODcsNyBAQAogCiAJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGYsIE5VTEwpOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCIrZGV2X3JlbW92ZSgpXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitkZXZfcmVtb3ZlKClcbiIpOwogCiAJcnR3X3BtX3NldF9pcHMyM2EocGFkYXB0ZXIsIElQU19OT05FKTsKIAlydHdfcG1fc2V0X2xwczIzYShwYWRhcHRlciwgUFNfTU9ERV9BQ1RJVkUpOwpAQCAtNTk3LDIxICs1OTgsMTkgQEAKIAogCXVzYl9kdm9ial9kZWluaXQocHVzYl9pbnRmKTsKIAotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiLWRldl9yZW1vdmUoKVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICItZGV2X3JlbW92ZSgpXG4iKTsKIAlEQkdfODcyM0EoIi1yODcxeHVfZGV2X3JlbW92ZSwgZG9uZVxuIik7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHJ0d19kcnZfZW50cnkodm9pZCkKIHsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIitydHdfZHJ2X2VudHJ5XG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitydHdfZHJ2X2VudHJ5XG4iKTsKIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKHVzYl9kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcnR3X2Rydl9oYWx0KHZvaWQpCiB7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCIrcnR3X2Rydl9oYWx0XG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitydHdfZHJ2X2hhbHRcbiIpOwogCURCR184NzIzQSgiK3J0d19kcnZfaGFsdFxuIik7CiAKIAl1c2JfZGVyZWdpc3Rlcih1c2JfZHJ2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwppbmRleCAzZTE5YjNiLi4wY2RhZWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX29wc19saW51eC5jCkBAIC01OCw5ICs1OCw4IEBACiAJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8IHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fAogCSAgICBwYWRhcHRlci0+YldyaXRlUG9ydENhbmNlbCkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiAiCi0JCQkgICJiU3VycHJpc2VSZW1vdmVkKCVkKSIsIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpKTsKKwkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGU6YkRyaXZlclN0b3BwZWQoJWQpIE9SIGJTdXJwcmlzZVJlbW92ZWQoJWQpXG4iLAorCQkJIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwogCQlEQkdfODcyM0EoIiVzKCk6IFRYIFdhcm5pbmchIGJEcml2ZXJTdG9wcGVkKCVkKSBPUiAiCiAJCQkgICJiU3VycHJpc2VSZW1vdmVkKCVkKSBiV3JpdGVQb3J0Q2FuY2VsKCVkKSAiCiAJCQkgICJweG1pdGJ1Zi0+ZXh0X3RhZygleClcbiIsIF9fZnVuY19fLApAQCAtNzIsMTQgKzcxLDE0IEBACiAKIAlpZiAocHVyYi0+c3RhdHVzKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICgidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGUgOiBwdXJiLT5zdGF0dXMoJWQpICIKLQkJCSAgIiE9IDBcbiIsIHB1cmItPnN0YXR1cykpOworCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZSA6IHB1cmItPnN0YXR1cyglZCkgIT0gMFxuIiwKKwkJCSBwdXJiLT5zdGF0dXMpOwogCQlEQkdfODcyM0EoIiMjIz0+IHVyYl93cml0ZV9wb3J0X2NvbXBsZXRlIHN0YXR1cyglZClcbiIsCiAJCQkgIHB1cmItPnN0YXR1cyk7CiAJCWlmIChwdXJiLT5zdGF0dXMgPT0gLUVQSVBFIHx8IHB1cmItPnN0YXR1cyA9PSAtRVBST1RPKSB7CiAJCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGU6IEVJTlBST0dFU1NcbiIpKTsKKwkJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOiBFSU5QUk9HRVNTXG4iKTsKIAkJCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKIAkJfSBlbHNlIGlmIChwdXJiLT5zdGF0dXMgPT0gLUVOT0VOVCkgewogCQkJREJHXzg3MjNBKCIlczogLUVOT0VOVFxuIiwgX19mdW5jX18pOwpAQCAtODksMTggKzg4LDE2IEBACiAJCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247CiAJCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOiBFU0hVVERPV05cbiIpKTsKKwkJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOiBFU0hVVERPV05cbiIpOwogCQkJcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gdHJ1ZTsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkICIKLQkJCQkgICI9IHRydWVcbiIpKTsKKwkJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkID0gdHJ1ZVxuIik7CiAJCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247CiAJCX0gZWxzZSB7CiAJCQlwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9IHRydWU7CiAJCQlEQkdfODcyM0EoImJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlXG4iKTsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJTdXJwcmlzZVJlbW92ZWQgIgotCQkJCSAgIj0gdHJ1ZVxuIikpOworCQkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGU6YlN1cnByaXNlUmVtb3ZlZCA9IHRydWVcbiIpOwogCQkJZ290byBjaGVja19jb21wbGV0aW9uOwogCQl9CiAJfQpAQCAtMTMyLDEyICsxMjksMTIgQEAKIAlpbnQgc3RhdHVzOwogCWludCByZXQgPSBfRkFJTDsKIAotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAoIit1c2Jfd3JpdGVfcG9ydDIzYVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAiK3VzYl93cml0ZV9wb3J0MjNhXG4iKTsKIAogCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczoocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8ICIKLQkJCSAgInBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSEhIVxuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6KHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkhISFcbiIsCisJCQkgX19mdW5jX18pOwogCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcHhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfVFhfREVOWSk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xODgsOCArMTg1LDggQEAKIAkJCQkgICAgIFJUV19TQ1RYX0RPTkVfV1JJVEVfUE9SVF9FUlIpOwogCQlEQkdfODcyM0EoInVzYl93cml0ZV9wb3J0MjNhLCBzdGF0dXMgPSVkXG4iLCBzdGF0dXMpOwogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoInVzYl93cml0ZV9wb3J0MjNhKCk6IHVzYl9zdWJtaXRfdXJiLCBzdGF0dXMgPSV4XG4iLAotCQkJIHN0YXR1cykpOworCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYSgpOiB1c2Jfc3VibWl0X3VyYiwgc3RhdHVzID0leFxuIiwKKwkJCSBzdGF0dXMpOwogCiAJCXN3aXRjaCAoc3RhdHVzKSB7CiAJCWNhc2UgLUVOT0RFVjoKQEAgLTIwMSw3ICsxOTgsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCXJldCA9IF9TVUNDRVNTOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAoIi11c2Jfd3JpdGVfcG9ydDIzYVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAiLXVzYl93cml0ZV9wb3J0MjNhXG4iKTsKIAogZXhpdDoKIAlpZiAocmV0ICE9IF9TVUNDRVNTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAveG1pdF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAveG1pdF9saW51eC5jCmluZGV4IDY5Zjg4ODQuLjlhMTQwNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3htaXRfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC94bWl0X2xpbnV4LmMKQEAgLTEyMywxMSArMTIzLDExIEBACiAJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAlpbnQgcmVzID0gMDsKIAotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAoIit4bWl0X2VucnlcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgIit4bWl0X2VucnlcbiIpOwogCiAJaWYgKCFydHdfaWZfdXAyM2EocGFkYXB0ZXIpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfeG1pdF9vc2RlcF9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X3htaXQyM2FfZW50cnkyM2E6IHJ0d19pZl91cDIzYSBmYWlsXG4iKSk7CisJCQkgInJ0d194bWl0MjNhX2VudHJ5MjNhOiBydHdfaWZfdXAyM2EgZmFpbFxuIik7CiAJCWdvdG8gZHJvcF9wYWNrZXQ7CiAJfQogCkBAIC0xMzksMTYgKzEzOSwxNiBAQAogCiAJcHhtaXRwcml2LT50eF9wa3RzKys7CiAJUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfeG1pdDIzYV9lbnRyeTIzYTogdHhfcGt0cz0lZFxuIiwKLQkJICh1MzIpcHhtaXRwcml2LT50eF9wa3RzKSk7CisJCSAicnR3X3htaXQyM2FfZW50cnkyM2E6IHR4X3BrdHM9JWRcbiIsCisJCSAodTMyKXB4bWl0cHJpdi0+dHhfcGt0cyk7CiAJZ290byBleGl0OwogCiBkcm9wX3BhY2tldDoKIAlweG1pdHByaXYtPnR4X2Ryb3ArKzsKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCVJUX1RSQUNFKF9tb2R1bGVfeG1pdF9vc2RlcF9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCJydHdfeG1pdDIzYV9lbnRyeTIzYTogZHJvcCwgdHhfZHJvcD0lZFxuIiwKLQkJICh1MzIpcHhtaXRwcml2LT50eF9kcm9wKSk7CisJCSAicnR3X3htaXQyM2FfZW50cnkyM2E6IGRyb3AsIHR4X2Ryb3A9JWRcbiIsCisJCSAodTMyKXB4bWl0cHJpdi0+dHhfZHJvcCk7CiBleGl0OgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9NYWtlZmlsZQppbmRleCAxN2I0NDcxLi5mN2ZkMDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9NYWtlZmlsZQpAQCAtMyw0ICszLDQgQEAKIGNjZmxhZ3MteSA6PSAtSWRyaXZlcnMvc2NzaQogCiBydHM1MjA4LXkgOj0gcnRzeC5vIHJ0c3hfY2hpcC5vIHJ0c3hfdHJhbnNwb3J0Lm8gcnRzeF9zY3NpLm8gXAotCXJ0c3hfY2FyZC5vIGdlbmVyYWwubyBzZC5vIHhkLm8gbXMubyBzcGkubworCXJ0c3hfY2FyZC5vIGdlbmVyYWwubyBzZC5vIHhkLm8gbXMubyBzcGkubyB0cmFjZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYwppbmRleCBhNDdhMTkxLi5lZTgxOGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKQEAgLTI2LDkgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpbmNsdWRlICJydHN4LmgiCi0jaW5jbHVkZSAicnRzeF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJydHN4X3Njc2kuaCIKLSNpbmNsdWRlICJydHN4X2NhcmQuaCIKICNpbmNsdWRlICJtcy5oIgogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXNfc2V0X2Vycl9jb2RlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGVycl9jb2RlKQpAQCAtNDcsNyArNDQsOCBAQAogCiBzdGF0aWMgaW50IG1zX3BhcnNlX2Vycl9jb2RlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7Ci0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAogc3RhdGljIGludCBtc190cmFuc2Zlcl90cGMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggdHJhbnNfbW9kZSwKQEAgLTc4LDcgKzc2LDggQEAKIAlpZiAocmV0dmFsIDwgMCkgewogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwotCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJfQogCiAJcHRyID0gcnRzeF9nZXRfY21kX2RhdGEoY2hpcCkgKyAxOwpAQCAtODYsMTMgKzg1LDE1IEBACiAJaWYgKCEodHBjICYgMHgwOCkpIHsJCS8qIFJlYWQgUGFja2V0ICovCiAJCWlmICgqcHRyICYgTVNfQ1JDMTZfRVJSKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ1JDMTZfRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJCX0KIAl9IGVsc2UgewkJCS8qIFdyaXRlIFBhY2tldCAqLwogCQlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpICYmICEoKnB0ciAmIDB4ODApKSB7CiAJCQlpZiAoKnB0ciAmIChNU19JTlRfRVJSIHwgTVNfSU5UX0NNRE5LKSkgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwotCQkJCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMDAsMjIgKzEwMSwyNSBAQAogCWlmICgqcHRyICYgTVNfUkRZX1RJTUVPVVQpIHsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAogc3RhdGljIGludCBtc190cmFuc2Zlcl9kYXRhKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IHRyYW5zX21vZGUsCi0JCQl1OCB0cGMsIHUxNiBzZWNfY250LCB1OCBjZmcsIGludCBtb2RlXzJrLAorCQkJdTggdHBjLCB1MTYgc2VjX2NudCwgdTggY2ZnLCBib29sIG1vZGVfMmssCiAJCQlpbnQgdXNlX3NnLCB2b2lkICpidWYsIGludCBidWZfbGVuKQogewogCWludCByZXR2YWw7CiAJdTggdmFsLCBlcnJfY29kZSA9IDA7CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOwogCi0JaWYgKCFidWYgfHwgIWJ1Zl9sZW4pCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKCFidWYgfHwgIWJ1Zl9sZW4pIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh0cmFuc19tb2RlID09IE1TX1RNX0FVVE9fUkVBRCkgewogCQlkaXIgPSBETUFfRlJPTV9ERVZJQ0U7CkBAIC0xMjQsNyArMTI4LDggQEAKIAkJZGlyID0gRE1BX1RPX0RFVklDRTsKIAkJZXJyX2NvZGUgPSBNU19GTEFTSF9XUklURV9FUlJPUjsKIAl9IGVsc2UgewotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKQEAgLTE2MCwxMiArMTY1LDE5IEBACiAJCWVsc2UKIAkJCXJldHZhbCA9IFNUQVRVU19GQUlMOwogCi0JCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdmFsKTsKLQlpZiAodmFsICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIgfCBNU19DUkMxNl9FUlIgfCBNU19SRFlfVElNRU9VVCkpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpZiAodmFsICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIgfCBNU19DUkMxNl9FUlIgfCBNU19SRFlfVElNRU9VVCkpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTE3Niw4ICsxODgsMTAgQEAKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CiAJaW50IHJldHZhbCwgaTsKIAotCWlmICghZGF0YSB8fCAoZGF0YV9sZW4gPCBjbnQpKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwlpZiAoIWRhdGEgfHwgKGRhdGFfbGVuIDwgY250KSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0VSUk9SOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTIxMSwyNSArMjI1LDI4IEBACiAJCWlmICghKHRwYyAmIDB4MDgpKSB7CiAJCQlpZiAodmFsICYgTVNfQ1JDMTZfRVJSKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NSQzE2X0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKENIS19NU1BSTyhtc19jYXJkKSAmJiAhKHZhbCAmIDB4ODApKSB7CiAJCQkJaWYgKHZhbCAmIChNU19JTlRfRVJSIHwgTVNfSU5UX0NNRE5LKSkgewogCQkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsCi0JCQkJCQltc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBtc19wYXJzZV9lcnJfY29kZShjaGlwKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAogCQlpZiAodmFsICYgTVNfUkRZX1RJTUVPVVQpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19UT19FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBtc19wYXJzZV9lcnJfY29kZShjaGlwKTsKIAkJfQogCiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19UT19FUlJPUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBtc19wYXJzZV9lcnJfY29kZShjaGlwKTsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0yNDIsOCArMjU5LDEwIEBACiAJaW50IHJldHZhbCwgaTsKIAl1OCAqcHRyOwogCi0JaWYgKCFkYXRhKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwlpZiAoIWRhdGEpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwogCkBAIC0yNzcsMjUgKzI5NiwyOCBAQAogCQlpZiAoISh0cGMgJiAweDA4KSkgewogCQkJaWYgKHZhbCAmIE1TX0NSQzE2X0VSUikgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DUkMxNl9FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBtc19wYXJzZV9lcnJfY29kZShjaGlwKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChDSEtfTVNQUk8obXNfY2FyZCkgJiYgISh2YWwgJiAweDgwKSkgewogCQkJCWlmICh2YWwgJiAoTVNfSU5UX0VSUiB8IE1TX0lOVF9DTUROSykpIHsKIAkJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLAotCQkJCQkJbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJCQkJfQogCQkJfQogCQl9CiAKIAkJaWYgKHZhbCAmIE1TX1JEWV9USU1FT1VUKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJCX0KIAogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwotCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJfQogCiAJcHRyID0gcnRzeF9nZXRfY21kX2RhdGEoY2hpcCkgKyAxOwpAQCAtMzMxLDcgKzM1Myw4IEBACiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CiAJfQogCi0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAogc3RhdGljIGludCBtc19zZW5kX2NtZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjbWQsIHU4IGNmZykKQEAgLTM2OSwxMiArMzkyLDE2IEBACiAJfQogCiAJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIG1zX2NhcmQtPm1zX2Nsb2NrKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIE1TX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMzg1LDM3ICs0MTIsODcgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc2VsZWN0X2NhcmQoY2hpcCwgTVNfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgbXNfY2FyZC0+bXNfY2xvY2spOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCiBzdGF0aWMgaW50IG1zX3B1bGxfY3RsX2Rpc2FibGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKKwlpbnQgcmV0dmFsOworCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLAotCQkJTVNfRDFfUEQgfCBNU19EMl9QRCB8IE1TX0NMS19QRCB8IE1TX0Q2X1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsCi0JCQlNU19EM19QRCB8IE1TX0QwX1BEIHwgTVNfQlNfUEQgfCBYRF9ENF9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwzLCAweEZGLAotCQkJTVNfRDdfUEQgfCBYRF9DRV9QRCB8IFhEX0NMRV9QRCB8IFhEX0NEX1BVKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsCi0JCQlYRF9SRFlfUEQgfCBTRF9EM19QRCB8IFNEX0QyX1BEIHwgWERfQUxFX1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsCi0JCQlNU19JTlNfUFUgfCBTRF9XUF9QRCB8IFNEX0NEX1BVIHwgU0RfQ01EX1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsIDB4RkYsCi0JCQlNU19ENV9QRCB8IE1TX0Q0X1BEKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMSwgMHhGRiwKKwkJCQkJICAgICBNU19EMV9QRCB8IE1TX0QyX1BEIHwgTVNfQ0xLX1BEIHwgTVNfRDZfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLAorCQkJCQkgICAgIE1TX0QzX1BEIHwgTVNfRDBfUEQgfCBNU19CU19QRCB8IFhEX0Q0X1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHhGRiwKKwkJCQkJICAgICBNU19EN19QRCB8IFhEX0NFX1BEIHwgWERfQ0xFX1BEIHwgWERfQ0RfUFUpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLAorCQkJCQkgICAgIFhEX1JEWV9QRCB8IFNEX0QzX1BEIHwgU0RfRDJfUEQgfCBYRF9BTEVfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw1LCAweEZGLAorCQkJCQkgICAgIE1TX0lOU19QVSB8IFNEX1dQX1BEIHwgU0RfQ0RfUFUgfCBTRF9DTURfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw2LCAweEZGLAorCQkJCQkgICAgIE1TX0Q1X1BEIHwgTVNfRDRfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0gZWxzZSBpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKIAkJaWYgKENIRUNLX0JBUk9fUEtHKGNoaXAsIFFGTikpIHsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweDU1KTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLCAweDU1KTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDRCKTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDY5KTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDEsCisJCQkJCQkgICAgIDB4RkYsIDB4NTUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsCisJCQkJCQkgICAgIDB4RkYsIDB4NTUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsCisJCQkJCQkgICAgIDB4RkYsIDB4NEIpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsCisJCQkJCQkgICAgIDB4RkYsIDB4NjkpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQogCX0KIApAQCAtNDU1LDggKzUzMiwxMCBAQAogCX0KIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgTVNfQ0FSRCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNDc1LDI5ICs1NTQsNDEgQEAKIAltc19jYXJkLT5wcm9fdW5kZXJfZm9ybWF0dGluZyA9IDA7CiAKIAlyZXR2YWwgPSBtc19wb3dlcl9vZmZfY2FyZDN2MyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICghY2hpcC0+ZnQyX2Zhc3RfbW9kZSkKIAkJd2FpdF90aW1lb3V0KDI1MCk7CiAKIAlyZXR2YWwgPSBlbmFibGVfY2FyZF9jbG9jayhjaGlwLCBNU19DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKIAkJcmV0dmFsID0gbXNfcHVsbF9jdGxfZW5hYmxlKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0gZWxzZSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIEZQR0FfUFVMTF9DVEwsCi0JCQlGUEdBX01TX1BVTExfQ1RMX0JJVCB8IDB4MjAsIDApOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQR0FfUFVMTF9DVEwsCisJCQkJCSAgICAgRlBHQV9NU19QVUxMX0NUTF9CSVQgfCAweDIwLCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAKIAlpZiAoIWNoaXAtPmZ0Ml9mYXN0X21vZGUpIHsKIAkJcmV0dmFsID0gY2FyZF9wb3dlcl9vbihjaGlwLCBNU19DQVJEKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQl3YWl0X3RpbWVvdXQoMTUwKTsKIApAQCAtNTEwLDMwICs2MDEsNTIgQEAKIAkJaWYgKGNoaXAtPm9jcF9zdGF0ICYgb2NfbWFzaykgewogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk92ZXIgY3VycmVudCwgT0NQU1RBVCBpcyAweCV4XG4iLAogCQkJCWNoaXAtPm9jcF9zdGF0KTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAjZW5kaWYKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX09FLCBNU19PVVRQVVRfRU4sIE1TX09VVFBVVF9FTik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX09FLCBNU19PVVRQVVRfRU4sCisJCQkJICAgICBNU19PVVRQVVRfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE1TX0NGRywgMHhGRiwKLQkJCVNBTVBMRV9USU1FX1JJU0lORyB8IFBVU0hfVElNRV9ERUZBVUxUIHwKLQkJCU5PX0VYVEVORF9UT0dHTEUgfCBNU19CVVNfV0lEVEhfMSk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgTVNfQ0ZHLCAweEZGLAorCQkJCQkgICAgIFNBTVBMRV9USU1FX1JJU0lORyB8IFBVU0hfVElNRV9ERUZBVUxUIHwgTk9fRVhURU5EX1RPR0dMRSB8IE1TX0JVU19XSURUSF8xKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9IGVsc2UgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBNU19DRkcsIDB4RkYsCi0JCQlTQU1QTEVfVElNRV9GQUxMSU5HIHwgUFVTSF9USU1FX0RFRkFVTFQgfAotCQkJTk9fRVhURU5EX1RPR0dMRSB8IE1TX0JVU19XSURUSF8xKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBNU19DRkcsIDB4RkYsCisJCQkJCSAgICAgU0FNUExFX1RJTUVfRkFMTElORyB8IFBVU0hfVElNRV9ERUZBVUxUIHwgTk9fRVhURU5EX1RPR0dMRSB8IE1TX0JVU19XSURUSF8xKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgTVNfVFJBTlNfQ0ZHLAotCQkweEZGLCBOT19XQUlUX0lOVCB8IE5PX0FVVE9fUkVBRF9JTlRfUkVHKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1NUT1AsCi0JCU1TX1NUT1AgfCBNU19DTFJfRVJSLCBNU19TVE9QIHwgTVNfQ0xSX0VSUik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsIDB4RkYsCisJCQkJICAgICBOT19XQUlUX0lOVCB8IE5PX0FVVE9fUkVBRF9JTlRfUkVHKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9TVE9QLCBNU19TVE9QIHwgTVNfQ0xSX0VSUiwKKwkJCQkgICAgIE1TX1NUT1AgfCBNU19DTFJfRVJSKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dmFsID0gbXNfc2V0X2luaXRfcGFyYShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTU0NSw4ICs2NTgsMTAgQEAKIAl1OCB2YWw7CiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgUHJvX1N0YXR1c1JlZywgNiwgU3lzdGVtUGFybSwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKIAkJcmV0dmFsID0gbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX1JFQURfQllURVMsIFJFQURfUkVHLApAQCAtNTU0LDI5ICs2NjksNDkgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgMiwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyICsgMiwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiVHlwZSByZWdpc3RlcjogMHgleFxuIiwgdmFsKTsKIAlpZiAodmFsICE9IDB4MDEpIHsKIAkJaWYgKHZhbCAhPSAweDAyKQogCQkJbXNfY2FyZC0+Y2hlY2tfbXNfZmxvdyA9IDE7CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgUFBCVUZfQkFTRTIgKyA0LCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUFBCVUZfQkFTRTIgKyA0LCAmdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJDYXRlZ29yeSByZWdpc3RlcjogMHgleFxuIiwgdmFsKTsKIAlpZiAodmFsICE9IDApIHsKIAkJbXNfY2FyZC0+Y2hlY2tfbXNfZmxvdyA9IDE7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgNSwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyICsgNSwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiQ2xhc3MgcmVnaXN0ZXI6IDB4JXhcbiIsIHZhbCk7CiAJaWYgKHZhbCA9PSAwKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgUFBCVUZfQkFTRTIsICZ2YWwpOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUFBCVUZfQkFTRTIsICZ2YWwpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQlpZiAodmFsICYgV1JUX1BSVENUKQogCQkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOwogCQllbHNlCkBAIC01ODYsMTIgKzcyMSwxNyBAQAogCQljaGlwLT5jYXJkX3dwIHw9IE1TX0NBUkQ7CiAJfSBlbHNlIHsKIAkJbXNfY2FyZC0+Y2hlY2tfbXNfZmxvdyA9IDE7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAltc19jYXJkLT5tc190eXBlIHw9IFRZUEVfTVNQUk87CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgMywgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyICsgMywgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiSUYgTW9kZSByZWdpc3RlcjogMHgleFxuIiwgdmFsKTsKIAlpZiAodmFsID09IDApIHsKIAkJbXNfY2FyZC0+bXNfdHlwZSAmPSAweDBGOwpAQCAtNjAyLDcgKzc0Miw4IEBACiAJCQltc19jYXJkLT5tc190eXBlICY9IDB4MEY7CiAKIAl9IGVsc2UgewotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtNjE4LDcgKzc1OSw4IEBACiAJZG8gewogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19DQVJEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IE1TX01BWF9SRVRSWV9DT1VOVDsgaSsrKSB7CkBAIC02MjcsMTEgKzc2OSwxNSBAQAogCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCQlicmVhazsKIAkJfQotCQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAotCQlpZiAoayA+IDEwMCkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChrID4gMTAwKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaysrOwogCQl3YWl0X3RpbWVvdXQoMTAwKTsKQEAgLTY0MiwxNCArNzg4LDE4IEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CiAJCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKQogCQkJY2hpcC0+Y2FyZF93cCB8PSAoTVNfQ0FSRCk7Ci0JCWVsc2UKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWVsc2UgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAkvKiAtLSAgZW5kIGNvbmZpcm0gQ1BVIHN0YXJ0dXAgKi8KIApAQCAtNjY5LDggKzgxOSwxMCBAQAogCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAJfQotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNjg5LDIxICs4NDEsMzEgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE1TX0NGRywgMHg5OCwKLQkJTVNfQlVTX1dJRFRIXzggfCBTQU1QTEVfVElNRV9GQUxMSU5HKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1TX0NGRywgMHg5OCwKKwkJCQkgICAgIE1TX0JVU19XSURUSF84IHwgU0FNUExFX1RJTUVfRkFMTElORyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAltc19jYXJkLT5tc190eXBlIHw9IE1TXzhCSVQ7CiAJcmV0dmFsID0gbXNfc2V0X2luaXRfcGFyYShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgewogCQlyZXR2YWwgPSBtc190cmFuc2Zlcl90cGMoY2hpcCwgTVNfVE1fUkVBRF9CWVRFUywgR0VUX0lOVCwKIAkJCQkJMSwgTk9fV0FJVF9JTlQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTcxNiwyMiArODc4LDI5IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXJldHZhbCA9IG1zX3ByZXBhcmVfcmVzZXQoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gbXNfaWRlbnRpZnlfbWVkaWFfdHlwZShjaGlwLCBzd2l0Y2hfOGJpdF9idXMpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IG1zX2NvbmZpcm1fY3B1X3N0YXJ0dXAoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gbXNfc3dpdGNoX3BhcmFsbGVsX2J1cyhjaGlwKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0NBUkQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQljb250aW51ZTsKIAkJfSBlbHNlIHsKQEAgLTczOSwyMyArOTA4LDM3IEBACiAJCX0KIAl9CiAKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCS8qIFN3aXRjaCBNUy1QUk8gaW50byBQYXJhbGxlbCBtb2RlICovCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgTVNfQ0ZHLCAweDE4LCBNU19CVVNfV0lEVEhfNCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgTVNfQ0ZHLCBQVVNIX1RJTUVfT0RELCBQVVNIX1RJTUVfT0REKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1TX0NGRywgMHgxOCwgTVNfQlVTX1dJRFRIXzQpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBNU19DRkcsIFBVU0hfVElNRV9PREQsCisJCQkJICAgICBQVVNIX1RJTUVfT0REKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dmFsID0gbXNfc2V0X2luaXRfcGFyYShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCS8qIElmIE1TUHJvIEhHIENhcmQsIFdlIHNoYWxsIHRyeSB0byBzd2l0Y2ggdG8gOC1iaXQgYnVzICovCiAJaWYgKENIS19NU0hHKG1zX2NhcmQpICYmIGNoaXAtPnN1cHBvcnRfbXNfOGJpdCAmJiBzd2l0Y2hfOGJpdF9idXMpIHsKIAkJcmV0dmFsID0gbXNfc3dpdGNoXzhiaXRfYnVzKGNoaXApOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQltc19jYXJkLT5zd2l0Y2hfOGJpdF9mYWlsID0gMTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCkBAIC03NzEsOCArOTU0LDEwIEBACiAJbXNfY2xlYW51cF93b3JrKGNoaXApOwogCiAJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIDAsIDAsIFByb19EYXRhQ291bnQxLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWJ1ZlswXSA9IDA7CiAJYnVmWzFdID0gbW9kZTsKQEAgLTc4MiwxNiArOTY3LDI2IEBACiAJYnVmWzVdID0gMDsKIAogCXJldHZhbCA9IG1zX3dyaXRlX2J5dGVzKGNoaXAsIFBST19XUklURV9SRUcsIDYsIE5PX1dBSVRfSU5ULCBidWYsIDYpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgWENfQ0hHX1BPV0VSLCBXQUlUX0lOVCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIE1TX1RSQU5TX0NGRywgYnVmKTsKLQlpZiAoYnVmWzBdICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIpKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsIGJ1Zik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlpZiAoYnVmWzBdICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIpKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC04MTMsOCArMTAwOCwxMCBAQAogI2VuZGlmCiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgUHJvX0ludFJlZywgMiwgUHJvX1N5c3RlbVBhcm0sIDcpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKENIS19NUzhCSVQobXNfY2FyZCkpCiAJCWRhdGFbMF0gPSBQQVJBTExFTF84QklUX0lGOwpAQCAtODM2LDEyICsxMDMzLDE2IEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlidWYgPSBrbWFsbG9jKDY0ICogNTEyLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0VSUk9SOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgewogCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBQUk9fUkVBRF9BVFJCLCBXQUlUX0lOVCk7CkBAIC04NTEsMTEgKzEwNTIsMTMgQEAKIAkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWtmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCQlpZiAoISh2YWwgJiBNU19JTlRfQlJFUSkpIHsKIAkJCWtmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCQlyZXR2YWwgPSBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX1RNX0FVVE9fUkVBRCwKIAkJCQkJUFJPX1JFQURfTE9OR19EQVRBLCAweDQwLCBXQUlUX0lOVCwKQEAgLTg2Nyw3ICsxMDcwLDggQEAKIAl9CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlrZnJlZShidWYpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaSA9IDA7CkBAIC04NzUsNyArMTA3OSw4IEBACiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsICZ2YWwpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlrZnJlZShidWYpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAoKHZhbCAmIE1TX0lOVF9DRUQpIHx8ICEodmFsICYgTVNfSU5UX0JSRVEpKQpAQCAtODg1LDcgKzEwOTAsOCBAQAogCQkJCQlQUk9fUkVBRF9MT05HX0RBVEEsIDAsIFdBSVRfSU5UKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJa2ZyZWUoYnVmKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaSsrOwpAQCAtODkzLDE4ICsxMDk5LDIxIEBACiAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCWtmcmVlKGJ1Zik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoKGJ1ZlswXSAhPSAweGE1KSAmJiAoYnVmWzFdICE9IDB4YzMpKSB7CiAJCS8qIFNpZ25hdHVyZSBjb2RlIGlzIHdyb25nICovCiAJCWtmcmVlKGJ1Zik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoKGJ1Zls0XSA8IDEpIHx8IChidWZbNF0gPiAxMikpIHsKIAkJa2ZyZWUoYnVmKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBidWZbNF07IGkrKykgewpAQCAtOTI5LDE1ICsxMTM4LDE4IEBACiAJCQkJc3lzX2luZm9fYWRkciwgc3lzX2luZm9fc2l6ZSk7CiAJCQlpZiAoc3lzX2luZm9fc2l6ZSAhPSA5NikgIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlpZiAoc3lzX2luZm9fYWRkciA8IDB4MUEwKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKChzeXNfaW5mb19zaXplICsgc3lzX2luZm9fYWRkcikgPiAweDgwMDApIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKICNpZmRlZiBTVVBQT1JUX01TWEMKQEAgLTk2NCwxNSArMTE3NiwxOCBAQAogCQkJCW1vZGVsX25hbWVfYWRkciwgbW9kZWxfbmFtZV9zaXplKTsKIAkJCWlmIChtb2RlbF9uYW1lX3NpemUgIT0gNDgpICB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKG1vZGVsX25hbWVfYWRkciA8IDB4MUEwKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKChtb2RlbF9uYW1lX3NpemUgKyBtb2RlbF9uYW1lX2FkZHIpID4gMHg4MDAwKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlmb3VuZF9tb2RlbF9uYW1lID0gMTsKQEAgLTk4NSw3ICsxMjAwLDggQEAKIAogCWlmIChpID09IGJ1Zls0XSkgewogCQlrZnJlZShidWYpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJY2xhc3NfY29kZSA9ICBidWZbc3lzX2luZm9fYWRkciArIDBdOwpAQCAtMTAzMCwxNSArMTI0NiwyMSBAQAogCiAjaWZkZWYgU1VQUE9SVF9NU1hDCiAJaWYgKENIS19NU1hDKG1zX2NhcmQpKSB7Ci0JCWlmIChjbGFzc19jb2RlICE9IDB4MDMpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAoY2xhc3NfY29kZSAhPSAweDAzKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKLQkJaWYgKGNsYXNzX2NvZGUgIT0gMHgwMikKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChjbGFzc19jb2RlICE9IDB4MDIpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAjZWxzZQotCWlmIChjbGFzc19jb2RlICE9IDB4MDIpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGNsYXNzX2NvZGUgIT0gMHgwMikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogI2VuZGlmCiAKIAlpZiAoZGV2aWNlX3R5cGUgIT0gMHgwMCkgewpAQCAtMTA0NiwxMiArMTI2OCwxNSBAQAogCQkJCShkZXZpY2VfdHlwZSA9PSAweDAzKSkgewogCQkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOwogCQl9IGVsc2UgewotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKLQlpZiAoc3ViX2NsYXNzICYgMHhDMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoc3ViX2NsYXNzICYgMHhDMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgImNsYXNzX2NvZGU6IDB4JXgsIGRldmljZV90eXBlOiAweCV4LCBzdWJfY2xhc3M6IDB4JXhcbiIsCiAJCWNsYXNzX2NvZGUsIGRldmljZV90eXBlLCBzdWJfY2xhc3MpOwpAQCAtMTA5OSwxNiArMTMyNCwyMSBAQAogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJaWYgKG1zX2NhcmQtPnN3aXRjaF84Yml0X2ZhaWwpIHsKIAkJCXJldHZhbCA9IG1zX3Byb19yZXNldF9mbG93KGNoaXAsIDApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9IGVsc2UgewotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX2F0dHJpYnV0ZV9pbmZvKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAjaWZkZWYgWENfUE9XRVJDTEFTUwogCWlmIChDSEtfSEc4QklUKG1zX2NhcmQpKQpAQCAtMTE0OCw4ICsxMzc4LDEwIEBACiAKICNpZmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKIAlyZXR2YWwgPSBtZ19zZXRfdHBjX3BhcmFfc3ViKGNoaXAsIDAsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogI2VuZGlmCiAKIAlpZiAoQ0hLX0hHOEJJVChtc19jYXJkKSkKQEAgLTExNjYsMTYgKzEzOTgsMjEgQEAKIAl1OCB2YWxbMl07CiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgU3RhdHVzUmVnMCwgMiwgMCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIFJFQURfUkVHLCAyLCBOT19XQUlUX0lOVCwgdmFsLCAyKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh2YWxbMV0gJiAoU1RTX1VDRFQgfCBTVFNfVUNFWCB8IFNUU19VQ0ZHKSkgewogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfUkVBRF9FUlJPUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMTkxLDggKzE0MjgsMTAgQEAKIAogCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLAogCQkJCVN5c3RlbVBhcm0sIDYpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpIHsKIAkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCkBAIC0xMjEzLDggKzE0NTIsMTAgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwogCkBAIC0xMjIzLDM1ICsxNDY0LDQ2IEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgewogCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCXJldHZhbCA9IG1zX3JlYWRfc3RhdHVzX3JlZyhjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIE92ZXJ3cml0ZUZsYWcsCiAJCQkJCQlNU19FWFRSQV9TSVpFLCBTeXN0ZW1QYXJtLCA2KTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfQogCX0KIAogCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgUkVBRF9SRUcsIE1TX0VYVFJBX1NJWkUsIE5PX1dBSVRfSU5ULAogCQkJZGF0YSwgTVNfRVhUUkFfU0laRSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoYnVmICYmIGJ1Zl9sZW4pIHsKIAkJaWYgKGJ1Zl9sZW4gPiBNU19FWFRSQV9TSVpFKQpAQCAtMTI2OSwxMyArMTUyMSwxNyBAQAogCWludCByZXR2YWwsIGk7CiAJdTggdmFsLCBkYXRhWzE2XTsKIAotCWlmICghYnVmIHx8IChidWZfbGVuIDwgTVNfRVhUUkFfU0laRSkpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKCFidWYgfHwgKGJ1Zl9sZW4gPCBNU19FWFRSQV9TSVpFKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsCiAJCQkJU3lzdGVtUGFybSwgNiArIE1TX0VYVFJBX1NJWkUpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpCiAJCWRhdGFbMF0gPSAweDg4OwpAQCAtMTI5MywyNiArMTU0OSwzNCBAQAogCiAJcmV0dmFsID0gbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCAoNiArIE1TX0VYVFJBX1NJWkUpLAogCQkJCU5PX1dBSVRfSU5ULCBkYXRhLCAxNik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19XUklURSwgV0FJVF9JTlQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgewogCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMTMyOCw4ICsxNTkyLDEwIEBACiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwKIAkJCQlTeXN0ZW1QYXJtLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKQogCQlkYXRhWzBdID0gMHg4ODsKQEAgLTEzNDMsMjggKzE2MDksMzYgQEAKIAlkYXRhWzVdID0gcGFnZV9udW07CiAKIAlyZXR2YWwgPSBtc193cml0ZV9ieXRlcyhjaGlwLCBXUklURV9SRUcsIDYsIE5PX1dBSVRfSU5ULCBkYXRhLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIEJMT0NLX1JFQUQsIFdBSVRfSU5UKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgewogCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCWlmICghKHZhbCAmIElOVF9SRUdfQlJFUSkpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgIE1TX0ZMQVNIX1JFQURfRVJST1IpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQpAQCAtMTM3MywxOCArMTY0NywyMyBAQAogCQl9IGVsc2UgewogCQkJaWYgKCEodmFsICYgSU5UX1JFR19CUkVRKSkgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19CUkVRX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAJfQogCiAJcmV0dmFsID0gbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX05PUk1BTF9SRUFELCBSRUFEX1BBR0VfREFUQSwKIAkJCQkwLCBOT19XQUlUX0lOVCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlpZiAobXNfY2hlY2tfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChtc19jaGVja19lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUikpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTEzOTcsMTMgKzE2NzYsMTcgQEAKIAl1OCB2YWwsIGRhdGFbOF0sIGV4dHJhW01TX0VYVFJBX1NJWkVdOwogCiAJcmV0dmFsID0gbXNfcmVhZF9leHRyYV9kYXRhKGNoaXAsIHBoeV9ibGssIDAsIGV4dHJhLCBNU19FWFRSQV9TSVpFKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLAogCQkJCVN5c3RlbVBhcm0sIDcpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIApAQCAtMTQyMSwyNyArMTcwNCwzNSBAQAogCWRhdGFbN10gPSAweEZGOwogCiAJcmV0dmFsID0gbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCA3LCBOT19XQUlUX0lOVCwgZGF0YSwgNyk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19XUklURSwgV0FJVF9JTlQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKHZhbCAmIElOVF9SRUdfQ0VEKSB7CiAJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCkBAIC0xNDU3LDggKzE3NDgsMTAgQEAKIAogCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLAogCQkJCVN5c3RlbVBhcm0sIDYpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIApAQCAtMTQ3NCwxOCArMTc2NywyNCBAQAogCWRhdGFbNV0gPSAwOwogCiAJcmV0dmFsID0gbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCA2LCBOT19XQUlUX0lOVCwgZGF0YSwgNik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIEVSQVNFX1JUWToKIAlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19FUkFTRSwgV0FJVF9JTlQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCWlmIChpIDwgMykgewpAQCAtMTQ5NSwxMyArMTc5NCwxNSBAQAogCiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwogCQltc19zZXRfYmFkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKHZhbCAmIElOVF9SRUdfQ0VEKSB7CiAJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCkBAIC0xNTQ0LDEzICsxODQ1LDE2IEBACiAJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspIHsKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJldHZhbCA9IG1zX3dyaXRlX2V4dHJhX2RhdGEoY2hpcCwgcGh5X2JsaywgaSwKIAkJCQkJZXh0cmEsIE1TX0VYVFJBX1NJWkUpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE1NjAsNyArMTg2NCw4IEBACiAJCXUxNiBsb2dfYmxrLCB1OCBzdGFydF9wYWdlLCB1OCBlbmRfcGFnZSkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7Ci0JaW50IHJldHZhbCwgcnR5X2NudCwgdW5jb3JyZWN0X2ZsYWcgPSAwOworCWJvb2wgdW5jb3JyZWN0X2ZsYWcgPSBmYWxzZTsKKwlpbnQgcmV0dmFsLCBydHlfY250OwogCXU4IGV4dHJhW01TX0VYVFJBX1NJWkVdLCB2YWwsIGksIGosIGRhdGFbMTZdOwogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkNvcHkgcGFnZSBmcm9tIDB4JXggdG8gMHgleCwgbG9naWNhbCBibG9jayBpcyAweCV4XG4iLApAQCAtMTU2OSw0MiArMTg3NCw1OCBAQAogCQlzdGFydF9wYWdlLCBlbmRfcGFnZSk7CiAKIAlyZXR2YWwgPSBtc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgbmV3X2JsaywgMCwgZXh0cmEsIE1TX0VYVFJBX1NJWkUpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbXNfcmVhZF9zdGF0dXNfcmVnKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyLCAmdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKHZhbCAmIEJVRl9GVUxMKSB7CiAJCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIENMRUFSX0JVRiwgV0FJVF9JTlQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmICghKHZhbCAmIElOVF9SRUdfQ0VEKSkgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCiAJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspIHsKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCW1zX3JlYWRfZXh0cmFfZGF0YShjaGlwLCBvbGRfYmxrLCBpLCBleHRyYSwgTVNfRVhUUkFfU0laRSk7CiAKIAkJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIE92ZXJ3cml0ZUZsYWcsCiAJCQkJCU1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDYpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAKQEAgLTE2MjEsMzkgKzE5NDIsNDggQEAKIAogCQlyZXR2YWwgPSBtc193cml0ZV9ieXRlcyhjaGlwLCBXUklURV9SRUcsIDYsIE5PX1dBSVRfSU5ULAogCQkJCQlkYXRhLCA2KTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19SRUFELCBXQUlUX0lOVCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAkJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKIAkJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgewogCQkJCXJldHZhbCA9IG1zX3JlYWRfc3RhdHVzX3JlZyhjaGlwKTsKIAkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJCXVuY29ycmVjdF9mbGFnID0gMTsKKwkJCQkJdW5jb3JyZWN0X2ZsYWcgPSB0cnVlOwogCQkJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiVW5jb3JyZWN0YWJsZSBlcnJvclxuIik7CiAJCQkJfSBlbHNlIHsKLQkJCQkJdW5jb3JyZWN0X2ZsYWcgPSAwOworCQkJCQl1bmNvcnJlY3RfZmxhZyA9IGZhbHNlOwogCQkJCX0KIAogCQkJCXJldHZhbCA9IG1zX3RyYW5zZmVyX3RwYyhjaGlwLAogCQkJCQkJCU1TX1RNX05PUk1BTF9SRUFELAogCQkJCQkJCVJFQURfUEFHRV9EQVRBLAogCQkJCQkJCTAsIE5PX1dBSVRfSU5UKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAogCQkJCWlmICh1bmNvcnJlY3RfZmxhZykgewogCQkJCQltc19zZXRfcGFnZV9zdGF0dXMobG9nX2Jsaywgc2V0UFNfTkcsCkBAIC0xNjg0LDEzICsyMDE0LDE2IEBACiAJCQkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJaWYgKHJ0eV9jbnQgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChydHlfY250ID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCQkJfQogCiAJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0JSRVEpKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0JSRVFfRVJST1IpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIApAQCAtMTcyNCwzNSArMjA1Nyw0NSBAQAogCiAJCXJldHZhbCA9IG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgKDYgKyBNU19FWFRSQV9TSVpFKSwKIAkJCQkJTk9fV0FJVF9JTlQsIGRhdGEsIDE2KTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19XUklURSwgV0FJVF9JTlQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKHZhbCAmIElOVF9SRUdfQ0VEKSB7CiAJCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIAogCQlpZiAoaSA9PSAwKSB7CiAJCQlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywKIAkJCQkJCU1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDcpOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwogCkBAIC0xNzcxLDI5ICsyMTE0LDM3IEBACiAKIAkJCXJldHZhbCA9IG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgNywKIAkJCQkJCU5PX1dBSVRfSU5ULCBkYXRhLCA4KTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAkJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwKIAkJCQkJTk9fV0FJVF9JTlQsICZ2YWwsIDEpOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCiAJCQlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgewogCQkJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgewogCQkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwKIAkJCQkJCQlNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTE4MTQsMjAgKzIxNjUsMzAgQEAKICNlbmRpZgogCiAJcmV0dmFsID0gbXNfcHJlcGFyZV9yZXNldChjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX2NhcmQtPm1zX3R5cGUgfD0gVFlQRV9NUzsKIAogCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIE1TX1JFU0VULCBOT19XQUlUX0lOVCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyLCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUFBCVUZfQkFTRTIsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJaWYgKHZhbCAmIFdSVF9QUlRDVCkKIAkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOwogCWVsc2UKQEAgLTE4NDAsNyArMjIwMSw4IEBACiAJd2hpbGUgKGkgPCAoTUFYX0RFRkVDVElWRV9CTE9DSyArIDIpKSB7CiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBtc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgaSwgMCwgZXh0cmEsIE1TX0VYVFJBX1NJWkUpOwpAQCAtMTg2MCw3ICsyMjIyLDggQEAKIAogCWlmIChpID09IChNQVhfREVGRUNUSVZFX0JMT0NLICsgMikpIHsKIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk5vIGJvb3QgYmxvY2sgZm91bmQhIik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CkBAIC0xODc1LDggKzIyMzgsMTAgQEAKIAl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX3BhZ2UoY2hpcCwgbXNfY2FyZC0+Ym9vdF9ibG9jaywgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAkvKiBSZWFkIE1TIHN5c3RlbSBpbmZvcm1hdGlvbiBhcyBzeXNfaW5mbyAqLwogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CkBAIC0xODg1LDggKzIyNTAsMTAgQEAKIAkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgUFBCVUZfQkFTRTIgKyAweDFBMCArIGksIDAsIDApOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBNU19DQVJELCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlwdHIgPSBydHN4X2dldF9jbWRfZGF0YShjaGlwKTsKIAltZW1jcHkobXNfY2FyZC0+cmF3X3N5c19pbmZvLCBwdHIsIDk2KTsKQEAgLTE5MDgsOCArMjI3NSwxMCBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIE1TXzRiaXRfU3VwcG9ydCwgMCwgMCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIE1TX0NBUkQsIDEwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApOwogCkBAIC0xOTgyLDE5ICsyMzUxLDM2IEBACiAJLyogU3dpdGNoIEkvRiBNb2RlICovCiAJaWYgKHB0clsxNV0pIHsKIAkJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIDAsIDAsIFN5c3RlbVBhcm0sIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBQQlVGX0JBU0UyLCAweEZGLCAweDg4KTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgUFBCVUZfQkFTRTIgKyAxLCAweEZGLCAwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQUEJVRl9CQVNFMiwgMHhGRiwgMHg4OCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUFBCVUZfQkFTRTIgKyAxLCAweEZGLCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAogCQlyZXR2YWwgPSBtc190cmFuc2Zlcl90cGMoY2hpcCwgTVNfVE1fV1JJVEVfQllURVMsIFdSSVRFX1JFRywgMSwKIAkJCQkJTk9fV0FJVF9JTlQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE1TX0NGRywgMHg1OCB8IE1TX05PX0NIRUNLX0lOVCwKLQkJCU1TX0JVU19XSURUSF80IHwgUFVTSF9USU1FX09ERCB8IE1TX05PX0NIRUNLX0lOVCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgTVNfQ0ZHLAorCQkJCQkgICAgIDB4NTggfCBNU19OT19DSEVDS19JTlQsCisJCQkJCSAgICAgTVNfQlVTX1dJRFRIXzQgfCBQVVNIX1RJTUVfT0REIHwgTVNfTk9fQ0hFQ0tfSU5UKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAogCQltc19jYXJkLT5tc190eXBlIHw9IE1TXzRCSVQ7CiAJfQpAQCAtMjAyMCwyOSArMjQwNiw0MSBAQAogCiAJc2l6ZSA9IG1zX2NhcmQtPnNlZ21lbnRfY250ICogc2l6ZW9mKHN0cnVjdCB6b25lX2VudHJ5KTsKIAltc19jYXJkLT5zZWdtZW50ID0gdnphbGxvYyhzaXplKTsKLQlpZiAobXNfY2FyZC0+c2VnbWVudCA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChtc19jYXJkLT5zZWdtZW50ID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3JlYWRfcGFnZShjaGlwLCBtc19jYXJkLT5ib290X2Jsb2NrLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9HT1RPKGNoaXAsIElOSVRfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIElOSVRfRkFJTDsKKwl9CiAKIAlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOwogCWZvciAoaSA9IDA7IGkgPCAoKChtc19jYXJkLT50b3RhbF9ibG9jayA+PiA5KSAqIDEwKSArIDEpOyBpKyspIHsKKwkJaW50IGJsb2NrX25vOworCiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCByZWdfYWRkcisrLCAmdmFsMSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIElOSVRfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIElOSVRfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCByZWdfYWRkcisrLCAmdmFsMik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIElOSVRfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIElOSVRfRkFJTDsKKwkJfQogCiAJCWRlZmVjdF9ibG9jayA9ICgodTE2KXZhbDEgPDwgOCkgfCB2YWwyOwogCQlpZiAoZGVmZWN0X2Jsb2NrID09IDB4RkZGRikKIAkJCWJyZWFrOwogCiAJCXNlZ19ubyA9IGRlZmVjdF9ibG9jayAvIDUxMjsKLQkJbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dLmRlZmVjdF9saXN0W21zX2NhcmQtPnNlZ21lbnRbc2VnX25vXS5kaXNhYmxlX2NvdW50KytdID0gZGVmZWN0X2Jsb2NrOworCisJCWJsb2NrX25vID0gbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dLmRpc2FibGVfY291bnQrKzsKKwkJbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dLmRlZmVjdF9saXN0W2Jsb2NrX25vXSA9IGRlZmVjdF9ibG9jazsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbXNfY2FyZC0+c2VnbWVudF9jbnQ7IGkrKykgewpAQCAtMjE4NywxNiArMjU4NSwxOSBAQAogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKIAlzdHJ1Y3Qgem9uZV9lbnRyeSAqc2VnbWVudDsKLQlpbnQgcmV0dmFsLCB0YWJsZV9zaXplLCBkaXNhYmxlX2NudCwgZGVmZWN0X2ZsYWcsIGk7Ci0JdTE2IHN0YXJ0LCBlbmQsIHBoeV9ibGssIGxvZ19ibGssIHRtcF9ibGs7CisJYm9vbCBkZWZlY3RfZmxhZzsKKwlpbnQgcmV0dmFsLCB0YWJsZV9zaXplLCBkaXNhYmxlX2NudCwgaTsKKwl1MTYgc3RhcnQsIGVuZCwgcGh5X2JsaywgbG9nX2JsaywgdG1wX2JsaywgaWR4OwogCXU4IGV4dHJhW01TX0VYVFJBX1NJWkVdLCB1czEsIHVzMjsKIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJtc19idWlsZF9sMnBfdGJsOiAlZFxuIiwgc2VnX25vKTsKIAogCWlmIChtc19jYXJkLT5zZWdtZW50ID09IE5VTEwpIHsKIAkJcmV0dmFsID0gbXNfaW5pdF9sMnBfdGJsKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiAJaWYgKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXS5idWlsZF9mbGFnKSB7CkBAIC0yMjE0LDE1ICsyNjE1LDE5IEBACiAKIAlpZiAoc2VnbWVudC0+bDJwX3RhYmxlID09IE5VTEwpIHsKIAkJc2VnbWVudC0+bDJwX3RhYmxlID0gdm1hbGxvYyh0YWJsZV9zaXplICogMik7Ci0JCWlmIChzZWdtZW50LT5sMnBfdGFibGUgPT0gTlVMTCkKLQkJCVRSQUNFX0dPVE8oY2hpcCwgQlVJTERfRkFJTCk7CisJCWlmIChzZWdtZW50LT5sMnBfdGFibGUgPT0gTlVMTCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gQlVJTERfRkFJTDsKKwkJfQogCX0KIAltZW1zZXQoKHU4ICopKHNlZ21lbnQtPmwycF90YWJsZSksIDB4ZmYsIHRhYmxlX3NpemUgKiAyKTsKIAogCWlmIChzZWdtZW50LT5mcmVlX3RhYmxlID09IE5VTEwpIHsKIAkJc2VnbWVudC0+ZnJlZV90YWJsZSA9IHZtYWxsb2MoTVNfRlJFRV9UQUJMRV9DTlQgKiAyKTsKLQkJaWYgKHNlZ21lbnQtPmZyZWVfdGFibGUgPT0gTlVMTCkKLQkJCVRSQUNFX0dPVE8oY2hpcCwgQlVJTERfRkFJTCk7CisJCWlmIChzZWdtZW50LT5mcmVlX3RhYmxlID09IE5VTEwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIEJVSUxEX0ZBSUw7CisJCX0KIAl9CiAJbWVtc2V0KCh1OCAqKShzZWdtZW50LT5mcmVlX3RhYmxlKSwgMHhmZiwgTVNfRlJFRV9UQUJMRV9DTlQgKiAyKTsKIApAQCAtMjIzNiwxMCArMjY0MSwxMCBAQAogCiAJZm9yIChwaHlfYmxrID0gc3RhcnQ7IHBoeV9ibGsgPCBlbmQ7IHBoeV9ibGsrKykgewogCQlpZiAoZGlzYWJsZV9jbnQpIHsKLQkJCWRlZmVjdF9mbGFnID0gMDsKKwkJCWRlZmVjdF9mbGFnID0gZmFsc2U7CiAJCQlmb3IgKGkgPSAwOyBpIDwgc2VnbWVudC0+ZGlzYWJsZV9jb3VudDsgaSsrKSB7CiAJCQkJaWYgKHBoeV9ibGsgPT0gc2VnbWVudC0+ZGVmZWN0X2xpc3RbaV0pIHsKLQkJCQkJZGVmZWN0X2ZsYWcgPSAxOworCQkJCQlkZWZlY3RfZmxhZyA9IHRydWU7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTIyOTksMTMgKzI3MDQsMTUgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKHNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub11dID09IDB4RkZGRikgewotCQkJc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19ibGsgLSBtc19zdGFydF9pZHhbc2VnX25vXV0gPSBwaHlfYmxrOworCQlpZHggPSBsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub107CisKKwkJaWYgKHNlZ21lbnQtPmwycF90YWJsZVtpZHhdID09IDB4RkZGRikgeworCQkJc2VnbWVudC0+bDJwX3RhYmxlW2lkeF0gPSBwaHlfYmxrOwogCQkJY29udGludWU7CiAJCX0KIAogCQl1czEgPSBleHRyYVswXSAmIDB4MTA7Ci0JCXRtcF9ibGsgPSBzZWdtZW50LT5sMnBfdGFibGVbbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dXTsKKwkJdG1wX2JsayA9IHNlZ21lbnQtPmwycF90YWJsZVtpZHhdOwogCQlyZXR2YWwgPSBtc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgdG1wX2JsaywgMCwKIAkJCQkJZXh0cmEsIE1TX0VYVFJBX1NJWkUpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQpAQCAtMjMzNiwxNyArMjc0MywyMCBAQAogCiAJZm9yIChsb2dfYmxrID0gbXNfc3RhcnRfaWR4W3NlZ19ub107CiAJICAgICBsb2dfYmxrIDwgbXNfc3RhcnRfaWR4W3NlZ19ubyArIDFdOyBsb2dfYmxrKyspIHsKLQkJaWYgKHNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrLW1zX3N0YXJ0X2lkeFtzZWdfbm9dXSA9PSAweEZGRkYpIHsKKwkJaWR4ID0gbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dOworCQlpZiAoc2VnbWVudC0+bDJwX3RhYmxlW2lkeF0gPT0gMHhGRkZGKSB7CiAJCQlwaHlfYmxrID0gbXNfZ2V0X3VudXNlZF9ibG9jayhjaGlwLCBzZWdfbm8pOwogCQkJaWYgKHBoeV9ibGsgPT0gMHhGRkZGKSB7CiAJCQkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOwogCQkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAkJCX0KIAkJCXJldHZhbCA9IG1zX2luaXRfcGFnZShjaGlwLCBwaHlfYmxrLCBsb2dfYmxrLCAwLCAxKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfR09UTyhjaGlwLCBCVUlMRF9GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCWdvdG8gQlVJTERfRkFJTDsKKwkJCX0KIAotCQkJc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19ibGstbXNfc3RhcnRfaWR4W3NlZ19ub11dID0gcGh5X2JsazsKKwkJCXNlZ21lbnQtPmwycF90YWJsZVtpZHhdID0gcGh5X2JsazsKIAkJCWlmIChzZWdfbm8gPT0gbXNfY2FyZC0+c2VnbWVudF9jbnQgLSAxKSB7CiAJCQkJaWYgKHNlZ21lbnQtPnVudXNlZF9ibGtfY250IDwgMikgewogCQkJCQljaGlwLT5jYXJkX3dwIHw9IE1TX0NBUkQ7CkBAIC0yMzc0LDE0ICsyNzg0LDE4IEBACiAJCQkJcGh5X2JsayA9IG1zX2dldF91bnVzZWRfYmxvY2soY2hpcCwgMCk7CiAJCQkJcmV0dmFsID0gbXNfY29weV9wYWdlKGNoaXAsIHRtcF9ibGssIHBoeV9ibGssCiAJCQkJCQlsb2dfYmxrLCAwLCBtc19jYXJkLT5wYWdlX29mZiArIDEpOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCiAJCQkJc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19ibGtdID0gcGh5X2JsazsKIAogCQkJCXJldHZhbCA9IG1zX3NldF9iYWRfYmxvY2soY2hpcCwgdG1wX2Jsayk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC0yNDExLDEyICsyODI1LDE2IEBACiAJbWVtc2V0KG1zX2NhcmQsIDAsIHNpemVvZihzdHJ1Y3QgbXNfaW5mbykpOwogCiAJcmV0dmFsID0gZW5hYmxlX2NhcmRfY2xvY2soY2hpcCwgTVNfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZWxlY3RfY2FyZChjaGlwLCBNU19DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX2NhcmQtPm1zX3R5cGUgPSAwOwogCkBAIC0yNDI0LDI0ICsyODQyLDMxIEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlpZiAobXNfY2FyZC0+Y2hlY2tfbXNfZmxvdykgewogCQkJcmV0dmFsID0gcmVzZXRfbXMoY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIAogCXJldHZhbCA9IG1zX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoIUNIS19NU1BSTyhtc19jYXJkKSkgewogCQkvKiBCdWlsZCB0YWJsZSBmb3IgdGhlIGxhc3Qgc2VnbWVudCwKIAkJICogdG8gY2hlY2sgaWYgTDJQIHRhYmxlIGJsb2NrIGV4aXN0cywgZXJhc2luZyBpdAogCQkgKi8KIAkJcmV0dmFsID0gbXNfYnVpbGRfbDJwX3RibChjaGlwLCBtc19jYXJkLT50b3RhbF9ibG9jayAvIDUxMiAtIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJtc19jYXJkLT5tc190eXBlID0gMHgleFxuIiwgbXNfY2FyZC0+bXNfdHlwZSk7CkBAIC0yNDcwLDggKzI4OTUsMTAgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0yNTExLDggKzI5MzgsMTAgQEAKIAl9CiAKIAlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0yNTIyLDcgKzI5NTEsOCBAQAogCQkJCXUxNiBzZWN0b3JfY250KQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKLQlpbnQgcmV0dmFsLCBtb2RlXzJrID0gMDsKKwlib29sIG1vZGVfMmsgPSBmYWxzZTsKKwlpbnQgcmV0dmFsOwogCXUxNiBjb3VudDsKIAl1OCB2YWwsIHRyYW5zX21vZGUsIHJ3X3RwYywgcndfY21kOwogCkBAIC0yNTQ3LDcgKzI5NzcsNyBAQAogCQkJCXJ3X3RwYyA9IFBST19XUklURV9RVUFEX0RBVEE7CiAJCQkJcndfY21kID0gUFJPX1dSSVRFXzJLX0RBVEE7CiAJCQl9Ci0JCQltb2RlXzJrID0gMTsKKwkJCW1vZGVfMmsgPSB0cnVlOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CkBAIC0yNTYwLDE1ICsyOTkwLDIxIEBACiAJfQogCiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKQogCQl0cmFuc19tb2RlID0gTVNfVE1fQVVUT19SRUFEOwogCWVsc2UKIAkJdHJhbnNfbW9kZSA9IE1TX1RNX0FVVE9fV1JJVEU7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmIChtc19jYXJkLT5zZXFfbW9kZSkgewogCQlpZiAoKG1zX2NhcmQtPnByZV9kaXIgIT0gc3JiLT5zY19kYXRhX2RpcmVjdGlvbikKQEAgLTI1ODEsOCArMzAxNywxMCBAQAogCQkJbXNfY2FyZC0+dG90YWxfc2VjX2NudCA9IDA7CiAJCQlpZiAodmFsICYgTVNfSU5UX0JSRVEpIHsKIAkJCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBQUk9fU1RPUCwgV0FJVF9JTlQpOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCiAJCQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSQkNUTCwgUkJfRkxVU0gsIFJCX0ZMVVNIKTsKIAkJCX0KQEAgLTI2MDksNyArMzA0Nyw4IEBACiAJCXJldHZhbCA9IG1zcHJvX3NldF9yd19jbWQoY2hpcCwgc3RhcnRfc2VjdG9yLCBjb3VudCwgcndfY21kKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfY2FyZC0+c2VxX21vZGUgPSAwOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTI2MjQsNyArMzA2Myw4IEBACiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJY2hpcC0+cndfbmVlZF9yZXRyeSA9IDA7CiAJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiTm8gY2FyZCBleGlzdCwgZXhpdCBtc3Byb19yd19tdWx0aV9zZWN0b3JcbiIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAodmFsICYgTVNfSU5UX0JSRVEpCkBAIC0yNjM2LDcgKzMwNzYsOCBAQAogCQkJbXNfYXV0b190dW5lX2Nsb2NrKGNoaXApOwogCQl9CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CiAJfQogCiAJaWYgKG1zX2NhcmQtPnNlcV9tb2RlKSB7CkBAIC0yNjY0LDEzICszMTA1LDE1IEBACiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnRtcCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX0ZBSUw7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoISh0bXAgJiBNU19JTlRfQlJFUSkpIHsKQEAgLTI2NzksNyArMzEyMiw4IEBACiAJCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAJCX0KIAkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKHNob3J0X2RhdGFfbGVuID49IDI1NikKQEAgLTI2OTEsMTQgKzMxMzUsMTYgQEAKIAkJCQlNU19OT19DSEVDS19JTlQpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBQUk9fUkVBRF9TSE9SVF9EQVRBLCBjbnQsIFdBSVRfSU5ULAogCQkJZGF0YSwgOCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX0ZBSUw7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAl0b3RhbF9wcm9ncmVzcyA9IChkYXRhWzBdIDw8IDI0KSB8IChkYXRhWzFdIDw8IDE2KSB8CkBAIC0yNzIzLDcgKzMxNjksOCBAQAogCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdG1wKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAkJaWYgKHRtcCAmIChNU19JTlRfQ0VEIHwgTVNfSU5UX0NNRE5LIHwKIAkJCQlNU19JTlRfQlJFUSB8IE1TX0lOVF9FUlIpKQpAQCAtMjczNSwxNyArMzE4MiwyMCBAQAogCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgTVNfQ0ZHLCBNU19OT19DSEVDS19JTlQsIDApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKGkgPT0gNTAwMCkgewogCQltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX0ZBSUw7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAodG1wICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIpKSB7CiAJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfRkFJTDsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmICh0bXAgJiBNU19JTlRfQ0VEKSB7CkBAIC0yNzU2LDcgKzMyMDYsOCBAQAogCX0gZWxzZSB7CiAJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfRkFJTDsKIAkJbXNfY2FyZC0+cHJvX3VuZGVyX2Zvcm1hdHRpbmcgPSAwOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjc4MCw3ICszMjMxLDcgQEAKIH0KIAogaW50IG1zcHJvX2Zvcm1hdChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCi0JCWludCBzaG9ydF9kYXRhX2xlbiwgaW50IHF1aWNrX2Zvcm1hdCkKKwkJaW50IHNob3J0X2RhdGFfbGVuLCBib29sIHF1aWNrX2Zvcm1hdCkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CiAJaW50IHJldHZhbCwgaTsKQEAgLTI3ODgsMTIgKzMyMzksMTYgQEAKIAl1MTYgcGFyYTsKIAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCAweDAwLCAweDAwLCBQcm9fVFBDUGFybSwgMHgwMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltZW1zZXQoYnVmLCAwLCAyKTsKIAlzd2l0Y2ggKHNob3J0X2RhdGFfbGVuKSB7CkBAIC0yODE4LDggKzMyNzMsMTAgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAocXVpY2tfZm9ybWF0KQogCQlwYXJhID0gMHgwMDAwOwpAQCAtMjgyNywxMyArMzI4NCwyMSBAQAogCQlwYXJhID0gMHgwMDAxOwogCiAJcmV0dmFsID0gbXNwcm9fc2V0X3J3X2NtZChjaGlwLCAwLCBwYXJhLCBQUk9fRk9STUFUKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdG1wKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdG1wKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCi0JaWYgKHRtcCAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAodG1wICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIpKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoKHRtcCAmIChNU19JTlRfQlJFUSB8IE1TX0lOVF9DRUQpKSA9PSBNU19JTlRfQlJFUSkgewogCQltc19jYXJkLT5wcm9fdW5kZXJfZm9ybWF0dGluZyA9IDE7CkBAIC0yODUwLDcgKzMzMTUsOCBAQAogCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAJfQogCi0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAogCkBAIC0yODY5LDE0ICszMzM1LDE3IEBACiAJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgewogCQlpZiAoKGV4dHJhWzFdICYgMHgzMCkgIT0gMHgzMCkgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwKIAkJCQlTeXN0ZW1QYXJtLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKQogCQlkYXRhWzBdID0gMHg4ODsKQEAgLTI4OTUsMTQgKzMzNjQsMTggQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwogCiAJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfUkVBRCwgV0FJVF9JTlQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcHRyID0gYnVmOwogCkBAIC0yOTExLDE2ICszMzg0LDIwIEBACiAKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgewogCQkJaWYgKHZhbCAmIElOVF9SRUdfQlJFUSkgewpAQCAtMjkzMywzNCArMzQxMCw0MiBAQAogCQkJCQkJCQlwYWdlX2FkZHIsIGV4dHJhLCBNU19FWFRSQV9TSVpFKTsKIAkJCQkJfQogCQkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfUkVBRF9FUlJPUik7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9SRUFEX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKCEodmFsICYgSU5UX1JFR19CUkVRKSkgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19CUkVRX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKIAkJaWYgKHBhZ2VfYWRkciA9PSAoZW5kX3BhZ2UgLSAxKSkgewogCQkJaWYgKCEodmFsICYgSU5UX1JFR19DRUQpKSB7CiAJCQkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfRU5ELCBXQUlUX0lOVCk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAJCQl9CiAKIAkJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsCiAJCQkJCSZ2YWwsIDEpOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCiAJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0NFRCkpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfUkVBRF9FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJdHJhbnNfY2ZnID0gTk9fV0FJVF9JTlQ7CkBAIC0yOTkzLDE5ICszNDc4LDIyIEBACiAJCQlpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwogCQkJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19USU1FRE9VVCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX1RJTUVET1VUOwogCQkJfQogCiAJCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdmFsKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwogCQkJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19USU1FRE9VVCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX1RJTUVET1VUOwogCQkJfQogCQkJaWYgKHZhbCAmIChNU19DUkMxNl9FUlIgfCBNU19SRFlfVElNRU9VVCkpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ1JDMTZfRVJST1IpOwogCQkJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCkBAIC0zMDI5LDggKzM1MTcsMTAgQEAKIAlpZiAoIXN0YXJ0X3BhZ2UpIHsKIAkJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsCiAJCQkJCVN5c3RlbVBhcm0sIDcpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKQogCQkJZGF0YVswXSA9IDB4ODg7CkBAIC0zMDQ3LDI0ICszNTM3LDMyIEBACiAKIAkJcmV0dmFsID0gbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCA3LCBOT19XQUlUX0lOVCwKIAkJCQkJZGF0YSwgOCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwogCQlyZXR2YWwgPSBtc190cmFuc2Zlcl90cGMoY2hpcCwgTVNfVE1fUkVBRF9CWVRFUywgR0VUX0lOVCwgMSwKIAkJCQkJTk9fV0FJVF9JTlQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLAogCQkJCVN5c3RlbVBhcm0sICg2ICsgTVNfRVhUUkFfU0laRSkpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIApAQCAtMzA5NiwyMCArMzU5NCwyNiBAQAogCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAJfQotCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgewogCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19XUklURSwgV0FJVF9JTlQpOwogCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAJfQotCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcHRyID0gYnVmOwogCWZvciAocGFnZV9hZGRyID0gc3RhcnRfcGFnZTsgcGFnZV9hZGRyIDwgZW5kX3BhZ2U7IHBhZ2VfYWRkcisrKSB7CkBAIC0zMTE3LDIwICszNjIxLDI0IEBACiAKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJCWlmICghKHZhbCAmIElOVF9SRUdfQlJFUSkpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19CUkVRX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJdWRlbGF5KDMwKTsKQEAgLTMxNjEsMzQgKzM2NjksNDMgQEAKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19UT19FUlJPUik7CiAJCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwogCi0JCQlpZiAocmV0dmFsID09IC1FVElNRURPVVQpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19USU1FRE9VVCk7Ci0JCQllbHNlCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgPT0gLUVUSU1FRE9VVCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19USU1FRE9VVDsKKwkJCX0KKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlpZiAoKGVuZF9wYWdlIC0gc3RhcnRfcGFnZSkgPT0gMSkgewogCQkJaWYgKCEodmFsICYgSU5UX1JFR19DRUQpKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKHBhZ2VfYWRkciA9PSAoZW5kX3BhZ2UgLSAxKSkgewogCQkJCWlmICghKHZhbCAmIElOVF9SRUdfQ0VEKSkgewogCQkJCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19FTkQsCiAJCQkJCQkJV0FJVF9JTlQpOwotCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQkJfQogCQkJCX0KIAogCQkJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwKIAkJCQkJCU5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAkJCX0KIAogCQkJaWYgKChwYWdlX2FkZHIgPT0gKGVuZF9wYWdlIC0gMSkpIHx8CkBAIC0zMTk2LDcgKzM3MTMsOCBAQAogCQkJCWlmICghKHZhbCAmIElOVF9SRUdfQ0VEKSkgewogCQkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwKIAkJCQkJCQlNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTMyMTcsOCArMzczNSwxMCBAQAogCiAJcmV0dmFsID0gbXNfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGssCiAJCQlwYWdlX29mZiwgbXNfY2FyZC0+cGFnZV9vZmYgKyAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXNlZ19ubyA9IG9sZF9ibGsgPj4gOTsKIApAQCAtMzI0NCw4ICszNzY0LDEwIEBACiAJaWYgKHN0YXJ0X3BhZ2UpIHsKIAkJcmV0dmFsID0gbXNfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGssCiAJCQkJMCwgc3RhcnRfcGFnZSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMzI2MCw4ICszNzgyLDEwIEBACiAKIAlpZiAoZGVsYXlfd3JpdGUtPmRlbGF5X3dyaXRlX2ZsYWcpIHsKIAkJcmV0dmFsID0gbXNfc2V0X2luaXRfcGFyYShjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZyA9IDA7CiAJCXJldHZhbCA9IG1zX2ZpbmlzaF93cml0ZShjaGlwLApAQCAtMzI2OSw4ICszNzkzLDEwIEBACiAJCQkJCWRlbGF5X3dyaXRlLT5uZXdfcGh5YmxvY2ssCiAJCQkJCWRlbGF5X3dyaXRlLT5sb2dibG9jaywKIAkJCQkJZGVsYXlfd3JpdGUtPnBhZ2VvZmYpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTMzMDksNyArMzgzNSw4IEBACiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJbXNfcndfZmFpbChzcmIsIGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJbG9nX2JsayA9ICh1MTYpKHN0YXJ0X3NlY3RvciA+PiBtc19jYXJkLT5ibG9ja19zaGlmdCk7CkBAIC0zMzI1LDcgKzM4NTIsOCBAQAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQljaGlwLT5jYXJkX2ZhaWwgfD0gTVNfQ0FSRDsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMzM0Miw3ICszODcwLDggQEAKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJb2xkX2JsayA9IGRlbGF5X3dyaXRlLT5vbGRfcGh5YmxvY2s7CiAJCQluZXdfYmxrID0gZGVsYXlfd3JpdGUtPm5ld19waHlibG9jazsKQEAgLTMzNTcsNyArMzg4Niw4IEBACiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KICNlbmRpZgogCQkJb2xkX2JsayA9IG1zX2dldF9sMnBfdGJsKGNoaXAsIHNlZ19ubywKQEAgLTMzNjYsNyArMzg5Niw4IEBACiAJCQlpZiAoKG9sZF9ibGsgPT0gMHhGRkZGKSB8fCAobmV3X2JsayA9PSAweEZGRkYpKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJcmV0dmFsID0gbXNfcHJlcGFyZV93cml0ZShjaGlwLCBvbGRfYmxrLCBuZXdfYmxrLApAQCAtMzM3NSwxMSArMzkwNiwxMyBAQAogCQkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0KIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogI2lmZGVmIE1TX0RFTEFZX1dSSVRFCiAJCX0KQEAgLTMzOTEsMTEgKzM5MjQsMTMgQEAKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogI2VuZGlmCiAJCW9sZF9ibGsgPSBtc19nZXRfbDJwX3RibChjaGlwLCBzZWdfbm8sCkBAIC0zNDAzLDcgKzM5MzgsOCBAQAogCQlpZiAob2xkX2JsayA9PSAweEZGRkYpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMzQzNiwxMCArMzk3MiwxMiBAQAogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJbXNfcndfZmFpbChzcmIsIGNoaXApOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CkBAIC0zNDc1LDcgKzQwMTMsOCBAQAogCQkJCWNoaXAtPmNhcmRfZmFpbCB8PSBNU19DQVJEOwogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCkBAIC0zNDgzLDE0ICs0MDIyLDE2IEBACiAJCQkJCWxvZ19ibGsgLSBtc19zdGFydF9pZHhbc2VnX25vXSk7CiAJCWlmIChvbGRfYmxrID09IDB4RkZGRikgewogCQkJbXNfcndfZmFpbChzcmIsIGNoaXApOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCQluZXdfYmxrID0gbXNfZ2V0X3VudXNlZF9ibG9jayhjaGlwLCBzZWdfbm8pOwogCQkJaWYgKG5ld19ibGsgPT0gMHhGRkZGKSB7CiAJCQkJbXNfcndfZmFpbChzcmIsIGNoaXApOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIApAQCAtMzUxNSwxMSArNDA1NiwxMyBAQAogCQkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0KIAogCQkJCW1zX3J3X2ZhaWwoc3JiLCBjaGlwKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogI2VuZGlmCiAJCX0KQEAgLTM1ODEsMTIgKzQxMjQsMTYgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCBNU19JTlRfQ0VELCBNU19JTlRfQ0VEKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgTVNfQ0FSRCwgNTAwMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAl2YWwgPSAqcnRzeF9nZXRfY21kX2RhdGEoY2hpcCk7Ci0JaWYgKHZhbCAmIE1TX0lOVF9FUlIpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHZhbCAmIE1TX0lOVF9FUlIpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTM2NDksMTIgKzQxOTYsMTUgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0zNjcxLDggKzQyMjEsMTAgQEAKIAllbHNlCiAJCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCAwLCAwLCBQcm9fRGF0YUNvdW50MSwgNik7CiAKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWJ1ZlswXSA9IDA7CiAJYnVmWzFdID0gMDsKQEAgLTM2ODQsOCArNDIzNiwxMCBAQAogCX0KIAlyZXR2YWwgPSBtc193cml0ZV9ieXRlcyhjaGlwLCBQUk9fV1JJVEVfUkVHLCAodHlwZSA9PSAwKSA/IDEgOiA2LAogCQkJCU5PX1dBSVRfSU5ULCBidWYsIDYpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMzY5OSwxOSArNDI1MywyMyBAQAogCiAJaWYgKHNjc2lfYnVmZmxlbihzcmIpIDwgMTIpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCW1zX2NsZWFudXBfd29yayhjaGlwKTsKIAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1nX3NlbmRfZXhfY21kKGNoaXAsIE1HX1NFVF9MSUQsIDApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9FU1RBQik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAltZW1zZXQoYnVmMSwgMCwgMzIpOwpAQCAtMzcyMywxMiArNDI4MSwxNCBAQAogCQkJCWJ1ZjEsIDMyKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfRVNUQUIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9FU1RBQik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0zNzQ0LDEyICs0MzA0LDE2IEBACiAJbXNfY2xlYW51cF93b3JrKGNoaXApOwogCiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJYnVmID0ga21hbGxvYygxNTQwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlidWZbMF0gPSAweDA0OwogCWJ1ZlsxXSA9IDB4MUE7CkBAIC0zNzU5LDcgKzQzMjMsOCBAQAogCXJldHZhbCA9IG1nX3NlbmRfZXhfY21kKGNoaXAsIE1HX0dFVF9MRUtCLCAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKLQkJVFJBQ0VfR09UTyhjaGlwLCBHZXRFS0JGaW5pc2gpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIEdldEVLQkZpbmlzaDsKIAl9CiAKIAlyZXR2YWwgPSBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX1RNX0FVVE9fUkVBRCwgUFJPX1JFQURfTE9OR19EQVRBLApAQCAtMzc2NywxMiArNDMzMiwxNCBAQAogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQlUUkFDRV9HT1RPKGNoaXAsIEdldEVLQkZpbmlzaCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gR2V0RUtCRmluaXNoOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWJ1ZmZsZW4gPSBtaW5fdChpbnQsIDEwNTIsIHNjc2lfYnVmZmxlbihzcmIpKTsKQEAgLTM3OTUsMjUgKzQzNjIsMzAgQEAKIAltc19jbGVhbnVwX3dvcmsoY2hpcCk7CiAKIAlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19HRVRfSUQsIDApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBQUk9fUkVBRF9TSE9SVF9EQVRBLCAzMiwgV0FJVF9JTlQsCiAJCQlidWYsIDMyKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCW1lbWNweShtc19jYXJkLT5tYWdpY19nYXRlX2lkLCBidWYsIDE2KTsKQEAgLTM4MjIsMTQgKzQzOTQsMTYgQEAKIAlyZXR2YWwgPSBtc19wb2xsX2ludChjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KICNlbmRpZgogCiAJcmV0dmFsID0gbWdfc2VuZF9leF9jbWQoY2hpcCwgTUdfU0VUX1JELCAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWJ1ZmZsZW4gPSBtaW5fdChpbnQsIDEyLCBzY3NpX2J1ZmZsZW4oc3JiKSk7CkBAIC0zODQ1LDEyICs0NDE5LDE0IEBACiAJCQkJMzIsIFdBSVRfSU5ULCBidWYsIDMyKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCW1zX2NhcmQtPm1nX2F1dGggPSAwOwpAQCAtMzg2OSwyNSArNDQ0NSwzMCBAQAogCW1zX2NsZWFudXBfd29yayhjaGlwKTsKIAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1nX3NlbmRfZXhfY21kKGNoaXAsIE1HX01BS0VfUk1TLCAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgUFJPX1JFQURfU0hPUlRfREFUQSwgMzIsIFdBSVRfSU5ULAogCQkJYnVmMSwgMzIpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJYnVmMlswXSA9IDB4MDA7CkBAIC0zOTA1LDcgKzQ0ODYsOCBAQAogCXJldHZhbCA9IG1zX3BvbGxfaW50KGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogI2VuZGlmCiAKQEAgLTM5MjQsMTMgKzQ1MDYsMTYgQEAKIAltc19jbGVhbnVwX3dvcmsoY2hpcCk7CiAKIAlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19NQUtFX0tTRSwgMCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlidWZmbGVuID0gbWluX3QoaW50LCAxMiwgc2NzaV9idWZmbGVuKHNyYikpOwpAQCAtMzk0NiwxMiArNDUzMSwxNCBAQAogCQkJCWJ1ZiwgMzIpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJbXNfY2FyZC0+bWdfYXV0aCA9IDE7CkBAIC0zOTcwLDEyICs0NTU3LDE2IEBACiAJbXNfY2xlYW51cF93b3JrKGNoaXApOwogCiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJYnVmID0ga21hbGxvYygxMDI4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlidWZbMF0gPSAweDA0OwogCWJ1ZlsxXSA9IDB4MDI7CkBAIC0zOTg1LDcgKzQ1NzYsOCBAQAogCXJldHZhbCA9IG1nX3NlbmRfZXhfY21kKGNoaXAsIE1HX0dFVF9JQkQsIG1zX2NhcmQtPm1nX2VudHJ5X251bSk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJVFJBQ0VfR09UTyhjaGlwLCBHZXRJQ1ZGaW5pc2gpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIEdldElDVkZpbmlzaDsKIAl9CiAKIAlyZXR2YWwgPSBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX1RNX0FVVE9fUkVBRCwgUFJPX1JFQURfTE9OR19EQVRBLApAQCAtMzk5MywxMiArNDU4NSwxNCBAQAogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX0dPVE8oY2hpcCwgR2V0SUNWRmluaXNoKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBHZXRJQ1ZGaW5pc2g7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlidWZmbGVuID0gbWluX3QoaW50LCAxMDI4LCBzY3NpX2J1ZmZsZW4oc3JiKSk7CkBAIC00MDIzLDEyICs0NjE3LDE2IEBACiAJbXNfY2xlYW51cF93b3JrKGNoaXApOwogCiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJYnVmID0ga21hbGxvYygxMDI4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlidWZmbGVuID0gbWluX3QoaW50LCAxMDI4LCBzY3NpX2J1ZmZsZW4oc3JiKSk7CiAJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGJ1ZmZsZW4sIHNyYik7CkBAIC00MDQ1LDcgKzQ2NDMsOCBAQAogCQl9IGVsc2UgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX1dSSVRFX0VSUik7CiAJCX0KLQkJVFJBQ0VfR09UTyhjaGlwLCBTZXRJQ1ZGaW5pc2gpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNldElDVkZpbmlzaDsKIAl9CiAKICNpZmRlZiBNR19TRVRfSUNWX1NMT1cKQEAgLTQwODQsNyArNDY4Myw4IEBACiAJCQkJCVNFTlNFX1RZUEVfTUdfV1JJVEVfRVJSKTsKIAkJCX0KIAkJCXJldHZhbCA9IFNUQVRVU19GQUlMOwotCQkJVFJBQ0VfR09UTyhjaGlwLCBTZXRJQ1ZGaW5pc2gpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU2V0SUNWRmluaXNoOwogCQl9CiAJfQogI2Vsc2UKQEAgLTQxMDIsNyArNDcwMiw4IEBACiAJCX0gZWxzZSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfV1JJVEVfRVJSKTsKIAkJfQotCQlUUkFDRV9HT1RPKGNoaXAsIFNldElDVkZpbmlzaCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU2V0SUNWRmluaXNoOwogCX0KICNlbmRpZgogCkBAIC00MTQyLDIyICs0NzQzLDM3IEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IGRpc2FibGVfY2FyZF9jbG9jayhjaGlwLCBNU19DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKIAkJcmV0dmFsID0gbXNfcHVsbF9jdGxfZGlzYWJsZShjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9IGVsc2UgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUEdBX1BVTExfQ1RMLAotCQkJRlBHQV9NU19QVUxMX0NUTF9CSVQgfCAweDIwLCBGUEdBX01TX1BVTExfQ1RMX0JJVCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBHQV9QVUxMX0NUTCwKKwkJCQkJICAgICBGUEdBX01TX1BVTExfQ1RMX0JJVCB8IDB4MjAsCisJCQkJCSAgICAgRlBHQV9NU19QVUxMX0NUTF9CSVQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX09FLCBNU19PVVRQVVRfRU4sIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9PRSwgTVNfT1VUUFVUX0VOLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWlmICghY2hpcC0+ZnQyX2Zhc3RfbW9kZSkgewogCQlyZXR2YWwgPSBjYXJkX3Bvd2VyX29mZihjaGlwLCBNU19DQVJEKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC00MTg1LDggKzQ4MDEsMTAgQEAKICNlbmRpZgogCiAJcmV0dmFsID0gbXNfcG93ZXJfb2ZmX2NhcmQzdjMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaAppbmRleCAyNmM1YjAzLi5kOTE5MTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmgKQEAgLTIwNSw3ICsyMDUsNyBAQAogaW50IG1zX3J3KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKIAl1MzIgc3RhcnRfc2VjdG9yLCB1MTYgc2VjdG9yX2NudCk7CiBpbnQgbXNwcm9fZm9ybWF0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKLQkJaW50IHNob3J0X2RhdGFfbGVuLCBpbnQgcXVpY2tfZm9ybWF0KTsKKwkJaW50IHNob3J0X2RhdGFfbGVuLCBib29sIHF1aWNrX2Zvcm1hdCk7CiB2b2lkIG1zX2ZyZWVfbDJwX3RibChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIHZvaWQgbXNfY2xlYW51cF93b3JrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApOwogaW50IG1zX3Bvd2VyX29mZl9jYXJkM3YzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCmluZGV4IGM3NGYxYjguLmQ2NGI2ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKQEAgLTI2LDEyICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlICJydHN4LmgiCi0jaW5jbHVkZSAicnRzeF9jaGlwLmgiCi0jaW5jbHVkZSAicnRzeF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJydHN4X3Njc2kuaCIKLSNpbmNsdWRlICJydHN4X2NhcmQuaCIKLSNpbmNsdWRlICJnZW5lcmFsLmgiCi0KICNpbmNsdWRlICJtcy5oIgogI2luY2x1ZGUgInNkLmgiCiAjaW5jbHVkZSAieGQuaCIKQEAgLTEzNyw4ICsxMzEsOCBAQAogCiAJLyogY2hlY2sgZm9yIHN0YXRlLXRyYW5zaXRpb24gZXJyb3JzICovCiAJaWYgKGNoaXAtPnNyYiAhPSBOVUxMKSB7Ci0JCWRldl9lcnIoJmRldi0+cGNpLT5kZXYsICJFcnJvciBpbiAlczogY2hpcC0+c3JiID0gJXBcbiIsCi0JCQlfX2Z1bmNfXywgY2hpcC0+c3JiKTsKKwkJZGV2X2VycigmZGV2LT5wY2ktPmRldiwgIkVycm9yOiBjaGlwLT5zcmIgPSAlcFxuIiwKKwkJCWNoaXAtPnNyYik7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogCX0KIApAQCAtMTAzNiw3ICsxMDMwLDcgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBydHN4X2lkcyk7CiAKIC8qIHBjaV9kcml2ZXIgZGVmaW5pdGlvbiAqLwotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydHN4X2RyaXZlciA9IHsKIAkubmFtZSA9IENSX0RSSVZFUl9OQU1FLAogCS5pZF90YWJsZSA9IHJ0c3hfaWRzLAogCS5wcm9iZSA9IHJ0c3hfcHJvYmUsCkBAIC0xMDQ4LDIxICsxMDQyLDQgQEAKIAkuc2h1dGRvd24gPSBydHN4X3NodXRkb3duLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcnRzeF9pbml0KHZvaWQpCi17Ci0JcHJfaW5mbygiSW5pdGlhbGl6aW5nIFJlYWx0ZWsgUENJRSBzdG9yYWdlIGRyaXZlci4uLlxuIik7Ci0KLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHJ0c3hfZXhpdCh2b2lkKQotewotCXByX2luZm8oInJ0c3hfZXhpdCgpIGNhbGxlZFxuIik7Ci0KLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Ci0KLQlwcl9pbmZvKCIlcyBtb2R1bGUgZXhpdFxuIiwgQ1JfRFJJVkVSX05BTUUpOwotfQotCi1tb2R1bGVfaW5pdChydHN4X2luaXQpCi1tb2R1bGVfZXhpdChydHN4X2V4aXQpCittb2R1bGVfcGNpX2RyaXZlcihydHN4X2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmgKaW5kZXggOWU2ZWNiNy4uMjYyNDQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guaApAQCAtNDYsOSArNDYsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAKLSNpbmNsdWRlICJ0cmFjZS5oIgotI2luY2x1ZGUgImdlbmVyYWwuaCIKLQogI2RlZmluZSBDUl9EUklWRVJfTkFNRQkJInJ0czUyMDgiCiAKICNkZWZpbmUgcGNpX2dldF9idXNfYW5kX3Nsb3QoYnVzLCBkZXZmbikJXApAQCAtMTgxLDQgKzE3OCwxNCBAQAogCiBpbnQgcnRzeF9yZWFkX3BjaV9jZmdfYnl0ZSh1OCBidXMsIHU4IGRldiwgdTggZnVuYywgdTggb2Zmc2V0LCB1OCAqdmFsKTsKIAorI2RlZmluZSBfTVNHX1RSQUNFCisKKyNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInJ0c3hfY2hpcC5oIgorI2luY2x1ZGUgInJ0c3hfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAicnRzeF9zY3NpLmgiCisjaW5jbHVkZSAicnRzeF9jYXJkLmgiCisjaW5jbHVkZSAicnRzeF9zeXMuaCIKKyNpbmNsdWRlICJnZW5lcmFsLmgiCisKICNlbmRpZiAgLyogX19SRUFMVEVLX1JUU1hfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwppbmRleCBiNDU5NWFiLi40Mzc0MzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwpAQCAtMjcsMTMgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgInJ0c3guaCIKLSNpbmNsdWRlICJydHN4X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInJ0c3hfc2NzaS5oIgotI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgotCi0jaW5jbHVkZSAicnRzeF9zeXMuaCIKLSNpbmNsdWRlICJnZW5lcmFsLmgiCi0KICNpbmNsdWRlICJzZC5oIgogI2luY2x1ZGUgInhkLmgiCiAjaW5jbHVkZSAibXMuaCIKQEAgLTY1Nyw4ICs2NTAsMTAgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU3dpdGNoIFNTQyBjbG9jayB0byAlZE1IeiAoY3VyX2NsayA9ICVkKVxuIiwKIAkJY2xrLCBjaGlwLT5jdXJfY2xrKTsKIAotCWlmICgoY2xrIDw9IDIpIHx8IChOID4gbWF4X04pKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICgoY2xrIDw9IDIpIHx8IChOID4gbWF4X04pKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltY3VfY250ID0gKHU4KSgxMjUvY2xrICsgMyk7CiAJaWYgKG1jdV9jbnQgPiA3KQpAQCAtNjk3LDExICs2OTIsMTcgQEAKIAl9CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIFdBSVRfVElNRSk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJdWRlbGF5KDEwKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCBDTEtfTE9XX0ZSRVEsIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX0NUTCwgQ0xLX0xPV19GUkVRLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJY2hpcC0+Y3VyX2NsayA9IGNsazsKIApAQCAtNzEwLDYgKzcxMSw3IEBACiAKIGludCBzd2l0Y2hfbm9ybWFsX2Nsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBjbGspCiB7CisJaW50IHJldHZhbDsKIAl1OCBzZWwsIGRpdiwgbWN1X2NudDsKIAlpbnQgc2RfdnBjbGtfcGhhc2VfcmVzZXQgPSAwOwogCkBAIC03OTAsMjYgKzc5Miw2MiBAQAogCWRlZmF1bHQ6CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJUcnkgdG8gc3dpdGNoIHRvIGFuIGlsbGVnYWwgY2xvY2sgKCVkKVxuIiwKIAkJCWNsayk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCAweEZGLCBDTEtfTE9XX0ZSRVEpOwotCWlmIChzZF92cGNsa19waGFzZV9yZXNldCkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsIDApOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzFfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX0NUTCwgMHhGRiwgQ0xLX0xPV19GUkVRKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CiAJfQotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENMS19ESVYsIDB4RkYsIChkaXYgPDwgNCkgfCBtY3VfY250KTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfU0VMLCAweEZGLCBzZWwpOworCWlmIChzZF92cGNsa19waGFzZV9yZXNldCkgeworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsCisJCQkJCSAgICAgUEhBU0VfTk9UX1JFU0VULCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9WUENMSzFfQ1RMLAorCQkJCQkgICAgIFBIQVNFX05PVF9SRVNFVCwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX0RJViwgMHhGRiwKKwkJCQkgICAgIChkaXYgPDwgNCkgfCBtY3VfY250KTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX1NFTCwgMHhGRiwgc2VsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKHNkX3ZwY2xrX3BoYXNlX3Jlc2V0KSB7CiAJCXVkZWxheSgyMDApOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsCi0JCQkJUEhBU0VfTk9UX1JFU0VUKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEsxX0NUTCwgUEhBU0VfTk9UX1JFU0VULAotCQkJCVBIQVNFX05PVF9SRVNFVCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfVlBDTEswX0NUTCwKKwkJCQkJICAgICBQSEFTRV9OT1RfUkVTRVQsIFBIQVNFX05PVF9SRVNFVCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfVlBDTEsxX0NUTCwKKwkJCQkJICAgICBQSEFTRV9OT1RfUkVTRVQsIFBIQVNFX05PVF9SRVNFVCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCXVkZWxheSgyMDApOwogCX0KLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCAweEZGLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19DVEwsIDB4RkYsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAljaGlwLT5jdXJfY2xrID0gY2xrOwogCkBAIC04NDQsNiArODgyLDcgQEAKIAogaW50IGVuYWJsZV9jYXJkX2Nsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGNhcmQpCiB7CisJaW50IHJldHZhbDsKIAl1OCBjbGtfZW4gPSAwOwogCiAJaWYgKGNhcmQgJiBYRF9DQVJEKQpAQCAtODUzLDEzICs4OTIsMTggQEAKIAlpZiAoY2FyZCAmIE1TX0NBUkQpCiAJCWNsa19lbiB8PSBNU19DTEtfRU47CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0NMS19FTiwgY2xrX2VuLCBjbGtfZW4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9DTEtfRU4sIGNsa19lbiwgY2xrX2VuKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCiBpbnQgZGlzYWJsZV9jYXJkX2Nsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGNhcmQpCiB7CisJaW50IHJldHZhbDsKIAl1OCBjbGtfZW4gPSAwOwogCiAJaWYgKGNhcmQgJiBYRF9DQVJEKQpAQCAtODY5LDcgKzkxMywxMSBAQAogCWlmIChjYXJkICYgTVNfQ0FSRCkKIAkJY2xrX2VuIHw9IE1TX0NMS19FTjsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfQ0xLX0VOLCBjbGtfZW4sIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9DTEtfRU4sIGNsa19lbiwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTg5Myw4ICs5NDEsMTAgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QV1JfQ1RMLCBtYXNrLCB2YWwxKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMTAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXVkZWxheShjaGlwLT5wbW9zX3B3cl9vbl9pbnRlcnZhbCk7CiAKQEAgLTkwMiwxNCArOTUyLDE3IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFdSX0NUTCwgbWFzaywgdmFsMik7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDEwMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIGludCBjYXJkX3Bvd2VyX29mZihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjYXJkKQogeworCWludCByZXR2YWw7CiAJdTggbWFzaywgdmFsOwogCiAJaWYgKENIRUNLX0xVTl9NT0RFKGNoaXAsIFNEX01TXzJMVU4pICYmIChjYXJkID09IE1TX0NBUkQpKSB7CkBAIC05MjAsNyArOTczLDExIEBACiAJCXZhbCA9IFNEX1BPV0VSX09GRjsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIG1hc2ssIHZhbCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BXUl9DVEwsIG1hc2ssIHZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTkzMiw4ICs5ODksMTAgQEAKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKIAlpbnQgaTsKIAotCWlmIChjaGlwLT5yd19jYXJkW2x1bl0gPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoY2hpcC0+cndfY2FyZFtsdW5dID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJY2hpcC0+cndfbmVlZF9yZXRyeSA9IDA7CkBAIC05NDIsMTEgKzEwMDEsMTQgQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKHJ0c3hfY2hlY2tfY2hpcF9leGlzdChjaGlwKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXJ0c3hfcmVsZWFzZV9jaGlwKGNoaXApOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgY2hpcC0+Y3VyX2NhcmQpICE9Ci0JCQkJCQkJU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJCQlTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCiAJCQlpZiAoIWNoaXAtPnJ3X25lZWRfcmV0cnkpIHsKIAkJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiUlcgZmFpbCwgYnV0IG5vIG5lZWQgdG8gcmV0cnlcbiIpOwpAQCAtOTY1LDYgKzEwMjcsNyBAQAogCiBpbnQgY2FyZF9zaGFyZV9tb2RlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBjYXJkKQogeworCWludCByZXR2YWw7CiAJdTggbWFzaywgdmFsdWU7CiAKIAlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkpIHsKQEAgLTk3NSw4ICsxMDM4LDEwIEBACiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfNDhfTVM7CiAJCWVsc2UgaWYgKGNhcmQgPT0gWERfQ0FSRCkKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV80OF9YRDsKLQkJZWxzZQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJZWxzZSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAl9IGVsc2UgaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CiAJCW1hc2sgPSAweDAzOwpAQCAtOTg2LDE0ICsxMDUxLDIxIEBACiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfQkFST1NTQV9NUzsKIAkJZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKQogCQkJdmFsdWUgPSBDQVJEX1NIQVJFX0JBUk9TU0FfWEQ7Ci0JCWVsc2UKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWVsc2UgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJfSBlbHNlIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfU0hBUkVfTU9ERSwgbWFzaywgdmFsdWUpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9TSEFSRV9NT0RFLCBtYXNrLCB2YWx1ZSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTEwMTQsMTUgKzEwODYsMjMgQEAKIAkJCW1vZCA9IFhEX01PRF9TRUw7CiAJCWVsc2UgaWYgKGNhcmQgPT0gU1BJX0NBUkQpCiAJCQltb2QgPSBTUElfTU9EX1NFTDsKLQkJZWxzZQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJZWxzZSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9TRUxFQ1QsIDB4MDcsIG1vZCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9TRUxFQ1QsIDB4MDcsIG1vZCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWNoaXAtPmN1cl9jYXJkID0gY2FyZDsKIAogCQlyZXR2YWwgPSAgY2FyZF9zaGFyZV9tb2RlKGNoaXAsIGNhcmQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTEwNjcsMTIgKzExNDcsMTUgQEAKIAkJY2FyZF9jZCA9IFhEX0VYSVNUOwogCX0gZWxzZSB7CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJXcm9uZyBjYXJkIHR5cGU6IDB4JXhcbiIsIGNhcmQpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJc3RhdHVzID0gcnRzeF9yZWFkbChjaGlwLCBSVFNYX0JJUFIpOwotCWlmICghKHN0YXR1cyAmIGNhcmRfY2QpKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICghKHN0YXR1cyAmIGNhcmRfY2QpKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5oCmluZGV4IDc1Y2Y1ODguLjhmMmNmOWE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmgKQEAgLTEwNjEsNyArMTA2MSwxMyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjYXJkX3Bvd2VyX29mZl9hbGwoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIDB4MEYsIDB4MEYpOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFdSX0NUTCwgMHgwRiwgMHgwRik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmMKaW5kZXggOTU5M2Q4MS4uMGMxNzE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmMKQEAgLTI3LDEzICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSAicnRzeC5oIgotI2luY2x1ZGUgInJ0c3hfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAicnRzeF9zY3NpLmgiCi0jaW5jbHVkZSAicnRzeF9jYXJkLmgiCi0jaW5jbHVkZSAicnRzeF9jaGlwLmgiCi0jaW5jbHVkZSAicnRzeF9zeXMuaCIKLSNpbmNsdWRlICJnZW5lcmFsLmgiCi0KICNpbmNsdWRlICJzZC5oIgogI2luY2x1ZGUgInhkLmgiCiAjaW5jbHVkZSAibXMuaCIKQEAgLTEyMywyMiArMTE2LDQ2IEBACiAKIHN0YXRpYyBpbnQgcnRzeF9wcmVfaGFuZGxlX3NkaW9fb2xkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CisJaW50IHJldHZhbDsKKwogCWlmIChjaGlwLT5pZ25vcmVfc2QgJiYgQ0hLX1NESU9fRVhJU1QoY2hpcCkpIHsKIAkJaWYgKGNoaXAtPmFzaWNfY29kZSkgewotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsCi0JCQkJICAgICAgIE1TX0lOU19QVSB8IFNEX1dQX1BVIHwKLQkJCQkgICAgICAgU0RfQ0RfUFUgfCBTRF9DTURfUFUpOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNSwKKwkJCQkJCSAgICAgMHhGRiwKKwkJCQkJCSAgICAgTVNfSU5TX1BVIHwgU0RfV1BfUFUgfCBTRF9DRF9QVSB8IFNEX0NNRF9QVSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQl9IGVsc2UgewotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRlBHQV9QVUxMX0NUTCwgMHhGRiwKLQkJCQkgICAgICAgRlBHQV9TRF9QVUxMX0NUTF9FTik7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQR0FfUFVMTF9DVEwsCisJCQkJCQkgICAgIDB4RkYsCisJCQkJCQkgICAgIEZQR0FfU0RfUFVMTF9DVExfRU4pOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1NIQVJFX01PREUsIDB4RkYsIENBUkRfU0hBUkVfNDhfU0QpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU0hBUkVfTU9ERSwgMHhGRiwKKwkJCQkJICAgICBDQVJEX1NIQVJFXzQ4X1NEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAogCQkvKiBFbmFibGUgU0RJTyBpbnRlcm5hbCBjbG9jayAqLwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCAweEZGMkMsIDB4MDEsIDB4MDEpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIDB4RkYyQywgMHgwMSwgMHgwMSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RJT19DVFJMLCAweEZGLAotCQkJICAgICAgIFNESU9fQlVTX0NUUkwgfCBTRElPX0NEX0NUUkwpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNESU9fQ1RSTCwgMHhGRiwKKwkJCQkJICAgICBTRElPX0JVU19DVFJMIHwgU0RJT19DRF9DVFJMKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAogCQljaGlwLT5zZF9pbnQgPSAxOwogCQljaGlwLT5zZF9pbyA9IDE7CkBAIC0xNTMsMjIgKzE3MCwzMCBAQAogc3RhdGljIGludCBydHN4X3ByZV9oYW5kbGVfc2Rpb19uZXcoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAl1OCB0bXA7Ci0JaW50IHN3X2J5cGFzc19zZCA9IDA7CisJYm9vbCBzd19ieXBhc3Nfc2QgPSBmYWxzZTsKIAlpbnQgcmV0dmFsOwogCiAJaWYgKGNoaXAtPmRyaXZlcl9maXJzdF9sb2FkKSB7CiAJCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgewotCQkJUlRTWF9SRUFEX1JFRyhjaGlwLCAweEZFNUEsICZ0bXApOworCQkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIDB4RkU1QSwgJnRtcCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJaWYgKHRtcCAmIDB4MDgpCi0JCQkJc3dfYnlwYXNzX3NkID0gMTsKKwkJCQlzd19ieXBhc3Nfc2QgPSB0cnVlOwogCQl9IGVsc2UgaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7Ci0JCQlSVFNYX1JFQURfUkVHKGNoaXAsIDB4RkU3MCwgJnRtcCk7CisJCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgMHhGRTcwLCAmdG1wKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCQlpZiAodG1wICYgMHg4MCkKLQkJCQlzd19ieXBhc3Nfc2QgPSAxOworCQkJCXN3X2J5cGFzc19zZCA9IHRydWU7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoY2hpcC0+c2Rpb19pbl9jaGFyZ2UpCi0JCQlzd19ieXBhc3Nfc2QgPSAxOworCQkJc3dfYnlwYXNzX3NkID0gdHJ1ZTsKIAl9CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgImNoaXAtPnNkaW9faW5fY2hhcmdlID0gJWRcbiIsCiAJCWNoaXAtPnNkaW9faW5fY2hhcmdlKTsKQEAgLTE4MCwxNyArMjA1LDM3IEBACiAJaWYgKHN3X2J5cGFzc19zZCkgewogCQl1OCBjZF90b2dnbGVfbWFzayA9IDA7CiAKLQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBUTFBUSVNUQVQsICZ0bXApOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgVExQVElTVEFULCAmdG1wKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJY2RfdG9nZ2xlX21hc2sgPSAweDA4OwogCiAJCWlmICh0bXAgJiBjZF90b2dnbGVfbWFzaykgewogCQkJLyogRGlzYWJsZSBzZGlvX2J1c19hdXRvX3N3aXRjaCAqLwotCQkJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKQotCQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIDB4RkU1QSwgMHgwOCwgMHgwMCk7Ci0JCQllbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkKLQkJCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCAweEZFNzAsIDB4ODAsIDB4MDApOworCQkJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CisJCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCAweEZFNUEsCisJCQkJCQkJICAgICAweDA4LCAweDAwKTsKKwkJCQlpZiAocmV0dmFsKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiByZXR2YWw7CisJCQkJfQorCQkJfSBlbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgeworCQkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgMHhGRTcwLAorCQkJCQkJCSAgICAgMHg4MCwgMHgwMCk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0KKwkJCX0KIAotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgVExQVElTVEFULCAweEZGLCB0bXApOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBUTFBUSVNUQVQsIDB4RkYsCisJCQkJCQkgICAgIHRtcCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCiAJCQljaGlwLT5uZWVkX3Jlc2V0IHw9IFNEX0NBUkQ7CiAJCX0gZWxzZSB7CkBAIC0xOTgsMjcgKzI0Myw1MiBAQAogCiAJCQlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCQkJcmV0dmFsID0gc2RfcHVsbF9jdGxfZW5hYmxlKGNoaXApOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUEdBX1BVTExfQ1RMLAotCQkJCQkgICAgICAgRlBHQV9TRF9QVUxMX0NUTF9CSVQgfCAweDIwLCAwKTsKKwkJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsCisJCQkJCQkJICAgICBGUEdBX1BVTExfQ1RMLAorCQkJCQkJCSAgICAgRlBHQV9TRF9QVUxMX0NUTF9CSVQgfCAweDIwLAorCQkJCQkJCSAgICAgMCk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0KIAkJCX0KIAkJCXJldHZhbCA9IGNhcmRfc2hhcmVfbW9kZShjaGlwLCBTRF9DQVJEKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJLyogRW5hYmxlIHNkaW9fYnVzX2F1dG9fc3dpdGNoICovCi0JCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpCi0JCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgMHhGRTVBLCAweDA4LCAweDA4KTsKLQkJCWVsc2UgaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKQotCQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIDB4RkU3MCwgMHg4MCwgMHg4MCk7CisJCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKKwkJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIDB4RkU1QSwKKwkJCQkJCQkgICAgIDB4MDgsIDB4MDgpOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CisJCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCAweEZFNzAsCisJCQkJCQkJICAgICAweDgwLCAweDgwKTsKKwkJCQlpZiAocmV0dmFsKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiByZXR2YWw7CisJCQkJfQorCQkJfQogCiAJCQljaGlwLT5jaGlwX2luc2VydF93aXRoX3NkaW8gPSAxOwogCQkJY2hpcC0+c2RfaW8gPSAxOwogCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgVExQVElTVEFULCAweDA4LCAweDA4KTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBUTFBUSVNUQVQsIDB4MDgsIDB4MDgpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCiAJCWNoaXAtPm5lZWRfcmVzZXQgfD0gU0RfQ0FSRDsKIAl9CkBAIC0yMzcsMjUgKzMwNywzNiBAQAogCiAJCXJldCA9IHJ0c3hfd3JpdGVfY2ZnX2R3KGNoaXAsIDIsIDB4QzAsIDB4RkYsCiAJCQkJCWNoaXAtPmFzcG1fbDBzX2wxX2VuKTsKLQkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAJfQogCi0JaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBBU1BNX0ZPUkNFX0NUTCwgMHhGRiwgMHgzRik7CisJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CisJCXJldCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQVNQTV9GT1JDRV9DVEwsIDB4RkYsIDB4M0YpOworCQlpZiAocmV0KSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KIAlyZXQgPSBydHN4X3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAsIExDVExSLCBjaGlwLT5hc3BtX2wwc19sMV9lbik7Ci0JaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAljaGlwLT5hc3BtX2xldmVsWzBdID0gY2hpcC0+YXNwbV9sMHNfbDFfZW47CiAJaWYgKENIS19TRElPX0VYSVNUKGNoaXApKSB7CiAJCWNoaXAtPmFzcG1fbGV2ZWxbMV0gPSBjaGlwLT5hc3BtX2wwc19sMV9lbjsKIAkJcmV0ID0gcnRzeF93cml0ZV9jZmdfZHcoY2hpcCwgQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkgPyAyIDogMSwKIAkJCQkJMHhDMCwgMHhGRiwgY2hpcC0+YXNwbV9sMHNfbDFfZW4pOwotCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWNoaXAtPmFzcG1fZW5hYmxlZCA9IDE7CkBAIC0yNzMsNyArMzU0LDExIEBACiAJfQogCiAJaWYgKGNoaXAtPnBoeV9kZWJ1Z19tb2RlKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENEUkVTVU1FQ1RMLCAweDc3LCAwKTsKKwkJcmV0ID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRFJFU1VNRUNUTCwgMHg3NywgMCk7CisJCWlmIChyZXQpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJCXJ0c3hfZGlzYWJsZV9idXNfaW50KGNoaXApOwogCX0gZWxzZSB7CiAJCXJ0c3hfZW5hYmxlX2J1c19pbnQoY2hpcCk7CkBAIC0yODMsMjMgKzM2OCwzMSBAQAogCQl1MTYgcmVnOwogCiAJCXJldCA9IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgMHgwMCwgJnJlZyk7Ci0JCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmVnICY9IDB4RkU3RjsKIAkJcmVnIHw9IDB4ODA7CiAJCXJldCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MDAsIHJlZyk7Ci0JCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0ID0gcnRzeF9yZWFkX3BoeV9yZWdpc3RlcihjaGlwLCAweDFDLCAmcmVnKTsKLQkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZWcgJj0gMHhGRkY3OwogCQlyZXQgPSBydHN4X3dyaXRlX3BoeV9yZWdpc3RlcihjaGlwLCAweDFDLCByZWcpOwotCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWlmIChjaGlwLT5kcml2ZXJfZmlyc3RfbG9hZCAmJiAoY2hpcC0+aWNfdmVyc2lvbiA8IElDX1ZFUl9DKSkKQEAgLTMxNiw0NyArNDA5LDExNiBAQAogCiAJcnRzeF9kaXNhYmxlX2FzcG0oY2hpcCk7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBIT1NUX1NMRUVQX1NUQVRFLCAweDAzLCAweDAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEhPU1RfU0xFRVBfU1RBVEUsIDB4MDMsIDB4MDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAkvKiBEaXNhYmxlIGNhcmQgY2xvY2sgKi8KLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0NMS19FTiwgMHgxRSwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0NMS19FTiwgMHgxRSwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogI2lmZGVmIFNVUFBPUlRfT0NQCiAJLyogU1NDIHBvd2VyIG9uLCBPQ0QgcG93ZXIgb24gKi8KLQlpZiAoQ0hFQ0tfTFVOX01PREUoY2hpcCwgU0RfTVNfMkxVTikpCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIEZQRENUTCwgT0NfUE9XRVJfRE9XTiwgMCk7Ci0JZWxzZQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUERDVEwsIE9DX1BPV0VSX0RPV04sIE1TX09DX1BPV0VSX0RPV04pOworCWlmIChDSEVDS19MVU5fTU9ERShjaGlwLCBTRF9NU18yTFVOKSkgeworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQRENUTCwgT0NfUE9XRVJfRE9XTiwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUERDVEwsIE9DX1BPV0VSX0RPV04sCisJCQkJCSAgICAgTVNfT0NfUE9XRVJfRE9XTik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgT0NQUEFSQTEsIE9DUF9USU1FX01BU0ssIE9DUF9USU1FXzgwMCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgT0NQUEFSQTIsIE9DUF9USERfTUFTSywgT0NQX1RIRF8yNDRfOTQ2KTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBPQ1BDVEwsIDB4RkYsIENBUkRfT0NfSU5UX0VOIHwgQ0FSRF9ERVRFQ1RfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgT0NQUEFSQTEsIE9DUF9USU1FX01BU0ssCisJCQkJICAgICBPQ1BfVElNRV84MDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBPQ1BQQVJBMiwgT0NQX1RIRF9NQVNLLAorCQkJCSAgICAgT0NQX1RIRF8yNDRfOTQ2KTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgT0NQQ1RMLCAweEZGLAorCQkJCSAgICAgQ0FSRF9PQ19JTlRfRU4gfCBDQVJEX0RFVEVDVF9FTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KICNlbHNlCiAJLyogT0MgcG93ZXIgZG93biAqLwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIEZQRENUTCwgT0NfUE9XRVJfRE9XTiwgT0NfUE9XRVJfRE9XTik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUERDVEwsIE9DX1BPV0VSX0RPV04sCisJCQkJICAgICBPQ19QT1dFUl9ET1dOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogI2VuZGlmCiAKLQlpZiAoIUNIRUNLX1BJRChjaGlwLCAweDUyODgpKQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0dQSU9fRElSLCAweEZGLCAweDAzKTsKKwlpZiAoIUNIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPX0RJUiwgMHhGRiwgMHgwMyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQogCiAJLyogVHVybiBvZmYgTEVEICovCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9HUElPLCAweEZGLCAweDAzKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgMHhGRiwgMHgwMyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCS8qIFJlc2V0IGRlbGluayBtb2RlICovCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsIDB4MEEsIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsIDB4MEEsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAkvKiBDYXJkIGRyaXZpbmcgc2VsZWN0ICovCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9EUklWRV9TRUwsIDB4RkYsIGNoaXAtPmNhcmRfZHJpdmVfc2VsKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfRFJJVkVfU0VMLCAweEZGLAorCQkJCSAgICAgY2hpcC0+Y2FyZF9kcml2ZV9zZWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKICNpZmRlZiBMRURfQVVUT19CTElOSwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfQVVUT19CTElOSywgMHhGRiwKLQkJICAgICAgIExFRF9CTElOS19TUEVFRCB8IEJMSU5LX0VOIHwgTEVEX0dQSU8wKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfQVVUT19CTElOSywgMHhGRiwKKwkJCQkgICAgIExFRF9CTElOS19TUEVFRCB8IEJMSU5LX0VOIHwgTEVEX0dQSU8wKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogI2VuZGlmCiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCS8qIEVuYWJsZSBTU0MgQ2xvY2sgKi8KLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU1NDX0NUTDEsIDB4RkYsIFNTQ184WF9FTiB8IFNTQ19TRUxfNE0pOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTU0NfQ1RMMiwgMHhGRiwgMHgxMik7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU1NDX0NUTDEsIDB4RkYsCisJCQkJCSAgICAgU1NDXzhYX0VOIHwgU1NDX1NFTF80TSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU1NDX0NUTDIsIDB4RkYsIDB4MTIpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KIAogCS8qIERpc2FibGUgY2RfcHdyX3NhdmUgKHVfZm9yY2VfcnN0X2NvcmVfZW49MCwgdV9jZF9yc3RfY29yZV9lbj0wKQpAQCAtMzY2LDU1ICs1MjgsODQgQEAKIAkgICAgICBiaXRbNV0gICAgdV9tYWNfcGh5X3JzdF9uX2RiZwlyc3RfdmFsdWUgPSAxCiAJICAgICAgYml0WzRdCXVfbm9uX3N0aWNreV9yc3Rfbl9kYmcJcnN0X3ZhbHVlID0gMAogCSovCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsIDB4MTYsIDB4MTApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsIDB4MTYsIDB4MTApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAkvKiBFbmFibGUgQVNQTSAqLwogCWlmIChjaGlwLT5hc3BtX2wwc19sMV9lbikgewogCQlyZXR2YWwgPSBydHN4X3Jlc2V0X2FzcG0oY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGNoaXAtPmFzaWNfY29kZSAmJiBDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewogCQkJcmV0dmFsID0gcnRzeF93cml0ZV9waHlfcmVnaXN0ZXIoY2hpcCwgMHgwNywgMHgwMTI5KTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfQogCQlyZXR2YWwgPSBydHN4X3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAsIExDVExSLAogCQkJCQkJY2hpcC0+YXNwbV9sMHNfbDFfZW4pOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHZhbCA9IHJ0c3hfd3JpdGVfY29uZmlnX2J5dGUoY2hpcCwgMHg4MSwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoQ0hLX1NESU9fRVhJU1QoY2hpcCkpIHsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9jZmdfZHcoY2hpcCwKIAkJCQkJICAgQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkgPyAyIDogMSwKIAkJCQkJICAgMHhDMCwgMHhGRjAwLCAweDAxMDApOwogCi0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpICYmICFDSEtfU0RJT19FWElTVChjaGlwKSkgewogCQlyZXR2YWwgPSBydHN4X3dyaXRlX2NmZ19kdyhjaGlwLCAyLCAweEMwLCAweEZGRkYsIDB4MDEwMyk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9jZmdfZHcoY2hpcCwgMiwgMHg4NCwgMHhGRiwgMHgwMyk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgSVJRU1RBVDAsIExJTktfUkRZX0lOVCwgTElOS19SRFlfSU5UKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIElSUVNUQVQwLCBMSU5LX1JEWV9JTlQsCisJCQkJICAgICBMSU5LX1JEWV9JTlQpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQRVJTVF9HTElUQ0hfV0lEVEgsIDB4RkYsIDB4ODApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUEVSU1RfR0xJVENIX1dJRFRILCAweEZGLCAweDgwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dmFsID0gcnRzeF9lbmFibGVfcGNpZV9pbnRyKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY2hpcC0+bmVlZF9yZXNldCA9IDA7CiAKQEAgLTQzNiwxMyArNjI3LDE5IEBACiAjZWxzZSAgLyogSFdfQVVUT19TV0lUQ0hfU0RfQlVTICovCiAJCXJldHZhbCA9IHJ0c3hfcHJlX2hhbmRsZV9zZGlvX29sZChjaGlwKTsKICNlbmRpZiAgLyogSFdfQVVUT19TV0lUQ0hfU0RfQlVTICovCi0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAl9IGVsc2UgewogCQljaGlwLT5zZF9pbyA9IDA7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNESU9fQ1RSTCwgU0RJT19CVVNfQ1RSTCB8IFNESU9fQ0RfQ1RSTCwKLQkJCSAgICAgICAwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRElPX0NUUkwsCisJCQkJCSAgICAgU0RJT19CVVNfQ1RSTCB8IFNESU9fQ0RfQ1RSTCwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiBuZXh0Y2FyZDoKQEAgLTQ1MCw0MyArNjQ3LDkxIEBACiAJCWNoaXAtPm5lZWRfcmVzZXQgfD0gWERfQ0FSRDsKIAlpZiAoY2hpcC0+aW50X3JlZyAmIE1TX0VYSVNUKQogCQljaGlwLT5uZWVkX3Jlc2V0IHw9IE1TX0NBUkQ7Ci0JaWYgKGNoaXAtPmludF9yZWcgJiBDQVJEX0VYSVNUKQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTU0NfQ1RMMSwgU1NDX1JTVEIsIFNTQ19SU1RCKTsKKwlpZiAoY2hpcC0+aW50X3JlZyAmIENBUkRfRVhJU1QpIHsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTU0NfQ1RMMSwgU1NDX1JTVEIsCisJCQkJCSAgICAgU1NDX1JTVEIpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJJbiAlcywgY2hpcC0+bmVlZF9yZXNldCA9IDB4JXhcbiIsIF9fZnVuY19fLAogCQkodW5zaWduZWQgaW50KShjaGlwLT5uZWVkX3Jlc2V0KSk7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSQ0NUTCwgMHgwMSwgMHgwMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSQ0NUTCwgMHgwMSwgMHgwMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSB8fCBDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgewogCQkvKiBUdXJuIG9mZiBtYWluIHBvd2VyIHdoZW4gZW50ZXJpbmcgUzMvUzQgc3RhdGUgKi8KLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgTUFJTl9QV1JfT0ZGX0NUTCwgMHgwMywgMHgwMyk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgTUFJTl9QV1JfT0ZGX0NUTCwgMHgwMywKKwkJCQkJICAgICAweDAzKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAKIAlpZiAoY2hpcC0+cmVtb3RlX3dha2V1cF9lbiAmJiAhY2hpcC0+YXV0b19kZWxpbmtfZW4pIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgV0FLRV9TRUxfQ1RMLCAweDA3LCAweDA3KTsKLQkJaWYgKGNoaXAtPmF1eF9wd3JfZXhpc3QpCi0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQTUVfRk9SQ0VfQ1RMLCAweEZGLCAweDMzKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBXQUtFX1NFTF9DVEwsIDB4MDcsIDB4MDcpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlpZiAoY2hpcC0+YXV4X3B3cl9leGlzdCkgeworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQTUVfRk9SQ0VfQ1RMLAorCQkJCQkJICAgICAweEZGLCAweDMzKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KIAl9IGVsc2UgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBXQUtFX1NFTF9DVEwsIDB4MDcsIDB4MDQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQTUVfRk9SQ0VfQ1RMLCAweEZGLCAweDMwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBXQUtFX1NFTF9DVEwsIDB4MDcsIDB4MDQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBNRV9GT1JDRV9DVEwsIDB4RkYsIDB4MzApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KIAotCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSAmJiAoY2hpcC0+aWNfdmVyc2lvbiA+PSBJQ19WRVJfRCkpCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBFVFhDRkcsIDB4MUMsIDB4MTQpOworCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSAmJiAoY2hpcC0+aWNfdmVyc2lvbiA+PSBJQ19WRVJfRCkpIHsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQRVRYQ0ZHLCAweDFDLCAweDE0KTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlICYmIENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CiAJCXJldHZhbCA9IHJ0c3hfY2xyX3BoeV9yZWdfYml0KGNoaXAsIDB4MUMsIDIpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWlmIChjaGlwLT5mdDJfZmFzdF9tb2RlKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFdSX0NUTCwgMHhGRiwKLQkJCSAgICAgICBNU19QQVJUSUFMX1BPV0VSX09OIHwgU0RfUEFSVElBTF9QT1dFUl9PTik7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QV1JfQ1RMLCAweEZGLAorCQkJCQkgICAgIE1TX1BBUlRJQUxfUE9XRVJfT04gfCBTRF9QQVJUSUFMX1BPV0VSX09OKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJdWRlbGF5KGNoaXAtPnBtb3NfcHdyX29uX2ludGVydmFsKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QV1JfQ1RMLCAweEZGLAotCQkJICAgICAgIE1TX1BPV0VSX09OIHwgU0RfUE9XRVJfT04pOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFdSX0NUTCwgMHhGRiwKKwkJCQkJICAgICBNU19QT1dFUl9PTiB8IFNEX1BPV0VSX09OKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAogCQl3YWl0X3RpbWVvdXQoMjAwKTsKIAl9CkBAIC01MDEsMTMgKzc0NiwxNCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjaGVja19zZF9zcGVlZF9wcmlvcih1MzIgc2Rfc3BlZWRfcHJpb3IpCiB7Ci0JaW50IGksIGZha2VfcGFyYSA9IDA7CisJYm9vbCBmYWtlX3BhcmEgPSBmYWxzZTsKKwlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJdTggdG1wID0gKHU4KShzZF9zcGVlZF9wcmlvciA+PiAoaSo4KSk7CiAKIAkJaWYgKCh0bXAgPCAweDAxKSB8fCAodG1wID4gMHgwNCkpIHsKLQkJCWZha2VfcGFyYSA9IDE7CisJCQlmYWtlX3BhcmEgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC01MTcsMTMgKzc2MywxNCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjaGVja19zZF9jdXJyZW50X3ByaW9yKHUzMiBzZF9jdXJyZW50X3ByaW9yKQogewotCWludCBpLCBmYWtlX3BhcmEgPSAwOworCWJvb2wgZmFrZV9wYXJhID0gZmFsc2U7CisJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXU4IHRtcCA9ICh1OCkoc2RfY3VycmVudF9wcmlvciA+PiAoaSo4KSk7CiAKIAkJaWYgKHRtcCA+IDB4MDMpIHsKLQkJCWZha2VfcGFyYSA9IDE7CisJCQlmYWtlX3BhcmEgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC01MzcsMTQgKzc4NCwyNCBAQAogCXUxNiByZWcgPSAwOwogCXU4IHZhbCA9IDA7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfU0VMLCAweDAzLCAweDAzKTsKLQlSVFNYX1JFQURfUkVHKGNoaXAsIENMS19TRUwsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX1NFTCwgMHgwMywgMHgwMyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0xLX1NFTCwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAljaGlwLT5hc2ljX2NvZGUgPSB2YWwgPT0gMCA/IDEgOiAwOwogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSkgewogCQlyZXR2YWwgPSBydHN4X3JlYWRfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MUMsICZyZWcpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJWYWx1ZSBvZiBwaHkgcmVnaXN0ZXIgMHgxQyBpcyAweCV4XG4iLAogCQkJcmVnKTsKQEAgLTU1MiwxNiArODA5LDI4IEBACiAJCWNoaXAtPnBoeV9kZWJ1Z19tb2RlID0gcmVnICYgUEhZX0RFQlVHX01PREUgPyAxIDogMDsKIAogCX0gZWxzZSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgMHhGRTgwLCAmdmFsKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIDB4RkU4MCwgJnZhbCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWNoaXAtPmljX3ZlcnNpb24gPSB2YWw7CiAJCWNoaXAtPnBoeV9kZWJ1Z19tb2RlID0gMDsKIAl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBESU5GTywgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBESU5GTywgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiUERJTkZPOiAweCV4XG4iLCB2YWwpOwogCWNoaXAtPmF1eF9wd3JfZXhpc3QgPSB2YWwgJiBBVVhfUFdSX0RFVEVDVEVEID8gMSA6IDA7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIDB4RkU1MCwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIDB4RkU1MCwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAljaGlwLT5od19ieXBhc3Nfc2QgPSB2YWwgJiAweDAxID8gMSA6IDA7CiAKIAlydHN4X3JlYWRfY29uZmlnX2J5dGUoY2hpcCwgMHgwRSwgJnZhbCk7CkBAIC01NzEsNyArODQwLDExIEBACiAJCUNMUl9TRElPX0VYSVNUKGNoaXApOwogCiAJaWYgKGNoaXAtPnVzZV9od19zZXR0aW5nKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsICZ2YWwpOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsICZ2YWwpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQljaGlwLT5hdXRvX2RlbGlua19lbiA9IHZhbCAmIDB4ODAgPyAxIDogMDsKIAl9CiAKQEAgLTU4NCwyNyArODU3LDQ5IEBACiAJdTggdmFsID0gMCwgbWF4X2Z1bmM7CiAJdTMyIGx2YWwgPSAwOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX1NFTCwgMHgwMywgMHgwMyk7Ci0JUlRTWF9SRUFEX1JFRyhjaGlwLCBDTEtfU0VMLCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19TRUwsIDB4MDMsIDB4MDMpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIENMS19TRUwsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJY2hpcC0+YXNpY19jb2RlID0gdmFsID09IDAgPyAxIDogMDsKIAogCWNoaXAtPmljX3ZlcnNpb24gPSAwOwogCWNoaXAtPnBoeV9kZWJ1Z19tb2RlID0gMDsKIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgUERJTkZPLCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUERJTkZPLCAmdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJQRElORk86IDB4JXhcbiIsIHZhbCk7CiAJY2hpcC0+YXV4X3B3cl9leGlzdCA9IHZhbCAmIEFVWF9QV1JfREVURUNURUQgPyAxIDogMDsKIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgQ0FSRF9TSEFSRV9NT0RFLCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9TSEFSRV9NT0RFLCAmdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJDQVJEX1NIQVJFX01PREU6IDB4JXhcbiIsIHZhbCk7CiAJY2hpcC0+YmFyb19wa2cgPSB2YWwgJiAweDA0ID8gUUZOIDogTFFGUDsKIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgMHhGRTVBLCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgMHhGRTVBLCAmdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWNoaXAtPmh3X2J5cGFzc19zZCA9IHZhbCAmIDB4MTAgPyAxIDogMDsKIAogCXJldHZhbCA9IHJ0c3hfcmVhZF9jZmdfZHcoY2hpcCwgMCwgMHg3MTgsICZsdmFsKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1heF9mdW5jID0gKHU4KSgobHZhbCA+PiAyOSkgJiAweDA3KTsKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiTWF4IGZ1bmN0aW9uIG51bWJlcjogJWRcbiIsIG1heF9mdW5jKTsKQEAgLTYxNCw3ICs5MDksMTEgQEAKIAkJQ0xSX1NESU9fRVhJU1QoY2hpcCk7CiAKIAlpZiAoY2hpcC0+dXNlX2h3X3NldHRpbmcpIHsKLQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBDSEFOR0VfTElOS19TVEFURSwgJnZhbCk7CisJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBDSEFOR0VfTElOS19TVEFURSwgJnZhbCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWNoaXAtPmF1dG9fZGVsaW5rX2VuID0gdmFsICYgMHg4MCA/IDEgOiAwOwogCiAJCWlmIChDSEVDS19CQVJPX1BLRyhjaGlwLCBMUUZQKSkKQEAgLTY5MywyMSArOTkyLDMzIEBACiAJaWYgKChjaGlwLT5tbWNfZGRyX3R4X3BoYXNlID4gMzEpIHx8IChjaGlwLT5tbWNfZGRyX3R4X3BoYXNlIDwgMCkpCiAJCWNoaXAtPm1tY19kZHJfdHhfcGhhc2UgPSAwOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgRlBEQ1RMLCBTU0NfUE9XRVJfRE9XTiwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUERDVEwsIFNTQ19QT1dFUl9ET1dOLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCXdhaXRfdGltZW91dCgyMDApOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENMS19ESVYsIDB4MDcsIDB4MDcpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX0RJViwgMHgwNywgMHgwNyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiY2hpcC0+dXNlX2h3X3NldHRpbmcgPSAlZFxuIiwKIAkJY2hpcC0+dXNlX2h3X3NldHRpbmcpOwogCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CiAJCXJldHZhbCA9IHJ0czUyMDhfaW5pdChjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCX0gZWxzZSBpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKIAkJcmV0dmFsID0gcnRzNTI4OF9pbml0KGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWlmIChjaGlwLT5zc19lbiA9PSAyKQpAQCAtNzU0LDggKzEwNjUsMTAgQEAKIAl9CiAKIAlyZXR2YWwgPSBydHN4X3Jlc2V0X2NoaXAoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC03ODQsMzEgKzEwOTcsMzEgQEAKIAogc3RhdGljIHZvaWQgcnRzeF9tb25pdG9yX2FzcG1fY29uZmlnKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7Ci0JaW50IG1heWJlX3N1cHBvcnRfYXNwbSwgcmVnX2NoYW5nZWQ7CisJYm9vbCByZWdfY2hhbmdlZCwgbWF5YmVfc3VwcG9ydF9hc3BtOwogCXUzMiB0bXAgPSAwOwogCXU4IHJlZzAgPSAwLCByZWcxID0gMDsKIAotCW1heWJlX3N1cHBvcnRfYXNwbSA9IDA7Ci0JcmVnX2NoYW5nZWQgPSAwOworCW1heWJlX3N1cHBvcnRfYXNwbSA9IGZhbHNlOworCXJlZ19jaGFuZ2VkID0gZmFsc2U7CiAJcnRzeF9yZWFkX2NvbmZpZ19ieXRlKGNoaXAsIExDVExSLCAmcmVnMCk7CiAJaWYgKGNoaXAtPmFzcG1fbGV2ZWxbMF0gIT0gcmVnMCkgewotCQlyZWdfY2hhbmdlZCA9IDE7CisJCXJlZ19jaGFuZ2VkID0gdHJ1ZTsKIAkJY2hpcC0+YXNwbV9sZXZlbFswXSA9IHJlZzA7CiAJfQogCWlmIChDSEtfU0RJT19FWElTVChjaGlwKSAmJiAhQ0hLX1NESU9fSUdOT1JFRChjaGlwKSkgewogCQlydHN4X3JlYWRfY2ZnX2R3KGNoaXAsIDEsIDB4QzAsICZ0bXApOwogCQlyZWcxID0gKHU4KXRtcDsKIAkJaWYgKGNoaXAtPmFzcG1fbGV2ZWxbMV0gIT0gcmVnMSkgewotCQkJcmVnX2NoYW5nZWQgPSAxOworCQkJcmVnX2NoYW5nZWQgPSB0cnVlOwogCQkJY2hpcC0+YXNwbV9sZXZlbFsxXSA9IHJlZzE7CiAJCX0KIAogCQlpZiAoKHJlZzAgJiAweDAzKSAmJiAocmVnMSAmIDB4MDMpKQotCQkJbWF5YmVfc3VwcG9ydF9hc3BtID0gMTsKKwkJCW1heWJlX3N1cHBvcnRfYXNwbSA9IHRydWU7CiAKIAl9IGVsc2UgewogCQlpZiAocmVnMCAmIDB4MDMpCi0JCQltYXliZV9zdXBwb3J0X2FzcG0gPSAxOworCQkJbWF5YmVfc3VwcG9ydF9hc3BtID0gdHJ1ZTsKIAl9CiAKIAlpZiAocmVnX2NoYW5nZWQpIHsKQEAgLTgzNSw3ICsxMTQ4LDcgQEAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICZjaGlwLT5zZF9jYXJkOwogI2VuZGlmCi0JaW50IHNzX2FsbG93ZWQ7CisJYm9vbCBzc19hbGxvd2VkOwogCiAJaWYgKHJ0c3hfY2hrX3N0YXQoY2hpcCwgUlRTWF9TVEFUX1NVU1BFTkQpKQogCQlyZXR1cm47CkBAIC04ODcsMjEgKzEyMDAsMjEgQEAKIAlydHN4X2luaXRfY2FyZHMoY2hpcCk7CiAKIAlpZiAoY2hpcC0+c3NfZW4pIHsKLQkJc3NfYWxsb3dlZCA9IDE7CisJCXNzX2FsbG93ZWQgPSB0cnVlOwogCiAJCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgewotCQkJc3NfYWxsb3dlZCA9IDA7CisJCQlzc19hbGxvd2VkID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAoQ0hLX1NESU9fRVhJU1QoY2hpcCkgJiYgIUNIS19TRElPX0lHTk9SRUQoY2hpcCkpIHsKIAkJCQl1MzIgdmFsOwogCiAJCQkJcnRzeF9yZWFkX2NmZ19kdyhjaGlwLCAxLCAweDA0LCAmdmFsKTsKIAkJCQlpZiAodmFsICYgMHgwNykKLQkJCQkJc3NfYWxsb3dlZCA9IDA7CisJCQkJCXNzX2FsbG93ZWQgPSBmYWxzZTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCXNzX2FsbG93ZWQgPSAwOworCQlzc19hbGxvd2VkID0gZmFsc2U7CiAJfQogCiAJaWYgKHNzX2FsbG93ZWQgJiYgIWNoaXAtPnNkX2lvKSB7CkBAIC0xMTUzLDE0ICsxNDY2LDE3IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9SV19SRUdfQ05UOyBpKyspIHsKIAkJdmFsID0gcnRzeF9yZWFkbChjaGlwLCBSVFNYX0hBSU1SKTsKIAkJaWYgKCh2YWwgJiAoMSA8PCAzMSkpID09IDApIHsKLQkJCWlmIChkYXRhICE9ICh1OCl2YWwpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChkYXRhICE9ICh1OCl2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCQl9CiAJfQogCi0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19USU1FRE9VVCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX1RJTUVET1VUOwogfQogCiBpbnQgcnRzeF9yZWFkX3JlZ2lzdGVyKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBhZGRyLCB1OCAqZGF0YSkKQEAgLTExODEsOCArMTQ5NywxMCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGkgPj0gTUFYX1JXX1JFR19DTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfVElNRURPVVQpOworCWlmIChpID49IE1BWF9SV19SRUdfQ05UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfVElNRURPVVQ7CisJfQogCiAJaWYgKGRhdGEpCiAJCSpkYXRhID0gKHU4KSh2YWwgJiAweEZGKTsKQEAgLTExOTMsMTMgKzE1MTEsMTkgQEAKIGludCBydHN4X3dyaXRlX2NmZ19kdyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBmdW5jX25vLCB1MTYgYWRkciwgdTMyIG1hc2ssCiAJCSAgICAgIHUzMiB2YWwpCiB7CisJaW50IHJldHZhbDsKIAl1OCBtb2RlID0gMCwgdG1wOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlpZiAobWFzayAmIDB4RkYpIHsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENGR0RBVEEwICsgaSwKLQkJCQkgICAgICAgMHhGRiwgKHU4KSh2YWwgJiBtYXNrICYgMHhGRikpOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRkdEQVRBMCArIGksCisJCQkJCQkgICAgIDB4RkYsCisJCQkJCQkgICAgICh1OCkodmFsICYgbWFzayAmIDB4RkYpKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCQltb2RlIHw9ICgxIDw8IGkpOwogCQl9CiAJCW1hc2sgPj49IDg7CkBAIC0xMjA3LDE0ICsxNTMxLDMxIEBACiAJfQogCiAJaWYgKG1vZGUpIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0ZHQUREUjAsIDB4RkYsICh1OClhZGRyKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0ZHQUREUjEsIDB4RkYsICh1OCkoYWRkciA+PiA4KSk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0ZHQUREUjAsIDB4RkYsICh1OClhZGRyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRkdBRERSMSwgMHhGRiwKKwkJCQkJICAgICAodTgpKGFkZHIgPj4gOCkpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENGR1JXQ1RMLCAweEZGLAotCQkJICAgICAgIDB4ODAgfCBtb2RlIHwgKChmdW5jX25vICYgMHgwMykgPDwgNCkpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENGR1JXQ1RMLCAweEZGLAorCQkJCQkgICAgIDB4ODAgfCBtb2RlIHwgKChmdW5jX25vICYgMHgwMykgPDwgNCkpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfUldfUkVHX0NOVDsgaSsrKSB7Ci0JCQlSVFNYX1JFQURfUkVHKGNoaXAsIENGR1JXQ1RMLCAmdG1wKTsKKwkJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBDRkdSV0NUTCwgJnRtcCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJaWYgKCh0bXAgJiAweDgwKSA9PSAwKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xMjI1LDIyICsxNTY2LDQ0IEBACiAKIGludCBydHN4X3JlYWRfY2ZnX2R3KHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGZ1bmNfbm8sIHUxNiBhZGRyLCB1MzIgKnZhbCkKIHsKKwlpbnQgcmV0dmFsOwogCWludCBpOwogCXU4IHRtcDsKIAl1MzIgZGF0YSA9IDA7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDRkdBRERSMCwgMHhGRiwgKHU4KWFkZHIpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENGR0FERFIxLCAweEZGLCAodTgpKGFkZHIgPj4gOCkpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENGR1JXQ1RMLCAweEZGLCAweDgwIHwgKChmdW5jX25vICYgMHgwMykgPDwgNCkpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0ZHQUREUjAsIDB4RkYsICh1OClhZGRyKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0ZHQUREUjEsIDB4RkYsICh1OCkoYWRkciA+PiA4KSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENGR1JXQ1RMLCAweEZGLAorCQkJCSAgICAgMHg4MCB8ICgoZnVuY19ubyAmIDB4MDMpIDw8IDQpKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9SV19SRUdfQ05UOyBpKyspIHsKLQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBDRkdSV0NUTCwgJnRtcCk7CisJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBDRkdSV0NUTCwgJnRtcCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWlmICgodG1wICYgMHg4MCkgPT0gMCkKIAkJCWJyZWFrOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBDRkdEQVRBMCArIGksICZ0bXApOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0ZHREFUQTAgKyBpLCAmdG1wKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJZGF0YSB8PSAodTMyKXRtcCA8PCAoaSAqIDgpOwogCX0KIApAQCAtMTI1OSw4ICsxNjIyLDEwIEBACiAJaW50IGR3X2xlbiwgaSwgajsKIAlpbnQgcmV0dmFsOwogCi0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfTk9NRU07CisJfQogCiAJaWYgKChsZW4gKyBvZmZzZXQpICUgNCkKIAkJZHdfbGVuID0gKGxlbiArIG9mZnNldCkgLyA0ICsgMTsKQEAgLTEyNzAsMTMgKzE2MzUsMTYgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiZHdfbGVuID0gJWRcbiIsIGR3X2xlbik7CiAKIAlkYXRhID0gdnphbGxvYyhkd19sZW4gKiA0KTsKLQlpZiAoIWRhdGEpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCWlmICghZGF0YSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX05PTUVNOworCX0KIAogCW1hc2sgPSB2emFsbG9jKGR3X2xlbiAqIDQpOwogCWlmICghbWFzaykgewogCQl2ZnJlZShkYXRhKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfTk9NRU07CiAJfQogCiAJaiA9IDA7CkBAIC0xMzAwLDcgKzE2NjgsOCBAQAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQl2ZnJlZShkYXRhKTsKIAkJCXZmcmVlKG1hc2spOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTEzMjcsMTUgKzE2OTYsMTggQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiZHdfbGVuID0gJWRcbiIsIGR3X2xlbik7CiAKIAlkYXRhID0gdm1hbGxvYyhkd19sZW4gKiA0KTsKLQlpZiAoIWRhdGEpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCWlmICghZGF0YSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX05PTUVNOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBkd19sZW47IGkrKykgewogCQlyZXR2YWwgPSBydHN4X3JlYWRfY2ZnX2R3KGNoaXAsIGZ1bmMsIGFsaWduZWRfYWRkciArIGkgKiA0LAogCQkJCQkgIGRhdGEgKyBpKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJdmZyZWUoZGF0YSk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMTM1OCw1MSArMTczMCw5OSBAQAogCiBpbnQgcnRzeF93cml0ZV9waHlfcmVnaXN0ZXIoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggYWRkciwgdTE2IHZhbCkKIHsKLQlpbnQgaSwgZmluaXNoZWQgPSAwOworCWludCByZXR2YWw7CisJYm9vbCBmaW5pc2hlZCA9IGZhbHNlOworCWludCBpOwogCXU4IHRtcDsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBIWURBVEEwLCAweEZGLCAodTgpdmFsKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQSFlEQVRBMSwgMHhGRiwgKHU4KSh2YWwgPj4gOCkpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBIWUFERFIsIDB4RkYsIGFkZHIpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBIWVJXQ1RMLCAweEZGLCAweDgxKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBIWURBVEEwLCAweEZGLCAodTgpdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUEhZREFUQTEsIDB4RkYsICh1OCkodmFsID4+IDgpKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUEhZQUREUiwgMHhGRiwgYWRkcik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBIWVJXQ1RMLCAweEZGLCAweDgxKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgUEhZUldDVEwsICZ0bXApOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUEhZUldDVEwsICZ0bXApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQlpZiAoISh0bXAgJiAweDgwKSkgewotCQkJZmluaXNoZWQgPSAxOworCQkJZmluaXNoZWQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlpZiAoIWZpbmlzaGVkKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICghZmluaXNoZWQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAogaW50IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggYWRkciwgdTE2ICp2YWwpCiB7Ci0JaW50IGksIGZpbmlzaGVkID0gMDsKKwlpbnQgcmV0dmFsOworCWJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKwlpbnQgaTsKIAl1MTYgZGF0YSA9IDA7CiAJdTggdG1wOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgUEhZQUREUiwgMHhGRiwgYWRkcik7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgUEhZUldDVEwsIDB4RkYsIDB4ODApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUEhZQUREUiwgMHhGRiwgYWRkcik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBIWVJXQ1RMLCAweEZGLCAweDgwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IDEwMDAwMDsgaSsrKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgUEhZUldDVEwsICZ0bXApOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUEhZUldDVEwsICZ0bXApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQlpZiAoISh0bXAgJiAweDgwKSkgewotCQkJZmluaXNoZWQgPSAxOworCQkJZmluaXNoZWQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlpZiAoIWZpbmlzaGVkKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICghZmluaXNoZWQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgUEhZREFUQTAsICZ0bXApOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBQSFlEQVRBMCwgJnRtcCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkYXRhID0gdG1wOwotCVJUU1hfUkVBRF9SRUcoY2hpcCwgUEhZREFUQTEsICZ0bXApOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBQSFlEQVRBMSwgJnRtcCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkYXRhIHw9ICh1MTYpdG1wIDw8IDg7CiAKIAlpZiAodmFsKQpAQCAtMTQxMywyMiArMTgzMywzNyBAQAogCiBpbnQgcnRzeF9yZWFkX2VmdXNlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGFkZHIsIHU4ICp2YWwpCiB7CisJaW50IHJldHZhbDsKIAlpbnQgaTsKIAl1OCBkYXRhID0gMDsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIEVGVVNFX0NUUkwsIDB4RkYsIDB4ODB8YWRkcik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBFRlVTRV9DVFJMLCAweEZGLCAweDgwIHwgYWRkcik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlSVFNYX1JFQURfUkVHKGNoaXAsIEVGVVNFX0NUUkwsICZkYXRhKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIEVGVVNFX0NUUkwsICZkYXRhKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJaWYgKCEoZGF0YSAmIDB4ODApKQogCQkJYnJlYWs7CiAJCXVkZWxheSgxKTsKIAl9CiAKLQlpZiAoZGF0YSAmIDB4ODApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfVElNRURPVVQpOworCWlmIChkYXRhICYgMHg4MCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX1RJTUVET1VUOworCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgRUZVU0VfREFUQSwgJmRhdGEpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBFRlVTRV9EQVRBLCAmZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlpZiAodmFsKQogCQkqdmFsID0gZGF0YTsKIApAQCAtMTQzNyw2ICsxODcyLDcgQEAKIAogaW50IHJ0c3hfd3JpdGVfZWZ1c2Uoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggYWRkciwgdTggdmFsKQogeworCWludCByZXR2YWw7CiAJaW50IGksIGo7CiAJdTggZGF0YSA9IDAsIHRtcCA9IDB4RkY7CiAKQEAgLTE0NDcsMTggKzE4ODMsMzMgQEAKIAkJdG1wICY9ICh+KHU4KSgxIDw8IGkpKTsKIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIldyaXRlIDB4JXggdG8gMHgleFxuIiwgdG1wLCBhZGRyKTsKIAotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBFRlVTRV9EQVRBLCAweEZGLCB0bXApOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBFRlVTRV9DVFJMLCAweEZGLCAweEEwfGFkZHIpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEVGVVNFX0RBVEEsIDB4RkYsIHRtcCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRUZVU0VfQ1RSTCwgMHhGRiwKKwkJCQkJICAgICAweEEwIHwgYWRkcik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKSB7Ci0JCQlSVFNYX1JFQURfUkVHKGNoaXAsIEVGVVNFX0NUUkwsICZkYXRhKTsKKwkJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBFRlVTRV9DVFJMLCAmZGF0YSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJaWYgKCEoZGF0YSAmIDB4ODApKQogCQkJCWJyZWFrOwogCQkJd2FpdF90aW1lb3V0KDMpOwogCQl9CiAKLQkJaWYgKGRhdGEgJiAweDgwKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19USU1FRE9VVCk7CisJCWlmIChkYXRhICYgMHg4MCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfVElNRURPVVQ7CisJCX0KIAogCQl3YWl0X3RpbWVvdXQoNSk7CiAJfQpAQCAtMTQ3MiwxNCArMTkyMywxOCBAQAogCXUxNiB2YWx1ZTsKIAogCXJldHZhbCA9IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgcmVnLCAmdmFsdWUpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHZhbHVlICYgKDEgPDwgYml0KSkgewogCQl2YWx1ZSAmPSB+KDEgPDwgYml0KTsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9waHlfcmVnaXN0ZXIoY2hpcCwgcmVnLCB2YWx1ZSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTQ5MSwxNCArMTk0NiwxOCBAQAogCXUxNiB2YWx1ZTsKIAogCXJldHZhbCA9IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgcmVnLCAmdmFsdWUpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCh2YWx1ZSAmICgxIDw8IGJpdCkpID09IDApIHsKIAkJdmFsdWUgfD0gKDEgPDwgYml0KTsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9waHlfcmVnaXN0ZXIoY2hpcCwgcmVnLCB2YWx1ZSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTUwNiw5ICsxOTY1LDE0IEBACiAKIGludCBydHN4X2NoZWNrX2xpbmtfcmVhZHkoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKKwlpbnQgcmV0dmFsOwogCXU4IHZhbDsKIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgSVJRU1RBVDAsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBJUlFTVEFUMCwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJJUlFTVEFUMDogMHgleFxuIiwgdmFsKTsKIAlpZiAodmFsICYgTElOS19SRFlfSU5UKSB7CkBAIC0xNjE1LDcgKzIwNzksNyBAQAogaW50IHJ0c3hfcHJlX2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAl1MzIgc3RhdHVzLCBpbnRfZW5hYmxlOwotCWludCBleGl0X3NzID0gMDsKKwlib29sIGV4aXRfc3MgPSBmYWxzZTsKICNpZmRlZiBTVVBQT1JUX09DUAogCXUzMiBvY3BfaW50ID0gMDsKIApAQCAtMTYyNSw3ICsyMDg5LDcgQEAKIAlpZiAoY2hpcC0+c3NfZW4pIHsKIAkJY2hpcC0+c3NfY291bnRlciA9IDA7CiAJCWlmIChydHN4X2dldF9zdGF0KGNoaXApID09IFJUU1hfU1RBVF9TUykgewotCQkJZXhpdF9zcyA9IDE7CisJCQlleGl0X3NzID0gdHJ1ZTsKIAkJCXJ0c3hfZXhpdF9MMShjaGlwKTsKIAkJCXJ0c3hfc2V0X3N0YXQoY2hpcCwgUlRTWF9TVEFUX1JVTik7CiAJCX0KQEAgLTE4MTQsOCArMjI3OCwxMCBAQAogCXUxNiByZWdfYWRkcjsKIAl1OCAqcHRyOwogCi0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJcHRyID0gYnVmOwogCXJlZ19hZGRyID0gUFBCVUZfQkFTRTI7CkBAIC0xODI2LDggKzIyOTIsMTAgQEAKIAkJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIHJlZ19hZGRyKyssIDAsIDApOwogCiAJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMjUwKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCW1lbWNweShwdHIsIHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApLCAyNTYpOwogCQlwdHIgKz0gMjU2OwpAQCAtMTg0MCw4ICsyMzA4LDEwIEBACiAJCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCByZWdfYWRkcisrLCAwLCAwKTsKIAogCQlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDI1MCk7Ci0JCWlmIChyZXR2YWwgPCAwKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAltZW1jcHkocHRyLCBydHN4X2dldF9jbWRfZGF0YShjaGlwKSwgYnVmX2xlbiUyNTYpOwpAQCAtMTg1Niw4ICsyMzI2LDEwIEBACiAJdTE2IHJlZ19hZGRyOwogCXU4ICpwdHI7CiAKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlwdHIgPSBidWY7CiAJcmVnX2FkZHIgPSBQUEJVRl9CQVNFMjsKQEAgLTE4NzEsOCArMjM0MywxMCBAQAogCQl9CiAKIAkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAyNTApOwotCQlpZiAocmV0dmFsIDwgMCkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJaWYgKGJ1Zl9sZW4lMjU2KSB7CkBAIC0xODg1LDggKzIzNTksMTAgQEAKIAkJfQogCiAJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMjUwKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE4OTQsOCArMjM3MCwxMCBAQAogCiBpbnQgcnRzeF9jaGVja19jaGlwX2V4aXN0KHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7Ci0JaWYgKHJ0c3hfcmVhZGwoY2hpcCwgMCkgPT0gMHhGRkZGRkZGRikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocnRzeF9yZWFkbChjaGlwLCAwKSA9PSAweEZGRkZGRkZGKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xOTE4LDggKzIzOTYsMTAgQEAKIAogCWlmIChtYXNrKSB7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBEQ1RMLCBtYXNrLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpCiAJCQl3YWl0X3RpbWVvdXQoMjAwKTsKQEAgLTE5NDcsOCArMjQyNywxMCBAQAogCWlmIChtYXNrKSB7CiAJCXZhbCA9IG1hc2s7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBEQ1RMLCBtYXNrLCB2YWwpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmgKaW5kZXggZmVhYzk4Ni4uYzI5NWIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmgKQEAgLTk4OCwyMCArOTg4LDQgQEAKIGludCBydHN4X3dyaXRlX3BwYnVmKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4ICpidWYsIGludCBidWZfbGVuKTsKIGludCBydHN4X2NoZWNrX2NoaXBfZXhpc3Qoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCk7CiAKLSNkZWZpbmUgUlRTWF9XUklURV9SRUcoY2hpcCwgYWRkciwgbWFzaywgZGF0YSkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaW50IHJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoKGNoaXApLCAoYWRkciksIChtYXNrKSwgKGRhdGEpKTsgXAotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CQkJCVwKLQkJCVRSQUNFX1JFVCgoY2hpcCksIHJldHZhbCk7CQkJXAotCQl9CQkJCQkJCVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFJUU1hfUkVBRF9SRUcoY2hpcCwgYWRkciwgZGF0YSkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWludCByZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoKGNoaXApLCAoYWRkciksIChkYXRhKSk7IFwKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewkJCQlcCi0JCQlUUkFDRV9SRVQoKGNoaXApLCByZXR2YWwpOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQogI2VuZGlmICAvKiBfX1JFQUxURUtfUlRTWF9DSElQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKaW5kZXggMTE2MTA4Mi4uOGE1ZDZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKQEAgLTI2LDExICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSAicnRzeC5oIgotI2luY2x1ZGUgInJ0c3hfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAicnRzeF9zeXMuaCIKLSNpbmNsdWRlICJydHN4X2NhcmQuaCIKLSNpbmNsdWRlICJydHN4X2NoaXAuaCIKLSNpbmNsdWRlICJydHN4X3Njc2kuaCIKICNpbmNsdWRlICJzZC5oIgogI2luY2x1ZGUgIm1zLmgiCiAjaW5jbHVkZSAic3BpLmgiCkBAIC0zOSw3ICszNCw4IEBACiB7CiAJc3RydWN0IHNjc2lfY21uZCAqc3JiID0gY2hpcC0+c3JiOwogCWNoYXIgKndoYXQgPSBOVUxMOwotCWludCB1bmtub3duX2NtZCA9IDAsIGxlbjsKKwlib29sIHVua25vd25fY21kID0gZmFsc2U7CisJaW50IGxlbjsKIAogCXN3aXRjaCAoc3JiLT5jbW5kWzBdKSB7CiAJY2FzZSBURVNUX1VOSVRfUkVBRFk6CkBAIC0zMTAsNyArMzA2LDggQEAKIAkJd2hhdCA9ICJSZWFsdGVrJ3MgdmVuZG9yIGNvbW1hbmQiOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQl3aGF0ID0gIih1bmtub3duIGNvbW1hbmQpIjsgdW5rbm93bl9jbWQgPSAxOworCQl3aGF0ID0gIih1bmtub3duIGNvbW1hbmQpIjsKKwkJdW5rbm93bl9jbWQgPSB0cnVlOwogCQlicmVhazsKIAl9CiAKQEAgLTQ4NSw3ICs0ODIsNyBAQAogCXVuc2lnbmVkIGNoYXIgc2VuZGJ5dGVzOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAl1OCBjYXJkID0gZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bik7Ci0JaW50IHByb19mb3JtYXR0ZXJfZmxhZyA9IDA7CisJYm9vbCBwcm9fZm9ybWF0dGVyX2ZsYWcgPSBmYWxzZTsKIAl1bnNpZ25lZCBjaGFyIGlucXVpcnlfYnVmW10gPSB7CiAJCVFVTElGSVJFfERSQ1RfQUNDRVNTX0RFViwKIAkJUk1CX0RJU0N8MHgwRCwKQEAgLTUxMCw4ICs1MDcsMTAgQEAKIAl9CiAKIAlidWYgPSB2bWFsbG9jKHNjc2lfYnVmZmxlbihzcmIpKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogI2lmZGVmIFNVUFBPUlRfTUFHSUNfR0FURQogCWlmICgoY2hpcC0+bXNwcm9fZm9ybWF0dGVyX2VuYWJsZSkgJiYKQEAgLTUxOSwxMCArNTE4LDggQEAKICNlbHNlCiAJaWYgKGNoaXAtPm1zcHJvX2Zvcm1hdHRlcl9lbmFibGUpCiAjZW5kaWYKLQl7CiAJCWlmICghY2FyZCB8fCAoY2FyZCA9PSBNU19DQVJEKSkKLQkJCXByb19mb3JtYXR0ZXJfZmxhZyA9IDE7Ci0JfQorCQkJcHJvX2Zvcm1hdHRlcl9mbGFnID0gdHJ1ZTsKIAogCWlmIChwcm9fZm9ybWF0dGVyX2ZsYWcpIHsKIAkJaWYgKHNjc2lfYnVmZmxlbihzcmIpIDwgNTYpCkBAIC01ODcsMTIgKzU4NCwxNCBAQAogCQlpZiAoY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKQogCQkJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCiAJCWJyZWFrOwogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCXJ0c3hfdHJhY2UoY2hpcCk7CisJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKIH0KIAogCkBAIC02MDcsNyArNjA2LDggQEAKIAlpZiAocHJldmVudCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwpAQCAtNjQ0LDggKzY0NCwxMCBAQAogCX0KIAogCWJ1ZiA9IHZtYWxsb2Moc2NzaV9idWZmbGVuKHNyYikpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJdG1wID0gKHVuc2lnbmVkIGNoYXIgKilzZW5zZTsKIAltZW1jcHkoYnVmLCB0bXAsIHNjc2lfYnVmZmxlbihzcmIpKTsKQEAgLTY2NSw3ICs2NjcsNyBAQAogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKIAlpbnQgc3lzX2luZm9fb2Zmc2V0OwogCWludCBkYXRhX3NpemUgPSBidWZfbGVuOwotCWludCBzdXBwb3J0X2Zvcm1hdCA9IDA7CisJYm9vbCBzdXBwb3J0X2Zvcm1hdCA9IGZhbHNlOwogCWludCBpID0gMDsKIAogCWlmIChjbWQgPT0gTU9ERV9TRU5TRSkgewpAQCAtNjg2LDEwICs2ODgsMTAgQEAKIAkvKiBNZWRpdW0gVHlwZSBDb2RlICovCiAJaWYgKGNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgewogCQlpZiAoQ0hLX01TWEMobXNfY2FyZCkpIHsKLQkJCXN1cHBvcnRfZm9ybWF0ID0gMTsKKwkJCXN1cHBvcnRfZm9ybWF0ID0gdHJ1ZTsKIAkJCWJ1ZltpKytdID0gMHg0MDsKIAkJfSBlbHNlIGlmIChDSEtfTVNQUk8obXNfY2FyZCkpIHsKLQkJCXN1cHBvcnRfZm9ybWF0ID0gMTsKKwkJCXN1cHBvcnRfZm9ybWF0ID0gdHJ1ZTsKIAkJCWJ1ZltpKytdID0gMHgyMDsKIAkJfSBlbHNlIHsKIAkJCWJ1ZltpKytdID0gMHgxMDsKQEAgLTc1Nyw3ICs3NTksNyBAQAogCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwogCXVuc2lnbmVkIGludCBkYXRhU2l6ZTsKIAlpbnQgc3RhdHVzOwotCWludCBwcm9fZm9ybWF0dGVyX2ZsYWc7CisJYm9vbCBwcm9fZm9ybWF0dGVyX2ZsYWc7CiAJdW5zaWduZWQgY2hhciBwYWdlQ29kZSwgKmJ1ZjsKIAl1OCBjYXJkID0gZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bik7CiAKQEAgLTc2NSwzMiArNzY3LDM1IEBACiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKIAkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogI2VuZGlmCiAKLQlwcm9fZm9ybWF0dGVyX2ZsYWcgPSAwOworCXByb19mb3JtYXR0ZXJfZmxhZyA9IGZhbHNlOwogCWRhdGFTaXplID0gODsKICNpZmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKIAlpZiAoKGNoaXAtPmx1bjJjYXJkW2x1bl0gJiBNU19DQVJEKSkgewogCQlpZiAoIWNhcmQgfHwgKGNhcmQgPT0gTVNfQ0FSRCkpIHsKIAkJCWRhdGFTaXplID0gMTA4OwogCQkJaWYgKGNoaXAtPm1zcHJvX2Zvcm1hdHRlcl9lbmFibGUpCi0JCQkJcHJvX2Zvcm1hdHRlcl9mbGFnID0gMTsKKwkJCQlwcm9fZm9ybWF0dGVyX2ZsYWcgPSB0cnVlOwogCQl9CiAJfQogI2Vsc2UKIAlpZiAoY2FyZCA9PSBNU19DQVJEKSB7CiAJCWlmIChjaGlwLT5tc3Byb19mb3JtYXR0ZXJfZW5hYmxlKSB7Ci0JCQlwcm9fZm9ybWF0dGVyX2ZsYWcgPSAxOworCQkJcHJvX2Zvcm1hdHRlcl9mbGFnID0gdHJ1ZTsKIAkJCWRhdGFTaXplID0gMTA4OwogCQl9CiAJfQogI2VuZGlmCiAKIAlidWYgPSBrbWFsbG9jKGRhdGFTaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCXBhZ2VDb2RlID0gc3JiLT5jbW5kWzJdICYgMHgzZjsKIApAQCAtODY5LDcgKzg3NCw4IEBACiAKIAlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSB8fCAoZ2V0X2NhcmRfc2l6ZShjaGlwLCBsdW4pID09IDApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKCEoQ0hLX0JJVChjaGlwLT5sdW5fbWMsIGx1bikpKSB7CkBAIC04ODUsNyArODkxLDggQEAKIAkJICovCiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTRCBjYXJkIGJlaW5nIGVyYXNlZCFcbiIpOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfUkVBRF9GT1JCSURERU4pOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSA9PSBTRF9DQVJEKSB7CkBAIC04OTMsNyArOTAwLDggQEAKIAkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTRCBjYXJkIGxvY2tlZCFcbiIpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfUkVBRF9GT1JCSURERU4pOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogI2VuZGlmCkBAIC05MTYsNyArOTI0LDggQEAKIAkJc2VjX2NudCA9ICgodTE2KShzcmItPmNtbmRbOV0pIDw8IDgpIHwgc3JiLT5jbW5kWzEwXTsKIAl9IGVsc2UgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCS8qIEluIHNvbWUgdGVzdCwgd2Ugd2lsbCByZWNlaXZlIGEgc3RhcnRfc2VjIGxpa2UgMHhGRkZGRkZGRi4KQEAgLTkyNiw3ICs5MzUsOCBAQAogCWlmICgoc3RhcnRfc2VjID4gZ2V0X2NhcmRfc2l6ZShjaGlwLCBsdW4pKSB8fAogCQkJKChzdGFydF9zZWMgKyBzZWNfY250KSA+IGdldF9jYXJkX3NpemUoY2hpcCwgbHVuKSkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xCQV9PVkVSX1JBTkdFKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoc2VjX2NudCA9PSAwKSB7CkBAIC05NDIsNyArOTUyLDggQEAKIAkJZWxzZQogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CkBAIC05NTAsNyArOTYxLDggQEAKIAkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJXcml0ZSBwcm90ZWN0ZWQgY2FyZCFcbiIpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfUFJPVEVDVCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKQEAgLTk2OSw3ICs5ODEsOCBAQAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CiAJCX0KIAkJcmV0dmFsID0gVFJBTlNQT1JUX0ZBSUxFRDsKLQkJVFJBQ0VfR09UTyhjaGlwLCBFeGl0KTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBFeGl0OwogCX0gZWxzZSB7CiAJCWNoaXAtPnJ3X2ZhaWxfY250W2x1bl0gPSAwOwogCQlyZXR2YWwgPSBUUkFOU1BPUlRfR09PRDsKQEAgLTk5NCwxNSArMTAwNywxOCBAQAogCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CiAJCWlmICghY2hpcC0+bXNwcm9fZm9ybWF0dGVyX2VuYWJsZSkgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0KIAogCWJ1Zl9sZW4gPSAoc2NzaV9idWZmbGVuKHNyYikgPiAxMikgPyAweDE0IDogMTI7CiAKIAlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJYnVmW2krK10gPSAwOwogCWJ1ZltpKytdID0gMDsKQEAgLTEwNjcsNyArMTA4Myw4IEBACiAKIAlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICghKENIS19CSVQoY2hpcC0+bHVuX21jLCBsdW4pKSkgewpAQCAtMTA3Nyw4ICsxMDk0LDEwIEBACiAJfQogCiAJYnVmID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCWNhcmRfc2l6ZSA9IGdldF9jYXJkX3NpemUoY2hpcCwgbHVuKTsKIAlidWZbMF0gPSAodW5zaWduZWQgY2hhcikoKGNhcmRfc2l6ZSAtIDEpID4+IDI0KTsKQEAgLTExMTYsMTUgKzExMzUsMTggQEAKIAlsZW4gPSAoKHUxNilzcmItPmNtbmRbNF0gPDwgOCkgfCBzcmItPmNtbmRbNV07CiAKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcmV0dmFsID0gcnRzeF9mb3JjZV9wb3dlcl9vbihjaGlwLCBTU0NfUERDVEwpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJdmZyZWUoYnVmKTsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTExMzMsNyArMTE1NSw4IEBACiAJCQl2ZnJlZShidWYpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKQEAgLTExNjUsNyArMTE4OCw4IEBACiAJcmV0dmFsID0gcnRzeF9mb3JjZV9wb3dlcl9vbihjaGlwLCBTU0NfUERDVEwpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChsZW4gPT0gNTExKSB7CkBAIC0xMTczLDE0ICsxMTk3LDE3IEBACiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfSBlbHNlIHsKIAkJbGVuID0gKHVuc2lnbmVkIHNob3J0KW1pbl90KHVuc2lnbmVkIGludCwgc2NzaV9idWZmbGVuKHNyYiksCiAJCQkJCWxlbik7CiAJCWJ1ZiA9IHZtYWxsb2MobGVuKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCWlmIChidWYgPT0gTlVMTCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJCX0KIAogCQlydHN4X3N0b3JfZ2V0X3hmZXJfYnVmKGJ1ZiwgbGVuLCBzcmIpOwogCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKQEAgLTExOTEsNyArMTIxOCw4IEBACiAJCQkJdmZyZWUoYnVmKTsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCQl9CiAJCX0KIApAQCAtMTIyMSwxOCArMTI0OSwyMiBAQAogCWlmIChhZGRyIDwgMHhGQzAwKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcmV0dmFsID0gcnRzeF9mb3JjZV9wb3dlcl9vbihjaGlwLCBTU0NfUERDVEwpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJdmZyZWUoYnVmKTsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewpAQCAtMTI0MSw3ICsxMjczLDggQEAKIAkJCXZmcmVlKGJ1Zik7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0KIApAQCAtMTI3NCwxMyArMTMwNywxNiBAQAogCWlmIChhZGRyIDwgMHhGQzAwKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlsZW4gPSAodW5zaWduZWQgc2hvcnQpbWluX3QodW5zaWduZWQgaW50LCBzY3NpX2J1ZmZsZW4oc3JiKSwgbGVuKTsKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlydHN4X3N0b3JfZ2V0X3hmZXJfYnVmKGJ1ZiwgbGVuLCBzcmIpOwogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgc2NzaV9idWZmbGVuKHNyYikgLSBsZW4pOwpAQCAtMTI4OSw3ICsxMzI1LDggQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXZmcmVlKGJ1Zik7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTEyOTgsNyArMTMzNSw4IEBACiAJCQl2ZnJlZShidWYpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKQEAgLTEzMTQsMTIgKzEzNTIsMTQgQEAKIAogCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IFNEX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKQEAgLTEzNjEsMTQgKzE0MDEsMTcgQEAKIAlpZiAoKHNjc2lfYnVmZmxlbihzcmIpIDwgYnVmX2xlbikgfHwgKHNjc2lfc2dsaXN0KHNyYikgPT0gTlVMTCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAljbGVhciA9IHNyYi0+Y21uZFsyXTsKIAogCWJ1ZiA9IHZtYWxsb2Moc2NzaV9idWZmbGVuKHNyYikpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCXB0ciA9IGJ1ZjsKIAogCWlmIChjaGlwLT50cmFjZV9tc2dbY2hpcC0+bXNnX2lkeF0udmFsaWQpCkBAIC0xNTAwLDcgKzE1NDMsOCBAQAogCQlkZWZhdWx0OgogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfSBlbHNlIGlmIChzcmItPmNtbmRbM10gPT0gMikgewogCQlpZiAoc3JiLT5jbW5kWzRdKSB7CkBAIC0xNTIzLDE0ICsxNTY3LDE2IEBACiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQkJfQogCiAJCQl0dXJuX29mZl9sZWQoY2hpcCwgTEVEX0dQSU8pOwogCQl9CiAJfSBlbHNlIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CkBAIC0xNTYyLDcgKzE2MDgsOCBAQAogCQlkZWZhdWx0OgogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAKIAkJcnRzeF9zdG9yX3NldF94ZmVyX2J1ZigmdG1wLCAxLCBzcmIpOwpAQCAtMTU3Miw3ICsxNjE5LDggQEAKIAkJcnRzeF9zdG9yX3NldF94ZmVyX2J1ZigmdG1wLCAxLCBzcmIpOwogCX0gZWxzZSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwpAQCAtMTYxMCw3ICsxNjU4LDggQEAKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKIApAQCAtMTc1Nyw3ICsxODA2LDggQEAKIAlpZiAoIUNIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlwaHlfZGVidWdfbW9kZSA9IChpbnQpKHNyYi0+Y21uZFszXSk7CkBAIC0xNzY1LDM1ICsxODE1LDQ3IEBACiAJaWYgKHBoeV9kZWJ1Z19tb2RlKSB7CiAJCWNoaXAtPnBoeV9kZWJ1Z19tb2RlID0gMTsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRFJFU1VNRUNUTCwgMHg3NywgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJfQogCiAJCXJ0c3hfZGlzYWJsZV9idXNfaW50KGNoaXApOwogCiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgMHgxQywgJnJlZyk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJfQogCiAJCXJlZyB8PSAweDAwMDE7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MUMsIHJlZyk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJfQogCX0gZWxzZSB7CiAJCWNoaXAtPnBoeV9kZWJ1Z19tb2RlID0gMDsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRFJFU1VNRUNUTCwgMHg3NywgMHg3Nyk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJfQogCiAJCXJ0c3hfZW5hYmxlX2J1c19pbnQoY2hpcCk7CiAKIAkJcmV0dmFsID0gcnRzeF9yZWFkX3BoeV9yZWdpc3RlcihjaGlwLCAweDFDLCAmcmVnKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQl9CiAKIAkJcmVnICY9IDB4RkZGRTsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9waHlfcmVnaXN0ZXIoY2hpcCwgMHgxQywgcmVnKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQl9CiAJfQogCiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwpAQCAtMTgyNCw3ICsxODg2LDggQEAKIAkJaWYgKGNtZF90eXBlID4gMikgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJCWFkZHIgPSAoc3JiLT5jbW5kWzVdIDw8IDgpIHwgc3JiLT5jbW5kWzZdOwogCQltYXNrID0gc3JiLT5jbW5kWzddOwpAQCAtMTg0Miw3ICsxOTA1LDggQEAKIAkJaWYgKHNjc2lfYnVmZmxlbihzcmIpIDwgMSkgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJCXJ0c3hfc3Rvcl9zZXRfeGZlcl9idWYoJnZhbHVlLCAxLCBzcmIpOwogCQlzY3NpX3NldF9yZXNpZChzcmIsIDApOwpAQCAtMTg1MCwxMiArMTkxNCwxNCBAQAogCiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKQEAgLTE5MDIsMTUgKzE5NjgsMTggQEAKIAogCWlmIChsZW4pIHsKIAkJYnVmID0gdm1hbGxvYyhsZW4pOwotCQlpZiAoIWJ1ZikKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQlpZiAoIWJ1ZikgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJCX0KIAogCQlyZXR2YWwgPSBydHN4X2ZvcmNlX3Bvd2VyX29uKGNoaXAsIFNTQ19QRENUTCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXZmcmVlKGJ1Zik7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspIHsKQEAgLTE5MTksNyArMTk4OCw4IEBACiAJCQkJdmZyZWUoYnVmKTsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCQl9CiAKIAkJCWJ1ZlsyKmldID0gKHU4KSh2YWwgPj4gOCk7CkBAIC0xOTYzLDggKzIwMzMsMTAgQEAKIAkJCQkJbGVuKTsKIAogCQlidWYgPSB2bWFsbG9jKGxlbik7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCQl9CiAKIAkJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKIAkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIGxlbik7CkBAIC0xOTc0LDcgKzIwNDYsOCBAQAogCQkJdmZyZWUoYnVmKTsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IGxlbiAvIDI7IGkrKykgewpAQCAtMTk4NCw3ICsyMDU3LDggQEAKIAkJCQl2ZnJlZShidWYpOwogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJCX0KIAkJfQogCkBAIC0yMDExLDcgKzIwODUsOCBAQAogCXJldHZhbCA9IHJ0c3hfZm9yY2VfcG93ZXJfb24oY2hpcCwgU1NDX1BEQ1RMKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAltb2RlID0gc3JiLT5jbW5kWzNdOwpAQCAtMjAyMiwxOSArMjA5NywyMiBAQAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0gZWxzZSBpZiAobW9kZSA9PSAxKSB7CiAJCXJldHZhbCA9IHNwaV9lcmFzZV9lZXByb21fYnl0ZShjaGlwLCBhZGRyKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9IGVsc2UgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwpAQCAtMjA1OCwxNSArMjEzNiwxOCBAQAogCWxlbiA9ICgodTE2KXNyYi0+Y21uZFs2XSA8PCA4KSB8IHNyYi0+Y21uZFs3XTsKIAogCWJ1ZiA9IHZtYWxsb2MobGVuKTsKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlyZXR2YWwgPSBydHN4X2ZvcmNlX3Bvd2VyX29uKGNoaXAsIFNTQ19QRENUTCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQl2ZnJlZShidWYpOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewpAQCAtMjA3NSw3ICsyMTU2LDggQEAKIAkJCXZmcmVlKGJ1Zik7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0KIApAQCAtMjEwNyw4ICsyMTg5LDEwIEBACiAKIAlsZW4gPSAodW5zaWduZWQgc2hvcnQpbWluX3QodW5zaWduZWQgaW50LCBzY3NpX2J1ZmZsZW4oc3JiKSwgbGVuKTsKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlydHN4X3N0b3JfZ2V0X3hmZXJfYnVmKGJ1ZiwgbGVuLCBzcmIpOwogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgc2NzaV9idWZmbGVuKHNyYikgLSBsZW4pOwpAQCAtMjExNyw3ICsyMjAxLDggQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXZmcmVlKGJ1Zik7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTIxMjYsNyArMjIxMSw4IEBACiAJCQl2ZnJlZShidWYpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKQEAgLTIxNTMsMTUgKzIyMzksMTggQEAKIAlsZW4gPSBzcmItPmNtbmRbNV07CiAKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcmV0dmFsID0gcnRzeF9mb3JjZV9wb3dlcl9vbihjaGlwLCBTU0NfUERDVEwpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJdmZyZWUoYnVmKTsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTIxNzAsNyArMjI1OSw4IEBACiAJCQl2ZnJlZShidWYpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKQEAgLTIyMDMsOCArMjI5MywxMCBAQAogCiAJbGVuID0gKHU4KW1pbl90KHVuc2lnbmVkIGludCwgc2NzaV9idWZmbGVuKHNyYiksIGxlbik7CiAJYnVmID0gdm1hbGxvYyhsZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKIAlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKQEAgLTIyMTIsMjEgKzIzMDQsMjQgQEAKIAlyZXR2YWwgPSBydHN4X2ZvcmNlX3Bvd2VyX29uKGNoaXAsIFNTQ19QRENUTCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQl2ZnJlZShidWYpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgMHgwOCwgJnZhbCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXZmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOwogCQl9CiAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQV1JfR0FURV9DVFJMLAogCQkJCQlMRE8zMzE4X1BXUl9NQVNLLCBMRE9fT0ZGKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJdmZyZWUoYnVmKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CiAJCX0KIAogCQl3YWl0X3RpbWVvdXQoNjAwKTsKQEAgLTIyMzUsMTQgKzIzMzAsMTYgQEAKIAkJCQkJCTB4NEMwMCB8IGNoaXAtPnBoeV92b2x0YWdlKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJdmZyZWUoYnVmKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CiAJCX0KIAogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBXUl9HQVRFX0NUUkwsCiAJCQkJCUxETzMzMThfUFdSX01BU0ssIExET19PTik7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXZmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOwogCQl9CiAKIAkJd2FpdF90aW1lb3V0KDYwMCk7CkBAIC0yMjUxLDcgKzIzNDgsOCBAQAogCXJldHZhbCA9IGNhcmRfcG93ZXJfb24oY2hpcCwgU1BJX0NBUkQpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJdmZyZWUoYnVmKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CiAJfQogCiAJd2FpdF90aW1lb3V0KDUwKTsKQEAgLTIyNjIsNyArMjM2MCw4IEBACiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKIAkJCXJlc3VsdCA9IFRSQU5TUE9SVF9GQUlMRUQ7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIEV4aXQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gRXhpdDsKIAkJfQogCX0KIApAQCAtMjI3MCwyNSArMjM2OSwzMyBAQAogCXZmcmVlKGJ1Zik7CiAKIAlyZXR2YWwgPSBjYXJkX3Bvd2VyX29mZihjaGlwLCBTUElfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQV1JfR0FURV9DVFJMLAogCQkJCQlMRE8zMzE4X1BXUl9NQVNLLCBMRE9fT0ZGKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwkJfQogCiAJCXdhaXRfdGltZW91dCg2MDApOwogCiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MDgsIHZhbCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJCX0KIAogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBXUl9HQVRFX0NUUkwsCiAJCQkJCUxETzMzMThfUFdSX01BU0ssIExET19PTik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJCX0KIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjI5Nyw3ICsyNDA0LDggQEAKIHN0YXRpYyBpbnQgcmVhZF9jZmdfYnl0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJaW50IHJldHZhbDsKLQl1OCBmdW5jLCBmdW5jX21heDsKKwlib29sIGZ1bmNfbWF4OworCXU4IGZ1bmM7CiAJdTE2IGFkZHIsIGxlbjsKIAl1OCAqYnVmOwogCkBAIC0yMzE3LDI2ICsyNDI1LDMwIEBACiAJCV9fZnVuY19fLCBmdW5jLCBhZGRyLCBsZW4pOwogCiAJaWYgKENIS19TRElPX0VYSVNUKGNoaXApICYmICFDSEtfU0RJT19JR05PUkVEKGNoaXApKQotCQlmdW5jX21heCA9IDE7CisJCWZ1bmNfbWF4ID0gdHJ1ZTsKIAllbHNlCi0JCWZ1bmNfbWF4ID0gMDsKKwkJZnVuY19tYXggPSBmYWxzZTsKIAogCWlmIChmdW5jID4gZnVuY19tYXgpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWJ1ZiA9IHZtYWxsb2MobGVuKTsKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlyZXR2YWwgPSBydHN4X3JlYWRfY2ZnX3NlcShjaGlwLCBmdW5jLCBhZGRyLCBidWYsIGxlbik7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQl2ZnJlZShidWYpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWxlbiA9ICh1MTYpbWluX3QodW5zaWduZWQgaW50LCBzY3NpX2J1ZmZsZW4oc3JiKSwgbGVuKTsKQEAgLTIzNTEsNyArMjQ2Myw4IEBACiBzdGF0aWMgaW50IHdyaXRlX2NmZ19ieXRlKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlpbnQgcmV0dmFsOwotCXU4IGZ1bmMsIGZ1bmNfbWF4OworCWJvb2wgZnVuY19tYXg7CisJdTggZnVuYzsKIAl1MTYgYWRkciwgbGVuOwogCXU4ICpidWY7CiAKQEAgLTIzNzEsMjAgKzI0ODQsMjMgQEAKIAkJX19mdW5jX18sIGZ1bmMsIGFkZHIpOwogCiAJaWYgKENIS19TRElPX0VYSVNUKGNoaXApICYmICFDSEtfU0RJT19JR05PUkVEKGNoaXApKQotCQlmdW5jX21heCA9IDE7CisJCWZ1bmNfbWF4ID0gdHJ1ZTsKIAllbHNlCi0JCWZ1bmNfbWF4ID0gMDsKKwkJZnVuY19tYXggPSBmYWxzZTsKIAogCWlmIChmdW5jID4gZnVuY19tYXgpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWxlbiA9ICh1bnNpZ25lZCBzaG9ydCltaW5fdCh1bnNpZ25lZCBpbnQsIHNjc2lfYnVmZmxlbihzcmIpLCBsZW4pOwogCWJ1ZiA9IHZtYWxsb2MobGVuKTsKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlydHN4X3N0b3JfZ2V0X3hmZXJfYnVmKGJ1ZiwgbGVuLCBzcmIpOwogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgc2NzaV9idWZmbGVuKHNyYikgLSBsZW4pOwpAQCAtMjM5Myw3ICsyNTA5LDggQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKIAkJdmZyZWUoYnVmKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAl2ZnJlZShidWYpOwpAQCAtMjQ4Myw3ICsyNjAwLDggQEAKIAlkZWZhdWx0OgogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTI2MjYsNyArMjc0NCw4IEBACiAKIAlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWNhcmQgPSBnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKTsKQEAgLTI2MzQsNyArMjc1Myw4IEBACiAJCWJ1c193aWR0aCA9IGNoaXAtPmNhcmRfYnVzX3dpZHRoW2x1bl07CiAJfSBlbHNlIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKQEAgLTI2NTEsNyArMjc3MSw4IEBACiAKIAlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkgfHwgQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlydHN4X2Rpc2FibGVfYXNwbShjaGlwKTsKQEAgLTI3MDAsMTMgKzI4MjEsMTYgQEAKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU9fRElSLCAweDA3LCBncGlvX2Rpcik7CiAKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJT19ESVIsIDB4MDcsIGdwaW9fZGlyKTsKIAotCWlmIChyZXN1bHQgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlpZiAocmVzdWx0ICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KIAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKIH0KQEAgLTI3NjUsNyArMjg4OSw4IEBACiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0yNzk3LDE4ICsyOTIyLDIxIEBACiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOwogCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwotCWludCByZXR2YWwsIHF1aWNrX2Zvcm1hdDsKKwlib29sIHF1aWNrX2Zvcm1hdDsKKwlpbnQgcmV0dmFsOwogCiAJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKChzcmItPmNtbmRbM10gIT0gMHg0RCkgfHwgKHNyYi0+Y21uZFs0XSAhPSAweDQ3KSB8fAogCQkoc3JiLT5jbW5kWzVdICE9IDB4NjYpIHx8IChzcmItPmNtbmRbNl0gIT0gMHg2RCkgfHwKIAkJKHNyYi0+Y21uZFs3XSAhPSAweDc0KSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJ0c3hfZGlzYWJsZV9hc3BtKGNoaXApOwpAQCAtMjgyMCwzNSArMjk0OCw0MCBAQAogCQlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSB8fAogCQkJCShnZXRfY2FyZF9zaXplKGNoaXAsIGx1bikgPT0gMCkpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAJcnRzeF9zZXRfc3RhdChjaGlwLCBSVFNYX1NUQVRfUlVOKTsKIAogCWlmIChzcmItPmNtbmRbOF0gJiAweDAxKQotCQlxdWlja19mb3JtYXQgPSAwOworCQlxdWlja19mb3JtYXQgPSBmYWxzZTsKIAllbHNlCi0JCXF1aWNrX2Zvcm1hdCA9IDE7CisJCXF1aWNrX2Zvcm1hdCA9IHRydWU7CiAKIAlpZiAoIShjaGlwLT5jYXJkX3JlYWR5ICYgTVNfQ0FSRCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX1BST1RFQ1QpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICghQ0hLX01TUFJPKG1zX2NhcmQpKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHZhbCA9IG1zcHJvX2Zvcm1hdChzcmIsIGNoaXAsIE1TX1NIT1JUX0RBVEFfTEVOLCBxdWlja19mb3JtYXQpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX0ZPUk1BVF9DTURfRkFJTEVEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlzY3NpX3NldF9yZXNpZChzcmIsIDApOwpAQCAtMjg2NywxOCArMzAwMCwyMSBAQAogCiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKChzcmItPmNtbmRbMl0gIT0gMHhCMCkgfHwgKHNyYi0+Y21uZFs0XSAhPSAweDREKSB8fAogCQkoc3JiLT5jbW5kWzVdICE9IDB4NTMpIHx8IChzcmItPmNtbmRbNl0gIT0gMHg0OSkgfHwKIAkJKHNyYi0+Y21uZFs3XSAhPSAweDQ0KSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWRldl9pbmZvX2lkID0gc3JiLT5jbW5kWzNdOwpAQCAtMjg4Niw3ICszMDIyLDggQEAKIAkJCSghQ0hLX01TWEMobXNfY2FyZCkgJiYgKGRldl9pbmZvX2lkID09IDB4MTMpKSB8fAogCQkJIUNIS19NU1BSTyhtc19jYXJkKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChkZXZfaW5mb19pZCA9PSAweDE1KQpAQCAtMjg5NSw4ICszMDMyLDEwIEBACiAJCWJ1Zl9sZW4gPSBkYXRhX2xlbiA9IDB4NkE7CiAKIAlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoIWJ1ZikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCWkgPSAwOwogCS8qICBHRVQgTWVtb3J5IFN0aWNrIE1lZGlhIEluZm9ybWF0aW9uIFJlc3BvbnNlIEhlYWRlciAqLwpAQCAtMjk4MywxMSArMzEyMiwxMyBAQAogCiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IFNEX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJc3dpdGNoIChzcmItPmNtbmRbMF0pIHsKQEAgLTMwMTcsNyArMzE1OCw4IEBACiAKIAlkZWZhdWx0OgogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0zMDQ0LDIxICszMTg2LDI1IEBACiAKIAlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoc3JiLT5jbW5kWzddICE9IEtDX01HX1JfUFJPKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKCFDSEtfTVNQUk8obXNfY2FyZCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWtleV9mb3JtYXQgPSBzcmItPmNtbmRbMTBdICYgMHgzRjsKQEAgLTMwNzAsMTMgKzMyMTYsMTYgQEAKIAkJCShzcmItPmNtbmRbOF0gPT0gMHgwNCkgJiYKIAkJCShzcmItPmNtbmRbOV0gPT0gMHgxQykpIHsKIAkJCXJldHZhbCA9IG1nX2dldF9sb2NhbF9FS0Ioc3JiLCBjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCQl9CiAKIAkJfSBlbHNlIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCQlicmVhazsKIApAQCAtMzA4NSwxMyArMzIzNCwxNiBAQAogCQkJKHNyYi0+Y21uZFs4XSA9PSAweDAwKSAmJgogCQkJKHNyYi0+Y21uZFs5XSA9PSAweDI0KSkgewogCQkJcmV0dmFsID0gbWdfZ2V0X3JzcF9jaGcoc3JiLCBjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCQl9CiAKIAkJfSBlbHNlIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCQlicmVhazsKIApAQCAtMzEwNSwxOSArMzI1NywyMyBAQAogCQkJKHNyYi0+Y21uZFs0XSA9PSAweDAwKSAmJgogCQkJKHNyYi0+Y21uZFs1XSA8IDMyKSkgewogCQkJcmV0dmFsID0gbWdfZ2V0X0lDVihzcmIsIGNoaXApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJCX0KIAogCQl9IGVsc2UgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlzY3NpX3NldF9yZXNpZChzcmIsIDApOwpAQCAtMzE0MywyNSArMzI5OSwzMCBAQAogCiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJaWYgKGNoZWNrX2NhcmRfd3AoY2hpcCwgbHVuKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfUFJPVEVDVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChzcmItPmNtbmRbN10gIT0gS0NfTUdfUl9QUk8pIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoIUNIS19NU1BSTyhtc19jYXJkKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJa2V5X2Zvcm1hdCA9IHNyYi0+Y21uZFsxMF0gJiAweDNGOwpAQCAtMzE3MywxMyArMzMzNCwxNiBAQAogCQkJKHNyYi0+Y21uZFs4XSA9PSAweDAwKSAmJgogCQkJKHNyYi0+Y21uZFs5XSA9PSAweDBDKSkgewogCQkJcmV0dmFsID0gbWdfc2V0X2xlYWZfaWQoc3JiLCBjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCQl9CiAKIAkJfSBlbHNlIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCQlicmVhazsKIApAQCAtMzE4OCwxMyArMzM1MiwxNiBAQAogCQkJKHNyYi0+Y21uZFs4XSA9PSAweDAwKSAmJgogCQkJKHNyYi0+Y21uZFs5XSA9PSAweDBDKSkgewogCQkJcmV0dmFsID0gbWdfY2hnKHNyYiwgY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCiAJCX0gZWxzZSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTMyMDMsMTMgKzMzNzAsMTYgQEAKIAkJCShzcmItPmNtbmRbOF0gPT0gMHgwMCkgJiYKIAkJCShzcmItPmNtbmRbOV0gPT0gMHgwQykpIHsKIAkJCXJldHZhbCA9IG1nX3JzcChzcmIsIGNoaXApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJCX0KIAogCQl9IGVsc2UgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zMjIzLDE5ICszMzkzLDIzIEBACiAJCQkoc3JiLT5jbW5kWzRdID09IDB4MDApICYmCiAJCQkoc3JiLT5jbW5kWzVdIDwgMzIpKSB7CiAJCQlyZXR2YWwgPSBtZ19zZXRfSUNWKHNyYiwgY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCiAJCX0gZWxzZSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CkBAIC0zMjY0LDcgKzM0MzgsOCBAQAogCQkJLyogTG9naWNhbCBVbml0IE5vdCBSZWFkeSBGb3JtYXQgaW4gUHJvZ3Jlc3MgKi8KIAkJCXNldF9zZW5zZV9kYXRhKGNoaXAsIGx1biwgQ1VSX0VSUiwKIAkJCQkgICAgICAgMHgwMiwgMCwgMHgwNCwgMHgwNCwgMCwgMCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTMyNzYsNyArMzQ1MSw4IEBACiAJCQkvKiBMb2dpY2FsIFVuaXQgTm90IFJlYWR5IEZvcm1hdCBpbiBQcm9ncmVzcyAqLwogCQkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDAyLCAwLCAweDA0LCAweDA0LAogCQkJCQkwLCAodTE2KShtc19jYXJkLT5wcm9ncmVzcykpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuYwppbmRleCBkYWIxOTk1Li5mMjc0OTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmMKQEAgLTI1LDEwICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgInJ0c3guaCIKLSNpbmNsdWRlICJydHN4X3Njc2kuaCIKLSNpbmNsdWRlICJydHN4X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInJ0c3hfY2hpcC5oIgotI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNjYXR0ZXItZ2F0aGVyIHRyYW5zZmVyIGJ1ZmZlciBhY2Nlc3Mgcm91dGluZXMKQEAgLTI3Niw3ICsyNzIsOCBAQAogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiY2hpcC0+aW50X3JlZyA9IDB4JXhcbiIsCiAJCQljaGlwLT5pbnRfcmVnKTsKIAkJZXJyID0gLUVUSU1FRE9VVDsKLQkJVFJBQ0VfR09UTyhjaGlwLCBmaW5pc2hfc2VuZF9jbWQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIGZpbmlzaF9zZW5kX2NtZDsKIAl9CiAKIAlzcGluX2xvY2tfaXJxKCZydHN4LT5yZWdfbG9jayk7CkBAIC02NDIsNyArNjM5LDcgQEAKIAlkbWFfYWRkcl90IGFkZHI7CiAJdTggZGlyOwogCWludCBlcnIgPSAwOwotCXUzMiB2YWwgPSAoMSA8PCAzMSk7CisJdTMyIHZhbCA9IDEgPDwgMzE7CiAJbG9uZyB0aW1lbGVmdDsKIAogCWlmICgoYnVmID09IE5VTEwpIHx8IChsZW4gPD0gMCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuYwppbmRleCBjMjhhOTI3Li5hOGQ2NTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmMKQEAgLTI1LDkgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAicnRzeC5oIgotI2luY2x1ZGUgInJ0c3hfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAicnRzeF9zY3NpLmgiCi0jaW5jbHVkZSAicnRzeF9jYXJkLmgiCiAjaW5jbHVkZSAic2QuaCIKIAogI2RlZmluZSBTRF9NQVhfUkVUUllfQ09VTlQJMwpAQCAtMTA4LDEzICsxMDUsMTkgQEAKIAogc3RhdGljIGludCBzZF9jaGVja19kYXRhMF9zdGF0dXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKKwlpbnQgcmV0dmFsOwogCXU4IHN0YXQ7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFJFR19TRF9TVEFUMSwgJnN0YXQpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBSRUdfU0RfU1RBVDEsICZzdGF0KTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKCEoc3RhdCAmIFNEX0RBVDBfU1RBVFVTKSkgewogCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfQlVTWSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xODcsNyArMTkwLDggQEAKIAkJCQlyZXR2YWwgPSBzZF9jaGVja19kYXRhMF9zdGF0dXMoY2hpcCk7CiAJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwotCQkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIHJldHZhbDsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9UT19FUlIpOwpAQCAtMTk4LDcgKzIwMiw4IEBACiAJCX0KIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKIAotCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjApCkBAIC0yMDgsMTQgKzIxMywxNiBAQAogCiAJaWYgKChwdHJbMF0gJiAweEMwKSAhPSAwKSB7CiAJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9TVFNfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmICghKHJzcF90eXBlICYgU0RfTk9fQ0hFQ0tfQ1JDNykpIHsKIAkJaWYgKHB0cltzdGF0X2lkeF0gJiBTRF9DUkM3X0VSUikgewogCQkJaWYgKGNtZF9pZHggPT0gV1JJVEVfTVVMVElQTEVfQkxPQ0spIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfQ1JDX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCWlmIChydHlfY250IDwgU0RfTUFYX1JFVFJZX0NPVU5UKSB7CiAJCQkJd2FpdF90aW1lb3V0KDIwKTsKQEAgLTIyMyw3ICsyMzAsOCBAQAogCQkJCWdvdG8gUlRZX1NFTkRfQ01EOwogCQkJfSBlbHNlIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfQ1JDX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCX0KQEAgLTIzMiw4ICsyNDAsMTAgQEAKIAkJaWYgKChjbWRfaWR4ICE9IFNFTkRfUkVMQVRJVkVfQUREUikgJiYKIAkJCShjbWRfaWR4ICE9IFNFTkRfSUZfQ09ORCkpIHsKIAkJCWlmIChjbWRfaWR4ICE9IFNUT1BfVFJBTlNNSVNTSU9OKSB7Ci0JCQkJaWYgKHB0clsxXSAmIDB4ODApCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHB0clsxXSAmIDB4ODApIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAkJCX0KICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAkJCWlmIChwdHJbMV0gJiAweDdEKQpAQCAtMjQzLDE3ICsyNTMsMjAgQEAKIAkJCXsKIAkJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAicHRyWzFdOiAweCUwMnhcbiIsCiAJCQkJCXB0clsxXSk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCWlmIChwdHJbMl0gJiAweEZGKSB7CiAJCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgInB0clsyXTogMHglMDJ4XG4iLAogCQkJCQlwdHJbMl0pOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlpZiAocHRyWzNdICYgMHg4MCkgewogCQkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJwdHJbM106IDB4JTAyeFxuIiwKIAkJCQkJcHRyWzNdKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKHB0clszXSAmIDB4MDEpCiAJCQkJc2RfY2FyZC0+c2RfZGF0YV9idWZfcmVhZHkgPSAxOwpAQCAtMjgyLDggKzI5NSwxMCBAQAogCWlmICghYnVmKQogCQlidWZfbGVuID0gMDsKIAotCWlmIChidWZfbGVuID4gNTEyKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChidWZfbGVuID4gNTEyKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwogCkBAIC0zMjMsMTMgKzMzOCwxNiBAQAogCQkJCQkgICAgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwogCQl9CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChidWYgJiYgYnVmX2xlbikgewogCQlyZXR2YWwgPSBydHN4X3JlYWRfcHBidWYoY2hpcCwgYnVmLCBidWZfbGVuKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0zNTAsMTMgKzM2OCwxNiBAQAogCiAJaWYgKGJ1Zl9sZW4gPiA1MTIpIHsKIAkJLyogVGhpcyBmdW5jdGlvbiBjYW4ndCB3cml0ZSBkYXRhIG1vcmUgdGhhbiBvbmUgcGFnZSAqLwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKGJ1ZiAmJiBidWZfbGVuKSB7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcHBidWYoY2hpcCwgYnVmLCBidWZfbGVuKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtMzk1LDcgKzQxNiw4IEBACiAJCQkJc2RfY2FyZC0+c2RfYWRkciwgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwogCQl9CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTQxMiw3ICs0MzQsOCBAQAogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9DU0QsIHNkX2NhcmQtPnNkX2FkZHIsCkBAIC00MjEsOCArNDQ0LDEwIEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoaSA9PSA2KQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IDYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1lbWNweShzZF9jYXJkLT5yYXdfY3NkLCByc3AgKyAxLCAxNSk7CiAKQEAgLTQ2NCwxMCArNDg5LDEyIEBACiAJCQllbHNlCiAJCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSBDTEtfMjA7CiAJCX0gZWxzZSB7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0gZWxzZSB7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoQ0hLX01NQ19TRUNUT1JfTU9ERShzZF9jYXJkKSkgewpAQCAtNTA3LDggKzUzNCw4IEBACiAKIHN0YXRpYyBpbnQgc2Rfc2V0X3NhbXBsZV9wdXNoX3RpbWluZyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogeworCWludCByZXR2YWw7CiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOwotCiAJdTggdmFsID0gMDsKIAogCWlmICgoY2hpcC0+c2RfY3RsICYgU0RfUFVTSF9QT0lOVF9DVExfTUFTSykgPT0gU0RfUFVTSF9QT0lOVF9ERUxBWSkKQEAgLTUzNiw3ICs1NjMsMTEgQEAKIAkJCXZhbCB8PSAweDA4OwogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9DRkcxLCAweDFDLCB2YWwpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4MUMsIHZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTU4NSw2ICs2MTYsNyBAQAogCiBzdGF0aWMgaW50IHNkX3NldF9jbG9ja19kaXZpZGVyKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGNsa19kaXYpCiB7CisJaW50IHJldHZhbDsKIAl1OCBtYXNrID0gMCwgdmFsID0gMDsKIAogCW1hc2sgPSAweDYwOwpAQCAtNTk1LDcgKzYyNywxMSBAQAogCWVsc2UgaWYgKGNsa19kaXYgPT0gU0RfQ0xLX0RJVklERV8yNTYpCiAJCXZhbCA9IDB4MjA7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQ0ZHMSwgbWFzaywgdmFsKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkcxLCBtYXNrLCB2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC02MDYsMTQgKzY0MiwxOCBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzZF9zZXRfc2FtcGxlX3B1c2hfdGltaW5nKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJc2RfY2hvb3NlX3Byb3Blcl9jbG9jayhjaGlwKTsKIAogCXJldHZhbCA9IHN3aXRjaF9jbG9jayhjaGlwLCBzZF9jYXJkLT5zZF9jbG9jayk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC02MzYsOCArNjc2LDEwIEBACiAJfQogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBjbWRfaWR4LCBhZGRyLCBjbWRfdHlwZSwgTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC02NTEsOCArNjkzLDEwIEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCVNEX1JTUF9UWVBFX1IxLCByc3AsIDUpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHJzcFsxXSAmIDB4MDIpCiAJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzIHw9IFNEX0xPQ0tFRDsKQEAgLTY2Miw4ICs3MDYsMTAgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAic2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgPSAweCV4XG4iLAogCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyk7CiAKLQlpZiAocnNwWzFdICYgMHgwMSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocnNwWzFdICYgMHgwMSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNjgwLDE1ICs3MjYsMTggQEAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywKIAkJCQkJc2RfY2FyZC0+c2RfYWRkciwgU0RfUlNQX1RZUEVfUjEsIHJzcCwKIAkJCQkJNSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKCgocnNwWzNdICYgMHgxRSkgPT0gc3RhdGUpICYmCiAJCQkoKHJzcFszXSAmIDB4MDEpID09IGRhdGFfcmVhZHkpKQogCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKIHN0YXRpYyBpbnQgc2RfY2hhbmdlX2Jhbmtfdm9sdGFnZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCB2b2x0YWdlKQpAQCAtNzAwLDI0ICs3NDksMzkgQEAKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MDgsCiAJCQkJCQkJMHg0RkMwIHwKIAkJCQkJCQljaGlwLT5waHlfdm9sdGFnZSk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9QQURfQ1RMLCBTRF9JT19VU0lOR18xVjgsIDApOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9QQURfQ1RMLAorCQkJCQkJICAgICBTRF9JT19VU0lOR18xVjgsIDApOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQogCX0gZWxzZSBpZiAodm9sdGFnZSA9PSBTRF9JT18xVjgpIHsKIAkJaWYgKGNoaXAtPmFzaWNfY29kZSkgewogCQkJcmV0dmFsID0gcnRzeF93cml0ZV9waHlfcmVnaXN0ZXIoY2hpcCwgMHgwOCwKIAkJCQkJCQkweDRDNDAgfAogCQkJCQkJCWNoaXAtPnBoeV92b2x0YWdlKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfSBlbHNlIHsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1BBRF9DVEwsIFNEX0lPX1VTSU5HXzFWOCwKLQkJCQlTRF9JT19VU0lOR18xVjgpOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9QQURfQ1RMLAorCQkJCQkJICAgICBTRF9JT19VU0lOR18xVjgsCisJCQkJCQkgICAgIFNEX0lPX1VTSU5HXzFWOCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTcyOCwzMyArNzkyLDYxIEBACiAJaW50IHJldHZhbDsKIAl1OCBzdGF0OwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfQlVTX1NUQVQsIFNEX0NMS19UT0dHTEVfRU4gfCBTRF9DTEtfRk9SQ0VfU1RPUCwKLQkJU0RfQ0xLX1RPR0dMRV9FTik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CVVNfU1RBVCwKKwkJCQkgICAgIFNEX0NMS19UT0dHTEVfRU4gfCBTRF9DTEtfRk9SQ0VfU1RPUCwKKwkJCQkgICAgIFNEX0NMS19UT0dHTEVfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFZPTFRBR0VfU1dJVENILCAwLCBTRF9SU1BfVFlQRV9SMSwKIAkJCQlOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXVkZWxheShjaGlwLT5zZF92b2x0YWdlX3N3aXRjaF9kZWxheSk7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFNEX0JVU19TVEFULCAmc3RhdCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFNEX0JVU19TVEFULCAmc3RhdCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlpZiAoc3RhdCAmIChTRF9DTURfU1RBVFVTIHwgU0RfREFUM19TVEFUVVMgfCBTRF9EQVQyX1NUQVRVUyB8CiAJCQkJU0RfREFUMV9TVEFUVVMgfCBTRF9EQVQwX1NUQVRVUykpIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0JVU19TVEFULCAweEZGLCBTRF9DTEtfRk9SQ0VfU1RPUCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CVVNfU1RBVCwgMHhGRiwKKwkJCQkgICAgIFNEX0NMS19GT1JDRV9TVE9QKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCXJldHZhbCA9IHNkX2NoYW5nZV9iYW5rX3ZvbHRhZ2UoY2hpcCwgU0RfSU9fMVY4KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXdhaXRfdGltZW91dCg1MCk7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9CVVNfU1RBVCwgMHhGRiwgU0RfQ0xLX1RPR0dMRV9FTik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CVVNfU1RBVCwgMHhGRiwKKwkJCQkgICAgIFNEX0NMS19UT0dHTEVfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJd2FpdF90aW1lb3V0KDEwKTsKIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgU0RfQlVTX1NUQVQsICZzdGF0KTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfQlVTX1NUQVQsICZzdGF0KTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWlmICgoc3RhdCAmIChTRF9DTURfU1RBVFVTIHwgU0RfREFUM19TVEFUVVMgfCBTRF9EQVQyX1NUQVRVUyB8CiAJCQkJU0RfREFUMV9TVEFUVVMgfCBTRF9EQVQwX1NUQVRVUykpICE9CiAJCQkoU0RfQ01EX1NUQVRVUyB8IFNEX0RBVDNfU1RBVFVTIHwgU0RfREFUMl9TVEFUVVMgfApAQCAtNzYzLDIzICs4NTUsNDggQEAKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CVVNfU1RBVCwKIAkJCQlTRF9DTEtfVE9HR0xFX0VOIHwgU0RfQ0xLX0ZPUkNFX1NUT1AsIDApOwogCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfQ0xLX0VOLCAweEZGLCAwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0JVU19TVEFULCBTRF9DTEtfVE9HR0xFX0VOIHwgU0RfQ0xLX0ZPUkNFX1NUT1AsCi0JCTApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQlVTX1NUQVQsCisJCQkJICAgICBTRF9DTEtfVE9HR0xFX0VOIHwgU0RfQ0xLX0ZPUkNFX1NUT1AsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIHN0YXRpYyBpbnQgc2RfcmVzZXRfZGNtKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IHR1bmVfZGlyKQogeworCWludCByZXR2YWw7CisKIAlpZiAodHVuZV9kaXIgPT0gVFVORV9SWCkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBEQ01fRFJQX0NUTCwgMHhGRiwgRENNX1JFU0VUIHwgRENNX1JYKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsIERDTV9SWCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsCisJCQkJCSAgICAgRENNX1JFU0VUIHwgRENNX1JYKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBEQ01fRFJQX0NUTCwgMHhGRiwgRENNX1JYKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9IGVsc2UgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBEQ01fRFJQX0NUTCwgMHhGRiwgRENNX1JFU0VUIHwgRENNX1RYKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsIERDTV9UWCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsCisJCQkJCSAgICAgRENNX1JFU0VUIHwgRENNX1RYKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBEQ01fRFJQX0NUTCwgMHhGRiwgRENNX1RYKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC03OTEsNyArOTA4LDcgQEAKIAl1MTYgU0RfVlBfQ1RMLCBTRF9EQ01QU19DVEw7CiAJdTggdmFsOwogCWludCByZXR2YWw7Ci0JaW50IGRkcl9yeCA9IDA7CisJYm9vbCBkZHJfcnggPSBmYWxzZTsKIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJzZF9jaGFuZ2VfcGhhc2UgKHNhbXBsZV9wb2ludCA9ICVkLCB0dW5lX2RpciA9ICVkKVxuIiwKIAkJc2FtcGxlX3BvaW50LCB0dW5lX2Rpcik7CkBAIC04MDAsMTkgKzkxNyw0MiBAQAogCQlTRF9WUF9DVEwgPSBTRF9WUFJYX0NUTDsKIAkJU0RfRENNUFNfQ1RMID0gU0RfRENNUFNfUlhfQ1RMOwogCQlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQotCQkJZGRyX3J4ID0gMTsKKwkJCWRkcl9yeCA9IHRydWU7CiAJfSBlbHNlIHsKIAkJU0RfVlBfQ1RMID0gU0RfVlBUWF9DVEw7CiAJCVNEX0RDTVBTX0NUTCA9IFNEX0RDTVBTX1RYX0NUTDsKIAl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENMS19DVEwsIENIQU5HRV9DTEssIENIQU5HRV9DTEspOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUF9DVEwsIDB4MUYsIHNhbXBsZV9wb2ludCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsIFBIQVNFX05PVF9SRVNFVCwgMCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsIFBIQVNFX05PVF9SRVNFVCwKLQkJCVBIQVNFX05PVF9SRVNFVCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENMS19DVEwsIENIQU5HRV9DTEssIDApOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19DVEwsIENIQU5HRV9DTEssCisJCQkJCSAgICAgQ0hBTkdFX0NMSyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfVlBfQ1RMLCAweDFGLAorCQkJCQkgICAgIHNhbXBsZV9wb2ludCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfVlBDTEswX0NUTCwKKwkJCQkJICAgICBQSEFTRV9OT1RfUkVTRVQsIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsCisJCQkJCSAgICAgUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19DVEwsIENIQU5HRV9DTEssIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0gZWxzZSB7CiAJCXJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9WUF9DVEwsICZ2YWwpOwogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU0RfVlBfQ1RMOiAweCV4XG4iLCB2YWwpOwpAQCAtODIwLDE2ICs5NjAsMzQgQEAKIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlNEX0RDTVBTX0NUTDogMHgleFxuIiwgdmFsKTsKIAogCQlpZiAoZGRyX3J4KSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUF9DVEwsIFBIQVNFX0NIQU5HRSwKLQkJCQlQSEFTRV9DSEFOR0UpOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9WUF9DVEwsCisJCQkJCQkgICAgIFBIQVNFX0NIQU5HRSwKKwkJCQkJCSAgICAgUEhBU0VfQ0hBTkdFKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCQl1ZGVsYXkoNTApOwotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBfQ1RMLCAweEZGLAotCQkJCVBIQVNFX0NIQU5HRSB8IFBIQVNFX05PVF9SRVNFVCB8IHNhbXBsZV9wb2ludCk7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQX0NUTCwgMHhGRiwKKwkJCQkJCSAgICAgUEhBU0VfQ0hBTkdFIHwgUEhBU0VfTk9UX1JFU0VUIHwgc2FtcGxlX3BvaW50KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCBDSEFOR0VfQ0xLLCBDSEFOR0VfQ0xLKTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX0NUTCwKKwkJCQkJCSAgICAgQ0hBTkdFX0NMSywgQ0hBTkdFX0NMSyk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJdWRlbGF5KDUwKTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQX0NUTCwgMHhGRiwKLQkJCQkJUEhBU0VfTk9UX1JFU0VUIHwgc2FtcGxlX3BvaW50KTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfVlBfQ1RMLCAweEZGLAorCQkJCQkJICAgICBQSEFTRV9OT1RfUkVTRVQgfCBzYW1wbGVfcG9pbnQpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQogCQl1ZGVsYXkoMTAwKTsKIApAQCAtODM5LDI2ICs5OTcsNTIgQEAKIAkJcnRzeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX0RDTVBTX0NUTCwKIAkJCURDTVBTX0NIQU5HRV9ET05FLCBEQ01QU19DSEFOR0VfRE9ORSk7CiAJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgU0RfQ0FSRCwgMTAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIEZhaWw7CisJCX0KIAogCQl2YWwgPSAqcnRzeF9nZXRfY21kX2RhdGEoY2hpcCk7Ci0JCWlmICh2YWwgJiBEQ01QU19FUlJPUikKLQkJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJCWlmICh2YWwgJiBEQ01QU19FUlJPUikgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gRmFpbDsKKwkJfQogCi0JCWlmICgodmFsICYgRENNUFNfQ1VSUkVOVF9QSEFTRSkgIT0gc2FtcGxlX3BvaW50KQotCQkJVFJBQ0VfR09UTyhjaGlwLCBGYWlsKTsKKwkJaWYgKCh2YWwgJiBEQ01QU19DVVJSRU5UX1BIQVNFKSAhPSBzYW1wbGVfcG9pbnQpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIEZhaWw7CisJCX0KIAotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9EQ01QU19DVEwsIERDTVBTX0NIQU5HRSwgMCk7Ci0JCWlmIChkZHJfcngpCi0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUF9DVEwsIFBIQVNFX0NIQU5HRSwgMCk7Ci0JCWVsc2UKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENMS19DVEwsIENIQU5HRV9DTEssIDApOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0RDTVBTX0NUTCwKKwkJCQkJICAgICBEQ01QU19DSEFOR0UsIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlpZiAoZGRyX3J4KSB7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQX0NUTCwKKwkJCQkJCSAgICAgUEhBU0VfQ0hBTkdFLCAwKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19DVEwsCisJCQkJCQkgICAgIENIQU5HRV9DTEssIDApOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJfQogCiAJCXVkZWxheSg1MCk7CiAJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfQ0ZHMSwgU0RfQVNZTkNfRklGT19OT1RfUlNULCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0NGRzEsIFNEX0FTWU5DX0ZJRk9fTk9UX1JTVCwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIApAQCAtODgzLDggKzEwNjcsMTAgQEAKIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAljbWRbMF0gPSAweDQwIHwgU0VORF9TQ1I7CiAJY21kWzFdID0gMDsKQEAgLTg5NiwxMyArMTA4MiwxNiBAQAogCQkJYnVmLCA4LCAyNTApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCW1lbWNweShzZF9jYXJkLT5yYXdfc2NyLCBidWYsIDgpOwogCi0JaWYgKChidWZbMF0gJiAweDBGKSA9PSAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICgoYnVmWzBdICYgMHgwRikgPT0gMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtOTQ0LDcgKzExMzMsOCBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfSBlbHNlIGlmIChmdW5jX2dyb3VwID09IFNEX0ZVTkNfR1JPVVBfMykgewogCQlzdXBwb3J0X29mZnNldCA9IEZVTkNUSU9OX0dST1VQM19TVVBQT1JUX09GRlNFVDsKQEAgLTk3MSw3ICsxMTYxLDggQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0gZWxzZSBpZiAoZnVuY19ncm91cCA9PSBTRF9GVU5DX0dST1VQXzQpIHsKIAkJc3VwcG9ydF9vZmZzZXQgPSBGVU5DVElPTl9HUk9VUDRfU1VQUE9SVF9PRkZTRVQ7CkBAIC05OTgsMjMgKzExODksMjcgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0gZWxzZSB7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoZnVuY19ncm91cCA9PSBTRF9GVU5DX0dST1VQXzEpIHsKIAkJaWYgKCEoYnVmW3N1cHBvcnRfb2Zmc2V0XSAmIHN1cHBvcnRfbWFzaykgfHwKIAkJCSgoYnVmW3F1ZXJ5X3N3aXRjaF9vZmZzZXRdICYgMHgwRikgIT0gcXVlcnlfc3dpdGNoKSkgewotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKIAkvKiBDaGVjayAnQnVzeSBTdGF0dXMnICovCiAJaWYgKChidWZbREFUQV9TVFJVQ1RVUkVfVkVSX09GRlNFVF0gPT0gMHgwMSkgJiYKIAkJICAgICgoYnVmW2NoZWNrX2J1c3lfb2Zmc2V0XSAmIHN3aXRjaF9idXN5KSA9PSBzd2l0Y2hfYnVzeSkpIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTEwNTYsNyArMTI1MSw4IEBACiAJCQlidWYsIDY0LCAyNTApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICIlKnBoXG4iLCA2NCwgYnVmKTsKQEAgLTEwODMsMTkgKzEyNzksMzMgQEAKIAogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiTWF4aW11bSBjdXJyZW50IGNvbnN1bXB0aW9uOiAlZG1BXG4iLAogCQkJY2MpOwotCQlpZiAoKGNjID09IDApIHx8IChjYyA+IDgwMCkpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAoKGNjID09IDApIHx8IChjYyA+IDgwMCkpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBzZF9xdWVyeV9zd2l0Y2hfcmVzdWx0KGNoaXAsIGZ1bmNfZ3JvdXAsCiAJCQkJCQlmdW5jX3RvX3N3aXRjaCwgYnVmLCA2NCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKChjYyA+IDQwMCkgfHwgKGZ1bmNfdG9fc3dpdGNoID4gQ1VSUkVOVF9MSU1JVF80MDApKSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBPQ1BQQVJBMiwgU0RfT0NQX1RIRF9NQVNLLAotCQkJCWNoaXAtPnNkXzgwMG1BX29jcF90aGQpOwotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QV1JfQ1RMLCBQTU9TX1NUUkdfTUFTSywKLQkJCQlQTU9TX1NUUkdfODAwbUEpOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBPQ1BQQVJBMiwKKwkJCQkJCSAgICAgU0RfT0NQX1RIRF9NQVNLLAorCQkJCQkJICAgICBjaGlwLT5zZF84MDBtQV9vY3BfdGhkKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFdSX0NUTCwKKwkJCQkJCSAgICAgUE1PU19TVFJHX01BU0ssCisJCQkJCQkgICAgIFBNT1NfU1RSR184MDBtQSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQl9CiAJfQogCkBAIC0xMTIxLDEyICsxMzMxLDEzIEBACiB7CiAJaW50IHJldHZhbDsKIAlpbnQgaTsKLQlpbnQgc3dpdGNoX2dvb2QgPSAwOworCWJvb2wgc3dpdGNoX2dvb2QgPSBmYWxzZTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJldHZhbCA9IHNkX2NoZWNrX3N3aXRjaF9tb2RlKGNoaXAsIFNEX0NIRUNLX01PREUsIGZ1bmNfZ3JvdXAsCkBAIC0xMTM3LDE0ICsxMzQ4LDE5IEBACiAJCQlyZXR2YWwgPSBzZF9jaGVja19zd2l0Y2hfbW9kZShjaGlwLCBTRF9TV0lUQ0hfTU9ERSwKIAkJCQkJZnVuY19ncm91cCwgZnVuY190b19zd2l0Y2gsIGJ1c193aWR0aCk7CiAJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJc3dpdGNoX2dvb2QgPSAxOworCQkJCXN3aXRjaF9nb29kID0gdHJ1ZTsKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBTRF9TVEFUMSwgJnN0YXQpOworCQkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFNEX1NUQVQxLCAmc3RhdCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJaWYgKHN0YXQgJiBTRF9DUkMxNl9FUlIpIHsKIAkJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU0QgQ1JDMTYgZXJyb3Igd2hlbiBzd2l0Y2hpbmcgbW9kZVxuIik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCkBAIC0xMTU0LDggKzEzNzAsMTAgQEAKIAkJd2FpdF90aW1lb3V0KDIwKTsKIAl9CiAKLQlpZiAoIXN3aXRjaF9nb29kKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICghc3dpdGNoX2dvb2QpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTExNzAsOCArMTM4OCwxMCBAQAogCS8qIEdldCBzdXBwb3J0ZWQgZnVuY3Rpb25zICovCiAJcmV0dmFsID0gc2RfY2hlY2tfc3dpdGNoX21vZGUoY2hpcCwgU0RfQ0hFQ0tfTU9ERSwKIAkJCU5PX0FSR1VNRU5ULCBOT19BUkdVTUVOVCwgYnVzX3dpZHRoKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXNkX2NhcmQtPmZ1bmNfZ3JvdXAxX21hc2sgJj0gfihzZF9jYXJkLT5zZF9zd2l0Y2hfZmFpbCk7CiAKQEAgLTEyMzksNyArMTQ1OSw4IEBACiAJCQkJc2RfY2FyZC0+c2Rfc3dpdGNoX2ZhaWwgPSBTRFIxMDRfU1VQUE9SVF9NQVNLIHwKIAkJCQkJRERSNTBfU1VQUE9SVF9NQVNLIHwgU0RSNTBfU1VQUE9SVF9NQVNLOwogCQkJfQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAoZnVuY190b19zd2l0Y2ggPT0gU0RSMTA0X1NVUFBPUlQpCkBAIC0xMjUzLDEwICsxNDc0LDE3IEBACiAJfQogCiAJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9QVVNIX1BPSU5UX0NUTCwgMHgwNiwgMHgwNCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfUFVTSF9QT0lOVF9DVEwsIDB4MDYsCisJCQkJCSAgICAgMHgwNCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCXJldHZhbCA9IHNkX3NldF9zYW1wbGVfcHVzaF90aW1pbmcoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJaWYgKCFmdW5jX3RvX3N3aXRjaCB8fCAoZnVuY190b19zd2l0Y2ggPT0gSFNfU1VQUE9SVCkpIHsKQEAgLTEzMTAsMTUgKzE1MzgsMjIgQEAKIAkJcmV0dmFsID0gc2RfY2hlY2tfc3dpdGNoKGNoaXAsIFNEX0ZVTkNfR1JPVVBfNCwgZnVuY190b19zd2l0Y2gsCiAJCQkJCWJ1c193aWR0aCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKSkKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0KIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlN3aXRjaCBjdXJyZW50IGxpbWl0IGZpbmlzaGVkISAoJWQpXG4iLAogCQkJcmV0dmFsKTsKIAl9CiAKLQlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9QVVNIX1BPSU5UX0NUTCwgMHgwNiwgMCk7CisJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkgeworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1BVU0hfUE9JTlRfQ1RMLCAweDA2LCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xMzMwLDcgKzE1NjUsMTEgQEAKIAl1OCB2YWwgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgU0RfREFUQV9TVEFURSwgJnZhbCk7CisJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9EQVRBX1NUQVRFLCAmdmFsKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJaWYgKHZhbCAmIFNEX0RBVEFfSURMRSkgewogCQkJcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQlicmVhazsKQEAgLTEzNDgsOCArMTU4NywxMCBAQAogCXU4IGNtZFs1XTsKIAogCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBzYW1wbGVfcG9pbnQsIFRVTkVfUlgpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY21kWzBdID0gMHg0MCB8IFNFTkRfVFVOSU5HX1BBVFRFUk47CiAJY21kWzFdID0gMDsKQEAgLTEzNjMsNyArMTYwNCw4IEBACiAJCSh2b2lkKXNkX3dhaXRfZGF0YV9pZGxlKGNoaXApOwogCiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMzc2LDE1ICsxNjE4LDE5IEBACiAJdTggY21kWzVdOwogCiAJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsIHNhbXBsZV9wb2ludCwgVFVORV9SWCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAic2QgZGRyIHR1bmluZyByeFxuIik7CiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsCiAJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY21kWzBdID0gMHg0MCB8IFNEX1NUQVRVUzsKIAljbWRbMV0gPSAwOwpAQCAtMTM5OCw3ICsxNjQ0LDggQEAKIAkJKHZvaWQpc2Rfd2FpdF9kYXRhX2lkbGUoY2hpcCk7CiAKIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE0MTgsOCArMTY2NSwxMCBAQAogCQlidXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfMTsKIAogCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBzYW1wbGVfcG9pbnQsIFRVTkVfUlgpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIm1tYyBkZHIgdHVuaW5nIHJ4XG4iKTsKIApAQCAtMTQzNSw3ICsxNjg0LDggQEAKIAkJKHZvaWQpc2Rfd2FpdF9kYXRhX2lkbGUoY2hpcCk7CiAKIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE0NDcsMTEgKzE2OTcsMTcgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsIHNhbXBsZV9wb2ludCwgVFVORV9UWCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKLQkJU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sCisJCQkJICAgICBTRF9SU1BfODBDTEtfVElNRU9VVF9FTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCiAJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKQEAgLTE0NTksMTEgKzE3MTUsMTcgQEAKIAkJaWYgKHNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX1JTUF9USU1FT1VUKSkgewogCQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLAogCQkJCQlTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwgMCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAorCQkJCSAgICAgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTE0NzUsOCArMTczNywxMCBAQAogCXU4IGNtZFs1XSwgYnVzX3dpZHRoOwogCiAJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsIHNhbXBsZV9wb2ludCwgVFVORV9UWCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CiAJCWJ1c193aWR0aCA9IFNEX0JVU19XSURUSF80OwpAQCAtMTQ5MCwxMSArMTc1NCwxNyBAQAogCX0KIAogCXJldHZhbCA9IHNkX3dhaXRfc3RhdGVfZGF0YV9yZWFkeShjaGlwLCAweDA4LCAxLCAxMDAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAotCQlTRF9SU1BfODBDTEtfVElNRU9VVF9FTik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKKwkJCQkgICAgIFNEX1JTUF84MENMS19USU1FT1VUX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJY21kWzBdID0gMHg0MCB8IFBST0dSQU1fQ1NEOwogCWNtZFsxXSA9IDA7CkBAIC0xNTA3LDEwICsxNzc3LDE2IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwogCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLCAwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAorCQkJCSAgICAgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLAogCQkJTlVMTCwgMCk7CkBAIC0xNTI0LDcgKzE4MDAsOCBAQAogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKIAlzdHJ1Y3QgdGltaW5nX3BoYXNlX3BhdGggcGF0aFtNQVhfUEhBU0UgKyAxXTsKIAlpbnQgaSwgaiwgY29udF9wYXRoX2NudDsKLQlpbnQgbmV3X2Jsb2NrLCBtYXhfbGVuLCBmaW5hbF9wYXRoX2lkeDsKKwlib29sIG5ld19ibG9jazsKKwlpbnQgbWF4X2xlbiwgZmluYWxfcGF0aF9pZHg7CiAJdTggZmluYWxfcGhhc2UgPSAweEZGOwogCiAJaWYgKHBoYXNlX21hcCA9PSAweEZGRkZGRkZGKSB7CkBAIC0xNTM3LDEyICsxODE0LDEyIEBACiAJfQogCiAJY29udF9wYXRoX2NudCA9IDA7Ci0JbmV3X2Jsb2NrID0gMTsKKwluZXdfYmxvY2sgPSB0cnVlOwogCWogPSAwOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfUEhBU0UgKyAxOyBpKyspIHsKIAkJaWYgKHBoYXNlX21hcCAmICgxIDw8IGkpKSB7CiAJCQlpZiAobmV3X2Jsb2NrKSB7Ci0JCQkJbmV3X2Jsb2NrID0gMDsKKwkJCQluZXdfYmxvY2sgPSBmYWxzZTsKIAkJCQlqID0gY29udF9wYXRoX2NudCsrOwogCQkJCXBhdGhbal0uc3RhcnQgPSBpOwogCQkJCXBhdGhbal0uZW5kID0gaTsKQEAgLTE1NTAsNyArMTgyNyw3IEBACiAJCQkJcGF0aFtqXS5lbmQgPSBpOwogCQkJfQogCQl9IGVsc2UgewotCQkJbmV3X2Jsb2NrID0gMTsKKwkJCW5ld19ibG9jayA9IHRydWU7CiAJCQlpZiAoY29udF9wYXRoX2NudCkgewogCQkJCWludCBpZHggPSBjb250X3BhdGhfY250IC0gMTsKIApAQCAtMTY1NCw4ICsxOTMxLDEwIEBACiAJfSBlbHNlIHsKIAkJaWYgKENIS19NTUNfRERSNTIoc2RfY2FyZCkpCiAJCQl0dW5pbmdfY21kID0gbW1jX2Rkcl90dW5uaW5nX3J4X2NtZDsKLQkJZWxzZQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJZWxzZSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewpAQCAtMTY2Myw3ICsxOTQyLDggQEAKIAkJZm9yIChqID0gTUFYX1BIQVNFOyBqID49IDA7IGotLSkgewogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXJldHZhbCA9IHR1bmluZ19jbWQoY2hpcCwgKHU4KWopOwpAQCAtMTY4MCwxMiArMTk2MCwxNiBAQAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJSWCBwaGFzZV9tYXAgPSAweCUwOHhcbiIsIHBoYXNlX21hcCk7CiAKIAlmaW5hbF9waGFzZSA9IHNkX3NlYXJjaF9maW5hbF9waGFzZShjaGlwLCBwaGFzZV9tYXAsIFRVTkVfUlgpOwotCWlmIChmaW5hbF9waGFzZSA9PSAweEZGKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChmaW5hbF9waGFzZSA9PSAweEZGKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgZmluYWxfcGhhc2UsIFRVTkVfUlgpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMTY5OCw4ICsxOTgyLDEyIEBACiAJdTMyIHBoYXNlX21hcDsKIAl1OCBmaW5hbF9waGFzZTsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAotCQlTRF9SU1BfODBDTEtfVElNRU9VVF9FTik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKKwkJCQkgICAgIFNEX1JTUF84MENMS19USU1FT1VUX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcGhhc2VfbWFwID0gMDsKIAlmb3IgKGkgPSBNQVhfUEhBU0U7IGkgPj0gMDsgaS0tKSB7CkBAIC0xNzA3LDcgKzE5OTUsOCBAQAogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwogCQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLAogCQkJCQkJU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sIDApOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgKHU4KWksIFRVTkVfVFgpOwpAQCAtMTcyMiwxOCArMjAxMSwyNyBAQAogCQkJcGhhc2VfbWFwIHw9IDEgPDwgaTsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKKwkJCQkgICAgIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiRERSIFRYIHByZSB0dW5lIHBoYXNlX21hcCA9IDB4JTA4eFxuIiwKIAkJcGhhc2VfbWFwKTsKIAogCWZpbmFsX3BoYXNlID0gc2Rfc2VhcmNoX2ZpbmFsX3BoYXNlKGNoaXAsIHBoYXNlX21hcCwgVFVORV9UWCk7Ci0JaWYgKGZpbmFsX3BoYXNlID09IDB4RkYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGZpbmFsX3BoYXNlID09IDB4RkYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBmaW5hbF9waGFzZSwgVFVORV9UWCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiRERSIFRYIHByZSB0dW5lIHBoYXNlOiAlZFxuIiwKIAkJKGludClmaW5hbF9waGFzZSk7CkBAIC0xNzU5LDggKzIwNTcsMTAgQEAKIAl9IGVsc2UgewogCQlpZiAoQ0hLX01NQ19ERFI1MihzZF9jYXJkKSkKIAkJCXR1bmluZ19jbWQgPSBzZF9kZHJfdHVuaW5nX3R4X2NtZDsKLQkJZWxzZQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJZWxzZSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewpAQCAtMTc3MCw3ICsyMDcwLDggQEAKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCk7CiAJCQkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLAogCQkJCQkJICAgIFNEX1JTUF84MENMS19USU1FT1VUX0VOLCAwKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlyZXR2YWwgPSB0dW5pbmdfY21kKGNoaXAsICh1OClqKTsKQEAgLTE3ODcsMTIgKzIwODgsMTYgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiVFggcGhhc2VfbWFwID0gMHglMDh4XG4iLCBwaGFzZV9tYXApOwogCiAJZmluYWxfcGhhc2UgPSBzZF9zZWFyY2hfZmluYWxfcGhhc2UoY2hpcCwgcGhhc2VfbWFwLCBUVU5FX1RYKTsKLQlpZiAoZmluYWxfcGhhc2UgPT0gMHhGRikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoZmluYWxfcGhhc2UgPT0gMHhGRikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsIGZpbmFsX3BoYXNlLCBUVU5FX1RYKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTE4MDIsMTIgKzIxMDcsMTYgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc2RfdHVuaW5nX3R4KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2RfdHVuaW5nX3J4KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMTgxOCwyMyArMjEyNywzMSBAQAogCiAJaWYgKCEoY2hpcC0+c2RfY3RsICYgU0RfRERSX1RYX1BIQVNFX1NFVF9CWV9VU0VSKSkgewogCQlyZXR2YWwgPSBzZF9kZHJfcHJlX3R1bmluZ190eChjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9IGVsc2UgewogCQlyZXR2YWwgPSBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgKHU4KWNoaXAtPnNkX2Rkcl90eF9waGFzZSwKIAkJCQkJVFVORV9UWCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dmFsID0gc2RfdHVuaW5nX3J4KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCEoY2hpcC0+c2RfY3RsICYgU0RfRERSX1RYX1BIQVNFX1NFVF9CWV9VU0VSKSkgewogCQlyZXR2YWwgPSBzZF90dW5pbmdfdHgoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTg0NiwyMyArMjE2MywzMSBAQAogCiAJaWYgKCEoY2hpcC0+c2RfY3RsICYgTU1DX0REUl9UWF9QSEFTRV9TRVRfQllfVVNFUikpIHsKIAkJcmV0dmFsID0gc2RfZGRyX3ByZV90dW5pbmdfdHgoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsICh1OCljaGlwLT5tbWNfZGRyX3R4X3BoYXNlLAogCQkJCQlUVU5FX1RYKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR2YWwgPSBzZF90dW5pbmdfcngoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoIShjaGlwLT5zZF9jdGwgJiBNTUNfRERSX1RYX1BIQVNFX1NFVF9CWV9VU0VSKSkgewogCQlyZXR2YWwgPSBzZF90dW5pbmdfdHgoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTg3NSwxMiArMjIwMCwxNiBAQAogCWludCByZV90dW5pbmcgPSAwOwogCiAJcmV0dmFsID0gc2VsZWN0X2NhcmQoY2hpcCwgU0RfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgc2RfY2FyZC0+c2RfY2xvY2spOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHJlX3R1bmluZykgewogCQlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CkBAIC0xODkzLDggKzIyMjIsMTAgQEAKIAkJCQlyZXR2YWwgPSBtbWNfZGRyX3R1bmluZyhjaGlwKTsKIAkJfQogCi0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTkyNCw0MSArMjI1NSwxMDAgQEAKIAljaGlwLT5zZF9pbyA9IDA7CiAKIAlyZXR2YWwgPSBzZF9zZXRfaW5pdF9wYXJhKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQ0ZHMSwgMHhGRiwgMHg0MCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMSwgMHhGRiwgMHg0MCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfU1RPUCwgU0RfU1RPUCB8IFNEX0NMUl9FUlIsCi0JCVNEX1NUT1AgfCBTRF9DTFJfRVJSKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU1RPUCwgU0RfU1RPUCB8IFNEX0NMUl9FUlIsCisJCQkJICAgICBTRF9TVE9QIHwgU0RfQ0xSX0VSUik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIFNEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCiBzdGF0aWMgaW50IHNkX3B1bGxfY3RsX2Rpc2FibGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKKwlpbnQgcmV0dmFsOworCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLAotCQkJWERfRDNfUEQgfCBTRF9EN19QRCB8IFNEX0NMS19QRCB8IFNEX0Q1X1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsCi0JCQlTRF9ENl9QRCB8IFNEX0QwX1BEIHwgU0RfRDFfUEQgfCBYRF9ENV9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwzLCAweEZGLAotCQkJU0RfRDRfUEQgfCBYRF9DRV9QRCB8IFhEX0NMRV9QRCB8IFhEX0NEX1BVKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsCi0JCQlYRF9SRFlfUEQgfCBTRF9EM19QRCB8IFNEX0QyX1BEIHwgWERfQUxFX1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsCi0JCQlNU19JTlNfUFUgfCBTRF9XUF9QRCB8IFNEX0NEX1BVIHwgU0RfQ01EX1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsIDB4RkYsIE1TX0Q1X1BEIHwgTVNfRDRfUEQpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLAorCQkJCQkgICAgIFhEX0QzX1BEIHwgU0RfRDdfUEQgfCBTRF9DTEtfUEQgfCBTRF9ENV9QRCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsCisJCQkJCSAgICAgU0RfRDZfUEQgfCBTRF9EMF9QRCB8IFNEX0QxX1BEIHwgWERfRDVfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwzLCAweEZGLAorCQkJCQkgICAgIFNEX0Q0X1BEIHwgWERfQ0VfUEQgfCBYRF9DTEVfUEQgfCBYRF9DRF9QVSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsCisJCQkJCSAgICAgWERfUkRZX1BEIHwgU0RfRDNfUEQgfCBTRF9EMl9QRCB8IFhEX0FMRV9QRCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsCisJCQkJCSAgICAgTVNfSU5TX1BVIHwgU0RfV1BfUEQgfCBTRF9DRF9QVSB8IFNEX0NNRF9QRCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsIDB4RkYsCisJCQkJCSAgICAgTVNfRDVfUEQgfCBNU19ENF9QRCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfSBlbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgewogCQlpZiAoQ0hFQ0tfQkFST19QS0coY2hpcCwgUUZOKSkgewotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsIDB4NTUpOwotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsIDB4NTUpOwotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsIDB4RkYsIDB4NEIpOwotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsIDB4NjkpOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMSwKKwkJCQkJCSAgICAgMHhGRiwgMHg1NSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMiwKKwkJCQkJCSAgICAgMHhGRiwgMHg1NSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMywKKwkJCQkJCSAgICAgMHhGRiwgMHg0Qik7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNCwKKwkJCQkJCSAgICAgMHhGRiwgMHg2OSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQl9CiAJfQogCkBAIC0xOTk4LDggKzIzODgsMTAgQEAKIAl9CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFNEX0NBUkQsIDEwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTIwMDksMjkgKzI0MDEsNDEgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc2RfcG93ZXJfb2ZmX2NhcmQzdjMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoIWNoaXAtPmZ0Ml9mYXN0X21vZGUpCiAJCXdhaXRfdGltZW91dCgyNTApOwogCiAJcmV0dmFsID0gZW5hYmxlX2NhcmRfY2xvY2soY2hpcCwgU0RfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCXJldHZhbCA9IHNkX3B1bGxfY3RsX2VuYWJsZShjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9IGVsc2UgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUEdBX1BVTExfQ1RMLCBGUEdBX1NEX1BVTExfQ1RMX0JJVCB8IDB4MjAsCi0JCQkwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUEdBX1BVTExfQ1RMLAorCQkJCQkgICAgIEZQR0FfU0RfUFVMTF9DVExfQklUIHwgMHgyMCwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiAJaWYgKCFjaGlwLT5mdDJfZmFzdF9tb2RlKSB7CiAJCXJldHZhbCA9IGNhcmRfcG93ZXJfb24oY2hpcCwgU0RfQ0FSRCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJd2FpdF90aW1lb3V0KDI2MCk7CiAKQEAgLTIwMzksMjEgKzI0NDMsMzcgQEAKIAkJaWYgKGNoaXAtPm9jcF9zdGF0ICYgKFNEX09DX05PVyB8IFNEX09DX0VWRVIpKSB7CiAJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiT3ZlciBjdXJyZW50LCBPQ1BTVEFUIGlzIDB4JXhcbiIsCiAJCQkJY2hpcC0+b2NwX3N0YXQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KICNlbmRpZgogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfT0UsIFNEX09VVFBVVF9FTiwgU0RfT1VUUFVUX0VOKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIFNEX09VVFBVVF9FTiwKKwkJCQkgICAgIFNEX09VVFBVVF9FTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAogc3RhdGljIGludCBzZF9kdW1teV9jbG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9DRkczLCAweDAxLCAweDAxKTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMywgMHgwMSwgMHgwMSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAl3YWl0X3RpbWVvdXQoNSk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0NGRzMsIDB4MDEsIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzMsIDB4MDEsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0yMDg1LDcgKzI1MDUsOCBAQAogCQk1LCA1MTIsIDEsIGJ1c193aWR0aCwgTlVMTCwgMCwgMTAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0yMTAxLDggKzI1MjIsMTAgQEAKIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwKIAkJCXNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWNtZFswXSA9IDB4NDAgfCBTRF9TVEFUVVM7CiAJY21kWzFdID0gMDsKQEAgLTIxMTcsNyArMjU0MCw4IEBACiAKIAkJc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiQUNNRDEzOlxuIik7CkBAIC0yMTQxLDE0ICsyNTY1LDE1IEBACiBzdGF0aWMgaW50IHJlc2V0X3NkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOwotCWludCByZXR2YWwsIGkgPSAwLCBqID0gMCwgayA9IDAsIGhpX2NhcF9mbG93ID0gMDsKLQlpbnQgc2RfZG9udF9zd2l0Y2ggPSAwOwotCWludCBzdXBwb3J0XzF2OCA9IDA7Ci0JaW50IHRyeV9zZGlvID0gMTsKKwlib29sIGhpX2NhcF9mbG93ID0gZmFsc2U7CisJaW50IHJldHZhbCwgaSA9IDAsIGogPSAwLCBrID0gMDsKKwlib29sIHNkX2RvbnRfc3dpdGNoID0gZmFsc2U7CisJYm9vbCBzdXBwb3J0XzF2OCA9IGZhbHNlOworCWJvb2wgdHJ5X3NkaW8gPSB0cnVlOwogCXU4IHJzcFsxNl07CiAJdTggc3dpdGNoX2J1c193aWR0aDsKIAl1MzIgdm9sdGFnZSA9IDA7Ci0JaW50IHNkMjBfbW9kZSA9IDA7CisJYm9vbCBzZDIwX21vZGUgPSBmYWxzZTsKIAogCVNFVF9TRChzZF9jYXJkKTsKIApAQCAtMjE1Nyw3ICsyNTgyLDcgQEAKIAlpID0gMDsKIAlqID0gMDsKIAlrID0gMDsKLQloaV9jYXBfZmxvdyA9IDA7CisJaGlfY2FwX2Zsb3cgPSBmYWxzZTsKIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCWlmIChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX1VOTE9DS19QT1dfT04pCkBAIC0yMTY1LDEyICsyNTkwLDE2IEBACiAjZW5kaWYKIAogCXJldHZhbCA9IHNkX3ByZXBhcmVfcmVzZXQoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9kdW1teV9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChDSEtfU0RJT19FWElTVChjaGlwKSAmJiAhQ0hLX1NESU9fSUdOT1JFRChjaGlwKSAmJiB0cnlfc2RpbykgewogCQlpbnQgcnR5X2NudCA9IDA7CkBAIC0yMTc4LDcgKzI2MDcsOCBAQAogCQlmb3IgKDsgcnR5X2NudCA8IGNoaXAtPnNkaW9fcmV0cnlfY250OyBydHlfY250KyspIHsKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIElPX1NFTkRfT1BfQ09ORCwgMCwKQEAgLTIxOTAsNyArMjYyMCw4IEBACiAJCQkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTRF9JTyBjYXJkIChGdW5jdGlvbiBudW1iZXI6ICVkKSFcbiIsCiAJCQkJCQlmdW5jX251bSk7CiAJCQkJCWNoaXAtPnNkX2lvID0gMTsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0KIAogCQkJCWJyZWFrOwpAQCAtMjIwOCw4ICsyNjM5LDEwIEBACiBSVFlfU0RfUlNUOgogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgR09fSURMRV9TVEFURSwgMCwgU0RfUlNQX1RZUEVfUjAsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAl3YWl0X3RpbWVvdXQoMjApOwogCkBAIC0yMjE3LDcgKzI2NTAsNyBAQAogCQkJCVNEX1JTUF9UWVBFX1I3LCByc3AsIDUpOwogCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJaWYgKChyc3BbNF0gPT0gMHhBQSkgJiYgKChyc3BbM10gJiAweDBmKSA9PSAweDAxKSkgewotCQkJaGlfY2FwX2Zsb3cgPSAxOworCQkJaGlfY2FwX2Zsb3cgPSB0cnVlOwogCQkJdm9sdGFnZSA9IFNVUFBPUlRfVk9MVEFHRSB8IDB4NDAwMDAwMDA7CiAJCX0KIAl9CkBAIC0yMjI3LDggKzI2NjAsMTAgQEAKIAogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEdPX0lETEVfU1RBVEUsIDAsCiAJCQkJCVNEX1JTUF9UWVBFX1IwLCBOVUxMLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQl3YWl0X3RpbWVvdXQoMjApOwogCX0KQEAgLTIyMzksMTQgKzI2NzQsMTcgQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCWorKzsKIAkJCWlmIChqIDwgMykKIAkJCQlnb3RvIFJUWV9TRF9SU1Q7Ci0JCQllbHNlCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWVsc2UgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRF9BUFBfT1BfQ09ORCwgdm9sdGFnZSwKQEAgLTIyNTUsMTYgKzI2OTMsMjAgQEAKIAkJCWsrKzsKIAkJCWlmIChrIDwgMykKIAkJCQlnb3RvIFJUWV9TRF9SU1Q7Ci0JCQllbHNlCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWVsc2UgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9CiAKIAkJaSsrOwogCQl3YWl0X3RpbWVvdXQoMjApOwogCX0gd2hpbGUgKCEocnNwWzFdICYgMHg4MCkgJiYgKGkgPCAyNTUpKTsKIAotCWlmIChpID09IDI1NSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoaSA9PSAyNTUpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChoaV9jYXBfZmxvdykgewogCQlpZiAocnNwWzFdICYgMHg0MCkKQEAgLTIyNzIsMjkgKzI3MTQsMzUgQEAKIAkJZWxzZQogCQkJQ0xSX1NEX0hDWEMoc2RfY2FyZCk7CiAKLQkJc3VwcG9ydF8xdjggPSAwOworCQlzdXBwb3J0XzF2OCA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCUNMUl9TRF9IQ1hDKHNkX2NhcmQpOwotCQlzdXBwb3J0XzF2OCA9IDA7CisJCXN1cHBvcnRfMXY4ID0gZmFsc2U7CiAJfQogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJzdXBwb3J0XzF2OCA9ICVkXG4iLCBzdXBwb3J0XzF2OCk7CiAKIAlpZiAoc3VwcG9ydF8xdjgpIHsKIAkJcmV0dmFsID0gc2Rfdm9sdGFnZV9zd2l0Y2goY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBTExfU0VORF9DSUQsIDAsIFNEX1JTUF9UWVBFX1IyLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfUkVMQVRJVkVfQUREUiwgMCwKIAkJCQkJU0RfUlNQX1RZUEVfUjYsIHJzcCwgNSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJc2RfY2FyZC0+c2RfYWRkciA9ICh1MzIpcnNwWzFdIDw8IDI0OwogCQlzZF9jYXJkLT5zZF9hZGRyICs9ICh1MzIpcnNwWzJdIDw8IDE2OwpAQCAtMjMwNCwxOCArMjc1MiwyNCBAQAogCX0KIAogCXJldHZhbCA9IHNkX2NoZWNrX2NzZChjaGlwLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX3NlbGVjdF9jYXJkKGNoaXAsIDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiBTRF9VTkxPQ0tfRU5UUlk6CiAJcmV0dmFsID0gc2RfdXBkYXRlX2xvY2tfc3RhdHVzKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfTE9DS0VEKSB7CiAJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzIHw9IChTRF9MT0NLXzFCSVRfTU9ERSB8IFNEX1BXRF9FWElTVCk7CkBAIC0yMzI3LDI0ICsyNzgxLDMyIEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsCiAJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQ0xSX0NBUkRfREVURUNULCAwLAogCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChzdXBwb3J0XzF2OCkgewogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsCiAJCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CVVNfV0lEVEgsIDIsCiAJCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlzd2l0Y2hfYnVzX3dpZHRoID0gU0RfQlVTX1dJRFRIXzQ7CiAJfSBlbHNlIHsKQEAgLTIzNTMsMTUgKzI4MTUsMTkgQEAKIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JMT0NLTEVOLCAweDIwMCwgU0RfUlNQX1RZUEVfUjEsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9zZXRfY2xvY2tfZGl2aWRlcihjaGlwLCBTRF9DTEtfRElWSURFXzApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCEoc2RfY2FyZC0+cmF3X2NzZFs0XSAmIDB4NDApKQotCQlzZF9kb250X3N3aXRjaCA9IDE7CisJCXNkX2RvbnRfc3dpdGNoID0gdHJ1ZTsKIAogCWlmICghc2RfZG9udF9zd2l0Y2gpIHsKIAkJaWYgKHNkMjBfbW9kZSkgewpAQCAtMjM3OCwxNiArMjg0NCwxNiBAQAogCQkJcmV0dmFsID0gc2Rfc3dpdGNoX2Z1bmN0aW9uKGNoaXAsIHN3aXRjaF9idXNfd2lkdGgpOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJc2RfZG9udF9zd2l0Y2ggPSAxOwotCQkJCXRyeV9zZGlvID0gMDsKKwkJCQlzZF9kb250X3N3aXRjaCA9IHRydWU7CisJCQkJdHJ5X3NkaW8gPSBmYWxzZTsKIAogCQkJCWdvdG8gU3dpdGNoX0ZhaWw7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoc3VwcG9ydF8xdjgpIHsKIAkJCQlzZF9pbml0X3Bvd2VyKGNoaXApOwotCQkJCXNkX2RvbnRfc3dpdGNoID0gMTsKLQkJCQl0cnlfc2RpbyA9IDA7CisJCQkJc2RfZG9udF9zd2l0Y2ggPSB0cnVlOworCQkJCXRyeV9zZGlvID0gZmFsc2U7CiAKIAkJCQlnb3RvIFN3aXRjaF9GYWlsOwogCQkJfQpAQCAtMjM5NywxMyArMjg2MywxNyBAQAogCWlmICghc3VwcG9ydF8xdjgpIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQlVTX1dJRFRILCAyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCkBAIC0yNDEzLDEyICsyODgzLDE4IEBACiAJaWYgKCFzZDIwX21vZGUgJiYgQ0hLX1NEMzBfU1BFRUQoc2RfY2FyZCkpIHsKIAkJaW50IHJlYWRfbGJhMCA9IDE7CiAKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0QzMF9EUklWRV9TRUwsIDB4MDcsCi0JCQljaGlwLT5zZDMwX2RyaXZlX3NlbF8xdjgpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEMzBfRFJJVkVfU0VMLCAweDA3LAorCQkJCQkgICAgIGNoaXAtPnNkMzBfZHJpdmVfc2VsXzF2OCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJcmV0dmFsID0gc2Rfc2V0X2luaXRfcGFyYShjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQogCQkJcmV0dmFsID0gc2RfZGRyX3R1bmluZyhjaGlwKTsKQEAgLTI0MjcsMTQgKzI5MDMsMTcgQEAKIAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlpZiAoc2QyMF9tb2RlKSB7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dmFsID0gc2RfaW5pdF9wb3dlcihjaGlwKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAotCQkJCXRyeV9zZGlvID0gMDsKLQkJCQlzZDIwX21vZGUgPSAxOworCQkJCXRyeV9zZGlvID0gZmFsc2U7CisJCQkJc2QyMF9tb2RlID0gdHJ1ZTsKIAkJCQlnb3RvIFN3aXRjaF9GYWlsOwogCQkJfQogCQl9CkBAIC0yNDUyLDE0ICsyOTMxLDE3IEBACiAJCQlyZXR2YWwgPSBzZF9yZWFkX2xiYTAoY2hpcCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJaWYgKHNkMjBfbW9kZSkgewotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQkJfSBlbHNlIHsKIAkJCQkJcmV0dmFsID0gc2RfaW5pdF9wb3dlcihjaGlwKTsKLQkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJCX0KIAotCQkJCQl0cnlfc2RpbyA9IDA7Ci0JCQkJCXNkMjBfbW9kZSA9IDE7CisJCQkJCXRyeV9zZGlvID0gZmFsc2U7CisJCQkJCXNkMjBfbW9kZSA9IHRydWU7CiAJCQkJCWdvdG8gU3dpdGNoX0ZhaWw7CiAJCQkJfQogCQkJfQpAQCAtMjQ2NywxNSArMjk0OSwyNyBAQAogCX0KIAogCXJldHZhbCA9IHNkX2NoZWNrX3dwX3N0YXRlKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY2hpcC0+Y2FyZF9idXNfd2lkdGhbY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF1dID0gNDsKIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCWlmIChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX1VOTE9DS19QT1dfT04pIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0JMT0NLX0NOVF9ILCAweEZGLCAweDAyKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0JMT0NLX0NOVF9MLCAweEZGLCAweDAwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQkxPQ0tfQ05UX0gsIDB4RkYsCisJCQkJCSAgICAgMHgwMik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0JMT0NLX0NOVF9MLCAweEZGLAorCQkJCQkgICAgIDB4MDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KICNlbmRpZgogCkBAIC0yNDkzLDggKzI5ODcsMTAgQEAKIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQlVTVEVTVF9XLCAwLCBTRF9SU1BfVFlQRV9SMSwgTlVMTCwKIAkJCQkwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1dJVENIX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNXSVRDSF9GQUlMOworCX0KIAogCWlmICh3aWR0aCA9PSBNTUNfOEJJVF9CVVMpIHsKIAkJYnVmWzBdID0gMHg1NTsKQEAgLTI1MTAsMjAgKzMwMDYsMjUgQEAKIAl9CiAKIAlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkczLCAweDAyLCAweDAyKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1dJVENIX0VSUik7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1dJVENIX0VSUjsKKwl9CiAKIAlyZXR2YWwgPSBzZF93cml0ZV9kYXRhKGNoaXAsIFNEX1RNX0FVVE9fV1JJVEVfMywKIAkJCU5VTEwsIDAsIGJ5dGVfY250LCAxLCBidXNfd2lkdGgsIGJ1ZiwgbGVuLCAxMDApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMywgMHgwMiwgMCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTV0lUQ0hfRVJSKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNXSVRDSF9FUlI7CiAJfQogCiAJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMywgMHgwMiwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNXSVRDSF9FUlIpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNXSVRDSF9FUlI7CisJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlNEL01NQyBDTUQgJWRcbiIsIEJVU1RFU1RfUik7CiAKQEAgLTI1NTgsNyArMzA1OSw4IEBACiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBTRF9DQVJELCAxMDApOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTV0lUQ0hfRVJSKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNXSVRDSF9FUlI7CiAJfQogCiAJcHRyID0gcnRzeF9nZXRfY21kX2RhdGEoY2hpcCkgKyAxOwpAQCAtMjYwMCwxMSArMzEwMiwxMiBAQAogCQl9CiAJfQogCi0JVFJBQ0VfUkVUKGNoaXAsIFNXSVRDSF9GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTV0lUQ0hfRkFJTDsKIH0KIAogCi1zdGF0aWMgaW50IG1tY19zd2l0Y2hfdGltaW5nX2J1cyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgc3dpdGNoX2RkcikKK3N0YXRpYyBpbnQgbW1jX3N3aXRjaF90aW1pbmdfYnVzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGJvb2wgc3dpdGNoX2RkcikKIHsKIAlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CiAJaW50IHJldHZhbDsKQEAgLTI2NTEsMTQgKzMxNTQsMTYgQEAKIAkJCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCiAJCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKIAkJfQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcHRyID0gcnRzeF9nZXRfY21kX2RhdGEoY2hpcCk7CiAJaWYgKHB0clswXSAmIFNEX1RSQU5TRkVSX0VSUikgewogCQlzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChDSEtfTU1DX1NFQ1RPUl9NT0RFKHNkX2NhcmQpKSB7CkBAIC0yNjkwLDggKzMxOTUsMTAgQEAKIAogCXNkX2Nob29zZV9wcm9wZXJfY2xvY2soY2hpcCk7CiAJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIHNkX2NhcmQtPnNkX2Nsb2NrKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCS8qIFRlc3QgQnVzIFByb2NlZHVyZSAqLwogCXJldHZhbCA9IG1tY190ZXN0X3N3aXRjaF9idXMoY2hpcCwgTU1DXzhCSVRfQlVTKTsKQEAgLTI3MTMsMTAgKzMyMjAsMTIgQEAKIAkJCUNMUl9NTUNfOEJJVChzZF9jYXJkKTsKIAkJCUNMUl9NTUNfNEJJVChzZF9jYXJkKTsKIAkJfSBlbHNlIHsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfSBlbHNlIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTI3MjcsNyArMzIzNiw3IEBACiB7CiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOwogCWludCByZXR2YWwsIGkgPSAwLCBqID0gMCwgayA9IDA7Ci0JaW50IHN3aXRjaF9kZHIgPSAxOworCWJvb2wgc3dpdGNoX2RkciA9IHRydWU7CiAJdTggcnNwWzE2XTsKIAl1OCBzcGVjX3ZlciA9IDA7CiAJdTMyIHRlbXA7CkBAIC0yNzM5LDIxICszMjQ4LDI2IEBACiAKIFN3aXRjaF9GYWlsOgogCXJldHZhbCA9IHNkX3ByZXBhcmVfcmVzZXQoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCVNFVF9NTUMoc2RfY2FyZCk7CiAKIFJUWV9NTUNfUlNUOgogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgR09fSURMRV9TVEFURSwgMCwgU0RfUlNQX1RZUEVfUjAsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlkbyB7CiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfT1BfQ09ORCwKQEAgLTI3NjcsNyArMzI4MSw4IEBACiAJCQkJCXNkX2Nscl9lcnJfY29kZShjaGlwKTsKIAkJCQkJZ290byBSVFlfTU1DX1JTVDsKIAkJCQl9IGVsc2UgewotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlqKys7CkBAIC0yNzc1LDcgKzMyOTAsOCBAQAogCQkJCQlzZF9jbHJfZXJyX2NvZGUoY2hpcCk7CiAJCQkJCWdvdG8gUlRZX01NQ19SU1Q7CiAJCQkJfSBlbHNlIHsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjc4NCw4ICszMzAwLDEwIEBACiAJCWkrKzsKIAl9IHdoaWxlICghKHJzcFsxXSAmIDB4ODApICYmIChpIDwgMjU1KSk7CiAKLQlpZiAoaSA9PSAyNTUpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gMjU1KSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoKHJzcFsxXSAmIDB4NjApID09IDB4NDApCiAJCVNFVF9NTUNfU0VDVE9SX01PREUoc2RfY2FyZCk7CkBAIC0yNzk0LDQwICszMzEyLDU0IEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFMTF9TRU5EX0NJRCwgMCwgU0RfUlNQX1RZUEVfUjIsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlzZF9jYXJkLT5zZF9hZGRyID0gMHgwMDEwMDAwMDsKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9SRUxBVElWRV9BRERSLCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCVNEX1JTUF9UWVBFX1I2LCByc3AsIDUpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2RfY2hlY2tfY3NkKGNoaXAsIDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJc3BlY192ZXIgPSAoc2RfY2FyZC0+cmF3X2NzZFswXSAmIDB4M0MpID4+IDI7CiAKIAlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JMT0NLTEVOLCAweDIwMCwgU0RfUlNQX1RZUEVfUjEsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIE1NQ19VTkxPQ0tfRU5UUlk6CiAJcmV0dmFsID0gc2RfdXBkYXRlX2xvY2tfc3RhdHVzKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogI2VuZGlmCiAKIAlyZXR2YWwgPSBzZF9zZXRfY2xvY2tfZGl2aWRlcihjaGlwLCBTRF9DTEtfRElWSURFXzApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY2hpcC0+Y2FyZF9idXNfd2lkdGhbY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF1dID0gMTsKIApAQCAtMjgzNywyOSArMzM2OSwzOSBAQAogCQkJcmV0dmFsID0gbW1jX3N3aXRjaF90aW1pbmdfYnVzKGNoaXAsIHN3aXRjaF9kZHIpOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAJCQkJc2RfY2FyZC0+bW1jX2RvbnRfc3dpdGNoX2J1cyA9IDE7Ci0JCQkJVFJBQ0VfR09UTyhjaGlwLCBTd2l0Y2hfRmFpbCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlnb3RvIFN3aXRjaF9GYWlsOwogCQkJfQogCQl9CiAKLQkJaWYgKENIS19NTUNfU0VDVE9SX01PREUoc2RfY2FyZCkgJiYgKHNkX2NhcmQtPmNhcGFjaXR5ID09IDApKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKENIS19NTUNfU0VDVE9SX01PREUoc2RfY2FyZCkgJiYgKHNkX2NhcmQtPmNhcGFjaXR5ID09IDApKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKHN3aXRjaF9kZHIgJiYgQ0hLX01NQ19ERFI1MihzZF9jYXJkKSkgewogCQkJcmV0dmFsID0gc2Rfc2V0X2luaXRfcGFyYShjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJcmV0dmFsID0gbW1jX2Rkcl90dW5pbmcoY2hpcCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJcmV0dmFsID0gc2RfaW5pdF9wb3dlcihjaGlwKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAotCQkJCXN3aXRjaF9kZHIgPSAwOwotCQkJCVRSQUNFX0dPVE8oY2hpcCwgU3dpdGNoX0ZhaWwpOworCQkJCXN3aXRjaF9kZHIgPSBmYWxzZTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCWdvdG8gU3dpdGNoX0ZhaWw7CiAJCQl9CiAKIAkJCXJldHZhbCA9IHNkX3dhaXRfc3RhdGVfZGF0YV9yZWFkeShjaGlwLCAweDA4LCAxLCAxMDAwKTsKQEAgLTI4NjcsMTEgKzM0MDksMTQgQEAKIAkJCQlyZXR2YWwgPSBzZF9yZWFkX2xiYTAoY2hpcCk7CiAJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCQlyZXR2YWwgPSBzZF9pbml0X3Bvd2VyKGNoaXApOwotCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQkJfQogCi0JCQkJCXN3aXRjaF9kZHIgPSAwOwotCQkJCQlUUkFDRV9HT1RPKGNoaXAsIFN3aXRjaF9GYWlsKTsKKwkJCQkJc3dpdGNoX2RkciA9IGZhbHNlOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlnb3RvIFN3aXRjaF9GYWlsOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjg3OSw4ICszNDI0LDE4IEBACiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9VTkxPQ0tfUE9XX09OKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9CTE9DS19DTlRfSCwgMHhGRiwgMHgwMik7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9CTE9DS19DTlRfTCwgMHhGRiwgMHgwMCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0JMT0NLX0NOVF9ILCAweEZGLAorCQkJCQkgICAgIDB4MDIpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9CTE9DS19DTlRfTCwgMHhGRiwKKwkJCQkJICAgICAweDAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAjZW5kaWYKIApAQCAtMjkwMiw3MSArMzQ1NywxMDMgQEAKIAljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSAwOwogCiAJcmV0dmFsID0gZW5hYmxlX2NhcmRfY2xvY2soY2hpcCwgU0RfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoY2hpcC0+aWdub3JlX3NkICYmIENIS19TRElPX0VYSVNUKGNoaXApICYmCiAJCSFDSEtfU0RJT19JR05PUkVEKGNoaXApKSB7CiAJCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKIAkJCXJldHZhbCA9IHNkX3B1bGxfY3RsX2VuYWJsZShjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBHQV9QVUxMX0NUTCwKIAkJCQkJCUZQR0FfU0RfUFVMTF9DVExfQklUIHwgMHgyMCwgMCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0KIAkJcmV0dmFsID0gY2FyZF9zaGFyZV9tb2RlKGNoaXAsIFNEX0NBUkQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWNoaXAtPnNkX2lvID0gMTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoY2hpcC0+c2RfY3RsICYgUkVTRVRfTU1DX0ZJUlNUKSB7CiAJCXJldHZhbCA9IHJlc2V0X21tYyhjaGlwKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJaWYgKHNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAoc2RfY2hlY2tfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCkpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJcmV0dmFsID0gcmVzZXRfc2QoY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlyZXR2YWwgPSByZXNldF9zZChjaGlwKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJaWYgKHNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAoc2RfY2hlY2tfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCkpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJaWYgKGNoaXAtPnNkX2lvKSB7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dmFsID0gcmVzZXRfbW1jKGNoaXApOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCQkJfQogCQl9CiAJfQogCiAJcmV0dmFsID0gc2Rfc2V0X2Nsb2NrX2RpdmlkZXIoY2hpcCwgU0RfQ0xLX0RJVklERV8wKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9CWVRFX0NOVF9MLCAweEZGLCAwKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQllURV9DTlRfSCwgMHhGRiwgMik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQllURV9DTlRfTCwgMHhGRiwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9CWVRFX0NOVF9ILCAweEZGLCAyKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJY2hpcC0+Y2FwYWNpdHlbY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF1dID0gc2RfY2FyZC0+Y2FwYWNpdHk7CiAKIAlyZXR2YWwgPSBzZF9zZXRfaW5pdF9wYXJhKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgInNkX2NhcmQtPnNkX3R5cGUgPSAweCV4XG4iLCBzZF9jYXJkLT5zZF90eXBlKTsKIApAQCAtMjk5MiwyOSArMzU3OSw0NyBAQAogCWNoaXAtPmNhcGFjaXR5W2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IHNkX2NhcmQtPmNhcGFjaXR5ID0gMDsKIAogCXJldHZhbCA9IGVuYWJsZV9jYXJkX2Nsb2NrKGNoaXAsIFNEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2RfaW5pdF9wb3dlcihjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHJlc2V0X21tYyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX3NldF9jbG9ja19kaXZpZGVyKGNoaXAsIFNEX0NMS19ESVZJREVfMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQllURV9DTlRfTCwgMHhGRiwgMCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0JZVEVfQ05UX0gsIDB4RkYsIDIpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0JZVEVfQ05UX0wsIDB4RkYsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQllURV9DTlRfSCwgMHhGRiwgMik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWNoaXAtPmNhcGFjaXR5W2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IHNkX2NhcmQtPmNhcGFjaXR5OwogCiAJcmV0dmFsID0gc2Rfc2V0X2luaXRfcGFyYShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJJbiByZXNldF9tbWNfb25seSwgc2RfY2FyZC0+c2RfdHlwZSA9IDB4JXhcbiIsCiAJCXNkX2NhcmQtPnNkX3R5cGUpOwpAQCAtMzAzMiwxNSArMzYzNywxOCBAQAogCWZvciAoaSA9IDA7IGkgPCBXQUlUX0RBVEFfUkVBRFlfUlRZX0NOVDsgaSsrKSB7CiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlzZF9jYXJkLT5zZF9kYXRhX2J1Zl9yZWFkeSA9IDA7CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywKIAkJCQlzZF9jYXJkLT5zZF9hZGRyLCBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKHNkX2NhcmQtPnNkX2RhdGFfYnVmX3JlYWR5KSB7CiAJCQlyZXR1cm4gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywKQEAgLTMwNTAsNyArMzY1OCw4IEBACiAKIAlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKTsKIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKIHZvaWQgc2Rfc3RvcF9zZXFfbW9kZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQpAQCAtMzExOCw4ICszNzI3LDEwIEBACiAJfQogCiAJcmV0dmFsID0gc2Rfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMzE1Niw3ICszNzY3LDggQEAKIAkJCWNoaXAtPmNhcmRfZmFpbCB8PSBTRF9DQVJEOwogCQkJY2hpcC0+Y2FwYWNpdHlbY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF1dID0gMDsKIAkJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAxOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTMxNzAsNyArMzc4Miw4IEBACiAJcmV0dmFsID0gc2Rfc3dpdGNoX2Nsb2NrKGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0lPX0VSUik7Ci0JCVRSQUNFX0dPVE8oY2hpcCwgUldfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gUldfRkFJTDsKIAl9CiAKIAlpZiAoc2RfY2FyZC0+c2VxX21vZGUgJiYKQEAgLTMxOTEsNyArMzgwNCw4IEBACiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAxOwogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1NUU19FUlIpOwotCQkJVFJBQ0VfR09UTyhjaGlwLCBSV19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFJXX0ZBSUw7CiAJCX0KIAogCQlzZF9jYXJkLT5zZXFfbW9kZSA9IDA7CkBAIC0zMTk5LDcgKzM4MTMsOCBAQAogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJCQ1RMLCBSQl9GTFVTSCwgUkJfRkxVU0gpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfSU9fRVJSKTsKLQkJCVRSQUNFX0dPVE8oY2hpcCwgUldfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBSV19GQUlMOwogCQl9CiAKIAkJaWYgKChzZF9jYXJkLT5wcmVfc2VjX2NudCA8IDB4ODApCkBAIC0zMjkwLDIxICszOTA1LDI0IEBACiAKIAkJCQljaGlwLT5yd19uZWVkX3JldHJ5ID0gMTsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKTsKLQkJCQlUUkFDRV9HT1RPKGNoaXAsIFJXX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJZ290byBSV19GQUlMOwogCQkJfQogCiAJCQlyZXR2YWwgPSB3YWl0X2RhdGFfYnVmX3JlYWR5KGNoaXApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAxOwogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9UT19FUlIpOwotCQkJCVRSQUNFX0dPVE8oY2hpcCwgUldfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlnb3RvIFJXX0ZBSUw7CiAJCQl9CiAKIAkJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgV1JJVEVfTVVMVElQTEVfQkxPQ0ssCiAJCQkJCWRhdGFfYWRkciwgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAxOwotCQkJCVRSQUNFX0dPVE8oY2hpcCwgUldfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlnb3RvIFJXX0ZBSUw7CiAJCQl9CiAKIAkJCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CkBAIC0zMzQ4LDcgKzM5NjYsOCBAQAogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAwOwogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk5vIGNhcmQgZXhpc3QsIGV4aXQgc2RfcndcbiIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQljaGlwLT5yd19uZWVkX3JldHJ5ID0gMTsKQEAgLTMzNTcsMjEgKzM5NzYsMjUgQEAKIAkJCQkJU0RfUlNQX1RZUEVfUjFiLCBOVUxMLCAwKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1NUU19FUlIpOwotCQkJVFJBQ0VfR09UTyhjaGlwLCBSV19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFJXX0ZBSUw7CiAJCX0KIAogCQlpZiAoc3RhdCAmIChTRF9DUkM3X0VSUiB8IFNEX0NSQzE2X0VSUiB8IFNEX0NSQ19XUklURV9FUlIpKSB7CiAJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU0QgQ1JDIGVycm9yLCB0dW5lIGNsb2NrIVxuIik7CiAJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfQ1JDX0VSUik7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIFJXX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gUldfRkFJTDsKIAkJfQogCiAJCWlmIChlcnIgPT0gU1RBVFVTX1RJTUVET1VUKSB7CiAJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKTsKLQkJCVRSQUNFX0dPVE8oY2hpcCwgUldfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBSV19GQUlMOwogCQl9CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIGVycik7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBlcnI7CiAJfQogCiAJc2RfY2FyZC0+cHJlX3NlY19hZGRyID0gc3RhcnRfc2VjdG9yOwpAQCAtMzM4Niw3ICs0MDA5LDggQEAKIAlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJY2hpcC0+cndfbmVlZF9yZXRyeSA9IDA7CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJObyBjYXJkIGV4aXN0LCBleGl0IHNkX3J3XG4iKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9DUkNfRVJSKSkgewpAQCAtMzQwNyw3ICs0MDMxLDggQEAKIAkJfQogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKICNpZmRlZiBTVVBQT1JUX0NQUk0KQEAgLTM0MTcsNyArNDA0Miw3IEBACiB9CiAKIGludCBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjbWRfaWR4LAotCQl1MzIgYXJnLCB1OCByc3BfdHlwZSwgdTggKnJzcCwgaW50IHJzcF9sZW4sIGludCBzcGVjaWFsX2NoZWNrKQorCQl1MzIgYXJnLCB1OCByc3BfdHlwZSwgdTggKnJzcCwgaW50IHJzcF9sZW4sIGJvb2wgc3BlY2lhbF9jaGVjaykKIHsKIAlpbnQgcmV0dmFsOwogCWludCB0aW1lb3V0ID0gMTAwOwpAQCAtMzQ3MywxMyArNDA5OCwxNiBAQAogCiAJCQlpZiAocnNwX3R5cGUgJiBTRF9XQUlUX0JVU1lfRU5EKSB7CiAJCQkJcmV0dmFsID0gc2RfY2hlY2tfZGF0YTBfc3RhdHVzKGNoaXApOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9UT19FUlIpOwogCQkJfQogCQl9Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjApCkBAIC0zNDg5LDE0ICs0MTE3LDE2IEBACiAKIAlpZiAoKHB0clswXSAmIDB4QzApICE9IDApIHsKIAkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1NUU19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKCEocnNwX3R5cGUgJiBTRF9OT19DSEVDS19DUkM3KSkgewogCQlpZiAocHRyW3N0YXRfaWR4XSAmIFNEX0NSQzdfRVJSKSB7CiAJCQlpZiAoY21kX2lkeCA9PSBXUklURV9NVUxUSVBMRV9CTE9DSykgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9DUkNfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKHJ0eV9jbnQgPCBTRF9NQVhfUkVUUllfQ09VTlQpIHsKIAkJCQl3YWl0X3RpbWVvdXQoMjApOwpAQCAtMzUwNCwxNiArNDEzNCwxOSBAQAogCQkJCWdvdG8gUlRZX1NFTkRfQ01EOwogCQkJfSBlbHNlIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfQ1JDX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCX0KIAogCWlmICgoY21kX2lkeCA9PSBTRUxFQ1RfQ0FSRCkgfHwgKGNtZF9pZHggPT0gQVBQX0NNRCkgfHwKIAkJKGNtZF9pZHggPT0gU0VORF9TVEFUVVMpIHx8IChjbWRfaWR4ID09IFNUT1BfVFJBTlNNSVNTSU9OKSkgewotCQlpZiAoKGNtZF9pZHggIT0gU1RPUF9UUkFOU01JU1NJT04pICYmIChzcGVjaWFsX2NoZWNrID09IDApKSB7Ci0JCQlpZiAocHRyWzFdICYgMHg4MCkKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAoKGNtZF9pZHggIT0gU1RPUF9UUkFOU01JU1NJT04pICYmICFzcGVjaWFsX2NoZWNrKSB7CisJCQlpZiAocHRyWzFdICYgMHg4MCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9CiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJCWlmIChwdHJbMV0gJiAweDdEKQpAQCAtMzUyMSwxOSArNDE1NCwyNiBAQAogCQlpZiAocHRyWzFdICYgMHg3RikKICNlbmRpZgogCQl7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQotCQlpZiAocHRyWzJdICYgMHhGOCkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChwdHJbMl0gJiAweEY4KSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKGNtZF9pZHggPT0gU0VMRUNUX0NBUkQpIHsKIAkJCWlmIChyc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMikgewotCQkJCWlmICgocHRyWzNdICYgMHgxRSkgIT0gMHgwNCkKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAoKHB0clszXSAmIDB4MUUpICE9IDB4MDQpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAogCQkJfSBlbHNlIGlmIChyc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMCkgewotCQkJCWlmICgocHRyWzNdICYgMHgxRSkgIT0gMHgwMykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAoKHB0clszXSAmIDB4MUUpICE9IDB4MDMpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAkJCX0KIAkJfQogCX0KQEAgLTM1NzAsOCArNDIxMCwxMCBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFJFR19TRF9DTUQ1LCAweEZGLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgU0RfQ0FSRCwgMTAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChyc3ApIHsKIAkJaW50IG1pbl9sZW4gPSAocnNwX2xlbiA8IGxlbikgPyByc3BfbGVuIDogbGVuOwpAQCAtMzYxNyw3ICs0MjU5LDggQEAKIAlpZiAoIShDSEtfQklUKGNoaXAtPmx1bl9tYywgbHVuKSkpIHsKIAkJU0VUX0JJVChjaGlwLT5sdW5fbWMsIGx1bik7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICgoMHg1MyAhPSBzcmItPmNtbmRbMl0pIHx8ICgweDQ0ICE9IHNyYi0+Y21uZFszXSkgfHwKQEAgLTM2MjUsNyArNDI2OCw4IEBACiAJCSgweDYxICE9IHNyYi0+Y21uZFs2XSkgfHwgKDB4NzIgIT0gc3JiLT5jbW5kWzddKSB8fAogCQkoMHg2NCAhPSBzcmItPmNtbmRbOF0pKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJc3dpdGNoIChzcmItPmNtbmRbMV0gJiAweDBGKSB7CkBAIC0zNjM5LDcgKzQyODMsOCBAQAogCiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlidWZbNV0gPSAoMSA9PSBDSEtfU0Qoc2RfY2FyZCkpID8gIDB4MDEgOiAweDAyOwpAQCAtMzcwMiwzMCArNDM0NywzNCBAQAogCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwogCWludCByZXR2YWwsIHJzcF9sZW47CiAJdTggY21kX2lkeCwgcnNwX3R5cGU7Ci0JdTggc3RhbmRieSA9IDAsIGFjbWQgPSAwOworCWJvb2wgc3RhbmRieSA9IGZhbHNlLCBhY21kID0gZmFsc2U7CiAJdTMyIGFyZzsKIAogCWlmICghc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcmV0dmFsID0gc2Rfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KIAogCWlmIChzZF9jYXJkLT5wcmVfY21kX2VycikgewogCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDA7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWNtZF9pZHggPSBzcmItPmNtbmRbMl0gJiAweDNGOwogCWlmIChzcmItPmNtbmRbMV0gJiAweDAyKQotCQlzdGFuZGJ5ID0gMTsKKwkJc3RhbmRieSA9IHRydWU7CiAKIAlpZiAoc3JiLT5jbW5kWzFdICYgMHgwMSkKLQkJYWNtZCA9IDE7CisJCWFjbWQgPSB0cnVlOwogCiAJYXJnID0gKCh1MzIpc3JiLT5jbW5kWzNdIDw8IDI0KSB8ICgodTMyKXNyYi0+Y21uZFs0XSA8PCAxNikgfAogCQkoKHUzMilzcmItPmNtbmRbNV0gPDwgOCkgfCBzcmItPmNtbmRbNl07CkBAIC0zNzMzLDY0ICs0MzgyLDgzIEBACiAJcmV0dmFsID0gZ2V0X3JzcF90eXBlKHNyYiwgJnJzcF90eXBlLCAmcnNwX2xlbik7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAlzZF9jYXJkLT5sYXN0X3JzcF90eXBlID0gcnNwX3R5cGU7CiAKIAlyZXR2YWwgPSBzZF9zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJaWYgKChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX0xPQ0tfMUJJVF9NT0RFKSA9PSAwKSB7CiAJCWlmIChDSEtfTU1DXzhCSVQoc2RfY2FyZCkpIHsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4MDMsCiAJCQkJCQlTRF9CVVNfV0lEVEhfOCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCiAJCX0gZWxzZSBpZiAoQ0hLX1NEKHNkX2NhcmQpIHx8IENIS19NTUNfNEJJVChzZF9jYXJkKSkgewogCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMSwgMHgwMywKIAkJCQkJCVNEX0JVU19XSURUSF80KTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCQl9CiAJCX0KIAl9CiAjZWxzZQogCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4MDMsIFNEX0JVU19XSURUSF80KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CiAjZW5kaWYKIAogCWlmIChzdGFuZGJ5KSB7CiAJCXJldHZhbCA9IHNkX3NlbGVjdF9jYXJkKGNoaXAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoYWNtZCkgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELAogCQkJCQkJc2RfY2FyZC0+c2RfYWRkciwKLQkJCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9DbWRfRmFpbGVkKTsKKwkJCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCBmYWxzZSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIGNtZF9pZHgsIGFyZywgcnNwX3R5cGUsCi0JCQlzZF9jYXJkLT5yc3AsIHJzcF9sZW4sIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9DbWRfRmFpbGVkKTsKKwkJCXNkX2NhcmQtPnJzcCwgcnNwX2xlbiwgZmFsc2UpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBTRF9FeGVjdXRlX0NtZF9GYWlsZWQ7CisJfQogCiAJaWYgKHN0YW5kYnkpIHsKIAkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCXJldHZhbCA9IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZDsKKwl9CiAjZW5kaWYKIAogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CkBAIC0zODA0LDcgKzQ0NzIsOCBAQAogCWlmICghKGNoaXAtPmNhcmRfcmVhZHkgJiBTRF9DQVJEKSkKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKIAotCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogfQogCiBpbnQgc2RfZXhlY3V0ZV9yZWFkX2RhdGEoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQpAQCAtMzgxMiwzNSArNDQ4MSwzOSBAQAogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKIAlpbnQgcmV0dmFsLCByc3BfbGVuLCBpOwotCWludCBjbWQxM19jaGVja2JpdCA9IDAsIHJlYWRfZXJyID0gMDsKKwlib29sIHJlYWRfZXJyID0gZmFsc2UsIGNtZDEzX2NoZWNrYml0ID0gZmFsc2U7CiAJdTggY21kX2lkeCwgcnNwX3R5cGUsIGJ1c193aWR0aDsKLQl1OCBzZW5kX2NtZDEyID0gMCwgc3RhbmRieSA9IDAsIGFjbWQgPSAwOworCWJvb2wgc3RhbmRieSA9IGZhbHNlLCBzZW5kX2NtZDEyID0gZmFsc2UsIGFjbWQgPSBmYWxzZTsKIAl1MzIgZGF0YV9sZW47CiAKIAlpZiAoIXNkX2NhcmQtPnNkX3Bhc3NfdGhydV9lbikgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChzZF9jYXJkLT5wcmVfY21kX2VycikgewogCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDA7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CiAKIAljbWRfaWR4ID0gc3JiLT5jbW5kWzJdICYgMHgzRjsKIAlpZiAoc3JiLT5jbW5kWzFdICYgMHgwNCkKLQkJc2VuZF9jbWQxMiA9IDE7CisJCXNlbmRfY21kMTIgPSB0cnVlOwogCiAJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDIpCi0JCXN0YW5kYnkgPSAxOworCQlzdGFuZGJ5ID0gdHJ1ZTsKIAogCWlmIChzcmItPmNtbmRbMV0gJiAweDAxKQotCQlhY21kID0gMTsKKwkJYWNtZCA9IHRydWU7CiAKIAlkYXRhX2xlbiA9ICgodTMyKXNyYi0+Y21uZFs3XSA8PCAxNikgfCAoKHUzMilzcmItPmNtbmRbOF0KIAkJCQkJCTw8IDgpIHwgc3JiLT5jbW5kWzldOwpAQCAtMzg0OCwxMyArNDUyMSwxNiBAQAogCXJldHZhbCA9IGdldF9yc3BfdHlwZShzcmIsICZyc3BfdHlwZSwgJnJzcF9sZW4pOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJc2RfY2FyZC0+bGFzdF9yc3BfdHlwZSA9IHJzcF90eXBlOwogCiAJcmV0dmFsID0gc2Rfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLXzFCSVRfTU9ERSkgPT0gMCkgewpAQCAtMzg3NCwyMyArNDU1MCwyOSBAQAogCiAJaWYgKGRhdGFfbGVuIDwgNTEyKSB7CiAJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CTE9DS0xFTiwgZGF0YV9sZW4sCi0JCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIGZhbHNlKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoc3RhbmRieSkgewogCQlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCWlmIChhY21kKSB7CiAJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsCiAJCQkJCQlzZF9jYXJkLT5zZF9hZGRyLAotCQkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgZmFsc2UpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCWlmIChkYXRhX2xlbiA8PSA1MTIpIHsKQEAgLTM5MDksMTYgKzQ1OTEsMTkgQEAKIAkJY21kWzRdID0gc3JiLT5jbW5kWzZdOwogCiAJCWJ1ZiA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwkJfQogCiAJCXJldHZhbCA9IHNkX3JlYWRfZGF0YShjaGlwLCBTRF9UTV9OT1JNQUxfUkVBRCwgY21kLCA1LCBieXRlX2NudCwKIAkJCQkgICAgICAgYmxrX2NudCwgYnVzX3dpZHRoLCBidWYsIGRhdGFfbGVuLCAyMDAwKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJcmVhZF9lcnIgPSAxOworCQkJcmVhZF9lcnIgPSB0cnVlOwogCQkJa2ZyZWUoYnVmKTsKIAkJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOwogCQl9CiAKIAkJbWluX2xlbiA9IG1pbihkYXRhX2xlbiwgc2NzaV9idWZmbGVuKHNyYikpOwpAQCAtMzk2NCw0OSArNDY0OSw2MyBAQAogCQkJCQlzY3NpX2J1ZmZsZW4oc3JiKSwgc2NzaV9zZ19jb3VudChzcmIpLAogCQkJCQlETUFfRlJPTV9ERVZJQ0UsIDEwMDAwKTsKIAkJaWYgKHJldHZhbCA8IDApIHsKLQkJCXJlYWRfZXJyID0gMTsKKwkJCXJlYWRfZXJyID0gdHJ1ZTsKIAkJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOwogCQl9CiAKIAl9IGVsc2UgewotCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKIAl9CiAKIAlyZXR2YWwgPSBleHRfc2RfZ2V0X3JzcChjaGlwLCByc3BfbGVuLCBzZF9jYXJkLT5yc3AsIHJzcF90eXBlKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJfQogCiAJaWYgKHN0YW5kYnkpIHsKIAkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoc2VuZF9jbWQxMikgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTVE9QX1RSQU5TTUlTU0lPTiwKLQkJCQkwLCBTRF9SU1BfVFlQRV9SMWIsIE5VTEwsIDAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCQkJMCwgU0RfUlNQX1RZUEVfUjFiLCBOVUxMLCAwLCBmYWxzZSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJaWYgKGRhdGFfbGVuIDwgNTEyKSB7CiAJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CTE9DS0xFTiwgMHgyMDAsCi0JCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIGZhbHNlKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJCX0KIAogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0JZVEVfQ05UX0gsIDB4RkYsIDB4MDIpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOworCQl9CiAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CWVRFX0NOVF9MLCAweEZGLCAweDAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCWlmICgoc3JiLT5jbW5kWzFdICYgMHgwMikgfHwgKHNyYi0+Y21uZFsxXSAmIDB4MDQpKQotCQljbWQxM19jaGVja2JpdCA9IDE7CisJCWNtZDEzX2NoZWNrYml0ID0gdHJ1ZTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsCkBAIC00MDE2LDggKzQ3MTUsMTAgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJfQogCiAJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKIAlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CkBAIC00MDMzLDcgKzQ3MzQsOCBAQAogCWlmICghKGNoaXAtPmNhcmRfcmVhZHkgJiBTRF9DQVJEKSkKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKIAotCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogfQogCiBpbnQgc2RfZXhlY3V0ZV93cml0ZV9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKQEAgLTQwNDEsOSArNDc0Myw5IEBACiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOwogCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwogCWludCByZXR2YWwsIHJzcF9sZW4sIGk7Ci0JaW50IGNtZDEzX2NoZWNrYml0ID0gMCwgd3JpdGVfZXJyID0gMDsKKwlib29sIHdyaXRlX2VyciA9IGZhbHNlLCBjbWQxM19jaGVja2JpdCA9IGZhbHNlOwogCXU4IGNtZF9pZHgsIHJzcF90eXBlOwotCXU4IHNlbmRfY21kMTIgPSAwLCBzdGFuZGJ5ID0gMCwgYWNtZCA9IDA7CisJYm9vbCBzdGFuZGJ5ID0gZmFsc2UsIHNlbmRfY21kMTIgPSBmYWxzZSwgYWNtZCA9IGZhbHNlOwogCXUzMiBkYXRhX2xlbiwgYXJnOwogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCWludCBsb2NrX2NtZF9mYWlsID0gMDsKQEAgLTQwNTMsMjggKzQ3NTUsMzIgQEAKIAogCWlmICghc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKHNkX2NhcmQtPnByZV9jbWRfZXJyKSB7CiAJCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMDsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0NIQU5HRSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcmV0dmFsID0gc2Rfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KIAogCWNtZF9pZHggPSBzcmItPmNtbmRbMl0gJiAweDNGOwogCWlmIChzcmItPmNtbmRbMV0gJiAweDA0KQotCQlzZW5kX2NtZDEyID0gMTsKKwkJc2VuZF9jbWQxMiA9IHRydWU7CiAKIAlpZiAoc3JiLT5jbW5kWzFdICYgMHgwMikKLQkJc3RhbmRieSA9IDE7CisJCXN0YW5kYnkgPSB0cnVlOwogCiAJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDEpCi0JCWFjbWQgPSAxOworCQlhY21kID0gdHJ1ZTsKIAogCWRhdGFfbGVuID0gKCh1MzIpc3JiLT5jbW5kWzddIDw8IDE2KSB8ICgodTMyKXNyYi0+Y21uZFs4XQogCQkJCQkJPDwgOCkgfCBzcmItPmNtbmRbOV07CkBAIC00MDkxLDY4ICs0Nzk3LDg3IEBACiAJcmV0dmFsID0gZ2V0X3JzcF90eXBlKHNyYiwgJnJzcF90eXBlLCAmcnNwX2xlbik7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAlzZF9jYXJkLT5sYXN0X3JzcF90eXBlID0gcnNwX3R5cGU7CiAKIAlyZXR2YWwgPSBzZF9zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJaWYgKChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX0xPQ0tfMUJJVF9NT0RFKSA9PSAwKSB7CiAJCWlmIChDSEtfTU1DXzhCSVQoc2RfY2FyZCkpIHsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4MDMsCiAJCQkJCQlTRF9CVVNfV0lEVEhfOCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCiAJCX0gZWxzZSBpZiAoQ0hLX1NEKHNkX2NhcmQpIHx8IENIS19NTUNfNEJJVChzZF9jYXJkKSkgewogCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMSwgMHgwMywKIAkJCQkJCVNEX0JVU19XSURUSF80KTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCQl9CiAJCX0KIAl9CiAjZWxzZQogCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4MDMsIFNEX0JVU19XSURUSF80KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CiAjZW5kaWYKIAogCWlmIChkYXRhX2xlbiA8IDUxMikgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQkxPQ0tMRU4sIGRhdGFfbGVuLAotCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgZmFsc2UpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoc3RhbmRieSkgewogCQlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJaWYgKGFjbWQpIHsKIAkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwKIAkJCQkJCXNkX2NhcmQtPnNkX2FkZHIsCi0JCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgZmFsc2UpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBjbWRfaWR4LCBhcmcsIHJzcF90eXBlLAotCQkJc2RfY2FyZC0+cnNwLCByc3BfbGVuLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQlzZF9jYXJkLT5yc3AsIHJzcF9sZW4sIGZhbHNlKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCX0KIAogCWlmIChkYXRhX2xlbiA8PSA1MTIpIHsKIAkJdTE2IGk7CiAJCXU4ICpidWY7CiAKIAkJYnVmID0ga21hbGxvYyhkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCQl9CiAKIAkJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGRhdGFfbGVuLCBzcmIpOwogCkBAIC00MTcwLDcgKzQ4OTUsOCBAQAogCQkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAyNTApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CiAJCQl9CiAKIAkJCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CkBAIC00MTgxLDcgKzQ5MDcsOCBAQAogCQkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAyNTApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtNDE5Miw3ICs0OTE5LDggQEAKIAkJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMjUwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOwogCQkJfQogCQl9CiAKQEAgLTQyNDMsMTMgKzQ5NzEsMTUgQEAKIAkJCQkJRE1BX1RPX0RFVklDRSwgMTAwMDApOwogCiAJfSBlbHNlIHsKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKIAl9CiAKIAlpZiAocmV0dmFsIDwgMCkgewotCQl3cml0ZV9lcnIgPSAxOworCQl3cml0ZV9lcnIgPSB0cnVlOwogCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwotCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOwogCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwpAQCAtNDI3NSwzNCArNTAwNSw0NCBAQAogCiAJaWYgKHN0YW5kYnkpIHsKIAkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCWlmIChzZW5kX2NtZDEyKSB7CiAJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNUT1BfVFJBTlNNSVNTSU9OLAotCQkJCTAsIFNEX1JTUF9UWVBFX1IxYiwgTlVMTCwgMCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQkJMCwgU0RfUlNQX1RZUEVfUjFiLCBOVUxMLCAwLCBmYWxzZSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCWlmIChkYXRhX2xlbiA8IDUxMikgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQkxPQ0tMRU4sIDB4MjAwLAotCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgZmFsc2UpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJCX0KIAogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0JZVEVfQ05UX0gsIDB4RkYsIDB4MDIpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJCX0KIAogCQlydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0JZVEVfQ05UX0wsIDB4RkYsIDB4MDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoKHNyYi0+Y21uZFsxXSAmIDB4MDIpIHx8IChzcmItPmNtbmRbMV0gJiAweDA0KSkKLQkJY21kMTNfY2hlY2tiaXQgPSAxOworCQljbWQxM19jaGVja2JpdCA9IHRydWU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLApAQCAtNDMxMiw4ICs1MDUyLDEwIEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJaWYgKGNtZF9pZHggPT0gTE9DS19VTkxPQ0spIHsKQEAgLTQzMzksNyArNTA4MSw4IEBACiAJCQkJCQlyZXR2YWwgPSByZXNldF9zZChjaGlwKTsKIAkJCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmPSB+KFNEX1VOTE9DS19QT1dfT04gfCBTRF9TRFJfUlNUKTsKLQkJCQkJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKIAkJCQkJCX0KIAkJCQkJfQogCkBAIC00MzUyLDcgKzUwOTUsOCBAQAogCWlmIChsb2NrX2NtZF9mYWlsKSB7CiAJCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9OT19TRU5TRSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogI2VuZGlmICAvKiBTVVBQT1JUX1NEX0xPQ0sgKi8KIApAQCAtNDM3MCw3ICs1MTE0LDggQEAKIAlpZiAoIShjaGlwLT5jYXJkX3JlYWR5ICYgU0RfQ0FSRCkpCiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAKLQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIH0KIAogaW50IHNkX2dldF9jbWRfcnNwKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKQEAgLTQzODIsMjAgKzUxMjcsMjMgQEAKIAogCWlmICghc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKHNkX2NhcmQtPnByZV9jbWRfZXJyKSB7CiAJCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMDsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0NIQU5HRSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJZGF0YV9sZW4gPSAoKHUxNilzcmItPmNtbmRbN10gPDwgOCkgfCBzcmItPmNtbmRbOF07CiAKIAlpZiAoc2RfY2FyZC0+bGFzdF9yc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0gZWxzZSBpZiAoc2RfY2FyZC0+bGFzdF9yc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMikgewogCQljb3VudCA9IChkYXRhX2xlbiA8IDE3KSA/IGRhdGFfbGVuIDogMTc7CiAJfSBlbHNlIHsKQEAgLTQ0MjAsMTMgKzUxNjgsMTUgQEAKIAogCWlmICghc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKHNkX2NhcmQtPnByZV9jbWRfZXJyKSB7CiAJCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMDsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0NIQU5HRSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKCgweDUzICE9IHNyYi0+Y21uZFsyXSkgfHwgKDB4NDQgIT0gc3JiLT5jbW5kWzNdKSB8fApAQCAtNDQzNCw3ICs1MTg0LDggQEAKIAkJKDB4NjEgIT0gc3JiLT5jbW5kWzZdKSB8fCAoMHg3MiAhPSBzcmItPmNtbmRbN10pIHx8CiAJCSgweDY0ICE9IHNyYi0+Y21uZFs4XSkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlzd2l0Y2ggKHNyYi0+Y21uZFsxXSAmIDB4MEYpIHsKQEAgLTQ0NTAsNyArNTIwMSw4IEBACiAjZW5kaWYKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAJCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDE7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAkJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJj0gflNEX1NEUl9SU1Q7CkBAIC00NDYyLDEzICs1MjE0LDE1IEBACiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAJCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDE7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CkBAIC00NDkyLDI2ICs1MjQ2LDQxIEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IGRpc2FibGVfY2FyZF9jbG9jayhjaGlwLCBTRF9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfT0UsIFNEX09VVFBVVF9FTiwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX09FLCBTRF9PVVRQVVRfRU4sIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoIWNoaXAtPmZ0Ml9mYXN0X21vZGUpIHsKIAkJcmV0dmFsID0gY2FyZF9wb3dlcl9vZmYoY2hpcCwgU0RfQ0FSRCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJd2FpdF90aW1lb3V0KDUwKTsKIAl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCXJldHZhbCA9IHNkX3B1bGxfY3RsX2Rpc2FibGUoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRlBHQV9QVUxMX0NUTCwKLQkJCUZQR0FfU0RfUFVMTF9DVExfQklUIHwgMHgyMCwgRlBHQV9TRF9QVUxMX0NUTF9CSVQpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQR0FfUFVMTF9DVEwsCisJCQkJCSAgICAgRlBHQV9TRF9QVUxMX0NUTF9CSVQgfCAweDIwLAorCQkJCQkgICAgIEZQR0FfU0RfUFVMTF9DVExfQklUKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC00NTM4LDggKzUzMDcsMTAgQEAKIAltZW1zZXQoc2RfY2FyZC0+cmF3X3NjciwgMCwgOCk7CiAKIAlyZXR2YWwgPSBzZF9wb3dlcl9vZmZfY2FyZDN2MyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5oCmluZGV4IDczNWIyZDAuLjYwYjc5MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuaApAQCAtMjg3LDcgKzI4Nyw3IEBACiAjaWZkZWYgU1VQUE9SVF9DUFJNCiBpbnQgc29mdF9yZXNldF9zZF9jYXJkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApOwogaW50IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGNtZF9pZHgsCi0JCXUzMiBhcmcsIHU4IHJzcF90eXBlLCB1OCAqcnNwLCBpbnQgcnNwX2xlbiwgaW50IHNwZWNpYWxfY2hlY2spOworCQl1MzIgYXJnLCB1OCByc3BfdHlwZSwgdTggKnJzcCwgaW50IHJzcF9sZW4sIGJvb2wgc3BlY2lhbF9jaGVjayk7CiBpbnQgZXh0X3NkX2dldF9yc3Aoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgaW50IGxlbiwgdTggKnJzcCwgdTggcnNwX3R5cGUpOwogCiBpbnQgc2RfcGFzc190aHJ1X21vZGUoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NwaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMKaW5kZXggMjlmNGE4MC4uZTY3ZTdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMKQEAgLTI1LDkgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAicnRzeC5oIgotI2luY2x1ZGUgInJ0c3hfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAicnRzeF9zY3NpLmgiCi0jaW5jbHVkZSAicnRzeF9jYXJkLmgiCiAjaW5jbHVkZSAic3BpLmgiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfc2V0X2Vycl9jb2RlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGVycl9jb2RlKQpAQCAtMzksMTAgKzM2LDIwIEBACiAKIHN0YXRpYyBpbnQgc3BpX2luaXQoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTUElfQ09OVFJPTCwgMHhGRiwKLQkJQ1NfUE9MQVJJVFlfTE9XIHwgRFRPX01TQl9GSVJTVCB8IFNQSV9NQVNURVIgfCBTUElfTU9ERTAgfAotCQlTUElfQVVUTyk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgU1BJX1RDVEwsIEVET19USU1JTkdfTUFTSywgU0FNUExFX0RFTEFZX0hBTEYpOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9DT05UUk9MLCAweEZGLAorCQkJCSAgICAgQ1NfUE9MQVJJVFlfTE9XIHwgRFRPX01TQl9GSVJTVCB8IFNQSV9NQVNURVIgfCBTUElfTU9ERTAgfCBTUElfQVVUTyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9UQ1RMLCBFRE9fVElNSU5HX01BU0ssCisJCQkJICAgICBTQU1QTEVfREVMQVlfSEFMRik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTUyLDI1ICs1OSw1MSBAQAogCXN0cnVjdCBzcGlfaW5mbyAqc3BpID0gJihjaGlwLT5zcGkpOwogCWludCByZXR2YWw7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTUElfQ0xLX0RJVklERVIxLCAweEZGLCAodTgpKHNwaS0+Y2xrX2RpdiA+PiA4KSk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgU1BJX0NMS19ESVZJREVSMCwgMHhGRiwgKHU4KShzcGktPmNsa19kaXYpKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9DTEtfRElWSURFUjEsIDB4RkYsCisJCQkJICAgICAodTgpKHNwaS0+Y2xrX2RpdiA+PiA4KSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9DTEtfRElWSURFUjAsIDB4RkYsCisJCQkJICAgICAodTgpKHNwaS0+Y2xrX2RpdikpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgc3BpLT5zcGlfY2xvY2spOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2VsZWN0X2NhcmQoY2hpcCwgU1BJX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9DTEtfRU4sIFNQSV9DTEtfRU4sIFNQSV9DTEtfRU4pOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfT0UsIFNQSV9PVVRQVVRfRU4sIFNQSV9PVVRQVVRfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9DTEtfRU4sIFNQSV9DTEtfRU4sCisJCQkJICAgICBTUElfQ0xLX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9PRSwgU1BJX09VVFBVVF9FTiwKKwkJCQkgICAgIFNQSV9PVVRQVVRfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAl3YWl0X3RpbWVvdXQoMTApOwogCiAJcmV0dmFsID0gc3BpX2luaXQoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC05MSw3ICsxMjQsOCBAQAogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9CVVNZX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMTksNyArMTUzLDggQEAKIAlpZiAocmV0dmFsIDwgMCkgewogCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE0Nyw3ICsxODIsOCBAQAogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjA1LDcgKzI0MSw4IEBACiAJaWYgKHJldHZhbCA8IDApIHsKIAkJcnRzeF9jbGVhcl9zcGlfZXJyb3IoY2hpcCk7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0yMjEsMjUgKzI1OCw1NiBAQAogCWVsc2UKIAkJY2xrID0gQ0xLXzMwOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU1BJX0NMS19ESVZJREVSMSwgMHhGRiwgMHgwMCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgU1BJX0NMS19ESVZJREVSMCwgMHhGRiwgMHgyNyk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfQ0xLX0RJVklERVIxLCAweEZGLCAweDAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU1BJX0NMS19ESVZJREVSMCwgMHhGRiwgMHgyNyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHZhbCA9IHN3aXRjaF9jbG9jayhjaGlwLCBjbGspOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2VsZWN0X2NhcmQoY2hpcCwgU1BJX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9DTEtfRU4sIFNQSV9DTEtfRU4sIFNQSV9DTEtfRU4pOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfT0UsIFNQSV9PVVRQVVRfRU4sIFNQSV9PVVRQVVRfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9DTEtfRU4sIFNQSV9DTEtfRU4sCisJCQkJICAgICBTUElfQ0xLX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9PRSwgU1BJX09VVFBVVF9FTiwKKwkJCQkgICAgIFNQSV9PVVRQVVRfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAl3YWl0X3RpbWVvdXQoMTApOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU1BJX0NPTlRST0wsIDB4RkYsCi0JCUNTX1BPTEFSSVRZX0hJR0ggfCBTUElfRUVQUk9NX0FVVE8pOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNQSV9UQ1RMLCBFRE9fVElNSU5HX01BU0ssIFNBTVBMRV9ERUxBWV9IQUxGKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9DT05UUk9MLCAweEZGLAorCQkJCSAgICAgQ1NfUE9MQVJJVFlfSElHSCB8IFNQSV9FRVBST01fQVVUTyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9UQ1RMLCBFRE9fVElNSU5HX01BU0ssCisJCQkJICAgICBTQU1QTEVfREVMQVlfSEFMRik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTI1OCw4ICszMjYsMTAgQEAKIAkJU1BJX1RSQU5TRkVSMF9FTkQpOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0yNjksMTIgKzMzOSwxNiBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzcGlfaW5pdF9lZXByb20oY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzcGlfZWVwcm9tX3Byb2dyYW1fZW5hYmxlKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMjg4LDEwICszNjIsMTYgQEAKIAkJU1BJX1RSQU5TRkVSMF9FTkQpOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJT19ESVIsIDB4MDEsIDB4MDEpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0zMDEsMTIgKzM4MSwxNiBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzcGlfaW5pdF9lZXByb20oY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzcGlfZWVwcm9tX3Byb2dyYW1fZW5hYmxlKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMzIyLDEwICs0MDYsMTYgQEAKIAkJU1BJX1RSQU5TRkVSMF9FTkQpOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJT19ESVIsIDB4MDEsIDB4MDEpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0zMzcsOCArNDI3LDEwIEBACiAJdTggZGF0YTsKIAogCXJldHZhbCA9IHNwaV9pbml0X2VlcHJvbShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTM1NSwxNiArNDQ3LDI2IEBACiAJCVNQSV9UUkFOU0ZFUjBfRU5EKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJd2FpdF90aW1lb3V0KDUpOwotCVJUU1hfUkVBRF9SRUcoY2hpcCwgU1BJX0RBVEEsICZkYXRhKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgU1BJX0RBVEEsICZkYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKHZhbCkKIAkJKnZhbCA9IGRhdGE7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJT19ESVIsIDB4MDEsIDB4MDEpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0zNzQsMTIgKzQ3NiwxNiBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBzcGlfaW5pdF9lZXByb20oY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzcGlfZWVwcm9tX3Byb2dyYW1fZW5hYmxlKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMzk2LDEwICs1MDIsMTYgQEAKIAkJU1BJX1RSQU5TRkVSMF9FTkQpOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJT19ESVIsIDB4MDEsIDB4MDEpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC00NDksMTMgKzU2MSwxNSBAQAogCWxlbiA9ICgodTE2KShzcmItPmNtbmRbN10pIDw8IDgpIHwgc3JiLT5jbW5kWzhdOwogCWlmIChsZW4gPiA1MTIpIHsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSU5WQUxJRF9DT01NQU5EKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHZhbCA9IHNwaV9zZXRfaW5pdF9wYXJhKGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CkBAIC00OTcsMTkgKzYxMSwyMyBAQAogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKGxlbikgewogCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYnVmKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJCWlmICghYnVmKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwkJfQogCiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9wcGJ1ZihjaGlwLCBidWYsIGxlbik7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX1JFQURfRVJSKTsKIAkJCWtmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJ0c3hfc3Rvcl9zZXRfeGZlcl9idWYoYnVmLCBzY3NpX2J1ZmZsZW4oc3JiKSwgc3JiKTsKQEAgLTU0MSwxMiArNjU5LDE1IEBACiAJcmV0dmFsID0gc3BpX3NldF9pbml0X3BhcmEoY2hpcCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJYnVmID0ga21hbGxvYyhTRl9QQUdFX0xFTiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAl3aGlsZSAobGVuKSB7CiAJCXUxNiBwYWdlbGVuID0gU0ZfUEFHRV9MRU4gLSAodTgpYWRkcjsKQEAgLTU5OCw3ICs3MTksOCBAQAogCQkJa2ZyZWUoYnVmKTsKIAkJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcnRzeF9zdG9yX2FjY2Vzc194ZmVyX2J1ZihidWYsIHBhZ2VsZW4sIHNyYiwgJmluZGV4LCAmb2Zmc2V0LApAQCAtNjM0LDE5ICs3NTYsMjMgQEAKIAlyZXR2YWwgPSBzcGlfc2V0X2luaXRfcGFyYShjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAocHJvZ3JhbV9tb2RlID09IEJZVEVfUFJPR1JBTSkgewogCQlidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOwotCQlpZiAoIWJ1ZikKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCQlpZiAoIWJ1ZikgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRVJST1I7CisJCX0KIAogCQl3aGlsZSAobGVuKSB7CiAJCQlyZXR2YWwgPSBzZl9lbmFibGVfd3JpdGUoY2hpcCwgU1BJX1dSRU4pOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJcnRzeF9zdG9yX2FjY2Vzc194ZmVyX2J1ZihidWYsIDEsIHNyYiwgJmluZGV4LCAmb2Zmc2V0LApAQCAtNjY1LDEzICs3OTEsMTUgQEAKIAkJCQlrZnJlZShidWYpOwogCQkJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQkJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJcmV0dmFsID0gc2ZfcG9sbGluZ19zdGF0dXMoY2hpcCwgMTAwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCWFkZHIrKzsKQEAgLTY4NCwxMiArODEyLDE2IEBACiAJCWludCBmaXJzdF9ieXRlID0gMTsKIAogCQlyZXR2YWwgPSBzZl9lbmFibGVfd3JpdGUoY2hpcCwgU1BJX1dSRU4pOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWJ1ZiA9IGttYWxsb2MoNCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYnVmKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJCWlmICghYnVmKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwkJfQogCiAJCXdoaWxlIChsZW4pIHsKIAkJCXJ0c3hfc3Rvcl9hY2Nlc3NfeGZlcl9idWYoYnVmLCAxLCBzcmIsICZpbmRleCwgJm9mZnNldCwKQEAgLTcxMywxMyArODQ1LDE1IEBACiAJCQkJa2ZyZWUoYnVmKTsKIAkJCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXJldHZhbCA9IHNmX3BvbGxpbmdfc3RhdHVzKGNoaXAsIDEwMCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlsZW4tLTsKQEAgLTcyOCwxNiArODYyLDIyIEBACiAJCWtmcmVlKGJ1Zik7CiAKIAkJcmV0dmFsID0gc2ZfZGlzYWJsZV93cml0ZShjaGlwLCBTUElfV1JESSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gc2ZfcG9sbGluZ19zdGF0dXMoY2hpcCwgMTAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9IGVsc2UgaWYgKHByb2dyYW1fbW9kZSA9PSBQQUdFX1BST0dSQU0pIHsKIAkJYnVmID0ga21hbGxvYyhTRl9QQUdFX0xFTiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYnVmKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CisJCWlmICghYnVmKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19OT01FTTsKKwkJfQogCiAJCXdoaWxlIChsZW4pIHsKIAkJCXUxNiBwYWdlbGVuID0gU0ZfUEFHRV9MRU4gLSAodTgpYWRkcjsKQEAgLTc0OCw3ICs4ODgsOCBAQAogCQkJcmV0dmFsID0gc2ZfZW5hYmxlX3dyaXRlKGNoaXAsIFNQSV9XUkVOKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CkBAIC03NjcsMTMgKzkwOCwxNSBAQAogCQkJCWtmcmVlKGJ1Zik7CiAJCQkJcnRzeF9jbGVhcl9zcGlfZXJyb3IoY2hpcCk7CiAJCQkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlyZXR2YWwgPSBzZl9wb2xsaW5nX3N0YXR1cyhjaGlwLCAxMDApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJYWRkciArPSBwYWdlbGVuOwpAQCAtNzgzLDcgKzkyNiw4IEBACiAJCWtmcmVlKGJ1Zik7CiAJfSBlbHNlIHsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSU5WQUxJRF9DT01NQU5EKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTgwNSwyOCArOTQ5LDM4IEBACiAJcmV0dmFsID0gc3BpX3NldF9pbml0X3BhcmEoY2hpcCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKGVyYXNlX21vZGUgPT0gUEFHRV9FUkFTRSkgewogCQlyZXR2YWwgPSBzZl9lbmFibGVfd3JpdGUoY2hpcCwgU1BJX1dSRU4pOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IHNmX2VyYXNlKGNoaXAsIGlucywgMSwgYWRkcik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIGlmIChlcmFzZV9tb2RlID09IENISVBfRVJBU0UpIHsKIAkJcmV0dmFsID0gc2ZfZW5hYmxlX3dyaXRlKGNoaXAsIFNQSV9XUkVOKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBzZl9lcmFzZShjaGlwLCBpbnMsIDAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0gZWxzZSB7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0lOVkFMSURfQ09NTUFORCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC04NDQsMTIgKzk5OCwxNSBAQAogCXJldHZhbCA9IHNwaV9zZXRfaW5pdF9wYXJhKGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHZhbCA9IHNmX2VuYWJsZV93cml0ZShjaGlwLCBld3NyKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTg3MSw3ICsxMDI4LDggQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvdHJhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkZGJkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3RyYWNlLmMKQEAgLTAsMCArMSwyNiBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAicnRzeC5oIgorCisjaWZkZWYgX01TR19UUkFDRQorCit2b2lkIF9ydHN4X3RyYWNlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsCisJCSBpbnQgbGluZSkKK3sKKwlzdHJ1Y3QgdHJhY2VfbXNnX3QgKm1zZyA9ICZjaGlwLT50cmFjZV9tc2dbY2hpcC0+bXNnX2lkeF07CisKKwlmaWxlID0ga2Jhc2VuYW1lKGZpbGUpOworCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJbJXNdWyVzXTpbJWRdXG4iLCBmaWxlLCBmdW5jLCBsaW5lKTsKKworCXN0cm5jcHkobXNnLT5maWxlLCBmaWxlLCBNU0dfRklMRV9MRU4gLSAxKTsKKwlzdHJuY3B5KG1zZy0+ZnVuYywgZnVuYywgTVNHX0ZVTkNfTEVOIC0gMSk7CisJbXNnLT5saW5lID0gKHUxNilsaW5lOworCWdldF9jdXJyZW50X3RpbWUobXNnLT50aW1ldmFsX2J1ZiwgVElNRV9WQUxfTEVOKTsKKwltc2ctPnZhbGlkID0gMTsKKworCWNoaXAtPm1zZ19pZHgrKzsKKwlpZiAoY2hpcC0+bXNnX2lkeCA+PSBUUkFDRV9JVEVNX0NOVCkKKwkJY2hpcC0+bXNnX2lkeCA9IDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3RyYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC90cmFjZS5oCmluZGV4IGE5YWI0MDcuLjViODA3ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3RyYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvdHJhY2UuaApAQCAtMjQsNjQgKzI0LDE3IEBACiAjaWZuZGVmIF9fUkVBTFRFS19SVFNYX1RSQUNFX0gKICNkZWZpbmUgX19SRUFMVEVLX1JUU1hfVFJBQ0VfSAogCi0jZGVmaW5lIF9NU0dfVFJBQ0UKK3N0cnVjdCBydHN4X2NoaXA7CiAKICNpZmRlZiBfTVNHX1RSQUNFCi1zdGF0aWMgaW5saW5lIGNoYXIgKmZpbGVuYW1lKGNoYXIgKnBhdGgpCi17Ci0JY2hhciAqcHRyOwotCi0JaWYgKHBhdGggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwdHIgPSBwYXRoOwotCi0Jd2hpbGUgKCpwdHIgIT0gJ1wwJykgewotCQlpZiAoKCpwdHIgPT0gJ1xcJykgfHwgKCpwdHIgPT0gJy8nKSkKLQkJCXBhdGggPSBwdHIgKyAxOwotCi0JCXB0cisrOwotCX0KLQotCXJldHVybiBwYXRoOwotfQotCi0jZGVmaW5lIFRSQUNFX1JFVChjaGlwLCByZXQpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJY2hhciAqX2ZpbGUgPSBmaWxlbmFtZShfX0ZJTEVfXyk7CQkJXAotCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiWyVzXVslc106WyVkXVxuIiwgX2ZpbGUsCVwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CQkJCVwKLQkJKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5saW5lID0gKHUxNikoX19MSU5FX18pOyBcCi0JCXN0cm5jcHkoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5mdW5jLCBfX2Z1bmNfXywgTVNHX0ZVTkNfTEVOLTEpOyBcCi0JCXN0cm5jcHkoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5maWxlLCBfZmlsZSwgTVNHX0ZJTEVfTEVOLTEpOyBcCi0JCWdldF9jdXJyZW50X3RpbWUoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS50aW1ldmFsX2J1ZiwgVElNRV9WQUxfTEVOKTsJXAotCQkoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLnZhbGlkID0gMTsJCVwKLQkJKGNoaXApLT5tc2dfaWR4Kys7CQkJCQlcCi0JCWlmICgoY2hpcCktPm1zZ19pZHggPj0gVFJBQ0VfSVRFTV9DTlQpIHsJCVwKLQkJCShjaGlwKS0+bXNnX2lkeCA9IDA7CQkJCVwKLQkJfQkJCQkJCQlcCi0JCXJldHVybiByZXQ7CQkJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFJBQ0VfR09UTyhjaGlwLCBsYWJlbCkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQljaGFyICpfZmlsZSA9IGZpbGVuYW1lKF9fRklMRV9fKTsJCQlcCi0JCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJbJXNdWyVzXTpbJWRdXG4iLCBfZmlsZSwJXAotCQkJX19mdW5jX18sIF9fTElORV9fKTsJCQkJXAotCQkoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLmxpbmUgPSAodTE2KShfX0xJTkVfXyk7IFwKLQkJc3RybmNweSgoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLmZ1bmMsIF9fZnVuY19fLCBNU0dfRlVOQ19MRU4tMSk7IFwKLQkJc3RybmNweSgoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLmZpbGUsIF9maWxlLCBNU0dfRklMRV9MRU4tMSk7IFwKLQkJZ2V0X2N1cnJlbnRfdGltZSgoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLnRpbWV2YWxfYnVmLCBUSU1FX1ZBTF9MRU4pOwlcCi0JCShjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0udmFsaWQgPSAxOwkJXAotCQkoY2hpcCktPm1zZ19pZHgrKzsJCQkJCVwKLQkJaWYgKChjaGlwKS0+bXNnX2lkeCA+PSBUUkFDRV9JVEVNX0NOVCkgewkJXAotCQkJKGNoaXApLT5tc2dfaWR4ID0gMDsJCQkJXAotCQl9CQkJCQkJCVwKLQkJZ290byBsYWJlbDsJCQkJCQlcCi0JfSB3aGlsZSAoMCkKK3ZvaWQgX3J0c3hfdHJhY2Uoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZnVuYywKKwkJIGludCBsaW5lKTsKKyNkZWZpbmUgcnRzeF90cmFjZShjaGlwKQkJCQkJCVwKKwlfcnRzeF90cmFjZShjaGlwLCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKQogI2Vsc2UKLSNkZWZpbmUgVFJBQ0VfUkVUKGNoaXAsIHJldCkJcmV0dXJuIHJldAotI2RlZmluZSBUUkFDRV9HT1RPKGNoaXAsIGxhYmVsKQlnb3RvIGxhYmVsCitzdGF0aWMgaW5saW5lIHZvaWQgcnRzeF90cmFjZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQoreworfQogI2VuZGlmCiAKICNlbmRpZiAgLyogX19SRUFMVEVLX1JUU1hfVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgveGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3hkLmMKaW5kZXggMGQwMjlmZS4uOGZkMTA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgveGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC94ZC5jCkBAIC02MCw4ICs2MCwxMCBAQAogCQl4ZF9jYXJkLT54ZF9jbG9jayA9IENMS181MDsKIAogCXJldHZhbCA9IHN3aXRjaF9jbG9jayhjaGlwLCB4ZF9jYXJkLT54ZF9jbG9jayk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC03MiwxMiArNzQsMTYgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc2VsZWN0X2NhcmQoY2hpcCwgWERfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgeGRfY2FyZC0+eGRfY2xvY2spOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtOTksOCArMTA1LDEwIEBACiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsICh1MTYpKFhEX0FERFJFU1MxICsgaSksIDAsIDApOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBYRF9DQVJELCAyMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApICsgMTsKIAlpZiAoaWRfYnVmICYmIGJ1Zl9sZW4pIHsKQEAgLTE2Nyw4ICsxNzUsMTAgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBYRF9QQVJJVFksIDAsIDApOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBYRF9DQVJELCA1MDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoYnVmICYmIGJ1Zl9sZW4pIHsKIAkJdTggKnB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApICsgMTsKQEAgLTE4Niw4ICsxOTYsMTAgQEAKIHsKIAlpbnQgcmV0dmFsLCBpOwogCi0JaWYgKCFidWYgfHwgKGJ1Zl9sZW4gPCAwKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoIWJ1ZiB8fCAoYnVmX2xlbiA8IDApKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwogCkBAIC0xOTgsNyArMjEwLDggQEAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDI1MCk7CiAJaWYgKHJldHZhbCA8IDApIHsKIAkJcnRzeF9jbGVhcl94ZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCW1lbWNweShidWYsIHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApLCBidWZfbGVuKTsKQEAgLTIxMiw4ICsyMjUsMTAgQEAKIAlpbnQgcmV0dmFsOwogCXU4IHJlZzsKIAotCWlmICghYnVmIHx8IChidWZfbGVuIDwgMTApKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICghYnVmIHx8IChidWZfbGVuIDwgMTApKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwogCkBAIC0yMzMsMjUgKzI0OCw0NyBAQAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgWERfQ0FSRCwgMjUwKTsKIAlpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKIAkJcnRzeF9jbGVhcl94ZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgWERfUEFHRV9TVEFUVVMsICZyZWcpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9QQUdFX1NUQVRVUywgJnJlZyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlpZiAocmVnICE9IFhEX0dQRykgewogCQlydHN4X2NsZWFyX3hkX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBYRF9DVEwsICZyZWcpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9DVEwsICZyZWcpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJaWYgKCEocmVnICYgWERfRUNDMV9FUlJPUikgfHwgIShyZWcgJiBYRF9FQ0MxX1VOQ09SUkVDVEFCTEUpKSB7CiAJCXJldHZhbCA9IHhkX3JlYWRfZGF0YV9mcm9tX3BwYihjaGlwLCAwLCBidWYsIGJ1Zl9sZW4pOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCQlpZiAocmVnICYgWERfRUNDMV9FUlJPUikgewogCQkJdTggZWNjX2JpdCwgZWNjX2J5dGU7CiAKLQkJCVJUU1hfUkVBRF9SRUcoY2hpcCwgWERfRUNDX0JJVDEsICZlY2NfYml0KTsKLQkJCVJUU1hfUkVBRF9SRUcoY2hpcCwgWERfRUNDX0JZVEUxLCAmZWNjX2J5dGUpOworCQkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFhEX0VDQ19CSVQxLAorCQkJCQkJICAgICZlY2NfYml0KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfRUNDX0JZVEUxLAorCQkJCQkJICAgICZlY2NfYnl0ZSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCiAJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiRUNDX0JJVDEgPSAweCV4LCBFQ0NfQllURTEgPSAweCV4XG4iLAogCQkJCWVjY19iaXQsIGVjY19ieXRlKTsKQEAgLTI2NywxMyArMzA0LDI1IEBACiAJCXJ0c3hfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CiAKIAkJcmV0dmFsID0geGRfcmVhZF9kYXRhX2Zyb21fcHBiKGNoaXAsIDI1NiwgYnVmLCBidWZfbGVuKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAkJaWYgKHJlZyAmIFhEX0VDQzJfRVJST1IpIHsKIAkJCXU4IGVjY19iaXQsIGVjY19ieXRlOwogCi0JCQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX0VDQ19CSVQyLCAmZWNjX2JpdCk7Ci0JCQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX0VDQ19CWVRFMiwgJmVjY19ieXRlKTsKKwkJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9FQ0NfQklUMiwKKwkJCQkJCSAgICAmZWNjX2JpdCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFhEX0VDQ19CWVRFMiwKKwkJCQkJCSAgICAmZWNjX2J5dGUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkVDQ19CSVQyID0gMHgleCwgRUNDX0JZVEUyID0gMHgleFxuIiwKIAkJCQllY2NfYml0LCBlY2NfYnl0ZSk7CkBAIC0yODcsNyArMzM2LDggQEAKIAkJfQogCX0gZWxzZSB7CiAJCXJ0c3hfY2xlYXJfeGRfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0zNjMsMjQgKzQxMyw3MSBAQAogCiBzdGF0aWMgaW50IHhkX3B1bGxfY3RsX2Rpc2FibGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKKwlpbnQgcmV0dmFsOworCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLAotCQkJWERfRDNfUEQgfCBYRF9EMl9QRCB8IFhEX0QxX1BEIHwgWERfRDBfUEQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwKLQkJCVhEX0Q3X1BEIHwgWERfRDZfUEQgfCBYRF9ENV9QRCB8IFhEX0Q0X1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsIDB4RkYsCi0JCQlYRF9XUF9QRCB8IFhEX0NFX1BEIHwgWERfQ0xFX1BEIHwgWERfQ0RfUFUpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMNCwgMHhGRiwKLQkJCVhEX1JEWV9QRCB8IFhEX1dFX1BEIHwgWERfUkVfUEQgfCBYRF9BTEVfUEQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwKLQkJCU1TX0lOU19QVSB8IFNEX1dQX1BEIHwgU0RfQ0RfUFUgfCBTRF9DTURfUEQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwgTVNfRDVfUEQgfCBNU19ENF9QRCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsCisJCQkJCSAgICAgWERfRDNfUEQgfCBYRF9EMl9QRCB8IFhEX0QxX1BEIHwgWERfRDBfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLAorCQkJCQkgICAgIFhEX0Q3X1BEIHwgWERfRDZfUEQgfCBYRF9ENV9QRCB8IFhEX0Q0X1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHhGRiwKKwkJCQkJICAgICBYRF9XUF9QRCB8IFhEX0NFX1BEIHwgWERfQ0xFX1BEIHwgWERfQ0RfUFUpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLAorCQkJCQkgICAgIFhEX1JEWV9QRCB8IFhEX1dFX1BEIHwgWERfUkVfUEQgfCBYRF9BTEVfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw1LCAweEZGLAorCQkJCQkgICAgIE1TX0lOU19QVSB8IFNEX1dQX1BEIHwgU0RfQ0RfUFUgfCBTRF9DTURfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw2LCAweEZGLAorCQkJCQkgICAgIE1TX0Q1X1BEIHwgTVNfRDRfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0gZWxzZSBpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKIAkJaWYgKENIRUNLX0JBUk9fUEtHKGNoaXAsIFFGTikpIHsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweDU1KTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLCAweDU1KTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDRCKTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDY5KTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDEsCisJCQkJCQkgICAgIDB4RkYsIDB4NTUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsCisJCQkJCQkgICAgIDB4RkYsIDB4NTUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsCisJCQkJCQkgICAgIDB4RkYsIDB4NEIpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsCisJCQkJCQkgICAgIDB4RkYsIDB4NjkpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzk0LDggKzQ5MSwxMCBAQAogCXU4ICpwdHIsIGlkX2J1Zls0XSwgcmVkdW50WzExXTsKIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIFhEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtNDE4LDEzICs1MTcsMTcgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9PRSwgWERfT1VUUFVUX0VOLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgWERfQ0FSRCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCFjaGlwLT5mdDJfZmFzdF9tb2RlKSB7CiAJCXJldHZhbCA9IGNhcmRfcG93ZXJfb2ZmKGNoaXAsIFhEX0NBUkQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXdhaXRfdGltZW91dCgyNTApOwogCkBAIC00MzksMTkgKzU0MiwyNCBAQAogCQl9CiAKIAkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBYRF9DQVJELCAxMDApOwotCQlpZiAocmV0dmFsIDwgMCkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gY2FyZF9wb3dlcl9vbihjaGlwLCBYRF9DQVJEKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogI2lmZGVmIFNVUFBPUlRfT0NQCiAJCXdhaXRfdGltZW91dCg1MCk7CiAJCWlmIChjaGlwLT5vY3Bfc3RhdCAmIChTRF9PQ19OT1cgfCBTRF9PQ19FVkVSKSkgewogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk92ZXIgY3VycmVudCwgT0NQU1RBVCBpcyAweCV4XG4iLAogCQkJCWNoaXAtPm9jcF9zdGF0KTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAjZW5kaWYKIAl9CkBAIC00NzIsMTUgKzU4MCwxOSBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DVEwsIFhEX0NFX0RJU0VOLCBYRF9DRV9ESVNFTik7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFhEX0NBUkQsIDEwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICghY2hpcC0+ZnQyX2Zhc3RfbW9kZSkKIAkJd2FpdF90aW1lb3V0KDIwMCk7CiAKIAlyZXR2YWwgPSB4ZF9zZXRfaW5pdF9wYXJhKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJLyogUmVhZCBJRCB0byBjaGVjayBpZiB0aGUgdGltaW5nIHNldHRpbmcgaXMgcmlnaHQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CkBAIC01MDIsOCArNjE0LDEwIEBACiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFhEX0NUTCwgMCwgMCk7CiAKIAkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBYRF9DQVJELCAxMDApOwotCQlpZiAocmV0dmFsIDwgMCkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcHRyID0gcnRzeF9nZXRfY21kX2RhdGEoY2hpcCkgKyAxOwogCkBAIC01MTUsOCArNjI5LDEwIEBACiAJCQljb250aW51ZTsKIAogCQlyZXR2YWwgPSB4ZF9yZWFkX2lkKGNoaXAsIFJFQURfSUQsIGlkX2J1ZiwgNCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlJFQURfSUQ6IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCiAJCQlpZF9idWZbMF0sIGlkX2J1ZlsxXSwgaWRfYnVmWzJdLCBpZF9idWZbM10pOwpAQCAtNTk2LDggKzcxMiwxMCBAQAogCQkvKiBDb25maXJtIHRpbWluZyBzZXR0aW5nICovCiAJCWZvciAoaiA9IDA7IGogPCAxMDsgaisrKSB7CiAJCQlyZXR2YWwgPSB4ZF9yZWFkX2lkKGNoaXAsIFJFQURfSUQsIGlkX2J1ZiwgNCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCWlmIChpZF9idWZbMV0gIT0geGRfY2FyZC0+ZGV2aWNlX2NvZGUpCiAJCQkJYnJlYWs7CkBAIC02MTMsMjMgKzczMSwzMCBAQAogCQl4ZF9jYXJkLT5hZGRyX2N5Y2xlID0gMDsKIAkJeGRfY2FyZC0+Y2FwYWNpdHkgPSAwOwogCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR2YWwgPSB4ZF9yZWFkX2lkKGNoaXAsIFJFQURfeERfSUQsIGlkX2J1ZiwgNCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlJFQURfeERfSUQ6IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCiAJCWlkX2J1ZlswXSwgaWRfYnVmWzFdLCBpZF9idWZbMl0sIGlkX2J1ZlszXSk7Ci0JaWYgKGlkX2J1ZlsyXSAhPSBYRF9JRF9DT0RFKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpZF9idWZbMl0gIT0gWERfSURfQ09ERSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJLyogU2VhcmNoIENJUyBibG9jayAqLwogCWZvciAoaSA9IDA7IGkgPCAyNDsgaSsrKSB7CiAJCXUzMiBwYWdlX2FkZHI7CiAKLQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcGFnZV9hZGRyID0gKHUzMilpIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0OwogCkBAIC02NjcsOCArNzkyLDEwIEBACiAJCQlwYWdlX2FkZHIgKz0gajsKIAogCQkJcmV0dmFsID0geGRfcmVhZF9jaXMoY2hpcCwgcGFnZV9hZGRyLCBidWYsIDEwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJaWYgKChidWZbMF0gPT0gMHgwMSkgJiYgKGJ1ZlsxXSA9PSAweDAzKSAmJgogCQkJCShidWZbMl0gPT0gMHhEOSkKQEAgLTY4NCw4ICs4MTEsMTAgQEAKIAl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiQ0lTIGJsb2NrOiAweCV4XG4iLCB4ZF9jYXJkLT5jaXNfYmxvY2spOwotCWlmICh4ZF9jYXJkLT5jaXNfYmxvY2sgPT0gMHhGRkZGKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICh4ZF9jYXJkLT5jaXNfYmxvY2sgPT0gMHhGRkZGKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltYRF9DQVJEXV0gPSB4ZF9jYXJkLT5jYXBhY2l0eTsKIApAQCAtNzM5LDE1ICs4NjgsMTkgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAieGRfaW5pdF9sMnBfdGJsOiB6b25lX2NudCA9ICVkXG4iLAogCQl4ZF9jYXJkLT56b25lX2NudCk7CiAKLQlpZiAoeGRfY2FyZC0+em9uZV9jbnQgPCAxKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICh4ZF9jYXJkLT56b25lX2NudCA8IDEpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXNpemUgPSB4ZF9jYXJkLT56b25lX2NudCAqIHNpemVvZihzdHJ1Y3Qgem9uZV9lbnRyeSk7CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkJ1ZmZlciBzaXplIGZvciBsMnAgdGFibGUgaXMgJWRcbiIsIHNpemUpOwogCiAJeGRfY2FyZC0+em9uZSA9IHZtYWxsb2Moc2l6ZSk7Ci0JaWYgKCF4ZF9jYXJkLT56b25lKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwlpZiAoIXhkX2NhcmQtPnpvbmUpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgeGRfY2FyZC0+em9uZV9jbnQ7IGkrKykgewogCQl4ZF9jYXJkLT56b25lW2ldLmJ1aWxkX2ZsYWcgPSAwOwpAQCAtOTI3LDE2ICsxMDYwLDIyIEBACiAJeGRfY2FyZC0+ZGVsYXlfd3JpdGUuZGVsYXlfd3JpdGVfZmxhZyA9IDA7CiAKIAlyZXR2YWwgPSBlbmFibGVfY2FyZF9jbG9jayhjaGlwLCBYRF9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHJlc2V0X3hkKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0geGRfaW5pdF9sMnBfdGJsKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtOTUwLDggKzEwODksMTAgQEAKIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJtYXJrIGJsb2NrIDB4JXggYXMgYmFkIGJsb2NrXG4iLCBwaHlfYmxrKTsKIAotCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHBoeV9ibGsgPT0gQkxLX05PVF9GT1VORCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtOTg2LDcgKzExMjcsOCBAQAogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1BSR19FUlJPUik7CiAJCWVsc2UKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMDAyLDEwICsxMTQ0LDE0IEBACiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiSW5pdCBibG9jayAweCV4XG4iLCBwaHlfYmxrKTsKIAotCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7Ci0JaWYgKHBoeV9ibGsgPT0gQkxLX05PVF9GT1VORCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CisJaWYgKHBoeV9ibGsgPT0gQkxLX05PVF9GT1VORCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMTA0MCw3ICsxMTg2LDggQEAKIAkJfSBlbHNlIHsKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7CiAJCX0KLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTEwNTcsMjQgKzEyMDQsMzQgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiQ29weSBwYWdlIGZyb20gYmxvY2sgMHgleCB0byBibG9jayAweCV4XG4iLAogCQlvbGRfYmxrLCBuZXdfYmxrKTsKIAotCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JaWYgKChvbGRfYmxrID09IEJMS19OT1RfRk9VTkQpIHx8IChuZXdfYmxrID09IEJMS19OT1RfRk9VTkQpKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICgob2xkX2JsayA9PSBCTEtfTk9UX0ZPVU5EKSB8fCAobmV3X2JsayA9PSBCTEtfTk9UX0ZPVU5EKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJb2xkX3BhZ2UgPSAob2xkX2JsayA8PCB4ZF9jYXJkLT5ibG9ja19zaGlmdCkgKyBzdGFydF9wYWdlOwogCW5ld19wYWdlID0gKG5ld19ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKIAogCVhEX0NMUl9CQURfTkVXQkxLKHhkX2NhcmQpOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9EQVRBX1NPVVJDRSwgMHgwMSwgUElOR1BPTkdfQlVGRkVSKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCisJCQkJICAgICBQSU5HUE9OR19CVUZGRVIpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlmb3IgKGkgPSBzdGFydF9wYWdlOyBpIDwgZW5kX3BhZ2U7IGkrKykgewogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXJ0c3hfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CkBAIC0xMTAwLDcgKzEyNTcsOCBAQAogCQkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLAogCQkJCQlYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfTk9fQ0FSRCk7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAKIAkJCQlpZiAoKChyZWcgJiAoWERfRUNDMV9FUlJPUiB8IFhEX0VDQzFfVU5DT1JSRUNUQUJMRSkpID09CkBAIC0xMTE5LDcgKzEyNzcsOCBAQAogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1RPX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKQEAgLTExNDcsNyArMTMwNiw4IEBACiAJCQl9IGVsc2UgewogCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7CiAJCQl9Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCW9sZF9wYWdlKys7CkBAIC0xMTcyLDE0ICsxMzMyLDE3IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgWERfQ1RMLCAwLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgWERfQ0FSRCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcHRyID0gcnRzeF9nZXRfY21kX2RhdGEoY2hpcCkgKyAxOwogCWlmICgoKHB0clswXSAmIFJFQURZX0ZMQUcpID09IFJFQURZX1NUQVRFKSAmJiAocHRyWzFdICYgWERfUkRZKSkKIAkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCi0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAogc3RhdGljIGludCB4ZF9lcmFzZV9ibG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MzIgcGh5X2JsaykKQEAgLTExODksOCArMTM1MiwxMCBAQAogCXU4IHJlZyA9IDAsICpwdHI7CiAJaW50IGksIHJldHZhbDsKIAotCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHBoeV9ibGsgPT0gQkxLX05PVF9GT1VORCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcGFnZV9hZGRyID0gcGh5X2JsayA8PCB4ZF9jYXJkLT5ibG9ja19zaGlmdDsKIApAQCAtMTIxMiwxMyArMTM3NywxNiBAQAogCQkJaWYgKHJlZyAmIFBST0dSQU1fRVJST1IpIHsKIAkJCQl4ZF9tYXJrX2JhZF9ibG9jayhjaGlwLCBwaHlfYmxrKTsKIAkJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfUFJHX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfSBlbHNlIHsKIAkJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfRVJBU0VfRkFJTCk7CiAJCQl9CiAJCQlyZXR2YWwgPSB4ZF9yZXNldF9jbWQoY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xMjI2LDcgKzEzOTQsOCBAQAogCQlpZiAoKnB0ciAmIFBST0dSQU1fRVJST1IpIHsKIAkJCXhkX21hcmtfYmFkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOwogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1BSR19FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTEyMzQsNyArMTQwMyw4IEBACiAKIAl4ZF9tYXJrX2JhZF9ibG9jayhjaGlwLCBwaHlfYmxrKTsKIAl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfRVJBU0VfRkFJTCk7Ci0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAogCkBAIC0xMjY2LDE1ICsxNDM2LDE5IEBACiAKIAlpZiAoem9uZS0+bDJwX3RhYmxlID09IE5VTEwpIHsKIAkJem9uZS0+bDJwX3RhYmxlID0gdm1hbGxvYygyMDAwKTsKLQkJaWYgKHpvbmUtPmwycF90YWJsZSA9PSBOVUxMKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBCdWlsZF9GYWlsKTsKKwkJaWYgKHpvbmUtPmwycF90YWJsZSA9PSBOVUxMKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBCdWlsZF9GYWlsOworCQl9CiAJfQogCW1lbXNldCgodTggKikoem9uZS0+bDJwX3RhYmxlKSwgMHhmZiwgMjAwMCk7CiAKIAlpZiAoem9uZS0+ZnJlZV90YWJsZSA9PSBOVUxMKSB7CiAJCXpvbmUtPmZyZWVfdGFibGUgPSB2bWFsbG9jKFhEX0ZSRUVfVEFCTEVfQ05UICogMik7Ci0JCWlmICh6b25lLT5mcmVlX3RhYmxlID09IE5VTEwpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIEJ1aWxkX0ZhaWwpOworCQlpZiAoem9uZS0+ZnJlZV90YWJsZSA9PSBOVUxMKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBCdWlsZF9GYWlsOworCQl9CiAJfQogCW1lbXNldCgodTggKikoem9uZS0+ZnJlZV90YWJsZSksIDB4ZmYsIFhEX0ZSRUVfVEFCTEVfQ05UICogMik7CiAKQEAgLTE0NDAsOCArMTYxNCwxMCBAQAogCQlYRF9UUkFOU0ZFUl9FTkQsIFhEX1RSQU5TRkVSX0VORCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFhEX0NBUkQsIDIwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTE0NTcsOCArMTYzMywxMCBAQAogCXU4IHJlZ192YWwsIHBhZ2VfY250OwogCWludCB6b25lX25vLCByZXR2YWwsIGk7CiAKLQlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXBhZ2VfY250ID0gZW5kX3BhZ2UgLSBzdGFydF9wYWdlOwogCXpvbmVfbm8gPSAoaW50KShsb2dfYmxrIC8gMTAwMCk7CkBAIC0xNDc0LDcgKzE2NTIsOCBAQAogCiAJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfTk9fQ0FSRCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCX0KQEAgLTE1MDksMjEgKzE2ODgsMzEgQEAKIAogCQlpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfSBlbHNlIHsKLQkJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBGYWlsOwogCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCiBGYWlsOgotCVJUU1hfUkVBRF9SRUcoY2hpcCwgWERfUEFHRV9TVEFUVVMsICZyZWdfdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfUEFHRV9TVEFUVVMsICZyZWdfdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKHJlZ192YWwgIT0gIFhEX0dQRykKIAkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1BSR19FUlJPUik7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX0NUTCwgJnJlZ192YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9DVEwsICZyZWdfdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKCgocmVnX3ZhbCAmIChYRF9FQ0MxX0VSUk9SIHwgWERfRUNDMV9VTkNPUlJFQ1RBQkxFKSkKIAkJCQk9PSAoWERfRUNDMV9FUlJPUiB8IFhEX0VDQzFfVU5DT1JSRUNUQUJMRSkpCkBAIC0xNTMzLDcgKzE3MjIsOCBAQAogCiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfRUNDX0VSUk9SKTsKQEAgLTE1NDEsNyArMTczMSw4IEBACiAJCW5ld19ibGsgPSB4ZF9nZXRfdW51c2VkX2Jsb2NrKGNoaXAsIHpvbmVfbm8pOwogCQlpZiAobmV3X2JsayA9PSBOT19ORVdfQkxLKSB7CiAJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcmV0dmFsID0geGRfY29weV9wYWdlKGNoaXAsIHBoeV9ibGssIG5ld19ibGssIDAsCkBAIC0xNTU1LDcgKzE3NDYsOCBAQAogCQkJCVhEX0NMUl9CQURfTkVXQkxLKHhkX2NhcmQpOwogCQkJfQogCQkJWERfQ0xSX0JBRF9PTERCTEsoeGRfY2FyZCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCQl4ZF9zZXRfbDJwX3RibChjaGlwLCB6b25lX25vLCBsb2dfb2ZmLCAodTE2KShuZXdfYmxrICYgMHgzRkYpKTsKIAkJeGRfZXJhc2VfYmxvY2soY2hpcCwgcGh5X2Jsayk7CkBAIC0xNTYzLDcgKzE3NTUsOCBAQAogCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKIAl9CiAKLQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJ0c3hfdHJhY2UoY2hpcCk7CisJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCiBzdGF0aWMgaW50IHhkX2ZpbmlzaF93cml0ZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLApAQCAtMTU3Niw4ICsxNzY5LDEwIEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgInhkX2ZpbmlzaF93cml0ZSwgb2xkX2JsayA9IDB4JXgsIG5ld19ibGsgPSAweCV4LCBsb2dfYmxrID0gMHgleFxuIiwKIAkJb2xkX2JsaywgbmV3X2JsaywgbG9nX2Jsayk7CiAKLQlpZiAocGFnZV9vZmYgPiB4ZF9jYXJkLT5wYWdlX29mZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocGFnZV9vZmYgPiB4ZF9jYXJkLT5wYWdlX29mZikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJem9uZV9ubyA9IChpbnQpKGxvZ19ibGsgLyAxMDAwKTsKIAlsb2dfb2ZmID0gKHUxNikobG9nX2JsayAlIDEwMDApOwpAQCAtMTU4OSw3ICsxNzg0LDggQEAKIAkJCXJldHZhbCA9IHhkX2VyYXNlX2Jsb2NrKGNoaXAsIG5ld19ibGspOwogCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCQl4ZF9zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIG5ld19ibGspOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9IGVsc2UgewogCQlyZXR2YWwgPSB4ZF9jb3B5X3BhZ2UoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywKQEAgLTE2MDEsNyArMTc5Nyw4IEBACiAJCQkJCXhkX3NldF91bnVzZWRfYmxvY2soY2hpcCwgbmV3X2Jsayk7CiAJCQl9CiAJCQlYRF9DTFJfQkFEX05FV0JMSyh4ZF9jYXJkKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcmV0dmFsID0geGRfZXJhc2VfYmxvY2soY2hpcCwgb2xkX2Jsayk7CkBAIC0xNjMzLDggKzE4MzAsMTAgQEAKIAogCWlmIChwYWdlX29mZikgewogCQlyZXR2YWwgPSB4ZF9jb3B5X3BhZ2UoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywgMCwgcGFnZV9vZmYpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE2NTUsOCArMTg1NCwxMCBAQAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICIlcywgb2xkX2JsayA9IDB4JXgsIG5ld19ibGsgPSAweCV4LCBsb2dfYmxrID0gMHgleFxuIiwKIAkJX19mdW5jX18sIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGspOwogCi0JaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsKIAl6b25lX25vID0gKGludCkobG9nX2JsayAvIDEwMDApOwpAQCAtMTY2NSw4ICsxODY2LDEwIEBACiAJcGFnZV9hZGRyID0gKG5ld19ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKIAogCXJldHZhbCA9IHhkX3NlbmRfY21kKGNoaXAsIFJFQUQxXzEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMTcwMSw5ICsxOTA0LDExIEBACiAKIAkJaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKSB7CiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0gZWxzZSB7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIEZhaWwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gRmFpbDsKIAkJfQogCX0KIApAQCAtMTczMCwxMyArMTkzNSwxOCBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAogRmFpbDoKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX0RBVCwgJnJlZ192YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9EQVQsICZyZWdfdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWlmIChyZWdfdmFsICYgUFJPR1JBTV9FUlJPUikgewogCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfUFJHX0VSUk9SKTsKIAkJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgbmV3X2Jsayk7CiAJfQogCi0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAogI2lmZGVmIFhEX0RFTEFZX1dSSVRFCkBAIC0xNzQ5LDE2ICsxOTU5LDIwIEBACiAJaWYgKGRlbGF5X3dyaXRlLT5kZWxheV93cml0ZV9mbGFnKSB7CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJ4ZF9kZWxheV93cml0ZVxuIik7CiAJCXJldHZhbCA9IHhkX3N3aXRjaF9jbG9jayhjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZyA9IDA7CiAJCXJldHZhbCA9IHhkX2ZpbmlzaF93cml0ZShjaGlwLAogCQkJCWRlbGF5X3dyaXRlLT5vbGRfcGh5YmxvY2ssCiAJCQkJCWRlbGF5X3dyaXRlLT5uZXdfcGh5YmxvY2ssCiAJCQkJZGVsYXlfd3JpdGUtPmxvZ2Jsb2NrLCBkZWxheV93cml0ZS0+cGFnZW9mZik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTc5MCwxNCArMjAwNCwxNyBAQAogCXB0ciA9ICh1OCAqKXNjc2lfc2dsaXN0KHNyYik7CiAKIAlyZXR2YWwgPSB4ZF9zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAogCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQljaGlwLT5jYXJkX2ZhaWwgfD0gWERfQ0FSRDsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWxvZ19ibGsgPSBzdGFydF9zZWN0b3IgPj4geGRfY2FyZC0+YmxvY2tfc2hpZnQ7CkBAIC0xODEwLDcgKzIwMjcsOCBAQAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQljaGlwLT5jYXJkX2ZhaWwgfD0gWERfQ0FSRDsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMTgyOCw3ICsyMDQ2LDggQEAKIAkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0KIAkJCX0KIAkJCW9sZF9ibGsgPSBkZWxheV93cml0ZS0+b2xkX3BoeWJsb2NrOwpAQCAtMTg0NCw3ICsyMDYzLDggQEAKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogI2VuZGlmCiAJCQlvbGRfYmxrID0geGRfZ2V0X2wycF90YmwoY2hpcCwgem9uZV9ubywgbG9nX29mZik7CkBAIC0xODUzLDcgKzIwNzMsOCBAQAogCQkJCShuZXdfYmxrID09IEJMS19OT1RfRk9VTkQpKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJcmV0dmFsID0geGRfcHJlcGFyZV93cml0ZShjaGlwLCBvbGRfYmxrLCBuZXdfYmxrLApAQCAtMTg2MywxMSArMjA4NCwxMyBAQAogCQkJCQlTVEFUVVNfU1VDQ0VTUykgewogCQkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0KIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogI2lmZGVmIFhEX0RFTEFZX1dSSVRFCiAJCX0KQEAgLTE4NzksMTEgKzIxMDIsMTMgQEAKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogI2VuZGlmCiAKQEAgLTE4OTEsNyArMjExNiw4IEBACiAJCWlmIChvbGRfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMTkwMSw3ICsyMTI3LDggQEAKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQljaGlwLT5jYXJkX2ZhaWwgfD0gWERfQ0FSRDsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCWlmICgoc3RhcnRfcGFnZSArIHRvdGFsX3NlY19jbnQpID4gKHhkX2NhcmQtPnBhZ2Vfb2ZmICsgMSkpCkBAIC0xOTE3LDcgKzIxNDQsOCBAQAogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlyZXR2YWwgPSB4ZF93cml0ZV9tdWx0aXBsZV9wYWdlcyhjaGlwLCBvbGRfYmxrLApAQCAtMTkyNyw3ICsyMTU1LDggQEAKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKQEAgLTE5NDgsNyArMjE3Nyw4IEBACiAJCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IFhEX0NBUkQ7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKQEAgLTE5NjEsNyArMjE5MSw4IEBACiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CiAKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewpAQCAtMTk2OSw3ICsyMjAwLDggQEAKIAkJCWlmIChuZXdfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKQEAgLTE5ODgsNyArMjIyMCw4IEBACiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IFhEX0NBUkQ7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSB4ZF9maW5pc2hfd3JpdGUoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywKQEAgLTE5OTcsMTAgKzIyMzAsMTIgQEAKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KICNlbmRpZgogCX0KQEAgLTIwNDksMjUgKzIyODQsMzkgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gZGlzYWJsZV9jYXJkX2Nsb2NrKGNoaXAsIFhEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9PRSwgWERfT1VUUFVUX0VOLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIFhEX09VVFBVVF9FTiwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmICghY2hpcC0+ZnQyX2Zhc3RfbW9kZSkgewogCQlyZXR2YWwgPSBjYXJkX3Bvd2VyX29mZihjaGlwLCBYRF9DQVJEKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQl3YWl0X3RpbWVvdXQoNTApOwogCX0KIAogCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKIAkJcmV0dmFsID0geGRfcHVsbF9jdGxfZGlzYWJsZShjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9IGVsc2UgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUEdBX1BVTExfQ1RMLCAweEZGLCAweERGKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUEdBX1BVTExfQ1RMLCAweEZGLCAweERGKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0yMDg3LDggKzIzMzYsMTAgQEAKIAl4ZF9mcmVlX2wycF90YmwoY2hpcCk7CiAKIAlyZXR2YWwgPSB4ZF9wb3dlcl9vZmZfY2FyZDN2MyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9za2Vpbi9za2Vpbl9ibG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL3NrZWluL3NrZWluX2Jsb2NrLmMKaW5kZXggOWJkNjljZS4uYjBjZDkzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NrZWluL3NrZWluX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NrZWluL3NrZWluX2Jsb2NrLmMKQEAgLTY4LDkgKzY4LDcgQEAKIAogI2lmIFNLRUlOX1VOUk9MTF8yNTYgPT0gMAogI2RlZmluZSBSMjU2KHAwLCBwMSwgcDIsIHAzLCBST1QsIHJfbnVtKSAvKiBmdWxseSB1bnJvbGxlZCAqLyBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlST1VORDI1NihwMCwgcDEsIHAyLCBwMywgUk9ULCByX251bSk7ICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQorCVJPVU5EMjU2KHAwLCBwMSwgcDIsIHAzLCBST1QsIHJfbnVtKQogCiAjZGVmaW5lIEkyNTYoUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTUyLDkgKzE1MCw3IEBACiAKICNpZiBTS0VJTl9VTlJPTExfNTEyID09IDAKICNkZWZpbmUgUjUxMihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIFJPVCwgcl9udW0pIC8qIHVucm9sbGVkICovIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlST1VORDUxMihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIFJPVCwgcl9udW0pOyAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKKwlST1VORDUxMihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIFJPVCwgcl9udW0pCiAKICNkZWZpbmUgSTUxMihSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKaW5kZXggNDJkNjJlZi4uYzJiZGExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwpAQCAtODQsNyArODQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC05OSw4ICs5OCw3IEBACiAjaW5jbHVkZSAic2xpYy5oIgogCiBzdGF0aWMgdWludCBzbGljX2ZpcnN0X2luaXQgPSAxOwotc3RhdGljIGNoYXIgKnNsaWNfYmFubmVyID0gIkFsYWNyaXRlY2ggU0xJQyBUZWNobm9sb2d5KHRtKSBTZXJ2ZXIgIgotCQkiYW5kIFN0b3JhZ2UgQWNjZWxlcmF0b3IgKE5vbi1BY2NlbGVyYXRlZCkiOworc3RhdGljIGNoYXIgKnNsaWNfYmFubmVyID0gIkFsYWNyaXRlY2ggU0xJQyBUZWNobm9sb2d5KHRtKSBTZXJ2ZXIgYW5kIFN0b3JhZ2UgQWNjZWxlcmF0b3IgKE5vbi1BY2NlbGVyYXRlZCkiOwogCiBzdGF0aWMgY2hhciAqc2xpY19wcm9jX3ZlcnNpb24gPSAiMi4wLjM1MSAgMjAwNi8wNy8xNCAxMjoyNjowMCI7CiAKQEAgLTE2Niw3ICsxNjQsNyBAQAogCS8qIEdldCB0aGUgQ1JDIHBvbHlub21pYWwgZm9yIHRoZSBtYWMgYWRkcmVzcyAqLwogCS8qIHdlIHVzZSBiaXRzIDEtOCAobHNiKSwgYml0d2lzZSByZXZlcnNlZCwKIAkgKiBtc2IgKD0gbHNiIGJpdCAwIGJlZm9yZSBiaXRyZXYpIGlzIGF1dG9tYXRpY2FsbHkgZGlzY2FyZGVkICovCi0JY3JjcG9seSA9IChldGhlcl9jcmMoRVRIX0FMRU4sIGFkZHJlc3MpPj4yMyk7CisJY3JjcG9seSA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcmVzcyk+PjIzOwogCiAJLyogV2Ugb25seSBoYXZlIHNwYWNlIG9uIHRoZSBTTElDIGZvciA2NCBlbnRyaWVzLiAgTG9wCiAJICogb2ZmIHRoZSB0b3AgdHdvIGJpdHMuICgyXjYgPSA2NCkKQEAgLTE4NTIsNyArMTg1MCw3IEBACiAKIAlpaGNtZCA9ICZoY21kLT5jbWQ2NDsKIAotCWloY21kLT5mbGFncyA9IChhZGFwdGVyLT5wb3J0IDw8IElIRkxHX0lGU0hGVCk7CisJaWhjbWQtPmZsYWdzID0gYWRhcHRlci0+cG9ydCA8PCBJSEZMR19JRlNIRlQ7CiAJaWhjbWQtPmNvbW1hbmQgPSBJSENNRF9YTVRfUkVROwogCWloY21kLT51LnNsaWNfYnVmZmVycy50b3RsZW4gPSBza2ItPmxlbjsKIAlwaHlzX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5wY2lkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCkBAIC0xODY0LDggKzE4NjIsOCBAQAogCWhjbWQtPmNtZHNpemUgPSAodTMyKSAoKCgodTY0KSZpaGNtZC0+dS5zbGljX2J1ZmZlcnMuYnVmc1sxXSAtCiAJCQkJICAgICAodTY0KSBoY21kKSArIDMxKSA+PiA1KTsKICNlbHNlCi0JaGNtZC0+Y21kc2l6ZSA9ICgoKCh1MzIpICZpaGNtZC0+dS5zbGljX2J1ZmZlcnMuYnVmc1sxXSAtCi0JCQkgICAodTMyKSBoY21kKSArIDMxKSA+PiA1KTsKKwloY21kLT5jbWRzaXplID0gKCgodTMyKSZpaGNtZC0+dS5zbGljX2J1ZmZlcnMuYnVmc1sxXSAtCisJCQkJICAgICAgICh1MzIpaGNtZCkgKyAzMSkgPj4gNTsKICNlbmRpZgogfQogCkBAIC0yMzE1LDkgKzIzMTMsOCBAQAogCX0KIAlyYyA9IHNsaWNfYWRhcHRlcl9hbGxvY3Jlc291cmNlcyhhZGFwdGVyKTsKIAlpZiAocmMpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsCi0JCQkiJXM6IHNsaWNfYWRhcHRlcl9hbGxvY3Jlc291cmNlcyBGQUlMRUQgJXhcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgInNsaWNfYWRhcHRlcl9hbGxvY3Jlc291cmNlcyBGQUlMRUQgJXhcbiIsCisJCQlyYyk7CiAJCXNsaWNfYWRhcHRlcl9mcmVlcmVzb3VyY2VzKGFkYXB0ZXIpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0yMzYyLDIyICsyMzU5LDE5IEBACiAKIAlhZGFwdGVyLT5zdGF0ZSA9IEFEQVBUX1VQOwogCWlmICghY2FyZC0+bG9hZHRpbWVyc2V0KSB7Ci0JCWluaXRfdGltZXIoJmNhcmQtPmxvYWR0aW1lcik7CisJCXNldHVwX3RpbWVyKCZjYXJkLT5sb2FkdGltZXIsICZzbGljX3RpbWVyX2xvYWRfY2hlY2ssCisJCQkgICAgKHVsb25nKWNhcmQpOwogCQljYXJkLT5sb2FkdGltZXIuZXhwaXJlcyA9CiAJCSAgICBqaWZmaWVzICsgKFNMSUNfTE9BRFRJTUVSX1BFUklPRCAqIEhaKTsKLQkJY2FyZC0+bG9hZHRpbWVyLmRhdGEgPSAodWxvbmcpIGNhcmQ7Ci0JCWNhcmQtPmxvYWR0aW1lci5mdW5jdGlvbiA9ICZzbGljX3RpbWVyX2xvYWRfY2hlY2s7CiAJCWFkZF90aW1lcigmY2FyZC0+bG9hZHRpbWVyKTsKIAogCQljYXJkLT5sb2FkdGltZXJzZXQgPSAxOwogCX0KIAogCWlmICghYWRhcHRlci0+cGluZ3RpbWVyc2V0KSB7Ci0JCWluaXRfdGltZXIoJmFkYXB0ZXItPnBpbmd0aW1lcik7CisJCXNldHVwX3RpbWVyKCZhZGFwdGVyLT5waW5ndGltZXIsICZzbGljX3RpbWVyX3BpbmcsICh1bG9uZylkZXYpOwogCQlhZGFwdGVyLT5waW5ndGltZXIuZXhwaXJlcyA9CiAJCSAgICBqaWZmaWVzICsgKFBJTkdfVElNRVJfSU5URVJWQUwgKiBIWik7Ci0JCWFkYXB0ZXItPnBpbmd0aW1lci5kYXRhID0gKHVsb25nKSBkZXY7Ci0JCWFkYXB0ZXItPnBpbmd0aW1lci5mdW5jdGlvbiA9ICZzbGljX3RpbWVyX3Bpbmc7CiAJCWFkZF90aW1lcigmYWRhcHRlci0+cGluZ3RpbWVyKTsKIAkJYWRhcHRlci0+cGluZ3RpbWVyc2V0ID0gMTsKIAkJYWRhcHRlci0+Y2FyZC0+cGluZ3N0YXR1cyA9IElTUl9QSU5HTUFTSzsKQEAgLTI1NTQsNDYgKzI1NDgsMTEgQEAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHJxLT5pZnJfZGF0YSwgMjgpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWludGFnZyA9IGRhdGFbMF07Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiJXM6IHNldCBpbnRlcnJ1cHQgYWdncmVnYXRpb24gdG8gJWRcbiIsCi0JCQlfX2Z1bmNfXywgaW50YWdnKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJzZXQgaW50ZXJydXB0IGFnZ3JlZ2F0aW9uIHRvICVkXG4iLAorCQkJaW50YWdnKTsKIAkJc2xpY19pbnRhZ2dfc2V0KGFkYXB0ZXIsIGludGFnZyk7CiAJCXJldHVybiAwOwogCi0jaWZkZWYgU0xJQ19UUkFDRV9EVU1QX0VOQUJMRUQKLQljYXNlIFNJT0NTTElDVFJBQ0VEVU1QOgotCQl7Ci0JCQl1MzIgdmFsdWU7Ci0KLQkJCURCR19JT0NUTCgic2xpY19pb2N0bCAgU0lPQ1NMSUNfVFJBQ0VfRFVNUFxuIik7Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBycS0+aWZyX2RhdGEsIDI4KSkgewotCQkJCVBSSU5UX0VSUk9SCi0JCQkJICAgICgic2xpYzogY29weV9mcm9tX3VzZXIgRkFJTEVEIGdldHRpbmcgaW5pdGlhbCBzaW1iYSBwYXJhbVxuIik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJCXZhbHVlID0gZGF0YVswXTsKLQkJCWlmICh0cmFjZW1vbl9yZXF1ZXN0ID09IFNMSUNfRFVNUF9ET05FKSB7Ci0JCQkJUFJJTlRfRVJST1IKLQkJCQkgICAgKCJBVEsgRGlhZ25vc3RpYyBUcmFjZSBEdW1wIFJlcXVlc3RlZFxuIik7Ci0JCQkJdHJhY2Vtb25fcmVxdWVzdCA9IFNMSUNfRFVNUF9SRVFVRVNURUQ7Ci0JCQkJdHJhY2Vtb25fcmVxdWVzdF90eXBlID0gdmFsdWU7Ci0JCQkJdHJhY2Vtb25fdGltZXN0YW1wID0gamlmZmllczsKLQkJCX0gZWxzZSBpZiAoKHRyYWNlbW9uX3JlcXVlc3QgPT0gU0xJQ19EVU1QX1JFUVVFU1RFRCkgfHwKLQkJCQkgICAodHJhY2Vtb25fcmVxdWVzdCA9PQotCQkJCSAgICBTTElDX0RVTVBfSU5fUFJPR1JFU1MpKSB7Ci0JCQkJUFJJTlRfRVJST1IKLQkJCQkgICAgKCJBVEsgRGlhZ25vc3RpYyBUcmFjZSBEdW1wIFJlcXVlc3RlZCBidXQgYWxyZWFkeSBpbiBwcm9ncmVzcy4uLiBpZ25vcmVcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlQUklOVF9FUlJPUgotCQkJCSAgICAoIkFUSyBEaWFnbm9zdGljIFRyYWNlIER1bXAgUmVxdWVzdGVkXG4iKTsKLQkJCQl0cmFjZW1vbl9yZXF1ZXN0ID0gU0xJQ19EVU1QX1JFUVVFU1RFRDsKLQkJCQl0cmFjZW1vbl9yZXF1ZXN0X3R5cGUgPSB2YWx1ZTsKLQkJCQl0cmFjZW1vbl90aW1lc3RhbXAgPSBqaWZmaWVzOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLSNlbmRpZgogCWNhc2UgU0lPQ0VUSFRPT0w6CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmZWNtZCwgcnEtPmlmcl9kYXRhLCBzaXplb2YoZWNtZCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBkMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACitjb25maWcgRkJfU003NTAKKwl0cmlzdGF0ZSAiU2lsaWNvbiBNb3Rpb24gU003NTAgZnJhbWVidWZmZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIFBDSQorCWhlbHAKKwkgIEZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIHRoZSBTaWxpY29uIE1vdGlvbiBTTTc1MCBjaGlwCisJICB3aXRoIDJEIGFjY2VsZWFyaW9uIGFuZCBkdWFsIGhlYWQgc3VwcG9ydC4KKworCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuIFRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHNtNzUwZmIuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNCisJICBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZTNmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb2JqLSQoQ09ORklHX0ZCX1NNNzUwKQkrPSBzbTc1MGZiLm8KKworc203NTBmYi1vYmpzCQk6PSBzbTc1MC5vIHNtNzUwX2h3Lm8gc203NTBfYWNjZWwubyBzbTc1MF9jdXJzb3IubyBkZGs3NTBfY2hpcC5vIGRkazc1MF9wb3dlci5vIGRkazc1MF9tb2RlLm8KK3NtNzUwZmItb2JqcwkJKz0gZGRrNzUwX2Rpc3BsYXkubyBkZGs3NTBfaGVscC5vIGRkazc1MF9zd2kyYy5vIGRkazc1MF9zaWkxNjQubyBkZGs3NTBfZHZpLm8gZGRrNzUwX2h3aTJjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTYxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9UT0RPCkBAIC0wLDAgKzEsMTUgQEAKK1RPRE86CistIGxvdHMgb2YgY2xlY2hwYXRjaCBjbGVhbnVwCistIHVzZSBrZXJuZWwgY29kaW5nIHN0eWxlCistIHJlZmluZSB0aGUgY29kZSBhbmQgcmVtb3ZlIHVudXNlZCBjb2RlCistIGNoZWNrIG9uIGhhcmR3YXJlIGVmZmVjdHMgb2YgcmVtb3ZhbCBvZiBVU0VfSFdfSTJDIGFuZCBVU0VfRFZJQ0hJUCAodGhlc2UgdHdvCisJYXJlIHN1cHBvc2VkIHRvIGJlIHNhbXBsZSBjb2RlIHdoaWNoIGlzIGdpdmVuIGhlcmUgaWYgc29tZW9uZSB3YW50cyB0bworCXVzZSB0aG9zZSBmdW5jdGlvbmFsaXRpZXMpCistIG1vdmUgaXQgdG8gZHJpdmVycy92aWRlby9mYmRldgorLSBtb2RpZnkgdGhlIGNvZGUgZm9yIGRybSBmcmFtZXdvcmsKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgdG8KKwlHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorCVN1ZGlwIE11a2hlcmplZSA8c3VkaXBtLm11a2hlcmplZUBnbWFpbC5jb20+CisJVGVkZHkgV2FuZyA8dGVkZHkud2FuZ0BzaWxpY29ubW90aW9uLmNvbT4KKwlTdWRpcCBNdWtoZXJqZWUgPHN1ZGlwQHZlY3RvcmluZGlhLm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxMGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgRERLNzUwX0hfXworI2RlZmluZSBEREs3NTBfSF9fCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBieSBTaWxpY29uIE1vdGlvbiwgSW5jLiAoU01JKQorKgorKiAgQWxsIHJpZ2h0cyBhcmUgcmVzZXJ2ZWQuIFJlcHJvZHVjdGlvbiBvciBpbiBwYXJ0IGlzIHByb2hpYml0ZWQKKyogIHdpdGhvdXQgdGhlIHdyaXR0ZW4gY29uc2VudCBvZiB0aGUgY29weXJpZ2h0IG93bmVyLgorKgorKiAgUmVnU0MuaCAtLS0gU003MTggU0RLCisqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJkZGs3NTBfcmVnLmgiCisjaW5jbHVkZSAiZGRrNzUwX21vZGUuaCIKKyNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgorI2luY2x1ZGUgImRkazc1MF9kaXNwbGF5LmgiCisjaW5jbHVkZSAiZGRrNzUwX3Bvd2VyLmgiCisjaW5jbHVkZSAiZGRrNzUwX2hlbHAuaCIKKyNpZmRlZiBVU0VfSFdfSTJDCisjaW5jbHVkZSAiZGRrNzUwX2h3aTJjLmgiCisjZW5kaWYKKyNpbmNsdWRlICJkZGs3NTBfc3dpMmMuaCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyODMyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmMKQEAgLTAsMCArMSw2MjIgQEAKKyNpbmNsdWRlICJkZGs3NTBfaGVscC5oIgorI2luY2x1ZGUgImRkazc1MF9yZWcuaCIKKyNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgorI2luY2x1ZGUgImRkazc1MF9wb3dlci5oIgordHlwZWRlZiBzdHJ1Y3QgX3BsbGNhbHBhcmFtIHsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyOy8qIGQgOiAwfiA2Ki8KKwl1bnNpZ25lZCBjaGFyIHBvZDsKKwl1bnNpZ25lZCBjaGFyIG9kOworCXVuc2lnbmVkIGNoYXIgdmFsdWU7LyogdmFsdWUgb2YgIDIgcG93ZXIgZCAoMl5kKSAqLworfQorcGxsY2FscGFyYW07CisKKworbG9naWNhbF9jaGlwX3R5cGVfdCBnZXRDaGlwVHlwZSh2b2lkKQoreworCXVuc2lnbmVkIHNob3J0IHBoeXNpY2FsSUQ7CisJY2hhciBwaHlzaWNhbFJldjsKKwlsb2dpY2FsX2NoaXBfdHlwZV90IGNoaXA7CisKKwlwaHlzaWNhbElEID0gZGV2SWQ3NTA7Ly9laXRoZXIgMHg3MTggb3IgMHg3NTAKKwlwaHlzaWNhbFJldiA9IHJldklkNzUwOworCisJaWYgKHBoeXNpY2FsSUQgPT0gMHg3MTgpCisJCWNoaXAgPSBTTTcxODsKKwllbHNlIGlmIChwaHlzaWNhbElEID09IDB4NzUwKSB7CisJCWNoaXAgPSBTTTc1MDsKKwkJLyogU003NTAgYW5kIFNNNzUwTEUgYXJlIGRpZmZlcmVudCBpbiB0aGVpciByZXZpc2lvbiBJRCBvbmx5LiAqLworCQlpZiAocGh5c2ljYWxSZXYgPT0gU003NTBMRV9SRVZJU0lPTl9JRCkKKwkJCWNoaXAgPSBTTTc1MExFOworCX0gZWxzZQorCQljaGlwID0gU01fVU5LTk9XTjsKKworCXJldHVybiBjaGlwOworfQorCisKK2lubGluZSB1bnNpZ25lZCBpbnQgdHdvVG9Qb3dlck9meCh1bnNpZ25lZCBsb25nIHgpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMTsKKworCWZvciAoaSA9IDE7IGkgPD0geDsgaSsrKQorCQlyZXN1bHQgKj0gMjsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNQTEwocGxsX3ZhbHVlX3QgKnBQTEwpCit7CisJcmV0dXJuIChwUExMLT5pbnB1dEZyZXEgKiBwUExMLT5NIC8gcFBMTC0+TiAvIHR3b1RvUG93ZXJPZngocFBMTC0+T0QpIC8gdHdvVG9Qb3dlck9meChwUExMLT5QT0QpKTsKK30KKwordW5zaWduZWQgaW50IGdldFBsbFZhbHVlKGNsb2NrX3R5cGVfdCBjbG9ja1R5cGUsIHBsbF92YWx1ZV90ICpwUExMKQoreworCXVuc2lnbmVkIGludCB1bFBsbFJlZyA9IDA7CisKKwlwUExMLT5pbnB1dEZyZXEgPSBERUZBVUxUX0lOUFVUX0NMT0NLOworCXBQTEwtPmNsb2NrVHlwZSA9IGNsb2NrVHlwZTsKKworCXN3aXRjaCAoY2xvY2tUeXBlKSB7CisJY2FzZSBNWENMS19QTEw6CisJCXVsUGxsUmVnID0gUEVFSzMyKE1YQ0xLX1BMTF9DVFJMKTsKKwkJYnJlYWs7CisJY2FzZSBQUklNQVJZX1BMTDoKKwkJdWxQbGxSZWcgPSBQRUVLMzIoUEFORUxfUExMX0NUUkwpOworCQlicmVhazsKKwljYXNlIFNFQ09OREFSWV9QTEw6CisJCXVsUGxsUmVnID0gUEVFSzMyKENSVF9QTExfQ1RSTCk7CisJCWJyZWFrOworCWNhc2UgVkdBMF9QTEw6CisJCXVsUGxsUmVnID0gUEVFSzMyKFZHQV9QTEwwX0NUUkwpOworCQlicmVhazsKKwljYXNlIFZHQTFfUExMOgorCQl1bFBsbFJlZyA9IFBFRUszMihWR0FfUExMMV9DVFJMKTsKKwkJYnJlYWs7CisJfQorCisJcFBMTC0+TSA9IEZJRUxEX0dFVCh1bFBsbFJlZywgUEFORUxfUExMX0NUUkwsIE0pOworCXBQTEwtPk4gPSBGSUVMRF9HRVQodWxQbGxSZWcsIFBBTkVMX1BMTF9DVFJMLCBOKTsKKwlwUExMLT5PRCA9IEZJRUxEX0dFVCh1bFBsbFJlZywgUEFORUxfUExMX0NUUkwsIE9EKTsKKwlwUExMLT5QT0QgPSBGSUVMRF9HRVQodWxQbGxSZWcsIFBBTkVMX1BMTF9DVFJMLCBQT0QpOworCisJcmV0dXJuIGNhbGNQTEwocFBMTCk7Cit9CisKKwordW5zaWduZWQgaW50IGdldENoaXBDbG9jayh2b2lkKQoreworCXBsbF92YWx1ZV90IHBsbDsKKyNpZiAxCisJaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkJcmV0dXJuIE1IeigxMzApOworI2VuZGlmCisKKwlyZXR1cm4gZ2V0UGxsVmFsdWUoTVhDTEtfUExMLCAmcGxsKTsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXQgdXAgdGhlIG1haW4gY2hpcCBjbG9jay4KKyAqCisgKiBJbnB1dDogRnJlcXVlbmN5IHRvIGJlIHNldC4KKyAqLwordm9pZCBzZXRDaGlwQ2xvY2sodW5zaWduZWQgaW50IGZyZXF1ZW5jeSkKK3sKKwlwbGxfdmFsdWVfdCBwbGw7CisJdW5zaWduZWQgaW50IHVsQWN0dWFsTXhDbGs7CisjaWYgMQorCS8qIENoZW9rXzA1MDk6IEZvciBTTTc1MExFLCB0aGUgY2hpcCBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCisJaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlpZiAoZnJlcXVlbmN5KSB7CisJCS8qCisJCSogU2V0IHVwIFBMTCwgYSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgdmFsdWUgdG8gYmUgc2V0IGluIGNsb2Nrcy4KKwkJKi8KKwkJcGxsLmlucHV0RnJlcSA9IERFRkFVTFRfSU5QVVRfQ0xPQ0s7IC8qIERlZmluZWQgaW4gQ0xPQ0suSCAqLworCQlwbGwuY2xvY2tUeXBlID0gTVhDTEtfUExMOworCisJCS8qCisJCSogQ2FsbCBjYWxjUGxsVmFsdWUoKSB0byBmaWxsIHVwIHRoZSBvdGhlciBmaWVsZHMgZm9yIFBMTCBzdHJ1Y3R1cmUuCisJCSogU29tZXRpbWUsIHRoZSBjaGlwIGNhbm5vdCBzZXQgdXAgdGhlIGV4YWN0IGNsb2NrIHJlcXVpcmVkIGJ5IFVzZXIuCisJCSogUmV0dXJuIHZhbHVlIGZyb20gY2FsY1BsbFZhbHVlKCkgZ2l2ZXMgdGhlIGFjdHVhbCBwb3NzaWJsZSBjbG9jay4KKwkJKi8KKwkJdWxBY3R1YWxNeENsayA9IGNhbGNQbGxWYWx1ZShmcmVxdWVuY3ksICZwbGwpOworCisJCS8qIE1hc3RlciBDbG9jayBDb250cm9sOiBNWENMS19QTEwgKi8KKwkJUE9LRTMyKE1YQ0xLX1BMTF9DVFJMLCBmb3JtYXRQbGxSZWcoJnBsbCkpOworCX0KK30KKworCisKK3ZvaWQgc2V0TWVtb3J5Q2xvY2sodW5zaWduZWQgaW50IGZyZXF1ZW5jeSkKK3sKKwl1bnNpZ25lZCBpbnQgdWxSZWcsIGRpdmlzb3I7CisgI2lmIDEKKwkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCisJaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkJcmV0dXJuOworI2VuZGlmCisJaWYgKGZyZXF1ZW5jeSkgeworCQkvKiBTZXQgdGhlIGZyZXF1ZW5jeSB0byB0aGUgbWF4aW11bSBmcmVxdWVuY3kgdGhhdCB0aGUgRERSIE1lbW9yeSBjYW4gdGFrZQorCQl3aGljaCBpcyAzMzZNSHouICovCisJCWlmIChmcmVxdWVuY3kgPiBNSHooMzM2KSkKKwkJCWZyZXF1ZW5jeSA9IE1IeigzMzYpOworCisJCS8qIENhbGN1bGF0ZSB0aGUgZGl2aXNvciAqLworCQlkaXZpc29yID0gKHVuc2lnbmVkIGludCkgcm91bmRlZERpdihnZXRDaGlwQ2xvY2soKSwgZnJlcXVlbmN5KTsKKworCQkvKiBTZXQgdGhlIGNvcnJlc3BvbmRpbmcgZGl2aXNvciBpbiB0aGUgcmVnaXN0ZXIuICovCisJCXVsUmVnID0gUEVFSzMyKENVUlJFTlRfR0FURSk7CisJCXN3aXRjaCAoZGl2aXNvcikgeworCQlkZWZhdWx0OgorCQljYXNlIDE6CisJCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBNMlhDTEssIERJVl8xKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBNMlhDTEssIERJVl8yKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBNMlhDTEssIERJVl8zKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBNMlhDTEssIERJVl80KTsKKwkJCWJyZWFrOworCQl9CisKKwkJc2V0Q3VycmVudEdhdGUodWxSZWcpOworCX0KK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXQgdXAgdGhlIG1hc3RlciBjbG9jayAoTUNMSykuCisgKgorICogSW5wdXQ6IEZyZXF1ZW5jeSB0byBiZSBzZXQuCisgKgorICogTk9URToKKyAqICAgICAgVGhlIG1heGltdW0gZnJlcXVlbmN5IHRoZSBlbmdpbmUgY2FuIHJ1biBpcyAxNjhNSHouCisgKi8KK3ZvaWQgc2V0TWFzdGVyQ2xvY2sodW5zaWduZWQgaW50IGZyZXF1ZW5jeSkKK3sKKwl1bnNpZ25lZCBpbnQgdWxSZWcsIGRpdmlzb3I7CisjaWYgMQorCS8qIENoZW9rXzA1MDk6IEZvciBTTTc1MExFLCB0aGUgbWVtb3J5IGNsb2NrIGlzIGZpeGVkLiBOb3RoaW5nIHRvIHNldC4gKi8KKwlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCQlyZXR1cm47CisjZW5kaWYKKwlpZiAoZnJlcXVlbmN5KSB7CisJCS8qIFNldCB0aGUgZnJlcXVlbmN5IHRvIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSB0aGF0IHRoZSBTTTc1MCBlbmdpbmUgY2FuCisJCXJ1biwgd2hpY2ggaXMgYWJvdXQgMTkwIE1Iei4gKi8KKwkJaWYgKGZyZXF1ZW5jeSA+IE1IeigxOTApKQorCQkJZnJlcXVlbmN5ID0gTUh6KDE5MCk7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBkaXZpc29yICovCisJCWRpdmlzb3IgPSAodW5zaWduZWQgaW50KSByb3VuZGVkRGl2KGdldENoaXBDbG9jaygpLCBmcmVxdWVuY3kpOworCisJCS8qIFNldCB0aGUgY29ycmVzcG9uZGluZyBkaXZpc29yIGluIHRoZSByZWdpc3Rlci4gKi8KKwkJdWxSZWcgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKwkJc3dpdGNoIChkaXZpc29yKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgMzoKKwkJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBDVVJSRU5UX0dBVEUsIE1DTEssIERJVl8zKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBNQ0xLLCBESVZfNCk7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENVUlJFTlRfR0FURSwgTUNMSywgRElWXzYpOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBDVVJSRU5UX0dBVEUsIE1DTEssIERJVl84KTsKKwkJCWJyZWFrOworCQl9CisKKwkJc2V0Q3VycmVudEdhdGUodWxSZWcpOworCQl9Cit9CisKKwordW5zaWduZWQgaW50IGRkazc1MF9nZXRWTVNpemUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGludCBkYXRhOworCisJLyogc203NTBsZSBvbmx5IHVzZSA2NCBtYiBtZW1vcnkqLworCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJCXJldHVybiBNQig2NCk7CisKKwkvKiBmb3IgNzUwLGFsd2F5cyB1c2UgcG93ZXIgbW9kZTAqLworCXJlZyA9IFBFRUszMihNT0RFMF9HQVRFKTsKKwlyZWcgPSBGSUVMRF9TRVQocmVnLCBNT0RFMF9HQVRFLCBHUElPLCBPTik7CisJUE9LRTMyKE1PREUwX0dBVEUsIHJlZyk7CisKKwkvKiBnZXQgZnJhbWUgYnVmZmVyIHNpemUgZnJvbSBHUElPICovCisJcmVnID0gRklFTERfR0VUKFBFRUszMihNSVNDX0NUUkwpLCBNSVNDX0NUUkwsIExPQ0FMTUVNX1NJWkUpOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRV84TToKKwkJZGF0YSA9IE1CKDgpOyAgYnJlYWs7IC8qIDggIE1lZ2EgYnl0ZSAqLworCWNhc2UgTUlTQ19DVFJMX0xPQ0FMTUVNX1NJWkVfMTZNOgorCQlkYXRhID0gTUIoMTYpOyBicmVhazsgLyogMTYgTWVnYSBieXRlICovCisJY2FzZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRV8zMk06CisJCWRhdGEgPSBNQigzMik7IGJyZWFrOyAvKiAzMiBNZWdhIGJ5dGUgKi8KKwljYXNlIE1JU0NfQ1RSTF9MT0NBTE1FTV9TSVpFXzY0TToKKwkJZGF0YSA9IE1CKDY0KTsgYnJlYWs7IC8qIDY0IE1lZ2EgYnl0ZSAqLworCWRlZmF1bHQ6CisJCWRhdGEgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIGRhdGE7CisKK30KKworaW50IGRkazc1MF9pbml0SHcoaW5pdGNoaXBfcGFyYW1fdCAqcEluaXRQYXJhbSkKK3sKKworCXVuc2lnbmVkIGludCB1bFJlZzsKKyNpZiAwCisJLy9tb3ZlIHRoZSBjb2RlIHRvIG1hcCByZWdpdGVyIGZ1bmN0aW9uLgorCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzE4KSB7CisJCS8qIHR1cm4gb24gYmlnIGVuZGlhbiBiaXQqLworCQl1bFJlZyA9IFBFRUszMigweDc0KTsKKwkJLyogbm93IGNvbnNpZGVyIHJlZ2lzdGVyIGRlZmluaXRpb24gaW4gYSBiaWcgZW5kaWFuIHBhdHRlcm4qLworCQlQT0tFMzIoMHg3NCwgdWxSZWd8MHg4MDAwMDAwMCk7CisJfQorCisjZW5kaWYKKworCisJaWYgKHBJbml0UGFyYW0tPnBvd2VyTW9kZSAhPSAwICkKKwkJcEluaXRQYXJhbS0+cG93ZXJNb2RlID0gMDsKKwlzZXRQb3dlck1vZGUocEluaXRQYXJhbS0+cG93ZXJNb2RlKTsKKworCS8qIEVuYWJsZSBkaXNwbGF5IHBvd2VyIGdhdGUgJiBMT0NBTE1FTSBwb3dlciBnYXRlKi8KKwl1bFJlZyA9IFBFRUszMihDVVJSRU5UX0dBVEUpOworCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBDVVJSRU5UX0dBVEUsIERJU1BMQVksIE9OKTsKKwl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBMT0NBTE1FTSwgT04pOworCXNldEN1cnJlbnRHYXRlKHVsUmVnKTsKKworCWlmIChnZXRDaGlwVHlwZSgpICE9IFNNNzUwTEUpIHsKKwkJLyoJc2V0IHBhbmVsIHBsbCBhbmQgZ3JhcGhpYyBtb2RlIHZpYSBtbWlvXzg4ICovCisJCXVsUmVnID0gUEVFSzMyKFZHQV9DT05GSUdVUkFUSU9OKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIFZHQV9DT05GSUdVUkFUSU9OLCBQTEwsIFBBTkVMKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIFZHQV9DT05GSUdVUkFUSU9OLCBNT0RFLCBHUkFQSElDKTsKKwkJUE9LRTMyKFZHQV9DT05GSUdVUkFUSU9OLCB1bFJlZyk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKCBfX3g4Nl82NF9fKQorCQkvKiBzZXQgZ3JhcGhpYyBtb2RlIHZpYSBJTyBtZXRob2QgKi8KKwkJb3V0Yl9wKDB4ODgsIDB4M2Q0KTsKKwkJb3V0Yl9wKDB4MDYsIDB4M2Q1KTsKKyNlbmRpZgorCX0KKworCS8qIFNldCB0aGUgTWFpbiBDaGlwIENsb2NrICovCisJc2V0Q2hpcENsb2NrKE1IeigodW5zaWduZWQgaW50KXBJbml0UGFyYW0tPmNoaXBDbG9jaykpOworCisJLyogU2V0IHVwIG1lbW9yeSBjbG9jay4gKi8KKwlzZXRNZW1vcnlDbG9jayhNSHoocEluaXRQYXJhbS0+bWVtQ2xvY2spKTsKKworCS8qIFNldCB1cCBtYXN0ZXIgY2xvY2sgKi8KKwlzZXRNYXN0ZXJDbG9jayhNSHoocEluaXRQYXJhbS0+bWFzdGVyQ2xvY2spKTsKKworCisJLyogUmVzZXQgdGhlIG1lbW9yeSBjb250cm9sbGVyLiBJZiB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgaXMgbm90IHJlc2V0IGluIFNNNzUwLAorCSAgIHRoZSBzeXN0ZW0gbWlnaHQgaGFuZyB3aGVuIHN3IGFjY2Vzc2VzIHRoZSBtZW1vcnkuCisJICAgVGhlIG1lbW9yeSBzaG91bGQgYmUgcmVzZXR0ZWQgYWZ0ZXIgY2hhbmdpbmcgdGhlIE1YQ0xLLgorCSAqLworCWlmIChwSW5pdFBhcmFtLT5yZXNldE1lbW9yeSA9PSAxKSB7CisJCXVsUmVnID0gUEVFSzMyKE1JU0NfQ1RSTCk7CisJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBNSVNDX0NUUkwsIExPQ0FMTUVNX1JFU0VULCBSRVNFVCk7CisJCVBPS0UzMihNSVNDX0NUUkwsIHVsUmVnKTsKKworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgTUlTQ19DVFJMLCBMT0NBTE1FTV9SRVNFVCwgTk9STUFMKTsKKwkJUE9LRTMyKE1JU0NfQ1RSTCwgdWxSZWcpOworCX0KKworCWlmIChwSW5pdFBhcmFtLT5zZXRBbGxFbmdPZmYgPT0gMSkgeworCQllbmFibGUyREVuZ2luZSgwKTsKKworCQkvKiBEaXNhYmxlIE92ZXJsYXksIGlmIGEgZm9ybWVyIGFwcGxpY2F0aW9uIGxlZnQgaXQgb24gKi8KKwkJdWxSZWcgPSBQRUVLMzIoVklERU9fRElTUExBWV9DVFJMKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIFZJREVPX0RJU1BMQVlfQ1RSTCwgUExBTkUsIERJU0FCTEUpOworCQlQT0tFMzIoVklERU9fRElTUExBWV9DVFJMLCB1bFJlZyk7CisKKwkJLyogRGlzYWJsZSB2aWRlbyBhbHBoYSwgaWYgYSBmb3JtZXIgYXBwbGljYXRpb24gbGVmdCBpdCBvbiAqLworCQl1bFJlZyA9IFBFRUszMihWSURFT19BTFBIQV9ESVNQTEFZX0NUUkwpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgVklERU9fQUxQSEFfRElTUExBWV9DVFJMLCBQTEFORSwgRElTQUJMRSk7CisJCVBPS0UzMihWSURFT19BTFBIQV9ESVNQTEFZX0NUUkwsIHVsUmVnKTsKKworCQkvKiBEaXNhYmxlIGFscGhhIHBsYW5lLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCXVsUmVnID0gUEVFSzMyKEFMUEhBX0RJU1BMQVlfQ1RSTCk7CisJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBBTFBIQV9ESVNQTEFZX0NUUkwsIFBMQU5FLCBESVNBQkxFKTsKKwkJUE9LRTMyKEFMUEhBX0RJU1BMQVlfQ1RSTCwgdWxSZWcpOworCisjaWYgMAorCQkvKiBEaXNhYmxlIExDRCBoYXJkd2FyZSBjdXJzb3IsIGlmIGEgZm9ybWVyIGFwcGxpY2F0aW9uIGxlZnQgaXQgb24gKi8KKwkJdWxSZWcgPSBQRUVLMzIoUEFORUxfSFdDX0FERFJFU1MpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgUEFORUxfSFdDX0FERFJFU1MsIEVOQUJMRSwgRElTQUJMRSk7CisJCVBPS0UzMihQQU5FTF9IV0NfQUREUkVTUywgdWxSZWcpOworCisJCS8qIERpc2FibGUgQ1JUIGhhcmR3YXJlIGN1cnNvciwgaWYgYSBmb3JtZXIgYXBwbGljYXRpb24gbGVmdCBpdCBvbiAqLworCQl1bFJlZyA9IFBFRUszMihDUlRfSFdDX0FERFJFU1MpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1JUX0hXQ19BRERSRVNTLCBFTkFCTEUsIERJU0FCTEUpOworCQlQT0tFMzIoQ1JUX0hXQ19BRERSRVNTLCB1bFJlZyk7CisKKwkJLyogRGlzYWJsZSBaViBQb3J0IDAsIGlmIGEgZm9ybWVyIGFwcGxpY2F0aW9uIGxlZnQgaXQgb24gKi8KKwkJdWxSZWcgPSBQRUVLMzIoWlYwX0NBUFRVUkVfQ1RSTCk7CisJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBaVjBfQ0FQVFVSRV9DVFJMLCBDQVAsIERJU0FCTEUpOworCQlQT0tFMzIoWlYwX0NBUFRVUkVfQ1RSTCwgdWxSZWcpOworCisJCS8qIERpc2FibGUgWlYgUG9ydCAxLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCXVsUmVnID0gUEVFSzMyKFpWMV9DQVBUVVJFX0NUUkwpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgWlYxX0NBUFRVUkVfQ1RSTCwgQ0FQLCBESVNBQkxFKTsKKwkJUE9LRTMyKFpWMV9DQVBUVVJFX0NUUkwsIHVsUmVnKTsKKworCQkvKiBEaXNhYmxlIFpWIFBvcnQgUG93ZXIsIGlmIGEgZm9ybWVyIGFwcGxpY2F0aW9uIGxlZnQgaXQgb24gKi8KKwkJZW5hYmxlWlZQb3J0KDApOworCQkvKiBEaXNhYmxlIERNQSBDaGFubmVsLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCXVsUmVnID0gUEVFSzMyKERNQV9BQk9SVF9JTlRFUlJVUFQpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgRE1BX0FCT1JUX0lOVEVSUlVQVCwgQUJPUlRfMSwgQUJPUlQpOworCQlQT0tFMzIoRE1BX0FCT1JUX0lOVEVSUlVQVCwgdWxSZWcpOworCisJCS8qIERpc2FibGUgaTJjICovCisJCWVuYWJsZUkyQygwKTsKKyNlbmRpZgorCQkvKiBEaXNhYmxlIERNQSBDaGFubmVsLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCXVsUmVnID0gUEVFSzMyKERNQV9BQk9SVF9JTlRFUlJVUFQpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgRE1BX0FCT1JUX0lOVEVSUlVQVCwgQUJPUlRfMSwgQUJPUlQpOworCQlQT0tFMzIoRE1BX0FCT1JUX0lOVEVSUlVQVCwgdWxSZWcpOworCisJCS8qIERpc2FibGUgRE1BIFBvd2VyLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCWVuYWJsZURNQSgwKTsKKwl9CisKKwkvKiBXZSBjYW4gYWRkIG1vcmUgaW5pdGlhbGl6YXRpb24gYXMgbmVlZGVkLiAqLworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCisKK3Vuc2lnbmVkIGludCBhYnNEaWZmKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYikKK3sKKwlpZiAoIGEgPiBiICkKKwkJcmV0dXJuKGEgLSBiKTsKKwllbHNlCisJCXJldHVybihiIC0gYSk7Cit9CisKKyNlbmRpZgorLyoKKwltb25rIGxpdSBAIDQvNi8yMDExOgorCQkgICByZS13cml0ZSB0aGUgY2FsY3VsYXRlUExMIGZ1bmN0aW9uIG9mIGRkazc1MC4KKwkJICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gZnVuY3Rpb24gZG9lcyBub3QgdXNlIHNvbWUgbWF0aGVtYXRpY3MgdHJpY2tzIGFuZCBzaG9ydGN1dAorCQkgICB3aGVuIGl0IGRvaW5nIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgYmVzdCBOLE0sRCBjb21iaW5hdGlvbgorCQkgICBJIHRoaW5rIHRoaXMgdmVyc2lvbiBnaXZlcyBhIGxpdHRsZSB1cGdyYWRlIGluIHNwZWVkCisKKwk3NTAgcGxsIGNsb2NrIGZvcm11bGFyOgorCVJlcXVlc3QgQ2xvY2sgPSAoSW5wdXQgQ2xvY2sgKiBNICkvKE4gKiBYKQorCisJSW5wdXQgQ2xvY2sgPSAxNDMxODE4MSBoegorCVggPSAyIHBvd2VyIEQKKwlEID17MCwxLDIsMyw0LDUsNn0KKwlNID0gezEsLi4uLDI1NX0KKwlOID0gezIsLi4uLDE1fQorKi8KK3Vuc2lnbmVkIGludCBjYWxjUGxsVmFsdWUodW5zaWduZWQgaW50IHJlcXVlc3Rfb3JpZywgcGxsX3ZhbHVlX3QgKnBsbCkKK3sKKwkvKiB1c2VkIGZvciBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY2hhbm5lbCBwaXhlbCBjbG9jayBwbGwgKi8KKwlzdGF0aWMgcGxsY2FscGFyYW0geHBhcm1fUElYRUxbXSA9IHsKKwkJLyogMl4wID0gMSovCQkJezAsIDAsIDAsIDF9LAorCQkvKiAyXiAxID0yKi8JCQl7MSwgMCwgMSwgMn0sCisJCS8qIDJeIDIgID0gNCovCQl7MiwgMCwgMiwgNH0sCisJCQkJCQkJezMsIDAsIDMsIDh9LAorCQkJCQkJCXs0LCAxLCAzLCAxNn0sCisJCQkJCQkJezUsIDIsIDMsIDMyfSwKKwkJLyogMl42ID0gNjQgICovCQl7NiwgMywgMywgNjR9LAorCQkJCQkJCX07CisKKwkvKiB1c2VkIGZvciBNWENMSyAoY2hpcCBjbG9jaykgKi8KKwlzdGF0aWMgcGxsY2FscGFyYW0geHBhcm1fTVhDTEtbXSA9IHsKKwkJLyogMl4wID0gMSovCQkJezAsIDAsIDAsIDF9LAorCQkvKiAyXiAxID0yKi8JCQl7MSwgMCwgMSwgMn0sCisJCS8qIDJeIDIgID0gNCovCQl7MiwgMCwgMiwgNH0sCisJCQkJCQkJezMsIDAsIDMsIDh9LAorCQkJCQkJCX07CisKKwkvKiBhcyBzbTc1MCByZWdpc3RlciBkZWZpbml0aW9uLCBOIGxvY2F0ZWQgaW4gMiwxNSBhbmQgTSBsb2NhdGVkIGluIDEsMjU1CSovCisJaW50IE4sIE0sIFgsIGQ7CisJaW50IHhjbnQ7CisJaW50IG1pbmlEaWZmOworCXVuc2lnbmVkIGludCBSTiwgcXVvLCByZW0sIGZsX3F1bzsKKwl1bnNpZ25lZCBpbnQgaW5wdXQsIHJlcXVlc3Q7CisJdW5zaWduZWQgaW50IHRtcENsb2NrLCByZXQ7CisJcGxsY2FscGFyYW0gKiB4cGFybTsKKworI2lmIDEKKwlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7CisJCS8qIFNNNzUwTEUgZG9uJ3QgaGF2ZSBwcmdyYW1tYWJsZSBQTEwgYW5kIE0vTiB2YWx1ZXMgdG8gd29yayBvbi4KKwkJSnVzdCByZXR1cm4gdGhlIHJlcXVlc3RlZCBjbG9jay4gKi8KKwkJcmV0dXJuIHJlcXVlc3Rfb3JpZzsKKwl9CisjZW5kaWYKKworCXJldCA9IDA7CisJbWluaURpZmYgPSB+MDsKKwlyZXF1ZXN0ID0gcmVxdWVzdF9vcmlnIC8gMTAwMDsKKwlpbnB1dCA9IHBsbC0+aW5wdXRGcmVxIC8gMTAwMDsKKworCS8qIGZvciBNWENMSyByZWdpc3RlciAsIG5vIFBPRCBwcm92aWRlZCwgc28gbmVlZCBiZSB0cmVhdGVkIGRpZmZlcmVudGx5CSovCisKKwlpZiAocGxsLT5jbG9ja1R5cGUgIT0gTVhDTEtfUExMKSB7CisJCXhwYXJtID0gJnhwYXJtX1BJWEVMWzBdOworCQl4Y250ID0gc2l6ZW9mKHhwYXJtX1BJWEVMKS9zaXplb2YoeHBhcm1fUElYRUxbMF0pOworCX0gZWxzZSB7CisJCXhwYXJtID0gJnhwYXJtX01YQ0xLWzBdOworCQl4Y250ID0gc2l6ZW9mKHhwYXJtX01YQ0xLKS9zaXplb2YoeHBhcm1fTVhDTEtbMF0pOworCX0KKworCisJZm9yIChOID0gMTU7IE4gPiAxOyBOLS0pIHsKKwkJLyogUk4gd2lsbCBub3QgZXhjZWVkIG1heGltdW0gbG9uZyBpZiBAcmVxdWVzdCA8PSAyODUgTUhaIChmb3IgMzJiaXQgY3B1KSAqLworCQlSTiA9IE4gKiByZXF1ZXN0OworCQlxdW8gPSBSTiAvIGlucHV0OworCQlyZW0gPSBSTiAlIGlucHV0Oy8qIHJlbSBhbHdheXMgc21hbGwgdGhhbiAxNDMxODE4MSAqLworCQlmbF9xdW8gPSAocmVtICogMTAwMDAgL2lucHV0KTsKKworCQlmb3IgKGQgPSB4Y250IC0gMTsgZCA+PSAwOyBkLS0pIHsKKwkJCVggPSB4cGFybVtkXS52YWx1ZTsKKwkJCU0gPSBxdW8qWDsKKwkJCU0gKz0gZmxfcXVvICogWCAvIDEwMDAwOworCQkJLyogcm91bmQgc3RlcCAqLworCQkJTSArPSAoZmxfcXVvKlggJSAxMDAwMCk+NTAwMD8xOjA7CisJCQlpZiAoTSA8IDI1NiAmJiBNID4gMCkgeworCQkJCXVuc2lnbmVkIGludCBkaWZmOworCQkJCXRtcENsb2NrID0gcGxsLT5pbnB1dEZyZXEgKk0gLyBOIC8gWDsKKwkJCQlkaWZmID0gYWJzRGlmZih0bXBDbG9jaywgcmVxdWVzdF9vcmlnKTsKKwkJCQlpZiAoZGlmZiA8IG1pbmlEaWZmKSB7CisJCQkJCXBsbC0+TSA9IE07CisJCQkJCXBsbC0+TiA9IE47CisJCQkJCXBsbC0+T0QgPSB4cGFybVtkXS5vZDsKKwkJCQkJcGxsLT5QT0QgPSB4cGFybVtkXS5wb2Q7CisJCQkJCW1pbmlEaWZmID0gZGlmZjsKKwkJCQkJcmV0ID0gdG1wQ2xvY2s7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLy9wcmludGsoIkZpbmFsbHk6ICBwbGwtPm5bJWx1XSxtWyVsdV0sb2RbJWx1XSxwb2RbJWx1XVxuIixwbGwtPk4scGxsLT5NLHBsbC0+T0QscGxsLT5QT0QpOworCXJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGludCBjYWxjUGxsVmFsdWUyKAordW5zaWduZWQgaW50IHVsUmVxdWVzdENsaywgLyogUmVxdWlyZWQgcGl4ZWwgY2xvY2sgaW4gSHogdW5pdCAqLworcGxsX3ZhbHVlX3QgKnBQTEwgICAgICAgICAgIC8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSB2YWx1ZSB0byBiZSBzZXQgaW4gUExMICovCispCit7CisJdW5zaWduZWQgaW50IE0sIE4sIE9ELCBQT0QgPSAwLCBkaWZmLCBwbGxDbGssIG9kUG93ZXIsIHBvZFBvd2VyOworCXVuc2lnbmVkIGludCBiZXN0RGlmZiA9IDB4ZmZmZmZmZmY7IC8qIGJpZ2dlc3QgMzIgYml0IHVuc2lnbmVkIG51bWJlciAqLworCXVuc2lnbmVkIGludCByZXQ7CisgICAgLyogSW5pdCBQTEwgc3RydWN0dXJlIHRvIGtub3cgc3RhdGVzICovCisJcFBMTC0+TSA9IDA7CisJcFBMTC0+TiA9IDA7CisJcFBMTC0+T0QgPSAwOworCXBQTEwtPlBPRCA9IDA7CisKKyAgICAvKiBTYW5pdHkgY2hlY2s6IE5vbmUgYXQgdGhlIG1vbWVudCAqLworCisgICAgLyogQ29udmVydCBldmVyeXRoaW5nIGluIEtoeiByYW5nZSBpbiBvcmRlciB0byBhdm9pZCBjYWxjdWxhdGlvbiBvdmVyZmxvdyAqLworCXBQTEwtPmlucHV0RnJlcSAvPSAxMDAwOworCXVsUmVxdWVzdENsayAvPSAxMDAwOworCisjaWZuZGVmIFZBTElEQVRJT05fQ0hJUAorICAgIC8qIFRoZSBtYXhpbXVtIG9mIHBvc3QgZGl2aWRlciBpcyA4LiAqLworCWZvciAoUE9EID0gMDsgUE9EIDw9IDM7IFBPRCsrKQorI2VuZGlmCisJCXsKKworI2lmbmRlZiBWQUxJREFUSU9OX0NISVAKKwkvKiBNWENMS19QTEwgZG9lcyBub3QgaGF2ZSBwb3N0IGRpdmlkZXIuICovCisJaWYgKChQT0QgPiAwKSAmJiAocFBMTC0+Y2xvY2tUeXBlID09IE1YQ0xLX1BMTCkpCisJCWJyZWFrOworI2VuZGlmCisKKwkvKiBXb3JrIG91dCAyIHRvIHRoZSBwb3dlciBvZiBQT0QgKi8KKwlwb2RQb3dlciA9IHR3b1RvUG93ZXJPZngoUE9EKTsKKworCS8qIE9EIGhhcyBvbmx5IDIgYml0cyBbMTU6MTRdIGFuZCBpdHMgdmFsdWUgbXVzdCBiZXR3ZWVuIDAgdG8gMyAqLworCWZvciAoT0QgPSAwOyBPRCA8PSAzOyBPRCsrKSB7CisJCS8qIFdvcmsgb3V0IDIgdG8gdGhlIHBvd2VyIG9mIE9EICovCisJCW9kUG93ZXIgPSB0d29Ub1Bvd2VyT2Z4KE9EKTsKKworI2lmZGVmIFZBTElEQVRJT05fQ0hJUAorCWlmIChvZFBvd2VyID4gNCkKKwkJcG9kUG93ZXIgPSA0OworCWVsc2UKKwkJcG9kUG93ZXIgPSBvZFBvd2VyOworI2VuZGlmCisKKwkJLyogTiBoYXMgNCBiaXRzIFsxMTo4XSBhbmQgaXRzIHZhbHVlIG11c3QgYmV0d2VlbiAyIGFuZCAxNS4KKwkJVGhlIE4gPT0gMSB3aWxsIGJlaGF2ZSBkaWZmZXJlbnRseSAtLT4gUmVzdWx0IGlzIG5vdCBjb3JyZWN0LiAqLworCWZvciAoTiA9IDI7IE4gPD0gMTU7IE4rKykgeworCQkvKiBUaGUgZm9ybXVsYSBmb3IgUExMIGlzIHVsUmVxdWVzdENsayA9IGlucHV0RnJlcSAqIE0gLyBOIC8gKDJeT0QpCisJCUluIHRoZSBmb2xsb3dpbmcgc3RlcHMsIHdlIHRyeSB0byB3b3JrIG91dCBhIGJlc3QgTSB2YWx1ZSBnaXZlbiB0aGUgb3RoZXJzIGFyZSBrbm93bi4KKwkJVG8gYXZvaWQgZGVjaW1hbCBjYWxjdWxhdGlvbiwgd2UgdXNlIDEwMDAgYXMgbXVsdGlwbGllciBmb3IgdXAgdG8gMyBkZWNpbWFsIHBsYWNlcyBvZiBhY2N1cmFjeS4KKwkJKi8KKwkJTSA9IHVsUmVxdWVzdENsayAqIE4gKiBvZFBvd2VyICogMTAwMCAvIHBQTEwtPmlucHV0RnJlcTsKKwkJTSA9IHJvdW5kZWREaXYoTSwgMTAwMCk7CisKKwkJLyogTSBmaWVsZCBoYXMgb25seSA4IGJpdHMsIHJlamVjdCB2YWx1ZSBiaWdnZXIgdGhhbiA4IGJpdHMgKi8KKwkJaWYgKE0gPCAyNTYpIHsKKwkJCS8qIENhbGN1bGF0ZSB0aGUgYWN0dWFsIGNsb2NrIGZvciBhIGdpdmVuIE0gJiBOICovCisJCQlwbGxDbGsgPSBwUExMLT5pbnB1dEZyZXEgKiBNIC8gTiAvIG9kUG93ZXIgLyBwb2RQb3dlcjsKKworCQkJLyogSG93IG11Y2ggYXJlIHdlIGRpZmZlcmVudCBmcm9tIHRoZSByZXF1aXJlbWVudCAqLworCQkJZGlmZiA9IGFic0RpZmYocGxsQ2xrLCB1bFJlcXVlc3RDbGspOworCisJCQlpZiAoZGlmZiA8IGJlc3REaWZmKSB7CisJCQkJYmVzdERpZmYgPSBkaWZmOworCisJCQkJLyogU3RvcmUgTSBhbmQgTiB2YWx1ZXMgKi8KKwkJCQlwUExMLT5NICA9IE07CisJCQkJcFBMTC0+TiAgPSBOOworCQkJCXBQTEwtPk9EID0gT0Q7CisKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKwkJCWlmIChPRCA+IDIpCisJCQkJUE9EID0gMjsKKwkJCWVsc2UKKwkJCQlQT0QgPSBPRDsKKyNlbmRpZgorCisJCQlwUExMLT5QT0QgPSBQT0Q7CisJCQl9CisJCX0KKwl9CisJfQorCX0KKworICAgIC8qIFJlc3RvcmUgaW5wdXQgZnJlcXVlbmN5IGZyb20gS2h6IHRvIGh6IHVuaXQgKi8KKy8vICAgIHBQTEwtPmlucHV0RnJlcSAqPSAxMDAwOworCXVsUmVxdWVzdENsayAqPSAxMDAwOworCXBQTEwtPmlucHV0RnJlcSA9IERFRkFVTFRfSU5QVVRfQ0xPQ0s7IC8qIERlZmF1bHQgcmVmZXJlbmNlIGNsb2NrICovCisKKyAgICAvKiBPdXRwdXQgZGVidWcgaW5mb3JtYXRpb24gKi8KKwkvL0RES0RFQlVHUFJJTlQoKERJU1BMQVlfTEVWRUwsICJjYWxjUGxsVmFsdWU6IFJlcXVlc3RlZCBGcmVxdWVuY3kgPSAlZFxuIiwgdWxSZXF1ZXN0Q2xrKSk7CisJLy9EREtERUJVR1BSSU5UKChESVNQTEFZX0xFVkVMLCAiY2FsY1BsbFZhbHVlOiBJbnB1dCBDTEsgPSAlZEh6LCBNPSVkLCBOPSVkLCBPRD0lZCwgUE9EPSVkXG4iLCBwUExMLT5pbnB1dEZyZXEsIHBQTEwtPk0sIHBQTEwtPk4sIHBQTEwtPk9ELCBwUExMLT5QT0QpKTsKKworICAgIC8qIFJldHVybiBhY3R1YWwgZnJlcXVlbmN5IHRoYXQgdGhlIFBMTCBjYW4gc2V0ICovCisJcmV0ID0gY2FsY1BMTChwUExMKTsKKwlyZXR1cm4gcmV0OworfQorCisKKworCisKK3Vuc2lnbmVkIGludCBmb3JtYXRQbGxSZWcocGxsX3ZhbHVlX3QgKnBQTEwpCit7CisJdW5zaWduZWQgaW50IHVsUGxsUmVnID0gMDsKKworICAgIC8qIE5vdGUgdGhhdCBhbGwgUExMJ3MgaGF2ZSB0aGUgc2FtZSBmb3JtYXQuIEhlcmUsIHdlIGp1c3QgdXNlIFBhbmVsIFBMTCBwYXJhbWV0ZXIKKyAgICAgICB0byB3b3JrIG91dCB0aGUgYml0IGZpZWxkcyBpbiB0aGUgcmVnaXN0ZXIuCisgICAgICAgT24gcmV0dXJuaW5nIGEgMzIgYml0IG51bWJlciwgdGhlIHZhbHVlIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBQTEwgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24uCisgICAgKi8KKwl1bFBsbFJlZyA9CisJRklFTERfU0VUKCAgMCwgUEFORUxfUExMX0NUUkwsIEJZUEFTUywgT0ZGKQorCXwgRklFTERfU0VUKCAgMCwgUEFORUxfUExMX0NUUkwsIFBPV0VSLCAgT04pCisJfCBGSUVMRF9TRVQoICAwLCBQQU5FTF9QTExfQ1RSTCwgSU5QVVQsICBPU0MpCisjaWZuZGVmIFZBTElEQVRJT05fQ0hJUAorCXwgRklFTERfVkFMVUUoMCwgUEFORUxfUExMX0NUUkwsIFBPRCwgICAgcFBMTC0+UE9EKQorI2VuZGlmCisJfCBGSUVMRF9WQUxVRSgwLCBQQU5FTF9QTExfQ1RSTCwgT0QsICAgICBwUExMLT5PRCkKKwl8IEZJRUxEX1ZBTFVFKDAsIFBBTkVMX1BMTF9DVFJMLCBOLCAgICAgIHBQTEwtPk4pCisJfCBGSUVMRF9WQUxVRSgwLCBQQU5FTF9QTExfQ1RSTCwgTSwgICAgICBwUExMLT5NKTsKKworICAgIHJldHVybiB1bFBsbFJlZzsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNiMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuaApAQCAtMCwwICsxLDg3IEBACisjaWZuZGVmIERESzc1MF9DSElQX0hfXworI2RlZmluZSBEREs3NTBfQ0hJUF9IX18KKyNkZWZpbmUgREVGQVVMVF9JTlBVVF9DTE9DSyAxNDMxODE4MSAvKiBEZWZhdWx0IHJlZmVyZW5jZSBjbG9jayAqLworI2lmbmRlZiBTTTc1MExFX1JFVklTSU9OX0lECisjZGVmaW5lIFNNNzUwTEVfUkVWSVNJT05fSUQgKCh1bnNpZ25lZCBjaGFyKTB4ZmUpCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKy8qIFRoaXMgaXMgYWxsIHRoZSBjaGlwcyByZWNvZ25pemVkIGJ5IHRoaXMgbGlicmFyeSAqLwordHlwZWRlZiBlbnVtIF9sb2dpY2FsX2NoaXBfdHlwZV90Cit7CisgICAgU01fVU5LTk9XTiwKKyAgICBTTTcxOCwKKyAgICBTTTc1MCwKKyAgICBTTTc1MExFLAorfQorbG9naWNhbF9jaGlwX3R5cGVfdDsKKworCit0eXBlZGVmIGVudW0gX2Nsb2NrX3R5cGVfdAoreworCU1YQ0xLX1BMTCwKKwlQUklNQVJZX1BMTCwKKwlTRUNPTkRBUllfUExMLAorCVZHQTBfUExMLAorCVZHQTFfUExMLAorfQorY2xvY2tfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCBfcGxsX3ZhbHVlX3QKK3sKKyAgICBjbG9ja190eXBlX3QgY2xvY2tUeXBlOworICAgIHVuc2lnbmVkIGxvbmcgaW5wdXRGcmVxOyAvKiBJbnB1dCBjbG9jayBmcmVxdWVuY3kgdG8gdGhlIFBMTCAqLworCisgICAgLyogVXNlIHRoaXMgd2hlbiBjbG9ja1R5cGUgPSBQQU5FTF9QTEwgKi8KKyAgICB1bnNpZ25lZCBsb25nIE07CisgICAgdW5zaWduZWQgbG9uZyBOOworICAgIHVuc2lnbmVkIGxvbmcgT0Q7CisgICAgdW5zaWduZWQgbG9uZyBQT0Q7Cit9CitwbGxfdmFsdWVfdDsKKworLyogaW5wdXQgc3RydWN0IHRvIGluaXRDaGlwUGFyYW0oKSBmdW5jdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgX2luaXRjaGlwX3BhcmFtX3QKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBwb3dlck1vZGU7ICAgIC8qIFVzZSBwb3dlciBtb2RlIDAgb3IgMSAqLworICAgIHVuc2lnbmVkIHNob3J0IGNoaXBDbG9jazsgICAgLyogU3BlZWQgb2YgbWFpbiBjaGlwIGNsb2NrIGluIE1IeiB1bml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0ga2VlcCB0aGUgY3VycmVudCBjbG9jayBzZXR0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcnMgPSB0aGUgbmV3IG1haW4gY2hpcCBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgc2hvcnQgbWVtQ2xvY2s7ICAgICAvKiBTcGVlZCBvZiBtZW1vcnkgY2xvY2sgaW4gTUh6IHVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBrZWVwIHRoZSBjdXJyZW50IGNsb2NrIHNldHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVycyA9IHRoZSBuZXcgbWVtb3J5IGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBtYXN0ZXJDbG9jazsgIC8qIFNwZWVkIG9mIG1hc3RlciBjbG9jayBpbiBNSHogdW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IGtlZXAgdGhlIGN1cnJlbnQgY2xvY2sgc2V0dGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJzID0gdGhlIG5ldyBtYXN0ZXIgY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IHNldEFsbEVuZ09mZjsgLyogMCA9IGxlYXZlIGFsbCBlbmdpbmUgc3RhdGUgdW50b3VjaGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IG1ha2Ugc3VyZSB0aGV5IGFyZSBvZmY6IDJELCBPdmVybGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gYWxwaGEsIGFscGhhLCBoYXJkd2FyZSBjdXJzb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgcmVzZXRNZW1vcnk7ICAgLyogMCA9IERvIG5vdCByZXNldCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBSZXNldCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLyogTW9yZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgY2FuIGJlIGFkZGVkIGlmIG5lZWRlZCAqLworfQoraW5pdGNoaXBfcGFyYW1fdDsKKworCitsb2dpY2FsX2NoaXBfdHlwZV90IGdldENoaXBUeXBlKHZvaWQpOwordW5zaWduZWQgaW50IGNhbGNQbGxWYWx1ZSh1bnNpZ25lZCBpbnQgcmVxdWVzdCxwbGxfdmFsdWVfdCAqcGxsKTsKK3Vuc2lnbmVkIGludCBjYWxjUGxsVmFsdWUyKHVuc2lnbmVkIGludCxwbGxfdmFsdWVfdCAqKTsKK3Vuc2lnbmVkIGludCBmb3JtYXRQbGxSZWcocGxsX3ZhbHVlX3QgKnBQTEwpOwordm9pZCBkZGs3NTBfc2V0X21taW8odm9pZCBfX2lvbWVtICosdW5zaWduZWQgc2hvcnQsY2hhcik7Cit1bnNpZ25lZCBpbnQgZGRrNzUwX2dldFZNU2l6ZSh2b2lkKTsKK2ludCBkZGs3NTBfaW5pdEh3KGluaXRjaGlwX3BhcmFtX3QgKik7Cit1bnNpZ25lZCBpbnQgZ2V0UGxsVmFsdWUoY2xvY2tfdHlwZV90IGNsb2NrVHlwZSwgcGxsX3ZhbHVlX3QgKnBQTEwpOwordW5zaWduZWQgaW50IGdldENoaXBDbG9jayh2b2lkKTsKK3ZvaWQgc2V0Q2hpcENsb2NrKHVuc2lnbmVkIGludCk7Cit2b2lkIHNldE1lbW9yeUNsb2NrKHVuc2lnbmVkIGludCBmcmVxdWVuY3kpOwordm9pZCBzZXRNYXN0ZXJDbG9jayh1bnNpZ25lZCBpbnQgZnJlcXVlbmN5KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDE5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jCkBAIC0wLDAgKzEsMzA3IEBACisjaW5jbHVkZSAiZGRrNzUwX3JlZy5oIgorI2luY2x1ZGUgImRkazc1MF9oZWxwLmgiCisjaW5jbHVkZSAiZGRrNzUwX2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJkZGs3NTBfcG93ZXIuaCIKKyNpbmNsdWRlICJkZGs3NTBfZHZpLmgiCisKKyNkZWZpbmUgcHJpbWFyeVdhaXRWZXJ0aWNhbFN5bmMoZGVsYXkpIHdhaXROZXh0VmVydGljYWxTeW5jKDAsZGVsYXkpCisKK3N0YXRpYyB2b2lkIHNldERpc3BsYXlDb250cm9sKGludCBjdHJsLGludCBkaXNwU3RhdGUpCit7CisJLyogc3RhdGUgIT0gMCBtZWFucyB0dXJuIG9uIGJvdGggdGltaW5nICYgcGxhbmUgZW5fYml0ICovCisJdW5zaWduZWQgbG9uZyB1bERpc3BsYXlDdHJsUmVnLCB1bFJlc2VydmVkQml0czsKKwlpbnQgY250OworCisJY250ID0gMDsKKworCS8qIFNldCB0aGUgcHJpbWFyeSBkaXNwbGF5IGNvbnRyb2wgKi8KKwlpZiAoIWN0cmwpCisJeworCQl1bERpc3BsYXlDdHJsUmVnID0gUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCk7CisJCS8qIFR1cm4gb24vb2ZmIHRoZSBQYW5lbCBkaXNwbGF5IGNvbnRyb2wgKi8KKwkJaWYgKGRpc3BTdGF0ZSkKKwkJeworCQkJLyogVGltaW5nIHNob3VsZCBiZSBlbmFibGVkIGZpcnN0IGJlZm9yZSBlbmFibGluZyB0aGUgcGxhbmUKKwkJCSAqIGJlY2F1c2UgY2hhbmdpbmcgYXQgdGhlIHNhbWUgdGltZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdAorCQkJICogdGhlIHBsYW5lIHdpbGwgYWxzbyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAJICAgICAqLworCQkJdWxEaXNwbGF5Q3RybFJlZyA9IEZJRUxEX1NFVCh1bERpc3BsYXlDdHJsUmVnLAorCQkJCQkJCQlQQU5FTF9ESVNQTEFZX0NUUkwsIFRJTUlORywgRU5BQkxFKTsKKwkJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsIHVsRGlzcGxheUN0cmxSZWcpOworCisJCQl1bERpc3BsYXlDdHJsUmVnID0gRklFTERfU0VUKHVsRGlzcGxheUN0cmxSZWcsCisJCQkJCQkJCVBBTkVMX0RJU1BMQVlfQ1RSTCwgUExBTkUsIEVOQUJMRSk7CisKKwkJCS8qIEFkZGVkIHNvbWUgbWFza3MgdG8gbWFzayBvdXQgdGhlIHJlc2VydmVkIGJpdHMuCisJCQkgKiBTb21ldGltZXMsIHRoZSByZXNlcnZlZCBiaXRzIGFyZSBzZXQvcmVzZXQgcmFuZG9tbHkgd2hlbgorCQkJICogd3JpdGluZyB0byB0aGUgUFJJTUFSWV9ESVNQTEFZX0NUUkwsIHRoZXJlZm9yZSwgdGhlIHJlZ2lzdGVyCisJCQkgKiByZXNlcnZlZCBiaXRzIGFyZSBuZWVkZWQgdG8gYmUgbWFza2VkIG91dC4KKwkJCSAqLworCQkJdWxSZXNlcnZlZEJpdHMgPSBGSUVMRF9TRVQoMCwgUEFORUxfRElTUExBWV9DVFJMLCBSRVNFUlZFRF8xX01BU0ssIEVOQUJMRSkgfAorCQkJCUZJRUxEX1NFVCgwLCBQQU5FTF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzJfTUFTSywgRU5BQkxFKSB8CisJCQkJRklFTERfU0VUKDAsIFBBTkVMX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfM19NQVNLLCBFTkFCTEUpOworCisJCQkvKiBTb21laG93IHRoZSByZWdpc3RlciB2YWx1ZSBvbiB0aGUgcGxhbmUgaXMgbm90IHNldAorCQkJICogdW50aWwgYSBmZXcgZGVsYXkuIE5lZWQgdG8gd3JpdGUKKwkJCSAqIGFuZCByZWFkIGl0IGEgY291cGxlIHRpbWVzCisJCQkgKi8KKwkJCWRvCisJCQl7CisJCQkJY250Kys7CisJCQkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCwgdWxEaXNwbGF5Q3RybFJlZyk7CisJCQl9IHdoaWxlKChQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKSAmIH51bFJlc2VydmVkQml0cykgIT0KKwkJCQkJKHVsRGlzcGxheUN0cmxSZWcgJiB+dWxSZXNlcnZlZEJpdHMpKTsKKwkJCXByaW50aygiU2V0IFBhbmVsIFBsYW5lIGVuYml0OmFmdGVyIHRyaWVkICVkIHRpbWVzXG4iLGNudCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBXaGVuIHR1cm5pbmcgb2ZmLCB0aGVyZSBpcyBubyBydWxlIG9uIHRoZSBwcm9ncmFtbWluZworCQkJICogc2VxdWVuY2Ugc2luY2Ugd2hlbmV2ZXIgdGhlIGNsb2NrIGlzIG9mZiwgdGhlbiBpdCBkb2VzIG5vdAorCQkJICogbWF0dGVyIHdoZXRoZXIgdGhlIHBsYW5lIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisJCQkgKiBOb3RlOiBNb2RpZnlpbmcgdGhlIHBsYW5lIGJpdCB3aWxsIHRha2UgZWZmZWN0IG9uIHRoZQorCQkJICogbmV4dCB2ZXJ0aWNhbCBzeW5jLiBOZWVkIHRvIGZpbmQgb3V0IGlmIGl0IGlzIG5lY2Vzc2FyeSB0bworCQkJICogd2FpdCBmb3IgMSB2c3luYyBiZWZvcmUgbW9kaWZ5aW5nIHRoZSB0aW1pbmcgZW5hYmxlIGJpdC4KKwkJCSAqICovCisJCQl1bERpc3BsYXlDdHJsUmVnID0gRklFTERfU0VUKHVsRGlzcGxheUN0cmxSZWcsCisJCQkJCQkJCVBBTkVMX0RJU1BMQVlfQ1RSTCwgUExBTkUsIERJU0FCTEUpOworCQkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCwgdWxEaXNwbGF5Q3RybFJlZyk7CisKKwkJCXVsRGlzcGxheUN0cmxSZWcgPSBGSUVMRF9TRVQodWxEaXNwbGF5Q3RybFJlZywKKwkJCQkJCQkJUEFORUxfRElTUExBWV9DVFJMLCBUSU1JTkcsIERJU0FCTEUpOworCQkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCwgdWxEaXNwbGF5Q3RybFJlZyk7CisJCX0KKworCX0KKwkvKiBTZXQgdGhlIHNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2wgKi8KKwllbHNlCisJeworCQl1bERpc3BsYXlDdHJsUmVnID0gUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpOworCisJCWlmIChkaXNwU3RhdGUpCisJCXsKKwkJCS8qIFRpbWluZyBzaG91bGQgYmUgZW5hYmxlZCBmaXJzdCBiZWZvcmUgZW5hYmxpbmcgdGhlIHBsYW5lIGJlY2F1c2UgY2hhbmdpbmcgYXQgdGhlCisJCQkgICBzYW1lIHRpbWUgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIHBsYW5lIHdpbGwgYWxzbyBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkJICAgKi8KKwkJCXVsRGlzcGxheUN0cmxSZWcgPSBGSUVMRF9TRVQodWxEaXNwbGF5Q3RybFJlZywKKwkJCQkJCQkJQ1JUX0RJU1BMQVlfQ1RSTCwgVElNSU5HLCBFTkFCTEUpOworCQkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIHVsRGlzcGxheUN0cmxSZWcpOworCisJCQl1bERpc3BsYXlDdHJsUmVnID0gRklFTERfU0VUKHVsRGlzcGxheUN0cmxSZWcsCisJCQkJCQkJCUNSVF9ESVNQTEFZX0NUUkwsIFBMQU5FLCBFTkFCTEUpOworCisJCQkvKiBBZGRlZCBzb21lIG1hc2tzIHRvIG1hc2sgb3V0IHRoZSByZXNlcnZlZCBiaXRzLgorCQkJICogU29tZXRpbWVzLCB0aGUgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0L3Jlc2V0IHJhbmRvbWx5IHdoZW4KKwkJCSAqIHdyaXRpbmcgdG8gdGhlIFBSSU1BUllfRElTUExBWV9DVFJMLCB0aGVyZWZvcmUsIHRoZSByZWdpc3RlcgorCQkJICogcmVzZXJ2ZWQgYml0cyBhcmUgbmVlZGVkIHRvIGJlIG1hc2tlZCBvdXQuCisJCQkgKi8KKworCQkJdWxSZXNlcnZlZEJpdHMgPSBGSUVMRF9TRVQoMCwgQ1JUX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfMV9NQVNLLCBFTkFCTEUpIHwKKwkJCQlGSUVMRF9TRVQoMCwgQ1JUX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfMl9NQVNLLCBFTkFCTEUpIHwKKwkJCQlGSUVMRF9TRVQoMCwgQ1JUX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfM19NQVNLLCBFTkFCTEUpIHwKKwkJCQlGSUVMRF9TRVQoMCwgQ1JUX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfNF9NQVNLLCBFTkFCTEUpOworCisJCQlkbworCQkJeworCQkJCWNudCsrOworCQkJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCB1bERpc3BsYXlDdHJsUmVnKTsKKwkJCX0gd2hpbGUoKFBFRUszMihDUlRfRElTUExBWV9DVFJMKSAmIH51bFJlc2VydmVkQml0cykgIT0KKwkJCQkJKHVsRGlzcGxheUN0cmxSZWcgJiB+dWxSZXNlcnZlZEJpdHMpKTsKKwkJCQlwcmludGsoIlNldCBDcnQgUGxhbmUgZW5iaXQ6YWZ0ZXIgdHJpZWQgJWQgdGltZXNcbiIsY250KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFdoZW4gdHVybmluZyBvZmYsIHRoZXJlIGlzIG5vIHJ1bGUgb24gdGhlIHByb2dyYW1taW5nCisJCQkgKiBzZXF1ZW5jZSBzaW5jZSB3aGVuZXZlciB0aGUgY2xvY2sgaXMgb2ZmLCB0aGVuIGl0IGRvZXMgbm90CisJCQkgKiBtYXR0ZXIgd2hldGhlciB0aGUgcGxhbmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJCSAqIE5vdGU6IE1vZGlmeWluZyB0aGUgcGxhbmUgYml0IHdpbGwgdGFrZSBlZmZlY3Qgb24gdGhlIG5leHQKKwkJCSAqIHZlcnRpY2FsIHN5bmMuIE5lZWQgdG8gZmluZCBvdXQgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvCisJCQkgKiB3YWl0IGZvciAxIHZzeW5jIGJlZm9yZSBtb2RpZnlpbmcgdGhlIHRpbWluZyBlbmFibGUgYml0LgorCQkJICovCisJCQl1bERpc3BsYXlDdHJsUmVnID0gRklFTERfU0VUKHVsRGlzcGxheUN0cmxSZWcsCisJCQkJCQkJCUNSVF9ESVNQTEFZX0NUUkwsIFBMQU5FLCBESVNBQkxFKTsKKwkJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCB1bERpc3BsYXlDdHJsUmVnKTsKKworCQkJdWxEaXNwbGF5Q3RybFJlZyA9IEZJRUxEX1NFVCh1bERpc3BsYXlDdHJsUmVnLAorCQkJCQkJCQlDUlRfRElTUExBWV9DVFJMLCBUSU1JTkcsIERJU0FCTEUpOworCQkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIHVsRGlzcGxheUN0cmxSZWcpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHdhaXROZXh0VmVydGljYWxTeW5jKGludCBjdHJsLGludCBkZWxheSkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWlmKCFjdHJsKXsKKwkJLyogcHJpbWFyeSBjb250cm9sbGVyICovCisKKyAgICAgICAgLyogRG8gbm90IHdhaXQgd2hlbiB0aGUgUHJpbWFyeSBQTEwgaXMgb2ZmIG9yIGRpc3BsYXkgY29udHJvbCBpcyBhbHJlYWR5IG9mZi4KKwkgICAgICAgICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuICovCisJCWlmICgoRklFTERfR0VUKFBFRUszMihQQU5FTF9QTExfQ1RSTCksIFBBTkVMX1BMTF9DVFJMLCBQT1dFUikgPT0KKwkJCSBQQU5FTF9QTExfQ1RSTF9QT1dFUl9PRkYpIHx8CisJCQkoRklFTERfR0VUKFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpLCBQQU5FTF9ESVNQTEFZX0NUUkwsIFRJTUlORykgPT0KKwkJCSBQQU5FTF9ESVNQTEFZX0NUUkxfVElNSU5HX0RJU0FCTEUpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworICAgICAgICB3aGlsZSAoZGVsYXktLSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIGVuZCBvZiB2c3luYy4gKi8KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRklFTERfR0VUKFBFRUszMihTWVNURU1fQ1RSTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5FTF9WU1lOQyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdHVzID09IFNZU1RFTV9DVFJMX1BBTkVMX1ZTWU5DX0FDVElWRSk7CisKKyAgICAgICAgICAgIC8qIFdhaXQgZm9yIHN0YXJ0IG9mIHZzeW5jLiAqLworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGSUVMRF9HRVQoUEVFSzMyKFNZU1RFTV9DVFJMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTkVMX1ZTWU5DKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzdGF0dXMgPT0gU1lTVEVNX0NUUkxfUEFORUxfVlNZTkNfSU5BQ1RJVkUpOworICAgICAgICB9CisKKwl9ZWxzZXsKKworCQkvKiBEbyBub3Qgd2FpdCB3aGVuIHRoZSBQcmltYXJ5IFBMTCBpcyBvZmYgb3IgZGlzcGxheSBjb250cm9sIGlzIGFscmVhZHkgb2ZmLgorCQkJICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHNvZnR3YXJlIHRvIHdhaXQgZm9yZXZlci4gKi8KKwkJaWYgKChGSUVMRF9HRVQoUEVFSzMyKENSVF9QTExfQ1RSTCksIENSVF9QTExfQ1RSTCwgUE9XRVIpID09CisJCQkgQ1JUX1BMTF9DVFJMX1BPV0VSX09GRikgfHwKKwkJCShGSUVMRF9HRVQoUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpLCBDUlRfRElTUExBWV9DVFJMLCBUSU1JTkcpID09CisJCQkgQ1JUX0RJU1BMQVlfQ1RSTF9USU1JTkdfRElTQUJMRSkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCisJCXdoaWxlIChkZWxheS0tID4gMCkKKwkJeworCQkJLyogV2FpdCBmb3IgZW5kIG9mIHZzeW5jLiAqLworCQkJZG8KKwkJCXsKKwkJCQlzdGF0dXMgPSBGSUVMRF9HRVQoUEVFSzMyKFNZU1RFTV9DVFJMKSwKKwkJCQkJCQkJICAgU1lTVEVNX0NUUkwsCisJCQkJCQkJCSAgIENSVF9WU1lOQyk7CisJCQl9CisJCQl3aGlsZSAoc3RhdHVzID09IFNZU1RFTV9DVFJMX0NSVF9WU1lOQ19BQ1RJVkUpOworCisJCQkvKiBXYWl0IGZvciBzdGFydCBvZiB2c3luYy4gKi8KKwkJCWRvCisJCQl7CisJCQkJc3RhdHVzID0gRklFTERfR0VUKFBFRUszMihTWVNURU1fQ1RSTCksCisJCQkJCQkJCSAgIFNZU1RFTV9DVFJMLAorCQkJCQkJCQkgICBDUlRfVlNZTkMpOworCQkJfQorCQkJd2hpbGUgKHN0YXR1cyA9PSBTWVNURU1fQ1RSTF9DUlRfVlNZTkNfSU5BQ1RJVkUpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzd1BhbmVsUG93ZXJTZXF1ZW5jZShpbnQgZGlzcCxpbnQgZGVsYXkpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKworCS8qIGRpc3Agc2hvdWxkIGJlIDEgdG8gb3BlbiBzZXF1ZW5jZSAqLworCXJlZyA9IFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpOworCXJlZyA9IEZJRUxEX1ZBTFVFKHJlZyxQQU5FTF9ESVNQTEFZX0NUUkwsRlBFTixkaXNwKTsKKwlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLHJlZyk7CisJcHJpbWFyeVdhaXRWZXJ0aWNhbFN5bmMoZGVsYXkpOworCisKKwlyZWcgPSBQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKTsKKwlyZWcgPSBGSUVMRF9WQUxVRShyZWcsUEFORUxfRElTUExBWV9DVFJMLERBVEEsZGlzcCk7CisJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCxyZWcpOworCXByaW1hcnlXYWl0VmVydGljYWxTeW5jKGRlbGF5KTsKKworCXJlZyA9IFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpOworCXJlZyA9IEZJRUxEX1ZBTFVFKHJlZyxQQU5FTF9ESVNQTEFZX0NUUkwsVkJJQVNFTixkaXNwKTsKKwlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLHJlZyk7CisJcHJpbWFyeVdhaXRWZXJ0aWNhbFN5bmMoZGVsYXkpOworCisKKwlyZWcgPSBQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKTsKKwlyZWcgPSBGSUVMRF9WQUxVRShyZWcsUEFORUxfRElTUExBWV9DVFJMLEZQRU4sZGlzcCk7CisJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCxyZWcpOworCXByaW1hcnlXYWl0VmVydGljYWxTeW5jKGRlbGF5KTsKKworfQorCit2b2lkIGRkazc1MF9zZXRMb2dpY2FsRGlzcE91dChkaXNwX291dHB1dF90IG91dHB1dCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCWlmKG91dHB1dCAmIFBOTF8yX1VTQUdFKXsKKwkJLyogc2V0IHBhbmVsIHBhdGggY29udHJvbGxlciBzZWxlY3QgKi8KKwkJcmVnID0gUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCk7CisJCXJlZyA9IEZJRUxEX1ZBTFVFKHJlZyxQQU5FTF9ESVNQTEFZX0NUUkwsU0VMRUNULChvdXRwdXQgJiBQTkxfMl9NQVNLKT4+UE5MXzJfT0ZGU0VUKTsKKwkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCxyZWcpOworCX0KKworCWlmKG91dHB1dCAmIENSVF8yX1VTQUdFKXsKKwkJLyogc2V0IGNydCBwYXRoIGNvbnRyb2xsZXIgc2VsZWN0ICovCisJCXJlZyA9IFBFRUszMihDUlRfRElTUExBWV9DVFJMKTsKKwkJcmVnID0gRklFTERfVkFMVUUocmVnLENSVF9ESVNQTEFZX0NUUkwsU0VMRUNULChvdXRwdXQgJiBDUlRfMl9NQVNLKT4+Q1JUXzJfT0ZGU0VUKTsKKwkJLypzZSBibGFuayBvZmYgKi8KKwkJcmVnID0gRklFTERfU0VUKHJlZyxDUlRfRElTUExBWV9DVFJMLEJMQU5LLE9GRik7CisJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLHJlZyk7CisKKwl9CisKKwlpZihvdXRwdXQgJiBQUklfVFBfVVNBR0UpeworCQkvKiBzZXQgcHJpbWFyeSB0aW1pbmcgYW5kIHBsYW5lIGVuX2JpdCAqLworCQlzZXREaXNwbGF5Q29udHJvbCgwLChvdXRwdXQmUFJJX1RQX01BU0spPj5QUklfVFBfT0ZGU0VUKTsKKwl9CisKKwlpZihvdXRwdXQgJiBTRUNfVFBfVVNBR0UpeworCQkvKiBzZXQgc2Vjb25kYXJ5IHRpbWluZyBhbmQgcGxhbmUgZW5fYml0Ki8KKwkJc2V0RGlzcGxheUNvbnRyb2woMSwob3V0cHV0JlNFQ19UUF9NQVNLKT4+U0VDX1RQX09GRlNFVCk7CisJfQorCisJaWYob3V0cHV0ICYgUE5MX1NFUV9VU0FHRSl7CisJCS8qIHNldCAgcGFuZWwgc2VxdWVuY2UgKi8KKwkJc3dQYW5lbFBvd2VyU2VxdWVuY2UoKG91dHB1dCZQTkxfU0VRX01BU0spPj5QTkxfU0VRX09GRlNFVCw0KTsKKwl9CisKKwlpZihvdXRwdXQgJiBEQUNfVVNBR0UpCisJCXNldERBQygob3V0cHV0ICYgREFDX01BU0spPj5EQUNfT0ZGU0VUKTsKKworCWlmKG91dHB1dCAmIERQTVNfVVNBR0UpCisJCWRkazc1MF9zZXREUE1TKChvdXRwdXQgJiBEUE1TX01BU0spID4+IERQTVNfT0ZGU0VUKTsKK30KKworCitpbnQgZGRrNzUwX2luaXREVklEaXNwKHZvaWQpCit7CisgICAgLyogSW5pdGlhbGl6ZSBEVkkuIElmIHRoZSBkdmlJbml0IGZhaWwgYW5kIHRoZSBWZW5kb3JJRCBvciB0aGUgRGV2aWNlSUQgYXJlCisgICAgICAgbm90IHplcm9lZCwgdGhlbiBzZXQgdGhlIGZhaWx1cmUgZmxhZy4gSWYgaXQgaXMgemVyb2UsIGl0IG1pZ2h0IG1lYW4KKyAgICAgICB0aGF0IHRoZSBzeXN0ZW0gaXMgaW4gRHVhbCBDUlQgTW9uaXRvciBjb25maWd1cmF0aW9uLiAqLworCisgICAgLyogRGUtc2tldyBlbmFibGVkIHdpdGggZGVmYXVsdCAxMTFiIHZhbHVlLgorICAgICAgIFRoaXMgd2lsbCBmaXggc29tZSBhcnRpZmFjdHMgcHJvYmxlbSBpbiBzb21lIG1vZGUgb24gYm9hcmQgMi4yLgorICAgICAgIFNvbWVob3cgdGhpcyBmaXggZG9lcyBub3QgYWZmZWN0IGJvYXJkIDIuMS4KKyAgICAgKi8KKyAgICBpZiAoKGR2aUluaXQoMSwgIC8qIFNlbGVjdCBSaXNpbmcgRWRnZSAqLworICAgICAgICAgICAgICAgIDEsICAvKiBTZWxlY3QgMjQtYml0IGJ1cyAqLworICAgICAgICAgICAgICAgIDAsICAvKiBTZWxlY3QgU2luZ2xlIEVkZ2UgY2xvY2sgKi8KKyAgICAgICAgICAgICAgICAxLCAgLyogRW5hYmxlIEhTeW5jIGFzIGlzICovCisgICAgICAgICAgICAgICAgMSwgIC8qIEVuYWJsZSBWU3luYyBhcyBpcyAqLworICAgICAgICAgICAgICAgIDEsICAvKiBFbmFibGUgRGUtc2tldyAqLworICAgICAgICAgICAgICAgIDcsICAvKiBTZXQgdGhlIGRlLXNrZXcgc2V0dGluZyB0byBtYXhpbXVtIHNldHVwICovCisgICAgICAgICAgICAgICAgMSwgIC8qIEVuYWJsZSBjb250aW51b3VzIFN5bmMgKi8KKyAgICAgICAgICAgICAgICAxLCAgLyogRW5hYmxlIFBMTCBGaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICA0ICAgLyogVXNlIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSBmb3IgUExMIEZpbHRlciB2YWx1ZSAqLworICAgICAgICApICE9IDApICYmIChkdmlHZXRWZW5kb3JJRCgpICE9IDB4MDAwMCkgJiYgKGR2aUdldERldmljZUlEKCkgIT0gMHgwMDAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIC8qIFRPRE86IEluaXRpYWxpemUgb3RoZXIgZGlzcGxheSBjb21wb25lbnQgKi8KKworICAgIC8qIFN1Y2Nlc3MgKi8KKyAgICByZXR1cm4gMDsKKworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBmODRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaApAQCAtMCwwICsxLDE2MCBAQAorI2lmbmRlZiBEREs3NTBfRElTUExBWV9IX18KKyNkZWZpbmUgRERLNzUwX0RJU1BMQVlfSF9fCisKKy8qIHBhbmVsIHBhdGggc2VsZWN0CisJODAwMDBbMjk6MjhdCisqLworCisjZGVmaW5lIFBOTF8yX09GRlNFVCAwCisjZGVmaW5lIFBOTF8yX01BU0sgKDMgPDwgUE5MXzJfT0ZGU0VUKQorI2RlZmluZSBQTkxfMl9VU0FHRQkoUE5MXzJfTUFTSyA8PCAxNikKKyNkZWZpbmUgUE5MXzJfUFJJIAkoKDAgPDwgUE5MXzJfT0ZGU0VUKXxQTkxfMl9VU0FHRSkKKyNkZWZpbmUgUE5MXzJfU0VDCSgoMiA8PCBQTkxfMl9PRkZTRVQpfFBOTF8yX1VTQUdFKQorCisKKy8qIHByaW1hcnkgdGltaW5nICYgcGxhbmUgZW5hYmxlIGJpdAorCTE6IDgwMDAwWzhdICYgODAwMDBbMl0gb24KKwkwOiBib3RoIG9mZgorKi8KKyNkZWZpbmUgUFJJX1RQX09GRlNFVCA0CisjZGVmaW5lIFBSSV9UUF9NQVNLICgxIDw8IFBSSV9UUF9PRkZTRVQpCisjZGVmaW5lIFBSSV9UUF9VU0FHRSAoUFJJX1RQX01BU0sgPDwgMTYpCisjZGVmaW5lIFBSSV9UUF9PTiAoKDB4MSA8PCBQUklfVFBfT0ZGU0VUKXxQUklfVFBfVVNBR0UpCisjZGVmaW5lIFBSSV9UUF9PRkYgKCgweDAgPDwgUFJJX1RQX09GRlNFVCl8UFJJX1RQX1VTQUdFKQorCisKKy8qIHBhbmVsIHNlcXVlbmN5IHN0YXR1cworCTgwMDAwWzI3OjI0XQorKi8KKyNkZWZpbmUgUE5MX1NFUV9PRkZTRVQgNgorI2RlZmluZSBQTkxfU0VRX01BU0sgKDEgPDwgUE5MX1NFUV9PRkZTRVQpCisjZGVmaW5lIFBOTF9TRVFfVVNBR0UgKFBOTF9TRVFfTUFTSyA8PCAxNikKKyNkZWZpbmUgUE5MX1NFUV9PTiAoKDEgPDwgUE5MX1NFUV9PRkZTRVQpfFBOTF9TRVFfVVNBR0UpCisjZGVmaW5lIFBOTF9TRVFfT0ZGICgoMCA8PCBQTkxfU0VRX09GRlNFVCl8UE5MX1NFUV9VU0FHRSkKKworLyogZHVhbCBkaWdpdGFsIG91dHB1dAorCTgwMDAwWzE5XQorKi8KKyNkZWZpbmUgRFVBTF9URlRfT0ZGU0VUIDgKKyNkZWZpbmUgRFVBTF9URlRfTUFTSyAoMSA8PCBEVUFMX1RGVF9PRkZTRVQpCisjZGVmaW5lIERVQUxfVEZUX1VTQUdFIChEVUFMX1RGVF9NQVNLIDw8IDE2KQorI2RlZmluZSBEVUFMX1RGVF9PTiAoKDEgPDwgRFVBTF9URlRfT0ZGU0VUKXxEVUFMX1RGVF9VU0FHRSkKKyNkZWZpbmUgRFVBTF9URlRfT0ZGICgoMCA8PCBEVUFMX1RGVF9PRkZTRVQpfERVQUxfVEZUX1VTQUdFKQorCisvKiBzZWNvbmRhcnkgdGltaW5nICYgcGxhbmUgZW5hYmxlIGJpdAorCTE6ODAyMDBbOF0gJiA4MDIwMFsyXSBvbgorCTA6IGJvdGggb2ZmCisqLworI2RlZmluZSBTRUNfVFBfT0ZGU0VUIDUKKyNkZWZpbmUgU0VDX1RQX01BU0sgKDE8PCBTRUNfVFBfT0ZGU0VUKQorI2RlZmluZSBTRUNfVFBfVVNBR0UgKFNFQ19UUF9NQVNLIDw8IDE2KQorI2RlZmluZSBTRUNfVFBfT04gICgoMHgxIDw8IFNFQ19UUF9PRkZTRVQpfFNFQ19UUF9VU0FHRSkKKyNkZWZpbmUgU0VDX1RQX09GRiAoKDB4MCA8PCBTRUNfVFBfT0ZGU0VUKXxTRUNfVFBfVVNBR0UpCisKKy8qIGNydCBwYXRoIHNlbGVjdAorCTgwMjAwWzE5OjE4XQorKi8KKyNkZWZpbmUgQ1JUXzJfT0ZGU0VUIDIKKyNkZWZpbmUgQ1JUXzJfTUFTSyAoMyA8PCBDUlRfMl9PRkZTRVQpCisjZGVmaW5lIENSVF8yX1VTQUdFIChDUlRfMl9NQVNLIDw8IDE2KQorI2RlZmluZSBDUlRfMl9QUkkgKCgweDAgPDwgQ1JUXzJfT0ZGU0VUKXxDUlRfMl9VU0FHRSkKKyNkZWZpbmUgQ1JUXzJfU0VDICgoMHgyIDw8IENSVF8yX09GRlNFVCl8Q1JUXzJfVVNBR0UpCisKKworLyogREFDIGFmZmVjdCBib3RoIERWSSBhbmQgRFNVQgorCTRbMjBdCisqLworI2RlZmluZSBEQUNfT0ZGU0VUIDcKKyNkZWZpbmUgREFDX01BU0sgKDEgPDwgREFDX09GRlNFVCkKKyNkZWZpbmUgREFDX1VTQUdFIChEQUNfTUFTSyA8PCAxNikKKyNkZWZpbmUgREFDX09OICgoMHgwPDwgREFDX09GRlNFVCl8REFDX1VTQUdFKQorI2RlZmluZSBEQUNfT0ZGICgoMHgxIDw8IERBQ19PRkZTRVQpfERBQ19VU0FHRSkKKworLyogRFBNUyBvbmx5IGFmZmVjdCBELVNVQiBoZWFkCisJMFszMTozMF0KKyovCisjZGVmaW5lIERQTVNfT0ZGU0VUIDkKKyNkZWZpbmUgRFBNU19NQVNLICgzIDw8IERQTVNfT0ZGU0VUKQorI2RlZmluZSBEUE1TX1VTQUdFIChEUE1TX01BU0sgPDwgMTYpCisjZGVmaW5lIERQTVNfT0ZGICgoMyA8PCBEUE1TX09GRlNFVCl8RFBNU19VU0FHRSkKKyNkZWZpbmUgRFBNU19PTiAoKDAgPDwgRFBNU19PRkZTRVQpfERQTVNfVVNBR0UpCisKKworCisvKgorCUxDRDEgbWVhbnMgcGFuZWwgcGF0aCBURlQxICAmIHBhbmVsIHBhdGggRFZJIChzbyBlbmFibGUgREFDKQorCUNSVCBtZWFucyBjcnQgcGF0aCBEU1VCCisqLworI2lmIDAKK3R5cGVkZWYgZW51bSBfZGlzcF9vdXRwdXRfdAoreworCU5PX0RJU1BMQVkgPSBEUE1TX09GRiwKKworCUxDRDFfUFJJID0gUE5MXzJfUFJJfFBSSV9UUF9PTnxQTkxfU0VRX09OfERQTVNfT0ZGfERBQ19PTiwKKwlMQ0QxX1NFQyA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnxEUE1TX09GRnxEQUNfT04sCisKKwlMQ0QyX1BSSSA9IENSVF8yX1BSSXxQUklfVFBfT058RFVBTF9URlRfT058RFBNU19PRkYsCisJTENEMl9TRUMgPSBDUlRfMl9TRUN8U0VDX1RQX09OfERVQUxfVEZUX09OfERQTVNfT0ZGLAorCisJRFNVQl9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OfERBQ19PTiwKKwlEU1VCX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058REFDX09OLAorCisJTENEMV9EU1VCX1BSSSA9IFBOTF8yX1BSSXxQUklfVFBfT058UE5MX1NFUV9PTnwKKwkJCQkJQ1JUXzJfUFJJfFNFQ19UUF9PRkZ8REFDX09OLAorCisJTENEMV9EU1VCX1NFQyA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnwKKwkJCQkJQ1JUXzJfU0VDfFBSSV9UUF9PRkZ8REFDX09OLAorCisJLyogTENEMSBzaG93IHByaW1hcnkgYW5kIERTVUIgc2hvdyBzZWNvbmRhcnkgKi8KKwlMQ0QxX0RTVUJfRFVBTCA9IFBOTF8yX1BSSXxQUklfVFBfT058UE5MX1NFUV9PTnwKKwkJCQkJIENSVF8yX1NFQ3xTRUNfVFBfT058REFDX09OLAorCisJLyogTENEMSBzaG93IHNlY29uZGFyeSBhbmQgRFNVQiBzaG93IHByaW1hcnkgKi8KKwlMQ0QxX0RTVUJfRFVBTF9TV0FQID0gUE5MXzJfU0VDfFNFQ19UUF9PTnxQTkxfU0VRX09OfAorCQkJCQkJCUNSVF8yX1BSSXxQUklfVFBfT058REFDX09OLAorCisJTENEMV9MQ0QyX1BSSSA9IFBOTF8yX1BSSXxQUklfVFBfT058UE5MX1NFUV9PTnwKKwkJCQkJQ1JUXzJfUFJJfFNFQ19UUF9PRkZ8RFBNU19PRkZ8RFVBTF9URlRfT04sCisKKwlMQ0QxX0xDRDJfU0VDID0gUE5MXzJfU0VDfFNFQ19UUF9PTnxQTkxfU0VRX09OfAorCQkJCQlDUlRfMl9TRUN8UFJJX1RQX09GRnxEUE1TX09GRnxEVUFMX1RGVF9PTiwKKworCUxDRDFfTENEMl9EU1VCX1BSSSA9IFBOTF8yX1BSSXxQUklfVFBfT058UE5MX1NFUV9PTnxEQUNfT058CisJCQkJCQlDUlRfMl9QUkl8U0VDX1RQX09GRnxEUE1TX09OfERVQUxfVEZUX09OLAorCisJTENEMV9MQ0QyX0RTVUJfU0VDID0gUE5MXzJfU0VDfFNFQ19UUF9PTnxQTkxfU0VRX09OfERBQ19PTnwKKwkJCQkJCUNSVF8yX1NFQ3xQUklfVFBfT0ZGfERQTVNfT058RFVBTF9URlRfT04sCisKKworfQorZGlzcF9vdXRwdXRfdDsKKyNlbHNlCit0eXBlZGVmIGVudW0gX2Rpc3Bfb3V0cHV0X3R7CisJZG9fTENEMV9QUkkgPSBQTkxfMl9QUkl8UFJJX1RQX09OfFBOTF9TRVFfT058REFDX09OLAorCWRvX0xDRDFfU0VDID0gUE5MXzJfU0VDfFNFQ19UUF9PTnxQTkxfU0VRX09OfERBQ19PTiwKKyNpZiAwCisJZG9fTENEMl9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OLAorCWRvX0xDRDJfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTiwKKyNlbHNlCisJZG9fTENEMl9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OfERVQUxfVEZUX09OLAorCWRvX0xDRDJfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTnxEVUFMX1RGVF9PTiwKKyNlbmRpZgorCS8qCisJZG9fRFNVQl9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OfERQTVNfT058REFDX09OLAorCWRvX0RTVUJfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTnxEUE1TX09OfERBQ19PTiwKKwkqLworI2lmIDAKKwlkb19DUlRfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTiwKKwlkb19DUlRfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTiwKKyNlbHNlCisJZG9fQ1JUX1BSSSA9IENSVF8yX1BSSXxQUklfVFBfT058RFBNU19PTnxEQUNfT04sCisJZG9fQ1JUX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058RFBNU19PTnxEQUNfT04sCisjZW5kaWYKK30KK2Rpc3Bfb3V0cHV0X3Q7CisjZW5kaWYKKwordm9pZCBkZGs3NTBfc2V0TG9naWNhbERpc3BPdXQoZGlzcF9vdXRwdXRfdCk7CitpbnQgZGRrNzUwX2luaXREVklEaXNwKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkzMmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5jCkBAIC0wLDAgKzEsOTkgQEAKKyNkZWZpbmUgVVNFX0RWSUNISVAgCisjaWZkZWYgVVNFX0RWSUNISVAKKyNpbmNsdWRlICJkZGs3NTBfaGVscC5oIgorI2luY2x1ZGUgImRkazc1MF9yZWcuaCIKKyNpbmNsdWRlICJkZGs3NTBfZHZpLmgiCisjaW5jbHVkZSAiZGRrNzUwX3NpaTE2NC5oIgorCisKKy8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGNvbnRhaW5zIGFsbCB0aGUgc3VwcG9ydGVkIGRyaXZlciBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKKyAgIGZ1bmN0aW9uIEFQSS4gUGxlYXNlIHNldCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBOVUxMIHdoZW5ldmVyIHRoZSBmdW5jdGlvbgorICAgaXMgbm90IHN1cHBvcnRlZC4gKi8KK3N0YXRpYyBkdmlfY3RybF9kZXZpY2VfdCBnX2RjZnRTdXBwb3J0ZWREdmlDb250cm9sbGVyW10gPQoreworI2lmZGVmIERWSV9DVFJMX1NJSTE2NAorICAgIHsKKyAgICAgICAgLnBmbkluaXQgPSBzaWkxNjRJbml0Q2hpcCwKKyAgICAgICAgLnBmbkdldFZlbmRvcklkID0gc2lpMTY0R2V0VmVuZG9ySUQsCisgICAgICAgIC5wZm5HZXREZXZpY2VJZCA9IHNpaTE2NEdldERldmljZUlELAorI2lmZGVmIFNJSTE2NF9GVUxMX0ZVTkNUSU9OUworICAgICAgICAucGZuUmVzZXRDaGlwID0gc2lpMTY0UmVzZXRDaGlwLAorICAgICAgICAucGZuR2V0Q2hpcFN0cmluZyA9IHNpaTE2NEdldENoaXBTdHJpbmcsCisgICAgICAgIC5wZm5TZXRQb3dlciA9IHNpaTE2NFNldFBvd2VyLAorICAgICAgICAucGZuRW5hYmxlSG90UGx1Z0RldGVjdGlvbiA9IHNpaTE2NEVuYWJsZUhvdFBsdWdEZXRlY3Rpb24sCisgICAgICAgIC5wZm5Jc0Nvbm5lY3RlZCA9IHNpaTE2NElzQ29ubmVjdGVkLAorICAgICAgICAucGZuQ2hlY2tJbnRlcnJ1cHQgPSBzaWkxNjRDaGVja0ludGVycnVwdCwKKyAgICAgICAgLnBmbkNsZWFySW50ZXJydXB0ID0gc2lpMTY0Q2xlYXJJbnRlcnJ1cHQsCisjZW5kaWYKKyAgICB9LAorI2VuZGlmCit9OworCisKK2ludCBkdmlJbml0KAorICAgIHVuc2lnbmVkIGNoYXIgZWRnZVNlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ1c1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGR1YWxFZGdlQ2xrU2VsZWN0LAorICAgIHVuc2lnbmVkIGNoYXIgaHN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciB2c3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld1NldHRpbmcsCisgICAgdW5zaWduZWQgY2hhciBjb250aW51b3VzU3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlckVuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlclZhbHVlCisJCQkpCit7CisJZHZpX2N0cmxfZGV2aWNlX3QgKnBDdXJyZW50RHZpQ3RybDsKKwlwQ3VycmVudER2aUN0cmwgPSBnX2RjZnRTdXBwb3J0ZWREdmlDb250cm9sbGVyOworCWlmKHBDdXJyZW50RHZpQ3RybC0+cGZuSW5pdCAhPSBOVUxMKQorCXsKKwkJcmV0dXJuIHBDdXJyZW50RHZpQ3RybC0+cGZuSW5pdChlZGdlU2VsZWN0LCBidXNTZWxlY3QsIGR1YWxFZGdlQ2xrU2VsZWN0LCBoc3luY0VuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzeW5jRW5hYmxlLCBkZXNrZXdFbmFibGUsIGRlc2tld1NldHRpbmcsIGNvbnRpbnVvdXNTeW5jRW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxsRmlsdGVyRW5hYmxlLCBwbGxGaWx0ZXJWYWx1ZSk7CisJfQorCXJldHVybiAtMTsvL2Vycm9yCit9CisKKworLyoKKyAqICBkdmlHZXRWZW5kb3JJRAorICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHZlbmRvciBJRCBvZiB0aGUgRFZJIGNvbnRyb2xsZXIgY2hpcC4KKyAqCisgKiAgT3V0cHV0OgorICogICAgICBWZW5kb3IgSUQKKyAqLwordW5zaWduZWQgc2hvcnQgZHZpR2V0VmVuZG9ySUQodm9pZCkKK3sKKyAgICBkdmlfY3RybF9kZXZpY2VfdCAqcEN1cnJlbnREdmlDdHJsOworCisgICAgLy9wQ3VycmVudER2aUN0cmwgPSBnZXREdmlDdHJsKCk7CisgICAgcEN1cnJlbnREdmlDdHJsID0gZ19kY2Z0U3VwcG9ydGVkRHZpQ29udHJvbGxlcjsKKyAgICBpZiAocEN1cnJlbnREdmlDdHJsICE9IChkdmlfY3RybF9kZXZpY2VfdCAqKTApCisgICAgICAgIHJldHVybiBwQ3VycmVudER2aUN0cmwtPnBmbkdldFZlbmRvcklkKCk7CisKKyAgICByZXR1cm4gMHgwMDAwOworfQorCisKKy8qCisgKiAgZHZpR2V0RGV2aWNlSUQKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBkZXZpY2UgSUQgb2YgdGhlIERWSSBjb250cm9sbGVyIGNoaXAuCisgKgorICogIE91dHB1dDoKKyAqICAgICAgRGV2aWNlIElECisgKi8KK3Vuc2lnbmVkIHNob3J0IGR2aUdldERldmljZUlEKHZvaWQpCit7CisgICAgZHZpX2N0cmxfZGV2aWNlX3QgKnBDdXJyZW50RHZpQ3RybDsKKworLy8gICAgcEN1cnJlbnREdmlDdHJsID0gZ2V0RHZpQ3RybCgpOworCXBDdXJyZW50RHZpQ3RybCA9IGdfZGNmdFN1cHBvcnRlZER2aUNvbnRyb2xsZXI7CisgICAgaWYgKHBDdXJyZW50RHZpQ3RybCAhPSAoZHZpX2N0cmxfZGV2aWNlX3QgKikwKQorICAgICAgICByZXR1cm4gcEN1cnJlbnREdmlDdHJsLT5wZm5HZXREZXZpY2VJZCgpOworCisgICAgcmV0dXJuIDB4MDAwMDsKK30KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYmNlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmgKQEAgLTAsMCArMSw2NyBAQAorI2lmbmRlZiBEREs3NTBfRFZJX0hfXworI2RlZmluZSBEREs3NTBfRFZJX0hfXworCisvKiBkdmkgY2hpcCBzdHVmZnMgc3RydWN0cm9zICovCisKK3R5cGVkZWYgbG9uZyAoKlBGTl9EVklDVFJMX0lOSVQpKAorICAgIHVuc2lnbmVkIGNoYXIgZWRnZVNlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ1c1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGR1YWxFZGdlQ2xrU2VsZWN0LAorICAgIHVuc2lnbmVkIGNoYXIgaHN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciB2c3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld1NldHRpbmcsCisgICAgdW5zaWduZWQgY2hhciBjb250aW51b3VzU3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlckVuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlclZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoKlBGTl9EVklDVFJMX1JFU0VUQ0hJUCkodm9pZCk7Cit0eXBlZGVmIGNoYXIqICgqUEZOX0RWSUNUUkxfR0VUQ0hJUFNUUklORykodm9pZCk7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICgqUEZOX0RWSUNUUkxfR0VUVkVORE9SSUQpKHZvaWQpOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAoKlBGTl9EVklDVFJMX0dFVERFVklDRUlEKSh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoKlBGTl9EVklDVFJMX1NFVFBPV0VSKSh1bnNpZ25lZCBjaGFyIHBvd2VyVXApOwordHlwZWRlZiB2b2lkICgqUEZOX0RWSUNUUkxfSE9UUExVR0RFVEVDVElPTikodW5zaWduZWQgY2hhciBlbmFibGVIb3RQbHVnKTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAoKlBGTl9EVklDVFJMX0lTQ09OTkVDVEVEKSh2b2lkKTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAoKlBGTl9EVklDVFJMX0NIRUNLSU5URVJSVVBUKSh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoKlBGTl9EVklDVFJMX0NMRUFSSU5URVJSVVBUKSh2b2lkKTsKKworCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgRFZJIENvbnRyb2xsZXIuICovCit0eXBlZGVmIHN0cnVjdCBfZHZpX2N0cmxfZGV2aWNlX3QKK3sKKyAgICBQRk5fRFZJQ1RSTF9JTklUICAgICAgICAgICAgICAgIHBmbkluaXQ7CisgICAgUEZOX0RWSUNUUkxfUkVTRVRDSElQICAgICAgICAgICBwZm5SZXNldENoaXA7CisgICAgUEZOX0RWSUNUUkxfR0VUQ0hJUFNUUklORyAgICAgICBwZm5HZXRDaGlwU3RyaW5nOworICAgIFBGTl9EVklDVFJMX0dFVFZFTkRPUklEICAgICAgICAgcGZuR2V0VmVuZG9ySWQ7CisgICAgUEZOX0RWSUNUUkxfR0VUREVWSUNFSUQgICAgICAgICBwZm5HZXREZXZpY2VJZDsKKyAgICBQRk5fRFZJQ1RSTF9TRVRQT1dFUiAgICAgICAgICAgIHBmblNldFBvd2VyOworICAgIFBGTl9EVklDVFJMX0hPVFBMVUdERVRFQ1RJT04gICAgcGZuRW5hYmxlSG90UGx1Z0RldGVjdGlvbjsKKyAgICBQRk5fRFZJQ1RSTF9JU0NPTk5FQ1RFRCAgICAgICAgIHBmbklzQ29ubmVjdGVkOworICAgIFBGTl9EVklDVFJMX0NIRUNLSU5URVJSVVBUICAgICAgcGZuQ2hlY2tJbnRlcnJ1cHQ7CisgICAgUEZOX0RWSUNUUkxfQ0xFQVJJTlRFUlJVUFQgICAgICBwZm5DbGVhckludGVycnVwdDsKK30gZHZpX2N0cmxfZGV2aWNlX3Q7CisjZGVmaW5lIERWSV9DVFJMX1NJSTE2NAorCisKKworLyogZHZpIGZ1bmN0aW9ucyBwcm90b3R5cGUgKi8KK2ludCBkdmlJbml0KAorICAgIHVuc2lnbmVkIGNoYXIgZWRnZVNlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ1c1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGR1YWxFZGdlQ2xrU2VsZWN0LAorICAgIHVuc2lnbmVkIGNoYXIgaHN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciB2c3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld1NldHRpbmcsCisgICAgdW5zaWduZWQgY2hhciBjb250aW51b3VzU3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlckVuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlclZhbHVlCispOworCit1bnNpZ25lZCBzaG9ydCBkdmlHZXRWZW5kb3JJRCh2b2lkKTsKK3Vuc2lnbmVkIHNob3J0IGR2aUdldERldmljZUlEKHZvaWQpOworCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9oZWxwLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OGZmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaGVscC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8vI2luY2x1ZGUgImRkazc1MF9yZWcuaCIKKy8vI2luY2x1ZGUgImRkazc1MF9jaGlwLmgiCisjaW5jbHVkZSAiZGRrNzUwX2hlbHAuaCIKKwordm9pZCBfX2lvbWVtICogbW1pbzc1MCA9IE5VTEw7CitjaGFyIHJldklkNzUwID0gMDsKK3Vuc2lnbmVkIHNob3J0IGRldklkNzUwID0gMDsKKworLyogYWZ0ZXIgZHJpdmVyIG1hcHBlZCBpbyByZWdpc3RlcnMsIHVzZSB0aGlzIGZ1bmN0aW9uIGZpcnN0ICovCit2b2lkIGRkazc1MF9zZXRfbW1pbyh2b2lkIF9faW9tZW0gKiBhZGRyLHVuc2lnbmVkIHNob3J0IGRldklkLGNoYXIgcmV2SWQpCit7CisJbW1pbzc1MCA9IGFkZHI7CisJZGV2SWQ3NTAgPSBkZXZJZDsKKwlyZXZJZDc1MCA9IHJldklkOworCWlmKHJldklkID09IDB4ZmUpCisJCXByaW50aygiZm91bmQgc203NTBsZVxuIik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2hlbHAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9oZWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjODI2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9oZWxwLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBEREs3NTBfSEVMUF9IX18KKyNkZWZpbmUgRERLNzUwX0hFTFBfSF9fCisjaW5jbHVkZSAiZGRrNzUwX2NoaXAuaCIKKyNpZm5kZWYgVVNFX0lOVEVSTkFMX1JFR0lTVEVSX0FDQ0VTUworCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJzbTc1MF9oZWxwLmgiCisKKworI2lmIDAKKy8qIGlmIDcxOCBiaWcgZW5kaWFuIHR1cm5lZCBvbixiZSBhd2FyZSB0aGF0IGRvbid0IHVzZSB0aGlzIGRyaXZlciBmb3IgZ2VuZXJhbCB1c2Usb25seSBmb3IgcHBjIGJpZy1lbmRpYW4gKi8KKyN3YXJuaW5nICJiaWcgZW5kaWFuIG9uIHRhcmdldCBjcHUgYW5kIGVuYWJsZSBuYXR1cmUgYmlnIGVuZGlhbiBzdXBwb3J0IG9mIDcxOCBjYXBhYmlsaXR5ICEiCisjZGVmaW5lIFBFRUszMihhZGRyKSAgCQkJX19yYXdfcmVhZGwobW1pbzc1MCArIGFkZHIpCisjZGVmaW5lIFBPS0UzMihhZGRyLGRhdGEpIAkJX19yYXdfd3JpdGVsKGRhdGEsIG1taW83NTAgKyBhZGRyKQorI2Vsc2UgLyogc29mdHdhcmUgY29udHJvbCBlbmRpYW5lc3MgKi8KKyNkZWZpbmUgUEVFSzMyKGFkZHIpIHJlYWRsKGFkZHIgKyBtbWlvNzUwKQorI2RlZmluZSBQT0tFMzIoYWRkcixkYXRhKSB3cml0ZWwoZGF0YSwgYWRkciArIG1taW83NTApCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19pb21lbSAqIG1taW83NTA7CitleHRlcm4gY2hhciByZXZJZDc1MDsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBkZXZJZDc1MDsKKyNlbHNlCisvKiBpbXBsZW1lbnQgaWYgeW91IHdhbnQgdXNlIGl0Ki8KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9od2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyNjM3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9od2kyYy5jCkBAIC0wLDAgKzEsMjcxIEBACisjZGVmaW5lIFVTRV9IV19JMkMKKyNpZmRlZiBVU0VfSFdfSTJDCisjaW5jbHVkZSAiZGRrNzUwX2hlbHAuaCIKKyNpbmNsdWRlICJkZGs3NTBfcmVnLmgiCisjaW5jbHVkZSAiZGRrNzUwX2h3aTJjLmgiCisjaW5jbHVkZSAiZGRrNzUwX3Bvd2VyLmgiCisKKyNkZWZpbmUgTUFYX0hXSTJDX0ZJRk8gICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBIV0kyQ19XQUlUX1RJTUVPVVQgICAgICAgICAgICAgIDB4RjAwMDAKKworCitpbnQgaHdJMkNJbml0KAorICAgIHVuc2lnbmVkIGNoYXIgYnVzU3BlZWRNb2RlCispCit7CisgICAgdW5zaWduZWQgaW50IHZhbHVlOworCisgICAgLyogRW5hYmxlIEdQSU8gMzAgJiAzMSBhcyBJSUMgY2xvY2sgJiBkYXRhICovCisJdmFsdWUgPSBQRUVLMzIoR1BJT19NVVgpOworCisgICAgdmFsdWUgPSBGSUVMRF9TRVQodmFsdWUsIEdQSU9fTVVYLCAzMCwgSTJDKSB8CisJCQlGSUVMRF9TRVQoMCwgR1BJT19NVVgsIDMxLCBJMkMpOworCVBPS0UzMihHUElPX01VWCwgdmFsdWUpOworCisgICAgLyogRW5hYmxlIEhhcmR3YXJlIEkyQyBwb3dlci4KKyAgICAgICBUT0RPOiBDaGVjayBpZiB3ZSBuZWVkIHRvIGVuYWJsZSBHUElPIHBvd2VyPworICAgICAqLworICAgIGVuYWJsZUkyQygxKTsKKworICAgIC8qIEVuYWJsZSB0aGUgSTJDIENvbnRyb2xsZXIgYW5kIHNldCB0aGUgYnVzIHNwZWVkIG1vZGUgKi8KKyAgICB2YWx1ZSA9IFBFRUszMihJMkNfQ1RSTCk7CisgICAgaWYgKGJ1c1NwZWVkTW9kZSA9PSAwKQorICAgICAgICB2YWx1ZSA9IEZJRUxEX1NFVCh2YWx1ZSwgSTJDX0NUUkwsIE1PREUsIFNUQU5EQVJEKTsKKyAgICBlbHNlCisgICAgICAgIHZhbHVlID0gRklFTERfU0VUKHZhbHVlLCBJMkNfQ1RSTCwgTU9ERSwgRkFTVCk7CisgICAgdmFsdWUgPSBGSUVMRF9TRVQodmFsdWUsIEkyQ19DVFJMLCBFTiwgRU5BQkxFKTsKKyAgICBQT0tFMzIoSTJDX0NUUkwsIHZhbHVlKTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgaHdJMkNDbG9zZSh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKKworICAgIC8qIERpc2FibGUgSTJDIGNvbnRyb2xsZXIgKi8KKyAgICB2YWx1ZSA9IFBFRUszMihJMkNfQ1RSTCk7CisgICAgdmFsdWUgPSBGSUVMRF9TRVQodmFsdWUsIEkyQ19DVFJMLCBFTiwgRElTQUJMRSk7CisgICAgUE9LRTMyKEkyQ19DVFJMLCB2YWx1ZSk7CisKKyAgICAvKiBEaXNhYmxlIEkyQyBQb3dlciAqLworICAgIGVuYWJsZUkyQygwKTsKKworICAgIC8qIFNldCBHUElPIDMwICYgMzEgYmFjayBhcyBHUElPIHBpbnMgKi8KKyAgICB2YWx1ZSA9IFBFRUszMihHUElPX01VWCk7CisgICAgdmFsdWUgPSBGSUVMRF9TRVQodmFsdWUsIEdQSU9fTVVYLCAzMCwgR1BJTyk7CisgICAgdmFsdWUgPSBGSUVMRF9TRVQodmFsdWUsIEdQSU9fTVVYLCAzMSwgR1BJTyk7CisgICAgUE9LRTMyKEdQSU9fTVVYLCB2YWx1ZSk7Cit9CisKKworc3RhdGljIGxvbmcgaHdJMkNXYWl0VFhEb25lKHZvaWQpCit7CisgICAgdW5zaWduZWQgaW50IHRpbWVvdXQ7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuICovCisgICAgdGltZW91dCA9IEhXSTJDX1dBSVRfVElNRU9VVDsKKwl3aGlsZSAoKEZJRUxEX0dFVChQRUVLMzIoSTJDX1NUQVRVUyksIEkyQ19TVEFUVVMsIFRYKSAhPSBJMkNfU1RBVFVTX1RYX0NPTVBMRVRFRCkgJiYKKyAgICAgICAgICAgKHRpbWVvdXQgIT0gMCkpCisJCXRpbWVvdXQtLTsKKworCWlmICh0aW1lb3V0ID09IDApCisJICAgIHJldHVybiAoLTEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisvKgorICogIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gdGhlIGkyYyBzbGF2ZSBkZXZpY2UgcmVnaXN0ZXJzLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZpY2VBZGRyZXNzICAgLSBpMmMgU2xhdmUgZGV2aWNlIGFkZHJlc3MKKyAqICAgICAgbGVuZ3RoICAgICAgICAgIC0gVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGRldmljZQorICogICAgICBwQnVmZmVyICAgICAgICAgLSBUaGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgaTJjIGRldmljZS4KKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhvc2UgYXJlIGFjdHVhbGx5IHdyaXR0ZW4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdJMkNXcml0ZURhdGEoCisgICAgdW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLAorICAgIHVuc2lnbmVkIGludCBsZW5ndGgsCisgICAgdW5zaWduZWQgY2hhciAqcEJ1ZmZlcgorKQoreworICAgIHVuc2lnbmVkIGNoYXIgY291bnQsIGk7CisgICAgdW5zaWduZWQgaW50IHRvdGFsQnl0ZXMgPSAwOworCisgICAgLyogU2V0IHRoZSBEZXZpY2UgQWRkcmVzcyAqLworICAgIFBPS0UzMihJMkNfU0xBVkVfQUREUkVTUywgZGV2aWNlQWRkcmVzcyAmIH4weDAxKTsKKworICAgIC8qIFdyaXRlIGRhdGEuCisgICAgICogTm90ZToKKyAgICAgKiAgICAgIE9ubHkgMTYgYnl0ZSBjYW4gYmUgYWNjZXNzZWQgcGVyIGkyYyBzdGFydCBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgLyogUmVzZXQgSTJDIGJ5IHdyaXRpbmcgMCB0byBJMkNfUkVTRVQgcmVnaXN0ZXIgdG8gY2xlYXIgdGhlIHByZXZpb3VzIHN0YXR1cy4gKi8KKyAgICAgICAgUE9LRTMyKEkyQ19SRVNFVCwgMCk7CisKKyAgICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiAqLworICAgICAgICBpZiAobGVuZ3RoIDwgTUFYX0hXSTJDX0ZJRk8pCisgICAgICAgICAgICBjb3VudCA9IGxlbmd0aCAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvdW50ID0gTUFYX0hXSTJDX0ZJRk8gLSAxOworICAgICAgICBQT0tFMzIoSTJDX0JZVEVfQ09VTlQsIGNvdW50KTsKKworICAgICAgICAvKiBNb3ZlIHRoZSBkYXRhIHRvIHRoZSBJMkMgZGF0YSByZWdpc3RlciAqLworCSAgICBmb3IgKGkgPSAwOyBpIDw9IGNvdW50OyBpKyspCisgICAgICAgICAgICBQT0tFMzIoSTJDX0RBVEEwICsgaSwgKnBCdWZmZXIrKyk7CisKKyAgICAgICAgLyogU3RhcnQgdGhlIEkyQyAqLworICAgICAgICBQT0tFMzIoSTJDX0NUUkwsIEZJRUxEX1NFVChQRUVLMzIoSTJDX0NUUkwpLCBJMkNfQ1RSTCwgQ1RSTCwgU1RBUlQpKTsKKworICAgICAgICAvKiBXYWl0IHVudGlsIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZWQuICovCisgICAgICAgIGlmIChod0kyQ1dhaXRUWERvbmUoKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogU3Vic3RyYWN0IGxlbmd0aCAqLworICAgICAgICBsZW5ndGggLT0gKGNvdW50ICsgMSk7CisKKyAgICAgICAgLyogVG90YWwgYnl0ZSB3cml0dGVuICovCisgICAgICAgIHRvdGFsQnl0ZXMgKz0gKGNvdW50ICsgMSk7CisKKyAgICB9IHdoaWxlIChsZW5ndGggPiAwKTsKKworICAgIHJldHVybiB0b3RhbEJ5dGVzOworfQorCisKKworCisvKgorICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgZGF0YSBmcm9tIHRoZSBzbGF2ZSBkZXZpY2UgYW5kIHN0b3JlcyB0aGVtCisgKiAgaW4gdGhlIGdpdmVuIGJ1ZmZlcgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZpY2VBZGRyZXNzICAgLSBpMmMgU2xhdmUgZGV2aWNlIGFkZHJlc3MKKyAqICAgICAgbGVuZ3RoICAgICAgICAgIC0gVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlYWQKKyAqICAgICAgcEJ1ZmZlciAgICAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciB0byBiZSBmaWxsZWQgd2l0aCB0aGUgZGF0YSByZWFkCisgKiAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHNsYXZlIGRldmljZS4gSXQgaGFzIHRvIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCB0byBtYWtlIHN1cmUgdGhhdCBpdCBjYW4ga2VlcCBhbGwgdGhlIGRhdGEgcmVhZC4KKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBUb3RhbCBudW1iZXIgb2YgYWN0dWFsIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc2xhdmUgZGV2aWNlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHdJMkNSZWFkRGF0YSgKKyAgICB1bnNpZ25lZCBjaGFyIGRldmljZUFkZHJlc3MsCisgICAgdW5zaWduZWQgaW50IGxlbmd0aCwKKyAgICB1bnNpZ25lZCBjaGFyICpwQnVmZmVyCispCit7CisgICAgdW5zaWduZWQgY2hhciBjb3VudCwgaTsKKyAgICB1bnNpZ25lZCBpbnQgdG90YWxCeXRlcyA9IDA7CisKKyAgICAvKiBTZXQgdGhlIERldmljZSBBZGRyZXNzICovCisgICAgUE9LRTMyKEkyQ19TTEFWRV9BRERSRVNTLCBkZXZpY2VBZGRyZXNzIHwgMHgwMSk7CisKKyAgICAvKiBSZWFkIGRhdGEgYW5kIHNhdmUgdGhlbSB0byB0aGUgYnVmZmVyLgorICAgICAqIE5vdGU6CisgICAgICogICAgICBPbmx5IDE2IGJ5dGUgY2FuIGJlIGFjY2Vzc2VkIHBlciBpMmMgc3RhcnQgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFJlc2V0IEkyQyBieSB3cml0aW5nIDAgdG8gSTJDX1JFU0VUIHJlZ2lzdGVyIHRvIGNsZWFyIGFsbCB0aGUgc3RhdHVzLiAqLworICAgICAgICBQT0tFMzIoSTJDX1JFU0VULCAwKTsKKworICAgICAgICAvKiBTZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkICovCisgICAgICAgIGlmIChsZW5ndGggPD0gTUFYX0hXSTJDX0ZJRk8pCisgICAgICAgICAgICBjb3VudCA9IGxlbmd0aCAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvdW50ID0gTUFYX0hXSTJDX0ZJRk8gLSAxOworICAgICAgICBQT0tFMzIoSTJDX0JZVEVfQ09VTlQsIGNvdW50KTsKKworICAgICAgICAvKiBTdGFydCB0aGUgSTJDICovCisgICAgICAgIFBPS0UzMihJMkNfQ1RSTCwgRklFTERfU0VUKFBFRUszMihJMkNfQ1RSTCksIEkyQ19DVFJMLCBDVFJMLCBTVEFSVCkpOworCisgICAgICAgIC8qIFdhaXQgdW50aWwgdHJhbnNhY3Rpb24gZG9uZS4gKi8KKyAgICAgICAgaWYgKGh3STJDV2FpdFRYRG9uZSgpICE9IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBTYXZlIHRoZSBkYXRhIHRvIHRoZSBnaXZlbiBidWZmZXIgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKQorCQkgICAgKnBCdWZmZXIrKyA9IFBFRUszMihJMkNfREFUQTAgKyBpKTsKKworICAgICAgICAvKiBTdWJzdHJhY3QgbGVuZ3RoIGJ5IDE2ICovCisgICAgICAgIGxlbmd0aCAtPSAoY291bnQgKyAxKTsKKworICAgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gKi8KKyAgICAgICAgdG90YWxCeXRlcyArPSAoY291bnQgKyAxKTsKKworICAgIH0gd2hpbGUgKGxlbmd0aCA+IDApOworCisgICAgcmV0dXJuIHRvdGFsQnl0ZXM7Cit9CisKKworCisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc2xhdmUgZGV2aWNlJ3MgcmVnaXN0ZXIKKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2aWNlQWRkcmVzcyAgIC0gaTJjIFNsYXZlIGRldmljZSBhZGRyZXNzIHdoaWNoIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlYWQgZnJvbQorICogICAgICByZWdpc3RlckluZGV4ICAgLSBTbGF2ZSBkZXZpY2UncyByZWdpc3RlciB0byBiZSByZWFkCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgUmVnaXN0ZXIgdmFsdWUKKyAqLwordW5zaWduZWQgY2hhciBod0kyQ1JlYWRSZWcoCisgICAgdW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLAorICAgIHVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJJbmRleAorKQoreworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUgPSAoMHhGRik7CisKKyAgICBpZiAoaHdJMkNXcml0ZURhdGEoZGV2aWNlQWRkcmVzcywgMSwgJnJlZ2lzdGVySW5kZXgpID09IDEpCisgICAgICAgIGh3STJDUmVhZERhdGEoZGV2aWNlQWRkcmVzcywgMSwgJnZhbHVlKTsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisKKworCisvKgorICogIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgdmFsdWUgdG8gdGhlIHNsYXZlIGRldmljZSdzIHJlZ2lzdGVyCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldmljZUFkZHJlc3MgICAtIGkyYyBTbGF2ZSBkZXZpY2UgYWRkcmVzcyB3aGljaCByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICAgICAgICB0byBiZSB3cml0dGVuCisgKiAgICAgIHJlZ2lzdGVySW5kZXggICAtIFNsYXZlIGRldmljZSdzIHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgZGF0YSAgICAgICAgICAgIC0gRGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSByZWdpc3RlcgorICoKKyAqICBSZXN1bHQ6CisgKiAgICAgICAgICAwICAgLSBTdWNjZXNzCisgKiAgICAgICAgIC0xICAgLSBGYWlsCisgKi8KK2ludCBod0kyQ1dyaXRlUmVnKAorICAgIHVuc2lnbmVkIGNoYXIgZGV2aWNlQWRkcmVzcywKKyAgICB1bnNpZ25lZCBjaGFyIHJlZ2lzdGVySW5kZXgsCisgICAgdW5zaWduZWQgY2hhciBkYXRhCispCit7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZVsyXTsKKworICAgIHZhbHVlWzBdID0gcmVnaXN0ZXJJbmRleDsKKyAgICB2YWx1ZVsxXSA9IGRhdGE7CisgICAgaWYgKGh3STJDV3JpdGVEYXRhKGRldmljZUFkZHJlc3MsIDIsIHZhbHVlKSA9PSAyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAoLTEpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDMxMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBEREs3NTBfSFdJMkNfSF9fCisjZGVmaW5lIERESzc1MF9IV0kyQ19IX18KKworLyogaHdpMmMgZnVuY3Rpb25zICovCitpbnQgaHdJMkNJbml0KHVuc2lnbmVkIGNoYXIgYnVzU3BlZWRNb2RlKTsKK3ZvaWQgaHdJMkNDbG9zZSh2b2lkKTsKKwordW5zaWduZWQgY2hhciBod0kyQ1JlYWRSZWcodW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLHVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJJbmRleCk7CitpbnQgaHdJMkNXcml0ZVJlZyh1bnNpZ25lZCBjaGFyIGRldmljZUFkZHJlc3MsdW5zaWduZWQgY2hhciByZWdpc3RlckluZGV4LHVuc2lnbmVkIGNoYXIgZGF0YSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9tb2RlLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDE4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfbW9kZS5jCkBAIC0wLDAgKzEsMjA1IEBACisKKyNpbmNsdWRlICJkZGs3NTBfaGVscC5oIgorI2luY2x1ZGUgImRkazc1MF9yZWcuaCIKKyNpbmNsdWRlICJkZGs3NTBfbW9kZS5oIgorI2luY2x1ZGUgImRkazc1MF9jaGlwLmgiCisKKy8qCisJU003NTBMRSBvbmx5OgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBleHRyYSByZWdpc3RlcnMgYW5kIGJpdCBmaWVsZHMgcmVxdWlyZWQgdG8gc2V0CisgICAgdXAgYSBtb2RlIGluIFNNNzUwTEUKKworCUV4cGxhbmF0aW9uIGFib3V0IERpc3BsYXkgQ29udHJvbCByZWdpc3RlcjoKKyAgICBIVyBvbmx5IHN1cHBvcnRzIDcgcHJlZGVmaW5lZCBwaXhlbCBjbG9ja3MsIGFuZCBjbG9jayBzZWxlY3QgaXMKKyAgICBpbiBiaXQgMjk6Mjcgb2YJRGlzcGxheSBDb250cm9sIHJlZ2lzdGVyLgorKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRpc3BsYXlDb250cm9sQWRqdXN0X1NNNzUwTEUobW9kZV9wYXJhbWV0ZXJfdCAqcE1vZGVQYXJhbSwgdW5zaWduZWQgbG9uZyBkaXNwQ29udHJvbCkKK3sKKwl1bnNpZ25lZCBsb25nIHgsIHk7CisKKwl4ID0gcE1vZGVQYXJhbS0+aG9yaXpvbnRhbF9kaXNwbGF5X2VuZDsKKwl5ID0gcE1vZGVQYXJhbS0+dmVydGljYWxfZGlzcGxheV9lbmQ7CisKKyAgICAvKiBTTTc1MExFIGhhcyB0byBzZXQgdXAgdGhlIHRvcC1sZWZ0IGFuZCBib3R0b20tcmlnaHQKKyAgICAgICByZWdpc3RlcnMgYXMgd2VsbC4KKyAgICAgICBOb3RlIHRoYXQgbm9ybWFsIFNNNzUwL1NNNzE4IG9ubHkgdXNlIHRob3NlIHR3byByZWdpc3RlciBmb3IKKyAgICAgICBhdXRvLWNlbnRlcmluZyBtb2RlLgorICAgICovCisgICAgUE9LRTMyKENSVF9BVVRPX0NFTlRFUklOR19UTCwKKyAgICAgIEZJRUxEX1ZBTFVFKDAsIENSVF9BVVRPX0NFTlRFUklOR19UTCwgVE9QLCAwKQorICAgIHwgRklFTERfVkFMVUUoMCwgQ1JUX0FVVE9fQ0VOVEVSSU5HX1RMLCBMRUZULCAwKSk7CisKKyAgICBQT0tFMzIoQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSLAorICAgICAgRklFTERfVkFMVUUoMCwgQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSLCBCT1RUT00sIHktMSkKKyAgICB8IEZJRUxEX1ZBTFVFKDAsIENSVF9BVVRPX0NFTlRFUklOR19CUiwgUklHSFQsIHgtMSkpOworCisgICAgLyogQXNzdW1lIGNvbW1vbiBmaWVsZHMgaW4gZGlzcENvbnRyb2wgaGF2ZSBiZWVuIHByb3Blcmx5IHNldCBiZWZvcmUKKyAgICAgICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgICAgVGhpcyBmdW5jdGlvbiBvbmx5IHNldHMgdGhlIGV4dHJhIGZpZWxkcyBpbiBkaXNwQ29udHJvbC4KKyAgICAqLworCisJLyogQ2xlYXIgYml0IDI5OjI3IG9mIGRpc3BsYXkgY29udHJvbCByZWdpc3RlciAqLworICAgIGRpc3BDb250cm9sICY9IEZJRUxEX0NMRUFSKENSVF9ESVNQTEFZX0NUUkwsIENMSyk7CisKKwkvKiBTZXQgYml0IDI5OjI3IG9mIGRpc3BsYXkgY29udHJvbCByZWdpc3RlciBmb3IgdGhlIHJpZ2h0IGNsb2NrICovCisJLyogTm90ZSB0aGF0IFNNNzUwTEUgb25seSBuZWVkIHRvIHN1cHBvcnRlZCA3IHJlc29sdWl0b25zLiAqLworCWlmICggeCA9PSA4MDAgJiYgeSA9PSA2MDAgKQorICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEw0MSk7CisJZWxzZSBpZiAoeCA9PSAxMDI0ICYmIHkgPT0gNzY4KQorICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEw2NSk7CisJZWxzZSBpZiAoeCA9PSAxMTUyICYmIHkgPT0gODY0KQorICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEw4MCk7CisJZWxzZSBpZiAoeCA9PSAxMjgwICYmIHkgPT0gNzY4KQorICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEw4MCk7CisJZWxzZSBpZiAoeCA9PSAxMjgwICYmIHkgPT0gNzIwKQorICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEw3NCk7CisJZWxzZSBpZiAoeCA9PSAxMjgwICYmIHkgPT0gOTYwKQorICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEwxMDgpOworCWVsc2UgaWYgKHggPT0gMTI4MCAmJiB5ID09IDEwMjQpCisgICAgCWRpc3BDb250cm9sID0gRklFTERfU0VUKGRpc3BDb250cm9sLCBDUlRfRElTUExBWV9DVFJMLCBDTEssIFBMTDEwOCk7CisJZWxzZSAvKiBkZWZhdWx0IHRvIFZHQSBjbG9jayAqLworICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEwyNSk7CisKKwkvKiBTZXQgYml0IDI1OjI0IG9mIGRpc3BsYXkgY29udHJvbGxlciAqLworICAgIGRpc3BDb250cm9sID0gRklFTERfU0VUKGRpc3BDb250cm9sLCBDUlRfRElTUExBWV9DVFJMLCBDUlRTRUxFQ1QsIENSVCk7CisgICAgZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIFJHQkJJVCwgMjRCSVQpOworCisgICAgLyogU2V0IGJpdCAxNCBvZiBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKyAgICBkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xPQ0tfUEhBU0UsIEFDVElWRV9MT1cpOworCisgICAgUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIGRpc3BDb250cm9sKTsKKworCXJldHVybiBkaXNwQ29udHJvbDsKK30KKworCisKKy8qIG9ubHkgdGltaW5nIHJlbGF0ZWQgcmVnaXN0ZXJzIHdpbGwgYmUgIHByb2dyYW1lZCAqLworc3RhdGljIGludCBwcm9ncmFtTW9kZVJlZ2lzdGVycyhtb2RlX3BhcmFtZXRlcl90ICogcE1vZGVQYXJhbSxwbGxfdmFsdWVfdCAqIHBsbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY250ID0gMDsKKwl1bnNpZ25lZCBpbnQgdWxUbXBWYWx1ZSx1bFJlZzsKKwlpZihwbGwtPmNsb2NrVHlwZSA9PSBTRUNPTkRBUllfUExMKQorCXsKKwkJLyogcHJvZ3JhbWUgc2Vjb25kYXJ5IHBpeGVsIGNsb2NrICovCisJCVBPS0UzMihDUlRfUExMX0NUUkwsZm9ybWF0UGxsUmVnKHBsbCkpOworICAgICAgICBQT0tFMzIoQ1JUX0hPUklaT05UQUxfVE9UQUwsCisgICAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIENSVF9IT1JJWk9OVEFMX1RPVEFMLCBUT1RBTCwgcE1vZGVQYXJhbS0+aG9yaXpvbnRhbF90b3RhbCAtIDEpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIENSVF9IT1JJWk9OVEFMX1RPVEFMLCBESVNQTEFZX0VORCwgcE1vZGVQYXJhbS0+aG9yaXpvbnRhbF9kaXNwbGF5X2VuZCAtIDEpKTsKKworICAgICAgICBQT0tFMzIoQ1JUX0hPUklaT05UQUxfU1lOQywKKyAgICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgQ1JUX0hPUklaT05UQUxfU1lOQywgV0lEVEgsIHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY193aWR0aCkKKyAgICAgICAgICAgIHwgRklFTERfVkFMVUUoMCwgQ1JUX0hPUklaT05UQUxfU1lOQywgU1RBUlQsIHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY19zdGFydCAtIDEpKTsKKworICAgICAgICBQT0tFMzIoQ1JUX1ZFUlRJQ0FMX1RPVEFMLAorICAgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBDUlRfVkVSVElDQUxfVE9UQUwsIFRPVEFMLCBwTW9kZVBhcmFtLT52ZXJ0aWNhbF90b3RhbCAtIDEpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIENSVF9WRVJUSUNBTF9UT1RBTCwgRElTUExBWV9FTkQsIHBNb2RlUGFyYW0tPnZlcnRpY2FsX2Rpc3BsYXlfZW5kIC0gMSkpOworCisgICAgICAgIFBPS0UzMihDUlRfVkVSVElDQUxfU1lOQywKKyAgICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgQ1JUX1ZFUlRJQ0FMX1NZTkMsIEhFSUdIVCwgcE1vZGVQYXJhbS0+dmVydGljYWxfc3luY19oZWlnaHQpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIENSVF9WRVJUSUNBTF9TWU5DLCBTVEFSVCwgcE1vZGVQYXJhbS0+dmVydGljYWxfc3luY19zdGFydCAtIDEpKTsKKworCisJCXVsVG1wVmFsdWUgPSBGSUVMRF9WQUxVRSgwLENSVF9ESVNQTEFZX0NUUkwsVlNZTkNfUEhBU0UscE1vZGVQYXJhbS0+dmVydGljYWxfc3luY19wb2xhcml0eSl8CisJCQkJCSAgRklFTERfVkFMVUUoMCxDUlRfRElTUExBWV9DVFJMLEhTWU5DX1BIQVNFLHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY19wb2xhcml0eSl8CisJCQkJCSAgRklFTERfU0VUKDAsQ1JUX0RJU1BMQVlfQ1RSTCxUSU1JTkcsRU5BQkxFKXwKKwkJCQkJICBGSUVMRF9TRVQoMCxDUlRfRElTUExBWV9DVFJMLFBMQU5FLEVOQUJMRSk7CisKKworCQlpZihnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpeworCQkJZGlzcGxheUNvbnRyb2xBZGp1c3RfU003NTBMRShwTW9kZVBhcmFtLHVsVG1wVmFsdWUpOworCQl9ZWxzZXsKKwkJCXVsUmVnID0gUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpCisJCQkJCSYgRklFTERfQ0xFQVIoQ1JUX0RJU1BMQVlfQ1RSTCxWU1lOQ19QSEFTRSkKKwkJCQkJJiBGSUVMRF9DTEVBUihDUlRfRElTUExBWV9DVFJMLEhTWU5DX1BIQVNFKQorCQkJCQkmIEZJRUxEX0NMRUFSKENSVF9ESVNQTEFZX0NUUkwsVElNSU5HKQorCQkJCQkmIEZJRUxEX0NMRUFSKENSVF9ESVNQTEFZX0NUUkwsUExBTkUpOworCisJCQkgUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsdWxUbXBWYWx1ZXx1bFJlZyk7CisJCX0KKworCX0KKwllbHNlIGlmKHBsbC0+Y2xvY2tUeXBlID09IFBSSU1BUllfUExMKQorCXsKKwkJdW5zaWduZWQgaW50IHVsUmVzZXJ2ZWRCaXRzOworCQlQT0tFMzIoUEFORUxfUExMX0NUUkwsZm9ybWF0UGxsUmVnKHBsbCkpOworCisgICAgICAgIFBPS0UzMihQQU5FTF9IT1JJWk9OVEFMX1RPVEFMLAorICAgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBQQU5FTF9IT1JJWk9OVEFMX1RPVEFMLCBUT1RBTCwgcE1vZGVQYXJhbS0+aG9yaXpvbnRhbF90b3RhbCAtIDEpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIFBBTkVMX0hPUklaT05UQUxfVE9UQUwsIERJU1BMQVlfRU5ELCBwTW9kZVBhcmFtLT5ob3Jpem9udGFsX2Rpc3BsYXlfZW5kIC0gMSkpOworCisgICAgICAgIFBPS0UzMihQQU5FTF9IT1JJWk9OVEFMX1NZTkMsCisgICAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIFBBTkVMX0hPUklaT05UQUxfU1lOQywgV0lEVEgsIHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY193aWR0aCkKKyAgICAgICAgICAgIHwgRklFTERfVkFMVUUoMCwgUEFORUxfSE9SSVpPTlRBTF9TWU5DLCBTVEFSVCwgcE1vZGVQYXJhbS0+aG9yaXpvbnRhbF9zeW5jX3N0YXJ0IC0gMSkpOworCisgICAgICAgIFBPS0UzMihQQU5FTF9WRVJUSUNBTF9UT1RBTCwKKyAgICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgUEFORUxfVkVSVElDQUxfVE9UQUwsIFRPVEFMLCBwTW9kZVBhcmFtLT52ZXJ0aWNhbF90b3RhbCAtIDEpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIFBBTkVMX1ZFUlRJQ0FMX1RPVEFMLCBESVNQTEFZX0VORCwgcE1vZGVQYXJhbS0+dmVydGljYWxfZGlzcGxheV9lbmQgLSAxKSk7CisKKyAgICAgICAgUE9LRTMyKFBBTkVMX1ZFUlRJQ0FMX1NZTkMsCisgICAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIFBBTkVMX1ZFUlRJQ0FMX1NZTkMsIEhFSUdIVCwgcE1vZGVQYXJhbS0+dmVydGljYWxfc3luY19oZWlnaHQpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIFBBTkVMX1ZFUlRJQ0FMX1NZTkMsIFNUQVJULCBwTW9kZVBhcmFtLT52ZXJ0aWNhbF9zeW5jX3N0YXJ0IC0gMSkpOworCisJCXVsVG1wVmFsdWUgPSBGSUVMRF9WQUxVRSgwLFBBTkVMX0RJU1BMQVlfQ1RSTCxWU1lOQ19QSEFTRSxwTW9kZVBhcmFtLT52ZXJ0aWNhbF9zeW5jX3BvbGFyaXR5KXwKKwkJCQkJRklFTERfVkFMVUUoMCxQQU5FTF9ESVNQTEFZX0NUUkwsSFNZTkNfUEhBU0UscE1vZGVQYXJhbS0+aG9yaXpvbnRhbF9zeW5jX3BvbGFyaXR5KXwKKwkJCQkJRklFTERfVkFMVUUoMCxQQU5FTF9ESVNQTEFZX0NUUkwsQ0xPQ0tfUEhBU0UscE1vZGVQYXJhbS0+Y2xvY2tfcGhhc2VfcG9sYXJpdHkpfAorCQkJCQlGSUVMRF9TRVQoMCxQQU5FTF9ESVNQTEFZX0NUUkwsVElNSU5HLEVOQUJMRSl8CisJCQkJCUZJRUxEX1NFVCgwLFBBTkVMX0RJU1BMQVlfQ1RSTCxQTEFORSxFTkFCTEUpOworCisgICAgICAgIHVsUmVzZXJ2ZWRCaXRzID0gRklFTERfU0VUKDAsIFBBTkVMX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfMV9NQVNLLCBFTkFCTEUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRF9TRVQoMCwgUEFORUxfRElTUExBWV9DVFJMLCBSRVNFUlZFRF8yX01BU0ssIEVOQUJMRSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1NFVCgwLCBQQU5FTF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzNfTUFTSywgRU5BQkxFKXwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRF9TRVQoMCxQQU5FTF9ESVNQTEFZX0NUUkwsVlNZTkMsQUNUSVZFX0xPVyk7CisKKyAgICAgICAgdWxSZWcgPSAoUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCkgJiB+dWxSZXNlcnZlZEJpdHMpCisgICAgICAgICAgICAgICYgRklFTERfQ0xFQVIoUEFORUxfRElTUExBWV9DVFJMLCBDTE9DS19QSEFTRSkKKyAgICAgICAgICAgICAgJiBGSUVMRF9DTEVBUihQQU5FTF9ESVNQTEFZX0NUUkwsIFZTWU5DX1BIQVNFKQorICAgICAgICAgICAgICAmIEZJRUxEX0NMRUFSKFBBTkVMX0RJU1BMQVlfQ1RSTCwgSFNZTkNfUEhBU0UpCisgICAgICAgICAgICAgICYgRklFTERfQ0xFQVIoUEFORUxfRElTUExBWV9DVFJMLCBUSU1JTkcpCisgICAgICAgICAgICAgICYgRklFTERfQ0xFQVIoUEFORUxfRElTUExBWV9DVFJMLCBQTEFORSk7CisKKworCQkvKiBNYXkgYSBoYXJkd2FyZSBidWcgb3IganVzdCBteSB0ZXN0IGNoaXAgKG5vdCBjb25maXJtZWQpLgorCQkqIFBBTkVMX0RJU1BMQVlfQ1RSTCByZWdpc3RlciBzZWVtcyByZXF1aXJpbmcgZmV3IHdyaXRlcworCQkqIGJlZm9yZSBhIHZhbHVlIGNhbiBiZSBzdWNjZXNmdWxseSB3cml0dGVuIGluLgorCQkqIEFkZGVkIHNvbWUgbWFza3MgdG8gbWFzayBvdXQgdGhlIHJlc2VydmVkIGJpdHMuCisJCSogTm90ZTogVGhpcyBwcm9ibGVtIGhhcHBlbnMgYnkgZGVzaWduLiBUaGUgaGFyZHdhcmUgd2lsbCB3YWl0IGZvciB0aGUKKwkJKiAgICAgICBuZXh0IHZlcnRpY2FsIHN5bmMgdG8gdHVybiBvbi9vZmYgdGhlIHBsYW5lLgorCQkqLworCisJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsdWxUbXBWYWx1ZXx1bFJlZyk7CisjaWYgMQorCQl3aGlsZSgoUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCkgJiB+dWxSZXNlcnZlZEJpdHMpICE9ICh1bFRtcFZhbHVlfHVsUmVnKSkKKwkJeworCQkJY250Kys7CisJCQlpZihjbnQgPiAxMDAwKQorCQkJCWJyZWFrOworCQkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCx1bFRtcFZhbHVlfHVsUmVnKTsKKwkJfQorI2VuZGlmCisJfQorCWVsc2V7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgZGRrNzUwX3NldE1vZGVUaW1pbmcobW9kZV9wYXJhbWV0ZXJfdCAqIHBhcm0sY2xvY2tfdHlwZV90IGNsb2NrKQoreworCXBsbF92YWx1ZV90IHBsbDsKKwl1bnNpZ25lZCBpbnQgdWlBY3R1YWxQaXhlbENsazsKKwlwbGwuaW5wdXRGcmVxID0gREVGQVVMVF9JTlBVVF9DTE9DSzsKKwlwbGwuY2xvY2tUeXBlID0gY2xvY2s7CisKKwl1aUFjdHVhbFBpeGVsQ2xrID0gY2FsY1BsbFZhbHVlKHBhcm0tPnBpeGVsX2Nsb2NrLCZwbGwpOworCWlmKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSl7CisJCS8qIHNldCBncmFwaGljIG1vZGUgdmlhIElPIG1ldGhvZCAqLworCQlvdXRiX3AoMHg4OCwweDNkNCk7CisJCW91dGJfcCgweDA2LDB4M2Q1KTsKKwl9CisJcHJvZ3JhbU1vZGVSZWdpc3RlcnMocGFybSwmcGxsKTsKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfbW9kZS5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhkZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIERESzc1MF9NT0RFX0hfXworI2RlZmluZSBEREs3NTBfTU9ERV9IX18KKworI2luY2x1ZGUgImRkazc1MF9jaGlwLmgiCisKK3R5cGVkZWYgZW51bSBfc3BvbGFyaXR5X3QKK3sKKyAgICBQT1MgPSAwLCAvKiBwb3NpdGl2ZSAqLworICAgIE5FRywgLyogbmVnYXRpdmUgKi8KK30KK3Nwb2xhcml0eV90OworCisKK3R5cGVkZWYgc3RydWN0IF9tb2RlX3BhcmFtZXRlcl90Cit7CisgICAgLyogSG9yaXpvbnRhbCB0aW1pbmcuICovCisgICAgdW5zaWduZWQgbG9uZyBob3Jpem9udGFsX3RvdGFsOworICAgIHVuc2lnbmVkIGxvbmcgaG9yaXpvbnRhbF9kaXNwbGF5X2VuZDsKKyAgICB1bnNpZ25lZCBsb25nIGhvcml6b250YWxfc3luY19zdGFydDsKKyAgICB1bnNpZ25lZCBsb25nIGhvcml6b250YWxfc3luY193aWR0aDsKKyAgICBzcG9sYXJpdHlfdCBob3Jpem9udGFsX3N5bmNfcG9sYXJpdHk7CisKKyAgICAvKiBWZXJ0aWNhbCB0aW1pbmcuICovCisgICAgdW5zaWduZWQgbG9uZyB2ZXJ0aWNhbF90b3RhbDsKKyAgICB1bnNpZ25lZCBsb25nIHZlcnRpY2FsX2Rpc3BsYXlfZW5kOworICAgIHVuc2lnbmVkIGxvbmcgdmVydGljYWxfc3luY19zdGFydDsKKyAgICB1bnNpZ25lZCBsb25nIHZlcnRpY2FsX3N5bmNfaGVpZ2h0OworICAgIHNwb2xhcml0eV90IHZlcnRpY2FsX3N5bmNfcG9sYXJpdHk7CisKKyAgICAvKiBSZWZyZXNoIHRpbWluZy4gKi8KKyAgICB1bnNpZ25lZCBsb25nIHBpeGVsX2Nsb2NrOworICAgIHVuc2lnbmVkIGxvbmcgaG9yaXpvbnRhbF9mcmVxdWVuY3k7CisgICAgdW5zaWduZWQgbG9uZyB2ZXJ0aWNhbF9mcmVxdWVuY3k7CisKKyAgICAvKiBDbG9jayBQaGFzZS4gVGhpcyBjbG9jayBwaGFzZSBvbmx5IGFwcGxpZXMgdG8gUGFuZWwuICovCisgICAgc3BvbGFyaXR5X3QgY2xvY2tfcGhhc2VfcG9sYXJpdHk7Cit9Cittb2RlX3BhcmFtZXRlcl90OworCitpbnQgZGRrNzUwX3NldE1vZGVUaW1pbmcobW9kZV9wYXJhbWV0ZXJfdCAqLGNsb2NrX3R5cGVfdCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9wb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYjk3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYwpAQCAtMCwwICsxLDIzOSBAQAorI2luY2x1ZGUgImRkazc1MF9oZWxwLmgiCisjaW5jbHVkZSAiZGRrNzUwX3JlZy5oIgorI2luY2x1ZGUgImRkazc1MF9wb3dlci5oIgorCit2b2lkIGRkazc1MF9zZXREUE1TKERQTVNfdCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJaWYoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKXsKKwkJdmFsdWUgPSBQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCk7CisJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLEZJRUxEX1ZBTFVFKHZhbHVlLENSVF9ESVNQTEFZX0NUUkwsRFBNUyxzdGF0ZSkpOworCX1lbHNleworCQl2YWx1ZSA9IFBFRUszMihTWVNURU1fQ1RSTCk7CisJCXZhbHVlPSBGSUVMRF9WQUxVRSh2YWx1ZSxTWVNURU1fQ1RSTCxEUE1TLHN0YXRlKTsKKwkJUE9LRTMyKFNZU1RFTV9DVFJMLCB2YWx1ZSk7CisJfQorfQorCit1bnNpZ25lZCBpbnQgZ2V0UG93ZXJNb2RlKHZvaWQpCit7CisJaWYoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCQlyZXR1cm4gMDsKKyAgICByZXR1cm4gKEZJRUxEX0dFVChQRUVLMzIoUE9XRVJfTU9ERV9DVFJMKSwgUE9XRVJfTU9ERV9DVFJMLCBNT0RFKSk7Cit9CisKKworLyoKKyAqIFNNNTB4IGNhbiBvcGVyYXRlIGluIG9uZSBvZiB0aHJlZSBtb2RlczogMCwgMSBvciBTbGVlcC4KKyAqIE9uIGhhcmR3YXJlIHJlc2V0LCBwb3dlciBtb2RlIDAgaXMgZGVmYXVsdC4KKyAqLwordm9pZCBzZXRQb3dlck1vZGUodW5zaWduZWQgaW50IHBvd2VyTW9kZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgY29udHJvbF92YWx1ZSA9IDA7CisKKyAgICBjb250cm9sX3ZhbHVlID0gUEVFSzMyKFBPV0VSX01PREVfQ1RSTCk7CisKKwlpZihnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJCXJldHVybjsKKworICAgIHN3aXRjaCAocG93ZXJNb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBQT1dFUl9NT0RFX0NUUkxfTU9ERV9NT0RFMDoKKyAgICAgICAgICAgIGNvbnRyb2xfdmFsdWUgPSBGSUVMRF9TRVQoY29udHJvbF92YWx1ZSwgUE9XRVJfTU9ERV9DVFJMLCBNT0RFLCBNT0RFMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBPV0VSX01PREVfQ1RSTF9NT0RFX01PREUxOgorICAgICAgICAgICAgY29udHJvbF92YWx1ZSA9IEZJRUxEX1NFVChjb250cm9sX3ZhbHVlLCBQT1dFUl9NT0RFX0NUUkwsIE1PREUsIE1PREUxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUE9XRVJfTU9ERV9DVFJMX01PREVfU0xFRVA6CisgICAgICAgICAgICBjb250cm9sX3ZhbHVlID0gRklFTERfU0VUKGNvbnRyb2xfdmFsdWUsIFBPV0VSX01PREVfQ1RSTCwgTU9ERSwgU0xFRVApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFNldCB1cCBvdGhlciBmaWVsZHMgaW4gUG93ZXIgQ29udHJvbCBSZWdpc3RlciAqLworICAgIGlmIChwb3dlck1vZGUgPT0gUE9XRVJfTU9ERV9DVFJMX01PREVfU0xFRVApCisgICAgeworICAgICAgICBjb250cm9sX3ZhbHVlID0KKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAgICAgICAgIEZJRUxEX1NFVCggIGNvbnRyb2xfdmFsdWUsIFBPV0VSX01PREVfQ1RSTCwgMzM2Q0xLLCBPRkYpIHwKKyNlbmRpZgorICAgICAgICAgICAgRklFTERfU0VUKCAgY29udHJvbF92YWx1ZSwgUE9XRVJfTU9ERV9DVFJMLCBPU0NfSU5QVVQsICBPRkYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb250cm9sX3ZhbHVlID0KKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAgICAgICAgIEZJRUxEX1NFVCggIGNvbnRyb2xfdmFsdWUsIFBPV0VSX01PREVfQ1RSTCwgMzM2Q0xLLCBPTikgfAorI2VuZGlmCisgICAgICAgICAgICBGSUVMRF9TRVQoICBjb250cm9sX3ZhbHVlLCBQT1dFUl9NT0RFX0NUUkwsIE9TQ19JTlBVVCwgIE9OKTsKKyAgICB9CisKKyAgICAvKiBQcm9ncmFtIG5ldyBwb3dlciBtb2RlLiAqLworICAgIFBPS0UzMihQT1dFUl9NT0RFX0NUUkwsIGNvbnRyb2xfdmFsdWUpOworfQorCit2b2lkIHNldEN1cnJlbnRHYXRlKHVuc2lnbmVkIGludCBnYXRlKQoreworICAgIHVuc2lnbmVkIGludCBnYXRlX3JlZzsKKyAgICB1bnNpZ25lZCBpbnQgbW9kZTsKKworICAgIC8qIEdldCBjdXJyZW50IHBvd2VyIG1vZGUuICovCisgICAgbW9kZSA9IGdldFBvd2VyTW9kZSgpOworCisgICAgc3dpdGNoIChtb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBQT1dFUl9NT0RFX0NUUkxfTU9ERV9NT0RFMDoKKyAgICAgICAgICAgIGdhdGVfcmVnID0gTU9ERTBfR0FURTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUE9XRVJfTU9ERV9DVFJMX01PREVfTU9ERTE6CisgICAgICAgICAgICBnYXRlX3JlZyA9IE1PREUxX0dBVEU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ2F0ZV9yZWcgPSBNT0RFMF9HQVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFBPS0UzMihnYXRlX3JlZywgZ2F0ZSk7Cit9CisKKworCisvKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSB0aGUgMkQgZW5naW5lLgorICovCit2b2lkIGVuYWJsZTJERW5naW5lKHVuc2lnbmVkIGludCBlbmFibGUpCit7CisgICAgdWludDMyX3QgZ2F0ZTsKKworICAgIGdhdGUgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKyAgICBpZiAoZW5hYmxlKQorICAgIHsKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIERFLCAgT04pOworICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgQ1NDLCBPTik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBERSwgIE9GRik7CisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBDU0MsIE9GRik7CisgICAgfQorCisgICAgc2V0Q3VycmVudEdhdGUoZ2F0ZSk7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIFpWIFBvcnQuCisgKi8KK3ZvaWQgZW5hYmxlWlZQb3J0KHVuc2lnbmVkIGludCBlbmFibGUpCit7CisgICAgdWludDMyX3QgZ2F0ZTsKKworICAgIC8qIEVuYWJsZSBaViBQb3J0IEdhdGUgKi8KKyAgICBnYXRlID0gUEVFSzMyKENVUlJFTlRfR0FURSk7CisgICAgaWYgKGVuYWJsZSkKKyAgICB7CisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBaVlBPUlQsIE9OKTsKKyNpZiAxCisgICAgICAgIC8qIFVzaW5nIFNvZnR3YXJlIEkyQyAqLworICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgR1BJTywgT04pOworI2Vsc2UKKyAgICAgICAgLyogVXNpbmcgSGFyZHdhcmUgSTJDICovCisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBJMkMsICAgIE9OKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBEaXNhYmxlIFpWIFBvcnQgR2F0ZS4gVGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hldGhlciB0aGUgR1BJTyBwaW5zIGFyZSBiZWluZyB1c2VkCisgICAgICAgICAgIG9yIG5vdC4gVGhlcmVmb3JlLCBkbyBub3QgZGlzYWJsZSB0aGUgR1BJTyBnYXRlLiAqLworICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgWlZQT1JULCBPRkYpOworICAgIH0KKworICAgIHNldEN1cnJlbnRHYXRlKGdhdGUpOworfQorCisKK3ZvaWQgZW5hYmxlU1NQKHVuc2lnbmVkIGludCBlbmFibGUpCit7CisgICAgdWludDMyX3QgZ2F0ZTsKKworICAgIC8qIEVuYWJsZSBTU1AgR2F0ZSAqLworICAgIGdhdGUgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKyAgICBpZiAoZW5hYmxlKQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgU1NQLCBPTik7CisgICAgZWxzZQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgU1NQLCBPRkYpOworCisgICAgc2V0Q3VycmVudEdhdGUoZ2F0ZSk7Cit9CisKK3ZvaWQgZW5hYmxlRE1BKHVuc2lnbmVkIGludCBlbmFibGUpCit7CisgICAgdWludDMyX3QgZ2F0ZTsKKworICAgIC8qIEVuYWJsZSBETUEgR2F0ZSAqLworICAgIGdhdGUgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKyAgICBpZiAoZW5hYmxlKQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgRE1BLCBPTik7CisgICAgZWxzZQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgRE1BLCBPRkYpOworCisgICAgc2V0Q3VycmVudEdhdGUoZ2F0ZSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBHUElPIEVuZ2luZQorICovCit2b2lkIGVuYWJsZUdQSU8odW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKyAgICB1aW50MzJfdCBnYXRlOworCisgICAgLyogRW5hYmxlIEdQSU8gR2F0ZSAqLworICAgIGdhdGUgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKyAgICBpZiAoZW5hYmxlKQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgR1BJTywgT04pOworICAgIGVsc2UKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIEdQSU8sIE9GRik7CisKKyAgICBzZXRDdXJyZW50R2F0ZShnYXRlKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIFBXTSBFbmdpbmUKKyAqLwordm9pZCBlbmFibGVQV00odW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKyAgICB1aW50MzJfdCBnYXRlOworCisgICAgLyogRW5hYmxlIFBXTSBHYXRlICovCisgICAgZ2F0ZSA9IFBFRUszMihDVVJSRU5UX0dBVEUpOworICAgIGlmIChlbmFibGUpCisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBQV00sIE9OKTsKKyAgICBlbHNlCisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBQV00sIE9GRik7CisKKyAgICBzZXRDdXJyZW50R2F0ZShnYXRlKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIEkyQyBFbmdpbmUKKyAqLwordm9pZCBlbmFibGVJMkModW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKyAgICB1aW50MzJfdCBnYXRlOworCisgICAgLyogRW5hYmxlIEkyQyBHYXRlICovCisgICAgZ2F0ZSA9IFBFRUszMihDVVJSRU5UX0dBVEUpOworICAgIGlmIChlbmFibGUpCisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBJMkMsIE9OKTsKKyAgICBlbHNlCisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBJMkMsIE9GRik7CisKKyAgICBzZXRDdXJyZW50R2F0ZShnYXRlKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9wb3dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGM3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIERESzc1MF9QT1dFUl9IX18KKyNkZWZpbmUgRERLNzUwX1BPV0VSX0hfXworCit0eXBlZGVmIGVudW0gX0RQTVNfdAoreworICAgIGNydERQTVNfT04gPSAweDAsCisgICAgY3J0RFBNU19TVEFOREJZID0gMHgxLAorICAgIGNydERQTVNfU1VTUEVORCA9IDB4MiwKKyAgICBjcnREUE1TX09GRiA9IDB4MywKK30KK0RQTVNfdDsKKworI2RlZmluZSBzZXREQUMob2ZmKSBcCisJCXsJXAorCQlQT0tFMzIoTUlTQ19DVFJMLEZJRUxEX1ZBTFVFKFBFRUszMihNSVNDX0NUUkwpLAlcCisJCQkJCQkJCQlNSVNDX0NUUkwsCVwKKwkJCQkJCQkJCURBQ19QT1dFUiwJXAorCQkJCQkJCQkJb2ZmKSk7CVwKKwkJfQorCit2b2lkIGRkazc1MF9zZXREUE1TKERQTVNfdCk7CisKK3Vuc2lnbmVkIGludCBnZXRQb3dlck1vZGUodm9pZCk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGN1cnJlbnQgcG93ZXIgbW9kZQorICovCit2b2lkIHNldFBvd2VyTW9kZSh1bnNpZ25lZCBpbnQgcG93ZXJNb2RlKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBjdXJyZW50IGdhdGUKKyAqLwordm9pZCBzZXRDdXJyZW50R2F0ZSh1bnNpZ25lZCBpbnQgZ2F0ZSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSAyRCBlbmdpbmUuCisgKi8KK3ZvaWQgZW5hYmxlMkRFbmdpbmUodW5zaWduZWQgaW50IGVuYWJsZSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBaViBQb3J0CisgKi8KK3ZvaWQgZW5hYmxlWlZQb3J0KHVuc2lnbmVkIGludCBlbmFibGUpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSB0aGUgRE1BIEVuZ2luZQorICovCit2b2lkIGVuYWJsZURNQSh1bnNpZ25lZCBpbnQgZW5hYmxlKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIEdQSU8gRW5naW5lCisgKi8KK3ZvaWQgZW5hYmxlR1BJTyh1bnNpZ25lZCBpbnQgZW5hYmxlKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIFBXTSBFbmdpbmUKKyAqLwordm9pZCBlbmFibGVQV00odW5zaWduZWQgaW50IGVuYWJsZSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBJMkMgRW5naW5lCisgKi8KK3ZvaWQgZW5hYmxlSTJDKHVuc2lnbmVkIGludCBlbmFibGUpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSB0aGUgU1NQLgorICovCit2b2lkIGVuYWJsZVNTUCh1bnNpZ25lZCBpbnQgZW5hYmxlKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDE2Zjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3JlZy5oCkBAIC0wLDAgKzEsMjYxNiBAQAorI2lmbmRlZiBEREs3NTBfUkVHX0hfXworI2RlZmluZSBEREs3NTBfUkVHX0hfXworCisvKiBOZXcgcmVnaXN0ZXIgZm9yIFNNNzUwTEUgKi8KKyNkZWZpbmUgREVfU1RBVEUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDU0CisjZGVmaW5lIERFX1NUQVRFMV9ERV9BQk9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgREVfU1RBVEUxX0RFX0FCT1JUX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RBVEUxX0RFX0FCT1JUX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBERV9TVEFURTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwNTgKKyNkZWZpbmUgREVfU1RBVEUyX0RFX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBERV9TVEFURTJfREVfRklGT19OT1RFTVBUWSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFURTJfREVfRklGT19FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9TVEFURTJfREVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIERFX1NUQVRFMl9ERV9TVEFUVVNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRFMl9ERV9TVEFUVVNfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX1NUQVRFMl9ERV9NRU1fRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgREVfU1RBVEUyX0RFX01FTV9GSUZPX05PVEVNUFRZICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RBVEUyX0RFX01FTV9GSUZPX0VNUFRZICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfU1RBVEUyX0RFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorCisKKworI2RlZmluZSBTWVNURU1fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfRFBNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjMwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RQTVNfVlBIUCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RQTVNfVlBITiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RQTVNfVk5IUCAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RQTVNfVk5ITiAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9CVVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAyOToyOQorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfQlVSU1RfT0ZGICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfQlVSU1RfT04gICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX01BU1RFUl9PRkYgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX01BU1RFUl9PTiAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfTEFURU5DWV9USU1FUiAgICAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIFNZU1RFTV9DVFJMX0xBVEVOQ1lfVElNRVJfT04gICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0xBVEVOQ1lfVElNRVJfT0ZGICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RFX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAyMzoyMworI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9GSUZPX05PVEVNUFRZICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9GSUZPX0VNUFRZICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgMjI6MjIKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfTUVNX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDIxOjIxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RFX01FTV9GSUZPX05PVEVNUFRZICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RFX01FTV9GSUZPX0VNUFRZICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0NTQ19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAyMDoyMAorI2RlZmluZSBTWVNURU1fQ1RSTF9DU0NfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9DU0NfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9DUlRfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgMTk6MTkKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1JUX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1JUX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUEFORUxfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIFNZU1RFTV9DVFJMX1BBTkVMX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BBTkVMX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0NVUlJFTlRfQlVGRkVSICAgICAgICAgICAgICAgICAgICAxNzoxNworI2RlZmluZSBTWVNURU1fQ1RSTF9DVVJSRU5UX0JVRkZFUl9OT1JNQUwgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9DVVJSRU5UX0JVRkZFUl9GTElQX1BFTkRJTkcgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9ETUFfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgU1lTVEVNX0NUUkxfRE1BX1NUQVRVU19JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfRE1BX1NUQVRVU19CVVNZICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX0JVUlNUX1JFQUQgICAgICAgICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9CVVJTVF9SRUFEX09GRiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9CVVJTVF9SRUFEX09OICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RFX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9BQk9SVF9PRkYgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9BQk9SVF9PTiAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfU1VCU1lTX0lEX0xPQ0sgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX1NVQlNZU19JRF9MT0NLX09GRiAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX1NVQlNZU19JRF9MT0NLX09OICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX1JFVFJZICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfUkVUUllfT04gICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfUkVUUllfT0ZGICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfU0xBVkVfQlVSU1RfUkVBRF9TSVpFICAgICAgICAgNTo0CisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9TTEFWRV9CVVJTVF9SRUFEX1NJWkVfMSAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9TTEFWRV9CVVJTVF9SRUFEX1NJWkVfMiAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9TTEFWRV9CVVJTVF9SRUFEX1NJWkVfNCAgICAgICAyCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9TTEFWRV9CVVJTVF9SRUFEX1NJWkVfOCAgICAgICAzCisjZGVmaW5lIFNZU1RFTV9DVFJMX0NSVF9UUklTVEFURSAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1JUX1RSSVNUQVRFX09GRiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1JUX1RSSVNUQVRFX09OICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJTUVNX1RSSVNUQVRFICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lNRU1fVFJJU1RBVEVfT0ZGICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lNRU1fVFJJU1RBVEVfT04gICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9MT0NBTE1FTV9UUklTVEFURSAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0xPQ0FMTUVNX1RSSVNUQVRFX09GRiAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0xPQ0FMTUVNX1RSSVNUQVRFX09OICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BBTkVMX1RSSVNUQVRFICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUEFORUxfVFJJU1RBVEVfT0ZGICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUEFORUxfVFJJU1RBVEVfT04gICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBNSVNDX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fUkVSRVNIX0NPVU5UICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1JFUkVTSF9DT1VOVF8xUk9XICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1JFUkVTSF9DT1VOVF8zUk9XICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1JFRlJFU0hfVElNRSAgICAgICAgICAgICAgICAgICAyNjoyNQorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9SRUZSRVNIX1RJTUVfOCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9SRUZSRVNIX1RJTUVfMTYgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9SRUZSRVNIX1RJTUVfMzIgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9SRUZSRVNIX1RJTUVfNjQgICAgICAgICAgICAgICAgMworI2RlZmluZSBNSVNDX0NUUkxfSU5UX09VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgTUlTQ19DVFJMX0lOVF9PVVRQVVRfTk9STUFMICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0lOVF9PVVRQVVRfSU5WRVJUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX1BMTF9DTEtfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgIDIzOjIzCisjZGVmaW5lIE1JU0NfQ1RSTF9QTExfQ0xLX0NPVU5UX09GRiAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9QTExfQ0xLX0NPVU5UX09OICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EQUNfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDoyMAorI2RlZmluZSBNSVNDX0NUUkxfREFDX1BPV0VSX09OICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfREFDX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfQ0xLX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgTUlTQ19DVFJMX0NMS19TRUxFQ1RfT1NDICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0NMS19TRUxFQ1RfVEVTVENMSyAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fQ09MVU1OX1NJWkUgICAgICAgICAgICAgICAgICAgIDE1OjE0CisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX0NPTFVNTl9TSVpFXzI1NiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX0NPTFVNTl9TSVpFXzUxMiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX0NPTFVNTl9TSVpFXzEwMjQgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1JU0NfQ1RSTF9MT0NBTE1FTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAxMzoxMgorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRV84TSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRV8xNk0gICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRV8zMk0gICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRV82NE0gICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UV1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFdUUl8yQ0xLICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFdUUl8xQ0xLICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFdSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RXUl8zQ0xLICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RXUl8yQ0xLICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFJQXzNDTEsgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFJQXzRDTEsgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFJGQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UUkZDXzEyQ0xLICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UUkZDXzE0Q0xLICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UUkFTICAgICAgICAgICAgICAgICAgICAgICAgICAgNzo3CisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RSQVNfN0NMSyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RSQVNfOENMSyAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9MT0NBTE1FTV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICA2OjYKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1JFU0VUX1JFU0VUICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1JFU0VUX05PUk1BTCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1NUQVRFICAgICAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fU1RBVEVfQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fU1RBVEVfSU5BQ1RJVkUgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfQ1BVX0NBU19MQVRFTkNZICAgICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIE1JU0NfQ1RSTF9DUFVfQ0FTX0xBVEVOQ1lfMkNMSyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9DUFVfQ0FTX0xBVEVOQ1lfM0NMSyAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9ETEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgTUlTQ19DVFJMX0RMTF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0RMTF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fT1VUUFVUICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9PVVRQVVRfTE9XICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9PVVRQVVRfSElHSCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fQlVTX1NJWkUgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIE1JU0NfQ1RSTF9MT0NBTE1FTV9CVVNfU0laRV8zMiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9MT0NBTE1FTV9CVVNfU0laRV82NCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9FTUJFRERFRF9MT0NBTE1FTSAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgTUlTQ19DVFJMX0VNQkVEREVEX0xPQ0FMTUVNX09OICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0VNQkVEREVEX0xPQ0FMTUVNX09GRiAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBHUElPX01VWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgKKyNkZWZpbmUgR1BJT19NVVhfMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIEdQSU9fTVVYXzMxX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzMxX0kyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDozMAorI2RlZmluZSBHUElPX01VWF8zMF9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8zMF9JMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8yOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjk6MjkKKyNkZWZpbmUgR1BJT19NVVhfMjlfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMjlfU1NQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OjI4CisjZGVmaW5lIEdQSU9fTVVYXzI4X0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzI4X1NTUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBHUElPX01VWF8yN19HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8yN19TU1AxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8yNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgR1BJT19NVVhfMjZfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMjZfU1NQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIEdQSU9fTVVYXzI1X0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzI1X1NTUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBHUElPX01VWF8yNF9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8yNF9TU1AwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MjMKKyNkZWZpbmUgR1BJT19NVVhfMjNfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMjNfU1NQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOjIyCisjZGVmaW5lIEdQSU9fTVVYXzIyX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzIyX1NTUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMToyMQorI2RlZmluZSBHUElPX01VWF8yMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8yMV9TU1AwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8yMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgR1BJT19NVVhfMjBfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMjBfU1NQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OjE5CisjZGVmaW5lIEdQSU9fTVVYXzE5X0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzE5X1BXTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBHUElPX01VWF8xOF9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xOF9QV00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgR1BJT19NVVhfMTdfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMTdfUFdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIEdQSU9fTVVYXzE2X0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzE2X1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBHUElPX01VWF8xNV9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xNV9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ6MTQKKyNkZWZpbmUgR1BJT19NVVhfMTRfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMTRfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEzCisjZGVmaW5lIEdQSU9fTVVYXzEzX0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzEzX1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjoxMgorI2RlZmluZSBHUElPX01VWF8xMl9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xMl9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgR1BJT19NVVhfMTFfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMTFfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIEdQSU9fTVVYXzEwX0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzEwX1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgR1BJT19NVVhfOV9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfOV9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBHUElPX01VWF84X0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF84X1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzo3CisjZGVmaW5lIEdQSU9fTVVYXzdfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzdfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OjYKKyNkZWZpbmUgR1BJT19NVVhfNl9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfNl9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBHUElPX01VWF81X0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF81X1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIEdQSU9fTVVYXzRfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzRfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgR1BJT19NVVhfM19HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfM19URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBHUElPX01VWF8yX0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8yX1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIEdQSU9fTVVYXzFfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzFfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgR1BJT19NVVhfMF9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMF9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMEMKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fUk9UQVRFICAgICAgICAgICAgICAgICAgIDI4OjI4CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1JPVEFURV9PRkYgICAgICAgICAgICAgICAwCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1JPVEFURV9PTiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1ZHQSAgICAgICAgICAgICAgICAgICAgICAyNjoyNAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfT0ZGICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfUFJJT1JJVFlfMSAgICAgICAgICAgMQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfUFJJT1JJVFlfMiAgICAgICAgICAgMgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfUFJJT1JJVFlfMyAgICAgICAgICAgMworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfUFJJT1JJVFlfNCAgICAgICAgICAgNAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfUFJJT1JJVFlfNSAgICAgICAgICAgNQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfUFJJT1JJVFlfNiAgICAgICAgICAgNgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0FfUFJJT1JJVFlfNyAgICAgICAgICAgNworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9ETUEgICAgICAgICAgICAgICAgICAgICAgMjI6MjAKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX09GRiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX1BSSU9SSVRZXzEgICAgICAgICAgIDEKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX1BSSU9SSVRZXzIgICAgICAgICAgIDIKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX1BSSU9SSVRZXzMgICAgICAgICAgIDMKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX1BSSU9SSVRZXzQgICAgICAgICAgIDQKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX1BSSU9SSVRZXzUgICAgICAgICAgIDUKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX1BSSU9SSVRZXzYgICAgICAgICAgIDYKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BX1BSSU9SSVRZXzcgICAgICAgICAgIDcKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMSAgICAgICAgICAgICAgICAgIDE4OjE2CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfT0ZGICAgICAgICAgICAgICAwCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfUFJJT1JJVFlfMSAgICAgICAxCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfUFJJT1JJVFlfMiAgICAgICAyCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfUFJJT1JJVFlfMyAgICAgICAzCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfUFJJT1JJVFlfNCAgICAgICA0CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfUFJJT1JJVFlfNSAgICAgICA1CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfUFJJT1JJVFlfNiAgICAgICA2CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDFfUFJJT1JJVFlfNyAgICAgICA3CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDAgICAgICAgICAgICAgICAgICAxNDoxMgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX09GRiAgICAgICAgICAgICAgMAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX1BSSU9SSVRZXzEgICAgICAgMQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX1BSSU9SSVRZXzIgICAgICAgMgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX1BSSU9SSVRZXzMgICAgICAgMworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX1BSSU9SSVRZXzQgICAgICAgNAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX1BSSU9SSVRZXzUgICAgICAgNQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX1BSSU9SSVRZXzYgICAgICAgNgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwX1BSSU9SSVRZXzcgICAgICAgNworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFTyAgICAgICAgICAgICAgICAgICAgMTA6OAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19PRkYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19QUklPUklUWV8xICAgICAgICAgMQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19QUklPUklUWV8yICAgICAgICAgMgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19QUklPUklUWV8zICAgICAgICAgMworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19QUklPUklUWV80ICAgICAgICAgNAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19QUklPUklUWV81ICAgICAgICAgNQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19QUklPUklUWV82ICAgICAgICAgNgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WSURFT19QUklPUklUWV83ICAgICAgICAgNworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTCAgICAgICAgICAgICAgICAgICAgNjo0CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX09GRiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX1BSSU9SSVRZXzEgICAgICAgICAxCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX1BSSU9SSVRZXzIgICAgICAgICAyCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX1BSSU9SSVRZXzMgICAgICAgICAzCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX1BSSU9SSVRZXzQgICAgICAgICA0CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX1BSSU9SSVRZXzUgICAgICAgICA1CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX1BSSU9SSVRZXzYgICAgICAgICA2CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1BBTkVMX1BSSU9SSVRZXzcgICAgICAgICA3CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVCAgICAgICAgICAgICAgICAgICAgICAyOjAKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX09GRiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX1BSSU9SSVRZXzEgICAgICAgICAgIDEKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX1BSSU9SSVRZXzIgICAgICAgICAgIDIKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX1BSSU9SSVRZXzMgICAgICAgICAgIDMKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX1BSSU9SSVRZXzQgICAgICAgICAgIDQKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX1BSSU9SSVRZXzUgICAgICAgICAgIDUKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX1BSSU9SSVRZXzYgICAgICAgICAgIDYKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fQ1JUX1BSSU9SSVRZXzcgICAgICAgICAgIDcKKworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1JPVEFURSAgICAgICAgICAgICAgICAgICAgIDI4OjI4CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ST1RBVEVfT0ZGICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ST1RBVEVfT04gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9WR0EgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX09GRiAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzEgICAgICAgICAgICAgMQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzIgICAgICAgICAgICAgMgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzMgICAgICAgICAgICAgMworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzQgICAgICAgICAgICAgNAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzUgICAgICAgICAgICAgNQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzYgICAgICAgICAgICAgNgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzcgICAgICAgICAgICAgNworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fRE1BICAgICAgICAgICAgICAgICAgICAgICAgMjI6MjAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9PRkYgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV8xICAgICAgICAgICAgIDEKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV8yICAgICAgICAgICAgIDIKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV8zICAgICAgICAgICAgIDMKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV80ICAgICAgICAgICAgIDQKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV81ICAgICAgICAgICAgIDUKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV82ICAgICAgICAgICAgIDYKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV83ICAgICAgICAgICAgIDcKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDEgICAgICAgICAgICAgICAgICAgIDE4OjE2CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX09GRiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzEgICAgICAgICAxCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzIgICAgICAgICAyCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzMgICAgICAgICAzCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzQgICAgICAgICA0CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzUgICAgICAgICA1CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzYgICAgICAgICA2CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzcgICAgICAgICA3CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQwICAgICAgICAgICAgICAgICAgICAxNDoxMgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9PRkYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV8xICAgICAgICAgMQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV8yICAgICAgICAgMgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV8zICAgICAgICAgMworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV80ICAgICAgICAgNAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV81ICAgICAgICAgNQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV82ICAgICAgICAgNgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV83ICAgICAgICAgNworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU8gICAgICAgICAgICAgICAgICAgICAgMTA6OAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fT0ZGICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfMSAgICAgICAgICAgMQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfMiAgICAgICAgICAgMgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfMyAgICAgICAgICAgMworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNCAgICAgICAgICAgNAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNSAgICAgICAgICAgNQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNiAgICAgICAgICAgNgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNyAgICAgICAgICAgNworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUwgICAgICAgICAgICAgICAgICAgICAgNjo0CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9PRkYgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV8xICAgICAgICAgICAxCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV8yICAgICAgICAgICAyCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV8zICAgICAgICAgICAzCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV80ICAgICAgICAgICA0CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV81ICAgICAgICAgICA1CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV82ICAgICAgICAgICA2CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV83ICAgICAgICAgICA3CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlQgICAgICAgICAgICAgICAgICAgICAgICAyOjAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9PRkYgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV8xICAgICAgICAgICAgIDEKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV8yICAgICAgICAgICAgIDIKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV8zICAgICAgICAgICAgIDMKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV80ICAgICAgICAgICAgIDQKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV81ICAgICAgICAgICAgIDUKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV82ICAgICAgICAgICAgIDYKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV83ICAgICAgICAgICAgIDcKKworI2RlZmluZSBSQVdfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAKKyNkZWZpbmUgUkFXX0lOVF9aVlBPUlQxX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBSQVdfSU5UX1pWUE9SVDFfVlNZTkNfSU5BQ1RJVkUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVdfSU5UX1pWUE9SVDFfVlNZTkNfQUNUSVZFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVdfSU5UX1pWUE9SVDFfVlNZTkNfQ0xFQVIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVdfSU5UX1pWUE9SVDBfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIFJBV19JTlRfWlZQT1JUMF9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJBV19JTlRfWlZQT1JUMF9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJBV19JTlRfWlZQT1JUMF9WU1lOQ19DTEVBUiAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJBV19JTlRfQ1JUX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgUkFXX0lOVF9DUlRfVlNZTkNfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkFXX0lOVF9DUlRfVlNZTkNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFXX0lOVF9DUlRfVlNZTkNfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFXX0lOVF9QQU5FTF9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBSQVdfSU5UX1BBTkVMX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVdfSU5UX1BBTkVMX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVdfSU5UX1BBTkVMX1ZTWU5DX0NMRUFSICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVdfSU5UX1ZHQV9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIFJBV19JTlRfVkdBX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJBV19JTlRfVkdBX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJBV19JTlRfVkdBX1ZTWU5DX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDI0CisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8zMV9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8zMV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8zMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMzBfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMzBfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjI5CisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI5X0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI5X0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yOF9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yOF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjdfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjdfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI2X0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI2X0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yNV9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yNV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0kyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgSU5UX1NUQVRVU19JMkNfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19JMkNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19QV00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIElOVF9TVEFUVVNfUFdNX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfUFdNX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfRE1BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBJTlRfU1RBVFVTX0RNQTFfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX0RNQTFfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0RNQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIElOVF9TVEFUVVNfRE1BMF9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfRE1BMF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfUENJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgSU5UX1NUQVRVU19QQ0lfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19QQ0lfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19TU1AxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBJTlRfU1RBVFVTX1NTUDFfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX1NTUDFfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX1NTUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIElOVF9TVEFUVVNfU1NQMF9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfU1NQMF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgSU5UX1NUQVRVU19ERV9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19ERV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19aVlBPUlQxX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBJTlRfU1RBVFVTX1pWUE9SVDFfVlNZTkNfSU5BQ1RJVkUgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX1pWUE9SVDFfVlNZTkNfQUNUSVZFICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX1pWUE9SVDBfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIElOVF9TVEFUVVNfWlZQT1JUMF9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfWlZQT1JUMF9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfQ1JUX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgSU5UX1NUQVRVU19DUlRfVlNZTkNfSU5BQ1RJVkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19DUlRfVlNZTkNfQUNUSVZFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19QQU5FTF9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBJTlRfU1RBVFVTX1BBTkVMX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX1BBTkVMX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX1ZHQV9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIElOVF9TVEFUVVNfVkdBX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfVkdBX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgSU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDI4CisjZGVmaW5lIElOVF9NQVNLX0dQSU8zMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBJTlRfTUFTS19HUElPMzFfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19HUElPMzFfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19HUElPMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzMwX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzMwX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjI5CisjZGVmaW5lIElOVF9NQVNLX0dQSU8yOV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0dQSU8yOV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX0dQSU8yOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBJTlRfTUFTS19HUElPMjhfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19HUElPMjhfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19HUElPMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI3X0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI3X0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIElOVF9NQVNLX0dQSU8yNl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0dQSU8yNl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX0dQSU8yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBJTlRfTUFTS19HUElPMjVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19HUElPMjVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19JMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgSU5UX01BU0tfSTJDX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfSTJDX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfUFdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIElOVF9NQVNLX1BXTV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX1BXTV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX0RNQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBJTlRfTUFTS19ETUExX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19ETUExX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIElOVF9NQVNLX0RNQV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0RNQV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX1BDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgSU5UX01BU0tfUENJX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfUENJX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfU1NQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBJTlRfTUFTS19TU1AxX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19TU1AxX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19TU1AwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIElOVF9NQVNLX1NTUDBfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX1NTUDBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgSU5UX01BU0tfREVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfREVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfWlZQT1JUMV9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBJTlRfTUFTS19aVlBPUlQxX1ZTWU5DX0RJU0FCTEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19aVlBPUlQxX1ZTWU5DX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19aVlBPUlQwX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIElOVF9NQVNLX1pWUE9SVDBfVlNZTkNfRElTQUJMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX1pWUE9SVDBfVlNZTkNfRU5BQkxFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX0NSVF9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgSU5UX01BU0tfQ1JUX1ZTWU5DX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfQ1JUX1ZTWU5DX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfUEFORUxfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBJTlRfTUFTS19QQU5FTF9WU1lOQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19QQU5FTF9WU1lOQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19WR0FfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIElOVF9NQVNLX1ZHQV9WU1lOQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX1ZHQV9WU1lOQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwCisjZGVmaW5lIENVUlJFTlRfR0FURV9NQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorI2lmZGVmIFZBTElEQVRJT05fQ0hJUAorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX01DTEtfMTEyTUhaICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NQ0xLXzg0TUhaICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTUNMS181Nk1IWiAgICAgICAgICAgICAgICAgICAgICAgMgorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX01DTEtfNDJNSFogICAgICAgICAgICAgICAgICAgICAgIDMKKyNlbHNlCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTUNMS19ESVZfMyAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX01DTEtfRElWXzQgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NQ0xLX0RJVl82ICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTUNMS19ESVZfOCAgICAgICAgICAgICAgICAgICAgICAgMworI2VuZGlmCisjZGVmaW5lIENVUlJFTlRfR0FURV9NMlhDTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMgorI2lmZGVmIFZBTElEQVRJT05fQ0hJUAorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX00yWENMS18zMzZNSFogICAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NMlhDTEtfMTY4TUhaICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTTJYQ0xLXzExMk1IWiAgICAgICAgICAgICAgICAgICAgMgorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX00yWENMS184NE1IWiAgICAgICAgICAgICAgICAgICAgIDMKKyNlbHNlCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTTJYQ0xLX0RJVl8xICAgICAgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX00yWENMS19ESVZfMiAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NMlhDTEtfRElWXzMgICAgICAgICAgICAgICAgICAgICAyCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTTJYQ0xLX0RJVl80ICAgICAgICAgICAgICAgICAgICAgMworI2VuZGlmCisjZGVmaW5lIENVUlJFTlRfR0FURV9WR0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfVkdBX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfVkdBX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDVVJSRU5UX0dBVEVfUFdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIENVUlJFTlRfR0FURV9QV01fT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENVUlJFTlRfR0FURV9QV01fT04gICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENVUlJFTlRfR0FURV9JMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0kyQ19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0kyQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1NTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBDVVJSRU5UX0dBVEVfU1NQX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfU1NQX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDVVJSRU5UX0dBVEVfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIENVUlJFTlRfR0FURV9HUElPX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENVUlJFTlRfR0FURV9HUElPX09OICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENVUlJFTlRfR0FURV9aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1pWUE9SVF9PRkYgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1pWUE9SVF9PTiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0NTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBDVVJSRU5UX0dBVEVfQ1NDX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfQ1NDX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDVVJSRU5UX0dBVEVfREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIENVUlJFTlRfR0FURV9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENVUlJFTlRfR0FURV9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENVUlJFTlRfR0FURV9ESVNQTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0RJU1BMQVlfT0ZGICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0RJU1BMQVlfT04gICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0xPQ0FMTUVNICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBDVVJSRU5UX0dBVEVfTE9DQUxNRU1fT0ZGICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfTE9DQUxNRU1fT04gICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDVVJSRU5UX0dBVEVfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIENVUlJFTlRfR0FURV9ETUFfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENVUlJFTlRfR0FURV9ETUFfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgTU9ERTBfR0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQ0CisjZGVmaW5lIE1PREUwX0dBVEVfTUNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorI2RlZmluZSBNT0RFMF9HQVRFX01DTEtfMTEyTUhaICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX01DTEtfODRNSFogICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX01DTEtfNTZNSFogICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNT0RFMF9HQVRFX01DTEtfNDJNSFogICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNT0RFMF9HQVRFX00yWENMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNkZWZpbmUgTU9ERTBfR0FURV9NMlhDTEtfMzM2TUhaICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9NMlhDTEtfMTY4TUhaICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9NMlhDTEtfMTEyTUhaICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTU9ERTBfR0FURV9NMlhDTEtfODRNSFogICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU9ERTBfR0FURV9WR0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIE1PREUwX0dBVEVfVkdBX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfVkdBX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfUFdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgTU9ERTBfR0FURV9QV01fT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9QV01fT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9JMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBNT0RFMF9HQVRFX0kyQ19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX0kyQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX1NTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzo3CisjZGVmaW5lIE1PREUwX0dBVEVfU1NQX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfU1NQX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OjYKKyNkZWZpbmUgTU9ERTBfR0FURV9HUElPX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9HUElPX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBNT0RFMF9HQVRFX1pWUE9SVF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX1pWUE9SVF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX0NTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIE1PREUwX0dBVEVfQ1NDX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfQ1NDX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgTU9ERTBfR0FURV9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9ESVNQTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBNT0RFMF9HQVRFX0RJU1BMQVlfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX0RJU1BMQVlfT04gICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX0xPQ0FMTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIE1PREUwX0dBVEVfTE9DQUxNRU1fT0ZGICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfTE9DQUxNRU1fT04gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgTU9ERTBfR0FURV9ETUFfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9ETUFfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBNT0RFMV9HQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDgKKyNkZWZpbmUgTU9ERTFfR0FURV9NQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE0CisjZGVmaW5lIE1PREUxX0dBVEVfTUNMS18xMTJNSFogICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfTUNMS184NE1IWiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfTUNMS181Nk1IWiAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1PREUxX0dBVEVfTUNMS180Mk1IWiAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1PREUxX0dBVEVfTTJYQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMgorI2RlZmluZSBNT0RFMV9HQVRFX00yWENMS18zMzZNSFogICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX00yWENMS18xNjhNSFogICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX00yWENMS18xMTJNSFogICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNT0RFMV9HQVRFX00yWENMS184NE1IWiAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNT0RFMV9HQVRFX1ZHQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgTU9ERTFfR0FURV9WR0FfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9WR0FfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9QV00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBNT0RFMV9HQVRFX1BXTV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX1BXTV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX0kyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIE1PREUxX0dBVEVfSTJDX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfSTJDX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfU1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgTU9ERTFfR0FURV9TU1BfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9TU1BfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6NgorI2RlZmluZSBNT0RFMV9HQVRFX0dQSU9fT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX0dQSU9fT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIE1PREUxX0dBVEVfWlZQT1JUX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfWlZQT1JUX09OICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfQ1NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgTU9ERTFfR0FURV9DU0NfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9DU0NfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBNT0RFMV9HQVRFX0RFX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX0RFX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX0RJU1BMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIE1PREUxX0dBVEVfRElTUExBWV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfRElTUExBWV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfTE9DQUxNRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgTU9ERTFfR0FURV9MT0NBTE1FTV9PRkYgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9MT0NBTE1FTV9PTiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBNT0RFMV9HQVRFX0RNQV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX0RNQV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0QworI2lmZGVmIFZBTElEQVRJT05fQ0hJUAorICAgICNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMXzMzNkNMSyAgICAgICAgICAgICAgICAgICAgNDo0CisgICAgI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfMzM2Q0xLX09GRiAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfMzM2Q0xLX09OICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKyNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMX09TQ19JTlBVVCAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfT1NDX0lOUFVUX09GRiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfT1NDX0lOUFVUX09OICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfQUNQSSAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF9BQ1BJX09GRiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF9BQ1BJX09OICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAxOjAKKyNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMX01PREVfTU9ERTAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMX01PREVfTU9ERTEgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMX01PREVfU0xFRVAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBQQ0lfTUFTVEVSX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNTAKKyNkZWZpbmUgUENJX01BU1RFUl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIERFVklDRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA1NAorI2RlZmluZSBERVZJQ0VfSURfREVWSUNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgREVWSUNFX0lEX1JFVklTSU9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIFBMTF9DTEtfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA1OAorI2RlZmluZSBQTExfQ0xLX0NPVU5UX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIFBBTkVMX1BMTF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA1QworI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfQllQQVNTX09GRiAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfQllQQVNTX09OICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX1BPV0VSX09OICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9JTlBVVF9PU0MgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9JTlBVVF9URVNUQ0xLICAgICAgICAgICAgICAgICAgMQorI2lmZGVmIFZBTElEQVRJT05fQ0hJUAorICAgICNkZWZpbmUgUEFORUxfUExMX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyNlbHNlCisgICAgI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9QT0QgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorICAgICNkZWZpbmUgUEFORUxfUExMX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNlbmRpZgorI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6OAorI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgQ1JUX1BMTF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDYwCisjZGVmaW5lIENSVF9QTExfQ1RSTF9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBDUlRfUExMX0NUUkxfQllQQVNTX09GRiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfUExMX0NUUkxfQllQQVNTX09OICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfUExMX0NUUkxfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgQ1JUX1BMTF9DVFJMX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX1BMTF9DVFJMX1BPV0VSX09OICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX1BMTF9DVFJMX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIENSVF9QTExfQ1RSTF9JTlBVVF9PU0MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9QTExfQ1RSTF9JTlBVVF9URVNUQ0xLICAgICAgICAgICAgICAgICAgICAxCisjaWZkZWYgVkFMSURBVElPTl9DSElQCisgICAgI2RlZmluZSBDUlRfUExMX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorI2Vsc2UKKyAgICAjZGVmaW5lIENSVF9QTExfQ1RSTF9QT0QgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE0CisgICAgI2RlZmluZSBDUlRfUExMX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMgorI2VuZGlmCisjZGVmaW5lIENSVF9QTExfQ1RSTF9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTo4CisjZGVmaW5lIENSVF9QTExfQ1RSTF9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBWR0FfUExMMF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNjQKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfQllQQVNTX09GRiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfQllQQVNTX09OICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNworI2RlZmluZSBWR0FfUExMMF9DVFJMX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWR0FfUExMMF9DVFJMX1BPV0VSX09OICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWR0FfUExMMF9DVFJMX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9JTlBVVF9PU0MgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9JTlBVVF9URVNUQ0xLICAgICAgICAgICAgICAgICAgIDEKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIFZHQV9QTEwwX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE0CisjZWxzZQorICAgICNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9QT0QgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyAgICAjZGVmaW5lIFZHQV9QTEwwX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEyCisjZW5kaWYKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjgKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIFZHQV9QTEwxX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA2OAorI2RlZmluZSBWR0FfUExMMV9DVFJMX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9CWVBBU1NfT0ZGICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9CWVBBU1NfT04gICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIFZHQV9QTEwxX0NUUkxfUE9XRVJfT0ZGICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZHQV9QTEwxX0NUUkxfUE9XRVJfT04gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZHQV9QTEwxX0NUUkxfSU5QVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBWR0FfUExMMV9DVFJMX0lOUFVUX09TQyAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWR0FfUExMMV9DVFJMX0lOUFVUX1RFU1RDTEsgICAgICAgICAgICAgICAgICAgMQorI2lmZGVmIFZBTElEQVRJT05fQ0hJUAorICAgICNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9PRCAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyNlbHNlCisgICAgI2RlZmluZSBWR0FfUExMMV9DVFJMX1BPRCAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorICAgICNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9PRCAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNlbmRpZgorI2RlZmluZSBWR0FfUExMMV9DVFJMX04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6OAorI2RlZmluZSBWR0FfUExMMV9DVFJMX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgU0NSQVRDSF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDZjCisKKyNpZm5kZWYgVkFMSURBVElPTl9DSElQCisKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDcwCisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBNWENMS19QTExfQ1RSTF9CWVBBU1NfT0ZGICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNWENMS19QTExfQ1RSTF9CWVBBU1NfT04gICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNWENMS19QTExfQ1RSTF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfUE9XRVJfT0ZGICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfUE9XRVJfT04gICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfSU5QVVQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX0lOUFVUX09TQyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX0lOUFVUX1RFU1RDTEsgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX1BPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorI2RlZmluZSBNWENMS19QTExfQ1RSTF9PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjgKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIFZHQV9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4OAorI2RlZmluZSBWR0FfQ09ORklHVVJBVElPTl9VU0VSX0RFRklORSAgICAgICAgICAgICAgICAgNTo0CisjZGVmaW5lIFZHQV9DT05GSUdVUkFUSU9OX1BMTCAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgVkdBX0NPTkZJR1VSQVRJT05fUExMX1ZHQSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVkdBX0NPTkZJR1VSQVRJT05fUExMX1BBTkVMICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVkdBX0NPTkZJR1VSQVRJT05fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBWR0FfQ09ORklHVVJBVElPTl9NT0RFX1RFWFQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWR0FfQ09ORklHVVJBVElPTl9NT0RFX0dSQVBISUMgICAgICAgICAgICAgICAgMQorCisjZW5kaWYKKworI2RlZmluZSBHUElPX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMAorI2RlZmluZSBHUElPX0RBVEFfMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBHUElPX0RBVEFfMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDozMAorI2RlZmluZSBHUElPX0RBVEFfMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOToyOQorI2RlZmluZSBHUElPX0RBVEFfMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBHUElPX0RBVEFfMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBHUElPX0RBVEFfMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBHUElPX0RBVEFfMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBHUElPX0RBVEFfMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBHUElPX0RBVEFfMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzoyMworI2RlZmluZSBHUElPX0RBVEFfMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjoyMgorI2RlZmluZSBHUElPX0RBVEFfMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMToyMQorI2RlZmluZSBHUElPX0RBVEFfMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDoyMAorI2RlZmluZSBHUElPX0RBVEFfMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOToxOQorI2RlZmluZSBHUElPX0RBVEFfMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBHUElPX0RBVEFfMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNworI2RlZmluZSBHUElPX0RBVEFfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBHUElPX0RBVEFfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBHUElPX0RBVEFfMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBHUElPX0RBVEFfMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBHUElPX0RBVEFfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjoxMgorI2RlZmluZSBHUElPX0RBVEFfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBHUElPX0RBVEFfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBHUElPX0RBVEFfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgR1BJT19EQVRBXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIEdQSU9fREFUQV83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBHUElPX0RBVEFfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OjYKKyNkZWZpbmUgR1BJT19EQVRBXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIEdQSU9fREFUQV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBHUElPX0RBVEFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgR1BJT19EQVRBXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIEdQSU9fREFUQV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBHUElPX0RBVEFfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwNAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzMxICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzMxX0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMzFfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8zMCAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8zMF9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzMwX09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjkgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjI5CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjlfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yOV9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI4X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjhfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yNyAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yN19JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI3X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjYgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjZfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yNl9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI1X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjVfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yNCAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yNF9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI0X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjMgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOjIzCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjNfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yM19PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIyICAgICAgICAgICAgICAgICAgICAgICAgICAyMjoyMgorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIyX0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjJfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yMSAgICAgICAgICAgICAgICAgICAgICAgICAgMjE6MjEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yMV9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIxX09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOjIwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjBfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yMF9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAxOToxOQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE5X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTlfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xOCAgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xOF9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE4X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTcgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTdfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xN19PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE2X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTZfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xNV9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE1X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTQgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OjE0CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTRfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xNF9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEzX0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTNfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xMl9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEyX09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTEgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTFfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xMV9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEwX0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTBfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl85ICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fOV9JTlBVVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl85X09VVFBVVCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzggICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl84X0lOUFVUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzhfT1VUUFVUICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzdfSU5QVVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fN19PVVRQVVQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl82ICAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fNl9JTlBVVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl82X09VVFBVVCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzUgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl81X0lOUFVUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzVfT1VUUFVUICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzRfSU5QVVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fNF9PVVRQVVQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fM19JTlBVVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8zX09VVFBVVCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yX0lOUFVUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzJfT1VUUFVUICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzFfSU5QVVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMV9PVVRQVVQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMF9JTlBVVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8wX09VVFBVVCAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDA4CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMzEgICAgICAgICAgICAgICAgIDIyOjIyCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMzFfRURHRSAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8zMV9MRVZFTCAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzMwICAgICAgICAgICAgICAgICAyMToyMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzMwX0VER0UgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMzBfTEVWRUwgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yOSAgICAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yOV9FREdFICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI5X0xFVkVMICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjggICAgICAgICAgICAgICAgIDE5OjE5CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjhfRURHRSAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yOF9MRVZFTCAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI3ICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI3X0VER0UgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjdfTEVWRUwgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yNiAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yNl9FREdFICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI2X0xFVkVMICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjUgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjVfRURHRSAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yNV9MRVZFTCAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMzEgICAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMzFfTE9XICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8zMV9ISUdIICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzMwICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzMwX0xPVyAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMzBfSElHSCAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yOSAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yOV9MT1cgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI5X0hJR0ggICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjggICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjhfTE9XICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yOF9ISUdIICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI3ICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI3X0xPVyAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjdfSElHSCAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yNiAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjZfTE9XICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yNl9ISUdIICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI1ICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yNV9MT1cgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI1X0hJR0ggICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMzEgICAgICAgICAgICAgICAgICA2OjYKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzMxX0dQSU8gICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMzFfSU5URVJSVVBUICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8zMCAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMzBfR1BJTyAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8zMF9JTlRFUlJVUFQgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI5ICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yOV9HUElPICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI5X0lOVEVSUlVQVCAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjggICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI4X0dQSU8gICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjhfSU5URVJSVVBUICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yNyAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjdfR1BJTyAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yN19JTlRFUlJVUFQgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI2ICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yNl9HUElPICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI2X0lOVEVSUlVQVCAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjUgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI1X0dQSU8gICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjVfSU5URVJSVVBUICAgICAgICAxCisKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMEMKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzMxICAgICAgICAgICAgICAgICAgICAgICAgMjI6MjIKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzMxX0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMzFfQUNUSVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18zMV9SRVNFVCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzMwICAgICAgICAgICAgICAgICAgICAgICAgMjE6MjEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzMwX0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMzBfQUNUSVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18zMF9SRVNFVCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI5ICAgICAgICAgICAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI5X0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjlfQUNUSVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yOV9SRVNFVCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI4ICAgICAgICAgICAgICAgICAgICAgICAgMTk6MTkKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI4X0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjhfQUNUSVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yOF9SRVNFVCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI3ICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI3X0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjdfQUNUSVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yN19SRVNFVCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI2ICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI2X0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjZfQUNUSVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yNl9SRVNFVCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI1ICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI1X0lOQUNUSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjVfQUNUSVZFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yNV9SRVNFVCAgICAgICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfMV9NQVNLICAgICAgICAgICAgMzE6MzAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzFfTUFTS19ESVNBQkxFICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzFfTUFTS19FTkFCTEUgICAgIDMKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgIDI5OjI4CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfUEFORUwgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfVkdBICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfQ1JUICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9GUEVOICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRlBFTl9MT1cgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRlBFTl9ISUdIICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVkJJQVNFTiAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZCSUFTRU5fTE9XICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZCSUFTRU5fSElHSCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBX0RJU0FCTEUgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBX0VOQUJMRSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9GUFZEREVOICAgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRlBWRERFTl9MT1cgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRlBWRERFTl9ISUdIICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfMl9NQVNLICAgICAgICAgICAgMjM6MjAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzJfTUFTS19ESVNBQkxFICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzJfTUFTS19FTkFCTEUgICAgIDE1CisKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1RGVF9ESVNQIDE5OjE4CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9URlRfRElTUF8yNCAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9URlRfRElTUF8zNiAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9URlRfRElTUF8xOCAyCisKKworI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRFVBTF9ESVNQTEFZICAgICAgICAgICAgICAgMTk6MTkKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0RVQUxfRElTUExBWV9ESVNBQkxFICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0RVQUxfRElTUExBWV9FTkFCTEUgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0RPVUJMRV9QSVhFTCAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9ET1VCTEVfUElYRUxfRElTQUJMRSAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9ET1VCTEVfUElYRUxfRU5BQkxFICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9GSUZPICAgICAgICAgICAgICAgICAgICAgICAxNzoxNgorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRklGT18xICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRklGT18zICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRklGT183ICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRklGT18xMSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfM19NQVNLICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzNfTUFTS19ESVNBQkxFICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzNfTUFTS19FTkFCTEUgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0NMT0NLX1BIQVNFICAgICAgICAgICAgICAgIDE0OjE0CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9DTE9DS19QSEFTRV9BQ1RJVkVfSElHSCAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9DTE9DS19QSEFTRV9BQ1RJVkVfTE9XICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WU1lOQ19QSEFTRSAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVlNZTkNfUEhBU0VfQUNUSVZFX0hJR0ggICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVlNZTkNfUEhBU0VfQUNUSVZFX0xPVyAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfSFNZTkNfUEhBU0UgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hTWU5DX1BIQVNFX0FDVElWRV9ISUdIICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hTWU5DX1BIQVNFX0FDVElWRV9MT1cgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WU1lOQ19BQ1RJVkVfSElHSCAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WU1lOQ19BQ1RJVkVfTE9XICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9DQVBUVVJFX1RJTUlORyAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ0FQVFVSRV9USU1JTkdfRElTQUJMRSAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ0FQVFVSRV9USU1JTkdfRU5BQkxFICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ09MT1JfS0VZICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9DT0xPUl9LRVlfRElTQUJMRSAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9DT0xPUl9LRVlfRU5BQkxFICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9USU1JTkcgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1RJTUlOR19ESVNBQkxFICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1RJTUlOR19FTkFCTEUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZFUlRJQ0FMX1BBTl9ESVIgICAgICAgICAgIDc6NworI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfUEFOX0RJUl9ET1dOICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfUEFOX0RJUl9VUCAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfUEFOICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WRVJUSUNBTF9QQU5fRElTQUJMRSAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WRVJUSUNBTF9QQU5fRU5BQkxFICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX1BBTl9ESVIgICAgICAgICA1OjUKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hPUklaT05UQUxfUEFOX0RJUl9SSUdIVCAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hPUklaT05UQUxfUEFOX0RJUl9MRUZUICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hPUklaT05UQUxfUEFOICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfSE9SSVpPTlRBTF9QQU5fRElTQUJMRSAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfSE9SSVpPTlRBTF9QQU5fRU5BQkxFICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfR0FNTUEgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9HQU1NQV9ESVNBQkxFICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9HQU1NQV9FTkFCTEUgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1BMQU5FX0RJU0FCTEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1BMQU5FX0VOQUJMRSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgIDE6MAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRk9STUFUXzggICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRk9STUFUXzE2ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRk9STUFUXzMyICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFBBTkVMX1BBTl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwNAorI2RlZmluZSBQQU5FTF9QQU5fQ1RSTF9WRVJUSUNBTF9QQU4gICAgICAgICAgICAgICAgICAgMzE6MjQKKyNkZWZpbmUgUEFORUxfUEFOX0NUUkxfVkVSVElDQUxfVlNZTkMgICAgICAgICAgICAgICAgIDIxOjE2CisjZGVmaW5lIFBBTkVMX1BBTl9DVFJMX0hPUklaT05UQUxfUEFOICAgICAgICAgICAgICAgICAxNTo4CisjZGVmaW5lIFBBTkVMX1BBTl9DVFJMX0hPUklaT05UQUxfVlNZTkMgICAgICAgICAgICAgICA1OjAKKworI2RlZmluZSBQQU5FTF9DT0xPUl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDgKKyNkZWZpbmUgUEFORUxfQ09MT1JfS0VZX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFBBTkVMX0NPTE9SX0tFWV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgUEFORUxfRkJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDBDCisjZGVmaW5lIFBBTkVMX0ZCX0FERFJFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBQQU5FTF9GQl9BRERSRVNTX1NUQVRVU19DVVJSRU5UICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9GQl9BRERSRVNTX1NUQVRVU19QRU5ESU5HICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9GQl9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgUEFORUxfRkJfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRkJfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRkJfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBQQU5FTF9GQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMTAKKyNkZWZpbmUgUEFORUxfRkJfV0lEVEhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjE2CisjZGVmaW5lIFBBTkVMX0ZCX1dJRFRIX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAxMzowCisKKyNkZWZpbmUgUEFORUxfV0lORE9XX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDE0CisjZGVmaW5lIFBBTkVMX1dJTkRPV19XSURUSF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAyNzoxNgorI2RlZmluZSBQQU5FTF9XSU5ET1dfV0lEVEhfWCAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6MAorCisjZGVmaW5lIFBBTkVMX1dJTkRPV19IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAxOAorI2RlZmluZSBQQU5FTF9XSU5ET1dfSEVJR0hUX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgUEFORUxfV0lORE9XX0hFSUdIVF9ZICAgICAgICAgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBQQU5FTF9QTEFORV9UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMUMKKyNkZWZpbmUgUEFORUxfUExBTkVfVExfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIFBBTkVMX1BMQU5FX1RMX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgUEFORUxfUExBTkVfQlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDIwCisjZGVmaW5lIFBBTkVMX1BMQU5FX0JSX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBQQU5FTF9QTEFORV9CUl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIFBBTkVMX0hPUklaT05UQUxfVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAyNAorI2RlZmluZSBQQU5FTF9IT1JJWk9OVEFMX1RPVEFMX1RPVEFMICAgICAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgUEFORUxfSE9SSVpPTlRBTF9UT1RBTF9ESVNQTEFZX0VORCAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBQQU5FTF9IT1JJWk9OVEFMX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMjgKKyNkZWZpbmUgUEFORUxfSE9SSVpPTlRBTF9TWU5DX1dJRFRIICAgICAgICAgICAgICAgICAgIDIzOjE2CisjZGVmaW5lIFBBTkVMX0hPUklaT05UQUxfU1lOQ19TVEFSVCAgICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgUEFORUxfVkVSVElDQUxfVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDJDCisjZGVmaW5lIFBBTkVMX1ZFUlRJQ0FMX1RPVEFMX1RPVEFMICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBQQU5FTF9WRVJUSUNBTF9UT1RBTF9ESVNQTEFZX0VORCAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIFBBTkVMX1ZFUlRJQ0FMX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAzMAorI2RlZmluZSBQQU5FTF9WRVJUSUNBTF9TWU5DX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgMjE6MTYKKyNkZWZpbmUgUEFORUxfVkVSVElDQUxfU1lOQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBQQU5FTF9DVVJSRU5UX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMzQKKyNkZWZpbmUgUEFORUxfQ1VSUkVOVF9MSU5FX0xJTkUgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworLyogVmlkZW8gQ29udHJvbCAqLworCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDQwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9MSU5FX0JVRkZFUiAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9MSU5FX0JVRkZFUl9ESVNBQkxFICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0xJTkVfQlVGRkVSX0VOQUJMRSAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNgorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRklGT18xICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9GSUZPXzMgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0ZJRk9fNyAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRklGT18xMSAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9CVUZGRVJfMCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0JVRkZFUl8xICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfQ0FQVFVSRSAgICAgICAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfQ0FQVFVSRV9ESVNBQkxFICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9DQVBUVVJFX0VOQUJMRSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0RPVUJMRV9CVUZGRVIgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0RPVUJMRV9CVUZGRVJfRElTQUJMRSAgICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRE9VQkxFX0JVRkZFUl9FTkFCTEUgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9CWVRFX1NXQVAgICAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9CWVRFX1NXQVBfRElTQUJMRSAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0JZVEVfU1dBUF9FTkFCTEUgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfVkVSVElDQUxfU0NBTEUgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfVkVSVElDQUxfU0NBTEVfTk9STUFMICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9WRVJUSUNBTF9TQ0FMRV9IQUxGICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0hPUklaT05UQUxfU0NBTEUgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0hPUklaT05UQUxfU0NBTEVfTk9STUFMICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfSE9SSVpPTlRBTF9TQ0FMRV9IQUxGICAgICAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9WRVJUSUNBTF9NT0RFICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfVkVSVElDQUxfTU9ERV9SRVBMSUNBVEUgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9WRVJUSUNBTF9NT0RFX0lOVEVSUE9MQVRFICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0hPUklaT05UQUxfTU9ERSAgICAgICAgICAgICAgODo4CisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX01PREVfUkVQTElDQVRFICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0hPUklaT05UQUxfTU9ERV9JTlRFUlBPTEFURSAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfUElYRUwgICAgICAgICAgICAgICAgICAgICAgICA3OjQKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0dBTU1BICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9HQU1NQV9ESVNBQkxFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0dBTU1BX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfUExBTkUgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX1BMQU5FX0RJU0FCTEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfUExBTkVfRU5BQkxFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgIDE6MAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRk9STUFUXzggICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9GT1JNQVRfMTYgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0ZPUk1BVF8zMiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRk9STUFUX1lVViAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgVklERU9fRkJfMF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDQ0CisjZGVmaW5lIFZJREVPX0ZCXzBfQUREUkVTU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBWSURFT19GQl8wX0FERFJFU1NfU1RBVFVTX0NVUlJFTlQgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19GQl8wX0FERFJFU1NfU1RBVFVTX1BFTkRJTkcgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19GQl8wX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgVklERU9fRkJfMF9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRkJfMF9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRkJfMF9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBWSURFT19GQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwNDgKKyNkZWZpbmUgVklERU9fRkJfV0lEVEhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjE2CisjZGVmaW5lIFZJREVPX0ZCX1dJRFRIX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAxMzowCisKKyNkZWZpbmUgVklERU9fRkJfMF9MQVNUX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDRDCisjZGVmaW5lIFZJREVPX0ZCXzBfTEFTVF9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBWSURFT19GQl8wX0xBU1RfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19GQl8wX0xBU1RfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgMQorI2RlZmluZSBWSURFT19GQl8wX0xBU1RfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIFZJREVPX1BMQU5FX1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA1MAorI2RlZmluZSBWSURFT19QTEFORV9UTF9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgVklERU9fUExBTkVfVExfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBWSURFT19QTEFORV9CUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwNTQKKyNkZWZpbmUgVklERU9fUExBTkVfQlJfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIFZJREVPX1BMQU5FX0JSX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgVklERU9fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDU4CisjZGVmaW5lIFZJREVPX1NDQUxFX1ZFUlRJQ0FMX01PREUgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBWSURFT19TQ0FMRV9WRVJUSUNBTF9NT0RFX0VYUEFORCAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19TQ0FMRV9WRVJUSUNBTF9NT0RFX1NIUklOSyAgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19TQ0FMRV9WRVJUSUNBTF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgVklERU9fU0NBTEVfSE9SSVpPTlRBTF9NT0RFICAgICAgICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIFZJREVPX1NDQUxFX0hPUklaT05UQUxfTU9ERV9FWFBBTkQgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX1NDQUxFX0hPUklaT05UQUxfTU9ERV9TSFJJTksgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX1NDQUxFX0hPUklaT05UQUxfU0NBTEUgICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgVklERU9fSU5JVElBTF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDVDCisjZGVmaW5lIFZJREVPX0lOSVRJQUxfU0NBTEVfRkJfMSAgICAgICAgICAgICAgICAgICAgICAyNzoxNgorI2RlZmluZSBWSURFT19JTklUSUFMX1NDQUxFX0ZCXzAgICAgICAgICAgICAgICAgICAgICAgMTE6MAorCisjZGVmaW5lIFZJREVPX1lVVl9DT05TVEFOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA2MAorI2RlZmluZSBWSURFT19ZVVZfQ09OU1RBTlRTX1kgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MjQKKyNkZWZpbmUgVklERU9fWVVWX0NPTlNUQU5UU19SICAgICAgICAgICAgICAgICAgICAgICAgIDIzOjE2CisjZGVmaW5lIFZJREVPX1lVVl9DT05TVEFOVFNfRyAgICAgICAgICAgICAgICAgICAgICAgICAxNTo4CisjZGVmaW5lIFZJREVPX1lVVl9DT05TVEFOVFNfQiAgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBWSURFT19GQl8xX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwNjQKKyNkZWZpbmUgVklERU9fRkJfMV9BRERSRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIFZJREVPX0ZCXzFfQUREUkVTU19TVEFUVVNfQ1VSUkVOVCAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0ZCXzFfQUREUkVTU19TVEFUVVNfUEVORElORyAgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0ZCXzFfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBWSURFT19GQl8xX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19GQl8xX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19GQl8xX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIFZJREVPX0ZCXzFfTEFTVF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA2OAorI2RlZmluZSBWSURFT19GQl8xX0xBU1RfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgVklERU9fRkJfMV9MQVNUX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRkJfMV9MQVNUX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRkJfMV9MQVNUX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgIDI1OjAKKworLyogVmlkZW8gQWxwaGEgQ29udHJvbCAqLworCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDgwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9TRUxFQ1QgICAgICAgICAgICAgICAgIDI4OjI4CisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfUEVSX1BJWEVMICAgICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX1NFTEVDVF9BTFBIQSAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfQUxQSEEgICAgICAgICAgICAgICAgICAyNzoyNAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfRklGTyAgICAgICAgICAgICAgICAgICAxNzoxNgorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfRklGT18xICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9GSUZPXzMgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0ZJRk9fNyAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfRklGT18xMSAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9WRVJUX1NDQUxFICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9WRVJUX1NDQUxFX05PUk1BTCAgICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX1ZFUlRfU0NBTEVfSEFMRiAgICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfSE9SWl9TQ0FMRSAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfSE9SWl9TQ0FMRV9OT1JNQUwgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9IT1JaX1NDQUxFX0hBTEYgICAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX1ZFUlRfTU9ERSAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9WRVJUX01PREVfUkVQTElDQVRFICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX1ZFUlRfTU9ERV9JTlRFUlBPTEFURSAgMQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfSE9SWl9NT0RFICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0hPUlpfTU9ERV9SRVBMSUNBVEUgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfSE9SWl9NT0RFX0lOVEVSUE9MQVRFICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9QSVhFTCAgICAgICAgICAgICAgICAgIDc6NAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfQ0hST01BX0tFWSAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0NIUk9NQV9LRVlfRElTQUJMRSAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfQ0hST01BX0tFWV9FTkFCTEUgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9QTEFORSAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfUExBTkVfRElTQUJMRSAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9QTEFORV9FTkFCTEUgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0ZPUk1BVCAgICAgICAgICAgICAgICAgMTowCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9GT1JNQVRfOCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0ZPUk1BVF8xNiAgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfRk9STUFUX0FMUEhBXzRfNCAgICAgICAyCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9GT1JNQVRfQUxQSEFfNF80XzRfNCAgIDMKKworI2RlZmluZSBWSURFT19BTFBIQV9GQl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwODQKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfQUREUkVTU19TVEFUVVMgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0FERFJFU1NfU1RBVFVTX0NVUlJFTlQgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0FERFJFU1NfU1RBVFVTX1BFTkRJTkcgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBWSURFT19BTFBIQV9GQl9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9GQl9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9GQl9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA4OAorI2RlZmluZSBWSURFT19BTFBIQV9GQl9XSURUSF9XSURUSCAgICAgICAgICAgICAgICAgICAgMjk6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfV0lEVEhfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDEzOjAKKworI2RlZmluZSBWSURFT19BTFBIQV9GQl9MQVNUX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgwODAwOEMKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfTEFTVF9BRERSRVNTX0VYVCAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0xBU1RfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0xBU1RfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0xBU1RfQUREUkVTU19BRERSRVNTICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfUExBTkVfVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDkwCisjZGVmaW5lIFZJREVPX0FMUEhBX1BMQU5FX1RMX1RPUCAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBWSURFT19BTFBIQV9QTEFORV9UTF9MRUZUICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX1BMQU5FX0JSICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA5NAorI2RlZmluZSBWSURFT19BTFBIQV9QTEFORV9CUl9CT1RUT00gICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfUExBTkVfQlJfUklHSFQgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBWSURFT19BTFBIQV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwOTgKKyNkZWZpbmUgVklERU9fQUxQSEFfU0NBTEVfVkVSVElDQUxfTU9ERSAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIFZJREVPX0FMUEhBX1NDQUxFX1ZFUlRJQ0FMX01PREVfRVhQQU5EICAgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX1NDQUxFX1ZFUlRJQ0FMX01PREVfU0hSSU5LICAgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX1NDQUxFX1ZFUlRJQ0FMX1NDQUxFICAgICAgICAgICAgICAyNzoxNgorI2RlZmluZSBWSURFT19BTFBIQV9TQ0FMRV9IT1JJWk9OVEFMX01PREUgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgVklERU9fQUxQSEFfU0NBTEVfSE9SSVpPTlRBTF9NT0RFX0VYUEFORCAgICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfU0NBTEVfSE9SSVpPTlRBTF9NT0RFX1NIUklOSyAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfU0NBTEVfSE9SSVpPTlRBTF9TQ0FMRSAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBWSURFT19BTFBIQV9JTklUSUFMX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMHgwODAwOUMKKyNkZWZpbmUgVklERU9fQUxQSEFfSU5JVElBTF9TQ0FMRV9WRVJUSUNBTCAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0lOSVRJQUxfU0NBTEVfSE9SSVpPTlRBTCAgICAgICAgICAxMTowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfQ0hST01BX0tFWSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMEEwCisjZGVmaW5lIFZJREVPX0FMUEhBX0NIUk9NQV9LRVlfTUFTSyAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBWSURFT19BTFBIQV9DSFJPTUFfS0VZX1ZBTFVFICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8wMSAgICAgICAgICAgICAgICAgICAweDA4MDBBNAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMDFfMSAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzFfUkVEICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8wMV8xX0dSRUVOICAgICAgICAgICAyNjoyMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMDFfMV9CTFVFICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzAgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzBfUkVEICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8wMV8wX0dSRUVOICAgICAgICAgICAxMDo1CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8wMV8wX0JMVUUgICAgICAgICAgICA0OjAKKworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMjMgICAgICAgICAgICAgICAgICAgMHgwODAwQTgKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzMgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8yM18zX1JFRCAgICAgICAgICAgICAzMToyNworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMjNfM19HUkVFTiAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzNfQkxVRSAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8yM18yICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8yM18yX1JFRCAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMjNfMl9HUkVFTiAgICAgICAgICAgMTA6NQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMjNfMl9CTFVFICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzQ1ICAgICAgICAgICAgICAgICAgIDB4MDgwMEFDCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF80NV81ICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNDVfNV9SRUQgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzVfR1JFRU4gICAgICAgICAgIDI2OjIxCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF80NV81X0JMVUUgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNDVfNCAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNDVfNF9SRUQgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzRfR1JFRU4gICAgICAgICAgIDEwOjUKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzRfQkxVRSAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF82NyAgICAgICAgICAgICAgICAgICAweDA4MDBCMAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNjdfNyAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzdfUkVEICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF82N183X0dSRUVOICAgICAgICAgICAyNjoyMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNjdfN19CTFVFICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzYgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzZfUkVEICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF82N182X0dSRUVOICAgICAgICAgICAxMDo1CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF82N182X0JMVUUgICAgICAgICAgICA0OjAKKworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfODkgICAgICAgICAgICAgICAgICAgMHgwODAwQjQKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzkgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF84OV85X1JFRCAgICAgICAgICAgICAzMToyNworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfODlfOV9HUkVFTiAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzlfQkxVRSAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF84OV84ICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF84OV84X1JFRCAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfODlfOF9HUkVFTiAgICAgICAgICAgMTA6NQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfODlfOF9CTFVFICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0FCICAgICAgICAgICAgICAgICAgIDB4MDgwMEI4CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9BQl9CICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQUJfQl9SRUQgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0JfR1JFRU4gICAgICAgICAgIDI2OjIxCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9BQl9CX0JMVUUgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQUJfQSAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQUJfQV9SRUQgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0FfR1JFRU4gICAgICAgICAgIDEwOjUKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0FfQkxVRSAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9DRCAgICAgICAgICAgICAgICAgICAweDA4MDBCQworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQ0RfRCAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0RfUkVEICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9DRF9EX0dSRUVOICAgICAgICAgICAyNjoyMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQ0RfRF9CTFVFICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0MgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0NfUkVEICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9DRF9DX0dSRUVOICAgICAgICAgICAxMDo1CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9DRF9DX0JMVUUgICAgICAgICAgICA0OjAKKworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfRUYgICAgICAgICAgICAgICAgICAgMHgwODAwQzAKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0YgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9FRl9GX1JFRCAgICAgICAgICAgICAzMToyNworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfRUZfRl9HUkVFTiAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0ZfQkxVRSAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9FRl9FICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9FRl9FX1JFRCAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfRUZfRV9HUkVFTiAgICAgICAgICAgMTA6NQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfRUZfRV9CTFVFICAgICAgICAgICAgNDowCisKKy8qIFBhbmVsIEN1cnNvciBDb250cm9sICovCisKKyNkZWZpbmUgUEFORUxfSFdDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMEYwCisjZGVmaW5lIFBBTkVMX0hXQ19BRERSRVNTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBQQU5FTF9IV0NfQUREUkVTU19FTkFCTEVfRElTQUJMRSAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9IV0NfQUREUkVTU19FTkFCTEVfRU5BQkxFICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9IV0NfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgUEFORUxfSFdDX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfSFdDX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfSFdDX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBQQU5FTF9IV0NfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwRjQKKyNkZWZpbmUgUEFORUxfSFdDX0xPQ0FUSU9OX1RPUCAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFBBTkVMX0hXQ19MT0NBVElPTl9UT1BfSU5TSURFICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0hXQ19MT0NBVElPTl9UT1BfT1VUU0lERSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0hXQ19MT0NBVElPTl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBQQU5FTF9IV0NfTE9DQVRJT05fTEVGVCAgICAgICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgUEFORUxfSFdDX0xPQ0FUSU9OX0xFRlRfSU5TSURFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfSFdDX0xPQ0FUSU9OX0xFRlRfT1VUU0lERSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfSFdDX0xPQ0FUSU9OX1ggICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwRjgKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzEyXzJfUkdCNTY1ICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8xMl8xX1JHQjU2NSAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMEZDCisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8zX1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKy8qIE9sZCBEZWZpbml0aW9ucyArKysgKi8KKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMEY4CisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8wMV8xX1JFRCAgICAgICAgICAgICAgICAgICAgICAzMToyNworI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMDFfMV9HUkVFTiAgICAgICAgICAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzAxXzFfQkxVRSAgICAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8wMV8wX1JFRCAgICAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMDFfMF9HUkVFTiAgICAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMDFfMF9CTFVFICAgICAgICAgICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMEZDCisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8yX1JFRCAgICAgICAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMl9HUkVFTiAgICAgICAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMl9CTFVFICAgICAgICAgICAgICAgICAgICAgICAgNDowCisvKiBPbGQgRGVmaW5pdGlvbnMgLS0tICovCisKKy8qIEFscGhhIENvbnRyb2wgKi8KKworI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMDAKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgIDI4OjI4CisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfUEVSX1BJWEVMICAgICAgICAgICAwCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfQUxQSEEgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAyNzoyNAorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMTc6MTYKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZJRk9fMSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZJRk9fMyAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZJRk9fNyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZJRk9fMTEgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX1BJWEVMICAgICAgICAgICAgICAgICAgICAgIDc6NAorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfQ0hST01BX0tFWSAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9DSFJPTUFfS0VZX0RJU0FCTEUgICAgICAgICAwCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9DSFJPTUFfS0VZX0VOQUJMRSAgICAgICAgICAxCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX1BMQU5FX0RJU0FCTEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX1BMQU5FX0VOQUJMRSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgIDE6MAorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfRk9STUFUXzE2ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfRk9STUFUX0FMUEhBXzRfNCAgICAgICAgICAgMgorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfRk9STUFUX0FMUEhBXzRfNF80XzQgICAgICAgMworCisjZGVmaW5lIEFMUEhBX0ZCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEwNAorI2RlZmluZSBBTFBIQV9GQl9BRERSRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgQUxQSEFfRkJfQUREUkVTU19TVEFUVVNfQ1VSUkVOVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUxQSEFfRkJfQUREUkVTU19TVEFUVVNfUEVORElORyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQUxQSEFfRkJfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIEFMUEhBX0ZCX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFMUEhBX0ZCX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFMUEhBX0ZCX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgQUxQSEFfRkJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTA4CisjZGVmaW5lIEFMUEhBX0ZCX1dJRFRIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyOToxNgorI2RlZmluZSBBTFBIQV9GQl9XSURUSF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MAorCisjZGVmaW5lIEFMUEhBX1BMQU5FX1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEwQworI2RlZmluZSBBTFBIQV9QTEFORV9UTF9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgQUxQSEFfUExBTkVfVExfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBBTFBIQV9QTEFORV9CUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMTAKKyNkZWZpbmUgQUxQSEFfUExBTkVfQlJfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIEFMUEhBX1BMQU5FX0JSX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgQUxQSEFfQ0hST01BX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTE0CisjZGVmaW5lIEFMUEhBX0NIUk9NQV9LRVlfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBBTFBIQV9DSFJPTUFfS0VZX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8wMSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDExOAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMDFfMSAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzFfUkVEICAgICAgICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8wMV8xX0dSRUVOICAgICAgICAgICAgICAgICAyNjoyMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMDFfMV9CTFVFICAgICAgICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzBfUkVEICAgICAgICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8wMV8wX0dSRUVOICAgICAgICAgICAgICAgICAxMDo1CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8wMV8wX0JMVUUgICAgICAgICAgICAgICAgICA0OjAKKworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMjMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMUMKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzMgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8yM18zX1JFRCAgICAgICAgICAgICAgICAgICAzMToyNworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMjNfM19HUkVFTiAgICAgICAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzNfQkxVRSAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8yM18yICAgICAgICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8yM18yX1JFRCAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMjNfMl9HUkVFTiAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMjNfMl9CTFVFICAgICAgICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzQ1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTIwCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF80NV81ICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNDVfNV9SRUQgICAgICAgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzVfR1JFRU4gICAgICAgICAgICAgICAgIDI2OjIxCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF80NV81X0JMVUUgICAgICAgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNDVfNCAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNDVfNF9SRUQgICAgICAgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzRfR1JFRU4gICAgICAgICAgICAgICAgIDEwOjUKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzRfQkxVRSAgICAgICAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF82NyAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEyNAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNjdfNyAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzdfUkVEICAgICAgICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF82N183X0dSRUVOICAgICAgICAgICAgICAgICAyNjoyMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNjdfN19CTFVFICAgICAgICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzYgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzZfUkVEICAgICAgICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF82N182X0dSRUVOICAgICAgICAgICAgICAgICAxMDo1CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF82N182X0JMVUUgICAgICAgICAgICAgICAgICA0OjAKKworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfODkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMjgKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzkgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF84OV85X1JFRCAgICAgICAgICAgICAgICAgICAzMToyNworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfODlfOV9HUkVFTiAgICAgICAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzlfQkxVRSAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF84OV84ICAgICAgICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF84OV84X1JFRCAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfODlfOF9HUkVFTiAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfODlfOF9CTFVFICAgICAgICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0FCICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTJDCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9BQl9CICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQUJfQl9SRUQgICAgICAgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0JfR1JFRU4gICAgICAgICAgICAgICAgIDI2OjIxCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9BQl9CX0JMVUUgICAgICAgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQUJfQSAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQUJfQV9SRUQgICAgICAgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0FfR1JFRU4gICAgICAgICAgICAgICAgIDEwOjUKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0FfQkxVRSAgICAgICAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9DRCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEzMAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQ0RfRCAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0RfUkVEICAgICAgICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9DRF9EX0dSRUVOICAgICAgICAgICAgICAgICAyNjoyMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQ0RfRF9CTFVFICAgICAgICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0MgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0NfUkVEICAgICAgICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9DRF9DX0dSRUVOICAgICAgICAgICAgICAgICAxMDo1CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9DRF9DX0JMVUUgICAgICAgICAgICAgICAgICA0OjAKKworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfRUYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMzQKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0YgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9FRl9GX1JFRCAgICAgICAgICAgICAgICAgICAzMToyNworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfRUZfRl9HUkVFTiAgICAgICAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0ZfQkxVRSAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9FRl9FICAgICAgICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9FRl9FX1JFRCAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfRUZfRV9HUkVFTiAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfRUZfRV9CTFVFICAgICAgICAgICAgICAgICAgNDowCisKKy8qIENSVCBHcmFwaGljcyBDb250cm9sICovCisKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfMV9NQVNLICAJCQkgIDMxOjI3CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfMV9NQVNLX0RJU0FCTEUgIAkJCSAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzFfTUFTS19FTkFCTEUgCQkJICAweDFGCisKKy8qIFNNNzUwTEUgZGVmaW5pdGlvbiAqLworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0RQTVMgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzEgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzIgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzMgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DTEsgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjI3CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1BMTDI1ICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1BMTDQxICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1BMTDYyICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1BMTDY1ICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1BMTDc0ICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1BMTDgwICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1BMTDEwOCAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLX1JFU0VSVkVEICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfU0hJRlRfVkdBX0RBQyAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1NISUZUX1ZHQV9EQUNfRElTQUJMRSAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1NISUZUX1ZHQV9EQUNfRU5BQkxFICAgICAgICAgMAorCisKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8yX01BU0sgCQkJICAyNToyNAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzJfTUFTS19FTkFCTEUgCQkJICAzCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfMl9NQVNLX0RJU0FCTEUgCQkJICAwCisKKy8qIFNNNzUwTEUgZGVmaW5pdGlvbiAqLworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NSVFNFTEVDVCAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DUlRTRUxFQ1RfVkdBICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DUlRTRUxFQ1RfQ1JUICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SR0JCSVQgICAgICAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkdCQklUXzI0QklUICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkdCQklUXzEyQklUICAgICAgICAgICAgICAgICAxCisKKworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzNfTUFTSyAJCQkgIDE1OjE1CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfM19NQVNLX0RJU0FCTEUgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfM19NQVNLX0VOQUJMRSAgICAgICAxCisKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF80X01BU0sgCQkJICA5OjkKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF80X01BU0tfRElTQUJMRSAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF80X01BU0tfRU5BQkxFICAgICAgIDEKKworI2lmbmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfU0hJRlRfVkdBX0RBQyAgICAgICAgICAgIDI2OjI2CisgICAgI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1NISUZUX1ZHQV9EQUNfRElTQUJMRSAgICAxCisgICAgI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1NISUZUX1ZHQV9EQUNfRU5BQkxFICAgICAwCisgICAgI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NFTlRFUklORyAgICAgICAgICAgICAgICAyNDoyNAorICAgICNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DRU5URVJJTkdfRElTQUJMRSAgICAgICAgMAorICAgICNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DRU5URVJJTkdfRU5BQkxFICAgICAgICAgMQorI2VuZGlmCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfTE9DS19USU1JTkcgICAgICAgICAgICAgICAgICAyMzoyMworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0xPQ0tfVElNSU5HX0RJU0FCTEUgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0xPQ0tfVElNSU5HX0VOQUJMRSAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0VYUEFOU0lPTiAgICAgICAgICAgICAgICAgICAgMjI6MjIKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9FWFBBTlNJT05fRElTQUJMRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9FWFBBTlNJT05fRU5BQkxFICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9WRVJUSUNBTF9NT0RFICAgICAgICAgICAgICAgIDIxOjIxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfTU9ERV9SRVBMSUNBVEUgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfTU9ERV9JTlRFUlBPTEFURSAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfSE9SSVpPTlRBTF9NT0RFICAgICAgICAgICAgICAyMDoyMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0hPUklaT05UQUxfTU9ERV9SRVBMSUNBVEUgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0hPUklaT05UQUxfTU9ERV9JTlRFUlBPTEFURSAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgMTk6MTgKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfUEFORUwgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfVkdBICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfQ1JUICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9GSUZPICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE2CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRklGT18xICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRklGT18zICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRklGT183ICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRklGT18xMSAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xPQ0tfUEhBU0UgICAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMT0NLX1BIQVNFX0FDVElWRV9ISUdIICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMT0NLX1BIQVNFX0FDVElWRV9MT1cgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1ZTWU5DX1BIQVNFICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9WU1lOQ19QSEFTRV9BQ1RJVkVfSElHSCAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9WU1lOQ19QSEFTRV9BQ1RJVkVfTE9XICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9IU1lOQ19QSEFTRSAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfSFNZTkNfUEhBU0VfQUNUSVZFX0hJR0ggICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfSFNZTkNfUEhBU0VfQUNUSVZFX0xPVyAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQkxBTksgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09GRiAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09OICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1RJTUlORyAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfVElNSU5HX0RJU0FCTEUgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfVElNSU5HX0VOQUJMRSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUElYRUwgICAgICAgICAgICAgICAgICAgICAgICA3OjQKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0dBTU1BX0RJU0FCTEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0dBTU1BX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUExBTkVfRElTQUJMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUExBTkVfRU5BQkxFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAxOjAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9GT1JNQVRfOCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9GT1JNQVRfMTYgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9GT1JNQVRfMzIgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF9CSVRTX01BU0sgICAgICAgICAgIDB4RkYwMDAyMDAKKworI2RlZmluZSBDUlRfRkJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMDQKKyNkZWZpbmUgQ1JUX0ZCX0FERFJFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIENSVF9GQl9BRERSRVNTX1NUQVRVU19DVVJSRU5UICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9GQl9BRERSRVNTX1NUQVRVU19QRU5ESU5HICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9GQl9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBDUlRfRkJfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRkJfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRkJfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIENSVF9GQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIwOAorI2RlZmluZSBDUlRfRkJfV0lEVEhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMjk6MTYKKyNkZWZpbmUgQ1JUX0ZCX1dJRFRIX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjAKKworI2RlZmluZSBDUlRfSE9SSVpPTlRBTF9UT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMEMKKyNkZWZpbmUgQ1JUX0hPUklaT05UQUxfVE9UQUxfVE9UQUwgICAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIENSVF9IT1JJWk9OVEFMX1RPVEFMX0RJU1BMQVlfRU5EICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgQ1JUX0hPUklaT05UQUxfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjEwCisjZGVmaW5lIENSVF9IT1JJWk9OVEFMX1NZTkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAyMzoxNgorI2RlZmluZSBDUlRfSE9SSVpPTlRBTF9TWU5DX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMTE6MAorCisjZGVmaW5lIENSVF9WRVJUSUNBTF9UT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIxNAorI2RlZmluZSBDUlRfVkVSVElDQUxfVE9UQUxfVE9UQUwgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX1RPVEFMX0RJU1BMQVlfRU5EICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBDUlRfVkVSVElDQUxfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMTgKKyNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX1NZTkNfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgIDIxOjE2CisjZGVmaW5lIENSVF9WRVJUSUNBTF9TWU5DX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjFDCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVJfU1RBVFVTICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX0VOQUJMRSAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVJfRU5BQkxFX0RJU0FCTEUgICAgICAgICAwCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVJfRU5BQkxFX0VOQUJMRSAgICAgICAgICAxCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVJfUkVTRVQgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUl9SRVNFVF9OT1JNQUwgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUl9SRVNFVF9SRVNFVCAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUl9TT1VSQ0UgICAgICAgICAgICAgICAgIDE6MAorI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX1NPVVJDRV9SRUQgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX1NPVVJDRV9HUkVFTiAgICAgICAgICAgMQorI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX1NPVVJDRV9CTFVFICAgICAgICAgICAgMgorCisjZGVmaW5lIENSVF9DVVJSRU5UX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIyMAorI2RlZmluZSBDUlRfQ1VSUkVOVF9MSU5FX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIENSVF9NT05JVE9SX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIyNAorI2RlZmluZSBDUlRfTU9OSVRPUl9ERVRFQ1RfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgQ1JUX01PTklUT1JfREVURUNUX1ZBTFVFX0RJU0FCTEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX01PTklUT1JfREVURUNUX1ZBTFVFX0VOQUJMRSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX01PTklUT1JfREVURUNUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIENSVF9NT05JVE9SX0RFVEVDVF9FTkFCTEVfRElTQUJMRSAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9NT05JVE9SX0RFVEVDVF9FTkFCTEVfRU5BQkxFICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9NT05JVE9SX0RFVEVDVF9SRUQgICAgICAgICAgICAgICAgICAgICAgICAyMzoxNgorI2RlZmluZSBDUlRfTU9OSVRPUl9ERVRFQ1RfR1JFRU4gICAgICAgICAgICAgICAgICAgICAgMTU6OAorI2RlZmluZSBDUlRfTU9OSVRPUl9ERVRFQ1RfQkxVRSAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgQ1JUX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjI4CisjZGVmaW5lIENSVF9TQ0FMRV9WRVJUSUNBTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBDUlRfU0NBTEVfVkVSVElDQUxfTU9ERV9FWFBBTkQgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfU0NBTEVfVkVSVElDQUxfTU9ERV9TSFJJTksgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfU0NBTEVfVkVSVElDQUxfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgQ1JUX1NDQUxFX0hPUklaT05UQUxfTU9ERSAgICAgICAgICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIENSVF9TQ0FMRV9IT1JJWk9OVEFMX01PREVfRVhQQU5EICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9TQ0FMRV9IT1JJWk9OVEFMX01PREVfU0hSSU5LICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9TQ0FMRV9IT1JJWk9OVEFMX1NDQUxFICAgICAgICAgICAgICAgICAgICAxMTowCisKKy8qIENSVCBDdXJzb3IgQ29udHJvbCAqLworCisjZGVmaW5lIENSVF9IV0NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIzMAorI2RlZmluZSBDUlRfSFdDX0FERFJFU1NfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgQ1JUX0hXQ19BRERSRVNTX0VOQUJMRV9ESVNBQkxFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0hXQ19BRERSRVNTX0VOQUJMRV9FTkFCTEUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0hXQ19BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIENSVF9IV0NfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9IV0NfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9IV0NfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgQ1JUX0hXQ19MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjM0CisjZGVmaW5lIENSVF9IV0NfTE9DQVRJT05fVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBDUlRfSFdDX0xPQ0FUSU9OX1RPUF9JTlNJREUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfSFdDX0xPQ0FUSU9OX1RPUF9PVVRTSURFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfSFdDX0xPQ0FUSU9OX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgQ1JUX0hXQ19MT0NBVElPTl9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIENSVF9IV0NfTE9DQVRJT05fTEVGVF9JTlNJREUgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9IV0NfTE9DQVRJT05fTEVGVF9PVVRTSURFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9IV0NfTE9DQVRJT05fWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjM4CisjZGVmaW5lIENSVF9IV0NfQ09MT1JfMTJfMl9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBDUlRfSFdDX0NPTE9SXzEyXzFfUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIENSVF9IV0NfQ09MT1JfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIzQworI2RlZmluZSBDUlRfSFdDX0NPTE9SXzNfUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisvKiBPbGQgRGVmaW5pdGlvbnMgKysrLiBOZWVkIHRvIGJlIHJlbW92ZWQgaWYgbm8gYXBwbGljYXRpb24gdXNlIGl0LiAqLworI2lmIDAKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMDEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjM4CisgICAgI2RlZmluZSBDUlRfSFdDX0NPTE9SXzAxXzFfUkVEICAgICAgICAgICAgICAgICAgICAzMToyNworICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8wMV8xX0dSRUVOICAgICAgICAgICAgICAgICAgMjY6MjEKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMDFfMV9CTFVFICAgICAgICAgICAgICAgICAgIDIwOjE2CisgICAgI2RlZmluZSBDUlRfSFdDX0NPTE9SXzAxXzBfUkVEICAgICAgICAgICAgICAgICAgICAxNToxMQorICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8wMV8wX0dSRUVOICAgICAgICAgICAgICAgICAgMTA6NQorICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8wMV8wX0JMVUUgICAgICAgICAgICAgICAgICAgNDowCisKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjNDCisgICAgI2RlZmluZSBDUlRfSFdDX0NPTE9SXzJfUkVEICAgICAgICAgICAgICAgICAgICAgICAxNToxMQorICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8yX0dSRUVOICAgICAgICAgICAgICAgICAgICAgMTA6NQorICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8yX0JMVUUgICAgICAgICAgICAgICAgICAgICAgNDowCisjZW5kaWYKKy8qIE9sZCBEZWZpbml0aW9ucyAtLS0gKi8KKworLyogVGhpcyB2ZXJ0aWNhbCBleHBhbnNpb24gYmVsb3cgc3RhcnQgYXQgMHgwODAyNDAgfiAweDA4MDI2NCAqLworI2RlZmluZSBDUlRfVkVSVElDQUxfRVhQQU5TSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyNDAKKyNpZm5kZWYgVkFMSURBVElPTl9DSElQCisgICAgI2RlZmluZSBDUlRfVkVSVElDQUxfQ0VOVEVSSU5HX1ZBTFVFICAgICAgICAgICAgICAzMToyNAorI2VuZGlmCisjZGVmaW5lIENSVF9WRVJUSUNBTF9FWFBBTlNJT05fQ09NUEFSRV9WQUxVRSAgICAgICAgICAyMzoxNgorI2RlZmluZSBDUlRfVkVSVElDQUxfRVhQQU5TSU9OX0xJTkVfQlVGRkVSICAgICAgICAgICAgMTU6MTIKKyNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX0VYUEFOU0lPTl9TQ0FMRV9GQUNUT1IgICAgICAgICAgIDExOjAKKworLyogVGhpcyBob3Jpem9udGFsIGV4cGFuc2lvbiBiZWxvdyBzdGFydCBhdCAweDA4MDI2OCB+IDB4MDgwMjdDICovCisjZGVmaW5lIENSVF9IT1JJWk9OVEFMX0VYUEFOU0lPTiAgICAgICAgICAgICAgICAgICAgICAweDA4MDI2OAorI2lmbmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIENSVF9IT1JJWk9OVEFMX0NFTlRFUklOR19WQUxVRSAgICAgICAgICAgIDMxOjI0CisjZW5kaWYKKyNkZWZpbmUgQ1JUX0hPUklaT05UQUxfRVhQQU5TSU9OX0NPTVBBUkVfVkFMVUUgICAgICAgIDIzOjE2CisjZGVmaW5lIENSVF9IT1JJWk9OVEFMX0VYUEFOU0lPTl9TQ0FMRV9GQUNUT1IgICAgICAgICAxMTowCisKKyNpZm5kZWYgVkFMSURBVElPTl9DSElQCisgICAgLyogQXV0byBDZW50ZXJpbmcgKi8KKyAgICAjZGVmaW5lIENSVF9BVVRPX0NFTlRFUklOR19UTCAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjgwCisgICAgI2RlZmluZSBDUlRfQVVUT19DRU5URVJJTkdfVExfVE9QICAgICAgICAgICAgICAgICAyNjoxNgorICAgICNkZWZpbmUgQ1JUX0FVVE9fQ0VOVEVSSU5HX1RMX0xFRlQgICAgICAgICAgICAgICAgMTA6MAorCisgICAgI2RlZmluZSBDUlRfQVVUT19DRU5URVJJTkdfQlIgICAgICAgICAgICAgICAgICAgICAweDA4MDI4NAorICAgICNkZWZpbmUgQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSX0JPVFRPTSAgICAgICAgICAgICAgMjY6MTYKKyAgICAjZGVmaW5lIENSVF9BVVRPX0NFTlRFUklOR19CUl9SSUdIVCAgICAgICAgICAgICAgIDEwOjAKKyNlbmRpZgorCisvKiBzbTc1MGxlIG5ldyByZWdpc3RlciB0byBjb250cm9sIHBhbmVsIG91dHB1dCAqLworI2RlZmluZSBESVNQTEFZX0NPTlRST0xfNzUwTEUgCTB4ODAyODgKKy8qIFBhbGV0dGUgUkFNICovCisKKy8qIFBhbmVsIFBhbGxldGUgcmVnaXN0ZXIgc3RhcnRzIGF0IDB4MDgwNDAwIH4gMHgwODA3RkMgKi8KKyNkZWZpbmUgUEFORUxfUEFMRVRURV9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwNDAwCisKKy8qIFBhbmVsIFBhbGxldGUgcmVnaXN0ZXIgc3RhcnRzIGF0IDB4MDgwQzAwIH4gMHgwODBGRkMgKi8KKyNkZWZpbmUgQ1JUX1BBTEVUVEVfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwQzAwCisKKy8qIDJEIHJlZ2lzdGVycworICogbW92ZSB0aGVpciBkZWZpbmF0aW9uIGludG8gZ2VuZXJhbCBseW54X2FjY2VsLmggZmlsZQorICogYmVjYXVzZSBhbGwgc21pIGdyYXBoaWMgY2hpcCBzaGFyZSB0aGUgc2FtZSBkcmF3aW5nIGVuZ2luZQorICogcmVnaXN0ZXIgZm9ybWF0ICovCisjaWYgMAorI2RlZmluZSBERV9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMAorI2RlZmluZSBERV9TT1VSQ0VfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBERV9TT1VSQ0VfV1JBUF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NPVVJDRV9XUkFQX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIHVzZWQgaW4gZGlmZmVyZW50IHNldHRpbmcKKyAqLworCisvKiBVc2UgdGhlc2UgZGVmaW5pdGlvbnMgaW4gWFkgYWRkcmVzc2luZyBtb2RlIG9yIGxpbmVhciBhZGRyZXNzaW5nIG1vZGUuICovCisjZGVmaW5lIERFX1NPVVJDRV9YX0sxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIERFX1NPVVJDRV9ZX0syICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjAKKworLyogVXNlIHRoaXMgZGVmaW5pdGlvbiBpbiBob3N0IHdyaXRlIG1vZGUgZm9yIG1vbm8uIFRoZSBZX0syIGlzIG5vdCB1c2VkCisgICBpbiBob3N0IHdyaXRlIG1vZGUuICovCisjZGVmaW5lIERFX1NPVVJDRV9YX0sxX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOjE2CisKKy8qIFVzZSB0aGVzZSBkZWZpbml0aW9ucyBpbiBCcmVzZW5oYW0gbGluZSBkcmF3aW5nIG1vZGUuICovCisjZGVmaW5lIERFX1NPVVJDRV9YX0sxX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjE2CisjZGVmaW5lIERFX1NPVVJDRV9ZX0syX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjAKKworI2RlZmluZSBERV9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwNAorI2RlZmluZSBERV9ERVNUSU5BVElPTl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBERV9ERVNUSU5BVElPTl9XUkFQX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0RFU1RJTkFUSU9OX1dSQVBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNpZiAxCisgICAgI2RlZmluZSBERV9ERVNUSU5BVElPTl9YICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjE2CisgICAgI2RlZmluZSBERV9ERVNUSU5BVElPTl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjAKKyNlbHNlCisgICAgI2RlZmluZSBERV9ERVNUSU5BVElPTl9YICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OjE2CisgICAgI2RlZmluZSBERV9ERVNUSU5BVElPTl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKyNlbmRpZgorCisjZGVmaW5lIERFX0RJTUVOU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDA4CisjZGVmaW5lIERFX0RJTUVOU0lPTl9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OjE2CisjZGVmaW5lIERFX0RJTUVOU0lPTl9ZX0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBERV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwQworI2RlZmluZSBERV9DT05UUk9MX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBERV9DT05UUk9MX1NUQVRVU19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfU1RBVFVTX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9QQVRURVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgREVfQ09OVFJPTF9QQVRURVJOX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1BBVFRFUk5fQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfVVBEQVRFX0RFU1RJTkFUSU9OX1ggICAgICAgICAgICAgICAgIDI5OjI5CisjZGVmaW5lIERFX0NPTlRST0xfVVBEQVRFX0RFU1RJTkFUSU9OX1hfRElTQUJMRSAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9VUERBVEVfREVTVElOQVRJT05fWF9FTkFCTEUgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1FVSUNLX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBERV9DT05UUk9MX1FVSUNLX1NUQVJUX0RJU0FCTEUgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfUVVJQ0tfU1RBUlRfRU5BQkxFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgREVfQ09OVFJPTF9ESVJFQ1RJT05fTEVGVF9UT19SSUdIVCAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX0RJUkVDVElPTl9SSUdIVF9UT19MRUZUICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfTUFKT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIERFX0NPTlRST0xfTUFKT1JfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9NQUpPUl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWF9QT1NJVElWRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfU1RFUF9YX05FR0FUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1lfUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWV9ORUdBVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfU1RSRVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOjIzCisjZGVmaW5lIERFX0NPTlRST0xfU1RSRVRDSF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TVFJFVENIX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX0hPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjoyMgorI2RlZmluZSBERV9DT05UUk9MX0hPU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfSE9TVF9NT05PICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9MQVNUX1BJWEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE6MjEKKyNkZWZpbmUgREVfQ09OVFJPTF9MQVNUX1BJWEVMX09GRiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX0xBU1RfUElYRUxfT04gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9CSVRCTFQgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1JFQ1RBTkdMRV9GSUxMICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfREVfVElMRSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9UUkFQRVpPSURfRklMTCAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0FMUEhBX0JMRU5EICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfUkxFX1NUUklQICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9TSE9SVF9TVFJPS0UgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0xJTkVfRFJBVyAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfSE9TVF9XUklURSAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9IT1NUX1JFQUQgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0hPU1RfV1JJVEVfQk9UVE9NX1VQICAgICAgICAgMTAKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1JPVEFURSAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0ZPTlQgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1RFWFRVUkVfTE9BRCAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1BfU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1BfU0VMRUNUX1JPUDMgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1JPUF9TRUxFQ1RfUk9QMiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUk9QMl9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OjE0CisjZGVmaW5lIERFX0NPTlRST0xfUk9QMl9TT1VSQ0VfQklUTUFQICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1AyX1NPVVJDRV9QQVRURVJOICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMgorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQV9OT1RfUEFDS0VEICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfTU9OT19EQVRBXzhfUEFDS0VEICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9NT05PX0RBVEFfMTZfUEFDS0VEICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQV8zMl9QQUNLRUQgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERFX0NPTlRST0xfUkVQRUFUX1JPVEFURSAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIERFX0NPTlRST0xfUkVQRUFUX1JPVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9SRVBFQVRfUk9UQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9NQVRDSCAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9NQVRDSF9PUEFRVUUgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX01BVENIX1RSQU5TUEFSRU5UICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfU0VMRUNUICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX1NFTEVDVF9TT1VSQ0UgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfU0VMRUNUX0RFU1RJTkFUSU9OICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWSAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfRElTQUJMRSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9FTkFCTEUgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisvKiBQc2V1ZG8gZmllbGRzLiAqLworCisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUiAgICAgICAgICAgICAgICAgICAgIDI3OjI0CisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8yMjUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzEzNSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMzE1ICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl80NSAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzI3MCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfOTAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8xODAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjQKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1JPVEFUSU9OXzI3MCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUk9UQVRJT05fOTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTl8xODAgICAgICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIERFX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDEwCisjZGVmaW5lIERFX1BJVENIX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OjE2CisjZGVmaW5lIERFX1BJVENIX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjAKKworI2RlZmluZSBERV9GT1JFR1JPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAxNAorI2RlZmluZSBERV9GT1JFR1JPVU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTowCisKKyNkZWZpbmUgREVfQkFDS0dST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMTgKKyNkZWZpbmUgREVfQkFDS0dST1VORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MAorCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFDCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWFkgICAgICAgICAgICAgICAgICAgIDMwOjMwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWFlfTk9STUFMICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUEFUVEVSTl9YWV9PVkVSV1JJVEUgICAgICAgICAgMQorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1kgICAgICAgICAgICAgICAgICAgICAyOToyNworI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1ggICAgICAgICAgICAgICAgICAgICAyNToyMworI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVQgICAgICAgICAgICAgICAgICAyMToyMAorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVRfOCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BJWEVMX0ZPUk1BVF8xNiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUElYRUxfRk9STUFUXzMyICAgICAgICAgICAgICAgMgorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HICAgICAgICAgICAgICAgICAgICAxOToxNgorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HX1hZICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX0FERFJFU1NJTkdfTElORUFSICAgICAgICAgICAgIDE1CisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1NPVVJDRV9IRUlHSFQgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBERV9DT0xPUl9DT01QQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAyMAorI2RlZmluZSBERV9DT0xPUl9DT01QQVJFX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAyMzowCisKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMjQKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRV9NQVNLX01BU0tTICAgICAgICAgICAgICAgICAgICAgMjM6MAorCisjZGVmaW5lIERFX01BU0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDI4CisjZGVmaW5lIERFX01BU0tTX0JZVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIERFX01BU0tTX0JJVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBERV9DTElQX1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAyQworI2RlZmluZSBERV9DTElQX1RMX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBERV9DTElQX1RMX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBERV9DTElQX1RMX1NUQVRVU19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NMSVBfVExfU1RBVFVTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ0xJUF9UTF9JTkhJQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgREVfQ0xJUF9UTF9JTkhJQklUX09VVFNJREUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DTElQX1RMX0lOSElCSVRfSU5TSURFICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NMSVBfVExfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBERV9DTElQX0JSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAzMAorI2RlZmluZSBERV9DTElQX0JSX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBERV9DTElQX0JSX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjowCisKKyNkZWZpbmUgREVfTU9OT19QQVRURVJOX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMzQKKyNkZWZpbmUgREVfTU9OT19QQVRURVJOX0xPV19QQVRURVJOICAgICAgICAgICAgICAgICAgICAgMzE6MAorCisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDM4CisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9ISUdIX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgIDMxOjAKKworI2RlZmluZSBERV9XSU5ET1dfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAzQworI2RlZmluZSBERV9XSU5ET1dfV0lEVEhfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAyODoxNgorI2RlZmluZSBERV9XSU5ET1dfV0lEVEhfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAxMjowCisKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwNDAKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9DUyAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9DU18wICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0NTXzEgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwNDQKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfRVhUICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfRVhUX0xPQ0FMICAgICAgICAgICAgMAorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9FWFRfRVhURVJOQUwgICAgICAgICAxCisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTXzAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfQ1NfMSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9BRERSRVNTICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgREVfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwNDgKKyNkZWZpbmUgREVfQUxQSEFfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgREVfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwNEMKKyNkZWZpbmUgREVfV1JBUF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgREVfV1JBUF9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIERFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDUwCisjZGVmaW5lIERFX1NUQVRVU19DU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBERV9TVEFUVVNfQ1NDX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRVU19DU0NfTk9UX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RBVFVTX0NTQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9TVEFUVVNfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgREVfU1RBVFVTXzJEX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFUVVNfMkRfTk9UX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRVU18yRF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorLyogQ29sb3IgU3BhY2UgQ29udmVyc2lvbiByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwQzgKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX0JBU0VfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX0JBU0VfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfWV9TT1VSQ0VfQkFTRV9FWFRfRVhURVJOQUwgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19ZX1NPVVJDRV9CQVNFX0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIENTQ19ZX1NPVVJDRV9CQVNFX0NTXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX0JBU0VfQ1NfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfWV9TT1VSQ0VfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgQ1NDX0NPTlNUQU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwQ0MKKyNkZWZpbmUgQ1NDX0NPTlNUQU5UU19ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MjQKKyNkZWZpbmUgQ1NDX0NPTlNUQU5UU19SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MTYKKyNkZWZpbmUgQ1NDX0NPTlNUQU5UU19HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6OAorI2RlZmluZSBDU0NfQ09OU1RBTlRTX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBDU0NfWV9TT1VSQ0VfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBEMAorI2RlZmluZSBDU0NfWV9TT1VSQ0VfWF9JTlRFR0VSICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBDU0NfWV9TT1VSQ0VfWF9GUkFDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAxNTozCisKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRDQKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX1lfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX1lfRlJBQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgMTU6MworCisjZGVmaW5lIENTQ19VX1NPVVJDRV9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMEQ4CisjZGVmaW5lIENTQ19VX1NPVVJDRV9CQVNFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIENTQ19VX1NPVVJDRV9CQVNFX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX1VfU09VUkNFX0JBU0VfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfVV9TT1VSQ0VfQkFTRV9DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBDU0NfVV9TT1VSQ0VfQkFTRV9DU18wICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19VX1NPVVJDRV9CQVNFX0NTXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX1VfU09VUkNFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIENTQ19WX1NPVVJDRV9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMERDCisjZGVmaW5lIENTQ19WX1NPVVJDRV9CQVNFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIENTQ19WX1NPVVJDRV9CQVNFX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX1ZfU09VUkNFX0JBU0VfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfVl9TT1VSQ0VfQkFTRV9DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBDU0NfVl9TT1VSQ0VfQkFTRV9DU18wICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19WX1NPVVJDRV9CQVNFX0NTXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX1ZfU09VUkNFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIENTQ19TT1VSQ0VfRElNRU5TSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMEUwCisjZGVmaW5lIENTQ19TT1VSQ0VfRElNRU5TSU9OX1ggICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIENTQ19TT1VSQ0VfRElNRU5TSU9OX1kgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBDU0NfU09VUkNFX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBFNAorI2RlZmluZSBDU0NfU09VUkNFX1BJVENIX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBDU0NfU09VUkNFX1BJVENIX1VWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRTgKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX1dSQVBfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfREVTVElOQVRJT05fV1JBUF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBDU0NfREVTVElOQVRJT05fRElNRU5TSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBFQworI2RlZmluZSBDU0NfREVTVElOQVRJT05fRElNRU5TSU9OX1ggICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBDU0NfREVTVElOQVRJT05fRElNRU5TSU9OX1kgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRjAKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX1BJVENIX1ggICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX1BJVENIX1kgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIENTQ19TQ0FMRV9GQUNUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMEY0CisjZGVmaW5lIENTQ19TQ0FMRV9GQUNUT1JfSE9SSVpPTlRBTCAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIENTQ19TQ0FMRV9GQUNUT1JfVkVSVElDQUwgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBDU0NfREVTVElOQVRJT05fQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBGOAorI2RlZmluZSBDU0NfREVTVElOQVRJT05fQkFTRV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBDU0NfREVTVElOQVRJT05fQkFTRV9FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9CQVNFX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0JBU0VfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0JBU0VfQ1NfMCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfREVTVElOQVRJT05fQkFTRV9DU18xICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBDU0NfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBGQworI2RlZmluZSBDU0NfQ09OVFJPTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBDU0NfQ09OVFJPTF9TVEFUVVNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19DT05UUk9MX1NUQVRVU19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgMzA6MjgKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVF9ZVVY0MjIgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX1lVVjQyMEkgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfWVVWNDIwICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVF9ZVlU5ICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX0lZVTEgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfSVlVMiAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVF9SR0I1NjUgICAgICAgICAgICAgICAgNgorI2RlZmluZSBDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX1JHQjg4ODggICAgICAgICAgICAgICA3CisjZGVmaW5lIENTQ19DT05UUk9MX0RFU1RJTkFUSU9OX0ZPUk1BVCAgICAgICAgICAgICAgICAgIDI3OjI2CisjZGVmaW5lIENTQ19DT05UUk9MX0RFU1RJTkFUSU9OX0ZPUk1BVF9SR0I1NjUgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX0NPTlRST0xfREVTVElOQVRJT05fRk9STUFUX1JHQjg4ODggICAgICAgICAgMQorI2RlZmluZSBDU0NfQ09OVFJPTF9IT1JJWk9OVEFMX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBDU0NfQ09OVFJPTF9IT1JJWk9OVEFMX0ZJTFRFUl9ESVNBQkxFICAgICAgICAgICAwCisjZGVmaW5lIENTQ19DT05UUk9MX0hPUklaT05UQUxfRklMVEVSX0VOQUJMRSAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX0NPTlRST0xfVkVSVElDQUxfRklMVEVSICAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgQ1NDX0NPTlRST0xfVkVSVElDQUxfRklMVEVSX0RJU0FCTEUgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfQ09OVFJPTF9WRVJUSUNBTF9GSUxURVJfRU5BQkxFICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19DT05UUk9MX0JZVEVfT1JERVIgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOjIzCisjZGVmaW5lIENTQ19DT05UUk9MX0JZVEVfT1JERVJfWVVZViAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX0NPTlRST0xfQllURV9PUkRFUl9VWVZZICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIERFX0RBVEFfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMDAwCisKKyNkZWZpbmUgSTJDX0JZVEVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDAKKyNkZWZpbmUgSTJDX0JZVEVfQ09VTlRfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzowCisKKyNkZWZpbmUgSTJDX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDEKKyNkZWZpbmUgSTJDX0NUUkxfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIEkyQ19DVFJMX0lOVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX0NUUkxfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJMkNfQ1RSTF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgSTJDX0NUUkxfRElSX1dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfQ1RSTF9ESVJfUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEkyQ19DVFJMX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBJMkNfQ1RSTF9DVFJMX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEkyQ19DVFJMX0NUUkxfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSTJDX0NUUkxfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIEkyQ19DVFJMX01PREVfU1RBTkRBUkQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX0NUUkxfTU9ERV9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJMkNfQ1RSTF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgSTJDX0NUUkxfRU5fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfQ1RSTF9FTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgSTJDX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDIKKyNkZWZpbmUgSTJDX1NUQVRVU19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIEkyQ19TVEFUVVNfVFhfUFJPR1JFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX1NUQVRVU19UWF9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJMkNfVFhfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEkyQ19TVEFUVVNfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBJMkNfU1RBVFVTX0VSUl9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEkyQ19TVEFUVVNfRVJSX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSTJDX1NUQVRVU19FUlJfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfU1RBVFVTX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgSTJDX1NUQVRVU19BQ0tfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfU1RBVFVTX0FDS19OT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEkyQ19TVEFUVVNfQlNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBJMkNfU1RBVFVTX0JTWV9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEkyQ19TVEFUVVNfQlNZX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBJMkNfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDA0MgorI2RlZmluZSBJMkNfUkVTRVRfQlVTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgSTJDX1JFU0VUX0JVU19FUlJPUl9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIEkyQ19TTEFWRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQzCisjZGVmaW5lIEkyQ19TTEFWRV9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDc6MQorI2RlZmluZSBJMkNfU0xBVkVfQUREUkVTU19SVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgSTJDX1NMQVZFX0FERFJFU1NfUldfVyAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfU0xBVkVfQUREUkVTU19SV19SICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgSTJDX0RBVEEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDQKKyNkZWZpbmUgSTJDX0RBVEExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDUKKyNkZWZpbmUgSTJDX0RBVEEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDYKKyNkZWZpbmUgSTJDX0RBVEEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDcKKyNkZWZpbmUgSTJDX0RBVEE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDgKKyNkZWZpbmUgSTJDX0RBVEE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDkKKyNkZWZpbmUgSTJDX0RBVEE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNEEKKyNkZWZpbmUgSTJDX0RBVEE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNEIKKyNkZWZpbmUgSTJDX0RBVEE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNEMKKyNkZWZpbmUgSTJDX0RBVEE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNEQKKyNkZWZpbmUgSTJDX0RBVEExMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNEUKKyNkZWZpbmUgSTJDX0RBVEExMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNEYKKyNkZWZpbmUgSTJDX0RBVEExMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNTAKKyNkZWZpbmUgSTJDX0RBVEExMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNTEKKyNkZWZpbmUgSTJDX0RBVEExNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNTIKKyNkZWZpbmUgSTJDX0RBVEExNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNTMKKworCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMDAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfRklFTERfSU5QVVQgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfRklFTERfSU5QVVRfRVZFTl9GSUVMRCAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9GSUVMRF9JTlBVVF9PRERfRklFTEQgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1NDQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1NDQU5fUFJPR1JFU1NJVkUgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfU0NBTl9JTlRFUkxBQ0UgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DVVJSRU5UX0JVRkZFUiAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DVVJSRU5UX0JVRkZFUl8wICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0NVUlJFTlRfQlVGRkVSXzEgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVkVSVElDQUxfU1lOQyAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVkVSVElDQUxfU1lOQ19JTkFDVElWRSAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9WRVJUSUNBTF9TWU5DX0FDVElWRSAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0FESiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOToxOQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0FESl9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQURKX0RFTEFZICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9IQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9IQV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0hBX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVlNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVlNLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9WU0tfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0hTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0hTS19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfSFNLX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9GRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9GRF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0ZEX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OjE0CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVlBfSElHSCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9WUF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0hQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0hQX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfSFBfTE9XICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DUF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0NQX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVVZTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVVZTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9VVlNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0JTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQlNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ1NfMTYgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DU184ICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0NGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DRl9ZVVYgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0NGX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0ZTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfRlNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9XRUFWRSAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfV0VBVkVfRElTQUJMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9XRUFWRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0JPQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9CT0JfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0JPQl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0RCX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfREJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ0NfQ09OVElOVUUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DQ19DT05ESVRJT04gICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9SR0JfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1JHQl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfNjU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMXzY1Nl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfNjU2X0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ0FQX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DQVBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NMSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMDA0CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NMSVBfWUNMSVBfRVZFTl9GSUVMRCAgICAgICAgICAgICAgICAyNToxNgorI2RlZmluZSBaVjBfQ0FQVFVSRV9DTElQX1lDTElQICAgICAgICAgICAgICAgICAgICAgICAgICAyNToxNgorI2RlZmluZSBaVjBfQ0FQVFVSRV9DTElQX1hDTElQICAgICAgICAgICAgICAgICAgICAgICAgICA5OjAKKworI2RlZmluZSBaVjBfQ0FQVFVSRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAwOAorI2RlZmluZSBaVjBfQ0FQVFVSRV9TSVpFX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBaVjBfQ0FQVFVSRV9TSVpFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwMEMKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTX1NUQVRVU19DVVJSRU5UICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYwX0FERFJFU1NfU1RBVFVTX1BFTkRJTkcgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYwX0FERFJFU1NfQ1MgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYwX0FERFJFU1NfQ1NfMCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTU19DU18xICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMDEwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTU19TVEFUVVMgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTU19TVEFUVVNfQ1VSUkVOVCAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMV9BRERSRVNTX1NUQVRVU19QRU5ESU5HICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMV9BRERSRVNTX0NTICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMV9BRERSRVNTX0NTXzAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1NfQ1NfMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUZfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAxNAorI2lmbmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRl9PRkZTRVRfWUNMSVBfT0REX0ZJRUxEICAgICAgMjU6MTYKKyNlbmRpZgorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUZfT0ZGU0VUX09GRlNFVCAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgWlYwX0NBUFRVUkVfRklGT19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwMTgKKyNkZWZpbmUgWlYwX0NBUFRVUkVfRklGT19DVFJMX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgMjowCisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fMSAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT18yICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzMgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWlYwX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fNCAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaVjBfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT181ICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzYgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fNyAgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIFpWMF9DQVBUVVJFX1lSR0JfQ09OU1QgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMDFDCisjZGVmaW5lIFpWMF9DQVBUVVJFX1lSR0JfQ09OU1RfWSAgICAgICAgICAgICAgICAgICAgICAgIDMxOjI0CisjZGVmaW5lIFpWMF9DQVBUVVJFX1lSR0JfQ09OU1RfUiAgICAgICAgICAgICAgICAgICAgICAgIDIzOjE2CisjZGVmaW5lIFpWMF9DQVBUVVJFX1lSR0JfQ09OU1RfRyAgICAgICAgICAgICAgICAgICAgICAgIDE1OjgKKyNkZWZpbmUgWlYwX0NBUFRVUkVfWVJHQl9DT05TVF9CICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgWlYwX0NBUFRVUkVfTElORV9DT01QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwMjAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfTElORV9DT01QX0xDICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisvKiBaVjEgKi8KKworI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5ODAwMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0ZJRUxEX0lOUFVUICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0ZJRUxEX0lOUFVUX0VWRU5fRklFTEQgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfRklFTERfSU5QVVRfT0REX0ZJRUxEICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9TQ0FOX1BST0dSRVNTSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1NDQU5fSU5URVJMQUNFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ1VSUkVOVF9CVUZGRVIgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ1VSUkVOVF9CVUZGRVJfMCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DVVJSRU5UX0JVRkZFUl8xICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1ZFUlRJQ0FMX1NZTkMgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1ZFUlRJQ0FMX1NZTkNfSU5BQ1RJVkUgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfVkVSVElDQUxfU1lOQ19BQ1RJVkUgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9QQU5FTCAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9QQU5FTF9ESVNBQkxFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1BBTkVMX0VOQUJMRSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQURKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OjE5CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQURKX05PUk1BTCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9BREpfREVMQVkgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0hBX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfSEFfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WU0tfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1ZTS19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfSFNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfSFNLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9IU0tfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0ZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0ZEX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfRkRfRkFMTElORyAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ6MTQKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WUF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1ZQX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfSFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEzCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfSFBfSElHSCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9IUF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjoxMgorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NQX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ1BfTE9XICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9VVlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9VVlNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1VWU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQlNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9CU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DU18xNiAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NTXzggICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NGX1lVViAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ0ZfUkdCICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9GUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzo3CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfRlNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9GU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1dFQVZFICAgICAgICAgICAgICAgICAgICAgICAgICA2OjYKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9XRUFWRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1dFQVZFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQk9CICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0JPQl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQk9CX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfREJfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9EQl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DQ19DT05USU5VRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NDX0NPTkRJVElPTiAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1JHQl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfUkdCX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF82NTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfNjU2X0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF82NTZfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DQVBfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NBUF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ0xJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTgwMDQKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ0xJUF9ZQ0xJUCAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MTYKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ0xJUF9YQ0xJUCAgICAgICAgICAgICAgICAgICAgICAgICAgOTowCisKKyNkZWZpbmUgWlYxX0NBUFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTgwMDgKKyNkZWZpbmUgWlYxX0NBUFRVUkVfU0laRV9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgWlYxX0NBUFRVUkVfU0laRV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDk4MDBDCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTU19TVEFUVVMgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTU19TVEFUVVNfQ1VSUkVOVCAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMF9BRERSRVNTX1NUQVRVU19QRU5ESU5HICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMF9BRERSRVNTX0NTICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMF9BRERSRVNTX0NTXzAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1NfQ1NfMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDA5ODAxMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1NfU1RBVFVTX0NVUlJFTlQgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjFfQUREUkVTU19TVEFUVVNfUEVORElORyAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjFfQUREUkVTU19DUyAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjFfQUREUkVTU19DU18wICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTX0NTXzEgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTgwMTQKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGX09GRlNFVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIFpWMV9DQVBUVVJFX0ZJRk9fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDk4MDE4CisjZGVmaW5lIFpWMV9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPICAgICAgICAgICAgICAgICAgICAgIDI6MAorI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT18wICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzEgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fMiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT18zICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpWMV9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzQgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWlYxX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fNSAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT182ICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpWMV9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzcgICAgICAgICAgICAgICAgICAgIDcKKworI2RlZmluZSBaVjFfQ0FQVFVSRV9ZUkdCX0NPTlNUICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5ODAxQworI2RlZmluZSBaVjFfQ0FQVFVSRV9ZUkdCX0NPTlNUX1kgICAgICAgICAgICAgICAgICAgICAgICAzMToyNAorI2RlZmluZSBaVjFfQ0FQVFVSRV9ZUkdCX0NPTlNUX1IgICAgICAgICAgICAgICAgICAgICAgICAyMzoxNgorI2RlZmluZSBaVjFfQ0FQVFVSRV9ZUkdCX0NPTlNUX0cgICAgICAgICAgICAgICAgICAgICAgICAxNTo4CisjZGVmaW5lIFpWMV9DQVBUVVJFX1lSR0JfQ09OU1RfQiAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIERNQV8xX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQwMDEwCisjZGVmaW5lIERNQV8xX1NPVVJDRV9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIERNQV8xX1NPVVJDRV9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRE1BXzFfU09VUkNFX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgMQorI2RlZmluZSBETUFfMV9TT1VSQ0VfQUREUkVTU19DUyAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBETUFfMV9TT1VSQ0VfQUREUkVTU19DU18wICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV8xX1NPVVJDRV9BRERSRVNTX0NTXzEgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRE1BXzFfU09VUkNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIERNQV8xX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQwMDE0CisjZGVmaW5lIERNQV8xX0RFU1RJTkFUSU9OX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIERNQV8xX0RFU1RJTkFUSU9OX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgIDAKKyNkZWZpbmUgRE1BXzFfREVTVElOQVRJT05fQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgMQorI2RlZmluZSBETUFfMV9ERVNUSU5BVElPTl9BRERSRVNTX0NTICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBETUFfMV9ERVNUSU5BVElPTl9BRERSRVNTX0NTXzAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV8xX0RFU1RJTkFUSU9OX0FERFJFU1NfQ1NfMSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRE1BXzFfREVTVElOQVRJT05fQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIERNQV8xX1NJWkVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQwMDE4CisjZGVmaW5lIERNQV8xX1NJWkVfQ09OVFJPTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIERNQV8xX1NJWkVfQ09OVFJPTF9TVEFUVVNfSURMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRE1BXzFfU0laRV9DT05UUk9MX1NUQVRVU19BQ1RJVkUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBETUFfMV9TSVpFX0NPTlRST0xfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAyMzowCisKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDAwMjAKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9BQk9SVF8xICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfQUJPUlRfMV9FTkFCTEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9BQk9SVF8xX0FCT1JUICAgICAgICAgICAgICAgMQorI2RlZmluZSBETUFfQUJPUlRfSU5URVJSVVBUX0FCT1JUXzAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9BQk9SVF8wX0VOQUJMRSAgICAgICAgICAgICAgMAorI2RlZmluZSBETUFfQUJPUlRfSU5URVJSVVBUX0FCT1JUXzBfQUJPUlQgICAgICAgICAgICAgICAxCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfSU5UXzEgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBETUFfQUJPUlRfSU5URVJSVVBUX0lOVF8xX0NMRUFSICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfSU5UXzFfRklOSVNIRUQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9JTlRfMCAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfSU5UXzBfQ0xFQVIgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9JTlRfMF9GSU5JU0hFRCAgICAgICAgICAgICAgMQorCisKKworCisKKy8qIERlZmF1bHQgaTJjIENMSyBhbmQgRGF0YSBHUElPLiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgaTJjIHBpbnMgKi8KKyNkZWZpbmUgREVGQVVMVF9JMkNfU0NMICAgICAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9JMkNfU0RBICAgICAgICAgICAgICAgICAgICAgMzEKKworCisjZGVmaW5lIEdQSU9fREFUQV9TTTc1MExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDE4CisjZGVmaW5lIEdQSU9fREFUQV9TTTc1MExFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBHUElPX0RBVEFfU003NTBMRV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEUgICAgICAgICAgICAgICAgICAgICAweDAyMDAxQworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEVfMSAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl9TTTc1MExFXzFfSU5QVVQgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEVfMV9PVVRQVVQgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fU003NTBMRV8wICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEVfMF9JTlBVVCAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fU003NTBMRV8wX09VVFBVVCAgICAgICAgICAgIDEKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDIyNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5jCkBAIC0wLDAgKzEsNDI1IEBACisjZGVmaW5lIFVTRV9EVklDSElQCisjaWZkZWYgVVNFX0RWSUNISVAKKworI2luY2x1ZGUgImRkazc1MF9zaWkxNjQuaCIKKyNpbmNsdWRlICJkZGs3NTBfaHdpMmMuaCIKKworLyogSTJDIEFkZHJlc3Mgb2YgZWFjaCBTSUkxNjQgY2hpcCAqLworI2RlZmluZSBTSUkxNjRfSTJDX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDcwCisKKy8qIERlZmluZSB0aGlzIGRlZmluaXRpb24gdG8gdXNlIGhhcmR3YXJlIGkyYy4gKi8KKyNkZWZpbmUgVVNFX0hXX0kyQworCisjaWZkZWYgVVNFX0hXX0kyQworICAgICNkZWZpbmUgaTJjV3JpdGVSZWcgaHdJMkNXcml0ZVJlZworICAgICNkZWZpbmUgaTJjUmVhZFJlZyAgaHdJMkNSZWFkUmVnCisjZWxzZQorICAgICNkZWZpbmUgaTJjV3JpdGVSZWcgc3dJMkNXcml0ZVJlZworICAgICNkZWZpbmUgaTJjUmVhZFJlZyAgc3dJMkNSZWFkUmVnCisjZW5kaWYKKworLyogU0lJMTY0IFZlbmRvciBhbmQgRGV2aWNlIElEICovCisjZGVmaW5lIFNJSTE2NF9WRU5ET1JfSUQgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTSUkxNjRfREVWSUNFX0lEICAgICAgICAgICAgICAgICAgICAweDAwMDYKKworI2lmZGVmIFNJSTE2NF9GVUxMX0ZVTkNUSU9OUworLyogTmFtZSBvZiB0aGUgRFZJIENvbnRyb2xsZXIgY2hpcCAqLworc3RhdGljIGNoYXIgKmdEdmlDdHJsQ2hpcE5hbWUgPSAiU2lsaWNvbiBJbWFnZSBTaUkgMTY0IjsKKyNlbmRpZgorCisvKgorICogIHNpaTE2NEdldFZlbmRvcklECisgKiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgdmVuZG9yIElEIG9mIHRoZSBEVkkgY29udHJvbGxlciBjaGlwLgorICoKKyAqICBPdXRwdXQ6CisgKiAgICAgIFZlbmRvciBJRAorICovCit1bnNpZ25lZCBzaG9ydCBzaWkxNjRHZXRWZW5kb3JJRCh2b2lkKQoreworICAgIHVuc2lnbmVkIHNob3J0IHZlbmRvcklEOworCisgICAgdmVuZG9ySUQgPSAoKHVuc2lnbmVkIHNob3J0KSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X1ZFTkRPUl9JRF9ISUdIKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0KSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X1ZFTkRPUl9JRF9MT1cpOworCisgICAgcmV0dXJuIHZlbmRvcklEOworfQorCisvKgorICogIHNpaTE2NEdldERldmljZUlECisgKiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZGV2aWNlIElEIG9mIHRoZSBEVkkgY29udHJvbGxlciBjaGlwLgorICoKKyAqICBPdXRwdXQ6CisgKiAgICAgIERldmljZSBJRAorICovCit1bnNpZ25lZCBzaG9ydCBzaWkxNjRHZXREZXZpY2VJRCh2b2lkKQoreworICAgIHVuc2lnbmVkIHNob3J0IGRldmljZUlEOworCisgICAgZGV2aWNlSUQgPSAoKHVuc2lnbmVkIHNob3J0KSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0RFVklDRV9JRF9ISUdIKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0KSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0RFVklDRV9JRF9MT1cpOworCisgICAgcmV0dXJuIGRldmljZUlEOworfQorCisKKworLyogRFZJLkMgd2lsbCBoYW5kbGUgYWxsIFNpSTE2NCBjaGlwIHN0dWZmcyBhbmQgdHJ5IGl0IGJlc3QgdG8gbWFrZSBjb2RlIG1pbmltYWwgYW5kIHVzZWZ1bCAqLworCisvKgorICogIHNpaTE2NEluaXRDaGlwCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBhbmQgZGV0ZWN0IHRoZSBEVkkgY29udHJvbGxlciBjaGlwLgorICoKKyAqICBJbnB1dDoKKyAqICAgICAgZWRnZVNlbGVjdCAgICAgICAgICAtIEVkZ2UgU2VsZWN0OgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gSW5wdXQgZGF0YSBpcyBmYWxsaW5nIGVkZ2UgbGF0Y2hlZCAoZmFsbGluZyBlZGdlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaGVkIGZpcnN0IGluIGR1YWwgZWRnZSBtb2RlKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gSW5wdXQgZGF0YSBpcyByaXNpbmcgZWRnZSBsYXRjaGVkIChyaXNpbmcgZWRnZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2hlZCBmaXJzdCBpbiBkdWFsIGVkZ2UgbW9kZSkKKyAqICAgICAgYnVzU2VsZWN0ICAgICAgICAgICAtIElucHV0IEJ1cyBTZWxlY3Q6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBJbnB1dCBkYXRhIGJ1cyBpcyAxMi1iaXRzIHdpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IElucHV0IGRhdGEgYnVzIGlzIDI0LWJpdHMgd2lkZQorICogICAgICBkdWFsRWRnZUNsa1NlbGVjdCAgIC0gRHVhbCBFZGdlIENsb2NrIFNlbGVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gSW5wdXQgZGF0YSBpcyBzaW5nbGUgZWRnZSBsYXRjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBJbnB1dCBkYXRhIGlzIGR1YWwgZWRnZSBsYXRjaGVkCisgKiAgICAgIGhzeW5jRW5hYmxlICAgICAgICAgLSBIb3Jpem9udGFsIFN5bmMgRW5hYmxlOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gSFNZTkMgaW5wdXQgaXMgdHJhbnNtaXR0ZWQgYXMgZml4ZWQgTE9XCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBIU1lOQyBpbnB1dCBpcyB0cmFuc21pdHRlZCBhcyBpcworICogICAgICB2c3luY0VuYWJsZSAgICAgICAgIC0gVmVydGljYWwgU3luYyBFbmFibGU6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBWU1lOQyBpbnB1dCBpcyB0cmFuc21pdHRlZCBhcyBmaXhlZCBMT1cKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IFZTWU5DIGlucHV0IGlzIHRyYW5zbWl0dGVkIGFzIGlzCisgKiAgICAgIGRlc2tld0VuYWJsZSAgICAgICAgLSBEZS1za2V3aW5nIEVuYWJsZToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IERlLXNrZXcgZGlzYWJsZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IERlLXNrZXcgZW5hYmxlZAorICogICAgICBkZXNrZXdTZXR0aW5nICAgICAgIC0gRGUtc2tld2luZyBTZXR0aW5nIChpbmNyZW1lbnQgb2YgMjYwcHNlYykKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IDEgc3RlcCAtLT4gbWluaW11bSBzZXR1cCAvIG1heGltdW0gaG9sZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gMiBzdGVwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSAzIHN0ZXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IDQgc3RlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID0gNSBzdGVwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgPSA2IHN0ZXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiA9IDcgc3RlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ID0gOCBzdGVwIC0tPiBtYXhpbXVtIHNldHVwIC8gbWluaW11bSBob2xkCisgKiAgICAgIGNvbnRpbnVvdXNTeW5jRW5hYmxlLSBTWU5DIENvbnRpbnVvdXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBEaXNhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBFbmFibGUKKyAqICAgICAgcGxsRmlsdGVyRW5hYmxlICAgICAtIFBMTCBGaWx0ZXIgRW5hYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBEaXNhYmxlIFBMTCBGaWx0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IEVuYWJsZSBQTEwgRmlsdGVyCisgKiAgICAgIHBsbEZpbHRlclZhbHVlICAgICAgLSBQTEwgRmlsdGVyIGNoYXJhY3RlcmlzdGljczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH43IChyZWNvbW1lbmRlZCB2YWx1ZSBpcyA0KQorICoKKyAqICBPdXRwdXQ6CisgKiAgICAgIDAgICAtIFN1Y2Nlc3MKKyAqICAgICAtMSAgIC0gRmFpbC4KKyAqLworbG9uZyBzaWkxNjRJbml0Q2hpcCgKKyAgICB1bnNpZ25lZCBjaGFyIGVkZ2VTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBidXNTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBkdWFsRWRnZUNsa1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGhzeW5jRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgdnN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdTZXR0aW5nLAorICAgIHVuc2lnbmVkIGNoYXIgY29udGludW91c1N5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJWYWx1ZQorKQoreworICAgIC8vdW5zaWduZWQgY2hhciB1Y1JlZ0luZGV4LCB1Y1JlZ1ZhbHVlOworICAgIC8vdW5zaWduZWQgY2hhciB1Y0RldmljZUFkZHJlc3MsCisJdW5zaWduZWQgY2hhciBjb25maWc7CisgICAgLy91bnNpZ25lZCBsb25nIGRlbGF5Q291bnQ7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBpMmMgYnVzICovCisjaWZkZWYgVVNFX0hXX0kyQworICAgIC8qIFVzZSBmYXN0IG1vZGUuICovCisgICAgaHdJMkNJbml0KDEpOworI2Vsc2UKKyAgICBzd0kyQ0luaXQoREVGQVVMVF9JMkNfU0NMLCBERUZBVUxUX0kyQ19TREEpOworI2VuZGlmCisKKyAgICAvKiBDaGVjayBpZiBTSUkxNjQgQ2hpcCBleGlzdHMgKi8KKyAgICBpZiAoKHNpaTE2NEdldFZlbmRvcklEKCkgPT0gU0lJMTY0X1ZFTkRPUl9JRCkgJiYgKHNpaTE2NEdldERldmljZUlEKCkgPT0gU0lJMTY0X0RFVklDRV9JRCkpCisgICAgeworCisjaWZkZWYgRERLREVCVUcKKyAgICAgICAgLy9zaWkxNjRQcmludFJlZ2lzdGVyVmFsdWVzKCk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogIEluaXRpYWxpemUgU0lJMTY0IGNvbnRyb2xsZXIgY2hpcC4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogU2VsZWN0IHRoZSBlZGdlICovCisgICAgICAgIGlmIChlZGdlU2VsZWN0ID09IDApCisgICAgICAgICAgICBjb25maWcgPSBTSUkxNjRfQ09ORklHVVJBVElPTl9MQVRDSF9GQUxMSU5HOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb25maWcgPSBTSUkxNjRfQ09ORklHVVJBVElPTl9MQVRDSF9SSVNJTkc7CisKKyAgICAgICAgLyogU2VsZWN0IGJ1cyB3aWRlICovCisgICAgICAgIGlmIChidXNTZWxlY3QgPT0gMCkKKyAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfQ09ORklHVVJBVElPTl9CVVNfMTJCSVRTOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fQlVTXzI0QklUUzsKKworICAgICAgICAvKiBTZWxlY3QgRHVhbC9TaW5nbGUgRWRnZSBDbG9jayAqLworICAgICAgICBpZiAoZHVhbEVkZ2VDbGtTZWxlY3QgPT0gMCkKKyAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfQ09ORklHVVJBVElPTl9DTE9DS19TSU5HTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfQ09ORklHVVJBVElPTl9DTE9DS19EVUFMOworCisgICAgICAgIC8qIFNlbGVjdCBIU3luYyBFbmFibGUgKi8KKyAgICAgICAgaWYgKGhzeW5jRW5hYmxlID09IDApCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fSFNZTkNfRk9SQ0VfTE9XOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fSFNZTkNfQVNfSVM7CisKKyAgICAgICAgLyogU2VsZWN0IFZTeW5jIEVuYWJsZSAqLworICAgICAgICBpZiAodnN5bmNFbmFibGUgPT0gMCkKKyAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfQ09ORklHVVJBVElPTl9WU1lOQ19GT1JDRV9MT1c7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfQ09ORklHVVJBVElPTl9WU1lOQ19BU19JUzsKKworICAgICAgICBpMmNXcml0ZVJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9DT05GSUdVUkFUSU9OLCBjb25maWcpOworCisgICAgICAgIC8qIERlLXNrZXcgZW5hYmxlZCB3aXRoIGRlZmF1bHQgMTExYiB2YWx1ZS4KKyAgICAgICAgICAgVGhpcyB3aWxsIGZpeCBzb21lIGFydGlmYWN0cyBwcm9ibGVtIGluIHNvbWUgbW9kZSBvbiBib2FyZCAyLjIuCisgICAgICAgICAgIFNvbWVob3cgdGhpcyBmaXggZG9lcyBub3QgYWZmZWN0IGJvYXJkIDIuMS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChkZXNrZXdFbmFibGUgPT0gMCkKKyAgICAgICAgICAgIGNvbmZpZyA9IFNJSTE2NF9ERVNLRVdfRElTQUJMRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29uZmlnID0gU0lJMTY0X0RFU0tFV19FTkFCTEU7CisKKyAgICAgICAgc3dpdGNoIChkZXNrZXdTZXR0aW5nKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9ERVNLRVdfMV9TVEVQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfREVTS0VXXzJfU1RFUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0RFU0tFV18zX1NURVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9ERVNLRVdfNF9TVEVQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfREVTS0VXXzVfU1RFUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0RFU0tFV182X1NURVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9ERVNLRVdfN19TVEVQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfREVTS0VXXzhfU1RFUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpMmNXcml0ZVJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVNLRVcsIGNvbmZpZyk7CisKKyAgICAgICAgLyogRW5hYmxlL0Rpc2FibGUgQ29udGludW91cyBTeW5jLiAqLworICAgICAgICBpZiAoY29udGludW91c1N5bmNFbmFibGUgPT0gMCkKKyAgICAgICAgICAgIGNvbmZpZyA9IFNJSTE2NF9QTExfRklMVEVSX1NZTkNfQ09OVElOVU9VU19ESVNBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb25maWcgPSBTSUkxNjRfUExMX0ZJTFRFUl9TWU5DX0NPTlRJTlVPVVNfRU5BQkxFOworCisgICAgICAgIC8qIEVuYWJsZS9EaXNhYmxlIFBMTCBGaWx0ZXIgKi8KKyAgICAgICAgaWYgKHBsbEZpbHRlckVuYWJsZSA9PSAwKQorICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9QTExfRklMVEVSX0RJU0FCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfUExMX0ZJTFRFUl9FTkFCTEU7CisKKyAgICAgICAgLyogU2V0IHRoZSBQTEwgRmlsdGVyIHZhbHVlICovCisgICAgICAgIGNvbmZpZyB8PSAoKHBsbEZpbHRlclZhbHVlICYgMHgwNykgPDwgMSk7CisKKyAgICAgICAgaTJjV3JpdGVSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfUExMLCBjb25maWcpOworCisgICAgICAgIC8qIFJlY292ZXIgZnJvbSBQb3dlciBEb3duIGFuZCBlbmFibGUgb3V0cHV0LiAqLworICAgICAgICBjb25maWcgPSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0NPTkZJR1VSQVRJT04pOworICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fUE9XRVJfTk9STUFMOworICAgICAgICBpMmNXcml0ZVJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9DT05GSUdVUkFUSU9OLCBjb25maWcpOworCisjaWZkZWYgRERLREVCVUcKKyAgICAgICAgLy9zaWkxNjRQcmludFJlZ2lzdGVyVmFsdWVzKCk7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBSZXR1cm4gLTEgaWYgaW5pdGlhbGl6YXRpb24gZmFpbHMuICovCisgICAgcmV0dXJuICgtMSk7Cit9CisKKworCisKKworLyogYmVsb3cgc2lpMTY0IGZ1bmN0aW9uIGlzIG5vdCBuZWNjZXNzYXJ5ICovCisKKyNpZmRlZiBTSUkxNjRfRlVMTF9GVU5DVElPTlMKKworLyoKKyAqICBzaWkxNjRSZXNldENoaXAKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIERWSSBDb250cm9sbGVyIENoaXAuCisgKi8KK3ZvaWQgc2lpMTY0UmVzZXRDaGlwKHZvaWQpCit7CisgICAgLyogUG93ZXIgZG93biAqLworICAgIHNpaTE2NFNldFBvd2VyKDApOworICAgIHNpaTE2NFNldFBvd2VyKDEpOworfQorCisKKy8qCisgKiBzaWkxNjRHZXRDaGlwU3RyaW5nCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXIgc3RyaW5nIG5hbWUgb2YgdGhlIGN1cnJlbnQgRFZJIENvbnRyb2xsZXIgY2hpcC4KKyAqICAgICAgSXQncyBjb252ZW5pZW50IGZvciBhcHBsaWNhdGlvbiBuZWVkIHRvIGRpc3BsYXkgdGhlIGNoaXAgbmFtZS4KKyAqLworY2hhciAqc2lpMTY0R2V0Q2hpcFN0cmluZyh2b2lkKQoreworICAgIHJldHVybiBnRHZpQ3RybENoaXBOYW1lOworfQorCisKKy8qCisgKiAgc2lpMTY0U2V0UG93ZXIKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwb3dlciBjb25maWd1cmF0aW9uIG9mIHRoZSBEVkkgQ29udHJvbGxlciBDaGlwLgorICoKKyAqICBJbnB1dDoKKyAqICAgICAgcG93ZXJVcCAtIEZsYWcgdG8gc2V0IHRoZSBwb3dlciBkb3duIG9yIHVwCisgKi8KK3ZvaWQgc2lpMTY0U2V0UG93ZXIoCisgICAgdW5zaWduZWQgY2hhciBwb3dlclVwCispCit7CisgICAgdW5zaWduZWQgY2hhciBjb25maWc7CisKKyAgICBjb25maWcgPSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0NPTkZJR1VSQVRJT04pOworICAgIGlmIChwb3dlclVwID09IDEpCisgICAgeworICAgICAgICAvKiBQb3dlciB1cCB0aGUgY2hpcCAqLworICAgICAgICBjb25maWcgJj0gflNJSTE2NF9DT05GSUdVUkFUSU9OX1BPV0VSX01BU0s7CisgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfQ09ORklHVVJBVElPTl9QT1dFUl9OT1JNQUw7CisgICAgICAgIGkyY1dyaXRlUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0NPTkZJR1VSQVRJT04sIGNvbmZpZyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFBvd2VyIGRvd24gdGhlIGNoaXAgKi8KKyAgICAgICAgY29uZmlnICY9IH5TSUkxNjRfQ09ORklHVVJBVElPTl9QT1dFUl9NQVNLOworICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fUE9XRVJfRE9XTjsKKyAgICAgICAgaTJjV3JpdGVSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfQ09ORklHVVJBVElPTiwgY29uZmlnKTsKKyAgICB9Cit9CisKKworLyoKKyAqICBzaWkxNjRTZWxlY3RIb3RQbHVnRGV0ZWN0aW9uTW9kZQorICogICAgICBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgdGhlIG1vZGUgb2YgdGhlIGhvdCBwbHVnIGRldGVjdGlvbi4KKyAqLworc3RhdGljIHZvaWQgc2lpMTY0U2VsZWN0SG90UGx1Z0RldGVjdGlvbk1vZGUoCisgICAgc2lpMTY0X2hvdF9wbHVnX21vZGVfdCBob3RQbHVnTW9kZQorKQoreworICAgIHVuc2lnbmVkIGNoYXIgZGV0ZWN0UmVnOworCisgICAgZGV0ZWN0UmVnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QpICYgflNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfRkxBRzsKKyAgICBzd2l0Y2ggKGhvdFBsdWdNb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBTSUkxNjRfSE9UUExVR19ESVNBQkxFOgorICAgICAgICAgICAgZGV0ZWN0UmVnIHw9IFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfSElHSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJSTE2NF9IT1RQTFVHX1VTRV9NREk6CisgICAgICAgICAgICBkZXRlY3RSZWcgJj0gflNJSTE2NF9ERVRFQ1RfSU5URVJSVVBUX01BU0s7CisgICAgICAgICAgICBkZXRlY3RSZWcgfD0gU0lJMTY0X0RFVEVDVF9JTlRFUlJVUFRfQllfSFRQTEdfUElOOworICAgICAgICAgICAgZGV0ZWN0UmVnIHw9IFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfTURJOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lJMTY0X0hPVFBMVUdfVVNFX1JTRU46CisgICAgICAgICAgICBkZXRlY3RSZWcgfD0gU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NFTlNFX09VVFBVVF9SU0VOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lJMTY0X0hPVFBMVUdfVVNFX0hUUExHOgorICAgICAgICAgICAgZGV0ZWN0UmVnIHw9IFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfSFRQTEc7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpMmNXcml0ZVJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QsIGRldGVjdFJlZyk7Cit9CisKKy8qCisgKiAgc2lpMTY0RW5hYmxlSG90UGx1Z0RldGVjdGlvbgorICogICAgICBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIEhvdCBQbHVnIGRldGVjdGlvbi4KKyAqCisgKiAgZW5hYmxlSG90UGx1ZyAgIC0gRW5hYmxlICg9MSkgLyBkaXNhYmxlICg9MCkgSG90IFBsdWcgZGV0ZWN0aW9uCisgKi8KK3ZvaWQgc2lpMTY0RW5hYmxlSG90UGx1Z0RldGVjdGlvbigKKyAgICB1bnNpZ25lZCBjaGFyIGVuYWJsZUhvdFBsdWcKKykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGRldGVjdFJlZzsKKyAgICBkZXRlY3RSZWcgPSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0RFVEVDVCk7CisKKyAgICAvKiBEZXBlbmRpbmcgb24gZWFjaCBEVkkgY29udHJvbGxlciwgbmVlZCB0byBlbmFibGUgdGhlIGhvdCBwbHVnIGJhc2VkIG9uIGVhY2gKKyAgICAgICBpbmRpdmlkdWFsIGNoaXAgZGVzaWduLiAqLworICAgIGlmIChlbmFibGVIb3RQbHVnICE9IDApCisgICAgICAgIHNpaTE2NFNlbGVjdEhvdFBsdWdEZXRlY3Rpb25Nb2RlKFNJSTE2NF9IT1RQTFVHX1VTRV9NREkpOworICAgIGVsc2UKKyAgICAgICAgc2lpMTY0U2VsZWN0SG90UGx1Z0RldGVjdGlvbk1vZGUoU0lJMTY0X0hPVFBMVUdfRElTQUJMRSk7Cit9CisKKy8qCisgKiAgc2lpMTY0SXNDb25uZWN0ZWQKKyAqICAgICAgQ2hlY2sgaWYgdGhlIERWSSBNb25pdG9yIGlzIGNvbm5lY3RlZC4KKyAqCisgKiAgT3V0cHV0OgorICogICAgICAwICAgLSBOb3QgQ29ubmVjdGVkCisgKiAgICAgIDEgICAtIENvbm5lY3RlZAorICovCit1bnNpZ25lZCBjaGFyIHNpaTE2NElzQ29ubmVjdGVkKHZvaWQpCit7CisgICAgdW5zaWduZWQgY2hhciBob3RQbHVnVmFsdWU7CisKKyAgICBob3RQbHVnVmFsdWUgPSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0RFVEVDVCkgJiBTSUkxNjRfREVURUNUX0hPVF9QTFVHX1NUQVRVU19NQVNLOworICAgIGlmIChob3RQbHVnVmFsdWUgPT0gU0lJMTY0X0RFVEVDVF9IT1RfUExVR19TVEFUVVNfT04pCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgc2lpMTY0Q2hlY2tJbnRlcnJ1cHQKKyAqICAgICAgQ2hlY2tzIGlmIGludGVycnVwdCBoYXMgb2NjdXJlZC4KKyAqCisgKiAgT3V0cHV0OgorICogICAgICAwICAgLSBObyBpbnRlcnJ1cHQKKyAqICAgICAgMSAgIC0gSW50ZXJydXB0IG9jY3VycworICovCit1bnNpZ25lZCBjaGFyIHNpaTE2NENoZWNrSW50ZXJydXB0KHZvaWQpCit7CisgICAgdW5zaWduZWQgY2hhciBkZXRlY3RSZWc7CisKKyAgICBkZXRlY3RSZWcgPSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0RFVEVDVCkgJiBTSUkxNjRfREVURUNUX01PTklUT1JfU1RBVEVfTUFTSzsKKyAgICBpZiAoZGV0ZWN0UmVnID09IFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TVEFURV9DSEFOR0UpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgc2lpMTY0Q2xlYXJJbnRlcnJ1cHQKKyAqICAgICAgQ2xlYXIgdGhlIGhvdCBwbHVnIGludGVycnVwdC4KKyAqLwordm9pZCBzaWkxNjRDbGVhckludGVycnVwdCh2b2lkKQoreworICAgIHVuc2lnbmVkIGNoYXIgZGV0ZWN0UmVnOworCisgICAgLyogQ2xlYXIgdGhlIE1ESSBpbnRlcnJ1cHQgKi8KKyAgICBkZXRlY3RSZWcgPSBpMmNSZWFkUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0RFVEVDVCk7CisgICAgaTJjV3JpdGVSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfREVURUNULCBkZXRlY3RSZWcgfCBTSUkxNjRfREVURUNUX01PTklUT1JfU1RBVEVfQ0xFQVIpOworfQorCisjZW5kaWYKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGM3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmgKQEAgLTAsMCArMSwxNzIgQEAKKyNpZm5kZWYgRERLNzUwX1NJSTE2NF9IX18KKyNkZWZpbmUgRERLNzUwX1NJSTE2NF9IX18KKworI2RlZmluZSBVU0VfRFZJQ0hJUAorCisvKiBIb3QgUGx1ZyBkZXRlY3Rpb24gbW9kZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgZW51bSBfc2lpMTY0X2hvdF9wbHVnX21vZGVfdAoreworICAgIFNJSTE2NF9IT1RQTFVHX0RJU0FCTEUgPSAwLCAgICAgICAgIC8qIERpc2FibGUgSG90IFBsdWcgb3V0cHV0IGJpdCAoYWx3YXlzIGhpZ2gpLiAqLworICAgIFNJSTE2NF9IT1RQTFVHX1VTRV9NREksICAgICAgICAgICAgIC8qIFVzZSBNb25pdG9yIERldGVjdCBJbnRlcnJ1cHQgYml0LiAqLworICAgIFNJSTE2NF9IT1RQTFVHX1VTRV9SU0VOLCAgICAgICAgICAgIC8qIFVzZSBSZWNlaXZlciBTZW5zZSBkZXRlY3QgYml0LiAqLworICAgIFNJSTE2NF9IT1RQTFVHX1VTRV9IVFBMRyAgICAgICAgICAgIC8qIFVzZSBIb3QgUGx1ZyBkZXRlY3QgYml0LiAqLworfSBzaWkxNjRfaG90X3BsdWdfbW9kZV90OworCisKKy8qIFNpbGljb24gSW1hZ2UgU2lJMTY0IGNoaXAgcHJvdG90eXBlICovCitsb25nIHNpaTE2NEluaXRDaGlwKAorICAgIHVuc2lnbmVkIGNoYXIgZWRnZVNlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGJ1c1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGR1YWxFZGdlQ2xrU2VsZWN0LAorICAgIHVuc2lnbmVkIGNoYXIgaHN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciB2c3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIGRlc2tld1NldHRpbmcsCisgICAgdW5zaWduZWQgY2hhciBjb250aW51b3VzU3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlckVuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHBsbEZpbHRlclZhbHVlCispOworCit1bnNpZ25lZCBzaG9ydCBzaWkxNjRHZXRWZW5kb3JJRCh2b2lkKTsKK3Vuc2lnbmVkIHNob3J0IHNpaTE2NEdldERldmljZUlEKHZvaWQpOworCisKKyNpZmRlZiBTSUkxNjRfRlVMTF9GVU5DVElPTlMKK3ZvaWQgc2lpMTY0UmVzZXRDaGlwKHZvaWQpOworY2hhciAqc2lpMTY0R2V0Q2hpcFN0cmluZyh2b2lkKTsKK3ZvaWQgc2lpMTY0U2V0UG93ZXIodW5zaWduZWQgY2hhciBwb3dlclVwKTsKK3ZvaWQgc2lpMTY0RW5hYmxlSG90UGx1Z0RldGVjdGlvbih1bnNpZ25lZCBjaGFyIGVuYWJsZUhvdFBsdWcpOwordW5zaWduZWQgY2hhciBzaWkxNjRJc0Nvbm5lY3RlZCh2b2lkKTsKK3Vuc2lnbmVkIGNoYXIgc2lpMTY0Q2hlY2tJbnRlcnJ1cHQodm9pZCk7Cit2b2lkIHNpaTE2NENsZWFySW50ZXJydXB0KHZvaWQpOworI2VuZGlmCisvKiBiZWxvdyByZWdpc3RlciBkZWZpbmluYXRpb24gaXMgdXNlZCBmb3IgU2lsaWNvbiBJbWFnZSBTaUkxNjQgRFZJIGNvbnRyb2xsZXIgY2hpcCAqLworLyoKKyAqIFZlbmRvciBJRCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBTSUkxNjRfVkVORE9SX0lEX0xPVyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X1ZFTkRPUl9JRF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAweDAxCisKKy8qCisgKiBEZXZpY2UgSUQgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU0lJMTY0X0RFVklDRV9JRF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNJSTE2NF9ERVZJQ0VfSURfSElHSCAgICAgICAgICAgICAgICAgICAgICAgMHgwMworCisvKgorICogRGV2aWNlIFJldmlzaW9uCisgKi8KKyNkZWZpbmUgU0lJMTY0X0RFVklDRV9SRVZJU0lPTiAgICAgICAgICAgICAgICAgICAgICAweDA0CisKKy8qCisgKiBGcmVxdWVuY3kgTGltaXRhdGlvbiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBTSUkxNjRfRlJFUVVFTkNZX0xJTUlUX0xPVyAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgU0lJMTY0X0ZSRVFVRU5DWV9MSU1JVF9ISUdIICAgICAgICAgICAgICAgICAweDA3CisKKy8qCisgKiBQb3dlciBEb3duIGFuZCBJbnB1dCBTaWduYWwgQ29uZmlndXJhdGlvbiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKworLyogUG93ZXIgZG93biAoUEQpICovCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX1BPV0VSX0RPV04gICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9QT1dFUl9OT1JNQUwgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fUE9XRVJfTUFTSyAgICAgICAgICAgICAweDAxCisKKy8qIElucHV0IEVkZ2UgTGF0Y2ggU2VsZWN0IChFREdFKSAqLworI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9MQVRDSF9GQUxMSU5HICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fTEFUQ0hfUklTSU5HICAgICAgICAgICAweDAyCisKKy8qIEJ1cyBTZWxlY3QgKEJTRUwpICovCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX0JVU18xMkJJVFMgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9CVVNfMjRCSVRTICAgICAgICAgICAgIDB4MDQKKworLyogRHVhbCBFZGdlIENsb2NrIFNlbGVjdCAoRFNFTCkgKi8KKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fQ0xPQ0tfU0lOR0xFICAgICAgICAgICAweDAwCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX0NMT0NLX0RVQUwgICAgICAgICAgICAgMHgwOAorCisvKiBIb3Jpem9udGFsIFN5bmMgRW5hYmxlIChIRU4pICovCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX0hTWU5DX0ZPUkNFX0xPVyAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9IU1lOQ19BU19JUyAgICAgICAgICAgIDB4MTAKKworLyogVmVydGljYWwgU3luYyBFbmFibGUgKFZFTikgKi8KKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fVlNZTkNfRk9SQ0VfTE9XICAgICAgICAweDAwCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX1ZTWU5DX0FTX0lTICAgICAgICAgICAgMHgyMAorCisvKgorICogRGV0ZWN0aW9uIHJlZ2lzdGVycworICovCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorCisvKiBNb25pdG9yIERldGVjdCBJbnRlcnJ1cHQgKE1ESSkgKi8KKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NUQVRFX0NIQU5HRSAgICAgICAgICAweDAwCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TVEFURV9OT19DSEFOR0UgICAgICAgMHgwMQorI2RlZmluZSBTSUkxNjRfREVURUNUX01PTklUT1JfU1RBVEVfQ0xFQVIgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NUQVRFX01BU0sgICAgICAgICAgICAweDAxCisKKy8qIEhvdCBQbHVnIGRldGVjdCBJbnB1dCAoSFRQTEcpICovCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfSE9UX1BMVUdfU1RBVFVTX09GRiAgICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfREVURUNUX0hPVF9QTFVHX1NUQVRVU19PTiAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9IT1RfUExVR19TVEFUVVNfTUFTSyAgICAgICAgICAweDAyCisKKy8qIFJlY2VpdmVyIFNlbnNlIChSU0VOKSAqLworI2RlZmluZSBTSUkxNjRfREVURUNUX1JFQ0VJVkVSX1NFTlNFX05PVF9ERVRFQ1RFRCAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9SRUNFSVZFUl9TRU5TRV9ERVRFQ1RFRCAgICAgICAweDA0CisKKy8qIEludGVycnVwdCBHZW5lcmF0aW9uIE1ldGhvZCAoVFNFTCkgKi8KKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9JTlRFUlJVUFRfQllfUlNFTl9QSU4gICAgICAgICAweDAwCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfSU5URVJSVVBUX0JZX0hUUExHX1BJTiAgICAgICAgMHgwOAorI2RlZmluZSBTSUkxNjRfREVURUNUX0lOVEVSUlVQVF9NQVNLICAgICAgICAgICAgICAgIDB4MDgKKworLyogTW9uaXRvciBTZW5zZSBPdXRwdXQgKE1TRU4pICovCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfSElHSCAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX01ESSAgICAgIDB4MTAKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NFTlNFX09VVFBVVF9SU0VOICAgICAweDIwCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfSFRQTEcgICAgMHgzMAorI2RlZmluZSBTSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX0ZMQUcgICAgIDB4MzAKKworLyoKKyAqIFNrZXdpbmcgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU0lJMTY0X0RFU0tFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJbnB1dCAoQ1RMWzM6MV0pICovCisjZGVmaW5lIFNJSTE2NF9ERVNLRVdfR0VORVJBTF9QVVJQT1NFX0lOUFVUX01BU0sgICAgMHgwRQorCisvKiBEZS1za2V3aW5nIEVuYWJsZSBiaXQgKERLRU4pICovCisjZGVmaW5lIFNJSTE2NF9ERVNLRVdfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfREVTS0VXX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKworLyogRGUtc2tld2luZyBTZXR0aW5nIChES1szOjFdKSovCisjZGVmaW5lIFNJSTE2NF9ERVNLRVdfMV9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfREVTS0VXXzJfU1RFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0lJMTY0X0RFU0tFV18zX1NURVAgICAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFNJSTE2NF9ERVNLRVdfNF9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBTSUkxNjRfREVTS0VXXzVfU1RFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgU0lJMTY0X0RFU0tFV182X1NURVAgICAgICAgICAgICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIFNJSTE2NF9ERVNLRVdfN19TVEVQICAgICAgICAgICAgICAgICAgICAgICAgMHhDMAorI2RlZmluZSBTSUkxNjRfREVTS0VXXzhfU1RFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4RTAKKworLyoKKyAqIFVzZXIgQ29uZmlndXJhdGlvbiBEYXRhIHJlZ2lzdGVycyAoQ0ZHIDc6MCkKKyAqLworI2RlZmluZSBTSUkxNjRfVVNFUl9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgIDB4MEIKKworLyoKKyAqIFBMTCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBTSUkxNjRfUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMKKworLyogUExMIEZpbHRlciBWYWx1ZSAoUExMRikgKi8KKyNkZWZpbmUgU0lJMTY0X1BMTF9GSUxURVJfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAweDBFCisKKy8qIFBMTCBGaWx0ZXIgRW5hYmxlIChQRkVOKSAqLworI2RlZmluZSBTSUkxNjRfUExMX0ZJTFRFUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X1BMTF9GSUxURVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAweDAxCisKKy8qIFN5bmMgQ29udGludW91cyAoU0NOVCkgKi8KKyNkZWZpbmUgU0lJMTY0X1BMTF9GSUxURVJfU1lOQ19DT05USU5VT1VTX0RJU0FCTEUgICAweDAwCisjZGVmaW5lIFNJSTE2NF9QTExfRklMVEVSX1NZTkNfQ09OVElOVU9VU19FTkFCTEUgICAgMHg4MAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxYjM3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jCkBAIC0wLDAgKzEsNTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBieSBTaWxpY29uIE1vdGlvbiwgSW5jLiAoU01JKQorKgorKiAgQWxsIHJpZ2h0cyBhcmUgcmVzZXJ2ZWQuIFJlcHJvZHVjdGlvbiBvciBpbiBwYXJ0IGlzIHByb2hpYml0ZWQKKyogIHdpdGhvdXQgdGhlIHdyaXR0ZW4gY29uc2VudCBvZiB0aGUgY29weXJpZ2h0IG93bmVyLgorKgorKiAgc3dpMmMuYyAtLS0gU003NTAvU003MTggRERLCisqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGZvciBJMkMgdXNpbmcgc29mdHdhcmUKKyogIGltcGxlbWVudGF0aW9uLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJkZGs3NTBfaGVscC5oIgorI2luY2x1ZGUgImRkazc1MF9yZWcuaCIKKyNpbmNsdWRlICJkZGs3NTBfc3dpMmMuaCIKKyNpbmNsdWRlICJkZGs3NTBfcG93ZXIuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSTJDIFNvZnR3YXJlIE1hc3RlciBEcml2ZXI6CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVhY2ggaTJjIGN5Y2xlIGlzIHNwbGl0IGludG8gNCBzZWN0aW9ucy4gRWFjaCBvZiB0aGVzZSBzZWN0aW9uIG1hcmtzCisgKiBhIHBvaW50IGluIHRpbWUgd2hlcmUgdGhlIFNDTCBvciBTREEgbWF5IGJlIGNoYW5nZWQuCisgKgorICogMSBDeWNsZSA9PSB8ICBTZWN0aW9uIEkuIHwgIFNlY3Rpb24gMi4gfCAgU2VjdGlvbiAzLiB8ICBTZWN0aW9uIDQuIHwKKyAqICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCisgKiAgICAgICAgICAgIHwgU0NMIHNldCBMT1cgfFNDTCBubyBjaGFuZ2V8IFNDTCBzZXQgSElHSHxTQ0wgbm8gY2hhbmdlfAorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fX19fIF9fX19fX19fX19fX18KKyAqIFNDTCA9PSBYWFhYIF9fX19fX19fX19fX18gX19fX19fX19fX19fIC8KKyAqCisgKiBJLmUuIHRoZSBTQ0wgbWF5IG9ubHkgYmUgY2hhbmdlZCBpbiBzZWN0aW9uIDEuIGFuZCBzZWN0aW9uIDMuIHdoaWxlCisgKiB0aGUgU0RBIG1heSBvbmx5IGJlIGNoYW5nZWQgaW4gc2VjdGlvbiAyLiBhbmQgc2VjdGlvbiA0LiBUaGUgdGFibGUKKyAqIGJlbG93IGdpdmVzIHRoZSBjaGFuZ2VzIGZvciB0aGVzZSAyIGxpbmVzIGluIHRoZSB2YXJpb3Mgc2VjdGlvbnMuCisgKgorICogU2VjdGlvbiBjaGFuZ2VzIFRhYmxlOgorICogPT09PT09PT09PT09PT09PT09PT09PQorICogYmxhbmsgPSBubyBjaGFuZ2UsIEwgPSBzZXQgYml0IExPVywgSCA9IHNldCBiaXQgSElHSAorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEufCAyLnwgMy58IDQufAorICogICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rCisgKiAgICAgICAgICAgICAgICAgVHggU3RhcnQgICBTREEgfCAgIHwgSCB8ICAgfCBMIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDTCB8IEwgfCAgIHwgSCB8ICAgfAorICogICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rCisgKiAgICAgICAgICAgICAgICAgVHggU3RvcCAgICBTREEgfCAgIHwgTCB8ICAgfCBIIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDTCB8IEwgfCAgIHwgSCB8ICAgfAorICogICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rCisgKiAgICAgICAgICAgICAgICAgVHggYml0IEggICBTREEgfCAgIHwgSCB8ICAgfCAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDTCB8IEwgfCAgIHwgSCB8ICAgfAorICogICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rCisgKiAgICAgICAgICAgICAgICAgVHggYml0IEwgICBTREEgfCAgIHwgTCB8ICAgfCAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDTCB8IEwgfCAgIHwgSCB8ICAgfAorICogICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR1BJTyBwaW5zIHVzZWQgZm9yIHRoaXMgSTJDLiBJdCByYW5nZXMgZnJvbSAwIHRvIDYzLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ19pMmNDbG9ja0dQSU8gPSBERUZBVUxUX0kyQ19TQ0w7CitzdGF0aWMgdW5zaWduZWQgY2hhciBnX2kyY0RhdGFHUElPID0gREVGQVVMVF9JMkNfU0RBOworCisvKgorICogIEJlbG93IGlzIHRoZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmb3IgdGhlIEdQSU8gcGluIHJlZ2lzdGVyIHVzYWdlCisgKiAgZm9yIHRoZSBpMmMgQ2xvY2sgYW5kIGkyYyBEYXRhLgorICoKKyAqICBOb3RlOgorICogICAgICBOb3RpY2UgdGhhdCB0aGUgR1BJTyB1c2FnZSBmb3IgdGhlIGkyYyBjbG9jayBhbmQgaTJjIERhdGEgYXJlCisgKiAgICAgIHNlcGFyYXRlZC4gVGhpcyBpcyB0byBtYWtlIHRoaXMgY29kZSBmbGV4aWJsZSBlbm91Z2ggd2hlbgorICogICAgICB0d28gc2VwYXJhdGUgR1BJTyBwaW5zIGZvciB0aGUgY2xvY2sgYW5kIGRhdGEgYXJlIGxvY2F0ZWQKKyAqICAgICAgaW4gdHdvIGRpZmZlcmVudCBHUElPIHJlZ2lzdGVyIHNldCAod29yc3QgY2FzZSkuCisgKi8KKworLyogaTJjIENsb2NrIEdQSU8gUmVnaXN0ZXIgdXNhZ2UgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdfaTJjQ2xrR1BJT011eFJlZyA9IEdQSU9fTVVYOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ19pMmNDbGtHUElPRGF0YVJlZyA9IEdQSU9fREFUQTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdfaTJjQ2xrR1BJT0RhdGFEaXJSZWcgPSBHUElPX0RBVEFfRElSRUNUSU9OOworCisvKiBpMmMgRGF0YSBHUElPIFJlZ2lzdGVyIHVzYWdlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnX2kyY0RhdGFHUElPTXV4UmVnID0gR1BJT19NVVg7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBnX2kyY0RhdGFHUElPRGF0YVJlZyA9IEdQSU9fREFUQTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdfaTJjRGF0YUdQSU9EYXRhRGlyUmVnID0gR1BJT19EQVRBX0RJUkVDVElPTjsKKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHB1dHMgYSBkZWxheSBiZXR3ZWVuIGNvbW1hbmQKKyAqLworc3RhdGljIHZvaWQgc3dJMkNXYWl0KHZvaWQpCit7CisJLyogZmluZCBhIGJ1ZzoKKwkgKiBwZWVrSU8gbWV0aG9kIHdvcmtzIHdlbGwgYmVmb3JlIHN1c3BlbmQvcmVzdW1lCisJICogYnV0IGFmdGVyIHN1c3BlbmQsIHBlZWtJTygweDNjZSwweDYxKSAmIDB4MTAKKwkgKiBhbHdheXMgYmUgbm9uLXplcm8sd2hpY2ggbWFrZXMgdGhlIHdoaWxlIGxvb3AKKwkgKiBuZXZlciBmaW5pc2guCisJICogdXNlIG5vbi11bHRpbWF0ZSBmb3IgbG9vcCBiZWxvdyBpcyBzYWZlCisJICogKi8KKyNpZiAwCisgICAgLyogQ2hhbmdlIHdhaXQgYWxnb3JpdGhtIHRvIHVzZSBQQ0kgYnVzIGNsb2NrLAorICAgICAgIGl0J3MgbW9yZSByZWxpYWJsZSB0aGFuIGNvdW50ZXIgbG9vcCAuLgorICAgICAgIHdyaXRlIDB4NjEgdG8gMHgzY2UgYW5kIHJlYWQgZnJvbSAweDNjZgorICAgICAgICovCisJd2hpbGUocGVla0lPKDB4M2NlLDB4NjEpICYgMHgxMCk7CisjZWxzZQorICAgIGludCBpLCBUZW1wOworCisgICAgZm9yKGk9MDsgaTw2MDA7IGkrKykKKyAgICB7CisgICAgICAgIFRlbXAgPSBpOworICAgICAgICBUZW1wICs9IGk7CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBzZXQvcmVzZXQgdGhlIFNDTCBHUElPIHBpbgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB2YWx1ZSAgICAtIEJpdCB2YWx1ZSB0byBzZXQgdG8gdGhlIFNDTCBvciBTREEgKDAgPSBsb3csIDEgPSBoaWdoKQorICoKKyAqICBOb3RlczoKKyAqICAgICAgV2hlbiBzZXR0aW5nIFNDTCB0byBoaWdoLCBqdXN0IHNldCB0aGUgR1BJTyBhcyBpbnB1dCB3aGVyZSB0aGUgcHVsbCB1cAorICogICAgICByZXNpc3RvciB3aWxsIHB1bGwgdGhlIHNpZ25hbCB1cC4gRG8gbm90IHVzZSBzb2Z0d2FyZSB0byBwdWxsIHVwIHRoZQorICogICAgICBzaWduYWwgYmVjYXVzZSB0aGUgaTJjIHdpbGwgZmFpbCB3aGVuIG90aGVyIGRldmljZSB0cnkgdG8gZHJpdmUgdGhlCisgKiAgICAgIHNpZ25hbCBkdWUgdG8gU001MHggd2lsbCBkcml2ZSB0aGUgc2lnbmFsIHRvIGFsd2F5cyBoaWdoLgorICovCit2b2lkIHN3STJDU0NMKHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgICAgdW5zaWduZWQgbG9uZyB1bEdQSU9EYXRhOworICAgIHVuc2lnbmVkIGxvbmcgdWxHUElPRGlyZWN0aW9uOworCisgICAgdWxHUElPRGlyZWN0aW9uID0gUEVFSzMyKGdfaTJjQ2xrR1BJT0RhdGFEaXJSZWcpOworICAgIGlmICh2YWx1ZSkgICAgICAvKiBIaWdoICovCisgICAgeworICAgICAgICAvKiBTZXQgZGlyZWN0aW9uIGFzIGlucHV0LiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBwdWxsIHRoZSBzaWduYWwgdXAuICovCisgICAgICAgIHVsR1BJT0RpcmVjdGlvbiAmPSB+KDEgPDwgZ19pMmNDbG9ja0dQSU8pOworICAgICAgICBQT0tFMzIoZ19pMmNDbGtHUElPRGF0YURpclJlZywgdWxHUElPRGlyZWN0aW9uKTsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgIC8qIExvdyAqLworICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBzaWduYWwgZG93biAqLworICAgICAgICB1bEdQSU9EYXRhID0gUEVFSzMyKGdfaTJjQ2xrR1BJT0RhdGFSZWcpOworICAgICAgICB1bEdQSU9EYXRhICY9IH4oMSA8PCBnX2kyY0Nsb2NrR1BJTyk7CisgICAgICAgIFBPS0UzMihnX2kyY0Nsa0dQSU9EYXRhUmVnLCB1bEdQSU9EYXRhKTsKKworICAgICAgICAvKiBTZXQgZGlyZWN0aW9uIGFzIG91dHB1dCAqLworICAgICAgICB1bEdQSU9EaXJlY3Rpb24gfD0gKDEgPDwgZ19pMmNDbG9ja0dQSU8pOworICAgICAgICBQT0tFMzIoZ19pMmNDbGtHUElPRGF0YURpclJlZywgdWxHUElPRGlyZWN0aW9uKTsKKyAgICB9Cit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBzZXQvcmVzZXQgdGhlIFNEQSBHUElPIHBpbgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB2YWx1ZSAgICAtIEJpdCB2YWx1ZSB0byBzZXQgdG8gdGhlIFNDTCBvciBTREEgKDAgPSBsb3csIDEgPSBoaWdoKQorICoKKyAqICBOb3RlczoKKyAqICAgICAgV2hlbiBzZXR0aW5nIFNDTCB0byBoaWdoLCBqdXN0IHNldCB0aGUgR1BJTyBhcyBpbnB1dCB3aGVyZSB0aGUgcHVsbCB1cAorICogICAgICByZXNpc3RvciB3aWxsIHB1bGwgdGhlIHNpZ25hbCB1cC4gRG8gbm90IHVzZSBzb2Z0d2FyZSB0byBwdWxsIHVwIHRoZQorICogICAgICBzaWduYWwgYmVjYXVzZSB0aGUgaTJjIHdpbGwgZmFpbCB3aGVuIG90aGVyIGRldmljZSB0cnkgdG8gZHJpdmUgdGhlCisgKiAgICAgIHNpZ25hbCBkdWUgdG8gU001MHggd2lsbCBkcml2ZSB0aGUgc2lnbmFsIHRvIGFsd2F5cyBoaWdoLgorICovCit2b2lkIHN3STJDU0RBKHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgICAgdW5zaWduZWQgbG9uZyB1bEdQSU9EYXRhOworICAgIHVuc2lnbmVkIGxvbmcgdWxHUElPRGlyZWN0aW9uOworCisgICAgdWxHUElPRGlyZWN0aW9uID0gUEVFSzMyKGdfaTJjRGF0YUdQSU9EYXRhRGlyUmVnKTsKKyAgICBpZiAodmFsdWUpICAgICAgLyogSGlnaCAqLworICAgIHsKKyAgICAgICAgLyogU2V0IGRpcmVjdGlvbiBhcyBpbnB1dC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgcHVsbCB0aGUgc2lnbmFsIHVwLiAqLworICAgICAgICB1bEdQSU9EaXJlY3Rpb24gJj0gfigxIDw8IGdfaTJjRGF0YUdQSU8pOworICAgICAgICBQT0tFMzIoZ19pMmNEYXRhR1BJT0RhdGFEaXJSZWcsIHVsR1BJT0RpcmVjdGlvbik7CisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAvKiBMb3cgKi8KKyAgICB7CisgICAgICAgIC8qIFNldCB0aGUgc2lnbmFsIGRvd24gKi8KKyAgICAgICAgdWxHUElPRGF0YSA9IFBFRUszMihnX2kyY0RhdGFHUElPRGF0YVJlZyk7CisgICAgICAgIHVsR1BJT0RhdGEgJj0gfigxIDw8IGdfaTJjRGF0YUdQSU8pOworICAgICAgICBQT0tFMzIoZ19pMmNEYXRhR1BJT0RhdGFSZWcsIHVsR1BJT0RhdGEpOworCisgICAgICAgIC8qIFNldCBkaXJlY3Rpb24gYXMgb3V0cHV0ICovCisgICAgICAgIHVsR1BJT0RpcmVjdGlvbiB8PSAoMSA8PCBnX2kyY0RhdGFHUElPKTsKKyAgICAgICAgUE9LRTMyKGdfaTJjRGF0YUdQSU9EYXRhRGlyUmVnLCB1bEdQSU9EaXJlY3Rpb24pOworICAgIH0KK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgU0RBIEdQSU8gcGluCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgVGhlIFNEQSBkYXRhIGJpdCBzZW50IGJ5IHRoZSBTbGF2ZQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzd0kyQ1JlYWRTREEodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHVsR1BJT0RpcmVjdGlvbjsKKyAgICB1bnNpZ25lZCBsb25nIHVsR1BJT0RhdGE7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGlyZWN0aW9uIGlzIGlucHV0IChIaWdoKSAqLworICAgIHVsR1BJT0RpcmVjdGlvbiA9IFBFRUszMihnX2kyY0RhdGFHUElPRGF0YURpclJlZyk7CisgICAgaWYgKCh1bEdQSU9EaXJlY3Rpb24gJiAoMSA8PCBnX2kyY0RhdGFHUElPKSkgIT0gKH4oMSA8PCBnX2kyY0RhdGFHUElPKSkpCisgICAgeworICAgICAgICB1bEdQSU9EaXJlY3Rpb24gJj0gfigxIDw8IGdfaTJjRGF0YUdQSU8pOworICAgICAgICBQT0tFMzIoZ19pMmNEYXRhR1BJT0RhdGFEaXJSZWcsIHVsR1BJT0RpcmVjdGlvbik7CisgICAgfQorCisgICAgLyogTm93IHJlYWQgdGhlIFNEQSBsaW5lICovCisgICAgdWxHUElPRGF0YSA9IFBFRUszMihnX2kyY0RhdGFHUElPRGF0YVJlZyk7CisgICAgaWYgKHVsR1BJT0RhdGEgJiAoMSA8PCBnX2kyY0RhdGFHUElPKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHNlbmRzIEFDSyBzaWduYWwKKyAqLworc3RhdGljIHZvaWQgc3dJMkNBY2sodm9pZCkKK3sKKyAgICByZXR1cm47ICAvKiBTaW5nbGUgYnl0ZSByZWFkIGlzIG9rIHdpdGhvdXQgaXQuICovCit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgc3RhcnQgY29tbWFuZCB0byB0aGUgc2xhdmUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHN3STJDU3RhcnQodm9pZCkKK3sKKyAgICAvKiBTdGFydCBJMkMgKi8KKyAgICBzd0kyQ1NEQSgxKTsKKyAgICBzd0kyQ1NDTCgxKTsKKyAgICBzd0kyQ1NEQSgwKTsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBzdG9wIGNvbW1hbmQgdG8gdGhlIHNsYXZlIGRldmljZQorICovCitzdGF0aWMgdm9pZCBzd0kyQ1N0b3Aodm9pZCkKK3sKKyAgICAvKiBTdG9wIHRoZSBJMkMgKi8KKyAgICBzd0kyQ1NDTCgxKTsKKyAgICBzd0kyQ1NEQSgwKTsKKyAgICBzd0kyQ1NEQSgxKTsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBvbmUgYnl0ZSB0byB0aGUgc2xhdmUgZGV2aWNlCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRhdGEgICAgLSBEYXRhIHRvIGJlIHdyaXRlIHRvIHRoZSBzbGF2ZSBkZXZpY2UKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICAgMCAgIC0gU3VjY2VzcworICogICAgICAtMSAgIC0gRmFpbCB0byB3cml0ZSBieXRlCisgKi8KK3N0YXRpYyBsb25nIHN3STJDV3JpdGVCeXRlKHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlID0gZGF0YTsKKyAgICBpbnQgaTsKKworICAgIC8qIFNlbmRpbmcgdGhlIGRhdGEgYml0IGJ5IGJpdCAqLworICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFNldCBTQ0wgdG8gbG93ICovCisgICAgICAgIHN3STJDU0NMKDApOworCisgICAgICAgIC8qIFNlbmQgZGF0YSBiaXQgKi8KKyAgICAgICAgaWYgKCh2YWx1ZSAmIDB4ODApICE9IDApCisgICAgICAgICAgICBzd0kyQ1NEQSgxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3dJMkNTREEoMCk7CisKKyAgICAgICAgc3dJMkNXYWl0KCk7CisKKyAgICAgICAgLyogVG9nZ2xlIGNsayBsaW5lIHRvIG9uZSAqLworICAgICAgICBzd0kyQ1NDTCgxKTsKKyAgICAgICAgc3dJMkNXYWl0KCk7CisKKyAgICAgICAgLyogU2hpZnQgYnl0ZSB0byBiZSBzZW50ICovCisgICAgICAgIHZhbHVlID0gdmFsdWUgPDwgMTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIFNDTCBMb3cgYW5kIFNEQSBIaWdoIChwcmVwYXJlIHRvIGdldCBpbnB1dCkgKi8KKyAgICBzd0kyQ1NDTCgwKTsKKyAgICBzd0kyQ1NEQSgxKTsKKworICAgIC8qIFNldCB0aGUgU0NMIEhpZ2ggZm9yIGFjayAqLworICAgIHN3STJDV2FpdCgpOworICAgIHN3STJDU0NMKDEpOworICAgIHN3STJDV2FpdCgpOworCisgICAgLyogUmVhZCBTREEsIHVudGlsIFNEQT09MCAqLworICAgIGZvcihpPTA7IGk8MHhmZjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzd0kyQ1JlYWRTREEoKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHN3STJDU0NMKDApOworICAgICAgICBzd0kyQ1dhaXQoKTsKKyAgICAgICAgc3dJMkNTQ0woMSk7CisgICAgICAgIHN3STJDV2FpdCgpOworICAgIH0KKworICAgIC8qIFNldCB0aGUgU0NMIExvdyBhbmQgU0RBIEhpZ2ggKi8KKyAgICBzd0kyQ1NDTCgwKTsKKyAgICBzd0kyQ1NEQSgxKTsKKworICAgIGlmIChpPDB4ZmYpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgc2xhdmUgZGV2aWNlCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGFjayAgICAtIEZsYWcgdG8gaW5kaWNhdGUgZWl0aGVyIHRvIHNlbmQgdGhlIGFja25vd2xlZGdlCisgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gdGhlIHNsYXZlIGRldmljZSBvciBub3QKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBPbmUgYnl0ZSBkYXRhIHJlYWQgZnJvbSB0aGUgU2xhdmUgZGV2aWNlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN3STJDUmVhZEJ5dGUodW5zaWduZWQgY2hhciBhY2spCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBkYXRhID0gMDsKKworICAgIGZvcihpPTc7IGk+PTA7IGktLSkKKyAgICB7CisgICAgICAgIC8qIFNldCB0aGUgU0NMIHRvIExvdyBhbmQgU0RBIHRvIEhpZ2ggKElucHV0KSAqLworICAgICAgICBzd0kyQ1NDTCgwKTsKKyAgICAgICAgc3dJMkNTREEoMSk7CisgICAgICAgIHN3STJDV2FpdCgpOworCisgICAgICAgIC8qIFNldCB0aGUgU0NMIEhpZ2ggKi8KKyAgICAgICAgc3dJMkNTQ0woMSk7CisgICAgICAgIHN3STJDV2FpdCgpOworCisgICAgICAgIC8qIFJlYWQgZGF0YSBiaXRzIGZyb20gU0RBICovCisgICAgICAgIGRhdGEgfD0gKHN3STJDUmVhZFNEQSgpIDw8IGkpOworICAgIH0KKworICAgIGlmIChhY2spCisgICAgICAgIHN3STJDQWNrKCk7CisKKyAgICAvKiBTZXQgdGhlIFNDTCBMb3cgYW5kIFNEQSBIaWdoICovCisgICAgc3dJMkNTQ0woMCk7CisgICAgc3dJMkNTREEoMSk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgR1BJTyBwb3J0IGZvciBTVyBJMkMgY29tbXVuaWNhdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBpMmNDbGtHUElPICAgICAgLSBUaGUgR1BJTyBwaW4gdG8gYmUgdXNlZCBhcyBpMmMgU0NMCisgKiAgICAgIGkyY0RhdGFHUElPICAgICAtIFRoZSBHUElPIHBpbiB0byBiZSB1c2VkIGFzIGkyYyBTREEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgIC0xICAgLSBGYWlsIHRvIGluaXRpYWxpemUgdGhlIGkyYworICogICAgICAgMCAgIC0gU3VjY2VzcworICovCitzdGF0aWMgbG9uZyBzd0kyQ0luaXRfU003NTBMRSh1bnNpZ25lZCBjaGFyIGkyY0Nsa0dQSU8sCisJCQkgICAgICB1bnNpZ25lZCBjaGFyIGkyY0RhdGFHUElPKQoreworICAgIGludCBpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgR1BJTyBwaW4gZm9yIHRoZSBpMmMgQ2xvY2sgUmVnaXN0ZXIgKi8KKyAgICBnX2kyY0Nsa0dQSU9EYXRhUmVnID0gR1BJT19EQVRBX1NNNzUwTEU7CisgICAgZ19pMmNDbGtHUElPRGF0YURpclJlZyA9IEdQSU9fREFUQV9ESVJFQ1RJT05fU003NTBMRTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIENsb2NrIEdQSU8gT2Zmc2V0ICovCisgICAgZ19pMmNDbG9ja0dQSU8gPSBpMmNDbGtHUElPOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgR1BJTyBwaW4gZm9yIHRoZSBpMmMgRGF0YSBSZWdpc3RlciAqLworICAgIGdfaTJjRGF0YUdQSU9EYXRhUmVnID0gR1BJT19EQVRBX1NNNzUwTEU7CisgICAgZ19pMmNEYXRhR1BJT0RhdGFEaXJSZWcgPSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBEYXRhIEdQSU8gT2Zmc2V0ICovCisgICAgZ19pMmNEYXRhR1BJTyA9IGkyY0RhdGFHUElPOworCisgICAgLyogTm90ZSB0aGF0IFNNNzUwTEUgZG9uJ3QgaGF2ZSBHUElPIE1VWCBhbmQgcG93ZXIgaXMgYWx3YXlzIG9uICovCisKKyAgICAvKiBDbGVhciB0aGUgaTJjIGxpbmVzLiAqLworICAgIGZvcihpPTA7IGk8OTsgaSsrKQorICAgICAgICBzd0kyQ1N0b3AoKTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgaTJjIGF0dHJpYnV0ZXMgYW5kIGJ1cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgIGkyY0Nsa0dQSU8gICAgICAtIFRoZSBHUElPIHBpbiB0byBiZSB1c2VkIGFzIGkyYyBTQ0wKKyAqICAgICAgaTJjRGF0YUdQSU8gICAgIC0gVGhlIEdQSU8gcGluIHRvIGJlIHVzZWQgYXMgaTJjIFNEQQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgLTEgICAtIEZhaWwgdG8gaW5pdGlhbGl6ZSB0aGUgaTJjCisgKiAgICAgICAwICAgLSBTdWNjZXNzCisgKi8KK2xvbmcgc3dJMkNJbml0KAorICAgIHVuc2lnbmVkIGNoYXIgaTJjQ2xrR1BJTywKKyAgICB1bnNpZ25lZCBjaGFyIGkyY0RhdGFHUElPCispCit7CisgICAgaW50IGk7CisKKyAgICAvKiBSZXR1cm4gMCBpZiB0aGUgR1BJTyBwaW5zIHRvIGJlIHVzZWQgaXMgb3V0IG9mIHJhbmdlLiBUaGUgcmFuZ2UgaXMgb25seSBmcm9tIFswLi42M10gKi8KKyAgICBpZiAoKGkyY0Nsa0dQSU8gPiAzMSkgfHwgKGkyY0RhdGFHUElPID4gMzEpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorICAgICAgICByZXR1cm4gc3dJMkNJbml0X1NNNzUwTEUoaTJjQ2xrR1BJTywgaTJjRGF0YUdQSU8pOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgR1BJTyBwaW4gZm9yIHRoZSBpMmMgQ2xvY2sgUmVnaXN0ZXIgKi8KKyAgICBnX2kyY0Nsa0dQSU9NdXhSZWcgPSBHUElPX01VWDsKKyAgICBnX2kyY0Nsa0dQSU9EYXRhUmVnID0gR1BJT19EQVRBOworICAgIGdfaTJjQ2xrR1BJT0RhdGFEaXJSZWcgPSBHUElPX0RBVEFfRElSRUNUSU9OOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgQ2xvY2sgR1BJTyBPZmZzZXQgKi8KKyAgICBnX2kyY0Nsb2NrR1BJTyA9IGkyY0Nsa0dQSU87CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBHUElPIHBpbiBmb3IgdGhlIGkyYyBEYXRhIFJlZ2lzdGVyICovCisgICAgZ19pMmNEYXRhR1BJT011eFJlZyA9IEdQSU9fTVVYOworICAgIGdfaTJjRGF0YUdQSU9EYXRhUmVnID0gR1BJT19EQVRBOworICAgIGdfaTJjRGF0YUdQSU9EYXRhRGlyUmVnID0gR1BJT19EQVRBX0RJUkVDVElPTjsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIERhdGEgR1BJTyBPZmZzZXQgKi8KKyAgICBnX2kyY0RhdGFHUElPID0gaTJjRGF0YUdQSU87CisKKyAgICAvKiBFbmFibGUgdGhlIEdQSU8gcGlucyBmb3IgdGhlIGkyYyBDbG9jayBhbmQgRGF0YSAoR1BJTyBNVVgpICovCisgICAgUE9LRTMyKGdfaTJjQ2xrR1BJT011eFJlZywKKyAgICAgICAgICAgICAgICAgICAgICBQRUVLMzIoZ19pMmNDbGtHUElPTXV4UmVnKSAmIH4oMSA8PCBnX2kyY0Nsb2NrR1BJTykpOworICAgIFBPS0UzMihnX2kyY0RhdGFHUElPTXV4UmVnLAorICAgICAgICAgICAgICAgICAgICAgIFBFRUszMihnX2kyY0RhdGFHUElPTXV4UmVnKSAmIH4oMSA8PCBnX2kyY0RhdGFHUElPKSk7CisKKyAgICAvKiBFbmFibGUgR1BJTyBwb3dlciAqLworICAgIGVuYWJsZUdQSU8oMSk7CisKKyAgICAvKiBDbGVhciB0aGUgaTJjIGxpbmVzLiAqLworICAgIGZvcihpPTA7IGk8OTsgaSsrKQorICAgICAgICBzd0kyQ1N0b3AoKTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNsYXZlIGRldmljZSdzIHJlZ2lzdGVyCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldmljZUFkZHJlc3MgICAtIGkyYyBTbGF2ZSBkZXZpY2UgYWRkcmVzcyB3aGljaCByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZWFkIGZyb20KKyAqICAgICAgcmVnaXN0ZXJJbmRleCAgIC0gU2xhdmUgZGV2aWNlJ3MgcmVnaXN0ZXIgdG8gYmUgcmVhZAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIFJlZ2lzdGVyIHZhbHVlCisgKi8KK3Vuc2lnbmVkIGNoYXIgc3dJMkNSZWFkUmVnKAorICAgIHVuc2lnbmVkIGNoYXIgZGV2aWNlQWRkcmVzcywKKyAgICB1bnNpZ25lZCBjaGFyIHJlZ2lzdGVySW5kZXgKKykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGE7CisKKyAgICAvKiBTZW5kIHRoZSBTdGFydCBzaWduYWwgKi8KKyAgICBzd0kyQ1N0YXJ0KCk7CisKKyAgICAvKiBTZW5kIHRoZSBkZXZpY2UgYWRkcmVzcyAqLworICAgIHN3STJDV3JpdGVCeXRlKGRldmljZUFkZHJlc3MpOworCisgICAgLyogU2VuZCB0aGUgcmVnaXN0ZXIgaW5kZXggKi8KKyAgICBzd0kyQ1dyaXRlQnl0ZShyZWdpc3RlckluZGV4KTsKKworICAgIC8qIEdldCB0aGUgYnVzIGFnYWluIGFuZCBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgZGV2aWNlIHJlYWQgYWRkcmVzcyAqLworICAgIHN3STJDU3RhcnQoKTsKKyAgICBzd0kyQ1dyaXRlQnl0ZShkZXZpY2VBZGRyZXNzICsgMSk7CisgICAgZGF0YSA9IHN3STJDUmVhZEJ5dGUoMSk7CisKKyAgICAvKiBTdG9wIHN3STJDIGFuZCByZWxlYXNlIHRoZSBidXMgKi8KKyAgICBzd0kyQ1N0b3AoKTsKKworICAgIHJldHVybiBkYXRhOworfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgdmFsdWUgdG8gdGhlIHNsYXZlIGRldmljZSdzIHJlZ2lzdGVyCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldmljZUFkZHJlc3MgICAtIGkyYyBTbGF2ZSBkZXZpY2UgYWRkcmVzcyB3aGljaCByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICAgICAgICB0byBiZSB3cml0dGVuCisgKiAgICAgIHJlZ2lzdGVySW5kZXggICAtIFNsYXZlIGRldmljZSdzIHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgZGF0YSAgICAgICAgICAgIC0gRGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSByZWdpc3RlcgorICoKKyAqICBSZXN1bHQ6CisgKiAgICAgICAgICAwICAgLSBTdWNjZXNzCisgKiAgICAgICAgIC0xICAgLSBGYWlsCisgKi8KK2xvbmcgc3dJMkNXcml0ZVJlZygKKyAgICB1bnNpZ25lZCBjaGFyIGRldmljZUFkZHJlc3MsCisgICAgdW5zaWduZWQgY2hhciByZWdpc3RlckluZGV4LAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YQorKQoreworICAgIGxvbmcgcmV0dXJuVmFsdWUgPSAwOworCisgICAgLyogU2VuZCB0aGUgU3RhcnQgc2lnbmFsICovCisgICAgc3dJMkNTdGFydCgpOworCisgICAgLyogU2VuZCB0aGUgZGV2aWNlIGFkZHJlc3MgYW5kIHJlYWQgdGhlIGRhdGEuIEFsbCBzaG91bGQgcmV0dXJuIHN1Y2Nlc3MKKyAgICAgICBpbiBvcmRlciBmb3IgdGhlIHdyaXRpbmcgcHJvY2Vzc2VkIHRvIGJlIHN1Y2Nlc3NmdWwKKyAgICAgKi8KKyAgICBpZiAoKHN3STJDV3JpdGVCeXRlKGRldmljZUFkZHJlc3MpICE9IDApIHx8CisgICAgICAgIChzd0kyQ1dyaXRlQnl0ZShyZWdpc3RlckluZGV4KSAhPSAwKSB8fAorICAgICAgICAoc3dJMkNXcml0ZUJ5dGUoZGF0YSkgIT0gMCkpCisgICAgeworICAgICAgICByZXR1cm5WYWx1ZSA9IC0xOworICAgIH0KKworICAgIC8qIFN0b3AgaTJjIGFuZCByZWxlYXNlIHRoZSBidXMgKi8KKyAgICBzd0kyQ1N0b3AoKTsKKworICAgIHJldHVybiByZXR1cm5WYWx1ZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1NDYzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IGJ5IFNpbGljb24gTW90aW9uLCBJbmMuIChTTUkpCisqCisqICBBbGwgcmlnaHRzIGFyZSByZXNlcnZlZC4gUmVwcm9kdWN0aW9uIG9yIGluIHBhcnQgaXMgcHJvaGliaXRlZAorKiAgd2l0aG91dCB0aGUgd3JpdHRlbiBjb25zZW50IG9mIHRoZSBjb3B5cmlnaHQgb3duZXIuCisqCisqICBzd2kyYy5oIC0tLSBTTTc1MC9TTTcxOCBEREsKKyogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIGkyYyB1c2luZyBzb2Z0d2FyZQorKiAgaW1wbGVtZW50YXRpb24uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfU1dJMkNfSF8KKyNkZWZpbmUgX1NXSTJDX0hfCisKKy8qIERlZmF1bHQgaTJjIENMSyBhbmQgRGF0YSBHUElPLiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgaTJjIHBpbnMgKi8KKyNkZWZpbmUgREVGQVVMVF9JMkNfU0NMICAgICAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9JMkNfU0RBICAgICAgICAgICAgICAgICAgICAgMzEKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGkyYyBhdHRyaWJ1dGVzIGFuZCBidXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBpMmNDbGtHUElPICAtIFRoZSBHUElPIHBpbiB0byBiZSB1c2VkIGFzIGkyYyBTQ0wKKyAqICAgICAgaTJjRGF0YUdQSU8gLSBUaGUgR1BJTyBwaW4gdG8gYmUgdXNlZCBhcyBpMmMgU0RBCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAtMSAgIC0gRmFpbCB0byBpbml0aWFsaXplIHRoZSBpMmMKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MKKyAqLworbG9uZyBzd0kyQ0luaXQoCisgICAgdW5zaWduZWQgY2hhciBpMmNDbGtHUElPLAorICAgIHVuc2lnbmVkIGNoYXIgaTJjRGF0YUdQSU8KKyk7CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc2xhdmUgZGV2aWNlJ3MgcmVnaXN0ZXIKKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2aWNlQWRkcmVzcyAgIC0gaTJjIFNsYXZlIGRldmljZSBhZGRyZXNzIHdoaWNoIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlYWQgZnJvbQorICogICAgICByZWdpc3RlckluZGV4ICAgLSBTbGF2ZSBkZXZpY2UncyByZWdpc3RlciB0byBiZSByZWFkCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgUmVnaXN0ZXIgdmFsdWUKKyAqLwordW5zaWduZWQgY2hhciBzd0kyQ1JlYWRSZWcoCisgICAgdW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLAorICAgIHVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJJbmRleAorKTsKKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHZhbHVlIHRvIHRoZSBzbGF2ZSBkZXZpY2UncyByZWdpc3RlcgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZpY2VBZGRyZXNzICAgLSBpMmMgU2xhdmUgZGV2aWNlIGFkZHJlc3Mgd2hpY2ggcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgd3JpdHRlbgorICogICAgICByZWdpc3RlckluZGV4ICAgLSBTbGF2ZSBkZXZpY2UncyByZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiAgICAgIGRhdGEgICAgICAgICAgICAtIERhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgcmVnaXN0ZXIKKyAqCisgKiAgUmVzdWx0OgorICogICAgICAgICAgMCAgIC0gU3VjY2VzcworICogICAgICAgICAtMSAgIC0gRmFpbAorICovCitsb25nIHN3STJDV3JpdGVSZWcoCisgICAgdW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLAorICAgIHVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJJbmRleCwKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGEKKyk7CisKKy8qCisgKiAgVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byB0b2dnbGUgdGhlIGRhdGEgb24gdGhlIFNDTCBhbmQgU0RBIEkyQyBsaW5lcy4KKyAqICBUaGUgdXNlZCBvZiB0aGVzZSB0d28gZnVuY3Rpb25zIGFyZSBub3QgcmVjb21tZW5kZWQgdW5sZXNzIGl0IGlzIG5lY2Vzc2FyeS4KKyAqLworCisvKgorICogIFRoaXMgZnVuY3Rpb24gc2V0L3Jlc2V0IHRoZSBTQ0wgR1BJTyBwaW4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdmFsdWUJLSBCaXQgdmFsdWUgdG8gc2V0IHRvIHRoZSBTQ0wgb3IgU0RBICgwID0gbG93LCAxID0gaGlnaCkKKyAqLwordm9pZCBzd0kyQ1NDTCh1bnNpZ25lZCBjaGFyIHZhbHVlKTsKKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHNldC9yZXNldCB0aGUgU0RBIEdQSU8gcGluCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHZhbHVlCS0gQml0IHZhbHVlIHRvIHNldCB0byB0aGUgU0NMIG9yIFNEQSAoMCA9IGxvdywgMSA9IGhpZ2gpCisgKi8KK3ZvaWQgc3dJMkNTREEodW5zaWduZWQgY2hhciB2YWx1ZSk7CisKKyNlbmRpZiAgLyogX1NXSTJDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9tb2RlZGIuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL21vZGVkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Mjc1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9tb2RlZGIuaApAQCAtMCwwICsxLDIyMSBAQAorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBtb2RlZGIyW10gPSB7CisgICAgeworCS8qIDY0MHg0MDAgQCA3MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MCwgNjQwLCA0MDAsIDM5NzIxLCA0MCwgMjQsIDM5LCA5LCA5NiwgMiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDY0MHg0ODAgQCA2MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NzIxLCA0MCwgMjQsIDMyLCAxMSwgOTYsIDIsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiA4MDB4NjAwIEAgNTYgSHosIDM1LjE1IGtIeiBoc3luYyAqLworCU5VTEwsIDU2LCA4MDAsIDYwMCwgMjc3NzcsIDEyOCwgMjQsIDIyLCAxLCA3MiwgMiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEwMjR4NzY4IEAgODcgSHogaW50ZXJsYWNlZCwgMzUuNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA4NywgMTAyNCwgNzY4LCAyMjI3MSwgNTYsIDI0LCAzMywgOCwgMTYwLCA4LAorCTAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogNjQweDQwMCBAIDg1IEh6LCAzNy44NiBrSHogaHN5bmMgKi8KKwlOVUxMLCA4NSwgNjQwLCA0MDAsIDMxNzQ2LCA5NiwgMzIsIDQxLCAxLCA2NCwgMywKKwlGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogNjQweDQ4MCBAIDcyIEh6LCAzNi41IGtIeiBoc3luYyAqLworCU5VTEwsIDcyLCA2NDAsIDQ4MCwgMzE3NDYsIDE0NCwgNDAsIDMwLCA4LCA0MCwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDY0MHg0ODAgQCA3NSBIeiwgMzcuNTAga0h6IGhzeW5jICovCisJTlVMTCwgNzUsIDY0MCwgNDgwLCAzMTc0NiwgMTIwLCAxNiwgMTYsIDEsIDY0LCAzLAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogODAweDYwMCBAIDYwIEh6LCAzNy44IGtIeiBoc3luYyAqLworCU5VTEwsIDYwLCA4MDAsIDYwMCwgMjUwMDAsIDg4LCA0MCwgMjMsIDEsIDEyOCwgNCwKKwlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogNjQweDQ4MCBAIDg1IEh6LCA0My4yNyBrSHogaHN5bmMgKi8KKwlOVUxMLCA4NSwgNjQwLCA0ODAsIDI3Nzc3LCA4MCwgNTYsIDI1LCAxLCA1NiwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDExNTJ4ODY0IEAgODkgSHogaW50ZXJsYWNlZCwgNDQga0h6IGhzeW5jICovCisJTlVMTCwgNjksIDExNTIsIDg2NCwgMTUzODQsIDk2LCAxNiwgMTEwLCAxLCAyMTYsIDEwLAorCTAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogODAweDYwMCBAIDcyIEh6LCA0OC4wIGtIeiBoc3luYyAqLworCU5VTEwsIDcyLCA4MDAsIDYwMCwgMjAwMDAsIDY0LCA1NiwgMjMsIDM3LCAxMjAsIDYsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEwMjR4NzY4IEAgNjAgSHosIDQ4LjQga0h6IGhzeW5jICovCisJTlVMTCwgNjAsIDEwMjQsIDc2OCwgMTUzODQsIDE2OCwgOCwgMjksIDMsIDE0NCwgNiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDY0MHg0ODAgQCAxMDAgSHosIDUzLjAxIGtIeiBoc3luYyAqLworCU5VTEwsIDEwMCwgNjQwLCA0ODAsIDIxODM0LCA5NiwgMzIsIDM2LCA4LCA5NiwgNiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDExNTJ4ODY0IEAgNjAgSHosIDUzLjUga0h6IGhzeW5jICovCisJTlVMTCwgNjAsIDExNTIsIDg2NCwgMTExMjMsIDIwOCwgNjQsIDE2LCA0LCAyNTYsIDgsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiA4MDB4NjAwIEAgODUgSHosIDU1Ljg0IGtIeiBoc3luYyAqLworCU5VTEwsIDg1LCA4MDAsIDYwMCwgMTY0NjAsIDE2MCwgNjQsIDM2LCAxNiwgNjQsIDUsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDcwIEh6LCA1Ni41IGtIeiBoc3luYyAqLworCU5VTEwsIDcwLCAxMDI0LCA3NjgsIDEzMzMzLCAxNDQsIDI0LCAyOSwgMywgMTM2LCA2LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisgICAgICAgIC8qICAxMjgweDk2MC02MCBWRVNBICovCisgICAgICAgIE5VTEwsIDYwLCAxMjgwLCA5NjAsIDkyNTksIDMxMiwgOTYsIDM2LCAxLCAxMTIsIDMsCisgICAgICAgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULCAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBCisgICAgfSwgeworICAgICAgICAvKiAgMTI4MHgxMDI0LTYwIFZFU0EgKi8KKyAgICAgICAgTlVMTCwgNjAsIDEyODAsIDEwMjQsIDkyNTksIDI0OCwgNDgsIDM4LCAxLCAxMTIsIDMsCisgICAgICAgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EKKyAgICB9LCB7CisJLyogMTI4MHgxMDI0IEAgODcgSHogaW50ZXJsYWNlZCwgNTEga0h6IGhzeW5jICovCisJTlVMTCwgODcsIDEyODAsIDEwMjQsIDEyNTAwLCA1NiwgMTYsIDEyOCwgMSwgMjE2LCAxMiwKKwkwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDgwMHg2MDAgQCAxMDAgSHosIDY0LjAyIGtIeiBoc3luYyAqLworCU5VTEwsIDEwMCwgODAwLCA2MDAsIDE0MzU3LCAxNjAsIDY0LCAzMCwgNCwgNjQsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDc2IEh6LCA2Mi41IGtIeiBoc3luYyAqLworCU5VTEwsIDc2LCAxMDI0LCA3NjgsIDExNzY0LCAyMDgsIDgsIDM2LCAxNiwgMTIwLCAzLAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTE1Mng4NjQgQCA3MCBIeiwgNjIuNCBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MCwgMTE1MiwgODY0LCAxMDg2OSwgMTA2LCA1NiwgMjAsIDEsIDE2MCwgMTAsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMjgweDEwMjQgQCA2MSBIeiwgNjQuMiBrSHogaHN5bmMgKi8KKwlOVUxMLCA2MSwgMTI4MCwgMTAyNCwgOTA5MCwgMjAwLCA0OCwgMjYsIDEsIDE4NCwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE0MDB4MTA1MCBAIDYwSHosIDYzLjkga0h6IGhzeW5jICovCisJTlVMTCwgNjgsIDE0MDAsIDEwNTAsIDkyNTksIDEzNiwgNDAsIDEzLCAxLCAxMTIsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxNDAweDEwNTAgQCA3NSwxMDcgSHosIDgyLDM5MiBrSHogK2hzeW5jICt2c3luYyovCisJTlVMTCwgNzUsIDE0MDAsIDEwNTAsIDkyNzEsIDEyMCwgNTYsIDEzLCAwLCAxMTIsIDMsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE0MDB4MTA1MCBAIDYwIEh6LCA/IGtIeiAraHN5bmMgK3ZzeW5jKi8KKyAgICAgICAgTlVMTCwgNjAsIDE0MDAsIDEwNTAsIDkyNTksIDEyOCwgNDAsIDEyLCAwLCAxMTIsIDMsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEwMjR4NzY4IEAgODUgSHosIDcwLjI0IGtIeiBoc3luYyAqLworCU5VTEwsIDg1LCAxMDI0LCA3NjgsIDEwMTExLCAxOTIsIDMyLCAzNCwgMTQsIDE2MCwgNiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDExNTJ4ODY0IEAgNzggSHosIDcwLjgga0h6IGhzeW5jICovCisJTlVMTCwgNzgsIDExNTIsIDg2NCwgOTA5MCwgMjI4LCA4OCwgMzIsIDAsIDg0LCAxMiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEyODB4MTAyNCBAIDcwIEh6LCA3NC41OSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MCwgMTI4MCwgMTAyNCwgNzkwNSwgMjI0LCAzMiwgMjgsIDgsIDE2MCwgOCwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE2MDB4MTIwMCBAIDYwSHosIDc1LjAwIGtIeiBoc3luYyAqLworCU5VTEwsIDYwLCAxNjAwLCAxMjAwLCA2MTcyLCAzMDQsIDY0LCA0NiwgMSwgMTkyLCAzLAorCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMTUyeDg2NCBAIDg0IEh6LCA3Ni4wIGtIeiBoc3luYyAqLworCU5VTEwsIDg0LCAxMTUyLCA4NjQsIDc0MDcsIDE4NCwgMzEyLCAzMiwgMCwgMTI4LCAxMiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEyODB4MTAyNCBAIDc0IEh6LCA3OC44NSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3NCwgMTI4MCwgMTAyNCwgNzQwNywgMjU2LCAzMiwgMzQsIDMsIDE0NCwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEwMjR4NzY4IEAgMTAwSHosIDgwLjIxIGtIeiBoc3luYyAqLworCU5VTEwsIDEwMCwgMTAyNCwgNzY4LCA4NjU4LCAxOTIsIDMyLCAyMSwgMywgMTkyLCAxMCwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEyODB4MTAyNCBAIDc2IEh6LCA4MS4xMyBrSHogaHN5bmMgKi8KKwlOVUxMLCA3NiwgMTI4MCwgMTAyNCwgNzQwNywgMjQ4LCAzMiwgMzQsIDMsIDEwNCwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE2MDB4MTIwMCBAIDcwIEh6LCA4Ny41MCBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MCwgMTYwMCwgMTIwMCwgNTI5MSwgMzA0LCA2NCwgNDYsIDEsIDE5MiwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDExNTJ4ODY0IEAgMTAwIEh6LCA4OS42MiBrSHogaHN5bmMgKi8KKwlOVUxMLCAxMDAsIDExNTIsIDg2NCwgNzI2NCwgMjI0LCAzMiwgMTcsIDIsIDEyOCwgMTksCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMjgweDEwMjQgQCA4NSBIeiwgOTEuMTUga0h6IGhzeW5jICovCisJTlVMTCwgODUsIDEyODAsIDEwMjQsIDYzNDksIDIyNCwgNjQsIDQ0LCAxLCAxNjAsIDMsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE2MDB4MTIwMCBAIDc1IEh6LCA5My43NSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3NSwgMTYwMCwgMTIwMCwgNDkzOCwgMzA0LCA2NCwgNDYsIDEsIDE5MiwgMywKKwlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTYwMHgxMjAwIEAgODUgSHosIDEwNS43NyBrSHogaHN5bmMgKi8KKwlOVUxMLCA4NSwgMTYwMCwgMTIwMCwgNDU0NSwgMjcyLCAxNiwgMzcsIDQsIDE5MiwgMywKKwlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTI4MHgxMDI0IEAgMTAwIEh6LCAxMDcuMTYga0h6IGhzeW5jICovCisJTlVMTCwgMTAwLCAxMjgwLCAxMDI0LCA1NTAyLCAyNTYsIDMyLCAyNiwgNywgMTI4LCAxNSwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE4MDB4MTQ0MCBAIDY0SHosIDk2LjE1IGtIeiBoc3luYyAgKi8KKwlOVUxMLCA2NCwgMTgwMCwgMTQ0MCwgNDM0NywgMzA0LCA5NiwgNDYsIDEsIDE5MiwgMywKKwlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTgwMHgxNDQwIEAgNzBIeiwgMTA0LjUyIGtIeiBoc3luYyAgKi8KKwlOVUxMLCA3MCwgMTgwMCwgMTQ0MCwgNDAwMCwgMzA0LCA5NiwgNDYsIDEsIDE5MiwgMywKKwlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogNTEyeDM4NCBAIDc4IEh6LCAzMS41MCBrSHogaHN5bmMgKi8KKwlOVUxMLCA3OCwgNTEyLCAzODQsIDQ5NjAzLCA0OCwgMTYsIDE2LCAxLCA2NCwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDUxMngzODQgQCA4NSBIeiwgMzQuMzgga0h6IGhzeW5jICovCisJTlVMTCwgODUsIDUxMiwgMzg0LCA0NTQ1NCwgNDgsIDE2LCAxNiwgMSwgNjQsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAzMjB4MjAwIEAgNzAgSHosIDMxLjUga0h6IGhzeW5jLCA4OjUgYXNwZWN0IHJhdGlvICovCisJTlVMTCwgNzAsIDMyMCwgMjAwLCA3OTQ0MCwgMTYsIDE2LCAyMCwgNCwgNDgsIDEsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwgeworCS8qIDMyMHgyNDAgQCA2MCBIeiwgMzEuNSBrSHogaHN5bmMsIDQ6MyBhc3BlY3QgcmF0aW8gKi8KKwlOVUxMLCA2MCwgMzIwLCAyNDAsIDc5NDQwLCAxNiwgMTYsIDE2LCA1LCA0OCwgMSwKKwkwLCBGQl9WTU9ERV9ET1VCTEUKKyAgICB9LCB7CisJLyogMzIweDI0MCBAIDcyIEh6LCAzNi41IGtIeiBoc3luYyAqLworCU5VTEwsIDcyLCAzMjAsIDI0MCwgNjM0OTIsIDE2LCAxNiwgMTYsIDQsIDQ4LCAyLAorCTAsIEZCX1ZNT0RFX0RPVUJMRQorICAgIH0sIHsKKwkvKiA0MDB4MzAwIEAgNTYgSHosIDM1LjIga0h6IGhzeW5jLCA0OjMgYXNwZWN0IHJhdGlvICovCisJTlVMTCwgNTYsIDQwMCwgMzAwLCA1NTU1NSwgNjQsIDE2LCAxMCwgMSwgMzIsIDEsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwgeworCS8qIDQwMHgzMDAgQCA2MCBIeiwgMzcuOCBrSHogaHN5bmMgKi8KKwlOVUxMLCA2MCwgNDAwLCAzMDAsIDUwMDAwLCA0OCwgMTYsIDExLCAxLCA2NCwgMiwKKwkwLCBGQl9WTU9ERV9ET1VCTEUKKyAgICB9LCB7CisJLyogNDAweDMwMCBAIDcyIEh6LCA0OC4wIGtIeiBoc3luYyAqLworCU5VTEwsIDcyLCA0MDAsIDMwMCwgNDAwMDAsIDMyLCAyNCwgMTEsIDE5LCA2NCwgMywKKwkwLCBGQl9WTU9ERV9ET1VCTEUKKyAgICB9LCB7CisJLyogNDgweDMwMCBAIDU2IEh6LCAzNS4yIGtIeiBoc3luYywgODo1IGFzcGVjdCByYXRpbyAqLworCU5VTEwsIDU2LCA0ODAsIDMwMCwgNDYxNzYsIDgwLCAxNiwgMTAsIDEsIDQwLCAxLAorCTAsIEZCX1ZNT0RFX0RPVUJMRQorICAgIH0sIHsKKwkvKiA0ODB4MzAwIEAgNjAgSHosIDM3Ljgga0h6IGhzeW5jICovCisJTlVMTCwgNjAsIDQ4MCwgMzAwLCA0MTg1OCwgNTYsIDE2LCAxMSwgMSwgODAsIDIsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwgeworCS8qIDQ4MHgzMDAgQCA2MyBIeiwgMzkuNiBrSHogaHN5bmMgKi8KKwlOVUxMLCA2MywgNDgwLCAzMDAsIDQwMDAwLCA1NiwgMTYsIDExLCAxLCA4MCwgMiwKKwkwLCBGQl9WTU9ERV9ET1VCTEUKKyAgICB9LCB7CisJLyogNDgweDMwMCBAIDcyIEh6LCA0OC4wIGtIeiBoc3luYyAqLworCU5VTEwsIDcyLCA0ODAsIDMwMCwgMzMzODYsIDQwLCAyNCwgMTEsIDE5LCA4MCwgMywKKwkwLCBGQl9WTU9ERV9ET1VCTEUKKyAgICB9LAorfTsKK3N0YXRpYyBjb25zdCBpbnQgbm1vZGVkYjIgPSBzaXplb2YobW9kZWRiMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9yZWFkbWUgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5YWY3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3JlYWRtZQpAQCAtMCwwICsxLDM4IEBACitJbnRyb2R1Y3Rpb246CisJU003NTAgb2YgU2lsaWNvbiBNT3Rpb24gaXMgcGNpIGV4cHJlc3MgZGlzcGxheSBjb250cm9sbGVyIGRldmljZS4KKwlUaGUgU003NTAgZW1iZWRkZWQgZ3JhcGhpY3MgZmVhdHVyZXMgaW5jbHVkZToKKwktIGR1YWwgZGlzcGxheQorCS0gMkQgYWNjZWxlcmF0aW9uCisJLSAxNk1CIGludGVncmF0ZWQgdmlkZW8gbWVtb3J5CisKK0Fib3V0IHRoZSBrZXJuZWwgbW9kdWxlIHBhcmFtdGVyIG9mIGRyaXZlcjoKKworCVVzZSAxMjgwLDhicHAgaW5kZXggY29sb3IgYW5kIDYwIGh6IG1vZGU6CisJaW5zbW9kIC4vc203NTBmYi5rbyBnX29wdGlvbj0iMTI4MHgxMDI0LThANjAiCisKKwlEaXNhYmxlIE1UUlIsRGlzYWJsZSAyZCBhY2NlbGVyYXRpb24sRGlzYWJsZSBoYXJkd2FyZSBjdXJzb3IsCisJYW5kIHVzZSBhIDgwMHg2MDAgbW9kZSA6CisJaW5zbW9kIC4vc203NTBmYi5rbyBnX29wdGlvbj0ibm9hY2NlbDpub210cnI6bm9od2M6ODAweDYwMCIKKworCWR1YWwgZnJhbWUgYnVmZmVyIGZvciBkcml2ZXIgd2l0aCAiZHVhbCIgcGFyYW1ldGVyCisJaW5zbW9kIC4vc203NTBmYi5rbyBnX29wdGlvbj0iZHVhbCw4MDB4NjAwOjEwMjR4NzY4IgorCWl0IHdpbGwgY3JlYXRlIGZiMCBhbmQgZmIxIChvciBmYjEsZmIyIGlmIGZiMCBhbHJlYWR5IGV4aXN0KSB1bmRlciAvZGV2CisJYW5kIHVzZXIgY2FuIHVzZSBjb24yZmIgdG8gbGluayBmYlggYW5kIHR0eVgKKworCU5vdGVzOgorCTEpIGlmIHlvdSBidWlsZCB0aGUgZHJpdmVyIHdpdGggYnVpbHQtaW4gbWV0aG9kLCB0aGUgcGFyYW10ZXIKKwkJeW91IGVkaXRlZCBpbiB0aGUgZ3J1YiBjb25maWcgZmlsZSB3aWxsIGJlIGFsc28gdGhlCisJCXNhbWUgZm9ybWF0IGFzIGFib3ZlIG1vZHVsYXIgbWV0aG9kLGJ1dCBhZGRpdGlvbmFseSBhZGQKKwkJInZpZGVvPXNtNzUwZmI6IgorCQlhaGVhZCBvZiBwYXJhbWV0ZXJzLHNvLGl0IGxvb2tzIGxpa2U6CisJCXZpZGVvPXNtNzUwZmI6bm9hY2NlbCwxMjgweDEwMjRANjAsb3RoZXJwYXJhbSxldGMuLi4KKwkJaXQgZXF1YWwgdG8gbW9kdWxhciBtZXRob2Qgd2l0aCBiZWxvdyBjb21tYW5kOgorCQlpbnNtb2QgLi9zbTc1MGZiLmtvIGdfb3B0aW9uPSJub2FjY2VsOjEyODB4MTAyNEA2MDpvdGhlcnBhcm06ZXRjLi4uIgorCisJMikgaWYgeW91IHB1dCA4MDB4NjAwIGludG8gdGhlIHBhcmFtdGVyIHdpdGhvdXQgYnBwIGFuZAorCQlyZWZyZXNoIHJhdGUsIGtlcm5lbCBkcml2ZXIgd2lsbCBkZWZhdWx0eSB1c2UgMTZicHAgYW5kIDYwaHoKKworSW1wb3J0YW50OgorCWlmIHlvdSBoYXZlIHZlc2FmYiBlbmFibGVkIGluIHlvdXIgY29uZmlnIHRoZW4gL2Rldi9mYjAgd2lsbCBiZSBjcmVhdGVkIGJ5IHZlc2FmYgorCWFuZCB0aGlzIGRyaXZlciB3aWxsIHVzZSBmYjEsIGZiMi4gSW4gdGhhdCBjYXNlLCB5b3UgbmVlZCB0byBjb25maWd1cmUgeW91ciBYLXNlcnZlcgorCXRvIHVzZSBmYjEuIEFub3RoZXIgc2ltcGxlIGFsdGhlcm5hdGl2ZSBpcyB0byBkaXNhYmxlIHZlc2FmYiBmcm9tIHlvdXIgY29uZmlnLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3ZWE5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMKQEAgLTAsMCArMSwxNDAzIEBACisjaW5jbHVkZTxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGU8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGU8bGludXgvbW0uaD4KKyNpbmNsdWRlPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZTxsaW51eC9mYi5oPgorI2luY2x1ZGU8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZTxsaW51eC9pbml0Lmg+CisjaW5jbHVkZTxsaW51eC9wY2kuaD4KKyNpbmNsdWRlPGxpbnV4L21tX3R5cGVzLmg+CisjaW5jbHVkZTxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZTxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZTxsaW51eC9zY3JlZW5faW5mby5oPgorI2luY2x1ZGU8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGU8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpZmRlZiBDT05GSUdfTVRSUgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc20vZmIuaD4KKyNpbmNsdWRlICJzbTc1MC5oIgorI2luY2x1ZGUgInNtNzUwX2h3LmgiCisjaW5jbHVkZSAic203NTBfYWNjZWwuaCIKKyNpbmNsdWRlICJzbTc1MF9jdXJzb3IuaCIKKworI2luY2x1ZGUgIm1vZGVkYi5oIgorCitpbnQgc21pX2luZGVudCA9IDA7CisKKworLyoKKyAqICNpZmRlZiBfX0JJR19FTkRJQU4KKyAqIHNzaXplX3QgbHlueGZiX29wc193cml0ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKyAqIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKyAqIHNzaXplX3QgbHlueGZiX29wc19yZWFkKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjaGFyIF9fdXNlciAqYnVmLAorICogc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworICogI2VuZGlmCisgKi8KKwordHlwZWRlZiB2b2lkICgqUFJPQ19TUEVDX1NFVFVQKShzdHJ1Y3QgbHlueF9zaGFyZSosIGNoYXIgKik7Cit0eXBlZGVmIGludCAoKlBST0NfU1BFQ19NQVApKHN0cnVjdCBseW54X3NoYXJlKiwgc3RydWN0IHBjaV9kZXYqKTsKK3R5cGVkZWYgaW50ICgqUFJPQ19TUEVDX0lOSVRIVykoc3RydWN0IGx5bnhfc2hhcmUqLCBzdHJ1Y3QgcGNpX2RldiopOworCisKKy8qIGNvbW1vbiB2YXIgZm9yIGFsbCBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgZ19od2N1cnNvciA9IDE7CitzdGF0aWMgaW50IGdfbm9hY2NlbDsKKyNpZmRlZiBDT05GSUdfTVRSUgorc3RhdGljIGludCBnX25vbXRycjsKKyNlbmRpZgorc3RhdGljIGNvbnN0IGNoYXIgKmdfZmJtb2RlW10gPSB7TlVMTCwgTlVMTH07CitzdGF0aWMgY29uc3QgY2hhciAqZ19kZWZfZmJtb2RlID0gIjgwMHg2MDAtMTZANjAiOworc3RhdGljIGNoYXIgKmdfc2V0dGluZ3MgPSBOVUxMOworc3RhdGljIGludCBnX2R1YWx2aWV3Oworc3RhdGljIGNoYXIgKmdfb3B0aW9uID0gTlVMTDsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBseW54NzUwX2V4dFtdID0geworCS8qCTEwMjR4NjAwLTYwIFZFU0EJWzEuNzE6MV0gKi8KKwl7TlVMTCwgIDYwLCAxMDI0LCA2MDAsIDIwNDIzLCAxNDQsICA0MCwgMTgsIDEsIDEwNCwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTAyNHg2MDAtNzAgVkVTQSAqLworCXtOVUxMLCAgNzAsIDEwMjQsIDYwMCwgMTcyMTEsIDE1MiwgIDQ4LCAyMSwgMSwgMTA0LCAzLAorCSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgRkJfVk1PREVfTk9OSU5URVJMQUNFRH0sCisKKwkvKgkxMDI0eDYwMC03NSBWRVNBICovCisJe05VTEwsICA3NSwgMTAyNCwgNjAwLCAxNTgyMiwgMTYwLCAgNTYsIDIzLCAxLCAxMDQsIDMsCisJIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTEwMjR4NjAwLTg1IFZFU0EgKi8KKwl7TlVMTCwgIDg1LCAxMDI0LCA2MDAsIDEzNzMwLCAxNjgsICA1NiwgMjYsIDEsIDExMiwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJNzIweDQ4MAkqLworCXtOVUxMLCA2MCwgIDcyMCwgIDQ4MCwgIDM3NDI3LCA4OCwgICAxNiwgMTMsIDEsICAgNzIsICAzLAorCSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgRkJfVk1PREVfTk9OSU5URVJMQUNFRH0sCisKKwkvKgkxMjgweDcyMAkJWzEuNzg6MV0JKi8KKwl7TlVMTCwgNjAsICAxMjgwLCAgNzIwLCAgMTM0MjYsIDE2MiwgODYsIDIyLCAxLCAgMTM2LCAzLAorCSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgRkJfVk1PREVfTk9OSU5URVJMQUNFRH0sCisKKwkvKgkxMjgweDc2OEA2MCAqLworCXtOVUxMLCA2MCwgMTI4MCwgNzY4LCAxMjU3OSwgMTkyLCA2NCwgMjAsIDMsIDEyOCwgNywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJe05VTEwsIDYwLCAxMzYwLCA3NjgsIDExODA0LCAyMDgsIDY0LCAyMywgMSwgMTQ0LCAzLAorCSBGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTEzNjAgeCA3NjgJWzEuNzcwODM6MV0JKi8KKwl7TlVMTCwgIDYwLCAxMzYwLCA3NjgsIDExODA0LCAyMDgsICA2NCwgMjMsIDEsIDE0NCwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTM2OCB4IDc2OCAgICAgIFsxLjc4OjFdCSovCisJe05VTEwsIDYwLCAgMTM2OCwgIDc2OCwgIDExNjQ3LCAyMTYsIDcyLCAyMywgMSwgIDE0NCwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTQ0MCB4IDkwMAkJWzE2OjEwXQkqLworCXtOVUxMLCA2MCwgMTQ0MCwgOTAwLCA5MzkyLCAyMzIsIDgwLCAyOCwgMSwgMTUyLCAzLAorCSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTQ0MHg5NjAJCVsxNToxMF0JKi8KKwl7TlVMTCwgNjAsIDE0NDAsIDk2MCwgODczMywgMjQwLCA4OCwgMzAsIDEsIDE1MiwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTkyMHgxMDgwCVsxNjo5XQkqLworCXtOVUxMLCA2MCwgMTkyMCwgMTA4MCwgNjczNCwgMTQ4LCA4OCwgNDEsIDEsIDQ0LCAzLAorCSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorfTsKKworCisKKworLyogbm8gaGFyZHdhcmUgY3Vyc29yIHN1cHBvcnRlZCB1bmRlciB2ZXJzaW9uIDIuNi4xMCwga2VybmVsIGJ1ZyAqLworc3RhdGljIGludCBseW54ZmJfb3BzX2N1cnNvcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX2N1cnNvciAqZmJjdXJzb3IpCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGM7CisJc3RydWN0IGx5bnhfY3Vyc29yICpjdXJzb3I7CisKKwlwYXIgPSBpbmZvLT5wYXI7CisJY3J0YyA9ICZwYXItPmNydGM7CisJY3Vyc29yID0gJmNydGMtPmN1cnNvcjsKKworCWlmIChmYmN1cnNvci0+aW1hZ2Uud2lkdGggPiBjdXJzb3ItPm1heFcgfHwKKwkgICBmYmN1cnNvci0+aW1hZ2UuaGVpZ2h0ID4gY3Vyc29yLT5tYXhIIHx8CisJICAgZmJjdXJzb3ItPmltYWdlLmRlcHRoID4gMSkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWN1cnNvci0+ZGlzYWJsZShjdXJzb3IpOworCWlmIChmYmN1cnNvci0+c2V0ICYgRkJfQ1VSX1NFVFNJWkUpCisJCWN1cnNvci0+c2V0U2l6ZShjdXJzb3IsCisJCQkJZmJjdXJzb3ItPmltYWdlLndpZHRoLAorCQkJCWZiY3Vyc29yLT5pbWFnZS5oZWlnaHQpOworCisJaWYgKGZiY3Vyc29yLT5zZXQgJiBGQl9DVVJfU0VUUE9TKQorCQljdXJzb3ItPnNldFBvcyhjdXJzb3IsCisJCQkgICAgICAgZmJjdXJzb3ItPmltYWdlLmR4IC0gaW5mby0+dmFyLnhvZmZzZXQsCisJCQkgICAgICAgZmJjdXJzb3ItPmltYWdlLmR5IC0gaW5mby0+dmFyLnlvZmZzZXQpOworCisJaWYgKGZiY3Vyc29yLT5zZXQgJiBGQl9DVVJfU0VUQ01BUCkgeworCQkvKiBnZXQgdGhlIDE2Yml0IGNvbG9yIG9mIGtlcm5lbCBtZWFucyAqLworCQl1MTYgZmcsIGJnOworCisJCWZnID0gKChpbmZvLT5jbWFwLnJlZFtmYmN1cnNvci0+aW1hZ2UuZmdfY29sb3JdICYgMHhmODAwKSl8CisJCSAgICAgICgoaW5mby0+Y21hcC5ncmVlbltmYmN1cnNvci0+aW1hZ2UuZmdfY29sb3JdICYgMHhmYzAwKSA+PiA1KXwKKwkJICAgICAgKChpbmZvLT5jbWFwLmJsdWVbZmJjdXJzb3ItPmltYWdlLmZnX2NvbG9yXSAmIDB4ZjgwMCkgPj4gMTEpOworCisJCWJnID0gKChpbmZvLT5jbWFwLnJlZFtmYmN1cnNvci0+aW1hZ2UuYmdfY29sb3JdICYgMHhmODAwKSl8CisJCSAgICAgICgoaW5mby0+Y21hcC5ncmVlbltmYmN1cnNvci0+aW1hZ2UuYmdfY29sb3JdICYgMHhmYzAwKSA+PiA1KXwKKwkJICAgICAgKChpbmZvLT5jbWFwLmJsdWVbZmJjdXJzb3ItPmltYWdlLmJnX2NvbG9yXSAmIDB4ZjgwMCkgPj4gMTEpOworCisJCWN1cnNvci0+c2V0Q29sb3IoY3Vyc29yLCBmZywgYmcpOworCX0KKworCisJaWYgKGZiY3Vyc29yLT5zZXQgJiAoRkJfQ1VSX1NFVFNIQVBFIHwgRkJfQ1VSX1NFVElNQUdFKSkgeworCQljdXJzb3ItPnNldERhdGEoY3Vyc29yLAorCQkJCWZiY3Vyc29yLT5yb3AsCisJCQkJZmJjdXJzb3ItPmltYWdlLmRhdGEsCisJCQkJZmJjdXJzb3ItPm1hc2spOworCX0KKworCWlmIChmYmN1cnNvci0+ZW5hYmxlKQorCQljdXJzb3ItPmVuYWJsZShjdXJzb3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGx5bnhmYl9vcHNfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWdpb24pCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmU7CisJdW5zaWduZWQgaW50IGJhc2UsIHBpdGNoLCBCcHAsIHJvcDsKKwl1MzIgY29sb3I7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKworCXBhciA9IGluZm8tPnBhcjsKKwlzaGFyZSA9IHBhci0+c2hhcmU7CisKKwkvKiBlYWNoIHRpbWUgMmQgZnVuY3Rpb24gYmVnaW4gdG8gd29yayxiZWxvdyB0aHJlZSB2YXJpYWJsZSBhbHdheXMgbmVlZAorCSAqIGJlIHNldCwgc2VlbXMgd2UgY2FuIHB1dCB0aGVtIHRvZ2V0aGVyIGluIHNvbWUgcGxhY2UgICovCisJYmFzZSA9IHBhci0+Y3J0Yy5vU2NyZWVuOworCXBpdGNoID0gaW5mby0+Zml4LmxpbmVfbGVuZ3RoOworCUJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA+PiAzOworCisJY29sb3IgPSAoQnBwID09IDEpP3JlZ2lvbi0+Y29sb3I6KCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnaW9uLT5jb2xvcl07CisJcm9wID0gKHJlZ2lvbi0+cm9wICE9IFJPUF9DT1BZKSA/IEhXX1JPUDJfWE9SOkhXX1JPUDJfQ09QWTsKKworCS8qCisJICogSWYgbm90IHVzZSBzcGluX2xvY2ssc3lzdGVtIHdpbGwgZGllIGlmIHVzZXIgbG9hZCBkcml2ZXIKKwkgKiBhbmQgaW1tZWRpYXRseSB1bmxvYWQgZHJpdmVyIGZyZXF1ZW50bHkgKGR1YWwpCisJICovCisJaWYgKHNoYXJlLT5kdWFsKQorCQlzcGluX2xvY2soJnNoYXJlLT5zbG9jayk7CisKKwlzaGFyZS0+YWNjZWwuZGVfZmlsbHJlY3QoJnNoYXJlLT5hY2NlbCwKKwkJCQkgYmFzZSwgcGl0Y2gsIEJwcCwKKwkJCQkgcmVnaW9uLT5keCwgcmVnaW9uLT5keSwKKwkJCQkgcmVnaW9uLT53aWR0aCwgcmVnaW9uLT5oZWlnaHQsCisJCQkJIGNvbG9yLCByb3ApOworCWlmIChzaGFyZS0+ZHVhbCkKKwkJc3Bpbl91bmxvY2soJnNoYXJlLT5zbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGx5bnhmYl9vcHNfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmU7CisJdW5zaWduZWQgaW50IGJhc2UsIHBpdGNoLCBCcHA7CisKKwlwYXIgPSBpbmZvLT5wYXI7CisJc2hhcmUgPSBwYXItPnNoYXJlOworCisJLyogZWFjaCB0aW1lIDJkIGZ1bmN0aW9uIGJlZ2luIHRvIHdvcmssYmVsb3cgdGhyZWUgdmFyaWFibGUgYWx3YXlzIG5lZWQKKwkgKiBiZSBzZXQsIHNlZW1zIHdlIGNhbiBwdXQgdGhlbSB0b2dldGhlciBpbiBzb21lIHBsYWNlICAqLworCWJhc2UgPSBwYXItPmNydGMub1NjcmVlbjsKKwlwaXRjaCA9IGluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwlCcHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPj4gMzsKKworCS8qCisJICogSWYgbm90IHVzZSBzcGluX2xvY2ssIHN5c3RlbSB3aWxsIGRpZSBpZiB1c2VyIGxvYWQgZHJpdmVyCisJICogYW5kIGltbWVkaWF0bHkgdW5sb2FkIGRyaXZlciBmcmVxdWVudGx5IChkdWFsKQorCSAqLworCWlmIChzaGFyZS0+ZHVhbCkKKwkJc3Bpbl9sb2NrKCZzaGFyZS0+c2xvY2spOworCisJc2hhcmUtPmFjY2VsLmRlX2NvcHlhcmVhKCZzaGFyZS0+YWNjZWwsCisJCQkJIGJhc2UsIHBpdGNoLCByZWdpb24tPnN4LCByZWdpb24tPnN5LAorCQkJCSBiYXNlLCBwaXRjaCwgQnBwLCByZWdpb24tPmR4LCByZWdpb24tPmR5LAorCQkJCSByZWdpb24tPndpZHRoLCByZWdpb24tPmhlaWdodCwgSFdfUk9QMl9DT1BZKTsKKwlpZiAoc2hhcmUtPmR1YWwpCisJCXNwaW5fdW5sb2NrKCZzaGFyZS0+c2xvY2spOworfQorCitzdGF0aWMgdm9pZCBseW54ZmJfb3BzX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQkgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZSwgcGl0Y2gsIEJwcDsKKwl1bnNpZ25lZCBpbnQgZmdjb2wsIGJnY29sOworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCisJcGFyID0gaW5mby0+cGFyOworCXNoYXJlID0gcGFyLT5zaGFyZTsKKwkvKiBlYWNoIHRpbWUgMmQgZnVuY3Rpb24gYmVnaW4gdG8gd29yayxiZWxvdyB0aHJlZSB2YXJpYWJsZSBhbHdheXMgbmVlZAorCSAqIGJlIHNldCwgc2VlbXMgd2UgY2FuIHB1dCB0aGVtIHRvZ2V0aGVyIGluIHNvbWUgcGxhY2UgICovCisJYmFzZSA9IHBhci0+Y3J0Yy5vU2NyZWVuOworCXBpdGNoID0gaW5mby0+Zml4LmxpbmVfbGVuZ3RoOworCUJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA+PiAzOworCisJaWYgKGltYWdlLT5kZXB0aCA9PSAxKSB7CisJCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IgfHwKKwkJICAgIGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX0RJUkVDVENPTE9SKSB7CisJCQlmZ2NvbCA9ICgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW2ltYWdlLT5mZ19jb2xvcl07CisJCQliZ2NvbCA9ICgodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW2ltYWdlLT5iZ19jb2xvcl07CisJCX0gZWxzZSB7CisJCQlmZ2NvbCA9IGltYWdlLT5mZ19jb2xvcjsKKwkJCWJnY29sID0gaW1hZ2UtPmJnX2NvbG9yOworCQl9CisJCWdvdG8gX2RvX3dvcms7CisJfQorCXJldHVybjsKK19kb193b3JrOgorCS8qCisJICogSWYgbm90IHVzZSBzcGluX2xvY2ssIHN5c3RlbSB3aWxsIGRpZSBpZiB1c2VyIGxvYWQgZHJpdmVyCisJICogYW5kIGltbWVkaWF0bHkgdW5sb2FkIGRyaXZlciBmcmVxdWVudGx5IChkdWFsKQorCSAqLworCWlmIChzaGFyZS0+ZHVhbCkKKwkJc3Bpbl9sb2NrKCZzaGFyZS0+c2xvY2spOworCisJc2hhcmUtPmFjY2VsLmRlX2ltYWdlYmxpdCgmc2hhcmUtPmFjY2VsLAorCQkJCSAgaW1hZ2UtPmRhdGEsIGltYWdlLT53aWR0aD4+MywgMCwKKwkJCQkgIGJhc2UsIHBpdGNoLCBCcHAsCisJCQkJICBpbWFnZS0+ZHgsIGltYWdlLT5keSwKKwkJCQkgIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCwKKwkJCQkgIGZnY29sLCBiZ2NvbCwgSFdfUk9QMl9DT1BZKTsKKwlpZiAoc2hhcmUtPmR1YWwpCisJCXNwaW5fdW5sb2NrKCZzaGFyZS0+c2xvY2spOworfQorCitzdGF0aWMgaW50IGx5bnhmYl9vcHNfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyOworCXN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YzsKKwlpbnQgcmV0OworCisKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gMDsKKwlwYXIgPSBpbmZvLT5wYXI7CisJY3J0YyA9ICZwYXItPmNydGM7CisJcmV0ID0gY3J0Yy0+cHJvY19wYW5EaXNwbGF5KGNydGMsIHZhciwgaW5mbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGx5bnhmYl9vcHNfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyOworCXN0cnVjdCBseW54X3NoYXJlICpzaGFyZTsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGM7CisJc3RydWN0IGx5bnhmYl9vdXRwdXQgKm91dHB1dDsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBsaW5lX2xlbmd0aDsKKworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSAwOworCXBhciA9IGluZm8tPnBhcjsKKwlzaGFyZSA9IHBhci0+c2hhcmU7CisJY3J0YyA9ICZwYXItPmNydGM7CisJb3V0cHV0ID0gJnBhci0+b3V0cHV0OworCXZhciA9ICZpbmZvLT52YXI7CisJZml4ID0gJmluZm8tPmZpeDsKKworCS8qIGZpeCBzdHJ1Y3R1ciBpcyBub3Qgc28gRklYIC4uLiAqLworCWxpbmVfbGVuZ3RoID0gdmFyLT54cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gODsKKwlsaW5lX2xlbmd0aCA9IFBBRERJTkcoY3J0Yy0+bGluZV9wYWQsIGxpbmVfbGVuZ3RoKTsKKwlmaXgtPmxpbmVfbGVuZ3RoID0gbGluZV9sZW5ndGg7CisJcHJfZXJyKCJmaXgtPmxpbmVfbGVuZ3RoID0gJWRcbiIsIGZpeC0+bGluZV9sZW5ndGgpOworCisJLyogdmFyLT5yZWQsZ3JlZW4sYmx1ZSx0cmFuc3AgYXJlIG5lZWQgdG8gYmUgc2V0IGJ5IGRyaXZlcgorCSAqIGFuZCB0aGVzZSBkYXRhIHNob3VsZCBiZSBzZXQgYmVmb3JlIHNldGNvbHJlZyByb3V0aW5lCisJICogKi8KKworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCXZhci0+cmVkLm9mZnNldCA9IDA7CisJCXZhci0+cmVkLmxlbmd0aCA9IDg7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CisJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CisJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXZhci0+cmVkLm9mZnNldCA9IDExOworCQl2YXItPnJlZC5sZW5ndGggPSA1OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CisJCXZhci0+cmVkLmxlbmd0aCA9IDg7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXZhci0+aGVpZ2h0ID0gdmFyLT53aWR0aCA9IC0xOworCXZhci0+YWNjZWxfZmxhZ3MgPSAwOy8qRkJfQUNDRUxGX1RFWFQ7Ki8KKworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJwaXhlbCBicHAgZm9ybWF0IG5vdCBzYXRpc2ZpZWRcbi4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gY3J0Yy0+cHJvY19zZXRNb2RlKGNydGMsIHZhciwgZml4KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gb3V0cHV0LT5wcm9jX3NldE1vZGUob3V0cHV0LCB2YXIsIGZpeCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2hhbl90b19maWVsZCh1bnNpZ25lZCBpbnQgY2hhbiwKKwkJCQkJIHN0cnVjdCBmYl9iaXRmaWVsZCAqYmYpCit7CisJY2hhbiAmPSAweGZmZmY7CisJY2hhbiA+Pj0gMTYgLSBiZi0+bGVuZ3RoOworCXJldHVybiBjaGFuIDw8IGJmLT5vZmZzZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbHlueGZiX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBseW54X3NoYXJlICpzaGFyZTsKKwlpbnQgcmV0OworCisJaWYgKG1lc2cuZXZlbnQgPT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KQorCQlyZXR1cm4gMDsKKworCXJldCA9IDA7CisJc2hhcmUgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3dpdGNoIChtZXNnLmV2ZW50KSB7CisJY2FzZSBQTV9FVkVOVF9GUkVFWkU6CisJY2FzZSBQTV9FVkVOVF9QUkVUSEFXOgorCQlwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBtZXNnOworCQlyZXR1cm4gMDsKKwl9CisKKwljb25zb2xlX2xvY2soKTsKKwlpZiAobWVzZy5ldmVudCAmIFBNX0VWRU5UX1NMRUVQKSB7CisJCWluZm8gPSBzaGFyZS0+ZmJpbmZvWzBdOworCQlpZiAoaW5mbykKKwkJCS8qIDEgbWVhbnMgZG8gc3VzcGVuZCAqLworCQkJZmJfc2V0X3N1c3BlbmQoaW5mbywgMSk7CisJCWluZm8gPSBzaGFyZS0+ZmJpbmZvWzFdOworCQlpZiAoaW5mbykKKwkJCS8qIDEgbWVhbnMgZG8gc3VzcGVuZCAqLworCQkJZmJfc2V0X3N1c3BlbmQoaW5mbywgMSk7CisKKwkJcmV0ID0gcGNpX3NhdmVfc3RhdGUocGRldik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiZXJyb3I6JWQgb2NjdXJyZWQgaW4gcGNpX3NhdmVfc3RhdGVcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyogc2V0IGNoaXAgdG8gc2xlZXAgbW9kZSAqLworCQlpZiAoc2hhcmUtPnN1c3BlbmQpCisJCQkoKnNoYXJlLT5zdXNwZW5kKShzaGFyZSk7CisKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgbWVzZykpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImVycm9yOiVkIG9jY3VycmVkIGluIHBjaV9zZXRfcG93ZXJfc3RhdGVcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKKwljb25zb2xlX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHlueGZiX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmU7CisKKwlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyOworCXN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgbHlueF9jdXJzb3IgKmN1cnNvcjsKKworCWludCByZXQ7CisKKworCXJldCA9IDA7CisJc2hhcmUgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwljb25zb2xlX2xvY2soKTsKKworCXJldCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZXJyb3I6JWQgb2NjdXJlZCBpbiBwY2lfc2V0X3Bvd2VyX3N0YXRlXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCisJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9GUkVFWkUpIHsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImVycm9yOiVkIG9jY3VyZWQgaW4gcGNpX2VuYWJsZV9kZXZpY2VcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCX0KKwlpZiAoc2hhcmUtPnJlc3VtZSkKKwkJKCpzaGFyZS0+cmVzdW1lKShzaGFyZSk7CisKKwlod19zbTc1MF9pbml0aHcoc2hhcmUsIHBkZXYpOworCisKKwlpbmZvID0gc2hhcmUtPmZiaW5mb1swXTsKKworCWlmIChpbmZvKSB7CisJCXBhciA9IGluZm8tPnBhcjsKKwkJY3J0YyA9ICZwYXItPmNydGM7CisJCWN1cnNvciA9ICZjcnRjLT5jdXJzb3I7CisJCW1lbXNldF9pbyhjdXJzb3ItPnZzdGFydCwgMHgwLCBjdXJzb3ItPnNpemUpOworCQltZW1zZXRfaW8oY3J0Yy0+dlNjcmVlbiwgMHgwLCBjcnRjLT52aWRtZW1fc2l6ZSk7CisJCWx5bnhmYl9vcHNfc2V0X3BhcihpbmZvKTsKKwkJZmJfc2V0X3N1c3BlbmQoaW5mbywgMCk7CisJfQorCisJaW5mbyA9IHNoYXJlLT5mYmluZm9bMV07CisKKwlpZiAoaW5mbykgeworCQlwYXIgPSBpbmZvLT5wYXI7CisJCWNydGMgPSAmcGFyLT5jcnRjOworCQljdXJzb3IgPSAmY3J0Yy0+Y3Vyc29yOworCQltZW1zZXRfaW8oY3Vyc29yLT52c3RhcnQsIDB4MCwgY3Vyc29yLT5zaXplKTsKKwkJbWVtc2V0X2lvKGNydGMtPnZTY3JlZW4sIDB4MCwgY3J0Yy0+dmlkbWVtX3NpemUpOworCQlseW54ZmJfb3BzX3NldF9wYXIoaW5mbyk7CisJCWZiX3NldF9zdXNwZW5kKGluZm8sIDApOworCX0KKworCisJY29uc29sZV91bmxvY2soKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbHlueGZiX29wc19jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGM7CisJc3RydWN0IGx5bnhmYl9vdXRwdXQgKm91dHB1dDsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmU7CisJaW50IHJldDsKKwlyZXNvdXJjZV9zaXplX3QgcmVxdWVzdDsKKworCisJcGFyID0gaW5mby0+cGFyOworCWNydGMgPSAmcGFyLT5jcnRjOworCW91dHB1dCA9ICZwYXItPm91dHB1dDsKKwlzaGFyZSA9IHBhci0+c2hhcmU7CisJcmV0ID0gMDsKKworCXByX2RlYnVnKCJjaGVjayB2YXI6JWR4JWQtJWRcbiIsCisJCSB2YXItPnhyZXMsCisJCSB2YXItPnlyZXMsCisJCSB2YXItPmJpdHNfcGVyX3BpeGVsKTsKKworCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCWNhc2UgMTY6CisJY2FzZSAyNDogLyogc3VwcG9ydCAyNCBicHAgZm9yIG9ubHkgbHlueDcxMi83MjIvNzIwICovCisJY2FzZSAzMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJicHAgJWQgbm90IHN1cHBvcnRlZFxuIiwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCXZhci0+cmVkLm9mZnNldCA9IDA7CisJCXZhci0+cmVkLmxlbmd0aCA9IDg7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CisJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CisJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXZhci0+cmVkLm9mZnNldCA9IDExOworCQl2YXItPnJlZC5sZW5ndGggPSA1OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwljYXNlIDMyOgorCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJdmFyLT5yZWQubGVuZ3RoID0gODsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gODsKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwl2YXItPmhlaWdodCA9IHZhci0+d2lkdGggPSAtMTsKKwl2YXItPmFjY2VsX2ZsYWdzID0gMDsvKiBGQl9BQ0NFTEZfVEVYVDsgKi8KKworCS8qIGNoZWNrIGlmIGN1cnJlbnQgZmIncyB2aWRlbyBtZW1vcnkgYmlnIGVub3VnaHQgdG8gaG9sZCB0aGUgb25zY3JlZW4qLworCXJlcXVlc3QgPSB2YXItPnhyZXNfdmlydHVhbCAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCS8qIGRlZmF1bHR5IGNydGMtPmNoYW5uZWwgZ28gd2l0aCBwYXItPmluZGV4ICovCisKKwlyZXF1ZXN0ID0gUEFERElORyhjcnRjLT5saW5lX3BhZCwgcmVxdWVzdCk7CisJcmVxdWVzdCA9IHJlcXVlc3QgKiB2YXItPnlyZXNfdmlydHVhbDsKKwlpZiAoY3J0Yy0+dmlkbWVtX3NpemUgPCByZXF1ZXN0KSB7CisJCXByX2Vycigibm90IGVub3VnaCB2aWRlbyBtZW1vcnkgZm9yIG1vZGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBvdXRwdXQtPnByb2NfY2hlY2tNb2RlKG91dHB1dCwgdmFyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gY3J0Yy0+cHJvY19jaGVja01vZGUoY3J0YywgdmFyKTsKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGx5bnhmYl9vcHNfc2V0Y29scmVnKHVuc2lnbmVkIHJlZ25vLAorCQkJCXVuc2lnbmVkIHJlZCwKKwkJCQl1bnNpZ25lZCBncmVlbiwKKwkJCQl1bnNpZ25lZCBibHVlLAorCQkJCXVuc2lnbmVkIHRyYW5zcCwKKwkJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyOworCXN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcjsKKwlpbnQgcmV0OworCisJcGFyID0gaW5mby0+cGFyOworCWNydGMgPSAmcGFyLT5jcnRjOworCXZhciA9ICZpbmZvLT52YXI7CisJcmV0ID0gMDsKKworCWlmIChyZWdubyA+IDI1NikgeworCQlwcl9lcnIoInJlZ25vID0gJWRcbiIsIHJlZ25vKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGluZm8tPnZhci5ncmF5c2NhbGUpCisJCXJlZCA9IGdyZWVuID0gYmx1ZSA9IChyZWQgKiA3NyArIGdyZWVuICogMTUxICsgYmx1ZSAqIDI4KSA+PiA4OworCisJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gOCAmJgorCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUikgeworCQlyZWQgPj49IDg7CisJCWdyZWVuID4+PSA4OworCQlibHVlID4+PSA4OworCQlyZXQgPSBjcnRjLT5wcm9jX3NldENvbFJlZyhjcnRjLCByZWdubywgcmVkLCBncmVlbiwgYmx1ZSk7CisJCWdvdG8gZXhpdDsKKwl9CisKKworCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IgJiYgcmVnbm8gPCAyNTYpIHsKKwkJdTMyIHZhbDsKKworCQlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSAxNiB8fAorCQkgICAgdmFyLT5iaXRzX3Blcl9waXhlbCA9PSAzMiB8fAorCQkgICAgdmFyLT5iaXRzX3Blcl9waXhlbCA9PSAyNCkgeworCQkJdmFsID0gY2hhbl90b19maWVsZChyZWQsICZ2YXItPnJlZCk7CisJCQl2YWwgfD0gY2hhbl90b19maWVsZChncmVlbiwgJnZhci0+Z3JlZW4pOworCQkJdmFsIHw9IGNoYW5fdG9fZmllbGQoYmx1ZSwgJnZhci0+Ymx1ZSk7CisJCQlwYXItPnBzZXVkb19wYWxldHRlW3JlZ25vXSA9IHZhbDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCXJldCA9IC1FSU5WQUw7CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBseW54ZmJfb3BzX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueGZiX291dHB1dCAqb3V0cHV0OworCisJcHJfZGVidWcoImJsYW5rID0gJWQuXG4iLCBibGFuayk7CisJcGFyID0gaW5mby0+cGFyOworCW91dHB1dCA9ICZwYXItPm91dHB1dDsKKwlyZXR1cm4gb3V0cHV0LT5wcm9jX3NldEJMQU5LKG91dHB1dCwgYmxhbmspOworfQorCitzdGF0aWMgaW50IHNtNzUwZmJfc2V0X2RydihzdHJ1Y3QgbHlueGZiX3BhciAqcGFyKQoreworCWludCByZXQ7CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCXN0cnVjdCBzbTc1MF9zaGFyZSAqc3BlY19zaGFyZTsKKwlzdHJ1Y3QgbHlueGZiX291dHB1dCAqb3V0cHV0OworCXN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YzsKKworCXJldCA9IDA7CisKKwlzaGFyZSA9IHBhci0+c2hhcmU7CisJc3BlY19zaGFyZSA9IGNvbnRhaW5lcl9vZihzaGFyZSwgc3RydWN0IHNtNzUwX3NoYXJlLCBzaGFyZSk7CisJb3V0cHV0ID0gJnBhci0+b3V0cHV0OworCWNydGMgPSAmcGFyLT5jcnRjOworCisJY3J0Yy0+dmlkbWVtX3NpemUgPSAoc2hhcmUtPmR1YWwpP3NoYXJlLT52aWRtZW1fc2l6ZT4+MTpzaGFyZS0+dmlkbWVtX3NpemU7CisJLyogc2V0dXAgY3J0YyBhbmQgb3V0cHV0IG1lbWJlciAqLworCXNwZWNfc2hhcmUtPmh3Q3Vyc29yID0gZ19od2N1cnNvcjsKKworCWNydGMtPnByb2Nfc2V0TW9kZSA9IGh3X3NtNzUwX2NydGNfc2V0TW9kZTsKKwljcnRjLT5wcm9jX2NoZWNrTW9kZSA9IGh3X3NtNzUwX2NydGNfY2hlY2tNb2RlOworCWNydGMtPnByb2Nfc2V0Q29sUmVnID0gaHdfc203NTBfc2V0Q29sUmVnOworCWNydGMtPnByb2NfcGFuRGlzcGxheSA9IGh3X3NtNzUwX3Bhbl9kaXNwbGF5OworCWNydGMtPmNsZWFyID0gaHdfc203NTBfY3J0Y19jbGVhcjsKKwljcnRjLT5saW5lX3BhZCA9IDE2OworCWNydGMtPnhwYW5zdGVwID0gODsKKwljcnRjLT55cGFuc3RlcCA9IDE7CisJY3J0Yy0+eXdyYXBzdGVwID0gMDsKKworCW91dHB1dC0+cHJvY19zZXRNb2RlID0gaHdfc203NTBfb3V0cHV0X3NldE1vZGU7CisJb3V0cHV0LT5wcm9jX2NoZWNrTW9kZSA9IGh3X3NtNzUwX291dHB1dF9jaGVja01vZGU7CisKKwlvdXRwdXQtPnByb2Nfc2V0QkxBTksgPSAoc2hhcmUtPnJldmlkID09IFNNNzUwTEVfUkVWSVNJT05fSUQpP2h3X3NtNzUwbGVfc2V0QkxBTks6aHdfc203NTBfc2V0QkxBTks7CisJb3V0cHV0LT5jbGVhciA9IGh3X3NtNzUwX291dHB1dF9jbGVhcjsKKwkvKiBjaGlwIHNwZWNpZmljIHBoYXNlICovCisJc2hhcmUtPmFjY2VsLmRlX3dhaXQgPSAoc2hhcmUtPnJldmlkID09IFNNNzUwTEVfUkVWSVNJT05fSUQpP2h3X3NtNzUwbGVfZGVXYWl0IDogaHdfc203NTBfZGVXYWl0OworCXN3aXRjaCAoc3BlY19zaGFyZS0+c3RhdGUuZGF0YWZsb3cpIHsKKwljYXNlIHNtNzUwX3NpbXVsX3ByaToKKwkJb3V0cHV0LT5wYXRocyA9IHNtNzUwX3BuYzsKKwkJY3J0Yy0+Y2hhbm5lbCA9IHNtNzUwX3ByaW1hcnk7CisJCWNydGMtPm9TY3JlZW4gPSAwOworCQljcnRjLT52U2NyZWVuID0gc2hhcmUtPnB2TWVtOworCQlwcl9pbmZvKCJ1c2Ugc2ltdWwgcHJpbWFyeSBtb2RlXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBzbTc1MF9zaW11bF9zZWM6CisJCW91dHB1dC0+cGF0aHMgPSBzbTc1MF9wbmM7CisJCWNydGMtPmNoYW5uZWwgPSBzbTc1MF9zZWNvbmRhcnk7CisJCWNydGMtPm9TY3JlZW4gPSAwOworCQljcnRjLT52U2NyZWVuID0gc2hhcmUtPnB2TWVtOworCQlicmVhazsKKwljYXNlIHNtNzUwX2R1YWxfbm9ybWFsOgorCQlpZiAocGFyLT5pbmRleCA9PSAwKSB7CisJCQlvdXRwdXQtPnBhdGhzID0gc203NTBfcGFuZWw7CisJCQljcnRjLT5jaGFubmVsID0gc203NTBfcHJpbWFyeTsKKwkJCWNydGMtPm9TY3JlZW4gPSAwOworCQkJY3J0Yy0+dlNjcmVlbiA9IHNoYXJlLT5wdk1lbTsKKwkJfSBlbHNlIHsKKwkJCW91dHB1dC0+cGF0aHMgPSBzbTc1MF9jcnQ7CisJCQljcnRjLT5jaGFubmVsID0gc203NTBfc2Vjb25kYXJ5OworCQkJLyogbm90IGNvbnNpZGVyIG9mIHBhZGRpbmcgc3R1ZmZzIGZvciBvU2NyZWVuLG5lZWQgZml4ICovCisJCQljcnRjLT5vU2NyZWVuID0gKHNoYXJlLT52aWRtZW1fc2l6ZSA+PiAxKTsKKwkJCWNydGMtPnZTY3JlZW4gPSBzaGFyZS0+cHZNZW0gKyBjcnRjLT5vU2NyZWVuOworCQl9CisJCWJyZWFrOworCWNhc2Ugc203NTBfZHVhbF9zd2FwOgorCQlpZiAocGFyLT5pbmRleCA9PSAwKSB7CisJCQlvdXRwdXQtPnBhdGhzID0gc203NTBfcGFuZWw7CisJCQljcnRjLT5jaGFubmVsID0gc203NTBfc2Vjb25kYXJ5OworCQkJY3J0Yy0+b1NjcmVlbiA9IDA7CisJCQljcnRjLT52U2NyZWVuID0gc2hhcmUtPnB2TWVtOworCQl9IGVsc2UgeworCQkJb3V0cHV0LT5wYXRocyA9IHNtNzUwX2NydDsKKwkJCWNydGMtPmNoYW5uZWwgPSBzbTc1MF9wcmltYXJ5OworCQkJLyogbm90IGNvbnNpZGVyIG9mIHBhZGRpbmcgc3R1ZmZzIGZvciBvU2NyZWVuLG5lZWQgZml4ICovCisJCQljcnRjLT5vU2NyZWVuID0gKHNoYXJlLT52aWRtZW1fc2l6ZSA+PiAxKTsKKwkJCWNydGMtPnZTY3JlZW4gPSBzaGFyZS0+cHZNZW0gKyBjcnRjLT5vU2NyZWVuOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmYl9vcHMgbHlueGZiX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZmJfY2hlY2tfdmFyID0gIGx5bnhmYl9vcHNfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyID0gbHlueGZiX29wc19zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcgPSBseW54ZmJfb3BzX3NldGNvbHJlZywKKwkuZmJfYmxhbmsgPSBseW54ZmJfb3BzX2JsYW5rLAorCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKKwkuZmJfaW1hZ2VibGl0ID0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCisJLyogY3Vyc29yICovCisJLmZiX2N1cnNvciA9IGx5bnhmYl9vcHNfY3Vyc29yLAorfTsKKworCitzdGF0aWMgaW50IGx5bnhmYl9zZXRfZmJpbmZvKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgaW5kZXgpCit7CisJaW50IGk7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmU7CisJc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjOworCXN0cnVjdCBseW54ZmJfb3V0cHV0ICpvdXRwdXQ7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXI7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXg7CisKKwljb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlICpwZGJbXSA9IHsKKwkJbHlueDc1MF9leHQsIE5VTEwsIHZlc2FfbW9kZXMsCisJfTsKKwlpbnQgY2RiW10gPSB7QVJSQVlfU0laRShseW54NzUwX2V4dCksIDAsIFZFU0FfTU9ERURCX1NJWkV9OworCXN0YXRpYyBjb25zdCBjaGFyICptZGJfZGVzY1tdID0geworCQkiZHJpdmVyIHByZXBhcmVkIG1vZGVzIiwKKwkJImtlcm5lbCBwcmVwYXJlZCBkZWZhdWx0IG1vZGVkYiIsCisJCSJrZXJuZWwgSEVMUEVSUyBwcmVwYXJlZCB2ZXNhX21vZGVzIiwKKwl9OworCisKKwlzdGF0aWMgY29uc3QgY2hhciAqZml4SWRbMl0gPSB7CisJCSJzbTc1MF9mYjEiLCAic203NTBfZmIyIiwKKwl9OworCisJaW50IHJldCwgbGluZV9sZW5ndGg7CisKKwlyZXQgPSAwOworCXBhciA9IChzdHJ1Y3QgbHlueGZiX3BhciAqKWluZm8tPnBhcjsKKwlzaGFyZSA9IHBhci0+c2hhcmU7CisJY3J0YyA9ICZwYXItPmNydGM7CisJb3V0cHV0ID0gJnBhci0+b3V0cHV0OworCXZhciA9ICZpbmZvLT52YXI7CisJZml4ID0gJmluZm8tPmZpeDsKKworCS8qIHNldCBpbmRleCAqLworCXBhci0+aW5kZXggPSBpbmRleDsKKwlvdXRwdXQtPmNoYW5uZWwgPSAmY3J0Yy0+Y2hhbm5lbDsKKwlzbTc1MGZiX3NldF9kcnYocGFyKTsKKwlseW54ZmJfb3BzLmZiX3Bhbl9kaXNwbGF5ID0gbHlueGZiX29wc19wYW5fZGlzcGxheTsKKworCisJLyogc2V0IGN1cnJlbnQgY3Vyc29yIHZhcmlhYmxlIGFuZCBwcm9jIHBvaW50ZXIsCisJICogbXVzdCBiZSBzZXQgYWZ0ZXIgY3J0YyBtZW1iZXIgaW5pdGlhbGl6ZWQgKi8KKwljcnRjLT5jdXJzb3Iub2Zmc2V0ID0gY3J0Yy0+b1NjcmVlbiArIGNydGMtPnZpZG1lbV9zaXplIC0gMTAyNDsKKwljcnRjLT5jdXJzb3IubW1pbyA9IHNoYXJlLT5wdlJlZyArIDB4ODAwZjAgKyAoaW50KWNydGMtPmNoYW5uZWwgKiAweDE0MDsKKworCXByX2luZm8oImNydGMtPmN1cnNvci5tbWlvID0gJXBcbiIsIGNydGMtPmN1cnNvci5tbWlvKTsKKwljcnRjLT5jdXJzb3IubWF4SCA9IGNydGMtPmN1cnNvci5tYXhXID0gNjQ7CisJY3J0Yy0+Y3Vyc29yLnNpemUgPSBjcnRjLT5jdXJzb3IubWF4SCpjcnRjLT5jdXJzb3IubWF4VyoyLzg7CisJY3J0Yy0+Y3Vyc29yLmRpc2FibGUgPSBod19jdXJzb3JfZGlzYWJsZTsKKwljcnRjLT5jdXJzb3IuZW5hYmxlID0gaHdfY3Vyc29yX2VuYWJsZTsKKwljcnRjLT5jdXJzb3Iuc2V0Q29sb3IgPSBod19jdXJzb3Jfc2V0Q29sb3I7CisJY3J0Yy0+Y3Vyc29yLnNldFBvcyA9IGh3X2N1cnNvcl9zZXRQb3M7CisJY3J0Yy0+Y3Vyc29yLnNldFNpemUgPSBod19jdXJzb3Jfc2V0U2l6ZTsKKwljcnRjLT5jdXJzb3Iuc2V0RGF0YSA9IGh3X2N1cnNvcl9zZXREYXRhOworCWNydGMtPmN1cnNvci52c3RhcnQgPSBzaGFyZS0+cHZNZW0gKyBjcnRjLT5jdXJzb3Iub2Zmc2V0OworCisKKwljcnRjLT5jdXJzb3Iuc2hhcmUgPSBzaGFyZTsKKwkJbWVtc2V0X2lvKGNydGMtPmN1cnNvci52c3RhcnQsIDAsIGNydGMtPmN1cnNvci5zaXplKTsKKwlpZiAoIWdfaHdjdXJzb3IpIHsKKwkJbHlueGZiX29wcy5mYl9jdXJzb3IgPSBOVUxMOworCQljcnRjLT5jdXJzb3IuZGlzYWJsZSgmY3J0Yy0+Y3Vyc29yKTsKKwl9CisKKworCS8qIHNldCBpbmZvLT5mYm9wcywgbXVzdCBiZSBzZXQgYmVmb3JlIGZiX2ZpbmRfbW9kZSAqLworCWlmICghc2hhcmUtPmFjY2VsX29mZikgeworCQkvKiB1c2UgMmQgYWNjZWxlcmF0aW9uICovCisJCWx5bnhmYl9vcHMuZmJfZmlsbHJlY3QgPSBseW54ZmJfb3BzX2ZpbGxyZWN0OworCQlseW54ZmJfb3BzLmZiX2NvcHlhcmVhID0gbHlueGZiX29wc19jb3B5YXJlYTsKKwkJbHlueGZiX29wcy5mYl9pbWFnZWJsaXQgPSBseW54ZmJfb3BzX2ltYWdlYmxpdDsKKwl9CisJaW5mby0+ZmJvcHMgPSAmbHlueGZiX29wczsKKworCWlmICghZ19mYm1vZGVbaW5kZXhdKSB7CisJCWdfZmJtb2RlW2luZGV4XSA9IGdfZGVmX2ZibW9kZTsKKwkJaWYgKGluZGV4KQorCQkJZ19mYm1vZGVbaW5kZXhdID0gZ19mYm1vZGVbMF07CisJfQorCisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisKKwkJcmV0ID0gZmJfZmluZF9tb2RlKHZhciwgaW5mbywgZ19mYm1vZGVbaW5kZXhdLAorCQkJCSAgIHBkYltpXSwgY2RiW2ldLCBOVUxMLCA4KTsKKworCQlpZiAocmV0ID09IDEpIHsKKwkJCXByX2luZm8oInN1Y2Nlc3MhIHVzZSBzcGVjaWZpZWQgbW9kZTolcyBpbiAlc1xuIiwKKwkJCQlnX2ZibW9kZVtpbmRleF0sCisJCQkJbWRiX2Rlc2NbaV0pOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJCXByX3dhcm4oInVzZSBzcGVjaWZpZWQgbW9kZTolcyBpbiAlcyx3aXRoIGFuIGlnbm9yZWQgcmVmcmVzaCByYXRlXG4iLAorCQkJCWdfZmJtb2RlW2luZGV4XSwKKwkJCQltZGJfZGVzY1tpXSk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChyZXQgPT0gMykgeworCQkJcHJfd2Fybigid2FubmEgdXNlIGRlZmF1bHQgbW9kZVxuIik7CisJCQkvKmJyZWFrOyovCisJCX0gZWxzZSBpZiAocmV0ID09IDQpIHsKKwkJCXByX3dhcm4oImZhbGwgYmFjayB0byBhbnkgdmFsaWQgbW9kZVxuIik7CisJCX0gZWxzZSB7CisJCQlwcl93YXJuKCJyZXQgPSAlZCxmYl9maW5kX21vZGUgZmFpbGVkLHdpdGggJXNcbiIsCisJCQkJcmV0LAorCQkJCW1kYl9kZXNjW2ldKTsKKwkJfQorCX0KKworCS8qIHNvbWUgbWVtYmVyIG9mIGluZm8tPnZhciBoYWQgYmVlbiBzZXQgYnkgZmJfZmluZF9tb2RlICovCisKKwlwcl9pbmZvKCJNZW1iZXIgb2YgaW5mby0+dmFyIGlzIDpcblwKKwkJeHJlcz0lZFxuXAorCQl5cmVzPSVkXG5cCisJCXhyZXNfdmlydHVhbD0lZFxuXAorCQl5cmVzX3ZpcnR1YWw9JWRcblwKKwkJeG9mZnNldD0lZFxuXAorCQl5b2Zmc2V0PSVkXG5cCisJCWJpdHNfcGVyX3BpeGVsPSVkXG4gXAorCQkuLi5cbiIsCisJCXZhci0+eHJlcywKKwkJdmFyLT55cmVzLAorCQl2YXItPnhyZXNfdmlydHVhbCwKKwkJdmFyLT55cmVzX3ZpcnR1YWwsCisJCXZhci0+eG9mZnNldCwKKwkJdmFyLT55b2Zmc2V0LAorCQl2YXItPmJpdHNfcGVyX3BpeGVsKTsKKworCS8qIHNldCBwYXIgKi8KKwlwYXItPmluZm8gPSBpbmZvOworCisJLyogc2V0IGluZm8gKi8KKwlsaW5lX2xlbmd0aCA9IFBBRERJTkcoY3J0Yy0+bGluZV9wYWQsCisJCQkgICAgICAodmFyLT54cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsLzgpKTsKKworCWluZm8tPnBzZXVkb19wYWxldHRlID0gJnBhci0+cHNldWRvX3BhbGV0dGVbMF07CisJaW5mby0+c2NyZWVuX2Jhc2UgPSBjcnRjLT52U2NyZWVuOworCXByX2RlYnVnKCJzY3JlZW5fYmFzZSB2YWRkciA9ICVwXG4iLCBpbmZvLT5zY3JlZW5fYmFzZSk7CisJaW5mby0+c2NyZWVuX3NpemUgPSBsaW5lX2xlbmd0aCAqIHZhci0+eXJlc192aXJ0dWFsOworCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVHwwOworCisJLyogc2V0IGluZm8tPmZpeCAqLworCWZpeC0+dHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlmaXgtPnR5cGVfYXV4ID0gMDsKKwlmaXgtPnhwYW5zdGVwID0gY3J0Yy0+eHBhbnN0ZXA7CisJZml4LT55cGFuc3RlcCA9IGNydGMtPnlwYW5zdGVwOworCWZpeC0+eXdyYXBzdGVwID0gY3J0Yy0+eXdyYXBzdGVwOworCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9TTUk7CisKKwlzdHJsY3B5KGZpeC0+aWQsIGZpeElkW2luZGV4XSwgc2l6ZW9mKGZpeC0+aWQpKTsKKworCisJZml4LT5zbWVtX3N0YXJ0ID0gY3J0Yy0+b1NjcmVlbiArIHNoYXJlLT52aWRtZW1fc3RhcnQ7CisJcHJfaW5mbygiZml4LT5zbWVtX3N0YXJ0ID0gJWx4XG4iLCBmaXgtPnNtZW1fc3RhcnQpOworCS8qIGFjY29yZGluZyB0byBtbWFwIGV4cGVyaW1lbnQgZnJvbSB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uLAorCSAqIGZpeC0+bW1pb19sZW4gc2hvdWxkIG5vdCBsYXJnZXIgdGhhbiB2aXJ0dWFsIHNpemUKKwkgKiAoeHJlc192aXJ0dWFsIHggeXJlc192aXJ0dWFsIHggQnlQUCkKKwkgKiBCZWxvdyBsaW5lIG1heWJlIGJ1Z2d5IHdoZW4gdXNlciBtbWFwIGZiIGRldiBub2RlIGFuZCB3cml0ZQorCSAqIGRhdGEgaW50byB0aGUgYm91bmQgb3ZlciB2aXJ0dWFsIHNpemUKKwkgKiAqLworCWZpeC0+c21lbV9sZW4gPSBjcnRjLT52aWRtZW1fc2l6ZTsKKwlwcl9pbmZvKCJmaXgtPnNtZW1fbGVuID0gJXhcbiIsIGZpeC0+c21lbV9sZW4pOworCWluZm8tPnNjcmVlbl9zaXplID0gZml4LT5zbWVtX2xlbjsKKwlmaXgtPmxpbmVfbGVuZ3RoID0gbGluZV9sZW5ndGg7CisJZml4LT5tbWlvX3N0YXJ0ID0gc2hhcmUtPnZpZHJlZ19zdGFydDsKKwlwcl9pbmZvKCJmaXgtPm1taW9fc3RhcnQgPSAlbHhcbiIsIGZpeC0+bW1pb19zdGFydCk7CisJZml4LT5tbWlvX2xlbiA9IHNoYXJlLT52aWRyZWdfc2l6ZTsKKwlwcl9pbmZvKCJmaXgtPm1taW9fbGVuID0gJXhcbiIsIGZpeC0+bW1pb19sZW4pOworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCWJyZWFrOworCWNhc2UgMTY6CisJY2FzZSAzMjoKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCQlicmVhazsKKwl9CisKKwkvKiBzZXQgdmFyICovCisJdmFyLT5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX05PVzsKKwl2YXItPmFjY2VsX2ZsYWdzID0gMDsKKwl2YXItPnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKworCXByX2RlYnVnKCIjMSBzaG93IGluZm8tPmNtYXAgOiBcbnN0YXJ0PSVkLGxlbj0lZCxyZWQ9JXAsZ3JlZW49JXAsYmx1ZT0lcCx0cmFuc3A9JXBcbiIsCisJCSBpbmZvLT5jbWFwLnN0YXJ0LCBpbmZvLT5jbWFwLmxlbiwKKwkJIGluZm8tPmNtYXAucmVkLCBpbmZvLT5jbWFwLmdyZWVuLCBpbmZvLT5jbWFwLmJsdWUsCisJCSBpbmZvLT5jbWFwLnRyYW5zcCk7CisKKwlyZXQgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbGNhdGUgbWVtb3J5IGZvciBjbWFwLlxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlwcl9kZWJ1ZygiIzIgc2hvdyBpbmZvLT5jbWFwIDpcbnN0YXJ0PSVkLGxlbj0lZCxyZWQ9JXAsZ3JlZW49JXAsYmx1ZT0lcCx0cmFuc3A9JXBcbiIsCisJCSBpbmZvLT5jbWFwLnN0YXJ0LCBpbmZvLT5jbWFwLmxlbiwKKwkJIGluZm8tPmNtYXAucmVkLCBpbmZvLT5jbWFwLmdyZWVuLCBpbmZvLT5jbWFwLmJsdWUsCisJCSBpbmZvLT5jbWFwLnRyYW5zcCk7CisKK2V4aXQ6CisJbHlueGZiX29wc19jaGVja192YXIodmFyLCBpbmZvKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgljaGlwIHNwZWNpZmljIGdfb3B0aW9uIGNvbmZpZ3VyYXRpb24gcm91dGluZSAqLworc3RhdGljIHZvaWQgc203NTBmYl9zZXR1cChzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmUsIGNoYXIgKnNyYykKK3sKKwlzdHJ1Y3Qgc203NTBfc2hhcmUgKnNwZWNfc2hhcmU7CisJY2hhciAqb3B0OworI2lmZGVmIENBUF9FWFBFTlNJT04KKwljaGFyICpleHBfcmVzOworI2VuZGlmCisJaW50IHN3YXA7CisKKworCXNwZWNfc2hhcmUgPSBjb250YWluZXJfb2Yoc2hhcmUsIHN0cnVjdCBzbTc1MF9zaGFyZSwgc2hhcmUpOworI2lmZGVmIENBUF9FWFBFTlNJSU9OCisJZXhwX3JlcyA9IE5VTEw7CisjZW5kaWYKKwlzd2FwID0gMDsKKworCXNwZWNfc2hhcmUtPnN0YXRlLmluaXRQYXJtLmNoaXBfY2xrID0gMDsKKwlzcGVjX3NoYXJlLT5zdGF0ZS5pbml0UGFybS5tZW1fY2xrID0gMDsKKwlzcGVjX3NoYXJlLT5zdGF0ZS5pbml0UGFybS5tYXN0ZXJfY2xrID0gMDsKKwlzcGVjX3NoYXJlLT5zdGF0ZS5pbml0UGFybS5wb3dlck1vZGUgPSAwOworCXNwZWNfc2hhcmUtPnN0YXRlLmluaXRQYXJtLnNldEFsbEVuZ09mZiA9IDA7CisJc3BlY19zaGFyZS0+c3RhdGUuaW5pdFBhcm0ucmVzZXRNZW1vcnkgPSAxOworCisJLyogZGVmYXVsdGx5IHR1cm4gZ19od2N1cnNvciBvbiBmb3IgYm90aCB2aWV3ICovCisJZ19od2N1cnNvciA9IDM7CisKKwlpZiAoIXNyYyB8fCAhKnNyYykgeworCQlwcl93YXJuKCJubyBzcGVjaWZpYyBnX29wdGlvbi5cbiIpOworCQlnb3RvIE5PX1BBUkFNOworCX0KKworCXdoaWxlICgob3B0ID0gc3Ryc2VwKCZzcmMsICI6IikpICE9IE5VTEwgJiYgKm9wdCAhPSAwKSB7CisJCXByX2Vycigib3B0PSVzXG4iLCBvcHQpOworCQlwcl9lcnIoInNyYz0lc1xuIiwgc3JjKTsKKworCQlpZiAoIXN0cm5jbXAob3B0LCAic3dhcCIsIHN0cmxlbigic3dhcCIpKSkKKwkJCXN3YXAgPSAxOworCQllbHNlIGlmICghc3RybmNtcChvcHQsICJub2NydCIsIHN0cmxlbigibm9jcnQiKSkpCisJCQlzcGVjX3NoYXJlLT5zdGF0ZS5ub2NydCA9IDE7CisJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgIjM2Yml0Iiwgc3RybGVuKCIzNmJpdCIpKSkKKwkJCXNwZWNfc2hhcmUtPnN0YXRlLnBubHR5cGUgPSBzbTc1MF9kb3VibGVURlQ7CisJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgIjE4Yml0Iiwgc3RybGVuKCIxOGJpdCIpKSkKKwkJCXNwZWNfc2hhcmUtPnN0YXRlLnBubHR5cGUgPSBzbTc1MF9kdWFsVEZUOworCQllbHNlIGlmICghc3RybmNtcChvcHQsICIyNGJpdCIsIHN0cmxlbigiMjRiaXQiKSkpCisJCQlzcGVjX3NoYXJlLT5zdGF0ZS5wbmx0eXBlID0gc203NTBfMjRURlQ7CisjaWZkZWYgQ0FQX0VYUEFOU0lPTgorCQllbHNlIGlmICghc3RybmNtcChvcHQsICJleHA6Iiwgc3RybGVuKCJleHA6IikpKQorCQkJZXhwX3JlcyA9IG9wdCArIHN0cmxlbigiZXhwOiIpOworI2VuZGlmCisJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgIm5vaHdjMCIsIHN0cmxlbigibm9od2MwIikpKQorCQkJZ19od2N1cnNvciAmPSB+MHgxOworCQllbHNlIGlmICghc3RybmNtcChvcHQsICJub2h3YzEiLCBzdHJsZW4oIm5vaHdjMSIpKSkKKwkJCWdfaHdjdXJzb3IgJj0gfjB4MjsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAibm9od2MiLCBzdHJsZW4oIm5vaHdjIikpKQorCQkJZ19od2N1cnNvciA9IDA7CisJCWVsc2UgeworCQkJaWYgKCFnX2ZibW9kZVswXSkgeworCQkJCWdfZmJtb2RlWzBdID0gb3B0OworCQkJCXByX2luZm8oImZpbmQgZmJtb2RlMCA6ICVzXG4iLCBnX2ZibW9kZVswXSk7CisJCQl9IGVsc2UgaWYgKCFnX2ZibW9kZVsxXSkgeworCQkJCWdfZmJtb2RlWzFdID0gb3B0OworCQkJCXByX2luZm8oImZpbmQgZmJtb2RlMSA6ICVzXG4iLCBnX2ZibW9kZVsxXSk7CisJCQl9IGVsc2UgeworCQkJCXByX3dhcm4oIkhvdyBtYW55IHZpZXcgeW91IHdhbm4gc2V0P1xuIik7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgQ0FQX0VYUEFOU0lPTgorCWlmIChnZXRFeHBSZXMoZXhwX3JlcywKKwkJICAgICAgJnNwZWNfc2hhcmUtPnN0YXRlLnhMQ0QsCisJCSAgICAgICZzcGVjX3NoYXJlLT5zdGF0ZS55TENEKSkgeworCQkvKiBzZWVtcyBleHBfcmVzIGlzIG5vdCB2YWxpZCAqLworCQlzcGVjX3NoYXJlLT5zdGF0ZS54TENEID0gc3BlY19zaGFyZS0+c3RhdGUueUxDRCA9IDA7CisJfQorI2VuZGlmCisKK05PX1BBUkFNOgorCWlmIChzaGFyZS0+cmV2aWQgIT0gU003NTBMRV9SRVZJU0lPTl9JRCkgeworCQlpZiAoc2hhcmUtPmR1YWwpIHsKKwkJCWlmIChzd2FwKQorCQkJCXNwZWNfc2hhcmUtPnN0YXRlLmRhdGFmbG93ID0gc203NTBfZHVhbF9zd2FwOworCQkJZWxzZQorCQkJCXNwZWNfc2hhcmUtPnN0YXRlLmRhdGFmbG93ID0gc203NTBfZHVhbF9ub3JtYWw7CisJCX0gZWxzZSB7CisJCQlpZiAoc3dhcCkKKwkJCQlzcGVjX3NoYXJlLT5zdGF0ZS5kYXRhZmxvdyA9IHNtNzUwX3NpbXVsX3NlYzsKKwkJCWVsc2UKKwkJCQlzcGVjX3NoYXJlLT5zdGF0ZS5kYXRhZmxvdyA9IHNtNzUwX3NpbXVsX3ByaTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNNNzUwTEUgb25seSBoYXZlIG9uZSBjcnQgY2hhbm5lbCAqLworCQlzcGVjX3NoYXJlLT5zdGF0ZS5kYXRhZmxvdyA9IHNtNzUwX3NpbXVsX3NlYzsKKwkJLyogc203NTBsZSBkbyBub3QgaGF2ZSBjb21wbGV4IGF0dHJpYnV0ZXMgKi8KKwkJc3BlY19zaGFyZS0+c3RhdGUubm9jcnQgPSAwOworCX0KK30KKworc3RhdGljIGludCBseW54ZmJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICogZW50KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvW10gPSB7TlVMTCwgTlVMTH07CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlID0gTlVMTDsKKworCXN0cnVjdCBzbTc1MF9zaGFyZSAqc3BlY19zaGFyZSA9IE5VTEw7CisJc2l6ZV90IHNwZWNfb2Zmc2V0ID0gMDsKKwlpbnQgZmJpZHg7CisKKworCS8qIGVuYWJsZSBkZXZpY2UgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJfZXJyKCJjYW4gbm90IGVuYWJsZSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfZW5hYmxlOworCX0KKworCS8qIHRob3VnaCBvZmZzZXQgb2Ygc2hhcmUgaW4gc203NTBfc2hhcmUgaXMgMCwKKwkgKiB3ZSB1c2UgdGhpcyBtYXJjcm8gYXMgdGhlIHNhbWUgKi8KKwlzcGVjX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbTc1MF9zaGFyZSwgc2hhcmUpOworCisJc3BlY19zaGFyZSA9IGt6YWxsb2Moc2l6ZW9mKCpzcGVjX3NoYXJlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcGVjX3NoYXJlKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc2hhcmUuXG4iKTsKKwkJZ290byBlcnJfc2hhcmU7CisJfQorCisJLyogc2V0dGluZyBzaGFyZSBzdHJ1Y3R1cmUgKi8KKwlzaGFyZSA9IChzdHJ1Y3QgbHlueF9zaGFyZSAqKSgmKHNwZWNfc2hhcmUtPnNoYXJlKSk7CisJc2hhcmUtPmZiaW5mb1swXSA9IHNoYXJlLT5mYmluZm9bMV0gPSBOVUxMOworCXNoYXJlLT5kZXZpZCA9IHBkZXYtPmRldmljZTsKKwlzaGFyZS0+cmV2aWQgPSBwZGV2LT5yZXZpc2lvbjsKKworCXByX2luZm8oInNoYXJlLT5yZXZpZCA9ICUwMnhcbiIsIHNoYXJlLT5yZXZpZCk7CisJc2hhcmUtPnBkZXYgPSBwZGV2OworI2lmZGVmIENPTkZJR19NVFJSCisJc2hhcmUtPm10cnJfb2ZmID0gZ19ub210cnI7CisJc2hhcmUtPm10cnIudnJhbSA9IDA7CisJc2hhcmUtPm10cnIudnJhbV9hZGRlZCA9IDA7CisjZW5kaWYKKwlzaGFyZS0+YWNjZWxfb2ZmID0gZ19ub2FjY2VsOworCXNoYXJlLT5kdWFsID0gZ19kdWFsdmlldzsKKwlzcGluX2xvY2tfaW5pdCgmc2hhcmUtPnNsb2NrKTsKKworCWlmICghc2hhcmUtPmFjY2VsX29mZikgeworCQkvKiBob29rIGRlSW5pdCBhbmQgMmQgcm91dGluZXMsIG5vdGVzIHRoYXQgYmVsb3cgaHdfeHh4CisJCSAqIHJvdXRpbmUgY2FuIHdvcmsgb24gbW9zdCBvZiBseW54IGNoaXBzCisJCSAqIGlmIHNvbWUgY2hpcCBuZWVkIHNwZWNpZmljIGZ1bmN0aW9uLAorCQkgKiBwbGVhc2UgaG9vayBpdCBpbiBzbVhYWF9zZXRfZHJ2IHJvdXRpbmUgKi8KKwkJc2hhcmUtPmFjY2VsLmRlX2luaXQgPSBod19kZV9pbml0OworCQlzaGFyZS0+YWNjZWwuZGVfZmlsbHJlY3QgPSBod19maWxscmVjdDsKKwkJc2hhcmUtPmFjY2VsLmRlX2NvcHlhcmVhID0gaHdfY29weWFyZWE7CisJCXNoYXJlLT5hY2NlbC5kZV9pbWFnZWJsaXQgPSBod19pbWFnZWJsaXQ7CisJCXByX2luZm8oImVuYWJsZSAyZCBhY2NlbGVyYXRpb25cbiIpOworCX0gZWxzZSB7CisJCXByX2luZm8oImRpc2FibGUgMmQgYWNjZWxlcmF0aW9uXG4iKTsKKwl9CisKKwkvKiBjYWxsIGNoaXAgc3BlY2lmaWMgc2V0dXAgcm91dGluZSAgKi8KKwlzbTc1MGZiX3NldHVwKHNoYXJlLCBnX3NldHRpbmdzKTsKKworCS8qIGNhbGwgY2hpcCBzcGVjaWZpYyBtbWFwIHJvdXRpbmUgKi8KKwlpZiAoaHdfc203NTBfbWFwKHNoYXJlLCBwZGV2KSkgeworCQlwcl9lcnIoIk1lbW9yeSBtYXAgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfbWFwOworCX0KKworI2lmZGVmIENPTkZJR19NVFJSCisJaWYgKCFzaGFyZS0+bXRycl9vZmYpIHsKKwkJcHJfaW5mbygiZW5hYmxlIG10cnJcbiIpOworCQlzaGFyZS0+bXRyci52cmFtID0gbXRycl9hZGQoc2hhcmUtPnZpZG1lbV9zdGFydCwKKwkJCQkJICAgIHNoYXJlLT52aWRtZW1fc2l6ZSwKKwkJCQkJICAgIE1UUlJfVFlQRV9XUkNPTUIsIDEpOworCisJCWlmIChzaGFyZS0+bXRyci52cmFtIDwgMCkgeworCQkJLyogZG9uJ3QgYmxvY2sgZHJpdmVyIHdpdGggdGhlIGZhaWx1cmUgb2YgTVRSUiAqLworCQkJcHJfZXJyKCJVbmFibGUgdG8gc2V0dXAgTVRSUi5cbiIpOworCQl9IGVsc2UgeworCQkJc2hhcmUtPm10cnIudnJhbV9hZGRlZCA9IDE7CisJCQlwcl9pbmZvKCJNVFJSIGFkZGVkIHN1Y2Nlc2Z1bGx5XG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCisJbWVtc2V0X2lvKHNoYXJlLT5wdk1lbSwgMCwgc2hhcmUtPnZpZG1lbV9zaXplKTsKKworCXByX2luZm8oInNtJTN4IG1taW8gYWRkcmVzcyA9ICVwXG4iLCBzaGFyZS0+ZGV2aWQsIHNoYXJlLT5wdlJlZyk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgc2hhcmUpOworCisJLyogY2FsbCBjaGlwSW5pdCByb3V0aW5lICovCisJaHdfc203NTBfaW5pdGh3KHNoYXJlLCBwZGV2KTsKKworCS8qIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBpbmZvIHN0cnVjdG9yIGFjY29yZGluZyB0byBnX2R1YWx2aWV3ICovCisJZmJpZHggPSAwOworQUxMT0NfRkI6CisJaW5mb1tmYmlkeF0gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGx5bnhmYl9wYXIpLCAmcGRldi0+ZGV2KTsKKwlpZiAoIWluZm9bZmJpZHhdKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lYnVmZmVyICMlZC5cbiIsIGZiaWR4KTsKKwkJaWYgKGZiaWR4ID09IDApCisJCQlnb3RvIGVycl9pbmZvMF9hbGxvYzsKKwkJZWxzZQorCQkJZ290byBlcnJfaW5mbzFfYWxsb2M7CisJfSBlbHNlIHsKKwkJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwkJaW50IGVycm5vOworCisJCXByX2luZm8oImZyYW1lYnVmZmVyICMlZCBhbGxvYyBva2F5XG4iLCBmYmlkeCk7CisJCXNoYXJlLT5mYmluZm9bZmJpZHhdID0gaW5mb1tmYmlkeF07CisJCXBhciA9IGluZm9bZmJpZHhdLT5wYXI7CisJCXBhci0+c2hhcmUgPSBzaGFyZTsKKworCQkvKiBzZXQgZmJfaW5mbyBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGx5bnhmYl9zZXRfZmJpbmZvKGluZm9bZmJpZHhdLCBmYmlkeCkpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGluaXRpYWwgZmJfaW5mbyAjJWQuXG4iLCBmYmlkeCk7CisJCQlpZiAoZmJpZHggPT0gMCkKKwkJCQlnb3RvIGVycl9pbmZvMF9zZXQ7CisJCQllbHNlCisJCQkJZ290byBlcnJfaW5mbzFfc2V0OworCQl9CisKKwkJLyogcmVnaXN0ZXIgZnJhbWUgYnVmZmVyICovCisJCXByX2luZm8oIlJlYWR5IHRvIHJlZ2lzdGVyIGZyYW1lYnVmZmVyICMlZC5cbiIsIGZiaWR4KTsKKwkJZXJybm8gPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvW2ZiaWR4XSk7CisJCWlmIChlcnJubyA8IDApIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIGZiX2luZm8gIyVkLiBlcnIgJWRcbiIsCisJCQkgICAgICAgZmJpZHgsCisJCQkgICAgICAgZXJybm8pOworCQkJaWYgKGZiaWR4ID09IDApCisJCQkJZ290byBlcnJfcmVnaXN0ZXIwOworCQkJZWxzZQorCQkJCWdvdG8gZXJyX3JlZ2lzdGVyMTsKKwkJfQorCQlwcl9pbmZvKCJBY2NvbXBsaXNoZWQgcmVnaXN0ZXIgZnJhbWVidWZmZXIgIyVkLlxuIiwgZmJpZHgpOworCX0KKworCS8qIG5vIGR1YWwgdmlldyBieSBmYXIgKi8KKwlmYmlkeCsrOworCWlmIChzaGFyZS0+ZHVhbCAmJiBmYmlkeCA8IDIpCisJCWdvdG8gQUxMT0NfRkI7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyMToKK2Vycl9pbmZvMV9zZXQ6CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvWzFdKTsKK2Vycl9pbmZvMV9hbGxvYzoKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm9bMF0pOworZXJyX3JlZ2lzdGVyMDoKK2Vycl9pbmZvMF9zZXQ6CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvWzBdKTsKK2Vycl9pbmZvMF9hbGxvYzoKK2Vycl9tYXA6CisJa2ZyZWUoc3BlY19zaGFyZSk7CitlcnJfc2hhcmU6CitlcnJfZW5hYmxlOgorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbHlueGZiX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCXZvaWQgKnNwZWNfc2hhcmU7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlpbnQgY250OworCisJY250ID0gMjsKKwlzaGFyZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXdoaWxlIChjbnQtLSA+IDApIHsKKwkJaW5mbyA9IHNoYXJlLT5mYmluZm9bY250XTsKKwkJaWYgKCFpbmZvKQorCQkJY29udGludWU7CisJCXBhciA9IGluZm8tPnBhcjsKKworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQkvKiBjbGVhbiBjcnRjICYgb3V0cHV0IGFsbG9jYXRpb25zICovCisJCXBhci0+Y3J0Yy5jbGVhcigmcGFyLT5jcnRjKTsKKwkJcGFyLT5vdXRwdXQuY2xlYXIoJnBhci0+b3V0cHV0KTsKKwkJLyogcmVsZWFzZSBmcmFtZSBidWZmZXIgKi8KKwkJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKwl9CisjaWZkZWYgQ09ORklHX01UUlIKKwlpZiAoc2hhcmUtPm10cnIudnJhbV9hZGRlZCkKKwkJbXRycl9kZWwoc2hhcmUtPm10cnIudnJhbSwKKwkJCSBzaGFyZS0+dmlkbWVtX3N0YXJ0LAorCQkJIHNoYXJlLT52aWRtZW1fc2l6ZSk7CisjZW5kaWYKKworCWlvdW5tYXAoc2hhcmUtPnB2UmVnKTsKKwlpb3VubWFwKHNoYXJlLT5wdk1lbSk7CisJc3BlY19zaGFyZSA9IGNvbnRhaW5lcl9vZihzaGFyZSwgc3RydWN0IHNtNzUwX3NoYXJlLCBzaGFyZSk7CisJa2ZyZWUoZ19zZXR0aW5ncyk7CisJa2ZyZWUoc3BlY19zaGFyZSk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBseW54ZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwlpbnQgbGVuOworCWNoYXIgKm9wdCwgKnRtcDsKKworCisJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykgeworCQlwcl93YXJuKCJubyBvcHRpb25zLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXByX2luZm8oIm9wdGlvbnM6JXNcbiIsIG9wdGlvbnMpOworCisJbGVuID0gc3RybGVuKG9wdGlvbnMpICsgMTsKKwlnX3NldHRpbmdzID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghZ19zZXR0aW5ncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0bXAgPSBnX3NldHRpbmdzOworCisJLyoJTm90ZXM6CisJCWNoYXIgKiBzdHJzZXAoY2hhciAqKnMsY29uc3QgY2hhciAqIGN0KTsKKwkJQHM6IHRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKwkJQGN0IDp0aGUgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yCisKKwkJc3Ryc2VwKCkgdXBkYXRlcyBAb3B0aW9ucyB0byBwb2ludGVyIGFmdGVyIHRoZSBmaXJzdCBmb3VuZCB0b2tlbgorCQlpdCBhbHNvIHJldHVybnMgdGhlIHBvaW50ZXIgYWhlYWQgdGhlIHRva2VuLgorCQkqLworCXdoaWxlICgob3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiOiIpKSAhPSBOVUxMKSB7CisJCS8qIG9wdGlvbnMgdGhhdCBtZWFuIGZvciBhbnkgbHlueCBjaGlwcyBhcmUgY29uZmlndXJlZCBoZXJlICovCisJCWlmICghc3RybmNtcChvcHQsICJub2FjY2VsIiwgc3RybGVuKCJub2FjY2VsIikpKQorCQkJZ19ub2FjY2VsID0gMTsKKyNpZmRlZiBDT05GSUdfTVRSUgorCQllbHNlIGlmICghc3RybmNtcChvcHQsICJub210cnIiLCBzdHJsZW4oIm5vbXRyciIpKSkKKwkJCWdfbm9tdHJyID0gMTsKKyNlbmRpZgorCQllbHNlIGlmICghc3RybmNtcChvcHQsICJkdWFsIiwgc3RybGVuKCJkdWFsIikpKQorCQkJZ19kdWFsdmlldyA9IDE7CisJCWVsc2UgeworCQkJc3RyY2F0KHRtcCwgb3B0KTsKKwkJCXRtcCArPSBzdHJsZW4ob3B0KTsKKwkJCWlmIChvcHRpb25zICE9IE5VTEwpCisJCQkJKnRtcCsrID0gJzonOworCQkJZWxzZQorCQkJCSp0bXArKyA9IDA7CisJCX0KKwl9CisKKwkvKiBtaXNjIGdfc2V0dGluZ3MgYXJlIHRyYW5zcG9ydCB0byBjaGlwIHNwZWNpZmljIHJvdXRpbmVzICovCisJcHJfaW5mbygicGFyYW1ldGVyIGxlZnQgZm9yIGNoaXAgc3BlY2lmaWMgYW5hbHlzaXM6JXNcbiIsIGdfc2V0dGluZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc21pX3BjaV90YWJsZVtdID0geworCXsgUENJX0RFVklDRSgweDEyNmYsIDB4MDc1MCksIH0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNtaV9wY2lfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbHlueGZiX2RyaXZlciA9IHsKKwkubmFtZSA9CQkic203NTBmYiIsCisJLmlkX3RhYmxlID0Jc21pX3BjaV90YWJsZSwKKwkucHJvYmUgPQlseW54ZmJfcGNpX3Byb2JlLAorCS5yZW1vdmUgPQlseW54ZmJfcGNpX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGx5bnhmYl9zdXNwZW5kLAorCS5yZXN1bWUgPSBseW54ZmJfcmVzdW1lLAorI2VuZGlmCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGx5bnhmYl9pbml0KHZvaWQpCit7CisJY2hhciAqb3B0aW9uOworCWludCByZXQ7CisKKyNpZmRlZiBNT0RVTEUKKwlvcHRpb24gPSBnX29wdGlvbjsKKyNlbHNlCisJaWYgKGZiX2dldF9vcHRpb25zKCJzbTc1MGZiIiwgJm9wdGlvbikpCisJCXJldHVybiAtRU5PREVWOworI2VuZGlmCisKKwlseW54ZmJfc2V0dXAob3B0aW9uKTsKKwlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZseW54ZmJfZHJpdmVyKTsKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX2luaXQobHlueGZiX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbHlueGZiX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmx5bnhmYl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobHlueGZiX2V4aXQpOworCittb2R1bGVfcGFyYW0oZ19vcHRpb24sIGNoYXJwLCBTX0lSVUdPKTsKKworTU9EVUxFX1BBUk1fREVTQyhnX29wdGlvbiwKKwkJICJcblx0XHRDb21tb24gb3B0aW9uczpcbiIKKwkJICJcdFx0bm9hY2NlbDpkaXNhYmxlIDJkIGNhcGFiaWxpdGllc1xuIgorCQkgIlx0XHRub210cnI6ZGlzYWJsZSBNVFJSIGF0dHJpYnV0ZSBmb3IgdmlkZW8gbWVtb3J5XG4iCisJCSAiXHRcdGR1YWx2aWV3OmR1YWwgZnJhbWUgYnVmZmVyIGZlYXR1cmUgZW5hYmxlZFxuIgorCQkgIlx0XHRub2h3YzpkaXNhYmxlIGhhcmR3YXJlIGN1cnNvclxuIgorCQkgIlx0XHRVc3VhbCBleGFtcGxlOlxuIgorCQkgIlx0XHRpbnNtb2QgLi9zbTc1MGZiLmtvIGdfb3B0aW9uPVwibm9hY2NlbCxub2h3YywxMjgweDEwMjQtOEA2MFwiXG4iCisJCSApOworCitNT0RVTEVfQVVUSE9SKCJtb25rIGxpdSA8bW9uay5saXVAc2lsaWNvbm1vdGlvbi5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTdWRpcCBNdWtoZXJqZWUgPHN1ZGlwQHZlY3RvcmluZGlhLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgU003NTAgY2hpcHNldCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0N2QyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmgKQEAgLTAsMCArMSwxODYgQEAKKyNpZm5kZWYgTFlOWERSVl9IXworI2RlZmluZSBMWU5YRFJWX0hfCisKKworCisjZGVmaW5lIEZCX0FDQ0VMX1NNSSAweGFiCisvKiBwbGVhc2UgdXNlIHJldmlzaW9uIGlkIHRvIGRpc3Rpbmd1aXNoIHNtNzUwbGUgYW5kIHNtNzUwKi8KKyNkZWZpbmUgU1BDX1NNNzUwIAkwCisKKy8vI2RlZmluZSBTUENfU003NTBMRSA4CisKKyNkZWZpbmUgTUIoeCkgKCh4KTw8MjApCisjZGVmaW5lIE1IWih4KSAoKHgpICogMTAwMDAwMCkKKy8qIGFsaWduIHNob3VsZCBiZSAyLDQsOCwxNiAqLworI2RlZmluZSBQQURESU5HKGFsaWduLGRhdGEpICgoKGRhdGEpKyhhbGlnbiktMSkmKH4oKGFsaWduKSAtMSkpKQorZXh0ZXJuIGludCBzbWlfaW5kZW50OworCisKK3N0cnVjdCBseW54X2FjY2VseworCS8qIGJhc2UgdmlydHVhbCBhZGRyZXNzIG9mIERQUiByZWdpc3RlcnMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKiBkcHJCYXNlOworCS8qIGJhc2UgdmlydHVhbCBhZGRyZXNzIG9mIGRlIGRhdGEgcG9ydCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqIGRwUG9ydEJhc2U7CisKKwkvKiBmdW5jdGlvbiBmb2ludGVycyAqLworCXZvaWQgKCpkZV9pbml0KShzdHJ1Y3QgbHlueF9hY2NlbCAqKTsKKworCWludCAoKmRlX3dhaXQpKHZvaWQpOy8qIHNlZSBpZiBoYXJkd2FyZSByZWFkeSB0byB3b3JrICovCisKKwlpbnQgKCpkZV9maWxscmVjdCkoc3RydWN0IGx5bnhfYWNjZWwgKix1MzIsdTMyLHUzMiwKKwkJCQkJCQl1MzIsdTMyLHUzMix1MzIsdTMyLHUzMik7CisKKwlpbnQgKCpkZV9jb3B5YXJlYSkoc3RydWN0IGx5bnhfYWNjZWwgKix1MzIsdTMyLHUzMix1MzIsCisJCQkJCQl1MzIsdTMyLHUzMix1MzIsCisJCQkJCQl1MzIsdTMyLHUzMix1MzIpOworCisJaW50ICgqZGVfaW1hZ2VibGl0KShzdHJ1Y3QgbHlueF9hY2NlbCAqLGNvbnN0IGNoYXIgKix1MzIsdTMyLHUzMiwKKwkJCQkJCXUzMix1MzIsdTMyLHUzMix1MzIsdTMyLHUzMix1MzIsdTMyKTsKKworfTsKKworLyogCWx5bnhfc2hhcmUgc3RhbmRzIGZvciBhIHByZXNlbnRhdGlvbiBvZiB0d28gZnJhbWUgYnVmZmVyCisJdGhhdCB1c2Ugb25lIHNtaSBhZGFwdG9yICwgaXQgaXMgc2ltaWxhciB0byBhIGJhc2ljIGNsYXNzIG9mIEMrKworKi8KK3N0cnVjdCBseW54X3NoYXJleworCS8qIGNvbW1vbiBtZW1iZXJzICovCisJdTE2IGRldmlkOworCXU4IHJldmlkOworCXN0cnVjdCBwY2lfZGV2ICogcGRldjsKKwlzdHJ1Y3QgZmJfaW5mbyAqIGZiaW5mb1syXTsKKwlzdHJ1Y3QgbHlueF9hY2NlbCBhY2NlbDsKKwlpbnQgYWNjZWxfb2ZmOworCWludCBkdWFsOworI2lmZGVmIENPTkZJR19NVFJSCisJCWludCBtdHJyX29mZjsKKwkJc3RydWN0eworCQkJaW50IHZyYW07CisJCQlpbnQgdnJhbV9hZGRlZDsKKwkJfW10cnI7CisjZW5kaWYKKwkvKiBhbGwgc21pIGdyYXBoaWMgYWRhcHRvciBnb3QgYmVsb3cgYXR0cmlidXRlcyAqLworCXVuc2lnbmVkIGxvbmcgdmlkbWVtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgdmlkcmVnX3N0YXJ0OworCV9fdTMyIHZpZG1lbV9zaXplOworCV9fdTMyIHZpZHJlZ19zaXplOworCXZvaWQgX19pb21lbSAqIHB2UmVnOworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqIHB2TWVtOworCS8qIGxvY2tzKi8KKwlzcGlubG9ja190IHNsb2NrOworCS8qIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJdm9pZCAoKnN1c3BlbmQpKHN0cnVjdCBseW54X3NoYXJlKik7CisJdm9pZCAoKnJlc3VtZSkoc3RydWN0IGx5bnhfc2hhcmUqKTsKK307CisKK3N0cnVjdCBseW54X2N1cnNvcnsKKwkvKiBjdXJzb3Igd2lkdGggLGhlaWdodCBhbmQgc2l6ZSAqLworCWludCB3OworCWludCBoOworCWludCBzaXplOworCS8qIGhhcmR3YXJlIGxpbWl0YXRpb24gKi8KKwlpbnQgbWF4VzsKKwlpbnQgbWF4SDsKKwkvKiBiYXNlIHZpcnR1YWwgYWRkcmVzcyBhbmQgb2Zmc2V0ICBvZiBjdXJzb3IgaW1hZ2UgKi8KKwljaGFyIF9faW9tZW0gKiB2c3RhcnQ7CisJaW50IG9mZnNldDsKKwkvKiBtbWlvIGFkZHIgb2YgaHcgY3Vyc29yICovCisJdm9sYXRpbGUgY2hhciBfX2lvbWVtICogbW1pbzsKKwkvKiB0aGUgbHlueF9zaGFyZSBvZiB0aGlzIGFkYXB0b3IgKi8KKwlzdHJ1Y3QgbHlueF9zaGFyZSAqIHNoYXJlOworCS8qIHByb2Nfcm91dGluZXMgKi8KKwl2b2lkICgqZW5hYmxlKShzdHJ1Y3QgbHlueF9jdXJzb3IgKik7CisJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBseW54X2N1cnNvciAqKTsKKwl2b2lkICgqc2V0U2l6ZSkoc3RydWN0IGx5bnhfY3Vyc29yICosaW50LGludCk7CisJdm9pZCAoKnNldFBvcykoc3RydWN0IGx5bnhfY3Vyc29yICosaW50LGludCk7CisJdm9pZCAoKnNldENvbG9yKShzdHJ1Y3QgbHlueF9jdXJzb3IgKix1MzIsdTMyKTsKKwl2b2lkICgqc2V0RGF0YSkoc3RydWN0IGx5bnhfY3Vyc29yICosdTE2LGNvbnN0IHU4Kixjb25zdCB1OCopOworfTsKKworc3RydWN0IGx5bnhmYl9jcnRjeworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqIHZDdXJzb3I7Ly92aXJ0dWFsIGFkZHJlc3Mgb2YgY3Vyc29yCisJdW5zaWduZWQgY2hhciBfX2lvbWVtICogdlNjcmVlbjsvL3ZpcnR1YWwgYWRkcmVzcyBvZiBvbl9zY3JlZW4KKwlpbnQgb0N1cnNvcjsvL2N1cnNvciBhZGRyZXNzIG9mZnNldCBpbiB2aWRtZW0KKwlpbnQgb1NjcmVlbjsvL29uc2NyZWVuIGFkZHJlc3Mgb2Zmc2V0IGluIHZpZG1lbQorCWludCBjaGFubmVsOy8qIHdoaWNoIGNoYW5uZWwgdGhpcyBjcnRjIHN0YW5kcyBmb3IqLworCXJlc291cmNlX3NpemVfdCB2aWRtZW1fc2l6ZTsvKiB0aGlzIHZpZXcncyB2aWRlbyBtZW1vcnkgbWF4IHNpemUgKi8KKworCS8qIGJlbG93IGF0dHJpYnV0ZXMgYmVsb25nIHRvIGluZm8tPmZpeCwgdGhlaXIgdmFsdWUgZGVwZW5kcyBvbiBzcGVjaWZpYyBhZGFwdG9yKi8KKwl1MTYgbGluZV9wYWQ7LyogcGFkZGluZyBpbmZvcm1hdGlvbjowLDEsMiw0LDgsMTYsLi4uICovCisJdTE2IHhwYW5zdGVwOworCXUxNiB5cGFuc3RlcDsKKwl1MTYgeXdyYXBzdGVwOworCisJdm9pZCAqIHByaXY7CisKKwlpbnQoKnByb2Nfc2V0TW9kZSkoc3RydWN0IGx5bnhmYl9jcnRjKiwKKwkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyosCisJCQkJCQlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8qKTsKKworCWludCgqcHJvY19jaGVja01vZGUpKHN0cnVjdCBseW54ZmJfY3J0Yyosc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKik7CisJaW50KCpwcm9jX3NldENvbFJlZykoc3RydWN0IGx5bnhmYl9jcnRjKix1c2hvcnQsdXNob3J0LHVzaG9ydCx1c2hvcnQpOworCXZvaWQgKCpjbGVhcikoc3RydWN0IGx5bnhmYl9jcnRjKik7CisgICAgICAgIC8qIHBhbiBkaXNwbGF5ICovCisJaW50ICgqcHJvY19wYW5EaXNwbGF5KShzdHJ1Y3QgbHlueGZiX2NydGMgKiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqKTsKKwkvKiBjdXJzb3IgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgbHlueF9jdXJzb3IgY3Vyc29yOworfTsKKworc3RydWN0IGx5bnhmYl9vdXRwdXR7CisJaW50IGRwbXM7CisJaW50IHBhdGhzOworCS8qIAl3aGljaCBwYXRocyhzKSB0aGlzIG91dHB1dCBzdGFuZHMgZm9yLGZvciBzbTc1MDoKKwkJcGF0aHM9MTptZWFucyBvdXRwdXQgZm9yIHBhbmVsIHBhdGhzCisJCXBhdGhzPTI6bWVhbnMgb3V0cHV0IGZvciBjcnQgcGF0aHMKKwkJcGF0aHM9MzptZWFucyBvdXRwdXQgZm9yIGJvdGggcGFuZWwgYW5kIGNydCBwYXRocworCSovCisKKwlpbnQgKiBjaGFubmVsOworCS8qIAl3aGljaCBjaGFubmVsIHRoZXNlIG91dHB1dHMgbGlua2VkIHdpdGgsZm9yIHNtNzUwOgorCQkqY2hhbm5lbD0wIG1lYW5zIHByaW1hcnkgY2hhbm5lbAorCQkqY2hhbm5lbD0xIG1lYW5zIHNlY29uZGFyeSBjaGFubmVsCisJCW91dHB1dC0+Y2hhbm5lbCA9PT4gJmNydGMtPmNoYW5uZWwKKwkqLworCXZvaWQgKiBwcml2OworCisJaW50KCpwcm9jX3NldE1vZGUpKHN0cnVjdCBseW54ZmJfb3V0cHV0KiwKKwkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyosCisJCQkJCQlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8qKTsKKworCWludCgqcHJvY19jaGVja01vZGUpKHN0cnVjdCBseW54ZmJfb3V0cHV0KixzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qKTsKKwlpbnQoKnByb2Nfc2V0QkxBTkspKHN0cnVjdCBseW54ZmJfb3V0cHV0KixpbnQpOworCXZvaWQgICgqY2xlYXIpKHN0cnVjdCBseW54ZmJfb3V0cHV0Kik7Cit9OworCitzdHJ1Y3QgbHlueGZiX3BhcnsKKwkvKiBlaXRoZXIgMCBvciAxIGZvciBkdWFsIGhlYWQgYWRhcHRvciwwIGlzIHRoZSBvbGRlciBvbmUgcmVnaXN0ZXJlZCAqLworCWludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgcHNldWRvX3BhbGV0dGVbMjU2XTsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgY3J0YzsKKwlzdHJ1Y3QgbHlueGZiX291dHB1dCBvdXRwdXQ7CisJc3RydWN0IGZiX2luZm8gKiBpbmZvOworCXN0cnVjdCBseW54X3NoYXJlICogc2hhcmU7Cit9OworCisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKChzaXplX3QpICYoKFRZUEUgKikwKS0+TUVNQkVSKQorI2VuZGlmCisKKworI2RlZmluZSBQU19UT19IWihwcykJXAorCQkJKHsgCVwKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBoeiA9IDEwMDAqMTAwMCoxMDAwKjEwMDBVTEw7CVwKKwkJCWRvX2Rpdihoeixwcyk7CVwKKwkJCSh1bnNpZ25lZCBsb25nKWh6O30pCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwc190b19oeih1bnNpZ25lZCBpbnQgcHN2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbnVtZXJhdG9yPTEwMDAqMTAwMCoxMDAwKjEwMDBVTEw7CisJLyogMTBeMTIgLyBwaWNvc2Vjb25kIHBlcmlvZCBnaXZlcyBmcmVxdWVuY3kgaW4gSHogKi8KKwlkb19kaXYobnVtZXJhdG9yLCBwc3ZhbHVlKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpbnVtZXJhdG9yOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhMzcyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmMKQEAgLTAsMCArMSw0MzcgQEAKKyNpbmNsdWRlPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGU8bGludXgva2VybmVsLmg+CisjaW5jbHVkZTxsaW51eC9lcnJuby5oPgorI2luY2x1ZGU8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZTxsaW51eC9tbS5oPgorI2luY2x1ZGU8bGludXgvc2xhYi5oPgorI2luY2x1ZGU8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlPGxpbnV4L2ZiLmg+CisjaW5jbHVkZTxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlPGxpbnV4L3BjaS5oPgorI2luY2x1ZGU8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGU8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGU8bGludXgvc2NyZWVuX2luZm8uaD4KKworI2luY2x1ZGUgInNtNzUwLmgiCisjaW5jbHVkZSAic203NTBfYWNjZWwuaCIKKyNpbmNsdWRlICJzbTc1MF9oZWxwLmgiCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZHByKHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwsaW50IG9mZnNldCx1MzIgcmVnVmFsdWUpCit7CisJd3JpdGVsKHJlZ1ZhbHVlLGFjY2VsLT5kcHJCYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcmVhZF9kcHIoc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCxpbnQgb2Zmc2V0KQoreworCXJldHVybiByZWFkbChhY2NlbC0+ZHByQmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9kcFBvcnQoc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCx1MzIgZGF0YSkKK3sKKwl3cml0ZWwoZGF0YSxhY2NlbC0+ZHBQb3J0QmFzZSk7Cit9CisKK3ZvaWQgaHdfZGVfaW5pdChzdHJ1Y3QgbHlueF9hY2NlbCAqIGFjY2VsKQoreworCS8qIHNldHVwIDJkIGVuZ2luZSByZWdpc3RlcnMgKi8KKwl1MzIgcmVnLGNscjsKKwkKKwl3cml0ZV9kcHIoYWNjZWwsREVfTUFTS1MsMHhGRkZGRkZGRik7CisKKwkvKiBkcHIxYyAqLworCXJlZyA9IEZJRUxEX1NFVCgwLERFX1NUUkVUQ0hfRk9STUFULFBBVFRFUk5fWFksTk9STUFMKXwKKwkJRklFTERfVkFMVUUoMCxERV9TVFJFVENIX0ZPUk1BVCxQQVRURVJOX1ksMCl8CisJCUZJRUxEX1ZBTFVFKDAsREVfU1RSRVRDSF9GT1JNQVQsUEFUVEVSTl9YLDApfAorCQlGSUVMRF9TRVQoMCxERV9TVFJFVENIX0ZPUk1BVCxBRERSRVNTSU5HLFhZKXwKKwkJRklFTERfVkFMVUUoMCxERV9TVFJFVENIX0ZPUk1BVCxTT1VSQ0VfSEVJR0hULDMpOworCisJY2xyID0gRklFTERfQ0xFQVIoREVfU1RSRVRDSF9GT1JNQVQsUEFUVEVSTl9YWSkmCisJCUZJRUxEX0NMRUFSKERFX1NUUkVUQ0hfRk9STUFULFBBVFRFUk5fWSkmCisJCUZJRUxEX0NMRUFSKERFX1NUUkVUQ0hfRk9STUFULFBBVFRFUk5fWCkmCisJCUZJRUxEX0NMRUFSKERFX1NUUkVUQ0hfRk9STUFULEFERFJFU1NJTkcpJgorCQlGSUVMRF9DTEVBUihERV9TVFJFVENIX0ZPUk1BVCxTT1VSQ0VfSEVJR0hUKTsKKworCS8qIERFX1NUUkVUQ0ggYnBwIGZvcm1hdCBuZWVkIGJlIGluaXRpbGl6ZWQgaW4gc2V0TW9kZSByb3V0aW5lICovCisJd3JpdGVfZHByKGFjY2VsLERFX1NUUkVUQ0hfRk9STUFULChyZWFkX2RwcihhY2NlbCxERV9TVFJFVENIX0ZPUk1BVCkgJiBjbHIpIHwgcmVnKTsKKworCS8qIGRpc2FibGUgY2xpcHBpbmcgYW5kIHRyYW5zcGFyZW50ICovCisJd3JpdGVfZHByKGFjY2VsLERFX0NMSVBfVEwsMCk7Ly9kcHIyYworCXdyaXRlX2RwcihhY2NlbCxERV9DTElQX0JSLDApOy8vZHByMzAKKworCXdyaXRlX2RwcihhY2NlbCxERV9DT0xPUl9DT01QQVJFX01BU0ssMCk7Ly9kcHIyNAorCXdyaXRlX2RwcihhY2NlbCxERV9DT0xPUl9DT01QQVJFLDApOworCisJcmVnID0gRklFTERfU0VUKDAsREVfQ09OVFJPTCxUUkFOU1BBUkVOQ1ksRElTQUJMRSl8CisJCUZJRUxEX1NFVCgwLERFX0NPTlRST0wsVFJBTlNQQVJFTkNZX01BVENILE9QQVFVRSl8CisJCUZJRUxEX1NFVCgwLERFX0NPTlRST0wsVFJBTlNQQVJFTkNZX1NFTEVDVCxTT1VSQ0UpOworCisJY2xyID0gRklFTERfQ0xFQVIoREVfQ09OVFJPTCxUUkFOU1BBUkVOQ1kpJgorCQlGSUVMRF9DTEVBUihERV9DT05UUk9MLFRSQU5TUEFSRU5DWV9NQVRDSCkmCisJCUZJRUxEX0NMRUFSKERFX0NPTlRST0wsVFJBTlNQQVJFTkNZX1NFTEVDVCk7CisKKwkvKiBkcHIwYyAqLworCXdyaXRlX2RwcihhY2NlbCxERV9DT05UUk9MLChyZWFkX2RwcihhY2NlbCxERV9DT05UUk9MKSZjbHIpfHJlZyk7Cit9CisKKy8qIHNldDJkZm9ybWF0IG9ubHkgYmUgY2FsbGVkIGZyb20gc2V0bW9kZSBmdW5jdGlvbnMKKyAqIGJ1dCBpZiB5b3UgbmVlZCBkdWFsIGZyYW1lYnVmZmVyIGRyaXZlcixuZWVkIGNhbGwgc2V0MmRmb3JtYXQKKyAqIGV2ZXJ5IHRpbWUgeW91IHVzZSAyZCBmdW5jdGlvbiAqLworCit2b2lkIGh3X3NldDJkZm9ybWF0KHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwsaW50IGZtdCkKK3sKKwl1MzIgcmVnOworCQorCS8qIGZtdD0wLDEsMiBmb3IgOCwxNiwzMixicHAgb24gc203MTgvNzUwLzUwMiAqLworCXJlZyA9IHJlYWRfZHByKGFjY2VsLERFX1NUUkVUQ0hfRk9STUFUKTsKKwlyZWcgPSBGSUVMRF9WQUxVRShyZWcsREVfU1RSRVRDSF9GT1JNQVQsUElYRUxfRk9STUFULGZtdCk7CisJd3JpdGVfZHByKGFjY2VsLERFX1NUUkVUQ0hfRk9STUFULHJlZyk7Cit9CisKK2ludCBod19maWxscmVjdChzdHJ1Y3QgbHlueF9hY2NlbCAqIGFjY2VsLAorCQkJCXUzMiBiYXNlLHUzMiBwaXRjaCx1MzIgQnBwLAorCQkJCXUzMiB4LHUzMiB5LHUzMiB3aWR0aCx1MzIgaGVpZ2h0LAorCQkJCXUzMiBjb2xvcix1MzIgcm9wKQoreworCXUzMiBkZUN0cmw7CisKKwlpZihhY2NlbC0+ZGVfd2FpdCgpICE9IDApCisJeworCQkvKiBpbnQgdGltZSB3YWl0IGFuZCBhbHdheXMgYnVzeSxzZWVtcyBoYXJkd2FyZQorCQkgKiBnb3Qgc29tZXRoaW5nIGVycm9yICovCisJCXByX2RlYnVnKCIlczpEZSBlbmdpbmUgYWx3YXlzIGJ1c3N5XG4iLF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdyaXRlX2RwcihhY2NlbCxERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRSxiYXNlKTsvL2RwcjQwCisJd3JpdGVfZHByKGFjY2VsLERFX1BJVENILAorCQkJRklFTERfVkFMVUUoMCxERV9QSVRDSCxERVNUSU5BVElPTixwaXRjaC9CcHApfAorCQkJRklFTERfVkFMVUUoMCxERV9QSVRDSCxTT1VSQ0UscGl0Y2gvQnBwKSk7Ly9kcHIxMAorCisJd3JpdGVfZHByKGFjY2VsLERFX1dJTkRPV19XSURUSCwKKwkJCUZJRUxEX1ZBTFVFKDAsREVfV0lORE9XX1dJRFRILERFU1RJTkFUSU9OLHBpdGNoL0JwcCl8CisJCQlGSUVMRF9WQUxVRSgwLERFX1dJTkRPV19XSURUSCxTT1VSQ0UscGl0Y2gvQnBwKSk7Ly9kcHI0NAorCisJd3JpdGVfZHByKGFjY2VsLERFX0ZPUkVHUk9VTkQsY29sb3IpOy8vRFBSMTQKKworCXdyaXRlX2RwcihhY2NlbCxERV9ERVNUSU5BVElPTiwKKwkJCUZJRUxEX1NFVCgwLERFX0RFU1RJTkFUSU9OLFdSQVAsRElTQUJMRSl8CisJCQlGSUVMRF9WQUxVRSgwLERFX0RFU1RJTkFUSU9OLFgseCl8CisJCQlGSUVMRF9WQUxVRSgwLERFX0RFU1RJTkFUSU9OLFkseSkpOy8vZHByNAorCisJd3JpdGVfZHByKGFjY2VsLERFX0RJTUVOU0lPTiwKKwkJCUZJRUxEX1ZBTFVFKDAsREVfRElNRU5TSU9OLFgsd2lkdGgpfAorCQkJRklFTERfVkFMVUUoMCxERV9ESU1FTlNJT04sWV9FVCxoZWlnaHQpKTsvL2RwcjgKKworCWRlQ3RybCA9CisJCUZJRUxEX1NFVCgwLERFX0NPTlRST0wsU1RBVFVTLFNUQVJUKXwKKwkJRklFTERfU0VUKDAsREVfQ09OVFJPTCxESVJFQ1RJT04sTEVGVF9UT19SSUdIVCl8CisJCUZJRUxEX1NFVCgwLERFX0NPTlRST0wsTEFTVF9QSVhFTCxPTil8CisJCUZJRUxEX1NFVCgwLERFX0NPTlRST0wsQ09NTUFORCxSRUNUQU5HTEVfRklMTCl8CisJCUZJRUxEX1NFVCgwLERFX0NPTlRST0wsUk9QX1NFTEVDVCxST1AyKXwKKwkJRklFTERfVkFMVUUoMCxERV9DT05UUk9MLFJPUCxyb3ApOy8vZHByMHhjCisKKwl3cml0ZV9kcHIoYWNjZWwsREVfQ09OVFJPTCxkZUN0cmwpOworCXJldHVybiAwOworfQorCitpbnQgaHdfY29weWFyZWEoCitzdHJ1Y3QgbHlueF9hY2NlbCAqIGFjY2VsLAordW5zaWduZWQgaW50IHNCYXNlLCAgLyogQWRkcmVzcyBvZiBzb3VyY2U6IG9mZnNldCBpbiBmcmFtZSBidWZmZXIgKi8KK3Vuc2lnbmVkIGludCBzUGl0Y2gsIC8qIFBpdGNoIHZhbHVlIG9mIHNvdXJjZSBzdXJmYWNlIGluIEJZVEUgKi8KK3Vuc2lnbmVkIGludCBzeCwKK3Vuc2lnbmVkIGludCBzeSwgICAgIC8qIFN0YXJ0aW5nIGNvb3JkaW5hdGUgb2Ygc291cmNlIHN1cmZhY2UgKi8KK3Vuc2lnbmVkIGludCBkQmFzZSwgIC8qIEFkZHJlc3Mgb2YgZGVzdGluYXRpb246IG9mZnNldCBpbiBmcmFtZSBidWZmZXIgKi8KK3Vuc2lnbmVkIGludCBkUGl0Y2gsIC8qIFBpdGNoIHZhbHVlIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgaW4gQllURSAqLwordW5zaWduZWQgaW50IEJwcCwgICAgLyogQ29sb3IgZGVwdGggb2YgZGVzdGluYXRpb24gc3VyZmFjZSAqLwordW5zaWduZWQgaW50IGR4LAordW5zaWduZWQgaW50IGR5LCAgICAgLyogU3RhcnRpbmcgY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlICovCit1bnNpZ25lZCBpbnQgd2lkdGgsCit1bnNpZ25lZCBpbnQgaGVpZ2h0LCAvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHJlY3RhbmdsZSBpbiBwaXhlbCB2YWx1ZSAqLwordW5zaWduZWQgaW50IHJvcDIpICAgLyogUk9QIHZhbHVlICovCit7CisgICAgdW5zaWduZWQgaW50IG5EaXJlY3Rpb24sIGRlX2N0cmw7CisgICAgaW50IG9wU2lnbjsKKyAgICBuRGlyZWN0aW9uID0gTEVGVF9UT19SSUdIVDsKKwkvKiBEaXJlY3Rpb24gb2YgUk9QMiBvcGVyYXRpb246IDEgPSBMZWZ0IHRvIFJpZ2h0LCAoLTEpID0gUmlnaHQgdG8gTGVmdCAqLworICAgIG9wU2lnbiA9IDE7CisgICAgZGVfY3RybCA9IDA7CisKKyAgICAvKiBJZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2FtZSBzdXJmYWNlLCBuZWVkIHRvIGNoZWNrIGZvciBvdmVybGF5IGNhc2VzICovCisgICAgaWYgKHNCYXNlID09IGRCYXNlICYmIHNQaXRjaCA9PSBkUGl0Y2gpCisgICAgeworICAgICAgICAvKiBEZXRlcm1pbmUgZGlyZWN0aW9uIG9mIG9wZXJhdGlvbiAqLworICAgICAgICBpZiAoc3kgPCBkeSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogKy0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICB8UyAgICAgICAgIHwKKyAgICAgICAgICAgICAgIHwgICArLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgIHwgICB8ICAgICAgfCAgIHwKKyAgICAgICAgICAgICAgIHwgICB8ICAgICAgfCAgIHwKKyAgICAgICAgICAgICAgICstLS18LS0tLS0tKyAgIHwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgRHwKKyAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLSsgKi8KKworICAgICAgICAgICAgbkRpcmVjdGlvbiA9IEJPVFRPTV9UT19UT1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3kgPiBkeSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogKy0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICB8RCAgICAgICAgIHwKKyAgICAgICAgICAgICAgIHwgICArLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgIHwgICB8ICAgICAgfCAgIHwKKyAgICAgICAgICAgICAgIHwgICB8ICAgICAgfCAgIHwKKyAgICAgICAgICAgICAgICstLS18LS0tLS0tKyAgIHwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgU3wKKyAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLSsgKi8KKworICAgICAgICAgICAgbkRpcmVjdGlvbiA9IFRPUF9UT19CT1RUT007CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzeSA9PSBkeSAqLworCisgICAgICAgICAgICBpZiAoc3ggPD0gZHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogKy0tLS0tLSstLS0rLS0tLS0tKworICAgICAgICAgICAgICAgICAgIHxTICAgICB8ICAgfCAgICAgRHwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgIHwgICAgICB8CisgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICB8ICAgICAgfAorICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgfCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICArLS0tLS0tKy0tLSstLS0tLS0rICovCisKKyAgICAgICAgICAgICAgICBuRGlyZWN0aW9uID0gUklHSFRfVE9fTEVGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzeCA+IGR4ICovCisKKyAgICAgICAgICAgICAgICAvKiArLS0tLS0tKy0tLSstLS0tLS0rCisgICAgICAgICAgICAgICAgICAgfEQgICAgIHwgICB8ICAgICBTfAorICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgfCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgIHwgICAgICB8CisgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICB8ICAgICAgfAorICAgICAgICAgICAgICAgICAgICstLS0tLS0rLS0tKy0tLS0tLSsgKi8KKworICAgICAgICAgICAgICAgIG5EaXJlY3Rpb24gPSBMRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChuRGlyZWN0aW9uID09IEJPVFRPTV9UT19UT1ApIHx8IChuRGlyZWN0aW9uID09IFJJR0hUX1RPX0xFRlQpKQorICAgIHsKKyAgICAgICAgc3ggKz0gd2lkdGggLSAxOworICAgICAgICBzeSArPSBoZWlnaHQgLSAxOworICAgICAgICBkeCArPSB3aWR0aCAtIDE7CisgICAgICAgIGR5ICs9IGhlaWdodCAtIDE7CisgICAgICAgIG9wU2lnbiA9ICgtMSk7CisgICAgfQorCisgICAgLyogTm90ZToKKyAgICAgICBERV9GT1JFR1JPVU5EIGFyZSBERV9CQUNLR1JPVU5EIGFyZSBkb24ndCBjYXJlLgorICAgICAgIERFX0NPTE9SX0NPTVBBUkUgYW5kIERFX0NPTE9SX0NPTVBBUkVfTUFLUyBhcmUgc2V0IGJ5IHNldCBkZVNldFRyYW5zcGFyZW5jeSgpLgorICAgICovCisKKyAgICAvKiAyRCBTb3VyY2UgQmFzZS4KKyAgICAgICBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZnJhbWUgYnVmZmVyLgorICAgICovCisgICAgd3JpdGVfZHByKGFjY2VsLERFX1dJTkRPV19TT1VSQ0VfQkFTRSwgc0Jhc2UpOy8vZHByNDAKKworICAgIC8qIDJEIERlc3RpbmF0aW9uIEJhc2UuCisgICAgICAgSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZyYW1lIGJ1ZmZlci4KKyAgICAqLworICAgIHdyaXRlX2RwcihhY2NlbCxERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRSwgZEJhc2UpOy8vZHByNDQKKworI2lmIDAKKyAgICAvKiBQcm9ncmFtIHBpdGNoIChkaXN0YW5jZSBiZXR3ZWVuIHRoZSAxc3QgcG9pbnRzIG9mIHR3byBhZGphY2VudCBsaW5lcykuCisgICAgICAgTm90ZSB0aGF0IGlucHV0IHBpdGNoIGlzIEJZVEUgdmFsdWUsIGJ1dCB0aGUgMkQgUGl0Y2ggcmVnaXN0ZXIgdXNlcworICAgICAgIHBpeGVsIHZhbHVlcy4gTmVlZCBCeXRlIHRvIHBpeGVsIGNvbnZlcnRpb24uCisgICAgKi8KKwlpZihCcHAgPT0gMyl7CisJCQlzeCAqPSAzOworCQkJZHggKj0gMzsKKwkJCXdpZHRoICo9IDM7CisJCXdyaXRlX2RwcihhY2NlbCxERV9QSVRDSCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgREVTVElOQVRJT04sIGRQaXRjaCkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBTT1VSQ0UsICAgICAgc1BpdGNoKSk7Ly9kcHIxMAorCX0KKwllbHNlCisjZW5kaWYKKwl7CisJCXdyaXRlX2RwcihhY2NlbCxERV9QSVRDSCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgREVTVElOQVRJT04sIChkUGl0Y2gvQnBwKSkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBTT1VSQ0UsICAgICAgKHNQaXRjaC9CcHApKSk7Ly9kcHIxMAorCX0KKworICAgIC8qIFNjcmVlbiBXaW5kb3cgd2lkdGggaW4gUGl4ZWxzLgorICAgICAgIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbiBmcmFtZSBidWZmZXIgZm9yIGEgZ2l2ZW4gcG9pbnQuCisgICAgKi8KKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfV0lORE9XX1dJRFRILAorICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfV0lEVEgsIERFU1RJTkFUSU9OLCAoZFBpdGNoL0JwcCkpIHwKKyAgICAgICAgRklFTERfVkFMVUUoMCwgREVfV0lORE9XX1dJRFRILCBTT1VSQ0UsICAgICAgKHNQaXRjaC9CcHApKSk7Ly9kcHIzYworCisJaWYgKGFjY2VsLT5kZV93YWl0KCkgIT0gMCl7CisJCXJldHVybiAtMTsKKwl9CisKKyAgICB7CisKKyAgICAgICAgd3JpdGVfZHByKGFjY2VsLERFX1NPVVJDRSwKKyAgICAgICAgICAgIEZJRUxEX1NFVCAgKDAsIERFX1NPVVJDRSwgV1JBUCwgRElTQUJMRSkgfAorICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgREVfU09VUkNFLCBYX0sxLCBzeCkgICB8CisgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9TT1VSQ0UsIFlfSzIsIHN5KSk7Ly9kcHIwCisgICAgICAgIHdyaXRlX2RwcihhY2NlbCxERV9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgIEZJRUxEX1NFVCAgKDAsIERFX0RFU1RJTkFUSU9OLCBXUkFQLCBESVNBQkxFKSB8CisgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9ERVNUSU5BVElPTiwgWCwgICAgZHgpICB8CisgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9ERVNUSU5BVElPTiwgWSwgICAgZHkpKTsvL2RwcjA0CisgICAgICAgIHdyaXRlX2RwcihhY2NlbCxERV9ESU1FTlNJT04sCisgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFgsICAgIHdpZHRoKSB8CisgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFlfRVQsIGhlaWdodCkpOy8vZHByMDgKKworICAgICAgICBkZV9jdHJsID0KKyAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX0NPTlRST0wsIFJPUCwgcm9wMikgfAorICAgICAgICAgICAgRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFJPUF9TRUxFQ1QsIFJPUDIpIHwKKyAgICAgICAgICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBDT01NQU5ELCBCSVRCTFQpIHwKKyAgICAgICAgICAgICgobkRpcmVjdGlvbiA9PSBSSUdIVF9UT19MRUZUKSA/CisgICAgICAgICAgICBGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgRElSRUNUSU9OLCBSSUdIVF9UT19MRUZUKQorICAgICAgICAgICAgOiBGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgRElSRUNUSU9OLCBMRUZUX1RPX1JJR0hUKSkgfAorICAgICAgICAgICAgRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFNUQVRVUywgU1RBUlQpOworCQl3cml0ZV9kcHIoYWNjZWwsREVfQ09OVFJPTCxkZV9jdHJsKTsvL2RwcjBjCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVHZXRUcmFuc3BhcmVuY3koc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgZGVfY3RybDsKKworICAgIGRlX2N0cmwgPSByZWFkX2RwcihhY2NlbCxERV9DT05UUk9MKTsKKworICAgIGRlX2N0cmwgJj0KKyAgICAgICAgRklFTERfTUFTSyhERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9NQVRDSCkgfAorICAgICAgICBGSUVMRF9NQVNLKERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX1NFTEVDVCl8CisgICAgICAgIEZJRUxEX01BU0soREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1kpOworCisgICAgcmV0dXJuIGRlX2N0cmw7Cit9CisKK2ludCBod19pbWFnZWJsaXQoc3RydWN0IGx5bnhfYWNjZWwgKmFjY2VsLAorCQkgY29uc3QgY2hhciAqcFNyY2J1ZiwgLyogcG9pbnRlciB0byBzdGFydCBvZiBzb3VyY2UgYnVmZmVyIGluIHN5c3RlbSBtZW1vcnkgKi8KKwkJIHUzMiBzcmNEZWx0YSwgICAgICAgICAgLyogUGl0Y2ggdmFsdWUgKGluIGJ5dGVzKSBvZiB0aGUgc291cmNlIGJ1ZmZlciwgK2l2ZSBtZWFucyB0b3AgZG93biBhbmQgLWl2ZSBtZWFuIGJ1dHRvbiB1cCAqLworCQkgdTMyIHN0YXJ0Qml0LCAvKiBNb25vIGRhdGEgY2FuIHN0YXJ0IGF0IGFueSBiaXQgaW4gYSBieXRlLCB0aGlzIHZhbHVlIHNob3VsZCBiZSAwIHRvIDcgKi8KKwkJIHUzMiBkQmFzZSwgICAgLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbjogb2Zmc2V0IGluIGZyYW1lIGJ1ZmZlciAqLworCQkgdTMyIGRQaXRjaCwgICAvKiBQaXRjaCB2YWx1ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlIGluIEJZVEUgKi8KKwkJIHUzMiBieXRlUGVyUGl4ZWwsICAgICAgLyogQ29sb3IgZGVwdGggb2YgZGVzdGluYXRpb24gc3VyZmFjZSAqLworCQkgdTMyIGR4LAorCQkgdTMyIGR5LCAgICAgICAvKiBTdGFydGluZyBjb29yZGluYXRlIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgKi8KKwkJIHUzMiB3aWR0aCwKKwkJIHUzMiBoZWlnaHQsICAgLyogd2lkdGggYW5kIGhlaWdodCBvZiByZWN0YW5nZSBpbiBwaXhlbCB2YWx1ZSAqLworCQkgdTMyIGZDb2xvciwgICAvKiBGb3JlZ3JvdW5kIGNvbG9yIChjb3JyZXNwb25kaW5nIHRvIGEgMSBpbiB0aGUgbW9ub2Nocm9tZSBkYXRhICovCisJCSB1MzIgYkNvbG9yLCAgIC8qIEJhY2tncm91bmQgY29sb3IgKGNvcnJlc3BvbmRpbmcgdG8gYSAwIGluIHRoZSBtb25vY2hyb21lIGRhdGEgKi8KKwkJIHUzMiByb3AyKSAgICAgLyogUk9QIHZhbHVlICovCit7CisgICAgdW5zaWduZWQgaW50IHVsQnl0ZXNQZXJTY2FuOworICAgIHVuc2lnbmVkIGludCB1bDRCeXRlc1BlclNjYW47CisgICAgdW5zaWduZWQgaW50IHVsQnl0ZXNSZW1haW47CisgICAgdW5zaWduZWQgaW50IGRlX2N0cmwgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgYWpSZW1haW5bNF07CisgICAgaW50IGksIGo7CisKKyAgICBzdGFydEJpdCAmPSA3OyAvKiBKdXN0IG1ha2Ugc3VyZSB0aGUgc3RhcnQgYml0IGlzIHdpdGhpbiBsZWdhbCByYW5nZSAqLworICAgIHVsQnl0ZXNQZXJTY2FuID0gKHdpZHRoICsgc3RhcnRCaXQgKyA3KSAvIDg7CisgICAgdWw0Qnl0ZXNQZXJTY2FuID0gdWxCeXRlc1BlclNjYW4gJiB+MzsKKyAgICB1bEJ5dGVzUmVtYWluID0gdWxCeXRlc1BlclNjYW4gJiAzOworCisJaWYoYWNjZWwtPmRlX3dhaXQoKSAhPSAwKQorICAgIHsKKy8vCQlpbmZfbXNnKCIqKiogSW1hZ2VCbGl0IHJldHVybiAtMSAqKipcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogMkQgU291cmNlIEJhc2UuCisgICAgICAgVXNlIDAgZm9yIEhPU1QgQmx0LgorICAgICovCisgICAgd3JpdGVfZHByKGFjY2VsLERFX1dJTkRPV19TT1VSQ0VfQkFTRSwgMCk7CisKKyAgICAvKiAyRCBEZXN0aW5hdGlvbiBCYXNlLgorICAgICAgIEl0IGlzIGFuIGFkZHJlc3Mgb2Zmc2V0ICgxMjggYml0IGFsaWduZWQpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCisgICAgKi8KKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsIGRCYXNlKTsKKyNpZiAwCisgICAgLyogUHJvZ3JhbSBwaXRjaCAoZGlzdGFuY2UgYmV0d2VlbiB0aGUgMXN0IHBvaW50cyBvZiB0d28gYWRqYWNlbnQgbGluZXMpLgorICAgICAgIE5vdGUgdGhhdCBpbnB1dCBwaXRjaCBpcyBCWVRFIHZhbHVlLCBidXQgdGhlIDJEIFBpdGNoIHJlZ2lzdGVyIHVzZXMKKyAgICAgICBwaXhlbCB2YWx1ZXMuIE5lZWQgQnl0ZSB0byBwaXhlbCBjb252ZXJ0aW9uLgorICAgICovCisJaWYoYnl0ZVBlclBpeGVsID09IDMgKXsKKwkJZHggKj0gMzsKKwkJd2lkdGggKj0gMzsKKwkJc3RhcnRCaXQgKj0gMzsKKwkJd3JpdGVfZHByKGFjY2VsLERFX1BJVENILAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBERVNUSU5BVElPTiwgZFBpdGNoKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIFNPVVJDRSwgICAgICBkUGl0Y2gpKTsvL2RwcjEwCisKKwl9CisJZWxzZQorI2VuZGlmCisJeworCQl3cml0ZV9kcHIoYWNjZWwsREVfUElUQ0gsCisJCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIERFU1RJTkFUSU9OLCBkUGl0Y2gvYnl0ZVBlclBpeGVsKSB8CisJCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIFNPVVJDRSwgICAgICBkUGl0Y2gvYnl0ZVBlclBpeGVsKSk7Ly9kcHIxMAorCX0KKworICAgIC8qIFNjcmVlbiBXaW5kb3cgd2lkdGggaW4gUGl4ZWxzLgorICAgICAgIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbiBmcmFtZSBidWZmZXIgZm9yIGEgZ2l2ZW4gcG9pbnQuCisgICAgKi8KKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfV0lORE9XX1dJRFRILAorICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9XSU5ET1dfV0lEVEgsIERFU1RJTkFUSU9OLCAoZFBpdGNoL2J5dGVQZXJQaXhlbCkpIHwKKyAgICAgICAgRklFTERfVkFMVUUoMCwgREVfV0lORE9XX1dJRFRILCBTT1VSQ0UsICAgICAgKGRQaXRjaC9ieXRlUGVyUGl4ZWwpKSk7CisKKyAgICAvKiBOb3RlOiBGb3IgMkQgU291cmNlIGluIEhvc3QgV3JpdGUsIG9ubHkgWF9LMV9NT05PIGZpZWxkIGlzIG5lZWRlZCwgYW5kIFlfSzIgZmllbGQgaXMgbm90IHVzZWQuCisgICAgICAgICAgICAgRm9yIG1vbm8gYml0bWFwLCB1c2Ugc3RhcnRCaXQgZm9yIFhfSzEuICovCisgICAgd3JpdGVfZHByKGFjY2VsLERFX1NPVVJDRSwKKyAgICAgICAgRklFTERfU0VUICAoMCwgREVfU09VUkNFLCBXUkFQLCBESVNBQkxFKSAgICAgICB8CisgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX1NPVVJDRSwgWF9LMV9NT05PLCBzdGFydEJpdCkpOy8vZHByMDAKKworICAgIHdyaXRlX2RwcihhY2NlbCxERV9ERVNUSU5BVElPTiwKKyAgICAgICAgRklFTERfU0VUICAoMCwgREVfREVTVElOQVRJT04sIFdSQVAsIERJU0FCTEUpIHwKKyAgICAgICAgRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFgsICAgIGR4KSAgICB8CisgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBZLCAgICBkeSkpOy8vZHByMDQKKworICAgIHdyaXRlX2RwcihhY2NlbCxERV9ESU1FTlNJT04sCisgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX0RJTUVOU0lPTiwgWCwgICAgd2lkdGgpIHwKKyAgICAgICAgRklFTERfVkFMVUUoMCwgREVfRElNRU5TSU9OLCBZX0VULCBoZWlnaHQpKTsvL2RwcjA4CisKKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfRk9SRUdST1VORCwgZkNvbG9yKTsKKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfQkFDS0dST1VORCwgYkNvbG9yKTsKKworCWRlX2N0cmwgPSBGSUVMRF9WQUxVRSgwLCBERV9DT05UUk9MLCBST1AsIHJvcDIpICAgICAgICAgfAorCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgUk9QX1NFTEVDVCwgUk9QMikgICAgfAorCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgQ09NTUFORCwgSE9TVF9XUklURSkgfAorCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgSE9TVCwgTU9OTykgICAgICAgICAgfAorCQlGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgU1RBVFVTLCBTVEFSVCk7CisKKwl3cml0ZV9kcHIoYWNjZWwsREVfQ09OVFJPTCwgZGVfY3RybCB8IGRlR2V0VHJhbnNwYXJlbmN5KGFjY2VsKSk7CisKKyAgICAvKiBXcml0ZSBNT05PIGRhdGEgKGxpbmUgYnkgbGluZSkgdG8gMkQgRW5naW5lIGRhdGEgcG9ydCAqLworICAgIGZvciAoaT0wOyBpPGhlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgLyogRm9yIGVhY2ggbGluZSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3Mgb2YgNCBieXRlcyAqLworICAgICAgICBmb3IgKGo9MDsgajwodWw0Qnl0ZXNQZXJTY2FuLzQpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlX2RwUG9ydChhY2NlbCwgKih1bnNpZ25lZCBpbnQgKikocFNyY2J1ZiArIChqICogNCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1bEJ5dGVzUmVtYWluKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoYWpSZW1haW4sIHBTcmNidWYrdWw0Qnl0ZXNQZXJTY2FuLCB1bEJ5dGVzUmVtYWluKTsKKyAgICAgICAgICAgIHdyaXRlX2RwUG9ydChhY2NlbCwgKih1bnNpZ25lZCBpbnQgKilhalJlbWFpbik7CisgICAgICAgIH0KKworICAgICAgICBwU3JjYnVmICs9IHNyY0RlbHRhOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9hY2NlbC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWUwYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuaApAQCAtMCwwICsxLDI3NSBAQAorI2lmbmRlZiBBQ0NFTF9IX18KKyNkZWZpbmUgQUNDRUxfSF9fCisKKyNkZWZpbmUgSFdfUk9QMl9DT1BZIDB4YworI2RlZmluZSBIV19ST1AyX1hPUiAweDYKKworLyogbm90ZXM6IGJlbG93IGFkZHJlc3MgYXJlIHRoZSBvZmZzZXQgdmFsdWUgZnJvbSBkZV9iYXNlX2FkZHJlc3MgKDB4MTAwMDAwKSovCisKKy8qIGZvciBzbTcxOC83NTAvNTAyIGRlX2Jhc2UgaXMgYXQgbW1yZWdfMW1iKi8KKyNkZWZpbmUgREVfQkFTRV9BRERSX1RZUEUxIAkweDEwMDAwMAorLyogZm9yIHNtNzEyLGRlX2Jhc2UgaXMgYXQgbW1yZWdfMzJrYiAqLworI2RlZmluZSBERV9CQVNFX0FERFJfVFlQRTIgIDB4ODAwMAorLyogZm9yIHNtNzIyLGRlX2Jhc2UgaXMgYXQgbW1yZWdfMCAqLworI2RlZmluZSBERV9CQVNFX0FERFJfVFlQRTMgMAorCisvKiB0eXBlMSBkYXRhIHBvcnQgYWRkcmVzcyBpcyBhdCBtbXJlZ18weDExMDAwMCovCisjZGVmaW5lIERFX1BPUlRfQUREUl9UWVBFMSAweDExMDAwMAorLyogZm9yIHNtNzEyLGRhdGEgcG9ydCBhZGRyZXNzIGlzIGF0IG1tcmVnXzAgKi8KKyNkZWZpbmUgREVfUE9SVF9BRERSX1RZUEUyIDB4MTAwMDAwCisvKiBmb3Igc203MjIsZGF0YSBwb3J0IGFkZHJlc3MgaXMgYXQgbW1yZWdfMW1iICovCisjZGVmaW5lIERFX1BPUlRfQUREUl9UWVBFMyAweDEwMDAwMAorCisjZGVmaW5lIERFX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBERV9TT1VSQ0VfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBERV9TT1VSQ0VfV1JBUF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NPVVJDRV9XUkFQX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfU09VUkNFX1hfSzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjk6MTYKKyNkZWZpbmUgREVfU09VUkNFX1lfSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBERV9TT1VSQ0VfWF9LMV9NT05PIAkJCQkJCQkyMDoxNgorCisjZGVmaW5lIERFX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBERV9ERVNUSU5BVElPTl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBERV9ERVNUSU5BVElPTl9XUkFQX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0RFU1RJTkFUSU9OX1dSQVBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfREVTVElOQVRJT05fWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MTYKKyNkZWZpbmUgREVfREVTVElOQVRJT05fWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIERFX0RJTUVOU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBERV9ESU1FTlNJT05fWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoxNgorI2RlZmluZSBERV9ESU1FTlNJT05fWV9FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgREVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDCisjZGVmaW5lIERFX0NPTlRST0xfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIERFX0NPTlRST0xfU1RBVFVTX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEFUVVNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDozMAorI2RlZmluZSBERV9DT05UUk9MX1BBVFRFUk5fTU9OTyAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfUEFUVEVSTl9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9VUERBVEVfREVTVElOQVRJT05fWCAgICAgICAgICAgICAgICAgMjk6MjkKKyNkZWZpbmUgREVfQ09OVFJPTF9VUERBVEVfREVTVElOQVRJT05fWF9ESVNBQkxFICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1VQREFURV9ERVNUSU5BVElPTl9YX0VOQUJMRSAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUVVJQ0tfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OjI4CisjZGVmaW5lIERFX0NPTlRST0xfUVVJQ0tfU1RBUlRfRElTQUJMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9RVUlDS19TVEFSVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBERV9DT05UUk9MX0RJUkVDVElPTl9MRUZUX1RPX1JJR0hUICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfRElSRUNUSU9OX1JJR0hUX1RPX0xFRlQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9NQUpPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgREVfQ09OVFJPTF9NQUpPUl9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX01BSk9SX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfU1RFUF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIERFX0NPTlRST0xfU1RFUF9YX1BPU0lUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1hfTkVHQVRJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWV9QT1NJVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfU1RFUF9ZX05FR0FUSVZFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TVFJFVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MjMKKyNkZWZpbmUgREVfQ09OVFJPTF9TVFJFVENIX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1NUUkVUQ0hfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfSE9TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOjIyCisjZGVmaW5lIERFX0NPTlRST0xfSE9TVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9IT1NUX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX0xBU1RfUElYRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAyMToyMQorI2RlZmluZSBERV9DT05UUk9MX0xBU1RfUElYRUxfT0ZGICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfTEFTVF9QSVhFTF9PTiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0JJVEJMVCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfUkVDVEFOR0xFX0ZJTEwgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9ERV9USUxFICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1RSQVBFWk9JRF9GSUxMICAgICAgICAgICAgICAgMworI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfQUxQSEFfQkxFTkQgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9STEVfU1RSSVAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1NIT1JUX1NUUk9LRSAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfTElORV9EUkFXICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9IT1NUX1dSSVRFICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0hPU1RfUkVBRCAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfSE9TVF9XUklURV9CT1RUT01fVVAgICAgICAgICAxMAorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfUk9UQVRFICAgICAgICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfRk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfVEVYVFVSRV9MT0FEICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBERV9DT05UUk9MX1JPUF9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBERV9DT05UUk9MX1JPUF9TRUxFQ1RfUk9QMyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfUk9QX1NFTEVDVF9ST1AyICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1AyX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ6MTQKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1AyX1NPVVJDRV9CSVRNQVAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1JPUDJfU09VUkNFX1BBVFRFUk4gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfTU9OT19EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEyCisjZGVmaW5lIERFX0NPTlRST0xfTU9OT19EQVRBX05PVF9QQUNLRUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9NT05PX0RBVEFfOF9QQUNLRUQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQV8xNl9QQUNLRUQgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFX0NPTlRST0xfTU9OT19EQVRBXzMyX1BBQ0tFRCAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgREVfQ09OVFJPTF9SRVBFQVRfUk9UQVRFICAgICAgICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgREVfQ09OVFJPTF9SRVBFQVRfUk9UQVRFX0RJU0FCTEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1JFUEVBVF9ST1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX01BVENIICAgICAgICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX01BVENIX09QQVFVRSAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfTUFUQ0hfVFJBTlNQQVJFTlQgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9TRUxFQ1QgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfU0VMRUNUX1NPVVJDRSAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9TRUxFQ1RfREVTVElOQVRJT04gICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZICAgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9ESVNBQkxFICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX0VOQUJMRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKy8vIFBzZXVkbyBmaWVsZHMuCisKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSICAgICAgICAgICAgICAgICAgICAgMjc6MjQKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzIyNSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMTM1ICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8zMTUgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzQ1ICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMjcwICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl85MCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzE4MCAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMCAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBERV9DT05UUk9MX1JPVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNAorI2RlZmluZSBERV9DT05UUk9MX1JPVEFUSU9OXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfUk9UQVRJT05fMjcwICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTl85MCAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERV9DT05UUk9MX1JPVEFUSU9OXzE4MCAgICAgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgREVfUElUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAKKyNkZWZpbmUgREVfUElUQ0hfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MTYKKyNkZWZpbmUgREVfUElUQ0hfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MAorCisjZGVmaW5lIERFX0ZPUkVHUk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDE0CisjZGVmaW5lIERFX0ZPUkVHUk9VTkRfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjAKKworI2RlZmluZSBERV9CQUNLR1JPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxOAorI2RlZmluZSBERV9CQUNLR1JPVU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTowCisKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMUMKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUEFUVEVSTl9YWSAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUEFUVEVSTl9YWV9OT1JNQUwgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1hZX09WRVJXUklURSAgICAgICAgICAxCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWSAgICAgICAgICAgICAgICAgICAgIDI5OjI3CisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWCAgICAgICAgICAgICAgICAgICAgIDI1OjIzCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BJWEVMX0ZPUk1BVCAgICAgICAgICAgICAgICAgIDIxOjIwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BJWEVMX0ZPUk1BVF84ICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUElYRUxfRk9STUFUXzE2ICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVRfMzIgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BJWEVMX0ZPUk1BVF8yNCAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HICAgICAgICAgICAgICAgICAgICAxOToxNgorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HX1hZICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX0FERFJFU1NJTkdfTElORUFSICAgICAgICAgICAgIDE1CisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1NPVVJDRV9IRUlHSFQgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBERV9DT0xPUl9DT01QQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMAorI2RlZmluZSBERV9DT0xPUl9DT01QQVJFX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAyMzowCisKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjQKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRV9NQVNLX01BU0tTICAgICAgICAgICAgICAgICAgICAgMjM6MAorCisjZGVmaW5lIERFX01BU0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDI4CisjZGVmaW5lIERFX01BU0tTX0JZVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIERFX01BU0tTX0JJVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBERV9DTElQX1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyQworI2RlZmluZSBERV9DTElQX1RMX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBERV9DTElQX1RMX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBERV9DTElQX1RMX1NUQVRVU19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NMSVBfVExfU1RBVFVTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ0xJUF9UTF9JTkhJQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgREVfQ0xJUF9UTF9JTkhJQklUX09VVFNJREUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DTElQX1RMX0lOSElCSVRfSU5TSURFICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NMSVBfVExfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBERV9DTElQX0JSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMAorI2RlZmluZSBERV9DTElQX0JSX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBERV9DTElQX0JSX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjowCisKKyNkZWZpbmUgREVfTU9OT19QQVRURVJOX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzQKKyNkZWZpbmUgREVfTU9OT19QQVRURVJOX0xPV19QQVRURVJOICAgICAgICAgICAgICAgICAgICAgMzE6MAorCisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDM4CisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9ISUdIX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgIDMxOjAKKworI2RlZmluZSBERV9XSU5ET1dfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzQworI2RlZmluZSBERV9XSU5ET1dfV0lEVEhfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAyODoxNgorI2RlZmluZSBERV9XSU5ET1dfV0lEVEhfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAxMjowCisKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9DUyAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9DU18wICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0NTXzEgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDQKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfRVhUICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfRVhUX0xPQ0FMICAgICAgICAgICAgMAorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9FWFRfRVhURVJOQUwgICAgICAgICAxCisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTXzAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfQ1NfMSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9BRERSRVNTICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgREVfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDgKKyNkZWZpbmUgREVfQUxQSEFfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgREVfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNEMKKyNkZWZpbmUgREVfV1JBUF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgREVfV1JBUF9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIERFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDUwCisjZGVmaW5lIERFX1NUQVRVU19DU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBERV9TVEFUVVNfQ1NDX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRVU19DU0NfTk9UX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RBVFVTX0NTQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9TVEFUVVNfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgREVfU1RBVFVTXzJEX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFUVVNfMkRfTk9UX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRVU18yRF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworCisKKy8qIGJsdCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgVE9QX1RPX0JPVFRPTSAwCisjZGVmaW5lIExFRlRfVE9fUklHSFQgMAorI2RlZmluZSBCT1RUT01fVE9fVE9QIDEKKyNkZWZpbmUgUklHSFRfVE9fTEVGVCAxCisKK3ZvaWQgaHdfc2V0MmRmb3JtYXQoc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCxpbnQgZm10KTsKKwordm9pZCBod19kZV9pbml0KHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwpOworCitpbnQgaHdfZmlsbHJlY3Qoc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCwKKwkJCQl1MzIgYmFzZSx1MzIgcGl0Y2gsdTMyIEJwcCwKKwkJCQl1MzIgeCx1MzIgeSx1MzIgd2lkdGgsdTMyIGhlaWdodCwKKwkJCQl1MzIgY29sb3IsdTMyIHJvcCk7CisKK2ludCBod19jb3B5YXJlYSgKK3N0cnVjdCBseW54X2FjY2VsICogYWNjZWwsCit1bnNpZ25lZCBpbnQgc0Jhc2UsICAvKiBBZGRyZXNzIG9mIHNvdXJjZTogb2Zmc2V0IGluIGZyYW1lIGJ1ZmZlciAqLwordW5zaWduZWQgaW50IHNQaXRjaCwgLyogUGl0Y2ggdmFsdWUgb2Ygc291cmNlIHN1cmZhY2UgaW4gQllURSAqLwordW5zaWduZWQgaW50IHN4LAordW5zaWduZWQgaW50IHN5LCAgICAgLyogU3RhcnRpbmcgY29vcmRpbmF0ZSBvZiBzb3VyY2Ugc3VyZmFjZSAqLwordW5zaWduZWQgaW50IGRCYXNlLCAgLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbjogb2Zmc2V0IGluIGZyYW1lIGJ1ZmZlciAqLwordW5zaWduZWQgaW50IGRQaXRjaCwgLyogUGl0Y2ggdmFsdWUgb2YgZGVzdGluYXRpb24gc3VyZmFjZSBpbiBCWVRFICovCit1bnNpZ25lZCBpbnQgYnBwLCAgICAvKiBDb2xvciBkZXB0aCBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlICovCit1bnNpZ25lZCBpbnQgZHgsCit1bnNpZ25lZCBpbnQgZHksICAgICAvKiBTdGFydGluZyBjb29yZGluYXRlIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgKi8KK3Vuc2lnbmVkIGludCB3aWR0aCwKK3Vuc2lnbmVkIGludCBoZWlnaHQsIC8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgcmVjdGFuZ2xlIGluIHBpeGVsIHZhbHVlICovCit1bnNpZ25lZCBpbnQgcm9wMik7CisKK2ludCBod19pbWFnZWJsaXQoc3RydWN0IGx5bnhfYWNjZWwgKmFjY2VsLAorCQkgY29uc3QgY2hhciAqcFNyY2J1ZiwgLyogcG9pbnRlciB0byBzdGFydCBvZiBzb3VyY2UgYnVmZmVyIGluIHN5c3RlbSBtZW1vcnkgKi8KKwkJIHUzMiBzcmNEZWx0YSwgICAgICAgICAgLyogUGl0Y2ggdmFsdWUgKGluIGJ5dGVzKSBvZiB0aGUgc291cmNlIGJ1ZmZlciwgK2l2ZSBtZWFucyB0b3AgZG93biBhbmQgLWl2ZSBtZWFuIGJ1dHRvbiB1cCAqLworCQkgdTMyIHN0YXJ0Qml0LCAvKiBNb25vIGRhdGEgY2FuIHN0YXJ0IGF0IGFueSBiaXQgaW4gYSBieXRlLCB0aGlzIHZhbHVlIHNob3VsZCBiZSAwIHRvIDcgKi8KKwkJIHUzMiBkQmFzZSwgICAgLyogQWRkcmVzcyBvZiBkZXN0aW5hdGlvbjogb2Zmc2V0IGluIGZyYW1lIGJ1ZmZlciAqLworCQkgdTMyIGRQaXRjaCwgICAvKiBQaXRjaCB2YWx1ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlIGluIEJZVEUgKi8KKwkJIHUzMiBieXRlUGVyUGl4ZWwsICAgICAgLyogQ29sb3IgZGVwdGggb2YgZGVzdGluYXRpb24gc3VyZmFjZSAqLworCQkgdTMyIGR4LAorCQkgdTMyIGR5LCAgICAgICAvKiBTdGFydGluZyBjb29yZGluYXRlIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgKi8KKwkJIHUzMiB3aWR0aCwKKwkJIHUzMiBoZWlnaHQsICAgLyogd2lkdGggYW5kIGhlaWdodCBvZiByZWN0YW5nZSBpbiBwaXhlbCB2YWx1ZSAqLworCQkgdTMyIGZDb2xvciwgICAvKiBGb3JlZ3JvdW5kIGNvbG9yIChjb3JyZXNwb25kaW5nIHRvIGEgMSBpbiB0aGUgbW9ub2Nocm9tZSBkYXRhICovCisJCSB1MzIgYkNvbG9yLCAgIC8qIEJhY2tncm91bmQgY29sb3IgKGNvcnJlc3BvbmRpbmcgdG8gYSAwIGluIHRoZSBtb25vY2hyb21lIGRhdGEgKi8KKwkJIHUzMiByb3AyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfY3Vyc29yLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9jdXJzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ1Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfY3Vyc29yLmMKQEAgLTAsMCArMSwyNTEgQEAKKyNpbmNsdWRlPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGU8bGludXgva2VybmVsLmg+CisjaW5jbHVkZTxsaW51eC9lcnJuby5oPgorI2luY2x1ZGU8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZTxsaW51eC9tbS5oPgorI2luY2x1ZGU8bGludXgvc2xhYi5oPgorI2luY2x1ZGU8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlPGxpbnV4L2ZiLmg+CisjaW5jbHVkZTxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlPGxpbnV4L3BjaS5oPgorI2luY2x1ZGU8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGU8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGU8bGludXgvc2NyZWVuX2luZm8uaD4KKworI2luY2x1ZGUgInNtNzUwLmgiCisjaW5jbHVkZSAic203NTBfaGVscC5oIgorI2luY2x1ZGUgInNtNzUwX2N1cnNvci5oIgorCisKKyNkZWZpbmUgUEVFSzMyKGFkZHIpIFwKK3JlYWRsKGN1cnNvci0+bW1pbyArIChhZGRyKSkKKworI2RlZmluZSBQT0tFMzIoYWRkcixkYXRhKSBcCit3cml0ZWwoKGRhdGEpLGN1cnNvci0+bW1pbyArIChhZGRyKSkKKworLyogY3Vyc29yIGNvbnRyb2wgZm9yIHZveWFnZXIgYW5kIDcxOC83NTAqLworI2RlZmluZSBIV0NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgSFdDX0FERFJFU1NfRU5BQkxFICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgSFdDX0FERFJFU1NfRU5BQkxFX0RJU0FCTEUgICAgICAgICAgMAorI2RlZmluZSBIV0NfQUREUkVTU19FTkFCTEVfRU5BQkxFICAgICAgICAgICAxCisjZGVmaW5lIEhXQ19BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIEhXQ19BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSFdDX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgMQorI2RlZmluZSBIV0NfQUREUkVTU19DUyAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBIV0NfQUREUkVTU19DU18wICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhXQ19BRERSRVNTX0NTXzEgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSFdDX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIEhXQ19MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBIV0NfTE9DQVRJT05fVE9QICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBIV0NfTE9DQVRJT05fVE9QX0lOU0lERSAgICAgICAgICAgICAwCisjZGVmaW5lIEhXQ19MT0NBVElPTl9UT1BfT1VUU0lERSAgICAgICAgICAgIDEKKyNkZWZpbmUgSFdDX0xPQ0FUSU9OX1kgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgSFdDX0xPQ0FUSU9OX0xFRlQgICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgSFdDX0xPQ0FUSU9OX0xFRlRfSU5TSURFICAgICAgICAgICAgMAorI2RlZmluZSBIV0NfTE9DQVRJT05fTEVGVF9PVVRTSURFICAgICAgICAgICAxCisjZGVmaW5lIEhXQ19MT0NBVElPTl9YICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBIV0NfQ09MT1JfMTIgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgSFdDX0NPTE9SXzEyXzJfUkdCNTY1ICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgSFdDX0NPTE9SXzEyXzFfUkdCNTY1ICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIEhXQ19DT0xPUl8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4QworI2RlZmluZSBIV0NfQ09MT1JfM19SR0I1NjUgICAgICAgICAgICAgICAgICAxNTowCisKKworLyogaHdfY3Vyc29yX3h4eCB3b3JrcyBmb3Igdm95YWdlciw3MTggYW5kIDc1MCAqLwordm9pZCBod19jdXJzb3JfZW5hYmxlKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvcikKK3sKKwl1MzIgcmVnOworCXJlZyA9IEZJRUxEX1ZBTFVFKDAsSFdDX0FERFJFU1MsQUREUkVTUyxjdXJzb3ItPm9mZnNldCl8CisJCQlGSUVMRF9TRVQoMCxIV0NfQUREUkVTUyxFWFQsTE9DQUwpfAorCQkJRklFTERfU0VUKDAsSFdDX0FERFJFU1MsRU5BQkxFLEVOQUJMRSk7CisJUE9LRTMyKEhXQ19BRERSRVNTLHJlZyk7Cit9Cit2b2lkIGh3X2N1cnNvcl9kaXNhYmxlKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvcikKK3sKKwlQT0tFMzIoSFdDX0FERFJFU1MsMCk7Cit9CisKK3ZvaWQgaHdfY3Vyc29yX3NldFNpemUoc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yLAorCQkJCQkJaW50IHcsaW50IGgpCit7CisJY3Vyc29yLT53ID0gdzsKKwljdXJzb3ItPmggPSBoOworfQordm9pZCBod19jdXJzb3Jfc2V0UG9zKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCQkJCWludCB4LGludCB5KQoreworCXUzMiByZWc7CisJcmVnID0gRklFTERfVkFMVUUoMCxIV0NfTE9DQVRJT04sWSx5KXwKKwkJCUZJRUxEX1ZBTFVFKDAsSFdDX0xPQ0FUSU9OLFgseCk7CisJUE9LRTMyKEhXQ19MT0NBVElPTixyZWcpOworfQordm9pZCBod19jdXJzb3Jfc2V0Q29sb3Ioc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yLAorCQkJCQkJdTMyIGZnLHUzMiBiZykKK3sKKwlQT0tFMzIoSFdDX0NPTE9SXzEyLChmZzw8MTYpfChiZyYweGZmZmYpKTsKKwlQT0tFMzIoSFdDX0NPTE9SXzMsMHhmZmUwKTsKK30KKwordm9pZCBod19jdXJzb3Jfc2V0RGF0YShzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IsCisJCQl1MTYgcm9wLGNvbnN0IHU4KiBwY29sLGNvbnN0IHU4KiBwbXNrKQoreworCWludCBpLGosY291bnQscGl0Y2gsb2Zmc2V0OworCXU4IGNvbG9yLG1hc2ssb3ByOworCXUxNiBkYXRhOworCXZvaWQgX19pb21lbSAqcGJ1ZmZlciwgKnBzdGFydDsKKworCS8qICBpbiBieXRlKi8KKwlwaXRjaCA9IGN1cnNvci0+dyA+PiAzOworCisJLyogaW4gYnl0ZQkqLworCWNvdW50ID0gcGl0Y2ggKiBjdXJzb3ItPmg7CisKKwkvKiBpbiBieXRlICovCisJb2Zmc2V0ID0gY3Vyc29yLT5tYXhXICogMiAvIDg7CisKKwlkYXRhID0gMDsKKwlwc3RhcnQgPSBjdXJzb3ItPnZzdGFydDsKKwlwYnVmZmVyID0gcHN0YXJ0OworCisvKgorCWlmKG9kZCAmMSl7CisJCWh3X2N1cnNvcl9zZXREYXRhMihjdXJzb3Iscm9wLHBjb2wscG1zayk7CisJfQorCW9kZCsrOworCWlmKG9kZCA+IDB4ZmZmZmZmZjApCisJCW9kZD0wOworKi8KKworCWZvcihpPTA7aTxjb3VudDtpKyspCisJeworCQljb2xvciA9ICpwY29sKys7CisJCW1hc2sgPSAqcG1zaysrOworCQlkYXRhID0gMDsKKworCQkvKiBlaXRoZXIgbWV0aG9kIGJlbG93IHdvcmtzIHdlbGwsCisJCSAqIGJ1dCBtZXRob2QgMiBzaG93cyBubyBsYWcKKwkJICogYW5kIG1ldGhvZCAxIHNlZW1zIGEgYml0IHdyb25nKi8KKyNpZiAwCisJCWlmKHJvcCA9PSBST1BfWE9SKQorCQkJb3ByID0gbWFzayBeIGNvbG9yOworCQllbHNlCisJCQlvcHIgPSBtYXNrICYgY29sb3I7CisKKwkJZm9yKGo9MDtqPDg7aisrKQorCQl7CisKKwkJCWlmKG9wciAmICgweDgwID4+IGopKQorCQkJewkvL3VzZSBmZyBjb2xvcixpZCA9IDIKKwkJCQlkYXRhIHw9IDIgPDwgKGoqMik7CisJCQl9ZWxzZXsKKwkJCQkvL3VzZSBiZyBjb2xvcixpZCA9IDEKKwkJCQlkYXRhIHw9IDEgPDwgKGoqMik7CisJCQl9CisJCX0KKyNlbHNlCisJCWZvcihqPTA7ajw4O2orKyl7CisJCQlpZihtYXNrICYgKDB4ODA+PmopKXsKKwkJCQlpZihyb3AgPT0gUk9QX1hPUikKKwkJCQkJb3ByID0gbWFzayBeIGNvbG9yOworCQkJCWVsc2UKKwkJCQkJb3ByID0gbWFzayAmIGNvbG9yOworCisJCQkJLyogMiBzdGFuZHMgZm9yIGZvcmVjb2xvciBhbmQgMSBmb3IgYmFja2NvbG9yICovCisJCQkJZGF0YSB8PSAoKG9wciAmICgweDgwPj5qKSk/MjoxKTw8KGoqMik7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpb3dyaXRlMTYoZGF0YSwgcGJ1ZmZlcik7CisKKwkJLyogYXNzdW1lIHBpdGNoIGlzIDEsMiw0LDgsLi4uKi8KKyNpZiAwCisJCWlmKCEoKGkrMSkmKHBpdGNoLTEpKSkgICAvKiBiZWxvdyBsaW5lIGVxdWFsIHRvIGlzIGxpbmUgKi8KKyNlbHNlCisJCWlmKChpKzEpICUgcGl0Y2ggPT0gMCkKKyNlbmRpZgorCQl7CisJCQkvKiBuZWVkIGEgcmV0dXJuICovCisJCQlwc3RhcnQgKz0gb2Zmc2V0OworCQkJcGJ1ZmZlciA9IHBzdGFydDsKKwkJfWVsc2V7CisJCQlwYnVmZmVyICs9IHNpemVvZih1MTYpOworCQl9CisKKwl9CisKKworfQorCisKK3ZvaWQgaHdfY3Vyc29yX3NldERhdGEyKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCXUxNiByb3AsY29uc3QgdTgqIHBjb2wsY29uc3QgdTgqIHBtc2spCit7CisJaW50IGksaixjb3VudCxwaXRjaCxvZmZzZXQ7CisJdTggY29sb3IsIG1hc2s7CisJdTE2IGRhdGE7CisJdm9pZCBfX2lvbWVtICpwYnVmZmVyLCAqcHN0YXJ0OworCisJLyogIGluIGJ5dGUqLworCXBpdGNoID0gY3Vyc29yLT53ID4+IDM7CisKKwkvKiBpbiBieXRlCSovCisJY291bnQgPSBwaXRjaCAqIGN1cnNvci0+aDsKKworCS8qIGluIGJ5dGUgKi8KKwlvZmZzZXQgPSBjdXJzb3ItPm1heFcgKiAyIC8gODsKKworCWRhdGEgPSAwOworCXBzdGFydCA9IGN1cnNvci0+dnN0YXJ0OworCXBidWZmZXIgPSBwc3RhcnQ7CisKKwlmb3IoaT0wO2k8Y291bnQ7aSsrKQorCXsKKwkJY29sb3IgPSAqcGNvbCsrOworCQltYXNrID0gKnBtc2srKzsKKwkJZGF0YSA9IDA7CisKKwkJLyogZWl0aGVyIG1ldGhvZCBiZWxvdyB3b3JrcyB3ZWxsLCBidXQgbWV0aG9kIDIgc2hvd3Mgbm8gbGFnICovCisjaWYgMAorCQlpZihyb3AgPT0gUk9QX1hPUikKKwkJCW9wciA9IG1hc2sgXiBjb2xvcjsKKwkJZWxzZQorCQkJb3ByID0gbWFzayAmIGNvbG9yOworCisJCWZvcihqPTA7ajw4O2orKykKKwkJeworCisJCQlpZihvcHIgJiAoMHg4MCA+PiBqKSkKKwkJCXsJLy91c2UgZmcgY29sb3IsaWQgPSAyCisJCQkJZGF0YSB8PSAyIDw8IChqKjIpOworCQkJfWVsc2V7CisJCQkJLy91c2UgYmcgY29sb3IsaWQgPSAxCisJCQkJZGF0YSB8PSAxIDw8IChqKjIpOworCQkJfQorCQl9CisjZWxzZQorCQlmb3Ioaj0wO2o8ODtqKyspeworCQkJaWYobWFzayAmICgxPDxqKSkKKwkJCQlkYXRhIHw9ICgoY29sb3IgJiAoMTw8aikpPzE6Mik8PChqKjIpOworCQl9CisjZW5kaWYKKwkJaW93cml0ZTE2KGRhdGEsIHBidWZmZXIpOworCisJCS8qIGFzc3VtZSBwaXRjaCBpcyAxLDIsNCw4LC4uLiovCisJCWlmKCEoaSYocGl0Y2gtMSkpKQorCQkvL2lmKChpKzEpICUgcGl0Y2ggPT0gMCkKKwkJeworCQkJLyogbmVlZCBhIHJldHVybiAqLworCQkJcHN0YXJ0ICs9IG9mZnNldDsKKwkJCXBidWZmZXIgPSBwc3RhcnQ7CisJCX1lbHNleworCQkJcGJ1ZmZlciArPSBzaXplb2YodTE2KTsKKwkJfQorCisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfY3Vyc29yLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9jdXJzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VkZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfY3Vyc29yLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBMWU5YX0NVUlNPUl9IX18KKyNkZWZpbmUgTFlOWF9DVVJTT1JfSF9fCisKKy8qIGh3X2N1cnNvcl94eHggd29ya3MgZm9yIHZveWFnZXIsNzE4IGFuZCA3NTAgKi8KK3ZvaWQgaHdfY3Vyc29yX2VuYWJsZShzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IpOwordm9pZCBod19jdXJzb3JfZGlzYWJsZShzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IpOwordm9pZCBod19jdXJzb3Jfc2V0U2l6ZShzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IsCisJCQkJCQlpbnQgdyxpbnQgaCk7Cit2b2lkIGh3X2N1cnNvcl9zZXRQb3Moc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yLAorCQkJCQkJaW50IHgsaW50IHkpOwordm9pZCBod19jdXJzb3Jfc2V0Q29sb3Ioc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yLAorCQkJCQkJdTMyIGZnLHUzMiBiZyk7Cit2b2lkIGh3X2N1cnNvcl9zZXREYXRhKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCXUxNiByb3AsY29uc3QgdTgqIGRhdGEsY29uc3QgdTgqIG1hc2spOwordm9pZCBod19jdXJzb3Jfc2V0RGF0YTIoc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yLAorCQkJdTE2IHJvcCxjb25zdCB1OCogZGF0YSxjb25zdCB1OCogbWFzayk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2hlbHAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2hlbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDEyOGQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaGVscC5oCkBAIC0wLDAgKzEsMTExIEBACisjaWZuZGVmIExZTlhfSEVMUF9IX18KKyNkZWZpbmUgTFlOWF9IRUxQX0hfXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0xTQihmKSAgICAgICAgICAgICAoMCA/IGYpCisjZGVmaW5lIF9NU0IoZikgICAgICAgICAgICAgKDEgPyBmKQorI2RlZmluZSBfQ09VTlQoZikgICAgICAgICAgIChfTVNCKGYpIC0gX0xTQihmKSArIDEpCisKKyNkZWZpbmUgUkFXX01BU0soZikgICAgICAgICAoMHhGRkZGRkZGRiA+PiAoMzIgLSBfQ09VTlQoZikpKQorI2RlZmluZSBHRVRfTUFTSyhmKSAgICAgICAgIChSQVdfTUFTSyhmKSA8PCBfTFNCKGYpKQorI2RlZmluZSBHRVRfRklFTEQoZCxmKSAgICAgICgoKGQpID4+IF9MU0IoZikpICYgUkFXX01BU0soZikpCisjZGVmaW5lIFRFU1RfRklFTEQoZCxmLHYpICAgKEdFVF9GSUVMRChkLGYpID09IGYgIyMgXyAjIyB2KQorI2RlZmluZSBTRVRfRklFTEQoZCxmLHYpICAgICgoKGQpICYgfkdFVF9NQVNLKGYpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChmICMjIF8gIyMgdikgJiBSQVdfTUFTSyhmKSkgPDwgX0xTQihmKSkpCisjZGVmaW5lIFNFVF9GSUVMRFYoZCxmLHYpICAgKCgoZCkgJiB+R0VUX01BU0soZikpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHYpICYgUkFXX01BU0soZikpIDw8IF9MU0IoZikpKQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gSW50ZXJuYWwgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIF9GX1NUQVJUKGYpICAgICAgICAgICAgICgwID8gZikKKyNkZWZpbmUgX0ZfRU5EKGYpICAgICAgICAgICAgICAgKDEgPyBmKQorI2RlZmluZSBfRl9TSVpFKGYpICAgICAgICAgICAgICAoMSArIF9GX0VORChmKSAtIF9GX1NUQVJUKGYpKQorI2RlZmluZSBfRl9NQVNLKGYpICAgICAgICAgICAgICAoKCgxIDw8IF9GX1NJWkUoZikpIC0gMSkgPDwgX0ZfU1RBUlQoZikpCisjZGVmaW5lIF9GX05PUk1BTElaRSh2LCBmKSAgICAgICgoKHYpICYgX0ZfTUFTSyhmKSkgPj4gX0ZfU1RBUlQoZikpCisjZGVmaW5lIF9GX0RFTk9STUFMSVpFKHYsIGYpICAgICgoKHYpIDw8IF9GX1NUQVJUKGYpKSAmIF9GX01BU0soZikpCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyBHbG9iYWwgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgRklFTERfR0VUKHgsIHJlZywgZmllbGQpIFwKKyggXAorICAgIF9GX05PUk1BTElaRSgoeCksIHJlZyAjIyBfICMjIGZpZWxkKSBcCispCisKKyNkZWZpbmUgRklFTERfU0VUKHgsIHJlZywgZmllbGQsIHZhbHVlKSBcCisoIFwKKyAgICAoeCAmIH5fRl9NQVNLKHJlZyAjIyBfICMjIGZpZWxkKSkgXAorICAgIHwgX0ZfREVOT1JNQUxJWkUocmVnICMjIF8gIyMgZmllbGQgIyMgXyAjIyB2YWx1ZSwgcmVnICMjIF8gIyMgZmllbGQpIFwKKykKKworI2RlZmluZSBGSUVMRF9WQUxVRSh4LCByZWcsIGZpZWxkLCB2YWx1ZSkgXAorKCBcCisgICAgKHggJiB+X0ZfTUFTSyhyZWcgIyMgXyAjIyBmaWVsZCkpIFwKKyAgICB8IF9GX0RFTk9STUFMSVpFKHZhbHVlLCByZWcgIyMgXyAjIyBmaWVsZCkgXAorKQorCisjZGVmaW5lIEZJRUxEX0NMRUFSKHJlZywgZmllbGQpIFwKKyggXAorICAgIH4gX0ZfTUFTSyhyZWcgIyMgXyAjIyBmaWVsZCkgXAorKQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gRmllbGQgTWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIEZJRUxEX1NUQVJUKGZpZWxkKSAgICAgICAgICAgICAgKDAgPyBmaWVsZCkKKyNkZWZpbmUgRklFTERfRU5EKGZpZWxkKSAgICAgICAgICAgICAgICAoMSA/IGZpZWxkKQorI2RlZmluZSBGSUVMRF9TSVpFKGZpZWxkKSAgICAgICAgICAgICAgICgxICsgRklFTERfRU5EKGZpZWxkKSAtIEZJRUxEX1NUQVJUKGZpZWxkKSkKKyNkZWZpbmUgRklFTERfTUFTSyhmaWVsZCkgICAgICAgICAgICAgICAoKCgxIDw8IChGSUVMRF9TSVpFKGZpZWxkKS0xKSkgfCAoKDEgPDwgKEZJRUxEX1NJWkUoZmllbGQpLTEpKSAtIDEpKSA8PCBGSUVMRF9TVEFSVChmaWVsZCkpCisjZGVmaW5lIEZJRUxEX05PUk1BTElaRShyZWcsIGZpZWxkKSAgICAgKCgocmVnKSAmIEZJRUxEX01BU0soZmllbGQpKSA+PiBGSUVMRF9TVEFSVChmaWVsZCkpCisjZGVmaW5lIEZJRUxEX0RFTk9STUFMSVpFKGZpZWxkLCB2YWx1ZSkgKCgodmFsdWUpIDw8IEZJRUxEX1NUQVJUKGZpZWxkKSkgJiBGSUVMRF9NQVNLKGZpZWxkKSkKKworI2RlZmluZSBGSUVMRF9JTklUKHJlZywgZmllbGQsIHZhbHVlKSAgIEZJRUxEX0RFTk9STUFMSVpFKHJlZyAjIyBfICMjIGZpZWxkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICMjIF8gIyMgZmllbGQgIyMgXyAjIyB2YWx1ZSkKKyNkZWZpbmUgRklFTERfSU5JVF9WQUwocmVnLCBmaWVsZCwgdmFsdWUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklFTERfREVOT1JNQUxJWkUocmVnICMjIF8gIyMgZmllbGQsIHZhbHVlKSkKKyNkZWZpbmUgRklFTERfVkFMX1NFVCh4LCByLCBmLCB2KSAgICAgICB4ID0geCAmIH5GSUVMRF9NQVNLKHIgIyMgXyAjIyBmKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGSUVMRF9ERU5PUk1BTElaRShyICMjIF8gIyMgZiwgciAjIyBfICMjIGYgIyMgXyAjIyB2KQorCisjZGVmaW5lIFJHQihyLCBnLCBiKSBcCisoIFwKKyAgICAodW5zaWduZWQgbG9uZykgKCgocikgPDwgMTYpIHwgKChnKSA8PCA4KSB8IChiKSkgXAorKQorCisjZGVmaW5lIFJHQjE2KHIsIGcsIGIpIFwKKyggXAorICAgICh1bnNpZ25lZCBzaG9ydCkgKCgoKHIpICYgMHhGOCkgPDwgOCkgfCAoKChnKSAmIDB4RkMpIDw8IDMpIHwgKCgoYikgJiAweEY4KSA+PiAzKSkgXAorKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhYnNEaWZmKHVuc2lnbmVkIGludCBhLHVuc2lnbmVkIGludCBiKQoreworCWlmKGE8YikKKwkJcmV0dXJuIGItYTsKKwllbHNlCisJCXJldHVybiBhLWI7Cit9CisKKy8qIG4gLyBkICsgMSAvIDIgPSAoMm4gKyBkKSAvIDJkICovCisjZGVmaW5lIHJvdW5kZWREaXYobnVtLGRlbm9tKQkoKDIgKiAobnVtKSArIChkZW5vbSkpIC8gKDIgKiAoZGVub20pKSkKKyNkZWZpbmUgTUIoeCkgKCh4KTw8MjApCisjZGVmaW5lIEtCKHgpICgoeCk8PDEwKQorI2RlZmluZSBNSHooeCkgKCh4KSAqIDEwMDAwMDApCisKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwZDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2h3LmMKQEAgLTAsMCArMSw2NDIgQEAKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZTxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGU8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGU8bGludXgvbW0uaD4KKyNpbmNsdWRlPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZTxsaW51eC9mYi5oPgorI2luY2x1ZGU8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZTxsaW51eC9pbml0Lmg+CisjaW5jbHVkZTxsaW51eC9wY2kuaD4KKyNpbmNsdWRlPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaWZkZWYgQ09ORklHX01UUlIKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2VuZGlmCisjaW5jbHVkZTxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlPGxpbnV4L3NjcmVlbl9pbmZvLmg+CisKKyNpbmNsdWRlICJzbTc1MC5oIgorI2luY2x1ZGUgInNtNzUwX2h3LmgiCisjaW5jbHVkZSAiZGRrNzUwLmgiCisjaW5jbHVkZSAic203NTBfYWNjZWwuaCIKKworaW50IGh3X3NtNzUwX21hcChzdHJ1Y3QgbHlueF9zaGFyZSogc2hhcmUsIHN0cnVjdCBwY2lfZGV2KiBwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHNtNzUwX3NoYXJlICogc3BlY19zaGFyZTsKKwkKKworCXNwZWNfc2hhcmUgPSBjb250YWluZXJfb2Yoc2hhcmUsIHN0cnVjdCBzbTc1MF9zaGFyZSxzaGFyZSk7CisJcmV0ID0gMDsKKworCXNoYXJlLT52aWRyZWdfc3RhcnQgID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCXNoYXJlLT52aWRyZWdfc2l6ZSA9IE1CKDIpOworCisJcHJfaW5mbygibW1pbyBwaHlBZGRyID0gJWx4XG4iLCBzaGFyZS0+dmlkcmVnX3N0YXJ0KTsKKworCS8qIHJlc2VydmUgdGhlIHZpZHJlZyBzcGFjZSBvZiBzbWkgYWRhcHRvcgorCSAqIGlmIHlvdSBkbyB0aGlzLCB1IG5lZWQgdG8gYWRkIHJlbGVhc2UgcmVnaW9uIGNvZGUKKwkgKiBpbiBseW54ZmJfcmVtb3ZlLCBvciBtZW1vcnkgd2lsbCBub3QgYmUgbWFwcGVkIGFnYWluCisJICogc3VjY2Vzc2Z1bGx5CisJICogKi8KKworCWlmKChyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMSwgInNtNzUwZmIiKSkpCisJeworCQlwcl9lcnIoIkNhbiBub3QgcmVxdWVzdCBQQ0kgcmVnaW9ucy5cbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogbm93IG1hcCBtbWlvIGFuZCB2aWRtZW0qLworCXNoYXJlLT5wdlJlZyA9IGlvcmVtYXBfbm9jYWNoZShzaGFyZS0+dmlkcmVnX3N0YXJ0LCBzaGFyZS0+dmlkcmVnX3NpemUpOworCWlmKCFzaGFyZS0+cHZSZWcpeworCQlwcl9lcnIoIm1taW8gZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBleGl0OworCX1lbHNleworCQlwcl9pbmZvKCJtbWlvIHZpcnR1YWwgYWRkciA9ICVwXG4iLCBzaGFyZS0+cHZSZWcpOworCX0KKworCQorCXNoYXJlLT5hY2NlbC5kcHJCYXNlID0gc2hhcmUtPnB2UmVnICsgREVfQkFTRV9BRERSX1RZUEUxOworCXNoYXJlLT5hY2NlbC5kcFBvcnRCYXNlID0gc2hhcmUtPnB2UmVnICsgREVfUE9SVF9BRERSX1RZUEUxOworCisJZGRrNzUwX3NldF9tbWlvKHNoYXJlLT5wdlJlZyxzaGFyZS0+ZGV2aWQsIHNoYXJlLT5yZXZpZCk7CisKKwlzaGFyZS0+dmlkbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCS8qIGRvbid0IHVzZSBwZGV2X3Jlc291cmNlW3hdLmVuZCAtIHJlc291cmNlW3hdLnN0YXJ0IHRvCisJICogY2FsY3VsYXRlIHRoZSByZXNvdXJjZSBzaXplLGl0cyBvbmx5IHRoZSBtYXhpbXVtIGF2YWlsYWJsZQorCSAqIHNpemUgYnV0IG5vdCB0aGUgYWN0dWFsIHNpemUsdXNlCisJICogQGh3X3NtNzUwX2dldFZNU2l6ZSBmdW5jdGlvbiBjYW4gYmUgc2FmZS4KKwkgKiAqLworCXNoYXJlLT52aWRtZW1fc2l6ZSA9IGh3X3NtNzUwX2dldFZNU2l6ZShzaGFyZSk7CisJcHJfaW5mbygidmlkZW8gbWVtb3J5IHBoeUFkZHIgPSAlbHgsIHNpemUgPSAldSBieXRlc1xuIiwKKwlzaGFyZS0+dmlkbWVtX3N0YXJ0LCBzaGFyZS0+dmlkbWVtX3NpemUpOworCisJLyogcmVzZXJ2ZSB0aGUgdmlkbWVtIHNwYWNlIG9mIHNtaSBhZGFwdG9yICovCisjaWYgMAorCWlmKChyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwwLF9tb2R1bGVOYW1lXykpKQorCXsKKwkJcHJfZXJyKCJDYW4gbm90IHJlcXVlc3QgUENJIHJlZ2lvbnMuXG4iKTsKKwkJZ290byBleGl0OworCX0KKyNlbmRpZgorCisJc2hhcmUtPnB2TWVtID0gaW9yZW1hcChzaGFyZS0+dmlkbWVtX3N0YXJ0LAorCQkJCQkJCXNoYXJlLT52aWRtZW1fc2l6ZSk7CisKKwlpZighc2hhcmUtPnB2TWVtKXsKKwkJcHJfZXJyKCJNYXAgdmlkZW8gbWVtb3J5IGZhaWxlZFxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9ZWxzZXsKKwkJcHJfaW5mbygidmlkZW8gbWVtb3J5IHZhZGRyID0gJXBcbiIsIHNoYXJlLT5wdk1lbSk7CisJfQorZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisKKworaW50IGh3X3NtNzUwX2luaXRodyhzdHJ1Y3QgbHlueF9zaGFyZSogc2hhcmUsIHN0cnVjdCBwY2lfZGV2ICogcGRldikKK3sKKwlzdHJ1Y3Qgc203NTBfc2hhcmUgKiBzcGVjX3NoYXJlOworCXN0cnVjdCBpbml0X3N0YXR1cyAqIHBhcm07CisJCisJc3BlY19zaGFyZSA9IGNvbnRhaW5lcl9vZihzaGFyZSwgc3RydWN0IHNtNzUwX3NoYXJlLHNoYXJlKTsKKwlwYXJtID0gJnNwZWNfc2hhcmUtPnN0YXRlLmluaXRQYXJtOworCWlmKHBhcm0tPmNoaXBfY2xrID09IDApCisJCXBhcm0tPmNoaXBfY2xrID0gKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSk/CisJCQkJCQlERUZBVUxUX1NNNzUwTEVfQ0hJUF9DTE9DSyA6CisJCQkJCQlERUZBVUxUX1NNNzUwX0NISVBfQ0xPQ0s7CisKKwlpZihwYXJtLT5tZW1fY2xrID09IDApCisJCXBhcm0tPm1lbV9jbGsgPSBwYXJtLT5jaGlwX2NsazsKKwlpZihwYXJtLT5tYXN0ZXJfY2xrID09IDApCisJCXBhcm0tPm1hc3Rlcl9jbGsgPSBwYXJtLT5jaGlwX2Nsay8zOworCisJZGRrNzUwX2luaXRIdygoaW5pdGNoaXBfcGFyYW1fdCAqKSZzcGVjX3NoYXJlLT5zdGF0ZS5pbml0UGFybSk7CisJLyogZm9yIHNtNzE4LG9wZW4gcGNpIGJ1cnN0ICovCisJaWYoc2hhcmUtPmRldmlkID09IDB4NzE4KXsKKwkJUE9LRTMyKFNZU1RFTV9DVFJMLAorCQkJCUZJRUxEX1NFVChQRUVLMzIoU1lTVEVNX0NUUkwpLCBTWVNURU1fQ1RSTCwgUENJX0JVUlNULCBPTikpOworCX0KKworCS8qIHNtNzUwIHVzZSBzaWkxNjQsIGl0IGNhbiBiZSBzZXR1cCB3aXRoIGRlZmF1bHQgdmFsdWUKKwkgKiBieSBvbiBwb3dlciwgc28gaW5pdERWSURpc3AgY2FuIGJlIHNraXBwZWQgKi8KKyNpZiAwCisJZGRrNzUwX2luaXREVklEaXNwKCk7CisjZW5kaWYKKworCWlmKGdldENoaXBUeXBlKCkgIT0gU003NTBMRSkKKwl7CisJCS8qIGRvZXMgdXNlciBuZWVkIENSVCA/Ki8KKwkJaWYoc3BlY19zaGFyZS0+c3RhdGUubm9jcnQpeworCQkJUE9LRTMyKE1JU0NfQ1RSTCwKKwkJCQkJRklFTERfU0VUKFBFRUszMihNSVNDX0NUUkwpLAorCQkJCQlNSVNDX0NUUkwsCisJCQkJCURBQ19QT1dFUiwgT0ZGKSk7CisJCQkvKiBzaHV0IG9mZiBkcG1zICovCisJCQlQT0tFMzIoU1lTVEVNX0NUUkwsCisJCQkJCUZJRUxEX1NFVChQRUVLMzIoU1lTVEVNX0NUUkwpLAorCQkJCQlTWVNURU1fQ1RSTCwKKwkJCQkJRFBNUywgVk5ITikpOworCQl9ZWxzZXsKKwkJCVBPS0UzMihNSVNDX0NUUkwsCisJCQkJCUZJRUxEX1NFVChQRUVLMzIoTUlTQ19DVFJMKSwKKwkJCQkJTUlTQ19DVFJMLAorCQkJCQlEQUNfUE9XRVIsIE9OKSk7CisJCQkvKiB0dXJuIG9uIGRwbXMgKi8KKwkJCVBPS0UzMihTWVNURU1fQ1RSTCwKKwkJCQkJRklFTERfU0VUKFBFRUszMihTWVNURU1fQ1RSTCksCisJCQkJCVNZU1RFTV9DVFJMLAorCQkJCQlEUE1TLCBWUEhQKSk7CisJCX0KKworCQlzd2l0Y2ggKHNwZWNfc2hhcmUtPnN0YXRlLnBubHR5cGUpeworCQkJY2FzZSBzbTc1MF9kb3VibGVURlQ6CisJCQljYXNlIHNtNzUwXzI0VEZUOgorCQkJY2FzZSBzbTc1MF9kdWFsVEZUOgorCQkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCwKKwkJCQlGSUVMRF9WQUxVRShQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKSwKKwkJCQkJCQlQQU5FTF9ESVNQTEFZX0NUUkwsCisJCQkJCQkJVEZUX0RJU1AsCisJCQkJCQkJc3BlY19zaGFyZS0+c3RhdGUucG5sdHlwZSkpOworCQkJYnJlYWs7CisJCX0KKwl9ZWxzZXsKKwkJLyogZm9yIDc1MExFICxubyBEVkkgY2hpcCBpbml0aWxpemF0aW9uIG1ha2VzIE1vbml0b3Igbm8gc2lnbmFsICovCisJCS8qIFNldCB1cCBHUElPIGZvciBzb2Z0d2FyZSBJMkMgdG8gcHJvZ3JhbSBEVkkgY2hpcCBpbiB0aGUKKwkJICAgWGlsaW54IFNQNjA1IGJvYXJkLCBpbiBvcmRlciB0byBoYXZlIHZpZGVvIHNpZ25hbC4KKwkJICovCisgICAgICAgIHN3STJDSW5pdCgwLDEpOworCisKKyAgICAgICAgLyogQ3VzdG9tZXIgbWF5IE5PVCB1c2UgQ0g3MzAxIERWSSBjaGlwLCB3aGljaCBoYXMgdG8gYmUKKyAgICAgICAgICAgaW5pdGlhbGl6ZWQgZGlmZmVyZW50bHkuCisgICAgICAgICAqLworICAgICAgICBpZiAoc3dJMkNSZWFkUmVnKDB4ZWMsIDB4NGEpID09IDB4OTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIgdmFsdWVzIGZvciBDSDczMDEgYXJlIGZyb20KKyAgICAgICAgICAgICAgIENocm9udGVsIGFwcCBub3RlIGFuZCBvdXIgZXhwZXJpbWVudC4KKyAgICAgICAgICAgICAqLworCQkJcHJfaW5mbygieWVzLENINzMwMSBEVkkgY2hpcCBmb3VuZFxuIik7CisgICAgICAgICAgICBzd0kyQ1dyaXRlUmVnKDB4ZWMsIDB4MWQsIDB4MTYpOworICAgICAgICAgICAgc3dJMkNXcml0ZVJlZygweGVjLCAweDIxLCAweDkpOworICAgICAgICAgICAgc3dJMkNXcml0ZVJlZygweGVjLCAweDQ5LCAweEMwKTsKKwkJCXByX2luZm8oIm9rYXksQ0g3MzAxIERWSSBjaGlwIHNldHVwIGRvbmVcbiIpOworICAgICAgICB9CisJfQorCisJLyogaW5pdCAyZCBlbmdpbmUgKi8KKwlpZighc2hhcmUtPmFjY2VsX29mZil7CisJCWh3X3NtNzUwX2luaXRBY2NlbChzaGFyZSk7CisvLwkJc2hhcmUtPmFjY2VsLmRlX3dhaXQgPSBod19zbTc1MF9kZVdhaXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworcmVzb3VyY2Vfc2l6ZV90IGh3X3NtNzUwX2dldFZNU2l6ZShzdHJ1Y3QgbHlueF9zaGFyZSAqIHNoYXJlKQoreworCXJlc291cmNlX3NpemVfdCByZXQ7CisJCisJcmV0ID0gZGRrNzUwX2dldFZNU2l6ZSgpOworCXJldHVybiByZXQ7Cit9CisKKworCitpbnQgaHdfc203NTBfb3V0cHV0X2NoZWNrTW9kZShzdHJ1Y3QgbHlueGZiX291dHB1dCogb3V0cHV0LCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qIHZhcikKK3sKKwkKKwlyZXR1cm4gMDsKK30KKworCitpbnQgaHdfc203NTBfb3V0cHV0X3NldE1vZGUoc3RydWN0IGx5bnhmYl9vdXRwdXQqIG91dHB1dCwKKwkJCQkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyogdmFyLCBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8qIGZpeCkKK3sKKwlpbnQgcmV0OworCWRpc3Bfb3V0cHV0X3QgZGlzcFNldDsKKwlpbnQgY2hhbm5lbDsKKwkKKwlyZXQgPSAwOworCWRpc3BTZXQgPSAwOworCWNoYW5uZWwgPSAqb3V0cHV0LT5jaGFubmVsOworCisKKwlpZihnZXRDaGlwVHlwZSgpICE9IFNNNzUwTEUpeworCQlpZihjaGFubmVsID09IHNtNzUwX3ByaW1hcnkpeworCQkJcHJfaW5mbygicHJpbWFyeSBjaGFubmVsXG4iKTsKKwkJCWlmKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9wYW5lbCkKKwkJCQlkaXNwU2V0IHw9IGRvX0xDRDFfUFJJOworCQkJaWYob3V0cHV0LT5wYXRocyAmIHNtNzUwX2NydCkKKwkJCQlkaXNwU2V0IHw9IGRvX0NSVF9QUkk7CisKKwkJfWVsc2V7CisJCQlwcl9pbmZvKCJzZWNvbmRhcnkgY2hhbm5lbFxuIik7CisJCQlpZihvdXRwdXQtPnBhdGhzICYgc203NTBfcGFuZWwpCisJCQkJZGlzcFNldCB8PSBkb19MQ0QxX1NFQzsKKwkJCWlmKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9jcnQpCisJCQkJZGlzcFNldCB8PSBkb19DUlRfU0VDOworCisJCX0KKwkJZGRrNzUwX3NldExvZ2ljYWxEaXNwT3V0KGRpc3BTZXQpOworCX1lbHNleworCQkvKiBqdXN0IG9wZW4gRElTUExBWV9DT05UUk9MXzc1MExFIHJlZ2lzdGVyIGJpdCAzOjAqLworCQl1MzIgcmVnOworCQlyZWcgPSBQRUVLMzIoRElTUExBWV9DT05UUk9MXzc1MExFKTsKKwkJcmVnIHw9IDB4ZjsKKwkJUE9LRTMyKERJU1BMQVlfQ09OVFJPTF83NTBMRSwgcmVnKTsKKwl9CisKKwlwcl9pbmZvKCJkZGsgc2V0bG9naWNkaXNwb3V0IGRvbmUgXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGh3X3NtNzUwX291dHB1dF9jbGVhcihzdHJ1Y3QgbHlueGZiX291dHB1dCogb3V0cHV0KQoreworCQorCXJldHVybjsKK30KKworaW50IGh3X3NtNzUwX2NydGNfY2hlY2tNb2RlKHN0cnVjdCBseW54ZmJfY3J0YyogY3J0Yywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKiB2YXIpCit7CisJc3RydWN0IGx5bnhfc2hhcmUgKiBzaGFyZTsKKwkKKworCXNoYXJlID0gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBseW54ZmJfcGFyLGNydGMpLT5zaGFyZTsKKworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCl7CisJCWNhc2UgODoKKwkJY2FzZSAxNjoKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJaWYgKHNoYXJlLT5yZXZpZCA9PSBTTTc1MExFX1JFVklTSU9OX0lEKSB7CisJCQkJcHJfZGVidWcoIjc1MGxlIGRvIG5vdCBzdXBwb3J0IDMyYnBwXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorCXNldCB0aGUgY29udHJvbGxlcidzIG1vZGUgZm9yIEBjcnRjIGNoYXJnZWQgd2l0aCBAdmFyIGFuZCBAZml4IHBhcmFtZXRlcnMKKyovCitpbnQgaHdfc203NTBfY3J0Y19zZXRNb2RlKHN0cnVjdCBseW54ZmJfY3J0YyogY3J0YywKKwkJCQkJCQkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKiB2YXIsCisJCQkJCQkJCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyogZml4KQoreworCWludCByZXQsZm10OworCXUzMiByZWc7CisJbW9kZV9wYXJhbWV0ZXJfdCBtb2RwYXJtOworCWNsb2NrX3R5cGVfdCBjbG9jazsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqIHNoYXJlOworCXN0cnVjdCBseW54ZmJfcGFyICogcGFyOworCisJCisJcmV0ID0gMDsKKwlwYXIgPSBjb250YWluZXJfb2YoY3J0Yywgc3RydWN0IGx5bnhmYl9wYXIsIGNydGMpOworCXNoYXJlID0gcGFyLT5zaGFyZTsKKyNpZiAxCisJaWYoIXNoYXJlLT5hY2NlbF9vZmYpeworCQkvKiBzZXQgMmQgZW5naW5lIHBpeGVsIGZvcm1hdCBhY2NvcmRpbmcgdG8gbW9kZSBicHAgKi8KKwkJc3dpdGNoKHZhci0+Yml0c19wZXJfcGl4ZWwpeworCQkJY2FzZSA4OgorCQkJCWZtdCA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE2OgorCQkJCWZtdCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDMyOgorCQkJZGVmYXVsdDoKKwkJCQlmbXQgPSAyOworCQkJCWJyZWFrOworCQl9CisJCWh3X3NldDJkZm9ybWF0KCZzaGFyZS0+YWNjZWwsIGZtdCk7CisJfQorI2VuZGlmCisKKwkvKiBzZXQgdGltaW5nICovCisvLwltb2RwYXJtLnBpeGVsX2Nsb2NrID0gUFNfVE9fSFoodmFyLT5waXhjbG9jayk7CisJbW9kcGFybS5waXhlbF9jbG9jayA9IHBzX3RvX2h6KHZhci0+cGl4Y2xvY2spOworCW1vZHBhcm0udmVydGljYWxfc3luY19wb2xhcml0eSA9ICh2YXItPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgPyBQT1M6TkVHOworCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyBQT1M6TkVHOworCW1vZHBhcm0uY2xvY2tfcGhhc2VfcG9sYXJpdHkgPSAodmFyLT5zeW5jJiBGQl9TWU5DX0NPTVBfSElHSF9BQ1QpID8gUE9TOk5FRzsKKwltb2RwYXJtLmhvcml6b250YWxfZGlzcGxheV9lbmQgPSB2YXItPnhyZXM7CisJbW9kcGFybS5ob3Jpem9udGFsX3N5bmNfd2lkdGggPSB2YXItPmhzeW5jX2xlbjsKKwltb2RwYXJtLmhvcml6b250YWxfc3luY19zdGFydCA9IHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luOworCW1vZHBhcm0uaG9yaXpvbnRhbF90b3RhbCA9IHZhci0+eHJlcyArIHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOworCW1vZHBhcm0udmVydGljYWxfZGlzcGxheV9lbmQgPSB2YXItPnlyZXM7CisJbW9kcGFybS52ZXJ0aWNhbF9zeW5jX2hlaWdodCA9IHZhci0+dnN5bmNfbGVuOworCW1vZHBhcm0udmVydGljYWxfc3luY19zdGFydCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luOworCW1vZHBhcm0udmVydGljYWxfdG90YWwgPSB2YXItPnlyZXMgKyB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CisKKwkvKiBjaG9vc2UgcGxsICovCisJaWYoY3J0Yy0+Y2hhbm5lbCAhPSBzbTc1MF9zZWNvbmRhcnkpCisJCWNsb2NrID0gUFJJTUFSWV9QTEw7CisJZWxzZQorCQljbG9jayA9IFNFQ09OREFSWV9QTEw7CisKKwlwcl9kZWJ1ZygiUmVxdWVzdCBwaXhlbCBjbG9jayA9ICVsdVxuIiwgbW9kcGFybS5waXhlbF9jbG9jayk7CisJcmV0ID0gZGRrNzUwX3NldE1vZGVUaW1pbmcoJm1vZHBhcm0sIGNsb2NrKTsKKwlpZihyZXQpeworCQlwcl9lcnIoIlNldCBtb2RlIHRpbWluZyBmYWlsZWRcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYoY3J0Yy0+Y2hhbm5lbCAhPSBzbTc1MF9zZWNvbmRhcnkpeworCQkvKiBzZXQgcGl0Y2gsIG9mZnNldCAsd2lkdGgsc3RhcnQgYWRkcmVzcyAsZXRjLi4uICovCisJCVBPS0UzMihQQU5FTF9GQl9BRERSRVNTLAorCQkJRklFTERfU0VUKDAsIFBBTkVMX0ZCX0FERFJFU1MsIFNUQVRVUywgQ1VSUkVOVCl8CisJCQlGSUVMRF9TRVQoMCwgUEFORUxfRkJfQUREUkVTUywgRVhULCBMT0NBTCl8CisJCQlGSUVMRF9WQUxVRSgwLCBQQU5FTF9GQl9BRERSRVNTLCBBRERSRVNTLCBjcnRjLT5vU2NyZWVuKSk7CisKKwkJcmVnID0gdmFyLT54cmVzICogKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMyk7CisJCS8qIGNydGMtPmNoYW5uZWwgaXMgbm90IGVxdWFsIHRvIHBhci0+aW5kZXggb24gbnVtZXJpYyxiZSBhd2FyZSBvZiB0aGF0ICovCisJCXJlZyA9IFBBRERJTkcoY3J0Yy0+bGluZV9wYWQscmVnKTsKKworCQlQT0tFMzIoUEFORUxfRkJfV0lEVEgsCisJCQlGSUVMRF9WQUxVRSgwLCBQQU5FTF9GQl9XSURUSCwgV0lEVEgsIHJlZyl8CisJCQlGSUVMRF9WQUxVRSgwLCBQQU5FTF9GQl9XSURUSCwgT0ZGU0VULCBmaXgtPmxpbmVfbGVuZ3RoKSk7CisKKwkJUE9LRTMyKFBBTkVMX1dJTkRPV19XSURUSCwKKwkJCUZJRUxEX1ZBTFVFKDAsIFBBTkVMX1dJTkRPV19XSURUSCwgV0lEVEgsIHZhci0+eHJlcyAtMSl8CisJCQlGSUVMRF9WQUxVRSgwLCBQQU5FTF9XSU5ET1dfV0lEVEgsIFgsIHZhci0+eG9mZnNldCkpOworCisJCVBPS0UzMihQQU5FTF9XSU5ET1dfSEVJR0hULAorCQkJRklFTERfVkFMVUUoMCwgUEFORUxfV0lORE9XX0hFSUdIVCwgSEVJR0hULCB2YXItPnlyZXNfdmlydHVhbCAtIDEpfAorCQkJRklFTERfVkFMVUUoMCwgUEFORUxfV0lORE9XX0hFSUdIVCwgWSwgdmFyLT55b2Zmc2V0KSk7CisKKwkJUE9LRTMyKFBBTkVMX1BMQU5FX1RMLCAwKTsKKworCQlQT0tFMzIoUEFORUxfUExBTkVfQlIsCisJCQlGSUVMRF9WQUxVRSgwLCBQQU5FTF9QTEFORV9CUiwgQk9UVE9NLCB2YXItPnlyZXMgLSAxKXwKKwkJCUZJRUxEX1ZBTFVFKDAsIFBBTkVMX1BMQU5FX0JSLFJJR0hULCB2YXItPnhyZXMgLSAxKSk7CisKKwkJLyogc2V0IHBpeGVsIGZvcm1hdCAqLworCQlyZWcgPSBQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKTsKKwkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCwKKwkJCUZJRUxEX1ZBTFVFKHJlZywKKwkJCVBBTkVMX0RJU1BMQVlfQ1RSTCwgRk9STUFULAorCQkJKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gNCkKKwkJCSkpOworCX1lbHNleworCQkvKiBub3QgaW1wbGVtZW50ZWQgbm93ICovCisJCVBPS0UzMihDUlRfRkJfQUREUkVTUywgY3J0Yy0+b1NjcmVlbik7CisJCXJlZyA9IHZhci0+eHJlcyAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCQkvKiBjcnRjLT5jaGFubmVsIGlzIG5vdCBlcXVhbCB0byBwYXItPmluZGV4IG9uIG51bWVyaWMsYmUgYXdhcmUgb2YgdGhhdCAqLworCQlyZWcgPSBQQURESU5HKGNydGMtPmxpbmVfcGFkLCByZWcpOworCisJCVBPS0UzMihDUlRfRkJfV0lEVEgsCisJCQlGSUVMRF9WQUxVRSgwLCBDUlRfRkJfV0lEVEgsIFdJRFRILCByZWcpfAorCQkJRklFTERfVkFMVUUoMCwgQ1JUX0ZCX1dJRFRILCBPRkZTRVQsIGZpeC0+bGluZV9sZW5ndGgpKTsKKworCQkvKiBTRVQgUElYRUwgRk9STUFUICovCisJCXJlZyA9IFBFRUszMihDUlRfRElTUExBWV9DVFJMKTsKKwkJcmVnID0gRklFTERfVkFMVUUocmVnLCBDUlRfRElTUExBWV9DVFJMLCBGT1JNQVQsIHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gNCk7CisJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCByZWcpOworCisJfQorCisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBod19zbTc1MF9jcnRjX2NsZWFyKHN0cnVjdCBseW54ZmJfY3J0YyogY3J0YykKK3sKKwkKKwlyZXR1cm47Cit9CisKK2ludCBod19zbTc1MF9zZXRDb2xSZWcoc3RydWN0IGx5bnhmYl9jcnRjKiBjcnRjLCB1c2hvcnQgaW5kZXgsCisJCQkJCQkJCXVzaG9ydCByZWQsIHVzaG9ydCBncmVlbiwgdXNob3J0IGJsdWUpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBhZGRbXT17UEFORUxfUEFMRVRURV9SQU0sQ1JUX1BBTEVUVEVfUkFNfTsKKwlQT0tFMzIoYWRkW2NydGMtPmNoYW5uZWxdICsgaW5kZXgqNCwgKHJlZDw8MTYpfChncmVlbjw8OCl8Ymx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBod19zbTc1MGxlX3NldEJMQU5LKHN0cnVjdCBseW54ZmJfb3V0cHV0ICogb3V0cHV0LCBpbnQgYmxhbmspeworCWludCBkcG1zLGNydGRiOworCQorCXN3aXRjaChibGFuaykKKwl7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKKwkJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgorI2Vsc2UKKwkJY2FzZSBWRVNBX05PX0JMQU5LSU5HOgorI2VuZGlmCisJCQlkcG1zID0gQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzA7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT0ZGOworCQkJYnJlYWs7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKKwkJY2FzZSBGQl9CTEFOS19OT1JNQUw6CisJCQlkcG1zID0gQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzA7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT047CisJCQlicmVhazsKKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKKyNlbHNlCisJCWNhc2UgVkVTQV9WU1lOQ19TVVNQRU5EOgorI2VuZGlmCisJCQlkcG1zID0gQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzI7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT047CisJCQlicmVhazsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCQljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CisjZWxzZQorCQljYXNlIFZFU0FfSFNZTkNfU1VTUEVORDoKKyNlbmRpZgorCQkJZHBtcyA9IENSVF9ESVNQTEFZX0NUUkxfRFBNU18xOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09OOworCQkJYnJlYWs7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKKwkJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CisjZWxzZQorCQljYXNlIFZFU0FfUE9XRVJET1dOOgorI2VuZGlmCisJCQlkcG1zID0gQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TXzM7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT047CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9jcnQpeworCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgRklFTERfVkFMVUUoUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpLCBDUlRfRElTUExBWV9DVFJMLCBEUE1TLCBkcG1zKSk7CisJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCBGSUVMRF9WQUxVRShQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCksIENSVF9ESVNQTEFZX0NUUkwsIEJMQU5LLCBjcnRkYikpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGh3X3NtNzUwX3NldEJMQU5LKHN0cnVjdCBseW54ZmJfb3V0cHV0KiBvdXRwdXQsaW50IGJsYW5rKQoreworCXVuc2lnbmVkIGludCBkcG1zLCBwcHMsIGNydGRiOworCQorCWRwbXMgPSBwcHMgPSBjcnRkYiA9IDA7CisKKwlzd2l0Y2ggKGJsYW5rKQorCXsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCQljYXNlIEZCX0JMQU5LX1VOQkxBTks6CisjZWxzZQorCQljYXNlIFZFU0FfTk9fQkxBTktJTkc6CisjZW5kaWYKKwkJCXByX2luZm8oImZsYWcgPSBGQl9CTEFOS19VTkJMQU5LIFxuIik7CisJCQlkcG1zID0gU1lTVEVNX0NUUkxfRFBNU19WUEhQOworCQkJcHBzID0gUEFORUxfRElTUExBWV9DVFJMX0RBVEFfRU5BQkxFOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09GRjsKKwkJCWJyZWFrOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQkJcHJfaW5mbygiZmxhZyA9IEZCX0JMQU5LX05PUk1BTCBcbiIpOworCQkJZHBtcyA9IFNZU1RFTV9DVFJMX0RQTVNfVlBIUDsKKwkJCXBwcyA9IFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBX0RJU0FCTEU7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT047CisJCQlicmVhazsKKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKKyNlbHNlCisJCWNhc2UgVkVTQV9WU1lOQ19TVVNQRU5EOgorI2VuZGlmCisJCQlkcG1zID0gU1lTVEVNX0NUUkxfRFBNU19WTkhQOworCQkJcHBzID0gUEFORUxfRElTUExBWV9DVFJMX0RBVEFfRElTQUJMRTsKKwkJCWNydGRiID0gQ1JUX0RJU1BMQVlfQ1RSTF9CTEFOS19PTjsKKwkJCWJyZWFrOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKKyNlbHNlCisJCWNhc2UgVkVTQV9IU1lOQ19TVVNQRU5EOgorI2VuZGlmCisJCQlkcG1zID0gU1lTVEVNX0NUUkxfRFBNU19WUEhOOworCQkJcHBzID0gUEFORUxfRElTUExBWV9DVFJMX0RBVEFfRElTQUJMRTsKKwkJCWNydGRiID0gQ1JUX0RJU1BMQVlfQ1RSTF9CTEFOS19PTjsKKwkJCWJyZWFrOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorI2Vsc2UKKwkJY2FzZSBWRVNBX1BPV0VSRE9XTjoKKyNlbmRpZgorCQkJZHBtcyA9IFNZU1RFTV9DVFJMX0RQTVNfVk5ITjsKKwkJCXBwcyA9IFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBX0RJU0FCTEU7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT047CisJCQlicmVhazsKKwl9CisKKwlpZihvdXRwdXQtPnBhdGhzICYgc203NTBfY3J0KXsKKworCQlQT0tFMzIoU1lTVEVNX0NUUkwsRklFTERfVkFMVUUoUEVFSzMyKFNZU1RFTV9DVFJMKSwgU1lTVEVNX0NUUkwsIERQTVMsIGRwbXMpKTsKKwkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsRklFTERfVkFMVUUoUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpLCBDUlRfRElTUExBWV9DVFJMLEJMQU5LLCBjcnRkYikpOworCX0KKworCWlmKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9wYW5lbCl7CisJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsIEZJRUxEX1ZBTFVFKFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpLCBQQU5FTF9ESVNQTEFZX0NUUkwsIERBVEEsIHBwcykpOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgaHdfc203NTBfaW5pdEFjY2VsKHN0cnVjdCBseW54X3NoYXJlICogc2hhcmUpCit7CisJdTMyIHJlZzsKKwllbmFibGUyREVuZ2luZSgxKTsKKworCWlmKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSl7CisJCXJlZyA9IFBFRUszMihERV9TVEFURTEpOworCQlyZWcgPSBGSUVMRF9TRVQocmVnLCBERV9TVEFURTEsIERFX0FCT1JULE9OKTsKKwkJUE9LRTMyKERFX1NUQVRFMSxyZWcpOworCisJCXJlZyA9IFBFRUszMihERV9TVEFURTEpOworCQlyZWcgPSBGSUVMRF9TRVQocmVnLCBERV9TVEFURTEsIERFX0FCT1JULE9GRik7CisJCVBPS0UzMihERV9TVEFURTEsIHJlZyk7CisKKwl9ZWxzZXsKKwkJLyogZW5naW5lIHJlc2V0ICovCisJCXJlZyA9IFBFRUszMihTWVNURU1fQ1RSTCk7CisJICAgIHJlZyA9IEZJRUxEX1NFVChyZWcsIFNZU1RFTV9DVFJMLCBERV9BQk9SVCxPTik7CisJCVBPS0UzMihTWVNURU1fQ1RSTCwgcmVnKTsKKworCQlyZWcgPSBQRUVLMzIoU1lTVEVNX0NUUkwpOworCQlyZWcgPSBGSUVMRF9TRVQocmVnLCBTWVNURU1fQ1RSTCwgREVfQUJPUlQsT0ZGKTsKKwkJUE9LRTMyKFNZU1RFTV9DVFJMLCByZWcpOworCX0KKworCS8qIGNhbGwgMmQgaW5pdCAqLworCXNoYXJlLT5hY2NlbC5kZV9pbml0KCZzaGFyZS0+YWNjZWwpOworfQorCitpbnQgaHdfc203NTBsZV9kZVdhaXQodm9pZCkKK3sKKwlpbnQgaT0weDEwMDAwMDAwOworCXdoaWxlKGktLSl7CisJCXVuc2lnbmVkIGludCBkd1ZhbCA9IFBFRUszMihERV9TVEFURTIpOworCQlpZigoRklFTERfR0VUKGR3VmFsLCBERV9TVEFURTIsIERFX1NUQVRVUykgPT0gREVfU1RBVEUyX0RFX1NUQVRVU19JRExFKSAmJgorCQkJKEZJRUxEX0dFVChkd1ZhbCwgREVfU1RBVEUyLCBERV9GSUZPKSAgPT0gREVfU1RBVEUyX0RFX0ZJRk9fRU1QVFkpICYmCisJCQkoRklFTERfR0VUKGR3VmFsLCBERV9TVEFURTIsIERFX01FTV9GSUZPKSA9PSBERV9TVEFURTJfREVfTUVNX0ZJRk9fRU1QVFkpKQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiB0aW1lb3V0IGVycm9yICovCisJcmV0dXJuIC0xOworfQorCisKK2ludCBod19zbTc1MF9kZVdhaXQodm9pZCkKK3sKKwlpbnQgaT0weDEwMDAwMDAwOworCXdoaWxlKGktLSl7CisJCXVuc2lnbmVkIGludCBkd1ZhbCA9IFBFRUszMihTWVNURU1fQ1RSTCk7CisJCWlmKChGSUVMRF9HRVQoZHdWYWwsU1lTVEVNX0NUUkwsREVfU1RBVFVTKSA9PSBTWVNURU1fQ1RSTF9ERV9TVEFUVVNfSURMRSkgJiYKKwkJCShGSUVMRF9HRVQoZHdWYWwsU1lTVEVNX0NUUkwsREVfRklGTykgID09IFNZU1RFTV9DVFJMX0RFX0ZJRk9fRU1QVFkpICYmCisJCQkoRklFTERfR0VUKGR3VmFsLFNZU1RFTV9DVFJMLERFX01FTV9GSUZPKSA9PSBTWVNURU1fQ1RSTF9ERV9NRU1fRklGT19FTVBUWSkpCisJCXsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qIHRpbWVvdXQgZXJyb3IgKi8KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBod19zbTc1MF9wYW5fZGlzcGxheShzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGMsCisgICAgICAgIGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorICAgICAgICBjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKyAgICB1aW50MzJfdCB0b3RhbDsKKyAgICAvL2NoZWNrIHBhcmFtcworICAgIGlmICgodmFyLT54b2Zmc2V0ICsgdmFyLT54cmVzID4gdmFyLT54cmVzX3ZpcnR1YWwpIHx8CisgICAgICAgICAgICAodmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHRvdGFsID0gdmFyLT55b2Zmc2V0ICogaW5mby0+Zml4LmxpbmVfbGVuZ3RoICsKKyAgICAgICAgKCh2YXItPnhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsKSA+PiAzKTsKKyAgICB0b3RhbCArPSBjcnRjLT5vU2NyZWVuOworICAgIGlmIChjcnRjLT5jaGFubmVsID09IHNtNzUwX3ByaW1hcnkpIHsKKyAgICAgICAgUE9LRTMyKFBBTkVMX0ZCX0FERFJFU1MsCisgICAgICAgICAgICAgICAgRklFTERfVkFMVUUoUEVFSzMyKFBBTkVMX0ZCX0FERFJFU1MpLAorICAgICAgICAgICAgICAgICAgICBQQU5FTF9GQl9BRERSRVNTLCBBRERSRVNTLCB0b3RhbCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIFBPS0UzMihDUlRfRkJfQUREUkVTUywKKyAgICAgICAgICAgICAgICBGSUVMRF9WQUxVRShQRUVLMzIoQ1JUX0ZCX0FERFJFU1MpLAorICAgICAgICAgICAgICAgICAgICBDUlRfRkJfQUREUkVTUywgQUREUkVTUywgdG90YWwpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWJlNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5oCkBAIC0wLDAgKzEsMTA0IEBACisjaWZuZGVmIExZTlhfSFc3NTBfSF9fCisjZGVmaW5lIExZTlhfSFc3NTBfSF9fCisKKworI2RlZmluZSBERUZBVUxUX1NNNzUwX0NISVBfQ0xPQ0sgCQkyOTAKKyNkZWZpbmUgREVGQVVMVF9TTTc1MExFX0NISVBfQ0xPQ0sgIAkzMzMKKyNpZm5kZWYgU003NTBMRV9SRVZJU0lPTl9JRAorI2RlZmluZSBTTTc1MExFX1JFVklTSU9OX0lEICh1bnNpZ25lZCBjaGFyKTB4ZmUKKyNlbmRpZgorCisvLyNkZWZpbmUgREVGQVVMVF9NRU1fQ0xPQ0sJKERFRkFVTFRfU003NTBfQ0hJUF9DTE9DSy8xKQorLy8jZGVmaW5lIERFRkFVTFRfTUFTVEVSX0NMT0NLCShERUZBVUxUX1NNNzUwX0NISVBfQ0xPQ0svMykKKworCitlbnVtIHNtNzUwX3BubHR5cGV7CisKKwlzbTc1MF8yNFRGVCA9IDAsLyogMjRiaXQgdGZ0ICovCisKKwlzbTc1MF9kdWFsVEZUID0gMiwvKiBkdWFsIDE4IGJpdCB0ZnQgKi8KKworCXNtNzUwX2RvdWJsZVRGVCA9IDEsLyogMzYgYml0IGRvdWJsZSBwaXhlbCB0ZnQgKi8KK307CisKKy8qIHZnYSBjaGFubmVsIGlzIG5vdCBjb25jZXJuZWQgICovCitlbnVtIHNtNzUwX2RhdGFmbG93eworCXNtNzUwX3NpbXVsX3ByaSwvKiBwcmltYXJ5ID0+IGFsbCBoZWFkICovCisKKwlzbTc1MF9zaW11bF9zZWMsLyogc2Vjb25kYXJ5ID0+IGFsbCBoZWFkICovCisKKwlzbTc1MF9kdWFsX25vcm1hbCwvKiAJcHJpbWFyeSA9PiBwYW5lbCBoZWFkIGFuZCBzZWNvbmRhcnkgPT4gY3J0ICovCisKKwlzbTc1MF9kdWFsX3N3YXAsLyogCXByaW1hcnkgPT4gY3J0IGhlYWQgYW5kIHNlY29uZGFyeSA9PiBwYW5lbCAqLworfTsKKworCitlbnVtIHNtNzUwX2NoYW5uZWx7CisJc203NTBfcHJpbWFyeSA9IDAsCisJLyogZW51bSB2YWx1ZSBlcXVhbCB0byB0aGUgcmVnaXN0ZXIgZmlsZWQgZGF0YSAqLworCXNtNzUwX3NlY29uZGFyeSA9IDEsCit9OworCitlbnVtIHNtNzUwX3BhdGh7CisJc203NTBfcGFuZWwgPSAxLAorCXNtNzUwX2NydCA9IDIsCisJc203NTBfcG5jID0gMywvKiBwYW5lbCBhbmQgY3J0ICovCit9OworCitzdHJ1Y3QgaW5pdF9zdGF0dXN7CisJdXNob3J0IHBvd2VyTW9kZTsKKwkvKiBiZWxvdyB0aHJlZSBjbG9ja3MgYXJlIGluIHVuaXQgb2YgTUhaKi8KKwl1c2hvcnQgY2hpcF9jbGs7CisJdXNob3J0IG1lbV9jbGs7CisJdXNob3J0IG1hc3Rlcl9jbGs7CisJdXNob3J0IHNldEFsbEVuZ09mZjsKKwl1c2hvcnQgcmVzZXRNZW1vcnk7Cit9OworCitzdHJ1Y3Qgc203NTBfc3RhdGV7CisJc3RydWN0IGluaXRfc3RhdHVzIGluaXRQYXJtOworCWVudW0gc203NTBfcG5sdHlwZSBwbmx0eXBlOworCWVudW0gc203NTBfZGF0YWZsb3cgZGF0YWZsb3c7CisJaW50IG5vY3J0OworCWludCB4TENEOworCWludCB5TENEOworfTsKKworLyogCXNtNzUwX3NoYXJlIHN0YW5kcyBmb3IgYSBwcmVzZW50YXRpb24gb2YgdHdvIGZyYW1lIGJ1ZmZlcgorCXRoYXQgdXNlIG9uZSBzbTc1MCBhZGFwdG9yLCBpdCBpcyBzaW1pbGlhciB0byB0aGUgc3VwZXIgY2xhc3Mgb2YgbHlueF9zaGFyZQorCWluIEMrKworKi8KKworc3RydWN0IHNtNzUwX3NoYXJleworCS8qIGl0J3MgYmV0dGVyIHRvIHB1dCBseW54X3NoYXJlIHN0cnVjdCB0byB0aGUgZmlyc3QgcGxhY2Ugb2Ygc203NTBfc2hhcmUgKi8KKwlzdHJ1Y3QgbHlueF9zaGFyZSBzaGFyZTsKKwlzdHJ1Y3Qgc203NTBfc3RhdGUgc3RhdGU7CisJaW50IGh3Q3Vyc29yOworCS8qIAkwOiBubyBoYXJkd2FyZSBjdXJzb3IKKwkJMTogcHJpbWFyeSBjcnRjIGh3IGN1cnNvciBlbmFibGVkLAorCQkyOiBzZWNvbmRhcnkgY3J0YyBodyBjdXJzb3IgZW5hYmxlZAorCQkzOiBib3RoIGN0cmMgaHcgY3Vyc29yIGVuYWJsZWQKKwkqLworfTsKKworaW50IGh3X3NtNzUwX21hcChzdHJ1Y3QgbHlueF9zaGFyZSogc2hhcmUsc3RydWN0IHBjaV9kZXYqIHBkZXYpOworaW50IGh3X3NtNzUwX2luaXRodyhzdHJ1Y3QgbHlueF9zaGFyZSosc3RydWN0IHBjaV9kZXYgKik7Cit2b2lkIGh3X3NtNzUwX2luaXRBY2NlbChzdHJ1Y3QgbHlueF9zaGFyZSAqKTsKK2ludCBod19zbTc1MF9kZVdhaXQodm9pZCk7CitpbnQgaHdfc203NTBsZV9kZVdhaXQodm9pZCk7CisKK3Jlc291cmNlX3NpemVfdCBod19zbTc1MF9nZXRWTVNpemUoc3RydWN0IGx5bnhfc2hhcmUgKik7CitpbnQgaHdfc203NTBfb3V0cHV0X2NoZWNrTW9kZShzdHJ1Y3QgbHlueGZiX291dHB1dCosc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKik7CitpbnQgaHdfc203NTBfb3V0cHV0X3NldE1vZGUoc3RydWN0IGx5bnhmYl9vdXRwdXQqLHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyosc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvKik7CitpbnQgaHdfc203NTBfY3J0Y19jaGVja01vZGUoc3RydWN0IGx5bnhmYl9jcnRjKixzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qKTsKK2ludCBod19zbTc1MF9jcnRjX3NldE1vZGUoc3RydWN0IGx5bnhmYl9jcnRjKixzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qLHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyopOworaW50IGh3X3NtNzUwX3NldENvbFJlZyhzdHJ1Y3QgbHlueGZiX2NydGMqLHVzaG9ydCx1c2hvcnQsdXNob3J0LHVzaG9ydCk7CitpbnQgaHdfc203NTBfc2V0QkxBTksoc3RydWN0IGx5bnhmYl9vdXRwdXQqLGludCk7CitpbnQgaHdfc203NTBsZV9zZXRCTEFOSyhzdHJ1Y3QgbHlueGZiX291dHB1dCosaW50KTsKK3ZvaWQgaHdfc203NTBfY3J0Y19jbGVhcihzdHJ1Y3QgbHlueGZiX2NydGMqKTsKK3ZvaWQgaHdfc203NTBfb3V0cHV0X2NsZWFyKHN0cnVjdCBseW54ZmJfb3V0cHV0Kik7CitpbnQgaHdfc203NTBfcGFuX2Rpc3BsYXkoc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjLAorICAgICAgICBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKyAgICAgICAgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4LmggYi9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eC5oCmluZGV4IDdjYzE4OTYuLmM1ZDYyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHguaApAQCAtMTE5LDcgKzExOSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJIFNNNzEyIE1vZGUgdGFibGUuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBNb2RlSW5pdCB2Z2Ftb2RlW10gPSB7CitzdGF0aWMgc3RydWN0IE1vZGVJbml0IHZnYW1vZGVbXSA9IHsKIAl7CiAJIC8qICBtb2RlIzA6IDY0MCB4IDQ4MCAgMTZCcHAgIDYwSHogKi8KIAkgNjQwLCA0ODAsIDE2LCA2MCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYwppbmRleCBlYmQ5NTM2Li43N2Y1MWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eGZiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHhmYi5jCkBAIC0xMTMsMTMgKzExMywxNSBAQAogCiBzdGF0aWMgc3RydWN0IHNjcmVlbl9pbmZvIHNtdGNfc2NyX2luZm87CiAKK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbjsKKwogLyogcHJvY2VzcyBjb21tYW5kIGxpbmUgb3B0aW9ucywgZ2V0IHZnYSBwYXJhbWV0ZXIgKi8KLXN0YXRpYyBpbnQgX19pbml0IHNtN3h4X3ZnYV9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIHZvaWQgX19pbml0IHNtN3h4X3ZnYV9zZXR1cChjaGFyICpvcHRpb25zKQogewogCWludCBpOwogCiAJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybjsKIAogCXNtdGNfc2NyX2luZm8ubGZiX3dpZHRoID0gMDsKIAlzbXRjX3Njcl9pbmZvLmxmYl9oZWlnaHQgPSAwOwpAQCAtMTMzLDEzICsxMzUsMTAgQEAKIAkJCXNtdGNfc2NyX2luZm8ubGZiX2hlaWdodCA9CiAJCQkJCQl2ZXNhX21vZGVfdGFibGVbaV0ubGZiX2hlaWdodDsKIAkJCXNtdGNfc2NyX2luZm8ubGZiX2RlcHRoICA9IHZlc2FfbW9kZV90YWJsZVtpXS5sZmJfZGVwdGg7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCX0KLQotCXJldHVybiAtMTsKIH0KLV9fc2V0dXAoInZnYT0iLCBzbTd4eF92Z2Ffc2V0dXApOwogCiBzdGF0aWMgdm9pZCBzbTcxMl9zZXRwYWxldHRlKGludCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKIAkJCSAgICAgdW5zaWduZWQgYmx1ZSwgc3RydWN0IGZiX2luZm8gKmluZm8pCkBAIC03NzcsNiArNzc2LDEyIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAwLCAic203eHhmYiIpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZXNlcnZlIGZyYW1lYnVmZmVyIHJlZ2lvblxuIik7CisJCWdvdG8gZmFpbGVkX3JlZ2lvbnM7CisJfQorCiAJc3ByaW50ZihzbXRjZmJfZml4LmlkLCAic20lWGZiIiwgZW50LT5kZXZpY2UpOwogCiAJc2ZiID0gc210Y19hbGxvY19mYl9pbmZvKHBkZXYpOwpAQCAtOTA2LDYgKzkxMSw5IEBACiAJc210Y19mcmVlX2ZiX2luZm8oc2ZiKTsKIAogZmFpbGVkX2ZyZWU6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworCitmYWlsZWRfcmVnaW9uczoKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtOTIzLDYgKzkzMSw4IEBACiAJezAsfQogfTsKIAorTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNtdGNmYl9wY2lfdGFibGUpOworCiBzdGF0aWMgdm9pZCBzbXRjZmJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3Qgc210Y2ZiX2luZm8gKnNmYjsKQEAgLTkzMiw2ICs5NDIsOCBAQAogCXNtdGNfdW5tYXBfbW1pbyhzZmIpOwogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoJnNmYi0+ZmIpOwogCXNtdGNfZnJlZV9mYl9pbmZvKHNmYik7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMTAxNyw3ICsxMDI5LDI5IEBACiAJLmRyaXZlci5wbSAgPSBTTTdYWF9QTV9PUFMsCiB9OwogCi1tb2R1bGVfcGNpX2RyaXZlcihzbXRjZmJfZHJpdmVyKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtNzEyZmJfaW5pdCh2b2lkKQoreworI2lmbmRlZiBNT0RVTEUKKwljaGFyICpvcHRpb24gPSBOVUxMOworCisJaWYgKGZiX2dldF9vcHRpb25zKCJzbTcxMmZiIiwgJm9wdGlvbikpCisJCXJldHVybiAtRU5PREVWOworCWlmIChvcHRpb24gJiYgKm9wdGlvbikKKwkJbW9kZV9vcHRpb24gPSBvcHRpb247CisjZW5kaWYKKwlzbTd4eF92Z2Ffc2V0dXAobW9kZV9vcHRpb24pOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNtdGNmYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzbTcxMmZiX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc203MTJmYl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzbXRjZmJfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQoc203MTJmYl9leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiU2lsaWNvbm1vdGlvbiAiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRnJhbWVidWZmZXIgZHJpdmVyIGZvciBTTUkgR3JhcGhpYyBDYXJkcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKaW5kZXggMzcwOGJjMS4uMDIxMWRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCkBAIC04NDAsMTIgKzg0MCwxMCBAQAogc3RhdGljIHNzaXplX3QgbWVzc2FnZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAogCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXNzaXplX3QgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgbXNnX2dyb3VwX3QgKmdyb3VwID0gc3BrX2ZpbmRfbXNnX2dyb3VwKGF0dHItPmF0dHIubmFtZSk7CiAKIAlCVUdfT04oIWdyb3VwKTsKLQlyZXR2YWwgPSBtZXNzYWdlX3N0b3JlX2hlbHBlcihidWYsIGNvdW50LCBncm91cCk7Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gbWVzc2FnZV9zdG9yZV9oZWxwZXIoYnVmLCBjb3VudCwgZ3JvdXApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvbWFpbi5jCmluZGV4IGU5ZjBjMTUuLmM5NTU5NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9tYWluLmMKQEAgLTQyMyw3ICs0MjMsOCBAQAogCWlmIChzcGtfYmxlZXBzICYgMSkKIAkJYmxlZXAoc3BrX3kpOwogCWlmICgoc3BrX2JsZWVwcyAmIDIpICYmIChtc2dfaWQgPCBlZGdlX3F1aWV0KSkKLQkJc3ludGhfcHJpbnRmKCIlc1xuIiwgc3BrX21zZ19nZXQoTVNHX0VER0VfTVNHU19TVEFSVCArIG1zZ19pZCAtIDEpKTsKKwkJc3ludGhfcHJpbnRmKCIlc1xuIiwKKwkJCXNwa19tc2dfZ2V0KE1TR19FREdFX01TR1NfU1RBUlQgKyBtc2dfaWQgLSAxKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNwZWFrX2NoYXIodV9jaGFyIGNoKQpAQCAtMTEzMSw3ICsxMTMyLDggQEAKIAlpZiAoaW5fY291bnQgPiAyICYmIHJlcF9jb3VudCA+IDIpIHsKIAkJaWYgKGxhc3RfdHlwZSAmIENIX1JQVCkgewogCQkJc3ludGhfcHJpbnRmKCIgIik7Ci0JCQlzeW50aF9wcmludGYoc3BrX21zZ19nZXQoTVNHX1JFUEVBVF9ERVNDMiksICsrcmVwX2NvdW50KTsKKwkJCXN5bnRoX3ByaW50ZihzcGtfbXNnX2dldChNU0dfUkVQRUFUX0RFU0MyKSwKKwkJCQkJKytyZXBfY291bnQpOwogCQkJc3ludGhfcHJpbnRmKCIgIik7CiAJCX0KIAkJcmVwX2NvdW50ID0gMDsKQEAgLTE1MjcsNyArMTUyOSw3IEBACiAJaW50IGksIGJpLCBoaTsKIAlpbnQgdmNfbnVtID0gdmMtPnZjX251bTsKIAotCWJpID0gKCh2Yy0+dmNfYXR0ciAmIDB4NzApID4+IDQpOworCWJpID0gKHZjLT52Y19hdHRyICYgMHg3MCkgPj4gNDsKIAloaSA9IHNwZWFrdXBfY29uc29sZVt2Y19udW1dLT5odC5oaWdoc2l6ZVtiaV07CiAKIAlpID0gMDsKQEAgLTE4NDcsNyArMTg0OSw4IEBACiAJCQl3aW5fcmlnaHQgPSBzcGtfeDsKIAkJfQogCQlzbnByaW50ZihpbmZvLCBzaXplb2YoaW5mbyksIHNwa19tc2dfZ2V0KE1TR19XSU5ET1dfQk9VTkRBUlkpLAotCQkJICh3aW5fc3RhcnQpID8gc3BrX21zZ19nZXQoTVNHX0VORCkgOiBzcGtfbXNnX2dldChNU0dfU1RBUlQpLAorCQkJICh3aW5fc3RhcnQpID8KKwkJCQlzcGtfbXNnX2dldChNU0dfRU5EKSA6IHNwa19tc2dfZ2V0KE1TR19TVEFSVCksCiAJCQkgKGludClzcGtfeSArIDEsIChpbnQpc3BrX3ggKyAxKTsKIAl9CiAJc3ludGhfcHJpbnRmKCIlc1xuIiwgaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc2VyaWFsaW8uaAppbmRleCAzMTdiYjg0Li4xYjM5OTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NlcmlhbGlvLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgU1BLX1RJTUVPVVQgMTAwCiAjZGVmaW5lIEJPVEhfRU1QVFkgKFVBUlRfTFNSX1RFTVQgfCBVQVJUX0xTUl9USFJFKQogCi0jZGVmaW5lIHNwa19zZXJpYWxfdHhfYnVzeSgpICgoaW5iKHNwZWFrdXBfaW5mby5wb3J0X3R0cyArIFVBUlRfTFNSKSAmIEJPVEhfRU1QVFkpICE9IEJPVEhfRU1QVFkpCisjZGVmaW5lIHNwa19zZXJpYWxfdHhfYnVzeSgpIFwKKwkoKGluYihzcGVha3VwX2luZm8ucG9ydF90dHMgKyBVQVJUX0xTUikgJiBCT1RIX0VNUFRZKSAhPSBCT1RIX0VNUFRZKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXAuaAppbmRleCA4OThkY2U1Li5hN2Y0OTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cC5oCkBAIC02MSwxMCArNjEsMTIgQEAKIGV4dGVybiBzdHJ1Y3Qgc3RfdmFyX2hlYWRlciAqc3BrX3Zhcl9oZWFkZXJfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiBzdHJ1Y3QgcHVuY192YXJfdCAqc3BrX2dldF9wdW5jX3ZhcihlbnVtIHZhcl9pZF90IHZhcl9pZCk7CiBleHRlcm4gaW50IHNwa19zZXRfbnVtX3ZhcihpbnQgdmFsLCBzdHJ1Y3Qgc3RfdmFyX2hlYWRlciAqdmFyLCBpbnQgaG93KTsKLWV4dGVybiBpbnQgc3BrX3NldF9zdHJpbmdfdmFyKGNvbnN0IGNoYXIgKnBhZ2UsIHN0cnVjdCBzdF92YXJfaGVhZGVyICp2YXIsIGludCBsZW4pOworZXh0ZXJuIGludCBzcGtfc2V0X3N0cmluZ192YXIoY29uc3QgY2hhciAqcGFnZSwgc3RydWN0IHN0X3Zhcl9oZWFkZXIgKnZhciwKKwkJCQlpbnQgbGVuKTsKIGV4dGVybiBpbnQgc3BrX3NldF9tYXNrX2JpdHMoY29uc3QgY2hhciAqaW5wdXQsIGNvbnN0IGludCB3aGljaCwgY29uc3QgaW50IGhvdyk7CiBleHRlcm4gc3BlY2lhbF9mdW5jIHNwa19zcGVjaWFsX2hhbmRsZXI7Ci1leHRlcm4gaW50IHNwa19oYW5kbGVfaGVscChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVfY2hhciB0eXBlLCB1X2NoYXIgY2gsIHVfc2hvcnQga2V5KTsKK2V4dGVybiBpbnQgc3BrX2hhbmRsZV9oZWxwKHN0cnVjdCB2Y19kYXRhICp2YywgdV9jaGFyIHR5cGUsIHVfY2hhciBjaCwKKwkJCQl1X3Nob3J0IGtleSk7CiBleHRlcm4gaW50IHN5bnRoX2luaXQoY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCBzeW50aF9yZWxlYXNlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2FjbnRwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hY250cGMuYwppbmRleCBmMGJmZDllLi5mNDE4ODkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2FjbnRwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYWNudHBjLmMKQEAgLTMxOCwxOCArMzE4LDggQEAKIE1PRFVMRV9QQVJNX0RFU0MocG9ydCwgIlNldCB0aGUgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyIChvdmVycmlkZSBwcm9iaW5nKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGFjbnRwY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfYWNudHBjKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfYWNudHBjKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGFjbnRwY19leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9hY250cGMpOwotfQotCi1tb2R1bGVfaW5pdChhY250cGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChhY250cGNfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgQWNjZW50IFBDIHN5bnRoZXNpemVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2FjbnRzYS5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hY250c2EuYwppbmRleCAzZjJiNTY5Li5hZjI2OTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2FjbnRzYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYWNudHNhLmMKQEAgLTE0MywxOCArMTQzLDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGFjbnRzYV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfYWNudHNhKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfYWNudHNhKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGFjbnRzYV9leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9hY250c2EpOwotfQotCi1tb2R1bGVfaW5pdChhY250c2FfaW5pdCk7Ci1tb2R1bGVfZXhpdChhY250c2FfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgQWNjZW50IFNBIHN5bnRoZXNpemVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2Fwb2xsby5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hcG9sbG8uYwppbmRleCA2NzhiMjYzLi41MTc4OGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2Fwb2xsby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYXBvbGxvLmMKQEAgLTIwNywxOCArMjA3LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGFwb2xsb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfYXBvbGxvKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfYXBvbGxvKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGFwb2xsb19leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9hcG9sbG8pOwotfQotCi1tb2R1bGVfaW5pdChhcG9sbG9faW5pdCk7Ci1tb2R1bGVfZXhpdChhcG9sbG9fZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgQXBvbGxvIElJIHN5bnRoZXNpemVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2F1ZHB0ci5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hdWRwdHIuYwppbmRleCA1Y2JhZWM4Li5lYTg5ZTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2F1ZHB0ci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYXVkcHRyLmMKQEAgLTE3NywxOCArMTc3LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGF1ZHB0cl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfYXVkcHRyKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfYXVkcHRyKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGF1ZHB0cl9leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9hdWRwdHIpOwotfQotCi1tb2R1bGVfaW5pdChhdWRwdHJfaW5pdCk7Ci1tb2R1bGVfZXhpdChhdWRwdHJfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgQXVkYXB0ZXIgc3ludGhlc2l6ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYm5zLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2Jucy5jCmluZGV4IDJmMDcwMjguLjgwZjgzNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYm5zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9ibnMuYwpAQCAtMTI3LDE4ICsxMjcsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhzZXIsICJTZXQgdGhlIHNlcmlhbCBwb3J0IGZvciB0aGUgc3ludGhlc2l6ZXIgKDAtYmFzZWQpLiIpOwogTU9EVUxFX1BBUk1fREVTQyhzdGFydCwgIlN0YXJ0IHRoZSBzeW50aGVzaXplciBvbmNlIGl0IGlzIGxvYWRlZC4iKTsKIAotc3RhdGljIGludCBfX2luaXQgYm5zX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9ibnMpOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9ibnMpOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgYm5zX2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2Jucyk7Ci19Ci0KLW1vZHVsZV9pbml0KGJuc19pbml0KTsKLW1vZHVsZV9leGl0KGJuc19leGl0KTsKIE1PRFVMRV9BVVRIT1IoIktpcmsgUmVpc2VyIDxraXJrQGJyYWlsbGUudXdvLmNhPiIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgQm9yb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciBCcmFpbGxlICduIFNwZWFrIHN5bnRoZXNpemVycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWNleHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjZXh0LmMKaW5kZXggNTU1MDI5MC4uZTBiNWRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWNleHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY2V4dC5jCkBAIC0yMDcsMTAgKzIwNywxMiBAQAogCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgamlmZl9tYXgpKSB7CiAJCQkJaWYgKCFpbl9lc2NhcGUpCiAJCQkJCXNwa19zZXJpYWxfb3V0KFBST0NTUEVFQ0gpOwotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLAorCQkJCQkJCWZsYWdzKTsKIAkJCQlqaWZmeV9kZWx0YV92YWwgPSBqaWZmeV9kZWx0YS0+dS5uLnZhbHVlOwogCQkJCWRlbGF5X3RpbWVfdmFsID0gZGVsYXlfdGltZS0+dS5uLnZhbHVlOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywKKwkJCQkJCQlmbGFncyk7CiAJCQkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzCiAJCQkJCQkgKGRlbGF5X3RpbWVfdmFsKSk7CiAJCQkJamlmZl9tYXggPSBqaWZmaWVzICsgamlmZnlfZGVsdGFfdmFsOwpAQCAtMjM0LDE4ICsyMzYsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhzZXIsICJTZXQgdGhlIHNlcmlhbCBwb3J0IGZvciB0aGUgc3ludGhlc2l6ZXIgKDAtYmFzZWQpLiIpOwogTU9EVUxFX1BBUk1fREVTQyhzdGFydCwgIlN0YXJ0IHRoZSBzeW50aGVzaXplciBvbmNlIGl0IGlzIGxvYWRlZC4iKTsKIAotc3RhdGljIGludCBfX2luaXQgZGVjZXh0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9kZWNleHQpOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9kZWNleHQpOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGVjZXh0X2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2RlY2V4dCk7Ci19Ci0KLW1vZHVsZV9pbml0KGRlY2V4dF9pbml0KTsKLW1vZHVsZV9leGl0KGRlY2V4dF9leGl0KTsKIE1PRFVMRV9BVVRIT1IoIktpcmsgUmVpc2VyIDxraXJrQGJyYWlsbGUudXdvLmNhPiIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgQm9yb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciBERUN0YWxrIEV4dGVybmFsIHN5bnRoZXNpemVycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWNwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWNwYy5jCmluZGV4IDdjOWM0MzIuLjQzN2UxM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY3BjLmMKQEAgLTQyMywxMCArNDIzLDEyIEBACiAJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBqaWZmX21heCkpIHsKIAkJCQlpZiAoIWluX2VzY2FwZSkKIAkJCQkJZHRfc2VuZGNoYXIoUFJPQ1NQRUVDSCk7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssCisJCQkJCQkJZmxhZ3MpOwogCQkJCWppZmZ5X2RlbHRhX3ZhbCA9IGppZmZ5X2RlbHRhLT51Lm4udmFsdWU7CiAJCQkJZGVsYXlfdGltZV92YWwgPSBkZWxheV90aW1lLT51Lm4udmFsdWU7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLAorCQkJCQkJCWZsYWdzKTsKIAkJCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMKIAkJCQkJCSAoZGVsYXlfdGltZV92YWwpKTsKIAkJCQlqaWZmX21heCA9IGppZmZpZXMgKyBqaWZmeV9kZWx0YV92YWw7CkBAIC00OTEsMTggKzQ5Myw4IEBACiAKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGRlY3BjX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9kZWNfcGMpOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9kZWNfcGMpOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGVjcGNfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfZGVjX3BjKTsKLX0KLQotbW9kdWxlX2luaXQoZGVjcGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChkZWNwY19leGl0KTsKIE1PRFVMRV9BVVRIT1IoIktpcmsgUmVpc2VyIDxraXJrQGJyYWlsbGUudXdvLmNhPiIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgQm9yb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciBERUN0YWxrIFBDIHN5bnRoZXNpemVycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWN0bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMKaW5kZXggNjllN2MyYi4uYjVhMjNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWN0bGsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY3Rsay5jCkBAIC0zMDYsMTggKzMwNiw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBkZWN0bGtfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX2RlY3Rsayk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX2RlY3Rsayk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBkZWN0bGtfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfZGVjdGxrKTsKLX0KLQotbW9kdWxlX2luaXQoZGVjdGxrX2luaXQpOwotbW9kdWxlX2V4aXQoZGVjdGxrX2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIERFQ3RhbGsgRXhwcmVzcyBzeW50aGVzaXplcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHRsay5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kdGxrLmMKaW5kZXggODk1OTJjMC4uMzQ1ZWZkMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHRsay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHRsay5jCkBAIC0zODgsMTggKzM4OCw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJTZXQgdGhlIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAob3ZlcnJpZGUgcHJvYmluZykuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBkdGxrX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9kdGxrKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfZHRsayk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBkdGxrX2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2R0bGspOwotfQotCi1tb2R1bGVfaW5pdChkdGxrX2luaXQpOwotbW9kdWxlX2V4aXQoZHRsa19leGl0KTsKIE1PRFVMRV9BVVRIT1IoIktpcmsgUmVpc2VyIDxraXJrQGJyYWlsbGUudXdvLmNhPiIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgQm9yb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciBEb3VibGVUYWxrIFBDIHN5bnRoZXNpemVycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kdW1teS5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kdW1teS5jCmluZGV4IDM2MjM0MmEuLmY2NjgxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHVtbXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2R1bW15LmMKQEAgLTEyOSwxOCArMTI5LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGR1bW15X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9kdW1teSk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX2R1bW15KTsKIAotc3RhdGljIHZvaWQgX19leGl0IGR1bW15X2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2R1bW15KTsKLX0KLQotbW9kdWxlX2luaXQoZHVtbXlfaW5pdCk7Ci1tb2R1bGVfZXhpdChkdW1teV9leGl0KTsKIE1PRFVMRV9BVVRIT1IoIlNhbXVlbCBUaGliYXVsdCA8c2FtdWVsLnRoaWJhdWx0QGVucy1seW9uLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciB0ZXh0IGNvbnNvbGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfa2V5cGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfa2V5cGMuYwppbmRleCBjZWYyMGZkLi42ZWEwMjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2tleXBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9rZXlwYy5jCkBAIC0zMTksMTggKzMxOSw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJTZXQgdGhlIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAob3ZlcnJpZGUgcHJvYmluZykuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBrZXlwY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfa2V5cGMpOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9rZXlwYyk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBrZXlwY19leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9rZXlwYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGtleXBjX2luaXQpOwotbW9kdWxlX2V4aXQoa2V5cGNfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIEtleW5vdGUgR29sZCBQQyBzeW50aGVzaXplcnMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfbHRsay5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9sdGxrLmMKaW5kZXggMzc3YTZlMi4uY2M0ODA2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9sdGxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9sdGxrLmMKQEAgLTE3NSwxOCArMTc1LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGx0bGtfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX2x0bGspOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9sdGxrKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGx0bGtfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfbHRsayk7Ci19Ci0KLW1vZHVsZV9pbml0KGx0bGtfaW5pdCk7Ci1tb2R1bGVfZXhpdChsdGxrX2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIERvdWJsZVRhbGsgTFQvTGl0ZVRhbGsgc3ludGhlc2l6ZXJzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX3NvZnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc29mdC5jCmluZGV4IGU2ZTkzZmIuLmZiMzFiYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc29mdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc29mdC5jCkBAIC0zNTAsMTkgKzM1MCw4IEBACiAKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKK21vZHVsZV9zcGtfc3ludGgoc3ludGhfc29mdCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHNvZnRfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX3NvZnQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc29mdF9leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9zb2Z0KTsKLX0KLQotbW9kdWxlX2luaXQoc29mdF9pbml0KTsKLW1vZHVsZV9leGl0KHNvZnRfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCB1c2Vyc3BhY2Ugc29mdHdhcmUgc3ludGhlc2l6ZXIgc3VwcG9ydCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9zcGtvdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc3Brb3V0LmMKaW5kZXggYmNjZGRmOC4uMTAwN2E2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9zcGtvdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX3Nwa291dC5jCkBAIC0xNDYsMTggKzE0Niw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBzcGtvdXRfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX3Nwa291dCk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX3Nwa291dCk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGtvdXRfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfc3Brb3V0KTsKLX0KLQotbW9kdWxlX2luaXQoc3Brb3V0X2luaXQpOwotbW9kdWxlX2V4aXQoc3Brb3V0X2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIFNwZWFrIE91dCBzeW50aGVzaXplcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfdHhwcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfdHhwcnQuYwppbmRleCBkYmU4NGIxLi42YzIxZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX3R4cHJ0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF90eHBydC5jCkBAIC0xMjcsMTggKzEyNyw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCB0eHBydF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfdHhwcnQpOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF90eHBydCk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB0eHBydF9leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF90eHBydCk7Ci19Ci0KLW1vZHVsZV9pbml0KHR4cHJ0X2luaXQpOwotbW9kdWxlX2V4aXQodHhwcnRfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgVHJhbnNwb3J0IHN5bnRoZXNpemVycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3ByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3Nwa19wcml2LmgKaW5kZXggNjM3YmE2Ny4uMWVmMzc5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3ByaXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfcHJpdi5oCkBAIC00NCwzNCArNDQsMzQgQEAKIAogI2RlZmluZSBLVF9TUEtVUCAxNQogCi1leHRlcm4gY29uc3Qgc3RydWN0IG9sZF9zZXJpYWxfcG9ydCAqc3BrX3NlcmlhbF9pbml0KGludCBpbmRleCk7Ci1leHRlcm4gdm9pZCBzcGtfc3RvcF9zZXJpYWxfaW50ZXJydXB0KHZvaWQpOwotZXh0ZXJuIGludCBzcGtfd2FpdF9mb3JfeG1pdHIodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBzcGtfc2VyaWFsX2luKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc3BrX3NlcmlhbF9pbl9ub3dhaXQodm9pZCk7Ci1leHRlcm4gaW50IHNwa19zZXJpYWxfb3V0KGNvbnN0IGNoYXIgY2gpOwotZXh0ZXJuIHZvaWQgc3BrX3NlcmlhbF9yZWxlYXNlKHZvaWQpOworY29uc3Qgc3RydWN0IG9sZF9zZXJpYWxfcG9ydCAqc3BrX3NlcmlhbF9pbml0KGludCBpbmRleCk7Cit2b2lkIHNwa19zdG9wX3NlcmlhbF9pbnRlcnJ1cHQodm9pZCk7CitpbnQgc3BrX3dhaXRfZm9yX3htaXRyKHZvaWQpOwordW5zaWduZWQgY2hhciBzcGtfc2VyaWFsX2luKHZvaWQpOwordW5zaWduZWQgY2hhciBzcGtfc2VyaWFsX2luX25vd2FpdCh2b2lkKTsKK2ludCBzcGtfc2VyaWFsX291dChjb25zdCBjaGFyIGNoKTsKK3ZvaWQgc3BrX3NlcmlhbF9yZWxlYXNlKHZvaWQpOwogCi1leHRlcm4gY2hhciBzeW50aF9idWZmZXJfZ2V0Yyh2b2lkKTsKLWV4dGVybiBjaGFyIHN5bnRoX2J1ZmZlcl9wZWVrKHZvaWQpOwotZXh0ZXJuIGludCBzeW50aF9idWZmZXJfZW1wdHkodm9pZCk7Ci1leHRlcm4gc3RydWN0IHZhcl90ICpzcGtfZ2V0X3ZhcihlbnVtIHZhcl9pZF90IHZhcl9pZCk7Ci1leHRlcm4gc3NpemVfdCBzcGtfdmFyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKLQljaGFyICpidWYpOwotZXh0ZXJuIHNzaXplX3Qgc3BrX3Zhcl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK2NoYXIgc3ludGhfYnVmZmVyX2dldGModm9pZCk7CitjaGFyIHN5bnRoX2J1ZmZlcl9wZWVrKHZvaWQpOworaW50IHN5bnRoX2J1ZmZlcl9lbXB0eSh2b2lkKTsKK3N0cnVjdCB2YXJfdCAqc3BrX2dldF92YXIoZW51bSB2YXJfaWRfdCB2YXJfaWQpOworc3NpemVfdCBzcGtfdmFyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICBjaGFyICpidWYpOworc3NpemVfdCBzcGtfdmFyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIAotZXh0ZXJuIGludCBzcGtfc2VyaWFsX3N5bnRoX3Byb2JlKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoKTsKLWV4dGVybiBjb25zdCBjaGFyICpzcGtfc3ludGhfaW1tZWRpYXRlKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoLCBjb25zdCBjaGFyICpidWZmKTsKLWV4dGVybiB2b2lkIHNwa19kb19jYXRjaF91cChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7Ci1leHRlcm4gdm9pZCBzcGtfc3ludGhfZmx1c2goc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwotZXh0ZXJuIGludCBzcGtfc3ludGhfaXNfYWxpdmVfbm9wKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoKTsKLWV4dGVybiBpbnQgc3BrX3N5bnRoX2lzX2FsaXZlX3Jlc3RhcnQoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwotZXh0ZXJuIHZvaWQgc3ludGhfcHJpbnRmKGNvbnN0IGNoYXIgKmJ1ZiwgLi4uKTsKLWV4dGVybiBpbnQgc3ludGhfcmVxdWVzdF9yZWdpb24odV9sb25nLCB1X2xvbmcpOwotZXh0ZXJuIGludCBzeW50aF9yZWxlYXNlX3JlZ2lvbih1X2xvbmcsIHVfbG9uZyk7Ci1leHRlcm4gaW50IHN5bnRoX2FkZChzdHJ1Y3Qgc3BrX3N5bnRoICppbl9zeW50aCk7Ci1leHRlcm4gdm9pZCBzeW50aF9yZW1vdmUoc3RydWN0IHNwa19zeW50aCAqaW5fc3ludGgpOworaW50IHNwa19zZXJpYWxfc3ludGhfcHJvYmUoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOworY29uc3QgY2hhciAqc3BrX3N5bnRoX2ltbWVkaWF0ZShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCwgY29uc3QgY2hhciAqYnVmZik7Cit2b2lkIHNwa19kb19jYXRjaF91cChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7Cit2b2lkIHNwa19zeW50aF9mbHVzaChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CitpbnQgc3BrX3N5bnRoX2lzX2FsaXZlX25vcChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CitpbnQgc3BrX3N5bnRoX2lzX2FsaXZlX3Jlc3RhcnQoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwordm9pZCBzeW50aF9wcmludGYoY29uc3QgY2hhciAqYnVmLCAuLi4pOworaW50IHN5bnRoX3JlcXVlc3RfcmVnaW9uKHVfbG9uZywgdV9sb25nKTsKK2ludCBzeW50aF9yZWxlYXNlX3JlZ2lvbih1X2xvbmcsIHVfbG9uZyk7CitpbnQgc3ludGhfYWRkKHN0cnVjdCBzcGtfc3ludGggKmluX3N5bnRoKTsKK3ZvaWQgc3ludGhfcmVtb3ZlKHN0cnVjdCBzcGtfc3ludGggKmluX3N5bnRoKTsKIAogZXh0ZXJuIHN0cnVjdCBzcGVha3VwX2luZm9fdCBzcGVha3VwX2luZm87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3Nwa190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKaW5kZXggOGM1NjVjOS4uZThmZjVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIGZvciBpbmJfcCwgb3V0Yl9wLCBpbmIsIG91dGIsIGV0Yy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiBlbnVtIHZhcl90eXBlX3QgewogCVZBUl9OVU0gPSAwLApAQCAtMTY3LDcgKzE2OCw4IEBACiAJaW50ICpkZWZhdWx0X3ZvbDsKIAlpbnQgKCpwcm9iZSkoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwogCXZvaWQgKCpyZWxlYXNlKSh2b2lkKTsKLQljb25zdCBjaGFyICooKnN5bnRoX2ltbWVkaWF0ZSkoc3RydWN0IHNwa19zeW50aCAqc3ludGgsIGNvbnN0IGNoYXIgKmJ1ZmYpOworCWNvbnN0IGNoYXIgKigqc3ludGhfaW1tZWRpYXRlKShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCwKKwkJCQkJY29uc3QgY2hhciAqYnVmZik7CiAJdm9pZCAoKmNhdGNoX3VwKShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CiAJdm9pZCAoKmZsdXNoKShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CiAJaW50ICgqaXNfYWxpdmUpKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoKTsKQEAgLTE3OSw2ICsxODEsMTYgQEAKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0dHJpYnV0ZXM7CiB9OwogCisvKioKKyAqIG1vZHVsZV9zcGtfc3ludGgoKSAtIEhlbHBlciBtYWNybyBmb3IgcmVnaXN0ZXJpbmcgYSBzcGVha3VwIGRyaXZlcgorICogQF9fc3BrX3N5bnRoOiBzcGtfc3ludGggc3RydWN0CisgKiBIZWxwZXIgbWFjcm8gZm9yIHNwZWFrdXAgZHJpdmVycyB3aGljaCBkbyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBpbiBtb2R1bGUKKyAqIGluaXQvZXhpdC4gVGhpcyBlbGltaW5hdGVzIGEgbG90IG9mIGJvaWxlcnBsYXRlLiBFYWNoIG1vZHVsZSBtYXkgb25seQorICogdXNlIHRoaXMgbWFjcm8gb25jZSwgYW5kIGNhbGxpbmcgaXQgcmVwbGFjZXMgbW9kdWxlX2luaXQoKSBhbmQgbW9kdWxlX2V4aXQoKQorICovCisjZGVmaW5lIG1vZHVsZV9zcGtfc3ludGgoX19zcGtfc3ludGgpIFwKKwltb2R1bGVfZHJpdmVyKF9fc3BrX3N5bnRoLCBzeW50aF9hZGQsIHN5bnRoX3JlbW92ZSkKKwogc3RydWN0IHNwZWFrdXBfaW5mb190IHsKIAlzcGlubG9ja190IHNwaW5sb2NrOwogCWludCBwb3J0X3R0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuYwppbmRleCBmOTJhZTFkLi4wZjUyNGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAkJdHhidWZbMV0JPSBwYWdlOwogCQlyZXR2YWwJPSBpMmNfbWFzdGVyX3NlbmQoaTJjLCB0eGJ1ZiwgUEFHRV9MRU4pOwogCQlpZiAocmV0dmFsICE9IFBBR0VfTEVOKQotCQkJZGV2X2VycigmaTJjLT5kZXYsICIlczpmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCQkJZGV2X2VycigmaTJjLT5kZXYsICJmYWlsZWQ6JWRcbiIsIHJldHZhbCk7CiAJCWVsc2UKIAkJCXBkYXRhLT5jdXJyZW50X3BhZ2UgPSBwYWdlOwogCX0gZWxzZQpAQCAtMjgzLDcgKzI4Myw3IEBACiAJcmV0dmFsCQk9IGkyY19tYXN0ZXJfc2VuZChwZGF0YS0+aTJjX2NsaWVudCwgdHhidWYsIDIpOwogCS8qIEFkZCBpbiByZXRyeSBvbiB3cml0ZXMgb25seSBpbiBjZXJ0YWluIGVycm9yIHJldHVybiB2YWx1ZXMgKi8KIAlpZiAocmV0dmFsICE9IDIpIHsKLQkJZGV2X2VycigmaTJjLT5kZXYsICIlczpmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCQlkZXZfZXJyKCZpMmMtPmRldiwgImZhaWxlZDolZFxuIiwgcmV0dmFsKTsKIAkJcmV0dmFsID0gLUVJTzsKIAl9IGVsc2UKIAkJcmV0dmFsID0gMTsKQEAgLTgzMCw4ICs4MzAsOCBAQAogCiAJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIFN5bmFwdGljcyBkZXZpY2UgLSByZXBvcnQgaWYgbm90LiAqLwogCWlmIChwZGF0YS0+cm1pNF9tb2RfaW5mby5tYW51ZmFjdHVyZXJfaWQgIT0gMSkKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogbm9uLVN5bmFwdGljcyBtZmcgaWQ6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcGRhdGEtPnJtaTRfbW9kX2luZm8ubWFudWZhY3R1cmVyX2lkKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJub24tU3luYXB0aWNzIG1mZyBpZDolZFxuIiwKKwkJCXBkYXRhLT5ybWk0X21vZF9pbmZvLm1hbnVmYWN0dXJlcl9pZCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJmaSwgJnBkYXRhLT5ybWk0X21vZF9pbmZvLnN1cHBvcnRfZm5fbGlzdCwgbGluaykKIAkJZGF0YV9zb3VyY2VzICs9IHJmaS0+bnVtX29mX2RhdGFfc291cmNlczsKQEAgLTk5MCw4ICs5OTAsOCBAQAogCQkJCQlwbGF0Zm9ybWRhdGEtPmlycV90eXBlLAogCQkJCQlEUklWRVJfTkFNRSwgcm1pNF9kYXRhKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6VW5hYmxlIHRvIGdldCBhdHRuIGlycSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgY2xpZW50LT5pcnEpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byBnZXQgYXR0biBpcnEgJWRcbiIsCisJCQljbGllbnQtPmlycSk7CiAJCWdvdG8gZXJyX3F1ZXJ5X2RldjsKIAl9CiAKQEAgLTExMTIsMTIgKzExMTIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN5bmFwdGljc19ybWk0X2Rldl9wbV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBzeW5hcHRpY3Nfcm1pNF9zdXNwZW5kLAotCS5yZXN1bWUgID0gc3luYXB0aWNzX3JtaTRfcmVzdW1lLAotfTsKICNlbmRpZgogCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoc3luYXB0aWNzX3JtaTRfZGV2X3BtX29wcywgc3luYXB0aWNzX3JtaTRfc3VzcGVuZCwKKwkJCSBzeW5hcHRpY3Nfcm1pNF9yZXN1bWUpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc3luYXB0aWNzX3JtaTRfaWRfdGFibGVbXSA9IHsKIAl7IERSSVZFUl9OQU1FLCAwIH0sCiAJeyB9LApAQCAtMTEyOCw5ICsxMTI3LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9CURSSVZFUl9OQU1FLAogCQkub3duZXIJPQlUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KIAkJLnBtCT0JJnN5bmFwdGljc19ybWk0X2Rldl9wbV9vcHMsCi0jZW5kaWYKIAl9LAogCS5wcm9iZQkJPQlzeW5hcHRpY3Nfcm1pNF9wcm9iZSwKIAkucmVtb3ZlCQk9CXN5bmFwdGljc19ybWk0X3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9pb2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9pb2NoYW5uZWwuaAppbmRleCBlYjdlZmU0Li4zYmQ3NTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvaW9jaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2lvY2hhbm5lbC5oCkBAIC0zMzcsNyArMzM3LDcgQEAKICAgICAvKiBwZXJpcGhlcmFsIHR5cGUgb2YgMyAtIHByb2Nlc3NvciAqLwogICAgIC8qIHNwZWNpZmllcyBkZXZpY2UgY2FwYWJsZSwgYnV0IG5vdCBwcmVzZW50ICovCiAKLSNkZWZpbmUgREVWX0hJU1VQUE9SVCAweDEwOwkvKiBIaVN1cCA9IDE7IHNob3dzIHN1cHBvcnQgZm9yIHJlcG9ydCBsdW5zICovCisjZGVmaW5lIERFVl9ISVNVUFBPUlQgMHgxMAkvKiBIaVN1cCA9IDE7IHNob3dzIHN1cHBvcnQgZm9yIHJlcG9ydCBsdW5zICovCiAgICAgLyogbXVzdCBiZSByZXR1cm5lZCBmb3IgbHVuIDAuICovCiAKIC8qIE5PVEU6IExpbnV4IGNvZGUgYXNzdW1lcyBpbnF1aXJ5IGNvbnRhaW5zIDM2IGJ5dGVzLiBXaXRob3V0IGNoZWNraW5nIGxlbmd0aApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZtY2FsbGludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZtY2FsbGludGVyZmFjZS5oCmluZGV4IDc4MzMzNzEuLjU5YTc0NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92bWNhbGxpbnRlcmZhY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdm1jYWxsaW50ZXJmYWNlLmgKQEAgLTc5LDE4ICs3OSwxNSBAQAogI2RlZmluZSBJU1NVRV9JT19WTUNBTEwobWV0aG9kLCBwYXJhbSwgcmVzdWx0KSBcCiAJKHJlc3VsdCA9IHVuaXN5c192bWNhbGwobWV0aG9kLCAocGFyYW0pICYgMHhGRkZGRkZGRiwJXAogCQkJCShwYXJhbSkgPj4gMzIpKQotI2RlZmluZSBJU1NVRV9JT19FWFRFTkRFRF9WTUNBTEwobWV0aG9kLCBwYXJhbTEsIHBhcmFtMiwJXAotCQkJCSBwYXJhbTMsIHJlc3VsdCkJCQlcCi0JKHJlc3VsdCA9IHVuaXN5c19leHRlbmRlZF92bWNhbGwobWV0aG9kLCBwYXJhbTEsCVwKLQkJCQkJIHBhcmFtMiwgcGFyYW0zKSkKKyNkZWZpbmUgSVNTVUVfSU9fRVhURU5ERURfVk1DQUxMKG1ldGhvZCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykgXAorCXVuaXN5c19leHRlbmRlZF92bWNhbGwobWV0aG9kLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQogCiAgICAgLyogVGhlIGZvbGxvd2luZyB1c2VzIFZNQ0FMTF9QT1NUX0NPREVfTE9HRVZFTlQgaW50ZXJmYWNlIGJ1dCBpcyBjdXJyZW50bHkKICAgICAgKiBub3QgdXNlZCBtdWNoICovCiAjZGVmaW5lIElTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0Y29kZSwgc2V2ZXJpdHkpCQlcCiBkbyB7CQkJCQkJCQkJXAotCXUzMiBfdGVtcHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOwkJCQlcCiAJSVNTVUVfSU9fRVhURU5ERURfVk1DQUxMKFZNQ0FMTF9QT1NUX0NPREVfTE9HRVZFTlQsIHNldmVyaXR5LAlcCi0JCQkJIE1EU19BUFBPUywgcG9zdGNvZGUsIF90ZW1wcmVzdWx0KTsJXAorCQkJCSBNRFNfQVBQT1MsIHBvc3Rjb2RlKTsJCQlcCiB9IHdoaWxlICgwKQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wcm9jb2JqZWN0dHJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKaW5kZXggMTE3NDA1Ni4uODA5YzY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKQEAgLTI2LDcgKzI2LDYgQEAKICNpZm5kZWYgX19QUk9DT0JKRUNUVFJFRV9IX18KICNkZWZpbmUgX19QUk9DT0JKRUNUVFJFRV9IX18KIAotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJ0aW1za21vZC5oIgogCiAvKiBUaGVzZSBhcmUgb3BhcXVlIHN0cnVjdHVyZXMgdG8gdXNlcnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdGltc2ttb2QuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCmluZGV4IDQwMTlhMGQuLjVhOTMzZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCkBAIC02OCwxNSArNjgsNiBAQAogI2RlZmluZSBIT1NUQUREUkVTUyB1bnNpZ25lZCBsb25nIGxvbmcKICNlbmRpZgogCi0vKiogVHJ5IHRvIGV2YXVsYXRlIHRoZSBwcm92aWRlZCBleHByZXNzaW9uLCBhbmQgZG8gYSBSRVRJTlQoeCkgaWZmCi0gKiAgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIDwgMC4KLSAqLwotI2RlZmluZSBBU1NFUlQoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWRvIHsgaWYgKCEoY29uZCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlIVUhEUlYoIkFTU0VSVCBmYWlsZWQgLSAlcyIsCSAgICAgICBcCi0JCQkgICAgICAgX19zdHJpbmdpZnkoY29uZCkpOwkgICAgICAgXAotCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgc2l6ZW9mbWVtYmVyKFRZUEUsIE1FTUJFUikgKHNpemVvZigoKFRZUEUgKikwKS0+TUVNQkVSKSkKIC8qKiAiQ292ZXJlZCBxdW90aWVudCIgZnVuY3Rpb24gKi8KICNkZWZpbmUgQ09WUSh2LCBkKSAgKCgodikgKyAoZCkgLSAxKSAvIChkKSkKQEAgLTg3LDE0ICs3OCw4IEBACiAJCSh2b2lkICopKHAyKSA9IFNXQVBQT0lOVEVSU19URU1QOwlcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBQUklOVEtEUlYoZm10LCBhcmdzLi4uKSBMT0dJTkYoZm10LCAjIyBhcmdzKQotI2RlZmluZSBUQkREUlYoZm10LCBhcmdzLi4uKSAgICBMT0dFUlIoZm10LCAjIyBhcmdzKQotI2RlZmluZSBIVUhEUlYoZm10LCBhcmdzLi4uKSAgICBMT0dFUlIoZm10LCAjIyBhcmdzKQotI2RlZmluZSBFUlJEUlYoZm10LCBhcmdzLi4uKSAgICBMT0dFUlIoZm10LCAjIyBhcmdzKQogI2RlZmluZSBXQVJORFJWKGZtdCwgYXJncy4uLikgICBMT0dXUk4oZm10LCAjIyBhcmdzKQogI2RlZmluZSBTRUNVUkVEUlYoZm10LCBhcmdzLi4uKSBMT0dXUk4oZm10LCAjIyBhcmdzKQotI2RlZmluZSBJTkZPRFJWKGZtdCwgYXJncy4uLikgICBMT0dJTkYoZm10LCAjIyBhcmdzKQotI2RlZmluZSBERUJVR0RSVihmbXQsIGFyZ3MuLi4pICBEQkdJTkYoZm10LCAjIyBhcmdzKQogCiAjZGVmaW5lIFBSSU5US0RFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICBMT0dJTkZERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQogI2RlZmluZSBUQkRERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgTE9HRVJSREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKQEAgLTEwNSw3ICs5MCw2IEBACiAjZGVmaW5lIFNFQ1VSRURFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICBMT0dXUk5ERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQogI2RlZmluZSBJTkZPREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgTE9HSU5GREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKICNkZWZpbmUgSU5GT0RFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikgICAgIExPR0lORkRFVlgoZGV2bm8sIGZtdCwgIyMgYXJncykKLSNkZWZpbmUgREVCVUdERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgIERCR0lORkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCiAKIC8qKiBWZXJpZmllcyB0aGUgY29uc2lzdGVuY3kgb2YgeW91ciBQUklWQVRFREVWSUNFREFUQSBzdHJ1Y3R1cmUgdXNpbmcKICAqICBjb252ZW50aW9uYWwgInNpZ25hdHVyZSIgZmllbGRzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzcXVldWUuaAppbmRleCAyNWI2MTgxLi4wOGJhMTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzcXVldWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzcXVldWUuaApAQCAtMjUsNyArMjUsNiBAQAogCiAjaW5jbHVkZSAibGludXgvdmVyc2lvbi5oIgogI2luY2x1ZGUgImlvY2hhbm5lbC5oIgotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmgKaW5kZXggYWE4NmFkZTcuLjUyYzNlYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN0aHJlYWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmgKQEAgLTI3LDcgKzI3LDYgQEAKIHN0cnVjdCB1aXN0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCWludCBpZDsKLQlpbnQgc2hvdWxkX3N0b3A7CiAJc3RydWN0IGNvbXBsZXRpb24gaGFzX3N0b3BwZWQ7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN1dGlscy5oCmluZGV4IDc0MTQyMjAuLmM3ZDBiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN1dGlscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN1dGlscy5oCkBAIC02NSwxNyArNjUsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9saW5rOwkvKiBsaW5rcyBpbnRvIFJlcUhhbmRsZXJJbmZvX2xpc3QgKi8KIH07CiAKLXN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICpyZXFfaGFuZGxlcl9hZGQodXVpZF9sZSBzd2l0Y2hfdXVpZCwKLQkJCQljb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAotCQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKLQkJCQl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAotCQkJCWludCAoKnN2cl9jaGFubmVsX29rKSh1bnNpZ25lZCBsb25nCi0JCQkJCQkJIGNoYW5uZWxfYnl0ZXMpLAotCQkJCWludCAoKnN2cl9jaGFubmVsX2luaXQpKHZvaWQgKngsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpjbGllbnRfc3RyLAotCQkJCQkJdTMyIGNsaWVudF9zdHJfbGVuLCB1NjQgYnl0ZXMpKTsKIHN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICpyZXFfaGFuZGxlcl9maW5kKHV1aWRfbGUgc3dpdGNoX3V1aWQpOwotaW50IHJlcV9oYW5kbGVyX2RlbCh1dWlkX2xlIHN3aXRjaF91dWlkKTsKIAogI2RlZmluZSB1aXNsaWJfaW9yZW1hcF9jYWNoZShhZGRyLCBzaXplKSBcCiAJZGJnX2lvcmVtYXBfY2FjaGUoYWRkciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQpAQCAtMTE1LDE5ICsxMDUsNyBAQAogCiBpbnQgdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcihpbnQgdHlwZSwgdm9pZCAqZnB0ciwKIAkJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmNoaXBzZXRfZHJpdmVyX2luZm8pOwotaW50IHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgodXVpZF9sZSBzd2l0Y2hfZ3VpZCwKLQkJCWNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCi0JCQlpbnQgKCpmcHRyKShzdHJ1Y3QgaW9fbXNncyAqKSwKLQkJCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCi0JCQlpbnQgKCpzdnJfY2hhbm5lbF9vaykodW5zaWduZWQgbG9uZwotCQkJCQkgICAgICBjaGFubmVsX2J5dGVzKSwKLQkJCWludCAoKnN2cl9jaGFubmVsX2luaXQpKHZvaWQgKngsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpjbGllbnRfc3RyLAotCQkJCQkJdTMyIGNsaWVudF9zdHJfbGVuLAotCQkJCQkJdTY0IGJ5dGVzKSwKLQkJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmNoaXBzZXRfZHJpdmVyX2luZm8pOwogCi1pbnQgdWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KHV1aWRfbGUgc3dpdGNoX3V1aWQpOwogdW5zaWduZWQgY2hhciAqdXRpbF9tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7CiB2b2lkIHV0aWxfdW5tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7CiB1bnNpZ25lZCBjaGFyICp1dGlsX21hcF92aXJ0X2F0b21pYyhzdHJ1Y3QgcGh5c19pbmZvICpzZyk7CkBAIC0yMDYsMjEgKzE4NCwxMCBAQAogCQkJICAgICAgKHZvaWQgX19pb21lbSAqKWd1aWQsIHNpemVvZih1dWlkX2xlKSk7CiAJCWlmICh1dWlkX2xlX2NtcCh0bXBndWlkLCBOVUxMX1VVSURfTEUpICE9IDApCiAJCQlicmVhazsKLQkJTE9HRVJSKCJXYWl0aW5nIGZvciBub24tMCBHVUlEICh3aHk/Pz8pLi4uXG4iKTsKIAkJVUlTX1RIUkVBRF9XQUlUX1NFQyg1KTsKIAl9Ci0JTE9HRVJSKCJPSy4uLiBHVUlEIGlzIG5vbi0wIG5vd1xuIik7CiB9CiAKLS8qIENvcHlGcmFnc0luZm9Gcm9tU2tiIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFkZGVkIHRvIGZyYWdzIGFycmF5Ci0gKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuCi0gKi8KLXVuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAotCQkJCQkgICAgIHZvaWQgKnNrYl9pbiwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBmcmFnc19tYXgsCi0JCQkJCSAgICAgc3RydWN0IHBoeXNfaW5mbyBmcmFnc1tdKTsKLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKIGlzc3VlX3ZtY2FsbF9pb19jb250cm9sdm1fYWRkcih1NjQgKmNvbnRyb2xfYWRkciwgdTMyICpjb250cm9sX2J5dGVzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91bmlrbG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDFiZGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKiB1bmlrbG9nLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotLyogVGhpcyBtb2R1bGUgY29udGFpbnMgbWFjcm9zIHRvIGFpZCBkZXZlbG9wZXJzIGluIGxvZ2dpbmcgbWVzc2FnZXMuCi0gKgotICogVGhpcyBtb2R1bGUgaXMgYWZmZWN0ZWQgYnkgdGhlIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbi4KLSAqCi0gKi8KLSNpZm5kZWYgX19VTklLTE9HX0hfXwotI2RlZmluZSBfX1VOSUtMT0dfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KLQotLyoKLSAqICMgREJHSU5GCi0gKgotICogXGJyaWVmIExvZyBkZWJ1ZyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgLSBsb2cgYSBMT0dfSU5GTyBtZXNzYWdlIG9ubHkKLSAqICAgICAgICBpZiBERUJVRyBjb21waWxldGltZSBvcHRpb24gZW5hYmxlZAotICoKLSAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCi0gKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCi0gKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCi0gKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQotICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZyBhIG1lc3NhZ2UgYXQgdGhlIExPR19JTkZPIGxldmVsLCBidXQgb25seSBpZiBERUJVRyBpcyBlbmFibGVkLiAgSWYKLSAqIERFQlVHIGlzIGRpc2FibGVkLCB0aGlzIGV4cGFuZHMgdG8gYSBuby1vcC4KLSAqLwotCi0vKgotICogIyBEQkdWRVIKLSAqCi0gKiBcYnJpZWYgTG9nIGRlYnVnIHZlcmJvc2UgbWVzc2FnZSAtIGxvZyBhIExPR19ERUJVRyBtZXNzYWdlIG9ubHkgaWYKLSAqICAgICAgICBERUJVRyBjb21waWxldGltZSBvcHRpb24gZW5hYmxlZAotICoKLSAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCi0gKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCi0gKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCi0gKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQotICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZyBhIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbCwgYnV0IG9ubHkgaWYgREVCVUcgaXMgZW5hYmxlZC4gIElmCi0gKiBERUJVRyBpcyBkaXNhYmxlZCwgdGhpcyBleHBhbmRzIHRvIGEgbm8tb3AuICBOb3RlIGFsc28gdGhhdCBMT0dfREVCVUcKLSAqIG1lc3NhZ2VzIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIGF0IHJ1bnRpbWUgYXMgd2VsbC4KLSAqLwotI2RlZmluZSBEQkdJTkZERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBEQkdWRVJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBEQkdJTkYoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBEQkdWRVIoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQotCi0vKgotICogIyBMT0dJTkYKLSAqCi0gKiBcYnJpZWYgTG9nIGluZm9ybWF0aW9uYWwgbWVzc2FnZSAtIGxvZ3MgYSBtZXNzYWdlIGF0IHRoZSBMT0dfSU5GTyBsZXZlbAotICoKLSAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCi0gKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCi0gKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCi0gKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQotICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZ3MgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGF0IHRoZSBMT0dfSU5GTyBsZXZlbC4KLSAqLwotCi0jZGVmaW5lIExPR0lORihmbXQsIGFyZ3MuLi4pIHByX2luZm8oZm10LCAjIyBhcmdzKQotI2RlZmluZSBMT0dJTkZERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCi0JcHJfaW5mbygiJXMgIiBmbXQsIGRldm5hbWUsICMjIGFyZ3MpCi0jZGVmaW5lIExPR0lORkRFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikgXAotCXByX2luZm8oImRldiVkICIgZm10LCBkZXZubywgIyMgYXJncykKLSNkZWZpbmUgTE9HSU5GTkFNRSh2bmljLCBmbXQsIGFyZ3MuLi4pCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmICh2bmljICE9IE5VTEwpIHsJCQkJCVwKLQkJCXByX2luZm8oIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAotCQl9IGVsc2UgewkJCQkJCVwKLQkJCXByX2luZm8oZm10LCAjIyBhcmdzKTsJCQkJXAotCQl9CQkJCQkJCVwKLQl9IHdoaWxlICgwKQotCi0vKgotICogIyBMT0dWRVIKLSAqCi0gKiBcYnJpZWYgTG9nIHZlcmJvc2UgbWVzc2FnZSAtIGxvZ3MgYSBtZXNzYWdlIGF0IHRoZSBMT0dfREVCVUcgbGV2ZWwsCi0gKiAgICAgICAgd2hpY2ggY2FuIGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUKLSAqCi0gKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgotICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgotICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgotICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgZm9ybWF0Ci0gKiBccGFyYW0gc3RyaW5nLgotICogXHJldHVybiBub3RoaW5nCi0gKgotICogTG9ncyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbC4gIE5vdGUgYWxzbyB0aGF0Ci0gKiBMT0dfREVCVUcgbWVzc2FnZXMgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgYXQgcnVudGltZSBhcyB3ZWxsLgotICovCi0jZGVmaW5lIExPR1ZFUihmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgTE9HVkVSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAotCXByX2RlYnVnKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKLSNkZWZpbmUgTE9HVkVSTkFNRSh2bmljLCBmbXQsIGFyZ3MuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAodm5pYyAhPSBOVUxMKSB7CQkJCQlcCi0JCQlwcl9kZWJ1ZygiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJcHJfZGVidWcoZm10LCAjIyBhcmdzKTsJCQkJXAotCQl9CQkJCQkJCVwKLQl9IHdoaWxlICgwKQotCi0vKgotICogIyBMT0dFUlIKLSAqCi0gKiBcYnJpZWYgTG9nIGVycm9yIG1lc3NhZ2UgLSBsb2dzIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0VSUiBsZXZlbCwKLSAqICAgICAgICBpbmNsdWRpbmcgc291cmNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCi0gKgotICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKLSAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KLSAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KLSAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIGZvcm1hdAotICogXHBhcmFtIHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZ3MgdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlIGF0IHRoZSBMT0dfRVJSIGxldmVsLiAgSXQgd2lsbCBhbHNvCi0gKiBpbmNsdWRlIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUgb2Ygd2hlcmUgdGhlIGVycm9yCi0gKiBvcmlnaW5hdGVkIGluIHRoZSBsb2cgbWVzc2FnZS4KLSAqLwotI2RlZmluZSBMT0dFUlIoZm10LCBhcmdzLi4uKSBwcl9lcnIoZm10LCAjIyBhcmdzKQotI2RlZmluZSBMT0dFUlJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCi0JcHJfZXJyKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKLSNkZWZpbmUgTE9HRVJSREVWWChkZXZubywgZm10LCBhcmdzLi4uKSBcCi0JcHJfZXJyKCJkZXYlZCAiIGZtdCwgZGV2bm8sICMjIGFyZ3MpCi0jZGVmaW5lIExPR0VSUk5BTUUodm5pYywgZm10LCBhcmdzLi4uKQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAodm5pYyAhPSBOVUxMKSB7CQkJCQlcCi0JCQlwcl9lcnIoIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAotCQl9IGVsc2UgewkJCQkJCVwKLQkJCXByX2VycihmbXQsICMjIGFyZ3MpOwkJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIExPR09SRFVNUEVSUihzZXFmaWxlLCBmbXQsIGFyZ3MuLi4pIGRvIHsJCVwKLQkJaWYgKHNlcWZpbGUpIHsJCQkJCVwKLQkJCXNlcV9wcmludGYoc2VxZmlsZSwgZm10LCAjIyBhcmdzKTsJXAotCQl9IGVsc2UgewkJCQkJXAotCQkJTE9HRVJSKGZtdCwgIyMgYXJncyk7CQkJXAotCQl9CQkJCQkJXAotCX0gd2hpbGUgKDApCi0KLS8qCi0gKiAjIExPR1dSTgotICoKLSAqIFxicmllZiBMb2cgd2FybmluZyBtZXNzYWdlIC0gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19XQVJOSU5HIGxldmVsLAotICogICAgICAgIGluY2x1ZGluZyBzb3VyY2UgbGluZSBudW1iZXIgaW5mb3JtYXRpb24KLSAqCi0gKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgotICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgotICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgotICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgZm9ybWF0Ci0gKiBccGFyYW0gc3RyaW5nLgotICogXHJldHVybiBub3RoaW5nCi0gKgotICogTG9ncyB0aGUgc3BlY2lmaWVkIGVycm9yIG1lc3NhZ2UgYXQgdGhlIExPR19XQVJOSU5HIGxldmVsLiAgSXQgd2lsbCBhbHNvCi0gKiBpbmNsdWRlIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUgb2Ygd2hlcmUgdGhlIGVycm9yCi0gKiBvcmlnaW5hdGVkIGluIHRoZSBsb2cgbWVzc2FnZS4KLSAqLwotI2RlZmluZSBMT0dXUk4oZm10LCBhcmdzLi4uKSBwcl93YXJuKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgTE9HV1JOREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAotCXByX3dhcm4oIiVzICIgZm10LCBkZXZuYW1lLCAjIyBhcmdzKQotI2RlZmluZSBMT0dXUk5OQU1FKHZuaWMsIGZtdCwgYXJncy4uLikgXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAotCQkJcHJfd2FybigiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJcHJfd2FybihmbXQsICMjIGFyZ3MpOwkJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNlbmRpZiAvKiBfX1VOSUtMT0dfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvS2NvbmZpZwppbmRleCBhNzEyZWI4Li5jMzlhMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIGNvbmZpZyBVTklTWVNfVUlTTElCCiAJdHJpc3RhdGUgIlVuaXN5cyB1aXNsaWIgZHJpdmVyIgotCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIEhBU19JT01FTQorCXNlbGVjdCBVTklTWVNfVklTT1JDSElQU0VUCiAJLS0taGVscC0tLQogCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB1aXNsaWIgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL01ha2VmaWxlCmluZGV4IDA4ZTYyMGQuLjg2MGY0OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL01ha2VmaWxlCkBAIC03LDggKzcsNiBAQAogdmlzb3J1aXNsaWIteSA6PSB1aXNsaWIubyB1aXNxdWV1ZS5vICB1aXN0aHJlYWQubyAgdWlzdXRpbHMubwogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKLWNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0Ci1jY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3NwYXJzdG9wZHJpdmVyCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYwppbmRleCBhOWVlZGRlLi5mOTNkMGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAiZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oIgogI2luY2x1ZGUgInVpc3V0aWxzLmgiCiAjaW5jbHVkZSAidmJ1c2NoYW5uZWwuaCIKQEAgLTEzMiwxNCArMTMxLDEwIEBACiB7CiAJdm9pZCBfX2lvbWVtICpjaCA9IHVpc2xpYl9pb3JlbWFwX2NhY2hlKGNoX2FkZHIsIGNoX2J5dGVzKTsKIAotCWlmICghY2gpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBlcnJvcjogaW9yZW1hcF9jYWNoZSBvZiBjaGFubmVsQWRkcjolTHggZm9yIGNoYW5uZWxCeXRlczolbGx1IGZhaWxlZCIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNoX2FkZHIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNoX2J5dGVzKTsKKwlpZiAoIWNoKQogCQlyZXR1cm4gTlVMTDsKLQl9CisKIAlpZiAoIVNQQVJfVkJVU19DSEFOTkVMX09LX0NMSUVOVChjaCkpIHsKLQkJRVJSRFJWKCIlcyBjaGFubmVsIGNhbm5vdCBiZSB1c2VkIiwgX19mdW5jX18pOwogCQl1aXNsaWJfaW91bm1hcChjaCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTE1NCw4ICsxNDksNiBAQAogCXNpemVfdCBzaXplOwogCiAJaWYgKG1heF9idXNfY291bnQgPT0gYnVzX2xpc3RfY291bnQpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IG1heCBidXNlczolZCBhbHJlYWR5IGNyZWF0ZWRcbiIsCi0JCSAgICAgICBtYXhfYnVzX2NvdW50KTsKIAkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIG1heF9idXNfY291bnQsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfQlVTRVM7CkBAIC0xNzIsNyArMTY1LDYgQEAKIAkgICAgKGRldl9jb3VudCAqIHNpemVvZihzdHJ1Y3QgZGV2aWNlX2luZm8gKikpOwogCWJ1cyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidXMpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGttYWxsb2MgZm9yIGJ1cyBmYWlsZWQuXG4iKTsKIAkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOwpAQCAtMjA5LDggKzIwMSw2IEBACiAJCS8qIGZvdW5kIGEgYnVzIGFscmVhZHkgaW4gdGhlIGxpc3Qgd2l0aCBzYW1lIGJ1c19ubyAtCiAJCSAqIHJlamVjdCBhZGQKIAkJICovCi0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWQgYWxyZWFkeSBleGlzdHMuXG4iLAotCQkgICAgICAgYnVzLT5idXNfbm8pOwogCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCWtmcmVlKGJ1cyk7CkBAIC0yMzQsMTQgKzIyNCwxMiBAQAogCQljbWQuYWRkX3ZidXMuYnVzX3V1aWQgPSBtc2ctPmNtZC5jcmVhdGVfYnVzLmJ1c19kYXRhX3R5cGVfdXVpZDsKIAkJY21kLmFkZF92YnVzLmluc3RhbmNlX3V1aWQgPSBtc2ctPmNtZC5jcmVhdGVfYnVzLmJ1c19pbnN0X3V1aWQ7CiAJCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CiAJCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNfbm8sCiAJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQkJa2ZyZWUoYnVzKTsKIAkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFOwogCQl9CiAJCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYygmY21kKSkgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfQUREX1ZCVVMgcmV0dXJuZWQgZXJyb3IuIik7CiAJCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNfbm8sCiAJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQkJa2ZyZWUoYnVzKTsKQEAgLTI4NywxNyArMjc1LDEzIEBACiAJfQogCiAJaWYgKCFidXMpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBmYWlsZWQgdG8gZmluZCBidXMgJWQuXG4iLAotCQkgICAgICAgYnVzX25vKTsKIAkJcmVhZF91bmxvY2soJmJ1c19saXN0X2xvY2spOwogCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwogCX0KIAogCS8qIHZlcmlmeSB0aGF0IHRoaXMgYnVzIGhhcyBubyBkZXZpY2VzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBidXMtPmRldmljZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChidXMtPmRldmljZVtpXSAhPSBOVUxMKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IGRldmljZSAlaSBhdHRhY2hlZCB0byBidXMgJWQuIiwKLQkJCSAgICAgICBpLCBidXNfbm8pOworCQlpZiAoYnVzLT5kZXZpY2VbaV0pIHsKIAkJCXJlYWRfdW5sb2NrKCZidXNfbGlzdF9sb2NrKTsKIAkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfREVWSUNFX0FUVEFDSEVEOwogCQl9CkBAIC0zMTEsMTQgKzI5NSwxMSBAQAogCSAgIHdpdGggdGhpcyBidXMuICovCiAJY21kLm1zZ3R5cGUgPSBHVUVTVF9ERUxfVkJVUzsKIAljbWQuZGVsX3ZidXMuYnVzX25vID0gYnVzX25vOwotCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKQogCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKLQl9Ci0JaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKCZjbWQpKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfVkJVUyByZXR1cm5lZCBlcnJvci4iKTsKKworCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYygmY21kKSkKIAkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOwotCX0KIAogCS8qIGZpbmFsbHksIHJlbW92ZSB0aGUgYnVzIGZyb20gdGhlIGxpc3QgKi8KIHJlbW92ZToKQEAgLTM1Nyw3ICszMzgsNiBAQAogCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9BVE9NSUMpOwogCWlmICghZGV2KSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBrbWFsbG9jIGZvciBkZXYgZmFpbGVkLlxuIik7CiAJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOwpAQCAtMzgxLDkgKzM2MSw2IEBACiAJCQkgKi8KIAkJCW1pbl9zaXplID0gcmVxX2hhbmRsZXItPm1pbl9jaGFubmVsX2J5dGVzOwogCQlpZiAobWluX3NpemUgPiBtc2ctPmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYnl0ZXMpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBjaGFubmVsIHNpemUgaXMgdG9vIHNtYWxsLCBjaGFubmVsIHNpemU6MHglbHgsIHJlcXVpcmVkIHNpemU6MHglbHgiLAotCQkJICAgICAgICh1bG9uZyltc2ctPmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYnl0ZXMsCi0JCQkgICAgICAgKHVsb25nKW1pbl9zaXplKTsKIAkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sCiAJCQkJCSBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1NJWkVfVE9PX1NNQUxMOwpAQCAtMzkzLDkgKzM3MCw2IEBACiAJCSAgICB1aXNsaWJfaW9yZW1hcF9jYWNoZShkZXYtPmNoYW5uZWxfYWRkciwKIAkJCQkJIG1zZy0+Y21kLmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9ieXRlcyk7CiAJCWlmICghZGV2LT5jaGFucHRyKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogaW9yZW1hcF9jYWNoZSBvZiBjaGFubmVsQWRkcjolTHggZm9yIGNoYW5uZWxCeXRlczolbGx1IGZhaWxlZCIsCi0JCQkgICAgICAgZGV2LT5jaGFubmVsX2FkZHIsCi0JCQkgICAgICAgbXNnLT5jbWQuY3JlYXRlX2RldmljZS5jaGFubmVsX2J5dGVzKTsKIAkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0lPUkVNQVBfRkFJTEVEOwogCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywKIAkJCQkJIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKQEAgLTQxMSw4ICszODUsNiBAQAogCQkJY29udGludWU7CiAJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLwogCQlpZiAoZGV2X25vID49IGJ1cy0+ZGV2aWNlX2NvdW50KSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogZGV2aWNlICglZCkgPj0gZGV2aWNlQ291bnQgKCVkKS4iLAotCQkJICAgICAgIGRldl9ubywgYnVzLT5kZXZpY2VfY291bnQpOwogCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0RFVklDRVM7CiAJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2X25vLAogCQkJCQkgYnVzX25vLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwpAQCAtNDIxLDggKzM5Myw2IEBACiAJCX0KIAkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGlzIG5vdCBhbHJlYWR5IHNldCAqLwogCQlpZiAoYnVzLT5kZXZpY2VbZGV2X25vXSkgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGRldmljZSAlZCBpcyBhbHJlYWR5IGV4aXN0cy4iLAotCQkJICAgICAgIGRldl9ubyk7CiAJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywKIAkJCQkJIGRldl9ubywgYnVzX25vLAogCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKQEAgLTQ0NSw4ICs0MTUsNiBAQAogCQkJd2FpdF9mb3JfdmFsaWRfZ3VpZCgmKChzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIgX19pb21lbSAqKQogCQkJCQkgICAgKGRldi0+Y2hhbnB0cikpLT5jaHR5cGUpOwogCQkJaWYgKCFTUEFSX1ZIQkFfQ0hBTk5FTF9PS19DTElFTlQoZGV2LT5jaGFucHRyKSkgewotCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOltDTElFTlRdVkhCQSBkZXYgJWQgY2hhbiBpbnZhbGlkLiIsCi0JCQkJICAgICAgIGRldl9ubyk7CiAJCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsCiAJCQkJCQkgZGV2X25vLCBidXNfbm8sCiAJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKQEAgLTQ2NCw4ICs0MzIsNiBAQAogCQkJd2FpdF9mb3JfdmFsaWRfZ3VpZCgmKChzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIgX19pb21lbSAqKQogCQkJCQkgICAgKGRldi0+Y2hhbnB0cikpLT5jaHR5cGUpOwogCQkJaWYgKCFTUEFSX1ZOSUNfQ0hBTk5FTF9PS19DTElFTlQoZGV2LT5jaGFucHRyKSkgewotCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBWTklDW0NMSUVOVF0gZGV2ICVkIGNoYW4gaW52YWxpZC4iLAotCQkJCSAgICAgICBkZXZfbm8pOwogCQkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLAogCQkJCQkJIGRldl9ubywgYnVzX25vLAogCQkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CkBAIC00NzksNyArNDQ1LDYgQEAKIAkJCWNtZC5hZGRfdm5pYy5pbnN0YW5jZV91dWlkID0gZGV2LT5pbnN0YW5jZV91dWlkOwogCQkJY21kLmFkZF92aGJhLmludHIgPSBkZXYtPmludHI7CiAJCX0gZWxzZSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKIAkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sCiAJCQkJCSBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTjsKQEAgLTQ4Nyw3ICs0NTIsNiBAQAogCQl9CiAKIAkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKIAkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sCiAJCQkJCSBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFOwpAQCAtNDk1LDcgKzQ1OSw2IEBACiAJCX0KIAogCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMoJmNtZCkpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiB2aXJ0cGNpIEdVRVNUX0FERF9bVkhCQXx8Vk5JQ10gcmV0dXJuZWQgZXJyb3IuIik7CiAJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2X25vLAogCQkJCQkgYnVzX25vLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQkJcmVzdWx0ID0KQEAgLTUxMCw4ICs0NzMsNiBAQAogCX0KIAlyZWFkX3VubG9jaygmYnVzX2xpc3RfbG9jayk7CiAKLQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogZmFpbGVkIHRvIGZpbmQgYnVzICVkLiIsCi0JICAgICAgIGJ1c19ubyk7CiAJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7CkBAIC01NDIsMTUgKzUwMywxMSBAQAogCQlpZiAoYnVzLT5idXNfbm8gPT0gYnVzX25vKSB7CiAJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KIAkJCWlmIChkZXZfbm8gPj0gYnVzLT5kZXZpY2VfY291bnQpIHsKLQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiBkZXZpY2UoJWQpID49IGRldmljZUNvdW50KCVkKS4iLAotCQkJCSAgICAgICBkZXZfbm8sIGJ1cy0+ZGV2aWNlX2NvdW50KTsKIAkJCQlyZXR2YWwgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKIAkJCX0gZWxzZSB7CiAJCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGV4aXN0cyAqLwogCQkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldl9ub107CiAJCQkJaWYgKCFkZXYpIHsKLQkJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogZGV2aWNlICVkIGRvZXMgbm90IGV4aXN0LiIsCi0JCQkJCSAgICAgICBkZXZfbm8pOwogCQkJCQlyZXR2YWwgPQogCQkJCQkgIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKIAkJCQl9CkBAIC01NTgsMTEgKzUxNSw5IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoIWJ1cykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgYnVzX25vKTsKKwlpZiAoIWJ1cykKIAkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7Ci0JfQorCiAJcmVhZF91bmxvY2soJmJ1c19saXN0X2xvY2spOwogCWlmIChyZXR2YWwgPT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewogCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCkBAIC01NzcsMTUgKzUzMiwxMSBAQAogCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9QQVVTRV9WTklDOwogCQkJY21kLnBhdXNlX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKIAkJfSBlbHNlIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpwYXVzZSBGYWlsZWQ6IHVua25vd24gY2hhbm5lbFR5cGVHdWlkLlxuIik7CiAJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV047CiAJCX0KLQkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUgRmFpbGVkOiB2aXJ0cGNpIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkLiIpOworCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMpCiAJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKLQkJfQogCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMoJmNtZCkpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpwYXVzZSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfUEFVU0VfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOwogCQkJcmV0dXJuCiAJCQkgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOwogCQl9CkBAIC02MDksMTUgKzU2MCwxMSBAQAogCQlpZiAoYnVzLT5idXNfbm8gPT0gYnVzX25vKSB7CiAJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KIAkJCWlmIChkZXZfbm8gPj0gYnVzLT5kZXZpY2VfY291bnQpIHsKLQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VDb3VudCglZCkuIiwKLQkJCQkgICAgICAgZGV2X25vLCBidXMtPmRldmljZV9jb3VudCk7CiAJCQkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQ7CiAJCQl9IGVsc2UgewogCQkJCS8qIG1ha2Ugc3VyZSB0aGlzIGRldmljZSBleGlzdHMgKi8KIAkJCQlkZXYgPSBidXMtPmRldmljZVtkZXZfbm9dOwogCQkJCWlmICghZGV2KSB7Ci0JCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiBkZXZpY2UgJWQgZG9lcyBub3QgZXhpc3QuIiwKLQkJCQkJICAgICAgIGRldl9ubyk7CiAJCQkJCXJldHZhbCA9CiAJCQkJCSAgQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwogCQkJCX0KQEAgLTYyNiwxMSArNTczLDkgQEAKIAkJfQogCX0KIAotCWlmICghYnVzKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgYnVzX25vKTsKKwlpZiAoIWJ1cykKIAkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7Ci0JfQorCiAJcmVhZF91bmxvY2soJmJ1c19saXN0X2xvY2spOwogCS8qIHRoZSBtc2cgaXMgYm91bmQgZm9yIHZpcnRwY2k7IHNlbmQKIAkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjawpAQCAtNjQ1LDE1ICs1OTAsMTEgQEAKIAkJCWNtZC5tc2d0eXBlID0gR1VFU1RfUkVTVU1FX1ZOSUM7CiAJCQljbWQucmVzdW1lX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKIAkJfSBlbHNlIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiB1bmtub3duIGNoYW5uZWxUeXBlR3VpZC5cbiIpOwogCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOOwogCQl9Ci0JCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKQogCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7Ci0JCX0KIAkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKCZjbWQpKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogdmlydHBjaSBHVUVTVF9SRVNVTUVfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOwogCQkJcmV0dXJuCiAJCQkgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOwogCQl9CkBAIC02NzMsMjEgKzYxNCwxNSBAQAogCWRldl9ubyA9IG1zZy0+Y21kLmRlc3Ryb3lfZGV2aWNlLmJ1c19ubzsKIAogCXJlYWRfbG9jaygmYnVzX2xpc3RfbG9jayk7Ci0JTE9HSU5GKCJkZXN0cm95X2RldmljZSBjYWxsZWQgZm9yIGJ1c19ubz0ldSwgZGV2X25vPSV1IiwgYnVzX25vLAotCSAgICAgICBkZXZfbm8pOwogCWZvciAoYnVzID0gYnVzX2xpc3Q7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CiAJCWlmIChidXMtPmJ1c19ubyA9PSBidXNfbm8pIHsKIAkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLwogCQkJaWYgKGRldl9ubyA+PSBidXMtPmRldmljZV9jb3VudCkgewotCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VfY291bnQoJWQpLiIsCi0JCQkJICAgICAgIGRldl9ubywgYnVzLT5kZXZpY2VfY291bnQpOwogCQkJCXJldHZhbCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBtYWtlIHN1cmUgdGhpcyBkZXZpY2UgZXhpc3RzICovCiAJCQkJZGV2ID0gYnVzLT5kZXZpY2VbZGV2X25vXTsKIAkJCQlpZiAoIWRldikgewotCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IGRldmljZSAlZCBkb2VzIG5vdCBleGlzdC4iLAotCQkJCQkgICAgICAgZGV2X25vKTsKIAkJCQkJcmV0dmFsID0KIAkJCQkJICAgICBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CiAJCQkJfQpAQCAtNjk2LDExICs2MzEsOCBAQAogCQl9CiAJfQogCi0JaWYgKCFidXMpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgYnVzX25vKTsKKwlpZiAoIWJ1cykKIAkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7Ci0JfQogCXJlYWRfdW5sb2NrKCZidXNfbGlzdF9sb2NrKTsKIAlpZiAocmV0dmFsID09IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKIAkJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZApAQCAtNzE1LDE3ICs2NDcsMTQgQEAKIAkJCWNtZC5tc2d0eXBlID0gR1VFU1RfREVMX1ZOSUM7CiAJCQljbWQuZGVsX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKIAkJfSBlbHNlIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKIAkJCXJldHVybgogCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOOwogCQl9CiAJCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiB2aXJ0cGNpIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkLiIpOwogCQkJcmV0dXJuCiAJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKIAkJfQogCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMoJmNtZCkpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOwogCQkJcmV0dXJuCiAJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1I7CiAJCX0KQEAgLTczNCwxNSArNjYzLDExIEBACiAgKiBvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2hhbm5lbCBhbmQgeW91IHdpbGwgZ2V0IGEgInVuYWJsZSB0byBoYW5kbGUKICAqIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIKICAqLwotCQlpZiAoZGV2LT5wb2xsaW5nKSB7Ci0JCQlMT0dJTkYoImNhbGxpbmcgdWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzIik7CisJCWlmIChkZXYtPnBvbGxpbmcpCiAJCQl1aXNsaWJfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoYnVzX25vLCBkZXZfbm8pOwotCQl9CiAJCS8qIHVubWFwIHRoZSBjaGFubmVsIG1lbW9yeSBmb3IgdGhlIGRldmljZS4gKi8KLQkJaWYgKCFtc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UpIHsKLQkJCUxPR0lORigiZGVzdHJveV9kZXZpY2UsIGRvaW5nIGlvdW5tYXAiKTsKKwkJaWYgKCFtc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UpCiAJCQl1aXNsaWJfaW91bm1hcChkZXYtPmNoYW5wdHIpOwotCQl9CiAJCWtmcmVlKGRldik7CiAJCWJ1cy0+ZGV2aWNlW2Rldl9ub10gPSBOVUxMOwogCX0KQEAgLTc4MCwxMCArNzA1LDggQEAKIAogCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksIDAsIDApOwogCW1zZy5jbWQuZGVzdHJveV9idXMuYnVzX25vID0gYnVzX25vOwotCWlmIChkZXN0cm95X2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7Ci0JCUxPR0VSUigiZGVzdHJveV9idXMgZmFpbGVkLiBidXNfbm89MHgleFxuIiwgYnVzX25vKTsKKwlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIDA7Ci0JfQogCXJldHVybiAxOwogfQogCkBAIC03OTQsMTEgKzcxNyw4IEBACiAJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgMCwgMCk7CiAJbXNnLmNtZC5kZXN0cm95X2RldmljZS5idXNfbm8gPSBidXNfbm87CiAJbXNnLmNtZC5kZXN0cm95X2RldmljZS5kZXZfbm8gPSBkZXZfbm87Ci0JaWYgKGRlc3Ryb3lfZGV2aWNlKCZtc2csIE5VTEwpICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJkZXN0cm95X2RldmljZSBmYWlsZWQuIGJ1c19ubz0weCV4IGRldl9ubz0weCV4XG4iLAotCQkgICAgICAgYnVzX25vLCBkZXZfbm8pOworCWlmIChkZXN0cm95X2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQogCQlyZXR1cm4gMDsKLQl9CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTgwOCw3ICs3MjgsNiBAQAogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7CiAKLQlMT0dJTkYoImVudGVyIGJ1c05vPTB4JXhcbiIsIGJ1c19ubyk7CiAJLyogc3RlcCAwOiBpbml0IHRoZSBjaGlwc2V0ICovCiAJUE9TVENPREVfTElOVVhfMyhDSElQU0VUX0lOSVRfRU5UUllfUEMsIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKQEAgLTgyNCwxMSArNzQzLDggQEAKIAkJKi8KIAkJbXNnLmNtZC5pbml0X2NoaXBzZXQuYnVzX2NvdW50ID0gMjM7CiAJCW1zZy5jbWQuaW5pdF9jaGlwc2V0LnN3aXRjaF9jb3VudCA9IDA7Ci0JCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewotCQkJTE9HRVJSKCJpbml0X2NoaXBzZXQgZmFpbGVkLlxuIik7CisJCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJCXJldHVybiAwOwotCQl9Ci0JCUxPR0lORigiY2hpcHNldCBpbml0aWFsaXplZFxuIik7CiAJCVBPU1RDT0RFX0xJTlVYXzMoQ0hJUFNFVF9JTklUX0VYSVRfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJfQpAQCAtODQyLDcgKzc1OCw2IEBACiAJbXNnLmNtZC5jcmVhdGVfYnVzLmNoYW5uZWxfYWRkciA9IGNoYW5uZWxfYWRkcjsKIAltc2cuY21kLmNyZWF0ZV9idXMuY2hhbm5lbF9ieXRlcyA9IG5fY2hhbm5lbF9ieXRlczsKIAlpZiAoY3JlYXRlX2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7Ci0JCUxPR0VSUigiY3JlYXRlX2J1cyBmYWlsZWQuXG4iKTsKIAkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIDA7CkBAIC04NzEsMTEgKzc4Niw4IEBACiAJbXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA9IGRldl9ubzsKIAltc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUgPSBzZWdtZW50X3N0YXRlX3N0YW5kYnk7CiAJcmMgPSBwYXVzZV9kZXZpY2UoJm1zZyk7Ci0JaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJWSEJBIHBhdXNlX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKLQkJICAgICAgIGJ1c19ubywgZGV2X25vKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIHJjOwotCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZoYmEpOwpAQCAtODkxLDExICs4MDMsOCBAQAogCW1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm8gPSBkZXZfbm87CiAJbXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlID0gc2VnbWVudF9zdGF0ZV9ydW5uaW5nOwogCXJjID0gcmVzdW1lX2RldmljZSgmbXNnKTsKLQlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewotCQlMT0dFUlIoIlZIQkEgcmVzdW1lX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKLQkJICAgICAgIGJ1c19ubywgZGV2X25vKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIHJjOwotCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92aGJhKTsKQEAgLTkwOCw3ICs4MTcsNiBAQAogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7CiAKLQlMT0dJTkYoIiBlbnRlciBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsIGJ1c19ubywgZGV2X25vKTsKIAkvKiBjaGlwc2V0IGluaXQnZWQgd2l0aCBidXMgYnVzIGhhcyBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCAtCiAJKiBWZXJpZnkgaXQgc3RpbGwgZXhpc3RzIHN0ZXAgMjogY3JlYXRlIHRoZSBWSEJBIGRldmljZSBvbiB0aGUKIAkqIGJ1cwpAQCAtOTMyLDggKzg0MCw2IEBACiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGlycV9pbmZvKSk7CiAJbXNnLmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYWRkciA9IHBoeXNfY2hhbl9hZGRyOwogCWlmIChjaGFuX2J5dGVzIDwgTUlOX0lPX0NIQU5ORUxfU0laRSkgewotCQlMT0dFUlIoIndyb25nIGNoYW5uZWwgc2l6ZS5jaGFuX2J5dGVzID0gMHgleCBJT19DSEFOTkVMX1NJWkU9IDB4JXhcbiIsCi0JCSAgICAgICBjaGFuX2J5dGVzLCAodW5zaWduZWQgaW50KU1JTl9JT19DSEFOTkVMX1NJWkUpOwogCQlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoYW5fYnl0ZXMsCiAJCQkJIE1JTl9JT19DSEFOTkVMX1NJWkUsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwpAQCAtOTQxLDcgKzg0Nyw2IEBACiAJbXNnLmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYnl0ZXMgPSBjaGFuX2J5dGVzOwogCW1zZy5jbWQuY3JlYXRlX2RldmljZS5kYXRhX3R5cGVfdXVpZCA9IHNwYXJfdmhiYV9jaGFubmVsX3Byb3RvY29sX3V1aWQ7CiAJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewotCQlMT0dFUlIoIlZIQkEgY3JlYXRlX2RldmljZSBmYWlsZWQuXG4iKTsKIAkJUE9TVENPREVfTElOVVhfNChWSEJBX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIDA7CkBAIC05NjcsNyArODcyLDYgQEAKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgbXNnOwogCi0JTE9HSU5GKCIgZW50ZXIgYnVzTm89MHgleCBkZXZObz0weCV4XG4iLCBidXNfbm8sIGRldl9ubyk7CiAJLyogY2hpcHNldCBpbml0J2VkIHdpdGggYnVzIGJ1cyBoYXMgYmVlbiBwcmV2aW91c2x5IGNyZWF0ZWQgLQogCSogVmVyaWZ5IGl0IHN0aWxsIGV4aXN0cyBzdGVwIDI6IGNyZWF0ZSB0aGUgVk5JQyBkZXZpY2Ugb24gdGhlCiAJKiBidXMKQEAgLTk5MSw4ICs4OTUsNiBAQAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcnFfaW5mbykpOwogCW1zZy5jbWQuY3JlYXRlX2RldmljZS5jaGFubmVsX2FkZHIgPSBwaHlzX2NoYW5fYWRkcjsKIAlpZiAoY2hhbl9ieXRlcyA8IE1JTl9JT19DSEFOTkVMX1NJWkUpIHsKLQkJTE9HRVJSKCJ3cm9uZyBjaGFubmVsIHNpemUuY2hhbl9ieXRlcyA9IDB4JXggSU9fQ0hBTk5FTF9TSVpFPSAweCV4XG4iLAotCQkgICAgICAgY2hhbl9ieXRlcywgKHVuc2lnbmVkIGludClNSU5fSU9fQ0hBTk5FTF9TSVpFKTsKIAkJUE9TVENPREVfTElOVVhfNChWTklDX0NSRUFURV9GQUlMVVJFX1BDLCBjaGFuX2J5dGVzLAogCQkJCSBNSU5fSU9fQ0hBTk5FTF9TSVpFLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm4gMDsKQEAgLTEwMDAsNyArOTAyLDYgQEAKIAltc2cuY21kLmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9ieXRlcyA9IGNoYW5fYnl0ZXM7CiAJbXNnLmNtZC5jcmVhdGVfZGV2aWNlLmRhdGFfdHlwZV91dWlkID0gc3Bhcl92bmljX2NoYW5uZWxfcHJvdG9jb2xfdXVpZDsKIAlpZiAoY3JlYXRlX2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7Ci0JCUxPR0VSUigiVk5JQyBjcmVhdGVfZGV2aWNlIGZhaWxlZC5cbiIpOwogCQlQT1NUQ09ERV9MSU5VWF80KFZOSUNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm4gMDsKQEAgLTEwMjMsMTEgKzkyNCw4IEBACiAJbXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA9IGRldl9ubzsKIAltc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUgPSBzZWdtZW50X3N0YXRlX3N0YW5kYnk7CiAJcmMgPSBwYXVzZV9kZXZpY2UoJm1zZyk7Ci0JaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJWTklDIHBhdXNlX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKLQkJICAgICAgIGJ1c19ubywgZGV2X25vKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIC0xOwotCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZuaWMpOwpAQCAtMTA0MywxMSArOTQxLDggQEAKIAltc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID0gZGV2X25vOwogCW1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHNlZ21lbnRfc3RhdGVfcnVubmluZzsKIAlyYyA9IHJlc3VtZV9kZXZpY2UoJm1zZyk7Ci0JaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJWTklDIHJlc3VtZV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsCi0JCSAgICAgICBidXNfbm8sIGRldl9ubyk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpCiAJCXJldHVybiAtMTsKLQl9CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdm5pYyk7CkBAIC0xMDY5LDExICs5NjQsOCBAQAogCSovCiAJdm9pZCAqcCA9IGttZW1fY2FjaGVfYWxsb2MoY3VyX3Bvb2wsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1JFVFJZKTsKIAotCWlmIChwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJ1aXNsaWJfbWFsbG9jIGZhaWxlZCB0byBhbGxvYyB1aXNjbWRyc3AgQCVzOiVkIiwKLQkJICAgICAgIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJcmV0dXJuIHA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfYWxsb2MpOwpAQCAtMTA4MSwxMCArOTczLDggQEAKIHZvaWQKIHVpc2xpYl9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpjdXJfcG9vbCwgdm9pZCAqcCwgY2hhciAqZm4sIGludCBsbikKIHsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCUxPR0VSUigidWlzbGliX2ZyZWUgTlVMTCBwb2ludGVyIEAlczolZCIsIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQogCWttZW1fY2FjaGVfZnJlZShjdXJfcG9vbCwgcCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfZnJlZSk7CkBAIC0xMTYyLDIwICsxMDUyLDE2IEBACiAJaW50IHJlbWFpbmluZ19ieXRlcyA9IFBST0NfUkVBRF9CVUZGRVJfU0laRTsKIAogLyogKnN0YXJ0ID0gYnVmOyAqLwotCWlmIChkZWJ1Z19idWYgPT0gTlVMTCkgewotCQlEQkdJTkYoImRlYnVnX2J1ZiA9PSBOVUxMOyBhbGxvY2F0aW5nIGJ1ZmZlci5cbi4iKTsKKwlpZiAoIWRlYnVnX2J1ZikgewogCQlkZWJ1Z19idWYgPSB2bWFsbG9jKFBST0NfUkVBRF9CVUZGRVJfU0laRSk7CiAKLQkJaWYgKGRlYnVnX2J1ZiA9PSBOVUxMKSB7Ci0JCQlMT0dFUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgdG8gcHJvdmlkZSBwcm9jIGRhdGEuXG4iKTsKKwkJaWYgKCFkZWJ1Z19idWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCX0KIAogCXRlbXAgPSBkZWJ1Z19idWY7CiAKIAlpZiAoKCpvZmZzZXQgPT0gMCkgfHwgKCFkZWJ1Z19idWZfdmFsaWQpKSB7Ci0JCURCR0lORigiY2FsbGluZyBpbmZvX2RlYnVnZnNfcmVhZF9oZWxwZXIuXG4iKTsKIAkJLyogaWYgdGhlIHJlYWQgZmFpbHMsIHRoZW4gLTEgd2lsbCBiZSByZXR1cm5lZCAqLwogCQl0b3RhbF9ieXRlcyA9IGluZm9fZGVidWdmc19yZWFkX2hlbHBlcigmdGVtcCwgJnJlbWFpbmluZ19ieXRlcyk7CiAJCWRlYnVnX2J1Zl92YWxpZCA9IDE7CkBAIC0xMTk2LDE3ICsxMDgyLDkgQEAKIAlmb3IgKGJ1cyA9IGJ1c19saXN0OyBidXM7IGJ1cyA9IGJ1cy0+bmV4dCkgewogCQlpZiAoYnVzLT5idXNfbm8gPT0gYnVzX25vKSB7CiAJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KLQkJCWlmIChkZXZfbm8gPj0gYnVzLT5kZXZpY2VfY291bnQpIHsKLQkJCQlMT0dFUlIoIiVzIGJhZCBidXNfbm8sIGRldl9ubz0lZCwlZCIsCi0JCQkJICAgICAgIF9fZnVuY19fLAotCQkJCSAgICAgICAoaW50KWJ1c19ubywgKGludClkZXZfbm8pOworCQkJaWYgKGRldl9ubyA+PSBidXMtPmRldmljZV9jb3VudCkKIAkJCQlicmVhazsKLQkJCX0KIAkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldl9ub107Ci0JCQlpZiAoIWRldikKLQkJCQlMT0dFUlIoIiVzIGJhZCBidXNfbm8sIGRldl9ubz0lZCwlZCIsCi0JCQkJICAgICAgIF9fZnVuY19fLAotCQkJCSAgICAgICAoaW50KWJ1c19ubywgKGludClkZXZfbm8pOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMjUzLDcgKzExMzEsNiBAQAogCQkJCXdhaXRfY3ljbGVzID0gKGN1cl9jeWNsZXMgLSBvbGRfY3ljbGVzKTsKIAkJfQogCX0KLQlMT0dJTkYoIndhaXRfY3ljbGVzPSVsbHUiLCB3YWl0X2N5Y2xlcyk7CiAJY3ljbGVzX2JlZm9yZV93YWl0ID0gd2FpdF9jeWNsZXM7CiAJaWRsZV9jeWNsZXMgPSAwOwogCXBvbGxfZGV2X3N0YXJ0ID0gMDsKQEAgLTEyODEsNyArMTE1OCw3IEBACiAJCQkJKiBSZXNjaGVkdWxlIHdvcmsgdG8gb2NjdXIgYXMgc29vbiBhcwogCQkJCSogcG9zc2libGUuICovCiAJCQkJaWRsZV9jeWNsZXMgPSAwOwotCQkJCWlmIChuZXdfdGFpbCA9PSBOVUxMKSB7CisJCQkJaWYgKCFuZXdfdGFpbCkgewogCQkJCQlkZXYtPmZpcnN0X2J1c3lfY250Kys7CiAJCQkJCWlmICghCiAJCQkJCSAgICAobGlzdF9pc19sYXN0CkBAIC0xMjk0LDEwICsxMTcxLDEwIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoaW5jb21pbmdfdGkuc2hvdWxkX3N0b3ApCisJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJCWJyZWFrOwogCQl9Ci0JCWlmIChuZXdfdGFpbCAhPSBOVUxMKSB7CisJCWlmIChuZXdfdGFpbCkgewogCQkJdG90X21vdmVkX3RvX3RhaWxfY250Kys7CiAJCQlsaXN0X21vdmVfdGFpbChuZXdfdGFpbCwgJnBvbGxfZGV2X2NoYW4pOwogCQl9CkBAIC0xMzExLDEyICsxMTg4LDEwIEBACiAJCSogLSB0aGVyZSBpcyBubyBpbnB1dCB3YWl0aW5nIG9uIGFueSBvZiB0aGUgY2hhbm5lbHMKIAkJKiAtIHdlIGhhdmUgcmVjZWl2ZWQgYSBzaWduYWwgdG8gc3RvcCB0aGlzIHRocmVhZAogCQkqLwotCQlpZiAoaW5jb21pbmdfdGkuc2hvdWxkX3N0b3ApCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJaWYgKGVuX3NtYXJ0X3dha2V1cCA9PSAweEZGKSB7Ci0JCQlMT0dJTkYoImVuX3NtYXJ0X3dha2V1cCBzZXQgdG8gMHhmZiwgdG8gZm9yY2UgZXhpdGluZyBwcm9jZXNzX2luY29taW5nIik7CisJCWlmIChlbl9zbWFydF93YWtldXAgPT0gMHhGRikKIAkJCWJyZWFrOwotCQl9CiAJCS8qIHdhaXQgZm9yIFBPTExKSUZGSUVTX05PUk1BTCBqaWZmaWVzLCBvciB1bnRpbAogCQkqIHNvbWVvbmUgd2FrZXMgdXAgcG9sbF9kZXZfd2FrZV9xLAogCQkqIHdoaWNoZXZlciBjb21lcyBmaXJzdCBvbmx5IGRvIGEgd2FpdCB3aGVuIHdlIGhhdmUKQEAgLTEzMzUsNyArMTIxMCw2IEBACiAJCQlpZGxlX2N5Y2xlcyA9IGlkbGVfY3ljbGVzICsgZGVsdGFfY3ljbGVzOwogCQl9CiAJfQotCURCR0lORigiZXhpdGluZy5cbiIpOwogCWNvbXBsZXRlX2FuZF9leGl0KCZpbmNvbWluZ190aS5oYXNfc3RvcHBlZCwgMCk7CiB9CiAKQEAgLTEzNDYsNyArMTIyMCw2IEBACiAJCXJldHVybiBUUlVFOwogCWlmICghdWlzdGhyZWFkX3N0YXJ0KCZpbmNvbWluZ190aSwKIAkJCSAgICAgJnByb2Nlc3NfaW5jb21pbmcsIE5VTEwsICJkZXZfaW5jb21pbmciKSkgewotCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCBpbml0aWFsaXplX2luY29taW5nX3RocmVhZCAqKioqRkFJTEVEIik7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAJaW5jb21pbmdfc3RhcnRlZCA9IFRSVUU7CkBAIC0xMzY3LDExICsxMjQwLDkgQEAKIAlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldjsKIAogCWRldiA9IGZpbmRfZGV2KGJ1c19ubywgZGV2X25vKTsKLQlpZiAoIWRldikgewotCQlMT0dFUlIoIiVzIGJ1c05vPSVkLCBkZXZObz0lZCIsIF9fZnVuY19fLCAoaW50KShidXNfbm8pLAotCQkgICAgICAgKGludCkoZGV2X25vKSk7CisJaWYgKCFkZXYpCiAJCXJldHVybjsKLQl9CisKIAlkb3duKCZwb2xsX2Rldl9sb2NrKTsKIAlpbml0aWFsaXplX2luY29taW5nX3RocmVhZCgpOwogCWRldi0+aW50ZXJydXB0ID0gaW50ZXJydXB0OwpAQCAtMTM5MiwxMSArMTI2Myw4IEBACiAJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CiAKIAlkZXYgPSBmaW5kX2RldihidXNfbm8sIGRldl9ubyk7Ci0JaWYgKCFkZXYpIHsKLQkJTE9HRVJSKCIlcyBidXNObz0lZCwgZGV2Tm89JWQiLCBfX2Z1bmNfXywgKGludCkoYnVzX25vKSwKLQkJICAgICAgIChpbnQpKGRldl9ubykpOworCWlmICghZGV2KQogCQlyZXR1cm47Ci0JfQogCWRvd24oJnBvbGxfZGV2X2xvY2spOwogCWxpc3RfZGVsKCZkZXYtPmxpc3RfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMpOwogCWRldi0+cG9sbGluZyA9IEZBTFNFOwpAQCAtMTQ0NiwyNyArMTMxNCw2IEBACiAJaWYgKCF1bmlzeXNfc3Bhcl9wbGF0Zm9ybSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlMT0dJTkYoIk1PTklUT1JBUElTIik7Ci0KLQlMT0dJTkYoInNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKTolbHUgYnl0ZXNcbiIsCi0JICAgICAgICh1bG9uZylzaXplb2Yoc3RydWN0IHVpc2NtZHJzcCkpOwotCUxPR0lORigic2l6ZW9mKHN0cnVjdCBwaHlzX2luZm8pOiVsdVxuIiwKLQkgICAgICAgKHVsb25nKXNpemVvZihzdHJ1Y3QgcGh5c19pbmZvKSk7Ci0JTE9HSU5GKCJzaXplb2YodWlzY21kcnNwX3Njc2kpOiVsdVxuIiwKLQkgICAgICAgKHVsb25nKXNpemVvZihzdHJ1Y3QgdWlzY21kcnNwX3Njc2kpKTsKLQlMT0dJTkYoInNpemVvZih1aXNjbWRyc3BfbmV0KTolbHVcbiIsCi0JICAgICAgICh1bG9uZylzaXplb2Yoc3RydWN0IHVpc2NtZHJzcF9uZXQpKTsKLQlMT0dJTkYoInNpemVvZihDT05UUk9MVk1fTUVTU0FHRSk6JWx1IGJ5dGVzXG4iLAotCSAgICAgICAodWxvbmcpc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpOwotCUxPR0lORigic2l6ZW9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sKTolbHUgYnl0ZXNcbiIsCi0JICAgICAgICh1bG9uZylzaXplb2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wpKTsKLQlMT0dJTkYoInNpemVvZihDSEFOTkVMX0hFQURFUik6JWx1IGJ5dGVzXG4iLAotCSAgICAgICAodWxvbmcpc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpOwotCUxPR0lORigic2l6ZW9mKHN0cnVjdCBzcGFyX2lvX2NoYW5uZWxfcHJvdG9jb2wpOiVsdSBieXRlc1xuIiwKLQkgICAgICAgKHVsb25nKXNpemVvZihzdHJ1Y3Qgc3Bhcl9pb19jaGFubmVsX3Byb3RvY29sKSk7Ci0JTE9HSU5GKCJTSVpFT0ZfQ01EUlNQOiVsdSBieXRlc1xuIiwgU0laRU9GX0NNRFJTUCk7Ci0JTE9HSU5GKCJTSVpFT0ZfUFJPVE9DT0w6JWx1IGJ5dGVzXG4iLCBTSVpFT0ZfUFJPVE9DT0wpOwotCiAJLyogaW5pdGlhbGl6ZSBnbG9iYWwgcG9pbnRlcnMgdG8gTlVMTCAqLwogCWJ1c19saXN0ID0gTlVMTDsKIAlidXNfbGlzdF9jb3VudCA9IDA7CkBAIC0xNTE0LDggKzEzNjEsNiBAQAogCWRlYnVnZnNfcmVtb3ZlKGN5Y2xlc19iZWZvcmVfd2FpdF9kZWJ1Z2ZzX3JlYWQpOwogCWRlYnVnZnNfcmVtb3ZlKHBsYXRmb3JtbnVtYmVyX2RlYnVnZnNfcmVhZCk7CiAJZGVidWdmc19yZW1vdmUoZGlyX2RlYnVnZnMpOwotCi0JREJHSU5GKCJnb29kYnllLlxuIik7CiB9CiAKIG1vZHVsZV9pbml0KHVpc2xpYl9tb2RfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzcXVldWUuYwppbmRleCA3MWJiN2I2Li5kNDZkZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3F1ZXVlLmMKQEAgLTI5NSwxMiArMjk1LDEwIEBACiAJd2hpbGUgKCFkb19sb2NrZWRfY2xpZW50X2luc2VydChxdWV1ZWluZm8sIHdoaWNocXVldWUsIGNtZHJzcCwKIAkJCQkJKHNwaW5sb2NrX3QgKilpbnNlcnRsb2NrLAogCQkJCQljaGFubmVsX2lkKSkgewotCQlpZiAob2t0b3dhaXQgIT0gT0tfVE9fV0FJVCkgewotCQkJTE9HRVJSKCIqKioqRkFJTEVEIHZpc29yX3NpZ25hbF9pbnNlcnQgZmFpbGVkOyBjYW5ub3Qgd2FpdDsgaW5zZXJ0IGFib3J0ZWRcbiIpOworCQlpZiAob2t0b3dhaXQgIT0gT0tfVE9fV0FJVCkKIAkJCXJldHVybiAwOwkvKiBmYWlsZWQgdG8gcXVldWUgKi8KLQkJfQorCiAJCS8qIHRyeSBhZ2FpbiAqLwotCQlMT0dFUlIoIioqKipGQUlMRUQgdmlzb3Jfc2lnbmFsX2luc2VydCBmYWlsZWQ7IHdhaXRpbmcgdG8gdHJ5IGFnYWluXG4iKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzdGhyZWFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYwppbmRleCAyNWFkZjFhLi5kM2M5NzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYwpAQCAtMjAsMTIgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAidWlzdXRpbHMuaCIKICNpbmNsdWRlICJ1aXN0aHJlYWQuaCIKIAotI2RlZmluZSBLSUxMKGEsIGIsIGMpIGtpbGxfcGlkKGZpbmRfdnBpZChhKSwgYiwgYykKLQogLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdXNpbmcgX19GSUxFX18gKGZ1bGwgcGF0aCBuYW1lKSBpbgogICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcwogICovCkBAIC00MSwxNyArMzgsMTQgQEAKIHVpc3RocmVhZF9zdGFydChzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8sCiAJCWludCAoKnRocmVhZGZuKSh2b2lkICopLCB2b2lkICp0aHJjb250ZXh0LCBjaGFyICpuYW1lKQogewotCXRocmluZm8tPnNob3VsZF9zdG9wID0gMDsKIAkvKiB1c2VkIHRvIHN0b3AgdGhlIHRocmVhZCAqLwogCWluaXRfY29tcGxldGlvbigmdGhyaW5mby0+aGFzX3N0b3BwZWQpOwotCXRocmluZm8tPnRhc2sgPSBrdGhyZWFkX2NyZWF0ZSh0aHJlYWRmbiwgdGhyY29udGV4dCwgbmFtZSwgTlVMTCk7CisJdGhyaW5mby0+dGFzayA9IGt0aHJlYWRfcnVuKHRocmVhZGZuLCB0aHJjb250ZXh0LCBuYW1lKTsKIAlpZiAoSVNfRVJSKHRocmluZm8tPnRhc2spKSB7CiAJCXRocmluZm8tPmlkID0gMDsKIAkJcmV0dXJuIDA7CS8qIGZhaWx1cmUgKi8KIAl9CiAJdGhyaW5mby0+aWQgPSB0aHJpbmZvLT50YXNrLT5waWQ7Ci0Jd2FrZV91cF9wcm9jZXNzKHRocmluZm8tPnRhc2spOwotCUxPR0lORigic3RhcnRlZCB0aHJlYWQgcGlkOiVkXG4iLCB0aHJpbmZvLT5pZCk7CiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXN0aHJlYWRfc3RhcnQpOwpAQCAtNTksMjcgKzUzLDE3IEBACiB2b2lkCiB1aXN0aHJlYWRfc3RvcChzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8pCiB7Ci0JaW50IHJldDsKIAlpbnQgc3RvcHBlZCA9IDA7CiAKIAlpZiAodGhyaW5mby0+aWQgPT0gMCkKIAkJcmV0dXJuOwkJLyogdGhyZWFkIG5vdCBydW5uaW5nICovCiAKLQlMT0dJTkYoInVpc3RocmVhZF9zdG9wIHN0b3BwaW5nIGlkOiVkXG4iLCB0aHJpbmZvLT5pZCk7Ci0JdGhyaW5mby0+c2hvdWxkX3N0b3AgPSAxOwotCXJldCA9IEtJTEwodGhyaW5mby0+aWQsIFNJR0hVUCwgMSk7Ci0JaWYgKHJldCkgewotCQlMT0dFUlIoInVuYWJsZSB0byBzaWduYWwgdGhyZWFkICVkXG4iLCByZXQpOwotCX0gZWxzZSB7Ci0JCS8qIGdpdmUgdXAgaWYgdGhlIHRocmVhZCBoYXMgTk9UIGRpZWQgaW4gMSBtaW51dGUgKi8KLQkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdGhyaW5mby0+aGFzX3N0b3BwZWQsIDYwICogSFopKQotCQkJc3RvcHBlZCA9IDE7Ci0JCWVsc2UKLQkJCUxPR0VSUigidGltZWQgb3V0IHRyeWluZyB0byBzaWduYWwgdGhyZWFkXG4iKTsKLQl9Ci0JaWYgKHN0b3BwZWQpIHsKLQkJTE9HSU5GKCJ1aXN0aHJlYWRfc3RvcCBzdG9wcGVkIGlkOiVkXG4iLCB0aHJpbmZvLT5pZCk7CisJa3RocmVhZF9zdG9wKHRocmluZm8tPnRhc2spOworCS8qIGdpdmUgdXAgaWYgdGhlIHRocmVhZCBoYXMgTk9UIGRpZWQgaW4gMSBtaW51dGUgKi8KKwlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0aHJpbmZvLT5oYXNfc3RvcHBlZCwgNjAgKiBIWikpCisJCXN0b3BwZWQgPSAxOworCisJaWYgKHN0b3BwZWQpCiAJCXRocmluZm8tPmlkID0gMDsKLQl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXN0aHJlYWRfc3RvcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzdXRpbHMuYwppbmRleCAzMTMxOGQyLi4yNmFiNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3V0aWxzLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInVpc3V0aWxzLmgiCiAjaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgInZidXNoZWxwZXIuaCIKQEAgLTUzLDcgKzUyLDYgQEAKIAl2YV9saXN0IGFyZ3M7CiAJaW50IGxlbjsKIAotCURCR0lORigiYnVmZmVyID0gMHglcCA6ICpidWZmZXIgPSAweCVwLlxuIiwgYnVmZmVyLCAqYnVmZmVyKTsKIAl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwogCWxlbiA9IHZzbnByaW50ZigqYnVmZmVyLCAqYnVmZmVyX3JlbWFpbmluZywgZm9ybWF0LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CkBAIC02MSw3ICs1OSw2IEBACiAJCSpidWZmZXIgKz0gKmJ1ZmZlcl9yZW1haW5pbmc7CiAJCSp0b3RhbCArPSAqYnVmZmVyX3JlbWFpbmluZzsKIAkJKmJ1ZmZlcl9yZW1haW5pbmcgPSAwOwotCQlMT0dFUlIoImJ5dGVzIHJlbWFpbmluZyBpcyB0b28gc21hbGwhXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAkqYnVmZmVyX3JlbWFpbmluZyAtPSBsZW47CkBAIC03NSw4ICs3Miw2IEBACiB1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKGludCB0eXBlLCB2b2lkICpmcHRyLAogCQkJICAgICBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvICpjaGlwc2V0X2RyaXZlcl9pbmZvKQogewotCUxPR0lORigidHlwZSA9ICVkLCBmcHRyID0gMHglcC5cbiIsIHR5cGUsIGZwdHIpOwotCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSAyOgogCQlpZiAoZnB0cikgewpAQCAtOTEsNyArODYsNiBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUxPR0VSUigiaW52YWxpZCB0eXBlICVkLlxuIiwgdHlwZSk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoY2hpcHNldF9kcml2ZXJfaW5mbykKQEAgLTEwMiw3MSArOTYsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcik7CiAKLWludAotdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leCh1dWlkX2xlIHN3aXRjaF91dWlkLAotCQkJY29uc3QgY2hhciAqc3dpdGNoX3R5cGVfbmFtZSwKLQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKLQkJCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCi0JCQlpbnQgKCpzZXJ2ZXJfY2hhbm5lbF9vaykodW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzKSwKLQkJCWludCAoKnNlcnZlcl9jaGFubmVsX2luaXQpKHZvaWQgKngsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpjbGllbnRfc3RyLAotCQkJCQkJdTMyIGNsaWVudF9zdHJfbGVuLCB1NjQgYnl0ZXMpLAotCQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqY2hpcHNldF9kcml2ZXJfaW5mbykKLXsKLQlzdHJ1Y3QgcmVxX2hhbmRsZXJfaW5mbyAqcmVxX2hhbmRsZXI7Ci0KLQlMT0dJTkYoInR5cGU9JXBVTCwgY29udHJvbGZ1bmM9MHglcC5cbiIsCi0JICAgICAgICZzd2l0Y2hfdXVpZCwgY29udHJvbGZ1bmMpOwotCWlmICghY29udHJvbGZ1bmMpIHsKLQkJTE9HRVJSKCIlcFVMOiBjb250cm9sZnVuYyBtdXN0IGJlIHN1cHBsaWVkXG4iLCAmc3dpdGNoX3V1aWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFzZXJ2ZXJfY2hhbm5lbF9vaykgewotCQlMT0dFUlIoIiVwVUw6IFNlcnZlcl9DaGFubmVsX09rIG11c3QgYmUgc3VwcGxpZWRcbiIsCi0JCQkJJnN3aXRjaF91dWlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghc2VydmVyX2NoYW5uZWxfaW5pdCkgewotCQlMT0dFUlIoIiVwVUw6IFNlcnZlcl9DaGFubmVsX0luaXQgbXVzdCBiZSBzdXBwbGllZFxuIiwKLQkJCQkmc3dpdGNoX3V1aWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmVxX2hhbmRsZXIgPSByZXFfaGFuZGxlcl9hZGQoc3dpdGNoX3V1aWQsCi0JCQkJICAgICAgc3dpdGNoX3R5cGVfbmFtZSwKLQkJCQkgICAgICBjb250cm9sZnVuYywKLQkJCQkgICAgICBtaW5fY2hhbm5lbF9ieXRlcywKLQkJCQkgICAgICBzZXJ2ZXJfY2hhbm5lbF9vaywgc2VydmVyX2NoYW5uZWxfaW5pdCk7Ci0JaWYgKCFyZXFfaGFuZGxlcikgewotCQlMT0dFUlIoImZhaWxlZCB0byBhZGQgJXBVTCB0byBzZXJ2ZXIgbGlzdFxuIiwgJnN3aXRjaF91dWlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYXRvbWljX2luYygmdWlzdXRpbHNfcmVnaXN0ZXJlZF9zZXJ2aWNlcyk7Ci0JaWYgKGNoaXBzZXRfZHJpdmVyX2luZm8pIHsKLQkJYnVzX2RldmljZV9pbmZvX2luaXQoY2hpcHNldF9kcml2ZXJfaW5mbywgImNoaXBzZXQiLAotCQkJCSAgICAgInVpc2xpYiIsIFZFUlNJT04sIE5VTEwpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlMT0dFUlIoImZhaWxlZCB0byByZWdpc3RlciB0eXBlICVwVUwuXG4iLCAmc3dpdGNoX3V1aWQpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leCk7Ci0KLWludAotdWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KHV1aWRfbGUgc3dpdGNoX3V1aWQpCi17Ci0JTE9HSU5GKCJ0eXBlPSVwVUwuXG4iLCAmc3dpdGNoX3V1aWQpOwotCWlmIChyZXFfaGFuZGxlcl9kZWwoc3dpdGNoX3V1aWQpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byByZW1vdmUgJXBVTCBmcm9tIHNlcnZlciBsaXN0XG4iLAotCQkgICAgICAgJnN3aXRjaF91dWlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWF0b21pY19kZWMoJnVpc3V0aWxzX3JlZ2lzdGVyZWRfc2VydmljZXMpOwotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKLQogLyoKICAqIHVuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAogICoJCQkJCSAgICAgdm9pZCAqc2tiX2luLApAQCAtMTg1LDExNyArMTE0LDExIEBACiAgKgkJCQkJICAgIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgbnVtYmVyIG9mCiAgKgkJCQkJICAgIGVudHJpZXMgZmlsbGVkIGluIGZyYWdzCiAgKi8KLXVuc2lnbmVkIGludAotdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYih1bnNpZ25lZCBjaGFyICpjYWxsaW5nX2N0eCwgdm9pZCAqc2tiX2luLAotCQkJCXVuc2lnbmVkIGludCBmaXJzdGZyYWdsZW4sCi0JCQkJdW5zaWduZWQgaW50IGZyYWdzX21heCwKLQkJCQlzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pCi17Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMCwgaWksIHNpemUsIG9mZnNldCA9IDAsIG51bWZyYWdzOwotCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfaW47Ci0KLQludW1mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Ci0KLQl3aGlsZSAoZmlyc3RmcmFnbGVuKSB7Ci0JCWlmIChjb3VudCA9PSBmcmFnc19tYXgpIHsKLQkJCUxPR0VSUigiJXMgZnJhZ3MgYXJyYXkgdG9vIHNtYWxsOiBtYXg6JWQgY291bnQ6JWRcbiIsCi0JCQkgICAgICAgY2FsbGluZ19jdHgsIGZyYWdzX21heCwgY291bnQpOwotCQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCi0JCX0KLQkJZnJhZ3NbY291bnRdLnBpX3BmbiA9Ci0JCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhICsgb2Zmc2V0KSk7Ci0JCWZyYWdzW2NvdW50XS5waV9vZmYgPQotCQkgICAgKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG9mZnNldCkgJiBQSV9QQUdFX01BU0s7Ci0JCXNpemUgPQotCQkgICAgbWluKGZpcnN0ZnJhZ2xlbiwKLQkJCSh1bnNpZ25lZCBpbnQpKFBJX1BBR0VfU0laRSAtIGZyYWdzW2NvdW50XS5waV9vZmYpKTsKLQkJLyogY2FuIHRha2Ugc21hbGxlc3Qgb2YgZmlyc3RmcmFnbGVuKHdoYXQncyBsZWZ0KSBPUgotCQkqIGJ5dGVzIGxlZnQgaW4gdGhlIHBhZ2UKLQkJKi8KLQkJZnJhZ3NbY291bnRdLnBpX2xlbiA9IHNpemU7Ci0JCWZpcnN0ZnJhZ2xlbiAtPSBzaXplOwotCQlvZmZzZXQgKz0gc2l6ZTsKLQkJY291bnQrKzsKLQl9Ci0JaWYgKCFudW1mcmFncykKLQkJZ290byBkb2xpc3Q7Ci0KLQlpZiAoKGNvdW50ICsgbnVtZnJhZ3MpID4gZnJhZ3NfbWF4KSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgJXMgZnJhZ3MgYXJyYXkgdG9vIHNtYWxsOiBtYXg6JWQgY291bnQrbnJfZnJhZ3M6JWRcbiIsCi0JCSAgICAgICBjYWxsaW5nX2N0eCwgZnJhZ3NfbWF4LCBjb3VudCArIG51bWZyYWdzKTsKLQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCi0JfQotCi0JZm9yIChpaSA9IDA7IGlpIDwgbnVtZnJhZ3M7IGlpKyspIHsKLQkJY291bnQgPSBhZGRfcGh5c2luZm9fZW50cmllcyhwYWdlX3RvX3BmbigKLQkJCQlza2JfZnJhZ19wYWdlKCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2lpXSkpLAotCQkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2lpXS4KLQkJCQkJcGFnZV9vZmZzZXQsCi0JCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldLgotCQkJCQlzaXplLCBjb3VudCwgZnJhZ3NfbWF4LAotCQkJCQlmcmFncyk7Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGFkZCBwaHlzaW5mbyBlbnRyaWVzXG4iKTsKLQkJCXJldHVybiAtMTsJLyogZmFpbHVyZSAqLwotCQl9Ci0JfQotCi1kb2xpc3Q6IGlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiaW5saXN0OwotCQlpbnQgYzsKLQotCQlmb3IgKHNrYmlubGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OyBza2Jpbmxpc3Q7Ci0JCSAgICAgc2tiaW5saXN0ID0gc2tiaW5saXN0LT5uZXh0KSB7Ci0JCQljID0gdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYigicmVjdXJzaXZlIiwKLQkJCQlza2Jpbmxpc3QsCi0JCQkJc2tiaW5saXN0LT5sZW4gLSBza2Jpbmxpc3QtPmRhdGFfbGVuLAotCQkJCWZyYWdzX21heCAtIGNvdW50LAotCQkJCSZmcmFnc1tjb3VudF0pOwotCQkJaWYgKGMgPT0gLTEpIHsKLQkJCQlMT0dFUlIoIioqKiogRkFJTEVEIHJlY3Vyc2l2ZSBjYWxsIGZhaWxlZFxuIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJY291bnQgKz0gYzsKLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKTsKIAogc3RhdGljIExJU1RfSEVBRChyZXFfaGFuZGxlcl9pbmZvX2xpc3QpOyAvKiBsaXN0IG9mIHN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKIAogc3RydWN0IHJlcV9oYW5kbGVyX2luZm8gKgotcmVxX2hhbmRsZXJfYWRkKHV1aWRfbGUgc3dpdGNoX3V1aWQsCi0JICAgICAgY29uc3QgY2hhciAqc3dpdGNoX3R5cGVfbmFtZSwKLQkgICAgICBpbnQgKCpjb250cm9sZnVuYykoc3RydWN0IGlvX21zZ3MgKiksCi0JICAgICAgdW5zaWduZWQgbG9uZyBtaW5fY2hhbm5lbF9ieXRlcywKLQkgICAgICBpbnQgKCpzZXJ2ZXJfY2hhbm5lbF9vaykodW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzKSwKLQkgICAgICBpbnQgKCpzZXJ2ZXJfY2hhbm5lbF9pbml0KQotCSAgICAgICAodm9pZCAqeCwgdW5zaWduZWQgY2hhciAqY2xpZW50c3RyLCB1MzIgY2xpZW50c3RyX2xlbiwKLQkJdTY0IGJ5dGVzKSkKLXsKLQlzdHJ1Y3QgcmVxX2hhbmRsZXJfaW5mbyAqcmMgPSBOVUxMOwotCi0JcmMgPSBremFsbG9jKHNpemVvZigqcmMpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXJjKQotCQlyZXR1cm4gTlVMTDsKLQlyYy0+c3dpdGNoX3V1aWQgPSBzd2l0Y2hfdXVpZDsKLQlyYy0+Y29udHJvbGZ1bmMgPSBjb250cm9sZnVuYzsKLQlyYy0+bWluX2NoYW5uZWxfYnl0ZXMgPSBtaW5fY2hhbm5lbF9ieXRlczsKLQlyYy0+c2VydmVyX2NoYW5uZWxfb2sgPSBzZXJ2ZXJfY2hhbm5lbF9vazsKLQlyYy0+c2VydmVyX2NoYW5uZWxfaW5pdCA9IHNlcnZlcl9jaGFubmVsX2luaXQ7Ci0JaWYgKHN3aXRjaF90eXBlX25hbWUpCi0JCXN0cm5jcHkocmMtPnN3aXRjaF90eXBlX25hbWUsIHN3aXRjaF90eXBlX25hbWUsCi0JCQlzaXplb2YocmMtPnN3aXRjaF90eXBlX25hbWUpIC0gMSk7Ci0Jc3Bpbl9sb2NrKCZyZXFfaGFuZGxlcl9pbmZvX2xpc3RfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmcmMtPmxpc3RfbGluaywgJnJlcV9oYW5kbGVyX2luZm9fbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RydWN0IHJlcV9oYW5kbGVyX2luZm8gKgogcmVxX2hhbmRsZXJfZmluZCh1dWlkX2xlIHN3aXRjaF91dWlkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxlbHQsICp0bXA7CkBAIC0zMTIsMjMgKzEzNSwzIEBACiAJc3Bpbl91bmxvY2soJnJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKIAlyZXR1cm4gTlVMTDsKIH0KLQotaW50Ci1yZXFfaGFuZGxlcl9kZWwodXVpZF9sZSBzd2l0Y2hfdXVpZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsZWx0LCAqdG1wOwotCXN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICplbnRyeSA9IE5VTEw7Ci0JaW50IHJjID0gLTE7Ci0KLQlzcGluX2xvY2soJnJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGVsdCwgdG1wLCAmcmVxX2hhbmRsZXJfaW5mb19saXN0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShsZWx0LCBzdHJ1Y3QgcmVxX2hhbmRsZXJfaW5mbywgbGlzdF9saW5rKTsKLQkJaWYgKHV1aWRfbGVfY21wKGVudHJ5LT5zd2l0Y2hfdXVpZCwgc3dpdGNoX3V1aWQpID09IDApIHsKLQkJCWxpc3RfZGVsKGxlbHQpOwotCQkJa2ZyZWUoZW50cnkpOwotCQkJcmMrKzsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmcmVxX2hhbmRsZXJfaW5mb19saXN0X2xvY2spOwotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKaW5kZXggOWFmOThmYy4uZGZhZGZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKQEAgLTQsNyArNCwxMCBAQAogCiBjb25maWcgVU5JU1lTX1ZJUlRIQkEKIAl0cmlzdGF0ZSAiVW5pc3lzIHZpcnRoYmEgZHJpdmVyIgotCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIFVOSVNZU19VSVNMSUIgJiYgVU5JU1lTX1ZJUlRQQ0kgJiYgU0NTSQorCWRlcGVuZHMgb24gU0NTSQorCXNlbGVjdCBVTklTWVNfVklTT1JDSElQU0VUCisJc2VsZWN0IFVOSVNZU19VSVNMSUIKKwlzZWxlY3QgVU5JU1lTX1ZJUlRQQ0kKIAktLS1oZWxwLS0tCiAJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpcnRoYmEgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUKaW5kZXggYmE1NWFlMS4uYTRlNDAzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9NYWtlZmlsZQpAQCAtNiw3ICs2LDYgQEAKIAogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYgotY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy90aW1za21vZAogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaQogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL3ZpcnRoYmEuYwppbmRleCBlNmVjZWE1Li5kOTAwMWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmMKQEAgLTI2LDE0ICsyNiwxMSBAQAogICogd2hpY2ggc3RhcnQgd2l0aCBhbiA4IGRpZ2l0IHNlcXVlbmNlIG51bWJlciwgYSBjb2xvbiwgYW5kIHRoZW4KICAqIGxldHRlcnMgYWZ0ZXIgdGhhdCAqLwogCi0jdW5kZWYgREJHSU5GCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKICNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKICNpbmNsdWRlICJ1aXN1dGlscy5oIgogI2luY2x1ZGUgInVpc3F1ZXVlLmgiCkBAIC0yNjEsMTEgKzI1OCw5IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdmhiYWluZm8tPnByaXZsb2NrLCBmbGFncyk7CiAJaW5zZXJ0X2xvY2F0aW9uID0gdmhiYWluZm8tPm5leHRpbnNlcnQ7Ci0Jd2hpbGUgKHZoYmFpbmZvLT5wZW5kaW5nW2luc2VydF9sb2NhdGlvbl0uc2VudCAhPSBOVUxMKSB7CisJd2hpbGUgKHZoYmFpbmZvLT5wZW5kaW5nW2luc2VydF9sb2NhdGlvbl0uc2VudCkgewogCQlpbnNlcnRfbG9jYXRpb24gPSAoaW5zZXJ0X2xvY2F0aW9uICsgMSkgJSBNQVhfUEVORElOR19SRVFVRVNUUzsKIAkJaWYgKGluc2VydF9sb2NhdGlvbiA9PSAoaW50KXZoYmFpbmZvLT5uZXh0aW5zZXJ0KSB7Ci0JCQlMT0dFUlIoIlF1ZXVlIHNob3VsZCBiZSBmdWxsLiBpbnNlcnRfbG9jYXRpb248PCVkPj4gIFVuYWJsZSB0byBmaW5kIG9wZW4gc2xvdCBmb3IgcGVuZGluZyBjb21tYW5kcy5cbiIsCi0JCQkgICAgIGluc2VydF9sb2NhdGlvbik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMjg2LDcgKzI4MSw2IEBACiAJaW50IGluc2VydF9sb2NhdGlvbiA9IGFkZF9zY3NpcGVuZGluZ19lbnRyeSh2aGJhaW5mbywgY21kdHlwZSwgbmV3KTsKIAogCXdoaWxlIChpbnNlcnRfbG9jYXRpb24gPT0gLTEpIHsKLQkJTE9HRVJSKCJGYWlsZWQgdG8gZmluZCBlbXB0eSBxdWV1ZSBzbG90LiAgV2FpdGluZyB0byB0cnkgYWdhaW5cbiIpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKIAkJaW5zZXJ0X2xvY2F0aW9uID0gYWRkX3Njc2lwZW5kaW5nX2VudHJ5KHZoYmFpbmZvLCBjbWR0eXBlLCBuZXcpOwpAQCAtMzAxLDE2ICsyOTUsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqc2VudCA9IE5VTEw7CiAKLQlpZiAoZGVsID49IE1BWF9QRU5ESU5HX1JFUVVFU1RTKSB7Ci0JCUxPR0VSUigiSW52YWxpZCBxdWV1ZSBwb3NpdGlvbiA8PCVsdT4+IGdpdmVuIHRvIGRlbGV0ZS4gTUFYX1BFTkRJTkdfUkVRVUVTVFMgPDwlZD4+XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nKWRlbCwgTUFYX1BFTkRJTkdfUkVRVUVTVFMpOwotCX0gZWxzZSB7CisJaWYgKGRlbCA8IE1BWF9QRU5ESU5HX1JFUVVFU1RTKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKLQotCQlpZiAodmhiYWluZm8tPnBlbmRpbmdbZGVsXS5zZW50ID09IE5VTEwpCi0JCQlMT0dFUlIoIkRlbGV0aW5nIGFscmVhZHkgY2xlYXJlZCBxdWV1ZSBlbnRyeSBhdCA8PCVsdT4+LlxuIiwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpZGVsKTsKLQogCQlzZW50ID0gdmhiYWluZm8tPnBlbmRpbmdbZGVsXS5zZW50OwogCiAJCXZoYmFpbmZvLT5wZW5kaW5nW2RlbF0uY21kdHlwZSA9IDA7CkBAIC0zNTcsMTMgKzM0Myw3IEBACiAJCWVycm9yID0KIAkJICAgIHNjc2lfYWRkX2RldmljZShkYXItPnNob3N0LCBkYXItPmNoYW5uZWwsIGRhci0+aWQsCiAJCQkJICAgIGRhci0+bHVuKTsKLQkJaWYgKGVycm9yKQotCQkJTE9HRVJSKCJGYWlsZWQgc2NzaV9hZGRfZGV2aWNlOiBob3N0X25vPSVkW2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKLQkJCSAgICAgZGFyLT5zaG9zdC0+aG9zdF9ubywgZGFyLT5jaGFubmVsLCBkYXItPmlkLAotCQkJICAgICBkYXItPmx1bik7Ci0JfSBlbHNlCi0JCUxPR0VSUigiRmFpbGVkIHNjc2lfZGV2aWNlX2xvb2t1cDpbY2hhbj0lZDppZD0lZDpsdW49JWRdXG4iLAotCQkgICAgICAgZGFyLT5jaGFubmVsLCBkYXItPmlkLCBkYXItPmx1bik7CisJfQogCWtmcmVlKGRhcik7CiB9CiAKQEAgLTQwOCwxMCArMzg4LDYgQEAKIAkJZGFyLT5pZCA9IGNtZHJzcC0+ZGlza25vdGlmeS5pZDsKIAkJZGFyLT5sdW4gPSBjbWRyc3AtPmRpc2tub3RpZnkubHVuOwogCQlRVUVVRV9ESVNLQUREUkVNT1ZFKGRhcik7Ci0JfSBlbHNlIHsKLQkJTE9HRVJSKCJrbWFsbG9jIGZhaWxlZCBmb3IgZGFyLiBob3N0X25vPSVkW2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKLQkJICAgICBzaG9zdC0+aG9zdF9ubywgY21kcnNwLT5kaXNrbm90aWZ5LmNoYW5uZWwsCi0JCSAgICAgY21kcnNwLT5kaXNrbm90aWZ5LmlkLCBjbWRyc3AtPmRpc2tub3RpZnkubHVuKTsKIAl9CiB9CiAKQEAgLTQyNyw3ICs0MDMsNyBAQAogCXU2NCBtYXNrOwogCXVuc2lnbmVkIGxvbmcgbG9uZyByYzE7CiAKLQlpZiAodmlydGhiYWluZm8gPT0gTlVMTCkKKwlpZiAoIXZpcnRoYmFpbmZvKQogCQlyZXR1cm4gSVJRX05PTkU7CiAJdmlydGhiYWluZm8tPmludGVycnVwdHNfcmN2ZCsrOwogCWNoYW5uZWxfaGVhZGVyID0gdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW47CkBAIC00NjcsMTMgKzQ0Myw2IEBACiAJc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgX19pb21lbSAqcHFoZHI7CiAJdTY0IG1hc2s7CiAKLQlMT0dWRVIoImVudGVyaW5nIHZpcnRoYmFfcHJvYmUuLi5cbiIpOwotCUxPR1ZFUigidmlydHBjaWRldiBidXNfbm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c19ubywKLQkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlX25vKTsKLQotCUxPR0lORigiZW50ZXJpbmcgdmlydGhiYV9wcm9iZS4uLlxuIik7Ci0JTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c19ubzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzX25vLAotCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2Vfbm8pOwogCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9QUk9CRV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJLyogY2FsbCBzY3NpX2hvc3RfYWxsb2MgdG8gcmVnaXN0ZXIgYSBzY3NpIGhvc3QgYWRhcHRlcgogCSAqIGluc3RhbmNlIC0gdGhpcyB2aXJ0aGJhIHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkIGlzIGFuCkBAIC00ODIsNyArNDUxLDYgQEAKIAkgKiBpbml0aWFsaXphdGlvbi4gIFRoZSBob3N0IGlzIG5vdCBwdWJsaXNoZWQgdG8gdGhlIHNjc2kKIAkgKiBtaWRsYXllciB1bnRpbCBzY3NpX2FkZF9ob3N0IGlzIGNhbGxlZC4KIAkgKi8KLQlEQkdJTkYoImNhbGxpbmcgc2NzaV9ob3N0X2FsbG9jLlxuIik7CiAKIAkvKiBhcmcgMiBwYXNzZWQgaW4gbGVuZ3RoIG9mIGV4dHJhIHNwYWNlIHdlIHdhbnQgYWxsb2NhdGVkCiAJICogd2l0aCBzY3NpX2hvc3Qgc3RydWN0IGZvciBvdXIgb3duIHVzZSBzY3NpX2hvc3RfYWxsb2MKQEAgLTQ5MCwxMiArNDU4LDkgQEAKIAkgKi8KIAlzY3NpaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdmlydGhiYV9kcml2ZXJfdGVtcGxhdGUsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCB2aXJ0aGJhX2luZm8pKTsKLQlpZiAoc2NzaWhvc3QgPT0gTlVMTCkKKwlpZiAoIXNjc2lob3N0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCURCR0lORigic2NzaWhvc3Q6IDB4JXAsIHNjc2lob3N0LT50aGlzX2lkOiAlZCwgaG9zdF9ubzogJWQuXG4iLAotCSAgICAgICBzY3NpaG9zdCwgc2NzaWhvc3QtPnRoaXNfaWQsIHNjc2lob3N0LT5ob3N0X25vKTsKLQogCXNjc2lob3N0LT50aGlzX2lkID0gVUlTX01BR0lDX1ZIQkE7CiAJLyogbGludXggdHJlYXRzIG1heC1jaGFubmVsIGRpZmZlcmVudGx5IHRoYW4gbWF4LWlkICYgbWF4LWx1bi4KIAkgKiBJbiB0aGUgbGF0dGVyIGNhc2VzLCB0aG9zZSB0d28gdmFsdWVzIHJlc3VsdCBpbiAwIHRvIG1heC0xCkBAIC01MDMsMTIgKzQ2OCw2IEBACiAJICogc2NhbiBpcyAwIHRvIG1heCAoaW5jbHVzaXZlKTsgc28gd2Ugd2lsbCBzdWJ0cmFjdCBvbmUgZnJvbQogCSAqIHRoZSBtYXgtY2hhbm5lbCB2YWx1ZS4KIAkgKi8KLQlMT0dJTkYoInZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9jaGFubmVsPSV1LCBtYXhfaWQ9JXUsIG1heF9sdW49JXUsIGNtZF9wZXJfbHVuPSV1LCBtYXhfaW9fc2l6ZT0ldVxuIiwKLQkgICAgICh1bnNpZ25lZCl2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbCAtIDEsCi0JICAgICAodW5zaWduZWQpdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2lkLAotCSAgICAgKHVuc2lnbmVkKXZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9sdW4sCi0JICAgICAodW5zaWduZWQpdmlydHBjaWRldi0+c2NzaS5tYXguY21kX3Blcl9sdW4sCi0JICAgICAodW5zaWduZWQpdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2lvX3NpemUpOwogCXNjc2lob3N0LT5tYXhfY2hhbm5lbCA9ICh1bnNpZ25lZCl2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbDsKIAlzY3NpaG9zdC0+bWF4X2lkID0gKHVuc2lnbmVkKXZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pZDsKIAlzY3NpaG9zdC0+bWF4X2x1biA9ICh1bnNpZ25lZCl2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfbHVuOwpAQCAtNTE5LDE1ICs0NzgsNiBAQAogCSAgICAodW5zaWduZWQgc2hvcnQpKHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pb19zaXplIC8gUEFHRV9TSVpFKTsKIAlpZiAoc2NzaWhvc3QtPnNnX3RhYmxlc2l6ZSA+IE1BWF9QSFlTX0lORk8pCiAJCXNjc2lob3N0LT5zZ190YWJsZXNpemUgPSBNQVhfUEhZU19JTkZPOwotCUxPR0lORigic2NzaWhvc3QtPm1heF9jaGFubmVsPSV1LCBtYXhfaWQ9JXUsIG1heF9sdW49JWxsdSwgY21kX3Blcl9sdW49JXUsIG1heF9zZWN0b3JzPSVodSwgc2dfdGFibGVzaXplPSVodVxuIiwKLQkgICAgIHNjc2lob3N0LT5tYXhfY2hhbm5lbCwgc2NzaWhvc3QtPm1heF9pZCwgc2NzaWhvc3QtPm1heF9sdW4sCi0JICAgICBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKLQkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOwotCUxPR0lORigic2NzaWhvc3QtPmNhbl9xdWV1ZT0ldSwgc2NzaWhvc3QtPmNtZF9wZXJfbHVuPSV1LCBtYXhfc2VjdG9ycz0laHUsIHNnX3RhYmxlc2l6ZT0laHVcbiIsCi0JICAgICBzY3NpaG9zdC0+Y2FuX3F1ZXVlLCBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKLQkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOwotCi0JREJHSU5GKCJjYWxsaW5nIHNjc2lfYWRkX2hvc3RcbiIpOwogCiAJLyogdGhpcyBjcmVhdGVzICJob3N0JWQiIGluIHN5c2ZzLiAgSWYgMm5kIGFyZ3VtZW50IGlzIE5VTEwsCiAJICogdGhlbiB0aGlzIGdlbmVyaWMgL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2hvc3Q/ICBkZXZpY2UgaXMKQEAgLTUzOCw3ICs0ODgsNiBAQAogCSAqLwogCWVycm9yID0gc2NzaV9hZGRfaG9zdChzY3NpaG9zdCwgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJTE9HRVJSKCJzY3NpX2FkZF9ob3N0ICoqKipGQUlMRUQgMHgleCAgVEJEIC0gUkVDT1ZFUlxuIiwgZXJyb3IpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJLyogZGVjciByZWZjb3VudCBvbiBzY3NpaG9zdCB3aGljaCB3YXMgaW5jcmVtZW50ZWQgYnkKIAkJICogc2NzaV9hZGRfaG9zdCBzbyB0aGUgc2NzaV9ob3N0IGdldHMgZGVsZXRlZApAQCAtNTUwLDcgKzQ5OSw3IEBACiAJdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKXNjc2lob3N0LT5ob3N0ZGF0YTsKIAltZW1zZXQodmlydGhiYWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdmlydGhiYV9pbmZvKSk7CiAJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7Ci0JCWlmICh2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvID09IE5VTEwpIHsKKwkJaWYgKCF2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvKSB7CiAJCQl2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvID0gdmlydGhiYWluZm87CiAJCQlicmVhazsKIAkJfQpAQCAtNTYwLDkgKzUwOSw2IEBACiAJdmlydGhiYWluZm8tPnZpcnRwY2lkZXYgPSB2aXJ0cGNpZGV2OwogCXNwaW5fbG9ja19pbml0KCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLmluc2VydGxvY2spOwogCi0JREJHSU5GKCJnZW5lcmljX2RldjogMHglcCwgcXVldWVpbmZvOiAweCVwLlxuIiwKLQkgICAgICAgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LCAmdmlydHBjaWRldi0+cXVldWVpbmZvKTsKLQogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZpcnRoYmFpbmZvLT5yc3BfcXVldWUpOwogCXNwaW5fbG9ja19pbml0KCZ2aXJ0aGJhaW5mby0+cHJpdmxvY2spOwogCW1lbXNldCgmdmlydGhiYWluZm8tPnBlbmRpbmcsIDAsIHNpemVvZih2aXJ0aGJhaW5mby0+cGVuZGluZykpOwpAQCAtNTg0LDggKzUzMCw2IEBACiAJICAgICAgIFVMVFJBX0lPX0NIQU5ORUxfSVNfUE9MTElORywKIAkgICAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLT5mZWF0dXJlcyk7CiAJLyogc3RhcnQgdGhyZWFkIHRoYXQgd2lsbCByZWNlaXZlIHNjc2ljbW5kIHJlc3BvbnNlcyAqLwotCURCR0lORigic3RhcnRpbmcgcnNwIHRocmVhZCAtLSBxdWV1ZWluZm86IDB4JXAsIHRocmVhZGluZm86IDB4JXAuXG4iLAotCSAgICAgICB2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mbywgJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbyk7CiAKIAljaGFubmVsX2hlYWRlciA9IHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuOwogCXBxaGRyID0gKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIF9faW9tZW0gKikKQEAgLTU5Niw3ICs1NDAsNiBAQAogCWlmICghdWlzdGhyZWFkX3N0YXJ0KCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8sCiAJCQkgICAgIHByb2Nlc3NfaW5jb21pbmdfcnNwcywKIAkJCSAgICAgdmlydGhiYWluZm8sICJ2aGJhX2luY29taW5nIikpIHsKLQkJTE9HRVJSKCJ1aXN0aHJlYWRfc3RhcnQgcnNwICoqKipGQUlMRURcbiIpOwogCQkvKiBkZWNyIHJlZmNvdW50IG9uIHNjc2lob3N0IHdoaWNoIHdhcyBpbmNyZW1lbnRlZCBieQogCQkgKiBzY3NpX2FkZF9ob3N0IHNvIHRoZSBzY3NpX2hvc3QgZ2V0cyBkZWxldGVkCiAJCSAqLwpAQCAtNjA0LDQyICs1NDcsMjYgQEAKIAkJc2NzaV9ob3N0X3B1dChzY3NpaG9zdCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlMT0dJTkYoInNlbmRJbnRlcnJ1cHRIYW5kbGU9MHglMTZsbFgiLAotCSAgICAgICB2aXJ0aGJhaW5mby0+aW50ci5zZW5kX2lycV9oYW5kbGUpOwotCUxPR0lORigicmVjdkludGVycnVwdEhhbmRsZT0weCUxNmxsWCIsCi0JICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZfaXJxX2hhbmRsZSk7Ci0JTE9HSU5GKCJyZWN2SW50ZXJydXB0VmVjdG9yPTB4JThYIiwKLQkgICAgICAgdmlydGhiYWluZm8tPmludHIucmVjdl9pcnFfdmVjdG9yKTsKLQlMT0dJTkYoInJlY3ZJbnRlcnJ1cHRTaGFyZWQ9MHglMlgiLAotCSAgICAgICB2aXJ0aGJhaW5mby0+aW50ci5yZWN2X2lycV9zaGFyZWQpOwotCUxPR0lORigic2NzaWhvc3QuaG9zdHQtPm5hbWU9JXMiLCBzY3NpaG9zdC0+aG9zdHQtPm5hbWUpOwogCXZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yID0KIAkgICAgdmlydGhiYWluZm8tPmludHIucmVjdl9pcnFfaGFuZGxlICYgSU5URVJSVVBUX1ZFQ1RPUl9NQVNLOwogCXJzcCA9IHJlcXVlc3RfaXJxKHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yLCBoYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCSAgc2NzaWhvc3QtPmhvc3R0LT5uYW1lLCB2aXJ0aGJhaW5mbyk7CiAJaWYgKHJzcCAhPSAwKSB7Ci0JCUxPR0VSUigicmVxdWVzdF9pcnEoJWQpIHVpc2xpYl92aXJ0aGJhX0lTUiByZXF1ZXN0IGZhaWxlZCB3aXRoIHJzcD0lZFxuIiwKLQkJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yLCByc3ApOwogCQl2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciA9IC0xOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAl9IGVsc2UgewotCQl1NjQgX19pb21lbSAqRmVhdHVyZXNfYWRkciA9CisJCXU2NCBfX2lvbWVtICpmZWF0dXJlc19hZGRyID0KIAkJICAgICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbi0+ZmVhdHVyZXM7Ci0JCUxPR0VSUigicmVxdWVzdF9pcnEoJWQpIHVpc2xpYl92aXJ0aGJhX0lTUiByZXF1ZXN0IHN1Y2NlZWRlZFxuIiwKLQkJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yKTsKIAkJbWFzayA9IH4oVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HIHwKIAkJCSBVTFRSQV9JT19EUklWRVJfRElTQUJMRVNfSU5UUyk7Ci0JCXVpc3F1ZXVlX2ludGVybG9ja2VkX2FuZChGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJdWlzcXVldWVfaW50ZXJsb2NrZWRfYW5kKGZlYXR1cmVzX2FkZHIsIG1hc2spOwogCQltYXNrID0gVUxUUkFfSU9fRFJJVkVSX0VOQUJMRVNfSU5UUzsKLQkJdWlzcXVldWVfaW50ZXJsb2NrZWRfb3IoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCXVpc3F1ZXVlX2ludGVybG9ja2VkX29yKGZlYXR1cmVzX2FkZHIsIG1hc2spOwogCQlyc2x0cV93YWl0X3VzZWNzID0gNDAwMDAwMDsKIAl9CiAKLQlEQkdJTkYoImNhbGxpbmcgc2NzaV9zY2FuX2hvc3QuXG4iKTsKIAlzY3NpX3NjYW5faG9zdChzY3NpaG9zdCk7Ci0JREJHSU5GKCJyZXR1cm4gZnJvbSBzY3NpX3NjYW5faG9zdC5cbiIpOwogCi0JTE9HSU5GKCJ2aXJ0aGJhIGFkZGVkIHNjc2lob3N0OjB4JXBcbiIsIHNjc2lob3N0KTsKIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJcmV0dXJuIDA7CiB9CkBAIC02NTEsMjggKzU3OCwxOCBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0ID0KIAkgICAgKHN0cnVjdCBTY3NpX0hvc3QgKil2aXJ0cGNpZGV2LT5zY3NpLnNjc2lob3N0OwogCi0JTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c19ubzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzX25vLAotCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2Vfbm8pOwogCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKilzY3NpaG9zdC0+aG9zdGRhdGE7CiAJaWYgKHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yICE9IC0xKQogCQlmcmVlX2lycSh2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciwgdmlydGhiYWluZm8pOwotCUxPR0lORigiUmVtb3ZpbmcgdmlydHBjaWRldjogMHglcCwgdmlydGhiYWluZm86IDB4JXBcbiIsIHZpcnRwY2lkZXYsCi0JICAgICAgIHZpcnRoYmFpbmZvKTsKIAotCURCR0lORigicmVtb3Zpbmcgc2NzaWhvc3Q6IDB4JXAsIHNjc2lob3N0LT50aGlzX2lkOiAlZFxuIiwgc2NzaWhvc3QsCi0JICAgICAgIHNjc2lob3N0LT50aGlzX2lkKTsKIAlzY3NpX3JlbW92ZV9ob3N0KHNjc2lob3N0KTsKIAotCURCR0lORigic3RvcHBpbmcgdGhyZWFkLlxuIik7CiAJdWlzdGhyZWFkX3N0b3AoJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbyk7CiAKLQlEQkdJTkYoImNhbGxpbmcgc2NzaV9ob3N0X3B1dFxuIik7Ci0KIAkvKiBkZWNyIHJlZmNvdW50IG9uIHNjc2lob3N0IHdoaWNoIHdhcyBpbmNyZW1lbnRlZCBieQogCSAqIHNjc2lfYWRkX2hvc3Qgc28gdGhlIHNjc2lfaG9zdCBnZXRzIGRlbGV0ZWQKIAkgKi8KIAlzY3NpX2hvc3RfcHV0KHNjc2lob3N0KTsKLQlMT0dJTkYoInZpcnRoYmEgcmVtb3ZlZCBzY3NpX2hvc3QuXG4iKTsKIH0KIAogc3RhdGljIGludApAQCAtNjg2LDE5ICs2MDMsMTIgQEAKIAlpbnQgbm90aWZ5cmVzdWx0ID0gMHhmZmZmOwogCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmeWV2ZW50OwogCi0JTE9HSU5GKCJ2RGlza01nbXQ6JWQgJWQ6JWQ6JWRcbiIsIHZkaXNrY21kdHlwZSwKLQkgICAgICAgdmRlc3QtPmNoYW5uZWwsIHZkZXN0LT5pZCwgdmRlc3QtPmx1bik7Ci0KLQlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKLQkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIEZhaWx1cmUuXG4iKTsKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiBGQUlMRUQ7Ci0JfQogCiAJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKLQlpZiAoY21kcnNwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIEZBSUxFRDsJLyogcmVqZWN0ICovCi0JfQorCWlmICghY21kcnNwKQorCQlyZXR1cm4gRkFJTEVEOyAgLyogcmVqZWN0ICovCiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZub3RpZnlldmVudCk7CiAKQEAgLTcyNywxMCArNjM3LDcgQEAKIAkJCQkJICAgICAmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrLAogCQkJCQkgICAgIERPTlRfSVNTVUVfSU5URVJSVVBULCAodTY0KU5VTEwsCiAJCQkJCSAgICAgT0tfVE9fV0FJVCwgInZoYmEiKTsKLQlMT0dJTkYoIlZkaXNrTWdtdCB3YWl0aW5nIG9uIGV2ZW50IG5vdGlmeWV2ZW50PTB4JXBcbiIsCi0JICAgICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CiAJd2FpdF9ldmVudChub3RpZnlldmVudCwgbm90aWZ5cmVzdWx0ICE9IDB4ZmZmZik7Ci0JTE9HSU5GKCJWZGlza01nbXQgY29tcGxldGU7IHJlc3VsdDolZFxuIiwgY21kcnNwLT52ZGlza21nbXQucmVzdWx0KTsKIAlrZnJlZShjbWRyc3ApOwogCXJldHVybiBTVUNDRVNTOwogfQpAQCAtNzQ5LDE5ICs2NTYsMTIgQEAKIAlpbnQgbm90aWZ5cmVzdWx0ID0gMHhmZmZmOwogCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmeWV2ZW50OwogCi0JTE9HSU5GKCJUYXNrTWdtdDolZCAlZDolZDolbGx1XG4iLCB0YXNrdHlwZSwKLQkgICAgICAgc2NzaWRldi0+Y2hhbm5lbCwgc2NzaWRldi0+aWQsIHNjc2lkZXYtPmx1bik7Ci0KLQlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKLQkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIEZhaWx1cmUuXG4iKTsKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiBGQUlMRUQ7Ci0JfQogCiAJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKLQlpZiAoY21kcnNwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKKwlpZiAoIWNtZHJzcCkKIAkJcmV0dXJuIEZBSUxFRDsJLyogcmVqZWN0ICovCi0JfQogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbm90aWZ5ZXZlbnQpOwogCkBAIC03ODksMTAgKzY4OSw3IEBACiAJCQkJCSAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywKIAkJCQkJICAgICBET05UX0lTU1VFX0lOVEVSUlVQVCwgKHU2NClOVUxMLAogCQkJCQkgICAgIE9LX1RPX1dBSVQsICJ2aGJhIik7Ci0JTE9HSU5GKCJUYXNrTWdtdCB3YWl0aW5nIG9uIGV2ZW50IG5vdGlmeWV2ZW50PTB4JXBcbiIsCi0JICAgICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CiAJd2FpdF9ldmVudChub3RpZnlldmVudCwgbm90aWZ5cmVzdWx0ICE9IDB4ZmZmZik7Ci0JTE9HSU5GKCJUYXNrTWdtdCBjb21wbGV0ZTsgcmVzdWx0OiVkXG4iLCBjbWRyc3AtPnNjc2l0YXNrbWdtdC5yZXN1bHQpOwogCWtmcmVlKGNtZHJzcCk7CiAJcmV0dXJuIFNVQ0NFU1M7CiB9CkBAIC04ODIsNyArNzc5LDYgQEAKIHZpcnRoYmFfaG9zdF9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpCiB7CiAJLyogaXNzdWUgVEFTS19NR01UX1RBUkdFVF9SRVNFVCBmb3IgZWFjaCB0YXJnZXQgb24gZWFjaCBidXMgZm9yIGhvc3QgKi8KLQlMT0dFUlIoInZpcnRoYmFfaG9zdF9yZXNldF9oYW5kbGVyIE5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOwogCXJldHVybiBTVUNDRVNTOwogfQogCkBAIC04OTksNyArNzk1LDYgQEAKIHN0YXRpYyBpbnQKIHZpcnRoYmFfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7Ci0JREJHSU5GKCJJbiB2aXJ0aGJhX2lvY3RsOiBpb2N0bDogY21kPTB4JXhcbiIsIGNtZCk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTkyMywxNiArODE4LDExIEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSBOVUxMOwogCWludCBzZ19mYWlsZWQgPSAwOwogCi0JaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duIHx8IHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7Ci0JCURCR0lORigiU2VydmVyIGlzIGRvd24vY2hhbmdpbmcgc3RhdGUuIFJldHVybmluZyBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kuXG4iKTsKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7Ci0JfQotCiAJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKLQlpZiAoY21kcnNwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKKwlpZiAoIWNtZHJzcCkKIAkJcmV0dXJuIDE7CS8qIHJlamVjdCB0aGUgY29tbWFuZCAqLwotCX0KIAogCS8qIG5vdyBzYXZpbmcgZXZlcnl0aGluZyB3ZSBuZWVkIGZyb20gc2NzaV9jbWQgaW50byBjbWRyc3AKIAkgKiBiZWZvcmUgd2UgcXVldWUgY21kcnNwIHNldCB0eXBlIHRvIGNvbW1hbmQgLSBhcyBvcHBvc2VkIHRvCkBAIC05NDcsNyArODM3LDYgQEAKIAlpZiAoaW5zZXJ0X2xvY2F0aW9uICE9IC0xKSB7CiAJCWNtZHJzcC0+c2NzaS5zY3NpY21kID0gKHZvaWQgKikodWludHB0cl90KWluc2VydF9sb2NhdGlvbjsKIAl9IGVsc2UgewotCQlMT0dFUlIoIlF1ZXVlIGlzIGZ1bGwuIFJldHVybmluZyBidXN5LlxuIik7CiAJCWtmcmVlKGNtZHJzcCk7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiAJfQpAQCAtOTY4LDggKzg1Nyw2IEBACiAJCW1heF9idWZmX2xlbiA9IGNtZHJzcC0+c2NzaS5idWZmbGVuOwogCiAJaWYgKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPiBNQVhfUEhZU19JTkZPKSB7Ci0JCUxPR0VSUigic2NzaWNtZCB1c2Vfc2c6JWQgZ3JlYXRlciB0aGFuIE1BWDolZFxuIiwKLQkJICAgICAgIHNjc2lfc2dfY291bnQoc2NzaWNtZCksIE1BWF9QSFlTX0lORk8pOwogCQlkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sICh1aW50cHRyX3QpaW5zZXJ0X2xvY2F0aW9uKTsKIAkJa2ZyZWUoY21kcnNwKTsKIAkJcmV0dXJuIDE7CS8qIHJlamVjdCB0aGUgY29tbWFuZCAqLwpAQCAtOTgyLDExICs4NjksOCBAQAogCS8qIGNvbnZlcnQgYnVmZmVyIHRvIHBoeXMgaW5mb3JtYXRpb24gKi8KIAlpZiAoc2NzaV9zZ19jb3VudChzY3NpY21kKSA9PSAwKSB7CiAJCWlmIChzY3NpX2J1ZmZsZW4oc2NzaWNtZCkgPiAwKSB7Ci0JCQlMT0dFUlIoIioqKiogRkFJTEVEIE5vIHNjYXR0ZXIgbGlzdCBmb3IgYnVmZmxlbiA+IDBcbiIpOwogCQkJQlVHX09OKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0gMCk7CiAJCX0KLQkJREJHSU5GKCJObyBzZzsgYnVmZmVyOjB4JXAgYnVmZmxlbjolZFxuIiwKLQkJICAgICAgIHNjc2lfc2dsaXN0KHNjc2ljbWQpLCBzY3NpX2J1ZmZsZW4oc2NzaWNtZCkpOwogCX0gZWxzZSB7CiAJCS8qIGJ1ZmZlciBpcyBzY2F0dGVybGlzdCAtIGNvcHkgaXQgb3V0ICovCiAJCXNnbCA9IHNjc2lfc2dsaXN0KHNjc2ljbWQpOwpAQCAtOTk0LDIxICs4NzgsOSBAQAogCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzY3NpX3NnX2NvdW50KHNjc2ljbWQpLCBpKSB7CiAJCQljbWRyc3AtPnNjc2kuZ3BpX2xpc3RbaV0uYWRkcmVzcyA9IHNnX3BoeXMoc2cpOwogCQkJY21kcnNwLT5zY3NpLmdwaV9saXN0W2ldLmxlbmd0aCA9IHNnLT5sZW5ndGg7Ci0JCQlpZiAoKGkgIT0gMCkgJiYgKHNnLT5vZmZzZXQgIT0gMCkpCi0JCQkJTE9HSU5GKCJPZmZzZXQgb24gYSBzZ19lbnRyeSBvdGhlciB0aGFuIHplcm8gPTw8JWQ+Pi5cbiIsCi0JCQkJICAgICAgIHNnLT5vZmZzZXQpOwogCQl9CiAKIAkJaWYgKHNnX2ZhaWxlZCkgewotCQkJTE9HRVJSKCJTdGFydCBzZ19saXN0IGR1bXAgKGVudHJpZXMgJWQsIGJ1ZmZsZW4gJWQpLi4uXG4iLAotCQkJICAgICAgIHNjc2lfc2dfY291bnQoc2NzaWNtZCksIGNtZHJzcC0+c2NzaS5idWZmbGVuKTsKLQkJCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNjc2lfc2dfY291bnQoc2NzaWNtZCksIGkpIHsKLQkJCQlMT0dFUlIoIiAgIEVudHJ5KCVkKTogcGFnZS0+WzB4JXBdLCBwaHlzLT5bMHglTHhdLCBvZmYoJWQpLCBsZW4oJWQpXG4iLAotCQkJCSAgICAgICBpLCBzZ19wYWdlKHNnKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZ19waHlzKHNnKSwKLQkJCQkgICAgICAgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCk7Ci0JCQl9Ci0JCQlMT0dFUlIoIkRvbmUgc2dfbGlzdCBkdW1wLlxuIik7CiAJCQkvKiBCVUcoKTsgKioqKiogRm9yIG5vdywgbGV0IGl0IGZhaWwgaW4gdWlzc2QKIAkJCSAqIGlmIGl0IGlzIGEgcHJvYmxlbSwgYXMgaXQgbWlnaHQganVzdAogCQkJICogd29yawpAQCAtMTAyNyw3ICs4OTksNiBAQAogCQkJCQkJICh1NjQpTlVMTCwgRE9OVF9XQUlULCAidmhiYSIpOwogCWlmIChpID09IDApIHsKIAkJLyogcXVldWUgbXVzdCBiZSBmdWxsIC0gYW5kIHdlIHNhaWQgZG9uJ3Qgd2FpdCAtIHJldHVybiBidXN5ICovCi0JCUxPR0VSUigidWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2sgKioqKkZBSUxFRFxuIik7CiAJCWtmcmVlKGNtZHJzcCk7CiAJCWRlbF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywgKHVpbnRwdHJfdClpbnNlcnRfbG9jYXRpb24pOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwpAQCAtMTA1MiwxMCArOTIzLDkgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopc2NzaWRldi0+aG9zdDsKIAogCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKilzY3NpaG9zdC0+aG9zdGRhdGE7Ci0JaWYgKCF2aXJ0aGJhaW5mbykgewotCQlMT0dFUlIoIkNvdWxkIG5vdCBmaW5kIHZpcnRoYmFfaW5mbyBmb3Igc2NzaWhvc3RcbiIpOworCWlmICghdmlydGhiYWluZm8pCiAJCXJldHVybiAwOwkvKiBldmVuIHRob3VnaCB3ZSBlcnJvcmVkLCB0cmVhdCBhcyBzdWNjZXNzICovCi0JfQorCiAJZm9yICh2ZGlzayA9ICZ2aXJ0aGJhaW5mby0+aGVhZDsgdmRpc2stPm5leHQ7IHZkaXNrID0gdmRpc2stPm5leHQpIHsKIAkJaWYgKHZkaXNrLT5uZXh0LT52YWxpZCAmJgogCQkgICAgKHZkaXNrLT5uZXh0LT5jaGFubmVsID09IHNjc2lkZXYtPmNoYW5uZWwpICYmCkBAIC0xMDY0LDEwICs5MzQsOCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCXRtcHZkaXNrID0ga3phbGxvYyhzaXplb2YoKnRtcHZkaXNrKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0bXB2ZGlzaykgewkvKiBlcnJvciBhbGxvY2F0aW5nICovCi0JCUxPR0VSUigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGlza1xuIik7CisJaWYgKCF0bXB2ZGlzaykKIAkJcmV0dXJuIDA7Ci0JfQogCiAJdG1wdmRpc2stPmNoYW5uZWwgPSBzY3NpZGV2LT5jaGFubmVsOwogCXRtcHZkaXNrLT5pZCA9IHNjc2lkZXYtPmlkOwpAQCAtMTA5NCw4ICs5NjIsNiBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0ID0gKHN0cnVjdCBTY3NpX0hvc3QgKilzY3NpZGV2LT5ob3N0OwogCiAJdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKXNjc2lob3N0LT5ob3N0ZGF0YTsKLQlpZiAoIXZpcnRoYmFpbmZvKQotCQlMT0dFUlIoIkNvdWxkIG5vdCBmaW5kIHZpcnRoYmFfaW5mbyBmb3Igc2NzaWhvc3RcbiIpOwogCWZvciAodmRpc2sgPSAmdmlydGhiYWluZm8tPmhlYWQ7IHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CiAJCWlmICh2ZGlzay0+bmV4dC0+dmFsaWQgJiYKIAkJICAgICh2ZGlzay0+bmV4dC0+Y2hhbm5lbCA9PSBzY3NpZGV2LT5jaGFubmVsKSAmJgpAQCAtMTE0MCwxOSArMTAwNiw2IEBACiAKIAkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwgVklSVEhCQV9FUlJPUl9DT1VOVCkgewogCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKLQkJCUxPR0VSUigiU0NTSUNNRCAqKioqRkFJTEVEIHNjc2ljbWQ6MHglcCBvcDoweCV4IDwlZDolZDolZDolbGx1PiAweCV4LTB4JXgtMHgleC0weCV4LTB4JXguXG4iLAotCQkJICAgICAgIHNjc2ljbWQsIGNtZHJzcC0+c2NzaS5jbW5kWzBdLAotCQkJICAgICAgIHNjc2lkZXYtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkZXYtPmlkLAotCQkJICAgICAgIHNjc2lkZXYtPmNoYW5uZWwsIHNjc2lkZXYtPmx1biwKLQkJCSAgICAgICBjbWRyc3AtPnNjc2kubGludXhzdGF0LCBzZC0+dmFsaWQsIHNkLT5zZW5zZV9rZXksCi0JCQkgICAgICAgc2QtPmFkZGl0aW9uYWxfc2Vuc2VfY29kZSwKLQkJCSAgICAgICBzZC0+YWRkaXRpb25hbF9zZW5zZV9jb2RlX3F1YWxpZmllcik7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPT0KLQkJCSAgICBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7Ci0JCQkJTE9HRVJSKCJUaHJvdGxpbmcgU0NTSUNNRCBlcnJvcnMgZGlzayA8JWQ6JWQ6JWQ6JWxsdT5cbiIsCi0JCQkJICAgICAgIHNjc2lkZXYtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkZXYtPmlkLAotCQkJCSAgICAgICBzY3NpZGV2LT5jaGFubmVsLCBzY3NpZGV2LT5sdW4pOwotCQkJfQogCQkJYXRvbWljX3NldCgmdmRpc2stPmlvc190aHJlc2hvbGQsIElPU19FUlJPUl9USFJFU0hPTEQpOwogCQl9CiAJfQpAQCAtMTE4OCw3ICsxMDQxLDYgQEAKIAogCQlpZiAoc2NzaV9zZ19jb3VudChzY3NpY21kKSA9PSAwKSB7CiAJCQlpZiAoc2NzaV9idWZmbGVuKHNjc2ljbWQpID4gMCkgewotCQkJCUxPR0VSUigiKioqKiBGQUlMRUQgTm8gc2NhdHRlciBsaXN0IGZvciBidWZmbGVuID4gMFxuIik7CiAJCQkJQlVHX09OKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0KIAkJCQkgICAgICAgMCk7CiAJCQl9CkBAIC0xMTk5LDggKzEwNTEsNiBAQAogCiAJCXNnID0gc2NzaV9zZ2xpc3Qoc2NzaWNtZCk7CiAJCWZvciAoaSA9IDA7IGkgPCBzY3NpX3NnX2NvdW50KHNjc2ljbWQpOyBpKyspIHsKLQkJCURCR1ZFUigiY29weWluZyBPVVQgT0YgYnVmIGludG8gMHglcCAlZFxuIiwKLQkJCSAgICAgICBzZ19wYWdlKHNnICsgaSksIHNnW2ldLmxlbmd0aCk7CiAJCQl0aGlzcGFnZV9vcmlnID0ga21hcF9hdG9taWMoc2dfcGFnZShzZyArIGkpKTsKIAkJCXRoaXNwYWdlID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGhpc3BhZ2Vfb3JpZyB8CiAJCQkJCSAgICAgc2dbaV0ub2Zmc2V0KTsKQEAgLTEyMTksNyArMTA2OSw2IEBACiAJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5pb3NfdGhyZXNob2xkKSA+IDApIHsKIAkJCQlhdG9taWNfZGVjKCZ2ZGlzay0+aW9zX3RocmVzaG9sZCk7CiAJCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+aW9zX3RocmVzaG9sZCkgPT0gMCkgewotCQkJCQlMT0dFUlIoIlJlc2V0dGluZyBlcnJvciBjb3VudCBmb3IgZGlza1xuIik7CiAJCQkJCWF0b21pY19zZXQoJnZkaXNrLT5lcnJvcl9jb3VudCwgMCk7CiAJCQkJfQogCQkJfQpAQCAtMTIzMCw4ICsxMDc5LDYgQEAKIHN0YXRpYyB2b2lkCiBjb21wbGV0ZV9zY3NpX2NvbW1hbmQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQogewotCURCR0lORigiY21kcnNwOiAweCVwLCBzY3Npc3RhdDoweCV4LlxuIiwgY21kcnNwLCBjbWRyc3AtPnNjc2kuc2NzaXN0YXQpOwotCiAJLyogdGFrZSB3aGF0IHdlIG5lZWQgb3V0IG9mIGNtZHJzcCBhbmQgY29tcGxldGUgdGhlIHNjc2ljbWQgKi8KIAlzY3NpY21kLT5yZXN1bHQgPSBjbWRyc3AtPnNjc2kubGludXhzdGF0OwogCWlmIChjbWRyc3AtPnNjc2kubGludXhzdGF0KQpAQCAtMTIzOSwxMCArMTA4Niw4IEBACiAJZWxzZQogCQlkb19zY3NpX25vbGludXhzdGF0KGNtZHJzcCwgc2NzaWNtZCk7CiAKLQlpZiAoc2NzaWNtZC0+c2NzaV9kb25lKSB7Ci0JCURCR1ZFUigiU2NzaV9ET05FXG4iKTsKKwlpZiAoc2NzaWNtZC0+c2NzaV9kb25lKQogCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTEyNTIsNyArMTA5Nyw2IEBACiAJLyogd2FrZSB1cCB0aGUgZXJyb3IgaGFuZGxlciB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoaXMgKi8KIAkqKGludCAqKWNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeXJlc3VsdCA9IGNtZHJzcC0+dmRpc2ttZ210LnJlc3VsdDsKIAl3YWtlX3VwX2FsbCgod2FpdF9xdWV1ZV9oZWFkX3QgKiljbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnkpOwotCUxPR0lORigic2V0IG5vdGlmeSByZXN1bHQgdG8gJWRcbiIsIGNtZHJzcC0+dmRpc2ttZ210LnJlc3VsdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTI2Myw3ICsxMTA3LDYgQEAKIAkqKGludCAqKWNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeXJlc3VsdCA9CiAJICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdDsKIAl3YWtlX3VwX2FsbCgod2FpdF9xdWV1ZV9oZWFkX3QgKiljbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOwotCUxPR0lORigic2V0IG5vdGlmeSByZXN1bHQgdG8gJWRcbiIsIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMzE5LDggKzExNjIsNyBAQAogCQkJCQkJICAgIGNtZHJzcC0+dmRpc2ttZ210LnNjc2ljbWQpKQogCQkJCWJyZWFrOwogCQkJY29tcGxldGVfdmRpc2ttZ210X2NvbW1hbmQoY21kcnNwKTsKLQkJfSBlbHNlCi0JCQlMT0dFUlIoIkludmFsaWQgY21kdHlwZSAlZFxuIiwgY21kcnNwLT5jbWR0eXBlKTsKKwkJfQogCQkvKiBjbWRyc3AgaXMgbm93IGF2YWlsYWJsZSBmb3IgcmV1c2UgKi8KIAl9CiB9CkBAIC0xMzQxLDEzICsxMTgzLDE0IEBACiAJVUlTX0RBRU1PTklaRSgidmhiYV9pbmNvbWluZyIpOwogCS8qIGFsbG9jIG9uY2UgYW5kIHJldXNlICovCiAJY21kcnNwID0ga21hbGxvYyhTWiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGNtZHJzcCA9PSBOVUxMKSB7Ci0JCUxPR0VSUigicHJvY2Vzc19pbmNvbWluZ19yc3BzICoqKipGQUlMRUQgdG8gbWFsbG9jIC0gdGhyZWFkIGV4aXRpbmdcbiIpOworCWlmICghY21kcnNwKSB7CiAJCWNvbXBsZXRlX2FuZF9leGl0KCZkYy0+dGhyZWFkaW5mby5oYXNfc3RvcHBlZCwgMCk7CiAJCXJldHVybiAwOwogCX0KIAltYXNrID0gVUxUUkFfQ0hBTk5FTF9FTkFCTEVfSU5UUzsKIAl3aGlsZSAoMSkgeworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHZpcnRoYmFpbmZvLT5yc3BfcXVldWUsCiAJCQkgKGF0b21pY19yZWFkKCZ2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3JjdmQpID09IDEpLAogCQkJCSAgICAgIHVzZWNzX3RvX2ppZmZpZXMocnNsdHFfd2FpdF91c2VjcykpOwpAQCAtMTM1NSwxMyArMTE5OCwxMCBAQAogCQkvKiBkcmFpbiBxdWV1ZSAqLwogCQlkcmFpbl9xdWV1ZSh2aXJ0aGJhaW5mbywgZGMsIGNtZHJzcCk7CiAJCXJjMSA9IHVpc3F1ZXVlX2ludGVybG9ja2VkX29yKHZpcnRoYmFpbmZvLT5mbGFnc19hZGRyLCBtYXNrKTsKLQkJaWYgKGRjLT50aHJlYWRpbmZvLnNob3VsZF9zdG9wKQotCQkJYnJlYWs7CiAJfQogCiAJa2ZyZWUoY21kcnNwKTsKIAotCURCR0lORigiZXhpdGluZyBwcm9jZXNzaW5nIGluY29taW5nIHJzcHMuXG4iKTsKIAljb21wbGV0ZV9hbmRfZXhpdCgmZGMtPnRocmVhZGluZm8uaGFzX3N0b3BwZWQsIDApOwogfQogCkBAIC0xMzg2LDcgKzEyMjYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaSA9IDA7IGkgPCBWSVJUSEJBU09QRU5NQVg7IGkrKykgewotCQlpZiAodmlydGhiYXNfb3BlbltpXS52aXJ0aGJhaW5mbyA9PSBOVUxMKQorCQlpZiAoIXZpcnRoYmFzX29wZW5baV0udmlydGhiYWluZm8pCiAJCQljb250aW51ZTsKIAogCQl2aXJ0aGJhaW5mbyA9IHZpcnRoYmFzX29wZW5baV0udmlydGhiYWluZm87CkBAIC0xNDM2LDIzICsxMjc2LDE3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJYnVmW2NvdW50XSA9ICdcMCc7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKLQkJTE9HRVJSKCJjb3B5X2Zyb21fdXNlciBmYWlsZWQuIGJ1Zjw8JS4qcz4+IGNvdW50PDwlbHU+PlxuIiwKLQkJICAgICAgIChpbnQpY291bnQsIGJ1ZiwgY291bnQpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CiAKIAlpID0ga3N0cnRvaW50KGJ1ZiwgMTAsICZuZXdfdmFsdWUpOwogCi0JaWYgKGkgIT0gMCkgewotCQlMT0dFUlIoIkZhaWxlZCB0byBzY2FuIHZhbHVlIGZvciBlbmFibGVfaW50cywgYnVmPDwlLipzPj4iLAotCQkgICAgICAgKGludCljb3VudCwgYnVmKTsKKwlpZiAoaSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CiAKIAkvKiBzZXQgYWxsIGNvdW50cyB0byBuZXdfdmFsdWUgdXN1YWxseSAwICovCiAJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7Ci0JCWlmICh2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvICE9IE5VTEwpIHsKKwkJaWYgKHZpcnRoYmFzX29wZW5baV0udmlydGhiYWluZm8pIHsKIAkJCXZpcnRoYmFpbmZvID0gdmlydGhiYXNfb3BlbltpXS52aXJ0aGJhaW5mbzsKIAkJCWZlYXR1cmVzX2FkZHIgPQogCQkJCSZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbi0+ZmVhdHVyZXM7CkBAIC0xNDg0LDE3ICsxMzE4LDExIEBACiAJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopKChzdHJ1Y3QgU2NzaV9Ib3N0ICopdmlydHBjaWRldi0+c2NzaS4KIAkJCQkgICAgIHNjc2lob3N0KS0+aG9zdGRhdGE7CiAKLQlEQkdJTkYoInZpcnRwY2lkZXYgYnVzX25vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNfbm8sCi0JICAgICAgIHZpcnRwY2lkZXYtPmRldmljZV9ubyk7Ci0KLQlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duKSB7Ci0JCURCR0lORigiU2VydmVyIHVwIG1lc3NhZ2UgcmVjZWl2ZWQgd2hpbGUgc2VydmVyIGlzIGFscmVhZHkgdXAuXG4iKTsKKwlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duKQogCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7Ci0JCUxPR0VSUigiU2VydmVyIGFscmVhZHkgcHJvY2Vzc2luZyBjaGFuZ2Ugc3RhdGUgbWVzc2FnZVxuIik7CisKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiAwOwotCX0KIAogCXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlID0gdHJ1ZTsKIAkvKiBNdXN0IHRyYW5zaXRpb24gY2hhbm5lbCB0byBBVFRBQ0hFRCBzdGF0ZSBCRUZPUkUgd2UKQEAgLTE1MDgsNyArMTMzNiw2IEBACiAJaWYgKCF1aXN0aHJlYWRfc3RhcnQoJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbywKIAkJCSAgICAgcHJvY2Vzc19pbmNvbWluZ19yc3BzLAogCQkJICAgICB2aXJ0aGJhaW5mbywgInZoYmFfaW5jb21pbmciKSkgewotCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCByc3AgKioqKkZBSUxFRFxuIik7CiAJCXJldHVybiAwOwogCX0KIAl2aXJ0aGJhaW5mby0+c2VydmVyZG93biA9IGZhbHNlOwpAQCAtMTU0MywxOCArMTM3MCwxNiBAQAogCQlzd2l0Y2ggKHBlbmRpbmdkZWwtPmNtZHR5cGUpIHsKIAkJY2FzZSBDTURfU0NTSV9UWVBFOgogCQkJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopcGVuZGluZ2RlbC0+c2VudDsKLQkJCXNjc2ljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OwogCQkJaWYgKHNjc2ljbWQtPnNjc2lfZG9uZSkKIAkJCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CiAJCQlicmVhazsKIAkJY2FzZSBDTURfU0NTSVRBU0tNR01UX1RZUEU6CiAJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKXBlbmRpbmdkZWwtPnNlbnQ7Ci0JCQlEQkdJTkYoImNtZHJzcD0weCV4LCBub3RpZnk9MHgleFxuIiwgY21kcnNwLAotCQkJICAgICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7Ci0JCQkqKGludCAqKWNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeXJlc3VsdCA9Ci0JCQkgICAgVEFTS19NR01UX0ZBSUxFRDsKIAkJCXdha2VfdXBfYWxsKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKQogCQkJCSAgICBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCQkJKihpbnQgKiljbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnlyZXN1bHQgPQorCQkJCVRBU0tfTUdNVF9GQUlMRUQ7CiAJCQlicmVhazsKIAkJY2FzZSBDTURfVkRJU0tNR01UX1RZUEU6CiAJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKXBlbmRpbmdkZWwtPnNlbnQ7CkBAIC0xNTY0LDkgKzEzODksNyBAQAogCQkJCSAgICBjbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnkpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpZiAocGVuZGluZ2RlbC0+c2VudCAhPSBOVUxMKQotCQkJCUxPR0VSUigiVW5rbm93biBjb21tYW5kIHR5cGU6IDB4JXguICBPbmx5IGZyZWVpbmcgbGlzdCBzdHJ1Y3R1cmUuXG4iLAotCQkJCSAgICAgcGVuZGluZ2RlbC0+Y21kdHlwZSk7CisJCQlicmVhazsKIAkJfQogCQlwZW5kaW5nZGVsLT5jbWR0eXBlID0gMDsKIAkJcGVuZGluZ2RlbC0+c2VudCA9IE5VTEw7CkBAIC0xNTc1LDggKzEzOTgsNiBAQAogCiAJdmlydHBjaWRldiA9IHZpcnRoYmFpbmZvLT52aXJ0cGNpZGV2OwogCi0JREJHSU5GKCJ2aXJ0cGNpZGV2IGJ1c19ubzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzX25vLAotCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2Vfbm8pOwogCXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duID0gdHJ1ZTsKIAl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IGZhbHNlOwogCS8qIFJldHVybiB0aGUgU2VydmVyRG93biByZXNwb25zZSB0byBDb21tYW5kICovCkBAIC0xNTk0LDE5ICsxNDE1LDEyIEBACiAJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopKChzdHJ1Y3QgU2NzaV9Ib3N0ICopdmlydHBjaWRldi0+c2NzaS4KIAkJCQkgICAgIHNjc2lob3N0KS0+aG9zdGRhdGE7CiAKLQlEQkdJTkYoInZpcnRoYmFfc2VydmVyZG93biIpOwotCURCR0lORigidmlydHBjaWRldiBidXNfbm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c19ubywKLQkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlX25vKTsKLQogCWlmICghdmlydGhiYWluZm8tPnNlcnZlcmRvd24gJiYgIXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CiAJCXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlID0gdHJ1ZTsKIAkJcXVldWVfd29yayh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlLAogCQkJICAgJnZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duX2NvbXBsZXRpb24pOwogCX0gZWxzZSBpZiAodmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKLQkJTE9HRVJSKCJTZXJ2ZXIgYWxyZWFkeSBwcm9jZXNzaW5nIGNoYW5nZSBzdGF0ZSBtZXNzYWdlXG4iKTsKIAkJc3RhdCA9IDA7Ci0JfSBlbHNlIHsKLQkJTE9HRVJSKCJTZXJ2ZXIgYWxyZWFkeSBkb3duLCBidXQgYW5vdGhlciBzZXJ2ZXIgZG93biBtZXNzYWdlIHJlY2VpdmVkLiIpOwogCX0KIAogCXJldHVybiBzdGF0OwpAQCAtMTYxOSw3ICsxNDMzLDYgQEAKIHN0YXRpYyBpbnQgX19pbml0CiB2aXJ0aGJhX3BhcnNlX2xpbmUoY2hhciAqc3RyKQogewotCURCR0lORigiSW4gdmlydGhiYV9wYXJzZV9saW5lICVzXG4iLCBzdHIpOwogCXJldHVybiAxOwogfQogCkBAIC0xNjI5LDE0ICsxNDQyLDEzIEBACiAJY2hhciAqbmV4dCA9IGxpbmU7CiAKIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKLQlpZiAobGluZSA9PSBOVUxMIHx8ICEqbGluZSkKKwlpZiAoIWxpbmUgfHwgISpsaW5lKQogCQlyZXR1cm47Ci0Jd2hpbGUgKChsaW5lID0gbmV4dCkgIT0gTlVMTCkgeworCXdoaWxlICgobGluZSA9IG5leHQpKSB7CiAJCW5leHQgPSBzdHJjaHIobGluZSwgJyAnKTsKLQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJaWYgKG5leHQpCiAJCQkqbmV4dCsrID0gMDsKLQkJaWYgKCF2aXJ0aGJhX3BhcnNlX2xpbmUobGluZSkpCi0JCQlEQkdJTkYoIlVua25vd24gb3B0aW9uICclcydcbiIsIGxpbmUpOworCQl2aXJ0aGJhX3BhcnNlX2xpbmUobGluZSk7CiAJfQogCiAJUE9TVENPREVfTElOVVhfMihWSEJBX0NSRUFURV9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKQEAgLTE2NTEsMTQgKzE0NjMsMTEgQEAKIAlpZiAoIXVuaXN5c19zcGFyX3BsYXRmb3JtKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCUxPR0lORigiRW50ZXJpbmcgdmlydGhiYV9tb2RfaW5pdC4uLlxuIik7Ci0KIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAl2aXJ0aGJhX3BhcnNlX29wdGlvbnModmlydGhiYV9vcHRpb25zKTsKIAogCWVycm9yID0gdmlydHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpcnRoYmFfZHJpdmVyKTsKIAlpZiAoZXJyb3IgPCAwKSB7Ci0JCUxPR0VSUigicmVnaXN0ZXIgKioqKkZBSUxFRCAweCV4XG4iLCBlcnJvcik7CiAJCVBPU1RDT0RFX0xJTlVYXzMoVkhCQV9DUkVBVEVfRkFJTFVSRV9QQywgZXJyb3IsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJfSBlbHNlIHsKQEAgLTE2ODEsOCArMTQ5MCw3IEBACiAJCS8qIEluaXRpYWxpemUgdGhlIHNlcnZlcmRvd24gd29ya3F1ZXVlICovCiAJCXZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUgPQogCQkgICAgY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInZpcnRoYmFfc2VydmVyZG93biIpOwotCQlpZiAodmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSA9PSBOVUxMKSB7Ci0JCQlMT0dFUlIoIioqKiogRkFJTEVEIHZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUgY3JlYXRpb25cbiIpOworCQlpZiAoIXZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUpIHsKIAkJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRkFJTFVSRV9QQywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQllcnJvciA9IC0xOwpAQCAtMTY5MCw3ICsxNDk4LDYgQEAKIAl9CiAKIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotCUxPR0lORigiTGVhdmluZyB2aXJ0aGJhX21vZF9pbml0XG4iKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE3NDAsOCArMTU0Nyw2IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQKIHZpcnRoYmFfbW9kX2V4aXQodm9pZCkKIHsKLQlMT0dJTkYoImVudGVyaW5nIHZpcnRoYmFfbW9kX2V4aXQuLi5cbiIpOwotCiAJdmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGhiYV9kcml2ZXIpOwogCS8qIHVucmVnaXN0ZXIgaXMgZ29pbmcgdG8gY2FsbCB2aXJ0aGJhX3JlbW92ZSAqLwogCS8qIGRlc3Ryb3kgc2VydmVyZG93biBjb21wbGV0aW9uIHdvcmtxdWV1ZSAqLwpAQCAtMTc1MSw3ICsxNTU2LDYgQEAKIAl9CiAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodmlydGhiYV9kZWJ1Z2ZzX2Rpcik7Ci0JTE9HSU5GKCJMZWF2aW5nIHZpcnRoYmFfbW9kX2V4aXRcbiIpOwogfQogCiAvKiBzcGVjaWZ5IGZ1bmN0aW9uIHRvIGJlIHJ1biBhdCBtb2R1bGUgaW5zZXJ0aW9uIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKaW5kZXggZTU5ZWZjYi4uNmQxOTQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIGNvbmZpZyBVTklTWVNfVklSVFBDSQogCXRyaXN0YXRlICJVbmlzeXMgdmlydHBjaSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19VSVNMSUIKKwlzZWxlY3QgVU5JU1lTX1VJU0xJQgogCS0tLWhlbHAtLS0KIAlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdmlydHBjaSBkcml2ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS92aXJ0cGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5jCmluZGV4IDhmZGZkNmYuLmQ1YWQwMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS92aXJ0cGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuYwpAQCAtMjEsNyArMjEsNiBAQAogI2lmZGVmIENPTkZJR19NT0RWRVJTSU9OUwogI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgogI2VuZGlmCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKICNpbmNsdWRlICJ1aXN1dGlscy5oIgogI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCkBAIC0xODcsMTMgKzE4NiwxMSBAQAogewogCWludCBvZmY7CiAKLQlpZiAoIWNoYW4pIHsKLQkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwlpZiAoIWNoYW4pCiAJCXJldHVybiAtMTsKLQl9CisKIAlvZmYgPSBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSArIGNoYW4tPmhkcl9pbmZvLmNocF9pbmZvX29mZnNldDsKIAlpZiAoY2hhbi0+aGRyX2luZm8uY2hwX2luZm9fb2Zmc2V0ID09IDApIHsKLQkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHVzZWQsIGJlY2F1c2UgY2hwX2luZm9fb2Zmc2V0ID09IDAiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAltZW1jcHkoKCh1OCAqKShjaGFuKSkgKyBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpOwpAQCAtMjA2LDE1ICsyMDMsMTIgQEAKIHsKIAlpbnQgb2ZmOwogCi0JaWYgKCFjaGFuKSB7Ci0JCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCBwcmVzZW50Iik7CisJaWYgKCFjaGFuKQogCQlyZXR1cm4gLTE7Ci0JfQorCiAJb2ZmID0gc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikgKyBjaGFuLT5oZHJfaW5mby5idXNfaW5mb19vZmZzZXQ7Ci0JaWYgKGNoYW4tPmhkcl9pbmZvLmJ1c19pbmZvX29mZnNldCA9PSAwKSB7Ci0JCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGJ1c19pbmZvX29mZnNldCA9PSAwIik7CisJaWYgKGNoYW4tPmhkcl9pbmZvLmJ1c19pbmZvX29mZnNldCA9PSAwKQogCQlyZXR1cm4gLTE7Ci0JfQogCW1lbWNweSgoKHU4ICopKGNoYW4pKSArIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjgsMTggKzIyMiwxNiBAQAogewogCWludCBvZmY7CiAKLQlpZiAoIWNoYW4pIHsKLQkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwlpZiAoIWNoYW4pCiAJCXJldHVybiAtMTsKLQl9CisKIAlvZmYgPQogCSAgICAoc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikgKwogCSAgICAgY2hhbi0+aGRyX2luZm8uZGV2X2luZm9fb2Zmc2V0KSArCiAJICAgIChjaGFuLT5oZHJfaW5mby5kZXZpY2VfaW5mb19zdHJ1Y3RfYnl0ZXMgKiBkZXZpeCk7Ci0JaWYgKGNoYW4tPmhkcl9pbmZvLmRldl9pbmZvX29mZnNldCA9PSAwKSB7Ci0JCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGRldl9pbmZvX29mZnNldCA9PSAwIik7CisJaWYgKGNoYW4tPmhkcl9pbmZvLmRldl9pbmZvX29mZnNldCA9PSAwKQogCQlyZXR1cm4gLTE7Ci0JfQorCiAJbWVtY3B5KCgodTggKikoY2hhbikpICsgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI3MSw3ICsyNjMsNiBAQAogCSAqLwogCXJldCA9IGRldmljZV9yZWdpc3Rlcih2YnVzKTsKIAlpZiAocmV0KSB7Ci0JCUxPR0VSUigiZGV2aWNlX3JlZ2lzdGVyIEZBSUxFRDolZFxuIiwgcmV0KTsKIAkJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNzksOCArMjcwLDYgQEAKIAkJCSAgICAmY2hpcHNldF9kcml2ZXJfaW5mbyk7CiAJd3JpdGVfdmJ1c19idXNfaW5mbyh2YnVzLT5wbGF0Zm9ybV9kYXRhIC8qIGNoYW5wdHIgKi8sCiAJCQkgICAgJmJ1c19kcml2ZXJfaW5mbyk7Ci0JTE9HSU5GKCJBZGRlZCB2YnVzICVkOyBkZXZpY2UgJXMgY3JlYXRlZCBzdWNjZXNzZnVsbHlcbiIsCi0JICAgICAgIGFkZHBhcmFtcy0+YnVzX25vLCBCVVNfSUQodmJ1cykpOwogCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJcmV0dXJuIDE7CiB9CkBAIC0zMTIsNyArMzAxLDYgQEAKIAlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAlpZiAoIVdBSVRfRk9SX0lPX0NIQU5ORUwKIAkgICAgKChzdHJ1Y3Qgc3Bhcl9pb19jaGFubmVsX3Byb3RvY29sIF9faW9tZW0gKilhZGRwYXJhbXMtPmNoYW5wdHIpKSB7Ci0JCUxPR0VSUigiVGltZWQgb3V0LiAgQ2hhbm5lbCBub3QgcmVhZHlcbiIpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwogCX0KQEAgLTMyMywxOSArMzExLDExIEBACiAJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGFkZHBhcmFtcy0+YnVzX25vKTsKIAl2YnVzID0gYnVzX2ZpbmRfZGV2aWNlKCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAogCQkJICAgICAgICh2b2lkICopYnVzaWQsIG1hdGNoX2J1c2lkKTsKLQlpZiAoIXZidXMpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZidXMgJXNcbiIsIGJ1c2lkKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybiAwOwotCX0KIAotCUxPR0lORigiQWRkaW5nIHZoYmEgd3dubjoleDoleCBjb25maWc6JWQtJWQtJWQtJWQgY2hhbnB0cjolcFxuIiwKLQkgICAgICAgc2NzaS53d25uLnd3bm4xLCBzY3NpLnd3bm4ud3dubjIsCi0JICAgICAgIHNjc2kubWF4Lm1heF9jaGFubmVsLCBzY3NpLm1heC5tYXhfaWQsIHNjc2kubWF4Lm1heF9sdW4sCi0JICAgICAgIHNjc2kubWF4LmNtZF9wZXJfbHVuLCBhZGRwYXJhbXMtPmNoYW5wdHIpOwogCWkgPSB2aXJ0cGNpX2RldmljZV9hZGQodmJ1cywgVklSVEhCQV9UWVBFLCBhZGRwYXJhbXMsICZzY3NpLCBOVUxMKTsKIAlpZiAoaSkgewotCQlMT0dJTkYoIkFkZGVkIHZoYmEgd3dubjoleDoleCBjaGFucHRyOiVwXG4iLCBzY3NpLnd3bm4ud3dubjEsCi0JCSAgICAgICBzY3NpLnd3bm4ud3dubjIsIGFkZHBhcmFtcy0+Y2hhbnB0cik7CiAJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRVhJVF9QQywgaSwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJfQpAQCAtMzc1LDcgKzM1NSw2IEBACiAJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJaWYgKCFXQUlUX0ZPUl9JT19DSEFOTkVMCiAJICAgICgoc3RydWN0IHNwYXJfaW9fY2hhbm5lbF9wcm90b2NvbCBfX2lvbWVtICopYWRkcGFyYW1zLT5jaGFucHRyKSkgewotCQlMT0dFUlIoIlRpbWVkIG91dCwgY2hhbm5lbCBub3QgcmVhZHlcbiIpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwogCX0KQEAgLTM4NiwyMCArMzY1LDExIEBACiAJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGFkZHBhcmFtcy0+YnVzX25vKTsKIAl2YnVzID0gYnVzX2ZpbmRfZGV2aWNlKCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAogCQkJICAgICAgICh2b2lkICopYnVzaWQsIG1hdGNoX2J1c2lkKTsKLQlpZiAoIXZidXMpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZidXMgJXNcbiIsIGJ1c2lkKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybiAwOwotCX0KIAotCUxPR0lORigiQWRkaW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCByY3ZidWZzOiVkIG10dTolZCBjaGFucHRyOiVwJXBVTFxuIiwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSwKLQkgICAgICAgbmV0Lm51bV9yY3ZfYnVmcywgbmV0Lm10dSwgYWRkcGFyYW1zLT5jaGFucHRyLCAmbmV0LnpvbmVfdXVpZCk7CiAJaSA9IHZpcnRwY2lfZGV2aWNlX2FkZCh2YnVzLCBWSVJUTklDX1RZUEUsIGFkZHBhcmFtcywgTlVMTCwgJm5ldCk7CiAJaWYgKGkpIHsKLQkJTE9HSU5GKCJBZGRlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CiAJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRVhJVF9QQywgaSwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJCXJldHVybiAxOwpAQCAtNDIwLDM0ICszOTAsMjQgQEAKIAlzcHJpbnRmKGJ1c2lkLCAidmJ1cyVkIiwgZGVscGFyYW1zLT5idXNfbm8pOwogCXZidXMgPSBidXNfZmluZF9kZXZpY2UoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsCiAJCQkgICAgICAgKHZvaWQgKilidXNpZCwgbWF0Y2hfYnVzaWQpOwotCWlmICghdmJ1cykgewotCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGZpbmQgdmJ1cyAlc1xuIiwgYnVzaWQpOworCWlmICghdmJ1cykKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogZW5zdXJlIHRoYXQgYnVzIGhhcyBubyBkZXZpY2VzPyAtLSBUQkQgKi8KLQlMT0dJTkYoIkRlbGV0aW5nICVzXG4iLCBCVVNfSUQodmJ1cykpOwotCWlmIChkZWxldGVfdmJ1c19kZXZpY2UodmJ1cywgTlVMTCkpCi0JCXJldHVybiAwOwkvKiBmYWlsdXJlICovCi0JTE9HSU5GKCJEZWxldGVkIHZidXMgJWRcbiIsIGRlbHBhcmFtcy0+YnVzX25vKTsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogZGVsZXRlX3ZidXNfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnZidXMsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IGNoZWNrZm9ycm9vdCA9IChkYXRhICE9IE5VTEwpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlOwogCi0JaWYgKChjaGVja2ZvcnJvb3QpICYmIG1hdGNoX2J1c2lkKHZidXMsICh2b2lkICopQlVTX0lEKGRldikpKSB7CisJaWYgKChkYXRhKSAmJiBtYXRjaF9idXNpZCh2YnVzLCAodm9pZCAqKUJVU19JRChkZXYpKSkgewogCQkvKiBza2lwIGl0IC0gZG9uJ3QgZGVsZXRlIHJvb3QgYnVzICovCi0JCUxPR0lORigic2tpcHBpbmcgcm9vdCBidXNcbiIpOwogCQlyZXR1cm4gMDsJLyogcHJldGVuZCBubyBlcnJvciAqLwogCX0KLQlMT0dJTkYoIkNhbGxpbmcgdW5yZWdpc3RlciBmb3IgJXNcbiIsIEJVU19JRCh2YnVzKSk7CiAJZGV2aWNlX3VucmVnaXN0ZXIodmJ1cyk7CiAJa2ZyZWUodmJ1cyk7Ci0JTE9HSU5GKCJWQnVzIHVucmVnaXN0ZXIgYW5kIGZyZWVkXG4iKTsKIAlyZXR1cm4gMDsJCS8qIG5vIGVycm9yICovCiB9CiAKQEAgLTQ2MSwxMiArNDIxLDggQEAKIAogCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKHBhdXNlcGFyYW1zLT5jaGFucHRyKTsKIAotCUxPR0lORigiUGF1c2luZyB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yKTsKIAlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLywgVklSVEhCQV9UWVBFLAogCQkJCSAgICAgICZzY3NpLnd3bm4sIE5VTEwpOwotCWlmIChpKQotCQlMT0dJTkYoIlBhdXNlZCB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwKLQkJICAgICAgIHNjc2kud3dubi53d25uMik7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTQ4MCwxNiArNDM2LDggQEAKIAogCUdFVF9ORVRBREFQSU5GT19GUk9NX0NIQU5QVFIocGF1c2VwYXJhbXMtPmNoYW5wdHIpOwogCi0JTE9HSU5GKCJQYXVzaW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CiAJaSA9IHZpcnRwY2lfZGV2aWNlX3NlcnZlcmRvd24oTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlROSUNfVFlQRSwKIAkJCQkgICAgICBOVUxMLCBuZXQubWFjX2FkZHIpOwotCWlmIChpKSB7Ci0JCUxPR0lORigiIFBhdXNlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7Ci0JfQogCXJldHVybiBpOwogfQogCkBAIC01MDMsMTIgKzQ1MSw4IEBACiAKIAlHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihyZXN1bWVwYXJhbXMtPmNoYW5wdHIpOwogCi0JTE9HSU5GKCJSZXN1bWluZyB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yKTsKIAlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlRIQkFfVFlQRSwKIAkJCQkgICAgJnNjc2kud3dubiwgTlVMTCk7Ci0JaWYgKGkpCi0JCUxPR0lORigiUmVzdW1lZCB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwKLQkJICAgICAgIHNjc2kud3dubi53d25uMik7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTUyMywxNiArNDY3LDggQEAKIAogCUdFVF9ORVRBREFQSU5GT19GUk9NX0NIQU5QVFIocmVzdW1lcGFyYW1zLT5jaGFucHRyKTsKIAotCUxPR0lORigiUmVzdW1pbmcgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKIAlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlROSUNfVFlQRSwKIAkJCQkgICAgTlVMTCwgbmV0Lm1hY19hZGRyKTsKLQlpZiAoaSkgewotCQlMT0dJTkYoIiBSZXN1bWVkIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCi0JCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKLQl9CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTU0NiwxMiArNDgyLDkgQEAKIAogCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKGRlbHBhcmFtcy0+Y2hhbnB0cik7CiAKLQlMT0dJTkYoIkRlbGV0aW5nIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLCBzY3NpLnd3bm4ud3dubjIpOwogCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlRIQkFfVFlQRSwKIAkJCSAgICAgICAmc2NzaS53d25uLCBOVUxMKTsKIAlpZiAoaSkgewotCQlMT0dJTkYoIkRlbGV0ZWQgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsCi0JCSAgICAgICBzY3NpLnd3bm4ud3dubjIpOwogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC01NjcsMjMgKzUwMCwxMyBAQAogCiAJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihkZWxwYXJhbXMtPmNoYW5wdHIpOwogCi0JTE9HSU5GKCJEZWxldGluZyB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCi0JICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOwogCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlROSUNfVFlQRSwgTlVMTCwKIAkJCSAgICAgICBuZXQubWFjX2FkZHIpOwotCWlmIChpKSB7Ci0JCUxPR0lORigiRGVsZXRlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7Ci0JfQogCXJldHVybiBpOwogfQogCiAjZGVmaW5lIERFTEVURV9PTkVfVlBDSURFVih2cGNpZGV2KSB7IFwKLQlMT0dJTkYoImNhbGxpbmcgZGV2aWNlX3VucmVnaXN0ZXI6JXBcbiIsICZ2cGNpZGV2LT5nZW5lcmljX2Rldik7IFwKIAlkZXZpY2VfdW5yZWdpc3RlcigmdnBjaWRldi0+Z2VuZXJpY19kZXYpOyBcCi0JTE9HSU5GKCJEZWxldGVkICVwXG4iLCB2cGNpZGV2KTsgXAogCWtmcmVlKHZwY2lkZXYpOyBcCiB9CiAKQEAgLTYxMCwxMiArNTMzLDEwIEBACiAJCXRtcHZwY2lkZXYgPSBuZXh0dnBjaWRldjsKIAkJY291bnQrKzsKIAl9Ci0JTE9HSU5GKCJEZWxldGVkICVkIHZoYmFzL3ZuaWNzLlxuIiwgY291bnQpOwogCiAJLyogbm93IGRlbGV0ZSBlYWNoIHZidXMgKi8KLQlpZiAoYnVzX2Zvcl9lYWNoX2RldgotCSAgICAoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsICh2b2lkICopMSwgZGVsZXRlX3ZidXNfZGV2aWNlKSkKLQkJTE9HRVJSKCJkZWxldGUgb2YgYWxsIHZidXMgZmFpbGVkXG4iKTsKKwlidXNfZm9yX2VhY2hfZGV2KCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLCAodm9pZCAqKTEsCisJCQkgZGVsZXRlX3ZidXNfZGV2aWNlKTsKIH0KIAogLyogZGVsZXRlcyBhbGwgdm5pY3Mgb3IgdmhiYXMKQEAgLTYzMiwyNCArNTUzLDE0IEBACiAJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGRlbHBhcmFtcy0+YnVzX25vKTsKIAl2YnVzID0gYnVzX2ZpbmRfZGV2aWNlKCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAogCQkJICAgICAgICh2b2lkICopYnVzaWQsIG1hdGNoX2J1c2lkKTsKLQlpZiAoIXZidXMpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZidXMgJXNcbiIsIGJ1c2lkKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybiAwOwotCX0KIAotCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBkZWxldGUgYWxsIGRldmljZXM7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKLQkJICAgICAgIGRldnR5cGUsIFZJUlRIQkFfVFlQRSwgVklSVE5JQ19UWVBFKTsKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKQogCQlyZXR1cm4gMDsKLQl9CiAKLQlMT0dJTkYoIkRlbGV0aW5nIGFsbCAlcyBpbiB2YnVzICVzXG4iLAotCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiLCBidXNpZCk7CiAJLyogZGVsZXRlIGFsbCB2aGJhcy92bmljcyAqLwogCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwodmJ1cywgZGV2dHlwZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKGkgPiAwKQotCQlMT0dJTkYoIkRlbGV0ZWQgJWQgJXNcbiIsIGksCi0JCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNjg0LDcgKzU5NSw2IEBACiAJY2FzZSBHVUVTVF9SRVNVTUVfVk5JQzoKIAkJcmV0dXJuIHJlc3VtZV92bmljKCZtc2ctPnJlc3VtZV92bmljKTsKIAlkZWZhdWx0OgotCQlMT0dFUlIoImludmFsaWQgbWVzc2FnZSB0eXBlICVkLlxuIiwgbXNnLT5tc2d0eXBlKTsKIAkJcmV0dXJuIDA7CiAJfQogfQpAQCAtNzA4LDkgKzYxOCw2IEBACiAJCSAgICAgY29uc3Qgc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYpCiB7CiAJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgewotCQlEQkdJTkYoImlkcy0+dmVuZG9yOiV4IGRldi0+dmVuZG9yOiV4IGlkcy0+ZGV2aWNlOiV4IGRldi0+ZGV2aWNlOiV4XG4iLAotCQkgICAgICAgaWRzLT52ZW5kb3IsIGRldi0+dmVuZG9yLCBpZHMtPmRldmljZSwgZGV2LT5kZXZpY2UpOwotCiAJCWlmICgoaWRzLT52ZW5kb3IgPT0gZGV2LT52ZW5kb3IpICYmCiAJCSAgICAoaWRzLT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UpKQogCQkJcmV0dXJuIGlkczsKQEAgLTczMSwyMCArNjM4LDE1IEBACiAJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2ID0gZHJpdmVyX3RvX3ZpcnRwY2lfZHJpdmVyKGRydik7CiAJaW50IG1hdGNoID0gMDsKIAotCURCR0lORigiSW4gdmlydHBjaV9idXNfbWF0Y2ggZGV2LT5idXNfaWQ6JXMgZHJ2LT5uYW1lOiVzXG4iLAotCSAgICAgICBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKLQogCS8qIGNoZWNrIGlkcyBsaXN0IGZvciBhIG1hdGNoICovCiAJaWYgKHZpcnRwY2lfbWF0Y2hfZGV2aWNlKHZpcnRwY2lkcnYtPmlkX3RhYmxlLCB2aXJ0cGNpZGV2KSkKIAkJbWF0Y2ggPSAxOwogCi0JREJHSU5GKCJyZXR1cm5pbmcgbWF0Y2g6JWRcbiIsIG1hdGNoKTsKIAlyZXR1cm4gbWF0Y2g7CQkvKiAwIC0gbm8gbWF0Y2g7IDEgLSB5ZXMgaXQgbWF0Y2hlcyAqLwogfQogCiBzdGF0aWMgaW50IHZpcnRwY2lfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQogewotCURCR0lORigiSW4gdmlydHBjaV9ob3RwbHVnXG4iKTsKIAkvKiBhZGQgdmFyaWFibGVzIHRvIHRoZSBlbnZpcm9ubWVudCBwcmlvciB0byB0aGUgZ2VuZXJhdGlvbiBvZgogCSAqIGhvdHBsdWcgZXZlbnRzIHRvIHVzZXIgc3BhY2UKIAkgKi8KQEAgLTc2NiwyNCArNjY4LDE5IEBACiAJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyBkZXZfaW5mbzsKIAljb25zdCBjaGFyICpzdHlwZTsKIAotCWlmICghZGV2KSB7Ci0JCUxPR0VSUigiJXMgZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJaWYgKCFkZXYpCiAJCXJldHVybjsKLQl9Ci0JaWYgKCF2aXJ0cGNpZHJ2KSB7Ci0JCUxPR0VSUigiJXMgZHJpdmVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJaWYgKCF2aXJ0cGNpZHJ2KQogCQlyZXR1cm47Ci0JfQorCiAJdmJ1cyA9IGRldi0+cGFyZW50OwotCWlmICghdmJ1cykgewotCQlMT0dFUlIoIiVzIGRldiBoYXMgbm8gcGFyZW50IGJ1cyIsIF9fZnVuY19fKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybjsKLQl9CisKIAljaGFuID0gdmJ1cy0+cGxhdGZvcm1fZGF0YTsKLQlpZiAoIWNoYW4pIHsKLQkJTE9HRVJSKCIlcyBkZXYgYnVzIGhhcyBubyBjaGFubmVsIiwgX19mdW5jX18pOworCWlmICghY2hhbikKIAkJcmV0dXJuOwotCX0KKwogCXN3aXRjaCAoZGV2X3R5cGUpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklSVEhCQToKIAkJc3R5cGUgPSAidkhCQSI7CkBAIC04MjAsOCArNzE3LDYgQEAKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CiAJaW50IGVycm9yID0gMDsKIAotCUxPR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcHJvYmUgZGV2OiVwIHZpcnRwY2lkZXY6JXAgdmlydHBjaWRydjolcFxuIiwKLQkgICAgICAgZGV2LCB2aXJ0cGNpZGV2LCB2aXJ0cGNpZHJ2KTsJLyogVkVSQk9TRS9ERUJVRyA/ICovCiAJUE9TVENPREVfTElOVVhfMihWUENJX1BST0JFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAkvKiBzdGF0aWMgbWF0Y2ggYW5kIHN0YXRpYyBwcm9iZSB2cyBkeW5hbWljIG1hdGNoICYgZHluYW1pYwogCSAqIHByb2JlIC0gZG8gd2UgY2FyZT8uCkBAIC04NjYsOSArNzYxLDYgQEAKIAlzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYgPSBkZXZpY2VfdG9fdmlydHBjaV9kZXYoZGV2Xyk7CiAJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2ID0gdmlydHBjaWRldi0+bXlkcml2ZXI7CiAKLQlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3JlbW92ZSBidXNfaWQ6JXMgZGV2XzolcCB2aXJ0cGNpZGV2OiVwIGRldi0+ZHJpdmVyOiVwIGRyaXZlcm5hbWU6JXNcbiIsCi0JICAgICAgIEJVU19JRChkZXZfKSwgZGV2XywgdmlydHBjaWRldiwgZGV2Xy0+ZHJpdmVyLAotCSAgICAgICBkZXZfLT5kcml2ZXItPm5hbWUpOwkvKiBWRVJCT1NFL0RFQlVHICovCiAJaWYgKHZpcnRwY2lkcnYpIHsKIAkJLyogVEVNUDogYXNzdW1pbmcgd2UgaGF2ZSBvbmx5IG9uZSBzdWNoIGRyaXZlciBmb3Igbm93ICovCiAJCWlmICh2aXJ0cGNpZHJ2LT5yZW1vdmUpCkBAIC04NzYsMTAgKzc2OCw3IEBACiAJCXZpcnRwY2lkZXYtPm15ZHJpdmVyID0gTlVMTDsKIAl9CiAKLQlEQkdJTkYoImNhbGxpbmcgcHV0ZGV2aWNlXG4iKTsKIAlwdXRfZGV2aWNlKGRldl8pOwotCi0JREJHSU5GKCJMZWF2aW5nXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODg5LDExICs3NzgsNiBAQAogCiBzdGF0aWMgdm9pZCB2aXJ0cGNpX2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQkvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUKLQkgKiBkZXZpY2UgaXMgcmVtb3ZlZAotCSAqLwotCURCR0lORigiSW4gdmlydHBjaV9idXNfcmVsZWFzZVxuIik7Ci0JLyogd2hhdCBlbHNlIGlzIHN1cHBvc2VkIHRvIGhhcHBlbiBoZXJlPyAqLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MTUsMTQgKzc5OSw5IEBACiAJc3RydWN0IHNwYXJfaW9fY2hhbm5lbF9wcm90b2NvbCBfX2lvbWVtICppb19jaGFuID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlMT0dJTkYoInZpcnRwY2lfZGV2aWNlX2FkZCBwYXJlbnRidXM6JXAgY2hhbnB0cjolcFxuIiwgcGFyZW50YnVzLAotCSAgICAgICBhZGRwYXJhbXMtPmNoYW5wdHIpOwotCiAJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gYWRkIGRldmljZTsgZGV2dHlwZTolZCBub3QgdmhiYTolZCBvciB2bmljOiVkXG4iLAotCQkgICAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOwogCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldnR5cGUsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwpAQCAtOTMwLDggKzgwOSw3IEBACiAKIAkvKiBhZGQgYSBWaXJ0dWFsIERldmljZSAqLwogCXZpcnRwY2lkZXYgPSBremFsbG9jKHNpemVvZigqdmlydHBjaWRldiksIEdGUF9BVE9NSUMpOwotCWlmICh2aXJ0cGNpZGV2ID09IE5VTEwpIHsKLQkJTE9HRVJSKCJjYW4ndCBhZGQgZGV2aWNlIC0gbWFsbG9jIEZBTExFRFxuIik7CisJaWYgKCF2aXJ0cGNpZGV2KSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoTUFMTE9DX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwogCX0KQEAgLTk5Myw3ICs4NzEsNiBAQAogCQkgKi8KIAkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnZwY2lkZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJCWtmcmVlKHZpcnRwY2lkZXYpOwotCQlMT0dFUlIoIioqKiogRkFJTEVEIHZoYmEvdm5pYyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdFxuIik7CiAJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTAyNCw4ICs5MDEsNiBAQAogCSogbGlzdC4gT3RoZXJ3aXNlLCBhIGRldmljZV91bnJlZ2lzdGVyIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4KIAkqIGNhdXNlIGEgInNjaGVkdWxpbmcgd2hpbGUgYXRvbWljIi4KIAkqLwotCURCR0lORigicmVnaXN0ZXJpbmcgZGV2aWNlOiVwIHdpdGggYnVzX2lkOiVzXG4iLAotCSAgICAgICAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYsIHZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LmJ1c19pZCk7CiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldik7CiAJLyogTk9URTogVEhJUyBJUyBDQUxMSU5HIEhPVFBMVUcgdmlydHBjaV9ob3RwbHVnISEhCiAJICogVGhpcyBjYWxsIHRvIGRldmljZV9yZWdpc3RlciByZXN1bHRzIGluIHZpcnRwY2lfYnVzX21hdGNoCkBAIC0xMDM3LDcgKzkxMiw2IEBACiAJICogdmlydHBjaV9kZXZpY2VfcHJvYmUgaXMgc3VjY2Vzc2Z1bAogCSAqLwogCWlmIChyZXQpIHsKLQkJTE9HRVJSKCJkZXZpY2VfcmVnaXN0ZXIgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAJCWRldiA9ICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2RldjsKIAkJU1BBUl9DSEFOTkVMX0NMSUVOVF9UUkFOU0lUSU9OKGFkZHBhcmFtcy0+Y2hhbnB0ciwKIAkJCQkJICAgICAgIEJVU19JRChkZXYpLApAQCAtMTA2MCwxMCArOTM0LDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JTE9HSU5GKCJBZGRlZCAlczolZDolZCAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXY6JXBcbiIsCi0JICAgICAgIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgPyAidmlydGhiYSIgOiAidmlydG5pYyIsCi0JICAgICAgIGFkZHBhcmFtcy0+YnVzX25vLCBhZGRwYXJhbXMtPmRldmljZV9ubywKLQkgICAgICAgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2KTsKIAlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCXJldHVybiAxOwogfQpAQCAtMTA4MCwxMSArOTUwLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYyA9IDA7CiAKLQlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gcGF1c2UgZGV2aWNlOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCi0JCSAgICAgICBkZXZ0eXBlLCBWSVJUSEJBX1RZUEUsIFZJUlROSUNfVFlQRSk7CisJaWYgKChkZXZ0eXBlICE9IFZJUlRIQkFfVFlQRSkgJiYgKGRldnR5cGUgIT0gVklSVE5JQ19UWVBFKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogZmluZCB0aGUgdmhiYSBvciB2bmljIGluIHZpcnRwY2kgZGV2aWNlIGxpc3QgKi8KIAl3cml0ZV9sb2NrX2lycXNhdmUoJnZwY2lkZXZfbGlzdF9sb2NrLCBmbGFncyk7CkBAIC0xMTE5LDEwICs5ODYsOCBAQAogCX0KIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmdnBjaWRldl9saXN0X2xvY2ssIGZsYWdzKTsKIAotCWlmICghZm91bmQpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJaWYgKCFmb3VuZCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTEzOSwxMSArMTAwNCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKChkZXZ0eXBlICE9IFZJUlRIQkFfVFlQRSkgJiYgKGRldnR5cGUgIT0gVklSVE5JQ19UWVBFKSkgewotCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIHJlc3VtZSBkZXZpY2U7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKLQkJICAgICAgIGRldnR5cGUsIFZJUlRIQkFfVFlQRSwgVklSVE5JQ19UWVBFKTsKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKQogCQlyZXR1cm4gMDsKLQl9CisKIAogCS8qIGZpbmQgdGhlIHZoYmEgb3Igdm5pYyBpbiB2aXJ0cGNpIGRldmljZSBsaXN0ICovCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZ2cGNpZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtMTE4NywxMCArMTA1MCw4IEBACiAKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmdnBjaWRldl9saXN0X2xvY2ssIGZsYWdzKTsKIAotCWlmICghZm91bmQpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJaWYgKCFmb3VuZCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTIwOSwxNyArMTA3MCwxNCBAQAogCWNvbnRpbnVlOyBcCiB9CiAKLQlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZGVsZXRlIGRldmljZTsgZGV2dHlwZTolZCBub3QgdmhiYTolZCBvciB2bmljOiVkXG4iLAotCQkgICAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpCiAJCXJldHVybiAwOwotCX0KIAogCS8qIHNlZSBpZiB3ZSBhcmUgdG8gZGVsZXRlIGFsbCAtIE5PVEU6IGFsbCBpbXBsaWVzIHdlIGhhdmUgYQogCSAqIHZhbGlkIHBhcmVudGJ1cwogCSAqLwotCWFsbCA9ICgoZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpICYmICh3d25uID09IE5VTEwpKSB8fAotCSAgICAoKGRldnR5cGUgPT0gVklSVE5JQ19UWVBFKSAmJiAobWFjYWRkciA9PSBOVUxMKSk7CisJYWxsID0gKChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgJiYgKCF3d25uKSkgfHwKKwkgICAgKChkZXZ0eXBlID09IFZJUlROSUNfVFlQRSkgJiYgKCFtYWNhZGRyKSk7CiAKIAkvKiBmaW5kIGFsbCB0aGUgdmhiYSBvciB2bmljIG9yIGJvdGggaW4gdmlydHBjaSBkZXZpY2UgbGlzdAogCSoga2VlcCBsaXN0IG9mIG9uZXMgd2UgYXJlIGRlbGV0aW5nIHNvIHdlIGNhbiBjYWxsCkBAIC0xMjgwLDEwICsxMTM4LDggQEAKIAl9CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnZwY2lkZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAKLQlpZiAoIWFsbCAmJiAoY291bnQgPT0gMCkpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJaWYgKCFhbGwgJiYgKGNvdW50ID09IDApKQogCQlyZXR1cm4gMDsKLQl9CiAKIAkvKiBub3cgZGVsZXRlIGVhY2ggb25lIGZyb20gZGVsZXRlIGxpc3QgKi8KIAl3aGlsZSAoZGVsbGlzdCkgewpAQCAtMTMwMyw3ICsxMTU5LDYgQEAKIAkvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUKIAkgKiBkZXZpY2UgaXMgcmVtb3ZlZAogCSAqLwotCUxPR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcmVsZWFzZTolcCAtIE5PVCBZRVQgSU1QTEVNRU5URURcbiIsIGRldl8pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzI0LDggKzExNzksNiBAQAogCXN0cnVjdCBkcml2ZXJfcHJpdmF0ZSAqZHByaXZhdGUgPSB0b19kcml2ZXIoa29iaik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciA9IGRwcml2YXRlLT5kcml2ZXI7CiAKLQlEQkdJTkYoIkluIHZpcnRwY2lfZHJpdmVyX2F0dHJfc2hvdyBkcml2ZXItPm5hbWU6JXNcbiIsCWRyaXZlci0+bmFtZSk7Ci0KIAlpZiAoZGF0dHItPnNob3cpCiAJCXJldCA9IGRhdHRyLT5zaG93KGRyaXZlciwgYnVmKTsKIApAQCAtMTM0Miw4ICsxMTk1LDYgQEAKIAlzdHJ1Y3QgZHJpdmVyX3ByaXZhdGUgKmRwcml2YXRlID0gdG9fZHJpdmVyKGtvYmopOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIgPSBkcHJpdmF0ZS0+ZHJpdmVyOwogCi0JREJHSU5GKCJJbiB2aXJ0cGNpX2RyaXZlcl9hdHRyX3N0b3JlIGRyaXZlci0+bmFtZTolc1xuIiwgZHJpdmVyLT5uYW1lKTsKLQogCWlmIChkYXR0ci0+c3RvcmUpCiAJCXJldCA9IGRhdHRyLT5zdG9yZShkcml2ZXIsIGJ1ZiwgY291bnQpOwogCkBAIC0xMzU1LDEyICsxMjA2LDggQEAKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCURCR0lORigiSW4gdmlydHBjaV9yZWdpc3Rlcl9kcml2ZXJcbiIpOwotCi0JaWYgKGRydi0+aWRfdGFibGUgPT0gTlVMTCkgewotCQlMT0dFUlIoImlkX3RhYmxlIG1pc3NpbmdcbiIpOworCWlmICghZHJ2LT5pZF90YWJsZSkKIAkJcmV0dXJuIDE7Ci0JfQogCS8qIGluaXRpYWxpemUgY29yZSBkcml2ZXIgZmllbGRzIG5lZWRlZCB0byBjYWxsIGRyaXZlcl9yZWdpc3RlciAqLwogCWRydi0+Y29yZV9kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsJLyogbmFtZSBvZiBkcml2ZXIgaW4gc3lzZnMgKi8KIAlkcnYtPmNvcmVfZHJpdmVyLmJ1cyA9ICZ2aXJ0cGNpX2J1c190eXBlOwkvKiB0eXBlIG9mIGJ1cyB0aGlzCkBAIC0xMzg5LDcgKzEyMzYsNiBAQAogCiB2b2lkIHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpcnRwY2lfZHJpdmVyICpkcnYpCiB7Ci0JREJHSU5GKCJJbiB2aXJ0cGNpX3VucmVnaXN0ZXJfZHJpdmVyIGRydjolcFxuIiwgZHJ2KTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5jb3JlX2RyaXZlcik7CiAJLyogZHJpdmVyX3VucmVnaXN0ZXIgY2FsbHMgYnVzX3JlbW92ZV9kcml2ZXIKIAkgKiBidXNfcmVtb3ZlX2RyaXZlciBjYWxscyBkZXZpY2VfZGV0YWNoCkBAIC0xMzk5LDcgKzEyNDUsNiBAQAogCSAqIHZpcnRwY2lfZGV2aWNlX3JlbW92ZQogCSAqIHZpcnRwY2lfZGV2aWNlX3JlbW92ZSBjYWxscyB2aXJ0aGJhX3JlbW92ZQogCSAqLwotCURCR0lORigiTGVhdmluZ1xuIik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXJ0cGNpX3VucmVnaXN0ZXJfZHJpdmVyKTsKIApAQCAtMTQ0Miw5ICsxMjg3LDggQEAKIAlwcmludHBhcmFtLnN0cl9wb3MgPSAmc3RyX3BvczsKIAlwcmludHBhcmFtLmJ1ZiA9IHZidWY7CiAJcHJpbnRwYXJhbS5sZW4gPSAmbGVuOwotCWlmIChidXNfZm9yX2VhY2hfZGV2KCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAotCQkJICAgICAodm9pZCAqKSZwcmludHBhcmFtLCBwcmludF92YnVzKSkKLQkJTE9HRVJSKCJGYWlsZWQgdG8gZmluZCBidXNcbiIpOworCWJ1c19mb3JfZWFjaF9kZXYoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsICh2b2lkICopJnByaW50cGFyYW0sCisJCQkgcHJpbnRfdmJ1cyk7CiAKIAlzdHJfcG9zICs9IHNjbnByaW50Zih2YnVmICsgc3RyX3BvcywgbGVuIC0gc3RyX3BvcywKIAkJCSJcbiBWaXJ0dWFsIFBDSSBkZXZpY2VzXG4iKTsKQEAgLTE0NjQsMTUgKzEzMDgsMTAgQEAKIAkJCQkJdG1wdnBjaWRldi0+c2NzaS5tYXguY21kX3Blcl9sdW4pOwogCQl9IGVsc2UgewogCQkJc3RyX3BvcyArPSBzY25wcmludGYodmJ1ZiArIHN0cl9wb3MsIGxlbiAtIHN0cl9wb3MsCi0JCQkJCSJbJWQ6JWRdIFZOaWM6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggbnVtX3Jjdl9idWZzOiVkIG10dTolZCIsCisJCQkJCSJbJWQ6JWRdIFZOaWM6JXBNIG51bV9yY3ZfYnVmczolZCBtdHU6JWQiLAogCQkJCQl0bXB2cGNpZGV2LT5idXNfbm8sCiAJCQkJCXRtcHZwY2lkZXYtPmRldmljZV9ubywKLQkJCQkJdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzBdLAotCQkJCQl0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbMV0sCi0JCQkJCXRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkclsyXSwKLQkJCQkJdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzNdLAotCQkJCQl0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbNF0sCi0JCQkJCXRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkcls1XSwKKwkJCQkJdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyLAogCQkJCQl0bXB2cGNpZGV2LT5uZXQubnVtX3Jjdl9idWZzLAogCQkJCQl0bXB2cGNpZGV2LT5uZXQubXR1KTsKIAkJfQpAQCAtMTUwNyw1OCArMTM0Niw0NCBAQAogCSAqIGRyaXZlcnMgZGlyZWN0b3J5CiAJICovCiAJaWYgKHJldCkgewotCQlMT0dFUlIoImJ1c19yZWdpc3RlciAqKioqRkFJTEVEOiVkXG4iLCByZXQpOwogCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIHJldCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JREJHSU5GKCJidXNfcmVnaXN0ZXIgc3VjY2Vzc2Z1bFxuIik7CiAJYnVzX2RldmljZV9pbmZvX2luaXQoJmJ1c19kcml2ZXJfaW5mbywgImNsaWVudGJ1cyIsICJ2aXJ0cGNpIiwKIAkJCSAgICAgVkVSU0lPTiwgTlVMTCk7CiAKIAkvKiBjcmVhdGUgYSByb290IGJ1cyB1c2VkIHRvIHBhcmVudCBhbGwgdGhlIHZpcnRwY2kgYnVzZXMuICovCiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKIAlpZiAocmV0KSB7Ci0JCUxPR0VSUigiZGV2aWNlX3JlZ2lzdGVyIEZBSUxFRDolZFxuIiwgcmV0KTsKIAkJYnVzX3VucmVnaXN0ZXIoJnZpcnRwY2lfYnVzX3R5cGUpOwogCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIHJldCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JREJHSU5GKCJkZXZpY2VfcmVnaXN0ZXIgc3VjY2Vzc2Z1bCByZXQ6JXhcbiIsIHJldCk7CiAKIAlpZiAoIXVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIoMiwgKHZvaWQgKikmdmlydHBjaV9jdHJsY2hhbl9mdW5jLAogCQkJCQkgICZjaGlwc2V0X2RyaXZlcl9pbmZvKSkgewotCQlMT0dFUlIoInVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIgKioqKkZBSUxFRC5cbiIpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKIAkJYnVzX3VucmVnaXN0ZXIoJnZpcnRwY2lfYnVzX3R5cGUpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JTE9HSU5GKCJzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCB2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMgKDB4JXApIGFzIGNhbGxiYWNrLlxuIiwKLQkgICAgICAgKHZvaWQgKikmdmlydHBjaV9jdHJsY2hhbl9mdW5jKTsKIAkvKiBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkgYW5kIGluZm8gZmlsZSBpbnNpZGUuICovCiAJdmlydHBjaV9kZWJ1Z2ZzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigidmlydHBjaSIsIE5VTEwpOwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImluZm8iLCBTX0lSVVNSLCB2aXJ0cGNpX2RlYnVnZnNfZGlyLAogCQkJICAgIE5VTEwsICZkZWJ1Z2ZzX2luZm9fZm9wcyk7Ci0JTE9HSU5GKCJMZWF2aW5nXG4iKTsKIAlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdmlydHBjaV9tb2RfZXhpdCh2b2lkKQogewotCUxPR0lORigidmlydHBjaV9tb2RfZXhpdC4uLlxuIik7Ci0KIAkvKiB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotCWlmICghdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcigyLCBOVUxMLCBOVUxMKSkKLQkJTE9HRVJSKCJ1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyICoqKipGQUlMRUQuXG4iKTsKLQogCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKIAlidXNfdW5yZWdpc3RlcigmdmlydHBjaV9idXNfdHlwZSk7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHZpcnRwY2lfZGVidWdmc19kaXIpOwotCUxPR0lORigiTGVhdmluZ1xuIik7CiB9CiAKIG1vZHVsZV9pbml0KHZpcnRwY2lfbW9kX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL0tjb25maWcKaW5kZXggNDFjM2I0Yi4uOGQzMWJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9LY29uZmlnCkBAIC00LDcgKzQsNyBAQAogCiBjb25maWcgVU5JU1lTX1ZJU09SQ0hBTk5FTAogCXRyaXN0YXRlICJVbmlzeXMgdmlzb3JjaGFubmVsIGRyaXZlciIKLQlkZXBlbmRzIG9uIFVOSVNZU1NQQVIgJiYgVU5JU1lTX1ZJU09SVVRJTAorCXNlbGVjdCBVTklTWVNfVklTT1JVVElMCiAJLS0taGVscC0tLQogCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB2aXNvcmNoYW5uZWwgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmgKaW5kZXggNTgxZWQ4My4uMGVkOGUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvZ2xvYmFscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL2dsb2JhbHMuaApAQCAtMTgsNyArMTgsNiBAQAogI2lmbmRlZiBfX1ZJU09SQ0hBTk5FTF9HTE9CQUxTX0hfXwogI2RlZmluZSBfX1ZJU09SQ0hBTk5FTF9HTE9CQUxTX0hfXwogCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInRpbXNrbW9kLmgiCiAjaW5jbHVkZSAibWVtcmVnaW9uLmgiCiAjaW5jbHVkZSAidmVyc2lvbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvdmlzb3JjaGFubmVsX2Z1bmNzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYwppbmRleCAwMTg4ZWY4Li43YTlhNzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYwpAQCAtNTgsOCArNTgsNyBAQAogCXZvaWQgKnJjID0gTlVMTDsKIAogCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlFUlJEUlYoImFsbG9jYXRpb24gZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKKwlpZiAoIXApIHsKIAkJcmMgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtNjksNyArNjgsNyBAQAogCXNwaW5fbG9ja19pbml0KCZwLT5yZW1vdmVfbG9jayk7CiAKIAkvKiBwcmVwYXJlIGNoYW5faGRyIChhYnN0cmFjdGlvbiB0byByZWFkL3dyaXRlIGNoYW5uZWwgbWVtb3J5KSAqLwotCWlmIChwYXJlbnQgPT0gTlVMTCkKKwlpZiAoIXBhcmVudCkKIAkJcC0+bWVtcmVnaW9uID0KIAkJICAgIHZpc29yX21lbXJlZ2lvbl9jcmVhdGUocGh5c2FkZHIsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpKTsKQEAgLTc3LDE0ICs3NiwxMiBAQAogCQlwLT5tZW1yZWdpb24gPQogCQkgICAgdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZV9vdmVybGFwcGVkKHBhcmVudC0+bWVtcmVnaW9uLAogCQkJCW9mZiwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpOwotCWlmIChwLT5tZW1yZWdpb24gPT0gTlVMTCkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9jcmVhdGUgZmFpbGVkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CisJaWYgKCFwLT5tZW1yZWdpb24pIHsKIAkJcmMgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChwLT5tZW1yZWdpb24sIDAsICZwLT5jaGFuX2hkciwKIAkJCQkgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpIDwgMCkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CiAJCXJjID0gTlVMTDsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTk1LDcgKzkyLDYgQEAKIAkJLyogd2UgaGFkIGJldHRlciBiZSBhIENMSUVOVCBvZiB0aGlzIGNoYW5uZWwgKi8KIAkJZ3VpZCA9IHAtPmNoYW5faGRyLmNodHlwZTsKIAlpZiAodmlzb3JfbWVtcmVnaW9uX3Jlc2l6ZShwLT5tZW1yZWdpb24sIGNoYW5uZWxfYnl0ZXMpIDwgMCkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZXNpemUgZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKIAkJcmMgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMTA1LDggKzEwMSw4IEBACiAJcmMgPSBwOwogY2xlYW51cDoKIAotCWlmIChyYyA9PSBOVUxMKSB7Ci0JCWlmIChwICE9IE5VTEwpIHsKKwlpZiAoIXJjKSB7CisJCWlmICghcCkgewogCQkJdmlzb3JjaGFubmVsX2Rlc3Ryb3kocCk7CiAJCQlwID0gTlVMTDsKIAkJfQpAQCAtMTU0LDkgKzE1MCw5IEBACiB2b2lkCiB2aXNvcmNoYW5uZWxfZGVzdHJveShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQogewotCWlmIChjaGFubmVsID09IE5VTEwpCisJaWYgKCFjaGFubmVsKQogCQlyZXR1cm47Ci0JaWYgKGNoYW5uZWwtPm1lbXJlZ2lvbiAhPSBOVUxMKSB7CisJaWYgKGNoYW5uZWwtPm1lbXJlZ2lvbikgewogCQl2aXNvcl9tZW1yZWdpb25fZGVzdHJveShjaGFubmVsLT5tZW1yZWdpb24pOwogCQljaGFubmVsLT5tZW1yZWdpb24gPSBOVUxMOwogCX0KQEAgLTI1NiwxMCArMjUyLDkgQEAKIAlpbnQgd3JpdHRlbiA9IDA7CiAJdTggKmJ1ZiA9IHZtYWxsb2MoYnVmc2l6ZSk7CiAKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyBmYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24iLCBfX2Z1bmNfXyk7CisJaWYgKCFidWYpCiAJCWdvdG8gY2xlYW51cDsKLQl9CisKIAltZW1zZXQoYnVmLCBjaCwgYnVmc2l6ZSk7CiAJd2hpbGUgKG5ieXRlcyA+IDApIHsKIAkJdWxvbmcgdGhpc2J5dGVzID0gYnVmc2l6ZTsKQEAgLTI3OSw3ICsyNzQsNyBAQAogCXJjID0gMDsKIAogY2xlYW51cDoKLQlpZiAoYnVmICE9IE5VTEwpIHsKKwlpZiAoYnVmKSB7CiAJCXZmcmVlKGJ1Zik7CiAJCWJ1ZiA9IE5VTEw7CiAJfQpAQCAtMzI0LDEwICszMTksOCBAQAogewogCUJPT0wgcmMgPSBGQUxTRTsKIAotCWlmIChjaGFubmVsLT5jaGFuX2hkci5jaF9zcGFjZV9vZmZzZXQgPCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSkgewotCQlFUlJEUlYoIm9DaGFubmVsU3BhY2UgdG9vIHNtYWxsOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCWlmIChjaGFubmVsLT5jaGFuX2hkci5jaF9zcGFjZV9vZmZzZXQgPCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSkKIAkJZ290byBjbGVhbnVwOwotCX0KIAogCS8qIFJlYWQgdGhlIGFwcHJvcHJpYXRlIFNJR05BTF9RVUVVRV9IRUFERVIgaW50byBsb2NhbCBtZW1vcnkuICovCiAKQEAgLTMzNSwxMCArMzI4LDYgQEAKIAkJCQkgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSwKIAkJCQkgc2lnX2hkciwKIAkJCQkgc2l6ZW9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyKSkgPCAwKSB7Ci0JCUVSUkRSVigicXVldWU9JWQgU0lHX1FVRVVFX09GRlNFVD0lZCIsCi0JCSAgICAgICBxdWV1ZSwgKGludClTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpKTsKLQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBvZiBzaWduYWwgcXVldWUgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwKLQkJICAgICAgIHJjKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAlyYyA9IFRSVUU7CkBAIC0zNTgsMTUgKzM0NywxMSBAQAogCQlpZiAodmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwKIAkJCQkJICBzaWduYWxfZGF0YV9vZmZzZXQsCiAJCQkJCSAgZGF0YSwgc2lnX2hkci0+c2lnbmFsX3NpemUpIDwgMCkgewotCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2Ygc2lnbmFsIGRhdGEgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwKLQkJCSAgICAgICByYyk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAodmlzb3JfbWVtcmVnaW9uX3JlYWQoY2hhbm5lbC0+bWVtcmVnaW9uLCBzaWduYWxfZGF0YV9vZmZzZXQsCiAJCQkJCSBkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSkgPCAwKSB7Ci0JCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIG9mIHNpZ25hbCBkYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsCi0JCQkgICAgICAgcmMpOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAJfQpAQCAtNDA0LDggKzM4OSw2IEBACiAJCXB1bnNhZmVfc3FoLT5oZWFkID0gKnBoZWFkOwogCQlwdW5zYWZlX3NxaC0+dGFpbCA9ICpwdGFpbDsKIAotCQlFUlJEUlYoInNhZmVfc2lnX3F1ZXVlX3ZhbGlkYXRlOiBoZWFkID0gMHgleCwgdGFpbCA9IDB4JXgsIE1heFNsb3RzID0gMHgleCIsCi0JCSAgICAgICAqcGhlYWQsICpwdGFpbCwgcHNhZmVfc3FoLT5tYXhfc2xvdHMpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC00MTYsMTUgKzM5OSwxMyBAQAogewogCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7CiAKLQlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKSB7CisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKIAkJcmV0dXJuIEZBTFNFOwkvKiBubyBzaWduYWxzIHRvIHJlbW92ZSAqLwogCiAJc2lnX2hkci50YWlsID0gKHNpZ19oZHIudGFpbCArIDEpICUgc2lnX2hkci5tYXhfc2xvdHM7CiAJaWYgKCFzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci50YWlsLCBtc2cpKSB7Ci0JCUVSUkRSVigic2lnX3JlYWRfZGF0YSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCXNpZ19oZHIubnVtX3JlY2VpdmVkKys7CkBAIC00MzMsMTQgKzQxNCwxMCBAQAogCSAqIHVwZGF0ZSBob3N0IG1lbW9yeS4KIAkgKi8KIAltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLwotCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgdGFpbCkpIHsKLQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgVGFpbCBmYWlsZWRcbiIpOworCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgdGFpbCkpCiAJCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBudW1fcmVjZWl2ZWQpKSB7Ci0JCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIE51bVNpZ25hbHNSZWNlaXZlZCBmYWlsZWRcbiIpOworCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgbnVtX3JlY2VpdmVkKSkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtNDY2LDM1ICs0NDMsMzQgQEAKIHsKIAlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOwogCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkgeworCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCiAJCXJldHVybiBGQUxTRTsKLQl9CiAKIAlzaWdfaGRyLmhlYWQgPSAoKHNpZ19oZHIuaGVhZCArIDEpICUgc2lnX2hkci5tYXhfc2xvdHMpOwogCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKSB7CiAJCXNpZ19oZHIubnVtX292ZXJmbG93cysrOwotCQlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIG51bV9vdmVyZmxvd3MpKQotCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtT3ZlcmZsb3dzIGZhaWxlZFxuIik7Ci0KKwkJdmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwKKwkJCQkgICAgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwKKwkJCQkJCSAgICAgICBxdWV1ZSkgKworCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyLAorCQkJCQkgICAgICAgbnVtX292ZXJmbG93cyksCisJCQkJICAgICAgJihzaWdfaGRyLm51bV9vdmVyZmxvd3MpLAorCQkJCSAgICAgIHNpemVvZihzaWdfaGRyLm51bV9vdmVyZmxvd3MpKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmICghc2lnX3dyaXRlX2RhdGEoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBzaWdfaGRyLmhlYWQsIG1zZykpIHsKLQkJRVJSRFJWKCJzaWdfd3JpdGVfZGF0YSBmYWlsZWRcbiIpOworCWlmICghc2lnX3dyaXRlX2RhdGEoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBzaWdfaGRyLmhlYWQsIG1zZykpCiAJCXJldHVybiBGQUxTRTsKLQl9CisKIAlzaWdfaGRyLm51bV9zZW50Kys7CiAKIAkvKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCiAJICogdXBkYXRlIGhvc3QgbWVtb3J5LgogCSAqLwogCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCi0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBoZWFkKSkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBIZWFkIGZhaWxlZFxuIik7CisJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBoZWFkKSkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIG51bV9zZW50KSkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBOdW1TaWduYWxzU2VudCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCkBAIC01ODQsMTUgKzU2MCwxMiBAQAogCWludCBpID0gMDsKIAlpbnQgZXJyY29kZSA9IDA7CiAKLQlpZiAoY2hhbm5lbCA9PSBOVUxMKSB7Ci0JCUVSUkRSVigiJXMgbm8gY2hhbm5lbCIsIF9fZnVuY19fKTsKKwlpZiAoIWNoYW5uZWwpCiAJCXJldHVybjsKLQl9CiAJbWVtcmVnaW9uID0gY2hhbm5lbC0+bWVtcmVnaW9uOwotCWlmIChtZW1yZWdpb24gPT0gTlVMTCkgewotCQlFUlJEUlYoIiVzIG5vIG1lbXJlZ2lvbiIsIF9fZnVuY19fKTsKKwlpZiAoIW1lbXJlZ2lvbikKIAkJcmV0dXJuOwotCX0KKwogCWFkZHIgPSB2aXNvcl9tZW1yZWdpb25fZ2V0X3BoeXNhZGRyKG1lbXJlZ2lvbik7CiAJbmJ5dGVzX3JlZ2lvbiA9IHZpc29yX21lbXJlZ2lvbl9nZXRfbmJ5dGVzKG1lbXJlZ2lvbik7CiAJZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIG9mZiwKQEAgLTY3MiwxMSArNjQ1LDggQEAKIAkJZ290byBmbXRfZmFpbGVkOwogCiAJZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW4sIG9mZiwgYnVmLCBsZW4pOwotCWlmIChlcnJjb2RlIDwgMCkgewotCQlFUlJEUlYoIiVzIGZhaWxlZCB0byByZWFkICVzIGZyb20gY2hhbm5lbCBlcnJjb2RlPSVkIiwKLQkJICAgICAgIHMsIF9fZnVuY19fLCBlcnJjb2RlKTsKKwlpZiAoZXJyY29kZSA8IDApCiAJCWdvdG8gcmVhZF9mYWlsZWQ7Ci0JfQogCXNlcV9wcmludGYoc2VxLCAiY2hhbm5lbCAlczpcbiIsIHMpOwogCXRidWYgPSBidWY7CiAJd2hpbGUgKGxlbiA+IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfbWFpbi5jCmluZGV4IGY0YmUyZTYuLjc4N2Q0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvdmlzb3JjaGFubmVsX21haW4uYwpAQCAtMzIsMTQgKzMyLDEyIEBACiAJaWYgKCF1bmlzeXNfc3Bhcl9wbGF0Zm9ybSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlJTkZPRFJWKCJkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWQiLCBWRVJTSU9OKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIHZpc29yY2hhbm5lbF9leGl0KHZvaWQpCiB7Ci0JSU5GT0RSVigiZHJpdmVyIHVubG9hZGVkIik7CiB9CiAKIG1vZHVsZV9pbml0KHZpc29yY2hhbm5lbF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9LY29uZmlnCmluZGV4IGU4NjgzNmYuLmIwM2JmYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvS2NvbmZpZwpAQCAtNCw3ICs0LDggQEAKIAogY29uZmlnIFVOSVNZU19WSVNPUkNISVBTRVQKIAl0cmlzdGF0ZSAiVW5pc3lzIHZpc29yY2hpcHNldCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19WSVNPUlVUSUwgJiYgVU5JU1lTX1ZJU09SQ0hBTk5FTCAmJiBIQVNfSU9NRU0KKwlzZWxlY3QgVU5JU1lTX1ZJU09SVVRJTAorCXNlbGVjdCBVTklTWVNfVklTT1JDSEFOTkVMCiAJLS0taGVscC0tLQogCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB2aXNvcmNoaXBzZXQgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmMKaW5kZXggZTUxZmQ0ZS4uMjAzZGUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuYwpAQCAtMzAsMTMgKzMwLDk3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2RldiBmaWxlX2NkZXY7CiBzdGF0aWMgc3RydWN0IHZpc29yY2hhbm5lbCAqKmZpbGVfY29udHJvbHZtX2NoYW5uZWw7Ci1zdGF0aWMgZGV2X3QgbWFqb3JkZXYgPSAtMTsgLyoqPCBpbmRpY2F0ZXMgbWFqb3IgbnVtIGZvciBkZXZpY2UgKi8KLXN0YXRpYyBCT09MIHJlZ2lzdGVyZWQgPSBGQUxTRTsKIAotc3RhdGljIGludCB2aXNvcmNoaXBzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IHZpc29yY2hpcHNldF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgdmlzb3JjaGlwc2V0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLWxvbmcgdmlzb3JjaGlwc2V0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Cit2b2lkCit2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKGRldl90IG1ham9yX2RldikKK3sKKwlpZiAoZmlsZV9jZGV2Lm9wcyAhPSBOVUxMKQorCQljZGV2X2RlbCgmZmlsZV9jZGV2KTsKKwlmaWxlX2NkZXYub3BzID0gTlVMTDsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24obWFqb3JfZGV2LCAxKTsKK30KKworc3RhdGljIGludAordmlzb3JjaGlwc2V0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgbWlub3JfbnVtYmVyID0gaW1pbm9yKGlub2RlKTsKKworCWlmIChtaW5vcl9udW1iZXIgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmlzb3JjaGlwc2V0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Zpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bG9uZyBwaHlzYWRkciA9IDA7CisJdWxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgYWRkciA9IDA7CisKKwkvKiBzdl9lbmFibGVfZGZwKCk7ICovCisJaWYgKG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKSkKKwkJcmV0dXJuIC1FTlhJTzsJLyogbmVlZCBhbGlnbmVkIG9mZnNldHMgKi8KKworCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSBWSVNPUkNISVBTRVRfTU1BUF9DT05UUk9MQ0hBTk9GRlNFVDoKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwkJaWYgKCpmaWxlX2NvbnRyb2x2bV9jaGFubmVsID09IE5VTEwpIHsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwkJdmlzb3JjaGFubmVsX3JlYWQoKmZpbGVfY29udHJvbHZtX2NoYW5uZWwsCisJCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCQkgZ3BfY29udHJvbF9jaGFubmVsKSwKKwkJCSZhZGRyLCBzaXplb2YoYWRkcikpOworCQlpZiAoYWRkciA9PSAwKSB7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXBoeXNhZGRyID0gKHVsb25nKWFkZHI7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICBwaHlzYWRkciA+PiBQQUdFX1NISUZULAorCQkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgIC8qcGdwcm90X25vbmNhY2hlZCAqLworCQkJCSAgICAodm1hLT52bV9wYWdlX3Byb3QpKSkgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyB2aXNvcmNoaXBzZXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJczY0IGFkanVzdG1lbnQ7CisJczY0IHZydGNfb2Zmc2V0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUOgorCQkvKiBnZXQgdGhlIHBoeXNpY2FsIHJ0YyBvZmZzZXQgKi8KKwkJdnJ0Y19vZmZzZXQgPSBpc3N1ZV92bWNhbGxfcXVlcnlfZ3Vlc3RfdmlydHVhbF90aW1lX29mZnNldCgpOworCQlpZiAoY29weV90b191c2VyCisJCSAgICAoKHZvaWQgX191c2VyICopYXJnLCAmdnJ0Y19vZmZzZXQsIHNpemVvZih2cnRjX29mZnNldCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gU1VDQ0VTUzsKKwljYXNlIFZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmFkanVzdG1lbnQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGFkanVzdG1lbnQpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIGlzc3VlX3ZtY2FsbF91cGRhdGVfcGh5c2ljYWxfdGltZShhZGp1c3RtZW50KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9Cit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpc29yY2hpcHNldF9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtNTQsMTQ0ICsxMzgsMjMgQEAKIAlpbnQgcmMgPSAwOwogCiAJZmlsZV9jb250cm9sdm1fY2hhbm5lbCA9IGNvbnRyb2x2bV9jaGFubmVsOwotCW1ham9yZGV2ID0gbWFqb3JfZGV2OwogCWNkZXZfaW5pdCgmZmlsZV9jZGV2LCAmdmlzb3JjaGlwc2V0X2ZvcHMpOwogCWZpbGVfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwotCWlmIChNQUpPUihtYWpvcmRldikgPT0gMCkgeworCWlmIChNQUpPUihtYWpvcl9kZXYpID09IDApIHsKKwkJcmMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZtYWpvcl9kZXYsIDAsIDEsIE1ZRFJWTkFNRSk7CiAJCS8qIGR5bmFtaWMgbWFqb3IgZGV2aWNlIG51bWJlciByZWdpc3RyYXRpb24gcmVxdWlyZWQgKi8KLQkJaWYgKGFsbG9jX2NocmRldl9yZWdpb24oJm1ham9yZGV2LCAwLCAxLCBNWURSVk5BTUUpIDwgMCkgewotCQkJRVJSRFJWKCJVbmFibGUgdG8gYWxsb2NhdGUrcmVnaXN0ZXIgY2hhciBkZXZpY2UgJXMiLAotCQkJICAgICAgIE1ZRFJWTkFNRSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCUlORk9EUlYoIk5ldyBtYWpvciBudW1iZXIgJWQgcmVnaXN0ZXJlZFxuIiwgTUFKT1IobWFqb3JkZXYpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKIAl9IGVsc2UgewogCQkvKiBzdGF0aWMgbWFqb3IgZGV2aWNlIG51bWJlciByZWdpc3RyYXRpb24gcmVxdWlyZWQgKi8KLQkJaWYgKHJlZ2lzdGVyX2NocmRldl9yZWdpb24obWFqb3JkZXYsIDEsIE1ZRFJWTkFNRSkgPCAwKSB7Ci0JCQlFUlJEUlYoIlVuYWJsZSB0byByZWdpc3RlciBjaGFyIGRldmljZSAlcyIsIE1ZRFJWTkFNRSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCUlORk9EUlYoIlN0YXRpYyBtYWpvciBudW1iZXIgJWQgcmVnaXN0ZXJlZFxuIiwgTUFKT1IobWFqb3JkZXYpKTsKKwkJcmMgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKG1ham9yX2RldiwgMSwgTVlEUlZOQU1FKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKIAl9Ci0JcmMgPSBjZGV2X2FkZCgmZmlsZV9jZGV2LCBNS0RFVihNQUpPUihtYWpvcmRldiksIDApLCAxKTsKLQlpZiAocmMgIDwgMCkgewotCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgY2hhciBkZXZpY2U6IChzdGF0dXM9JWQpXG4iLCByYyk7Ci0JCXJldHVybiAtMTsKKwlyYyA9IGNkZXZfYWRkKCZmaWxlX2NkZXYsIE1LREVWKE1BSk9SKG1ham9yX2RldiksIDApLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvcl9kZXYsIDEpOworCQlyZXR1cm4gcmM7CiAJfQotCUlORk9EUlYoIlJlZ2lzdGVyZWQgY2hhciBkZXZpY2UgZm9yICVzIChtYWpvcj0lZCkiLAotCQlNWURSVk5BTUUsIE1BSk9SKG1ham9yZGV2KSk7CiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQKLXZpc29yY2hpcHNldF9maWxlX2NsZWFudXAodm9pZCkKLXsKLQlpZiAoZmlsZV9jZGV2Lm9wcyAhPSBOVUxMKQotCQljZGV2X2RlbCgmZmlsZV9jZGV2KTsKLQlmaWxlX2NkZXYub3BzID0gTlVMTDsKLQlpZiAocmVnaXN0ZXJlZCkgewotCQlpZiAoTUFKT1IobWFqb3JkZXYpID49IDApIHsKLQkJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvcmRldiwgMSk7Ci0JCQltYWpvcmRldiA9IE1LREVWKDAsIDApOwotCQl9Ci0JCXJlZ2lzdGVyZWQgPSBGQUxTRTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLXZpc29yY2hpcHNldF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXVuc2lnbmVkIG1pbm9yX251bWJlciA9IGltaW5vcihpbm9kZSk7Ci0KLQlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7Ci0JaWYgKG1pbm9yX251bWJlciAhPSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci12aXNvcmNoaXBzZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXZpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQl1bG9uZyBwaHlzYWRkciA9IDA7Ci0JdWxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgYWRkciA9IDA7Ci0KLQkvKiBzdl9lbmFibGVfZGZwKCk7ICovCi0JREVCVUdEUlYoIiVzIiwgX19mdW5jX18pOwotCWlmIChvZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSkpIHsKLQkJRVJSRFJWKCIlcyB2aXJ0dWFsIGFkZHJlc3MgTk9UIHBhZ2UtYWxpZ25lZCEiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5YSU87CS8qIG5lZWQgYWxpZ25lZCBvZmZzZXRzICovCi0JfQotCXN3aXRjaCAob2Zmc2V0KSB7Ci0JY2FzZSBWSVNPUkNISVBTRVRfTU1BUF9DT05UUk9MQ0hBTk9GRlNFVDoKLQkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKLQkJaWYgKCpmaWxlX2NvbnRyb2x2bV9jaGFubmVsID09IE5VTEwpIHsKLQkJCUVSUkRSVigiJXMgbm8gY29udHJvbHZtIGNoYW5uZWwgeWV0IiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCQl2aXNvcmNoYW5uZWxfcmVhZCgqZmlsZV9jb250cm9sdm1fY2hhbm5lbCwKLQkJCW9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSBncF9jb250cm9sX2NoYW5uZWwpLAotCQkJJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0JCWlmIChhZGRyID09IDApIHsKLQkJCUVSUkRSVigiJXMgY29udHJvbCBjaGFubmVsIGFkZHJlc3MgaXMgMCIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQkJcGh5c2FkZHIgPSAodWxvbmcpYWRkcjsKLQkJREVCVUdEUlYoIm1hcHBpbmcgcGh5c2ljYWwgYWRkcmVzcyA9IDB4JWx4IiwgcGh5c2FkZHIpOwotCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKLQkJCQkgICAgcGh5c2FkZHIgPj4gUEFHRV9TSElGVCwKLQkJCQkgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAotCQkJCSAgICAvKnBncHJvdF9ub25jYWNoZWQgKi8KLQkJCQkgICAgKHZtYS0+dm1fcGFnZV9wcm90KSkpIHsKLQkJCUVSUkRSVigiJXMgcmVtYXBfcGZuX3JhbmdlIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQlERUJVR0RSVigiJXMgc3VjY2VzcyEiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWxvbmcgdmlzb3JjaGlwc2V0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzNjQgYWRqdXN0bWVudDsKLQlzNjQgdnJ0Y19vZmZzZXQ7Ci0KLQlEQkdJTkYoImVudGVyZWQgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQiLCBjbWQpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVDoKLQkJLyogZ2V0IHRoZSBwaHlzaWNhbCBydGMgb2Zmc2V0ICovCi0JCXZydGNfb2Zmc2V0ID0gaXNzdWVfdm1jYWxsX3F1ZXJ5X2d1ZXN0X3ZpcnR1YWxfdGltZV9vZmZzZXQoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcgotCQkgICAgKCh2b2lkIF9fdXNlciAqKWFyZywgJnZydGNfb2Zmc2V0LCBzaXplb2YodnJ0Y19vZmZzZXQpKSkgewotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJREJHSU5GKCJpbnNkZSB2aXNvcmNoaXBzZXRfaW9jdGwsIGNtZD0lZCwgdnJ0Y19vZmZzZXQ9JWxsZCIsCi0JCSAgICAgICBjbWQsIHZydGNfb2Zmc2V0KTsKLQkJcmV0dXJuIFNVQ0NFU1M7Ci0JY2FzZSBWTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUU6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcgotCQkgICAgKCZhZGp1c3RtZW50LCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihhZGp1c3RtZW50KSkpIHsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCURCR0lORigiaW5zZGUgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQsIGFkanVzdG1lbnQ9JWxsZCIsIGNtZCwKLQkJICAgICAgIGFkanVzdG1lbnQpOwotCQlyZXR1cm4gaXNzdWVfdm1jYWxsX3VwZGF0ZV9waHlzaWNhbF90aW1lKGFkanVzdG1lbnQpOwotCWRlZmF1bHQ6Ci0JCUxPR0VSUigidmlzb3JjaGlwc2V0X2lvY3RsIHJlY2VpdmVkIGludmFsaWQgY29tbWFuZCIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmgKaW5kZXggZGM3YTE5NS4uNTFmNzY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuaApAQCAtMjIsNiArMjIsNiBAQAogCiBpbnQgdmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChkZXZfdCBtYWpvckRldiwKIAkJCSAgIHN0cnVjdCB2aXNvcmNoYW5uZWwgKipwQ29udHJvbFZtX2NoYW5uZWwpOwotdm9pZCB2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKHZvaWQpOwordm9pZCB2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKGRldl90IG1ham9yX2Rldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZ2xvYmFscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZ2xvYmFscy5oCmluZGV4IGExZDM1ZDQuLmY3NmU0OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2dsb2JhbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9nbG9iYWxzLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpZm5kZWYgX19WSVNPUkNISVBTRVRfR0xPQkFMU19IX18KICNkZWZpbmUgX19WSVNPUkNISVBTRVRfR0xPQkFMU19IX18KIAotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJkaWFnbm9zdGljcy9hcHBvc19zdWJzeXN0ZW1zLmgiCiAjaW5jbHVkZSAidGltc2ttb2QuaCIKICNpbmNsdWRlICJ2aXNvcmNoaXBzZXQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKaW5kZXggOWVkYmQzYi4uZDhhMmQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKQEAgLTI5LDkgKzI5LDkgQEAKICAqIGluY29taW5nIHBheWxvYWRzLiAgVGhpcyBzZXJ2ZXMgYXMgYSB0aHJvdHRsaW5nIG1lY2hhbmlzbS4KICAqLwogI2RlZmluZSBNQVhfQ09OVFJPTFZNX1BBWUxPQURfQllURVMgKDEwMjQqMTI4KQotc3RhdGljIHVsb25nIENvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkOworc3RhdGljIHVsb25nIGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkOwogCi1zdHJ1Y3QgUEFSU0VSX0NPTlRFWFRfVGFnIHsKK3N0cnVjdCBwYXJzZXJfY29udGV4dCB7CiAJdWxvbmcgYWxsb2NieXRlczsKIAl1bG9uZyBwYXJhbV9ieXRlczsKIAl1OCAqY3VycjsKQEAgLTQwLDQxICs0MCwzNiBAQAogCWNoYXIgZGF0YVswXTsKIH07CiAKLXN0YXRpYyBQQVJTRVJfQ09OVEVYVCAqCi1wYXJzZXJfaW5pdF9ndXRzKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwKLQkJIEJPT0wgaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyLCBCT09MICp0cnlBZ2FpbikKK3N0YXRpYyBzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKgorcGFyc2VyX2luaXRfZ3V0cyh1NjQgYWRkciwgdTMyIGJ5dGVzLCBCT09MIGxvY2FsLAorCQkgQk9PTCBzdGFuZGFyZF9wYXlsb2FkX2hlYWRlciwgQk9PTCAqcmV0cnkpCiB7Ci0JaW50IGFsbG9jYnl0ZXMgPSBzaXplb2YoUEFSU0VSX0NPTlRFWFQpICsgYnl0ZXM7Ci0JUEFSU0VSX0NPTlRFWFQgKnJjID0gTlVMTDsKLQlQQVJTRVJfQ09OVEVYVCAqY3R4ID0gTlVMTDsKKwlpbnQgYWxsb2NieXRlcyA9IHNpemVvZihzdHJ1Y3QgcGFyc2VyX2NvbnRleHQpICsgYnl0ZXM7CisJc3RydWN0IHBhcnNlcl9jb250ZXh0ICpyYyA9IE5VTEw7CisJc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHggPSBOVUxMOwogCXN0cnVjdCBtZW1yZWdpb24gKnJnbiA9IE5VTEw7CiAJc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyICpwaGRyID0gTlVMTDsKIAotCWlmICh0cnlBZ2FpbikKLQkJKnRyeUFnYWluID0gRkFMU0U7Ci0JaWYgKCFoYXNTdGFuZGFyZFBheWxvYWRIZWFkZXIpCisJaWYgKHJldHJ5KQorCQkqcmV0cnkgPSBGQUxTRTsKKwlpZiAoIXN0YW5kYXJkX3BheWxvYWRfaGVhZGVyKQogCQkvKiBhbGxvYyBhbmQgMCBleHRyYSBieXRlIHRvIGVuc3VyZSBwYXlsb2FkIGlzCiAJCSAqICdcMCctdGVybWluYXRlZAogCQkgKi8KIAkJYWxsb2NieXRlcysrOwotCWlmICgoQ29udHJvbHZtX1BheWxvYWRfQnl0ZXNfQnVmZmVyZWQgKyBieXRlcykKKwlpZiAoKGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICsgYnl0ZXMpCiAJICAgID4gTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKSB7Ci0JCUVSUkRSVigiJXMgKCVzOiVkKSAtIHByZXZlbnRlZCBhbGxvY2F0aW9uIG9mICVkIGJ5dGVzIHRvIHByZXZlbnQgZXhjZWVkaW5nIHRocm90dGxpbmcgbWF4ICglZCkiLAotCQkgICAgICAgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXywgYWxsb2NieXRlcywKLQkJICAgICAgIE1BWF9DT05UUk9MVk1fUEFZTE9BRF9CWVRFUyk7Ci0JCWlmICh0cnlBZ2FpbikKLQkJCSp0cnlBZ2FpbiA9IFRSVUU7CisJCWlmIChyZXRyeSkKKwkJCSpyZXRyeSA9IFRSVUU7CiAJCXJjID0gTlVMTDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCWN0eCA9IGt6YWxsb2MoYWxsb2NieXRlcywgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gZmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIiwKLQkJICAgICAgIF9fZnVuY19fLCBfX0ZJTEVfXywgX19MSU5FX18sIGFsbG9jYnl0ZXMpOwotCQlpZiAodHJ5QWdhaW4pCi0JCQkqdHJ5QWdhaW4gPSBUUlVFOworCWlmICghY3R4KSB7CisJCWlmIChyZXRyeSkKKwkJCSpyZXRyeSA9IFRSVUU7CiAJCXJjID0gTlVMTDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJY3R4LT5hbGxvY2J5dGVzID0gYWxsb2NieXRlczsKQEAgLTgyLDE1ICs3NywxMiBAQAogCWN0eC0+Y3VyciA9IE5VTEw7CiAJY3R4LT5ieXRlc19yZW1haW5pbmcgPSAwOwogCWN0eC0+Ynl0ZV9zdHJlYW0gPSBGQUxTRTsKLQlpZiAoaXNMb2NhbCkgeworCWlmIChsb2NhbCkgewogCQl2b2lkICpwOwogCiAJCWlmIChhZGRyID4gdmlydF90b19waHlzKGhpZ2hfbWVtb3J5IC0gMSkpIHsKLQkJCUVSUkRSVigiJXMgLSBiYWQgbG9jYWwgYWRkcmVzcyAoMHglLTE2LjE2THggZm9yICVsdSkiLAotCQkJICAgICAgIF9fZnVuY19fLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHIsICh1bG9uZykgYnl0ZXMpOwogCQkJcmMgPSBOVUxMOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJCXAgPSBfX3ZhKCh1bG9uZykgKGFkZHIpKTsKIAkJbWVtY3B5KGN0eC0+ZGF0YSwgcCwgYnl0ZXMpOwpAQCAtOTgsNTQgKzkwLDQyIEBACiAJCXJnbiA9IHZpc29yX21lbXJlZ2lvbl9jcmVhdGUoYWRkciwgYnl0ZXMpOwogCQlpZiAoIXJnbikgewogCQkJcmMgPSBOVUxMOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChyZ24sIDAsIGN0eC0+ZGF0YSwgYnl0ZXMpIDwgMCkgewogCQkJcmMgPSBOVUxMOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJfQotCWlmICghaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyKSB7CisJaWYgKCFzdGFuZGFyZF9wYXlsb2FkX2hlYWRlcikgewogCQljdHgtPmJ5dGVfc3RyZWFtID0gVFJVRTsKIAkJcmMgPSBjdHg7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAlwaGRyID0gKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9wYXJhbWV0ZXJzX2hlYWRlciAqKShjdHgtPmRhdGEpOwogCWlmIChwaGRyLT50b3RhbF9sZW5ndGggIT0gYnl0ZXMpIHsKLQkJRVJSRFJWKCIlcyAtIGJhZCB0b3RhbCBsZW5ndGggJWx1IChzaG91bGQgYmUgJWx1KSIsCi0JCSAgICAgICBfX2Z1bmNfXywKLQkJICAgICAgICh1bG9uZykgKHBoZHItPnRvdGFsX2xlbmd0aCksICh1bG9uZykgKGJ5dGVzKSk7CiAJCXJjID0gTlVMTDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCWlmIChwaGRyLT50b3RhbF9sZW5ndGggPCBwaGRyLT5oZWFkZXJfbGVuZ3RoKSB7Ci0JCUVSUkRSVigiJXMgLSB0b3RhbCBsZW5ndGggPCBoZWFkZXIgbGVuZ3RoICglbHUgPCAlbHUpIiwKLQkJICAgICAgIF9fZnVuY19fLAotCQkgICAgICAgKHVsb25nKSAocGhkci0+dG90YWxfbGVuZ3RoKSwKLQkJICAgICAgICh1bG9uZykgKHBoZHItPmhlYWRlcl9sZW5ndGgpKTsKIAkJcmMgPSBOVUxMOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAJaWYgKHBoZHItPmhlYWRlcl9sZW5ndGggPAogCSAgICBzaXplb2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyKSkgewotCQlFUlJEUlYoIiVzIC0gaGVhZGVyIGlzIHRvbyBzbWFsbCAoJWx1IDwgJWx1KSIsCi0JCSAgICAgICBfX2Z1bmNfXywKLQkJICAgICAgICh1bG9uZykgKHBoZHItPmhlYWRlcl9sZW5ndGgpLAotCQkgICAgICAgKHVsb25nKShzaXplb2YoCi0JCQkJc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyKSkpOwogCQlyYyA9IE5VTEw7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCXJjID0gY3R4OwotQXdheToKK2NsZWFudXA6CiAJaWYgKHJnbikgewogCQl2aXNvcl9tZW1yZWdpb25fZGVzdHJveShyZ24pOwogCQlyZ24gPSBOVUxMOwogCX0KLQlpZiAocmMpCi0JCUNvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkICs9IGN0eC0+cGFyYW1fYnl0ZXM7Ci0JZWxzZSB7CisJaWYgKHJjKSB7CisJCWNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICs9IGN0eC0+cGFyYW1fYnl0ZXM7CisJfSBlbHNlIHsKIAkJaWYgKGN0eCkgewogCQkJcGFyc2VyX2RvbmUoY3R4KTsKIAkJCWN0eCA9IE5VTEw7CkBAIC0xNTQsMTAgKzEzNCwxMCBAQAogCXJldHVybiByYzsKIH0KIAotUEFSU0VSX0NPTlRFWFQgKgotcGFyc2VyX2luaXQodTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBpc0xvY2FsLCBCT09MICp0cnlBZ2FpbikKK3N0cnVjdCBwYXJzZXJfY29udGV4dCAqCitwYXJzZXJfaW5pdCh1NjQgYWRkciwgdTMyIGJ5dGVzLCBCT09MIGxvY2FsLCBCT09MICpyZXRyeSkKIHsKLQlyZXR1cm4gcGFyc2VyX2luaXRfZ3V0cyhhZGRyLCBieXRlcywgaXNMb2NhbCwgVFJVRSwgdHJ5QWdhaW4pOworCXJldHVybiBwYXJzZXJfaW5pdF9ndXRzKGFkZHIsIGJ5dGVzLCBsb2NhbCwgVFJVRSwgcmV0cnkpOwogfQogCiAvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBwYXJzZXJfaW5pdCgpIGlmIHRoZSBwYXlsb2FkIGFyZWEgY29uc2lzdHMgb2YganVzdApAQCAtMTY1LDE2ICsxNDUsMTYgQEAKICAqIHN0cnVjdHVyZXMuICBBZnRlcndhcmRzLCB5b3UgY2FuIGNhbGwgcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoKSBvcgogICogcGFyc2VyX2J5dGVTdHJlYW1fZ2V0KCkgdG8gb2J0YWluIHRoZSBkYXRhLgogICovCi1QQVJTRVJfQ09OVEVYVCAqCi1wYXJzZXJfaW5pdF9ieXRlU3RyZWFtKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwgQk9PTCAqdHJ5QWdhaW4pCitzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKgorcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0odTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBsb2NhbCwgQk9PTCAqcmV0cnkpCiB7Ci0JcmV0dXJuIHBhcnNlcl9pbml0X2d1dHMoYWRkciwgYnl0ZXMsIGlzTG9jYWwsIEZBTFNFLCB0cnlBZ2Fpbik7CisJcmV0dXJuIHBhcnNlcl9pbml0X2d1dHMoYWRkciwgYnl0ZXMsIGxvY2FsLCBGQUxTRSwgcmV0cnkpOwogfQogCiAvKiBPYnRhaW4gJ1wwJy10ZXJtaW5hdGVkIGNvcHkgb2Ygc3RyaW5nIGluIHBheWxvYWQgYXJlYS4KICAqLwogY2hhciAqCi1wYXJzZXJfc2ltcGxlU3RyaW5nX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KQorcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgpCiB7CiAJaWYgKCFjdHgtPmJ5dGVfc3RyZWFtKQogCQlyZXR1cm4gTlVMTDsKQEAgLTE4NSw0MCArMTY1LDMzIEBACiAKIC8qIE9idGFpbiBhIGNvcHkgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcGF5bG9hZCBhcmVhLgogICovCi12b2lkICoKLXBhcnNlcl9ieXRlU3RyZWFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCB1bG9uZyAqbmJ5dGVzKQordm9pZCAqcGFyc2VyX2J5dGVfc3RyZWFtX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCwgdWxvbmcgKm5ieXRlcykKIHsKIAlpZiAoIWN0eC0+Ynl0ZV9zdHJlYW0pCiAJCXJldHVybiBOVUxMOwogCWlmIChuYnl0ZXMpCiAJCSpuYnl0ZXMgPSBjdHgtPnBhcmFtX2J5dGVzOwotCXJldHVybiAodm9pZCAqKSBjdHgtPmRhdGE7CisJcmV0dXJuICh2b2lkICopY3R4LT5kYXRhOwogfQogCiB1dWlkX2xlCi1wYXJzZXJfaWRfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpCitwYXJzZXJfaWRfZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4KQogewogCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9wYXJhbWV0ZXJzX2hlYWRlciAqcGhkciA9IE5VTEw7CiAKLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gbm8gY29udGV4dCIsCi0JCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsKKwlpZiAoY3R4ID09IE5VTEwpCiAJCXJldHVybiBOVUxMX1VVSURfTEU7Ci0JfQogCXBoZHIgPSAoc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyICopKGN0eC0+ZGF0YSk7CiAJcmV0dXJuIHBoZHItPmlkOwogfQogCiB2b2lkCi1wYXJzZXJfcGFyYW1fc3RhcnQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgUEFSU0VSX1dISUNIX1NUUklORyB3aGljaF9zdHJpbmcpCitwYXJzZXJfcGFyYW1fc3RhcnQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgsIFBBUlNFUl9XSElDSF9TVFJJTkcgd2hpY2hfc3RyaW5nKQogewogCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9wYXJhbWV0ZXJzX2hlYWRlciAqcGhkciA9IE5VTEw7CiAKLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gbm8gY29udGV4dCIsCi0JCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsKKwlpZiAoY3R4ID09IE5VTEwpCiAJCWdvdG8gQXdheTsKLQl9CiAJcGhkciA9IChzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fcGFyYW1ldGVyc19oZWFkZXIgKikoY3R4LT5kYXRhKTsKIAlzd2l0Y2ggKHdoaWNoX3N0cmluZykgewogCWNhc2UgUEFSU0VSU1RSSU5HX0lOSVRJQVRPUjoKQEAgLTIzOCw3ICsyMTEsNiBAQAogCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPm5hbWVfbGVuZ3RoOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlFUlJEUlYoIiVzIC0gYmFkIHdoaWNoX3N0cmluZyAlZCIsIF9fZnVuY19fLCB3aGljaF9zdHJpbmcpOwogCQlicmVhazsKIAl9CiAKQEAgLTI0NywxMSArMjE5LDExIEBACiB9CiAKIHZvaWQKLXBhcnNlcl9kb25lKFBBUlNFUl9DT05URVhUICpjdHgpCitwYXJzZXJfZG9uZShzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCkKIHsKIAlpZiAoIWN0eCkKIAkJcmV0dXJuOwotCUNvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkIC09IGN0eC0+cGFyYW1fYnl0ZXM7CisJY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQgLT0gY3R4LT5wYXJhbV9ieXRlczsKIAlrZnJlZShjdHgpOwogfQogCkBAIC0yOTAsNyArMjYyLDcgQEAKICAqICAgIHBhcmFtZXRlcgogICovCiB2b2lkICoKLXBhcnNlcl9wYXJhbV9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgY2hhciAqbmFtLCBpbnQgbmFtZXNpemUpCitwYXJzZXJfcGFyYW1fZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4LCBjaGFyICpuYW0sIGludCBuYW1lc2l6ZSkKIHsKIAl1OCAqcHNjYW4sICpwbmFtID0gbmFtOwogCXVsb25nIG5zY2FuOwpAQCAtMzIxLDI1ICsyOTMsMTggQEAKIAl9CiAKIAl3aGlsZSAoKnBzY2FuICE9ICc6JykgewotCQlpZiAobmFtZXNpemUgPD0gMCkgewotCQkJRVJSRFJWKCIlcyAtIG5hbWUgdG9vIGJpZyIsIF9fZnVuY19fKTsKKwkJaWYgKG5hbWVzaXplIDw9IDApCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCQkqcG5hbSA9IHRvdXBwZXIoKnBzY2FuKTsKIAkJcG5hbSsrOwogCQluYW1lc2l6ZS0tOwogCQlwc2NhbisrOwogCQluc2Nhbi0tOwotCQlpZiAobnNjYW4gPT0gMCkgewotCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgbmFtZSIsCi0JCQkgICAgICAgX19mdW5jX18pOworCQlpZiAobnNjYW4gPT0gMCkKIAkJCXJldHVybiBOVUxMOwotCQl9CiAJfQotCWlmIChuYW1lc2l6ZSA8PSAwKSB7Ci0JCUVSUkRSVigiJXMgLSBuYW1lIHRvbyBiaWciLCBfX2Z1bmNfXyk7CisJaWYgKG5hbWVzaXplIDw9IDApCiAJCXJldHVybiBOVUxMOwotCX0KIAkqcG5hbSA9ICdcMCc7CiAJbmFtW3N0cmluZ19sZW5ndGhfbm9fdHJhaWwobmFtLCBzdHJsZW4obmFtKSldID0gJ1wwJzsKIApAQCAtMzUwLDI2ICszMTUsMTcgQEAKIAl3aGlsZSAoaXNzcGFjZSgqcHNjYW4pKSB7CiAJCXBzY2FuKys7CiAJCW5zY2FuLS07Ci0JCWlmIChuc2NhbiA9PSAwKSB7Ci0JCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgbG9va2luZyBmb3IgdmFsdWUiLAotCQkJICAgICAgIF9fZnVuY19fKTsKKwkJaWYgKG5zY2FuID09IDApCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCX0KLQlpZiAobnNjYW4gPT0gMCkgewotCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgbG9va2luZyBmb3IgdmFsdWUiLAotCQkgICAgICAgX19mdW5jX18pOworCWlmIChuc2NhbiA9PSAwKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJaWYgKCpwc2NhbiA9PSAnXCcnIHx8ICpwc2NhbiA9PSAnIicpIHsKIAkJY2xvc2luZ19xdW90ZSA9ICpwc2NhbjsKIAkJcHNjYW4rKzsKIAkJbnNjYW4tLTsKLQkJaWYgKG5zY2FuID09IDApIHsKLQkJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhZnRlciAlYyIsCi0JCQkgICAgICAgX19mdW5jX18sIGNsb3NpbmdfcXVvdGUpOworCQlpZiAobnNjYW4gPT0gMCkKIAkJCXJldHVybiBOVUxMOwotCQl9CiAJfQogCiAJLyogbG9vayBmb3IgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLCB0ZXJtaW5hdG9yIGNoYXJhY3Rlciwgb3IKQEAgLTM3NywxMCArMzMzLDggQEAKIAkgKi8KIAlmb3IgKGkgPSAwLCB2YWx1ZV9sZW5ndGggPSAtMTsgaSA8IG5zY2FuOyBpKyspIHsKIAkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKLQkJCWlmIChwc2NhbltpXSA9PSAnXDAnKSB7Ci0JCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgcXVvdGVkIHZhbHVlIiwgX19mdW5jX18pOworCQkJaWYgKHBzY2FuW2ldID09ICdcMCcpCiAJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9CiAJCQlpZiAocHNjYW5baV0gPT0gY2xvc2luZ19xdW90ZSkgewogCQkJCXZhbHVlX2xlbmd0aCA9IGk7CiAJCQkJYnJlYWs7CkBAIC0zOTMsMTAgKzM0Nyw4IEBACiAJCX0KIAl9CiAJaWYgKHZhbHVlX2xlbmd0aCA8IDApIHsKLQkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKLQkJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBwYXJzaW5nIHF1b3RlZCB2YWx1ZSIsIF9fZnVuY19fKTsKKwkJaWYgKGNsb3NpbmdfcXVvdGUpCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCQl2YWx1ZV9sZW5ndGggPSBuc2NhbjsKIAl9CiAJb3JpZ192YWx1ZV9sZW5ndGggPSB2YWx1ZV9sZW5ndGg7CkBAIC00MzMsNyArMzg1LDYgQEAKIAkJCQlwc2NhbisrOwogCQkJCW5zY2FuLS07CiAJCQl9IGVsc2UgaWYgKCpwc2NhbiAhPSAnXDAnKSB7Ci0JCQkJRVJSRFJWKCIlcyAtIG1pc3Npbmcgc2VwYXJhdG9yIGFmdGVyIHF1b3RlZCBzdHJpbmciLCBfX2Z1bmNfXyk7CiAJCQkJa2ZyZWUodmFsdWUpOwogCQkJCXZhbHVlID0gTlVMTDsKIAkJCQlyZXR1cm4gTlVMTDsKQEAgLTQ0Niw3ICszOTcsNyBAQAogfQogCiB2b2lkICoKLXBhcnNlcl9zdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpCitwYXJzZXJfc3RyaW5nX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCkKIHsKIAl1OCAqcHNjYW47CiAJdWxvbmcgbnNjYW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9wYXJzZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCmluZGV4IDlmYmUzYjUuLjJiOTAzZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAKLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAidGltc2ttb2QuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCiAKQEAgLTMxLDE3ICszMCwxNyBAQAogCVBBUlNFUlNUUklOR19OQU1FLAogfSBQQVJTRVJfV0hJQ0hfU1RSSU5HOwogCi10eXBlZGVmIHN0cnVjdCBQQVJTRVJfQ09OVEVYVF9UYWcgUEFSU0VSX0NPTlRFWFQ7Ci0KLVBBUlNFUl9DT05URVhUICpwYXJzZXJfaW5pdCh1NjQgYWRkciwgdTMyIGJ5dGVzLCBCT09MIGlzTG9jYWwsIEJPT0wgKnRyeUFnYWluKTsKLVBBUlNFUl9DT05URVhUICpwYXJzZXJfaW5pdF9ieXRlU3RyZWFtKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwKLQkJCQkgICAgICAgQk9PTCAqdHJ5QWdhaW4pOwotdm9pZCBwYXJzZXJfcGFyYW1fc3RhcnQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgUEFSU0VSX1dISUNIX1NUUklORyB3aGljaF9zdHJpbmcpOwotdm9pZCAqcGFyc2VyX3BhcmFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCBjaGFyICpuYW0sIGludCBuYW1lc2l6ZSk7Ci12b2lkICpwYXJzZXJfc3RyaW5nX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KTsKLXV1aWRfbGUgcGFyc2VyX2lkX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KTsKLWNoYXIgKnBhcnNlcl9zaW1wbGVTdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOwotdm9pZCAqcGFyc2VyX2J5dGVTdHJlYW1fZ2V0KFBBUlNFUl9DT05URVhUICpjdHgsIHVsb25nICpuYnl0ZXMpOwotdm9pZCBwYXJzZXJfZG9uZShQQVJTRVJfQ09OVEVYVCAqY3R4KTsKK3N0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2luaXQodTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBpc0xvY2FsLAorCQkJCSAgIEJPT0wgKnRyeUFnYWluKTsKK3N0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0odTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBsb2NhbCwKKwkJCQkgICAgICAgQk9PTCAqcmV0cnkpOwordm9pZCBwYXJzZXJfcGFyYW1fc3RhcnQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgsCisJCQlQQVJTRVJfV0hJQ0hfU1RSSU5HIHdoaWNoX3N0cmluZyk7Cit2b2lkICpwYXJzZXJfcGFyYW1fZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4LCBjaGFyICpuYW0sIGludCBuYW1lc2l6ZSk7Cit2b2lkICpwYXJzZXJfc3RyaW5nX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCk7Cit1dWlkX2xlIHBhcnNlcl9pZF9nZXQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgpOworY2hhciAqcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgpOwordm9pZCAqcGFyc2VyX2J5dGVfc3RyZWFtX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCwgdWxvbmcgKm5ieXRlcyk7Cit2b2lkIHBhcnNlcl9kb25lKHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCmluZGV4IDk4ZjNiYTQuLmJkNDZkZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCkBAIC0xMzMsNyArMTMzLDYgQEAKIAl1OCAqZGVzY3JpcHRpb247CS8qIFVURjggKi8KIAl1NjQgcmVzZXJ2ZWQxOwogCXUzMiByZXNlcnZlZDI7Ci0JTVlQUk9DT0JKRUNUICpwcm9jX29iamVjdDsKIAlzdHJ1Y3QgewogCQl1MzIgc2VydmVyOjE7CiAJCS8qIEFkZCBuZXcgZmllbGRzIGFib3ZlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF9tYWluLmMKaW5kZXggZjYwNmVlOS4uZjI2NjNkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAicGFyc2VyLmgiCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInVpc3V0aWxzLmgiCiAjaW5jbHVkZSAiY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIgogI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgpAQCAtNDksOCArNDgsOCBAQAogKiBtZXNzYWdlLCB3ZSBzd2l0Y2ggYmFjayB0byBmYXN0IHBvbGxpbmcgbW9kZS4KICovCiAjZGVmaW5lIE1JTl9JRExFX1NFQ09ORFMgMTAKLXN0YXRpYyB1bG9uZyBQb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7Ci1zdGF0aWMgdWxvbmcgTW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzOwkvKiB3aGVuIHdlIGdvdCBvdXIgbGFzdAorc3RhdGljIHVsb25nIHBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKK3N0YXRpYyB1bG9uZyBtb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXM7CS8qIHdoZW4gd2UgZ290IG91ciBsYXN0CiAJCQkJCQkgKiBjb250cm9sdm0gbWVzc2FnZSAqLwogc3RhdGljIGlubGluZSBjaGFyICoKIE5PTlVMTFNUUihjaGFyICpzKQpAQCAtNjYsODMgKzY1LDc0IEBACiAjZGVmaW5lIE1BWF9DSElQU0VUX0VWRU5UUyAyCiBzdGF0aWMgdTggY2hpcHNldF9ldmVudHNbTUFYX0NISVBTRVRfRVZFTlRTXSA9IHsgMCwgMCB9OwogCi1zdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayBQZXJpb2RpY19jb250cm9sdm1fd29yazsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZTsKLXN0YXRpYyBERUZJTkVfU0VNQVBIT1JFKE5vdGlmaWVyTG9jayk7CitzdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayBwZXJpb2RpY19jb250cm9sdm1fd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZTsKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKG5vdGlmaWVyX2xvY2spOwogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG1lc3NhZ2U7Ci0JdW5zaWduZWQgaW50IGNyYzsKLX0gTUVTU0FHRV9FTlZFTE9QRTsKLQotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19EaWFnTXNnSGRyOwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19DaGlwU2V0TXNnSGRyOwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19EZWxEdW1wTXNnSGRyOwotc3RhdGljIGNvbnN0IHV1aWRfbGUgVWx0cmFEaWFnUG9vbENoYW5uZWxQcm90b2NvbEd1aWQgPQorc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19kaWFnX21zZ19oZHI7CitzdGF0aWMgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBnX2NoaXBzZXRfbXNnX2hkcjsKK3N0YXRpYyBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGdfZGVsX2R1bXBfbXNnX2hkcjsKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfZGlhZ19wb29sX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9CiAJU1BBUl9ESUFHX1BPT0xfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEOwogLyogMHhmZmZmZmYgaXMgYW4gaW52YWxpZCBCdXMvRGV2aWNlIG51bWJlciAqLwotc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xCdXNObyA9IDB4ZmZmZmZmOwotc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xEZXZObyA9IDB4ZmZmZmZmOwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgZ19EZXZpY2VDaGFuZ2VTdGF0ZVBhY2tldDsKK3N0YXRpYyB1bG9uZyBnX2RpYWdwb29sX2J1c19ubyA9IDB4ZmZmZmZmOworc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xfZGV2X25vID0gMHhmZmZmZmY7CitzdGF0aWMgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCBnX2RldmljZWNoYW5nZXN0YXRlX3BhY2tldDsKIAogLyogT25seSBWTklDIGFuZCBWSEJBIGNoYW5uZWxzIGFyZSBzZW50IHRvIHZpc29yY2xpZW50YnVzIChha2EKICAqICJ2aXNvcmhhY2tidXMiKQogICovCiAjZGVmaW5lIEZPUl9WSVNPUkhBQ0tCVVMoY2hhbm5lbF90eXBlX2d1aWQpIFwKIAkoKCh1dWlkX2xlX2NtcChjaGFubmVsX3R5cGVfZ3VpZCxcCi0JCSAgICAgICBzcGFyX3ZuaWNfY2hhbm5lbF9wcm90b2NvbF91dWlkKSA9PSAwKVwKLQl8fCAodXVpZF9sZV9jbXAoY2hhbm5lbF90eXBlX2d1aWQsXAorCQkgICAgICAgc3Bhcl92bmljX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCkgPT0gMCkgfHxcCisJKHV1aWRfbGVfY21wKGNoYW5uZWxfdHlwZV9ndWlkLFwKIAkJCXNwYXJfdmhiYV9jaGFubmVsX3Byb3RvY29sX3V1aWQpID09IDApKSkKICNkZWZpbmUgRk9SX1ZJU09SQlVTKGNoYW5uZWxfdHlwZV9ndWlkKSAoIShGT1JfVklTT1JIQUNLQlVTKGNoYW5uZWxfdHlwZV9ndWlkKSkpCiAKICNkZWZpbmUgaXNfZGlhZ3Bvb2xfY2hhbm5lbChjaGFubmVsX3R5cGVfZ3VpZCkgXAotCSAodXVpZF9sZV9jbXAoY2hhbm5lbF90eXBlX2d1aWQsIFVsdHJhRGlhZ1Bvb2xDaGFubmVsUHJvdG9jb2xHdWlkKSA9PSAwKQorCSh1dWlkX2xlX2NtcChjaGFubmVsX3R5cGVfZ3VpZCxcCisJCSAgICAgc3Bhcl9kaWFnX3Bvb2xfY2hhbm5lbF9wcm90b2NvbF91dWlkKSA9PSAwKQogCi1zdGF0aWMgTElTVF9IRUFEKEJ1c0luZm9MaXN0KTsKLXN0YXRpYyBMSVNUX0hFQUQoRGV2SW5mb0xpc3QpOworc3RhdGljIExJU1RfSEVBRChidXNfaW5mb19saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQoZGV2X2luZm9fbGlzdCk7CiAKLXN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICpDb250cm9sVm1fY2hhbm5lbDsKK3N0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjb250cm9sdm1fY2hhbm5lbDsKIAotdHlwZWRlZiBzdHJ1Y3QgeworLyogTWFuYWdlcyB0aGUgcmVxdWVzdCBwYXlsb2FkIGluIHRoZSBjb250cm9sdm0gY2hhbm5lbCAqLworc3RhdGljIHN0cnVjdCBjb250cm9sdm1fcGF5bG9hZF9pbmZvIHsKIAl1OCBfX2lvbWVtICpwdHI7CS8qIHBvaW50ZXIgdG8gYmFzZSBhZGRyZXNzIG9mIHBheWxvYWQgcG9vbCAqLwogCXU2NCBvZmZzZXQ7CQkvKiBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgY29udHJvbHZtCiAJCQkJICogY2hhbm5lbCB0byBiZWdpbm5pbmcgb2YgcGF5bG9hZCAqIHBvb2wgKi8KIAl1MzIgYnl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gcGF5bG9hZCBwb29sICovCi19IENPTlRST0xWTV9QQVlMT0FEX0lORk87Cit9IGNvbnRyb2x2bV9wYXlsb2FkX2luZm87CiAKLS8qIE1hbmFnZXMgdGhlIHJlcXVlc3QgcGF5bG9hZCBpbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgKi8KLXN0YXRpYyBDT05UUk9MVk1fUEFZTE9BRF9JTkZPIENvbnRyb2xWbV9wYXlsb2FkX2luZm87Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIgKlRlc3RfVm5pY19jaGFubmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBEdW1wY2FwdHVyZV9oZWFkZXI7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBHZXR0ZXh0ZHVtcF9oZWFkZXI7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBEdW1wY29tcGxldGVfaGVhZGVyOwotCUJPT0wgR2V0dGV4dGR1bXBfb3V0c3RhbmRpbmc7CisvKiBNYW5hZ2VzIHRoZSBpbmZvIGZvciBhIENPTlRST0xWTV9EVU1QX0NBUFRVUkVTVEFURSAvCisgKiBDT05UUk9MVk1fRFVNUF9HRVRURVhURFVNUCAvIENPTlRST0xWTV9EVU1QX0NPTVBMRVRFIGNvbnZlcnNhdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBsaXZlZHVtcF9pbmZvIHsKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGR1bXBjYXB0dXJlX2hlYWRlcjsKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGdldHRleHRkdW1wX2hlYWRlcjsKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGR1bXBjb21wbGV0ZV9oZWFkZXI7CisJQk9PTCBnZXR0ZXh0ZHVtcF9vdXRzdGFuZGluZzsKIAl1MzIgY3JjMzI7CiAJdWxvbmcgbGVuZ3RoOwogCWF0b21pY190IGJ1ZmZlcnNfaW5fdXNlOwogCXVsb25nIGRlc3RpbmF0aW9uOwotfSBMSVZFRFVNUF9JTkZPOwotLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLwotICogQ09OVFJPTFZNX0RVTVBfR0VUVEVYVERVTVAgLyBDT05UUk9MVk1fRFVNUF9DT01QTEVURSBjb252ZXJzYXRpb24uCi0gKi8KLXN0YXRpYyBMSVZFRFVNUF9JTkZPIExpdmVEdW1wX2luZm87Cit9IGxpdmVkdW1wX2luZm87CiAKIC8qIFRoZSBmb2xsb3dpbmcgZ2xvYmFscyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGFyZSB1bmFibGUgdG8KICAqIG9mZmxvYWQgdGhlIHBheWxvYWQgZnJvbSBhIGNvbnRyb2x2bSBtZXNzYWdlIGR1ZSB0byBtZW1vcnkgcmVxdWlyZW1lbnRzLiAgSW4KICAqIHRoaXMgc2NlbmFyaW8sIHdlIHNpbXBseSBzdGFzaCB0aGUgY29udHJvbHZtIG1lc3NhZ2UsIHRoZW4gYXR0ZW1wdCB0bwogICogcHJvY2VzcyBpdCBhZ2FpbiB0aGUgbmV4dCB0aW1lIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKCkgcnVucy4KICAqLwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBDb250cm9sVm1fUGVuZGluZ19Nc2c7Ci1zdGF0aWMgQk9PTCBDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQgPSBGQUxTRTsKK3N0YXRpYyBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgY29udHJvbHZtX3BlbmRpbmdfbXNnOworc3RhdGljIEJPT0wgY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkID0gRkFMU0U7CiAKIC8qIFBvb2wgb2Ygc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5LCBmb3Iga2VlcGluZyB0cmFjayBvZiBwZW5kaW5nIChpbmNvbWluZykKICAqIFRSQU5TTUlUX0ZJTEUgUHV0RmlsZSBwYXlsb2Fkcy4KICAqLwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2w7Ci1zdGF0aWMgY29uc3QgY2hhciBQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2xfbmFtZVtdID0KK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sOworc3RhdGljIGNvbnN0IGNoYXIgcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sX25hbWVbXSA9CiAJImNvbnRyb2x2bV9wdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wiOwogCiAvKiBUaGlzIGlkZW50aWZpZXMgYSBkYXRhIGJ1ZmZlciB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkIHZpYSBhIGNvbnRyb2x2bSBtZXNzYWdlcwpAQCAtMTUwLDE0ICsxNDAsMTQgQEAKICAqLwogc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CS8qIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QgKi8KLQlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eDsgLyogcG9pbnRzIHRvIGJ1ZmZlciBjb250YWluaW5nIGlucHV0IGRhdGEgKi8KKwlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHg7IC8qIHBvaW50cyB0byBpbnB1dCBkYXRhIGJ1ZmZlciAqLwogfTsKIAogLyogTGlzdCBvZiBzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0ICosIHZpYSBuZXh0X3B1dGZpbGVfcmVxdWVzdCBtZW1iZXIuCiAgKiBFYWNoIGVudHJ5IGluIHRoaXMgbGlzdCBpZGVudGlmaWVzIGFuIG91dHN0YW5kaW5nIFRSQU5TTUlUX0ZJTEUKICAqIGNvbnZlcnNhdGlvbi4KICAqLwotc3RhdGljIExJU1RfSEVBRChQdXRmaWxlX3JlcXVlc3RfbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKHB1dGZpbGVfcmVxdWVzdF9saXN0KTsKIAogLyogVGhpcyBkZXNjcmliZXMgYSBidWZmZXIgYW5kIGl0cyBjdXJyZW50IHN0YXRlIG9mIHRyYW5zZmVyIChlLmcuLCBob3cgbWFueQogICogYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3VwcGxpZWQgYXMgcHV0ZmlsZSBkYXRhLCBhbmQgaG93IG1hbnkgYnl0ZXMgYXJlCkBAIC0xNjUsNyArMTU1LDcgQEAKICAqLwogc3RydWN0IHB1dGZpbGVfYWN0aXZlX2J1ZmZlciB7CiAJLyogYSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSwgY29udGFpbmluZyBhIGZpbGUgZGF0YSBidWZmZXIgKi8KLQlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eDsKKwlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHg7CiAJLyogcG9pbnRzIHdpdGhpbiBkYXRhIGFyZWEgb2YgcGFyc2VyX2N0eCB0byBuZXh0IGJ5dGUgb2YgZGF0YSAqLwogCXU4ICpwbmV4dDsKIAkvKiAjIGJ5dGVzIGxlZnQgZnJvbSA8cG5leHQ+IHRvIHRoZSBlbmQgb2YgdGhpcyBkYXRhIGJ1ZmZlciAqLwpAQCAtMjEzLDcgKzIwMyw3IEBACiAJaW50IGNvbXBsZXRpb25fc3RhdHVzOwogfTsKIAotc3RhdGljIGF0b21pY190IFZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIGF0b21pY190IHZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSA9IEFUT01JQ19JTklUKDApOwogCiBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMjIyLDIzICsyMTIsMjMgQEAKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgbXNnOwogfTsKIAotc3RhdGljIExJU1RfSEVBRChQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CS8qIGxvY2sgZm9yIGFib3ZlICovCitzdGF0aWMgTElTVF9IRUFEKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsJLyogbG9jayBmb3IgYWJvdmUgKi8KIHN0YXRpYyB2b2lkIHBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCh2b2lkKTsKIAogLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLwogICogQ09OVFJPTFZNX1JFUE9SVEVWRU5ULgogICovCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIEJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzOwotc3RhdGljIHN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyBCdXNEZXZfQ2xpZW50X05vdGlmaWVyczsKK3N0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9ub3RpZmllcnMgYnVzZGV2X3NlcnZlcl9ub3RpZmllcnM7CitzdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIGJ1c2Rldl9jbGllbnRfbm90aWZpZXJzOwogCi1zdGF0aWMgdm9pZCBidXNfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpOwotc3RhdGljIHZvaWQgYnVzX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGRldmljZV9kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGRldmljZV9yZXN1bWVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgYnVzX2NyZWF0ZV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBidXNfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzX25vLCB1bG9uZyBkZXZfbm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpOwogCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyBCdXNEZXZfUmVzcG9uZGVycyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzIGJ1c2Rldl9yZXNwb25kZXJzID0gewogCS5idXNfY3JlYXRlID0gYnVzX2NyZWF0ZV9yZXNwb25zZSwKIAkuYnVzX2Rlc3Ryb3kgPSBidXNfZGVzdHJveV9yZXNwb25zZSwKIAkuZGV2aWNlX2NyZWF0ZSA9IGRldmljZV9jcmVhdGVfcmVzcG9uc2UsCkBAIC0yNDgsNDkgKzIzOCw1NSBAQAogfTsKIAogLyogaW5mbyBmb3IgL2Rldi92aXNvcmNoaXBzZXQgKi8KLXN0YXRpYyBkZXZfdCBNYWpvckRldiA9IC0xOyAvKio8IGluZGljYXRlcyBtYWpvciBudW0gZm9yIGRldmljZSAqLworc3RhdGljIGRldl90IG1ham9yX2RldiA9IC0xOyAvKio8IGluZGljYXRlcyBtYWpvciBudW0gZm9yIGRldmljZSAqLwogCiAvKiBwcm90b3R5cGVzIGZvciBhdHRyaWJ1dGVzICovCiBzdGF0aWMgc3NpemVfdCB0b29sYWN0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcodG9vbGFjdGlvbik7CiAKIHN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBib290dG90b29sX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhib290dG90b29sKTsKIAogc3RhdGljIHNzaXplX3QgZXJyb3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNoYXIgKmJ1Zik7CisJCQkgIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBlcnJvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhlcnJvcik7CiAKIHN0YXRpYyBzc2l6ZV90IHRleHRpZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY2hhciAqYnVmKTsKKwkJCSAgIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3RhdGljIERFVklDRV9BVFRSX1JXKHRleHRpZCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlbWFpbmluZ19zdGVwc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCByZW1haW5pbmdfc3RlcHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhyZW1haW5pbmdfc3RlcHMpOwogCiBzdGF0aWMgc3NpemVfdCBjaGlwc2V0cmVhZHlfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBzdGF0aWMgREVWSUNFX0FUVFJfV08oY2hpcHNldHJlYWR5KTsKIAogc3RhdGljIHNzaXplX3QgZGV2aWNlZGlzYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3RhdGljIERFVklDRV9BVFRSX1dPKGRldmljZWRpc2FibGVkKTsKIAogc3RhdGljIHNzaXplX3QgZGV2aWNlZW5hYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3RhdGljIERFVklDRV9BVFRSX1dPKGRldmljZWVuYWJsZWQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JjaGlwc2V0X2luc3RhbGxfYXR0cnNbXSA9IHsKQEAgLTMzNiw0NyArMzMyLDQ4IEBACiB9OwogCiAvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0ICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZSA9IHsKIAkubmFtZSA9ICJ2aXNvcmNoaXBzZXQiLAogCS5pZCA9IC0xLAogCS5kZXYuZ3JvdXBzID0gdmlzb3JjaGlwc2V0X2Rldl9ncm91cHMsCiB9OwogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIsCitzdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAogCQkJICAgICAgaW50IHJlc3BvbnNlKTsKIHN0YXRpYyB2b2lkIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkJZW51bSB1bHRyYV9jaGlwc2V0X2ZlYXR1cmUgZmVhdHVyZXMpOwogc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkJc3RydWN0IHNwYXJfc2VnbWVudF9zdGF0ZSBzdGF0ZSk7CiAKIHN0YXRpYyBzc2l6ZV90IHRvb2xhY3Rpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgICAgY2hhciAqYnVmKQogewotCXU4IHRvb2xBY3Rpb247CisJdTggdG9vbF9hY3Rpb247CiAKLQl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKIAkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgICB0b29sX2FjdGlvbiksICZ0b29sQWN0aW9uLCBzaXplb2YodTgpKTsKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRvb2xBY3Rpb24pOworCQkJIHRvb2xfYWN0aW9uKSwgJnRvb2xfYWN0aW9uLCBzaXplb2YodTgpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRvb2xfYWN0aW9uKTsKIH0KIAogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdTggdG9vbEFjdGlvbjsKKwl1OCB0b29sX2FjdGlvbjsKIAlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b3U4KGJ1ZiwgMTAsICZ0b29sQWN0aW9uKSAhPSAwKQorCWlmIChrc3RydG91OChidWYsIDEwLCAmdG9vbF9hY3Rpb24pICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwgdG9vbF9hY3Rpb24pLAotCQkmdG9vbEFjdGlvbiwgc2l6ZW9mKHU4KSk7CisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSB0b29sX2FjdGlvbiksCisJCSZ0b29sX2FjdGlvbiwgc2l6ZW9mKHU4KSk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMzg3LDE0ICszODQsMTQgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgICBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpU3BhckluZGljYXRpb247CisJc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpX3NwYXJfaW5kaWNhdGlvbjsKIAotCXZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAotCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCWVmaV9zcGFyX2luZCksICZlZmlTcGFySW5kaWNhdGlvbiwKLQkJc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7CisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGVmaV9zcGFyX2luZCksICZlZmlfc3Bhcl9pbmRpY2F0aW9uLAorCQkJICBzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsCi0JCQllZmlTcGFySW5kaWNhdGlvbi5ib290X3RvX3Rvb2wpOworCQkJIGVmaV9zcGFyX2luZGljYXRpb24uYm9vdF90b190b29sKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYm9vdHRvdG9vbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC00MDIsMTcgKzM5OSwxNiBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCB2YWwsIHJldDsKLQlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlTcGFySW5kaWNhdGlvbjsKKwlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlfc3Bhcl9pbmRpY2F0aW9uOwogCiAJaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVmaVNwYXJJbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCA9IHZhbDsKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUoQ29udHJvbFZtX2NoYW5uZWwsCisJZWZpX3NwYXJfaW5kaWNhdGlvbi5ib290X3RvX3Rvb2wgPSB2YWw7CisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJZWZpX3NwYXJfaW5kKSwKLQkJCSYoZWZpU3BhckluZGljYXRpb24pLAotCQlzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKKwkJCQkgZWZpX3NwYXJfaW5kKSwgJihlZmlfc3Bhcl9pbmRpY2F0aW9uKSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNDIwLDE4ICs0MTYsMTkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgZXJyb3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCisJCQkgIGNoYXIgKmJ1ZikKIHsKIAl1MzIgZXJyb3I7CiAKLQl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwgb2Zmc2V0b2YoCi0JCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLCBpbnN0YWxsYXRpb25fZXJyb3IpLAotCQkmZXJyb3IsIHNpemVvZih1MzIpKTsKKwl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkJICAgaW5zdGFsbGF0aW9uX2Vycm9yKSwKKwkJCSAgJmVycm9yLCBzaXplb2YodTMyKSk7CiAJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBlcnJvcik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGVycm9yX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdTMyIGVycm9yOwogCWludCByZXQ7CkBAIC00MzksMTE0ICs0MzYsODEgQEAKIAlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZlcnJvcikgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCQlpbnN0YWxsYXRpb25fZXJyb3IpLAotCQkJJmVycm9yLCBzaXplb2YodTMyKSk7CisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSBpbnN0YWxsYXRpb25fZXJyb3IpLAorCQkmZXJyb3IsIHNpemVvZih1MzIpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHNzaXplX3QgdGV4dGlkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJICAgY2hhciAqYnVmKQogewotCXUzMiB0ZXh0SWQ7CisJdTMyIHRleHRfaWQ7CiAKLQl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwgb2Zmc2V0b2YoCi0JCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLCBpbnN0YWxsYXRpb25fdGV4dF9pZCksCi0JCSZ0ZXh0SWQsIHNpemVvZih1MzIpKTsKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHRleHRJZCk7CisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGluc3RhbGxhdGlvbl90ZXh0X2lkKSwKKwkJCSAgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHRleHRfaWQpOwogfQogCiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdTMyIHRleHRJZDsKKwl1MzIgdGV4dF9pZDsKIAlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b3UzMihidWYsIDEwLCAmdGV4dElkKSAhPSAwKQorCWlmIChrc3RydG91MzIoYnVmLCAxMCwgJnRleHRfaWQpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJaW5zdGFsbGF0aW9uX3RleHRfaWQpLAotCQkJJnRleHRJZCwgc2l6ZW9mKHUzMikpOworCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZShjb250cm9sdm1fY2hhbm5lbCwKKwkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAorCQkmdGV4dF9pZCwgc2l6ZW9mKHUzMikpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJcmV0dXJuIGNvdW50OwogfQogCi0KIHN0YXRpYyBzc2l6ZV90IHJlbWFpbmluZ19zdGVwc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXUxNiByZW1haW5pbmdTdGVwczsKKwl1MTYgcmVtYWluaW5nX3N0ZXBzOwogCi0Jdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCi0JCW9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJaW5zdGFsbGF0aW9uX3JlbWFpbmluZ19zdGVwcyksCi0JCSZyZW1haW5pbmdTdGVwcywKLQkJc2l6ZW9mKHUxNikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaHVcbiIsIHJlbWFpbmluZ1N0ZXBzKTsKKwl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkJICAgaW5zdGFsbGF0aW9uX3JlbWFpbmluZ19zdGVwcyksCisJCQkgICZyZW1haW5pbmdfc3RlcHMsIHNpemVvZih1MTYpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWh1XG4iLCByZW1haW5pbmdfc3RlcHMpOwogfQogCiBzdGF0aWMgc3NpemVfdCByZW1haW5pbmdfc3RlcHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdTE2IHJlbWFpbmluZ1N0ZXBzOworCXUxNiByZW1haW5pbmdfc3RlcHM7CiAJaW50IHJldDsKIAotCWlmIChrc3RydG91MTYoYnVmLCAxMCwgJnJlbWFpbmluZ1N0ZXBzKSAhPSAwKQorCWlmIChrc3RydG91MTYoYnVmLCAxMCwgJnJlbWFpbmluZ19zdGVwcykgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCQlpbnN0YWxsYXRpb25fcmVtYWluaW5nX3N0ZXBzKSwKLQkJCSZyZW1haW5pbmdTdGVwcywgc2l6ZW9mKHUxNikpOworCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZShjb250cm9sdm1fY2hhbm5lbCwKKwkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgaW5zdGFsbGF0aW9uX3JlbWFpbmluZ19zdGVwcyksCisJCSZyZW1haW5pbmdfc3RlcHMsIHNpemVvZih1MTYpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXJldHVybiBjb3VudDsKIH0KIAotI2lmIDAKIHN0YXRpYyB2b2lkCi10ZXN0VW5pY29kZSh2b2lkKQotewotCXdjaGFyX3QgdW5pY29kZVN0cmluZ1tdID0geyAnYScsICdiJywgJ2MnLCAwIH07Ci0JY2hhciBzW3NpemVvZih1bmljb2RlU3RyaW5nKSAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFXTsKLQl3Y2hhcl90IHVuaWNvZGUyWzk5XTsKLQotCS8qIE5PVEU6IEVpdGhlciBkdWUgdG8gYSBidWcsIG9yIGZlYXR1cmUgSSBkb24ndCB1bmRlcnN0YW5kLCB0aGUKLQkgKiAgICAgICBrZXJuZWwgdXRmOF9tYnN0b3djcygpIGFuZCB1dGZfd2NzdG9tYnMoKSBkbyBOT1QgY29weSB0aGUKLQkgKiAgICAgICB0cmFpbGVkIE5VTCBieXRlISEgICBSRUFMTFkhISEhISAgICBBcnJycmdnZ2doaGhoaAotCSAqLwotCi0JTE9HSU5GKCJzaXplb2Yod2NoYXJfdCkgPSAlZCIsIHNpemVvZih3Y2hhcl90KSk7Ci0JTE9HSU5GKCJ1dGY4X3djc3RvbWJzPSVkIiwKLQkgICAgICAgY2hycyA9IHV0Zjhfd2NzdG9tYnMocywgdW5pY29kZVN0cmluZywgc2l6ZW9mKHMpKSk7Ci0JaWYgKGNocnMgPj0gMCkKLQkJc1tjaHJzXSA9ICdcMCc7CS8qIEdSUlJSUlJSUiAqLwotCUxPR0lORigicz0nJXMnIiwgcyk7Ci0JTE9HSU5GKCJ1dGY4X21ic3Rvd2NzPSVkIiwgY2hycyA9IHV0ZjhfbWJzdG93Y3ModW5pY29kZTIsIHMsIDEwMCkpOwotCWlmIChjaHJzID49IDApCi0JCXVuaWNvZGUyW2NocnNdID0gMDsJLyogR1JSUlJSUlJSICovCi0JaWYgKG1lbWNtcCh1bmljb2RlU3RyaW5nLCB1bmljb2RlMiwgc2l6ZW9mKHVuaWNvZGVTdHJpbmcpKSA9PSAwKQotCQlMT0dJTkYoInN0cmluZ3MgbWF0Y2guLi4gZ29vZCIpOwotCWVsc2UKLQkJTE9HSU5GKCJzdHJpbmdzIGRpZCBub3QgbWF0Y2ghISIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1idXNJbmZvX2NsZWFyKHZvaWQgKnYpCitidXNfaW5mb19jbGVhcih2b2lkICp2KQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnAgPSAoc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqKSAodik7CiAKLQlpZiAocC0+cHJvY19vYmplY3QpIHsKLQkJdmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KHAtPnByb2Nfb2JqZWN0KTsKLQkJcC0+cHJvY19vYmplY3QgPSBOVUxMOwotCX0KIAlrZnJlZShwLT5uYW1lKTsKIAlwLT5uYW1lID0gTlVMTDsKIApAQCAtNTU4LDcgKzUyMiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZJbmZvX2NsZWFyKHZvaWQgKnYpCitkZXZfaW5mb19jbGVhcih2b2lkICp2KQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKnAgPQogCQkJKHN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKikodik7CkBAIC01OTMsMjIgKzU1NywyMiBAQAogCQkJc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyAqcmVzcG9uZGVycywKIAkJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmRyaXZlcl9pbmZvKQogewotCWRvd24oJk5vdGlmaWVyTG9jayk7Ci0JaWYgKG5vdGlmaWVycyA9PSBOVUxMKSB7Ci0JCW1lbXNldCgmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMsIDAsCi0JCSAgICAgICBzaXplb2YoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMpKTsKKwlkb3duKCZub3RpZmllcl9sb2NrKTsKKwlpZiAoIW5vdGlmaWVycykgeworCQltZW1zZXQoJmJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzLCAwLAorCQkgICAgICAgc2l6ZW9mKGJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzKSk7CiAJCXNlcnZlcnJlZ2lzdGVyZWQgPSAwOwkvKiBjbGVhciBmbGFnICovCiAJfSBlbHNlIHsKLQkJQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMgPSAqbm90aWZpZXJzOworCQlidXNkZXZfc2VydmVyX25vdGlmaWVycyA9ICpub3RpZmllcnM7CiAJCXNlcnZlcnJlZ2lzdGVyZWQgPSAxOwkvKiBzZXQgZmxhZyAqLwogCX0KIAlpZiAocmVzcG9uZGVycykKLQkJKnJlc3BvbmRlcnMgPSBCdXNEZXZfUmVzcG9uZGVyczsKKwkJKnJlc3BvbmRlcnMgPSBidXNkZXZfcmVzcG9uZGVyczsKIAlpZiAoZHJpdmVyX2luZm8pCiAJCWJ1c19kZXZpY2VfaW5mb19pbml0KGRyaXZlcl9pbmZvLCAiY2hpcHNldCIsICJ2aXNvcmNoaXBzZXQiLAotCQkJCSAgIFZFUlNJT04sIE5VTEwpOworCQkJCSAgICAgVkVSU0lPTiwgTlVMTCk7CiAKLQl1cCgmTm90aWZpZXJMb2NrKTsKKwl1cCgmbm90aWZpZXJfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2X3NlcnZlcik7CiAKQEAgLTYxOCwyMSArNTgyLDIxIEBACiAJCQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzICpyZXNwb25kZXJzLAogCQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZHJpdmVyX2luZm8pCiB7Ci0JZG93bigmTm90aWZpZXJMb2NrKTsKLQlpZiAobm90aWZpZXJzID09IE5VTEwpIHsKLQkJbWVtc2V0KCZCdXNEZXZfQ2xpZW50X05vdGlmaWVycywgMCwKLQkJICAgICAgIHNpemVvZihCdXNEZXZfQ2xpZW50X05vdGlmaWVycykpOworCWRvd24oJm5vdGlmaWVyX2xvY2spOworCWlmICghbm90aWZpZXJzKSB7CisJCW1lbXNldCgmYnVzZGV2X2NsaWVudF9ub3RpZmllcnMsIDAsCisJCSAgICAgICBzaXplb2YoYnVzZGV2X2NsaWVudF9ub3RpZmllcnMpKTsKIAkJY2xpZW50cmVnaXN0ZXJlZCA9IDA7CS8qIGNsZWFyIGZsYWcgKi8KIAl9IGVsc2UgewotCQlCdXNEZXZfQ2xpZW50X05vdGlmaWVycyA9ICpub3RpZmllcnM7CisJCWJ1c2Rldl9jbGllbnRfbm90aWZpZXJzID0gKm5vdGlmaWVyczsKIAkJY2xpZW50cmVnaXN0ZXJlZCA9IDE7CS8qIHNldCBmbGFnICovCiAJfQogCWlmIChyZXNwb25kZXJzKQotCQkqcmVzcG9uZGVycyA9IEJ1c0Rldl9SZXNwb25kZXJzOworCQkqcmVzcG9uZGVycyA9IGJ1c2Rldl9yZXNwb25kZXJzOwogCWlmIChkcml2ZXJfaW5mbykKIAkJYnVzX2RldmljZV9pbmZvX2luaXQoZHJpdmVyX2luZm8sICJjaGlwc2V0KGJvbHRzKSIsCiAJCQkJICAgICAidmlzb3JjaGlwc2V0IiwgVkVSU0lPTiwgTlVMTCk7Ci0JdXAoJk5vdGlmaWVyTG9jayk7CisJdXAoJm5vdGlmaWVyX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQpOwogCkBAIC02NDIsMTQgKzYwNiwxNCBAQAogCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKmJpLCAqdG1wX2JpOwogCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRpLCAqdG1wX2RpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJpLCB0bXBfYmksICZCdXNJbmZvTGlzdCwgZW50cnkpIHsKLQkJYnVzSW5mb19jbGVhcihiaSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJpLCB0bXBfYmksICZidXNfaW5mb19saXN0LCBlbnRyeSkgeworCQlidXNfaW5mb19jbGVhcihiaSk7CiAJCWxpc3RfZGVsKCZiaS0+ZW50cnkpOwogCQlrZnJlZShiaSk7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRpLCB0bXBfZGksICZEZXZJbmZvTGlzdCwgZW50cnkpIHsKLQkJZGV2SW5mb19jbGVhcihkaSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRpLCB0bXBfZGksICZkZXZfaW5mb19saXN0LCBlbnRyeSkgeworCQlkZXZfaW5mb19jbGVhcihkaSk7CiAJCWxpc3RfZGVsKCZkaS0+ZW50cnkpOwogCQlrZnJlZShkaSk7CiAJfQpAQCAtNjY0LDkgKzYyOCw4IEBACiAKIAlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJaWYgKGNoaXBzZXRfaW5pdGVkKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0NISVBTRVRfSU5JVCBGYWlsZWQ6IEFscmVhZHkgRG9uZS4iKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAJY2hpcHNldF9pbml0ZWQgPSAxOwogCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwpAQCAtNjgxLDcgKzY0NCw3IEBACiAJICogZmVhdHVyZXMtYXdhcmUgZHJpdmVyLiAqLwogCWZlYXR1cmVzIHw9IFVMVFJBX0NISVBTRVRfRkVBVFVSRV9SRVBMWTsKIAotQXdheToKK2NsZWFudXA6CiAJaWYgKHJjIDwgMCkKIAkJY2xlYW51cF9jb250cm9sdm1fc3RydWN0dXJlcygpOwogCWlmIChpbm1zZy0+aGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQpAQCAtNjkwLDEwICs2NTMsMTAgQEAKIAogc3RhdGljIHZvaWQKIGNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnLAotCQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpCisJCQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UpCiB7CiAJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpOwotCW1lbWNweSgmbXNnLT5oZHIsIG1zZ0hkciwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwltZW1jcHkoJm1zZy0+aGRyLCBtc2dfaGRyLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCW1zZy0+aGRyLnBheWxvYWRfYnl0ZXMgPSAwOwogCW1zZy0+aGRyLnBheWxvYWRfdm1fb2Zmc2V0ID0gMDsKIAltc2ctPmhkci5wYXlsb2FkX21heF9ieXRlcyA9IDA7CkBAIC03MDQsNTkgKzY2Nyw1NCBAQAogfQogCiBzdGF0aWMgdm9pZAotY29udHJvbHZtX3Jlc3BvbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpCitjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG91dG1zZzsKIAotCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ0hkciwgcmVzcG9uc2UpOworCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ19oZHIsIHJlc3BvbnNlKTsKIAkvKiBGb3IgRGlhZ1Bvb2wgY2hhbm5lbCBERVZJQ0VfQ0hBTkdFU1RBVEUsIHdlIG5lZWQgdG8gc2VuZAogCSogYmFjayB0aGUgZGV2aWNlQ2hhbmdlU3RhdGUgc3RydWN0dXJlIGluIHRoZSBwYWNrZXQuICovCi0JaWYgKG1zZ0hkci0+aWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURQotCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vID09Ci0JICAgIGdfZGlhZ3Bvb2xCdXNObwotCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID09Ci0JICAgIGdfZGlhZ3Bvb2xEZXZObykKLQkJb3V0bXNnLmNtZCA9IGdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQ7Ci0JaWYgKG91dG1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpIHsKLQkJTE9HSU5GKCIlcyBjb250cm9sdm1fbXNnPTB4JXggcmVzcG9uc2U9JWQgZm9yIHRlc3QgbWVzc2FnZSIsCi0JCSAgICAgICBfX2Z1bmNfXywgb3V0bXNnLmhkci5pZCwgcmVzcG9uc2UpOworCWlmIChtc2dfaGRyLT5pZCA9PSBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFICYmCisJICAgIGdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vID09CisJICAgIGdfZGlhZ3Bvb2xfYnVzX25vICYmCisJICAgIGdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID09CisJICAgIGdfZGlhZ3Bvb2xfZGV2X25vKQorCQlvdXRtc2cuY21kID0gZ19kZXZpY2VjaGFuZ2VzdGF0ZV9wYWNrZXQ7CisJaWYgKG91dG1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCiAJCXJldHVybjsKLQl9Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAogCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKLQkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOwogCQlyZXR1cm47CiAJfQogfQogCiBzdGF0aWMgdm9pZAotY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ0hkciwKK2NvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAogCQkJICAgICAgIGludCByZXNwb25zZSwKIAkJCSAgICAgICBlbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2Ugb3V0bXNnOwogCi0JY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnX2hkciwgcmVzcG9uc2UpOwogCW91dG1zZy5jbWQuaW5pdF9jaGlwc2V0LmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKIAkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7Ci0JCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKIAkJcmV0dXJuOwogCX0KIH0KIAogc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkJc3RydWN0IHNwYXJfc2VnbWVudF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2Ugb3V0bXNnOwogCi0JY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnX2hkciwgcmVzcG9uc2UpOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHN0YXRlOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSA9IDE7Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKIAkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7Ci0JCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKIAkJcmV0dXJuOwogCX0KIH0KQEAgLTc2NSw1NiArNzIzLDUwIEBACiB2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnLAogCQkJICBlbnVtIGNyYXNoX29ial90eXBlIHR5cGUpCiB7Ci0JdTMyIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldDsKLQl1MTYgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQ7CisJdTMyIGNyYXNoX21zZ19vZmZzZXQ7CisJdTE2IGNyYXNoX21zZ19jb3VudDsKIAogCS8qIGdldCBzYXZlZCBtZXNzYWdlIGNvdW50ICovCi0JaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCWlmICh2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKIAkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAogCQkJCSAgICAgICBzYXZlZF9jcmFzaF9tZXNzYWdlX2NvdW50KSwKLQkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBDb3VudCIpOworCQkJICAgICAgJmNyYXNoX21zZ19jb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobG9jYWxTYXZlZENyYXNoTXNnQ291bnQgIT0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCkgewotCQlMT0dFUlIoIlNhdmVkIE1lc3NhZ2UgQ291bnQgaW5jb3JyZWN0ICVkIiwKLQkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50KTsKKwlpZiAoY3Jhc2hfbXNnX2NvdW50ICE9IENPTlRST0xWTV9DUkFTSE1TR19NQVgpIHsKIAkJUE9TVENPREVfTElOVVhfMyhDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQywKLQkJCQkgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsCisJCQkJIGNyYXNoX21zZ19jb3VudCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGdldCBzYXZlZCBjcmFzaCBtZXNzYWdlIG9mZnNldCAqLwotCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCiAJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKIAkJCQkgICAgICAgc2F2ZWRfY3Jhc2hfbWVzc2FnZV9vZmZzZXQpLAotCQkJICAgICAgJmxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwgc2l6ZW9mKHUzMikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBPZmZzZXQiKTsKKwkJCSAgICAgICZjcmFzaF9tc2dfb2Zmc2V0LCBzaXplb2YodTMyKSkgPCAwKSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0NUUkxfUkRfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh0eXBlID09IENSQVNIX0JVUykgewotCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQkJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQsCisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJICAgICAgIGNyYXNoX21zZ19vZmZzZXQsCiAJCQkJICAgICAgIG1zZywKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpIDwgMCkgewotCQkJTE9HRVJSKCJTQVZFX01TR19CVVNfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlQnVzTXNnISIpOwogCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19CVVNfRkFJTFVSRV9QQywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewotCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQkJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJCSAgICAgICBjcmFzaF9tc2dfb2Zmc2V0ICsKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSksIG1zZywKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpIDwgMCkgewotCQkJTE9HRVJSKCJTQVZFX01TR19ERVZfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlRGV2TXNnISIpOwogCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19ERVZfRkFJTFVSRV9QQywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXR1cm47CkBAIC04MjQsMTM0ICs3NzYsMTE4IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKTsKIAogc3RhdGljIHZvaWQKLWJ1c19yZXNwb25kZXIoZW51bSBjb250cm9sdm1faWQgY21kSWQsIHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCitidXNfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZF9pZCwgdWxvbmcgYnVzX25vLCBpbnQgcmVzcG9uc2UpCiB7CiAJc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqcCA9IE5VTEw7CiAJQk9PTCBuZWVkX2NsZWFyID0gRkFMU0U7CiAKLQlwID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvciBidXNObz0lbHUiLCBidXNObyk7CisJcCA9IGZpbmRidXMoJmJ1c19pbmZvX2xpc3QsIGJ1c19ubyk7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQorCiAJaWYgKHJlc3BvbnNlIDwgMCkgewotCQlpZiAoKGNtZElkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKSAmJgorCQlpZiAoKGNtZF9pZCA9PSBDT05UUk9MVk1fQlVTX0NSRUFURSkgJiYKIAkJICAgIChyZXNwb25zZSAhPSAoLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORSkpKQogCQkJLyogdW5kbyB0aGUgcm93IHdlIGp1c3QgY3JlYXRlZC4uLiAqLwotCQkJZGVsYnVzZGV2aWNlcygmRGV2SW5mb0xpc3QsIGJ1c05vKTsKKwkJCWRlbGJ1c2RldmljZXMoJmRldl9pbmZvX2xpc3QsIGJ1c19ubyk7CiAJfSBlbHNlIHsKLQkJaWYgKGNtZElkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKQorCQlpZiAoY21kX2lkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKQogCQkJcC0+c3RhdGUuY3JlYXRlZCA9IDE7Ci0JCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fQlVTX0RFU1RST1kpCisJCWlmIChjbWRfaWQgPT0gQ09OVFJPTFZNX0JVU19ERVNUUk9ZKQogCQkJbmVlZF9jbGVhciA9IFRSVUU7CiAJfQogCi0JaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCA9PSBDT05UUk9MVk1fSU5WQUxJRCkgewotCQlMT0dFUlIoImJ1c19yZXNwb25kZXIgbm8gcGVuZGluZyBtc2ciKTsKKwlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkID09IENPTlRST0xWTV9JTlZBTElEKQogCQlyZXR1cm47CQkvKiBubyBjb250cm9sdm0gcmVzcG9uc2UgbmVlZGVkICovCi0JfQotCWlmIChwLT5wZW5kaW5nX21zZ19oZHIuaWQgIT0gKHUzMikgY21kSWQpIHsKLQkJTE9HRVJSKCJleHBlY3RlZD0lZCwgZm91bmQ9JWQiLCBjbWRJZCwgcC0+cGVuZGluZ19tc2dfaGRyLmlkKTsKKwlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkICE9ICh1MzIpY21kX2lkKQogCQlyZXR1cm47Ci0JfQogCWNvbnRyb2x2bV9yZXNwb25kKCZwLT5wZW5kaW5nX21zZ19oZHIsIHJlc3BvbnNlKTsKIAlwLT5wZW5kaW5nX21zZ19oZHIuaWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKIAlpZiAobmVlZF9jbGVhcikgewotCQlidXNJbmZvX2NsZWFyKHApOwotCQlkZWxidXNkZXZpY2VzKCZEZXZJbmZvTGlzdCwgYnVzTm8pOworCQlidXNfaW5mb19jbGVhcihwKTsKKwkJZGVsYnVzZGV2aWNlcygmZGV2X2luZm9fbGlzdCwgYnVzX25vKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZElkLAotCQkJICAgICB1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSwKLQkJCSAgICAgc3RydWN0IHNwYXJfc2VnbWVudF9zdGF0ZSByZXNwb25zZVN0YXRlKQorZGV2aWNlX2NoYW5nZXN0YXRlX3Jlc3BvbmRlcihlbnVtIGNvbnRyb2x2bV9pZCBjbWRfaWQsCisJCQkgICAgIHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UsCisJCQkgICAgIHN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgcmVzcG9uc2Vfc3RhdGUpCiB7CiAJc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqcCA9IE5VTEw7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG91dG1zZzsKIAotCXAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvcjsgYnVzTm89JWx1LCBkZXZObz0lbHUiLCBidXNObywgZGV2Tm8pOworCXAgPSBmaW5kZGV2aWNlKCZkZXZfaW5mb19saXN0LCBidXNfbm8sIGRldl9ubyk7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQotCWlmIChwLT5wZW5kaW5nX21zZ19oZHIuaWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKLQkJTE9HRVJSKCJkZXZpY2VfcmVzcG9uZGVyIG5vIHBlbmRpbmcgbXNnIik7CisJaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCA9PSBDT05UUk9MVk1fSU5WQUxJRCkKIAkJcmV0dXJuOwkJLyogbm8gY29udHJvbHZtIHJlc3BvbnNlIG5lZWRlZCAqLwotCX0KLQlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkICE9IGNtZElkKSB7Ci0JCUxPR0VSUigiZXhwZWN0ZWQ9JWQsIGZvdW5kPSVkIiwgY21kSWQsIHAtPnBlbmRpbmdfbXNnX2hkci5pZCk7CisJaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCAhPSBjbWRfaWQpCiAJCXJldHVybjsKLQl9CiAKIAljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCAmcC0+cGVuZGluZ19tc2dfaGRyLCByZXNwb25zZSk7CiAKLQlvdXRtc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vID0gYnVzTm87Ci0Jb3V0bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA9IGRldk5vOwotCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHJlc3BvbnNlU3RhdGU7CisJb3V0bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubyA9IGJ1c19ubzsKKwlvdXRtc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID0gZGV2X25vOworCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHJlc3BvbnNlX3N0YXRlOwogCi0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAotCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKLQkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKQogCQlyZXR1cm47Ci0JfQogCiAJcC0+cGVuZGluZ19tc2dfaGRyLmlkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZElkLCB1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sCitkZXZpY2VfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZF9pZCwgdWxvbmcgYnVzX25vLCB1bG9uZyBkZXZfbm8sCiAJCSBpbnQgcmVzcG9uc2UpCiB7CiAJc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqcCA9IE5VTEw7CiAJQk9PTCBuZWVkX2NsZWFyID0gRkFMU0U7CiAKLQlwID0gZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c05vLCBkZXZObyk7Ci0JaWYgKCFwKSB7Ci0JCUxPR0VSUigiaW50ZXJuYWwgZXJyb3I7IGJ1c05vPSVsdSwgZGV2Tm89JWx1IiwgYnVzTm8sIGRldk5vKTsKKwlwID0gZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOworCWlmICghcCkKIAkJcmV0dXJuOwotCX0KIAlpZiAocmVzcG9uc2UgPj0gMCkgewotCQlpZiAoY21kSWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUpCisJCWlmIChjbWRfaWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUpCiAJCQlwLT5zdGF0ZS5jcmVhdGVkID0gMTsKLQkJaWYgKGNtZElkID09IENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSkKKwkJaWYgKGNtZF9pZCA9PSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1kpCiAJCQluZWVkX2NsZWFyID0gVFJVRTsKIAl9CiAKLQlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkID09IENPTlRST0xWTV9JTlZBTElEKSB7Ci0JCUxPR0VSUigiZGV2aWNlX3Jlc3BvbmRlciBubyBwZW5kaW5nIG1zZyIpOworCWlmIChwLT5wZW5kaW5nX21zZ19oZHIuaWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpCiAJCXJldHVybjsJCS8qIG5vIGNvbnRyb2x2bSByZXNwb25zZSBuZWVkZWQgKi8KLQl9Ci0JaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCAhPSAodTMyKSBjbWRJZCkgewotCQlMT0dFUlIoImV4cGVjdGVkPSVkLCBmb3VuZD0lZCIsIGNtZElkLCBwLT5wZW5kaW5nX21zZ19oZHIuaWQpOworCisJaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCAhPSAodTMyKWNtZF9pZCkKIAkJcmV0dXJuOwotCX0KKwogCWNvbnRyb2x2bV9yZXNwb25kKCZwLT5wZW5kaW5nX21zZ19oZHIsIHJlc3BvbnNlKTsKIAlwLT5wZW5kaW5nX21zZ19oZHIuaWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKIAlpZiAobmVlZF9jbGVhcikKLQkJZGV2SW5mb19jbGVhcihwKTsKKwkJZGV2X2luZm9fY2xlYXIocCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1idXNfZXBpbG9nKHUzMiBidXNObywKLQkgICB1MzIgY21kLCBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIsCi0JICAgaW50IHJlc3BvbnNlLCBCT09MIG5lZWRSZXNwb25zZSkKK2J1c19lcGlsb2codTMyIGJ1c19ubywKKwkgICB1MzIgY21kLCBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAorCSAgIGludCByZXNwb25zZSwgQk9PTCBuZWVkX3Jlc3BvbnNlKQogewogCUJPT0wgbm90aWZpZWQgPSBGQUxTRTsKIAotCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnBCdXNJbmZvID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbyA9IGZpbmRidXMoJmJ1c19pbmZvX2xpc3QsCisJCQkJCQkJIGJ1c19ubyk7CiAKLQlpZiAoIXBCdXNJbmZvKSB7Ci0JCUxPR0VSUigiSFVIPyBiYWQgYnVzTm89JWQiLCBidXNObyk7CisJaWYgKCFidXNfaW5mbykKIAkJcmV0dXJuOwotCX0KLQlpZiAobmVlZFJlc3BvbnNlKSB7Ci0JCW1lbWNweSgmcEJ1c0luZm8tPnBlbmRpbmdfbXNnX2hkciwgbXNnSGRyLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKLQl9IGVsc2UKLQkJcEJ1c0luZm8tPnBlbmRpbmdfbXNnX2hkci5pZCA9IENPTlRST0xWTV9JTlZBTElEOwogCi0JZG93bigmTm90aWZpZXJMb2NrKTsKKwlpZiAobmVlZF9yZXNwb25zZSkgeworCQltZW1jcHkoJmJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIsIG1zZ19oZHIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOworCX0gZWxzZSB7CisJCWJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIuaWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKKwl9CisKKwlkb3duKCZub3RpZmllcl9sb2NrKTsKIAlpZiAocmVzcG9uc2UgPT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIENPTlRST0xWTV9CVVNfQ1JFQVRFOgpAQCAtOTY1LDI0ICs5MDEsMjQgQEAKIAkJCSogZWl0aGVyIHNlcnZlciBvciBjbGllbnQgZGV2aWNlcwogCQkJKiAtIEJ1c0Rldl9DbGllbnQgY2FuIGhhbmRsZSBPTkxZIGNsaWVudAogCQkJKiBkZXZpY2VzICovCi0JCQlpZiAoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgewotCQkJCSgqQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgKGJ1c05vKTsKKwkJCWlmIChidXNkZXZfc2VydmVyX25vdGlmaWVycy5idXNfY3JlYXRlKSB7CisJCQkJKCpidXNkZXZfc2VydmVyX25vdGlmaWVycy5idXNfY3JlYXRlKSAoYnVzX25vKTsKIAkJCQlub3RpZmllZCA9IFRSVUU7CiAJCQl9Ci0JCQlpZiAoKCFwQnVzSW5mby0+ZmxhZ3Muc2VydmVyKSAvKmNsaWVudCAqLyAmJgotCQkJICAgIEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19jcmVhdGUpIHsKLQkJCQkoKkJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19jcmVhdGUpIChidXNObyk7CisJCQlpZiAoKCFidXNfaW5mby0+ZmxhZ3Muc2VydmVyKSAvKmNsaWVudCAqLyAmJgorCQkJICAgIGJ1c2Rldl9jbGllbnRfbm90aWZpZXJzLmJ1c19jcmVhdGUpIHsKKwkJCQkoKmJ1c2Rldl9jbGllbnRfbm90aWZpZXJzLmJ1c19jcmVhdGUpIChidXNfbm8pOwogCQkJCW5vdGlmaWVkID0gVFJVRTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKLQkJCWlmIChCdXNEZXZfU2VydmVyX05vdGlmaWVycy5idXNfZGVzdHJveSkgewotCQkJCSgqQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIChidXNObyk7CisJCQlpZiAoYnVzZGV2X3NlcnZlcl9ub3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKmJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzX25vKTsKIAkJCQlub3RpZmllZCA9IFRSVUU7CiAJCQl9Ci0JCQlpZiAoKCFwQnVzSW5mby0+ZmxhZ3Muc2VydmVyKSAvKmNsaWVudCAqLyAmJgotCQkJICAgIEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19kZXN0cm95KSB7Ci0JCQkJKCpCdXNEZXZfQ2xpZW50X05vdGlmaWVycy5idXNfZGVzdHJveSkgKGJ1c05vKTsKKwkJCWlmICgoIWJ1c19pbmZvLT5mbGFncy5zZXJ2ZXIpIC8qY2xpZW50ICovICYmCisJCQkgICAgYnVzZGV2X2NsaWVudF9ub3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKmJ1c2Rldl9jbGllbnRfbm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzX25vKTsKIAkJCQlub3RpZmllZCA9IFRSVUU7CiAJCQl9CiAJCQlicmVhazsKQEAgLTk5NSw0NSArOTMxLDQ1IEBACiAJCSAqLwogCQk7CiAJZWxzZQotCQlidXNfcmVzcG9uZGVyKGNtZCwgYnVzTm8sIHJlc3BvbnNlKTsKLQl1cCgmTm90aWZpZXJMb2NrKTsKKwkJYnVzX3Jlc3BvbmRlcihjbWQsIGJ1c19ubywgcmVzcG9uc2UpOworCXVwKCZub3RpZmllcl9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKLWRldmljZV9lcGlsb2codTMyIGJ1c05vLCB1MzIgZGV2Tm8sIHN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgc3RhdGUsIHUzMiBjbWQsCi0JICAgICAgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCi0JICAgICAgQk9PTCBuZWVkUmVzcG9uc2UsIEJPT0wgZm9yX3Zpc29yYnVzKQorZGV2aWNlX2VwaWxvZyh1MzIgYnVzX25vLCB1MzIgZGV2X25vLCBzdHJ1Y3Qgc3Bhcl9zZWdtZW50X3N0YXRlIHN0YXRlLCB1MzIgY21kLAorCSAgICAgIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKKwkgICAgICBCT09MIG5lZWRfcmVzcG9uc2UsIEJPT0wgZm9yX3Zpc29yYnVzKQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyAqbm90aWZpZXJzID0gTlVMTDsKIAlCT09MIG5vdGlmaWVkID0gRkFMU0U7CiAKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpwRGV2SW5mbyA9Ci0JCWZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRldl9pbmZvID0KKwkJZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOwogCWNoYXIgKmVudnBbXSA9IHsKIAkJIlNQQVJTUF9ESUFHUE9PTF9QQVVTRURfU1RBVEUgPSAxIiwKIAkJTlVMTAogCX07CiAKLQlpZiAoIXBEZXZJbmZvKSB7Ci0JCUxPR0VSUigiSFVIPyBiYWQgYnVzTm89JWQsIGRldk5vPSVkIiwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIWRldl9pbmZvKQogCQlyZXR1cm47Ci0JfQotCWlmIChmb3Jfdmlzb3JidXMpCi0JCW5vdGlmaWVycyA9ICZCdXNEZXZfU2VydmVyX05vdGlmaWVyczsKLQllbHNlCi0JCW5vdGlmaWVycyA9ICZCdXNEZXZfQ2xpZW50X05vdGlmaWVyczsKLQlpZiAobmVlZFJlc3BvbnNlKSB7Ci0JCW1lbWNweSgmcERldkluZm8tPnBlbmRpbmdfbXNnX2hkciwgbXNnSGRyLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKLQl9IGVsc2UKLQkJcERldkluZm8tPnBlbmRpbmdfbXNnX2hkci5pZCA9IENPTlRST0xWTV9JTlZBTElEOwogCi0JZG93bigmTm90aWZpZXJMb2NrKTsKKwlpZiAoZm9yX3Zpc29yYnVzKQorCQlub3RpZmllcnMgPSAmYnVzZGV2X3NlcnZlcl9ub3RpZmllcnM7CisJZWxzZQorCQlub3RpZmllcnMgPSAmYnVzZGV2X2NsaWVudF9ub3RpZmllcnM7CisJaWYgKG5lZWRfcmVzcG9uc2UpIHsKKwkJbWVtY3B5KCZkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyLCBtc2dfaGRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwl9IGVsc2UgeworCQlkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyLmlkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisJfQorCisJZG93bigmbm90aWZpZXJfbG9jayk7CiAJaWYgKHJlc3BvbnNlID49IDApIHsKIAkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKIAkJCWlmIChub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIHsKLQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2NyZWF0ZSkgKGJ1c05vLCBkZXZObyk7CisJCQkJKCpub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIChidXNfbm8sIGRldl9ubyk7CiAJCQkJbm90aWZpZWQgPSBUUlVFOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xMDQzLDggKzk3OSw4IEBACiAJCQkgICAgc3RhdGUub3BlcmF0aW5nID09CiAJCQkJc2VnbWVudF9zdGF0ZV9ydW5uaW5nLm9wZXJhdGluZykgewogCQkJCWlmIChub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIHsKLQkJCQkJKCpub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIChidXNObywKLQkJCQkJCQkJICAgICBkZXZObyk7CisJCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfcmVzdW1lKSAoYnVzX25vLAorCQkJCQkJCQkgICAgIGRldl9ubyk7CiAJCQkJCW5vdGlmaWVkID0gVFJVRTsKIAkJCQl9CiAJCQl9CkBAIC0xMDU2LDggKzk5Miw4IEBACiAJCQkJICogd2hlcmUgc2VydmVyIGlzIGxvc3QKIAkJCQkgKi8KIAkJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIHsKLQkJCQkJKCpub3RpZmllcnMtPmRldmljZV9wYXVzZSkgKGJ1c05vLAotCQkJCQkJCQkgICAgZGV2Tm8pOworCQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX3BhdXNlKSAoYnVzX25vLAorCQkJCQkJCQkgICAgZGV2X25vKTsKIAkJCQkJbm90aWZpZWQgPSBUUlVFOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoc3RhdGUuYWxpdmUgPT0gc2VnbWVudF9zdGF0ZV9wYXVzZWQuYWxpdmUgJiYKQEAgLTEwNjYsMjIgKzEwMDIsMjAgQEAKIAkJCQkvKiB0aGlzIGlzIGxpdGUgcGF1c2Ugd2hlcmUgY2hhbm5lbCBpcwogCQkJCSAqIHN0aWxsIHZhbGlkIGp1c3QgJ3BhdXNlJyBvZiBpdAogCQkJCSAqLwotCQkJCWlmIChidXNObyA9PSBnX2RpYWdwb29sQnVzTm8KLQkJCQkgICAgJiYgZGV2Tm8gPT0gZ19kaWFncG9vbERldk5vKSB7Ci0JCQkJCUxPR0lORigiREVWSUNFX0NIQU5HRVNUQVRFKERpYWdwb29sQ2hhbm5lbCBidXNObz0lZCBkZXZObz0lZCBpcyBwYXVzaW5nLi4uKSIsCi0JCQkJCSAgICAgYnVzTm8sIGRldk5vKTsKKwkJCQlpZiAoYnVzX25vID09IGdfZGlhZ3Bvb2xfYnVzX25vICYmCisJCQkJICAgIGRldl9ubyA9PSBnX2RpYWdwb29sX2Rldl9ubykgewogCQkJCQkvKiB0aGlzIHdpbGwgdHJpZ2dlciB0aGUKIAkJCQkJICogZGlhZ19zaHV0ZG93bi5zaCBzY3JpcHQgaW4KIAkJCQkJICogdGhlIHZpc29yY2hpcHNldCBob3RwbHVnICovCiAJCQkJCWtvYmplY3RfdWV2ZW50X2VudgotCQkJCQkgICAgKCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi4KKwkJCQkJICAgICgmdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYuCiAJCQkJCSAgICAga29iaiwgS09CSl9PTkxJTkUsIGVudnApOwogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWToKIAkJCWlmIChub3RpZmllcnMtPmRldmljZV9kZXN0cm95KSB7Ci0JCQkJKCpub3RpZmllcnMtPmRldmljZV9kZXN0cm95KSAoYnVzTm8sIGRldk5vKTsKKwkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIChidXNfbm8sIGRldl9ubyk7CiAJCQkJbm90aWZpZWQgPSBUUlVFOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xMDk0LDYyICsxMDI4LDU3IEBACiAJCSAqLwogCQk7CiAJZWxzZQotCQlkZXZpY2VfcmVzcG9uZGVyKGNtZCwgYnVzTm8sIGRldk5vLCByZXNwb25zZSk7Ci0JdXAoJk5vdGlmaWVyTG9jayk7CisJCWRldmljZV9yZXNwb25kZXIoY21kLCBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UpOworCXVwKCZub3RpZmllcl9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKIGJ1c19jcmVhdGUoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZykKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfcGFja2V0ICpjbWQgPSAmaW5tc2ctPmNtZDsKLQl1bG9uZyBidXNObyA9IGNtZC0+Y3JlYXRlX2J1cy5idXNfbm87CisJdWxvbmcgYnVzX25vID0gY21kLT5jcmVhdGVfYnVzLmJ1c19ubzsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwotCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnBCdXNJbmZvID0gTlVMTDsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbyA9IE5VTEw7CiAKLQotCXBCdXNJbmZvID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKLQlpZiAocEJ1c0luZm8gJiYgKHBCdXNJbmZvLT5zdGF0ZS5jcmVhdGVkID09IDEpKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWx1IGFscmVhZHkgZXhpc3RzIiwKLQkJICAgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCWJ1c19pbmZvID0gZmluZGJ1cygmYnVzX2luZm9fbGlzdCwgYnVzX25vKTsKKwlpZiAoYnVzX2luZm8gJiYgKGJ1c19pbmZvLT5zdGF0ZS5jcmVhdGVkID09IDEpKSB7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQotCXBCdXNJbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmIChwQnVzSW5mbyA9PSBOVUxMKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWx1IGt6YWxsb2MgZmFpbGVkIiwKLQkJICAgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCWJ1c19pbmZvID0ga3phbGxvYyhzaXplb2YoKmJ1c19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidXNfaW5mbykgeworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JSU5JVF9MSVNUX0hFQUQoJnBCdXNJbmZvLT5lbnRyeSk7Ci0JcEJ1c0luZm8tPmJ1c19ubyA9IGJ1c05vOwotCXBCdXNJbmZvLT5kZXZfbm8gPSBjbWQtPmNyZWF0ZV9idXMuZGV2X2NvdW50OworCUlOSVRfTElTVF9IRUFEKCZidXNfaW5mby0+ZW50cnkpOworCWJ1c19pbmZvLT5idXNfbm8gPSBidXNfbm87CisJYnVzX2luZm8tPmRldl9ubyA9IGNtZC0+Y3JlYXRlX2J1cy5kZXZfY291bnQ7CiAKLQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAlpZiAoaW5tc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSkKLQkJcEJ1c0luZm8tPmNoYW5faW5mby5hZGRyX3R5cGUgPSBBRERSVFlQRV9MT0NBTFRFU1Q7CisJCWJ1c19pbmZvLT5jaGFuX2luZm8uYWRkcl90eXBlID0gQUREUlRZUEVfTE9DQUxURVNUOwogCWVsc2UKLQkJcEJ1c0luZm8tPmNoYW5faW5mby5hZGRyX3R5cGUgPSBBRERSVFlQRV9MT0NBTFBIWVNJQ0FMOworCQlidXNfaW5mby0+Y2hhbl9pbmZvLmFkZHJfdHlwZSA9IEFERFJUWVBFX0xPQ0FMUEhZU0lDQUw7CiAKLQlwQnVzSW5mby0+ZmxhZ3Muc2VydmVyID0gaW5tc2ctPmhkci5mbGFncy5zZXJ2ZXI7Ci0JcEJ1c0luZm8tPmNoYW5faW5mby5jaGFubmVsX2FkZHIgPSBjbWQtPmNyZWF0ZV9idXMuY2hhbm5lbF9hZGRyOwotCXBCdXNJbmZvLT5jaGFuX2luZm8ubl9jaGFubmVsX2J5dGVzID0gY21kLT5jcmVhdGVfYnVzLmNoYW5uZWxfYnl0ZXM7Ci0JcEJ1c0luZm8tPmNoYW5faW5mby5jaGFubmVsX3R5cGVfdXVpZCA9CisJYnVzX2luZm8tPmZsYWdzLnNlcnZlciA9IGlubXNnLT5oZHIuZmxhZ3Muc2VydmVyOworCWJ1c19pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF9hZGRyID0gY21kLT5jcmVhdGVfYnVzLmNoYW5uZWxfYWRkcjsKKwlidXNfaW5mby0+Y2hhbl9pbmZvLm5fY2hhbm5lbF9ieXRlcyA9IGNtZC0+Y3JlYXRlX2J1cy5jaGFubmVsX2J5dGVzOworCWJ1c19pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQgPQogCQkJY21kLT5jcmVhdGVfYnVzLmJ1c19kYXRhX3R5cGVfdXVpZDsKLQlwQnVzSW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfaW5zdF91dWlkID0gY21kLT5jcmVhdGVfYnVzLmJ1c19pbnN0X3V1aWQ7CisJYnVzX2luZm8tPmNoYW5faW5mby5jaGFubmVsX2luc3RfdXVpZCA9IGNtZC0+Y3JlYXRlX2J1cy5idXNfaW5zdF91dWlkOwogCi0JbGlzdF9hZGQoJnBCdXNJbmZvLT5lbnRyeSwgJkJ1c0luZm9MaXN0KTsKKwlsaXN0X2FkZCgmYnVzX2luZm8tPmVudHJ5LCAmYnVzX2luZm9fbGlzdCk7CiAKLQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRVhJVF9QQywgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FWElUX1BDLCBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCi1Bd2F5OgotCWJ1c19lcGlsb2coYnVzTm8sIENPTlRST0xWTV9CVVNfQ1JFQVRFLCAmaW5tc2ctPmhkciwKK2NsZWFudXA6CisJYnVzX2VwaWxvZyhidXNfbm8sIENPTlRST0xWTV9CVVNfQ1JFQVRFLCAmaW5tc2ctPmhkciwKIAkJICAgcmMsIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSk7CiB9CiAKQEAgLTExNTcsNzYgKzEwODYsNTggQEAKIGJ1c19kZXN0cm95KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLT5jbWQ7Ci0JdWxvbmcgYnVzTm8gPSBjbWQtPmRlc3Ryb3lfYnVzLmJ1c19ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpwQnVzSW5mbzsKKwl1bG9uZyBidXNfbm8gPSBjbWQtPmRlc3Ryb3lfYnVzLmJ1c19ubzsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbzsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogCi0JcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOwotCWlmICghcEJ1c0luZm8pIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBidXMgJWx1IGludmFsaWQiLCBidXNObyk7CisJYnVzX2luZm8gPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOworCWlmICghYnVzX2luZm8pCiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOwotCQlnb3RvIEF3YXk7Ci0JfQotCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogYnVzICVsdSBhbHJlYWR5IGRlc3Ryb3llZCIsCi0JCSAgICAgYnVzTm8pOworCWVsc2UgaWYgKGJ1c19pbmZvLT5zdGF0ZS5jcmVhdGVkID09IDApCiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKLQkJZ290byBBd2F5OwotCX0KIAotQXdheToKLQlidXNfZXBpbG9nKGJ1c05vLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksICZpbm1zZy0+aGRyLAorCWJ1c19lcGlsb2coYnVzX25vLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksICZpbm1zZy0+aGRyLAogCQkgICByYywgaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCA9PSAxKTsKIH0KIAogc3RhdGljIHZvaWQKLWJ1c19jb25maWd1cmUoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZywgUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9jdHgpCitidXNfY29uZmlndXJlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2csCisJICAgICAgc3RydWN0IHBhcnNlcl9jb250ZXh0ICpwYXJzZXJfY3R4KQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy0+Y21kOwotCXVsb25nIGJ1c05vID0gY21kLT5jb25maWd1cmVfYnVzLmJ1c19ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpwQnVzSW5mbyA9IE5VTEw7CisJdWxvbmcgYnVzX25vID0gY21kLT5jb25maWd1cmVfYnVzLmJ1c19ubzsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbyA9IE5VTEw7CiAJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKIAljaGFyIHNbOTldOwogCi0JYnVzTm8gPSBjbWQtPmNvbmZpZ3VyZV9idXMuYnVzX25vOwotCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FTlRSWV9QQywgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWJ1c19ubyA9IGNtZC0+Y29uZmlndXJlX2J1cy5idXNfbm87CisJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0VOVFJZX1BDLCBidXNfbm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKLQlwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7Ci0JaWYgKCFwQnVzSW5mbykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ09ORklHVVJFIEZhaWxlZDogYnVzICVsdSBpbnZhbGlkIiwKLQkJICAgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCWJ1c19pbmZvID0gZmluZGJ1cygmYnVzX2luZm9fbGlzdCwgYnVzX25vKTsKKwlpZiAoIWJ1c19pbmZvKSB7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDLCBidXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOwotCQlnb3RvIEF3YXk7Ci0JfQotCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBJbnZhbGlkIGJ1cyAlbHUgLSBub3QgY3JlYXRlZCB5ZXQiLAotCQkgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCX0gZWxzZSBpZiAoYnVzX2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKLQkJZ290byBBd2F5OwotCX0KLQkvKiBUQkQgLSBhZGQgdGhpcyBjaGVjayB0byBvdGhlciBjb21tYW5kcyBhbHNvLi4uICovCi0JaWYgKHBCdXNJbmZvLT5wZW5kaW5nX21zZ19oZHIuaWQgIT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSBGYWlsZWQ6IGJ1cyAlbHUgTXNnSWQ9JXUgb3V0c3RhbmRpbmciLAotCQkgICAgIGJ1c05vLCAodWludCkgcEJ1c0luZm8tPnBlbmRpbmdfbXNnX2hkci5pZCk7Ci0JCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDLCBidXNObywKKwl9IGVsc2UgaWYgKGJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIuaWQgIT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQ7Ci0JCWdvdG8gQXdheTsKKwl9IGVsc2UgeworCQlidXNfaW5mby0+cGFydGl0aW9uX2hhbmRsZSA9IGNtZC0+Y29uZmlndXJlX2J1cy5ndWVzdF9oYW5kbGU7CisJCWJ1c19pbmZvLT5wYXJ0aXRpb25fdXVpZCA9IHBhcnNlcl9pZF9nZXQocGFyc2VyX2N0eCk7CisJCXBhcnNlcl9wYXJhbV9zdGFydChwYXJzZXJfY3R4LCBQQVJTRVJTVFJJTkdfTkFNRSk7CisJCWJ1c19pbmZvLT5uYW1lID0gcGFyc2VyX3N0cmluZ19nZXQocGFyc2VyX2N0eCk7CisKKwkJdmlzb3JjaGFubmVsX3V1aWRfaWQoJmJ1c19pbmZvLT5wYXJ0aXRpb25fdXVpZCwgcyk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FWElUX1BDLCBidXNfbm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCX0KLQotCXBCdXNJbmZvLT5wYXJ0aXRpb25faGFuZGxlID0gY21kLT5jb25maWd1cmVfYnVzLmd1ZXN0X2hhbmRsZTsKLQlwQnVzSW5mby0+cGFydGl0aW9uX3V1aWQgPSBwYXJzZXJfaWRfZ2V0KHBhcnNlcl9jdHgpOwotCXBhcnNlcl9wYXJhbV9zdGFydChwYXJzZXJfY3R4LCBQQVJTRVJTVFJJTkdfTkFNRSk7Ci0JcEJ1c0luZm8tPm5hbWUgPSBwYXJzZXJfc3RyaW5nX2dldChwYXJzZXJfY3R4KTsKLQotCXZpc29yY2hhbm5lbF91dWlkX2lkKCZwQnVzSW5mby0+cGFydGl0aW9uX3V1aWQsIHMpOwotCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Ci1Bd2F5OgotCWJ1c19lcGlsb2coYnVzTm8sIENPTlRST0xWTV9CVVNfQ09ORklHVVJFLCAmaW5tc2ctPmhkciwKKwlidXNfZXBpbG9nKGJ1c19ubywgQ09OVFJPTFZNX0JVU19DT05GSUdVUkUsICZpbm1zZy0+aGRyLAogCQkgICByYywgaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCA9PSAxKTsKIH0KIApAQCAtMTIzNCwxOTEgKzExNDUsMTU4IEBACiBteV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLT5jbWQ7Ci0JdWxvbmcgYnVzTm8gPSBjbWQtPmNyZWF0ZV9kZXZpY2UuYnVzX25vOwotCXVsb25nIGRldk5vID0gY21kLT5jcmVhdGVfZGV2aWNlLmRldl9ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpwRGV2SW5mbyA9IE5VTEw7Ci0Jc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqcEJ1c0luZm8gPSBOVUxMOworCXVsb25nIGJ1c19ubyA9IGNtZC0+Y3JlYXRlX2RldmljZS5idXNfbm87CisJdWxvbmcgZGV2X25vID0gY21kLT5jcmVhdGVfZGV2aWNlLmRldl9ubzsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpkZXZfaW5mbyA9IE5VTEw7CisJc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqYnVzX2luZm8gPSBOVUxMOwogCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiAKLQlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOwotCWlmIChwRGV2SW5mbyAmJiAocERldkluZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGFscmVhZHkgZXhpc3RzIiwKLQkJICAgICBidXNObywgZGV2Tm8pOwotCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCWRldl9pbmZvID0gZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOworCWlmIChkZXZfaW5mbyAmJiAoZGV2X2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KLQlwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7Ci0JaWYgKCFwQnVzSW5mbykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogSW52YWxpZCBidXMgJWx1IC0gb3V0IG9mIHJhbmdlIiwKLQkJICAgICBidXNObyk7Ci0JCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJYnVzX2luZm8gPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOworCWlmICghYnVzX2luZm8pIHsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQotCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBJbnZhbGlkIGJ1cyAlbHUgLSBub3QgY3JlYXRlZCB5ZXQiLAotCQkgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwlpZiAoYnVzX2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2X25vLCBidXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9Ci0JcERldkluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBEZXZJbmZvID09IE5VTEwpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGttYWxvYyBmYWlsZWQiLAotCQkgICAgIGJ1c05vLCBkZXZObyk7Ci0JCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJZGV2X2luZm8gPSBremFsbG9jKHNpemVvZigqZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9pbmZvKSB7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAotCUlOSVRfTElTVF9IRUFEKCZwRGV2SW5mby0+ZW50cnkpOwotCXBEZXZJbmZvLT5idXNfbm8gPSBidXNObzsKLQlwRGV2SW5mby0+ZGV2X25vID0gZGV2Tm87Ci0JcERldkluZm8tPmRldl9pbnN0X3V1aWQgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuZGV2X2luc3RfdXVpZDsKLQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRU5UUllfUEMsIGRldk5vLCBidXNObywKKwlJTklUX0xJU1RfSEVBRCgmZGV2X2luZm8tPmVudHJ5KTsKKwlkZXZfaW5mby0+YnVzX25vID0gYnVzX25vOworCWRldl9pbmZvLT5kZXZfbm8gPSBkZXZfbm87CisJZGV2X2luZm8tPmRldl9pbnN0X3V1aWQgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuZGV2X2luc3RfdXVpZDsKKwlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRU5UUllfUEMsIGRldl9ubywgYnVzX25vLAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCiAJaWYgKGlubXNnLT5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCi0JCXBEZXZJbmZvLT5jaGFuX2luZm8uYWRkcl90eXBlID0gQUREUlRZUEVfTE9DQUxURVNUOworCQlkZXZfaW5mby0+Y2hhbl9pbmZvLmFkZHJfdHlwZSA9IEFERFJUWVBFX0xPQ0FMVEVTVDsKIAllbHNlCi0JCXBEZXZJbmZvLT5jaGFuX2luZm8uYWRkcl90eXBlID0gQUREUlRZUEVfTE9DQUxQSFlTSUNBTDsKLQlwRGV2SW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfYWRkciA9IGNtZC0+Y3JlYXRlX2RldmljZS5jaGFubmVsX2FkZHI7Ci0JcERldkluZm8tPmNoYW5faW5mby5uX2NoYW5uZWxfYnl0ZXMgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9ieXRlczsKLQlwRGV2SW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfdHlwZV91dWlkID0KKwkJZGV2X2luZm8tPmNoYW5faW5mby5hZGRyX3R5cGUgPSBBRERSVFlQRV9MT0NBTFBIWVNJQ0FMOworCWRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF9hZGRyID0gY21kLT5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYWRkcjsKKwlkZXZfaW5mby0+Y2hhbl9pbmZvLm5fY2hhbm5lbF9ieXRlcyA9IGNtZC0+Y3JlYXRlX2RldmljZS5jaGFubmVsX2J5dGVzOworCWRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQgPQogCQkJY21kLT5jcmVhdGVfZGV2aWNlLmRhdGFfdHlwZV91dWlkOwotCXBEZXZJbmZvLT5jaGFuX2luZm8uaW50ciA9IGNtZC0+Y3JlYXRlX2RldmljZS5pbnRyOwotCWxpc3RfYWRkKCZwRGV2SW5mby0+ZW50cnksICZEZXZJbmZvTGlzdCk7Ci0JUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VYSVRfUEMsIGRldk5vLCBidXNObywKKwlkZXZfaW5mby0+Y2hhbl9pbmZvLmludHIgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuaW50cjsKKwlsaXN0X2FkZCgmZGV2X2luZm8tPmVudHJ5LCAmZGV2X2luZm9fbGlzdCk7CisJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VYSVRfUEMsIGRldl9ubywgYnVzX25vLAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotQXdheToKK2NsZWFudXA6CiAJLyogZ2V0IHRoZSBidXMgYW5kIGRldk5vIGZvciBEaWFnUG9vbCBjaGFubmVsICovCi0JaWYgKHBEZXZJbmZvICYmCi0JICAgIGlzX2RpYWdwb29sX2NoYW5uZWwocERldkluZm8tPmNoYW5faW5mby5jaGFubmVsX3R5cGVfdXVpZCkpIHsKLQkJZ19kaWFncG9vbEJ1c05vID0gYnVzTm87Ci0JCWdfZGlhZ3Bvb2xEZXZObyA9IGRldk5vOwotCQlMT0dJTkYoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIGZvciBEaWFnUG9vbCBjaGFubmVsOiBidXNObz0lbHUsIGRldk5vPSVsdSIsCi0JCSAgICAgZ19kaWFncG9vbEJ1c05vLCBnX2RpYWdwb29sRGV2Tm8pOworCWlmIChkZXZfaW5mbyAmJgorCSAgICBpc19kaWFncG9vbF9jaGFubmVsKGRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKSB7CisJCWdfZGlhZ3Bvb2xfYnVzX25vID0gYnVzX25vOworCQlnX2RpYWdwb29sX2Rldl9ubyA9IGRldl9ubzsKIAl9Ci0JZGV2aWNlX2VwaWxvZyhidXNObywgZGV2Tm8sIHNlZ21lbnRfc3RhdGVfcnVubmluZywKKwlkZXZpY2VfZXBpbG9nKGJ1c19ubywgZGV2X25vLCBzZWdtZW50X3N0YXRlX3J1bm5pbmcsCiAJCSAgICAgIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFLCAmaW5tc2ctPmhkciwgcmMsCiAJCSAgICAgIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSwKLQkJICAgICAgRk9SX1ZJU09SQlVTKHBEZXZJbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKTsKKwkJICAgICAgRk9SX1ZJU09SQlVTKGRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKTsKIH0KIAogc3RhdGljIHZvaWQKIG15X2RldmljZV9jaGFuZ2VzdGF0ZShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKmlubXNnKQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy0+Y21kOwotCXVsb25nIGJ1c05vID0gY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubzsKLQl1bG9uZyBkZXZObyA9IGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm87CisJdWxvbmcgYnVzX25vID0gY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubzsKKwl1bG9uZyBkZXZfbm8gPSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vOwogCXN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgc3RhdGUgPSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGU7Ci0Jc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqcERldkluZm8gPSBOVUxMOworCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gTlVMTDsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogCi0JcERldkluZm8gPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKLQlpZiAoIXBEZXZJbmZvKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGludmFsaWQgKGRvZXNuJ3QgZXhpc3QpIiwKLQkJICAgICBidXNObywgZGV2Tm8pOwotCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJZGV2X2luZm8gPSBmaW5kZGV2aWNlKCZkZXZfaW5mb19saXN0LCBidXNfbm8sIGRldl9ubyk7CisJaWYgKCFkZXZfaW5mbykgeworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQ7Ci0JCWdvdG8gQXdheTsKLQl9Ci0JaWYgKHBEZXZJbmZvLT5zdGF0ZS5jcmVhdGVkID09IDApIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgaW52YWxpZCAobm90IGNyZWF0ZWQpIiwKLQkJICAgICBidXNObywgZGV2Tm8pOwotCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJfSBlbHNlIGlmIChkZXZfaW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NIQU5HRVNUQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKIAl9Ci1Bd2F5OgotCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgcERldkluZm8pCi0JCWRldmljZV9lcGlsb2coYnVzTm8sIGRldk5vLCBzdGF0ZSwgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKLQkJCSAgICAgICZpbm1zZy0+aGRyLCByYywKKwlpZiAoKHJjID49IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpICYmIGRldl9pbmZvKQorCQlkZXZpY2VfZXBpbG9nKGJ1c19ubywgZGV2X25vLCBzdGF0ZSwKKwkJCSAgICAgIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsICZpbm1zZy0+aGRyLCByYywKIAkJCSAgICAgIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSwKIAkJCSAgICAgIEZPUl9WSVNPUkJVUygKLQkJCQkJcERldkluZm8tPmNoYW5faW5mby5jaGFubmVsX3R5cGVfdXVpZCkpOworCQkJCQlkZXZfaW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfdHlwZV91dWlkKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBteV9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKmlubXNnKQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy0+Y21kOwotCXVsb25nIGJ1c05vID0gY21kLT5kZXN0cm95X2RldmljZS5idXNfbm87Ci0JdWxvbmcgZGV2Tm8gPSBjbWQtPmRlc3Ryb3lfZGV2aWNlLmRldl9ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpwRGV2SW5mbyA9IE5VTEw7CisJdWxvbmcgYnVzX25vID0gY21kLT5kZXN0cm95X2RldmljZS5idXNfbm87CisJdWxvbmcgZGV2X25vID0gY21kLT5kZXN0cm95X2RldmljZS5kZXZfbm87CisJc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSBOVUxMOwogCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiAKLQlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOwotCWlmICghcERldkluZm8pIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiBidXNObz0lbHUsIGRldk5vPSVsdSBpbnZhbGlkIiwKLQkJICAgICBidXNObywgZGV2Tm8pOworCWRldl9pbmZvID0gZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOworCWlmICghZGV2X2luZm8pCiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOwotCQlnb3RvIEF3YXk7Ci0JfQotCWlmIChwRGV2SW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgYWxyZWFkeSBkZXN0cm95ZWQiLAotCQkgICAgIGJ1c05vLCBkZXZObyk7CisJZWxzZSBpZiAoZGV2X2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwotCX0KIAotQXdheToKLQlpZiAoKHJjID49IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpICYmIHBEZXZJbmZvKQotCQlkZXZpY2VfZXBpbG9nKGJ1c05vLCBkZXZObywgc2VnbWVudF9zdGF0ZV9ydW5uaW5nLAorCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgZGV2X2luZm8pCisJCWRldmljZV9lcGlsb2coYnVzX25vLCBkZXZfbm8sIHNlZ21lbnRfc3RhdGVfcnVubmluZywKIAkJCSAgICAgIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgJmlubXNnLT5oZHIsIHJjLAogCQkJICAgICAgaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCA9PSAxLAogCQkJICAgICAgRk9SX1ZJU09SQlVTKAotCQkJCQlwRGV2SW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfdHlwZV91dWlkKSk7CisJCQkJCWRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKTsKIH0KIAogLyogV2hlbiBwcm92aWRlZCB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjb250cm9sdm0gY2hhbm5lbAogICogKHBoeXNfYWRkciksIHRoZSBvZmZzZXQgdG8gdGhlIHBheWxvYWQgYXJlYSB3ZSBuZWVkIHRvIG1hbmFnZQogICogKG9mZnNldCksIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIHBheWxvYWQgYXJlYSAoYnl0ZXMpLCBmaWxscyBpbiB0aGUKLSAqIENPTlRST0xWTV9QQVlMT0FEX0lORk8gc3RydWN0LiAgUmV0dXJucyBUUlVFIGZvciBzdWNjZXNzIG9yIEZBTFNFCisgKiBjb250cm9sdm1fcGF5bG9hZF9pbmZvIHN0cnVjdC4gIFJldHVybnMgVFJVRSBmb3Igc3VjY2VzcyBvciBGQUxTRQogICogZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKIGluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWRfaW5mbyhIT1NUQUREUkVTUyBwaHlzX2FkZHIsIHU2NCBvZmZzZXQsIHUzMiBieXRlcywKLQkJCQkgIENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCisJCQkJICBzdHJ1Y3QgY29udHJvbHZtX3BheWxvYWRfaW5mbyAqaW5mbykKIHsKIAl1OCBfX2lvbWVtICpwYXlsb2FkID0gTlVMTDsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogCi0JaWYgKGluZm8gPT0gTlVMTCkgewotCQlMT0dFUlIoIkhVSCA/IENPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkIDogUHJvZ3JhbW1lciBjaGVjayBhdCAlczolZCIsCi0JCSAgICAgX19GSUxFX18sIF9fTElORV9fKTsKKwlpZiAoIWluZm8pIHsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElEOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9Ci0JbWVtc2V0KGluZm8sIDAsIHNpemVvZihDT05UUk9MVk1fUEFZTE9BRF9JTkZPKSk7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX3BheWxvYWRfaW5mbykpOwogCWlmICgob2Zmc2V0ID09IDApIHx8IChieXRlcyA9PSAwKSkgewotCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkOiByZXF1ZXN0X3BheWxvYWRfb2Zmc2V0PSVsbHUgcmVxdWVzdF9wYXlsb2FkX2J5dGVzPSVsbHUhIiwKLQkJICAgICAodTY0KSBvZmZzZXQsICh1NjQpIGJ5dGVzKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElEOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAJcGF5bG9hZCA9IGlvcmVtYXBfY2FjaGUocGh5c19hZGRyICsgb2Zmc2V0LCBieXRlcyk7Ci0JaWYgKHBheWxvYWQgPT0gTlVMTCkgewotCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkOiBpb3JlbWFwX2NhY2hlICVsbHUgZm9yICVsbHUgYnl0ZXMgZmFpbGVkIiwKLQkJICAgICAodTY0KSBvZmZzZXQsICh1NjQpIGJ5dGVzKTsKKwlpZiAoIXBheWxvYWQpIHsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfSU9SRU1BUF9GQUlMRUQ7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCWluZm8tPm9mZnNldCA9IG9mZnNldDsKIAlpbmZvLT5ieXRlcyA9IGJ5dGVzOwogCWluZm8tPnB0ciA9IHBheWxvYWQ7Ci0JTE9HSU5GKCJvZmZzZXQ9JWxsdSwgYnl0ZXM9JWx1LCBwdHI9JXAiLAotCSAgICAgICAodTY0KSAoaW5mby0+b2Zmc2V0KSwgKHVsb25nKSAoaW5mby0+Ynl0ZXMpLCBpbmZvLT5wdHIpOwogCi1Bd2F5OgorY2xlYW51cDoKIAlpZiAocmMgPCAwKSB7Ci0JCWlmIChwYXlsb2FkICE9IE5VTEwpIHsKKwkJaWYgKHBheWxvYWQpIHsKIAkJCWlvdW5tYXAocGF5bG9hZCk7CiAJCQlwYXlsb2FkID0gTlVMTDsKIAkJfQpAQCAtMTQyNyw0MyArMTMwNSw0MSBAQAogfQogCiBzdGF0aWMgdm9pZAotZGVzdHJveV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCitkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oc3RydWN0IGNvbnRyb2x2bV9wYXlsb2FkX2luZm8gKmluZm8pCiB7Ci0JaWYgKGluZm8tPnB0ciAhPSBOVUxMKSB7CisJaWYgKGluZm8tPnB0cikgewogCQlpb3VubWFwKGluZm8tPnB0cik7CiAJCWluZm8tPnB0ciA9IE5VTEw7CiAJfQotCW1lbXNldChpbmZvLCAwLCBzaXplb2YoQ09OVFJPTFZNX1BBWUxPQURfSU5GTykpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9wYXlsb2FkX2luZm8pKTsKIH0KIAogc3RhdGljIHZvaWQKIGluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWQodm9pZCkKIHsKLQlIT1NUQUREUkVTUyBwaHlzX2FkZHIgPSB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKENvbnRyb2xWbV9jaGFubmVsKTsKLQl1NjQgcGF5bG9hZE9mZnNldCA9IDA7Ci0JdTMyIHBheWxvYWRCeXRlcyA9IDA7CisJSE9TVEFERFJFU1MgcGh5c19hZGRyID0gdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihjb250cm9sdm1fY2hhbm5lbCk7CisJdTY0IHBheWxvYWRfb2Zmc2V0ID0gMDsKKwl1MzIgcGF5bG9hZF9ieXRlcyA9IDA7CiAKLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCiAJCQkJICAgICAgIHJlcXVlc3RfcGF5bG9hZF9vZmZzZXQpLAotCQkJICAgICAgJnBheWxvYWRPZmZzZXQsIHNpemVvZihwYXlsb2FkT2Zmc2V0KSkgPCAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX1BBWUxPQURfSU5JVCBGYWlsZWQgdG8gcmVhZCBjb250cm9sdm0gY2hhbm5lbCEiKTsKKwkJCSAgICAgICZwYXlsb2FkX29mZnNldCwgc2l6ZW9mKHBheWxvYWRfb2Zmc2V0KSkgPCAwKSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCiAJCQkJICAgICAgIHJlcXVlc3RfcGF5bG9hZF9ieXRlcyksCi0JCQkgICAgICAmcGF5bG9hZEJ5dGVzLCBzaXplb2YocGF5bG9hZEJ5dGVzKSkgPCAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX1BBWUxPQURfSU5JVCBGYWlsZWQgdG8gcmVhZCBjb250cm9sdm0gY2hhbm5lbCEiKTsKKwkJCSAgICAgICZwYXlsb2FkX2J5dGVzLCBzaXplb2YocGF5bG9hZF9ieXRlcykpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKENPTlRST0xWTV9JTklUX0ZBSUxVUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAJaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKHBoeXNfYWRkciwKLQkJCQkJICBwYXlsb2FkT2Zmc2V0LCBwYXlsb2FkQnl0ZXMsCi0JCQkJCSAgJkNvbnRyb2xWbV9wYXlsb2FkX2luZm8pOworCQkJCQkgIHBheWxvYWRfb2Zmc2V0LCBwYXlsb2FkX2J5dGVzLAorCQkJCQkgICZjb250cm9sdm1fcGF5bG9hZF9pbmZvKTsKIH0KIAogLyogIFNlbmQgQUNUSU9OPW9ubGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgpAQCAtMTQ3Miw3ICsxMzQ4LDcgQEAKIGludAogdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkodm9pZCkKIHsKLQlrb2JqZWN0X3VldmVudCgmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9PTkxJTkUpOworCWtvYmplY3RfdWV2ZW50KCZ2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX09OTElORSk7CiAJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfY2hpcHNldF9yZWFkeSk7CkBAIC0xNDg0LDcgKzEzNjAsNyBAQAogCWNoYXIgKmVudnBbXSA9IHsgZW52X3NlbGZ0ZXN0LCBOVUxMIH07CiAKIAlzcHJpbnRmKGVudl9zZWxmdGVzdCwgIlNQQVJTUF9TRUxGVEVTVD0lZCIsIDEpOwotCWtvYmplY3RfdWV2ZW50X2VudigmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCisJa29iamVjdF91ZXZlbnRfZW52KCZ2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX0NIQU5HRSwKIAkJCSAgIGVudnApOwogCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogfQpAQCAtMTQ5Niw0OSArMTM3Miw0OCBAQAogaW50CiB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSh2b2lkKQogewotCWtvYmplY3RfdWV2ZW50KCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOworCWtvYmplY3RfdWV2ZW50KCZ2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOwogCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkpOwogCiBzdGF0aWMgdm9pZAotY2hpcHNldF9yZWFkeShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIpCitjaGlwc2V0X3JlYWR5KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIpCiB7CiAJaW50IHJjID0gdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkoKTsKIAogCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQogCQlyYyA9IC1yYzsKLQlpZiAobXNnSGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCAmJiAhdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpCi0JCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOwotCWlmIChtc2dIZHItPmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkICYmIHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5KSB7CisJaWYgKG1zZ19oZHItPmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkICYmICF2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSkKKwkJY29udHJvbHZtX3Jlc3BvbmQobXNnX2hkciwgcmMpOworCWlmIChtc2dfaGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCAmJiB2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSkgewogCQkvKiBTZW5kIENISVBTRVRfUkVBRFkgcmVzcG9uc2Ugd2hlbiBhbGwgbW9kdWxlcyBoYXZlIGJlZW4gbG9hZGVkCiAJCSAqIGFuZCBkaXNrcyBtb3VudGVkIGZvciB0aGUgcGFydGl0aW9uCiAJCSAqLwotCQlnX0NoaXBTZXRNc2dIZHIgPSAqbXNnSGRyOwotCQlMT0dJTkYoIkhvbGRpbmcgQ0hJUFNFVF9SRUFEWSByZXNwb25zZSIpOworCQlnX2NoaXBzZXRfbXNnX2hkciA9ICptc2dfaGRyOwogCX0KIH0KIAogc3RhdGljIHZvaWQKLWNoaXBzZXRfc2VsZnRlc3Qoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyKQorY2hpcHNldF9zZWxmdGVzdChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyKQogewogCWludCByYyA9IHZpc29yY2hpcHNldF9jaGlwc2V0X3NlbGZ0ZXN0KCk7CiAKIAlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmMgPSAtcmM7Ci0JaWYgKG1zZ0hkci0+ZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOworCWlmIChtc2dfaGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKKwkJY29udHJvbHZtX3Jlc3BvbmQobXNnX2hkciwgcmMpOwogfQogCiBzdGF0aWMgdm9pZAotY2hpcHNldF9ub3RyZWFkeShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIpCitjaGlwc2V0X25vdHJlYWR5KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIpCiB7CiAJaW50IHJjID0gdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkoKTsKIAogCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQogCQlyYyA9IC1yYzsKLQlpZiAobXNnSGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKLQkJY29udHJvbHZtX3Jlc3BvbmQobXNnSGRyLCByYyk7CisJaWYgKG1zZ19oZHItPmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQljb250cm9sdm1fcmVzcG9uZChtc2dfaGRyLCByYyk7CiB9CiAKIC8qIFRoaXMgaXMgeW91ciAib25lLXN0b3AiIHNob3AgZm9yIGdyYWJiaW5nIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUKQEAgLTE1NDcsMTQgKzE0MjIsMTEgQEAKIHN0YXRpYyBCT09MCiByZWFkX2NvbnRyb2x2bV9ldmVudChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKm1zZykKIHsKLQlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShDb250cm9sVm1fY2hhbm5lbCwKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShjb250cm9sdm1fY2hhbm5lbCwKIAkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfRVZFTlQsIG1zZykpIHsKIAkJLyogZ290IGEgbWVzc2FnZSAqLwotCQlpZiAobXNnLT5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpIHsKLQkJCUxPR0VSUigiaWdub3JpbmcgYmFkIENPTlRST0xWTV9RVUVVRV9FVkVOVCBtc2cgd2l0aCBjb250cm9sdm1fbXNnX2lkPTB4JXggYmVjYXVzZSBGbGFncy50ZXN0TWVzc2FnZSBpcyBub25zZW5zaWNhbCAoPTEpIiwKLQkJCSAgICAgICBtc2ctPmhkci5pZCk7CisJCWlmIChtc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSkKIAkJCXJldHVybiBGQUxTRTsKLQkJfQogCQlyZXR1cm4gVFJVRTsKIAl9CiAJcmV0dXJuIEZBTFNFOwpAQCAtMTYwNCwxMCArMTQ3NiwxMCBAQAogc3RhdGljIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICoKIHBhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQogewotCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCksCi0JCSAgICBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOwotCWlmIChyZXEgPT0gTlVMTCkKKwlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOworCisJcmVxID0ga21hbGxvYyhzaXplb2YoKnJlcSksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAoIXJlcSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXEtPmlkID0gcGFyYWhvdHBsdWdfbmV4dF9pZCgpOwpAQCAtMTY1MiwxMyArMTUyNCw3IEBACiAJc3ByaW50ZihlbnZfZnVuYywgIlNQQVJfUEFSQUhPVFBMVUdfRlVOQ1RJT049JWQiLAogCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vICYgMHg3KTsKIAotCUxPR0lORigicGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmOiBzdGF0ZT0lZCwgYmRmPSVkLyVkLyVkLCBpZD0ldVxuIiwKLQkgICAgICAgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSwKLQkgICAgICAgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubywKLQkgICAgICAgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA+PiAzLAotCSAgICAgICBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vICYgNywgcmVxLT5pZCk7Ci0KLQlrb2JqZWN0X3VldmVudF9lbnYoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfQ0hBTkdFLAorCWtvYmplY3RfdWV2ZW50X2Vudigmdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCiAJCQkgICBlbnZwKTsKIH0KIApAQCAtMTY3MiwyMyArMTUzOCwyNSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gTlVMTDsKIAotCXNwaW5fbG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CiAJCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQogCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkgewotCQkJbGlzdF9kZWwocG9zKTsKLQkJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJCQkJJnJlcS0+bXNnLmhkciwKLQkJCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKLQkJCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOwotCQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7Ci0JCX0KKworCQlpZiAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKHBvcyk7CisJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCisJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAorCQkJCSZyZXEtPm1zZy5oZHIsCisJCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKKwkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7CisJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOwogCX0KIAotCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIH0KIAogLyoKQEAgLTE3MDIsMTAgKzE1NzAsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IE5VTEw7CiAKLQlzcGluX2xvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIAogCS8qIExvb2sgZm9yIGEgcmVxdWVzdCBtYXRjaGluZyAiaWQiLiAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgewogCQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxID0KIAkJICAgIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCwgbGlzdCk7CiAJCWlmIChyZXEtPmlkID09IGlkKSB7CkBAIC0xNzEzLDcgKzE1ODEsNyBAQAogCQkJICogcmVzcG9uZC4KIAkJCSAqLwogCQkJbGlzdF9kZWwocG9zKTsKLQkJCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCQlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwogCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUuYWN0aXZlID0gYWN0aXZlOwogCQkJaWYgKHJlcS0+bXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKIAkJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKApAQCAtMTcyNCw3ICsxNTkyLDcgQEAKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE3MzgsMTAgKzE2MDYsOCBAQAogCiAJcmVxID0gcGFyYWhvdHBsdWdfcmVxdWVzdF9jcmVhdGUoaW5tc2cpOwogCi0JaWYgKHJlcSA9PSBOVUxMKSB7Ci0JCUxPR0VSUigicGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlOiBjb3VsZG4ndCBhbGxvY2F0ZSByZXF1ZXN0Iik7CisJaWYgKCFyZXEpCiAJCXJldHVybjsKLQl9CiAKIAlpZiAoaW5tc2ctPmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSkgewogCQkvKiBGb3IgZW5hYmxlIG1lc3NhZ2VzLCBqdXN0IHJlc3BvbmQgd2l0aCBzdWNjZXNzCkBAIC0xNzU1LDggKzE2MjEsOCBAQAogCQkqLwogCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKIAkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgmaW5tc2ctPmhkciwKLQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTLCBpbm1zZy0+Y21kLgotCQkJCWRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOworCQkJQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKKwkJCWlubXNnLT5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7CiAJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOwogCX0gZWxzZSB7CiAJCS8qIEZvciBkaXNhYmxlIG1lc3NhZ2VzLCBhZGQgdGhlIHJlcXVlc3QgdG8gdGhlCkBAIC0xNzY0LDkgKzE2MzAsOSBAQAogCQkqIHdvbid0IGdldCByZXNwb25kZWQgdG8gdW50aWwgdGhlIHNjcmlwdCBoYXMKIAkJKiBpbmRpY2F0ZWQgaXQncyBkb25lLgogCQkqLwotCQlzcGluX2xvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmKHJlcS0+bGlzdCksICZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOwotCQlzcGluX3VubG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KTsKKwkJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIAogCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKIAl9CkBAIC0xNzg3LDEzNSArMTY1Myw5NCBAQAogaGFuZGxlX2NvbW1hbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnLCBIT1NUQUREUkVTUyBjaGFubmVsX2FkZHIpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLmNtZDsKLQl1NjQgcGFyYW1ldGVyc0FkZHIgPSAwOwotCXUzMiBwYXJhbWV0ZXJzQnl0ZXMgPSAwOwotCVBBUlNFUl9DT05URVhUICpwYXJzZXJfY3R4ID0gTlVMTDsKLQlCT09MIGlzTG9jYWxBZGRyID0gRkFMU0U7CisJdTY0IHBhcm1fYWRkciA9IDA7CisJdTMyIHBhcm1fYnl0ZXMgPSAwOworCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2N0eCA9IE5VTEw7CisJYm9vbCBsb2NhbF9hZGRyID0gZmFsc2U7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGFja21zZzsKIAogCS8qIGNyZWF0ZSBwYXJzaW5nIGNvbnRleHQgaWYgbmVjZXNzYXJ5ICovCi0JaXNMb2NhbEFkZHIgPSAoaW5tc2cuaGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKTsKLQlpZiAoY2hhbm5lbF9hZGRyID09IDApIHsKLQkJTE9HRVJSKCJIVUg/IGNoYW5uZWxfYWRkciBpcyAwISIpOworCWxvY2FsX2FkZHIgPSAoaW5tc2cuaGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKTsKKwlpZiAoY2hhbm5lbF9hZGRyID09IDApCiAJCXJldHVybiBUUlVFOwotCX0KLQlwYXJhbWV0ZXJzQWRkciA9IGNoYW5uZWxfYWRkciArIGlubXNnLmhkci5wYXlsb2FkX3ZtX29mZnNldDsKLQlwYXJhbWV0ZXJzQnl0ZXMgPSBpbm1zZy5oZHIucGF5bG9hZF9ieXRlczsKKwlwYXJtX2FkZHIgPSBjaGFubmVsX2FkZHIgKyBpbm1zZy5oZHIucGF5bG9hZF92bV9vZmZzZXQ7CisJcGFybV9ieXRlcyA9IGlubXNnLmhkci5wYXlsb2FkX2J5dGVzOwogCiAJLyogUGFyYW1ldGVyIGFuZCBjaGFubmVsIGFkZHJlc3NlcyB3aXRoaW4gdGVzdCBtZXNzYWdlcyBhY3R1YWxseSBsaWUKIAkgKiB3aXRoaW4gb3VyIE9TLWNvbnRyb2xsZWQgbWVtb3J5LiAgV2UgbmVlZCB0byBrbm93IHRoYXQsIGJlY2F1c2UgaXQKIAkgKiBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gaG93IHdlIGNvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4KIAkgKi8KLQlpZiAocGFyYW1ldGVyc0FkZHIgIT0gMCAmJiBwYXJhbWV0ZXJzQnl0ZXMgIT0gMCkgeworCWlmIChwYXJtX2FkZHIgIT0gMCAmJiBwYXJtX2J5dGVzICE9IDApIHsKIAkJQk9PTCByZXRyeSA9IEZBTFNFOwogCiAJCXBhcnNlcl9jdHggPQotCQkgICAgcGFyc2VyX2luaXRfYnl0ZVN0cmVhbShwYXJhbWV0ZXJzQWRkciwgcGFyYW1ldGVyc0J5dGVzLAotCQkJCQkgICBpc0xvY2FsQWRkciwgJnJldHJ5KTsKLQkJaWYgKCFwYXJzZXJfY3R4KSB7Ci0JCQlpZiAocmV0cnkpIHsKLQkJCQlMT0dXUk4oInRocm90dGxpbmcgdG8gY29weSBwYXlsb2FkIik7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJTE9HV1JOKCJwYXJzaW5nIGZhaWxlZCIpOwotCQkJTE9HV1JOKCJpbm1zZy5oZHIuSWQ9MHglbHgiLCAodWxvbmcpIGlubXNnLmhkci5pZCk7Ci0JCQlMT0dXUk4oInBhcmFtZXRlcnNBZGRyPTB4JWxseCIsICh1NjQpIHBhcmFtZXRlcnNBZGRyKTsKLQkJCUxPR1dSTigicGFyYW1ldGVyc0J5dGVzPSVsdSIsICh1bG9uZykgcGFyYW1ldGVyc0J5dGVzKTsKLQkJCUxPR1dSTigiaXNMb2NhbEFkZHI9JWQiLCBpc0xvY2FsQWRkcik7Ci0JCX0KKwkJICAgIHBhcnNlcl9pbml0X2J5dGVfc3RyZWFtKHBhcm1fYWRkciwgcGFybV9ieXRlcywKKwkJCQkJICAgIGxvY2FsX2FkZHIsICZyZXRyeSk7CisJCWlmICghcGFyc2VyX2N0eCAmJiByZXRyeSkKKwkJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoIWlzTG9jYWxBZGRyKSB7CisJaWYgKCFsb2NhbF9hZGRyKSB7CiAJCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZhY2ttc2csICZpbm1zZy5oZHIsCiAJCQkJCUNPTlRST0xWTV9SRVNQX1NVQ0NFU1MpOwotCQlpZiAoKENvbnRyb2xWbV9jaGFubmVsKQotCQkgICAgJiYKLQkJICAgICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydAotCQkgICAgIChDb250cm9sVm1fY2hhbm5lbCwgQ09OVFJPTFZNX1FVRVVFX0FDSywgJmFja21zZykpKQotCQkJTE9HV1JOKCJmYWlsZWQgdG8gc2VuZCBBQ0sgZmFpbGVkIik7CisJCWlmIChjb250cm9sdm1fY2hhbm5lbCkKKwkJCXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJCQkgIENPTlRST0xWTV9RVUVVRV9BQ0ssCisJCQkJCQkgICZhY2ttc2cpOwogCX0KIAlzd2l0Y2ggKGlubXNnLmhkci5pZCkgewogCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfSU5JVDoKLQkJTE9HSU5GKCJDSElQU0VUX0lOSVQoI2J1c3Nlcz0lbHUsI3N3aXRjaGVzPSVsdSkiLAotCQkgICAgICAgKHVsb25nKSBpbm1zZy5jbWQuaW5pdF9jaGlwc2V0LmJ1c19jb3VudCwKLQkJICAgICAgICh1bG9uZykgaW5tc2cuY21kLmluaXRfY2hpcHNldC5zd2l0Y2hfY291bnQpOwogCQljaGlwc2V0X2luaXQoJmlubXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKLQkJTE9HSU5GKCJCVVNfQ1JFQVRFKCVsdSwjZGV2cz0lbHUpIiwKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfYnVzLmJ1c19ubywKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfYnVzLmRldl9jb3VudCk7CiAJCWJ1c19jcmVhdGUoJmlubXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6Ci0JCUxPR0lORigiQlVTX0RFU1RST1koJWx1KSIsICh1bG9uZykgY21kLT5kZXN0cm95X2J1cy5idXNfbm8pOwogCQlidXNfZGVzdHJveSgmaW5tc2cpOwogCQlicmVhazsKIAljYXNlIENPTlRST0xWTV9CVVNfQ09ORklHVVJFOgotCQlMT0dJTkYoIkJVU19DT05GSUdVUkUoJWx1KSIsICh1bG9uZykgY21kLT5jb25maWd1cmVfYnVzLmJ1c19ubyk7CiAJCWJ1c19jb25maWd1cmUoJmlubXNnLCBwYXJzZXJfY3R4KTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKLQkJTE9HSU5GKCJERVZJQ0VfQ1JFQVRFKCVsdSwlbHUpIiwKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfZGV2aWNlLmJ1c19ubywKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfZGV2aWNlLmRldl9ubyk7CiAJCW15X2RldmljZV9jcmVhdGUoJmlubXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOgogCQlpZiAoY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmZsYWdzLnBoeXNfZGV2aWNlKSB7Ci0JCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURSBmb3IgcGh5c2ljYWwgZGV2aWNlICglbHUsJWx1LCBhY3RpdmU9JWx1KSIsCi0JCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubywKLQkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vLAotCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUpOwogCQkJcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCZpbm1zZyk7CiAJCX0gZWxzZSB7Ci0JCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURSBmb3IgdmlydHVhbCBkZXZpY2UgKCVsdSwlbHUsIHN0YXRlLkFsaXZlPTB4JWx4KSIsCi0JCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubywKLQkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vLAotCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hbGl2ZSk7CiAJCQkvKiBzYXZlIHRoZSBoZHIgYW5kIGNtZCBzdHJ1Y3R1cmVzIGZvciBsYXRlciB1c2UgKi8KIAkJCS8qIHdoZW4gc2VuZGluZyBiYWNrIHRoZSByZXNwb25zZSB0byBDb21tYW5kICovCiAJCQlteV9kZXZpY2VfY2hhbmdlc3RhdGUoJmlubXNnKTsKLQkJCWdfRGlhZ01zZ0hkciA9IGlubXNnLmhkcjsKLQkJCWdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQgPSBpbm1zZy5jbWQ7CisJCQlnX2RpYWdfbXNnX2hkciA9IGlubXNnLmhkcjsKKwkJCWdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0ID0gaW5tc2cuY21kOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6Ci0JCUxPR0lORigiREVWSUNFX0RFU1RST1koJWx1LCVsdSkiLAotCQkgICAgICAgKHVsb25nKSBjbWQtPmRlc3Ryb3lfZGV2aWNlLmJ1c19ubywKLQkJICAgICAgICh1bG9uZykgY21kLT5kZXN0cm95X2RldmljZS5kZXZfbm8pOwogCQlteV9kZXZpY2VfZGVzdHJveSgmaW5tc2cpOwogCQlicmVhazsKIAljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFOgotCQlMT0dJTkYoIkRFVklDRV9DT05GSUdVUkUoJWx1LCVsdSkiLAotCQkgICAgICAgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZV9kZXZpY2UuYnVzX25vLAotCQkgICAgICAgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZV9kZXZpY2UuZGV2X25vKTsKIAkJLyogbm8gb3AgZm9yIG5vdywganVzdCBzZW5kIGEgcmVzcG9uZCB0aGF0IHdlIHBhc3NlZCAqLwogCQlpZiAoaW5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQogCQkJY29udHJvbHZtX3Jlc3BvbmQoJmlubXNnLmhkciwgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyk7CiAJCWJyZWFrOwogCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfUkVBRFk6Ci0JCUxPR0lORigiQ0hJUFNFVF9SRUFEWSIpOwogCQljaGlwc2V0X3JlYWR5KCZpbm1zZy5oZHIpOwogCQlicmVhazsKIAljYXNlIENPTlRST0xWTV9DSElQU0VUX1NFTEZURVNUOgotCQlMT0dJTkYoIkNISVBTRVRfU0VMRlRFU1QiKTsKIAkJY2hpcHNldF9zZWxmdGVzdCgmaW5tc2cuaGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOgotCQlMT0dJTkYoIkNISVBTRVRfU1RPUCIpOwogCQljaGlwc2V0X25vdHJlYWR5KCZpbm1zZy5oZHIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlMT0dFUlIoInVucmVjb2duaXplZCBjb250cm9sdm0gY21kPSVkIiwgKGludCkgaW5tc2cuaGRyLmlkKTsKIAkJaWYgKGlubXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKIAkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsCi0JCQkJCSAgLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CisJCQkJLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CiAJCWJyZWFrOwogCX0KIAotCWlmIChwYXJzZXJfY3R4ICE9IE5VTEwpIHsKKwlpZiAocGFyc2VyX2N0eCkgewogCQlwYXJzZXJfZG9uZShwYXJzZXJfY3R4KTsKIAkJcGFyc2VyX2N0eCA9IE5VTEw7CiAJfQpAQCAtMTkyNywxMiArMTc1Miw5IEBACiAJdTY0IGFkZHIgPSAwOwogCXUzMiBzaXplID0gMDsKIAotCWlmICghVk1DQUxMX1NVQ0NFU1NGVUwoaXNzdWVfdm1jYWxsX2lvX2NvbnRyb2x2bV9hZGRyKCZhZGRyLCAmc2l6ZSkpKSB7Ci0JCUVSUkRSVigiJXMgLSB2bWNhbGwgdG8gZGV0ZXJtaW5lIGNvbnRyb2x2bSBjaGFubmVsIGFkZHIgZmFpbGVkIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwlpZiAoIVZNQ0FMTF9TVUNDRVNTRlVMKGlzc3VlX3ZtY2FsbF9pb19jb250cm9sdm1fYWRkcigmYWRkciwgJnNpemUpKSkKIAkJcmV0dXJuIDA7Ci0JfQotCUlORk9EUlYoImNvbnRyb2x2bSBhZGRyPSVMeCIsIGFkZHIpOworCiAJcmV0dXJuIGFkZHI7CiB9CiAKQEAgLTE5NDAsNjkgKzE3NjIsNjMgQEAKIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgaW5tc2c7Ci0JQk9PTCBnb3RBQ29tbWFuZCA9IEZBTFNFOworCUJPT0wgZ290X2NvbW1hbmQgPSBGQUxTRTsKIAlCT09MIGhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IEZBTFNFOwotCXN0YXRpYyB1NjQgUG9sbF9Db3VudDsKKwlzdGF0aWMgdTY0IHBvbGxfY291bnQ7CiAKIAkvKiBtYWtlIHN1cmUgdmlzb3JidXMgc2VydmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGNvbnRyb2x2bSBjYWxsYmFja3MgKi8KIAlpZiAodmlzb3JjaGlwc2V0X3NlcnZlcnJlZ3dhaXQgJiYgIXNlcnZlcnJlZ2lzdGVyZWQpCi0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCS8qIG1ha2Ugc3VyZSB2aXNvcmNsaWVudGJ1cyBzZXJ2ZXIgaXMgcmVnc2l0ZXJlZCBmb3IgY29udHJvbHZtCiAJICogY2FsbGJhY2tzCiAJICovCiAJaWYgKHZpc29yY2hpcHNldF9jbGllbnRyZWd3YWl0ICYmICFjbGllbnRyZWdpc3RlcmVkKQotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAotCVBvbGxfQ291bnQrKzsKLQlpZiAoUG9sbF9Db3VudCA+PSAyNTApCisJcG9sbF9jb3VudCsrOworCWlmIChwb2xsX2NvdW50ID49IDI1MCkKIAkJOwkvKiBrZWVwIGdvaW5nICovCiAJZWxzZQotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAogCS8qIENoZWNrIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgcmVzcG9uc2UgdG8gQ0hJUFNFVF9SRUFEWQogCSAqIHNob3VsZCBiZSBzZW50CiAJICovCi0JaWYgKHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5Ci0JICAgICYmIChnX0NoaXBTZXRNc2dIZHIuaWQgIT0gQ09OVFJPTFZNX0lOVkFMSUQpKSB7CisJaWYgKHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5ICYmCisJICAgIChnX2NoaXBzZXRfbXNnX2hkci5pZCAhPSBDT05UUk9MVk1fSU5WQUxJRCkpIHsKIAkJaWYgKGNoZWNrX2NoaXBzZXRfZXZlbnRzKCkgPT0gMSkgewotCQkJTE9HSU5GKCJTZW5kaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiKTsKLQkJCWNvbnRyb2x2bV9yZXNwb25kKCZnX0NoaXBTZXRNc2dIZHIsIDApOworCQkJY29udHJvbHZtX3Jlc3BvbmQoJmdfY2hpcHNldF9tc2dfaGRyLCAwKTsKIAkJCWNsZWFyX2NoaXBzZXRfZXZlbnRzKCk7Ci0JCQltZW1zZXQoJmdfQ2hpcFNldE1zZ0hkciwgMCwKKwkJCW1lbXNldCgmZ19jaGlwc2V0X21zZ19oZHIsIDAsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKIAkJfQogCX0KIAotCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKENvbnRyb2xWbV9jaGFubmVsLAorCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJCQkgQ09OVFJPTFZNX1FVRVVFX1JFU1BPTlNFLAotCQkJCQkgJmlubXNnKSkgewotCQlpZiAoaW5tc2cuaGRyLnBheWxvYWRfbWF4X2J5dGVzICE9IDApIHsKLQkJCUxPR0VSUigiUGF5bG9hZCBvZiBzaXplICVsdSByZXR1cm5lZCBAJWx1IHdpdGggdW5leHBlY3RlZCBtZXNzYWdlIGlkICVkLiIsCi0JCQkgICAgICh1bG9uZykgaW5tc2cuaGRyLnBheWxvYWRfbWF4X2J5dGVzLAotCQkJICAgICAodWxvbmcpIGlubXNnLmhkci5wYXlsb2FkX3ZtX29mZnNldCwKLQkJCSAgICAgaW5tc2cuaGRyLmlkKTsKLQkJfQotCX0KLQlpZiAoIWdvdEFDb21tYW5kKSB7Ci0JCWlmIChDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQpIHsKKwkJCQkJICZpbm1zZykpCisJCTsKKwlpZiAoIWdvdF9jb21tYW5kKSB7CisJCWlmIChjb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQpIHsKIAkJCS8qIHdlIHRocm90dGxlZCBwcm9jZXNzaW5nIG9mIGEgcHJpb3IKIAkJCSogbXNnLCBzbyB0cnkgdG8gcHJvY2VzcyBpdCBhZ2FpbgogCQkJKiByYXRoZXIgdGhhbiByZWFkaW5nIGEgbmV3IG9uZQogCQkJKi8KLQkJCWlubXNnID0gQ29udHJvbFZtX1BlbmRpbmdfTXNnOwotCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnX1ZhbGlkID0gRkFMU0U7Ci0JCQlnb3RBQ29tbWFuZCA9IFRSVUU7Ci0JCX0gZWxzZQotCQkJZ290QUNvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOworCQkJaW5tc2cgPSBjb250cm9sdm1fcGVuZGluZ19tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSBGQUxTRTsKKwkJCWdvdF9jb21tYW5kID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKKwkJfQogCX0KIAogCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IEZBTFNFOwotCXdoaWxlIChnb3RBQ29tbWFuZCAmJiAoIWhhbmRsZV9jb21tYW5kX2ZhaWxlZCkpIHsKLQkJTW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzID0gamlmZmllczsKKwl3aGlsZSAoZ290X2NvbW1hbmQgJiYgKCFoYW5kbGVfY29tbWFuZF9mYWlsZWQpKSB7CisJCW1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7CiAJCWlmIChoYW5kbGVfY29tbWFuZChpbm1zZywKIAkJCQkgICB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyCi0JCQkJICAgKENvbnRyb2xWbV9jaGFubmVsKSkpCi0JCQlnb3RBQ29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CisJCQkJICAgKGNvbnRyb2x2bV9jaGFubmVsKSkpCisJCQlnb3RfY29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CiAJCWVsc2UgewogCQkJLyogdGhpcyBpcyBhIHNjZW5hcmlvIHdoZXJlIHRocm90dGxpbmcKIAkJCSogaXMgcmVxdWlyZWQsIGJ1dCBwcm9iYWJseSBOT1QgYW4KQEAgLTIwMTEsNTYgKzE4MjcsNTEgQEAKIAkJCSogcmVwcm9jZXNzIGl0IG9uIG91ciBuZXh0IGxvb3AKIAkJCSovCiAJCQloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBUUlVFOwotCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnID0gaW5tc2c7Ci0JCQlDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQgPSBUUlVFOworCQkJY29udHJvbHZtX3BlbmRpbmdfbXNnID0gaW5tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSBUUlVFOwogCQl9CiAJfQogCiAJLyogcGFyYWhvdHBsdWdfd29ya2VyICovCiAJcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KCk7CiAKLUF3YXk6CitjbGVhbnVwOgogCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJICAgICAgIE1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyArIChIWiAqIE1JTl9JRExFX1NFQ09ORFMpKSkgeworCQkgICAgICAgbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzICsgKEhaICogTUlOX0lETEVfU0VDT05EUykpKSB7CiAJCS8qIGl0J3MgYmVlbiBsb25nZXIgdGhhbiBNSU5fSURMRV9TRUNPTkRTIHNpbmNlIHdlCiAJCSogcHJvY2Vzc2VkIG91ciBsYXN0IGNvbnRyb2x2bSBtZXNzYWdlOyBzbG93IGRvd24gdGhlCiAJCSogcG9sbGluZwogCQkqLwotCQlpZiAoUG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVykgewotCQkJTE9HSU5GKCJzd2l0Y2hlZCB0byBzbG93IGNvbnRyb2x2bSBwb2xsaW5nIik7Ci0JCQlQb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7Ci0JCX0KKwkJaWYgKHBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1cpCisJCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7CiAJfSBlbHNlIHsKLQkJaWYgKFBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1QpIHsKLQkJCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKLQkJCUxPR0lORigic3dpdGNoZWQgdG8gZmFzdCBjb250cm9sdm0gcG9sbGluZyIpOwotCQl9CisJCWlmIChwb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUKQorCQkJcG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUOwogCX0KIAotCXF1ZXVlX2RlbGF5ZWRfd29yayhQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLAotCQkJICAgJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLAorCQkJICAgJnBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBwb2xsX2ppZmZpZXMpOwogfQogCiBzdGF0aWMgdm9pZAogc2V0dXBfY3Jhc2hfZGV2aWNlc193b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbENyYXNoQ3JlYXRlQnVzTXNnOwotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbENyYXNoQ3JlYXRlRGV2TXNnOworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbF9jcmFzaF9idXNfbXNnOworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbF9jcmFzaF9kZXZfbXNnOwogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7Ci0JdTMyIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldDsKLQl1MTYgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQ7CisJdTMyIGxvY2FsX2NyYXNoX21zZ19vZmZzZXQ7CisJdTE2IGxvY2FsX2NyYXNoX21zZ19jb3VudDsKIAogCS8qIG1ha2Ugc3VyZSB2aXNvcmJ1cyBzZXJ2ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY29udHJvbHZtIGNhbGxiYWNrcyAqLwogCWlmICh2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdCAmJiAhc2VydmVycmVnaXN0ZXJlZCkKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAKIAkvKiBtYWtlIHN1cmUgdmlzb3JjbGllbnRidXMgc2VydmVyIGlzIHJlZ3NpdGVyZWQgZm9yIGNvbnRyb2x2bQogCSAqIGNhbGxiYWNrcwogCSAqLwogCWlmICh2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCAmJiAhY2xpZW50cmVnaXN0ZXJlZCkKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAKIAlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKQEAgLTIwNzIsMTE4ICsxODgzLDEwOCBAQAogCWNoaXBzZXRfaW5pdCgmbXNnKTsKIAogCS8qIGdldCBzYXZlZCBtZXNzYWdlIGNvdW50ICovCi0JaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCWlmICh2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKIAkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAogCQkJCSAgICAgICBzYXZlZF9jcmFzaF9tZXNzYWdlX2NvdW50KSwKLQkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBDb3VudCIpOworCQkJICAgICAgJmxvY2FsX2NyYXNoX21zZ19jb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobG9jYWxTYXZlZENyYXNoTXNnQ291bnQgIT0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCkgewotCQlMT0dFUlIoIlNhdmVkIE1lc3NhZ2UgQ291bnQgaW5jb3JyZWN0ICVkIiwKLQkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50KTsKKwlpZiAobG9jYWxfY3Jhc2hfbXNnX2NvdW50ICE9IENPTlRST0xWTV9DUkFTSE1TR19NQVgpIHsKIAkJUE9TVENPREVfTElOVVhfMyhDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQywKLQkJCQkgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsCisJCQkJIGxvY2FsX2NyYXNoX21zZ19jb3VudCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGdldCBzYXZlZCBjcmFzaCBtZXNzYWdlIG9mZnNldCAqLwotCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCiAJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKIAkJCQkgICAgICAgc2F2ZWRfY3Jhc2hfbWVzc2FnZV9vZmZzZXQpLAotCQkJICAgICAgJmxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwgc2l6ZW9mKHUzMikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBPZmZzZXQiKTsKKwkJCSAgICAgICZsb2NhbF9jcmFzaF9tc2dfb2Zmc2V0LCBzaXplb2YodTMyKSkgPCAwKSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0NUUkxfUkRfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIHJlYWQgY3JlYXRlIGRldmljZSBtZXNzYWdlIGZvciBzdG9yYWdlIGJ1cyBvZmZzZXQgKi8KLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQkgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQsCi0JCQkgICAgICAmbG9jYWxDcmFzaENyZWF0ZUJ1c01zZywKKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgICAgICBsb2NhbF9jcmFzaF9tc2dfb2Zmc2V0LAorCQkJICAgICAgJmxvY2FsX2NyYXNoX2J1c19tc2csCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlKSkgPCAwKSB7Ci0JCUxPR0VSUigiQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFOiBGYWlsZWQgdG8gcmVhZCBDcmFzaENyZWF0ZUJ1c01zZyEiKTsKIAkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfUkRfQlVTX0ZBSVVMUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiByZWFkIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQkgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKKwkJCSAgICAgIGxvY2FsX2NyYXNoX21zZ19vZmZzZXQgKwogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSksCi0JCQkgICAgICAmbG9jYWxDcmFzaENyZWF0ZURldk1zZywKKwkJCSAgICAgICZsb2NhbF9jcmFzaF9kZXZfbXNnLAogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpIDwgMCkgewotCQlMT0dFUlIoIkNSQVNIX0RFVl9SRF9ERVZfRkFJVUxSRTogRmFpbGVkIHRvIHJlYWQgQ3Jhc2hDcmVhdGVEZXZNc2chIik7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm47CiAJfQogCiAJLyogcmV1c2UgSU9WTSBjcmVhdGUgYnVzIG1lc3NhZ2UgKi8KLQlpZiAobG9jYWxDcmFzaENyZWF0ZUJ1c01zZy5jbWQuY3JlYXRlX2J1cy5jaGFubmVsX2FkZHIgIT0gMCkKLQkJYnVzX2NyZWF0ZSgmbG9jYWxDcmFzaENyZWF0ZUJ1c01zZyk7Ci0JZWxzZSB7Ci0JCUxPR0VSUigiQ3Jhc2hDcmVhdGVCdXNNc2cgaXMgbnVsbCwgbm8gZHVtcCB3aWxsIGJlIHRha2VuIik7CisJaWYgKGxvY2FsX2NyYXNoX2J1c19tc2cuY21kLmNyZWF0ZV9idXMuY2hhbm5lbF9hZGRyICE9IDApIHsKKwkJYnVzX2NyZWF0ZSgmbG9jYWxfY3Jhc2hfYnVzX21zZyk7CisJfSBlbHNlIHsKIAkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfQlVTX05VTExfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIHJldXNlIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KLQlpZiAobG9jYWxDcmFzaENyZWF0ZURldk1zZy5jbWQuY3JlYXRlX2RldmljZS5jaGFubmVsX2FkZHIgIT0gMCkKLQkJbXlfZGV2aWNlX2NyZWF0ZSgmbG9jYWxDcmFzaENyZWF0ZURldk1zZyk7Ci0JZWxzZSB7Ci0JCUxPR0VSUigiQ3Jhc2hDcmVhdGVEZXZNc2cgaXMgbnVsbCwgbm8gZHVtcCB3aWxsIGJlIHRha2VuIik7CisJaWYgKGxvY2FsX2NyYXNoX2Rldl9tc2cuY21kLmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9hZGRyICE9IDApIHsKKwkJbXlfZGV2aWNlX2NyZWF0ZSgmbG9jYWxfY3Jhc2hfZGV2X21zZyk7CisJfSBlbHNlIHsKIAkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KLQlMT0dJTkYoIkJ1cyBhbmQgZGV2aWNlIHJlYWR5IGZvciBkdW1waW5nIik7CiAJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJcmV0dXJuOwogCi1Bd2F5OgorY2xlYW51cDoKIAotCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVzsKKwlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7CiAKLQlxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKLQkJCSAgICZQZXJpb2RpY19jb250cm9sdm1fd29yaywgUG9sbF9qaWZmaWVzKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKKwkJCSAgICZwZXJpb2RpY19jb250cm9sdm1fd29yaywgcG9sbF9qaWZmaWVzKTsKIH0KIAogc3RhdGljIHZvaWQKLWJ1c19jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSkKK2J1c19jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzX25vLCBpbnQgcmVzcG9uc2UpCiB7Ci0JYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fQlVTX0NSRUFURSwgYnVzTm8sIHJlc3BvbnNlKTsKKwlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfQ1JFQVRFLCBidXNfbm8sIHJlc3BvbnNlKTsKIH0KIAogc3RhdGljIHZvaWQKLWJ1c19kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCitidXNfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIGludCByZXNwb25zZSkKIHsKLQlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfREVTVFJPWSwgYnVzTm8sIHJlc3BvbnNlKTsKKwlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfREVTVFJPWSwgYnVzX25vLCByZXNwb25zZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQorZGV2aWNlX2NyZWF0ZV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIHVsb25nIGRldl9ubywgaW50IHJlc3BvbnNlKQogewotCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIGJ1c19ubywgZGV2X25vLCByZXNwb25zZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSkKK2RldmljZV9kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpCiB7Ci0JZGV2aWNlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UpOwogfQogCiB2b2lkCiB2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpCiB7Ci0KIAlkZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsCiAJCQkJICAgICBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UsCiAJCQkJICAgICBzZWdtZW50X3N0YXRlX3N0YW5kYnkpOwpAQCAtMjE5MSwyMiArMTk5MiwyMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSk7CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQorZGV2aWNlX3Jlc3VtZV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIHVsb25nIGRldl9ubywgaW50IHJlc3BvbnNlKQogewogCWRldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKLQkJCQkgICAgIGJ1c05vLCBkZXZObywgcmVzcG9uc2UsCisJCQkJICAgICBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UsCiAJCQkJICAgICBzZWdtZW50X3N0YXRlX3J1bm5pbmcpOwogfQogCiBCT09MCiB2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKHVsb25nIGJ1c19ubywgc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqYnVzX2luZm8pCiB7Ci0Jdm9pZCAqcCA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNfbm8pOworCXZvaWQgKnAgPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOwogCi0JaWYgKCFwKSB7Ci0JCUxPR0VSUigiKCVsdSkgZmFpbGVkIiwgYnVzX25vKTsKKwlpZiAoIXApCiAJCXJldHVybiBGQUxTRTsKLQl9CiAJbWVtY3B5KGJ1c19pbmZvLCBwLCBzaXplb2Yoc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbykpOwogCXJldHVybiBUUlVFOwogfQpAQCAtMjIxNSwxMiArMjAxNCwxMCBAQAogQk9PTAogdmlzb3JjaGlwc2V0X3NldF9idXNfY29udGV4dCh1bG9uZyBidXNfbm8sIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqcCA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNfbm8pOworCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnAgPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOwogCi0JaWYgKCFwKSB7Ci0JCUxPR0VSUigiKCVsdSkgZmFpbGVkIiwgYnVzX25vKTsKKwlpZiAoIXApCiAJCXJldHVybiBGQUxTRTsKLQl9CiAJcC0+YnVzX2RyaXZlcl9jb250ZXh0ID0gY29udGV4dDsKIAlyZXR1cm4gVFJVRTsKIH0KQEAgLTIyMzAsMTIgKzIwMjcsMTAgQEAKIHZpc29yY2hpcHNldF9nZXRfZGV2aWNlX2luZm8odWxvbmcgYnVzX25vLCB1bG9uZyBkZXZfbm8sCiAJCQkgICAgIHN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRldl9pbmZvKQogewotCXZvaWQgKnAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzX25vLCBkZXZfbm8pOworCXZvaWQgKnAgPSBmaW5kZGV2aWNlKCZkZXZfaW5mb19saXN0LCBidXNfbm8sIGRldl9ubyk7CiAKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCIoJWx1LCVsdSkgZmFpbGVkIiwgYnVzX25vLCBkZXZfbm8pOworCWlmICghcCkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAltZW1jcHkoZGV2X2luZm8sIHAsIHNpemVvZihzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvKSk7CiAJcmV0dXJuIFRSVUU7CiB9CkBAIC0yMjQ1LDEyICsyMDQwLDEwIEBACiB2aXNvcmNoaXBzZXRfc2V0X2RldmljZV9jb250ZXh0KHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKnAgPQotCQkJZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c19ubywgZGV2X25vKTsKKwkJCWZpbmRkZXZpY2UoJmRldl9pbmZvX2xpc3QsIGJ1c19ubywgZGV2X25vKTsKIAotCWlmICghcCkgewotCQlMT0dFUlIoIiglbHUsJWx1KSBmYWlsZWQiLCBidXNfbm8sIGRldl9ubyk7CisJaWYgKCFwKQogCQlyZXR1cm4gRkFMU0U7Ci0JfQogCXAtPmJ1c19kcml2ZXJfY29udGV4dCA9IGNvbnRleHQ7CiAJcmV0dXJuIFRSVUU7CiB9CkBAIC0yMjc4LDExICsyMDcxLDEwIEBACiAJICovCiAJZ2ZwIHw9IF9fR0ZQX05PUkVUUlk7CiAJcCA9IGttZW1fY2FjaGVfYWxsb2MocG9vbCwgZ2ZwKTsKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCJrbWVtX2NhY2hlX2FsbG9jIGZhaWxlZCBlYXJseSBAJXM6JWRcbiIsIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXRvbWljX2luYygmVmlzb3JjaGlwc2V0X2NhY2hlX2J1ZmZlcnNfaW5fdXNlKTsKKworCWF0b21pY19pbmMoJnZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSk7CiAJcmV0dXJuIHA7CiB9CiAKQEAgLTIyOTEsMTYgKzIwODMsMTYgQEAKIHZvaWQKIHZpc29yY2hpcHNldF9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpwb29sLCB2b2lkICpwLCBjaGFyICpmbiwgaW50IGxuKQogewotCWlmICghcCkgewotCQlMT0dFUlIoIk5VTEwgcG9pbnRlciBAJXM6JWRcbiIsIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQotCWF0b21pY19kZWMoJlZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSk7CisKKwlhdG9taWNfZGVjKCZ2aXNvcmNoaXBzZXRfY2FjaGVfYnVmZmVyc19pbl91c2UpOwogCWttZW1fY2FjaGVfZnJlZShwb29sLCBwKTsKIH0KIAogc3RhdGljIHNzaXplX3QgY2hpcHNldHJlYWR5X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWNoYXIgbXNndHlwZVs2NF07CiAKQEAgLTIzMjIsNyArMjExNCw4IEBACiAgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZC4KICAqLwogc3RhdGljIHNzaXplX3QgZGV2aWNlZGlzYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVpbnQgaWQ7CiAKQEAgLTIzMzgsNyArMjEzMSw4IEBACiAgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gYnJvdWdodCBiYWNrIHVwLgogICovCiBzdGF0aWMgc3NpemVfdCBkZXZpY2VlbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdWludCBpZDsKIApAQCAtMjM1MywxMzMgKzIxNDcsMTAyIEBACiB2aXNvcmNoaXBzZXRfaW5pdCh2b2lkKQogewogCWludCByYyA9IDAsIHggPSAwOwotCWNoYXIgc1s2NF07CiAJSE9TVEFERFJFU1MgYWRkcjsKIAogCWlmICghdW5pc3lzX3NwYXJfcGxhdGZvcm0pCiAJCXJldHVybiAtRU5PREVWOwogCi0JTE9HSU5GKCJjaGlwc2V0IGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZCIsIFZFUlNJT04pOwotCS8qIHByb2Nlc3MgbW9kdWxlIG9wdGlvbnMgKi8KLQlQT1NUQ09ERV9MSU5VWF8yKERSSVZFUl9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Ci0KLQlMT0dJTkYoIm9wdGlvbiAtIHRlc3R2bmljPSVkIiwgdmlzb3JjaGlwc2V0X3Rlc3R2bmljKTsKLQlMT0dJTkYoIm9wdGlvbiAtIHRlc3R2bmljY2xpZW50PSVkIiwgdmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50KTsKLQlMT0dJTkYoIm9wdGlvbiAtIHRlc3Rtc2c9JWQiLCB2aXNvcmNoaXBzZXRfdGVzdG1zZyk7Ci0JTE9HSU5GKCJvcHRpb24gLSB0ZXN0dGVhcmRvd249JWQiLCB2aXNvcmNoaXBzZXRfdGVzdHRlYXJkb3duKTsKLQlMT0dJTkYoIm9wdGlvbiAtIG1ham9yPSVkIiwgdmlzb3JjaGlwc2V0X21ham9yKTsKLQlMT0dJTkYoIm9wdGlvbiAtIHNlcnZlcnJlZ3dhaXQ9JWQiLCB2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdCk7Ci0JTE9HSU5GKCJvcHRpb24gLSBjbGllbnRyZWd3YWl0PSVkIiwgdmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQpOwotCUxPR0lORigib3B0aW9uIC0gaG9sZGNoaXBzZXRyZWFkeT0lZCIsIHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5KTsKLQotCW1lbXNldCgmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMsIDAsIHNpemVvZihCdXNEZXZfU2VydmVyX05vdGlmaWVycykpOwotCW1lbXNldCgmQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMsIDAsIHNpemVvZihCdXNEZXZfQ2xpZW50X05vdGlmaWVycykpOwotCW1lbXNldCgmQ29udHJvbFZtX3BheWxvYWRfaW5mbywgMCwgc2l6ZW9mKENvbnRyb2xWbV9wYXlsb2FkX2luZm8pKTsKLQltZW1zZXQoJkxpdmVEdW1wX2luZm8sIDAsIHNpemVvZihMaXZlRHVtcF9pbmZvKSk7Ci0JYXRvbWljX3NldCgmTGl2ZUR1bXBfaW5mby5idWZmZXJzX2luX3VzZSwgMCk7CisJbWVtc2V0KCZidXNkZXZfc2VydmVyX25vdGlmaWVycywgMCwgc2l6ZW9mKGJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzKSk7CisJbWVtc2V0KCZidXNkZXZfY2xpZW50X25vdGlmaWVycywgMCwgc2l6ZW9mKGJ1c2Rldl9jbGllbnRfbm90aWZpZXJzKSk7CisJbWVtc2V0KCZjb250cm9sdm1fcGF5bG9hZF9pbmZvLCAwLCBzaXplb2YoY29udHJvbHZtX3BheWxvYWRfaW5mbykpOworCW1lbXNldCgmbGl2ZWR1bXBfaW5mbywgMCwgc2l6ZW9mKGxpdmVkdW1wX2luZm8pKTsKKwlhdG9taWNfc2V0KCZsaXZlZHVtcF9pbmZvLmJ1ZmZlcnNfaW5fdXNlLCAwKTsKIAogCWlmICh2aXNvcmNoaXBzZXRfdGVzdHZuaWMpIHsKLQkJRVJSRFJWKCJ0ZXN0dm5pYyBvcHRpb24gbm8gbG9uZ2VyIHN1cHBvcnRlZDogKHN0YXR1cyA9ICVkKVxuIiwKLQkJICAgICAgIHgpOwogCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCB4LCBESUFHX1NFVkVSSVRZX0VSUik7CiAJCXJjID0geDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJYWRkciA9IGNvbnRyb2x2bV9nZXRfY2hhbm5lbF9hZGRyZXNzKCk7CiAJaWYgKGFkZHIgIT0gMCkgewotCQlDb250cm9sVm1fY2hhbm5lbCA9CisJCWNvbnRyb2x2bV9jaGFubmVsID0KIAkJICAgIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrCiAJCSAgICAoYWRkciwKIAkJICAgICBzaXplb2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wpLAogCQkgICAgIHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCk7CiAJCWlmIChTUEFSX0NPTlRST0xWTV9DSEFOTkVMX09LX0NMSUVOVCgKLQkJCQl2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihDb250cm9sVm1fY2hhbm5lbCkpKSB7Ci0JCQlMT0dJTkYoIkNoYW5uZWwgJXMgKENvbnRyb2xWbSkgZGlzY292ZXJlZCIsCi0JCQkgICAgICAgdmlzb3JjaGFubmVsX2lkKENvbnRyb2xWbV9jaGFubmVsLCBzKSk7CisJCQkJdmlzb3JjaGFubmVsX2dldF9oZWFkZXIoY29udHJvbHZtX2NoYW5uZWwpKSkgewogCQkJaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZCgpOwogCQl9IGVsc2UgewotCQkJTE9HRVJSKCJjb250cm9sdm0gY2hhbm5lbCBpcyBpbnZhbGlkIik7Ci0JCQl2aXNvcmNoYW5uZWxfZGVzdHJveShDb250cm9sVm1fY2hhbm5lbCk7Ci0JCQlDb250cm9sVm1fY2hhbm5lbCA9IE5VTEw7CisJCQl2aXNvcmNoYW5uZWxfZGVzdHJveShjb250cm9sdm1fY2hhbm5lbCk7CisJCQljb250cm9sdm1fY2hhbm5lbCA9IE5VTEw7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0gZWxzZSB7Ci0JCUxPR0VSUigibm8gY29udHJvbHZtIGNoYW5uZWwgZGlzY292ZXJlZCIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlNYWpvckRldiA9IE1LREVWKHZpc29yY2hpcHNldF9tYWpvciwgMCk7Ci0JcmMgPSB2aXNvcmNoaXBzZXRfZmlsZV9pbml0KE1ham9yRGV2LCAmQ29udHJvbFZtX2NoYW5uZWwpOworCW1ham9yX2RldiA9IE1LREVWKHZpc29yY2hpcHNldF9tYWpvciwgMCk7CisJcmMgPSB2aXNvcmNoaXBzZXRfZmlsZV9pbml0KG1ham9yX2RldiwgJmNvbnRyb2x2bV9jaGFubmVsKTsKIAlpZiAocmMgPCAwKSB7Ci0JCUVSUkRSVigidmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChNYWpvckRldiwgJkNvbnRyb2xWbV9jaGFubmVsKTogZXJyb3IgKHN0YXR1cz0lZClcbiIsIHJjKTsKIAkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQltZW1zZXQoJmdfRGlhZ01zZ0hkciwgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwltZW1zZXQoJmdfZGlhZ19tc2dfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCi0JbWVtc2V0KCZnX0NoaXBTZXRNc2dIZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CisJbWVtc2V0KCZnX2NoaXBzZXRfbXNnX2hkciwgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKIAotCW1lbXNldCgmZ19EZWxEdW1wTXNnSGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOworCW1lbXNldCgmZ19kZWxfZHVtcF9tc2dfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCi0JUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sID0KLQkgICAga21lbV9jYWNoZV9jcmVhdGUoUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sX25hbWUsCisJcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sID0KKwkgICAga21lbV9jYWNoZV9jcmVhdGUocHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sX25hbWUsCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5KSwKIAkJCSAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7Ci0JaWYgKCFQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpIHsKLQkJRVJSRFJWKCJmYWlsZWQgdG8gYWxsb2MgUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sOiAoc3RhdHVzPS0xKVxuIik7CisJaWYgKCFwdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpIHsKIAkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOwogCQlyYyA9IC0xOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9Ci0JaWYgKHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bSkgewotCQlMT0dJTkYoInZpc29yY2hpcHNldF9pbml0OmNvbnRyb2x2bSBkaXNhYmxlZCIpOwotCX0gZWxzZSB7CisJaWYgKCF2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0pIHsKIAkJLyogaWYgYm9vdGluZyBpbiBhIGNyYXNoIGtlcm5lbCAqLwogCQlpZiAodmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbCkKLQkJCUlOSVRfREVMQVlFRF9XT1JLKCZQZXJpb2RpY19jb250cm9sdm1fd29yaywKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZwZXJpb2RpY19jb250cm9sdm1fd29yaywKIAkJCQkJICBzZXR1cF9jcmFzaF9kZXZpY2VzX3dvcmtfcXVldWUpOwogCQllbHNlCi0JCQlJTklUX0RFTEFZRURfV09SSygmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssCisJCQlJTklUX0RFTEFZRURfV09SSygmcGVyaW9kaWNfY29udHJvbHZtX3dvcmssCiAJCQkJCSAgY29udHJvbHZtX3BlcmlvZGljX3dvcmspOwotCQlQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlID0KKwkJcGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSA9CiAJCSAgICBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidmlzb3JjaGlwc2V0X2NvbnRyb2x2bSIpOwogCi0JCWlmIChQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlID09IE5VTEwpIHsKLQkJCUVSUkRSVigiY2Fubm90IGNyZWF0ZSBjb250cm9sdm0gd29ya3F1ZXVlOiAoc3RhdHVzPSVkKVxuIiwKLQkJCSAgICAgICAtRU5PTUVNKTsKKwkJaWYgKCFwZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlKSB7CiAJCQlQT1NUQ09ERV9MSU5VWF8yKENSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDLAogCQkJCQkgRElBR19TRVZFUklUWV9FUlIpOwogCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCU1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7Ci0JCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKLQkJcmMgPSBxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKLQkJCQkJJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworCQltb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgPSBqaWZmaWVzOworCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7CisJCXJjID0gcXVldWVfZGVsYXllZF93b3JrKHBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUsCisJCQkJCSZwZXJpb2RpY19jb250cm9sdm1fd29yaywgcG9sbF9qaWZmaWVzKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJRVJSRFJWKCJxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwgJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOiBlcnJvciAoc3RhdHVzPSVkKVxuIiwgcmMpOwogCQkJUE9TVENPREVfTElOVVhfMihRVUVVRV9ERUxBWUVEX1dPUktfUEMsCiAJCQkJCSBESUFHX1NFVkVSSVRZX0VSUik7Ci0JCQlnb3RvIEF3YXk7CisJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQogCX0KIAotCVZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmRldnQgPSBNYWpvckRldjsKLQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlKSA8IDApIHsKLQkJRVJSRFJWKCJwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIodmlzb3JjaGlwc2V0KSBmYWlsZWQ6IChzdGF0dXM9LTEpXG4iKTsKKwl2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5kZXZ0ID0gbWFqb3JfZGV2OworCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKERFVklDRV9SRUdJU1RFUl9GQUlMVVJFX1BDLCBESUFHX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLTE7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KLQlMT0dJTkYoInZpc29yY2hpcHNldCBkZXZpY2UgY3JlYXRlZCIpOwogCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCXJjID0gMDsKLUF3YXk6CitjbGVhbnVwOgogCWlmIChyYykgewotCQlMT0dFUlIoInZpc29yY2hpcHNldF9pbml0IGZhaWxlZCIpOwogCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCByYywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAl9CkBAIC0yNDg5LDQwICsyMjUyLDM0IEBACiBzdGF0aWMgdm9pZAogdmlzb3JjaGlwc2V0X2V4aXQodm9pZCkKIHsKLQljaGFyIHNbOTldOwotCiAJUE9TVENPREVfTElOVVhfMihEUklWRVJfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAlpZiAodmlzb3JjaGlwc2V0X2Rpc2FibGVfY29udHJvbHZtKSB7CiAJCTsKIAl9IGVsc2UgewotCQljYW5jZWxfZGVsYXllZF93b3JrKCZQZXJpb2RpY19jb250cm9sdm1fd29yayk7Ci0JCWZsdXNoX3dvcmtxdWV1ZShQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSk7Ci0JCVBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUgPSBOVUxMOwotCQlkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oJkNvbnRyb2xWbV9wYXlsb2FkX2luZm8pOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwZXJpb2RpY19jb250cm9sdm1fd29yayk7CisJCWZsdXNoX3dvcmtxdWV1ZShwZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUocGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSk7CisJCXBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUgPSBOVUxMOworCQlkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oJmNvbnRyb2x2bV9wYXlsb2FkX2luZm8pOwogCX0KLQlUZXN0X1ZuaWNfY2hhbm5lbCA9IE5VTEw7Ci0JaWYgKFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCkgewotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sKTsKLQkJUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sID0gTlVMTDsKKwlpZiAocHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShwdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpOworCQlwdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wgPSBOVUxMOwogCX0KIAogCWNsZWFudXBfY29udHJvbHZtX3N0cnVjdHVyZXMoKTsKIAotCW1lbXNldCgmZ19EaWFnTXNnSGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOworCW1lbXNldCgmZ19kaWFnX21zZ19oZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CiAKLQltZW1zZXQoJmdfQ2hpcFNldE1zZ0hkciwgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwltZW1zZXQoJmdfY2hpcHNldF9tc2dfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCi0JbWVtc2V0KCZnX0RlbER1bXBNc2dIZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CisJbWVtc2V0KCZnX2RlbF9kdW1wX21zZ19oZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CiAKLQlMT0dJTkYoIkNoYW5uZWwgJXMgKENvbnRyb2xWbSkgZGlzY29ubmVjdGVkIiwKLQkgICAgICAgdmlzb3JjaGFubmVsX2lkKENvbnRyb2xWbV9jaGFubmVsLCBzKSk7Ci0Jdmlzb3JjaGFubmVsX2Rlc3Ryb3koQ29udHJvbFZtX2NoYW5uZWwpOworCXZpc29yY2hhbm5lbF9kZXN0cm95KGNvbnRyb2x2bV9jaGFubmVsKTsKIAotCXZpc29yY2hpcHNldF9maWxlX2NsZWFudXAoKTsKKwl2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKHZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmRldnQpOwogCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotCUxPR0lORigiY2hpcHNldCBkcml2ZXIgdW5sb2FkZWQiKTsKIH0KIAogbW9kdWxlX3BhcmFtX25hbWVkKHRlc3R2bmljLCB2aXNvcmNoaXBzZXRfdGVzdHZuaWMsIGludCwgU19JUlVHTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZwppbmRleCA3NGI0NzRlLi5iZTljMmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL0tjb25maWcKQEAgLTQsNyArNCw2IEBACiAKIGNvbmZpZyBVTklTWVNfVklTT1JVVElMCiAJdHJpc3RhdGUgIlVuaXN5cyB2aXNvcnV0aWwgZHJpdmVyIgotCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBIQVNfSU9NRU0KIAktLS1oZWxwLS0tCiAJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpc29ydXRpbCBkcml2ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKaW5kZXggZDg3MWJiYi4uZDlhYjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKQEAgLTQsNyArNCw2IEBACiAKIG9iai0kKENPTkZJR19VTklTWVNfVklTT1JVVElMKQkrPSB2aXNvcnV0aWwubwogCi12aXNvcnV0aWwteSA6PSBjaGFycXVldWUubyAgZWFzeXByb2MubyAgcGVyaW9kaWNfd29yay5vICBwcm9jb2JqZWN0dHJlZS5vICBcCi0JCW1lbXJlZ2lvbl9kaXJlY3QubyB2aXNvcmttb2R1dGlscy5vCit2aXNvcnV0aWwteSA6PSBjaGFycXVldWUubyAgcGVyaW9kaWNfd29yay5vICBtZW1yZWdpb25fZGlyZWN0Lm8gdmlzb3JrbW9kdXRpbHMubwogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2NoYXJxdWV1ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKaW5kZXggYWM3YWNiNy4uYzkxNzUyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKQEAgLTM2LDEzICszNiwxMSBAQAogc3RydWN0IGNoYXJxdWV1ZSAqdmlzb3JfY2hhcnF1ZXVlX2NyZWF0ZSh1bG9uZyBuc2xvdHMpCiB7CiAJaW50IGFsbG9jX3NpemUgPSBzaXplb2Yoc3RydWN0IGNoYXJxdWV1ZSkgKyBuc2xvdHMgKyAxOwotCXN0cnVjdCBjaGFycXVldWUgKmNxID0ga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCXN0cnVjdCBjaGFycXVldWUgKmNxOwogCi0JaWYgKGNxID09IE5VTEwpIHsKLQkJRVJSRFJWKCJ2aXNvcl9jaGFycXVldWVfY3JlYXRlIGFsbG9jYXRpb24gZmFpbGVkIChhbGxvY19zaXplPSVkKSIsCi0JCSAgICAgICBhbGxvY19zaXplKTsKKwljcSA9IGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAoY3EgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCWNxLT5hbGxvY19zaXplID0gYWxsb2Nfc2l6ZTsKIAljcS0+bnNsb3RzID0gbnNsb3RzOwogCWNxLT5oZWFkID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2NoYXJxdWV1ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKaW5kZXggNTZjMWY3OS4uZjQ2YTc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpZm5kZWYgX19DSEFSUVVFVUVfSF9fCiAjZGVmaW5lIF9fQ0hBUlFVRVVFX0hfXwogCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInRpbXNrbW9kLmgiCiAKIC8qIHN0cnVjdCBjaGFycXVldWUgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0byB1c2Vycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGYxYWU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLS8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgSGFuZGxlIHByb2Nmcy1zcGVjaWZpYyB0YXNrcy4KLSAqICBOb3RlIHRoYXQgdGhpcyBmaWxlIGRvZXMgbm90IGtub3cgYWJvdXQgYW55IG1vZHVsZS1zcGVjaWZpYyB0aGluZ3MsIG5vcgotICogIGRvZXMgaXQga25vdyBhbnl0aGluZyBhYm91dCB3aGF0IGluZm9ybWF0aW9uIHRvIHJldmVhbCBhcyBwYXJ0IG9mIHRoZSBwcm9jCi0gKiAgZW50cmllcy4gIFRoZSAyIGZ1bmN0aW9ucyB0aGF0IHRha2UgY2FyZSBvZiBkaXNwbGF5aW5nIGRldmljZSBhbmQKLSAqICBkcml2ZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRvCi0gKiAgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcigpLgotICoKLSAqICAgICAgdm9pZCBzaG93X2RldmljZV9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpwKTsKLSAqICAgICAgdm9pZCBzaG93X2RyaXZlcl9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKLSAqCi0gKiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gc2hvd19kZXZpY2VfaW5mbyBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhlCi0gKiAgZGV2aWNlLXNwZWNpZmljIGluZm8gdG8gc2hvdy4gIEl0IGlzIHRoZSBjb250ZXh0IHRoYXQgd2FzIG9yaWdpbmFsbHkKLSAqICBwYXNzZWQgdG8gdmlzb3JfZWFzeXByb2NfSW5pdERldmljZSgpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotCi0jaW5jbHVkZSAidW5pa2xvZy5oIgotI2luY2x1ZGUgInRpbXNrbW9kLmgiCi0jaW5jbHVkZSAiZWFzeXByb2MuaCIKLQotI2RlZmluZSBNWURSVk5BTUUgImVhc3lwcm9jIgotCi0KLQotLyoKLSAqICAgL3Byb2MvPFByb2NJZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jRGlyCi0gKiAgIC9wcm9jLzxQcm9jSWQ+L2RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgUHJvY0RyaXZlckRpcgotICogICAvcHJvYy88UHJvY0lkPi9kcml2ZXIvZGlhZyAgICAgICAgICAgICAgICAgIFByb2NEcml2ZXJEaWFnRmlsZQotICogICAvcHJvYy88UHJvY0lkPi9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgIFByb2NEZXZpY2VEaXIKLSAqICAgL3Byb2MvPFByb2NJZD4vZGV2aWNlLzAgICAgICAgICAgICAgICAgICAgICBwcm9jRGV2aWNleERpcgotICogICAvcHJvYy88UHJvY0lkPi9kZXZpY2UvMC9kaWFnICAgICAgICAgICAgICAgIHByb2NEZXZpY2V4RGlhZ0ZpbGUKLSAqLwotCi0KLXN0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2RyaXZlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKLQljcmVhdGVQcm9jRGlyKGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IHByb2NfbWtkaXJfbW9kZShuYW1lLCBTX0lGRElSLCBwYXJlbnQpOwotCi0JaWYgKHAgPT0gTlVMTCkKLQkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGRpcmVjdG9yeSAlcyIsIG5hbWUpOwotCXJldHVybiBwOwotfQotCi1zdGF0aWMgaW50IHNlcV9zaG93X2RyaXZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXN0YXRpYyBpbnQgcHJvY19vcGVuX2RyaXZlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2VxX3Nob3dfZHJpdmVyLCBQREVfREFUQShpbm9kZSkpOwotfQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzX2RyaXZlciA9IHsKLQkub3BlbiA9IHByb2Nfb3Blbl9kcml2ZXIsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkud3JpdGUgPSBwcm9jX3dyaXRlX2RyaXZlciwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHNlcV9zaG93X2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXN0YXRpYyBpbnQgc2VxX3Nob3dfZGV2aWNlX3Byb3BlcnR5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwotc3RhdGljIGludCBwcm9jX29wZW5fZGV2aWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvd19kZXZpY2UsIFBERV9EQVRBKGlub2RlKSk7Ci19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZvcHNfZGV2aWNlID0gewotCS5vcGVuID0gcHJvY19vcGVuX2RldmljZSwKLQkucmVhZCA9IHNlcV9yZWFkLAotCS53cml0ZSA9IHByb2Nfd3JpdGVfZGV2aWNlLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci1zdGF0aWMgaW50IHByb2Nfb3Blbl9kZXZpY2VfcHJvcGVydHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNlcV9zaG93X2RldmljZV9wcm9wZXJ0eSwgUERFX0RBVEEoaW5vZGUpKTsKLX0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZm9wc19kZXZpY2VfcHJvcGVydHkgPSB7Ci0JLm9wZW4gPSBwcm9jX29wZW5fZGV2aWNlX3Byb3BlcnR5LAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotCi0KLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgY2hhciAqcHJvY0lkLAotCQkJICAgICAgIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCi0JCQkgICAgICAgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAotCQkJCQkJCXZvaWQgKikpCi17Ci0JbWVtc2V0KHBkcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8pKTsKLQlwZHJpdmVyLT5Qcm9jSWQgPSBwcm9jSWQ7Ci0JaWYgKHBkcml2ZXItPlByb2NJZCA9PSBOVUxMKQotCQlFUlJEUlYoIlByb2NJZCBjYW5ub3QgYmUgTlVMTCAodHJvdWJsZSBhaGVhZCkhIik7Ci0JcGRyaXZlci0+U2hvd19kcml2ZXJfaW5mbyA9IHNob3dfZHJpdmVyX2luZm87Ci0JcGRyaXZlci0+U2hvd19kZXZpY2VfaW5mbyA9IHNob3dfZGV2aWNlX2luZm87Ci0JaWYgKHBkcml2ZXItPlByb2NEaXIgPT0gTlVMTCkKLQkJcGRyaXZlci0+UHJvY0RpciA9IGNyZWF0ZVByb2NEaXIocGRyaXZlci0+UHJvY0lkLCBOVUxMKTsKLQlpZiAoKHBkcml2ZXItPlByb2NEaXIgIT0gTlVMTCkgJiYgKHBkcml2ZXItPlByb2NEcml2ZXJEaXIgPT0gTlVMTCkpCi0JCXBkcml2ZXItPlByb2NEcml2ZXJEaXIgPSBjcmVhdGVQcm9jRGlyKCJkcml2ZXIiLAotCQkJCQkJICAgICAgIHBkcml2ZXItPlByb2NEaXIpOwotCWlmICgocGRyaXZlci0+UHJvY0RpciAhPSBOVUxMKSAmJiAocGRyaXZlci0+UHJvY0RldmljZURpciA9PSBOVUxMKSkKLQkJcGRyaXZlci0+UHJvY0RldmljZURpciA9IGNyZWF0ZVByb2NEaXIoImRldmljZSIsCi0JCQkJCQkgICAgICAgcGRyaXZlci0+UHJvY0Rpcik7Ci0JaWYgKChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyICE9IE5VTEwpICYmCi0JICAgIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgPT0gTlVMTCkpIHsKLQkJcGRyaXZlci0+UHJvY0RyaXZlckRpYWdGaWxlID0KLQkJCXByb2NfY3JlYXRlX2RhdGEoImRpYWciLCAwLAotCQkJCQkgcGRyaXZlci0+UHJvY0RyaXZlckRpciwKLQkJCQkJICZwcm9jX2ZvcHNfZHJpdmVyLCBwZHJpdmVyKTsKLQkJaWYgKHBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSA9PSBOVUxMKQotCQkJRVJSRFJWKCJmYWlsZWQgdG8gcmVnaXN0ZXIgL3Byb2MvJXMvZHJpdmVyL2RpYWcgZW50cnkiLAotCQkJICAgICAgIHBkcml2ZXItPlByb2NJZCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcik7Ci0KLQotCi12b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXJFeChzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkJIGNoYXIgKnByb2NJZCwKLQkJCQkgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKLQkJCQkgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAotCQkJCQkJCSAgdm9pZCAqKSwKLQkJCQkgdm9pZCAoKndyaXRlX2RyaXZlcl9pbmZvKShjaGFyICpidWYsCi0JCQkJCQkJICAgc2l6ZV90IGNvdW50LAotCQkJCQkJCSAgIGxvZmZfdCAqcHBvcyksCi0JCQkJIHZvaWQgKCp3cml0ZV9kZXZpY2VfaW5mbykoY2hhciAqYnVmLAotCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKLQkJCQkJCQkgICBsb2ZmX3QgKnBwb3MsCi0JCQkJCQkJICAgdm9pZCAqcCkpCi17Ci0Jdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcihwZHJpdmVyLCBwcm9jSWQsCi0JCQkJICBzaG93X2RyaXZlcl9pbmZvLCBzaG93X2RldmljZV9pbmZvKTsKLQlwZHJpdmVyLT5Xcml0ZV9kcml2ZXJfaW5mbyA9IHdyaXRlX2RyaXZlcl9pbmZvOwotCXBkcml2ZXItPldyaXRlX2RldmljZV9pbmZvID0gd3JpdGVfZGV2aWNlX2luZm87Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyRXgpOwotCi0KLQotdm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREcml2ZXIoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyKQotewotCWlmIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgiZGlhZyIsIHBkcml2ZXItPlByb2NEcml2ZXJEaXIpOwotCQlwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgPSBOVUxMOwotCX0KLQlpZiAocGRyaXZlci0+UHJvY0RyaXZlckRpciAhPSBOVUxMKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIiLCBwZHJpdmVyLT5Qcm9jRGlyKTsKLQkJcGRyaXZlci0+UHJvY0RyaXZlckRpciA9IE5VTEw7Ci0JfQotCWlmIChwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyICE9IE5VTEwpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImRldmljZSIsIHBkcml2ZXItPlByb2NEaXIpOwotCQlwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyID0gTlVMTDsKLQl9Ci0JaWYgKHBkcml2ZXItPlByb2NEaXIgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeShwZHJpdmVyLT5Qcm9jSWQsIE5VTEwpOwotCQlwZHJpdmVyLT5Qcm9jRGlyID0gTlVMTDsKLQl9Ci0JcGRyaXZlci0+UHJvY0lkID0gTlVMTDsKLQlwZHJpdmVyLT5TaG93X2RyaXZlcl9pbmZvID0gTlVMTDsKLQlwZHJpdmVyLT5TaG93X2RldmljZV9pbmZvID0gTlVMTDsKLQlwZHJpdmVyLT5Xcml0ZV9kcml2ZXJfaW5mbyA9IE5VTEw7Ci0JcGRyaXZlci0+V3JpdGVfZGV2aWNlX2luZm8gPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfRGVJbml0RHJpdmVyKTsKLQotCi0KLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERldmljZShzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8sCi0JCQkgICAgICAgdm9pZCAqZGV2ZGF0YSkKLXsKLQlpZiAoKHBkcml2ZXItPlByb2NEZXZpY2VEaXIgIT0gTlVMTCkgJiYgKHAtPnByb2NEZXZpY2V4RGlyID09IE5VTEwpKSB7Ci0JCWNoYXIgc1syOV07Ci0KLQkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7Ci0JCXAtPnByb2NEZXZpY2V4RGlyID0gY3JlYXRlUHJvY0RpcihzLCBwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyKTsKLQkJcC0+ZGV2bm8gPSBkZXZubzsKLQl9Ci0JcC0+ZGV2ZGF0YSA9IGRldmRhdGE7Ci0JcC0+cGRyaXZlciA9IHBkcml2ZXI7Ci0JcC0+ZGV2bm8gPSBkZXZubzsKLQlpZiAoKHAtPnByb2NEZXZpY2V4RGlyICE9IE5VTEwpICYmIChwLT5wcm9jRGV2aWNleERpYWdGaWxlID09IE5VTEwpKSB7Ci0JCXAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgPQotCQkJcHJvY19jcmVhdGVfZGF0YSgiZGlhZyIsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAotCQkJCQkgJnByb2NfZm9wc19kZXZpY2UsIHApOwotCQlpZiAocC0+cHJvY0RldmljZXhEaWFnRmlsZSA9PSBOVUxMKQotCQkJRVJSREVWWChkZXZubywgImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kZXZpY2UvJWQvZGlhZyBlbnRyeSIsCi0JCQkJcGRyaXZlci0+UHJvY0lkLCBkZXZubwotCQkJICAgICAgICk7Ci0JfQotCW1lbXNldCgmKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvWzBdKSwgMCwKLQkgICAgICAgc2l6ZW9mKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvKSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKTsKLQotCi0KLXZvaWQgdmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLAotCQkJCQkgdm9pZCAoKnNob3dfcHJvcGVydHlfaW5mbykKLQkJCQkJIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSwKLQkJCQkJIGNoYXIgKnByb3BlcnR5X25hbWUpCi17Ci0Jc2l6ZV90IGk7Ci0Jc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICpweCA9IE5VTEw7Ci0KLQlpZiAocC0+cHJvY0RldmljZXhEaXIgPT0gTlVMTCkgewotCQlFUlJEUlYoInN0YXRlIGVycm9yIik7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm8pOyBpKyspIHsKLQkJaWYgKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldLnByb2NFbnRyeSA9PSBOVUxMKSB7Ci0JCQlweCA9ICYocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9baV0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCFweCkgewotCQlFUlJERVZYKHAtPmRldm5vLCAidG9vIG1hbnkgZGV2aWNlIHByb3BlcnRpZXMiKTsKLQkJcmV0dXJuOwotCX0KLQlweC0+ZGV2ZGF0YSA9IHAtPmRldmRhdGE7Ci0JcHgtPnBkcml2ZXIgPSBwLT5wZHJpdmVyOwotCXB4LT5wcm9jRW50cnkgPSBwcm9jX2NyZWF0ZV9kYXRhKHByb3BlcnR5X25hbWUsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAotCQkJCQkgJnByb2NfZm9wc19kZXZpY2VfcHJvcGVydHksIHB4KTsKLQlpZiAoc3RybGVuKHByb3BlcnR5X25hbWUpKzEgPiBzaXplb2YocHgtPnByb3BlcnR5X25hbWUpKSB7Ci0JCUVSUkRFVlgocC0+ZGV2bm8sICJkZXZpY2UgcHJvcGVydHkgbmFtZSAlcyB0b28gbG9uZyIsCi0JCQlwcm9wZXJ0eV9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlzdHJjcHkocHgtPnByb3BlcnR5X25hbWUsIHByb3BlcnR5X25hbWUpOwotCWlmIChweC0+cHJvY0VudHJ5ID09IE5VTEwpIHsKLQkJRVJSREVWWChwLT5kZXZubywKLQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgL3Byb2MvJXMvZGV2aWNlLyVkLyVzIGVudHJ5IiwKLQkJCXAtPnBkcml2ZXItPlByb2NJZCwgcC0+ZGV2bm8sIHByb3BlcnR5X25hbWUpOwotCQlyZXR1cm47Ci0JfQotCXB4LT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvID0gc2hvd19wcm9wZXJ0eV9pbmZvOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkpOwotCi0KLQotdm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAotCQkJCSBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubykKLXsKLQlzaXplX3QgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvKTsgaSsrKSB7Ci0JCWlmIChwLT5kZXZpY2VfcHJvcGVydHlfaW5mb1tpXS5wcm9jRW50cnkgIT0gTlVMTCkgewotCQkJc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICpweCA9Ci0JCQkJJihwLT5kZXZpY2VfcHJvcGVydHlfaW5mb1tpXSk7Ci0JCQlyZW1vdmVfcHJvY19lbnRyeShweC0+cHJvcGVydHlfbmFtZSwgcC0+cHJvY0RldmljZXhEaXIpOwotCQkJcHgtPnByb2NFbnRyeSA9IE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKHAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgiZGlhZyIsIHAtPnByb2NEZXZpY2V4RGlyKTsKLQkJcC0+cHJvY0RldmljZXhEaWFnRmlsZSA9IE5VTEw7Ci0JfQotCWlmIChwLT5wcm9jRGV2aWNleERpciAhPSBOVUxMKSB7Ci0JCWNoYXIgc1syOV07Ci0KLQkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KHMsIHBkcml2ZXItPlByb2NEZXZpY2VEaXIpOwotCQlwLT5wcm9jRGV2aWNleERpciA9IE5VTEw7Ci0JfQotCXAtPmRldmRhdGEgPSBOVUxMOwotCXAtPnBkcml2ZXIgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKTsKLQotCi0KLXN0YXRpYyBpbnQgc2VxX3Nob3dfZHJpdmVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0KLQkJKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqKShzZXEtPnByaXZhdGUpOwotCWlmICghcCkKLQkJcmV0dXJuIDA7Ci0JKCoocC0+U2hvd19kcml2ZXJfaW5mbykpKHNlcSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IHNlcV9zaG93X2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCA9Ci0JCShzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKikoc2VxLT5wcml2YXRlKTsKLQlpZiAoKCFwKSB8fCAoIShwLT5wZHJpdmVyKSkpCi0JCXJldHVybiAwOwotCSgqKHAtPnBkcml2ZXItPlNob3dfZGV2aWNlX2luZm8pKShzZXEsIHAtPmRldmRhdGEpOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIGludCBzZXFfc2hvd19kZXZpY2VfcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKnAgPQotCQkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICopKHNlcS0+cHJpdmF0ZSk7Ci0JaWYgKCghcCkgfHwgKCEocC0+c2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbykpKQotCQlyZXR1cm4gMDsKLQkoKihwLT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKSkoc2VxLCBwLT5kZXZkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0gTlVMTDsKLQljaGFyIGxvY2FsX2J1ZlsyNTZdOwotCi0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlwID0gKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqKShzZXEtPnByaXZhdGUpOwotCWlmICgoIXApIHx8ICghKHAtPldyaXRlX2RyaXZlcl9pbmZvKSkpCi0JCXJldHVybiAwOwotCWlmIChjb3VudCA+PSBzaXplb2YobG9jYWxfYnVmKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGxvY2FsX2J1ZiwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWxvY2FsX2J1Zltjb3VudF0gPSAnXDAnOyAgLyogYmUgZnJpZW5kbHkgKi8KLQkoKihwLT5Xcml0ZV9kcml2ZXJfaW5mbykpKGxvY2FsX2J1ZiwgY291bnQsIHBwb3MpOwotCXJldHVybiBjb3VudDsKLX0KLQotCi0KLXN0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwID0gTlVMTDsKLQljaGFyIGxvY2FsX2J1ZlsyNTZdOwotCi0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlwID0gKHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqKShzZXEtPnByaXZhdGUpOwotCWlmICgoIXApIHx8ICghKHAtPnBkcml2ZXIpKSB8fCAoIShwLT5wZHJpdmVyLT5Xcml0ZV9kZXZpY2VfaW5mbykpKQotCQlyZXR1cm4gMDsKLQlpZiAoY291bnQgPj0gc2l6ZW9mKGxvY2FsX2J1ZikpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChjb3B5X2Zyb21fdXNlcihsb2NhbF9idWYsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlsb2NhbF9idWZbY291bnRdID0gJ1wwJzsgIC8qIGJlIGZyaWVuZGx5ICovCi0JKCoocC0+cGRyaXZlci0+V3JpdGVfZGV2aWNlX2luZm8pKShsb2NhbF9idWYsIGNvdW50LCBwcG9zLCBwLT5kZXZkYXRhKTsKLQlyZXR1cm4gY291bnQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvZWFzeXByb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlN2Q1ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyogZWFzeXByb2MuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKiogQGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2VzIG5lY2Vzc2FyeSBmb3IgYSBzaW1wbGUgL3Byb2MgZmlsZQotICogIGltcGxlbWVudGF0aW9uIGZvciBhIGRyaXZlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX0VBU1lQUk9DX0hfXwotI2RlZmluZSBfX0VBU1lQUk9DX0hfXwotCi0jaW5jbHVkZSAidGltc2ttb2QuaCIKLQotCi1zdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqUHJvY0RpcjsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEcml2ZXJEaXI7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRHJpdmVyRGlhZ0ZpbGU7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRGV2aWNlRGlyOwotCWNoYXIgKlByb2NJZDsKLQl2b2lkICgqU2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnApOwotCXZvaWQgKCpTaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7Ci0Jdm9pZCAoKldyaXRlX2RldmljZV9pbmZvKShjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkgIGxvZmZfdCAqcHBvcywgdm9pZCAqcCk7Ci0Jdm9pZCAoKldyaXRlX2RyaXZlcl9pbmZvKShjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLX07Ci0KLS8qIHByb3BlcnR5IGlzIGEgZmlsZSB1bmRlciAvcHJvYy88eD4vZGV2aWNlLzx4Pi88cHJvcGVydHlfbmFtZT4gKi8KLXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfcHJvcGVydHlfaW5mbyB7Ci0JY2hhciBwcm9wZXJ0eV9uYW1lWzI1XTsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NFbnRyeTsKLQlzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXI7Ci0Jdm9pZCAqZGV2ZGF0YTsKLQl2b2lkICgqc2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbykoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnApOwotfTsKLQotc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEZXZpY2V4RGlyOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RldmljZXhEaWFnRmlsZTsKLQlzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXI7Ci0Jdm9pZCAqZGV2ZGF0YTsKLQlpbnQgZGV2bm87Ci0JLyogIGFsbG93IGZvciBhIG51bWJlciBvZiBjdXN0b20gcHJvcGVydGllcyBmb3IgZWFjaCBkZXZpY2U6ICovCi0Jc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvIGRldmljZV9wcm9wZXJ0eV9pbmZvWzEwXTsKLX07Ci0KLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERldmljZShzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8sCi0JCQkgICAgICAgdm9pZCAqZGV2ZGF0YSk7Ci12b2lkIHZpc29yX2Vhc3lwcm9jX0RlSW5pdERldmljZShzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkJIHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCwgaW50IGRldm5vKTsKLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgY2hhciAqcHJvY0lkLAotCQkJICAgICAgIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCi0JCQkgICAgICAgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAotCQkJCQkJCXZvaWQgKikpOwotdm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyRXgoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAotCQkJCSBjaGFyICpwcm9jSWQsCi0JCQkJIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCi0JCQkJIHZvaWQgKCpzaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKLQkJCQkJCQkgIHZvaWQgKiksCi0JCQkJIHZvaWQgKCpXcml0ZV9kcml2ZXJfaW5mbykoY2hhciAqYnVmLAotCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKLQkJCQkJCQkgICBsb2ZmX3QgKnBwb3MpLAotCQkJCSB2b2lkICgqV3JpdGVfZGV2aWNlX2luZm8pKGNoYXIgKmJ1ZiwKLQkJCQkJCQkgICBzaXplX3QgY291bnQsCi0JCQkJCQkJICAgbG9mZl90ICpwcG9zLAotCQkJCQkJCSAgIHZvaWQgKnApKTsKLXZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcik7Ci12b2lkIHZpc29yX2Vhc3lwcm9jX0NyZWF0ZURldmljZVByb3BlcnR5KHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCwKLQkJCQkJIHZvaWQgKCpzaG93X3Byb3BlcnR5X2luZm8pCi0JCQkJCSAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiksCi0JCQkJCSBjaGFyICpwcm9wZXJ0eV9uYW1lKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9tZW1yZWdpb25fZGlyZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9tZW1yZWdpb25fZGlyZWN0LmMKaW5kZXggMzM1MjJjYy4uZWI3NDIyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uX2RpcmVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbl9kaXJlY3QuYwpAQCAtMjAsNyArMjAsNiBAQAogICogIGNoYW5uZWwgbWVtb3J5IChpbiBtYWluIG1lbW9yeSBvZiB0aGUgaG9zdCBzeXN0ZW0pIGZyb20gY29kZSBydW5uaW5nIGluCiAgKiAgYSB2aXJ0dWFsIHBhcnRpdGlvbi4KICAqLwotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJ0aW1za21vZC5oIgogI2luY2x1ZGUgIm1lbXJlZ2lvbi5oIgogCkBAIC00MSwxMiArNDAsMTIgQEAKIHZpc29yX21lbXJlZ2lvbl9jcmVhdGUoSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIG5ieXRlcykKIHsKIAlzdHJ1Y3QgbWVtcmVnaW9uICpyYyA9IE5VTEw7Ci0Jc3RydWN0IG1lbXJlZ2lvbiAqbWVtcmVnaW9uID0ga3phbGxvYyhzaXplb2YoKm1lbXJlZ2lvbiksCi0JCQkJCSAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQlpZiAobWVtcmVnaW9uID09IE5VTEwpIHsKLQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fY3JlYXRlIGFsbG9jYXRpb24gZmFpbGVkIik7CisJc3RydWN0IG1lbXJlZ2lvbiAqbWVtcmVnaW9uOworCisJbWVtcmVnaW9uID0ga3phbGxvYyhzaXplb2YoKm1lbXJlZ2lvbiksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAobWVtcmVnaW9uID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCX0KKwogCW1lbXJlZ2lvbi0+cGh5c2FkZHIgPSBwaHlzYWRkcjsKIAltZW1yZWdpb24tPm5ieXRlcyA9IG5ieXRlczsKIAltZW1yZWdpb24tPm92ZXJsYXBwZWQgPSBGQUxTRTsKQEAgLTcwLDI1ICs2OSwxOSBAQAogewogCXN0cnVjdCBtZW1yZWdpb24gKm1lbXJlZ2lvbiA9IE5VTEw7CiAKLQlpZiAocGFyZW50ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyBwYXJlbnQgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwlpZiAocGFyZW50ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCX0KLQlpZiAocGFyZW50LT5tYXBwZWQgPT0gTlVMTCkgewotCQlFUlJEUlYoIiVzIHBhcmVudCBpcyBub3QgbWFwcGVkISIsIF9fZnVuY19fKTsKKworCWlmIChwYXJlbnQtPm1hcHBlZCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl9CisKIAlpZiAoKG9mZnNldCA+PSBwYXJlbnQtPm5ieXRlcykgfHwKLQkgICAgKChvZmZzZXQgKyBuYnl0ZXMpID49IHBhcmVudC0+bmJ5dGVzKSkgewotCQlFUlJEUlYoIiVzIHJhbmdlICglbHUsJWx1KSBvdXQgb2YgcGFyZW50IHJhbmdlIiwKLQkJICAgICAgIF9fZnVuY19fLCBvZmZzZXQsIG5ieXRlcyk7CisJICAgICgob2Zmc2V0ICsgbmJ5dGVzKSA+PSBwYXJlbnQtPm5ieXRlcykpCiAJCXJldHVybiBOVUxMOwotCX0KKwogCW1lbXJlZ2lvbiA9IGt6YWxsb2Moc2l6ZW9mKCptZW1yZWdpb24pLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOwotCWlmIChtZW1yZWdpb24gPT0gTlVMTCkgewotCQlFUlJEUlYoIiVzIGFsbG9jYXRpb24gZmFpbGVkIiwgX19mdW5jX18pOworCWlmIChtZW1yZWdpb24gPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJbWVtcmVnaW9uLT5waHlzYWRkciA9IHBhcmVudC0+cGh5c2FkZHIgKyBvZmZzZXQ7CiAJbWVtcmVnaW9uLT5uYnl0ZXMgPSBuYnl0ZXM7CkBAIC0xMDYsMTcgKzk5LDExIEBACiAJdWxvbmcgbmJ5dGVzID0gbWVtcmVnaW9uLT5uYnl0ZXM7CiAKIAltZW1yZWdpb24tPnJlcXVlc3RlZCA9IEZBTFNFOwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNhZGRyLCBuYnl0ZXMsIE1ZRFJWTkFNRSkpCi0JCUVSUkRSVigiY2Fubm90IHJlc2VydmUgY2hhbm5lbCBtZW1vcnkgQDB4JWx4IGZvciAweCVseC0tIG5vIGJpZyBkZWFsIiwKLQkJICAgICAgIHBoeXNhZGRyLCBuYnl0ZXMpOwotCWVsc2UKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNhZGRyLCBuYnl0ZXMsIE1ZRFJWTkFNRSkpCiAJCW1lbXJlZ2lvbi0+cmVxdWVzdGVkID0gVFJVRTsKIAltZW1yZWdpb24tPm1hcHBlZCA9IGlvcmVtYXBfY2FjaGUocGh5c2FkZHIsIG5ieXRlcyk7Ci0JaWYgKG1lbXJlZ2lvbi0+bWFwcGVkID09IE5VTEwpIHsKLQkJRVJSRFJWKCJjYW5ub3QgaW9yZW1hcF9jYWNoZSBjaGFubmVsIG1lbW9yeSBAMHglbHggZm9yIDB4JWx4IiwKLQkJICAgICAgIHBoeXNhZGRyLCBuYnl0ZXMpOworCWlmICghbWVtcmVnaW9uLT5tYXBwZWQpCiAJCXJldHVybiBGQUxTRTsKLQl9CiAJcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTE4MCwxMCArMTY3LDkgQEAKIAkJICAgIHN0cnVjdCBtZW1yZWdpb24gKm1lbXJlZ2lvbiwgdWxvbmcgb2Zmc2V0LAogCQkgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKIHsKLQlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gbWVtcmVnaW9uLT5uYnl0ZXMpIHsKLQkJRVJSRFJWKCJtZW1yZWdpb25fcmVhZHdyaXRlIG9mZnNldCBvdXQgb2YgcmFuZ2UhISIpOworCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBtZW1yZWdpb24tPm5ieXRlcykKIAkJcmV0dXJuIC1FSU87Ci0JfQorCiAJaWYgKGlzX3dyaXRlKQogCQltZW1jcHlfdG9pbyhtZW1yZWdpb24tPm1hcHBlZCArIG9mZnNldCwgbG9jYWwsIG5ieXRlcyk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcGVyaW9kaWNfd29yay5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcGVyaW9kaWNfd29yay5jCmluZGV4IDA5MDhiZjkuLmFiYmZiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3BlcmlvZGljX3dvcmsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wZXJpb2RpY193b3JrLmMKQEAgLTE5LDcgKzE5LDYgQEAKICAqICBIZWxwZXIgZnVuY3Rpb25zIHRvIHNjaGVkdWxlIHBlcmlvZGljIHdvcmsgaW4gTGludXgga2VybmVsIG1vZGUuCiAgKi8KIAotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJ0aW1za21vZC5oIgogI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKIApAQCAtOTAsNyArODksNiBAQAogCQlnb3RvIHVubG9jazsKIAl9IGVsc2UgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhwdy0+d29ya3F1ZXVlLCAmcHctPndvcmssCiAJCQkJICAgICAgcHctPmppZmZ5X2ludGVydmFsKSA8IDApIHsKLQkJRVJSREVWKHB3LT5kZXZuYW0sICJxdWV1ZV9kZWxheWVkX3dvcmsgZmFpbGVkISIpOwogCQlwdy0+aXNfc2NoZWR1bGVkID0gRkFMU0U7CiAJCXJjID0gRkFMU0U7CiAJCWdvdG8gdW5sb2NrOwpAQCAtMTE2LDE1ICsxMTQsMTIgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCWlmIChwdy0+d2FudF90b19zdG9wKSB7Ci0JCUVSUkRFVihwdy0+ZGV2bmFtLAotCQkgICAgICAgImRldl9zdGFydF9wZXJpb2RpY193b3JrIGZhaWxlZCEiKTsKIAkJcmMgPSBGQUxTRTsKIAkJZ290byB1bmxvY2s7CiAJfQogCUlOSVRfREVMQVlFRF9XT1JLKCZwdy0+d29yaywgJnBlcmlvZGljX3dvcmtfZnVuYyk7CiAJaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhwdy0+d29ya3F1ZXVlLCAmcHctPndvcmssCiAJCQkgICAgICAgcHctPmppZmZ5X2ludGVydmFsKSA8IDApIHsKLQkJRVJSREVWKHB3LT5kZXZuYW0sICIlcyBxdWV1ZV9kZWxheWVkX3dvcmsgZmFpbGVkISIsIF9fZnVuY19fKTsKIAkJcmMgPSBGQUxTRTsKIAkJZ290byB1bmxvY2s7CiAJfQpAQCAtMTgyLDcgKzE3Nyw3IEBACiAJCQkvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZGVsYXllZCB3b3JrIHdhcyBwZW5kaW5nIGFzCiAJCQkgKiBkZWxheWVkIHdvcmssIGJ1dCB3YXMgTk9UIHJ1bi4KIAkJCSAqLwotCQkJQVNTRVJUKHB3LT5pc19zY2hlZHVsZWQpOworCQkJV0FSTl9PTighcHctPmlzX3NjaGVkdWxlZCk7CiAJCQlwdy0+aXNfc2NoZWR1bGVkID0gRkFMU0U7CiAJCX0gZWxzZSB7CiAJCQkvKiBJZiB3ZSBnZXQgaGVyZSwgZWl0aGVyIHRoZSBkZWxheWVkIHdvcms6CkBAIC0xOTcsMTQgKzE5Miw2IEBACiAJCX0KIAkJaWYgKHB3LT5pc19zY2hlZHVsZWQpIHsKIAkJCXdyaXRlX3VubG9jaygmcHctPmxvY2spOwotCQkJV0FSTkRFVihwdy0+ZGV2bmFtLAotCQkJCSJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iKTsKLQkJCS8qIFdlIHJlbHkgb24gdGhlIGRlbGF5ZWQgd29yayBmdW5jdGlvbiBydW5uaW5nIGhlcmUsCi0JCQkgKiBhbmQgZXZlbnR1YWxseSBjYWxsaW5nCi0JCQkgKiB2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QoKSwKLQkJCSAqIHdoaWNoIHdpbGwgc2VlIHRoYXQgd2FudF90b19zdG9wIGlzIHNldCwgYW5kCi0JCQkgKiBzdWJzZXF1ZW50bHkgY2xlYXIgaXNfc2NoZWR1bGVkLgotCQkJICovCiAJCQlTTEVFUEpJRkZJRVMoMTApOwogCQkJd3JpdGVfbG9jaygmcHctPmxvY2spOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcHJvY29iamVjdHRyZWUuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Byb2NvYmplY3R0cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjc5Y2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcHJvY29iamVjdHRyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBwcm9jb2JqZWN0dHJlZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJwcm9jb2JqZWN0dHJlZS5oIgotCi0jZGVmaW5lIE1ZRFJWTkFNRSAicHJvY29iamVjdHRyZWUiCi0KLQotCi0vKiogVGhpcyBpcyBjb250ZXh0IGluZm8gdGhhdCB3ZSBzdGFzaCBpbiBlYWNoIC9wcm9jIGZpbGUgZW50cnksIHdoaWNoIHdlCi0gKiAgbmVlZCBpbiBvcmRlciB0byBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHN1cHBsaWVzIHRoZSAvcHJvYyByZWFkCi0gKiAgaW5mbyBmb3IgdGhhdCBmaWxlLgotICovCi1zdHJ1Y3QgcHJvY19kaXJfZW50cnlfY29udGV4dCB7Ci0Jdm9pZCAoKnNob3dfcHJvcGVydHkpKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICosIGludCk7Ci0JTVlQUk9DT0JKRUNUICpwcm9jT2JqZWN0OwotCWludCBwcm9wZXJ0eUluZGV4OwotCi19OwotCi0vKiogVGhpcyBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSB0cmVlIHJvb3RlZCBhdAotICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4KLSAqICBQcm9wZXJ0aWVzIGZvciBlYWNoIG9iamVjdCBvZiB0aGlzIHR5cGUgd2lsbCBiZSBsb2NhdGVkIHVuZGVyCi0gKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLi88b2JqZWN0TmFtZT4vPHByb3BlcnR5TmFtZT4uCi0gKi8KLXN0cnVjdCBNWVBST0NUWVBFX1RhZyB7Ci0JY29uc3QgY2hhciAqKm5hbWU7ICAvKio8IG5vZGUgbmFtZXMgZm9yIHRoaXMgdHlwZSwgZW5kaW5nIHdpdGggTlVMTCAqLwotCWludCBuTmFtZXM7ICAgICAgICAgLyoqPCBudW0gb2Ygbm9kZSBuYW1lcyBpbiA8bmFtZT4gKi8KLQotCS8qKiByb290IGRpciBmb3IgdGhpcyB0eXBlIHRyZWUgaW4gL3Byb2MgKi8KLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290OwotCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpcnM7ICAvKio8IGZvciBlYWNoIG5vZGUgaW4gPG5hbWU+ICovCi0KLQkvKiogYm90dG9tIGRpciB3aGVyZSBvYmplY3RzIHdpbGwgYmUgcm9vdGVkOyBpLmUuLCB0aGlzIGlzCi0JICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4vLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUKLQkgKiAgbGFzdCBlbnRyeSBpbiB0aGUgPHByb2NEaXJzPiBhcnJheS4gKi8KLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXI7Ci0KLQkvKiogbmFtZSBmb3IgZWFjaCBwcm9wZXJ0eSB0aGF0IG9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBoYXZlICovCi0JY29uc3QgY2hhciAqKnByb3BlcnR5TmFtZXM7Ci0KLQlpbnQgblByb3BlcnRpZXM7ICAgICAgIC8qKjwgbnVtIG9mIG5hbWVzIGluIDxwcm9wZXJ0eU5hbWVzPiAqLwotCi0JLyoqIENhbGwgdGhpcywgcGFzc2luZyBNWVBST0NPQkpFQ1QuY29udGV4dCBhbmQgdGhlIHByb3BlcnR5IGluZGV4Ci0JICogIHdoZW5ldmVyIHNvbWVvbmUgcmVhZHMgdGhlIHByb2MgZW50cnkgKi8KLQl2b2lkICgqc2hvd19wcm9wZXJ0eSkoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiwgaW50KTsKLX07Ci0KLQotCi1zdHJ1Y3QgTVlQUk9DT0JKRUNUX1RhZyB7Ci0JTVlQUk9DVFlQRSAqdHlwZTsKLQotCS8qKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXIgbm9kZSBpbiAvcHJvYyB1bmRlciB3aGljaCB0aGUKLQkgKiAgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdCB3aWxsIGFwcGVhciBhcyBmaWxlcy4gKi8KLQljaGFyICpuYW1lOwotCi0JaW50IG5hbWVzaXplOyAgIC8qKjwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgbmFtZSAqLwotCXZvaWQgKmNvbnRleHQ7ICAvKio8IHBhc3NlZCB0byBNWVBST0NUWVBFLnNob3dfcHJvcGVydHkgKi8KLQotCS8qKiA8dHlwZS5wcm9jRGlyUm9vdD4vPHR5cGUubmFtZVswXT4vPHR5cGUubmFtZVsxXT4vLi4uLzxuYW1lPiAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpcjsKLQotCS8qKiBhIHByb2MgZGlyIGVudHJ5IGZvciBlYWNoIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3Q7Ci0JICogIHByb3BlcnRpZXMgYXJlIGlkZW50aWZpZWQgaW4gTVlQUk9DVFlQRS5wcm9wZXJ0eU5hbWVzLCBzbyBlYWNoIG9mCi0JICogIHRoZSA8cHJvY0RpclByb3BlcnRpZXM+IGRlc2NyaWJlcyBhIHNpbmdsZSBmaWxlIGxpa2UKLQkgKiAgPHR5cGUucHJvY0RpclJvb3Q+Lzx0eXBlLm5hbWVbMF0+Lzx0eXBlLm5hbWVbMV0+Ly4uLgotCSAqICAgICAgICAgICAvPG5hbWU+Lzxwcm9wZXJ0eU5hbWU+Ci0JICovCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpclByb3BlcnRpZXM7Ci0KLQkvKiogdGhpcyBpcyBhIGhvbGRpbmcgYXJlYSBmb3IgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQKLQkgKiAgdG8gcnVuIHRoZSAvcHJvYyBjYWxsYmFjayBmdW5jdGlvbiAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeV9jb250ZXh0ICpwcm9jRGlyUHJvcGVydHlDb250ZXh0czsKLX07Ci0KLQotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKLWNyZWF0ZVByb2NEaXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19ta2Rpcl9tb2RlKG5hbWUsIFNfSUZESVIsIHBhcmVudCk7Ci0KLQlpZiAocCA9PSBOVUxMKQotCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwgbmFtZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKgotY3JlYXRlUHJvY0ZpbGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCAwLCBwYXJlbnQsCi0JCQkJCQkgICAgZm9wcywgZGF0YSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGZpbGUgJXMiLCBuYW1lKTsKLQlyZXR1cm4gcDsKLX0KLQotc3RhdGljIGludCBzZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXN0YXRpYyBpbnQgcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvdywgUERFX0RBVEEoaW5vZGUpKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzID0gewotCS5vcGVuID0gcHJvY19vcGVuLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotCi0KLU1ZUFJPQ1RZUEUgKnZpc29yX3Byb2NfQ3JlYXRlVHlwZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290LAotCQkJCSAgY29uc3QgY2hhciAqKm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICoqcHJvcGVydHlOYW1lcywKLQkJCQkgIHZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKLQkJCQkJCQl2b2lkICosIGludCkpCi17Ci0JaW50IGkgPSAwOwotCU1ZUFJPQ1RZUEUgKnJjID0gTlVMTCwgKnR5cGUgPSBOVUxMOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50ID0gTlVMTDsKLQotCWlmIChwcm9jRGlyUm9vdCA9PSBOVUxMKSB7Ci0JCUVSUkRSVigicHJvY0RpclJvb3QgY2Fubm90IGJlIE5VTEwhXG4iKTsKLQkJZ290byBBd2F5OwotCX0KLQlpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gTlVMTCkgewotCQlFUlJEUlYoIm5hbWUgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgbm9kZSBuYW1lIVxuIik7Ci0JCWdvdG8gQXdheTsKLQl9Ci0JdHlwZSA9IGt6YWxsb2Moc2l6ZW9mKE1ZUFJPQ1RZUEUpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7Ci0JaWYgKHR5cGUgPT0gTlVMTCkgewotCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlnb3RvIEF3YXk7Ci0JfQotCXR5cGUtPm5hbWUgPSBuYW1lOwotCXR5cGUtPnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCXR5cGUtPm5Qcm9wZXJ0aWVzID0gMDsKLQl0eXBlLT5uTmFtZXMgPSAwOwotCXR5cGUtPnNob3dfcHJvcGVydHkgPSBzaG93X3Byb3BlcnR5OwotCXR5cGUtPnByb2NEaXJSb290ID0gcHJvY0RpclJvb3Q7Ci0JaWYgKHR5cGUtPnByb3BlcnR5TmFtZXMgIT0gTlVMTCkKLQkJd2hpbGUgKHR5cGUtPnByb3BlcnR5TmFtZXNbdHlwZS0+blByb3BlcnRpZXNdICE9IE5VTEwpCi0JCQl0eXBlLT5uUHJvcGVydGllcysrOwotCXdoaWxlICh0eXBlLT5uYW1lW3R5cGUtPm5OYW1lc10gIT0gTlVMTCkKLQkJdHlwZS0+bk5hbWVzKys7Ci0JdHlwZS0+cHJvY0RpcnMgPSBremFsbG9jKCh0eXBlLT5uTmFtZXMgKyAxKSAqCi0JCQkJIHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiksCi0JCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQlpZiAodHlwZS0+cHJvY0RpcnMgPT0gTlVMTCkgewotCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlnb3RvIEF3YXk7Ci0JfQotCXBhcmVudCA9IHByb2NEaXJSb290OwotCWZvciAoaSA9IDA7IGkgPCB0eXBlLT5uTmFtZXM7IGkrKykgewotCQl0eXBlLT5wcm9jRGlyc1tpXSA9IGNyZWF0ZVByb2NEaXIodHlwZS0+bmFtZVtpXSwgcGFyZW50KTsKLQkJaWYgKHR5cGUtPnByb2NEaXJzW2ldID09IE5VTEwpIHsKLQkJCXJjID0gTlVMTDsKLQkJCWdvdG8gQXdheTsKLQkJfQotCQlwYXJlbnQgPSB0eXBlLT5wcm9jRGlyc1tpXTsKLQl9Ci0JdHlwZS0+cHJvY0RpciA9IHR5cGUtPnByb2NEaXJzW3R5cGUtPm5OYW1lcy0xXTsKLQlyYyA9IHR5cGU7Ci1Bd2F5OgotCWlmIChyYyA9PSBOVUxMKSB7Ci0JCWlmICh0eXBlICE9IE5VTEwpIHsKLQkJCXZpc29yX3Byb2NfRGVzdHJveVR5cGUodHlwZSk7Ci0JCQl0eXBlID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0NyZWF0ZVR5cGUpOwotCi0KLQotdm9pZCB2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKE1ZUFJPQ1RZUEUgKnR5cGUpCi17Ci0JaWYgKHR5cGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmICh0eXBlLT5wcm9jRGlycyAhPSBOVUxMKSB7Ci0JCWludCBpID0gdHlwZS0+bk5hbWVzLTE7Ci0KLQkJd2hpbGUgKGkgPj0gMCkgewotCQkJaWYgKHR5cGUtPnByb2NEaXJzW2ldICE9IE5VTEwpIHsKLQkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCA9IE5VTEw7Ci0KLQkJCQlpZiAoaSA9PSAwKQotCQkJCQlwYXJlbnQgPSB0eXBlLT5wcm9jRGlyUm9vdDsKLQkJCQllbHNlCi0JCQkJCXBhcmVudCA9IHR5cGUtPnByb2NEaXJzW2ktMV07Ci0JCQkJcmVtb3ZlX3Byb2NfZW50cnkodHlwZS0+bmFtZVtpXSwgcGFyZW50KTsKLQkJCX0KLQkJCWktLTsKLQkJfQotCQlrZnJlZSh0eXBlLT5wcm9jRGlycyk7Ci0JCXR5cGUtPnByb2NEaXJzID0gTlVMTDsKLQl9Ci0Ja2ZyZWUodHlwZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKTsKLQotCi0KLU1ZUFJPQ09CSkVDVCAqdmlzb3JfcHJvY19DcmVhdGVPYmplY3QoTVlQUk9DVFlQRSAqdHlwZSwKLQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpjb250ZXh0KQotewotCU1ZUFJPQ09CSkVDVCAqb2JqID0gTlVMTCwgKnJjID0gTlVMTDsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAodHlwZSA9PSBOVUxMKSB7Ci0JCUVSUkRSVigidHlwZSBjYW5ub3QgYmUgTlVMTFxuIik7Ci0JCWdvdG8gQXdheTsKLQl9Ci0Jb2JqID0ga3phbGxvYyhzaXplb2YoTVlQUk9DT0JKRUNUKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmIChvYmogPT0gTlVMTCkgewotCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlnb3RvIEF3YXk7Ci0JfQotCW9iai0+dHlwZSA9IHR5cGU7Ci0Jb2JqLT5jb250ZXh0ID0gY29udGV4dDsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCW9iai0+bmFtZSA9IE5VTEw7Ci0JCW9iai0+cHJvY0RpciA9IHR5cGUtPnByb2NEaXI7Ci0JfSBlbHNlIHsKLQkJb2JqLT5uYW1lc2l6ZSA9IHN0cmxlbihuYW1lKSsxOwotCQlvYmotPm5hbWUgPSBrbWFsbG9jKG9iai0+bmFtZXNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQkJaWYgKG9iai0+bmFtZSA9PSBOVUxMKSB7Ci0JCQlvYmotPm5hbWVzaXplID0gMDsKLQkJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlnb3RvIEF3YXk7Ci0JCX0KLQkJc3RyY3B5KG9iai0+bmFtZSwgbmFtZSk7Ci0JCW9iai0+cHJvY0RpciA9IGNyZWF0ZVByb2NEaXIob2JqLT5uYW1lLCB0eXBlLT5wcm9jRGlyKTsKLQkJaWYgKG9iai0+cHJvY0RpciA9PSBOVUxMKQotCQkJZ290byBBd2F5OwotCX0KLQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID0KLQkJa3phbGxvYygodHlwZS0+blByb3BlcnRpZXMgKyAxKSAqCi0JCQlzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5X2NvbnRleHQpLAotCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID09IE5VTEwpIHsKLQkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJZ290byBBd2F5OwotCX0KLQlvYmotPnByb2NEaXJQcm9wZXJ0aWVzID0ga3phbGxvYygodHlwZS0+blByb3BlcnRpZXMgKyAxKSAqCi0JCQkJCSBzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopLAotCQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzID09IE5VTEwpIHsKLQkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJZ290byBBd2F5OwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgewotCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldLnByb2NPYmplY3QgPSBvYmo7Ci0JCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0ucHJvcGVydHlJbmRleCA9IGk7Ci0JCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0uc2hvd19wcm9wZXJ0eSA9Ci0JCQl0eXBlLT5zaG93X3Byb3BlcnR5OwotCQlpZiAodHlwZS0+cHJvcGVydHlOYW1lc1tpXVswXSAhPSAnXDAnKSB7Ci0JCQkvKiBvbmx5IGNyZWF0ZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBuYW1lcyAqLwotCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9Ci0JCQkJY3JlYXRlUHJvY0ZpbGUodHlwZS0+cHJvcGVydHlOYW1lc1tpXSwKLQkJCQkJb2JqLT5wcm9jRGlyLCAmcHJvY19mb3BzLAotCQkJCQkmb2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0c1tpXSk7Ci0JCQlpZiAob2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9PSBOVUxMKSB7Ci0JCQkJcmMgPSBOVUxMOwotCQkJCWdvdG8gQXdheTsKLQkJCX0KLQkJfQotCX0KLQlyYyA9IG9iajsKLUF3YXk6Ci0JaWYgKHJjID09IE5VTEwpIHsKLQkJaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCQl2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3Qob2JqKTsKLQkJCW9iaiA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcHJvY19DcmVhdGVPYmplY3QpOwotCi0KLQotdm9pZCB2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QoTVlQUk9DT0JKRUNUICpvYmopCi17Ci0JTVlQUk9DVFlQRSAqdHlwZSA9IE5VTEw7Ci0KLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybjsKLQl0eXBlID0gb2JqLT50eXBlOwotCWlmICh0eXBlID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAob2JqLT5wcm9jRGlyUHJvcGVydGllcyAhPSBOVUxMKSB7Ci0JCWludCBpID0gMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgewotCQkJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXNbaV0gIT0gTlVMTCkgewotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHR5cGUtPnByb3BlcnR5TmFtZXNbaV0sCi0JCQkJCQkgIG9iai0+cHJvY0Rpcik7Ci0JCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUob2JqLT5wcm9jRGlyUHJvcGVydGllcyk7Ci0JCW9iai0+cHJvY0RpclByb3BlcnRpZXMgPSBOVUxMOwotCX0KLQotCWtmcmVlKG9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMpOwotCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMgPSBOVUxMOwotCi0JaWYgKG9iai0+cHJvY0RpciAhPSBOVUxMKSB7Ci0JCWlmIChvYmotPm5hbWUgIT0gTlVMTCkKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KG9iai0+bmFtZSwgdHlwZS0+cHJvY0Rpcik7Ci0JCW9iai0+cHJvY0RpciA9IE5VTEw7Ci0JfQotCi0Ja2ZyZWUob2JqLT5uYW1lKTsKLQlvYmotPm5hbWUgPSBOVUxMOwotCWtmcmVlKG9iaik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QpOwotCi0KLQotc3RhdGljIGludCBzZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeV9jb250ZXh0ICpjdHggPSBzZXEtPnByaXZhdGU7Ci0KLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCJJIGRvbid0IGhhdmUgYSBmcmVha2luJyBjbHVlLi4uIik7Ci0JCXJldHVybiAwOwotCX0KLQkoKmN0eC0+c2hvd19wcm9wZXJ0eSkoc2VxLCBjdHgtPnByb2NPYmplY3QtPmNvbnRleHQsCi0JCQkgICAgICBjdHgtPnByb3BlcnR5SW5kZXgpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Zpc29ya21vZHV0aWxzLmMKaW5kZXggNTU2ZTI2NC4uNjJmMGY3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC92aXNvcmttb2R1dGlscy5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKiBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAidGltc2ttb2QuaCIKIAogI2RlZmluZSBNWURSVk5BTUUgInRpbXNrbW9kdXRpbHMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2NvcmUuYwppbmRleCA4NGM1YTA3Li5lYWJiY2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfcGlvMl9jb3JlLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfcGlvMl9ncGlvLmMKaW5kZXggZGEzNGQ1NS4uNzc5MDFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2dwaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfZ3Bpby5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYwppbmRleCA4YjFmNTMzLi4xOWJhNzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTQxLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgInZtZV91c2VyLmgiCiAKLXN0YXRpYyBERUZJTkVfTVVURVgodm1lX3VzZXJfbXV0ZXgpOwogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJ2bWVfdXNlciI7CiAKIHN0YXRpYyBpbnQgYnVzW1ZNRV9VU0VSX0JVU19NQVhdOwpAQCAtMTAwLDYgKzEwMCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2aWNlOwkvKiBTeXNmcyBkZXZpY2UgKi8KIAlzdHJ1Y3Qgdm1lX3Jlc291cmNlICpyZXNvdXJjZTsJLyogVk1FIHJlc291cmNlICovCiAJaW50IHVzZXJzOwkJLyogTnVtYmVyIG9mIGN1cnJlbnQgdXNlcnMgKi8KKwlpbnQgbW1hcF9jb3VudDsJCS8qIE51bWJlciBvZiBjdXJyZW50IG1tYXAncyAqLwogfTsKIHN0YXRpYyBzdHJ1Y3QgaW1hZ2VfZGVzYyBpbWFnZVtWTUVfREVWU107CiAKQEAgLTEzNSw2ICsxMzYsMTAgQEAKIAlsb2ZmX3QgKik7CiBzdGF0aWMgbG9mZl90IHZtZV91c2VyX2xsc2VlayhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiBzdGF0aWMgbG9uZyB2bWVfdXNlcl91bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCB2bWVfdXNlcl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK3N0YXRpYyB2b2lkIHZtZV91c2VyX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworc3RhdGljIHZvaWQgdm1lX3VzZXJfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiBzdGF0aWMgaW50IHZtZV91c2VyX21hdGNoKHN0cnVjdCB2bWVfZGV2ICopOwogc3RhdGljIGludCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3Qgdm1lX2RldiAqKTsKQEAgLTE0OCw2ICsxNTMsMTcgQEAKIAkubGxzZWVrID0gdm1lX3VzZXJfbGxzZWVrLAogCS51bmxvY2tlZF9pb2N0bCA9IHZtZV91c2VyX3VubG9ja2VkX2lvY3RsLAogCS5jb21wYXRfaW9jdGwgPSB2bWVfdXNlcl91bmxvY2tlZF9pb2N0bCwKKwkubW1hcCA9IHZtZV91c2VyX21tYXAsCit9OworCitzdHJ1Y3Qgdm1lX3VzZXJfdm1hX3ByaXYgeworCXVuc2lnbmVkIGludCBtaW5vcjsKKwlhdG9taWNfdCByZWZjbnQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHZtZV91c2VyX3ZtX29wcyA9IHsKKwkub3BlbiA9IHZtZV91c2VyX3ZtX29wZW4sCisJLmNsb3NlID0gdm1lX3VzZXJfdm1fY2xvc2UsCiB9OwogCiAKQEAgLTQ4OSw2ICs1MDUsMTEgQEAKIAogCQljYXNlIFZNRV9TRVRfTUFTVEVSOgogCisJCQlpZiAoaW1hZ2VbbWlub3JdLm1tYXBfY291bnQgIT0gMCkgeworCQkJCXByX3dhcm4oIkNhbid0IGFkanVzdCBtYXBwZWQgd2luZG93XG4iKTsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCiAJCQljb3BpZWQgPSBjb3B5X2Zyb21fdXNlcigmbWFzdGVyLCBhcmdwLCBzaXplb2YobWFzdGVyKSk7CiAJCQlpZiAoY29waWVkICE9IDApIHsKIAkJCQlwcl93YXJuKCJQYXJ0aWFsIGNvcHkgZnJvbSB1c2Vyc3BhY2VcbiIpOwpAQCAtNTU1LDE0ICs1NzYsNzkgQEAKIHZtZV91c2VyX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOworCXVuc2lnbmVkIGludCBtaW5vciA9IE1JTk9SKGlub2RlLT5pX3JkZXYpOwogCi0JbXV0ZXhfbG9jaygmdm1lX3VzZXJfbXV0ZXgpOwotCXJldCA9IHZtZV91c2VyX2lvY3RsKGZpbGVfaW5vZGUoZmlsZSksIGZpbGUsIGNtZCwgYXJnKTsKLQltdXRleF91bmxvY2soJnZtZV91c2VyX211dGV4KTsKKwltdXRleF9sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOworCXJldCA9IHZtZV91c2VyX2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJbXV0ZXhfdW5sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgdm1lX3VzZXJfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgdm1lX3VzZXJfdm1hX3ByaXYgKnZtYV9wcml2ID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfaW5jKCZ2bWFfcHJpdi0+cmVmY250KTsKK30KKworc3RhdGljIHZvaWQgdm1lX3VzZXJfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZtZV91c2VyX3ZtYV9wcml2ICp2bWFfcHJpdiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtaW5vciA9IHZtYV9wcml2LT5taW5vcjsKKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmdm1hX3ByaXYtPnJlZmNudCkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmltYWdlW21pbm9yXS5tdXRleCk7CisJaW1hZ2VbbWlub3JdLm1tYXBfY291bnQtLTsKKwltdXRleF91bmxvY2soJmltYWdlW21pbm9yXS5tdXRleCk7CisKKwlrZnJlZSh2bWFfcHJpdik7Cit9CisKK3N0YXRpYyBpbnQgdm1lX3VzZXJfbWFzdGVyX21tYXAodW5zaWduZWQgaW50IG1pbm9yLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2bWVfdXNlcl92bWFfcHJpdiAqdm1hX3ByaXY7CisKKwltdXRleF9sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOworCisJZXJyID0gdm1lX21hc3Rlcl9tbWFwKGltYWdlW21pbm9yXS5yZXNvdXJjZSwgdm1hKTsKKwlpZiAoZXJyKSB7CisJCW11dGV4X3VubG9jaygmaW1hZ2VbbWlub3JdLm11dGV4KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl2bWFfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfdXNlcl92bWFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICh2bWFfcHJpdiA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmaW1hZ2VbbWlub3JdLm11dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdm1hX3ByaXYtPm1pbm9yID0gbWlub3I7CisJYXRvbWljX3NldCgmdm1hX3ByaXYtPnJlZmNudCwgMSk7CisJdm1hLT52bV9vcHMgPSAmdm1lX3VzZXJfdm1fb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gdm1hX3ByaXY7CisKKwlpbWFnZVttaW5vcl0ubW1hcF9jb3VudCsrOworCisJbXV0ZXhfdW5sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1lX3VzZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IoZmlsZV9pbm9kZShmaWxlKS0+aV9yZGV2KTsKKworCWlmICh0eXBlW21pbm9yXSA9PSBNQVNURVJfTUlOT1IpCisJCXJldHVybiB2bWVfdXNlcl9tYXN0ZXJfbW1hcChtaW5vciwgdm1hKTsKKworCXJldHVybiAtRU5PREVWOworfQorCiAKIC8qCiAgKiBVbmFsbG9jYXRlIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMKaW5kZXggNTY1YmExOC4uYjBlYTM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYwpAQCAtMjAyMSwxNCArMjAyMSwyMCBAQAogCWlmIChieVJGVHlwZSA9PSBSRl9SRk1EMjk1OSkgewogCQlpZiAoYnlMb2NhbElEIDw9IFJFVl9JRF9WVDMyNTNfQTEpIHsKIAkJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M19JTklUX0ZPUl9SRk1EOyBpaSsrKQotCQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0luaXRUYWJfUkZNRFtpaV1bMF0sIGJ5VlQzMjUzSW5pdFRhYl9SRk1EW2lpXVsxXSk7CisJCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsCisJCQkJCWJ5VlQzMjUzSW5pdFRhYl9SRk1EW2lpXVswXSwKKwkJCQkJYnlWVDMyNTNJbml0VGFiX1JGTURbaWldWzFdKTsKIAogCQl9IGVsc2UgewogCQkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfSU5JVF9GT1JfUkZNRDsgaWkrKykKLQkJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9SRk1EW2lpXVswXSwgYnlWVDMyNTNCMF9SRk1EW2lpXVsxXSk7CisJCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsCisJCQkJCWJ5VlQzMjUzQjBfUkZNRFtpaV1bMF0sCisJCQkJCWJ5VlQzMjUzQjBfUkZNRFtpaV1bMV0pOwogCiAJCQlmb3IgKGlpID0gMDsgaWkgPCBDQl9WVDMyNTNCMF9BR0NfRk9SX1JGTUQyOTU5OyBpaSsrKQotCQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQzRfUkZNRDI5NTlbaWldWzBdLCBieVZUMzI1M0IwX0FHQzRfUkZNRDI5NTlbaWldWzFdKTsKKwkJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQkJYnlWVDMyNTNCMF9BR0M0X1JGTUQyOTU5W2lpXVswXSwKKwkJCQkJYnlWVDMyNTNCMF9BR0M0X1JGTUQyOTU5W2lpXVsxXSk7CiAKIAkJCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfSVRSVE1TRVQsIDB4MjMpOwogCQkJTUFDdlJlZ0JpdHNPbihkd0lvQmFzZSwgTUFDX1JFR19QQVBFREVMQVksIEJJVCgwKSk7CkBAIC0yMDQzLDEwICsyMDQ5LDEzIEBACiAJCXByaXYtPmxkQm1UaHJlc2hvbGRbM10gPSAwOwogCX0gZWxzZSBpZiAoKGJ5UkZUeXBlID09IFJGX0FJUk9IQSkgfHwgKGJ5UkZUeXBlID09IFJGX0FMMjIzMFMpKSB7CiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0lOSVRfRk9SX0FJUk9IQTIyMzA7IGlpKyspCi0JCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVswXSwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzBdLAorCQkJCWJ5VlQzMjUzQjBfQUlST0hBMjIzMFtpaV1bMV0pOwogCiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0FHQzsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJcHJpdi0+YWJ5QkJWR0FbMF0gPSAweDFDOwogCQlwcml2LT5hYnlCQlZHQVsxXSA9IDB4MTA7CkBAIC0yMDU4LDEwICsyMDY3LDE0IEBACiAJCXByaXYtPmxkQm1UaHJlc2hvbGRbM10gPSAwOwogCX0gZWxzZSBpZiAoYnlSRlR5cGUgPT0gUkZfVVcyNDUxKSB7CiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0lOSVRfRk9SX1VXMjQ1MTsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX1VXMjQ1MVtpaV1bMF0sIGJ5VlQzMjUzQjBfVVcyNDUxW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX1VXMjQ1MVtpaV1bMF0sCisJCQkJYnlWVDMyNTNCMF9VVzI0NTFbaWldWzFdKTsKIAogCQlmb3IgKGlpID0gMDsgaWkgPCBDQl9WVDMyNTNCMF9BR0M7IGlpKyspCi0JCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9BR0NbaWldWzBdLCBieVZUMzI1M0IwX0FHQ1tpaV1bMV0pOworCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsCisJCQkJYnlWVDMyNTNCMF9BR0NbaWldWzBdLAorCQkJCWJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19JVFJUTVNFVCwgMHgyMyk7CiAJCU1BQ3ZSZWdCaXRzT24oZHdJb0Jhc2UsIE1BQ19SRUdfUEFQRURFTEFZLCBCSVQoMCkpOwpAQCAtMjA3Niw3ICsyMDg5LDkgQEAKIAkJcHJpdi0+bGRCbVRocmVzaG9sZFszXSA9IDA7CiAJfSBlbHNlIGlmIChieVJGVHlwZSA9PSBSRl9VVzI0NTIpIHsKIAkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfSU5JVF9GT1JfVVcyNDUxOyBpaSsrKQotCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsIGJ5VlQzMjUzQjBfVVcyNDUxW2lpXVswXSwgYnlWVDMyNTNCMF9VVzI0NTFbaWldWzFdKTsKKwkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LAorCQkJCWJ5VlQzMjUzQjBfVVcyNDUxW2lpXVswXSwKKwkJCQlieVZUMzI1M0IwX1VXMjQ1MVtpaV1bMV0pOwogCiAJCS8qIEluaXQgQU5UIEIgc2VsZWN0LFRYIENvbmZpZyBDUjA5ID0gMHg2MS0+MHg0NSwgMHg0NS0+MHg0MShWQzEvVkMyIGRlZmluZSwgbWFrZSB0aGUgQU5UX0EsIEFOVF9CIGludmVydGVkKSAqLwogCQkvKmJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChkd0lvQmFzZSwweDA5LDB4NDEpOyovCkBAIC0yMDk3LDcgKzIxMTIsOCBAQAogCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgMHhiMCwgMHg1OCk7CiAKIAkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfQUdDOyBpaSsrKQotCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsIGJ5VlQzMjUzQjBfQUdDW2lpXVswXSwgYnlWVDMyNTNCMF9BR0NbaWldWzFdKTsKKwkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LAorCQkJCWJ5VlQzMjUzQjBfQUdDW2lpXVswXSwgYnlWVDMyNTNCMF9BR0NbaWldWzFdKTsKIAogCQlwcml2LT5hYnlCQlZHQVswXSA9IDB4MTQ7CiAJCXByaXYtPmFieUJCVkdBWzFdID0gMHgwQTsKQEAgLTIxMTEsMTAgKzIxMjcsMTMgQEAKIAogCX0gZWxzZSBpZiAoYnlSRlR5cGUgPT0gUkZfVlQzMjI2KSB7CiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0lOSVRfRk9SX0FJUk9IQTIyMzA7IGlpKyspCi0JCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVswXSwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzBdLAorCQkJCWJ5VlQzMjUzQjBfQUlST0hBMjIzMFtpaV1bMV0pOwogCiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0FHQzsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJcHJpdi0+YWJ5QkJWR0FbMF0gPSAweDFDOwogCQlwcml2LT5hYnlCQlZHQVsxXSA9IDB4MTA7CkBAIC0yMTI5LDcgKzIxNDgsOSBAQAogCQkvKiB7eyBSb2JlcnRZdTogMjAwNTAxMDQgKi8KIAl9IGVsc2UgaWYgKGJ5UkZUeXBlID09IFJGX0FJUk9IQTcyMzApIHsKIAkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfSU5JVF9GT1JfQUlST0hBMjIzMDsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzBdLCBieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzFdKTsKKwkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LAorCQkJCWJ5VlQzMjUzQjBfQUlST0hBMjIzMFtpaV1bMF0sCisJCQkJYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVsxXSk7CiAKIAogCQkvKiB7eyBSb2JlcnRZdToyMDA1MDIyMywgcmVxdWVzdCBieSBKZXJyeUNodW5nICovCkBAIC0yMTQyLDcgKzIxNjMsOCBAQAogCQkvKiB9fSAqLwogCiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0FHQzsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJcHJpdi0+YWJ5QkJWR0FbMF0gPSAweDFDOwogCQlwcml2LT5hYnlCQlZHQVsxXSA9IDB4MTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCmluZGV4IDNjMTc3MjUuLjdhNzE3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCkBAIC0xOTMsNyArMTkzLDggQEAKIAkvKiBjbGVhciBOQVYgKi8KIAlNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfTUFDQ1IsIE1BQ0NSX0NMUk5BVik7CiAKLQkvKiBUWF9QRSB3aWxsIHJlc2VydmUgMyB1cyBmb3IgTUFYMjgyOSBBIG1vZGUgb25seSwgaXQgaXMgZm9yIGJldHRlciBUWCB0aHJvdWdocHV0ICovCisJLyogVFhfUEUgd2lsbCByZXNlcnZlIDMgdXMgZm9yIE1BWDI4MjkgQSBtb2RlIG9ubHksCisJICAgaXQgaXMgZm9yIGJldHRlciBUWCB0aHJvdWdocHV0ICovCiAKIAlpZiAocERldmljZS0+YnlSRlR5cGUgPT0gUkZfQUlST0hBNzIzMCkKIAkJUkZiQUw3MjMwU2VsZWN0Q2hhbm5lbFBvc3RQcm9jZXNzKHBEZXZpY2UsIHBEZXZpY2UtPmJ5Q3VycmVudENoLApAQCAtMjE3LDkgKzIxOCwxMSBAQAogCQkvKiBzZXQgSFcgZGVmYXVsdCBwb3dlciByZWdpc3RlciAqLwogCQlNQUN2U2VsZWN0UGFnZTEocERldmljZS0+UG9ydE9mZnNldCk7CiAJCVJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfMU0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKLQkJVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUkNDSywgcERldmljZS0+YnlDdXJQd3IpOworCQlWTlN2T3V0UG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUFdSQ0NLLAorCQkJICAgICBwRGV2aWNlLT5ieUN1clB3cik7CiAJCVJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfNk0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKLQkJVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUk9GRE0sIHBEZXZpY2UtPmJ5Q3VyUHdyKTsKKwkJVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUk9GRE0sCisJCQkgICAgIHBEZXZpY2UtPmJ5Q3VyUHdyKTsKIAkJTUFDdlNlbGVjdFBhZ2UwKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBEZXZpY2UtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwppbmRleCAwM2IyYTkwLi40YmI0ZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCkBAIC02NCw5ICs2NCw5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy8KLS8vIERlZmluZSBtb2R1bGUgb3B0aW9ucwotLy8KKy8qCisgKiBEZWZpbmUgbW9kdWxlIG9wdGlvbnMKKyAqLwogTU9EVUxFX0FVVEhPUigiVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuLCA8bHluZG9uY2hlbkB2bnRlay5jb20udHc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBOZXR3b3JraW5nIFNvbG9tb24tQS9CL0cgV2lyZWxlc3MgTEFOIEFkYXB0ZXIgRHJpdmVyIik7CkBAIC0xMjYsOSArMTI2LDkgQEAKIAogREVWSUNFX1BBUkFNKEJhc2ViYW5kVHlwZSwgImJhc2ViYW5kIHR5cGUiKTsKIAotLy8KLS8vIFN0YXRpYyB2YXJzIGRlZmluaXRpb25zCi0vLworLyoKKyAqIFN0YXRpYyB2YXJzIGRlZmluaXRpb25zCisgKi8KIHN0YXRpYyBDSElQX0lORk8gY2hpcF9pbmZvX3RhYmxlW10gPSB7CiAJeyBWVDMyNTMsICAgICAgICJWSUEgTmV0d29ya2luZyBTb2xvbW9uLUEvQi9HIFdpcmVsZXNzIExBTiBBZGFwdGVyICIsCiAJICAyNTYsIDEsICAgICBERVZJQ0VfRkxBR1NfSVBfQUxJR058REVWSUNFX0ZMQUdTX1RYX0FMSUdOIH0sCkBAIC0yMzEsOSArMjMxLDkgQEAKIAlwcl9kZWJ1ZygiIGJ5QkJUeXBlPSAlZFxuIiwgKGludClwRGV2aWNlLT5ieUJCVHlwZSk7CiB9CiAKLS8vCi0vLyBJbml0aWFsaXNhdGlvbiBvZiBNQUMgJiBCQlAgcmVnaXN0ZXJzCi0vLworLyoKKyAqIEluaXRpYWxpc2F0aW9uIG9mIE1BQyAmIEJCUCByZWdpc3RlcnMKKyAqLwogCiBzdGF0aWMgdm9pZCBkZXZpY2VfaW5pdF9yZWdpc3RlcnMoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQogewpAQCAtNTMwLDEyICs1MzAsMTIgQEAKIAl2b2lkICp2aXJfcG9vbDsKIAogCS8qYWxsb2NhdGUgYWxsIFJEL1REIHJpbmdzIGEgc2luZ2xlIHBvb2wqLwotCXZpcl9wb29sID0gcGNpX3phbGxvY19jb25zaXN0ZW50KHBEZXZpY2UtPnBjaWQsCisJdmlyX3Bvb2wgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZwRGV2aWNlLT5wY2lkLT5kZXYsCiAJCQkJCSBwRGV2aWNlLT5zT3B0cy5uUnhEZXNjczAgKiBzaXplb2YoU1J4RGVzYykgKwogCQkJCQkgcERldmljZS0+c09wdHMublJ4RGVzY3MxICogc2l6ZW9mKFNSeERlc2MpICsKIAkJCQkJIHBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzBdICogc2l6ZW9mKFNUeERlc2MpICsKIAkJCQkJIHBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzFdICogc2l6ZW9mKFNUeERlc2MpLAotCQkJCQkgJnBEZXZpY2UtPnBvb2xfZG1hKTsKKwkJCQkJICZwRGV2aWNlLT5wb29sX2RtYSwgR0ZQX0FUT01JQyk7CiAJaWYgKHZpcl9wb29sID09IE5VTEwpIHsKIAkJZGV2X2VycigmcERldmljZS0+cGNpZC0+ZGV2LCAiYWxsb2NhdGUgZGVzYyBkbWEgbWVtb3J5IGZhaWxlZFxuIik7CiAJCXJldHVybiBmYWxzZTsKQEAgLTU0OSwxNiArNTQ5LDE3IEBACiAJcERldmljZS0+cmQxX3Bvb2xfZG1hID0gcERldmljZS0+cmQwX3Bvb2xfZG1hICsKIAkJcERldmljZS0+c09wdHMublJ4RGVzY3MwICogc2l6ZW9mKFNSeERlc2MpOwogCi0JcERldmljZS0+dHgwX2J1ZnMgPSBwY2lfemFsbG9jX2NvbnNpc3RlbnQocERldmljZS0+cGNpZCwKKwlwRGV2aWNlLT50eDBfYnVmcyA9IGRtYV96YWxsb2NfY29oZXJlbnQoJnBEZXZpY2UtPnBjaWQtPmRldiwKIAkJCQkJCSAgcERldmljZS0+c09wdHMublR4RGVzY3NbMF0gKiBQS1RfQlVGX1NaICsKIAkJCQkJCSAgcERldmljZS0+c09wdHMublR4RGVzY3NbMV0gKiBQS1RfQlVGX1NaICsKIAkJCQkJCSAgQ0JfQkVBQ09OX0JVRl9TSVpFICsKIAkJCQkJCSAgQ0JfTUFYX0JVRl9TSVpFLAotCQkJCQkJICAmcERldmljZS0+dHhfYnVmc19kbWEwKTsKKwkJCQkJCSAgJnBEZXZpY2UtPnR4X2J1ZnNfZG1hMCwKKwkJCQkJCSAgR0ZQX0FUT01JQyk7CiAJaWYgKHBEZXZpY2UtPnR4MF9idWZzID09IE5VTEwpIHsKIAkJZGV2X2VycigmcERldmljZS0+cGNpZC0+ZGV2LCAiYWxsb2NhdGUgYnVmIGRtYSBtZW1vcnkgZmFpbGVkXG4iKTsKIAotCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBEZXZpY2UtPnBjaWQsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwRGV2aWNlLT5wY2lkLT5kZXYsCiAJCQkJICAgIHBEZXZpY2UtPnNPcHRzLm5SeERlc2NzMCAqIHNpemVvZihTUnhEZXNjKSArCiAJCQkJICAgIHBEZXZpY2UtPnNPcHRzLm5SeERlc2NzMSAqIHNpemVvZihTUnhEZXNjKSArCiAJCQkJICAgIHBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzBdICogc2l6ZW9mKFNUeERlc2MpICsKQEAgLTU3NCw3ICs1NzUsNyBAQAogCXBEZXZpY2UtPnRkMV9wb29sX2RtYSA9IHBEZXZpY2UtPnRkMF9wb29sX2RtYSArCiAJCXBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzBdICogc2l6ZW9mKFNUeERlc2MpOwogCi0JLy8gdmlyX3Bvb2w6IHB2b2lkIHR5cGUKKwkvKiB2aXJfcG9vbDogcHZvaWQgdHlwZSAqLwogCXBEZXZpY2UtPmFwVEQwUmluZ3MgPSB2aXJfcG9vbAogCQkrIHBEZXZpY2UtPnNPcHRzLm5SeERlc2NzMCAqIHNpemVvZihTUnhEZXNjKQogCQkrIHBEZXZpY2UtPnNPcHRzLm5SeERlc2NzMSAqIHNpemVvZihTUnhEZXNjKTsKQEAgLTYwNCw3ICs2MDUsNyBAQAogCiBzdGF0aWMgdm9pZCBkZXZpY2VfZnJlZV9yaW5ncyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UpCiB7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChwRGV2aWNlLT5wY2lkLAorCWRtYV9mcmVlX2NvaGVyZW50KCZwRGV2aWNlLT5wY2lkLT5kZXYsCiAJCQkgICAgcERldmljZS0+c09wdHMublJ4RGVzY3MwICogc2l6ZW9mKFNSeERlc2MpICsKIAkJCSAgICBwRGV2aWNlLT5zT3B0cy5uUnhEZXNjczEgKiBzaXplb2YoU1J4RGVzYykgKwogCQkJICAgIHBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzBdICogc2l6ZW9mKFNUeERlc2MpICsKQEAgLTYxNCw3ICs2MTUsNyBAQAogCQkpOwogCiAJaWYgKHBEZXZpY2UtPnR4MF9idWZzKQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBEZXZpY2UtPnBjaWQsCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwRGV2aWNlLT5wY2lkLT5kZXYsCiAJCQkJICAgIHBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzBdICogUEtUX0JVRl9TWiArCiAJCQkJICAgIHBEZXZpY2UtPnNPcHRzLm5UeERlc2NzWzFdICogUEtUX0JVRl9TWiArCiAJCQkJICAgIENCX0JFQUNPTl9CVUZfU0laRSArCkBAIC02NzksOCArNjgwLDggQEAKIAkJUFNSeERlc2MgICAgICAgIHBEZXNjID0gJihwRGV2aWNlLT5hUkQwUmluZ1tpXSk7CiAJCVBERVZJQ0VfUkRfSU5GTyAgcFJESW5mbyA9IHBEZXNjLT5wUkRJbmZvOwogCi0JCXBjaV91bm1hcF9zaW5nbGUocERldmljZS0+cGNpZCwgcFJESW5mby0+c2tiX2RtYSwKLQkJCQkgcERldmljZS0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkbWFfdW5tYXBfc2luZ2xlKCZwRGV2aWNlLT5wY2lkLT5kZXYsIHBSREluZm8tPnNrYl9kbWEsCisJCQkJIHBEZXZpY2UtPnJ4X2J1Zl9zeiwgRE1BX0ZST01fREVWSUNFKTsKIAogCQlkZXZfa2ZyZWVfc2tiKHBSREluZm8tPnNrYik7CiAKQEAgLTY5Niw4ICs2OTcsOCBAQAogCQlQU1J4RGVzYyAgICAgICAgcERlc2MgPSAmKHBEZXZpY2UtPmFSRDFSaW5nW2ldKTsKIAkJUERFVklDRV9SRF9JTkZPICBwUkRJbmZvID0gcERlc2MtPnBSREluZm87CiAKLQkJcGNpX3VubWFwX3NpbmdsZShwRGV2aWNlLT5wY2lkLCBwUkRJbmZvLT5za2JfZG1hLAotCQkJCSBwRGV2aWNlLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoJnBEZXZpY2UtPnBjaWQtPmRldiwgcFJESW5mby0+c2tiX2RtYSwKKwkJCQkgcERldmljZS0+cnhfYnVmX3N6LCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCWRldl9rZnJlZV9za2IocFJESW5mby0+c2tiKTsKIApAQCAtNzY1LDggKzc2Niw4IEBACiAJCVBERVZJQ0VfVERfSU5GTyAgcFRESW5mbyA9IHBEZXNjLT5wVERJbmZvOwogCiAJCWlmIChwVERJbmZvLT5za2JfZG1hICYmIChwVERJbmZvLT5za2JfZG1hICE9IHBUREluZm8tPmJ1Zl9kbWEpKQotCQkJcGNpX3VubWFwX3NpbmdsZShwRGV2aWNlLT5wY2lkLCBwVERJbmZvLT5za2JfZG1hLAotCQkJCQkgcFRESW5mby0+c2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZG1hX3VubWFwX3NpbmdsZSgmcERldmljZS0+cGNpZC0+ZGV2LCBwVERJbmZvLT5za2JfZG1hLAorCQkJCQkgcFRESW5mby0+c2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmIChwVERJbmZvLT5za2IpCiAJCQlkZXZfa2ZyZWVfc2tiKHBUREluZm8tPnNrYik7CkBAIC03ODQsOCArNzg1LDggQEAKIAkJUERFVklDRV9URF9JTkZPICBwVERJbmZvID0gcERlc2MtPnBUREluZm87CiAKIAkJaWYgKHBUREluZm8tPnNrYl9kbWEgJiYgKHBUREluZm8tPnNrYl9kbWEgIT0gcFRESW5mby0+YnVmX2RtYSkpCi0JCQlwY2lfdW5tYXBfc2luZ2xlKHBEZXZpY2UtPnBjaWQsIHBUREluZm8tPnNrYl9kbWEsCi0JCQkJCSBwVERJbmZvLT5za2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZwRGV2aWNlLT5wY2lkLT5kZXYsIHBUREluZm8tPnNrYl9kbWEsCisJCQkJCSBwVERJbmZvLT5za2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAKIAkJaWYgKHBUREluZm8tPnNrYikKIAkJCWRldl9rZnJlZV9za2IocFRESW5mby0+c2tiKTsKQEAgLTgzMSw5ICs4MzIsOSBAQAogCUFTU0VSVChwUkRJbmZvLT5za2IpOwogCiAJcFJESW5mby0+c2tiX2RtYSA9Ci0JCXBjaV9tYXBfc2luZ2xlKHBEZXZpY2UtPnBjaWQsCisJCWRtYV9tYXBfc2luZ2xlKCZwRGV2aWNlLT5wY2lkLT5kZXYsCiAJCQkgICAgICAgc2tiX3B1dChwUkRJbmZvLT5za2IsIHNrYl90YWlscm9vbShwUkRJbmZvLT5za2IpKSwKLQkJCSAgICAgICBwRGV2aWNlLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkgICAgICAgcERldmljZS0+cnhfYnVmX3N6LCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJKigodW5zaWduZWQgaW50ICopJihwUkQtPm1fcmQwUkQwKSkgPSAwOyAvKiBGSVggY2FzdCAqLwogCkBAIC05MzMsNyArOTM0LDcgQEAKIAkJYnlUc3IwID0gcFRELT5tX3RkMFREMC5ieVRTUjA7CiAJCWJ5VHNyMSA9IHBURC0+bV90ZDBURDAuYnlUU1IxOwogCi0JCS8vT25seSB0aGUgc3RhdHVzIG9mIGZpcnN0IFREIGluIHRoZSBjaGFpbiBpcyBjb3JyZWN0CisJCS8qIE9ubHkgdGhlIHN0YXR1cyBvZiBmaXJzdCBURCBpbiB0aGUgY2hhaW4gaXMgY29ycmVjdCAqLwogCQlpZiAocFRELT5tX3RkMVREMS5ieVRDUiAmIFRDUl9TVFApIHsKIAkJCWlmICgocFRELT5wVERJbmZvLT5ieUZsYWdzICYgVERfRkxBR1NfTkVUSUZfU0tCKSAhPSAwKSB7CiAKQEAgLTk4MiwxMCArOTgzLDEwIEBACiAJUERFVklDRV9URF9JTkZPICBwVERJbmZvID0gcERlc2MtPnBUREluZm87CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBUREluZm8tPnNrYjsKIAotCS8vIHByZS1hbGxvY2F0ZWQgYnVmX2RtYSBjYW4ndCBiZSB1bm1hcHBlZC4KKwkvKiBwcmUtYWxsb2NhdGVkIGJ1Zl9kbWEgY2FuJ3QgYmUgdW5tYXBwZWQuICovCiAJaWYgKHBUREluZm8tPnNrYl9kbWEgJiYgKHBUREluZm8tPnNrYl9kbWEgIT0gcFRESW5mby0+YnVmX2RtYSkpIHsKLQkJcGNpX3VubWFwX3NpbmdsZShwRGV2aWNlLT5wY2lkLCBwVERJbmZvLT5za2JfZG1hLCBza2ItPmxlbiwKLQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoJnBEZXZpY2UtPnBjaWQtPmRldiwgcFRESW5mby0+c2tiX2RtYSwKKwkJCQkgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOwogCX0KIAogCWlmIChwVERJbmZvLT5ieUZsYWdzICYgVERfRkxBR1NfTkVUSUZfU0tCKQpAQCAtMTA3NCw3ICsxMDc1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwRGV2aWNlLT5sb2NrLCBmbGFncyk7CiAKLQkvL01ha2Ugc3VyZSBjdXJyZW50IHBhZ2UgaXMgMAorCS8qIE1ha2Ugc3VyZSBjdXJyZW50IHBhZ2UgaXMgMCAqLwogCVZOU3ZJblBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BBR0UxU0VMLCAmYnlPcmdQYWdlU2VsKTsKIAlpZiAoYnlPcmdQYWdlU2VsID09IDEpCiAJCU1BQ3ZTZWxlY3RQYWdlMChwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKQEAgLTEwODIsMTAgKzEwODMsMTIgQEAKIAkJYnlPcmdQYWdlU2VsID0gMDsKIAogCU1BQ3ZSZWFkTUlCQ291bnRlcihwRGV2aWNlLT5Qb3J0T2Zmc2V0LCAmZHdNSUJDb3VudGVyKTsKLQkvLyBUQkQuLi4uCi0JLy8gTXVzdCBkbyB0aGlzIGFmdGVyIGRvaW5nIHJ4L3R4LCBjYXVzZSBJU1IgYml0IGlzIHNsb3cKLQkvLyB0aGFuIFJEL1REIHdyaXRlIGJhY2sKLQkvLyB1cGRhdGUgSVNSIGNvdW50ZXIKKwkvKgorCSAqIFRCRC4uLi4KKwkgKiBNdXN0IGRvIHRoaXMgYWZ0ZXIgZG9pbmcgcngvdHgsIGNhdXNlIElTUiBiaXQgaXMgc2xvdworCSAqIHRoYW4gUkQvVEQgd3JpdGUgYmFjaworCSAqIHVwZGF0ZSBJU1IgY291bnRlcgorCSAqLwogCVNUQXZVcGRhdGU4MDJfMTFDb3VudGVyKCZwRGV2aWNlLT5zODAyXzExQ291bnRlciwgJnBEZXZpY2UtPnNjU3RhdGlzdGljLCBkd01JQkNvdW50ZXIpOwogCXdoaWxlIChwRGV2aWNlLT5kd0lzciAhPSAwKSB7CiAJCVNUQXZVcGRhdGVJc3JTdGF0Q291bnRlcigmcERldmljZS0+c2NTdGF0aXN0aWMsIHBEZXZpY2UtPmR3SXNyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jCmluZGV4IDNjNWI4N2YuLmIyNWVlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYwpAQCAtMTQwLDggKzE0MCw4IEBACiAKIAlza2IgPSByZF9pbmZvLT5za2I7CiAKLQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaWQsIHJkX2luZm8tPnNrYl9kbWEsCi0JCQkgcHJpdi0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWRtYV91bm1hcF9zaW5nbGUoJnByaXYtPnBjaWQtPmRldiwgcmRfaW5mby0+c2tiX2RtYSwKKwkJCSBwcml2LT5yeF9idWZfc3osIERNQV9GUk9NX0RFVklDRSk7CiAKIAlmcmFtZV9zaXplID0gbGUxNl90b19jcHUoY3Vycl9yZC0+bV9yZDFSRDEud1JlcUNvdW50KQogCQkJLSBjcHVfdG9fbGUxNihjdXJyX3JkLT5tX3JkMFJEMC53UmVzQ291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKaW5kZXggYzAxZDRhZi4uMjYxZjgxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5oCkBAIC02Niw0ICs2Niw0IEBACiBpbnQgdm50X3NldF9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKIAotI2VuZGlmIC8vIF9fS0VZX0hfXworI2VuZGlmIC8qIF9fS0VZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMKaW5kZXggMzY1M2EyYi4uODA0OGIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jCkBAIC0xNDEsNyArMTQxLDcgQEAKICAqLwogdm9pZCBNQUN2U2V0U2hvcnRSZXRyeUxpbWl0KHZvaWQgX19pb21lbSAqZHdJb0Jhc2UsIHVuc2lnbmVkIGNoYXIgYnlSZXRyeUxpbWl0KQogewotCS8vIHNldCBTUlQKKwkvKiBzZXQgU1JUICovCiAJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19TUlQsIGJ5UmV0cnlMaW1pdCk7CiB9CiAKQEAgLTE2Miw3ICsxNjIsNyBAQAogICovCiB2b2lkIE1BQ3ZTZXRMb25nUmV0cnlMaW1pdCh2b2lkIF9faW9tZW0gKmR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5UmV0cnlMaW1pdCkKIHsKLQkvLyBzZXQgTFJUCisJLyogc2V0IExSVCAqLwogCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfTFJULCBieVJldHJ5TGltaXQpOwogfQogCkBAIC0xODYsNyArMTg2LDcgQEAKIAogCUFTU0VSVChieUxvb3BiYWNrTW9kZSA8IDMpOwogCWJ5TG9vcGJhY2tNb2RlIDw8PSA2OwotCS8vIHNldCBUQ1IKKwkvKiBzZXQgVENSICovCiAJVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RFU1QsICZieU9yZ1ZhbHVlKTsKIAlieU9yZ1ZhbHVlID0gYnlPcmdWYWx1ZSAmIDB4M0Y7CiAJYnlPcmdWYWx1ZSA9IGJ5T3JnVmFsdWUgfCBieUxvb3BiYWNrTW9kZTsKQEAgLTIxMCwxMyArMjEwLDEzIEBACiB7CiAJaW50ICAgICAgICAgaWk7CiAKLQkvLyByZWFkIHBhZ2UwIHJlZ2lzdGVyCisJLyogcmVhZCBwYWdlMCByZWdpc3RlciAqLwogCWZvciAoaWkgPSAwOyBpaSA8IE1BQ19NQVhfQ09OVEVYVF9TSVpFX1BBR0UwOyBpaSsrKQogCQlWTlN2SW5Qb3J0QigoZHdJb0Jhc2UgKyBpaSksIChwYnlDeHRCdWYgKyBpaSkpOwogCiAJTUFDdlNlbGVjdFBhZ2UxKGR3SW9CYXNlKTsKIAotCS8vIHJlYWQgcGFnZTEgcmVnaXN0ZXIKKwkvKiByZWFkIHBhZ2UxIHJlZ2lzdGVyICovCiAJZm9yIChpaSA9IDA7IGlpIDwgTUFDX01BWF9DT05URVhUX1NJWkVfUEFHRTE7IGlpKyspCiAJCVZOU3ZJblBvcnRCKChkd0lvQmFzZSArIGlpKSwgKHBieUN4dEJ1ZiArIE1BQ19NQVhfQ09OVEVYVF9TSVpFX1BBR0UwICsgaWkpKTsKIApAQCAtMjQyLDI3ICsyNDIsMjcgQEAKIAlpbnQgICAgICAgICBpaTsKIAogCU1BQ3ZTZWxlY3RQYWdlMShkd0lvQmFzZSk7Ci0JLy8gcmVzdG9yZSBwYWdlMQorCS8qIHJlc3RvcmUgcGFnZTEgKi8KIAlmb3IgKGlpID0gMDsgaWkgPCBNQUNfTUFYX0NPTlRFWFRfU0laRV9QQUdFMTsgaWkrKykKIAkJVk5Tdk91dFBvcnRCKChkd0lvQmFzZSArIGlpKSwgKihwYnlDeHRCdWYgKyBNQUNfTUFYX0NPTlRFWFRfU0laRV9QQUdFMCArIGlpKSk7CiAKIAlNQUN2U2VsZWN0UGFnZTAoZHdJb0Jhc2UpOwogCi0JLy8gcmVzdG9yZSBSQ1IsVENSLElNUi4uLgorCS8qIHJlc3RvcmUgUkNSLFRDUixJTVIuLi4gKi8KIAlmb3IgKGlpID0gTUFDX1JFR19SQ1I7IGlpIDwgTUFDX1JFR19JU1I7IGlpKyspCiAJCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIGlpLCAqKHBieUN4dEJ1ZiArIGlpKSk7CiAKLQkvLyByZXN0b3JlIE1BQyBDb25maWcuCisJLyogcmVzdG9yZSBNQUMgQ29uZmlnLiAqLwogCWZvciAoaWkgPSBNQUNfUkVHX0xSVDsgaWkgPCBNQUNfUkVHX1BBR0UxU0VMOyBpaSsrKQogCQlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBpaSwgKihwYnlDeHRCdWYgKyBpaSkpOwogCiAJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19DRkcsICoocGJ5Q3h0QnVmICsgTUFDX1JFR19DRkcpKTsKIAotCS8vIHJlc3RvcmUgUFMgQ29uZmlnLgorCS8qIHJlc3RvcmUgUFMgQ29uZmlnLiAqLwogCWZvciAoaWkgPSBNQUNfUkVHX1BTQ0ZHOyBpaSA8IE1BQ19SRUdfQkJSRUdDVEw7IGlpKyspCiAJCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIGlpLCAqKHBieUN4dEJ1ZiArIGlpKSk7CiAKLQkvLyByZXN0b3JlIENVUlJfUlhfREVTQ19BRERSLCBDVVJSX1RYX0RFU0NfQUREUgorCS8qIHJlc3RvcmUgQ1VSUl9SWF9ERVNDX0FERFIsIENVUlJfVFhfREVTQ19BRERSICovCiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19UWERNQVBUUjAsICoodW5zaWduZWQgbG9uZyAqKShwYnlDeHRCdWYgKyBNQUNfUkVHX1RYRE1BUFRSMCkpOwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfQUMwRE1BUFRSLCAqKHVuc2lnbmVkIGxvbmcgKikocGJ5Q3h0QnVmICsgTUFDX1JFR19BQzBETUFQVFIpKTsKIAlWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0JDTkRNQVBUUiwgKih1bnNpZ25lZCBsb25nICopKHBieUN4dEJ1ZiArIE1BQ19SRUdfQkNORE1BUFRSKSk7CkBAIC0yOTAsNyArMjkwLDcgQEAKIAl1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKIAl1bnNpZ25lZCBzaG9ydCB3dzsKIAotCS8vIHR1cm4gb24gSE9TVENSX1NPRlRSU1QsIGp1c3Qgd3JpdGUgMHgwMSB0byByZXNldAorCS8qIHR1cm4gb24gSE9TVENSX1NPRlRSU1QsIGp1c3Qgd3JpdGUgMHgwMSB0byByZXNldCAqLwogCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfSE9TVENSLCAweDAxKTsKIAogCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKQEAgLTMyMSwxNSArMzIxLDE1IEBACiAJdW5zaWduZWQgY2hhciBhYnlUbXBSZWdEYXRhW01BQ19NQVhfQ09OVEVYVF9TSVpFX1BBR0UwK01BQ19NQVhfQ09OVEVYVF9TSVpFX1BBR0UxXTsKIAlib29sIGJSZXRWYWw7CiAKLQkvLyBQQVRDSC4uLi4KLQkvLyBzYXZlIHNvbWUgaW1wb3J0YW50IHJlZ2lzdGVyJ3MgdmFsdWUsIHRoZW4gZG8KLQkvLyByZXNldCwgdGhlbiByZXN0b3JlIHJlZ2lzdGVyJ3MgdmFsdWUKLQotCS8vIHNhdmUgTUFDIGNvbnRleHQKKwkvKiBQQVRDSC4uLi4KKwkgKiBzYXZlIHNvbWUgaW1wb3J0YW50IHJlZ2lzdGVyJ3MgdmFsdWUsIHRoZW4gZG8KKwkgKiByZXNldCwgdGhlbiByZXN0b3JlIHJlZ2lzdGVyJ3MgdmFsdWUKKwkgKi8KKwkvKiBzYXZlIE1BQyBjb250ZXh0ICovCiAJTUFDdlNhdmVDb250ZXh0KGR3SW9CYXNlLCBhYnlUbXBSZWdEYXRhKTsKLQkvLyBkbyByZXNldAorCS8qIGRvIHJlc2V0ICovCiAJYlJldFZhbCA9IE1BQ2JTb2Z0d2FyZVJlc2V0KGR3SW9CYXNlKTsKLQkvLyByZXN0b3JlIE1BQyBjb250ZXh0LCBleGNlcHQgQ1IwCisJLyogcmVzdG9yZSBNQUMgY29udGV4dCwgZXhjZXB0IENSMCAqLwogCU1BQ3ZSZXN0b3JlQ29udGV4dChkd0lvQmFzZSwgYWJ5VG1wUmVnRGF0YSk7CiAKIAlyZXR1cm4gYlJldFZhbDsKQEAgLTM1NCw5ICszNTQsOSBAQAogCXVuc2lnbmVkIGxvbmcgZHdEYXRhOwogCXVuc2lnbmVkIGNoYXIgYnlEYXRhOwogCi0JLy8gdHVybiBvZmYgd293IHRlbXAgZm9yIHR1cm4gb2ZmIFJ4IHNhZmVseQorCS8qIHR1cm4gb2ZmIHdvdyB0ZW1wIGZvciB0dXJuIG9mZiBSeCBzYWZlbHkgKi8KIAotCS8vIENsZWFyIFJYIERNQTAsMQorCS8qIENsZWFyIFJYIERNQTAsMSAqLwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfUlhETUFDVEwwLCBETUFDVExfQ0xSUlVOKTsKIAlWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BQ1RMMSwgRE1BQ1RMX0NMUlJVTik7CiAJZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgewpAQCAtMzgwLDkgKzM4MCw5IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQkvLyB0cnkgdG8gc2FmZSBzaHV0ZG93biBSWAorCS8qIHRyeSB0byBzYWZlIHNodXRkb3duIFJYICovCiAJTUFDdlJlZ0JpdHNPZmYoZHdJb0Jhc2UsIE1BQ19SRUdfSE9TVENSLCBIT1NUQ1JfUlhPTik7Ci0JLy8gV19NQVhfVElNRU9VVCBpcyB0aGUgdGltZW91dCBwZXJpb2QKKwkvKiBXX01BWF9USU1FT1VUIGlzIHRoZSB0aW1lb3V0IHBlcmlvZCAqLwogCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKIAkJVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0hPU1RDUiwgJmJ5RGF0YSk7CiAJCWlmICghKGJ5RGF0YSAmIEhPU1RDUl9SWE9OU1QpKQpAQCAtNDE1LDEwICs0MTUsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGR3RGF0YTsKIAl1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKIAotCS8vIENsZWFyIFRYIERNQQotCS8vVHgwCisJLyogQ2xlYXIgVFggRE1BICovCisJLyogVHgwICovCiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19UWERNQUNUTDAsIERNQUNUTF9DTFJSVU4pOwotCS8vQUMwCisJLyogQUMwICovCiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19BQzBETUFDVEwsIERNQUNUTF9DTFJSVU4pOwogCiAJZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgewpAQCAtNDQyLDEwICs0NDIsMTAgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCS8vIHRyeSB0byBzYWZlIHNodXRkb3duIFRYCisJLyogdHJ5IHRvIHNhZmUgc2h1dGRvd24gVFggKi8KIAlNQUN2UmVnQml0c09mZihkd0lvQmFzZSwgTUFDX1JFR19IT1NUQ1IsIEhPU1RDUl9UWE9OKTsKIAotCS8vIFdfTUFYX1RJTUVPVVQgaXMgdGhlIHRpbWVvdXQgcGVyaW9kCisJLyogV19NQVhfVElNRU9VVCBpcyB0aGUgdGltZW91dCBwZXJpb2QgKi8KIAlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CiAJCVZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19IT1NUQ1IsICZieURhdGEpOwogCQlpZiAoIShieURhdGEgJiBIT1NUQ1JfVFhPTlNUKSkKQEAgLTUwOSwxMCArNTA5LDEwIEBACiAgKi8KIGJvb2wgTUFDYlNodXRkb3duKHZvaWQgX19pb21lbSAqZHdJb0Jhc2UpCiB7Ci0JLy8gZGlzYWJsZSBNQUMgSU1SCisJLyogZGlzYWJsZSBNQUMgSU1SICovCiAJTUFDdkludERpc2FibGUoZHdJb0Jhc2UpOwogCU1BQ3ZTZXRMb29wYmFja01vZGUoZHdJb0Jhc2UsIE1BQ19MQl9JTlRFUk5BTCk7Ci0JLy8gc3RvcCB0aGUgYWRhcHRlcgorCS8qIHN0b3AgdGhlIGFkYXB0ZXIgKi8KIAlpZiAoIU1BQ2JTYWZlU3RvcChkd0lvQmFzZSkpIHsKIAkJTUFDdlNldExvb3BiYWNrTW9kZShkd0lvQmFzZSwgTUFDX0xCX05PTkUpOwogCQlyZXR1cm4gZmFsc2U7CkBAIC01MzYsMTggKzUzNiwxOCBAQAogICovCiB2b2lkIE1BQ3ZJbml0aWFsaXplKHZvaWQgX19pb21lbSAqZHdJb0Jhc2UpCiB7Ci0JLy8gY2xlYXIgc3RpY2t5IGJpdHMKKwkvKiBjbGVhciBzdGlja3kgYml0cyAqLwogCU1BQ3ZDbGVhclN0Y2tEUyhkd0lvQmFzZSk7Ci0JLy8gZGlzYWJsZSBmb3JjZSBQTUUtZW5hYmxlCisJLyogZGlzYWJsZSBmb3JjZSBQTUUtZW5hYmxlICovCiAJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19QTUMxLCBQTUVfT1ZSKTsKLQkvLyBvbmx5IDMyNTMgQQorCS8qIG9ubHkgMzI1MyBBICovCiAKLQkvLyBkbyByZXNldAorCS8qIGRvIHJlc2V0ICovCiAJTUFDYlNvZnR3YXJlUmVzZXQoZHdJb0Jhc2UpOwogCi0JLy8gcmVzZXQgVFNGIGNvdW50ZXIKKwkvKiByZXNldCBUU0YgY291bnRlciAqLwogCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfVEZUQ1RMLCBURlRDVExfVFNGQ05UUlNUKTsKLQkvLyBlbmFibGUgVFNGIGNvdW50ZXIKKwkvKiBlbmFibGUgVFNGIGNvdW50ZXIgKi8KIAlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RGVENUTCwgVEZUQ1RMX1RTRkNOVFJFTik7CiB9CiAKQEAgLTY3OCw3ICs2NzgsNyBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogICovCi0vL1R4RE1BMSA9IEFDMERNQQorLyogVHhETUExID0gQUMwRE1BICovCiB2b2lkIE1BQ3ZTZXRDdXJyQUMwRGVzY0FkZHJFeCh2b2lkIF9faW9tZW0gKmR3SW9CYXNlLCB1bnNpZ25lZCBsb25nIGR3Q3VyckRlc2NBZGRyKQogewogCXVuc2lnbmVkIHNob3J0IHd3OwpAQCAtNzMzLDcgKzczMyw3IEBACiAJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19UTUNUTDAsIDApOwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfVE1EQVRBMCwgdURlbGF5KTsKIAlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RNQ1RMMCwgKFRNQ1RMX1RNRCB8IFRNQ1RMX1RFKSk7Ci0JZm9yIChpaSA9IDA7IGlpIDwgNjY7IGlpKyspIHsgIC8vIGFzc3VtZSBtYXggUENJIGNsb2NrIGlzIDY2TWh6CisJZm9yIChpaSA9IDA7IGlpIDwgNjY7IGlpKyspIHsgIC8qIGFzc3VtZSBtYXggUENJIGNsb2NrIGlzIDY2TWh6ICovCiAJCWZvciAodXUgPSAwOyB1dSA8IHVEZWxheTsgdXUrKykgewogCQkJVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RNQ1RMMCwgJmJ5VmFsdWUpOwogCQkJaWYgKChieVZhbHVlID09IDApIHx8CkBAIC03ODAsMTQgKzc4MCwxNCBAQAogewogCXVuc2lnbmVkIGNoYXIgYnlPcmdWYWx1ZTsKIAl1bnNpZ25lZCBpbnQgd3c7Ci0JLy8gUmVhZCBQU0NUTAorCS8qIFJlYWQgUFNDVEwgKi8KIAlpZiAoTUFDYklzUmVnQml0c09mZihkd0lvQmFzZSwgTUFDX1JFR19QU0NUTCwgUFNDVExfUFMpKQogCQlyZXR1cm4gdHJ1ZTsKIAotCS8vIERpc2FibGUgUFMKKwkvKiBEaXNhYmxlIFBTICovCiAJTUFDdlJlZ0JpdHNPZmYoZHdJb0Jhc2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX1BTRU4pOwogCi0JLy8gQ2hlY2sgaWYgU3luY0ZsdXNoT0sKKwkvKiBDaGVjayBpZiBTeW5jRmx1c2hPSyAqLwogCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKIAkJVk5TdkluUG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1BTQ1RMLCAmYnlPcmdWYWx1ZSk7CiAJCWlmIChieU9yZ1ZhbHVlICYgUFNDVExfV0FLRURPTkUpCkBAIC04NTksNyArODU5LDcgQEAKIAogCXdPZmZzZXQgKz0gKHVLZXlJZHggKiA0KTsKIAlmb3IgKGlpID0gMDsgaWkgPCA0OyBpaSsrKSB7Ci0JCS8vIGFsd2F5cyBwdXNoIDEyOCBiaXRzCisJCS8qIGFsd2F5cyBwdXNoIDEyOCBiaXRzICovCiAJCXByX2RlYnVnKCIzLiglZCkgd09mZnNldDogJWQsIERhdGE6ICVYXG4iLAogCQkJIGlpLCB3T2Zmc2V0K2lpLCAqcGR3S2V5KTsKIAkJVk5Tdk91dFBvcnRXKGR3SW9CYXNlICsgTUFDX1JFR19NSVNDRkZOREVYLCB3T2Zmc2V0K2lpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5jCmluZGV4IGQyZjM1MWQuLmQ1NWM3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuYwpAQCAtNjMsNTEgKzYzLDUxIEBACiAJLyoqKioqKioqKioqKioqKioqKioqKiovCiAJLyogQUJOT1JNQUwgaW50ZXJydXB0ICovCiAJLyoqKioqKioqKioqKioqKioqKioqKiovCi0JLy8gbm90IGFueSBJTVIgYml0IGludm9rZSBpcnEKKwkvKiBub3QgYW55IElNUiBiaXQgaW52b2tlIGlycSAqLwogCiAJaWYgKGR3SXNyID09IDApIHsKIAkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclVua25vd24rKzsKIAkJcmV0dXJuOwogCX0KIAotLy9BZGRlZCBieSBLeWxlCi0JaWYgKGR3SXNyICYgSVNSX1RYRE1BMCkgICAgICAgICAgICAgICAvLyBJU1IsIGJpdDAKLQkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclR4ME9LKys7ICAgICAgICAgICAgIC8vIFRYRE1BMCBzdWNjZXNzZnVsCisvKiBBZGRlZCBieSBLeWxlICovCisJaWYgKGR3SXNyICYgSVNSX1RYRE1BMCkgICAgICAgICAgICAgICAvKiBJU1IsIGJpdDAgKi8KKwkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclR4ME9LKys7ICAgICAgICAgICAgIC8qIFRYRE1BMCBzdWNjZXNzZnVsICovCiAKLQlpZiAoZHdJc3IgJiBJU1JfQUMwRE1BKSAgICAgICAgICAgICAgIC8vIElTUiwgYml0MQotCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyQUMwVHhPSysrOyAgICAgICAgICAgLy8gQUMwRE1BIHN1Y2Nlc3NmdWwKKwlpZiAoZHdJc3IgJiBJU1JfQUMwRE1BKSAgICAgICAgICAgICAgIC8qIElTUiwgYml0MSAqLworCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyQUMwVHhPSysrOyAgICAgICAgICAgLyogQUMwRE1BIHN1Y2Nlc3NmdWwgKi8KIAotCWlmIChkd0lzciAmIElTUl9CTlRYKSAgICAgICAgICAgICAgICAgLy8gSVNSLCBiaXQyCi0JCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JCZWFjb25UeE9LKys7ICAgICAgICAvLyBCZWFjb25UeCBzdWNjZXNzZnVsCisJaWYgKGR3SXNyICYgSVNSX0JOVFgpICAgICAgICAgICAgICAgICAvKiBJU1IsIGJpdDIgKi8KKwkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzckJlYWNvblR4T0srKzsgICAgICAgIC8qIEJlYWNvblR4IHN1Y2Nlc3NmdWwgKi8KIAotCWlmIChkd0lzciAmIElTUl9SWERNQTApICAgICAgICAgICAgICAgLy8gSVNSLCBiaXQzCi0JCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JSeDBPSysrOyAgICAgICAgICAgICAvLyBSeDAgc3VjY2Vzc2Z1bAorCWlmIChkd0lzciAmIElTUl9SWERNQTApICAgICAgICAgICAgICAgLyogSVNSLCBiaXQzICovCisJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JSeDBPSysrOyAgICAgICAgICAgICAvKiBSeDAgc3VjY2Vzc2Z1bCAqLwogCi0JaWYgKGR3SXNyICYgSVNSX1RCVFQpICAgICAgICAgICAgICAgICAvLyBJU1IsIGJpdDQKLQkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclRCVFRJbnQrKzsgICAgICAgICAgIC8vIFRCVFQgc3VjY2Vzc2Z1bAorCWlmIChkd0lzciAmIElTUl9UQlRUKSAgICAgICAgICAgICAgICAgLyogSVNSLCBiaXQ0ICovCisJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JUQlRUSW50Kys7ICAgICAgICAgICAvKiBUQlRUIHN1Y2Nlc3NmdWwgKi8KIAotCWlmIChkd0lzciAmIElTUl9TT0ZUVElNRVIpICAgICAgICAgICAgLy8gSVNSLCBiaXQ2CisJaWYgKGR3SXNyICYgSVNSX1NPRlRUSU1FUikgICAgICAgICAgICAvKiBJU1IsIGJpdDYgKi8KIAkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclNUSU1FUkludCsrOwogCi0JaWYgKGR3SXNyICYgSVNSX1dBVENIRE9HKSAgICAgICAgICAgICAvLyBJU1IsIGJpdDcKKwlpZiAoZHdJc3IgJiBJU1JfV0FUQ0hET0cpICAgICAgICAgICAgIC8qIElTUiwgYml0NyAqLwogCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyV2F0Y2hEb2crKzsKIAotCWlmIChkd0lzciAmIElTUl9GRVRBTEVSUikgICAgICAgICAgICAgLy8gSVNSLCBiaXQ4CisJaWYgKGR3SXNyICYgSVNSX0ZFVEFMRVJSKSAgICAgICAgICAgICAvKiBJU1IsIGJpdDggKi8KIAkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclVucmVjb3ZlcmFibGVFcnJvcisrOwogCi0JaWYgKGR3SXNyICYgSVNSX1NPRlRJTlQpICAgICAgICAgICAgICAvLyBJU1IsIGJpdDkKLQkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclNvZnRJbnRlcnJ1cHQrKzsgICAgIC8vIHNvZnR3YXJlIGludGVycnVwdAorCWlmIChkd0lzciAmIElTUl9TT0ZUSU5UKSAgICAgICAgICAgICAgLyogSVNSLCBiaXQ5ICovCisJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JTb2Z0SW50ZXJydXB0Kys7ICAgICAvKiBzb2Z0d2FyZSBpbnRlcnJ1cHQgKi8KIAotCWlmIChkd0lzciAmIElTUl9NSUJORUFSRlVMTCkgICAgICAgICAgLy8gSVNSLCBiaXQxMAorCWlmIChkd0lzciAmIElTUl9NSUJORUFSRlVMTCkgICAgICAgICAgLyogSVNSLCBiaXQxMCAqLwogCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyTUlCTmVhcmZ1bGwrKzsKIAotCWlmIChkd0lzciAmIElTUl9SWE5PQlVGKSAgICAgICAgICAgICAgLy8gSVNSLCBiaXQxMQotCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyUnhOb0J1ZisrOyAgICAgICAgICAgLy8gUnggTm8gQnVmZgorCWlmIChkd0lzciAmIElTUl9SWE5PQlVGKSAgICAgICAgICAgICAgLyogSVNSLCBiaXQxMSAqLworCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyUnhOb0J1ZisrOyAgICAgICAgICAgLyogUnggTm8gQnVmZiAqLwogCi0JaWYgKGR3SXNyICYgSVNSX1JYRE1BMSkgICAgICAgICAgICAgICAvLyBJU1IsIGJpdDEyCi0JCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JSeDFPSysrOyAgICAgICAgICAgICAvLyBSeDEgc3VjY2Vzc2Z1bAorCWlmIChkd0lzciAmIElTUl9SWERNQTEpICAgICAgICAgICAgICAgLyogSVNSLCBiaXQxMiAqLworCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyUngxT0srKzsgICAgICAgICAgICAgLyogUngxIHN1Y2Nlc3NmdWwgKi8KIAotCWlmIChkd0lzciAmIElTUl9TT0ZUVElNRVIxKSAgICAgICAgICAgLy8gSVNSLCBiaXQyMQorCWlmIChkd0lzciAmIElTUl9TT0ZUVElNRVIxKSAgICAgICAgICAgLyogSVNSLCBiaXQyMSAqLwogCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyU1RJTUVSMUludCsrOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCmluZGV4IDA3Y2UzZmQuLjc0Njg3NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCkBAIC02NCwyMSArNjQsMjEgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENSSVRJQ0FMX1BBQ0tFVF9MRU4gICAgICAyNTYgICAgLy8gaWYgcGFja2V0IHNpemUgPCAyNTYgLT4gaW4tZGlyZWN0IHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwYWNrZXQgc2l6ZSA+PSAyNTYgLT4gZGlyZWN0IHNlbmQKKyNkZWZpbmUgQ1JJVElDQUxfUEFDS0VUX0xFTiAgICAgIDI1NiAgICAvKiBpZiBwYWNrZXQgc2l6ZSA8IDI1NiAtPiBpbi1kaXJlY3Qgc2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgc2l6ZSA+PSAyNTYgLT4gZGlyZWN0IHNlbmQgKi8KIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdUaW1lU3RhbXBPZmZbMl1bTUFYX1JBVEVdID0gewotCXszODQsIDI4OCwgMjI2LCAyMDksIDU0LCA0MywgMzcsIDMxLCAyOCwgMjUsIDI0LCAyM30sIC8vIExvbmcgUHJlYW1ibGUKLQl7Mzg0LCAxOTIsIDEzMCwgMTEzLCA1NCwgNDMsIDM3LCAzMSwgMjgsIDI1LCAyNCwgMjN9LCAvLyBTaG9ydCBQcmVhbWJsZQorCXszODQsIDI4OCwgMjI2LCAyMDksIDU0LCA0MywgMzcsIDMxLCAyOCwgMjUsIDI0LCAyM30sIC8qIExvbmcgUHJlYW1ibGUgKi8KKwl7Mzg0LCAxOTIsIDEzMCwgMTEzLCA1NCwgNDMsIDM3LCAzMSwgMjgsIDI1LCAyNCwgMjN9LCAvKiBTaG9ydCBQcmVhbWJsZSAqLwogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdGQl9PcHQwWzJdWzVdID0gewotCXtSQVRFXzEyTSwgUkFURV8xOE0sIFJBVEVfMjRNLCBSQVRFXzM2TSwgUkFURV80OE19LCAvLyBmYWxsYmFja19yYXRlMAotCXtSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8zNk19LCAvLyBmYWxsYmFja19yYXRlMQorCXtSQVRFXzEyTSwgUkFURV8xOE0sIFJBVEVfMjRNLCBSQVRFXzM2TSwgUkFURV80OE19LCAvKiBmYWxsYmFja19yYXRlMCAqLworCXtSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8zNk19LCAvKiBmYWxsYmFja19yYXRlMSAqLwogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3RkJfT3B0MVsyXVs1XSA9IHsKLQl7UkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8yNE0sIFJBVEVfMzZNfSwgLy8gZmFsbGJhY2tfcmF0ZTAKLQl7UkFURV82TSAsIFJBVEVfNk0sICBSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNfSwgLy8gZmFsbGJhY2tfcmF0ZTEKKwl7UkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8yNE0sIFJBVEVfMzZNfSwgLyogZmFsbGJhY2tfcmF0ZTAgKi8KKwl7UkFURV82TSAsIFJBVEVfNk0sICBSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNfSwgLyogZmFsbGJhY2tfcmF0ZTEgKi8KIH07CiAKICNkZWZpbmUgUlRTRFVSX0JCICAgICAgIDAKQEAgLTExNiw3ICsxMTYsNyBAQAogc192R2VuZXJhdGVUeFBhcmFtZXRlcigKIAlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCiAJdW5zaWduZWQgY2hhciBieVBrdFR5cGUsCi0Jdm9pZCAqcFR4QnVmSGVhZCwKKwlzdHJ1Y3Qgdm50X3R4X2ZpZm9faGVhZCAqLAogCXZvaWQgKnB2UnJ2VGltZSwKIAl2b2lkICpwdlJUUywKIAl2b2lkICpwdkNUUywKQEAgLTE3Niw5ICsxNzYsOSBAQAogCXVuc2lnbmVkIGludCB1RGF0YVRpbWUsIHVBY2tUaW1lOwogCiAJdURhdGFUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIGNiRnJhbWVMZW5ndGgsIHdSYXRlKTsKLQlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFCKSAvL2xsYixDQ0sgbW9kZQorCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUIpIC8qIGxsYixDQ0sgbW9kZSAqLwogCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKLQllbHNlIC8vMTFnIDIuNEcgT0ZETSBtb2RlICYgMTFhIDVHIE9GRE0gbW9kZQorCWVsc2UgLyogMTFnIDIuNEcgT0ZETSBtb2RlICYgMTFhIDVHIE9GRE0gbW9kZSAqLwogCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAKIAlpZiAoYk5lZWRBY2spCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJCQkJCWZyYW1lX2xlbmd0aCwgcmF0ZSwgbmVlZF9hY2spKTsKIH0KIAotLy9ieUZyZXFUeXBlOiAwPT41R0haIDE9PjIuNEdIWgorLyogYnlGcmVxVHlwZTogMD0+NUdIWiAxPT4yLjRHSFogKi8KIHN0YXRpYwogX19sZTE2CiBzX3VHZXRSVFNDVFNSc3ZUaW1lKApAQCAtMjEwLDI5ICsyMTAsMjkgQEAKIAl1UnJ2VGltZSA9IHVSVFNUaW1lID0gdUNUU1RpbWUgPSB1QWNrVGltZSA9IHVEYXRhVGltZSA9IDA7CiAKIAl1RGF0YVRpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0N1cnJlbnRSYXRlKTsKLQlpZiAoYnlSVFNSc3ZUeXBlID09IDApIHsgLy9SVFNUeFJydlRpbWVfYmIKKwlpZiAoYnlSVFNSc3ZUeXBlID09IDApIHsgLyogUlRTVHhScnZUaW1lX2JiICovCiAJCXVSVFNUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDIwLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAJCXVDVFNUaW1lID0gdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKLQl9IGVsc2UgaWYgKGJ5UlRTUnN2VHlwZSA9PSAxKSB7IC8vUlRTVHhScnZUaW1lX2JhLCBvbmx5IGluIDIuNEdIWgorCX0gZWxzZSBpZiAoYnlSVFNSc3ZUeXBlID09IDEpIHsgLyogUlRTVHhScnZUaW1lX2JhLCBvbmx5IGluIDIuNEdIWiAqLwogCQl1UlRTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAyMCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKLQl9IGVsc2UgaWYgKGJ5UlRTUnN2VHlwZSA9PSAyKSB7IC8vUlRTVHhScnZUaW1lX2FhCisJfSBlbHNlIGlmIChieVJUU1JzdlR5cGUgPT0gMikgeyAvKiBSVFNUeFJydlRpbWVfYWEgKi8KIAkJdVJUU1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMjAsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCXVDVFNUaW1lID0gdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7Ci0JfSBlbHNlIGlmIChieVJUU1JzdlR5cGUgPT0gMykgeyAvL0NUU1R4UnJ2VGltZV9iYSwgb25seSBpbiAyLjRHSFoKKwl9IGVsc2UgaWYgKGJ5UlRTUnN2VHlwZSA9PSAzKSB7IC8qIENUU1R4UnJ2VGltZV9iYSwgb25seSBpbiAyLjRHSFogKi8KIAkJdUNUU1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAkJdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCXVScnZUaW1lID0gdUNUU1RpbWUgKyB1QWNrVGltZSArIHVEYXRhVGltZSArIDIqcERldmljZS0+dVNJRlM7CiAJCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXVScnZUaW1lKTsKIAl9CiAKLQkvL1JUU1JydlRpbWUKKwkvKiBSVFNScnZUaW1lICovCiAJdVJydlRpbWUgPSB1UlRTVGltZSArIHVDVFNUaW1lICsgdUFja1RpbWUgKyB1RGF0YVRpbWUgKyAzKnBEZXZpY2UtPnVTSUZTOwogCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXVScnZUaW1lKTsKIH0KIAotLy9ieUZyZXFUeXBlIDA6IDVHSHosIDE6Mi40R2h6CisvKiBieUZyZXFUeXBlIDA6IDVHSHosIDE6Mi40R2h6ICovCiBzdGF0aWMKIHVuc2lnbmVkIGludAogc191R2V0RGF0YUR1cmF0aW9uKApAQCAtMjQ4LDIyICsyNDgsMjIgQEAKIAl1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24KICkKIHsKLQlib29sIGJMYXN0RnJhZyA9IDA7CisJYm9vbCBiTGFzdEZyYWcgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQgdUFja1RpbWUgPSAwLCB1TmV4dFBrdFRpbWUgPSAwOwogCiAJaWYgKHVGcmFnSWR4ID09ICh1TUFDZnJhZ051bS0xKSkKLQkJYkxhc3RGcmFnID0gMTsKKwkJYkxhc3RGcmFnID0gdHJ1ZTsKIAogCXN3aXRjaCAoYnlEdXJUeXBlKSB7Ci0JY2FzZSBEQVRBRFVSX0I6ICAgIC8vREFUQURVUl9CCi0JCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsvL05vbiBGcmFnIG9yIExhc3QgRnJhZworCWNhc2UgREFUQURVUl9COiAgICAvKiBEQVRBRFVSX0IgKi8KKwkJaWYgKCgodU1BQ2ZyYWdOdW0gPT0gMSkpIHx8IGJMYXN0RnJhZykgey8qIE5vbiBGcmFnIG9yIExhc3QgRnJhZyAqLwogCQkJaWYgKGJOZWVkQWNrKSB7CiAJCQkJdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAkJCQlyZXR1cm4gcERldmljZS0+dVNJRlMgKyB1QWNrVGltZTsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCX0gZWxzZSB7Ly9GaXJzdCBGcmFnIG9yIE1pZCBGcmFnCisJCX0gZWxzZSB7LyogRmlyc3QgRnJhZyBvciBNaWQgRnJhZyAqLwogCQkJaWYgKHVGcmFnSWR4ID09ICh1TUFDZnJhZ051bS0yKSkKIAkJCQl1TmV4dFBrdFRpbWUgPSBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkxhc3RGcmFnbWVudFNpemUsIHdSYXRlLCBiTmVlZEFjayk7CiAJCQllbHNlCkBAIC0yNzgsMTUgKzI3OCwxNSBAQAogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBEQVRBRFVSX0E6ICAgIC8vREFUQURVUl9BCi0JCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsvL05vbiBGcmFnIG9yIExhc3QgRnJhZworCWNhc2UgREFUQURVUl9BOiAgICAvKiBEQVRBRFVSX0EgKi8KKwkJaWYgKCgodU1BQ2ZyYWdOdW0gPT0gMSkpIHx8IGJMYXN0RnJhZykgey8qIE5vbiBGcmFnIG9yIExhc3QgRnJhZyAqLwogCQkJaWYgKGJOZWVkQWNrKSB7CiAJCQkJdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCQkJcmV0dXJuIHBEZXZpY2UtPnVTSUZTICsgdUFja1RpbWU7CiAJCQl9IGVsc2UgewogCQkJCXJldHVybiAwOwogCQkJfQotCQl9IGVsc2Ugey8vRmlyc3QgRnJhZyBvciBNaWQgRnJhZworCQl9IGVsc2Ugey8qIEZpcnN0IEZyYWcgb3IgTWlkIEZyYWcgKi8KIAkJCWlmICh1RnJhZ0lkeCA9PSAodU1BQ2ZyYWdOdW0tMikpCiAJCQkJdU5leHRQa3RUaW1lID0gc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JMYXN0RnJhZ21lbnRTaXplLCB3UmF0ZSwgYk5lZWRBY2spOwogCQkJZWxzZQpAQCAtMzAxLDE1ICszMDEsMTUgQEAKIAkJfQogCQlicmVhazsKIAotCWNhc2UgREFUQURVUl9BX0YwOiAgICAvL0RBVEFEVVJfQV9GMAotCQlpZiAoKCh1TUFDZnJhZ051bSA9PSAxKSkgfHwgYkxhc3RGcmFnKSB7Ly9Ob24gRnJhZyBvciBMYXN0IEZyYWcKKwljYXNlIERBVEFEVVJfQV9GMDogICAgLyogREFUQURVUl9BX0YwICovCisJCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsvKiBOb24gRnJhZyBvciBMYXN0IEZyYWcgKi8KIAkJCWlmIChiTmVlZEFjaykgewogCQkJCXVBY2tUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDE0LCBwRGV2aWNlLT5ieVRvcE9GRE1CYXNpY1JhdGUpOwogCQkJCXJldHVybiBwRGV2aWNlLT51U0lGUyArIHVBY2tUaW1lOwogCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJfSBlbHNlIHsgLy9GaXJzdCBGcmFnIG9yIE1pZCBGcmFnCisJCX0gZWxzZSB7IC8qIEZpcnN0IEZyYWcgb3IgTWlkIEZyYWcgKi8KIAkJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfMCkgewogCQkJCWlmICh3UmF0ZSA8IFJBVEVfMThNKQogCQkJCQl3UmF0ZSA9IFJBVEVfMThNOwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJCQkJZWxzZQogCQkJCQl1TmV4dFBrdFRpbWUgPSBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMF1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CiAKLQkJCX0gZWxzZSB7IC8vIChieUZCT3B0aW9uID09IEFVVE9fRkJfMSkKKwkJCX0gZWxzZSB7IC8qIChieUZCT3B0aW9uID09IEFVVE9fRkJfMSkgKi8KIAkJCQlpZiAod1JhdGUgPCBSQVRFXzE4TSkKIAkJCQkJd1JhdGUgPSBSQVRFXzE4TTsKIAkJCQllbHNlIGlmICh3UmF0ZSA+IFJBVEVfNTRNKQpAQCAtMzQzLDE1ICszNDMsMTUgQEAKIAkJfQogCQlicmVhazsKIAotCWNhc2UgREFUQURVUl9BX0YxOiAgICAvL0RBVEFEVVJfQV9GMQotCQlpZiAoKCh1TUFDZnJhZ051bSA9PSAxKSkgfHwgYkxhc3RGcmFnKSB7Ly9Ob24gRnJhZyBvciBMYXN0IEZyYWcKKwljYXNlIERBVEFEVVJfQV9GMTogICAgLyogREFUQURVUl9BX0YxICovCisJCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsgLyogTm9uIEZyYWcgb3IgTGFzdCBGcmFnICovCiAJCQlpZiAoYk5lZWRBY2spIHsKIAkJCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKIAkJCQlyZXR1cm4gcERldmljZS0+dVNJRlMgKyB1QWNrVGltZTsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCX0gZWxzZSB7IC8vRmlyc3QgRnJhZyBvciBNaWQgRnJhZworCQl9IGVsc2UgeyAvKiBGaXJzdCBGcmFnIG9yIE1pZCBGcmFnICovCiAJCQlpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzApIHsKIAkJCQlpZiAod1JhdGUgPCBSQVRFXzE4TSkKIAkJCQkJd1JhdGUgPSBSQVRFXzE4TTsKQEAgLTM2Myw3ICszNjMsNyBAQAogCQkJCWVsc2UKIAkJCQkJdU5leHRQa3RUaW1lID0gc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTFdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwogCi0JCQl9IGVsc2UgeyAvLyAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzEpCisJCQl9IGVsc2UgeyAvKiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzEpICovCiAJCQkJaWYgKHdSYXRlIDwgUkFURV8xOE0pCiAJCQkJCXdSYXRlID0gUkFURV8xOE07CiAJCQkJZWxzZSBpZiAod1JhdGUgPiBSQVRFXzU0TSkKQEAgLTM5MSw3ICszOTEsNyBAQAogCXJldHVybiAwOwogfQogCi0vL2J5RnJlcVR5cGU6IDA9PjVHSFogMT0+Mi40R0haCisvKiBieUZyZXFUeXBlOiAwPT41R0haIDE9PjIuNEdIWiAqLwogc3RhdGljCiBfX2xlMTYKIHNfdUdldFJUU0NUU0R1cmF0aW9uKApAQCAtNDA3LDI2ICs0MDcsMjYgQEAKIAl1bnNpZ25lZCBpbnQgdUNUU1RpbWUgPSAwLCB1RHVyVGltZSA9IDA7CiAKIAlzd2l0Y2ggKGJ5RHVyVHlwZSkgewotCWNhc2UgUlRTRFVSX0JCOiAgICAvL1JUU0R1cmF0aW9uX2JiCisJY2FzZSBSVFNEVVJfQkI6ICAgIC8qIFJUU0R1cmF0aW9uX2JiICovCiAJCXVDVFNUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDE0LCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAJCXVEdXJUaW1lID0gdUNUU1RpbWUgKyAyKnBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd1JhdGUsIGJOZWVkQWNrKTsKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9CQTogICAgLy9SVFNEdXJhdGlvbl9iYQorCWNhc2UgUlRTRFVSX0JBOiAgICAvKiBSVFNEdXJhdGlvbl9iYSAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQl1RHVyVGltZSA9IHVDVFNUaW1lICsgMipwRGV2aWNlLT51U0lGUyArIHNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBieVBrdFR5cGUsIGNiRnJhbWVMZW5ndGgsIHdSYXRlLCBiTmVlZEFjayk7CiAJCWJyZWFrOwogCi0JY2FzZSBSVFNEVVJfQUE6ICAgIC8vUlRTRHVyYXRpb25fYWEKKwljYXNlIFJUU0RVUl9BQTogICAgLyogUlRTRHVyYXRpb25fYWEgKi8KIAkJdUNUU1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCXVEdXJUaW1lID0gdUNUU1RpbWUgKyAyKnBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd1JhdGUsIGJOZWVkQWNrKTsKIAkJYnJlYWs7CiAKLQljYXNlIENUU0RVUl9CQTogICAgLy9DVFNEdXJhdGlvbl9iYQorCWNhc2UgQ1RTRFVSX0JBOiAgICAvKiBDVFNEdXJhdGlvbl9iYSAqLwogCQl1RHVyVGltZSA9IHBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd1JhdGUsIGJOZWVkQWNrKTsKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9CQV9GMDogLy9SVFNEdXJhdGlvbl9iYV9mMAorCWNhc2UgUlRTRFVSX0JBX0YwOiAvKiBSVFNEdXJhdGlvbl9iYV9mMCAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQlpZiAoKGJ5RkJPcHRpb24gPT0gQVVUT19GQl8wKSAmJiAod1JhdGUgPj0gUkFURV8xOE0pICYmICh3UmF0ZSA8PSBSQVRFXzU0TSkpCiAJCQl1RHVyVGltZSA9IHVDVFNUaW1lICsgMiAqIHBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTBdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwpAQCAtNDM1LDcgKzQzNSw3IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9BQV9GMDogLy9SVFNEdXJhdGlvbl9hYV9mMAorCWNhc2UgUlRTRFVSX0FBX0YwOiAvKiBSVFNEdXJhdGlvbl9hYV9mMCAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKIAkJaWYgKChieUZCT3B0aW9uID09IEFVVE9fRkJfMCkgJiYgKHdSYXRlID49IFJBVEVfMThNKSAmJiAod1JhdGUgPD0gUkFURV81NE0pKQogCQkJdUR1clRpbWUgPSB1Q1RTVGltZSArIDIqcERldmljZS0+dVNJRlMgKyBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMF1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CkBAIC00NDQsNyArNDQ0LDcgQEAKIAogCQlicmVhazsKIAotCWNhc2UgUlRTRFVSX0JBX0YxOiAvL1JUU0R1cmF0aW9uX2JhX2YxCisJY2FzZSBSVFNEVVJfQkFfRjE6IC8qIFJUU0R1cmF0aW9uX2JhX2YxICovCiAJCXVDVFNUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDE0LCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAJCWlmICgoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzApICYmICh3UmF0ZSA+PSBSQVRFXzE4TSkgJiYgKHdSYXRlIDw9IFJBVEVfNTRNKSkKIAkJCXVEdXJUaW1lID0gdUNUU1RpbWUgKyAyKnBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTFdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9BQV9GMTogLy9SVFNEdXJhdGlvbl9hYV9mMQorCWNhc2UgUlRTRFVSX0FBX0YxOiAvKiBSVFNEdXJhdGlvbl9hYV9mMSAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKIAkJaWYgKChieUZCT3B0aW9uID09IEFVVE9fRkJfMCkgJiYgKHdSYXRlID49IFJBVEVfMThNKSAmJiAod1JhdGUgPD0gUkFURV81NE0pKQogCQkJdUR1clRpbWUgPSB1Q1RTVGltZSArIDIqcERldmljZS0+dVNJRlMgKyBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMV1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CkBAIC00NjIsNyArNDYyLDcgQEAKIAogCQlicmVhazsKIAotCWNhc2UgQ1RTRFVSX0JBX0YwOiAvL0NUU0R1cmF0aW9uX2JhX2YwCisJY2FzZSBDVFNEVVJfQkFfRjA6IC8qIENUU0R1cmF0aW9uX2JhX2YwICovCiAJCWlmICgoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzApICYmICh3UmF0ZSA+PSBSQVRFXzE4TSkgJiYgKHdSYXRlIDw9IFJBVEVfNTRNKSkKIAkJCXVEdXJUaW1lID0gcERldmljZS0+dVNJRlMgKyBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMF1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CiAJCWVsc2UgaWYgKChieUZCT3B0aW9uID09IEFVVE9fRkJfMSkgJiYgKHdSYXRlID49IFJBVEVfMThNKSAmJiAod1JhdGUgPD0gUkFURV81NE0pKQpAQCAtNDcwLDcgKzQ3MCw3IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIENUU0RVUl9CQV9GMTogLy9DVFNEdXJhdGlvbl9iYV9mMQorCWNhc2UgQ1RTRFVSX0JBX0YxOiAvKiBDVFNEdXJhdGlvbl9iYV9mMSAqLwogCQlpZiAoKGJ5RkJPcHRpb24gPT0gQVVUT19GQl8wKSAmJiAod1JhdGUgPj0gUkFURV8xOE0pICYmICh3UmF0ZSA8PSBSQVRFXzU0TSkpCiAJCQl1RHVyVGltZSA9IHBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTFdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwogCQllbHNlIGlmICgoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzEpICYmICh3UmF0ZSA+PSBSQVRFXzE4TSkgJiYgKHdSYXRlIDw9IFJBVEVfNTRNKSkKQEAgLTU2NSw3ICs1NjUsNyBAQAogCQkJYnVmLT50aW1lX3N0YW1wX29mZl9iID0gdm50X3RpbWVfc3RhbXBfb2ZmKHBEZXZpY2UsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAogCQkJcmV0dXJuIGJ1Zi0+ZHVyYXRpb25fYTsKLQkJfSAvL2lmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkKKwkJfSAvKiBpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCX05PTkUpICovCiAJfSBlbHNlIGlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUEpIHsKIAkJaWYgKChieUZCT3B0aW9uICE9IEFVVE9fRkJfTk9ORSkpIHsKIAkJCS8qIEF1dG8gRmFsbGJhY2sgKi8KQEAgLTY1MSwxMyArNjUxLDEzIEBACiAJCXJldHVybjsKIAogCWlmIChiRGlzQ1JDKSB7Ci0JCS8vIFdoZW4gQ1JDRElTIGJpdCBpcyBvbiwgSC9XIGZvcmdvdCB0byBnZW5lcmF0ZSBGQ1MgZm9yIFJUUyBmcmFtZSwKLQkJLy8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LgorCQkvKiBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvciBSVFMgZnJhbWUsCisJCSBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNyZWFzZSBpdHMgbGVuZ3RoIGJ5IDQuICovCiAJCXVSVFNGcmFtZUxlbiAtPSA0OwogCX0KIAotCS8vIE5vdGU6IFNvIGZhciBSVFNIZWFkIGRvc2VuJ3QgYXBwZWFyIGluIEFUSU0gJiBCZWFjb20gRE1BLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHRha2UgdGhlbSBpbnRvIGFjY291bnQuCi0JLy8gICAgICAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIG1vZGlmeSBjb2RlcyBmb3IgdGhlbS4KKwkvKiBOb3RlOiBTbyBmYXIgUlRTSGVhZCBkb3Nlbid0IGFwcGVhciBpbiBBVElNICYgQmVhY29tIERNQSwgc28gd2UgZG9uJ3QgbmVlZCB0byB0YWtlIHRoZW0gaW50byBhY2NvdW50LgorCSAgICAgICBPdGhlcndpc2UsIHdlIG5lZWQgdG8gbW9kaWZ5IGNvZGVzIGZvciB0aGVtLiAqLwogCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsKIAkJaWYgKGJ5RkJPcHRpb24gPT0gQVVUT19GQl9OT05FKSB7CiAJCQlzdHJ1Y3Qgdm50X3J0c19nICpidWYgPSBwdlJUUzsKQEAgLTc0OCw3ICs3NDgsNyBAQAogCiAJCQlldGhlcl9hZGRyX2NvcHkoYnVmLT5kYXRhLnJhLCBoZHItPmFkZHIxKTsKIAkJCWV0aGVyX2FkZHJfY29weShidWYtPmRhdGEudGEsIGhkci0+YWRkcjIpOwotCQl9IC8vIGlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkKKwkJfSAvKiBpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCX05PTkUpICovCiAJfSBlbHNlIGlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUEpIHsKIAkJaWYgKGJ5RkJPcHRpb24gPT0gQVVUT19GQl9OT05FKSB7CiAJCQlzdHJ1Y3Qgdm50X3J0c19hYiAqYnVmID0gcHZSVFM7CkBAIC04NDMsMTQgKzg0MywxNCBAQAogCQlyZXR1cm47CiAKIAlpZiAoYkRpc0NSQykgewotCQkvLyBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvciBDVFMgZnJhbWUsCi0JCS8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIGl0cyBsZW5ndGggYnkgNC4KKwkJLyogV2hlbiBDUkNESVMgYml0IGlzIG9uLCBIL1cgZm9yZ290IHRvIGdlbmVyYXRlIEZDUyBmb3IgQ1RTIGZyYW1lLAorCQkgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LiAqLwogCQl1Q1RTRnJhbWVMZW4gLT0gNDsKIAl9CiAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCWlmIChieUZCT3B0aW9uICE9IEFVVE9fRkJfTk9ORSAmJiB1RE1BSWR4ICE9IFRZUEVfQVRJTURNQSAmJiB1RE1BSWR4ICE9IFRZUEVfQkVBQ09ORE1BKSB7Ci0JCQkvLyBBdXRvIEZhbGwgYmFjaworCQkJLyogQXV0byBGYWxsIGJhY2sgKi8KIAkJCXN0cnVjdCB2bnRfY3RzX2ZiICpidWYgPSBwdkNUUzsKIAkJCS8qIEdldCBTaWduYWxGaWVsZCwgU2VydmljZUZpZWxkICYgTGVuZ3RoICovCiAJCQl2bnRfZ2V0X3BoeV9maWVsZChwRGV2aWNlLCB1Q1RTRnJhbWVMZW4sCkBAIC04ODgsNyArODg4LDcgQEAKIAogCQkJZXRoZXJfYWRkcl9jb3B5KGJ1Zi0+ZGF0YS5yYSwKIAkJCQkJcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIpOwotCQl9IGVsc2UgeyAvL2lmIChieUZCT3B0aW9uICE9IEFVVE9fRkJfTk9ORSAmJiB1RE1BSWR4ICE9IFRZUEVfQVRJTURNQSAmJiB1RE1BSWR4ICE9IFRZUEVfQkVBQ09ORE1BKQorCQl9IGVsc2UgeyAvKiBpZiAoYnlGQk9wdGlvbiAhPSBBVVRPX0ZCX05PTkUgJiYgdURNQUlkeCAhPSBUWVBFX0FUSU1ETUEgJiYgdURNQUlkeCAhPSBUWVBFX0JFQUNPTkRNQSkgKi8KIAkJCXN0cnVjdCB2bnRfY3RzICpidWYgPSBwdkNUUzsKIAkJCS8qIEdldCBTaWduYWxGaWVsZCwgU2VydmljZUZpZWxkICYgTGVuZ3RoICovCiAJCQl2bnRfZ2V0X3BoeV9maWVsZChwRGV2aWNlLCB1Q1RTRnJhbWVMZW4sCkBAIC05MzcsMTQgKzkzNywxNCBAQAogICoKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKLSAtKi8KLS8vIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwvL0hkcitQYXlsb2FkK0ZDUworIC0KKyAqIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwgSGRyK1BheWxvYWQrRkNTICovCiBzdGF0aWMKIHZvaWQKIHNfdkdlbmVyYXRlVHhQYXJhbWV0ZXIoCiAJc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAogCXVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLAotCXZvaWQgKnBUeEJ1ZkhlYWQsCisJc3RydWN0IHZudF90eF9maWZvX2hlYWQgKnR4X2J1ZmZlcl9oZWFkLAogCXZvaWQgKnB2UnJ2VGltZSwKIAl2b2lkICpwdlJUUywKIAl2b2lkICpwdkNUUywKQEAgLTk1NSwyOSArOTU1LDI2IEBACiAJdW5zaWduZWQgc2hvcnQgd0N1cnJlbnRSYXRlCiApCiB7Ci0JdW5zaWduZWQgc2hvcnQgd0ZpZm9DdGw7CisJdTE2IGZpZm9fY3RsID0gbGUxNl90b19jcHUodHhfYnVmZmVyX2hlYWQtPmZpZm9fY3RsKTsKIAlib29sIGJEaXNDUkMgPSBmYWxzZTsKIAl1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24gPSBBVVRPX0ZCX05PTkU7CiAKLQlQU1R4QnVmSGVhZCBwRmlmb0hlYWQgPSAoUFNUeEJ1ZkhlYWQpcFR4QnVmSGVhZDsKKwl0eF9idWZmZXJfaGVhZC0+Y3VycmVudF9yYXRlID0gY3B1X3RvX2xlMTYod0N1cnJlbnRSYXRlKTsKIAotCXBGaWZvSGVhZC0+d1Jlc2VydmVkID0gd0N1cnJlbnRSYXRlOwotCXdGaWZvQ3RsID0gcEZpZm9IZWFkLT53RklGT0N0bDsKLQotCWlmICh3Rmlmb0N0bCAmIEZJRk9DVExfQ1JDRElTKQorCWlmIChmaWZvX2N0bCAmIEZJRk9DVExfQ1JDRElTKQogCQliRGlzQ1JDID0gdHJ1ZTsKIAotCWlmICh3Rmlmb0N0bCAmIEZJRk9DVExfQVVUT19GQl8wKQorCWlmIChmaWZvX2N0bCAmIEZJRk9DVExfQVVUT19GQl8wKQogCQlieUZCT3B0aW9uID0gQVVUT19GQl8wOwotCWVsc2UgaWYgKHdGaWZvQ3RsICYgRklGT0NUTF9BVVRPX0ZCXzEpCisJZWxzZSBpZiAoZmlmb19jdGwgJiBGSUZPQ1RMX0FVVE9fRkJfMSkKIAkJYnlGQk9wdGlvbiA9IEFVVE9fRkJfMTsKIAogCWlmICghcHZScnZUaW1lKQogCQlyZXR1cm47CiAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7Ci0JCWlmIChwdlJUUyAhPSBOVUxMKSB7IC8vUlRTX25lZWQKLQkJCS8qIEZpbGwgUnN2VGltZSAqLworCQlpZiAocHZSVFMgIT0gTlVMTCkgeyAvKiBSVFNfbmVlZAorCQkJIEZpbGwgUnN2VGltZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9ydHMgKmJ1ZiA9IHB2UnJ2VGltZTsKIAogCQkJYnVmLT5ydHNfcnJ2X3RpbWVfYWEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CkBAIC05ODcsNDAgKzk4NCw0MCBAQAogCQkJYnVmLT5ycnZfdGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKTsKIAogCQkJc192RmlsbFJUU0hlYWQocERldmljZSwgYnlQa3RUeXBlLCBwdlJUUywgY2JGcmFtZVNpemUsIGJOZWVkQUNLLCBiRGlzQ1JDLCBwc0V0aEhlYWRlciwgd0N1cnJlbnRSYXRlLCBieUZCT3B0aW9uKTsKLQkJfSBlbHNlIHsvL1JUU19uZWVkbGVzcywgUENGIG1vZGUKKwkJfSBlbHNlIHsvKiBSVFNfbmVlZGxlc3MsIFBDRiBtb2RlICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2N0cyAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJydl90aW1lX2EgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CiAJCQlidWYtPnJydl90aW1lX2IgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwgUEtfVFlQRV8xMUIsIGNiRnJhbWVTaXplLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwgYk5lZWRBQ0spOwogCQkJYnVmLT5jdHNfcnJ2X3RpbWVfYmEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDMsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAKLQkJCS8vRmlsbCBDVFMKKwkJCS8qIEZpbGwgQ1RTICovCiAJCQlzX3ZGaWxsQ1RTSGVhZChwRGV2aWNlLCB1RE1BSWR4LCBieVBrdFR5cGUsIHB2Q1RTLCBjYkZyYW1lU2l6ZSwgYk5lZWRBQ0ssIGJEaXNDUkMsIHdDdXJyZW50UmF0ZSwgYnlGQk9wdGlvbik7CiAJCX0KIAl9IGVsc2UgaWYgKGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExQSkgewotCQlpZiAocHZSVFMgIT0gTlVMTCkgey8vUlRTX25lZWQsIG5vbiBQQ0YgbW9kZQorCQlpZiAocHZSVFMgIT0gTlVMTCkgey8qIFJUU19uZWVkLCBub24gUENGIG1vZGUgKi8KIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIgKmJ1ZiA9IHB2UnJ2VGltZTsKIAogCQkJYnVmLT5ydHNfcnJ2X3RpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAJCQlidWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCi0JCQkvL0ZpbGwgUlRTCisJCQkvKiBGaWxsIFJUUyAqLwogCQkJc192RmlsbFJUU0hlYWQocERldmljZSwgYnlQa3RUeXBlLCBwdlJUUywgY2JGcmFtZVNpemUsIGJOZWVkQUNLLCBiRGlzQ1JDLCBwc0V0aEhlYWRlciwgd0N1cnJlbnRSYXRlLCBieUZCT3B0aW9uKTsKLQkJfSBlbHNlIGlmIChwdlJUUyA9PSBOVUxMKSB7Ly9SVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZQorCQl9IGVsc2UgaWYgKHB2UlRTID09IE5VTEwpIHsvKiBSVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIFBLX1RZUEVfMTFBLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CiAJCX0KIAl9IGVsc2UgaWYgKGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExQikgewotCQlpZiAoKHB2UlRTICE9IE5VTEwpKSB7Ly9SVFNfbmVlZCwgbm9uIFBDRiBtb2RlCisJCWlmICgocHZSVFMgIT0gTlVMTCkpIHsvKiBSVFNfbmVlZCwgbm9uIFBDRiBtb2RlICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpidWYgPSBwdlJydlRpbWU7CiAKIAkJCWJ1Zi0+cnRzX3Jydl90aW1lID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpOwogCQkJYnVmLT5ycnZfdGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLCBQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCi0JCQkvL0ZpbGwgUlRTCisJCQkvKiBGaWxsIFJUUyAqLwogCQkJc192RmlsbFJUU0hlYWQocERldmljZSwgYnlQa3RUeXBlLCBwdlJUUywgY2JGcmFtZVNpemUsIGJOZWVkQUNLLCBiRGlzQ1JDLCBwc0V0aEhlYWRlciwgd0N1cnJlbnRSYXRlLCBieUZCT3B0aW9uKTsKLQkJfSBlbHNlIHsgLy9SVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZQorCQl9IGVsc2UgeyAvKiBSVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CkBAIC0xMDU4LDcgKzEwNTUsNyBAQAogCXZvaWQgKnB2UlRTOwogCXZvaWQgKnB2Q1RTOwogCXZvaWQgKnB2VHhEYXRhSGQ7Ci0JdW5zaWduZWQgc2hvcnQgd1R4QnVmU2l6ZTsgICAvLyBGRmluZm8gc2l6ZQorCXVuc2lnbmVkIHNob3J0IHdUeEJ1ZlNpemU7ICAgLyogRkZpbmZvIHNpemUgKi8KIAl1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24gPSBBVVRPX0ZCX05PTkU7CiAKIAlwdlJydlRpbWUgPSBwTUlDSERSID0gcHZSVFMgPSBwdkNUUyA9IHB2VHhEYXRhSGQgPSBOVUxMOwpAQCAtMTA3NiwyNyArMTA3MywyNyBAQAogCQljYkZyYW1lU2l6ZSArPSBpbmZvLT5jb250cm9sLmh3X2tleS0+aWN2X2xlbjsKIAogCQlpZiAocERldmljZS0+YnlMb2NhbElEID4gUkVWX0lEX1ZUMzI1M19BMSkgewotCQkJLy9NQUMgSGVhZGVyIHNob3VsZCBiZSBwYWRkaW5nIDAgdG8gRFcgYWxpZ25tZW50LgorCQkJLyogTUFDIEhlYWRlciBzaG91bGQgYmUgcGFkZGluZyAwIHRvIERXIGFsaWdubWVudC4gKi8KIAkJCXVQYWRkaW5nID0gNCAtIChpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpICUgNCk7CiAJCQl1UGFkZGluZyAlPSA0OwogCQl9CiAJfQogCi0JLy8KLQkvLyBVc2UgZm9yIEFVVE8gRkFMTCBCQUNLCi0JLy8KKwkvKgorCSogVXNlIGZvciBBVVRPIEZBTEwgQkFDSworCSovCiAJaWYgKGZpZm9fY3RsICYgRklGT0NUTF9BVVRPX0ZCXzApCiAJCWJ5RkJPcHRpb24gPSBBVVRPX0ZCXzA7CiAJZWxzZSBpZiAoZmlmb19jdGwgJiBGSUZPQ1RMX0FVVE9fRkJfMSkKIAkJYnlGQk9wdGlvbiA9IEFVVE9fRkJfMTsKIAotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vU2V0IFJydlRpbWUvUlRTL0NUUyBCdWZmZXIKKworCS8qIFNldCBScnZUaW1lL1JUUy9DVFMgQnVmZmVyICovCiAJd1R4QnVmU2l6ZSA9IHNpemVvZihTVHhCdWZIZWFkKTsKLQlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7Ly84MDIuMTFnIHBhY2tldAorCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsvKiA4MDIuMTFnIHBhY2tldCAqLwogCiAJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkgewotCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgey8vUlRTX25lZWQKKwkJCWlmIChiUlRTID09IHRydWUpIHsvKiBSVFNfbmVlZCAqLwogCQkJCXB2UnJ2VGltZSA9ICh2b2lkICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUpOwogCQkJCXBNSUNIRFIgPSAoc3RydWN0IHZudF9taWNfaGRyICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpKTsKIAkJCQlwdlJUUyA9ICh2b2lkICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpICsgY2JNSUNIRFIpOwpAQCAtMTEwNiw3ICsxMTAzLDcgQEAKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpICsKIAkJCQkJCQljYk1JQ0hEUiArIHNpemVvZihzdHJ1Y3Qgdm50X3J0c19nKSArCiAJCQkJCQkJc2l6ZW9mKHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyk7Ci0JCQl9IGVsc2UgeyAvL1JUU19uZWVkbGVzcworCQkJfSBlbHNlIHsgLyogUlRTX25lZWRsZXNzICovCiAJCQkJcHZScnZUaW1lID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSk7CiAJCQkJcE1JQ0hEUiA9IChzdHJ1Y3Qgdm50X21pY19oZHIgKikgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9jdHMpKTsKIAkJCQlwdlJUUyA9IE5VTEw7CkBAIC0xMTE3LDggKzExMTQsOCBAQAogCQkJCQkJCWNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfY3RzKSArIHNpemVvZihzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2cpOwogCQkJfQogCQl9IGVsc2UgewotCQkJLy8gQXV0byBGYWxsIEJhY2sKLQkJCWlmIChiUlRTID09IHRydWUpIHsvL1JUU19uZWVkCisJCQkvKiBBdXRvIEZhbGwgQmFjayAqLworCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgey8qIFJUU19uZWVkICovCiAJCQkJcHZScnZUaW1lID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSk7CiAJCQkJcE1JQ0hEUiA9IChzdHJ1Y3Qgdm50X21pY19oZHIgKikgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpKTsKIAkJCQlwdlJUUyA9ICh2b2lkICopIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfcnRzKSArIGNiTUlDSERSKTsKQEAgLTExMjcsNyArMTEyNCw3IEBACiAJCQkJCWNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnRzX2dfZmIpKTsKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpICsKIAkJCQkJY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF9ydHNfZ19mYikgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9nX2ZiKTsKLQkJCX0gZWxzZSB7IC8vUlRTX25lZWRsZXNzCisJCQl9IGVsc2UgeyAvKiBSVFNfbmVlZGxlc3MgKi8KIAkJCQlwdlJydlRpbWUgPSAodm9pZCAqKShwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplKTsKIAkJCQlwTUlDSERSID0gKHN0cnVjdCB2bnRfbWljX2hkciAqKSAocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSArIHNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2N0cykpOwogCQkJCXB2UlRTID0gTlVMTDsKQEAgLTExMzcsOCArMTEzNCw4IEBACiAJCQkJY2JIZWFkZXJMZW5ndGggPSB3VHhCdWZTaXplICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfY3RzKSArCiAJCQkJCWNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfY3RzX2ZiKSArIHNpemVvZihzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2dfZmIpOwogCQkJfQotCQl9IC8vIEF1dG8gRmFsbCBCYWNrCi0JfSBlbHNlIHsvLzgwMi4xMWEvYiBwYWNrZXQKKwkJfSAvKiBBdXRvIEZhbGwgQmFjayAqLworCX0gZWxzZSB7LyogODAyLjExYS9iIHBhY2tldCAqLwogCiAJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkgewogCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgewpAQCAtMTE1MCw3ICsxMTQ3LDcgQEAKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIpICsgY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF9ydHNfYWIpKTsKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikgKwogCQkJCQljYk1JQ0hEUiArIHNpemVvZihzdHJ1Y3Qgdm50X3J0c19hYikgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9hYik7Ci0JCQl9IGVsc2UgeyAvL1JUU19uZWVkbGVzcywgbmVlZCBNSUNIRFIKKwkJCX0gZWxzZSB7IC8qIFJUU19uZWVkbGVzcywgbmVlZCBNSUNIRFIgKi8KIAkJCQlwdlJydlRpbWUgPSAodm9pZCAqKShwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplKTsKIAkJCQlwTUlDSERSID0gKHN0cnVjdCB2bnRfbWljX2hkciAqKSAocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSArIHNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiKSk7CiAJCQkJcHZSVFMgPSBOVUxMOwpAQCAtMTE2MCw4ICsxMTU3LDggQEAKIAkJCQkJY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9hYik7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQkvLyBBdXRvIEZhbGwgQmFjawotCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgey8vUlRTX25lZWQKKwkJCS8qIEF1dG8gRmFsbCBCYWNrICovCisJCQlpZiAoYlJUUyA9PSB0cnVlKSB7IC8qIFJUU19uZWVkICovCiAJCQkJcHZScnZUaW1lID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSk7CiAJCQkJcE1JQ0hEUiA9IChzdHJ1Y3Qgdm50X21pY19oZHIgKikgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikpOwogCQkJCXB2UlRTID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSArIHNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiKSArIGNiTUlDSERSKTsKQEAgLTExNzAsNyArMTE2Nyw3IEBACiAJCQkJCXNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiKSArIGNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnRzX2FfZmIpKTsKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikgKwogCQkJCQljYk1JQ0hEUiArIHNpemVvZihzdHJ1Y3Qgdm50X3J0c19hX2ZiKSArIHNpemVvZihzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FfZmIpOwotCQkJfSBlbHNlIHsgLy9SVFNfbmVlZGxlc3MKKwkJCX0gZWxzZSB7IC8qIFJUU19uZWVkbGVzcyAqLwogCQkJCXB2UnJ2VGltZSA9ICh2b2lkICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUpOwogCQkJCXBNSUNIRFIgPSAoc3RydWN0IHZudF9taWNfaGRyICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikpOwogCQkJCXB2UlRTID0gTlVMTDsKQEAgLTExNzksNyArMTE3Niw3IEBACiAJCQkJY2JIZWFkZXJMZW5ndGggPSB3VHhCdWZTaXplICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIpICsKIAkJCQkJY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9hX2ZiKTsKIAkJCX0KLQkJfSAvLyBBdXRvIEZhbGwgQmFjaworCQl9IC8qIEF1dG8gRmFsbCBCYWNrICovCiAJfQogCiAJdGRfaW5mby0+bWljX2hkciA9IHBNSUNIRFI7CkBAIC0xMzA4LDEwICsxMzA1LDE4IEBACiAJCQkgICAgcHJpdi0+aHctPmNvbmYuY2hhbmRlZi5jaGFuLT5od192YWx1ZSk7CiAJfQogCi0JaWYgKGN1cnJlbnRfcmF0ZSA+IFJBVEVfMTFNKQotCQlwa3RfdHlwZSA9ICh1OClwcml2LT5ieVBhY2tldFR5cGU7Ci0JZWxzZQorCWlmIChjdXJyZW50X3JhdGUgPiBSQVRFXzExTSkgeworCQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQlwa3RfdHlwZSA9IFBLX1RZUEVfMTFBOworCQl9IGVsc2UgeworCQkJaWYgKHR4X3JhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkKKwkJCQlwa3RfdHlwZSA9IFBLX1RZUEVfMTFHQjsKKwkJCWVsc2UKKwkJCQlwa3RfdHlwZSA9IFBLX1RZUEVfMTFHQTsKKwkJfQorCX0gZWxzZSB7CiAJCXBrdF90eXBlID0gUEtfVFlQRV8xMUI7CisJfQogCiAJLypTZXQgZmlmbyBjb250cm9scyAqLwogCWlmIChwa3RfdHlwZSA9PSBQS19UWVBFXzExQSkKQEAgLTE1MDUsOCArMTUxMCw2IEBACiBpbnQgdm50X2JlYWNvbl9lbmFibGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpjb25mKQogewotCWludCByZXQ7Ci0KIAlWTlN2T3V0UG9ydEIocHJpdi0+UG9ydE9mZnNldCArIE1BQ19SRUdfVEZUQ1RMLCBURlRDVExfVFNGQ05UUlNUKTsKIAogCVZOU3ZPdXRQb3J0Qihwcml2LT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19URlRDVEwsIFRGVENUTF9UU0ZDTlRSRU4pOwpAQCAtMTUxNSw3ICsxNTE4LDUgQEAKIAogCUNBUkRiU2V0QmVhY29uUGVyaW9kKHByaXYsIGNvbmYtPmJlYWNvbl9pbnQpOwogCi0JcmV0ID0gdm50X2JlYWNvbl9tYWtlKHByaXYsIHZpZik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB2bnRfYmVhY29uX21ha2UocHJpdiwgdmlmKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9zcm9tLmgKaW5kZXggN2QzZTNlZi4uNTMxYmYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9zcm9tLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9zcm9tLmgKQEAgLTI0LDcgKzI0LDYgQEAKICAqIEF1dGhvcjogSmVycnkgQ2hlbgogICoKICAqIERhdGU6IEphbiAyOSwgMjAwMwotICoKICAqLwogCiAjaWZuZGVmIF9fU1JPTV9IX18KQEAgLTM0LDU2ICszMyw1MCBAQAogCiAjZGVmaW5lIEVFUF9NQVhfQ09OVEVYVF9TSVpFICAgIDI1NgogCi0jZGVmaW5lIENCX0VFUFJPTV9SRUFEQllURV9XQUlUIDkwMCAgICAgLy91cworI2RlZmluZSBDQl9FRVBST01fUkVBREJZVEVfV0FJVCA5MDAgICAgIC8qIHVzICovCiAKICNkZWZpbmUgV19NQVhfSTJDUkVUUlkgICAgICAgICAgMHgwZmZmCiAKLS8vCi0vLyBDb250ZW50cyBpbiB0aGUgRUVQUk9NCi0vLwotI2RlZmluZSBFRVBfT0ZTX1BBUiAgICAgICAgIDB4MDAgICAgICAgIC8vIHBoeXNpY2FsIGFkZHJlc3MKKy8qIENvbnRlbnRzIGluIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQX09GU19QQVIgICAgICAgICAweDAwICAgICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzICovCiAjZGVmaW5lIEVFUF9PRlNfQU5URU5OQSAgICAgMHgxNgogI2RlZmluZSBFRVBfT0ZTX1JBRElPQ1RMICAgIDB4MTcKLSNkZWZpbmUgRUVQX09GU19SRlRZUEUgICAgICAweDFCICAgICAgICAvLyBmb3Igc2VsZWN0IFJGCi0jZGVmaW5lIEVFUF9PRlNfTUlOQ0hBTk5FTCAgMHgxQyAgICAgICAgLy8gTWluIENoYW5uZWwgIwotI2RlZmluZSBFRVBfT0ZTX01BWENIQU5ORUwgIDB4MUQgICAgICAgIC8vIE1heCBDaGFubmVsICMKLSNkZWZpbmUgRUVQX09GU19TSUdOQVRVUkUgICAweDFFICAgICAgICAvLwotI2RlZmluZSBFRVBfT0ZTX1pPTkVUWVBFICAgIDB4MUYgICAgICAgIC8vCi0jZGVmaW5lIEVFUF9PRlNfUkZUQUJMRSAgICAgMHgyMCAgICAgICAgLy8gUkYgUE9XRVIgVEFCTEUKKyNkZWZpbmUgRUVQX09GU19SRlRZUEUgICAgICAweDFCICAgICAgICAvKiBmb3Igc2VsZWN0IFJGICovCisjZGVmaW5lIEVFUF9PRlNfTUlOQ0hBTk5FTCAgMHgxQyAgICAgICAgLyogTWluIENoYW5uZWwgIyAqLworI2RlZmluZSBFRVBfT0ZTX01BWENIQU5ORUwgIDB4MUQgICAgICAgIC8qIE1heCBDaGFubmVsICMgKi8KKyNkZWZpbmUgRUVQX09GU19TSUdOQVRVUkUgICAweDFFCisjZGVmaW5lIEVFUF9PRlNfWk9ORVRZUEUgICAgMHgxRgorI2RlZmluZSBFRVBfT0ZTX1JGVEFCTEUgICAgIDB4MjAgICAgICAgIC8qIFJGIFBPV0VSIFRBQkxFICovCiAjZGVmaW5lIEVFUF9PRlNfUFdSX0NDSyAgICAgMHgyMAogI2RlZmluZSBFRVBfT0ZTX1NFVFBUX0NDSyAgIDB4MjEKICNkZWZpbmUgRUVQX09GU19QV1JfT0ZETUcgICAweDIzCiAjZGVmaW5lIEVFUF9PRlNfU0VUUFRfT0ZETUcgMHgyNAotI2RlZmluZSBFRVBfT0ZTX1BXUl9GT1JNVUxBX09TVCAgMHgyNiAgIC8vCisjZGVmaW5lIEVFUF9PRlNfUFdSX0ZPUk1VTEFfT1NUICAweDI2CiAjZGVmaW5lIEVFUF9PRlNfTUFKT1JfVkVSIDB4MkUKICNkZWZpbmUgRUVQX09GU19NSU5PUl9WRVIgMHgyRgogI2RlZmluZSBFRVBfT0ZTX0NDS19QV1JfVEJMICAgICAweDMwCiAjZGVmaW5lIEVFUF9PRlNfQ0NLX1BXUl9kQm0gICAgIDB4M0YKICNkZWZpbmUgRUVQX09GU19PRkRNX1BXUl9UQkwgICAgMHg0MAogI2RlZmluZSBFRVBfT0ZTX09GRE1fUFdSX2RCbSAgICAweDRGCi0vL3t7IFJvYmVydFl1OiAyMDA0MTEyNAorLyp7eyBSb2JlcnRZdTogMjAwNDExMjQgKi8KICNkZWZpbmUgRUVQX09GU19TRVRQVF9PRkRNQSAgICAgICAgIDB4NEUKICNkZWZpbmUgRUVQX09GU19PRkRNQV9QV1JfVEJMICAgICAgIDB4NTAKLS8vfX0KKy8qfX0qLwogI2RlZmluZSBFRVBfT0ZTX09GRE1BX1BXUl9kQm0gICAgICAgMHhEMgogCi0vLy0tLS0tLS0tLS1uZWVkIHRvIHJlbW92ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLQotI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0xFTiAgIDB4NzAgICAgICAgIC8vIEJCIFRhYmxlIExlbmd0aAotI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0FEUiAgIDB4NzEgICAgICAgIC8vIEJCIFRhYmxlIE9mZnNldAotI2RlZmluZSBFRVBfT0ZTX0NIRUNLU1VNICAgIDB4RkYgICAgICAgIC8vIHJlc2VydmVkIGFyZWEgZm9yIGJhc2ViYW5kIDI4aCB+IDc4aAorLyotLS0tLS0tLS0tbmVlZCB0byByZW1vdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0xFTiAgIDB4NzAgICAgICAgIC8qIEJCIFRhYmxlIExlbmd0aCAqLworI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0FEUiAgIDB4NzEgICAgICAgIC8qIEJCIFRhYmxlIE9mZnNldCAqLworI2RlZmluZSBFRVBfT0ZTX0NIRUNLU1VNICAgIDB4RkYgICAgICAgIC8qIHJlc2VydmVkIGFyZWEgZm9yIGJhc2ViYW5kIDI4aH43OGggKi8KIAotI2RlZmluZSBFRVBfSTJDX0RFVl9JRCAgICAgIDB4NTAgICAgICAgIC8vIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyBvbiB0aGUgSTJDIGJ1cworI2RlZmluZSBFRVBfSTJDX0RFVl9JRCAgICAgIDB4NTAgICAgICAgIC8qIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyBvbiBJMkMgYnVzICovCiAKLS8vCi0vLyBCaXRzIGluIEVFUF9PRlNfQU5URU5OQQotLy8KKy8qIEJpdHMgaW4gRUVQX09GU19BTlRFTk5BICovCiAjZGVmaW5lIEVFUF9BTlRFTk5BX01BSU4gICAgMHgwMQogI2RlZmluZSBFRVBfQU5URU5OQV9BVVggICAgIDB4MDIKICNkZWZpbmUgRUVQX0FOVElOViAgICAgICAgICAweDA0CiAKLS8vCi0vLyBCaXRzIGluIEVFUF9PRlNfUkFESU9DVEwKLS8vCisvKiBCaXRzIGluIEVFUF9PRlNfUkFESU9DVEwgKi8KICNkZWZpbmUgRUVQX1JBRElPQ1RMX0VOQUJMRSAweDgwCiAjZGVmaW5lIEVFUF9SQURJT0NUTF9JTlYgICAgMHgwMQogCkBAIC05NywxMCArOTAsMTIgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdW5zaWduZWQgY2hhciBTUk9NYnlSZWFkRW1iZWRkZWQodm9pZCBfX2lvbWVtICpkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCk7Cit1bnNpZ25lZCBjaGFyIFNST01ieVJlYWRFbWJlZGRlZCh2b2lkIF9faW9tZW0gKmR3SW9CYXNlLAorCQkJCSB1bnNpZ25lZCBjaGFyIGJ5Q29udG50T2Zmc2V0KTsKIAogdm9pZCBTUk9NdlJlYWRBbGxDb250ZW50cyh2b2lkIF9faW9tZW0gKmR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlFZXByb21SZWdzKTsKIAotdm9pZCBTUk9NdlJlYWRFdGhlckFkZHJlc3Modm9pZCBfX2lvbWVtICpkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RXRoZXJBZGRyZXNzKTsKK3ZvaWQgU1JPTXZSZWFkRXRoZXJBZGRyZXNzKHZvaWQgX19pb21lbSAqZHdJb0Jhc2UsCisJCQkgICB1bnNpZ25lZCBjaGFyICpwYnlFdGhlckFkZHJlc3MpOwogCi0jZW5kaWYgLy8gX19FRVBST01fSF9fCisjZW5kaWYgLyogX19FRVBST01fSF9fKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdG1hY3JvLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RtYWNyby5oCmluZGV4IDYwN2I3OGYuLjU5N2VmZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdG1hY3JvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90bWFjcm8uaApAQCAtNTUsNCArNTUsNCBAQAogI2RlZmluZSBNQUtFRFdPUkQobHcsIGh3KSAgICgodW5zaWduZWQgbG9uZykoKCh1bnNpZ25lZCBzaG9ydCkobHcpKSB8ICgoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBzaG9ydCkoaHcpKSkgPDwgMTYpKSkKICNlbmRpZgogCi0jZW5kaWYgLy8gX19UTUFDUk9fSF9fCisjZW5kaWYgLyogX19UTUFDUk9fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMKaW5kZXggYTE3NzY0NS4uZDQ0MGYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9maXJtd2FyZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZmlybXdhcmUuYwpAQCAtNjEsNyArNjEsNyBAQAogCiAJYnVmZmVyID0ga21hbGxvYyhGSVJNV0FSRV9DSFVOS19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikKLQkJZ290byBvdXQ7CisJCWdvdG8gZnJlZV9mdzsKIAogCWZvciAoaWkgPSAwOyBpaSA8IGZ3LT5zaXplOyBpaSArPSBGSVJNV0FSRV9DSFVOS19TSVpFKSB7CiAJCWxlbmd0aCA9IG1pbl90KGludCwgZnctPnNpemUgLSBpaSwgRklSTVdBUkVfQ0hVTktfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuYwppbmRleCBiYjM3ZTMzLi41ZGZhYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMKQEAgLTMwLDYgKzMwLDggQEAKICAqIFJldmlzaW9uIEhpc3Rvcnk6CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKICNpbmNsdWRlICJkZXNjLmgiCiAjaW5jbHVkZSAibWFjLmgiCiAjaW5jbHVkZSAidXNicGlwZS5oIgpAQCAtMTI2LDcgKzEyOCw3IEBACiAJb2Zmc2V0ICs9IChlbnRyeV9pZHggKiBNSVNDRklGT19LRVlFTlRSWVNJWkUpOwogCiAJc2V0X2tleS51LndyaXRlLmtleV9jdGwgPSBjcHVfdG9fbGUxNihrZXlfY3RsKTsKLQltZW1jcHkoc2V0X2tleS51LndyaXRlLmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoc2V0X2tleS51LndyaXRlLmFkZHIsIGFkZHIpOwogCiAJLyogc3dhcCBvdmVyIHN3YXBbMF0gYW5kIHN3YXBbMV0gdG8gZ2V0IGNvcnJlY3Qgd3JpdGUgb3JkZXIgKi8KIAlzd2FwKHNldF9rZXkudS5zd2FwWzBdLCBzZXRfa2V5LnUuc3dhcFsxXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggNzFhZGMxZi4uYWIzYWI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtOTYzLDYgKzk2Myw3IEBACiAJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCB2bnRfcHJpdmF0ZSksICZ2bnRfbWFjX29wcyk7CiAJaWYgKCFodykgewogCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgaWVlZTgwMjExX2h3XG4iKTsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9ub21lbTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKaW5kZXggMzNiYWYyNi4uZjZjMmNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMKQEAgLTc1NSw5ICs3NTUsOSBAQAogCQllbHNlCiAJCQltaWNfaGRyLT5obGVuID0gY3B1X3RvX2JlMTYoMjIpOwogCi0JCW1lbWNweShtaWNfaGRyLT5hZGRyMSwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOwotCQltZW1jcHkobWljX2hkci0+YWRkcjIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KG1pY19oZHItPmFkZHIzLCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShtaWNfaGRyLT5hZGRyMSwgaGRyLT5hZGRyMSk7CisJCWV0aGVyX2FkZHJfY29weShtaWNfaGRyLT5hZGRyMiwgaGRyLT5hZGRyMik7CisJCWV0aGVyX2FkZHJfY29weShtaWNfaGRyLT5hZGRyMywgaGRyLT5hZGRyMyk7CiAKIAkJbWljX2hkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KAogCQkJbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmIDB4Yzc4Zik7CkBAIC03NjUsNyArNzY1LDcgQEAKIAkJCQlsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4Zik7CiAKIAkJaWYgKGllZWU4MDIxMV9oYXNfYTQoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCW1lbWNweShtaWNfaGRyLT5hZGRyNCwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCQkJZXRoZXJfYWRkcl9jb3B5KG1pY19oZHItPmFkZHI0LCBoZHItPmFkZHI0KTsKIAogCiAJCW1lbWNweShrZXlfYnVmZmVyLCB0eF9rZXktPmtleSwgV0xBTl9LRVlfTEVOX0NDTVApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCmluZGV4IDhmMjA5MTAuLjhkZmU0MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKQEAgLTEyMDQsMTkgKzEyMDQsMTkgQEAKICNkZWZpbmUgV0xBTl9BQ0NFU1NfREVOWQkzICAgLyogRG8gbm90IGF1dGhlbnRpY2F0ZSAiZGVuaWVkIiBzdGF0aW9ucy4gKi8KIAogLyogWFhYIFRoZXNlIGFyZSBnb2luZyBhd2F5IEFTQVAgKi8KLXR5cGVkZWYgc3RydWN0IHByaXNtMnN0YV9hdXRobGlzdCB7CitzdHJ1Y3QgcHJpc20yc3RhX2F1dGhsaXN0IHsKIAl1bnNpZ25lZCBpbnQgY250OwogCXU4IGFkZHJbV0xBTl9BVVRIX01BWF1bRVRIX0FMRU5dOwogCXU4IGFzc29jW1dMQU5fQVVUSF9NQVhdOwotfSBwcmlzbTJzdGFfYXV0aGxpc3RfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHByaXNtMnN0YV9hY2Nlc3NsaXN0IHsKK3N0cnVjdCBwcmlzbTJzdGFfYWNjZXNzbGlzdCB7CiAJdW5zaWduZWQgaW50IG1vZGlmeTsKIAl1bnNpZ25lZCBpbnQgY250OwogCXU4IGFkZHJbV0xBTl9BQ0NFU1NfTUFYXVtFVEhfQUxFTl07CiAJdW5zaWduZWQgaW50IGNudDE7CiAJdTggYWRkcjFbV0xBTl9BQ0NFU1NfTUFYXVtFVEhfQUxFTl07Ci19IHByaXNtMnN0YV9hY2Nlc3NsaXN0X3Q7Cit9OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4IHsKIAkvKiBVU0Igc3VwcG9ydCBkYXRhICovCkBAIC0xMzQ4LDEwICsxMzQ4LDEwIEBACiAKIAloZmEzODR4X0luZkZyYW1lX3QgKnNjYW5yZXN1bHRzOwogCi0JcHJpc20yc3RhX2F1dGhsaXN0X3QgYXV0aGxpc3Q7CS8qIEF1dGhlbnRpY2F0ZWQgc3RhdGlvbiBsaXN0LiAqLwotCXVuc2lnbmVkIGludCBhY2Nlc3Ntb2RlOwkvKiBBY2Nlc3MgbW9kZS4gKi8KLQlwcmlzbTJzdGFfYWNjZXNzbGlzdF90IGFsbG93OwkvKiBBbGxvd2VkIHN0YXRpb24gbGlzdC4gKi8KLQlwcmlzbTJzdGFfYWNjZXNzbGlzdF90IGRlbnk7CS8qIERlbmllZCBzdGF0aW9uIGxpc3QuICovCisJc3RydWN0IHByaXNtMnN0YV9hdXRobGlzdCBhdXRobGlzdDsJLyogQXV0aGVudGljYXRlZCBzdGF0aW9uIGxpc3QuICovCisJdW5zaWduZWQgaW50IGFjY2Vzc21vZGU7CQkvKiBBY2Nlc3MgbW9kZS4gKi8KKwlzdHJ1Y3QgcHJpc20yc3RhX2FjY2Vzc2xpc3QgYWxsb3c7CS8qIEFsbG93ZWQgc3RhdGlvbiBsaXN0LiAqLworCXN0cnVjdCBwcmlzbTJzdGFfYWNjZXNzbGlzdCBkZW55OwkvKiBEZW5pZWQgc3RhdGlvbiBsaXN0LiAqLwogCiB9IGhmYTM4NHhfdDsKIApAQCAtMTQxMyw3ICsxNDEzLDggQEAKIGludCBoZmEzODR4X2RydnJfc3RvcChoZmEzODR4X3QgKmh3KTsKIGludAogaGZhMzg0eF9kcnZyX3R4ZnJhbWUoaGZhMzg0eF90ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLCBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApOworCQkgICAgIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCisJCSAgICAgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKTsKIHZvaWQgaGZhMzg0eF90eF90aW1lb3V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiAKIGludCBoZmEzODR4X2NtZF9pbml0aWFsaXplKGhmYTM4NHhfdCAqaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKaW5kZXggMjhjZDFjNC4uZTEwOWE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCkBAIC01NTcsMTcgKzU1NywxMyBAQAogCUlOSVRfV09SSygmaHctPmxpbmtfYmgsIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKTsKIAlJTklUX1dPUksoJmh3LT51c2Jfd29yaywgaGZhMzg0eF91c2JfZGVmZXIpOwogCi0JaW5pdF90aW1lcigmaHctPnRocm90dGxlKTsKLQlody0+dGhyb3R0bGUuZnVuY3Rpb24gPSBoZmEzODR4X3VzYl90aHJvdHRsZWZuOwotCWh3LT50aHJvdHRsZS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaHc7CisJc2V0dXBfdGltZXIoJmh3LT50aHJvdHRsZSwgaGZhMzg0eF91c2JfdGhyb3R0bGVmbiwgKHVuc2lnbmVkIGxvbmcpaHcpOwogCi0JaW5pdF90aW1lcigmaHctPnJlc3B0aW1lcik7Ci0JaHctPnJlc3B0aW1lci5mdW5jdGlvbiA9IGhmYTM4NHhfdXNiY3RseF9yZXNwdGltZXJmbjsKLQlody0+cmVzcHRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylodzsKKwlzZXR1cF90aW1lcigmaHctPnJlc3B0aW1lciwgaGZhMzg0eF91c2JjdGx4X3Jlc3B0aW1lcmZuLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpaHcpOwogCi0JaW5pdF90aW1lcigmaHctPnJlcXRpbWVyKTsKLQlody0+cmVxdGltZXIuZnVuY3Rpb24gPSBoZmEzODR4X3VzYmN0bHhfcmVxdGltZXJmbjsKLQlody0+cmVxdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWh3OworCXNldHVwX3RpbWVyKCZody0+cmVxdGltZXIsIGhmYTM4NHhfdXNiY3RseF9yZXF0aW1lcmZuLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpaHcpOwogCiAJdXNiX2luaXRfdXJiKCZody0+cnhfdXJiKTsKIAl1c2JfaW5pdF91cmIoJmh3LT50eF91cmIpOwpAQCAtNTc3LDkgKzU3Myw4IEBACiAJaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9JTklUOwogCiAJSU5JVF9XT1JLKCZody0+Y29tbXNxdWFsX2JoLCBwcmlzbTJzdGFfY29tbXNxdWFsX2RlZmVyKTsKLQlpbml0X3RpbWVyKCZody0+Y29tbXNxdWFsX3RpbWVyKTsKLQlody0+Y29tbXNxdWFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylodzsKLQlody0+Y29tbXNxdWFsX3RpbWVyLmZ1bmN0aW9uID0gcHJpc20yc3RhX2NvbW1zcXVhbF90aW1lcjsKKwlzZXR1cF90aW1lcigmaHctPmNvbW1zcXVhbF90aW1lciwgcHJpc20yc3RhX2NvbW1zcXVhbF90aW1lciwKKwkJICAgICh1bnNpZ25lZCBsb25nKWh3KTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MjQsMTEgKzYxOSwxMCBAQAogewogCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OwogCi0JY3RseCA9IGttYWxsb2Moc2l6ZW9mKCpjdGx4KSwgaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7Ci0JaWYgKGN0bHggIT0gTlVMTCkgewotCQltZW1zZXQoY3RseCwgMCwgc2l6ZW9mKCpjdGx4KSk7CisJY3RseCA9IGt6YWxsb2Moc2l6ZW9mKCpjdGx4KSwKKwkJICAgICAgIGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpOworCWlmIChjdGx4ICE9IE5VTEwpCiAJCWluaXRfY29tcGxldGlvbigmY3RseC0+ZG9uZSk7Ci0JfQogCiAJcmV0dXJuIGN0bHg7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCmluZGV4IDAxNjNlMDYuLmI0YTE1ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCkBAIC01ODIsOCArNTgyLDYgQEAKIAkJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICAgdm9pZCAqZGF0YSkKIHsKLQlpbnQgcmVzdWx0OwotCiAJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0RFQ1JZUFQpIHsKIAkJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0RFQ1JZUFQpCiAJCQltaWItPnBhcm0yIHw9IEhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9SWENSWVBUOwpAQCAtNTkxLDkgKzU4OSw3IEBACiAJCQltaWItPnBhcm0yIHw9IEhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9UWENSWVBUOwogCX0KIAotCXJlc3VsdCA9IHByaXNtMm1pYl9mbGFnKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csIGRhdGEpOwotCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gcHJpc20ybWliX2ZsYWcobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgZGF0YSk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjI4LDExICs2MjQsOCBAQAogCQkJCQlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCQl2b2lkICpkYXRhKQogewotCWludCByZXN1bHQ7CiAKLQlyZXN1bHQgPSBwcmlzbTJtaWJfZmxhZyhtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCBkYXRhKTsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHByaXNtMm1pYl9mbGFnKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csIGRhdGEpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKaW5kZXggMTBhZDI0YS4uZGRiMjk0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKQEAgLTUxLDcgKzUxLDYgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTYwLDYgKzU5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0yNDMsNyArMjQzLDYgQEAKIAkJCSAgICAgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKQogewogCWhmYTM4NHhfdCAqaHcgPSAoaGZhMzg0eF90ICopIHdsYW5kZXYtPnByaXY7Ci0JaW50IHJlc3VsdDsKIAogCS8qIElmIG5lY2Vzc2FyeSwgc2V0IHRoZSA4MDIuMTEgV0VQIGJpdCAqLwogCWlmICgod2xhbmRldi0+aG9zdHdlcCAmIChIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEIHwgSE9TVFdFUF9FTkNSWVBUKSkgPT0KQEAgLTI1MSw5ICsyNTAsNyBAQAogCQlwODAyMTFfaGRyLT5hMy5mYyB8PSBjcHVfdG9fbGUxNihXTEFOX1NFVF9GQ19JU1dFUCgxKSk7CiAJfQogCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3R4ZnJhbWUoaHcsIHNrYiwgcDgwMjExX2hkciwgcDgwMjExX3dlcCk7Ci0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBoZmEzODR4X2RydnJfdHhmcmFtZShodywgc2tiLCBwODAyMTFfaGRyLCBwODAyMTFfd2VwKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTQ4LDcgKzE1NDUsNyBAQAogCSAqKiBhdXRoZW50aWNhdGlvbi4KIAkgKi8KIAotCW1lbWNweShyZWMuYWRkcmVzcywgaW5mLT5pbmZvLmF1dGhyZXEuc3RhX2FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocmVjLmFkZHJlc3MsIGluZi0+aW5mby5hdXRocmVxLnN0YV9hZGRyKTsKIAlyZWMuc3RhdHVzID0gUDgwMjExRU5VTV9zdGF0dXNfdW5zcGVjX2ZhaWx1cmU7CiAKIAkvKgpAQCAtMTY2MSw4ICsxNjU4LDggQEAKIAkJCWlmIChody0+YXV0aGxpc3QuY250ID49IFdMQU5fQVVUSF9NQVgpIHsKIAkJCQlyZWMuc3RhdHVzID0gUDgwMjExRU5VTV9zdGF0dXNfYXBfZnVsbDsKIAkJCX0gZWxzZSB7Ci0JCQkJbWVtY3B5KGh3LT5hdXRobGlzdC5hZGRyW2h3LT5hdXRobGlzdC5jbnRdLAotCQkJCSAgICAgICByZWMuYWRkcmVzcywgRVRIX0FMRU4pOworCQkJCWV0aGVyX2FkZHJfY29weShody0+YXV0aGxpc3QuYWRkcltody0+YXV0aGxpc3QuY250XSwKKwkJCQkJCXJlYy5hZGRyZXNzKTsKIAkJCQlody0+YXV0aGxpc3QuY250Kys7CiAJCQkJYWRkZWQgPSAxOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCA5MzVjNzE0Li43NGU4ODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAKIAlzcl9kYXRhID0gWEdJX0NSVDFUYWJsZVtpbmRleF0uQ1JbNV07CiAKLQlIREUgPSAoWEdJMzMwX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uWFJlcyA+PiAzKTsKKwlIREUgPSBYR0kzMzBfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5YUmVzID4+IDM7CiAKIAljcl9kYXRhID0gWEdJX0NSVDFUYWJsZVtpbmRleF0uQ1JbM107CiAKQEAgLTEwMTEsOCArMTAxMSw4IEBACiAJCQkgICAgICAgWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS5tb2RlX25vKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9ICgoaW5mby0+dmFyLnhyZXNfdmlydHVhbAotCQkJCSogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSA+PiA2KTsKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwKKwkJCQkqIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgPj4gNjsKIAogCQl4Z2lmYl9yZWdfc2V0KFhHSVNSLCBJTkRfU0lTX1BBU1NXT1JELCBTSVNfUEFTU1dPUkQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYwppbmRleCAxZjZmNjk5Li5hNDczOTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMKQEAgLTMwOCwxMSArMzA4LDExIEBACiAJCWRhdGEgfD0gZGF0YTE7CiAJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHgwNSwgZGF0YSk7CiAJCWRhdGEgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzYzQsIDB4MGUpOwotCQlkYXRhID0gZGF0YSA+PiA1OworCQlkYXRhID4+PSA1OwogCQlkYXRhID0gZGF0YSArIDM7CiAJCWlmIChkYXRhID4gNykKIAkJCWRhdGEgPSBkYXRhIC0gNzsKLQkJZGF0YSA9IGRhdGEgPDwgNTsKKwkJZGF0YSA8PD0gNTsKIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDBlLCB+MHhFMCwgZGF0YSk7CiAJfQogfQpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAKIAlkYXRhID0gcFZCSW5mby0+VGltaW5nVi5kYXRhWzZdOwogCWRhdGEgJj0gMHg4MDsKLQlkYXRhID0gZGF0YSA+PiAyOworCWRhdGEgPj49IDI7CiAKIAlpID0gWEdJMzMwX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwogCWkgJj0gRG91YmxlU2Nhbk1vZGU7CkBAIC02OTMsMTggKzY5MywxOCBAQAogCXRlbXBieCA9IFhHSTMzMF9Nb2RlUmVzSW5mb1tyZXNpbmRleF0uVlRvdGFsOwogCiAJaWYgKG1vZGVmbGFnICYgSGFsZkRDTEspCi0JCXRlbXBheCA9IHRlbXBheCA+PiAxOworCQl0ZW1wYXggPj49IDE7CiAKIAlpZiAobW9kZWZsYWcgJiBIYWxmRENMSykKLQkJdGVtcGF4ID0gdGVtcGF4IDw8IDE7CisJCXRlbXBheCA8PD0gMTsKIAogCXRlbXAgPSBYR0kzMzBfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5FeHRfSW5mb0ZsYWc7CiAKIAlpZiAodGVtcCAmIEludGVybGFjZU1vZGUpCi0JCXRlbXBieCA9IHRlbXBieCA+PiAxOworCQl0ZW1wYnggPj49IDE7CiAKIAlpZiAobW9kZWZsYWcgJiBEb3VibGVTY2FuTW9kZSkKLQkJdGVtcGJ4ID0gdGVtcGJ4IDw8IDE7CisJCXRlbXBieCA8PD0gMTsKIAogCXRlbXBjeCA9IDg7CiAKQEAgLTcyMSw3ICs3MjEsNyBAQAogCQkJKHVuc2lnbmVkIHNob3J0KSAoKHRlbXBjeCAmIDB4MGZmMDApID4+IDEwKSk7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDEyLCAodW5zaWduZWQgc2hvcnQpICh0ZW1wYnggJiAweGZmKSk7CiAJdGVtcGF4ID0gMDsKLQl0ZW1wYnggPSB0ZW1wYnggPj4gODsKKwl0ZW1wYnggPj49IDg7CiAKIAlpZiAodGVtcGJ4ICYgMHgwMSkKIAkJdGVtcGF4IHw9IDB4MDI7CkBAIC03NTAsMTQgKzc1MCwxNCBAQAogCiAJLyogR2V0T2Zmc2V0ICovCiAJdGVtcCA9IFhHSTMzMF9FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlSW5mbzsKLQl0ZW1wID0gdGVtcCA+PiA4OworCXRlbXAgPj49IDg7CiAJdGVtcCA9IFhHSTMzMF9TY3JlZW5PZmZzZXRbdGVtcF07CiAKIAl0ZW1wMiA9IFhHSTMzMF9SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZzsKIAl0ZW1wMiAmPSBJbnRlcmxhY2VNb2RlOwogCiAJaWYgKHRlbXAyKQotCQl0ZW1wID0gdGVtcCA8PCAxOworCQl0ZW1wIDw8PSAxOwogCiAJdGVtcDIgPSBwVkJJbmZvLT5Nb2RlVHlwZSAtIE1vZGVFR0E7CiAKQEAgLTc5Miw3ICs3OTIsNyBAQAogCS8qIFNldE9mZnNldCAqLwogCURpc3BsYXlVbml0ID0gdGVtcDsKIAl0ZW1wMiA9IHRlbXA7Ci0JdGVtcCA9IHRlbXAgPj4gODsgLyogYWggKi8KKwl0ZW1wID4+PSA4OyAvKiBhaCAqLwogCXRlbXAgJj0gMHgwRjsKIAlpID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2M0LCAweDBFKTsKIAlpICY9IDB4RjA7CkBAIC04MDksNyArODA5LDcgQEAKIAlpZiAodGVtcDIpCiAJCURpc3BsYXlVbml0ID4+PSAxOwogCi0JRGlzcGxheVVuaXQgPSBEaXNwbGF5VW5pdCA8PCA1OworCURpc3BsYXlVbml0IDw8PSA1OwogCWFoID0gKERpc3BsYXlVbml0ICYgMHhmZjAwKSA+PiA4OwogCWFsID0gRGlzcGxheVVuaXQgJiAweDAwZmY7CiAJaWYgKGFsID09IDApCkBAIC05MTIsNyArOTEyLDcgQEAKIAkJCWluZGV4ID0gZGF0YTsKIAkJCWluZGV4ICY9IDB4RTA7CiAJCQlkYXRhICY9IDB4MUY7Ci0JCQlkYXRhID0gZGF0YSA8PCAxOworCQkJZGF0YSA8PD0gMTsKIAkJCWRhdGEgKz0gMTsKIAkJCWRhdGEgfD0gaW5kZXg7CiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MkMsIGRhdGEpOwpAQCAtMTAxMSw3ICsxMDExLDcgQEAKIAlkYXRhMiA9IDA7CiAJZGF0YTIgfD0gMHgwMjsKIAlkYXRhMyA9IHBWQkluZm8tPk1vZGVUeXBlIC0gTW9kZVZHQTsKLQlkYXRhMyA9IGRhdGEzIDw8IDI7CisJZGF0YTMgPDw9IDI7CiAJZGF0YTIgfD0gZGF0YTM7CiAJZGF0YSAmPSBJbnRlcmxhY2VNb2RlOwogCkBAIC0xMTI2LDcgKzExMjYsNyBAQAogCQkJCWRhdGEyICs9IDB4MTU7CiAKIAkJCW91dGIoZGF0YTIsIHBWQkluZm8tPlAzYzkpOwotCQkJZGF0YSA9IGRhdGEgPj4gMjsKKwkJCWRhdGEgPj49IDI7CiAJCX0KIAl9CiAKQEAgLTExODUsMTAgKzExODUsMTAgQEAKIAl5cmVzID0gWEdJMzMwX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5WVG90YWw7CiAKIAlpZiAobW9kZWZsYWcgJiBIYWxmRENMSykKLQkJeHJlcyA9IHhyZXMgPDwgMTsKKwkJeHJlcyA8PD0gMTsKIAogCWlmIChtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKQotCQl5cmVzID0geXJlcyA8PCAxOworCQl5cmVzIDw8PSAxOwogCiAJaWYgKHhyZXMgPT0gNzIwKQogCQl4cmVzID0gNjQwOwpAQCAtMTQ1MCw4ICsxNDUwLDggQEAKIAogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDFBLCB0ZW1wYnggJiAweDA3KTsKIAotCXRlbXBjeCA9IHRlbXBjeCA+PiAzOwotCXRlbXBieCA9IHRlbXBieCA+PiAzOworCXRlbXBjeCA+Pj0gMzsKKwl0ZW1wYnggPj49IDM7CiAKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxNiwKIAkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBieCAmIDB4ZmYpKTsKQEAgLTE0NzMsOSArMTQ3Myw5IEBACiAJCXRlbXBjeCAtPSB0ZW1wYXg7CiAKIAl0ZW1wYXggPSB0ZW1wYnggJiAweDA3OwotCXRlbXBheCA9IHRlbXBheCA+PiA1OwotCXRlbXBjeCA9IHRlbXBjeCA+PiAzOwotCXRlbXBieCA9IHRlbXBieCA+PiAzOworCXRlbXBheCA+Pj0gNTsKKwl0ZW1wY3ggPj49IDM7CisJdGVtcGJ4ID4+PSAzOwogCiAJdGVtcGN4ICY9IDB4MWY7CiAJdGVtcGF4IHw9IHRlbXBjeDsKQEAgLTE2MDAsNyArMTYwMCw3IEBACiAJdGVtcDEgPSBwVkJJbmZvLT5WR0FIREUgPDwgMTY7CiAKIAl0ZW1wMSAvPSB0ZW1wMzsKLQl0ZW1wMyA9IHRlbXAzIDw8IDE2OworCXRlbXAzIDw8PSAxNjsKIAl0ZW1wMSAtPSAxOwogCiAJdGVtcDMgPSAodGVtcDMgJiAweGZmZmYwMDAwKSArICh0ZW1wMSAmIDB4ZmZmZik7CkBAIC0xNjIyLDEwICsxNjIyLDEwIEBACiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MjEsCiAJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wYnggJiAweGZmKSk7CiAKLQl0ZW1wMyA9IHRlbXAzID4+IDE2OworCXRlbXAzID4+PSAxNjsKIAogCWlmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKQotCQl0ZW1wMyA9IHRlbXAzID4+IDE7CisJCXRlbXAzID4+PSAxOwogCiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MjIsCiAJCQkodW5zaWduZWQgc2hvcnQpICgodGVtcDMgPj4gOCkgJiAweGZmKSk7CkBAIC0xOTA5LDcgKzE5MDksNyBAQAogCXRlbXBieCA9IHRlbXBieCB8IHRlbXA7CiAJdGVtcCA9IHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNkNCwgMHgzMSk7CiAJcHVzaCA9IHRlbXA7Ci0JcHVzaCA9IHB1c2ggPDwgODsKKwlwdXNoIDw8PSA4OwogCXRlbXBheCA9IHRlbXAgPDwgODsKIAl0ZW1wYnggPSB0ZW1wYnggfCB0ZW1wYXg7CiAJdGVtcCA9IChTZXRDUlQyVG9EdWFsRWRnZSB8IFNldENSVDJUb1lQYlByNTI1NzUwIHwgWEdJX1NldENSVDJUb0xDREEKQEAgLTIxMDcsNyArMjEwNyw3IEBACiAJCQlpZiAocFZCSW5mby0+VkJJbmZvICYgWEdJX1NldENSVDJUb0xDREEpCiAJCQkJdGVtcGF4ICY9IDB4MEY7CiAJCQllbHNlCi0JCQkJdGVtcGF4ID0gdGVtcGF4ID4+IDQ7CisJCQkJdGVtcGF4ID4+PSA0OwogCiAJCQlpZiAoKHJlc2luZm8gPT0gNikgfHwgKHJlc2luZm8gPT0gOSkpIHsKIAkJCQlpZiAodGVtcGF4ID49IDMpCkBAIC0yMTgyLDcgKzIxODIsNyBAQAogCXVuc2lnbmVkIGNoYXIgaSA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXVqUmV0ID0gdWpSZXQgPDwgMTsKKwkJdWpSZXQgPDw9IDE7CiAJCXVqUmV0IHw9ICh1akRhdGUgPj4gaSkgJiAxOwogCX0KIApAQCAtMjQ5NCw3ICsyNDk0LDcgQEAKIAl0ZW1wY3ggPSAodW5zaWduZWQgc2hvcnQpCiAJCQlYR0lfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbMTRdIDw8IDg7CiAJdGVtcGN4ICY9IDB4MDEwMDsKLQl0ZW1wY3ggPSB0ZW1wY3ggPDwgMjsKKwl0ZW1wY3ggPDw9IDI7CiAJdGVtcGJ4IHw9IHRlbXBjeDsKIAl0ZW1wMSA9ICh1bnNpZ25lZCBzaG9ydCkgWEdJX0NSVDFUYWJsZVtDUlQxSW5kZXhdLkNSWzldOwogCkBAIC0yNzQ1LDcgKzI3NDUsNyBAQAogCXRlbXAgPSBYR0kzMzBfU2NyZWVuT2Zmc2V0W2luZGV4XTsKIAogCWlmIChpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpCi0JCXRlbXAgPSB0ZW1wIDw8IDE7CisJCXRlbXAgPDw9IDE7CiAKIAljb2xvcmRlcHRoID0gWEdJX0dldENvbG9yRGVwdGgoTW9kZUlkSW5kZXgpOwogCkBAIC0yNzU0LDcgKzI3NTQsNyBAQAogCQljb2xvcmRlcHRoID0gQ29sb3JEZXB0aFt0ZW1wXTsKIAkJdGVtcCA9IDB4NkI7CiAJCWlmIChpbmZvZmxhZyAmIEludGVybGFjZU1vZGUpCi0JCQl0ZW1wID0gdGVtcCA8PCAxOworCQkJdGVtcCA8PD0gMTsKIAl9CiAJcmV0dXJuIHRlbXAgKiBjb2xvcmRlcHRoOwogfQpAQCAtMjgyNiw3ICsyODI2LDcgQEAKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MEEsIHRlbXApOwogCQl0ZW1wY3ggPSAoKHBWQkluZm8tPlZHQUhUIC0gcFZCSW5mby0+VkdBSERFKSAvIDIpID4+IDI7CiAJCXB1c2hieCA9IHBWQkluZm8tPlZHQUhERSAvIDIgKyAxNjsKLQkJdGVtcGN4ID0gdGVtcGN4ID4+IDE7CisJCXRlbXBjeCA+Pj0gMTsKIAkJdGVtcGJ4ID0gcHVzaGJ4ICsgdGVtcGN4OyAvKiBieCBCVFZHQUBIUlMgMHgwQiwweDBDICovCiAJCXRlbXBjeCArPSB0ZW1wYng7CiAKQEAgLTI4NjEsNyArMjg2MSw3IEBACiAJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDBBLCB0ZW1wKTsKIAkJdGVtcGN4ID0gKHBWQkluZm8tPlZHQUhUIC0gcFZCSW5mby0+VkdBSERFKSA+PiAyOyAvKiBjeCAqLwogCQlwdXNoYnggPSBwVkJJbmZvLT5WR0FIREUgKyAxNjsKLQkJdGVtcGN4ID0gdGVtcGN4ID4+IDE7CisJCXRlbXBjeCA+Pj0gMTsKIAkJdGVtcGJ4ID0gcHVzaGJ4ICsgdGVtcGN4OyAvKiBieCBCVFZHQUBIUlMgMHgwQiwweDBDICovCiAJCXRlbXBjeCArPSB0ZW1wYng7CiAKQEAgLTI5ODAsNyArMjk4MCw3IEBACiAJdGVtcGF4ID0gcFZCSW5mby0+VkdBSERFOyAvKiAweDA0IEhvcml6b250YWwgRGlzcGxheSBFbmQgKi8KIAogCWlmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKQotCQl0ZW1wYXggPSB0ZW1wYXggPj4gMTsKKwkJdGVtcGF4ID4+PSAxOwogCiAJdGVtcGF4ID0gKHRlbXBheCAvIHRlbXBjeCkgLSAxOwogCXRlbXBieCB8PSAoKHRlbXBheCAmIDB4MDBGRikgPDwgOCk7CkBAIC0zMDE1LDcgKzMwMTUsNyBAQAogCQl0ZW1wYXggPSBwVkJJbmZvLT5WR0FIVDsKIAogCWlmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKQotCQl0ZW1wYXggPSB0ZW1wYXggPj4gMTsKKwkJdGVtcGF4ID4+PSAxOwogCiAJdGVtcGF4ID0gKHRlbXBheCAvIHRlbXBjeCkgLSA1OwogCXRlbXBjeCA9IHRlbXBheDsgLyogMjAwMzA0MDEgMHgwNyBob3Jpem9udGFsIFJldHJhY2UgU3RhcnQgKi8KQEAgLTMxNDIsMTEgKzMxNDIsMTEgQEAKIAogCXRlbXBheCA9IHB1c2gxOwogCXRlbXBheCAtPSB0ZW1wYng7IC8qIDB4MEMgVmVydGljYWwgUmV0cmFjZSBTdGFydCAqLwotCXRlbXBheCA9IHRlbXBheCA+PiAyOworCXRlbXBheCA+Pj0gMjsKIAlwdXNoMSA9IHRlbXBheDsgLyogcHVzaCBheCAqLwogCiAJaWYgKHJlc2luZm8gIT0gMHgwOSkgewotCQl0ZW1wYXggPSB0ZW1wYXggPDwgMTsKKwkJdGVtcGF4IDw8PSAxOwogCQl0ZW1wYnggKz0gdGVtcGF4OwogCX0KIApAQCAtMzE3OSw3ICszMTc5LDcgQEAKIAkJfQogCX0KIAl0ZW1wYXggPSBwdXNoMTsKLQl0ZW1wYXggPSB0ZW1wYXggPj4gMjsKKwl0ZW1wYXggPj49IDI7CiAJdGVtcGF4Kys7CiAJdGVtcGF4ICs9IHRlbXBieDsKIAlwdXNoMSA9IHRlbXBheDsgLyogcHVzaCBheCAqLwpAQCAtMzMzMiw3ICszMzMyLDcgQEAKIAogCWlmIChwVkJJbmZvLT5WREUgPD0gdGVtcGF4KSB7CiAJCXRlbXBheCAtPSBwVkJJbmZvLT5WREU7Ci0JCXRlbXBheCA9IHRlbXBheCA+PiAyOworCQl0ZW1wYXggPj49IDI7CiAJCXRlbXBheCA9ICh0ZW1wYXggJiAweDAwRkYpIHwgKCh0ZW1wYXggJiAweDAwRkYpIDw8IDgpOwogCQlwdXNoMSA9IHRlbXBheDsKIAkJdGVtcCA9ICh0ZW1wYXggJiAweEZGMDApID4+IDg7CkBAIC0zMzc3LDcgKzMzNzcsNyBAQAogCXRlbXBjeCA9IHBWQkluZm8tPkhUOwogCiAJaWYgKFhHSV9Jc0xDRER1YWxMaW5rKHBWQkluZm8pKQotCQl0ZW1wY3ggPSB0ZW1wY3ggPj4gMTsKKwkJdGVtcGN4ID4+PSAxOwogCiAJdGVtcGN4IC09IDI7CiAJdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsKQEAgLTMzOTQsNyArMzM5NCw3IEBACiAJCXRlbXBjeCAtPSA0OwogCiAJdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsKLQl0ZW1wID0gdGVtcCA8PCA0OworCXRlbXAgPDw9IDQ7CiAJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MjIsIDB4MEYsIHRlbXApOwogCiAJdGVtcGJ4ID0gVGltaW5nUG9pbnRbal0gfCAoKFRpbWluZ1BvaW50W2ogKyAxXSkgPDwgOCk7CkBAIC0zNDAzLDcgKzM0MDMsNyBAQAogCXRlbXAgPSB0ZW1wYnggJiAweDAwRkY7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MjQsIHRlbXApOwogCXRlbXAgPSAodGVtcGJ4ICYgMHhGRjAwKSA+PiA4OwotCXRlbXAgPSB0ZW1wIDw8IDQ7CisJdGVtcCA8PD0gNDsKIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgyNSwgMHgwRiwgdGVtcCk7CiAKIAl0ZW1wYnggPSBwdXNoMjsKQEAgLTM0MjgsNyArMzQyOCw3IEBACiAJCXRlbXBjeCAtPSA0OwogCiAJdGVtcCA9IHRlbXBjeCAmIDB4RkY7Ci0JdGVtcCA9IHRlbXAgPDwgNDsKKwl0ZW1wIDw8PSA0OwogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDJBLCAweDBGLCB0ZW1wKTsKIAogCXRlbXBjeCA9IHB1c2gxOyAvKiBwb3AgY3ggKi8KQEAgLTM0MzYsNyArMzQzNiw3IEBACiAJdGVtcCA9IFRpbWluZ1BvaW50W2pdIHwgKChUaW1pbmdQb2ludFtqICsgMV0pIDw8IDgpOwogCXRlbXBjeCAtPSB0ZW1wOwogCXRlbXAgPSB0ZW1wY3ggJiAweDAwRkY7Ci0JdGVtcCA9IHRlbXAgPDwgNDsKKwl0ZW1wIDw8PSA0OwogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDJELCAweDBGLCB0ZW1wKTsKIAogCXRlbXBjeCAtPSAxMTsKQEAgLTM0NjIsOSArMzQ2Miw5IEBACiAJCSAgICAoVkJfU0lTMzAxTFYgfCBWQl9TSVMzMDJMViB8IFZCX1hHSTMwMUMpKSB7CiAJCQlpZiAoIShwVkJJbmZvLT5UVkluZm8gJgogCQkJICAgIChUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwKSkpCi0JCQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7CisJCQkJdGVtcGJ4ID4+PSAxOwogCQl9IGVsc2UKLQkJCXRlbXBieCA9IHRlbXBieCA+PiAxOworCQkJdGVtcGJ4ID4+PSAxOwogCX0KIAogCXRlbXBieCAtPSAyOwpAQCAtMzUxNCw3ICszNTE0LDcgQEAKIAkJaWYgKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb1RWKSB7CiAJCQlpZiAoIShwVkJJbmZvLT5UVkluZm8gJiAoVFZTZXRZUGJQcjUyNXAKIAkJCQkJfCBUVlNldFlQYlByNzUwcCkpKQotCQkJCXRlbXBieCA9IHRlbXBieCA+PiAxOworCQkJCXRlbXBieCA+Pj0gMTsKIAkJfQogCiAJCWlmIChwVkJJbmZvLT5WQlR5cGUgJiAoVkJfU0lTMzAyTFYgfCBWQl9YR0kzMDFDKSkgewpAQCAtMzYyNyw3ICszNjI3LDcgQEAKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQyUG9ydCwgMHg0YywgdGVtcCk7CiAKIAl0ZW1wID0gKCh0ZW1wY3ggJiAweEZGMDApID4+IDgpICYgMHgwMzsKLQl0ZW1wID0gdGVtcCA8PCAyOworCXRlbXAgPDw9IDI7CiAJdGVtcCB8PSAoKHRlbXBieCAmIDB4RkYwMCkgPj4gOCkgJiAweDAzOwogCiAJaWYgKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb1lQYlByNTI1NzUwKSB7CkBAIC0zNjkxLDEzICszNjkxLDEzIEBACiAJdGVtcGJ4ID0gcFZCSW5mby0+SERFOyAvKiBSSEFDVEU9SERFLTEgKi8KIAogCWlmIChYR0lfSXNMQ0REdWFsTGluayhwVkJJbmZvKSkKLQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7CisJCXRlbXBieCA+Pj0gMTsKIAogCXRlbXBieCAtPSAxOwogCXRlbXAgPSB0ZW1wYnggJiAweDAwRkY7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MkMsIHRlbXApOwogCXRlbXAgPSAodGVtcGJ4ICYgMHhGRjAwKSA+PiA4OwotCXRlbXAgPSB0ZW1wIDw8IDQ7CisJdGVtcCA8PD0gNDsKIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgyQiwgMHgwRiwgdGVtcCk7CiAJdGVtcCA9IDB4MDE7CiAKQEAgLTM3MTMsNyArMzcxMyw3IEBACiAJdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsgLyogUlZUVlQ9VlQtMSAqLwogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDJQb3J0LCAweDE5LCB0ZW1wKTsKIAl0ZW1wID0gKHRlbXBjeCAmIDB4RkYwMCkgPj4gODsKLQl0ZW1wID0gdGVtcCA8PCA1OworCXRlbXAgPDw9IDU7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MUEsIHRlbXApOwogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDA5LCAweEYwLCAweDAwKTsKIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgwQSwgMHhGMCwgMHgwMCk7CkBAIC0zNzcwLDcgKzM3NzAsNyBAQAogCXRlbXBjaCA9ICgodGVtcGN4ICYgMHhGRjAwKSA+PiA4KSAmIDB4MDc7CiAJdGVtcGJoID0gKCh0ZW1wYnggJiAweEZGMDApID4+IDgpICYgMHgwNzsKIAl0ZW1wYWggPSB0ZW1wY2g7Ci0JdGVtcGFoID0gdGVtcGFoIDw8IDM7CisJdGVtcGFoIDw8PSAzOwogCXRlbXBhaCB8PSB0ZW1wYmg7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MDIsIHRlbXBhaCk7CiAKQEAgLTM3ODcsNyArMzc4Nyw3IEBACiAJdGVtcCA9IHRlbXBieCAmIDB4MDBGRjsgLyogUlRWQUNURUU9bGNkdnJzICovCiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MDQsIHRlbXApOwogCXRlbXAgPSAodGVtcGJ4ICYgMHhGRjAwKSA+PiA4OwotCXRlbXAgPSB0ZW1wIDw8IDQ7CisJdGVtcCA8PD0gNDsKIAl0ZW1wIHw9ICh0ZW1wY3ggJiAweDAwMEYpOwogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDJQb3J0LCAweDAxLCB0ZW1wKTsKIAl0ZW1wY3ggPSBwdXNoYng7CkBAIC0zNzk2LDkgKzM3OTYsOSBAQAogCXRlbXBieCAmPSAweDBGRkY7CiAKIAlpZiAoWEdJX0lzTENERHVhbExpbmsocFZCSW5mbykpIHsKLQkJdGVtcGF4ID0gdGVtcGF4ID4+IDE7Ci0JCXRlbXBieCA9IHRlbXBieCA+PiAxOwotCQl0ZW1wY3ggPSB0ZW1wY3ggPj4gMTsKKwkJdGVtcGF4ID4+PSAxOworCQl0ZW1wYnggPj49IDE7CisJCXRlbXBjeCA+Pj0gMTsKIAl9CiAKIAlpZiAocFZCSW5mby0+VkJUeXBlICYgVkJfU0lTMzAyTFYpCkBAIC0zODI2LDkgKzM4MjYsOSBAQAogCXRlbXBheCA9IHBWQkluZm8tPkhUOwogCXRlbXBieCA9IHBWQkluZm8tPkxDREhSUzsKIAlpZiAoWEdJX0lzTENERHVhbExpbmsocFZCSW5mbykpIHsKLQkJdGVtcGF4ID0gdGVtcGF4ID4+IDE7Ci0JCXRlbXBieCA9IHRlbXBieCA+PiAxOwotCQl0ZW1wY3ggPSB0ZW1wY3ggPj4gMTsKKwkJdGVtcGF4ID4+PSAxOworCQl0ZW1wYnggPj49IDE7CisJCXRlbXBjeCA+Pj0gMTsKIAl9CiAKIAlpZiAocFZCSW5mby0+VkJUeXBlICYgVkJfU0lTMzAyTFYpCkBAIC0zODQzLDcgKzM4NDMsNyBAQAogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDJQb3J0LCAweDFDLCB0ZW1wKTsKIAogCXRlbXAgPSAodGVtcGJ4ICYgMHhGRjAwKSA+PiA4OwotCXRlbXAgPSB0ZW1wIDw8IDQ7CisJdGVtcCA8PD0gNDsKIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgxRCwgfjB4MEYwLCB0ZW1wKTsKIAl0ZW1wID0gdGVtcGN4ICYgMHgwMEZGOyAvKiBSSFNZRVhQMlM9bGNkaHJlICovCiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MjEsIHRlbXApOwpAQCAtNDA0NCwxMCArNDA0NCwxMCBAQAogCXRlbXBieCA9IHBWQkluZm8tPlZHQUhERTsKIAogCWlmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKQotCQl0ZW1wYnggPSB0ZW1wYnggPj4gMTsKKwkJdGVtcGJ4ID4+PSAxOwogCiAJaWYgKFhHSV9Jc0xDRER1YWxMaW5rKHBWQkluZm8pKQotCQl0ZW1wYnggPSB0ZW1wYnggPj4gMTsKKwkJdGVtcGJ4ID4+PSAxOwogCiAJaWYgKHRlbXBjeCAmIFNldENSVDJUb0hpVmlzaW9uKSB7CiAJCXRlbXAgPSAwOwpAQCAtNDEwNyw3ICs0MTA3LDcgQEAKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgxQSwgdGVtcCk7CiAJdGVtcGJ4ID0gKHVuc2lnbmVkIHNob3J0KSAodGVtcGVieCA+PiAxNik7CiAJdGVtcCA9IHRlbXBieCAmIDB4MDBGRjsKLQl0ZW1wID0gdGVtcCA8PCA0OworCXRlbXAgPDw9IDQ7CiAJdGVtcCB8PSAoKHRlbXBjeCAmIDB4RkYwMCkgPj4gOCk7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MTksIHRlbXApOwogCkBAIC00MTE4LDEwICs0MTE4LDEwIEBACiAJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDRQb3J0LCAweDFDLCB0ZW1wKTsKIAkJdGVtcGF4ID0gcFZCSW5mby0+VkdBSERFOwogCQlpZiAobW9kZWZsYWcgJiBIYWxmRENMSykKLQkJCXRlbXBheCA9IHRlbXBheCA+PiAxOworCQkJdGVtcGF4ID4+PSAxOwogCiAJCWlmIChYR0lfSXNMQ0REdWFsTGluayhwVkJJbmZvKSkKLQkJCXRlbXBheCA9IHRlbXBheCA+PiAxOworCQkJdGVtcGF4ID4+PSAxOwogCiAJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9MQ0QpIHsKIAkJCWlmICh0ZW1wYXggPiA4MDApCkBAIC00MTYyLDcgKzQxNjIsNyBAQAogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgxRiwgMHgwMEMwLCB0ZW1wKTsKIAkJdGVtcGJ4ID0gcFZCSW5mby0+SFQ7CiAJCWlmIChYR0lfSXNMQ0REdWFsTGluayhwVkJJbmZvKSkKLQkJCXRlbXBieCA9IHRlbXBieCA+PiAxOworCQkJdGVtcGJ4ID4+PSAxOwogCQl0ZW1wYnggPSAodGVtcGJ4ID4+IDEpIC0gMjsKIAkJdGVtcCA9ICgodGVtcGJ4ICYgMHgwNzAwKSA+PiA4KSA8PCAzOwogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgyMSwgMHgwMEMwLCB0ZW1wKTsKQEAgLTQ2MjIsNyArNDYyMiw3IEBACiAJCQl0ZW1wYmwgPSBYR0kzMDFUVkRlbGF5OwogCiAJCQlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvRHVhbEVkZ2UpCi0JCQkJdGVtcGJsID0gdGVtcGJsID4+IDQ7CisJCQkJdGVtcGJsID4+PSA0OwogCQkJaWYgKHBWQkluZm8tPlZCSW5mbyAmCiAJCQkgICAgKFNldENSVDJUb0xDRCB8IFhHSV9TZXRDUlQyVG9MQ0RBKSkgewogCQkJCXRlbXBiaCA9IFhHSTMwMUxDRERlbGF5OwpAQCAtNDc4NSw3ICs0Nzg1LDcgQEAKIAl0ZW1wYnggPSBYR0lfR2V0VFZQdHJJbmRleChwVkJJbmZvKTsKIAl0ZW1wYnggJj0gMHhGRTsKIAl0ZW1wYWggPSBUVkFudGlGbGlja0xpc3RbdGVtcGJ4XTsKLQl0ZW1wYWggPSB0ZW1wYWggPDwgNDsKKwl0ZW1wYWggPDw9IDQ7CiAKIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgwQSwgMHg4RiwgdGVtcGFoKTsKIH0KQEAgLTQ3OTksNyArNDc5OSw3IEBACiAJdGVtcGJ4ID0gWEdJX0dldFRWUHRySW5kZXgocFZCSW5mbyk7CiAJdGVtcGJ4ICY9IDB4RkU7CiAJdGVtcGFoID0gVFZFZGdlTGlzdFt0ZW1wYnhdOwotCXRlbXBhaCA9IHRlbXBhaCA8PCA1OworCXRlbXBhaCA8PD0gNTsKIAogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDNBLCAweDFGLCB0ZW1wYWgpOwogfQpAQCAtNTEwMSw3ICs1MTAxLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIGksIGluZGV4LCB0ZW1wOwogCiAJaW5kZXggPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4MzMpOwotCWluZGV4ID0gaW5kZXggPj4gcFZCSW5mby0+U2VsZWN0Q1JUMlJhdGU7CisJaW5kZXggPj49IHBWQkluZm8tPlNlbGVjdENSVDJSYXRlOwogCWluZGV4ICY9IDB4MEY7CiAKIAlpZiAocFZCSW5mby0+TENESW5mbyAmIExDRE5vbkV4cGFuZGluZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKaW5kZXggZTA3Y2ZhOC4uODk1YzJhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKKysrIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKQEAgLTU4NywxMSArNTg3LDYgQEAKIAkJZ3JhbnVsYXJpdHkgPSAweDEwMDAwOwogCQlhZGRyIHw9IFRTSTE0OF9MQ1NSX0lUQVRfQVNfQTY0OwogCQlicmVhazsKLQljYXNlIFZNRV9DUkNTUjoKLQljYXNlIFZNRV9VU0VSMToKLQljYXNlIFZNRV9VU0VSMjoKLQljYXNlIFZNRV9VU0VSMzoKLQljYXNlIFZNRV9VU0VSNDoKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQ3MSw3ICsyNDY2LDggQEAKIAkJbWFzdGVyX2ltYWdlLT5sb2NrZWQgPSAwOwogCQltYXN0ZXJfaW1hZ2UtPm51bWJlciA9IGk7CiAJCW1hc3Rlcl9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfCBWTUVfQTMyIHwKLQkJCVZNRV9BNjQ7CisJCQlWTUVfQTY0IHwgVk1FX0NSQ1NSIHwgVk1FX1VTRVIxIHwgVk1FX1VTRVIyIHwKKwkJCVZNRV9VU0VSMyB8IFZNRV9VU0VSNDsKIAkJbWFzdGVyX2ltYWdlLT5jeWNsZV9hdHRyID0gVk1FX1NDVCB8IFZNRV9CTFQgfCBWTUVfTUJMVCB8CiAJCQlWTUVfMmVWTUUgfCBWTUVfMmVTU1QgfCBWTUVfMmVTU1RCIHwgVk1FXzJlU1NUMTYwIHwKIAkJCVZNRV8yZVNTVDI2NyB8IFZNRV8yZVNTVDMyMCB8IFZNRV9TVVBFUiB8IFZNRV9VU0VSIHwKQEAgLTI1MDAsOCArMjQ5Niw3IEBACiAJCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAwOwogCQlzbGF2ZV9pbWFnZS0+bnVtYmVyID0gaTsKIAkJc2xhdmVfaW1hZ2UtPmFkZHJlc3NfYXR0ciA9IFZNRV9BMTYgfCBWTUVfQTI0IHwgVk1FX0EzMiB8Ci0JCQlWTUVfQTY0IHwgVk1FX0NSQ1NSIHwgVk1FX1VTRVIxIHwgVk1FX1VTRVIyIHwKLQkJCVZNRV9VU0VSMyB8IFZNRV9VU0VSNDsKKwkJCVZNRV9BNjQ7CiAJCXNsYXZlX2ltYWdlLT5jeWNsZV9hdHRyID0gVk1FX1NDVCB8IFZNRV9CTFQgfCBWTUVfTUJMVCB8CiAJCQlWTUVfMmVWTUUgfCBWTUVfMmVTU1QgfCBWTUVfMmVTU1RCIHwgVk1FXzJlU1NUMTYwIHwKIAkJCVZNRV8yZVNTVDI2NyB8IFZNRV8yZVNTVDMyMCB8IFZNRV9TVVBFUiB8IFZNRV9VU0VSIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdm1lL3ZtZS5jIGIvZHJpdmVycy92bWUvdm1lLmMKaW5kZXggZDk1ZmI4NC4uNmJhYjJjNGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS92bWUuYworKysgYi9kcml2ZXJzL3ZtZS92bWUuYwpAQCAtNjA5LDYgKzYwOSwzMiBAQAogfQogRVhQT1JUX1NZTUJPTCh2bWVfbWFzdGVyX3Jtdyk7CiAKK2ludCB2bWVfbWFzdGVyX21tYXAoc3RydWN0IHZtZV9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZTsKKwlwaHlzX2FkZHJfdCBwaHlzX2FkZHI7CisJdW5zaWduZWQgbG9uZyB2bWFfc2l6ZTsKKworCWlmIChyZXNvdXJjZS0+dHlwZSAhPSBWTUVfTUFTVEVSKSB7CisJCXByX2VycigiTm90IGEgbWFzdGVyIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW1hZ2UgPSBsaXN0X2VudHJ5KHJlc291cmNlLT5lbnRyeSwgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsIGxpc3QpOworCXBoeXNfYWRkciA9IGltYWdlLT5idXNfcmVzb3VyY2Uuc3RhcnQgKyAodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKTsKKwl2bWFfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCWlmIChwaHlzX2FkZHIgKyB2bWFfc2l6ZSA+IGltYWdlLT5idXNfcmVzb3VyY2UuZW5kICsgMSkgeworCQlwcl9lcnIoIk1hcCBzaXplIGNhbm5vdCBleGNlZWQgdGhlIHdpbmRvdyBzaXplXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCXJldHVybiB2bV9pb21hcF9tZW1vcnkodm1hLCBwaHlzX2FkZHIsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7Cit9CitFWFBPUlRfU1lNQk9MKHZtZV9tYXN0ZXJfbW1hcCk7CisKIHZvaWQgdm1lX21hc3Rlcl9mcmVlKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlc291cmNlKQogewogCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICptYXN0ZXJfaW1hZ2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9idWZmZXIuaCBiL2luY2x1ZGUvbGludXgvaWlvL2J1ZmZlci5oCmluZGV4IGI2NTg1MGEuLmViODYyMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWlvL2J1ZmZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL2J1ZmZlci5oCkBAIC0yMSw4ICsyMSw4IEBACiAgKiBzdHJ1Y3QgaWlvX2J1ZmZlcl9hY2Nlc3NfZnVuY3MgLSBhY2Nlc3MgZnVuY3Rpb25zIGZvciBidWZmZXJzLgogICogQHN0b3JlX3RvOgkJYWN0dWFsbHkgc3RvcmUgc3R1ZmYgdG8gdGhlIGJ1ZmZlcgogICogQHJlYWRfZmlyc3RfbjoJdHJ5IHRvIGdldCBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgKG11c3QgZXhpc3QpCi0gKiBAZGF0YV9hdmFpbGFibGU6CWluZGljYXRlcyB3aGV0aGVyIGRhdGEgZm9yIHJlYWRpbmcgZnJvbSB0aGUgYnVmZmVyIGlzCi0gKgkJCWF2YWlsYWJsZS4KKyAqIEBkYXRhX2F2YWlsYWJsZToJaW5kaWNhdGVzIGhvdyBtdWNoIGRhdGEgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nIGZyb20KKyAqCQkJdGhlIGJ1ZmZlci4KICAqIEByZXF1ZXN0X3VwZGF0ZToJaWYgYSBwYXJhbWV0ZXIgY2hhbmdlIGhhcyBiZWVuIG1hcmtlZCwgdXBkYXRlIHVuZGVybHlpbmcKICAqCQkJc3RvcmFnZS4KICAqIEBzZXRfYnl0ZXNfcGVyX2RhdHVtOnNldCBudW1iZXIgb2YgYnl0ZXMgcGVyIGRhdHVtCkBAIC00Myw3ICs0Myw3IEBACiAJaW50ICgqcmVhZF9maXJzdF9uKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLAogCQkJICAgIHNpemVfdCBuLAogCQkJICAgIGNoYXIgX191c2VyICpidWYpOwotCWJvb2wgKCpkYXRhX2F2YWlsYWJsZSkoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcik7CisJc2l6ZV90ICgqZGF0YV9hdmFpbGFibGUpKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIpOwogCiAJaW50ICgqcmVxdWVzdF91cGRhdGUpKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIpOwogCkBAIC03Miw2ICs3Miw3IEBACiAgKiBAZGVtdXhfYm91bmNlOglbSU5URVJOXSBidWZmZXIgZm9yIGRvaW5nIGdhdGhlciBmcm9tIGluY29taW5nIHNjYW4uCiAgKiBAYnVmZmVyX2xpc3Q6CVtJTlRFUk5dIGVudHJ5IGluIHRoZSBkZXZpY2VzIGxpc3Qgb2YgY3VycmVudCBidWZmZXJzLgogICogQHJlZjoJCVtJTlRFUk5dIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgYnVmZmVyLgorICogQHdhdGVybWFyazoJCVtJTlRFUk5dIG51bWJlciBvZiBkYXR1bXMgdG8gd2FpdCBmb3IgcG9sbC9yZWFkLgogICovCiBzdHJ1Y3QgaWlvX2J1ZmZlciB7CiAJaW50CQkJCQlsZW5ndGg7CkBAIC05MCw2ICs5MSw3IEBACiAJdm9pZAkJCQkJKmRlbXV4X2JvdW5jZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkJYnVmZmVyX2xpc3Q7CiAJc3RydWN0IGtyZWYJCQkJcmVmOworCXVuc2lnbmVkIGludAkJCQl3YXRlcm1hcms7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL2RhYy9tYXg1MTcuaCBiL2luY2x1ZGUvbGludXgvaWlvL2RhYy9tYXg1MTcuaAppbmRleCBmNmQxZDI1Li43NjY4NzE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby9kYWMvbWF4NTE3LmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vZGFjL21heDUxNy5oCkBAIC05LDcgKzksNyBAQAogI2RlZmluZSBJSU9fREFDX01BWDUxN19IXwogCiBzdHJ1Y3QgbWF4NTE3X3BsYXRmb3JtX2RhdGEgewotCXUxNgkJCQl2cmVmX212WzJdOworCXUxNgkJCQl2cmVmX212WzhdOwogfTsKIAogI2VuZGlmIC8qIElJT19EQUNfTUFYNTE3X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9ldmVudHMuaCBiL2luY2x1ZGUvbGludXgvaWlvL2V2ZW50cy5oCmluZGV4IDAzZmEzMzIuLjhhZDg3ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWlvL2V2ZW50cy5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL2V2ZW50cy5oCkBAIC05LDIyICs5LDggQEAKICNpZm5kZWYgX0lJT19FVkVOVFNfSF8KICNkZWZpbmUgX0lJT19FVkVOVFNfSF8KIAotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9paW8vdHlwZXMuaD4KLQotLyoqCi0gKiBzdHJ1Y3QgaWlvX2V2ZW50X2RhdGEgLSBUaGUgYWN0dWFsIGV2ZW50IGJlaW5nIHB1c2hlZCB0byB1c2Vyc3BhY2UKLSAqIEBpZDoJCWV2ZW50IGlkZW50aWZpZXIKLSAqIEB0aW1lc3RhbXA6CWJlc3QgZXN0aW1hdGUgb2YgdGltZSBvZiBldmVudCBvY2N1cnJlbmNlIChvZnRlbiBmcm9tCi0gKgkJdGhlIGludGVycnVwdCBoYW5kbGVyKQotICovCi1zdHJ1Y3QgaWlvX2V2ZW50X2RhdGEgewotCV9fdTY0CWlkOwotCV9fczY0CXRpbWVzdGFtcDsKLX07Ci0KLSNkZWZpbmUgSUlPX0dFVF9FVkVOVF9GRF9JT0NUTCBfSU9SKCdpJywgMHg5MCwgaW50KQorI2luY2x1ZGUgPHVhcGkvbGludXgvaWlvL2V2ZW50cy5oPgogCiAvKioKICAqIElJT19FVkVOVF9DT0RFKCkgLSBjcmVhdGUgZXZlbnQgaWRlbnRpZmllcgpAQCAtNzAsMTggKzU2LDQgQEAKICNkZWZpbmUgSUlPX1VOTU9EX0VWRU5UX0NPREUoY2hhbl90eXBlLCBudW1iZXIsIHR5cGUsIGRpcmVjdGlvbikJXAogCUlJT19FVkVOVF9DT0RFKGNoYW5fdHlwZSwgMCwgMCwgZGlyZWN0aW9uLCB0eXBlLCBudW1iZXIsIDAsIDApCiAKLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9UWVBFKG1hc2spICgobWFzayA+PiA1NikgJiAweEZGKQotCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElSKG1hc2spICgobWFzayA+PiA0OCkgJiAweDdGKQotCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKG1hc2spICgobWFzayA+PiAzMikgJiAweEZGKQotCi0vKiBFdmVudCBjb2RlIG51bWJlciBleHRyYWN0aW9uIGRlcGVuZHMgb24gd2hpY2ggdHlwZSBvZiBldmVudCB3ZSBoYXZlLgotICogUGVyaGFwcyByZXZpZXcgdGhpcyBmdW5jdGlvbiBpbiB0aGUgZnV0dXJlKi8KLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOKG1hc2spICgoX19zMTYpKG1hc2sgJiAweEZGRkYpKQotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0NIQU4yKG1hc2spICgoX19zMTYpKCgobWFzaykgPj4gMTYpICYgMHhGRkZGKSkKLQotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX01PRElGSUVSKG1hc2spICgobWFzayA+PiA0MCkgJiAweEZGKQotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJRkYobWFzaykgKCgobWFzaykgPj4gNTUpICYgMHgxKQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL2lpby5oIGIvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKaW5kZXggODBkODU1MC4uZDg2Yjc1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKQEAgLTMzOCw2ICszMzgsMTYgQEAKICAqCQkJcHJvdmlkZSBhIGN1c3RvbSBvZl94bGF0ZSBmdW5jdGlvbiB0aGF0IHJlYWRzIHRoZQogICoJCQkqYXJncyogYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGluZGV4IGluIHJlZ2lzdGVyZWQKICAqCQkJSUlPIGNoYW5uZWxzIGFycmF5LgorICogQGh3Zmlmb19zZXRfd2F0ZXJtYXJrOiBmdW5jdGlvbiBwb2ludGVyIHRvIHNldCB0aGUgY3VycmVudCBoYXJkd2FyZQorICoJCQlmaWZvIHdhdGVybWFyayBsZXZlbDsgc2VlIGh3Zmlmb18qIGVudHJpZXMgaW4KKyAqCQkJRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaWlvIGZvciBkZXRhaWxzIG9uCisgKgkJCWhvdyB0aGUgaGFyZHdhcmUgZmlmbyBvcGVyYXRlcworICogQGh3Zmlmb19mbHVzaF90b19idWZmZXI6IGZ1bmN0aW9uIHBvaW50ZXIgdG8gZmx1c2ggdGhlIHNhbXBsZXMgc3RvcmVkCisgKgkJCWluIHRoZSBoYXJkd2FyZSBmaWZvIHRvIHRoZSBkZXZpY2UgYnVmZmVyLiBUaGUgZHJpdmVyCisgKgkJCXNob3VsZCBub3QgZmx1c2ggbW9yZSB0aGFuIGNvdW50IHNhbXBsZXMuIFRoZSBmdW5jdGlvbgorICoJCQltdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZmx1c2hlZCwgMCBpZiBubworICoJCQlzYW1wbGVzIHdlcmUgZmx1c2hlZCBvciBhIG5lZ2F0aXZlIGludGVnZXIgaWYgbm8gc2FtcGxlcworICoJCQl3ZXJlIGZsdXNoZWQgYW5kIHRoZXJlIHdhcyBhbiBlcnJvci4KICAqKi8KIHN0cnVjdCBpaW9faW5mbyB7CiAJc3RydWN0IG1vZHVsZQkJCSpkcml2ZXJfbW9kdWxlOwpAQCAtMzk5LDYgKzQwOSw5IEBACiAJCQkJICB1bnNpZ25lZCAqcmVhZHZhbCk7CiAJaW50ICgqb2ZfeGxhdGUpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQljb25zdCBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICppaW9zcGVjKTsKKwlpbnQgKCpod2ZpZm9fc2V0X3dhdGVybWFyaykoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgdmFsKTsKKwlpbnQgKCpod2ZpZm9fZmx1c2hfdG9fYnVmZmVyKShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGNvdW50KTsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9paW8vdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvaWlvL3R5cGVzLmgKaW5kZXggNTgwZWQ1Yi4uOTQyYjZkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lpby90eXBlcy5oCkBAIC0xMCw3NiArMTAsNyBAQAogI2lmbmRlZiBfSUlPX1RZUEVTX0hfCiAjZGVmaW5lIF9JSU9fVFlQRVNfSF8KIAotZW51bSBpaW9fY2hhbl90eXBlIHsKLQlJSU9fVk9MVEFHRSwKLQlJSU9fQ1VSUkVOVCwKLQlJSU9fUE9XRVIsCi0JSUlPX0FDQ0VMLAotCUlJT19BTkdMX1ZFTCwKLQlJSU9fTUFHTiwKLQlJSU9fTElHSFQsCi0JSUlPX0lOVEVOU0lUWSwKLQlJSU9fUFJPWElNSVRZLAotCUlJT19URU1QLAotCUlJT19JTkNMSSwKLQlJSU9fUk9ULAotCUlJT19BTkdMLAotCUlJT19USU1FU1RBTVAsCi0JSUlPX0NBUEFDSVRBTkNFLAotCUlJT19BTFRWT0xUQUdFLAotCUlJT19DQ1QsCi0JSUlPX1BSRVNTVVJFLAotCUlJT19IVU1JRElUWVJFTEFUSVZFLAotCUlJT19BQ1RJVklUWSwKLQlJSU9fU1RFUFMsCi0JSUlPX0VORVJHWSwKLQlJSU9fRElTVEFOQ0UsCi0JSUlPX1ZFTE9DSVRZLAotfTsKLQotZW51bSBpaW9fbW9kaWZpZXIgewotCUlJT19OT19NT0QsCi0JSUlPX01PRF9YLAotCUlJT19NT0RfWSwKLQlJSU9fTU9EX1osCi0JSUlPX01PRF9YX0FORF9ZLAotCUlJT19NT0RfWF9BTkRfWiwKLQlJSU9fTU9EX1lfQU5EX1osCi0JSUlPX01PRF9YX0FORF9ZX0FORF9aLAotCUlJT19NT0RfWF9PUl9ZLAotCUlJT19NT0RfWF9PUl9aLAotCUlJT19NT0RfWV9PUl9aLAotCUlJT19NT0RfWF9PUl9ZX09SX1osCi0JSUlPX01PRF9MSUdIVF9CT1RILAotCUlJT19NT0RfTElHSFRfSVIsCi0JSUlPX01PRF9ST09UX1NVTV9TUVVBUkVEX1hfWSwKLQlJSU9fTU9EX1NVTV9TUVVBUkVEX1hfWV9aLAotCUlJT19NT0RfTElHSFRfQ0xFQVIsCi0JSUlPX01PRF9MSUdIVF9SRUQsCi0JSUlPX01PRF9MSUdIVF9HUkVFTiwKLQlJSU9fTU9EX0xJR0hUX0JMVUUsCi0JSUlPX01PRF9RVUFURVJOSU9OLAotCUlJT19NT0RfVEVNUF9BTUJJRU5ULAotCUlJT19NT0RfVEVNUF9PQkpFQ1QsCi0JSUlPX01PRF9OT1JUSF9NQUdOLAotCUlJT19NT0RfTk9SVEhfVFJVRSwKLQlJSU9fTU9EX05PUlRIX01BR05fVElMVF9DT01QLAotCUlJT19NT0RfTk9SVEhfVFJVRV9USUxUX0NPTVAsCi0JSUlPX01PRF9SVU5OSU5HLAotCUlJT19NT0RfSk9HR0lORywKLQlJSU9fTU9EX1dBTEtJTkcsCi0JSUlPX01PRF9TVElMTCwKLQlJSU9fTU9EX1JPT1RfU1VNX1NRVUFSRURfWF9ZX1osCi19OwotCi1lbnVtIGlpb19ldmVudF90eXBlIHsKLQlJSU9fRVZfVFlQRV9USFJFU0gsCi0JSUlPX0VWX1RZUEVfTUFHLAotCUlJT19FVl9UWVBFX1JPQywKLQlJSU9fRVZfVFlQRV9USFJFU0hfQURBUFRJVkUsCi0JSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFLAotCUlJT19FVl9UWVBFX0NIQU5HRSwKLX07CisjaW5jbHVkZSA8dWFwaS9saW51eC9paW8vdHlwZXMuaD4KIAogZW51bSBpaW9fZXZlbnRfaW5mbyB7CiAJSUlPX0VWX0lORk9fRU5BQkxFLApAQCAtODgsMTMgKzE5LDYgQEAKIAlJSU9fRVZfSU5GT19QRVJJT0QsCiB9OwogCi1lbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gewotCUlJT19FVl9ESVJfRUlUSEVSLAotCUlJT19FVl9ESVJfUklTSU5HLAotCUlJT19FVl9ESVJfRkFMTElORywKLQlJSU9fRVZfRElSX05PTkUsCi19OwotCiAjZGVmaW5lIElJT19WQUxfSU5UIDEKICNkZWZpbmUgSUlPX1ZBTF9JTlRfUExVU19NSUNSTyAyCiAjZGVmaW5lIElJT19WQUxfSU5UX1BMVVNfTkFOTyAzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtZS5oIGIvaW5jbHVkZS9saW51eC92bWUuaAppbmRleCA4Y2Q2ZjE5Li43OTI0MmU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1lLmgKQEAgLTEzNyw2ICsxMzcsNyBAQAogc3NpemVfdCB2bWVfbWFzdGVyX3dyaXRlKHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCk7CiB1bnNpZ25lZCBpbnQgdm1lX21hc3Rlcl9ybXcoc3RydWN0IHZtZV9yZXNvdXJjZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKIAl1bnNpZ25lZCBpbnQsIGxvZmZfdCk7CitpbnQgdm1lX21hc3Rlcl9tbWFwKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlc291cmNlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiB2b2lkIHZtZV9tYXN0ZXJfZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCiBzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfZG1hX3JlcXVlc3Qoc3RydWN0IHZtZV9kZXYgKiwgdTMyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCmluZGV4IDY4Y2ViOTcuLjM4ZGYyMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZApAQCAtNiw2ICs2LDcgQEAKIGhlYWRlci15ICs9IGR2Yi8KIGhlYWRlci15ICs9IGhkbGMvCiBoZWFkZXIteSArPSBoc2kvCitoZWFkZXIteSArPSBpaW8vCiBoZWFkZXIteSArPSBpc2RuLwogaGVhZGVyLXkgKz0gbW1jLwogaGVhZGVyLXkgKz0gbmZzZC8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9paW8vS2J1aWxkIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lpby9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmNzZkOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9paW8vS2J1aWxkCkBAIC0wLDAgKzEsMyBAQAorIyBVQVBJIEhlYWRlciBleHBvcnQgbGlzdAoraGVhZGVyLXkgKz0gZXZlbnRzLmgKK2hlYWRlci15ICs9IHR5cGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9paW8vZXZlbnRzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWlvL2V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmJkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWlvL2V2ZW50cy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIFRoZSBpbmR1c3RyaWFsIEkvTyAtIGV2ZW50IHBhc3NpbmcgdG8gdXNlcnNwYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX1VBUElfSUlPX0VWRU5UU19IXworI2RlZmluZSBfVUFQSV9JSU9fRVZFTlRTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qKgorICogc3RydWN0IGlpb19ldmVudF9kYXRhIC0gVGhlIGFjdHVhbCBldmVudCBiZWluZyBwdXNoZWQgdG8gdXNlcnNwYWNlCisgKiBAaWQ6CQlldmVudCBpZGVudGlmaWVyCisgKiBAdGltZXN0YW1wOgliZXN0IGVzdGltYXRlIG9mIHRpbWUgb2YgZXZlbnQgb2NjdXJyZW5jZSAob2Z0ZW4gZnJvbQorICoJCXRoZSBpbnRlcnJ1cHQgaGFuZGxlcikKKyAqLworc3RydWN0IGlpb19ldmVudF9kYXRhIHsKKwlfX3U2NAlpZDsKKwlfX3M2NAl0aW1lc3RhbXA7Cit9OworCisjZGVmaW5lIElJT19HRVRfRVZFTlRfRkRfSU9DVEwgX0lPUignaScsIDB4OTAsIGludCkKKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX1RZUEUobWFzaykgKChtYXNrID4+IDU2KSAmIDB4RkYpCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIobWFzaykgKChtYXNrID4+IDQ4KSAmIDB4N0YpCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOX1RZUEUobWFzaykgKChtYXNrID4+IDMyKSAmIDB4RkYpCisKKy8qIEV2ZW50IGNvZGUgbnVtYmVyIGV4dHJhY3Rpb24gZGVwZW5kcyBvbiB3aGljaCB0eXBlIG9mIGV2ZW50IHdlIGhhdmUuCisgKiBQZXJoYXBzIHJldmlldyB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmdXR1cmUqLworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0NIQU4obWFzaykgKChfX3MxNikobWFzayAmIDB4RkZGRikpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTjIobWFzaykgKChfX3MxNikoKChtYXNrKSA+PiAxNikgJiAweEZGRkYpKQorCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTU9ESUZJRVIobWFzaykgKChtYXNrID4+IDQwKSAmIDB4RkYpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElGRihtYXNrKSAoKChtYXNrKSA+PiA1NSkgJiAweDEpCisKKyNlbmRpZiAvKiBfVUFQSV9JSU9fRVZFTlRTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaWlvL3R5cGVzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWlvL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0NjAxOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9paW8vdHlwZXMuaApAQCAtMCwwICsxLDkyIEBACisvKiBpbmR1c3RyaWFsIEkvTyBkYXRhIHR5cGVzIG5lZWRlZCBib3RoIGluIGFuZCBvdXQgb2Yga2VybmVsCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1VBUElfSUlPX1RZUEVTX0hfCisjZGVmaW5lIF9VQVBJX0lJT19UWVBFU19IXworCitlbnVtIGlpb19jaGFuX3R5cGUgeworCUlJT19WT0xUQUdFLAorCUlJT19DVVJSRU5ULAorCUlJT19QT1dFUiwKKwlJSU9fQUNDRUwsCisJSUlPX0FOR0xfVkVMLAorCUlJT19NQUdOLAorCUlJT19MSUdIVCwKKwlJSU9fSU5URU5TSVRZLAorCUlJT19QUk9YSU1JVFksCisJSUlPX1RFTVAsCisJSUlPX0lOQ0xJLAorCUlJT19ST1QsCisJSUlPX0FOR0wsCisJSUlPX1RJTUVTVEFNUCwKKwlJSU9fQ0FQQUNJVEFOQ0UsCisJSUlPX0FMVFZPTFRBR0UsCisJSUlPX0NDVCwKKwlJSU9fUFJFU1NVUkUsCisJSUlPX0hVTUlESVRZUkVMQVRJVkUsCisJSUlPX0FDVElWSVRZLAorCUlJT19TVEVQUywKKwlJSU9fRU5FUkdZLAorCUlJT19ESVNUQU5DRSwKKwlJSU9fVkVMT0NJVFksCit9OworCitlbnVtIGlpb19tb2RpZmllciB7CisJSUlPX05PX01PRCwKKwlJSU9fTU9EX1gsCisJSUlPX01PRF9ZLAorCUlJT19NT0RfWiwKKwlJSU9fTU9EX1hfQU5EX1ksCisJSUlPX01PRF9YX0FORF9aLAorCUlJT19NT0RfWV9BTkRfWiwKKwlJSU9fTU9EX1hfQU5EX1lfQU5EX1osCisJSUlPX01PRF9YX09SX1ksCisJSUlPX01PRF9YX09SX1osCisJSUlPX01PRF9ZX09SX1osCisJSUlPX01PRF9YX09SX1lfT1JfWiwKKwlJSU9fTU9EX0xJR0hUX0JPVEgsCisJSUlPX01PRF9MSUdIVF9JUiwKKwlJSU9fTU9EX1JPT1RfU1VNX1NRVUFSRURfWF9ZLAorCUlJT19NT0RfU1VNX1NRVUFSRURfWF9ZX1osCisJSUlPX01PRF9MSUdIVF9DTEVBUiwKKwlJSU9fTU9EX0xJR0hUX1JFRCwKKwlJSU9fTU9EX0xJR0hUX0dSRUVOLAorCUlJT19NT0RfTElHSFRfQkxVRSwKKwlJSU9fTU9EX1FVQVRFUk5JT04sCisJSUlPX01PRF9URU1QX0FNQklFTlQsCisJSUlPX01PRF9URU1QX09CSkVDVCwKKwlJSU9fTU9EX05PUlRIX01BR04sCisJSUlPX01PRF9OT1JUSF9UUlVFLAorCUlJT19NT0RfTk9SVEhfTUFHTl9USUxUX0NPTVAsCisJSUlPX01PRF9OT1JUSF9UUlVFX1RJTFRfQ09NUCwKKwlJSU9fTU9EX1JVTk5JTkcsCisJSUlPX01PRF9KT0dHSU5HLAorCUlJT19NT0RfV0FMS0lORywKKwlJSU9fTU9EX1NUSUxMLAorCUlJT19NT0RfUk9PVF9TVU1fU1FVQVJFRF9YX1lfWiwKK307CisKK2VudW0gaWlvX2V2ZW50X3R5cGUgeworCUlJT19FVl9UWVBFX1RIUkVTSCwKKwlJSU9fRVZfVFlQRV9NQUcsCisJSUlPX0VWX1RZUEVfUk9DLAorCUlJT19FVl9UWVBFX1RIUkVTSF9BREFQVElWRSwKKwlJSU9fRVZfVFlQRV9NQUdfQURBUFRJVkUsCisJSUlPX0VWX1RZUEVfQ0hBTkdFLAorfTsKKworZW51bSBpaW9fZXZlbnRfZGlyZWN0aW9uIHsKKwlJSU9fRVZfRElSX0VJVEhFUiwKKwlJSU9fRVZfRElSX1JJU0lORywKKwlJSU9fRVZfRElSX0ZBTExJTkcsCisJSUlPX0VWX0RJUl9OT05FLAorfTsKKworI2VuZGlmIC8qIF9VQVBJX0lJT19UWVBFU19IXyAqLworCmRpZmYgLS1naXQgYS90b29scy9paW8vTWFrZWZpbGUgYi90b29scy9paW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3YWU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lpby9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACitDQyA9IGdjYworQ0ZMQUdTID0gLVdhbGwgLWcgLURfR05VX1NPVVJDRQorCithbGw6IGlpb19ldmVudF9tb25pdG9yIGxzaWlvIGdlbmVyaWNfYnVmZmVyCisKK2lpb19ldmVudF9tb25pdG9yOiBpaW9fZXZlbnRfbW9uaXRvci5vIGlpb191dGlscy5vCisKK2xzaWlvOiBsc2lpby5vIGlpb191dGlscy5vCisKK2dlbmVyaWNfYnVmZmVyOiBnZW5lcmljX2J1ZmZlci5vIGlpb191dGlscy5vCisKKyUubzogJS5jIGlpb191dGlscy5oCisKKy5QSE9OWTogY2xlYW4KK2NsZWFuOgorCXJtIC1mICoubyBpaW9fZXZlbnRfbW9uaXRvciBsc2lpbyBnZW5lcmljX2J1ZmZlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2dlbmVyaWNfYnVmZmVyLmMgYi90b29scy9paW8vZ2VuZXJpY19idWZmZXIuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vZ2VuZXJpY19idWZmZXIuYwpyZW5hbWUgdG8gdG9vbHMvaWlvL2dlbmVyaWNfYnVmZmVyLmMKaW5kZXggZGU0NjQ3ZS4uZjgwNTQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2dlbmVyaWNfYnVmZmVyLmMKKysrIGIvdG9vbHMvaWlvL2dlbmVyaWNfYnVmZmVyLmMKQEAgLTE4LDkgKzE4LDggQEAKICAqCiAgKi8KIAotI2RlZmluZSBfR05VX1NPVVJDRQotCiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNzIsNyArNzEsNyBAQAogCSAqIFNoaWZ0IGJlZm9yZSBjb252ZXJzaW9uIHRvIGF2b2lkIHNpZ24gZXh0ZW5zaW9uCiAJICogb2YgbGVmdCBhbGlnbmVkIGRhdGEKIAkgKi8KLQlpbnB1dCA9IGlucHV0ID4+IGluZm8tPnNoaWZ0OworCWlucHV0ID4+PSBpbmZvLT5zaGlmdDsKIAlpZiAoaW5mby0+aXNfc2lnbmVkKSB7CiAJCWludDE2X3QgdmFsID0gaW5wdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fZXZlbnRfbW9uaXRvci5jIGIvdG9vbHMvaWlvL2lpb19ldmVudF9tb25pdG9yLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb19ldmVudF9tb25pdG9yLmMKcmVuYW1lIHRvIHRvb2xzL2lpby9paW9fZXZlbnRfbW9uaXRvci5jCmluZGV4IDcyYzk2YWEuLjQyN2MyNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fZXZlbnRfbW9uaXRvci5jCisrKyBiL3Rvb2xzL2lpby9paW9fZXZlbnRfbW9uaXRvci5jCkBAIC0xNiw5ICsxNiw4IEBACiAgKgogICovCiAKLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLQogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC0yOCw2ICsyNyw3IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSAiaWlvX3V0aWxzLmgiCiAjaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90eXBlcy5oPgogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW10gPSB7CiAJW0lJT19WT0xUQUdFXSA9ICJ2b2x0YWdlIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fdXRpbHMuaCBiL3Rvb2xzL2lpby9paW9fdXRpbHMuYwpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmgKcmVuYW1lIHRvIHRvb2xzL2lpby9paW9fdXRpbHMuYwppbmRleCA1NjhlZmYwLi42ZjY0NTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmgKKysrIGIvdG9vbHMvaWlvL2lpb191dGlscy5jCkBAIC02LDM3ICs2LDQ4IEBACiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpZm5kZWYgX0lJT19VVElMU19ICisjZGVmaW5lIF9JSU9fVVRJTFNfSAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+Ci0KLS8qIE1hZGUgdXAgdmFsdWUgdG8gbGltaXQgYWxsb2NhdGlvbiBzaXplcyAqLwotI2RlZmluZSBJSU9fTUFYX05BTUVfTEVOR1RIIDMwCi0KLSNkZWZpbmUgRk9STUFUX1NDQU5fRUxFTUVOVFNfRElSICIlcy9zY2FuX2VsZW1lbnRzIgotI2RlZmluZSBGT1JNQVRfVFlQRV9GSUxFICIlc190eXBlIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiaWlvX3V0aWxzLmgiCiAKIGNvbnN0IGNoYXIgKmlpb19kaXIgPSAiL3N5cy9idXMvaWlvL2RldmljZXMvIjsKIAorc3RhdGljIGNoYXIgKiBjb25zdCBpaW9fZGlyZWN0aW9uW10gPSB7CisJImluIiwKKwkib3V0IiwKK307CisKIC8qKgogICogaWlvdXRpbHNfYnJlYWtfdXBfbmFtZSgpIC0gZXh0cmFjdCBnZW5lcmljIG5hbWUgZnJvbSBmdWxsIGNoYW5uZWwgbmFtZQogICogQGZ1bGxfbmFtZTogdGhlIGZ1bGwgY2hhbm5lbCBuYW1lCiAgKiBAZ2VuZXJpY19uYW1lOiB0aGUgb3V0cHV0IGdlbmVyaWMgY2hhbm5lbCBuYW1lCiAgKiovCi1pbmxpbmUgaW50IGlpb3V0aWxzX2JyZWFrX3VwX25hbWUoY29uc3QgY2hhciAqZnVsbF9uYW1lLAoraW50IGlpb3V0aWxzX2JyZWFrX3VwX25hbWUoY29uc3QgY2hhciAqZnVsbF9uYW1lLAogCQkJCSAgY2hhciAqKmdlbmVyaWNfbmFtZSkKIHsKIAljaGFyICpjdXJyZW50OwogCWNoYXIgKncsICpyOwotCWNoYXIgKndvcmtpbmc7CisJY2hhciAqd29ya2luZywgKnByZWZpeCA9ICIiOworCWludCBpOwogCi0JY3VycmVudCA9IHN0cmR1cChmdWxsX25hbWUpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaWlvX2RpcmVjdGlvbikgLyBzaXplb2YoaWlvX2RpcmVjdGlvblswXSk7IGkrKykKKwkJaWYgKCFzdHJuY21wKGZ1bGxfbmFtZSwgaWlvX2RpcmVjdGlvbltpXSwKKwkJCSAgICAgc3RybGVuKGlpb19kaXJlY3Rpb25baV0pKSkgeworCQkJcHJlZml4ID0gaWlvX2RpcmVjdGlvbltpXTsKKwkJCWJyZWFrOworCQl9CisKKwljdXJyZW50ID0gc3RyZHVwKGZ1bGxfbmFtZSArIHN0cmxlbihwcmVmaXgpICsgMSk7CiAJd29ya2luZyA9IHN0cnRvayhjdXJyZW50LCAiX1wwIik7CisKIAl3ID0gd29ya2luZzsKIAlyID0gd29ya2luZzsKIApAQCAtNDgsNDAgKzU5LDEzIEBACiAJCXIrKzsKIAl9CiAJKncgPSAnXDAnOwotCSpnZW5lcmljX25hbWUgPSBzdHJkdXAod29ya2luZyk7CisJYXNwcmludGYoZ2VuZXJpY19uYW1lLCAiJXNfJXMiLCBwcmVmaXgsIHdvcmtpbmcpOwogCWZyZWUoY3VycmVudCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAtIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gY2hhbm5lbAotICogQG5hbWU6IGNoYW5uZWwgbmFtZQotICogQGdlbmVyaWNfbmFtZTogZ2VuZXJhbCBuYW1lIGZvciBjaGFubmVsIHR5cGUKLSAqIEBzY2FsZTogc2NhbGUgZmFjdG9yIHRvIGJlIGFwcGxpZWQgZm9yIGNvbnZlcnNpb24gdG8gc2kgdW5pdHMKLSAqIEBvZmZzZXQ6IG9mZnNldCB0byBiZSBhcHBsaWVkIGZvciBjb252ZXJzaW9uIHRvIHNpIHVuaXRzCi0gKiBAaW5kZXg6IHRoZSBjaGFubmVsIGluZGV4IGluIHRoZSBidWZmZXIgb3V0cHV0Ci0gKiBAYnl0ZXM6IG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBpbiBidWZmZXIgb3V0cHV0Ci0gKiBAbWFzazogYSBiaXQgbWFzayBmb3IgdGhlIHJhdyBvdXRwdXQKLSAqIEBpc19zaWduZWQ6IGlzIHRoZSByYXcgdmFsdWUgc3RvcmVkIHNpZ25lZAotICogQGVuYWJsZWQ6IGlzIHRoaXMgY2hhbm5lbCBlbmFibGVkCi0gKiovCi1zdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpnZW5lcmljX25hbWU7Ci0JZmxvYXQgc2NhbGU7Ci0JZmxvYXQgb2Zmc2V0OwotCXVuc2lnbmVkIGluZGV4OwotCXVuc2lnbmVkIGJ5dGVzOwotCXVuc2lnbmVkIGJpdHNfdXNlZDsKLQl1bnNpZ25lZCBzaGlmdDsKLQl1aW50NjRfdCBtYXNrOwotCXVuc2lnbmVkIGJlOwotCXVuc2lnbmVkIGlzX3NpZ25lZDsKLQl1bnNpZ25lZCBsb2NhdGlvbjsKLX07Ci0KLS8qKgogICogaWlvdXRpbHNfZ2V0X3R5cGUoKSAtIGZpbmQgYW5kIHByb2Nlc3MgX3R5cGUgYXR0cmlidXRlIGRhdGEKICAqIEBpc19zaWduZWQ6IG91dHB1dCB3aGV0aGVyIGNoYW5uZWwgaXMgc2lnbmVkCiAgKiBAYnl0ZXM6IG91dHB1dCBob3cgbWFueSBieXRlcyB0aGUgY2hhbm5lbCBzdG9yYWdlIG9jY3VwaWVzCkBAIC05MSw3ICs3NSw3IEBACiAgKiBAbmFtZTogdGhlIGNoYW5uZWwgbmFtZQogICogQGdlbmVyaWNfbmFtZTogdGhlIGNoYW5uZWwgdHlwZSBuYW1lCiAgKiovCi1pbmxpbmUgaW50IGlpb3V0aWxzX2dldF90eXBlKHVuc2lnbmVkICppc19zaWduZWQsCitpbnQgaWlvdXRpbHNfZ2V0X3R5cGUodW5zaWduZWQgKmlzX3NpZ25lZCwKIAkJCSAgICAgdW5zaWduZWQgKmJ5dGVzLAogCQkJICAgICB1bnNpZ25lZCAqYml0c191c2VkLAogCQkJICAgICB1bnNpZ25lZCAqc2hpZnQsCkBAIC0xOTUsNyArMTc5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbmxpbmUgaW50IGlpb3V0aWxzX2dldF9wYXJhbV9mbG9hdChmbG9hdCAqb3V0cHV0LAoraW50IGlpb3V0aWxzX2dldF9wYXJhbV9mbG9hdChmbG9hdCAqb3V0cHV0LAogCQkJCSAgICBjb25zdCBjaGFyICpwYXJhbV9uYW1lLAogCQkJCSAgICBjb25zdCBjaGFyICpkZXZpY2VfZGlyLAogCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLApAQCAtMjU5LDcgKzI0Myw3IEBACiAgKgogICoqLwogCi1pbmxpbmUgdm9pZCBic29ydF9jaGFubmVsX2FycmF5X2J5X2luZGV4KHN0cnVjdCBpaW9fY2hhbm5lbF9pbmZvICoqY2lfYXJyYXksCit2b2lkIGJzb3J0X2NoYW5uZWxfYXJyYXlfYnlfaW5kZXgoc3RydWN0IGlpb19jaGFubmVsX2luZm8gKipjaV9hcnJheSwKIAkJCQkJIGludCBjbnQpCiB7CiAKQEAgLTI4MCw3ICsyNjQsNyBAQAogICogQGRldmljZV9kaXI6IHRoZSBJSU8gZGV2aWNlIGRpcmVjdG9yeSBpbiBzeXNmcwogICogQAogICoqLwotaW5saW5lIGludCBidWlsZF9jaGFubmVsX2FycmF5KGNvbnN0IGNoYXIgKmRldmljZV9kaXIsCitpbnQgYnVpbGRfY2hhbm5lbF9hcnJheShjb25zdCBjaGFyICpkZXZpY2VfZGlyLAogCQkJICAgICAgc3RydWN0IGlpb19jaGFubmVsX2luZm8gKipjaV9hcnJheSwKIAkJCSAgICAgIGludCAqY291bnRlcikKIHsKQEAgLTQ0Myw3ICs0MjcsNyBAQAogICoKICAqIFR5cGljYWwgdHlwZXMgdGhpcyBpcyB1c2VkIGZvciBhcmUgZGV2aWNlIGFuZCB0cmlnZ2VyLgogICoqLwotaW5saW5lIGludCBmaW5kX3R5cGVfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKQoraW50IGZpbmRfdHlwZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpCiB7CiAJY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OwogCWludCBudW1iZXIsIG51bXN0cmxlbjsKQEAgLTUwMiw3ICs0ODYsNyBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1pbmxpbmUgaW50IF93cml0ZV9zeXNmc19pbnQoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VkaXIsIGludCB2YWwsIGludCB2ZXJpZnkpCitpbnQgX3dyaXRlX3N5c2ZzX2ludChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgaW50IHZhbCwgaW50IHZlcmlmeSkKIHsKIAlpbnQgcmV0ID0gMDsKIAlGSUxFICpzeXNmc2ZwOwpAQCAtNjgxLDMgKzY2NSw1IEBACiAJZnJlZSh0ZW1wKTsKIAlyZXR1cm4gcmV0OwogfQorCisjZW5kaWYgLyogX0lJT19VVElMU19IICovCmRpZmYgLS1naXQgYS90b29scy9paW8vaWlvX3V0aWxzLmggYi90b29scy9paW8vaWlvX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjODM3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lpby9paW9fdXRpbHMuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9JSU9fVVRJTFNfSF8KKyNkZWZpbmUgX0lJT19VVElMU19IXworCisvKiBJSU8gLSB1c2VmdWwgc2V0IG9mIHV0aWwgZnVuY3Rpb25hbGl0eQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBKb25hdGhhbiBDYW1lcm9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIE1hZGUgdXAgdmFsdWUgdG8gbGltaXQgYWxsb2NhdGlvbiBzaXplcyAqLworI2RlZmluZSBJSU9fTUFYX05BTUVfTEVOR1RIIDMwCisKKyNkZWZpbmUgRk9STUFUX1NDQU5fRUxFTUVOVFNfRElSICIlcy9zY2FuX2VsZW1lbnRzIgorI2RlZmluZSBGT1JNQVRfVFlQRV9GSUxFICIlc190eXBlIgorCitleHRlcm4gY29uc3QgY2hhciAqaWlvX2RpcjsKKworLyoqCisgKiBzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAtIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gY2hhbm5lbAorICogQG5hbWU6IGNoYW5uZWwgbmFtZQorICogQGdlbmVyaWNfbmFtZTogZ2VuZXJhbCBuYW1lIGZvciBjaGFubmVsIHR5cGUKKyAqIEBzY2FsZTogc2NhbGUgZmFjdG9yIHRvIGJlIGFwcGxpZWQgZm9yIGNvbnZlcnNpb24gdG8gc2kgdW5pdHMKKyAqIEBvZmZzZXQ6IG9mZnNldCB0byBiZSBhcHBsaWVkIGZvciBjb252ZXJzaW9uIHRvIHNpIHVuaXRzCisgKiBAaW5kZXg6IHRoZSBjaGFubmVsIGluZGV4IGluIHRoZSBidWZmZXIgb3V0cHV0CisgKiBAYnl0ZXM6IG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBpbiBidWZmZXIgb3V0cHV0CisgKiBAbWFzazogYSBiaXQgbWFzayBmb3IgdGhlIHJhdyBvdXRwdXQKKyAqIEBpc19zaWduZWQ6IGlzIHRoZSByYXcgdmFsdWUgc3RvcmVkIHNpZ25lZAorICogQGVuYWJsZWQ6IGlzIHRoaXMgY2hhbm5lbCBlbmFibGVkCisgKiovCitzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyB7CisJY2hhciAqbmFtZTsKKwljaGFyICpnZW5lcmljX25hbWU7CisJZmxvYXQgc2NhbGU7CisJZmxvYXQgb2Zmc2V0OworCXVuc2lnbmVkIGluZGV4OworCXVuc2lnbmVkIGJ5dGVzOworCXVuc2lnbmVkIGJpdHNfdXNlZDsKKwl1bnNpZ25lZCBzaGlmdDsKKwl1aW50NjRfdCBtYXNrOworCXVuc2lnbmVkIGJlOworCXVuc2lnbmVkIGlzX3NpZ25lZDsKKwl1bnNpZ25lZCBsb2NhdGlvbjsKK307CisKK2ludCBpaW91dGlsc19icmVha191cF9uYW1lKGNvbnN0IGNoYXIgKmZ1bGxfbmFtZSwgY2hhciAqKmdlbmVyaWNfbmFtZSk7CitpbnQgaWlvdXRpbHNfZ2V0X3R5cGUodW5zaWduZWQgKmlzX3NpZ25lZCwgdW5zaWduZWQgKmJ5dGVzLAorCQkJCQkgIHVuc2lnbmVkICpiaXRzX3VzZWQsIHVuc2lnbmVkICpzaGlmdCwKKwkJCQkJICB1aW50NjRfdCAqbWFzaywgdW5zaWduZWQgKmJlLAorCQkJCQkgIGNvbnN0IGNoYXIgKmRldmljZV9kaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgY29uc3QgY2hhciAqZ2VuZXJpY19uYW1lKTsKK2ludCBpaW91dGlsc19nZXRfcGFyYW1fZmxvYXQoZmxvYXQgKm91dHB1dCwgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwKKwkJCQkJCQkgY29uc3QgY2hhciAqZGV2aWNlX2RpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCQkgY29uc3QgY2hhciAqZ2VuZXJpY19uYW1lKTsKK3ZvaWQgYnNvcnRfY2hhbm5lbF9hcnJheV9ieV9pbmRleChzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqKmNpX2FycmF5LCBpbnQgY250KTsKK2ludCBidWlsZF9jaGFubmVsX2FycmF5KGNvbnN0IGNoYXIgKmRldmljZV9kaXIsCisJCQkJCQlzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqKmNpX2FycmF5LCBpbnQgKmNvdW50ZXIpOworaW50IGZpbmRfdHlwZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpOworaW50IHdyaXRlX3N5c2ZzX2ludChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgaW50IHZhbCk7CitpbnQgd3JpdGVfc3lzZnNfaW50X2FuZF92ZXJpZnkoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VkaXIsIGludCB2YWwpOworaW50IHdyaXRlX3N5c2ZzX3N0cmluZ19hbmRfdmVyaWZ5KGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBjaGFyICp2YWwpOworaW50IHdyaXRlX3N5c2ZzX3N0cmluZyhjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgY2hhciAqdmFsKTsKK2ludCByZWFkX3N5c2ZzX3Bvc2ludChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpcik7CitpbnQgcmVhZF9zeXNmc19mbG9hdChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgZmxvYXQgKnZhbCk7CitpbnQgcmVhZF9zeXNmc19zdHJpbmcoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmJhc2VkaXIsIGNoYXIgKnN0cik7CisKKyNlbmRpZiAvKiBfSUlPX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vbHNpaW8uYyBiL3Rvb2xzL2lpby9sc2lpby5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9sc2lpby5jCnJlbmFtZSB0byB0b29scy9paW8vbHNpaW8uYwppbmRleCA5OGEwZGUwLi5jNTg1NDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vbHNpaW8uYworKysgYi90b29scy9paW8vbHNpaW8uYwpAQCAtOTUsMTIgKzk1LDcgQEAKIHN0YXRpYyB2b2lkIGR1bXBfZGV2aWNlcyh2b2lkKQogewogCWNvbnN0IHN0cnVjdCBkaXJlbnQgKmVudDsKLQlpbnQgbnVtYmVyLCBudW1zdHJsZW47Ci0KLQlGSUxFICpuYW1lRmlsZTsKIAlESVIgKmRwOwotCWNoYXIgdGhpc25hbWVbSUlPX01BWF9OQU1FX0xFTkdUSF07Ci0JY2hhciAqZmlsZW5hbWU7CiAKIAlkcCA9IG9wZW5kaXIoaWlvX2Rpcik7CiAJaWYgKGRwID09IE5VTEwpIHsK