ZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTBkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC0wLDAgKzEsNzgwIEBACisvKgorICogIGJpbmZtdF9taXNjLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgR/xudGhlcgorICoKKyAqICBiaW5mbXRfbWlzYyBkZXRlY3RzIGJpbmFyaWVzIHZpYSBhIG1hZ2ljIG9yIGZpbGVuYW1lIGV4dGVuc2lvbiBhbmQgaW52b2tlcworICogIGEgc3BlY2lmaWVkIHdyYXBwZXIuIFRoaXMgc2hvdWxkIG9ic29sZXRlIGJpbmZtdF9qYXZhLCBiaW5mbXRfZW04NiBhbmQKKyAqICBiaW5mbXRfbXouCisgKgorICogIDE5OTctMDQtMjUgZmlyc3QgdmVyc2lvbgorICogIFsuLi5dCisgKiAgMTk5Ny0wNS0xOSBjbGVhbnVwCisgKiAgMTk5Ny0wNi0yNiBocGE6IHBhc3MgdGhlIHJlYWwgZmlsZW5hbWUgcmF0aGVyIHRoYW4gYXJndlswXQorICogIDE5OTctMDYtMzAgbWlub3IgY2xlYW51cAorICogIDE5OTctMDgtMDkgcmVtb3ZlZCBleHRlbnNpb24gc3RyaXBwaW5nLCBsb2NraW5nIGNsZWFudXAKKyAqICAyMDAxLTAyLTI4IEFWOiByZXdyaXR0ZW4gaW50byBzb21ldGhpbmcgdGhhdCByZXNlbWJsZXMgQy4gT3JpZ2luYWwgZGlkbid0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2VudW0geworCVZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqLworfTsKKworc3RhdGljIExJU1RfSEVBRChlbnRyaWVzKTsKK3N0YXRpYyBpbnQgZW5hYmxlZCA9IDE7CisKK2VudW0ge0VuYWJsZWQsIE1hZ2ljfTsKKyNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDE8PDMxKQorI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMTw8MzApCisjZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxPDwyOSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogdHlwZSwgc3RhdHVzLCBldGMuICovCisJaW50IG9mZnNldDsJCQkvKiBvZmZzZXQgb2YgbWFnaWMgKi8KKwlpbnQgc2l6ZTsJCQkvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi8KKwljaGFyICptYWdpYzsJCQkvKiBtYWdpYyBvciBmaWxlbmFtZSBleHRlbnNpb24gKi8KKwljaGFyICptYXNrOwkJCS8qIG1hc2ssIE5VTEwgZm9yIGV4YWN0IG1hdGNoICovCisJY2hhciAqaW50ZXJwcmV0ZXI7CQkvKiBmaWxlbmFtZSBvZiBpbnRlcnByZXRlciAqLworCWNoYXIgKm5hbWU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworfSBOb2RlOworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhlbnRyaWVzX2xvY2spOworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqYm1fbW50Oworc3RhdGljIGludCBlbnRyeV9jb3VudDsKKworLyogCisgKiBDaGVjayBpZiB3ZSBzdXBwb3J0IHRoZSBiaW5mbXQKKyAqIGlmIHdlIGRvLCByZXR1cm4gdGhlIG5vZGUsIGVsc2UgTlVMTAorICogbG9ja2luZyBpcyBkb25lIGluIGxvYWRfbWlzY19iaW5hcnkKKyAqLworc3RhdGljIE5vZGUgKmNoZWNrX2ZpbGUoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwljaGFyICpwID0gc3RycmNocihicHJtLT5pbnRlcnAsICcuJyk7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKworCWxpc3RfZm9yX2VhY2gobCwgJmVudHJpZXMpIHsKKwkJTm9kZSAqZSA9IGxpc3RfZW50cnkobCwgTm9kZSwgbGlzdCk7CisJCWNoYXIgKnM7CisJCWludCBqOworCisJCWlmICghdGVzdF9iaXQoRW5hYmxlZCwgJmUtPmZsYWdzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghdGVzdF9iaXQoTWFnaWMsICZlLT5mbGFncykpIHsKKwkJCWlmIChwICYmICFzdHJjbXAoZS0+bWFnaWMsIHAgKyAxKSkKKwkJCQlyZXR1cm4gZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcyA9IGJwcm0tPmJ1ZiArIGUtPm9mZnNldDsKKwkJaWYgKGUtPm1hc2spIHsKKwkJCWZvciAoaiA9IDA7IGogPCBlLT5zaXplOyBqKyspCisJCQkJaWYgKCgqcysrIF4gZS0+bWFnaWNbal0pICYgZS0+bWFza1tqXSkKKwkJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlmb3IgKGogPSAwOyBqIDwgZS0+c2l6ZTsgaisrKQorCQkJCWlmICgoKnMrKyBeIGUtPm1hZ2ljW2pdKSkKKwkJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogPT0gZS0+c2l6ZSkKKwkJCXJldHVybiBlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHRoZSBsb2FkZXIgaXRzZWxmCisgKi8KK3N0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlOb2RlICpmbXQ7CisJc3RydWN0IGZpbGUgKiBpbnRlcnBfZmlsZSA9IE5VTEw7CisJY2hhciBpbmFtZVtCSU5QUk1fQlVGX1NJWkVdOworCWNoYXIgKmluYW1lX2FkZHIgPSBpbmFtZTsKKwlpbnQgcmV0dmFsOworCWludCBmZF9iaW5hcnkgPSAtMTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IE5VTEw7CisKKwlyZXR2YWwgPSAtRU5PRVhFQzsKKwlpZiAoIWVuYWJsZWQpCisJCWdvdG8gX3JldDsKKworCS8qIHRvIGtlZXAgbG9ja2luZyB0aW1lIGxvdywgd2UgY29weSB0aGUgaW50ZXJwcmV0ZXIgc3RyaW5nICovCisJcmVhZF9sb2NrKCZlbnRyaWVzX2xvY2spOworCWZtdCA9IGNoZWNrX2ZpbGUoYnBybSk7CisJaWYgKGZtdCkKKwkJc3RybGNweShpbmFtZSwgZm10LT5pbnRlcnByZXRlciwgQklOUFJNX0JVRl9TSVpFKTsKKwlyZWFkX3VubG9jaygmZW50cmllc19sb2NrKTsKKwlpZiAoIWZtdCkKKwkJZ290byBfcmV0OworCisJaWYgKCEoZm10LT5mbGFncyAmIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKSkgeworCQlyZW1vdmVfYXJnX3plcm8oYnBybSk7CisJfQorCisJaWYgKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSkgeworCisJCWZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJCXJldHZhbCA9IHVuc2hhcmVfZmlsZXMoKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlnb3RvIF9yZXQ7CisJCWlmIChmaWxlcyA9PSBjdXJyZW50LT5maWxlcykgeworCQkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJCQlmaWxlcyA9IE5VTEw7CisJCX0KKwkJLyogaWYgdGhlIGJpbmFyeSBzaG91bGQgYmUgb3BlbmVkIG9uIGJlaGFsZiBvZiB0aGUKKwkJICogaW50ZXJwcmV0ZXIgdGhhbiBrZWVwIGl0IG9wZW4gYW5kIGFzc2lnbiBkZXNjcmlwdG9yCisJCSAqIHRvIGl0ICovCisgCQlmZF9iaW5hcnkgPSBnZXRfdW51c2VkX2ZkKCk7CisgCQlpZiAoZmRfYmluYXJ5IDwgMCkgeworIAkJCXJldHZhbCA9IGZkX2JpbmFyeTsKKyAJCQlnb3RvIF91bnNoYXJlOworIAkJfQorIAkJZmRfaW5zdGFsbChmZF9iaW5hcnksIGJwcm0tPmZpbGUpOworCisJCS8qIGlmIHRoZSBiaW5hcnkgaXMgbm90IHJlYWRhYmxlIHRoYW4gZW5mb3JjZSBtbS0+ZHVtcGFibGU9MAorCQkgICByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcnByZXRlcidzIHBlcm1pc3Npb25zICovCisJCWlmIChwZXJtaXNzaW9uKGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBNQVlfUkVBRCwgTlVMTCkpCisJCQlicHJtLT5pbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX0VORk9SQ0VfTk9ORFVNUDsKKworCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CisJCWJwcm0tPmZpbGUgPSBOVUxMOworCisJCS8qIG1hcmsgdGhlIGJwcm0gdGhhdCBmZCBzaG91bGQgYmUgcGFzc2VkIHRvIGludGVycCAqLworCQlicHJtLT5pbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX0VYRUNGRDsKKwkJYnBybS0+aW50ZXJwX2RhdGEgPSBmZF9iaW5hcnk7CisKKyAJfSBlbHNlIHsKKyAJCWFsbG93X3dyaXRlX2FjY2VzcyhicHJtLT5maWxlKTsKKyAJCWZwdXQoYnBybS0+ZmlsZSk7CisgCQlicHJtLT5maWxlID0gTlVMTDsKKyAJfQorCS8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovCisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCAoMSwgJmJwcm0tPmludGVycCwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gX2Vycm9yOworCWJwcm0tPmFyZ2MrKzsKKworCS8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi8KKwlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsICgxLCAmaW5hbWVfYWRkciwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gX2Vycm9yOworCWJwcm0tPmFyZ2MgKys7CisKKwlicHJtLT5pbnRlcnAgPSBpbmFtZTsJLyogZm9yIGJpbmZtdF9zY3JpcHQgKi8KKworCWludGVycF9maWxlID0gb3Blbl9leGVjIChpbmFtZSk7CisJcmV0dmFsID0gUFRSX0VSUiAoaW50ZXJwX2ZpbGUpOworCWlmIChJU19FUlIgKGludGVycF9maWxlKSkKKwkJZ290byBfZXJyb3I7CisKKwlicHJtLT5maWxlID0gaW50ZXJwX2ZpbGU7CisJaWYgKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9DUkVERU5USUFMUykgeworCQkvKgorCQkgKiBObyBuZWVkIHRvIGNhbGwgcHJlcGFyZV9iaW5wcm0oKSwgaXQncyBhbHJlYWR5IGJlZW4KKwkJICogZG9uZS4gIGJwcm0tPmJ1ZiBpcyBzdGFsZSwgdXBkYXRlIGZyb20gaW50ZXJwX2ZpbGUuCisJCSAqLworCQltZW1zZXQoYnBybS0+YnVmLCAwLCBCSU5QUk1fQlVGX1NJWkUpOworCQlyZXR2YWwgPSBrZXJuZWxfcmVhZChicHJtLT5maWxlLCAwLCBicHJtLT5idWYsIEJJTlBSTV9CVUZfU0laRSk7CisJfSBlbHNlCisJCXJldHZhbCA9IHByZXBhcmVfYmlucHJtIChicHJtKTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIF9lcnJvcjsKKworCXJldHZhbCA9IHNlYXJjaF9iaW5hcnlfaGFuZGxlciAoYnBybSwgcmVncyk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gX2Vycm9yOworCisJaWYgKGZpbGVzKSB7CisJCXN0ZWFsX2xvY2tzKGZpbGVzKTsKKwkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJCWZpbGVzID0gTlVMTDsKKwl9CitfcmV0OgorCXJldHVybiByZXR2YWw7CitfZXJyb3I6CisJaWYgKGZkX2JpbmFyeSA+IDApCisJCXN5c19jbG9zZShmZF9iaW5hcnkpOworCWJwcm0tPmludGVycF9mbGFncyA9IDA7CisJYnBybS0+aW50ZXJwX2RhdGEgPSAwOworX3Vuc2hhcmU6CisJaWYgKGZpbGVzKSB7CisJCXB1dF9maWxlc19zdHJ1Y3QoY3VycmVudC0+ZmlsZXMpOworCQljdXJyZW50LT5maWxlcyA9IGZpbGVzOworCX0KKwlnb3RvIF9yZXQ7Cit9CisKKy8qIENvbW1hbmQgcGFyc2VycyAqLworCisvKgorICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsCisgKiByZWNvZ25pc2luZyB0aGUgXHggc3BlY2lhbC4KKyAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhbgorICogZXJyb3IgKGFuZCBzZXRzIGVycikgb3IgbnVsbCBhcmd1bWVudCBsZW5ndGguCisgKi8KK3N0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKQoreworCWNoYXIgYzsKKworCXdoaWxlICgoYyA9ICpzKyspICE9IGRlbCkgeworCQlpZiAoYyA9PSAnXFwnICYmICpzID09ICd4JykgeworCQkJcysrOworCQkJaWYgKCFpc3hkaWdpdCgqcysrKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWlmICghaXN4ZGlnaXQoKnMrKykpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbnQgdW5xdW90ZShjaGFyICpmcm9tKQoreworCWNoYXIgYyA9IDAsICpzID0gZnJvbSwgKnAgPSBmcm9tOworCisJd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgeworCQlpZiAoYyA9PSAnXFwnICYmICpzID09ICd4JykgeworCQkJcysrOworCQkJYyA9IHRvdXBwZXIoKnMrKyk7CisJCQkqcCA9IChjIC0gKGlzZGlnaXQoYykgPyAnMCcgOiAnQScgLSAxMCkpIDw8IDQ7CisJCQljID0gdG91cHBlcigqcysrKTsKKwkJCSpwKysgfD0gYyAtIChpc2RpZ2l0KGMpID8gJzAnIDogJ0EnIC0gMTApOworCQkJY29udGludWU7CisJCX0KKwkJKnArKyA9IGM7CisJfQorCXJldHVybiBwIC0gZnJvbTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICogY2hlY2tfc3BlY2lhbF9mbGFncyAoY2hhciAqIHNmcywgTm9kZSAqIGUpCit7CisJY2hhciAqIHAgPSBzZnM7CisJaW50IGNvbnQgPSAxOworCisJLyogc3BlY2lhbCBmbGFncyAqLworCXdoaWxlIChjb250KSB7CisJCXN3aXRjaCAoKnApIHsKKwkJCWNhc2UgJ1AnOgorCQkJCXArKzsKKwkJCQllLT5mbGFncyB8PSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ08nOgorCQkJCXArKzsKKwkJCQllLT5mbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0JJTkFSWTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0MnOgorCQkJCXArKzsKKwkJCQkvKiB0aGlzIGZsYWdzIGFsc28gaW1wbGllcyB0aGUKKwkJCQkgICBvcGVuLWJpbmFyeSBmbGFnICovCisJCQkJZS0+ZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHwKKwkJCQkJCU1JU0NfRk1UX09QRU5fQklOQVJZKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY29udCA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gcDsKK30KKy8qCisgKiBUaGlzIHJlZ2lzdGVycyBhIG5ldyBiaW5hcnkgZm9ybWF0LCBpdCByZWNvZ25pc2VzIHRoZSBzeW50YXgKKyAqICc6bmFtZTp0eXBlOm9mZnNldDptYWdpYzptYXNrOmludGVycHJldGVyOmZsYWdzJworICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhcgorICovCitzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlOb2RlICplOworCWludCBtZW1zaXplLCBlcnI7CisJY2hhciAqYnVmLCAqcDsKKwljaGFyIGRlbDsKKworCS8qIHNvbWUgc2FuaXR5IGNoZWNrcyAqLworCWVyciA9IC1FSU5WQUw7CisJaWYgKChjb3VudCA8IDExKSB8fCAoY291bnQgPiAyNTYpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9NRU07CisJbWVtc2l6ZSA9IHNpemVvZihOb2RlKSArIGNvdW50ICsgODsKKwllID0gKE5vZGUgKikga21hbGxvYyhtZW1zaXplLCBHRlBfVVNFUik7CisJaWYgKCFlKQorCQlnb3RvIG91dDsKKworCXAgPSBidWYgPSAoY2hhciAqKWUgKyBzaXplb2YoTm9kZSk7CisKKwltZW1zZXQoZSwgMCwgc2l6ZW9mKE5vZGUpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkKKwkJZ290byBFZmF1bHQ7CisKKwlkZWwgPSAqcCsrOwkvKiBkZWxpbWV0ZXIgKi8KKworCW1lbXNldChidWYrY291bnQsIGRlbCwgOCk7CisKKwllLT5uYW1lID0gcDsKKwlwID0gc3RyY2hyKHAsIGRlbCk7CisJaWYgKCFwKQorCQlnb3RvIEVpbnZhbDsKKwkqcCsrID0gJ1wwJzsKKwlpZiAoIWUtPm5hbWVbMF0gfHwKKwkgICAgIXN0cmNtcChlLT5uYW1lLCAiLiIpIHx8CisJICAgICFzdHJjbXAoZS0+bmFtZSwgIi4uIikgfHwKKwkgICAgc3RyY2hyKGUtPm5hbWUsICcvJykpCisJCWdvdG8gRWludmFsOworCXN3aXRjaCAoKnArKykgeworCQljYXNlICdFJzogZS0+ZmxhZ3MgPSAxPDxFbmFibGVkOyBicmVhazsKKwkJY2FzZSAnTSc6IGUtPmZsYWdzID0gKDE8PEVuYWJsZWQpIHwgKDE8PE1hZ2ljKTsgYnJlYWs7CisJCWRlZmF1bHQ6IGdvdG8gRWludmFsOworCX0KKwlpZiAoKnArKyAhPSBkZWwpCisJCWdvdG8gRWludmFsOworCWlmICh0ZXN0X2JpdChNYWdpYywgJmUtPmZsYWdzKSkgeworCQljaGFyICpzID0gc3RyY2hyKHAsIGRlbCk7CisJCWlmICghcykKKwkJCWdvdG8gRWludmFsOworCQkqcysrID0gJ1wwJzsKKwkJZS0+b2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKKwkJaWYgKCpwKyspCisJCQlnb3RvIEVpbnZhbDsKKwkJZS0+bWFnaWMgPSBwOworCQlwID0gc2NhbmFyZyhwLCBkZWwpOworCQlpZiAoIXApCisJCQlnb3RvIEVpbnZhbDsKKwkJcFstMV0gPSAnXDAnOworCQlpZiAoIWUtPm1hZ2ljWzBdKQorCQkJZ290byBFaW52YWw7CisJCWUtPm1hc2sgPSBwOworCQlwID0gc2NhbmFyZyhwLCBkZWwpOworCQlpZiAoIXApCisJCQlnb3RvIEVpbnZhbDsKKwkJcFstMV0gPSAnXDAnOworCQlpZiAoIWUtPm1hc2tbMF0pCisJCQllLT5tYXNrID0gTlVMTDsKKwkJZS0+c2l6ZSA9IHVucXVvdGUoZS0+bWFnaWMpOworCQlpZiAoZS0+bWFzayAmJiB1bnF1b3RlKGUtPm1hc2spICE9IGUtPnNpemUpCisJCQlnb3RvIEVpbnZhbDsKKwkJaWYgKGUtPnNpemUgKyBlLT5vZmZzZXQgPiBCSU5QUk1fQlVGX1NJWkUpCisJCQlnb3RvIEVpbnZhbDsKKwl9IGVsc2UgeworCQlwID0gc3RyY2hyKHAsIGRlbCk7CisJCWlmICghcCkKKwkJCWdvdG8gRWludmFsOworCQkqcCsrID0gJ1wwJzsKKwkJZS0+bWFnaWMgPSBwOworCQlwID0gc3RyY2hyKHAsIGRlbCk7CisJCWlmICghcCkKKwkJCWdvdG8gRWludmFsOworCQkqcCsrID0gJ1wwJzsKKwkJaWYgKCFlLT5tYWdpY1swXSB8fCBzdHJjaHIoZS0+bWFnaWMsICcvJykpCisJCQlnb3RvIEVpbnZhbDsKKwkJcCA9IHN0cmNocihwLCBkZWwpOworCQlpZiAoIXApCisJCQlnb3RvIEVpbnZhbDsKKwkJKnArKyA9ICdcMCc7CisJfQorCWUtPmludGVycHJldGVyID0gcDsKKwlwID0gc3RyY2hyKHAsIGRlbCk7CisJaWYgKCFwKQorCQlnb3RvIEVpbnZhbDsKKwkqcCsrID0gJ1wwJzsKKwlpZiAoIWUtPmludGVycHJldGVyWzBdKQorCQlnb3RvIEVpbnZhbDsKKworCisJcCA9IGNoZWNrX3NwZWNpYWxfZmxhZ3MgKHAsIGUpOworCisJaWYgKCpwID09ICdcbicpCisJCXArKzsKKwlpZiAocCAhPSBidWYgKyBjb3VudCkKKwkJZ290byBFaW52YWw7CisJcmV0dXJuIGU7CisKK291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworCitFZmF1bHQ6CisJa2ZyZWUoZSk7CisJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CitFaW52YWw6CisJa2ZyZWUoZSk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKKy8qCisgKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOgorICogJzEnIGVuYWJsZXMsICcwJyBkaXNhYmxlcyBhbmQgJy0xJyBjbGVhcnMgZW50cnkvYmluZm10X21pc2MKKyAqLworc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwljaGFyIHNbNF07CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIocywgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzW2NvdW50LTFdID09ICdcbicpCisJCWNvdW50LS07CisJaWYgKGNvdW50ID09IDEgJiYgc1swXSA9PSAnMCcpCisJCXJldHVybiAxOworCWlmIChjb3VudCA9PSAxICYmIHNbMF0gPT0gJzEnKQorCQlyZXR1cm4gMjsKKwlpZiAoY291bnQgPT0gMiAmJiBzWzBdID09ICctJyAmJiBzWzFdID09ICcxJykKKwkJcmV0dXJuIDM7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIGdlbmVyaWMgc3R1ZmYgKi8KKworc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpCit7CisJY2hhciAqZHA7CisJY2hhciAqc3RhdHVzID0gImRpc2FibGVkIjsKKwljb25zdCBjaGFyICogZmxhZ3MgPSAiZmxhZ3M6ICI7CisKKwlpZiAodGVzdF9iaXQoRW5hYmxlZCwgJmUtPmZsYWdzKSkKKwkJc3RhdHVzID0gImVuYWJsZWQiOworCisJaWYgKCFWRVJCT1NFX1NUQVRVUykgeworCQlzcHJpbnRmKHBhZ2UsICIlc1xuIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCXNwcmludGYocGFnZSwgIiVzXG5pbnRlcnByZXRlciAlc1xuIiwgc3RhdHVzLCBlLT5pbnRlcnByZXRlcik7CisJZHAgPSBwYWdlICsgc3RybGVuKHBhZ2UpOworCisJLyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi8KKwlzcHJpbnRmIChkcCwgIiVzIiwgZmxhZ3MpOworCWRwICs9IHN0cmxlbiAoZmxhZ3MpOworCWlmIChlLT5mbGFncyAmIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKSB7CisJCSpkcCArKyA9ICdQJzsKKwl9CisJaWYgKGUtPmZsYWdzICYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpIHsKKwkJKmRwICsrID0gJ08nOworCX0KKwlpZiAoZS0+ZmxhZ3MgJiBNSVNDX0ZNVF9DUkVERU5USUFMUykgeworCQkqZHAgKysgPSAnQyc7CisJfQorCSpkcCArKyA9ICdcbic7CisKKworCWlmICghdGVzdF9iaXQoTWFnaWMsICZlLT5mbGFncykpIHsKKwkJc3ByaW50ZihkcCwgImV4dGVuc2lvbiAuJXNcbiIsIGUtPm1hZ2ljKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKworCQlzcHJpbnRmKGRwLCAib2Zmc2V0ICVpXG5tYWdpYyAiLCBlLT5vZmZzZXQpOworCQlkcCA9IHBhZ2UgKyBzdHJsZW4ocGFnZSk7CisJCWZvciAoaSA9IDA7IGkgPCBlLT5zaXplOyBpKyspIHsKKwkJCXNwcmludGYoZHAsICIlMDJ4IiwgMHhmZiAmIChpbnQpIChlLT5tYWdpY1tpXSkpOworCQkJZHAgKz0gMjsKKwkJfQorCQlpZiAoZS0+bWFzaykgeworCQkJc3ByaW50ZihkcCwgIlxubWFzayAiKTsKKwkJCWRwICs9IDY7CisJCQlmb3IgKGkgPSAwOyBpIDwgZS0+c2l6ZTsgaSsrKSB7CisJCQkJc3ByaW50ZihkcCwgIiUwMngiLCAweGZmICYgKGludCkgKGUtPm1hc2tbaV0pKTsKKwkJCQlkcCArPSAyOworCQkJfQorCQl9CisJCSpkcCsrID0gJ1xuJzsKKwkJKmRwID0gJ1wwJzsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IG5ld19pbm9kZShzYik7CisKKwlpZiAoaW5vZGUpIHsKKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCWlub2RlLT5pX3VpZCA9IDA7CisJCWlub2RlLT5pX2dpZCA9IDA7CisJCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9CisJCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGJtX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa2ZyZWUoaW5vZGUtPnUuZ2VuZXJpY19pcCk7Cit9CisKK3N0YXRpYyB2b2lkIGtpbGxfbm9kZShOb2RlICplKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCXdyaXRlX2xvY2soJmVudHJpZXNfbG9jayk7CisJZGVudHJ5ID0gZS0+ZGVudHJ5OworCWlmIChkZW50cnkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmZS0+bGlzdCk7CisJCWUtPmRlbnRyeSA9IE5VTEw7CisJfQorCXdyaXRlX3VubG9jaygmZW50cmllc19sb2NrKTsKKworCWlmIChkZW50cnkpIHsKKwkJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rLS07CisJCWRfZHJvcChkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJCXNpbXBsZV9yZWxlYXNlX2ZzKCZibV9tbnQsICZlbnRyeV9jb3VudCk7CisJfQorfQorCisvKiAvPGVudHJ5PiAqLworCitzdGF0aWMgc3NpemVfdAorYm1fZW50cnlfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJTm9kZSAqZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJbG9mZl90IHBvcyA9ICpwcG9zOworCXNzaXplX3QgcmVzOworCWNoYXIgKnBhZ2U7CisJaW50IGxlbjsKKworCWlmICghKHBhZ2UgPSAoY2hhciopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZW50cnlfc3RhdHVzKGUsIHBhZ2UpOworCWxlbiA9IHN0cmxlbihwYWdlKTsKKworCXJlcyA9IC1FSU5WQUw7CisJaWYgKHBvcyA8IDApCisJCWdvdG8gb3V0OworCXJlcyA9IDA7CisJaWYgKHBvcyA+PSBsZW4pCisJCWdvdG8gb3V0OworCWlmIChsZW4gPCBwb3MgKyBuYnl0ZXMpCisJCW5ieXRlcyA9IGxlbiAtIHBvczsKKwlyZXMgPSAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwYWdlICsgcG9zLCBuYnl0ZXMpKQorCQlnb3RvIG91dDsKKwkqcHBvcyA9IHBvcyArIG5ieXRlczsKKwlyZXMgPSBuYnl0ZXM7CitvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBibV9lbnRyeV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCWludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpOworCisJc3dpdGNoIChyZXMpIHsKKwkJY2FzZSAxOiBjbGVhcl9iaXQoRW5hYmxlZCwgJmUtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IHNldF9iaXQoRW5hYmxlZCwgJmUtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIDM6IHJvb3QgPSBkZ2V0KGZpbGUtPmZfdmZzbW50LT5tbnRfc2ItPnNfcm9vdCk7CisJCQlkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisKKwkJCWtpbGxfbm9kZShlKTsKKworCQkJdXAoJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwkJCWRwdXQocm9vdCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDogcmV0dXJuIHJlczsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGJtX2VudHJ5X3JlYWQsCisJLndyaXRlCQk9IGJtX2VudHJ5X3dyaXRlLAorfTsKKworLyogL3JlZ2lzdGVyICovCisKK3N0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCU5vZGUgKmU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290LCAqZGVudHJ5OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX3Zmc21udC0+bW50X3NiOworCWludCBlcnIgPSAwOworCisJZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTsKKworCWlmIChJU19FUlIoZSkpCisJCXJldHVybiBQVFJfRVJSKGUpOworCisJcm9vdCA9IGRnZXQoc2ItPnNfcm9vdCk7CisJZG93bigmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGUtPm5hbWUsIHJvb3QsIHN0cmxlbihlLT5uYW1lKSk7CisJZXJyID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUVYSVNUOworCWlmIChkZW50cnktPmRfaW5vZGUpCisJCWdvdG8gb3V0MjsKKworCWlub2RlID0gYm1fZ2V0X2lub2RlKHNiLCBTX0lGUkVHIHwgMDY0NCk7CisKKwllcnIgPSAtRU5PTUVNOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0MjsKKworCWVyciA9IHNpbXBsZV9waW5fZnMoImJpbmZtdF9taXNjIiwgJmJtX21udCwgJmVudHJ5X2NvdW50KTsKKwlpZiAoZXJyKSB7CisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IE5VTEw7CisJCWdvdG8gb3V0MjsKKwl9CisKKwllLT5kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGU7CisJaW5vZGUtPmlfZm9wID0gJmJtX2VudHJ5X29wZXJhdGlvbnM7CisKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXdyaXRlX2xvY2soJmVudHJpZXNfbG9jayk7CisJbGlzdF9hZGQoJmUtPmxpc3QsICZlbnRyaWVzKTsKKwl3cml0ZV91bmxvY2soJmVudHJpZXNfbG9jayk7CisKKwllcnIgPSAwOworb3V0MjoKKwlkcHV0KGRlbnRyeSk7CitvdXQ6CisJdXAoJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwlkcHV0KHJvb3QpOworCisJaWYgKGVycikgeworCQlrZnJlZShlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fcmVnaXN0ZXJfb3BlcmF0aW9ucyA9IHsKKwkud3JpdGUJCT0gYm1fcmVnaXN0ZXJfd3JpdGUsCit9OworCisvKiAvc3RhdHVzICovCisKK3N0YXRpYyBzc2l6ZV90CitibV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKnMgPSBlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIjsKKwlpbnQgbGVuID0gc3RybGVuKHMpOworCWxvZmZfdCBwb3MgPSAqcHBvczsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG9zID49IGxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA8IHBvcyArIG5ieXRlcykKKwkJbmJ5dGVzID0gbGVuIC0gcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzICsgcG9zLCBuYnl0ZXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkqcHBvcyA9IHBvcyArIG5ieXRlczsKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKworCXN3aXRjaCAocmVzKSB7CisJCWNhc2UgMTogZW5hYmxlZCA9IDA7IGJyZWFrOworCQljYXNlIDI6IGVuYWJsZWQgPSAxOyBicmVhazsKKwkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOworCQkJZG93bigmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmVudHJpZXMpKQorCQkJCWtpbGxfbm9kZShsaXN0X2VudHJ5KGVudHJpZXMubmV4dCwgTm9kZSwgbGlzdCkpOworCisJCQl1cCgmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCQkJZHB1dChyb290KTsKKwkJZGVmYXVsdDogcmV0dXJuIHJlczsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9zdGF0dXNfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBibV9zdGF0dXNfcmVhZCwKKwkud3JpdGUJCT0gYm1fc3RhdHVzX3dyaXRlLAorfTsKKworLyogU3VwZXJibG9jayBoYW5kbGluZyAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7CisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5jbGVhcl9pbm9kZQk9IGJtX2NsZWFyX2lub2RlLAorfTsKKworc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB2b2lkICogZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgYm1fZmlsZXNbXSA9IHsKKwkJWzFdID0geyJzdGF0dXMiLCAmYm1fc3RhdHVzX29wZXJhdGlvbnMsIFNfSVdVU1J8U19JUlVHT30sCisJCVsyXSA9IHsicmVnaXN0ZXIiLCAmYm1fcmVnaXN0ZXJfb3BlcmF0aW9ucywgU19JV1VTUn0sCisJCS8qIGxhc3Qgb25lICovIHsiIn0KKwl9OworCWludCBlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgMHg0MjQ5NGU0ZCwgYm1fZmlsZXMpOworCWlmICghZXJyKQorCQlzYi0+c19vcCA9ICZzX29wczsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpibV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgYm1fZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IG1pc2NfZm9ybWF0ID0geworCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkgPSBsb2FkX21pc2NfYmluYXJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJiaW5mbXRfbWlzYyIsCisJLmdldF9zYgkJPSBibV9nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbWlzY19iaW5mbXQodm9pZCkKK3sKKwlpbnQgZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmYm1fZnNfdHlwZSk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gcmVnaXN0ZXJfYmluZm10KCZtaXNjX2Zvcm1hdCk7CisJCWlmIChlcnIpCisJCQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJtX2ZzX3R5cGUpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9taXNjX2JpbmZtdCh2b2lkKQoreworCXVucmVnaXN0ZXJfYmluZm10KCZtaXNjX2Zvcm1hdCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZibV9mc190eXBlKTsKK30KKworY29yZV9pbml0Y2FsbChpbml0X21pc2NfYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfbWlzY19iaW5mbXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=