ZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX3NwdW5rL2ZsYXNoLmMgYi9ib2FyZC9zYzUyMF9zcHVuay9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWY3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYzUyMF9zcHVuay9mbGFzaC5jCkBAIC0wLDAgKzEsODEzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyLCAyMDAzCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UKKyAqIAorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgorCisjZGVmaW5lIFBST0JFX0JVRkZFUl9TSVpFIDEwMjQKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltQUk9CRV9CVUZGRVJfU0laRV07CisKKworI2RlZmluZSBTQzUyMF9NQVhfRkxBU0hfQkFOS1MgIDEKKyNkZWZpbmUgU0M1MjBfRkxBU0hfQkFOSzBfQkFTRSAweDM4MDAwMDAwICAvKiBCT09UQ1MgKi8KKyNkZWZpbmUgU0M1MjBfRkxBU0hfQkFOS1NJWkUgICAweDgwMDAwMDAKKworI2RlZmluZSBBMjlMVjY0MURIX1NJWkUgICAgICAgIDB4ODAwMDAwCisjZGVmaW5lIEEyOUxWNjQxREhfU0VDVE9SUyAgICAgMTI4CisKKyNkZWZpbmUgQTI5TFY2NDFNSF9TSVpFICAgICAgICAweDgwMDAwMAorI2RlZmluZSBBMjlMVjY0MU1IX1NFQ1RPUlMgICAgIDEyOAorCisjZGVmaW5lIEkyOEYzMjBKM0FfU0laRSAgICAgICAgMHg0MDAwMDAKKyNkZWZpbmUgSTI4RjMyMEozQV9TRUNUT1JTICAgICAzMgorCisjZGVmaW5lIEkyOEY2NDBKM0FfU0laRSAgICAgICAgMHg4MDAwMDAKKyNkZWZpbmUgSTI4RjY0MEozQV9TRUNUT1JTICAgICA2NAorCisjZGVmaW5lIEkyOEYxMjhKM0FfU0laRSAgICAgICAgMHgxMDAwMDAwCisjZGVmaW5lIEkyOEYxMjhKM0FfU0VDVE9SUyAgICAgMTI4CisKK2ZsYXNoX2luZm9fdCAgICBmbGFzaF9pbmZvW1NDNTIwX01BWF9GTEFTSF9CQU5LU107CisKKyNkZWZpbmUgUkVBRFkgMQorI2RlZmluZSBFUlIgICAyCisjZGVmaW5lIFRNTyAgIDQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKworc3RhdGljIHUzMiBfcHJvYmVfZmxhc2godTMyIGFkZHIsIHUzMiBidywgaW50IGlsKQoreworCXUzMiByZXN1bHQ9MDsKKwkKKwkvKiBGaXJzdCBkbyBhbiB1bmxvY2sgY3ljbGUgZm9yIHRoZSBiZW5lZml0IG9mCisJICogZGV2aWNlcyB0aGF0IG5lZWQgaXQgKi8KKwkKKwlzd2l0Y2ggKGJ3KSB7CisJCQorCWNhc2UgMToKKwkJKih2b2xhdGlsZSB1OCopKGFkZHIrMHg1NTU1KSA9IDB4YWE7CisJCSoodm9sYXRpbGUgdTgqKShhZGRyKzB4MmFhYSkgPSAweDU1OworCQkqKHZvbGF0aWxlIHU4KikoYWRkcisweDU1NTUpID0gMHg5MDsKKwkJCisJCS8qIFJlYWQgdmVuZG9yICovCisJCXJlc3VsdCA9ICoodm9sYXRpbGUgdTgqKWFkZHI7CisJCXJlc3VsdCA8PD0gMTY7CisJCQorCQkvKiBSZWFkIGRldmljZSAqLworCQlyZXN1bHQgfD0gKih2b2xhdGlsZSB1OCopKGFkZHIrMik7CisJCQorCQkvKiBSZXR1cm4gZGV2aWNlIHRvIGRhdGEgbW9kZSAqLworCQkqKHZvbGF0aWxlIHU4KilhZGRyID0gMHhmZjsKKwkJKih2b2xhdGlsZSB1OCopKGFkZHIrMHg1NTU1KSwgMHhmMDsgIAorCQlicmVhazsKKwkJCisJY2FzZSAyOgorCQkqKHZvbGF0aWxlIHUxNiopKGFkZHIrMHhhYWFhKSA9IDB4YWFhYTsKKwkJKih2b2xhdGlsZSB1MTYqKShhZGRyKzB4NTU1NCkgPSAweDU1NTU7CisJCQorCQkvKiBJc3N1ZSBpZGVudGlmaWNhdGlvbiBjb21tYW5kICovCisJCWlmIChpbCA9PSAyKSB7CisJCQkqKHZvbGF0aWxlIHUxNiopKGFkZHIrMHhhYWFhKSA9IDB4OTA5MDsKKwkJCQorCQkJLyogUmVhZCB2ZW5kb3IgKi8KKwkJCXJlc3VsdCA9ICoodm9sYXRpbGUgdTgqKWFkZHI7CisJCQlyZXN1bHQgPDw9IDE2OworCQkJCisJCQkvKiBSZWFkIGRldmljZSAqLworCQkJcmVzdWx0IHw9ICoodm9sYXRpbGUgdTgqKShhZGRyKzIpOworCQkJCisJCQkvKiBSZXR1cm4gZGV2aWNlIHRvIGRhdGEgbW9kZSAqLworCQkJKih2b2xhdGlsZSB1MTYqKWFkZHIgPSAgMHhmZmZmOworCQkJKih2b2xhdGlsZSB1MTYqKShhZGRyKzB4YWFhYSksIDB4ZjBmMDsgIAorCQkJCisJCX0gZWxzZSB7CisJCQkqKHZvbGF0aWxlIHU4KikoYWRkcisweGFhYWEpID0gMHg5MDsKKwkJCS8qIFJlYWQgdmVuZG9yICovCisJCQlyZXN1bHQgPSAqKHZvbGF0aWxlIHUxNiopYWRkcjsKKwkJCXJlc3VsdCA8PD0gMTY7CisJCQkKKwkJCS8qIFJlYWQgZGV2aWNlICovCisJCQlyZXN1bHQgfD0gKih2b2xhdGlsZSB1MTYqKShhZGRyKzIpOworCQkJCisJCQkvKiBSZXR1cm4gZGV2aWNlIHRvIGRhdGEgbW9kZSAqLworCQkJKih2b2xhdGlsZSB1OCopYWRkciA9IDB4ZmY7CisJCQkqKHZvbGF0aWxlIHU4KikoYWRkcisweGFhYWEpLCAweGYwOyAgCQkJCisJCX0KKwkJCisJCWJyZWFrOworCQkKKwkgY2FzZSA0OgorCQkqKHZvbGF0aWxlIHUzMiopKGFkZHIrMHg1NTU0KSA9IDB4YWFhYWFhYWE7CisJCSoodm9sYXRpbGUgdTMyKikoYWRkcisweGFhYTgpID0gMHg1NTU1NTU1NTsKKwkJCisJCXN3aXRjaCAoaWwpIHsKKwkJY2FzZSAxOgorCQkJLyogSXNzdWUgaWRlbnRpZmljYXRpb24gY29tbWFuZCAqLworCQkJKih2b2xhdGlsZSB1OCopKGFkZHIrMHg1NTU0KSA9IDB4OTA7CisJCQkKKwkJCS8qIFJlYWQgdmVuZG9yICovCisJCQlyZXN1bHQgPSAqKHZvbGF0aWxlIHUxNiopYWRkcjsKKwkJCXJlc3VsdCA8PD0gMTY7CisJCQorCQkJLyogUmVhZCBkZXZpY2UgKi8KKwkJCXJlc3VsdCB8PSAqKHZvbGF0aWxlIHUxNiopKGFkZHIrNCk7CisJCQkKKwkJCS8qIFJldHVybiBkZXZpY2UgdG8gZGF0YSBtb2RlICovCisJCQkqKHZvbGF0aWxlIHU4KilhZGRyID0gIDB4ZmY7CisJCQkqKHZvbGF0aWxlIHU4KikoYWRkcisweDU1NTQpLCAweGYwOyAgCisJCQlicmVhazsKKwkJCQorCQljYXNlIDI6CisJCQkvKiBJc3N1ZSBpZGVudGlmaWNhdGlvbiBjb21tYW5kICovCisJCQkqKHZvbGF0aWxlIHUzMiopKGFkZHIgKyAweDU1NTQpID0gMHgwMDkwMDA5MDsKKwkJCQorCQkJLyogUmVhZCB2ZW5kb3IgKi8KKwkJCXJlc3VsdCA9ICoodm9sYXRpbGUgdTE2KilhZGRyOworCQkJcmVzdWx0IDw8PSAxNjsKKwkJCQorCQkJLyogUmVhZCBkZXZpY2UgKi8KKwkJCXJlc3VsdCB8PSAqKHZvbGF0aWxlIHUxNiopKGFkZHIrNCk7CisJCQkKKwkJCS8qIFJldHVybiBkZXZpY2UgdG8gZGF0YSBtb2RlICovCisJCQkqKHZvbGF0aWxlIHUzMiopYWRkciA9ICAweDAwZmYwMGZmOworCQkJKih2b2xhdGlsZSB1MzIqKShhZGRyKzB4NTU1NCksIDB4MDBmMDAwZjA7ICAKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgNDoKKwkJCS8qIElzc3VlIGlkZW50aWZpY2F0aW9uIGNvbW1hbmQgKi8KKwkJCSoodm9sYXRpbGUgdTMyKikoYWRkcisweDU1NTQpID0gMHg5MDkwOTA5MDsKKwkJCQorCQkJLyogUmVhZCB2ZW5kb3IgKi8KKwkJCXJlc3VsdCA9ICoodm9sYXRpbGUgdTgqKWFkZHI7CisJCQlyZXN1bHQgPDw9IDE2OworCQkJCisJCQkvKiBSZWFkIGRldmljZSAqLworCQkJcmVzdWx0IHw9ICoodm9sYXRpbGUgdTgqKShhZGRyKzQpOworCQkJCisJCQkvKiBSZXR1cm4gZGV2aWNlIHRvIGRhdGEgbW9kZSAqLworCQkJKih2b2xhdGlsZSB1MzIqKWFkZHIgPSAgMHhmZmZmZmZmZjsKKwkJCSoodm9sYXRpbGUgdTMyKikoYWRkcisweDU1NTQpLCAweGYwZjBmMGYwOyAKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwkKKwkKKwkKKwlyZXR1cm4gcmVzdWx0OworfQorCitleHRlcm4gaW50IF9wcm9iZV9mbGFzaF9lbmQ7Cithc20gKCJfcHJvYmVfZmxhc2hfZW5kOlxuIgorICAgICAiLmxvbmcgMFxuIik7CisKK3N0YXRpYyBpbnQgaWRlbnRpZnlfZmxhc2godW5zaWduZWQgYWRkcmVzcywgaW50IHdpZHRoKQoreworCWludCBpczsJCisJaW50IGRldmljZTsKKwlpbnQgdmVuZG9yOwkKKwlpbnQgc2l6ZTsKKwl1bnNpZ25lZCByZXM7CisJCisJdTMyICgqX3Byb2JlX2ZsYXNoX3B0cikodTMyIGEsIHUzMiBidywgaW50IGlsKTsKKwkKKwlzaXplID0gKHVuc2lnbmVkKSZfcHJvYmVfZmxhc2hfZW5kIC0gKHVuc2lnbmVkKV9wcm9iZV9mbGFzaDsgCisJCisJaWYgKHNpemUgPiBQUk9CRV9CVUZGRVJfU0laRSkgeworCQlwcmludGYoIl9wcm9iZV9mbGFzaCgpIHJvdXRpbmUgdG9vIGxhcmdlICglZCkgJXAgLSAlcFxuIiwKKwkJICAgICAgIHNpemUsICZfcHJvYmVfZmxhc2hfZW5kLCBfcHJvYmVfZmxhc2gpOworCQlyZXR1cm4gMDsKKwl9CisJCisJbWVtY3B5KGJ1ZmZlciwgX3Byb2JlX2ZsYXNoLCBzaXplKTsKKwlfcHJvYmVfZmxhc2hfcHRyID0gKHZvaWQqKWJ1ZmZlcjsKKwkKKwlpcyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCXJlcyA9IF9wcm9iZV9mbGFzaF9wdHIoYWRkcmVzcywgd2lkdGgsIDEpOworCWlmIChpcykgeworCQllbmFibGVfaW50ZXJydXB0cygpOworCX0KKwkKKwkKKyAgICAgICAgdmVuZG9yID0gcmVzID4+IDE2OworCWRldmljZSA9IHJlcyAmIDB4ZmZmZjsKKwkKKwkJCisJcmV0dXJuIHJlczsKK30KKwordWxvbmcgZmxhc2hfaW5pdCh2b2lkKQoreworCWludCBpLCBqOworCXVsb25nIHNpemUgPSAwOworCQorCWZvciAoaSA9IDA7IGkgPCBTQzUyMF9NQVhfRkxBU0hfQkFOS1M7IGkrKykgeworCQl1bnNpZ25lZCBpZDsKKwkJdWxvbmcgZmxhc2hiYXNlID0gMDsKKwkJaW50IHNlY3RzaXplID0gMDsgCisJCQorCQltZW1zZXQoZmxhc2hfaW5mb1tpXS5wcm90ZWN0LCAwLCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJZmxhc2hiYXNlID0gU0M1MjBfRkxBU0hfQkFOSzBfQkFTRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGFuaWMoImNvbmZpZ3VyZWQgdG8gbWFueSBmbGFzaCBiYW5rcyFcbiIpOworCQl9CisJCQorCQlpZCA9IGlkZW50aWZ5X2ZsYXNoKGZsYXNoYmFzZSwgMik7CisJCXN3aXRjaCAoaWQpIHsKKwkJY2FzZSAweDAwMDEyMmQ3OgorCQkJLyogMjlMVjY0MURIICovCisJCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0KKwkJCQkoQU1EX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spIHwKKwkJCQkoQU1EX0lEX0xWNjQwVSAmIEZMQVNIX1RZUEVNQVNLKTsKKwkJCQorCQkJZmxhc2hfaW5mb1tpXS5zaXplID0gQTI5TFY2NDFESF9TSVpFOworCQkJZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQgPSBBMjlMVjY0MURIX1NFQ1RPUlM7CisJCQlzZWN0c2l6ZSA9IEEyOUxWNjQxREhfU0laRS9BMjlMVjY0MURIX1NFQ1RPUlM7CisJCQlwcmludGYoIkJhbmsgJWQ6IEFNRCAyOUxWNjQxREhcbiIsIGkpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSAweDAwMDEyMjdFOgorCQkJLyogMjlMVjY0MU1IICovCisJCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0KKwkJCQkoQU1EX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spIHwKKwkJCQkoQU1EX0lEX0RMNjQwICYgRkxBU0hfVFlQRU1BU0spOworCQkJCisJCQlmbGFzaF9pbmZvW2ldLnNpemUgPSBBMjlMVjY0MU1IX1NJWkU7CisJCQlmbGFzaF9pbmZvW2ldLnNlY3Rvcl9jb3VudCA9IEEyOUxWNjQxTUhfU0VDVE9SUzsKKwkJCXNlY3RzaXplID0gQTI5TFY2NDFNSF9TSVpFL0EyOUxWNjQxTUhfU0VDVE9SUzsKKwkJCXByaW50ZigiQmFuayAlZDogQU1EIDI5TFY2NDFNSFxuIiwgaSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDB4MDA4OTAwMTY6CisJCQkvKiAyOEYzMjBKM0EgKi8KKwkJCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPQorCQkJCShJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSB8CisJCQkJKElOVEVMX0lEXzI4RjMyMEozQSAmIEZMQVNIX1RZUEVNQVNLKTsKKwkJCQorCQkJZmxhc2hfaW5mb1tpXS5zaXplID0gSTI4RjMyMEozQV9TSVpFOworCQkJZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQgPSBJMjhGMzIwSjNBX1NFQ1RPUlM7CisJCQlzZWN0c2l6ZSA9IEkyOEYzMjBKM0FfU0laRS9JMjhGMzIwSjNBX1NFQ1RPUlM7CisJCQlwcmludGYoIkJhbmsgJWQ6IEludGVsIDI4RjMyMEozQVxuIiwgaSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDB4MDA4OTAwMTc6CisJCQkvKiAyOEY2NDBKM0EgKi8KKwkJCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPQorCQkJCShJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSB8CisJCQkJKElOVEVMX0lEXzI4RjY0MEozQSAmIEZMQVNIX1RZUEVNQVNLKTsKKwkJCQorCQkJZmxhc2hfaW5mb1tpXS5zaXplID0gSTI4RjY0MEozQV9TSVpFOworCQkJZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQgPSBJMjhGNjQwSjNBX1NFQ1RPUlM7CisJCQlzZWN0c2l6ZSA9IEkyOEY2NDBKM0FfU0laRS9JMjhGNjQwSjNBX1NFQ1RPUlM7CisJCQlwcmludGYoIkJhbmsgJWQ6IEludGVsIDI4RjY0MEozQVxuIiwgaSk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDB4MDA4OTAwMTg6CisJCQkvKiAyOEYxMjhKM0EgKi8KKwkJCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPQorCQkJCShJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSB8CisJCQkJKElOVEVMX0lEXzI4RjEyOEozQSAmIEZMQVNIX1RZUEVNQVNLKTsKKwkJCQorCQkJZmxhc2hfaW5mb1tpXS5zaXplID0gSTI4RjEyOEozQV9TSVpFOworCQkJZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQgPSBJMjhGMTI4SjNBX1NFQ1RPUlM7CisJCQlzZWN0c2l6ZSA9IEkyOEYxMjhKM0FfU0laRS9JMjhGMTI4SjNBX1NFQ1RPUlM7CisJCQlwcmludGYoIkJhbmsgJWQ6IEludGVsIDI4RjEyOEozQVxuIiwgaSk7CisJCQlicmVhazsKKwkJCQorCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJCYW5rICVkIGhhdmUgdW5rbm93biBmbGFzaCAlMDh4XG4iLCBpLCBpZCk7CisJCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlmb3IgKGogPSAwOyBqIDwgZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQ7IGorKykgeworCQkJZmxhc2hfaW5mb1tpXS5zdGFydFtqXSA9IGZsYXNoYmFzZSArIGogKiBzZWN0c2l6ZTsKKwkJfQorCQlzaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKKwkJCisJCWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX0NMRUFSLAorCQkJICAgICAgZmxhc2hfaW5mb1tpXS5zdGFydFswXSwKKwkJCSAgICAgICBmbGFzaF9pbmZvW2ldLnN0YXJ0WzBdICsgZmxhc2hfaW5mb1tpXS5zaXplIC0gMSwKKwkJCSAgICAgICZmbGFzaF9pbmZvW2ldKTsKKwl9CisJCisJLyoKKwkgKiBQcm90ZWN0IG1vbml0b3IgYW5kIGVudmlyb25tZW50IHNlY3RvcnMKKwkgKi8KKwlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCSAgICAgIGkzODZib290X3N0YXJ0LAorCQkgICAgICBpMzg2Ym9vdF9lbmQsCisJCSAgICAgICZmbGFzaF9pbmZvWzBdKTsKKyNpZmRlZiBDRkdfRU5WX0FERFIKKwlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCSAgICAgIENGR19FTlZfQUREUiwKKwkJICAgICAgQ0ZHX0VOVl9BRERSICsgQ0ZHX0VOVl9TSVpFIC0gMSwKKwkJICAgICAgJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCQorCXJldHVybiBzaXplOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyhmbGFzaF9pbmZvX3QgKmluZm8pCit7CisJaW50IGk7CisJCisJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSB7CisJY2FzZSAoSU5URUxfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSyk6CisJCXByaW50ZigiSU5URUw6ICIpOworCQlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwkJY2FzZSAoSU5URUxfSURfMjhGMzIwSjNBICYgRkxBU0hfVFlQRU1BU0spOgorCQkJcHJpbnRmKCIxeCBJMjhGMzIwSjNBICgzMk1iaXQpXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIChJTlRFTF9JRF8yOEY2NDBKM0EgJiBGTEFTSF9UWVBFTUFTSyk6CisJCQlwcmludGYoIjF4IEkyOEY2NDBKM0EgKDY0TWJpdClcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgKElOVEVMX0lEXzI4RjEyOEozQSAmIEZMQVNIX1RZUEVNQVNLKToKKwkJCXByaW50ZigiMXggSTI4RjEyOEozQSAoMTI4TWJpdClcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIlVua25vd24gQ2hpcCBUeXBlXG4iKTsKKwkJCWdvdG8gZG9uZTsKKwkJCWJyZWFrOworCQl9CisJCQorCQlicmVhazsKKwkJCisJY2FzZSAoQU1EX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spOgorCQlwcmludGYoIkFNRDogICAiKTsKKwkJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSB7CisJCWNhc2UgKEFNRF9JRF9MVjY0MFUgJiBGTEFTSF9UWVBFTUFTSyk6CisJCQlwcmludGYoIjF4IEFNRDI5TFY2NDFESCAoNjRNYml0KVxuIik7CisJCQlicmVhazsKKwkJY2FzZSAoQU1EX0lEX0RMNjQwICYgRkxBU0hfVFlQRU1BU0spOgorCQkJcHJpbnRmKCIxeCBBTUQyOUxWNjQxTUggKDY0TWJpdClcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIlVua25vd24gQ2hpcCBUeXBlXG4iKTsKKwkJCWdvdG8gZG9uZTsKKwkJCWJyZWFrOworCQl9CisJCQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gVmVuZG9yICIpOworCQlicmVhazsKKwl9CisJCisJCisJcHJpbnRmKCIgIFNpemU6ICVsZCBNQiBpbiAlZCBTZWN0b3JzXG4iLAorCSAgICAgICBpbmZvLT5zaXplID4+IDIwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCQorCXByaW50ZigiICBTZWN0b3IgU3RhcnQgQWRkcmVzc2VzOiIpOworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQlpZiAoKGkgJSA1KSA9PSAwKSB7CisJCQlwcmludGYgKCJcbiAgICIpOworCQl9CisJCXByaW50ZiAoIiAlMDhsWCVzIiwgaW5mby0+c3RhcnRbaV0sCisJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOworCX0KKwlwcmludGYgKCJcbiIpOworCQorCWRvbmU6Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisKK3N0YXRpYyB1MzIgX2FtZF9lcmFzZV9mbGFzaCh1MzIgYWRkciwgdTMyIHNlY3RvcikKK3sKKwl1bnNpZ25lZCBlbGFwc2VkOworCQorCS8qIElzc3VlIGVyYXNlICovCisJKih2b2xhdGlsZSB1MTYqKShhZGRyICsgMHhhYWFhKSA9IDB4MDBBQTsKKwkqKHZvbGF0aWxlIHUxNiopKGFkZHIgKyAweDU1NTQpID0gMHgwMDU1OworCSoodm9sYXRpbGUgdTE2KikoYWRkciArIDB4YWFhYSkgPSAweDAwODA7CisJLyogQW5kIG9uZSB1bmxvY2sgKi8KKwkqKHZvbGF0aWxlIHUxNiopKGFkZHIgKyAweGFhYWEpID0gMHgwMEFBOworCSoodm9sYXRpbGUgdTE2KikoYWRkciArIDB4NTU1NCkgPSAweDAwNTU7CisJLyogU2VjdG9yIGVyYXNlIGNvbW1hbmQgY29tZXMgbGFzdCAqLworCSoodm9sYXRpbGUgdTE2KikoYWRkciArIHNlY3RvcikgPSAweDAwMzA7CisJCisJZWxhcHNlZCA9ICoodm9sYXRpbGUgdTE2KikoMHhmZmZlZjAwMCtTQzUyMF9TV1RNUk1JTExJKTsgLyogZHVtbXkgcmVhZCAqLworCWVsYXBzZWQgPSAwOworCXdoaWxlICgoKCoodm9sYXRpbGUgdTE2KikoYWRkciArIHNlY3RvcikpICYgMHgwMDgwKSAhPSAweDAwODApIHsKKwkJCisJCWVsYXBzZWQgKz0gKih2b2xhdGlsZSB1MTYqKSgweGZmZmVmMDAwK1NDNTIwX1NXVE1STUlMTEkpOworCQlpZiAoZWxhcHNlZCA+ICgoQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQvQ0ZHX0haKSAqIDEwMDApKSB7CisJCQkqKHZvbGF0aWxlIHUxNiopKGFkZHIpID0gMHgwMGYwOworCQkJcmV0dXJuIDE7CQkJCisJCX0KKwl9CisJCisJKih2b2xhdGlsZSB1MTYqKShhZGRyKSA9IDB4MDBmMDsKKwkKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGludCBfYW1kX2VyYXNlX2ZsYXNoX2VuZDsKK2FzbSAoIl9hbWRfZXJhc2VfZmxhc2hfZW5kOlxuIgorICAgICAiLmxvbmcgMFxuIik7CisKKy8qIHRoaXMgbmVlZHMgdG8gYmUgaW5saW5lZCwgdGhlIFNXVE1STU1JTExJIHJlZ2lzdGVyIGlzIHJlc2V0IGJ5IGVhY2ggcmVhZCAqLworI2RlZmluZSBfX3VkZWxheShkZWxheSkgXAorewlcCisJdW5zaWduZWQgbWljcm87IFwKKwl1bnNpZ25lZCBtaWxsaT0wOyBcCisJXAorCW1pY3JvID0gKih2b2xhdGlsZSB1MTYqKSgweGZmZmVmMDAwK1NDNTIwX1NXVE1STUlMTEkpOyBcCisgICAgICAgICBcCisJZm9yICg7OykgeyBcCisJCVwKKwkJbWlsbGkgKz0gKih2b2xhdGlsZSB1MTYqKSgweGZmZmVmMDAwK1NDNTIwX1NXVE1STUlMTEkpOyBcCisJCW1pY3JvID0gKih2b2xhdGlsZSB1MTYqKSgweGZmZmVmMDAwK1NDNTIwX1NXVE1STUlDUk8pOyBcCisJCVwKKwkJaWYgKChkZWxheSkgPD0gKG1pY3JvICsgKG1pbGxpICogMTAwMCkpKSB7IFwKKwkJCWJyZWFrOyBcCisJCX0gXAorCX0gXAorfSB3aGlsZSAoMCkgCisKK3N0YXRpYyB1MzIgX2ludGVsX2VyYXNlX2ZsYXNoKHUzMiBhZGRyLCB1MzIgc2VjdG9yKQorewkKKwl1bnNpZ25lZCBlbGFwc2VkOworCQorCSoodm9sYXRpbGUgdTE2KikoYWRkciArIHNlY3RvcikgPSAweDAwNTA7ICAgLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyICovCisJKih2b2xhdGlsZSB1MTYqKShhZGRyICsgc2VjdG9yKSA9IDB4MDAyMDsgICAvKiBlcmFzZSBzZXR1cCAqLworCSoodm9sYXRpbGUgdTE2KikoYWRkciArIHNlY3RvcikgPSAweDAwRDA7ICAgLyogZXJhc2UgY29uZmlybSAqLworCisJCisJLyogV2FpdCBhdCBsZWFzdCA4MHVzIC0gbGV0J3Mgd2FpdCAxIG1zICovCisJX191ZGVsYXkoMTAwMCk7CisJCisJZWxhcHNlZCA9IDA7CisJd2hpbGUgKCgoKih2b2xhdGlsZSB1MTYqKShhZGRyICsgc2VjdG9yKSkgJiAweDAwODApICE9IDB4MDA4MCkgeworCQllbGFwc2VkICs9ICoodm9sYXRpbGUgdTE2KikoMHhmZmZlZjAwMCtTQzUyMF9TV1RNUk1JTExJKTsKKwkJaWYgKGVsYXBzZWQgPiAoKENGR19GTEFTSF9FUkFTRV9UT1VUL0NGR19IWikgKiAxMDAwKSkgeworCQkJKih2b2xhdGlsZSB1MTYqKShhZGRyICsgc2VjdG9yKSA9IDB4MDBCMDsgIC8qIHN1c3BlbmQgZXJhc2UgICAgICAqLworCQkJKih2b2xhdGlsZSB1MTYqKShhZGRyICsgc2VjdG9yKSA9IDB4MDBGRjsgIC8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCQkJcmV0dXJuIDE7CQkJCisJCX0KKwl9CisJCisJKih2b2xhdGlsZSB1MTYqKShhZGRyICsgc2VjdG9yKSA9IDB4MDBGRjsgIC8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCQorCXJldHVybiAwOworfQorCisKK2V4dGVybiBpbnQgX2ludGVsX2VyYXNlX2ZsYXNoX2VuZDsKK2FzbSAoIl9pbnRlbF9lcmFzZV9mbGFzaF9lbmQ6XG4iCisgICAgICIubG9uZyAwXG4iKTsKKworaW50IGZsYXNoX2VyYXNlKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisJdTMyICgqX2VyYXNlX2ZsYXNoX3B0cikodTMyIGEsIHUzMiBzbyk7CisJaW50IHByb3Q7CisJaW50IHNlY3Q7CisJdW5zaWduZWQgc2l6ZTsKKwkKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZigiLSBtaXNzaW5nXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiLSBubyBzZWN0b3JzIHRvIGVyYXNlXG4iKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJCisJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSA9PSAoQU1EX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spKSB7CisJCXNpemUgPSAodW5zaWduZWQpJl9hbWRfZXJhc2VfZmxhc2hfZW5kIC0gKHVuc2lnbmVkKV9hbWRfZXJhc2VfZmxhc2g7IAorCQkKKwkJaWYgKHNpemUgPiBQUk9CRV9CVUZGRVJfU0laRSkgeworCQkJcHJpbnRmKCJfYW1kX2VyYXNlX2ZsYXNoKCkgcm91dGluZSB0b28gbGFyZ2UgKCVkKSAlcCAtICVwXG4iLAorCQkJICAgICAgIHNpemUsICZfYW1kX2VyYXNlX2ZsYXNoX2VuZCwgX2FtZF9lcmFzZV9mbGFzaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJbWVtY3B5KGJ1ZmZlciwgX2FtZF9lcmFzZV9mbGFzaCwgc2l6ZSk7CisJCV9lcmFzZV9mbGFzaF9wdHIgPSAodm9pZCopYnVmZmVyOworCQorCX0gZWxzZSBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IChJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSkgeworCQlzaXplID0gKHVuc2lnbmVkKSZfaW50ZWxfZXJhc2VfZmxhc2hfZW5kIC0gKHVuc2lnbmVkKV9pbnRlbF9lcmFzZV9mbGFzaDsgCisJCQorCQlpZiAoc2l6ZSA+IFBST0JFX0JVRkZFUl9TSVpFKSB7CisJCQlwcmludGYoIl9pbnRlbF9lcmFzZV9mbGFzaCgpIHJvdXRpbmUgdG9vIGxhcmdlICglZCkgJXAgLSAlcFxuIiwKKwkJCSAgICAgICBzaXplLCAmX2ludGVsX2VyYXNlX2ZsYXNoX2VuZCwgX2ludGVsX2VyYXNlX2ZsYXNoKTsKKwkJCXJldHVybiAwOworCQl9CisJCQorCQltZW1jcHkoYnVmZmVyLCBfaW50ZWxfZXJhc2VfZmxhc2gsIHNpemUpOworCQlfZXJhc2VfZmxhc2hfcHRyID0gKHZvaWQqKWJ1ZmZlcjsKKwl9IGVsc2UgeworCQlwcmludGYgKCJDYW4ndCBlcmFzZSB1bmtub3duIGZsYXNoIHR5cGUgLSBhYm9ydGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCXByb3QgPSAwOworCWZvciAoc2VjdD1zX2ZpcnN0OyBzZWN0PD1zX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCQorCWlmIChwcm90KSB7CisJCXByaW50ZiAoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvcnMgd2lsbCBub3QgYmUgZXJhc2VkIVxuIiwgcHJvdCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiXG4iKTsKKwl9CisJCQorCQorCS8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0PD1zX2xhc3Q7IHNlY3QrKykgeworCQkKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgeyAvKiBub3QgcHJvdGVjdGVkICovCisJCQlpbnQgcmVzOworCQkJaW50IGZsYWc7CisJCQkKKwkJCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCQkJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCQkJCisJCQlyZXMgPSBfZXJhc2VfZmxhc2hfcHRyKGluZm8tPnN0YXJ0WzBdLCBpbmZvLT5zdGFydFtzZWN0XS1pbmZvLT5zdGFydFswXSk7CisJCQkKKwkJCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKGZsYWcpIHsKKwkJCQllbmFibGVfaW50ZXJydXB0cygpOworCQkJfQorCQkJCisJCQkKKwkJCWlmIChyZXMpIHsKKwkJCQlwcmludGYoIkVyYXNlIHRpbWVkIG91dCwgc2VjdG9yICVkXG4iLCBzZWN0KTsKKwkJCQlyZXR1cm4gcmVzOworCQkJfQorCQkJCisJCQlwdXRjKCcuJyk7CQkJCisJCX0JCQorCX0KKworCQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXcml0ZSBhIHdvcmQgdG8gRmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCitzdGF0aWMgaW50IF9hbWRfd3JpdGVfd29yZCh1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZGVzdCwgdW5zaWduZWQgZGF0YSkKK3sKKwl2b2xhdGlsZSB1MTYgKmFkZHIyID0gKHUxNiopc3RhcnQ7CisJdm9sYXRpbGUgdTE2ICpkZXN0MiA9ICh1MTYqKWRlc3Q7CisJdm9sYXRpbGUgdTE2ICpkYXRhMiA9ICh1MTYqKSZkYXRhOworCWludCBpOworCXVuc2lnbmVkIGVsYXBzZWQ7CisJCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJaWYgKCgqKCh2b2xhdGlsZSB1MTYqKWRlc3QpICYgKHUxNilkYXRhKSAhPSAodTE2KWRhdGEpIHsKKwkJcmV0dXJuIDI7CisJfQorCQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCisJCQorCQlhZGRyMlsweDU1NTVdID0gMHgwMEFBOworCQlhZGRyMlsweDJhYWFdID0gMHgwMDU1OworCQlhZGRyMlsweDU1NTVdID0gMHgwMEEwOworCQkKKwkJZGVzdDJbaV0gPSAoZGF0YSA+PiAoaSoxNikpICYgMHhmZmZmOworCQkKKwkJZWxhcHNlZCA9ICoodm9sYXRpbGUgdTE2KikoMHhmZmZlZjAwMCtTQzUyMF9TV1RNUk1JTExJKTsgLyogZHVtbXkgcmVhZCAqLworCQllbGFwc2VkID0gMDsKKwkJCisJCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwkJd2hpbGUgKChkZXN0MltpXSAmIDB4MDA4MCkgIT0gKGRhdGEyW2ldICYgMHgwMDgwKSkgeworCQkJZWxhcHNlZCArPSAqKHZvbGF0aWxlIHUxNiopKDB4ZmZmZWYwMDArU0M1MjBfU1dUTVJNSUxMSSk7CisJCQlpZiAoZWxhcHNlZCA+ICgoQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQvQ0ZHX0haKSAqIDEwMDApKSB7CisJCQkJYWRkcjJbaV0gPSAweDAwZjA7CisJCQkJcmV0dXJuIDE7CQkJCisJCQl9CisJCX0KKwl9CisJCisJYWRkcjJbaV0gPSAweDAwZjA7CisJCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgX2FtZF93cml0ZV93b3JkX2VuZDsKK2FzbSAoIl9hbWRfd3JpdGVfd29yZF9lbmQ6XG4iCisgICAgICIubG9uZyAwXG4iKTsKKworCisKK3N0YXRpYyBpbnQgX2ludGVsX3dyaXRlX3dvcmQodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGRlc3QsIHVuc2lnbmVkIGRhdGEpCit7CisJaW50IGk7CisJdW5zaWduZWQgZWxhcHNlZDsKKwkKKwkvKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQgKi8KKwlpZiAoKCooKHZvbGF0aWxlIHUxNiopZGVzdCkgJiAodTE2KWRhdGEpICE9ICh1MTYpZGF0YSkgeworCQlyZXR1cm4gMjsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkKKwkJKih2b2xhdGlsZSB1MTYqKShkZXN0KzIqaSkgPSAweDAwNDA7IC8qIHdyaXRlIHNldHVwICovCQkKKwkJKih2b2xhdGlsZSB1MTYqKShkZXN0KzIqaSkgPSAoZGF0YSA+PiAoaSoxNikpICYgMHhmZmZmOworCQkKKwkJZWxhcHNlZCA9ICoodm9sYXRpbGUgdTE2KikoMHhmZmZlZjAwMCtTQzUyMF9TV1RNUk1JTExJKTsgLyogZHVtbXkgcmVhZCAqLworCQllbGFwc2VkID0gMDsKKwkJCisJCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwkJd2hpbGUgKCgqKHZvbGF0aWxlIHUxNiopZGVzdCAmIDB4MDA4MCkgIT0gMHgwMDgwKSB7CisJCQllbGFwc2VkICs9ICoodm9sYXRpbGUgdTE2KikoMHhmZmZlZjAwMCtTQzUyMF9TV1RNUk1JTExJKTsKKwkJCWlmIChlbGFwc2VkID4gKChDRkdfRkxBU0hfV1JJVEVfVE9VVC9DRkdfSFopICogMTAwMCkpIHsKKwkJCQkqKHZvbGF0aWxlIHUxNiopZGVzdCA9IDB4MDBmZjsKKwkJCQlyZXR1cm4gMTsJCQkKKwkJCX0KKwkJfQorCX0KKwkKKwkqKHZvbGF0aWxlIHUxNiopZGVzdCA9IDB4MDBmZjsKKwkKKwkKKwlyZXR1cm4gMDsKKworfQorCitleHRlcm4gaW50IF9pbnRlbF93cml0ZV93b3JkX2VuZDsKK2FzbSAoIl9pbnRlbF93cml0ZV93b3JkX2VuZDpcbiIKKyAgICAgIi5sb25nIDBcbiIpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHkgbWVtb3J5IHRvIGZsYXNoLCByZXR1cm5zOgorICogMCAtIE9LCisgKiAxIC0gd3JpdGUgdGltZW91dAorICogMiAtIEZsYXNoIG5vdCBlcmFzZWQKKyAqIDMgLSBVbnN1cHBvcnRlZCBmbGFzaCB0eXBlCisgKi8KKworaW50IHdyaXRlX2J1ZmYoZmxhc2hfaW5mb190ICppbmZvLCB1Y2hhciAqc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisJdWxvbmcgY3AsIHdwLCBkYXRhOworCWludCBpLCBsLCByYzsKKwlpbnQgZmxhZzsKKwl1MzIgKCpfd3JpdGVfd29yZF9wdHIpKHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBkZXN0LCB1bnNpZ25lZCBkYXRhKTsKKwl1bnNpZ25lZCBzaXplOworCQorCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gKEFNRF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSkgeworCQlzaXplID0gKHVuc2lnbmVkKSZfYW1kX3dyaXRlX3dvcmRfZW5kIC0gKHVuc2lnbmVkKV9hbWRfd3JpdGVfd29yZDsgCisJCQorCQlpZiAoc2l6ZSA+IFBST0JFX0JVRkZFUl9TSVpFKSB7CisJCQlwcmludGYoIl9hbWRfd3JpdGVfd29yZCgpIHJvdXRpbmUgdG9vIGxhcmdlICglZCkgJXAgLSAlcFxuIiwKKwkJCSAgICAgICBzaXplLCAmX2FtZF93cml0ZV93b3JkX2VuZCwgX2FtZF93cml0ZV93b3JkKTsKKwkJCXJldHVybiAwOworCQl9CisJCQorCQltZW1jcHkoYnVmZmVyLCBfYW1kX3dyaXRlX3dvcmQsIHNpemUpOworCQlfd3JpdGVfd29yZF9wdHIgPSAodm9pZCopYnVmZmVyOworCQorCX0gZWxzZSBpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IChJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSkgeworCQlzaXplID0gKHVuc2lnbmVkKSZfaW50ZWxfd3JpdGVfd29yZF9lbmQgLSAodW5zaWduZWQpX2ludGVsX3dyaXRlX3dvcmQ7IAorCQkKKwkJaWYgKHNpemUgPiBQUk9CRV9CVUZGRVJfU0laRSkgeworCQkJcHJpbnRmKCJfaW50ZWxfd3JpdGVfd29yZCgpIHJvdXRpbmUgdG9vIGxhcmdlICglZCkgJXAgLSAlcFxuIiwKKwkJCSAgICAgICBzaXplLCAmX2ludGVsX3dyaXRlX3dvcmRfZW5kLCBfaW50ZWxfd3JpdGVfd29yZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJbWVtY3B5KGJ1ZmZlciwgX2ludGVsX3dyaXRlX3dvcmQsIHNpemUpOworCQlfd3JpdGVfd29yZF9wdHIgPSAodm9pZCopYnVmZmVyOworCX0gZWxzZSB7CisJCXByaW50ZiAoIkNhbid0IHByb2dyYW0gdW5rbm93biBmbGFzaCB0eXBlIC0gYWJvcnRlZFxuIik7CisJCXJldHVybiAzOworCX0KKworCisJd3AgPSAoYWRkciAmIH4zKTsJLyogZ2V0IGxvd2VyIHdvcmQgYWxpZ25lZCBhZGRyZXNzICovCisJCisKKwkvKgorCSAqIGhhbmRsZSB1bmFsaWduZWQgc3RhcnQgYnl0ZXMKKwkgKi8KKwlpZiAoKGwgPSBhZGRyIC0gd3ApICE9IDApIHsKKwkJZGF0YSA9IDA7CisJCWZvciAoaT0wLCBjcD13cDsgaTxsOyArK2ksICsrY3ApIHsKKwkJCWRhdGEgfD0gKCoodWNoYXIgKiljcCkgPDwgKDgqaSk7CisJCX0KKwkJZm9yICg7IGk8NCAmJiBjbnQ+MDsgKytpKSB7CisJCQlkYXRhIHw9ICpzcmMrKyA8PCAoOCppKTsKKwkJCS0tY250OworCQkJKytjcDsKKwkJfQorCQlmb3IgKDsgY250PT0wICYmIGk8NDsgKytpLCArK2NwKSB7CisJCQlkYXRhIHw9ICgqKHVjaGFyICopY3ApICA8PCAoOCppKTsKKwkJfQorCQkKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKwkJCisJCXJjID0gX3dyaXRlX3dvcmRfcHRyKGluZm8tPnN0YXJ0WzBdLCB3cCwgZGF0YSk7CisJCQorCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKGZsYWcpIHsKKwkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCX0KKwkJaWYgKHJjICE9IDApIHsKKwkJCXJldHVybiByYzsKKwkJfQorCQl3cCArPSA0OworCX0KKwkKKwkvKgorCSAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorCSAqLworCXdoaWxlIChjbnQgPj0gNCkgeworCQlkYXRhID0gMDsKKwkJCSAgICAgICAKKwkJZm9yIChpPTA7IGk8NDsgKytpKSB7CisJCQlkYXRhIHw9ICpzcmMrKyA8PCAoOCppKTsKKwkJfQorCQkKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCQlyYyA9IF93cml0ZV93b3JkX3B0cihpbmZvLT5zdGFydFswXSwgd3AsIGRhdGEpOworCQkKKwkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChmbGFnKSB7CisJCQllbmFibGVfaW50ZXJydXB0cygpOworCQl9CisJCWlmIChyYyAhPSAwKSB7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJd3AgICs9IDQ7CisJCWNudCAtPSA0OworCX0KKwkKKwlpZiAoY250ID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpPTAsIGNwPXdwOyBpPDQgJiYgY250PjA7ICsraSwgKytjcCkgeworCQlkYXRhIHw9ICpzcmMrKyA8PCAoOCppKTsKKwkJLS1jbnQ7CisJfQorCQorCWZvciAoOyBpPDQ7ICsraSwgKytjcCkgeworCQlkYXRhIHw9ICgqKHVjaGFyICopY3ApIDw8ICg4KmkpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCXJjID0gX3dyaXRlX3dvcmRfcHRyKGluZm8tPnN0YXJ0WzBdLCB3cCwgZGF0YSk7CisJCisJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGZsYWcpIHsKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKwl9CisJCisJcmV0dXJuIHJjOworCQorfQorCisK