ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJ2b2ljZS92b2ljZS5jIGIvYXAvbGliL2xpYnZvaWNlL3ZvaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWRjMWU3NQotLS0gL2Rldi9udWxsCisrKyBiL2FwL2xpYi9saWJ2b2ljZS92b2ljZS5jCkBAIC0wLDAgKzEsMzI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKiCw5sioy/nT0CAoQykyMDE1LCDW0NDLzajRtrnJt93T0M/euavLvqGjDQorKiogDQorKiogzsS8/sP7s8Y6ICAgICB2b2ljZS5jDQorKiogzsS8/rHqyrY6ICAgICANCisqKiDE2sjd1arSqjogICAgDQorKiogyrnTw7e9t6g6ICAgICANCisqKiANCisqKiDQ3rjEyNXG2iAgICAgICAgsOaxvrrFICAgICAg0N64xLHqvMcgICAgICAgINDeuMTIyyAgICAgICAgICDQ3rjExNrI3Q0KKyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorKiogMjAxOS8wOS8yNSAgICAgVjEuMCAgICAgICAgQ3JlYXRlICAgICAgICAgIHh4cSAgICAgICAgtLS9qA0KKyoqIA0KKyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDx1bmlzdGQuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKw0KKyNpbmNsdWRlIDxzdGRpbnQuaD4NCisjaW5jbHVkZSA8bGludXgvdm9sdGVfZHJ2Lmg+DQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKyNpbmNsdWRlIDx0aW55YWxzYS9hdWRpb19taXhlcl9jdHJsLmg+DQorI2luY2x1ZGUgInZvaWNlX2xpYi5oIg0KKw0KKyNkZWZpbmUgVk9JQ0VfREVWX05BTUUgIi9kZXYvdm9pY2VfZGV2aWNlIg0KKw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisJaW50IGZkOw0KKwl1bnNpZ25lZCBpbnQgc3RhdGU7IC8vIDAgY2xvc2U7MSBvcGVuDQorCVRfVm9pY2VfUGFyYSB2cGFyYTsNCit9IFRfdm9pY2VJbmZvOw0KKw0KK1Rfdm9pY2VJbmZvICp2b2ljZWluZm8gPSBOVUxMOw0KKw0KK3N0YXRpYyBpbnQgc2xpY19mbGFnID0gMDsNCitzdGF0aWMgaW50IHNsaWNfZmxhZ19hbHJlYWR5ID0gMDsvLyAwIG5vdCBnZXQgLDEgYWxyZWFkeSBnZXQNCisNCitzdHJ1Y3QgcGNtICAqdm9sdGVfcGNtX3ZvaWNlX291dCA9IE5VTEw7DQorc3RydWN0IHBjbSAgKnZvbHRlX3BjbV92b2ljZV9pbiA9IE5VTEw7DQorDQorI2lmIDANCisNCisNCitUX1ZvaWNlX1BhcmEgZ3NtaHdwYXJhID0gew0KKwk4MDAwLCAgLy84MDAwOzE2MDAwDQorCTAsIC8vLy8gMCBnc207MSB0ZDsyIHdjZG1hOzMgbHRlDQorCTAvLzAgaGFyZHdhcmUgZHNwOzEgc29mdCBhbXIgbGliDQorfTsNCisNCitUX1ZvaWNlX1BhcmEgdGRuYmh3cGFyYSA9IHsNCisJODAwMCwgIC8vODAwMDsxNjAwMA0KKwkxLCAvLy8vIDAgZ3NtOzEgdGQ7MiB3Y2RtYTszIGx0ZQ0KKwkwLC8vMCBhbXItbmI7MSBhbXItd2INCisJMC8vMCBoYXJkd2FyZSBkc3A7MSBzb2Z0IGFtciBsaWINCit9Ow0KKw0KK1RfVm9pY2VfUGFyYSB0ZG5ic2ZwYXJhID0gew0KKwk4MDAwLCAgLy84MDAwOzE2MDAwDQorCTEsIC8vLy8gMCBnc207MSB0ZDsyIHdjZG1hOzMgbHRlDQorCTAsLy8wIGFtci1uYjsxIGFtci13Yg0KKwkxLy8wIGhhcmR3YXJlIGRzcDsxIHNvZnQgYW1yIGxpYg0KK307DQorDQorVF9Wb2ljZV9QYXJhIHRkd2JzZnBhcmEgPSB7DQorCTgwMDAsICAvLzgwMDA7MTYwMDANCisJMSwgLy8vLyAwIGdzbTsxIHRkOzIgd2NkbWE7MyBsdGUNCisJMSwvLzAgYW1yLW5iOzEgYW1yLXdiDQorCTEvLzAgaGFyZHdhcmUgZHNwOzEgc29mdCBhbXIgbGliDQorfTsNCisNCisNCisjZW5kaWYNCisvL3N0YXRpYyB2b2xhdGlsZSBpbnQgdm9pY2VpbmZvLmZkID0gMDsNCisNCisNCitpbnQgdm9pY2Vfb3BlbihUX1ZvaWNlX1BhcmEgKnBhcmEpDQorew0KKwlpbnQgcmV0ID0gMDsNCisJaWYgKCFwYXJhKSB7DQorDQorCQlwcmludGYoInZvaWNlOiBvcGVuIHBhcmEgaXMgTlVMTC5cbiIpOw0KKw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXZvaWNlaW5mbyA9IGNhbGxvYygxLCBzaXplb2YoVF92b2ljZUluZm8pKTsNCisJaWYgKCF2b2ljZWluZm8pIHsNCisNCisJCXByaW50Zigidm9pY2U6IG9wZW4gY2FsbG9jIGZhaWwhXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwl2b2ljZWluZm8tPnZwYXJhID0gKnBhcmE7DQorDQorCXZvaWNlaW5mby0+ZmQgPSBvcGVuKFZPSUNFX0RFVl9OQU1FLCBPX1JET05MWSk7DQorCWlmICh2b2ljZWluZm8tPmZkIDwgMCkgew0KKwkJcHJpbnRmKCJ2b2ljZSBsaWI6IG9wZW4gdm9pY2UgZGV2aWNlIGVycm9yLlxuIik7DQorCQlmcmVlKHZvaWNlaW5mbyk7DQorCQlyZXR1cm4gLTE7DQorDQorCX0NCisNCisNCisJcmV0ID0gaW9jdGwodm9pY2VpbmZvLT5mZCwgVk9JQ0VfSU9DVExfU1RBUlQsIHBhcmEpOw0KKwlpZiAocmV0KSB7DQorCQlwcmludGYoInZvaWNlIGxpYjogdm9pY2Ugc3RhcnQgZmQ9JWQscmV0PSVkLlxuIiwgdm9pY2VpbmZvLT5mZCwgcmV0KTsNCisJCWdvdG8gZXJyOw0KKwl9DQorCXByaW50Zigidm9pY2Ugb3BlbiBlbmQgIVxuIik7DQorDQorCXJldHVybiAwOw0KKw0KK2VycjoNCisJY2xvc2Uodm9pY2VpbmZvLT5mZCk7DQorCWZyZWUodm9pY2VpbmZvKTsNCisJcHJpbnRmKCJ2b2ljZSBvcGVuIGVyciBlbmQgIVxuIik7DQorCXJldHVybiAtMTsNCisNCisNCit9DQorDQorDQoraW50IHZvaWNlX2Nsb3NlKFRfVm9pY2VfUGFyYSAqcGFyYSkNCit7DQorCWludCByZXQgPSAwOw0KKw0KKwlpZiAoIXZvaWNlaW5mbykgew0KKw0KKwkJcHJpbnRmKCJ2b2ljZTogY2xvc2Ugdm9pY2VpbmZvIGlzIE5VbGwhXG4iKTsNCisJCXJldHVybiAwOw0KKwl9DQorDQorCXJldCA9IGlvY3RsKHZvaWNlaW5mby0+ZmQsIFZPSUNFX0lPQ1RMX1NUT1AsIHBhcmEpOw0KKw0KKwlpZiAocmV0KSB7DQorCQlwcmludGYoInZvaWNlIGxpYjogdm9pY2Ugc3RvcCBmZD0lZCxyZXQ9JWQuXG4iLCB2b2ljZWluZm8tPmZkLCByZXQpOw0KKwl9DQorDQorCWlmICh2b2ljZWluZm8tPmZkID49IDApIHsNCisJCWNsb3NlKHZvaWNlaW5mby0+ZmQpOw0KKwl9DQorCXZvaWNlaW5mby0+ZmQgPSAtMTsNCisNCisJZnJlZSh2b2ljZWluZm8pOw0KKwl2b2ljZWluZm8gPSBOVUxMOw0KKw0KKwlwcmludGYoInZvaWNlIGNsb3NlIGVuZCAhXG4iKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK2ludCB2b2ljZV9WcGxvb3AoaW50ICpwYXRoKQ0KK3sNCisJaW50IHJldCA9IDA7DQorCWludCBmZCA9IC0xOw0KKwlwcmludGYoInZvaWNlX1ZwbG9vcDogIHN0YXJ0IHBhdGg9JWQhXG4iLCpwYXRoKTsNCisJZmQgPSBvcGVuKFZPSUNFX0RFVl9OQU1FLCBPX1JET05MWSk7DQorCWlmIChmZCA8IDApIHsNCisJCXByaW50Zigidm9pY2VfVnBsb29wOiBvcGVuIHZvaWNlIGRldmljZSBlcnJvci5cbiIpOw0KKwkJcmV0dXJuICAtMTsNCisJfQ0KKwlyZXQgPSBpb2N0bChmZCwgVk9JQ0VfSU9DVExfVlBMT09QLCBwYXRoKTsNCisJaWYgKHJldCkgew0KKwkJcHJpbnRmKCJ2b2ljZV9WcGxvb3A6ICByZXQ9JWQscGF0aD0lcC5cbiIsIHJldCwgcGF0aCk7DQorCQljbG9zZShmZCk7DQorCQlyZXR1cm4gIC0xOw0KKwl9DQorCWNsb3NlKGZkKTsNCisJcmV0dXJuIDA7DQorDQorfQ0KKw0KK2ludCB2b2ljZV9HZXRTbGljRmxhZyh2b2lkKQ0KK3sNCisJaW50IHJldCA9IDA7DQorCWludCBmZCA9IC0xOw0KKwlpbnQgZmxhZyA9IDA7DQorCXByaW50Zigidm9pY2VfR2V0U2xpY0ZsYWc6ICBzdGFydCFcbiIpOw0KKwlmZCA9IG9wZW4oVk9JQ0VfREVWX05BTUUsIE9fUkRPTkxZKTsNCisJaWYgKGZkIDwgMCkgew0KKwkJcHJpbnRmKCJ2b2ljZV9HZXRTbGljRmxhZzogb3BlbiB2b2ljZSBkZXZpY2UgZXJyb3IuXG4iKTsNCisJCXJldHVybiAgLTE7DQorCX0NCisJcmV0ID0gaW9jdGwoZmQsIFZPSUNFX0lPQ1RMX0dFVF9TTElDX1VTRV9GTEFHLCAmZmxhZyk7DQorCWlmIChyZXQpIHsNCisJCXByaW50Zigidm9pY2VfR2V0U2xpY0ZsYWc6ICByZXQ9JWQsZmxhZz0lZC5cbiIsIHJldCwgZmxhZyk7DQorCQljbG9zZShmZCk7DQorCQlyZXR1cm4gIC0xOw0KKwl9DQorCWNsb3NlKGZkKTsNCisJc2xpY19mbGFnX2FscmVhZHkgPSAxOw0KKwlyZXR1cm4gZmxhZzsNCisNCit9DQorDQoraW50IHpEcnZWb2x0ZV9QcmVPcGVuKFRfWkRydlZvbHRlX0NmZyAqY2ZnUGFyYW0pDQorew0KKw0KKw0KKwlzdHJ1Y3QgbWl4ZXIgKnZvaWNlX21peGVyID0gTlVMTDsNCisJc3RydWN0IHBjbV9jb25maWcgY29uZmlnX3ZvaWNlID0gezB9Ow0KKwlwcmludGYoIiB2b2ljZSBsaWIgekRydlZvbHRlX1ByZU9wZW4hXG4iKTsNCisNCisJaWYgKHNsaWNfZmxhZ19hbHJlYWR5ID09IDEpIHsNCisJCXByaW50ZigiIHZvaWNlICBzbGljIGZsYWcgYWxyZWFkeSBnZXQsIHNsaWNfZmxhZz0lZCFcbiIsIHNsaWNfZmxhZyk7DQorCQlpZiAoc2xpY19mbGFnID09IDEpIHsNCisJCQlyZXR1cm4gMDsNCisJCX0NCisNCisJfSBlbHNlIHsNCisJCXNsaWNfZmxhZyA9IHZvaWNlX0dldFNsaWNGbGFnKCk7DQorCQlwcmludGYoIiB2b2ljZSAgc2xpYyBmbGFnICBnZXQsIHNsaWNfZmxhZz0lZCFcbiIsIHNsaWNfZmxhZyk7DQorCQlpZiAoc2xpY19mbGFnID09IDEpIHsNCisJCQlyZXR1cm4gMDsNCisJCX0NCisJfQ0KKyNpZiBkZWZpbmVkKF9WQlVGRl9JTl9TSU5HTEVfQ09SRSkgfHwgZGVmaW5lZChfVkJVRkZfSU5fTVVMVElfQ09SRSkNCisJcHJpbnRmKCIlczogdXNlIHZvaWNlIGJ1ZmZlcixyZXR1cm4hXG4iLF9fZnVuY19fKTsgDQorCXJldHVybiAwOw0KKw0KKyNlbmRpZgkNCisNCisJLy9vcGVuIG1peGVyIGRldiBmb3IgY29kZWMgY29udHJvbA0KKwl2b2ljZV9taXhlciA9IG1peGVyX29wZW4oMCk7DQorCWlmICghdm9pY2VfbWl4ZXIpIHsNCisJCXByaW50Zigidm9pY2VfbWl4ZXIgb3BlbiBmYWlsZWQhXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwkvL2NvbmZpZyBtaXhlciBkZXYNCisJbWl4X3NldF92b2ljZV9wYXRoKHZvaWNlX21peGVyLCBUX09VVFBVVF9TUEVBS0VSKTsNCisJbWl4X3NldF92b2ljZV92b2wodm9pY2VfbWl4ZXIsIFRfVk9JQ0VfVk9MXzNfTEVWRUwpOw0KKw0KKwkvL2Nsb3NlIG1peGVyDQorCW1peGVyX2Nsb3NlKHZvaWNlX21peGVyKTsNCisJdm9pY2VfbWl4ZXIgPSBOVUxMOw0KKw0KKwkvL29wZW4gcGNtIGRldiBmb3IgZGF0YSB0cmFuZg0KKwljb25maWdfdm9pY2UuY2hhbm5lbHMgPSBjZmdQYXJhbS0+Y2hhbm5lbF9jb3VudDsNCisJY29uZmlnX3ZvaWNlLnJhdGUgPSBjZmdQYXJhbS0+Y2xvY2tfcmF0ZTsNCisJLy9idWZmZXIgbnVtDQorCWNvbmZpZ192b2ljZS5wZXJpb2RfY291bnQgPSAzOw0KKwkvL2J1ZmZlciBzaXplDQorCWNvbmZpZ192b2ljZS5wZXJpb2Rfc2l6ZSA9IGNmZ1BhcmFtLT5zYW1wbGVzX3Blcl9mcmFtZSAqICBjZmdQYXJhbS0+Yml0c19wZXJfc2FtcGxlIC8gODsNCisJLy8xNi1iaXQgc2lnbmVkDQorCWNvbmZpZ192b2ljZS5mb3JtYXQgPSBQQ01fRk9STUFUX1MxNl9MRTsNCisNCisJLy9jYXJkIDAgZGV2IDENCisJLy8yM0cgY2FyZCAwIGRldiAyDQorCXZvbHRlX3BjbV92b2ljZV9vdXQgPSBwY21fb3BlbigwLCAxLCBQQ01fT1VULCAmY29uZmlnX3ZvaWNlKTsNCisJaWYgKCFwY21faXNfcmVhZHkodm9sdGVfcGNtX3ZvaWNlX291dCkpIHsNCisJCXByaW50Zigidm9sdGVfcGNtX3ZvaWNlX291dCBvcGVuIGZhaWxlZCFcbiIpOw0KKwkJZ290byBlcnJfcmV0Ow0KKwl9DQorDQorCXZvbHRlX3BjbV92b2ljZV9pbiA9IHBjbV9vcGVuKDAsIDEsIFBDTV9JTiwgJmNvbmZpZ192b2ljZSk7DQorCWlmICghcGNtX2lzX3JlYWR5KHZvbHRlX3BjbV92b2ljZV9pbikpIHsNCisJCXByaW50Zigidm9sdGVfcGNtX3ZvaWNlX2luIG9wZW4gZmFpbGVkIVxuIik7DQorCQlnb3RvIGVycl9yZXQ7DQorCX0NCisNCisJaWYgKDAgIT0gcGNtX3ByZXBhcmUodm9sdGVfcGNtX3ZvaWNlX291dCkpIHsNCisJCXByaW50Zigidm9sdGVfcGNtX3ZvaWNlX291dCBwY21fcHJlcGFyZSBmYWlsZWQhXG4iKTsNCisJCWdvdG8gZXJyX3JldDsNCisJfQ0KKw0KKwlpZiAoMCAhPSBwY21fcHJlcGFyZSh2b2x0ZV9wY21fdm9pY2VfaW4pKSB7DQorCQlwcmludGYoInZvbHRlX3BjbV92b2ljZV9pbiBwY21fcHJlcGFyZSBmYWlsZWQhXG4iKTsNCisJCWdvdG8gZXJyX3JldDsNCisJfQ0KKwlyZXR1cm4gMDsNCitlcnJfcmV0Og0KKw0KKwlwY21fY2xvc2Uodm9sdGVfcGNtX3ZvaWNlX291dCk7DQorCXZvbHRlX3BjbV92b2ljZV9vdXQgPSBOVUxMOw0KKw0KKwlpZiAodm9sdGVfcGNtX3ZvaWNlX2luKSB7DQorCQlwY21fY2xvc2Uodm9sdGVfcGNtX3ZvaWNlX2luKTsNCisJCXZvbHRlX3BjbV92b2ljZV9pbiA9IE5VTEw7DQorCX0NCisJcmV0dXJuIC0xOw0KKw0KK30NCisNCit2b2lkIHpEcnZWb2x0ZV9QcmVDbG9zZSh2b2lkKQ0KK3sNCisNCisJcHJpbnRmKCIgdm9pY2UgbGliIHpEcnZWb2x0ZV9QcmVDbG9zZSFcbiIpOw0KKw0KKwlpZiAoc2xpY19mbGFnX2FscmVhZHkgPT0gMSkgew0KKwkJcHJpbnRmKCIgdm9pY2UgIHNsaWMgZmxhZyBhbHJlYWR5IGdldCwgc2xpY19mbGFnPSVkIVxuIiwgc2xpY19mbGFnKTsNCisJCWlmIChzbGljX2ZsYWcgPT0gMSkgew0KKwkJCXJldHVybiA7DQorCQl9DQorDQorCX0gZWxzZSB7DQorCQlzbGljX2ZsYWcgPSB2b2ljZV9HZXRTbGljRmxhZygpOw0KKwkJcHJpbnRmKCIgdm9pY2UgIHNsaWMgZmxhZyAgZ2V0LCBzbGljX2ZsYWc9JWQhXG4iLCBzbGljX2ZsYWcpOw0KKwkJaWYgKHNsaWNfZmxhZyA9PSAxKSB7DQorCQkJcmV0dXJuIDsNCisJCX0NCisJfQ0KKyNpZiBkZWZpbmVkKF9WQlVGRl9JTl9TSU5HTEVfQ09SRSkgfHwgZGVmaW5lZChfVkJVRkZfSU5fTVVMVElfQ09SRSkNCisJCQlwcmludGYoIiVzOiB1c2Ugdm9pY2UgYnVmZmVyLHJldHVybiFcbiIsX19mdW5jX18pOyANCisJCQlyZXR1cm4gMDsNCisJCQ0KKyNlbmRpZg0KKw0KKw0KKwlpZiAodm9sdGVfcGNtX3ZvaWNlX291dCkgew0KKwkJcGNtX2Nsb3NlKHZvbHRlX3BjbV92b2ljZV9vdXQpOw0KKwkJdm9sdGVfcGNtX3ZvaWNlX291dCA9IE5VTEw7DQorCX0NCisJaWYgKHZvbHRlX3BjbV92b2ljZV9pbikgew0KKwkJcGNtX2Nsb3NlKHZvbHRlX3BjbV92b2ljZV9pbik7DQorCQl2b2x0ZV9wY21fdm9pY2VfaW4gPSBOVUxMOw0KKwl9DQorfQ0KKw0KKw0KKw0KKw0KKw0K