I2RlZmluZSBfR05VX1NPVVJDRQ0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZSA8c3lzL3N0YXQuaD4NCiNpbmNsdWRlIDxmY250bC5oPg0KI2luY2x1ZGUgPHN5cy92ZnMuaD4NCg0KDQojaW5jbHVkZSA8bXRkL210ZC1hYmkuaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KDQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSAiZnNfY2hlY2suaCINCiNpbmNsdWRlICJjZmdfYXBpLmgiDQojaW5jbHVkZSAicHViX2RlYnVnX2luZm8uaCINCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNybyBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSBNT1VOVFNfSU5GT19GSUxFCQkJCSIvcHJvYy9tb3VudHMiDQoNCiNkZWZpbmUgTlZfRlNfRkFDX01BSU5fUEFUSCAgICAgICAgIAkiL21udC9pbWFnZWZzL252cndhbGwuYmluIg0KI2RlZmluZSBOVl9GU19SV19IQVNIX0ZBQ19QQVRIICAgICAJCSIvbW50L2ltYWdlZnMvbnZyd2FsbC5oYXNoIg0KI2RlZmluZSBOVl9GU19SV19UT1BfUEFUSCAgICAgICAJCSIvZXRjX3J3L3BzbnYiDQojZGVmaW5lIE5WX0ZTX1JXX0hBU0hfV09SS19QQVRIICAgIAkJIi9ldGNfcncvcHNudi9udnJ3YWxsLmhhc2giDQojZGVmaW5lIE5WX0ZTX1JXX01BSU5fUEFUSCAgICAgICAgIAkJIi9ldGNfcncvcHNudi9yd193b3JrIg0KI2RlZmluZSBOVl9GU19SV19CQUNLVVBfUEFUSCAgICAgICAJCSIvZXRjX3J3L3BzbnYvcndfYmFja3VwIg0KI2RlZmluZSBOVl9GU19GQUNfU1lNQk9MX1BBVEggICAgCQkiL2V0Y19ydy9wc252L2ZhY19mbGFnIg0KI2RlZmluZSBOVl9GU19SV19NQUlOX1NZTUJPTF9QQVRIICAgCSIvZXRjX3J3L3BzbnYvd29ya19mbGFnIg0KI2RlZmluZSBOVl9GU19SV19CQUNLVVBfU1lNQk9MX1BBVEggCSIvZXRjX3J3L3BzbnYvYmFja3VwX2ZsYWciDQoNCiNkZWZpbmUgTlZfRlNfUldfQVBfTlZfTUFJTl9QQVRIICAgICAgICAJIi9ldGNfcncvbnYvbWFpbi9jZmciDQojZGVmaW5lIE5WX0ZTX1JXX0FQX05WX0JBQ0tVUF9QQVRIICAgICAgICAJIi9ldGNfcncvbnYvYmFja3VwL2NmZyINCg0KI2RlZmluZSBNT1VOVFNfTElORV9MRU4JCQkJKDI1NikNCiNkZWZpbmUgTU9VTlRTX0xJTkVfRUxFTUVOVF9MRU4JCSg2NCkNCiNkZWZpbmUgTUFYX1BBVEggCQkJCQkoMjU2KQ0KI2RlZmluZSBCVUZfTUFYX0xFTiAgIAkJCQkoMzIpDQojZGVmaW5lIFVCSV9ERVZfTUFYX05VTSAgIAkJCSgxMCkNCiNkZWZpbmUgU1lTVEVNX0VYRUNfRkFJTCAgICAgICAgCSgwKQ0KI2RlZmluZSBTWVNURU1fRVhFQ19TVUNDICAgICAgICAJKDEpDQojZGVmaW5lIFVTRVJEQVRBX1JFU0VUX0ZSRUVfQkxPQ0tfTEVWRUwgICAgKDIpDQojZGVmaW5lIFVTRVJEQVRBX0ZSRUVfREFUQV9TSVpFICAgICAgICAgICAgKDEyOCkNCg0KdHlwZWRlZiBlbnVtIHsNCglERVZJQ0VfTVREID0gMCwNCglERVZJQ0VfWkZUTCA9IDEsDQoJREVWSUNFX01URF9CTE9DSywNCn0gZGV2aWNlX3R5cGVfdDsNCg0KY2hhciAqZ19wYXRoX3ByZWZpeCA9ICIiOw0KDQpzdGF0aWMgaW50IGNoZWNrX21vdW50X3Jlc3VsdChjb25zdCBjaGFyICpwYXJ0aV9tcCkNCnsNCgljaGFyICpsaW5lX3AsICp0ZW1wX3A7DQoJY2hhciBsaW5lW01PVU5UU19MSU5FX0xFTl0gPSB7MH07DQoJY2hhciBsaW5lX2VsZW1lbnRbTU9VTlRTX0xJTkVfRUxFTUVOVF9MRU5dID0gezB9Ow0KCWludCBmb3VuZDsNCglGSUxFICpmcCA9IE5VTEw7DQoJaW50IG1wX3N0cl9sZW47DQoJaWYgKHBhcnRpX21wID09IE5VTEwpDQoJCXJldHVybiAtMTsNCglpZiAoKGZwID0gZm9wZW4oTU9VTlRTX0lORk9fRklMRSwgInIiKSkgPT0gTlVMTCkgew0KCQlwcmludGYoImZzX2NoZWNrIGZvcGVuICVzIGZhaWxlZCwgZXJyb3I6JXNcbiIsIE1PVU5UU19JTkZPX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIGZvcGVuICVzIGZhaWxlZCwgZXJyb3I6JXNcbiIsIE1PVU5UU19JTkZPX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7DQoJCWdvdG8gZXJyb3I7DQoJfQ0KDQoJZm91bmQgPSAwOw0KCXdoaWxlICgxKSB7DQoJCW1lbXNldChsaW5lLCAwLCBzaXplb2YobGluZSkpOw0KCQlpZiAoTlVMTCA9PSBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgew0KCQkJYnJlYWs7DQoJCX0NCgkJLy91cGlfbG9nKCJsaW5lOiAlcyIsIGxpbmUpOw0KCQlsaW5lX3AgPSBsaW5lOw0KCQl3aGlsZSAoKmxpbmVfcCAhPSAnXDAnICYmICpsaW5lX3AgIT0gJyAnKSB7IC8vIGZpcnN0IGVsZW1lbnQNCgkJCWxpbmVfcCsrOw0KCQl9DQoJCWxpbmVfcCsrOw0KCQltZW1zZXQobGluZV9lbGVtZW50LCAwLCBzaXplb2YobGluZV9lbGVtZW50KSk7DQoJCXRlbXBfcCA9IGxpbmVfZWxlbWVudDsNCgkJd2hpbGUgKCpsaW5lX3AgIT0gJ1wwJyAmJiAqbGluZV9wICE9ICcgJykgeyAvLyBzZWNvbmQgZWxlbWVudCwgdGhpcyBpcyB3aGF0IHdlIG5lZWQNCgkJCSp0ZW1wX3AgPSAqbGluZV9wOw0KCQkJdGVtcF9wKys7DQoNCgkJCWxpbmVfcCsrOw0KCQl9DQoJCS8vdXBpX2xvZygibGluZV9lbGVtZW50OiAlcyIsIGxpbmVfZWxlbWVudCk7DQoJCW1wX3N0cl9sZW4gPSBzdHJsZW4ocGFydGlfbXApOw0KCQlpZiAobXBfc3RyX2xlbiA8PSBzdHJsZW4obGluZV9lbGVtZW50KSkgew0KCQkJaWYgKHN0cm5jbXAobGluZV9lbGVtZW50ICsgc3RybGVuKGxpbmVfZWxlbWVudCkgLSBtcF9zdHJfbGVuLCBwYXJ0aV9tcCwgbXBfc3RyX2xlbikgPT0gMCkgew0KCQkJCWZvdW5kID0gMTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCX0NCglpZiAoZm91bmQgPT0gMCkgew0KCQlwcmludGYoImZzX2NoZWNrIGRpZCBub3QgZmluZCBhbnkgbW91bnQgaW5mbyBhYm91dCAlc1xuIiwgcGFydGlfbXApOw0KCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBkaWQgbm90IGZpbmQgYW55IG1vdW50IGluZm8gYWJvdXQgJXNcbiIsIHBhcnRpX21wKTsNCgkJZ290byBlcnJvcjsNCgl9DQoJaWYgKE5VTEwgIT0gZnApDQoJCWZjbG9zZShmcCk7DQoJcmV0dXJuIDA7DQplcnJvcjoNCglpZiAoZnAgIT0gTlVMTCkNCgkJZmNsb3NlKGZwKTsNCglyZXR1cm4gLTE7DQp9DQoNCmludCBtdGRfZmluZChjb25zdCBjaGFyICppX3BhcnRpX25hbWUsIGNoYXIgKm9fbXRkX3BhdGgsIGRldmljZV90eXBlX3QgZGV2aWNlX3R5cGUsIHVuc2lnbmVkIGludCBvX210ZF9wYXRoX2xlbikNCnsNCglGSUxFICpmZF9tdGQgPSAwOw0KCWNoYXIgYnVmWzEyOF07DQoJY2hhciAqbGluZV9zdHI7DQoNCglpZiAoIW9fbXRkX3BhdGhfbGVuKQ0KCQlyZXR1cm4gLTE7DQoNCglmZF9tdGQgPSBmb3BlbigiL3Byb2MvbXRkIiwgInIrIik7DQoJaWYgKE5VTEwgPT0gZmRfbXRkKSB7DQoJCXByaW50ZigiZnNfY2hlY2sgb3BlbiBmaWxlIGVycm9yOiVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgb3BlbiBmaWxlIGVycm9yOiVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCgkJZ290byBlcnJvcjA7DQoJfQ0KCS8vcHJpbnRmKCJmc19jaGVjayBwYXJ0aXRpb24gbmFtZTolc1xuIiwgaV9wYXJ0aV9uYW1lKTsNCg0KCXdoaWxlICgxKSB7DQoJCWludCBtYXRjaGVzID0gMDsNCgkJY2hhciBtdGRuYW1lWzY0XSA9IHswfTsNCgkJaW50ICBtdGRudW0gPSAwOw0KCQl1bnNpZ25lZCBpbnQgIG10ZHNpemUsIG10ZGVyYXNlc2l6ZTsNCiAgICAgICAgbWVtc2V0KGJ1ZiwgMHgwMCwgc2l6ZW9mKGJ1ZikpOw0KCQlsaW5lX3N0ciA9IGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZkX210ZCk7DQoNCgkJaWYgKE5VTEwgPT0gbGluZV9zdHIpIHsNCgkJCXByaW50ZigiZnNfY2hlY2sgZ2V0IGluZm8gZnJvbSBtdGQgZXJyb3I6JXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQoJCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBnZXQgaW5mbyBmcm9tIG10ZCBlcnJvcjolc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsNCgkJCWdvdG8gZXJyb3IxOw0KCQl9DQoJCS8vbXRkNTogMDAxMDAwMDAgMDAwMjAwMDAgImZvdGFmbGFnIg0KCQltYXRjaGVzID0gc3NjYW5mKGJ1ZiwgIm10ZCVkOiAleCAleCBcIiU2M1teXCJdIiwNCgkJICAgICAgICAgICAgICAgICAmbXRkbnVtLCAmbXRkc2l6ZSwgJm10ZGVyYXNlc2l6ZSwgbXRkbmFtZSk7DQoJCW10ZG5hbWVbNjNdID0gJ1wwJzsNCgkJDQoJCWlmICgobWF0Y2hlcyA9PSA0KSAmJiAoc3RyY21wKG10ZG5hbWUsIGlfcGFydGlfbmFtZSkgPT0gMCkpIHsNCgkJCW1lbXNldChvX210ZF9wYXRoLCAweDAwLCBvX210ZF9wYXRoX2xlbik7DQoJCQlpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX01URF9CTE9DSykgew0KCQkJCXNucHJpbnRmKG9fbXRkX3BhdGgsIG9fbXRkX3BhdGhfbGVuLCAiL2Rldi9tdGRibG9jayVkIiwgbXRkbnVtKTsNCgkJCX0gZWxzZSBpZiAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX01URCkgew0KCQkJCXNucHJpbnRmKG9fbXRkX3BhdGgsIG9fbXRkX3BhdGhfbGVuLCAiL2Rldi9tdGQlZCIsIG10ZG51bSk7DQoJCQl9IGVsc2UgaWYgKGRldmljZV90eXBlID09IERFVklDRV9aRlRMKSB7DQoJCQkJc25wcmludGYob19tdGRfcGF0aCwgb19tdGRfcGF0aF9sZW4sICIvZGV2L3pmdGwlZCIsIG10ZG51bSk7DQoJCQl9IGVsc2Ugew0KCQkJCXByaW50ZigiZnNfY2hlY2sgdW5rbm93biBkZXZpY2UgdHlwZSAlZFxuIiwgZGV2aWNlX3R5cGUpOw0KCQkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIHVua25vd24gZGV2aWNlIHR5cGUgJWRcbiIsIGRldmljZV90eXBlKTsNCgkJCQlnb3RvIGVycm9yMTsNCgkJCX0NCgkJCS8vcHJpbnRmKCJmc19jaGVjayBvX210ZF9wYXRoPVslc11cbiIsIG9fbXRkX3BhdGgpOw0KCQkJYnJlYWs7DQoJCX0NCg0KCX0NCglmY2xvc2UoZmRfbXRkKTsNCglyZXR1cm4gMDsNCg0KZXJyb3IxOg0KCWZjbG9zZShmZF9tdGQpOw0KZXJyb3IwOg0KCXJldHVybiAtMTsNCn0NCg0KaW50IHN5c3RlbV9leGVjX3N0YXR1cyhpbnQgc3RhdHVzKQ0Kew0KCWlmICgtMSA9PSBzdGF0dXMpDQoJICAgIHJldHVybiBTWVNURU1fRVhFQ19GQUlMOw0KDQoJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkNCgkgICAgcmV0dXJuIFNZU1RFTV9FWEVDX0ZBSUw7DQoNCglpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSkNCgkgICAgcmV0dXJuIFNZU1RFTV9FWEVDX0ZBSUw7DQoJDQoJcmV0dXJuIFNZU1RFTV9FWEVDX1NVQ0M7DQp9DQoNCmludCBnZXRfdWJpZnNfZGV2aWNlX251bShpbnQgcmVjdl9tdGRudW0pDQp7DQoJaW50ICAgICB2b2xfbnVtIAk9IC0xOw0KCWludCAJZmRfdWJpCQk9IC0xOw0KCWludCAJcmV0CQkJPSAtMTsNCglpbnQgCW15dG1wCQk9IDA7DQoJaW50ICAgICBhZGRfbGVuICAgICA9IDEwOyANCg0KICAgIHN0cnVjdCAgc3RhdCBzdAkJPSB7MH07DQoJDQoJdW5zaWduZWQgY2hhciByZWFkX2J1ZltCVUZfTUFYX0xFTl0gPSB7MH07DQogICAgdW5zaWduZWQgY2hhciB1YmlkZXZfcGF0aFtNQVhfUEFUSF0gPSB7MH07DQoNCglmb3IgKDsgbXl0bXAgPCBVQklfREVWX01BWF9OVU07IG15dG1wKyspDQoJew0KCQlzbnByaW50Zih1YmlkZXZfcGF0aCwgc2l6ZW9mKHViaWRldl9wYXRoKSwgIi9zeXMvZGV2aWNlcy92aXJ0dWFsL3ViaS91YmklZCIsIG15dG1wKTsJDQoJCXJldCA9IHN0YXQodWJpZGV2X3BhdGgsICZzdCk7DQoJCWlmIChyZXQgPCAwKSB7DQoJCQlwcmludGYoImZzX2NoZWNrIGdldCBzdGF0IGluZm8gZnJvbSBlcnJvcjolc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsNCgkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIGdldCBzdGF0IGluZm8gZnJvbSBlcnJvcjolc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsJCQ0KCQkJYnJlYWs7DQoJCX0NCgkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsNCgkJCXN0cm5jYXQodWJpZGV2X3BhdGgsICIvbXRkX251bSIsIGFkZF9sZW4pOw0KCQkJZmRfdWJpID0gb3Blbih1YmlkZXZfcGF0aCwgT19SRE9OTFkpOw0KCQkJaWYgKGZkX3ViaSA8IDApIHsNCgkJCQlwcmludGYoImZzX2NoZWNrIG9wZW4gZmlsZSBlcnJvcjolcyIsIHN0cmVycm9yKGVycm5vKSk7DQoJCQkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgb3BlbiBmaWxlIGVycm9yOiVzIiwgc3RyZXJyb3IoZXJybm8pKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCW1lbXNldChyZWFkX2J1ZiwgMCwgc2l6ZW9mKHJlYWRfYnVmKSk7DQoJCQlyZXQgPSByZWFkKGZkX3ViaSwgcmVhZF9idWYsIHNpemVvZihyZWFkX2J1ZikpOw0KCQkJaWYgKHJldCA8IDApIHsNCgkJCQlwcmludGYoImZzX2NoZWNrIGdldCBpbmZvIGZyb20gdWJpIGVycm9yOiVzXG4iLCBzdHJlcnJvcihlcnJubykpOw0KCQkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIGdldCBpbmZvIGZyb20gdWJpIGVycm9yOiVzXG4iLCBzdHJlcnJvcihlcnJubykpOw0KCQkJCWNsb3NlKGZkX3ViaSk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlpZiAoYXRvaShyZWFkX2J1ZikgPT0gcmVjdl9tdGRudW0pIHsNCgkJCQl2b2xfbnVtID0gbXl0bXA7DQoJCQkJY2xvc2UoZmRfdWJpKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCWNsb3NlKGZkX3ViaSk7DQoJCX0NCgl9DQoNCglyZXR1cm4gdm9sX251bTsNCn0NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioguq/K/cP7s8ajuiByZWFkX2ZpbGUNCioguabE3MPoyvajuiC2wcihzsS8/g0KKiCyzsr9y7XD96O6IChJTikNCiogICAgICAgICAgICBwX2ZpbGU6ICDOxLz+DQoqICAgICAgICAgICAgbGVuOiAgICCzpLbIDQoqICAgICAgICAgICAgKE9VVCkNCiogt7Ugu9gg1rWjurPJuaa3tbvYtsHIobXEzsS8/iwgt/HU8re1u9gwDQoqIMbky/zLtcP3o7q3tbvY1rW199PD1d/KzbfFDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB1bnNpZ25lZCBjaGFyICpyZWFkX2ZpbGUoY29uc3QgY2hhciAqcF9maWxlLCB1bnNpZ25lZCBpbnQgKmxlbikNCnsNCglGSUxFICogZmQgIAkJPSAwOw0KICAgIHN0cnVjdCBzdGF0IGJ1ZiA9IHswfTsNCgl1bnNpZ25lZCBjaGFyICogcF9idWYgID0gTlVMTDsNCg0KCWlmKHBfZmlsZSA9PSBOVUxMKQ0KCQlyZXR1cm4gTlVMTDsNCgkNCiAgICBpZihzdGF0KHBfZmlsZSwgJmJ1ZikgPCAwKQ0KICAgIHsNCgkJcHJpbnRmKCJyZWFkX2ZpbGUgc3RhdCAlcyBmYWlsZWRcbiIsIHBfZmlsZSk7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgInJlYWRfZmlsZSBzdGF0ICVzIGZhaWxlZFxuIiwgcF9maWxlKTsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KCQ0KCWZkID0gZm9wZW4ocF9maWxlLCAicm8iKTsNCglpZighZmQpIA0KCXsNCgkJcHJpbnRmKCJyZWFkX2ZpbGUgb3BlbiAlcyBmYWlsXG4iLCBwX2ZpbGUpOw0KCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJyZWFkX2ZpbGUgb3BlbiAlcyBmYWlsXG4iLCBwX2ZpbGUpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoJDQoJcF9idWYgPSAoY2hhciAqKW1hbGxvYyhidWYuc3Rfc2l6ZSk7DQoJaWYgKHBfYnVmID09IE5VTEwpDQoJew0KCQlwcmludGYoInJlYWRfZmlsZSBtYWxsb2MgZmFpbFxuIik7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgInJlYWRfZmlsZSBtYWxsb2MgZmFpbFxuIik7DQoJCWZjbG9zZShmZCk7DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KCWlmKGZyZWFkKHBfYnVmLDEsIGJ1Zi5zdF9zaXplLGZkKSA8IDEpIA0KCXsNCgkJcHJpbnRmKCJyZWFkX2ZpbGUgZnJlYWQgJXMgZmFpbFxuIiwgcF9maWxlKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAicmVhZF9maWxlIGZyZWFkICVzIGZhaWxcbiIsIHBfZmlsZSk7DQoJCWZjbG9zZShmZCk7DQoJCWZyZWUocF9idWYpOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoJZmNsb3NlKGZkKTsNCgkqbGVuID0gYnVmLnN0X3NpemU7DQoJDQogICAgcmV0dXJuIHBfYnVmOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioguq/K/cP7s8ajuiBjb21wYXJlX2ZpbGUNCioguabE3MPoyvajuiCxyL3PxL+x6s7EvP66zdS0zsS8/srHt/HSu9H5DQoqILLOyv3LtcP3o7ogKElOKQ0KKiAgICAgICAgICAgIHBfZHN0X2ZpbGU6ICDEv7HqzsS8/g0KKiAgICAgICAgICAgIHBfc3JjX2ZpbGU6ICDUtM7EvP4NCiogICAgICAgICAgICAoT1VUKQ0KKiC3tSC72CDWtaO6zsS8/tK70fm3tbvYMCwgt/HU8re1u9gtMQ0KKiDG5Mv8y7XD96O6DQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyBpbnQgY29tcGFyZV9maWxlKGNvbnN0IGNoYXIgKnBfZHN0X2ZpbGUsIGNvbnN0IGNoYXIgKnBfc3JjX2ZpbGUpDQp7DQoJdW5zaWduZWQgY2hhciAqcF9kc3Q7DQoJdW5zaWduZWQgY2hhciAqcF9zcmM7DQoJdW5zaWduZWQgaW50IGRzdF9sZW47DQoJdW5zaWduZWQgaW50IHNyY19sZW47DQoNCglpZihwX2RzdF9maWxlID09IE5VTEwgfHwgcF9zcmNfZmlsZSA9PSBOVUxMKQ0KCQlyZXR1cm4gLTE7DQoNCglwX2RzdCA9IHJlYWRfZmlsZShwX2RzdF9maWxlLCAmZHN0X2xlbik7DQoJaWYoIXBfZHN0KQ0KCQlyZXR1cm4gLTE7DQoJDQoJcF9zcmMgPSByZWFkX2ZpbGUocF9zcmNfZmlsZSwgJnNyY19sZW4pOw0KCWlmKCFwX3NyYykNCgl7DQoJCWZyZWUocF9kc3QpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCQ0KCWlmKGRzdF9sZW4gIT0gc3JjX2xlbikNCgl7DQoJCWZyZWUocF9zcmMpOw0KCQlmcmVlKHBfZHN0KTsNCgkJDQoJCXByaW50ZigiY29tcGFyZV9maWxlIHNpemUgZHN0YnVmID0gJWQsIHNyY2J1ZiA9ICVkXG4iLCBkc3RfbGVuLCBzcmNfbGVuKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiY29tcGFyZV9maWxlIHNpemUgZHN0YnVmID0gJWQsIHNyY2J1ZiA9ICVkXG4iLCBkc3RfbGVuLCBzcmNfbGVuKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCWlmKG1lbWNtcChwX3NyYywgcF9kc3QsIHNyY19sZW4pICE9IDApDQoJew0KCQlmcmVlKHBfc3JjKTsNCgkJZnJlZShwX2RzdCk7DQoJCXByaW50ZigiY29tcGFyZV9maWxlIG1lbWNtcCBub3Qgc2FtZVxuIik7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImNvbXBhcmVfZmlsZSBtZW1jbXAgbm90IHNhbWVcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJZnJlZShwX3NyYyk7DQoJZnJlZShwX2RzdCk7DQoJDQogICAgcmV0dXJuIDA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiC6r8r9w/uzxqO6IGNoZWNrX2ZpbGVzX2FjY2Vzcw0KKiC5psTcw+jK9qO6ILzssul1c2VyZGF0Yc7EvP7Ptc2zz8K1xM7EvP7Kx7fxtObU2sfS09C2wdC0yKjP3g0KKiCyzsr9y7XD96O6IM7eDQoqILe1ILvYINa1o7q87LLp1f2zo7e1u9gwLCC38dTyt7W72C0xo6y9+NDQdXNlcmRhdGG31sf4tcSywbP9DQoqIMbky/zLtcP3o7oNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIGludCBjaGVja19maWxlc19hY2Nlc3MoKQ0Kew0KCWlmKGFjY2VzcyhOVl9GU19SV19NQUlOX1BBVEgsV19PSyB8IFJfT0spIDwgMCkNCgl7DQoJCXByaW50ZigiZnNfY2hlY2sgZmlsZTogJXMgIHBlcm1pc3Npb24gbG9zcyBcbiIsTlZfRlNfUldfTUFJTl9QQVRIKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgZmlsZTogJXMgIHBlcm1pc3Npb24gbG9zcyBcbiIsTlZfRlNfUldfTUFJTl9QQVRIKTsNCgkJcmV0dXJuIC0xOy8vsum/tHJ3X3dvcmvOxLz+yse38b/JtsHQtA0KCX0NCglpZihhY2Nlc3MoTlZfRlNfUldfQkFDS1VQX1BBVEgsIFdfT0sgfCBSX09LKSA8IDApDQoJew0KCQlwcmludGYoImZzX2NoZWNrIGZpbGU6ICVzICBwZXJtaXNzaW9uIGxvc3MgXG4iLE5WX0ZTX1JXX0JBQ0tVUF9QQVRIKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgZmlsZTogJXMgIHBlcm1pc3Npb24gbG9zcyBcbiIsTlZfRlNfUldfQkFDS1VQX1BBVEgpOw0KCQlyZXR1cm4gLTE7Ly+y6b+0cndfYmFja3VwzsS8/srHt/G/ybbB0LQNCgl9DQoJaWYoYWNjZXNzKE5WX0ZTX0ZBQ19TWU1CT0xfUEFUSCwgV19PSyB8IFJfT0spIDwgMCkNCgl7DQoJCXByaW50ZigiZnNfY2hlY2sgZmlsZTogJXMgIHBlcm1pc3Npb24gbG9zcyBcbiIsTlZfRlNfRkFDX1NZTUJPTF9QQVRIKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgZmlsZTogJXMgIHBlcm1pc3Npb24gbG9zcyBcbiIsTlZfRlNfRkFDX1NZTUJPTF9QQVRIKTsNCgkJcmV0dXJuIC0xOy8vsum/tGZhY19mbGFnzsS8/srHt/G/ybbB0LQNCgl9DQoJaWYoYWNjZXNzKE5WX0ZTX1JXX01BSU5fU1lNQk9MX1BBVEgsIFdfT0sgfCBSX09LKSA8IDApDQoJew0KCQlwcmludGYoImZzX2NoZWNrIGZpbGU6ICVzICBwZXJtaXNzaW9uIGxvc3MgXG4iLE5WX0ZTX1JXX01BSU5fU1lNQk9MX1BBVEgpOw0KCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBmaWxlOiAlcyAgcGVybWlzc2lvbiBsb3NzIFxuIixOVl9GU19SV19NQUlOX1NZTUJPTF9QQVRIKTsNCgkJcmV0dXJuIC0xOy8vsum/tHdvcmtfZmxhZ87EvP7Kx7fxv8m2wdC0DQoJfQ0KCWlmKGFjY2VzcyhOVl9GU19SV19CQUNLVVBfU1lNQk9MX1BBVEgsIFdfT0sgfCBSX09LKSA8IDApDQoJew0KCQlwcmludGYoImZzX2NoZWNrIGZpbGU6ICVzICBwZXJtaXNzaW9uIGxvc3MgXG4iLE5WX0ZTX1JXX0JBQ0tVUF9TWU1CT0xfUEFUSCk7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIGZpbGU6ICVzICBwZXJtaXNzaW9uIGxvc3MgXG4iLE5WX0ZTX1JXX0JBQ0tVUF9TWU1CT0xfUEFUSCk7DQoJCXJldHVybiAtMTsvL7Lpv7RiYWNrdXBfZmxhZ87EvP7Kx7fxv8m2wdC0DQoJfQ0KCWlmKGFjY2VzcyhOVl9GU19SV19BUF9OVl9NQUlOX1BBVEgsIFdfT0sgfCBSX09LKSA8IDApDQoJew0KCQlwcmludGYoImZzX2NoZWNrIGZpbGU6ICVzICBwZXJtaXNzaW9uIGxvc3MgXG4iLE5WX0ZTX1JXX0FQX05WX01BSU5fUEFUSCk7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIGZpbGU6ICVzICBwZXJtaXNzaW9uIGxvc3MgXG4iLE5WX0ZTX1JXX0FQX05WX01BSU5fUEFUSCk7DQoJCXJldHVybiAtMTsvL7Lpv7RhcM/CuaTX9252zsS8/srHt/G/ybbB0LQNCgl9DQoJaWYoYWNjZXNzKE5WX0ZTX1JXX0FQX05WX0JBQ0tVUF9QQVRILCBXX09LIHwgUl9PSykgPCAwKQ0KCXsNCgkJcHJpbnRmKCJmc19jaGVjayBmaWxlOiAlcyAgcGVybWlzc2lvbiBsb3NzIFxuIixOVl9GU19SV19BUF9OVl9CQUNLVVBfUEFUSCk7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIGZpbGU6ICVzICBwZXJtaXNzaW9uIGxvc3MgXG4iLE5WX0ZTX1JXX0FQX05WX0JBQ0tVUF9QQVRIKTsNCgkJcmV0dXJuIC0xOy8vsum/tGFwz8KxuLfdbnbOxLz+yse38b/JtsHQtA0KCX0NCiAgICByZXR1cm4gMDsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiC6r8r9w/uzxqO6IGNoZWNrX3VzZXJkYXRhX2lzX3NwYWNlX2Vub3VnaA0KKiC5psTcw+jK9qO6ILzssul1c2VyZGF0YbfWx/jPwsPmtcS/1bzkyse38dfjubujrLK71+PKsdDo0qrW2NDCu9a4tHVzZXJkYXRht9bH+A0KKiCyzsr9y7XD96O6IChJTikNCiogICAgICAgICAgICAoT1VUKQ0KKiC3tSC72CDWtaO6vOyy6b/VvOTX47m7t7W72DAsIL/VvOSyu9fjo6zQ6NKq1tjQwrvWuLS31sf4t7W72C0xDQoqIMbky/zLtcP3o7oNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KaW50IGNoZWNrX3VzZXJkYXRhX3NwYWNlX2Vub3VnaCgpDQp7DQogICAgaW50IGZkID0gMDsNCiAgICBjaGFyIGZzY2tuYW1lW10gPSAiL2V0Y19ydy9mc2NoZWNrIjsNCiAgICBjaGFyIGJ1ZltdID0gImZpbGVzeXN0ZW0gY2hlY2tpbmciOw0KICAgIGludCBsZW4gPSBzdHJsZW4oYnVmKTsNCiAgICBjaGFyICpwdHIgPSBidWY7DQogICAgaW50IHJlcyA9IDA7DQogICAgaW50IHJldCA9IDA7DQoNCiNpZiAwDQogICAgc3RydWN0IHN0YXRmcyBkaXNraW5mbzsNCiAgICBzdGF0ZnMoIi9tbnQvdXNlcmRhdGEiLCAmZGlza2luZm8pOw0KDQogICAgLy9wcmludGYoImZzX2NoZWNrIGZfYnNpemUgPSAlZCwgZl9ibG9ja3MgPSAlZCwgZl9iZnJlZSA9ICVkLCBmX2JhdmFpbCA9ICVkLCBmX2ZpbGVzID0gJWQsICwgZl9mZnJlZSA9ICVkXG4iLCBcDQogICAgLy8gICAgZGlza2luZm8uZl9ic2l6ZSwgZGlza2luZm8uZl9ibG9ja3MsIGRpc2tpbmZvLmZfYmZyZWUsIGRpc2tpbmZvLmZfYmF2YWlsLCBkaXNraW5mby5mX2ZpbGVzLCBkaXNraW5mby5mX2ZmcmVlKTsNCg0KICAgIC8vu/HIocqj0+C/1bzkyse38bTz09q1yNPawb249mJsb2NrDQogICAgaWYgKChkaXNraW5mby5mX2JzaXplICogZGlza2luZm8uZl9iZnJlZSAgPCBDT05GSUdfQkxPQ0tfU0laRSAqIFVTRVJEQVRBX1JFU0VUX0ZSRUVfQkxPQ0tfTEVWRUwpIHx8IA0KICAgICAgICAoZGlza2luZm8uZl9ic2l6ZSAqIGRpc2tpbmZvLmZfYmF2YWlsICA8IENPTkZJR19CTE9DS19TSVpFICogVVNFUkRBVEFfUkVTRVRfRlJFRV9CTE9DS19MRVZFTCkpDQogICAgICAgIHJldHVybiAtMTsNCiNlbmRpZg0KDQogICAgZmQgPSBvcGVuKGZzY2tuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsNCiAgICBpZiAoZmQgPCAwKQ0KICAgIHsNCiAgICAgICAgcHJpbnRmKCJvcGVuICVzIGZhaWxlZCBlcnJubyAlZFxuIiwgZnNja25hbWUsIGVycm5vKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAib3BlbiAlcyBmYWlsZWQgZXJybm8gJWRcbiIsIGZzY2tuYW1lLCBlcnJubyk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQogICAgd2hpbGUgKGxlbiA+IDApDQogICAgew0KICAgICAgICByZXMgPSB3cml0ZShmZCwgcHRyLCBsZW4pOw0KICAgICAgICBpZiAocmVzIDwgMCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlcyA9IDA7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcHJpbnRmKCJ3cml0ZSAlcyBmYWlsZWQgZXJybm8gJWRcbiIsIGZzY2tuYW1lLCBlcnJubyk7DQoJCQkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAid3JpdGUgJXMgZmFpbGVkIGVycm5vICVkXG4iLCBmc2NrbmFtZSwgZXJybm8pOw0KICAgICAgICAgICAgICAgIHJldCA9IC0xOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHB0ciArPSByZXM7DQogICAgICAgIGxlbiAtPSByZXM7DQogICAgfQ0KDQogICAgDQogICAgaWYgKGNsb3NlKGZkKSA8IDApDQogICAgew0KICAgICAgICBwcmludGYoImNsb3NlICVzIGZhaWxlZCBlcnJubyAlZFxuIiwgZnNja25hbWUsIGVycm5vKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiY2xvc2UgJXMgZmFpbGVkIGVycm5vICVkXG4iLCBmc2NrbmFtZSwgZXJybm8pOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIHJldHVybiByZXQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiC6r8r9w/uzxqO6IGNoZWNrX3VzZXJkYXRhX2lzX25vcm1hbA0KKiC5psTcw+jK9qO6ILzssul1c2VyZGF0YbfWx/jPwsPmtcTOxLz+yse38dX9s6OjrMjnufu05tTa0uyzo6Os1PLQ6NKq1tjQwrvWuLR1c2VyZGF0YbfWx/gNCiogss7K/cu1w/ejuiAoSU4pDQoqICAgICAgICAgICAgZHN0X2ZpbGU6ICDEv7HqzsS8/g0KKiAgICAgICAgICAgIHNyY19maWxlOiAg1LTOxLz+DQoqICAgICAgICAgICAgKE9VVCkNCiogt7Ugu9gg1rWjurzssunV/bOjt7W72DAsINDo0qrW2NDCu9a4tLfWx/i3tbvYLTENCiogxuTL/Mu1w/ejug0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQppbnQgY2hlY2tfdXNlcmRhdGFfaXNfbm9ybWFsKCkNCnsNCglzdHJ1Y3Qgc3RhdCBmYWNfbnZfYnVmID0gezB9Ow0KICAgIHN0cnVjdCBzdGF0IHdvcmtfYnVmID0gezB9Ow0KCXN0cnVjdCBzdGF0IGJhY2t1cF9idWYgPSB7MH07DQoNCiAgICBpZiAoY2hlY2tfdXNlcmRhdGFfc3BhY2VfZW5vdWdoKCkgPCAwKQ0KICAgICAgICByZXR1cm4gLTE7DQoJaWYgKGFjY2VzcyhOVl9GU19SV19UT1BfUEFUSCwgRl9PSykgIT0gMCkNCgl7DQoJCWlmIChta2RpcihOVl9GU19SV19UT1BfUEFUSCwgMDc1NSkgIT0gMCkNCgkJew0KCQkJcHJpbnRmKCJmc19jaGVjayBhY2Nlc3MgYW5kIG1rZGlyICVzIGZhaWxlZFxuIiwgTlZfRlNfUldfVE9QX1BBVEgpOw0KCQkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgYWNjZXNzIGFuZCBta2RpciAlcyBmYWlsZWRcbiIsIE5WX0ZTX1JXX1RPUF9QQVRIKTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KCX0NCgkvKnVzZXJkYXRht9bH+MrHt/G87LLp0OjSqsL61+PS1M/Cwb249sz1vP6jug0KCSoxKbLpv7R1c2VyZGF0YbfWx/jPwsPmtcRudnJ3YWxsLmhhc2jKx7fxtObU2qOssru05tTase3KvsrHuNXJ1c3qsOaxvqOs1eLKsbrysru87LLpDQoJKjIpaW1hZ2XPwrXEaGFzaLrNcHNudsS/wrzPwsPmtcRudnJ3YWxsLmhhc2jKx7fx0rvWwqOsyOe5+9K71sK9+NDQvOyy6aOst/HU8rK7vfjQ0LzssumjqLn9wstmb3Rhyf28tqOpDQoJKi8NCglpZihhY2Nlc3MoTlZfRlNfUldfSEFTSF9XT1JLX1BBVEgsIEZfT0spIDwgMCkNCgkJcmV0dXJuIDA7DQoJDQoJaWYoY29tcGFyZV9maWxlKE5WX0ZTX1JXX0hBU0hfRkFDX1BBVEgsIE5WX0ZTX1JXX0hBU0hfV09SS19QQVRIKSA9PSAwKQ0KCXsNCgkJaWYoY2hlY2tfZmlsZXNfYWNjZXNzKCkgPCAwKQ0KCQl7DQoJCQlyZXR1cm4gLTE7Ly91c2VyZGF0YbfWx/jPwrXEzsS8/rfDzsrIqM/e0uyzo9Do0qq71ri0DQoJCX0NCgkJaWYoc3RhdChOVl9GU19GQUNfTUFJTl9QQVRILCAmZmFjX252X2J1ZikgPCAwKQ0KCQl7DQoJCQlyZXR1cm4gMDsNCgkJfQ0KCQkNCgkJaWYoc3RhdChOVl9GU19SV19NQUlOX1BBVEgsICZ3b3JrX2J1ZikgPCAwKQ0KCQl7DQoJCQlwcmludGYoImZzX2NoZWNrIHN0YXQgJXMgZmFpbGVkXG4iLE5WX0ZTX1JXX01BSU5fUEFUSCk7DQoJCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBzdGF0ICVzIGZhaWxlZFxuIixOVl9GU19SV19NQUlOX1BBVEgpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJCWlmKHN0YXQoTlZfRlNfUldfQkFDS1VQX1BBVEgsICZiYWNrdXBfYnVmKSA8IDApDQoJCXsNCgkJCXByaW50ZigiZnNfY2hlY2sgc3RhdCAlcyBmYWlsZWRcbiIsTlZfRlNfUldfQkFDS1VQX1BBVEgpOw0KCQkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgc3RhdCAlcyBmYWlsZWRcbiIsTlZfRlNfUldfQkFDS1VQX1BBVEgpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJCWlmKHdvcmtfYnVmLnN0X3NpemUgPCBmYWNfbnZfYnVmLnN0X3NpemUgfHwgYmFja3VwX2J1Zi5zdF9zaXplIDwgZmFjX252X2J1Zi5zdF9zaXplKQ0KCQl7CQ0KCQkJcHJpbnRmKCJmc19jaGVjayByd19iYWNrdXAgb3Igcndfd29yayBmaWxlIGNvcnJ1cHRlZFxuIik7DQoJCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayByd19iYWNrdXAgb3Igcndfd29yayBmaWxlIGNvcnJ1cHRlZFxuIik7DQoJCQlyZXR1cm4gLTE7Ly91c2VyZGF0YbfWx/jPwrXEuaTX98f4bna6zbG4t93H+G52sciz9rOnx/hudtCho6zQ6NKqu9a4tA0KCQl9DQoJfQ0KCQ0KCXJldHVybiAwOw0KCQ0KfQ0KDQppbnQgbW91bnRfZnNfcGFydGl0aW9uKHN0cnVjdCBtdGRfZnMgKnBfZnMpDQp7DQoJaW50IHJldCA9IC0xOw0KCWludCB1YmlfbnVtID0gMDsNCglpbnQgbXRkX2Jsa19udW0gPSAwOw0KCWNoYXIgbW91bnRfY21kW01BWF9QQVRIXSA9IHswfTsNCgljaGFyIG10ZF9wYXRoW01BWF9QQVRIXSA9IHswfTsNCgljaGFyIGF0dGFjaF9jbWRbTUFYX1BBVEhdID0gezB9OwkJDQoJDQoJaWYgKE5VTEwgPT0gcF9mcy0+cGF0aXRpb25fbmFtZSB8fCBOVUxMID09IHBfZnMtPm1vdW50X3BvaW50IHx8IE5VTEwgPT0gcF9mcy0+ZnNfdHlwZSkNCgkJcmV0dXJuIC0xOw0KDQoJLy9wcmludGYoImZzX2NoZWNrIGlfcGFydGlfbmFtZT0lcywgcGFydGlfbXA9JXMsIHBhcnRpX210PSVzXG4iLCBwX2ZzLT5wYXRpdGlvbl9uYW1lLCBwX2ZzLT5tb3VudF9wb2ludCwgcF9mcy0+ZnNfdHlwZSk7DQoNCglpZiAoc3RyY21wKHBfZnMtPnBhdGl0aW9uX25hbWUsICJjcGZzIikgPT0gMCkgew0KCQlyZXQgPSBtdGRfZmluZChwX2ZzLT5wYXRpdGlvbl9uYW1lLCBtdGRfcGF0aCwgREVWSUNFX01URF9CTE9DSywgTUFYX1BBVEgpOw0KCQlpZiAocmV0IDwgMCkgew0KCQkJcHJpbnRmKCJmc19jaGVjayBwYXJ0aXRpb24gbmFtZSBpcyBub3QgZmluZFxuIik7DQoJCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBwYXJ0aXRpb24gbmFtZSBpcyBub3QgZmluZFxuIik7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCgkJc25wcmludGYobW91bnRfY21kLCBzaXplb2YobW91bnRfY21kKSwgIiVzL2Jpbi9tb3VudCAtdCB5YWZmczIgIC1vIFwiaW5iYW5kLXRhZ3NcIiAgJXMgJXMiLCBnX3BhdGhfcHJlZml4LG10ZF9wYXRoLCBwX2ZzLT5tb3VudF9wb2ludCk7DQoJfSBlbHNlIGlmIChzdHJjbXAocF9mcy0+ZnNfdHlwZSwgImpmZnMyIikgPT0gMCkgew0KCQlyZXQgPSBtdGRfZmluZChwX2ZzLT5wYXRpdGlvbl9uYW1lLCBtdGRfcGF0aCwgREVWSUNFX01URF9CTE9DSywgTUFYX1BBVEgpOw0KCQlpZiAocmV0IDwgMCkgew0KCQkJcHJpbnRmKCJmc19jaGVjayBwYXJ0aXRpb24gbmFtZSBpcyBub3QgZmluZFxuIik7DQoJCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBwYXJ0aXRpb24gbmFtZSBpcyBub3QgZmluZFxuIik7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCgkJc25wcmludGYobW91bnRfY21kLCBzaXplb2YobW91bnRfY21kKSwgIiVzL2Jpbi9tb3VudCAtdCBqZmZzMiAlcyAlcyAlcyIsICBnX3BhdGhfcHJlZml4LHBfZnMtPm1vdW50X29wdCAsbXRkX3BhdGgsIHBfZnMtPm1vdW50X3BvaW50KTsNCgl9IGVsc2UgaWYgKHN0cmNtcChwX2ZzLT5mc190eXBlLCAidWJpZnMiKSA9PSAwKSB7DQoJCXJldCA9IG10ZF9maW5kKHBfZnMtPnBhdGl0aW9uX25hbWUsIG10ZF9wYXRoLCBERVZJQ0VfTVREX0JMT0NLLCBNQVhfUEFUSCk7DQoJCWlmIChyZXQgPCAwKSB7DQoJCQlwcmludGYoImZzX2NoZWNrIHBhcnRpdGlvbiBuYW1lIGlzIG5vdCBmaW5kXG4iKTsNCgkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIHBhcnRpdGlvbiBuYW1lIGlzIG5vdCBmaW5kXG4iKTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KCQlzc2NhbmYobXRkX3BhdGgsICIvZGV2L210ZGJsb2NrJWQiLCAmbXRkX2Jsa19udW0pOw0KCQlzbnByaW50ZihhdHRhY2hfY21kLCBzaXplb2YoYXR0YWNoX2NtZCksICIlcy91c3Ivc2Jpbi91YmlhdHRhY2ggL2Rldi91YmlfY3RybCAtbSAlZCIsIGdfcGF0aF9wcmVmaXgsbXRkX2Jsa19udW0pOw0KDQoJCXJldCA9IHN5c3RlbV9leGVjX3N0YXR1cyh6eGljX3N5c3RlbShhdHRhY2hfY21kKSk7DQoJCWlmIChyZXQgPT0gU1lTVEVNX0VYRUNfRkFJTCkgew0KCQkJcHJpbnRmKCJmc19jaGVjazogJXMgZmFpbFxuIixhdHRhY2hfY21kKTsNCgkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrOiAlcyBmYWlsXG4iLGF0dGFjaF9jbWQpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJCQ0KCQl1YmlfbnVtID0gZ2V0X3ViaWZzX2RldmljZV9udW0obXRkX2Jsa19udW0pOw0KCQlpZiAodWJpX251bSA8IDApIHsNCgkJCXByaW50ZigiZnNfY2hlY2sgdWJpX251bSBub3QgbWF0Y2hcbiIpOw0KCQkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgdWJpX251bSBub3QgbWF0Y2hcbiIpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJCXNucHJpbnRmKG1vdW50X2NtZCwgc2l6ZW9mKG1vdW50X2NtZCksICIlcy9iaW4vbW91bnQgLXQgdWJpZnMgLW8gcncgdWJpJWRfMCAlcyIsIGdfcGF0aF9wcmVmaXgsdWJpX251bSwgcF9mcy0+bW91bnRfcG9pbnQpOw0KCX0gZWxzZSB7DQoJCXByaW50ZigiZnNfY2hlY2sgdW5rbm93biBtb3VudCB0eXBlOiAlc1xuIiwgcF9mcy0+ZnNfdHlwZSk7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIHVua25vd24gbW91bnQgdHlwZTogJXNcbiIsIHBfZnMtPmZzX3R5cGUpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJcmV0ID0genhpY19zeXN0ZW0obW91bnRfY21kKTsNCg0KCWlmIChjaGVja19tb3VudF9yZXN1bHQocF9mcy0+bW91bnRfcG9pbnQpIDwgMCkgew0KCQlwcmludGYoImZzX2NoZWNrIDogJXMgZmFpbFxuIiwgbW91bnRfY21kKTsgDQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIDogJXMgZmFpbFxuIiwgbW91bnRfY21kKTsNCgkJcmV0dXJuIC0xOw0KCX0NCglyZXR1cm4gMDsNCn0NCg0KaW50IHVubW91bnRfZnNfcGFydGl0aW9uKHN0cnVjdCBtdGRfZnMgKnBfZnMpDQp7DQoJaW50IHJldCA9IC0xOw0KCWludCB1YmlfbnVtID0gMDsNCglpbnQgbXRkX2Jsa19udW0gPSAwOw0KCWNoYXIgdW1vdW50X2NtZFtNQVhfUEFUSF0gPSB7MH07DQoJY2hhciBtdGRfcGF0aFtNQVhfUEFUSF0gPSB7MH07DQoJY2hhciBkZXRhY2hfY21kW01BWF9QQVRIXSA9IHswfTsNCgkNCglpZiAoTlVMTCA9PSBwX2ZzLT5wYXRpdGlvbl9uYW1lIHx8IE5VTEwgPT0gcF9mcy0+bW91bnRfcG9pbnQgfHwgTlVMTCA9PSBwX2ZzLT5mc190eXBlKQ0KCQlyZXR1cm4gLTE7DQoNCglpZiAoc3RyY21wKHBfZnMtPnBhdGl0aW9uX25hbWUsICJjcGZzIikgPT0gMCkgew0KCQlzbnByaW50Zih1bW91bnRfY21kLCBzaXplb2YodW1vdW50X2NtZCksICIlcy9iaW4vdW1vdW50IC1mICVzICIsIGdfcGF0aF9wcmVmaXgscF9mcy0+bW91bnRfcG9pbnQpOw0KCX0gZWxzZSBpZiAoc3RyY21wKHBfZnMtPmZzX3R5cGUsICJqZmZzMiIpID09IDApIHsNCgkJc25wcmludGYodW1vdW50X2NtZCwgc2l6ZW9mKHVtb3VudF9jbWQpLCAiJXMvYmluL3Vtb3VudCAtZiAlcyIsICBnX3BhdGhfcHJlZml4LHBfZnMtPm1vdW50X3BvaW50KTsNCgl9IGVsc2UgaWYgKHN0cmNtcChwX2ZzLT5mc190eXBlLCAidWJpZnMiKSA9PSAwKSB7DQoJCQ0KCQlzbnByaW50Zih1bW91bnRfY21kLCBzaXplb2YodW1vdW50X2NtZCksICIlcy9iaW4vdW1vdW50IC1mICVzIiwgZ19wYXRoX3ByZWZpeCxwX2ZzLT5tb3VudF9wb2ludCk7DQoJCXp4aWNfc3lzdGVtKHVtb3VudF9jbWQpOw0KCQlwcmludGYoImZzX2NoZWNrIHVtb3VudCA6ICVzXG4iLCB1bW91bnRfY21kKTsNCgkJDQoJCXJldCA9IG10ZF9maW5kKHBfZnMtPnBhdGl0aW9uX25hbWUsIG10ZF9wYXRoLCBERVZJQ0VfTVREX0JMT0NLLCBNQVhfUEFUSCk7DQoJCWlmIChyZXQgPCAwKSB7DQoJCQlwcmludGYoImZzX2NoZWNrIHBhcnRpdGlvbiBuYW1lIGlzIG5vdCBmaW5kXG4iKTsNCgkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIHBhcnRpdGlvbiBuYW1lIGlzIG5vdCBmaW5kXG4iKTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KCQlzc2NhbmYobXRkX3BhdGgsICIvZGV2L210ZGJsb2NrJWQiLCAmbXRkX2Jsa19udW0pOw0KCQkNCgkJdWJpX251bSA9IGdldF91Ymlmc19kZXZpY2VfbnVtKG10ZF9ibGtfbnVtKTsNCgkJDQoJCXNucHJpbnRmKGRldGFjaF9jbWQsIHNpemVvZihkZXRhY2hfY21kKSwgIiVzL3Vzci9zYmluL3ViaWRldGFjaCAvZGV2L3ViaV9jdHJsIC1kICVkIiwgZ19wYXRoX3ByZWZpeCx1YmlfbnVtKTsNCg0KCQlyZXQgPSBzeXN0ZW1fZXhlY19zdGF0dXMoenhpY19zeXN0ZW0oZGV0YWNoX2NtZCkpOw0KCQlpZiAocmV0ID09IFNZU1RFTV9FWEVDX0ZBSUwpIHsNCgkJCXByaW50ZigiZnNfY2hlY2s6ICVzIGZhaWxcbiIsZGV0YWNoX2NtZCk7DQoJCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjazogJXMgZmFpbFxuIixkZXRhY2hfY21kKTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KCQkNCgkJcmV0dXJuIDA7DQoJfSBlbHNlIHsNCgkJcHJpbnRmKCJmc19jaGVjayB1bmtub3duIHVtb3VudCB0eXBlOiAlc1xuIiwgcF9mcy0+ZnNfdHlwZSk7DQoJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIHVua25vd24gdW1vdW50IHR5cGU6ICVzXG4iLCBwX2ZzLT5mc190eXBlKTsNCgkJcmV0dXJuIC0xOw0KCX0NCglwcmludGYoImZzX2NoZWNrIHVtb3VudCA6ICVzXG4iLCB1bW91bnRfY21kKTsNCglyZXQgPSB6eGljX3N5c3RlbSh1bW91bnRfY21kKTsNCg0KCXJldHVybiAwOw0KfQ0KDQppbnQgbXRkX2VyYXNlX3BhcnRpdGlvbihjb25zdCBjaGFyKiBwYXJ0aXRpb25fbmFtZSkNCnsNCglpbnQgcmV0ID0gMDsNCgljaGFyIG10ZF9wYXRoW01BWF9QQVRIXSA9IHswfTsNCglpbnQgZmRfbXRkID0gLTE7DQoNCglzdHJ1Y3QgbXRkX2luZm9fdXNlciBtZW1pbmZvID0gezB9Ow0KCXN0cnVjdCBlcmFzZV9pbmZvX3VzZXI2NCBlcmFzZV9pbmZvID0gezB9Ow0KDQoJaWYgKE5VTEwgPT0gcGFydGl0aW9uX25hbWUpIHsNCgkJcmV0dXJuIC0xOw0KCX0NCglyZXQgPSBtdGRfZmluZChwYXJ0aXRpb25fbmFtZSwgbXRkX3BhdGgsIERFVklDRV9NVEQsIE1BWF9QQVRIKTsNCglpZiAocmV0IDwgMCkgew0KCQlwcmludGYoImZzX2NoZWNrIG10ZF9maW5kICVzIGZhaWxlZFxuIiwgcGFydGl0aW9uX25hbWUpOw0KCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBtdGRfZmluZCAlcyBmYWlsZWRcbiIsIHBhcnRpdGlvbl9uYW1lKTsNCgkJcmV0ID0gLTE7DQoJCWdvdG8gb3V0Ow0KCX0NCglmZF9tdGQgPSBvcGVuKG10ZF9wYXRoLCBPX1JEV1IpOw0KCWlmIChmZF9tdGQgPCAwKSB7DQoJCXByaW50ZigiZnNfY2hlY2sgb3BlbiAlcyBlcnJvciwgJXNcbiIsIHBhcnRpdGlvbl9uYW1lLCBzdHJlcnJvcihlcnJubykpOw0KCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBvcGVuICVzIGVycm9yLCAlc1xuIiwgcGFydGl0aW9uX25hbWUsIHN0cmVycm9yKGVycm5vKSk7DQoJCXJldCA9IC0xOw0KCQlnb3RvIG91dDsNCgl9DQoJaWYgKGlvY3RsKGZkX210ZCwgTUVNR0VUSU5GTywgJm1lbWluZm8pICE9IDApIHsNCgkJcHJpbnRmKCJmc19jaGVjayBnZXQgJXMgaW5mbyBlcnJvciwgJXNcbiIsIHBhcnRpdGlvbl9uYW1lLCBzdHJlcnJvcihlcnJubykpOw0KCQlzY19kZWJ1Z19pbmZvX3JlY29yZChNT0RVTEVfSURfQVBfRlNfQ0hFQ0ssICJmc19jaGVjayBnZXQgJXMgaW5mbyBlcnJvciwgJXNcbiIsIHBhcnRpdGlvbl9uYW1lLCBzdHJlcnJvcihlcnJubykpOw0KCQlyZXQgPSAtMTsNCgkJZ290byBvdXQ7DQoJfQ0KCWVyYXNlX2luZm8ubGVuZ3RoID0gbWVtaW5mby5lcmFzZXNpemU7DQoJZm9yIChlcmFzZV9pbmZvLnN0YXJ0ID0gMDsgZXJhc2VfaW5mby5zdGFydCA8IG1lbWluZm8uc2l6ZTsgZXJhc2VfaW5mby5zdGFydCArPSBtZW1pbmZvLmVyYXNlc2l6ZSkgew0KCQlpZiAoaW9jdGwoZmRfbXRkLCBNRU1HRVRCQURCTE9DSywgJihlcmFzZV9pbmZvLnN0YXJ0KSkgPiAwKSB7DQoJCQlwcmludGYoImZzX2NoZWNrIG10ZCwgbm90IGVyYXNpbmcgYmFkIGJsb2NrIGF0IDB4JWxseFxuIiwgZXJhc2VfaW5mby5zdGFydCk7DQoJCQljb250aW51ZTsNCgkJfQ0KCQlpZiAoaW9jdGwoZmRfbXRkLCBNRU1FUkFTRTY0LCAmZXJhc2VfaW5mbykgPCAwKSB7DQoJCQlwcmludGYoImZzX2NoZWNrIG10ZCwgZXJhc2luZyBmYWlsdXJlIGF0IDB4JWxseFxuIiwgZXJhc2VfaW5mby5zdGFydCk7DQoJCX0NCgl9DQoJcmV0ID0gMDsNCm91dDoNCglpZiAoZmRfbXRkID49IDApIHsNCgkJY2xvc2UoZmRfbXRkKTsNCgl9DQoJcmV0dXJuIHJldDsNCn0NCg0KaW50IG10ZF93cml0ZV9wYXJ0aXRpb24oY29uc3QgY2hhciogcGFydGl0aW9uX25hbWUsIGNvbnN0IGNoYXIqIGltYWdlX2ZpbGUpDQp7DQoJaW50IHJldCA9IDA7DQoJY2hhciBtdGRfcGF0aFtNQVhfUEFUSF0gPSB7MH07DQoJaW50IGZkX210ZCA9IC0xOw0KCXN0cnVjdCBtdGRfaW5mb191c2VyIG1lbWluZm8gPSB7MH07DQoNCglsb25nIGxvbmcgaW5kZXggPSAwOw0KCWludCBsZW4gICAgID0gMDsNCglGSUxFICogZnAgICA9IE5VTEw7DQoJY2hhciAqIGJ1ZiAgPSBOVUxMOw0KCXN0cnVjdCBzdGF0IHN0YXRidWZmID0gezB9OwkNCg0KCWlmIChOVUxMID09IHBhcnRpdGlvbl9uYW1lIHx8IE5VTEwgPT0gaW1hZ2VfZmlsZSkNCgkJcmV0dXJuIC0xOw0KDQoJcmV0ID0gbXRkX2ZpbmQocGFydGl0aW9uX25hbWUsIG10ZF9wYXRoLCBERVZJQ0VfTVRELCBNQVhfUEFUSCk7DQoJaWYgKHJldCA8IDApIHsNCgkJcHJpbnRmKCJmc19jaGVjayBtdGRfZmluZCAlcyBmYWlsZWRcbiIsIHBhcnRpdGlvbl9uYW1lKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgbXRkX2ZpbmQgJXMgZmFpbGVkXG4iLCBwYXJ0aXRpb25fbmFtZSk7DQoJCXJldCA9IC0xOw0KCQlnb3RvIG91dDsNCgl9DQoJZmRfbXRkID0gb3BlbihtdGRfcGF0aCwgT19SRFdSKTsNCglpZiAoZmRfbXRkIDwgMCkgew0KCQlwcmludGYoImZzX2NoZWNrIG9wZW4gJXMgZXJyb3IsICVzXG4iLCBwYXJ0aXRpb25fbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgb3BlbiAlcyBlcnJvciwgJXNcbiIsIHBhcnRpdGlvbl9uYW1lLCBzdHJlcnJvcihlcnJubykpOw0KCQlyZXQgPSAtMTsNCgkJZ290byBvdXQ7DQoJfQ0KCWlmIChpb2N0bChmZF9tdGQsIE1FTUdFVElORk8sICZtZW1pbmZvKSAhPSAwKSB7DQoJCXByaW50ZigiZnNfY2hlY2sgZ2V0ICVzIGluZm8gZXJyb3IsICVzXG4iLCBwYXJ0aXRpb25fbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgZ2V0ICVzIGluZm8gZXJyb3IsICVzXG4iLCBwYXJ0aXRpb25fbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsNCgkJcmV0ID0gLTE7DQoJCWdvdG8gb3V0Ow0KCX0NCg0KCWlmKHN0YXQoaW1hZ2VfZmlsZSwgJnN0YXRidWZmKSA8IDApDQoJew0KCQlwcmludGYoImZzX2NoZWNrIHN0YXQgJXMgZmFpbGVkXG4iLCBpbWFnZV9maWxlKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgc3RhdCAlcyBmYWlsZWRcbiIsIGltYWdlX2ZpbGUpOw0KCQlyZXQgPSAtMTsNCgkJZ290byBvdXQ7DQoJfQ0KDQogICAgZnAgPSBmb3BlbihpbWFnZV9maWxlLCAicm8iKTsNCiAgICBpZiAoIWZwKSANCgl7DQoJCXByaW50ZigiZnNfY2hlY2sgZm9wZW4gJXMgZmFpbGVkXG4iLCBpbWFnZV9maWxlKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgZm9wZW4gJXMgZmFpbGVkXG4iLCBpbWFnZV9maWxlKTsNCgkJcmV0ID0gLTE7DQoJCWdvdG8gb3V0Ow0KCX0NCg0KCWJ1ZiA9IChjaGFyICopbWFsbG9jKG1lbWluZm8uZXJhc2VzaXplKTsNCglpZighYnVmKQ0KCXsNCgkJcHJpbnRmKCJmc19jaGVjayBtYWxsb2MgZmFpbGVkXG4iKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgbWFsbG9jIGZhaWxlZFxuIik7DQoJCXJldCA9IC0xOw0KCQlnb3RvIG91dDsNCgl9DQoJDQoJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWVtaW5mby5zaXplICYmIGxlbiA8IHN0YXRidWZmLnN0X3NpemU7IGluZGV4ICs9IG1lbWluZm8uZXJhc2VzaXplKQ0KCXsNCgkJaWYgKGlvY3RsKGZkX210ZCwgTUVNR0VUQkFEQkxPQ0ssICZpbmRleCkgPiAwKSANCgkJew0KCQkJcHJpbnRmKCJmc19jaGVjayBtdGQsIG5vdCBlcmFzaW5nIGJhZCBibG9jayBhdCAlbGxkXG4iLCBpbmRleCk7DQoJCQljb250aW51ZTsNCgkJfQ0KDQoJCXJldCA9IGZyZWFkKGJ1ZiwgMSwgbWVtaW5mby5lcmFzZXNpemUsIGZwKTsNCgkJaWYocmV0IDwgMCkNCgkJew0KCQkJcHJpbnRmKCJmc19jaGVjayBtdGQsIGZyZWFkIGVycm9yID0gJWQhXG4iLCByZXQpOw0KCQkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgbXRkLCBmcmVhZCBlcnJvciA9ICVkIVxuIiwgcmV0KTsNCgkJCXJldCA9IC0xOw0KCQkJZ290byBvdXQ7DQoJCX0NCgkJCQ0KCQlyZXQgPSBsc2VlayhmZF9tdGQsIChsb25nKWluZGV4LCBTRUVLX1NFVCk7DQoJCWlmKHJldCA8IDApDQoJCXsNCgkJCXByaW50ZigiZnNfY2hlY2sgbXRkLCBsc2VlayBlcnJvciA9ICVzIVxuIiwgc3RyZXJyb3IoZXJybm8pKTsNCgkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIG10ZCwgbHNlZWsgZXJyb3IgPSAlcyFcbiIsIHN0cmVycm9yKGVycm5vKSk7DQoJCQlyZXQgPSAtMTsNCgkJCWdvdG8gb3V0Ow0KCQl9DQoJCXJldCA9IHdyaXRlKGZkX210ZCwgYnVmLCAoc2l6ZV90KW1lbWluZm8uZXJhc2VzaXplKTsNCgkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG1lbWluZm8uZXJhc2VzaXplKSANCgkJew0KCQkJcHJpbnRmKCJmc19jaGVjayBtdGQsIHdyaXRlICVzIGVycm9yID0gJWQhXG4iLCBwYXJ0aXRpb25fbmFtZSwgcmV0KTsNCgkJCXNjX2RlYnVnX2luZm9fcmVjb3JkKE1PRFVMRV9JRF9BUF9GU19DSEVDSywgImZzX2NoZWNrIG10ZCwgd3JpdGUgJXMgZXJyb3IgPSAlZCFcbiIsIHBhcnRpdGlvbl9uYW1lLCByZXQpOw0KCQkJcmV0ID0gLTE7DQoJCQlnb3RvIG91dDsNCgkJfQ0KCQlsZW4gKz0gbWVtaW5mby5lcmFzZXNpemU7DQoJfQ0KCWlmIChsZW4gPCBzdGF0YnVmZi5zdF9zaXplKQ0KCXsNCgkJcHJpbnRmKCJmc19jaGVjayBtdGQsIE5vIHNwYWNlIGxlZnQsd3JpdGVsZW49JWQsIGZpbGVzaXplPSVkXG4iLGxlbixzdGF0YnVmZi5zdF9zaXplKTsNCgkJc2NfZGVidWdfaW5mb19yZWNvcmQoTU9EVUxFX0lEX0FQX0ZTX0NIRUNLLCAiZnNfY2hlY2sgbXRkLCBObyBzcGFjZSBsZWZ0LHdyaXRlbGVuPSVkLCBmaWxlc2l6ZT0lZFxuIixsZW4sc3RhdGJ1ZmYuc3Rfc2l6ZSk7DQoJfQkJDQoJCQ0KCXJldCA9IDA7DQpvdXQ6DQoJaWYgKGZkX210ZCA+PSAwKQ0KCQljbG9zZShmZF9tdGQpOw0KDQoJaWYgKGJ1ZiAhPSBOVUxMKSB7DQoJCW1lbXNldChidWYsIDAsIG1lbWluZm8uZXJhc2VzaXplKTsNCgkJZnJlZShidWYpOw0KCX0NCg0KCWlmIChmcCAhPSBOVUxMKQ0KCQlmY2xvc2UoZnApOw0KDQoJcmV0dXJuIHJldDsNCn0NCg0KDQoNCg==