ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzllMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCkBAIC0wLDAgKzEsMzEwMiBAQAorLyogcmFkZW9uX3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLQorICoKKyAqIENvcHlyaWdodCAyMDAwIFZBIExpbnV4IFN5c3RlbXMsIEluYy4sIEZyZW1vbnQsIENhbGlmb3JuaWEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOgorICogICAgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICogICAgS2V2aW4gRS4gTWFydGluIDxtYXJ0aW5AdmFsaW51eC5jb20+CisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJkcm1fc2FyZWEuaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2Rydi5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjbGllbnQgc3RhdGUgY2hlY2tpbmcgYW5kIGZpeHVwCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCQkgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCQkJCSAgICAgdTMyICpvZmZzZXQgKSB7CisJdTMyIG9mZiA9ICpvZmZzZXQ7CisJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKKworCWlmICggb2ZmID49IGRldl9wcml2LT5mYl9sb2NhdGlvbiAmJgorCSAgICAgb2ZmIDwgKCBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCArIGRldl9wcml2LT5nYXJ0X3NpemUgKSApCisJCXJldHVybiAwOworCisJcmFkZW9uX3ByaXYgPSBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OworCW9mZiArPSByYWRlb25fcHJpdi0+cmFkZW9uX2ZiX2RlbHRhOworCisJRFJNX0RFQlVHKCAib2Zmc2V0IGZpeGVkIHVwIHRvIDB4JXhcbiIsIG9mZiApOworCisJaWYgKCBvZmYgPCBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gfHwKKwkgICAgIG9mZiA+PSAoIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ICsgZGV2X3ByaXYtPmdhcnRfc2l6ZSApICkKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCisJKm9mZnNldCA9IG9mZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXRzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJCQkgICAgICBpbnQgaWQsCisJCQkJCQkgICAgICB1MzIgX191c2VyICpkYXRhICkgeworCXN3aXRjaCAoIGlkICkgeworCisJY2FzZSBSQURFT05fRU1JVF9QUF9NSVNDOgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWyggUkFERU9OX1JCM0RfREVQVEhPRkZTRVQKKwkJCQkJCQkgICAgLSBSQURFT05fUFBfTUlTQyApIC8gNF0gKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgZGVwdGggYnVmZmVyIG9mZnNldFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSQURFT05fRU1JVF9QUF9DTlRMOgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWyggUkFERU9OX1JCM0RfQ09MT1JPRkZTRVQKKwkJCQkJCQkgICAgLSBSQURFT05fUFBfQ05UTCApIC8gNF0gKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgY29sb3VyIGJ1ZmZlciBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8yOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzM6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF81OgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWzBdICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIFIyMDAgdGV4dHVyZSBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzE6CisJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8yOgorCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZkYXRhWyggUkFERU9OX1BQX1RYT0ZGU0VUXzAKKwkJCQkJCQkgICAgLSBSQURFT05fUFBfVFhGSUxURVJfMCApIC8gNF0gKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgUjEwMCB0ZXh0dXJlIG9mZnNldFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18wOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfMToKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18zOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfNDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzU6IHsKKwkJaW50IGk7CisJCWZvciAoIGkgPSAwOyBpIDwgNTsgaSsrICkgeworCQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCQkgICAgJmRhdGFbaV0gKSApIHsKKwkJCQlEUk1fRVJST1IoICJJbnZhbGlkIFIyMDAgY3ViaWMgdGV4dHVyZSBvZmZzZXRcbiIgKTsKKwkJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19PRkZTRVRTX1QwOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDI6eworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LAorCQkJCQkJCQkgIGZpbHBfcHJpdiwKKwkJCQkJCQkJICAmZGF0YVtpXSkpIHsKKwkJCQkJRFJNX0VSUk9SCisJCQkJCSAgICAoIkludmFsaWQgUjEwMCBjdWJpYyB0ZXh0dXJlIG9mZnNldFxuIik7CisJCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBSQURFT05fRU1JVF9SQjNEX0NPTE9SUElUQ0g6CisJY2FzZSBSQURFT05fRU1JVF9SRV9MSU5FX1BBVFRFUk46CisJY2FzZSBSQURFT05fRU1JVF9TRV9MSU5FX1dJRFRIOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfTFVNX01BVFJJWDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX1JPVF9NQVRSSVhfMDoKKwljYXNlIFJBREVPTl9FTUlUX1JCM0RfU1RFTkNJTFJFRk1BU0s6CisJY2FzZSBSQURFT05fRU1JVF9TRV9WUE9SVF9YU0NBTEU6CisJY2FzZSBSQURFT05fRU1JVF9TRV9DTlRMOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfQ05UTF9TVEFUVVM6CisJY2FzZSBSQURFT05fRU1JVF9SRV9NSVNDOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzA6CisJY2FzZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8yOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfWkJJQVNfRkFDVE9SOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfVENMX09VVFBVVF9WVFhfRk1UOgorCWNhc2UgUkFERU9OX0VNSVRfU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQ6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF8xOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF80OgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzU6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNjoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF83OgorCWNhc2UgUjIwMF9FTUlUX1RDTF9MSUdIVF9NT0RFTF9DVExfMDoKKwljYXNlIFIyMDBfRU1JVF9URkFDVE9SXzA6CisJY2FzZSBSMjAwX0VNSVRfVlRYX0ZNVF8wOgorCWNhc2UgUjIwMF9FTUlUX1ZBUF9DVEw6CisJY2FzZSBSMjAwX0VNSVRfTUFUUklYX1NFTEVDVF8wOgorCWNhc2UgUjIwMF9FTUlUX1RFWF9QUk9DX0NUTF8yOgorCWNhc2UgUjIwMF9FTUlUX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEw6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8xOgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl80OgorCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzU6CisJY2FzZSBSMjAwX0VNSVRfVlRFX0NOVEw6CisJY2FzZSBSMjAwX0VNSVRfT1VUUFVUX1ZUWF9DT01QX1NFTDoKKwljYXNlIFIyMDBfRU1JVF9QUF9UQU1fREVCVUczOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NOVExfWDoKKwljYXNlIFIyMDBfRU1JVF9SQjNEX0RFUFRIWFlfT0ZGU0VUOgorCWNhc2UgUjIwMF9FTUlUX1JFX0FVWF9TQ0lTU09SX0NOVEw6CisJY2FzZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8wOgorCWNhc2UgUjIwMF9FTUlUX1JFX1NDSVNTT1JfVExfMToKKwljYXNlIFIyMDBfRU1JVF9SRV9TQ0lTU09SX1RMXzI6CisJY2FzZSBSMjAwX0VNSVRfU0VfVkFQX0NOVExfU1RBVFVTOgorCWNhc2UgUjIwMF9FTUlUX1NFX1ZUWF9TVEFURV9DTlRMOgorCWNhc2UgUjIwMF9FTUlUX1JFX1BPSU5UU0laRToKKwljYXNlIFIyMDBfRU1JVF9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzA6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMDoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18xOgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzI6CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMzoKKwljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU180OgorCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzU6CisJY2FzZSBSQURFT05fRU1JVF9QUF9URVhfU0laRV8wOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfVEVYX1NJWkVfMToKKwljYXNlIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzI6CisJY2FzZSBSMjAwX0VNSVRfUkIzRF9CTEVORENPTE9SOgorCWNhc2UgUjIwMF9FTUlUX1RDTF9QT0lOVF9TUFJJVEVfQ05UTDoKKwljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzA6CisJY2FzZSBSQURFT05fRU1JVF9QUF9DVUJJQ19GQUNFU18xOgorCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMjoKKwljYXNlIFIyMDBfRU1JVF9QUF9UUklfUEVSRl9DTlRMOgorCQkvKiBUaGVzZSBwYWNrZXRzIGRvbid0IGNvbnRhaW4gbWVtb3J5IG9mZnNldHMgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoICJVbmtub3duIHN0YXRlIHBhY2tldCBJRCAlZFxuIiwgaWQgKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJCQkgICAgICBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmLAorCQkJCQkJICAgICAgdW5zaWduZWQgaW50ICpjbWRzeiApIHsKKwl1MzIgKmNtZCA9ICh1MzIgKikgY21kYnVmLT5idWY7CisKKwkqY21kc3ogPSAyICsgKCAoIGNtZFswXSAmIFJBREVPTl9DUF9QQUNLRVRfQ09VTlRfTUFTSyApID4+IDE2ICk7CisKKwlpZiAoICggY21kWzBdICYgMHhjMDAwMDAwMCApICE9IFJBREVPTl9DUF9QQUNLRVQzICkgeworCQlEUk1fRVJST1IoICJOb3QgYSB0eXBlIDMgcGFja2V0XG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlpZiAoIDQgKiAqY21kc3ogPiBjbWRidWYtPmJ1ZnN6ICkgeworCQlEUk1fRVJST1IoICJQYWNrZXQgc2l6ZSBsYXJnZXIgdGhhbiBzaXplIG9mIGRhdGEgcHJvdmlkZWRcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCS8qIENoZWNrIGNsaWVudCBzdGF0ZSBhbmQgZml4IGl0IHVwIGlmIG5lY2Vzc2FyeSAqLworCWlmICggY21kWzBdICYgMHg4MDAwICkgeyAvKiBNU0Igb2Ygb3Bjb2RlOiBuZXh0IERXT1JEIEdVSV9DTlRMICovCisJCXUzMiBvZmZzZXQ7CisKKwkJaWYgKCBjbWRbMV0gJiAoIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMCisJCQkgICAgICB8IFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMICkgKSB7CisJCQlvZmZzZXQgPSBjbWRbMl0gPDwgMTA7CisJCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LCAmb2Zmc2V0ICkgKSB7CisJCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBmaXJzdCBwYWNrZXQgb2Zmc2V0XG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCQkJY21kWzJdID0gKCBjbWRbMl0gJiAweGZmYzAwMDAwICkgfCBvZmZzZXQgPj4gMTA7CisJCX0KKworCQlpZiAoICggY21kWzFdICYgUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgKSAmJgorCQkgICAgICggY21kWzFdICYgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgKSApIHsKKwkJCW9mZnNldCA9IGNtZFszXSA8PCAxMDsKKwkJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsICZvZmZzZXQgKSApIHsKKwkJCQlEUk1fRVJST1IoICJJbnZhbGlkIHNlY29uZCBwYWNrZXQgb2Zmc2V0XG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCQkJY21kWzNdID0gKCBjbWRbM10gJiAweGZmYzAwMDAwICkgfCBvZmZzZXQgPj4gMTA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDUCBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCQkJCQkgIGRybV9jbGlwX3JlY3RfdCAqYm94ICkKK3sKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRyggIiAgIGJveDogIHgxPSVkIHkxPSVkICB4Mj0lZCB5Mj0lZFxuIiwKKwkJICAgYm94LT54MSwgYm94LT55MSwgYm94LT54MiwgYm94LT55MiApOworCisJQkVHSU5fUklORyggNCApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkVfVE9QX0xFRlQsIDAgKSApOworCU9VVF9SSU5HKCAoYm94LT55MSA8PCAxNikgfCBib3gtPngxICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9XSURUSF9IRUlHSFQsIDAgKSApOworCU9VVF9SSU5HKCAoKGJveC0+eTIgLSAxKSA8PCAxNikgfCAoYm94LT54MiAtIDEpICk7CisJQURWQU5DRV9SSU5HKCk7Cit9CisKKy8qIEVtaXQgMS4xIHN0YXRlCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCSAgICAgIGRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgKmN0eCwKKwkJCSAgICAgIGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgKnRleCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBkaXJ0eSApCit7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiZGlydHk9MHglMDh4XG4iLCBkaXJ0eSApOworCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfQ09OVEVYVCApIHsKKwkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAmY3R4LT5yYjNkX2RlcHRob2Zmc2V0ICkgKSB7CisJCQlEUk1fRVJST1IoICJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIgKTsKKwkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJfQorCisJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgJmN0eC0+cmIzZF9jb2xvcm9mZnNldCApICkgeworCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKworCQlCRUdJTl9SSU5HKCAxNCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX01JU0MsIDYgKSApOworCQlPVVRfUklORyggY3R4LT5wcF9taXNjICk7CisJCU9VVF9SSU5HKCBjdHgtPnBwX2ZvZ19jb2xvciApOworCQlPVVRfUklORyggY3R4LT5yZV9zb2xpZF9jb2xvciApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2JsZW5kY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2RlcHRob2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2RfZGVwdGhwaXRjaCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3pzdGVuY2lsY250bCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0NOVEwsIDIgKSApOworCQlPVVRfUklORyggY3R4LT5wcF9jbnRsICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2RfY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX2NvbG9yb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkIzRF9DT0xPUlBJVENILCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmIzZF9jb2xvcnBpdGNoICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX1ZFUlRGTVQgKSB7CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9DT09SRF9GTVQsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5zZV9jb29yZF9mbXQgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfTElORSApIHsKKwkJQkVHSU5fUklORyggNSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX0xJTkVfUEFUVEVSTiwgMSApICk7CisJCU9VVF9SSU5HKCBjdHgtPnJlX2xpbmVfcGF0dGVybiApOworCQlPVVRfUklORyggY3R4LT5yZV9saW5lX3N0YXRlICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfTElORV9XSURUSCwgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX2xpbmVfd2lkdGggKTsKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfQlVNUE1BUCApIHsKKwkJQkVHSU5fUklORyggNSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0xVTV9NQVRSSVgsIDAgKSApOworCQlPVVRfUklORyggY3R4LT5wcF9sdW1fbWF0cml4ICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfUk9UX01BVFJJWF8wLCAxICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cHBfcm90X21hdHJpeF8wICk7CisJCU9VVF9SSU5HKCBjdHgtPnBwX3JvdF9tYXRyaXhfMSApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9NQVNLUyApIHsKKwkJQkVHSU5fUklORyggNCApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssIDIgKSApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3N0ZW5jaWxyZWZtYXNrICk7CisJCU9VVF9SSU5HKCBjdHgtPnJiM2Rfcm9wY250bCApOworCQlPVVRfUklORyggY3R4LT5yYjNkX3BsYW5lbWFzayApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WSUVXUE9SVCApIHsKKwkJQkVHSU5fUklORyggNyApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSwgNSApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX3Zwb3J0X3hzY2FsZSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF94b2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX3Zwb3J0X3lzY2FsZSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF95b2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX3Zwb3J0X3pzY2FsZSApOworCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF96b2Zmc2V0ICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX1NFVFVQICkgeworCQlCRUdJTl9SSU5HKCA0ICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ05UTCwgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX2NudGwgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9DTlRMX1NUQVRVUywgMCApICk7CisJCU9VVF9SSU5HKCBjdHgtPnNlX2NudGxfc3RhdHVzICk7CisJCUFEVkFOQ0VfUklORygpOworCX0KKworCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX01JU0MgKSB7CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9NSVNDLCAwICkgKTsKKwkJT1VUX1JJTkcoIGN0eC0+cmVfbWlzYyApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgwICkgeworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZ0ZXhbMF0ucHBfdHhvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMFxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggOSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1RYRklMVEVSXzAsIDUgKSApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4ZmlsdGVyICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhmb3JtYXQgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90eG9mZnNldCApOworCQlPVVRfUklORyggdGV4WzBdLnBwX3R4Y2JsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhhYmxlbmQgKTsKKwkJT1VUX1JJTkcoIHRleFswXS5wcF90ZmFjdG9yICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQk9SREVSX0NPTE9SXzAsIDAgKSApOworCQlPVVRfUklORyggdGV4WzBdLnBwX2JvcmRlcl9jb2xvciApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgxICkgeworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZ0ZXhbMV0ucHBfdHhvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMVxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggOSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1RYRklMVEVSXzEsIDUgKSApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4ZmlsdGVyICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhmb3JtYXQgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90eG9mZnNldCApOworCQlPVVRfUklORyggdGV4WzFdLnBwX3R4Y2JsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhhYmxlbmQgKTsKKwkJT1VUX1JJTkcoIHRleFsxXS5wcF90ZmFjdG9yICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQk9SREVSX0NPTE9SXzEsIDAgKSApOworCQlPVVRfUklORyggdGV4WzFdLnBwX2JvcmRlcl9jb2xvciApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgyICkgeworCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAgICZ0ZXhbMl0ucHBfdHhvZmZzZXQgKSApIHsKKwkJCURSTV9FUlJPUiggIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMlxuIiApOworCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQl9CisKKwkJQkVHSU5fUklORyggOSApOworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1RYRklMVEVSXzIsIDUgKSApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4ZmlsdGVyICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdHhmb3JtYXQgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90eG9mZnNldCApOworCQlPVVRfUklORyggdGV4WzJdLnBwX3R4Y2JsZW5kICk7CisJCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdHhhYmxlbmQgKTsKKwkJT1VUX1JJTkcoIHRleFsyXS5wcF90ZmFjdG9yICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQk9SREVSX0NPTE9SXzIsIDAgKSApOworCQlPVVRfUklORyggdGV4WzJdLnBwX2JvcmRlcl9jb2xvciApOworCQlBRFZBTkNFX1JJTkcoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRW1pdCAxLjIgc3RhdGUKKyAqLworc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZTIoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwkJCSAgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkgICAgICAgZHJtX3JhZGVvbl9zdGF0ZV90ICpzdGF0ZSApCit7CisJUklOR19MT0NBTFM7CisKKwlpZiAoc3RhdGUtPmRpcnR5ICYgUkFERU9OX1VQTE9BRF9aQklBUykgeworCQlCRUdJTl9SSU5HKCAzICk7CisJCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfWkJJQVNfRkFDVE9SLCAxICkgKTsKKwkJT1VUX1JJTkcoIHN0YXRlLT5jb250ZXh0Mi5zZV96Ymlhc19mYWN0b3IgKTsgCisJCU9VVF9SSU5HKCBzdGF0ZS0+Y29udGV4dDIuc2VfemJpYXNfY29uc3RhbnQgKTsgCisJCUFEVkFOQ0VfUklORygpOworCX0KKworCXJldHVybiByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnN0YXRlLT5jb250ZXh0LAorCQkJICAgc3RhdGUtPnRleCwgc3RhdGUtPmRpcnR5ICk7Cit9CisKKy8qIE5ldyAoMS4zKSBzdGF0ZSBtZWNoYW5pc20uICAzIGNvbW1hbmRzIChwYWNrZXQsIHNjYWxhciwgdmVjdG9yKSBpbgorICogMS4zIGNtZGJ1ZmZlcnMgYWxsb3cgYWxsIHByZXZpb3VzIHN0YXRlIHRvIGJlIHVwZGF0ZWQgYXMgd2VsbCBhcworICogdGhlIHRjbCBzY2FsYXIgYW5kIHZlY3RvciBhcmVhcy4gIAorICovCitzdGF0aWMgc3RydWN0IHsgCisJaW50IHN0YXJ0OyAKKwlpbnQgbGVuOyAKKwljb25zdCBjaGFyICpuYW1lOworfSBwYWNrZXRbUkFERU9OX01BWF9TVEFURV9QQUNLRVRTXSA9IHsKKwl7IFJBREVPTl9QUF9NSVNDLDcsIlJBREVPTl9QUF9NSVNDIiB9LAorCXsgUkFERU9OX1BQX0NOVEwsMywiUkFERU9OX1BQX0NOVEwiIH0sCisJeyBSQURFT05fUkIzRF9DT0xPUlBJVENILDEsIlJBREVPTl9SQjNEX0NPTE9SUElUQ0giIH0sCisJeyBSQURFT05fUkVfTElORV9QQVRURVJOLDIsIlJBREVPTl9SRV9MSU5FX1BBVFRFUk4iIH0sCisJeyBSQURFT05fU0VfTElORV9XSURUSCwxLCJSQURFT05fU0VfTElORV9XSURUSCIgfSwKKwl7IFJBREVPTl9QUF9MVU1fTUFUUklYLDEsIlJBREVPTl9QUF9MVU1fTUFUUklYIiB9LAorCXsgUkFERU9OX1BQX1JPVF9NQVRSSVhfMCwyLCJSQURFT05fUFBfUk9UX01BVFJJWF8wIiB9LAorCXsgUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssMywiUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0siIH0sCisJeyBSQURFT05fU0VfVlBPUlRfWFNDQUxFLDYsIlJBREVPTl9TRV9WUE9SVF9YU0NBTEUiIH0sCisJeyBSQURFT05fU0VfQ05UTCwyLCJSQURFT05fU0VfQ05UTCIgfSwKKwl7IFJBREVPTl9TRV9DTlRMX1NUQVRVUywxLCJSQURFT05fU0VfQ05UTF9TVEFUVVMiIH0sCisJeyBSQURFT05fUkVfTUlTQywxLCJSQURFT05fUkVfTUlTQyIgfSwKKwl7IFJBREVPTl9QUF9UWEZJTFRFUl8wLDYsIlJBREVPTl9QUF9UWEZJTFRFUl8wIiB9LAorCXsgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8wLDEsIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCIgfSwKKwl7IFJBREVPTl9QUF9UWEZJTFRFUl8xLDYsIlJBREVPTl9QUF9UWEZJTFRFUl8xIiB9LAorCXsgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xLDEsIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMSIgfSwKKwl7IFJBREVPTl9QUF9UWEZJTFRFUl8yLDYsIlJBREVPTl9QUF9UWEZJTFRFUl8yIiB9LAorCXsgUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yLDEsIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMiIgfSwKKwl7IFJBREVPTl9TRV9aQklBU19GQUNUT1IsMiwiUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiIgfSwKKwl7IFJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQsMTEsIlJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQiIH0sCisJeyBSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQsMTcsIlJBREVPTl9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRCIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMCwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMCIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMSwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMSIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMiwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMiIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfMywgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMyIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNCwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNCIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNSwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNSIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNiwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNiIgfSwKKwl7IFIyMDBfUFBfVFhDQkxFTkRfNywgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNyIgfSwKKwl7IFIyMDBfU0VfVENMX0xJR0hUX01PREVMX0NUTF8wLCA2LCAiUjIwMF9TRV9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAiIH0sCisJeyBSMjAwX1BQX1RGQUNUT1JfMCwgNiwgIlIyMDBfUFBfVEZBQ1RPUl8wIiB9LAorCXsgUjIwMF9TRV9WVFhfRk1UXzAsIDQsICJSMjAwX1NFX1ZUWF9GTVRfMCIgfSwKKwl7IFIyMDBfU0VfVkFQX0NOVEwsIDEsICJSMjAwX1NFX1ZBUF9DTlRMIiB9LAorCXsgUjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wLCA1LCAiUjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wIiB9LAorCXsgUjIwMF9TRV9UQ0xfVEVYX1BST0NfQ1RMXzIsIDUsICJSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiIgfSwKKwl7IFIyMDBfU0VfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCwgMSwgIlIyMDBfU0VfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMCwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMCIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMSwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMSIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMiwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMiIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfMywgNiwgIlIyMDBfUFBfVFhGSUxURVJfMyIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfNCwgNiwgIlIyMDBfUFBfVFhGSUxURVJfNCIgfSwKKwl7IFIyMDBfUFBfVFhGSUxURVJfNSwgNiwgIlIyMDBfUFBfVFhGSUxURVJfNSIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMCIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMSwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMSIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMiwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMiIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfMywgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMyIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfNCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNCIgfSwKKwl7IFIyMDBfUFBfVFhPRkZTRVRfNSwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNSIgfSwKKwl7IFIyMDBfU0VfVlRFX0NOVEwsIDEsICJSMjAwX1NFX1ZURV9DTlRMIiB9LAorCXsgUjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCwgMSwgIlIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwiIH0sCisJeyBSMjAwX1BQX1RBTV9ERUJVRzMsIDEsICJSMjAwX1BQX1RBTV9ERUJVRzMiIH0sCisJeyBSMjAwX1BQX0NOVExfWCwgMSwgIlIyMDBfUFBfQ05UTF9YIiB9LCAKKwl7IFIyMDBfUkIzRF9ERVBUSFhZX09GRlNFVCwgMSwgIlIyMDBfUkIzRF9ERVBUSFhZX09GRlNFVCIgfSwgCisJeyBSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwsIDEsICJSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwiIH0sIAorCXsgUjIwMF9SRV9TQ0lTU09SX1RMXzAsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMCIgfSwgCisJeyBSMjAwX1JFX1NDSVNTT1JfVExfMSwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8xIiB9LCAKKwl7IFIyMDBfUkVfU0NJU1NPUl9UTF8yLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzIiIH0sIAorCXsgUjIwMF9TRV9WQVBfQ05UTF9TVEFUVVMsIDEsICJSMjAwX1NFX1ZBUF9DTlRMX1NUQVRVUyIgfSwgCisJeyBSMjAwX1NFX1ZUWF9TVEFURV9DTlRMLCAxLCAiUjIwMF9TRV9WVFhfU1RBVEVfQ05UTCIgfSwgCisJeyBSMjAwX1JFX1BPSU5UU0laRSwgMSwgIlIyMDBfUkVfUE9JTlRTSVpFIiB9LCAKKwl7IFIyMDBfU0VfVENMX0lOUFVUX1ZUWF9WRUNUT1JfQUREUl8wLCA0LCAiUjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAiIH0sCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzAsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzAiIH0sIC8qIDYxICovCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMCIgfSwgLyogNjIgKi8KKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfMSwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMSIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzEsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU18yLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18yIiB9LAorCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzIiIH0sCisJeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzMsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzMiIH0sCisJeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8zLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMyIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfNCwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfNCIgfSwKKwl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzQsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV80IiB9LAorCXsgUjIwMF9QUF9DVUJJQ19GQUNFU181LCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU181IiB9LAorCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzUiIH0sCisJeyBSQURFT05fUFBfVEVYX1NJWkVfMCwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8wIiB9LAorCXsgUkFERU9OX1BQX1RFWF9TSVpFXzEsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMSIgfSwKKwl7IFJBREVPTl9QUF9URVhfU0laRV8yLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzIiIH0sCisJeyBSMjAwX1JCM0RfQkxFTkRDT0xPUiwgMywgIlIyMDBfUkIzRF9CTEVORENPTE9SIiB9LAorCXsgUjIwMF9TRV9UQ0xfUE9JTlRfU1BSSVRFX0NOVEwsIDEsICJSMjAwX1NFX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCIgfSwKKwl7IFJBREVPTl9QUF9DVUJJQ19GQUNFU18wLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzAifSwKKwl7IFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCJ9LAorCXsgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMSJ9LAorCXsgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wIn0sCisJeyBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18yIn0sCisJeyBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QyXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QyXzAifSwKKwl7IFIyMDBfUFBfVFJJX1BFUkYsIDIsICJSMjAwX1BQX1RSSV9QRVJGIn0sCit9OworCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCByYWRlb25fY2xlYXJfYm94KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKwkJCSAgICAgIGludCByLCBpbnQgZywgaW50IGIgKQoreworCXUzMiBjb2xvcjsKKwlSSU5HX0xPQ0FMUzsKKworCXggKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLngxOworCXkgKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLnkxOworCisJc3dpdGNoICggZGV2X3ByaXYtPmNvbG9yX2ZtdCApIHsKKwljYXNlIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCNTY1OgorCQljb2xvciA9ICgoKHIgJiAweGY4KSA8PCA4KSB8CisJCQkgKChnICYgMHhmYykgPDwgMykgfAorCQkJICgoYiAmIDB4ZjgpID4+IDMpKTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX0FSR0I4ODg4OgorCWRlZmF1bHQ6CisJCWNvbG9yID0gKCgoMHhmZikgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgIDgpIHwgYik7CisJCWJyZWFrOworCX0KKworCUJFR0lOX1JJTkcoIDQgKTsKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CQkKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0RQX1dSSVRFX01BU0ssIDAgKSApOworCU9VVF9SSU5HKCAweGZmZmZmZmZmICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwlCRUdJTl9SSU5HKCA2ICk7CisKKwlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCU9VVF9SSU5HKCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCSAgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJICBSQURFT05fUk9QM19QIHwKKwkJICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgKTsKKworIAlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSApIHsgCisJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisgCX0gZWxzZSB7CSAKKwkJT1VUX1JJTkcoIGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCApOworIAl9IAorCisJT1VUX1JJTkcoIGNvbG9yICk7CisKKwlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOworCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgKQoreworCS8qIENvbGxhcHNlIHZhcmlvdXMgdGhpbmdzIGludG8gYSB3YWl0IGZsYWcgLS0gdHJ5aW5nIHRvCisJICogZ3Vlc3MgaWYgdXNlcnNwYXNlIHNsZXB0IC0tIGJldHRlciBqdXN0IHRvIGhhdmUgdGhlbSB0ZWxsIHVzLgorCSAqLworCWlmIChkZXZfcHJpdi0+c3RhdHMubGFzdF9mcmFtZV9yZWFkcyA+IDEgfHwKKwkgICAgZGV2X3ByaXYtPnN0YXRzLmxhc3RfY2xlYXJfcmVhZHMgPiBkZXZfcHJpdi0+c3RhdHMuY2xlYXJzKSB7CisJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPnN0YXRzLmZyZWVsaXN0X2xvb3BzKSB7CisJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKKwl9CisKKwkvKiBQdXJwbGUgYm94IGZvciBwYWdlIGZsaXBwaW5nCisJICovCisJaWYgKCBkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0ZMSVAgKSAKKwkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQsIDQsIDgsIDgsIDI1NSwgMCwgMjU1ICk7CisKKwkvKiBSZWQgYm94IGlmIHdlIGhhdmUgdG8gd2FpdCBmb3IgaWRsZSBhdCBhbnkgcG9pbnQKKwkgKi8KKwlpZiAoIGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfV0FJVF9JRExFICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCAxNiwgNCwgOCwgOCwgMjU1LCAwLCAwICk7CisKKwkvKiBCbHVlIGJveDogbG9zdCBjb250ZXh0PworCSAqLworCisJLyogWWVsbG93IGJveCBmb3IgdGV4dHVyZSBzd2FwcworCSAqLworCWlmICggZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9URVhUVVJFX0xPQUQgKSAKKwkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQwLCA0LCA4LCA4LCAyNTUsIDI1NSwgMCApOworCisJLyogR3JlZW4gYm94IGlmIGhhcmR3YXJlIG5ldmVyIGlkbGVzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwpCisJICovCisJaWYgKCAhKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfRE1BX0lETEUpICkgCisJCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCA2NCwgNCwgOCwgOCwgMCwgMjU1LCAwICk7CisKKworCS8qIERyYXcgYmFycyBpbmRpY2F0aW5nIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCAKKwkgKiAobm90IGEgZ3JlYXQgbWVhc3VyZSwgZWFzaWx5IGNvbmZ1c2VkKQorCSAqLworCWlmIChkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMpIHsKKwkJaWYgKGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcyA+IDEwMCkKKwkJCWRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcyA9IDEwMDsKKworCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgNCwgMTYsICAKKwkJCQkgIGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcywgNCwKKwkJCQkgIDE5NiwgMTI4LCAxMjggKTsKKwl9CisKKwltZW1zZXQoICZkZXZfcHJpdi0+c3RhdHMsIDAsIHNpemVvZihkZXZfcHJpdi0+c3RhdHMpICk7CisKK30KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENQIGNvbW1hbmQgZGlzcGF0Y2ggZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICBkcm1fcmFkZW9uX2NsZWFyX3QgKmNsZWFyLAorCQkJCSAgICAgIGRybV9yYWRlb25fY2xlYXJfcmVjdF90ICpkZXB0aF9ib3hlcyApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fcmFkZW9uX2RlcHRoX2NsZWFyX3QgKmRlcHRoX2NsZWFyID0gJmRldl9wcml2LT5kZXB0aF9jbGVhcjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJdW5zaWduZWQgaW50IGZsYWdzID0gY2xlYXItPmZsYWdzOworCXUzMiByYjNkX2NudGwgPSAwLCByYjNkX3N0ZW5jaWxyZWZtYXNrPSAwOworCWludCBpOworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggImZsYWdzID0gMHgleFxuIiwgZmxhZ3MgKTsKKworCWRldl9wcml2LT5zdGF0cy5jbGVhcnMrKzsKKworCWlmICggZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgJiYgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxICkgeworCQl1bnNpZ25lZCBpbnQgdG1wID0gZmxhZ3M7CisKKwkJZmxhZ3MgJj0gfihSQURFT05fRlJPTlQgfCBSQURFT05fQkFDSyk7CisJCWlmICggdG1wICYgUkFERU9OX0ZST05UICkgZmxhZ3MgfD0gUkFERU9OX0JBQ0s7CisJCWlmICggdG1wICYgUkFERU9OX0JBQ0sgKSAgZmxhZ3MgfD0gUkFERU9OX0ZST05UOworCX0KKworCWlmICggZmxhZ3MgJiAoUkFERU9OX0ZST05UIHwgUkFERU9OX0JBQ0spICkgeworCisJCUJFR0lOX1JJTkcoIDQgKTsKKworCQkvKiBFbnN1cmUgdGhlIDNEIHN0cmVhbSBpcyBpZGxlIGJlZm9yZSBkb2luZyBhCisJCSAqIDJEIGZpbGwgdG8gY2xlYXIgdGhlIGZyb250IG9yIGJhY2sgYnVmZmVyLgorCQkgKi8KKwkJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOworCQkKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9EUF9XUklURV9NQVNLLCAwICkgKTsKKwkJT1VUX1JJTkcoIGNsZWFyLT5jb2xvcl9tYXNrICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCQlpbnQgeCA9IHBib3hbaV0ueDE7CisJCQlpbnQgeSA9IHBib3hbaV0ueTE7CisJCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OworCQkJaW50IGggPSBwYm94W2ldLnkyIC0geTsKKworCQkJRFJNX0RFQlVHKCAiZGlzcGF0Y2ggY2xlYXIgJWQsJWQtJWQsJWQgZmxhZ3MgMHgleFxuIiwKKwkJCQkgICB4LCB5LCB3LCBoLCBmbGFncyApOworCisJCQlpZiAoIGZsYWdzICYgUkFERU9OX0ZST05UICkgeworCQkJCUJFR0lOX1JJTkcoIDYgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSAgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSQURFT05fUk9QM19QIHwKKwkJCQkJICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgKTsKKworCQkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisJCQkJT1VUX1JJTkcoIGNsZWFyLT5jbGVhcl9jb2xvciApOworCQkJCQorCQkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCQkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKwkJCQkKKwkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCX0KKwkJCQorCQkJaWYgKCBmbGFncyAmIFJBREVPTl9CQUNLICkgeworCQkJCUJFR0lOX1JJTkcoIDYgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQgKSApOworCQkJCU9VVF9SSU5HKCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSAgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CisJCQkJCSAgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJCQkgIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJICBSQURFT05fUk9QM19QIHwKKwkJCQkJICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgKTsKKwkJCQkKKwkJCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7CisJCQkJT1VUX1JJTkcoIGNsZWFyLT5jbGVhcl9jb2xvciApOworCisJCQkJT1VUX1JJTkcoICh4IDw8IDE2KSB8IHkgKTsKKwkJCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCisJCQkJQURWQU5DRV9SSU5HKCk7CisJCQl9CisJCX0KKwl9CisJCisJLyogaHlwZXIgeiBjbGVhciAqLworCS8qIG5vIGRvY3MgYXZhaWxhYmxlLCBiYXNlZCBvbiByZXZlcnNlIGVuZ2VuZWVyaW5nIGJ5IFN0ZXBoYW5lIE1hcmNoZXNpbiAqLworCWlmICgoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSAmJiAoZmxhZ3MgJiBSQURFT05fQ0xFQVJfRkFTVFopKSB7CisKKwkJaW50IGk7CisJCWludCBkZXB0aHBpeHBlcmxpbmUgPSBkZXZfcHJpdi0+ZGVwdGhfZm10PT1SQURFT05fREVQVEhfRk9STUFUXzE2QklUX0lOVF9aPyAKKwkJCShkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyAyKTogKGRldl9wcml2LT5kZXB0aF9waXRjaCAvIDQpOworCQkKKwkJdTMyIGNsZWFybWFzazsKKworCQl1MzIgdGVtcFJCM0RfREVQVEhDTEVBUlZBTFVFID0gY2xlYXItPmNsZWFyX2RlcHRoIHwKKwkJCSgoY2xlYXItPmRlcHRoX21hc2sgJiAweGZmKSA8PCAyNCk7CisJCisJCQorCQkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgorCQkgKiB3ZSBoYXZlbid0IHRvdWNoZWQgYW55ICJub3JtYWwiIHN0YXRlIC0gc3RpbGwgbmVlZCB0aGlzPworCQkgKi8KKwkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CisKKwkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0hBU19ISUVSWikgJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpIHsKKwkJLyogRklYTUUgOiByZXZlcnNlIGVuZ2luZWVyIHRoYXQgZm9yIFJ4MDAgY2FyZHMgKi8KKwkJLyogRklYTUUgOiB0aGUgbWFzayBzdXBwb3NlZGx5IGNvbnRhaW5zIGxvdy1yZXMgeiB2YWx1ZXMuIFNvIGNhbid0IHNldAorCQkgICBqdXN0IHRvIHRoZSBtYXggKDB4ZmY/IG9yIGFjdHVhbGx5IDB4M2ZmZj8pLCBuZWVkIHRvIHRha2UgeiBjbGVhcgorCQkgICB2YWx1ZSBpbnRvIGFjY291bnQ/ICovCisJCS8qIHBhdHRlcm4gc2VlbXMgdG8gd29yayBmb3IgcjEwMCwgdGhvdWdoIGdldCBzbGlnaHQKKwkJICAgcmVuZGVyaW5nIGVycm9ycyB3aXRoIGdseGdlYXJzLiBJZiBoaWVyeiBpcyBub3QgZW5hYmxlZCBmb3IgcjEwMCwKKwkJICAgb25seSA0IGJpdHMgd2hpY2ggaW5kaWNhdGUgY2xlYXIgKDE1LDE2LDMxLDMyLCBhbGwgemVybykgbWF0dGVyLCB0aGUKKwkJICAgb3RoZXIgb25lcyBhcmUgaWdub3JlZCwgYW5kIHRoZSBzYW1lIGNsZWFyIG1hc2sgY2FuIGJlIHVzZWQuIFRoYXQncworCQkgICB2ZXJ5IGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiBSMjAwIHdoaWNoIG5lZWRzIGRpZmZlcmVudCBjbGVhciBtYXNrCisJCSAgIGFuZCBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyIGlmIGhpZXJ6IGlzIGVuYWJsZWQgb3Igbm90ICE/IQorCQkqLworCQkJY2xlYXJtYXNrID0gKDB4ZmY8PDIyKXwoMHhmZjw8Nil8IDB4MDAzZjAwM2Y7CisJCX0KKwkJZWxzZSB7CisJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLgorCQkgICBydjI1MDogY291bGQgYmUgdXNlZCB0byBjbGVhciBvbmx5IHBhcnRzIG9mIG1hY3JvdGlsZXMKKwkJICAgKGJ1dCB0aGF0IHdvdWxkIGdldCByZWFsbHkgY29tcGxpY2F0ZWQuLi4pPworCQkgICBiaXQgMCBhbmQgMSAoZWl0aGVyIG9yIGJvdGggb2YgdGhlbSA/IT8hKSBhcmUgdXNlZCB0bworCQkgICBub3QgY2xlYXIgdGlsZSAob3IgbWF5YmUgb25lIG9mIHRoZSBiaXRzIGluZGljYXRlcyBpZiB0aGUgdGlsZSBpcworCQkgICBjb21wcmVzc2VkIG9yIG5vdCksIGJpdCAyIGFuZCAzIHRvIG5vdCBjbGVhciB0aWxlIDEsLi4uLC4KKwkJICAgUGF0dGVybiBpcyBhcyBmb2xsb3dzOgorCQkgICAgICAgIHwgMCwxIHwgNCw1IHwgOCw5IHwxMiwxM3wxNiwxN3wyMCwyMXwyNCwyNXwyOCwyOXwKKwkJICAgYml0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAgICAgICAgfCAyLDMgfCA2LDcgfDEwLDExfDE0LDE1fDE4LDE5fDIyLDIzfDI2LDI3fDMwLDMxfAorCQkgICBydjEwMDogY2xlYXJtYXNrIGNvdmVycyAyeDggNHgxIHRpbGVzLCBidXQgb25lIGNsZWFyIHN0aWxsCisJCSAgIGNvdmVycyAyNTYgcGl4ZWxzID8hPworCQkqLworCQkJY2xlYXJtYXNrID0gMHgwOworCQl9CisKKwkJQkVHSU5fUklORyggOCApOworCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfREVQVEhDTEVBUlZBTFVFLAorCQkJdGVtcFJCM0RfREVQVEhDTEVBUlZBTFVFKTsKKwkJLyogd2hhdCBvZmZzZXQgaXMgdGhpcyBleGFjdGx5ID8gKi8KKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aTUFTS09GRlNFVCwgMCApOworCQkvKiBuZWVkIGN0bHN0YXQsIG90aGVyd2lzZSBnZXQgc29tZSBzdHJhbmdlIGJsYWNrIGZsaWNrZXJpbmcgKi8KKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aQ0FDSEVfQ1RMU1RBVCwgUkFERU9OX1JCM0RfWkNfRkxVU0hfQUxMICk7CisJCUFEVkFOQ0VfUklORygpOworCisJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKKwkJCWludCB0aWxlb2Zmc2V0LCBucnRpbGVzeCwgbnJ0aWxlc3ksIGo7CisJCQkvKiBpdCBsb29rcyBsaWtlIHIyMDAgbmVlZHMgcnYtc3R5bGUgY2xlYXJzLCBhdCBsZWFzdCBpZiBoaWVyeiBpcyBub3QgZW5hYmxlZD8gKi8KKwkJCWlmICgoZGV2X3ByaXYtPmZsYWdzJkNISVBfSEFTX0hJRVJaKSAmJiAhKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjIwMCkpIHsKKwkJCQkvKiBGSVhNRSA6IGZpZ3VyZSB0aGlzIG91dCBmb3IgcjIwMCAod2hlbiBoaWVyeiBpcyBlbmFibGVkKS4gT3IKKwkJCQkgICBtYXliZSByMjAwIGFjdHVhbGx5IGRvZXNuJ3QgbmVlZCB0byBwdXQgdGhlIGxvdy1yZXMgeiB2YWx1ZSBpbnRvCisJCQkJICAgdGhlIHRpbGUgY2FjaGUgbGlrZSByMTAwLCBidXQganVzdCBuZWVkcyB0byBjbGVhciB0aGUgaGktbGV2ZWwgei1idWZmZXI/CisJCQkJICAgV29ya3MgZm9yIFIxMDAsIGJvdGggd2l0aCBoaWVyeiBhbmQgd2l0aG91dC4KKwkJCQkgICBSMTAwIHNlZW1zIHRvIG9wZXJhdGUgb24gMngxIDh4OCB0aWxlcywgYnV0Li4uCisJCQkJICAgb2RkOiBvZmZzZXQvbnJ0aWxlcyBuZWVkIHRvIGJlIDY0IHBpeCAoNCBibG9jaykgYWxpZ25lZD8gUG90ZW50aWFsbHkKKwkJCQkgICBwcm9ibGVtYXRpYyB3aXRoIHJlc29sdXRpb25zIHdoaWNoIGFyZSBub3QgNjQgcGl4IGFsaWduZWQ/ICovCisJCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDY7CisJCQkJbnJ0aWxlc3ggPSAoKHBib3hbaV0ueDIgJiB+NjMpIC0gKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OworCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gMykgLSAocGJveFtpXS55MSA+PiAzKTsKKwkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKKwkJCQkJQkVHSU5fUklORyggNCApOworCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKKwkJCQkJLyogZmlyc3QgdGlsZSAqLworCQkJCQlPVVRfUklORyggdGlsZW9mZnNldCAqIDggKTsKKwkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLworCQkJCQlPVVRfUklORyggbnJ0aWxlc3ggKyA0ICk7CisJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLworCQkJCQlPVVRfUklORyggY2xlYXJtYXNrICk7CisJCQkJCUFEVkFOQ0VfUklORygpOworCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA2OworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjIwMCkgeworCQkJCS8qIHdvcmtzIGZvciBydjI1MC4gKi8KKwkJCQkvKiBmaW5kIGZpcnN0IG1hY3JvIHRpbGUgKDh4MiA0eDQgei1waXhlbHMgb24gcnYyNTApICovCisJCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDU7CisJCQkJbnJ0aWxlc3ggPSAocGJveFtpXS54MiA+PiA1KSAtIChwYm94W2ldLngxID4+IDUpOworCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gMykgLSAocGJveFtpXS55MSA+PiAzKTsKKwkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKKwkJCQkJQkVHSU5fUklORyggNCApOworCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKKwkJCQkJLyogZmlyc3QgdGlsZSAqLworCQkJCQkvKiBqdWRnaW5nIGJ5IHRoZSBmaXJzdCB0aWxlIG9mZnNldCBuZWVkZWQsIGNvdWxkIHBvc3NpYmx5CisJCQkJCSAgIGRpcmVjdGx5IGFkZHJlc3MvY2xlYXIgNHg0IHRpbGVzIGluc3RlYWQgb2YgOHgyICogNHg0CisJCQkJCSAgIG1hY3JvIHRpbGVzLCB0aG91Z2ggd291bGQgc3RpbGwgbmVlZCBjbGVhciBtYXNrIGZvcgorCQkJCQkgICByaWdodC9ib3R0b20gaWYgdHJ1ZWx5IDR4NCBncmFudWxhcml0eSBpcyBkZXNpcmVkID8gKi8KKwkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiAxNiApOworCQkJCQkvKiB0aGUgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyICovCisJCQkJCU9VVF9SSU5HKCBucnRpbGVzeCArIDEgKTsKKwkJCQkJLyogY2xlYXIgbWFzayA6IGNob29zZXMgdGhlIGNsZWFyaW5nIHBhdHRlcm4uICovCisJCQkJCU9VVF9SSU5HKCBjbGVhcm1hc2sgKTsKKwkJCQkJQURWQU5DRV9SSU5HKCk7CisJCQkJCXRpbGVvZmZzZXQgKz0gZGVwdGhwaXhwZXJsaW5lID4+IDU7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7IC8qIHJ2IDEwMCAqLworCQkJCS8qIHJ2MTAwIG1pZ2h0IG5vdCBuZWVkIDY0IHBpeCBhbGlnbm1lbnQsIHdobyBrbm93cyAqLworCQkJCS8qIG9mZnNldHMgYXJlLCBobW0sIHdlaXJkICovCisJCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiA0KSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDY7CisJCQkJbnJ0aWxlc3ggPSAoKHBib3hbaV0ueDIgJiB+NjMpIC0gKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OworCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gNCkgLSAocGJveFtpXS55MSA+PiA0KTsKKwkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKKwkJCQkJQkVHSU5fUklORyggNCApOworCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKKwkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiAxMjggKTsKKwkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLworCQkJCQlPVVRfUklORyggbnJ0aWxlc3ggKyA0ICk7CisJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLworCQkJCQlPVVRfUklORyggY2xlYXJtYXNrICk7CisJCQkJCUFEVkFOQ0VfUklORygpOworCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA2OworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFRPRE8gZG9uJ3QgYWx3YXlzIGNsZWFyIGFsbCBoaS1sZXZlbCB6IHRpbGVzICovCisJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9IQVNfSElFUlopICYmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApCisJCQkmJiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSkKKwkJLyogcjEwMCBhbmQgY2FyZHMgd2l0aG91dCBoaWVyYXJjaGljYWwgei1idWZmZXIgaGF2ZSBubyBoaWdoLWxldmVsIHotYnVmZmVyICovCisJCS8qIEZJWE1FIDogdGhlIG1hc2sgc3VwcG9zZWRseSBjb250YWlucyBsb3ctcmVzIHogdmFsdWVzLiBTbyBjYW4ndCBzZXQKKwkJICAganVzdCB0byB0aGUgbWF4ICgweGZmPyBvciBhY3R1YWxseSAweDNmZmY/KSwgbmVlZCB0byB0YWtlIHogY2xlYXIKKwkJICAgdmFsdWUgaW50byBhY2NvdW50PyAqLworCQl7CisJCQlCRUdJTl9SSU5HKCA0ICk7CisJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX0hJWiwgMiApICk7CisJCQlPVVRfUklORyggMHgwICk7IC8qIEZpcnN0IHRpbGUgKi8KKwkJCU9VVF9SSU5HKCAweDNjYzAgKTsKKwkJCU9VVF9SSU5HKCAoMHhmZjw8MjIpfCgweGZmPDw2KXwgMHgwMDNmMDAzZik7CisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0KKworCS8qIFdlIGhhdmUgdG8gY2xlYXIgdGhlIGRlcHRoIGFuZC9vciBzdGVuY2lsIGJ1ZmZlcnMgYnkKKwkgKiByZW5kZXJpbmcgYSBxdWFkIGludG8ganVzdCB0aG9zZSBidWZmZXJzLiAgVGh1cywgd2UgaGF2ZSB0bworCSAqIG1ha2Ugc3VyZSB0aGUgM0QgZW5naW5lIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5LgorCSAqLworCWlmICgoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IyMDApICYmCisJICAgIChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpKSB7CisKKwkJaW50IHRlbXBQUF9DTlRMOworCQlpbnQgdGVtcFJFX0NOVEw7CisJCWludCB0ZW1wUkIzRF9DTlRMOworCQlpbnQgdGVtcFJCM0RfWlNURU5DSUxDTlRMOworCQlpbnQgdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0s7CisJCWludCB0ZW1wUkIzRF9QTEFORU1BU0s7CisJCWludCB0ZW1wU0VfQ05UTDsKKwkJaW50IHRlbXBTRV9WVEVfQ05UTDsKKwkJaW50IHRlbXBTRV9WVFhfRk1UXzA7CisJCWludCB0ZW1wU0VfVlRYX0ZNVF8xOworCQlpbnQgdGVtcFNFX1ZBUF9DTlRMOworCQlpbnQgdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEw7CisKKwkJdGVtcFBQX0NOVEwgPSAwOworCQl0ZW1wUkVfQ05UTCA9IDA7CisKKwkJdGVtcFJCM0RfQ05UTCA9IGRlcHRoX2NsZWFyLT5yYjNkX2NudGw7CisKKwkJdGVtcFJCM0RfWlNURU5DSUxDTlRMID0gZGVwdGhfY2xlYXItPnJiM2RfenN0ZW5jaWxjbnRsOworCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IDB4MDsKKworCQl0ZW1wU0VfQ05UTCA9IGRlcHRoX2NsZWFyLT5zZV9jbnRsOworCisKKworCQkvKiBEaXNhYmxlIFRDTCAqLworCisJCXRlbXBTRV9WQVBfQ05UTCA9ICgvKiBTRV9WQVBfQ05UTF9fRk9SQ0VfV19UT19PTkVfTUFTSyB8ICAqLworCQkJCSAgICgweDkgPDwgU0VfVkFQX0NOVExfX1ZGX01BWF9WVFhfTlVNX19TSElGVCkpOworCisJCXRlbXBSQjNEX1BMQU5FTUFTSyA9IDB4MDsKKworCQl0ZW1wUkVfQVVYX1NDSVNTT1JfQ05UTCA9IDB4MDsKKworCQl0ZW1wU0VfVlRFX0NOVEwgPQorCQkJU0VfVlRFX0NOVExfX1ZUWF9YWV9GTVRfTUFTSyB8CisJCQlTRV9WVEVfQ05UTF9fVlRYX1pfRk1UX01BU0s7CisKKwkJLyogVmVydGV4IGZvcm1hdCAoWCwgWSwgWiwgVykqLworCQl0ZW1wU0VfVlRYX0ZNVF8wID0KKwkJCVNFX1ZUWF9GTVRfMF9fVlRYX1owX1BSRVNFTlRfTUFTSyB8CisJCQlTRV9WVFhfRk1UXzBfX1ZUWF9XMF9QUkVTRU5UX01BU0s7CisJCXRlbXBTRV9WVFhfRk1UXzEgPSAweDA7CisKKworCQkvKiAKKwkJICogRGVwdGggYnVmZmVyIHNwZWNpZmljIGVuYWJsZXMgCisJCSAqLworCQlpZiAoZmxhZ3MgJiBSQURFT05fREVQVEgpIHsKKwkJCS8qIEVuYWJsZSBkZXB0aCBidWZmZXIgKi8KKwkJCXRlbXBSQjNEX0NOVEwgfD0gUkFERU9OX1pfRU5BQkxFOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBkZXB0aCBidWZmZXIgKi8KKwkJCXRlbXBSQjNEX0NOVEwgJj0gflJBREVPTl9aX0VOQUJMRTsKKwkJfQorCisJCS8qIAorCQkgKiBTdGVuY2lsIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCisJCSAqLworCQlpZiAoIGZsYWdzICYgUkFERU9OX1NURU5DSUwgKSB7CisJCQl0ZW1wUkIzRF9DTlRMIHw9ICBSQURFT05fU1RFTkNJTF9FTkFCTEU7CisJCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IGNsZWFyLT5kZXB0aF9tYXNrOyAKKwkJfSBlbHNlIHsKKwkJCXRlbXBSQjNEX0NOVEwgJj0gflJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKKwkJCXRlbXBSQjNEX1NURU5DSUxSRUZNQVNLID0gMHgwMDAwMDAwMDsKKwkJfQorCisJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfQ09NUF9aQlVGKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFIHwKKwkJCQlSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfSElFUkFSQ0hZX0VOQUJMRTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDI2ICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKworCQlPVVRfUklOR19SRUcoIFJBREVPTl9QUF9DTlRMLCB0ZW1wUFBfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfUkVfQ05UTCwgdGVtcFJFX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9DTlRMLCB0ZW1wUkIzRF9DTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfWlNURU5DSUxDTlRMLAorCQkJICAgICAgdGVtcFJCM0RfWlNURU5DSUxDTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssIAorCQkJICAgICAgdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgKTsKKwkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9QTEFORU1BU0ssIHRlbXBSQjNEX1BMQU5FTUFTSyApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9TRV9DTlRMLCB0ZW1wU0VfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfU0VfVlRFX0NOVEwsIHRlbXBTRV9WVEVfQ05UTCApOworCQlPVVRfUklOR19SRUcoIFIyMDBfU0VfVlRYX0ZNVF8wLCB0ZW1wU0VfVlRYX0ZNVF8wICk7CisJCU9VVF9SSU5HX1JFRyggUjIwMF9TRV9WVFhfRk1UXzEsIHRlbXBTRV9WVFhfRk1UXzEgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1NFX1ZBUF9DTlRMLCB0ZW1wU0VfVkFQX0NOVEwgKTsKKwkJT1VUX1JJTkdfUkVHKCBSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwsIAorCQkJICAgICAgdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEwgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCQkKKwkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0gCisJCQkgKiAgc2V0cyB0b3AtbGVmdD8KKwkJCSAqLworCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwKKwkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCisJCQlCRUdJTl9SSU5HKCAxNCApOworCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFIyMDBfM0RfRFJBV19JTU1EXzIsIDEyICkgKTsKKwkJCU9VVF9SSU5HKCAoUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1QgfAorCQkJCSAgIFJBREVPTl9QUklNX1dBTEtfUklORyB8CisJCQkJICAgKDMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkpICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTFdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgzZjgwMDAwMCApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4M2Y4MDAwMDAgKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDNmODAwMDAwICk7CisJCQlBRFZBTkNFX1JJTkcoKTsKKwkJfQorCX0gCisJZWxzZSBpZiAoIChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpICkgeworCisJCWludCB0ZW1wUkIzRF9aU1RFTkNJTENOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF96c3RlbmNpbGNudGw7CisKKwkJcmIzZF9jbnRsID0gZGVwdGhfY2xlYXItPnJiM2RfY250bDsKKworCQlpZiAoIGZsYWdzICYgUkFERU9OX0RFUFRIICkgeworCQkJcmIzZF9jbnRsIHw9ICBSQURFT05fWl9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQlyYjNkX2NudGwgJj0gflJBREVPTl9aX0VOQUJMRTsKKwkJfQorCisJCWlmICggZmxhZ3MgJiBSQURFT05fU1RFTkNJTCApIHsKKwkJCXJiM2RfY250bCB8PSAgUkFERU9OX1NURU5DSUxfRU5BQkxFOworCQkJcmIzZF9zdGVuY2lscmVmbWFzayA9IGNsZWFyLT5kZXB0aF9tYXNrOyAvKiBtaXNuYW1lZCBmaWVsZCAqLworCQl9IGVsc2UgeworCQkJcmIzZF9jbnRsICY9IH5SQURFT05fU1RFTkNJTF9FTkFCTEU7CisJCQlyYjNkX3N0ZW5jaWxyZWZtYXNrID0gMHgwMDAwMDAwMDsKKwkJfQorCisJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfQ09NUF9aQlVGKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFIHwKKwkJCQlSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSB7CisJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfSElFUkFSQ0hZX0VOQUJMRTsKKwkJfQorCisJCUJFR0lOX1JJTkcoIDEzICk7CisJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0NOVEwsIDEgKSApOworCQlPVVRfUklORyggMHgwMDAwMDAwMCApOworCQlPVVRfUklORyggcmIzZF9jbnRsICk7CisJCQorCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1pTVEVOQ0lMQ05UTCwgdGVtcFJCM0RfWlNURU5DSUxDTlRMICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssCisJCQkgICAgICByYjNkX3N0ZW5jaWxyZWZtYXNrICk7CisJCU9VVF9SSU5HX1JFRyggUkFERU9OX1JCM0RfUExBTkVNQVNLLAorCQkJICAgICAgMHgwMDAwMDAwMCApOworCQlPVVRfUklOR19SRUcoIFJBREVPTl9TRV9DTlRMLAorCQkJICAgICAgZGVwdGhfY2xlYXItPnNlX2NudGwgKTsKKwkJQURWQU5DRV9SSU5HKCk7CisKKwkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KKwkJICovCisJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCQkKKwkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0gCisJCQkgKiAgc2V0cyB0b3AtbGVmdD8KKwkJCSAqLworCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwKKwkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCisJCQlCRUdJTl9SSU5HKCAxNSApOworCisJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0RSQVdfSU1NRCwgMTMgKSApOworCQkJT1VUX1JJTkcoIFJBREVPTl9WVFhfWl9QUkVTRU5UIHwKKwkJCQkgIFJBREVPTl9WVFhfUEtDT0xPUl9QUkVTRU5UKTsKKwkJCU9VVF9SSU5HKCAoUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1QgfAorCQkJCSAgIFJBREVPTl9QUklNX1dBTEtfUklORyB8CisJCQkJICAgUkFERU9OX01BT1NfRU5BQkxFIHwKKwkJCQkgICBSQURFT05fVlRYX0ZNVF9SQURFT05fTU9ERSB8CisJCQkJICAgKDMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkpICk7CisKKworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kxXSApOworCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOworCQkJT1VUX1JJTkcoIDB4MCApOworCisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7CisJCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7CisJCQlPVVRfUklORyggMHgwICk7CisKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0gKTsKKwkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKKwkJCU9VVF9SSU5HKCAweDAgKTsKKworCQkJQURWQU5DRV9SSU5HKCk7CisJCX0KKwl9CisKKwkvKiBJbmNyZW1lbnQgdGhlIGNsZWFyIGNvdW50ZXIuICBUaGUgY2xpZW50LXNpZGUgM0QgZHJpdmVyIG11c3QKKwkgKiB3YWl0IG9uIHRoaXMgdmFsdWUgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGNsZWFyIGlvY3RsLiAgV2UKKwkgKiBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY2FyZCdzIHNvIGRhbW5lZCBmYXN0Li4uCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfY2xlYXIrKzsKKworCUJFR0lOX1JJTkcoIDQgKTsKKworCVJBREVPTl9DTEVBUl9BR0UoIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyICk7CisJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJaW50IGk7CisJUklOR19MT0NBTFM7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgorCSAqLworCWlmIChkZXZfcHJpdi0+ZG9fYm94ZXMpCisJCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKworCisJLyogV2FpdCBmb3IgdGhlIDNEIHN0cmVhbSB0byBpZGxlIGJlZm9yZSBkaXNwYXRjaGluZyB0aGUgYml0Ymx0LgorCSAqIFRoaXMgd2lsbCBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBiZXR3ZWVuIHRoZSB0d28gc3RyZWFtcy4KKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisKKwlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWludCB4ID0gcGJveFtpXS54MTsKKwkJaW50IHkgPSBwYm94W2ldLnkxOworCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OworCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OworCisJCURSTV9ERUJVRyggImRpc3BhdGNoIHN3YXAgJWQsJWQtJWQsJWRcbiIsCisJCQkgICB4LCB5LCB3LCBoICk7CisKKwkJQkVHSU5fUklORyggNyApOworCisJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fQ05UTF9CSVRCTFRfTVVMVEksIDUgKSApOworCQlPVVRfUklORyggUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJICBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkgIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CisJCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJCSAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAorCQkJICBSQURFT05fUk9QM19TIHwKKwkJCSAgUkFERU9OX0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKKwkJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTIHwKKwkJCSAgUkFERU9OX0dNQ19XUl9NU0tfRElTICk7CisJCQorCQkvKiBNYWtlIHRoaXMgd29yayBldmVuIGlmIGZyb250ICYgYmFjayBhcmUgZmxpcHBlZDoKKwkJICovCisJCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDApIHsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7CisJCX0gCisJCWVsc2UgeworCQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQgKTsKKwkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgKTsKKwkJfQorCisJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7CisJCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisKKwkJQURWQU5DRV9SSU5HKCk7CisJfQorCisJLyogSW5jcmVtZW50IHRoZSBmcmFtZSBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CisJICogdGhyb3R0bGUgdGhlIGZyYW1lcmF0ZSBieSB3YWl0aW5nIGZvciB0aGlzIHZhbHVlIGJlZm9yZQorCSAqIHBlcmZvcm1pbmcgdGhlIHN3YXBidWZmZXIgaW9jdGwuCisJICovCisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUrKzsKKworCUJFR0lOX1JJTkcoIDQgKTsKKworCVJBREVPTl9GUkFNRV9BR0UoIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lICk7CisJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fc2FyZWFfdCAqc2FyZWEgPSAoZHJtX3NhcmVhX3QgKilkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZTsKKwlpbnQgb2Zmc2V0ID0gKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkKKwkJICAgPyBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0IDogZGV2X3ByaXYtPmJhY2tfb2Zmc2V0OworCVJJTkdfTE9DQUxTOworCURSTV9ERUJVRyggIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsIAorCQlfX0ZVTkNUSU9OX18sIAorCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlLAorCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZDdXJyZW50UGFnZSk7CisKKwkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgorCSAqLworCWlmIChkZXZfcHJpdi0+ZG9fYm94ZXMpIHsKKwkJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfRkxJUDsKKwkJcmFkZW9uX2NwX3BlcmZvcm1hbmNlX2JveGVzKCBkZXZfcHJpdiApOworCX0KKworCS8qIFVwZGF0ZSB0aGUgZnJhbWUgb2Zmc2V0cyBmb3IgYm90aCBDUlRDcworCSAqLworCUJFR0lOX1JJTkcoIDYgKTsKKworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwlPVVRfUklOR19SRUcoIFJBREVPTl9DUlRDX09GRlNFVCwgKCAoIHNhcmVhLT5mcmFtZS55ICogZGV2X3ByaXYtPmZyb250X3BpdGNoCisJCQkJCSAgICAgICsgc2FyZWEtPmZyYW1lLnggCisJCQkJCSAgICAgICogKCBkZXZfcHJpdi0+Y29sb3JfZm10IC0gMiApICkgJiB+NyApCisJCQkJCSAgKyBvZmZzZXQgKTsKKwlPVVRfUklOR19SRUcoIFJBREVPTl9DUlRDMl9PRkZTRVQsIGRldl9wcml2LT5zYXJlYV9wcml2LT5jcnRjMl9iYXNlCisJCQkJCSAgICsgb2Zmc2V0ICk7CisKKwlBRFZBTkNFX1JJTkcoKTsKKworCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAorCSAqIHRocm90dGxlIHRoZSBmcmFtZXJhdGUgYnkgd2FpdGluZyBmb3IgdGhpcyB2YWx1ZSBiZWZvcmUKKwkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgorCSAqLworCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKys7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0KKwkJCQkJICAgICAgMSAtIGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CisKKwlCRUdJTl9SSU5HKCAyICk7CisKKwlSQURFT05fRlJBTUVfQUdFKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyBpbnQgYmFkX3ByaW1fdmVydGV4X25yKCBpbnQgcHJpbWl0aXZlLCBpbnQgbnIgKQoreworCXN3aXRjaCAocHJpbWl0aXZlICYgUkFERU9OX1BSSU1fVFlQRV9NQVNLKSB7CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX05PTkU6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX1BPSU5UOgorCQlyZXR1cm4gbnIgPCAxOworCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9MSU5FOgorCQlyZXR1cm4gKG5yICYgMSkgfHwgbnIgPT0gMDsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfTElORV9TVFJJUDoKKwkJcmV0dXJuIG5yIDwgMjsKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX0xJU1Q6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfUE9JTlRfTElTVDoKKwljYXNlIFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1Q6CisJY2FzZSBSQURFT05fUFJJTV9UWVBFX1JFQ1RfTElTVDoKKwkJcmV0dXJuIG5yICUgMyB8fCBuciA9PSAwOworCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9UUklfRkFOOgorCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9UUklfU1RSSVA6CisJCXJldHVybiBuciA8IDM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQkKK30KKworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGZpbmlzaDsKKwl1bnNpZ25lZCBpbnQgcHJpbTsKKwl1bnNpZ25lZCBpbnQgbnVtdmVydHM7CisJdW5zaWduZWQgaW50IG9mZnNldDsgICAKKyAgICAgICAgdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKK30gZHJtX3JhZGVvbl90Y2xfcHJpbV90OworCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQkgICAgICAgZHJtX2J1Zl90ICpidWYsCisJCQkJICAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqcHJpbSApCisKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCBvZmZzZXQgPSBkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCArIGJ1Zi0+b2Zmc2V0ICsgcHJpbS0+c3RhcnQ7CisJaW50IG51bXZlcnRzID0gKGludClwcmltLT5udW12ZXJ0czsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisJaW50IGkgPSAwOworCVJJTkdfTE9DQUxTOworCisJRFJNX0RFQlVHKCJod3ByaW0gMHgleCB2Zm10IDB4JXggJWQuLiVkICVkIHZlcnRzXG4iLAorCQkgIHByaW0tPnByaW0sCisJCSAgcHJpbS0+dmNfZm9ybWF0LAorCQkgIHByaW0tPnN0YXJ0LAorCQkgIHByaW0tPmZpbmlzaCwKKwkJICBwcmltLT5udW12ZXJ0cyk7CisKKwlpZiAoYmFkX3ByaW1fdmVydGV4X25yKCBwcmltLT5wcmltLCBwcmltLT5udW12ZXJ0cyApKSB7CisJCURSTV9FUlJPUiggImJhZCBwcmltICV4IG51bXZlcnRzICVkXG4iLCAKKwkJCSAgIHByaW0tPnByaW0sIHByaW0tPm51bXZlcnRzICk7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCS8qIEVtaXQgdGhlIG5leHQgY2xpcHJlY3QgKi8KKwkJaWYgKCBpIDwgbmJveCApIHsKKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsIAorCQkJCQkgICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisJCX0KKworCQkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIHJlbmRlcmluZyBjb21tYW5kcyAqLworCQlCRUdJTl9SSU5HKCA1ICk7CisKKwkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0sIDMgKSApOworCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBudW12ZXJ0cyApOworCQlPVVRfUklORyggcHJpbS0+dmNfZm9ybWF0ICk7CisJCU9VVF9SSU5HKCBwcmltLT5wcmltIHwgUkFERU9OX1BSSU1fV0FMS19MSVNUIHwKKwkJCSAgUkFERU9OX0NPTE9SX09SREVSX1JHQkEgfAorCQkJICBSQURFT05fVlRYX0ZNVF9SQURFT05fTU9ERSB8CisJCQkgIChudW12ZXJ0cyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSApOworCisJCUFEVkFOQ0VfUklORygpOworCisJCWkrKzsKKwl9IHdoaWxlICggaSA8IG5ib3ggKTsKK30KKworCisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZHJtX2RldmljZV90ICpkZXYsIGRybV9idWZfdCAqYnVmICkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOworCVJJTkdfTE9DQUxTOworCisJYnVmX3ByaXYtPmFnZSA9ICsrZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CisKKwkvKiBFbWl0IHRoZSB2ZXJ0ZXggYnVmZmVyIGFnZSAqLworCUJFR0lOX1JJTkcoIDIgKTsKKwlSQURFT05fRElTUEFUQ0hfQUdFKCBidWZfcHJpdi0+YWdlICk7CisJQURWQU5DRV9SSU5HKCk7CisKKwlidWYtPnBlbmRpbmcgPSAxOworCWJ1Zi0+dXNlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdCggZHJtX2RldmljZV90ICpkZXYsCisJCQkJCSBkcm1fYnVmX3QgKmJ1ZiwKKwkJCQkJIGludCBzdGFydCwgaW50IGVuZCApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJpbmRpcmVjdDogYnVmPSVkIHM9MHgleCBlPTB4JXhcbiIsCisJCSAgIGJ1Zi0+aWR4LCBzdGFydCwgZW5kICk7CisKKwlpZiAoIHN0YXJ0ICE9IGVuZCApIHsKKwkJaW50IG9mZnNldCA9IChkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldAorCQkJICAgICAgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKKwkJaW50IGR3b3JkcyA9IChlbmQgLSBzdGFydCArIDMpIC8gc2l6ZW9mKHUzMik7CisKKwkJLyogSW5kaXJlY3QgYnVmZmVyIGRhdGEgbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZgorCQkgKiBkd29yZHMsIHNvIGlmIHdlJ3ZlIGJlZW4gZ2l2ZW4gYW4gb2RkIG51bWJlciB3ZSBtdXN0CisJCSAqIHBhZCB0aGUgZGF0YSB3aXRoIGEgVHlwZS0yIENQIHBhY2tldC4KKwkJICovCisJCWlmICggZHdvcmRzICYgMSApIHsKKwkJCXUzMiAqZGF0YSA9ICh1MzIgKikKKwkJCQkoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUKKwkJCQkgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKKwkJCWRhdGFbZHdvcmRzKytdID0gUkFERU9OX0NQX1BBQ0tFVDI7CisJCX0KKworCQkvKiBGaXJlIG9mZiB0aGUgaW5kaXJlY3QgYnVmZmVyICovCisJCUJFR0lOX1JJTkcoIDMgKTsKKworCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0NQX0lCX0JBU0UsIDEgKSApOworCQlPVVRfUklORyggb2Zmc2V0ICk7CisJCU9VVF9SSU5HKCBkd29yZHMgKTsKKworCQlBRFZBTkNFX1JJTkcoKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQlkcm1fYnVmX3QgKmVsdF9idWYsCisJCQkJCWRybV9yYWRlb25fdGNsX3ByaW1fdCAqcHJpbSApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlpbnQgb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKyBwcmltLT5vZmZzZXQ7CisJdTMyICpkYXRhOworCWludCBkd29yZHM7CisJaW50IGkgPSAwOworCWludCBzdGFydCA9IHByaW0tPnN0YXJ0ICsgUkFERU9OX0lOREVYX1BSSU1fT0ZGU0VUOworCWludCBjb3VudCA9IChwcmltLT5maW5pc2ggLSBzdGFydCkgLyBzaXplb2YodTE2KTsKKwlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CisKKwlEUk1fREVCVUcoImh3cHJpbSAweCV4IHZmbXQgMHgleCAlZC4uJWQgb2Zmc2V0OiAleCBuciAlZFxuIiwKKwkJICBwcmltLT5wcmltLAorCQkgIHByaW0tPnZjX2Zvcm1hdCwKKwkJICBwcmltLT5zdGFydCwKKwkJICBwcmltLT5maW5pc2gsCisJCSAgcHJpbS0+b2Zmc2V0LAorCQkgIHByaW0tPm51bXZlcnRzKTsKKworCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIoIHByaW0tPnByaW0sIGNvdW50ICkpIHsKKwkJRFJNX0VSUk9SKCAiYmFkIHByaW0gJXggY291bnQgJWRcbiIsIAorCQkJICAgcHJpbS0+cHJpbSwgY291bnQgKTsKKwkJcmV0dXJuOworCX0KKworCisJaWYgKCBzdGFydCA+PSBwcmltLT5maW5pc2ggfHwKKwkgICAgIChwcmltLT5zdGFydCAmIDB4NykgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCBwcmltLT5wcmltICk7CisJCXJldHVybjsKKwl9CisKKwlkd29yZHMgPSAocHJpbS0+ZmluaXNoIC0gcHJpbS0+c3RhcnQgKyAzKSAvIHNpemVvZih1MzIpOworCisJZGF0YSA9ICh1MzIgKikoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKworCQkgICAgICAgZWx0X2J1Zi0+b2Zmc2V0ICsgcHJpbS0+c3RhcnQpOworCisJZGF0YVswXSA9IENQX1BBQ0tFVDMoIFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0sIGR3b3Jkcy0yICk7CisJZGF0YVsxXSA9IG9mZnNldDsKKwlkYXRhWzJdID0gcHJpbS0+bnVtdmVydHM7CisJZGF0YVszXSA9IHByaW0tPnZjX2Zvcm1hdDsKKwlkYXRhWzRdID0gKHByaW0tPnByaW0gfAorCQkgICBSQURFT05fUFJJTV9XQUxLX0lORCB8CisJCSAgIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKKwkJICAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAorCQkgICAoY291bnQgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkgKTsKKworCWRvIHsKKwkJaWYgKCBpIDwgbmJveCApIAorCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwgCisJCQkJCSAgICAgICAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0gKTsKKworCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoIGRldiwgZWx0X2J1ZiwKKwkJCQkJICAgICBwcmltLT5zdGFydCwKKwkJCQkJICAgICBwcmltLT5maW5pc2ggKTsKKworCQlpKys7CisJfSB3aGlsZSAoIGkgPCBuYm94ICk7CisKK30KKworI2RlZmluZSBSQURFT05fTUFYX1RFWFRVUkVfU0laRSAoUkFERU9OX0JVRkZFUl9TSVpFIC0gOCAqIHNpemVvZih1MzIpKQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9kaXNwYXRjaF90ZXh0dXJlKCBEUk1GSUxFIGZpbHAsCisJCQkJICAgICAgIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCSAgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfdCAqdGV4LAorCQkJCSAgICAgICBkcm1fcmFkZW9uX3RleF9pbWFnZV90ICppbWFnZSApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX2J1Zl90ICpidWY7CisJdTMyIGZvcm1hdDsKKwl1MzIgKmJ1ZmZlcjsKKwljb25zdCB1OCBfX3VzZXIgKmRhdGE7CisJaW50IHNpemUsIGR3b3JkcywgdGV4X3dpZHRoLCBibGl0X3dpZHRoOworCXUzMiBoZWlnaHQ7CisJaW50IGk7CisJdTMyIHRleHBpdGNoLCBtaWNyb3RpbGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnRleC0+b2Zmc2V0ICkgKSB7CisJCURSTV9FUlJPUiggIkludmFsaWQgZGVzdGluYXRpb24gb2Zmc2V0XG4iICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9URVhUVVJFX0xPQUQ7CisKKwkvKiBGbHVzaCB0aGUgcGl4ZWwgY2FjaGUuICBUaGlzIGVuc3VyZXMgbm8gcGl4ZWwgZGF0YSBnZXRzIG1peGVkCisJICogdXAgd2l0aCB0aGUgdGV4dHVyZSBkYXRhIGZyb20gdGhlIGhvc3QgZGF0YSBibGl0LCBvdGhlcndpc2UKKwkgKiBwYXJ0IG9mIHRoZSB0ZXh0dXJlIGltYWdlIG1heSBiZSBjb3JydXB0ZWQuCisJICovCisJQkVHSU5fUklORyggNCApOworCVJBREVPTl9GTFVTSF9DQUNIRSgpOworCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCS8qIFRoZSBNZXNhIHRleHR1cmUgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBhcyB0aGUKKwkgKiBjaGlwIHdhbnRzIGl0LCBidXQgd2UgbmVlZCB0byBjb21wZW5zYXRlIGZvciB0aGUgZmFjdCB0aGF0IHRoZSBDUAorCSAqIHJpbmcgZ2V0cyBieXRlLXN3YXBwZWQKKwkgKi8KKwlCRUdJTl9SSU5HKCAyICk7CisJT1VUX1JJTkdfUkVHKCBSQURFT05fUkJCTV9HVUlDTlRMLCBSQURFT05fSE9TVF9EQVRBX1NXQVBfMzJCSVQgKTsKKwlBRFZBTkNFX1JJTkcoKTsKKyNlbmRpZgorCisKKwkvKiBUaGUgY29tcGlsZXIgd29uJ3Qgb3B0aW1pemUgYXdheSBhIGRpdmlzaW9uIGJ5IGEgdmFyaWFibGUsCisJICogZXZlbiBpZiB0aGUgb25seSBsZWdhbCB2YWx1ZXMgYXJlIHBvd2VycyBvZiB0d28uICBUaHVzLCB3ZSdsbAorCSAqIHVzZSBhIHNoaWZ0IGluc3RlYWQuCisJICovCisJc3dpdGNoICggdGV4LT5mb3JtYXQgKSB7CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQVJHQjg4ODg6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCQTg4ODg6CisJCWZvcm1hdCA9IFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjg4ODg7CisJCXRleF93aWR0aCA9IHRleC0+d2lkdGggKiA0OworCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogNDsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQUk4ODoKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9BUkdCMTU1NToKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9SR0I1NjU6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfQVJHQjQ0NDQ6CisJY2FzZSBSQURFT05fVFhGT1JNQVRfVllVWTQyMjoKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9ZVllVNDIyOgorCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NTsKKwkJdGV4X3dpZHRoID0gdGV4LT53aWR0aCAqIDI7CisJCWJsaXRfd2lkdGggPSBpbWFnZS0+d2lkdGggKiAyOworCQlicmVhazsKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9JODoKKwljYXNlIFJBREVPTl9UWEZPUk1BVF9SR0IzMzI6CisJCWZvcm1hdCA9IFJBREVPTl9DT0xPUl9GT1JNQVRfQ0k4OworCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogMTsKKwkJYmxpdF93aWR0aCA9IGltYWdlLT53aWR0aCAqIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUiggImludmFsaWQgdGV4dHVyZSBmb3JtYXQgJWRcbiIsIHRleC0+Zm9ybWF0ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXRleHBpdGNoID0gdGV4LT5waXRjaDsKKwlpZiAoKHRleHBpdGNoIDw8IDIyKSAmIFJBREVPTl9EU1RfVElMRV9NSUNSTykgeworCQltaWNyb3RpbGUgPSAxOworCQlpZiAodGV4X3dpZHRoIDwgNjQpIHsKKwkJCXRleHBpdGNoICY9IH4oUkFERU9OX0RTVF9USUxFX01JQ1JPID4+IDIyKTsKKwkJCS8qIHdlIGdvdCB0aWxlZCBjb29yZGluYXRlcywgdW50aWxlIHRoZW0gKi8KKwkJCWltYWdlLT54ICo9IDI7CisJCX0KKwl9CisJZWxzZSBtaWNyb3RpbGUgPSAwOworCisJRFJNX0RFQlVHKCJ0ZXg9JWR4JWQgYmxpdD0lZFxuIiwgdGV4X3dpZHRoLCB0ZXgtPmhlaWdodCwgYmxpdF93aWR0aCApOworCisJZG8geworCQlEUk1fREVCVUcoICJ0ZXg6IG9mcz0weCV4IHA9JWQgZj0lZCB4PSVoZCB5PSVoZCB3PSVoZCBoPSVoZFxuIiwKKwkJCSAgIHRleC0+b2Zmc2V0ID4+IDEwLCB0ZXgtPnBpdGNoLCB0ZXgtPmZvcm1hdCwKKwkJCSAgIGltYWdlLT54LCBpbWFnZS0+eSwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0ICk7CisKKwkJLyogTWFrZSBhIGNvcHkgb2Ygc29tZSBwYXJhbWV0ZXJzIGluIGNhc2Ugd2UgaGF2ZSB0bworCQkgKiB1cGRhdGUgdGhlbSBmb3IgYSBtdWx0aS1wYXNzIHRleHR1cmUgYmxpdC4KKwkJICovCisJCWhlaWdodCA9IGltYWdlLT5oZWlnaHQ7CisJCWRhdGEgPSAoY29uc3QgdTggX191c2VyICopaW1hZ2UtPmRhdGE7CisJCQorCQlzaXplID0gaGVpZ2h0ICogYmxpdF93aWR0aDsKKworCQlpZiAoIHNpemUgPiBSQURFT05fTUFYX1RFWFRVUkVfU0laRSApIHsKKwkJCWhlaWdodCA9IFJBREVPTl9NQVhfVEVYVFVSRV9TSVpFIC8gYmxpdF93aWR0aDsKKwkJCXNpemUgPSBoZWlnaHQgKiBibGl0X3dpZHRoOworCQl9IGVsc2UgaWYgKCBzaXplIDwgNCAmJiBzaXplID4gMCApIHsKKwkJCXNpemUgPSA0OworCQl9IGVsc2UgaWYgKCBzaXplID09IDAgKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoIGRldiApOworCQlpZiAoIDAgJiYgIWJ1ZiApIHsKKwkJCXJhZGVvbl9kb19jcF9pZGxlKCBkZXZfcHJpdiApOworCQkJYnVmID0gcmFkZW9uX2ZyZWVsaXN0X2dldCggZGV2ICk7CisJCX0KKwkJaWYgKCAhYnVmICkgeworCQkJRFJNX0RFQlVHKCJyYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZTogRUFHQUlOXG4iKTsKKwkJCWlmIChEUk1fQ09QWV9UT19VU0VSKCB0ZXgtPmltYWdlLCBpbWFnZSwgc2l6ZW9mKCppbWFnZSkgKSkKKwkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJcmV0dXJuIERSTV9FUlIoRUFHQUlOKTsKKwkJfQorCisKKwkJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlci4KKwkJICovCisJCWJ1ZmZlciA9ICh1MzIqKSgoY2hhciopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOworCQlkd29yZHMgPSBzaXplIC8gNDsKKwkJYnVmZmVyWzBdID0gQ1BfUEFDS0VUMyggUkFERU9OX0NOVExfSE9TVERBVEFfQkxULCBkd29yZHMgKyA2ICk7CisJCWJ1ZmZlclsxXSA9IChSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkgICAgIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CisJCQkgICAgIChmb3JtYXQgPDwgOCkgfAorCQkJICAgICBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CisJCQkgICAgIFJBREVPTl9ST1AzX1MgfAorCQkJICAgICBSQURFT05fRFBfU1JDX1NPVVJDRV9IT1NUX0RBVEEgfAorCQkJICAgICBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgfAorCQkJICAgICBSQURFT05fR01DX1dSX01TS19ESVMpOworCQkKKwkJYnVmZmVyWzJdID0gKHRleHBpdGNoIDw8IDIyKSB8ICh0ZXgtPm9mZnNldCA+PiAxMCk7CisJCWJ1ZmZlclszXSA9IDB4ZmZmZmZmZmY7CisJCWJ1ZmZlcls0XSA9IDB4ZmZmZmZmZmY7CisJCWJ1ZmZlcls1XSA9IChpbWFnZS0+eSA8PCAxNikgfCBpbWFnZS0+eDsKKwkJYnVmZmVyWzZdID0gKGhlaWdodCA8PCAxNikgfCBpbWFnZS0+d2lkdGg7CisJCWJ1ZmZlcls3XSA9IGR3b3JkczsKKwkJYnVmZmVyICs9IDg7CisKKwkJCisKKwkJaWYgKG1pY3JvdGlsZSkgeworCQkJLyogdGV4dHVyZSBtaWNybyB0aWxpbmcgaW4gdXNlLCBtaW5pbXVtIHRleHR1cmUgd2lkdGggaXMgdGh1cyAxNiBieXRlcy4KKwkJCSAgIGhvd2V2ZXIsIHdlIGNhbm5vdCB1c2UgYmxpdHRlciBkaXJlY3RseSBmb3IgdGV4dHVyZSB3aWR0aCA8IDY0IGJ5dGVzLAorCQkJICAgc2luY2UgbWluaW11bSB0ZXggcGl0Y2ggaXMgNjQgYnl0ZXMgYW5kIHdlIG5lZWQgdGhpcyB0byBtYXRjaAorCQkJICAgdGhlIHRleHR1cmUgd2lkdGgsIG90aGVyd2lzZSB0aGUgYmxpdHRlciB3aWxsIHRpbGUgaXQgd3JvbmcuCisJCQkgICBUaHVzLCB0aWxpbmcgbWFudWFsbHkgaW4gdGhpcyBjYXNlLiBBZGRpdGlvbmFsbHksIG5lZWQgdG8gc3BlY2lhbAorCQkJICAgY2FzZSB0ZXggaGVpZ2h0ID0gMSwgc2luY2Ugb3VyIGFjdHVhbCBpbWFnZSB3aWxsIGhhdmUgaGVpZ2h0IDIKKwkJCSAgIGFuZCB3ZSBuZWVkIHRvIGVuc3VyZSB3ZSBkb24ndCByZWFkIGJleW9uZCB0aGUgdGV4dHVyZSBzaXplCisJCQkgICBmcm9tIHVzZXIgc3BhY2UuICovCisJCQlpZiAodGV4LT5oZWlnaHQgPT0gMSkgeworCQkJCWlmICh0ZXhfd2lkdGggPj0gNjQgfHwgdGV4X3dpZHRoIDw9IDE2KSB7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLAorCQkJCQkJCSAgICAgICB0ZXhfd2lkdGggKiBzaXplb2YodTMyKSkpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAodGV4X3dpZHRoID09IDMyKSB7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLCAxNikpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDgsIGRhdGEgKyAxNiwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA+PSA2NCB8fCB0ZXhfd2lkdGggPT0gMTYpIHsKKwkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwKKwkJCQkJCSAgICAgICBkd29yZHMgKiBzaXplb2YodTMyKSkpIHsKKwkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gZGF0YSwgJWQgZHdvcmRzXG4iLAorCQkJCQkJICBkd29yZHMpOworCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodGV4X3dpZHRoIDwgMTYpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkrKykgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoKSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWJ1ZmZlciArPSA0OworCQkJCQlkYXRhICs9IHRleF93aWR0aDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA9PSAzMikgeworCQkJCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdoZW4gbm90IGZpdHRpbmcgaW4gb25lIGJ1ZmZlcgorCQkJCSAgIChpLmUuIDMyYnl0ZXMgeCAyMDQ4Li4uKSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSArPSAyKSB7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLCAxNikpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQkJfQorCQkJCQlkYXRhICs9IDE2OworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDgsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWRhdGEgKz0gMTY7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyICsgNCwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJZGF0YSArPSAxNjsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIgKyAxMiwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkJCX0KKwkJCQkJZGF0YSArPSAxNjsKKwkJCQkJYnVmZmVyICs9IDE2OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmICh0ZXhfd2lkdGggPj0gMzIpIHsKKwkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQorCQkJCSAqIGNhbiB1cGxvYWQgaXQgZGlyZWN0bHkuCisJCQkJICovCisJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsCisJCQkJCQkgICAgICAgZHdvcmRzICogc2l6ZW9mKHUzMikpKSB7CisJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIGRhdGEsICVkIGR3b3Jkc1xuIiwKKwkJCQkJCSAgZHdvcmRzKTsKKwkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFRleHR1cmUgaW1hZ2Ugd2lkdGggaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQorCQkJCSAqIG5lZWQgdG8gcGFkIG91dCBlYWNoIGltYWdlIHNjYW5saW5lIHRvIHRoZSBtaW5pbXVtCisJCQkJICogd2lkdGguCisJCQkJICovCisJCQkJZm9yIChpID0gMCA7IGkgPCB0ZXgtPmhlaWdodCA7IGkrKykgeworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoICkpIHsKKwkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsIHRleF93aWR0aCk7CisJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkJCQl9CisJCQkJCWJ1ZmZlciArPSA4OworCQkJCQlkYXRhICs9IHRleF93aWR0aDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlidWYtPmZpbHAgPSBmaWxwOworCQlidWYtPnVzZWQgPSAoZHdvcmRzICsgOCkgKiBzaXplb2YodTMyKTsKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGJ1ZiwgMCwgYnVmLT51c2VkICk7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKworCQkvKiBVcGRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG5leHQgdGltZSAqLworCQlpbWFnZS0+eSArPSBoZWlnaHQ7CisJCWltYWdlLT5oZWlnaHQgLT0gaGVpZ2h0OworCQlpbWFnZS0+ZGF0YSA9IChjb25zdCB1OCBfX3VzZXIgKilpbWFnZS0+ZGF0YSArIHNpemU7CisJfSB3aGlsZSAoaW1hZ2UtPmhlaWdodCA+IDApOworCisJLyogRmx1c2ggdGhlIHBpeGVsIGNhY2hlIGFmdGVyIHRoZSBibGl0IGNvbXBsZXRlcy4gIFRoaXMgZW5zdXJlcworCSAqIHRoZSB0ZXh0dXJlIGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gbWVtb3J5IGJlZm9yZSByZW5kZXJpbmcKKwkgKiBjb250aW51ZXMuCisJICovCisJQkVHSU5fUklORyggNCApOworCVJBREVPTl9GTFVTSF9DQUNIRSgpOworCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKKwlBRFZBTkNFX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3RpcHBsZSggZHJtX2RldmljZV90ICpkZXYsIHUzMiAqc3RpcHBsZSApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKwlSSU5HX0xPQ0FMUzsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUJFR0lOX1JJTkcoIDM1ICk7CisKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX1NUSVBQTEVfQUREUiwgMCApICk7CisJT1VUX1JJTkcoIDB4MDAwMDAwMDAgKTsKKworCU9VVF9SSU5HKCBDUF9QQUNLRVQwX1RBQkxFKCBSQURFT05fUkVfU1RJUFBMRV9EQVRBLCAzMSApICk7CisJZm9yICggaSA9IDAgOyBpIDwgMzIgOyBpKysgKSB7CisJCU9VVF9SSU5HKCBzdGlwcGxlW2ldICk7CisJfQorCisJQURWQU5DRV9SSU5HKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3MoaW50IHN1cmZfaW5kZXgsIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwlpZiAoIWRldl9wcml2LT5tbWlvKQorCQlyZXR1cm47CisKKwlyYWRlb25fZG9fY3BfaWRsZShkZXZfcHJpdik7CisKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0lORk8gKyAxNipzdXJmX2luZGV4LAorCQlkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0uZmxhZ3MpOworCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfTE9XRVJfQk9VTkQgKyAxNipzdXJmX2luZGV4LAorCQlkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0ubG93ZXIpOworCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfVVBQRVJfQk9VTkQgKyAxNipzdXJmX2luZGV4LAorCQlkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0udXBwZXIpOworfQorCisKKy8qIEFsbG9jYXRlcyBhIHZpcnR1YWwgc3VyZmFjZQorICogZG9lc24ndCBhbHdheXMgYWxsb2NhdGUgYSByZWFsIHN1cmZhY2UsIHdpbGwgc3RyZXRjaCBhbiBleGlzdGluZyAKKyAqIHN1cmZhY2Ugd2hlbiBwb3NzaWJsZS4KKyAqCisgKiBOb3RlIHRoYXQgcmVmY291bnQgY2FuIGJlIGF0IG1vc3QgMiwgc2luY2UgZHVyaW5nIGEgZnJlZSByZWZjb3VudD0zCisgKiBtaWdodCBtZWFuIHdlIGhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgc3VyZmFjZSB3aGljaCBtaWdodCBub3QgYWx3YXlzCisgKiBiZSBhdmFpbGFibGUuCisgKiBGb3IgZXhhbXBsZSA6IHdlIGFsbG9jYXRlIHRocmVlIGNvbnRpZ291cyBzdXJmYWNlcyBBQkMuIElmIEIgaXMgCisgKiBmcmVlZCwgd2Ugc3VkZGVubHkgbmVlZCB0d28gc3VyZmFjZXMgdG8gc3RvcmUgQSBhbmQgQywgd2hpY2ggbWlnaHQKKyAqIG5vdCBhbHdheXMgYmUgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50IGFsbG9jX3N1cmZhY2UoZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QqIG5ldywgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBEUk1GSUxFIGZpbHApCit7CisJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgKnM7CisJaW50IGk7CisJaW50IHZpcnRfc3VyZmFjZV9pbmRleDsKKwl1aW50MzJfdCBuZXdfdXBwZXIsIG5ld19sb3dlcjsKKworCW5ld19sb3dlciA9IG5ldy0+YWRkcmVzczsKKwluZXdfdXBwZXIgPSBuZXdfbG93ZXIgKyBuZXctPnNpemUgLSAxOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKChuZXdfbG93ZXIgPj0gbmV3X3VwcGVyKSB8fCAobmV3LT5mbGFncyA9PSAwKSB8fCAobmV3LT5zaXplID09IDApIHx8CisJCSgobmV3X3VwcGVyICYgUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKSAhPSBSQURFT05fU1VSRl9BRERSRVNTX0ZJWEVEX01BU0spIHx8CisJCSgobmV3X2xvd2VyICYgUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKSAhPSAwKSkKKwkJcmV0dXJuIC0xOworCisJLyogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG92ZXJsYXAgd2l0aCBleGlzdGluZyBzdXJmYWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKKwkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgIT0gMCkgJiYKKwkJKCggKG5ld19sb3dlciA+PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpICYmCisJCQkobmV3X2xvd2VyIDwgZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyKSApIHx8CisJCSAoIChuZXdfbG93ZXIgPCBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpICYmCisJCQkobmV3X3VwcGVyID4gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSApKSApeworCQlyZXR1cm4gLTE7fQorCX0KKworCS8qIGZpbmQgYSB2aXJ0dWFsIHN1cmZhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMipSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspCisJCWlmIChkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXS5maWxwID09IDApCisJCQlicmVhazsKKwlpZiAoaSA9PSAyKlJBREVPTl9NQVhfU1VSRkFDRVMpIHsKKwkJcmV0dXJuIC0xO30KKwl2aXJ0X3N1cmZhY2VfaW5kZXggPSBpOworCisJLyogdHJ5IHRvIHJldXNlIGFuIGV4aXN0aW5nIHN1cmZhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCS8qIGV4dGVuZCBiZWZvcmUgKi8KKwkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMSkgJiYKKwkJICAobmV3LT5mbGFncyA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0uZmxhZ3MpICYmCisJCSAgKG5ld191cHBlciArIDEgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSkgeworCQkJcyA9ICYoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbdmlydF9zdXJmYWNlX2luZGV4XSk7CisJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKKwkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOworCQkJcy0+dXBwZXIgPSBuZXdfdXBwZXI7CisJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CisJCQlzLT5maWxwID0gZmlscDsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCsrOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyID0gcy0+bG93ZXI7CisJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCXJldHVybiB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJCX0KKworCQkvKiBleHRlbmQgYWZ0ZXIgKi8KKwkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMSkgJiYKKwkJICAobmV3LT5mbGFncyA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0uZmxhZ3MpICYmCisJCSAgKG5ld19sb3dlciA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0udXBwZXIgKyAxKSkgeworCQkJcyA9ICYoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbdmlydF9zdXJmYWNlX2luZGV4XSk7CisJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKKwkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOworCQkJcy0+dXBwZXIgPSBuZXdfdXBwZXI7CisJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CisJCQlzLT5maWxwID0gZmlscDsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCsrOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyID0gcy0+dXBwZXI7CisJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCXJldHVybiB2aXJ0X3N1cmZhY2VfaW5kZXg7CisJCX0KKwl9CisKKwkvKiBva2F5LCB3ZSBuZWVkIGEgbmV3IG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKKwkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCA9PSAwKSB7CisJCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1t2aXJ0X3N1cmZhY2VfaW5kZXhdKTsKKwkJCXMtPnN1cmZhY2VfaW5kZXggPSBpOworCQkJcy0+bG93ZXIgPSBuZXdfbG93ZXI7CisJCQlzLT51cHBlciA9IG5ld191cHBlcjsKKwkJCXMtPmZsYWdzID0gbmV3LT5mbGFnczsKKwkJCXMtPmZpbHAgPSBmaWxwOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID0gMTsKKwkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlciA9IHMtPmxvd2VyOworCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyID0gcy0+dXBwZXI7CisJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0uZmxhZ3MgPSBzLT5mbGFnczsKKwkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwgZGV2X3ByaXYpOworCQkJcmV0dXJuIHZpcnRfc3VyZmFjZV9pbmRleDsKKwkJfQorCX0KKworCS8qIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGZyZWVfc3VyZmFjZShEUk1GSUxFIGZpbHAsIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGxvd2VyKQoreworCXN0cnVjdCByYWRlb25fdmlydF9zdXJmYWNlICpzOworCWludCBpOworCS8qIGZpbmQgdGhlIHZpcnR1YWwgc3VyZmFjZSAqLworCWZvcihpID0gMDsgaSA8IDIqUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CisJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldKTsKKwkJaWYgKHMtPmZpbHApIHsKKwkJCWlmICgobG93ZXIgPT0gcy0+bG93ZXIpICYmIChmaWxwID09IHMtPmZpbHApKSB7CisJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5sb3dlciA9PSBzLT5sb3dlcikKKwkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLmxvd2VyID0gcy0+dXBwZXI7CisKKwkJCQlpZiAoZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnVwcGVyID09IHMtPnVwcGVyKQorCQkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0udXBwZXIgPSBzLT5sb3dlcjsKKworCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5yZWZjb3VudC0tOworCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ucmVmY291bnQgPT0gMCkKKwkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLmZsYWdzID0gMDsKKwkJCQlzLT5maWxwID0gTlVMTDsKKwkJCQlyYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKHMtPnN1cmZhY2VfaW5kZXgsIGRldl9wcml2KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX3N1cmZhY2VzX3JlbGVhc2UoRFJNRklMRSBmaWxwLCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisJaW50IGk7CisJZm9yKCBpID0gMDsgaSA8IDIqUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKQorCXsKKwkJaWYgKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmZpbHAgPT0gZmlscCkKKwkJCWZyZWVfc3VyZmFjZShmaWxwLCBkZXZfcHJpdiwgZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbaV0ubG93ZXIpOworCX0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSU9DVEwgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX3N1cmZhY2VfYWxsb2MoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190IGFsbG9jOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFsbG9jLCAoZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QgX191c2VyICopZGF0YSwKKwkJCQkgIHNpemVvZihhbGxvYykpOworCisJaWYgKGFsbG9jX3N1cmZhY2UoJmFsbG9jLCBkZXZfcHJpdiwgZmlscCkgPT0gLTEpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fc3VyZmFjZV9mcmVlKERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90IG1lbWZyZWU7CisKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtZnJlZSwgKGRybV9yYWRlb25fbWVtX2ZyZWVfdCBfX3VzZXIgKilkYXRhLAorCQkJCSAgc2l6ZW9mKG1lbWZyZWUpICk7CisKKwlpZiAoZnJlZV9zdXJmYWNlKGZpbHAsIGRldl9wcml2LCBtZW1mcmVlLmFkZHJlc3MpKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2NsZWFyKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9yYWRlb25fY2xlYXJfdCBjbGVhcjsKKwlkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCBkZXB0aF9ib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGNsZWFyLCAoZHJtX3JhZGVvbl9jbGVhcl90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihjbGVhcikgKTsKKworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKworCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMgKQorCQlzYXJlYV9wcml2LT5uYm94ID0gUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUzsKKworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmZGVwdGhfYm94ZXMsIGNsZWFyLmRlcHRoX2JveGVzLAorCQkJICAgICBzYXJlYV9wcml2LT5uYm94ICogc2l6ZW9mKGRlcHRoX2JveGVzWzBdKSApICkKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKworCXJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhciggZGV2LCAmY2xlYXIsIGRlcHRoX2JveGVzICk7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCisKKy8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CisgKi8gCitzdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRyggIlxuIiApOworCisJQkVHSU5fUklORyggNiApOworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwsIDAgKSApOworCU9VVF9SSU5HKCBSQURFT05fUkVBRCggUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwgKSB8IFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwgKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMLCAwICkgKTsKKwlPVVRfUklORyggUkFERU9OX1JFQUQoIFJBREVPTl9DUlRDMl9PRkZTRVRfQ05UTCApIHwgUkFERU9OX0NSVENfT0ZGU0VUX0ZMSVBfQ05UTCApOworCUFEVkFOQ0VfUklORygpOworCisJZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgPSAxOworCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOworCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2hlbmV2ZXIgYSBjbGllbnQgZGllcywgZnJvbSBkcm1fcmVsZWFzZS4KKyAqIE5PVEU6ICBMb2NrIGlzbid0IG5lY2Vzc2FyaWx5IGhlbGQgd2hlbiB0aGlzIGlzIGNhbGxlZCEKKyAqLworc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQorCQlyYWRlb25fY3BfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisKKwlkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN3YXBwaW5nIGFuZCBmbGlwcGluZyBhcmUgZGlmZmVyZW50IG9wZXJhdGlvbnMsIG5lZWQgZGlmZmVyZW50IGlvY3Rscy4KKyAqIFRoZXkgY2FuICYgc2hvdWxkIGJlIGludGVybWl4ZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSAzZCB3aW5kb3dzLiAgCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2ZsaXAoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJRFJNX0RFQlVHKCAiXG4iICk7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJaWYgKCFkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykgCisJCXJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKCBkZXYgKTsKKwkJCisJcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoIGRldiApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3Bfc3dhcCggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlEUk1fREVCVUcoICJcbiIgKTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CisKKwlyYWRlb25fY3BfZGlzcGF0Y2hfc3dhcCggZGV2ICk7CisJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF92ZXJ0ZXgoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCWRybV9idWZfdCAqYnVmOworCWRybV9yYWRlb25fdmVydGV4X3QgdmVydGV4OworCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHZlcnRleCwgKGRybV9yYWRlb25fdmVydGV4X3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBjb3VudD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgICBEUk1fQ1VSUkVOVFBJRCwKKwkJICAgdmVydGV4LmlkeCwgdmVydGV4LmNvdW50LCB2ZXJ0ZXguZGlzY2FyZCApOworCisJaWYgKCB2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCB2ZXJ0ZXgucHJpbSA8IDAgfHwKKwkgICAgIHZlcnRleC5wcmltID4gUkFERU9OX1BSSU1fVFlQRV8zVlJUX0xJTkVfTElTVCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIHByaW0gJWRcbiIsIHZlcnRleC5wcmltICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4ICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJLyogQnVpbGQgdXAgYSBwcmltX3QgcmVjb3JkOgorCSAqLworCWlmICh2ZXJ0ZXguY291bnQpIHsKKwkJYnVmLT51c2VkID0gdmVydGV4LmNvdW50OyAvKiBub3QgdXNlZD8gKi8KKworCQlpZiAoIHNhcmVhX3ByaXYtPmRpcnR5ICYgflJBREVPTl9VUExPQURfQ0xJUFJFQ1RTICkgeworCQkJaWYgKCByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlLAorCQkJCQkJc2FyZWFfcHJpdi0+dGV4X3N0YXRlLAorCQkJCQkJc2FyZWFfcHJpdi0+ZGlydHkgKSApIHsKKwkJCQlEUk1fRVJST1IoICJyYWRlb25fZW1pdF9zdGF0ZSBmYWlsZWRcbiIgKTsKKwkJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCQl9CisKKwkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH4oUkFERU9OX1VQTE9BRF9URVgwSU1BR0VTIHwKKwkJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUyB8CisJCQkJCSAgICAgICBSQURFT05fVVBMT0FEX1RFWDJJTUFHRVMgfAorCQkJCQkgICAgICAgUkFERU9OX1JFUVVJUkVfUVVJRVNDRU5DRSk7CisJCX0KKworCQlwcmltLnN0YXJ0ID0gMDsKKwkJcHJpbS5maW5pc2ggPSB2ZXJ0ZXguY291bnQ7IC8qIHVudXNlZCAqLworCQlwcmltLnByaW0gPSB2ZXJ0ZXgucHJpbTsKKwkJcHJpbS5udW12ZXJ0cyA9IHZlcnRleC5jb3VudDsKKwkJcHJpbS52Y19mb3JtYXQgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dmNfZm9ybWF0OworCQkKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleCggZGV2LCBidWYsICZwcmltICk7CisJfQorCisJaWYgKHZlcnRleC5kaXNjYXJkKSB7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwl9CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9pbmRpY2VzKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcmFkZW9uX2luZGljZXNfdCBlbHRzOworCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOworCWludCBjb3VudDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGVsdHMsIChkcm1fcmFkZW9uX2luZGljZXNfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoZWx0cykgKTsKKworCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBzdGFydD0lZCBlbmQ9JWQgZGlzY2FyZD0lZFxuIiwKKwkJICAgRFJNX0NVUlJFTlRQSUQsCisJCSAgIGVsdHMuaWR4LCBlbHRzLnN0YXJ0LCBlbHRzLmVuZCwgZWx0cy5kaXNjYXJkICk7CisKKwlpZiAoIGVsdHMuaWR4IDwgMCB8fCBlbHRzLmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKKwkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICAgZWx0cy5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGVsdHMucHJpbSA8IDAgfHwKKwkgICAgIGVsdHMucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCBlbHRzLnByaW0gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbZWx0cy5pZHhdOworCisJaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKKwkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCWlmICggYnVmLT5wZW5kaW5nICkgeworCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBlbHRzLmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWNvdW50ID0gKGVsdHMuZW5kIC0gZWx0cy5zdGFydCkgLyBzaXplb2YodTE2KTsKKwllbHRzLnN0YXJ0IC09IFJBREVPTl9JTkRFWF9QUklNX09GRlNFVDsKKworCWlmICggZWx0cy5zdGFydCAmIDB4NyApIHsKKwkJRFJNX0VSUk9SKCAibWlzYWxpZ25lZCBidWZmZXIgMHgleFxuIiwgZWx0cy5zdGFydCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlpZiAoIGVsdHMuc3RhcnQgPCBidWYtPnVzZWQgKSB7CisJCURSTV9FUlJPUiggIm5vIGhlYWRlciAweCV4IC0gMHgleFxuIiwgZWx0cy5zdGFydCwgYnVmLT51c2VkICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmLT51c2VkID0gZWx0cy5lbmQ7CisKKwlpZiAoIHNhcmVhX3ByaXYtPmRpcnR5ICYgflJBREVPTl9VUExPQURfQ0xJUFJFQ1RTICkgeworCQlpZiAoIHJhZGVvbl9lbWl0X3N0YXRlKCBkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKKwkJCQkJc2FyZWFfcHJpdi0+dGV4X3N0YXRlLAorCQkJCQlzYXJlYV9wcml2LT5kaXJ0eSApICkgeworCQkJRFJNX0VSUk9SKCAicmFkZW9uX2VtaXRfc3RhdGUgZmFpbGVkXG4iICk7CisJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCX0KKworCQlzYXJlYV9wcml2LT5kaXJ0eSAmPSB+KFJBREVPTl9VUExPQURfVEVYMElNQUdFUyB8CisJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUyB8CisJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMklNQUdFUyB8CisJCQkJICAgICAgIFJBREVPTl9SRVFVSVJFX1FVSUVTQ0VOQ0UpOworCX0KKworCisJLyogQnVpbGQgdXAgYSBwcmltX3QgcmVjb3JkOgorCSAqLworCXByaW0uc3RhcnQgPSBlbHRzLnN0YXJ0OworCXByaW0uZmluaXNoID0gZWx0cy5lbmQ7IAorCXByaW0ucHJpbSA9IGVsdHMucHJpbTsKKwlwcmltLm9mZnNldCA9IDA7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGRtYSBidWZmZXJzICovCisJcHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7IC8qIGR1aCAqLworCXByaW0udmNfZm9ybWF0ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKKwkKKwlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyggZGV2LCBidWYsICZwcmltICk7CisJaWYgKGVsdHMuZGlzY2FyZCkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfdGV4dHVyZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3RleHR1cmVfdCB0ZXg7CisJZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBpbWFnZTsKKwlpbnQgcmV0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggdGV4LCAoZHJtX3JhZGVvbl90ZXh0dXJlX3QgX191c2VyICopZGF0YSwgc2l6ZW9mKHRleCkgKTsKKworCWlmICggdGV4LmltYWdlID09IE5VTEwgKSB7CisJCURSTV9FUlJPUiggIm51bGwgdGV4dHVyZSBpbWFnZSFcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJmltYWdlLAorCQkJICAgICAoZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBfX3VzZXIgKil0ZXguaW1hZ2UsCisJCQkgICAgIHNpemVvZihpbWFnZSkgKSApCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlyZXQgPSByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZSggZmlscCwgZGV2LCAmdGV4LCAmaW1hZ2UgKTsKKworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByYWRlb25fY3Bfc3RpcHBsZSggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fcmFkZW9uX3N0aXBwbGVfdCBzdGlwcGxlOworCXUzMiBtYXNrWzMyXTsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHN0aXBwbGUsIChkcm1fcmFkZW9uX3N0aXBwbGVfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2Yoc3RpcHBsZSkgKTsKKworCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmbWFzaywgc3RpcHBsZS5tYXNrLCAzMiAqIHNpemVvZih1MzIpICkgKQorCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoIGRldiwgbWFzayApOworCisJQ09NTUlUX1JJTkcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWRlb25fY3BfaW5kaXJlY3QoIERSTV9JT0NUTF9BUkdTICkKK3sKKwlEUk1fREVWSUNFOworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWY7CisJZHJtX3JhZGVvbl9pbmRpcmVjdF90IGluZGlyZWN0OworCVJJTkdfTE9DQUxTOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBpbmRpcmVjdCwgKGRybV9yYWRlb25faW5kaXJlY3RfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YoaW5kaXJlY3QpICk7CisKKwlEUk1fREVCVUcoICJpbmRpcmVjdDogaWR4PSVkIHM9JWQgZT0lZCBkPSVkXG4iLAorCQkgICBpbmRpcmVjdC5pZHgsIGluZGlyZWN0LnN0YXJ0LAorCQkgICBpbmRpcmVjdC5lbmQsIGluZGlyZWN0LmRpc2NhcmQgKTsKKworCWlmICggaW5kaXJlY3QuaWR4IDwgMCB8fCBpbmRpcmVjdC5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7CisJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgIGluZGlyZWN0LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJYnVmID0gZG1hLT5idWZsaXN0W2luZGlyZWN0LmlkeF07CisKKwlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgeworCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisJaWYgKCBidWYtPnBlbmRpbmcgKSB7CisJCURSTV9FUlJPUiggInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGluZGlyZWN0LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggaW5kaXJlY3Quc3RhcnQgPCBidWYtPnVzZWQgKSB7CisJCURSTV9FUlJPUiggInJldXNpbmcgaW5kaXJlY3Q6IHN0YXJ0PTB4JXggYWN0dWFsPTB4JXhcbiIsCisJCQkgICBpbmRpcmVjdC5zdGFydCwgYnVmLT51c2VkICk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCisJYnVmLT51c2VkID0gaW5kaXJlY3QuZW5kOworCisJLyogV2FpdCBmb3IgdGhlIDNEIHN0cmVhbSB0byBpZGxlIGJlZm9yZSB0aGUgaW5kaXJlY3QgYnVmZmVyCisJICogY29udGFpbmluZyAyRCBhY2NlbGVyYXRpb24gY29tbWFuZHMgaXMgcHJvY2Vzc2VkLgorCSAqLworCUJFR0lOX1JJTkcoIDIgKTsKKworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKworCUFEVkFOQ0VfUklORygpOworCisJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlciBmdWxsIG9mIGNvbW1hbmRzIGZyb20gdGhlCisJICogWCBzZXJ2ZXIuICBUaGlzIGlzIGluc2VjdXJlIGFuZCBpcyB0aHVzIG9ubHkgYXZhaWxhYmxlIHRvCisJICogcHJpdmlsZWdlZCBjbGllbnRzLgorCSAqLworCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdCggZGV2LCBidWYsIGluZGlyZWN0LnN0YXJ0LCBpbmRpcmVjdC5lbmQgKTsKKwlpZiAoaW5kaXJlY3QuZGlzY2FyZCkgeworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJfQorCisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF92ZXJ0ZXgyKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKKwlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlkcm1fYnVmX3QgKmJ1ZjsKKwlkcm1fcmFkZW9uX3ZlcnRleDJfdCB2ZXJ0ZXg7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBsYXN0c3RhdGU7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJaWYgKCAhZGV2X3ByaXYgKSB7CisJCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCB2ZXJ0ZXgsIChkcm1fcmFkZW9uX3ZlcnRleDJfdCBfX3VzZXIgKilkYXRhLAorCQkJICAgICBzaXplb2YodmVydGV4KSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkIGluZGV4PSVkIGRpc2NhcmQ9JWRcbiIsCisJCSAgIERSTV9DVVJSRU5UUElELAorCQkgICB2ZXJ0ZXguaWR4LCB2ZXJ0ZXguZGlzY2FyZCApOworCisJaWYgKCB2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlidWYgPSBkbWEtPmJ1Zmxpc3RbdmVydGV4LmlkeF07CisKKwlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgeworCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKKwkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgdmVydGV4LmlkeCApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwkKKwlpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlmb3IgKGxhc3RzdGF0ZSA9IDB4ZmYsIGkgPSAwIDsgaSA8IHZlcnRleC5ucl9wcmltcyA7IGkrKykgeworCQlkcm1fcmFkZW9uX3ByaW1fdCBwcmltOworCQlkcm1fcmFkZW9uX3RjbF9wcmltX3QgdGNscHJpbTsKKwkJCisJCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmcHJpbSwgJnZlcnRleC5wcmltW2ldLCBzaXplb2YocHJpbSkgKSApCisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQkKKwkJaWYgKCBwcmltLnN0YXRlaWR4ICE9IGxhc3RzdGF0ZSApIHsKKwkJCWRybV9yYWRlb25fc3RhdGVfdCBzdGF0ZTsJCQkgICAgICAgCisJCQkJCisJCQlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJnN0YXRlLCAKKwkJCQkJICAgICAmdmVydGV4LnN0YXRlW3ByaW0uc3RhdGVpZHhdLCAKKwkJCQkJICAgICBzaXplb2Yoc3RhdGUpICkgKQorCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkJCWlmICggcmFkZW9uX2VtaXRfc3RhdGUyKCBkZXZfcHJpdiwgZmlscF9wcml2LCAmc3RhdGUgKSApIHsKKwkJCQlEUk1fRVJST1IoICJyYWRlb25fZW1pdF9zdGF0ZTIgZmFpbGVkXG4iICk7CisJCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJfQorCisJCQlsYXN0c3RhdGUgPSBwcmltLnN0YXRlaWR4OworCQl9CisKKwkJdGNscHJpbS5zdGFydCA9IHByaW0uc3RhcnQ7CisJCXRjbHByaW0uZmluaXNoID0gcHJpbS5maW5pc2g7CisJCXRjbHByaW0ucHJpbSA9IHByaW0ucHJpbTsKKwkJdGNscHJpbS52Y19mb3JtYXQgPSBwcmltLnZjX2Zvcm1hdDsKKworCQlpZiAoIHByaW0ucHJpbSAmIFJBREVPTl9QUklNX1dBTEtfSU5EICkgeworCQkJdGNscHJpbS5vZmZzZXQgPSBwcmltLm51bXZlcnRzICogNjQ7CisJCQl0Y2xwcmltLm51bXZlcnRzID0gUkFERU9OX01BWF9WQl9WRVJUUzsgLyogZHVoICovCisKKwkJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpY2VzKCBkZXYsIGJ1ZiwgJnRjbHByaW0gKTsKKwkJfSBlbHNlIHsKKwkJCXRjbHByaW0ubnVtdmVydHMgPSBwcmltLm51bXZlcnRzOworCQkJdGNscHJpbS5vZmZzZXQgPSAwOyAvKiBub3QgdXNlZCAqLworCisJCQlyYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KCBkZXYsIGJ1ZiwgJnRjbHByaW0gKTsKKwkJfQorCQkKKwkJaWYgKHNhcmVhX3ByaXYtPm5ib3ggPT0gMSkKKwkJCXNhcmVhX3ByaXYtPm5ib3ggPSAwOworCX0KKworCWlmICggdmVydGV4LmRpc2NhcmQgKSB7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwl9CisKKwlDT01NSVRfUklORygpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0cyggCisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCWRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJaW50IGlkID0gKGludCloZWFkZXIucGFja2V0LnBhY2tldF9pZDsKKwlpbnQgc3osIHJlZzsKKwlpbnQgKmRhdGEgPSAoaW50ICopY21kYnVmLT5idWY7CisJUklOR19MT0NBTFM7CisgICAKKwlpZiAoaWQgPj0gUkFERU9OX01BWF9TVEFURV9QQUNLRVRTKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCisJc3ogPSBwYWNrZXRbaWRdLmxlbjsKKwlyZWcgPSBwYWNrZXRbaWRdLnN0YXJ0OworCisJaWYgKHN6ICogc2l6ZW9mKGludCkgPiBjbWRidWYtPmJ1ZnN6KSB7CisJCURSTV9FUlJPUiggIlBhY2tldCBzaXplIHByb3ZpZGVkIGxhcmdlciB0aGFuIGRhdGEgcHJvdmlkZWRcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyggZGV2X3ByaXYsIGZpbHBfcHJpdiwgaWQsIGRhdGEgKSApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCX0KKworCUJFR0lOX1JJTkcoc3orMSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIHJlZywgKHN6LTEpICkgKTsKKwlPVVRfUklOR19UQUJMRSggZGF0YSwgc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CisJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFycyggCisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAorCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKKwlkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmICkKK3sKKwlpbnQgc3ogPSBoZWFkZXIuc2NhbGFycy5jb3VudDsKKwlpbnQgc3RhcnQgPSBoZWFkZXIuc2NhbGFycy5vZmZzZXQ7CisJaW50IHN0cmlkZSA9IGhlYWRlci5zY2FsYXJzLnN0cmlkZTsKKwlSSU5HX0xPQ0FMUzsKKworCUJFR0lOX1JJTkcoIDMrc3ogKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1RDTF9TQ0FMQVJfSU5EWF9SRUcsIDAgKSApOworCU9VVF9SSU5HKCBzdGFydCB8IChzdHJpZGUgPDwgUkFERU9OX1NDQUxfSU5EWF9EV09SRF9TVFJJREVfU0hJRlQpKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1NFX1RDTF9TQ0FMQVJfREFUQV9SRUcsIHN6LTEgKSApOworCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1Ziwgc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKwljbWRidWYtPmJ1ZiArPSBzeiAqIHNpemVvZihpbnQpOworCWNtZGJ1Zi0+YnVmc3ogLT0gc3ogKiBzaXplb2YoaW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogR29kIHRoaXMgaXMgdWdseQorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFyczIoIAorCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKKwlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CisJaW50IHN0YXJ0ID0gKCh1bnNpZ25lZCBpbnQpaGVhZGVyLnNjYWxhcnMub2Zmc2V0KSArIDB4MTAwOworCWludCBzdHJpZGUgPSBoZWFkZXIuc2NhbGFycy5zdHJpZGU7CisJUklOR19MT0NBTFM7CisKKwlCRUdJTl9SSU5HKCAzK3N6ICk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0lORFhfUkVHLCAwICkgKTsKKwlPVVRfUklORyggc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7CisJT1VUX1JJTkcoIENQX1BBQ0tFVDBfVEFCTEUoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzei0xICkgKTsKKwlPVVRfUklOR19UQUJMRSggY21kYnVmLT5idWYsIHN6ICk7CisJQURWQU5DRV9SSU5HKCk7CisJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKKwljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fZW1pdF92ZWN0b3JzKCAKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQoreworCWludCBzeiA9IGhlYWRlci52ZWN0b3JzLmNvdW50OworCWludCBzdGFydCA9IGhlYWRlci52ZWN0b3JzLm9mZnNldDsKKwlpbnQgc3RyaWRlID0gaGVhZGVyLnZlY3RvcnMuc3RyaWRlOworCVJJTkdfTE9DQUxTOworCisJQkVHSU5fUklORyggMytzeiApOworCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfVENMX1ZFQ1RPUl9JTkRYX1JFRywgMCApICk7CisJT1VUX1JJTkcoIHN0YXJ0IHwgKHN0cmlkZSA8PCBSQURFT05fVkVDX0lORFhfT0NUV09SRF9TVFJJREVfU0hJRlQpKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1NFX1RDTF9WRUNUT1JfREFUQV9SRUcsIChzei0xKSApICk7CisJT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBzeiApOworCUFEVkFOQ0VfUklORygpOworCisJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKKwljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzKCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCQlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCisJCQkJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY21kc3o7CisJaW50IHJldDsKKwlSSU5HX0xPQ0FMUzsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWlmICggKCByZXQgPSByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoIGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICAgIGNtZGJ1ZiwgJmNtZHN6ICkgKSApIHsKKwkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlCRUdJTl9SSU5HKCBjbWRzeiApOworCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1ZiwgY21kc3ogKTsKKwlBRFZBTkNFX1JJTkcoKTsKKworCWNtZGJ1Zi0+YnVmICs9IGNtZHN6ICogNDsKKwljbWRidWYtPmJ1ZnN6IC09IGNtZHN6ICogNDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3QoIGRybV9kZXZpY2VfdCAqZGV2LAorCQkJCQkgZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorCQkJCQkgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKKwkJCQkJIGludCBvcmlnX25ib3ggKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2NsaXBfcmVjdF90IGJveDsKKwl1bnNpZ25lZCBpbnQgY21kc3o7CisJaW50IHJldDsKKwlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlcyA9IGNtZGJ1Zi0+Ym94ZXM7CisJaW50IGkgPSAwOworCVJJTkdfTE9DQUxTOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJaWYgKCAoIHJldCA9IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0MyggZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAgY21kYnVmLCAmY21kc3ogKSApICkgeworCQlEUk1fRVJST1IoICJQYWNrZXQgdmVyaWZpY2F0aW9uIGZhaWxlZFxuIiApOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghb3JpZ19uYm94KQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJaWYgKCBpIDwgY21kYnVmLT5uYm94ICkgeworCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUiggJmJveCwgJmJveGVzW2ldLCBzaXplb2YoYm94KSApKQorCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCQkvKiBGSVhNRSBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHRpbWVzIHJvdW5kCisJCQkgKiB0aGlzIGxvb3AsIHNlbmQgYSBXQUlUX1VOVElMXzNEX0lETEUgYmVmb3JlCisJCQkgKiBjYWxsaW5nIGVtaXRfY2xpcF9yZWN0KCkuIFRoaXMgZml4ZXMgYQorCQkJICogbG9ja3VwIG9uIGZhc3QgbWFjaGluZXMgd2hlbiBzZW5kaW5nCisJCQkgKiBzZXZlcmFsIGNsaXByZWN0cyB3aXRoIGEgY21kYnVmLCBhcyB3aGVuCisJCQkgKiB3YXZpbmcgYSAyRCB3aW5kb3cgb3ZlciBhIDNECisJCQkgKiB3aW5kb3cuIFNvbWV0aGluZyBpbiB0aGUgY29tbWFuZHMgZnJvbSB1c2VyCisJCQkgKiBzcGFjZSBzZWVtcyB0byBoYW5nIHRoZSBjYXJkIHdoZW4gdGhleSdyZQorCQkJICogc2VudCBzZXZlcmFsIHRpbWVzIGluIGEgcm93LiBUaGF0IHdvdWxkIGJlCisJCQkgKiB0aGUgY29ycmVjdCBwbGFjZSB0byBmaXggaXQgYnV0IHRoaXMgd29ya3MKKwkJCSAqIGFyb3VuZCBpdCB1bnRpbCBJIGNhbiBmaWd1cmUgdGhhdCBvdXQgLSBUaW0KKwkJCSAqIFNtaXRoICovCisJCQlpZiAoIGkgKSB7CisJCQkJQkVHSU5fUklORyggMiApOworCQkJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwkJCQlBRFZBTkNFX1JJTkcoKTsKKwkJCX0KKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsICZib3ggKTsKKwkJfQorCQkKKwkJQkVHSU5fUklORyggY21kc3ogKTsKKwkJT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBjbWRzeiApOworCQlBRFZBTkNFX1JJTkcoKTsKKworCX0gd2hpbGUgKCArK2kgPCBjbWRidWYtPm5ib3ggKTsKKyAJaWYgKGNtZGJ1Zi0+bmJveCA9PSAxKQorCQljbWRidWYtPm5ib3ggPSAwOworCisgb3V0OgorCWNtZGJ1Zi0+YnVmICs9IGNtZHN6ICogNDsKKwljbWRidWYtPmJ1ZnN6IC09IGNtZHN6ICogNDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3dhaXQoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZmxhZ3MgKQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJUklOR19MT0NBTFM7CisKKwlEUk1fREVCVUcoIiVzOiAleFxuIiwgX19GVU5DVElPTl9fLCBmbGFncyk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgUkFERU9OX1dBSVRfMkQ6CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOyAKKwkJQURWQU5DRV9SSU5HKCk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1dBSVRfM0Q6CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOyAKKwkJQURWQU5DRV9SSU5HKCk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1dBSVRfMkR8UkFERU9OX1dBSVRfM0Q6CisJCUJFR0lOX1JJTkcoIDIgKTsKKwkJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOyAKKwkJQURWQU5DRV9SSU5HKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2NtZGJ1ZiggRFJNX0lPQ1RMX0FSR1MgKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CisJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJZHJtX2J1Zl90ICpidWYgPSBOVUxMOworCWludCBpZHg7CisJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgY21kYnVmOworCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlcjsKKwlpbnQgb3JpZ19uYm94LCBvcmlnX2J1ZnN6OworCWNoYXIgKmtidWY9TlVMTDsKKworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGNtZGJ1ZiwgKGRybV9yYWRlb25fY21kX2J1ZmZlcl90IF9fdXNlciAqKWRhdGEsCisJCQkgICAgIHNpemVvZihjbWRidWYpICk7CisKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisKKwlpZiAoY21kYnVmLmJ1ZnN6ID4gNjQqMTAyNCB8fCBjbWRidWYuYnVmc3o8MCkgeworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCS8qIEFsbG9jYXRlIGFuIGluLWtlcm5lbCBhcmVhIGFuZCBjb3B5IGluIHRoZSBjbWRidWYuICBEbyB0aGlzIHRvIGF2b2lkCisJICogcmFjZXMgYmV0d2VlbiBjaGVja2luZyB2YWx1ZXMgYW5kIHVzaW5nIHRob3NlIHZhbHVlcyBpbiBvdGhlciBjb2RlLAorCSAqIGFuZCBzaW1wbHkgdG8gYXZvaWQgYSBsb3Qgb2YgZnVuY3Rpb24gY2FsbHMgdG8gY29weSBpbiBkYXRhLgorCSAqLworCW9yaWdfYnVmc3ogPSBjbWRidWYuYnVmc3o7CisJaWYgKG9yaWdfYnVmc3ogIT0gMCkgeworCQlrYnVmID0gZHJtX2FsbG9jKGNtZGJ1Zi5idWZzeiwgRFJNX01FTV9EUklWRVIpOworCQlpZiAoa2J1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrYnVmLCBjbWRidWYuYnVmLCBjbWRidWYuYnVmc3opKSB7CisJCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CisJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCQl9CisJCWNtZGJ1Zi5idWYgPSBrYnVmOworCX0KKworCW9yaWdfbmJveCA9IGNtZGJ1Zi5uYm94OworCisJd2hpbGUgKCBjbWRidWYuYnVmc3ogPj0gc2l6ZW9mKGhlYWRlcikgKSB7CisKKwkJaGVhZGVyLmkgPSAqKGludCAqKWNtZGJ1Zi5idWY7CisJCWNtZGJ1Zi5idWYgKz0gc2l6ZW9mKGhlYWRlcik7CisJCWNtZGJ1Zi5idWZzeiAtPSBzaXplb2YoaGVhZGVyKTsKKworCQlzd2l0Y2ggKGhlYWRlci5oZWFkZXIuY21kX3R5cGUpIHsKKwkJY2FzZSBSQURFT05fQ01EX1BBQ0tFVDogCisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfUEFDS0VUXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXRzKCBkZXZfcHJpdiwgZmlscF9wcml2LCBoZWFkZXIsICZjbWRidWYgKSkgeworCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfcGFja2V0cyBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1NDQUxBUlM6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfU0NBTEFSU1xuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfc2NhbGFycyggZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zY2FsYXJzIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBREVPTl9DTURfVkVDVE9SUzoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9WRUNUT1JTXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF92ZWN0b3JzKCBkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3ZlY3RvcnMgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9ETUFfRElTQ0FSRDoKKwkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9ETUFfRElTQ0FSRFxuIik7CisJCQlpZHggPSBoZWFkZXIuZG1hLmJ1Zl9pZHg7CisJCQlpZiAoIGlkeCA8IDAgfHwgaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgeworCQkJCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCQkJICAgaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJYnVmID0gZG1hLT5idWZsaXN0W2lkeF07CisJCQlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwIHx8IGJ1Zi0+cGVuZGluZyApIHsKKwkJCQlEUk1fRVJST1IoICJiYWQgYnVmZmVyICVwICVwICVkXG4iLAorCQkJCQkgICBidWYtPmZpbHAsIGZpbHAsIGJ1Zi0+cGVuZGluZyk7CisJCQkJZ290byBlcnI7CisJCQl9CisKKwkJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQzOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1BBQ0tFVDNcbiIpOworCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldDMoIGRldiwgZmlscF9wcml2LCAmY21kYnVmICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldDMgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQzX0NMSVA6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfUEFDS0VUM19DTElQXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KCBkZXYsIGZpbHBfcHJpdiwgJmNtZGJ1Ziwgb3JpZ19uYm94ICkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcCBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1NDQUxBUlMyOgorCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1NDQUxBUlMyXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF9zY2FsYXJzMiggZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zY2FsYXJzMiBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQURFT05fQ01EX1dBSVQ6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfV0FJVFxuIik7CisJCQlpZiAocmFkZW9uX2VtaXRfd2FpdCggZGV2LCBoZWFkZXIud2FpdC5mbGFncyApKSB7CisJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF93YWl0IGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURSTV9FUlJPUigiYmFkIGNtZF90eXBlICVkIGF0ICVwXG4iLCAKKwkJCQkgIGhlYWRlci5oZWFkZXIuY21kX3R5cGUsCisJCQkJICBjbWRidWYuYnVmIC0gc2l6ZW9mKGhlYWRlcikpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAob3JpZ19idWZzeiAhPSAwKQorCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CisKKwlEUk1fREVCVUcoIkRPTkVcbiIpOworCUNPTU1JVF9SSU5HKCk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlpZiAob3JpZ19idWZzeiAhPSAwKQorCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CisJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKK30KKworCisKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2dldHBhcmFtKCBEUk1fSU9DVExfQVJHUyApCit7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9yYWRlb25fZ2V0cGFyYW1fdCBwYXJhbTsKKwlpbnQgdmFsdWU7CisKKwlpZiAoICFkZXZfcHJpdiApIHsKKwkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggcGFyYW0sIChkcm1fcmFkZW9uX2dldHBhcmFtX3QgX191c2VyICopZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHBhcmFtKSApOworCisJRFJNX0RFQlVHKCAicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCApOworCisJc3dpdGNoKCBwYXJhbS5wYXJhbSApIHsKKwljYXNlIFJBREVPTl9QQVJBTV9HQVJUX0JVRkZFUl9PRkZTRVQ6CisJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQ7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0xBU1RfRlJBTUU6CisJCWRldl9wcml2LT5zdGF0cy5sYXN0X2ZyYW1lX3JlYWRzKys7CisJCXZhbHVlID0gR0VUX1NDUkFUQ0goIDAgKTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fTEFTVF9ESVNQQVRDSDoKKwkJdmFsdWUgPSBHRVRfU0NSQVRDSCggMSApOworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSOgorCQlkZXZfcHJpdi0+c3RhdHMubGFzdF9jbGVhcl9yZWFkcysrOworCQl2YWx1ZSA9IEdFVF9TQ1JBVENIKCAyICk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX1BBUkFNX0lSUV9OUjoKKwkJdmFsdWUgPSBkZXYtPmlycTsKKwkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0OworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9SRUdJU1RFUl9IQU5ETEU6CisJCXZhbHVlID0gZGV2X3ByaXYtPm1taW9fb2Zmc2V0OworCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9TVEFUVVNfSEFORExFOgorCQl2YWx1ZSA9IGRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0OworCQlicmVhazsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJLyoKKwkgKiBUaGlzIGlvY3RsKCkgZG9lc24ndCB3b3JrIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBod19sb2NrIGlzIGEKKwkgKiBwb2ludGVyIHdoaWNoIGNhbid0IGZpdCBpbnRvIGFuIGludC1zaXplZCB2YXJpYWJsZS4gIEFjY29yZGluZyB0bworCSAqIE1pY2hlbCBE5G56ZXIsIHRoZSBpb2N0bCgpIGlzIG9ubHkgdXNlZCBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMsIHNvCisJICogbm90IHN1cHBvcnRpbmcgaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4gIElmIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkKKwkgKiBpcyBuZWVkZWQgb24gNjQtYml0IHBsYXRmb3JtcywgYSBuZXcgaW9jdGwoKSB3b3VsZCBoYXZlIHRvIGJlIGFkZGVkLAorCSAqIHNvIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciB0aGUgZW1iZWRkZWQgcGxhdGZvcm1zIGNhbiBiZQorCSAqIG1haW50YWluZWQuICAtLWRhdmlkbSA0LUZlYi0yMDA0LgorCSAqLworCWNhc2UgUkFERU9OX1BBUkFNX1NBUkVBX0hBTkRMRToKKwkJLyogVGhlIGxvY2sgaXMgdGhlIGZpcnN0IGR3b3JkIGluIHRoZSBzYXJlYS4gKi8KKwkJdmFsdWUgPSAobG9uZylkZXYtPmxvY2suaHdfbG9jazsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEU6CisJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmICggRFJNX0NPUFlfVE9fVVNFUiggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKKwkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9jcF9zZXRwYXJhbSggRFJNX0lPQ1RMX0FSR1MgKSB7CisJRFJNX0RFVklDRTsKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlkcm1fcmFkZW9uX3NldHBhcmFtX3Qgc3A7CisJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKKworCWlmICggIWRldl9wcml2ICkgeworCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwl9CisKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBzcCwgKCBkcm1fcmFkZW9uX3NldHBhcmFtX3QgX191c2VyICogKWRhdGEsCisJCQkJICBzaXplb2YoIHNwICkgKTsKKworCXN3aXRjaCggc3AucGFyYW0gKSB7CisJY2FzZSBSQURFT05fU0VUUEFSQU1fRkJfTE9DQVRJT046CisJCXJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKKwkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IGRldl9wcml2LT5mYl9sb2NhdGlvbiAtIHNwLnZhbHVlOworCQlicmVhazsKKwljYXNlIFJBREVPTl9TRVRQQVJBTV9TV0lUQ0hfVElMSU5HOgorCQlpZiAoc3AudmFsdWUgPT0gMCkgeworCQkJRFJNX0RFQlVHKCAiY29sb3IgdGlsaW5nIGRpc2FibGVkXG4iICk7CisJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CisJCQlkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgJj0gflJBREVPTl9EU1RfVElMRV9NQUNSTzsKKwkJCWRldl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDA7CisJCX0KKwkJZWxzZSBpZiAoc3AudmFsdWUgPT0gMSkgeworCQkJRFJNX0RFQlVHKCAiY29sb3IgdGlsaW5nIGVuYWJsZWRcbiIgKTsKKwkJCWRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQgfD0gUkFERU9OX0RTVF9USUxFX01BQ1JPOworCQkJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKKwkJCWRldl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDE7CisJCX0KKwkJYnJlYWs7CQorCWRlZmF1bHQ6CisJCURSTV9ERUJVRyggIkludmFsaWQgcGFyYW1ldGVyICVkXG4iLCBzcC5wYXJhbSApOworCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFdoZW4gYSBjbGllbnQgZGllczoKKyAqICAgIC0gQ2hlY2sgZm9yIGFuZCBjbGVhbiB1cCBmbGlwcGVkIHBhZ2Ugc3RhdGUKKyAqICAgIC0gRnJlZSBhbnkgYWxsb2NlZCBHQVJUIG1lbW9yeS4KKyAqCisgKiBEUk0gaW5mcmFzdHJ1Y3R1cmUgdGFrZXMgY2FyZSBvZiByZWNsYWltaW5nIGRtYSBidWZmZXJzLgorICovCit2b2lkIHJhZGVvbl9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQoreworCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsJCQkJCisJCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7IAorCQlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICkgewkJCisJCQlyYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcCggZGV2ICk7CQorCQl9CQkJCQkJCisJCXJhZGVvbl9tZW1fcmVsZWFzZSggZmlscCwgZGV2X3ByaXYtPmdhcnRfaGVhcCApOyAKKwkJcmFkZW9uX21lbV9yZWxlYXNlKCBmaWxwLCBkZXZfcHJpdi0+ZmJfaGVhcCApOwkKKwkJcmFkZW9uX3N1cmZhY2VzX3JlbGVhc2UoZmlscCwgZGV2X3ByaXYpOworCX0JCQkJCit9CisKK3ZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlyYWRlb25fZG9fcmVsZWFzZShkZXYpOworfQorCitpbnQgcmFkZW9uX2RyaXZlcl9vcGVuX2hlbHBlcihkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqZmlscF9wcml2KQoreworCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKKwkKKwlyYWRlb25fcHJpdiA9IChzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKilkcm1fYWxsb2Moc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOworCQorCWlmICghcmFkZW9uX3ByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZmlscF9wcml2LT5kcml2ZXJfcHJpdiA9IHJhZGVvbl9wcml2OworCWlmICggZGV2X3ByaXYgKQorCQlyYWRlb25fcHJpdi0+cmFkZW9uX2ZiX2RlbHRhID0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uOworCWVsc2UKKwkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpmaWxwX3ByaXYpCit7CisJIHN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXYgPSBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OworCSAKKwkgZHJtX2ZyZWUocmFkZW9uX3ByaXYsIHNpemVvZigqcmFkZW9uX3ByaXYpLCBEUk1fTUVNX0ZJTEVTKTsKK30KKworZHJtX2lvY3RsX2Rlc2NfdCByYWRlb25faW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX0lOSVQpXSAgICA9IHsgcmFkZW9uX2NwX2luaXQsICAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVEFSVCldICAgPSB7IHJhZGVvbl9jcF9zdGFydCwgICAgIDEsIDEgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfU1RPUCldICAgID0geyByYWRlb25fY3Bfc3RvcCwgICAgICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU0VUKV0gICA9IHsgcmFkZW9uX2NwX3Jlc2V0LCAgICAgMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JRExFKV0gICAgPSB7IHJhZGVvbl9jcF9pZGxlLCAgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTVU1FKV0gID0geyByYWRlb25fY3BfcmVzdW1lLCAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1JFU0VUKV0gICAgICA9IHsgcmFkZW9uX2VuZ2luZV9yZXNldCwgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GVUxMU0NSRUVOKV0gPSB7IHJhZGVvbl9mdWxsc2NyZWVuLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1dBUCldICAgICAgID0geyByYWRlb25fY3Bfc3dhcCwgICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NMRUFSKV0gICAgICA9IHsgcmFkZW9uX2NwX2NsZWFyLCAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9WRVJURVgpXSAgICAgPSB7IHJhZGVvbl9jcF92ZXJ0ZXgsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSU5ESUNFUyldICAgID0geyByYWRlb25fY3BfaW5kaWNlcywgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1RFWFRVUkUpXSAgICA9IHsgcmFkZW9uX2NwX3RleHR1cmUsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVElQUExFKV0gICAgPSB7IHJhZGVvbl9jcF9zdGlwcGxlLCAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSU5ESVJFQ1QpXSAgID0geyByYWRlb25fY3BfaW5kaXJlY3QsICAxLCAxIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWDIpXSAgICA9IHsgcmFkZW9uX2NwX3ZlcnRleDIsICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DTURCVUYpXSAgICAgPSB7IHJhZGVvbl9jcF9jbWRidWYsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fR0VUUEFSQU0pXSAgID0geyByYWRlb25fY3BfZ2V0cGFyYW0sICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZMSVApXSAgICAgICA9IHsgcmFkZW9uX2NwX2ZsaXAsICAgICAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9BTExPQyldICAgICAgPSB7IHJhZGVvbl9tZW1fYWxsb2MsICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlJFRSldICAgICAgID0geyByYWRlb25fbWVtX2ZyZWUsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lOSVRfSEVBUCldICA9IHsgcmFkZW9uX21lbV9pbml0X2hlYXAsMSwgMSB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfRU1JVCldICAgPSB7IHJhZGVvbl9pcnFfZW1pdCwgICAgIDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX1dBSVQpXSAgID0geyByYWRlb25faXJxX3dhaXQsICAgICAxLCAwIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NFVFBBUkFNKV0gICA9IHsgcmFkZW9uX2NwX3NldHBhcmFtLCAgMSwgMCB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVVJGX0FMTE9DKV0gPSB7IHJhZGVvbl9zdXJmYWNlX2FsbG9jLDEsIDAgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9GUkVFKV0gID0geyByYWRlb25fc3VyZmFjZV9mcmVlLCAxLCAwIH0KK307CisKK2ludCByYWRlb25fbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUocmFkZW9uX2lvY3Rscyk7Cg==