LyoKICogIGJpbmZtdF9taXNjLmMKICoKICogIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIEf8bnRoZXIKICoKICogIGJpbmZtdF9taXNjIGRldGVjdHMgYmluYXJpZXMgdmlhIGEgbWFnaWMgb3IgZmlsZW5hbWUgZXh0ZW5zaW9uIGFuZCBpbnZva2VzCiAqICBhIHNwZWNpZmllZCB3cmFwcGVyLiBUaGlzIHNob3VsZCBvYnNvbGV0ZSBiaW5mbXRfamF2YSwgYmluZm10X2VtODYgYW5kCiAqICBiaW5mbXRfbXouCiAqCiAqICAxOTk3LTA0LTI1IGZpcnN0IHZlcnNpb24KICogIFsuLi5dCiAqICAxOTk3LTA1LTE5IGNsZWFudXAKICogIDE5OTctMDYtMjYgaHBhOiBwYXNzIHRoZSByZWFsIGZpbGVuYW1lIHJhdGhlciB0aGFuIGFyZ3ZbMF0KICogIDE5OTctMDYtMzAgbWlub3IgY2xlYW51cAogKiAgMTk5Ny0wOC0wOSByZW1vdmVkIGV4dGVuc2lvbiBzdHJpcHBpbmcsIGxvY2tpbmcgY2xlYW51cAogKiAgMjAwMS0wMi0yOCBBVjogcmV3cml0dGVuIGludG8gc29tZXRoaW5nIHRoYXQgcmVzZW1ibGVzIEMuIE9yaWdpbmFsIGRpZG4ndC4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CgojaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgojaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KCiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKZW51bSB7CglWRVJCT1NFX1NUQVRVUyA9IDEgLyogbWFrZSBpdCB6ZXJvIHRvIHNhdmUgNDAwIGJ5dGVzIGtlcm5lbCBtZW1vcnkgKi8KfTsKCnN0YXRpYyBMSVNUX0hFQUQoZW50cmllcyk7CnN0YXRpYyBpbnQgZW5hYmxlZCA9IDE7CgplbnVtIHtFbmFibGVkLCBNYWdpY307CiNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDE8PDMxKQojZGVmaW5lIE1JU0NfRk1UX09QRU5fQklOQVJZICgxPDwzMCkKI2RlZmluZSBNSVNDX0ZNVF9DUkVERU5USUFMUyAoMTw8MjkpCgp0eXBlZGVmIHN0cnVjdCB7CglzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogdHlwZSwgc3RhdHVzLCBldGMuICovCglpbnQgb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBtYWdpYyAqLwoJaW50IHNpemU7CQkJLyogc2l6ZSBvZiBtYWdpYy9tYXNrICovCgljaGFyICptYWdpYzsJCQkvKiBtYWdpYyBvciBmaWxlbmFtZSBleHRlbnNpb24gKi8KCWNoYXIgKm1hc2s7CQkJLyogbWFzaywgTlVMTCBmb3IgZXhhY3QgbWF0Y2ggKi8KCWNoYXIgKmludGVycHJldGVyOwkJLyogZmlsZW5hbWUgb2YgaW50ZXJwcmV0ZXIgKi8KCWNoYXIgKm5hbWU7CglzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Cn0gTm9kZTsKCnN0YXRpYyBERUZJTkVfUldMT0NLKGVudHJpZXNfbG9jayk7CnN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmJtX21udDsKc3RhdGljIGludCBlbnRyeV9jb3VudDsKCi8qIAogKiBDaGVjayBpZiB3ZSBzdXBwb3J0IHRoZSBiaW5mbXQKICogaWYgd2UgZG8sIHJldHVybiB0aGUgbm9kZSwgZWxzZSBOVUxMCiAqIGxvY2tpbmcgaXMgZG9uZSBpbiBsb2FkX21pc2NfYmluYXJ5CiAqLwpzdGF0aWMgTm9kZSAqY2hlY2tfZmlsZShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQp7CgljaGFyICpwID0gc3RycmNocihicHJtLT5pbnRlcnAsICcuJyk7CglzdHJ1Y3QgbGlzdF9oZWFkICpsOwoKCWxpc3RfZm9yX2VhY2gobCwgJmVudHJpZXMpIHsKCQlOb2RlICplID0gbGlzdF9lbnRyeShsLCBOb2RlLCBsaXN0KTsKCQljaGFyICpzOwoJCWludCBqOwoKCQlpZiAoIXRlc3RfYml0KEVuYWJsZWQsICZlLT5mbGFncykpCgkJCWNvbnRpbnVlOwoKCQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmZS0+ZmxhZ3MpKSB7CgkJCWlmIChwICYmICFzdHJjbXAoZS0+bWFnaWMsIHAgKyAxKSkKCQkJCXJldHVybiBlOwoJCQljb250aW51ZTsKCQl9CgoJCXMgPSBicHJtLT5idWYgKyBlLT5vZmZzZXQ7CgkJaWYgKGUtPm1hc2spIHsKCQkJZm9yIChqID0gMDsgaiA8IGUtPnNpemU7IGorKykKCQkJCWlmICgoKnMrKyBeIGUtPm1hZ2ljW2pdKSAmIGUtPm1hc2tbal0pCgkJCQkJYnJlYWs7CgkJfSBlbHNlIHsKCQkJZm9yIChqID0gMDsgaiA8IGUtPnNpemU7IGorKykKCQkJCWlmICgoKnMrKyBeIGUtPm1hZ2ljW2pdKSkKCQkJCQlicmVhazsKCQl9CgkJaWYgKGogPT0gZS0+c2l6ZSkKCQkJcmV0dXJuIGU7Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyoKICogdGhlIGxvYWRlciBpdHNlbGYKICovCnN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJTm9kZSAqZm10OwoJc3RydWN0IGZpbGUgKiBpbnRlcnBfZmlsZSA9IE5VTEw7CgljaGFyIGluYW1lW0JJTlBSTV9CVUZfU0laRV07CgljaGFyICppbmFtZV9hZGRyID0gaW5hbWU7CglpbnQgcmV0dmFsOwoJaW50IGZkX2JpbmFyeSA9IC0xOwoJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBOVUxMOwoKCXJldHZhbCA9IC1FTk9FWEVDOwoJaWYgKCFlbmFibGVkKQoJCWdvdG8gX3JldDsKCgkvKiB0byBrZWVwIGxvY2tpbmcgdGltZSBsb3csIHdlIGNvcHkgdGhlIGludGVycHJldGVyIHN0cmluZyAqLwoJcmVhZF9sb2NrKCZlbnRyaWVzX2xvY2spOwoJZm10ID0gY2hlY2tfZmlsZShicHJtKTsKCWlmIChmbXQpCgkJc3RybGNweShpbmFtZSwgZm10LT5pbnRlcnByZXRlciwgQklOUFJNX0JVRl9TSVpFKTsKCXJlYWRfdW5sb2NrKCZlbnRyaWVzX2xvY2spOwoJaWYgKCFmbXQpCgkJZ290byBfcmV0OwoKCWlmICghKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkpIHsKCQlyZW1vdmVfYXJnX3plcm8oYnBybSk7Cgl9CgoJaWYgKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSkgewoKCQlmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwoJCXJldHZhbCA9IHVuc2hhcmVfZmlsZXMoKTsKCQlpZiAocmV0dmFsIDwgMCkKCQkJZ290byBfcmV0OwoJCWlmIChmaWxlcyA9PSBjdXJyZW50LT5maWxlcykgewoJCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKCQkJZmlsZXMgPSBOVUxMOwoJCX0KCQkvKiBpZiB0aGUgYmluYXJ5IHNob3VsZCBiZSBvcGVuZWQgb24gYmVoYWxmIG9mIHRoZQoJCSAqIGludGVycHJldGVyIHRoYW4ga2VlcCBpdCBvcGVuIGFuZCBhc3NpZ24gZGVzY3JpcHRvcgoJCSAqIHRvIGl0ICovCiAJCWZkX2JpbmFyeSA9IGdldF91bnVzZWRfZmQoKTsKIAkJaWYgKGZkX2JpbmFyeSA8IDApIHsKIAkJCXJldHZhbCA9IGZkX2JpbmFyeTsKIAkJCWdvdG8gX3Vuc2hhcmU7CiAJCX0KIAkJZmRfaW5zdGFsbChmZF9iaW5hcnksIGJwcm0tPmZpbGUpOwoKCQkvKiBpZiB0aGUgYmluYXJ5IGlzIG5vdCByZWFkYWJsZSB0aGFuIGVuZm9yY2UgbW0tPmR1bXBhYmxlPTAKCQkgICByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcnByZXRlcidzIHBlcm1pc3Npb25zICovCgkJaWYgKGZpbGVfcGVybWlzc2lvbihicHJtLT5maWxlLCBNQVlfUkVBRCkpCgkJCWJwcm0tPmludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfRU5GT1JDRV9OT05EVU1QOwoKCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CgkJYnBybS0+ZmlsZSA9IE5VTEw7CgoJCS8qIG1hcmsgdGhlIGJwcm0gdGhhdCBmZCBzaG91bGQgYmUgcGFzc2VkIHRvIGludGVycCAqLwoJCWJwcm0tPmludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfRVhFQ0ZEOwoJCWJwcm0tPmludGVycF9kYXRhID0gZmRfYmluYXJ5OwoKIAl9IGVsc2UgewogCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CiAJCWZwdXQoYnBybS0+ZmlsZSk7CiAJCWJwcm0tPmZpbGUgPSBOVUxMOwogCX0KCS8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovCglyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsICgxLCAmYnBybS0+aW50ZXJwLCBicHJtKTsKCWlmIChyZXR2YWwgPCAwKQoJCWdvdG8gX2Vycm9yOwoJYnBybS0+YXJnYysrOwoKCS8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi8KCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwgKDEsICZpbmFtZV9hZGRyLCBicHJtKTsKCWlmIChyZXR2YWwgPCAwKQoJCWdvdG8gX2Vycm9yOwoJYnBybS0+YXJnYyArKzsKCglicHJtLT5pbnRlcnAgPSBpbmFtZTsJLyogZm9yIGJpbmZtdF9zY3JpcHQgKi8KCglpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyAoaW5hbWUpOwoJcmV0dmFsID0gUFRSX0VSUiAoaW50ZXJwX2ZpbGUpOwoJaWYgKElTX0VSUiAoaW50ZXJwX2ZpbGUpKQoJCWdvdG8gX2Vycm9yOwoKCWJwcm0tPmZpbGUgPSBpbnRlcnBfZmlsZTsKCWlmIChmbXQtPmZsYWdzICYgTUlTQ19GTVRfQ1JFREVOVElBTFMpIHsKCQkvKgoJCSAqIE5vIG5lZWQgdG8gY2FsbCBwcmVwYXJlX2JpbnBybSgpLCBpdCdzIGFscmVhZHkgYmVlbgoJCSAqIGRvbmUuICBicHJtLT5idWYgaXMgc3RhbGUsIHVwZGF0ZSBmcm9tIGludGVycF9maWxlLgoJCSAqLwoJCW1lbXNldChicHJtLT5idWYsIDAsIEJJTlBSTV9CVUZfU0laRSk7CgkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgMCwgYnBybS0+YnVmLCBCSU5QUk1fQlVGX1NJWkUpOwoJfSBlbHNlCgkJcmV0dmFsID0gcHJlcGFyZV9iaW5wcm0gKGJwcm0pOwoKCWlmIChyZXR2YWwgPCAwKQoJCWdvdG8gX2Vycm9yOwoKCXJldHZhbCA9IHNlYXJjaF9iaW5hcnlfaGFuZGxlciAoYnBybSwgcmVncyk7CglpZiAocmV0dmFsIDwgMCkKCQlnb3RvIF9lcnJvcjsKCglpZiAoZmlsZXMpIHsKCQlzdGVhbF9sb2NrcyhmaWxlcyk7CgkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CgkJZmlsZXMgPSBOVUxMOwoJfQpfcmV0OgoJcmV0dXJuIHJldHZhbDsKX2Vycm9yOgoJaWYgKGZkX2JpbmFyeSA+IDApCgkJc3lzX2Nsb3NlKGZkX2JpbmFyeSk7CglicHJtLT5pbnRlcnBfZmxhZ3MgPSAwOwoJYnBybS0+aW50ZXJwX2RhdGEgPSAwOwpfdW5zaGFyZToKCWlmIChmaWxlcykgewoJCXB1dF9maWxlc19zdHJ1Y3QoY3VycmVudC0+ZmlsZXMpOwoJCWN1cnJlbnQtPmZpbGVzID0gZmlsZXM7Cgl9Cglnb3RvIF9yZXQ7Cn0KCi8qIENvbW1hbmQgcGFyc2VycyAqLwoKLyoKICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsCiAqIHJlY29nbmlzaW5nIHRoZSBceCBzcGVjaWFsLgogKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW4KICogZXJyb3IgKGFuZCBzZXRzIGVycikgb3IgbnVsbCBhcmd1bWVudCBsZW5ndGguCiAqLwpzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbCkKewoJY2hhciBjOwoKCXdoaWxlICgoYyA9ICpzKyspICE9IGRlbCkgewoJCWlmIChjID09ICdcXCcgJiYgKnMgPT0gJ3gnKSB7CgkJCXMrKzsKCQkJaWYgKCFpc3hkaWdpdCgqcysrKSkKCQkJCXJldHVybiBOVUxMOwoJCQlpZiAoIWlzeGRpZ2l0KCpzKyspKQoJCQkJcmV0dXJuIE5VTEw7CgkJfQoJfQoJcmV0dXJuIHM7Cn0KCnN0YXRpYyBpbnQgdW5xdW90ZShjaGFyICpmcm9tKQp7CgljaGFyIGMgPSAwLCAqcyA9IGZyb20sICpwID0gZnJvbTsKCgl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7CgkJaWYgKGMgPT0gJ1xcJyAmJiAqcyA9PSAneCcpIHsKCQkJcysrOwoJCQljID0gdG91cHBlcigqcysrKTsKCQkJKnAgPSAoYyAtIChpc2RpZ2l0KGMpID8gJzAnIDogJ0EnIC0gMTApKSA8PCA0OwoJCQljID0gdG91cHBlcigqcysrKTsKCQkJKnArKyB8PSBjIC0gKGlzZGlnaXQoYykgPyAnMCcgOiAnQScgLSAxMCk7CgkJCWNvbnRpbnVlOwoJCX0KCQkqcCsrID0gYzsKCX0KCXJldHVybiBwIC0gZnJvbTsKfQoKc3RhdGljIGNoYXIgKiBjaGVja19zcGVjaWFsX2ZsYWdzIChjaGFyICogc2ZzLCBOb2RlICogZSkKewoJY2hhciAqIHAgPSBzZnM7CglpbnQgY29udCA9IDE7CgoJLyogc3BlY2lhbCBmbGFncyAqLwoJd2hpbGUgKGNvbnQpIHsKCQlzd2l0Y2ggKCpwKSB7CgkJCWNhc2UgJ1AnOgoJCQkJcCsrOwoJCQkJZS0+ZmxhZ3MgfD0gTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjA7CgkJCQlicmVhazsKCQkJY2FzZSAnTyc6CgkJCQlwKys7CgkJCQllLT5mbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0JJTkFSWTsKCQkJCWJyZWFrOwoJCQljYXNlICdDJzoKCQkJCXArKzsKCQkJCS8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZQoJCQkJICAgb3Blbi1iaW5hcnkgZmxhZyAqLwoJCQkJZS0+ZmxhZ3MgfD0gKE1JU0NfRk1UX0NSRURFTlRJQUxTIHwKCQkJCQkJTUlTQ19GTVRfT1BFTl9CSU5BUlkpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQljb250ID0gMDsKCQl9Cgl9CgoJcmV0dXJuIHA7Cn0KLyoKICogVGhpcyByZWdpc3RlcnMgYSBuZXcgYmluYXJ5IGZvcm1hdCwgaXQgcmVjb2duaXNlcyB0aGUgc3ludGF4CiAqICc6bmFtZTp0eXBlOm9mZnNldDptYWdpYzptYXNrOmludGVycHJldGVyOmZsYWdzJwogKiB3aGVyZSB0aGUgJzonIGlzIHRoZSBJRlMsIHRoYXQgY2FuIGJlIGNob3NlbiB3aXRoIHRoZSBmaXJzdCBjaGFyCiAqLwpzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKewoJTm9kZSAqZTsKCWludCBtZW1zaXplLCBlcnI7CgljaGFyICpidWYsICpwOwoJY2hhciBkZWw7CgoJLyogc29tZSBzYW5pdHkgY2hlY2tzICovCgllcnIgPSAtRUlOVkFMOwoJaWYgKChjb3VudCA8IDExKSB8fCAoY291bnQgPiAyNTYpKQoJCWdvdG8gb3V0OwoKCWVyciA9IC1FTk9NRU07CgltZW1zaXplID0gc2l6ZW9mKE5vZGUpICsgY291bnQgKyA4OwoJZSA9IChOb2RlICopIGttYWxsb2MobWVtc2l6ZSwgR0ZQX1VTRVIpOwoJaWYgKCFlKQoJCWdvdG8gb3V0OwoKCXAgPSBidWYgPSAoY2hhciAqKWUgKyBzaXplb2YoTm9kZSk7CgoJbWVtc2V0KGUsIDAsIHNpemVvZihOb2RlKSk7CglpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkKCQlnb3RvIEVmYXVsdDsKCglkZWwgPSAqcCsrOwkvKiBkZWxpbWV0ZXIgKi8KCgltZW1zZXQoYnVmK2NvdW50LCBkZWwsIDgpOwoKCWUtPm5hbWUgPSBwOwoJcCA9IHN0cmNocihwLCBkZWwpOwoJaWYgKCFwKQoJCWdvdG8gRWludmFsOwoJKnArKyA9ICdcMCc7CglpZiAoIWUtPm5hbWVbMF0gfHwKCSAgICAhc3RyY21wKGUtPm5hbWUsICIuIikgfHwKCSAgICAhc3RyY21wKGUtPm5hbWUsICIuLiIpIHx8CgkgICAgc3RyY2hyKGUtPm5hbWUsICcvJykpCgkJZ290byBFaW52YWw7Cglzd2l0Y2ggKCpwKyspIHsKCQljYXNlICdFJzogZS0+ZmxhZ3MgPSAxPDxFbmFibGVkOyBicmVhazsKCQljYXNlICdNJzogZS0+ZmxhZ3MgPSAoMTw8RW5hYmxlZCkgfCAoMTw8TWFnaWMpOyBicmVhazsKCQlkZWZhdWx0OiBnb3RvIEVpbnZhbDsKCX0KCWlmICgqcCsrICE9IGRlbCkKCQlnb3RvIEVpbnZhbDsKCWlmICh0ZXN0X2JpdChNYWdpYywgJmUtPmZsYWdzKSkgewoJCWNoYXIgKnMgPSBzdHJjaHIocCwgZGVsKTsKCQlpZiAoIXMpCgkJCWdvdG8gRWludmFsOwoJCSpzKysgPSAnXDAnOwoJCWUtPm9mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CgkJaWYgKCpwKyspCgkJCWdvdG8gRWludmFsOwoJCWUtPm1hZ2ljID0gcDsKCQlwID0gc2NhbmFyZyhwLCBkZWwpOwoJCWlmICghcCkKCQkJZ290byBFaW52YWw7CgkJcFstMV0gPSAnXDAnOwoJCWlmICghZS0+bWFnaWNbMF0pCgkJCWdvdG8gRWludmFsOwoJCWUtPm1hc2sgPSBwOwoJCXAgPSBzY2FuYXJnKHAsIGRlbCk7CgkJaWYgKCFwKQoJCQlnb3RvIEVpbnZhbDsKCQlwWy0xXSA9ICdcMCc7CgkJaWYgKCFlLT5tYXNrWzBdKQoJCQllLT5tYXNrID0gTlVMTDsKCQllLT5zaXplID0gdW5xdW90ZShlLT5tYWdpYyk7CgkJaWYgKGUtPm1hc2sgJiYgdW5xdW90ZShlLT5tYXNrKSAhPSBlLT5zaXplKQoJCQlnb3RvIEVpbnZhbDsKCQlpZiAoZS0+c2l6ZSArIGUtPm9mZnNldCA+IEJJTlBSTV9CVUZfU0laRSkKCQkJZ290byBFaW52YWw7Cgl9IGVsc2UgewoJCXAgPSBzdHJjaHIocCwgZGVsKTsKCQlpZiAoIXApCgkJCWdvdG8gRWludmFsOwoJCSpwKysgPSAnXDAnOwoJCWUtPm1hZ2ljID0gcDsKCQlwID0gc3RyY2hyKHAsIGRlbCk7CgkJaWYgKCFwKQoJCQlnb3RvIEVpbnZhbDsKCQkqcCsrID0gJ1wwJzsKCQlpZiAoIWUtPm1hZ2ljWzBdIHx8IHN0cmNocihlLT5tYWdpYywgJy8nKSkKCQkJZ290byBFaW52YWw7CgkJcCA9IHN0cmNocihwLCBkZWwpOwoJCWlmICghcCkKCQkJZ290byBFaW52YWw7CgkJKnArKyA9ICdcMCc7Cgl9CgllLT5pbnRlcnByZXRlciA9IHA7CglwID0gc3RyY2hyKHAsIGRlbCk7CglpZiAoIXApCgkJZ290byBFaW52YWw7CgkqcCsrID0gJ1wwJzsKCWlmICghZS0+aW50ZXJwcmV0ZXJbMF0pCgkJZ290byBFaW52YWw7CgoKCXAgPSBjaGVja19zcGVjaWFsX2ZsYWdzIChwLCBlKTsKCglpZiAoKnAgPT0gJ1xuJykKCQlwKys7CglpZiAocCAhPSBidWYgKyBjb3VudCkKCQlnb3RvIEVpbnZhbDsKCXJldHVybiBlOwoKb3V0OgoJcmV0dXJuIEVSUl9QVFIoZXJyKTsKCkVmYXVsdDoKCWtmcmVlKGUpOwoJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CkVpbnZhbDoKCWtmcmVlKGUpOwoJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cn0KCi8qCiAqIFNldCBzdGF0dXMgb2YgZW50cnkvYmluZm10X21pc2M6CiAqICcxJyBlbmFibGVzLCAnMCcgZGlzYWJsZXMgYW5kICctMScgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjCiAqLwpzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQp7CgljaGFyIHNbNF07CgoJaWYgKCFjb3VudCkKCQlyZXR1cm4gMDsKCWlmIChjb3VudCA+IDMpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAoY29weV9mcm9tX3VzZXIocywgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CglpZiAoc1tjb3VudC0xXSA9PSAnXG4nKQoJCWNvdW50LS07CglpZiAoY291bnQgPT0gMSAmJiBzWzBdID09ICcwJykKCQlyZXR1cm4gMTsKCWlmIChjb3VudCA9PSAxICYmIHNbMF0gPT0gJzEnKQoJCXJldHVybiAyOwoJaWYgKGNvdW50ID09IDIgJiYgc1swXSA9PSAnLScgJiYgc1sxXSA9PSAnMScpCgkJcmV0dXJuIDM7CglyZXR1cm4gLUVJTlZBTDsKfQoKLyogZ2VuZXJpYyBzdHVmZiAqLwoKc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpCnsKCWNoYXIgKmRwOwoJY2hhciAqc3RhdHVzID0gImRpc2FibGVkIjsKCWNvbnN0IGNoYXIgKiBmbGFncyA9ICJmbGFnczogIjsKCglpZiAodGVzdF9iaXQoRW5hYmxlZCwgJmUtPmZsYWdzKSkKCQlzdGF0dXMgPSAiZW5hYmxlZCI7CgoJaWYgKCFWRVJCT1NFX1NUQVRVUykgewoJCXNwcmludGYocGFnZSwgIiVzXG4iLCBzdGF0dXMpOwoJCXJldHVybjsKCX0KCglzcHJpbnRmKHBhZ2UsICIlc1xuaW50ZXJwcmV0ZXIgJXNcbiIsIHN0YXR1cywgZS0+aW50ZXJwcmV0ZXIpOwoJZHAgPSBwYWdlICsgc3RybGVuKHBhZ2UpOwoKCS8qIHByaW50IHRoZSBzcGVjaWFsIGZsYWdzICovCglzcHJpbnRmIChkcCwgIiVzIiwgZmxhZ3MpOwoJZHAgKz0gc3RybGVuIChmbGFncyk7CglpZiAoZS0+ZmxhZ3MgJiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkgewoJCSpkcCArKyA9ICdQJzsKCX0KCWlmIChlLT5mbGFncyAmIE1JU0NfRk1UX09QRU5fQklOQVJZKSB7CgkJKmRwICsrID0gJ08nOwoJfQoJaWYgKGUtPmZsYWdzICYgTUlTQ19GTVRfQ1JFREVOVElBTFMpIHsKCQkqZHAgKysgPSAnQyc7Cgl9CgkqZHAgKysgPSAnXG4nOwoKCglpZiAoIXRlc3RfYml0KE1hZ2ljLCAmZS0+ZmxhZ3MpKSB7CgkJc3ByaW50ZihkcCwgImV4dGVuc2lvbiAuJXNcbiIsIGUtPm1hZ2ljKTsKCX0gZWxzZSB7CgkJaW50IGk7CgoJCXNwcmludGYoZHAsICJvZmZzZXQgJWlcbm1hZ2ljICIsIGUtPm9mZnNldCk7CgkJZHAgPSBwYWdlICsgc3RybGVuKHBhZ2UpOwoJCWZvciAoaSA9IDA7IGkgPCBlLT5zaXplOyBpKyspIHsKCQkJc3ByaW50ZihkcCwgIiUwMngiLCAweGZmICYgKGludCkgKGUtPm1hZ2ljW2ldKSk7CgkJCWRwICs9IDI7CgkJfQoJCWlmIChlLT5tYXNrKSB7CgkJCXNwcmludGYoZHAsICJcbm1hc2sgIik7CgkJCWRwICs9IDY7CgkJCWZvciAoaSA9IDA7IGkgPCBlLT5zaXplOyBpKyspIHsKCQkJCXNwcmludGYoZHAsICIlMDJ4IiwgMHhmZiAmIChpbnQpIChlLT5tYXNrW2ldKSk7CgkJCQlkcCArPSAyOwoJCQl9CgkJfQoJCSpkcCsrID0gJ1xuJzsKCQkqZHAgPSAnXDAnOwoJfQp9CgpzdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpCnsKCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKHNiKTsKCglpZiAoaW5vZGUpIHsKCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKCQlpbm9kZS0+aV91aWQgPSAwOwoJCWlub2RlLT5pX2dpZCA9IDA7CgkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwoJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9CgkJCWN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7Cgl9CglyZXR1cm4gaW5vZGU7Cn0KCnN0YXRpYyB2b2lkIGJtX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCnsKCWtmcmVlKGlub2RlLT51LmdlbmVyaWNfaXApOwp9CgpzdGF0aWMgdm9pZCBraWxsX25vZGUoTm9kZSAqZSkKewoJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwoKCXdyaXRlX2xvY2soJmVudHJpZXNfbG9jayk7CglkZW50cnkgPSBlLT5kZW50cnk7CglpZiAoZGVudHJ5KSB7CgkJbGlzdF9kZWxfaW5pdCgmZS0+bGlzdCk7CgkJZS0+ZGVudHJ5ID0gTlVMTDsKCX0KCXdyaXRlX3VubG9jaygmZW50cmllc19sb2NrKTsKCglpZiAoZGVudHJ5KSB7CgkJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rLS07CgkJZF9kcm9wKGRlbnRyeSk7CgkJZHB1dChkZW50cnkpOwoJCXNpbXBsZV9yZWxlYXNlX2ZzKCZibV9tbnQsICZlbnRyeV9jb3VudCk7Cgl9Cn0KCi8qIC88ZW50cnk+ICovCgpzdGF0aWMgc3NpemVfdApibV9lbnRyeV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKewoJTm9kZSAqZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7Cglsb2ZmX3QgcG9zID0gKnBwb3M7Cglzc2l6ZV90IHJlczsKCWNoYXIgKnBhZ2U7CglpbnQgbGVuOwoKCWlmICghKHBhZ2UgPSAoY2hhciopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkpCgkJcmV0dXJuIC1FTk9NRU07CgoJZW50cnlfc3RhdHVzKGUsIHBhZ2UpOwoJbGVuID0gc3RybGVuKHBhZ2UpOwoKCXJlcyA9IC1FSU5WQUw7CglpZiAocG9zIDwgMCkKCQlnb3RvIG91dDsKCXJlcyA9IDA7CglpZiAocG9zID49IGxlbikKCQlnb3RvIG91dDsKCWlmIChsZW4gPCBwb3MgKyBuYnl0ZXMpCgkJbmJ5dGVzID0gbGVuIC0gcG9zOwoJcmVzID0gLUVGQVVMVDsKCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwYWdlICsgcG9zLCBuYnl0ZXMpKQoJCWdvdG8gb3V0OwoJKnBwb3MgPSBwb3MgKyBuYnl0ZXM7CglyZXMgPSBuYnl0ZXM7Cm91dDoKCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CglyZXR1cm4gcmVzOwp9CgpzdGF0aWMgc3NpemVfdCBibV9lbnRyeV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7CglzdHJ1Y3QgZGVudHJ5ICpyb290OwoJTm9kZSAqZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CglpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTsKCglzd2l0Y2ggKHJlcykgewoJCWNhc2UgMTogY2xlYXJfYml0KEVuYWJsZWQsICZlLT5mbGFncyk7CgkJCWJyZWFrOwoJCWNhc2UgMjogc2V0X2JpdChFbmFibGVkLCAmZS0+ZmxhZ3MpOwoJCQlicmVhazsKCQljYXNlIDM6IHJvb3QgPSBkZ2V0KGZpbGUtPmZfdmZzbW50LT5tbnRfc2ItPnNfcm9vdCk7CgkJCW11dGV4X2xvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwoKCQkJa2lsbF9ub2RlKGUpOwoKCQkJbXV0ZXhfdW5sb2NrKCZyb290LT5kX2lub2RlLT5pX211dGV4KTsKCQkJZHB1dChyb290KTsKCQkJYnJlYWs7CgkJZGVmYXVsdDogcmV0dXJuIHJlczsKCX0KCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fZW50cnlfb3BlcmF0aW9ucyA9IHsKCS5yZWFkCQk9IGJtX2VudHJ5X3JlYWQsCgkud3JpdGUJCT0gYm1fZW50cnlfd3JpdGUsCn07CgovKiAvcmVnaXN0ZXIgKi8KCnN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAoJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCnsKCU5vZGUgKmU7CglzdHJ1Y3QgaW5vZGUgKmlub2RlOwoJc3RydWN0IGRlbnRyeSAqcm9vdCwgKmRlbnRyeTsKCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlLT5mX3Zmc21udC0+bW50X3NiOwoJaW50IGVyciA9IDA7CgoJZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTsKCglpZiAoSVNfRVJSKGUpKQoJCXJldHVybiBQVFJfRVJSKGUpOwoKCXJvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOwoJbXV0ZXhfbG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CglkZW50cnkgPSBsb29rdXBfb25lX2xlbihlLT5uYW1lLCByb290LCBzdHJsZW4oZS0+bmFtZSkpOwoJZXJyID0gUFRSX0VSUihkZW50cnkpOwoJaWYgKElTX0VSUihkZW50cnkpKQoJCWdvdG8gb3V0OwoKCWVyciA9IC1FRVhJU1Q7CglpZiAoZGVudHJ5LT5kX2lub2RlKQoJCWdvdG8gb3V0MjsKCglpbm9kZSA9IGJtX2dldF9pbm9kZShzYiwgU19JRlJFRyB8IDA2NDQpOwoKCWVyciA9IC1FTk9NRU07CglpZiAoIWlub2RlKQoJCWdvdG8gb3V0MjsKCgllcnIgPSBzaW1wbGVfcGluX2ZzKCJiaW5mbXRfbWlzYyIsICZibV9tbnQsICZlbnRyeV9jb3VudCk7CglpZiAoZXJyKSB7CgkJaXB1dChpbm9kZSk7CgkJaW5vZGUgPSBOVUxMOwoJCWdvdG8gb3V0MjsKCX0KCgllLT5kZW50cnkgPSBkZ2V0KGRlbnRyeSk7Cglpbm9kZS0+dS5nZW5lcmljX2lwID0gZTsKCWlub2RlLT5pX2ZvcCA9ICZibV9lbnRyeV9vcGVyYXRpb25zOwoKCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Cgl3cml0ZV9sb2NrKCZlbnRyaWVzX2xvY2spOwoJbGlzdF9hZGQoJmUtPmxpc3QsICZlbnRyaWVzKTsKCXdyaXRlX3VubG9jaygmZW50cmllc19sb2NrKTsKCgllcnIgPSAwOwpvdXQyOgoJZHB1dChkZW50cnkpOwpvdXQ6CgltdXRleF91bmxvY2soJnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOwoJZHB1dChyb290KTsKCglpZiAoZXJyKSB7CgkJa2ZyZWUoZSk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJtX3JlZ2lzdGVyX29wZXJhdGlvbnMgPSB7Cgkud3JpdGUJCT0gYm1fcmVnaXN0ZXJfd3JpdGUsCn07CgovKiAvc3RhdHVzICovCgpzdGF0aWMgc3NpemVfdApibV9zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQp7CgljaGFyICpzID0gZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCI7CglpbnQgbGVuID0gc3RybGVuKHMpOwoJbG9mZl90IHBvcyA9ICpwcG9zOwoKCWlmIChwb3MgPCAwKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKHBvcyA+PSBsZW4pCgkJcmV0dXJuIDA7CglpZiAobGVuIDwgcG9zICsgbmJ5dGVzKQoJCW5ieXRlcyA9IGxlbiAtIHBvczsKCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBzICsgcG9zLCBuYnl0ZXMpKQoJCXJldHVybiAtRUZBVUxUOwoJKnBwb3MgPSBwb3MgKyBuYnl0ZXM7CglyZXR1cm4gbmJ5dGVzOwp9CgpzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7CglzdHJ1Y3QgZGVudHJ5ICpyb290OwoKCXN3aXRjaCAocmVzKSB7CgkJY2FzZSAxOiBlbmFibGVkID0gMDsgYnJlYWs7CgkJY2FzZSAyOiBlbmFibGVkID0gMTsgYnJlYWs7CgkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOwoJCQltdXRleF9sb2NrKCZyb290LT5kX2lub2RlLT5pX211dGV4KTsKCgkJCXdoaWxlICghbGlzdF9lbXB0eSgmZW50cmllcykpCgkJCQlraWxsX25vZGUobGlzdF9lbnRyeShlbnRyaWVzLm5leHQsIE5vZGUsIGxpc3QpKTsKCgkJCW11dGV4X3VubG9jaygmcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CgkJCWRwdXQocm9vdCk7CgkJZGVmYXVsdDogcmV0dXJuIHJlczsKCX0KCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fc3RhdHVzX29wZXJhdGlvbnMgPSB7CgkucmVhZAkJPSBibV9zdGF0dXNfcmVhZCwKCS53cml0ZQkJPSBibV9zdGF0dXNfd3JpdGUsCn07CgovKiBTdXBlcmJsb2NrIGhhbmRsaW5nICovCgpzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7Cgkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCgkuY2xlYXJfaW5vZGUJPSBibV9jbGVhcl9pbm9kZSwKfTsKCnN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgdm9pZCAqIGRhdGEsIGludCBzaWxlbnQpCnsKCXN0YXRpYyBzdHJ1Y3QgdHJlZV9kZXNjciBibV9maWxlc1tdID0gewoJCVsxXSA9IHsic3RhdHVzIiwgJmJtX3N0YXR1c19vcGVyYXRpb25zLCBTX0lXVVNSfFNfSVJVR099LAoJCVsyXSA9IHsicmVnaXN0ZXIiLCAmYm1fcmVnaXN0ZXJfb3BlcmF0aW9ucywgU19JV1VTUn0sCgkJLyogbGFzdCBvbmUgKi8geyIifQoJfTsKCWludCBlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgMHg0MjQ5NGU0ZCwgYm1fZmlsZXMpOwoJaWYgKCFlcnIpCgkJc2ItPnNfb3AgPSAmc19vcHM7CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpibV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCglpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQp7CglyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgYm1fZmlsbF9zdXBlcik7Cn0KCnN0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IG1pc2NfZm9ybWF0ID0gewoJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAoJLmxvYWRfYmluYXJ5ID0gbG9hZF9taXNjX2JpbmFyeSwKfTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm5hbWUJCT0gImJpbmZtdF9taXNjIiwKCS5nZXRfc2IJCT0gYm1fZ2V0X3NiLAoJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGluaXRfbWlzY19iaW5mbXQodm9pZCkKewoJaW50IGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJtX2ZzX3R5cGUpOwoJaWYgKCFlcnIpIHsKCQllcnIgPSByZWdpc3Rlcl9iaW5mbXQoJm1pc2NfZm9ybWF0KTsKCQlpZiAoZXJyKQoJCQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJtX2ZzX3R5cGUpOwoJfQoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWlzY19iaW5mbXQodm9pZCkKewoJdW5yZWdpc3Rlcl9iaW5mbXQoJm1pc2NfZm9ybWF0KTsKCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmYm1fZnNfdHlwZSk7Cn0KCmNvcmVfaW5pdGNhbGwoaW5pdF9taXNjX2JpbmZtdCk7Cm1vZHVsZV9leGl0KGV4aXRfbWlzY19iaW5mbXQpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==