ZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMzVlMGE2NC4uZjUwNDkzNSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTE5OTcsNiArMTk5NywxMyBAQAogTDoJZmFzdGJvb3RAbGlzdHMub3NkbC5vcmcKIFM6CU1haW50YWluZWQKIAorS0xJQkMvS0lOSVQKK1A6CUguIFBldGVyIEFudmluCitNOglocGFAenl0b3IuY29tCitMOglrbGliY0B6eXRvci5jb20KK1Q6CWdpdCBrZXJuZWwub3JnOnB1Yi9zY20vbGludXgva2VybmVsL2dpdC9ocGEvbGludXgtMi42LWtsaWJjLmdpdAorUzoJTWFpbnRhaW5lZAorCiBLUFJPQkVTCiBQOglQcmFzYW5uYSBTIFBhbmNoYW11a2hpCiBNOglwcmFzYW5uYUBpbi5pYm0uY29tCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDY2ZWU4YjguLjRmMjc5YjMgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xODYsNyArMTg2LDE2IEBACiBDUk9TU19DT01QSUxFCT89CiAKICMgQXJjaGl0ZWN0dXJlIGFzIHByZXNlbnQgaW4gY29tcGlsZS5oCi1VVFNfTUFDSElORSA6PSAkKEFSQ0gpCitVVFNfTUFDSElORQk6PSAkKEFSQ0gpCisKKyMgQXJjaGl0ZWN0dXJlIHVzZWQgdG8gY29tcGlsZSB1c2VyLXNwYWNlIGNvZGUKK0tMSUJDQVJDSAk/PSAkKEFSQ0gpCitLTElCQ0FSQ0hESVIJPz0gJChLTElCQ0FSQ0gpCisKKyMga2xpYmMgZGVmaW5pdGlvbnMKK2V4cG9ydCBLTElCQ0lOQyA6PSB1c3IvaW5jbHVkZQorZXhwb3J0IEtMSUJDU1JDIDo9ICQoc3JjdHJlZSkvdXNyL2tsaWJjCitleHBvcnQgS0xJQkNPQkogOj0gJChvYmp0cmVlKS91c3Iva2xpYmMKIAogS0NPTkZJR19DT05GSUcJPz0gLmNvbmZpZwogCkBAIC0yODQsNiArMjkzLDcgQEAKIENDCQk9ICQoQ1JPU1NfQ09NUElMRSlnY2MKIENQUAkJPSAkKENDKSAtRQogQVIJCT0gJChDUk9TU19DT01QSUxFKWFyCitSQU5MSUIJCT0gJChDUk9TU19DT01QSUxFKXJhbmxpYgogTk0JCT0gJChDUk9TU19DT01QSUxFKW5tCiBTVFJJUAkJPSAkKENST1NTX0NPTVBJTEUpc3RyaXAKIE9CSkNPUFkJCT0gJChDUk9TU19DT01QSUxFKW9iamNvcHkKQEAgLTMyNCw2ICszMzQsNyBAQAogZXhwb3J0IEFSQ0ggQ09ORklHX1NIRUxMIEhPU1RDQyBIT1NUQ0ZMQUdTIENST1NTX0NPTVBJTEUgQVMgTEQgQ0MKIGV4cG9ydCBDUFAgQVIgTk0gU1RSSVAgT0JKQ09QWSBPQkpEVU1QIE1BS0UgQVdLIEdFTktTWU1TIFBFUkwgVVRTX01BQ0hJTkUKIGV4cG9ydCBIT1NUQ1hYIEhPU1RDWFhGTEFHUyBMREZMQUdTX01PRFVMRSBDSEVDSyBDSEVDS0ZMQUdTCitleHBvcnQgUkFOTElCIEtMSUJDQVJDSCBLTElCQ0FSQ0hESVIKIAogZXhwb3J0IENQUEZMQUdTIE5PU1RESU5DX0ZMQUdTIExJTlVYSU5DTFVERSBPQkpDT1BZRkxBR1MgTERGTEFHUwogZXhwb3J0IENGTEFHUyBDRkxBR1NfS0VSTkVMIENGTEFHU19NT0RVTEUKQEAgLTE0MDgsNDEgKzE0MTksNDQgQEAKICMgLSBidWlsZCB3aGl0aCBtaXhlZCBzb3VyY2UgYW5kIG91dHB1dAogIyAtIGJ1aWxkIHdpdGggc2VwYXJhdGUgb3V0cHV0IGRpciAnbWFrZSBPPS4uLicKICMgLSBleHRlcm5hbCBtb2R1bGVzCisjIC0ga2xpYmMgbGlicmFyeSBhbmQga2xpYmMgcHJvZ3JhbXMgKGV2ZXJ5dGhpbmcgdW5kZXIgdXNyLykKICMKICMgIHRhcmdldC1kaXIgPT4gd2hlcmUgdG8gc3RvcmUgb3V0cHV0ZmlsZQogIyAgYnVpbGQtZGlyICA9PiBkaXJlY3RvcnkgaW4ga2VybmVsIHNvdXJjZSB0cmVlIHRvIHVzZQogCiBpZmVxICgkKEtCVUlMRF9FWFRNT0QpLCkKKyAgICAgICAgc2luZ2xlYmxkICA9ICQoaWYgJChmaWx0ZXIgdXNyLyUsJChkaXIgJEApKSwkKGtsaWJjKSwkKGJ1aWxkKSkKICAgICAgICAgYnVpbGQtZGlyICA9ICQocGF0c3Vic3QgJS8sJSwkKGRpciAkQCkpCiAgICAgICAgIHRhcmdldC1kaXIgPSAkKGRpciAkQCkKIGVsc2UKKyAgICAgICAgc2luZ2xlYmxkICA9ICQoYnVpbGQpCiAgICAgICAgIHphcC1zbGFzaD0kKGZpbHRlci1vdXQgLiwkKHBhdHN1YnN0ICUvLCUsJChkaXIgJEApKSkKICAgICAgICAgYnVpbGQtZGlyICA9ICQoS0JVSUxEX0VYVE1PRCkkKGlmICQoemFwLXNsYXNoKSwvJCh6YXAtc2xhc2gpKQogICAgICAgICB0YXJnZXQtZGlyID0gJChpZiAkKEtCVUlMRF9FWFRNT0QpLCQoZGlyICQ8KSwkKGRpciAkQCkpCiBlbmRpZgogCiAlLnM6ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorCSQoUSkkKE1BS0UpICQoc2luZ2xlYmxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQogJS5pOiAlLmMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCi0JJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKwkkKFEpJChNQUtFKSAkKHNpbmdsZWJsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKICUubzogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQotCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCisJJChRKSQoTUFLRSkgJChzaW5nbGVibGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCiAlLmxzdDogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQotCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCisJJChRKSQoTUFLRSkgJChzaW5nbGVibGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCiAlLnM6ICUuUyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKLQkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorCSQoUSkkKE1BS0UpICQoc2luZ2xlYmxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQogJS5vOiAlLlMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCi0JJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKwkkKFEpJChNQUtFKSAkKHNpbmdsZWJsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKICUuc3ltdHlwZXM6ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQogCiAjIE1vZHVsZXMKIC8gJS86IHByZXBhcmUgc2NyaXB0cyBGT1JDRQogCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgXAotCSQoYnVpbGQpPSQoYnVpbGQtZGlyKQorCSQoc2luZ2xlYmxkKT0kKGJ1aWxkLWRpcikKICUua286IHByZXBhcmUgc2NyaXB0cyBGT1JDRQogCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgICBcCi0JJChidWlsZCk9JChidWlsZC1kaXIpICQoQDoua289Lm8pCisJJChzaW5nbGVibGQpPSQoYnVpbGQtZGlyKSAkKEA6LmtvPS5vKQogCSQoUSkkKE1BS0UpIC1mICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CiAKICMgRklYTUUgU2hvdWxkIGdvIGludG8gYSBtYWtlLmxpYiBvciBzb21ldGhpbmcgCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IDAzZTM3YWYuLjJiNjVmYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC01Niw3ICs1Niw2IEBACiAKIGV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBtZW1pbmZvICosIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKmRlc2MpOwogZXh0ZXJuIHZvaWQgcmVib290X3NldHVwKGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKIGV4dGVybiB2b2lkIF9zdGV4dCwgX3RleHQsIF9ldGV4dCwgX19kYXRhX3N0YXJ0LCBfZWRhdGEsIF9lbmQ7CiAKIHVuc2lnbmVkIGludCBwcm9jZXNzb3JfaWQ7CkBAIC01MjAsMjAgKzUxOSwzMSBAQAogCSpjbWRsaW5lX3AgPSBjb21tYW5kX2xpbmU7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdAotc2V0dXBfcmFtZGlzayhpbnQgZG9sb2FkLCBpbnQgcHJvbXB0LCBpbnQgaW1hZ2Vfc3RhcnQsIHVuc2lnbmVkIGludCByZF9zeikKKy8qCisgKiBHZW5lcmF0ZSAvYXJjaC5jbWQsIHdoaWNoIGNvbnRhaW5zIGNvbW1hbmQtbGluZSBlcXVpdmFsZW50IG9wdGlvbnMKKyAqIGZvciBraW5pdC4gIFdlIGRvIHRoaXMgaW4gdHdvIHN0ZXBzOiBzYXZlIGludG8gYSBidWZmZXIsIGFuZCB0aGVuCisgKiB3cml0ZSBvdXQgdGhlIGZpbGUsIHNpbmNlIHRoZSBmaXJzdCBzdGVwIHdpbGwgdHlwaWNhbGx5IGJlIGRvbmUKKyAqIHZlcnkgZWFybHksIGFuZCB0aGUgc2Vjb25kIHN0ZXAgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciByb290ZnMgaXMgZnVsbHkKKyAqIG9wZXJhdGlvbmFsLgorICovCitzdGF0aWMgY2hhciBfX2luaXRkYXRhIGFyY2hfY21kX2J1ZmZlclsyNTZdOworc3RhdGljIGludCBfX2luaXRkYXRhIGFyY2hfY21kX2xlbjsKKworc3RhdGljIGludCBfX2luaXQgd3JpdGVfYXJjaF9pbml0X2NvbW1hbmQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KLQlleHRlcm4gaW50IHJkX3NpemUsIHJkX2ltYWdlX3N0YXJ0LCByZF9wcm9tcHQsIHJkX2RvbG9hZDsKKwlpbnQgZmQ7CiAKLQlyZF9pbWFnZV9zdGFydCA9IGltYWdlX3N0YXJ0OwotCXJkX3Byb21wdCA9IHByb21wdDsKLQlyZF9kb2xvYWQgPSBkb2xvYWQ7CisJZmQgPSBzeXNfb3BlbigiL2FyY2guY21kIiwgT19XUk9OTFl8T19DUkVBVHxPX0FQUEVORCwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOwogCi0JaWYgKHJkX3N6KQotCQlyZF9zaXplID0gcmRfc3o7Ci0jZW5kaWYKKwlzeXNfd3JpdGUoZmQsIGFyY2hfY21kX2J1ZmZlciwgYXJjaF9jbWRfbGVuKTsKKwlzeXNfY2xvc2UoZmQpOworCisJcmV0dXJuIDA7CiB9CisJCitsYXRlX2luaXRjYWxsKHdyaXRlX2FyY2hfaW5pdF9jb21tYW5kKTsKIAogc3RhdGljIHZvaWQgX19pbml0CiByZXF1ZXN0X3N0YW5kYXJkX3Jlc291cmNlcyhzdHJ1Y3QgbWVtaW5mbyAqbWksIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKm1kZXNjKQpAQCAtNTk5LDEzICs2MDksMjcgQEAKICAqIGEgcGFyYW1fc3RydWN0KS4gIFRoZSBsaXN0IGlzIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8tbGVuZ3RoIHRhZyAodGhpcyB0YWcKICAqIGlzIG5vdCBwYXJzZWQgaW4gYW55IHdheSkuCiAgKi8KKworCiBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfY29yZShjb25zdCBzdHJ1Y3QgdGFnICp0YWcpCiB7CisJY2hhciAqYnVmID0gYXJjaF9jbWRfYnVmZmVyICsgYXJjaF9jbWRfbGVuOworCWNoYXIgKmVuZCA9IGFyY2hfY21kX2J1ZmZlciArIHNpemVvZiBhcmNoX2NtZF9idWZmZXI7CisKKwlpZiAoZW5kLWJ1ZiA8PSAzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpidWYrKyA9ICdyJzsKKwkqYnVmID0gJ28nOwogCWlmICh0YWctPmhkci5zaXplID4gMikgewogCQlpZiAoKHRhZy0+dS5jb3JlLmZsYWdzICYgMSkgPT0gMCkKLQkJCXJvb3RfbW91bnRmbGFncyAmPSB+TVNfUkRPTkxZOworCQkJKmJ1ZiA9ICd3JzsKIAkJUk9PVF9ERVYgPSBvbGRfZGVjb2RlX2Rldih0YWctPnUuY29yZS5yb290ZGV2KTsKIAl9CisJYnVmKys7CisJKmJ1ZisrID0gJ1xuJzsKKworCWFyY2hfY21kX2xlbiA9IGVuZC1idWY7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY1NCwxMSArNjc4LDM1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19yYW1kaXNrKGNvbnN0IHN0cnVjdCB0YWcgKnRhZykKIHsKLQlzZXR1cF9yYW1kaXNrKCh0YWctPnUucmFtZGlzay5mbGFncyAmIDEpID09IDAsCi0JCSAgICAgICh0YWctPnUucmFtZGlzay5mbGFncyAmIDIpID09IDAsCi0JCSAgICAgIHRhZy0+dS5yYW1kaXNrLnN0YXJ0LCB0YWctPnUucmFtZGlzay5zaXplKTsKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KKwljaGFyICpidWYgPSBhcmNoX2NtZF9idWZmZXIgKyBhcmNoX2NtZF9sZW47CisJY2hhciAqZW5kID0gYXJjaF9jbWRfYnVmZmVyICsgc2l6ZW9mIGFyY2hfY21kX2J1ZmZlcjsKKwlpbnQgbGVuOworCQorCWxlbiA9IHNucHJpbnRmKGJ1ZiwgZW5kLWJ1ZiwKKwkJICAgICAgICJyYW1kaXNrX3N0YXJ0PSV1XG4iCisJCSAgICAgICAibG9hZF9yYW1kaXNrPSVkXG4iCisJCSAgICAgICAicHJvbXB0X3JhbWRpc2s9JWRcbiIsCisJCSAgICAgICB0YWctPnUucmFtZGlzay5zdGFydCwKKwkJICAgICAgIHRhZy0+dS5yYW1kaXNrLmZsYWdzICYgMSA/IDAgOiAxLAorCQkgICAgICAgdGFnLT51LnJhbWRpc2suZmxhZ3MgJiAyID8gMCA6IDEpOworCWlmIChsZW4gPj0gZW5kLWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJYnVmICs9IGxlbjsKKworCWlmICh0YWctPnUucmFtZGlzay5zaXplKSB7CisJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgZW5kLWJ1ZiwKKwkJCSAgICAgICAicmFtZGlza19zaXplPSV1XG4iLAorCQkJICAgICAgIHRhZy0+dS5yYW1kaXNrLnNpemUpOworCQlpZiAobGVuID49IGVuZC1idWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYnVmICs9IGxlbjsKKwl9CisKKwlhcmNoX2NtZF9sZW4gPSBlbmQtYnVmOworI2VuZGlmCiAJcmV0dXJuIDA7Ci19Cit9CQogCiBfX3RhZ3RhYmxlKEFUQUdfUkFNRElTSywgcGFyc2VfdGFnX3JhbWRpc2spOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMgYi9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKaW5kZXggMTIyNjIzZC4uMTRlMzRkZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtMTI0LDcgKzEyNCw2IEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgZWFybHlfY3B1X2luaXQodm9pZCk7Ci1leHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKIAogdW5zaWduZWQgbG9uZyBzYXZlZF92aWRlb21vZGU7CiAKQEAgLTU0MiwxMSArNTQxLDYgQEAKIAl9CiAJYm9vdGxvYWRlcl90eXBlID0gTE9BREVSX1RZUEU7CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KLQlyZF9pbWFnZV9zdGFydCA9IFJBTURJU0tfRkxBR1MgJiBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0s7Ci0JcmRfcHJvbXB0ID0gKChSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19QUk9NUFRfRkxBRykgIT0gMCk7Ci0JcmRfZG9sb2FkID0gKChSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19MT0FEX0ZMQUcpICE9IDApOwotI2VuZGlmCiAJQVJDSF9TRVRVUAogCWlmIChlZmlfZW5hYmxlZCkKIAkJZWZpX2luaXQoKTsKQEAgLTU1Nyw4ICs1NTEsNiBAQAogCiAJY29weV9lZGQoKTsKIAotCWlmICghTU9VTlRfUk9PVF9SRE9OTFkpCi0JCXJvb3RfbW91bnRmbGFncyAmPSB+TVNfUkRPTkxZOwogCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSBfdGV4dDsKIAlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpIF9ldGV4dDsKIAlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpIF9lZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCBhMDBmZTcyLi4wYjA3MDk2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC01Myw2ICs1Myw3IEBACiBlbmRpZgogCiBVVFNfTUFDSElORSA6PSAkKE9MREFSQ0gpCitLTElCQ0FSQ0ggICA6PSAkKE9MREFSQ0gpCiAKIGlmZXEgKCQoSEFTX0JJQVJDSCkseSkKIG92ZXJyaWRlIEFTCSs9IC1hJChTWikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9NYWtlZmlsZSBiL2FyY2gvczM5MC9NYWtlZmlsZQppbmRleCBiMWU1NTg0Li4zMzdhNjU3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL01ha2VmaWxlCkBAIC0yMCw2ICsyMCw3IEBACiBVVFNfTUFDSElORQk6PSBzMzkwCiBTVEFDS19TSVpFCTo9IDgxOTIKIENIRUNLRkxBR1MJKz0gLURfX3MzOTBfXworS0xJQkNBUkNICTo9IHMzOTAKIGVsc2UKIExERkxBR1MJCTo9IC1tIGVsZjY0X3MzOTAKIE1PREZMQUdTCSs9IC1mcGljIC1EX19QSUNfXwpAQCAtMjgsOCArMjksMTEgQEAKIFVUU19NQUNISU5FCTo9IHMzOTB4CiBTVEFDS19TSVpFCTo9IDE2Mzg0CiBDSEVDS0ZMQUdTCSs9IC1EX19zMzkwX18gLURfX3MzOTB4X18KK0tMSUJDQVJDSAk6PSBzMzkweAogZW5kaWYKIAorS0xJQkNBUkNIRElSCTo9IHMzOTAKKwogY2ZsYWdzLSQoQ09ORklHX01BUkNIX0c1KSAgICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWc1KQogY2ZsYWdzLSQoQ09ORklHX01BUkNIX1o5MDApICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXo5MDApCiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWjk5MCkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9ejk5MCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCmluZGV4IGVjY2Q4ZTguLmEwZjAxMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYwpAQCAtMjI4LDggKzIyOCw2IEBACiAjZGVmaW5lIFJBTURJU0tfUFJPTVBUX0ZMQUcJCTB4ODAwMAogI2RlZmluZSBSQU1ESVNLX0xPQURfRkxBRwkJMHg0MDAwCiAKLWV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwotCiBjaGFyIHJlYm9vdF9jb21tYW5kW0NPTU1BTkRfTElORV9TSVpFXTsKIGVudW0gc3BhcmNfY3B1IHNwYXJjX2NwdV9tb2RlbDsKIApAQCAtMzE2LDE0ICszMTQsNyBAQAogCX0KIAlwZm5fYmFzZSA9IHBoeXNfYmFzZSA+PiBQQUdFX1NISUZUOwogCi0JaWYgKCFyb290X2ZsYWdzKQotCQlyb290X21vdW50ZmxhZ3MgJj0gfk1TX1JET05MWTsKIAlST09UX0RFViA9IG9sZF9kZWNvZGVfZGV2KHJvb3RfZGV2KTsKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KLQlyZF9pbWFnZV9zdGFydCA9IHJhbV9mbGFncyAmIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSzsKLQlyZF9wcm9tcHQgPSAoKHJhbV9mbGFncyAmIFJBTURJU0tfUFJPTVBUX0ZMQUcpICE9IDApOwotCXJkX2RvbG9hZCA9ICgocmFtX2ZsYWdzICYgUkFNRElTS19MT0FEX0ZMQUcpICE9IDApOwkKLSNlbmRpZgogCiAJcHJvbV9zZXRzeW5jKHByb21fc3luY19tZSk7CiAKQEAgLTM3Niw2ICszNjcsNDQgQEAKIH0KIGNvbnNvbGVfaW5pdGNhbGwoc2V0X3ByZWZlcnJlZF9jb25zb2xlKTsKIAorLyoKKyAqIFBsYXRmb3JtLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMgd2hpY2ggZG9uJ3QgY29tZSBmcm9tCisgKiB0aGUgYWN0dWFsIGtlcm5lbCBjb21tYW5kIGxpbmUuICBXcml0ZSB0aGVtIGludG8gYSBmaWxlIGluIHJvb3RmcworICogc28ga2luaXQgY2FuIHBpY2sgdGhlbSB1cC4KKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0X2FyY2hfaW5pdF9jb21tYW5kcyh2b2lkKQoreworCWludCBmZCA9IHN5c19vcGVuKCIvYXJjaC5jbWQiLCBPX1dST05MWXxPX0NSRUFUfE9fQVBQRU5ELCAwNjY2KTsKKwljaGFyIGJ1ZmZlclsyNTZdOworCWludCBsZW4gPSAwOworCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJYnVmZmVyWzBdID0gJ3InOworCWJ1ZmZlclsxXSA9IHJvb3RfZmxhZ3MgPyAnbycgOiAndyc7CisJYnVmZmVyWzJdID0gJ1xuJzsKKwlsZW4gPSAzOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCisJbGVuICs9IG1pbigoaW50KShzaXplb2YgYnVmZmVyIC0gMSAtIGxlbiksCisJCSAgIHNucHJpbnRmKGJ1ZmZlcitsZW4sIHNpemVvZiBidWZmZXIgLSBsZW4sCisJCQkgICAgInJhbWRpc2tfc3RhcnQ9JXVcbiIKKwkJCSAgICAicHJvbXB0X3JhbWRpc2s9JWRcbiIKKwkJCSAgICAibG9hZF9yYW1kaXNrPSVkXG4iLAorCQkJICAgIHJhbV9mbGFncyAmIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSywKKwkJCSAgICAhIShyYW1fZmxhZ3MgJiBSQU1ESVNLX1BST01QVF9GTEFHKSwKKwkJCSAgICAhIShyYW1fZmxhZ3MgJiBSQU1ESVNLX0xPQURfRkxBRykpKTsKKyNlbmRpZgorCisJc3lzX3dyaXRlKGZkLCBidWZmZXIsIGxlbik7CisJc3lzX2Nsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKHNldF9hcmNoX2luaXRfY29tbWFuZHMpOworCiBleHRlcm4gY2hhciAqc3BhcmNfY3B1X3R5cGU7CiBleHRlcm4gY2hhciAqc3BhcmNfZnB1X3R5cGU7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCA0NTEwMjgzLi4wZjI4ZDlkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTkwLDYgKzkxLDE2IEBACiB7CiB9CiAKK2ludCBvYnBfc3lzdGVtX2ludHIodm9pZCkKK3sKKwlpZiAoYm9vdF9mbGFncyAmIEJPT1RNRV9ERUJVRykgeworCQlwcmludGsoIk9CUDogc3lzdGVtIGludGVycnVwdGVkXG4iKTsKKwkJcHJvbV9oYWx0KCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyogCiAgKiBQcm9jZXNzIGtlcm5lbCBjb21tYW5kIGxpbmUgc3dpdGNoZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlCiAgKiBTUEFSQyBvciB0aGF0IHJlcXVpcmUgc3BlY2lhbCBsb3ctbGV2ZWwgcHJvY2Vzc2luZy4KQEAgLTIwMSw4ICsyMTIsNiBAQAogI2RlZmluZSBSQU1ESVNLX1BST01QVF9GTEFHCQkweDgwMDAKICNkZWZpbmUgUkFNRElTS19MT0FEX0ZMQUcJCTB4NDAwMAogCi1leHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKLQogY2hhciByZWJvb3RfY29tbWFuZFtDT01NQU5EX0xJTkVfU0laRV07CiAKIHN0YXRpYyBzdHJ1Y3QgcHRfcmVncyBmYWtlX3N3YXBwZXJfcmVncyA9IHsgeyAwLCB9LCAwLCAwLCAwLCAwIH07CkBAIC0zMDIsNiArMzExLDY0IEBACiAJfQogfQogCisvKgorICogUGxhdGZvcm0tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBjb21tYW5kcyB3aGljaCBkb24ndCBjb21lIGZyb20KKyAqIHRoZSBhY3R1YWwga2VybmVsIGNvbW1hbmQgbGluZS4gIFdyaXRlIHRoZW0gaW50byBhIGZpbGUgaW4gcm9vdGZzCisgKiBzbyBraW5pdCBjYW4gcGljayB0aGVtIHVwLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXRfYXJjaF9pbml0X2NvbW1hbmRzKHZvaWQpCit7CisJaW50IGZkID0gc3lzX29wZW4oIi9hcmNoLmNtZCIsIE9fV1JPTkxZfE9fQ1JFQVR8T19BUFBFTkQsIDA2NjYpOworCWludCBjaG9zZW47CisJdTMyIGNsLCBzdiwgZ3c7CisJY2hhciBidWZmZXJbMjU2XTsKKwlpbnQgbGVuID0gMDsKKworCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKKworCWJ1ZmZlclswXSA9ICdyJzsKKwlidWZmZXJbMV0gPSByb290X2ZsYWdzID8gJ28nIDogJ3cnOworCWJ1ZmZlclsyXSA9ICdcbic7CisJbGVuID0gMzsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQorCWxlbiArPSBtaW4oKGludCkoc2l6ZW9mIGJ1ZmZlciAtIDEgLSBsZW4pLAorCQkgICBzbnByaW50ZihidWZmZXIrbGVuLCBzaXplb2YgYnVmZmVyIC0gbGVuLAorCQkJICAgICJyYW1kaXNrX3N0YXJ0PSV1XG4iCisJCQkgICAgInByb21wdF9yYW1kaXNrPSVkXG4iCisJCQkgICAgImxvYWRfcmFtZGlzaz0lZFxuIiwKKwkJCSAgICByYW1fZmxhZ3MgJiBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0ssCisJCQkgICAgISEocmFtX2ZsYWdzICYgUkFNRElTS19QUk9NUFRfRkxBRyksCisJCQkgICAgISEocmFtX2ZsYWdzICYgUkFNRElTS19MT0FEX0ZMQUcpKSk7CisjZW5kaWYKKworCWNob3NlbiA9IHByb21fZmluZGRldmljZSgiL2Nob3NlbiIpOworCWNsID0gcHJvbV9nZXRpbnRkZWZhdWx0KGNob3NlbiwgImNsaWVudC1pcCIsIDApOworCXN2ID0gcHJvbV9nZXRpbnRkZWZhdWx0KGNob3NlbiwgInNlcnZlci1pcCIsIDApOworCWd3ID0gcHJvbV9nZXRpbnRkZWZhdWx0KGNob3NlbiwgImdhdGV3YXktaXAiLCAwKTsKKworCWlmIChjbCAmJiBzdikgeworCQlsZW4gKz0gbWluKChpbnQpKHNpemVvZiBidWZmZXIgLSAxIC0gbGVuKSwKKwkJCSAgIHNucHJpbnRmKGJ1ZmZlcitsZW4sIHNpemVvZiBidWZmZXIgLSBsZW4sCisJCQkJICAgICJpcD0ldS4ldS4ldS4ldToldS4ldS4ldS4ldToiCisJCQkJICAgICIldS4ldS4ldS4ldVxuIiwKKwkJCQkgICAgKHU4KShjbCA+PiAyNCksICh1OCkoY2wgPj4gMTYpLAorCQkJCSAgICAodTgpKGNsID4+IDgpLCAodTgpY2wsCisJCQkJICAgICh1OCkoc3YgPj4gMjQpLCAodTgpKHN2ID4+IDE2KSwKKwkJCQkgICAgKHU4KShzdiA+PiA4KSwgKHU4KXN2LAorCQkJCSAgICAodTgpKGd3ID4+IDI0KSwgKHU4KShndyA+PiAxNiksCisJCQkJICAgICh1OCkoZ3cgPj4gOCksICh1OClndykpOworCX0KKworCXN5c193cml0ZShmZCwgYnVmZmVyLCBsZW4pOworCXN5c19jbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChzZXRfYXJjaF9pbml0X2NvbW1hbmRzKTsKKwogI2lmZGVmIENPTkZJR19TTVAKIHZvaWQgX19pbml0IGJvb3RfY3B1X2lkX3Rvb19sYXJnZShpbnQgY3B1KQogewpAQCAtMzMyLDM3ICszOTksMTAgQEAKIAogCWlkcHJvbV9pbml0KCk7CiAKLQlpZiAoIXJvb3RfZmxhZ3MpCi0JCXJvb3RfbW91bnRmbGFncyAmPSB+TVNfUkRPTkxZOwogCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYocm9vdF9kZXYpOwotI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQotCXJkX2ltYWdlX3N0YXJ0ID0gcmFtX2ZsYWdzICYgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLOwotCXJkX3Byb21wdCA9ICgocmFtX2ZsYWdzICYgUkFNRElTS19QUk9NUFRfRkxBRykgIT0gMCk7Ci0JcmRfZG9sb2FkID0gKChyYW1fZmxhZ3MgJiBSQU1ESVNLX0xPQURfRkxBRykgIT0gMCk7CQotI2VuZGlmCiAKIAl0YXNrX3RocmVhZF9pbmZvKCZpbml0X3Rhc2spLT5rcmVncyA9ICZmYWtlX3N3YXBwZXJfcmVnczsKIAotI2lmZGVmIENPTkZJR19JUF9QTlAKLQlpZiAoIWljX3NldF9tYW51YWxseSkgewotCQlpbnQgY2hvc2VuID0gcHJvbV9maW5kZGV2aWNlICgiL2Nob3NlbiIpOwotCQl1MzIgY2wsIHN2LCBndzsKLQkJCi0JCWNsID0gcHJvbV9nZXRpbnRkZWZhdWx0IChjaG9zZW4sICJjbGllbnQtaXAiLCAwKTsKLQkJc3YgPSBwcm9tX2dldGludGRlZmF1bHQgKGNob3NlbiwgInNlcnZlci1pcCIsIDApOwotCQlndyA9IHByb21fZ2V0aW50ZGVmYXVsdCAoY2hvc2VuLCAiZ2F0ZXdheS1pcCIsIDApOwotCQlpZiAoY2wgJiYgc3YpIHsKLQkJCWljX215YWRkciA9IGNsOwotCQkJaWNfc2VydmFkZHIgPSBzdjsKLQkJCWlmIChndykKLQkJCQlpY19nYXRld2F5ID0gZ3c7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBfUE5QX0JPT1RQKSB8fCBkZWZpbmVkKENPTkZJR19JUF9QTlBfUkFSUCkKLQkJCWljX3Byb3RvX2VuYWJsZWQgPSAwOwotI2VuZGlmCi0JCX0KLQl9Ci0jZW5kaWYKLQogCS8qIEdldCBib290IHByb2Nlc3NvciB0cmFwX2Jsb2NrW10gc2V0dXAuICAqLwogCWluaXRfY3VyX2NwdV90cmFwKGN1cnJlbnRfdGhyZWFkX2luZm8oKSk7CiAKQEAgLTQyNSw3ICs0NjUsNyBAQAogCiBzdGF0aWMgaW50IHNob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKl9fdW51c2VkKQogewotCXNlcV9wcmludGYobSwgCisJc2VxX3ByaW50ZihtLAogCQkgICAiY3B1XHRcdDogJXNcbiIKIAkJICAgImZwdVx0XHQ6ICVzXG4iCiAJCSAgICJwcm9tXHRcdDogJXNcbiIKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUgYi9hcmNoL3VtL01ha2VmaWxlCmluZGV4IDVkNWVkNzIuLmIzY2E3YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vTWFrZWZpbGUKKysrIGIvYXJjaC91bS9NYWtlZmlsZQpAQCAtNTAsNiArNTAsOCBAQAogZW5kaWYKIFNZU19ESVIJCTo9ICQoQVJDSF9ESVIpL2luY2x1ZGUvc3lzZGVwLSQoU1VCQVJDSCkKIAorS0xJQkNBUkNICTo9ICQoU1VCQVJDSCkKKwogIyAtRHZtYXA9a2VybmVsX3ZtYXAgcHJldmVudHMgYW55dGhpbmcgZnJvbSByZWZlcmVuY2luZyB0aGUgbGlicGNhcC5vIHN5bWJvbCBzbwogIyBuYW1lZCAtIGl0J3MgYSBjb21tb24gc3ltYm9sIGluIGxpYnBjYXAsIHNvIHdlIGdldCBhIGJpbmFyeSB3aGljaCBjcmFzaGVzLgogIwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYwppbmRleCAzZDk4YjY5Li5mMzgzNDIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYwpAQCAtMjI5LDE2ICsyMjksOSBAQAogCXNhdmVkX3ZpZGVvX21vZGUgPSBTQVZFRF9WSURFT19NT0RFOwogCWJvb3Rsb2FkZXJfdHlwZSA9IExPQURFUl9UWVBFOwogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCi0JcmRfaW1hZ2Vfc3RhcnQgPSBSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLOwotCXJkX3Byb21wdCA9ICgoUkFNRElTS19GTEFHUyAmIFJBTURJU0tfUFJPTVBUX0ZMQUcpICE9IDApOwotCXJkX2RvbG9hZCA9ICgoUkFNRElTS19GTEFHUyAmIFJBTURJU0tfTE9BRF9GTEFHKSAhPSAwKTsKLSNlbmRpZgogCXNldHVwX21lbW9yeV9yZWdpb24oKTsKIAljb3B5X2VkZCgpOwogCi0JaWYgKCFNT1VOVF9ST09UX1JET05MWSkKLQkJcm9vdF9tb3VudGZsYWdzICY9IH5NU19SRE9OTFk7CiAJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpICZfdGV4dDsKIAlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CiAJaW5pdF9tbS5lbmRfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmX2VkYXRhOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggM2M0ODg2Yi4uMGQzODdkOSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0xNjk0LDIwICsxNjk0LDYgQEAKIAkgIFRDUCBjb25uZWN0aW9ucyB1c3VhbGx5IHBlcmZvcm0gYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgVURQIHdoZW4KIAkgIHRoZSBuZXR3b3JrIGlzIGxvc3N5IG9yIGNvbmdlc3RlZC4gIElmIHVuc3VyZSwgc2F5IFkuCiAKLWNvbmZpZyBST09UX05GUwotCWJvb2wgIlJvb3QgZmlsZSBzeXN0ZW0gb24gTkZTIgotCWRlcGVuZHMgb24gTkZTX0ZTPXkgJiYgSVBfUE5QCi0JaGVscAotCSAgSWYgeW91IHdhbnQgeW91ciBMaW51eCBib3ggdG8gbW91bnQgaXRzIHdob2xlIHJvb3QgZmlsZSBzeXN0ZW0gKHRoZQotCSAgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBmcm9tIHNvbWUgb3RoZXIgY29tcHV0ZXIgb3ZlciB0aGUKLQkgIG5ldCB2aWEgTkZTIChwcmVzdW1hYmx5IGJlY2F1c2UgeW91ciBib3ggZG9lc24ndCBoYXZlIGEgaGFyZCBkaXNrKSwKLQkgIHNheSBZLiBSZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmZzcm9vdC50eHQ+IGZvciBkZXRhaWxzLiBJdCBpcwotCSAgbGlrZWx5IHRoYXQgaW4gdGhpcyBjYXNlLCB5b3UgYWxzbyB3YW50IHRvIHNheSBZIHRvICJLZXJuZWwgbGV2ZWwgSVAKLQkgIGF1dG9jb25maWd1cmF0aW9uIiBzbyB0aGF0IHlvdXIgYm94IGNhbiBkaXNjb3ZlciBpdHMgbmV0d29yayBhZGRyZXNzCi0JICBhdCBib290IHRpbWUuCi0KLQkgIE1vc3QgcGVvcGxlIHNheSBOIGhlcmUuCi0KIGNvbmZpZyBMT0NLRAogCXRyaXN0YXRlCiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9NYWtlZmlsZSBiL2ZzL25mcy9NYWtlZmlsZQppbmRleCBmNDU4MGI0Li45OGI5Y2QzIDEwMDY0NAotLS0gYS9mcy9uZnMvTWFrZWZpbGUKKysrIGIvZnMvbmZzL01ha2VmaWxlCkBAIC03LDcgKzcsNiBAQAogbmZzLXkgCQkJOj0gY2xpZW50Lm8gZGlyLm8gZmlsZS5vIGdldHJvb3QubyBpbm9kZS5vIHN1cGVyLm8gbmZzMnhkci5vIFwKIAkJCSAgIHBhZ2VsaXN0Lm8gcHJvYy5vIHJlYWQubyBzeW1saW5rLm8gdW5saW5rLm8gXAogCQkJICAgd3JpdGUubyBuYW1lc3BhY2UubwotbmZzLSQoQ09ORklHX1JPT1RfTkZTKQkrPSBuZnNyb290Lm8gbW91bnRfY2xudC5vICAgICAgCiBuZnMtJChDT05GSUdfTkZTX1YzKQkrPSBuZnMzcHJvYy5vIG5mczN4ZHIubwogbmZzLSQoQ09ORklHX05GU19WM19BQ0wpCSs9IG5mczNhY2wubwogbmZzLSQoQ09ORklHX05GU19WNCkJKz0gbmZzNHByb2MubyBuZnM0eGRyLm8gbmZzNHN0YXRlLm8gbmZzNHJlbmV3ZC5vIFwKZGlmZiAtLWdpdCBhL2ZzL25mcy9tb3VudF9jbG50LmMgYi9mcy9uZnMvbW91bnRfY2xudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzVmZTcyLi4wMDAwMDAwCi0tLSBhL2ZzL25mcy9tb3VudF9jbG50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2ZzL25mcy9tb3VudF9jbG50LmMKLSAqCi0gKiBNT1VOVCBjbGllbnQgdG8gc3VwcG9ydCBORlNyb290LgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NywgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC91aW8uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3VucnBjL3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+Ci0KLSNpZmRlZiBSUENfREVCVUcKLSMgZGVmaW5lIE5GU0RCR19GQUNJTElUWQlORlNEQkdfUk9PVAotI2VuZGlmCi0KLS8qCi0jZGVmaW5lIE1PVU5UX1BST0dSQU0JCTEwMDAwNQotI2RlZmluZSBNT1VOVF9WRVJTSU9OCQkxCi0jZGVmaW5lIE1PVU5UX01OVAkJMQotI2RlZmluZSBNT1VOVF9VTU5UCQkzCi0gKi8KLQotc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCW1udF9jcmVhdGUoY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwKLQkJCQkJCQkJaW50LCBpbnQpOwotc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQltbnRfcHJvZ3JhbTsKLQotc3RydWN0IG1udF9maHN0YXR1cyB7Ci0JdW5zaWduZWQgaW50CQlzdGF0dXM7Ci0Jc3RydWN0IG5mc19maCAqCQlmaDsKLX07Ci0KLS8qCi0gKiBPYnRhaW4gYW4gTkZTIGZpbGUgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gaG9zdCBhbmQgcGF0aAotICovCi1pbnQKLW5mc3Jvb3RfbW91bnQoc3RydWN0IHNvY2thZGRyX2luICphZGRyLCBjaGFyICpwYXRoLCBzdHJ1Y3QgbmZzX2ZoICpmaCwKLQkJaW50IHZlcnNpb24sIGludCBwcm90b2NvbCkKLXsKLQlzdHJ1Y3QgcnBjX2NsbnQJCSptbnRfY2xudDsKLQlzdHJ1Y3QgbW50X2Zoc3RhdHVzCXJlc3VsdCA9IHsKLQkJLmZoCQk9IGZoCi0JfTsKLQlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnCT0gewotCQkucnBjX2FyZ3AJPSBwYXRoLAotCQkucnBjX3Jlc3AJPSAmcmVzdWx0LAotCX07Ci0JY2hhcgkJCWhvc3RuYW1lWzMyXTsKLQlpbnQJCQlzdGF0dXM7Ci0KLQlkcHJpbnRrKCJORlM6ICAgICAgbmZzX21vdW50KCUwOHg6JXMpXG4iLAotCQkJKHVuc2lnbmVkKW50b2hsKGFkZHItPnNpbl9hZGRyLnNfYWRkciksIHBhdGgpOwotCi0Jc3ByaW50Zihob3N0bmFtZSwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChhZGRyLT5zaW5fYWRkci5zX2FkZHIpKTsKLQltbnRfY2xudCA9IG1udF9jcmVhdGUoaG9zdG5hbWUsIGFkZHIsIHZlcnNpb24sIHByb3RvY29sKTsKLQlpZiAoSVNfRVJSKG1udF9jbG50KSkKLQkJcmV0dXJuIFBUUl9FUlIobW50X2NsbnQpOwotCi0JaWYgKHZlcnNpb24gPT0gTkZTX01OVDNfVkVSU0lPTikKLQkJbXNnLnJwY19wcm9jID0gJm1udF9jbG50LT5jbF9wcm9jaW5mb1tNT1VOVFBST0MzX01OVF07Ci0JZWxzZQotCQltc2cucnBjX3Byb2MgPSAmbW50X2NsbnQtPmNsX3Byb2NpbmZvW01OVFBST0NfTU5UXTsKLQotCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMobW50X2NsbnQsICZtc2csIDApOwotCXJldHVybiBzdGF0dXMgPCAwPyBzdGF0dXMgOiAocmVzdWx0LnN0YXR1cz8gLUVBQ0NFUyA6IDApOwotfQotCi1zdGF0aWMgc3RydWN0IHJwY19jbG50ICoKLW1udF9jcmVhdGUoY2hhciAqaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc3J2YWRkciwgaW50IHZlcnNpb24sCi0JCWludCBwcm90b2NvbCkKLXsKLQlzdHJ1Y3QgcnBjX2NyZWF0ZV9hcmdzIGFyZ3MgPSB7Ci0JCS5wcm90b2NvbAk9IHByb3RvY29sLAotCQkuYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKilzcnZhZGRyLAotCQkuYWRkcnNpemUJPSBzaXplb2YoKnNydmFkZHIpLAotCQkuc2VydmVybmFtZQk9IGhvc3RuYW1lLAotCQkucHJvZ3JhbQk9ICZtbnRfcHJvZ3JhbSwKLQkJLnZlcnNpb24JPSB2ZXJzaW9uLAotCQkuYXV0aGZsYXZvcgk9IFJQQ19BVVRIX1VOSVgsCi0JCS5mbGFncwkJPSAoUlBDX0NMTlRfQ1JFQVRFX09ORVNIT1QgfAotCQkJCSAgIFJQQ19DTE5UX0NSRUFURV9JTlRSKSwKLQl9OwotCi0JcmV0dXJuIHJwY19jcmVhdGUoJmFyZ3MpOwotfQotCi0vKgotICogWERSIGVuY29kZS9kZWNvZGUgZnVuY3Rpb25zIGZvciBNT1VOVAotICovCi1zdGF0aWMgaW50Ci14ZHJfZW5jb2RlX2RpcnBhdGgoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3QgY2hhciAqcGF0aCkKLXsKLQlwID0geGRyX2VuY29kZV9zdHJpbmcocCwgcGF0aCk7Ci0KLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfZmhzdGF0dXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG1udF9maHN0YXR1cyAqcmVzKQotewotCXN0cnVjdCBuZnNfZmggKmZoID0gcmVzLT5maDsKLQotCWlmICgocmVzLT5zdGF0dXMgPSBudG9obCgqcCsrKSkgPT0gMCkgewotCQlmaC0+c2l6ZSA9IE5GUzJfRkhTSVpFOwotCQltZW1jcHkoZmgtPmRhdGEsIHAsIE5GUzJfRkhTSVpFKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfZmhzdGF0dXMzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBtbnRfZmhzdGF0dXMgKnJlcykKLXsKLQlzdHJ1Y3QgbmZzX2ZoICpmaCA9IHJlcy0+Zmg7Ci0KLQlpZiAoKHJlcy0+c3RhdHVzID0gbnRvaGwoKnArKykpID09IDApIHsKLQkJaW50IHNpemUgPSBudG9obCgqcCsrKTsKLQkJaWYgKHNpemUgPD0gTkZTM19GSFNJWkUpIHsKLQkJCWZoLT5zaXplID0gc2l6ZTsKLQkJCW1lbWNweShmaC0+ZGF0YSwgcCwgc2l6ZSk7Ci0JCX0gZWxzZQotCQkJcmVzLT5zdGF0dXMgPSAtRUJBREhBTkRMRTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgTU5UX2RpcnBhdGhfc3oJCSgxICsgMjU2KQotI2RlZmluZSBNTlRfZmhzdGF0dXNfc3oJCSgxICsgOCkKLQotc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbW50X3Byb2NlZHVyZXNbXSA9IHsKLVtNTlRQUk9DX01OVF0gPSB7Ci0JICAucF9wcm9jCQk9IE1OVFBST0NfTU5ULAotCSAgLnBfZW5jb2RlCQk9IChreGRycHJvY190KSB4ZHJfZW5jb2RlX2RpcnBhdGgsCQotCSAgLnBfZGVjb2RlCQk9IChreGRycHJvY190KSB4ZHJfZGVjb2RlX2Zoc3RhdHVzLAotCSAgLnBfYnVmc2l6CQk9IE1OVF9kaXJwYXRoX3N6IDw8IDIsCi0JICAucF9zdGF0aWR4CQk9IE1OVFBST0NfTU5ULAotCSAgLnBfbmFtZQkJPSAiTU9VTlQiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBtbnQzX3Byb2NlZHVyZXNbXSA9IHsKLVtNT1VOVFBST0MzX01OVF0gPSB7Ci0JICAucF9wcm9jCQk9IE1PVU5UUFJPQzNfTU5ULAotCSAgLnBfZW5jb2RlCQk9IChreGRycHJvY190KSB4ZHJfZW5jb2RlX2RpcnBhdGgsCi0JICAucF9kZWNvZGUJCT0gKGt4ZHJwcm9jX3QpIHhkcl9kZWNvZGVfZmhzdGF0dXMzLAotCSAgLnBfYnVmc2l6CQk9IE1OVF9kaXJwYXRoX3N6IDw8IDIsCi0JICAucF9zdGF0aWR4CQk9IE1PVU5UUFJPQzNfTU5ULAotCSAgLnBfbmFtZQkJPSAiTU9VTlQiLAotCX0sCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbW50X3ZlcnNpb24xID0gewotCQkubnVtYmVyCQk9IDEsCi0JCS5ucnByb2NzIAk9IDIsCi0JCS5wcm9jcyAJCT0gbW50X3Byb2NlZHVyZXMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gICAgICAgbW50X3ZlcnNpb24zID0gewotCQkubnVtYmVyCQk9IDMsCi0JCS5ucnByb2NzCT0gMiwKLQkJLnByb2NzCQk9IG1udDNfcHJvY2VkdXJlcwotfTsKLQotc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW1udF92ZXJzaW9uW10gPSB7Ci0JTlVMTCwKLQkmbW50X3ZlcnNpb24xLAotCU5VTEwsCi0JJm1udF92ZXJzaW9uMywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW1udF9zdGF0czsKLQotc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQltbnRfcHJvZ3JhbSA9IHsKLQkubmFtZQkJPSAibW91bnQiLAotCS5udW1iZXIJCT0gTkZTX01OVF9QUk9HUkFNLAotCS5ucnZlcnMJCT0gQVJSQVlfU0laRShtbnRfdmVyc2lvbiksCi0JLnZlcnNpb24JPSBtbnRfdmVyc2lvbiwKLQkuc3RhdHMJCT0gJm1udF9zdGF0cywKLX07CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzcm9vdC5jIGIvZnMvbmZzL25mc3Jvb3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmODE5ZC4uMDAwMDAwMAotLS0gYS9mcy9uZnMvbmZzcm9vdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qCi0gKiAgJElkOiBuZnNyb290LmMsdiAxLjQ1IDE5OTgvMDMvMDcgMTA6NDQ6NDYgbWogRXhwICQKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2ICBHZXJvIEt1aGxtYW5uIDxnZXJvQGdrbWluaXguaGFuLmRlPgotICoKLSAqICBBbGxvdyBhbiBORlMgZmlsZXN5c3RlbSB0byBiZSBtb3VudGVkIGFzIHJvb3QuIFRoZSB3YXkgdGhpcyB3b3JrcyBpczoKLSAqICAgICAoMSkgVXNlIHRoZSBJUCBhdXRvY29uZmlnIG1lY2hhbmlzbSB0byBzZXQgbG9jYWwgSVAgYWRkcmVzc2VzIGFuZCByb3V0ZXMuCi0gKiAgICAgKDIpIEhhbmRsZSBSUEMgbmVnb3RpYXRpb24gd2l0aCB0aGUgc3lzdGVtIHdoaWNoIHJlcGxpZWQgdG8gUkFSUCBvcgotICogICAgICAgICB3YXMgcmVwb3J0ZWQgYXMgYSBib290IHNlcnZlciBieSBCT09UUCBvciBtYW51YWxseS4KLSAqICAgICAoMykgVGhlIGFjdHVhbCBtb3VudGluZyBpcyBkb25lIGxhdGVyLCB3aGVuIGluaXQoKSBpcyBydW5uaW5nLgotICoKLSAqCi0gKglDaGFuZ2VzOgotICoKLSAqCUFsYW4gQ294CToJUmVtb3ZlZCBnZXRfYWRkcmVzcyBuYW1lIGNsYXNoIHdpdGggRlBVLgotICoJQWxhbiBDb3gJOglSZWZvcm1hdHRlZCBhIGJpdC4KLSAqCUdlcm8gS3VobG1hbm4JOglDb2RlIGNsZWFudXAKLSAqCU1pY2hhZWwgUmF1c2NoICA6CUZpeGVkIHJlY29nbml0aW9uIG9mIGFuIGluY29taW5nIFJBUlAgYW5zd2VyLgotICoJTWFydGluIE1hcmVzCTogKDIuMCkJQXV0by1jb25maWd1cmF0aW9uIHZpYSBCT09UUCBzdXBwb3J0ZWQuCi0gKglNYXJ0aW4gTWFyZXMJOglNYW51YWwgc2VsZWN0aW9uIG9mIGludGVyZmFjZSAmIEJPT1RQL1JBUlAuCi0gKglNYXJ0aW4gTWFyZXMJOglVc2luZyBuZXR3b3JrIHJvdXRlcyBpbnN0ZWFkIG9mIGhvc3Qgcm91dGVzLAotICoJCQkJYWxsb3dpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byBiZSB1c2VkCi0gKgkJCQlmb3Igbm9ybWFsIG9wZXJhdGlvbiBvZiB0aGUgaG9zdC4KLSAqCU1hcnRpbiBNYXJlcwk6CVJhbmRvbWl6ZWQgdGltZXIgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmCi0gKgkJCQlpbnN0YWxsZWQgdG8gbWluaW1pemUgbmV0d29yayBjb25nZXN0aW9uLgotICoJTWFydGluIE1hcmVzCToJQ29kZSBjbGVhbnVwLgotICoJTWFydGluIE1hcmVzCTogKDIuMSkJQk9PVFAgYW5kIFJBUlAgbWFkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCi0gKglNYXJ0aW4gTWFyZXMJOglTZXJ2ZXIgaG9zdG5hbWUgZ2VuZXJhdGlvbiBmaXhlZC4KLSAqCUdlcmQgS25vcnIJOglGaXhlZCB3aXJlZCBpbm9kZSBoYW5kbGluZwotICoJTWFydGluIE1hcmVzCTogKDIuMikJIjAuMC4wLjAiIGFkZHJlc3NlcyBmcm9tIGNvbW1hbmQgbGluZSBpZ25vcmVkLgotICoJTWFydGluIE1hcmVzCToJUkFSUCByZXBsaWVzIG5vdCB0ZXN0ZWQgZm9yIHNlcnZlciBhZGRyZXNzLgotICoJR2VybyBLdWhsbWFubgk6ICgyLjMpIFNvbWUgYnVnIGZpeGVzIGFuZCBjb2RlIGNsZWFudXAgYWdhaW4gKHBsZWFzZQotICoJCQkJc2VuZCBtZSB5b3VyIG5ldyBwYXRjaGVzIF9iZWZvcmVfIGJvdGhlcmluZwotICoJCQkJTGludXMgc28gdGhhdCBJIGRvbicgYWx3YXlzIGhhdmUgdG8gY2xlYW51cAotICoJCQkJX2FmdGVyd2FyZHNfIC0gdGhhbmtzKQotICoJR2VybyBLdWhsbWFubgk6CUxhc3QgY2hhbmdlcyBvZiBNYXJ0aW4gTWFyZXMgdW5kb25lLgotICoJR2VybyBLdWhsbWFubgk6IAlSQVJQIHJlcGxpZXMgYXJlIHRlc3RlZCBmb3Igc3BlY2lmaWVkIHNlcnZlcgotICoJCQkJYWdhaW4uIEhvd2V2ZXIsIGl0J3Mgbm93IHBvc3NpYmxlIHRvIGhhdmUKLSAqCQkJCWRpZmZlcmVudCBSQVJQIGFuZCBORlMgc2VydmVycy4KLSAqCUdlcm8gS3VobG1hbm4JOgkiMC4wLjAuMCIgYWRkcmVzc2VzIGZyb20gY29tbWFuZCBsaW5lIGFyZQotICoJCQkJbm93IG1hcHBlZCB0byBJTkFERFJfTk9ORS4KLSAqCUdlcm8gS3VobG1hbm4JOglGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgQk9PVFAgcGF0aCBuYW1lCi0gKgkJCQlmcm9tIGJlaW5nIHVzZWQgKHRoYW5rcyB0byBMZW8gU3BpZWttYW4pCi0gKglBbmR5IFdhbGtlcgk6CUFsbG93IHRvIHNwZWNpZnkgdGhlIE5GUyBzZXJ2ZXIgaW4gbmZzX3Jvb3QKLSAqCQkJCXdpdGhvdXQgZ2l2aW5nIGEgcGF0aCBuYW1lCi0gKglTd2VuIFRo/G1tbGVyCToJQWxsb3cgdG8gc3BlY2lmeSB0aGUgTkZTIG9wdGlvbnMgaW4gbmZzX3Jvb3QKLSAqCQkJCXdpdGhvdXQgZ2l2aW5nIGEgcGF0aCBuYW1lLiBGaXggQk9PVFAgcmVxdWVzdAotICoJCQkJZm9yIGRvbWFpbm5hbWUgKGRvbWFpbm5hbWUgaXMgTklTIGRvbWFpbiwgbm90Ci0gKgkJCQlETlMgZG9tYWluISkuIFNraXAgZHVtbXkgZGV2aWNlcyBmb3IgQk9PVFAuCi0gKglKYWNlayBaYXBhbGEJOglGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgc2VydmVyLWlwIGFkZHJlc3MKLSAqCQkJCWZyb20gbmZzcm9vdCBwYXJhbWV0ZXIgZnJvbSBiZWluZyB1c2VkLgotICoJT2xhZiBLaXJjaAk6CUFkYXB0ZWQgdG8gbmV3IE5GUyBjb2RlLgotICoJSmFrdWIgSmVsaW5lawk6CUZyZWUgdXNlZCBjb2RlIHNlZ21lbnQuCi0gKglNYXJrbyBLb2h0YWxhCToJRml4ZWQgc29tZSBidWdzLgotICoJTWFydGluIE1hcmVzCToJRGVidWcgbWVzc2FnZSBjbGVhbnVwCi0gKglNYXJ0aW4gTWFyZXMJOglDaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IGdlbmVyaWMgSVAgbGF5ZXIgYXV0b2NvbmZpZwotICoJCQkJY29kZS4gQk9PVFAgYW5kIFJBUlAgbW92ZWQgdGhlcmUuCi0gKglNYXJ0aW4gTWFyZXMJOglEZWZhdWx0IHBhdGggbm93IGNvbnRhaW5zIGhvc3QgbmFtZSBpbnN0ZWFkIG9mCi0gKgkJCQlob3N0IElQIGFkZHJlc3MgKGJ1dCBob3N0IG5hbWUgZGVmYXVsdHMgdG8gSVAKLSAqCQkJCWFkZHJlc3MgYW55d2F5KS4KLSAqCU1hcnRpbiBNYXJlcwk6CVVzZSByb290X3NlcnZlcl9hZGRyIGFwcHJvcHJpYXRlbHkgZHVyaW5nIHNldHVwLgotICoJTWFydGluIE1hcmVzCToJUmV3cm90ZSBwYXJhbWV0ZXIgcGFyc2luZywgbm93IGhvcGVmdWxseSBnaXZpbmcKLSAqCQkJCWNvcnJlY3Qgb3ZlcnJpZGluZy4KLSAqCVRyb25kIE15a2xlYnVzdCA6CUFkZCBpbiBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBORlN2MyBhbmQgVENQLgotICoJCQkJRml4IGJ1ZyBpbiByb290X25mc19hZGRyKCkuIG5mc19kYXRhLm5hbWxlbgotICoJCQkJaXMgTk9UIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBob3N0bmFtZS4KLSAqCUh1YSBRaW4JCToJU3VwcG9ydCBmb3IgbW91bnRpbmcgcm9vdCBmaWxlIHN5c3RlbSB2aWEKLSAqCQkJCU5GUyBvdmVyIFRDUC4KLSAqCUZhYmlhbiBGcmVkZXJpY2s6CU9wdGlvbiBwYXJzZXIgcmVidWlsdCAodXNpbmcgcGFyc2VyIGxpYikKLSovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgotI2luY2x1ZGUgPGxpbnV4L25mcy5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+Ci0jaW5jbHVkZSA8bmV0L2lwY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+Ci0KLS8qIERlZmluZSB0aGlzIHRvIGFsbG93IGRlYnVnZ2luZyBvdXRwdXQgKi8KLSN1bmRlZiBORlNST09UX0RFQlVHCi0jZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfUk9PVAotCi0vKiBEZWZhdWx0IHBhdGggd2UgdHJ5IHRvIG1vdW50LiAiJXMiIGdldHMgcmVwbGFjZWQgYnkgb3VyIElQIGFkZHJlc3MgKi8KLSNkZWZpbmUgTkZTX1JPT1QJCSIvdGZ0cGJvb3QvJXMiCi0KLS8qIFBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgKi8KLXN0YXRpYyBjaGFyIG5mc19yb290X25hbWVbMjU2XSBfX2luaXRkYXRhID0gIiI7Ci0KLS8qIEFkZHJlc3Mgb2YgTkZTIHNlcnZlciAqLwotc3RhdGljIF9fYmUzMiBzZXJ2YWRkciBfX2luaXRkYXRhID0gMDsKLQotLyogTmFtZSBvZiBkaXJlY3RvcnkgdG8gbW91bnQgKi8KLXN0YXRpYyBjaGFyIG5mc19wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9OwotCi0vKiBORlMtcmVsYXRlZCBkYXRhICovCi1zdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIG5mc19kYXRhIF9faW5pdGRhdGEgPSB7IDAsIH07LyogTkZTIG1vdW50IGluZm8gKi8KLXN0YXRpYyBpbnQgbmZzX3BvcnQgX19pbml0ZGF0YSA9IDA7CQkvKiBQb3J0IHRvIGNvbm5lY3QgdG8gZm9yIE5GUyAqLwotc3RhdGljIGludCBtb3VudF9wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogTW91bnQgZGFlbW9uIHBvcnQgbnVtYmVyICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JCQkgICAgIFBhcnNpbmcgb2Ygb3B0aW9ucwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1lbnVtIHsKLQkvKiBPcHRpb25zIHRoYXQgdGFrZSBpbnRlZ2VyIGFyZ3VtZW50cyAqLwotCU9wdF9wb3J0LCBPcHRfcnNpemUsIE9wdF93c2l6ZSwgT3B0X3RpbWVvLCBPcHRfcmV0cmFucywgT3B0X2FjcmVnbWluLAotCU9wdF9hY3JlZ21heCwgT3B0X2FjZGlybWluLCBPcHRfYWNkaXJtYXgsCi0JLyogT3B0aW9ucyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzICovCi0JT3B0X3NvZnQsIE9wdF9oYXJkLCBPcHRfaW50ciwKLQlPcHRfbm9pbnRyLCBPcHRfcG9zaXgsIE9wdF9ub3Bvc2l4LCBPcHRfY3RvLCBPcHRfbm9jdG8sIE9wdF9hYywgCi0JT3B0X25vYWMsIE9wdF9sb2NrLCBPcHRfbm9sb2NrLCBPcHRfdjIsIE9wdF92MywgT3B0X3VkcCwgT3B0X3RjcCwKLQlPcHRfYWNsLCBPcHRfbm9hY2wsCi0JLyogRXJyb3IgdG9rZW4gKi8KLQlPcHRfZXJyCi19OwotCi1zdGF0aWMgbWF0Y2hfdGFibGVfdCBfX2luaXRkYXRhIHRva2VucyA9IHsKLQl7T3B0X3BvcnQsICJwb3J0PSV1In0sCi0Je09wdF9yc2l6ZSwgInJzaXplPSV1In0sCi0Je09wdF93c2l6ZSwgIndzaXplPSV1In0sCi0Je09wdF90aW1lbywgInRpbWVvPSV1In0sCi0Je09wdF9yZXRyYW5zLCAicmV0cmFucz0ldSJ9LAotCXtPcHRfYWNyZWdtaW4sICJhY3JlZ21pbj0ldSJ9LAotCXtPcHRfYWNyZWdtYXgsICJhY3JlZ21heD0ldSJ9LAotCXtPcHRfYWNkaXJtaW4sICJhY2Rpcm1pbj0ldSJ9LAotCXtPcHRfYWNkaXJtYXgsICJhY2Rpcm1heD0ldSJ9LAotCXtPcHRfc29mdCwgInNvZnQifSwKLQl7T3B0X2hhcmQsICJoYXJkIn0sCi0Je09wdF9pbnRyLCAiaW50ciJ9LAotCXtPcHRfbm9pbnRyLCAibm9pbnRyIn0sCi0Je09wdF9wb3NpeCwgInBvc2l4In0sCi0Je09wdF9ub3Bvc2l4LCAibm9wb3NpeCJ9LAotCXtPcHRfY3RvLCAiY3RvIn0sCi0Je09wdF9ub2N0bywgIm5vY3RvIn0sCi0Je09wdF9hYywgImFjIn0sCi0Je09wdF9ub2FjLCAibm9hYyJ9LAotCXtPcHRfbG9jaywgImxvY2sifSwKLQl7T3B0X25vbG9jaywgIm5vbG9jayJ9LAotCXtPcHRfdjIsICJuZnN2ZXJzPTIifSwKLQl7T3B0X3YyLCAidjIifSwKLQl7T3B0X3YzLCAibmZzdmVycz0zIn0sCi0Je09wdF92MywgInYzIn0sCi0Je09wdF91ZHAsICJwcm90bz11ZHAifSwKLQl7T3B0X3VkcCwgInVkcCJ9LAotCXtPcHRfdGNwLCAicHJvdG89dGNwIn0sCi0Je09wdF90Y3AsICJ0Y3AifSwKLQl7T3B0X2FjbCwgImFjbCJ9LAotCXtPcHRfbm9hY2wsICJub2FjbCJ9LAotCXtPcHRfZXJyLCBOVUxMfQotCQotfTsKLQotLyoKLSAqICBQYXJzZSBvcHRpb24gc3RyaW5nLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX3BhcnNlKGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZikKLXsKLQotCWNoYXIgKnA7Ci0Jc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwotCWludCBvcHRpb247Ci0KLQlpZiAoIW5hbWUpCi0JCXJldHVybiAxOwotCi0JLyogU2V0IHRoZSBORlMgcmVtb3RlIHBhdGggKi8KLQlwID0gc3Ryc2VwKCZuYW1lLCAiLCIpOwotCWlmIChwWzBdICE9ICdcMCcgJiYgc3RyY21wKHAsICJkZWZhdWx0IikgIT0gMCkKLQkJc3RybGNweShidWYsIHAsIE5GU19NQVhQQVRITEVOKTsKLQotCXdoaWxlICgocCA9IHN0cnNlcCAoJm5hbWUsICIsIikpICE9IE5VTEwpIHsKLQkJaW50IHRva2VuOyAKLQkJaWYgKCEqcCkKLQkJCWNvbnRpbnVlOwotCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7Ci0KLQkJLyogJXUgdG9rZW5zIG9ubHkuIEJld2FyZSBpZiB5b3UgYWRkIG5ldyB0b2tlbnMhICovCi0JCWlmICh0b2tlbiA8IE9wdF9zb2Z0ICYmIG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCi0JCQlyZXR1cm4gMDsKLQkJc3dpdGNoICh0b2tlbikgewotCQkJY2FzZSBPcHRfcG9ydDoKLQkJCQluZnNfcG9ydCA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X3JzaXplOgotCQkJCW5mc19kYXRhLnJzaXplID0gb3B0aW9uOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfd3NpemU6Ci0JCQkJbmZzX2RhdGEud3NpemUgPSBvcHRpb247Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF90aW1lbzoKLQkJCQluZnNfZGF0YS50aW1lbyA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X3JldHJhbnM6Ci0JCQkJbmZzX2RhdGEucmV0cmFucyA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjcmVnbWluOgotCQkJCW5mc19kYXRhLmFjcmVnbWluID0gb3B0aW9uOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfYWNyZWdtYXg6Ci0JCQkJbmZzX2RhdGEuYWNyZWdtYXggPSBvcHRpb247Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9hY2Rpcm1pbjoKLQkJCQluZnNfZGF0YS5hY2Rpcm1pbiA9IG9wdGlvbjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjZGlybWF4OgotCQkJCW5mc19kYXRhLmFjZGlybWF4ID0gb3B0aW9uOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfc29mdDoKLQkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfU09GVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2hhcmQ6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9TT0ZUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfaW50cjoKLQkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfSU5UUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X25vaW50cjoKLQkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX0lOVFI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9wb3NpeDoKLQkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfUE9TSVg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9ub3Bvc2l4OgotCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfUE9TSVg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9jdG86Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0NUTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X25vY3RvOgotCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9OT0NUTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjOgotCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQzsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X25vYWM6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQUM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9sb2NrOgotCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9OTE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF9ub2xvY2s6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PTkxNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfdjI6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9WRVIzOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfdjM6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1ZFUjM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF91ZHA6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9UQ1A7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE9wdF90Y3A6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgT3B0X2FjbDoKLQkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX05PQUNMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBPcHRfbm9hY2w6Ci0JCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQUNMOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSb290LU5GUzogdW5rbm93biAiCi0JCQkJCSJvcHRpb246ICVzXG4iLCBwKTsKLQkJCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAxOwotfQotCi0vKgotICogIFByZXBhcmUgdGhlIE5GUyBkYXRhIHN0cnVjdHVyZSBhbmQgcGFyc2UgYWxsIG9wdGlvbnMuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX25hbWUoY2hhciAqbmFtZSkKLXsKLQlzdGF0aWMgY2hhciBidWZbTkZTX01BWFBBVEhMRU5dIF9faW5pdGRhdGE7Ci0JY2hhciAqY3A7Ci0KLQkvKiBTZXQgc29tZSBkZWZhdWx0IHZhbHVlcyAqLwotCW1lbXNldCgmbmZzX2RhdGEsIDAsIHNpemVvZihuZnNfZGF0YSkpOwotCW5mc19wb3J0ICAgICAgICAgID0gLTE7Ci0JbmZzX2RhdGEudmVyc2lvbiAgPSBORlNfTU9VTlRfVkVSU0lPTjsKLQluZnNfZGF0YS5mbGFncyAgICA9IE5GU19NT1VOVF9OT05MTTsJLyogTm8gbG9ja2QgaW4gbmZzIHJvb3QgeWV0ICovCi0JbmZzX2RhdGEucnNpemUgICAgPSBORlNfREVGX0ZJTEVfSU9fU0laRTsKLQluZnNfZGF0YS53c2l6ZSAgICA9IE5GU19ERUZfRklMRV9JT19TSVpFOwotCW5mc19kYXRhLmFjcmVnbWluID0gMzsKLQluZnNfZGF0YS5hY3JlZ21heCA9IDYwOwotCW5mc19kYXRhLmFjZGlybWluID0gMzA7Ci0JbmZzX2RhdGEuYWNkaXJtYXggPSA2MDsKLQlzdHJjcHkoYnVmLCBORlNfUk9PVCk7Ci0KLQkvKiBQcm9jZXNzIG9wdGlvbnMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciAqLwotCXJvb3RfbmZzX3BhcnNlKHJvb3Rfc2VydmVyX3BhdGgsIGJ1Zik7Ci0KLQkvKiBPdmVycmlkZSB0aGVtIGJ5IG9wdGlvbnMgc2V0IG9uIGtlcm5lbCBjb21tYW5kLWxpbmUgKi8KLQlyb290X25mc19wYXJzZShuYW1lLCBidWYpOwotCi0JY3AgPSB1dHNuYW1lKCktPm5vZGVuYW1lOwotCWlmIChzdHJsZW4oYnVmKSArIHN0cmxlbihjcCkgPiBORlNfTUFYUEFUSExFTikgewotCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBQYXRobmFtZSBmb3IgcmVtb3RlIGRpcmVjdG9yeSB0b28gbG9uZy5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNwcmludGYobmZzX3BhdGgsIGJ1ZiwgY3ApOwotCi0JcmV0dXJuIDE7Ci19Ci0KLQotLyoKLSAqICBHZXQgTkZTIHNlcnZlciBhZGRyZXNzLgotICovCi1zdGF0aWMgaW50IF9faW5pdCByb290X25mc19hZGRyKHZvaWQpCi17Ci0JaWYgKChzZXJ2YWRkciA9IHJvb3Rfc2VydmVyX2FkZHIpID09IGh0b25sKElOQUREUl9OT05FKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBObyBORlMgc2VydmVyIGF2YWlsYWJsZSwgZ2l2aW5nIHVwLlxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzbnByaW50ZihuZnNfZGF0YS5ob3N0bmFtZSwgc2l6ZW9mKG5mc19kYXRhLmhvc3RuYW1lKSwKLQkJICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoc2VydmFkZHIpKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqICBUZWxsIHRoZSB1c2VyIHdoYXQncyBnb2luZyBvbi4KLSAqLwotI2lmZGVmIE5GU1JPT1RfREVCVUcKLXN0YXRpYyB2b2lkIF9faW5pdCByb290X25mc19wcmludCh2b2lkKQotewotCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6IE1vdW50aW5nICVzIG9uIHNlcnZlciAlcyBhcyByb290XG4iLAotCQluZnNfcGF0aCwgbmZzX2RhdGEuaG9zdG5hbWUpOwotCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6ICAgICByc2l6ZSA9ICVkLCB3c2l6ZSA9ICVkLCB0aW1lbyA9ICVkLCByZXRyYW5zID0gJWRcbiIsCi0JCW5mc19kYXRhLnJzaXplLCBuZnNfZGF0YS53c2l6ZSwgbmZzX2RhdGEudGltZW8sIG5mc19kYXRhLnJldHJhbnMpOwotCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6ICAgICBhY3JlZyAobWluLG1heCkgPSAoJWQsJWQpLCBhY2RpciAobWluLG1heCkgPSAoJWQsJWQpXG4iLAotCQluZnNfZGF0YS5hY3JlZ21pbiwgbmZzX2RhdGEuYWNyZWdtYXgsCi0JCW5mc19kYXRhLmFjZGlybWluLCBuZnNfZGF0YS5hY2Rpcm1heCk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIG5mc2QgcG9ydCA9ICVkLCBtb3VudGQgcG9ydCA9ICVkLCBmbGFncyA9ICUwOHhcbiIsCi0JCW5mc19wb3J0LCBtb3VudF9wb3J0LCBuZnNfZGF0YS5mbGFncyk7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IF9faW5pdCByb290X25mc19pbml0KHZvaWQpCi17Ci0jaWZkZWYgTkZTUk9PVF9ERUJVRwotCW5mc19kZWJ1ZyB8PSBORlNEQkdfUk9PVDsKLSNlbmRpZgotCi0JLyoKLQkgKiBEZWNvZGUgdGhlIHJvb3QgZGlyZWN0b3J5IHBhdGggbmFtZSBhbmQgTkZTIG9wdGlvbnMgZnJvbQotCSAqIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBUaGlzIGhhcyB0byBnbyBoZXJlIGluIG9yZGVyIHRvCi0JICogYmUgYWJsZSB0byB1c2UgdGhlIGNsaWVudCBJUCBhZGRyZXNzIGZvciB0aGUgcmVtb3RlIHJvb3QKLQkgKiBkaXJlY3RvcnkgKG5lY2Vzc2FyeSBmb3IgcHVyZSBSQVJQIGJvb3RpbmcpLgotCSAqLwotCWlmIChyb290X25mc19uYW1lKG5mc19yb290X25hbWUpIDwgMCB8fAotCSAgICByb290X25mc19hZGRyKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLSNpZmRlZiBORlNST09UX0RFQlVHCi0Jcm9vdF9uZnNfcHJpbnQoKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqICBQYXJzZSBORlMgc2VydmVyIGFuZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24gcGFzc2VkIG9uIHRoZSBrZXJuZWwKLSAqICBjb21tYW5kIGxpbmUuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG5mc19yb290X3NldHVwKGNoYXIgKmxpbmUpCi17Ci0JUk9PVF9ERVYgPSBSb290X05GUzsKLQlpZiAobGluZVswXSA9PSAnLycgfHwgbGluZVswXSA9PSAnLCcgfHwgKGxpbmVbMF0gPj0gJzAnICYmIGxpbmVbMF0gPD0gJzknKSkgewotCQlzdHJsY3B5KG5mc19yb290X25hbWUsIGxpbmUsIHNpemVvZihuZnNfcm9vdF9uYW1lKSk7Ci0JfSBlbHNlIHsKLQkJaW50IG4gPSBzdHJsZW4obGluZSkgKyBzaXplb2YoTkZTX1JPT1QpIC0gMTsKLQkJaWYgKG4gPj0gc2l6ZW9mKG5mc19yb290X25hbWUpKQotCQkJbGluZVtzaXplb2YobmZzX3Jvb3RfbmFtZSkgLSBzaXplb2YoTkZTX1JPT1QpIC0gMl0gPSAnXDAnOwotCQlzcHJpbnRmKG5mc19yb290X25hbWUsIE5GU19ST09ULCBsaW5lKTsKLQl9Ci0Jcm9vdF9zZXJ2ZXJfYWRkciA9IHJvb3RfbmZzX3BhcnNlX2FkZHIobmZzX3Jvb3RfbmFtZSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoIm5mc3Jvb3Q9IiwgbmZzX3Jvb3Rfc2V0dXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQkgICAgICAgUm91dGluZXMgdG8gYWN0dWFsbHkgbW91bnQgdGhlIHJvb3QgZGlyZWN0b3J5Ci0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiAgQ29uc3RydWN0IHNvY2thZGRyX2luIGZyb20gYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBfX2JlMzIgYWRkciwgX19iZTE2IHBvcnQpCi17Ci0Jc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7Ci0Jc2luLT5zaW5fcG9ydCA9IHBvcnQ7Ci19Ci0KLS8qCi0gKiAgUXVlcnkgc2VydmVyIHBvcnRtYXBwZXIgZm9yIHRoZSBwb3J0IG9mIGEgZGFlbW9uIHByb2dyYW0uCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldHBvcnQoaW50IHByb2dyYW0sIGludCB2ZXJzaW9uLCBpbnQgcHJvdG8pCi17Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQotCXByaW50ayhLRVJOX05PVElDRSAiTG9va2luZyB1cCBwb3J0IG9mIFJQQyAlZC8lZCBvbiAldS4ldS4ldS4ldVxuIiwKLQkJcHJvZ3JhbSwgdmVyc2lvbiwgTklQUVVBRChzZXJ2YWRkcikpOwotCXNldF9zb2NrYWRkcigmc2luLCBzZXJ2YWRkciwgMCk7Ci0JcmV0dXJuIHJwY19nZXRwb3J0X2V4dGVybmFsKCZzaW4sIHByb2dyYW0sIHZlcnNpb24sIHByb3RvKTsKLX0KLQotCi0vKgotICogIFVzZSBwb3J0bWFwcGVyIHRvIGZpbmQgbW91bnRkIGFuZCBuZnNkIHBvcnQgbnVtYmVycyBpZiBub3Qgb3ZlcnJpZGVuCi0gKiAgYnkgdGhlIHVzZXIuIFVzZSBkZWZhdWx0cyBpZiBwb3J0bWFwcGVyIGlzIG5vdCBhdmFpbGFibGUuCi0gKiAgWFhYOiBJcyB0aGVyZSBhbnkgbmZzIHNlcnZlciB3aXRoIG5vIHBvcnRtYXBwZXI/Ci0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX3BvcnRzKHZvaWQpCi17Ci0JaW50IHBvcnQ7Ci0JaW50IG5mc2RfdmVyLCBtb3VudGRfdmVyOwotCWludCBuZnNkX3BvcnQsIG1vdW50ZF9wb3J0OwotCWludCBwcm90bzsKLQotCWlmIChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7Ci0JCW5mc2RfdmVyID0gTkZTM19WRVJTSU9OOwotCQltb3VudGRfdmVyID0gTkZTX01OVDNfVkVSU0lPTjsKLQkJbmZzZF9wb3J0ID0gTkZTX1BPUlQ7Ci0JCW1vdW50ZF9wb3J0ID0gTkZTX01OVF9QT1JUOwotCX0gZWxzZSB7Ci0JCW5mc2RfdmVyID0gTkZTMl9WRVJTSU9OOwotCQltb3VudGRfdmVyID0gTkZTX01OVF9WRVJTSU9OOwotCQluZnNkX3BvcnQgPSBORlNfUE9SVDsKLQkJbW91bnRkX3BvcnQgPSBORlNfTU5UX1BPUlQ7Ci0JfQotCi0JcHJvdG8gPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7Ci0KLQlpZiAobmZzX3BvcnQgPCAwKSB7Ci0JCWlmICgocG9ydCA9IHJvb3RfbmZzX2dldHBvcnQoTkZTX1BST0dSQU0sIG5mc2RfdmVyLCBwcm90bykpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogVW5hYmxlIHRvIGdldCBuZnNkIHBvcnQgIgotCQkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKLQkJCXBvcnQgPSBuZnNkX3BvcnQ7Ci0JCX0KLQkJbmZzX3BvcnQgPSBwb3J0OwotCQlkcHJpbnRrKCJSb290LU5GUzogUG9ydG1hcHBlciBvbiBzZXJ2ZXIgcmV0dXJuZWQgJWQgIgotCQkJImFzIG5mc2QgcG9ydFxuIiwgcG9ydCk7Ci0JfQotCi0JaWYgKChwb3J0ID0gcm9vdF9uZnNfZ2V0cG9ydChORlNfTU5UX1BST0dSQU0sIG1vdW50ZF92ZXIsIHByb3RvKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFVuYWJsZSB0byBnZXQgbW91bnRkIHBvcnQgIgotCQkJCSJudW1iZXIgZnJvbSBzZXJ2ZXIsIHVzaW5nIGRlZmF1bHRcbiIpOwotCQlwb3J0ID0gbW91bnRkX3BvcnQ7Ci0JfQotCW1vdW50X3BvcnQgPSBwb3J0OwotCWRwcmludGsoIlJvb3QtTkZTOiBtb3VudGQgcG9ydCBpcyAlZFxuIiwgcG9ydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogIEdldCBhIGZpbGUgaGFuZGxlIGZyb20gdGhlIHNlcnZlciBmb3IgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyB0byBiZQotICogIG1vdW50ZWQuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldF9oYW5kbGUodm9pZCkKLXsKLQlzdHJ1Y3QgbmZzX2ZoIGZoOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0JaW50IHN0YXR1czsKLQlpbnQgcHJvdG9jb2wgPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/Ci0JCQkJCUlQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7Ci0JaW50IHZlcnNpb24gPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgPwotCQkJCQlORlNfTU5UM19WRVJTSU9OIDogTkZTX01OVF9WRVJTSU9OOwotCi0Jc2V0X3NvY2thZGRyKCZzaW4sIHNlcnZhZGRyLCBodG9ucyhtb3VudF9wb3J0KSk7Ci0Jc3RhdHVzID0gbmZzcm9vdF9tb3VudCgmc2luLCBuZnNfcGF0aCwgJmZoLCB2ZXJzaW9uLCBwcm90b2NvbCk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFNlcnZlciByZXR1cm5lZCBlcnJvciAlZCAiCi0JCQkJIndoaWxlIG1vdW50aW5nICVzXG4iLCBzdGF0dXMsIG5mc19wYXRoKTsKLQllbHNlIHsKLQkJbmZzX2RhdGEucm9vdC5zaXplID0gZmguc2l6ZTsKLQkJbWVtY3B5KG5mc19kYXRhLnJvb3QuZGF0YSwgZmguZGF0YSwgZmguc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoKLSAqICBHZXQgdGhlIE5GUyBwb3J0IG51bWJlcnMgYW5kIGZpbGUgaGFuZGxlLCBhbmQgcmV0dXJuIHRoZSBwcmVwYXJlZCAnZGF0YScKLSAqICBhcmd1bWVudCBmb3IgbW91bnQoKSBpZiBldmVyeXRoaW5nIHdlbnQgT0suIFJldHVybiBOVUxMIG90aGVyd2lzZS4KLSAqLwotdm9pZCAqIF9faW5pdCBuZnNfcm9vdF9kYXRhKHZvaWQpCi17Ci0JaWYgKHJvb3RfbmZzX2luaXQoKSA8IDAKLQkgfHwgcm9vdF9uZnNfcG9ydHMoKSA8IDAKLQkgfHwgcm9vdF9uZnNfZ2V0X2hhbmRsZSgpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0X3NvY2thZGRyKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJm5mc19kYXRhLmFkZHIsIHNlcnZhZGRyLCBodG9ucyhuZnNfcG9ydCkpOwotCXJldHVybiAodm9pZCopJm5mc19kYXRhOwotfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb3VudC5oIGIvaW5jbHVkZS9saW51eC9tb3VudC5oCmluZGV4IGRhYjY5YWYuLmU2YTY4OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW91bnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKQEAgLTEwMSw3ICsxMDEsNiBAQAogZXh0ZXJuIHZvaWQgc2hyaW5rX3N1Ym1vdW50cyhzdHJ1Y3QgdmZzbW91bnQgKm1vdW50cG9pbnQsIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cyk7CiAKIGV4dGVybiBzcGlubG9ja190IHZmc21vdW50X2xvY2s7Ci1leHRlcm4gZGV2X3QgbmFtZV90b19kZXZfdChjaGFyICpuYW1lKTsKIAogI2VuZGlmCiAjZW5kaWYgLyogX0xJTlVYX01PVU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ja2V0LmggYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCmluZGV4IDI4MTU3YTMuLjQ4ZTY0ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtMTYsNyArMTYsNyBAQAogCQkJCS8qIF9TU19NQVhTSVpFIHZhbHVlIG1pbnVzIHNpemUgb2Ygc3NfZmFtaWx5ICovCiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKF9LX1NTX0FMSUdOU0laRSkpKTsJLyogZm9yY2UgZGVzaXJlZCBhbGlnbm1lbnQgKi8KIAotI2lmZGVmIF9fS0VSTkVMX18KKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19LTElCQ19fKSAvKiBUaGlzIHN1Y2tzLi4uICovCiAKICNpbmNsdWRlIDxhc20vc29ja2V0Lmg+CQkJLyogYXJjaC1kZXBlbmRlbnQgZGVmaW5lcwkqLwogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4JCS8qIHRoZSBTSU9DeHh4IEkvTyBjb250cm9scwkqLwpkaWZmIC0tZ2l0IGEvaW5pdC9NYWtlZmlsZSBiL2luaXQvTWFrZWZpbGUKaW5kZXggMDE1NGFlYS4uYWNmZGIyYyAxMDA2NDQKLS0tIGEvaW5pdC9NYWtlZmlsZQorKysgYi9pbml0L01ha2VmaWxlCkBAIC0yLDE5ICsyLDkgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCiAjCiAKLW9iai15ICAgICAgICAgICAgICAgICAgICAgICAgICA6PSBtYWluLm8gdmVyc2lvbi5vIG1vdW50cy5vCi1pZm5lcSAoJChDT05GSUdfQkxLX0RFVl9JTklUUkQpLHkpCi1vYmoteSAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gbm9pbml0cmFtZnMubwotZWxzZQotb2JqLSQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSAgICs9IGluaXRyYW1mcy5vCi1lbmRpZgorb2JqLXkJCQkJOj0gbWFpbi5vIHZlcnNpb24ubyBpbml0cmFtZnMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZKSArPSBjYWxpYnJhdGUubwogCi1tb3VudHMteQkJCTo9IGRvX21vdW50cy5vCi1tb3VudHMtJChDT05GSUdfQkxLX0RFVl9SQU0pCSs9IGRvX21vdW50c19yZC5vCi1tb3VudHMtJChDT05GSUdfQkxLX0RFVl9JTklUUkQpCSs9IGRvX21vdW50c19pbml0cmQubwotbW91bnRzLSQoQ09ORklHX0JMS19ERVZfTUQpCSs9IGRvX21vdW50c19tZC5vCi0KICMgZmlsZXMgdG8gYmUgcmVtb3ZlZCB1cG9uIG1ha2UgY2xlYW4KIGNsZWFuLWZpbGVzIDo9IC4uL2luY2x1ZGUvbGludXgvY29tcGlsZS5oCiAKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzLmMgYi9pbml0L2RvX21vdW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFlYzA4Li4wMDAwMDAwCi0tLSBhL2luaXQvZG9fbW91bnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mZC5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzX2ZzX3NiLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+Ci0KLSNpbmNsdWRlICJkb19tb3VudHMuaCIKLQotZXh0ZXJuIGludCBnZXRfZmlsZXN5c3RlbV9saXN0KGNoYXIgKiBidWYpOwotCi1pbnQgX19pbml0ZGF0YSByZF9kb2xvYWQ7CS8qIDEgPSBsb2FkIFJBTSBkaXNrLCAwID0gZG9uJ3QgbG9hZCAqLwotCi1pbnQgcm9vdF9tb3VudGZsYWdzID0gTVNfUkRPTkxZIHwgTVNfU0lMRU5UOwotY2hhciAqIF9faW5pdGRhdGEgcm9vdF9kZXZpY2VfbmFtZTsKLXN0YXRpYyBjaGFyIF9faW5pdGRhdGEgc2F2ZWRfcm9vdF9uYW1lWzY0XTsKLQotZGV2X3QgUk9PVF9ERVY7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxvYWRfcmFtZGlzayhjaGFyICpzdHIpCi17Ci0JcmRfZG9sb2FkID0gc2ltcGxlX3N0cnRvbChzdHIsTlVMTCwwKSAmIDM7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJsb2FkX3JhbWRpc2s9IiwgbG9hZF9yYW1kaXNrKTsKLQotc3RhdGljIGludCBfX2luaXQgcmVhZG9ubHkoY2hhciAqc3RyKQotewotCWlmICgqc3RyKQotCQlyZXR1cm4gMDsKLQlyb290X21vdW50ZmxhZ3MgfD0gTVNfUkRPTkxZOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCByZWFkd3JpdGUoY2hhciAqc3RyKQotewotCWlmICgqc3RyKQotCQlyZXR1cm4gMDsKLQlyb290X21vdW50ZmxhZ3MgJj0gfk1TX1JET05MWTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgicm8iLCByZWFkb25seSk7Ci1fX3NldHVwKCJydyIsIHJlYWR3cml0ZSk7Ci0KLXN0YXRpYyBkZXZfdCB0cnlfbmFtZShjaGFyICpuYW1lLCBpbnQgcGFydCkKLXsKLQljaGFyIHBhdGhbNjRdOwotCWNoYXIgYnVmWzMyXTsKLQlpbnQgcmFuZ2U7Ci0JZGV2X3QgcmVzOwotCWNoYXIgKnM7Ci0JaW50IGxlbjsKLQlpbnQgZmQ7Ci0JdW5zaWduZWQgaW50IG1haiwgbWluOwotCi0JLyogcmVhZCBkZXZpY2UgbnVtYmVyIGZyb20gLi4uL2RldiAqLwotCi0Jc3ByaW50ZihwYXRoLCAiL3N5cy9ibG9jay8lcy9kZXYiLCBuYW1lKTsKLQlmZCA9IHN5c19vcGVuKHBhdGgsIDAsIDApOwotCWlmIChmZCA8IDApCi0JCWdvdG8gZmFpbDsKLQlsZW4gPSBzeXNfcmVhZChmZCwgYnVmLCAzMik7Ci0Jc3lzX2Nsb3NlKGZkKTsKLQlpZiAobGVuIDw9IDAgfHwgbGVuID09IDMyIHx8IGJ1ZltsZW4gLSAxXSAhPSAnXG4nKQotCQlnb3RvIGZhaWw7Ci0JYnVmW2xlbiAtIDFdID0gJ1wwJzsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiV1OiV1IiwgJm1haiwgJm1pbikgPT0gMikgewotCQkvKgotCQkgKiBUcnkgdGhlICV1OiV1IGZvcm1hdCAtLSBzZWUgcHJpbnRfZGV2X3QoKQotCQkgKi8KLQkJcmVzID0gTUtERVYobWFqLCBtaW4pOwotCQlpZiAobWFqICE9IE1BSk9SKHJlcykgfHwgbWluICE9IE1JTk9SKHJlcykpCi0JCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogTm9wZS4gIFRyeSBvbGQtc3R5bGUgIjAzMjEiCi0JCSAqLwotCQlyZXMgPSBuZXdfZGVjb2RlX2RldihzaW1wbGVfc3RydG91bChidWYsICZzLCAxNikpOwotCQlpZiAoKnMpCi0JCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogaWYgaXQncyB0aGVyZSBhbmQgd2UgYXJlIG5vdCBsb29raW5nIGZvciBhIHBhcnRpdGlvbiAtIHRoYXQncyBpdCAqLwotCWlmICghcGFydCkKLQkJcmV0dXJuIHJlczsKLQotCS8qIG90aGVyd2lzZSByZWFkIHJhbmdlIGZyb20gLi4uL3JhbmdlICovCi0Jc3ByaW50ZihwYXRoLCAiL3N5cy9ibG9jay8lcy9yYW5nZSIsIG5hbWUpOwotCWZkID0gc3lzX29wZW4ocGF0aCwgMCwgMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZ290byBmYWlsOwotCWxlbiA9IHN5c19yZWFkKGZkLCBidWYsIDMyKTsKLQlzeXNfY2xvc2UoZmQpOwotCWlmIChsZW4gPD0gMCB8fCBsZW4gPT0gMzIgfHwgYnVmW2xlbiAtIDFdICE9ICdcbicpCi0JCWdvdG8gZmFpbDsKLQlidWZbbGVuIC0gMV0gPSAnXDAnOwotCXJhbmdlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmcywgMTApOwotCWlmICgqcykKLQkJZ290byBmYWlsOwotCi0JLyogaWYgcGFydGl0aW9uIGlzIHdpdGhpbiByYW5nZSAtIHdlIGdvdCBpdCAqLwotCWlmIChwYXJ0IDwgcmFuZ2UpCi0JCXJldHVybiByZXMgKyBwYXJ0OwotZmFpbDoKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCUNvbnZlcnQgYSBuYW1lIGludG8gZGV2aWNlIG51bWJlci4gIFdlIGFjY2VwdCB0aGUgZm9sbG93aW5nIHZhcmlhbnRzOgotICoKLSAqCTEpIGRldmljZSBudW1iZXIgaW4gaGV4YWRlY2ltYWwJcmVwcmVzZW50cyBpdHNlbGYKLSAqCTIpIC9kZXYvbmZzIHJlcHJlc2VudHMgUm9vdF9ORlMgKDB4ZmYpCi0gKgkzKSAvZGV2LzxkaXNrX25hbWU+IHJlcHJlc2VudHMgdGhlIGRldmljZSBudW1iZXIgb2YgZGlzawotICoJNCkgL2Rldi88ZGlza19uYW1lPjxkZWNpbWFsPiByZXByZXNlbnRzIHRoZSBkZXZpY2UgbnVtYmVyCi0gKiAgICAgICAgIG9mIHBhcnRpdGlvbiAtIGRldmljZSBudW1iZXIgb2YgZGlzayBwbHVzIHRoZSBwYXJ0aXRpb24gbnVtYmVyCi0gKgk1KSAvZGV2LzxkaXNrX25hbWU+cDxkZWNpbWFsPiAtIHNhbWUgYXMgdGhlIGFib3ZlLCB0aGF0IGZvcm0gaXMKLSAqCSAgIHVzZWQgd2hlbiBkaXNrIG5hbWUgb2YgcGFydGl0aW9uZWQgZGlzayBlbmRzIG9uIGEgZGlnaXQuCi0gKgotICoJSWYgbmFtZSBkb2Vzbid0IGhhdmUgZmFsbCBpbnRvIHRoZSBjYXRlZ29yaWVzIGFib3ZlLCB3ZSByZXR1cm4gMC4KLSAqCVN5c2ZzIGlzIHVzZWQgdG8gY2hlY2sgaWYgc29tZXRoaW5nIGlzIGEgZGlzayBuYW1lIC0gaXQgaGFzCi0gKglhbGwga25vd24gZGlza3MgdW5kZXIgYnVzL2Jsb2NrL2RldmljZXMuICBJZiB0aGUgZGlzayBuYW1lCi0gKgljb250YWlucyBzbGFzaGVzLCBuYW1lIG9mIHN5c2ZzIG5vZGUgaGFzIHRoZW0gcmVwbGFjZWQgd2l0aAotICoJYmFuZ3MuICB0cnlfbmFtZSgpIGRvZXMgdGhlIGFjdHVhbCBjaGVja3MsIGFzc3VtaW5nIHRoYXQgc3lzZnMKLSAqCWlzIG1vdW50ZWQgb24gcm9vdGZzIC9zeXMuCi0gKi8KLQotZGV2X3QgbmFtZV90b19kZXZfdChjaGFyICpuYW1lKQotewotCWNoYXIgc1szMl07Ci0JY2hhciAqcDsKLQlkZXZfdCByZXMgPSAwOwotCWludCBwYXJ0OwotCi0jaWZkZWYgQ09ORklHX1NZU0ZTCi0JaW50IG1rZGlyX2VyciA9IHN5c19ta2RpcigiL3N5cyIsIDA3MDApOwotCWlmIChzeXNfbW91bnQoInN5c2ZzIiwgIi9zeXMiLCAic3lzZnMiLCAwLCBOVUxMKSA8IDApCi0JCWdvdG8gb3V0OwotI2VuZGlmCi0KLQlpZiAoc3RybmNtcChuYW1lLCAiL2Rldi8iLCA1KSAhPSAwKSB7Ci0JCXVuc2lnbmVkIG1haiwgbWluOwotCi0JCWlmIChzc2NhbmYobmFtZSwgIiV1OiV1IiwgJm1haiwgJm1pbikgPT0gMikgewotCQkJcmVzID0gTUtERVYobWFqLCBtaW4pOwotCQkJaWYgKG1haiAhPSBNQUpPUihyZXMpIHx8IG1pbiAhPSBNSU5PUihyZXMpKQotCQkJCWdvdG8gZmFpbDsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IG5ld19kZWNvZGVfZGV2KHNpbXBsZV9zdHJ0b3VsKG5hbWUsICZwLCAxNikpOwotCQkJaWYgKCpwKQotCQkJCWdvdG8gZmFpbDsKLQkJfQotCQlnb3RvIGRvbmU7Ci0JfQotCW5hbWUgKz0gNTsKLQlyZXMgPSBSb290X05GUzsKLQlpZiAoc3RyY21wKG5hbWUsICJuZnMiKSA9PSAwKQotCQlnb3RvIGRvbmU7Ci0JcmVzID0gUm9vdF9SQU0wOwotCWlmIChzdHJjbXAobmFtZSwgInJhbSIpID09IDApCi0JCWdvdG8gZG9uZTsKLQotCWlmIChzdHJsZW4obmFtZSkgPiAzMSkKLQkJZ290byBmYWlsOwotCXN0cmNweShzLCBuYW1lKTsKLQlmb3IgKHAgPSBzOyAqcDsgcCsrKQotCQlpZiAoKnAgPT0gJy8nKQotCQkJKnAgPSAnISc7Ci0JcmVzID0gdHJ5X25hbWUocywgMCk7Ci0JaWYgKHJlcykKLQkJZ290byBkb25lOwotCi0Jd2hpbGUgKHAgPiBzICYmIGlzZGlnaXQocFstMV0pKQotCQlwLS07Ci0JaWYgKHAgPT0gcyB8fCAhKnAgfHwgKnAgPT0gJzAnKQotCQlnb3RvIGZhaWw7Ci0JcGFydCA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDEwKTsKLQkqcCA9ICdcMCc7Ci0JcmVzID0gdHJ5X25hbWUocywgcGFydCk7Ci0JaWYgKHJlcykKLQkJZ290byBkb25lOwotCi0JaWYgKHAgPCBzICsgMiB8fCAhaXNkaWdpdChwWy0yXSkgfHwgcFstMV0gIT0gJ3AnKQotCQlnb3RvIGZhaWw7Ci0JcFstMV0gPSAnXDAnOwotCXJlcyA9IHRyeV9uYW1lKHMsIHBhcnQpOwotZG9uZToKLSNpZmRlZiBDT05GSUdfU1lTRlMKLQlzeXNfdW1vdW50KCIvc3lzIiwgMCk7Ci1vdXQ6Ci0JaWYgKCFta2Rpcl9lcnIpCi0JCXN5c19ybWRpcigiL3N5cyIpOwotI2VuZGlmCi0JcmV0dXJuIHJlczsKLWZhaWw6Ci0JcmVzID0gMDsKLQlnb3RvIGRvbmU7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJvb3RfZGV2X3NldHVwKGNoYXIgKmxpbmUpCi17Ci0Jc3RybGNweShzYXZlZF9yb290X25hbWUsIGxpbmUsIHNpemVvZihzYXZlZF9yb290X25hbWUpKTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgicm9vdD0iLCByb290X2Rldl9zZXR1cCk7Ci0KLXN0YXRpYyBjaGFyICogX19pbml0ZGF0YSByb290X21vdW50X2RhdGE7Ci1zdGF0aWMgaW50IF9faW5pdCByb290X2RhdGFfc2V0dXAoY2hhciAqc3RyKQotewotCXJvb3RfbW91bnRfZGF0YSA9IHN0cjsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKiBfX2luaXRkYXRhIHJvb3RfZnNfbmFtZXM7Ci1zdGF0aWMgaW50IF9faW5pdCBmc19uYW1lc19zZXR1cChjaGFyICpzdHIpCi17Ci0Jcm9vdF9mc19uYW1lcyA9IHN0cjsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIHJvb3RfZGVsYXk7Ci1zdGF0aWMgaW50IF9faW5pdCByb290X2RlbGF5X3NldHVwKGNoYXIgKnN0cikKLXsKLQlyb290X2RlbGF5ID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgicm9vdGZsYWdzPSIsIHJvb3RfZGF0YV9zZXR1cCk7Ci1fX3NldHVwKCJyb290ZnN0eXBlPSIsIGZzX25hbWVzX3NldHVwKTsKLV9fc2V0dXAoInJvb3RkZWxheT0iLCByb290X2RlbGF5X3NldHVwKTsKLQotc3RhdGljIHZvaWQgX19pbml0IGdldF9mc19uYW1lcyhjaGFyICpwYWdlKQotewotCWNoYXIgKnMgPSBwYWdlOwotCi0JaWYgKHJvb3RfZnNfbmFtZXMpIHsKLQkJc3RyY3B5KHBhZ2UsIHJvb3RfZnNfbmFtZXMpOwotCQl3aGlsZSAoKnMrKykgewotCQkJaWYgKHNbLTFdID09ICcsJykKLQkJCQlzWy0xXSA9ICdcMCc7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnQgbGVuID0gZ2V0X2ZpbGVzeXN0ZW1fbGlzdChwYWdlKTsKLQkJY2hhciAqcCwgKm5leHQ7Ci0KLQkJcGFnZVtsZW5dID0gJ1wwJzsKLQkJZm9yIChwID0gcGFnZS0xOyBwOyBwID0gbmV4dCkgewotCQkJbmV4dCA9IHN0cmNocigrK3AsICdcbicpOwotCQkJaWYgKCpwKysgIT0gJ1x0JykKLQkJCQljb250aW51ZTsKLQkJCXdoaWxlICgoKnMrKyA9ICpwKyspICE9ICdcbicpCi0JCQkJOwotCQkJc1stMV0gPSAnXDAnOwotCQl9Ci0JfQotCSpzID0gJ1wwJzsKLX0KLQotc3RhdGljIGludCBfX2luaXQgZG9fbW91bnRfcm9vdChjaGFyICpuYW1lLCBjaGFyICpmcywgaW50IGZsYWdzLCB2b2lkICpkYXRhKQotewotCWludCBlcnIgPSBzeXNfbW91bnQobmFtZSwgIi9yb290IiwgZnMsIGZsYWdzLCBkYXRhKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0Jc3lzX2NoZGlyKCIvcm9vdCIpOwotCVJPT1RfREVWID0gY3VycmVudC0+ZnMtPnB3ZG1udC0+bW50X3NiLT5zX2RldjsKLQlwcmludGsoIlZGUzogTW91bnRlZCByb290ICglcyBmaWxlc3lzdGVtKSVzLlxuIiwKLQkgICAgICAgY3VycmVudC0+ZnMtPnB3ZG1udC0+bW50X3NiLT5zX3R5cGUtPm5hbWUsCi0JICAgICAgIGN1cnJlbnQtPmZzLT5wd2RtbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX1JET05MWSA/IAotCSAgICAgICAiIHJlYWRvbmx5IiA6ICIiKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBfX2luaXQgbW91bnRfYmxvY2tfcm9vdChjaGFyICpuYW1lLCBpbnQgZmxhZ3MpCi17Ci0JY2hhciAqZnNfbmFtZXMgPSBfX2dldG5hbWUoKTsKLQljaGFyICpwOwotI2lmZGVmIENPTkZJR19CTE9DSwotCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLSNlbHNlCi0JY29uc3QgY2hhciAqYiA9IG5hbWU7Ci0jZW5kaWYKLQotCWdldF9mc19uYW1lcyhmc19uYW1lcyk7Ci1yZXRyeToKLQlmb3IgKHAgPSBmc19uYW1lczsgKnA7IHAgKz0gc3RybGVuKHApKzEpIHsKLQkJaW50IGVyciA9IGRvX21vdW50X3Jvb3QobmFtZSwgcCwgZmxhZ3MsIHJvb3RfbW91bnRfZGF0YSk7Ci0JCXN3aXRjaCAoZXJyKSB7Ci0JCQljYXNlIDA6Ci0JCQkJZ290byBvdXQ7Ci0JCQljYXNlIC1FQUNDRVM6Ci0JCQkJZmxhZ3MgfD0gTVNfUkRPTkxZOwotCQkJCWdvdG8gcmV0cnk7Ci0JCQljYXNlIC1FSU5WQUw6Ci0JCQkJY29udGludWU7Ci0JCX0KLQkgICAgICAgIC8qCi0JCSAqIEFsbG93IHRoZSB1c2VyIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZmFpbGVkIHN5c19vcGVuCi0JCSAqIGFuZCBiYWQgc3VwZXJibG9jayBvbiByb290IGRldmljZS4KLQkJICovCi0jaWZkZWYgQ09ORklHX0JMT0NLCi0JCV9fYmRldm5hbWUoUk9PVF9ERVYsIGIpOwotI2VuZGlmCi0JCXByaW50aygiVkZTOiBDYW5ub3Qgb3BlbiByb290IGRldmljZSBcIiVzXCIgb3IgJXNcbiIsCi0JCQkJcm9vdF9kZXZpY2VfbmFtZSwgYik7Ci0JCXByaW50aygiUGxlYXNlIGFwcGVuZCBhIGNvcnJlY3QgXCJyb290PVwiIGJvb3Qgb3B0aW9uXG4iKTsKLQotCQlwYW5pYygiVkZTOiBVbmFibGUgdG8gbW91bnQgcm9vdCBmcyBvbiAlcyIsIGIpOwotCX0KLQotCXByaW50aygiTm8gZmlsZXN5c3RlbSBjb3VsZCBtb3VudCByb290LCB0cmllZDogIik7Ci0JZm9yIChwID0gZnNfbmFtZXM7ICpwOyBwICs9IHN0cmxlbihwKSsxKQotCQlwcmludGsoIiAlcyIsIHApOwotCXByaW50aygiXG4iKTsKLSNpZmRlZiBDT05GSUdfQkxPQ0sKLQlfX2JkZXZuYW1lKFJPT1RfREVWLCBiKTsKLSNlbmRpZgotCXBhbmljKCJWRlM6IFVuYWJsZSB0byBtb3VudCByb290IGZzIG9uICVzIiwgYik7Ci1vdXQ6Ci0JcHV0bmFtZShmc19uYW1lcyk7Ci19Ci0gCi0jaWZkZWYgQ09ORklHX1JPT1RfTkZTCi1zdGF0aWMgaW50IF9faW5pdCBtb3VudF9uZnNfcm9vdCh2b2lkKQotewotCXZvaWQgKmRhdGEgPSBuZnNfcm9vdF9kYXRhKCk7Ci0KLQljcmVhdGVfZGV2KCIvZGV2L3Jvb3QiLCBST09UX0RFVik7Ci0JaWYgKGRhdGEgJiYKLQkgICAgZG9fbW91bnRfcm9vdCgiL2Rldi9yb290IiwgIm5mcyIsIHJvb3RfbW91bnRmbGFncywgZGF0YSkgPT0gMCkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfUkFNKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZEKQotdm9pZCBfX2luaXQgY2hhbmdlX2Zsb3BweShjaGFyICpmbXQsIC4uLikKLXsKLQlzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOwotCWNoYXIgYnVmWzgwXTsKLQljaGFyIGM7Ci0JaW50IGZkOwotCXZhX2xpc3QgYXJnczsKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JZmQgPSBzeXNfb3BlbigiL2Rldi9yb290IiwgT19SRFdSIHwgT19OREVMQVksIDApOwotCWlmIChmZCA+PSAwKSB7Ci0JCXN5c19pb2N0bChmZCwgRkRFSkVDVCwgMCk7Ci0JCXN5c19jbG9zZShmZCk7Ci0JfQotCXByaW50ayhLRVJOX05PVElDRSAiVkZTOiBJbnNlcnQgJXMgYW5kIHByZXNzIEVOVEVSXG4iLCBidWYpOwotCWZkID0gc3lzX29wZW4oIi9kZXYvY29uc29sZSIsIE9fUkRXUiwgMCk7Ci0JaWYgKGZkID49IDApIHsKLQkJc3lzX2lvY3RsKGZkLCBUQ0dFVFMsIChsb25nKSZ0ZXJtaW9zKTsKLQkJdGVybWlvcy5jX2xmbGFnICY9IH5JQ0FOT047Ci0JCXN5c19pb2N0bChmZCwgVENTRVRTRiwgKGxvbmcpJnRlcm1pb3MpOwotCQlzeXNfcmVhZChmZCwgJmMsIDEpOwotCQl0ZXJtaW9zLmNfbGZsYWcgfD0gSUNBTk9OOwotCQlzeXNfaW9jdGwoZmQsIFRDU0VUU0YsIChsb25nKSZ0ZXJtaW9zKTsKLQkJc3lzX2Nsb3NlKGZkKTsKLQl9Ci19Ci0jZW5kaWYKLQotdm9pZCBfX2luaXQgbW91bnRfcm9vdCh2b2lkKQotewotI2lmZGVmIENPTkZJR19ST09UX05GUwotCWlmIChNQUpPUihST09UX0RFVikgPT0gVU5OQU1FRF9NQUpPUikgewotCQlpZiAobW91bnRfbmZzX3Jvb3QoKSkKLQkJCXJldHVybjsKLQotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogVW5hYmxlIHRvIG1vdW50IHJvb3QgZnMgdmlhIE5GUywgdHJ5aW5nIGZsb3BweS5cbiIpOwotCQlST09UX0RFViA9IFJvb3RfRkQwOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19CTEtfREVWX0ZECi0JaWYgKE1BSk9SKFJPT1RfREVWKSA9PSBGTE9QUFlfTUFKT1IpIHsKLQkJLyogcmRfZG9sb2FkIGlzIDIgZm9yIGEgZHVhbCBpbml0cmQvcmFtbG9hZCBzZXR1cCAqLwotCQlpZiAocmRfZG9sb2FkPT0yKSB7Ci0JCQlpZiAocmRfbG9hZF9kaXNrKDEpKSB7Ci0JCQkJUk9PVF9ERVYgPSBSb290X1JBTTE7Ci0JCQkJcm9vdF9kZXZpY2VfbmFtZSA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJY2hhbmdlX2Zsb3BweSgicm9vdCBmbG9wcHkiKTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkxPQ0sKLQljcmVhdGVfZGV2KCIvZGV2L3Jvb3QiLCBST09UX0RFVik7Ci0JbW91bnRfYmxvY2tfcm9vdCgiL2Rldi9yb290Iiwgcm9vdF9tb3VudGZsYWdzKTsKLSNlbmRpZgotfQotCi0vKgotICogUHJlcGFyZSB0aGUgbmFtZXNwYWNlIC0gZGVjaWRlIHdoYXQvd2hlcmUgdG8gbW91bnQsIGxvYWQgcmFtZGlza3MsIGV0Yy4KLSAqLwotdm9pZCBfX2luaXQgcHJlcGFyZV9uYW1lc3BhY2Uodm9pZCkKLXsKLQlpbnQgaXNfZmxvcHB5OwotCi0JaWYgKHJvb3RfZGVsYXkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiV2FpdGluZyAlZHNlYyBiZWZvcmUgbW91bnRpbmcgcm9vdCBkZXZpY2UuLi5cbiIsCi0JCSAgICAgICByb290X2RlbGF5KTsKLQkJc3NsZWVwKHJvb3RfZGVsYXkpOwotCX0KLQotCS8qIHdhaXQgZm9yIHRoZSBrbm93biBkZXZpY2VzIHRvIGNvbXBsZXRlIHRoZWlyIHByb2JpbmcgKi8KLQl3aGlsZSAoZHJpdmVyX3Byb2JlX2RvbmUoKSAhPSAwKQotCQltc2xlZXAoMTAwKTsKLQotCW1kX3J1bl9zZXR1cCgpOwotCi0JaWYgKHNhdmVkX3Jvb3RfbmFtZVswXSkgewotCQlyb290X2RldmljZV9uYW1lID0gc2F2ZWRfcm9vdF9uYW1lOwotCQlpZiAoIXN0cm5jbXAocm9vdF9kZXZpY2VfbmFtZSwgIm10ZCIsIDMpKSB7Ci0JCQltb3VudF9ibG9ja19yb290KHJvb3RfZGV2aWNlX25hbWUsIHJvb3RfbW91bnRmbGFncyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlST09UX0RFViA9IG5hbWVfdG9fZGV2X3Qocm9vdF9kZXZpY2VfbmFtZSk7Ci0JCWlmIChzdHJuY21wKHJvb3RfZGV2aWNlX25hbWUsICIvZGV2LyIsIDUpID09IDApCi0JCQlyb290X2RldmljZV9uYW1lICs9IDU7Ci0JfQotCi0JaXNfZmxvcHB5ID0gTUFKT1IoUk9PVF9ERVYpID09IEZMT1BQWV9NQUpPUjsKLQotCWlmIChpbml0cmRfbG9hZCgpKQotCQlnb3RvIG91dDsKLQotCWlmIChpc19mbG9wcHkgJiYgcmRfZG9sb2FkICYmIHJkX2xvYWRfZGlzaygwKSkKLQkJUk9PVF9ERVYgPSBSb290X1JBTTA7Ci0KLQltb3VudF9yb290KCk7Ci1vdXQ6Ci0Jc3lzX21vdW50KCIuIiwgIi8iLCBOVUxMLCBNU19NT1ZFLCBOVUxMKTsKLQlzeXNfY2hyb290KCIuIik7Ci0Jc2VjdXJpdHlfc2JfcG9zdF9tb3VudHJvb3QoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuaCBiL2luaXQvZG9fbW91bnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNTcwNWQuLjAwMDAwMDAKLS0tIGEvaW5pdC9kb19tb3VudHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLSNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+Ci0KLXZvaWQgIGNoYW5nZV9mbG9wcHkoY2hhciAqZm10LCAuLi4pOwotdm9pZCAgbW91bnRfYmxvY2tfcm9vdChjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOwotdm9pZCAgbW91bnRfcm9vdCh2b2lkKTsKLWV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwotZXh0ZXJuIGNoYXIgKnJvb3RfZGV2aWNlX25hbWU7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNyZWF0ZV9kZXYoY2hhciAqbmFtZSwgZGV2X3QgZGV2KQotewotCXN5c191bmxpbmsobmFtZSk7Ci0JcmV0dXJuIHN5c19ta25vZChuYW1lLCBTX0lGQkxLfDA2MDAsIG5ld19lbmNvZGVfZGV2KGRldikpOwotfQotCi0jaWYgQklUU19QRVJfTE9ORyA9PSAzMgotc3RhdGljIGlubGluZSB1MzIgYnN0YXQoY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3Qgc3RhdDY0IHN0YXQ7Ci0JaWYgKHN5c19zdGF0NjQobmFtZSwgJnN0YXQpICE9IDApCi0JCXJldHVybiAwOwotCWlmICghU19JU0JMSyhzdGF0LnN0X21vZGUpKQotCQlyZXR1cm4gMDsKLQlpZiAoc3RhdC5zdF9yZGV2ICE9ICh1MzIpc3RhdC5zdF9yZGV2KQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc3RhdC5zdF9yZGV2OwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdTMyIGJzdGF0KGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHN0YXQgc3RhdDsKLQlpZiAoc3lzX25ld3N0YXQobmFtZSwgJnN0YXQpICE9IDApCi0JCXJldHVybiAwOwotCWlmICghU19JU0JMSyhzdGF0LnN0X21vZGUpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc3RhdC5zdF9yZGV2OwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KLQotaW50IF9faW5pdCByZF9sb2FkX2Rpc2soaW50IG4pOwotaW50IF9faW5pdCByZF9sb2FkX2ltYWdlKGNoYXIgKmZyb20pOwotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIGludCByZF9sb2FkX2Rpc2soaW50IG4pIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHJkX2xvYWRfaW1hZ2UoY2hhciAqZnJvbSkgeyByZXR1cm4gMDsgfQotCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCi1pbnQgX19pbml0IGluaXRyZF9sb2FkKHZvaWQpOwotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIGludCBpbml0cmRfbG9hZCh2b2lkKSB7IHJldHVybiAwOyB9Ci0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfTUQKLQotdm9pZCBtZF9ydW5fc2V0dXAodm9pZCk7Ci0KLSNlbHNlCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtZF9ydW5fc2V0dXAodm9pZCkge30KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19pbml0cmQuYyBiL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZkN2NiLi4wMDAwMDAwCi0tLSBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pbml4X2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3JvbWZzX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0KLSNpbmNsdWRlICJkb19tb3VudHMuaCIKLQotdW5zaWduZWQgbG9uZyBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQ7Ci1pbnQgaW5pdHJkX2JlbG93X3N0YXJ0X29rOwotdW5zaWduZWQgaW50IHJlYWxfcm9vdF9kZXY7CS8qIGRvX3Byb2NfZG9pbnR2ZWMgY2Fubm90IGhhbmRsZSBrZGV2X3QgKi8KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBvbGRfZmQsIHJvb3RfZmQ7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgbW91bnRfaW5pdHJkID0gMTsKLQotc3RhdGljIGludCBfX2luaXQgbm9faW5pdHJkKGNoYXIgKnN0cikKLXsKLQltb3VudF9pbml0cmQgPSAwOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJub2luaXRyZCIsIG5vX2luaXRyZCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRvX2xpbnV4cmModm9pZCAqIHNoZWxsKQotewotCXN0YXRpYyBjaGFyICphcmd2W10gPSB7ICJsaW51eHJjIiwgTlVMTCwgfTsKLQlleHRlcm4gY2hhciAqIGVudnBfaW5pdFtdOwotCi0Jc3lzX2Nsb3NlKG9sZF9mZCk7c3lzX2Nsb3NlKHJvb3RfZmQpOwotCXN5c19jbG9zZSgwKTtzeXNfY2xvc2UoMSk7c3lzX2Nsb3NlKDIpOwotCXN5c19zZXRzaWQoKTsKLQkodm9pZCkgc3lzX29wZW4oIi9kZXYvY29uc29sZSIsT19SRFdSLDApOwotCSh2b2lkKSBzeXNfZHVwKDApOwotCSh2b2lkKSBzeXNfZHVwKDApOwotCXJldHVybiBrZXJuZWxfZXhlY3ZlKHNoZWxsLCBhcmd2LCBlbnZwX2luaXQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaGFuZGxlX2luaXRyZCh2b2lkKQotewotCWludCBlcnJvcjsKLQlpbnQgcGlkOwotCi0JcmVhbF9yb290X2RldiA9IG5ld19lbmNvZGVfZGV2KFJPT1RfREVWKTsKLQljcmVhdGVfZGV2KCIvZGV2L3Jvb3Qub2xkIiwgUm9vdF9SQU0wKTsKLQkvKiBtb3VudCBpbml0cmQgb24gcm9vdGZzJyAvcm9vdCAqLwotCW1vdW50X2Jsb2NrX3Jvb3QoIi9kZXYvcm9vdC5vbGQiLCByb290X21vdW50ZmxhZ3MgJiB+TVNfUkRPTkxZKTsKLQlzeXNfbWtkaXIoIi9vbGQiLCAwNzAwKTsKLQlyb290X2ZkID0gc3lzX29wZW4oIi8iLCAwLCAwKTsKLQlvbGRfZmQgPSBzeXNfb3BlbigiL29sZCIsIDAsIDApOwotCS8qIG1vdmUgaW5pdHJkIG92ZXIgLyBhbmQgY2hkaXIvY2hyb290IGluIGluaXRyZCByb290ICovCi0Jc3lzX2NoZGlyKCIvcm9vdCIpOwotCXN5c19tb3VudCgiLiIsICIvIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCk7Ci0Jc3lzX2Nocm9vdCgiLiIpOwotCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0JcGlkID0ga2VybmVsX3RocmVhZChkb19saW51eHJjLCAiL2xpbnV4cmMiLCBTSUdDSExEKTsKLQlpZiAocGlkID4gMCkgewotCQl3aGlsZSAocGlkICE9IHN5c193YWl0NCgtMSwgTlVMTCwgMCwgTlVMTCkpCi0JCQl5aWVsZCgpOwotCX0KLQotCS8qIG1vdmUgaW5pdHJkIHRvIHJvb3RmcycgL29sZCAqLwotCXN5c19mY2hkaXIob2xkX2ZkKTsKLQlzeXNfbW91bnQoIi8iLCAiLiIsIE5VTEwsIE1TX01PVkUsIE5VTEwpOwotCS8qIHN3aXRjaCByb290IGFuZCBjd2QgYmFjayB0byAvIG9mIHJvb3RmcyAqLwotCXN5c19mY2hkaXIocm9vdF9mZCk7Ci0Jc3lzX2Nocm9vdCgiLiIpOwotCXN5c19jbG9zZShvbGRfZmQpOwotCXN5c19jbG9zZShyb290X2ZkKTsKLQotCWlmIChuZXdfZGVjb2RlX2RldihyZWFsX3Jvb3RfZGV2KSA9PSBSb290X1JBTTApIHsKLQkJc3lzX2NoZGlyKCIvb2xkIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlST09UX0RFViA9IG5ld19kZWNvZGVfZGV2KHJlYWxfcm9vdF9kZXYpOwotCW1vdW50X3Jvb3QoKTsKLQotCXByaW50ayhLRVJOX05PVElDRSAiVHJ5aW5nIHRvIG1vdmUgb2xkIHJvb3QgdG8gL2luaXRyZCAuLi4gIik7Ci0JZXJyb3IgPSBzeXNfbW91bnQoIi9vbGQiLCAiL3Jvb3QvaW5pdHJkIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCk7Ci0JaWYgKCFlcnJvcikKLQkJcHJpbnRrKCJva2F5XG4iKTsKLQllbHNlIHsKLQkJaW50IGZkID0gc3lzX29wZW4oIi9kZXYvcm9vdC5vbGQiLCBPX1JEV1IsIDApOwotCQlpZiAoZXJyb3IgPT0gLUVOT0VOVCkKLQkJCXByaW50aygiL2luaXRyZCBkb2VzIG5vdCBleGlzdC4gSWdub3JlZC5cbiIpOwotCQllbHNlCi0JCQlwcmludGsoImZhaWxlZFxuIik7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiVW5tb3VudGluZyBvbGQgcm9vdFxuIik7Ci0JCXN5c191bW91bnQoIi9vbGQiLCBNTlRfREVUQUNIKTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJUcnlpbmcgdG8gZnJlZSByYW1kaXNrIG1lbW9yeSAuLi4gIik7Ci0JCWlmIChmZCA8IDApIHsKLQkJCWVycm9yID0gZmQ7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IHN5c19pb2N0bChmZCwgQkxLRkxTQlVGLCAwKTsKLQkJCXN5c19jbG9zZShmZCk7Ci0JCX0KLQkJcHJpbnRrKCFlcnJvciA/ICJva2F5XG4iIDogImZhaWxlZFxuIik7Ci0JfQotfQotCi1pbnQgX19pbml0IGluaXRyZF9sb2FkKHZvaWQpCi17Ci0JaWYgKG1vdW50X2luaXRyZCkgewotCQljcmVhdGVfZGV2KCIvZGV2L3JhbSIsIFJvb3RfUkFNMCk7Ci0JCS8qCi0JCSAqIExvYWQgdGhlIGluaXRyZCBkYXRhIGludG8gL2Rldi9yYW0wLiBFeGVjdXRlIGl0IGFzIGluaXRyZAotCQkgKiB1bmxlc3MgL2Rldi9yYW0wIGlzIHN1cHBvc2VkIHRvIGJlIG91ciBhY3R1YWwgcm9vdCBkZXZpY2UsCi0JCSAqIGluIHRoYXQgY2FzZSB0aGUgcmFtIGRpc2sgaXMganVzdCBzZXQgdXAgaGVyZSwgYW5kIGdldHMKLQkJICogbW91bnRlZCBpbiB0aGUgbm9ybWFsIHBhdGguCi0JCSAqLwotCQlpZiAocmRfbG9hZF9pbWFnZSgiL2luaXRyZC5pbWFnZSIpICYmIFJPT1RfREVWICE9IFJvb3RfUkFNMCkgewotCQkJc3lzX3VubGluaygiL2luaXRyZC5pbWFnZSIpOwotCQkJaGFuZGxlX2luaXRyZCgpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0Jc3lzX3VubGluaygiL2luaXRyZC5pbWFnZSIpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHNfbWQuYyBiL2luaXQvZG9fbW91bnRzX21kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2RjNTQuLjAwMDAwMDAKLS0tIGEvaW5pdC9kb19tb3VudHNfbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0KLSNpbmNsdWRlIDxsaW51eC9yYWlkL21kLmg+Ci0KLSNpbmNsdWRlICJkb19tb3VudHMuaCIKLQotLyoKLSAqIFdoZW4gbWQgKGFuZCBhbnkgcmVxdWlyZSBwZXJzb25hbGl0aWVzKSBhcmUgY29tcGlsZWQgaW50byB0aGUga2VybmVsCi0gKiAobm90IGEgbW9kdWxlKSwgYXJyYXlzIGNhbiBiZSBhc3NlbWJsZXMgYXJlIGJvb3QgdGltZSB1c2luZyB3aXRoIEFVVE9ERVRFQ1QKLSAqIHdoZXJlIHNwZWNpYWxseSBtYXJrZWQgcGFydGl0aW9ucyBhcmUgcmVnaXN0ZXJlZCB3aXRoIG1kX2F1dG9kZXRlY3RfZGV2KCksCi0gKiBhbmQgd2l0aCBNRF9CT09UIHdoZXJlIGRldmljZXMgdG8gYmUgY29sbGVjdGVkIGFyZSBnaXZlbiBvbiB0aGUgYm9vdCBsaW5lCi0gKiB3aXRoIG1kPS4uLi4uCi0gKiBUaGUgY29kZSBmb3IgdGhhdCBpcyBoZXJlLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSByYWlkX25vYXV0b2RldGVjdCwgcmFpZF9hdXRvcGFydDsKLQotc3RhdGljIHN0cnVjdCB7Ci0JaW50IG1pbm9yOwotCWludCBwYXJ0aXRpb25lZDsKLQlpbnQgbGV2ZWw7Ci0JaW50IGNodW5rOwotCWNoYXIgKmRldmljZV9uYW1lczsKLX0gbWRfc2V0dXBfYXJnc1syNTZdIF9faW5pdGRhdGE7Ci0KLXN0YXRpYyBpbnQgbWRfc2V0dXBfZW50cyBfX2luaXRkYXRhOwotCi1leHRlcm4gaW50IG1kcF9tYWpvcjsKLS8qCi0gKiBQYXJzZSB0aGUgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMgZ2l2ZW4gb3VyIGtlcm5lbCwgYnV0IGRvIG5vdAotICogYWN0dWFsbHkgdHJ5IHRvIGludm9rZSB0aGUgTUQgZGV2aWNlIG5vdzsgdGhhdCBpcyBoYW5kbGVkIGJ5Ci0gKiBtZF9zZXR1cF9kcml2ZSBhZnRlciB0aGUgbG93LWxldmVsIGRpc2sgZHJpdmVycyBoYXZlIGluaXRpYWxpc2VkLgotICoKLSAqIDI3LzExLzE5OTk6IEZpeGVkIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIDIuMyBrZXJuZWwgKHdoaWNoCi0gKiAgICAgICAgICAgICBhc3NpZ25zIHRoZSB0YXNrIG9mIHBhcnNpbmcgaW50ZWdlciBhcmd1bWVudHMgdG8gdGhlCi0gKiAgICAgICAgICAgICBpbnZva2VkIHByb2dyYW0gbm93KS4gIEFkZGVkIGFiaWxpdHkgdG8gaW5pdGlhbGlzZSBhbGwKLSAqICAgICAgICAgICAgIHRoZSBNRCBkZXZpY2VzIChieSBzcGVjaWZ5aW5nIG11bHRpcGxlICJtZD0iIGxpbmVzKQotICogICAgICAgICAgICAgaW5zdGVhZCBvZiBqdXN0IG9uZS4gIC0tIEtUSwotICogMThNYXkyMDAwOiBBZGRlZCBzdXBwb3J0IGZvciBwZXJzaXN0ZW50LXN1cGVyYmxvY2sgYXJyYXlzOgotICogICAgICAgICAgICAgbWQ9biwwLGZhY3RvcixmYXVsdCxkZXZpY2UtbGlzdCAgIHVzZXMgUkFJRDAgZm9yIGRldmljZSBuCi0gKiAgICAgICAgICAgICBtZD1uLC0xLGZhY3RvcixmYXVsdCxkZXZpY2UtbGlzdCAgdXNlcyBMSU5FQVIgZm9yIGRldmljZSBuCi0gKiAgICAgICAgICAgICBtZD1uLGRldmljZS1saXN0ICAgICAgcmVhZHMgYSBSQUlEIHN1cGVyYmxvY2sgZnJvbSB0aGUgZGV2aWNlcwotICogICAgICAgICAgICAgZWxlbWVudHMgaW4gZGV2aWNlLWxpc3QgYXJlIHJlYWQgYnkgbmFtZV90b19rZGV2X3Qgc28gY2FuIGJlCi0gKiAgICAgICAgICAgICBhIGhleCBudW1iZXIgb3Igc29tZXRoaW5nIGxpa2UgL2Rldi9oZGExIC9kZXYvc2RiCi0gKiAyMDAxLTA2LTAzOiBEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgotICoJCVNoaWZ0ZWQgbmFtZV90b19rZGV2X3QoKSBhbmQgcmVsYXRlZCBvcGVyYXRpb25zIHRvIG1kX3NldF9kcml2ZSgpCi0gKgkJZm9yIGxhdGVyIGV4ZWN1dGlvbi4gUmV3cm90ZSBzZWN0aW9uIHRvIG1ha2UgZGV2ZnMgY29tcGF0aWJsZS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgbWRfc2V0dXAoY2hhciAqc3RyKQotewotCWludCBtaW5vciwgbGV2ZWwsIGZhY3RvciwgZmF1bHQsIHBhcnRpdGlvbmVkID0gMDsKLQljaGFyICpwZXJuYW1lID0gIiI7Ci0JY2hhciAqc3RyMTsKLQlpbnQgZW50OwotCi0JaWYgKCpzdHIgPT0gJ2QnKSB7Ci0JCXBhcnRpdGlvbmVkID0gMTsKLQkJc3RyKys7Ci0JfQotCWlmIChnZXRfb3B0aW9uKCZzdHIsICZtaW5vcikgIT0gMikgewkvKiBNRCBOdW1iZXIgKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IFRvbyBmZXcgYXJndW1lbnRzIHN1cHBsaWVkIHRvIG1kPS5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3RyMSA9IHN0cjsKLQlmb3IgKGVudD0wIDsgZW50PCBtZF9zZXR1cF9lbnRzIDsgZW50KyspCi0JCWlmIChtZF9zZXR1cF9hcmdzW2VudF0ubWlub3IgPT0gbWlub3IgJiYKLQkJICAgIG1kX3NldHVwX2FyZ3NbZW50XS5wYXJ0aXRpb25lZCA9PSBwYXJ0aXRpb25lZCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IG1kPSVzJWQsIFNwZWNpZmllZCBtb3JlIHRoYW4gb25jZS4gIgotCQkJICAgICAgICJSZXBsYWNpbmcgcHJldmlvdXMgZGVmaW5pdGlvbi5cbiIsIHBhcnRpdGlvbmVkPyJkIjoiIiwgbWlub3IpOwotCQkJYnJlYWs7Ci0JCX0KLQlpZiAoZW50ID49IEFSUkFZX1NJWkUobWRfc2V0dXBfYXJncykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IG1kPSVzJWQgLSB0b28gbWFueSBtZCBpbml0aWFsaXNhdGlvbnNcbiIsIHBhcnRpdGlvbmVkPyJkIjoiIiwgbWlub3IpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGVudCA+PSBtZF9zZXR1cF9lbnRzKQotCQltZF9zZXR1cF9lbnRzKys7Ci0Jc3dpdGNoIChnZXRfb3B0aW9uKCZzdHIsICZsZXZlbCkpIHsJLyogUkFJRCBsZXZlbCAqLwotCWNhc2UgMjogLyogY291bGQgYmUgMCBvciAtMS4uICovCi0JCWlmIChsZXZlbCA9PSAwIHx8IGxldmVsID09IExFVkVMX0xJTkVBUikgewotCQkJaWYgKGdldF9vcHRpb24oJnN0ciwgJmZhY3RvcikgIT0gMiB8fAkvKiBDaHVuayBTaXplICovCi0JCQkJCWdldF9vcHRpb24oJnN0ciwgJmZhdWx0KSAhPSAyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IFRvbyBmZXcgYXJndW1lbnRzIHN1cHBsaWVkIHRvIG1kPS5cbiIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJbWRfc2V0dXBfYXJnc1tlbnRdLmxldmVsID0gbGV2ZWw7Ci0JCQltZF9zZXR1cF9hcmdzW2VudF0uY2h1bmsgPSAxIDw8IChmYWN0b3IrMTIpOwotCQkJaWYgKGxldmVsID09ICBMRVZFTF9MSU5FQVIpCi0JCQkJcGVybmFtZSA9ICJsaW5lYXIiOwotCQkJZWxzZQotCQkJCXBlcm5hbWUgPSAicmFpZDAiOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogRkFMTCBUSFJPVUdIICovCi0JY2FzZSAxOiAvKiB0aGUgZmlyc3QgZGV2aWNlIGlzIG51bWVyaWMgKi8KLQkJc3RyID0gc3RyMTsKLQkJLyogRkFMTCBUSFJPVUdIICovCi0JY2FzZSAwOgotCQltZF9zZXR1cF9hcmdzW2VudF0ubGV2ZWwgPSBMRVZFTF9OT05FOwotCQlwZXJuYW1lPSJzdXBlci1ibG9jayI7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAibWQ6IFdpbGwgY29uZmlndXJlIG1kJWQgKCVzKSBmcm9tICVzLCBiZWxvdy5cbiIsCi0JCW1pbm9yLCBwZXJuYW1lLCBzdHIpOwotCW1kX3NldHVwX2FyZ3NbZW50XS5kZXZpY2VfbmFtZXMgPSBzdHI7Ci0JbWRfc2V0dXBfYXJnc1tlbnRdLnBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7Ci0JbWRfc2V0dXBfYXJnc1tlbnRdLm1pbm9yID0gbWlub3I7Ci0KLQlyZXR1cm4gMTsKLX0KLQotI2RlZmluZSBNZHBNaW5vclNoaWZ0IDYKLQotc3RhdGljIHZvaWQgX19pbml0IG1kX3NldHVwX2RyaXZlKHZvaWQpCi17Ci0JaW50IG1pbm9yLCBpLCBlbnQsIHBhcnRpdGlvbmVkOwotCWRldl90IGRldjsKLQlkZXZfdCBkZXZpY2VzW01EX1NCX0RJU0tTKzFdOwotCi0JZm9yIChlbnQgPSAwOyBlbnQgPCBtZF9zZXR1cF9lbnRzIDsgZW50KyspIHsKLQkJaW50IGZkOwotCQlpbnQgZXJyID0gMDsKLQkJY2hhciAqZGV2bmFtZTsKLQkJbWR1X2Rpc2tfaW5mb190IGRpbmZvOwotCQljaGFyIG5hbWVbMTZdOwotCi0JCW1pbm9yID0gbWRfc2V0dXBfYXJnc1tlbnRdLm1pbm9yOwotCQlwYXJ0aXRpb25lZCA9IG1kX3NldHVwX2FyZ3NbZW50XS5wYXJ0aXRpb25lZDsKLQkJZGV2bmFtZSA9IG1kX3NldHVwX2FyZ3NbZW50XS5kZXZpY2VfbmFtZXM7Ci0KLQkJc3ByaW50ZihuYW1lLCAiL2Rldi9tZCVzJWQiLCBwYXJ0aXRpb25lZD8iX2QiOiIiLCBtaW5vcik7Ci0JCWlmIChwYXJ0aXRpb25lZCkKLQkJCWRldiA9IE1LREVWKG1kcF9tYWpvciwgbWlub3IgPDwgTWRwTWlub3JTaGlmdCk7Ci0JCWVsc2UKLQkJCWRldiA9IE1LREVWKE1EX01BSk9SLCBtaW5vcik7Ci0JCWNyZWF0ZV9kZXYobmFtZSwgZGV2KTsKLQkJZm9yIChpID0gMDsgaSA8IE1EX1NCX0RJU0tTICYmIGRldm5hbWUgIT0gMDsgaSsrKSB7Ci0JCQljaGFyICpwOwotCQkJY2hhciBjb21wX25hbWVbNjRdOwotCQkJdTMyIHJkZXY7Ci0KLQkJCXAgPSBzdHJjaHIoZGV2bmFtZSwgJywnKTsKLQkJCWlmIChwKQotCQkJCSpwKysgPSAwOwotCi0JCQlkZXYgPSBuYW1lX3RvX2Rldl90KGRldm5hbWUpOwotCQkJaWYgKHN0cm5jbXAoZGV2bmFtZSwgIi9kZXYvIiwgNSkgPT0gMCkKLQkJCQlkZXZuYW1lICs9IDU7Ci0JCQlzbnByaW50Zihjb21wX25hbWUsIDYzLCAiL2Rldi8lcyIsIGRldm5hbWUpOwotCQkJcmRldiA9IGJzdGF0KGNvbXBfbmFtZSk7Ci0JCQlpZiAocmRldikKLQkJCQlkZXYgPSBuZXdfZGVjb2RlX2RldihyZGV2KTsKLQkJCWlmICghZGV2KSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IFVua25vd24gZGV2aWNlIG5hbWU6ICVzXG4iLCBkZXZuYW1lKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJZGV2aWNlc1tpXSA9IGRldjsKLQotCQkJZGV2bmFtZSA9IHA7Ci0JCX0KLQkJZGV2aWNlc1tpXSA9IDA7Ci0KLQkJaWYgKCFpKQotCQkJY29udGludWU7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IExvYWRpbmcgbWQlcyVkOiAlc1xuIiwKLQkJCXBhcnRpdGlvbmVkID8gIl9kIiA6ICIiLCBtaW5vciwKLQkJCW1kX3NldHVwX2FyZ3NbZW50XS5kZXZpY2VfbmFtZXMpOwotCi0JCWZkID0gc3lzX29wZW4obmFtZSwgMCwgMCk7Ci0JCWlmIChmZCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibWQ6IG9wZW4gZmFpbGVkIC0gY2Fubm90IHN0YXJ0ICIKLQkJCQkJImFycmF5ICVzXG4iLCBuYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzeXNfaW9jdGwoZmQsIFNFVF9BUlJBWV9JTkZPLCAwKSA9PSAtRUJVU1kpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAibWQ6IElnbm9yaW5nIG1kPSVkLCBhbHJlYWR5IGF1dG9kZXRlY3RlZC4gKFVzZSByYWlkPW5vYXV0b2RldGVjdClcbiIsCi0JCQkgICAgICAgbWlub3IpOwotCQkJc3lzX2Nsb3NlKGZkKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKG1kX3NldHVwX2FyZ3NbZW50XS5sZXZlbCAhPSBMRVZFTF9OT05FKSB7Ci0JCQkvKiBub24tcGVyc2lzdGVudCAqLwotCQkJbWR1X2FycmF5X2luZm9fdCBhaW5mbzsKLQkJCWFpbmZvLmxldmVsID0gbWRfc2V0dXBfYXJnc1tlbnRdLmxldmVsOwotCQkJYWluZm8uc2l6ZSA9IDA7Ci0JCQlhaW5mby5ucl9kaXNrcyA9MDsKLQkJCWFpbmZvLnJhaWRfZGlza3MgPTA7Ci0JCQl3aGlsZSAoZGV2aWNlc1thaW5mby5yYWlkX2Rpc2tzXSkKLQkJCQlhaW5mby5yYWlkX2Rpc2tzKys7Ci0JCQlhaW5mby5tZF9taW5vciA9bWlub3I7Ci0JCQlhaW5mby5ub3RfcGVyc2lzdGVudCA9IDE7Ci0KLQkJCWFpbmZvLnN0YXRlID0gKDEgPDwgTURfU0JfQ0xFQU4pOwotCQkJYWluZm8ubGF5b3V0ID0gMDsKLQkJCWFpbmZvLmNodW5rX3NpemUgPSBtZF9zZXR1cF9hcmdzW2VudF0uY2h1bms7Ci0JCQllcnIgPSBzeXNfaW9jdGwoZmQsIFNFVF9BUlJBWV9JTkZPLCAobG9uZykmYWluZm8pOwotCQkJZm9yIChpID0gMDsgIWVyciAmJiBpIDw9IE1EX1NCX0RJU0tTOyBpKyspIHsKLQkJCQlkZXYgPSBkZXZpY2VzW2ldOwotCQkJCWlmICghZGV2KQotCQkJCQlicmVhazsKLQkJCQlkaW5mby5udW1iZXIgPSBpOwotCQkJCWRpbmZvLnJhaWRfZGlzayA9IGk7Ci0JCQkJZGluZm8uc3RhdGUgPSAoMTw8TURfRElTS19BQ1RJVkUpfCgxPDxNRF9ESVNLX1NZTkMpOwotCQkJCWRpbmZvLm1ham9yID0gTUFKT1IoZGV2KTsKLQkJCQlkaW5mby5taW5vciA9IE1JTk9SKGRldik7Ci0JCQkJZXJyID0gc3lzX2lvY3RsKGZkLCBBRERfTkVXX0RJU0ssIChsb25nKSZkaW5mbyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBwZXJzaXN0ZW50ICovCi0JCQlmb3IgKGkgPSAwOyBpIDw9IE1EX1NCX0RJU0tTOyBpKyspIHsKLQkJCQlkZXYgPSBkZXZpY2VzW2ldOwotCQkJCWlmICghZGV2KQotCQkJCQlicmVhazsKLQkJCQlkaW5mby5tYWpvciA9IE1BSk9SKGRldik7Ci0JCQkJZGluZm8ubWlub3IgPSBNSU5PUihkZXYpOwotCQkJCXN5c19pb2N0bChmZCwgQUREX05FV19ESVNLLCAobG9uZykmZGluZm8pOwotCQkJfQotCQl9Ci0JCWlmICghZXJyKQotCQkJZXJyID0gc3lzX2lvY3RsKGZkLCBSVU5fQVJSQVksIDApOwotCQlpZiAoZXJyKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWQ6IHN0YXJ0aW5nIG1kJWQgZmFpbGVkXG4iLCBtaW5vcik7Ci0JCWVsc2UgewotCQkJLyogcmVyZWFkIHRoZSBwYXJ0aXRpb24gdGFibGUuCi0JCQkgKiBJIChuZWlsYikgYW5kIG5vdCBzdXJlIHdoeSB0aGlzIGlzIG5lZWRlZCwgYnV0IEkgY2Fubm90Ci0JCQkgKiBib290IGEga2VybmVsIHdpdGggZGV2ZnMgY29tcGlsZWQgaW4gZnJvbSBwYXJ0aXRpb25lZCBtZAotCQkJICogYXJyYXkgd2l0aG91dCBpdAotCQkJICovCi0JCQlzeXNfY2xvc2UoZmQpOwotCQkJZmQgPSBzeXNfb3BlbihuYW1lLCAwLCAwKTsKLQkJCXN5c19pb2N0bChmZCwgQkxLUlJQQVJULCAwKTsKLQkJfQotCQlzeXNfY2xvc2UoZmQpOwotCX0KLX0KLQotc3RhdGljIGludCBfX2luaXQgcmFpZF9zZXR1cChjaGFyICpzdHIpCi17Ci0JaW50IGxlbiwgcG9zOwotCi0JbGVuID0gc3RybGVuKHN0cikgKyAxOwotCXBvcyA9IDA7Ci0KLQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCWNoYXIgKmNvbW1hID0gc3RyY2hyKHN0citwb3MsICcsJyk7Ci0JCWludCB3bGVuOwotCQlpZiAoY29tbWEpCi0JCQl3bGVuID0gKGNvbW1hLXN0ciktcG9zOwotCQllbHNlCXdsZW4gPSAobGVuLTEpLXBvczsKLQotCQlpZiAoIXN0cm5jbXAoc3RyLCAibm9hdXRvZGV0ZWN0Iiwgd2xlbikpCi0JCQlyYWlkX25vYXV0b2RldGVjdCA9IDE7Ci0JCWlmIChzdHJuY21wKHN0ciwgInBhcnRpdGlvbmFibGUiLCB3bGVuKT09MCkKLQkJCXJhaWRfYXV0b3BhcnQgPSAxOwotCQlpZiAoc3RybmNtcChzdHIsICJwYXJ0Iiwgd2xlbik9PTApCi0JCQlyYWlkX2F1dG9wYXJ0ID0gMTsKLQkJcG9zICs9IHdsZW4rMTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoInJhaWQ9IiwgcmFpZF9zZXR1cCk7Ci1fX3NldHVwKCJtZD0iLCBtZF9zZXR1cCk7Ci0KLXZvaWQgX19pbml0IG1kX3J1bl9zZXR1cCh2b2lkKQotewotCWNyZWF0ZV9kZXYoIi9kZXYvbWQwIiwgTUtERVYoTURfTUFKT1IsIDApKTsKLQlpZiAocmFpZF9ub2F1dG9kZXRlY3QpCi0JCXByaW50ayhLRVJOX0lORk8gIm1kOiBTa2lwcGluZyBhdXRvZGV0ZWN0aW9uIG9mIFJBSUQgYXJyYXlzLiAocmFpZD1ub2F1dG9kZXRlY3QpXG4iKTsKLQllbHNlIHsKLQkJaW50IGZkID0gc3lzX29wZW4oIi9kZXYvbWQwIiwgMCwgMCk7Ci0JCWlmIChmZCA+PSAwKSB7Ci0JCQlzeXNfaW9jdGwoZmQsIFJBSURfQVVUT1JVTiwgcmFpZF9hdXRvcGFydCk7Ci0JCQlzeXNfY2xvc2UoZmQpOwotCQl9Ci0JfQotCW1kX3NldHVwX2RyaXZlKCk7Ci19CmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19yZC5jIGIvaW5pdC9kb19tb3VudHNfcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2NTJmNC4uMDAwMDAwMAotLS0gYS9pbml0L2RvX21vdW50c19yZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWluaXhfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcm9tZnNfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmFtZnNfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotI2luY2x1ZGUgImRvX21vdW50cy5oIgotCi0jZGVmaW5lIEJVSUxEX0NSQU1ESVNLCi0KLWludCBfX2luaXRkYXRhIHJkX3Byb21wdCA9IDE7LyogMSA9IHByb21wdCBmb3IgUkFNIGRpc2ssIDAgPSBkb24ndCBwcm9tcHQgKi8KLQotc3RhdGljIGludCBfX2luaXQgcHJvbXB0X3JhbWRpc2soY2hhciAqc3RyKQotewotCXJkX3Byb21wdCA9IHNpbXBsZV9zdHJ0b2woc3RyLE5VTEwsMCkgJiAxOwotCXJldHVybiAxOwotfQotX19zZXR1cCgicHJvbXB0X3JhbWRpc2s9IiwgcHJvbXB0X3JhbWRpc2spOwotCi1pbnQgX19pbml0ZGF0YSByZF9pbWFnZV9zdGFydDsJCS8qIHN0YXJ0aW5nIGJsb2NrICMgb2YgaW1hZ2UgKi8KLQotc3RhdGljIGludCBfX2luaXQgcmFtZGlza19zdGFydF9zZXR1cChjaGFyICpzdHIpCi17Ci0JcmRfaW1hZ2Vfc3RhcnQgPSBzaW1wbGVfc3RydG9sKHN0cixOVUxMLDApOwotCXJldHVybiAxOwotfQotX19zZXR1cCgicmFtZGlza19zdGFydD0iLCByYW1kaXNrX3N0YXJ0X3NldHVwKTsKLQotc3RhdGljIGludCBfX2luaXQgY3JkX2xvYWQoaW50IGluX2ZkLCBpbnQgb3V0X2ZkKTsKLQotLyoKLSAqIFRoaXMgcm91dGluZSB0cmllcyB0byBmaW5kIGEgUkFNIGRpc2sgaW1hZ2UgdG8gbG9hZCwgYW5kIHJldHVybnMgdGhlCi0gKiBudW1iZXIgb2YgYmxvY2tzIHRvIHJlYWQgZm9yIGEgbm9uLWNvbXByZXNzZWQgaW1hZ2UsIDAgaWYgdGhlIGltYWdlCi0gKiBpcyBhIGNvbXByZXNzZWQgaW1hZ2UsIGFuZCAtMSBpZiBhbiBpbWFnZSB3aXRoIHRoZSByaWdodCBtYWdpYwotICogbnVtYmVycyBjb3VsZCBub3QgYmUgZm91bmQuCi0gKgotICogV2UgY3VycmVudGx5IGNoZWNrIGZvciB0aGUgZm9sbG93aW5nIG1hZ2ljIG51bWJlcnM6Ci0gKiAJbWluaXgKLSAqIAlleHQyCi0gKglyb21mcwotICoJY3JhbWZzCi0gKiAJZ3ppcAotICovCi1zdGF0aWMgaW50IF9faW5pdCAKLWlkZW50aWZ5X3JhbWRpc2tfaW1hZ2UoaW50IGZkLCBpbnQgc3RhcnRfYmxvY2spCi17Ci0JY29uc3QgaW50IHNpemUgPSA1MTI7Ci0Jc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrICptaW5peHNiOwotCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpleHQyc2I7Ci0Jc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICpyb21mc2I7Ci0Jc3RydWN0IGNyYW1mc19zdXBlciAqY3JhbWZzYjsKLQlpbnQgbmJsb2NrcyA9IC0xOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQotCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQltaW5peHNiID0gKHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqKSBidWY7Ci0JZXh0MnNiID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopIGJ1ZjsKLQlyb21mc2IgPSAoc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICopIGJ1ZjsKLQljcmFtZnNiID0gKHN0cnVjdCBjcmFtZnNfc3VwZXIgKikgYnVmOwotCW1lbXNldChidWYsIDB4ZTUsIHNpemUpOwotCi0JLyoKLQkgKiBSZWFkIGJsb2NrIDAgdG8gdGVzdCBmb3IgZ3ppcHBlZCBrZXJuZWwKLQkgKi8KLQlzeXNfbHNlZWsoZmQsIHN0YXJ0X2Jsb2NrICogQkxPQ0tfU0laRSwgMCk7Ci0Jc3lzX3JlYWQoZmQsIGJ1Ziwgc2l6ZSk7Ci0KLQkvKgotCSAqIElmIGl0IG1hdGNoZXMgdGhlIGd6aXAgbWFnaWMgbnVtYmVycywgcmV0dXJuIC0xCi0JICovCi0JaWYgKGJ1ZlswXSA9PSAwMzcgJiYgKChidWZbMV0gPT0gMDIxMykgfHwgKGJ1ZlsxXSA9PSAwMjM2KSkpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiUkFNRElTSzogQ29tcHJlc3NlZCBpbWFnZSBmb3VuZCBhdCBibG9jayAlZFxuIiwKLQkJICAgICAgIHN0YXJ0X2Jsb2NrKTsKLQkJbmJsb2NrcyA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiByb21mcyBpcyBhdCBibG9jayB6ZXJvIHRvbyAqLwotCWlmIChyb21mc2ItPndvcmQwID09IFJPTVNCX1dPUkQwICYmCi0JICAgIHJvbWZzYi0+d29yZDEgPT0gUk9NU0JfV09SRDEpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiUkFNRElTSzogcm9tZnMgZmlsZXN5c3RlbSBmb3VuZCBhdCBibG9jayAlZFxuIiwKLQkJICAgICAgIHN0YXJ0X2Jsb2NrKTsKLQkJbmJsb2NrcyA9IChudG9obChyb21mc2ItPnNpemUpK0JMT0NLX1NJWkUtMSk+PkJMT0NLX1NJWkVfQklUUzsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjcmFtZnNiLT5tYWdpYyA9PSBDUkFNRlNfTUFHSUMpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiUkFNRElTSzogY3JhbWZzIGZpbGVzeXN0ZW0gZm91bmQgYXQgYmxvY2sgJWRcbiIsCi0JCSAgICAgICBzdGFydF9ibG9jayk7Ci0JCW5ibG9ja3MgPSAoY3JhbWZzYi0+c2l6ZSArIEJMT0NLX1NJWkUgLSAxKSA+PiBCTE9DS19TSVpFX0JJVFM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKgotCSAqIFJlYWQgYmxvY2sgMSB0byB0ZXN0IGZvciBtaW5peCBhbmQgZXh0MiBzdXBlcmJsb2NrCi0JICovCi0Jc3lzX2xzZWVrKGZkLCAoc3RhcnRfYmxvY2srMSkgKiBCTE9DS19TSVpFLCAwKTsKLQlzeXNfcmVhZChmZCwgYnVmLCBzaXplKTsKLQotCS8qIFRyeSBtaW5peCAqLwotCWlmIChtaW5peHNiLT5zX21hZ2ljID09IE1JTklYX1NVUEVSX01BR0lDIHx8Ci0JICAgIG1pbml4c2ItPnNfbWFnaWMgPT0gTUlOSVhfU1VQRVJfTUFHSUMyKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRQotCQkgICAgICAgIlJBTURJU0s6IE1pbml4IGZpbGVzeXN0ZW0gZm91bmQgYXQgYmxvY2sgJWRcbiIsCi0JCSAgICAgICBzdGFydF9ibG9jayk7Ci0JCW5ibG9ja3MgPSBtaW5peHNiLT5zX256b25lcyA8PCBtaW5peHNiLT5zX2xvZ196b25lX3NpemU7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBUcnkgZXh0MiAqLwotCWlmIChleHQyc2ItPnNfbWFnaWMgPT0gY3B1X3RvX2xlMTYoRVhUMl9TVVBFUl9NQUdJQykpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiUkFNRElTSzogZXh0MiBmaWxlc3lzdGVtIGZvdW5kIGF0IGJsb2NrICVkXG4iLAotCQkgICAgICAgc3RhcnRfYmxvY2spOwotCQluYmxvY2tzID0gbGUzMl90b19jcHUoZXh0MnNiLT5zX2Jsb2Nrc19jb3VudCkgPDwKLQkJCWxlMzJfdG9fY3B1KGV4dDJzYi0+c19sb2dfYmxvY2tfc2l6ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcmludGsoS0VSTl9OT1RJQ0UKLQkgICAgICAgIlJBTURJU0s6IENvdWxkbid0IGZpbmQgdmFsaWQgUkFNIGRpc2sgaW1hZ2Ugc3RhcnRpbmcgYXQgJWQuXG4iLAotCSAgICAgICBzdGFydF9ibG9jayk7Ci0JCi1kb25lOgotCXN5c19sc2VlayhmZCwgc3RhcnRfYmxvY2sgKiBCTE9DS19TSVpFLCAwKTsKLQlrZnJlZShidWYpOwotCXJldHVybiBuYmxvY2tzOwotfQotCi1pbnQgX19pbml0IHJkX2xvYWRfaW1hZ2UoY2hhciAqZnJvbSkKLXsKLQlpbnQgcmVzID0gMDsKLQlpbnQgaW5fZmQsIG91dF9mZDsKLQl1bnNpZ25lZCBsb25nIHJkX2Jsb2NrcywgZGV2YmxvY2tzOwotCWludCBuYmxvY2tzLCBpLCBkaXNrOwotCWNoYXIgKmJ1ZiA9IE5VTEw7Ci0JdW5zaWduZWQgc2hvcnQgcm90YXRlID0gMDsKLSNpZiAhZGVmaW5lZChDT05GSUdfUzM5MCkgJiYgIWRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKQotCWNoYXIgcm90YXRvcls0XSA9IHsgJ3wnICwgJy8nICwgJy0nICwgJ1xcJyB9OwotI2VuZGlmCi0KLQlvdXRfZmQgPSBzeXNfb3BlbigiL2Rldi9yYW0iLCBPX1JEV1IsIDApOwotCWlmIChvdXRfZmQgPCAwKQotCQlnb3RvIG91dDsKLQotCWluX2ZkID0gc3lzX29wZW4oZnJvbSwgT19SRE9OTFksIDApOwotCWlmIChpbl9mZCA8IDApCi0JCWdvdG8gbm9jbG9zZV9pbnB1dDsKLQotCW5ibG9ja3MgPSBpZGVudGlmeV9yYW1kaXNrX2ltYWdlKGluX2ZkLCByZF9pbWFnZV9zdGFydCk7Ci0JaWYgKG5ibG9ja3MgPCAwKQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAobmJsb2NrcyA9PSAwKSB7Ci0jaWZkZWYgQlVJTERfQ1JBTURJU0sKLQkJaWYgKGNyZF9sb2FkKGluX2ZkLCBvdXRfZmQpID09IDApCi0JCQlnb3RvIHN1Y2Nlc3NmdWxfbG9hZDsKLSNlbHNlCi0JCXByaW50ayhLRVJOX05PVElDRQotCQkgICAgICAgIlJBTURJU0s6IEtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IGNvbXByZXNzZWQgIgotCQkgICAgICAgIlJBTSBkaXNrIGltYWdlc1xuIik7Ci0jZW5kaWYKLQkJZ290byBkb25lOwotCX0KLQotCS8qCi0JICogTk9URSBOT1RFOiBuYmxvY2tzIGlzIG5vdCBhY3R1YWxseSBibG9ja3MgYnV0Ci0JICogdGhlIG51bWJlciBvZiBraWJpYnl0ZXMgb2YgZGF0YSB0byBsb2FkIGludG8gYSByYW1kaXNrLgotCSAqIFNvIGFueSByYW1kaXNrIGJsb2NrIHNpemUgdGhhdCBpcyBhIG11bHRpcGxlIG9mIDFLaUIgc2hvdWxkCi0JICogd29yayB3aGVuIHRoZSBhcHByb3ByaWF0ZSByYW1kaXNrX2Jsb2Nrc2l6ZSBpcyBzcGVjaWZpZWQKLQkgKiBvbiB0aGUgY29tbWFuZCBsaW5lLgotCSAqCi0JICogVGhlIGRlZmF1bHQgcmFtZGlza19ibG9ja3NpemUgaXMgMUtpQiBhbmQgaXQgaXMgZ2VuZXJhbGx5Ci0JICogc2lsbHkgdG8gdXNlIGFueXRoaW5nIGVsc2UsIHNvIG1ha2Ugc3VyZSB0byB1c2UgMUtpQgotCSAqIGJsb2Nrc2l6ZSB3aGlsZSBnZW5lcmF0aW5nIGV4dDJmcyByYW1kaXNrLWltYWdlcy4KLQkgKi8KLQlpZiAoc3lzX2lvY3RsKG91dF9mZCwgQkxLR0VUU0laRSwgKHVuc2lnbmVkIGxvbmcpJnJkX2Jsb2NrcykgPCAwKQotCQlyZF9ibG9ja3MgPSAwOwotCWVsc2UKLQkJcmRfYmxvY2tzID4+PSAxOwotCi0JaWYgKG5ibG9ja3MgPiByZF9ibG9ja3MpIHsKLQkJcHJpbnRrKCJSQU1ESVNLOiBpbWFnZSB0b28gYmlnISAoJWRLaUIvJWxkS2lCKVxuIiwKLQkJICAgICAgIG5ibG9ja3MsIHJkX2Jsb2Nrcyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JCQotCS8qCi0JICogT0ssIHRpbWUgdG8gY29weSBpbiB0aGUgZGF0YQotCSAqLwotCWlmIChzeXNfaW9jdGwoaW5fZmQsIEJMS0dFVFNJWkUsICh1bnNpZ25lZCBsb25nKSZkZXZibG9ja3MpIDwgMCkKLQkJZGV2YmxvY2tzID0gMDsKLQllbHNlCi0JCWRldmJsb2NrcyA+Pj0gMTsKLQotCWlmIChzdHJjbXAoZnJvbSwgIi9pbml0cmQuaW1hZ2UiKSA9PSAwKQotCQlkZXZibG9ja3MgPSBuYmxvY2tzOwotCi0JaWYgKGRldmJsb2NrcyA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUkFNRElTSzogY291bGQgbm90IGRldGVybWluZSBkZXZpY2Ugc2l6ZVxuIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlidWYgPSBrbWFsbG9jKEJMT0NLX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlJBTURJU0s6IGNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcHJpbnRrKEtFUk5fTk9USUNFICJSQU1ESVNLOiBMb2FkaW5nICVkS2lCIFslbGQgZGlzayVzXSBpbnRvIHJhbSBkaXNrLi4uICIsCi0JCW5ibG9ja3MsICgobmJsb2Nrcy0xKS9kZXZibG9ja3MpKzEsIG5ibG9ja3M+ZGV2YmxvY2tzID8gInMiIDogIiIpOwotCWZvciAoaSA9IDAsIGRpc2sgPSAxOyBpIDwgbmJsb2NrczsgaSsrKSB7Ci0JCWlmIChpICYmIChpICUgZGV2YmxvY2tzID09IDApKSB7Ci0JCQlwcmludGsoImRvbmUgZGlzayAjJWQuXG4iLCBkaXNrKyspOwotCQkJcm90YXRlID0gMDsKLQkJCWlmIChzeXNfY2xvc2UoaW5fZmQpKSB7Ci0JCQkJcHJpbnRrKCJFcnJvciBjbG9zaW5nIHRoZSBkaXNrLlxuIik7Ci0JCQkJZ290byBub2Nsb3NlX2lucHV0OwotCQkJfQotCQkJY2hhbmdlX2Zsb3BweSgiZGlzayAjJWQiLCBkaXNrKTsKLQkJCWluX2ZkID0gc3lzX29wZW4oZnJvbSwgT19SRE9OTFksIDApOwotCQkJaWYgKGluX2ZkIDwgMCkgIHsKLQkJCQlwcmludGsoIkVycm9yIG9wZW5pbmcgZGlzay5cbiIpOwotCQkJCWdvdG8gbm9jbG9zZV9pbnB1dDsKLQkJCX0KLQkJCXByaW50aygiTG9hZGluZyBkaXNrICMlZC4uLiAiLCBkaXNrKTsKLQkJfQotCQlzeXNfcmVhZChpbl9mZCwgYnVmLCBCTE9DS19TSVpFKTsKLQkJc3lzX3dyaXRlKG91dF9mZCwgYnVmLCBCTE9DS19TSVpFKTsKLSNpZiAhZGVmaW5lZChDT05GSUdfUzM5MCkgJiYgIWRlZmluZWQoQ09ORklHX1BQQ19JU0VSSUVTKQotCQlpZiAoIShpICUgMTYpKSB7Ci0JCQlwcmludGsoIiVjXGIiLCByb3RhdG9yW3JvdGF0ZSAmIDB4M10pOwotCQkJcm90YXRlKys7Ci0JCX0KLSNlbmRpZgotCX0KLQlwcmludGsoImRvbmUuXG4iKTsKLQotc3VjY2Vzc2Z1bF9sb2FkOgotCXJlcyA9IDE7Ci1kb25lOgotCXN5c19jbG9zZShpbl9mZCk7Ci1ub2Nsb3NlX2lucHV0OgotCXN5c19jbG9zZShvdXRfZmQpOwotb3V0OgotCWtmcmVlKGJ1Zik7Ci0Jc3lzX3VubGluaygiL2Rldi9yYW0iKTsKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgX19pbml0IHJkX2xvYWRfZGlzayhpbnQgbikKLXsKLQlpZiAocmRfcHJvbXB0KQotCQljaGFuZ2VfZmxvcHB5KCJyb290IGZsb3BweSBkaXNrIHRvIGJlIGxvYWRlZCBpbnRvIFJBTSBkaXNrIik7Ci0JY3JlYXRlX2RldigiL2Rldi9yb290IiwgUk9PVF9ERVYpOwotCWNyZWF0ZV9kZXYoIi9kZXYvcmFtIiwgTUtERVYoUkFNRElTS19NQUpPUiwgbikpOwotCXJldHVybiByZF9sb2FkX2ltYWdlKCIvZGV2L3Jvb3QiKTsKLX0KLQotI2lmZGVmIEJVSUxEX0NSQU1ESVNLCi0KLS8qCi0gKiBnemlwIGRlY2xhcmF0aW9ucwotICovCi0KLSNkZWZpbmUgT0YoYXJncykgIGFyZ3MKLQotI2lmbmRlZiBtZW16ZXJvCi0jZGVmaW5lIG1lbXplcm8ocywgbikgICAgIG1lbXNldCAoKHMpLCAwLCAobikpCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOwotCi0jZGVmaW5lIElOQlVGU0laIDQwOTYKLSNkZWZpbmUgV1NJWkUgMHg4MDAwICAgIC8qIHdpbmRvdyBzaXplLS1tdXN0IGJlIGEgcG93ZXIgb2YgdHdvLCBhbmQgKi8KLQkJCS8qICBhdCBsZWFzdCAzMksgZm9yIHppcCdzIGRlZmxhdGUgbWV0aG9kICovCi0KLXN0YXRpYyB1Y2ggKmluYnVmOwotc3RhdGljIHVjaCAqd2luZG93OwotCi1zdGF0aWMgdW5zaWduZWQgaW5zaXplOyAgLyogdmFsaWQgYnl0ZXMgaW4gaW5idWYgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnB0cjsgICAvKiBpbmRleCBvZiBuZXh0IGJ5dGUgdG8gYmUgcHJvY2Vzc2VkIGluIGluYnVmICovCi1zdGF0aWMgdW5zaWduZWQgb3V0Y250OyAgLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLwotc3RhdGljIGludCBleGl0X2NvZGU7Ci1zdGF0aWMgaW50IHVuemlwX2Vycm9yOwotc3RhdGljIGxvbmcgYnl0ZXNfb3V0Owotc3RhdGljIGludCBjcmRfaW5mZCwgY3JkX291dGZkOwotCi0jZGVmaW5lIGdldF9ieXRlKCkgIChpbnB0ciA8IGluc2l6ZSA/IGluYnVmW2lucHRyKytdIDogZmlsbF9pbmJ1ZigpKQotCQkKLS8qIERpYWdub3N0aWMgZnVuY3Rpb25zIChzdHViYmVkIG91dCkgKi8KLSNkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQotI2RlZmluZSBUcmFjZSh4KQotI2RlZmluZSBUcmFjZXYoeCkKLSNkZWZpbmUgVHJhY2V2dih4KQotI2RlZmluZSBUcmFjZWMoYyx4KQotI2RlZmluZSBUcmFjZWN2KGMseCkKLQotI2RlZmluZSBTVEFUSUMgc3RhdGljCi0jZGVmaW5lIElOSVQgX19pbml0Ci0KLXN0YXRpYyBpbnQgIF9faW5pdCBmaWxsX2luYnVmKHZvaWQpOwotc3RhdGljIHZvaWQgX19pbml0IGZsdXNoX3dpbmRvdyh2b2lkKTsKLXN0YXRpYyB2b2lkIF9faW5pdCAqbWFsbG9jKHNpemVfdCBzaXplKTsKLXN0YXRpYyB2b2lkIF9faW5pdCBmcmVlKHZvaWQgKndoZXJlKTsKLXN0YXRpYyB2b2lkIF9faW5pdCBlcnJvcihjaGFyICptKTsKLXN0YXRpYyB2b2lkIF9faW5pdCBnemlwX21hcmsodm9pZCAqKik7Ci1zdGF0aWMgdm9pZCBfX2luaXQgZ3ppcF9yZWxlYXNlKHZvaWQgKiopOwotCi0jaW5jbHVkZSAiLi4vbGliL2luZmxhdGUuYyIKLQotc3RhdGljIHZvaWQgX19pbml0ICptYWxsb2Moc2l6ZV90IHNpemUpCi17Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBmcmVlKHZvaWQgKndoZXJlKQotewotCWtmcmVlKHdoZXJlKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGd6aXBfbWFyayh2b2lkICoqcHRyKQotewotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZ3ppcF9yZWxlYXNlKHZvaWQgKipwdHIpCi17Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGaWxsIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5Ci0gKiBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgcmVhbGx5IG5lZWRlZC4KLSAqIFJldHVybmluZyAtMSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBndW56aXAoKSB3aWxsIGV2ZXIgcmV0dXJuLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBmaWxsX2luYnVmKHZvaWQpCi17Ci0JaWYgKGV4aXRfY29kZSkgcmV0dXJuIC0xOwotCQotCWluc2l6ZSA9IHN5c19yZWFkKGNyZF9pbmZkLCBpbmJ1ZiwgSU5CVUZTSVopOwotCWlmIChpbnNpemUgPT0gMCkgewotCQllcnJvcigiUkFNRElTSzogcmFuIG91dCBvZiBjb21wcmVzc2VkIGRhdGEiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlucHRyID0gMTsKLQotCXJldHVybiBpbmJ1ZlswXTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBXcml0ZSB0aGUgb3V0cHV0IHdpbmRvdyB3aW5kb3dbMC4ub3V0Y250LTFdIGFuZCB1cGRhdGUgY3JjIGFuZCBieXRlc19vdXQuCi0gKiAoVXNlZCBmb3IgdGhlIGRlY29tcHJlc3NlZCBkYXRhIG9ubHkuKQotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZmx1c2hfd2luZG93KHZvaWQpCi17Ci0gICAgdWxnIGMgPSBjcmM7ICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCi0gICAgdW5zaWduZWQgbiwgd3JpdHRlbjsKLSAgICB1Y2ggKmluLCBjaDsKLSAgICAKLSAgICB3cml0dGVuID0gc3lzX3dyaXRlKGNyZF9vdXRmZCwgd2luZG93LCBvdXRjbnQpOwotICAgIGlmICh3cml0dGVuICE9IG91dGNudCAmJiB1bnppcF9lcnJvciA9PSAwKSB7Ci0JcHJpbnRrKEtFUk5fRVJSICJSQU1ESVNLOiBpbmNvbXBsZXRlIHdyaXRlICglZCAhPSAlZCkgJWxkXG4iLAotCSAgICAgICB3cml0dGVuLCBvdXRjbnQsIGJ5dGVzX291dCk7Ci0JdW56aXBfZXJyb3IgPSAxOwotICAgIH0KLSAgICBpbiA9IHdpbmRvdzsKLSAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKLQkgICAgY2ggPSAqaW4rKzsKLQkgICAgYyA9IGNyY18zMl90YWJbKChpbnQpYyBeIGNoKSAmIDB4ZmZdIF4gKGMgPj4gOCk7Ci0gICAgfQotICAgIGNyYyA9IGM7Ci0gICAgYnl0ZXNfb3V0ICs9ICh1bGcpb3V0Y250OwotICAgIG91dGNudCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBlcnJvcihjaGFyICp4KQotewotCXByaW50ayhLRVJOX0VSUiAiJXNcbiIsIHgpOwotCWV4aXRfY29kZSA9IDE7Ci0JdW56aXBfZXJyb3IgPSAxOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjcmRfbG9hZChpbnQgaW5fZmQsIGludCBvdXRfZmQpCi17Ci0JaW50IHJlc3VsdDsKLQotCWluc2l6ZSA9IDA7CQkvKiB2YWxpZCBieXRlcyBpbiBpbmJ1ZiAqLwotCWlucHRyID0gMDsJCS8qIGluZGV4IG9mIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQgaW4gaW5idWYgKi8KLQlvdXRjbnQgPSAwOwkJLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLwotCWV4aXRfY29kZSA9IDA7Ci0JYnl0ZXNfb3V0ID0gMDsKLQljcmMgPSAodWxnKTB4ZmZmZmZmZmZMOyAvKiBzaGlmdCByZWdpc3RlciBjb250ZW50cyAqLwotCi0JY3JkX2luZmQgPSBpbl9mZDsKLQljcmRfb3V0ZmQgPSBvdXRfZmQ7Ci0JaW5idWYgPSBrbWFsbG9jKElOQlVGU0laLCBHRlBfS0VSTkVMKTsKLQlpZiAoaW5idWYgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlJBTURJU0s6IENvdWxkbid0IGFsbG9jYXRlIGd6aXAgYnVmZmVyXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl3aW5kb3cgPSBrbWFsbG9jKFdTSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAod2luZG93ID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJSQU1ESVNLOiBDb3VsZG4ndCBhbGxvY2F0ZSBnemlwIHdpbmRvd1xuIik7Ci0JCWtmcmVlKGluYnVmKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltYWtlY3JjKCk7Ci0JcmVzdWx0ID0gZ3VuemlwKCk7Ci0JaWYgKHVuemlwX2Vycm9yKQotCQlyZXN1bHQgPSAxOwotCWtmcmVlKGluYnVmKTsKLQlrZnJlZSh3aW5kb3cpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNlbmRpZiAgLyogQlVJTERfQ1JBTURJU0sgKi8KZGlmZiAtLWdpdCBhL2luaXQvaW5pdHJhbWZzLmMgYi9pbml0L2luaXRyYW1mcy5jCmluZGV4IDAwZWZmN2EuLjFkZTVjYWQgMTAwNjQ0Ci0tLSBhL2luaXQvaW5pdHJhbWZzLmMKKysrIGIvaW5pdC9pbml0cmFtZnMuYwpAQCAtNyw2ICs3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogCit1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kOworaW50IF9faW5pdGRhdGEgaW5pdHJkX2JlbG93X3N0YXJ0X29rOworCiBzdGF0aWMgX19pbml0ZGF0YSBjaGFyICptZXNzYWdlOwogc3RhdGljIHZvaWQgX19pbml0IGVycm9yKGNoYXIgKngpCiB7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGE5Mjk4OWUuLmVlZTU3NjQgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC03LDYgKzcsOCBAQAogICogIEFkZGVkIGluaXRyZCAmIGNoYW5nZV9yb290OiBXZXJuZXIgQWxtZXNiZXJnZXIgJiBIYW5zIExlcm1lbiwgRmViICc5NgogICogIE1vYW4gZWFybHkgaWYgZ2NjIGlzIG9sZCwgYXZvaWRpbmcgYm9ndXMga2VybmVscyAtIFBhdWwgR29ydG1ha2VyLCBNYXkgJzk2CiAgKiAgU2ltcGxpZmllZCBzdGFydGluZyBvZiBpbml0OiAgTWljaGFlbCBBLiBHcmlmZml0aCA8Z3JpZkBhY20ub3JnPiAKKyAqCisgKiAgMjAwNi0wMi0xMiBILiBQZXRlciBBbnZpbjogRWxpbWluYXRlZCBpbi1rZXJuZWwgcm9vdCBtb3VudGluZy4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQ4LDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CkBAIC0xMzUsNiArMTM4LDExIEBACiAvKiBTZXR1cCBjb25maWd1cmVkIG1heGltdW0gbnVtYmVyIG9mIENQVXMgdG8gYWN0aXZhdGUgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2NwdXMgPSBOUl9DUFVTOwogCisvKiBST09UX0RFViBjb250YWlucyBhbnkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGRlZmF1bHQgcm9vdCBkZXZpY2UuICovCisvKiByZWFsX3Jvb3RfZGV2IGlzIHVzZWQgKHZpYSBzeXNjdGwpIHRvIGNvbW11bmljYXRlIFJPT1RfREVWIHRvIGtpbml0LiAqLworZGV2X3QgUk9PVF9ERVY7Cit1bnNpZ25lZCBpbnQgcmVhbF9yb290X2RldjsKKwogLyoKICAqIElmIHNldCwgdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBkcml2ZXJzIHRoYXQgcmVzZXQgdGhlIHVuZGVybHlpbmcKICAqIGRldmljZSBiZWZvcmUgZ29pbmcgYWhlYWQgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gb3RoZXJ3aXNlIGRyaXZlciBtaWdodApAQCAtNzQxLDM1ICs3NDksMTUgQEAKIAlzeXN0ZW1fc3RhdGUgPSBTWVNURU1fUlVOTklORzsKIAludW1hX2RlZmF1bHRfcG9saWN5KCk7CiAKKwkvKiBUaGlzIGNvdWxkIGJlIGRvbmUgYnkgKGspaW5pdCBhcyB3ZWxsLi4uICovCiAJaWYgKHN5c19vcGVuKChjb25zdCBjaGFyIF9fdXNlciAqKSAiL2Rldi9jb25zb2xlIiwgT19SRFdSLCAwKSA8IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IHVuYWJsZSB0byBvcGVuIGFuIGluaXRpYWwgY29uc29sZS5cbiIpOwogCiAJKHZvaWQpIHN5c19kdXAoMCk7CiAJKHZvaWQpIHN5c19kdXAoMCk7CiAKLQlpZiAocmFtZGlza19leGVjdXRlX2NvbW1hbmQpIHsKLQkJcnVuX2luaXRfcHJvY2VzcyhyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBleGVjdXRlICVzXG4iLAotCQkJCXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kKTsKLQl9Ci0KLQkvKgotCSAqIFdlIHRyeSBlYWNoIG9mIHRoZXNlIHVudGlsIG9uZSBzdWNjZWVkcy4KLQkgKgotCSAqIFRoZSBCb3VybmUgc2hlbGwgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBpbml0IGlmIHdlIGFyZQotCSAqIHRyeWluZyB0byByZWNvdmVyIGEgcmVhbGx5IGJyb2tlbiBtYWNoaW5lLgotCSAqLwotCWlmIChleGVjdXRlX2NvbW1hbmQpIHsKLQkJcnVuX2luaXRfcHJvY2VzcyhleGVjdXRlX2NvbW1hbmQpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gZXhlY3V0ZSAlcy4gIEF0dGVtcHRpbmcgIgotCQkJCQkiZGVmYXVsdHMuLi5cbiIsIGV4ZWN1dGVfY29tbWFuZCk7Ci0JfQotCXJ1bl9pbml0X3Byb2Nlc3MoIi9zYmluL2luaXQiKTsKLQlydW5faW5pdF9wcm9jZXNzKCIvZXRjL2luaXQiKTsKLQlydW5faW5pdF9wcm9jZXNzKCIvYmluL2luaXQiKTsKLQlydW5faW5pdF9wcm9jZXNzKCIvYmluL3NoIik7Ci0KLQlwYW5pYygiTm8gaW5pdCBmb3VuZC4gIFRyeSBwYXNzaW5nIGluaXQ9IG9wdGlvbiB0byBrZXJuZWwuIik7CisJcnVuX2luaXRfcHJvY2VzcyhyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCk7CisJcGFuaWMoIkZhaWxlZCB0byBleGVjdXRlICVzIiwgcmFtZGlza19leGVjdXRlX2NvbW1hbmQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQgKiB1bnVzZWQpCkBAIC04MDMsNiArNzkxLDEyIEBACiAJZG9fYmFzaWNfc2V0dXAoKTsKIAogCS8qCisJICogSWYgd2UgaGF2ZSBhIHJvb3QgZGV2aWNlIHNldCBieSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgbWVhbnMsCisJICogbGV0IGtpbml0IGtub3cgYWJvdXQgaXQuCisJICovCisJcmVhbF9yb290X2RldiA9IG5ld19lbmNvZGVfZGV2KFJPT1RfREVWKTsKKworCS8qCiAJICogY2hlY2sgaWYgdGhlcmUgaXMgYW4gZWFybHkgdXNlcnNwYWNlIGluaXQuICBJZiB5ZXMsIGxldCBpdCBkbyBhbGwKIAkgKiB0aGUgd29yawogCSAqLwpAQCAtODEwLDExICs4MDQsNiBAQAogCWlmICghcmFtZGlza19leGVjdXRlX2NvbW1hbmQpCiAJCXJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kID0gIi9pbml0IjsKIAotCWlmIChzeXNfYWNjZXNzKChjb25zdCBjaGFyIF9fdXNlciAqKSByYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCwgMCkgIT0gMCkgewotCQlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCA9IE5VTEw7Ci0JCXByZXBhcmVfbmFtZXNwYWNlKCk7Ci0JfQotCiAJLyoKIAkgKiBPaywgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlIGluaXRpYWwgYm9vdHVwLCBhbmQKIAkgKiB3ZSdyZSBlc3NlbnRpYWxseSB1cCBhbmQgcnVubmluZy4gR2V0IHJpZCBvZiB0aGUKZGlmZiAtLWdpdCBhL2luaXQvbm9pbml0cmFtZnMuYyBiL2luaXQvbm9pbml0cmFtZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjMWEzYS4uMDAwMDAwMAotLS0gYS9pbml0L25vaW5pdHJhbWZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogaW5pdC9ub2luaXRyYW1mcy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCBOWFAgU2VtaWNvbmR1Y3RvcnMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqIEF1dGhvcjogSmVhbi1QYXVsIFNhbWFuIDxqZWFuLXBhdWwuc2FtYW5AbnhwLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLQotLyoKLSAqIENyZWF0ZSBhIHNpbXBsZSByb290ZnMgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBkZWZhdWx0IGluaXRyYW1mcwotICovCi1zdGF0aWMgaW50IF9faW5pdCBkZWZhdWx0X3Jvb3Rmcyh2b2lkKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBzeXNfbWtkaXIoIi9kZXYiLCAwNzU1KTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBzeXNfbWtub2QoKGNvbnN0IGNoYXIgX191c2VyICopICIvZGV2L2NvbnNvbGUiLAotCQkJU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSLAotCQkJbmV3X2VuY29kZV9kZXYoTUtERVYoNSwgMSkpKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSBzeXNfbWtkaXIoIi9yb290IiwgMDcwMCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JcmV0dXJuIDA7Ci0KLW91dDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gY3JlYXRlIGEgcm9vdGZzXG4iKTsKLQlyZXR1cm4gZXJyOwotfQotcm9vdGZzX2luaXRjYWxsKGRlZmF1bHRfcm9vdGZzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IDQwNmIyMGEuLmQyZTkzYTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtMjUsOCArMjUsNiBAQAogI2luY2x1ZGUgInBvd2VyLmgiCiAKIAotc3RhdGljIGludCBub3Jlc3VtZSA9IDA7Ci1jaGFyIHJlc3VtZV9maWxlWzI1Nl0gPSBDT05GSUdfUE1fU1REX1BBUlRJVElPTjsKIGRldl90IHN3c3VzcF9yZXN1bWVfZGV2aWNlOwogc2VjdG9yX3Qgc3dzdXNwX3Jlc3VtZV9ibG9jazsKIApAQCAtMjA2LDI2ICsyMDQsMTMgQEAKIAogCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAlpZiAoIXN3c3VzcF9yZXN1bWVfZGV2aWNlKSB7Ci0JCWlmICghc3RybGVuKHJlc3VtZV9maWxlKSkgewotCQkJbXV0ZXhfdW5sb2NrKCZwbV9tdXRleCk7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCQlzd3N1c3BfcmVzdW1lX2RldmljZSA9IG5hbWVfdG9fZGV2X3QocmVzdW1lX2ZpbGUpOwotCQlwcl9kZWJ1Zygic3dzdXNwOiBSZXN1bWUgRnJvbSBQYXJ0aXRpb24gJXNcbiIsIHJlc3VtZV9maWxlKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1Zygic3dzdXNwOiBSZXN1bWUgRnJvbSBQYXJ0aXRpb24gJWQ6JWRcbiIsCi0JCQkgTUFKT1Ioc3dzdXNwX3Jlc3VtZV9kZXZpY2UpLCBNSU5PUihzd3N1c3BfcmVzdW1lX2RldmljZSkpOwotCX0KLQotCWlmIChub3Jlc3VtZSkgewotCQkvKioKLQkJICogRklYTUU6IElmIG5vcmVzdW1lIGlzIHNwZWNpZmllZCwgd2UgbmVlZCB0byBmaW5kIHRoZSBwYXJ0aXRpb24KLQkJICogYW5kIHJlc2V0IGl0IGJhY2sgdG8gbm9ybWFsIHN3YXAgc3BhY2UuCi0JCSAqLwotCQltdXRleF91bmxvY2soJnBtX211dGV4KTsKKwkJcHJfZGVidWcoInN3c3VzcDogTm8gZGV2aWNlIGdpdmVuIVxuIik7CiAJCXJldHVybiAwOwogCX0KIAorCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlZDolZFxuIiwKKwkJIE1BSk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSwgTUlOT1Ioc3dzdXNwX3Jlc3VtZV9kZXZpY2UpKTsKKwogCXByX2RlYnVnKCJQTTogQ2hlY2tpbmcgc3dzdXNwIGltYWdlLlxuIik7CiAKIAllcnJvciA9IHN3c3VzcF9jaGVjaygpOwpAQCAtMjgxLDggKzI2Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWxhdGVfaW5pdGNhbGwoc29mdHdhcmVfcmVzdW1lKTsKLQogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBtX2Rpc2tfbW9kZXNbXSA9IHsKIAlbUE1fRElTS19GSVJNV0FSRV0JPSAiZmlybXdhcmUiLApAQCAtMzc4LDggKzM2MSw5IEBACiAJdW5zaWduZWQgaW50IG1haiwgbWluOwogCWRldl90IHJlczsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0ID0gMDsKIAotCWlmIChzc2NhbmYoYnVmLCAiJXU6JXUiLCAmbWFqLCAmbWluKSAhPSAyKQorCWlmIChzc2NhbmYoYnVmLCAiJXU6JXU6JWxsdSIsICZtYWosICZtaW4sICZvZmZzZXQpIDwgMikKIAkJZ290byBvdXQ7CiAKIAlyZXMgPSBNS0RFVihtYWosbWluKTsKQEAgLTM4OCw5ICszNzIsOSBAQAogCiAJbXV0ZXhfbG9jaygmcG1fbXV0ZXgpOwogCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gcmVzOworCXN3c3VzcF9yZXN1bWVfYmxvY2sgPSBvZmZzZXQ7CiAJbXV0ZXhfdW5sb2NrKCZwbV9tdXRleCk7CiAJcHJpbnRrKCJBdHRlbXB0aW5nIG1hbnVhbCByZXN1bWVcbiIpOwotCW5vcmVzdW1lID0gMDsKIAlzb2Z0d2FyZV9yZXN1bWUoKTsKIAlyZXQgPSBuOwogIG91dDoKQEAgLTQzNywzNiArNDIxLDMgQEAKIH0KIAogY29yZV9pbml0Y2FsbChwbV9kaXNrX2luaXQpOwotCi0KLXN0YXRpYyBpbnQgX19pbml0IHJlc3VtZV9zZXR1cChjaGFyICpzdHIpCi17Ci0JaWYgKG5vcmVzdW1lKQotCQlyZXR1cm4gMTsKLQotCXN0cm5jcHkoIHJlc3VtZV9maWxlLCBzdHIsIDI1NSApOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCByZXN1bWVfb2Zmc2V0X3NldHVwKGNoYXIgKnN0cikKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0OwotCi0JaWYgKG5vcmVzdW1lKQotCQlyZXR1cm4gMTsKLQotCWlmIChzc2NhbmYoc3RyLCAiJWxsdSIsICZvZmZzZXQpID09IDEpCi0JCXN3c3VzcF9yZXN1bWVfYmxvY2sgPSBvZmZzZXQ7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbm9yZXN1bWVfc2V0dXAoY2hhciAqc3RyKQotewotCW5vcmVzdW1lID0gMTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgibm9yZXN1bWUiLCBub3Jlc3VtZV9zZXR1cCk7Ci1fX3NldHVwKCJyZXN1bWVfb2Zmc2V0PSIsIHJlc3VtZV9vZmZzZXRfc2V0dXApOwotX19zZXR1cCgicmVzdW1lPSIsIHJlc3VtZV9zZXR1cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9NYWtlZmlsZSBiL25ldC9pcHY0L01ha2VmaWxlCmluZGV4IDdhMDY4NjIuLmY5ZTMwMzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L01ha2VmaWxlCisrKyBiL25ldC9pcHY0L01ha2VmaWxlCkBAIC0yOCw3ICsyOCw2IEBACiBvYmotJChDT05GSUdfSU5FVF9UVU5ORUwpICs9IHR1bm5lbDQubwogb2JqLSQoQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCkgKz0geGZybTRfbW9kZV90cmFuc3BvcnQubwogb2JqLSQoQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCkgKz0geGZybTRfbW9kZV90dW5uZWwubwotb2JqLSQoQ09ORklHX0lQX1BOUCkgKz0gaXBjb25maWcubwogb2JqLSQoQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9SUikgKz0gbXVsdGlwYXRoX3JyLm8KIG9iai0kKENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfUkFORE9NKSArPSBtdWx0aXBhdGhfcmFuZG9tLm8KIG9iai0kKENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfV1JBTkRPTSkgKz0gbXVsdGlwYXRoX3dyYW5kb20ubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb25maWcuYyBiL25ldC9pcHY0L2lwY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDlkZTEuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvaXBjb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MTAgKzAsMCBAQAotLyoKLSAqICAkSWQ6IGlwY29uZmlnLmMsdiAxLjQ2IDIwMDIvMDIvMDEgMjI6MDE6MDQgZGF2ZW0gRXhwICQKLSAqCi0gKiAgQXV0b21hdGljIENvbmZpZ3VyYXRpb24gb2YgSVAgLS0gdXNlIERIQ1AsIEJPT1RQLCBSQVJQLCBvcgotICogIHVzZXItc3VwcGxpZWQgaW5mb3JtYXRpb24gdG8gY29uZmlndXJlIG93biBJUCBhZGRyZXNzIGFuZCByb3V0ZXMuCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PgotICoKLSAqICBEZXJpdmVkIGZyb20gbmV0d29yayBjb25maWd1cmF0aW9uIGNvZGUgaW4gZnMvbmZzL25mc3Jvb3QuYywKLSAqICBvcmlnaW5hbGx5IENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBHZXJvIEt1aGxtYW5uIGFuZCBtZS4KLSAqCi0gKiAgQk9PVFAgcmV3cml0dGVuIHRvIGNvbnN0cnVjdCBhbmQgYW5hbHlzZSBwYWNrZXRzIGl0c2VsZiBpbnN0ZWFkCi0gKiAgb2YgbWlzdXNpbmcgdGhlIElQIGxheWVyLiBudW1fYnVnc19jYXVzaW5nX3dyb25nX2FycF9yZXBsaWVzLS07Ci0gKgkJCQkJICAgICAtLSBNSiwgRGVjZW1iZXIgMTk5OAotICoKLSAqICBGaXhlZCBpcF9hdXRvX2NvbmZpZ19zZXR1cCBjYWxsaW5nIGF0IHN0YXJ0dXAgaW4gdGhlIG5ldyAiTGlua2VyIE1hZ2ljIgotICogIGluaXRpYWxpemF0aW9uIHNjaGVtZS4KLSAqCS0gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+LCAwOC8xMS8xOTk5Ci0gKgotICogIERIQ1Agc3VwcG9ydCBhZGRlZC4gIFRvIHVzZXJzIHRoaXMgbG9va3MgbGlrZSBhIHdob2xlIHNlcGFyYXRlCi0gKiAgcHJvdG9jb2wsIGJ1dCB3ZSBrbm93IGl0J3MganVzdCBhIGJhZyBvbiB0aGUgc2lkZSBvZiBCT09UUC4KLSAqCQktLSBDaGlwIFNhbHplbmJlcmcgPGNoaXBAdmFsaW51eC5jb20+LCBNYXkgMjAwMAotICoKLSAqICBQb3J0ZWQgREhDUCBzdXBwb3J0IGZyb20gMi4yLjE2IHRvIDIuNC4wLXRlc3Q0Ci0gKiAgICAgICAgICAgICAgLS0gRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtYW5AbG54aS5jb20+LCAzMCBBdWcgMjAwMAotICoKLSAqICBNZXJnZWQgY2hhbmdlcyBmcm9tIDIuMi4xOSBpbnRvIDIuNC4zCi0gKiAgICAgICAgICAgICAgLS0gRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtYW5AbG54aS5jb20+LCAyMiBBcHJpbCBBdWcgMjAwMQotICoKLSAqICBNdWx0aXBsZSBOYW1lc2VydmVycyBpbiAvcHJvYy9uZXQvcG5wCi0gKiAgICAgICAgICAgICAgLS0gIEpvc2VmIFNpZW1lcyA8anNpZW1lc0B3ZWIuZGU+LCBBdWcgMjAwMgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaWYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcm91dGUuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KLSNpbmNsdWRlIDxuZXQvYXJwLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2lwY29uZmlnLmg+Ci0jaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLQotLyogRGVmaW5lIHRoaXMgdG8gYWxsb3cgZGVidWdnaW5nIG91dHB1dCAqLwotI3VuZGVmIElQQ09ORklHX0RFQlVHCi0KLSNpZmRlZiBJUENPTkZJR19ERUJVRwotI2RlZmluZSBEQkcoeCkgcHJpbnRrIHgKLSNlbHNlCi0jZGVmaW5lIERCRyh4KSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfUE5QX0RIQ1ApCi0jZGVmaW5lIElQQ09ORklHX0RIQ1AKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0lQX1BOUF9CT09UUCkgfHwgZGVmaW5lZChDT05GSUdfSVBfUE5QX0RIQ1ApCi0jZGVmaW5lIElQQ09ORklHX0JPT1RQCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9QTlBfUkFSUCkKLSNkZWZpbmUgSVBDT05GSUdfUkFSUAotI2VuZGlmCi0jaWYgZGVmaW5lZChJUENPTkZJR19CT09UUCkgfHwgZGVmaW5lZChJUENPTkZJR19SQVJQKQotI2RlZmluZSBJUENPTkZJR19EWU5BTUlDCi0jZW5kaWYKLQotLyogRGVmaW5lIHRoZSBmcmllbmRseSBkZWxheSBiZWZvcmUgYW5kIGFmdGVyIG9wZW5pbmcgbmV0IGRldmljZXMgKi8KLSNkZWZpbmUgQ09ORl9QUkVfT1BFTgkJNTAwCS8qIEJlZm9yZSBvcGVuaW5nOiAxLzIgc2Vjb25kICovCi0jZGVmaW5lIENPTkZfUE9TVF9PUEVOCQkxCS8qIEFmdGVyIG9wZW5pbmc6IDEgc2Vjb25kICovCi0KLS8qIERlZmluZSB0aGUgdGltZW91dCBmb3Igd2FpdGluZyBmb3IgYSBESENQL0JPT1RQL1JBUlAgcmVwbHkgKi8KLSNkZWZpbmUgQ09ORl9PUEVOX1JFVFJJRVMgCTIJLyogKFJlKW9wZW4gZGV2aWNlcyB0d2ljZSAqLwotI2RlZmluZSBDT05GX1NFTkRfUkVUUklFUyAJNgkvKiBTZW5kIHNpeCByZXF1ZXN0cyBwZXIgb3BlbiAqLwotI2RlZmluZSBDT05GX0lOVEVSX1RJTUVPVVQJKEhaLzIpCS8qIEludGVyLWRldmljZSB0aW1lb3V0OiAxLzIgc2Vjb25kICovCi0jZGVmaW5lIENPTkZfQkFTRV9USU1FT1VUCShIWioyKQkvKiBJbml0aWFsIHRpbWVvdXQ6IDIgc2Vjb25kcyAqLwotI2RlZmluZSBDT05GX1RJTUVPVVRfUkFORE9NCShIWikJLyogTWF4aW11bSBhbW91bnQgb2YgcmFuZG9taXphdGlvbiAqLwotI2RlZmluZSBDT05GX1RJTUVPVVRfTVVMVAkqNy80CS8qIFJhdGUgb2YgdGltZW91dCBncm93dGggKi8KLSNkZWZpbmUgQ09ORl9USU1FT1VUX01BWAkoSFoqMzApCS8qIE1heGltdW0gYWxsb3dlZCB0aW1lb3V0ICovCi0jZGVmaW5lIENPTkZfTkFNRVNFUlZFUlNfTUFYICAgMyAgICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBuYW1lc2VydmVycwotCQkJCQkgICAtICczJyBmcm9tIHJlc29sdi5oICovCi0KLSNkZWZpbmUgTk9ORSBfX2NvbnN0YW50X2h0b25sKElOQUREUl9OT05FKQotCi0vKgotICogUHVibGljIElQIGNvbmZpZ3VyYXRpb24KLSAqLwotCi0vKiBUaGlzIGlzIHVzZWQgYnkgcGxhdGZvcm1zIHdoaWNoIG1pZ2h0IGJlIGFibGUgdG8gc2V0IHRoZSBpcGNvbmZpZwotICogdmFyaWFibGVzIHVzaW5nIGZpcm13YXJlIGVudmlyb25tZW50IHZhcnMuICBJZiB0aGlzIGlzIHNldCwgaXQgd2lsbAotICogaWdub3JlIHN1Y2ggZmlybXdhcmUgdmFyaWFibGVzLgotICovCi1pbnQgaWNfc2V0X21hbnVhbGx5IF9faW5pdGRhdGEgPSAwOwkJLyogSVBjb25maWcgcGFyYW1ldGVycyBzZXQgbWFudWFsbHkgKi8KLQotc3RhdGljIGludCBpY19lbmFibGUgX19pbml0ZGF0YSA9IDA7CQkvKiBJUCBjb25maWcgZW5hYmxlZD8gKi8KLQotLyogUHJvdG9jb2wgY2hvaWNlICovCi1pbnQgaWNfcHJvdG9fZW5hYmxlZCBfX2luaXRkYXRhID0gMAotI2lmZGVmIElQQ09ORklHX0JPT1RQCi0JCQl8IElDX0JPT1RQCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSVBfUE5QX0RIQ1AKLQkJCXwgSUNfVVNFX0RIQ1AKLSNlbmRpZgotI2lmZGVmIElQQ09ORklHX1JBUlAKLQkJCXwgSUNfUkFSUAotI2VuZGlmCi0JCQk7Ci0KLXN0YXRpYyBpbnQgaWNfaG9zdF9uYW1lX3NldCBfX2luaXRkYXRhID0gMDsJLyogSG9zdCBuYW1lIHNldCBieSB1cz8gKi8KLQotX19iZTMyIGljX215YWRkciA9IE5PTkU7CQkvKiBNeSBJUCBhZGRyZXNzICovCi1zdGF0aWMgX19iZTMyIGljX25ldG1hc2sgPSBOT05FOwkvKiBOZXRtYXNrIGZvciBsb2NhbCBzdWJuZXQgKi8KLV9fYmUzMiBpY19nYXRld2F5ID0gTk9ORTsJLyogR2F0ZXdheSBJUCBhZGRyZXNzICovCi0KLV9fYmUzMiBpY19zZXJ2YWRkciA9IE5PTkU7CS8qIEJvb3Qgc2VydmVyIElQIGFkZHJlc3MgKi8KLQotX19iZTMyIHJvb3Rfc2VydmVyX2FkZHIgPSBOT05FOwkvKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8KLXU4IHJvb3Rfc2VydmVyX3BhdGhbMjU2XSA9IHsgMCwgfTsJLyogUGF0aCB0byBtb3VudCBhcyByb290ICovCi0KLS8qIFBlcnNpc3RlbnQgZGF0YTogKi8KLQotc3RhdGljIGludCBpY19wcm90b191c2VkOwkJCS8qIFByb3RvY29sIHVzZWQsIGlmIGFueSAqLwotc3RhdGljIF9fYmUzMiBpY19uYW1lc2VydmVyc1tDT05GX05BTUVTRVJWRVJTX01BWF07IC8qIEROUyBTZXJ2ZXIgSVAgYWRkcmVzc2VzICovCi1zdGF0aWMgdTggaWNfZG9tYWluWzY0XTsJCS8qIEROUyAobm90IE5JUykgZG9tYWluIG5hbWUgKi8KLQotLyoKLSAqIFByaXZhdGUgc3RhdGUuCi0gKi8KLQotLyogTmFtZSBvZiB1c2VyLXNlbGVjdGVkIGJvb3QgZGV2aWNlICovCi1zdGF0aWMgY2hhciB1c2VyX2Rldl9uYW1lW0lGTkFNU0laXSBfX2luaXRkYXRhID0geyAwLCB9OwotCi0vKiBQcm90b2NvbHMgc3VwcG9ydGVkIGJ5IGF2YWlsYWJsZSBpbnRlcmZhY2VzICovCi1zdGF0aWMgaW50IGljX3Byb3RvX2hhdmVfaWYgX19pbml0ZGF0YSA9IDA7Ci0KLSNpZmRlZiBJUENPTkZJR19EWU5BTUlDCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGljX3JlY3ZfbG9jayk7Ci1zdGF0aWMgdm9sYXRpbGUgaW50IGljX2dvdF9yZXBseSBfX2luaXRkYXRhID0gMDsgICAgLyogUHJvdG8ocykgdGhhdCByZXBsaWVkICovCi0jZW5kaWYKLSNpZmRlZiBJUENPTkZJR19ESENQCi1zdGF0aWMgaW50IGljX2RoY3BfbXNndHlwZSBfX2luaXRkYXRhID0gMDsJLyogREhDUCBtc2cgdHlwZSByZWNlaXZlZCAqLwotI2VuZGlmCi0KLQotLyoKLSAqCU5ldHdvcmsgZGV2aWNlcwotICovCi0KLXN0cnVjdCBpY19kZXZpY2UgewotCXN0cnVjdCBpY19kZXZpY2UgKm5leHQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBzaG9ydCBmbGFnczsKLQlzaG9ydCBhYmxlOwotCV9fYmUzMiB4aWQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGljX2RldmljZSAqaWNfZmlyc3RfZGV2IF9faW5pdGRhdGEgPSBOVUxMOy8qIExpc3Qgb2Ygb3BlbiBkZXZpY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaWNfZGV2IF9faW5pdGRhdGEgPSBOVUxMOwkvKiBTZWxlY3RlZCBkZXZpY2UgKi8KLQotc3RhdGljIGludCBfX2luaXQgaWNfb3Blbl9kZXZzKHZvaWQpCi17Ci0Jc3RydWN0IGljX2RldmljZSAqZCwgKipsYXN0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgc2hvcnQgb2ZsYWdzOwotCi0JbGFzdCA9ICZpY19maXJzdF9kZXY7Ci0JcnRubF9sb2NrKCk7Ci0KLQkvKiBicmluZyBsb29wYmFjayBkZXZpY2UgdXAgZmlyc3QgKi8KLQlpZiAoZGV2X2NoYW5nZV9mbGFncygmbG9vcGJhY2tfZGV2LCBsb29wYmFja19kZXYuZmxhZ3MgfCBJRkZfVVApIDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IEZhaWxlZCB0byBvcGVuICVzXG4iLCBsb29wYmFja19kZXYubmFtZSk7Ci0KLQlmb3IgKGRldiA9IGRldl9iYXNlOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgewotCQlpZiAoZGV2ID09ICZsb29wYmFja19kZXYpCi0JCQljb250aW51ZTsKLQkJaWYgKHVzZXJfZGV2X25hbWVbMF0gPyAhc3RyY21wKGRldi0+bmFtZSwgdXNlcl9kZXZfbmFtZSkgOgotCQkgICAgKCEoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKLQkJICAgICAoZGV2LT5mbGFncyAmIChJRkZfUE9JTlRPUE9JTlR8SUZGX0JST0FEQ0FTVCkpICYmCi0JCSAgICAgc3RybmNtcChkZXYtPm5hbWUsICJkdW1teSIsIDUpKSkgewotCQkJaW50IGFibGUgPSAwOwotCQkJaWYgKGRldi0+bXR1ID49IDM2NCkKLQkJCQlhYmxlIHw9IElDX0JPT1RQOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRIQ1AvQk9PVFA6IElnbm9yaW5nIGRldmljZSAlcywgTVRVICVkIHRvbyBzbWFsbCIsIGRldi0+bmFtZSwgZGV2LT5tdHUpOwotCQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9OT0FSUCkpCi0JCQkJYWJsZSB8PSBJQ19SQVJQOwotCQkJYWJsZSAmPSBpY19wcm90b19lbmFibGVkOwotCQkJaWYgKGljX3Byb3RvX2VuYWJsZWQgJiYgIWFibGUpCi0JCQkJY29udGludWU7Ci0JCQlvZmxhZ3MgPSBkZXYtPmZsYWdzOwotCQkJaWYgKGRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBvZmxhZ3MgfCBJRkZfVVApIDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBGYWlsZWQgdG8gb3BlbiAlc1xuIiwgZGV2LT5uYW1lKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghKGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWNfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCQkJcnRubF91bmxvY2soKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlkLT5kZXYgPSBkZXY7Ci0JCQkqbGFzdCA9IGQ7Ci0JCQlsYXN0ID0gJmQtPm5leHQ7Ci0JCQlkLT5mbGFncyA9IG9mbGFnczsKLQkJCWQtPmFibGUgPSBhYmxlOwotCQkJaWYgKGFibGUgJiBJQ19CT09UUCkKLQkJCQlnZXRfcmFuZG9tX2J5dGVzKCZkLT54aWQsIHNpemVvZihfX2JlMzIpKTsKLQkJCWVsc2UKLQkJCQlkLT54aWQgPSAwOwotCQkJaWNfcHJvdG9faGF2ZV9pZiB8PSBhYmxlOwotCQkJREJHKCgiSVAtQ29uZmlnOiAlcyBVUCAoYWJsZT0lZCwgeGlkPSUwOHgpXG4iLAotCQkJCWRldi0+bmFtZSwgYWJsZSwgZC0+eGlkKSk7Ci0JCX0KLQl9Ci0JcnRubF91bmxvY2soKTsKLQotCSpsYXN0ID0gTlVMTDsKLQotCWlmICghaWNfZmlyc3RfZGV2KSB7Ci0JCWlmICh1c2VyX2Rldl9uYW1lWzBdKQotCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IERldmljZSBgJXMnIG5vdCBmb3VuZC5cbiIsIHVzZXJfZGV2X25hbWUpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogTm8gbmV0d29yayBkZXZpY2VzIGF2YWlsYWJsZS5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaWNfY2xvc2VfZGV2cyh2b2lkKQotewotCXN0cnVjdCBpY19kZXZpY2UgKmQsICpuZXh0OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0KLQlydG5sX2xvY2soKTsKLQluZXh0ID0gaWNfZmlyc3RfZGV2OwotCXdoaWxlICgoZCA9IG5leHQpKSB7Ci0JCW5leHQgPSBkLT5uZXh0OwotCQlkZXYgPSBkLT5kZXY7Ci0JCWlmIChkZXYgIT0gaWNfZGV2KSB7Ci0JCQlEQkcoKCJJUC1Db25maWc6IERvd25pbmcgJXNcbiIsIGRldi0+bmFtZSkpOwotCQkJZGV2X2NoYW5nZV9mbGFncyhkZXYsIGQtPmZsYWdzKTsKLQkJfQotCQlrZnJlZShkKTsKLQl9Ci0JcnRubF91bmxvY2soKTsKLX0KLQotLyoKLSAqCUludGVyZmFjZSB0byB2YXJpb3VzIG5ldHdvcmsgZnVuY3Rpb25zLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBfX2JlMzIgYWRkciwgX19iZTE2IHBvcnQpCi17Ci0Jc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7Ci0Jc2luLT5zaW5fcG9ydCA9IHBvcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGljX2Rldl9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgaWZyZXEgKmFyZykKLXsKLQlpbnQgcmVzOwotCi0JbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7Ci0Jc2V0X2ZzKGdldF9kcygpKTsKLQlyZXMgPSBkZXZpbmV0X2lvY3RsKGNtZCwgKHN0cnVjdCBpZnJlcSBfX3VzZXIgKikgYXJnKTsKLQlzZXRfZnMob2xkZnMpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGljX3JvdXRlX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBydGVudHJ5ICphcmcpCi17Ci0JaW50IHJlczsKLQotCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOwotCXNldF9mcyhnZXRfZHMoKSk7Ci0JcmVzID0gaXBfcnRfaW9jdGwoY21kLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKLQlzZXRfZnMob2xkZnMpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKglTZXQgdXAgaW50ZXJmYWNlIGFkZHJlc3NlcyBhbmQgcm91dGVzLgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGljX3NldHVwX2lmKHZvaWQpCi17Ci0Jc3RydWN0IGlmcmVxIGlyOwotCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHZvaWQgKikgJmlyLmlmcl9pZnJ1LmlmcnVfYWRkcjsKLQlpbnQgZXJyOwotCi0JbWVtc2V0KCZpciwgMCwgc2l6ZW9mKGlyKSk7Ci0Jc3RyY3B5KGlyLmlmcl9pZnJuLmlmcm5fbmFtZSwgaWNfZGV2LT5uYW1lKTsKLQlzZXRfc29ja2FkZHIoc2luLCBpY19teWFkZHIsIDApOwotCWlmICgoZXJyID0gaWNfZGV2X2lvY3RsKFNJT0NTSUZBRERSLCAmaXIpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IFVuYWJsZSB0byBzZXQgaW50ZXJmYWNlIGFkZHJlc3MgKCVkKS5cbiIsIGVycik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2V0X3NvY2thZGRyKHNpbiwgaWNfbmV0bWFzaywgMCk7Ci0JaWYgKChlcnIgPSBpY19kZXZfaW9jdGwoU0lPQ1NJRk5FVE1BU0ssICZpcikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogVW5hYmxlIHRvIHNldCBpbnRlcmZhY2UgbmV0bWFzayAoJWQpLlxuIiwgZXJyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzZXRfc29ja2FkZHIoc2luLCBpY19teWFkZHIgfCB+aWNfbmV0bWFzaywgMCk7Ci0JaWYgKChlcnIgPSBpY19kZXZfaW9jdGwoU0lPQ1NJRkJSREFERFIsICZpcikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogVW5hYmxlIHRvIHNldCBpbnRlcmZhY2UgYnJvYWRjYXN0IGFkZHJlc3MgKCVkKS5cbiIsIGVycik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGljX3NldHVwX3JvdXRlcyh2b2lkKQotewotCS8qIE5vIG5lZWQgdG8gc2V0dXAgZGV2aWNlIHJvdXRlcywgb25seSB0aGUgZGVmYXVsdCByb3V0ZS4uLiAqLwotCi0JaWYgKGljX2dhdGV3YXkgIT0gTk9ORSkgewotCQlzdHJ1Y3QgcnRlbnRyeSBybTsKLQkJaW50IGVycjsKLQotCQltZW1zZXQoJnJtLCAwLCBzaXplb2Yocm0pKTsKLQkJaWYgKChpY19nYXRld2F5IF4gaWNfbXlhZGRyKSAmIGljX25ldG1hc2spIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBHYXRld2F5IG5vdCBvbiBkaXJlY3RseSBjb25uZWN0ZWQgbmV0d29yay5cbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZybS5ydF9kc3QsIDAsIDApOwotCQlzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcm0ucnRfZ2VubWFzaywgMCwgMCk7Ci0JCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZybS5ydF9nYXRld2F5LCBpY19nYXRld2F5LCAwKTsKLQkJcm0ucnRfZmxhZ3MgPSBSVEZfVVAgfCBSVEZfR0FURVdBWTsKLQkJaWYgKChlcnIgPSBpY19yb3V0ZV9pb2N0bChTSU9DQUREUlQsICZybSkpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IENhbm5vdCBhZGQgZGVmYXVsdCByb3V0ZSAoJWQpLlxuIiwgZXJyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICoJRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG1pc3NpbmcgcGFyYW1ldGVycy4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBpY19kZWZhdWx0cyh2b2lkKQotewotCS8qCi0JICoJQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHVzZXJzcGFjZSBydW5uaW5nIHNvIG5lZWQgbm90Ci0JICoJY2xhaW0gbG9ja3Mgb24gc3lzdGVtX3V0c25hbWUKLQkgKi8KLQotCWlmICghaWNfaG9zdF9uYW1lX3NldCkKLQkJc3ByaW50Zihpbml0X3V0c25hbWUoKS0+bm9kZW5hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfbXlhZGRyKSk7Ci0KLQlpZiAocm9vdF9zZXJ2ZXJfYWRkciA9PSBOT05FKQotCQlyb290X3NlcnZlcl9hZGRyID0gaWNfc2VydmFkZHI7Ci0KLQlpZiAoaWNfbmV0bWFzayA9PSBOT05FKSB7Ci0JCWlmIChJTl9DTEFTU0EobnRvaGwoaWNfbXlhZGRyKSkpCi0JCQlpY19uZXRtYXNrID0gaHRvbmwoSU5fQ0xBU1NBX05FVCk7Ci0JCWVsc2UgaWYgKElOX0NMQVNTQihudG9obChpY19teWFkZHIpKSkKLQkJCWljX25ldG1hc2sgPSBodG9ubChJTl9DTEFTU0JfTkVUKTsKLQkJZWxzZSBpZiAoSU5fQ0xBU1NDKG50b2hsKGljX215YWRkcikpKQotCQkJaWNfbmV0bWFzayA9IGh0b25sKElOX0NMQVNTQ19ORVQpOwotCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiSVAtQ29uZmlnOiBVbmFibGUgdG8gZ3Vlc3MgbmV0bWFzayBmb3IgYWRkcmVzcyAldS4ldS4ldS4ldVxuIiwKLQkJCQlOSVBRVUFEKGljX215YWRkcikpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXByaW50aygiSVAtQ29uZmlnOiBHdWVzc2luZyBuZXRtYXNrICV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGljX25ldG1hc2spKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqCVJBUlAgc3VwcG9ydC4KLSAqLwotCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCi1zdGF0aWMgaW50IGljX3JhcnBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpOwotCi1zdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIHJhcnBfcGFja2V0X3R5cGUgX19pbml0ZGF0YSA9IHsKLQkudHlwZSA9CV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUkFSUCksCi0JLmZ1bmMgPQlpY19yYXJwX3JlY3YsCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaWNfcmFycF9pbml0KHZvaWQpCi17Ci0JZGV2X2FkZF9wYWNrKCZyYXJwX3BhY2tldF90eXBlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGljX3JhcnBfY2xlYW51cCh2b2lkKQotewotCWRldl9yZW1vdmVfcGFjaygmcmFycF9wYWNrZXRfdHlwZSk7Ci19Ci0KLS8qCi0gKiAgUHJvY2VzcyByZWNlaXZlZCBSQVJQIHBhY2tldC4KLSAqLwotc3RhdGljIGludCBfX2luaXQKLWljX3JhcnBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCi17Ci0Jc3RydWN0IGFycGhkciAqcmFycDsKLQl1bnNpZ25lZCBjaGFyICpyYXJwX3B0cjsKLQlfX2JlMzIgc2lwLCB0aXA7Ci0JdW5zaWduZWQgY2hhciAqc2hhLCAqdGhhOwkJLyogcyBmb3IgInNvdXJjZSIsIHQgZm9yICJ0YXJnZXQiICovCi0Jc3RydWN0IGljX2RldmljZSAqZDsKLQotCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSkpCi0JCWdvdG8gZHJvcDsKLQotCS8qIEJhc2ljIHNhbml0eSBjaGVja3MgY2FuIGJlIGRvbmUgd2l0aG91dCB0aGUgbG9jay4gICovCi0JcmFycCA9IChzdHJ1Y3QgYXJwaGRyICopc2tiLT5oLnJhdzsKLQotCS8qIElmIHRoaXMgdGVzdCBkb2Vzbid0IHBhc3MsIGl0J3Mgbm90IElQLCBvciB3ZSBzaG91bGQKLQkgKiBpZ25vcmUgaXQgYW55d2F5LgotCSAqLwotCWlmIChyYXJwLT5hcl9obG4gIT0gZGV2LT5hZGRyX2xlbiB8fCBkZXYtPnR5cGUgIT0gbnRvaHMocmFycC0+YXJfaHJkKSkKLQkJZ290byBkcm9wOwotCi0JLyogSWYgaXQncyBub3QgYSBSQVJQIHJlcGx5LCBkZWxldGUgaXQuICovCi0JaWYgKHJhcnAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JSRVBMWSkpCi0JCWdvdG8gZHJvcDsKLQotCS8qIElmIGl0J3Mgbm90IEV0aGVybmV0LCBkZWxldGUgaXQuICovCi0JaWYgKHJhcnAtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkpCi0JCWdvdG8gZHJvcDsKLQotCWlmICghcHNrYl9tYXlfcHVsbChza2IsCi0JCQkgICBzaXplb2Yoc3RydWN0IGFycGhkcikgKwotCQkJICAgKDIgKiBkZXYtPmFkZHJfbGVuKSArCi0JCQkgICAoMiAqIDQpKSkKLQkJZ290byBkcm9wOwotCi0JLyogT0ssIGl0IGlzIGFsbCB0aGVyZSBhbmQgbG9va3MgdmFsaWQsIHByb2Nlc3MuLi4gKi8KLQlyYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2ItPmgucmF3OwotCXJhcnBfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgKHJhcnAgKyAxKTsKLQotCS8qIE9uZSByZXBseSBhdCBhIHRpbWUsIHBsZWFzZS4gKi8KLQlzcGluX2xvY2soJmljX3JlY3ZfbG9jayk7Ci0KLQkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXBseSwganVzdCBkcm9wIHRoZSBwYWNrZXQgKi8KLQlpZiAoaWNfZ290X3JlcGx5KQotCQlnb3RvIGRyb3BfdW5sb2NrOwotCi0JLyogRmluZCB0aGUgaWNfZGV2aWNlIHRoYXQgdGhlIHBhY2tldCBhcnJpdmVkIG9uICovCi0JZCA9IGljX2ZpcnN0X2RldjsKLQl3aGlsZSAoZCAmJiBkLT5kZXYgIT0gZGV2KQotCQlkID0gZC0+bmV4dDsKLQlpZiAoIWQpCi0JCWdvdG8gZHJvcF91bmxvY2s7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLQotCS8qIEV4dHJhY3QgdmFyaWFibGUtd2lkdGggZmllbGRzICovCi0Jc2hhID0gcmFycF9wdHI7Ci0JcmFycF9wdHIgKz0gZGV2LT5hZGRyX2xlbjsKLQltZW1jcHkoJnNpcCwgcmFycF9wdHIsIDQpOwotCXJhcnBfcHRyICs9IDQ7Ci0JdGhhID0gcmFycF9wdHI7Ci0JcmFycF9wdHIgKz0gZGV2LT5hZGRyX2xlbjsKLQltZW1jcHkoJnRpcCwgcmFycF9wdHIsIDQpOwotCi0JLyogRGlzY2FyZCBwYWNrZXRzIHdoaWNoIGFyZSBub3QgbWVhbnQgZm9yIHVzLiAqLwotCWlmIChtZW1jbXAodGhhLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKSkKLQkJZ290byBkcm9wX3VubG9jazsKLQotCS8qIERpc2NhcmQgcGFja2V0cyB3aGljaCBhcmUgbm90IGZyb20gc3BlY2lmaWVkIHNlcnZlci4gKi8KLQlpZiAoaWNfc2VydmFkZHIgIT0gTk9ORSAmJiBpY19zZXJ2YWRkciAhPSBzaXApCi0JCWdvdG8gZHJvcF91bmxvY2s7Ci0KLQkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwotCWljX2RldiA9IGRldjsKLQlpZiAoaWNfbXlhZGRyID09IE5PTkUpCi0JCWljX215YWRkciA9IHRpcDsKLQlpY19zZXJ2YWRkciA9IHNpcDsKLQlpY19nb3RfcmVwbHkgPSBJQ19SQVJQOwotCi1kcm9wX3VubG9jazoKLQkvKiBTaG93J3Mgb3Zlci4gIE5vdGhpbmcgdG8gc2VlIGhlcmUuICAqLwotCXNwaW5fdW5sb2NrKCZpY19yZWN2X2xvY2spOwotCi1kcm9wOgotCS8qIFRocm93IHRoZSBwYWNrZXQgb3V0LiAqLwotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiAgU2VuZCBSQVJQIHJlcXVlc3QgcGFja2V0IG92ZXIgYSBzaW5nbGUgaW50ZXJmYWNlLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaWNfcmFycF9zZW5kX2lmKHN0cnVjdCBpY19kZXZpY2UgKmQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGQtPmRldjsKLQlhcnBfc2VuZChBUlBPUF9SUkVRVUVTVCwgRVRIX1BfUkFSUCwgMCwgZGV2LCAwLCBOVUxMLAotCQkgZGV2LT5kZXZfYWRkciwgZGV2LT5kZXZfYWRkcik7Ci19Ci0jZW5kaWYKLQotLyoKLSAqCURIQ1AvQk9PVFAgc3VwcG9ydC4KLSAqLwotCi0jaWZkZWYgSVBDT05GSUdfQk9PVFAKLQotc3RydWN0IGJvb3RwX3BrdCB7CQkvKiBCT09UUCBwYWNrZXQgZm9ybWF0ICovCi0Jc3RydWN0IGlwaGRyIGlwaDsJLyogSVAgaGVhZGVyICovCi0Jc3RydWN0IHVkcGhkciB1ZHBoOwkvKiBVRFAgaGVhZGVyICovCi0JdTggb3A7CQkJLyogMT1yZXF1ZXN0LCAyPXJlcGx5ICovCi0JdTggaHR5cGU7CQkvKiBIVyBhZGRyZXNzIHR5cGUgKi8KLQl1OCBobGVuOwkJLyogSFcgYWRkcmVzcyBsZW5ndGggKi8KLQl1OCBob3BzOwkJLyogVXNlZCBvbmx5IGJ5IGdhdGV3YXlzICovCi0JX19iZTMyIHhpZDsJCS8qIFRyYW5zYWN0aW9uIElEICovCi0JX19iZTE2IHNlY3M7CQkvKiBTZWNvbmRzIHNpbmNlIHdlIHN0YXJ0ZWQgKi8KLQlfX2JlMTYgZmxhZ3M7CQkvKiBKdXN0IHdoYXQgaXQgc2F5cyAqLwotCV9fYmUzMiBjbGllbnRfaXA7CQkvKiBDbGllbnQncyBJUCBhZGRyZXNzIGlmIGtub3duICovCi0JX19iZTMyIHlvdXJfaXA7CQkvKiBBc3NpZ25lZCBJUCBhZGRyZXNzICovCi0JX19iZTMyIHNlcnZlcl9pcDsJCS8qIChOZXh0LCBlLmcuIE5GUykgU2VydmVyJ3MgSVAgYWRkcmVzcyAqLwotCV9fYmUzMiByZWxheV9pcDsJCS8qIElQIGFkZHJlc3Mgb2YgQk9PVFAgcmVsYXkgKi8KLQl1OCBod19hZGRyWzE2XTsJCS8qIENsaWVudCdzIEhXIGFkZHJlc3MgKi8KLQl1OCBzZXJ2X25hbWVbNjRdOwkvKiBTZXJ2ZXIgaG9zdCBuYW1lICovCi0JdTggYm9vdF9maWxlWzEyOF07CS8qIE5hbWUgb2YgYm9vdCBmaWxlICovCi0JdTggZXh0ZW5bMzEyXTsJCS8qIERIQ1Agb3B0aW9ucyAvIEJPT1RQIHZlbmRvciBleHRlbnNpb25zICovCi19OwotCi0vKiBwYWNrZXQgb3BzICovCi0jZGVmaW5lIEJPT1RQX1JFUVVFU1QJMQotI2RlZmluZSBCT09UUF9SRVBMWQkyCi0KLS8qIERIQ1AgbWVzc2FnZSB0eXBlcyAqLwotI2RlZmluZSBESENQRElTQ09WRVIJMQotI2RlZmluZSBESENQT0ZGRVIJMgotI2RlZmluZSBESENQUkVRVUVTVAkzCi0jZGVmaW5lIERIQ1BERUNMSU5FCTQKLSNkZWZpbmUgREhDUEFDSwkJNQotI2RlZmluZSBESENQTkFLCQk2Ci0jZGVmaW5lIERIQ1BSRUxFQVNFCTcKLSNkZWZpbmUgREhDUElORk9STQk4Ci0KLXN0YXRpYyBpbnQgaWNfYm9vdHBfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpOwotCi1zdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGJvb3RwX3BhY2tldF90eXBlIF9faW5pdGRhdGEgPSB7Ci0JLnR5cGUgPQlfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSwKLQkuZnVuYyA9CWljX2Jvb3RwX3JlY3YsCi19OwotCi0KLS8qCi0gKiAgSW5pdGlhbGl6ZSBESENQL0JPT1RQIGV4dGVuc2lvbiBmaWVsZHMgaW4gdGhlIHJlcXVlc3QuCi0gKi8KLQotc3RhdGljIGNvbnN0IHU4IGljX2Jvb3RwX2Nvb2tpZVs0XSA9IHsgOTksIDEzMCwgODMsIDk5IH07Ci0KLSNpZmRlZiBJUENPTkZJR19ESENQCi0KLXN0YXRpYyB2b2lkIF9faW5pdAotaWNfZGhjcF9pbml0X29wdGlvbnModTggKm9wdGlvbnMpCi17Ci0JdTggbXQgPSAoKGljX3NlcnZhZGRyID09IE5PTkUpCi0JCSA/IERIQ1BESVNDT1ZFUiA6IERIQ1BSRVFVRVNUKTsKLQl1OCAqZSA9IG9wdGlvbnM7Ci0KLSNpZmRlZiBJUENPTkZJR19ERUJVRwotCXByaW50aygiREhDUDogU2VuZGluZyBtZXNzYWdlIHR5cGUgJWRcbiIsIG10KTsKLSNlbmRpZgotCi0JbWVtY3B5KGUsIGljX2Jvb3RwX2Nvb2tpZSwgNCk7CS8qIFJGQzEwNDggTWFnaWMgQ29va2llICovCi0JZSArPSA0OwotCi0JKmUrKyA9IDUzOwkJLyogREhDUCBtZXNzYWdlIHR5cGUgKi8KLQkqZSsrID0gMTsKLQkqZSsrID0gbXQ7Ci0KLQlpZiAobXQgPT0gREhDUFJFUVVFU1QpIHsKLQkJKmUrKyA9IDU0OwkvKiBTZXJ2ZXIgSUQgKElQIGFkZHJlc3MpICovCi0JCSplKysgPSA0OwotCQltZW1jcHkoZSwgJmljX3NlcnZhZGRyLCA0KTsKLQkJZSArPSA0OwotCi0JCSplKysgPSA1MDsJLyogUmVxdWVzdGVkIElQIGFkZHJlc3MgKi8KLQkJKmUrKyA9IDQ7Ci0JCW1lbWNweShlLCAmaWNfbXlhZGRyLCA0KTsKLQkJZSArPSA0OwotCX0KLQotCS8qIGFsd2F5cz8gKi8KLQl7Ci0JCXN0YXRpYyBjb25zdCB1OCBpY19yZXFfcGFyYW1zW10gPSB7Ci0JCQkxLAkvKiBTdWJuZXQgbWFzayAqLwotCQkJMywJLyogRGVmYXVsdCBnYXRld2F5ICovCi0JCQk2LAkvKiBETlMgc2VydmVyICovCi0JCQkxMiwJLyogSG9zdCBuYW1lICovCi0JCQkxNSwJLyogRG9tYWluIG5hbWUgKi8KLQkJCTE3LAkvKiBCb290IHBhdGggKi8KLQkJCTQwLAkvKiBOSVMgZG9tYWluIG5hbWUgKi8KLQkJfTsKLQotCQkqZSsrID0gNTU7CS8qIFBhcmFtZXRlciByZXF1ZXN0IGxpc3QgKi8KLQkJKmUrKyA9IHNpemVvZihpY19yZXFfcGFyYW1zKTsKLQkJbWVtY3B5KGUsIGljX3JlcV9wYXJhbXMsIHNpemVvZihpY19yZXFfcGFyYW1zKSk7Ci0JCWUgKz0gc2l6ZW9mKGljX3JlcV9wYXJhbXMpOwotCX0KLQotCSplKysgPSAyNTU7CS8qIEVuZCBvZiB0aGUgbGlzdCAqLwotfQotCi0jZW5kaWYgLyogSVBDT05GSUdfREhDUCAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaWNfYm9vdHBfaW5pdF9leHQodTggKmUpCi17Ci0JbWVtY3B5KGUsIGljX2Jvb3RwX2Nvb2tpZSwgNCk7CS8qIFJGQzEwNDggTWFnaWMgQ29va2llICovCi0JZSArPSA0OwotCSplKysgPSAxOwkJLyogU3VibmV0IG1hc2sgcmVxdWVzdCAqLwotCSplKysgPSA0OwotCWUgKz0gNDsKLQkqZSsrID0gMzsJCS8qIERlZmF1bHQgZ2F0ZXdheSByZXF1ZXN0ICovCi0JKmUrKyA9IDQ7Ci0JZSArPSA0OwotCSplKysgPSA1OwkJLyogTmFtZSBzZXJ2ZXIgcmVxdWVzdCAqLwotCSplKysgPSA4OwotCWUgKz0gODsKLQkqZSsrID0gMTI7CQkvKiBIb3N0IG5hbWUgcmVxdWVzdCAqLwotCSplKysgPSAzMjsKLQllICs9IDMyOwotCSplKysgPSA0MDsJCS8qIE5JUyBEb21haW4gbmFtZSByZXF1ZXN0ICovCi0JKmUrKyA9IDMyOwotCWUgKz0gMzI7Ci0JKmUrKyA9IDE3OwkJLyogQm9vdCBwYXRoICovCi0JKmUrKyA9IDQwOwotCWUgKz0gNDA7Ci0KLQkqZSsrID0gNTc7CQkvKiBzZXQgZXh0ZW5zaW9uIGJ1ZmZlciBzaXplIGZvciByZXBseSAqLwotCSplKysgPSAyOwotCSplKysgPSAxOwkJLyogMTI4KzIzNis4KzIwKzE0LCBzZWUgZGhjcGQgc291cmNlcyAqLwotCSplKysgPSAxNTA7Ci0KLQkqZSsrID0gMjU1OwkJLyogRW5kIG9mIHRoZSBsaXN0ICovCi19Ci0KLQotLyoKLSAqICBJbml0aWFsaXplIHRoZSBESENQL0JPT1RQIG1lY2hhbmlzbS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGljX2Jvb3RwX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBDT05GX05BTUVTRVJWRVJTX01BWDsgaSsrKQotCQlpY19uYW1lc2VydmVyc1tpXSA9IE5PTkU7Ci0KLQlkZXZfYWRkX3BhY2soJmJvb3RwX3BhY2tldF90eXBlKTsKLX0KLQotCi0vKgotICogIERIQ1AvQk9PVFAgY2xlYW51cC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGljX2Jvb3RwX2NsZWFudXAodm9pZCkKLXsKLQlkZXZfcmVtb3ZlX3BhY2soJmJvb3RwX3BhY2tldF90eXBlKTsKLX0KLQotCi0vKgotICogIFNlbmQgREhDUC9CT09UUCByZXF1ZXN0IHRvIHNpbmdsZSBpbnRlcmZhY2UuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpY19ib290cF9zZW5kX2lmKHN0cnVjdCBpY19kZXZpY2UgKmQsIHVuc2lnbmVkIGxvbmcgamlmZmllc19kaWZmKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkLT5kZXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgYm9vdHBfcGt0ICpiOwotCWludCBoaF9sZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOwotCXN0cnVjdCBpcGhkciAqaDsKLQotCS8qIEFsbG9jYXRlIHBhY2tldCAqLwotCXNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkgKyBoaF9sZW4gKyAxNSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IpCi0JCXJldHVybjsKLQlza2JfcmVzZXJ2ZShza2IsIGhoX2xlbik7Ci0JYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopIHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkpOwotCW1lbXNldChiLCAwLCBzaXplb2Yoc3RydWN0IGJvb3RwX3BrdCkpOwotCi0JLyogQ29uc3RydWN0IElQIGhlYWRlciAqLwotCXNrYi0+bmguaXBoID0gaCA9ICZiLT5pcGg7Ci0JaC0+dmVyc2lvbiA9IDQ7Ci0JaC0+aWhsID0gNTsKLQloLT50b3RfbGVuID0gaHRvbnMoc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpKTsKLQloLT5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKLQloLT50dGwgPSA2NDsKLQloLT5wcm90b2NvbCA9IElQUFJPVE9fVURQOwotCWgtPmRhZGRyID0gaHRvbmwoSU5BRERSX0JST0FEQ0FTVCk7Ci0JaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKikgaCwgaC0+aWhsKTsKLQotCS8qIENvbnN0cnVjdCBVRFAgaGVhZGVyICovCi0JYi0+dWRwaC5zb3VyY2UgPSBodG9ucyg2OCk7Ci0JYi0+dWRwaC5kZXN0ID0gaHRvbnMoNjcpOwotCWItPnVkcGgubGVuID0gaHRvbnMoc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpIC0gc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwotCS8qIFVEUCBjaGVja3N1bSBub3QgY2FsY3VsYXRlZCAtLSBleHBsaWNpdGx5IGFsbG93ZWQgaW4gQk9PVFAgUkZDICovCi0KLQkvKiBDb25zdHJ1Y3QgREhDUC9CT09UUCBoZWFkZXIgKi8KLQliLT5vcCA9IEJPT1RQX1JFUVVFU1Q7Ci0JaWYgKGRldi0+dHlwZSA8IDI1NikgLyogY2hlY2sgZm9yIGZhbHNlIHR5cGVzICovCi0JCWItPmh0eXBlID0gZGV2LT50eXBlOwotCWVsc2UgaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikgLyogZml4IGZvciB0b2tlbiByaW5nICovCi0JCWItPmh0eXBlID0gQVJQSFJEX0lFRUU4MDI7Ci0JZWxzZSBpZiAoZGV2LT50eXBlID09IEFSUEhSRF9GRERJKQotCQliLT5odHlwZSA9IEFSUEhSRF9FVEhFUjsKLQllbHNlIHsKLQkJcHJpbnRrKCJVbmtub3duIEFSUCB0eXBlIDB4JTA0eCBmb3IgZGV2aWNlICVzXG4iLCBkZXYtPnR5cGUsIGRldi0+bmFtZSk7Ci0JCWItPmh0eXBlID0gZGV2LT50eXBlOyAvKiBjYW4gY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yICovCi0JfQotCWItPmhsZW4gPSBkZXYtPmFkZHJfbGVuOwotCWItPnlvdXJfaXAgPSBOT05FOwotCWItPnNlcnZlcl9pcCA9IE5PTkU7Ci0JbWVtY3B5KGItPmh3X2FkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOwotCWItPnNlY3MgPSBodG9ucyhqaWZmaWVzX2RpZmYgLyBIWik7Ci0JYi0+eGlkID0gZC0+eGlkOwotCi0JLyogYWRkIERIQ1Agb3B0aW9ucyBvciBCT09UUCBleHRlbnNpb25zICovCi0jaWZkZWYgSVBDT05GSUdfREhDUAotCWlmIChpY19wcm90b19lbmFibGVkICYgSUNfVVNFX0RIQ1ApCi0JCWljX2RoY3BfaW5pdF9vcHRpb25zKGItPmV4dGVuKTsKLQllbHNlCi0jZW5kaWYKLQkJaWNfYm9vdHBfaW5pdF9leHQoYi0+ZXh0ZW4pOwotCi0JLyogQ2hhaW4gcGFja2V0IGRvd24gdGhlIGxpbmUuLi4gKi8KLQlza2ItPmRldiA9IGRldjsKLQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwotCWlmICgoZGV2LT5oYXJkX2hlYWRlciAmJgotCSAgICAgZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksIGRldi0+YnJvYWRjYXN0LCBkZXYtPmRldl9hZGRyLCBza2ItPmxlbikgPCAwKSB8fAotCSAgICBkZXZfcXVldWVfeG1pdChza2IpIDwgMCkKLQkJcHJpbnRrKCJFIik7Ci19Ci0KLQotLyoKLSAqICBDb3B5IEJPT1RQLXN1cHBsaWVkIHN0cmluZyBpZiBub3QgYWxyZWFkeSBzZXQuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGljX2Jvb3RwX3N0cmluZyhjaGFyICpkZXN0LCBjaGFyICpzcmMsIGludCBsZW4sIGludCBtYXgpCi17Ci0JaWYgKCFsZW4pCi0JCXJldHVybiAwOwotCWlmIChsZW4gPiBtYXgtMSkKLQkJbGVuID0gbWF4LTE7Ci0JbWVtY3B5KGRlc3QsIHNyYywgbGVuKTsKLQlkZXN0W2xlbl0gPSAnXDAnOwotCXJldHVybiAxOwotfQotCi0KLS8qCi0gKiAgUHJvY2VzcyBCT09UUCBleHRlbnNpb25zLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaWNfZG9fYm9vdHBfZXh0KHU4ICpleHQpCi17Ci0gICAgICAgdTggc2VydmVyczsKLSAgICAgICBpbnQgaTsKLQotI2lmZGVmIElQQ09ORklHX0RFQlVHCi0JdTggKmM7Ci0KLQlwcmludGsoIkRIQ1AvQk9PVFA6IEdvdCBleHRlbnNpb24gJWQ6IiwqZXh0KTsKLQlmb3IoYz1leHQrMjsgYzxleHQrMitleHRbMV07IGMrKykKLQkJcHJpbnRrKCIgJTAyeCIsICpjKTsKLQlwcmludGsoIlxuIik7Ci0jZW5kaWYKLQotCXN3aXRjaCAoKmV4dCsrKSB7Ci0JCWNhc2UgMToJCS8qIFN1Ym5ldCBtYXNrICovCi0JCQlpZiAoaWNfbmV0bWFzayA9PSBOT05FKQotCQkJCW1lbWNweSgmaWNfbmV0bWFzaywgZXh0KzEsIDQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoJCS8qIERlZmF1bHQgZ2F0ZXdheSAqLwotCQkJaWYgKGljX2dhdGV3YXkgPT0gTk9ORSkKLQkJCQltZW1jcHkoJmljX2dhdGV3YXksIGV4dCsxLCA0KTsKLQkJCWJyZWFrOwotCQljYXNlIDY6CQkvKiBETlMgc2VydmVyICovCi0JCQlzZXJ2ZXJzPSAqZXh0LzQ7Ci0JCQlpZiAoc2VydmVycyA+IENPTkZfTkFNRVNFUlZFUlNfTUFYKQotCQkJCXNlcnZlcnMgPSBDT05GX05BTUVTRVJWRVJTX01BWDsKLQkJCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJzOyBpKyspIHsKLQkJCQlpZiAoaWNfbmFtZXNlcnZlcnNbaV0gPT0gTk9ORSkKLQkJCQkJbWVtY3B5KCZpY19uYW1lc2VydmVyc1tpXSwgZXh0KzErNCppLCA0KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDEyOgkvKiBIb3N0IG5hbWUgKi8KLQkJCWljX2Jvb3RwX3N0cmluZyh1dHNuYW1lKCktPm5vZGVuYW1lLCBleHQrMSwgKmV4dCwgX19ORVdfVVRTX0xFTik7Ci0JCQlpY19ob3N0X25hbWVfc2V0ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDE1OgkvKiBEb21haW4gbmFtZSAoRE5TKSAqLwotCQkJaWNfYm9vdHBfc3RyaW5nKGljX2RvbWFpbiwgZXh0KzEsICpleHQsIHNpemVvZihpY19kb21haW4pKTsKLQkJCWJyZWFrOwotCQljYXNlIDE3OgkvKiBSb290IHBhdGggKi8KLQkJCWlmICghcm9vdF9zZXJ2ZXJfcGF0aFswXSkKLQkJCQlpY19ib290cF9zdHJpbmcocm9vdF9zZXJ2ZXJfcGF0aCwgZXh0KzEsICpleHQsIHNpemVvZihyb290X3NlcnZlcl9wYXRoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSA0MDoJLyogTklTIERvbWFpbiBuYW1lIChfbm90XyBETlMpICovCi0JCQlpY19ib290cF9zdHJpbmcodXRzbmFtZSgpLT5kb21haW5uYW1lLCBleHQrMSwgKmV4dCwgX19ORVdfVVRTX0xFTik7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotLyoKLSAqICBSZWNlaXZlIEJPT1RQIHJlcGx5LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpY19ib290cF9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKLXsKLQlzdHJ1Y3QgYm9vdHBfcGt0ICpiOwotCXN0cnVjdCBpcGhkciAqaDsKLQlzdHJ1Y3QgaWNfZGV2aWNlICpkOwotCWludCBsZW4sIGV4dF9sZW47Ci0KLQkvKiBQZXJmb3JtIHZlcmlmaWNhdGlvbnMgYmVmb3JlIHRha2luZyB0aGUgbG9jay4gICovCi0JaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKLQkJZ290byBkcm9wOwotCi0JaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsKLQkJCSAgIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkpCi0JCWdvdG8gZHJvcDsKLQotCWIgPSAoc3RydWN0IGJvb3RwX3BrdCAqKSBza2ItPm5oLmlwaDsKLQloID0gJmItPmlwaDsKLQotCWlmIChoLT5paGwgIT0gNSB8fCBoLT52ZXJzaW9uICE9IDQgfHwgaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFApCi0JCWdvdG8gZHJvcDsKLQotCS8qIEZyYWdtZW50cyBhcmUgbm90IHN1cHBvcnRlZCAqLwotCWlmIChoLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCB8IElQX01GKSkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJESENQL0JPT1RQOiBJZ25vcmluZyBmcmFnbWVudGVkICIKLQkJCSAgICAgICAicmVwbHkuXG4iKTsKLQkJZ290byBkcm9wOwotCX0KLQotCWlmIChza2ItPmxlbiA8IG50b2hzKGgtPnRvdF9sZW4pKQotCQlnb3RvIGRyb3A7Ci0KLQlpZiAoaXBfZmFzdF9jc3VtKChjaGFyICopIGgsIGgtPmlobCkpCi0JCWdvdG8gZHJvcDsKLQotCWlmIChiLT51ZHBoLnNvdXJjZSAhPSBodG9ucyg2NykgfHwgYi0+dWRwaC5kZXN0ICE9IGh0b25zKDY4KSkKLQkJZ290byBkcm9wOwotCi0JaWYgKG50b2hzKGgtPnRvdF9sZW4pIDwgbnRvaHMoYi0+dWRwaC5sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCi0JCWdvdG8gZHJvcDsKLQotCWxlbiA9IG50b2hzKGItPnVkcGgubGVuKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQlleHRfbGVuID0gbGVuIC0gKHNpemVvZigqYikgLQotCQkJIHNpemVvZihzdHJ1Y3QgaXBoZHIpIC0KLQkJCSBzaXplb2Yoc3RydWN0IHVkcGhkcikgLQotCQkJIHNpemVvZihiLT5leHRlbikpOwotCWlmIChleHRfbGVuIDwgMCkKLQkJZ290byBkcm9wOwotCi0JLyogT2sgdGhlIGZyb250IGxvb2tzIGdvb2QsIG1ha2Ugc3VyZSB3ZSBjYW4gZ2V0IGF0IHRoZSByZXN0LiAgKi8KLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBza2ItPmxlbikpCi0JCWdvdG8gZHJvcDsKLQotCWIgPSAoc3RydWN0IGJvb3RwX3BrdCAqKSBza2ItPm5oLmlwaDsKLQloID0gJmItPmlwaDsKLQotCS8qIE9uZSByZXBseSBhdCBhIHRpbWUsIHBsZWFzZS4gKi8KLQlzcGluX2xvY2soJmljX3JlY3ZfbG9jayk7Ci0KLQkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXBseSwganVzdCBkcm9wIHRoZSBwYWNrZXQgKi8KLQlpZiAoaWNfZ290X3JlcGx5KQotCQlnb3RvIGRyb3BfdW5sb2NrOwotCi0JLyogRmluZCB0aGUgaWNfZGV2aWNlIHRoYXQgdGhlIHBhY2tldCBhcnJpdmVkIG9uICovCi0JZCA9IGljX2ZpcnN0X2RldjsKLQl3aGlsZSAoZCAmJiBkLT5kZXYgIT0gZGV2KQotCQlkID0gZC0+bmV4dDsKLQlpZiAoIWQpCi0JCWdvdG8gZHJvcF91bmxvY2s7ICAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0KLQkvKiBJcyBpdCBhIHJlcGx5IHRvIG91ciBCT09UUCByZXF1ZXN0PyAqLwotCWlmIChiLT5vcCAhPSBCT09UUF9SRVBMWSB8fAotCSAgICBiLT54aWQgIT0gZC0+eGlkKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9FUlIgIkRIQ1AvQk9PVFA6IFJlcGx5IG5vdCBmb3IgdXMsICIKLQkJCSAgICAgICAib3BbJXhdIHhpZFsleF1cbiIsCi0JCQkgICAgICAgYi0+b3AsIGItPnhpZCk7Ci0JCWdvdG8gZHJvcF91bmxvY2s7Ci0JfQotCi0JLyogUGFyc2UgZXh0ZW5zaW9ucyAqLwotCWlmIChleHRfbGVuID49IDQgJiYKLQkgICAgIW1lbWNtcChiLT5leHRlbiwgaWNfYm9vdHBfY29va2llLCA0KSkgeyAvKiBDaGVjayBtYWdpYyBjb29raWUgKi8KLQkJdTggKmVuZCA9ICh1OCAqKSBiICsgbnRvaHMoYi0+aXBoLnRvdF9sZW4pOwotCQl1OCAqZXh0OwotCi0jaWZkZWYgSVBDT05GSUdfREhDUAotCQlpZiAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKSB7Ci0JCQlfX2JlMzIgc2VydmVyX2lkID0gTk9ORTsKLQkJCWludCBtdCA9IDA7Ci0KLQkJCWV4dCA9ICZiLT5leHRlbls0XTsKLQkJCXdoaWxlIChleHQgPCBlbmQgJiYgKmV4dCAhPSAweGZmKSB7Ci0JCQkJdTggKm9wdCA9IGV4dCsrOwotCQkJCWlmICgqb3B0ID09IDApCS8qIFBhZGRpbmcgKi8KLQkJCQkJY29udGludWU7Ci0JCQkJZXh0ICs9ICpleHQgKyAxOwotCQkJCWlmIChleHQgPj0gZW5kKQotCQkJCQlicmVhazsKLQkJCQlzd2l0Y2ggKCpvcHQpIHsKLQkJCQljYXNlIDUzOgkvKiBNZXNzYWdlIHR5cGUgKi8KLQkJCQkJaWYgKG9wdFsxXSkKLQkJCQkJCW10ID0gb3B0WzJdOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDU0OgkvKiBTZXJ2ZXIgSUQgKElQIGFkZHJlc3MpICovCi0JCQkJCWlmIChvcHRbMV0gPj0gNCkKLQkJCQkJCW1lbWNweSgmc2VydmVyX2lkLCBvcHQgKyAyLCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfTsKLQkJCX0KLQotI2lmZGVmIElQQ09ORklHX0RFQlVHCi0JCQlwcmludGsoIkRIQ1A6IEdvdCBtZXNzYWdlIHR5cGUgJWRcbiIsIG10KTsKLSNlbmRpZgotCi0JCQlzd2l0Y2ggKG10KSB7Ci0JCQljYXNlIERIQ1BPRkZFUjoKLQkJCQkvKiBXaGlsZSBpbiB0aGUgcHJvY2VzcyBvZiBhY2NlcHRpbmcgb25lIG9mZmVyLAotCQkJCSAqIGlnbm9yZSBhbGwgb3RoZXJzLgotCQkJCSAqLwotCQkJCWlmIChpY19teWFkZHIgIT0gTk9ORSkKLQkJCQkJZ290byBkcm9wX3VubG9jazsKLQotCQkJCS8qIExldCdzIGFjY2VwdCB0aGF0IG9mZmVyLiAqLwotCQkJCWljX215YWRkciA9IGItPnlvdXJfaXA7Ci0JCQkJaWNfc2VydmFkZHIgPSBzZXJ2ZXJfaWQ7Ci0jaWZkZWYgSVBDT05GSUdfREVCVUcKLQkJCQlwcmludGsoIkRIQ1A6IE9mZmVyZWQgYWRkcmVzcyAldS4ldS4ldS4ldSIsCi0JCQkJICAgICAgIE5JUFFVQUQoaWNfbXlhZGRyKSk7Ci0JCQkJcHJpbnRrKCIgYnkgc2VydmVyICV1LiV1LiV1LiV1XG4iLAotCQkJCSAgICAgICBOSVBRVUFEKGljX3NlcnZhZGRyKSk7Ci0jZW5kaWYKLQkJCQkvKiBUaGUgREhDUCBpbmRpY2F0ZWQgc2VydmVyIGFkZHJlc3MgdGFrZXMKLQkJCQkgKiBwcmVjZWRlbmNlIG92ZXIgdGhlIGJvb3RwIGhlYWRlciBvbmUgaWYKLQkJCQkgKiB0aGV5IGFyZSBkaWZmZXJlbnQuCi0JCQkJICovCi0JCQkJaWYgKChzZXJ2ZXJfaWQgIT0gTk9ORSkgJiYKLQkJCQkgICAgKGItPnNlcnZlcl9pcCAhPSBzZXJ2ZXJfaWQpKQotCQkJCQliLT5zZXJ2ZXJfaXAgPSBpY19zZXJ2YWRkcjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBESENQQUNLOgotCQkJCWlmIChtZW1jbXAoZGV2LT5kZXZfYWRkciwgYi0+aHdfYWRkciwgZGV2LT5hZGRyX2xlbikgIT0gMCkKLQkJCQkJZ290byBkcm9wX3VubG9jazsKLQotCQkJCS8qIFllYWghICovCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJLyogVXJxdWUuICBGb3JnZXQgaXQqLwotCQkJCWljX215YWRkciA9IE5PTkU7Ci0JCQkJaWNfc2VydmFkZHIgPSBOT05FOwotCQkJCWdvdG8gZHJvcF91bmxvY2s7Ci0JCQl9OwotCi0JCQlpY19kaGNwX21zZ3R5cGUgPSBtdDsKLQotCQl9Ci0jZW5kaWYgLyogSVBDT05GSUdfREhDUCAqLwotCi0JCWV4dCA9ICZiLT5leHRlbls0XTsKLQkJd2hpbGUgKGV4dCA8IGVuZCAmJiAqZXh0ICE9IDB4ZmYpIHsKLQkJCXU4ICpvcHQgPSBleHQrKzsKLQkJCWlmICgqb3B0ID09IDApCS8qIFBhZGRpbmcgKi8KLQkJCQljb250aW51ZTsKLQkJCWV4dCArPSAqZXh0ICsgMTsKLQkJCWlmIChleHQgPCBlbmQpCi0JCQkJaWNfZG9fYm9vdHBfZXh0KG9wdCk7Ci0JCX0KLQl9Ci0KLQkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwotCWljX2RldiA9IGRldjsKLQlpY19teWFkZHIgPSBiLT55b3VyX2lwOwotCWljX3NlcnZhZGRyID0gYi0+c2VydmVyX2lwOwotCWlmIChpY19nYXRld2F5ID09IE5PTkUgJiYgYi0+cmVsYXlfaXApCi0JCWljX2dhdGV3YXkgPSBiLT5yZWxheV9pcDsKLQlpZiAoaWNfbmFtZXNlcnZlcnNbMF0gPT0gTk9ORSkKLQkJaWNfbmFtZXNlcnZlcnNbMF0gPSBpY19zZXJ2YWRkcjsKLQlpY19nb3RfcmVwbHkgPSBJQ19CT09UUDsKLQotZHJvcF91bmxvY2s6Ci0JLyogU2hvdydzIG92ZXIuICBOb3RoaW5nIHRvIHNlZSBoZXJlLiAgKi8KLQlzcGluX3VubG9jaygmaWNfcmVjdl9sb2NrKTsKLQotZHJvcDoKLQkvKiBUaHJvdyB0aGUgcGFja2V0IG91dC4gKi8KLQlrZnJlZV9za2Ioc2tiKTsKLQotCXJldHVybiAwOwotfQotCi0KLSNlbmRpZgotCi0KLS8qCi0gKglEeW5hbWljIElQIGNvbmZpZ3VyYXRpb24gLS0gREhDUCwgQk9PVFAsIFJBUlAuCi0gKi8KLQotI2lmZGVmIElQQ09ORklHX0RZTkFNSUMKLQotc3RhdGljIGludCBfX2luaXQgaWNfZHluYW1pYyh2b2lkKQotewotCWludCByZXRyaWVzOwotCXN0cnVjdCBpY19kZXZpY2UgKmQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9qaWZmaWVzLCB0aW1lb3V0LCBqaWZmOwotCWludCBkb19ib290cCA9IGljX3Byb3RvX2hhdmVfaWYgJiBJQ19CT09UUDsKLQlpbnQgZG9fcmFycCA9IGljX3Byb3RvX2hhdmVfaWYgJiBJQ19SQVJQOwotCi0JLyoKLQkgKiBJZiBub25lIG9mIERIQ1AvQk9PVFAvUkFSUCB3YXMgc2VsZWN0ZWQsIHJldHVybiB3aXRoIGFuIGVycm9yLgotCSAqIFRoaXMgcm91dGluZSBnZXRzIG9ubHkgY2FsbGVkIHdoZW4gc29tZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24KLQkgKiBhcmUgbWlzc2luZywgYW5kIHdpdGhvdXQgREhDUC9CT09UUC9SQVJQIHdlIGFyZSB1bmFibGUgdG8gZ2V0IGl0LgotCSAqLwotCWlmICghaWNfcHJvdG9fZW5hYmxlZCkgewotCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogSW5jb21wbGV0ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotI2lmZGVmIElQQ09ORklHX0JPT1RQCi0JaWYgKChpY19wcm90b19lbmFibGVkIF4gaWNfcHJvdG9faGF2ZV9pZikgJiBJQ19CT09UUCkKLQkJcHJpbnRrKEtFUk5fRVJSICJESENQL0JPT1RQOiBObyBzdWl0YWJsZSBkZXZpY2UgZm91bmQuXG4iKTsKLSNlbmRpZgotI2lmZGVmIElQQ09ORklHX1JBUlAKLQlpZiAoKGljX3Byb3RvX2VuYWJsZWQgXiBpY19wcm90b19oYXZlX2lmKSAmIElDX1JBUlApCi0JCXByaW50ayhLRVJOX0VSUiAiUkFSUDogTm8gc3VpdGFibGUgZGV2aWNlIGZvdW5kLlxuIik7Ci0jZW5kaWYKLQotCWlmICghaWNfcHJvdG9faGF2ZV9pZikKLQkJLyogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IHByaW50ZWQgKi8KLQkJcmV0dXJuIC0xOwotCi0JLyoKLQkgKiBTZXR1cCBwcm90b2NvbHMKLQkgKi8KLSNpZmRlZiBJUENPTkZJR19CT09UUAotCWlmIChkb19ib290cCkKLQkJaWNfYm9vdHBfaW5pdCgpOwotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCWlmIChkb19yYXJwKQotCQlpY19yYXJwX2luaXQoKTsKLSNlbmRpZgotCi0JLyoKLQkgKiBTZW5kIHJlcXVlc3RzIGFuZCB3YWl0LCB1bnRpbCB3ZSBnZXQgYW4gYW5zd2VyLiBUaGlzIGxvb3AKLQkgKiBzZWVtcyB0byBiZSBhIHRlcnJpYmxlIHdhc3RlIG9mIENQVSB0aW1lLCBidXQgYWN0dWFsbHkgdGhlcmUgaXMKLQkgKiBvbmx5IG9uZSBwcm9jZXNzIHJ1bm5pbmcgYXQgYWxsLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVzZSBhbnkKLQkgKiBzY2hlZHVsZXIgZnVuY3Rpb25zLgotCSAqIFtBY3R1YWxseSB3ZSBjb3VsZCBub3csIGJ1dCB0aGUgbm90aGluZyBlbHNlIHJ1bm5pbmcgbm90ZSBzdGlsbAotCSAqICBhcHBsaWVzLi4gLSBBQ10KLQkgKi8KLQlwcmludGsoS0VSTl9OT1RJQ0UgIlNlbmRpbmcgJXMlcyVzIHJlcXVlc3RzIC4iLAotCSAgICAgICBkb19ib290cAotCQk/ICgoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKSA/ICJESENQIiA6ICJCT09UUCIpIDogIiIsCi0JICAgICAgIChkb19ib290cCAmJiBkb19yYXJwKSA/ICIgYW5kICIgOiAiIiwKLQkgICAgICAgZG9fcmFycCA/ICJSQVJQIiA6ICIiKTsKLQotCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOwotCWQgPSBpY19maXJzdF9kZXY7Ci0JcmV0cmllcyA9IENPTkZfU0VORF9SRVRSSUVTOwotCWdldF9yYW5kb21fYnl0ZXMoJnRpbWVvdXQsIHNpemVvZih0aW1lb3V0KSk7Ci0JdGltZW91dCA9IENPTkZfQkFTRV9USU1FT1VUICsgKHRpbWVvdXQgJSAodW5zaWduZWQpIENPTkZfVElNRU9VVF9SQU5ET00pOwotCWZvcig7OykgewotI2lmZGVmIElQQ09ORklHX0JPT1RQCi0JCWlmIChkb19ib290cCAmJiAoZC0+YWJsZSAmIElDX0JPT1RQKSkKLQkJCWljX2Jvb3RwX3NlbmRfaWYoZCwgamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpOwotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCQlpZiAoZG9fcmFycCAmJiAoZC0+YWJsZSAmIElDX1JBUlApKQotCQkJaWNfcmFycF9zZW5kX2lmKGQpOwotI2VuZGlmCi0KLQkJamlmZiA9IGppZmZpZXMgKyAoZC0+bmV4dCA/IENPTkZfSU5URVJfVElNRU9VVCA6IHRpbWVvdXQpOwotCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgamlmZikgJiYgIWljX2dvdF9yZXBseSkKLQkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotI2lmZGVmIElQQ09ORklHX0RIQ1AKLQkJLyogREhDUCBpc24ndCBkb25lIHVudGlsIHdlIGdldCBhIERIQ1BBQ0suICovCi0JCWlmICgoaWNfZ290X3JlcGx5ICYgSUNfQk9PVFApCi0JCSAgICAmJiAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKQotCQkgICAgJiYgaWNfZGhjcF9tc2d0eXBlICE9IERIQ1BBQ0spCi0JCXsKLQkJCWljX2dvdF9yZXBseSA9IDA7Ci0JCQlwcmludGsoIiwiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0jZW5kaWYgLyogSVBDT05GSUdfREhDUCAqLwotCi0JCWlmIChpY19nb3RfcmVwbHkpIHsKLQkJCXByaW50aygiIE9LXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKChkID0gZC0+bmV4dCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoISAtLXJldHJpZXMpIHsKLQkJCXByaW50aygiIHRpbWVkIG91dCFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlkID0gaWNfZmlyc3RfZGV2OwotCi0JCXRpbWVvdXQgPSB0aW1lb3V0IENPTkZfVElNRU9VVF9NVUxUOwotCQlpZiAodGltZW91dCA+IENPTkZfVElNRU9VVF9NQVgpCi0JCQl0aW1lb3V0ID0gQ09ORl9USU1FT1VUX01BWDsKLQotCQlwcmludGsoIi4iKTsKLQl9Ci0KLSNpZmRlZiBJUENPTkZJR19CT09UUAotCWlmIChkb19ib290cCkKLQkJaWNfYm9vdHBfY2xlYW51cCgpOwotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfUkFSUAotCWlmIChkb19yYXJwKQotCQlpY19yYXJwX2NsZWFudXAoKTsKLSNlbmRpZgotCi0JaWYgKCFpY19nb3RfcmVwbHkpIHsKLQkJaWNfbXlhZGRyID0gTk9ORTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaW50aygiSVAtQ29uZmlnOiBHb3QgJXMgYW5zd2VyIGZyb20gJXUuJXUuJXUuJXUsICIsCi0JCSgoaWNfZ290X3JlcGx5ICYgSUNfUkFSUCkgPyAiUkFSUCIKLQkJIDogKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkgPyAiREhDUCIgOiAiQk9PVFAiKSwKLQkJTklQUVVBRChpY19zZXJ2YWRkcikpOwotCXByaW50aygibXkgYWRkcmVzcyBpcyAldS4ldS4ldS4ldVxuIiwgTklQUVVBRChpY19teWFkZHIpKTsKLQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogSVBDT05GSUdfRFlOQU1JQyAqLwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQotc3RhdGljIGludCBwbnBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlpZiAoaWNfcHJvdG9fdXNlZCAmIElDX1BST1RPKQotCQlzZXFfcHJpbnRmKHNlcSwgIiNQUk9UTzogJXNcbiIsCi0JCQkgICAoaWNfcHJvdG9fdXNlZCAmIElDX1JBUlApID8gIlJBUlAiCi0JCQkgICA6IChpY19wcm90b191c2VkICYgSUNfVVNFX0RIQ1ApID8gIkRIQ1AiIDogIkJPT1RQIik7Ci0JZWxzZQotCQlzZXFfcHV0cyhzZXEsICIjTUFOVUFMXG4iKTsKLQotCWlmIChpY19kb21haW5bMF0pCi0JCXNlcV9wcmludGYoc2VxLAotCQkJICAgImRvbWFpbiAlc1xuIiwgaWNfZG9tYWluKTsKLQlmb3IgKGkgPSAwOyBpIDwgQ09ORl9OQU1FU0VSVkVSU19NQVg7IGkrKykgewotCQlpZiAoaWNfbmFtZXNlcnZlcnNbaV0gIT0gTk9ORSkKLQkJCXNlcV9wcmludGYoc2VxLAotCQkJCSAgICJuYW1lc2VydmVyICV1LiV1LiV1LiV1XG4iLAotCQkJCSAgIE5JUFFVQUQoaWNfbmFtZXNlcnZlcnNbaV0pKTsKLQl9Ci0JaWYgKGljX3NlcnZhZGRyICE9IE5PTkUpCi0JCXNlcV9wcmludGYoc2VxLAotCQkJICAgImJvb3RzZXJ2ZXIgJXUuJXUuJXUuJXVcbiIsCi0JCQkgICBOSVBRVUFEKGljX3NlcnZhZGRyKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG5wX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5kb2UsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwbnBfc2VxX3Nob3csIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbnBfc2VxX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHBucF9zZXFfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotCi0vKgotICogIEV4dHJhY3QgSVAgYWRkcmVzcyBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RyaW5nIGlmIG5lZWRlZC4gTm90ZSB0aGF0IHdlCi0gKiAgbmVlZCB0byBoYXZlIHJvb3Rfc2VydmVyX2FkZHIgc2V0IF9iZWZvcmVfIElQQ29uZmlnIGdldHMgY2FsbGVkIGFzIGl0Ci0gKiAgY2FuIG92ZXJyaWRlIGl0LgotICovCi1fX2JlMzIgX19pbml0IHJvb3RfbmZzX3BhcnNlX2FkZHIoY2hhciAqbmFtZSkKLXsKLQlfX2JlMzIgYWRkcjsKLQlpbnQgb2N0ZXRzID0gMDsKLQljaGFyICpjcCwgKmNxOwotCi0JY3AgPSBjcSA9IG5hbWU7Ci0Jd2hpbGUgKG9jdGV0cyA8IDQpIHsKLQkJd2hpbGUgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKLQkJCWNwKys7Ci0JCWlmIChjcCA9PSBjcSB8fCBjcCAtIGNxID4gMykKLQkJCWJyZWFrOwotCQlpZiAoKmNwID09ICcuJyB8fCBvY3RldHMgPT0gMykKLQkJCW9jdGV0cysrOwotCQlpZiAob2N0ZXRzIDwgNCkKLQkJCWNwKys7Ci0JCWNxID0gY3A7Ci0JfQotCWlmIChvY3RldHMgPT0gNCAmJiAoKmNwID09ICc6JyB8fCAqY3AgPT0gJ1wwJykpIHsKLQkJaWYgKCpjcCA9PSAnOicpCi0JCQkqY3ArKyA9ICdcMCc7Ci0JCWFkZHIgPSBpbl9hdG9uKG5hbWUpOwotCQltZW1tb3ZlKG5hbWUsIGNwLCBzdHJsZW4oY3ApICsgMSk7Ci0JfSBlbHNlCi0JCWFkZHIgPSBOT05FOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qCi0gKglJUCBBdXRvY29uZmlnIGRpc3BhdGNoZXIuCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgaXBfYXV0b19jb25maWcodm9pZCkKLXsKLQlfX2JlMzIgYWRkcjsKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcHJvY19uZXRfZm9wc19jcmVhdGUoInBucCIsIFNfSVJVR08sICZwbnBfc2VxX2ZvcHMpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0KLQlpZiAoIWljX2VuYWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQlEQkcoKCJJUC1Db25maWc6IEVudGVyZWQuXG4iKSk7Ci0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotIHRyeV90cnlfYWdhaW46Ci0jZW5kaWYKLQkvKiBHaXZlIGhhcmR3YXJlIGEgY2hhbmNlIHRvIHNldHRsZSAqLwotCW1zbGVlcChDT05GX1BSRV9PUEVOKTsKLQotCS8qIFNldHVwIGFsbCBuZXR3b3JrIGRldmljZXMgKi8KLQlpZiAoaWNfb3Blbl9kZXZzKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBHaXZlIGRyaXZlcnMgYSBjaGFuY2UgdG8gc2V0dGxlICovCi0Jc3NsZWVwKENPTkZfUE9TVF9PUEVOKTsKLQotCS8qCi0JICogSWYgdGhlIGNvbmZpZyBpbmZvcm1hdGlvbiBpcyBpbnN1ZmZpY2llbnQgKGUuZy4sIG91ciBJUCBhZGRyZXNzIG9yCi0JICogSVAgYWRkcmVzcyBvZiB0aGUgYm9vdCBzZXJ2ZXIgaXMgbWlzc2luZyBvciB3ZSBoYXZlIG11bHRpcGxlIG5ldHdvcmsKLQkgKiBpbnRlcmZhY2VzIGFuZCBubyBkZWZhdWx0IHdhcyBzZXQpLCB1c2UgQk9PVFAgb3IgUkFSUCB0byBnZXQgdGhlCi0JICogbWlzc2luZyB2YWx1ZXMuCi0JICovCi0JaWYgKGljX215YWRkciA9PSBOT05FIHx8Ci0jaWZkZWYgQ09ORklHX1JPT1RfTkZTCi0JICAgIChNQUpPUihST09UX0RFVikgPT0gVU5OQU1FRF9NQUpPUgotCSAgICAgJiYgcm9vdF9zZXJ2ZXJfYWRkciA9PSBOT05FCi0JICAgICAmJiBpY19zZXJ2YWRkciA9PSBOT05FKSB8fAotI2VuZGlmCi0JICAgIGljX2ZpcnN0X2Rldi0+bmV4dCkgewotI2lmZGVmIElQQ09ORklHX0RZTkFNSUMKLQotCQlpbnQgcmV0cmllcyA9IENPTkZfT1BFTl9SRVRSSUVTOwotCi0JCWlmIChpY19keW5hbWljKCkgPCAwKSB7Ci0JCQlpY19jbG9zZV9kZXZzKCk7Ci0KLQkJCS8qCi0JCQkgKiBJIGRvbid0IGtub3cgd2h5LCBidXQgc29tZXRpbWVzIHRoZQotCQkJICogZWVwcm8xMDAgZHJpdmVyIChhdCBsZWFzdCkgZ2V0cyB1cHNldCBhbmQKLQkJCSAqIGRvZXNuJ3Qgd29yayB0aGUgZmlyc3QgdGltZSBpdCdzIG9wZW5lZC4KLQkJCSAqIEJ1dCB0aGVuIGlmIHlvdSBjbG9zZSBpdCBhbmQgcmVvcGVuIGl0LCBpdAotCQkJICogd29ya3MganVzdCBmaW5lLiAgU28gd2UgbmVlZCB0byB0cnkgdGhhdCBhdAotCQkJICogbGVhc3Qgb25jZSBiZWZvcmUgZ2l2aW5nIHVwLgotCQkJICoKLQkJCSAqIEFsc28sIGlmIHRoZSByb290IHdpbGwgYmUgTkZTLW1vdW50ZWQsIHdlCi0JCQkgKiBoYXZlIG5vd2hlcmUgdG8gZ28gaWYgREhDUCBmYWlscy4gIFNvIHdlCi0JCQkgKiBqdXN0IGhhdmUgdG8ga2VlcCB0cnlpbmcgZm9yZXZlci4KLQkJCSAqCi0JCQkgKiAJCQkJLS0gQ2hpcAotCQkJICovCi0jaWZkZWYgQ09ORklHX1JPT1RfTkZTCi0JCQlpZiAoUk9PVF9ERVYgPT0gIFJvb3RfTkZTKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJJUC1Db25maWc6IFJldHJ5aW5nIGZvcmV2ZXIgKE5GUyByb290KS4uLlxuIik7Ci0JCQkJZ290byB0cnlfdHJ5X2FnYWluOwotCQkJfQotI2VuZGlmCi0KLQkJCWlmICgtLXJldHJpZXMpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgIklQLUNvbmZpZzogUmVvcGVuaW5nIG5ldHdvcmsgZGV2aWNlcy4uLlxuIik7Ci0JCQkJZ290byB0cnlfdHJ5X2FnYWluOwotCQkJfQotCi0JCQkvKiBPaCwgd2VsbC4gIEF0IGxlYXN0IHdlIHRyaWVkLiAqLwotCQkJcHJpbnRrKEtFUk5fRVJSICJJUC1Db25maWc6IEF1dG8tY29uZmlndXJhdGlvbiBvZiBuZXR3b3JrIGZhaWxlZC5cbiIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0jZWxzZSAvKiAhRFlOQU1JQyAqLwotCQlwcmludGsoS0VSTl9FUlIgIklQLUNvbmZpZzogSW5jb21wbGV0ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uXG4iKTsKLQkJaWNfY2xvc2VfZGV2cygpOwotCQlyZXR1cm4gLTE7Ci0jZW5kaWYgLyogSVBDT05GSUdfRFlOQU1JQyAqLwotCX0gZWxzZSB7Ci0JCS8qIERldmljZSBzZWxlY3RlZCBtYW51YWxseSBvciBvbmx5IG9uZSBkZXZpY2UgLT4gdXNlIGl0ICovCi0JCWljX2RldiA9IGljX2ZpcnN0X2Rldi0+ZGV2OwotCX0KLQotCWFkZHIgPSByb290X25mc19wYXJzZV9hZGRyKHJvb3Rfc2VydmVyX3BhdGgpOwotCWlmIChyb290X3NlcnZlcl9hZGRyID09IE5PTkUpCi0JCXJvb3Rfc2VydmVyX2FkZHIgPSBhZGRyOwotCi0JLyoKLQkgKiBVc2UgZGVmYXVsdHMgd2hlcmVldmVyIGFwcGxpY2FibGUuCi0JICovCi0JaWYgKGljX2RlZmF1bHRzKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIENsb3NlIGFsbCBuZXR3b3JrIGRldmljZXMgZXhjZXB0IHRoZSBkZXZpY2Ugd2UndmUKLQkgKiBhdXRvY29uZmlndXJlZCBhbmQgc2V0IHVwIHJvdXRlcy4KLQkgKi8KLQlpY19jbG9zZV9kZXZzKCk7Ci0JaWYgKGljX3NldHVwX2lmKCkgPCAwIHx8IGljX3NldHVwX3JvdXRlcygpIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0JLyoKLQkgKiBSZWNvcmQgd2hpY2ggcHJvdG9jb2wgd2FzIGFjdHVhbGx5IHVzZWQuCi0JICovCi0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotCWljX3Byb3RvX3VzZWQgPSBpY19nb3RfcmVwbHkgfCAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKTsKLSNlbmRpZgotCi0jaWZuZGVmIElQQ09ORklHX1NJTEVOVAotCS8qCi0JICogQ2x1ZSBpbiB0aGUgb3BlcmF0b3IuCi0JICovCi0JcHJpbnRrKCJJUC1Db25maWc6IENvbXBsZXRlOiIpOwotCXByaW50aygiXG4gICAgICBkZXZpY2U9JXMiLCBpY19kZXYtPm5hbWUpOwotCXByaW50aygiLCBhZGRyPSV1LiV1LiV1LiV1IiwgTklQUVVBRChpY19teWFkZHIpKTsKLQlwcmludGsoIiwgbWFzaz0ldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfbmV0bWFzaykpOwotCXByaW50aygiLCBndz0ldS4ldS4ldS4ldSIsIE5JUFFVQUQoaWNfZ2F0ZXdheSkpOwotCXByaW50aygiLFxuICAgICBob3N0PSVzLCBkb21haW49JXMsIG5pcy1kb21haW49JXMiLAotCSAgICAgICB1dHNuYW1lKCktPm5vZGVuYW1lLCBpY19kb21haW4sIHV0c25hbWUoKS0+ZG9tYWlubmFtZSk7Ci0JcHJpbnRrKCIsXG4gICAgIGJvb3RzZXJ2ZXI9JXUuJXUuJXUuJXUiLCBOSVBRVUFEKGljX3NlcnZhZGRyKSk7Ci0JcHJpbnRrKCIsIHJvb3RzZXJ2ZXI9JXUuJXUuJXUuJXUiLCBOSVBRVUFEKHJvb3Rfc2VydmVyX2FkZHIpKTsKLQlwcmludGsoIiwgcm9vdHBhdGg9JXMiLCByb290X3NlcnZlcl9wYXRoKTsKLQlwcmludGsoIlxuIik7Ci0jZW5kaWYgLyogIVNJTEVOVCAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLWxhdGVfaW5pdGNhbGwoaXBfYXV0b19jb25maWcpOwotCi0KLS8qCi0gKiAgRGVjb2RlIGFueSBJUCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gdGhlICJpcD0iIG9yICJuZnNhZGRycz0iIGtlcm5lbAotICogIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuIEl0IGNvbnNpc3RzIG9mIG9wdGlvbiBmaWVsZHMgc2VwYXJhdGVkIGJ5IGNvbG9ucyBpbgotICogIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gKgotICogIDxjbGllbnQtaXA+OjxzZXJ2ZXItaXA+Ojxndy1pcD46PG5ldG1hc2s+Ojxob3N0IG5hbWU+OjxkZXZpY2U+OjxQUk9UTz4KLSAqCi0gKiAgQW55IG9mIHRoZSBmaWVsZHMgY2FuIGJlIGVtcHR5IHdoaWNoIG1lYW5zIHRvIHVzZSBhIGRlZmF1bHQgdmFsdWU6Ci0gKgk8Y2xpZW50LWlwPgktIGFkZHJlc3MgZ2l2ZW4gYnkgQk9PVFAgb3IgUkFSUAotICoJPHNlcnZlci1pcD4JLSBhZGRyZXNzIG9mIGhvc3QgcmV0dXJuaW5nIEJPT1RQIG9yIFJBUlAgcGFja2V0Ci0gKgk8Z3ctaXA+CQktIG5vbmUsIG9yIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5IEJPT1RQCi0gKgk8bmV0bWFzaz4JLSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgZnJvbSA8Y2xpZW50LWlwPiwgb3IgdGhlCi0gKgkJCSAgb25lIHJldHVybmVkIGJ5IEJPT1RQCi0gKgk8aG9zdCBuYW1lPgktIDxjbGllbnQtaXA+IGluIEFTQ0lJIG5vdGF0aW9uLCBvciB0aGUgbmFtZSByZXR1cm5lZAotICoJCQkgIGJ5IEJPT1RQCi0gKgk8ZGV2aWNlPgktIHVzZSBhbGwgYXZhaWxhYmxlIGRldmljZXMKLSAqCTxQUk9UTz46Ci0gKgkgICBvZmZ8bm9uZQkgICAgLSBkb24ndCBkbyBhdXRvY29uZmlnIGF0IGFsbCAoREVGQVVMVCkKLSAqCSAgIG9ufGFueSAgICAgICAgICAgLSB1c2UgYW55IGNvbmZpZ3VyZWQgcHJvdG9jb2wKLSAqCSAgIGRoY3B8Ym9vdHB8cmFycCAgLSB1c2Ugb25seSB0aGUgc3BlY2lmaWVkIHByb3RvY29sCi0gKgkgICBib3RoICAgICAgICAgICAgIC0gdXNlIGJvdGggQk9PVFAgYW5kIFJBUlAgKG5vdCBESENQKQotICovCi1zdGF0aWMgaW50IF9faW5pdCBpY19wcm90b19uYW1lKGNoYXIgKm5hbWUpCi17Ci0JaWYgKCFzdHJjbXAobmFtZSwgIm9uIikgfHwgIXN0cmNtcChuYW1lLCAiYW55IikpIHsKLQkJcmV0dXJuIDE7Ci0JfQotI2lmZGVmIENPTkZJR19JUF9QTlBfREhDUAotCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRoY3AiKSkgewotCQlpY19wcm90b19lbmFibGVkICY9IH5JQ19SQVJQOwotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSVBfUE5QX0JPT1RQCi0JZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYm9vdHAiKSkgewotCQlpY19wcm90b19lbmFibGVkICY9IH4oSUNfUkFSUCB8IElDX1VTRV9ESENQKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lQX1BOUF9SQVJQCi0JZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicmFycCIpKSB7Ci0JCWljX3Byb3RvX2VuYWJsZWQgJj0gfihJQ19CT09UUCB8IElDX1VTRV9ESENQKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0jaWZkZWYgSVBDT05GSUdfRFlOQU1JQwotCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImJvdGgiKSkgewotCQlpY19wcm90b19lbmFibGVkICY9IH5JQ19VU0VfREhDUDsgLyogYmFja3dhcmQgY29tcGF0IDotKCAqLwotCQlyZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaXBfYXV0b19jb25maWdfc2V0dXAoY2hhciAqYWRkcnMpCi17Ci0JY2hhciAqY3AsICppcCwgKmRwOwotCWludCBudW0gPSAwOwotCi0JaWNfc2V0X21hbnVhbGx5ID0gMTsKLQotCWljX2VuYWJsZSA9ICgqYWRkcnMgJiYKLQkJKHN0cmNtcChhZGRycywgIm9mZiIpICE9IDApICYmCi0JCShzdHJjbXAoYWRkcnMsICJub25lIikgIT0gMCkpOwotCWlmICghaWNfZW5hYmxlKQotCQlyZXR1cm4gMTsKLQotCWlmIChpY19wcm90b19uYW1lKGFkZHJzKSkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBQYXJzZSB0aGUgd2hvbGUgc3RyaW5nICovCi0JaXAgPSBhZGRyczsKLQl3aGlsZSAoaXAgJiYgKmlwKSB7Ci0JCWlmICgoY3AgPSBzdHJjaHIoaXAsICc6JykpKQotCQkJKmNwKysgPSAnXDAnOwotCQlpZiAoc3RybGVuKGlwKSA+IDApIHsKLQkJCURCRygoIklQLUNvbmZpZzogUGFyYW1ldGVyICMlZDogYCVzJ1xuIiwgbnVtLCBpcCkpOwotCQkJc3dpdGNoIChudW0pIHsKLQkJCWNhc2UgMDoKLQkJCQlpZiAoKGljX215YWRkciA9IGluX2F0b24oaXApKSA9PSBJTkFERFJfQU5ZKQotCQkJCQlpY19teWFkZHIgPSBOT05FOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCWlmICgoaWNfc2VydmFkZHIgPSBpbl9hdG9uKGlwKSkgPT0gSU5BRERSX0FOWSkKLQkJCQkJaWNfc2VydmFkZHIgPSBOT05FOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWlmICgoaWNfZ2F0ZXdheSA9IGluX2F0b24oaXApKSA9PSBJTkFERFJfQU5ZKQotCQkJCQlpY19nYXRld2F5ID0gTk9ORTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlpZiAoKGljX25ldG1hc2sgPSBpbl9hdG9uKGlwKSkgPT0gSU5BRERSX0FOWSkKLQkJCQkJaWNfbmV0bWFzayA9IE5PTkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJaWYgKChkcCA9IHN0cmNocihpcCwgJy4nKSkpIHsKLQkJCQkJKmRwKysgPSAnXDAnOwotCQkJCQlzdHJsY3B5KHV0c25hbWUoKS0+ZG9tYWlubmFtZSwgZHAsCi0JCQkJCQlzaXplb2YodXRzbmFtZSgpLT5kb21haW5uYW1lKSk7Ci0JCQkJfQotCQkJCXN0cmxjcHkodXRzbmFtZSgpLT5ub2RlbmFtZSwgaXAsCi0JCQkJCXNpemVvZih1dHNuYW1lKCktPm5vZGVuYW1lKSk7Ci0JCQkJaWNfaG9zdF9uYW1lX3NldCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDU6Ci0JCQkJc3RybGNweSh1c2VyX2Rldl9uYW1lLCBpcCwgc2l6ZW9mKHVzZXJfZGV2X25hbWUpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQlpY19wcm90b19uYW1lKGlwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpcCA9IGNwOwotCQludW0rKzsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbmZzYWRkcnNfY29uZmlnX3NldHVwKGNoYXIgKmFkZHJzKQotewotCXJldHVybiBpcF9hdXRvX2NvbmZpZ19zZXR1cChhZGRycyk7Ci19Ci0KLV9fc2V0dXAoImlwPSIsIGlwX2F1dG9fY29uZmlnX3NldHVwKTsKLV9fc2V0dXAoIm5mc2FkZHJzPSIsIG5mc2FkZHJzX2NvbmZpZ19zZXR1cCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQppbmRleCAwNmMxYTM3Li5hZDU0M2E1IDEwMDY0NAotLS0gYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisrKyBiL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKQEAgLTEyMCw2ICsxMjAsMTEgQEAKICMgJChRKSQoTUFLRSkgJChidWlsZCk9ZGlyCiBidWlsZCA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmoKIAorIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIC1mIHNjcmlwdHMvS2J1aWxkLmtsaWJjIG9iaj0KKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoa2xpYmMpPWRpcgora2xpYmMgOj0gLWYgJChzcmN0cmVlKS9zY3JpcHRzL0tidWlsZC5rbGliYyBvYmoKKwogIyBQcmVmaXggLUkgd2l0aCAkKHNyY3RyZWUpIGlmIGl0IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLgogYWRkdHJlZSA9ICQoaWYgJChmaWx0ZXItb3V0IC1JLyUsJCgxKSksJChwYXRzdWJzdCAtSSUsLUkkKHNyY3RyZWUpLyUsJCgxKSkpICQoMSkKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9LYnVpbGQua2xpYmMgYi9zY3JpcHRzL0tidWlsZC5rbGliYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdiOWJkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9LYnVpbGQua2xpYmMKQEAgLTAsMCArMSw0MTggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgU3VwcG9ydCBmb3IgYnVpbGRpbmcga2xpYmMgcHJvZ3JhbXMgYW5kIGtsaWJjIGxpYnJhcnkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgVG8gY3JlYXRlIGEga2J1aWxkIGZpbGUgZm9yIGEgdXNlcnNwYWNlIHByb2dyYW0gZG8gdGhlIGZvbGxvd2luZzoKKyMKKyMgS2J1aWxkOgorIworIyBzdGF0aWMteSA6PSBjYXQKKyMgIyBUaGlzIHdpbGwgY29tcGlsZSBhIGZpbGUgbmFtZWQgY2F0LmMgLT4gdGhlIGV4ZWN1dGFibGUgJ2NhdCcKKyMgIyBUaGUgZXhlY3V0YWJsZSB3aWxsIGJlIGxpbmtlZCBzdGF0aWNhbGx5CisjCisjIHNoYXJlZC15IDo9IGNhdHMKKyMgIyBUaGlzIHdpbGwgY29tcGlsZSBhIGZpbGUgbmFtZWQgY2F0cy5jIC0+IHRoZSBleGVjdXRhYmxlICdjYXRzJworIyAjIFRoZSBleGVjdXRhYmxlIHdpbGwgYmUgbGlua2VkIHNoYXJlZAorIworIyBJZiB0aGUgdXNlcnNwYWNlIHByb2dyYW0gY29uc2lzdCBvZiBjb21wb3NpdGUgZmlsZXMgZG8gdGhlIGZvbGxvd2luZzoKKyMgS2J1aWxkOgorIworIyBzdGF0aWMteSA6PSBraW5pdAorIyBraW5pdC15ICA6PSBtYWluLm8gbmV0ZGV2LmMKKyMgU28ga2luaXQgd2lsbCBiZSBsaW5rZWQgc3RhdGljYWxseSB1c2luZyB0aGUgdHdvIC5vIGZpbGVzCisjIHNwZWNpZmllZCB3aXRoIGtpbml0LXkuCisjCisjIEFyZSBwYXJ0IG9mIHRoZSBwcm9ncmFtIGxvY2F0ZWQgaW4gYSBzdWItZGlyZWN0b3J5IGRvIGxpa2UgdGhpczoKKyMga2luaXQteSArPSBpcGNvbmZpZy8KKyMKKyMgQW5kIGluIHRoZSBzdWJkaXJlY3Rvcnk6CisjIGlwY29uZmlnL0tidWlsZDoKKyMgbGliLXkgOj0gcGFja2V0Lm8gZGhjcF9wcm90by5vCisjICMgQWxsIC5vIGZpbGVzIGxpc3RlZCB3aXRoIGxpYi15IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBzaW5nbGUgLmEgZmlsZS4KKyMgIyBUaGUgLmEgZmlsZSBpcyBjcmVhdGVkIGJlZm9yZSBhbnkgc3ViZGlyZWN0b3JpZXMgYXJlIHZpc2l0ZWQgc28gaXQKKyMgIyBtYXkgYmUgdXNlZCBpbiB0aGUgc3ViLWRpcmVjdG9yeSBwcm9ncmFtcy4KKyMKKyMjIyMjCisjIEZvciBhIGtsaWJjIGxpYmFyeSBmaWxlIGRvIGxpa2UgdGhpcworIyBrbGliYy9LYnVpbGQKKyMga2xpYi15IDo9IGVycm9yLm8gcGlwZS5vIHpsaWIvCisjCisjIyMjIworIyBIYW5kbGluZyBvZiBjb21waWxlci9saW5rZXIgb3B0aW9ucworIworIyBUbyBzZXQgZGlyZWN0b3J5IHdpZGUgQ0ZMQUdTIHVzZToKKyMgRVhUUkFfS0xJQkNDRkxBR1MgOj0gLURERUJVRworIyBUbyBzZXQgZGlyZWN0b3J5IHdpZGUgQUZMQUdTIHVzZToKKyMgRVhUUkFfS0xJQkNBRkxBR1MgOj0gLURERUJVRworIworIyBUbyBzZXQgdGFyZ2V0IHNwZWNpZmljIENGTEFHUyAoZm9yIC5jIGZpbGVzKSB1c2UKKyMgS0xJQkNDRkxBR1MtbWFpbi5vIDo9IC1EREVCVUc9MworIyBUbyBzZXQgdGFyZ2V0IHNwZWNpZmljIEFGTEFHUyAoZm9yIC5zIGZpbGVzKSB1c2UKKyMgS0xJQkNBRkxBR1MtbWFpbi5vIDo9IC1EREVCVUc9MworCitzcmMgOj0gJChvYmopCisjIFByZXNldCB0YXJnZXQgYW5kIG1ha2Ugc3VyZSBpdCBpcyBhICc6PScgdmFyaWFibGUKK3RhcmdldHMgOj0KKworLnBob255OiBfX2J1aWxkCitfX2J1aWxkOgorCisjIFJlYWQgLmNvbmZpZyBpZiBpdCBleGlzdCwgb3RoZXJ3aXNlIGlnbm9yZQorLWluY2x1ZGUgLmNvbmZpZworCisjIEdlbmVyaWMgS2J1aWxkIHJvdXRpbmVzCitpbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorCisjIERlZmluZXMgdXNlZCB3aGVuIGNvbXBpbGluZyBlYXJseSB1c2Vyc3BhY2UgKGtsaWJjIHByb2dyYW1zKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworS0xJQkNSRVFGTEFHUyAgICAgOj0gJChjYWxsIGNjLW9wdGlvbiwgLWZuby1zdGFjay1wcm90ZWN0b3IsICkKK0tMSUJDQVJDSFJFUUZMQUdTIDo9CitLTElCQ09QVEZMQUdTICAgICA6PQorS0xJQkNXQVJORkxBR1MgICAgOj0gLVcgLVdhbGwgLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtcGFyYW1ldGVyCitLTElCQ1NIQVJFREZMQUdTICA6PQorS0xJQkNCSVRTSVpFICAgICAgOj0KK0tMSUJDTERGTEFHUyAgICAgIDo9CitLTElCQ0NGTEFHUyAgICAgICA6PQorCisjIEFyY2ggc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIGtsaWJjCitpbmNsdWRlICQoS0xJQkNTUkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpL01DT05GSUcKKworIyBpbmNsdWRlL2FzbS0qIGFyY2hpdGVjdHVyZQorS0xJQkNBU01BUkNICSAgPz0gJChLTElCQ0FSQ0gpCisKKyMga2xpYmMgdmVyc2lvbgorS0xJQkNNQUpPUiAgICAgICAgOj0gJChzaGVsbCBjdXQgLWQuIC1mMSAkKHNyY3RyZWUpL3Vzci9rbGliYy92ZXJzaW9uKQorS0xJQkNNSU5PUiAgICAgICAgOj0gJChzaGVsbCBjdXQgLWQuIC1mMiAkKHNyY3RyZWUpL3Vzci9rbGliYy92ZXJzaW9uKQorCisjIGJpbnV0aWxzCitLTElCQ0xEICAgICAgICAgIDo9ICQoTEQpCitLTElCQ0NDICAgICAgICAgIDo9ICQoQ0MpCitLTElCQ0FSICAgICAgICAgIDo9ICQoQVIpCitLTElCQ1JBTkxJQiAgICAgIDo9ICQoUkFOTElCKQorS0xJQkNTVFJJUCAgICAgICA6PSAkKFNUUklQKQorS0xJQkNOTSAgICAgICAgICA6PSAkKE5NKQorS0xJQkNPQkpDT1BZCSA6PSAkKE9CSkNPUFkpCitLTElCQ09CSkRVTVAJIDo9ICQoT0JKRFVNUCkKKworIyBrbGliYyBpbmNsdWRlIHBhdGhzCitLTElCQ0NQUEZMQUdTICAgIDo9IC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggaW5jbHVkZSBcCisJCSAgICAtSSQoS0xJQkNJTkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpCVwKKyAgICAgICAgICAgICAgICAgICAgLUkkKEtMSUJDSU5DKS9iaXRzJChLTElCQ0JJVFNJWkUpCVwKKwkJICAgIC1JJChLTElCQ09CSikvLi4vaW5jbHVkZQkJXAorICAgICAgICAgICAgICAgICAgICAtSSQoS0xJQkNJTkMpCisjIGtlcm5lbCBpbmNsdWRlIHBhdGhzCitLTElCQ0tFUk5FTFNSQwkgPz0gJChzcmN0cmVlKS8KK0tMSUJDQ1BQRkxBR1MgICAgKz0gLUkkKEtMSUJDS0VSTkVMU1JDKWluY2x1ZGUJCVwKKyAgICAgICAgICAgICAgICAgICAgICQoaWYgJChLQlVJTERfU1JDKSwtSSQoS0xJQkNLRVJORUxPQkopaW5jbHVkZTIgLUkkKEtMSUJDS0VSTkVMT0JKKWluY2x1ZGUgLUkkKHNyY3RyZWUpL2luY2x1ZGUpICAgIFwKKwkJICAgICAkKEtMSUJDQVJDSElOQ0ZMQUdTKQorCisjIGtsaWJjIGRlZmluaXRpb25zCitLTElCQ0RFRlMgICAgICAgICs9IC1EX19LTElCQ19fPSQoS0xJQkNNQUpPUikgICAgICAgICAgXAorCQkgICAgLURfX0tMSUJDX01JTk9SX189JChLTElCQ01JTk9SKSAgICBcCisJCSAgICAtRF9CSVRTSVpFPSQoS0xJQkNCSVRTSVpFKQorS0xJQkNDUFBGTEFHUyAgICArPSAkKEtMSUJDREVGUykKK0tMSUJDQ0ZMQUdTICAgICAgKz0gJChLTElCQ0NQUEZMQUdTKSAkKEtMSUJDUkVRRkxBR1MpICQoS0xJQkNBUkNIUkVRRkxBR1MpICBcCisgICAgICAgICAgICAgICAgICAgICQoS0xJQkNPUFRGTEFHUykgJChLTElCQ1dBUk5GTEFHUykKK0tMSUJDQUZMQUdTICAgICAgKz0gLURfX0FTU0VNQkxZX18gJChLTElCQ0NGTEFHUykKK0tMSUJDU1RSSVBGTEFHUyAgKz0gLS1zdHJpcC1hbGwgLVIgLmNvbW1lbnQgLVIgLm5vdGUKKworS0xJQkNMSUJHQ0NfREVGICA6PSAkKHNoZWxsICQoS0xJQkNDQykgJChLTElCQ0NGTEFHUykgLS1wcmludC1saWJnY2MpCitLTElCQ0xJQkdDQwkgPz0gJChLTElCQ0xJQkdDQ19ERUYpCitLTElCQ0NSVDAgICAgICAgIDo9ICQoS0xJQkNPQkopL2FyY2gvJChLTElCQ0FSQ0hESVIpL2NydDAubworS0xJQkNMSUJDICAgICAgICA6PSAkKEtMSUJDT0JKKS9saWJjLmEKK0tMSUJDQ1JUU0hBUkVEICAgOj0gJChLTElCQ09CSikvaW50ZXJwLm8KK0tMSUJDTElCQ1NIQVJFRCAgOj0gJChLTElCQ09CSikvbGliYy5zbworIyBIb3cgdG8gdGVsbCB0aGUgbGlua2VyIG1haW4oKSBpcyB0aGUgZW50cnlwb2ludAorS0xJQkNFTUFJTgkgPz0gLWUgbWFpbgorCisjCisjIFRoaXMgaW5kaWNhdGVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmluYWwgdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisjIFRISVMgTVVTVCBCRSBBTiBBQlNPTFVURSBQQVRIIFdJVEggTk8gRklOQUwgU0xBU0guCisjIExlYXZlIHRoaXMgZW1wdHkgdG8gbWFrZSBpdCB0aGUgcm9vdC4KKyMKK1NITElCRElSID0gL2xpYgorCitleHBvcnQgS0xJQkNMRCBLTElCQ0NDIEtMSUJDQVIgS0xJQkNTVFJJUCBLTElCQ05NCitleHBvcnQgS0xJQkNDRkxBR1MgS0xJQkNBRkxBR1MgS0xJQkNMSUJHQ0MgS0xJQkNTSEFSRURGTEFHUyBLTElCQ1NUUklQRkxBR1MKK2V4cG9ydCBLTElCQ0NSVDAgS0xJQkNMSUJDIFNITElCRElSCisKKyMga2VybmVsIGNvbmZpZ3VyYXRpb24KK2luY2x1ZGUgLmNvbmZpZworCisjIEFkZCAkKG9iaikvIGZvciBwYXRocyB0aGF0IGlzIG5vdCBhYnNvbHV0ZQorb2JqZWN0aWZ5ID0gJChmb3JlYWNoIG8sJCgxKSwkKGlmICQoZmlsdGVyIC8lLCQobykpLCQobyksJChvYmopLyQobykpKQorCisjIEtidWlsZCBmaWxlIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBpcyBiZWluZyBidWlsZAoraW5jbHVkZSAkKG9iaikvS2J1aWxkCisKKyMjIyMjCisjIHN0YXRpYy15ICsgc2hhcmVkLXkgaGFuZGxpbmcKK2twcm9ncyA6PSAkKHN0YXRpYy15KSAkKHNoYXJlZC15KQorIyBrcHJvZ3MgYmFzZWQgb24gYSBzaW5nbGUgLm8gZmlsZSAod2l0aCBzYW1lIG5hbWUgKyAubykKK2twcm9nLW9ianMgOj0gJChmb3JlYWNoIHAsICQoa3Byb2dzKSwgJChpZiAkKCQocCkteSksLCQocCkpKQora3Byb2ctb2JqcyA6PSAkKGFkZHN1ZmZpeCAubywgJChrcHJvZy1vYmpzKSkKKyMga3Byb2dzIHdoaWNoIGlzIGJhc2VkIG9uIHNldmVyYWwgLm8gZmlsZXMKK2twcm9nLW11bHRpIDo9ICQoZm9yZWFjaCBwLCAkKGtwcm9ncyksICQoaWYgJCgkKHApLXkpLCQocCkpKQorIyBvYmplY3RzIHVzZWQgZm9yIGtwcm9ncyB3aXRoIG1vcmUgdGhlbiBvbmUgLm8gZmlsZQora3Byb2ctb2JqcyArPSAkKGZvcmVhY2ggcCwgJChrcHJvZy1tdWx0aSksICQoJChwKS15KSkKKyMgb2JqZWN0cyBidWlsZCBpbiB0aGlzIGRpcgora3Byb2ctcmVhbC1vYmpzIDo9ICQocGF0c3Vic3QgJS8sLCQoa3Byb2ctb2JqcykpCisjIERpcmVjdG9yaWVzIHdlIG5lZWQgdG8gdmlzaXQgYmVmb3JlIGtwcm9ncy1vYmpzIGFyZSB1cC10by1kYXRlCitrcHJvZy1kaXJzIDo9ICAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQoa3Byb2ctb2JqcykpKQorIyByZXBsYWNlIGFsbCBkaXIvIHdpdGggZGlyL2xpYi5hCitrcHJvZy1vYmpzIDo9ICQocGF0c3Vic3QgJS8sICUvbGliLmEsICQoa3Byb2ctb2JqcykpCisKK3RhcmdldHMgKz0gJChzdGF0aWMteSkgJChzaGFyZWQteSkKKworIyMjIyMKKyMga2xpYi15IGhhbmRsaW5nCisjIC5vIGZpbGVzIHRvIGJ1aWxkIGluIHRoaXMgZGlyCitrbGliLXJlYWwtb2JqcyA6PSAkKHBhdHN1YnN0ICUvLCwkKGtsaWIteSkpCisjIERpcmVjdG9yaWVzIHdlIG5lZWQgdG8gdmlzaXQgYmVmb3JlIGxpYnMgYXJlIHVwLXRvLWRhdGUKK2tsaWItZGlycyA6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQoa2xpYi15KSkpCisjIHJlcGxhY2UgYWxsIGRpci8gd2l0aCBkaXIva2xpYi5saXN0CitrbGliLW9ianMgOj0gJChwYXRzdWJzdCAlLywgJS9rbGliLmxpc3QsICQoa2xpYi15KSkKKworIyAkKG91dHB1dC1kaXJzKSBhcmUgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBvYmplY3QgZmlsZXMKK291dHB1dC1kaXJzIDo9ICQoZGlyICQoa3Byb2ctZGlycykgJChrcHJvZy1vYmpzKSkKK291dHB1dC1kaXJzICs9ICQoZm9yZWFjaCBmLCAkKGhvc3Rwcm9ncy15KSAkKHRhcmdldHMpLCBcCisgICAgICAgICAgICAgICAkKGlmICQoZGlyICQoZikpLCAkKGRpciAkKGYpKSkpCitvdXRwdXQtZGlycyArPSAkKGRpciAkKGtsaWItb2JqcykpCitvdXRwdXQtZGlycyA6PSAkKHN0cmlwICQoc29ydCAkKGZpbHRlci1vdXQgLi8sJChvdXRwdXQtZGlycykpKSkKKworIyBwcmVmaXggc28gd2UgZ2V0IGZ1bGwgZGlyCitzdGF0aWMteSAgICAgICAgOj0gJChhZGRwcmVmaXggJChvYmopLywkKHN0YXRpYy15KSkKK3NoYXJlZC15ICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc2hhcmVkLXkpKQora3Byb2ctb2JqcyAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrcHJvZy1vYmpzKSkKK2twcm9nLXJlYWwtb2JqcyA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoa3Byb2ctcmVhbC1vYmpzKSkKK291dHB1dC1kaXJzICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob3V0cHV0LWRpcnMpKQora3Byb2ctZGlycyAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrcHJvZy1kaXJzKSkKK3N1YmRpci15ICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXkpKQorYWx3YXlzICAgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChhbHdheXMpKQordGFyZ2V0cyAgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJCh0YXJnZXRzKSkKK2xpYi15ICAgICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQobGliLXkpKQora2xpYi15ICAgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrbGliLXkpKQora2xpYi1vYmpzICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrbGliLW9ianMpKQora2xpYi1yZWFsLW9ianMgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChrbGliLXJlYWwtb2JqcykpCitrbGliLWRpcnMgICAgICAgOj0gJChhZGRwcmVmaXggJChvYmopLywkKGtsaWItZGlycykpCisKKyMjIyMjCisjIEhhbmRsZSBvcHRpb25zIHRvIGdjYy4gU3VwcG9ydCBidWlsZGluZyB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKKworX19rbGliY2NmbGFncyAgICA9ICQoS0xJQkNDRkxBR1MpICQoRVhUUkFfS0xJQkNDRkxBR1MpICQoS0xJQkNDRkxBR1NfJCgqRikubykKK19fa2xpYmNhZmxhZ3MgICAgPSAkKEtMSUJDQUZMQUdTKSAkKEVYVFJBX0tMSUJDQUZMQUdTKSAkKEtMSUJDQUZMQUdTXyQoKkYpLm8pCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorX2tsaWJjY2ZsYWdzICAgID0gJChfX2tsaWJjY2ZsYWdzKQorX2tsaWJjYWZsYWdzICAgID0gJChfX2tsaWJjYWZsYWdzKQorZWxzZQorX2tsaWJjY2ZsYWdzICAgID0gJChjYWxsIGZsYWdzLF9fa2xpYmNjZmxhZ3MpCitfa2xpYmNhZmxhZ3MgICAgPSAkKGNhbGwgZmxhZ3MsX19rbGliY2FmbGFncykKK2VuZGlmCisKK2tsaWJjY2ZsYWdzICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKF9rbGliY2NmbGFncykKK2tsaWJjYWZsYWdzICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKF9rbGliY2FmbGFncykKKworIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeSBpZiBub3QgYWxyZWFkeSBwcmVzZW50CitfZHVtbXkgOj0gJChzaGVsbCBbIC1kICQob2JqKSBdIHx8IG1rZGlyIC1wICQob2JqKSkKKworIyBDcmVhdGUgZGlyZWN0b3JpZXMgZm9yIG9iamVjdCBmaWxlcyBpZiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyMgTmVlZGVkIHdoZW4gbGliLXkgOj0gZGlyL2ZpbGUubyBzeW50YXggaXMgdXNlZAorX2R1bW15IDo9ICQoZm9yZWFjaCBkLCQob3V0cHV0LWRpcnMpLCAkKHNoZWxsIFsgLWQgJChkKSBdIHx8IG1rZGlyIC1wICQoZCkpKQorCisjIERvIHdlIGhhdmUgdG8gbWFrZSBhIGxpYi5hIGluIHRoaXMgZGlyPworaWZuZXEgKCQoc3RyaXAgJChsaWIteSkgJChsaWItbikgJChsaWItKSksKQorbGliLXRhcmdldCA6PSAkKG9iaikvbGliLmEKK2VuZGlmCisKK19fYnVpbGQ6ICQoc3ViZGlyLXkpICQobGliLXRhcmdldCkgJChhbHdheXMpCisJJChRKToKKworIyBDb21waWxlIEMgc291cmNlcyAoLmMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitxdWlldF9jbWRfY2Nfc19jID0gS0xJQkNDQyAkQAorICAgICAgY21kX2NjX3NfYyA9ICQoS0xJQkNDQykgJChrbGliY2NmbGFncykgLVMgLW8gJEAgJDwKKworJS5zOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfc19jKQorCitxdWlldF9jbWRfY2Nfb19jID0gS0xJQkNDQyAkQAorICAgICAgY21kX2NjX29fYyA9ICQoS0xJQkNDQykgJChrbGliY2NmbGFncykgLWMgLW8gJEAgJDwKKworJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfb19jKQorCitxdWlldF9jbWRfY2NfaV9jID0gQ1BQICAgICAkQAorICAgICAgY21kX2NjX2lfYyA9ICQoS0xJQkNDQykgLUUgJChrbGliY2NmbGFncykgLW8gJEAgJDwKKyUuaTogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX2lfYykKKworIyBDb21waWxlIGFzc2VtYmxlciBzb3VyY2VzICguUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3F1aWV0X2NtZF9hc19vX1MgPSBLTElCQ0FTICRACisgICAgICBjbWRfYXNfb19TID0gJChLTElCQ0NDKSAkKGtsaWJjYWZsYWdzKSAtYyAtbyAkQCAkPAorCislLm86ICUuUyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxhc19vX1MpCisKK3RhcmdldHMgKz0gJChyZWFsLW9ianMteSkKKworIworIyBSdWxlIHRvIGNvbXBpbGUgYSBzZXQgb2YgLm8gZmlsZXMgaW50byBvbmUgLm8gZmlsZQorIworaWZkZWYgbGliLXRhcmdldAorcXVpZXRfY21kX2xpbmtfb190YXJnZXQgPSBMRCAgICAgICRACisjIElmIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gbGluayBpcyBlbXB0eSwganVzdCBjcmVhdGUgYW4gZW1wdHkgbGliLmEKK2NtZF9saW5rX29fdGFyZ2V0ID0gJChpZiAkKHN0cmlwICQobGliLXkpKSxcCisgICAgICAgICAgICAgICAgICAgIHJtIC1mICRAOyAkKEtMSUJDQVIpIGNydSAkQCAkKGZpbHRlciAkKGxpYi15KSwgJF4pLFwKKyAgICAgICAgICAgICAgICAgICAgcm0gLWYgJEA7ICQoS0xJQkNBUikgY3JzICRAKQorCiskKGxpYi10YXJnZXQpOiAkKGxpYi15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfb190YXJnZXQpCit0YXJnZXRzICs9ICQobGliLXRhcmdldCkgJChsaWIteSkKK2VuZGlmICMgbGliLXRhcmdldAorCisjCisjIENyZWF0ZSBrbGliLmxpc3QKKyMKKyMgRG8gd2UgaGF2ZSB0byBjcmVhdGUgYSBrbGliYyBsaWJyYXJ5IGZpbGUgaW4gdGhpcyBkaXI/CitpZm5lcSAoJChzdHJpcCAkKGtsaWIteSkgJChrbGliLW4pICQoa2xpYi0pKSwpCitrbGliLXRhcmdldCA6PSAkKG9iaikva2xpYi5saXN0CitlbmRpZgorCitpZmRlZiBrbGliLXRhcmdldAorIyBpbmNsdWRlIHRoaXMgaW4gYnVpbGQKK19fYnVpbGQ6ICQoa2xpYi10YXJnZXQpICQoa2xpYi1kaXJzKQorCisjIGRlc2NlbmQgaWYgbmVlZGVkCiskKHNvcnQgJChhZGRzdWZmaXggL2tsaWIubGlzdCwkKGtsaWItZGlycykpKTogJChrbGliLWRpcnMpIDsKKworIyBjcmVhdGUga2xpYi5saXN0CitxdWlldF9jbWRfa2xpYi1saXN0ID0gTElTVCAgICAkQAorICAgICAgY21kX2tsaWItbGlzdCA9IGVjaG8gJChrbGliLXJlYWwtb2JqcykgPiAkQAorJChrbGliLXRhcmdldCk6ICQoa2xpYi1vYmpzKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGtsaWItbGlzdCkKK3RhcmdldHMgKz0gJChrbGliLXRhcmdldCkgJChrbGliLXJlYWwtb2JqcykKK2VuZGlmICMga2xpYi10YXJnZXQKKworaWZkZWYga3Byb2dzCisjIENvbXBpbGUga2xpYmMtcHJvZ3JhbXMgZm9yIHRoZSB0YXJnZXQKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK19fYnVpbGQgOiAkKGtwcm9nLWRpcnMpICQoc3RhdGljLXkpICQoc2hhcmVkLXkpCisKKyMgRGVzY2VuZCBpZiBuZWVkZWQKKyQoc29ydCAkKGFkZHN1ZmZpeCAvbGliLmEsJChrcHJvZy1kaXJzKSkpOiAkKGtwcm9nLWRpcnMpIDsKKworIyBEZWZpbmUgZGVwZW5kZW5jaWVzIGZvciBsaW5rIG9mIHByb2dzCisjIEZvciB0aGUgc2ltcGxlIHByb2dyYW06CisjCWZpbGUubyA9PiBmaWxlCisjIEEgcHJvZ3JhbSB3aXRoIG11bHRpcGxlIG9iamVjdHMKKyMJZmlsZWEubywgZmlsZWIubyA9PiBmaWxlCisjIEEgcHJvZ3JhbSB3aXRoIC5vIGZpbGVzIGluIGFub3RoZXIgZGlyCisjCWRpci9saWIuYSBmaWxlYS5vID0+IGZpbGUKKworc3RyaXBvYmogID0gJChzdWJzdCAkKG9iaikvLCwkQCkKK2FkZGxpYmEgICA9ICQoYWRkcHJlZml4ICQob2JqKS8sICQocGF0c3Vic3QgJS8sICUvbGliLmEsICQoMSkpKQorbGluay1kZXBzID0gJChpZiAkKCQoc3RyaXBvYmopLXkpLCAkKGNhbGwgYWRkbGliYSwgJCgkKHN0cmlwb2JqKS15KSksICRALm8pIFwKKwkgICAgJChjYWxsIG9iamVjdGlmeSwkKCQoc3RyaXBvYmopLWxpYikpCisKK3F1aWV0X2NtZF9sZC1zdGF0aWMgPSBLTElCQ0xEICRACisgICAgICBjbWRfbGQtc3RhdGljID0gJChLTElCQ0xEKSAkKEtMSUJDTERGTEFHUykgLW8gJEAJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgJChFWFRSQV9LTElCQ0xERkxBR1MpCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDQ1JUMCkJCQkJXAorCQkgICAgICAgLS1zdGFydC1ncm91cAkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICQobGluay1kZXBzKQkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNMSUJDKQkJCQlcCisJCSAgICAgICAkKEtMSUJDTElCR0NDKQkJCQlcCisJCSAgICAgICAtLWVuZC1ncm91cCA7CQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICBjcCAtZiAkQCAkQC5nIDsJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNTVFJJUCkgJChLTElCQ1NUUklQRkxBR1MpICRACisKKworJChzdGF0aWMteSk6ICQoa3Byb2ctb2JqcykgJChsaWItdGFyZ2V0KSAkKEtMSUJDQ1JUMCkgJChLTElCQ0xJQkMpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGQtc3RhdGljKQorCitxdWlldF9jbWRfbGQtc2hhcmVkID0gS0xJQkNMRCAkQAorICAgICAgY21kX2xkLXNoYXJlZCA9ICQoS0xJQkNMRCkgJChLTElCQ0xERkxBR1MpIC1vICRACQlcCisgICAgICAgICAgICAgICAgICAgICAgICQoRVhUUkFfS0xJQkNMREZMQUdTKQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ0VNQUlOKSAkKEtMSUJDQ1JUU0hBUkVEKQkJXAorICAgICAgICAgICAgICAgICAgICAgICAtLXN0YXJ0LWdyb3VwCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgJChsaW5rLWRlcHMpCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgLVIgJChLTElCQ0xJQkNTSEFSRUQpCQkJXAorCSAgICAgICAgICAgICAgICQoS0xJQkNMSUJHQ0MpCQkJCVwKKwkJICAgICAgIC0tZW5kLWdyb3VwIDsJCQkJXAorICAgICAgICAgICAgICAgICAgICAgIGNwIC1mICRAICRALmcgOwkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ1NUUklQKSAkKEtMSUJDU1RSSVBGTEFHUykgJEAKKworCiskKHNoYXJlZC15KTogJChrcHJvZy1vYmpzKSAkKGxpYi10YXJnZXQpICQoS0xJQkNDUlRTSEFSRUQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ0xJQkNTSEFSRUQpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGQtc2hhcmVkKQorCisjIERvIG5vdCB0cnkgdG8gYnVpbGQgS0xJQkMgbGliYXJpZXMgaWYgd2UgYXJlIGJ1aWxkaW5nIGtsaWJjCitpZmVxICgkKGtsaWJjLWJ1aWxkKSwpCiskKEtMSUJDQ1JUMCkgJChLTElCQ0xJQkMpOiA7CiskKEtMSUJDQ1JUU0hBUkVEKSAkKEtMSUJDTElCQ1NIQVJFRCk6IDsKK2VuZGlmCisKK3RhcmdldHMgKz0gJChrcHJvZy1yZWFsLW9ianMpCitlbmRpZgorCisjIENvbXBpbGUgcHJvZ3JhbXMgb24gdGhlIGhvc3QKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpZmRlZiBob3N0cHJvZ3MteQoraW5jbHVkZSAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUuaG9zdAorZW5kaWYKKworIyBEZXNjZW5kaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuUEhPTlk6ICQoc3ViZGlyLXkpICQoa3Byb2ctZGlycykgJChrbGliLWRpcnMpCiskKHNvcnQgJChzdWJkaXIteSkgJChrcHJvZy1kaXJzKSAkKGtsaWItZGlycykpOiAkKGxpYi10YXJnZXQpCisJJChRKSQoTUFLRSkgJChrbGliYyk9JEAKKworIyBBZGQgRk9SQ0UgdG8gdGhlIHByZXF1aXNpdGVzIG9mIGEgdGFyZ2V0IHRvIGZvcmNlIGl0IHRvIGJlIGFsd2F5cyByZWJ1aWx0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiBGT1JDRQorCitGT1JDRToKKworIyBMaW5raW5nCisjIENyZWF0ZSBhIHJlbG9jdGFibGUgY29tcG9zaXRlIG9iamVjdCBmaWxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcXVpZXRfY21kX2tsaWJjbGQgPSBLTElCQ0xEICRACisgICAgICBjbWRfa2xpYmNsZCA9ICQoS0xJQkNMRCkgLXIgJChLTElCQ0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChFWFRSQV9LTElCQ0xERkxBR1MpICQoS0xJQkNMREZMQUdTXyQoQEYpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyLW91dCBGT1JDRSwkXikgLW8gJEAKKworCisjIExpbmsgdGFyZ2V0IHRvIGEgbmV3IG5hbWUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitxdWlldF9jbWRfbG4gPSBMTiAgICAgICRACisgICAgICBjbWRfbG4gPSBybSAtZiAkQCAmJiBsbiAkPCAkQAorCisjIFN0cmlwIHRhcmdldCAocmVtb3ZlIGFsbCBkZWJ1Z2dpbmcgaW5mbykKK3F1aWV0X2NtZF9zdHJpcCA9IFNUUklQICAgJEAKKyAgICAgIGNtZF9zdHJpcCA9ICQoS0xJQkNTVFJJUCkgJChLTElCQ1NUUklQRkxBR1MpICQ8IC1vICRACisKKworIyBSZWFkIGFsbCBzYXZlZCBjb21tYW5kIGxpbmVzIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSAkKHRhcmdldHMpIHdlCisjIG1heSBiZSBidWlsZGluZyBhYm92ZSwgdXNpbmcgJChpZl9jaGFuZ2VkeyxfZGVwfSkuIEFzIGFuCisjIG9wdGltaXphdGlvbiwgd2UgZG9uJ3QgbmVlZCB0byByZWFkIHRoZW0gaWYgdGhlIHRhcmdldCBkb2VzIG5vdAorIyBleGlzdCwgd2Ugd2lsbCByZWJ1aWxkIGFueXdheSBpbiB0aGF0IGNhc2UuCit0YXJnZXRzIDo9ICQod2lsZGNhcmQgJChzb3J0ICQodGFyZ2V0cykpKQorY21kX2ZpbGVzIDo9ICQod2lsZGNhcmQgJChmb3JlYWNoIGYsJCh0YXJnZXRzKSwkKGRpciAkKGYpKS4kKG5vdGRpciAkKGYpKS5jbWQpKQorCitpZm5lcSAoJChjbWRfZmlsZXMpLCkKKyAgaW5jbHVkZSAkKGNtZF9maWxlcykKK2VuZGlmCisKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSAtZiBzY3JpcHRzL0tidWlsZC5rbGliYyBvYmoKKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoa2xpYmMpPWRpcgora2xpYmMgOj0gLXJSIC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL0tidWlsZC5rbGliYyBvYmoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4gYi9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCmluZGV4IGNmZjMzNDkuLjJkODQyMjIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbgpAQCAtMTksMjMgKzE5LDE4IEBACiAjIEZpZ3VyZSBvdXQgd2hhdCB3ZSBuZWVkIHRvIGJ1aWxkIGZyb20gdGhlIHZhcmlvdXMgdmFyaWFibGVzCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLV9fc3ViZGlyLXkJOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai15KSkpCi1zdWJkaXIteQkrPSAkKF9fc3ViZGlyLXkpCi1fX3N1YmRpci1tCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbSkpKQotc3ViZGlyLW0JKz0gJChfX3N1YmRpci1tKQotX19zdWJkaXItbgk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLW4pKSkKLXN1YmRpci1uCSs9ICQoX19zdWJkaXItbikKLV9fc3ViZGlyLQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLSkpKQotc3ViZGlyLQkJKz0gJChfX3N1YmRpci0pCitzdWJkaXJzIDo9ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pICQoc3ViZGlyLW4pICQoc3ViZGlyLSkKK3N1YmRpcnMgKz0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai15KSkpCitzdWJkaXJzICs9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbSkpKQorc3ViZGlycyArPSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLW4pKSkKK3N1YmRpcnMgKz0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai0pKSkKKworc3ViZGlycyArPSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQoa2xpYi15KSkpCitzdWJkaXJzICs9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChrbGliLSkpKQogCiAjIFN1YmRpcmVjdG9yaWVzIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvCitzdWJkaXJzIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzb3J0ICQoc3ViZGlycykpKQogCi1zdWJkaXIteW0JOj0gJChzb3J0ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pKQotc3ViZGlyLXltbiAgICAgIDo9ICQoc29ydCAkKHN1YmRpci15bSkgJChzdWJkaXItbikgJChzdWJkaXItKSkKLQotIyBBZGQgc3ViZGlyIHBhdGgKLQotc3ViZGlyLXltbgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltbikpCiAKICMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxlYXRpdmUgdG8gdGhlIGN1cnJlbnQKICMgZGlyZWN0b3J5CkBAIC00Myw3ICszOCw4IEBACiBfX2NsZWFuLWZpbGVzCTo9ICQoZXh0cmEteSkgJChFWFRSQV9UQVJHRVRTKSAkKGFsd2F5cykgXAogCQkgICAkKHRhcmdldHMpICQoY2xlYW4tZmlsZXMpICAgICAgICAgICAgIFwKIAkJICAgJChob3N0LXByb2dzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICQoaG9zdHByb2dzLXkpICQoaG9zdHByb2dzLW0pICQoaG9zdHByb2dzLSkKKwkJICAgJChob3N0cHJvZ3MteSkgJChob3N0cHJvZ3MtbSkgJChob3N0cHJvZ3MtKSBcCisJCSAgIGtsaWIubGlzdAogCiAjIGFzIGNsZWFuLWZpbGVzIGlzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhpcyBhZGRzCiAjIGEgJChvYmopIHByZWZpeCwgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocwpAQCAtNjcsNyArNjMsNyBAQAogICAgICAgY21kX2NsZWFuZGlyID0gcm0gLXJmICQoX19jbGVhbi1kaXJzKQogCiAKLV9fY2xlYW46ICQoc3ViZGlyLXltbikKK19fY2xlYW46ICQoc3ViZGlycykKIGlmbmVxICgkKHN0cmlwICQoX19jbGVhbi1maWxlcykpLCkKIAkrJChjYWxsIGNtZCxjbGVhbikKIGVuZGlmCkBAIC04Nyw4ICs4Myw4IEBACiAjIERlc2NlbmRpbmcKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVBIT05ZICs9ICQoc3ViZGlyLXltbikKLSQoc3ViZGlyLXltbik6CisuUEhPTlk6ICQoc3ViZGlycykKKyQoc3ViZGlycyk6CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JEAKIAogIyBJZiBxdWlldCBpcyBzZXQsIG9ubHkgcHJpbnQgc2hvcnQgdmVyc2lvbiBvZiBjb21tYW5kCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaCBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCmluZGV4IDQzZjc1ZDYuLjk5ZWM2NGUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCisrKyBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCkBAIC0xNSw3ICsxNSw3IEBACiB1c2FnZSgpIHsKIGNhdCA8PCBFT0YKIFVzYWdlOgotJDAgWy1vIDxmaWxlPl0gWy11IDx1aWQ+XSBbLWcgPGdpZD5dIHstZCB8IDxjcGlvX3NvdXJjZT59IC4uLgorJDAgWy1vIDxmaWxlPl0gWy11IDx1aWQ+XSBbLWcgPGdpZD5dIDxjcGlvX3NvdXJjZT4gLi4uCiAJLW8gPGZpbGU+ICAgICAgQ3JlYXRlIGd6aXBwZWQgaW5pdHJhbWZzIGZpbGUgbmFtZWQgPGZpbGU+IHVzaW5nCiAJCSAgICAgICBnZW5faW5pdF9jcGlvIGFuZCBnemlwCiAJLXUgPHVpZD4gICAgICAgVXNlciBJRCB0byBtYXAgdG8gdXNlciBJRCAwIChyb290KS4KQEAgLTI3LDcgKzI3LDYgQEAKIAk8Y3Bpb19zb3VyY2U+ICBGaWxlIGxpc3Qgb3IgZGlyZWN0b3J5IGZvciBjcGlvIGFyY2hpdmUuCiAJCSAgICAgICBJZiA8Y3Bpb19zb3VyY2U+IGlzIGEgLmNwaW8gZmlsZSBpdCB3aWxsIGJlIHVzZWQKIAkJICAgICAgIGFzIGRpcmVjdCBpbnB1dCB0byBpbml0cmFtZnMuCi0JLWQgICAgICAgICAgICAgT3V0cHV0IHRoZSBkZWZhdWx0IGNwaW8gbGlzdC4KIAogQWxsIG9wdGlvbnMgZXhjZXB0IC1vIGFuZCAtbCBtYXkgYmUgcmVwZWF0ZWQgYW5kIGFyZSBpbnRlcnByZXRlZAogc2VxdWVudGlhbGx5IGFuZCBpbW1lZGlhdGVseS4gIC11IGFuZCAtZyBzdGF0ZXMgYXJlIHByZXNlcnZlZCBhY3Jvc3MKQEAgLTM2LDI5ICszNSw2IEBACiBFT0YKIH0KIAotIyBhd2sgc3R5bGUgZmllbGQgYWNjZXNzCi0jICQxIC0gZmllbGQgbnVtYmVyOyByZXN0IGlzIGFyZ3VtZW50IHN0cmluZwotZmllbGQoKSB7Ci0Jc2hpZnQgJDEgOyBlY2hvICQxCi19Ci0KLWxpc3RfZGVmYXVsdF9pbml0cmFtZnMoKSB7Ci0JIyBlY2hvIHVzci9raW5pdC9raW5pdAotCToKLX0KLQotZGVmYXVsdF9pbml0cmFtZnMoKSB7Ci0JY2F0IDw8LUVPRiA+PiAke291dHB1dH0KLQkJIyBUaGlzIGlzIGEgdmVyeSBzaW1wbGUsIGRlZmF1bHQgaW5pdHJhbWZzCi0KLQkJZGlyIC9kZXYgMDc1NSAwIDAKLQkJbm9kIC9kZXYvY29uc29sZSAwNjAwIDAgMCBjIDUgMQotCQlkaXIgL3Jvb3QgMDcwMCAwIDAKLQkJIyBmaWxlIC9raW5pdCB1c3Iva2luaXQva2luaXQgMDc1NSAwIDAKLQkJIyBzbGluayAvaW5pdCBraW5pdCAwNzU1IDAgMAotCUVPRgotfQotCiBmaWxldHlwZSgpIHsKIAlsb2NhbCBhcmd2MT0iJDEiCiAKQEAgLTE2OCw4ICsxNDQsNiBAQAogCiAjIHByb2Nlc3Mgb25lIGRpcmVjdG9yeSAoaW5jbCBzdWItZGlyZWN0b3JpZXMpCiBkaXJfZmlsZWxpc3QoKSB7Ci0JJHtkZXBfbGlzdH1oZWFkZXIgIiQxIgotCiAJc3JjZGlyPSQoZWNobyAiJDEiIHwgc2VkIC1lICdzOi8vKjovOmcnKQogCWRpcmxpc3Q9JChmaW5kICIke3NyY2Rpcn0iIC1wcmludGYgIiVwICVtICVVICVHXG4iIDI+L2Rldi9udWxsKQogCkBAIC0xODgsOSArMTYyLDcgQEAKICMgaWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHRoZW4gYWRkIGFsbCBmaWxlcyBpbiBnaXZlbiBkaXJlY290cnkgdG8gZnMKICMgaWYgYSByZWd1bGFyIGZpbGUgaXMgc3BlY2lmaWVkIGFzc3VtZSBpdCBpcyBpbiBnZW5faW5pdHJhbWZzIGZvcm1hdAogaW5wdXRfZmlsZSgpIHsKLQlzb3VyY2U9IiQxIgogCWlmIFsgLWYgIiQxIiBdOyB0aGVuCi0JCSR7ZGVwX2xpc3R9aGVhZGVyICIkMSIKIAkJaXNfY3Bpbz0iJChlY2hvICIkMSIgfCBzZWQgJ3MvXi4qXC5jcGlvL2NwaW8vJykiCiAJCWlmIFsgJDIgLWVxIDAgLWEgJHtpc19jcGlvfSA9PSAiY3BpbyIgXTsgdGhlbgogCQkJY3Bpb19maWxlPSQxCkBAIC0yMTUsNiArMTg3LDE1IEBACiAJZmkKIH0KIAorIyBpbnB1dCBmaWxlL2RpciAtIHByb2Nlc3MgaXQKK3Byb2Nlc3NfZmlsZSgpIHsKKwlpZiBbIC16ICR7cHJpbnRfaGVhZGVyfSBdOyB0aGVuCisJCSR7ZGVwX2xpc3R9aGVhZGVyICIkMSIKKwlmaQorCXByaW50X2hlYWRlcj15CisJaW5wdXRfZmlsZSAiJDEiICIkMiIKK30KKwogcHJvZz0kMAogcm9vdF91aWQ9MAogcm9vdF9naWQ9MApAQCAtMjUxLDI3ICsyMzIsMjkgQEAKIAkJCXJvb3RfZ2lkPSIkMSIKIAkJCXNoaWZ0CiAJCQk7OwotCQkiLWQiKQkjIGRpc3BsYXkgZGVmYXVsdCBpbml0cmFtZnMgbGlzdAotCQkJZGVmYXVsdF9saXN0PSIkYXJnIgotCQkJJHtkZXBfbGlzdH1kZWZhdWx0X2luaXRyYW1mcwotCQkJOzsKIAkJIi1oIikKIAkJCXVzYWdlCiAJCQlleGl0IDAKIAkJCTs7CiAJCSopCiAJCQljYXNlICIkYXJnIiBpbgotCQkJCSItIiopCi0JCQkJCXVua25vd25fb3B0aW9uCisJCQkJIi0iKikJdW5rbm93bl9vcHRpb24KIAkJCQkJOzsKLQkJCQkqKQkjIGlucHV0IGZpbGUvZGlyIC0gcHJvY2VzcyBpdAotCQkJCQlpbnB1dF9maWxlICIkYXJnIiAiJCMiCisJCQkJKikJcHJvY2Vzc19maWxlICIkYXJnIiAiJCMiCiAJCQkJCTs7CiAJCQllc2FjCiAJCQk7OwogCWVzYWMKIGRvbmUKIAorIyB0cmFpbGVyIG9mIGRlcGVuZGVuY3kgbGlzdAoraWYgWyAhIC16ICR7ZGVwX2xpc3R9IF07IHRoZW4KKwllY2hvICIiCisJZWNobyAiaW5pdHJhbWZzOiBcJChkZXBzX2luaXRyYW1mcykiCisJZWNobyAiXCQoZGVwc19pbml0cmFtZnMpOiA7IgorCWVjaG8gIiIKK2ZpCisKICMgSWYgb3V0cHV0X2ZpbGUgaXMgc2V0IHdlIHdpbGwgZ2VuZXJhdGUgY3BpbyBhcmNoaXZlIGFuZCBnemlwIGl0CiAjIHdlIGFyZSBjYXJlZnVsbCB0byBkZWxldGUgdG1wIGZpbGVzCiBpZiBbICEgLXogJHtvdXRwdXRfZmlsZX0gXTsgdGhlbgpkaWZmIC0tZ2l0IGEvdXNyL0tidWlsZCBiL3Vzci9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwYTA0NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9LYnVpbGQKQEAgLTAsMCArMSw3NSBAQAorIworIyBrYnVpbGQgZmlsZSBmb3IgdXNyLyAtIGluY2x1ZGluZyBpbml0cmFtZnMgaW1hZ2UgYW5kIGtsaWJjCisjCisKK0NPTkZJR19LTElCQyA6PSAxCisKK2luY2x1ZGUtc3ViZGlyIDo9IGluY2x1ZGUKK2tsaWJjLXN1YmRpciA6PSBrbGliYwordXNyLXN1YmRpcnMgIDo9IGtpbml0IHV0aWxzIGRhc2ggZ3ppcAorc3ViZGlyLSAgICAgIDo9ICQoaW5jbHVkZS1zdWJkaXIpICQoa2xpYmMtc3ViZGlyKSAkKHVzci1zdWJkaXJzKQorCit1c3Itc3ViZGlycyAgOj0gJChhZGRwcmVmaXggX3Vzcl8sJCh1c3Itc3ViZGlycykpCitrbGliYy1zdWJkaXIgOj0gJChhZGRwcmVmaXggX3Vzcl8sJChrbGliYy1zdWJkaXIpKQorCisjIEtsaWJjIGJpbmFyaWVzCitpZmRlZiBDT05GSUdfS0xJQkMKKworIyAuaW5pdHJhbWZzX2RhdGEuY3Bpby5nei5kIGlzIHVzZWQgdG8gaWRlbnRpZnkgYWxsIGZpbGVzIGluY2x1ZGVkCisjIGluIGluaXRyYW1mcyBhbmQgdG8gZGV0ZWN0IGlmIGFueSBmaWxlcyBhcmUgYWRkZWQvcmVtb3ZlZC4KKyMgUmVtb3ZlZCBmaWxlcyBhcmUgaWRlbnRpZmllZCBieSBkaXJlY3RvcnkgdGltZXN0YW1wIGJlaW5nIHVwZGF0ZWQKKyMgVGhlIGRlcGVuZGVuY3kgbGlzdCBpcyBnZW5lcmF0ZWQgYnkgZ2VuX2luaXRyYW1mcy5zaCAtbAoraWZuZXEgKCQod2lsZGNhcmQgJChvYmopLy5pbml0cmFtZnNfZGF0YS5jcGlvLmd6LmQpLCkKKwlpbmNsdWRlICQob2JqKS8uaW5pdHJhbWZzX2RhdGEuY3Bpby5nei5kCitlbmRpZgorCisjIGJ1aWxkIGtsaWJjIGxpYnJhcnkgYmVmb3JlIHRoZSBrbGliYyBwcm9ncmFtcworIyBidWlsZCBrbGliYyBwcm9ncmFtcyBiZWZvcmUgY3Bpby5negorLlBIT05ZOiBpbml0cmFtZnMgJCh1c3Itc3ViZGlycykgJChrbGliYy1zdWJkaXIpICQoaW5jbHVkZS1zdWJkaXIpCitpbml0cmFtZnM6ICAgICAgICAgJCh1c3Itc3ViZGlycykgJChrbGliYy1zdWJkaXIpICQoaW5jbHVkZS1zdWJkaXIpCiskKGRlcHNfaW5pdHJhbWZzKTogJCh1c3Itc3ViZGlycykgJChrbGliYy1zdWJkaXIpICQoaW5jbHVkZS1zdWJkaXIpCisKKyQodXNyLXN1YmRpcnMpOiAkKGtsaWJjLXN1YmRpcikKKwkkKFEpJChNQUtFKSAkKGtsaWJjKT0kKHNyYykvJChwYXRzdWJzdCBfdXNyXyUsJSwkKEApKQorCiskKGtsaWJjLXN1YmRpcik6ICQoaW5jbHVkZS1zdWJkaXIpCisJJChRKSQoTUFLRSkgJChrbGliYyk9JChzcmMpLyQocGF0c3Vic3QgX3Vzcl8lLCUsJChAKSkKKworJChpbmNsdWRlLXN1YmRpcik6CisJJChRKSQoTUFLRSkgJChrbGliYyk9JChzcmMpLyQocGF0c3Vic3QgX3Vzcl8lLCUsJChAKSkKK2VuZGlmCisKKworIyBHZW5lcmF0ZSBidWlsdGluLm8gYmFzZWQgb24gaW5pdHJhbWZzX2RhdGEubworb2JqLSQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSA6PSBpbml0cmFtZnNfZGF0YS5vCisKKyMgaW5pdHJhbWZzX2RhdGEubyBjb250YWlucyB0aGUgaW5pdHJhbWZzX2RhdGEuY3Bpby5neiBpbWFnZS4KKyMgVGhlIGltYWdlIGlzIGluY2x1ZGVkIHVzaW5nIC5pbmNiaW4sIGEgZGVwZW5kZW5jeSB3aGljaCBpcyBub3QKKyMgdHJhY2tlZCBhdXRvbWF0aWNhbGx5LgorJChvYmopL2luaXRyYW1mc19kYXRhLm86ICQob2JqKS9pbml0cmFtZnNfZGF0YS5jcGlvLmd6IEZPUkNFCisKKyMjIyMjCisjIEdlbmVyYXRlIHRoZSBpbml0cmFtZnMgY3BpbyBhcmNoaXZlCisKK2hvc3Rwcm9ncy15IDo9IGdlbl9pbml0X2NwaW8KK2dpbml0cmFtZnMgIDo9ICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCityYW1mcy1kZWYgICA6PSAkKHNyY3RyZWUpLyQoc3JjKS9pbml0cmFtZnMuZGVmYXVsdAorcmFtZnMtaW5wdXQgOj0gJChzaGVsbCBlY2hvICQoQ09ORklHX0lOSVRSQU1GU19TT1VSQ0UpKQorcmFtZnMtaW5wdXQgOj0gJChpZiAkKHJhbWZzLWlucHV0KSwgJChyYW1mcy1pbnB1dCksICQocmFtZnMtZGVmKSkKKworcmFtZnMtYXJncyAgOj0gXAorICAgICAgICAkKGlmICQoQ09ORklHX0lOSVRSQU1GU19ST09UX1VJRCksIC11ICQoQ09ORklHX0lOSVRSQU1GU19ST09UX1VJRCkpIFwKKyAgICAgICAgJChpZiAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9HSUQpLCAtZyAkKENPTkZJR19JTklUUkFNRlNfUk9PVF9HSUQpKQorCitxdWlldF9jbWRfaW5pdGZzID0gR0VOICAgICAkQAorICAgICAgY21kX2luaXRmcyA9ICQoZ2luaXRyYW1mcykgLW8gJEAgJChyYW1mcy1hcmdzKSAkKHJhbWZzLWlucHV0KQorCit0YXJnZXRzIDo9IGluaXRyYW1mc19kYXRhLmNwaW8uZ3oKKyMgV2UgcmVidWlsZCBpbml0cmFtZnNfZGF0YS5jcGlvLmd6IGlmOgorIyAxKSBBbnkgaW5jbHVkZWQgZmlsZSBpcyBuZXdlciB0aGVuIGluaXRyYW1mc19kYXRhLmNwaW8uZ3oKKyMgMikgVGhlcmUgYXJlIGNoYW5nZXMgaW4gd2hpY2ggZmlsZXMgYXJlIGluY2x1ZGVkIChhZGRlZCBvciBkZWxldGVkKQorIyAzKSBJZiBnZW5faW5pdF9jcGlvIGFyZSBuZXdlciB0aGFuIGluaXRyYW1mc19kYXRhLmNwaW8uZ3oKKyMgNCkgYXJndW1lbnRzIHRvIGdlbl9pbml0cmFtZnMuc2ggY2hhbmdlcworJChvYmopL2luaXRyYW1mc19kYXRhLmNwaW8uZ3o6ICQob2JqKS9nZW5faW5pdF9jcGlvICQoZGVwc19pbml0cmFtZnMpIGluaXRyYW1mcworCSQoUSkkKGdpbml0cmFtZnMpIC1sICQocmFtZnMtaW5wdXQpID4gJChvYmopLy5pbml0cmFtZnNfZGF0YS5jcGlvLmd6LmQKKwkkKGNhbGwgaWZfY2hhbmdlZCxpbml0ZnMpCmRpZmYgLS1naXQgYS91c3IvS2NvbmZpZyBiL3Vzci9LY29uZmlnCmluZGV4IDA3NzI3ZjMuLmNmNmJhZDYgMTAwNjQ0Ci0tLSBhL3Vzci9LY29uZmlnCisrKyBiL3Vzci9LY29uZmlnCkBAIC00NCwzICs0NCwyNCBAQAogCSAgb3duZWQgYnkgZ3JvdXAgcm9vdCBpbiB0aGUgaW5pdGlhbCByYW1kaXNrIGltYWdlLgogCiAJICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBsZWF2ZSBpdCBzZXQgdG8gIjAiLgorCitjb25maWcgS0xJQkNfRVJSTElTVAorCWJvb2wgIkVhcmx5IHVzZXJzcGFjZSByZWFsIGVycm9yIG1lc3NhZ2VzIiBpZiBFTUJFRERFRAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHRoaXMgaXMgc2V0LCBraW5pdCAoYW5kIG90aGVyIGtsaWJjLWRlcml2ZWQgYmluYXJpZXMpCisJICB3aWxsIGhhdmUgdGhlIHN0YW5kYXJkIGxpc3Qgb2YgZXJyb3IgbWVzc2FnZXMgYnVpbHQgaW4sIGFuZAorCSAgdGh1cyB3aWxsIHJlcG9ydCwgZm9yIGV4YW1wbGUsICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IgorCSAgaW5zdGVhZCBvZiAiRXJyb3IgMSIuICBMZWF2aW5nIGl0IG91dCB3aWxsIHNhdmUKKwkgIGFwcHJveGltYXRlbHkgNEsgZnJvbSBlYWNoIHN0YXRpYyBiaW5hcnkgKG9uZSwgdW5sZXNzIHlvdQorCSAgaGF2ZSBhIGRpZmZlcmVudCBpbml0cmFtZnNfc291cmNlLnR4dCkgb3IgdGhlIHNoYXJlZAorCSAgbGlicmFyeS4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgIlkiIGlzIGhpZ2hseSByZWNvbW1lbmRlZC4KKworY29uZmlnIEtMSUJDX1pMSUIKKwlib29sCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBidWlsZHMgdGhlIHpsaWIgcG9ydGlvbiBvZiBrbGliYy4gIFRoaXMgaXMgY3VycmVudGx5CisJICByZXF1aXJlZC4KZGlmZiAtLWdpdCBhL3Vzci9NYWtlZmlsZSBiL3Vzci9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxZjI3Zi4uMDAwMDAwMAotLS0gYS91c3IvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jCi0jIGtidWlsZCBmaWxlIGZvciB1c3IvIC0gaW5jbHVkaW5nIGluaXRyYW1mcyBpbWFnZQotIwotCi1rbGliY2RpcnM6OwotUEhPTlkgKz0ga2xpYmNkaXJzCi0KLQotIyBHZW5lcmF0ZSBidWlsdGluLm8gYmFzZWQgb24gaW5pdHJhbWZzX2RhdGEubwotb2JqLSQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSA6PSBpbml0cmFtZnNfZGF0YS5vCi0KLSMgaW5pdHJhbWZzX2RhdGEubyBjb250YWlucyB0aGUgaW5pdHJhbWZzX2RhdGEuY3Bpby5neiBpbWFnZS4KLSMgVGhlIGltYWdlIGlzIGluY2x1ZGVkIHVzaW5nIC5pbmNiaW4sIGEgZGVwZW5kZW5jeSB3aGljaCBpcyBub3QKLSMgdHJhY2tlZCBhdXRvbWF0aWNhbGx5LgotJChvYmopL2luaXRyYW1mc19kYXRhLm86ICQob2JqKS9pbml0cmFtZnNfZGF0YS5jcGlvLmd6IEZPUkNFCi0KLSMjIyMjCi0jIEdlbmVyYXRlIHRoZSBpbml0cmFtZnMgY3BpbyBhcmNoaXZlCi0KLWhvc3Rwcm9ncy15IDo9IGdlbl9pbml0X2NwaW8KLWluaXRyYW1mcyAgIDo9ICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCi1yYW1mcy1pbnB1dCA6PSAkKGlmICQoZmlsdGVyLW91dCAiIiwkKENPTkZJR19JTklUUkFNRlNfU09VUkNFKSksIFwKLQkJCSQoc2hlbGwgZWNobyAkKENPTkZJR19JTklUUkFNRlNfU09VUkNFKSksLWQpCi1yYW1mcy1hcmdzICA6PSBcCi0gICAgICAgICQoaWYgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfVUlEKSwgLXUgJChDT05GSUdfSU5JVFJBTUZTX1JPT1RfVUlEKSkgXAotICAgICAgICAkKGlmICQoQ09ORklHX0lOSVRSQU1GU19ST09UX0dJRCksIC1nICQoQ09ORklHX0lOSVRSQU1GU19ST09UX0dJRCkpCi0KLSMgLmluaXRyYW1mc19kYXRhLmNwaW8uZ3ouZCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFsbCBmaWxlcyBpbmNsdWRlZAotIyBpbiBpbml0cmFtZnMgYW5kIHRvIGRldGVjdCBpZiBhbnkgZmlsZXMgYXJlIGFkZGVkL3JlbW92ZWQuCi0jIFJlbW92ZWQgZmlsZXMgYXJlIGlkZW50aWZpZWQgYnkgZGlyZWN0b3J5IHRpbWVzdGFtcCBiZWluZyB1cGRhdGVkCi0jIFRoZSBkZXBlbmRlbmN5IGxpc3QgaXMgZ2VuZXJhdGVkIGJ5IGdlbl9pbml0cmFtZnMuc2ggLWwKLWlmbmVxICgkKHdpbGRjYXJkICQob2JqKS8uaW5pdHJhbWZzX2RhdGEuY3Bpby5nei5kKSwpCi0JaW5jbHVkZSAkKG9iaikvLmluaXRyYW1mc19kYXRhLmNwaW8uZ3ouZAotZW5kaWYKLQotcXVpZXRfY21kX2luaXRmcyA9IEdFTiAgICAgJEAKLSAgICAgIGNtZF9pbml0ZnMgPSAkKGluaXRyYW1mcykgLW8gJEAgJChyYW1mcy1hcmdzKSAkKHJhbWZzLWlucHV0KQotCi10YXJnZXRzIDo9IGluaXRyYW1mc19kYXRhLmNwaW8uZ3oKLSMgZG8gbm90IHRyeSB0byB1cGRhdGUgZmlsZXMgaW5jbHVkZWQgaW4gaW5pdHJhbWZzCi0kKGRlcHNfaW5pdHJhbWZzKTogOwotCi0kKGRlcHNfaW5pdHJhbWZzKToga2xpYmNkaXJzCi0jIFdlIHJlYnVpbGQgaW5pdHJhbWZzX2RhdGEuY3Bpby5neiBpZjoKLSMgMSkgQW55IGluY2x1ZGVkIGZpbGUgaXMgbmV3ZXIgdGhlbiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6Ci0jIDIpIFRoZXJlIGFyZSBjaGFuZ2VzIGluIHdoaWNoIGZpbGVzIGFyZSBpbmNsdWRlZCAoYWRkZWQgb3IgZGVsZXRlZCkKLSMgMykgSWYgZ2VuX2luaXRfY3BpbyBhcmUgbmV3ZXIgdGhhbiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6Ci0jIDQpIGFyZ3VtZW50cyB0byBnZW5faW5pdHJhbWZzLnNoIGNoYW5nZXMKLSQob2JqKS9pbml0cmFtZnNfZGF0YS5jcGlvLmd6OiAkKG9iaikvZ2VuX2luaXRfY3BpbyAkKGRlcHNfaW5pdHJhbWZzKSBrbGliY2RpcnMKLQkkKFEpJChpbml0cmFtZnMpIC1sICQocmFtZnMtaW5wdXQpID4gJChvYmopLy5pbml0cmFtZnNfZGF0YS5jcGlvLmd6LmQKLQkkKGNhbGwgaWZfY2hhbmdlZCxpbml0ZnMpCi0KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL0tidWlsZCBiL3Vzci9kYXNoL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGFhOTNmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvS2J1aWxkCkBAIC0wLDAgKzEsMTExIEBACisjCisjIEtidWlsZCBmaWxlIGZvciBkYXNoCisjCisKK2NvbmZpZy1jcHBmbGFncyA6PSAtREJTRD0xIC1EU01BTEwgLURKT0JTPTAgLURIQVZFX0NPTkZJR19IIC1EU0hFTEwKK2NvbmZpZy1jcHBmbGFncyArPSAtREdMT0JfQlJPS0VOIC1ESUZTX0JST0tFTgorCitFWFRSQV9LTElCQ0NGTEFHUyA6PSAtSSQoc3JjdHJlZSkvJChzcmMpIC1JJChvYmp0cmVlKS8kKG9iaikKK0VYVFJBX0tMSUJDQ0ZMQUdTICs9IC1pbmNsdWRlICQoc3JjdHJlZSkvJChzcmMpL2NvbmZpZy5oCitFWFRSQV9LTElCQ0NGTEFHUyArPSAkKGNvbmZpZy1jcHBmbGFncykKKworSE9TVF9FWFRSQUNGTEFHUyAgOj0gJChjb25maWctY3BwZmxhZ3MpCisKK2luaXQtby1maWxlcyA6PSBhbGlhcy5vIGFyaXRoX3l5bGV4Lm8gY2QubyBlcnJvci5vIGV2YWwubyBleGVjLm8gZXhwYW5kLm8gXAorCQloaXN0ZWRpdC5vIGlucHV0Lm8gam9icy5vIG1haWwubyBtYWluLm8gbWVtYWxsb2MubyBtaXNjYmx0aW4ubyBcCisJCW15c3RyaW5nLm8gb3B0aW9ucy5vIHBhcnNlci5vIHJlZGlyLm8gc2hvdy5vIHRyYXAubyBvdXRwdXQubyBcCisJCWJsdGluL3ByaW50Zi5vIHN5c3RlbS5vIGJsdGluL3Rlc3QubyB2YXIubworCitnZW4tby1maWxlcyA6PSBhcml0aC5vIGJ1aWx0aW5zLm8gaW5pdC5vIG5vZGVzLm8gc3ludGF4Lm8KKworc2gteSA6PSAkKGluaXQtby1maWxlcykgJChnZW4tby1maWxlcykKKworaG9zdHByb2dzLXkgOj0gbWtpbml0IG1rc3ludGF4IG1rbm9kZXMgbWtzaWduYW1lcworZ2VuLWgtZmlsZXMgOj0gYXJpdGguaCBidWlsdGlucy5oIG5vZGVzLmggc3ludGF4LmggdG9rZW4uaAorCitzdGF0aWMteSA6PSBzaAorCisjIFRoZSBzaGFyZWQgYmluYXJ5CitzaGFyZWQteSAgICA6PSBzaC5zaGFyZWQKK3NoLnNoYXJlZC15IDo9ICQoc2gteSkKKworIyBGb3IgY2xlYW5pbmcKK3RhcmdldHMgOj0gc2ggc2guZyBzaC5zaGFyZWQgc2guc2hhcmVkLmcgJChnZW4tby1maWxlcykKKworIyBleHBsaWNpdCBkZXBlbmRlbmN5IGZvciBhbGwgZ2VuZXJhdGVkIGZpbGVzCiskKGFkZHByZWZpeCAkKG9iaikvLCAkKHNoLXkpKTogJChhZGRwcmVmaXggJChvYmopLywgJChnZW4taC1maWxlcykpCisKKyMgR2VuZXJhdGUgdG9rZW4uaAordGFyZ2V0cyArPSB0b2tlbi5oCitxdWlldF9jbWRfbWt0b2tlbnMgPSBHRU4gICAgICRACisgICAgICBjbWRfbWt0b2tlbnMgPSBzaCAkPCA+ICRACiskKG9iaikvdG9rZW4uaDogJChzcmMpL21rdG9rZW5zCisJJChjYWxsIGlmX2NoYW5nZWQsbWt0b2tlbnMpCisKKyMgR2VuZXJhdGUgYnVpbHRpbnMuZGVmCit0YXJnZXRzICs9IGJ1aWx0aW5zLmRlZgorcXVpZXRfY21kX21rYnVpbHRpbnNfZGVmID0gR0VOICAgICAkQAorICAgICAgY21kX21rYnVpbHRpbnNfZGVmID0gJChIT1NUQ0MpICQoaG9zdGNfZmxhZ3MpIC14IGMgLUUgLW8gJEAgJDwKKyQob2JqKS9idWlsdGlucy5kZWY6ICQoc3JjKS9idWlsdGlucy5kZWYuaW4gJChzcmMpL2NvbmZpZy5oCisJJChjYWxsIGlmX2NoYW5nZWQsbWtidWlsdGluc19kZWYpCisKKyMgR2VuZXJhdGUgYnVpbHRpbnN7LmMgKyAuaH0KK3RhcmdldHMgKz0gYnVpbHRpbnMuYyBidWlsdGlucy5oCitxdWlldF9jbWRfbWtidWlsdGlucyA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9ta2J1aWx0aW5zID0gbWtkaXIgLXAgJChvYmopL2JsdGluICYmIGNkICQob2JqKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgIHNoICQoc3JjdHJlZSkvJChzcmMpL21rYnVpbHRpbnMgYnVpbHRpbnMuZGVmCiskKG9iaikvYnVpbHRpbnMuYzogJChzcmMpL21rYnVpbHRpbnMgJChvYmopL2J1aWx0aW5zLmRlZgorCSQoY2FsbCBjbWQsbWtidWlsdGlucykKKworIyBzaWRlIGVmZmVjdC4uCiskKG9iaikvYnVpbHRpbnMuaDogJChvYmopL2J1aWx0aW5zLmMKKwkkKFEpOgorCisjIEdlbmVyYXRlIGluaXQuYwordGFyZ2V0cyArPSBpbml0LmMKK2luaXQtYy1maWxlcyA6PSAkKGFkZHByZWZpeCAkKHNyY3RyZWUpLyQoc3JjKS8sICQoaW5pdC1vLWZpbGVzOi5vPS5jKSkKK3F1aWV0X2NtZF9ta2luaXQgPSBHRU4gICAgICRACisgICAgICBjbWRfbWtpbml0ID0gY2QgJChvYmopICYmIC4vbWtpbml0ICQoaW5pdC1jLWZpbGVzKQorJChvYmopL2luaXQuYzogJChvYmopL21raW5pdCAkKGluaXQtYy1maWxlcykKKwkkKGNhbGwgY21kLG1raW5pdCkKKworIyBHZW5lcmF0ZSBub2Rlc3suYyArIC5ofQordGFyZ2V0cyArPSBub2Rlcy5jIG5vZGVzLmgKK3F1aWV0X2NtZF9ta25vZGVzID0gR0VOICAgICAkQAorICAgICAgY21kX21rbm9kZXMgPSBjZCAkKG9iaikgJiYgLi9ta25vZGVzICQoc3JjdHJlZSkvJChzcmMpL25vZGV0eXBlcyBcCisJCQkgICAgICAgJChzcmN0cmVlKS8kKHNyYykvbm9kZXMuYy5wYXQKKyQob2JqKS9ub2Rlcy5jOiAkKG9iaikvbWtub2RlcyAkKHNyYykvbm9kZXR5cGVzICQoc3JjKS9ub2Rlcy5jLnBhdAorCSQoY2FsbCBjbWQsbWtub2RlcykKKworIyBzaWRlIGVmZmVjdC4uCiskKG9iaikvbm9kZXMuaDogJChvYmopL25vZGVzLmMKKwkkKFEpOgorCisjIEdlbmVyYXRlIHN5bnRheHsuYyArIC5ofQordGFyZ2V0cyArPSBzeW50YXguYyBzeW50YXguaAorcXVpZXRfY21kX21rc3ludGF4ID0gR0VOICAgICAkQAorICAgICAgY21kX21rc3ludGF4ID0gY2QgJChvYmopICYmIC4vbWtzeW50YXgKKyQob2JqKS9zeW50YXguYzogJChvYmopL21rc3ludGF4CisJJChjYWxsIGNtZCxta3N5bnRheCkKKworIyBzaWRlIGVmZmVjdC4uCiskKG9iaikvc3ludGF4Lmg6ICQob2JqKS9zeW50YXguYworCSQoUSk6CisKKyMgR2VuZXJhdGUgYXJpdGggcGFyc2VyIC0gYXJpdGh7LmMgKyAuaH0KK3RhcmdldHMgKz0gYXJpdGguYyBhcml0aC5oCisjIFByZWZlciBiaXNvbiwgYnV0IEJTRCB5YWNjIHNob3VsZCB3b3JrIGFzIHdlbGwKK1lBQ0MgPz0gYmlzb24KKworcXVpZXRfY21kX3lhY2MJPSBZQUNDICAgICRACisgICAgICBjbWRfeWFjYyA9ICQoWUFDQykgLWQgLW8gJChAOi5oPS5jKSAkPAorCiskKG9iaikvYXJpdGguaDogJChzcmMpL2FyaXRoLnkKKwkkKGNhbGwgaWZfY2hhbmdlZCx5YWNjKQorCisjIHNpZGUgZWZmZWN0Li4KKyQob2JqKS9hcml0aC5jOiAkKG9iaikvYXJpdGguaAorCSQoUSk6CisKKyMgVGFyZ2V0cyB0byBpbnN0YWxsCitpbnN0YWxsLXkgOj0gc2guc2hhcmVkCmRpZmYgLS1naXQgYS91c3IvZGFzaC9SRUFETUUua2xpYmMgYi91c3IvZGFzaC9SRUFETUUua2xpYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5NGZiMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL1JFQURNRS5rbGliYwpAQCAtMCwwICsxLDcgQEAKK1RoaXMgdmVyc2lvbiBvZiBkYXNoIHdhcyBvYnRhaW5lZCBmcm9tCisKK2h0dHA6Ly9nb25kb3IuYXBhbmEub3JnLmF1L35oZXJiZXJ0L2Rhc2gvZGFzaC5naXQvCisKK0l0IGNvcnJlc3BvbmRzIHRvIGNoYW5nZXNldCAzYzk4Mzk5Y2RmOGQzNzZiMmMxZWJkOWNkMzJjYTVkOGM4NGYzYWM5LgorCitUaGUgb25seSBjaGFuZ2VzIG1hZGUgYXJlIHRoZSBhZGRpdGlvbiBvZiBjb25maWcuaCBhbmQgYSBuZXcgTWFrZWZpbGUuCmRpZmYgLS1naXQgYS91c3IvZGFzaC9UT1VSIGIvdXNyL2Rhc2gvVE9VUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzYwZTJhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvVE9VUgpAQCAtMCwwICsxLDM1NiBAQAorIwlAKCMpVE9VUgk4LjEgKEJlcmtlbGV5KSA1LzMxLzkzCisKK05PVEUgLS0gVGhpcyBpcyB0aGUgb3JpZ2luYWwgVE9VUiBwYXBlciBkaXN0cmlidXRlZCB3aXRoIGFzaCBhbmQKK2RvZXMgbm90IHJlcHJlc2VudCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2hlbGwuICBJdCBpcyBwcm92aWRlZCBhbnl3YXkKK3NpbmNlIGl0IHByb3ZpZGVzIGhlbHBmdWwgaW5mb3JtYXRpb24gZm9yIGhvdyB0aGUgc2hlbGwgaXMgc3RydWN0dXJlZCwKK2J1dCBiZSB3YXJuZWQgdGhhdCB0aGluZ3MgaGF2ZSBjaGFuZ2VkIC0tIHRoZSBjdXJyZW50IHNoZWxsIGlzCitzdGlsbCB1bmRlciBkZXZlbG9wbWVudC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgICAgICAgICAgICAgICAgIEEgVG91ciB0aHJvdWdoIEFzaAorCisgICAgICAgICAgICAgICBDb3B5cmlnaHQgMTk4OSBieSBLZW5uZXRoIEFsbXF1aXN0LgorCisKK0RJUkVDVE9SSUVTOiAgVGhlIHN1YmRpcmVjdG9yeSBibHRpbiBjb250YWlucyBjb21tYW5kcyB3aGljaCBjYW4KK2JlIGNvbXBpbGVkIHN0YW5kLWFsb25lLiAgVGhlIHJlc3Qgb2YgdGhlIHNvdXJjZSBpcyBpbiB0aGUgbWFpbgorYXNoIGRpcmVjdG9yeS4KKworU09VUkNFIENPREUgR0VORVJBVE9SUzogIEZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIm1rIiBhcmUKK3Byb2dyYW1zIHRoYXQgZ2VuZXJhdGUgc291cmNlIGNvZGUuICBBIGNvbXBsZXRlIGxpc3Qgb2YgdGhlc2UKK3Byb2dyYW1zIGlzOgorCisgICAgICAgIHByb2dyYW0gICAgICAgICBpbnRwdXQgZmlsZXMgICAgICAgIGdlbmVyYXRlcworICAgICAgICAtLS0tLS0tICAgICAgICAgLS0tLS0tLS0tLS0tICAgICAgICAtLS0tLS0tLS0KKyAgICAgICAgbWtidWlsdGlucyAgICAgIGJ1aWx0aW5zICAgICAgICAgICAgYnVpbHRpbnMuaCBidWlsdGlucy5jCisgICAgICAgIG1raW5pdCAgICAgICAgICAqLmMgICAgICAgICAgICAgICAgIGluaXQuYworICAgICAgICBta25vZGVzICAgICAgICAgbm9kZXR5cGVzICAgICAgICAgICBub2Rlcy5oIG5vZGVzLmMKKyAgICAgICAgbWtzaWduYW1lcyAgICAgICAgICAtICAgICAgICAgICAgICAgc2lnbmFtZXMuaCBzaWduYW1lcy5jCisgICAgICAgIG1rc3ludGF4ICAgICAgICAgICAgLSAgICAgICAgICAgICAgIHN5bnRheC5oIHN5bnRheC5jCisgICAgICAgIG1rdG9rZW5zICAgICAgICAgICAgLSAgICAgICAgICAgICAgIHRva2VuLmgKKyAgICAgICAgYmx0aW4vbWtleHByICAgIHVuYXJ5X29wIGJpbmFyeV9vcCAgb3BlcmF0b3JzLmggb3BlcmF0b3JzLmMKKworVGhlcmUgYXJlIHVuZG91YnRlZGx5IHRvbyBtYW55IG9mIHRoZXNlLiAgTWtpbml0IHNlYXJjaGVzIGFsbCB0aGUKK0Mgc291cmNlIGZpbGVzIGZvciBlbnRyaWVzIGxvb2tpbmcgbGlrZToKKworICAgICAgICBJTklUIHsKKyAgICAgICAgICAgICAgeCA9IDE7ICAgIC8qIGV4ZWN1dGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLworICAgICAgICB9CisKKyAgICAgICAgUkVTRVQgeworICAgICAgICAgICAgICB4ID0gMjsgICAgLyogZXhlY3V0ZWQgd2hlbiB0aGUgc2hlbGwgZG9lcyBhIGxvbmdqbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2sgdG8gdGhlIG1haW4gY29tbWFuZCBsb29wICovCisgICAgICAgIH0KKworICAgICAgICBTSEVMTFBST0MgeworICAgICAgICAgICAgICB4ID0gMzsgICAgLyogZXhlY3V0ZWQgd2hlbiB0aGUgc2hlbGwgcnVucyBhIHNoZWxsIHByb2NlZHVyZSAqLworICAgICAgICB9CisKK0l0IHB1bGxzIHRoaXMgY29kZSBvdXQgaW50byByb3V0aW5lcyB3aGljaCBhcmUgd2hlbiBwYXJ0aWN1bGFyCitldmVudHMgb2NjdXIuICBUaGUgaW50ZW50IGlzIHRvIGltcHJvdmUgbW9kdWxhcml0eSBieSBpc29sYXRpbmcKK3RoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBtb2R1bGVzIG5lZWQgdG8gYmUgZXhwbGljaXRseQoraW5pdGlhbGl6ZWQvcmVzZXQgd2l0aGluIHRoZSBtb2R1bGVzIHRoZW1zZWx2ZXMuCisKK01raW5pdCByZWNvZ25pemVzIHNldmVyYWwgY29uc3RydWN0cyBmb3IgcGxhY2luZyBkZWNsYXJhdGlvbnMgaW4KK3RoZSBpbml0LmMgZmlsZS4KKyAgICAgICAgSU5DTFVERSAiZmlsZS5oIgoraW5jbHVkZXMgYSBmaWxlLiAgVGhlIHN0b3JhZ2UgY2xhc3MgTUtJTklUIG1ha2VzIGEgZGVjbGFyYXRpb24KK2F2YWlsYWJsZSBpbiB0aGUgaW5pdC5jIGZpbGUsIGZvciBleGFtcGxlOgorICAgICAgICBNS0lOSVQgaW50IGZ1bmNuZXN0OyAgICAvKiBkZXB0aCBvZiBmdW5jdGlvbiBjYWxscyAqLworTUtJTklUIGFsb25lIG9uIGEgbGluZSBpbnRyb2R1Y2VzIGEgc3RydWN0dXJlIG9yIHVuaW9uIGRlY2xhcmEtCit0aW9uOgorICAgICAgICBNS0lOSVQKKyAgICAgICAgc3RydWN0IHJlZGlydGFiIHsKKyAgICAgICAgICAgICAgc2hvcnQgcmVuYW1lZFsxMF07CisgICAgICAgIH07CitQcmVwcm9jZXNzb3IgI2RlZmluZSBzdGF0ZW1lbnRzIGFyZSBjb3BpZWQgdG8gaW5pdC5jIHdpdGhvdXQgYW55CitzcGVjaWFsIGFjdGlvbiB0byByZXF1ZXN0IHRoaXMuCisKK0lOREVOVEFUSU9OOiAgVGhlIGFzaCBzb3VyY2UgaXMgaW5kZW50ZWQgaW4gbXVsdGlwbGVzIG9mIHNpeAorc3BhY2VzLiAgVGhlIG9ubHkgc3R1ZHkgdGhhdCBJIGhhdmUgaGVhcmQgb2Ygb24gdGhlIHN1YmplY3QgY29uLQorY2x1ZGVkIHRoYXQgdGhlIG9wdGltYWwgYW1vdW50IHRvIGluZGVudCBpcyBpbiB0aGUgcmFuZ2Ugb2YgZm91cgordG8gc2l4IHNwYWNlcy4gIEkgdXNlIHNpeCBzcGFjZXMgc2luY2UgaXQgaXMgbm90IHRvbyBiaWcgYSBqdW1wCitmcm9tIHRoZSB3aWRlbHkgdXNlZCBlaWdodCBzcGFjZXMuICBJZiB5b3UgcmVhbGx5IGhhdGUgc2l4IHNwYWNlCitpbmRlbnRhdGlvbiwgdXNlIHRoZSBhZGppbmQgKHNvdXJjZSBpbmNsdWRlZCkgcHJvZ3JhbSB0byBjaGFuZ2UKK2l0IHRvIHNvbWV0aGluZyBlbHNlLgorCitFWENFUFRJT05TOiAgQ29kZSBmb3IgZGVhbGluZyB3aXRoIGV4Y2VwdGlvbnMgYXBwZWFycyBpbgorZXhjZXB0aW9ucy5jLiAgVGhlIEMgbGFuZ3VhZ2UgZG9lc24ndCBpbmNsdWRlIGV4Y2VwdGlvbiBoYW5kbGluZywKK3NvIEkgaW1wbGVtZW50IGl0IHVzaW5nIHNldGptcCBhbmQgbG9uZ2ptcC4gIFRoZSBnbG9iYWwgdmFyaWFibGUKK2V4Y2VwdGlvbiBjb250YWlucyB0aGUgdHlwZSBvZiBleGNlcHRpb24uICBFWEVSUk9SIGlzIHJhaXNlZCBieQorY2FsbGluZyBlcnJvci4gIEVYSU5UIGlzIGFuIGludGVycnVwdC4gIEVYU0hFTExQUk9DIGlzIGFuIGV4Y2VwLQordGlvbiB3aGljaCBpcyByYWlzZWQgd2hlbiBhIHNoZWxsIHByb2NlZHVyZSBpcyBpbnZva2VkLiAgVGhlIHB1ci0KK3Bvc2Ugb2YgRVhTSEVMTFBST0MgaXMgdG8gcGVyZm9ybSB0aGUgY2xlYW51cCBhY3Rpb25zIGFzc29jaWF0ZWQKK3dpdGggb3RoZXIgZXhjZXB0aW9ucy4gIEFmdGVyIHRoZXNlIGNsZWFudXAgYWN0aW9ucywgdGhlIHNoZWxsCitjYW4gaW50ZXJwcmV0IGEgc2hlbGwgcHJvY2VkdXJlIGl0c2VsZiB3aXRob3V0IGV4ZWMnaW5nIGEgbmV3Citjb3B5IG9mIHRoZSBzaGVsbC4KKworSU5URVJSVVBUUzogIEluIGFuIGludGVyYWN0aXZlIHNoZWxsLCBhbiBpbnRlcnJ1cHQgd2lsbCBjYXVzZSBhbgorRVhJTlQgZXhjZXB0aW9uIHRvIHJldHVybiB0byB0aGUgbWFpbiBjb21tYW5kIGxvb3AuICAoRXhjZXB0aW9uOgorRVhJTlQgaXMgbm90IHJhaXNlZCBpZiB0aGUgdXNlciB0cmFwcyBpbnRlcnJ1cHRzIHVzaW5nIHRoZSB0cmFwCitjb21tYW5kLikgIFRoZSBJTlRPRkYgYW5kIElOVE9OIG1hY3JvcyAoZGVmaW5lZCBpbiBleGNlcHRpb24uaCkKK3Byb3ZpZGUgdW5pbnRlcnJ1cHRhYmxlIGNyaXRpY2FsIHNlY3Rpb25zLiAgQmV0d2VlbiB0aGUgZXhlY3V0aW9uCitvZiBJTlRPRkYgYW5kIHRoZSBleGVjdXRpb24gb2YgSU5UT04sIGludGVycnVwdCBzaWduYWxzIHdpbGwgYmUKK2hlbGQgZm9yIGxhdGVyIGRlbGl2ZXJ5LiAgSU5UT0ZGIGFuZCBJTlRPTiBjYW4gYmUgbmVzdGVkLgorCitNRU1BTExPQy5DOiAgTWVtYWxsb2MuYyBkZWZpbmVzIHZlcnNpb25zIG9mIG1hbGxvYyBhbmQgcmVhbGxvYword2hpY2ggY2FsbCBlcnJvciB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeSBsZWZ0LiAgSXQgYWxzbyBkZWZpbmVzIGEKK3N0YWNrIG9yaWVudGVkIG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZS4gIEFsbG9jYXRpbmcgb2ZmIGEgc3RhY2sKK2lzIHByb2JhYmx5IG1vcmUgZWZmaWNpZW50IHRoYW4gYWxsb2NhdGlvbiB1c2luZyBtYWxsb2MsIGJ1dCB0aGUKK2JpZyBhZHZhbnRhZ2UgaXMgdGhhdCB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYWxsIHdlIGhhdmUgdG8gZG8KK3RvIGZyZWUgdXAgdGhlIG1lbW9yeSBpbiB1c2UgYXQgdGhlIHRpbWUgb2YgdGhlIGV4Y2VwdGlvbiBpcyB0bworcmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlci4gIFRoZSBzdGFjayBpcyBpbXBsZW1lbnRlZCB1c2luZyBhCitsaW5rZWQgbGlzdCBvZiBibG9ja3MuCisKK1NUUFVUQzogIElmIHRoZSBzdGFjayB3ZXJlIGNvbnRpZ3VvdXMsIGl0IHdvdWxkIGJlIGVhc3kgdG8gc3RvcmUKK3N0cmluZ3Mgb24gdGhlIHN0YWNrIHdpdGhvdXQga25vd2luZyBpbiBhZHZhbmNlIGhvdyBsb25nIHRoZQorc3RyaW5nIHdhcyBnb2luZyB0byBiZToKKyAgICAgICAgcCA9IHN0YWNrcHRyOworICAgICAgICAqcCsrID0gYzsgICAgICAgLyogcmVwZWF0ZWQgYXMgbWFueSB0aW1lcyBhcyBuZWVkZWQgKi8KKyAgICAgICAgc3RhY2twdHIgPSBwOworVGhlIGZvbGxvaW5nIHRocmVlIG1hY3JvcyAoZGVmaW5lZCBpbiBtZW1hbGxvYy5oKSBwZXJmb3JtIHRoZXNlCitvcGVyYXRpb25zLCBidXQgZ3JvdyB0aGUgc3RhY2sgaWYgeW91IHJ1biBvZmYgdGhlIGVuZDoKKyAgICAgICAgU1RBUlRTVEFDS1NUUihwKTsKKyAgICAgICAgU1RQVVRDKGMsIHApOyAgIC8qIHJlcGVhdGVkIGFzIG1hbnkgdGltZXMgYXMgbmVlZGVkICovCisgICAgICAgIGdyYWJzdGFja3N0cihwKTsKKworV2Ugbm93IHN0YXJ0IGEgdG9wLWRvd24gbG9vayBhdCB0aGUgY29kZToKKworTUFJTi5DOiAgVGhlIG1haW4gcm91dGluZSBwZXJmb3JtcyBzb21lIGluaXRpYWxpemF0aW9uLCBleGVjdXRlcwordGhlIHVzZXIncyBwcm9maWxlIGlmIG5lY2Vzc2FyeSwgYW5kIGNhbGxzIGNtZGxvb3AuICBDbWRsb29wIGlzCityZXBlYXRlZGx5IHBhcnNlcyBhbmQgZXhlY3V0ZXMgY29tbWFuZHMuCisKK09QVElPTlMuQzogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgb3B0aW9uIHByb2Nlc3NpbmcgY29kZS4gIEl0IGlzCitjYWxsZWQgZnJvbSBtYWluIHRvIHBhcnNlIHRoZSBzaGVsbCBhcmd1bWVudHMgd2hlbiB0aGUgc2hlbGwgaXMKK2ludm9rZWQsIGFuZCBpdCBhbHNvIGNvbnRhaW5zIHRoZSBzZXQgYnVpbHRpbi4gIFRoZSAtaSBhbmQgLWogb3AtCit0aW9ucyAodGhlIGxhdHRlciB0dXJucyBvbiBqb2IgY29udHJvbCkgcmVxdWlyZSBjaGFuZ2VzIGluIHNpZ25hbAoraGFuZGxpbmcuICBUaGUgcm91dGluZXMgc2V0am9iY3RsIChpbiBqb2JzLmMpIGFuZCBzZXRpbnRlcmFjdGl2ZQorKGluIHRyYXAuYykgYXJlIGNhbGxlZCB0byBoYW5kbGUgY2hhbmdlcyB0byB0aGVzZSBvcHRpb25zLgorCitQQVJTSU5HOiAgVGhlIHBhcnNlciBjb2RlIGlzIGFsbCBpbiBwYXJzZXIuYy4gIEEgcmVjdXJzaXZlIGRlcy0KK2NlbnQgcGFyc2VyIGlzIHVzZWQuICBTeW50YXggdGFibGVzIChnZW5lcmF0ZWQgYnkgbWtzeW50YXgpIGFyZQordXNlZCB0byBjbGFzc2lmeSBjaGFyYWN0ZXJzIGR1cmluZyBsZXhpY2FsIGFuYWx5c2lzLiAgVGhlcmUgYXJlCit0aHJlZSB0YWJsZXM6ICBvbmUgZm9yIG5vcm1hbCB1c2UsIG9uZSBmb3IgdXNlIHdoZW4gaW5zaWRlIHNpbmdsZQorcXVvdGVzLCBhbmQgb25lIGZvciB1c2Ugd2hlbiBpbnNpZGUgZG91YmxlIHF1b3Rlcy4gIFRoZSB0YWJsZXMKK2FyZSBtYWNoaW5lIGRlcGVuZGVudCBiZWNhdXNlIHRoZXkgYXJlIGluZGV4ZWQgYnkgY2hhcmFjdGVyIHZhcmktCithYmxlcyBhbmQgdGhlIHJhbmdlIG9mIGEgY2hhciB2YXJpZXMgZnJvbSBtYWNoaW5lIHRvIG1hY2hpbmUuCisKK1BBUlNFIE9VVFBVVDogIFRoZSBvdXRwdXQgb2YgdGhlIHBhcnNlciBjb25zaXN0cyBvZiBhIHRyZWUgb2YKK25vZGVzLiAgVGhlIHZhcmlvdXMgdHlwZXMgb2Ygbm9kZXMgYXJlIGRlZmluZWQgaW4gdGhlIGZpbGUgbm9kZS0KK3R5cGVzLgorCitOb2RlcyBvZiB0eXBlIE5BUkcgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggd29yZHMgYW5kIHRoZSBjb24tCit0ZW50cyBvZiBoZXJlIGRvY3VtZW50cy4gIEFuIGVhcmx5IHZlcnNpb24gb2YgYXNoIGtlcHQgdGhlIGNvbi0KK3RlbnRzIG9mIGhlcmUgZG9jdW1lbnRzIGluIHRlbXBvcmFyeSBmaWxlcywgYnV0IGtlZXBpbmcgaGVyZSBkby0KK2N1bWVudHMgaW4gbWVtb3J5IHR5cGljYWxseSByZXN1bHRzIGluIHNpZ25pZmljYW50bHkgYmV0dGVyIHBlci0KK2Zvcm1hbmNlLiAgSXQgd291bGQgaGF2ZSBiZWVuIG5pY2UgdG8gbWFrZSBpdCBhbiBvcHRpb24gdG8gdXNlCit0ZW1wb3JhcnkgZmlsZXMgZm9yIGhlcmUgZG9jdW1lbnRzLCBmb3IgdGhlIGJlbmVmaXQgb2Ygc21hbGwKK21hY2hpbmVzLCBidXQgdGhlIGNvZGUgdG8ga2VlcCB0cmFjayBvZiB3aGVuIHRvIGRlbGV0ZSB0aGUgdGVtLQorcG9yYXJ5IGZpbGVzIHdhcyBjb21wbGV4IGFuZCBJIG5ldmVyIGZpeGVkIGFsbCB0aGUgYnVncyBpbiBpdC4KKyhBVCZUIGhhcyBiZWVuIG1haW50YWluaW5nIHRoZSBCb3VybmUgc2hlbGwgZm9yIG1vcmUgdGhhbiB0ZW4KK3llYXJzLCBhbmQgdG8gdGhlIGJlc3Qgb2YgbXkga25vd2xlZGdlIHRoZXkgc3RpbGwgaGF2ZW4ndCBnb3R0ZW4KK2l0IHRvIGhhbmRsZSB0ZW1wb3JhcnkgZmlsZXMgY29ycmVjdGx5IGluIG9ic2N1cmUgY2FzZXMuKQorCitUaGUgdGV4dCBmaWVsZCBvZiBhIE5BUkcgc3RydWN0dXJlIHBvaW50cyB0byB0aGUgdGV4dCBvZiB0aGUKK3dvcmQuICBUaGUgdGV4dCBjb25zaXN0cyBvZiBvcmRpbmFyeSBjaGFyYWN0ZXJzIGFuZCBhIG51bWJlciBvZgorc3BlY2lhbCBjb2RlcyBkZWZpbmVkIGluIHBhcnNlci5oLiAgVGhlIHNwZWNpYWwgY29kZXMgYXJlOgorCisgICAgICAgIENUTFZBUiAgICAgICAgICAgICAgVmFyaWFibGUgc3Vic3RpdHV0aW9uCisgICAgICAgIENUTEVORFZBUiAgICAgICAgICAgRW5kIG9mIHZhcmlhYmxlIHN1YnN0aXR1dGlvbgorICAgICAgICBDVExCQUNLUSAgICAgICAgICAgIENvbW1hbmQgc3Vic3RpdHV0aW9uCisgICAgICAgIENUTEJBQ0tRfENUTFFVT1RFICAgQ29tbWFuZCBzdWJzdGl0dXRpb24gaW5zaWRlIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgQ1RMRVNDICAgICAgICAgICAgICBFc2NhcGUgbmV4dCBjaGFyYWN0ZXIKKworQSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBlbGVtZW50czoKKworICAgICAgICBDVExWQVIgdHlwZSBuYW1lICc9JyBbIGFsdGVybmF0aXZlLXRleHQgQ1RMRU5EVkFSIF0KKworVGhlIHR5cGUgZmllbGQgaXMgYSBzaW5nbGUgY2hhcmFjdGVyIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2Ygc3ViLQorc3RpdHV0aW9uLiAgVGhlIHBvc3NpYmxlIHR5cGVzIGFyZToKKworICAgICAgICBWU05PUk1BTCAgICAgICAgICAgICR2YXIKKyAgICAgICAgVlNNSU5VUyAgICAgICAgICAgICAke3Zhci10ZXh0fQorICAgICAgICBWU01JTlVTfFZTTlVMICAgICAgICR7dmFyOi10ZXh0fQorICAgICAgICBWU1BMVVMgICAgICAgICAgICAgICR7dmFyK3RleHR9CisgICAgICAgIFZTUExVU3xWU05VTCAgICAgICAgJHt2YXI6K3RleHR9CisgICAgICAgIFZTUVVFU1RJT04gICAgICAgICAgJHt2YXI/dGV4dH0KKyAgICAgICAgVlNRVUVTVElPTnxWU05VTCAgICAke3Zhcjo/dGV4dH0KKyAgICAgICAgVlNBU1NJR04gICAgICAgICAgICAke3Zhcj10ZXh0fQorICAgICAgICBWU0FTU0lHTnxWU05VTCAgICAgICR7dmFyPXRleHR9CisKK0luIGFkZGl0aW9uLCB0aGUgdHlwZSBmaWVsZCB3aWxsIGhhdmUgdGhlIFZTUVVPVEUgZmxhZyBzZXQgaWYgdGhlCit2YXJpYWJsZSBpcyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzLiAgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlCitjb21lcyBuZXh0LCB0ZXJtaW5hdGVkIGJ5IGFuIGVxdWFscyBzaWduLiAgSWYgdGhlIHR5cGUgaXMgbm90CitWU05PUk1BTCwgdGhlbiB0aGUgdGV4dCBmaWVsZCBpbiB0aGUgc3Vic3RpdHV0aW9uIGZvbGxvd3MsIHRlci0KK21pbmF0ZWQgYnkgYSBDVExFTkRWQVIgYnl0ZS4KKworQ29tbWFuZHMgaW4gYmFjayBxdW90ZXMgYXJlIHBhcnNlZCBhbmQgc3RvcmVkIGluIGEgbGlua2VkIGxpc3QuCitUaGUgbG9jYXRpb25zIG9mIHRoZXNlIGNvbW1hbmRzIGluIHRoZSBzdHJpbmcgYXJlIGluZGljYXRlZCBieQorQ1RMQkFDS1EgYW5kIENUTEJBQ0tRK0NUTFFVT1RFIGNoYXJhY3RlcnMsIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKK3RoZSBiYWNrIHF1b3RlcyB3ZXJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMuCisKK1RoZSBjaGFyYWN0ZXIgQ1RMRVNDIGVzY2FwZXMgdGhlIG5leHQgY2hhcmFjdGVyLCBzbyB0aGF0IGluIGNhc2UKK2FueSBvZiB0aGUgQ1RMIGNoYXJhY3RlcnMgbWVudGlvbmVkIGFib3ZlIGFwcGVhciBpbiB0aGUgaW5wdXQsCit0aGV5IGNhbiBiZSBwYXNzZWQgdGhyb3VnaCB0cmFuc3BhcmVudGx5LiAgQ1RMRVNDIGlzIGFsc28gdXNlZCB0bworZXNjYXBlICcqJywgJz8nLCAnWycsIGFuZCAnIScgY2hhcmFjdGVycyB3aGljaCB3ZXJlIHF1b3RlZCBieSB0aGUKK3VzZXIgYW5kIHRodXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBmaWxlIG5hbWUgZ2VuZXJhdGlvbi4KKworQ1RMRVNDIGNoYXJhY3RlcnMgaGF2ZSBwcm92ZWQgdG8gYmUgcGFydGljdWxhcmx5IHRyaWNreSB0byBnZXQKK3JpZ2h0LiAgSW4gdGhlIGNhc2Ugb2YgaGVyZSBkb2N1bWVudHMgd2hpY2ggYXJlIG5vdCBzdWJqZWN0IHRvCit2YXJpYWJsZSBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24sIHRoZSBwYXJzZXIgZG9lc24ndCBpbnNlcnQgYW55CitDVExFU0MgY2hhcmFjdGVycyB0byBiZWdpbiB3aXRoIChzbyB0aGUgY29udGVudHMgb2YgdGhlIHRleHQKK2ZpZWxkIGNhbiBiZSB3cml0dGVuIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcpLiAgT3RoZXIgaGVyZSBkb2N1LQorbWVudHMsIGFuZCB3b3JkcyB3aGljaCBhcmUgbm90IHN1YmplY3QgdG8gc3BsaXR0aW5nIGFuZCBmaWxlIG5hbWUKK2dlbmVyYXRpb24sIGhhdmUgdGhlIENUTEVTQyBjaGFyYWN0ZXJzIHJlbW92ZWQgZHVyaW5nIHRoZSB2YXJpLQorYWJsZSBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gcGhhc2UuICBXb3JkcyB3aGljaCBhcmUgc3ViamVjdAorc3BsaXR0aW5nIGFuZCBmaWxlIG5hbWUgZ2VuZXJhdGlvbiBoYXZlIHRoZSBDVExFU0MgY2hhcmFjdGVycyByZS0KK21vdmVkIGFzIHBhcnQgb2YgdGhlIGZpbGUgbmFtZSBwaGFzZS4KKworRVhFQ1VUSU9OOiAgQ29tbWFuZCBleGVjdXRpb24gaXMgaGFuZGxlZCBieSB0aGUgZm9sbG93aW5nIGZpbGVzOgorICAgICAgICBldmFsLmMgICAgIFRoZSB0b3AgbGV2ZWwgcm91dGluZXMuCisgICAgICAgIHJlZGlyLmMgICAgQ29kZSB0byBoYW5kbGUgcmVkaXJlY3Rpb24gb2YgaW5wdXQgYW5kIG91dHB1dC4KKyAgICAgICAgam9icy5jICAgICBDb2RlIHRvIGhhbmRsZSBmb3JraW5nLCB3YWl0aW5nLCBhbmQgam9iIGNvbnRyb2wuCisgICAgICAgIGV4ZWMuYyAgICAgQ29kZSB0byB0byBwYXRoIHNlYXJjaGVzIGFuZCB0aGUgYWN0dWFsIGV4ZWMgc3lzIGNhbGwuCisgICAgICAgIGV4cGFuZC5jICAgQ29kZSB0byBldmFsdWF0ZSBhcmd1bWVudHMuCisgICAgICAgIHZhci5jICAgICAgTWFpbnRhaW5zIHRoZSB2YXJpYWJsZSBzeW1ib2wgdGFibGUuICBDYWxsZWQgZnJvbSBleHBhbmQuYy4KKworRVZBTC5DOiAgRXZhbHRyZWUgcmVjdXJzaXZlbHkgZXhlY3V0ZXMgYSBwYXJzZSB0cmVlLiAgVGhlIGV4aXQKK3N0YXR1cyBpcyByZXR1cm5lZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGV4aXRzdGF0dXMuICBUaGUgYWx0ZXItCituYXRpdmUgZW50cnkgZXZhbGJhY2tjbWQgaXMgY2FsbGVkIHRvIGV2YWx1YXRlIGNvbW1hbmRzIGluIGJhY2sKK3F1b3Rlcy4gIEl0IHNhdmVzIHRoZSByZXN1bHQgaW4gbWVtb3J5IGlmIHRoZSBjb21tYW5kIGlzIGEgYnVpbC0KK3Rpbjsgb3RoZXJ3aXNlIGl0IGZvcmtzIG9mZiBhIGNoaWxkIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgYW5kCitjb25uZWN0cyB0aGUgc3RhbmRhcmQgb3V0cHV0IG9mIHRoZSBjaGlsZCB0byBhIHBpcGUuCisKK0pPQlMuQzogIFRvIGNyZWF0ZSBhIHByb2Nlc3MsIHlvdSBjYWxsIG1ha2Vqb2IgdG8gcmV0dXJuIGEgam9iCitzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNhbGwgZm9ya3NoZWxsIChwYXNzaW5nIHRoZSBqb2Igc3RydWN0dXJlIGFzCithbiBhcmd1bWVudCkgdG8gY3JlYXRlIHRoZSBwcm9jZXNzLiAgV2FpdGZvcmpvYiB3YWl0cyBmb3IgYSBqb2IKK3RvIGNvbXBsZXRlLiAgVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIHByb2Nlc3MgZ3JvdXBzIGlmIGpvYgorY29udHJvbCBpcyBkZWZpbmVkLgorCitSRURJUi5DOiAgQXNoIGFsbG93cyBmaWxlIGRlc2NyaXB0b3JzIHRvIGJlIHJlZGlyZWN0ZWQgYW5kIHRoZW4KK3Jlc3RvcmVkIHdpdGhvdXQgZm9ya2luZyBvZmYgYSBjaGlsZCBwcm9jZXNzLiAgVGhpcyBpcyBhY2NvbS0KK3BsaXNoZWQgYnkgZHVwbGljYXRpbmcgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvcnMuICBUaGUgcmVkaXItCit0YWIgc3RydWN0dXJlIHJlY29yZHMgd2hlcmUgdGhlIGZpbGUgZGVzY3JpcHRvcnMgaGF2ZSBiZSBkdXBsaS0KK2NhdGVkIHRvLgorCitFWEVDLkM6ICBUaGUgcm91dGluZSBmaW5kX2NvbW1hbmQgbG9jYXRlcyBhIGNvbW1hbmQsIGFuZCBlbnRlcnMKK3RoZSBjb21tYW5kIGluIHRoZSBoYXNoIHRhYmxlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiAgVGhlCit0aGlyZCBhcmd1bWVudCBzcGVjaWZpZXMgd2hldGhlciBpdCBpcyB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlCitpZiB0aGUgY29tbWFuZCBpcyBub3QgZm91bmQuICAoV2hlbiBhIHBpcGVsaW5lIGlzIHNldCB1cCwKK2ZpbmRfY29tbWFuZCBpcyBjYWxsZWQgZm9yIGFsbCB0aGUgY29tbWFuZHMgaW4gdGhlIHBpcGVsaW5lIGJlLQorZm9yZSBhbnkgZm9ya2luZyBpcyBkb25lLCBzbyB0byBnZXQgdGhlIGNvbW1hbmRzIGludG8gdGhlIGhhc2gKK3RhYmxlIG9mIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIEJ1dCB0byBtYWtlIGNvbW1hbmQgaGFzaGluZyBhcwordHJhbnNwYXJlbnQgYXMgcG9zc2libGUsIHdlIHNpbGVudGx5IGlnbm9yZSBlcnJvcnMgYXQgdGhhdCBwb2ludAorYW5kIG9ubHkgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaWYgdGhlIGNvbW1hbmQgY2Fubm90IGJlIGZvdW5kCitsYXRlci4pCisKK1RoZSByb3V0aW5lIHNoZWxsZXhlYyBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBleGVjIHN5c3RlbSBjYWxsLgorCitFWFBBTkQuQzogIEFyZ3VtZW50cyBhcmUgcHJvY2Vzc2VkIGluIHRocmVlIHBhc3Nlcy4gIFRoZSBmaXJzdAorKHBlcmZvcm1lZCBieSB0aGUgcm91dGluZSBhcmdzdHIpIHBlcmZvcm1zIHZhcmlhYmxlIGFuZCBjb21tYW5kCitzdWJzdGl0dXRpb24uICBUaGUgc2Vjb25kIChpZnNicmVha3VwKSBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZworYW5kIHRoZSB0aGlyZCAoZXhwYW5kbWV0YSkgcGVyZm9ybXMgZmlsZSBuYW1lIGdlbmVyYXRpb24uICBJZiB0aGUKKyIvdSIgZGlyZWN0b3J5IGlzIHNpbXVsYXRlZCwgdGhlbiB3aGVuICIvdS91c2VybmFtZSIgaXMgcmVwbGFjZWQKK2J5IHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksIHRoZSBmbGFnICJkaWR1ZGlyIiBpcyBzZXQuICBUaGlzCit0ZWxscyB0aGUgY2QgY29tbWFuZCB0aGF0IGl0IHNob3VsZCBwcmludCBvdXQgdGhlIGRpcmVjdG9yeSBuYW1lLAoranVzdCBhcyBpdCB3b3VsZCBpZiB0aGUgIi91IiBkaXJlY3Rvcnkgd2VyZSBpbXBsZW1lbnRlZCB1c2luZworc3ltYm9saWMgbGlua3MuCisKK1ZBUi5DOiAgVmFyaWFibGVzIGFyZSBzdG9yZWQgaW4gYSBoYXNoIHRhYmxlLiAgUHJvYmFibHkgd2Ugc2hvdWxkCitzd2l0Y2ggdG8gZXh0ZW5zaWJsZSBoYXNoaW5nLiAgVGhlIHZhcmlhYmxlIG5hbWUgaXMgc3RvcmVkIGluIHRoZQorc2FtZSBzdHJpbmcgYXMgdGhlIHZhbHVlICh1c2luZyB0aGUgZm9ybWF0ICJuYW1lPXZhbHVlIikgc28gdGhhdAorbm8gc3RyaW5nIGNvcHlpbmcgaXMgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZW52aXJvbm1lbnQgb2YgYSBjb20tCittYW5kLiAgVmFyaWFibGVzIHdoaWNoIHRoZSBzaGVsbCByZWZlcmVuY2VzIGludGVybmFsbHkgYXJlIHByZWFsLQorbG9jYXRlZCBzbyB0aGF0IHRoZSBzaGVsbCBjYW4gcmVmZXJlbmNlIHRoZSB2YWx1ZXMgb2YgdGhlc2UgdmFyaS0KK2FibGVzIHdpdGhvdXQgZG9pbmcgYSBsb29rdXAuCisKK1doZW4gYSBwcm9ncmFtIGlzIHJ1biwgdGhlIGNvZGUgaW4gZXZhbC5jIHN0aWNrcyBhbnkgZW52aXJvbm1lbnQKK3ZhcmlhYmxlcyB3aGljaCBwcmVjZWRlIHRoZSBjb21tYW5kIChhcyBpbiAiUEFUSD14eHggY29tbWFuZCIpIGluCit0aGUgdmFyaWFibGUgdGFibGUgYXMgdGhlIHNpbXBsZXN0IHdheSB0byBzdHJpcCBkdXBsaWNhdGVzLCBhbmQKK3RoZW4gY2FsbHMgImVudmlyb25tZW50IiB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudC4KK1RoZXJlIGFyZSB0d28gY29uc2VxdWVuY2VzIG9mIHRoaXMuICBGaXJzdCwgaWYgYW4gYXNzaWdubWVudCB0bworUEFUSCBwcmVjZWRlcyB0aGUgY29tbWFuZCwgdGhlIHZhbHVlIG9mIFBBVEggYmVmb3JlIHRoZSBhc3NpZ24tCittZW50IG11c3QgYmUgcmVtZW1iZXJlZCBhbmQgcGFzc2VkIHRvIHNoZWxsZXhlYy4gIFNlY29uZCwgaWYgdGhlCitwcm9ncmFtIHR1cm5zIG91dCB0byBiZSBhIHNoZWxsIHByb2NlZHVyZSwgdGhlIHN0cmluZ3MgZnJvbSB0aGUKK2Vudmlyb25tZW50IHZhcmlhYmxlcyB3aGljaCBwcmVjZWRlZCB0aGUgY29tbWFuZCBtdXN0IGJlIHB1bGxlZAorb3V0IG9mIHRoZSB0YWJsZSBhbmQgcmVwbGFjZWQgd2l0aCBzdHJpbmdzIG9idGFpbmVkIGZyb20gbWFsbG9jLAorc2luY2UgdGhlIGZvcm1lciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZnJlZWQgd2hlbiB0aGUgc3RhY2sgKHNlZQordGhlIGVudHJ5IG9uIG1lbWFsbG9jLmMpIGlzIGVtcHRpZWQuCisKK0JVSUxUSU4gQ09NTUFORFM6ICBUaGUgcHJvY2VkdXJlcyBmb3IgaGFuZGxpbmcgdGhlc2UgYXJlIHNjYXQtCit0ZXJlZCB0aHJvdWdob3V0IHRoZSBjb2RlLCBkZXBlbmRpbmcgb24gd2hpY2ggbG9jYXRpb24gYXBwZWFycworbW9zdCBhcHByb3ByaWF0ZS4gIFRoZXkgY2FuIGJlIHJlY29nbml6ZWQgYmVjYXVzZSB0aGVpciBuYW1lcyBhbC0KK3dheXMgZW5kIGluICJjbWQiLiAgVGhlIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBwcm9jZWR1cmVzIGlzCitzcGVjaWZpZWQgaW4gdGhlIGZpbGUgYnVpbHRpbnMsIHdoaWNoIGlzIHByb2Nlc3NlZCBieSB0aGUgbWtidWlsLQordGlucyBjb21tYW5kLgorCitBIGJ1aWx0aW4gY29tbWFuZCBpcyBpbnZva2VkIHdpdGggYXJnYyBhbmQgYXJndiBzZXQgdXAgbGlrZSBhCitub3JtYWwgcHJvZ3JhbS4gIEEgYnVpbHRpbiBjb21tYW5kIGlzIGFsbG93ZWQgdG8gb3ZlcndyaXRlIGl0cworYXJndW1lbnRzLiAgQnVpbHRpbiByb3V0aW5lcyBjYW4gY2FsbCBuZXh0b3B0IHRvIGRvIG9wdGlvbiBwYXJzLQoraW5nLiAgVGhpcyBpcyBraW5kIG9mIGxpa2UgZ2V0b3B0LCBidXQgeW91IGRvbid0IHBhc3MgYXJnYyBhbmQKK2FyZ3YgdG8gaXQuICBCdWlsdGluIHJvdXRpbmVzIGNhbiBhbHNvIGNhbGwgZXJyb3IuICBUaGlzIHJvdXRpbmUKK25vcm1hbGx5IHRlcm1pbmF0ZXMgdGhlIHNoZWxsIChvciByZXR1cm5zIHRvIHRoZSBtYWluIGNvbW1hbmQKK2xvb3AgaWYgdGhlIHNoZWxsIGlzIGludGVyYWN0aXZlKSwgYnV0IHdoZW4gY2FsbGVkIGZyb20gYSBidWlsdGluCitjb21tYW5kIGl0IGNhdXNlcyB0aGUgYnVpbHRpbiBjb21tYW5kIHRvIHRlcm1pbmF0ZSB3aXRoIGFuIGV4aXQKK3N0YXR1cyBvZiAyLgorCitUaGUgZGlyZWN0b3J5IGJsdGlucyBjb250YWlucyBjb21tYW5kcyB3aGljaCBjYW4gYmUgY29tcGlsZWQgaW4tCitkZXBlbmRlbnRseSBidXQgY2FuIGFsc28gYmUgYnVpbHQgaW50byB0aGUgc2hlbGwgZm9yIGVmZmljaWVuY3kKK3JlYXNvbnMuICBUaGUgbWFrZWZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgY29tcGlsZXMgdGhlc2UgcHJvZ3JhbXMKK2luIHRoZSBub3JtYWwgZmFzaGlvbiAoc28gdGhhdCB0aGV5IGNhbiBiZSBydW4gcmVnYXJkbGVzcyBvZgord2hldGhlciB0aGUgaW52b2tlciBpcyBhc2gpLCBidXQgYWxzbyBjcmVhdGVzIGEgbGlicmFyeSBuYW1lZAorYmx0aW5saWIuYSB3aGljaCBjYW4gYmUgbGlua2VkIHdpdGggYXNoLiAgVGhlIGhlYWRlciBmaWxlIGJsdGluLmgKK3Rha2VzIGNhcmUgb2YgbW9zdCBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYXNoIGFuZCB0aGUKK3N0YW5kLWFsb25lIGVudmlyb25tZW50LiAgVGhlIHVzZXIgc2hvdWxkIGNhbGwgdGhlIG1haW4gcm91dGluZQorIm1haW4iLCBhbmQgI2RlZmluZSBtYWluIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSByb3V0aW5lIHRvIHVzZQord2hlbiB0aGUgcHJvZ3JhbSBpcyBsaW5rZWQgaW50byBhc2guICBUaGlzICNkZWZpbmUgc2hvdWxkIGFwcGVhcgorYmVmb3JlIGJsdGluLmggaXMgaW5jbHVkZWQ7IGJsdGluLmggd2lsbCAjdW5kZWYgbWFpbiBpZiB0aGUgcHJvLQorZ3JhbSBpcyB0byBiZSBjb21waWxlZCBzdGFuZC1hbG9uZS4KKworQ0QuQzogIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjZCBhbmQgcHdkIGJ1aWx0aW5zLiAgVGhlIHB3ZCBjb20tCittYW5kIHJ1bnMgL2Jpbi9wd2QgdGhlIGZpcnN0IHRpbWUgaXQgaXMgaW52b2tlZCAodW5sZXNzIHRoZSB1c2VyCitoYXMgYWxyZWFkeSBkb25lIGEgY2QgdG8gYW4gYWJzb2x1dGUgcGF0aG5hbWUpLCBidXQgdGhlbgorcmVtZW1iZXJzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgdXBkYXRlcyBpdCB3aGVuIHRoZSBjZCBjb20tCittYW5kIGlzIHJ1biwgc28gc3Vic2VxdWVudCBwd2QgY29tbWFuZHMgcnVuIHZlcnkgZmFzdC4gIFRoZSBtYWluCitjb21wbGljYXRpb24gaW4gdGhlIGNkIGNvbW1hbmQgaXMgaW4gdGhlIGRvY2QgY29tbWFuZCwgd2hpY2gKK3Jlc29sdmVzIHN5bWJvbGljIGxpbmtzIGludG8gYWN0dWFsIG5hbWVzIGFuZCBpbmZvcm1zIHRoZSB1c2VyCit3aGVyZSB0aGUgdXNlciBlbmRlZCB1cCBpZiBoZSBjcm9zc2VkIGEgc3ltYm9saWMgbGluay4KKworU0lHTkFMUzogIFRyYXAuYyBpbXBsZW1lbnRzIHRoZSB0cmFwIGNvbW1hbmQuICBUaGUgcm91dGluZSBzZXQtCitzaWduYWwgZmlndXJlcyBvdXQgd2hhdCBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gYSBzaWduYWwgaXMKK3JlY2VpdmVkIGFuZCBpbnZva2VzIHRoZSBzaWduYWwgc3lzdGVtIGNhbGwgdG8gc2V0IHRoZSBzaWduYWwgYWMtCit0aW9uIGFwcHJvcHJpYXRlbHkuICBXaGVuIGEgc2lnbmFsIHRoYXQgYSB1c2VyIGhhcyBzZXQgYSB0cmFwIGZvcgoraXMgY2F1Z2h0LCB0aGUgcm91dGluZSAib25zaWciIHNldHMgYSBmbGFnLiAgVGhlIHJvdXRpbmUgZG90cmFwCitpcyBjYWxsZWQgYXQgYXBwcm9wcmlhdGUgcG9pbnRzIHRvIGFjdHVhbGx5IGhhbmRsZSB0aGUgc2lnbmFsLgorV2hlbiBhbiBpbnRlcnJ1cHQgaXMgY2F1Z2h0IGFuZCBubyB0cmFwIGhhcyBiZWVuIHNldCBmb3IgdGhhdAorc2lnbmFsLCB0aGUgcm91dGluZSAib25pbnQiIGluIGVycm9yLmMgaXMgY2FsbGVkLgorCitPVVRQVVQ6ICBBc2ggdXNlcyBpdCdzIG93biBvdXRwdXQgcm91dGluZXMuICBUaGVyZSBhcmUgdGhyZWUgb3V0LQorcHV0IHN0cnVjdHVyZXMgYWxsb2NhdGVkLiAgIk91dHB1dCIgcmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgb3V0LQorcHV0LCAiZXJyb3V0IiB0aGUgc3RhbmRhcmQgZXJyb3IsIGFuZCAibWVtb3V0IiBjb250YWlucyBvdXRwdXQKK3doaWNoIGlzIHRvIGJlIHN0b3JlZCBpbiBtZW1vcnkuICBUaGlzIGxhc3QgaXMgdXNlZCB3aGVuIGEgYnVpbC0KK3RpbiBjb21tYW5kIGFwcGVhcnMgaW4gYmFja3F1b3RlcywgdG8gYWxsb3cgaXRzIG91dHB1dCB0byBiZSBjb2wtCitsZWN0ZWQgd2l0aG91dCBkb2luZyBhbnkgSS9PIHRocm91Z2ggdGhlIFVOSVggb3BlcmF0aW5nIHN5c3RlbS4KK1RoZSB2YXJpYWJsZXMgb3V0MSBhbmQgb3V0MiBub3JtYWxseSBwb2ludCB0byBvdXRwdXQgYW5kIGVycm91dCwKK3Jlc3BlY3RpdmVseSwgYnV0IHRoZXkgYXJlIHNldCB0byBwb2ludCB0byBtZW1vdXQgd2hlbiBhcHByb3ByaS0KK2F0ZSBpbnNpZGUgYmFja3F1b3Rlcy4KKworSU5QVVQ6ICBUaGUgYmFzaWMgaW5wdXQgcm91dGluZSBpcyBwZ2V0Yywgd2hpY2ggcmVhZHMgZnJvbSB0aGUKK2N1cnJlbnQgaW5wdXQgZmlsZS4gIFRoZXJlIGlzIGEgc3RhY2sgb2YgaW5wdXQgZmlsZXM7IHRoZSBjdXJyZW50CitpbnB1dCBmaWxlIGlzIHRoZSB0b3AgZmlsZSBvbiB0aGlzIHN0YWNrLiAgVGhlIGNvZGUgYWxsb3dzIHRoZQoraW5wdXQgdG8gY29tZSBmcm9tIGEgc3RyaW5nIHJhdGhlciB0aGFuIGEgZmlsZS4gIChUaGlzIGlzIGZvciB0aGUKKy1jIG9wdGlvbiBhbmQgdGhlICIuIiBhbmQgZXZhbCBidWlsdGluIGNvbW1hbmRzLikgIFRoZSBnbG9iYWwKK3ZhcmlhYmxlIHBsaW5ubyBpcyBzYXZlZCBhbmQgcmVzdG9yZWQgd2hlbiBmaWxlcyBhcmUgcHVzaGVkIGFuZAorcG9wcGVkIGZyb20gdGhlIHN0YWNrLiAgVGhlIHBhcnNlciByb3V0aW5lcyBzdG9yZSB0aGUgbnVtYmVyIG9mCit0aGUgY3VycmVudCBsaW5lIGluIHRoaXMgdmFyaWFibGUuCisKK0RFQlVHR0lORzogIElmIERFQlVHIGlzIGRlZmluZWQgaW4gc2hlbGwuaCwgdGhlbiB0aGUgc2hlbGwgd2lsbAord3JpdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBmaWxlICRIT01FL3RyYWNlLiAgTW9zdCBvZgordGhpcyBpcyBkb25lIHVzaW5nIHRoZSBUUkFDRSBtYWNybywgd2hpY2ggdGFrZXMgYSBzZXQgb2YgcHJpbnRmCithcmd1bWVudHMgaW5zaWRlIHR3byBzZXRzIG9mIHBhcmVudGhlc2lzLiAgRXhhbXBsZToKKyJUUkFDRSgoIm49JWQwLCBuKSkiLiAgVGhlIGRvdWJsZSBwYXJlbnRoZXNpcyBhcmUgbmVjZXNzYXJ5IGJlLQorY2F1c2UgdGhlIHByZXByb2Nlc3NvciBjYW4ndCBoYW5kbGUgZnVuY3Rpb25zIHdpdGggYSB2YXJpYWJsZQorbnVtYmVyIG9mIGFyZ3VtZW50cy4gIERlZmluaW5nIERFQlVHIGFsc28gY2F1c2VzIHRoZSBzaGVsbCB0bworZ2VuZXJhdGUgYSBjb3JlIGR1bXAgaWYgaXQgaXMgc2VudCBhIHF1aXQgc2lnbmFsLiAgVGhlIHRyYWNpbmcKK2NvZGUgaXMgaW4gc2hvdy5jLgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYWxpYXMuYyBiL3Vzci9kYXNoL2FsaWFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlYWNiYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2FsaWFzLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJpbnB1dC5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgImFsaWFzLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgkvKiBYWFggZm9yIGFyZ3B0ciAoc2hvdWxkIHJlbW92ZT8pICovCisKKyNkZWZpbmUgQVRBQlNJWkUgMzkKKworc3RydWN0IGFsaWFzICphdGFiW0FUQUJTSVpFXTsKKworU1RBVElDIHZvaWQgc2V0YWxpYXMoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworU1RBVElDIHN0cnVjdCBhbGlhcyAqZnJlZWFsaWFzKHN0cnVjdCBhbGlhcyAqKTsKK1NUQVRJQyBzdHJ1Y3QgYWxpYXMgKipfX2xvb2t1cGFsaWFzKGNvbnN0IGNoYXIgKik7CisKK1NUQVRJQwordm9pZAorc2V0YWxpYXMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKQoreworCXN0cnVjdCBhbGlhcyAqYXAsICoqYXBwOworCisJYXBwID0gX19sb29rdXBhbGlhcyhuYW1lKTsKKwlhcCA9ICphcHA7CisJSU5UT0ZGOworCWlmIChhcCkgeworCQlpZiAoIShhcC0+ZmxhZyAmIEFMSUFTSU5VU0UpKSB7CisJCQlja2ZyZWUoYXAtPnZhbCk7CisJCX0KKwkJYXAtPnZhbAk9IHNhdmVzdHIodmFsKTsKKwkJYXAtPmZsYWcgJj0gfkFMSUFTREVBRDsKKwl9IGVsc2UgeworCQkvKiBub3QgZm91bmQgKi8KKwkJYXAgPSBja21hbGxvYyhzaXplb2YgKHN0cnVjdCBhbGlhcykpOworCQlhcC0+bmFtZSA9IHNhdmVzdHIobmFtZSk7CisJCWFwLT52YWwgPSBzYXZlc3RyKHZhbCk7CisJCWFwLT5mbGFnID0gMDsKKwkJYXAtPm5leHQgPSAwOworCQkqYXBwID0gYXA7CisJfQorCUlOVE9OOworfQorCitpbnQKK3VuYWxpYXMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYWxpYXMgKiphcHA7CisKKwlhcHAgPSBfX2xvb2t1cGFsaWFzKG5hbWUpOworCisJaWYgKCphcHApIHsKKwkJSU5UT0ZGOworCQkqYXBwID0gZnJlZWFsaWFzKCphcHApOworCQlJTlRPTjsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKDEpOworfQorCit2b2lkCitybWFsaWFzZXModm9pZCkKK3sKKwlzdHJ1Y3QgYWxpYXMgKmFwLCAqKmFwcDsKKwlpbnQgaTsKKworCUlOVE9GRjsKKwlmb3IgKGkgPSAwOyBpIDwgQVRBQlNJWkU7IGkrKykgeworCQlhcHAgPSAmYXRhYltpXTsKKwkJZm9yIChhcCA9ICphcHA7IGFwOyBhcCA9ICphcHApIHsKKwkJCSphcHAgPSBmcmVlYWxpYXMoKmFwcCk7CisJCQlpZiAoYXAgPT0gKmFwcCkgeworCQkJCWFwcCA9ICZhcC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KKwlJTlRPTjsKK30KKworc3RydWN0IGFsaWFzICoKK2xvb2t1cGFsaWFzKGNvbnN0IGNoYXIgKm5hbWUsIGludCBjaGVjaykKK3sKKwlzdHJ1Y3QgYWxpYXMgKmFwID0gKl9fbG9va3VwYWxpYXMobmFtZSk7CisKKwlpZiAoY2hlY2sgJiYgYXAgJiYgKGFwLT5mbGFnICYgQUxJQVNJTlVTRSkpCisJCXJldHVybiAoTlVMTCk7CisJcmV0dXJuIChhcCk7Cit9CisKKy8qCisgKiBUT0RPIC0gc29ydCBvdXRwdXQKKyAqLworaW50CithbGlhc2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbiwgKnY7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGFsaWFzICphcDsKKworCWlmIChhcmdjID09IDEpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFUQUJTSVpFOyBpKyspCisJCQlmb3IgKGFwID0gYXRhYltpXTsgYXA7IGFwID0gYXAtPm5leHQpIHsKKwkJCQlwcmludGFsaWFzKGFwKTsKKwkJCX0KKwkJcmV0dXJuICgwKTsKKwl9CisJd2hpbGUgKChuID0gKisrYXJndikgIT0gTlVMTCkgeworCQlpZiAoKHYgPSBzdHJjaHIobisxLCAnPScpKSA9PSBOVUxMKSB7IC8qIG4rMTogZnVubnkga3NoIHN0dWZmICovCisJCQlpZiAoKGFwID0gKl9fbG9va3VwYWxpYXMobikpID09IE5VTEwpIHsKKwkJCQlvdXRmbXQob3V0MiwgIiVzOiAlcyBub3QgZm91bmRcbiIsICJhbGlhcyIsIG4pOworCQkJCXJldCA9IDE7CisJCQl9IGVsc2UKKwkJCQlwcmludGFsaWFzKGFwKTsKKwkJfSBlbHNlIHsKKwkJCSp2KysgPSAnXDAnOworCQkJc2V0YWxpYXMobiwgdik7CisJCX0KKwl9CisKKwlyZXR1cm4gKHJldCk7Cit9CisKK2ludAordW5hbGlhc2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJhIikpICE9ICdcMCcpIHsKKwkJaWYgKGkgPT0gJ2EnKSB7CisJCQlybWFsaWFzZXMoKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgKmFyZ3B0cjsgYXJncHRyKyspIHsKKwkJaWYgKHVuYWxpYXMoKmFyZ3B0cikpIHsKKwkJCW91dGZtdChvdXQyLCAiJXM6ICVzIG5vdCBmb3VuZFxuIiwgInVuYWxpYXMiLCAqYXJncHRyKTsKKwkJCWkgPSAxOworCQl9CisJfQorCisJcmV0dXJuIChpKTsKK30KKworU1RBVElDIHN0cnVjdCBhbGlhcyAqCitmcmVlYWxpYXMoc3RydWN0IGFsaWFzICphcCkgeworCXN0cnVjdCBhbGlhcyAqbmV4dDsKKworCWlmIChhcC0+ZmxhZyAmIEFMSUFTSU5VU0UpIHsKKwkJYXAtPmZsYWcgfD0gQUxJQVNERUFEOworCQlyZXR1cm4gYXA7CisJfQorCisJbmV4dCA9IGFwLT5uZXh0OworCWNrZnJlZShhcC0+bmFtZSk7CisJY2tmcmVlKGFwLT52YWwpOworCWNrZnJlZShhcCk7CisJcmV0dXJuIG5leHQ7Cit9CisKK3ZvaWQKK3ByaW50YWxpYXMoY29uc3Qgc3RydWN0IGFsaWFzICphcCkgeworCW91dDFmbXQoIiVzPSVzXG4iLCBhcC0+bmFtZSwgc2luZ2xlX3F1b3RlKGFwLT52YWwpKTsKK30KKworU1RBVElDIHN0cnVjdCBhbGlhcyAqKgorX19sb29rdXBhbGlhcyhjb25zdCBjaGFyICpuYW1lKSB7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisJc3RydWN0IGFsaWFzICoqYXBwOworCWNvbnN0IGNoYXIgKnA7CisJdW5zaWduZWQgaW50IGNoOworCisJcCA9IG5hbWU7CisKKwljaCA9ICh1bnNpZ25lZCBjaGFyKSpwOworCWhhc2h2YWwgPSBjaCA8PCA0OworCXdoaWxlIChjaCkgeworCQloYXNodmFsICs9IGNoOworCQljaCA9ICh1bnNpZ25lZCBjaGFyKSorK3A7CisJfQorCWFwcCA9ICZhdGFiW2hhc2h2YWwgJSBBVEFCU0laRV07CisKKwlmb3IgKDsgKmFwcDsgYXBwID0gJigqYXBwKS0+bmV4dCkgeworCQlpZiAoZXF1YWwobmFtZSwgKCphcHApLT5uYW1lKSkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gYXBwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYWxpYXMuaCBiL3Vzci9kYXNoL2FsaWFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4NDFkNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2FsaWFzLmgKQEAgLTAsMCArMSw1MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylhbGlhcy5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKyNkZWZpbmUgQUxJQVNJTlVTRQkxCisjZGVmaW5lIEFMSUFTREVBRAkyCisKK3N0cnVjdCBhbGlhcyB7CisJc3RydWN0IGFsaWFzICpuZXh0OworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsOworCWludCBmbGFnOworfTsKKworc3RydWN0IGFsaWFzICpsb29rdXBhbGlhcyhjb25zdCBjaGFyICosIGludCk7CitpbnQgYWxpYXNjbWQoaW50LCBjaGFyICoqKTsKK2ludCB1bmFsaWFzY21kKGludCwgY2hhciAqKik7Cit2b2lkIHJtYWxpYXNlcyh2b2lkKTsKK2ludCB1bmFsaWFzKGNvbnN0IGNoYXIgKik7Cit2b2lkIHByaW50YWxpYXMoY29uc3Qgc3RydWN0IGFsaWFzICopOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYXJpdGgueSBiL3Vzci9kYXNoL2FyaXRoLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiMGIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2FyaXRoLnkKQEAgLTAsMCArMSwxNTUgQEAKKyV7CisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImV4cGFuZC5oIgorI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorCitjb25zdCBjaGFyICphcml0aF9idWYsICphcml0aF9zdGFydGJ1ZjsKKworI2lmbmRlZiBZWUJJU09OCitpbnQgeXlwYXJzZSh2b2lkKTsKKyNlbmRpZgordm9pZCB5eWVycm9yKGNvbnN0IGNoYXIgKik7CisjaWZkZWYgVEVTVEFSSVRICitpbnQgbWFpbihpbnQgLCBjaGFyICpbXSk7CitpbnQgc2hfZXJyb3IoY2hhciAqKTsKKyNlbmRpZgorCislfQorJXRva2VuIEFSSVRIX05VTSBBUklUSF9MUEFSRU4gQVJJVEhfUlBBUkVOCisKKyVsZWZ0IEFSSVRIX09SCislbGVmdCBBUklUSF9BTkQKKyVsZWZ0IEFSSVRIX0JPUgorJWxlZnQgQVJJVEhfQlhPUgorJWxlZnQgQVJJVEhfQkFORAorJWxlZnQgQVJJVEhfRVEgQVJJVEhfTkUKKyVsZWZ0IEFSSVRIX0xUIEFSSVRIX0dUIEFSSVRIX0dFIEFSSVRIX0xFCislbGVmdCBBUklUSF9MU0hJRlQgQVJJVEhfUlNISUZUCislbGVmdCBBUklUSF9BREQgQVJJVEhfU1VCCislbGVmdCBBUklUSF9NVUwgQVJJVEhfRElWIEFSSVRIX1JFTQorJWxlZnQgQVJJVEhfVU5BUllNSU5VUyBBUklUSF9VTkFSWVBMVVMgQVJJVEhfTk9UIEFSSVRIX0JOT1QKKyUlCisKK2V4cDoJZXhwciB7CisJCQlyZXR1cm4gKCQxKTsKKwl9CisJOworCisKK2V4cHI6CUFSSVRIX0xQQVJFTiBleHByIEFSSVRIX1JQQVJFTiB7ICQkID0gJDI7IH0KKwl8IGV4cHIgQVJJVEhfT1IgZXhwcgl7ICQkID0gJDEgfHwgJDM7IH0KKwl8IGV4cHIgQVJJVEhfQU5EIGV4cHIJeyAkJCA9ICQxICYmICQzOyB9CisJfCBleHByIEFSSVRIX0JPUiBleHByCXsgJCQgPSAkMSB8ICQzOyB9CisJfCBleHByIEFSSVRIX0JYT1IgZXhwcgl7ICQkID0gJDEgXiAkMzsgfQorCXwgZXhwciBBUklUSF9CQU5EIGV4cHIJeyAkJCA9ICQxICYgJDM7IH0KKwl8IGV4cHIgQVJJVEhfRVEgZXhwcgl7ICQkID0gJDEgPT0gJDM7IH0KKwl8IGV4cHIgQVJJVEhfR1QgZXhwcgl7ICQkID0gJDEgPiAkMzsgfQorCXwgZXhwciBBUklUSF9HRSBleHByCXsgJCQgPSAkMSA+PSAkMzsgfQorCXwgZXhwciBBUklUSF9MVCBleHByCXsgJCQgPSAkMSA8ICQzOyB9CisJfCBleHByIEFSSVRIX0xFIGV4cHIJeyAkJCA9ICQxIDw9ICQzOyB9CisJfCBleHByIEFSSVRIX05FIGV4cHIJeyAkJCA9ICQxICE9ICQzOyB9CisJfCBleHByIEFSSVRIX0xTSElGVCBleHByIHsgJCQgPSAkMSA8PCAkMzsgfQorCXwgZXhwciBBUklUSF9SU0hJRlQgZXhwciB7ICQkID0gJDEgPj4gJDM7IH0KKwl8IGV4cHIgQVJJVEhfQUREIGV4cHIJeyAkJCA9ICQxICsgJDM7IH0KKwl8IGV4cHIgQVJJVEhfU1VCIGV4cHIJeyAkJCA9ICQxIC0gJDM7IH0KKwl8IGV4cHIgQVJJVEhfTVVMIGV4cHIJeyAkJCA9ICQxICogJDM7IH0KKwl8IGV4cHIgQVJJVEhfRElWIGV4cHIJeworCQkJaWYgKCQzID09IDApCisJCQkJeXllcnJvcigiZGl2aXNpb24gYnkgemVybyIpOworCQkJJCQgPSAkMSAvICQzOworCQl9CisJfCBleHByIEFSSVRIX1JFTSBleHByICAgeworCQkJaWYgKCQzID09IDApCisJCQkJeXllcnJvcigiZGl2aXNpb24gYnkgemVybyIpOworCQkJJCQgPSAkMSAlICQzOworCQl9CisJfCBBUklUSF9OT1QgZXhwcgl7ICQkID0gISgkMik7IH0KKwl8IEFSSVRIX0JOT1QgZXhwcgl7ICQkID0gfigkMik7IH0KKwl8IEFSSVRIX1NVQiBleHByICVwcmVjIEFSSVRIX1VOQVJZTUlOVVMgeyAkJCA9IC0oJDIpOyB9CisJfCBBUklUSF9BREQgZXhwciAlcHJlYyBBUklUSF9VTkFSWVBMVVMgeyAkJCA9ICQyOyB9CisJfCBBUklUSF9OVU0KKwk7CislJQoraW50Cithcml0aChzKQorCWNvbnN0IGNoYXIgKnM7Cit7CisJbG9uZyByZXN1bHQ7CisKKwlhcml0aF9idWYgPSBhcml0aF9zdGFydGJ1ZiA9IHM7CisKKwlJTlRPRkY7CisJcmVzdWx0ID0geXlwYXJzZSgpOworCWFyaXRoX2xleF9yZXNldCgpOwkvKiByZXByaW1lIGxleCAqLworCUlOVE9OOworCisJcmV0dXJuIChyZXN1bHQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFRFU1RfQVJJVEgKKyNpbmNsdWRlIDxzdGRpby5oPgorbWFpbihhcmdjLCBhcmd2KQorCWNoYXIgKmFyZ3ZbXTsKK3sKKwlwcmludGYoIiVkXG4iLCBleHAoYXJndlsxXSkpOworfQorc2hfZXJyb3IocykKKwljaGFyICpzOworeworCWZwcmludGYoc3RkZXJyLCAiZXhwOiAlc1xuIiwgcyk7CisJZXhpdCgxKTsKK30KKyNlbmRpZgorCit2b2lkCit5eWVycm9yKHMpCisJY29uc3QgY2hhciAqczsKK3sKKworI2lmbmRlZiBZWUJJU09OCisJeXllcnJvazsKKyNlbmRpZgorCXl5Y2xlYXJpbjsKKwlhcml0aF9sZXhfcmVzZXQoKTsJLyogcmVwcmltZSBsZXggKi8KKwlzaF9lcnJvcigiYXJpdGhtZXRpYyBleHByZXNzaW9uOiAlczogXCIlc1wiIiwgcywgYXJpdGhfc3RhcnRidWYpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2FyaXRoX3l5bGV4LmMgYi91c3IvZGFzaC9hcml0aF95eWxleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTIwNTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9hcml0aF95eWxleC5jCkBAIC0wLDAgKzEsMTYzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMgorICoJSGVyYmVydCBYdS4KKyAqIENvcHlyaWdodCAoYykgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImFyaXRoLmgiCisjaW5jbHVkZSAiZXhwYW5kLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKworZXh0ZXJuIGludCB5eWx2YWw7CitleHRlcm4gY29uc3QgY2hhciAqYXJpdGhfYnVmLCAqYXJpdGhfc3RhcnRidWY7CisKK2ludAoreXlsZXgoKQoreworCWludCB2YWx1ZTsKKwljb25zdCBjaGFyICpidWYgPSBhcml0aF9idWY7CisKKwlmb3IgKDs7KSB7CisJCXN3aXRjaCAoKmJ1ZikgeworCQljYXNlICcgJzoKKwkJY2FzZSAnXHQnOgorCQljYXNlICdcbic6CisJCQlidWYrKzsKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorZXJyOgorCQkJc2hfZXJyb3IoImFyaXRoOiBzeW50YXggZXJyb3I6IFwiJXNcIiIsIGFyaXRoX3N0YXJ0YnVmKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJY2FzZSAnMCc6CisJCWNhc2UgJzEnOgorCQljYXNlICcyJzoKKwkJY2FzZSAnMyc6CisJCWNhc2UgJzQnOgorCQljYXNlICc1JzoKKwkJY2FzZSAnNic6CisJCWNhc2UgJzcnOgorCQljYXNlICc4JzoKKwkJY2FzZSAnOSc6CisJCQl5eWx2YWwgPSBzdHJ0b2xsKGJ1ZiwgKGNoYXIgKiopICZhcml0aF9idWYsIDApOworCQkJcmV0dXJuIEFSSVRIX05VTTsKKwkJY2FzZSAnPSc6CisJCQlpZiAoKisrYnVmICE9ICc9JykgeworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJdmFsdWUgPSBBUklUSF9FUTsKKwkJCWJyZWFrOworCQljYXNlICc+JzoKKwkJCXN3aXRjaCAoKisrYnVmKSB7CisJCQljYXNlICc9JzoKKwkJCQl2YWx1ZSA9IEFSSVRIX0dFOworCQkJCWJyZWFrOworCQkJY2FzZSAnPic6CisJCQkJdmFsdWUgPSBBUklUSF9SU0hJRlQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZhbHVlID0gQVJJVEhfR1Q7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnPCc6CisJCQlzd2l0Y2ggKCorK2J1ZikgeworCQkJY2FzZSAnPSc6CisJCQkJdmFsdWUgPSBBUklUSF9MRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzwnOgorCQkJCXZhbHVlID0gQVJJVEhfTFNISUZUOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl2YWx1ZSA9IEFSSVRIX0xUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3wnOgorCQkJaWYgKCorK2J1ZiAhPSAnfCcpIHsKKwkJCQl2YWx1ZSA9IEFSSVRIX0JPUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXZhbHVlID0gQVJJVEhfT1I7CisJCQlicmVhazsKKwkJY2FzZSAnJic6CisJCQlpZiAoKisrYnVmICE9ICcmJykgeworCQkJCXZhbHVlID0gQVJJVEhfQkFORDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXZhbHVlID0gQVJJVEhfQU5EOworCQkJYnJlYWs7CisJCWNhc2UgJyEnOgorCQkJaWYgKCorK2J1ZiAhPSAnPScpIHsKKwkJCQl2YWx1ZSA9IEFSSVRIX05PVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXZhbHVlID0gQVJJVEhfTkU7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJdmFsdWUgPSAwOworCQkJZ290byBvdXQ7CisJCWNhc2UgJygnOgorCQkJdmFsdWUgPSBBUklUSF9MUEFSRU47CisJCQlicmVhazsKKwkJY2FzZSAnKSc6CisJCQl2YWx1ZSA9IEFSSVRIX1JQQVJFTjsKKwkJCWJyZWFrOworCQljYXNlICcqJzoKKwkJCXZhbHVlID0gQVJJVEhfTVVMOworCQkJYnJlYWs7CisJCWNhc2UgJy8nOgorCQkJdmFsdWUgPSBBUklUSF9ESVY7CisJCQlicmVhazsKKwkJY2FzZSAnJSc6CisJCQl2YWx1ZSA9IEFSSVRIX1JFTTsKKwkJCWJyZWFrOworCQljYXNlICcrJzoKKwkJCXZhbHVlID0gQVJJVEhfQUREOworCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJdmFsdWUgPSBBUklUSF9TVUI7CisJCQlicmVhazsKKwkJY2FzZSAnfic6CisJCQl2YWx1ZSA9IEFSSVRIX0JOT1Q7CisJCQlicmVhazsKKwkJY2FzZSAnXic6CisJCQl2YWx1ZSA9IEFSSVRIX0JYT1I7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlidWYrKzsKK291dDoKKwlhcml0aF9idWYgPSBidWY7CisJcmV0dXJuIHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYmx0aW4vYmx0aW4uaCBiL3Vzci9kYXNoL2JsdGluL2JsdGluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhYzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2JsdGluL2JsdGluLmgKQEAgLTAsMCArMSw4OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylibHRpbi5oCTguMSAoQmVya2VsZXkpIDUvMzEvOTMKKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IHByb2dyYW1zIHdoaWNoIGFyZSBvcHRpb25hbGx5IGJ1aWx0IGludG8gdGhlCisgKiBzaGVsbC4gIElmIFNIRUxMIGlzIGRlZmluZWQsIHdlIHRyeSB0byBtYXAgdGhlIHN0YW5kYXJkIFVOSVggbGlicmFyeQorICogcm91dGluZXMgdG8gYXNoIHJvdXRpbmVzIHVzaW5nIGRlZmluZXMuCisgKi8KKworI2luY2x1ZGUgIi4uL3NoZWxsLmgiCisjaW5jbHVkZSAiLi4vbXlzdHJpbmcuaCIKKyNpbmNsdWRlICIuLi9vcHRpb25zLmgiCisjaWZkZWYgU0hFTEwKKyNpbmNsdWRlICIuLi9tZW1hbGxvYy5oIgorI2luY2x1ZGUgIi4uL291dHB1dC5oIgorI2luY2x1ZGUgIi4uL2Vycm9yLmgiCisjaWZuZGVmIFVTRV9HTElCQ19TVERJTworI3VuZGVmIHN0ZG91dAorI3VuZGVmIHN0ZGVycgorI3VuZGVmIHB1dGMKKyN1bmRlZiBwdXRjaGFyCisjdW5kZWYgZmlsZW5vCisjZGVmaW5lIHN0ZG91dCBvdXQxCisjZGVmaW5lIHN0ZGVyciBvdXQyCisjZGVmaW5lIHByaW50ZiBvdXQxZm10CisjZGVmaW5lIHB1dGMoYywgZmlsZSkJb3V0YyhjLCBmaWxlKQorI2RlZmluZSBwdXRjaGFyKGMpCW91dDFjKGMpCisjZGVmaW5lIEZJTEUgc3RydWN0IG91dHB1dAorI2RlZmluZSBmcHJpbnRmIG91dGZtdAorI2RlZmluZSBmcHV0cyBvdXRzdHIKKyNkZWZpbmUgZmZsdXNoIGZsdXNob3V0CisjZGVmaW5lIGZpbGVubyhmKSAoKGYpLT5mZCkKKyNkZWZpbmUgZmVycm9yIG91dGVycgorI2VuZGlmCisjZGVmaW5lIElOSVRBUkdTKGFyZ3YpCisjZGVmaW5lCWVycm9yIHNoX2Vycm9yCisjZGVmaW5lCXdhcm4gc2hfd2FybgorI2RlZmluZQl3YXJueCBzaF93YXJueAorI2RlZmluZSBleGl0IHNoX2V4aXQKKyNkZWZpbmUgc2V0cHJvZ25hbWUocykKKyNkZWZpbmUgZ2V0cHJvZ25hbWUoKSBjb21tYW5kbmFtZQorI2RlZmluZSBzZXRsb2NhdGUobCxzKSAwCisKKyNkZWZpbmUgZ2V0ZW52KHApIGJsdGlubG9va3VwKChwKSwwKQorCisjZWxzZQorI3VuZGVmIE5VTEwKKyNpbmNsdWRlIDxzdGRpby5oPgorI3VuZGVmIG1haW4KKyNkZWZpbmUgSU5JVEFSR1MoYXJndikJaWYgKChjb21tYW5kbmFtZSA9IGFyZ3ZbMF0pID09IE5VTEwpIHtmcHV0cygiQXJnYyBpcyB6ZXJvXG4iLCBzdGRlcnIpOyBleGl0KDIpO30gZWxzZQorI2VuZGlmCisKK2ludCBlY2hvY21kKGludCwgY2hhciAqKik7CisKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbW1hbmRuYW1lOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYmx0aW4vZWNoby4xIGIvdXNyL2Rhc2gvYmx0aW4vZWNoby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzdmYjQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ibHRpbi9lY2hvLjEKQEAgLTAsMCArMSwxMDkgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorLlwiCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorLlwiIEtlbm5ldGggQWxtcXVpc3QuCisuXCIgQ29weXJpZ2h0IDE5ODkgYnkgS2VubmV0aCBBbG1xdWlzdAorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiCUAoIyllY2hvLjEJOC4xIChCZXJrZWxleSkgNS8zMS85MworLlwiCisuRGQgTWF5IDMxLCAxOTkzCisuRHQgRUNITyAxCisuT3MKKy5TaCBOQU1FCisuTm0gZWNobworLk5kIHByb2R1Y2UgbWVzc2FnZSBpbiBhIHNoZWxsIHNjcmlwdAorLlNoIFNZTk9QU0lTCisuTm0KKy5PcCBGbCBuIHwgRmwgZQorLkFyIGFyZ3MgLi4uCisuU2ggREVTQ1JJUFRJT04KKy5ObQorcHJpbnRzIGl0cyBhcmd1bWVudHMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCwgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KK1VubGVzcyB0aGUKKy5GbCBuCitvcHRpb24gaXMgcHJlc2VudCwgYSBuZXdsaW5lIGlzIG91dHB1dCBmb2xsb3dpbmcgdGhlIGFyZ3VtZW50cy4KK1RoZQorLkZsIGUKK29wdGlvbiBjYXVzZXMKKy5ObQordG8gdHJlYXQgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgc3BlY2lhbGx5LCBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZworcGFyYWdyYXBoLgorVGhlCisuRmwgZQorb3B0aW9uIGlzIHRoZSBkZWZhdWx0LCBhbmQgaXMgcHJvdmlkZWQgc29sZWx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGgKK290aGVyIHN5c3RlbXMuCitPbmx5IG9uZSBvZiB0aGUgb3B0aW9ucworLkZsIG4KK2FuZAorLkZsIGUKK21heSBiZSBnaXZlbi4KKy5QcAorSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgaXMgZW5jb3VudGVyZWQgZHVyaW5nCitvdXRwdXQsIHRoZSBzZXF1ZW5jZSBpcyBub3Qgb3V0cHV0LiAgSW5zdGVhZCwgdGhlIHNwZWNpZmllZCBhY3Rpb24gaXMKK3BlcmZvcm1lZDoKKy5CbCAtdGFnIC13aWR0aCBpbmRlbnQKKy5JdCBMaSBcZWIKK0EgYmFja3NwYWNlIGNoYXJhY3RlciBpcyBvdXRwdXQuCisuSXQgTGkgXGVjCitTdWJzZXF1ZW50IG91dHB1dCBpcyBzdXBwcmVzc2VkLiAgVGhpcyBpcyBub3JtYWxseSB1c2VkIGF0IHRoZSBlbmQgb2YgdGhlCitsYXN0IGFyZ3VtZW50IHRvIHN1cHByZXNzIHRoZSB0cmFpbGluZyBuZXdsaW5lIHRoYXQKKy5ObQord291bGQgb3RoZXJ3aXNlIG91dHB1dC4KKy5JdCBMaSBcZWYKK091dHB1dCBhIGZvcm0gZmVlZC4KKy5JdCBMaSBcZW4KK091dHB1dCBhIG5ld2xpbmUgY2hhcmFjdGVyLgorLkl0IExpIFxlcgorT3V0cHV0IGEgY2FycmlhZ2UgcmV0dXJuLgorLkl0IExpIFxldAorT3V0cHV0IGEgKGhvcml6b250YWwpIHRhYiBjaGFyYWN0ZXIuCisuSXQgTGkgXGV2CitPdXRwdXQgYSB2ZXJ0aWNhbCB0YWIuCisuSXQgTGkgXGUwIE5zIEFyIGRpZ2l0cworT3V0cHV0IHRoZSBjaGFyYWN0ZXIgd2hvc2UgdmFsdWUgaXMgZ2l2ZW4gYnkgemVybyB0byB0aHJlZSBkaWdpdHMuCitJZiB0aGVyZSBhcmUgemVybyBkaWdpdHMsIGEgbnVsIGNoYXJhY3RlciBpcyBvdXRwdXQuCisuSXQgTGkgXGVcZQorT3V0cHV0IGEgYmFja3NsYXNoLgorLkVsCisuU2ggSElOVFMKK1JlbWVtYmVyIHRoYXQgYmFja3NsYXNoIGlzIHNwZWNpYWwgdG8gdGhlIHNoZWxsIGFuZCBuZWVkcyB0byBiZSBlc2NhcGVkLgorVG8gb3V0cHV0IGEgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgc2F5CisuUHAKKy5EMSAgZWNobyBtZXNzYWdlIFwqW0d0XVwqW0FtXTIKKy5TaCBCVUdTCitUaGUgb2N0YWwgY2hhcmFjdGVyIGVzY2FwZSBtZWNoYW5pc20KKy5QcSBMaSBcZTAgTnMgQXIgZGlnaXRzCitkaWZmZXJzIGZyb20gdGhlCitDIGxhbmd1YWdlIG1lY2hhbmlzbS4KKy5QcAorVGhlcmUgaXMgbm8gd2F5IHRvIGZvcmNlCisuTm0KK3RvIHRyZWF0IGl0cyBhcmd1bWVudHMgbGl0ZXJhbGx5LCByYXRoZXIgdGhhbiBpbnRlcnByZXRpbmcgdGhlbSBhcworb3B0aW9ucyBhbmQgZXNjYXBlIHNlcXVlbmNlcy4KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2JsdGluL3ByaW50Zi4xIGIvdXNyL2Rhc2gvYmx0aW4vcHJpbnRmLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyNjVhNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2JsdGluL3ByaW50Zi4xCkBAIC0wLDAgKzEsMzU0IEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkwLCAxOTkzCisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKy5cIglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKy5cIiB0aGUgSW5zdGl0dXRlIG9mIEVsZWN0cmljYWwgYW5kIEVsZWN0cm9uaWNzIEVuZ2luZWVycywgSW5jLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiCWZyb206IEAoIylwcmludGYuMQk4LjEgKEJlcmtlbGV5KSA2LzYvOTMKKy5cIgorLkRkIE5vdmVtYmVyIDUsIDE5OTMKKy5EdCBQUklOVEYgMQorLk9zCisuU2ggTkFNRQorLk5tIHByaW50ZgorLk5kIGZvcm1hdHRlZCBvdXRwdXQKKy5TaCBTWU5PUFNJUworLk5tCisuQXIgZm9ybWF0CisuT3AgQXIgYXJndW1lbnRzICAuLi4KKy5TaCBERVNDUklQVElPTgorLk5tCitmb3JtYXRzIGFuZCBwcmludHMgaXRzIGFyZ3VtZW50cywgYWZ0ZXIgdGhlIGZpcnN0LCB1bmRlciBjb250cm9sCitvZiB0aGUKKy5BciBmb3JtYXQgIC4KK1RoZQorLkFyIGZvcm1hdAoraXMgYSBjaGFyYWN0ZXIgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRocmVlIHR5cGVzIG9mIG9iamVjdHM6IHBsYWluIGNoYXJhY3RlcnMsCit3aGljaCBhcmUgc2ltcGx5IGNvcGllZCB0byBzdGFuZGFyZCBvdXRwdXQsIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIHdoaWNoCithcmUgY29udmVydGVkIGFuZCBjb3BpZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgYW5kIGZvcm1hdCBzcGVjaWZpY2F0aW9ucywKK2VhY2ggb2Ygd2hpY2ggY2F1c2VzIHByaW50aW5nIG9mIHRoZSBuZXh0IHN1Y2Nlc3NpdmUKKy5BciBhcmd1bWVudCAgLgorLlBwCitUaGUKKy5BciBhcmd1bWVudHMKK2FmdGVyIHRoZSBmaXJzdCBhcmUgdHJlYXRlZCBhcyBzdHJpbmdzIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBpcworZWl0aGVyCisuQ20gYiAsCisuQ20gQiAsCisuQ20gYworb3IKKy5DbSBzIDsKK290aGVyd2lzZSBpdCBpcyBldmFsdWF0ZWQgYXMgYSBDIGNvbnN0YW50LCB3aXRoIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uczoKKy5QcAorLkJsIC1idWxsZXQgLW9mZnNldCBpbmRlbnQgLWNvbXBhY3QKKy5JdAorQSBsZWFkaW5nIHBsdXMgb3IgbWludXMgc2lnbiBpcyBhbGxvd2VkLgorLkl0CitJZiB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgaXMgYSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlLCB0aGUgdmFsdWUgaXMgdGhlCisuVG4gQVNDSUkKK2NvZGUgb2YgdGhlIG5leHQgY2hhcmFjdGVyLgorLkVsCisuUHAKK1RoZSBmb3JtYXQgc3RyaW5nIGlzIHJldXNlZCBhcyBvZnRlbiBhcyBuZWNlc3NhcnkgdG8gc2F0aXNmeSB0aGUKKy5BciBhcmd1bWVudHMgIC4KK0FueSBleHRyYSBmb3JtYXQgc3BlY2lmaWNhdGlvbnMgYXJlIGV2YWx1YXRlZCB3aXRoIHplcm8gb3IgdGhlIG51bGwKK3N0cmluZy4KKy5QcAorQ2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGluIGJhY2tzbGFzaCBub3RhdGlvbiBhcyBkZWZpbmVkIGluCisuU3QgLWFuc2lDIC4KK1RoZSBjaGFyYWN0ZXJzIGFuZCB0aGVpciBtZWFuaW5ncyBhcmUgYXMgZm9sbG93czoKKy5CbCAtdGFnIC13aWR0aCBEcyAtb2Zmc2V0IGluZGVudAorLkl0IENtIFxlZQorV3JpdGUgYW4gXCpbTHRdZXNjYXBlXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZWEKK1dyaXRlIGEgXCpbTHRdYmVsbFwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGViCitXcml0ZSBhIFwqW0x0XWJhY2tzcGFjZVwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVmCitXcml0ZSBhIFwqW0x0XWZvcm0tZmVlZFwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVuCitXcml0ZSBhIFwqW0x0XW5ldy1saW5lXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZXIKK1dyaXRlIGEgXCpbTHRdY2FycmlhZ2UgcmV0dXJuXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZXQKK1dyaXRlIGEgXCpbTHRddGFiXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZXYKK1dyaXRlIGEgXCpbTHRddmVydGljYWwgdGFiXCpbR3RdIGNoYXJhY3Rlci4KKy5JdCBDbSBcZVwnCitXcml0ZSBhIFwqW0x0XXNpbmdsZSBxdW90ZVwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGUiCitXcml0ZSBhIFwqW0x0XWRvdWJsZSBxdW90ZVwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVcZQorV3JpdGUgYSBiYWNrc2xhc2ggY2hhcmFjdGVyLgorLkl0IENtIFxlIE5zIEFyIG51bQorV3JpdGUgYW4gOFwtYml0IGNoYXJhY3RlciB3aG9zZQorLlRuIEFTQ0lJCit2YWx1ZSBpcyB0aGUgMVwtLCAyXC0sIG9yIDNcLWRpZ2l0IG9jdGFsIG51bWJlcgorLkFyIG51bSAuCisuSXQgQ20gXGV4IE5zIEFyIHh4CitXcml0ZSBhbiA4XC1iaXQgY2hhcmFjdGVyIHdob3NlCisuVG4gQVNDSUkKK3ZhbHVlIGlzIHRoZSAxXC0gb3IgMlwtZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVyCisuQXIgeHggLgorLkVsCisuUHAKK0VhY2ggZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgaW50cm9kdWNlZCBieSB0aGUgcGVyY2VudCBjaGFyYWN0ZXIKKyhgYCUnJykuCitUaGUgcmVtYWluZGVyIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcywKK2luIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCAiWmVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6IgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgQ20gIworQSBgIycgY2hhcmFjdGVyCitzcGVjaWZ5aW5nIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSBwcmludGVkIGluIGFuIGBgYWx0ZXJuYXRpdmUgZm9ybScnLgorRm9yCisuQ20gYiAsCisuQ20gYyAsCisuQ20gZCAsCithbmQKKy5DbSBzCitmb3JtYXRzLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LgorRm9yIHRoZQorLkNtIG8KK2Zvcm1hdCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBudW1iZXIgaXMgaW5jcmVhc2VkIHRvIGZvcmNlIHRoZSBmaXJzdAorY2hhcmFjdGVyIG9mIHRoZSBvdXRwdXQgc3RyaW5nIHRvIGEgemVyby4KK0ZvciB0aGUKKy5DbSB4CisuUHEgQ20gWAorZm9ybWF0LCBhIG5vbi16ZXJvIHJlc3VsdCBoYXMgdGhlIHN0cmluZworLkxpIDB4CisuUHEgTGkgMFgKK3ByZXBlbmRlZCB0byBpdC4KK0ZvcgorLkNtIGUgICwKKy5DbSBFICwKKy5DbSBmICAsCisuQ20gZyAsCithbmQKKy5DbSBHCitmb3JtYXRzLCB0aGUgcmVzdWx0IHdpbGwgYWx3YXlzIGNvbnRhaW4gYSBkZWNpbWFsIHBvaW50LCBldmVuIGlmIG5vCitkaWdpdHMgZm9sbG93IHRoZSBwb2ludCAobm9ybWFsbHksIGEgZGVjaW1hbCBwb2ludCBvbmx5IGFwcGVhcnMgaW4gdGhlCityZXN1bHRzIG9mIHRob3NlIGZvcm1hdHMgaWYgYSBkaWdpdCBmb2xsb3dzIHRoZSBkZWNpbWFsIHBvaW50KS4KK0ZvcgorLkNtIGcKK2FuZAorLkNtIEcKK2Zvcm1hdHMsIHRyYWlsaW5nIHplcm9zIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSByZXN1bHQgYXMgdGhleQord291bGQgb3RoZXJ3aXNlIGJlLgorLlwiIEkgdHVybmVkIHRoaXMgb2ZmIC0gZGVjaWRlZCBpdCBpc24ndCBhIHZhbGlkIHVzZSBvZiAnIycKKy5cIiBGb3IgdGhlCisuXCIgLkNtIEIKKy5cIiBmb3JtYXQsIGJhY2tzbGFzaC1lc2NhcGUgc2VxdWVuY2VzIGFyZSBleHBhbmRlZCBmaXJzdDsKKy5JdCBDbSBcJlwtCitBIG1pbnVzIHNpZ24gYFwtJyB3aGljaCBzcGVjaWZpZXMKKy5FbSBsZWZ0IGFkanVzdG1lbnQKK29mIHRoZSBvdXRwdXQgaW4gdGhlIGluZGljYXRlZCBmaWVsZDsKKy5JdCBDbSBcJisKK0EgYCsnIGNoYXJhY3RlciBzcGVjaWZ5aW5nIHRoYXQgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZQorYSBzaWduIHBsYWNlZCBiZWZvcmUgdGhlIG51bWJlciB3aGVuIHVzaW5nIHNpZ25lZCBmb3JtYXRzLgorLkl0IFNxIFwmXCBcJgorQSBzcGFjZSBzcGVjaWZ5aW5nIHRoYXQgYSBibGFuayBzaG91bGQgYmUgbGVmdCBiZWZvcmUgYSBwb3NpdGl2ZSBudW1iZXIKK2ZvciBhIHNpZ25lZCBmb3JtYXQuCitBIGArJyBvdmVycmlkZXMgYSBzcGFjZSBpZiBib3RoIGFyZSB1c2VkOworLkl0IENtIFwmMAorQSB6ZXJvIGAwJyBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGF0IHplcm8tcGFkZGluZyBzaG91bGQgYmUgdXNlZAorcmF0aGVyIHRoYW4gYmxhbmstcGFkZGluZy4KK0EgYFwtJyBvdmVycmlkZXMgYSBgMCcgaWYgYm90aCBhcmUgdXNlZDsKKy5FbAorLkl0ICJGaWVsZCBXaWR0aDoiCitBbiBvcHRpb25hbCBkaWdpdCBzdHJpbmcgc3BlY2lmeWluZyBhCisuRW0gZmllbGQgd2lkdGggOworaWYgdGhlIG91dHB1dCBzdHJpbmcgaGFzIGZld2VyIGNoYXJhY3RlcnMgdGhhbiB0aGUgZmllbGQgd2lkdGggaXQgd2lsbAorYmUgYmxhbmstcGFkZGVkIG9uIHRoZSBsZWZ0IChvciByaWdodCwgaWYgdGhlIGxlZnQtYWRqdXN0bWVudCBpbmRpY2F0b3IKK2hhcyBiZWVuIGdpdmVuKSB0byBtYWtlIHVwIHRoZSBmaWVsZCB3aWR0aCAobm90ZSB0aGF0IGEgbGVhZGluZyB6ZXJvCitpcyBhIGZsYWcsIGJ1dCBhbiBlbWJlZGRlZCB6ZXJvIGlzIHBhcnQgb2YgYSBmaWVsZCB3aWR0aCk7CisuSXQgUHJlY2lzaW9uIDoKK0FuIG9wdGlvbmFsIHBlcmlvZCwKKy5TcSBDbSBcJi5cJiAsCitmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBkaWdpdCBzdHJpbmcgZ2l2aW5nIGEKKy5FbSBwcmVjaXNpb24KK3doaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0byBhcHBlYXIgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQsCitmb3IKKy5DbSBlCithbmQKKy5DbSBmCitmb3JtYXRzLCBvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBwcmludGVkCitmcm9tIGEgc3RyaW5nCisuU20gb2ZmCisuUGYgKCBDbSBiIE5vICwKKy5TbSBvbgorLkNtIEIKK2FuZAorLkNtIHMKK2Zvcm1hdHMpOyBpZiB0aGUgZGlnaXQgc3RyaW5nIGlzIG1pc3NpbmcsIHRoZSBwcmVjaXNpb24gaXMgdHJlYXRlZAorYXMgemVybzsKKy5JdCBGb3JtYXQgOgorQSBjaGFyYWN0ZXIgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGZvcm1hdCB0byB1c2UgKG9uZSBvZgorLkNtIGRpb3V4WGZ3RWdHYkJjcyApIC4KKy5FbAorLlBwCitBIGZpZWxkIHdpZHRoIG9yIHByZWNpc2lvbiBtYXkgYmUKKy5TcSBDbSBcJioKK2luc3RlYWQgb2YgYSBkaWdpdCBzdHJpbmcuCitJbiB0aGlzIGNhc2UgYW4KKy5BciBhcmd1bWVudAorc3VwcGxpZXMgdGhlIGZpZWxkIHdpZHRoIG9yIHByZWNpc2lvbi4KKy5QcAorVGhlIGZvcm1hdCBjaGFyYWN0ZXJzIGFuZCB0aGVpciBtZWFuaW5ncyBhcmU6CisuQmwgLXRhZyAtd2lkdGggRmwKKy5JdCBDbSBkaW91WHgKK1RoZQorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkIGFzIGEgc2lnbmVkIGRlY2ltYWwgKGQgb3IgaSksIHVuc2lnbmVkIG9jdGFsLCB1bnNpZ25lZCBkZWNpbWFsLAorb3IgdW5zaWduZWQgaGV4YWRlY2ltYWwgKFggb3IgeCksIHJlc3BlY3RpdmVseS4KKy5JdCBDbSBmCitUaGUKKy5BciBhcmd1bWVudAoraXMgcHJpbnRlZCBpbiB0aGUgc3R5bGUKKy5TbSBvZmYKKy5QZiBbXC1dZGRkIENtIFwmLiBObyBkZGQKKy5TbSBvbgord2hlcmUgdGhlIG51bWJlciBvZiBkJ3MKK2FmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGlzIGVxdWFsIHRvIHRoZSBwcmVjaXNpb24gc3BlY2lmaWNhdGlvbiBmb3IKK3RoZSBhcmd1bWVudC4KK0lmIHRoZSBwcmVjaXNpb24gaXMgbWlzc2luZywgNiBkaWdpdHMgYXJlIGdpdmVuOyBpZiB0aGUgcHJlY2lzaW9uCitpcyBleHBsaWNpdGx5IDAsIG5vIGRpZ2l0cyBhbmQgbm8gZGVjaW1hbCBwb2ludCBhcmUgcHJpbnRlZC4KKy5JdCBDbSBlRQorVGhlCisuQXIgYXJndW1lbnQKK2lzIHByaW50ZWQgaW4gdGhlIHN0eWxlCisuU20gb2ZmCisuUGYgW1wtXWQgQ20gXCYuIE5vIGRkZCBDbSBlIE5vIFxcKihQbWRkCisuU20gb24KK3doZXJlIHRoZXJlCitpcyBvbmUgZGlnaXQgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50IGFuZCB0aGUgbnVtYmVyIGFmdGVyIGlzIGVxdWFsIHRvCit0aGUgcHJlY2lzaW9uIHNwZWNpZmljYXRpb24gZm9yIHRoZSBhcmd1bWVudDsgd2hlbiB0aGUgcHJlY2lzaW9uIGlzCittaXNzaW5nLCA2IGRpZ2l0cyBhcmUgcHJvZHVjZWQuCitBbiB1cHBlci1jYXNlIEUgaXMgdXNlZCBmb3IgYW4gYEUnIGZvcm1hdC4KKy5JdCBDbSBnRworVGhlCisuQXIgYXJndW1lbnQKK2lzIHByaW50ZWQgaW4gc3R5bGUKKy5DbSBmCitvciBpbiBzdHlsZQorLkNtIGUKKy5QcSBDbSBFCit3aGljaGV2ZXIgZ2l2ZXMgZnVsbCBwcmVjaXNpb24gaW4gbWluaW11bSBzcGFjZS4KKy5JdCBDbSBiCitDaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZworLkFyIGFyZ3VtZW50CithcmUgcHJpbnRlZCB3aXRoIGJhY2tzbGFzaC1lc2NhcGUgc2VxdWVuY2VzIGV4cGFuZGVkLgorLmJyCitUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYmFja3NsYXNoLWVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZDoKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IENtIFxlYworQ2F1c2VzCisuTm0KK3RvIGlnbm9yZSBhbnkgcmVtYWluaW5nIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBvcGVyYW5kIGNvbnRhaW5pbmcgaXQsCithbnkgcmVtYWluaW5nIHN0cmluZyBvcGVyYW5kcywgYW5kIGFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgaW4KK3RoZSBmb3JtYXQgb3BlcmFuZC4KKy5JdCBDbSBcZTAgTnMgQXIgbnVtCitXcml0ZSBhbiA4XC1iaXQgY2hhcmFjdGVyIHdob3NlCisuVG4gQVNDSUkKK3ZhbHVlIGlzIHRoZSAxXC0sIDJcLSwgb3IgM1wtZGlnaXQKK29jdGFsIG51bWJlcgorLkFyIG51bSAuCisuSXQgQ20gXGVeIE5zIEFyIGMKK1dyaXRlIHRoZSBjb250cm9sIGNoYXJhY3RlcgorLkFyIGMgLgorR2VuZXJhdGVzIGNoYXJhY3RlcnMgYFxlMDAwJyB0aHJvdWdoIGBcZTAzN2AsIGFuZCBgXGUxNzcnIChmcm9tIGBcZV4/JykuCisuSXQgQ20gXGVNXC0gTnMgQXIgYworV3JpdGUgdGhlIGNoYXJhY3RlcgorLkFyIGMKK3dpdGggdGhlIDh0aCBiaXQgc2V0LgorR2VuZXJhdGVzIGNoYXJhY3RlcnMgYFxlMjQxJyB0aHJvdWdoIGBcZTM3NmAuCisuSXQgQ20gXGVNXiBOcyBBciBjCitXcml0ZSB0aGUgY29udHJvbCBjaGFyYWN0ZXIKKy5BciBjCit3aXRoIHRoZSA4dGggYml0IHNldC4KK0dlbmVyYXRlcyBjaGFyYWN0ZXJzIGBcZTAwMCcgdGhyb3VnaCBgXGUwMzdgLCBhbmQgYFxlMTc3JyAoZnJvbSBgXGVNXj8nKS4KKy5FbAorLkl0IENtIEIKK0NoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nCisuQXIgYXJndW1lbnQKK2FyZSBwcmludGVkIHdpdGggdW5wcmludGFibGUgY2hhcmFjdGVycyBiYWNrc2xhc2gtZXNjYXBlZCB1c2luZyB0aGUKKy5TbSBvZmYKKy5QZiBgIENtIFxlIEFyIGMgTm8gJywKKy5QZiBgIENtIFxlXiBBciBjIE5vICcsCisuUGYgYCBDbSBcZU1cLSBBciBjIE5vICcKK29yCisuUGYgYCBDbSBcZU1eIEFyIGMgTm8gJywKKy5TbSBvbgorZm9ybWF0cyBkZXNjcmliZWQgYWJvdmUuCisuSXQgQ20gYworVGhlIGZpcnN0IGNoYXJhY3RlciBvZgorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkLgorLkl0IENtIHMKK0NoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nCisuQXIgYXJndW1lbnQKK2FyZSBwcmludGVkIHVudGlsIHRoZSBlbmQgaXMgcmVhY2hlZCBvciB1bnRpbCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKK2luZGljYXRlZCBieSB0aGUgcHJlY2lzaW9uIHNwZWNpZmljYXRpb24gaXMgcmVhY2hlZDsgaWYgdGhlCitwcmVjaXNpb24gaXMgb21pdHRlZCwgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgcHJpbnRlZC4KKy5JdCBDbSBcJiUKK1ByaW50IGEgYCUnOyBubyBhcmd1bWVudCBpcyB1c2VkLgorLkVsCisuUHAKK0luIG5vIGNhc2UgZG9lcyBhIG5vbi1leGlzdGVudCBvciBzbWFsbCBmaWVsZCB3aWR0aCBjYXVzZSB0cnVuY2F0aW9uIG9mCithIGZpZWxkOyBwYWRkaW5nIHRha2VzIHBsYWNlIG9ubHkgaWYgdGhlIHNwZWNpZmllZCBmaWVsZCB3aWR0aCBleGNlZWRzCit0aGUgYWN0dWFsIHdpZHRoLgorLlNoIEVYSVQgU1RBVFVTCisuTm0KK2V4aXRzIDAgb24gc3VjY2VzcywgMSBvbiBmYWlsdXJlLgorLlNoIFNFRSBBTFNPCisuWHIgZWNobyAxICwKKy5YciBwcmludGYgMyAsCisuWHIgcHJpbnRmIDkKKy5YciB2aXMgMworLlNoIFNUQU5EQVJEUworVGhlCisuTm0KK3V0aWxpdHkgY29uZm9ybXMgdG8KKy5TdCAtcDEwMDMuMS0yMDAxIC4KKy5QcAorU3VwcG9ydCBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgYW5kIGAqJyBhcyBhIGZpZWxkIHdpZHRoIGFuZCBwcmVjaXNpb24KK2FyZSBvcHRpb25hbCBpbiBQT1NJWC4KKy5QcAorVGhlIGJlaGF2aW91ciBvZiB0aGUgJUIgZm9ybWF0IGFuZCB0aGUgXGUnLCBcZSIsIFxleHh4LCBcZWUgYW5kCitcZVtNXVtcLXxeXWMgZXNjYXBlIHNlcXVlbmNlcyBhcmUgdW5kZWZpbmVkIGluIFBPU0lYLgorLlNoIEJVR1MKK1NpbmNlIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSB0cmFuc2xhdGVkIGZyb20KKy5UbiBBU0NJSQordG8gZmxvYXRpbmctcG9pbnQgYW5kCit0aGVuIGJhY2sgYWdhaW4sIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBtYXkgYmUgbG9zdC4KKy5QcAorSGV4YWRlY2ltYWwgY2hhcmFjdGVyIGNvbnN0YW50cyBhcmUgcmVzdHJpY3RlZCB0bywgYW5kIHNob3VsZCBiZSBzcGVjaWZpZWQKK2FzLCB0d28gY2hhcmFjdGVyIGNvbnN0YW50cy4gIFRoaXMgaXMgY29udHJhcnkgdG8gdGhlIElTTyBDIHN0YW5kYXJkIGJ1dAorZG9lcyBndWFyYW50ZWUgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGNvbnN0YW50LgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYmx0aW4vcHJpbnRmLmMgYi91c3IvZGFzaC9ibHRpbi9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJhNDBkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvYmx0aW4vcHJpbnRmLmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworc3RhdGljIGNoYXIJKmNvbnZfZXNjYXBlX3N0cihjaGFyICopOworc3RhdGljIGNoYXIJKmNvbnZfZXNjYXBlKGNoYXIgKiwgaW50ICopOworc3RhdGljIGludAkgZ2V0Y2hyKHZvaWQpOworc3RhdGljIGludG1heF90CSBnZXRpbnRtYXgodm9pZCk7CitzdGF0aWMgdWludG1heF90IGdldHVpbnRtYXgodm9pZCk7CitzdGF0aWMgY2hhcgkqZ2V0c3RyKHZvaWQpOworc3RhdGljIGNoYXIJKm1rbG9uZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCAgICAgIGNoZWNrX2NvbnZlcnNpb24oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworI2lmZGVmIEhBVkVfU1RSVE9ECitzdGF0aWMgZG91YmxlCSBnZXRkb3VibGUodm9pZCk7CisjZW5kaWYKKworc3RhdGljIGludAlydmFsOworc3RhdGljIGNoYXIgICoqZ2FyZ3Y7CisKKyNkZWZpbmUgaXNvZGlnaXQoYykJKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc3JykKKyNkZWZpbmUgb2N0dG9iaW4oYykJKChjKSAtICcwJykKKworI2luY2x1ZGUgImJsdGluLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisKKyNkZWZpbmUgUEYoZiwgZnVuYykgeyBcCisJc3dpdGNoICgoY2hhciAqKXBhcmFtIC0gKGNoYXIgKilhcnJheSkgeyBcCisJZGVmYXVsdDogXAorCQkodm9pZClwcmludGYoZiwgYXJyYXlbMF0sIGFycmF5WzFdLCBmdW5jKTsgXAorCQlicmVhazsgXAorCWNhc2Ugc2l6ZW9mKCpwYXJhbSk6IFwKKwkJKHZvaWQpcHJpbnRmKGYsIGFycmF5WzBdLCBmdW5jKTsgXAorCQlicmVhazsgXAorCWNhc2UgMDogXAorCQkodm9pZClwcmludGYoZiwgZnVuYyk7IFwKKwkJYnJlYWs7IFwKKwl9IFwKK30KKworaW50IHByaW50ZmNtZChpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKmZtdDsKKwljaGFyICpmb3JtYXQ7CisJaW50IGNoOworCisJcnZhbCA9IDA7CisKKwluZXh0b3B0KG51bGxzdHIpOworCisJYXJndiA9IGFyZ3B0cjsKKwlmb3JtYXQgPSAqYXJndjsKKworCWlmICghZm9ybWF0KSB7CisJCXdhcm54KCJ1c2FnZTogcHJpbnRmIGZvcm1hdCBbYXJnIC4uLl0iKTsKKwkJZ290byBlcnI7CisJfQorCisJZ2FyZ3YgPSArK2FyZ3Y7CisKKyNkZWZpbmUgU0tJUDEJIiMtKyAwIgorI2RlZmluZSBTS0lQMgkiKjAxMjM0NTY3ODkiCisJZG8geworCQkvKgorCQkgKiBCYXNpYyBhbGdvcml0aG0gaXMgdG8gc2NhbiB0aGUgZm9ybWF0IHN0cmluZyBmb3IgY29udmVyc2lvbgorCQkgKiBzcGVjaWZpY2F0aW9ucyAtLSBvbmNlIG9uZSBpcyBmb3VuZCwgZmluZCBvdXQgaWYgdGhlIGZpZWxkCisJCSAqIHdpZHRoIG9yIHByZWNpc2lvbiBpcyBhICcqJzsgaWYgaXQgaXMsIGdhdGhlciB1cCB2YWx1ZS4KKwkJICogTm90ZSwgZm9ybWF0IHN0cmluZ3MgYXJlIHJldXNlZCBhcyBuZWNlc3NhcnkgdG8gdXNlIHVwIHRoZQorCQkgKiBwcm92aWRlZCBhcmd1bWVudHMsIGFyZ3VtZW50cyBvZiB6ZXJvL251bGwgc3RyaW5nIGFyZQorCQkgKiBwcm92aWRlZCB0byB1c2UgdXAgdGhlIGZvcm1hdCBzdHJpbmcuCisJCSAqLworCisJCS8qIGZpbmQgbmV4dCBmb3JtYXQgc3BlY2lmaWNhdGlvbiAqLworCQlmb3IgKGZtdCA9IGZvcm1hdDsgKGNoID0gKmZtdCsrKSA7KSB7CisJCQljaGFyICpzdGFydDsKKwkJCWNoYXIgbmV4dGNoOworCQkJaW50IGFycmF5WzJdOworCQkJaW50ICpwYXJhbTsKKworCQkJaWYgKGNoID09ICdcXCcpIHsKKwkJCQlpbnQgY19jaDsKKwkJCQlmbXQgPSBjb252X2VzY2FwZShmbXQsICZjX2NoKTsKKwkJCQljaCA9IGNfY2g7CisJCQkJZ290byBwYzsKKwkJCX0KKwkJCWlmIChjaCAhPSAnJScgfHwgKCpmbXQgPT0gJyUnICYmICgrK2ZtdCB8fCAxKSkpIHsKK3BjOgorCQkJCXB1dGNoYXIoY2gpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBPayAtIHdlJ3ZlIGZvdW5kIGEgZm9ybWF0IHNwZWNpZmljYXRpb24sCisJCQkgICBTYXZlIGl0cyBhZGRyZXNzIGZvciBhIGxhdGVyIHByaW50ZigpLiAqLworCQkJc3RhcnQgPSBmbXQgLSAxOworCQkJcGFyYW0gPSBhcnJheTsKKworCQkJLyogc2tpcCB0byBmaWVsZCB3aWR0aCAqLworCQkJZm10ICs9IHN0cnNwbihmbXQsIFNLSVAxKTsKKwkJCWlmICgqZm10ID09ICcqJykKKwkJCQkqcGFyYW0rKyA9IGdldGludG1heCgpOworCisJCQkvKiBza2lwIHRvIHBvc3NpYmxlICcuJywgZ2V0IGZvbGxvd2luZyBwcmVjaXNpb24gKi8KKwkJCWZtdCArPSBzdHJzcG4oZm10LCBTS0lQMik7CisJCQlpZiAoKmZtdCA9PSAnLicpCisJCQkJKytmbXQ7CisJCQlpZiAoKmZtdCA9PSAnKicpCisJCQkJKnBhcmFtKysgPSBnZXRpbnRtYXgoKTsKKworCQkJZm10ICs9IHN0cnNwbihmbXQsIFNLSVAyKTsKKworCQkJY2ggPSAqZm10OworCQkJaWYgKCFjaCkgeworCQkJCXdhcm54KCJtaXNzaW5nIGZvcm1hdCBjaGFyYWN0ZXIiKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCS8qIG51bGwgdGVybWluYXRlIGZvcm1hdCBzdHJpbmcgdG8gd2UgY2FuIHVzZSBpdAorCQkJICAgYXMgYW4gYXJndW1lbnQgdG8gcHJpbnRmLiAqLworCQkJbmV4dGNoID0gZm10WzFdOworCQkJZm10WzFdID0gMDsKKwkJCXN3aXRjaCAoY2gpIHsKKworCQkJY2FzZSAnYic6IHsKKwkJCQljaGFyICpwID0gY29udl9lc2NhcGVfc3RyKGdldHN0cigpKTsKKwkJCQkqZm10ID0gJ3MnOworCQkJCVBGKHN0YXJ0LCBwKTsKKwkJCQkvKiBlc2NhcGUgaWYgYSBcYyB3YXMgZW5jb3VudGVyZWQgKi8KKwkJCQlpZiAocnZhbCAmIDB4MTAwKQorCQkJCQlnb3RvIG91dDsKKwkJCQkqZm10ID0gJ2InOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAnYyc6IHsKKwkJCQlpbnQgcCA9IGdldGNocigpOworCQkJCVBGKHN0YXJ0LCBwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ3MnOiB7CisJCQkJY2hhciAqcCA9IGdldHN0cigpOworCQkJCVBGKHN0YXJ0LCBwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ2QnOgorCQkJY2FzZSAnaSc6IHsKKwkJCQlpbnRtYXhfdCBwID0gZ2V0aW50bWF4KCk7CisJCQkJY2hhciAqZiA9IG1rbG9uZyhzdGFydCwgZm10KTsKKwkJCQlQRihmLCBwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ28nOgorCQkJY2FzZSAndSc6CisJCQljYXNlICd4JzoKKwkJCWNhc2UgJ1gnOiB7CisJCQkJdWludG1heF90IHAgPSBnZXR1aW50bWF4KCk7CisJCQkJY2hhciAqZiA9IG1rbG9uZyhzdGFydCwgZm10KTsKKwkJCQlQRihmLCBwKTsKKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBIQVZFX1NUUlRPRAorCQkJY2FzZSAnZSc6CisJCQljYXNlICdFJzoKKwkJCWNhc2UgJ2YnOgorCQkJY2FzZSAnZyc6CisJCQljYXNlICdHJzogeworCQkJCWRvdWJsZSBwID0gZ2V0ZG91YmxlKCk7CisJCQkJUEYoc3RhcnQsIHApOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCXdhcm54KCIlczogaW52YWxpZCBkaXJlY3RpdmUiLCBzdGFydCk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQkqKytmbXQgPSBuZXh0Y2g7CisJCX0KKwl9IHdoaWxlIChnYXJndiAhPSBhcmd2ICYmICpnYXJndik7CisKK291dDoKKwlyZXR1cm4gKHJ2YWwgJiB+MHgxMDApOworZXJyOgorCXJldHVybiAxOworfQorCisKKy8qCisgKiBQcmludCBTeXNWIGVjaG8oMSkgc3R5bGUgZXNjYXBlIHN0cmluZworICoJSGFsdHMgcHJvY2Vzc2luZyBzdHJpbmcgaWYgYSBcYyBlc2NhcGUgaXMgZW5jb3VudGVyZWQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2NvbnZfZXNjYXBlX3N0cihjaGFyICpzdHIpCit7CisJaW50IGNoOworCWNoYXIgKmNwOworCisJLyogY29udmVydCBzdHJpbmcgaW50byBhIHRlbXBvcmFyeSBidWZmZXIuLi4gKi8KKwlTVEFSVFNUQUNLU1RSKGNwKTsKKworCWRvIHsKKwkJaW50IGM7CisKKwkJY2ggPSAqc3RyKys7CisJCWlmIChjaCAhPSAnXFwnKQorCQkJY29udGludWU7CisKKwkJY2ggPSAqc3RyKys7CisJCWlmIChjaCA9PSAnYycpIHsKKwkJCS8qIFxjIGFzIGluIFNZU1YgZWNobyAtIGFib3J0IGFsbCBwcm9jZXNzaW5nLi4uLiAqLworCQkJcnZhbCB8PSAweDEwMDsKKwkJCWNoID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogJWIgc3RyaW5nIG9jdGFsIGNvbnN0YW50cyBhcmUgbm90IGxpa2UgdGhvc2UgaW4gQy4KKwkJICogVGhleSBzdGFydCB3aXRoIGEgXDAsIGFuZCBhcmUgZm9sbG93ZWQgYnkgMCwgMSwgMiwKKwkJICogb3IgMyBvY3RhbCBkaWdpdHMuCisJCSAqLworCQlpZiAoY2ggPT0gJzAnKSB7CisJCQl1bnNpZ25lZCBjaGFyIGk7CisJCQlpID0gMzsKKwkJCWNoID0gMDsKKwkJCWRvIHsKKwkJCQl1bnNpZ25lZCBrID0gb2N0dG9iaW4oKnN0cik7CisJCQkJaWYgKGsgPiA3KQorCQkJCQlicmVhazsKKwkJCQlzdHIrKzsKKwkJCQljaCA8PD0gMzsKKwkJCQljaCArPSBrOworCQkJfSB3aGlsZSAoLS1pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRmluYWxseSB0ZXN0IGZvciBzZXF1ZW5jZXMgdmFsaWQgaW4gdGhlIGZvcm1hdCBzdHJpbmcgKi8KKwkJc3RyID0gY29udl9lc2NhcGUoc3RyIC0gMSwgJmMpOworCQljaCA9IGM7CisJfSB3aGlsZSAoU1RQVVRDKGNoLCBjcCksIGNoKTsKKworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisKKy8qCisgKiBQcmludCAic3RhbmRhcmQiIGVzY2FwZSBjaGFyYWN0ZXJzCisgKi8KK3N0YXRpYyBjaGFyICoKK2NvbnZfZXNjYXBlKGNoYXIgKnN0ciwgaW50ICpjb252X2NoKQoreworCWludCB2YWx1ZTsKKwlpbnQgY2g7CisKKwljaCA9ICpzdHI7CisKKwlzd2l0Y2ggKGNoKSB7CisJZGVmYXVsdDoKKwljYXNlIDA6CisJCXZhbHVlID0gJ1xcJzsKKwkJZ290byBvdXQ7CisKKwljYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzoKKwljYXNlICc0JzogY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzoKKwkJY2ggPSAzOworCQl2YWx1ZSA9IDA7CisJCWRvIHsKKwkJCXZhbHVlIDw8PSAzOworCQkJdmFsdWUgKz0gb2N0dG9iaW4oKnN0cisrKTsKKwkJfSB3aGlsZSAoaXNvZGlnaXQoKnN0cikgJiYgLS1jaCk7CisJCWdvdG8gb3V0OworCisJY2FzZSAnXFwnOgl2YWx1ZSA9ICdcXCc7CWJyZWFrOwkvKiBiYWNrc2xhc2ggKi8KKwljYXNlICdhJzoJdmFsdWUgPSAnXGEnOwlicmVhazsJLyogYWxlcnQgKi8KKwljYXNlICdiJzoJdmFsdWUgPSAnXGInOwlicmVhazsJLyogYmFja3NwYWNlICovCisJY2FzZSAnZic6CXZhbHVlID0gJ1xmJzsJYnJlYWs7CS8qIGZvcm0tZmVlZCAqLworCWNhc2UgJ24nOgl2YWx1ZSA9ICdcbic7CWJyZWFrOwkvKiBuZXdsaW5lICovCisJY2FzZSAncic6CXZhbHVlID0gJ1xyJzsJYnJlYWs7CS8qIGNhcnJpYWdlLXJldHVybiAqLworCWNhc2UgJ3QnOgl2YWx1ZSA9ICdcdCc7CWJyZWFrOwkvKiB0YWIgKi8KKwljYXNlICd2JzoJdmFsdWUgPSAnXHYnOwlicmVhazsJLyogdmVydGljYWwtdGFiICovCisJfQorCisJc3RyKys7CitvdXQ6CisJKmNvbnZfY2ggPSB2YWx1ZTsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqCitta2xvbmcoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpjaCkKK3sKKwljaGFyICpjb3B5OworCXNpemVfdCBsZW47CisKKwlsZW4gPSBjaCAtIHN0ciArIDM7CisJU1RBUlRTVEFDS1NUUihjb3B5KTsKKwljb3B5ID0gbWFrZXN0cnNwYWNlKGxlbiwgY29weSk7CisJbWVtY3B5KGNvcHksIHN0ciwgbGVuIC0gMyk7CisJY29weVtsZW4gLSAzXSA9ICdqJzsKKwljb3B5W2xlbiAtIDJdID0gKmNoOworCWNvcHlbbGVuIC0gMV0gPSAnXDAnOworCXJldHVybiAoY29weSk7Cit9CisKK3N0YXRpYyBpbnQKK2dldGNocih2b2lkKQoreworCWludCB2YWwgPSAwOworCisJaWYgKCpnYXJndikKKwkJdmFsID0gKipnYXJndisrOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldHN0cih2b2lkKQoreworCWNoYXIgKnZhbCA9IG51bGxzdHI7CisKKwlpZiAoKmdhcmd2KQorCQl2YWwgPSAqZ2FyZ3YrKzsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50bWF4X3QKK2dldGludG1heCh2b2lkKQoreworCWludG1heF90IHZhbCA9IDA7CisJY2hhciAqY3AsICplcDsKKworCWNwID0gKmdhcmd2OworCWlmIChjcCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlnYXJndisrOworCisJdmFsID0gKHVuc2lnbmVkIGNoYXIpIGNwWzFdOworCWlmICgqY3AgPT0gJ1wiJyB8fCAqY3AgPT0gJ1wnJykKKwkJZ290byBvdXQ7CisKKwllcnJubyA9IDA7CisJdmFsID0gc3RydG9pbWF4KGNwLCAmZXAsIDApOworCWNoZWNrX2NvbnZlcnNpb24oY3AsIGVwKTsKK291dDoKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdWludG1heF90CitnZXR1aW50bWF4KHZvaWQpCit7CisJdWludG1heF90IHZhbCA9IDA7CisJY2hhciAqY3AsICplcDsKKworCWNwID0gKmdhcmd2OworCWlmIChjcCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlnYXJndisrOworCisJdmFsID0gKHVuc2lnbmVkIGNoYXIpIGNwWzFdOworCWlmICgqY3AgPT0gJ1wiJyB8fCAqY3AgPT0gJ1wnJykKKwkJZ290byBvdXQ7CisKKwllcnJubyA9IDA7CisJdmFsID0gc3RydG91bWF4KGNwLCAmZXAsIDApOworCWNoZWNrX2NvbnZlcnNpb24oY3AsIGVwKTsKK291dDoKKwlyZXR1cm4gdmFsOworfQorCisjaWZkZWYgSEFWRV9TVFJUT0QKK3N0YXRpYyBkb3VibGUKK2dldGRvdWJsZSh2b2lkKQoreworCWRvdWJsZSB2YWw7CisJY2hhciAqY3AsICplcDsKKworCWNwID0gKmdhcmd2OworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlnYXJndisrOworCisJaWYgKCpjcCA9PSAnXCInIHx8ICpjcCA9PSAnXCcnKQorCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpIGNwWzFdOworCisJZXJybm8gPSAwOworCXZhbCA9IHN0cnRvZChjcCwgJmVwKTsKKwljaGVja19jb252ZXJzaW9uKGNwLCBlcCk7CisJcmV0dXJuIHZhbDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorY2hlY2tfY29udmVyc2lvbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICplcCkKK3sKKwlpZiAoKmVwKSB7CisJCWlmIChlcCA9PSBzKQorCQkJd2FybngoIiVzOiBleHBlY3RlZCBudW1lcmljIHZhbHVlIiwgcyk7CisJCWVsc2UKKwkJCXdhcm54KCIlczogbm90IGNvbXBsZXRlbHkgY29udmVydGVkIiwgcyk7CisJCXJ2YWwgPSAxOworCX0gZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisJCXdhcm54KCIlczogJXMiLCBzLCBzdHJlcnJvcihFUkFOR0UpKTsKKwkJcnZhbCA9IDE7CisJfQorfQorCitpbnQKK2VjaG9jbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBub25sID0gMDsKKwlzdHJ1Y3Qgb3V0cHV0ICpvdXRzID0gb3V0MTsKKworCWlmICghKisrYXJndikKKwkJZ290byBlbmQ7CisJaWYgKGVxdWFsKCphcmd2LCAiLW4iKSkgeworCQlub25sID0gfm5vbmw7CisJCWlmICghKisrYXJndikKKwkJCWdvdG8gZW5kOworCX0KKworCWRvIHsKKwkJY2hhciBjOworCisJCWMgPSAqKCphcmd2KSsrOworCQlpZiAoIWMpCisJCQlnb3RvIG5leHQ7CisJCWlmIChjICE9ICdcXCcpCisJCQlnb3RvIHByaW50OworCisJCW91dHN0cihjb252X2VzY2FwZV9zdHIoKmFyZ3YgLSAxKSwgb3V0cyk7CisJCWlmIChydmFsICYgMHgxMDApCisJCQlicmVhazsKK25leHQ6CisJCWMgPSAnICc7CisJCWlmICghKisrYXJndikgeworZW5kOgorCQkJaWYgKG5vbmwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWMgPSAnXG4nOworCQl9CitwcmludDoKKwkJb3V0YyhjLCBvdXRzKTsKKwl9IHdoaWxlICgqYXJndik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9ibHRpbi90ZXN0LjEgYi91c3IvZGFzaC9ibHRpbi90ZXN0LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0MzVmYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2JsdGluL3Rlc3QuMQpAQCAtMCwwICsxLDMwOSBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisuXCIJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisuXCIgdGhlIEluc3RpdHV0ZSBvZiBFbGVjdHJpY2FsIGFuZCBFbGVjdHJvbmljcyBFbmdpbmVlcnMsIEluYy4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLlwiICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLlwiICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLlwiIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisuXCIgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy5cIiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorLlwiIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy5cIiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisuXCIgU1VDSCBEQU1BR0UuCisuXCIKKy5cIiAgICAgQCgjKXRlc3QuMQk4LjEgKEJlcmtlbGV5KSA1LzMxLzkzCisuXCIKKy5EZCBNYXkgMzEsIDE5OTMKKy5EdCBURVNUIDEKKy5PcworLlNoIE5BTUUKKy5ObSB0ZXN0ICwKKy5ObSBcJlsKKy5OZCBjb25kaXRpb24gZXZhbHVhdGlvbiB1dGlsaXR5CisuU2ggU1lOT1BTSVMKKy5ObSB0ZXN0CisuQXIgZXhwcmVzc2lvbgorLk5tIFwmWworLkFyIGV4cHJlc3Npb24gQ20gXQorLlNoIERFU0NSSVBUSU9OCitUaGUKKy5ObSB0ZXN0Cit1dGlsaXR5IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGV2YWx1YXRlcwordG8gdHJ1ZSwgcmV0dXJucyBhIHplcm8gKHRydWUpIGV4aXQgc3RhdHVzOyBvdGhlcndpc2UKK2l0IHJldHVybnMgMSAoZmFsc2UpLgorSWYgdGhlcmUgaXMgbm8gZXhwcmVzc2lvbiwgdGVzdCBhbHNvCityZXR1cm5zIDEgKGZhbHNlKS4KKy5QcAorQWxsIG9wZXJhdG9ycyBhbmQgZmxhZ3MgYXJlIHNlcGFyYXRlIGFyZ3VtZW50cyB0byB0aGUKKy5ObSB0ZXN0Cit1dGlsaXR5LgorLlBwCitUaGUgZm9sbG93aW5nIHByaW1hcmllcyBhcmUgdXNlZCB0byBjb25zdHJ1Y3QgZXhwcmVzc2lvbjoKKy5CbCAtdGFnIC13aWR0aCBBcgorLkl0IEZsIGIgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSBibG9jayBzcGVjaWFsCitmaWxlLgorLkl0IEZsIGMgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSBjaGFyYWN0ZXIKK3NwZWNpYWwgZmlsZS4KKy5JdCBGbCBkIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5LgorLkl0IEZsIGUgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyAocmVnYXJkbGVzcyBvZiB0eXBlKS4KKy5JdCBGbCBmIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlLgorLkl0IEZsIGcgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXRzIHNldCBncm91cCBJRCBmbGFnCitpcyBzZXQuCisuSXQgRmwgaCBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIHN5bWJvbGljIGxpbmsuCisuSXQgRmwgayBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpdHMgc3RpY2t5IGJpdCBpcyBzZXQuCisuSXQgRmwgbiBBciBzdHJpbmcKK1RydWUgaWYgdGhlIGxlbmd0aCBvZgorLkFyIHN0cmluZworaXMgbm9uemVyby4KKy5JdCBGbCBwIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitpcyBhIG5hbWVkIHBpcGUKKy5QbyBUbiBGSUZPIFBjIC4KKy5JdCBGbCByIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIHJlYWRhYmxlLgorLkl0IEZsIHMgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaGFzIGEgc2l6ZSBncmVhdGVyCit0aGFuIHplcm8uCisuSXQgRmwgdCBBciBmaWxlX2Rlc2NyaXB0b3IKK1RydWUgaWYgdGhlIGZpbGUgd2hvc2UgZmlsZSBkZXNjcmlwdG9yIG51bWJlcgoraXMKKy5BciBmaWxlX2Rlc2NyaXB0b3IKK2lzIG9wZW4gYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHRlcm1pbmFsLgorLkl0IEZsIHUgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXRzIHNldCB1c2VyIElEIGZsYWcKK2lzIHNldC4KKy5JdCBGbCB3IEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIHdyaXRhYmxlLgorVHJ1ZQoraW5kaWNhdGVzIG9ubHkgdGhhdCB0aGUgd3JpdGUgZmxhZyBpcyBvbi4KK1RoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSBvbiBhIHJlYWQtb25seSBmaWxlCitzeXN0ZW0gZXZlbiBpZiB0aGlzIHRlc3QgaW5kaWNhdGVzIHRydWUuCisuSXQgRmwgeCBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBleGVjdXRhYmxlLgorVHJ1ZQoraW5kaWNhdGVzIG9ubHkgdGhhdCB0aGUgZXhlY3V0ZSBmbGFnIGlzIG9uLgorSWYKKy5BciBmaWxlCitpcyBhIGRpcmVjdG9yeSwgdHJ1ZSBpbmRpY2F0ZXMgdGhhdAorLkFyIGZpbGUKK2NhbiBiZSBzZWFyY2hlZC4KKy5JdCBGbCB6IEFyIHN0cmluZworVHJ1ZSBpZiB0aGUgbGVuZ3RoIG9mCisuQXIgc3RyaW5nCitpcyB6ZXJvLgorLkl0IEZsIEwgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSBzeW1ib2xpYyBsaW5rLgorVGhpcyBvcGVyYXRvciBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mCit0aGlzIHByb2dyYW0uCitEbyBub3QgcmVseSBvbiBpdHMgZXhpc3RlbmNlOyB1c2UKKy5GbCBoCitpbnN0ZWFkLgorLkl0IEZsIE8gQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXRzIG93bmVyIG1hdGNoZXMgdGhlIGVmZmVjdGl2ZSB1c2VyIGlkIG9mIHRoaXMgcHJvY2Vzcy4KKy5JdCBGbCBHIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBncm91cCBtYXRjaGVzIHRoZSBlZmZlY3RpdmUgZ3JvdXAgaWQgb2YgdGhpcyBwcm9jZXNzLgorLkl0IEZsIFMgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSBzb2NrZXQuCisuSXQgQXIgZmlsZTEgRmwgbnQgQXIgZmlsZTIKK1RydWUgaWYKKy5BciBmaWxlMQorZXhpc3RzIGFuZCBpcyBuZXdlciB0aGFuCisuQXIgZmlsZTIgLgorLkl0IEFyIGZpbGUxIEZsIG90IEFyIGZpbGUyCitUcnVlIGlmCisuQXIgZmlsZTEKK2V4aXN0cyBhbmQgaXMgb2xkZXIgdGhhbgorLkFyIGZpbGUyIC4KKy5JdCBBciBmaWxlMSBGbCBlZiBBciBmaWxlMgorVHJ1ZSBpZgorLkFyIGZpbGUxCithbmQKKy5BciBmaWxlMgorZXhpc3QgYW5kIHJlZmVyIHRvIHRoZSBzYW1lIGZpbGUuCisuSXQgQXIgc3RyaW5nCitUcnVlIGlmCisuQXIgc3RyaW5nCitpcyBub3QgdGhlIG51bGwKK3N0cmluZy4KKy5JdCBBciBcJnNcJjEgQ20gXCY9IEFyIFwmc1wmMgorVHJ1ZSBpZiB0aGUgc3RyaW5ncworLkFyIFwmc1wmMQorYW5kCisuQXIgXCZzXCYyCithcmUgaWRlbnRpY2FsLgorLkl0IEFyIFwmc1wmMSBDbSBcJiE9IEFyIFwmc1wmMgorVHJ1ZSBpZiB0aGUgc3RyaW5ncworLkFyIFwmc1wmMQorYW5kCisuQXIgXCZzXCYyCithcmUgbm90IGlkZW50aWNhbC4KKy5JdCBBciBcJnNcJjEgQ20gXCZcKltMdF0gQXIgXCZzXCYyCitUcnVlIGlmIHN0cmluZworLkFyIFwmc1wmMQorY29tZXMgYmVmb3JlCisuQXIgXCZzXCYyCitiYXNlZCBvbiB0aGUgQVNDSUkgdmFsdWUgb2YgdGhlaXIgY2hhcmFjdGVycy4KKy5JdCBBciBcJnNcJjEgQ20gXCZcKltHdF0gQXIgXCZzXCYyCitUcnVlIGlmIHN0cmluZworLkFyIFwmc1wmMQorY29tZXMgYWZ0ZXIKKy5BciBcJnNcJjIKK2Jhc2VkIG9uIHRoZSBBU0NJSSB2YWx1ZSBvZiB0aGVpciBjaGFyYWN0ZXJzLgorLkl0IEFyIFwmblwmMSBGbCBcJmVxIEFyIFwmblwmMgorVHJ1ZSBpZiB0aGUgaW50ZWdlcnMKKy5BciBcJm5cJjEKK2FuZAorLkFyIFwmblwmMgorYXJlIGFsZ2VicmFpY2FsbHkKK2VxdWFsLgorLkl0IEFyIFwmblwmMSBGbCBcJm5lIEFyIFwmblwmMgorVHJ1ZSBpZiB0aGUgaW50ZWdlcnMKKy5BciBcJm5cJjEKK2FuZAorLkFyIFwmblwmMgorYXJlIG5vdAorYWxnZWJyYWljYWxseSBlcXVhbC4KKy5JdCBBciBcJm5cJjEgRmwgXCZndCBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXIKKy5BciBcJm5cJjEKK2lzIGFsZ2VicmFpY2FsbHkKK2dyZWF0ZXIgdGhhbiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMiAuCisuSXQgQXIgXCZuXCYxIEZsIFwmZ2UgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYxCitpcyBhbGdlYnJhaWNhbGx5CitncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGludGVnZXIKKy5BciBcJm5cJjIgLgorLkl0IEFyIFwmblwmMSBGbCBcJmx0IEFyIFwmblwmMgorVHJ1ZSBpZiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMQoraXMgYWxnZWJyYWljYWxseSBsZXNzCit0aGFuIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYyIC4KKy5JdCBBciBcJm5cJjEgRmwgXCZsZSBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXIKKy5BciBcJm5cJjEKK2lzIGFsZ2VicmFpY2FsbHkgbGVzcwordGhhbiBvciBlcXVhbCB0byB0aGUgaW50ZWdlcgorLkFyIFwmblwmMiAuCisuRWwKKy5QcAorVGhlc2UgcHJpbWFyaWVzIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzOgorLkJsIC10YWcgLXdpZHRoIEFyCisuSXQgQ20gXCYhIEFyIGV4cHJlc3Npb24KK1RydWUgaWYKKy5BciBleHByZXNzaW9uCitpcyBmYWxzZS4KKy5JdCBBciBleHByZXNzaW9uMSBGbCBhIEFyIGV4cHJlc3Npb24yCitUcnVlIGlmIGJvdGgKKy5BciBleHByZXNzaW9uMQorYW5kCisuQXIgZXhwcmVzc2lvbjIKK2FyZSB0cnVlLgorLkl0IEFyIGV4cHJlc3Npb24xIEZsIG8gQXIgZXhwcmVzc2lvbjIKK1RydWUgaWYgZWl0aGVyCisuQXIgZXhwcmVzc2lvbjEKK29yCisuQXIgZXhwcmVzc2lvbjIKK2FyZSB0cnVlLgorLkl0IENtIFwmKCBOcyBBciBleHByZXNzaW9uIE5zIENtIFwmKQorVHJ1ZSBpZiBleHByZXNzaW9uIGlzIHRydWUuCisuRWwKKy5QcAorVGhlCisuRmwgYQorb3BlcmF0b3IgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gdGhlCisuRmwgbworb3BlcmF0b3IuCisuU2ggR1JBTU1BUiBBTUJJR1VJVFkKK1RoZQorLk5tIHRlc3QKK2dyYW1tYXIgaXMgaW5oZXJlbnRseSBhbWJpZ3VvdXMuCitJbiBvcmRlciB0byBhc3N1cmUgYSBkZWdyZWUgb2YgY29uc2lzdGVuY3ksIHRoZSBjYXNlcyBkZXNjcmliZWQgaW4KKy5TdCAtcDEwMDMuMgorc2VjdGlvbiA0LjYyLjQsCithcmUgZXZhbHVhdGVkIGNvbnNpc3RlbnRseSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiB0aGUKK3N0YW5kYXJkcyBkb2N1bWVudC4KK0FsbCBvdGhlciBjYXNlcyBhcmUgc3ViamVjdCB0byB0aGUgYW1iaWd1aXR5IGluIHRoZSBjb21tYW5kIHNlbWFudGljcy4KKy5TaCBFWElUIFNUQVRVUworVGhlCisuTm0gdGVzdAordXRpbGl0eSBleGl0cyB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IDAKK2V4cHJlc3Npb24gZXZhbHVhdGVkIHRvIHRydWUuCisuSXQgMQorZXhwcmVzc2lvbiBldmFsdWF0ZWQgdG8gZmFsc2Ugb3IgZXhwcmVzc2lvbiB3YXMKK21pc3NpbmcuCisuSXQgXCpbR3RdMQorQW4gZXJyb3Igb2NjdXJyZWQuCisuRWwKKy5TaCBTVEFOREFSRFMKK1RoZQorLk5tIHRlc3QKK3V0aWxpdHkgaW1wbGVtZW50cyBhIHN1cGVyc2V0IG9mIHRoZQorLlN0IC1wMTAwMy4yCitzcGVjaWZpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvYmx0aW4vdGVzdC5jIGIvdXNyL2Rhc2gvYmx0aW4vdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTQ5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ibHRpbi90ZXN0LmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKiB0ZXN0KDEpOyB2ZXJzaW9uIDctbGlrZSAgLS0gIGF1dGhvciBFcmlrIEJhYWxiZXJnZW4KKyAqIG1vZGlmaWVkIGJ5IEVyaWMgR2lzaW4gdG8gYmUgdXNlZCBhcyBidWlsdC1pbi4KKyAqIG1vZGlmaWVkIGJ5IEFybm9sZCBSb2JiaW5zIHRvIGFkZCBTVlIzIGNvbXBhdGliaWxpdHkKKyAqICgteCAtYyAtYiAtcCAtdSAtZyAtaykgcGx1cyBLb3JuJ3MgLUwgLW50IC1vdCAtZWYgYW5kIG5ldyAtUyAoc29ja2V0KS4KKyAqIG1vZGlmaWVkIGJ5IEouVC4gQ29ua2xpbiBmb3IgTmV0QlNELgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBpbiB0aGUgUHVibGljIERvbWFpbi4KKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJibHRpbi5oIgorCisvKiB0ZXN0KDEpIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBncmFtbWFyOgorCW9leHByCTo6PSBhZXhwciB8IGFleHByICItbyIgb2V4cHIgOworCWFleHByCTo6PSBuZXhwciB8IG5leHByICItYSIgYWV4cHIgOworCW5leHByCTo6PSBwcmltYXJ5IHwgIiEiIHByaW1hcnkKKwlwcmltYXJ5CTo6PSB1bmFyeS1vcGVyYXRvciBvcGVyYW5kCisJCXwgb3BlcmFuZCBiaW5hcnktb3BlcmF0b3Igb3BlcmFuZAorCQl8IG9wZXJhbmQKKwkJfCAiKCIgb2V4cHIgIikiCisJCTsKKwl1bmFyeS1vcGVyYXRvciA6Oj0gIi1yInwiLXcifCIteCJ8Ii1mInwiLWQifCItYyJ8Ii1iInwiLXAifAorCQkiLXUifCItZyJ8Ii1rInwiLXMifCItdCJ8Ii16InwiLW4ifCItbyJ8Ii1PInwiLUcifCItTCJ8Ii1TIjsKKworCWJpbmFyeS1vcGVyYXRvciA6Oj0gIj0ifCIhPSJ8Ii1lcSJ8Ii1uZSJ8Ii1nZSJ8Ii1ndCJ8Ii1sZSJ8Ii1sdCJ8CisJCQkiLW50InwiLW90InwiLWVmIjsKKwlvcGVyYW5kIDo6PSA8YW55IGxlZ2FsIFVOSVggZmlsZSBuYW1lPgorKi8KKworZW51bSB0b2tlbiB7CisJRU9JLAorCUZJTFJELAorCUZJTFdSLAorCUZJTEVYLAorCUZJTEVYSVNULAorCUZJTFJFRywKKwlGSUxESVIsCisJRklMQ0RFViwKKwlGSUxCREVWLAorCUZJTEZJRk8sCisJRklMU09DSywKKwlGSUxTWU0sCisJRklMR1osCisJRklMVFQsCisJRklMU1VJRCwKKwlGSUxTR0lELAorCUZJTFNUQ0ssCisJRklMTlQsCisJRklMT1QsCisJRklMRVEsCisJRklMVUlELAorCUZJTEdJRCwKKwlTVFJFWiwKKwlTVFJOWiwKKwlTVFJFUSwKKwlTVFJORSwKKwlTVFJMVCwKKwlTVFJHVCwKKwlJTlRFUSwKKwlJTlRORSwKKwlJTlRHRSwKKwlJTlRHVCwKKwlJTlRMRSwKKwlJTlRMVCwKKwlVTk9ULAorCUJBTkQsCisJQk9SLAorCUxQQVJFTiwKKwlSUEFSRU4sCisJT1BFUkFORAorfTsKKworZW51bSB0b2tlbl90eXBlcyB7CisJVU5PUCwKKwlCSU5PUCwKKwlCVU5PUCwKKwlCQklOT1AsCisJUEFSRU4KK307CisKK3N0YXRpYyBzdHJ1Y3QgdF9vcCB7CisJY29uc3QgY2hhciAqb3BfdGV4dDsKKwlzaG9ydCBvcF9udW0sIG9wX3R5cGU7Cit9IGNvbnN0IG9wcyBbXSA9IHsKKwl7Ii1yIiwJRklMUkQsCVVOT1B9LAorCXsiLXciLAlGSUxXUiwJVU5PUH0sCisJeyIteCIsCUZJTEVYLAlVTk9QfSwKKwl7Ii1lIiwJRklMRVhJU1QsVU5PUH0sCisJeyItZiIsCUZJTFJFRywJVU5PUH0sCisJeyItZCIsCUZJTERJUiwJVU5PUH0sCisJeyItYyIsCUZJTENERVYsVU5PUH0sCisJeyItYiIsCUZJTEJERVYsVU5PUH0sCisJeyItcCIsCUZJTEZJRk8sVU5PUH0sCisJeyItdSIsCUZJTFNVSUQsVU5PUH0sCisJeyItZyIsCUZJTFNHSUQsVU5PUH0sCisJeyItayIsCUZJTFNUQ0ssVU5PUH0sCisJeyItcyIsCUZJTEdaLAlVTk9QfSwKKwl7Ii10IiwJRklMVFQsCVVOT1B9LAorCXsiLXoiLAlTVFJFWiwJVU5PUH0sCisJeyItbiIsCVNUUk5aLAlVTk9QfSwKKwl7Ii1oIiwJRklMU1lNLAlVTk9QfSwJCS8qIGZvciBiYWNrd2FyZHMgY29tcGF0ICovCisJeyItTyIsCUZJTFVJRCwJVU5PUH0sCisJeyItRyIsCUZJTEdJRCwJVU5PUH0sCisJeyItTCIsCUZJTFNZTSwJVU5PUH0sCisJeyItUyIsCUZJTFNPQ0ssVU5PUH0sCisJeyI9IiwJU1RSRVEsCUJJTk9QfSwKKwl7IiE9IiwJU1RSTkUsCUJJTk9QfSwKKwl7IjwiLAlTVFJMVCwJQklOT1B9LAorCXsiPiIsCVNUUkdULAlCSU5PUH0sCisJeyItZXEiLAlJTlRFUSwJQklOT1B9LAorCXsiLW5lIiwJSU5UTkUsCUJJTk9QfSwKKwl7Ii1nZSIsCUlOVEdFLAlCSU5PUH0sCisJeyItZ3QiLAlJTlRHVCwJQklOT1B9LAorCXsiLWxlIiwJSU5UTEUsCUJJTk9QfSwKKwl7Ii1sdCIsCUlOVExULAlCSU5PUH0sCisJeyItbnQiLAlGSUxOVCwJQklOT1B9LAorCXsiLW90IiwJRklMT1QsCUJJTk9QfSwKKwl7Ii1lZiIsCUZJTEVRLAlCSU5PUH0sCisJeyIhIiwJVU5PVCwJQlVOT1B9LAorCXsiLWEiLAlCQU5ELAlCQklOT1B9LAorCXsiLW8iLAlCT1IsCUJCSU5PUH0sCisJeyIoIiwJTFBBUkVOLAlQQVJFTn0sCisJeyIpIiwJUlBBUkVOLAlQQVJFTn0sCisJezAsCTAsCTB9Cit9OworCitzdGF0aWMgY2hhciAqKnRfd3A7CitzdGF0aWMgc3RydWN0IHRfb3AgY29uc3QgKnRfd3Bfb3A7CisKK3N0YXRpYyB2b2lkIHN5bnRheChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IG9leHByKGVudW0gdG9rZW4pOworc3RhdGljIGludCBhZXhwcihlbnVtIHRva2VuKTsKK3N0YXRpYyBpbnQgbmV4cHIoZW51bSB0b2tlbik7CitzdGF0aWMgaW50IHByaW1hcnkoZW51bSB0b2tlbik7CitzdGF0aWMgaW50IGJpbm9wKHZvaWQpOworc3RhdGljIGludCBmaWxzdGF0KGNoYXIgKiwgZW51bSB0b2tlbik7CitzdGF0aWMgZW51bSB0b2tlbiB0X2xleChjaGFyICopOworc3RhdGljIGludCBpc29wZXJhbmQodm9pZCk7CitzdGF0aWMgaW50IGdldG4oY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgbmV3ZXJmKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgb2xkZXJmKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgZXF1YWxmKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgdGVzdF9zdF9tb2RlKGNvbnN0IHN0cnVjdCBzdGF0NjQgKiwgaW50KTsKK3N0YXRpYyBpbnQgYmFzaF9ncm91cF9tZW1iZXIoZ2lkX3QpOworCitpbnQKK3Rlc3RjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByZXM7CisKKwlpZiAoc3RyY21wKGFyZ3ZbMF0sICJbIikgPT0gMCkgeworCQlpZiAoc3RyY21wKGFyZ3ZbLS1hcmdjXSwgIl0iKSkKKwkJCWVycm9yKCJtaXNzaW5nIF0iKTsKKwkJYXJndlthcmdjXSA9IE5VTEw7CisJfQorCisJaWYgKGFyZ2MgPCAyKQorCQlyZXR1cm4gMTsKKworCXRfd3AgPSAmYXJndlsxXTsKKwlyZXMgPSAhb2V4cHIodF9sZXgoKnRfd3ApKTsKKworCWlmICgqdF93cCAhPSBOVUxMICYmICorK3Rfd3AgIT0gTlVMTCkKKwkJc3ludGF4KCp0X3dwLCAidW5leHBlY3RlZCBvcGVyYXRvciIpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK3N5bnRheChjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqbXNnKQoreworCWlmIChvcCAmJiAqb3ApCisJCWVycm9yKCIlczogJXMiLCBvcCwgbXNnKTsKKwllbHNlCisJCWVycm9yKCIlcyIsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQKK29leHByKGVudW0gdG9rZW4gbikKK3sKKwlpbnQgcmVzOworCisJcmVzID0gYWV4cHIobik7CisJaWYgKHRfbGV4KCorK3Rfd3ApID09IEJPUikKKwkJcmV0dXJuIG9leHByKHRfbGV4KCorK3Rfd3ApKSB8fCByZXM7CisJdF93cC0tOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK2FleHByKGVudW0gdG9rZW4gbikKK3sKKwlpbnQgcmVzOworCisJcmVzID0gbmV4cHIobik7CisJaWYgKHRfbGV4KCorK3Rfd3ApID09IEJBTkQpCisJCXJldHVybiBhZXhwcih0X2xleCgqKyt0X3dwKSkgJiYgcmVzOworCXRfd3AtLTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CituZXhwcihlbnVtIHRva2VuIG4pCit7CisJaWYgKG4gPT0gVU5PVCkKKwkJcmV0dXJuICFuZXhwcih0X2xleCgqKyt0X3dwKSk7CisJcmV0dXJuIHByaW1hcnkobik7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW1hcnkoZW51bSB0b2tlbiBuKQoreworCWVudW0gdG9rZW4gbm47CisJaW50IHJlczsKKworCWlmIChuID09IEVPSSkKKwkJcmV0dXJuIDA7CQkvKiBtaXNzaW5nIGV4cHJlc3Npb24gKi8KKwlpZiAobiA9PSBMUEFSRU4pIHsKKwkJaWYgKChubiA9IHRfbGV4KCorK3Rfd3ApKSA9PSBSUEFSRU4pCisJCQlyZXR1cm4gMDsJLyogbWlzc2luZyBleHByZXNzaW9uICovCisJCXJlcyA9IG9leHByKG5uKTsKKwkJaWYgKHRfbGV4KCorK3Rfd3ApICE9IFJQQVJFTikKKwkJCXN5bnRheChOVUxMLCAiY2xvc2luZyBwYXJlbiBleHBlY3RlZCIpOworCQlyZXR1cm4gcmVzOworCX0KKwlpZiAodF93cF9vcCAmJiB0X3dwX29wLT5vcF90eXBlID09IFVOT1ApIHsKKwkJLyogdW5hcnkgZXhwcmVzc2lvbiAqLworCQlpZiAoKisrdF93cCA9PSBOVUxMKQorCQkJc3ludGF4KHRfd3Bfb3AtPm9wX3RleHQsICJhcmd1bWVudCBleHBlY3RlZCIpOworCQlzd2l0Y2ggKG4pIHsKKwkJY2FzZSBTVFJFWjoKKwkJCXJldHVybiBzdHJsZW4oKnRfd3ApID09IDA7CisJCWNhc2UgU1RSTlo6CisJCQlyZXR1cm4gc3RybGVuKCp0X3dwKSAhPSAwOworCQljYXNlIEZJTFRUOgorCQkJcmV0dXJuIGlzYXR0eShnZXRuKCp0X3dwKSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmlsc3RhdCgqdF93cCwgbik7CisJCX0KKwl9CisKKwlpZiAodF9sZXgodF93cFsxXSksIHRfd3Bfb3AgJiYgdF93cF9vcC0+b3BfdHlwZSA9PSBCSU5PUCkgeworCQlyZXR1cm4gYmlub3AoKTsKKwl9CisKKwlyZXR1cm4gc3RybGVuKCp0X3dwKSA+IDA7Cit9CisKK3N0YXRpYyBpbnQKK2Jpbm9wKHZvaWQpCit7CisJY29uc3QgY2hhciAqb3BuZDEsICpvcG5kMjsKKwlzdHJ1Y3QgdF9vcCBjb25zdCAqb3A7CisKKwlvcG5kMSA9ICp0X3dwOworCSh2b2lkKSB0X2xleCgqKyt0X3dwKTsKKwlvcCA9IHRfd3Bfb3A7CisKKwlpZiAoKG9wbmQyID0gKisrdF93cCkgPT0gKGNoYXIgKikwKQorCQlzeW50YXgob3AtPm9wX3RleHQsICJhcmd1bWVudCBleHBlY3RlZCIpOworCisJc3dpdGNoIChvcC0+b3BfbnVtKSB7CisJZGVmYXVsdDoKKyNpZmRlZiBERUJVRworCQlhYm9ydCgpOworCQkvKiBOT1RSRUFDSEVEICovCisjZW5kaWYKKwljYXNlIFNUUkVROgorCQlyZXR1cm4gc3RyY21wKG9wbmQxLCBvcG5kMikgPT0gMDsKKwljYXNlIFNUUk5FOgorCQlyZXR1cm4gc3RyY21wKG9wbmQxLCBvcG5kMikgIT0gMDsKKwljYXNlIFNUUkxUOgorCQlyZXR1cm4gc3RyY21wKG9wbmQxLCBvcG5kMikgPCAwOworCWNhc2UgU1RSR1Q6CisJCXJldHVybiBzdHJjbXAob3BuZDEsIG9wbmQyKSA+IDA7CisJY2FzZSBJTlRFUToKKwkJcmV0dXJuIGdldG4ob3BuZDEpID09IGdldG4ob3BuZDIpOworCWNhc2UgSU5UTkU6CisJCXJldHVybiBnZXRuKG9wbmQxKSAhPSBnZXRuKG9wbmQyKTsKKwljYXNlIElOVEdFOgorCQlyZXR1cm4gZ2V0bihvcG5kMSkgPj0gZ2V0bihvcG5kMik7CisJY2FzZSBJTlRHVDoKKwkJcmV0dXJuIGdldG4ob3BuZDEpID4gZ2V0bihvcG5kMik7CisJY2FzZSBJTlRMRToKKwkJcmV0dXJuIGdldG4ob3BuZDEpIDw9IGdldG4ob3BuZDIpOworCWNhc2UgSU5UTFQ6CisJCXJldHVybiBnZXRuKG9wbmQxKSA8IGdldG4ob3BuZDIpOworCWNhc2UgRklMTlQ6CisJCXJldHVybiBuZXdlcmYgKG9wbmQxLCBvcG5kMik7CisJY2FzZSBGSUxPVDoKKwkJcmV0dXJuIG9sZGVyZiAob3BuZDEsIG9wbmQyKTsKKwljYXNlIEZJTEVROgorCQlyZXR1cm4gZXF1YWxmIChvcG5kMSwgb3BuZDIpOworCX0KK30KKworc3RhdGljIGludAorZmlsc3RhdChjaGFyICpubSwgZW51bSB0b2tlbiBtb2RlKQoreworCXN0cnVjdCBzdGF0NjQgczsKKworCWlmIChtb2RlID09IEZJTFNZTSA/IGxzdGF0NjQobm0sICZzKSA6IHN0YXQ2NChubSwgJnMpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgRklMUkQ6CisJCXJldHVybiB0ZXN0X3N0X21vZGUoJnMsIFJfT0spOworCWNhc2UgRklMV1I6CisJCXJldHVybiB0ZXN0X3N0X21vZGUoJnMsIFdfT0spOworCWNhc2UgRklMRVg6CisJCXJldHVybiB0ZXN0X3N0X21vZGUoJnMsIFhfT0spOworCWNhc2UgRklMRVhJU1Q6CisJCXJldHVybiAxOworCWNhc2UgRklMUkVHOgorCQlyZXR1cm4gU19JU1JFRyhzLnN0X21vZGUpOworCWNhc2UgRklMRElSOgorCQlyZXR1cm4gU19JU0RJUihzLnN0X21vZGUpOworCWNhc2UgRklMQ0RFVjoKKwkJcmV0dXJuIFNfSVNDSFIocy5zdF9tb2RlKTsKKwljYXNlIEZJTEJERVY6CisJCXJldHVybiBTX0lTQkxLKHMuc3RfbW9kZSk7CisJY2FzZSBGSUxGSUZPOgorCQlyZXR1cm4gU19JU0ZJRk8ocy5zdF9tb2RlKTsKKwljYXNlIEZJTFNPQ0s6CisJCXJldHVybiBTX0lTU09DSyhzLnN0X21vZGUpOworCWNhc2UgRklMU1lNOgorCQlyZXR1cm4gU19JU0xOSyhzLnN0X21vZGUpOworCWNhc2UgRklMU1VJRDoKKwkJcmV0dXJuIChzLnN0X21vZGUgJiBTX0lTVUlEKSAhPSAwOworCWNhc2UgRklMU0dJRDoKKwkJcmV0dXJuIChzLnN0X21vZGUgJiBTX0lTR0lEKSAhPSAwOworCWNhc2UgRklMU1RDSzoKKwkJcmV0dXJuIChzLnN0X21vZGUgJiBTX0lTVlRYKSAhPSAwOworCWNhc2UgRklMR1o6CisJCXJldHVybiAhIXMuc3Rfc2l6ZTsKKwljYXNlIEZJTFVJRDoKKwkJcmV0dXJuIHMuc3RfdWlkID09IGdldGV1aWQoKTsKKwljYXNlIEZJTEdJRDoKKwkJcmV0dXJuIHMuc3RfZ2lkID09IGdldGVnaWQoKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyBlbnVtIHRva2VuCit0X2xleChjaGFyICpzKQoreworCXN0cnVjdCB0X29wIGNvbnN0ICpvcDsKKworCW9wID0gb3BzOworCisJaWYgKHMgPT0gMCkgeworCQl0X3dwX29wID0gKHN0cnVjdCB0X29wICopMDsKKwkJcmV0dXJuIEVPSTsKKwl9CisJd2hpbGUgKG9wLT5vcF90ZXh0KSB7CisJCWlmIChzdHJjbXAocywgb3AtPm9wX3RleHQpID09IDApIHsKKwkJCWlmICgob3AtPm9wX3R5cGUgPT0gVU5PUCAmJiBpc29wZXJhbmQoKSkgfHwKKwkJCSAgICAob3AtPm9wX251bSA9PSBMUEFSRU4gJiYgKih0X3dwKzEpID09IDApKQorCQkJCWJyZWFrOworCQkJdF93cF9vcCA9IG9wOworCQkJcmV0dXJuIG9wLT5vcF9udW07CisJCX0KKwkJb3ArKzsKKwl9CisJdF93cF9vcCA9IChzdHJ1Y3QgdF9vcCAqKTA7CisJcmV0dXJuIE9QRVJBTkQ7Cit9CisKK3N0YXRpYyBpbnQKK2lzb3BlcmFuZCh2b2lkKQoreworCXN0cnVjdCB0X29wIGNvbnN0ICpvcDsKKwljaGFyICpzLCAqdDsKKworCW9wID0gb3BzOworCWlmICgocyAgPSAqKHRfd3ArMSkpID09IDApCisJCXJldHVybiAxOworCWlmICgodCA9ICoodF93cCsyKSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKG9wLT5vcF90ZXh0KSB7CisJCWlmIChzdHJjbXAocywgb3AtPm9wX3RleHQpID09IDApCisJICAgIAkJcmV0dXJuIG9wLT5vcF90eXBlID09IEJJTk9QICYmCisJICAgIAkJICAgICh0WzBdICE9ICcpJyB8fCB0WzFdICE9ICdcMCcpOworCQlvcCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogYXRvaSB3aXRoIGVycm9yIGRldGVjdGlvbiAqLworc3RhdGljIGludAorZ2V0bihjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnA7CisJbG9uZyByOworCisJZXJybm8gPSAwOworCXIgPSBzdHJ0b2wocywgJnAsIDEwKTsKKworCWlmIChlcnJubyAhPSAwKQorCSAgICAgIGVycm9yKCIlczogb3V0IG9mIHJhbmdlIiwgcyk7CisKKwl3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcCkpCisJICAgICAgcCsrOworCisJaWYgKCpwKQorCSAgICAgIGVycm9yKCIlczogYmFkIG51bWJlciIsIHMpOworCisJcmV0dXJuIChpbnQpIHI7Cit9CisKK3N0YXRpYyBpbnQKK25ld2VyZiAoY29uc3QgY2hhciAqZjEsIGNvbnN0IGNoYXIgKmYyKQoreworCXN0cnVjdCBzdGF0IGIxLCBiMjsKKworCXJldHVybiAoc3RhdCAoZjEsICZiMSkgPT0gMCAmJgorCQlzdGF0IChmMiwgJmIyKSA9PSAwICYmCisJCWIxLnN0X210aW1lID4gYjIuc3RfbXRpbWUpOworfQorCitzdGF0aWMgaW50CitvbGRlcmYgKGNvbnN0IGNoYXIgKmYxLCBjb25zdCBjaGFyICpmMikKK3sKKwlzdHJ1Y3Qgc3RhdCBiMSwgYjI7CisKKwlyZXR1cm4gKHN0YXQgKGYxLCAmYjEpID09IDAgJiYKKwkJc3RhdCAoZjIsICZiMikgPT0gMCAmJgorCQliMS5zdF9tdGltZSA8IGIyLnN0X210aW1lKTsKK30KKworc3RhdGljIGludAorZXF1YWxmIChjb25zdCBjaGFyICpmMSwgY29uc3QgY2hhciAqZjIpCit7CisJc3RydWN0IHN0YXQgYjEsIGIyOworCisJcmV0dXJuIChzdGF0IChmMSwgJmIxKSA9PSAwICYmCisJCXN0YXQgKGYyLCAmYjIpID09IDAgJiYKKwkJYjEuc3RfZGV2ID09IGIyLnN0X2RldiAmJgorCQliMS5zdF9pbm8gPT0gYjIuc3RfaW5vKTsKK30KKworLyoKKyAqIFNpbWlsYXIgdG8gd2hhdCBhY2Nlc3MoMikgZG9lcywgYnV0IHVzZXMgdGhlIGVmZmVjdGl2ZSB1aWQgYW5kIGdpZC4KKyAqIERvZXNuJ3QgbWFrZSB0aGUgbWlzdGFrZSBvZiB0ZWxsaW5nIHJvb3QgdGhhdCBhbnkgZmlsZSBpcyBleGVjdXRhYmxlLgorICogUmV0dXJucyBub24temVybyBpZiB0aGUgZmlsZSBpcyBhY2Nlc3NpYmxlLgorICovCitzdGF0aWMgaW50Cit0ZXN0X3N0X21vZGUoY29uc3Qgc3RydWN0IHN0YXQ2NCAqc3QsIGludCBtb2RlKQoreworCWludCBldWlkID0gZ2V0ZXVpZCgpOworCisJaWYgKGV1aWQgPT0gMCkgeworCQkvKiBSb290IGNhbiByZWFkIG9yIHdyaXRlIGFueSBmaWxlLiAqLworCQlpZiAobW9kZSAhPSBYX09LKQorCQkJcmV0dXJuIDE7CisKKwkJLyogUm9vdCBjYW4gZXhlY3V0ZSBhbnkgZmlsZSB0aGF0IGhhcyBhbnkgb25lIG9mIHRoZSBleGVjdXRlCisJCSAgIGJpdHMgc2V0LiAqLworCQltb2RlID0gU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIOworCX0gZWxzZSBpZiAoc3QtPnN0X3VpZCA9PSBldWlkKQorCQltb2RlIDw8PSA2OworCWVsc2UgaWYgKGJhc2hfZ3JvdXBfbWVtYmVyKHN0LT5zdF9naWQpKQorCQltb2RlIDw8PSAzOworCisJcmV0dXJuIHN0LT5zdF9tb2RlICYgbW9kZTsKK30KKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIEdJRCBpcyBvbmUgdGhhdCB3ZSBoYXZlIGluIG91ciBncm91cHMgbGlzdC4gKi8KK3N0YXRpYyBpbnQKK2Jhc2hfZ3JvdXBfbWVtYmVyKGdpZF90IGdpZCkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlnaWRfdCAqZ3JvdXBfYXJyYXk7CisJaW50IG5ncm91cHM7CisKKwkvKiBTaG9ydC1jaXJjdWl0IGlmIHBvc3NpYmxlLCBtYXliZSBzYXZpbmcgYSBjYWxsIHRvIGdldGdyb3VwcygpLiAqLworCWlmIChnaWQgPT0gZ2V0Z2lkKCkgfHwgZ2lkID09IGdldGVnaWQoKSkKKwkJcmV0dXJuICgxKTsKKworCW5ncm91cHMgPSBnZXRncm91cHMoMCwgTlVMTCk7CisJZ3JvdXBfYXJyYXkgPSBzdGFsbG9jKG5ncm91cHMgKiBzaXplb2YoZ2lkX3QpKTsKKwlnZXRncm91cHMobmdyb3VwcywgZ3JvdXBfYXJyYXkpOworCisJLyogU2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgbG9va2luZyBmb3IgR0lELiAqLworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspCisJCWlmIChnaWQgPT0gZ3JvdXBfYXJyYXlbaV0pCisJCQlyZXR1cm4gKDEpOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2J1aWx0aW5zLmRlZi5pbiBiL3Vzci9kYXNoL2J1aWx0aW5zLmRlZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmI2OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvYnVpbHRpbnMuZGVmLmluCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylidWlsdGlucy5kZWYJOC40IChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBsaXN0cyBhbGwgdGhlIGJ1aWx0aW4gY29tbWFuZHMuICBUaGUgZmlyc3QgY29sdW1uIGlzIHRoZSBuYW1lCisgKiBvZiBhIEMgcm91dGluZS4KKyAqIFRoZSAtYSBmbGFnIHNwZWNpZmllcyB0aGF0IHRoaXMgaXMgYSBwb3NpeCAnYXNzaWdubWVudCBidWlsdGluJyBjb21tYW5kLgorICogVGhlIC1zIGZsYWcgc3BlY2lmaWVzIHRoYXQgdGhpcyBpcyBhIHBvc2l4ICdzcGVjaWFsIGJ1aWx0aW4nIGNvbW1hbmQuCisgKiBUaGUgLXUgZmxhZyBzcGVjaWZpZXMgdGhhdCB0aGlzIGlzIGEgcG9zaXggJ3N0YW5kYXJkIHV0aWxpdHknLgorICogVGhlIHJlc3Qgb2YgdGhlIGxpbmUgc3BlY2lmaWVzIHRoZSBjb21tYW5kIG5hbWUgb3IgbmFtZXMgdXNlZCB0byBydW4KKyAqIHRoZSBjb21tYW5kLgorICovCisKKyNpZm5kZWYgSk9CUworI2RlZmluZSBKT0JTIDEKKyNlbmRpZgorCisjaWYgSk9CUworYmdjbWQJCS11IGJnCitmZ2NtZAkJLXUgZmcKKyNlbmRpZgorCisjaWZuZGVmIFNNQUxMCitoaXN0Y21kCQktdSBmYworI2VuZGlmCisKK2JyZWFrY21kCS1zIGJyZWFrIC1zIGNvbnRpbnVlCitjZGNtZAkJLXUgY2QgY2hkaXIKK2NvbW1hbmRjbWQJLXUgY29tbWFuZAorZG90Y21kCQktcyAuCitlY2hvY21kCQllY2hvCitldmFsY21kCQktcyBldmFsCitleGVjY21kCQktcyBleGVjCitleGl0Y21kCQktcyBleGl0CitleHBvcnRjbWQJLWFzIGV4cG9ydCAtYXMgcmVhZG9ubHkKK2ZhbHNlY21kCS11IGZhbHNlCitnZXRvcHRzY21kCS11IGdldG9wdHMKK2hhc2hjbWQJCWhhc2gKK2pvYnNjbWQJCS11IGpvYnMKK2xvY2FsY21kCS1hIGxvY2FsCitwcmludGZjbWQJcHJpbnRmCitwd2RjbWQJCXB3ZAorcmVhZGNtZAkJLXUgcmVhZAorcmV0dXJuY21kCS1zIHJldHVybgorc2V0Y21kCQktcyBzZXQKK3NoaWZ0Y21kCS1zIHNoaWZ0Cit0cmFwY21kCQktcyB0cmFwCit0cnVlY21kCQktcyA6IC11IHRydWUKK3R5cGVjbWQJCXR5cGUKK3VtYXNrY21kCS11IHVtYXNrCit1bmFsaWFzY21kCS11IHVuYWxpYXMKK3Vuc2V0Y21kCS1zIHVuc2V0Cit3YWl0Y21kCQktdSB3YWl0CithbGlhc2NtZAktYXUgYWxpYXMKKyNpZmRlZiBIQVZFX0dFVFJMSU1JVAordWxpbWl0Y21kCXVsaW1pdAorI2VuZGlmCit0ZXN0Y21kCQl0ZXN0IFsKK2tpbGxjbWQJCS11IGtpbGwKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2NkLmMgYi91c3IvZGFzaC9jZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzM5M2YKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9jZC5jCkBAIC0wLDAgKzEsMzA0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qCisgKiBUaGUgY2QgYW5kIHB3ZCBjb21tYW5kcy4KKyAqLworCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJub2Rlcy5oIgkvKiBmb3Igam9icy5oICovCisjaW5jbHVkZSAiam9icy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAiZXhlYy5oIgorI2luY2x1ZGUgInJlZGlyLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAiY2QuaCIKKworI2RlZmluZSBDRF9QSFlTSUNBTCAxCisjZGVmaW5lIENEX1BSSU5UIDIKKworU1RBVElDIGludCBkb2NkKGNvbnN0IGNoYXIgKiwgaW50KTsKK1NUQVRJQyBjb25zdCBjaGFyICp1cGRhdGVwd2QoY29uc3QgY2hhciAqKTsKK1NUQVRJQyBjaGFyICpnZXRwd2Qodm9pZCk7CitTVEFUSUMgaW50IGNkb3B0KHZvaWQpOworCitTVEFUSUMgY2hhciAqY3VyZGlyID0gbnVsbHN0cjsJCS8qIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KK1NUQVRJQyBjaGFyICpwaHlzZGlyID0gbnVsbHN0cjsJCS8qIHBoeXNpY2FsIHdvcmtpbmcgZGlyZWN0b3J5ICovCisKK1NUQVRJQyBpbnQKK2Nkb3B0KCkKK3sKKwlpbnQgZmxhZ3MgPSAwOworCWludCBpLCBqOworCisJaiA9ICdMJzsKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJMUCIpKSkgeworCQlpZiAoaSAhPSBqKSB7CisJCQlmbGFncyBePSBDRF9QSFlTSUNBTDsKKwkJCWogPSBpOworCQl9CisJfQorCisJcmV0dXJuIGZsYWdzOworfQorCitpbnQKK2NkY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpkZXN0OworCWNvbnN0IGNoYXIgKnBhdGg7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIGM7CisJc3RydWN0IHN0YXQgc3RhdGI7CisJaW50IGZsYWdzOworCisJZmxhZ3MgPSBjZG9wdCgpOworCWRlc3QgPSAqYXJncHRyOworCWlmICghZGVzdCkKKwkJZGVzdCA9IGJsdGlubG9va3VwKGhvbWVzdHIpOworCWVsc2UgaWYgKGRlc3RbMF0gPT0gJy0nICYmIGRlc3RbMV0gPT0gJ1wwJykgeworCQlkZXN0ID0gYmx0aW5sb29rdXAoIk9MRFBXRCIpOworCQlmbGFncyB8PSBDRF9QUklOVDsKKwl9CisJaWYgKCFkZXN0KQorCQlkZXN0ID0gbnVsbHN0cjsKKwlpZiAoKmRlc3QgPT0gJy8nKQorCQlnb3RvIHN0ZXA3OworCWlmICgqZGVzdCA9PSAnLicpIHsKKwkJYyA9IGRlc3RbMV07Citkb3Rkb3Q6CisJCXN3aXRjaCAoYykgeworCQljYXNlICdcMCc6CisJCWNhc2UgJy8nOgorCQkJZ290byBzdGVwNjsKKwkJY2FzZSAnLic6CisJCQljID0gZGVzdFsyXTsKKwkJCWlmIChjICE9ICcuJykKKwkJCQlnb3RvIGRvdGRvdDsKKwkJfQorCX0KKwlpZiAoISpkZXN0KQorCQlkZXN0ID0gIi4iOworCWlmICghKHBhdGggPSBibHRpbmxvb2t1cCgiQ0RQQVRIIikpKSB7CitzdGVwNjoKK3N0ZXA3OgorCQlwID0gZGVzdDsKKwkJZ290byBkb2NkOworCX0KKwlkbyB7CisJCWMgPSAqcGF0aDsKKwkJcCA9IHBhZHZhbmNlKCZwYXRoLCBkZXN0KTsKKwkJaWYgKHN0YXQocCwgJnN0YXRiKSA+PSAwICYmIFNfSVNESVIoc3RhdGIuc3RfbW9kZSkpIHsKKwkJCWlmIChjICYmIGMgIT0gJzonKQorCQkJCWZsYWdzIHw9IENEX1BSSU5UOworZG9jZDoKKwkJCWlmICghZG9jZChwLCBmbGFncykpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHBhdGgpOworCXNoX2Vycm9yKCJjYW4ndCBjZCB0byAlcyIsIGRlc3QpOworCS8qIE5PVFJFQUNIRUQgKi8KK291dDoKKwlpZiAoZmxhZ3MgJiBDRF9QUklOVCkKKwkJb3V0MWZtdChzbmxmbXQsIGN1cmRpcik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEFjdHVhbGx5IGRvIHRoZSBjaGRpci4gIFdlIGFsc28gY2FsbCBoYXNoY2QgdG8gbGV0IHRoZSByb3V0aW5lcyBpbiBleGVjLmMKKyAqIGtub3cgdGhhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaGFzIGNoYW5nZWQuCisgKi8KKworU1RBVElDIGludAorZG9jZChjb25zdCBjaGFyICpkZXN0LCBpbnQgZmxhZ3MpCit7CisJY29uc3QgY2hhciAqZGlyID0gMDsKKwlpbnQgZXJyOworCisJVFJBQ0UoKCJkb2NkKFwiJXNcIiwgJWQpIGNhbGxlZFxuIiwgZGVzdCwgZmxhZ3MpKTsKKworCUlOVE9GRjsKKwlpZiAoIShmbGFncyAmIENEX1BIWVNJQ0FMKSkgeworCQlkaXIgPSB1cGRhdGVwd2QoZGVzdCk7CisJCWlmIChkaXIpCisJCQlkZXN0ID0gZGlyOworCX0KKwllcnIgPSBjaGRpcihkZXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlzZXRwd2QoZGlyLCAxKTsKKwloYXNoY2QoKTsKK291dDoKKwlJTlRPTjsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBVcGRhdGUgY3VyZGlyICh0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkpIGluIHJlc3BvbnNlIHRvIGEKKyAqIGNkIGNvbW1hbmQuCisgKi8KKworU1RBVElDIGNvbnN0IGNoYXIgKgordXBkYXRlcHdkKGNvbnN0IGNoYXIgKmRpcikKK3sKKwljaGFyICpuZXc7CisJY2hhciAqcDsKKwljaGFyICpjZGNvbXBwYXRoOworCWNvbnN0IGNoYXIgKmxpbTsKKworCWNkY29tcHBhdGggPSBzc3RyZHVwKGRpcik7CisJU1RBUlRTVEFDS1NUUihuZXcpOworCWlmICgqZGlyICE9ICcvJykgeworCQlpZiAoY3VyZGlyID09IG51bGxzdHIpCisJCQlyZXR1cm4gMDsKKwkJbmV3ID0gc3RwdXRzKGN1cmRpciwgbmV3KTsKKwl9CisJbmV3ID0gbWFrZXN0cnNwYWNlKHN0cmxlbihkaXIpICsgMiwgbmV3KTsKKwlsaW0gPSBzdGFja2Jsb2NrKCkgKyAxOworCWlmICgqZGlyICE9ICcvJykgeworCQlpZiAobmV3Wy0xXSAhPSAnLycpCisJCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJaWYgKG5ldyA+IGxpbSAmJiAqbGltID09ICcvJykKKwkJCWxpbSsrOworCX0gZWxzZSB7CisJCVVTVFBVVEMoJy8nLCBuZXcpOworCQljZGNvbXBwYXRoKys7CisJCWlmIChkaXJbMV0gPT0gJy8nICYmIGRpclsyXSAhPSAnLycpIHsKKwkJCVVTVFBVVEMoJy8nLCBuZXcpOworCQkJY2Rjb21wcGF0aCsrOworCQkJbGltKys7CisJCX0KKwl9CisJcCA9IHN0cnRvayhjZGNvbXBwYXRoLCAiLyIpOworCXdoaWxlIChwKSB7CisJCXN3aXRjaCgqcCkgeworCQljYXNlICcuJzoKKwkJCWlmIChwWzFdID09ICcuJyAmJiBwWzJdID09ICdcMCcpIHsKKwkJCQl3aGlsZSAobmV3ID4gbGltKSB7CisJCQkJCVNUVU5QVVRDKG5ldyk7CisJCQkJCWlmIChuZXdbLTFdID09ICcvJykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocFsxXSA9PSAnXDAnKQorCQkJCWJyZWFrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQluZXcgPSBzdHB1dHMocCwgbmV3KTsKKwkJCVVTVFBVVEMoJy8nLCBuZXcpOworCQl9CisJCXAgPSBzdHJ0b2soMCwgIi8iKTsKKwl9CisJaWYgKG5ldyA+IGxpbSkKKwkJU1RVTlBVVEMobmV3KTsKKwkqbmV3ID0gMDsKKwlyZXR1cm4gc3RhY2tibG9jaygpOworfQorCisKKyNkZWZpbmUgTUFYUFdEIDI1NgorCisvKgorICogRmluZCBvdXQgd2hhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMuIElmIHdlIGFscmVhZHkga25vdyB0aGUgY3VycmVudAorICogZGlyZWN0b3J5LCB0aGlzIHJvdXRpbmUgcmV0dXJucyBpbW1lZGlhdGVseS4KKyAqLworaW5saW5lCitTVEFUSUMgY2hhciAqCitnZXRwd2QoKQoreworCWNoYXIgYnVmW1BBVEhfTUFYXTsKKwljaGFyICpkaXIgPSBnZXRjd2QoYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0dXJuIGRpciA/IHNhdmVzdHIoZGlyKSA6IG51bGxzdHI7Cit9CisKK2ludAorcHdkY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmxhZ3M7CisJY29uc3QgY2hhciAqZGlyID0gY3VyZGlyOworCisJZmxhZ3MgPSBjZG9wdCgpOworCWlmIChmbGFncykgeworCQlpZiAocGh5c2RpciA9PSBudWxsc3RyKQorCQkJc2V0cHdkKGRpciwgMCk7CisJCWRpciA9IHBoeXNkaXI7CisJfQorCW91dDFmbXQoc25sZm10LCBkaXIpOworCXJldHVybiAwOworfQorCit2b2lkCitzZXRwd2QoY29uc3QgY2hhciAqdmFsLCBpbnQgc2V0b2xkKQoreworCWNoYXIgKm9sZGN1ciwgKmRpcjsKKworCW9sZGN1ciA9IGRpciA9IGN1cmRpcjsKKworCWlmIChzZXRvbGQpIHsKKwkJc2V0dmFyKCJPTERQV0QiLCBvbGRjdXIsIFZFWFBPUlQpOworCX0KKwlJTlRPRkY7CisJaWYgKHBoeXNkaXIgIT0gbnVsbHN0cikgeworCQlpZiAocGh5c2RpciAhPSBvbGRjdXIpCisJCQlmcmVlKHBoeXNkaXIpOworCQlwaHlzZGlyID0gbnVsbHN0cjsKKwl9CisJaWYgKG9sZGN1ciA9PSB2YWwgfHwgIXZhbCkgeworCQljaGFyICpzID0gZ2V0cHdkKCk7CisJCXBoeXNkaXIgPSBzOworCQlpZiAoIXZhbCkKKwkJCWRpciA9IHM7CisJfSBlbHNlCisJCWRpciA9IHNhdmVzdHIodmFsKTsKKwlpZiAob2xkY3VyICE9IGRpciAmJiBvbGRjdXIgIT0gbnVsbHN0cikgeworCQlmcmVlKG9sZGN1cik7CisJfQorCWN1cmRpciA9IGRpcjsKKwlJTlRPTjsKKwlzZXR2YXIoIlBXRCIsIGRpciwgVkVYUE9SVCk7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9jZC5oIGIvdXNyL2Rhc2gvY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYzMTYxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvY2QuaApAQCAtMCwwICsxLDM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NQorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworCitpbnQJY2RjbWQoaW50LCBjaGFyICoqKTsKK2ludAlwd2RjbWQoaW50LCBjaGFyICoqKTsKK3ZvaWQJc2V0cHdkKGNvbnN0IGNoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2NvbmZpZy5oIGIvdXNyL2Rhc2gvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ODdjYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2NvbmZpZy5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBic2VhcmNoJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9CU0VBUkNIIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwd25hbScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9HRVRQV05BTSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJsaW1pdCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9HRVRSTElNSVQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2FscGhhJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9JU0FMUEhBIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBraWxscGcnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfS0lMTFBHICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtcGNweScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9NRU1QQ1BZICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnc2V0bWFzaycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TSUdTRVRNQVNLICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RwY3B5JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUENQWSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNocm51bCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJDSFJOVUwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzaWduYWwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUlNJR05BTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RydG9kJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUlRPRCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvaW1heCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSVE9JTUFYIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b3VtYXgnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUlRPVU1BWCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3lzY29uZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TWVNDT05GICovCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2RlZmluZSBQQUNLQUdFICJkYXNoIgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgImRhc2giCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgImRhc2ggMC41LjIiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJkYXNoIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjAuNS4yIgorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjZGVmaW5lIFZFUlNJT04gIjAuNS4yIgorCisvKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAxCisjZW5kaWYKKworLyogNjQtYml0IG9wZXJhdGlvbnMgYXJlIHRoZSBzYW1lIGFzIDMyLWJpdCAqLworI2RlZmluZSBmc3RhdDY0IGZzdGF0CisKKy8qIDY0LWJpdCBvcGVyYXRpb25zIGFyZSB0aGUgc2FtZSBhcyAzMi1iaXQgKi8KKyNkZWZpbmUgbHN0YXQ2NCBsc3RhdAorCisvKiA2NC1iaXQgb3BlcmF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgMzItYml0ICovCisjZGVmaW5lIG9wZW42NCBvcGVuCisKKy8qIGtsaWJjIGhhcyBic2Rfc2lnbmFsIGluc3RlYWQgb2Ygc2lnbmFsICovCisjZGVmaW5lIHNpZ25hbCBic2Rfc2lnbmFsCisKKy8qIDY0LWJpdCBvcGVyYXRpb25zIGFyZSB0aGUgc2FtZSBhcyAzMi1iaXQgKi8KKyNkZWZpbmUgc3RhdDY0IHN0YXQKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Vycm9yLmMgYi91c3IvZGFzaC9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODI0M2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9lcnJvci5jCkBAIC0wLDAgKzEsMjMzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIEVycm9ycyBhbmQgZXhjZXB0aW9ucy4KKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInNob3cuaCIKKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAidHJhcC5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisKKy8qCisgKiBDb2RlIHRvIGhhbmRsZSBleGNlcHRpb25zIGluIEMuCisgKi8KKworc3RydWN0IGptcGxvYyAqaGFuZGxlcjsKK2ludCBleGNlcHRpb247CitpbnQgc3VwcHJlc3NpbnQ7Cit2b2xhdGlsZSBzaWdfYXRvbWljX3QgaW50cGVuZGluZzsKKworCitzdGF0aWMgdm9pZCBleHZlcnJvcihpbnQsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkKKyAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworLyoKKyAqIENhbGxlZCB0byByYWlzZSBhbiBleGNlcHRpb24uICBTaW5jZSBDIGRvZXNuJ3QgaW5jbHVkZSBleGNlcHRpb25zLCB3ZQorICoganVzdCBkbyBhIGxvbmdqbXAgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyLiAgVGhlIHR5cGUgb2YgZXhjZXB0aW9uIGlzCisgKiBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSAiZXhjZXB0aW9uIi4KKyAqLworCit2b2lkCitleHJhaXNlKGludCBlKQoreworI2lmZGVmIERFQlVHCisJaWYgKGhhbmRsZXIgPT0gTlVMTCkKKwkJYWJvcnQoKTsKKyNlbmRpZgorCUlOVE9GRjsKKworCWV4Y2VwdGlvbiA9IGU7CisJbG9uZ2ptcChoYW5kbGVyLT5sb2MsIDEpOworfQorCisKKy8qCisgKiBDYWxsZWQgZnJvbSB0cmFwLmMgd2hlbiBhIFNJR0lOVCBpcyByZWNlaXZlZC4gIChJZiB0aGUgdXNlciBzcGVjaWZpZXMKKyAqIHRoYXQgU0lHSU5UIGlzIHRvIGJlIHRyYXBwZWQgb3IgaWdub3JlZCB1c2luZyB0aGUgdHJhcCBidWlsdGluLCB0aGVuCisgKiB0aGlzIHJvdXRpbmUgaXMgbm90IGNhbGxlZC4pICBTdXBwcmVzc2ludCBpcyBub256ZXJvIHdoZW4gaW50ZXJydXB0cworICogYXJlIGhlbGQgdXNpbmcgdGhlIElOVE9GRiBtYWNyby4gIChUaGUgdGVzdCBmb3IgaWZsYWcgaXMganVzdAorICogZGVmZW5zaXZlIHByb2dyYW1taW5nLikKKyAqLworCit2b2lkCitvbmludCh2b2lkKSB7CisJaW50IGk7CisKKwlpbnRwZW5kaW5nID0gMDsKKwlzaWdjbGVhcm1hc2soKTsKKwlpID0gRVhTSUc7CisJaWYgKGdvdHNpZ1tTSUdJTlQgLSAxXSAmJiAhdHJhcFtTSUdJTlRdKSB7CisJCWlmICghKHJvb3RzaGVsbCAmJiBpZmxhZykpIHsKKwkJCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCQkJcmFpc2UoU0lHSU5UKTsKKwkJfQorCQlpID0gRVhJTlQ7CisJfQorCWV4cmFpc2UoaSk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgdm9pZAorZXh2d2FybmluZzIoY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IGFwKQoreworCXN0cnVjdCBvdXRwdXQgKmVycnM7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpmbXQ7CisKKwllcnJzID0gb3V0MjsKKwluYW1lID0gYXJnMDsKKwlmbXQgPSAiJXM6ICI7CisJaWYgKGNvbW1hbmRuYW1lKSB7CisJCW5hbWUgPSBjb21tYW5kbmFtZTsKKwkJZm10ID0gIiVzOiAlZDogIjsKKwl9CisJb3V0Zm10KGVycnMsIGZtdCwgbmFtZSwgc3RhcnRsaW5ubyk7CisJZG9mb3JtYXQoZXJycywgbXNnLCBhcCk7CisjaWYgRkxVU0hFUlIKKwlvdXRjKCdcbicsIGVycnMpOworI2Vsc2UKKwlvdXRjc2xvdygnXG4nLCBlcnJzKTsKKyNlbmRpZgorfQorCisjZGVmaW5lIGV4dndhcm5pbmcoYSwgYiwgYykgZXh2d2FybmluZzIoYiwgYykKKworLyoKKyAqIEV4dmVycm9yIGlzIGNhbGxlZCB0byByYWlzZSB0aGUgZXJyb3IgZXhjZXB0aW9uLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudAorICogaXMgbm90IE5VTEwgdGhlbiBlcnJvciBwcmludHMgYW4gZXJyb3IgbWVzc2FnZSB1c2luZyBwcmludGYgc3R5bGUKKyAqIGZvcm1hdHRpbmcuICBJdCB0aGVuIHJhaXNlcyB0aGUgZXJyb3IgZXhjZXB0aW9uLgorICovCitzdGF0aWMgdm9pZAorZXh2ZXJyb3IoaW50IGNvbmQsIGNvbnN0IGNoYXIgKm1zZywgdmFfbGlzdCBhcCkKK3sKKyNpZmRlZiBERUJVRworCWlmIChtc2cpIHsKKwkJVFJBQ0UoKCJleHZlcnJvciglZCwgXCIiLCBjb25kKSk7CisJCVRSQUNFVigobXNnLCBhcCkpOworCQlUUkFDRSgoIlwiKSBwaWQ9JWRcbiIsIGdldHBpZCgpKSk7CisJfSBlbHNlCisJCVRSQUNFKCgiZXh2ZXJyb3IoJWQsIE5VTEwpIHBpZD0lZFxuIiwgY29uZCwgZ2V0cGlkKCkpKTsKKwlpZiAobXNnKQorI2VuZGlmCisJCWV4dndhcm5pbmcoLTEsIG1zZywgYXApOworCisJZmx1c2hhbGwoKTsKKwlleHJhaXNlKGNvbmQpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworCit2b2lkCitzaF9lcnJvcihjb25zdCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisJZXh2ZXJyb3IoRVhFUlJPUiwgbXNnLCBhcCk7CisJLyogTk9UUkVBQ0hFRCAqLworCXZhX2VuZChhcCk7Cit9CisKKwordm9pZAorZXhlcnJvcihpbnQgY29uZCwgY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBtc2cpOworCWV4dmVycm9yKGNvbmQsIG1zZywgYXApOworCS8qIE5PVFJFQUNIRUQgKi8KKwl2YV9lbmQoYXApOworfQorCisvKgorICogZXJyb3Ivd2FybmluZyByb3V0aW5lcyBmb3IgZXh0ZXJuYWwgYnVpbHRpbnMKKyAqLworCit2b2lkCitzaF93YXJueChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJZXh2d2FybmluZygtMSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworCisvKgorICogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4gZXJyb3IuICBUaGUgcmV0dXJuZWQgc3RyaW5nIG1heSBiZSBhCisgKiBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlciB0aGF0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgY2FsbC4KKyAqIEFjdGlvbiBkZXNjcmliZXMgdGhlIG9wZXJhdGlvbiB0aGF0IGdvdCB0aGUgZXJyb3IuCisgKi8KKworY29uc3QgY2hhciAqCitlcnJtc2coaW50IGUsIGludCBhY3Rpb24pCit7CisJaWYgKGUgIT0gRU5PRU5UICYmIGUgIT0gRU5PVERJUikKKwkJcmV0dXJuIHN0cmVycm9yKGUpOworCisJaWYgKGFjdGlvbiAmIEVfT1BFTikKKwkJcmV0dXJuICJObyBzdWNoIGZpbGUiOworCWVsc2UgaWYgKGFjdGlvbiAmIEVfQ1JFQVQpCisJCXJldHVybiAiRGlyZWN0b3J5IG5vbmV4aXN0ZW50IjsKKwllbHNlCisJCXJldHVybiAibm90IGZvdW5kIjsKK30KKworCisjaWZkZWYgUkVBTExZX1NNQUxMCit2b2lkCitfX2ludG9uKCkgeworCWlmICgtLXN1cHByZXNzaW50ID09IDAgJiYgaW50cGVuZGluZykgeworCQlvbmludCgpOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZXJyb3IuaCBiL3Vzci9kYXNoL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2NjAwYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2Vycm9yLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZXJyb3IuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaWZuZGVmIERBU0hfRVJST1JfSAorI2RlZmluZSBEQVNIX0VSUk9SX0gKKworI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisvKgorICogVHlwZXMgb2Ygb3BlcmF0aW9ucyAocGFzc2VkIHRvIHRoZSBlcnJtc2cgcm91dGluZSkuCisgKi8KKworI2RlZmluZSBFX09QRU4gMDEJLyogb3BlbmluZyBhIGZpbGUgKi8KKyNkZWZpbmUgRV9DUkVBVCAwMgkvKiBjcmVhdGluZyBhIGZpbGUgKi8KKyNkZWZpbmUgRV9FWEVDIDA0CS8qIGV4ZWN1dGluZyBhIHByb2dyYW0gKi8KKworCisvKgorICogV2UgZW5jbG9zZSBqbXBfYnVmIGluIGEgc3RydWN0dXJlIHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgcG9pbnRlcnMgdG8KKyAqIGp1bXAgbG9jYXRpb25zLiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBoYW5kbGVyIGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB0bworICoganVtcCB0byB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGFuZCB0aGUgZ2xvYmFsIHZhcmlhYmxlIGV4Y2VwdGlvbgorICogY29udGFpbnMgYSBjb2RlIGlkZW50aWZ5aW5nIHRoZSBleGVjZXB0aW9uLiAgVG8gaW1wbGVtZW50IG5lc3RlZAorICogZXhjZXB0aW9uIGhhbmRsZXJzLCB0aGUgdXNlciBzaG91bGQgc2F2ZSB0aGUgdmFsdWUgb2YgaGFuZGxlciBvbiBlbnRyeQorICogdG8gYW4gaW5uZXIgc2NvcGUsIHNldCBoYW5kbGVyIHRvIHBvaW50IHRvIGEgam1wbG9jIHN0cnVjdHVyZSBmb3IgdGhlCisgKiBpbm5lciBzY29wZSwgYW5kIHJlc3RvcmUgaGFuZGxlciBvbiBleGl0IGZyb20gdGhlIHNjb3BlLgorICovCisKK3N0cnVjdCBqbXBsb2MgeworCWptcF9idWYgbG9jOworfTsKKworZXh0ZXJuIHN0cnVjdCBqbXBsb2MgKmhhbmRsZXI7CitleHRlcm4gaW50IGV4Y2VwdGlvbjsKKworLyogZXhjZXB0aW9ucyAqLworI2RlZmluZSBFWElOVCAwCQkvKiBTSUdJTlQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRVhFUlJPUiAxCS8qIGEgZ2VuZXJpYyBlcnJvciAqLworI2RlZmluZSBFWFNIRUxMUFJPQyAyCS8qIGV4ZWN1dGUgYSBzaGVsbCBwcm9jZWR1cmUgKi8KKyNkZWZpbmUgRVhFWEVDIDMJLyogY29tbWFuZCBleGVjdXRpb24gZmFpbGVkICovCisjZGVmaW5lIEVYRVhJVCA0CS8qIGV4aXQgdGhlIHNoZWxsICovCisjZGVmaW5lIEVYU0lHIDUJCS8qIHRyYXBwZWQgc2lnbmFsIGluIHdhaXQoMSkgKi8KKworCisvKgorICogVGhlc2UgbWFjcm9zIGFsbG93IHRoZSB1c2VyIHRvIHN1c3BlbmQgdGhlIGhhbmRsaW5nIG9mIGludGVycnVwdCBzaWduYWxzCisgKiBvdmVyIGEgcGVyaW9kIG9mIHRpbWUuICBUaGlzIGlzIHNpbWlsYXIgdG8gU0lHSE9MRCB0byBvciBzaWdibG9jaywgYnV0CisgKiBtdWNoIG1vcmUgZWZmaWNpZW50IGFuZCBwb3J0YWJsZS4gIChCdXQgaGFja2luZyB0aGUga2VybmVsIGlzIHNvIG11Y2gKKyAqIG1vcmUgZnVuIHRoYW4gd29ycnlpbmcgYWJvdXQgZWZmaWNpZW5jeSBhbmQgcG9ydGFiaWxpdHkuIDotKSkKKyAqLworCitleHRlcm4gaW50IHN1cHByZXNzaW50OworZXh0ZXJuIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBpbnRwZW5kaW5nOworZXh0ZXJuIGludCBleHNpZzsKKworI2RlZmluZSBiYXJyaWVyKCkgKHsgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiOiA6IDoibWVtb3J5Iik7IH0pCisjZGVmaW5lIElOVE9GRiBcCisJKHsgXAorCQlzdXBwcmVzc2ludCsrOyBcCisJCWJhcnJpZXIoKTsgXAorCQkwOyBcCisJfSkKKyNpZmRlZiBSRUFMTFlfU01BTEwKK3ZvaWQgX19pbnRvbih2b2lkKTsKKyNkZWZpbmUgSU5UT04gX19pbnRvbigpCisjZWxzZQorI2RlZmluZSBJTlRPTiBcCisJKHsgXAorCQliYXJyaWVyKCk7IFwKKwkJaWYgKC0tc3VwcHJlc3NpbnQgPT0gMCAmJiBpbnRwZW5kaW5nKSBvbmludCgpOyBcCisJCTA7IFwKKwl9KQorI2VuZGlmCisjZGVmaW5lIEZPUkNFSU5UT04gXAorCSh7IFwKKwkJYmFycmllcigpOyBcCisJCXN1cHByZXNzaW50ID0gMDsgXAorCQlpZiAoaW50cGVuZGluZykgb25pbnQoKTsgXAorCQkwOyBcCisJfSkKKyNkZWZpbmUgU0FWRUlOVCh2KSAoKHYpID0gc3VwcHJlc3NpbnQpCisjZGVmaW5lIFJFU1RPUkVJTlQodikgXAorCSh7IFwKKwkJYmFycmllcigpOyBcCisJCWlmICgoc3VwcHJlc3NpbnQgPSAodikpID09IDAgJiYgaW50cGVuZGluZykgb25pbnQoKTsgXAorCQkwOyBcCisJfSkKKyNkZWZpbmUgQ0xFQVJfUEVORElOR19JTlQgaW50cGVuZGluZyA9IDAKKyNkZWZpbmUgaW50X3BlbmRpbmcoKSBpbnRwZW5kaW5nCisjZGVmaW5lIEVYU0lHT04oKSBcCisJKHsgXAorCQlleHNpZysrOyBcCisJCWJhcnJpZXIoKTsgXAorCQlpZiAocGVuZGluZ3NpZ3MpIFwKKwkJCWV4cmFpc2UoRVhTSUcpOyBcCisJCTA7IFwKKwl9KQorLyogRVhTSUcgaXMgdHVybmVkIG9mZiBieSBldmFsYmx0aW4oKS4gKi8KKwordm9pZCBleHJhaXNlKGludCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisjaWZkZWYgVVNFX05PUkVUVVJOCit2b2lkIG9uaW50KHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworI2Vsc2UKK3ZvaWQgb25pbnQodm9pZCk7CisjZW5kaWYKK3ZvaWQgc2hfZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOwordm9pZCBleGVycm9yKGludCwgY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworY29uc3QgY2hhciAqZXJybXNnKGludCwgaW50KTsKKwordm9pZCBzaF93YXJueChjb25zdCBjaGFyICosIC4uLik7CisKKyNlbmRpZgkJLyogREFTSF9FUlJPUl9IICovCmRpZmYgLS1naXQgYS91c3IvZGFzaC9ldmFsLmMgYi91c3IvZGFzaC9ldmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiYTg1MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2V2YWwuYwpAQCAtMCwwICsxLDExMDAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qCisgKiBFdmFsdWF0ZSBhIGNvbW1hbmQuCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibm9kZXMuaCIKKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJleHBhbmQuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJqb2JzLmgiCisjaW5jbHVkZSAiZXZhbC5oIgorI2luY2x1ZGUgImJ1aWx0aW5zLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgImV4ZWMuaCIKKyNpbmNsdWRlICJyZWRpci5oIgorI2luY2x1ZGUgImlucHV0LmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAidHJhcC5oIgorI2luY2x1ZGUgInZhci5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpZm5kZWYgU01BTEwKKyNpbmNsdWRlICJteWhpc3RlZGl0LmgiCisjZW5kaWYKKworCisvKiBmbGFncyBpbiBhcmd1bWVudCB0byBldmFsdHJlZSAqLworI2RlZmluZSBFVl9FWElUIDAxCQkvKiBleGl0IGFmdGVyIGV2YWx1YXRpbmcgdHJlZSAqLworI2RlZmluZSBFVl9URVNURUQgMDIJCS8qIGV4aXQgc3RhdHVzIGlzIGNoZWNrZWQ7IGlnbm9yZSAtZSBmbGFnICovCisjZGVmaW5lIEVWX0JBQ0tDTUQgMDQJCS8qIGNvbW1hbmQgZXhlY3V0aW5nIHdpdGhpbiBiYWNrIHF1b3RlcyAqLworCitpbnQgZXZhbHNraXA7CQkJLyogc2V0IGlmIHdlIGFyZSBza2lwcGluZyBjb21tYW5kcyAqLworU1RBVElDIGludCBza2lwY291bnQ7CQkvKiBudW1iZXIgb2YgbGV2ZWxzIHRvIHNraXAgKi8KK01LSU5JVCBpbnQgbG9vcG5lc3Q7CQkvKiBjdXJyZW50IGxvb3AgbmVzdGluZyBsZXZlbCAqLworc3RhdGljIGludCBmdW5jbmVzdDsJCS8qIGRlcHRoIG9mIGZ1bmN0aW9uIGNhbGxzICovCisKKworY2hhciAqY29tbWFuZG5hbWU7CitzdHJ1Y3Qgc3RybGlzdCAqY21kZW52aXJvbjsKK2ludCBleGl0c3RhdHVzOwkJCS8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgY29tbWFuZCAqLworaW50IGJhY2tfZXhpdHN0YXR1czsJCS8qIGV4aXQgc3RhdHVzIG9mIGJhY2txdW90ZWQgY29tbWFuZCAqLworCisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAzKQorU1RBVElDCisjZW5kaWYKK3ZvaWQgZXZhbHRyZWVucih1bmlvbiBub2RlICosIGludCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworU1RBVElDIHZvaWQgZXZhbGxvb3AodW5pb24gbm9kZSAqLCBpbnQpOworU1RBVElDIHZvaWQgZXZhbGZvcih1bmlvbiBub2RlICosIGludCk7CitTVEFUSUMgdm9pZCBldmFsY2FzZSh1bmlvbiBub2RlICosIGludCk7CitTVEFUSUMgdm9pZCBldmFsc3Vic2hlbGwodW5pb24gbm9kZSAqLCBpbnQpOworU1RBVElDIHZvaWQgZXhwcmVkaXIodW5pb24gbm9kZSAqKTsKK1NUQVRJQyB2b2lkIGV2YWxwaXBlKHVuaW9uIG5vZGUgKiwgaW50KTsKKyNpZmRlZiBub3R5ZXQKK1NUQVRJQyB2b2lkIGV2YWxjb21tYW5kKHVuaW9uIG5vZGUgKiwgaW50LCBzdHJ1Y3QgYmFja2NtZCAqKTsKKyNlbHNlCitTVEFUSUMgdm9pZCBldmFsY29tbWFuZCh1bmlvbiBub2RlICosIGludCk7CisjZW5kaWYKK1NUQVRJQyBpbnQgZXZhbGJsdGluKGNvbnN0IHN0cnVjdCBidWlsdGluY21kICosIGludCwgY2hhciAqKik7CitTVEFUSUMgaW50IGV2YWxmdW4oc3RydWN0IGZ1bmNub2RlICosIGludCwgY2hhciAqKiwgaW50KTsKK1NUQVRJQyB2b2lkIHByZWhhc2godW5pb24gbm9kZSAqKTsKK1NUQVRJQyBpbnQgZXByaW50bGlzdChzdHJ1Y3Qgb3V0cHV0ICosIHN0cnVjdCBzdHJsaXN0ICosIGludCk7CitTVEFUSUMgaW50IGJsdGluY21kKGludCwgY2hhciAqKik7CisKKworU1RBVElDIGNvbnN0IHN0cnVjdCBidWlsdGluY21kIGJsdGluID0geworCW5hbWU6IG51bGxzdHIsCisJYnVpbHRpbjogYmx0aW5jbWQKK307CisKKworLyoKKyAqIENhbGxlZCB0byByZXNldCB0aGluZ3MgYWZ0ZXIgYW4gZXhjZXB0aW9uLgorICovCisKKyNpZmRlZiBta2luaXQKK0lOQ0xVREUgImV2YWwuaCIKKworUkVTRVQgeworCWV2YWxza2lwID0gMDsKKwlsb29wbmVzdCA9IDA7Cit9CisjZW5kaWYKKworCisKKy8qCisgKiBUaGUgZXZhbCBjb21tbWFuZC4KKyAqLworCitpbnQKK2V2YWxjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgICAgICBjaGFyICpwOworICAgICAgICBjaGFyICpjb25jYXQ7CisgICAgICAgIGNoYXIgKiphcDsKKworICAgICAgICBpZiAoYXJnYyA+IDEpIHsKKyAgICAgICAgICAgICAgICBwID0gYXJndlsxXTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnYyA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUQVJUU1RBQ0tTVFIoY29uY2F0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gYXJndiArIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAJY29uY2F0ID0gc3RwdXRzKHAsIGNvbmNhdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocCA9ICphcCsrKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFBVVEMoJyAnLCBjb25jYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgU1RQVVRDKCdcMCcsIGNvbmNhdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gZ3JhYnN0YWNrc3RyKGNvbmNhdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV2YWxzdHJpbmcocCwgflNLSVBFVkFMKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiBleGl0c3RhdHVzOworfQorCisKKy8qCisgKiBFeGVjdXRlIGEgY29tbWFuZCBvciBjb21tYW5kcyBjb250YWluZWQgaW4gYSBzdHJpbmcuCisgKi8KKworaW50CitldmFsc3RyaW5nKGNoYXIgKnMsIGludCBtYXNrKQoreworCXVuaW9uIG5vZGUgKm47CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlpbnQgc2tpcDsKKworCXNldGlucHV0c3RyaW5nKHMpOworCXNldHN0YWNrbWFyaygmc21hcmspOworCisJc2tpcCA9IDA7CisJd2hpbGUgKChuID0gcGFyc2VjbWQoMCkpICE9IE5FT0YpIHsKKwkJZXZhbHRyZWUobiwgMCk7CisJCXBvcHN0YWNrbWFyaygmc21hcmspOworCQlza2lwID0gZXZhbHNraXA7CisJCWlmIChza2lwKQorCQkJYnJlYWs7CisJfQorCXBvcGZpbGUoKTsKKworCXNraXAgJj0gbWFzazsKKwlldmFsc2tpcCA9IHNraXA7CisJcmV0dXJuIHNraXA7Cit9CisKKworCisvKgorICogRXZhbHVhdGUgYSBwYXJzZSB0cmVlLiAgVGhlIHZhbHVlIGlzIGxlZnQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZQorICogZXhpdHN0YXR1cy4KKyAqLworCit2b2lkCitldmFsdHJlZSh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJaW50IGNoZWNrZXhpdCA9IDA7CisJdm9pZCAoKmV2YWxmbikodW5pb24gbm9kZSAqLCBpbnQpOworCXVuc2lnbmVkIGlzb3I7CisJaW50IHN0YXR1czsKKwlpZiAobiA9PSBOVUxMKSB7CisJCVRSQUNFKCgiZXZhbHRyZWUoTlVMTCkgY2FsbGVkXG4iKSk7CisJCWdvdG8gb3V0OworCX0KKyNpZm5kZWYgU01BTEwKKwlkaXNwbGF5aGlzdCA9IDE7CS8qIHNob3cgaGlzdG9yeSBzdWJzdGl0dXRpb25zIGRvbmUgd2l0aCBmYyAqLworI2VuZGlmCisJVFJBQ0UoKCJwaWQgJWQsIGV2YWx0cmVlKCVwOiAlZCwgJWQpIGNhbGxlZFxuIiwKKwkgICAgZ2V0cGlkKCksIG4sIG4tPnR5cGUsIGZsYWdzKSk7CisJc3dpdGNoIChuLT50eXBlKSB7CisJZGVmYXVsdDoKKyNpZmRlZiBERUJVRworCQlvdXQxZm10KCJOb2RlIHR5cGUgPSAlZFxuIiwgbi0+dHlwZSk7CisjaWZuZGVmIFVTRV9HTElCQ19TVERJTworCQlmbHVzaG91dChvdXQxKTsKKyNlbmRpZgorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgTk5PVDoKKwkJZXZhbHRyZWUobi0+bm5vdC5jb20sIEVWX1RFU1RFRCk7CisJCXN0YXR1cyA9ICFleGl0c3RhdHVzOworCQlnb3RvIHNldHN0YXR1czsKKwljYXNlIE5SRURJUjoKKwkJZXhwcmVkaXIobi0+bnJlZGlyLnJlZGlyZWN0KTsKKwkJc3RhdHVzID0gcmVkaXJlY3RzYWZlKG4tPm5yZWRpci5yZWRpcmVjdCwgUkVESVJfUFVTSCk7CisJCWlmICghc3RhdHVzKSB7CisJCQlldmFsdHJlZShuLT5ucmVkaXIubiwgZmxhZ3MgJiBFVl9URVNURUQpOworCQkJc3RhdHVzID0gZXhpdHN0YXR1czsKKwkJfQorCQlwb3ByZWRpcigwKTsKKwkJZ290byBzZXRzdGF0dXM7CisJY2FzZSBOQ01EOgorI2lmZGVmIG5vdHlldAorCQlpZiAoZWZsYWcgJiYgIShmbGFncyAmIEVWX1RFU1RFRCkpCisJCQljaGVja2V4aXQgPSB+MDsKKwkJZXZhbGNvbW1hbmQobiwgZmxhZ3MsIChzdHJ1Y3QgYmFja2NtZCAqKU5VTEwpOworCQlicmVhazsKKyNlbHNlCisJCWV2YWxmbiA9IGV2YWxjb21tYW5kOworY2hlY2tleGl0OgorCQlpZiAoZWZsYWcgJiYgIShmbGFncyAmIEVWX1RFU1RFRCkpCisJCQljaGVja2V4aXQgPSB+MDsKKwkJZ290byBjYWxsZXZhbDsKKyNlbmRpZgorCWNhc2UgTkZPUjoKKwkJZXZhbGZuID0gZXZhbGZvcjsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5XSElMRToKKwljYXNlIE5VTlRJTDoKKwkJZXZhbGZuID0gZXZhbGxvb3A7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOU1VCU0hFTEw6CisJY2FzZSBOQkFDS0dORDoKKwkJZXZhbGZuID0gZXZhbHN1YnNoZWxsOworCQlnb3RvIGNhbGxldmFsOworCWNhc2UgTlBJUEU6CisJCWV2YWxmbiA9IGV2YWxwaXBlOworI2lmZGVmIG5vdHlldAorCQlpZiAoZWZsYWcgJiYgIShmbGFncyAmIEVWX1RFU1RFRCkpCisJCQljaGVja2V4aXQgPSB+MDsKKwkJZ290byBjYWxsZXZhbDsKKyNlbHNlCisJCWdvdG8gY2hlY2tleGl0OworI2VuZGlmCisJY2FzZSBOQ0FTRToKKwkJZXZhbGZuID0gZXZhbGNhc2U7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOQU5EOgorCWNhc2UgTk9SOgorCWNhc2UgTlNFTUk6CisjaWYgTkFORCArIDEgIT0gTk9SCisjZXJyb3IgTkFORCArIDEgIT0gTk9SCisjZW5kaWYKKyNpZiBOT1IgKyAxICE9IE5TRU1JCisjZXJyb3IgTk9SICsgMSAhPSBOU0VNSQorI2VuZGlmCisJCWlzb3IgPSBuLT50eXBlIC0gTkFORDsKKwkJZXZhbHRyZWUoCisJCQluLT5uYmluYXJ5LmNoMSwKKwkJCShmbGFncyB8ICgoaXNvciA+PiAxKSAtIDEpKSAmIEVWX1RFU1RFRAorCQkpOworCQlpZiAoIWV4aXRzdGF0dXMgPT0gaXNvcikKKwkJCWJyZWFrOworCQlpZiAoIWV2YWxza2lwKSB7CisJCQluID0gbi0+bmJpbmFyeS5jaDI7CitldmFsbjoKKwkJCWV2YWxmbiA9IGV2YWx0cmVlOworY2FsbGV2YWw6CisJCQlldmFsZm4obiwgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOSUY6CisJCWV2YWx0cmVlKG4tPm5pZi50ZXN0LCBFVl9URVNURUQpOworCQlpZiAoZXZhbHNraXApCisJCQlicmVhazsKKwkJaWYgKGV4aXRzdGF0dXMgPT0gMCkgeworCQkJbiA9IG4tPm5pZi5pZnBhcnQ7CisJCQlnb3RvIGV2YWxuOworCQl9IGVsc2UgaWYgKG4tPm5pZi5lbHNlcGFydCkgeworCQkJbiA9IG4tPm5pZi5lbHNlcGFydDsKKwkJCWdvdG8gZXZhbG47CisJCX0KKwkJZ290byBzdWNjZXNzOworCWNhc2UgTkRFRlVOOgorCQlkZWZ1bihuLT5uYXJnLnRleHQsIG4tPm5hcmcubmV4dCk7CitzdWNjZXNzOgorCQlzdGF0dXMgPSAwOworc2V0c3RhdHVzOgorCQlleGl0c3RhdHVzID0gc3RhdHVzOworCQlicmVhazsKKwl9CitvdXQ6CisJaWYgKChjaGVja2V4aXQgJiBleGl0c3RhdHVzKSkKKwkJZXZhbHNraXAgfD0gU0tJUEVWQUw7CisJZWxzZSBpZiAocGVuZGluZ3NpZ3MgJiYgZG90cmFwKCkpCisJCWdvdG8gZXhleGl0OworCisJaWYgKGZsYWdzICYgRVZfRVhJVCkgeworZXhleGl0OgorCQlleHJhaXNlKEVYRVhJVCk7CisJfQorfQorCisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAzKQorU1RBVElDCisjZW5kaWYKK3ZvaWQgZXZhbHRyZWVucih1bmlvbiBub2RlICosIGludCkgX19hdHRyaWJ1dGVfXyAoKGFsaWFzKCJldmFsdHJlZSIpKSk7CisKKworU1RBVElDIHZvaWQKK2V2YWxsb29wKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwlpbnQgc3RhdHVzOworCisJbG9vcG5lc3QrKzsKKwlzdGF0dXMgPSAwOworCWZsYWdzICY9IEVWX1RFU1RFRDsKKwlmb3IgKDs7KSB7CisJCWludCBpOworCisJCWV2YWx0cmVlKG4tPm5iaW5hcnkuY2gxLCBFVl9URVNURUQpOworCQlpZiAoZXZhbHNraXApIHsKK3NraXBwaW5nOgkgIGlmIChldmFsc2tpcCA9PSBTS0lQQ09OVCAmJiAtLXNraXBjb3VudCA8PSAwKSB7CisJCQkJZXZhbHNraXAgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGV2YWxza2lwID09IFNLSVBCUkVBSyAmJiAtLXNraXBjb3VudCA8PSAwKQorCQkJCWV2YWxza2lwID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWkgPSBleGl0c3RhdHVzOworCQlpZiAobi0+dHlwZSAhPSBOV0hJTEUpCisJCQlpID0gIWk7CisJCWlmIChpICE9IDApCisJCQlicmVhazsKKwkJZXZhbHRyZWUobi0+bmJpbmFyeS5jaDIsIGZsYWdzKTsKKwkJc3RhdHVzID0gZXhpdHN0YXR1czsKKwkJaWYgKGV2YWxza2lwKQorCQkJZ290byBza2lwcGluZzsKKwl9CisJbG9vcG5lc3QtLTsKKwlleGl0c3RhdHVzID0gc3RhdHVzOworfQorCisKKworU1RBVElDIHZvaWQKK2V2YWxmb3IodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBhcmdsaXN0IGFyZ2xpc3Q7CisJdW5pb24gbm9kZSAqYXJncDsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKworCXNldHN0YWNrbWFyaygmc21hcmspOworCWFyZ2xpc3QubGFzdHAgPSAmYXJnbGlzdC5saXN0OworCWZvciAoYXJncCA9IG4tPm5mb3IuYXJncyA7IGFyZ3AgOyBhcmdwID0gYXJncC0+bmFyZy5uZXh0KSB7CisJCWV4cGFuZGFyZyhhcmdwLCAmYXJnbGlzdCwgRVhQX0ZVTEwgfCBFWFBfVElMREUgfCBFWFBfUkVDT1JEKTsKKwkJLyogWFhYICovCisJCWlmIChldmFsc2tpcCkKKwkJCWdvdG8gb3V0OworCX0KKwkqYXJnbGlzdC5sYXN0cCA9IE5VTEw7CisKKwlleGl0c3RhdHVzID0gMDsKKwlsb29wbmVzdCsrOworCWZsYWdzICY9IEVWX1RFU1RFRDsKKwlmb3IgKHNwID0gYXJnbGlzdC5saXN0IDsgc3AgOyBzcCA9IHNwLT5uZXh0KSB7CisJCXNldHZhcihuLT5uZm9yLnZhciwgc3AtPnRleHQsIDApOworCQlldmFsdHJlZShuLT5uZm9yLmJvZHksIGZsYWdzKTsKKwkJaWYgKGV2YWxza2lwKSB7CisJCQlpZiAoZXZhbHNraXAgPT0gU0tJUENPTlQgJiYgLS1za2lwY291bnQgPD0gMCkgeworCQkJCWV2YWxza2lwID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChldmFsc2tpcCA9PSBTS0lQQlJFQUsgJiYgLS1za2lwY291bnQgPD0gMCkKKwkJCQlldmFsc2tpcCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlsb29wbmVzdC0tOworb3V0OgorCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCisKKworU1RBVElDIHZvaWQKK2V2YWxjYXNlKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwl1bmlvbiBub2RlICpjcDsKKwl1bmlvbiBub2RlICpwYXRwOworCXN0cnVjdCBhcmdsaXN0IGFyZ2xpc3Q7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKworCXNldHN0YWNrbWFyaygmc21hcmspOworCWFyZ2xpc3QubGFzdHAgPSAmYXJnbGlzdC5saXN0OworCWV4cGFuZGFyZyhuLT5uY2FzZS5leHByLCAmYXJnbGlzdCwgRVhQX1RJTERFKTsKKwlleGl0c3RhdHVzID0gMDsKKwlmb3IgKGNwID0gbi0+bmNhc2UuY2FzZXMgOyBjcCAmJiBldmFsc2tpcCA9PSAwIDsgY3AgPSBjcC0+bmNsaXN0Lm5leHQpIHsKKwkJZm9yIChwYXRwID0gY3AtPm5jbGlzdC5wYXR0ZXJuIDsgcGF0cCA7IHBhdHAgPSBwYXRwLT5uYXJnLm5leHQpIHsKKwkJCWlmIChjYXNlbWF0Y2gocGF0cCwgYXJnbGlzdC5saXN0LT50ZXh0KSkgeworCQkJCWlmIChldmFsc2tpcCA9PSAwKSB7CisJCQkJCWV2YWx0cmVlKGNwLT5uY2xpc3QuYm9keSwgZmxhZ3MpOworCQkJCX0KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKK30KKworCisKKy8qCisgKiBLaWNrIG9mZiBhIHN1YnNoZWxsIHRvIGV2YWx1YXRlIGEgdHJlZS4KKyAqLworCitTVEFUSUMgdm9pZAorZXZhbHN1YnNoZWxsKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlpbnQgYmFja2duZCA9IChuLT50eXBlID09IE5CQUNLR05EKTsKKwlpbnQgc3RhdHVzOworCisJZXhwcmVkaXIobi0+bnJlZGlyLnJlZGlyZWN0KTsKKwlpZiAoIWJhY2tnbmQgJiYgZmxhZ3MgJiBFVl9FWElUICYmICF0cmFwWzBdKQorCQlnb3RvIG5vZm9yazsKKwlJTlRPRkY7CisJanAgPSBtYWtlam9iKG4sIDEpOworCWlmIChmb3Jrc2hlbGwoanAsIG4sIGJhY2tnbmQpID09IDApIHsKKwkJSU5UT047CisJCWZsYWdzIHw9IEVWX0VYSVQ7CisJCWlmIChiYWNrZ25kKQorCQkJZmxhZ3MgJj1+IEVWX1RFU1RFRDsKK25vZm9yazoKKwkJcmVkaXJlY3Qobi0+bnJlZGlyLnJlZGlyZWN0LCAwKTsKKwkJZXZhbHRyZWVucihuLT5ucmVkaXIubiwgZmxhZ3MpOworCQkvKiBuZXZlciByZXR1cm5zICovCisJfQorCXN0YXR1cyA9IDA7CisJaWYgKCEgYmFja2duZCkKKwkJc3RhdHVzID0gd2FpdGZvcmpvYihqcCk7CisJZXhpdHN0YXR1cyA9IHN0YXR1czsKKwlJTlRPTjsKK30KKworCisKKy8qCisgKiBDb21wdXRlIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgaW4gYSByZWRpcmVjdGlvbiBsaXN0LgorICovCisKK1NUQVRJQyB2b2lkCitleHByZWRpcih1bmlvbiBub2RlICpuKQoreworCXVuaW9uIG5vZGUgKnJlZGlyOworCisJZm9yIChyZWRpciA9IG4gOyByZWRpciA7IHJlZGlyID0gcmVkaXItPm5maWxlLm5leHQpIHsKKwkJc3RydWN0IGFyZ2xpc3QgZm47CisJCWZuLmxhc3RwID0gJmZuLmxpc3Q7CisJCXN3aXRjaCAocmVkaXItPnR5cGUpIHsKKwkJY2FzZSBORlJPTVRPOgorCQljYXNlIE5GUk9NOgorCQljYXNlIE5UTzoKKwkJY2FzZSBOQ0xPQkJFUjoKKwkJY2FzZSBOQVBQRU5EOgorCQkJZXhwYW5kYXJnKHJlZGlyLT5uZmlsZS5mbmFtZSwgJmZuLCBFWFBfVElMREUgfCBFWFBfUkVESVIpOworCQkJcmVkaXItPm5maWxlLmV4cGZuYW1lID0gZm4ubGlzdC0+dGV4dDsKKwkJCWJyZWFrOworCQljYXNlIE5GUk9NRkQ6CisJCWNhc2UgTlRPRkQ6CisJCQlpZiAocmVkaXItPm5kdXAudm5hbWUpIHsKKwkJCQlleHBhbmRhcmcocmVkaXItPm5kdXAudm5hbWUsICZmbiwgRVhQX0ZVTEwgfCBFWFBfVElMREUpOworCQkJCWZpeHJlZGlyKHJlZGlyLCBmbi5saXN0LT50ZXh0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKKworLyoKKyAqIEV2YWx1YXRlIGEgcGlwZWxpbmUuICBBbGwgdGhlIHByb2Nlc3NlcyBpbiB0aGUgcGlwZWxpbmUgYXJlIGNoaWxkcmVuCisgKiBvZiB0aGUgcHJvY2VzcyBjcmVhdGluZyB0aGUgcGlwZWxpbmUuICAoVGhpcyBkaWZmZXJzIGZyb20gc29tZSB2ZXJzaW9ucworICogb2YgdGhlIHNoZWxsLCB3aGljaCBtYWtlIHRoZSBsYXN0IHByb2Nlc3MgaW4gYSBwaXBlbGluZSB0aGUgcGFyZW50CisgKiBvZiBhbGwgdGhlIHJlc3QuKQorICovCisKK1NUQVRJQyB2b2lkCitldmFscGlwZSh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGpvYiAqanA7CisJc3RydWN0IG5vZGVsaXN0ICpscDsKKwlpbnQgcGlwZWxlbjsKKwlpbnQgcHJldmZkOworCWludCBwaXBbMl07CisKKwlUUkFDRSgoImV2YWxwaXBlKDB4JWx4KSBjYWxsZWRcbiIsIChsb25nKW4pKTsKKwlwaXBlbGVuID0gMDsKKwlmb3IgKGxwID0gbi0+bnBpcGUuY21kbGlzdCA7IGxwIDsgbHAgPSBscC0+bmV4dCkKKwkJcGlwZWxlbisrOworCWZsYWdzIHw9IEVWX0VYSVQ7CisJSU5UT0ZGOworCWpwID0gbWFrZWpvYihuLCBwaXBlbGVuKTsKKwlwcmV2ZmQgPSAtMTsKKwlmb3IgKGxwID0gbi0+bnBpcGUuY21kbGlzdCA7IGxwIDsgbHAgPSBscC0+bmV4dCkgeworCQlwcmVoYXNoKGxwLT5uKTsKKwkJcGlwWzFdID0gLTE7CisJCWlmIChscC0+bmV4dCkgeworCQkJaWYgKHBpcGUocGlwKSA8IDApIHsKKwkJCQljbG9zZShwcmV2ZmQpOworCQkJCXNoX2Vycm9yKCJQaXBlIGNhbGwgZmFpbGVkIik7CisJCQl9CisJCX0KKwkJaWYgKGZvcmtzaGVsbChqcCwgbHAtPm4sIG4tPm5waXBlLmJhY2tnbmQpID09IDApIHsKKwkJCUlOVE9OOworCQkJaWYgKHBpcFsxXSA+PSAwKSB7CisJCQkJY2xvc2UocGlwWzBdKTsKKwkJCX0KKwkJCWlmIChwcmV2ZmQgPiAwKSB7CisJCQkJZHVwMihwcmV2ZmQsIDApOworCQkJCWNsb3NlKHByZXZmZCk7CisJCQl9CisJCQlpZiAocGlwWzFdID4gMSkgeworCQkJCWR1cDIocGlwWzFdLCAxKTsKKwkJCQljbG9zZShwaXBbMV0pOworCQkJfQorCQkJZXZhbHRyZWVucihscC0+biwgZmxhZ3MpOworCQkJLyogbmV2ZXIgcmV0dXJucyAqLworCQl9CisJCWlmIChwcmV2ZmQgPj0gMCkKKwkJCWNsb3NlKHByZXZmZCk7CisJCXByZXZmZCA9IHBpcFswXTsKKwkJY2xvc2UocGlwWzFdKTsKKwl9CisJaWYgKG4tPm5waXBlLmJhY2tnbmQgPT0gMCkgeworCQlleGl0c3RhdHVzID0gd2FpdGZvcmpvYihqcCk7CisJCVRSQUNFKCgiZXZhbHBpcGU6ICBqb2IgZG9uZSBleGl0IHN0YXR1cyAlZFxuIiwgZXhpdHN0YXR1cykpOworCX0KKwlJTlRPTjsKK30KKworCisKKy8qCisgKiBFeGVjdXRlIGEgY29tbWFuZCBpbnNpZGUgYmFjayBxdW90ZXMuICBJZiBpdCdzIGEgYnVpbHRpbiBjb21tYW5kLCB3ZQorICogd2FudCB0byBzYXZlIGl0cyBvdXRwdXQgaW4gYSBibG9jayBvYnRhaW5lZCBmcm9tIG1hbGxvYy4gIE90aGVyd2lzZQorICogd2UgZm9yayBvZmYgYSBzdWJwcm9jZXNzIGFuZCBnZXQgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCB2aWEgYSBwaXBlLgorICogU2hvdWxkIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCisKK3ZvaWQKK2V2YWxiYWNrY21kKHVuaW9uIG5vZGUgKm4sIHN0cnVjdCBiYWNrY21kICpyZXN1bHQpCit7CisJaW50IHNhdmVoZXJlZmQ7CisKKwlyZXN1bHQtPmZkID0gLTE7CisJcmVzdWx0LT5idWYgPSBOVUxMOworCXJlc3VsdC0+bmxlZnQgPSAwOworCXJlc3VsdC0+anAgPSBOVUxMOworCWlmIChuID09IE5VTEwpIHsKKwkJZ290byBvdXQ7CisJfQorCisJc2F2ZWhlcmVmZCA9IGhlcmVmZDsKKwloZXJlZmQgPSAtMTsKKworI2lmZGVmIG5vdHlldAorCS8qCisJICogRm9yIG5vdyB3ZSBkaXNhYmxlIGV4ZWN1dGluZyBidWlsdGlucyBpbiB0aGUgc2FtZQorCSAqIGNvbnRleHQgYXMgdGhlIHNoZWxsLCBiZWNhdXNlIHdlIGFyZSBub3Qga2VlcGluZworCSAqIGVub3VnaCBzdGF0ZSB0byByZWNvdmVyIGZyb20gY2hhbmdlcyB0aGF0IGFyZQorCSAqIHN1cHBvc2VkIG9ubHkgdG8gYWZmZWN0IHN1YnNoZWxscy4gZWcuIGVjaG8gImBjZCAvYCIKKwkgKi8KKwlpZiAobi0+dHlwZSA9PSBOQ01EKSB7CisJCXN0cnVjdCBpZnNyZWdpb24gc2F2ZWlmczsKKwkJc3RydWN0IGlmc3JlZ2lvbiAqc2F2ZWxhc3RwOworCQlzdHJ1Y3Qgbm9kZWxpc3QgKnNhdmVhcmdiYWNrcTsKKworCQlzYXZlaWZzID0gaWZzZmlyc3Q7CisJCXNhdmVsYXN0cCA9IGlmc2xhc3RwOworCQlzYXZlYXJnYmFja3EgPSBhcmdiYWNrcTsKKworCQlleGl0c3RhdHVzID0gb2V4aXRzdGF0dXM7CisJCWV2YWxjb21tYW5kKG4sIEVWX0JBQ0tDTUQsIHJlc3VsdCk7CisKKwkJaWZzZmlyc3QgPSBzYXZlaWZzOworCQlpZnNsYXN0cCA9IHNhdmVsYXN0cDsKKwkJYXJnYmFja3EgPSBzYXZlYXJnYmFja3E7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWludCBwaXBbMl07CisJCXN0cnVjdCBqb2IgKmpwOworCisJCWlmIChwaXBlKHBpcCkgPCAwKQorCQkJc2hfZXJyb3IoIlBpcGUgY2FsbCBmYWlsZWQiKTsKKwkJanAgPSBtYWtlam9iKG4sIDEpOworCQlpZiAoZm9ya3NoZWxsKGpwLCBuLCBGT1JLX05PSk9CKSA9PSAwKSB7CisJCQlGT1JDRUlOVE9OOworCQkJY2xvc2UocGlwWzBdKTsKKwkJCWlmIChwaXBbMV0gIT0gMSkgeworCQkJCWNsb3NlKDEpOworCQkJCWNvcHlmZChwaXBbMV0sIDEpOworCQkJCWNsb3NlKHBpcFsxXSk7CisJCQl9CisJCQllZmxhZyA9IDA7CisJCQlldmFsdHJlZW5yKG4sIEVWX0VYSVQpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWNsb3NlKHBpcFsxXSk7CisJCXJlc3VsdC0+ZmQgPSBwaXBbMF07CisJCXJlc3VsdC0+anAgPSBqcDsKKwl9CisJaGVyZWZkID0gc2F2ZWhlcmVmZDsKK291dDoKKwlUUkFDRSgoImV2YWxiYWNrY21kIGRvbmU6IGZkPSVkIGJ1Zj0weCV4IG5sZWZ0PSVkIGpwPTB4JXhcbiIsCisJCXJlc3VsdC0+ZmQsIHJlc3VsdC0+YnVmLCByZXN1bHQtPm5sZWZ0LCByZXN1bHQtPmpwKSk7Cit9CisKK3N0YXRpYyBjaGFyICoqCitwYXJzZV9jb21tYW5kX2FyZ3MoY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKipwYXRoKQoreworCWNoYXIgKmNwLCBjOworCisJZm9yICg7OykgeworCQljcCA9ICorK2FyZ3Y7CisJCWlmICghY3ApCisJCQlyZXR1cm4gMDsKKwkJaWYgKCpjcCsrICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAoIShjID0gKmNwKyspKQorCQkJYnJlYWs7CisJCWlmIChjID09ICctJyAmJiAhKmNwKSB7CisJCQlhcmd2Kys7CisJCQlicmVhazsKKwkJfQorCQlkbyB7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ3AnOgorCQkJCSpwYXRoID0gZGVmcGF0aDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogcnVuICd0eXBlY21kJyBmb3Igb3RoZXIgb3B0aW9ucyAqLworCQkJCXJldHVybiAwOworCQkJfQorCQl9IHdoaWxlICgoYyA9ICpjcCsrKSk7CisJfQorCXJldHVybiBhcmd2OworfQorCisKKworLyoKKyAqIEV4ZWN1dGUgYSBzaW1wbGUgY29tbWFuZC4KKyAqLworCitTVEFUSUMgdm9pZAorI2lmZGVmIG5vdHlldAorZXZhbGNvbW1hbmQodW5pb24gbm9kZSAqY21kLCBpbnQgZmxhZ3MsIHN0cnVjdCBiYWNrY21kICpiYWNrY21kKQorI2Vsc2UKK2V2YWxjb21tYW5kKHVuaW9uIG5vZGUgKmNtZCwgaW50IGZsYWdzKQorI2VuZGlmCit7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwl1bmlvbiBub2RlICphcmdwOworCXN0cnVjdCBhcmdsaXN0IGFyZ2xpc3Q7CisJc3RydWN0IGFyZ2xpc3QgdmFybGlzdDsKKwljaGFyICoqYXJndjsKKwlpbnQgYXJnYzsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisjaWZkZWYgbm90eWV0CisJaW50IHBpcFsyXTsKKyNlbmRpZgorCXN0cnVjdCBjbWRlbnRyeSBjbWRlbnRyeTsKKwlzdHJ1Y3Qgam9iICpqcDsKKwljaGFyICpsYXN0YXJnOworCWNvbnN0IGNoYXIgKnBhdGg7CisJaW50IHNwY2xibHRpbjsKKwlpbnQgZXhlY2NtZDsKKwlpbnQgc3RhdHVzOworCWNoYXIgKipuYXJndjsKKworCS8qIEZpcnN0IGV4cGFuZCB0aGUgYXJndW1lbnRzLiAqLworCVRSQUNFKCgiZXZhbGNvbW1hbmQoMHglbHgsICVkKSBjYWxsZWRcbiIsIChsb25nKWNtZCwgZmxhZ3MpKTsKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwliYWNrX2V4aXRzdGF0dXMgPSAwOworCisJY21kZW50cnkuY21kdHlwZSA9IENNREJVSUxUSU47CisJY21kZW50cnkudS5jbWQgPSAmYmx0aW47CisJdmFybGlzdC5sYXN0cCA9ICZ2YXJsaXN0Lmxpc3Q7CisJKnZhcmxpc3QubGFzdHAgPSBOVUxMOworCWFyZ2xpc3QubGFzdHAgPSAmYXJnbGlzdC5saXN0OworCSphcmdsaXN0Lmxhc3RwID0gTlVMTDsKKworCWFyZ2MgPSAwOworCWZvciAoYXJncCA9IGNtZC0+bmNtZC5hcmdzOyBhcmdwOyBhcmdwID0gYXJncC0+bmFyZy5uZXh0KSB7CisJCXN0cnVjdCBzdHJsaXN0ICoqc3BwOworCisJCXNwcCA9IGFyZ2xpc3QubGFzdHA7CisJCWV4cGFuZGFyZyhhcmdwLCAmYXJnbGlzdCwgRVhQX0ZVTEwgfCBFWFBfVElMREUpOworCQlmb3IgKHNwID0gKnNwcDsgc3A7IHNwID0gc3AtPm5leHQpCisJCQlhcmdjKys7CisJfQorCisJYXJndiA9IG5hcmd2ID0gc3RhbGxvYyhzaXplb2YgKGNoYXIgKikgKiAoYXJnYyArIDEpKTsKKwlmb3IgKHNwID0gYXJnbGlzdC5saXN0IDsgc3AgOyBzcCA9IHNwLT5uZXh0KSB7CisJCVRSQUNFKCgiZXZhbGNvbW1hbmQgYXJnOiAlc1xuIiwgc3AtPnRleHQpKTsKKwkJKm5hcmd2KysgPSBzcC0+dGV4dDsKKwl9CisJKm5hcmd2ID0gTlVMTDsKKworCWxhc3RhcmcgPSBOVUxMOworCWlmIChpZmxhZyAmJiBmdW5jbmVzdCA9PSAwICYmIGFyZ2MgPiAwKQorCQlsYXN0YXJnID0gbmFyZ3ZbLTFdOworCisJcHJldmVycm91dC5mZCA9IDI7CisJZXhwcmVkaXIoY21kLT5uY21kLnJlZGlyZWN0KTsKKwlzdGF0dXMgPSByZWRpcmVjdHNhZmUoY21kLT5uY21kLnJlZGlyZWN0LCBSRURJUl9QVVNIfFJFRElSX1NBVkVGRDIpOworCisJcGF0aCA9IHZwYXRoLnRleHQ7CisJZm9yIChhcmdwID0gY21kLT5uY21kLmFzc2lnbjsgYXJncDsgYXJncCA9IGFyZ3AtPm5hcmcubmV4dCkgeworCQlzdHJ1Y3Qgc3RybGlzdCAqKnNwcDsKKwkJY2hhciAqcDsKKworCQlzcHAgPSB2YXJsaXN0Lmxhc3RwOworCQlleHBhbmRhcmcoYXJncCwgJnZhcmxpc3QsIEVYUF9WQVJUSUxERSk7CisKKwkJLyoKKwkJICogTW9kaWZ5IHRoZSBjb21tYW5kIGxvb2t1cCBwYXRoLCBpZiBhIFBBVEg9IGFzc2lnbm1lbnQKKwkJICogaXMgcHJlc2VudAorCQkgKi8KKwkJcCA9ICgqc3BwKS0+dGV4dDsKKwkJaWYgKHZhcmVxdWFsKHAsIHBhdGgpKQorCQkJcGF0aCA9IHA7CisJfQorCisJLyogUHJpbnQgdGhlIGNvbW1hbmQgaWYgeGZsYWcgaXMgc2V0LiAqLworCWlmICh4ZmxhZykgeworCQlzdHJ1Y3Qgb3V0cHV0ICpvdXQ7CisJCWludCBzZXA7CisKKwkJb3V0ID0gJnByZXZlcnJvdXQ7CisJCW91dHN0cihleHBhbmRzdHIocHM0dmFsKCkpLCBvdXQpOworCQlzZXAgPSAwOworCQlzZXAgPSBlcHJpbnRsaXN0KG91dCwgdmFybGlzdC5saXN0LCBzZXApOworCQllcHJpbnRsaXN0KG91dCwgYXJnbGlzdC5saXN0LCBzZXApOworCQlvdXRjc2xvdygnXG4nLCBvdXQpOworI2lmZGVmIEZMVVNIRVJSCisJCWZsdXNob3V0KG91dCk7CisjZW5kaWYKKwl9CisKKwlleGVjY21kID0gMDsKKwlzcGNsYmx0aW4gPSAtMTsKKworCS8qIE5vdyBsb2NhdGUgdGhlIGNvbW1hbmQuICovCisJaWYgKGFyZ2MpIHsKKwkJY29uc3QgY2hhciAqb2xkcGF0aDsKKwkJaW50IGNtZF9mbGFnID0gRE9fRVJSOworCisJCXBhdGggKz0gNTsKKwkJb2xkcGF0aCA9IHBhdGg7CisJCWZvciAoOzspIHsKKwkJCWZpbmRfY29tbWFuZChhcmd2WzBdLCAmY21kZW50cnksIGNtZF9mbGFnLCBwYXRoKTsKKwkJCWlmIChjbWRlbnRyeS5jbWR0eXBlID09IENNRFVOS05PV04pIHsKKwkJCQlzdGF0dXMgPSAxMjc7CisjaWZkZWYgRkxVU0hFUlIKKwkJCQlmbHVzaG91dCgmZXJyb3V0KTsKKyNlbmRpZgorCQkJCWdvdG8gYmFpbDsKKwkJCX0KKworCQkJLyogaW1wbGVtZW50IGJsdGluIGFuZCBjb21tYW5kIGhlcmUgKi8KKwkJCWlmIChjbWRlbnRyeS5jbWR0eXBlICE9IENNREJVSUxUSU4pCisJCQkJYnJlYWs7CisJCQlpZiAoc3BjbGJsdGluIDwgMCkKKwkJCQlzcGNsYmx0aW4gPQorCQkJCQljbWRlbnRyeS51LmNtZC0+ZmxhZ3MgJgorCQkJCQlCVUlMVElOX1NQRUNJQUwKKwkJCQk7CisJCQlpZiAoY21kZW50cnkudS5jbWQgPT0gRVhFQ0NNRCkKKwkJCQlleGVjY21kKys7CisJCQlpZiAoY21kZW50cnkudS5jbWQgIT0gQ09NTUFORENNRCkKKwkJCQlicmVhazsKKworCQkJcGF0aCA9IG9sZHBhdGg7CisJCQluYXJndiA9IHBhcnNlX2NvbW1hbmRfYXJncyhhcmd2LCAmcGF0aCk7CisJCQlpZiAoIW5hcmd2KQorCQkJCWJyZWFrOworCQkJYXJnYyAtPSBuYXJndiAtIGFyZ3Y7CisJCQlhcmd2ID0gbmFyZ3Y7CisJCQljbWRfZmxhZyB8PSBET19OT0ZVTkM7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCS8qIFdlIGhhdmUgYSByZWRpcmVjdGlvbiBlcnJvci4gKi8KKwkJaWYgKHNwY2xibHRpbiA+IDApCisJCQlleHJhaXNlKEVYRVJST1IpOworYmFpbDoKKwkJZXhpdHN0YXR1cyA9IHN0YXR1czsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRXhlY3V0ZSB0aGUgY29tbWFuZC4gKi8KKwlzd2l0Y2ggKGNtZGVudHJ5LmNtZHR5cGUpIHsKKwlkZWZhdWx0OgorCQkvKiBGb3JrIG9mZiBhIGNoaWxkIHByb2Nlc3MgaWYgbmVjZXNzYXJ5LiAqLworCQlpZiAoIShmbGFncyAmIEVWX0VYSVQpIHx8IHRyYXBbMF0pIHsKKwkJCUlOVE9GRjsKKwkJCWpwID0gbWFrZWpvYihjbWQsIDEpOworCQkJaWYgKGZvcmtzaGVsbChqcCwgY21kLCBGT1JLX0ZHKSAhPSAwKSB7CisJCQkJZXhpdHN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCQkJCUlOVE9OOworCQkJCWJyZWFrOworCQkJfQorCQkJRk9SQ0VJTlRPTjsKKwkJfQorCQlsaXN0c2V0dmFyKHZhcmxpc3QubGlzdCwgVkVYUE9SVHxWU1RBQ0spOworCQlzaGVsbGV4ZWMoYXJndiwgcGF0aCwgY21kZW50cnkudS5pbmRleCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgQ01EQlVJTFRJTjoKKwkJY21kZW52aXJvbiA9IHZhcmxpc3QubGlzdDsKKwkJaWYgKGNtZGVudmlyb24pIHsKKwkJCXN0cnVjdCBzdHJsaXN0ICpsaXN0ID0gY21kZW52aXJvbjsKKwkJCWludCBpID0gVk5PU0VUOworCQkJaWYgKHNwY2xibHRpbiA+IDAgfHwgYXJnYyA9PSAwKSB7CisJCQkJaSA9IDA7CisJCQkJaWYgKGV4ZWNjbWQgJiYgYXJnYyA+IDEpCisJCQkJCWkgPSBWRVhQT1JUOworCQkJfQorCQkJbGlzdHNldHZhcihsaXN0LCBpKTsKKwkJfQorCQlpZiAoZXZhbGJsdGluKGNtZGVudHJ5LnUuY21kLCBhcmdjLCBhcmd2KSkgeworCQkJaW50IHN0YXR1czsKKwkJCWludCBpLCBqOworCisJCQlpID0gZXhjZXB0aW9uOworCQkJaWYgKGkgPT0gRVhFWElUKQorCQkJCWdvdG8gcmFpc2U7CisKKwkJCXN0YXR1cyA9IDI7CisJCQlqID0gMDsKKwkJCWlmIChpID09IEVYSU5UKQorCQkJCWogPSBTSUdJTlQ7CisJCQlpZiAoaSA9PSBFWFNJRykKKwkJCQlqID0gcGVuZGluZ3NpZ3M7CisJCQlpZiAoaikKKwkJCQlzdGF0dXMgPSBqICsgMTI4OworCQkJZXhpdHN0YXR1cyA9IHN0YXR1czsKKworCQkJaWYgKGkgPT0gRVhJTlQgfHwgc3BjbGJsdGluID4gMCkgeworcmFpc2U6CisJCQkJbG9uZ2ptcChoYW5kbGVyLT5sb2MsIDEpOworCQkJfQorCQkJRk9SQ0VJTlRPTjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ01ERlVOQ1RJT046CisJCWxpc3RzZXR2YXIodmFybGlzdC5saXN0LCAwKTsKKwkJaWYgKGV2YWxmdW4oY21kZW50cnkudS5mdW5jLCBhcmdjLCBhcmd2LCBmbGFncykpCisJCQlnb3RvIHJhaXNlOworCQlicmVhazsKKwl9CisKK291dDoKKwlwb3ByZWRpcihleGVjY21kKTsKKwlpZiAobGFzdGFyZykKKwkJLyogZHNsOiBJIHRoaW5rIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBzdXBwb3J0CisJCSAqICdfJyBpbiAndmknIGNvbW1hbmQgbW9kZSBkdXJpbmcgbGluZSBlZGl0aW5nLi4uCisJCSAqIEhvd2V2ZXIgSSBpbXBsZW1lbnRlZCB0aGF0IHdpdGhpbiBsaWJlZGl0IGl0c2VsZi4KKwkJICovCisJCXNldHZhcigiXyIsIGxhc3RhcmcsIDApOworCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCitTVEFUSUMgaW50CitldmFsYmx0aW4oY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisJY2hhciAqdm9sYXRpbGUgc2F2ZWNtZG5hbWU7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXI7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisJaW50IGk7CisKKwlzYXZlY21kbmFtZSA9IGNvbW1hbmRuYW1lOworCWlmICgoaSA9IHNldGptcChqbXBsb2MubG9jKSkpCisJCWdvdG8gY21kZG9uZTsKKwlzYXZlaGFuZGxlciA9IGhhbmRsZXI7CisJaGFuZGxlciA9ICZqbXBsb2M7CisJY29tbWFuZG5hbWUgPSBhcmd2WzBdOworCWFyZ3B0ciA9IGFyZ3YgKyAxOworCW9wdHB0ciA9IE5VTEw7CQkJLyogaW5pdGlhbGl6ZSBuZXh0b3B0ICovCisJZXhpdHN0YXR1cyA9ICgqY21kLT5idWlsdGluKShhcmdjLCBhcmd2KTsKKwlmbHVzaGFsbCgpOworY21kZG9uZToKKwlleGl0c3RhdHVzIHw9IG91dGVycihvdXQxKTsKKwlmcmVlc3Rkb3V0KCk7CisJY29tbWFuZG5hbWUgPSBzYXZlY21kbmFtZTsKKwlleHNpZyA9IDA7CisJaGFuZGxlciA9IHNhdmVoYW5kbGVyOworCisJcmV0dXJuIGk7Cit9CisKK1NUQVRJQyBpbnQKK2V2YWxmdW4oc3RydWN0IGZ1bmNub2RlICpmdW5jLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBmbGFncykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2hwYXJhbSBzYXZlcGFyYW07CisJc3RydWN0IGxvY2FsdmFyICp2b2xhdGlsZSBzYXZlbG9jYWx2YXJzOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCWludCBlOworCisJc2F2ZXBhcmFtID0gc2hlbGxwYXJhbTsKKwlzYXZlbG9jYWx2YXJzID0gbG9jYWx2YXJzOworCWlmICgoZSA9IHNldGptcChqbXBsb2MubG9jKSkpIHsKKwkJZ290byBmdW5jZG9uZTsKKwl9CisJSU5UT0ZGOworCXNhdmVoYW5kbGVyID0gaGFuZGxlcjsKKwloYW5kbGVyID0gJmptcGxvYzsKKwlsb2NhbHZhcnMgPSBOVUxMOworCXNoZWxscGFyYW0ubWFsbG9jID0gMDsKKwlmdW5jLT5jb3VudCsrOworCWZ1bmNuZXN0Kys7CisJSU5UT047CisJc2hlbGxwYXJhbS5ucGFyYW0gPSBhcmdjIC0gMTsKKwlzaGVsbHBhcmFtLnAgPSBhcmd2ICsgMTsKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKwlldmFsdHJlZSgmZnVuYy0+biwgZmxhZ3MgJiBFVl9URVNURUQpOworZnVuY2RvbmU6CisJSU5UT0ZGOworCWZ1bmNuZXN0LS07CisJZnJlZWZ1bmMoZnVuYyk7CisJcG9wbG9jYWx2YXJzKCk7CisJbG9jYWx2YXJzID0gc2F2ZWxvY2FsdmFyczsKKwlmcmVlcGFyYW0oJnNoZWxscGFyYW0pOworCXNoZWxscGFyYW0gPSBzYXZlcGFyYW07CisJaGFuZGxlciA9IHNhdmVoYW5kbGVyOworCUlOVE9OOworCWV2YWxza2lwICY9IH5TS0lQRlVOQzsKKwlyZXR1cm4gZTsKK30KKworCisvKgorICogU2VhcmNoIGZvciBhIGNvbW1hbmQuICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgd2UgZm9yayBzbyB0aGF0IHRoZQorICogbG9jYXRpb24gb2YgdGhlIGNvbW1hbmQgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIHBhcmVudCBhcyB3ZWxsIGFzCisgKiB0aGUgY2hpbGQuICBUaGUgY2hlY2sgZm9yICJnb29kbmFtZSIgaXMgYW4gb3Zlcmx5IGNvbnNlcnZhdGl2ZQorICogY2hlY2sgdGhhdCB0aGUgbmFtZSB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGV4cGFuc2lvbi4KKyAqLworCitTVEFUSUMgdm9pZAorcHJlaGFzaCh1bmlvbiBub2RlICpuKQoreworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKworCWlmIChuLT50eXBlID09IE5DTUQgJiYgbi0+bmNtZC5hcmdzKQorCQlpZiAoZ29vZG5hbWUobi0+bmNtZC5hcmdzLT5uYXJnLnRleHQpKQorCQkJZmluZF9jb21tYW5kKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0LCAmZW50cnksIDAsCisJCQkJICAgICBwYXRodmFsKCkpOworfQorCisKKworLyoKKyAqIEJ1aWx0aW4gY29tbWFuZHMuICBCdWlsdGluIGNvbW1hbmRzIHdob3NlIGZ1bmN0aW9ucyBhcmUgY2xvc2VseQorICogdGllZCB0byBldmFsdWF0aW9uIGFyZSBpbXBsZW1lbnRlZCBoZXJlLgorICovCisKKy8qCisgKiBObyBjb21tYW5kIGdpdmVuLgorICovCisKK1NUQVRJQyBpbnQKK2JsdGluY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKgorCSAqIFByZXNlcnZlIGV4aXRzdGF0dXMgb2YgYSBwcmV2aW91cyBwb3NzaWJsZSByZWRpcmVjdGlvbgorCSAqIGFzIFBPU0lYIG1hbmRhdGVzCisJICovCisJcmV0dXJuIGJhY2tfZXhpdHN0YXR1czsKK30KKworCisvKgorICogSGFuZGxlIGJyZWFrIGFuZCBjb250aW51ZSBjb21tYW5kcy4gIEJyZWFrLCBjb250aW51ZSwgYW5kIHJldHVybiBhcmUKKyAqIGFsbCBoYW5kbGVkIGJ5IHNldHRpbmcgdGhlIGV2YWxza2lwIGZsYWcuICBUaGUgZXZhbHVhdGlvbiByb3V0aW5lcworICogYWJvdmUgYWxsIGNoZWNrIHRoaXMgZmxhZywgYW5kIGlmIGl0IGlzIHNldCB0aGV5IHN0YXJ0IHNraXBwaW5nCisgKiBjb21tYW5kcyByYXRoZXIgdGhhbiBleGVjdXRpbmcgdGhlbS4gIFRoZSB2YXJpYWJsZSBza2lwY291bnQgaXMKKyAqIHRoZSBudW1iZXIgb2YgbG9vcHMgdG8gYnJlYWsvY29udGludWUsIG9yIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24KKyAqIGxldmVscyB0byByZXR1cm4uICAoVGhlIGxhdHRlciBpcyBhbHdheXMgMS4pICBJdCBzaG91bGQgcHJvYmFibHkKKyAqIGJlIGFuIGVycm9yIHRvIGJyZWFrIG91dCBvZiBtb3JlIGxvb3BzIHRoYW4gZXhpc3QsIGJ1dCBpdCBpc24ndAorICogaW4gdGhlIHN0YW5kYXJkIHNoZWxsIHNvIHdlIGRvbid0IG1ha2UgaXQgb25lIGhlcmUuCisgKi8KKworaW50CiticmVha2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG4gPSBhcmdjID4gMSA/IG51bWJlcihhcmd2WzFdKSA6IDE7CisKKwlpZiAobiA8PSAwKQorCQlzaF9lcnJvcihpbGxudW0sIGFyZ3ZbMV0pOworCWlmIChuID4gbG9vcG5lc3QpCisJCW4gPSBsb29wbmVzdDsKKwlpZiAobiA+IDApIHsKKwkJZXZhbHNraXAgPSAoKiphcmd2ID09ICdjJyk/IFNLSVBDT05UIDogU0tJUEJSRUFLOworCQlza2lwY291bnQgPSBuOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVGhlIHJldHVybiBjb21tYW5kLgorICovCisKK2ludAorcmV0dXJuY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKgorCSAqIElmIGNhbGxlZCBvdXRzaWRlIGEgZnVuY3Rpb24sIGRvIHdoYXQga3NoIGRvZXM7CisJICogc2tpcCB0aGUgcmVzdCBvZiB0aGUgZmlsZS4KKwkgKi8KKwlldmFsc2tpcCA9IGZ1bmNuZXN0ID8gU0tJUEZVTkMgOiBTS0lQRklMRTsKKwlyZXR1cm4gYXJndlsxXSA/IG51bWJlcihhcmd2WzFdKSA6IGV4aXRzdGF0dXM7Cit9CisKKworaW50CitmYWxzZWNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIDE7Cit9CisKKworaW50Cit0cnVlY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gMDsKK30KKworCitpbnQKK2V4ZWNjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjID4gMSkgeworCQlpZmxhZyA9IDA7CQkvKiBleGl0IG9uIGVycm9yICovCisJCW1mbGFnID0gMDsKKwkJb3B0c2NoYW5nZWQoKTsKKwkJc2hlbGxleGVjKGFyZ3YgKyAxLCBwYXRodmFsKCksIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworCitTVEFUSUMgaW50CitlcHJpbnRsaXN0KHN0cnVjdCBvdXRwdXQgKm91dCwgc3RydWN0IHN0cmxpc3QgKnNwLCBpbnQgc2VwKQoreworCXdoaWxlIChzcCkgeworCQljb25zdCBjaGFyICpwOworCisJCXAgPSAiICVzIiArICgxIC0gc2VwKTsKKwkJc2VwIHw9IDE7CisJCW91dGZtdChvdXQsIHAsIHNwLT50ZXh0KTsKKwkJc3AgPSBzcC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gc2VwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZXZhbC5oIGIvdXNyL2Rhc2gvZXZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTYyMGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ldmFsLmgKQEAgLTAsMCArMSw2MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylldmFsLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworZXh0ZXJuIGNoYXIgKmNvbW1hbmRuYW1lOwkvKiBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQgKi8KK2V4dGVybiBpbnQgZXhpdHN0YXR1czsJCS8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgY29tbWFuZCAqLworZXh0ZXJuIGludCBiYWNrX2V4aXRzdGF0dXM7CS8qIGV4aXQgc3RhdHVzIG9mIGJhY2txdW90ZWQgY29tbWFuZCAqLworZXh0ZXJuIHN0cnVjdCBzdHJsaXN0ICpjbWRlbnZpcm9uOyAgLyogZW52aXJvbm1lbnQgZm9yIGJ1aWx0aW4gY29tbWFuZCAqLworCisKK3N0cnVjdCBiYWNrY21kIHsJCS8qIHJlc3VsdCBvZiBldmFsYmFja2NtZCAqLworCWludCBmZDsJCQkvKiBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBmcm9tICovCisJY2hhciAqYnVmOwkJLyogYnVmZmVyICovCisJaW50IG5sZWZ0OwkJLyogbnVtYmVyIG9mIGNoYXJzIGluIGJ1ZmZlciAqLworCXN0cnVjdCBqb2IgKmpwOwkJLyogam9iIHN0cnVjdHVyZSBmb3IgY29tbWFuZCAqLworfTsKKworaW50IGV2YWxzdHJpbmcoY2hhciAqLCBpbnQpOwordW5pb24gbm9kZTsJLyogQkxFVENIIGZvciBhbnNpIEMgKi8KK3ZvaWQgZXZhbHRyZWUodW5pb24gbm9kZSAqLCBpbnQpOwordm9pZCBldmFsYmFja2NtZCh1bmlvbiBub2RlICosIHN0cnVjdCBiYWNrY21kICopOworCitleHRlcm4gaW50IGV2YWxza2lwOworCisvKiByZWFzb25zIGZvciBza2lwcGluZyBjb21tYW5kcyAoc2VlIGNvbW1lbnQgb24gYnJlYWtjbWQgcm91dGluZSkgKi8KKyNkZWZpbmUgU0tJUEJSRUFLCSgxIDw8IDApCisjZGVmaW5lIFNLSVBDT05UCSgxIDw8IDEpCisjZGVmaW5lIFNLSVBGVU5DCSgxIDw8IDIpCisjZGVmaW5lIFNLSVBGSUxFCSgxIDw8IDMpCisjZGVmaW5lIFNLSVBFVkFMCSgxIDw8IDQpCmRpZmYgLS1naXQgYS91c3IvZGFzaC9leGVjLmMgYi91c3IvZGFzaC9leGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3YmE4YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2V4ZWMuYwpAQCAtMCwwICsxLDg2OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cGF0aHMuaD4KKworLyoKKyAqIFdoZW4gY29tbWFuZHMgYXJlIGZpcnN0IGVuY291bnRlcmVkLCB0aGV5IGFyZSBlbnRlcmVkIGluIGEgaGFzaCB0YWJsZS4KKyAqIFRoaXMgZW5zdXJlcyB0aGF0IGEgZnVsbCBwYXRoIHNlYXJjaCB3aWxsIG5vdCBoYXZlIHRvIGJlIGRvbmUgZm9yIHRoZW0KKyAqIG9uIGVhY2ggaW52b2NhdGlvbi4KKyAqCisgKiBXZSBzaG91bGQgaW52ZXN0aWdhdGUgY29udmVydGluZyB0byBhIGxpbmVhciBzZWFyY2gsIGV2ZW4gdGhvdWdoIHRoYXQKKyAqIHdvdWxkIG1ha2UgdGhlIGNvbW1hbmQgbmFtZSAiaGFzaCIgYSBtaXNub21lci4KKyAqLworCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibm9kZXMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJyZWRpci5oIgorI2luY2x1ZGUgImV2YWwuaCIKKyNpbmNsdWRlICJleGVjLmgiCisjaW5jbHVkZSAiYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAic3ludGF4LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgImluaXQuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgInNob3cuaCIKKyNpbmNsdWRlICJqb2JzLmgiCisjaW5jbHVkZSAiYWxpYXMuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworCisjZGVmaW5lIENNRFRBQkxFU0laRSAzMQkJLyogc2hvdWxkIGJlIHByaW1lICovCisjZGVmaW5lIEFSQiAxCQkJLyogYWN0dWFsIHNpemUgZGV0ZXJtaW5lZCBhdCBydW4gdGltZSAqLworCisKKworc3RydWN0IHRibGVudHJ5IHsKKwlzdHJ1Y3QgdGJsZW50cnkgKm5leHQ7CS8qIG5leHQgZW50cnkgaW4gaGFzaCBjaGFpbiAqLworCXVuaW9uIHBhcmFtIHBhcmFtOwkvKiBkZWZpbml0aW9uIG9mIGJ1aWx0aW4gZnVuY3Rpb24gKi8KKwlzaG9ydCBjbWR0eXBlOwkJLyogaW5kZXggaWRlbnRpZnlpbmcgY29tbWFuZCAqLworCWNoYXIgcmVoYXNoOwkJLyogaWYgc2V0LCBjZCBkb25lIHNpbmNlIGVudHJ5IGNyZWF0ZWQgKi8KKwljaGFyIGNtZG5hbWVbQVJCXTsJLyogbmFtZSBvZiBjb21tYW5kICovCit9OworCisKK1NUQVRJQyBzdHJ1Y3QgdGJsZW50cnkgKmNtZHRhYmxlW0NNRFRBQkxFU0laRV07CitTVEFUSUMgaW50IGJ1aWx0aW5sb2MgPSAtMTsJCS8qIGluZGV4IGluIHBhdGggb2YgJWJ1aWx0aW4sIG9yIC0xICovCisKKworU1RBVElDIHZvaWQgdHJ5ZXhlYyhjaGFyICosIGNoYXIgKiosIGNoYXIgKiopOworU1RBVElDIHZvaWQgcHJpbnRlbnRyeShzdHJ1Y3QgdGJsZW50cnkgKik7CitTVEFUSUMgdm9pZCBjbGVhcmNtZGVudHJ5KGludCk7CitTVEFUSUMgc3RydWN0IHRibGVudHJ5ICpjbWRsb29rdXAoY29uc3QgY2hhciAqLCBpbnQpOworU1RBVElDIHZvaWQgZGVsZXRlX2NtZF9lbnRyeSh2b2lkKTsKK1NUQVRJQyB2b2lkIGFkZGNtZGVudHJ5KGNoYXIgKiwgc3RydWN0IGNtZGVudHJ5ICopOworU1RBVElDIGludCBkZXNjcmliZV9jb21tYW5kKHN0cnVjdCBvdXRwdXQgKiwgY2hhciAqLCBpbnQpOworCisKKy8qCisgKiBFeGVjIGEgcHJvZ3JhbS4gIE5ldmVyIHJldHVybnMuICBJZiB5b3UgY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IG1heQorICogaGF2ZSB0byBjaGFuZ2UgdGhlIGZpbmRfY29tbWFuZCByb3V0aW5lIGFzIHdlbGwuCisgKi8KKwordm9pZAorc2hlbGxleGVjKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwYXRoLCBpbnQgaWR4KQoreworCWNoYXIgKmNtZG5hbWU7CisJaW50IGU7CisJY2hhciAqKmVudnA7CisJaW50IGV4ZXJybm87CisKKwljbGVhcnJlZGlyKDEpOworCWVudnAgPSBlbnZpcm9ubWVudCgpOworCWlmIChzdHJjaHIoYXJndlswXSwgJy8nKSAhPSBOVUxMKSB7CisJCXRyeWV4ZWMoYXJndlswXSwgYXJndiwgZW52cCk7CisJCWUgPSBlcnJubzsKKwl9IGVsc2UgeworCQllID0gRU5PRU5UOworCQl3aGlsZSAoKGNtZG5hbWUgPSBwYWR2YW5jZSgmcGF0aCwgYXJndlswXSkpICE9IE5VTEwpIHsKKwkJCWlmICgtLWlkeCA8IDAgJiYgcGF0aG9wdCA9PSBOVUxMKSB7CisJCQkJdHJ5ZXhlYyhjbWRuYW1lLCBhcmd2LCBlbnZwKTsKKwkJCQlpZiAoZXJybm8gIT0gRU5PRU5UICYmIGVycm5vICE9IEVOT1RESVIpCisJCQkJCWUgPSBlcnJubzsKKwkJCX0KKwkJCXN0dW5hbGxvYyhjbWRuYW1lKTsKKwkJfQorCX0KKworCS8qIE1hcCB0byBQT1NJWCBlcnJvcnMgKi8KKwlzd2l0Y2ggKGUpIHsKKwljYXNlIEVBQ0NFUzoKKwkJZXhlcnJubyA9IDEyNjsKKwkJYnJlYWs7CisJY2FzZSBFTk9FTlQ6CisJCWV4ZXJybm8gPSAxMjc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWV4ZXJybm8gPSAyOworCQlicmVhazsKKwl9CisJZXhpdHN0YXR1cyA9IGV4ZXJybm87CisJVFJBQ0UoKCJzaGVsbGV4ZWMgZmFpbGVkIGZvciAlcywgZXJybm8gJWQsIHN1cHByZXNzaW50ICVkXG4iLAorCQlhcmd2WzBdLCBlLCBzdXBwcmVzc2ludCApKTsKKwlleGVycm9yKEVYRVhFQywgIiVzOiAlcyIsIGFyZ3ZbMF0sIGVycm1zZyhlLCBFX0VYRUMpKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworU1RBVElDIHZvaWQKK3RyeWV4ZWMoY2hhciAqY21kLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJaW50IHJlcGVhdGVkID0gMDsKKyNpZiAhZGVmaW5lZChCU0QpICYmICFkZWZpbmVkKGxpbnV4KQorCWNoYXIgKnA7CisjZW5kaWYKKworcmVwZWF0OgorI2lmZGVmIFNZU1YKKwlkbyB7CisJCWV4ZWN2ZShjbWQsIGFyZ3YsIGVudnApOworCX0gd2hpbGUgKGVycm5vID09IEVJTlRSKTsKKyNlbHNlCisJZXhlY3ZlKGNtZCwgYXJndiwgZW52cCk7CisjZW5kaWYKKwlpZiAocmVwZWF0ZWQrKykgeworCQlja2ZyZWUoYXJndik7CisJfSBlbHNlIGlmIChlcnJubyA9PSBFTk9FWEVDKSB7CisJCWNoYXIgKiphcDsKKwkJY2hhciAqKm5ldzsKKworCQlmb3IgKGFwID0gYXJndjsgKmFwOyBhcCsrKQorCQkJOworCQlhcCA9IG5ldyA9IGNrbWFsbG9jKChhcCAtIGFyZ3YgKyAyKSAqIHNpemVvZihjaGFyICopKTsKKwkJKmFwKysgPSBjbWQgPSBfUEFUSF9CU0hFTEw7CisJCXdoaWxlICgoKmFwKysgPSAqYXJndisrKSkKKwkJCTsKKwkJYXJndiA9IG5ldzsKKwkJZ290byByZXBlYXQ7CisJfQorfQorCisKKworLyoKKyAqIERvIGEgcGF0aCBzZWFyY2guICBUaGUgdmFyaWFibGUgcGF0aCAocGFzc2VkIGJ5IHJlZmVyZW5jZSkgc2hvdWxkIGJlCisgKiBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYXRoIGJlZm9yZSB0aGUgZmlyc3QgY2FsbDsgcGFkdmFuY2Ugd2lsbCB1cGRhdGUKKyAqIHRoaXMgdmFsdWUgYXMgaXQgcHJvY2VlZHMuICBTdWNjZXNzaXZlIGNhbGxzIHRvIHBhZHZhbmNlIHdpbGwgcmV0dXJuCisgKiB0aGUgcG9zc2libGUgcGF0aCBleHBhbnNpb25zIGluIHNlcXVlbmNlLiAgSWYgYW4gb3B0aW9uIChpbmRpY2F0ZWQgYnkKKyAqIGEgcGVyY2VudCBzaWduKSBhcHBlYXJzIGluIHRoZSBwYXRoIGVudHJ5IHRoZW4gdGhlIGdsb2JhbCB2YXJpYWJsZQorICogcGF0aG9wdCB3aWxsIGJlIHNldCB0byBwb2ludCB0byBpdDsgb3RoZXJ3aXNlIHBhdGhvcHQgd2lsbCBiZSBzZXQgdG8KKyAqIE5VTEwuCisgKi8KKworY29uc3QgY2hhciAqcGF0aG9wdDsKKworY2hhciAqCitwYWR2YW5jZShjb25zdCBjaGFyICoqcGF0aCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBjaGFyICpwOworCWNoYXIgKnE7CisJY29uc3QgY2hhciAqc3RhcnQ7CisJc2l6ZV90IGxlbjsKKworCWlmICgqcGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlzdGFydCA9ICpwYXRoOworCWZvciAocCA9IHN0YXJ0IDsgKnAgJiYgKnAgIT0gJzonICYmICpwICE9ICclJyA7IHArKyk7CisJbGVuID0gcCAtIHN0YXJ0ICsgc3RybGVuKG5hbWUpICsgMjsJLyogIjIiIGlzIGZvciAnLycgYW5kICdcMCcgKi8KKwl3aGlsZSAoc3RhY2tibG9ja3NpemUoKSA8IGxlbikKKwkJZ3Jvd3N0YWNrYmxvY2soKTsKKwlxID0gc3RhY2tibG9jaygpOworCWlmIChwICE9IHN0YXJ0KSB7CisJCW1lbWNweShxLCBzdGFydCwgcCAtIHN0YXJ0KTsKKwkJcSArPSBwIC0gc3RhcnQ7CisJCSpxKysgPSAnLyc7CisJfQorCXN0cmNweShxLCBuYW1lKTsKKwlwYXRob3B0ID0gTlVMTDsKKwlpZiAoKnAgPT0gJyUnKSB7CisJCXBhdGhvcHQgPSArK3A7CisJCXdoaWxlICgqcCAmJiAqcCAhPSAnOicpICBwKys7CisJfQorCWlmICgqcCA9PSAnOicpCisJCSpwYXRoID0gcCArIDE7CisJZWxzZQorCQkqcGF0aCA9IE5VTEw7CisJcmV0dXJuIHN0YWxsb2MobGVuKTsKK30KKworCisKKy8qKiogQ29tbWFuZCBoYXNoaW5nIGNvZGUgKioqLworCisKK2ludAoraGFzaGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHRibGVudHJ5ICoqcHA7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCWludCBjOworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKwljaGFyICpuYW1lOworCisJd2hpbGUgKChjID0gbmV4dG9wdCgiciIpKSAhPSAnXDAnKSB7CisJCWNsZWFyY21kZW50cnkoMCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKmFyZ3B0ciA9PSBOVUxMKSB7CisJCWZvciAocHAgPSBjbWR0YWJsZSA7IHBwIDwgJmNtZHRhYmxlW0NNRFRBQkxFU0laRV0gOyBwcCsrKSB7CisJCQlmb3IgKGNtZHAgPSAqcHAgOyBjbWRwIDsgY21kcCA9IGNtZHAtPm5leHQpIHsKKwkJCQlpZiAoY21kcC0+Y21kdHlwZSA9PSBDTUROT1JNQUwpCisJCQkJCXByaW50ZW50cnkoY21kcCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWMgPSAwOworCXdoaWxlICgobmFtZSA9ICphcmdwdHIpICE9IE5VTEwpIHsKKwkJaWYgKChjbWRwID0gY21kbG9va3VwKG5hbWUsIDApKSAhPSBOVUxMCisJCSAmJiAoY21kcC0+Y21kdHlwZSA9PSBDTUROT1JNQUwKKwkJICAgICB8fCAoY21kcC0+Y21kdHlwZSA9PSBDTURCVUlMVElOICYmIGJ1aWx0aW5sb2MgPj0gMCkpKQorCQkJZGVsZXRlX2NtZF9lbnRyeSgpOworCQlmaW5kX2NvbW1hbmQobmFtZSwgJmVudHJ5LCBET19FUlIsIHBhdGh2YWwoKSk7CisJCWlmIChlbnRyeS5jbWR0eXBlID09IENNRFVOS05PV04pCisJCQljID0gMTsKKwkJYXJncHRyKys7CisJfQorCXJldHVybiBjOworfQorCisKK1NUQVRJQyB2b2lkCitwcmludGVudHJ5KHN0cnVjdCB0YmxlbnRyeSAqY21kcCkKK3sKKwlpbnQgaWR4OworCWNvbnN0IGNoYXIgKnBhdGg7CisJY2hhciAqbmFtZTsKKworCWlkeCA9IGNtZHAtPnBhcmFtLmluZGV4OworCXBhdGggPSBwYXRodmFsKCk7CisJZG8geworCQluYW1lID0gcGFkdmFuY2UoJnBhdGgsIGNtZHAtPmNtZG5hbWUpOworCQlzdHVuYWxsb2MobmFtZSk7CisJfSB3aGlsZSAoLS1pZHggPj0gMCk7CisJb3V0MXN0cihuYW1lKTsKKwlvdXQxZm10KHNubGZtdCwgY21kcC0+cmVoYXNoID8gIioiIDogbnVsbHN0cik7Cit9CisKKworCisvKgorICogUmVzb2x2ZSBhIGNvbW1hbmQgbmFtZS4gIElmIHlvdSBjaGFuZ2UgdGhpcyByb3V0aW5lLCB5b3UgbWF5IGhhdmUgdG8KKyAqIGNoYW5nZSB0aGUgc2hlbGxleGVjIHJvdXRpbmUgYXMgd2VsbC4KKyAqLworCit2b2lkCitmaW5kX2NvbW1hbmQoY2hhciAqbmFtZSwgc3RydWN0IGNtZGVudHJ5ICplbnRyeSwgaW50IGFjdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisJaW50IGlkeDsKKwlpbnQgcHJldjsKKwljaGFyICpmdWxsbmFtZTsKKwlzdHJ1Y3Qgc3RhdDY0IHN0YXRiOworCWludCBlOworCWludCB1cGRhdGV0Ymw7CisJc3RydWN0IGJ1aWx0aW5jbWQgKmJjbWQ7CisKKwkvKiBJZiBuYW1lIGNvbnRhaW5zIGEgc2xhc2gsIGRvbid0IHVzZSBQQVRIIG9yIGhhc2ggdGFibGUgKi8KKwlpZiAoc3RyY2hyKG5hbWUsICcvJykgIT0gTlVMTCkgeworCQllbnRyeS0+dS5pbmRleCA9IC0xOworCQlpZiAoYWN0ICYgRE9fQUJTKSB7CisJCQl3aGlsZSAoc3RhdDY0KG5hbWUsICZzdGF0YikgPCAwKSB7CisjaWZkZWYgU1lTVgorCQkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQkJY29udGludWU7CisjZW5kaWYKKwkJCQllbnRyeS0+Y21kdHlwZSA9IENNRFVOS05PV047CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWVudHJ5LT5jbWR0eXBlID0gQ01ETk9STUFMOworCQlyZXR1cm47CisJfQorCisJdXBkYXRldGJsID0gKHBhdGggPT0gcGF0aHZhbCgpKTsKKwlpZiAoIXVwZGF0ZXRibCkgeworCQlhY3QgfD0gRE9fQUxUUEFUSDsKKwkJaWYgKHN0cnN0cihwYXRoLCAiJWJ1aWx0aW4iKSAhPSBOVUxMKQorCQkJYWN0IHw9IERPX0FMVEJMVElOOworCX0KKworCS8qIElmIG5hbWUgaXMgaW4gdGhlIHRhYmxlLCBjaGVjayBhbnN3ZXIgd2lsbCBiZSBvayAqLworCWlmICgoY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKSkgIT0gTlVMTCkgeworCQlpbnQgYml0OworCisJCXN3aXRjaCAoY21kcC0+Y21kdHlwZSkgeworCQlkZWZhdWx0OgorI2lmIERFQlVHCisJCQlhYm9ydCgpOworI2VuZGlmCisJCWNhc2UgQ01ETk9STUFMOgorCQkJYml0ID0gRE9fQUxUUEFUSDsKKwkJCWJyZWFrOworCQljYXNlIENNREZVTkNUSU9OOgorCQkJYml0ID0gRE9fTk9GVU5DOworCQkJYnJlYWs7CisJCWNhc2UgQ01EQlVJTFRJTjoKKwkJCWJpdCA9IERPX0FMVEJMVElOOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFjdCAmIGJpdCkgeworCQkJdXBkYXRldGJsID0gMDsKKwkJCWNtZHAgPSBOVUxMOworCQl9IGVsc2UgaWYgKGNtZHAtPnJlaGFzaCA9PSAwKQorCQkJLyogaWYgbm90IGludmFsaWRhdGVkIGJ5IGNkLCB3ZSdyZSBkb25lICovCisJCQlnb3RvIHN1Y2Nlc3M7CisJfQorCisJLyogSWYgJWJ1aWx0aW4gbm90IGluIHBhdGgsIGNoZWNrIGZvciBidWlsdGluIG5leHQgKi8KKwliY21kID0gZmluZF9idWlsdGluKG5hbWUpOworCWlmIChiY21kICYmIChiY21kLT5mbGFncyAmIEJVSUxUSU5fUkVHVUxBUiB8fCAoCisJCWFjdCAmIERPX0FMVFBBVEggPyAhKGFjdCAmIERPX0FMVEJMVElOKSA6IGJ1aWx0aW5sb2MgPD0gMAorCSkpKQorCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKworCS8qIFdlIGhhdmUgdG8gc2VhcmNoIHBhdGguICovCisJcHJldiA9IC0xOwkJLyogd2hlcmUgdG8gc3RhcnQgKi8KKwlpZiAoY21kcCAmJiBjbWRwLT5yZWhhc2gpIHsJLyogZG9pbmcgYSByZWhhc2ggKi8KKwkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTikKKwkJCXByZXYgPSBidWlsdGlubG9jOworCQllbHNlCisJCQlwcmV2ID0gY21kcC0+cGFyYW0uaW5kZXg7CisJfQorCisJZSA9IEVOT0VOVDsKKwlpZHggPSAtMTsKK2xvb3A6CisJd2hpbGUgKChmdWxsbmFtZSA9IHBhZHZhbmNlKCZwYXRoLCBuYW1lKSkgIT0gTlVMTCkgeworCQlzdHVuYWxsb2MoZnVsbG5hbWUpOworCQlpZHgrKzsKKwkJaWYgKHBhdGhvcHQpIHsKKwkJCWlmIChwcmVmaXgocGF0aG9wdCwgImJ1aWx0aW4iKSkgeworCQkJCWlmIChiY21kKQorCQkJCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIShhY3QgJiBET19OT0ZVTkMpICYmCisJCQkJICAgcHJlZml4KHBhdGhvcHQsICJmdW5jIikpIHsKKwkJCQkvKiBoYW5kbGVkIGJlbG93ICovCisJCQl9IGVsc2UgeworCQkJCS8qIGlnbm9yZSB1bmltcGxlbWVudGVkIG9wdGlvbnMgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkvKiBpZiByZWhhc2gsIGRvbid0IHJlZG8gYWJzb2x1dGUgcGF0aCBuYW1lcyAqLworCQlpZiAoZnVsbG5hbWVbMF0gPT0gJy8nICYmIGlkeCA8PSBwcmV2KSB7CisJCQlpZiAoaWR4IDwgcHJldikKKwkJCQljb250aW51ZTsKKwkJCVRSQUNFKCgic2VhcmNoZXhlYyBcIiVzXCI6IG5vIGNoYW5nZVxuIiwgbmFtZSkpOworCQkJZ290byBzdWNjZXNzOworCQl9CisJCXdoaWxlIChzdGF0NjQoZnVsbG5hbWUsICZzdGF0YikgPCAwKSB7CisjaWZkZWYgU1lTVgorCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQlpZiAoZXJybm8gIT0gRU5PRU5UICYmIGVycm5vICE9IEVOT1RESVIpCisJCQkJZSA9IGVycm5vOworCQkJZ290byBsb29wOworCQl9CisJCWUgPSBFQUNDRVM7CS8qIGlmIHdlIGZhaWwsIHRoaXMgd2lsbCBiZSB0aGUgZXJyb3IgKi8KKwkJaWYgKCFTX0lTUkVHKHN0YXRiLnN0X21vZGUpKQorCQkJY29udGludWU7CisJCWlmIChwYXRob3B0KSB7CQkvKiB0aGlzIGlzIGEgJWZ1bmMgZGlyZWN0b3J5ICovCisJCQlzdGFsbG9jKHN0cmxlbihmdWxsbmFtZSkgKyAxKTsKKwkJCXJlYWRjbWRmaWxlKGZ1bGxuYW1lKTsKKwkJCWlmICgoY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKSkgPT0gTlVMTCB8fAorCQkJICAgIGNtZHAtPmNtZHR5cGUgIT0gQ01ERlVOQ1RJT04pCisJCQkJc2hfZXJyb3IoIiVzIG5vdCBkZWZpbmVkIGluICVzIiwgbmFtZSwKKwkJCQkJIGZ1bGxuYW1lKTsKKwkJCXN0dW5hbGxvYyhmdWxsbmFtZSk7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKyNpZmRlZiBub3RkZWYKKwkJLyogWFhYIHRoaXMgY29kZSBzdG9wcyByb290IGV4ZWN1dGluZyBzdHVmZiwgYW5kIGlzIGJ1Z2d5CisJCSAgIGlmIHlvdSBuZWVkIGEgZ3JvdXAgZnJvbSB0aGUgZ3JvdXAgbGlzdC4gKi8KKwkJaWYgKHN0YXRiLnN0X3VpZCA9PSBnZXRldWlkKCkpIHsKKwkJCWlmICgoc3RhdGIuc3RfbW9kZSAmIDAxMDApID09IDApCisJCQkJZ290byBsb29wOworCQl9IGVsc2UgaWYgKHN0YXRiLnN0X2dpZCA9PSBnZXRlZ2lkKCkpIHsKKwkJCWlmICgoc3RhdGIuc3RfbW9kZSAmIDAxMCkgPT0gMCkKKwkJCQlnb3RvIGxvb3A7CisJCX0gZWxzZSB7CisJCQlpZiAoKHN0YXRiLnN0X21vZGUgJiAwMSkgPT0gMCkKKwkJCQlnb3RvIGxvb3A7CisJCX0KKyNlbmRpZgorCQlUUkFDRSgoInNlYXJjaGV4ZWMgXCIlc1wiIHJldHVybnMgXCIlc1wiXG4iLCBuYW1lLCBmdWxsbmFtZSkpOworCQlpZiAoIXVwZGF0ZXRibCkgeworCQkJZW50cnktPmNtZHR5cGUgPSBDTUROT1JNQUw7CisJCQllbnRyeS0+dS5pbmRleCA9IGlkeDsKKwkJCXJldHVybjsKKwkJfQorCQlJTlRPRkY7CisJCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMSk7CisJCWNtZHAtPmNtZHR5cGUgPSBDTUROT1JNQUw7CisJCWNtZHAtPnBhcmFtLmluZGV4ID0gaWR4OworCQlJTlRPTjsKKwkJZ290byBzdWNjZXNzOworCX0KKworCS8qIFdlIGZhaWxlZC4gIElmIHRoZXJlIHdhcyBhbiBlbnRyeSBmb3IgdGhpcyBjb21tYW5kLCBkZWxldGUgaXQgKi8KKwlpZiAoY21kcCAmJiB1cGRhdGV0YmwpCisJCWRlbGV0ZV9jbWRfZW50cnkoKTsKKwlpZiAoYWN0ICYgRE9fRVJSKQorCQlzaF93YXJueCgiJXM6ICVzIiwgbmFtZSwgZXJybXNnKGUsIEVfRVhFQykpOworCWVudHJ5LT5jbWR0eXBlID0gQ01EVU5LTk9XTjsKKwlyZXR1cm47CisKK2J1aWx0aW5fc3VjY2VzczoKKwlpZiAoIXVwZGF0ZXRibCkgeworCQllbnRyeS0+Y21kdHlwZSA9IENNREJVSUxUSU47CisJCWVudHJ5LT51LmNtZCA9IGJjbWQ7CisJCXJldHVybjsKKwl9CisJSU5UT0ZGOworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMSk7CisJY21kcC0+Y21kdHlwZSA9IENNREJVSUxUSU47CisJY21kcC0+cGFyYW0uY21kID0gYmNtZDsKKwlJTlRPTjsKK3N1Y2Nlc3M6CisJY21kcC0+cmVoYXNoID0gMDsKKwllbnRyeS0+Y21kdHlwZSA9IGNtZHAtPmNtZHR5cGU7CisJZW50cnktPnUgPSBjbWRwLT5wYXJhbTsKK30KKworCisKKy8qCisgKiBTZWFyY2ggdGhlIHRhYmxlIG9mIGJ1aWx0aW4gY29tbWFuZHMuCisgKi8KKworc3RydWN0IGJ1aWx0aW5jbWQgKgorZmluZF9idWlsdGluKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJ1aWx0aW5jbWQgKmJwOworCisJYnAgPSBic2VhcmNoKAorCQkmbmFtZSwgYnVpbHRpbmNtZCwgTlVNQlVJTFRJTlMsIHNpemVvZihzdHJ1Y3QgYnVpbHRpbmNtZCksCisJCXBzdHJjbXAKKwkpOworCXJldHVybiBicDsKK30KKworCisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIGNkIGlzIGRvbmUuICBNYXJrcyBhbGwgY29tbWFuZHMgc28gdGhlIG5leHQgdGltZSB0aGV5CisgKiBhcmUgZXhlY3V0ZWQgdGhleSB3aWxsIGJlIHJlaGFzaGVkLgorICovCisKK3ZvaWQKK2hhc2hjZCh2b2lkKQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnBwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCWZvciAocHAgPSBjbWR0YWJsZSA7IHBwIDwgJmNtZHRhYmxlW0NNRFRBQkxFU0laRV0gOyBwcCsrKSB7CisJCWZvciAoY21kcCA9ICpwcCA7IGNtZHAgOyBjbWRwID0gY21kcC0+bmV4dCkgeworCQkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMIHx8ICgKKwkJCQljbWRwLT5jbWR0eXBlID09IENNREJVSUxUSU4gJiYKKwkJCQkhKGNtZHAtPnBhcmFtLmNtZC0+ZmxhZ3MgJiBCVUlMVElOX1JFR1VMQVIpICYmCisJCQkJYnVpbHRpbmxvYyA+IDAKKwkJCSkpCisJCQkJY21kcC0+cmVoYXNoID0gMTsKKwkJfQorCX0KK30KKworCisKKy8qCisgKiBGaXggY29tbWFuZCBoYXNoIHRhYmxlIHdoZW4gUEFUSCBjaGFuZ2VkLgorICogQ2FsbGVkIGJlZm9yZSBQQVRIIGlzIGNoYW5nZWQuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5ldyB2YWx1ZSBvZiBQQVRIOworICogcGF0aHZhbCgpIHN0aWxsIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBhdCB0aGlzIHBvaW50LgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KKwordm9pZAorY2hhbmdlcGF0aChjb25zdCBjaGFyICpuZXd2YWwpCit7CisJY29uc3QgY2hhciAqb2xkLCAqbmV3OworCWludCBpZHg7CisJaW50IGZpcnN0Y2hhbmdlOworCWludCBibHRpbjsKKworCW9sZCA9IHBhdGh2YWwoKTsKKwluZXcgPSBuZXd2YWw7CisJZmlyc3RjaGFuZ2UgPSA5OTk5OwkvKiBhc3N1bWUgbm8gY2hhbmdlICovCisJaWR4ID0gMDsKKwlibHRpbiA9IC0xOworCWZvciAoOzspIHsKKwkJaWYgKCpvbGQgIT0gKm5ldykgeworCQkJZmlyc3RjaGFuZ2UgPSBpZHg7CisJCQlpZiAoKCpvbGQgPT0gJ1wwJyAmJiAqbmV3ID09ICc6JykKKwkJCSB8fCAoKm9sZCA9PSAnOicgJiYgKm5ldyA9PSAnXDAnKSkKKwkJCQlmaXJzdGNoYW5nZSsrOworCQkJb2xkID0gbmV3OwkvKiBpZ25vcmUgc3Vic2VxdWVudCBkaWZmZXJlbmNlcyAqLworCQl9CisJCWlmICgqbmV3ID09ICdcMCcpCisJCQlicmVhazsKKwkJaWYgKCpuZXcgPT0gJyUnICYmIGJsdGluIDwgMCAmJiBwcmVmaXgobmV3ICsgMSwgImJ1aWx0aW4iKSkKKwkJCWJsdGluID0gaWR4OworCQlpZiAoKm5ldyA9PSAnOicpIHsKKwkJCWlkeCsrOworCQl9CisJCW5ldysrLCBvbGQrKzsKKwl9CisJaWYgKGJ1aWx0aW5sb2MgPCAwICYmIGJsdGluID49IDApCisJCWJ1aWx0aW5sb2MgPSBibHRpbjsJCS8qIHphcCBidWlsdGlucyAqLworCWlmIChidWlsdGlubG9jID49IDAgJiYgYmx0aW4gPCAwKQorCQlmaXJzdGNoYW5nZSA9IDA7CisJY2xlYXJjbWRlbnRyeShmaXJzdGNoYW5nZSk7CisJYnVpbHRpbmxvYyA9IGJsdGluOworfQorCisKKy8qCisgKiBDbGVhciBvdXQgY29tbWFuZCBlbnRyaWVzLiAgVGhlIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZmlyc3QgZW50cnkgaW4KKyAqIFBBVEggd2hpY2ggaGFzIGNoYW5nZWQuCisgKi8KKworU1RBVElDIHZvaWQKK2NsZWFyY21kZW50cnkoaW50IGZpcnN0Y2hhbmdlKQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnRibHA7CisJc3RydWN0IHRibGVudHJ5ICoqcHA7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJSU5UT0ZGOworCWZvciAodGJscCA9IGNtZHRhYmxlIDsgdGJscCA8ICZjbWR0YWJsZVtDTURUQUJMRVNJWkVdIDsgdGJscCsrKSB7CisJCXBwID0gdGJscDsKKwkJd2hpbGUgKChjbWRwID0gKnBwKSAhPSBOVUxMKSB7CisJCQlpZiAoKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMICYmCisJCQkgICAgIGNtZHAtPnBhcmFtLmluZGV4ID49IGZpcnN0Y2hhbmdlKQorCQkJIHx8IChjbWRwLT5jbWR0eXBlID09IENNREJVSUxUSU4gJiYKKwkJCSAgICAgYnVpbHRpbmxvYyA+PSBmaXJzdGNoYW5nZSkpIHsKKwkJCQkqcHAgPSBjbWRwLT5uZXh0OworCQkJCWNrZnJlZShjbWRwKTsKKwkJCX0gZWxzZSB7CisJCQkJcHAgPSAmY21kcC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KKwlJTlRPTjsKK30KKworCisKKy8qCisgKiBMb2NhdGUgYSBjb21tYW5kIGluIHRoZSBjb21tYW5kIGhhc2ggdGFibGUuICBJZiAiYWRkIiBpcyBub256ZXJvLAorICogYWRkIHRoZSBjb21tYW5kIHRvIHRoZSB0YWJsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LiAgVGhlCisgKiB2YXJpYWJsZSAibGFzdGNtZGVudHJ5IiBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGxpbmsKKyAqIHBvaW50aW5nIHRvIHRoZSBlbnRyeSwgc28gdGhhdCBkZWxldGVfY21kX2VudHJ5IGNhbiBkZWxldGUgdGhlCisgKiBlbnRyeS4KKyAqCisgKiBJbnRlcnJ1cHRzIG11c3QgYmUgb2ZmIGlmIGNhbGxlZCB3aXRoIGFkZCAhPSAwLgorICovCisKK3N0cnVjdCB0YmxlbnRyeSAqKmxhc3RjbWRlbnRyeTsKKworCitTVEFUSUMgc3RydWN0IHRibGVudHJ5ICoKK2NtZGxvb2t1cChjb25zdCBjaGFyICpuYW1lLCBpbnQgYWRkKQoreworCXVuc2lnbmVkIGludCBoYXNodmFsOworCWNvbnN0IGNoYXIgKnA7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCXN0cnVjdCB0YmxlbnRyeSAqKnBwOworCisJcCA9IG5hbWU7CisJaGFzaHZhbCA9ICh1bnNpZ25lZCBjaGFyKSpwIDw8IDQ7CisJd2hpbGUgKCpwKQorCQloYXNodmFsICs9ICh1bnNpZ25lZCBjaGFyKSpwKys7CisJaGFzaHZhbCAmPSAweDdGRkY7CisJcHAgPSAmY21kdGFibGVbaGFzaHZhbCAlIENNRFRBQkxFU0laRV07CisJZm9yIChjbWRwID0gKnBwIDsgY21kcCA7IGNtZHAgPSBjbWRwLT5uZXh0KSB7CisJCWlmIChlcXVhbChjbWRwLT5jbWRuYW1lLCBuYW1lKSkKKwkJCWJyZWFrOworCQlwcCA9ICZjbWRwLT5uZXh0OworCX0KKwlpZiAoYWRkICYmIGNtZHAgPT0gTlVMTCkgeworCQljbWRwID0gKnBwID0gY2ttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgdGJsZW50cnkpIC0gQVJCCisJCQkJCSsgc3RybGVuKG5hbWUpICsgMSk7CisJCWNtZHAtPm5leHQgPSBOVUxMOworCQljbWRwLT5jbWR0eXBlID0gQ01EVU5LTk9XTjsKKwkJc3RyY3B5KGNtZHAtPmNtZG5hbWUsIG5hbWUpOworCX0KKwlsYXN0Y21kZW50cnkgPSBwcDsKKwlyZXR1cm4gY21kcDsKK30KKworLyoKKyAqIERlbGV0ZSB0aGUgY29tbWFuZCBlbnRyeSByZXR1cm5lZCBvbiB0aGUgbGFzdCBsb29rdXAuCisgKi8KKworU1RBVElDIHZvaWQKK2RlbGV0ZV9jbWRfZW50cnkodm9pZCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwlJTlRPRkY7CisJY21kcCA9ICpsYXN0Y21kZW50cnk7CisJKmxhc3RjbWRlbnRyeSA9IGNtZHAtPm5leHQ7CisJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pCisJCWZyZWVmdW5jKGNtZHAtPnBhcmFtLmZ1bmMpOworCWNrZnJlZShjbWRwKTsKKwlJTlRPTjsKK30KKworCisKKyNpZmRlZiBub3RkZWYKK3ZvaWQKK2dldGNtZGVudHJ5KGNoYXIgKm5hbWUsIHN0cnVjdCBjbWRlbnRyeSAqZW50cnkpCit7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwID0gY21kbG9va3VwKG5hbWUsIDApOworCisJaWYgKGNtZHApIHsKKwkJZW50cnktPnUgPSBjbWRwLT5wYXJhbTsKKwkJZW50cnktPmNtZHR5cGUgPSBjbWRwLT5jbWR0eXBlOworCX0gZWxzZSB7CisJCWVudHJ5LT5jbWR0eXBlID0gQ01EVU5LTk9XTjsKKwkJZW50cnktPnUuaW5kZXggPSAwOworCX0KK30KKyNlbmRpZgorCisKKy8qCisgKiBBZGQgYSBuZXcgY29tbWFuZCBlbnRyeSwgcmVwbGFjaW5nIGFueSBleGlzdGluZyBjb21tYW5kIGVudHJ5IGZvcgorICogdGhlIHNhbWUgbmFtZSAtIGV4Y2VwdCBzcGVjaWFsIGJ1aWx0aW5zLgorICovCisKK1NUQVRJQyB2b2lkCithZGRjbWRlbnRyeShjaGFyICpuYW1lLCBzdHJ1Y3QgY21kZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMSk7CisJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pIHsKKwkJZnJlZWZ1bmMoY21kcC0+cGFyYW0uZnVuYyk7CisJfQorCWNtZHAtPmNtZHR5cGUgPSBlbnRyeS0+Y21kdHlwZTsKKwljbWRwLT5wYXJhbSA9IGVudHJ5LT51OworCWNtZHAtPnJlaGFzaCA9IDA7Cit9CisKKworLyoKKyAqIERlZmluZSBhIHNoZWxsIGZ1bmN0aW9uLgorICovCisKK3ZvaWQKK2RlZnVuKGNoYXIgKm5hbWUsIHVuaW9uIG5vZGUgKmZ1bmMpCit7CisJc3RydWN0IGNtZGVudHJ5IGVudHJ5OworCisJSU5UT0ZGOworCWVudHJ5LmNtZHR5cGUgPSBDTURGVU5DVElPTjsKKwllbnRyeS51LmZ1bmMgPSBjb3B5ZnVuYyhmdW5jKTsKKwlhZGRjbWRlbnRyeShuYW1lLCAmZW50cnkpOworCUlOVE9OOworfQorCisKKy8qCisgKiBEZWxldGUgYSBmdW5jdGlvbiBpZiBpdCBleGlzdHMuCisgKi8KKwordm9pZAordW5zZXRmdW5jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJaWYgKChjbWRwID0gY21kbG9va3VwKG5hbWUsIDApKSAhPSBOVUxMICYmCisJICAgIGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pCisJCWRlbGV0ZV9jbWRfZW50cnkoKTsKK30KKworLyoKKyAqIExvY2F0ZSBhbmQgcHJpbnQgd2hhdCBhIHdvcmQgaXMuLi4KKyAqLworCitpbnQKK3R5cGVjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWludCBlcnIgPSAwOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQllcnIgfD0gZGVzY3JpYmVfY29tbWFuZChvdXQxLCBhcmd2W2ldLCAxKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworU1RBVElDIGludAorZGVzY3JpYmVfY29tbWFuZChvdXQsIGNvbW1hbmQsIHZlcmJvc2UpCisJc3RydWN0IG91dHB1dCAqb3V0OworCWNoYXIgKmNvbW1hbmQ7CisJaW50IHZlcmJvc2U7Cit7CisJc3RydWN0IGNtZGVudHJ5IGVudHJ5OworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKwljb25zdCBzdHJ1Y3QgYWxpYXMgKmFwOworCWNvbnN0IGNoYXIgKnBhdGggPSBwYXRodmFsKCk7CisKKwlpZiAodmVyYm9zZSkgeworCQlvdXRzdHIoY29tbWFuZCwgb3V0KTsKKwl9CisKKwkvKiBGaXJzdCBsb29rIGF0IHRoZSBrZXl3b3JkcyAqLworCWlmIChmaW5ka3dkKGNvbW1hbmQpKSB7CisJCW91dHN0cih2ZXJib3NlID8gIiBpcyBhIHNoZWxsIGtleXdvcmQiIDogY29tbWFuZCwgb3V0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVGhlbiBsb29rIGF0IHRoZSBhbGlhc2VzICovCisJaWYgKChhcCA9IGxvb2t1cGFsaWFzKGNvbW1hbmQsIDApKSAhPSBOVUxMKSB7CisJCWlmICh2ZXJib3NlKSB7CisJCQlvdXRmbXQob3V0LCAiIGlzIGFuIGFsaWFzIGZvciAlcyIsIGFwLT52YWwpOworCQl9IGVsc2UgeworCQkJb3V0c3RyKCJhbGlhcyAiLCBvdXQpOworCQkJcHJpbnRhbGlhcyhhcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBUaGVuIGNoZWNrIGlmIGl0IGlzIGEgdHJhY2tlZCBhbGlhcyAqLworCWlmICgoY21kcCA9IGNtZGxvb2t1cChjb21tYW5kLCAwKSkgIT0gTlVMTCkgeworCQllbnRyeS5jbWR0eXBlID0gY21kcC0+Y21kdHlwZTsKKwkJZW50cnkudSA9IGNtZHAtPnBhcmFtOworCX0gZWxzZSB7CisJCS8qIEZpbmFsbHkgdXNlIGJydXRlIGZvcmNlICovCisJCWZpbmRfY29tbWFuZChjb21tYW5kLCAmZW50cnksIERPX0FCUywgcGF0aCk7CisJfQorCisJc3dpdGNoIChlbnRyeS5jbWR0eXBlKSB7CisJY2FzZSBDTUROT1JNQUw6IHsKKwkJaW50IGogPSBlbnRyeS51LmluZGV4OworCQljaGFyICpwOworCQlpZiAoaiA9PSAtMSkgeworCQkJcCA9IGNvbW1hbmQ7CisJCX0gZWxzZSB7CisJCQlkbyB7CisJCQkJcCA9IHBhZHZhbmNlKCZwYXRoLCBjb21tYW5kKTsKKwkJCQlzdHVuYWxsb2MocCk7CisJCQl9IHdoaWxlICgtLWogPj0gMCk7CisJCX0KKwkJaWYgKHZlcmJvc2UpIHsKKwkJCW91dGZtdCgKKwkJCQlvdXQsICIgaXMlcyAlcyIsCisJCQkJY21kcCA/ICIgYSB0cmFja2VkIGFsaWFzIGZvciIgOiBudWxsc3RyLCBwCisJCQkpOworCQl9IGVsc2UgeworCQkJb3V0c3RyKHAsIG91dCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBDTURGVU5DVElPTjoKKwkJaWYgKHZlcmJvc2UpIHsKKwkJCW91dHN0cigiIGlzIGEgc2hlbGwgZnVuY3Rpb24iLCBvdXQpOworCQl9IGVsc2UgeworCQkJb3V0c3RyKGNvbW1hbmQsIG91dCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENNREJVSUxUSU46CisJCWlmICh2ZXJib3NlKSB7CisJCQlvdXRmbXQoCisJCQkJb3V0LCAiIGlzIGEgJXNzaGVsbCBidWlsdGluIiwKKwkJCQllbnRyeS51LmNtZC0+ZmxhZ3MgJiBCVUlMVElOX1NQRUNJQUwgPworCQkJCQkic3BlY2lhbCAiIDogbnVsbHN0cgorCQkJKTsKKwkJfSBlbHNlIHsKKwkJCW91dHN0cihjb21tYW5kLCBvdXQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKHZlcmJvc2UpIHsKKwkJCW91dHN0cigiOiBub3QgZm91bmRcbiIsIG91dCk7CisJCX0KKwkJcmV0dXJuIDEyNzsKKwl9CisKK291dDoKKwlvdXRjKCdcbicsIG91dCk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorY29tbWFuZGNtZChhcmdjLCBhcmd2KQorCWludCBhcmdjOworCWNoYXIgKiphcmd2OworeworCWludCBjOworCWVudW0geworCQlWRVJJRllfQlJJRUYgPSAxLAorCQlWRVJJRllfVkVSQk9TRSA9IDIsCisJfSB2ZXJpZnkgPSAwOworCisJd2hpbGUgKChjID0gbmV4dG9wdCgicHZWIikpICE9ICdcMCcpCisJCWlmIChjID09ICdWJykKKwkJCXZlcmlmeSB8PSBWRVJJRllfVkVSQk9TRTsKKwkJZWxzZSBpZiAoYyA9PSAndicpCisJCQl2ZXJpZnkgfD0gVkVSSUZZX0JSSUVGOworI2lmZGVmIERFQlVHCisJCWVsc2UgaWYgKGMgIT0gJ3AnKQorCQkJYWJvcnQoKTsKKyNlbmRpZgorCisJaWYgKHZlcmlmeSkKKwkJcmV0dXJuIGRlc2NyaWJlX2NvbW1hbmQob3V0MSwgKmFyZ3B0ciwgdmVyaWZ5IC0gVkVSSUZZX0JSSUVGKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZXhlYy5oIGIvdXNyL2Rhc2gvZXhlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYTZmMTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9leGVjLmgKQEAgLTAsMCArMSw3NyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylleGVjLmgJOC4zIChCZXJrZWxleSkgNi84Lzk1CisgKi8KKworLyogdmFsdWVzIG9mIGNtZHR5cGUgKi8KKyNkZWZpbmUgQ01EVU5LTk9XTgktMQkvKiBubyBlbnRyeSBpbiB0YWJsZSBmb3IgY29tbWFuZCAqLworI2RlZmluZSBDTUROT1JNQUwJMAkvKiBjb21tYW5kIGlzIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSAqLworI2RlZmluZSBDTURGVU5DVElPTgkxCS8qIGNvbW1hbmQgaXMgYSBzaGVsbCBmdW5jdGlvbiAqLworI2RlZmluZSBDTURCVUlMVElOCTIJLyogY29tbWFuZCBpcyBhIHNoZWxsIGJ1aWx0aW4gKi8KKworCitzdHJ1Y3QgY21kZW50cnkgeworCWludCBjbWR0eXBlOworCXVuaW9uIHBhcmFtIHsKKwkJaW50IGluZGV4OworCQljb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCAqY21kOworCQlzdHJ1Y3QgZnVuY25vZGUgKmZ1bmM7CisJfSB1OworfTsKKworCisvKiBhY3Rpb24gdG8gZmluZF9jb21tYW5kKCkgKi8KKyNkZWZpbmUgRE9fRVJSCQkweDAxCS8qIHByaW50cyBlcnJvcnMgKi8KKyNkZWZpbmUgRE9fQUJTCQkweDAyCS8qIGNoZWNrcyBhYnNvbHV0ZSBwYXRocyAqLworI2RlZmluZSBET19OT0ZVTkMJMHgwNAkvKiBkb24ndCByZXR1cm4gc2hlbGwgZnVuY3Rpb25zLCBmb3IgY29tbWFuZCAqLworI2RlZmluZSBET19BTFRQQVRICTB4MDgJLyogdXNpbmcgYWx0ZXJuYXRlIHBhdGggKi8KKyNkZWZpbmUgRE9fQUxUQkxUSU4JMHgyMAkvKiAlYnVpbHRpbiBpbiBhbHQuIHBhdGggKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKnBhdGhvcHQ7CS8qIHNldCBieSBwYWR2YW5jZSAqLworCit2b2lkIHNoZWxsZXhlYyhjaGFyICoqLCBjb25zdCBjaGFyICosIGludCkKKyAgICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKK2NoYXIgKnBhZHZhbmNlKGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKik7CitpbnQgaGFzaGNtZChpbnQsIGNoYXIgKiopOwordm9pZCBmaW5kX2NvbW1hbmQoY2hhciAqLCBzdHJ1Y3QgY21kZW50cnkgKiwgaW50LCBjb25zdCBjaGFyICopOworc3RydWN0IGJ1aWx0aW5jbWQgKmZpbmRfYnVpbHRpbihjb25zdCBjaGFyICopOwordm9pZCBoYXNoY2Qodm9pZCk7Cit2b2lkIGNoYW5nZXBhdGgoY29uc3QgY2hhciAqKTsKKyNpZmRlZiBub3RkZWYKK3ZvaWQgZ2V0Y21kZW50cnkoY2hhciAqLCBzdHJ1Y3QgY21kZW50cnkgKik7CisjZW5kaWYKK3ZvaWQgZGVmdW4oY2hhciAqLCB1bmlvbiBub2RlICopOwordm9pZCB1bnNldGZ1bmMoY29uc3QgY2hhciAqKTsKK2ludCB0eXBlY21kKGludCwgY2hhciAqKik7CitpbnQgY29tbWFuZGNtZChpbnQsIGNoYXIgKiopOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZXhwYW5kLmMgYi91c3IvZGFzaC9leHBhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI3MjZlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZXhwYW5kLmMKQEAgLTAsMCArMSwxNzQ0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBIQVZFX0dFVFBXTkFNCisjaW5jbHVkZSA8cHdkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmIGRlZmluZWQoX19HTElCQ19fKQorI2lmICFkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKQorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpZiAhZGVmaW5lZChHTE9CX0JST0tFTikKKyNpbmNsdWRlIDxnbG9iLmg+CisjZW5kaWYKKyNlbHNlCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBSb3V0aW5lcyB0byBleHBhbmQgYXJndW1lbnRzIHRvIGNvbW1hbmRzLiAgV2UgaGF2ZSB0byBkZWFsIHdpdGgKKyAqIGJhY2txdW90ZXMsIHNoZWxsIHZhcmlhYmxlcywgYW5kIGZpbGUgbWV0YWNoYXJhY3RlcnMuCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAiZXZhbC5oIgorI2luY2x1ZGUgImV4cGFuZC5oIgorI2luY2x1ZGUgInN5bnRheC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgImpvYnMuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAidmFyLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAic2hvdy5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisvKgorICogX3JtZXNjYXBlKCkgZmxhZ3MKKyAqLworI2RlZmluZSBSTUVTQ0FQRV9BTExPQwkweDEJLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nICovCisjZGVmaW5lIFJNRVNDQVBFX0dMT0IJMHgyCS8qIEFkZCBiYWNrc2xhc2hlcyBmb3IgZ2xvYiAqLworI2RlZmluZSBSTUVTQ0FQRV9RVU9URUQJMHg0CS8qIFJlbW92ZSBDVExFU0MgdW5sZXNzIGluIHF1b3RlcyAqLworI2RlZmluZSBSTUVTQ0FQRV9HUk9XCTB4OAkvKiBHcm93IHN0cmluZ3MgaW5zdGVhZCBvZiBzdGFsbG9jICovCisjZGVmaW5lIFJNRVNDQVBFX0hFQVAJMHgxMAkvKiBNYWxsb2Mgc3RyaW5ncyBpbnN0ZWFkIG9mIHN0YWxsb2MgKi8KKworLyogQWRkIENUTEVTQyB3aGVuIG5lY2Vzc2FyeS4gKi8KKyNkZWZpbmUgUVVPVEVTX0VTQwkoRVhQX0ZVTEwgfCBFWFBfQ0FTRSkKKy8qIERvIG5vdCBza2lwIE5VTCBjaGFyYWN0ZXJzLiAqLworI2RlZmluZSBRVU9URVNfS0VFUE5VTAlFWFBfVElMREUKKworLyoKKyAqIFN0cnVjdHVyZSBzcGVjaWZ5aW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBzdHJpbmcgc2hvdWxkIGJlIHNlYXJjaGVkCisgKiBmb3IgSUZTIGNoYXJhY3RlcnMuCisgKi8KKworc3RydWN0IGlmc3JlZ2lvbiB7CisJc3RydWN0IGlmc3JlZ2lvbiAqbmV4dDsJLyogbmV4dCByZWdpb24gaW4gbGlzdCAqLworCWludCBiZWdvZmY7CQkvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgcmVnaW9uICovCisJaW50IGVuZG9mZjsJCS8qIG9mZnNldCBvZiBlbmQgb2YgcmVnaW9uICovCisJaW50IG51bG9ubHk7CQkvKiBzZWFyY2ggZm9yIG51bCBieXRlcyBvbmx5ICovCit9OworCisvKiBvdXRwdXQgb2YgY3VycmVudCBzdHJpbmcgKi8KK3N0YXRpYyBjaGFyICpleHBkZXN0OworLyogbGlzdCBvZiBiYWNrIHF1b3RlIGV4cHJlc3Npb25zICovCitzdGF0aWMgc3RydWN0IG5vZGVsaXN0ICphcmdiYWNrcTsKKy8qIGZpcnN0IHN0cnVjdCBpbiBsaXN0IG9mIGlmcyByZWdpb25zICovCitzdGF0aWMgc3RydWN0IGlmc3JlZ2lvbiBpZnNmaXJzdDsKKy8qIGxhc3Qgc3RydWN0IGluIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgaWZzcmVnaW9uICppZnNsYXN0cDsKKy8qIGhvbGRzIGV4cGFuZGVkIGFyZyBsaXN0ICovCitzdGF0aWMgc3RydWN0IGFyZ2xpc3QgZXhwYXJnOworCitTVEFUSUMgdm9pZCBhcmdzdHIoY2hhciAqLCBpbnQpOworU1RBVElDIGNoYXIgKmV4cHRpbGRlKGNoYXIgKiwgY2hhciAqLCBpbnQpOworU1RBVElDIHZvaWQgZXhwYmFja3EodW5pb24gbm9kZSAqLCBpbnQsIGludCk7CitTVEFUSUMgY29uc3QgY2hhciAqc3ViZXZhbHZhcihjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpOworU1RBVElDIGNoYXIgKmV2YWx2YXIoY2hhciAqLCBpbnQpOworU1RBVElDIHNpemVfdCBzdHJ0b2Rlc3QoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CitTVEFUSUMgdm9pZCBtZW10b2Rlc3QoY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgaW50KTsKK1NUQVRJQyBzc2l6ZV90IHZhcnZhbHVlKGNoYXIgKiwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgcmVjb3JkcmVnaW9uKGludCwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgcmVtb3ZlcmVjb3JkcmVnaW9ucyhpbnQpOworU1RBVElDIHZvaWQgaWZzYnJlYWt1cChjaGFyICosIHN0cnVjdCBhcmdsaXN0ICopOworU1RBVElDIHZvaWQgaWZzZnJlZSh2b2lkKTsKK1NUQVRJQyB2b2lkIGV4cGFuZG1ldGEoc3RydWN0IHN0cmxpc3QgKiwgaW50KTsKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoRk5NQVRDSF9CUk9LRU4pICYmICFkZWZpbmVkKEdMT0JfQlJPS0VOKQorU1RBVElDIHZvaWQgYWRkZ2xvYihjb25zdCBnbG9iX3QgKik7CisjZWxzZQorU1RBVElDIHZvaWQgZXhwbWV0YShjaGFyICosIGNoYXIgKik7CisjZW5kaWYKK1NUQVRJQyB2b2lkIGFkZGZuYW1lKGNoYXIgKik7CisjaWYgIShkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoRk5NQVRDSF9CUk9LRU4pICYmICFkZWZpbmVkKEdMT0JfQlJPS0VOKSkKK1NUQVRJQyBzdHJ1Y3Qgc3RybGlzdCAqZXhwc29ydChzdHJ1Y3Qgc3RybGlzdCAqKTsKK1NUQVRJQyBzdHJ1Y3Qgc3RybGlzdCAqbXNvcnQoc3RydWN0IHN0cmxpc3QgKiwgaW50KTsKKyNlbmRpZgorU1RBVElDIGludCBwYXRtYXRjaChjaGFyICosIGNvbnN0IGNoYXIgKik7CisjaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKQorU1RBVElDIGludCBwbWF0Y2goY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworI2Vsc2UKKyNkZWZpbmUgcG1hdGNoKGEsIGIpICFmbm1hdGNoKChhKSwgKGIpLCAwKQorI2VuZGlmCitTVEFUSUMgaW50IGN2dG51bShsb25nKTsKK1NUQVRJQyBzaXplX3QgZXNjbGVuKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK1NUQVRJQyBjaGFyICpzY2FubGVmdChjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50KTsKK1NUQVRJQyBjaGFyICpzY2FucmlnaHQoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCk7CitTVEFUSUMgdm9pZCB2YXJ1bnNldChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpCisJX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKworLyoKKyAqIFByZXBhcmUgYSBwYXR0ZXJuIGZvciBhIGdsb2IoMykgY2FsbC4KKyAqCisgKiBSZXR1cm5zIGFuIHN0YWxsb2NlZCBzdHJpbmcuCisgKi8KKworU1RBVElDIGlubGluZSBjaGFyICoKK3ByZWdsb2IoY29uc3QgY2hhciAqcGF0dGVybiwgaW50IHF1b3RlZCwgaW50IGZsYWcpIHsKKwlmbGFnIHw9IFJNRVNDQVBFX0dMT0I7CisJaWYgKHF1b3RlZCkgeworCQlmbGFnIHw9IFJNRVNDQVBFX1FVT1RFRDsKKwl9CisJcmV0dXJuIF9ybWVzY2FwZXMoKGNoYXIgKilwYXR0ZXJuLCBmbGFnKTsKK30KKworCitTVEFUSUMgc2l6ZV90Citlc2NsZW4oY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKnApIHsKKwlzaXplX3QgZXNjID0gMDsKKworCXdoaWxlIChwID4gc3RhcnQgJiYgKi0tcCA9PSAoY2hhcilDVExFU0MpIHsKKwkJZXNjKys7CisJfQorCXJldHVybiBlc2M7Cit9CisKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpnZXRwd2hvbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZmRlZiBIQVZFX0dFVFBXTkFNCisJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd25hbShuYW1lKTsKKwlyZXR1cm4gcHcgPyBwdy0+cHdfZGlyIDogMDsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisvKgorICogRXhwYW5kIHNoZWxsIHZhcmlhYmxlcyBhbmQgYmFja3F1b3RlcyBpbnNpZGUgYSBoZXJlIGRvY3VtZW50LgorICovCisKK3ZvaWQKK2V4cGFuZGhlcmUodW5pb24gbm9kZSAqYXJnLCBpbnQgZmQpCit7CisJaGVyZWZkID0gZmQ7CisJZXhwYW5kYXJnKGFyZywgKHN0cnVjdCBhcmdsaXN0ICopTlVMTCwgMCk7CisJeHdyaXRlKGZkLCBzdGFja2Jsb2NrKCksIGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSk7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdmFyaWFibGUgc3Vic3RpdHV0aW9uIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBvbiBhbiBhcmd1bWVudCwKKyAqIHBsYWNpbmcgdGhlIHJlc3VsdGluZyBsaXN0IG9mIGFyZ3VtZW50cyBpbiBhcmdsaXN0LiAgSWYgRVhQX0ZVTEwgaXMgdHJ1ZSwKKyAqIHBlcmZvcm0gc3BsaXR0aW5nIGFuZCBmaWxlIG5hbWUgZXhwYW5zaW9uLiAgV2hlbiBhcmdsaXN0IGlzIE5VTEwsIHBlcmZvcm0KKyAqIGhlcmUgZG9jdW1lbnQgZXhwYW5zaW9uLgorICovCisKK3ZvaWQKK2V4cGFuZGFyZyh1bmlvbiBub2RlICphcmcsIHN0cnVjdCBhcmdsaXN0ICphcmdsaXN0LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJY2hhciAqcDsKKworCWFyZ2JhY2txID0gYXJnLT5uYXJnLmJhY2txdW90ZTsKKwlTVEFSVFNUQUNLU1RSKGV4cGRlc3QpOworCWlmc2ZpcnN0Lm5leHQgPSBOVUxMOworCWlmc2xhc3RwID0gTlVMTDsKKwlhcmdzdHIoYXJnLT5uYXJnLnRleHQsIGZsYWcpOworCXAgPSBfU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCWV4cGRlc3QgPSBwIC0gMTsKKwlpZiAoYXJnbGlzdCA9PSBOVUxMKSB7CisJCXJldHVybjsJCQkvKiBoZXJlIGRvY3VtZW50IGV4cGFuZGVkICovCisJfQorCXAgPSBncmFic3RhY2tzdHIocCk7CisJZXhwYXJnLmxhc3RwID0gJmV4cGFyZy5saXN0OworCS8qCisJICogVE9ETyAtIEVYUF9SRURJUgorCSAqLworCWlmIChmbGFnICYgRVhQX0ZVTEwpIHsKKwkJaWZzYnJlYWt1cChwLCAmZXhwYXJnKTsKKwkJKmV4cGFyZy5sYXN0cCA9IE5VTEw7CisJCWV4cGFyZy5sYXN0cCA9ICZleHBhcmcubGlzdDsKKwkJZXhwYW5kbWV0YShleHBhcmcubGlzdCwgZmxhZyk7CisJfSBlbHNlIHsKKwkJaWYgKGZsYWcgJiBFWFBfUkVESVIpIC8qWFhYIC0gZm9yIG5vdywganVzdCByZW1vdmUgZXNjYXBlcyAqLworCQkJcm1lc2NhcGVzKHApOworCQlzcCA9IChzdHJ1Y3Qgc3RybGlzdCAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgc3RybGlzdCkpOworCQlzcC0+dGV4dCA9IHA7CisJCSpleHBhcmcubGFzdHAgPSBzcDsKKwkJZXhwYXJnLmxhc3RwID0gJnNwLT5uZXh0OworCX0KKwlpZiAoaWZzZmlyc3QubmV4dCkKKwkJaWZzZnJlZSgpOworCSpleHBhcmcubGFzdHAgPSBOVUxMOworCWlmIChleHBhcmcubGlzdCkgeworCQkqYXJnbGlzdC0+bGFzdHAgPSBleHBhcmcubGlzdDsKKwkJYXJnbGlzdC0+bGFzdHAgPSBleHBhcmcubGFzdHA7CisJfQorfQorCisKKworLyoKKyAqIFBlcmZvcm0gdmFyaWFibGUgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uLiAgSWYgRVhQX0ZVTEwgaXMgc2V0LCBvdXRwdXQgQ1RMRVNDCisgKiBjaGFyYWN0ZXJzIHRvIGFsbG93IGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuICBPdGhlcndpc2UgdHJlYXQKKyAqICRAIGxpa2UgJCogc2luY2Ugbm8gc3BsaXR0aW5nIHdpbGwgYmUgcGVyZm9ybWVkLgorICovCisKK1NUQVRJQyB2b2lkCithcmdzdHIoY2hhciAqcCwgaW50IGZsYWcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc3BjbGNoYXJzW10gPSB7CisJCSc9JywKKwkJJzonLAorCQlDVExRVU9URU1BUkssCisJCUNUTEVORFZBUiwKKwkJQ1RMRVNDLAorCQlDVExWQVIsCisJCUNUTEJBQ0tRLAorCQlDVExCQUNLUSB8IENUTFFVT1RFLAorCQlDVExFTkRBUkksCisJCTAKKwl9OworCWNvbnN0IGNoYXIgKnJlamVjdCA9IHNwY2xjaGFyczsKKwlpbnQgYzsKKwlpbnQgcXVvdGVzID0gZmxhZyAmIFFVT1RFU19FU0M7CisJaW50IGJyZWFrYWxsID0gZmxhZyAmIEVYUF9XT1JEOworCWludCBpbnF1b3RlczsKKwlzaXplX3QgbGVuZ3RoOworCWludCBzdGFydGxvYzsKKworCWlmICghKGZsYWcgJiBFWFBfVkFSVElMREUpKSB7CisJCXJlamVjdCArPSAyOworCX0gZWxzZSBpZiAoZmxhZyAmIEVYUF9WQVJUSUxERTIpIHsKKwkJcmVqZWN0Kys7CisJfQorCWlucXVvdGVzID0gMDsKKwlsZW5ndGggPSAwOworCWlmIChmbGFnICYgRVhQX1RJTERFKSB7CisJCWNoYXIgKnE7CisKKwkJZmxhZyAmPSB+RVhQX1RJTERFOwordGlsZGU6CisJCXEgPSBwOworCQlpZiAoKnEgPT0gKGNoYXIpQ1RMRVNDICYmIChmbGFnICYgRVhQX1FXT1JEKSkKKwkJCXErKzsKKwkJaWYgKCpxID09ICd+JykKKwkJCXAgPSBleHB0aWxkZShwLCBxLCBmbGFnKTsKKwl9CitzdGFydDoKKwlzdGFydGxvYyA9IGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlmb3IgKDs7KSB7CisJCWxlbmd0aCArPSBzdHJjc3BuKHAgKyBsZW5ndGgsIHJlamVjdCk7CisJCWMgPSAoc2lnbmVkIGNoYXIpcFtsZW5ndGhdOworCQlpZiAoYyAmJiAoIShjICYgMHg4MCkgfHwgYyA9PSBDVExFTkRBUkkpKSB7CisJCQkvKiBjID09ICc9JyB8fCBjID09ICc6JyB8fCBjID09IENUTEVOREFSSSAqLworCQkJbGVuZ3RoKys7CisJCX0KKwkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCWludCBuZXdsb2M7CisJCQlleHBkZXN0ID0gc3RucHV0cyhwLCBsZW5ndGgsIGV4cGRlc3QpOworCQkJbmV3bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCQkJaWYgKGJyZWFrYWxsICYmICFpbnF1b3RlcyAmJiBuZXdsb2MgPiBzdGFydGxvYykgeworCQkJCXJlY29yZHJlZ2lvbihzdGFydGxvYywgbmV3bG9jLCAwKTsKKwkJCX0KKwkJCXN0YXJ0bG9jID0gbmV3bG9jOworCQl9CisJCXAgKz0gbGVuZ3RoICsgMTsKKwkJbGVuZ3RoID0gMDsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXDAnOgorCQkJZ290byBicmVha2xvb3A7CisJCWNhc2UgJz0nOgorCQkJaWYgKGZsYWcgJiBFWFBfVkFSVElMREUyKSB7CisJCQkJcC0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZmxhZyB8PSBFWFBfVkFSVElMREUyOworCQkJcmVqZWN0Kys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAnOic6CisJCQkvKgorCQkJICogc29ydCBvZiBhIGhhY2sgLSBleHBhbmQgdGlsZGVzIGluIHZhcmlhYmxlCisJCQkgKiBhc3NpZ25tZW50cyAoYWZ0ZXIgdGhlIGZpcnN0ICc9JyBhbmQgYWZ0ZXIgJzoncykuCisJCQkgKi8KKwkJCWlmICgqLS1wID09ICd+JykgeworCQkJCWdvdG8gdGlsZGU7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoYykgeworCQljYXNlIENUTEVORFZBUjogLyogPz8/ICovCisJCQlnb3RvIGJyZWFrbG9vcDsKKwkJY2FzZSBDVExRVU9URU1BUks6CisJCQkvKiAiJEAiIHN5bnRheCBhZGhlcmVuY2UgaGFjayAqLworCQkJaWYgKAorCQkJCSFpbnF1b3RlcyAmJgorCQkJCSFtZW1jbXAocCwgZG9sYXRzdHIsIERPTEFUU1RSTEVOKSAmJgorCQkJCShwWzRdID09IChjaGFyKUNUTFFVT1RFTUFSSyB8fCAoCisJCQkJCXBbNF0gPT0gKGNoYXIpQ1RMRU5EVkFSICYmCisJCQkJCXBbNV0gPT0gKGNoYXIpQ1RMUVVPVEVNQVJLCisJCQkJKSkKKwkJCSkgeworCQkJCXAgPSBldmFsdmFyKHAgKyAxLCBmbGFnKSArIDE7CisJCQkJZ290byBzdGFydDsKKwkJCX0KKwkJCWlucXVvdGVzID0gIWlucXVvdGVzOworYWRkcXVvdGU6CisJCQlpZiAocXVvdGVzKSB7CisJCQkJcC0tOworCQkJCWxlbmd0aCsrOworCQkJCXN0YXJ0bG9jKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVExFU0M6CisJCQlzdGFydGxvYysrOworCQkJbGVuZ3RoKys7CisJCQlnb3RvIGFkZHF1b3RlOworCQljYXNlIENUTFZBUjoKKwkJCXAgPSBldmFsdmFyKHAsIGZsYWcpOworCQkJZ290byBzdGFydDsKKwkJY2FzZSBDVExCQUNLUToKKwkJCWMgPSAwOworCQljYXNlIENUTEJBQ0tRfENUTFFVT1RFOgorCQkJZXhwYmFja3EoYXJnYmFja3EtPm4sIGMsIHF1b3Rlcyk7CisJCQlhcmdiYWNrcSA9IGFyZ2JhY2txLT5uZXh0OworCQkJZ290byBzdGFydDsKKwkJY2FzZSBDVExFTkRBUkk6CisJCQlwLS07CisJCQlleHBhcmkocXVvdGVzKTsKKwkJCWdvdG8gc3RhcnQ7CisJCX0KKwl9CiticmVha2xvb3A6CisJOworfQorCitTVEFUSUMgY2hhciAqCitleHB0aWxkZShjaGFyICpzdGFydHAsIGNoYXIgKnAsIGludCBmbGFnKQoreworCXNpZ25lZCBjaGFyIGM7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpob21lOworCWludCBxdW90ZXMgPSBmbGFnICYgUVVPVEVTX0VTQzsKKwlpbnQgc3RhcnRsb2M7CisKKwluYW1lID0gcCArIDE7CisKKwl3aGlsZSAoKGMgPSAqKytwKSAhPSAnXDAnKSB7CisJCXN3aXRjaChjKSB7CisJCWNhc2UgQ1RMRVNDOgorCQkJcmV0dXJuIChzdGFydHApOworCQljYXNlIENUTFFVT1RFTUFSSzoKKwkJCXJldHVybiAoc3RhcnRwKTsKKwkJY2FzZSAnOic6CisJCQlpZiAoZmxhZyAmIEVYUF9WQVJUSUxERSkKKwkJCQlnb3RvIGRvbmU7CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCWNhc2UgQ1RMRU5EVkFSOgorCQkJZ290byBkb25lOworCQl9CisJfQorZG9uZToKKwkqcCA9ICdcMCc7CisJaWYgKCpuYW1lID09ICdcMCcpIHsKKwkJaG9tZSA9IGxvb2t1cHZhcihob21lc3RyKTsKKwl9IGVsc2UgeworCQlob21lID0gZ2V0cHdob21lKG5hbWUpOworCX0KKwlpZiAoIWhvbWUgfHwgISpob21lKQorCQlnb3RvIGxvc2U7CisJKnAgPSBjOworCXN0YXJ0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCXN0cnRvZGVzdChob21lLCBTUVNZTlRBWCwgcXVvdGVzKTsKKwlyZWNvcmRyZWdpb24oc3RhcnRsb2MsIGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSwgMCk7CisJcmV0dXJuIChwKTsKK2xvc2U6CisJKnAgPSBjOworCXJldHVybiAoc3RhcnRwKTsKK30KKworCitTVEFUSUMgdm9pZAorcmVtb3ZlcmVjb3JkcmVnaW9ucyhpbnQgZW5kb2ZmKQoreworCWlmIChpZnNsYXN0cCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoaWZzZmlyc3QuZW5kb2ZmID4gZW5kb2ZmKSB7CisJCXdoaWxlIChpZnNmaXJzdC5uZXh0ICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisJCQlJTlRPRkY7CisJCQlpZnNwID0gaWZzZmlyc3QubmV4dC0+bmV4dDsKKwkJCWNrZnJlZShpZnNmaXJzdC5uZXh0KTsKKwkJCWlmc2ZpcnN0Lm5leHQgPSBpZnNwOworCQkJSU5UT047CisJCX0KKwkJaWYgKGlmc2ZpcnN0LmJlZ29mZiA+IGVuZG9mZikKKwkJCWlmc2xhc3RwID0gTlVMTDsKKwkJZWxzZSB7CisJCQlpZnNsYXN0cCA9ICZpZnNmaXJzdDsKKwkJCWlmc2ZpcnN0LmVuZG9mZiA9IGVuZG9mZjsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWZzbGFzdHAgPSAmaWZzZmlyc3Q7CisJd2hpbGUgKGlmc2xhc3RwLT5uZXh0ICYmIGlmc2xhc3RwLT5uZXh0LT5iZWdvZmYgPCBlbmRvZmYpCisJCWlmc2xhc3RwPWlmc2xhc3RwLT5uZXh0OworCXdoaWxlIChpZnNsYXN0cC0+bmV4dCAhPSBOVUxMKSB7CisJCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisJCUlOVE9GRjsKKwkJaWZzcCA9IGlmc2xhc3RwLT5uZXh0LT5uZXh0OworCQlja2ZyZWUoaWZzbGFzdHAtPm5leHQpOworCQlpZnNsYXN0cC0+bmV4dCA9IGlmc3A7CisJCUlOVE9OOworCX0KKwlpZiAoaWZzbGFzdHAtPmVuZG9mZiA+IGVuZG9mZikKKwkJaWZzbGFzdHAtPmVuZG9mZiA9IGVuZG9mZjsKK30KKworCisvKgorICogRXhwYW5kIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4gIEJhY2t1cCB0byBzdGFydCBvZiBleHByZXNzaW9uLAorICogZXZhbHVhdGUsIHBsYWNlIHJlc3VsdCBpbiAoYmFja2VkIHVwKSByZXN1bHQsIGFkanVzdCBzdHJpbmcgcG9zaXRpb24uCisgKi8KK3ZvaWQKK2V4cGFyaShpbnQgcXVvdGVzKQoreworCWNoYXIgKnAsICpzdGFydDsKKwlpbnQgYmVnb2ZmOworCWludCBmbGFnOworCWludCBsZW47CisKKwkvKglpZnNmcmVlKCk7ICovCisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBpcyBzbGlnaHRseSBvdmVyLWNvbXBsaWNhdGVkIGZvcgorCSAqIGVmZmljaWVuY3kuICBOZXh0IHdlIHNjYW4gYmFja3dhcmRzIGxvb2tpbmcgZm9yIHRoZQorCSAqIHN0YXJ0IG9mIGFyaXRobWV0aWMuCisJICovCisJc3RhcnQgPSBzdGFja2Jsb2NrKCk7CisJcCA9IGV4cGRlc3QgLSAxOworCSpwID0gJ1wwJzsKKwlwLS07CisJZG8geworCQlpbnQgZXNjOworCisJCXdoaWxlICgqcCAhPSAoY2hhcilDVExBUkkpIHsKKwkJCXAtLTsKKyNpZmRlZiBERUJVRworCQkJaWYgKHAgPCBzdGFydCkgeworCQkJCXNoX2Vycm9yKCJtaXNzaW5nIENUTEFSSSAoc2hvdWxkbid0IGhhcHBlbikiKTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJZXNjID0gZXNjbGVuKHN0YXJ0LCBwKTsKKwkJaWYgKCEoZXNjICUgMikpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJcCAtPSBlc2MgKyAxOworCX0gd2hpbGUgKDEpOworCisJYmVnb2ZmID0gcCAtIHN0YXJ0OworCisJcmVtb3ZlcmVjb3JkcmVnaW9ucyhiZWdvZmYpOworCisJZmxhZyA9IHBbMV07CisKKwlleHBkZXN0ID0gcDsKKworCWlmIChxdW90ZXMpCisJCXJtZXNjYXBlcyhwICsgMik7CisKKwlsZW4gPSBjdnRudW0oYXJpdGgocCArIDIpKTsKKworCWlmIChmbGFnICE9ICciJykKKwkJcmVjb3JkcmVnaW9uKGJlZ29mZiwgYmVnb2ZmICsgbGVuLCAwKTsKK30KKworCisvKgorICogRXhwYW5kIHN0dWZmIGluIGJhY2t3YXJkcyBxdW90ZXMuCisgKi8KKworU1RBVElDIHZvaWQKK2V4cGJhY2txKHVuaW9uIG5vZGUgKmNtZCwgaW50IHF1b3RlZCwgaW50IHF1b3RlcykKK3sKKwlzdHJ1Y3QgYmFja2NtZCBpbjsKKwlpbnQgaTsKKwljaGFyIGJ1ZlsxMjhdOworCWNoYXIgKnA7CisJY2hhciAqZGVzdDsKKwlpbnQgc3RhcnRsb2M7CisJY2hhciBjb25zdCAqc3ludGF4ID0gcXVvdGVkPyBEUVNZTlRBWCA6IEJBU0VTWU5UQVg7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKworCUlOVE9GRjsKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlkZXN0ID0gZXhwZGVzdDsKKwlzdGFydGxvYyA9IGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlncmFic3RhY2tzdHIoZGVzdCk7CisJZXZhbGJhY2tjbWQoY21kLCAoc3RydWN0IGJhY2tjbWQgKikgJmluKTsKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKKworCXAgPSBpbi5idWY7CisJaSA9IGluLm5sZWZ0OworCWlmIChpID09IDApCisJCWdvdG8gcmVhZDsKKwlmb3IgKDs7KSB7CisJCW1lbXRvZGVzdChwLCBpLCBzeW50YXgsIHF1b3Rlcyk7CityZWFkOgorCQlpZiAoaW4uZmQgPCAwKQorCQkJYnJlYWs7CisJCWRvIHsKKwkJCWkgPSByZWFkKGluLmZkLCBidWYsIHNpemVvZiBidWYpOworCQl9IHdoaWxlIChpIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisJCVRSQUNFKCgiZXhwYmFja3E6IHJlYWQgcmV0dXJucyAlZFxuIiwgaSkpOworCQlpZiAoaSA8PSAwKQorCQkJYnJlYWs7CisJCXAgPSBidWY7CisJfQorCisJaWYgKGluLmJ1ZikKKwkJY2tmcmVlKGluLmJ1Zik7CisJaWYgKGluLmZkID49IDApIHsKKwkJY2xvc2UoaW4uZmQpOworCQliYWNrX2V4aXRzdGF0dXMgPSB3YWl0Zm9yam9iKGluLmpwKTsKKwl9CisJSU5UT047CisKKwkvKiBFYXQgYWxsIHRyYWlsaW5nIG5ld2xpbmVzICovCisJZGVzdCA9IGV4cGRlc3Q7CisJZm9yICg7IGRlc3QgPiAoY2hhciAqKXN0YWNrYmxvY2soKSAmJiBkZXN0Wy0xXSA9PSAnXG4nOykKKwkJU1RVTlBVVEMoZGVzdCk7CisJZXhwZGVzdCA9IGRlc3Q7CisKKwlpZiAocXVvdGVkID09IDApCisJCXJlY29yZHJlZ2lvbihzdGFydGxvYywgZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpLCAwKTsKKwlUUkFDRSgoImV2YWxiYWNrcTogc2l6ZT0lZDogXCIlLipzXCJcbiIsCisJCShkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCkpIC0gc3RhcnRsb2MsCisJCShkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCkpIC0gc3RhcnRsb2MsCisJCXN0YWNrYmxvY2soKSArIHN0YXJ0bG9jKSk7Cit9CisKKworU1RBVElDIGNoYXIgKgorc2NhbmxlZnQoCisJY2hhciAqc3RhcnRwLCBjaGFyICpybWVzYywgY2hhciAqcm1lc2NlbmQsIGNoYXIgKnN0ciwgaW50IHF1b3RlcywKKwlpbnQgemVybworKSB7CisJY2hhciAqbG9jOworCWNoYXIgKmxvYzI7CisJY2hhciBjOworCisJbG9jID0gc3RhcnRwOworCWxvYzIgPSBybWVzYzsKKwlkbyB7CisJCWludCBtYXRjaDsKKwkJY29uc3QgY2hhciAqcyA9IGxvYzI7CisJCWMgPSAqbG9jMjsKKwkJaWYgKHplcm8pIHsKKwkJCSpsb2MyID0gJ1wwJzsKKwkJCXMgPSBybWVzYzsKKwkJfQorCQltYXRjaCA9IHBtYXRjaChzdHIsIHMpOworCQkqbG9jMiA9IGM7CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBsb2M7CisJCWlmIChxdW90ZXMgJiYgKmxvYyA9PSAoY2hhcilDVExFU0MpCisJCQlsb2MrKzsKKwkJbG9jKys7CisJCWxvYzIrKzsKKwl9IHdoaWxlIChjKTsKKwlyZXR1cm4gMDsKK30KKworCitTVEFUSUMgY2hhciAqCitzY2FucmlnaHQoCisJY2hhciAqc3RhcnRwLCBjaGFyICpybWVzYywgY2hhciAqcm1lc2NlbmQsIGNoYXIgKnN0ciwgaW50IHF1b3RlcywKKwlpbnQgemVybworKSB7CisJaW50IGVzYyA9IDA7CisJY2hhciAqbG9jOworCWNoYXIgKmxvYzI7CisKKwlmb3IgKGxvYyA9IHN0ciAtIDEsIGxvYzIgPSBybWVzY2VuZDsgbG9jID49IHN0YXJ0cDsgbG9jMi0tKSB7CisJCWludCBtYXRjaDsKKwkJY2hhciBjID0gKmxvYzI7CisJCWNvbnN0IGNoYXIgKnMgPSBsb2MyOworCQlpZiAoemVybykgeworCQkJKmxvYzIgPSAnXDAnOworCQkJcyA9IHJtZXNjOworCQl9CisJCW1hdGNoID0gcG1hdGNoKHN0ciwgcyk7CisJCSpsb2MyID0gYzsKKwkJaWYgKG1hdGNoKQorCQkJcmV0dXJuIGxvYzsKKwkJbG9jLS07CisJCWlmIChxdW90ZXMpIHsKKwkJCWlmICgtLWVzYyA8IDApIHsKKwkJCQllc2MgPSBlc2NsZW4oc3RhcnRwLCBsb2MpOworCQkJfQorCQkJaWYgKGVzYyAlIDIpIHsKKwkJCQllc2MtLTsKKwkJCQlsb2MtLTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGNvbnN0IGNoYXIgKgorc3ViZXZhbHZhcihjaGFyICpwLCBjaGFyICpzdHIsIGludCBzdHJsb2MsIGludCBzdWJ0eXBlLCBpbnQgc3RhcnRsb2MsIGludCB2YXJmbGFncywgaW50IHF1b3RlcykKK3sKKwljaGFyICpzdGFydHA7CisJY2hhciAqbG9jOworCWludCBzYXZlaGVyZWZkID0gaGVyZWZkOworCXN0cnVjdCBub2RlbGlzdCAqc2F2ZWFyZ2JhY2txID0gYXJnYmFja3E7CisJaW50IGFtb3VudDsKKwljaGFyICpybWVzYywgKnJtZXNjZW5kOworCWludCB6ZXJvOworCWNoYXIgKigqc2NhbikoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgLCBpbnQpOworCisJaGVyZWZkID0gLTE7CisJYXJnc3RyKHAsIHN1YnR5cGUgIT0gVlNBU1NJR04gJiYgc3VidHlwZSAhPSBWU1FVRVNUSU9OID8gRVhQX0NBU0UgOiAwKTsKKwlTVFBVVEMoJ1wwJywgZXhwZGVzdCk7CisJaGVyZWZkID0gc2F2ZWhlcmVmZDsKKwlhcmdiYWNrcSA9IHNhdmVhcmdiYWNrcTsKKwlzdGFydHAgPSBzdGFja2Jsb2NrKCkgKyBzdGFydGxvYzsKKworCXN3aXRjaCAoc3VidHlwZSkgeworCWNhc2UgVlNBU1NJR046CisJCXNldHZhcihzdHIsIHN0YXJ0cCwgMCk7CisJCWFtb3VudCA9IHN0YXJ0cCAtIGV4cGRlc3Q7CisJCVNUQURKVVNUKGFtb3VudCwgZXhwZGVzdCk7CisJCXJldHVybiBzdGFydHA7CisKKwljYXNlIFZTUVVFU1RJT046CisJCXZhcnVuc2V0KHAsIHN0ciwgc3RhcnRwLCB2YXJmbGFncyk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwlzdWJ0eXBlIC09IFZTVFJJTVJJR0hUOworI2lmZGVmIERFQlVHCisJaWYgKHN1YnR5cGUgPCAwIHx8IHN1YnR5cGUgPiAzKQorCQlhYm9ydCgpOworI2VuZGlmCisKKwlybWVzYyA9IHN0YXJ0cDsKKwlybWVzY2VuZCA9IHN0YWNrYmxvY2soKSArIHN0cmxvYzsKKwlpZiAocXVvdGVzKSB7CisJCXJtZXNjID0gX3JtZXNjYXBlcyhzdGFydHAsIFJNRVNDQVBFX0FMTE9DIHwgUk1FU0NBUEVfR1JPVyk7CisJCWlmIChybWVzYyAhPSBzdGFydHApIHsKKwkJCXJtZXNjZW5kID0gZXhwZGVzdDsKKwkJCXN0YXJ0cCA9IHN0YWNrYmxvY2soKSArIHN0YXJ0bG9jOworCQl9CisJfQorCXJtZXNjZW5kLS07CisJc3RyID0gc3RhY2tibG9jaygpICsgc3RybG9jOworCXByZWdsb2Ioc3RyLCB2YXJmbGFncyAmIFZTUVVPVEUsIDApOworCisJLyogemVybyA9IHN1YnR5cGUgPT0gVlNUUklNTEVGVCB8fCBzdWJ0eXBlID09IFZTVFJJTUxFRlRNQVggKi8KKwl6ZXJvID0gc3VidHlwZSA+PiAxOworCS8qIFZTVFJJTUxFRlQvVlNUUklNUklHSFRNQVggLT4gc2NhbmxlZnQgKi8KKwlzY2FuID0gKHN1YnR5cGUgJiAxKSBeIHplcm8gPyBzY2FubGVmdCA6IHNjYW5yaWdodDsKKworCWxvYyA9IHNjYW4oc3RhcnRwLCBybWVzYywgcm1lc2NlbmQsIHN0ciwgcXVvdGVzLCB6ZXJvKTsKKwlpZiAobG9jKSB7CisJCWlmICh6ZXJvKSB7CisJCQltZW1tb3ZlKHN0YXJ0cCwgbG9jLCBzdHIgLSBsb2MpOworCQkJbG9jID0gc3RhcnRwICsgKHN0ciAtIGxvYykgLSAxOworCQl9CisJCSpsb2MgPSAnXDAnOworCQlhbW91bnQgPSBsb2MgLSBleHBkZXN0OworCQlTVEFESlVTVChhbW91bnQsIGV4cGRlc3QpOworCX0KKwlyZXR1cm4gbG9jOworfQorCisKKy8qCisgKiBFeHBhbmQgYSB2YXJpYWJsZSwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZQorICogaW5wdXQgc3RyaW5nLgorICovCitTVEFUSUMgY2hhciAqCitldmFsdmFyKGNoYXIgKnAsIGludCBmbGFnKQoreworCWludCBzdWJ0eXBlOworCWludCB2YXJmbGFnczsKKwljaGFyICp2YXI7CisJaW50IHBhdGxvYzsKKwlpbnQgYzsKKwlpbnQgc3RhcnRsb2M7CisJc3NpemVfdCB2YXJsZW47CisJaW50IGVhc3k7CisJaW50IHF1b3RlczsKKwlpbnQgcXVvdGVkOworCisJcXVvdGVzID0gZmxhZyAmIFFVT1RFU19FU0M7CisJdmFyZmxhZ3MgPSAqcCsrOworCXN1YnR5cGUgPSB2YXJmbGFncyAmIFZTVFlQRTsKKwlxdW90ZWQgPSB2YXJmbGFncyAmIFZTUVVPVEU7CisJdmFyID0gcDsKKwllYXN5ID0gKCFxdW90ZWQgfHwgKCp2YXIgPT0gJ0AnICYmIHNoZWxscGFyYW0ubnBhcmFtKSk7CisJc3RhcnRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJcCA9IHN0cmNocihwLCAnPScpICsgMTsKKworYWdhaW46CisJdmFybGVuID0gdmFydmFsdWUodmFyLCB2YXJmbGFncywgZmxhZyk7CisJaWYgKHZhcmZsYWdzICYgVlNOVUwpCisJCXZhcmxlbi0tOworCisJaWYgKHN1YnR5cGUgPT0gVlNQTFVTKSB7CisJCXZhcmxlbiA9IC0xIC0gdmFybGVuOworCQlnb3RvIHZzcGx1czsKKwl9CisKKwlpZiAoc3VidHlwZSA9PSBWU01JTlVTKSB7Cit2c3BsdXM6CisJCWlmICh2YXJsZW4gPCAwKSB7CisJCQlhcmdzdHIoCisJCQkJcCwgZmxhZyB8IEVYUF9USUxERSB8CisJCQkJCShxdW90ZWQgPyAgRVhQX1FXT1JEIDogRVhQX1dPUkQpCisJCQkpOworCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKGVhc3kpCisJCQlnb3RvIHJlY29yZDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHN1YnR5cGUgPT0gVlNBU1NJR04gfHwgc3VidHlwZSA9PSBWU1FVRVNUSU9OKSB7CisJCWlmICh2YXJsZW4gPCAwKSB7CisJCQlpZiAoc3ViZXZhbHZhcihwLCB2YXIsIDAsIHN1YnR5cGUsIHN0YXJ0bG9jLAorCQkJCSAgICAgICB2YXJmbGFncywgMCkpIHsKKwkJCQl2YXJmbGFncyAmPSB+VlNOVUw7CisJCQkJLyoKKwkJCQkgKiBSZW1vdmUgYW55IHJlY29yZGVkIHJlZ2lvbnMgYmV5b25kCisJCQkJICogc3RhcnQgb2YgdmFyaWFibGUKKwkJCQkgKi8KKwkJCQlyZW1vdmVyZWNvcmRyZWdpb25zKHN0YXJ0bG9jKTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKGVhc3kpCisJCQlnb3RvIHJlY29yZDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHZhcmxlbiA8IDAgJiYgdWZsYWcpCisJCXZhcnVuc2V0KHAsIHZhciwgMCwgMCk7CisKKwlpZiAoc3VidHlwZSA9PSBWU0xFTkdUSCkgeworCQljdnRudW0odmFybGVuID4gMCA/IHZhcmxlbiA6IDApOworCQlnb3RvIHJlY29yZDsKKwl9CisKKwlpZiAoc3VidHlwZSA9PSBWU05PUk1BTCkgeworCQlpZiAoIWVhc3kpCisJCQlnb3RvIGVuZDsKK3JlY29yZDoKKwkJcmVjb3JkcmVnaW9uKHN0YXJ0bG9jLCBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCksIHF1b3RlZCk7CisJCWdvdG8gZW5kOworCX0KKworI2lmZGVmIERFQlVHCisJc3dpdGNoIChzdWJ0eXBlKSB7CisJY2FzZSBWU1RSSU1MRUZUOgorCWNhc2UgVlNUUklNTEVGVE1BWDoKKwljYXNlIFZTVFJJTVJJR0hUOgorCWNhc2UgVlNUUklNUklHSFRNQVg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorI2VuZGlmCisKKwlpZiAodmFybGVuID49IDApIHsKKwkJLyoKKwkJICogVGVybWluYXRlIHRoZSBzdHJpbmcgYW5kIHN0YXJ0IHJlY29yZGluZyB0aGUgcGF0dGVybgorCQkgKiByaWdodCBhZnRlciBpdAorCQkgKi8KKwkJU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCQlwYXRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJCWlmIChzdWJldmFsdmFyKHAsIE5VTEwsIHBhdGxvYywgc3VidHlwZSwKKwkJCSAgICAgICBzdGFydGxvYywgdmFyZmxhZ3MsIHF1b3RlcykgPT0gMCkgeworCQkJaW50IGFtb3VudCA9IGV4cGRlc3QgLSAoCisJCQkJKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBwYXRsb2MgLSAxCisJCQkpOworCQkJU1RBREpVU1QoLWFtb3VudCwgZXhwZGVzdCk7CisJCX0KKwkJLyogUmVtb3ZlIGFueSByZWNvcmRlZCByZWdpb25zIGJleW9uZCBzdGFydCBvZiB2YXJpYWJsZSAqLworCQlyZW1vdmVyZWNvcmRyZWdpb25zKHN0YXJ0bG9jKTsKKwkJZ290byByZWNvcmQ7CisJfQorCitlbmQ6CisJaWYgKHN1YnR5cGUgIT0gVlNOT1JNQUwpIHsJLyogc2tpcCB0byBlbmQgb2YgYWx0ZXJuYXRpdmUgKi8KKwkJaW50IG5lc3RpbmcgPSAxOworCQlmb3IgKDs7KSB7CisJCQlpZiAoKGMgPSAoc2lnbmVkIGNoYXIpKnArKykgPT0gQ1RMRVNDKQorCQkJCXArKzsKKwkJCWVsc2UgaWYgKGMgPT0gQ1RMQkFDS1EgfHwgYyA9PSAoQ1RMQkFDS1F8Q1RMUVVPVEUpKSB7CisJCQkJaWYgKHZhcmxlbiA+PSAwKQorCQkJCQlhcmdiYWNrcSA9IGFyZ2JhY2txLT5uZXh0OworCQkJfSBlbHNlIGlmIChjID09IENUTFZBUikgeworCQkJCWlmICgoKnArKyAmIFZTVFlQRSkgIT0gVlNOT1JNQUwpCisJCQkJCW5lc3RpbmcrKzsKKwkJCX0gZWxzZSBpZiAoYyA9PSBDVExFTkRWQVIpIHsKKwkJCQlpZiAoLS1uZXN0aW5nID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBwOworfQorCisKKy8qCisgKiBQdXQgYSBzdHJpbmcgb24gdGhlIHN0YWNrLgorICovCisKK1NUQVRJQyB2b2lkCittZW10b2Rlc3QoY29uc3QgY2hhciAqcCwgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqc3ludGF4LCBpbnQgcXVvdGVzKSB7CisJY2hhciAqcTsKKworCWlmICh1bmxpa2VseSghbGVuKSkKKwkJcmV0dXJuOworCisJcSA9IG1ha2VzdHJzcGFjZShsZW4gKiAyLCBleHBkZXN0KTsKKworCWRvIHsKKwkJaW50IGMgPSAoc2lnbmVkIGNoYXIpKnArKzsKKwkJaWYgKGMpIHsKKwkJCWlmICgocXVvdGVzICYgUVVPVEVTX0VTQykgJiYKKwkJCSAgICAoc3ludGF4W2NdID09IENDVEwgfHwgc3ludGF4W2NdID09IENCQUNLKSkKKwkJCQlVU1RQVVRDKENUTEVTQywgcSk7CisJCX0gZWxzZSBpZiAoIShxdW90ZXMgJiBRVU9URVNfS0VFUE5VTCkpCisJCQljb250aW51ZTsKKwkJVVNUUFVUQyhjLCBxKTsKKwl9IHdoaWxlICgtLWxlbik7CisKKwlleHBkZXN0ID0gcTsKK30KKworCitTVEFUSUMgc2l6ZV90CitzdHJ0b2Rlc3QocCwgc3ludGF4LCBxdW90ZXMpCisJY29uc3QgY2hhciAqcDsKKwljb25zdCBjaGFyICpzeW50YXg7CisJaW50IHF1b3RlczsKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKHApOworCW1lbXRvZGVzdChwLCBsZW4sIHN5bnRheCwgcXVvdGVzKTsKKwlyZXR1cm4gbGVuOworfQorCisKKworLyoKKyAqIEFkZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWFsaXplZCB2YXJpYWJsZSB0byB0aGUgc3RhY2sgc3RyaW5nLgorICovCisKK1NUQVRJQyBzc2l6ZV90Cit2YXJ2YWx1ZShjaGFyICpuYW1lLCBpbnQgdmFyZmxhZ3MsIGludCBmbGFncykKK3sKKwlpbnQgbnVtOworCWNoYXIgKnA7CisJaW50IGk7CisJaW50IHNlcDsKKwljaGFyIHNlcGM7CisJY2hhciAqKmFwOworCWNoYXIgY29uc3QgKnN5bnRheDsKKwlpbnQgcXVvdGVkID0gdmFyZmxhZ3MgJiBWU1FVT1RFOworCWludCBzdWJ0eXBlID0gdmFyZmxhZ3MgJiBWU1RZUEU7CisJaW50IGRpc2NhcmQgPSBzdWJ0eXBlID09IFZTUExVUyB8fCBzdWJ0eXBlID09IFZTTEVOR1RIOworCWludCBxdW90ZXMgPSAoZGlzY2FyZCA/IDAgOiAoZmxhZ3MgJiBRVU9URVNfRVNDKSkgfCBRVU9URVNfS0VFUE5VTDsKKwlzc2l6ZV90IGxlbiA9IDA7CisKKwlzZXAgPSBxdW90ZWQgPyAoKGZsYWdzICYgRVhQX0ZVTEwpIDw8IENIQVJfQklUKSA6IDA7CisJc3ludGF4ID0gcXVvdGVkID8gRFFTWU5UQVggOiBCQVNFU1lOVEFYOworCisJc3dpdGNoICgqbmFtZSkgeworCWNhc2UgJyQnOgorCQludW0gPSByb290cGlkOworCQlnb3RvIG51bXZhcjsKKwljYXNlICc/JzoKKwkJbnVtID0gZXhpdHN0YXR1czsKKwkJZ290byBudW12YXI7CisJY2FzZSAnIyc6CisJCW51bSA9IHNoZWxscGFyYW0ubnBhcmFtOworCQlnb3RvIG51bXZhcjsKKwljYXNlICchJzoKKwkJbnVtID0gYmFja2duZHBpZDsKKwkJaWYgKG51bSA9PSAwKQorCQkJcmV0dXJuIC0xOworbnVtdmFyOgorCQlsZW4gPSBjdnRudW0obnVtKTsKKwkJYnJlYWs7CisJY2FzZSAnLSc6CisJCXAgPSBtYWtlc3Ryc3BhY2UoTk9QVFMsIGV4cGRlc3QpOworCQlmb3IgKGkgPSBOT1BUUyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAob3B0bGlzdFtpXSkgeworCQkJCVVTVFBVVEMob3B0bGV0dGVyc1tpXSwgcCk7CisJCQkJbGVuKys7CisJCQl9CisJCX0KKwkJZXhwZGVzdCA9IHA7CisJCWJyZWFrOworCWNhc2UgJ0AnOgorCQlpZiAoc2VwKQorCQkJZ290byBwYXJhbTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAnKic6CisJCXNlcCA9IGlmc3NldCgpID8gaWZzdmFsKClbMF0gOiAnICc7CitwYXJhbToKKwkJaWYgKCEoYXAgPSBzaGVsbHBhcmFtLnApKQorCQkJcmV0dXJuIC0xOworCQlzZXBjID0gc2VwOworCQl3aGlsZSAoKHAgPSAqYXArKykpIHsKKwkJCWxlbiArPSBzdHJ0b2Rlc3QocCwgc3ludGF4LCBxdW90ZXMpOworCisJCQlpZiAoKmFwICYmIHNlcCkgeworCQkJCWxlbisrOworCQkJCW1lbXRvZGVzdCgmc2VwYywgMSwgc3ludGF4LCBxdW90ZXMpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgJzAnOgorCWNhc2UgJzEnOgorCWNhc2UgJzInOgorCWNhc2UgJzMnOgorCWNhc2UgJzQnOgorCWNhc2UgJzUnOgorCWNhc2UgJzYnOgorCWNhc2UgJzcnOgorCWNhc2UgJzgnOgorCWNhc2UgJzknOgorCQludW0gPSBhdG9pKG5hbWUpOworCQlpZiAobnVtIDwgMCB8fCBudW0gPiBzaGVsbHBhcmFtLm5wYXJhbSkKKwkJCXJldHVybiAtMTsKKwkJcCA9IG51bSA/IHNoZWxscGFyYW0ucFtudW0gLSAxXSA6IGFyZzA7CisJCWdvdG8gdmFsdWU7CisJZGVmYXVsdDoKKwkJcCA9IGxvb2t1cHZhcihuYW1lKTsKK3ZhbHVlOgorCQlpZiAoIXApCisJCQlyZXR1cm4gLTE7CisKKwkJbGVuID0gc3RydG9kZXN0KHAsIHN5bnRheCwgcXVvdGVzKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGRpc2NhcmQpCisJCVNUQURKVVNUKC1sZW4sIGV4cGRlc3QpOworCXJldHVybiBsZW47Cit9CisKKworCisvKgorICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSB0byBzY2FuIHRoaXMgcmVnaW9uIG9mIHRoZQorICogc3RyaW5nIGZvciBJRlMgY2hhcmFjdGVycy4KKyAqLworCitTVEFUSUMgdm9pZAorcmVjb3JkcmVnaW9uKGludCBzdGFydCwgaW50IGVuZCwgaW50IG51bG9ubHkpCit7CisJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKworCWlmIChpZnNsYXN0cCA9PSBOVUxMKSB7CisJCWlmc3AgPSAmaWZzZmlyc3Q7CisJfSBlbHNlIHsKKwkJSU5UT0ZGOworCQlpZnNwID0gKHN0cnVjdCBpZnNyZWdpb24gKilja21hbGxvYyhzaXplb2YgKHN0cnVjdCBpZnNyZWdpb24pKTsKKwkJaWZzcC0+bmV4dCA9IE5VTEw7CisJCWlmc2xhc3RwLT5uZXh0ID0gaWZzcDsKKwkJSU5UT047CisJfQorCWlmc2xhc3RwID0gaWZzcDsKKwlpZnNsYXN0cC0+YmVnb2ZmID0gc3RhcnQ7CisJaWZzbGFzdHAtPmVuZG9mZiA9IGVuZDsKKwlpZnNsYXN0cC0+bnVsb25seSA9IG51bG9ubHk7Cit9CisKKworCisvKgorICogQnJlYWsgdGhlIGFyZ3VtZW50IHN0cmluZyBpbnRvIHBpZWNlcyBiYXNlZCB1cG9uIElGUyBhbmQgYWRkIHRoZQorICogc3RyaW5ncyB0byB0aGUgYXJndW1lbnQgbGlzdC4gIFRoZSByZWdpb25zIG9mIHRoZSBzdHJpbmcgdG8gYmUKKyAqIHNlYXJjaGVkIGZvciBJRlMgY2hhcmFjdGVycyBoYXZlIGJlZW4gc3RvcmVkIGJ5IHJlY29yZHJlZ2lvbi4KKyAqLworU1RBVElDIHZvaWQKK2lmc2JyZWFrdXAoY2hhciAqc3RyaW5nLCBzdHJ1Y3QgYXJnbGlzdCAqYXJnbGlzdCkKK3sKKwlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKwljaGFyICpzdGFydDsKKwljaGFyICpwOworCWNoYXIgKnE7CisJY29uc3QgY2hhciAqaWZzLCAqcmVhbGlmczsKKwlpbnQgaWZzc3BjOworCWludCBudWxvbmx5OworCisKKwlzdGFydCA9IHN0cmluZzsKKwlpZiAoaWZzbGFzdHAgIT0gTlVMTCkgeworCQlpZnNzcGMgPSAwOworCQludWxvbmx5ID0gMDsKKwkJcmVhbGlmcyA9IGlmc3NldCgpID8gaWZzdmFsKCkgOiBkZWZpZnM7CisJCWlmc3AgPSAmaWZzZmlyc3Q7CisJCWRvIHsKKwkJCXAgPSBzdHJpbmcgKyBpZnNwLT5iZWdvZmY7CisJCQludWxvbmx5ID0gaWZzcC0+bnVsb25seTsKKwkJCWlmcyA9IG51bG9ubHkgPyBudWxsc3RyIDogcmVhbGlmczsKKwkJCWlmc3NwYyA9IDA7CisJCQl3aGlsZSAocCA8IHN0cmluZyArIGlmc3AtPmVuZG9mZikgeworCQkJCXEgPSBwOworCQkJCWlmICgqcCA9PSAoY2hhcilDVExFU0MpCisJCQkJCXArKzsKKwkJCQlpZiAoc3RyY2hyKGlmcywgKnApKSB7CisJCQkJCWlmICghbnVsb25seSkKKwkJCQkJCWlmc3NwYyA9IChzdHJjaHIoZGVmaWZzLCAqcCkgIT0gTlVMTCk7CisJCQkJCS8qIElnbm9yZSBJRlMgd2hpdGVzcGFjZSBhdCBzdGFydCAqLworCQkJCQlpZiAocSA9PSBzdGFydCAmJiBpZnNzcGMpIHsKKwkJCQkJCXArKzsKKwkJCQkJCXN0YXJ0ID0gcDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCSpxID0gJ1wwJzsKKwkJCQkJc3AgPSAoc3RydWN0IHN0cmxpc3QgKilzdGFsbG9jKHNpemVvZiAqc3ApOworCQkJCQlzcC0+dGV4dCA9IHN0YXJ0OworCQkJCQkqYXJnbGlzdC0+bGFzdHAgPSBzcDsKKwkJCQkJYXJnbGlzdC0+bGFzdHAgPSAmc3AtPm5leHQ7CisJCQkJCXArKzsKKwkJCQkJaWYgKCFudWxvbmx5KSB7CisJCQkJCQlmb3IgKDs7KSB7CisJCQkJCQkJaWYgKHAgPj0gc3RyaW5nICsgaWZzcC0+ZW5kb2ZmKSB7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlxID0gcDsKKwkJCQkJCQlpZiAoKnAgPT0gKGNoYXIpQ1RMRVNDKQorCQkJCQkJCQlwKys7CisJCQkJCQkJaWYgKHN0cmNocihpZnMsICpwKSA9PSBOVUxMICkgeworCQkJCQkJCQlwID0gcTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfSBlbHNlIGlmIChzdHJjaHIoZGVmaWZzLCAqcCkgPT0gTlVMTCkgeworCQkJCQkJCQlpZiAoaWZzc3BjKSB7CisJCQkJCQkJCQlwKys7CisJCQkJCQkJCQlpZnNzcGMgPSAwOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJcCA9IHE7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZQorCQkJCQkJCQlwKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJc3RhcnQgPSBwOworCQkJCX0gZWxzZQorCQkJCQlwKys7CisJCQl9CisJCX0gd2hpbGUgKChpZnNwID0gaWZzcC0+bmV4dCkgIT0gTlVMTCk7CisJCWlmIChudWxvbmx5KQorCQkJZ290byBhZGQ7CisJfQorCisJaWYgKCEqc3RhcnQpCisJCXJldHVybjsKKworYWRkOgorCXNwID0gKHN0cnVjdCBzdHJsaXN0ICopc3RhbGxvYyhzaXplb2YgKnNwKTsKKwlzcC0+dGV4dCA9IHN0YXJ0OworCSphcmdsaXN0LT5sYXN0cCA9IHNwOworCWFyZ2xpc3QtPmxhc3RwID0gJnNwLT5uZXh0OworfQorCitTVEFUSUMgdm9pZAoraWZzZnJlZSh2b2lkKQoreworCXN0cnVjdCBpZnNyZWdpb24gKnA7CisKKwlJTlRPRkY7CisJcCA9IGlmc2ZpcnN0Lm5leHQ7CisJZG8geworCQlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCQlpZnNwID0gcC0+bmV4dDsKKwkJY2tmcmVlKHApOworCQlwID0gaWZzcDsKKwl9IHdoaWxlIChwKTsKKwlpZnNsYXN0cCA9IE5VTEw7CisJaWZzZmlyc3QubmV4dCA9IE5VTEw7CisJSU5UT047Cit9CisKKworCisvKgorICogRXhwYW5kIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLiAgQXQgdGhpcyBwb2ludCwgdGhlIG9ubHkgY29udHJvbCBjaGFyYWN0ZXJzCisgKiBzaG91bGQgYmUgZXNjYXBlcy4gIFRoZSByZXN1bHRzIGFyZSBzdG9yZWQgaW4gdGhlIGxpc3QgZXhwYXJnLgorICovCisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoRk5NQVRDSF9CUk9LRU4pICYmICFkZWZpbmVkKEdMT0JfQlJPS0VOKQorU1RBVElDIHZvaWQKK2V4cGFuZG1ldGEoc3RyLCBmbGFnKQorCXN0cnVjdCBzdHJsaXN0ICpzdHI7CisJaW50IGZsYWc7Cit7CisJLyogVE9ETyAtIEVYUF9SRURJUiAqLworCisJd2hpbGUgKHN0cikgeworCQljb25zdCBjaGFyICpwOworCQlnbG9iX3QgcGdsb2I7CisJCWludCBpOworCisJCWlmIChmZmxhZykKKwkJCWdvdG8gbm9tZXRhOworCQlJTlRPRkY7CisJCXAgPSBwcmVnbG9iKHN0ci0+dGV4dCwgMCwgUk1FU0NBUEVfQUxMT0MgfCBSTUVTQ0FQRV9IRUFQKTsKKwkJaSA9IGdsb2IocCwgR0xPQl9OT01BR0lDLCAwLCAmcGdsb2IpOworCQlpZiAocCAhPSBzdHItPnRleHQpCisJCQlja2ZyZWUocCk7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlpZiAoIShwZ2xvYi5nbF9mbGFncyAmIEdMT0JfTUFHQ0hBUikpCisJCQkJZ290byBub21ldGEyOworCQkJYWRkZ2xvYigmcGdsb2IpOworCQkJZ2xvYmZyZWUoJnBnbG9iKTsKKwkJCUlOVE9OOworCQkJYnJlYWs7CisJCWNhc2UgR0xPQl9OT01BVENIOgorbm9tZXRhMjoKKwkJCWdsb2JmcmVlKCZwZ2xvYik7CisJCQlJTlRPTjsKK25vbWV0YToKKwkJCSpleHBhcmcubGFzdHAgPSBzdHI7CisJCQlybWVzY2FwZXMoc3RyLT50ZXh0KTsKKwkJCWV4cGFyZy5sYXN0cCA9ICZzdHItPm5leHQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogR0xPQl9OT1NQQUNFICovCisJCQlzaF9lcnJvcigiT3V0IG9mIHNwYWNlIik7CisJCX0KKwkJc3RyID0gc3RyLT5uZXh0OworCX0KK30KKworCisvKgorICogQWRkIHRoZSByZXN1bHQgb2YgZ2xvYigzKSB0byB0aGUgbGlzdC4KKyAqLworCitTVEFUSUMgdm9pZAorYWRkZ2xvYihwZ2xvYikKKwljb25zdCBnbG9iX3QgKnBnbG9iOworeworCWNoYXIgKipwID0gcGdsb2ItPmdsX3BhdGh2OworCisJZG8geworCQlhZGRmbmFtZSgqcCk7CisJfSB3aGlsZSAoKisrcCk7Cit9CisKKworI2Vsc2UJLyogZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKSAmJiAhZGVmaW5lZChHTE9CX0JST0tFTikgKi8KK1NUQVRJQyBjaGFyICpleHBkaXI7CisKKworU1RBVElDIHZvaWQKK2V4cGFuZG1ldGEoc3RydWN0IHN0cmxpc3QgKnN0ciwgaW50IGZsYWcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbWV0YWNoYXJzW10gPSB7CisJCScqJywgJz8nLCAnWycsIDAKKwl9OworCS8qIFRPRE8gLSBFWFBfUkVESVIgKi8KKworCXdoaWxlIChzdHIpIHsKKwkJc3RydWN0IHN0cmxpc3QgKipzYXZlbGFzdHA7CisJCXN0cnVjdCBzdHJsaXN0ICpzcDsKKwkJY2hhciAqcDsKKworCQlpZiAoZmZsYWcpCisJCQlnb3RvIG5vbWV0YTsKKwkJaWYgKCFzdHJwYnJrKHN0ci0+dGV4dCwgbWV0YWNoYXJzKSkKKwkJCWdvdG8gbm9tZXRhOworCQlzYXZlbGFzdHAgPSBleHBhcmcubGFzdHA7CisKKwkJSU5UT0ZGOworCQlwID0gcHJlZ2xvYihzdHItPnRleHQsIDAsIFJNRVNDQVBFX0FMTE9DIHwgUk1FU0NBUEVfSEVBUCk7CisJCXsKKwkJCWludCBpID0gc3RybGVuKHN0ci0+dGV4dCk7CisJCQlleHBkaXIgPSBja21hbGxvYyhpIDwgMjA0OCA/IDIwNDggOiBpKTsgLyogWFhYICovCisJCX0KKworCQlleHBtZXRhKGV4cGRpciwgcCk7CisJCWNrZnJlZShleHBkaXIpOworCQlpZiAocCAhPSBzdHItPnRleHQpCisJCQlja2ZyZWUocCk7CisJCUlOVE9OOworCQlpZiAoZXhwYXJnLmxhc3RwID09IHNhdmVsYXN0cCkgeworCQkJLyoKKwkJCSAqIG5vIG1hdGNoZXMKKwkJCSAqLworbm9tZXRhOgorCQkJKmV4cGFyZy5sYXN0cCA9IHN0cjsKKwkJCXJtZXNjYXBlcyhzdHItPnRleHQpOworCQkJZXhwYXJnLmxhc3RwID0gJnN0ci0+bmV4dDsKKwkJfSBlbHNlIHsKKwkJCSpleHBhcmcubGFzdHAgPSBOVUxMOworCQkJKnNhdmVsYXN0cCA9IHNwID0gZXhwc29ydCgqc2F2ZWxhc3RwKTsKKwkJCXdoaWxlIChzcC0+bmV4dCAhPSBOVUxMKQorCQkJCXNwID0gc3AtPm5leHQ7CisJCQlleHBhcmcubGFzdHAgPSAmc3AtPm5leHQ7CisJCX0KKwkJc3RyID0gc3RyLT5uZXh0OworCX0KK30KKworCisvKgorICogRG8gbWV0YWNoYXJhY3RlciAoaS5lLiAqLCA/LCBbLi4uXSkgZXhwYW5zaW9uLgorICovCisKK1NUQVRJQyB2b2lkCitleHBtZXRhKGNoYXIgKmVuZGRpciwgY2hhciAqbmFtZSkKK3sKKwljaGFyICpwOworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKnN0YXJ0OworCWNoYXIgKmVuZG5hbWU7CisJaW50IG1ldGFmbGFnOworCXN0cnVjdCBzdGF0NjQgc3RhdGI7CisJRElSICpkaXJwOworCXN0cnVjdCBkaXJlbnQgKmRwOworCWludCBhdGVuZDsKKwlpbnQgbWF0Y2hkb3Q7CisKKwltZXRhZmxhZyA9IDA7CisJc3RhcnQgPSBuYW1lOworCWZvciAocCA9IG5hbWU7ICpwOyBwKyspIHsKKwkJaWYgKCpwID09ICcqJyB8fCAqcCA9PSAnPycpCisJCQltZXRhZmxhZyA9IDE7CisJCWVsc2UgaWYgKCpwID09ICdbJykgeworCQkJY2hhciAqcSA9IHAgKyAxOworCQkJaWYgKCpxID09ICchJykKKwkJCQlxKys7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCpxID09ICdcXCcpCisJCQkJCXErKzsKKwkJCQlpZiAoKnEgPT0gJy8nIHx8ICpxID09ICdcMCcpCisJCQkJCWJyZWFrOworCQkJCWlmICgqKytxID09ICddJykgeworCQkJCQltZXRhZmxhZyA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmICgqcCA9PSAnXFwnKQorCQkJcCsrOworCQllbHNlIGlmICgqcCA9PSAnLycpIHsKKwkJCWlmIChtZXRhZmxhZykKKwkJCQlnb3RvIG91dDsKKwkJCXN0YXJ0ID0gcCArIDE7CisJCX0KKwl9CitvdXQ6CisJaWYgKG1ldGFmbGFnID09IDApIHsJLyogd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUgKi8KKwkJaWYgKGVuZGRpciAhPSBleHBkaXIpCisJCQltZXRhZmxhZysrOworCQlwID0gbmFtZTsKKwkJZG8geworCQkJaWYgKCpwID09ICdcXCcpCisJCQkJcCsrOworCQkJKmVuZGRpcisrID0gKnA7CisJCX0gd2hpbGUgKCpwKyspOworCQlpZiAobWV0YWZsYWcgPT0gMCB8fCBsc3RhdDY0KGV4cGRpciwgJnN0YXRiKSA+PSAwKQorCQkJYWRkZm5hbWUoZXhwZGlyKTsKKwkJcmV0dXJuOworCX0KKwllbmRuYW1lID0gcDsKKwlpZiAobmFtZSA8IHN0YXJ0KSB7CisJCXAgPSBuYW1lOworCQlkbyB7CisJCQlpZiAoKnAgPT0gJ1xcJykKKwkJCQlwKys7CisJCQkqZW5kZGlyKysgPSAqcCsrOworCQl9IHdoaWxlIChwIDwgc3RhcnQpOworCX0KKwlpZiAoZW5kZGlyID09IGV4cGRpcikgeworCQljcCA9ICIuIjsKKwl9IGVsc2UgaWYgKGVuZGRpciA9PSBleHBkaXIgKyAxICYmICpleHBkaXIgPT0gJy8nKSB7CisJCWNwID0gIi8iOworCX0gZWxzZSB7CisJCWNwID0gZXhwZGlyOworCQllbmRkaXJbLTFdID0gJ1wwJzsKKwl9CisJaWYgKChkaXJwID0gb3BlbmRpcihjcCkpID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoZW5kZGlyICE9IGV4cGRpcikKKwkJZW5kZGlyWy0xXSA9ICcvJzsKKwlpZiAoKmVuZG5hbWUgPT0gMCkgeworCQlhdGVuZCA9IDE7CisJfSBlbHNlIHsKKwkJYXRlbmQgPSAwOworCQkqZW5kbmFtZSsrID0gJ1wwJzsKKwl9CisJbWF0Y2hkb3QgPSAwOworCXAgPSBzdGFydDsKKwlpZiAoKnAgPT0gJ1xcJykKKwkJcCsrOworCWlmICgqcCA9PSAnLicpCisJCW1hdGNoZG90Kys7CisJd2hpbGUgKCEgaW50X3BlbmRpbmcoKSAmJiAoZHAgPSByZWFkZGlyKGRpcnApKSAhPSBOVUxMKSB7CisJCWlmIChkcC0+ZF9uYW1lWzBdID09ICcuJyAmJiAhIG1hdGNoZG90KQorCQkJY29udGludWU7CisJCWlmIChwbWF0Y2goc3RhcnQsIGRwLT5kX25hbWUpKSB7CisJCQlpZiAoYXRlbmQpIHsKKwkJCQlzY29weShkcC0+ZF9uYW1lLCBlbmRkaXIpOworCQkJCWFkZGZuYW1lKGV4cGRpcik7CisJCQl9IGVsc2UgeworCQkJCWZvciAocCA9IGVuZGRpciwgY3AgPSBkcC0+ZF9uYW1lOworCQkJCSAgICAgKCpwKysgPSAqY3ArKykgIT0gJ1wwJzspCisJCQkJCWNvbnRpbnVlOworCQkJCXBbLTFdID0gJy8nOworCQkJCWV4cG1ldGEocCwgZW5kbmFtZSk7CisJCQl9CisJCX0KKwl9CisJY2xvc2VkaXIoZGlycCk7CisJaWYgKCEgYXRlbmQpCisJCWVuZG5hbWVbLTFdID0gJy8nOworfQorI2VuZGlmCS8qIGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChGTk1BVENIX0JST0tFTikgJiYgIWRlZmluZWQoR0xPQl9CUk9LRU4pICovCisKKworLyoKKyAqIEFkZCBhIGZpbGUgbmFtZSB0byB0aGUgbGlzdC4KKyAqLworCitTVEFUSUMgdm9pZAorYWRkZm5hbWUoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisKKwlzcCA9IChzdHJ1Y3Qgc3RybGlzdCAqKXN0YWxsb2Moc2l6ZW9mICpzcCk7CisJc3AtPnRleHQgPSBzc3RyZHVwKG5hbWUpOworCSpleHBhcmcubGFzdHAgPSBzcDsKKwlleHBhcmcubGFzdHAgPSAmc3AtPm5leHQ7Cit9CisKKworI2lmICEoZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKEZOTUFUQ0hfQlJPS0VOKSAmJiAhZGVmaW5lZChHTE9CX0JST0tFTikpCisvKgorICogU29ydCB0aGUgcmVzdWx0cyBvZiBmaWxlIG5hbWUgZXhwYW5zaW9uLiAgSXQgY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mCisgKiBzdHJpbmdzIHRvIHNvcnQgYW5kIHRoZW4gY2FsbHMgbXNvcnQgKHNob3J0IGZvciBtZXJnZSBzb3J0KSB0byBkbyB0aGUKKyAqIHdvcmsuCisgKi8KKworU1RBVElDIHN0cnVjdCBzdHJsaXN0ICoKK2V4cHNvcnQoc3RydWN0IHN0cmxpc3QgKnN0cikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKworCWxlbiA9IDA7CisJZm9yIChzcCA9IHN0ciA7IHNwIDsgc3AgPSBzcC0+bmV4dCkKKwkJbGVuKys7CisJcmV0dXJuIG1zb3J0KHN0ciwgbGVuKTsKK30KKworCitTVEFUSUMgc3RydWN0IHN0cmxpc3QgKgorbXNvcnQoc3RydWN0IHN0cmxpc3QgKmxpc3QsIGludCBsZW4pCit7CisJc3RydWN0IHN0cmxpc3QgKnAsICpxID0gTlVMTDsKKwlzdHJ1Y3Qgc3RybGlzdCAqKmxwcDsKKwlpbnQgaGFsZjsKKwlpbnQgbjsKKworCWlmIChsZW4gPD0gMSkKKwkJcmV0dXJuIGxpc3Q7CisJaGFsZiA9IGxlbiA+PiAxOworCXAgPSBsaXN0OworCWZvciAobiA9IGhhbGYgOyAtLW4gPj0gMCA7ICkgeworCQlxID0gcDsKKwkJcCA9IHAtPm5leHQ7CisJfQorCXEtPm5leHQgPSBOVUxMOwkJCS8qIHRlcm1pbmF0ZSBmaXJzdCBoYWxmIG9mIGxpc3QgKi8KKwlxID0gbXNvcnQobGlzdCwgaGFsZik7CQkvKiBzb3J0IGZpcnN0IGhhbGYgb2YgbGlzdCAqLworCXAgPSBtc29ydChwLCBsZW4gLSBoYWxmKTsJCS8qIHNvcnQgc2Vjb25kIGhhbGYgKi8KKwlscHAgPSAmbGlzdDsKKwlmb3IgKDs7KSB7CisJCWlmIChzdHJjbXAocC0+dGV4dCwgcS0+dGV4dCkgPCAwKSB7CisJCQkqbHBwID0gcDsKKwkJCWxwcCA9ICZwLT5uZXh0OworCQkJaWYgKChwID0gKmxwcCkgPT0gTlVMTCkgeworCQkJCSpscHAgPSBxOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJKmxwcCA9IHE7CisJCQlscHAgPSAmcS0+bmV4dDsKKwkJCWlmICgocSA9ICpscHApID09IE5VTEwpIHsKKwkJCQkqbHBwID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbGlzdDsKK30KKyNlbmRpZgorCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLgorICovCisKK1NUQVRJQyBpbmxpbmUgaW50CitwYXRtYXRjaChjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIHBtYXRjaChwcmVnbG9iKHBhdHRlcm4sIDAsIDApLCBzdHJpbmcpOworfQorCisKKyNpZiAhZGVmaW5lZChfX0dMSUJDX18pIHx8IGRlZmluZWQoRk5NQVRDSF9CUk9LRU4pCitTVEFUSUMgaW50IGNjbWF0Y2goY29uc3QgY2hhciAqcCwgaW50IGNociwgY29uc3QgY2hhciAqKnIpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBjbGFzcyB7CisJCWNoYXIgbmFtZVsxMF07CisJCWludCAoKmZuKShpbnQpOworCX0gY2xhc3Nlc1tdID0geworCQl7IC5uYW1lID0gIjphbG51bTpdIiwgLmZuID0gaXNhbG51bSB9LAorCQl7IC5uYW1lID0gIjpjbnRybDpdIiwgLmZuID0gaXNjbnRybCB9LAorCQl7IC5uYW1lID0gIjpsb3dlcjpdIiwgLmZuID0gaXNsb3dlciB9LAorCQl7IC5uYW1lID0gIjpzcGFjZTpdIiwgLmZuID0gaXNzcGFjZSB9LAorCQl7IC5uYW1lID0gIjphbHBoYTpdIiwgLmZuID0gaXNhbHBoYSB9LAorCQl7IC5uYW1lID0gIjpkaWdpdDpdIiwgLmZuID0gaXNkaWdpdCB9LAorCQl7IC5uYW1lID0gIjpwcmludDpdIiwgLmZuID0gaXNwcmludCB9LAorCQl7IC5uYW1lID0gIjp1cHBlcjpdIiwgLmZuID0gaXN1cHBlciB9LAorCQl7IC5uYW1lID0gIjpibGFuazpdIiwgLmZuID0gaXNibGFuayB9LAorCQl7IC5uYW1lID0gIjpncmFwaDpdIiwgLmZuID0gaXNncmFwaCB9LAorCQl7IC5uYW1lID0gIjpwdW5jdDpdIiwgLmZuID0gaXNwdW5jdCB9LAorCQl7IC5uYW1lID0gIjp4ZGlnaXQ6XSIsIC5mbiA9IGlzeGRpZ2l0IH0sCisJfTsKKwljb25zdCBzdHJ1Y3QgY2xhc3MgKmNsYXNzLCAqZW5kOworCisJZW5kID0gY2xhc3NlcyArIHNpemVvZihjbGFzc2VzKSAvIHNpemVvZihjbGFzc2VzWzBdKTsKKwlmb3IgKGNsYXNzID0gY2xhc3NlczsgY2xhc3MgPCBlbmQ7IGNsYXNzKyspIHsKKwkJY29uc3QgY2hhciAqcTsKKworCQlxID0gcHJlZml4KHAsIGNsYXNzLT5uYW1lKTsKKwkJaWYgKCFxKQorCQkJY29udGludWU7CisJCSpyID0gcTsKKwkJcmV0dXJuIGNsYXNzLT5mbihjaHIpOworCX0KKworCSpyID0gMDsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAorcG1hdGNoKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwljb25zdCBjaGFyICpwLCAqcTsKKwljaGFyIGM7CisKKwlwID0gcGF0dGVybjsKKwlxID0gc3RyaW5nOworCWZvciAoOzspIHsKKwkJc3dpdGNoIChjID0gKnArKykgeworCQljYXNlICdcMCc6CisJCQlnb3RvIGJyZWFrbG9vcDsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKCpwKSB7CisJCQkJYyA9ICpwKys7CisJCQl9CisJCQlnb3RvIGRmdDsKKwkJY2FzZSAnPyc6CisJCQlpZiAoKnErKyA9PSAnXDAnKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCWNhc2UgJyonOgorCQkJYyA9ICpwOworCQkJd2hpbGUgKGMgPT0gJyonKQorCQkJCWMgPSAqKytwOworCQkJaWYgKGMgIT0gJ1xcJyAmJiBjICE9ICc/JyAmJiBjICE9ICcqJyAmJiBjICE9ICdbJykgeworCQkJCXdoaWxlICgqcSAhPSBjKSB7CisJCQkJCWlmICgqcSA9PSAnXDAnKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCXErKzsKKwkJCQl9CisJCQl9CisJCQlkbyB7CisJCQkJaWYgKHBtYXRjaChwLCBxKSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9IHdoaWxlICgqcSsrICE9ICdcMCcpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ1snOiB7CisJCQljb25zdCBjaGFyICpzdGFydHA7CisJCQlpbnQgaW52ZXJ0LCBmb3VuZDsKKwkJCWNoYXIgY2hyOworCisJCQlzdGFydHAgPSBwOworCQkJaW52ZXJ0ID0gMDsKKwkJCWlmICgqcCA9PSAnIScpIHsKKwkJCQlpbnZlcnQrKzsKKwkJCQlwKys7CisJCQl9CisJCQlmb3VuZCA9IDA7CisJCQljaHIgPSAqcSsrOworCQkJaWYgKGNociA9PSAnXDAnKQorCQkJCXJldHVybiAwOworCQkJYyA9ICpwKys7CisJCQlkbyB7CisJCQkJaWYgKCFjKSB7CisJCQkJCXAgPSBzdGFydHA7CisJCQkJCWMgPSAqcDsKKwkJCQkJZ290byBkZnQ7CisJCQkJfQorCQkJCWlmIChjID09ICdbJykgeworCQkJCQljb25zdCBjaGFyICpyOworCisJCQkJCWZvdW5kIHw9IGNjbWF0Y2gocCwgY2hyLCAmcik7CisJCQkJCWlmIChyKSB7CisJCQkJCQlwID0gcjsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChjID09ICdcXCcpCisJCQkJCWMgPSAqcCsrOworCQkJCWlmICgqcCA9PSAnLScgJiYgcFsxXSAhPSAnXScpIHsKKwkJCQkJcCsrOworCQkJCQlpZiAoKnAgPT0gJ1xcJykKKwkJCQkJCXArKzsKKwkJCQkJaWYgKGNociA+PSBjICYmIGNociA8PSAqcCkKKwkJCQkJCWZvdW5kID0gMTsKKwkJCQkJcCsrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjaHIgPT0gYykKKwkJCQkJCWZvdW5kID0gMTsKKwkJCQl9CisJCQl9IHdoaWxlICgoYyA9ICpwKyspICE9ICddJyk7CisJCQlpZiAoZm91bmQgPT0gaW52ZXJ0KQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KK2RmdDoJICAgICAgICBkZWZhdWx0OgorCQkJaWYgKCpxKysgIT0gYykKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CisJfQorYnJlYWtsb29wOgorCWlmICgqcSAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisKKworLyoKKyAqIFJlbW92ZSBhbnkgQ1RMRVNDIGNoYXJhY3RlcnMgZnJvbSBhIHN0cmluZy4KKyAqLworCitjaGFyICoKK19ybWVzY2FwZXMoY2hhciAqc3RyLCBpbnQgZmxhZykKK3sKKwljaGFyICpwLCAqcSwgKnI7CisJc3RhdGljIGNvbnN0IGNoYXIgcWNoYXJzW10gPSB7IENUTEVTQywgQ1RMUVVPVEVNQVJLLCAwIH07CisJdW5zaWduZWQgaW5xdW90ZXM7CisJaW50IG5vdGVzY2FwZWQ7CisJaW50IGdsb2JiaW5nOworCisJcCA9IHN0cnBicmsoc3RyLCBxY2hhcnMpOworCWlmICghcCkgeworCQlyZXR1cm4gc3RyOworCX0KKwlxID0gcDsKKwlyID0gc3RyOworCWlmIChmbGFnICYgUk1FU0NBUEVfQUxMT0MpIHsKKwkJc2l6ZV90IGxlbiA9IHAgLSBzdHI7CisJCXNpemVfdCBmdWxsbGVuID0gbGVuICsgc3RybGVuKHApICsgMTsKKworCQlpZiAoZmxhZyAmIFJNRVNDQVBFX0dST1cpIHsKKwkJCXIgPSBtYWtlc3Ryc3BhY2UoZnVsbGxlbiwgZXhwZGVzdCk7CisJCX0gZWxzZSBpZiAoZmxhZyAmIFJNRVNDQVBFX0hFQVApIHsKKwkJCXIgPSBja21hbGxvYyhmdWxsbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXIgPSBzdGFsbG9jKGZ1bGxsZW4pOworCQl9CisJCXEgPSByOworCQlpZiAobGVuID4gMCkgeworCQkJcSA9IG1lbXBjcHkocSwgc3RyLCBsZW4pOworCQl9CisJfQorCWlucXVvdGVzID0gKGZsYWcgJiBSTUVTQ0FQRV9RVU9URUQpIF4gUk1FU0NBUEVfUVVPVEVEOworCWdsb2JiaW5nID0gZmxhZyAmIFJNRVNDQVBFX0dMT0I7CisJbm90ZXNjYXBlZCA9IGdsb2JiaW5nOworCXdoaWxlICgqcCkgeworCQlpZiAoKnAgPT0gKGNoYXIpQ1RMUVVPVEVNQVJLKSB7CisJCQlpbnF1b3RlcyA9IH5pbnF1b3RlczsKKwkJCXArKzsKKwkJCW5vdGVzY2FwZWQgPSBnbG9iYmluZzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqcCA9PSAnXFwnKSB7CisJCQkvKiBuYWtlZCBiYWNrIHNsYXNoICovCisJCQlub3Rlc2NhcGVkID0gMDsKKwkJCWdvdG8gY29weTsKKwkJfQorCQlpZiAoKnAgPT0gKGNoYXIpQ1RMRVNDKSB7CisJCQlwKys7CisJCQlpZiAobm90ZXNjYXBlZCAmJiBpbnF1b3RlcyAmJiAqcCAhPSAnLycpIHsKKwkJCQkqcSsrID0gJ1xcJzsKKwkJCX0KKwkJfQorCQlub3Rlc2NhcGVkID0gZ2xvYmJpbmc7Citjb3B5OgorCQkqcSsrID0gKnArKzsKKwl9CisJKnEgPSAnXDAnOworCWlmIChmbGFnICYgUk1FU0NBUEVfR1JPVykgeworCQlleHBkZXN0ID0gcjsKKwkJU1RBREpVU1QocSAtIHIgKyAxLCBleHBkZXN0KTsKKwl9CisJcmV0dXJuIHI7Cit9CisKKworCisvKgorICogU2VlIGlmIGEgcGF0dGVybiBtYXRjaGVzIGluIGEgY2FzZSBzdGF0ZW1lbnQuCisgKi8KKworaW50CitjYXNlbWF0Y2godW5pb24gbm9kZSAqcGF0dGVybiwgY2hhciAqdmFsKQoreworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJaW50IHJlc3VsdDsKKworCXNldHN0YWNrbWFyaygmc21hcmspOworCWFyZ2JhY2txID0gcGF0dGVybi0+bmFyZy5iYWNrcXVvdGU7CisJU1RBUlRTVEFDS1NUUihleHBkZXN0KTsKKwlpZnNsYXN0cCA9IE5VTEw7CisJYXJnc3RyKHBhdHRlcm4tPm5hcmcudGV4dCwgRVhQX1RJTERFIHwgRVhQX0NBU0UpOworCVNUQUNLU1RSTlVMKGV4cGRlc3QpOworCXJlc3VsdCA9IHBhdG1hdGNoKHN0YWNrYmxvY2soKSwgdmFsKTsKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogT3VyIG93biBpdG9hKCkuCisgKi8KKworU1RBVElDIGludAorY3Z0bnVtKGxvbmcgbnVtKQoreworCWludCBsZW47CisKKwlleHBkZXN0ID0gbWFrZXN0cnNwYWNlKDMyLCBleHBkZXN0KTsKKwlsZW4gPSBmbXRzdHIoZXhwZGVzdCwgMzIsICIlbGQiLCBudW0pOworCVNUQURKVVNUKGxlbiwgZXhwZGVzdCk7CisJcmV0dXJuIGxlbjsKK30KKworU1RBVElDIHZvaWQKK3ZhcnVuc2V0KGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp1bXNnLCBpbnQgdmFyZmxhZ3MpCit7CisJY29uc3QgY2hhciAqbXNnOworCWNvbnN0IGNoYXIgKnRhaWw7CisKKwl0YWlsID0gbnVsbHN0cjsKKwltc2cgPSAicGFyYW1ldGVyIG5vdCBzZXQiOworCWlmICh1bXNnKSB7CisJCWlmICgqZW5kID09IChjaGFyKUNUTEVORFZBUikgeworCQkJaWYgKHZhcmZsYWdzICYgVlNOVUwpCisJCQkJdGFpbCA9ICIgb3IgbnVsbCI7CisJCX0gZWxzZQorCQkJbXNnID0gdW1zZzsKKwl9CisJc2hfZXJyb3IoIiUuKnM6ICVzJXMiLCBlbmQgLSB2YXIgLSAxLCB2YXIsIG1zZywgdGFpbCk7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9leHBhbmQuaCBiL3Vzci9kYXNoL2V4cGFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDQ1OTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9leHBhbmQuaApAQCAtMCwwICsxLDgzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWV4cGFuZC5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKyNpZm5kZWYgREFTSF9TVFJMSVNUX0gKKyNkZWZpbmUgREFTSF9TVFJMSVNUX0gKKworc3RydWN0IHN0cmxpc3QgeworCXN0cnVjdCBzdHJsaXN0ICpuZXh0OworCWNoYXIgKnRleHQ7Cit9OworCisKK3N0cnVjdCBhcmdsaXN0IHsKKwlzdHJ1Y3Qgc3RybGlzdCAqbGlzdDsKKwlzdHJ1Y3Qgc3RybGlzdCAqKmxhc3RwOworfTsKKworLyoKKyAqIGV4cGFuZGFyZygpIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhQX0ZVTEwJMHgxCS8qIHBlcmZvcm0gd29yZCBzcGxpdHRpbmcgJiBmaWxlIGdsb2JiaW5nICovCisjZGVmaW5lIEVYUF9USUxERQkweDIJLyogZG8gbm9ybWFsIHRpbGRlIGV4cGFuc2lvbiAqLworI2RlZmluZQlFWFBfVkFSVElMREUJMHg0CS8qIGV4cGFuZCB0aWxkZXMgaW4gYW4gYXNzaWdubWVudCAqLworI2RlZmluZQlFWFBfUkVESVIJMHg4CS8qIGZpbGUgZ2xvYiBmb3IgYSByZWRpcmVjdGlvbiAoMSBtYXRjaCBvbmx5KSAqLworI2RlZmluZSBFWFBfQ0FTRQkweDEwCS8qIGtlZXBzIHF1b3RlcyBhcm91bmQgZm9yIENBU0UgcGF0dGVybiAqLworI2RlZmluZSBFWFBfUkVDT1JECTB4MjAJLyogbmVlZCB0byByZWNvcmQgYXJndW1lbnRzIGZvciBpZnMgYnJlYWt1cCAqLworI2RlZmluZSBFWFBfVkFSVElMREUyCTB4NDAJLyogZXhwYW5kIHRpbGRlcyBhZnRlciBjb2xvbnMgb25seSAqLworI2RlZmluZSBFWFBfV09SRAkweDgwCS8qIGV4cGFuZCB3b3JkIGluIHBhcmFtZXRlciBleHBhbnNpb24gKi8KKyNkZWZpbmUgRVhQX1FXT1JECTB4MTAwCS8qIGV4cGFuZCB3b3JkIGluIHF1b3RlZCBwYXJhbWV0ZXIgZXhwYW5zaW9uICovCisKKwordW5pb24gbm9kZTsKK3ZvaWQgZXhwYW5kaGVyZSh1bmlvbiBub2RlICosIGludCk7Cit2b2lkIGV4cGFuZGFyZyh1bmlvbiBub2RlICosIHN0cnVjdCBhcmdsaXN0ICosIGludCk7Cit2b2lkIGV4cGFyaShpbnQpOworI2RlZmluZSBybWVzY2FwZXMocCkgX3JtZXNjYXBlcygocCksIDApCitjaGFyICpfcm1lc2NhcGVzKGNoYXIgKiwgaW50KTsKK2ludCBjYXNlbWF0Y2godW5pb24gbm9kZSAqLCBjaGFyICopOworCisvKiBGcm9tIGFyaXRoLnkgKi8KK2ludCBhcml0aChjb25zdCBjaGFyICopOworaW50IGV4cGNtZChpbnQgLCBjaGFyICoqKTsKKyNpZmRlZiBVU0VfTEVYCit2b2lkIGFyaXRoX2xleF9yZXNldCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIGFyaXRoX2xleF9yZXNldCgpCisjZW5kaWYKK2ludCB5eWxleCh2b2lkKTsKKworI2VuZGlmCQkvKiBEQVNIX1NUUkxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZnVuY3MvY212IGIvdXNyL2Rhc2gvZnVuY3MvY212Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTY3YzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9mdW5jcy9jbXYKQEAgLTAsMCArMSw0NyBAQAorIyBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisjCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisjIEtlbm5ldGggQWxtcXVpc3QuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworIwlAKCMpY212CTguMiAoQmVya2VsZXkpIDUvNC85NQorCisjIENvbmRpdGlvbmFsIG1vdmUtLWRvbid0IHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZS4KKworY212KCkgeworCWlmIHRlc3QgJCMgIT0gMgorCXRoZW4JZWNobyAiY212OiBhcmcgY291bnQiCisJCXJldHVybiAyCisJZmkKKwlpZiB0ZXN0IC1mICIkMiIgLW8gLXcgIiQyIgorCXRoZW4JZWNobyAiJDIgZXhpc3RzIgorCQlyZXR1cm4gMgorCWZpCisJL2Jpbi9tdiAiJDEiICIkMiIKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Z1bmNzL2RpcnMgYi91c3IvZGFzaC9mdW5jcy9kaXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODQwZWIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9mdW5jcy9kaXJzCkBAIC0wLDAgKzEsNzEgQEAKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKWRpcnMJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKKyMgcHVzaGQsIHBvcGQsIGFuZCBkaXJzIC0tLSB3cml0dGVuIGJ5IENocmlzIEJlcnRpbgorIyBQaXhlbCBDb21wdXRlciBJbmMuIC4uLiF3amgxMiFwaXhlbCFwaXh1dGwhY2hyaXMKKyMgYXMgbW9kaWZpZWQgYnkgUGF0cmljayBFbGFtIG9mIEdUUkkgYW5kIEtlbm5ldGggQWxtcXVpc3QgYXQgVVcKKworcHVzaGQgKCkgeworCVNBVkU9YHB3ZGAKKwlpZiBbICIkMSIgPSAiIiBdCisJdGhlbglpZiBbICIkRFNUQUNLIiA9ICIiIF0KKwkJdGhlbgllY2hvICJwdXNoZDogZGlyZWN0b3J5IHN0YWNrIGVtcHR5LiIKKwkJCXJldHVybiAxCisJCWZpCisJCXNldCAkRFNUQUNLCisJCWNkICQxIHx8IHJldHVybgorCQlzaGlmdCAxCisJCURTVEFDSz0iJCoiCisJZWxzZQljZCAkMSA+IC9kZXYvbnVsbCB8fCByZXR1cm4KKwlmaQorCURTVEFDSz0iJFNBVkUgJERTVEFDSyIKKwlkaXJzCit9CisKK3BvcGQgKCkgeworCWlmIFsgIiREU1RBQ0siID0gIiIgXQorCXRoZW4JZWNobyAicG9wZDogZGlyZWN0b3J5IHN0YWNrIGVtcHR5LiIKKwkJcmV0dXJuIDEKKwlmaQorCXNldCAkRFNUQUNLCisJY2QgJDEKKwlzaGlmdAorCURTVEFDSz0kKgorCWRpcnMKK30KKworZGlycyAoKSB7CisJZWNobyAiYHB3ZGAgJERTVEFDSyIKKwlyZXR1cm4gMAorfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZnVuY3Mva2lsbCBiL3Vzci9kYXNoL2Z1bmNzL2tpbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkZjk1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2Z1bmNzL2tpbGwKQEAgLTAsMCArMSw0NyBAQAorIyBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisjCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisjIEtlbm5ldGggQWxtcXVpc3QuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworIwlAKCMpa2lsbAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKworIyBDb252ZXJ0IGpvYiBuYW1lcyB0byBwcm9jZXNzIGlkcyBhbmQgdGhlbiBydW4gL2Jpbi9raWxsLgorCitraWxsKCkgeworCWxvY2FsIGFyZ3MgeAorCWFyZ3M9CisJZm9yIHggaW4gIiRAIgorCWRvCWNhc2UgJHggaW4KKwkJJSopCXg9YGpvYmlkICIkeCJgIDs7CisJCWVzYWMKKwkJYXJncz0iJGFyZ3MgJHgiCisJZG9uZQorCS9iaW4va2lsbCAkYXJncworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZnVuY3MvbG9naW4gYi91c3IvZGFzaC9mdW5jcy9sb2dpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVlNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZnVuY3MvbG9naW4KQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisjCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisjIEtlbm5ldGggQWxtcXVpc3QuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworIwlAKCMpbG9naW4JOC4yIChCZXJrZWxleSkgNS80Lzk1CisKKyMgcmVwbGFjZXMgdGhlIGxvZ2luIGJ1aWx0aW4gaW4gdGhlIEJTRCBzaGVsbAorbG9naW4gKCkgZXhlYyBsb2dpbiAiJEAiCmRpZmYgLS1naXQgYS91c3IvZGFzaC9mdW5jcy9uZXdncnAgYi91c3IvZGFzaC9mdW5jcy9uZXdncnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwZTdlNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2Z1bmNzL25ld2dycApAQCAtMCwwICsxLDM1IEBACisjIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworIwlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyMJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyMgS2VubmV0aCBBbG1xdWlzdC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisjCUAoIyluZXdncnAJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKK25ld2dycCgpIGV4ZWMgbmV3Z3JwICIkQCIKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2Z1bmNzL3BvcGQgYi91c3IvZGFzaC9mdW5jcy9wb3BkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9mdW5jcy9wb3BkCkBAIC0wLDAgKzEsNzEgQEAKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKXBvcGQJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKKyMgcHVzaGQsIHBvcGQsIGFuZCBkaXJzIC0tLSB3cml0dGVuIGJ5IENocmlzIEJlcnRpbgorIyBQaXhlbCBDb21wdXRlciBJbmMuIC4uLiF3amgxMiFwaXhlbCFwaXh1dGwhY2hyaXMKKyMgYXMgbW9kaWZpZWQgYnkgUGF0cmljayBFbGFtIG9mIEdUUkkgYW5kIEtlbm5ldGggQWxtcXVpc3QgYXQgVVcKKworcHVzaGQgKCkgeworCVNBVkU9YHB3ZGAKKwlpZiBbICIkMSIgPSAiIiBdCisJdGhlbglpZiBbICIkRFNUQUNLIiA9ICIiIF0KKwkJdGhlbgllY2hvICJwdXNoZDogZGlyZWN0b3J5IHN0YWNrIGVtcHR5LiIKKwkJCXJldHVybiAxCisJCWZpCisJCXNldCAkRFNUQUNLCisJCWNkICQxIHx8IHJldHVybgorCQlzaGlmdCAxCisJCURTVEFDSz0iJCoiCisJZWxzZQljZCAkMSA+IC9kZXYvbnVsbCB8fCByZXR1cm4KKwlmaQorCURTVEFDSz0iJFNBVkUgJERTVEFDSyIKKwlkaXJzCit9CisKK3BvcGQgKCkgeworCWlmIFsgIiREU1RBQ0siID0gIiIgXQorCXRoZW4JZWNobyAicG9wZDogZGlyZWN0b3J5IHN0YWNrIGVtcHR5LiIKKwkJcmV0dXJuIDEKKwlmaQorCXNldCAkRFNUQUNLCisJY2QgJDEKKwlzaGlmdAorCURTVEFDSz0kKgorCWRpcnMKK30KKworZGlycyAoKSB7CisJZWNobyAiYHB3ZGAgJERTVEFDSyIKKwlyZXR1cm4gMAorfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZnVuY3MvcHVzaGQgYi91c3IvZGFzaC9mdW5jcy9wdXNoZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNkMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZnVuY3MvcHVzaGQKQEAgLTAsMCArMSw3MSBAQAorIyBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisjCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisjIEtlbm5ldGggQWxtcXVpc3QuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworIwlAKCMpcHVzaGQJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKKyMgcHVzaGQsIHBvcGQsIGFuZCBkaXJzIC0tLSB3cml0dGVuIGJ5IENocmlzIEJlcnRpbgorIyBQaXhlbCBDb21wdXRlciBJbmMuIC4uLiF3amgxMiFwaXhlbCFwaXh1dGwhY2hyaXMKKyMgYXMgbW9kaWZpZWQgYnkgUGF0cmljayBFbGFtIG9mIEdUUkkgYW5kIEtlbm5ldGggQWxtcXVpc3QgYXQgVVcKKworcHVzaGQgKCkgeworCVNBVkU9YHB3ZGAKKwlpZiBbICIkMSIgPSAiIiBdCisJdGhlbglpZiBbICIkRFNUQUNLIiA9ICIiIF0KKwkJdGhlbgllY2hvICJwdXNoZDogZGlyZWN0b3J5IHN0YWNrIGVtcHR5LiIKKwkJCXJldHVybiAxCisJCWZpCisJCXNldCAkRFNUQUNLCisJCWNkICQxIHx8IHJldHVybgorCQlzaGlmdCAxCisJCURTVEFDSz0iJCoiCisJZWxzZQljZCAkMSA+IC9kZXYvbnVsbCB8fCByZXR1cm4KKwlmaQorCURTVEFDSz0iJFNBVkUgJERTVEFDSyIKKwlkaXJzCit9CisKK3BvcGQgKCkgeworCWlmIFsgIiREU1RBQ0siID0gIiIgXQorCXRoZW4JZWNobyAicG9wZDogZGlyZWN0b3J5IHN0YWNrIGVtcHR5LiIKKwkJcmV0dXJuIDEKKwlmaQorCXNldCAkRFNUQUNLCisJY2QgJDEKKwlzaGlmdAorCURTVEFDSz0kKgorCWRpcnMKK30KKworZGlycyAoKSB7CisJZWNobyAiYHB3ZGAgJERTVEFDSyIKKwlyZXR1cm4gMAorfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvZnVuY3Mvc3VzcGVuZCBiL3Vzci9kYXNoL2Z1bmNzL3N1c3BlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4NDQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2Z1bmNzL3N1c3BlbmQKQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisjCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisjIEtlbm5ldGggQWxtcXVpc3QuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisjICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworIwlAKCMpc3VzcGVuZAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKworc3VzcGVuZCgpIHsKKwlsb2NhbCAtCisJc2V0ICtqCisJa2lsbCAtVFNUUCAwCit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9nZW5kZXBzLnBsIGIvdXNyL2Rhc2gvZ2VuZGVwcy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjc5N2RlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvZ2VuZGVwcy5wbApAQCAtMCwwICsxLDM4IEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgR2VuZXJhdGUgZGVwZW5kZW5jaWVzIGZvciAqZ2VuZXJhdGVkKiBoZWFkZXIgZmlsZXMuICBHZW5lcmF0ZWQKKyMgaGVhZGVyIGZpbGVzIGhhdmUgdG8gdXNlICNpbmNsdWRlICJmb28uaCIgc3ludGF4LgorIworCisoJHNyYywgJG9iaiwgQGJ1aWxkX2hlYWRlcnMpID0gQEFSR1Y7CislYnVpbGRfaGVhZGVycyA9IG1hcCB7ICRfID0+IDEgfSBAYnVpbGRfaGVhZGVyczsKKworb3BlbihHRU5ERVBTLCAiPiAkb2JqLy5nZW5kZXBzXDAiKQorICAgIG9yIGRpZSAiJDA6IENhbm5vdCBjcmVhdGUgJG9iai8uZ2VuZGVwczogJCFcbiI7CisKK29wZW5kaXIoRElSLCAkc3JjKSBvciBkaWUgIiQwOiBDYW5ub3Qgb3BlbmRpciAkc3JjOiAkIVxuIjsKK3doaWxlICggZGVmaW5lZCgkZmlsZSA9IHJlYWRkaXIoRElSKSkgKSB7CisgICAgaWYgKCAkZmlsZSA9fiAvXiguKilcLmMkLyApIHsKKwkkYmFzZW5hbWUgPSAkMTsKKwlAaGRycyA9ICgpOworCW9wZW4oRklMRSwgIjwgJHNyYy8kZmlsZVwwIikKKwkgICAgb3IgZGllICIkMDogQ2Fubm90IG9wZW4gJHNyYy8kZmlsZTogJCFcbiI7CisJd2hpbGUgKCBkZWZpbmVkKCRsaW5lID0gPEZJTEU+KSApIHsKKwkgICAgaWYgKCAkbGluZSA9fiAvXlxzKlwjXHMqaW5jbHVkZVxzK1wiKC4qKVwiLyApIHsKKwkJJGhlYWRlciA9ICQxOworCisJCWlmICggJGJ1aWxkX2hlYWRlcnN7JGhlYWRlcn0gKSB7CisJCSAgICBwdXNoKEBoZHJzLCAiXCQob2JqKS8kaGVhZGVyIik7CisJCX0KKwkgICAgfQorCX0KKwljbG9zZShGSUxFKTsKKworCWlmIChzY2FsYXIoQGhkcnMpKSB7CisJICAgIHByaW50IEdFTkRFUFMgIlwkKG9iaikvJGJhc2VuYW1lLm86ICIsIGpvaW4oJyAnLCBAaGRycyksICJcbiI7CisJfQorICAgIH0KK30KKworY2xvc2VkaXIoRElSKTsKK2Nsb3NlKEdFTkRFUFMpOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvaGV0aW8uYyBiL3Vzci9kYXNoL2hldGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2hldGlvLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBUZXJtaW9zIGNvbW1hbmQgbGluZSBIaXN0b3J5IGFuZCBFZGl0dGluZyBmb3IgTmV0QlNEIHNoIChhc2gpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkKKyAqCU1haW4gY29kZToJQWRhbSBSb2dveXNraSA8cm9nb3lza2lAY3MudXRleGFzLmVkdT4KKyAqCUV0YzoJCURhdmUgQ2luZWdlIDxkY2luZWdlQHBzeWNob3Npcy5jb20+CisgKgorICogWW91IG1heSB1c2UgdGhpcyBjb2RlIGFzIHlvdSB3aXNoLCBzbyBsb25nIGFzIHRoZSBvcmlnaW5hbCBhdXRob3IocykKKyAqIGFyZSBhdHRyaWJ1dGVkIGluIGFueSByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIHNvdXJjZSBjb2RlLgorICogVGhpcyBjb2RlIGlzICdhcyBpcycgd2l0aCBubyB3YXJyYW50eS4KKyAqIFRoaXMgY29kZSBtYXkgc2FmZWx5IGJlIGNvbnN1bWVkIGJ5IGEgQlNEIG9yIEdQTCBsaWNlbnNlLgorICoKKyAqIHYgMC41ICAxOTk5MDMyOAlJbml0aWFsIHJlbGVhc2UKKyAqCisgKiBGdXR1cmUgcGxhbnM6IFNpbXBsZSBmaWxlIGFuZCBwYXRoIG5hbWUgY29tcGxldGlvbi4gKGxpa2UgQkFTSCkKKyAqCisgKi8KKworLyoKK1VzYWdlIGFuZCBLbm93biBidWdzOgorCVRlcm1pbmFsIGtleSBjb2RlcyBhcmUgbm90IGV4dGVuc2l2ZSwgYW5kIG1vcmUgd2lsbCBwcm9iYWJseQorCW5lZWQgdG8gYmUgYWRkZWQuIFRoaXMgdmVyc2lvbiB3YXMgY3JlYXRlZCBvbiBEZWJpYW4gR05VL0xpbnV4IDIueC4KKwlEZWxldGUsIEJhY2tzcGFjZSwgSG9tZSwgRW5kLCBhbmQgdGhlIGFycm93IGtleXMgd2VyZSB0ZXN0ZWQKKwl0byB3b3JrIGluIGFuIFh0ZXJtIGFuZCBjb25zb2xlLiBDdHJsLUEgYWxzbyB3b3JrcyBhcyBIb21lLgorCUN0cmwtRSBhbHNvIHdvcmtzIGFzIEVuZC4gQ3RybC1EIGFuZCBDdHJsLVUgcGVyZm9ybSB0aGVpciByZXNwZWN0aXZlCisJZnVuY3Rpb25zLiBUaGUgYmluYXJ5IHNpemUgaW5jcmVhc2UgaXMgPDNLLgorCisJRWRpdHRpbmcgd2lsbCBub3QgZGlzcGxheSBjb3JyZWN0bHkgZm9yIGxpbmVzIGdyZWF0ZXIgdGhlbiB0aGUKKwl0ZXJtaW5hbCB3aWR0aC4gKG1vcmUgdGhlbiBvbmUgbGluZS4pIEhvd2V2ZXIsIGhpc3Rvcnkgd2lsbC4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAiaW5wdXQuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKworI2luY2x1ZGUgImhldGlvLmgiCisKKworI2RlZmluZSAgTUFYX0hJU1RPUlkgICAxNQkJCS8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBsaW5rZWQgbGlzdCBmb3IgdGhlIGNvbW1hbmQgbGluZSBoaXN0b3J5ICovCisKKyNkZWZpbmUgRVNDCTI3CisjZGVmaW5lIERFTAkxMjcKKworc3RhdGljIHN0cnVjdCBoaXN0b3J5ICpoaXNfZnJvbnQgPSBOVUxMOwkvKiBGaXJzdCBlbGVtZW50IGluIGNvbW1hbmQgbGluZSBsaXN0ICovCitzdGF0aWMgc3RydWN0IGhpc3RvcnkgKmhpc19lbmQgPSBOVUxMOwkJLyogTGFzdCBlbGVtZW50IGluIGNvbW1hbmQgbGluZSBsaXN0ICovCitzdGF0aWMgc3RydWN0IHRlcm1pb3Mgb2xkX3Rlcm0sIG5ld190ZXJtOwkvKiBDdXJyZW50IHRlcm1pbyBhbmQgdGhlIHByZXZpb3VzIHRlcm1pbyBiZWZvcmUgc3RhcnRpbmcgYXNoICovCisKK3N0YXRpYyBpbnQgaGlzdG9yeV9jb3VudGVyID0gMDsJCQkvKiBOdW1iZXIgb2YgY29tbWFuZHMgaW4gaGlzdG9yeSBsaXN0ICovCitzdGF0aWMgaW50IHJlc2V0X3Rlcm0gPSAwOwkJCS8qIFNldCB0byB0cnVlIGlmIHRoZSB0ZXJtaW5hbCBuZWVkcyB0byBiZSByZXNldCB1cG9uIGV4aXQgKi8KK3N0YXRpYyBpbnQgaGV0aW9faW50ZXIgPSAwOworCitzdHJ1Y3QgaGlzdG9yeQoreworICAgY2hhciAqczsKKyAgIHN0cnVjdCBoaXN0b3J5ICpwOworICAgc3RydWN0IGhpc3RvcnkgKm47Cit9OworCisKK3ZvaWQgaW5wdXRfZGVsZXRlICAgIChpbnQpOwordm9pZCBpbnB1dF9ob21lICAgICAgKGludCAqKTsKK3ZvaWQgaW5wdXRfZW5kICAgICAgIChpbnQgKiwgaW50KTsKK3ZvaWQgaW5wdXRfYmFja3NwYWNlIChpbnQgKiwgaW50ICopOworCisKKwordm9pZCBoZXRpb19pbml0KHZvaWQpCit7CisJaGV0aW9faW50ZXIgPSAxOworfQorCisKK3ZvaWQgaGV0aW9fcmVzZXRfdGVybSh2b2lkKQoreworCWlmIChyZXNldF90ZXJtKQorCQl0Y3NldGF0dHIoMSwgVENTQU5PVywgJm9sZF90ZXJtKTsKK30KKworCit2b2lkIHNldElPKHN0cnVjdCB0ZXJtaW9zICpuZXcsIHN0cnVjdCB0ZXJtaW9zICpvbGQpCS8qIFNldCB0ZXJtaW5hbCBJTyB0byBjYW5vbmljYWwgbW9kZSwgYW5kIHNhdmUgb2xkIHRlcm0gc2V0dGluZ3MuICovCit7CisJdGNnZXRhdHRyKDAsIG9sZCk7CisJbWVtY3B5KG5ldywgb2xkLCBzaXplb2YoKm5ldykpOworCW5ldy0+Y19jY1tWTUlOXSA9IDE7CisJbmV3LT5jX2NjW1ZUSU1FXSA9IDA7CisJbmV3LT5jX2xmbGFnICY9IH5JQ0FOT047IC8qIHVuYnVmZmVyZWQgaW5wdXQgKi8KKwluZXctPmNfbGZsYWcgJj0gfkVDSE87CisJdGNzZXRhdHRyKDAsIFRDU0FOT1csIG5ldyk7Cit9CisKK3ZvaWQgaW5wdXRfaG9tZShpbnQgKmN1cnNvcikJCQkJLyogQ29tbWFuZCBsaW5lIGlucHV0IHJvdXRpbmVzICovCit7CisgCXdoaWxlICgqY3Vyc29yID4gMCkgeworCQlvdXQxYygnXGInKTsKKwkJLS0qY3Vyc29yOworCX0KKwlmbHVzaG91dChvdXQxKTsKK30KKworCit2b2lkIGlucHV0X2RlbGV0ZShpbnQgY3Vyc29yKQoreworCWludCBqID0gMDsKKworCW1lbW1vdmUocGFyc2VuZXh0YyArIGN1cnNvciwgcGFyc2VuZXh0YyArIGN1cnNvciArIDEsCisJCUJVRlNJWiAtIGN1cnNvciAtIDEpOworCWZvciAoaiA9IGN1cnNvcjsgaiA8IChCVUZTSVogLSAxKTsgaisrKSB7CisJCWlmICghKihwYXJzZW5leHRjICsgaikpCisJCQlicmVhazsKKwkJZWxzZQorCQkJb3V0MWMoKihwYXJzZW5leHRjICsgaikpOworCX0KKworCW91dDFzdHIoIiBcYiIpOworCisJd2hpbGUgKGotLSA+IGN1cnNvcikKKwkJb3V0MWMoJ1xiJyk7CisJZmx1c2hvdXQob3V0MSk7Cit9CisKKwordm9pZCBpbnB1dF9lbmQoaW50ICpjdXJzb3IsIGludCBsZW4pCit7CisJd2hpbGUgKCpjdXJzb3IgPCBsZW4pIHsKKwkJb3V0MXN0cigiXDAzM1tDIik7CisJCSsrKmN1cnNvcjsKKwl9CisJZmx1c2hvdXQob3V0MSk7Cit9CisKKwordm9pZAoraW5wdXRfYmFja3NwYWNlKGludCAqY3Vyc29yLCBpbnQgKmxlbikKK3sKKwlpbnQgaiA9IDA7CisKKwlpZiAoKmN1cnNvciA+IDApIHsKKwkJb3V0MXN0cigiXGIgXGIiKTsKKwkJLS0qY3Vyc29yOworCQltZW1tb3ZlKHBhcnNlbmV4dGMgKyAqY3Vyc29yLCBwYXJzZW5leHRjICsgKmN1cnNvciArIDEsCisJCQlCVUZTSVogLSAqY3Vyc29yICsgMSk7CisKKwkJZm9yIChqID0gKmN1cnNvcjsgaiA8IChCVUZTSVogLSAxKTsgaisrKSB7CisJCQlpZiAoISoocGFyc2VuZXh0YyArIGopKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCW91dDFjKCoocGFyc2VuZXh0YyArIGopKTsKKwkJfQorCisJCW91dDFzdHIoIiBcYiIpOworCisJCXdoaWxlIChqLS0gPiAqY3Vyc29yKQorCQkJb3V0MWMoJ1xiJyk7CisKKwkJLS0qbGVuOworCQlmbHVzaG91dChvdXQxKTsKKwl9Cit9CisKK2ludCBoZXRpb19yZWFkX2lucHV0KGludCBmZCkKK3sKKwlpbnQgbnIgPSAwOworCisJLyogQXJlIHdlIGFuIGludGVyYWN0aXZlIHNoZWxsPyAqLworCWlmICghaGV0aW9faW50ZXIgfHwgZmQpIHsKKwkJcmV0dXJuIC0yNTU7CisJfSBlbHNlIHsKKwkJaW50IGxlbiA9IDA7CisJCWludCBqID0gMDsKKwkJaW50IGN1cnNvciA9IDA7CisJCWludCBicmVha19vdXQgPSAwOworCQlpbnQgcmV0ID0gMDsKKwkJY2hhciBjID0gMDsKKwkJc3RydWN0IGhpc3RvcnkgKmhwID0gaGlzX2VuZDsKKworCQlpZiAoIXJlc2V0X3Rlcm0pIHsKKwkJCXNldElPKCZuZXdfdGVybSwgJm9sZF90ZXJtKTsKKwkJCXJlc2V0X3Rlcm0gPSAxOworCQl9IGVsc2UgeworCQkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZuZXdfdGVybSk7CisJCX0KKworCQltZW1zZXQocGFyc2VuZXh0YywgMCwgQlVGU0laKTsKKworCQl3aGlsZSAoMSkgeworCQkJaWYgKChyZXQgPSByZWFkKGZkLCAmYywgMSkpIDwgMSkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlzd2l0Y2ggKGMpIHsKKyAgIAkJCQljYXNlIDE6CQkvKiBDb250cm9sLUEgQmVnaW5uaW5nIG9mIGxpbmUgKi8KKyAgIAkJCQkJaW5wdXRfaG9tZSgmY3Vyc29yKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA1OgkJLyogQ29udHJvbC1FIEVPTCAqLworCQkJCQlpbnB1dF9lbmQoJmN1cnNvciwgbGVuKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgkJLyogQ29udHJvbC1EICovCisJCQkJCWlmICghbGVuKQorCQkJCQkJZXhpdHNoZWxsKDApOworCQkJCQlicmVhazsKKwkJCQljYXNlIDIxOiAJLyogQ29udHJvbC1VICovCisJCQkJCS8qIFJldHVybiB0byBiZWdpbmluZyBvZiBsaW5lLiAqLworCQkJCQlmb3IgKDsgY3Vyc29yID4gMDsgY3Vyc29yLS0pCisJCQkJCQlvdXQxYygnXGInKTsKKwkJCQkJLyogRXJhc2Ugb2xkIGNvbW1hbmQuICovCisJCQkJCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworCQkJCQkJLyoKKwkJCQkJCSAqIENsZWFyIGJ1ZmZlciB3aGlsZSB3ZSdyZSBhdAorCQkJCQkJICogaXQuCisJCQkJCQkgKi8KKwkJCQkJCXBhcnNlbmV4dGNbal0gPSAwOworCQkJCQkJb3V0MWMoJyAnKTsKKwkJCQkJfQorCQkJCQkvKiByZXR1cm4gdG8gYmVnaW5pbmcgb2YgbGluZSAqLworCQkJCQlmb3IgKDsgbGVuID4gMDsgbGVuLS0pCisJCQkJCQlvdXQxYygnXGInKTsKKwkJCQkJZmx1c2hvdXQob3V0MSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xiJzoJLyogQmFja3NwYWNlICovCisJCQkJY2FzZSBERUw6CisJCQkJCWlucHV0X2JhY2tzcGFjZSgmY3Vyc29yLCAmbGVuKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXG4nOgkvKiBFbnRlciAqLworCQkJCQkqKHBhcnNlbmV4dGMgKyBsZW4rKyArIDEpID0gYzsKKwkJCQkJb3V0MWMoYyk7CisJCQkJCWZsdXNob3V0KG91dDEpOworCQkJCQlicmVha19vdXQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlIEVTQzoJLyogZXNjYXBlIHNlcXVlbmNlIGZvbGxvd3MgKi8KKwkJCQkJaWYgKChyZXQgPSByZWFkKGZkLCAmYywgMSkpIDwgMSkKKwkJCQkJCXJldHVybiByZXQ7CisKKwkJCQkJaWYgKGMgPT0gJ1snICkgeyAgICAvKiA5MSAqLworCQkJCQkJaWYgKChyZXQgPSByZWFkKGZkLCAmYywgMSkpIDwgMSkKKwkJCQkJCQlyZXR1cm4gcmV0OworCisJCQkJCQlzd2l0Y2ggKGMpIHsKKwkJCQkJCQljYXNlICdBJzoKKwkJCQkJCQkJaWYgKGhwICYmIGhwLT5wKSB7CQkvKiBVcCAqLworCQkJCQkJCQkJaHAgPSBocC0+cDsKKwkJCQkJCQkJCWdvdG8gaG9wOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ0InOgorCQkJCQkJCQlpZiAoaHAgJiYgaHAtPm4gJiYgaHAtPm4tPnMpIHsJLyogRG93biAqLworCQkJCQkJCQkJaHAgPSBocC0+bjsKKwkJCQkJCQkJCWdvdG8gaG9wOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCitob3A6CQkJCQkJLyogaG9wICovCisJCQkJCQkJCWxlbiA9IHN0cmxlbihwYXJzZW5leHRjKTsKKworCQkJCQkJCQlmb3IgKDsgY3Vyc29yID4gMDsgY3Vyc29yLS0pCQkvKiByZXR1cm4gdG8gYmVnaW5pbmcgb2YgbGluZSAqLworCQkJCQkJCQkJb3V0MWMoJ1xiJyk7CisKKwkJICAgCQkJCQkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQkJLyogZXJhc2Ugb2xkIGNvbW1hbmQgKi8KKwkJCQkJCQkJCW91dDFjKCcgJyk7CisKKwkJCQkJCQkJZm9yICg7IGogPiAwOyBqLS0pCQkvKiByZXR1cm4gdG8gYmVnaW5pbmcgb2YgbGluZSAqLworCQkJCQkJCQkJb3V0MWMoJ1xiJyk7CisKKwkJCQkJCQkJc3RyY3B5IChwYXJzZW5leHRjLCBocC0+cyk7CQkvKiB3cml0ZSBuZXcgY29tbWFuZCAqLworCQkJCQkJCQlsZW4gPSBzdHJsZW4gKGhwLT5zKTsKKwkJCQkJCQkJb3V0MXN0cihwYXJzZW5leHRjKTsKKwkJCQkJCQkJZmx1c2hvdXQob3V0MSk7CisJCQkJCQkJCWN1cnNvciA9IGxlbjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAnQyc6CQkvKiBSaWdodCAqLworCQkJCQkJCQlpZiAoY3Vyc29yIDwgbGVuKSB7CisJCQkJCQkJCQlvdXQxc3RyKCJcMDMzW0MiKTsKKwkJCQkJCQkJCWN1cnNvcisrOworCQkJCQkJCQkJZmx1c2hvdXQob3V0MSk7CisJCQkJCQkgCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJ0QnOgkJLyogTGVmdCAqLworCQkJCQkJCQlpZiAoY3Vyc29yID4gMCkgeworCQkJCQkJCQkJb3V0MXN0cigiXDAzM1tEIik7CisJCQkJCQkJCQljdXJzb3ItLTsKKwkJCQkJCQkJCWZsdXNob3V0KG91dDEpOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJzMnOgkJLyogRGVsZXRlICovCisJCQkJCQkJCWlmIChjdXJzb3IgIT0gbGVuKSB7CisJCQkJCQkJCQlpbnB1dF9kZWxldGUoY3Vyc29yKTsKKwkJCQkJCQkJCWxlbi0tOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgJzEnOgkJLyogSG9tZSAoQ3RybC1BKSAqLworCQkJCQkJCQlpbnB1dF9ob21lKCZjdXJzb3IpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICc0JzoJCS8qIEVuZCAoQ3RybC1FKSAqLworCQkJCQkJCQlpbnB1dF9lbmQoJmN1cnNvciwgbGVuKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAoYyA9PSAnMScgfHwgYyA9PSAnMycgfHwgYyA9PSAnNCcpCisJCQkJCQkJaWYgKChyZXQgPSByZWFkKGZkLCAmYywgMSkpIDwgMSkKKwkJCQkJCQkJcmV0dXJuIHJldDsgIC8qIHJlYWQgMTI2ICh+KSAqLworCQkJCQl9CisKKwkJCQkJaWYgKGMgPT0gJ08nKSB7CS8qIDc5ICovCisJCQkJCQlpZiAoKHJldCA9IHJlYWQoZmQsICZjLCAxKSkgPCAxKQorCQkJCQkJCXJldHVybiByZXQ7CisJCQkJCQlzd2l0Y2ggKGMpIHsKKwkJCQkJCQljYXNlICdIJzoJCS8qIEhvbWUgKHh0ZXJtKSAqLworICAgICAgCQkJCQkJCQlpbnB1dF9ob21lKCZjdXJzb3IpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlICdGJzoJCS8qIEVuZCAoeHRlcm1fICovCisJCQkJCQkJCWlucHV0X2VuZCgmY3Vyc29yLCBsZW4pOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWMgPSAwOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CQkJCS8qIElmIGl0J3MgcmVndWxhciBpbnB1dCwgZG8gdGhlIG5vcm1hbCB0aGluZyAqLworCQkJCQlpZiAoIWlzcHJpbnQoYykpCQkvKiBTa2lwIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyAqLworCQkJCQkJYnJlYWs7CisKKwkgICAgICAgCQkJCWlmIChsZW4gPj0gKEJVRlNJWiAtIDIpKQkvKiBOZWVkIHRvIGxlYXZlIHNwYWNlIGZvciBlbnRlciAqLworCQkgIAkJCQlicmVhazsKKworCQkJCQlsZW4rKzsKKworCQkJCQlpZiAoY3Vyc29yID09IChsZW4gLSAxKSkgewkvKiBBcHBlbmQgaWYgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCQkJCQkJKihwYXJzZW5leHRjICsgY3Vyc29yKSA9IGM7CisJCQkJCX0gZWxzZSB7CQkJLyogSW5zZXJ0IG90aGVyd2lzZSAqLworCQkJCQkJbWVtbW92ZShwYXJzZW5leHRjICsgY3Vyc29yICsgMSwgcGFyc2VuZXh0YyArIGN1cnNvciwKKwkJCQkJCQlsZW4gLSBjdXJzb3IgLSAxKTsKKworCQkJCQkJKihwYXJzZW5leHRjICsgY3Vyc29yKSA9IGM7CisKKwkJCQkJCWZvciAoaiA9IGN1cnNvcjsgaiA8IGxlbjsgaisrKQorCQkJCQkJCW91dDFjKCoocGFyc2VuZXh0YyArIGopKTsKKwkJCQkJCWZvciAoOyBqID4gY3Vyc29yOyBqLS0pCisJCQkJCQkJb3V0MXN0cigiXDAzM1tEIik7CisJCQkJCX0KKworCQkJCQljdXJzb3IrKzsKKwkJCQkJb3V0MWMoYyk7CisJCQkJCWZsdXNob3V0KG91dDEpOworCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGJyZWFrX291dCkJCS8qIEVudGVyIGlzIHRoZSBjb21tYW5kIHRlcm1pbmF0b3IsIG5vIG1vcmUgaW5wdXQuICovCisJCQkJYnJlYWs7CisJCX0KKworCQluciA9IGxlbiArIDE7CisJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmb2xkX3Rlcm0pOworCisJCWlmICgqKHBhcnNlbmV4dGMpKSB7CQkvKiBIYW5kbGUgY29tbWFuZCBoaXN0b3J5IGxvZyAqLworCQkJc3RydWN0IGhpc3RvcnkgKmggPSBoaXNfZW5kOworCisJCQlpZiAoIWgpIHsgICAgICAgLyogTm8gcHJldmlvdXMgaGlzdG9yeSAqLworCQkJCWggPSBoaXNfZnJvbnQgPSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaGlzdG9yeSkpOworCQkJCWgtPm4gPSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaGlzdG9yeSkpOworCQkJCWgtPnAgPSBOVUxMOworCQkJCWgtPnMgPSBzdHJkdXAocGFyc2VuZXh0Yyk7CisKKwkJCQloLT5uLT5wID0gaDsKKwkJCQloLT5uLT5uID0gTlVMTDsKKwkJCQloLT5uLT5zID0gTlVMTDsKKwkJCQloaXNfZW5kID0gaC0+bjsKKwkJCQloaXN0b3J5X2NvdW50ZXIrKzsKKwkJCX0gZWxzZSB7CS8qIEFkZCBhIG5ldyBoaXN0b3J5IGNvbW1hbmQgKi8KKworCQkJCWgtPm4gPSBtYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaGlzdG9yeSkpOworCisJCQkJaC0+bi0+cCA9IGg7CisJCQkJaC0+bi0+biA9IE5VTEw7CisJCQkJaC0+bi0+cyA9IE5VTEw7CisJCQkJaC0+cyA9IHN0cmR1cChwYXJzZW5leHRjKTsKKwkJCQloaXNfZW5kID0gaC0+bjsKKworCQkJCWlmIChoaXN0b3J5X2NvdW50ZXIgPj0gTUFYX0hJU1RPUlkpIHsJLyogQWZ0ZXIgbWF4IGhpc3RvcnksIHJlbW92ZSB0aGUgbGFzdCBrbm93biBjb21tYW5kICovCisJCQkJCXN0cnVjdCBoaXN0b3J5ICpwID0gaGlzX2Zyb250LT5uOworCisJCQkJCXAtPnAgPSBOVUxMOworCQkJCQlmcmVlKGhpc19mcm9udC0+cyk7CisJCQkJCWZyZWUoaGlzX2Zyb250KTsKKwkJCQkJaGlzX2Zyb250ID0gcDsKKwkJCQl9IGVsc2UgeworCQkJCQloaXN0b3J5X2NvdW50ZXIrKzsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbnI7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9oZXRpby5oIGIvdXNyL2Rhc2gvaGV0aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ5NzEzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvaGV0aW8uaApAQCAtMCwwICsxLDIyIEBACisvKgorICogVGVybWlvcyBjb21tYW5kIGxpbmUgSGlzdG9yeSBhbmQgRWRpdHRpbmcgZm9yIE5ldEJTRCBzaCAoYXNoKQorICogQ29weXJpZ2h0IChjKSAxOTk5CisgKglNYWluIGNvZGU6CUFkYW0gUm9nb3lza2kgPHJvZ295c2tpQGNzLnV0ZXhhcy5lZHU+CisgKglFdGM6CQlEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorICoKKyAqIFlvdSBtYXkgdXNlIHRoaXMgY29kZSBhcyB5b3Ugd2lzaCwgc28gbG9uZyBhcyB0aGUgb3JpZ2luYWwgYXV0aG9yKHMpCisgKiBhcmUgYXR0cmlidXRlZCBpbiBhbnkgcmVkaXN0cmlidXRpb25zIG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqIFRoaXMgY29kZSBpcyAnYXMgaXMnIHdpdGggbm8gd2FycmFudHkuCisgKiBUaGlzIGNvZGUgbWF5IHNhZmVseSBiZSBjb25zdW1lZCBieSBhIEJTRCBvciBHUEwgbGljZW5zZS4KKyAqCisgKiB2IDAuNSAgMTk5OTAzMjgJSW5pdGlhbCByZWxlYXNlCisgKgorICogRnV0dXJlIHBsYW5zOiBTaW1wbGUgZmlsZSBhbmQgcGF0aCBuYW1lIGNvbXBsZXRpb24uIChsaWtlIEJBU0gpCisgKgorICovCisKK3ZvaWQgaGV0aW9faW5pdCh2b2lkKTsKK2ludCBoZXRpb19yZWFkX2lucHV0KGludCBmZCk7Cit2b2lkIGhldGlvX3Jlc2V0X3Rlcm0odm9pZCk7CisKK2V4dGVybiBpbnQgaGV0aW9faW50ZXI7CmRpZmYgLS1naXQgYS91c3IvZGFzaC9oaXN0ZWRpdC5jIGIvdXNyL2Rhc2gvaGlzdGVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ3OTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvaGlzdGVkaXQuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisvKgorICogRWRpdGxpbmUgYW5kIGhpc3RvcnkgZnVuY3Rpb25zIChhbmQgZ2x1ZSkuCisgKi8KKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInZhci5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2lmbmRlZiBTTUFMTAorI2luY2x1ZGUgIm15aGlzdGVkaXQuaCIKKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKworI2RlZmluZSBNQVhISVNUTE9PUFMJNAkvKiBtYXggcmVjdXJzaW9ucyB0aHJvdWdoIGZjICovCisjZGVmaW5lIERFRkVESVRPUgkiZWQiCS8qIGRlZmF1bHQgZWRpdG9yICpzaG91bGQqIGJlICRFRElUT1IgKi8KKworSGlzdG9yeSAqaGlzdDsJLyogaGlzdG9yeSBjb29raWUgKi8KK0VkaXRMaW5lICplbDsJLyogZWRpdGxpbmUgY29va2llICovCitpbnQgZGlzcGxheWhpc3Q7CitzdGF0aWMgRklMRSAqZWxfaW4sICplbF9vdXQ7CisKK1NUQVRJQyBjb25zdCBjaGFyICpmY19yZXBsYWNlKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBjaGFyICopOworCisjaWZkZWYgREVCVUcKK2V4dGVybiBGSUxFICp0cmFjZWZpbGU7CisjZW5kaWYKKworLyoKKyAqIFNldCBoaXN0b3J5IGFuZCBlZGl0aW5nIHN0YXR1cy4gIENhbGxlZCB3aGVuZXZlciB0aGUgc3RhdHVzIG1heQorICogaGF2ZSBjaGFuZ2VkIChmaWd1cmVzIG91dCB3aGF0IHRvIGRvKS4KKyAqLwordm9pZAoraGlzdGVkaXQodm9pZCkKK3sKKwlGSUxFICplbF9lcnI7CisKKyNkZWZpbmUgZWRpdGluZyAoRWZsYWcgfHwgVmZsYWcpCisKKwlpZiAoaWZsYWcpIHsKKwkJaWYgKCFoaXN0KSB7CisJCQkvKgorCQkJICogdHVybiBoaXN0b3J5IG9uCisJCQkgKi8KKwkJCUlOVE9GRjsKKwkJCWhpc3QgPSBoaXN0b3J5X2luaXQoKTsKKwkJCUlOVE9OOworCisJCQlpZiAoaGlzdCAhPSBOVUxMKQorCQkJCXNldGhpc3RzaXplKGhpc3RzaXpldmFsKCkpOworCQkJZWxzZQorCQkJCW91dDJzdHIoInNoOiBjYW4ndCBpbml0aWFsaXplIGhpc3RvcnlcbiIpOworCQl9CisJCWlmIChlZGl0aW5nICYmICFlbCAmJiBpc2F0dHkoMCkpIHsgLyogJiYgaXNhdHR5KDIpID8/PyAqLworCQkJLyoKKwkJCSAqIHR1cm4gZWRpdGluZyBvbgorCQkJICovCisJCQlJTlRPRkY7CisJCQlpZiAoZWxfaW4gPT0gTlVMTCkKKwkJCQllbF9pbiA9IGZkb3BlbigwLCAiciIpOworCQkJaWYgKGVsX291dCA9PSBOVUxMKQorCQkJCWVsX291dCA9IGZkb3BlbigyLCAidyIpOworCQkJaWYgKGVsX2luID09IE5VTEwgfHwgZWxfb3V0ID09IE5VTEwpCisJCQkJZ290byBiYWQ7CisJCQllbF9lcnIgPSBlbF9vdXQ7CisjaWYgREVCVUcKKwkJCWlmICh0cmFjZWZpbGUpCisJCQkJZWxfZXJyID0gdHJhY2VmaWxlOworI2VuZGlmCisJCQllbCA9IGVsX2luaXQoYXJnMCwgZWxfaW4sIGVsX291dCwgZWxfZXJyKTsKKwkJCWlmIChlbCAhPSBOVUxMKSB7CisJCQkJaWYgKGhpc3QpCisJCQkJCWVsX3NldChlbCwgRUxfSElTVCwgaGlzdG9yeSwgaGlzdCk7CisJCQkJZWxfc2V0KGVsLCBFTF9QUk9NUFQsIGdldHByb21wdCk7CisJCQl9IGVsc2UgeworYmFkOgorCQkJCW91dDJzdHIoInNoOiBjYW4ndCBpbml0aWFsaXplIGVkaXRpbmdcbiIpOworCQkJfQorCQkJSU5UT047CisJCX0gZWxzZSBpZiAoIWVkaXRpbmcgJiYgZWwpIHsKKwkJCUlOVE9GRjsKKwkJCWVsX2VuZChlbCk7CisJCQllbCA9IE5VTEw7CisJCQlJTlRPTjsKKwkJfQorCQlpZiAoZWwpIHsKKwkJCWlmIChWZmxhZykKKwkJCQllbF9zZXQoZWwsIEVMX0VESVRPUiwgInZpIik7CisJCQllbHNlIGlmIChFZmxhZykKKwkJCQllbF9zZXQoZWwsIEVMX0VESVRPUiwgImVtYWNzIik7CisJCQllbF9zb3VyY2UoZWwsIE5VTEwpOworCQl9CisJfSBlbHNlIHsKKwkJSU5UT0ZGOworCQlpZiAoZWwpIHsJLyogbm8gZWRpdGluZyBpZiBub3QgaW50ZXJhY3RpdmUgKi8KKwkJCWVsX2VuZChlbCk7CisJCQllbCA9IE5VTEw7CisJCX0KKwkJaWYgKGhpc3QpIHsKKwkJCWhpc3RvcnlfZW5kKGhpc3QpOworCQkJaGlzdCA9IE5VTEw7CisJCX0KKwkJSU5UT047CisJfQorfQorCisKK3ZvaWQKK3NldGhpc3RzaXplKGNvbnN0IGNoYXIgKmhzKQoreworCWludCBoaXN0c2l6ZTsKKwlIaXN0RXZlbnQgaGU7CisKKwlpZiAoaGlzdCAhPSBOVUxMKSB7CisJCWlmIChocyA9PSBOVUxMIHx8ICpocyA9PSAnXDAnIHx8CisJCSAgIChoaXN0c2l6ZSA9IGF0b2koaHMpKSA8IDApCisJCQloaXN0c2l6ZSA9IDEwMDsKKwkJaGlzdG9yeShoaXN0LCAmaGUsIEhfU0VUU0laRSwgaGlzdHNpemUpOworCX0KK30KKwordm9pZAorc2V0dGVybShjb25zdCBjaGFyICp0ZXJtKQoreworCWlmIChlbCAhPSBOVUxMICYmIHRlcm0gIT0gTlVMTCkKKwkJaWYgKGVsX3NldChlbCwgRUxfVEVSTUlOQUwsIHRlcm0pICE9IDApIHsKKwkJCW91dGZtdChvdXQyLCAic2g6IENhbid0IHNldCB0ZXJtaW5hbCB0eXBlICVzXG4iLCB0ZXJtKTsKKwkJCW91dGZtdChvdXQyLCAic2g6IFVzaW5nIGR1bWIgdGVybWluYWwgc2V0dGluZ3MuXG4iKTsKKwkJfQorfQorCisvKgorICogIFRoaXMgY29tbWFuZCBpcyBwcm92aWRlZCBzaW5jZSBQT1NJWCBkZWNpZGVkIHRvIHN0YW5kYXJkaXplCisgKiAgdGhlIEtvcm4gc2hlbGwgZmMgY29tbWFuZC4gIE9oIHdlbGwuLi4KKyAqLworaW50CitoaXN0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgY2g7CisJY29uc3QgY2hhciAqZWRpdG9yID0gTlVMTDsKKwlIaXN0RXZlbnQgaGU7CisJaW50IGxmbGcgPSAwLCBuZmxnID0gMCwgcmZsZyA9IDAsIHNmbGcgPSAwOworCWludCBpLCByZXR2YWw7CisJY29uc3QgY2hhciAqZmlyc3RzdHIsICpsYXN0c3RyOworCWludCBmaXJzdCwgbGFzdCwgZGlyZWN0aW9uOworCWNoYXIgKnBhdCA9IE5VTEwsICpyZXBsOwkvKiBrc2ggImZjIG9sZD1uZXciIGNyYXAgKi8KKwlzdGF0aWMgaW50IGFjdGl2ZSA9IDA7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXI7CisJY2hhciBlZGl0ZmlsZVtNQVhQQVRITEVOICsgMV07CisJRklMRSAqZWZwOworI2lmZGVmIF9fR05VQ19fCisJLyogQXZvaWQgbG9uZ2ptcCBjbG9iYmVyaW5nICovCisJKHZvaWQpICZlZGl0b3I7CisJKHZvaWQpICZsZmxnOworCSh2b2lkKSAmbmZsZzsKKwkodm9pZCkgJnJmbGc7CisJKHZvaWQpICZzZmxnOworCSh2b2lkKSAmZmlyc3RzdHI7CisJKHZvaWQpICZsYXN0c3RyOworCSh2b2lkKSAmcGF0OworCSh2b2lkKSAmcmVwbDsKKwkodm9pZCkgJmVmcDsKKwkodm9pZCkgJmFyZ2M7CisJKHZvaWQpICZhcmd2OworI2VuZGlmCisKKwlpZiAoaGlzdCA9PSBOVUxMKQorCQlzaF9lcnJvcigiaGlzdG9yeSBub3QgYWN0aXZlIik7CisKKwlpZiAoYXJnYyA9PSAxKQorCQlzaF9lcnJvcigibWlzc2luZyBoaXN0b3J5IGFyZ3VtZW50Iik7CisKKyNpZmRlZiBfX0dMSUJDX18KKwlvcHRpbmQgPSAwOworI2Vsc2UKKwlvcHRyZXNldCA9IDE7IG9wdGluZCA9IDE7IC8qIGluaXRpYWxpemUgZ2V0b3B0ICovCisjZW5kaWYKKwl3aGlsZSAobm90X2ZjbnVtYmVyKGFyZ3Zbb3B0aW5kXSkgJiYKKwkgICAgICAoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIjplOmxucnMiKSkgIT0gLTEpCisJCXN3aXRjaCAoKGNoYXIpY2gpIHsKKwkJY2FzZSAnZSc6CisJCQllZGl0b3IgPSBvcHRpb25hcmc7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlsZmxnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5mbGcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmZsZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzZmxnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICc6JzoKKwkJCXNoX2Vycm9yKCJvcHRpb24gLSVjIGV4cGVjdHMgYXJndW1lbnQiLCBvcHRvcHQpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXNoX2Vycm9yKCJ1bmtub3duIG9wdGlvbjogLSVjIiwgb3B0b3B0KTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCWFyZ2MgLT0gb3B0aW5kLCBhcmd2ICs9IG9wdGluZDsKKworCS8qCisJICogSWYgZXhlY3V0aW5nLi4uCisJICovCisJaWYgKGxmbGcgPT0gMCB8fCBlZGl0b3IgfHwgc2ZsZykgeworCQlsZmxnID0gMDsJLyogaWdub3JlICovCisJCWVkaXRmaWxlWzBdID0gJ1wwJzsKKwkJLyoKKwkJICogQ2F0Y2ggaW50ZXJydXB0cyB0byByZXNldCBhY3RpdmUgY291bnRlciBhbmQKKwkJICogY2xlYW51cCB0ZW1wIGZpbGVzLgorCQkgKi8KKwkJaWYgKHNldGptcChqbXBsb2MubG9jKSkgeworCQkJYWN0aXZlID0gMDsKKwkJCWlmICgqZWRpdGZpbGUpCisJCQkJdW5saW5rKGVkaXRmaWxlKTsKKwkJCWhhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwkJCWxvbmdqbXAoaGFuZGxlci0+bG9jLCAxKTsKKwkJfQorCQlzYXZlaGFuZGxlciA9IGhhbmRsZXI7CisJCWhhbmRsZXIgPSAmam1wbG9jOworCQlpZiAoKythY3RpdmUgPiBNQVhISVNUTE9PUFMpIHsKKwkJCWFjdGl2ZSA9IDA7CisJCQlkaXNwbGF5aGlzdCA9IDA7CisJCQlzaF9lcnJvcigiY2FsbGVkIHJlY3Vyc2l2ZWx5IHRvbyBtYW55IHRpbWVzIik7CisJCX0KKwkJLyoKKwkJICogU2V0IGVkaXRvci4KKwkJICovCisJCWlmIChzZmxnID09IDApIHsKKwkJCWlmIChlZGl0b3IgPT0gTlVMTCAmJgorCQkJICAgIChlZGl0b3IgPSBibHRpbmxvb2t1cCgiRkNFRElUIikpID09IE5VTEwgJiYKKwkJCSAgICAoZWRpdG9yID0gYmx0aW5sb29rdXAoIkVESVRPUiIpKSA9PSBOVUxMKQorCQkJCWVkaXRvciA9IERFRkVESVRPUjsKKwkJCWlmIChlZGl0b3JbMF0gPT0gJy0nICYmIGVkaXRvclsxXSA9PSAnXDAnKSB7CisJCQkJc2ZsZyA9IDE7CS8qIG5vIGVkaXQgKi8KKwkJCQllZGl0b3IgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJZiBleGVjdXRpbmcsIHBhcnNlIFtvbGQ9bmV3XSBub3cKKwkgKi8KKwlpZiAobGZsZyA9PSAwICYmIGFyZ2MgPiAwICYmCisJICAgICAoKHJlcGwgPSBzdHJjaHIoYXJndlswXSwgJz0nKSkgIT0gTlVMTCkpIHsKKwkJcGF0ID0gYXJndlswXTsKKwkJKnJlcGwrKyA9ICdcMCc7CisJCWFyZ2MtLSwgYXJndisrOworCX0KKwkvKgorCSAqIGRldGVybWluZSBbZmlyc3RdIGFuZCBbbGFzdF0KKwkgKi8KKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDA6CisJCWZpcnN0c3RyID0gbGZsZyA/ICItMTYiIDogIi0xIjsKKwkJbGFzdHN0ciA9ICItMSI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZmlyc3RzdHIgPSBhcmd2WzBdOworCQlsYXN0c3RyID0gbGZsZyA/ICItMSIgOiBhcmd2WzBdOworCQlicmVhazsKKwljYXNlIDI6CisJCWZpcnN0c3RyID0gYXJndlswXTsKKwkJbGFzdHN0ciA9IGFyZ3ZbMV07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNoX2Vycm9yKCJ0b28gbWFueSBhcmdzIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJLyoKKwkgKiBUdXJuIGludG8gZXZlbnQgbnVtYmVycy4KKwkgKi8KKwlmaXJzdCA9IHN0cl90b19ldmVudChmaXJzdHN0ciwgMCk7CisJbGFzdCA9IHN0cl90b19ldmVudChsYXN0c3RyLCAxKTsKKworCWlmIChyZmxnKSB7CisJCWkgPSBsYXN0OworCQlsYXN0ID0gZmlyc3Q7CisJCWZpcnN0ID0gaTsKKwl9CisJLyoKKwkgKiBYWFggLSB0aGlzIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZSBldmVudCBudW1iZXJzCisJICogYWx3YXlzIGluY3JlYXNpbmcuICBBZGQgc2VxdWVuY2UgbnVtYmVycyBvciBvZmZzZXQKKwkgKiB0byB0aGUgaGlzdG9yeSBlbGVtZW50IGluIG5leHQgKGRpc2tiYXNlZCkgcmVsZWFzZS4KKwkgKi8KKwlkaXJlY3Rpb24gPSBmaXJzdCA8IGxhc3QgPyBIX1BSRVYgOiBIX05FWFQ7CisKKwkvKgorCSAqIElmIGVkaXRpbmcsIGdyYWIgYSB0ZW1wIGZpbGUuCisJICovCisJaWYgKGVkaXRvcikgeworCQlpbnQgZmQ7CisJCUlOVE9GRjsJCS8qIGVhc2llciAqLworCQlzcHJpbnRmKGVkaXRmaWxlLCAiJXNfc2hYWFhYWFgiLCBfUEFUSF9UTVApOworCQlpZiAoKGZkID0gbWtzdGVtcChlZGl0ZmlsZSkpIDwgMCkKKwkJCXNoX2Vycm9yKCJjYW4ndCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUgJXMiLCBlZGl0ZmlsZSk7CisJCWlmICgoZWZwID0gZmRvcGVuKGZkLCAidyIpKSA9PSBOVUxMKSB7CisJCQljbG9zZShmZCk7CisJCQlzaF9lcnJvcigiY2FuJ3QgYWxsb2NhdGUgc3RkaW8gYnVmZmVyIGZvciB0ZW1wIik7CisJCX0KKwl9CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCBzZWxlY3RlZCBoaXN0b3J5IGV2ZW50cy4gIElmIGxpc3Rpbmcgb3IgZXhlY3V0aW5nLAorCSAqIGRvIGl0IG5vdy4gIE90aGVyd2lzZSwgcHV0IGludG8gdGVtcCBmaWxlIGFuZCBjYWxsIHRoZSBlZGl0b3IKKwkgKiBhZnRlci4KKwkgKgorCSAqIFRoZSBoaXN0b3J5IGludGVyZmFjZSBuZWVkcyByZXRoaW5raW5nLCBhcyB0aGUgZm9sbG93aW5nCisJICogY29udm9sdXRpb25zIHdpbGwgZGVtb25zdHJhdGUuCisJICovCisJaGlzdG9yeShoaXN0LCAmaGUsIEhfRklSU1QpOworCXJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLCBIX05FWFRfRVZFTlQsIGZpcnN0KTsKKwlmb3IgKDtyZXR2YWwgIT0gLTE7IHJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLCBkaXJlY3Rpb24pKSB7CisJCWlmIChsZmxnKSB7CisJCQlpZiAoIW5mbGcpCisJCQkJb3V0MWZtdCgiJTVkICIsIGhlLm51bSk7CisJCQlvdXQxc3RyKGhlLnN0cik7CisJCX0gZWxzZSB7CisJCQljb25zdCBjaGFyICpzID0gcGF0ID8KKwkJCSAgIGZjX3JlcGxhY2UoaGUuc3RyLCBwYXQsIHJlcGwpIDogaGUuc3RyOworCisJCQlpZiAoc2ZsZykgeworCQkJCWlmIChkaXNwbGF5aGlzdCkgeworCQkJCQlvdXQyc3RyKHMpOworCQkJCX0KKworCQkJCWV2YWxzdHJpbmcoc3RyY3B5KHN0YWxsb2Moc3RybGVuKHMpICsgMSksIHMpLAorCQkJCQkgICB+MCk7CisJCQkJaWYgKGRpc3BsYXloaXN0ICYmIGhpc3QpIHsKKwkJCQkJLyoKKwkJCQkJICogIFhYWCB3aGF0IGFib3V0IHJlY3Vyc2l2ZSBhbmQKKwkJCQkJICogIHJlbGF0aXZlIGhpc3RudW1zLgorCQkJCQkgKi8KKwkJCQkJaGlzdG9yeShoaXN0LCAmaGUsIEhfRU5URVIsIHMpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWZwdXRzKHMsIGVmcCk7CisJCX0KKwkJLyoKKwkJICogQXQgZW5kPyAgKGlmIHdlIHdlcmUgdG8gbG9zZSBsYXN0LCB3ZSdkIHN1cmUgYmUKKwkJICogbWVzc2VkIHVwKS4KKwkJICovCisJCWlmIChoZS5udW0gPT0gbGFzdCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZWRpdG9yKSB7CisJCWNoYXIgKmVkaXRjbWQ7CisKKwkJZmNsb3NlKGVmcCk7CisJCWVkaXRjbWQgPSBzdGFsbG9jKHN0cmxlbihlZGl0b3IpICsgc3RybGVuKGVkaXRmaWxlKSArIDIpOworCQlzcHJpbnRmKGVkaXRjbWQsICIlcyAlcyIsIGVkaXRvciwgZWRpdGZpbGUpOworCQkvKiBYWFggLSBzaG91bGQgdXNlIG5vIEpDIGNvbW1hbmQgKi8KKwkJZXZhbHN0cmluZyhlZGl0Y21kLCB+MCk7CisJCUlOVE9OOworCQlyZWFkY21kZmlsZShlZGl0ZmlsZSk7CS8qIFhYWCAtIHNob3VsZCByZWFkIGJhY2sgLSBxdWljayB0c3QgKi8KKwkJdW5saW5rKGVkaXRmaWxlKTsKKwl9CisKKwlpZiAobGZsZyA9PSAwICYmIGFjdGl2ZSA+IDApCisJCS0tYWN0aXZlOworCWlmIChkaXNwbGF5aGlzdCkKKwkJZGlzcGxheWhpc3QgPSAwOworCXJldHVybiAwOworfQorCitTVEFUSUMgY29uc3QgY2hhciAqCitmY19yZXBsYWNlKGNvbnN0IGNoYXIgKnMsIGNoYXIgKnAsIGNoYXIgKnIpCit7CisJY2hhciAqZGVzdDsKKwlpbnQgcGxlbiA9IHN0cmxlbihwKTsKKworCVNUQVJUU1RBQ0tTVFIoZGVzdCk7CisJd2hpbGUgKCpzKSB7CisJCWlmICgqcyA9PSAqcCAmJiBzdHJuY21wKHMsIHAsIHBsZW4pID09IDApIHsKKwkJCXdoaWxlICgqcikKKwkJCQlTVFBVVEMoKnIrKywgZGVzdCk7CisJCQlzICs9IHBsZW47CisJCQkqcCA9ICdcMCc7CS8qIHNvIG5vIG1vcmUgbWF0Y2hlcyAqLworCQl9IGVsc2UKKwkJCVNUUFVUQygqcysrLCBkZXN0KTsKKwl9CisJU1RBQ0tTVFJOVUwoZGVzdCk7CisJZGVzdCA9IGdyYWJzdGFja3N0cihkZXN0KTsKKworCXJldHVybiAoZGVzdCk7Cit9CisKK2ludAorbm90X2ZjbnVtYmVyKGNoYXIgKnMpCit7CisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisgICAgICAgIGlmICgqcyA9PSAnLScpCisgICAgICAgICAgICAgICAgcysrOworCXJldHVybiAoIWlzX251bWJlcihzKSk7Cit9CisKK2ludAorc3RyX3RvX2V2ZW50KGNvbnN0IGNoYXIgKnN0ciwgaW50IGxhc3QpCit7CisJSGlzdEV2ZW50IGhlOworCWNvbnN0IGNoYXIgKnMgPSBzdHI7CisJaW50IHJlbGF0aXZlID0gMDsKKwlpbnQgaSwgcmV0dmFsOworCisJcmV0dmFsID0gaGlzdG9yeShoaXN0LCAmaGUsIEhfRklSU1QpOworCXN3aXRjaCAoKnMpIHsKKwljYXNlICctJzoKKwkJcmVsYXRpdmUgPSAxOworCQkvKkZBTExUSFJPVUdIKi8KKwljYXNlICcrJzoKKwkJcysrOworCX0KKwlpZiAoaXNfbnVtYmVyKHMpKSB7CisJCWkgPSBhdG9pKHMpOworCQlpZiAocmVsYXRpdmUpIHsKKwkJCXdoaWxlIChyZXR2YWwgIT0gLTEgJiYgaS0tKSB7CisJCQkJcmV0dmFsID0gaGlzdG9yeShoaXN0LCAmaGUsIEhfTkVYVCk7CisJCQl9CisJCQlpZiAocmV0dmFsID09IC0xKQorCQkJCXJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLCBIX0xBU1QpOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gaGlzdG9yeShoaXN0LCAmaGUsIEhfTkVYVF9FVkVOVCwgaSk7CisJCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQkJLyoKKwkJCQkgKiB0aGUgbm90aW9uIG9mIGZpcnN0IGFuZCBsYXN0IGlzCisJCQkJICogYmFja3dhcmRzIHRvIHRoYXQgb2YgdGhlIGhpc3RvcnkgcGFja2FnZQorCQkJCSAqLworCQkJCXJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLAorCQkJCQkJbGFzdCA/IEhfRklSU1QgOiBIX0xBU1QpOworCQkJfQorCQl9CisJCWlmIChyZXR2YWwgPT0gLTEpCisJCQlzaF9lcnJvcigiaGlzdG9yeSBudW1iZXIgJXMgbm90IGZvdW5kIChpbnRlcm5hbCBlcnJvcikiLAorCQkJCSBzdHIpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHBhdHRlcm4KKwkJICovCisJCXJldHZhbCA9IGhpc3RvcnkoaGlzdCwgJmhlLCBIX1BSRVZfU1RSLCBzdHIpOworCQlpZiAocmV0dmFsID09IC0xKQorCQkJc2hfZXJyb3IoImhpc3RvcnkgcGF0dGVybiBub3QgZm91bmQ6ICVzIiwgc3RyKTsKKwl9CisJcmV0dXJuIChoZS5udW0pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvZGFzaC9pbml0LmggYi91c3IvZGFzaC9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNmU4NgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2luaXQuaApAQCAtMCwwICsxLDM5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWluaXQuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCit2b2lkIGluaXQodm9pZCk7Cit2b2lkIHJlc2V0KHZvaWQpOwordm9pZCBpbml0c2hlbGxwcm9jKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvaW5wdXQuYyBiL3Vzci9kYXNoL2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3ZGE3MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2lucHV0LmMKQEAgLTAsMCArMSw1NjMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4JLyogZGVmaW5lcyBCVUZTSVogKi8KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGlucHV0IHJvdXRpbmVzIHVzZWQgYnkgdGhlIHBhcnNlci4KKyAqLworCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJyZWRpci5oIgorI2luY2x1ZGUgInN5bnRheC5oIgorI2luY2x1ZGUgImlucHV0LmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJhbGlhcy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpZm5kZWYgU01BTEwKKyNpbmNsdWRlICJteWhpc3RlZGl0LmgiCisjZW5kaWYKKworI2lmZGVmIEhFVElPCisjaW5jbHVkZSAiaGV0aW8uaCIKKyNlbmRpZgorCisjZGVmaW5lIEVPRl9OTEVGVCAtOTkJCS8qIHZhbHVlIG9mIHBhcnNlbmxlZnQgd2hlbiBFT0YgcHVzaGVkIGJhY2sgKi8KKyNkZWZpbmUgSUJVRlNJWiAoQlVGU0laICsgMSkKKworTUtJTklUCitzdHJ1Y3Qgc3RycHVzaCB7CisJc3RydWN0IHN0cnB1c2ggKnByZXY7CS8qIHByZWNlZGluZyBzdHJpbmcgb24gc3RhY2sgKi8KKwljaGFyICpwcmV2c3RyaW5nOworCWludCBwcmV2bmxlZnQ7CisJc3RydWN0IGFsaWFzICphcDsJLyogaWYgcHVzaCB3YXMgYXNzb2NpYXRlZCB3aXRoIGFuIGFsaWFzICovCisJY2hhciAqc3RyaW5nOwkJLyogcmVtZW1iZXIgdGhlIHN0cmluZyBzaW5jZSBpdCBtYXkgY2hhbmdlICovCit9OworCisvKgorICogVGhlIHBhcnNlZmlsZSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgZ2xvYmFsIHZhcmlhYmxlIHBhcnNlZmlsZQorICogY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZmlsZSBiZWluZyByZWFkLgorICovCisKK01LSU5JVAorc3RydWN0IHBhcnNlZmlsZSB7CisJc3RydWN0IHBhcnNlZmlsZSAqcHJldjsJLyogcHJlY2VkaW5nIGZpbGUgb24gc3RhY2sgKi8KKwlpbnQgbGlubm87CQkvKiBjdXJyZW50IGxpbmUgKi8KKwlpbnQgZmQ7CQkJLyogZmlsZSBkZXNjcmlwdG9yIChvciAtMSBpZiBzdHJpbmcpICovCisJaW50IG5sZWZ0OwkJLyogbnVtYmVyIG9mIGNoYXJzIGxlZnQgaW4gdGhpcyBsaW5lICovCisJaW50IGxsZWZ0OwkJLyogbnVtYmVyIG9mIGNoYXJzIGxlZnQgaW4gdGhpcyBidWZmZXIgKi8KKwljaGFyICpuZXh0YzsJCS8qIG5leHQgY2hhciBpbiBidWZmZXIgKi8KKwljaGFyICpidWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwlzdHJ1Y3Qgc3RycHVzaCAqc3RycHVzaDsgLyogZm9yIHB1c2hpbmcgc3RyaW5ncyBhdCB0aGlzIGxldmVsICovCisJc3RydWN0IHN0cnB1c2ggYmFzZXN0cnB1c2g7IC8qIHNvIHB1c2hpbmcgb25lIGlzIGZhc3QgKi8KK307CisKKworaW50IHBsaW5ubyA9IDE7CQkJLyogaW5wdXQgbGluZSBudW1iZXIgKi8KK2ludCBwYXJzZW5sZWZ0OwkJCS8qIGNvcHkgb2YgcGFyc2VmaWxlLT5ubGVmdCAqLworTUtJTklUIGludCBwYXJzZWxsZWZ0OwkJLyogY29weSBvZiBwYXJzZWZpbGUtPmxsZWZ0ICovCitjaGFyICpwYXJzZW5leHRjOwkJLyogY29weSBvZiBwYXJzZWZpbGUtPm5leHRjICovCitNS0lOSVQgc3RydWN0IHBhcnNlZmlsZSBiYXNlcGY7CS8qIHRvcCBsZXZlbCBpbnB1dCBmaWxlICovCitNS0lOSVQgY2hhciBiYXNlYnVmW0lCVUZTSVpdOwkvKiBidWZmZXIgZm9yIHRvcCBsZXZlbCBpbnB1dCBmaWxlICovCitzdHJ1Y3QgcGFyc2VmaWxlICpwYXJzZWZpbGUgPSAmYmFzZXBmOwkvKiBjdXJyZW50IGlucHV0IGZpbGUgKi8KK2ludCB3aGljaHByb21wdDsJCS8qIDEgPT0gUFMxLCAyID09IFBTMiAqLworCisjaWZuZGVmIFNNQUxMCitFZGl0TGluZSAqZWw7CQkJLyogY29va2llIGZvciBlZGl0bGluZSBwYWNrYWdlICovCisjZW5kaWYKKworU1RBVElDIHZvaWQgcHVzaGZpbGUodm9pZCk7CitzdGF0aWMgaW50IHByZWFkZmQodm9pZCk7CisKKyNpZmRlZiBta2luaXQKK0lOQ0xVREUgPHN0ZGlvLmg+CitJTkNMVURFICJpbnB1dC5oIgorSU5DTFVERSAiZXJyb3IuaCIKKworSU5JVCB7CisJYmFzZXBmLm5leHRjID0gYmFzZXBmLmJ1ZiA9IGJhc2VidWY7Cit9CisKK1JFU0VUIHsKKwlwYXJzZWxsZWZ0ID0gcGFyc2VubGVmdCA9IDA7CS8qIGNsZWFyIGlucHV0IGJ1ZmZlciAqLworCXBvcGFsbGZpbGVzKCk7Cit9CisjZW5kaWYKKworCisvKgorICogUmVhZCBhIGxpbmUgZnJvbSB0aGUgc2NyaXB0LgorICovCisKK2NoYXIgKgorcGZnZXRzKGNoYXIgKmxpbmUsIGludCBsZW4pCit7CisJY2hhciAqcCA9IGxpbmU7CisJaW50IG5sZWZ0ID0gbGVuOworCWludCBjOworCisJd2hpbGUgKC0tbmxlZnQgPiAwKSB7CisJCWMgPSBwZ2V0YzIoKTsKKwkJaWYgKGMgPT0gUEVPRikgeworCQkJaWYgKHAgPT0gbGluZSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCSpwKysgPSBjOworCQlpZiAoYyA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gbGluZTsKK30KKworCisvKgorICogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHRoZSBzY3JpcHQsIHJldHVybmluZyBQRU9GIG9uIGVuZCBvZiBmaWxlLgorICogTnVsIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0IGFyZSBzaWxlbnRseSBkaXNjYXJkZWQuCisgKi8KKworaW50CitwZ2V0Yyh2b2lkKQoreworCXJldHVybiBwZ2V0Y19tYWNybygpOworfQorCisKKy8qCisgKiBTYW1lIGFzIHBnZXRjKCksIGJ1dCBpZ25vcmVzIFBFT0EuCisgKi8KKworaW50CitwZ2V0YzIoKQoreworCWludCBjOworCWRvIHsKKwkJYyA9IHBnZXRjX21hY3JvKCk7CisJfSB3aGlsZSAoYyA9PSBQRU9BKTsKKwlyZXR1cm4gYzsKK30KKworCitzdGF0aWMgaW50CitwcmVhZGZkKHZvaWQpCit7CisJaW50IG5yOworCWNoYXIgKmJ1ZiA9ICBwYXJzZWZpbGUtPmJ1ZjsKKwlwYXJzZW5leHRjID0gYnVmOworCityZXRyeToKKyNpZm5kZWYgU01BTEwKKwlpZiAocGFyc2VmaWxlLT5mZCA9PSAwICYmIGVsKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICpybF9jcDsKKwkJc3RhdGljIGludCBlbF9sZW47CisKKwkJaWYgKHJsX2NwID09IE5VTEwpCisJCQlybF9jcCA9IGVsX2dldHMoZWwsICZlbF9sZW4pOworCQlpZiAocmxfY3AgPT0gTlVMTCkKKwkJCW5yID0gMDsKKwkJZWxzZSB7CisJCQluciA9IGVsX2xlbjsKKwkJCWlmIChuciA+IElCVUZTSVogLSAxKQorCQkJCW5yID0gSUJVRlNJWiAtIDE7CisJCQltZW1jcHkoYnVmLCBybF9jcCwgbnIpOworCQkJaWYgKG5yICE9IGVsX2xlbikgeworCQkJCWVsX2xlbiAtPSBucjsKKwkJCQlybF9jcCArPSBucjsKKwkJCX0gZWxzZQorCQkJCXJsX2NwID0gMDsKKwkJfQorCisJfSBlbHNlCisjZW5kaWYKKworI2lmZGVmIEhFVElPCisJCW5yID0gaGV0aW9fcmVhZF9pbnB1dChwYXJzZWZpbGUtPmZkKTsKKwkJaWYgKG5yID09IC0yNTUpCisjZW5kaWYKKwkJbnIgPSByZWFkKHBhcnNlZmlsZS0+ZmQsIGJ1ZiwgSUJVRlNJWiAtIDEpOworCisKKwlpZiAobnIgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWdvdG8gcmV0cnk7CisJCWlmIChwYXJzZWZpbGUtPmZkID09IDAgJiYgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKKwkJCWludCBmbGFncyA9IGZjbnRsKDAsIEZfR0VURkwsIDApOworCQkJaWYgKGZsYWdzID49IDAgJiYgZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJZmxhZ3MgJj1+IE9fTk9OQkxPQ0s7CisJCQkJaWYgKGZjbnRsKDAsIEZfU0VURkwsIGZsYWdzKSA+PSAwKSB7CisJCQkJCW91dDJzdHIoInNoOiB0dXJuaW5nIG9mZiBOREVMQVkgbW9kZVxuIik7CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBucjsKK30KKworLyoKKyAqIFJlZmlsbCB0aGUgaW5wdXQgYnVmZmVyIGFuZCByZXR1cm4gdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyOgorICoKKyAqIDEpIElmIGEgc3RyaW5nIHdhcyBwdXNoZWQgYmFjayBvbiB0aGUgaW5wdXQsIHBvcCBpdDsKKyAqIDIpIElmIGFuIEVPRiB3YXMgcHVzaGVkIGJhY2sgKHBhcnNlbmxlZnQgPT0gRU9GX05MRUZUKSBvciB3ZSBhcmUgcmVhZGluZworICogICAgZnJvbSBhIHN0cmluZyBzbyB3ZSBjYW4ndCByZWZpbGwgdGhlIGJ1ZmZlciwgcmV0dXJuIEVPRi4KKyAqIDMpIElmIHRoZSBpcyBtb3JlIHN0dWZmIGluIHRoaXMgYnVmZmVyLCB1c2UgaXQgZWxzZSBjYWxsIHJlYWQgdG8gZmlsbCBpdC4KKyAqIDQpIFByb2Nlc3MgaW5wdXQgdXAgdG8gdGhlIG5leHQgbmV3bGluZSwgZGVsZXRpbmcgbnVsIGNoYXJhY3RlcnMuCisgKi8KKworaW50CitwcmVhZGJ1ZmZlcih2b2lkKQoreworCWNoYXIgKnE7CisJaW50IG1vcmU7CisjaWZuZGVmIFNNQUxMCisJaW50IHNvbWV0aGluZzsKKyNlbmRpZgorCWNoYXIgc2F2ZWM7CisKKwl3aGlsZSAodW5saWtlbHkocGFyc2VmaWxlLT5zdHJwdXNoKSkgeworCQlpZiAoCisJCQlwYXJzZW5sZWZ0ID09IC0xICYmIHBhcnNlZmlsZS0+c3RycHVzaC0+YXAgJiYKKwkJCXBhcnNlbmV4dGNbLTFdICE9ICcgJyAmJiBwYXJzZW5leHRjWy0xXSAhPSAnXHQnCisJCSkgeworCQkJcmV0dXJuIFBFT0E7CisJCX0KKwkJcG9wc3RyaW5nKCk7CisJCWlmICgtLXBhcnNlbmxlZnQgPj0gMCkKKwkJCXJldHVybiAoc2lnbmVkIGNoYXIpKnBhcnNlbmV4dGMrKzsKKwl9CisJaWYgKHVubGlrZWx5KHBhcnNlbmxlZnQgPT0gRU9GX05MRUZUIHx8IHBhcnNlZmlsZS0+YnVmID09IE5VTEwpKQorCQlyZXR1cm4gUEVPRjsKKwlmbHVzaG91dCgmb3V0cHV0KTsKKyNpZmRlZiBGTFVTSEVSUgorCWZsdXNob3V0KCZlcnJvdXQpOworI2VuZGlmCisKKwltb3JlID0gcGFyc2VsbGVmdDsKKwlpZiAobW9yZSA8PSAwKSB7CithZ2FpbjoKKwkJaWYgKChtb3JlID0gcHJlYWRmZCgpKSA8PSAwKSB7CisJCQlwYXJzZWxsZWZ0ID0gcGFyc2VubGVmdCA9IEVPRl9OTEVGVDsKKwkJCXJldHVybiBQRU9GOworCQl9CisJfQorCisJcSA9IHBhcnNlbmV4dGM7CisKKwkvKiBkZWxldGUgbnVsIGNoYXJhY3RlcnMgKi8KKyNpZm5kZWYgU01BTEwKKwlzb21ldGhpbmcgPSAwOworI2VuZGlmCisJZm9yICg7OykgeworCQlpbnQgYzsKKworCQltb3JlLS07CisJCWMgPSAqcTsKKworCQlpZiAoIWMpCisJCQltZW1tb3ZlKHEsIHEgKyAxLCBtb3JlKTsKKwkJZWxzZSB7CisJCQlxKys7CisKKwkJCWlmIChjID09ICdcbicpIHsKKwkJCQlwYXJzZW5sZWZ0ID0gcSAtIHBhcnNlbmV4dGMgLSAxOworCQkJCWJyZWFrOworCQkJfQorCisjaWZuZGVmIFNNQUxMCisJCQlzd2l0Y2ggKGMpIHsKKwkJCWRlZmF1bHQ6CisJCQkJc29tZXRoaW5nID0gMTsKKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgJ1x0JzoKKwkJCWNhc2UgJyAnOgorCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCX0KKworCQlpZiAobW9yZSA8PSAwKSB7CisJCQlwYXJzZW5sZWZ0ID0gcSAtIHBhcnNlbmV4dGMgLSAxOworCQkJaWYgKHBhcnNlbmxlZnQgPCAwKQorCQkJCWdvdG8gYWdhaW47CisJCQlicmVhazsKKwkJfQorCX0KKwlwYXJzZWxsZWZ0ID0gbW9yZTsKKworCXNhdmVjID0gKnE7CisJKnEgPSAnXDAnOworCisjaWZuZGVmIFNNQUxMCisJaWYgKHBhcnNlZmlsZS0+ZmQgPT0gMCAmJiBoaXN0ICYmIHNvbWV0aGluZykgeworCQlIaXN0RXZlbnQgaGU7CisJCUlOVE9GRjsKKwkJaGlzdG9yeShoaXN0LCAmaGUsIHdoaWNocHJvbXB0ID09IDE/IEhfRU5URVIgOiBIX0FQUEVORCwKKwkJICAgIHBhcnNlbmV4dGMpOworCQlJTlRPTjsKKwl9CisjZW5kaWYKKworCWlmICh2ZmxhZykgeworCQlvdXQyc3RyKHBhcnNlbmV4dGMpOworI2lmZGVmIEZMVVNIRVJSCisJCWZsdXNob3V0KG91dDIpOworI2VuZGlmCisJfQorCisJKnEgPSBzYXZlYzsKKworCXJldHVybiAoc2lnbmVkIGNoYXIpKnBhcnNlbmV4dGMrKzsKK30KKworLyoKKyAqIFVuZG8gdGhlIGxhc3QgY2FsbCB0byBwZ2V0Yy4gIE9ubHkgb25lIGNoYXJhY3RlciBtYXkgYmUgcHVzaGVkIGJhY2suCisgKiBQRU9GIG1heSBiZSBwdXNoZWQgYmFjay4KKyAqLworCit2b2lkCitwdW5nZXRjKHZvaWQpCit7CisJcGFyc2VubGVmdCsrOworCXBhcnNlbmV4dGMtLTsKK30KKworLyoKKyAqIFB1c2ggYSBzdHJpbmcgYmFjayBvbnRvIHRoZSBpbnB1dCBhdCB0aGlzIGN1cnJlbnQgcGFyc2VmaWxlIGxldmVsLgorICogV2UgaGFuZGxlIGFsaWFzZXMgdGhpcyB3YXkuCisgKi8KK3ZvaWQKK3B1c2hzdHJpbmcoY2hhciAqcywgdm9pZCAqYXApCit7CisJc3RydWN0IHN0cnB1c2ggKnNwOworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocyk7CisJSU5UT0ZGOworLypkcHJpbnRmKCIqKiogY2FsbGluZyBwdXNoc3RyaW5nOiAlcywgJWRcbiIsIHMsIGxlbik7Ki8KKwlpZiAocGFyc2VmaWxlLT5zdHJwdXNoKSB7CisJCXNwID0gY2ttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgc3RycHVzaCkpOworCQlzcC0+cHJldiA9IHBhcnNlZmlsZS0+c3RycHVzaDsKKwkJcGFyc2VmaWxlLT5zdHJwdXNoID0gc3A7CisJfSBlbHNlCisJCXNwID0gcGFyc2VmaWxlLT5zdHJwdXNoID0gJihwYXJzZWZpbGUtPmJhc2VzdHJwdXNoKTsKKwlzcC0+cHJldnN0cmluZyA9IHBhcnNlbmV4dGM7CisJc3AtPnByZXZubGVmdCA9IHBhcnNlbmxlZnQ7CisJc3AtPmFwID0gKHN0cnVjdCBhbGlhcyAqKWFwOworCWlmIChhcCkgeworCQkoKHN0cnVjdCBhbGlhcyAqKWFwKS0+ZmxhZyB8PSBBTElBU0lOVVNFOworCQlzcC0+c3RyaW5nID0gczsKKwl9CisJcGFyc2VuZXh0YyA9IHM7CisJcGFyc2VubGVmdCA9IGxlbjsKKwlJTlRPTjsKK30KKwordm9pZAorcG9wc3RyaW5nKHZvaWQpCit7CisJc3RydWN0IHN0cnB1c2ggKnNwID0gcGFyc2VmaWxlLT5zdHJwdXNoOworCisJSU5UT0ZGOworCWlmIChzcC0+YXApIHsKKwkJaWYgKHBhcnNlbmV4dGNbLTFdID09ICcgJyB8fCBwYXJzZW5leHRjWy0xXSA9PSAnXHQnKSB7CisJCQljaGVja2t3ZCB8PSBDSEtBTElBUzsKKwkJfQorCQlpZiAoc3AtPnN0cmluZyAhPSBzcC0+YXAtPnZhbCkgeworCQkJY2tmcmVlKHNwLT5zdHJpbmcpOworCQl9CisJCXNwLT5hcC0+ZmxhZyAmPSB+QUxJQVNJTlVTRTsKKwkJaWYgKHNwLT5hcC0+ZmxhZyAmIEFMSUFTREVBRCkgeworCQkJdW5hbGlhcyhzcC0+YXAtPm5hbWUpOworCQl9CisJfQorCXBhcnNlbmV4dGMgPSBzcC0+cHJldnN0cmluZzsKKwlwYXJzZW5sZWZ0ID0gc3AtPnByZXZubGVmdDsKKy8qZHByaW50ZigiKioqIGNhbGxpbmcgcG9wc3RyaW5nOiByZXN0b3JpbmcgdG8gJyVzJ1xuIiwgcGFyc2VuZXh0Yyk7Ki8KKwlwYXJzZWZpbGUtPnN0cnB1c2ggPSBzcC0+cHJldjsKKwlpZiAoc3AgIT0gJihwYXJzZWZpbGUtPmJhc2VzdHJwdXNoKSkKKwkJY2tmcmVlKHNwKTsKKwlJTlRPTjsKK30KKworLyoKKyAqIFNldCB0aGUgaW5wdXQgdG8gdGFrZSBpbnB1dCBmcm9tIGEgZmlsZS4gIElmIHB1c2ggaXMgc2V0LCBwdXNoIHRoZQorICogb2xkIGlucHV0IG9udG8gdGhlIHN0YWNrIGZpcnN0LgorICovCisKK2ludAorc2V0aW5wdXRmaWxlKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZmxhZ3MpCit7CisJaW50IGZkOworCWludCBmZDI7CisKKwlJTlRPRkY7CisJaWYgKChmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKSkgPCAwKSB7CisJCWlmIChmbGFncyAmIElOUFVUX05PRklMRV9PSykKKwkJCWdvdG8gb3V0OworCQlzaF9lcnJvcigiQ2FuJ3Qgb3BlbiAlcyIsIGZuYW1lKTsKKwl9CisJaWYgKGZkIDwgMTApIHsKKwkJZmQyID0gY29weWZkKGZkLCAxMCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKGZkMiA8IDApCisJCQlzaF9lcnJvcigiT3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMiKTsKKwkJZmQgPSBmZDI7CisJfQorCXNldGlucHV0ZmQoZmQsIGZsYWdzICYgSU5QVVRfUFVTSF9GSUxFKTsKK291dDoKKwlJTlRPTjsKKwlyZXR1cm4gZmQ7Cit9CisKKworLyoKKyAqIExpa2Ugc2V0aW5wdXRmaWxlLCBidXQgdGFrZXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IuICBDYWxsIHRoaXMgd2l0aAorICogaW50ZXJydXB0cyBvZmYuCisgKi8KKwordm9pZAorc2V0aW5wdXRmZChpbnQgZmQsIGludCBwdXNoKQoreworCSh2b2lkKSBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisJaWYgKHB1c2gpIHsKKwkJcHVzaGZpbGUoKTsKKwkJcGFyc2VmaWxlLT5idWYgPSAwOworCX0KKwlwYXJzZWZpbGUtPmZkID0gZmQ7CisJaWYgKHBhcnNlZmlsZS0+YnVmID09IE5VTEwpCisJCXBhcnNlZmlsZS0+YnVmID0gY2ttYWxsb2MoSUJVRlNJWik7CisJcGFyc2VsbGVmdCA9IHBhcnNlbmxlZnQgPSAwOworCXBsaW5ubyA9IDE7Cit9CisKKworLyoKKyAqIExpa2Ugc2V0aW5wdXRmaWxlLCBidXQgdGFrZXMgaW5wdXQgZnJvbSBhIHN0cmluZy4KKyAqLworCit2b2lkCitzZXRpbnB1dHN0cmluZyhjaGFyICpzdHJpbmcpCit7CisJSU5UT0ZGOworCXB1c2hmaWxlKCk7CisJcGFyc2VuZXh0YyA9IHN0cmluZzsKKwlwYXJzZW5sZWZ0ID0gc3RybGVuKHN0cmluZyk7CisJcGFyc2VmaWxlLT5idWYgPSBOVUxMOworCXBsaW5ubyA9IDE7CisJSU5UT047Cit9CisKKworCisvKgorICogVG8gaGFuZGxlIHRoZSAiLiIgY29tbWFuZCwgYSBzdGFjayBvZiBpbnB1dCBmaWxlcyBpcyB1c2VkLiAgUHVzaGZpbGUKKyAqIGFkZHMgYSBuZXcgZW50cnkgdG8gdGhlIHN0YWNrIGFuZCBwb3BmaWxlIHJlc3RvcmVzIHRoZSBwcmV2aW91cyBsZXZlbC4KKyAqLworCitTVEFUSUMgdm9pZAorcHVzaGZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGFyc2VmaWxlICpwZjsKKworCXBhcnNlZmlsZS0+bmxlZnQgPSBwYXJzZW5sZWZ0OworCXBhcnNlZmlsZS0+bGxlZnQgPSBwYXJzZWxsZWZ0OworCXBhcnNlZmlsZS0+bmV4dGMgPSBwYXJzZW5leHRjOworCXBhcnNlZmlsZS0+bGlubm8gPSBwbGlubm87CisJcGYgPSAoc3RydWN0IHBhcnNlZmlsZSAqKWNrbWFsbG9jKHNpemVvZiAoc3RydWN0IHBhcnNlZmlsZSkpOworCXBmLT5wcmV2ID0gcGFyc2VmaWxlOworCXBmLT5mZCA9IC0xOworCXBmLT5zdHJwdXNoID0gTlVMTDsKKwlwZi0+YmFzZXN0cnB1c2gucHJldiA9IE5VTEw7CisJcGFyc2VmaWxlID0gcGY7Cit9CisKKwordm9pZAorcG9wZmlsZSh2b2lkKQoreworCXN0cnVjdCBwYXJzZWZpbGUgKnBmID0gcGFyc2VmaWxlOworCisJSU5UT0ZGOworCWlmIChwZi0+ZmQgPj0gMCkKKwkJY2xvc2UocGYtPmZkKTsKKwlpZiAocGYtPmJ1ZikKKwkJY2tmcmVlKHBmLT5idWYpOworCXdoaWxlIChwZi0+c3RycHVzaCkKKwkJcG9wc3RyaW5nKCk7CisJcGFyc2VmaWxlID0gcGYtPnByZXY7CisJY2tmcmVlKHBmKTsKKwlwYXJzZW5sZWZ0ID0gcGFyc2VmaWxlLT5ubGVmdDsKKwlwYXJzZWxsZWZ0ID0gcGFyc2VmaWxlLT5sbGVmdDsKKwlwYXJzZW5leHRjID0gcGFyc2VmaWxlLT5uZXh0YzsKKwlwbGlubm8gPSBwYXJzZWZpbGUtPmxpbm5vOworCUlOVE9OOworfQorCisKKy8qCisgKiBSZXR1cm4gdG8gdG9wIGxldmVsLgorICovCisKK3ZvaWQKK3BvcGFsbGZpbGVzKHZvaWQpCit7CisJd2hpbGUgKHBhcnNlZmlsZSAhPSAmYmFzZXBmKQorCQlwb3BmaWxlKCk7Cit9CisKKworCisvKgorICogQ2xvc2UgdGhlIGZpbGUocykgdGhhdCB0aGUgc2hlbGwgaXMgcmVhZGluZyBjb21tYW5kcyBmcm9tLiAgQ2FsbGVkCisgKiBhZnRlciBhIGZvcmsgaXMgZG9uZS4KKyAqLworCit2b2lkCitjbG9zZXNjcmlwdCh2b2lkKQoreworCXBvcGFsbGZpbGVzKCk7CisJaWYgKHBhcnNlZmlsZS0+ZmQgPiAwKSB7CisJCWNsb3NlKHBhcnNlZmlsZS0+ZmQpOworCQlwYXJzZWZpbGUtPmZkID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9pbnB1dC5oIGIvdXNyL2Rhc2gvaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQ5ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvaW5wdXQuaApAQCAtMCwwICsxLDY4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlucHV0LmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworLyogUEVPRiAodGhlIGVuZCBvZiBmaWxlIG1hcmtlcikgaXMgZGVmaW5lZCBpbiBzeW50YXguaCAqLworCitlbnVtIHsKKwlJTlBVVF9QVVNIX0ZJTEUgPSAxLAorCUlOUFVUX05PRklMRV9PSyA9IDIsCit9OworCisvKgorICogVGhlIGlucHV0IGxpbmUgbnVtYmVyLiAgSW5wdXQuYyBqdXN0IGRlZmluZXMgdGhpcyB2YXJpYWJsZSwgYW5kIHNhdmVzCisgKiBhbmQgcmVzdG9yZXMgaXQgd2hlbiBmaWxlcyBhcmUgcHVzaGVkIGFuZCBwb3BwZWQuICBUaGUgdXNlciBvZiB0aGlzCisgKiBwYWNrYWdlIG11c3Qgc2V0IGl0cyB2YWx1ZS4KKyAqLworZXh0ZXJuIGludCBwbGlubm87CitleHRlcm4gaW50IHBhcnNlbmxlZnQ7CQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyBsZWZ0IGluIGlucHV0IGJ1ZmZlciAqLworZXh0ZXJuIGNoYXIgKnBhcnNlbmV4dGM7CS8qIG5leHQgY2hhcmFjdGVyIGluIGlucHV0IGJ1ZmZlciAqLworCitjaGFyICpwZmdldHMoY2hhciAqLCBpbnQpOworaW50IHBnZXRjKHZvaWQpOworaW50IHBnZXRjMih2b2lkKTsKK2ludCBwcmVhZGJ1ZmZlcih2b2lkKTsKK3ZvaWQgcHVuZ2V0Yyh2b2lkKTsKK3ZvaWQgcHVzaHN0cmluZyhjaGFyICosIHZvaWQgKik7Cit2b2lkIHBvcHN0cmluZyh2b2lkKTsKK2ludCBzZXRpbnB1dGZpbGUoY29uc3QgY2hhciAqLCBpbnQpOwordm9pZCBzZXRpbnB1dGZkKGludCwgaW50KTsKK3ZvaWQgc2V0aW5wdXRzdHJpbmcoY2hhciAqKTsKK3ZvaWQgcG9wZmlsZSh2b2lkKTsKK3ZvaWQgcG9wYWxsZmlsZXModm9pZCk7Cit2b2lkIGNsb3Nlc2NyaXB0KHZvaWQpOworCisjZGVmaW5lIHBnZXRjX21hY3JvKCkgXAorCSgtLXBhcnNlbmxlZnQgPj0gMCA/IChzaWduZWQgY2hhcikqcGFyc2VuZXh0YysrIDogcHJlYWRidWZmZXIoKSkKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL2pvYnMuYyBiL3Vzci9kYXNoL2pvYnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VkNzc5MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2pvYnMuYwpAQCAtMCwwICsxLDE0OTkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIEJTRAorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpZiBKT0JTCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI3VuZGVmIENFT0YJCQkvKiBzeW50YXguaCByZWRlZmluZXMgdGhpcyAqLworI2VuZGlmCisjaW5jbHVkZSAicmVkaXIuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAiam9icy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJ0cmFwLmgiCisjaW5jbHVkZSAic3ludGF4LmgiCisjaW5jbHVkZSAiaW5wdXQuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworLyogbW9kZSBmbGFncyBmb3Igc2V0X2N1cmpvYiAqLworI2RlZmluZSBDVVJfREVMRVRFIDIKKyNkZWZpbmUgQ1VSX1JVTk5JTkcgMQorI2RlZmluZSBDVVJfU1RPUFBFRCAwCisKKy8qIG1vZGUgZmxhZ3MgZm9yIGRvd2FpdCAqLworI2RlZmluZSBET1dBSVRfTk9STUFMIDAKKyNkZWZpbmUgRE9XQUlUX0JMT0NLIDEKKworLyogYXJyYXkgb2Ygam9icyAqLworc3RhdGljIHN0cnVjdCBqb2IgKmpvYnRhYjsKKy8qIHNpemUgb2YgYXJyYXkgKi8KK3N0YXRpYyB1bnNpZ25lZCBuam9iczsKKy8qIHBpZCBvZiBsYXN0IGJhY2tncm91bmQgcHJvY2VzcyAqLworcGlkX3QgYmFja2duZHBpZDsKKworI2lmIEpPQlMKKy8qIHBncnAgb2Ygc2hlbGwgb24gaW52b2NhdGlvbiAqLworc3RhdGljIGludCBpbml0aWFscGdycDsKKy8qIGNvbnRyb2wgdGVybWluYWwgKi8KK3N0YXRpYyBpbnQgdHR5ZmQgPSAtMTsKKyNlbmRpZgorCisvKiBjdXJyZW50IGpvYiAqLworc3RhdGljIHN0cnVjdCBqb2IgKmN1cmpvYjsKKy8qIG51bWJlciBvZiBwcmVzdW1lZCBsaXZpbmcgdW50cmFja2VkIGpvYnMgKi8KK3N0YXRpYyBpbnQgam9ibGVzczsKKworU1RBVElDIHZvaWQgc2V0X2N1cmpvYihzdHJ1Y3Qgam9iICosIHVuc2lnbmVkKTsKK1NUQVRJQyBpbnQgam9ibm8oY29uc3Qgc3RydWN0IGpvYiAqKTsKK1NUQVRJQyBpbnQgc3ByaW50X3N0YXR1cyhjaGFyICosIGludCwgaW50KTsKK1NUQVRJQyB2b2lkIGZyZWVqb2Ioc3RydWN0IGpvYiAqKTsKK1NUQVRJQyBzdHJ1Y3Qgam9iICpnZXRqb2IoY29uc3QgY2hhciAqLCBpbnQpOworU1RBVElDIHN0cnVjdCBqb2IgKmdyb3dqb2J0YWIodm9pZCk7CitTVEFUSUMgdm9pZCBmb3JrY2hpbGQoc3RydWN0IGpvYiAqLCB1bmlvbiBub2RlICosIGludCk7CitTVEFUSUMgdm9pZCBmb3JrcGFyZW50KHN0cnVjdCBqb2IgKiwgdW5pb24gbm9kZSAqLCBpbnQsIHBpZF90KTsKK1NUQVRJQyBpbnQgZG93YWl0KGludCwgc3RydWN0IGpvYiAqKTsKKyNpZmRlZiBTWVNWCitTVEFUSUMgaW50IG9uc2lnY2hpbGQodm9pZCk7CisjZW5kaWYKK1NUQVRJQyBpbnQgd2FpdHByb2MoaW50LCBpbnQgKik7CitTVEFUSUMgY2hhciAqY29tbWFuZHRleHQodW5pb24gbm9kZSAqKTsKK1NUQVRJQyB2b2lkIGNtZHR4dCh1bmlvbiBub2RlICopOworU1RBVElDIHZvaWQgY21kbGlzdCh1bmlvbiBub2RlICosIGludCk7CitTVEFUSUMgdm9pZCBjbWRwdXRzKGNvbnN0IGNoYXIgKik7CitTVEFUSUMgdm9pZCBzaG93cGlwZShzdHJ1Y3Qgam9iICosIHN0cnVjdCBvdXRwdXQgKik7CitTVEFUSUMgaW50IGdldHN0YXR1cyhzdHJ1Y3Qgam9iICopOworCisjaWYgSk9CUworc3RhdGljIGludCByZXN0YXJ0am9iKHN0cnVjdCBqb2IgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHh0Y3NldHBncnAoaW50LCBwaWRfdCk7CisjZW5kaWYKKworU1RBVElDIHZvaWQKK3NldF9jdXJqb2Ioc3RydWN0IGpvYiAqanAsIHVuc2lnbmVkIG1vZGUpCit7CisJc3RydWN0IGpvYiAqanAxOworCXN0cnVjdCBqb2IgKipqcHAsICoqY3VycDsKKworCS8qIGZpcnN0IHJlbW92ZSBmcm9tIGxpc3QgKi8KKwlqcHAgPSBjdXJwID0gJmN1cmpvYjsKKwlkbyB7CisJCWpwMSA9ICpqcHA7CisJCWlmIChqcDEgPT0ganApCisJCQlicmVhazsKKwkJanBwID0gJmpwMS0+cHJldl9qb2I7CisJfSB3aGlsZSAoMSk7CisJKmpwcCA9IGpwMS0+cHJldl9qb2I7CisKKwkvKiBUaGVuIHJlLWluc2VydCBpbiBjb3JyZWN0IHBvc2l0aW9uICovCisJanBwID0gY3VycDsKKwlzd2l0Y2ggKG1vZGUpIHsKKwlkZWZhdWx0OgorI2lmZGVmIERFQlVHCisJCWFib3J0KCk7CisjZW5kaWYKKwljYXNlIENVUl9ERUxFVEU6CisJCS8qIGpvYiBiZWluZyBkZWxldGVkICovCisJCWJyZWFrOworCWNhc2UgQ1VSX1JVTk5JTkc6CisJCS8qIG5ld2x5IGNyZWF0ZWQgam9iIG9yIGJhY2tncm91bmRlZCBqb2IsCisJCSAgIHB1dCBhZnRlciBhbGwgc3RvcHBlZCBqb2JzLiAqLworCQlkbyB7CisJCQlqcDEgPSAqanBwOworCQkJaWYgKCFKT0JTIHx8ICFqcDEgfHwganAxLT5zdGF0ZSAhPSBKT0JTVE9QUEVEKQorCQkJCWJyZWFrOworCQkJanBwID0gJmpwMS0+cHJldl9qb2I7CisJCX0gd2hpbGUgKDEpOworCQkvKiBGQUxMVEhST1VHSCAqLworI2lmIEpPQlMKKwljYXNlIENVUl9TVE9QUEVEOgorI2VuZGlmCisJCS8qIG5ld2x5IHN0b3BwZWQgam9iIC0gYmVjb21lcyBjdXJqb2IgKi8KKwkJanAtPnByZXZfam9iID0gKmpwcDsKKwkJKmpwcCA9IGpwOworCQlicmVhazsKKwl9Cit9CisKKyNpZiBKT0JTCisvKgorICogVHVybiBqb2IgY29udHJvbCBvbiBhbmQgb2ZmLgorICoKKyAqIE5vdGU6ICBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSB0aGlyZCBhcmcgdG8gaW9jdGwgaXMgYSBjaGFyYWN0ZXIKKyAqIHBvaW50ZXIsIHdoaWNoIGlzIHRydWUgb24gQmVya2VsZXkgc3lzdGVtcyBidXQgbm90IFN5c3RlbSBWLiAgU2luY2UKKyAqIFN5c3RlbSBWIGRvZXNuJ3QgaGF2ZSBqb2IgY29udHJvbCB5ZXQsIHRoaXMgaXNuJ3QgYSBwcm9ibGVtIG5vdy4KKyAqCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworCitpbnQgam9iY3RsOworCit2b2lkCitzZXRqb2JjdGwoaW50IG9uKQoreworCWludCBmZDsKKwlpbnQgcGdycDsKKworCWlmIChvbiA9PSBqb2JjdGwgfHwgcm9vdHNoZWxsID09IDApCisJCXJldHVybjsKKwlpZiAob24pIHsKKwkJaW50IG9mZDsKKwkJb2ZkID0gZmQgPSBvcGVuKF9QQVRIX1RUWSwgT19SRFdSKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJZmQgKz0gMzsKKwkJCXdoaWxlICghaXNhdHR5KGZkKSAmJiAtLWZkID49IDApCisJCQkJOworCQl9CisJCWZkID0gZmNudGwoZmQsIEZfRFVQRkQsIDEwKTsKKwkJY2xvc2Uob2ZkKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWdvdG8gb3V0OworCQlmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisJCWRvIHsgLyogd2hpbGUgd2UgYXJlIGluIHRoZSBiYWNrZ3JvdW5kICovCisJCQlpZiAoKHBncnAgPSB0Y2dldHBncnAoZmQpKSA8IDApIHsKK291dDoKKwkJCQlzaF93YXJueCgiY2FuJ3QgYWNjZXNzIHR0eTsgam9iIGNvbnRyb2wgdHVybmVkIG9mZiIpOworCQkJCW1mbGFnID0gb24gPSAwOworCQkJCWdvdG8gY2xvc2U7CisJCQl9CisJCQlpZiAocGdycCA9PSBnZXRwZ3JwKCkpCisJCQkJYnJlYWs7CisJCQlraWxscGcoMCwgU0lHVFRJTik7CisJCX0gd2hpbGUgKDEpOworCQlpbml0aWFscGdycCA9IHBncnA7CisKKwkJc2V0c2lnbmFsKFNJR1RTVFApOworCQlzZXRzaWduYWwoU0lHVFRPVSk7CisJCXNldHNpZ25hbChTSUdUVElOKTsKKwkJcGdycCA9IHJvb3RwaWQ7CisJCXNldHBnaWQoMCwgcGdycCk7CisJCXh0Y3NldHBncnAoZmQsIHBncnApOworCX0gZWxzZSB7CisJCS8qIHR1cm5pbmcgam9iIGNvbnRyb2wgb2ZmICovCisJCWZkID0gdHR5ZmQ7CisJCXBncnAgPSBpbml0aWFscGdycDsKKwkJeHRjc2V0cGdycChmZCwgcGdycCk7CisJCXNldHBnaWQoMCwgcGdycCk7CisJCXNldHNpZ25hbChTSUdUU1RQKTsKKwkJc2V0c2lnbmFsKFNJR1RUT1UpOworCQlzZXRzaWduYWwoU0lHVFRJTik7CitjbG9zZToKKwkJY2xvc2UoZmQpOworCQlmZCA9IC0xOworCX0KKwl0dHlmZCA9IGZkOworCWpvYmN0bCA9IG9uOworfQorI2VuZGlmCisKKworaW50CitraWxsY21kKGFyZ2MsIGFyZ3YpCisJaW50IGFyZ2M7CisJY2hhciAqKmFyZ3Y7Cit7CisJaW50IHNpZ25vID0gLTE7CisJaW50IGxpc3QgPSAwOworCWludCBpOworCXBpZF90IHBpZDsKKwlzdHJ1Y3Qgam9iICpqcDsKKworCWlmIChhcmdjIDw9IDEpIHsKK3VzYWdlOgorCQlzaF9lcnJvcigKKyJVc2FnZToga2lsbCBbLXMgc2lnc3BlYyB8IC1zaWdudW0gfCAtc2lnc3BlY10gW3BpZCB8IGpvYl0uLi4gb3JcbiIKKyJraWxsIC1sIFtleGl0c3RhdHVzXSIKKwkJKTsKKwl9CisKKwlpZiAoKiorK2FyZ3YgPT0gJy0nKSB7CisJCXNpZ25vID0gZGVjb2RlX3NpZ25hbCgqYXJndiArIDEsIDEpOworCQlpZiAoc2lnbm8gPCAwKSB7CisJCQlpbnQgYzsKKworCQkJd2hpbGUgKChjID0gbmV4dG9wdCgibHM6IikpICE9ICdcMCcpCisJCQkJc3dpdGNoIChjKSB7CisJCQkJZGVmYXVsdDoKKyNpZmRlZiBERUJVRworCQkJCQlhYm9ydCgpOworI2VuZGlmCisJCQkJY2FzZSAnbCc6CisJCQkJCWxpc3QgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdzJzoKKwkJCQkJc2lnbm8gPSBkZWNvZGVfc2lnbmFsKG9wdGlvbmFyZywgMSk7CisJCQkJCWlmIChzaWdubyA8IDApIHsKKwkJCQkJCXNoX2Vycm9yKAorCQkJCQkJCSJpbnZhbGlkIHNpZ25hbCBudW1iZXIgb3IgbmFtZTogJXMiLAorCQkJCQkJCW9wdGlvbmFyZworCQkJCQkJKTsKKwkJCQkJfQorCQkgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQl9CisJCQlhcmd2ID0gYXJncHRyOworCQl9IGVsc2UKKwkJCWFyZ3YrKzsKKwl9CisKKwlpZiAoIWxpc3QgJiYgc2lnbm8gPCAwKQorCQlzaWdubyA9IFNJR1RFUk07CisKKwlpZiAoKHNpZ25vIDwgMCB8fCAhKmFyZ3YpIF4gbGlzdCkgeworCQlnb3RvIHVzYWdlOworCX0KKworCWlmIChsaXN0KSB7CisJCXN0cnVjdCBvdXRwdXQgKm91dDsKKworCQlvdXQgPSBvdXQxOworCQlpZiAoISphcmd2KSB7CisJCQlvdXRzdHIoIjBcbiIsIG91dCk7CisJCQlmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7CisJCQkJb3V0Zm10KG91dCwgc25sZm10LCBzaWduYWxfbmFtZShpKSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzaWdubyA9IG51bWJlcigqYXJndik7CisJCWlmIChzaWdubyA+IDEyOCkKKwkJCXNpZ25vIC09IDEyODsKKwkJaWYgKDAgPCBzaWdubyAmJiBzaWdubyA8IE5TSUcpCisJCQlvdXRmbXQob3V0LCBzbmxmbXQsIHNpZ25hbF9uYW1lKHNpZ25vKSk7CisJCWVsc2UKKwkJCXNoX2Vycm9yKCJpbnZhbGlkIHNpZ25hbCBudW1iZXIgb3IgZXhpdCBzdGF0dXM6ICVzIiwKKwkJCQkgKmFyZ3YpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpID0gMDsKKwlkbyB7CisJCWlmICgqKmFyZ3YgPT0gJyUnKSB7CisJCQlqcCA9IGdldGpvYigqYXJndiwgMCk7CisJCQlwaWQgPSAtanAtPnBzWzBdLnBpZDsKKwkJfSBlbHNlCisJCQlwaWQgPSAqKmFyZ3YgPT0gJy0nID8KKwkJCQktbnVtYmVyKCphcmd2ICsgMSkgOiBudW1iZXIoKmFyZ3YpOworCQlpZiAoa2lsbChwaWQsIHNpZ25vKSAhPSAwKSB7CisJCQlzaF93YXJueCgiJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlpID0gMTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIGk7Cit9CisKK1NUQVRJQyBpbnQKK2pvYm5vKGNvbnN0IHN0cnVjdCBqb2IgKmpwKQoreworCXJldHVybiBqcCAtIGpvYnRhYiArIDE7Cit9CisKKyNpZiBKT0JTCitpbnQKK2ZnY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlzdHJ1Y3Qgb3V0cHV0ICpvdXQ7CisJaW50IG1vZGU7CisJaW50IHJldHZhbDsKKworCW1vZGUgPSAoKiphcmd2ID09ICdmJykgPyBGT1JLX0ZHIDogRk9SS19CRzsKKwluZXh0b3B0KG51bGxzdHIpOworCWFyZ3YgPSBhcmdwdHI7CisJb3V0ID0gb3V0MTsKKwlkbyB7CisJCWpwID0gZ2V0am9iKCphcmd2LCAxKTsKKwkJaWYgKG1vZGUgPT0gRk9SS19CRykgeworCQkJc2V0X2N1cmpvYihqcCwgQ1VSX1JVTk5JTkcpOworCQkJb3V0Zm10KG91dCwgIlslZF0gIiwgam9ibm8oanApKTsKKwkJfQorCQlvdXRzdHIoanAtPnBzLT5jbWQsIG91dCk7CisJCXNob3dwaXBlKGpwLCBvdXQpOworCQlyZXR2YWwgPSByZXN0YXJ0am9iKGpwLCBtb2RlKTsKKwl9IHdoaWxlICgqYXJndiAmJiAqKythcmd2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgYmdjbWQoaW50LCBjaGFyICoqKSBfX2F0dHJpYnV0ZV9fKChfX2FsaWFzX18oImZnY21kIikpKTsKKworCitTVEFUSUMgaW50CityZXN0YXJ0am9iKHN0cnVjdCBqb2IgKmpwLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzOworCWludCBpOworCWludCBzdGF0dXM7CisJcGlkX3QgcGdpZDsKKworCUlOVE9GRjsKKwlpZiAoanAtPnN0YXRlID09IEpPQkRPTkUpCisJCWdvdG8gb3V0OworCWpwLT5zdGF0ZSA9IEpPQlJVTk5JTkc7CisJcGdpZCA9IGpwLT5wcy0+cGlkOworCWlmIChtb2RlID09IEZPUktfRkcpCisJCXh0Y3NldHBncnAodHR5ZmQsIHBnaWQpOworCWtpbGxwZyhwZ2lkLCBTSUdDT05UKTsKKwlwcyA9IGpwLT5wczsKKwlpID0ganAtPm5wcm9jczsKKwlkbyB7CisJCWlmIChXSUZTVE9QUEVEKHBzLT5zdGF0dXMpKSB7CisJCQlwcy0+c3RhdHVzID0gLTE7CisJCX0KKwl9IHdoaWxlIChwcysrLCAtLWkpOworb3V0OgorCXN0YXR1cyA9IChtb2RlID09IEZPUktfRkcpID8gd2FpdGZvcmpvYihqcCkgOiAwOworCUlOVE9OOworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworU1RBVElDIGludAorc3ByaW50X3N0YXR1cyhjaGFyICpzLCBpbnQgc3RhdHVzLCBpbnQgc2lnb25seSkKK3sKKwlpbnQgY29sOworCWludCBzdDsKKworCWNvbCA9IDA7CisJc3QgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCWlmICghV0lGRVhJVEVEKHN0YXR1cykpIHsKKyNpZiBKT0JTCisJCXN0ID0gV1NUT1BTSUcoc3RhdHVzKTsKKwkJaWYgKCFXSUZTVE9QUEVEKHN0YXR1cykpCisjZW5kaWYKKwkJCXN0ID0gV1RFUk1TSUcoc3RhdHVzKTsKKwkJaWYgKHNpZ29ubHkpIHsKKwkJCWlmIChzdCA9PSBTSUdJTlQgfHwgc3QgPT0gU0lHUElQRSkKKwkJCQlnb3RvIG91dDsKKyNpZiBKT0JTCisJCQlpZiAoV0lGU1RPUFBFRChzdGF0dXMpKQorCQkJCWdvdG8gb3V0OworI2VuZGlmCisJCX0KKwkJY29sID0gZm10c3RyKHMsIDMyLCBzdHJzaWduYWwoc3QpKTsKKwkJaWYgKFdDT1JFRFVNUChzdGF0dXMpKSB7CisJCQljb2wgKz0gZm10c3RyKHMgKyBjb2wsIDE2LCAiIChjb3JlIGR1bXBlZCkiKTsKKwkJfQorCX0gZWxzZSBpZiAoIXNpZ29ubHkpIHsKKwkJaWYgKHN0KQorCQkJY29sID0gZm10c3RyKHMsIDE2LCAiRG9uZSglZCkiLCBzdCk7CisJCWVsc2UKKwkJCWNvbCA9IGZtdHN0cihzLCAxNiwgIkRvbmUiKTsKKwl9CisKK291dDoKKwlyZXR1cm4gY29sOworfQorCitzdGF0aWMgdm9pZAorc2hvd2pvYihzdHJ1Y3Qgb3V0cHV0ICpvdXQsIHN0cnVjdCBqb2IgKmpwLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzOworCXN0cnVjdCBwcm9jc3RhdCAqcHNlbmQ7CisJaW50IGNvbDsKKwlpbnQgaW5kZW50OworCWNoYXIgc1s4MF07CisKKwlwcyA9IGpwLT5wczsKKworCWlmIChtb2RlICYgU0hPV19QR0lEKSB7CisJCS8qIGp1c3Qgb3V0cHV0IHByb2Nlc3MgKGdyb3VwKSBpZCBvZiBwaXBlbGluZSAqLworCQlvdXRmbXQob3V0LCAiJWRcbiIsIHBzLT5waWQpOworCQlyZXR1cm47CisJfQorCisJY29sID0gZm10c3RyKHMsIDE2LCAiWyVkXSAgICIsIGpvYm5vKGpwKSk7CisJaW5kZW50ID0gY29sOworCisJaWYgKGpwID09IGN1cmpvYikKKwkJc1tjb2wgLSAyXSA9ICcrJzsKKwllbHNlIGlmIChjdXJqb2IgJiYganAgPT0gY3Vyam9iLT5wcmV2X2pvYikKKwkJc1tjb2wgLSAyXSA9ICctJzsKKworCWlmIChtb2RlICYgU0hPV19QSUQpCisJCWNvbCArPSBmbXRzdHIocyArIGNvbCwgMTYsICIlZCAiLCBwcy0+cGlkKTsKKworCXBzZW5kID0gcHMgKyBqcC0+bnByb2NzOworCisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JSVU5OSU5HKSB7CisJCXNjb3B5KCJSdW5uaW5nIiwgcyArIGNvbCk7CisJCWNvbCArPSBzdHJsZW4oIlJ1bm5pbmciKTsKKwl9IGVsc2UgeworCQlpbnQgc3RhdHVzID0gcHNlbmRbLTFdLnN0YXR1czsKKyNpZiBKT0JTCisJCWlmIChqcC0+c3RhdGUgPT0gSk9CU1RPUFBFRCkKKwkJCXN0YXR1cyA9IGpwLT5zdG9wc3RhdHVzOworI2VuZGlmCisJCWNvbCArPSBzcHJpbnRfc3RhdHVzKHMgKyBjb2wsIHN0YXR1cywgMCk7CisJfQorCisJZ290byBzdGFydDsKKworCWRvIHsKKwkJLyogZm9yIGVhY2ggcHJvY2VzcyAqLworCQljb2wgPSBmbXRzdHIocywgNDgsICIgfFxuJSpjJWQgIiwgaW5kZW50LCAnICcsIHBzLT5waWQpIC0gMzsKKworc3RhcnQ6CisJCW91dGZtdCgKKwkJCW91dCwgIiVzJSpjJXMiLAorCQkJcywgMzMgLSBjb2wgPj0gMCA/IDMzIC0gY29sIDogMCwgJyAnLCBwcy0+Y21kCisJCSk7CisJCWlmICghKG1vZGUgJiBTSE9XX1BJRCkpIHsKKwkJCXNob3dwaXBlKGpwLCBvdXQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCsrcHMgPT0gcHNlbmQpIHsKKwkJCW91dGNzbG93KCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJanAtPmNoYW5nZWQgPSAwOworCisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKSB7CisJCVRSQUNFKCgic2hvd2pvYjogZnJlZWluZyBqb2IgJWRcbiIsIGpvYm5vKGpwKSkpOworCQlmcmVlam9iKGpwKTsKKwl9Cit9CisKKworaW50Citqb2JzY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbW9kZSwgbTsKKwlzdHJ1Y3Qgb3V0cHV0ICpvdXQ7CisKKwltb2RlID0gMDsKKwl3aGlsZSAoKG0gPSBuZXh0b3B0KCJscCIpKSkKKwkJaWYgKG0gPT0gJ2wnKQorCQkJbW9kZSA9IFNIT1dfUElEOworCQllbHNlCisJCQltb2RlID0gU0hPV19QR0lEOworCisJb3V0ID0gb3V0MTsKKwlhcmd2ID0gYXJncHRyOworCWlmICgqYXJndikKKwkJZG8KKwkJCXNob3dqb2Iob3V0LCBnZXRqb2IoKmFyZ3YsMCksIG1vZGUpOworCQl3aGlsZSAoKisrYXJndik7CisJZWxzZQorCQlzaG93am9icyhvdXQsIG1vZGUpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFByaW50IGEgbGlzdCBvZiBqb2JzLiAgSWYgImNoYW5nZSIgaXMgbm9uemVybywgb25seSBwcmludCBqb2JzIHdob3NlCisgKiBzdGF0dXNlcyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBzaG93am9icy4KKyAqLworCit2b2lkCitzaG93am9icyhzdHJ1Y3Qgb3V0cHV0ICpvdXQsIGludCBtb2RlKQoreworCXN0cnVjdCBqb2IgKmpwOworCisJVFJBQ0UoKCJzaG93am9icygleCkgY2FsbGVkXG4iLCBtb2RlKSk7CisKKwkvKiBJZiBub3QgZXZlbiBvbmUgb25lIGpvYiBjaGFuZ2VkLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvICovCisJd2hpbGUgKGRvd2FpdChET1dBSVRfTk9STUFMLCBOVUxMKSA+IDApCisJCWNvbnRpbnVlOworCisJZm9yIChqcCA9IGN1cmpvYjsganA7IGpwID0ganAtPnByZXZfam9iKSB7CisJCWlmICghKG1vZGUgJiBTSE9XX0NIQU5HRUQpIHx8IGpwLT5jaGFuZ2VkKQorCQkJc2hvd2pvYihvdXQsIGpwLCBtb2RlKTsKKwl9Cit9CisKKy8qCisgKiBNYXJrIGEgam9iIHN0cnVjdHVyZSBhcyB1bnVzZWQuCisgKi8KKworU1RBVElDIHZvaWQKK2ZyZWVqb2Ioc3RydWN0IGpvYiAqanApCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlpbnQgaTsKKworCUlOVE9GRjsKKwlmb3IgKGkgPSBqcC0+bnByb2NzLCBwcyA9IGpwLT5wcyA7IC0taSA+PSAwIDsgcHMrKykgeworCQlpZiAocHMtPmNtZCAhPSBudWxsc3RyKQorCQkJY2tmcmVlKHBzLT5jbWQpOworCX0KKwlpZiAoanAtPnBzICE9ICZqcC0+cHMwKQorCQlja2ZyZWUoanAtPnBzKTsKKwlqcC0+dXNlZCA9IDA7CisJc2V0X2N1cmpvYihqcCwgQ1VSX0RFTEVURSk7CisJSU5UT047Cit9CisKKworCitpbnQKK3dhaXRjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBqb2IgKmpvYjsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBqb2IgKmpwOworCisJRVhTSUdPTigpOworCisJbmV4dG9wdChudWxsc3RyKTsKKwlyZXR2YWwgPSAwOworCisJYXJndiA9IGFyZ3B0cjsKKwlpZiAoISphcmd2KSB7CisJCS8qIHdhaXQgZm9yIGFsbCBqb2JzICovCisJCWZvciAoOzspIHsKKwkJCWpwID0gY3Vyam9iOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoIWpwKSB7CisJCQkJCS8qIG5vIHJ1bm5pbmcgcHJvY3MgKi8KKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmIChqcC0+c3RhdGUgPT0gSk9CUlVOTklORykKKwkJCQkJYnJlYWs7CisJCQkJanAtPndhaXRlZCA9IDE7CisJCQkJanAgPSBqcC0+cHJldl9qb2I7CisJCQl9CisJCQlkb3dhaXQoRE9XQUlUX0JMT0NLLCAwKTsKKwkJfQorCX0KKworCXJldHZhbCA9IDEyNzsKKwlkbyB7CisJCWlmICgqKmFyZ3YgIT0gJyUnKSB7CisJCQlwaWRfdCBwaWQgPSBudW1iZXIoKmFyZ3YpOworCQkJam9iID0gY3Vyam9iOworCQkJZ290byBzdGFydDsKKwkJCWRvIHsKKwkJCQlpZiAoam9iLT5wc1tqb2ItPm5wcm9jcyAtIDFdLnBpZCA9PSBwaWQpCisJCQkJCWJyZWFrOworCQkJCWpvYiA9IGpvYi0+cHJldl9qb2I7CitzdGFydDoKKwkJCQlpZiAoIWpvYikKKwkJCQkJZ290byByZXBlYXQ7CisJCQl9IHdoaWxlICgxKTsKKwkJfSBlbHNlCisJCQlqb2IgPSBnZXRqb2IoKmFyZ3YsIDApOworCQkvKiBsb29wIHVudGlsIHByb2Nlc3MgdGVybWluYXRlZCBvciBzdG9wcGVkICovCisJCXdoaWxlIChqb2ItPnN0YXRlID09IEpPQlJVTk5JTkcpCisJCQlkb3dhaXQoRE9XQUlUX0JMT0NLLCAwKTsKKwkJam9iLT53YWl0ZWQgPSAxOworCQlyZXR2YWwgPSBnZXRzdGF0dXMoam9iKTsKK3JlcGVhdDoKKwkJOworCX0gd2hpbGUgKCorK2FyZ3YpOworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworCisKKy8qCisgKiBDb252ZXJ0IGEgam9iIG5hbWUgdG8gYSBqb2Igc3RydWN0dXJlLgorICovCisKK1NUQVRJQyBzdHJ1Y3Qgam9iICoKK2dldGpvYihjb25zdCBjaGFyICpuYW1lLCBpbnQgZ2V0Y3RsKQoreworCXN0cnVjdCBqb2IgKmpwOworCXN0cnVjdCBqb2IgKmZvdW5kOworCWNvbnN0IGNoYXIgKmVycl9tc2cgPSAiTm8gc3VjaCBqb2I6ICVzIjsKKwl1bnNpZ25lZCBudW07CisJaW50IGM7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICooKm1hdGNoKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlqcCA9IGN1cmpvYjsKKwlwID0gbmFtZTsKKwlpZiAoIXApCisJCWdvdG8gY3VycmVudGpvYjsKKworCWlmICgqcCAhPSAnJScpCisJCWdvdG8gZXJyOworCisJYyA9ICorK3A7CisJaWYgKCFjKQorCQlnb3RvIGN1cnJlbnRqb2I7CisKKwlpZiAoIXBbMV0pIHsKKwkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJyUnKSB7CitjdXJyZW50am9iOgorCQkJZXJyX21zZyA9ICJObyBjdXJyZW50IGpvYiI7CisJCQlnb3RvIGNoZWNrOworCQl9IGVsc2UgaWYgKGMgPT0gJy0nKSB7CisJCQlpZiAoanApCisJCQkJanAgPSBqcC0+cHJldl9qb2I7CisJCQllcnJfbXNnID0gIk5vIHByZXZpb3VzIGpvYiI7CitjaGVjazoKKwkJCWlmICghanApCisJCQkJZ290byBlcnI7CisJCQlnb3RvIGdvdGl0OworCQl9CisJfQorCisJaWYgKGlzX251bWJlcihwKSkgeworCQludW0gPSBhdG9pKHApOworCQlpZiAobnVtIDwgbmpvYnMpIHsKKwkJCWpwID0gam9idGFiICsgbnVtIC0gMTsKKwkJCWlmIChqcC0+dXNlZCkKKwkJCQlnb3RvIGdvdGl0OworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwltYXRjaCA9IHByZWZpeDsKKwlpZiAoKnAgPT0gJz8nKSB7CisJCW1hdGNoID0gc3Ryc3RyOworCQlwKys7CisJfQorCisJZm91bmQgPSAwOworCXdoaWxlICgxKSB7CisJCWlmICghanApCisJCQlnb3RvIGVycjsKKwkJaWYgKG1hdGNoKGpwLT5wc1swXS5jbWQsIHApKSB7CisJCQlpZiAoZm91bmQpCisJCQkJZ290byBlcnI7CisJCQlmb3VuZCA9IGpwOworCQkJZXJyX21zZyA9ICIlczogYW1iaWd1b3VzIjsKKwkJfQorCQlqcCA9IGpwLT5wcmV2X2pvYjsKKwl9CisKK2dvdGl0OgorI2lmIEpPQlMKKwllcnJfbXNnID0gImpvYiAlcyBub3QgY3JlYXRlZCB1bmRlciBqb2IgY29udHJvbCI7CisJaWYgKGdldGN0bCAmJiBqcC0+am9iY3RsID09IDApCisJCWdvdG8gZXJyOworI2VuZGlmCisJcmV0dXJuIGpwOworZXJyOgorCXNoX2Vycm9yKGVycl9tc2csIG5hbWUpOworfQorCisKKworLyoKKyAqIFJldHVybiBhIG5ldyBqb2Igc3RydWN0dXJlLgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KKworc3RydWN0IGpvYiAqCittYWtlam9iKHVuaW9uIG5vZGUgKm5vZGUsIGludCBucHJvY3MpCit7CisJaW50IGk7CisJc3RydWN0IGpvYiAqanA7CisKKwlmb3IgKGkgPSBuam9icywganAgPSBqb2J0YWIgOyA7IGpwKyspIHsKKwkJaWYgKC0taSA8IDApIHsKKwkJCWpwID0gZ3Jvd2pvYnRhYigpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGpwLT51c2VkID09IDApCisJCQlicmVhazsKKwkJaWYgKGpwLT5zdGF0ZSAhPSBKT0JET05FIHx8ICFqcC0+d2FpdGVkKQorCQkJY29udGludWU7CisJCWlmIChqb2JjdGwpCisJCQljb250aW51ZTsKKwkJZnJlZWpvYihqcCk7CisJCWJyZWFrOworCX0KKwltZW1zZXQoanAsIDAsIHNpemVvZigqanApKTsKKyNpZiBKT0JTCisJaWYgKGpvYmN0bCkKKwkJanAtPmpvYmN0bCA9IDE7CisjZW5kaWYKKwlqcC0+cHJldl9qb2IgPSBjdXJqb2I7CisJY3Vyam9iID0ganA7CisJanAtPnVzZWQgPSAxOworCWpwLT5wcyA9ICZqcC0+cHMwOworCWlmIChucHJvY3MgPiAxKSB7CisJCWpwLT5wcyA9IGNrbWFsbG9jKG5wcm9jcyAqIHNpemVvZiAoc3RydWN0IHByb2NzdGF0KSk7CisJfQorCVRSQUNFKCgibWFrZWpvYigweCVseCwgJWQpIHJldHVybnMgJSUlZFxuIiwgKGxvbmcpbm9kZSwgbnByb2NzLAorCSAgICBqb2JubyhqcCkpKTsKKwlyZXR1cm4ganA7Cit9CisKK1NUQVRJQyBzdHJ1Y3Qgam9iICoKK2dyb3dqb2J0YWIodm9pZCkKK3sKKwlzaXplX3QgbGVuOworCXB0cmRpZmZfdCBvZmZzZXQ7CisJc3RydWN0IGpvYiAqanAsICpqcTsKKworCWxlbiA9IG5qb2JzICogc2l6ZW9mKCpqcCk7CisJanEgPSBqb2J0YWI7CisJanAgPSBja3JlYWxsb2MoanEsIGxlbiArIDQgKiBzaXplb2YoKmpwKSk7CisKKwlvZmZzZXQgPSAoY2hhciAqKWpwIC0gKGNoYXIgKilqcTsKKwlpZiAob2Zmc2V0KSB7CisJCS8qIFJlbG9jYXRlIHBvaW50ZXJzICovCisJCXNpemVfdCBsID0gbGVuOworCisJCWpxID0gKHN0cnVjdCBqb2IgKikoKGNoYXIgKilqcSArIGwpOworCQl3aGlsZSAobCkgeworCQkJbCAtPSBzaXplb2YoKmpwKTsKKwkJCWpxLS07CisjZGVmaW5lIGpvZmYocCkgKChzdHJ1Y3Qgam9iICopKChjaGFyICopKHApICsgbCkpCisjZGVmaW5lIGptb3ZlKHApIChwKSA9ICh2b2lkICopKChjaGFyICopKHApICsgb2Zmc2V0KQorCQkJaWYgKGxpa2VseShqb2ZmKGpwKS0+cHMgPT0gJmpxLT5wczApKQorCQkJCWptb3ZlKGpvZmYoanApLT5wcyk7CisJCQlpZiAoam9mZihqcCktPnByZXZfam9iKQorCQkJCWptb3ZlKGpvZmYoanApLT5wcmV2X2pvYik7CisJCX0KKwkJaWYgKGN1cmpvYikKKwkJCWptb3ZlKGN1cmpvYik7CisjdW5kZWYgam9mZgorI3VuZGVmIGptb3ZlCisJfQorCisJbmpvYnMgKz0gNDsKKwlqb2J0YWIgPSBqcDsKKwlqcCA9IChzdHJ1Y3Qgam9iICopKChjaGFyICopanAgKyBsZW4pOworCWpxID0ganAgKyAzOworCWRvIHsKKwkJanEtPnVzZWQgPSAwOworCX0gd2hpbGUgKC0tanEgPj0ganApOworCXJldHVybiBqcDsKK30KKworCisvKgorICogRm9yayBvZmYgYSBzdWJzaGVsbC4gIElmIHdlIGFyZSBkb2luZyBqb2IgY29udHJvbCwgZ2l2ZSB0aGUgc3Vic2hlbGwgaXRzCisgKiBvd24gcHJvY2VzcyBncm91cC4gIEpwIGlzIGEgam9iIHN0cnVjdHVyZSB0aGF0IHRoZSBqb2IgaXMgdG8gYmUgYWRkZWQgdG8uCisgKiBOIGlzIHRoZSBjb21tYW5kIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgYnkgdGhlIGNoaWxkLiAgQm90aCBqcCBhbmQgbiBtYXkKKyAqIGJlIE5VTEwuICBUaGUgbW9kZSBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICoJRk9SS19GRyAtIEZvcmsgb2ZmIGEgZm9yZWdyb3VuZCBwcm9jZXNzLgorICoJRk9SS19CRyAtIEZvcmsgb2ZmIGEgYmFja2dyb3VuZCBwcm9jZXNzLgorICoJRk9SS19OT0pPQiAtIExpa2UgRk9SS19GRywgYnV0IGRvbid0IGdpdmUgdGhlIHByb2Nlc3MgaXRzIG93bgorICoJCSAgICAgcHJvY2VzcyBncm91cCBldmVuIGlmIGpvYiBjb250cm9sIGlzIG9uLgorICoKKyAqIFdoZW4gam9iIGNvbnRyb2wgaXMgdHVybmVkIG9mZiwgYmFja2dyb3VuZCBwcm9jZXNzZXMgaGF2ZSB0aGVpciBzdGFuZGFyZAorICogaW5wdXQgcmVkaXJlY3RlZCB0byAvZGV2L251bGwgKGV4Y2VwdCBmb3IgdGhlIHNlY29uZCBhbmQgbGF0ZXIgcHJvY2Vzc2VzCisgKiBpbiBhIHBpcGVsaW5lKS4KKyAqCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworCitTVEFUSUMgaW5saW5lIHZvaWQKK2ZvcmtjaGlsZChzdHJ1Y3Qgam9iICpqcCwgdW5pb24gbm9kZSAqbiwgaW50IG1vZGUpCit7CisJaW50IG9sZGx2bDsKKworCVRSQUNFKCgiQ2hpbGQgc2hlbGwgJWRcbiIsIGdldHBpZCgpKSk7CisJb2xkbHZsID0gc2hsdmw7CisJc2hsdmwrKzsKKworCWNsb3Nlc2NyaXB0KCk7CisJY2xlYXJfdHJhcHMoKTsKKyNpZiBKT0JTCisJLyogZG8gam9iIGNvbnRyb2wgb25seSBpbiByb290IHNoZWxsICovCisJam9iY3RsID0gMDsKKwlpZiAobW9kZSAhPSBGT1JLX05PSk9CICYmIGpwLT5qb2JjdGwgJiYgIW9sZGx2bCkgeworCQlwaWRfdCBwZ3JwOworCisJCWlmIChqcC0+bnByb2NzID09IDApCisJCQlwZ3JwID0gZ2V0cGlkKCk7CisJCWVsc2UKKwkJCXBncnAgPSBqcC0+cHNbMF0ucGlkOworCQkvKiBUaGlzIGNhbiBmYWlsIGJlY2F1c2Ugd2UgYXJlIGRvaW5nIGl0IGluIHRoZSBwYXJlbnQgYWxzbyAqLworCQkodm9pZClzZXRwZ2lkKDAsIHBncnApOworCQlpZiAobW9kZSA9PSBGT1JLX0ZHKQorCQkJeHRjc2V0cGdycCh0dHlmZCwgcGdycCk7CisJCXNldHNpZ25hbChTSUdUU1RQKTsKKwkJc2V0c2lnbmFsKFNJR1RUT1UpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKG1vZGUgPT0gRk9SS19CRykgeworCQlpZ25vcmVzaWcoU0lHSU5UKTsKKwkJaWdub3Jlc2lnKFNJR1FVSVQpOworCQlpZiAoanAtPm5wcm9jcyA9PSAwKSB7CisJCQljbG9zZSgwKTsKKwkJCWlmIChvcGVuKF9QQVRIX0RFVk5VTEwsIE9fUkRPTkxZKSAhPSAwKQorCQkJCXNoX2Vycm9yKCJDYW4ndCBvcGVuICVzIiwgX1BBVEhfREVWTlVMTCk7CisJCX0KKwl9CisJaWYgKCFvbGRsdmwgJiYgaWZsYWcpIHsKKwkJc2V0c2lnbmFsKFNJR0lOVCk7CisJCXNldHNpZ25hbChTSUdRVUlUKTsKKwkJc2V0c2lnbmFsKFNJR1RFUk0pOworCX0KKwlmb3IgKGpwID0gY3Vyam9iOyBqcDsganAgPSBqcC0+cHJldl9qb2IpCisJCWZyZWVqb2IoanApOworCWpvYmxlc3MgPSAwOworfQorCitTVEFUSUMgaW5saW5lIHZvaWQKK2ZvcmtwYXJlbnQoc3RydWN0IGpvYiAqanAsIHVuaW9uIG5vZGUgKm4sIGludCBtb2RlLCBwaWRfdCBwaWQpCit7CisJVFJBQ0UoKCJJbiBwYXJlbnQgc2hlbGw6ICBjaGlsZCA9ICVkXG4iLCBwaWQpKTsKKwlpZiAoIWpwKSB7CisJCXdoaWxlIChqb2JsZXNzICYmIGRvd2FpdChET1dBSVRfTk9STUFMLCAwKSA+IDApOworCQlqb2JsZXNzKys7CisJCXJldHVybjsKKwl9CisjaWYgSk9CUworCWlmIChtb2RlICE9IEZPUktfTk9KT0IgJiYganAtPmpvYmN0bCkgeworCQlpbnQgcGdycDsKKworCQlpZiAoanAtPm5wcm9jcyA9PSAwKQorCQkJcGdycCA9IHBpZDsKKwkJZWxzZQorCQkJcGdycCA9IGpwLT5wc1swXS5waWQ7CisJCS8qIFRoaXMgY2FuIGZhaWwgYmVjYXVzZSB3ZSBhcmUgZG9pbmcgaXQgaW4gdGhlIGNoaWxkIGFsc28gKi8KKwkJKHZvaWQpc2V0cGdpZChwaWQsIHBncnApOworCX0KKyNlbmRpZgorCWlmIChtb2RlID09IEZPUktfQkcpIHsKKwkJYmFja2duZHBpZCA9IHBpZDsJCS8qIHNldCAkISAqLworCQlzZXRfY3Vyam9iKGpwLCBDVVJfUlVOTklORyk7CisJfQorCWlmIChqcCkgeworCQlzdHJ1Y3QgcHJvY3N0YXQgKnBzID0gJmpwLT5wc1tqcC0+bnByb2NzKytdOworCQlwcy0+cGlkID0gcGlkOworCQlwcy0+c3RhdHVzID0gLTE7CisJCXBzLT5jbWQgPSBudWxsc3RyOworCQlpZiAoam9iY3RsICYmIG4pCisJCQlwcy0+Y21kID0gY29tbWFuZHRleHQobik7CisJfQorfQorCitpbnQKK2ZvcmtzaGVsbChzdHJ1Y3Qgam9iICpqcCwgdW5pb24gbm9kZSAqbiwgaW50IG1vZGUpCit7CisJaW50IHBpZDsKKworCVRSQUNFKCgiZm9ya3NoZWxsKCUlJWQsICVwLCAlZCkgY2FsbGVkXG4iLCBqb2JubyhqcCksIG4sIG1vZGUpKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIHsKKwkJVFJBQ0UoKCJGb3JrIGZhaWxlZCwgZXJybm89JWQiLCBlcnJubykpOworCQlpZiAoanApCisJCQlmcmVlam9iKGpwKTsKKwkJc2hfZXJyb3IoIkNhbm5vdCBmb3JrIik7CisJfQorCWlmIChwaWQgPT0gMCkKKwkJZm9ya2NoaWxkKGpwLCBuLCBtb2RlKTsKKwllbHNlCisJCWZvcmtwYXJlbnQoanAsIG4sIG1vZGUsIHBpZCk7CisJcmV0dXJuIHBpZDsKK30KKworLyoKKyAqIFdhaXQgZm9yIGpvYiB0byBmaW5pc2guCisgKgorICogVW5kZXIgam9iIGNvbnRyb2wgd2UgaGF2ZSB0aGUgcHJvYmxlbSB0aGF0IHdoaWxlIGEgY2hpbGQgcHJvY2VzcyBpcworICogcnVubmluZyBpbnRlcnJ1cHRzIGdlbmVyYXRlZCBieSB0aGUgdXNlciBhcmUgc2VudCB0byB0aGUgY2hpbGQgYnV0IG5vdAorICogdG8gdGhlIHNoZWxsLiAgVGhpcyBtZWFucyB0aGF0IGFuIGluZmluaXRlIGxvb3Agc3RhcnRlZCBieSBhbiBpbnRlci0KKyAqIGFjdGl2ZSB1c2VyIG1heSBiZSBoYXJkIHRvIGtpbGwuICBXaXRoIGpvYiBjb250cm9sIHR1cm5lZCBvZmYsIGFuCisgKiBpbnRlcmFjdGl2ZSB1c2VyIG1heSBwbGFjZSBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIGluc2lkZSBhIGxvb3AuICBJZgorICogdGhlIGludGVyYWN0aXZlIHByb2dyYW0gY2F0Y2hlcyBpbnRlcnJ1cHRzLCB0aGUgdXNlciBkb2Vzbid0IHdhbnQKKyAqIHRoZXNlIGludGVycnVwdHMgdG8gYWxzbyBhYm9ydCB0aGUgbG9vcC4gIFRoZSBhcHByb2FjaCB3ZSB0YWtlIGhlcmUKKyAqIGlzIHRvIGhhdmUgdGhlIHNoZWxsIGlnbm9yZSBpbnRlcnJ1cHQgc2lnbmFscyB3aGlsZSB3YWl0aW5nIGZvciBhCisgKiBmb3Jncm91bmQgcHJvY2VzcyB0byB0ZXJtaW5hdGUsIGFuZCB0aGVuIHNlbmQgaXRzZWxmIGFuIGludGVycnVwdAorICogc2lnbmFsIGlmIHRoZSBjaGlsZCBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGFuIGludGVycnVwdCBzaWduYWwuCisgKiBVbmZvcnR1bmF0ZWx5LCBzb21lIHByb2dyYW1zIHdhbnQgdG8gZG8gYSBiaXQgb2YgY2xlYW51cCBhbmQgdGhlbgorICogZXhpdCBvbiBpbnRlcnJ1cHQ7IHVubGVzcyB0aGVzZSBwcm9jZXNzZXMgdGVybWluYXRlIHRoZW1zZWx2ZXMgYnkKKyAqIHNlbmRpbmcgYSBzaWduYWwgdG8gdGhlbXNlbHZlcyAoaW5zdGVhZCBvZiBjYWxsaW5nIGV4aXQpIHRoZXkgd2lsbAorICogY29uZnVzZSB0aGlzIGFwcHJvYWNoLgorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCisKK2ludAord2FpdGZvcmpvYihzdHJ1Y3Qgam9iICpqcCkKK3sKKwlpbnQgc3Q7CisKKwlUUkFDRSgoIndhaXRmb3Jqb2IoJSUlZCkgY2FsbGVkXG4iLCBqb2JubyhqcCkpKTsKKwl3aGlsZSAoanAtPnN0YXRlID09IEpPQlJVTk5JTkcpIHsKKwkJZG93YWl0KERPV0FJVF9CTE9DSywganApOworCX0KKwlzdCA9IGdldHN0YXR1cyhqcCk7CisjaWYgSk9CUworCWlmIChqcC0+am9iY3RsKSB7CisJCXh0Y3NldHBncnAodHR5ZmQsIHJvb3RwaWQpOworCQkvKgorCQkgKiBUaGlzIGlzIHRydWx5IGdyb3NzLgorCQkgKiBJZiB3ZSdyZSBkb2luZyBqb2IgY29udHJvbCwgdGhlbiB3ZSBkaWQgYSBUSU9DU1BHUlAgd2hpY2gKKwkJICogY2F1c2VkIHVzICh0aGUgc2hlbGwpIHRvIG5vIGxvbmdlciBiZSBpbiB0aGUgY29udHJvbGxpbmcKKwkJICogc2Vzc2lvbiAtLSBzbyB3ZSB3b3VsZG4ndCBoYXZlIHNlZW4gYW55IF5DL1NJR0lOVC4gIFNvLCB3ZQorCQkgKiBpbnR1aXQgZnJvbSB0aGUgc3VicHJvY2VzcyBleGl0IHN0YXR1cyB3aGV0aGVyIGEgU0lHSU5UCisJCSAqIG9jY3VycmVkLCBhbmQgaWYgc28gaW50ZXJydXB0IG91cnNlbHZlcy4gIFl1Y2suICAtIG15Y3JvZnQKKwkJICovCisJCWlmIChqcC0+c2lnaW50KQorCQkJcmFpc2UoU0lHSU5UKTsKKwl9CisjZW5kaWYKKwlpZiAoISBKT0JTIHx8IGpwLT5zdGF0ZSA9PSBKT0JET05FKQorCQlmcmVlam9iKGpwKTsKKwlyZXR1cm4gc3Q7Cit9CisKKworCisvKgorICogV2FpdCBmb3IgYSBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4KKyAqLworCitTVEFUSUMgaW50Citkb3dhaXQoaW50IGJsb2NrLCBzdHJ1Y3Qgam9iICpqb2IpCit7CisJaW50IHBpZDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBqb2IgKmpwOworCXN0cnVjdCBqb2IgKnRoaXNqb2I7CisJaW50IHN0YXRlOworCisJVFJBQ0UoKCJkb3dhaXQoJWQpIGNhbGxlZFxuIiwgYmxvY2spKTsKKwlwaWQgPSB3YWl0cHJvYyhibG9jaywgJnN0YXR1cyk7CisJVFJBQ0UoKCJ3YWl0IHJldHVybnMgcGlkICVkLCBzdGF0dXM9JWRcbiIsIHBpZCwgc3RhdHVzKSk7CisJaWYgKHBpZCA8PSAwKQorCQlyZXR1cm4gcGlkOworCUlOVE9GRjsKKwl0aGlzam9iID0gTlVMTDsKKwlmb3IgKGpwID0gY3Vyam9iOyBqcDsganAgPSBqcC0+cHJldl9qb2IpIHsKKwkJc3RydWN0IHByb2NzdGF0ICpzcDsKKwkJc3RydWN0IHByb2NzdGF0ICpzcGVuZDsKKwkJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKQorCQkJY29udGludWU7CisJCXN0YXRlID0gSk9CRE9ORTsKKwkJc3BlbmQgPSBqcC0+cHMgKyBqcC0+bnByb2NzOworCQlzcCA9IGpwLT5wczsKKwkJZG8geworCQkJaWYgKHNwLT5waWQgPT0gcGlkKSB7CisJCQkJVFJBQ0UoKCJKb2IgJWQ6IGNoYW5naW5nIHN0YXR1cyBvZiBwcm9jICVkIGZyb20gMHgleCB0byAweCV4XG4iLCBqb2JubyhqcCksIHBpZCwgc3AtPnN0YXR1cywgc3RhdHVzKSk7CisJCQkJc3AtPnN0YXR1cyA9IHN0YXR1czsKKwkJCQl0aGlzam9iID0ganA7CisJCQl9CisJCQlpZiAoc3AtPnN0YXR1cyA9PSAtMSkKKwkJCQlzdGF0ZSA9IEpPQlJVTk5JTkc7CisjaWYgSk9CUworCQkJaWYgKHN0YXRlID09IEpPQlJVTk5JTkcpCisJCQkJY29udGludWU7CisJCQlpZiAoV0lGU1RPUFBFRChzcC0+c3RhdHVzKSkgeworCQkJCWpwLT5zdG9wc3RhdHVzID0gc3AtPnN0YXR1czsKKwkJCQlzdGF0ZSA9IEpPQlNUT1BQRUQ7CisJCQl9CisjZW5kaWYKKwkJfSB3aGlsZSAoKytzcCA8IHNwZW5kKTsKKwkJaWYgKHRoaXNqb2IpCisJCQlnb3RvIGdvdGpvYjsKKwl9CisJaWYgKCFKT0JTIHx8ICFXSUZTVE9QUEVEKHN0YXR1cykpCisJCWpvYmxlc3MtLTsKKwlnb3RvIG91dDsKKworZ290am9iOgorCWlmIChzdGF0ZSAhPSBKT0JSVU5OSU5HKSB7CisJCXRoaXNqb2ItPmNoYW5nZWQgPSAxOworCisJCWlmICh0aGlzam9iLT5zdGF0ZSAhPSBzdGF0ZSkgeworCQkJVFJBQ0UoKCJKb2IgJWQ6IGNoYW5naW5nIHN0YXRlIGZyb20gJWQgdG8gJWRcbiIsIGpvYm5vKHRoaXNqb2IpLCB0aGlzam9iLT5zdGF0ZSwgc3RhdGUpKTsKKwkJCXRoaXNqb2ItPnN0YXRlID0gc3RhdGU7CisjaWYgSk9CUworCQkJaWYgKHN0YXRlID09IEpPQlNUT1BQRUQpIHsKKwkJCQlzZXRfY3Vyam9iKHRoaXNqb2IsIENVUl9TVE9QUEVEKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCitvdXQ6CisJSU5UT047CisKKwlpZiAodGhpc2pvYiAmJiB0aGlzam9iID09IGpvYikgeworCQljaGFyIHNbNDggKyAxXTsKKwkJaW50IGxlbjsKKworCQlsZW4gPSBzcHJpbnRfc3RhdHVzKHMsIHN0YXR1cywgMSk7CisJCWlmIChsZW4pIHsKKwkJCXNbbGVuXSA9ICdcbic7CisJCQlzW2xlbiArIDFdID0gMDsKKwkJCW91dHN0cihzLCBvdXQyKTsKKwkJfQorCX0KKwlyZXR1cm4gcGlkOworfQorCisKKworLyoKKyAqIERvIGEgd2FpdCBzeXN0ZW0gY2FsbC4gIElmIGpvYiBjb250cm9sIGlzIGNvbXBpbGVkIGluLCB3ZSBhY2NlcHQKKyAqIHN0b3BwZWQgcHJvY2Vzc2VzLiAgSWYgYmxvY2sgaXMgemVybywgd2UgcmV0dXJuIGEgdmFsdWUgb2YgemVybworICogcmF0aGVyIHRoYW4gYmxvY2tpbmcuCisgKgorICogU3lzdGVtIFYgZG9lc24ndCBoYXZlIGEgbm9uLWJsb2NraW5nIHdhaXQgc3lzdGVtIGNhbGwuICBJdCBkb2VzCisgKiBoYXZlIGEgU0lHQ0xEIHNpZ25hbCB0aGF0IGlzIHNlbnQgdG8gYSBwcm9jZXNzIHdoZW4gb25lIG9mIGl0J3MKKyAqIGNoaWxkcmVuIGRpZXMuICBUaGUgb2J2aW91cyB3YXkgdG8gdXNlIFNJR0NMRCB3b3VsZCBiZSB0byBpbnN0YWxsCisgKiBhIGhhbmRsZXIgZm9yIFNJR0NMRCB3aGljaCBzaW1wbHkgYnVtcGVkIGEgY291bnRlciB3aGVuIGEgU0lHQ0xECisgKiB3YXMgcmVjZWl2ZWQsIGFuZCBoYXZlIHdhaXRwcm9jIGJ1bXAgYW5vdGhlciBjb3VudGVyIHdoZW4gaXQgZ290CisgKiB0aGUgc3RhdHVzIG9mIGEgcHJvY2Vzcy4gIFdhaXRwcm9jIHdvdWxkIHRoZW4ga25vdyB0aGF0IGEgd2FpdAorICogc3lzdGVtIGNhbGwgd291bGQgbm90IGJsb2NrIGlmIHRoZSB0d28gY291bnRlcnMgd2VyZSBkaWZmZXJlbnQuCisgKiBUaGlzIGFwcHJvYWNoIGRvZXNuJ3Qgd29yayBiZWNhdXNlIGlmIGEgcHJvY2VzcyBoYXMgY2hpbGRyZW4gdGhhdAorICogaGF2ZSBub3QgYmVlbiB3YWl0ZWQgZm9yLCBTeXN0ZW0gViB3aWxsIHNlbmQgaXQgYSBTSUdDTEQgd2hlbiBpdAorICogaW5zdGFsbHMgYSBzaWduYWwgaGFuZGxlciBmb3IgU0lHQ0xELiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgd2hlbgorICogYSBjaGlsZCBleGl0cywgdGhlIHNoZWxsIHdpbGwgYmUgc2VudCBTSUdDTEQgc2lnbmFscyBjb250aW51b3VzbHkKKyAqIHVudGlsIGlzIHJ1bnMgb3V0IG9mIHN0YWNrIHNwYWNlLCB1bmxlc3MgaXQgZG9lcyBhIHdhaXQgY2FsbCBiZWZvcmUKKyAqIHJlc3RvcmluZyB0aGUgc2lnbmFsIGhhbmRsZXIuICBUaGUgY29kZSBiZWxvdyB0YWtlcyBhZHZhbnRhZ2Ugb2YKKyAqIHRoaXMgKG1pcylmZWF0dXJlIGJ5IGluc3RhbGxpbmcgYSBzaWduYWwgaGFuZGxlciBmb3IgU0lHQ0xEIGFuZAorICogdGhlbiBjaGVja2luZyB0byBzZWUgd2hldGhlciBpdCB3YXMgY2FsbGVkLiAgSWYgdGhlcmUgYXJlIGFueQorICogY2hpbGRyZW4gdG8gYmUgd2FpdGVkIGZvciwgaXQgd2lsbCBiZS4KKyAqCisgKiBJZiBuZWl0aGVyIFNZU1Ygbm9yIEJTRCBpcyBkZWZpbmVkLCB3ZSBkb24ndCBpbXBsZW1lbnQgbm9uYmxvY2tpbmcKKyAqIHdhaXRzIGF0IGFsbC4gIEluIHRoaXMgY2FzZSwgdGhlIHVzZXIgd2lsbCBub3QgYmUgaW5mb3JtZWQgd2hlbgorICogYSBiYWNrZ3JvdW5kIHByb2Nlc3MgdW50aWwgdGhlIG5leHQgdGltZSBzaGUgcnVucyBhIHJlYWwgcHJvZ3JhbQorICogKGFzIG9wcG9zZWQgdG8gcnVubmluZyBhIGJ1aWx0aW4gY29tbWFuZCBvciBqdXN0IHR5cGluZyByZXR1cm4pLAorICogYW5kIHRoZSBqb2JzIGNvbW1hbmQgbWF5IGdpdmUgb3V0IG9mIGRhdGUgaW5mb3JtYXRpb24uCisgKi8KKworI2lmZGVmIFNZU1YKK1NUQVRJQyBpbnQgZ290c2lnY2hpbGQ7CisKK1NUQVRJQyBpbnQgb25zaWdjaGlsZCgpIHsKKwlnb3RzaWdjaGlsZCA9IDE7Cit9CisjZW5kaWYKKworCitTVEFUSUMgaW50Cit3YWl0cHJvYyhpbnQgYmxvY2ssIGludCAqc3RhdHVzKQoreworI2lmZGVmIEJTRAorCWludCBmbGFncyA9IDA7CisKKyNpZiBKT0JTCisJaWYgKGpvYmN0bCkKKwkJZmxhZ3MgfD0gV1VOVFJBQ0VEOworI2VuZGlmCisJaWYgKGJsb2NrID09IDApCisJCWZsYWdzIHw9IFdOT0hBTkc7CisJcmV0dXJuIHdhaXQzKHN0YXR1cywgZmxhZ3MsIChzdHJ1Y3QgcnVzYWdlICopTlVMTCk7CisjZWxzZQorI2lmZGVmIFNZU1YKKwlpbnQgKCpzYXZlKSgpOworCisJaWYgKGJsb2NrID09IDApIHsKKwkJZ290c2lnY2hpbGQgPSAwOworCQlzYXZlID0gc2lnbmFsKFNJR0NMRCwgb25zaWdjaGlsZCk7CisJCXNpZ25hbChTSUdDTEQsIHNhdmUpOworCQlpZiAoZ290c2lnY2hpbGQgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gd2FpdChzdGF0dXMpOworI2Vsc2UKKwlpZiAoYmxvY2sgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHdhaXQoc3RhdHVzKTsKKyNlbmRpZgorI2VuZGlmCit9CisKKy8qCisgKiByZXR1cm4gMSBpZiB0aGVyZSBhcmUgc3RvcHBlZCBqb2JzLCBvdGhlcndpc2UgMAorICovCitpbnQgam9iX3dhcm5pbmc7CitpbnQKK3N0b3BwZWRqb2JzKHZvaWQpCit7CisJc3RydWN0IGpvYiAqanA7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IDA7CisJaWYgKGpvYl93YXJuaW5nKQorCQlnb3RvIG91dDsKKwlqcCA9IGN1cmpvYjsKKwlpZiAoanAgJiYganAtPnN0YXRlID09IEpPQlNUT1BQRUQpIHsKKwkJb3V0MnN0cigiWW91IGhhdmUgc3RvcHBlZCBqb2JzLlxuIik7CisJCWpvYl93YXJuaW5nID0gMjsKKwkJcmV0dmFsKys7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyBhIGNvbW1hbmQgKHRvIGJlIHByaW50ZWQgYnkgdGhlCisgKiBqb2JzIGNvbW1hbmQpLgorICovCisKK1NUQVRJQyBjaGFyICpjbWRuZXh0YzsKKworU1RBVElDIGNoYXIgKgorY29tbWFuZHRleHQodW5pb24gbm9kZSAqbikKK3sKKwljaGFyICpuYW1lOworCisJU1RBUlRTVEFDS1NUUihjbWRuZXh0Yyk7CisJY21kdHh0KG4pOworCW5hbWUgPSBzdGFja2Jsb2NrKCk7CisJVFJBQ0UoKCJjb21tYW5kdGV4dDogbmFtZSAlcCwgZW5kICVwXG5cdFwiJXNcIlxuIiwKKwkJbmFtZSwgY21kbmV4dGMsIHBzLT5jbWQpKTsKKwlyZXR1cm4gc2F2ZXN0cihuYW1lKTsKK30KKworCitTVEFUSUMgdm9pZAorY21kdHh0KHVuaW9uIG5vZGUgKm4pCit7CisJdW5pb24gbm9kZSAqbnA7CisJc3RydWN0IG5vZGVsaXN0ICpscDsKKwljb25zdCBjaGFyICpwOworCWNoYXIgc1syXTsKKworCWlmICghbikKKwkJcmV0dXJuOworCXN3aXRjaCAobi0+dHlwZSkgeworCWRlZmF1bHQ6CisjaWYgREVCVUcKKwkJYWJvcnQoKTsKKyNlbmRpZgorCWNhc2UgTlBJUEU6CisJCWxwID0gbi0+bnBpcGUuY21kbGlzdDsKKwkJZm9yICg7OykgeworCQkJY21kdHh0KGxwLT5uKTsKKwkJCWxwID0gbHAtPm5leHQ7CisJCQlpZiAoIWxwKQorCQkJCWJyZWFrOworCQkJY21kcHV0cygiIHwgIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOU0VNSToKKwkJcCA9ICI7ICI7CisJCWdvdG8gYmlub3A7CisJY2FzZSBOQU5EOgorCQlwID0gIiAmJiAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTk9SOgorCQlwID0gIiB8fCAiOworYmlub3A6CisJCWNtZHR4dChuLT5uYmluYXJ5LmNoMSk7CisJCWNtZHB1dHMocCk7CisJCW4gPSBuLT5uYmluYXJ5LmNoMjsKKwkJZ290byBkb25vZGU7CisJY2FzZSBOUkVESVI6CisJY2FzZSBOQkFDS0dORDoKKwkJbiA9IG4tPm5yZWRpci5uOworCQlnb3RvIGRvbm9kZTsKKwljYXNlIE5OT1Q6CisJCWNtZHB1dHMoIiEiKTsKKwkJbiA9IG4tPm5ub3QuY29tOworZG9ub2RlOgorCQljbWR0eHQobik7CisJCWJyZWFrOworCWNhc2UgTklGOgorCQljbWRwdXRzKCJpZiAiKTsKKwkJY21kdHh0KG4tPm5pZi50ZXN0KTsKKwkJY21kcHV0cygiOyB0aGVuICIpOworCQluID0gbi0+bmlmLmlmcGFydDsKKwkJaWYgKG4tPm5pZi5lbHNlcGFydCkgeworCQkJY21kdHh0KG4pOworCQkJY21kcHV0cygiOyBlbHNlICIpOworCQkJbiA9IG4tPm5pZi5lbHNlcGFydDsKKwkJfQorCQlwID0gIjsgZmkiOworCQlnb3RvIGRvdGFpbDsKKwljYXNlIE5TVUJTSEVMTDoKKwkJY21kcHV0cygiKCIpOworCQluID0gbi0+bnJlZGlyLm47CisJCXAgPSAiKSI7CisJCWdvdG8gZG90YWlsOworCWNhc2UgTldISUxFOgorCQlwID0gIndoaWxlICI7CisJCWdvdG8gdW50aWw7CisJY2FzZSBOVU5USUw6CisJCXAgPSAidW50aWwgIjsKK3VudGlsOgorCQljbWRwdXRzKHApOworCQljbWR0eHQobi0+bmJpbmFyeS5jaDEpOworCQluID0gbi0+bmJpbmFyeS5jaDI7CisJCXAgPSAiOyBkb25lIjsKK2RvZG86CisJCWNtZHB1dHMoIjsgZG8gIik7Citkb3RhaWw6CisJCWNtZHR4dChuKTsKKwkJZ290byBkb3RhaWwyOworCWNhc2UgTkZPUjoKKwkJY21kcHV0cygiZm9yICIpOworCQljbWRwdXRzKG4tPm5mb3IudmFyKTsKKwkJY21kcHV0cygiIGluICIpOworCQljbWRsaXN0KG4tPm5mb3IuYXJncywgMSk7CisJCW4gPSBuLT5uZm9yLmJvZHk7CisJCXAgPSAiOyBkb25lIjsKKwkJZ290byBkb2RvOworCWNhc2UgTkRFRlVOOgorCQljbWRwdXRzKG4tPm5hcmcudGV4dCk7CisJCXAgPSAiKCkgeyAuLi4gfSI7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5DTUQ6CisJCWNtZGxpc3Qobi0+bmNtZC5hcmdzLCAxKTsKKwkJY21kbGlzdChuLT5uY21kLnJlZGlyZWN0LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBOQVJHOgorCQlwID0gbi0+bmFyZy50ZXh0OworZG90YWlsMjoKKwkJY21kcHV0cyhwKTsKKwkJYnJlYWs7CisJY2FzZSBOSEVSRToKKwljYXNlIE5YSEVSRToKKwkJcCA9ICI8PC4uLiI7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5DQVNFOgorCQljbWRwdXRzKCJjYXNlICIpOworCQljbWRwdXRzKG4tPm5jYXNlLmV4cHItPm5hcmcudGV4dCk7CisJCWNtZHB1dHMoIiBpbiAiKTsKKwkJZm9yIChucCA9IG4tPm5jYXNlLmNhc2VzOyBucDsgbnAgPSBucC0+bmNsaXN0Lm5leHQpIHsKKwkJCWNtZHR4dChucC0+bmNsaXN0LnBhdHRlcm4pOworCQkJY21kcHV0cygiKSAiKTsKKwkJCWNtZHR4dChucC0+bmNsaXN0LmJvZHkpOworCQkJY21kcHV0cygiOzsgIik7CisJCX0KKwkJcCA9ICJlc2FjIjsKKwkJZ290byBkb3RhaWwyOworCWNhc2UgTlRPOgorCQlwID0gIj4iOworCQlnb3RvIHJlZGlyOworCWNhc2UgTkNMT0JCRVI6CisJCXAgPSAiPnwiOworCQlnb3RvIHJlZGlyOworCWNhc2UgTkFQUEVORDoKKwkJcCA9ICI+PiI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBOVE9GRDoKKwkJcCA9ICI+JiI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBORlJPTToKKwkJcCA9ICI8IjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5GUk9NRkQ6CisJCXAgPSAiPCYiOworCQlnb3RvIHJlZGlyOworCWNhc2UgTkZST01UTzoKKwkJcCA9ICI8PiI7CityZWRpcjoKKwkJc1swXSA9IG4tPm5maWxlLmZkICsgJzAnOworCQlzWzFdID0gJ1wwJzsKKwkJY21kcHV0cyhzKTsKKwkJY21kcHV0cyhwKTsKKwkJaWYgKG4tPnR5cGUgPT0gTlRPRkQgfHwgbi0+dHlwZSA9PSBORlJPTUZEKSB7CisJCQlzWzBdID0gbi0+bmR1cC5kdXBmZCArICcwJzsKKwkJCXAgPSBzOworCQkJZ290byBkb3RhaWwyOworCQl9IGVsc2UgeworCQkJbiA9IG4tPm5maWxlLmZuYW1lOworCQkJZ290byBkb25vZGU7CisJCX0KKwl9Cit9CisKK1NUQVRJQyB2b2lkCitjbWRsaXN0KHVuaW9uIG5vZGUgKm5wLCBpbnQgc2VwKQoreworCWZvciAoOyBucDsgbnAgPSBucC0+bmFyZy5uZXh0KSB7CisJCWlmICghc2VwKQorCQkJY21kcHV0cyhzcGNzdHIpOworCQljbWR0eHQobnApOworCQlpZiAoc2VwICYmIG5wLT5uYXJnLm5leHQpCisJCQljbWRwdXRzKHNwY3N0cik7CisJfQorfQorCisKK1NUQVRJQyB2b2lkCitjbWRwdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqcCwgKnN0cjsKKwljaGFyIGNjWzJdID0gIiAiOworCWNoYXIgKm5leHRjOworCXNpZ25lZCBjaGFyIGM7CisJaW50IHN1YnR5cGUgPSAwOworCWludCBxdW90ZWQgPSAwOworCXN0YXRpYyBjb25zdCBjaGFyIHZzdHlwZVtWU1RZUEUgKyAxXVs0XSA9IHsKKwkJIiIsICJ9IiwgIi0iLCAiKyIsICI/IiwgIj0iLAorCQkiJSIsICIlJSIsICIjIiwgIiMjIiwKKwl9OworCisJbmV4dGMgPSBtYWtlc3Ryc3BhY2UoKHN0cmxlbihzKSArIDEpICogOCwgY21kbmV4dGMpOworCXAgPSBzOworCXdoaWxlICgoYyA9ICpwKyspICE9IDApIHsKKwkJc3RyID0gMDsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgQ1RMRVNDOgorCQkJYyA9ICpwKys7CisJCQlicmVhazsKKwkJY2FzZSBDVExWQVI6CisJCQlzdWJ0eXBlID0gKnArKzsKKwkJCWlmICgoc3VidHlwZSAmIFZTVFlQRSkgPT0gVlNMRU5HVEgpCisJCQkJc3RyID0gIiR7IyI7CisJCQllbHNlCisJCQkJc3RyID0gIiR7IjsKKwkJCWlmICghKHN1YnR5cGUgJiBWU1FVT1RFKSAhPSAhKHF1b3RlZCAmIDEpKSB7CisJCQkJcXVvdGVkIF49IDE7CisJCQkJYyA9ICciJzsKKwkJCX0gZWxzZQorCQkJCWdvdG8gZG9zdHI7CisJCQlicmVhazsKKwkJY2FzZSBDVExFTkRWQVI6CisJCQlzdHIgPSAiXCJ9IiArICEocXVvdGVkICYgMSk7CisJCQlxdW90ZWQgPj49IDE7CisJCQlzdWJ0eXBlID0gMDsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMQkFDS1E6CisJCQlzdHIgPSAiJCguLi4pIjsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMQkFDS1ErQ1RMUVVPVEU6CisJCQlzdHIgPSAiXCIkKC4uLilcIiI7CisJCQlnb3RvIGRvc3RyOworCQljYXNlIENUTEFSSToKKwkJCXN0ciA9ICIkKCgiOworCQkJZ290byBkb3N0cjsKKwkJY2FzZSBDVExFTkRBUkk6CisJCQlzdHIgPSAiKSkiOworCQkJZ290byBkb3N0cjsKKwkJY2FzZSBDVExRVU9URU1BUks6CisJCQlxdW90ZWQgXj0gMTsKKwkJCWMgPSAnIic7CisJCQlicmVhazsKKwkJY2FzZSAnPSc6CisJCQlpZiAoc3VidHlwZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKChzdWJ0eXBlICYgVlNUWVBFKSAhPSBWU05PUk1BTCkKKwkJCQlxdW90ZWQgPDw9IDE7CisJCQlzdHIgPSB2c3R5cGVbc3VidHlwZSAmIFZTVFlQRV07CisJCQlpZiAoc3VidHlwZSAmIFZTTlVMKQorCQkJCWMgPSAnOic7CisJCQllbHNlCisJCQkJZ290byBjaGVja3N0cjsKKwkJCWJyZWFrOworCQljYXNlICdcJyc6CisJCWNhc2UgJ1xcJzoKKwkJY2FzZSAnIic6CisJCWNhc2UgJyQnOgorCQkJLyogVGhlc2UgY2FuIG9ubHkgaGFwcGVuIGluc2lkZSBxdW90ZXMgKi8KKwkJCWNjWzBdID0gYzsKKwkJCXN0ciA9IGNjOworCQkJYyA9ICdcXCc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCVVTVFBVVEMoYywgbmV4dGMpOworY2hlY2tzdHI6CisJCWlmICghc3RyKQorCQkJY29udGludWU7Citkb3N0cjoKKwkJd2hpbGUgKChjID0gKnN0cisrKSkgeworCQkJVVNUUFVUQyhjLCBuZXh0Yyk7CisJCX0KKwl9CisJaWYgKHF1b3RlZCAmIDEpIHsKKwkJVVNUUFVUQygnIicsIG5leHRjKTsKKwl9CisJKm5leHRjID0gMDsKKwljbWRuZXh0YyA9IG5leHRjOworfQorCisKK1NUQVRJQyB2b2lkCitzaG93cGlwZShzdHJ1Y3Qgam9iICpqcCwgc3RydWN0IG91dHB1dCAqb3V0KQoreworCXN0cnVjdCBwcm9jc3RhdCAqc3A7CisJc3RydWN0IHByb2NzdGF0ICpzcGVuZDsKKworCXNwZW5kID0ganAtPnBzICsganAtPm5wcm9jczsKKwlmb3IgKHNwID0ganAtPnBzICsgMTsgc3AgPCBzcGVuZDsgc3ArKykKKwkJb3V0Zm10KG91dCwgIiB8ICVzIiwgc3AtPmNtZCk7CisJb3V0Y3Nsb3coJ1xuJywgb3V0KTsKKwlmbHVzaGFsbCgpOworfQorCisKKyNpZiBKT0JTCitTVEFUSUMgdm9pZAoreHRjc2V0cGdycChpbnQgZmQsIHBpZF90IHBncnApCit7CisJaWYgKHRjc2V0cGdycChmZCwgcGdycCkpCisJCXNoX2Vycm9yKCJDYW5ub3Qgc2V0IHR0eSBwcm9jZXNzIGdyb3VwICglcykiLCBzdHJlcnJvcihlcnJubykpOworfQorI2VuZGlmCisKKworU1RBVElDIGludAorZ2V0c3RhdHVzKHN0cnVjdCBqb2IgKmpvYikgeworCWludCBzdGF0dXM7CisJaW50IHJldHZhbDsKKworCXN0YXR1cyA9IGpvYi0+cHNbam9iLT5ucHJvY3MgLSAxXS5zdGF0dXM7CisJcmV0dmFsID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKSB7CisjaWYgSk9CUworCQlyZXR2YWwgPSBXU1RPUFNJRyhzdGF0dXMpOworCQlpZiAoIVdJRlNUT1BQRUQoc3RhdHVzKSkKKyNlbmRpZgorCQl7CisJCQkvKiBYWFg6IGxpbWl0cyBudW1iZXIgb2Ygc2lnbmFscyAqLworCQkJcmV0dmFsID0gV1RFUk1TSUcoc3RhdHVzKTsKKyNpZiBKT0JTCisJCQlpZiAocmV0dmFsID09IFNJR0lOVCkKKwkJCQlqb2ItPnNpZ2ludCA9IDE7CisjZW5kaWYKKwkJfQorCQlyZXR2YWwgKz0gMTI4OworCX0KKwlUUkFDRSgoImdldHN0YXR1czogam9iICVkLCBucHJvYyAlZCwgc3RhdHVzICV4LCByZXR2YWwgJXhcbiIsCisJCWpvYm5vKGpvYiksIGpvYi0+bnByb2NzLCBzdGF0dXMsIHJldHZhbCkpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9qb2JzLmggYi91c3IvZGFzaC9qb2JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlNDIxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL2pvYnMuaApAQCAtMCwwICsxLDEwOSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylqb2JzLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBNb2RlIGFyZ3VtZW50IHRvIGZvcmtzaGVsbC4gIERvbid0IGNoYW5nZSBGT1JLX0ZHIG9yIEZPUktfQkcuICovCisjZGVmaW5lIEZPUktfRkcgMAorI2RlZmluZSBGT1JLX0JHIDEKKyNkZWZpbmUgRk9SS19OT0pPQiAyCisKKy8qIG1vZGUgZmxhZ3MgZm9yIHNob3dqb2IocykgKi8KKyNkZWZpbmUJU0hPV19QR0lECTB4MDEJLyogb25seSBzaG93IHBnaWQgLSBmb3Igam9icyAtcCAqLworI2RlZmluZQlTSE9XX1BJRAkweDA0CS8qIGluY2x1ZGUgcHJvY2VzcyBwaWQgKi8KKyNkZWZpbmUJU0hPV19DSEFOR0VECTB4MDgJLyogb25seSBqb2JzIHdob3NlIHN0YXRlIGhhcyBjaGFuZ2VkICovCisKKworLyoKKyAqIEEgam9iIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGpvYi4gIEEgam9iIGlzIGVpdGhlciBhCisgKiBzaW5nbGUgcHJvY2VzcyBvciBhIHNldCBvZiBwcm9jZXNzZXMgY29udGFpbmVkIGluIGEgcGlwZWxpbmUuICBJbiB0aGUKKyAqIGxhdHRlciBjYXNlLCBwaWRsaXN0IHdpbGwgYmUgbm9uLU5VTEwsIGFuZCB3aWxsIHBvaW50IHRvIGEgLTEgdGVybWluYXRlZAorICogYXJyYXkgb2YgcGlkcy4KKyAqLworCitzdHJ1Y3QgcHJvY3N0YXQgeworCXBpZF90CXBpZDsJCS8qIHByb2Nlc3MgaWQgKi8KKyAJaW50CXN0YXR1czsJCS8qIGxhc3QgcHJvY2VzcyBzdGF0dXMgZnJvbSB3YWl0KCkgKi8KKyAJY2hhcgkqY21kOwkJLyogdGV4dCBvZiBjb21tYW5kIGJlaW5nIHJ1biAqLworfTsKKworc3RydWN0IGpvYiB7CisJc3RydWN0IHByb2NzdGF0IHBzMDsJLyogc3RhdHVzIG9mIHByb2Nlc3MgKi8KKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzOwkvKiBzdGF0dXMgb3IgcHJvY2Vzc2VzIHdoZW4gbW9yZSB0aGFuIG9uZSAqLworI2lmIEpPQlMKKwlpbnQgc3RvcHN0YXR1czsJCS8qIHN0YXR1cyBvZiBhIHN0b3BwZWQgam9iICovCisjZW5kaWYKKwl1aW50MzJfdAorCQlucHJvY3M6IDE2LAkvKiBudW1iZXIgb2YgcHJvY2Vzc2VzICovCisJCXN0YXRlOiA4LAorI2RlZmluZQlKT0JSVU5OSU5HCTAJLyogYXQgbGVhc3Qgb25lIHByb2MgcnVubmluZyAqLworI2RlZmluZQlKT0JTVE9QUEVECTEJLyogYWxsIHByb2NzIGFyZSBzdG9wcGVkICovCisjZGVmaW5lCUpPQkRPTkUJCTIJLyogYWxsIHByb2NzIGFyZSBjb21wbGV0ZWQgKi8KKyNpZiBKT0JTCisJCXNpZ2ludDogMSwJLyogam9iIHdhcyBraWxsZWQgYnkgU0lHSU5UICovCisJCWpvYmN0bDogMSwJLyogam9iIHJ1bm5pbmcgdW5kZXIgam9iIGNvbnRyb2wgKi8KKyNlbmRpZgorCQl3YWl0ZWQ6IDEsCS8qIHRydWUgaWYgdGhpcyBlbnRyeSBoYXMgYmVlbiB3YWl0ZWQgZm9yICovCisJCXVzZWQ6IDEsCS8qIHRydWUgaWYgdGhpcyBlbnRyeSBpcyBpbiB1c2VkICovCisJCWNoYW5nZWQ6IDE7CS8qIHRydWUgaWYgc3RhdHVzIGhhcyBjaGFuZ2VkICovCisJc3RydWN0IGpvYiAqcHJldl9qb2I7CS8qIHByZXZpb3VzIGpvYiAqLworfTsKKworZXh0ZXJuIHBpZF90IGJhY2tnbmRwaWQ7CS8qIHBpZCBvZiBsYXN0IGJhY2tncm91bmQgcHJvY2VzcyAqLworZXh0ZXJuIGludCBqb2Jfd2FybmluZzsJCS8qIHVzZXIgd2FzIHdhcm5lZCBhYm91dCBzdG9wcGVkIGpvYnMgKi8KKyNpZiBKT0JTCitleHRlcm4gaW50IGpvYmN0bDsJCS8qIHRydWUgaWYgZG9pbmcgam9iIGNvbnRyb2wgKi8KKyNlbHNlCisjZGVmaW5lIGpvYmN0bCAwCisjZW5kaWYKKwordm9pZCBzZXRqb2JjdGwoaW50KTsKK2ludCBraWxsY21kKGludCwgY2hhciAqKik7CitpbnQgZmdjbWQoaW50LCBjaGFyICoqKTsKK2ludCBiZ2NtZChpbnQsIGNoYXIgKiopOworaW50IGpvYnNjbWQoaW50LCBjaGFyICoqKTsKK3N0cnVjdCBvdXRwdXQ7Cit2b2lkIHNob3dqb2JzKHN0cnVjdCBvdXRwdXQgKiwgaW50KTsKK2ludCB3YWl0Y21kKGludCwgY2hhciAqKik7CitzdHJ1Y3Qgam9iICptYWtlam9iKHVuaW9uIG5vZGUgKiwgaW50KTsKK2ludCBmb3Jrc2hlbGwoc3RydWN0IGpvYiAqLCB1bmlvbiBub2RlICosIGludCk7CitpbnQgd2FpdGZvcmpvYihzdHJ1Y3Qgam9iICopOworaW50IHN0b3BwZWRqb2JzKHZvaWQpOworCisjaWYgISBKT0JTCisjZGVmaW5lIHNldGpvYmN0bChvbikJLyogZG8gbm90aGluZyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvZGFzaC9tYWNoZGVwLmggYi91c3IvZGFzaC9tYWNoZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjYTA3YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21hY2hkZXAuaApAQCAtMCwwICsxLDUzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW1hY2hkZXAuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qCisgKiBNb3N0IG1hY2hpbmVzIHJlcXVpcmUgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gbWFsbG9jIHRvIGJlIGFsaWduZWQKKyAqIGluIHNvbWUgd2F5LiAgVGhlIGZvbGxvd2luZyBtYWNybyB3aWxsIGdldCB0aGlzIHJpZ2h0IG9uIG1hbnkgbWFjaGluZXMuCisgKi8KKyNpZmRlZiBIQVZFX1NUUlRPRAorIyBkZWZpbmUgU0hFTExfU0laRSAoc2l6ZW9mKHVuaW9uIHtpbnQgaTsgY2hhciAqY3A7IGRvdWJsZSBkOyB9KSAtIDEpCisjZWxzZQorIyBkZWZpbmUgU0hFTExfU0laRSAoc2l6ZW9mKHVuaW9uIHtpbnQgaTsgY2hhciAqY3A7fSkgLSAxKQorI2VuZGlmCisKKy8qCisgKiBJdCBhcHBlYXJzIHRoYXQgZ3JhYnN0YWNrc3RyKCkgd2lsbCBiYXJmIHdpdGggc3VjaCBhbGlnbm1lbnRzCisgKiBiZWNhdXNlIHN0YWxsb2MoKSB3aWxsIHJldHVybiBhIHN0cmluZyBhbGxvY2F0ZWQgaW4gYSBuZXcgc3RhY2tibG9jay4KKyAqLworI2RlZmluZSBTSEVMTF9BTElHTihuYnl0ZXMpICgoKG5ieXRlcykgKyBTSEVMTF9TSVpFKSAmIH5TSEVMTF9TSVpFKQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWFpbC5jIGIvdXNyL2Rhc2gvbWFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTA3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9tYWlsLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogUm91dGluZXMgdG8gY2hlY2sgZm9yIG1haWwuICAoUGVyaGFwcyBtYWtlIHBhcnQgb2YgbWFpbi5jPykKKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAiZXhlYy5oIgkvKiBkZWZpbmVzIHBhZHZhbmNlKCkgKi8KKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAibWFpbC5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisKKworI2RlZmluZSBNQVhNQk9YRVMgMTAKKworLyogdGltZXMgb2YgbWFpbGJveGVzICovCitzdGF0aWMgdGltZV90IG1haWx0aW1lW01BWE1CT1hFU107CisvKiBTZXQgaWYgTUFJTCBvciBNQUlMUEFUSCBpcyBjaGFuZ2VkLiAqLworc3RhdGljIGludCBjaGFuZ2VkOworCisKKworLyoKKyAqIFByaW50IGFwcHJvcHJpYXRlIG1lc3NhZ2UocykgaWYgbWFpbCBoYXMgYXJyaXZlZC4gIElmIGNoYW5nZWQgaXMgc2V0LAorICogdGhlbiB0aGUgdmFsdWUgb2YgTUFJTCBoYXMgY2hhbmdlZCwgc28gd2UganVzdCB1cGRhdGUgdGhlIHZhbHVlcy4KKyAqLworCit2b2lkCitjaGttYWlsKHZvaWQpCit7CisJY29uc3QgY2hhciAqbXBhdGg7CisJY2hhciAqcDsKKwljaGFyICpxOworCXRpbWVfdCAqbXRwOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJc3RydWN0IHN0YXQ2NCBzdGF0YjsKKworCXNldHN0YWNrbWFyaygmc21hcmspOworCW1wYXRoID0gbXBhdGhzZXQoKSA/IG1wYXRodmFsKCkgOiBtYWlsdmFsKCk7CisJZm9yIChtdHAgPSBtYWlsdGltZTsgbXRwIDwgbWFpbHRpbWUgKyBNQVhNQk9YRVM7IG10cCsrKSB7CisJCXAgPSBwYWR2YW5jZSgmbXBhdGgsIG51bGxzdHIpOworCQlpZiAocCA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWZvciAocSA9IHAgOyAqcSA7IHErKyk7CisjaWZkZWYgREVCVUcKKwkJaWYgKHFbLTFdICE9ICcvJykKKwkJCWFib3J0KCk7CisjZW5kaWYKKwkJcVstMV0gPSAnXDAnOwkJCS8qIGRlbGV0ZSB0cmFpbGluZyAnLycgKi8KKwkJaWYgKHN0YXQ2NChwLCAmc3RhdGIpIDwgMCkgeworCQkJKm10cCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWNoYW5nZWQgJiYgc3RhdGIuc3RfbXRpbWUgIT0gKm10cCkgeworCQkJb3V0Zm10KAorCQkJCSZlcnJvdXQsIHNubGZtdCwKKwkJCQlwYXRob3B0ID8gcGF0aG9wdCA6ICJ5b3UgaGF2ZSBtYWlsIgorCQkJKTsKKwkJfQorCQkqbXRwID0gc3RhdGIuc3RfbXRpbWU7CisJfQorCWNoYW5nZWQgPSAwOworCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCisKK3ZvaWQKK2NoYW5nZW1haWwoY29uc3QgY2hhciAqdmFsKQoreworCWNoYW5nZWQrKzsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21haWwuaCBiL3Vzci9kYXNoL21haWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzZiMjFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWFpbC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpbWFpbC5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKK3ZvaWQgY2hrbWFpbCh2b2lkKTsKK3ZvaWQgY2hhbmdlbWFpbChjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWFpbi5jIGIvdXNyL2Rhc2gvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjFlNGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9tYWluLmMKQEAgLTAsMCArMSwzNDkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIm1haWwuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAibm9kZXMuaCIKKyNpbmNsdWRlICJleHBhbmQuaCIKKyNpbmNsdWRlICJldmFsLmgiCisjaW5jbHVkZSAiam9icy5oIgorI2luY2x1ZGUgImlucHV0LmgiCisjaW5jbHVkZSAidHJhcC5oIgorI2luY2x1ZGUgInZhci5oIgorI2luY2x1ZGUgInNob3cuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAiZXhlYy5oIgorI2luY2x1ZGUgImNkLmgiCisKKyNpZmRlZiBIRVRJTworI2luY2x1ZGUgImhldGlvLmgiCisjZW5kaWYKKworI2RlZmluZSBQUk9GSUxFIDAKKworaW50IHJvb3RwaWQ7CitpbnQgc2hsdmw7CisjaWZkZWYgX19HTElCQ19fCitpbnQgKmRhc2hfZXJybm87CisjZW5kaWYKKyNpZiBQUk9GSUxFCitzaG9ydCBwcm9maWxlX2J1ZlsxNjM4NF07CitleHRlcm4gaW50IGV0ZXh0KCk7CisjZW5kaWYKKworU1RBVElDIHZvaWQgcmVhZF9wcm9maWxlKGNvbnN0IGNoYXIgKik7CitTVEFUSUMgY2hhciAqZmluZF9kb3RfZmlsZShjaGFyICopOworc3RhdGljIGludCBjbWRsb29wKGludCk7CitpbnQgbWFpbihpbnQsIGNoYXIgKiopOworCisvKgorICogTWFpbiByb3V0aW5lLiAgV2UgaW5pdGlhbGl6ZSB0aGluZ3MsIHBhcnNlIHRoZSBhcmd1bWVudHMsIGV4ZWN1dGUKKyAqIHByb2ZpbGVzIGlmIHdlJ3JlIGEgbG9naW4gc2hlbGwsIGFuZCB0aGVuIGNhbGwgY21kbG9vcCB0byBleGVjdXRlCisgKiBjb21tYW5kcy4gIFRoZSBzZXRqbXAgY2FsbCBzZXRzIHVwIHRoZSBsb2NhdGlvbiB0byBqdW1wIHRvIHdoZW4gYW4KKyAqIGV4Y2VwdGlvbiBvY2N1cnMuICBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgdGhlIHZhcmlhYmxlICJzdGF0ZSIKKyAqIGlzIHVzZWQgdG8gZmlndXJlIG91dCBob3cgZmFyIHdlIGhhZCBnb3R0ZW4uCisgKi8KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpzaGluaXQ7CisJdm9sYXRpbGUgaW50IHN0YXRlOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKyNpZmRlZiBfX0dMSUJDX18KKwlkYXNoX2Vycm5vID0gX19lcnJub19sb2NhdGlvbigpOworI2VuZGlmCisKKyNpZiBQUk9GSUxFCisJbW9uaXRvcig0LCBldGV4dCwgcHJvZmlsZV9idWYsIHNpemVvZiBwcm9maWxlX2J1ZiwgNTApOworI2VuZGlmCisJc3RhdGUgPSAwOworCWlmICh1bmxpa2VseShzZXRqbXAoam1wbG9jLmxvYykpKSB7CisJCWludCBlOworCQlpbnQgczsKKworCQlyZXNldCgpOworCisJCWUgPSBleGNlcHRpb247CisJCWlmIChlID09IEVYRVJST1IpCisJCQlleGl0c3RhdHVzID0gMjsKKworCQlzID0gc3RhdGU7CisJCWlmIChlID09IEVYRVhJVCB8fCBzID09IDAgfHwgaWZsYWcgPT0gMCB8fCBzaGx2bCkKKwkJCWV4aXRzaGVsbCgpOworCisJCWlmIChlID09IEVYSU5UCisjaWYgQVRUWQorCQkgJiYgKCEgYXR0eXNldCgpIHx8IGVxdWFsKHRlcm12YWwoKSwgImVtYWNzIikpCisjZW5kaWYKKwkJICkgeworCQkJb3V0MmMoJ1xuJyk7CisjaWZkZWYgRkxVU0hFUlIKKwkJCWZsdXNob3V0KG91dDIpOworI2VuZGlmCisJCX0KKwkJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisJCUZPUkNFSU5UT047CQkJCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCWlmIChzID09IDEpCisJCQlnb3RvIHN0YXRlMTsKKwkJZWxzZSBpZiAocyA9PSAyKQorCQkJZ290byBzdGF0ZTI7CisJCWVsc2UgaWYgKHMgPT0gMykKKwkJCWdvdG8gc3RhdGUzOworCQllbHNlCisJCQlnb3RvIHN0YXRlNDsKKwl9CisJaGFuZGxlciA9ICZqbXBsb2M7CisjaWZkZWYgREVCVUcKKwlvcGVudHJhY2UoKTsKKwl0cnB1dHMoIlNoZWxsIGFyZ3M6ICAiKTsgIHRyYXJncyhhcmd2KTsKKyNlbmRpZgorCXJvb3RwaWQgPSBnZXRwaWQoKTsKKwlpbml0KCk7CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJcHJvY2FyZ3MoYXJnYywgYXJndik7CisJaWYgKGFyZ3ZbMF0gJiYgYXJndlswXVswXSA9PSAnLScpIHsKKwkJc3RhdGUgPSAxOworCQlyZWFkX3Byb2ZpbGUoIi9ldGMvcHJvZmlsZSIpOworc3RhdGUxOgorCQlzdGF0ZSA9IDI7CisJCXJlYWRfcHJvZmlsZSgiLnByb2ZpbGUiKTsKKwl9CitzdGF0ZTI6CisJc3RhdGUgPSAzOworCWlmICgKKyNpZm5kZWYgbGludXgKKwkJZ2V0dWlkKCkgPT0gZ2V0ZXVpZCgpICYmIGdldGdpZCgpID09IGdldGVnaWQoKSAmJgorI2VuZGlmCisJCWlmbGFnCisJKSB7CisJCWlmICgoc2hpbml0ID0gbG9va3VwdmFyKCJFTlYiKSkgIT0gTlVMTCAmJiAqc2hpbml0ICE9ICdcMCcpIHsKKwkJCXJlYWRfcHJvZmlsZShzaGluaXQpOworCQl9CisJfQorc3RhdGUzOgorCXN0YXRlID0gNDsKKwlpZiAobWludXNjKQorCQlldmFsc3RyaW5nKG1pbnVzYywgMCk7CisKKwlpZiAoc2ZsYWcgfHwgbWludXNjID09IE5VTEwpIHsKK3N0YXRlNDoJLyogWFhYID8/PyAtIHdoeSBpc24ndCB0aGlzIGJlZm9yZSB0aGUgImlmIiBzdGF0ZW1lbnQgKi8KKwkJY21kbG9vcCgxKTsKKwl9CisjaWYgUFJPRklMRQorCW1vbml0b3IoMCk7CisjZW5kaWYKKyNpZiBHUFJPRgorCXsKKwkJZXh0ZXJuIHZvaWQgX21jbGVhbnVwKHZvaWQpOworCQlfbWNsZWFudXAoKTsKKwl9CisjZW5kaWYKKwlleGl0c2hlbGwoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworLyoKKyAqIFJlYWQgYW5kIGV4ZWN1dGUgY29tbWFuZHMuICAiVG9wIiBpcyBub256ZXJvIGZvciB0aGUgdG9wIGxldmVsIGNvbW1hbmQKKyAqIGxvb3A7IGl0IHR1cm5zIG9uIHByb21wdGluZyBpZiB0aGUgc2hlbGwgaXMgaW50ZXJhY3RpdmUuCisgKi8KKworc3RhdGljIGludAorY21kbG9vcChpbnQgdG9wKQoreworCXVuaW9uIG5vZGUgKm47CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlpbnQgaW50ZXI7CisJaW50IG51bWVvZiA9IDA7CisKKwlUUkFDRSgoImNtZGxvb3AoJWQpIGNhbGxlZFxuIiwgdG9wKSk7CisjaWZkZWYgSEVUSU8KKwlpZihpZmxhZyAmJiB0b3ApCisJCWhldGlvX2luaXQoKTsKKyNlbmRpZgorCWZvciAoOzspIHsKKwkJaW50IHNraXA7CisKKwkJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJCWlmIChqb2JjdGwpCisJCQlzaG93am9icyhvdXQyLCBTSE9XX0NIQU5HRUQpOworCQlpbnRlciA9IDA7CisJCWlmIChpZmxhZyAmJiB0b3ApIHsKKwkJCWludGVyKys7CisJCQljaGttYWlsKCk7CisJCX0KKwkJbiA9IHBhcnNlY21kKGludGVyKTsKKwkJLyogc2hvd3RyZWUobik7IERFQlVHICovCisJCWlmIChuID09IE5FT0YpIHsKKwkJCWlmICghdG9wIHx8IG51bWVvZiA+PSA1MCkKKwkJCQlicmVhazsKKwkJCWlmICghc3RvcHBlZGpvYnMoKSkgeworCQkJCWlmICghSWZsYWcpCisJCQkJCWJyZWFrOworCQkJCW91dDJzdHIoIlxuVXNlIFwiZXhpdFwiIHRvIGxlYXZlIHNoZWxsLlxuIik7CisJCQl9CisJCQludW1lb2YrKzsKKwkJfSBlbHNlIGlmIChuZmxhZyA9PSAwKSB7CisJCQlqb2Jfd2FybmluZyA9IChqb2Jfd2FybmluZyA9PSAyKSA/IDEgOiAwOworCQkJbnVtZW9mID0gMDsKKwkJCWV2YWx0cmVlKG4sIDApOworCQl9CisJCXBvcHN0YWNrbWFyaygmc21hcmspOworCisJCXNraXAgPSBldmFsc2tpcDsKKwkJaWYgKHNraXApIHsKKwkJCWV2YWxza2lwID0gMDsKKwkJCXJldHVybiBza2lwICYgU0tJUEVWQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBSZWFkIC9ldGMvcHJvZmlsZSBvciAucHJvZmlsZS4gIFJldHVybiBvbiBlcnJvci4KKyAqLworCitTVEFUSUMgdm9pZAorcmVhZF9wcm9maWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHNraXA7CisKKwlpZiAoc2V0aW5wdXRmaWxlKG5hbWUsIElOUFVUX1BVU0hfRklMRSB8IElOUFVUX05PRklMRV9PSykgPCAwKQorCQlyZXR1cm47CisKKwlza2lwID0gY21kbG9vcCgwKTsKKwlwb3BmaWxlKCk7CisKKwlpZiAoc2tpcCkKKwkJZXhpdHNoZWxsKCk7Cit9CisKKworCisvKgorICogUmVhZCBhIGZpbGUgY29udGFpbmluZyBzaGVsbCBmdW5jdGlvbnMuCisgKi8KKwordm9pZAorcmVhZGNtZGZpbGUoY2hhciAqbmFtZSkKK3sKKwlzZXRpbnB1dGZpbGUobmFtZSwgSU5QVVRfUFVTSF9GSUxFKTsKKwljbWRsb29wKDApOworCXBvcGZpbGUoKTsKK30KKworCisKKy8qCisgKiBUYWtlIGNvbW1hbmRzIGZyb20gYSBmaWxlLiAgVG8gYmUgY29tcGF0aWJsZSB3ZSBzaG91bGQgZG8gYSBwYXRoCisgKiBzZWFyY2ggZm9yIHRoZSBmaWxlLCB3aGljaCBpcyBuZWNlc3NhcnkgdG8gZmluZCBzdWItY29tbWFuZHMuCisgKi8KKworCitTVEFUSUMgY2hhciAqCitmaW5kX2RvdF9maWxlKGNoYXIgKmJhc2VuYW1lKQoreworCWNoYXIgKmZ1bGxuYW1lOworCWNvbnN0IGNoYXIgKnBhdGggPSBwYXRodmFsKCk7CisJc3RydWN0IHN0YXQgc3RhdGI7CisKKwkvKiBkb24ndCB0cnkgdGhpcyBmb3IgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgKi8KKwlpZiAoc3RyY2hyKGJhc2VuYW1lLCAnLycpKQorCQlyZXR1cm4gYmFzZW5hbWU7CisKKwl3aGlsZSAoKGZ1bGxuYW1lID0gcGFkdmFuY2UoJnBhdGgsIGJhc2VuYW1lKSkgIT0gTlVMTCkgeworCQlpZiAoKHN0YXQoZnVsbG5hbWUsICZzdGF0YikgPT0gMCkgJiYgU19JU1JFRyhzdGF0Yi5zdF9tb2RlKSkgeworCQkJLyoKKwkJCSAqIERvbid0IGJvdGhlciBmcmVlaW5nIGhlcmUsIHNpbmNlIGl0IHdpbGwKKwkJCSAqIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisJCQkgKi8KKwkJCXJldHVybiBmdWxsbmFtZTsKKwkJfQorCQlzdHVuYWxsb2MoZnVsbG5hbWUpOworCX0KKworCS8qIG5vdCBmb3VuZCBpbiB0aGUgUEFUSCAqLworCXNoX2Vycm9yKCIlczogbm90IGZvdW5kIiwgYmFzZW5hbWUpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworaW50Citkb3RjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKGFyZ2MgPj0gMikgewkJLyogVGhhdCdzIHdoYXQgU1ZSMiBkb2VzICovCisJCWNoYXIgKmZ1bGxuYW1lOworCisJCWZ1bGxuYW1lID0gZmluZF9kb3RfZmlsZShhcmd2WzFdKTsKKwkJc2V0aW5wdXRmaWxlKGZ1bGxuYW1lLCBJTlBVVF9QVVNIX0ZJTEUpOworCQljb21tYW5kbmFtZSA9IGZ1bGxuYW1lOworCQljbWRsb29wKDApOworCQlwb3BmaWxlKCk7CisJCXN0YXR1cyA9IGV4aXRzdGF0dXM7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKworaW50CitleGl0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoc3RvcHBlZGpvYnMoKSkKKwkJcmV0dXJuIDA7CisJaWYgKGFyZ2MgPiAxKQorCQlleGl0c3RhdHVzID0gbnVtYmVyKGFyZ3ZbMV0pOworCWV4cmFpc2UoRVhFWElUKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9tYWluLmggYi91c3IvZGFzaC9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllNDk4MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21haW4uaApAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW1haW4uaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyogcGlkIG9mIG1haW4gc2hlbGwgKi8KK2V4dGVybiBpbnQgcm9vdHBpZDsKKy8qIHNoZWxsIGxldmVsOiAwIGZvciB0aGUgbWFpbiBzaGVsbCwgMSBmb3IgaXRzIGNoaWxkcmVuLCBhbmQgc28gb24gKi8KK2V4dGVybiBpbnQgc2hsdmw7CisjZGVmaW5lIHJvb3RzaGVsbCAoIXNobHZsKQorCisjaWZkZWYgX19HTElCQ19fCisvKiBnbGliYyBzdWNrcyAqLworZXh0ZXJuIGludCAqZGFzaF9lcnJubzsKKyN1bmRlZiBlcnJubworI2RlZmluZSBlcnJubyAoKmRhc2hfZXJybm8pCisjZW5kaWYKKwordm9pZCByZWFkY21kZmlsZShjaGFyICopOworaW50IGRvdGNtZChpbnQsIGNoYXIgKiopOworaW50IGV4aXRjbWQoaW50LCBjaGFyICoqKTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL21lbWFsbG9jLmMgYi91c3IvZGFzaC9tZW1hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWIzMjMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9tZW1hbGxvYy5jCkBAIC0wLDAgKzEsMzI5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAibWFjaGRlcC5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisKKy8qCisgKiBMaWtlIG1hbGxvYywgYnV0IHJldHVybnMgYW4gZXJyb3Igd2hlbiBvdXQgb2Ygc3BhY2UuCisgKi8KKworcG9pbnRlcgorY2ttYWxsb2Moc2l6ZV90IG5ieXRlcykKK3sKKwlwb2ludGVyIHA7CisKKwlwID0gbWFsbG9jKG5ieXRlcyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJc2hfZXJyb3IoIk91dCBvZiBzcGFjZSIpOworCXJldHVybiBwOworfQorCisKKy8qCisgKiBTYW1lIGZvciByZWFsbG9jLgorICovCisKK3BvaW50ZXIKK2NrcmVhbGxvYyhwb2ludGVyIHAsIHNpemVfdCBuYnl0ZXMpCit7CisJcCA9IHJlYWxsb2MocCwgbmJ5dGVzKTsKKwlpZiAocCA9PSBOVUxMKQorCQlzaF9lcnJvcigiT3V0IG9mIHNwYWNlIik7CisJcmV0dXJuIHA7Cit9CisKKworLyoKKyAqIE1ha2UgYSBjb3B5IG9mIGEgc3RyaW5nIGluIHNhZmUgc3RvcmFnZS4KKyAqLworCitjaGFyICoKK3NhdmVzdHIoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpwID0gc3RyZHVwKHMpOworCWlmICghcCkKKwkJc2hfZXJyb3IoIk91dCBvZiBzcGFjZSIpOworCXJldHVybiBwOworfQorCisKKy8qCisgKiBQYXJzZSB0cmVlcyBmb3IgY29tbWFuZHMgYXJlIGFsbG9jYXRlZCBpbiBsaWZvIG9yZGVyLCBzbyB3ZSB1c2UgYSBzdGFjaworICogdG8gbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50LCBhbmQgYWxzbyB0byBhdm9pZCBhbGwgc29ydHMgb2YgZXhjZXB0aW9uCisgKiBoYW5kbGluZyBjb2RlIHRvIGhhbmRsZSBpbnRlcnJ1cHRzIGluIHRoZSBtaWRkbGUgb2YgYSBwYXJzZS4KKyAqCisgKiBUaGUgc2l6ZSA1MDQgd2FzIGNob3NlbiBiZWNhdXNlIHRoZSBVbHRyaXggbWFsbG9jIGhhbmRsZXMgdGhhdCBzaXplCisgKiB3ZWxsLgorICovCisKKy8qIG1pbmltdW0gc2l6ZSBvZiBhIGJsb2NrICovCisjZGVmaW5lIE1JTlNJWkUgU0hFTExfQUxJR04oNTA0KQorCitzdHJ1Y3Qgc3RhY2tfYmxvY2sgeworCXN0cnVjdCBzdGFja19ibG9jayAqcHJldjsKKwljaGFyIHNwYWNlW01JTlNJWkVdOworfTsKKworc3RydWN0IHN0YWNrX2Jsb2NrIHN0YWNrYmFzZTsKK3N0cnVjdCBzdGFja19ibG9jayAqc3RhY2twID0gJnN0YWNrYmFzZTsKK3N0cnVjdCBzdGFja21hcmsgKm1hcmtwOworY2hhciAqc3RhY2tueHQgPSBzdGFja2Jhc2Uuc3BhY2U7CitzaXplX3Qgc3RhY2tubGVmdCA9IE1JTlNJWkU7CitjaGFyICpzc3RyZW5kID0gc3RhY2tiYXNlLnNwYWNlICsgTUlOU0laRTsKK2ludCBoZXJlZmQgPSAtMTsKKworcG9pbnRlcgorc3RhbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCWNoYXIgKnA7CisJc2l6ZV90IGFsaWduZWQ7CisKKwlhbGlnbmVkID0gU0hFTExfQUxJR04obmJ5dGVzKTsKKwlpZiAoYWxpZ25lZCA+IHN0YWNrbmxlZnQpIHsKKwkJc2l6ZV90IGxlbjsKKwkJc2l6ZV90IGJsb2Nrc2l6ZTsKKwkJc3RydWN0IHN0YWNrX2Jsb2NrICpzcDsKKworCQlibG9ja3NpemUgPSBhbGlnbmVkOworCQlpZiAoYmxvY2tzaXplIDwgTUlOU0laRSkKKwkJCWJsb2Nrc2l6ZSA9IE1JTlNJWkU7CisJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc3RhY2tfYmxvY2spIC0gTUlOU0laRSArIGJsb2Nrc2l6ZTsKKwkJaWYgKGxlbiA8IGJsb2Nrc2l6ZSkKKwkJCXNoX2Vycm9yKCJPdXQgb2Ygc3BhY2UiKTsKKwkJSU5UT0ZGOworCQlzcCA9IGNrbWFsbG9jKGxlbik7CisJCXNwLT5wcmV2ID0gc3RhY2twOworCQlzdGFja254dCA9IHNwLT5zcGFjZTsKKwkJc3RhY2tubGVmdCA9IGJsb2Nrc2l6ZTsKKwkJc3N0cmVuZCA9IHN0YWNrbnh0ICsgYmxvY2tzaXplOworCQlzdGFja3AgPSBzcDsKKwkJSU5UT047CisJfQorCXAgPSBzdGFja254dDsKKwlzdGFja254dCArPSBhbGlnbmVkOworCXN0YWNrbmxlZnQgLT0gYWxpZ25lZDsKKwlyZXR1cm4gcDsKK30KKworCit2b2lkCitzdHVuYWxsb2MocG9pbnRlciBwKQoreworI2lmZGVmIERFQlVHCisJaWYgKCFwIHx8IChzdGFja254dCA8IChjaGFyICopcCkgfHwgKChjaGFyICopcCA8IHN0YWNrcC0+c3BhY2UpKSB7CisJCXdyaXRlKDIsICJzdHVuYWxsb2NcbiIsIDEwKTsKKwkJYWJvcnQoKTsKKwl9CisjZW5kaWYKKwlzdGFja25sZWZ0ICs9IHN0YWNrbnh0IC0gKGNoYXIgKilwOworCXN0YWNrbnh0ID0gcDsKK30KKworCisKK3ZvaWQKK3NldHN0YWNrbWFyayhzdHJ1Y3Qgc3RhY2ttYXJrICptYXJrKQoreworCW1hcmstPnN0YWNrcCA9IHN0YWNrcDsKKwltYXJrLT5zdGFja254dCA9IHN0YWNrbnh0OworCW1hcmstPnN0YWNrbmxlZnQgPSBzdGFja25sZWZ0OworCW1hcmstPm1hcmtuZXh0ID0gbWFya3A7CisJbWFya3AgPSBtYXJrOworfQorCisKK3ZvaWQKK3BvcHN0YWNrbWFyayhzdHJ1Y3Qgc3RhY2ttYXJrICptYXJrKQoreworCXN0cnVjdCBzdGFja19ibG9jayAqc3A7CisKKwlJTlRPRkY7CisJbWFya3AgPSBtYXJrLT5tYXJrbmV4dDsKKwl3aGlsZSAoc3RhY2twICE9IG1hcmstPnN0YWNrcCkgeworCQlzcCA9IHN0YWNrcDsKKwkJc3RhY2twID0gc3AtPnByZXY7CisJCWNrZnJlZShzcCk7CisJfQorCXN0YWNrbnh0ID0gbWFyay0+c3RhY2tueHQ7CisJc3RhY2tubGVmdCA9IG1hcmstPnN0YWNrbmxlZnQ7CisJc3N0cmVuZCA9IG1hcmstPnN0YWNrbnh0ICsgbWFyay0+c3RhY2tubGVmdDsKKwlJTlRPTjsKK30KKworCisvKgorICogV2hlbiB0aGUgcGFyc2VyIHJlYWRzIGluIGEgc3RyaW5nLCBpdCB3YW50cyB0byBzdGljayB0aGUgc3RyaW5nIG9uIHRoZQorICogc3RhY2sgYW5kIG9ubHkgYWRqdXN0IHRoZSBzdGFjayBwb2ludGVyIHdoZW4gaXQga25vd3MgaG93IGJpZyB0aGUKKyAqIHN0cmluZyBpcy4gIFN0YWNrYmxvY2sgKGRlZmluZWQgaW4gc3RhY2suaCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBibG9jaworICogb2Ygc3BhY2Ugb24gdG9wIG9mIHRoZSBzdGFjayBhbmQgc3RhY2tibG9ja2xlbiByZXR1cm5zIHRoZSBsZW5ndGggb2YKKyAqIHRoaXMgYmxvY2suICBHcm93c3RhY2tibG9jayB3aWxsIGdyb3cgdGhpcyBzcGFjZSBieSBhdCBsZWFzdCBvbmUgYnl0ZSwKKyAqIHBvc3NpYmx5IG1vdmluZyBpdCAobGlrZSByZWFsbG9jKS4gIEdyYWJzdGFja2Jsb2NrIGFjdHVhbGx5IGFsbG9jYXRlcyB0aGUKKyAqIHBhcnQgb2YgdGhlIGJsb2NrIHRoYXQgaGFzIGJlZW4gdXNlZC4KKyAqLworCit2b2lkCitncm93c3RhY2tibG9jayh2b2lkKQoreworCXNpemVfdCBuZXdsZW47CisKKyAJbmV3bGVuID0gc3RhY2tubGVmdCAqIDI7CisJaWYgKG5ld2xlbiA8IHN0YWNrbmxlZnQpCisJCXNoX2Vycm9yKCJPdXQgb2Ygc3BhY2UiKTsKKwlpZiAobmV3bGVuIDwgMTI4KQorCQluZXdsZW4gKz0gMTI4OworCisJaWYgKHN0YWNrbnh0ID09IHN0YWNrcC0+c3BhY2UgJiYgc3RhY2twICE9ICZzdGFja2Jhc2UpIHsKKwkJc3RydWN0IHN0YWNrX2Jsb2NrICpvbGRzdGFja3A7CisJCXN0cnVjdCBzdGFja21hcmsgKnhtYXJrOworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnNwOworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnByZXZzdGFja3A7CisJCXNpemVfdCBncm9zc2xlbjsKKworCQlJTlRPRkY7CisJCW9sZHN0YWNrcCA9IHN0YWNrcDsKKwkJc3AgPSBzdGFja3A7CisJCXByZXZzdGFja3AgPSBzcC0+cHJldjsKKwkJZ3Jvc3NsZW4gPSBuZXdsZW4gKyBzaXplb2Yoc3RydWN0IHN0YWNrX2Jsb2NrKSAtIE1JTlNJWkU7CisJCXNwID0gY2tyZWFsbG9jKChwb2ludGVyKXNwLCBncm9zc2xlbik7CisJCXNwLT5wcmV2ID0gcHJldnN0YWNrcDsKKwkJc3RhY2twID0gc3A7CisJCXN0YWNrbnh0ID0gc3AtPnNwYWNlOworCQlzdGFja25sZWZ0ID0gbmV3bGVuOworCQlzc3RyZW5kID0gc3AtPnNwYWNlICsgbmV3bGVuOworCisJCS8qCisJCSAqIFN0YWNrIG1hcmtzIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgb2xkIGJsb2NrCisJCSAqIG11c3QgYmUgcmVsb2NhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXcgYmxvY2sKKwkJICovCisJCXhtYXJrID0gbWFya3A7CisJCXdoaWxlICh4bWFyayAhPSBOVUxMICYmIHhtYXJrLT5zdGFja3AgPT0gb2xkc3RhY2twKSB7CisJCQl4bWFyay0+c3RhY2twID0gc3RhY2twOworCQkJeG1hcmstPnN0YWNrbnh0ID0gc3RhY2tueHQ7CisJCQl4bWFyay0+c3RhY2tubGVmdCA9IHN0YWNrbmxlZnQ7CisJCQl4bWFyayA9IHhtYXJrLT5tYXJrbmV4dDsKKwkJfQorCQlJTlRPTjsKKwl9IGVsc2UgeworCQljaGFyICpvbGRzcGFjZSA9IHN0YWNrbnh0OworCQlpbnQgb2xkbGVuID0gc3RhY2tubGVmdDsKKwkJY2hhciAqcCA9IHN0YWxsb2MobmV3bGVuKTsKKworCQkvKiBmcmVlIHRoZSBzcGFjZSB3ZSBqdXN0IGFsbG9jYXRlZCAqLworCQlzdGFja254dCA9IG1lbWNweShwLCBvbGRzcGFjZSwgb2xkbGVuKTsKKwkJc3RhY2tubGVmdCArPSBuZXdsZW47CisJfQorfQorCit2b2lkCitncmFic3RhY2tibG9jayhzaXplX3QgbGVuKQoreworCWxlbiA9IFNIRUxMX0FMSUdOKGxlbik7CisJc3RhY2tueHQgKz0gbGVuOworCXN0YWNrbmxlZnQgLT0gbGVuOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgc29tZXdoYXQgZWFzaWVyIHRvIHVzZSB0aGFuIHRoZSBhYm92ZS4KKyAqIFRoZSB1c2VyIGRlY2xhcmVzIGEgdmFyaWFibGUgb2YgdHlwZSBTVEFDS1NUUiwgd2hpY2ggbWF5IGJlIGRlY2xhcmVkCisgKiB0byBiZSBhIHJlZ2lzdGVyLiAgVGhlIG1hY3JvIFNUQVJUU1RBQ0tTVFIgaW5pdGlhbGl6ZXMgdGhpbmdzLiAgVGhlbgorICogdGhlIHVzZXIgdXNlcyB0aGUgbWFjcm8gU1RQVVRDIHRvIGFkZCBjaGFyYWN0ZXJzIHRvIHRoZSBzdHJpbmcuICBJbgorICogZWZmZWN0LCBTVFBVVEMoYywgcCkgaXMgdGhlIHNhbWUgYXMgKnArKyA9IGMgZXhjZXB0IHRoYXQgdGhlIHN0YWNrIGlzCisgKiBncm93biBhcyBuZWNlc3NhcnkuICBXaGVuIHRoZSB1c2VyIGlzIGRvbmUsIHNoZSBjYW4ganVzdCBsZWF2ZSB0aGUKKyAqIHN0cmluZyB0aGVyZSBhbmQgcmVmZXIgdG8gaXQgdXNpbmcgc3RhY2tibG9jaygpLiAgT3Igc2hlIGNhbiBhbGxvY2F0ZQorICogdGhlIHNwYWNlIGZvciBpdCB1c2luZyBncmFic3RhY2tzdHIoKS4gIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBhbGxvdworICogc29tZW9uZSBlbHNlIHRvIHVzZSB0aGUgc3RhY2sgdGVtcG9yYXJpbHkgYW5kIHRoZW4gY29udGludWUgdG8gZ3JvdworICogdGhlIHN0cmluZywgdGhlIHVzZXIgc2hvdWxkIHVzZSBncmFic3RhY2sgdG8gYWxsb2NhdGUgdGhlIHNwYWNlLCBhbmQKKyAqIHRoZW4gY2FsbCB1bmdyYWJzdHIocCkgdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBtb2RlIG9mIG9wZXJhdGlvbi4KKyAqCisgKiBVU1RQVVRDIGlzIGxpa2UgU1RQVVRDIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgY2hlY2sgZm9yIG92ZXJmbG93LgorICogQ0hFQ0tTVEFDS1NQQUNFIGNhbiBiZSBjYWxsZWQgYmVmb3JlIFVTVFBVVEMgdG8gZW5zdXJlIHRoYXQgdGhlcmUKKyAqIGlzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLgorICovCisKK3ZvaWQgKgorZ3Jvd3N0YWNrc3RyKHZvaWQpCit7CisJc2l6ZV90IGxlbiA9IHN0YWNrYmxvY2tzaXplKCk7CisJaWYgKGhlcmVmZCA+PSAwICYmIGxlbiA+PSAxMDI0KSB7CisJCXh3cml0ZShoZXJlZmQsIHN0YWNrYmxvY2soKSwgbGVuKTsKKwkJcmV0dXJuIHN0YWNrYmxvY2soKTsKKwl9CisJZ3Jvd3N0YWNrYmxvY2soKTsKKwlyZXR1cm4gc3RhY2tibG9jaygpICsgbGVuOworfQorCisvKgorICogQ2FsbGVkIGZyb20gQ0hFQ0tTVFJTUEFDRS4KKyAqLworCitjaGFyICoKK21ha2VzdHJzcGFjZShzaXplX3QgbmV3bGVuLCBjaGFyICpwKQoreworCXNpemVfdCBsZW4gPSBwIC0gc3RhY2tueHQ7CisJc2l6ZV90IHNpemUgPSBzdGFja2Jsb2Nrc2l6ZSgpOworCisJZm9yICg7OykgeworCQlzaXplX3QgbmxlZnQ7CisKKwkJc2l6ZSA9IHN0YWNrYmxvY2tzaXplKCk7CisJCW5sZWZ0ID0gc2l6ZSAtIGxlbjsKKwkJaWYgKG5sZWZ0ID49IG5ld2xlbikKKwkJCWJyZWFrOworCQlncm93c3RhY2tibG9jaygpOworCX0KKwlyZXR1cm4gc3RhY2tibG9jaygpICsgbGVuOworfQorCitjaGFyICoKK3N0bnB1dHMoY29uc3QgY2hhciAqcywgc2l6ZV90IG4sIGNoYXIgKnApCit7CisJcCA9IG1ha2VzdHJzcGFjZShuLCBwKTsKKwlwID0gbWVtcGNweShwLCBzLCBuKTsKKwlyZXR1cm4gcDsKK30KKworY2hhciAqCitzdHB1dHMoY29uc3QgY2hhciAqcywgY2hhciAqcCkKK3sKKwlyZXR1cm4gc3RucHV0cyhzLCBzdHJsZW4ocyksIHApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWVtYWxsb2MuaCBiL3Vzci9kYXNoL21lbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5MWQxMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21lbWFsbG9jLmgKQEAgLTAsMCArMSw5NyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyltZW1hbGxvYy5oCTguMiAoQmVya2VsZXkpIDUvNC85NQorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworc3RydWN0IHN0YWNrbWFyayB7CisJc3RydWN0IHN0YWNrX2Jsb2NrICpzdGFja3A7CisJY2hhciAqc3RhY2tueHQ7CisJc2l6ZV90IHN0YWNrbmxlZnQ7CisJc3RydWN0IHN0YWNrbWFyayAqbWFya25leHQ7Cit9OworCisKK2V4dGVybiBjaGFyICpzdGFja254dDsKK2V4dGVybiBzaXplX3Qgc3RhY2tubGVmdDsKK2V4dGVybiBjaGFyICpzc3RyZW5kOworZXh0ZXJuIGludCBoZXJlZmQ7CisKK3BvaW50ZXIgY2ttYWxsb2Moc2l6ZV90KTsKK3BvaW50ZXIgY2tyZWFsbG9jKHBvaW50ZXIsIHNpemVfdCk7CitjaGFyICpzYXZlc3RyKGNvbnN0IGNoYXIgKik7Citwb2ludGVyIHN0YWxsb2Moc2l6ZV90KTsKK3ZvaWQgc3R1bmFsbG9jKHBvaW50ZXIpOwordm9pZCBzZXRzdGFja21hcmsoc3RydWN0IHN0YWNrbWFyayAqKTsKK3ZvaWQgcG9wc3RhY2ttYXJrKHN0cnVjdCBzdGFja21hcmsgKik7Cit2b2lkIGdyb3dzdGFja2Jsb2NrKHZvaWQpOwordm9pZCBncmFic3RhY2tibG9jayhzaXplX3QpOwordm9pZCAqZ3Jvd3N0YWNrc3RyKHZvaWQpOworY2hhciAqbWFrZXN0cnNwYWNlKHNpemVfdCwgY2hhciAqKTsKK2NoYXIgKnN0bnB1dHMoY29uc3QgY2hhciAqLCBzaXplX3QsIGNoYXIgKik7CitjaGFyICpzdHB1dHMoY29uc3QgY2hhciAqLCBjaGFyICopOworCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqX1NUUFVUQyhjaGFyIGMsIGNoYXIgKnApIHsKKwlpZiAocCA9PSBzc3RyZW5kKQorCQlwID0gZ3Jvd3N0YWNrc3RyKCk7CisJKnArKyA9IGM7CisJcmV0dXJuIHA7Cit9CisKKyNkZWZpbmUgc3RhY2tibG9jaygpICgodm9pZCAqKXN0YWNrbnh0KQorI2RlZmluZSBzdGFja2Jsb2Nrc2l6ZSgpIHN0YWNrbmxlZnQKKyNkZWZpbmUgU1RBUlRTVEFDS1NUUihwKSAoKHApID0gc3RhY2tibG9jaygpKQorI2RlZmluZSBTVFBVVEMoYywgcCkgKChwKSA9IF9TVFBVVEMoKGMpLCAocCkpKQorI2RlZmluZSBDSEVDS1NUUlNQQUNFKG4sIHApIFwKKwkoeyBcCisJCWNoYXIgKnEgPSAocCk7IFwKKwkJc2l6ZV90IGwgPSAobik7IFwKKwkJc2l6ZV90IG0gPSBzc3RyZW5kIC0gcTsgXAorCQlpZiAobCA+IG0pIFwKKwkJCShwKSA9IG1ha2VzdHJzcGFjZShsLCBxKTsgXAorCQkwOyBcCisJfSkKKyNkZWZpbmUgVVNUUFVUQyhjLCBwKQkoKnArKyA9IChjKSkKKyNkZWZpbmUgU1RBQ0tTVFJOVUwocCkJKChwKSA9PSBzc3RyZW5kPyAocCA9IGdyb3dzdGFja3N0cigpLCAqcCA9ICdcMCcpIDogKCpwID0gJ1wwJykpCisjZGVmaW5lIFNUVU5QVVRDKHApCSgtLXApCisjZGVmaW5lIFNUVE9QQyhwKQlwWy0xXQorI2RlZmluZSBTVEFESlVTVChhbW91bnQsIHApCShwICs9IChhbW91bnQpKQorCisjZGVmaW5lIGdyYWJzdGFja3N0cihwKQlzdGFsbG9jKChjaGFyICopKHApIC0gKGNoYXIgKilzdGFja2Jsb2NrKCkpCisjZGVmaW5lIHVuZ3JhYnN0YWNrc3RyKHMsIHApIHN0dW5hbGxvYygocykpCisjZGVmaW5lIHN0YWNrc3RyZW5kKCkgKCh2b2lkICopc3N0cmVuZCkKKworI2RlZmluZSBja2ZyZWUocCkJZnJlZSgocG9pbnRlcikocCkpCmRpZmYgLS1naXQgYS91c3IvZGFzaC9taXNjYmx0aW4uYyBiL3Vzci9kYXNoL21pc2NibHRpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMWNkMWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9taXNjYmx0aW4uYwpAQCAtMCwwICsxLDUxMiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBNaXNjZWxhbmVvdXMgYnVpbHRpbnMuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogcXVhZF90ICovCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CQkvKiBCU0Q0XzQgKi8KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CQkvKiBzdHJ0b3RpbWV2YWwoKSAqLworCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAidmFyLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm1pc2NibHRpbi5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAibWFpbi5oIgorCisjdW5kZWYgcmZsYWcKKworCisKKy8qCisgKiBUaGUgcmVhZCBidWlsdGluLiAgVGhlIC1lIG9wdGlvbiBjYXVzZXMgYmFja3NsYXNoZXMgdG8gZXNjYXBlIHRoZQorICogZm9sbG93aW5nIGNoYXJhY3Rlci4KKyAqCisgKiBUaGlzIHVzZXMgdW5idWZmZXJlZCBpbnB1dCwgd2hpY2ggbWF5IGJlIGF2b2lkYWJsZSBpbiBzb21lIGNhc2VzLgorICovCisKK2ludAorcmVhZGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKmFwOworCWludCBiYWNrc2xhc2g7CisJY2hhciBjOworCWludCByZmxhZzsKKwljaGFyICpwcm9tcHQ7CisJY29uc3QgY2hhciAqaWZzOworCWNoYXIgKnA7CisJaW50IHN0YXJ0d29yZDsKKwlpbnQgc3RhdHVzOworCWludCB0aW1lb3V0OworCWludCBpOworCWZkX3NldCBzZXQ7CisJc3RydWN0IHRpbWV2YWwgdHMsIHQwLCB0MSwgdG87CisKKwl0cy50dl9zZWMgPSB0cy50dl91c2VjID0gMDsKKworCXJmbGFnID0gMDsKKwl0aW1lb3V0ID0gMDsKKwlwcm9tcHQgPSBOVUxMOworCXdoaWxlICgoaSA9IG5leHRvcHQoInA6cnQ6IikpICE9ICdcMCcpIHsKKwkJc3dpdGNoKGkpIHsKKwkJY2FzZSAncCc6CisJCQlwcm9tcHQgPSBvcHRpb25hcmc7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlwID0gc3RydG90aW1ldmFsKG9wdGlvbmFyZywgJnRzKTsKKwkJCWlmICgqcCB8fCAoIXRzLnR2X3NlYyAmJiAhdHMudHZfdXNlYykpCisJCQkJc2hfZXJyb3IoImludmFsaWQgdGltZW91dCIpOworCQkJdGltZW91dCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZmxhZyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwcm9tcHQgJiYgaXNhdHR5KDApKSB7CisJCW91dDJzdHIocHJvbXB0KTsKKyNpZmRlZiBGTFVTSEVSUgorCQlmbHVzaGFsbCgpOworI2VuZGlmCisJfQorCWlmICgqKGFwID0gYXJncHRyKSA9PSBOVUxMKQorCQlzaF9lcnJvcigiYXJnIGNvdW50Iik7CisJaWYgKChpZnMgPSBibHRpbmxvb2t1cCgiSUZTIikpID09IE5VTEwpCisJCWlmcyA9IGRlZmlmczsKKwlzdGF0dXMgPSAwOworCXN0YXJ0d29yZCA9IDE7CisJYmFja3NsYXNoID0gMDsKKwlpZiAodGltZW91dCkgeworCQlnZXR0aW1lb2ZkYXkoJnQwLCBOVUxMKTsKKworCQkvKiB0cyArPSB0MDsgKi8KKwkJdHMudHZfdXNlYyArPSB0MC50dl91c2VjOworCQl3aGlsZSAodHMudHZfdXNlYyA+PSAxMDAwMDAwKSB7CisJCQl0cy50dl9zZWMrKzsKKwkJCXRzLnR2X3VzZWMgLT0gMTAwMDAwMDsKKwkJfQorCQl0cy50dl9zZWMgKz0gdDAudHZfc2VjOworCX0KKwlTVEFSVFNUQUNLU1RSKHApOworCWZvciAoOzspIHsKKwkJaWYgKHRpbWVvdXQpIHsKKwkJCWdldHRpbWVvZmRheSgmdDEsIE5VTEwpOworCQkJaWYgKHQxLnR2X3NlYyA+IHRzLnR2X3NlYyB8fAorCQkJICAgICh0MS50dl9zZWMgPT0gdHMudHZfc2VjICYmCisJCQkgICAgIHQxLnR2X3VzZWMgPj0gdHMudHZfdXNlYykpIHsKKwkJCQlzdGF0dXMgPSAxOworCQkJCWJyZWFrOwkvKiBUaW1lb3V0ISAqLworCQkJfQorCisJCQkvKiB0byA9IHRzIC0gdDE7ICovCisJCQlpZiAodHMudHZfdXNlYyA+PSB0MS50dl91c2VjKSB7CisJCQkJdG8udHZfdXNlYyA9IHRzLnR2X3VzZWMgLSB0MS50dl91c2VjOworCQkJCXRvLnR2X3NlYyAgPSB0cy50dl9zZWMgLSB0MS50dl9zZWM7CisJCQl9IGVsc2UgeworCQkJCXRvLnR2X3VzZWMgPSB0cy50dl91c2VjIC0gdDEudHZfdXNlYyArIDEwMDAwMDA7CisJCQkJdG8udHZfc2VjICA9IHRzLnR2X3NlYyAtIHQxLnR2X3NlYyAtIDE7CisJCQl9CisKKwkJCUZEX1pFUk8oJnNldCk7CisJCQlGRF9TRVQoMCwgJnNldCk7CisJCQlpZiAoc2VsZWN0KDEsICZzZXQsIE5VTEwsIE5VTEwsICZ0bykgIT0gMSkgeworCQkJCXN0YXR1cyA9IDE7CisJCQkJYnJlYWs7IC8qIFRpbWVvdXQhICovCisJCQl9CisJCX0KKwkJaWYgKHJlYWQoMCwgJmMsIDEpICE9IDEpIHsKKwkJCXN0YXR1cyA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYyA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWlmIChiYWNrc2xhc2gpIHsKKwkJCWJhY2tzbGFzaCA9IDA7CisJCQlpZiAoYyAhPSAnXG4nKQorCQkJCWdvdG8gcHV0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZmxhZyAmJiBjID09ICdcXCcpIHsKKwkJCWJhY2tzbGFzaCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCQlpZiAoc3RhcnR3b3JkICYmICppZnMgPT0gJyAnICYmIHN0cmNocihpZnMsIGMpKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlzdGFydHdvcmQgPSAwOworCQlpZiAoYXBbMV0gIT0gTlVMTCAmJiBzdHJjaHIoaWZzLCBjKSAhPSBOVUxMKSB7CisJCQlTVEFDS1NUUk5VTChwKTsKKwkJCXNldHZhcigqYXAsIHN0YWNrYmxvY2soKSwgMCk7CisJCQlhcCsrOworCQkJc3RhcnR3b3JkID0gMTsKKwkJCVNUQVJUU1RBQ0tTVFIocCk7CisJCX0gZWxzZSB7CitwdXQ6CisJCQlTVFBVVEMoYywgcCk7CisJCX0KKwl9CisJU1RBQ0tTVFJOVUwocCk7CisJLyogUmVtb3ZlIHRyYWlsaW5nIGJsYW5rcyAqLworCXdoaWxlICgoY2hhciAqKXN0YWNrYmxvY2soKSA8PSAtLXAgJiYgc3RyY2hyKGlmcywgKnApICE9IE5VTEwpCisJCSpwID0gJ1wwJzsKKwlzZXR2YXIoKmFwLCBzdGFja2Jsb2NrKCksIDApOworCXdoaWxlICgqKythcCAhPSBOVUxMKQorCQlzZXR2YXIoKmFwLCBudWxsc3RyLCAwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKworLyoKKyAqIHVtYXNrIGJ1aWx0aW4KKyAqCisgKiBUaGlzIGNvZGUgd2FzIHJpcHBlZCBmcm9tIHBka3NoIDUuMi4xNCBhbmQgaGFja2VkIGZvciB1c2Ugd2l0aAorICogZGFzaCBieSBIZXJiZXJ0IFh1LgorICoKKyAqIFB1YmxpYyBkb21haW4uCisgKi8KKworaW50Cit1bWFza2NtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYXA7CisJaW50IG1hc2s7CisJaW50IGk7CisJaW50IHN5bWJvbGljX21vZGUgPSAwOworCisJd2hpbGUgKChpID0gbmV4dG9wdCgiUyIpKSAhPSAnXDAnKSB7CisJCXN5bWJvbGljX21vZGUgPSAxOworCX0KKworCUlOVE9GRjsKKwltYXNrID0gdW1hc2soMCk7CisJdW1hc2sobWFzayk7CisJSU5UT047CisKKwlpZiAoKGFwID0gKmFyZ3B0cikgPT0gTlVMTCkgeworCQlpZiAoc3ltYm9saWNfbW9kZSkgeworCQkJY2hhciBidWZbMThdOworCQkJaW50IGo7CisKKwkJCW1hc2sgPSB+bWFzazsKKwkJCWFwID0gYnVmOworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJCSphcCsrID0gInVnbyJbaV07CisJCQkJKmFwKysgPSAnPSc7CisJCQkJZm9yIChqID0gMDsgaiA8IDM7IGorKykKKwkJCQkJaWYgKG1hc2sgJiAoMSA8PCAoOCAtICgzKmkgKyBqKSkpKQorCQkJCQkJKmFwKysgPSAicnd4IltqXTsKKwkJCQkqYXArKyA9ICcsJzsKKwkJCX0KKwkJCWFwWy0xXSA9ICdcMCc7CisJCQlvdXQxZm10KCIlc1xuIiwgYnVmKTsKKwkJfSBlbHNlIHsKKwkJCW91dDFmbXQoIiUuNG9cbiIsIG1hc2spOworCQl9CisJfSBlbHNlIHsKKwkJaW50IG5ld19tYXNrOworCisJCWlmIChpc2RpZ2l0KCphcCkpIHsKKwkJCW5ld19tYXNrID0gMDsKKwkJCWRvIHsKKwkJCQlpZiAoKmFwID49ICc4JyB8fCAqYXAgPCAnMCcpCisJCQkJCXNoX2Vycm9yKGlsbG51bSwgKmFyZ3B0cik7CisJCQkJbmV3X21hc2sgPSAobmV3X21hc2sgPDwgMykgKyAoKmFwIC0gJzAnKTsKKwkJCX0gd2hpbGUgKCorK2FwICE9ICdcMCcpOworCQl9IGVsc2UgeworCQkJaW50IHBvc2l0aW9ucywgbmV3X3ZhbDsKKwkJCWNoYXIgb3A7CisKKwkJCW1hc2sgPSB+bWFzazsKKwkJCW5ld19tYXNrID0gbWFzazsKKwkJCXBvc2l0aW9ucyA9IDA7CisJCQl3aGlsZSAoKmFwKSB7CisJCQkJd2hpbGUgKCphcCAmJiBzdHJjaHIoImF1Z28iLCAqYXApKQorCQkJCQlzd2l0Y2ggKCphcCsrKSB7CisJCQkJCWNhc2UgJ2EnOiBwb3NpdGlvbnMgfD0gMDExMTsgYnJlYWs7CisJCQkJCWNhc2UgJ3UnOiBwb3NpdGlvbnMgfD0gMDEwMDsgYnJlYWs7CisJCQkJCWNhc2UgJ2cnOiBwb3NpdGlvbnMgfD0gMDAxMDsgYnJlYWs7CisJCQkJCWNhc2UgJ28nOiBwb3NpdGlvbnMgfD0gMDAwMTsgYnJlYWs7CisJCQkJCX0KKwkJCQlpZiAoIXBvc2l0aW9ucykKKwkJCQkJcG9zaXRpb25zID0gMDExMTsgLyogZGVmYXVsdCBpcyBhICovCisJCQkJaWYgKCFzdHJjaHIoIj0rLSIsIG9wID0gKmFwKSkKKwkJCQkJYnJlYWs7CisJCQkJYXArKzsKKwkJCQluZXdfdmFsID0gMDsKKwkJCQl3aGlsZSAoKmFwICYmIHN0cmNocigicnd4dWdvWHMiLCAqYXApKQorCQkJCQlzd2l0Y2ggKCphcCsrKSB7CisJCQkJCWNhc2UgJ3InOiBuZXdfdmFsIHw9IDA0OyBicmVhazsKKwkJCQkJY2FzZSAndyc6IG5ld192YWwgfD0gMDI7IGJyZWFrOworCQkJCQljYXNlICd4JzogbmV3X3ZhbCB8PSAwMTsgYnJlYWs7CisJCQkJCWNhc2UgJ3UnOiBuZXdfdmFsIHw9IG1hc2sgPj4gNjsKKwkJCQkJCSAgYnJlYWs7CisJCQkJCWNhc2UgJ2cnOiBuZXdfdmFsIHw9IG1hc2sgPj4gMzsKKwkJCQkJCSAgYnJlYWs7CisJCQkJCWNhc2UgJ28nOiBuZXdfdmFsIHw9IG1hc2sgPj4gMDsKKwkJCQkJCSAgYnJlYWs7CisJCQkJCWNhc2UgJ1gnOiBpZiAobWFzayAmIDAxMTEpCisJCQkJCQkJbmV3X3ZhbCB8PSAwMTsKKwkJCQkJCSAgYnJlYWs7CisJCQkJCWNhc2UgJ3MnOiAvKiBpZ25vcmVkICovCisJCQkJCQkgIGJyZWFrOworCQkJCQl9CisJCQkJbmV3X3ZhbCA9IChuZXdfdmFsICYgMDcpICogcG9zaXRpb25zOworCQkJCXN3aXRjaCAob3ApIHsKKwkJCQljYXNlICctJzoKKwkJCQkJbmV3X21hc2sgJj0gfm5ld192YWw7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJz0nOgorCQkJCQluZXdfbWFzayA9IG5ld192YWwKKwkJCQkJICAgIHwgKG5ld19tYXNrICYgfihwb3NpdGlvbnMgKiAwNykpOworCQkJCQlicmVhazsKKwkJCQljYXNlICcrJzoKKwkJCQkJbmV3X21hc2sgfD0gbmV3X3ZhbDsKKwkJCQl9CisJCQkJaWYgKCphcCA9PSAnLCcpIHsKKwkJCQkJcG9zaXRpb25zID0gMDsKKwkJCQkJYXArKzsKKwkJCQl9IGVsc2UgaWYgKCFzdHJjaHIoIj0rLSIsICphcCkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCphcCkgeworCQkJCXNoX2Vycm9yKCJJbGxlZ2FsIG1vZGU6ICVzIiwgKmFyZ3B0cik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQluZXdfbWFzayA9IH5uZXdfbWFzazsKKwkJfQorCQl1bWFzayhuZXdfbWFzayk7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgSEFWRV9HRVRSTElNSVQKKy8qCisgKiB1bGltaXQgYnVpbHRpbgorICoKKyAqIFRoaXMgY29kZSwgb3JpZ2luYWxseSBieSBEb3VnIEd3eW4sIERvdWcgS2luZ3N0b24sIEVyaWMgR2lzaW4sIGFuZAorICogTWljaGFlbCBSZW5kZWxsIHdhcyByaXBwZWQgZnJvbSBwZGtzaCA1LjAuOCBhbmQgaGFja2VkIGZvciB1c2Ugd2l0aAorICogYXNoIGJ5IEouVC4gQ29ua2xpbi4KKyAqCisgKiBQdWJsaWMgZG9tYWluLgorICovCisKK3N0cnVjdCBsaW1pdHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50CWNtZDsKKwlpbnQJZmFjdG9yOwkvKiBtdWx0aXBseSBieSB0byBnZXQgcmxpbV97Y3VyLG1heH0gdmFsdWVzICovCisJY2hhcglvcHRpb247Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxpbWl0cyBsaW1pdHNbXSA9IHsKKyNpZmRlZiBSTElNSVRfQ1BVCisJeyAidGltZShzZWNvbmRzKSIsCQlSTElNSVRfQ1BVLAkgICAxLCAndCcgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9GU0laRQorCXsgImZpbGUoYmxvY2tzKSIsCQlSTElNSVRfRlNJWkUsCSA1MTIsICdmJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0RBVEEKKwl7ICJkYXRhKGtieXRlcykiLAkJUkxJTUlUX0RBVEEsCTEwMjQsICdkJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NUQUNLCisJeyAic3RhY2soa2J5dGVzKSIsCQlSTElNSVRfU1RBQ0ssCTEwMjQsICdzJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NPUkUKKwl7ICJjb3JlZHVtcChibG9ja3MpIiwJCVJMSU1JVF9DT1JFLAkgNTEyLCAnYycgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9SU1MKKwl7ICJtZW1vcnkoa2J5dGVzKSIsCQlSTElNSVRfUlNTLAkxMDI0LCAnbScgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9NRU1MT0NLCisJeyAibG9ja2VkIG1lbW9yeShrYnl0ZXMpIiwJUkxJTUlUX01FTUxPQ0ssIDEwMjQsICdsJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05QUk9DCisJeyAicHJvY2VzcyIsCQkJUkxJTUlUX05QUk9DLCAgICAgIDEsICdwJyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05PRklMRQorCXsgIm5vZmlsZXMiLAkJCVJMSU1JVF9OT0ZJTEUsICAgICAxLCAnbicgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9BUworCXsgInZtZW1vcnkoa2J5dGVzKSIsCQlSTElNSVRfQVMsCTEwMjQsICd2JyB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0xPQ0tTCisJeyAibG9ja3MiLAkJCVJMSU1JVF9MT0NLUywJICAgMSwgJ3cnIH0sCisjZW5kaWYKKwl7IChjaGFyICopIDAsCQkJMCwJCSAgIDAsICAnXDAnIH0KK307CisKK2VudW0gbGltdHlwZSB7IFNPRlQgPSAweDEsIEhBUkQgPSAweDIgfTsKKworc3RhdGljIHZvaWQgcHJpbnRsaW0oZW51bSBsaW10eXBlIGhvdywgY29uc3Qgc3RydWN0IHJsaW1pdCAqbGltaXQsCisJCSAgICAgY29uc3Qgc3RydWN0IGxpbWl0cyAqbCkKK3sKKwlybGltX3QgdmFsOworCisJdmFsID0gbGltaXQtPnJsaW1fbWF4OworCWlmIChob3cgJiBTT0ZUKQorCQl2YWwgPSBsaW1pdC0+cmxpbV9jdXI7CisKKwlpZiAodmFsID09IFJMSU1fSU5GSU5JVFkpCisJCW91dDFmbXQoInVubGltaXRlZFxuIik7CisJZWxzZSB7CisJCXZhbCAvPSBsLT5mYWN0b3I7CisJCW91dDFmbXQoIiVqZFxuIiwgKGludG1heF90KSB2YWwpOworCX0KK30KKworaW50Cit1bGltaXRjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludAljOworCXJsaW1fdCB2YWwgPSAwOworCWVudW0gbGltdHlwZSBob3cgPSBTT0ZUIHwgSEFSRDsKKwljb25zdCBzdHJ1Y3QgbGltaXRzCSpsOworCWludAkJc2V0LCBhbGwgPSAwOworCWludAkJb3B0Yywgd2hhdDsKKwlzdHJ1Y3QgcmxpbWl0CWxpbWl0OworCisJd2hhdCA9ICdmJzsKKwl3aGlsZSAoKG9wdGMgPSBuZXh0b3B0KCJIU2EiCisjaWZkZWYgUkxJTUlUX0NQVQorCQkJICAgICAgICJ0IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0ZTSVpFCisJCQkgICAgICAgImYiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfREFUQQorCQkJICAgICAgICJkIgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NUQUNLCisJCQkgICAgICAgInMiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQ09SRQorCQkJICAgICAgICJjIgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1JTUworCQkJICAgICAgICJtIgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX01FTUxPQ0sKKwkJCSAgICAgICAibCIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OUFJPQworCQkJICAgICAgICJwIgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05PRklMRQorCQkJICAgICAgICJuIgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0FTCisJCQkgICAgICAgInYiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTE9DS1MKKwkJCSAgICAgICAidyIKKyNlbmRpZgorCSkpICE9ICdcMCcpCisJCXN3aXRjaCAob3B0YykgeworCQljYXNlICdIJzoKKwkJCWhvdyA9IEhBUkQ7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCQlob3cgPSBTT0ZUOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJYWxsID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJd2hhdCA9IG9wdGM7CisJCX0KKworCWZvciAobCA9IGxpbWl0czsgbC0+b3B0aW9uICE9IHdoYXQ7IGwrKykKKwkJOworCisJc2V0ID0gKmFyZ3B0ciA/IDEgOiAwOworCWlmIChzZXQpIHsKKwkJY2hhciAqcCA9ICphcmdwdHI7CisKKwkJaWYgKGFsbCB8fCBhcmdwdHJbMV0pCisJCQlzaF9lcnJvcigidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCWlmIChzdHJjbXAocCwgInVubGltaXRlZCIpID09IDApCisJCQl2YWwgPSBSTElNX0lORklOSVRZOworCQllbHNlIHsKKwkJCXZhbCA9IChybGltX3QpIDA7CisKKwkJCXdoaWxlICgoYyA9ICpwKyspID49ICcwJyAmJiBjIDw9ICc5JykKKwkJCXsKKwkJCQl2YWwgPSAodmFsICogMTApICsgKGxvbmcpKGMgLSAnMCcpOworCQkJCWlmICh2YWwgPCAocmxpbV90KSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjKQorCQkJCXNoX2Vycm9yKCJiYWQgbnVtYmVyIik7CisJCQl2YWwgKj0gbC0+ZmFjdG9yOworCQl9CisJfQorCWlmIChhbGwpIHsKKwkJZm9yIChsID0gbGltaXRzOyBsLT5uYW1lOyBsKyspIHsKKwkJCWdldHJsaW1pdChsLT5jbWQsICZsaW1pdCk7CisJCQlvdXQxZm10KCIlLTIwcyAiLCBsLT5uYW1lKTsKKwkJCXByaW50bGltKGhvdywgJmxpbWl0LCBsKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlnZXRybGltaXQobC0+Y21kLCAmbGltaXQpOworCWlmIChzZXQpIHsKKwkJaWYgKGhvdyAmIEhBUkQpCisJCQlsaW1pdC5ybGltX21heCA9IHZhbDsKKwkJaWYgKGhvdyAmIFNPRlQpCisJCQlsaW1pdC5ybGltX2N1ciA9IHZhbDsKKwkJaWYgKHNldHJsaW1pdChsLT5jbWQsICZsaW1pdCkgPCAwKQorCQkJc2hfZXJyb3IoImVycm9yIHNldHRpbmcgbGltaXQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRsaW0oaG93LCAmbGltaXQsIGwpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWlzY2JsdGluLmggYi91c3IvZGFzaC9taXNjYmx0aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDlhOGQxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWlzY2JsdGluLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBDaHJpc3RvcyBab3VsYXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworaW50IHJlYWRjbWQoaW50LCBjaGFyICoqKTsKK2ludCB1bWFza2NtZChpbnQsIGNoYXIgKiopOworaW50IHVsaW1pdGNtZChpbnQsIGNoYXIgKiopOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWtidWlsdGlucyBiL3Vzci9kYXNoL21rYnVpbHRpbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzMzA1MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL21rYnVpbHRpbnMKQEAgLTAsMCArMSwxMDEgQEAKKyMhL2Jpbi9zaCAtCisjCSROZXRCU0Q6IG1rYnVpbHRpbnMsdiAxLjE3IDIwMDIvMTEvMjQgMjI6MzU6NDEgY2hyaXN0b3MgRXhwICQKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKW1rYnVpbHRpbnMJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKK3RlbXBmaWxlPXRlbXBmaWxlCitpZiAhIHR5cGUgdGVtcGZpbGUgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCXRlbXBmaWxlPSJta3RlbXAgJHtUTVBESVI6LS90bXB9L2J1aWx0aW4uWFhYWFhYIgorZmkKKwordHJhcCAncm0gLWYgJHRlbXAgJHRlbXAyJyBFWElUCit0ZW1wPSQoJHRlbXBmaWxlKQordGVtcDI9JCgkdGVtcGZpbGUpCisKK2J1aWx0aW5zPSQxCisKK2V4ZWMgPiBidWlsdGlucy5jCitjYXQgPDxcIQorLyoKKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBta2J1aWx0aW5zIHByb2dyYW0uCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAiYnVpbHRpbnMuaCIKKworIQorPCAkYnVpbHRpbnMgc2VkICcvXiMvZDsgL14kL2QnID4gJHRlbXAKK2F3ayAnewlwcmludGYgImludCAlcyhpbnQsIGNoYXIgKiopO1xuIiwgJDF9JyAkdGVtcAorZWNobyAnCitjb25zdCBzdHJ1Y3QgYnVpbHRpbmNtZCBidWlsdGluY21kW10gPSB7JworYXdrICd7CWZvciAoaSA9IDIgOyBpIDw9IE5GIDsgaSsrKSB7CisJCWxpbmUgPSAkaSAiXHQiICQxCisJCWlmICgkaSB+IC9eLS8pCisJCQlsaW5lID0gJCgrK2kpICJcdCIgbGluZQorCQlwcmludCBsaW5lCisJfX0nICR0ZW1wIHwgc29ydCAtayAxLDEgfCB0ZWUgJHRlbXAyIHwgYXdrICd7CisJCW9wdCA9ICIiCisJCWlmIChORiA+IDIpIHsKKwkJCW9wdCA9IHN1YnN0cigkMiwgMikKKwkJCSQyID0gJDMKKwkJfQorCQlwcmludGYgIlx0eyBcIiVzXCIsICVzLCAlZCB9LFxuIiwgJDEsICQyLAorCQkJKG9wdCB+IC9zLykgKyAob3B0IH4gL1tzdV0vKSAqIDIgKyAob3B0IH4gL2EvKSAqIDQKKwl9JworZWNobyAnfTsnCisKK2V4ZWMgPiBidWlsdGlucy5oCitjYXQgPDxcIQorLyoKKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBta2J1aWx0aW5zIHByb2dyYW0uCisgKi8KKworIQorc2VkICdzLwktW2Etel0qLy8nICR0ZW1wMiB8IG5sIC12IDAgfCBzb3J0IC11IC1rIDMsMyB8Cit0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiB8CisJYXdrICd7CXByaW50ZiAiI2RlZmluZSAlcyAoYnVpbHRpbmNtZCArICVkKVxuIiwgJDMsICQxfScKK3ByaW50ZiAnXG4jZGVmaW5lIE5VTUJVSUxUSU5TICVkXG4nICQod2MgLWwgPCAkdGVtcDIpCitlY2hvICcKKyNkZWZpbmUgQlVJTFRJTl9TUEVDSUFMIDB4MQorI2RlZmluZSBCVUlMVElOX1JFR1VMQVIgMHgyCisjZGVmaW5lIEJVSUxUSU5fQVNTSUdOIDB4NAorCitzdHJ1Y3QgYnVpbHRpbmNtZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpidWlsdGluKShpbnQsIGNoYXIgKiopOworCXVuc2lnbmVkIGZsYWdzOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBidWlsdGluY21kIGJ1aWx0aW5jbWRbXTsnCmRpZmYgLS1naXQgYS91c3IvZGFzaC9ta2luaXQuYyBiL3Vzci9kYXNoL21raW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDM3NTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ta2luaXQuYwpAQCAtMCwwICsxLDQ3NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gc2NhbnMgYWxsIHRoZSBzb3VyY2UgZmlsZXMgZm9yIGNvZGUgdG8gaGFuZGxlIHZhcmlvdXMKKyAqIHNwZWNpYWwgZXZlbnRzIGFuZCBjb21iaW5lcyB0aGlzIGNvZGUgaW50byBvbmUgZmlsZS4gIFRoaXMgKGFsbGVnZWRseSkKKyAqIGltcHJvdmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHByb2dyYW0gc2luY2UgdGhlcmUgaXMgbm8gbmVlZCBmb3IKKyAqIGFueW9uZSBvdXRzaWRlIG9mIGEgbW9kdWxlIHRvIGtub3cgdGhhdCB0aGF0IG1vZHVsZSBwZXJmb3JtcyBzcGVjaWFsCisgKiBvcGVyYXRpb25zIG9uIHBhcnRpY3VsYXIgZXZlbnRzLgorICoKKyAqIFVzYWdlOiAgbWtpbml0IHNvdXJjZWZpbGUuLi4KKyAqLworCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworLyoKKyAqIE9VVEZJTEUgaXMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlLiAgT3V0cHV0IGlzIGluaXRpYWxseSB3cml0dGVuCisgKiB0byB0aGUgZmlsZSBPVVRURU1QLCB3aGljaCBpcyB0aGVuIG1vdmVkIHRvIE9VVEZJTEUuCisgKi8KKworI2RlZmluZSBPVVRGSUxFICJpbml0LmMiCisjZGVmaW5lIE9VVFRFTVAgImluaXQuYy5uZXciCisKKworLyoKKyAqIEEgdGV4dCBzdHJ1Y3R1cmUgaXMgYmFzaWNseSBqdXN0IGEgc3RyaW5nIHRoYXQgZ3Jvd3MgYXMgbW9yZSBjaGFyYWN0ZXJzCisgKiBhcmUgYWRkZWQgb250byB0aGUgZW5kIG9mIGl0LiAgSXQgaXMgaW1wbGVtZW50ZWQgYXMgYSBsaW5rZWQgbGlzdCBvZgorICogYmxvY2tzIG9mIGNoYXJhY3RlcnMuICBUaGUgcm91dGluZXMgYWRkc3RyIGFuZCBhZGRjaGFyIGFwcGVuZCBhIHN0cmluZworICogb3IgYSBzaW5nbGUgY2hhcmFjdGVyLCByZXNwZWN0aXZlbHksIHRvIGEgdGV4dCBzdHJ1Y3R1cmUuICBXcml0ZXRleHQKKyAqIHdyaXRlcyB0aGUgY29udGVudHMgb2YgYSB0ZXh0IHN0cnVjdHVyZSB0byBhIGZpbGUuCisgKi8KKworI2RlZmluZSBCTE9DS1NJWkUgNTEyCisKK3N0cnVjdCB0ZXh0IHsKKwljaGFyICpuZXh0YzsKKwlpbnQgbmxlZnQ7CisJc3RydWN0IGJsb2NrICpzdGFydDsKKwlzdHJ1Y3QgYmxvY2sgKmxhc3Q7Cit9OworCitzdHJ1Y3QgYmxvY2sgeworCXN0cnVjdCBibG9jayAqbmV4dDsKKwljaGFyIHRleHRbQkxPQ0tTSVpFXTsKK307CisKKworLyoKKyAqIFRoZXJlIGlzIG9uZSBldmVudCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZXZlbnQgdGhhdCBta2luaXQgaGFuZGxlcy4KKyAqLworCitzdHJ1Y3QgZXZlbnQgeworCWNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIGV2ZW50IChlLmcuIElOSVQpICovCisJY2hhciAqcm91dGluZTsJCS8qIG5hbWUgb2Ygcm91dGluZSBjYWxsZWQgb24gZXZlbnQgKi8KKwljaGFyICpjb21tZW50OwkJLyogY29tbWVudCBkZXNjcmliaW5nIHJvdXRpbmUgKi8KKwlzdHJ1Y3QgdGV4dCBjb2RlOwkvKiBjb2RlIGZvciBoYW5kbGluZyBldmVudCAqLworfTsKKworCitjaGFyIHdyaXRlcltdID0gIlwKKy8qXG5cCisgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgbWtpbml0IHByb2dyYW0uXG5cCisgKi9cblwKK1xuIjsKKworY2hhciBpbml0W10gPSAiXAorLypcblwKKyAqIEluaXRpYWxpemF0aW9uIGNvZGUuXG5cCisgKi9cbiI7CisKK2NoYXIgcmVzZXRbXSA9ICJcCisvKlxuXAorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFuIGVycm9yIG9yIGFuIGludGVycnVwdCBvY2N1cnMgaW4gYW5cblwKKyAqIGludGVyYWN0aXZlIHNoZWxsIGFuZCBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSBtYWluIGNvbW1hbmQgbG9vcC5cblwKKyAqL1xuIjsKKworCitzdHJ1Y3QgZXZlbnQgZXZlbnRbXSA9IHsKKwl7IklOSVQiLCAiaW5pdCIsIGluaXR9LAorCXsiUkVTRVQiLCAicmVzZXQiLCByZXNldH0sCisJe05VTEwsIE5VTEx9Cit9OworCisKK2NoYXIgKmN1cmZpbGU7CQkJCS8qIGN1cnJlbnQgZmlsZSAqLworaW50IGxpbm5vOwkJCQkvKiBjdXJyZW50IGxpbmUgKi8KK2NoYXIgKmhlYWRlcl9maWxlc1syMDBdOwkJLyogbGlzdCBvZiBoZWFkZXIgZmlsZXMgKi8KK3N0cnVjdCB0ZXh0IGRlZmluZXM7CQkJLyogI2RlZmluZSBzdGF0ZW1lbnRzICovCitzdHJ1Y3QgdGV4dCBkZWNsczsJCQkvKiBkZWNsYXJhdGlvbnMgKi8KK2ludCBhbWlkZGVjbHM7CQkJCS8qIGZvciBmb3JtYXR0aW5nICovCisKKwordm9pZCByZWFkZmlsZShjaGFyICopOworaW50IG1hdGNoKGNoYXIgKiwgY2hhciAqKTsKK2ludCBnb29kZGVmaW5lKGNoYXIgKik7Cit2b2lkIGRvZXZlbnQoc3RydWN0IGV2ZW50ICosIEZJTEUgKiwgY2hhciAqKTsKK3ZvaWQgZG9pbmNsdWRlKGNoYXIgKik7Cit2b2lkIGRvZGVjbChjaGFyICosIEZJTEUgKik7Cit2b2lkIG91dHB1dCh2b2lkKTsKK3ZvaWQgYWRkc3RyKGNoYXIgKiwgc3RydWN0IHRleHQgKik7Cit2b2lkIGFkZGNoYXIoaW50LCBzdHJ1Y3QgdGV4dCAqKTsKK3ZvaWQgd3JpdGV0ZXh0KHN0cnVjdCB0ZXh0ICosIEZJTEUgKik7CitGSUxFICpja2ZvcGVuKGNoYXIgKiwgY2hhciAqKTsKK3ZvaWQgKmNrbWFsbG9jKGludCk7CitjaGFyICpzYXZlc3RyKGNoYXIgKik7CitzdGF0aWMgdm9pZCBlcnJvcihjaGFyICopOworaW50IG1haW4oaW50LCBjaGFyICoqKTsKKworI2RlZmluZSBlcXVhbChzMSwgczIpCShzdHJjbXAoczEsIHMyKSA9PSAwKQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKiphcDsKKworCWhlYWRlcl9maWxlc1swXSA9ICJcInNoZWxsLmhcIiI7CisJaGVhZGVyX2ZpbGVzWzFdID0gIlwibXlzdHJpbmcuaFwiIjsKKwloZWFkZXJfZmlsZXNbMl0gPSAiXCJpbml0LmhcIiI7CisJZm9yIChhcCA9IGFyZ3YgKyAxIDsgKmFwIDsgYXArKykKKwkJcmVhZGZpbGUoKmFwKTsKKwlvdXRwdXQoKTsKKwlyZW5hbWUoT1VUVEVNUCwgT1VURklMRSk7CisJZXhpdCgwKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworLyoKKyAqIFBhcnNlIGFuIGlucHV0IGZpbGUuCisgKi8KKwordm9pZAorcmVhZGZpbGUoY2hhciAqZm5hbWUpCit7CisJRklMRSAqZnA7CisJY2hhciBsaW5lWzEwMjRdOworCXN0cnVjdCBldmVudCAqZXA7CisKKwlmcCA9IGNrZm9wZW4oZm5hbWUsICJyIik7CisJY3VyZmlsZSA9IGZuYW1lOworCWxpbm5vID0gMDsKKwlhbWlkZGVjbHMgPSAwOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZnApICE9IE5VTEwpIHsKKwkJbGlubm8rKzsKKwkJZm9yIChlcCA9IGV2ZW50IDsgZXAtPm5hbWUgOyBlcCsrKSB7CisJCQlpZiAobGluZVswXSA9PSBlcC0+bmFtZVswXSAmJiBtYXRjaChlcC0+bmFtZSwgbGluZSkpIHsKKwkJCQlkb2V2ZW50KGVwLCBmcCwgZm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChsaW5lWzBdID09ICdJJyAmJiBtYXRjaCgiSU5DTFVERSIsIGxpbmUpKQorCQkJZG9pbmNsdWRlKGxpbmUpOworCQlpZiAobGluZVswXSA9PSAnTScgJiYgbWF0Y2goIk1LSU5JVCIsIGxpbmUpKQorCQkJZG9kZWNsKGxpbmUsIGZwKTsKKwkJaWYgKGxpbmVbMF0gPT0gJyMnICYmIGdvb2RkZWZpbmUobGluZSkpIHsKKwkJICAgICAgICBjaGFyICpjcDsKKwkJCWNoYXIgbGluZTJbMTAyNF07CisJCQlzdGF0aWMgY29uc3QgY2hhciB1bmRlZltdID0gIiN1bmRlZiAiOworCisJCQlzdHJjcHkobGluZTIsIGxpbmUpOworCQkJbWVtY3B5KGxpbmUyLCB1bmRlZiwgc2l6ZW9mKHVuZGVmKSAtIDEpOworCQkJY3AgPSBsaW5lMiArIHNpemVvZih1bmRlZikgLSAxOworCQkJd2hpbGUoKmNwICYmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKSkKKwkJCSAgICAgICAgY3ArKzsKKwkJCXdoaWxlKCpjcCAmJiAqY3AgIT0gJyAnICYmICpjcCAhPSAnXHQnICYmICpjcCAhPSAnXG4nKQorCQkJICAgICAgICBjcCsrOworCQkJKmNwKysgPSAnXG4nOyAqY3AgPSAnXDAnOworCQkJYWRkc3RyKGxpbmUyLCAmZGVmaW5lcyk7CisJCQlhZGRzdHIobGluZSwgJmRlZmluZXMpOworCQl9CisJfQorCWZjbG9zZShmcCk7Cit9CisKKworaW50CittYXRjaChjaGFyICpuYW1lLCBjaGFyICpsaW5lKQoreworCWNoYXIgKnAsICpxOworCisJcCA9IG5hbWUsIHEgPSBsaW5lOworCXdoaWxlICgqcCkgeworCQlpZiAoKnArKyAhPSAqcSsrKQorCQkJcmV0dXJuIDA7CisJfQorCWlmICgqcSAhPSAneycgJiYgKnEgIT0gJyAnICYmICpxICE9ICdcdCcgJiYgKnEgIT0gJ1xuJykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKworaW50Citnb29kZGVmaW5lKGNoYXIgKmxpbmUpCit7CisJY2hhciAqcDsKKworCWlmICghIG1hdGNoKCIjZGVmaW5lIiwgbGluZSkpCisJCXJldHVybiAwOwkJCS8qIG5vdCBhIGRlZmluZSAqLworCXAgPSBsaW5lICsgNzsKKwl3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisJCXArKzsKKwl3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcdCcpIHsKKwkJaWYgKCpwID09ICcoJykKKwkJCXJldHVybiAwOwkJLyogbWFjcm8gZGVmaW5pdGlvbiAqLworCQlwKys7CisJfQorCXdoaWxlICgqcCAhPSAnXG4nICYmICpwICE9ICdcMCcpCisJCXArKzsKKwlpZiAocFstMV0gPT0gJ1xcJykKKwkJcmV0dXJuIDA7CQkJLyogbXVsdGktbGluZSBkZWZpbml0aW9uICovCisJcmV0dXJuIDE7Cit9CisKKwordm9pZAorZG9ldmVudChzdHJ1Y3QgZXZlbnQgKmVwLCBGSUxFICpmcCwgY2hhciAqZm5hbWUpCit7CisJY2hhciBsaW5lWzEwMjRdOworCWludCBpbmRlbnQ7CisJY2hhciAqcDsKKworCXNwcmludGYobGluZSwgIlxuICAgICAgLyogZnJvbSAlczogKi9cbiIsIGZuYW1lKTsKKwlhZGRzdHIobGluZSwgJmVwLT5jb2RlKTsKKwlhZGRzdHIoIiAgICAgIHtcbiIsICZlcC0+Y29kZSk7CisJZm9yICg7OykgeworCQlsaW5ubysrOworCQlpZiAoZmdldHMobGluZSwgc2l6ZW9mIGxpbmUsIGZwKSA9PSBOVUxMKQorCQkJZXJyb3IoIlVuZXhwZWN0ZWQgRU9GIik7CisJCWlmIChlcXVhbChsaW5lLCAifVxuIikpCisJCQlicmVhazsKKwkJaW5kZW50ID0gNjsKKwkJZm9yIChwID0gbGluZSA7ICpwID09ICdcdCcgOyBwKyspCisJCQlpbmRlbnQgKz0gODsKKwkJZm9yICggOyAqcCA9PSAnICcgOyBwKyspCisJCQlpbmRlbnQrKzsKKwkJaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJyMnKQorCQkJaW5kZW50ID0gMDsKKwkJd2hpbGUgKGluZGVudCA+PSA4KSB7CisJCQlhZGRjaGFyKCdcdCcsICZlcC0+Y29kZSk7CisJCQlpbmRlbnQgLT0gODsKKwkJfQorCQl3aGlsZSAoaW5kZW50ID4gMCkgeworCQkJYWRkY2hhcignICcsICZlcC0+Y29kZSk7CisJCQlpbmRlbnQtLTsKKwkJfQorCQlhZGRzdHIocCwgJmVwLT5jb2RlKTsKKwl9CisJYWRkc3RyKCIgICAgICB9XG4iLCAmZXAtPmNvZGUpOworfQorCisKK3ZvaWQKK2RvaW5jbHVkZShjaGFyICpsaW5lKQoreworCWNoYXIgKnA7CisJY2hhciAqbmFtZTsKKwljaGFyICoqcHA7CisKKwlmb3IgKHAgPSBsaW5lIDsgKnAgIT0gJyInICYmICpwICE9ICc8JyAmJiAqcCAhPSAnXDAnIDsgcCsrKTsKKwlpZiAoKnAgPT0gJ1wwJykKKwkJZXJyb3IoIkV4cGVjdGluZyAnXCInIG9yICc8JyIpOworCW5hbWUgPSBwOworCXdoaWxlICgqcCAhPSAnICcgJiYgKnAgIT0gJ1x0JyAmJiAqcCAhPSAnXG4nKQorCQlwKys7CisJaWYgKHBbLTFdICE9ICciJyAmJiBwWy0xXSAhPSAnPicpCisJCWVycm9yKCJNaXNzaW5nIHRlcm1pbmF0b3IiKTsKKwkqcCA9ICdcMCc7CisKKwkvKiBuYW1lIG5vdyBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgaW5jbHVkZSBmaWxlICovCisJZm9yIChwcCA9IGhlYWRlcl9maWxlcyA7ICpwcCAmJiAhIGVxdWFsKCpwcCwgbmFtZSkgOyBwcCsrKTsKKwlpZiAoKnBwID09IE5VTEwpCisJCSpwcCA9IHNhdmVzdHIobmFtZSk7Cit9CisKKwordm9pZAorZG9kZWNsKGNoYXIgKmxpbmUxLCBGSUxFICpmcCkKK3sKKwljaGFyIGxpbmVbMTAyNF07CisJY2hhciAqcCwgKnE7CisKKwlpZiAoc3RyY21wKGxpbmUxLCAiTUtJTklUXG4iKSA9PSAwKSB7IC8qIHN0YXJ0IG9mIHN0cnVjdC91bmlvbiBkZWNsICovCisJCWFkZGNoYXIoJ1xuJywgJmRlY2xzKTsKKwkJZG8geworCQkJbGlubm8rKzsKKwkJCWlmIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgZnApID09IE5VTEwpCisJCQkJZXJyb3IoIlVudGVybWluYXRlZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24iKTsKKwkJCWFkZHN0cihsaW5lLCAmZGVjbHMpOworCQl9IHdoaWxlIChsaW5lWzBdICE9ICd9Jyk7CisJCWFtaWRkZWNscyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKCEgYW1pZGRlY2xzKQorCQkJYWRkY2hhcignXG4nLCAmZGVjbHMpOworCQlxID0gTlVMTDsKKwkJZm9yIChwID0gbGluZTEgKyA2IDsgKnAgJiYgc3RyY2hyKCI9L1xuIiwgKnApID09IE5VTEw7IHArKykKKwkJCWNvbnRpbnVlOworCQlpZiAoKnAgPT0gJz0nKSB7CQkvKiBlbGltaW5hdGUgaW5pdGlhbGl6YXRpb24gKi8KKwkJCWZvciAocSA9IHAgOyAqcSAmJiAqcSAhPSAnOycgOyBxKyspOworCQkJaWYgKCpxID09ICdcMCcpCisJCQkJcSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQl3aGlsZSAocFstMV0gPT0gJyAnKQorCQkJCQlwLS07CisJCQkJKnAgPSAnXDAnOworCQkJfQorCQl9CisJCWFkZHN0cigiZXh0ZXJuIiwgJmRlY2xzKTsKKwkJYWRkc3RyKGxpbmUxICsgNiwgJmRlY2xzKTsKKwkJaWYgKHEgIT0gTlVMTCkKKwkJCWFkZHN0cihxLCAmZGVjbHMpOworCQlhbWlkZGVjbHMgPSAxOworCX0KK30KKworCisKKy8qCisgKiBXcml0ZSB0aGUgb3V0cHV0IHRvIHRoZSBmaWxlIE9VVFRFTVAuCisgKi8KKwordm9pZAorb3V0cHV0KHZvaWQpCit7CisJRklMRSAqZnA7CisJY2hhciAqKnBwOworCXN0cnVjdCBldmVudCAqZXA7CisKKwlmcCA9IGNrZm9wZW4oT1VUVEVNUCwgInciKTsKKwlmcHV0cyh3cml0ZXIsIGZwKTsKKwlmb3IgKHBwID0gaGVhZGVyX2ZpbGVzIDsgKnBwIDsgcHArKykKKwkJZnByaW50ZihmcCwgIiNpbmNsdWRlICVzXG4iLCAqcHApOworCWZwdXRzKCJcblxuXG4iLCBmcCk7CisJd3JpdGV0ZXh0KCZkZWZpbmVzLCBmcCk7CisJZnB1dHMoIlxuXG4iLCBmcCk7CisJd3JpdGV0ZXh0KCZkZWNscywgZnApOworCWZvciAoZXAgPSBldmVudCA7IGVwLT5uYW1lIDsgZXArKykgeworCQlmcHV0cygiXG5cblxuIiwgZnApOworCQlmcHV0cyhlcC0+Y29tbWVudCwgZnApOworCQlmcHJpbnRmKGZwLCAiXG52b2lkXG4lcygpIHtcbiIsIGVwLT5yb3V0aW5lKTsKKwkJd3JpdGV0ZXh0KCZlcC0+Y29kZSwgZnApOworCQlmcHJpbnRmKGZwLCAifVxuIik7CisJfQorCWZjbG9zZShmcCk7Cit9CisKKworLyoKKyAqIEEgdGV4dCBzdHJ1Y3R1cmUgaXMgc2ltcGx5IGEgYmxvY2sgb2YgdGV4dCB0aGF0IGlzIGtlcHQgaW4gbWVtb3J5LgorICogQWRkc3RyIGFwcGVuZHMgYSBzdHJpbmcgdG8gdGhlIHRleHQgc3RydWN0LCBhbmQgYWRkY2hhciBhcHBlbmRzIGEgc2luZ2xlCisgKiBjaGFyYWN0ZXIuCisgKi8KKwordm9pZAorYWRkc3RyKGNoYXIgKnMsIHN0cnVjdCB0ZXh0ICp0ZXh0KQoreworCXdoaWxlICgqcykgeworCQlpZiAoLS10ZXh0LT5ubGVmdCA8IDApCisJCQlhZGRjaGFyKCpzKyssIHRleHQpOworCQllbHNlCisJCQkqdGV4dC0+bmV4dGMrKyA9ICpzKys7CisJfQorfQorCisKK3ZvaWQKK2FkZGNoYXIoaW50IGMsIHN0cnVjdCB0ZXh0ICp0ZXh0KQoreworCXN0cnVjdCBibG9jayAqYnA7CisKKwlpZiAoLS10ZXh0LT5ubGVmdCA8IDApIHsKKwkJYnAgPSBja21hbGxvYyhzaXplb2YgKmJwKTsKKwkJaWYgKHRleHQtPnN0YXJ0ID09IE5VTEwpCisJCQl0ZXh0LT5zdGFydCA9IGJwOworCQllbHNlCisJCQl0ZXh0LT5sYXN0LT5uZXh0ID0gYnA7CisJCXRleHQtPmxhc3QgPSBicDsKKwkJdGV4dC0+bmV4dGMgPSBicC0+dGV4dDsKKwkJdGV4dC0+bmxlZnQgPSBCTE9DS1NJWkUgLSAxOworCX0KKwkqdGV4dC0+bmV4dGMrKyA9IGM7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgY29udGVudHMgb2YgYSB0ZXh0IHN0cnVjdHVyZSB0byBhIGZpbGUuCisgKi8KK3ZvaWQKK3dyaXRldGV4dChzdHJ1Y3QgdGV4dCAqdGV4dCwgRklMRSAqZnApCit7CisJc3RydWN0IGJsb2NrICpicDsKKworCWlmICh0ZXh0LT5zdGFydCAhPSBOVUxMKSB7CisJCWZvciAoYnAgPSB0ZXh0LT5zdGFydCA7IGJwICE9IHRleHQtPmxhc3QgOyBicCA9IGJwLT5uZXh0KQorCQkJZndyaXRlKGJwLT50ZXh0LCBzaXplb2YgKGNoYXIpLCBCTE9DS1NJWkUsIGZwKTsKKwkJZndyaXRlKGJwLT50ZXh0LCBzaXplb2YgKGNoYXIpLCBCTE9DS1NJWkUgLSB0ZXh0LT5ubGVmdCwgZnApOworCX0KK30KKworRklMRSAqCitja2ZvcGVuKGNoYXIgKmZpbGUsIGNoYXIgKm1vZGUpCit7CisJRklMRSAqZnA7CisKKwlpZiAoKGZwID0gZm9wZW4oZmlsZSwgbW9kZSkpID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuICVzXG4iLCBmaWxlKTsKKwkJZXhpdCgyKTsKKwl9CisJcmV0dXJuIGZwOworfQorCit2b2lkICoKK2NrbWFsbG9jKGludCBuYnl0ZXMpCit7CisJY2hhciAqcDsKKworCWlmICgocCA9IG1hbGxvYyhuYnl0ZXMpKSA9PSBOVUxMKQorCQllcnJvcigiT3V0IG9mIHNwYWNlIik7CisJcmV0dXJuIHA7Cit9CisKK2NoYXIgKgorc2F2ZXN0cihjaGFyICpzKQoreworCWNoYXIgKnA7CisKKwlwID0gY2ttYWxsb2Moc3RybGVuKHMpICsgMSk7CisJc3RyY3B5KHAsIHMpOworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZAorZXJyb3IoY2hhciAqbXNnKQoreworCWlmIChjdXJmaWxlICE9IE5VTEwpCisJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIGN1cmZpbGUsIGxpbm5vKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpOworCWV4aXQoMik7CisJLyogTk9UUkVBQ0hFRCAqLworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWtub2Rlcy5jIGIvdXNyL2Rhc2gvbWtub2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDNhNjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9ta25vZGVzLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIHJlYWRzIHRoZSBub2RldHlwZXMgZmlsZSBhbmQgbm9kZXMuYy5wYXQgZmlsZS4gIEl0IGdlbmVyYXRlcworICogdGhlIGZpbGVzIG5vZGVzLmggYW5kIG5vZGVzLmMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNkZWZpbmUgTUFYVFlQRVMgNTAJCS8qIG1heCBudW1iZXIgb2Ygbm9kZSB0eXBlcyAqLworI2RlZmluZSBNQVhGSUVMRFMgMjAJCS8qIG1heCBmaWVsZHMgaW4gYSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQlVGTEVOIDEwMAkJLyogc2l6ZSBvZiBjaGFyYWN0ZXIgYnVmZmVycyAqLworCisvKiBmaWVsZCB0eXBlcyAqLworI2RlZmluZSBUX05PREUgMQkJLyogdW5pb24gbm9kZSAqZmllbGQgKi8KKyNkZWZpbmUgVF9OT0RFTElTVCAyCQkvKiBzdHJ1Y3Qgbm9kZWxpc3QgKmZpZWxkICovCisjZGVmaW5lIFRfU1RSSU5HIDMKKyNkZWZpbmUgVF9JTlQgNAkJCS8qIGludCBmaWVsZCAqLworI2RlZmluZSBUX09USEVSIDUJCS8qIG90aGVyICovCisjZGVmaW5lIFRfVEVNUCA2CQkvKiBkb24ndCBjb3B5IHRoaXMgZmllbGQgKi8KKworCitzdHJ1Y3QgZmllbGQgewkJCS8qIGEgc3RydWN0dXJlIGZpZWxkICovCisJY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgZmllbGQgKi8KKwlpbnQgdHlwZTsJCQkvKiB0eXBlIG9mIGZpZWxkICovCisJY2hhciAqZGVjbDsJCS8qIGRlY2xhcmF0aW9uIG9mIGZpZWxkICovCit9OworCisKK3N0cnVjdCBzdHIgewkJCS8qIHN0cnVjdCByZXByZXNlbnRpbmcgYSBub2RlIHN0cnVjdHVyZSAqLworCWNoYXIgKnRhZzsJCS8qIHN0cnVjdHVyZSB0YWcgKi8KKwlpbnQgbmZpZWxkczsJCS8qIG51bWJlciBvZiBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZSAqLworCXN0cnVjdCBmaWVsZCBmaWVsZFtNQVhGSUVMRFNdOwkvKiB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwlpbnQgZG9uZTsJCQkvKiBzZXQgaWYgZnVsbHkgcGFyc2VkICovCit9OworCisKK3N0YXRpYyBpbnQgbnR5cGVzOwkJCS8qIG51bWJlciBvZiBub2RlIHR5cGVzICovCitzdGF0aWMgY2hhciAqbm9kZW5hbWVbTUFYVFlQRVNdOwkvKiBuYW1lcyBvZiB0aGUgbm9kZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RyICpub2Rlc3RyW01BWFRZUEVTXTsJLyogdHlwZSBvZiBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgbm9kZSAqLworc3RhdGljIGludCBuc3RyOwkJCS8qIG51bWJlciBvZiBzdHJ1Y3R1cmVzICovCitzdGF0aWMgc3RydWN0IHN0ciBzdHJbTUFYVFlQRVNdOwkvKiB0aGUgc3RydWN0dXJlcyAqLworc3RhdGljIHN0cnVjdCBzdHIgKmN1cnN0cjsJCS8qIGN1cnJlbnQgc3RydWN0dXJlICovCitzdGF0aWMgRklMRSAqaW5mcDsKK3N0YXRpYyBjaGFyIGxpbmVbMTAyNF07CitzdGF0aWMgaW50IGxpbm5vOworc3RhdGljIGNoYXIgKmxpbmVwOworCitzdGF0aWMgdm9pZCBwYXJzZW5vZGUodm9pZCk7CitzdGF0aWMgdm9pZCBwYXJzZWZpZWxkKHZvaWQpOworc3RhdGljIHZvaWQgb3V0cHV0KGNoYXIgKik7CitzdGF0aWMgdm9pZCBvdXRzaXplcyhGSUxFICopOworc3RhdGljIHZvaWQgb3V0ZnVuYyhGSUxFICosIGludCk7CitzdGF0aWMgdm9pZCBpbmRlbnQoaW50LCBGSUxFICopOworc3RhdGljIGludCBuZXh0ZmllbGQoY2hhciAqKTsKK3N0YXRpYyB2b2lkIHNraXBibCh2b2lkKTsKK3N0YXRpYyBpbnQgcmVhZGxpbmUodm9pZCk7CitzdGF0aWMgdm9pZCBlcnJvcihjb25zdCBjaGFyICosIC4uLik7CitzdGF0aWMgY2hhciAqc2F2ZXN0cihjb25zdCBjaGFyICopOworaW50IG1haW4oaW50LCBjaGFyICoqKTsKKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCisJLyoKKwkgKiBzb21lIHZlcnNpb25zIG9mIGxpbnV4IGNvbXBsYWluOiBpbml0aWFsaXplciBlbGVtZW50IGlzIG5vdAorCSAqIGNvbnN0YW50IGlmIHRoaXMgaXMgZG9uZSBhdCBjb21waWxlIHRpbWUuCisJICovCisJaW5mcCA9IHN0ZGluOworCisJaWYgKGFyZ2MgIT0gMykKKwkJZXJyb3IoInVzYWdlOiBta25vZGVzIGZpbGUiKTsKKwlpZiAoKGluZnAgPSBmb3Blbihhcmd2WzFdLCAiciIpKSA9PSBOVUxMKQorCQllcnJvcigiQ2FuJ3Qgb3BlbiAlcyIsIGFyZ3ZbMV0pOworCXdoaWxlIChyZWFkbGluZSgpKSB7CisJCWlmIChsaW5lWzBdID09ICcgJyB8fCBsaW5lWzBdID09ICdcdCcpCisJCQlwYXJzZWZpZWxkKCk7CisJCWVsc2UgaWYgKGxpbmVbMF0gIT0gJ1wwJykKKwkJCXBhcnNlbm9kZSgpOworCX0KKwlvdXRwdXQoYXJndlsyXSk7CisJZXhpdCgwKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworCitzdGF0aWMgdm9pZAorcGFyc2Vub2RlKHZvaWQpCit7CisJY2hhciBuYW1lW0JVRkxFTl07CisJY2hhciB0YWdbQlVGTEVOXTsKKwlzdHJ1Y3Qgc3RyICpzcDsKKworCWlmIChjdXJzdHIgJiYgY3Vyc3RyLT5uZmllbGRzID4gMCkKKwkJY3Vyc3RyLT5kb25lID0gMTsKKwluZXh0ZmllbGQobmFtZSk7CisJaWYgKCEgbmV4dGZpZWxkKHRhZykpCisJCWVycm9yKCJUYWcgZXhwZWN0ZWQiKTsKKwlpZiAoKmxpbmVwICE9ICdcMCcpCisJCWVycm9yKCJHYXJiYWdlIGF0IGVuZCBvZiBsaW5lIik7CisJbm9kZW5hbWVbbnR5cGVzXSA9IHNhdmVzdHIobmFtZSk7CisJZm9yIChzcCA9IHN0ciA7IHNwIDwgc3RyICsgbnN0ciA7IHNwKyspIHsKKwkJaWYgKHN0cmNtcChzcC0+dGFnLCB0YWcpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKHNwID49IHN0ciArIG5zdHIpIHsKKwkJc3AtPnRhZyA9IHNhdmVzdHIodGFnKTsKKwkJc3AtPm5maWVsZHMgPSAwOworCQljdXJzdHIgPSBzcDsKKwkJbnN0cisrOworCX0KKwlub2Rlc3RyW250eXBlc10gPSBzcDsKKwludHlwZXMrKzsKK30KKworCitzdGF0aWMgdm9pZAorcGFyc2VmaWVsZCh2b2lkKQoreworCWNoYXIgbmFtZVtCVUZMRU5dOworCWNoYXIgdHlwZVtCVUZMRU5dOworCWNoYXIgZGVjbFsyICogQlVGTEVOXTsKKwlzdHJ1Y3QgZmllbGQgKmZwOworCisJaWYgKGN1cnN0ciA9PSBOVUxMIHx8IGN1cnN0ci0+ZG9uZSkKKwkJZXJyb3IoIk5vIGN1cnJlbnQgc3RydWN0dXJlIHRvIGFkZCBmaWVsZCB0byIpOworCWlmICghIG5leHRmaWVsZChuYW1lKSkKKwkJZXJyb3IoIk5vIGZpZWxkIG5hbWUiKTsKKwlpZiAoISBuZXh0ZmllbGQodHlwZSkpCisJCWVycm9yKCJObyBmaWVsZCB0eXBlIik7CisJZnAgPSAmY3Vyc3RyLT5maWVsZFtjdXJzdHItPm5maWVsZHNdOworCWZwLT5uYW1lID0gc2F2ZXN0cihuYW1lKTsKKwlpZiAoc3RyY21wKHR5cGUsICJub2RlcHRyIikgPT0gMCkgeworCQlmcC0+dHlwZSA9IFRfTk9ERTsKKwkJc3ByaW50ZihkZWNsLCAidW5pb24gbm9kZSAqJXMiLCBuYW1lKTsKKwl9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAibm9kZWxpc3QiKSA9PSAwKSB7CisJCWZwLT50eXBlID0gVF9OT0RFTElTVDsKKwkJc3ByaW50ZihkZWNsLCAic3RydWN0IG5vZGVsaXN0IColcyIsIG5hbWUpOworCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJzdHJpbmciKSA9PSAwKSB7CisJCWZwLT50eXBlID0gVF9TVFJJTkc7CisJCXNwcmludGYoZGVjbCwgImNoYXIgKiVzIiwgbmFtZSk7CisJfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgImludCIpID09IDApIHsKKwkJZnAtPnR5cGUgPSBUX0lOVDsKKwkJc3ByaW50ZihkZWNsLCAiaW50ICVzIiwgbmFtZSk7CisJfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIm90aGVyIikgPT0gMCkgeworCQlmcC0+dHlwZSA9IFRfT1RIRVI7CisJfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgInRlbXAiKSA9PSAwKSB7CisJCWZwLT50eXBlID0gVF9URU1QOworCX0gZWxzZSB7CisJCWVycm9yKCJVbmtub3duIHR5cGUgJXMiLCB0eXBlKTsKKwl9CisJaWYgKGZwLT50eXBlID09IFRfT1RIRVIgfHwgZnAtPnR5cGUgPT0gVF9URU1QKSB7CisJCXNraXBibCgpOworCQlmcC0+ZGVjbCA9IHNhdmVzdHIobGluZXApOworCX0gZWxzZSB7CisJCWlmICgqbGluZXApCisJCQllcnJvcigiR2FyYmFnZSBhdCBlbmQgb2YgbGluZSIpOworCQlmcC0+ZGVjbCA9IHNhdmVzdHIoZGVjbCk7CisJfQorCWN1cnN0ci0+bmZpZWxkcysrOworfQorCisKK2NoYXIgd3JpdGVyW10gPSAiXAorLypcblwKKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBta25vZGVzIHByb2dyYW0uXG5cCisgKi9cblwKK1xuIjsKKworc3RhdGljIHZvaWQKK291dHB1dChjaGFyICpmaWxlKQoreworCUZJTEUgKmhmaWxlOworCUZJTEUgKmNmaWxlOworCUZJTEUgKnBhdGZpbGU7CisJaW50IGk7CisJc3RydWN0IHN0ciAqc3A7CisJc3RydWN0IGZpZWxkICpmcDsKKwljaGFyICpwOworCisJaWYgKChwYXRmaWxlID0gZm9wZW4oZmlsZSwgInIiKSkgPT0gTlVMTCkKKwkJZXJyb3IoIkNhbid0IG9wZW4gJXMiLCBmaWxlKTsKKwlpZiAoKGhmaWxlID0gZm9wZW4oIm5vZGVzLmgiLCAidyIpKSA9PSBOVUxMKQorCQllcnJvcigiQ2FuJ3QgY3JlYXRlIG5vZGVzLmgiKTsKKwlpZiAoKGNmaWxlID0gZm9wZW4oIm5vZGVzLmMiLCAidyIpKSA9PSBOVUxMKQorCQllcnJvcigiQ2FuJ3QgY3JlYXRlIG5vZGVzLmMiKTsKKwlmcHV0cyh3cml0ZXIsIGhmaWxlKTsKKwlmb3IgKGkgPSAwIDsgaSA8IG50eXBlcyA7IGkrKykKKwkJZnByaW50ZihoZmlsZSwgIiNkZWZpbmUgJXMgJWRcbiIsIG5vZGVuYW1lW2ldLCBpKTsKKwlmcHV0cygiXG5cblxuIiwgaGZpbGUpOworCWZvciAoc3AgPSBzdHIgOyBzcCA8ICZzdHJbbnN0cl0gOyBzcCsrKSB7CisJCWZwcmludGYoaGZpbGUsICJzdHJ1Y3QgJXMge1xuIiwgc3AtPnRhZyk7CisJCWZvciAoaSA9IHNwLT5uZmllbGRzLCBmcCA9IHNwLT5maWVsZCA7IC0taSA+PSAwIDsgZnArKykgeworCQkJZnByaW50ZihoZmlsZSwgIiAgICAgICVzO1xuIiwgZnAtPmRlY2wpOworCQl9CisJCWZwdXRzKCJ9O1xuXG5cbiIsIGhmaWxlKTsKKwl9CisJZnB1dHMoInVuaW9uIG5vZGUge1xuIiwgaGZpbGUpOworCWZwcmludGYoaGZpbGUsICIgICAgICBpbnQgdHlwZTtcbiIpOworCWZvciAoc3AgPSBzdHIgOyBzcCA8ICZzdHJbbnN0cl0gOyBzcCsrKSB7CisJCWZwcmludGYoaGZpbGUsICIgICAgICBzdHJ1Y3QgJXMgJXM7XG4iLCBzcC0+dGFnLCBzcC0+dGFnKTsKKwl9CisJZnB1dHMoIn07XG5cblxuIiwgaGZpbGUpOworCWZwdXRzKCJzdHJ1Y3Qgbm9kZWxpc3Qge1xuIiwgaGZpbGUpOworCWZwdXRzKCJcdHN0cnVjdCBub2RlbGlzdCAqbmV4dDtcbiIsIGhmaWxlKTsKKwlmcHV0cygiXHR1bmlvbiBub2RlICpuO1xuIiwgaGZpbGUpOworCWZwdXRzKCJ9O1xuXG5cbiIsIGhmaWxlKTsKKwlmcHV0cygic3RydWN0IGZ1bmNub2RlIHtcbiIsIGhmaWxlKTsKKwlmcHV0cygiXHRpbnQgY291bnQ7XG4iLCBoZmlsZSk7CisJZnB1dHMoIlx0dW5pb24gbm9kZSBuO1xuIiwgaGZpbGUpOworCWZwdXRzKCJ9O1xuXG5cbiIsIGhmaWxlKTsKKwlmcHV0cygic3RydWN0IGZ1bmNub2RlICpjb3B5ZnVuYyh1bmlvbiBub2RlICopO1xuIiwgaGZpbGUpOworCWZwdXRzKCJ2b2lkIGZyZWVmdW5jKHN0cnVjdCBmdW5jbm9kZSAqKTtcbiIsIGhmaWxlKTsKKworCWZwdXRzKHdyaXRlciwgY2ZpbGUpOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YgbGluZSwgcGF0ZmlsZSkgIT0gTlVMTCkgeworCQlmb3IgKHAgPSBsaW5lIDsgKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgOyBwKyspOworCQlpZiAoc3RyY21wKHAsICIlU0laRVNcbiIpID09IDApCisJCQlvdXRzaXplcyhjZmlsZSk7CisJCWVsc2UgaWYgKHN0cmNtcChwLCAiJUNBTENTSVpFXG4iKSA9PSAwKQorCQkJb3V0ZnVuYyhjZmlsZSwgMSk7CisJCWVsc2UgaWYgKHN0cmNtcChwLCAiJUNPUFlcbiIpID09IDApCisJCQlvdXRmdW5jKGNmaWxlLCAwKTsKKwkJZWxzZQorCQkJZnB1dHMobGluZSwgY2ZpbGUpOworCX0KK30KKworCisKK3N0YXRpYyB2b2lkCitvdXRzaXplcyhGSUxFICpjZmlsZSkKK3sKKwlpbnQgaTsKKworCWZwcmludGYoY2ZpbGUsICJzdGF0aWMgY29uc3Qgc2hvcnQgbm9kZXNpemVbJWRdID0ge1xuIiwgbnR5cGVzKTsKKwlmb3IgKGkgPSAwIDsgaSA8IG50eXBlcyA7IGkrKykgeworCQlmcHJpbnRmKGNmaWxlLCAiICAgICAgU0hFTExfQUxJR04oc2l6ZW9mIChzdHJ1Y3QgJXMpKSxcbiIsCisJCSAgICBub2Rlc3RyW2ldLT50YWcpOworCX0KKwlmcHJpbnRmKGNmaWxlLCAifTtcbiIpOworfQorCisKK3N0YXRpYyB2b2lkCitvdXRmdW5jKEZJTEUgKmNmaWxlLCBpbnQgY2FsY3NpemUpCit7CisJc3RydWN0IHN0ciAqc3A7CisJc3RydWN0IGZpZWxkICpmcDsKKwlpbnQgaTsKKworCWZwdXRzKCIgICAgICBpZiAobiA9PSBOVUxMKVxuIiwgY2ZpbGUpOworCWlmIChjYWxjc2l6ZSkKKwkJZnB1dHMoIgkgICAgcmV0dXJuO1xuIiwgY2ZpbGUpOworCWVsc2UKKwkJZnB1dHMoIgkgICAgcmV0dXJuIE5VTEw7XG4iLCBjZmlsZSk7CisJaWYgKGNhbGNzaXplKQorCQlmcHV0cygiICAgICAgZnVuY2Jsb2Nrc2l6ZSArPSBub2Rlc2l6ZVtuLT50eXBlXTtcbiIsIGNmaWxlKTsKKwllbHNlIHsKKwkJZnB1dHMoIiAgICAgIG5ldyA9IGZ1bmNibG9jaztcbiIsIGNmaWxlKTsKKwkJZnB1dHMoIiAgICAgIGZ1bmNibG9jayA9IChjaGFyICopIGZ1bmNibG9jayArIG5vZGVzaXplW24tPnR5cGVdO1xuIiwgY2ZpbGUpOworCX0KKwlmcHV0cygiICAgICAgc3dpdGNoIChuLT50eXBlKSB7XG4iLCBjZmlsZSk7CisJZm9yIChzcCA9IHN0ciA7IHNwIDwgJnN0cltuc3RyXSA7IHNwKyspIHsKKwkJZm9yIChpID0gMCA7IGkgPCBudHlwZXMgOyBpKyspIHsKKwkJCWlmIChub2Rlc3RyW2ldID09IHNwKQorCQkJCWZwcmludGYoY2ZpbGUsICIgICAgICBjYXNlICVzOlxuIiwgbm9kZW5hbWVbaV0pOworCQl9CisJCWZvciAoaSA9IHNwLT5uZmllbGRzIDsgLS1pID49IDEgOyApIHsKKwkJCWZwID0gJnNwLT5maWVsZFtpXTsKKwkJCXN3aXRjaCAoZnAtPnR5cGUpIHsKKwkJCWNhc2UgVF9OT0RFOgorCQkJCWlmIChjYWxjc2l6ZSkgeworCQkJCQlpbmRlbnQoMTIsIGNmaWxlKTsKKwkJCQkJZnByaW50ZihjZmlsZSwgImNhbGNzaXplKG4tPiVzLiVzKTtcbiIsCisJCQkJCQlzcC0+dGFnLCBmcC0+bmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW5kZW50KDEyLCBjZmlsZSk7CisJCQkJCWZwcmludGYoY2ZpbGUsICJuZXctPiVzLiVzID0gY29weW5vZGUobi0+JXMuJXMpO1xuIiwKKwkJCQkJCXNwLT50YWcsIGZwLT5uYW1lLCBzcC0+dGFnLCBmcC0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUX05PREVMSVNUOgorCQkJCWlmIChjYWxjc2l6ZSkgeworCQkJCQlpbmRlbnQoMTIsIGNmaWxlKTsKKwkJCQkJZnByaW50ZihjZmlsZSwgInNpemVub2RlbGlzdChuLT4lcy4lcyk7XG4iLAorCQkJCQkJc3AtPnRhZywgZnAtPm5hbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCWluZGVudCgxMiwgY2ZpbGUpOworCQkJCQlmcHJpbnRmKGNmaWxlLCAibmV3LT4lcy4lcyA9IGNvcHlub2RlbGlzdChuLT4lcy4lcyk7XG4iLAorCQkJCQkJc3AtPnRhZywgZnAtPm5hbWUsIHNwLT50YWcsIGZwLT5uYW1lKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRfU1RSSU5HOgorCQkJCWlmIChjYWxjc2l6ZSkgeworCQkJCQlpbmRlbnQoMTIsIGNmaWxlKTsKKwkJCQkJZnByaW50ZihjZmlsZSwgImZ1bmNzdHJpbmdzaXplICs9IHN0cmxlbihuLT4lcy4lcykgKyAxO1xuIiwKKwkJCQkJCXNwLT50YWcsIGZwLT5uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbmRlbnQoMTIsIGNmaWxlKTsKKwkJCQkJZnByaW50ZihjZmlsZSwgIm5ldy0+JXMuJXMgPSBub2Rlc2F2ZXN0cihuLT4lcy4lcyk7XG4iLAorCQkJCQkJc3AtPnRhZywgZnAtPm5hbWUsIHNwLT50YWcsIGZwLT5uYW1lKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRfSU5UOgorCQkJY2FzZSBUX09USEVSOgorCQkJCWlmICghIGNhbGNzaXplKSB7CisJCQkJCWluZGVudCgxMiwgY2ZpbGUpOworCQkJCQlmcHJpbnRmKGNmaWxlLCAibmV3LT4lcy4lcyA9IG4tPiVzLiVzO1xuIiwKKwkJCQkJCXNwLT50YWcsIGZwLT5uYW1lLCBzcC0+dGFnLCBmcC0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWluZGVudCgxMiwgY2ZpbGUpOworCQlmcHV0cygiYnJlYWs7XG4iLCBjZmlsZSk7CisJfQorCWZwdXRzKCIgICAgICB9O1xuIiwgY2ZpbGUpOworCWlmICghIGNhbGNzaXplKQorCQlmcHV0cygiICAgICAgbmV3LT50eXBlID0gbi0+dHlwZTtcbiIsIGNmaWxlKTsKK30KKworCitzdGF0aWMgdm9pZAoraW5kZW50KGludCBhbW91bnQsIEZJTEUgKmZwKQoreworCXdoaWxlIChhbW91bnQgPj0gOCkgeworCQlwdXRjKCdcdCcsIGZwKTsKKwkJYW1vdW50IC09IDg7CisJfQorCXdoaWxlICgtLWFtb3VudCA+PSAwKSB7CisJCXB1dGMoJyAnLCBmcCk7CisJfQorfQorCisKK3N0YXRpYyBpbnQKK25leHRmaWVsZChjaGFyICpidWYpCit7CisJY2hhciAqcCwgKnE7CisKKwlwID0gbGluZXA7CisJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQlwKys7CisJcSA9IGJ1ZjsKKwl3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcdCcgJiYgKnAgIT0gJ1wwJykKKwkJKnErKyA9ICpwKys7CisJKnEgPSAnXDAnOworCWxpbmVwID0gcDsKKwlyZXR1cm4gKHEgPiBidWYpOworfQorCisKK3N0YXRpYyB2b2lkCitza2lwYmwodm9pZCkKK3sKKwl3aGlsZSAoKmxpbmVwID09ICcgJyB8fCAqbGluZXAgPT0gJ1x0JykKKwkJbGluZXArKzsKK30KKworCitzdGF0aWMgaW50CityZWFkbGluZSh2b2lkKQoreworCWNoYXIgKnA7CisKKwlpZiAoZmdldHMobGluZSwgMTAyNCwgaW5mcCkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZm9yIChwID0gbGluZSA7ICpwICE9ICcjJyAmJiAqcCAhPSAnXG4nICYmICpwICE9ICdcMCcgOyBwKyspOworCXdoaWxlIChwID4gbGluZSAmJiAocFstMV0gPT0gJyAnIHx8IHBbLTFdID09ICdcdCcpKQorCQlwLS07CisJKnAgPSAnXDAnOworCWxpbmVwID0gbGluZTsKKwlsaW5ubysrOworCWlmIChwIC0gbGluZSA+IEJVRkxFTikKKwkJZXJyb3IoIkxpbmUgdG9vIGxvbmciKTsKKwlyZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyB2b2lkCitlcnJvcihjb25zdCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQodmEsIG1zZyk7CisKKwkodm9pZCkgZnByaW50ZihzdGRlcnIsICJsaW5lICVkOiAiLCBsaW5ubyk7CisJKHZvaWQpIHZmcHJpbnRmKHN0ZGVyciwgbXNnLCB2YSk7CisJKHZvaWQpIGZwdXRjKCdcbicsIHN0ZGVycik7CisKKwl2YV9lbmQodmEpOworCisJZXhpdCgyKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKworCitzdGF0aWMgY2hhciAqCitzYXZlc3RyKGNvbnN0IGNoYXIgKnMpCit7CisJY2hhciAqcDsKKworCWlmICgocCA9IG1hbGxvYyhzdHJsZW4ocykgKyAxKSkgPT0gTlVMTCkKKwkJZXJyb3IoIk91dCBvZiBzcGFjZSIpOworCSh2b2lkKSBzdHJjcHkocCwgcyk7CisJcmV0dXJuIHA7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9ta3N5bnRheC5jIGIvdXNyL2Rhc2gvbWtzeW50YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YThhOWFlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWtzeW50YXguYwpAQCAtMCwwICsxLDMxNSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gY3JlYXRlcyBzeW50YXguaCBhbmQgc3ludGF4LmMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAicGFyc2VyLmgiCisKKworc3RydWN0IHN5bmNsYXNzIHsKKwljaGFyICpuYW1lOworCWNoYXIgKmNvbW1lbnQ7Cit9OworCisvKiBTeW50YXggY2xhc3NlcyAqLworc3RydWN0IHN5bmNsYXNzIHN5bmNsYXNzW10gPSB7CisJeyAiQ1dPUkQiLAkiY2hhcmFjdGVyIGlzIG5vdGhpbmcgc3BlY2lhbCIgfSwKKwl7ICJDTkwiLAkibmV3bGluZSBjaGFyYWN0ZXIiIH0sCisJeyAiQ0JBQ0siLAkiYSBiYWNrc2xhc2ggY2hhcmFjdGVyIiB9LAorCXsgIkNTUVVPVEUiLAkic2luZ2xlIHF1b3RlIiB9LAorCXsgIkNEUVVPVEUiLAkiZG91YmxlIHF1b3RlIiB9LAorCXsgIkNFTkRRVU9URSIsCSJhIHRlcm1pbmF0aW5nIHF1b3RlIiB9LAorCXsgIkNCUVVPVEUiLAkiYmFja3dhcmRzIHNpbmdsZSBxdW90ZSIgfSwKKwl7ICJDVkFSIiwJImEgZG9sbGFyIHNpZ24iIH0sCisJeyAiQ0VORFZBUiIsCSJhICd9JyBjaGFyYWN0ZXIiIH0sCisJeyAiQ0xQIiwJImEgbGVmdCBwYXJlbiBpbiBhcml0aG1ldGljIiB9LAorCXsgIkNSUCIsCSJhIHJpZ2h0IHBhcmVuIGluIGFyaXRobWV0aWMiIH0sCisJeyAiQ0VPRiIsCSJlbmQgb2YgZmlsZSIgfSwKKwl7ICJDQ1RMIiwJImxpa2UgQ1dPUkQsIGV4Y2VwdCBpdCBtdXN0IGJlIGVzY2FwZWQiIH0sCisJeyAiQ1NQQ0wiLAkidGhlc2UgdGVybWluYXRlIGEgd29yZCIgfSwKKwl7ICJDSUdOIiwJImNoYXJhY3RlciBzaG91bGQgYmUgaWdub3JlZCIgfSwKKwl7IE5VTEwsCQlOVUxMIH0KK307CisKKworLyoKKyAqIFN5bnRheCBjbGFzc2VzIGZvciBpc18gZnVuY3Rpb25zLiAgV2FybmluZzogIGlmIHlvdSBhZGQgbmV3IGNsYXNzZXMKKyAqIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIGlzX2luX25hbWUgbWFjcm8uCisgKi8KK3N0cnVjdCBzeW5jbGFzcyBpc19lbnRyeVtdID0geworCXsgIklTRElHSVQiLAkiYSBkaWdpdCIgfSwKKwl7ICJJU1VQUEVSIiwJImFuIHVwcGVyIGNhc2UgbGV0dGVyIiB9LAorCXsgIklTTE9XRVIiLAkiYSBsb3dlciBjYXNlIGxldHRlciIgfSwKKwl7ICJJU1VOREVSIiwJImFuIHVuZGVyc2NvcmUiIH0sCisJeyAiSVNTUEVDTCIsCSJ0aGUgbmFtZSBvZiBhIHNwZWNpYWwgcGFyYW1ldGVyIiB9LAorCXsgTlVMTCwgCU5VTEwgfQorfTsKKworc3RhdGljIGNoYXIgd3JpdGVyW10gPSAiXAorLypcblwKKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBta3N5bnRheCBwcm9ncmFtLlxuXAorICovXG5cCitcbiI7CisKKworc3RhdGljIEZJTEUgKmNmaWxlOworc3RhdGljIEZJTEUgKmhmaWxlOworc3RhdGljIGNoYXIgKnN5bnRheFs1MTNdOworCitzdGF0aWMgdm9pZCBmaWxsdGFibGUoY2hhciAqKTsKK3N0YXRpYyB2b2lkIGluaXQodm9pZCk7CitzdGF0aWMgdm9pZCBhZGQoY2hhciAqLCBjaGFyICopOworc3RhdGljIHZvaWQgcHJpbnQoY2hhciAqKTsKK3N0YXRpYyB2b2lkIG91dHB1dF90eXBlX21hY3Jvcyh2b2lkKTsKK2ludCBtYWluKGludCwgY2hhciAqKik7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY2hhciBidWZbODBdOworCWludCBwb3M7CisKKwkvKiBDcmVhdGUgb3V0cHV0IGZpbGVzICovCisJaWYgKChjZmlsZSA9IGZvcGVuKCJzeW50YXguYyIsICJ3IikpID09IE5VTEwpIHsKKwkJcGVycm9yKCJzeW50YXguYyIpOworCQlleGl0KDIpOworCX0KKwlpZiAoKGhmaWxlID0gZm9wZW4oInN5bnRheC5oIiwgInciKSkgPT0gTlVMTCkgeworCQlwZXJyb3IoInN5bnRheC5oIik7CisJCWV4aXQoMik7CisJfQorCWZwdXRzKHdyaXRlciwgaGZpbGUpOworCWZwdXRzKHdyaXRlciwgY2ZpbGUpOworCisJZnB1dHMoIiNpbmNsdWRlIDxjdHlwZS5oPlxuIiwgaGZpbGUpOworCWZwdXRzKCJcbiIsIGhmaWxlKTsKKwlmcHV0cygiI2lmZGVmIENFT0ZcbiIsIGhmaWxlKTsKKwlmcHV0cygiI3VuZGVmIENFT0ZcbiIsIGhmaWxlKTsKKwlmcHV0cygiI2VuZGlmXG4iLCBoZmlsZSk7CisJZnB1dHMoIlxuIiwgaGZpbGUpOworCisJLyogR2VuZXJhdGUgdGhlICNkZWZpbmUgc3RhdGVtZW50cyBpbiB0aGUgaGVhZGVyIGZpbGUgKi8KKwlmcHV0cygiLyogU3ludGF4IGNsYXNzZXMgKi9cbiIsIGhmaWxlKTsKKwlmb3IgKGkgPSAwIDsgc3luY2xhc3NbaV0ubmFtZSA7IGkrKykgeworCQlzcHJpbnRmKGJ1ZiwgIiNkZWZpbmUgJXMgJWQiLCBzeW5jbGFzc1tpXS5uYW1lLCBpKTsKKwkJZnB1dHMoYnVmLCBoZmlsZSk7CisJCWZvciAocG9zID0gc3RybGVuKGJ1ZikgOyBwb3MgPCAzMiA7IHBvcyA9IChwb3MgKyA4KSAmIH4wNykKKwkJCXB1dGMoJ1x0JywgaGZpbGUpOworCQlmcHJpbnRmKGhmaWxlLCAiLyogJXMgKi9cbiIsIHN5bmNsYXNzW2ldLmNvbW1lbnQpOworCX0KKwlwdXRjKCdcbicsIGhmaWxlKTsKKwlmcHV0cygiLyogU3ludGF4IGNsYXNzZXMgZm9yIGlzXyBmdW5jdGlvbnMgKi9cbiIsIGhmaWxlKTsKKwlmb3IgKGkgPSAwIDsgaXNfZW50cnlbaV0ubmFtZSA7IGkrKykgeworCQlzcHJpbnRmKGJ1ZiwgIiNkZWZpbmUgJXMgJSNvIiwgaXNfZW50cnlbaV0ubmFtZSwgMSA8PCBpKTsKKwkJZnB1dHMoYnVmLCBoZmlsZSk7CisJCWZvciAocG9zID0gc3RybGVuKGJ1ZikgOyBwb3MgPCAzMiA7IHBvcyA9IChwb3MgKyA4KSAmIH4wNykKKwkJCXB1dGMoJ1x0JywgaGZpbGUpOworCQlmcHJpbnRmKGhmaWxlLCAiLyogJXMgKi9cbiIsIGlzX2VudHJ5W2ldLmNvbW1lbnQpOworCX0KKwlwdXRjKCdcbicsIGhmaWxlKTsKKwlmcHJpbnRmKGhmaWxlLCAiI2RlZmluZSBTWU5CQVNFICVkXG4iLCAxMzApOworCWZwcmludGYoaGZpbGUsICIjZGVmaW5lIFBFT0YgJWRcblxuIiwgLTEzMCk7CisJZnByaW50ZihoZmlsZSwgIiNkZWZpbmUgUEVPQSAlZFxuXG4iLCAtMTI5KTsKKwlwdXRjKCdcbicsIGhmaWxlKTsKKwlmcHV0cygiI2RlZmluZSBCQVNFU1lOVEFYIChiYXNlc3ludGF4ICsgU1lOQkFTRSlcbiIsIGhmaWxlKTsKKwlmcHV0cygiI2RlZmluZSBEUVNZTlRBWCAoZHFzeW50YXggKyBTWU5CQVNFKVxuIiwgaGZpbGUpOworCWZwdXRzKCIjZGVmaW5lIFNRU1lOVEFYIChzcXN5bnRheCArIFNZTkJBU0UpXG4iLCBoZmlsZSk7CisJZnB1dHMoIiNkZWZpbmUgQVJJU1lOVEFYIChhcmlzeW50YXggKyBTWU5CQVNFKVxuIiwgaGZpbGUpOworCXB1dGMoJ1xuJywgaGZpbGUpOworCW91dHB1dF90eXBlX21hY3JvcygpOwkJLyogaXNfZGlnaXQsIGV0Yy4gKi8KKwlwdXRjKCdcbicsIGhmaWxlKTsKKworCS8qIEdlbmVyYXRlIHRoZSBzeW50YXggdGFibGVzLiAqLworCWZwdXRzKCIjaW5jbHVkZSBcInNoZWxsLmhcIlxuIiwgY2ZpbGUpOworCWZwdXRzKCIjaW5jbHVkZSBcInN5bnRheC5oXCJcblxuIiwgY2ZpbGUpOworCWluaXQoKTsKKwlmcHV0cygiLyogc3ludGF4IHRhYmxlIHVzZWQgd2hlbiBub3QgaW4gcXVvdGVzICovXG4iLCBjZmlsZSk7CisJYWRkKCJcbiIsICJDTkwiKTsKKwlhZGQoIlxcIiwgIkNCQUNLIik7CisJYWRkKCInIiwgIkNTUVVPVEUiKTsKKwlhZGQoIlwiIiwgIkNEUVVPVEUiKTsKKwlhZGQoImAiLCAiQ0JRVU9URSIpOworCWFkZCgiJCIsICJDVkFSIik7CisJYWRkKCJ9IiwgIkNFTkRWQVIiKTsKKwlhZGQoIjw+KCk7JnwgXHQiLCAiQ1NQQ0wiKTsKKwlzeW50YXhbMV0gPSAiQ1NQQ0wiOworCXByaW50KCJiYXNlc3ludGF4Iik7CisJaW5pdCgpOworCWZwdXRzKCJcbi8qIHN5bnRheCB0YWJsZSB1c2VkIHdoZW4gaW4gZG91YmxlIHF1b3RlcyAqL1xuIiwgY2ZpbGUpOworCWFkZCgiXG4iLCAiQ05MIik7CisJYWRkKCJcXCIsICJDQkFDSyIpOworCWFkZCgiXCIiLCAiQ0VORFFVT1RFIik7CisJYWRkKCJgIiwgIkNCUVVPVEUiKTsKKwlhZGQoIiQiLCAiQ1ZBUiIpOworCWFkZCgifSIsICJDRU5EVkFSIik7CisJLyogJzovJyBmb3IgdGlsZGUgZXhwYW5zaW9uLCAnLScgZm9yIFthXC14XSBwYXR0ZXJuIHJhbmdlcyAqLworCWFkZCgiISo/Wz1+Oi8tXSIsICJDQ1RMIik7CisJcHJpbnQoImRxc3ludGF4Iik7CisJaW5pdCgpOworCWZwdXRzKCJcbi8qIHN5bnRheCB0YWJsZSB1c2VkIHdoZW4gaW4gc2luZ2xlIHF1b3RlcyAqL1xuIiwgY2ZpbGUpOworCWFkZCgiXG4iLCAiQ05MIik7CisJYWRkKCInIiwgIkNFTkRRVU9URSIpOworCS8qICc6LycgZm9yIHRpbGRlIGV4cGFuc2lvbiwgJy0nIGZvciBbYVwteF0gcGF0dGVybiByYW5nZXMgKi8KKwlhZGQoIiEqP1s9fjovLV1cXCIsICJDQ1RMIik7CisJcHJpbnQoInNxc3ludGF4Iik7CisJaW5pdCgpOworCWZwdXRzKCJcbi8qIHN5bnRheCB0YWJsZSB1c2VkIHdoZW4gaW4gYXJpdGhtZXRpYyAqL1xuIiwgY2ZpbGUpOworCWFkZCgiXG4iLCAiQ05MIik7CisJYWRkKCJcXCIsICJDQkFDSyIpOworCWFkZCgiYCIsICJDQlFVT1RFIik7CisJYWRkKCIkIiwgIkNWQVIiKTsKKwlhZGQoIn0iLCAiQ0VORFZBUiIpOworCWFkZCgiKCIsICJDTFAiKTsKKwlhZGQoIikiLCAiQ1JQIik7CisJcHJpbnQoImFyaXN5bnRheCIpOworCWZpbGx0YWJsZSgiMCIpOworCWZwdXRzKCJcbi8qIGNoYXJhY3RlciBjbGFzc2lmaWNhdGlvbiB0YWJsZSAqL1xuIiwgY2ZpbGUpOworCWFkZCgiMDEyMzQ1Njc4OSIsICJJU0RJR0lUIik7CisJYWRkKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHVjdnd4eXoiLCAiSVNMT1dFUiIpOworCWFkZCgiQUJDREVGR0hJSktMTU5PUFFSU1RVQ1ZXWFlaIiwgIklTVVBQRVIiKTsKKwlhZGQoIl8iLCAiSVNVTkRFUiIpOworCWFkZCgiIz8kIS0qQCIsICJJU1NQRUNMIik7CisJcHJpbnQoImlzX3R5cGUiKTsKKwlleGl0KDApOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworCisKKy8qCisgKiBDbGVhciB0aGUgc3ludGF4IHRhYmxlLgorICovCisKK3N0YXRpYyB2b2lkCitmaWxsdGFibGUoY2hhciAqZGZ0dmFsKQoreworCWludCBpOworCisJZm9yIChpID0gMCA7IGkgPCAyNTc7IGkrKykKKwkJc3ludGF4W2ldID0gZGZ0dmFsOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBzeW50YXggdGFibGUgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAqLworCitzdGF0aWMgdm9pZAoraW5pdCh2b2lkKQoreworCWludCBjdGw7CisKKwlmaWxsdGFibGUoIkNXT1JEIik7CisJc3ludGF4WzBdID0gIkNFT0YiOworCXN5bnRheFsxXSA9ICJDSUdOIjsKKwlmb3IgKGN0bCA9IENUTF9GSVJTVDsgY3RsIDw9IENUTF9MQVNUOyBjdGwrKyApCisJCXN5bnRheFsxMzAgKyBjdGxdID0gIkNDVEwiOworfQorCisKKy8qCisgKiBBZGQgZW50cmllcyB0byB0aGUgc3ludGF4IHRhYmxlLgorICovCisKK3N0YXRpYyB2b2lkCithZGQoY2hhciAqcCwgY2hhciAqdHlwZSkKK3sKKwl3aGlsZSAoKnApCisJCXN5bnRheFsoc2lnbmVkIGNoYXIpKnArKyArIDEzMF0gPSB0eXBlOworfQorCisKKworLyoKKyAqIE91dHB1dCB0aGUgc3ludGF4IHRhYmxlLgorICovCisKK3N0YXRpYyB2b2lkCitwcmludChjaGFyICpuYW1lKQoreworCWludCBpOworCWludCBjb2w7CisKKwlmcHJpbnRmKGhmaWxlLCAiZXh0ZXJuIGNvbnN0IGNoYXIgJXNbXTtcbiIsIG5hbWUpOworCWZwcmludGYoY2ZpbGUsICJjb25zdCBjaGFyICVzWyVkXSA9IHtcbiIsIG5hbWUsIDI1Nyk7CisJY29sID0gMDsKKwlmb3IgKGkgPSAwIDsgaSA8IDI1NzsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCWZwdXRzKCIgICAgICAiLCBjZmlsZSk7CisJCX0gZWxzZSBpZiAoKGkgJiAwMykgPT0gMCkgeworCQkJZnB1dHMoIixcbiAgICAgICIsIGNmaWxlKTsKKwkJCWNvbCA9IDA7CisJCX0gZWxzZSB7CisJCQlwdXRjKCcsJywgY2ZpbGUpOworCQkJd2hpbGUgKCsrY29sIDwgOSAqIChpICYgMDMpKQorCQkJCXB1dGMoJyAnLCBjZmlsZSk7CisJCX0KKwkJZnB1dHMoc3ludGF4W2ldLCBjZmlsZSk7CisJCWNvbCArPSBzdHJsZW4oc3ludGF4W2ldKTsKKwl9CisJZnB1dHMoIlxufTtcbiIsIGNmaWxlKTsKK30KKworCisKKy8qCisgKiBPdXRwdXQgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIG1hY3JvcyAoZS5nLiBpc19kaWdpdCkuICBJZiBkaWdpdHMgYXJlCisgKiBjb250aWd1b3VzLCB3ZSBjYW4gdGVzdCBmb3IgdGhlbSBxdWlja2x5LgorICovCisKK3N0YXRpYyBjaGFyICptYWNyb1tdID0geworCSIjZGVmaW5lIGlzX2RpZ2l0KGMpXHQoKHVuc2lnbmVkKSgoYykgLSAnMCcpIDw9IDkpXG4iLAorCSIjZGVmaW5lIGlzX2FscGhhKGMpXHRpc2FscGhhKCh1bnNpZ25lZCBjaGFyKShjKSlcbiIsCisJIiNkZWZpbmUgaXNfbmFtZShjKVx0KChjKSA9PSAnXycgfHwgaXNhbHBoYSgodW5zaWduZWQgY2hhcikoYykpKVxuIiwKKwkiI2RlZmluZSBpc19pbl9uYW1lKGMpXHQoKGMpID09ICdfJyB8fCBpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKShjKSkpXG4iLAorCSIjZGVmaW5lIGlzX3NwZWNpYWwoYylcdCgoaXNfdHlwZStTWU5CQVNFKVsoc2lnbmVkIGNoYXIpKGMpXSAmIChJU1NQRUNMfElTRElHSVQpKVxuIiwKKwlOVUxMCit9OworCitzdGF0aWMgdm9pZAorb3V0cHV0X3R5cGVfbWFjcm9zKHZvaWQpCit7CisJY2hhciAqKnBwOworCisJZm9yIChwcCA9IG1hY3JvIDsgKnBwIDsgcHArKykKKwkJZnB1dHMoKnBwLCBoZmlsZSk7CisJZnB1dHMoIiNkZWZpbmUgZGlnaXRfdmFsKGMpXHQoKGMpIC0gJzAnKVxuIiwgaGZpbGUpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbWt0b2tlbnMgYi91c3IvZGFzaC9ta3Rva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmJjZWYxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbWt0b2tlbnMKQEAgLTAsMCArMSw5MiBAQAorIyEvYmluL3NoIC0KKyMgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorIwlIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorIyBLZW5uZXRoIEFsbXF1aXN0LgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworIyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKyMJQCgjKW1rdG9rZW5zCTguMSAoQmVya2VsZXkpIDUvMzEvOTMKKworIyBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0b2tlbnMuICBUaGUgc2Vjb25kIGNvbHVtbiBpcyBub256ZXJvIGlmIHRoZQorIyB0b2tlbiBtYXJrcyB0aGUgZW5kIG9mIGEgbGlzdC4gIFRoZSB0aGlyZCBjb2x1bW4gaXMgdGhlIG5hbWUgdG8gcHJpbnQgaW4KKyMgZXJyb3IgbWVzc2FnZXMuCisKK2NhdCA+IC90bXAva2EkJCA8PFwhCitURU9GCTEJZW5kIG9mIGZpbGUKK1ROTAkwCW5ld2xpbmUKK1RTRU1JCTAJIjsiCitUQkFDS0dORCAwCSImIgorVEFORAkwCSImJiIKK1RPUgkwCSJ8fCIKK1RQSVBFCTAJInwiCitUTFAJMAkiKCIKK1RSUAkxCSIpIgorVEVORENBU0UgMQkiOzsiCitURU5EQlFVT1RFIDEJImAiCitUUkVESVIJMAlyZWRpcmVjdGlvbgorVFdPUkQJMAl3b3JkCitUTk9UCTAJIiEiCitUQ0FTRQkwCSJjYXNlIgorVERPCTEJImRvIgorVERPTkUJMQkiZG9uZSIKK1RFTElGCTEJImVsaWYiCitURUxTRQkxCSJlbHNlIgorVEVTQUMJMQkiZXNhYyIKK1RGSQkxCSJmaSIKK1RGT1IJMAkiZm9yIgorVElGCTAJImlmIgorVElOCTAJImluIgorVFRIRU4JMQkidGhlbiIKK1RVTlRJTAkwCSJ1bnRpbCIKK1RXSElMRQkwCSJ3aGlsZSIKK1RCRUdJTgkwCSJ7IgorVEVORAkxCSJ9IgorIQorbmw9YHdjIC1sIC90bXAva2EkJGAKKworYXdrICd7cHJpbnQgIiNkZWZpbmUgIiAkMSAiICIgTlItMX0nIC90bXAva2EkJAorZWNobyAnCisvKiBBcnJheSBpbmRpY2F0aW5nIHdoaWNoIHRva2VucyBtYXJrIHRoZSBlbmQgb2YgYSBsaXN0ICovCitjb25zdCBjaGFyIHRva2VuZGxpc3RbXSA9IHsnCithd2sgJ3twcmludCAiXHQiICQyICIsIn0nIC90bXAva2EkJAorZWNobyAnfTsKKworY29uc3QgY2hhciAqY29uc3QgdG9rbmFtZVtdID0geycKK3NlZCAtZSAncy8iL1xcIi9nJyBcCisgICAgLWUgJ3MvW14JIF0qWwkgXVsJIF0qW14JIF0qWwkgXVsJIF0qXCguKlwpLwkiXDEiLC8nIFwKKyAgICAvdG1wL2thJCQKK2VjaG8gJ307CisnCitzZWQgJ3MvIi8vZycgL3RtcC9rYSQkIHwgYXdrICcKKy9UTk9UL3twcmludCAiI2RlZmluZSBLV0RPRkZTRVQgIiBOUi0xOyBwcmludCAiIjsKKyAgICAgIHByaW50ICJTVEFUSUMgY29uc3QgY2hhciAqY29uc3QgcGFyc2Vrd2RbXSA9IHsifQorL1ROT1QvLC9uZXZlcmZvdW5kL3tpZiAobGFzdCkgcHJpbnQgIglcIiIgbGFzdCAiXCIsIjsgbGFzdCA9ICQzfQorRU5Ee3ByaW50ICIJXCIiIGxhc3QgIlwiXG59OyJ9JworCitybSAvdG1wL2thJCQKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL215aGlzdGVkaXQuaCBiL3Vzci9kYXNoL215aGlzdGVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg4MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbXloaXN0ZWRpdC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW15aGlzdGVkaXQuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaW5jbHVkZSA8aGlzdGVkaXQuaD4KKworZXh0ZXJuIEhpc3RvcnkgKmhpc3Q7CitleHRlcm4gRWRpdExpbmUgKmVsOworZXh0ZXJuIGludCBkaXNwbGF5aGlzdDsKKwordm9pZCBoaXN0ZWRpdCh2b2lkKTsKK3ZvaWQgc2V0aGlzdHNpemUoY29uc3QgY2hhciAqKTsKK3ZvaWQgc2V0dGVybShjb25zdCBjaGFyICopOworaW50IGhpc3RjbWQoaW50LCBjaGFyICoqKTsKK2ludCBub3RfZmNudW1iZXIoY2hhciAqKTsKK2ludCBzdHJfdG9fZXZlbnQoY29uc3QgY2hhciAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbXlzdHJpbmcuYyBiL3Vzci9kYXNoL215c3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyMDFhOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL215c3RyaW5nLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogU3RyaW5nIGZ1bmN0aW9ucy4KKyAqCisgKgllcXVhbChzMSwgczIpCQlSZXR1cm4gdHJ1ZSBpZiBzdHJpbmdzIGFyZSBlcXVhbC4KKyAqCXNjb3B5KGZyb20sIHRvKQkJQ29weSBhIHN0cmluZy4KKyAqCXNjb3B5bihmcm9tLCB0bywgbikJTGlrZSBzY29weSwgYnV0IGNoZWNrcyBmb3Igb3ZlcmZsb3cuCisgKgludW1iZXIocykJCUNvbnZlcnQgYSBzdHJpbmcgb2YgZGlnaXRzIHRvIGFuIGludGVnZXIuCisgKglpc19udW1iZXIocykJCVJldHVybiB0cnVlIGlmIHMgaXMgYSBzdHJpbmcgb2YgZGlnaXRzLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgInN5bnRheC5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisKK2NoYXIgbnVsbHN0clsxXTsJCS8qIHplcm8gbGVuZ3RoIHN0cmluZyAqLworY29uc3QgY2hhciBzcGNzdHJbXSA9ICIgIjsKK2NvbnN0IGNoYXIgc25sZm10W10gPSAiJXNcbiI7Citjb25zdCBjaGFyIGRvbGF0c3RyW10gPSB7IENUTFZBUiwgVlNOT1JNQUx8VlNRVU9URSwgJ0AnLCAnPScsICdcMCcgfTsKK2NvbnN0IGNoYXIgaWxsbnVtW10gPSAiSWxsZWdhbCBudW1iZXI6ICVzIjsKK2NvbnN0IGNoYXIgaG9tZXN0cltdID0gIkhPTUUiOworCisvKgorICogZXF1YWwgLSAjZGVmaW5lZCBpbiBteXN0cmluZy5oCisgKi8KKworLyoKKyAqIHNjb3B5IC0gI2RlZmluZWQgaW4gbXlzdHJpbmcuaAorICovCisKKworI2lmIDAKKy8qCisgKiBzY29weW4gLSBjb3B5IGEgc3RyaW5nIGZyb20gImZyb20iIHRvICJ0byIsIHRydW5jYXRpbmcgdGhlIHN0cmluZworICoJCWlmIG5lY2Vzc2FyeS4gICJUbyIgaXMgYWx3YXlzIG51bCB0ZXJtaW5hdGVkLCBldmVuIGlmCisgKgkJdHJ1bmNhdGlvbiBpcyBwZXJmb3JtZWQuICAiU2l6ZSIgaXMgdGhlIHNpemUgb2YgInRvIi4KKyAqLworCit2b2lkCitzY29weW4oY29uc3QgY2hhciAqZnJvbSwgY2hhciAqdG8sIGludCBzaXplKQoreworCisJd2hpbGUgKC0tc2l6ZSA+IDApIHsKKwkJaWYgKCgqdG8rKyA9ICpmcm9tKyspID09ICdcMCcpCisJCQlyZXR1cm47CisJfQorCSp0byA9ICdcMCc7Cit9CisjZW5kaWYKKworCisvKgorICogcHJlZml4IC0tIHNlZSBpZiBwZnggaXMgYSBwcmVmaXggb2Ygc3RyaW5nLgorICovCisKK2NoYXIgKgorcHJlZml4KGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqcGZ4KQoreworCXdoaWxlICgqcGZ4KSB7CisJCWlmICgqcGZ4KysgIT0gKnN0cmluZysrKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAoY2hhciAqKSBzdHJpbmc7Cit9CisKKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgb2YgZGlnaXRzIHRvIGFuIGludGVnZXIsIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2Ugb24KKyAqIGZhaWx1cmUuCisgKi8KKworaW50CitudW1iZXIoY29uc3QgY2hhciAqcykKK3sKKworCWlmICghIGlzX251bWJlcihzKSkKKwkJc2hfZXJyb3IoaWxsbnVtLCBzKTsKKwlyZXR1cm4gYXRvaShzKTsKK30KKworCisKKy8qCisgKiBDaGVjayBmb3IgYSB2YWxpZCBudW1iZXIuICBUaGlzIHNob3VsZCBiZSBlbHNld2hlcmUuCisgKi8KKworaW50Citpc19udW1iZXIoY29uc3QgY2hhciAqcCkKK3sKKwlkbyB7CisJCWlmICghIGlzX2RpZ2l0KCpwKSkKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKCorK3AgIT0gJ1wwJyk7CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFByb2R1Y2UgYSBwb3NzaWJseSBzaW5nbGUgcXVvdGVkIHN0cmluZyBzdWl0YWJsZSBhcyBpbnB1dCB0byB0aGUgc2hlbGwuCisgKiBUaGUgcmV0dXJuIHN0cmluZyBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorICovCisKK2NoYXIgKgorc2luZ2xlX3F1b3RlKGNvbnN0IGNoYXIgKnMpIHsKKwljaGFyICpwOworCisJU1RBUlRTVEFDS1NUUihwKTsKKworCWRvIHsKKwkJY2hhciAqcTsKKwkJc2l6ZV90IGxlbjsKKworCQlsZW4gPSBzdHJjaHJudWwocywgJ1wnJykgLSBzOworCisJCXEgPSBwID0gbWFrZXN0cnNwYWNlKGxlbiArIDMsIHApOworCisJCSpxKysgPSAnXCcnOworCQlxID0gbWVtcGNweShxLCBzLCBsZW4pOworCQkqcSsrID0gJ1wnJzsKKwkJcyArPSBsZW47CisKKwkJU1RBREpVU1QocSAtIHAsIHApOworCisJCWxlbiA9IHN0cnNwbihzLCAiJyIpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCisJCXEgPSBwID0gbWFrZXN0cnNwYWNlKGxlbiArIDMsIHApOworCisJCSpxKysgPSAnIic7CisJCXEgPSBtZW1wY3B5KHEsIHMsIGxlbik7CisJCSpxKysgPSAnIic7CisJCXMgKz0gbGVuOworCisJCVNUQURKVVNUKHEgLSBwLCBwKTsKKwl9IHdoaWxlICgqcyk7CisKKwlVU1RQVVRDKDAsIHApOworCisJcmV0dXJuIHN0YWNrYmxvY2soKTsKK30KKworLyoKKyAqIExpa2Ugc3RyZHVwIGJ1dCB3b3JrcyB3aXRoIHRoZSBhc2ggc3RhY2suCisgKi8KKworY2hhciAqCitzc3RyZHVwKGNvbnN0IGNoYXIgKnApCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihwKSArIDE7CisJcmV0dXJuIG1lbWNweShzdGFsbG9jKGxlbiksIHAsIGxlbik7Cit9CisKKy8qCisgKiBXcmFwcGVyIGFyb3VuZCBzdHJjbXAgZm9yIHFzb3J0L2JzZWFyY2gvLi4uCisgKi8KK2ludAorcHN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXJldHVybiBzdHJjbXAoKihjb25zdCBjaGFyICpjb25zdCAqKSBhLCAqKGNvbnN0IGNoYXIgKmNvbnN0ICopIGIpOworfQorCisvKgorICogRmluZCBhIHN0cmluZyBpcyBpbiBhIHNvcnRlZCBhcnJheS4KKyAqLworY29uc3QgY2hhciAqY29uc3QgKgorZmluZHN0cmluZyhjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpjb25zdCAqYXJyYXksIHNpemVfdCBubWVtYikKK3sKKwlyZXR1cm4gYnNlYXJjaCgmcywgYXJyYXksIG5tZW1iLCBzaXplb2YoY29uc3QgY2hhciAqKSwgcHN0cmNtcCk7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9teXN0cmluZy5oIGIvdXNyL2Rhc2gvbXlzdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGZkN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbXlzdHJpbmcuaApAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW15c3RyaW5nLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gY29uc3QgY2hhciBzbmxmbXRbXTsKK2V4dGVybiBjb25zdCBjaGFyIHNwY3N0cltdOworZXh0ZXJuIGNvbnN0IGNoYXIgZG9sYXRzdHJbXTsKKyNkZWZpbmUgRE9MQVRTVFJMRU4gNAorZXh0ZXJuIGNvbnN0IGNoYXIgaWxsbnVtW107CitleHRlcm4gY29uc3QgY2hhciBob21lc3RyW107CisKKyNpZiAwCit2b2lkIHNjb3B5bihjb25zdCBjaGFyICosIGNoYXIgKiwgaW50KTsKKyNlbmRpZgorY2hhciAqcHJlZml4KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2ludCBudW1iZXIoY29uc3QgY2hhciAqKTsKK2ludCBpc19udW1iZXIoY29uc3QgY2hhciAqKTsKK2NoYXIgKnNpbmdsZV9xdW90ZShjb25zdCBjaGFyICopOworY2hhciAqc3N0cmR1cChjb25zdCBjaGFyICopOworaW50IHBzdHJjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworY29uc3QgY2hhciAqY29uc3QgKmZpbmRzdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICpjb25zdCAqLCBzaXplX3QpOworCisjZGVmaW5lIGVxdWFsKHMxLCBzMikJKHN0cmNtcChzMSwgczIpID09IDApCisjZGVmaW5lIHNjb3B5KHMxLCBzMikJKCh2b2lkKXN0cmNweShzMiwgczEpKQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvbm9kZXMuYy5wYXQgYi91c3IvZGFzaC9ub2Rlcy5jLnBhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI1YmM3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbm9kZXMuYy5wYXQKQEAgLTAsMCArMSwxNjYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpbm9kZXMuYy5wYXQJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorLyoKKyAqIFJvdXRpbmUgZm9yIGRlYWxpbmcgd2l0aCBwYXJzZWQgc2hlbGwgY29tbWFuZHMuCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibm9kZXMuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgIm1hY2hkZXAuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisKK2ludCAgICAgZnVuY2Jsb2Nrc2l6ZTsJCS8qIHNpemUgb2Ygc3RydWN0dXJlcyBpbiBmdW5jdGlvbiAqLworaW50ICAgICBmdW5jc3RyaW5nc2l6ZTsJCS8qIHNpemUgb2Ygc3RyaW5ncyBpbiBub2RlICovCitwb2ludGVyIGZ1bmNibG9jazsJCS8qIGJsb2NrIHRvIGFsbG9jYXRlIGZ1bmN0aW9uIGZyb20gKi8KK2NoYXIgICAqZnVuY3N0cmluZzsJCS8qIGJsb2NrIHRvIGFsbG9jYXRlIHN0cmluZ3MgZnJvbSAqLworCislU0laRVMKKworCitTVEFUSUMgdm9pZCBjYWxjc2l6ZSh1bmlvbiBub2RlICopOworU1RBVElDIHZvaWQgc2l6ZW5vZGVsaXN0KHN0cnVjdCBub2RlbGlzdCAqKTsKK1NUQVRJQyB1bmlvbiBub2RlICpjb3B5bm9kZSh1bmlvbiBub2RlICopOworU1RBVElDIHN0cnVjdCBub2RlbGlzdCAqY29weW5vZGVsaXN0KHN0cnVjdCBub2RlbGlzdCAqKTsKK1NUQVRJQyBjaGFyICpub2Rlc2F2ZXN0cihjaGFyICopOworCisKKworLyoKKyAqIE1ha2UgYSBjb3B5IG9mIGEgcGFyc2UgdHJlZS4KKyAqLworCitzdHJ1Y3QgZnVuY25vZGUgKgorY29weWZ1bmModW5pb24gbm9kZSAqbikKK3sKKwlzdHJ1Y3QgZnVuY25vZGUgKmY7CisJc2l6ZV90IGJsb2Nrc2l6ZTsKKworCWZ1bmNibG9ja3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgZnVuY25vZGUsIG4pOworCWZ1bmNzdHJpbmdzaXplID0gMDsKKwljYWxjc2l6ZShuKTsKKwlibG9ja3NpemUgPSBmdW5jYmxvY2tzaXplOworCWYgPSBja21hbGxvYyhibG9ja3NpemUgKyBmdW5jc3RyaW5nc2l6ZSk7CisJZnVuY2Jsb2NrID0gKGNoYXIgKikgZiArIG9mZnNldG9mKHN0cnVjdCBmdW5jbm9kZSwgbik7CisJZnVuY3N0cmluZyA9IChjaGFyICopIGYgKyBibG9ja3NpemU7CisJY29weW5vZGUobik7CisJZi0+Y291bnQgPSAwOworCXJldHVybiBmOworfQorCisKKworU1RBVElDIHZvaWQKK2NhbGNzaXplKG4pCisJdW5pb24gbm9kZSAqbjsKK3sKKwklQ0FMQ1NJWkUKK30KKworCisKK1NUQVRJQyB2b2lkCitzaXplbm9kZWxpc3QobHApCisJc3RydWN0IG5vZGVsaXN0ICpscDsKK3sKKwl3aGlsZSAobHApIHsKKwkJZnVuY2Jsb2Nrc2l6ZSArPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5vZGVsaXN0KSk7CisJCWNhbGNzaXplKGxwLT5uKTsKKwkJbHAgPSBscC0+bmV4dDsKKwl9Cit9CisKKworCitTVEFUSUMgdW5pb24gbm9kZSAqCitjb3B5bm9kZShuKQorCXVuaW9uIG5vZGUgKm47Cit7CisJdW5pb24gbm9kZSAqbmV3OworCisJJUNPUFkKKwlyZXR1cm4gbmV3OworfQorCisKK1NUQVRJQyBzdHJ1Y3Qgbm9kZWxpc3QgKgorY29weW5vZGVsaXN0KGxwKQorCXN0cnVjdCBub2RlbGlzdCAqbHA7Cit7CisJc3RydWN0IG5vZGVsaXN0ICpzdGFydDsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKipscHA7CisKKwlscHAgPSAmc3RhcnQ7CisJd2hpbGUgKGxwKSB7CisJCSpscHAgPSBmdW5jYmxvY2s7CisJCWZ1bmNibG9jayA9IChjaGFyICopIGZ1bmNibG9jayArCisJCSAgICBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5vZGVsaXN0KSk7CisJCSgqbHBwKS0+biA9IGNvcHlub2RlKGxwLT5uKTsKKwkJbHAgPSBscC0+bmV4dDsKKwkJbHBwID0gJigqbHBwKS0+bmV4dDsKKwl9CisJKmxwcCA9IE5VTEw7CisJcmV0dXJuIHN0YXJ0OworfQorCisKKworU1RBVElDIGNoYXIgKgorbm9kZXNhdmVzdHIocykKKwljaGFyICAgKnM7Cit7CisJY2hhciAgICpydG4gPSBmdW5jc3RyaW5nOworCisJZnVuY3N0cmluZyA9IHN0cGNweShmdW5jc3RyaW5nLCBzKSArIDE7CisJcmV0dXJuIHJ0bjsKK30KKworCisKKy8qCisgKiBGcmVlIGEgcGFyc2UgdHJlZS4KKyAqLworCit2b2lkCitmcmVlZnVuYyhzdHJ1Y3QgZnVuY25vZGUgKmYpCit7CisJaWYgKGYgJiYgLS1mLT5jb3VudCA8IDApCisJCWNrZnJlZShmKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL25vZGV0eXBlcyBiL3Vzci9kYXNoL25vZGV0eXBlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E3YjNjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvbm9kZXR5cGVzCkBAIC0wLDAgKzEsMTQ0IEBACisjIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworIwlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyMJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyMgS2VubmV0aCBBbG1xdWlzdC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyMgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisjCUAoIylub2RldHlwZXMJOC4yIChCZXJrZWxleSkgNS80Lzk1CisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgbm9kZXMgdXNlZCBpbiBwYXJzZSB0cmVlcy4gIFVuaW5kZW50ZWQgbGluZXMKKyMgY29udGFpbiBhIG5vZGUgdHlwZSBmb2xsb3dlZCBieSBhIHN0cnVjdHVyZSB0YWcuICBTdWJzZXF1ZW50IGluZGVudGVkCisjIGxpbmVzIHNwZWNpZnkgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlLiAgU2V2ZXJhbCBub2RlIHR5cGVzIGNhbiBzaGFyZQorIyB0aGUgc2FtZSBzdHJ1Y3R1cmUsIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlIHNob3VsZCBiZQorIyBzcGVjaWZpZWQgb25seSBvbmNlLgorIworIyBBIGZpZWxkIG9mIGEgc3RydWN0dXJlIGlzIGRlc2NyaWJlZCBieSB0aGUgbmFtZSBvZiB0aGUgZmllbGQgZm9sbG93ZWQKKyMgYnkgYSB0eXBlLiAgVGhlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCB0eXBlcyBhcmU6CisjCW5vZGVwdHIgLSBhIHBvaW50ZXIgdG8gYSBub2RlCisjCW5vZGVsaXN0IC0gYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBub2RlcworIwlzdHJpbmcgLSBhIHBvaW50ZXIgdG8gYSBudWwgdGVybWluYXRlZCBzdHJpbmcKKyMJaW50IC0gYW4gaW50ZWdlcgorIwlvdGhlciAtIGFueSB0eXBlIHRoYXQgY2FuIGJlIGNvcGllZCBieSBhc3NpZ25tZW50CisjCXRlbXAgLSBhIGZpZWxkIHRoYXQgZG9lc24ndCBoYXZlIHRvIGJlIGNvcGllZCB3aGVuIHRoZSBub2RlIGlzIGNvcGllZAorIyBUaGUgbGFzdCB0d28gdHlwZXMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRoZSB0ZXh0IG9mIGEgQyBkZWNsYXJhdGlvbiBmb3IKKyMgdGhlIGZpZWxkLgorCitOQ01EIG5jbWQJCQkjIGEgc2ltcGxlIGNvbW1hbmQKKwl0eXBlCSAgaW50CisJYXNzaWduICAgIG5vZGVwdHIJCSMgdmFyaWFibGUgYXNzaWdubWVudHMKKwlhcmdzCSAgbm9kZXB0cgkJIyB0aGUgYXJndW1lbnRzCisJcmVkaXJlY3QgIG5vZGVwdHIJCSMgbGlzdCBvZiBmaWxlIHJlZGlyZWN0aW9ucworCitOUElQRSBucGlwZQkJCSMgYSBwaXBlbGluZQorCXR5cGUJICBpbnQKKwliYWNrZ25kCSAgaW50CQkJIyBzZXQgdG8gcnVuIHBpcGVsaW5lIGluIGJhY2tncm91bmQKKwljbWRsaXN0CSAgbm9kZWxpc3QJCSMgdGhlIGNvbW1hbmRzIGluIHRoZSBwaXBlbGluZQorCitOUkVESVIgbnJlZGlyCQkJIyByZWRpcmVjdGlvbiAob2YgYSBjb21wbGV4IGNvbW1hbmQpCisJdHlwZQkgIGludAorCW4JICBub2RlcHRyCQkjIHRoZSBjb21tYW5kCisJcmVkaXJlY3QgIG5vZGVwdHIJCSMgbGlzdCBvZiBmaWxlIHJlZGlyZWN0aW9ucworCitOQkFDS0dORCBucmVkaXIJCQkjIHJ1biBjb21tYW5kIGluIGJhY2tncm91bmQKK05TVUJTSEVMTCBucmVkaXIJCSMgcnVuIGNvbW1hbmQgaW4gYSBzdWJzaGVsbAorCitOQU5EIG5iaW5hcnkJCQkjIHRoZSAmJiBvcGVyYXRvcgorTk9SIG5iaW5hcnkJCQkjIHRoZSB8fCBvcGVyYXRvcgorCitOU0VNSSBuYmluYXJ5CQkJIyB0d28gY29tbWFuZHMgc2VwYXJhdGVkIGJ5IGEgc2VtaWNvbG9uCisJdHlwZQkgIGludAorCWNoMQkgIG5vZGVwdHIJCSMgdGhlIGZpcnN0IGNoaWxkCisJY2gyCSAgbm9kZXB0cgkJIyB0aGUgc2Vjb25kIGNoaWxkCisKK05JRiBuaWYJCQkJIyB0aGUgaWYgc3RhdGVtZW50LiAgRWxpZiBjbGF1c2VzIGFyZSBoYW5kbGVkCisJdHlwZQkgIGludAkJICAgICMgdXNpbmcgbXVsdGlwbGUgaWYgbm9kZXMuCisJdGVzdAkgIG5vZGVwdHIJCSMgaWYgdGVzdAorCWlmcGFydAkgIG5vZGVwdHIJCSMgdGhlbiBpZnBhcnQKKwllbHNlcGFydCAgbm9kZXB0cgkJIyBlbHNlIGVsc2VwYXJ0CisKK05XSElMRSBuYmluYXJ5CQkJIyB0aGUgd2hpbGUgc3RhdGVtZW50LiAgRmlyc3QgY2hpbGQgaXMgdGhlIHRlc3QKK05VTlRJTCBuYmluYXJ5CQkJIyB0aGUgdW50aWwgc3RhdGVtZW50CisKK05GT1IgbmZvcgkJCSMgdGhlIGZvciBzdGF0ZW1lbnQKKwl0eXBlCSAgaW50CisJYXJncwkgIG5vZGVwdHIJCSMgZm9yIHZhciBpbiBhcmdzCisJYm9keQkgIG5vZGVwdHIJCSMgZG8gYm9keTsgZG9uZQorCXZhcgkgIHN0cmluZwkJIyB0aGUgZm9yIHZhcmlhYmxlCisKK05DQVNFIG5jYXNlCQkJIyBhIGNhc2Ugc3RhdGVtZW50CisJdHlwZQkgIGludAorCWV4cHIJICBub2RlcHRyCQkjIHRoZSB3b3JkIHRvIHN3aXRjaCBvbgorCWNhc2VzCSAgbm9kZXB0cgkJIyB0aGUgbGlzdCBvZiBjYXNlcyAoTkNMSVNUIG5vZGVzKQorCitOQ0xJU1QgbmNsaXN0CQkJIyBhIGNhc2UKKwl0eXBlCSAgaW50CisJbmV4dAkgIG5vZGVwdHIJCSMgdGhlIG5leHQgY2FzZSBpbiBsaXN0CisJcGF0dGVybgkgIG5vZGVwdHIJCSMgbGlzdCBvZiBwYXR0ZXJucyBmb3IgdGhpcyBjYXNlCisJYm9keQkgIG5vZGVwdHIJCSMgY29kZSB0byBleGVjdXRlIGZvciB0aGlzIGNhc2UKKworCitOREVGVU4gbmFyZwkJCSMgZGVmaW5lIGEgZnVuY3Rpb24uICBUaGUgIm5leHQiIGZpZWxkIGNvbnRhaW5zCisJCQkJIyB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24uCisKK05BUkcgbmFyZwkJCSMgcmVwcmVzZW50cyBhIHdvcmQKKwl0eXBlCSAgaW50CisJbmV4dAkgIG5vZGVwdHIJCSMgbmV4dCB3b3JkIGluIGxpc3QKKwl0ZXh0CSAgc3RyaW5nCQkjIHRoZSB0ZXh0IG9mIHRoZSB3b3JkCisJYmFja3F1b3RlIG5vZGVsaXN0CQkjIGxpc3Qgb2YgY29tbWFuZHMgaW4gYmFjayBxdW90ZXMKKworTlRPIG5maWxlCQkJIyBmZD4gZm5hbWUKK05DTE9CQkVSIG5maWxlCQkJIyBmZD58IGZuYW1lCitORlJPTSBuZmlsZQkJCSMgZmQ8IGZuYW1lCitORlJPTVRPIG5maWxlCQkJIyBmZDw+IGZuYW1lCitOQVBQRU5EIG5maWxlCQkJIyBmZD4+IGZuYW1lCisJdHlwZQkgIGludAorCW5leHQJICBub2RlcHRyCQkjIG5leHQgcmVkaXJlY3Rpb24gaW4gbGlzdAorCWZkCSAgaW50CQkJIyBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgcmVkaXJlY3RlZAorCWZuYW1lCSAgbm9kZXB0cgkJIyBmaWxlIG5hbWUsIGluIGEgTkFSRyBub2RlCisJZXhwZm5hbWUgIHRlbXAJY2hhciAqZXhwZm5hbWUJIyBhY3R1YWwgZmlsZSBuYW1lCisKK05UT0ZEIG5kdXAJCQkjIGZkPCZkdXBmZAorTkZST01GRCBuZHVwCQkJIyBmZD4mZHVwZmQKKwl0eXBlCSAgaW50CisJbmV4dAkgIG5vZGVwdHIJCSMgbmV4dCByZWRpcmVjdGlvbiBpbiBsaXN0CisJZmQJICBpbnQJCQkjIGZpbGUgZGVzY3JpcHRvciBiZWluZyByZWRpcmVjdGVkCisJZHVwZmQJICBpbnQJCQkjIGZpbGUgZGVzY3JpcHRvciB0byBkdXBsaWNhdGUKKwl2bmFtZQkgIG5vZGVwdHIJCSMgZmlsZSBuYW1lIGlmIGZkPiYkdmFyCisKKworTkhFUkUgbmhlcmUJCQkjIGZkPDxcIQorTlhIRVJFIG5oZXJlCQkJIyBmZDw8IQorCXR5cGUJICBpbnQKKwluZXh0CSAgbm9kZXB0cgkJIyBuZXh0IHJlZGlyZWN0aW9uIGluIGxpc3QKKwlmZAkgIGludAkJCSMgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIHJlZGlyZWN0ZWQKKwlkb2MJICBub2RlcHRyCQkjIGlucHV0IHRvIGNvbW1hbmQgKE5BUkcgbm9kZSkKKworTk5PVCBubm90CQkJIyAhIGNvbW1hbmQgIChhY3R1YWxseSBwaXBlbGluZSkKKwl0eXBlCWludAorCWNvbQlub2RlcHRyCmRpZmYgLS1naXQgYS91c3IvZGFzaC9vcHRpb25zLmMgYi91c3IvZGFzaC9vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhYTYwOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL29wdGlvbnMuYwpAQCAtMCwwICsxLDU0NyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjZGVmaW5lIERFRklORV9PUFRJT05TCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI3VuZGVmIERFRklORV9PUFRJT05TCisjaW5jbHVkZSAibm9kZXMuaCIJLyogZm9yIG90aGVyIGhlYWRlciBmaWxlcyAqLworI2luY2x1ZGUgImV2YWwuaCIKKyNpbmNsdWRlICJqb2JzLmgiCisjaW5jbHVkZSAiaW5wdXQuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJ0cmFwLmgiCisjaW5jbHVkZSAidmFyLmgiCisjaW5jbHVkZSAibWVtYWxsb2MuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaWZuZGVmIFNNQUxMCisjaW5jbHVkZSAibXloaXN0ZWRpdC5oIgorI2VuZGlmCisjaW5jbHVkZSAic2hvdy5oIgorCitjaGFyICphcmcwOwkJCS8qIHZhbHVlIG9mICQwICovCitzdHJ1Y3Qgc2hwYXJhbSBzaGVsbHBhcmFtOwkvKiBjdXJyZW50IHBvc2l0aW9uYWwgcGFyYW1ldGVycyAqLworY2hhciAqKmFyZ3B0cjsJCQkvKiBhcmd1bWVudCBsaXN0IGZvciBidWlsdGluIGNvbW1hbmRzICovCitjaGFyICpvcHRpb25hcmc7CQkvKiBzZXQgYnkgbmV4dG9wdCAobGlrZSBnZXRvcHQpICovCitjaGFyICpvcHRwdHI7CQkJLyogdXNlZCBieSBuZXh0b3B0ICovCisKK2NoYXIgKm1pbnVzYzsJCQkvKiBhcmd1bWVudCB0byAtYyBvcHRpb24gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG9wdG5hbWVzW05PUFRTXSA9IHsKKwkiZXJyZXhpdCIsCisJIm5vZ2xvYiIsCisJImlnbm9yZWVvZiIsCisJImludGVyYWN0aXZlIiwKKwkibW9uaXRvciIsCisJIm5vZXhlYyIsCisJInN0ZGluIiwKKwkieHRyYWNlIiwKKwkidmVyYm9zZSIsCisJInZpIiwKKwkiZW1hY3MiLAorCSJub2Nsb2JiZXIiLAorCSJhbGxleHBvcnQiLAorCSJub3RpZnkiLAorCSJub3Vuc2V0IiwKKwkibm9sb2ciLAorCSJkZWJ1ZyIsCit9OworCitjb25zdCBjaGFyIG9wdGxldHRlcnNbTk9QVFNdID0geworCSdlJywKKwknZicsCisJJ0knLAorCSdpJywKKwknbScsCisJJ24nLAorCSdzJywKKwkneCcsCisJJ3YnLAorCSdWJywKKwknRScsCisJJ0MnLAorCSdhJywKKwknYicsCisJJ3UnLAorCTAsCisJMCwKK307CisKK2NoYXIgb3B0bGlzdFtOT1BUU107CisKKworU1RBVElDIHZvaWQgb3B0aW9ucyhpbnQpOworU1RBVElDIHZvaWQgbWludXNfbyhjaGFyICosIGludCk7CitTVEFUSUMgdm9pZCBzZXRvcHRpb24oaW50LCBpbnQpOworU1RBVElDIGludCBnZXRvcHRzKGNoYXIgKiwgY2hhciAqLCBjaGFyICoqLCBpbnQgKiwgaW50ICopOworCisKKy8qCisgKiBQcm9jZXNzIHRoZSBzaGVsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICovCisKK3ZvaWQKK3Byb2NhcmdzKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICp4bWludXNjOworCWNoYXIgKip4YXJndjsKKworCXhhcmd2ID0gYXJndjsKKwlhcmcwID0geGFyZ3ZbMF07CisJaWYgKGFyZ2MgPiAwKQorCQl4YXJndisrOworCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKQorCQlvcHRsaXN0W2ldID0gMjsKKwlhcmdwdHIgPSB4YXJndjsKKwlvcHRpb25zKDEpOworCXhhcmd2ID0gYXJncHRyOworCXhtaW51c2MgPSBtaW51c2M7CisJaWYgKCp4YXJndiA9PSBOVUxMKSB7CisJCWlmICh4bWludXNjKQorCQkJc2hfZXJyb3IoIi1jIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iik7CisJCXNmbGFnID0gMTsKKwl9CisJaWYgKGlmbGFnID09IDIgJiYgc2ZsYWcgPT0gMSAmJiBpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKQorCQlpZmxhZyA9IDE7CisJaWYgKG1mbGFnID09IDIpCisJCW1mbGFnID0gaWZsYWc7CisJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspCisJCWlmIChvcHRsaXN0W2ldID09IDIpCisJCQlvcHRsaXN0W2ldID0gMDsKKyNpZiBERUJVRyA9PSAyCisJZGVidWcgPSAxOworI2VuZGlmCisJLyogUE9TSVggMTAwMy4yOiBmaXJzdCBhcmcgYWZ0ZXIgLWMgY21kIGlzICQwLCByZW1haW5kZXIgJDEuLi4gKi8KKwlpZiAoeG1pbnVzYykgeworCQltaW51c2MgPSAqeGFyZ3YrKzsKKwkJaWYgKCp4YXJndikKKwkJCWdvdG8gc2V0YXJnMDsKKwl9IGVsc2UgaWYgKCFzZmxhZykgeworCQlzZXRpbnB1dGZpbGUoKnhhcmd2LCAwKTsKK3NldGFyZzA6CisJCWFyZzAgPSAqeGFyZ3YrKzsKKwkJY29tbWFuZG5hbWUgPSBhcmcwOworCX0KKworCXNoZWxscGFyYW0ucCA9IHhhcmd2OworCXNoZWxscGFyYW0ub3B0aW5kID0gMTsKKwlzaGVsbHBhcmFtLm9wdG9mZiA9IC0xOworCS8qIGFzc2VydChzaGVsbHBhcmFtLm1hbGxvYyA9PSAwICYmIHNoZWxscGFyYW0ubnBhcmFtID09IDApOyAqLworCXdoaWxlICgqeGFyZ3YpIHsKKwkJc2hlbGxwYXJhbS5ucGFyYW0rKzsKKwkJeGFyZ3YrKzsKKwl9CisJb3B0c2NoYW5nZWQoKTsKK30KKworCit2b2lkCitvcHRzY2hhbmdlZCh2b2lkKQoreworI2lmZGVmIERFQlVHCisJb3BlbnRyYWNlKCk7CisjZW5kaWYKKwlzZXRpbnRlcmFjdGl2ZShpZmxhZyk7CisjaWZuZGVmIFNNQUxMCisJaGlzdGVkaXQoKTsKKyNlbmRpZgorCXNldGpvYmN0bChtZmxhZyk7Cit9CisKKy8qCisgKiBQcm9jZXNzIHNoZWxsIG9wdGlvbnMuICBUaGUgZ2xvYmFsIHZhcmlhYmxlIGFyZ3B0ciBjb250YWlucyBhIHBvaW50ZXIKKyAqIHRvIHRoZSBhcmd1bWVudCBsaXN0OyB3ZSBhZHZhbmNlIGl0IHBhc3QgdGhlIG9wdGlvbnMuCisgKi8KKworU1RBVElDIHZvaWQKK29wdGlvbnMoaW50IGNtZGxpbmUpCit7CisJY2hhciAqcDsKKwlpbnQgdmFsOworCWludCBjOworCisJaWYgKGNtZGxpbmUpCisJCW1pbnVzYyA9IE5VTEw7CisJd2hpbGUgKChwID0gKmFyZ3B0cikgIT0gTlVMTCkgeworCQlhcmdwdHIrKzsKKwkJaWYgKChjID0gKnArKykgPT0gJy0nKSB7CisJCQl2YWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBbMF0gPT0gJ1wwJyB8fCAocFswXSA9PSAnLScgJiYgcFsxXSA9PSAnXDAnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNtZGxpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiLSIgbWVhbnMgdHVybiBvZmYgLXggYW5kIC12ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmbGFnID0gdmZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICItLSIgbWVhbnMgcmVzZXQgcGFyYW1zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKmFyZ3B0ciA9PSBOVUxMKQorCQkJCQkJc2V0cGFyYW0oYXJncHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOwkgIC8qICItIiBvciAgIi0tIiB0ZXJtaW5hdGVzIG9wdGlvbnMgKi8KKwkJCX0KKwkJfSBlbHNlIGlmIChjID09ICcrJykgeworCQkJdmFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCWFyZ3B0ci0tOworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKChjID0gKnArKykgIT0gJ1wwJykgeworCQkJaWYgKGMgPT0gJ2MnICYmIGNtZGxpbmUpIHsKKwkJCQltaW51c2MgPSBwOwkvKiBjb21tYW5kIGlzIGFmdGVyIHNoZWxsIGFyZ3MqLworCQkJfSBlbHNlIGlmIChjID09ICdvJykgeworCQkJCW1pbnVzX28oKmFyZ3B0ciwgdmFsKTsKKwkJCQlpZiAoKmFyZ3B0cikKKwkJCQkJYXJncHRyKys7CisJCQl9IGVsc2UgeworCQkJCXNldG9wdGlvbihjLCB2YWwpOworCQkJfQorCQl9CisJfQorfQorCitTVEFUSUMgdm9pZAorbWludXNfbyhjaGFyICpuYW1lLCBpbnQgdmFsKQoreworCWludCBpOworCisJaWYgKG5hbWUgPT0gTlVMTCkgeworCQlvdXQxc3RyKCJDdXJyZW50IG9wdGlvbiBzZXR0aW5nc1xuIik7CisJCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKQorCQkJb3V0MWZtdCgiJS0xNnMlc1xuIiwgb3B0bmFtZXNbaV0sCisJCQkJb3B0bGlzdFtpXSA/ICJvbiIgOiAib2ZmIik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspCisJCQlpZiAoZXF1YWwobmFtZSwgb3B0bmFtZXNbaV0pKSB7CisJCQkJb3B0bGlzdFtpXSA9IHZhbDsKKwkJCQlyZXR1cm47CisJCQl9CisJCXNoX2Vycm9yKCJJbGxlZ2FsIG9wdGlvbiAtbyAlcyIsIG5hbWUpOworCX0KK30KKworCitTVEFUSUMgdm9pZAorc2V0b3B0aW9uKGludCBmbGFnLCBpbnQgdmFsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspCisJCWlmIChvcHRsZXR0ZXJzW2ldID09IGZsYWcpIHsKKwkJCW9wdGxpc3RbaV0gPSB2YWw7CisJCQlpZiAodmFsKSB7CisJCQkJLyogIyUkIGhhY2sgZm9yIGtzaCBzZW1hbnRpY3MgKi8KKwkJCQlpZiAoZmxhZyA9PSAnVicpCisJCQkJCUVmbGFnID0gMDsKKwkJCQllbHNlIGlmIChmbGFnID09ICdFJykKKwkJCQkJVmZsYWcgPSAwOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJc2hfZXJyb3IoIklsbGVnYWwgb3B0aW9uIC0lYyIsIGZsYWcpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworCisKKy8qCisgKiBTZXQgdGhlIHNoZWxsIHBhcmFtZXRlcnMuCisgKi8KKwordm9pZAorc2V0cGFyYW0oY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKm5ld3BhcmFtOworCWNoYXIgKiphcDsKKwlpbnQgbnBhcmFtOworCisJZm9yIChucGFyYW0gPSAwIDsgYXJndltucGFyYW1dIDsgbnBhcmFtKyspOworCWFwID0gbmV3cGFyYW0gPSBja21hbGxvYygobnBhcmFtICsgMSkgKiBzaXplb2YgKmFwKTsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJKmFwKysgPSBzYXZlc3RyKCphcmd2KyspOworCX0KKwkqYXAgPSBOVUxMOworCWZyZWVwYXJhbSgmc2hlbGxwYXJhbSk7CisJc2hlbGxwYXJhbS5tYWxsb2MgPSAxOworCXNoZWxscGFyYW0ubnBhcmFtID0gbnBhcmFtOworCXNoZWxscGFyYW0ucCA9IG5ld3BhcmFtOworCXNoZWxscGFyYW0ub3B0aW5kID0gMTsKKwlzaGVsbHBhcmFtLm9wdG9mZiA9IC0xOworfQorCisKKy8qCisgKiBGcmVlIHRoZSBsaXN0IG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworCit2b2lkCitmcmVlcGFyYW0odm9sYXRpbGUgc3RydWN0IHNocGFyYW0gKnBhcmFtKQoreworCWNoYXIgKiphcDsKKworCWlmIChwYXJhbS0+bWFsbG9jKSB7CisJCWZvciAoYXAgPSBwYXJhbS0+cCA7ICphcCA7IGFwKyspCisJCQlja2ZyZWUoKmFwKTsKKwkJY2tmcmVlKHBhcmFtLT5wKTsKKwl9Cit9CisKKworCisvKgorICogVGhlIHNoaWZ0IGJ1aWx0aW4gY29tbWFuZC4KKyAqLworCitpbnQKK3NoaWZ0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbjsKKwljaGFyICoqYXAxLCAqKmFwMjsKKworCW4gPSAxOworCWlmIChhcmdjID4gMSkKKwkJbiA9IG51bWJlcihhcmd2WzFdKTsKKwlpZiAobiA+IHNoZWxscGFyYW0ubnBhcmFtKQorCQlzaF9lcnJvcigiY2FuJ3Qgc2hpZnQgdGhhdCBtYW55Iik7CisJSU5UT0ZGOworCXNoZWxscGFyYW0ubnBhcmFtIC09IG47CisJZm9yIChhcDEgPSBzaGVsbHBhcmFtLnAgOyAtLW4gPj0gMCA7IGFwMSsrKSB7CisJCWlmIChzaGVsbHBhcmFtLm1hbGxvYykKKwkJCWNrZnJlZSgqYXAxKTsKKwl9CisJYXAyID0gc2hlbGxwYXJhbS5wOworCXdoaWxlICgoKmFwMisrID0gKmFwMSsrKSAhPSBOVUxMKTsKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKwlJTlRPTjsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKiBUaGUgc2V0IGNvbW1hbmQgYnVpbHRpbi4KKyAqLworCitpbnQKK3NldGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPT0gMSkKKwkJcmV0dXJuIHNob3d2YXJzKG51bGxzdHIsIDAsIFZVTlNFVCk7CisJSU5UT0ZGOworCW9wdGlvbnMoMCk7CisJb3B0c2NoYW5nZWQoKTsKKwlpZiAoKmFyZ3B0ciAhPSBOVUxMKSB7CisJCXNldHBhcmFtKGFyZ3B0cik7CisJfQorCUlOVE9OOworCXJldHVybiAwOworfQorCisKK3ZvaWQKK2dldG9wdHNyZXNldCh2YWx1ZSkKKwljb25zdCBjaGFyICp2YWx1ZTsKK3sKKwlzaGVsbHBhcmFtLm9wdGluZCA9IG51bWJlcih2YWx1ZSk7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKK30KKworLyoKKyAqIFRoZSBnZXRvcHRzIGJ1aWx0aW4uICBTaGVsbHBhcmFtLm9wdG5leHQgcG9pbnRzIHRvIHRoZSBuZXh0IGFyZ3VtZW50CisgKiB0byBiZSBwcm9jZXNzZWQuICBTaGVsbHBhcmFtLm9wdHB0ciBwb2ludHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvCisgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGN1cnJlbnQgYXJndW1lbnQuICBJZiBzaGVsbHBhcmFtLm9wdG5leHQgaXMgTlVMTCwKKyAqIHRoZW4gaXQncyB0aGUgZmlyc3QgdGltZSBnZXRvcHRzIGhhcyBiZWVuIGNhbGxlZC4KKyAqLworCitpbnQKK2dldG9wdHNjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKipvcHRiYXNlOworCisJaWYgKGFyZ2MgPCAzKQorCQlzaF9lcnJvcigiVXNhZ2U6IGdldG9wdHMgb3B0c3RyaW5nIHZhciBbYXJnXSIpOworCWVsc2UgaWYgKGFyZ2MgPT0gMykgeworCQlvcHRiYXNlID0gc2hlbGxwYXJhbS5wOworCQlpZiAoc2hlbGxwYXJhbS5vcHRpbmQgPiBzaGVsbHBhcmFtLm5wYXJhbSArIDEpIHsKKwkJCXNoZWxscGFyYW0ub3B0aW5kID0gMTsKKwkJCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisJCX0KKwl9CisJZWxzZSB7CisJCW9wdGJhc2UgPSAmYXJndlszXTsKKwkJaWYgKHNoZWxscGFyYW0ub3B0aW5kID4gYXJnYyAtIDIpIHsKKwkJCXNoZWxscGFyYW0ub3B0aW5kID0gMTsKKwkJCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gZ2V0b3B0cyhhcmd2WzFdLCBhcmd2WzJdLCBvcHRiYXNlLCAmc2hlbGxwYXJhbS5vcHRpbmQsCisJCSAgICAgICAmc2hlbGxwYXJhbS5vcHRvZmYpOworfQorCitTVEFUSUMgaW50CitnZXRvcHRzKGNoYXIgKm9wdHN0ciwgY2hhciAqb3B0dmFyLCBjaGFyICoqb3B0Zmlyc3QsIGludCAqb3B0aW5kLCBpbnQgKm9wdG9mZikKK3sKKwljaGFyICpwLCAqcTsKKwljaGFyIGMgPSAnPyc7CisJaW50IGRvbmUgPSAwOworCWludCBlcnIgPSAwOworCWNoYXIgc1sxMl07CisJY2hhciAqKm9wdG5leHQ7CisKKwlpZiAoKm9wdGluZCA8IDEpCisJCXJldHVybiAxOworCW9wdG5leHQgPSBvcHRmaXJzdCArICpvcHRpbmQgLSAxOworCisJaWYgKCpvcHRpbmQgPD0gMSB8fCAqb3B0b2ZmIDwgMCB8fCBzdHJsZW4ob3B0bmV4dFstMV0pIDwgKm9wdG9mZikKKwkJcCA9IE5VTEw7CisJZWxzZQorCQlwID0gb3B0bmV4dFstMV0gKyAqb3B0b2ZmOworCWlmIChwID09IE5VTEwgfHwgKnAgPT0gJ1wwJykgeworCQkvKiBDdXJyZW50IHdvcmQgaXMgZG9uZSwgYWR2YW5jZSAqLworCQlwID0gKm9wdG5leHQ7CisJCWlmIChwID09IE5VTEwgfHwgKnAgIT0gJy0nIHx8ICorK3AgPT0gJ1wwJykgeworYXRlbmQ6CisJCQlwID0gTlVMTDsKKwkJCWRvbmUgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJb3B0bmV4dCsrOworCQlpZiAocFswXSA9PSAnLScgJiYgcFsxXSA9PSAnXDAnKQkvKiBjaGVjayBmb3IgIi0tIiAqLworCQkJZ290byBhdGVuZDsKKwl9CisKKwljID0gKnArKzsKKwlmb3IgKHEgPSBvcHRzdHI7ICpxICE9IGM7ICkgeworCQlpZiAoKnEgPT0gJ1wwJykgeworCQkJaWYgKG9wdHN0clswXSA9PSAnOicpIHsKKwkJCQlzWzBdID0gYzsKKwkJCQlzWzFdID0gJ1wwJzsKKwkJCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgcywgMCk7CisJCQl9IGVsc2UgeworCQkJCW91dGZtdCgmZXJyb3V0LCAiSWxsZWdhbCBvcHRpb24gLSVjXG4iLCBjKTsKKwkJCQkodm9pZCkgdW5zZXR2YXIoIk9QVEFSRyIpOworCQkJfQorCQkJYyA9ICc/JzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICgqKytxID09ICc6JykKKwkJCXErKzsKKwl9CisKKwlpZiAoKisrcSA9PSAnOicpIHsKKwkJaWYgKCpwID09ICdcMCcgJiYgKHAgPSAqb3B0bmV4dCkgPT0gTlVMTCkgeworCQkJaWYgKG9wdHN0clswXSA9PSAnOicpIHsKKwkJCQlzWzBdID0gYzsKKwkJCQlzWzFdID0gJ1wwJzsKKwkJCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgcywgMCk7CisJCQkJYyA9ICc6JzsKKwkJCX0gZWxzZSB7CisJCQkJb3V0Zm10KCZlcnJvdXQsICJObyBhcmcgZm9yIC0lYyBvcHRpb25cbiIsIGMpOworCQkJCSh2b2lkKSB1bnNldHZhcigiT1BUQVJHIik7CisJCQkJYyA9ICc/JzsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHAgPT0gKm9wdG5leHQpCisJCQlvcHRuZXh0Kys7CisJCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRBUkciLCBwLCAwKTsKKwkJcCA9IE5VTEw7CisJfSBlbHNlCisJCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRBUkciLCBudWxsc3RyLCAwKTsKKworb3V0OgorCSpvcHRvZmYgPSBwID8gcCAtICoob3B0bmV4dCAtIDEpIDogLTE7CisJKm9wdGluZCA9IG9wdG5leHQgLSBvcHRmaXJzdCArIDE7CisJZm10c3RyKHMsIHNpemVvZihzKSwgIiVkIiwgKm9wdGluZCk7CisJZXJyIHw9IHNldHZhcnNhZmUoIk9QVElORCIsIHMsIFZOT0ZVTkMpOworCXNbMF0gPSBjOworCXNbMV0gPSAnXDAnOworCWVyciB8PSBzZXR2YXJzYWZlKG9wdHZhciwgcywgMCk7CisJaWYgKGVycikgeworCQkqb3B0aW5kID0gMTsKKwkJKm9wdG9mZiA9IC0xOworCQlmbHVzaGFsbCgpOworCQlleHJhaXNlKEVYRVJST1IpOworCX0KKwlyZXR1cm4gZG9uZTsKK30KKworLyoKKyAqIFhYWCAtIHNob3VsZCBnZXQgcmlkIG9mLiAgaGF2ZSBhbGwgYnVpbHRpbnMgdXNlIGdldG9wdCgzKS4gIHRoZQorICogbGlicmFyeSBnZXRvcHQgbXVzdCBoYXZlIHRoZSBCU0QgZXh0ZW5zaW9uIHN0YXRpYyB2YXJpYWJsZSAib3B0cmVzZXQiCisgKiBvdGhlcndpc2UgaXQgY2FuJ3QgYmUgdXNlZCB3aXRoaW4gdGhlIHNoZWxsIHNhZmVseS4KKyAqCisgKiBTdGFuZGFyZCBvcHRpb24gcHJvY2Vzc2luZyAoYSBsYSBnZXRvcHQpIGZvciBidWlsdGluIHJvdXRpbmVzLiAgVGhlCisgKiBvbmx5IGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRvIG5leHRvcHQgaXMgdGhlIG9wdGlvbiBzdHJpbmc7IHRoZQorICogb3RoZXIgYXJndW1lbnRzIGFyZSB1bm5lY2Vzc2FyeS4gIEl0IHJldHVybiB0aGUgY2hhcmFjdGVyLCBvciAnXDAnIG9uCisgKiBlbmQgb2YgaW5wdXQuCisgKi8KKworaW50CituZXh0b3B0KGNvbnN0IGNoYXIgKm9wdHN0cmluZykKK3sKKwljaGFyICpwOworCWNvbnN0IGNoYXIgKnE7CisJY2hhciBjOworCisJaWYgKChwID0gb3B0cHRyKSA9PSBOVUxMIHx8ICpwID09ICdcMCcpIHsKKwkJcCA9ICphcmdwdHI7CisJCWlmIChwID09IE5VTEwgfHwgKnAgIT0gJy0nIHx8ICorK3AgPT0gJ1wwJykKKwkJCXJldHVybiAnXDAnOworCQlhcmdwdHIrKzsKKwkJaWYgKHBbMF0gPT0gJy0nICYmIHBbMV0gPT0gJ1wwJykJLyogY2hlY2sgZm9yICItLSIgKi8KKwkJCXJldHVybiAnXDAnOworCX0KKwljID0gKnArKzsKKwlmb3IgKHEgPSBvcHRzdHJpbmcgOyAqcSAhPSBjIDsgKSB7CisJCWlmICgqcSA9PSAnXDAnKQorCQkJc2hfZXJyb3IoIklsbGVnYWwgb3B0aW9uIC0lYyIsIGMpOworCQlpZiAoKisrcSA9PSAnOicpCisJCQlxKys7CisJfQorCWlmICgqKytxID09ICc6JykgeworCQlpZiAoKnAgPT0gJ1wwJyAmJiAocCA9ICphcmdwdHIrKykgPT0gTlVMTCkKKwkJCXNoX2Vycm9yKCJObyBhcmcgZm9yIC0lYyBvcHRpb24iLCBjKTsKKwkJb3B0aW9uYXJnID0gcDsKKwkJcCA9IE5VTEw7CisJfQorCW9wdHB0ciA9IHA7CisJcmV0dXJuIGM7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9vcHRpb25zLmggYi91c3IvZGFzaC9vcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViYmU1YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL29wdGlvbnMuaApAQCAtMCwwICsxLDg2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW9wdGlvbnMuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCitzdHJ1Y3Qgc2hwYXJhbSB7CisJaW50IG5wYXJhbTsJCS8qICMgb2YgcG9zaXRpb25hbCBwYXJhbWV0ZXJzICh3aXRob3V0ICQwKSAqLworCXVuc2lnbmVkIGNoYXIgbWFsbG9jOwkvKiBpZiBwYXJhbWV0ZXIgbGlzdCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgKi8KKwljaGFyICoqcDsJCS8qIHBhcmFtZXRlciBsaXN0ICovCisJaW50IG9wdGluZDsJCS8qIG5leHQgcGFyYW1ldGVyIHRvIGJlIHByb2Nlc3NlZCBieSBnZXRvcHRzICovCisJaW50IG9wdG9mZjsJCS8qIHVzZWQgYnkgZ2V0b3B0cyAqLworfTsKKworCisKKyNkZWZpbmUgZWZsYWcgb3B0bGlzdFswXQorI2RlZmluZSBmZmxhZyBvcHRsaXN0WzFdCisjZGVmaW5lIElmbGFnIG9wdGxpc3RbMl0KKyNkZWZpbmUgaWZsYWcgb3B0bGlzdFszXQorI2RlZmluZSBtZmxhZyBvcHRsaXN0WzRdCisjZGVmaW5lIG5mbGFnIG9wdGxpc3RbNV0KKyNkZWZpbmUgc2ZsYWcgb3B0bGlzdFs2XQorI2RlZmluZSB4ZmxhZyBvcHRsaXN0WzddCisjZGVmaW5lIHZmbGFnIG9wdGxpc3RbOF0KKyNkZWZpbmUgVmZsYWcgb3B0bGlzdFs5XQorI2RlZmluZQlFZmxhZyBvcHRsaXN0WzEwXQorI2RlZmluZQlDZmxhZyBvcHRsaXN0WzExXQorI2RlZmluZQlhZmxhZyBvcHRsaXN0WzEyXQorI2RlZmluZQliZmxhZyBvcHRsaXN0WzEzXQorI2RlZmluZQl1ZmxhZyBvcHRsaXN0WzE0XQorI2RlZmluZQlub2xvZyBvcHRsaXN0WzE1XQorI2RlZmluZQlkZWJ1ZyBvcHRsaXN0WzE2XQorCisjZGVmaW5lIE5PUFRTCTE3CisKK2V4dGVybiBjb25zdCBjaGFyIG9wdGxldHRlcnNbTk9QVFNdOworZXh0ZXJuIGNoYXIgb3B0bGlzdFtOT1BUU107CisKKworZXh0ZXJuIGNoYXIgKm1pbnVzYzsJCS8qIGFyZ3VtZW50IHRvIC1jIG9wdGlvbiAqLworZXh0ZXJuIGNoYXIgKmFyZzA7CQkvKiAkMCAqLworZXh0ZXJuIHN0cnVjdCBzaHBhcmFtIHNoZWxscGFyYW07ICAvKiAkQCAqLworZXh0ZXJuIGNoYXIgKiphcmdwdHI7CQkvKiBhcmd1bWVudCBsaXN0IGZvciBidWlsdGluIGNvbW1hbmRzICovCitleHRlcm4gY2hhciAqb3B0aW9uYXJnOwkJLyogc2V0IGJ5IG5leHRvcHQgKi8KK2V4dGVybiBjaGFyICpvcHRwdHI7CQkvKiB1c2VkIGJ5IG5leHRvcHQgKi8KKwordm9pZCBwcm9jYXJncyhpbnQsIGNoYXIgKiopOwordm9pZCBvcHRzY2hhbmdlZCh2b2lkKTsKK3ZvaWQgc2V0cGFyYW0oY2hhciAqKik7Cit2b2lkIGZyZWVwYXJhbSh2b2xhdGlsZSBzdHJ1Y3Qgc2hwYXJhbSAqKTsKK2ludCBzaGlmdGNtZChpbnQsIGNoYXIgKiopOworaW50IHNldGNtZChpbnQsIGNoYXIgKiopOworaW50IGdldG9wdHNjbWQoaW50LCBjaGFyICoqKTsKK2ludCBuZXh0b3B0KGNvbnN0IGNoYXIgKik7Cit2b2lkIGdldG9wdHNyZXNldChjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvb3V0cHV0LmMgYi91c3IvZGFzaC9vdXRwdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjliNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvb3V0cHV0LmMKQEAgLTAsMCArMSwzODUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogU2hlbGwgb3V0cHV0IHJvdXRpbmVzLiAgV2UgdXNlIG91ciBvd24gb3V0cHV0IHJvdXRpbmVzIGJlY2F1c2U6CisgKglXaGVuIGEgYnVpbHRpbiBjb21tYW5kIGlzIGludGVycnVwdGVkIHdlIGhhdmUgdG8gZGlzY2FyZAorICoJCWFueSBwZW5kaW5nIG91dHB1dC4KKyAqCVdoZW4gYSBidWlsdGluIGNvbW1hbmQgYXBwZWFycyBpbiBiYWNrIHF1b3Rlcywgd2Ugd2FudCB0bworICoJCXNhdmUgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBpbiBhIHJlZ2lvbiBvYnRhaW5lZAorICoJCXZpYSBtYWxsb2MsIHJhdGhlciB0aGFuIGRvaW5nIGEgZm9yayBhbmQgcmVhZGluZyB0aGUKKyAqCQlvdXRwdXQgb2YgdGhlIGNvbW1hbmQgdmlhIGEgcGlwZS4KKyAqCU91ciBvdXRwdXQgcm91dGluZXMgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgc3RkaW8gcm91dGluZXMuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogcXVhZF90ICovCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CQkvKiBCU0Q0XzQgKi8KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIGRlZmluZXMgQlVGU0laICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgVVNFX0dMSUJDX1NURElPCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJtZW1hbGxvYy5oIgorI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorCisKKyNkZWZpbmUgT1VUQlVGU0laIEJVRlNJWgorI2RlZmluZSBNRU1fT1VUIC0zCQkvKiBvdXRwdXQgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAqLworCisKKyNpZmRlZiBVU0VfR0xJQkNfU1RESU8KK3N0cnVjdCBvdXRwdXQgb3V0cHV0ID0geworCXN0cmVhbTogMCwgbmV4dGM6IDAsIGVuZDogMCwgYnVmOiAwLCBidWZzaXplOiAwLCBmZDogMSwgZmxhZ3M6IDAKK307CitzdHJ1Y3Qgb3V0cHV0IGVycm91dCA9IHsKKwlzdHJlYW06IDAsIG5leHRjOiAwLCBlbmQ6IDAsIGJ1ZjogMCwgYnVmc2l6ZTogMCwgZmQ6IDIsIGZsYWdzOiAwCit9CisjaWZkZWYgbm90eWV0CitzdHJ1Y3Qgb3V0cHV0IG1lbW91dCA9IHsKKwlzdHJlYW06IDAsIG5leHRjOiAwLCBlbmQ6IDAsIGJ1ZjogMCwgYnVmc2l6ZTogMCwgZmQ6IE1FTV9PVVQsIGZsYWdzOiAwCit9OworI2VuZGlmCisjZWxzZQorc3RydWN0IG91dHB1dCBvdXRwdXQgPSB7CisJbmV4dGM6IDAsIGVuZDogMCwgYnVmOiAwLCBidWZzaXplOiBPVVRCVUZTSVosIGZkOiAxLCBmbGFnczogMAorfTsKK3N0cnVjdCBvdXRwdXQgZXJyb3V0ID0geworCW5leHRjOiAwLCBlbmQ6IDAsIGJ1ZjogMCwgYnVmc2l6ZTogMCwgZmQ6IDIsIGZsYWdzOiAwCit9Oworc3RydWN0IG91dHB1dCBwcmV2ZXJyb3V0OworI2lmZGVmIG5vdHlldAorc3RydWN0IG91dHB1dCBtZW1vdXQgPSB7CisJbmV4dGM6IDAsIGVuZDogMCwgYnVmOiAwLCBidWZzaXplOiAwLCBmZDogTUVNX09VVCwgZmxhZ3M6IDAKK307CisjZW5kaWYKKyNlbmRpZgorc3RydWN0IG91dHB1dCAqb3V0MSA9ICZvdXRwdXQ7CitzdHJ1Y3Qgb3V0cHV0ICpvdXQyID0gJmVycm91dDsKKworCisjaWZuZGVmIFVTRV9HTElCQ19TVERJTworc3RhdGljIHZvaWQgX19vdXRzdHIoY29uc3QgY2hhciAqLCBzaXplX3QsIHN0cnVjdCBvdXRwdXQgKik7CisjZW5kaWYKK3N0YXRpYyBpbnQgeHZzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworCisjaWZkZWYgbWtpbml0CisKK0lOQ0xVREUgIm91dHB1dC5oIgorSU5DTFVERSAibWVtYWxsb2MuaCIKKworSU5JVCB7CisjaWZkZWYgVVNFX0dMSUJDX1NURElPCisJaW5pdHN0cmVhbXMoKTsKKyNlbmRpZgorfQorCitSRVNFVCB7CisjaWZkZWYgbm90eWV0CisJb3V0MSA9ICZvdXRwdXQ7CisJb3V0MiA9ICZlcnJvdXQ7CisjaWZkZWYgVVNFX0dMSUJDX1NURElPCisJaWYgKG1lbW91dC5zdHJlYW0gIT0gTlVMTCkKKwkJX19jbG9zZW1lbW91dCgpOworI2VuZGlmCisJaWYgKG1lbW91dC5idWYgIT0gTlVMTCkgeworCQlja2ZyZWUobWVtb3V0LmJ1Zik7CisJCW1lbW91dC5idWYgPSBOVUxMOworCX0KKyNlbmRpZgorfQorCisjZW5kaWYKKworCisjaWZuZGVmIFVTRV9HTElCQ19TVERJTworc3RhdGljIHZvaWQKK19fb3V0c3RyKGNvbnN0IGNoYXIgKnAsIHNpemVfdCBsZW4sIHN0cnVjdCBvdXRwdXQgKmRlc3QpCit7CisJc2l6ZV90IGJ1ZnNpemU7CisJc2l6ZV90IG9mZnNldDsKKwlzaXplX3QgbmxlZnQ7CisKKwlubGVmdCA9IGRlc3QtPmVuZCAtIGRlc3QtPm5leHRjOworCWlmIChubGVmdCA+PSBsZW4pIHsKK2J1ZmZlcmVkOgorCQlkZXN0LT5uZXh0YyA9IG1lbXBjcHkoZGVzdC0+bmV4dGMsIHAsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlidWZzaXplID0gZGVzdC0+YnVmc2l6ZTsKKwlpZiAoIWJ1ZnNpemUpIHsKKwkJOworCX0gZWxzZSBpZiAoZGVzdC0+YnVmID09IE5VTEwpIHsKKwkJaWYgKGRlc3QtPmZkID09IE1FTV9PVVQgJiYgbGVuID4gYnVmc2l6ZSkgeworCQkJYnVmc2l6ZSA9IGxlbjsKKwkJfQorCQlvZmZzZXQgPSAwOworCQlnb3RvIGFsbG9jOworCX0gZWxzZSBpZiAoZGVzdC0+ZmQgPT0gTUVNX09VVCkgeworCQlvZmZzZXQgPSBidWZzaXplOworCQlpZiAoYnVmc2l6ZSA+PSBsZW4pIHsKKwkJCWJ1ZnNpemUgPDw9IDE7CisJCX0gZWxzZSB7CisJCQlidWZzaXplICs9IGxlbjsKKwkJfQorCQlpZiAoYnVmc2l6ZSA8IG9mZnNldCkKKwkJCWdvdG8gZXJyOworYWxsb2M6CisJCUlOVE9GRjsKKwkJZGVzdC0+YnVmID0gY2tyZWFsbG9jKGRlc3QtPmJ1ZiwgYnVmc2l6ZSk7CisJCWRlc3QtPmJ1ZnNpemUgPSBidWZzaXplOworCQlkZXN0LT5lbmQgPSBkZXN0LT5idWYgKyBidWZzaXplOworCQlkZXN0LT5uZXh0YyA9IGRlc3QtPmJ1ZiArIG9mZnNldDsKKwkJSU5UT047CisJfSBlbHNlIHsKKwkJZmx1c2hvdXQoZGVzdCk7CisJfQorCisJbmxlZnQgPSBkZXN0LT5lbmQgLSBkZXN0LT5uZXh0YzsKKwlpZiAobmxlZnQgPiBsZW4pCisJCWdvdG8gYnVmZmVyZWQ7CisKKwlpZiAoKHh3cml0ZShkZXN0LT5mZCwgcCwgbGVuKSkpIHsKK2VycjoKKwkJZGVzdC0+ZmxhZ3MgfD0gT1VUUFVUX0VSUjsKKwl9Cit9CisjZW5kaWYKKworCit2b2lkCitvdXRzdHIoY29uc3QgY2hhciAqcCwgc3RydWN0IG91dHB1dCAqZmlsZSkKK3sKKyNpZmRlZiBVU0VfR0xJQkNfU1RESU8KKwlJTlRPRkY7CisJZnB1dHMocCwgZmlsZS0+c3RyZWFtKTsKKwlJTlRPTjsKKyNlbHNlCisJc2l6ZV90IGxlbjsKKworCWxlbiA9IHN0cmxlbihwKTsKKwlfX291dHN0cihwLCBsZW4sIGZpbGUpOworI2VuZGlmCit9CisKKworI2lmbmRlZiBVU0VfR0xJQkNfU1RESU8KKworCit2b2lkCitvdXRjc2xvdyhpbnQgYywgc3RydWN0IG91dHB1dCAqZGVzdCkKK3sKKwljaGFyIGJ1ZiA9IGM7CisJX19vdXRzdHIoJmJ1ZiwgMSwgZGVzdCk7Cit9CisjZW5kaWYKKworCit2b2lkCitmbHVzaGFsbCh2b2lkKQoreworCWZsdXNob3V0KCZvdXRwdXQpOworI2lmZGVmIEZMVVNIRVJSCisJZmx1c2hvdXQoJmVycm91dCk7CisjZW5kaWYKK30KKworCit2b2lkCitmbHVzaG91dChzdHJ1Y3Qgb3V0cHV0ICpkZXN0KQoreworI2lmZGVmIFVTRV9HTElCQ19TVERJTworCUlOVE9GRjsKKwlmZmx1c2goZGVzdC0+c3RyZWFtKTsKKwlJTlRPTjsKKyNlbHNlCisJc2l6ZV90IGxlbjsKKworCWxlbiA9IGRlc3QtPm5leHRjIC0gZGVzdC0+YnVmOworCWlmICghbGVuIHx8IGRlc3QtPmZkIDwgMCkKKwkJcmV0dXJuOworCWRlc3QtPm5leHRjID0gZGVzdC0+YnVmOworCWlmICgoeHdyaXRlKGRlc3QtPmZkLCBkZXN0LT5idWYsIGxlbikpKQorCQlkZXN0LT5mbGFncyB8PSBPVVRQVVRfRVJSOworI2VuZGlmCit9CisKKwordm9pZAorb3V0Zm10KHN0cnVjdCBvdXRwdXQgKmZpbGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlkb2Zvcm1hdChmaWxlLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworfQorCisKK3ZvaWQKK291dDFmbXQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWRvZm9ybWF0KG91dDEsIGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKKworaW50CitmbXRzdHIoY2hhciAqb3V0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZXQ7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyZXQgPSB4dnNucHJpbnRmKG91dGJ1ZiwgbGVuZ3RoLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiByZXQ7Cit9CisKKworI2lmbmRlZiBVU0VfR0xJQkNfU1RESU8KK3ZvaWQKK2RvZm9ybWF0KHN0cnVjdCBvdXRwdXQgKmRlc3QsIGNvbnN0IGNoYXIgKmYsIHZhX2xpc3QgYXApCit7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwljaGFyICpzOworCWludCBsZW4sIHJldDsKKwlzaXplX3Qgc2l6ZTsKKwl2YV9saXN0IGFwMjsKKworCXZhX2NvcHkoYXAyLCBhcCk7CisJc2l6ZSA9IGRlc3QtPmVuZCAtIGRlc3QtPm5leHRjOworCWxlbiA9IHh2c25wcmludGYoZGVzdC0+bmV4dGMsIHNpemUsIGYsIGFwMik7CisJdmFfZW5kKGFwMik7CisJaWYgKGxlbiA8IDApIHsKKwkJZGVzdC0+ZmxhZ3MgfD0gT1VUUFVUX0VSUjsKKwkJcmV0dXJuOworCX0KKwlpZiAobGVuIDwgc2l6ZSkgeworCQlkZXN0LT5uZXh0YyArPSBsZW47CisJCXJldHVybjsKKwl9CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJcyA9IHN0YWxsb2MoKGxlbiA+PSBzdGFja2Jsb2Nrc2l6ZSgpID8gbGVuIDogc3RhY2tibG9ja3NpemUoKSkgKyAxKTsKKwlyZXQgPSB4dnNucHJpbnRmKHMsIGxlbiArIDEsIGYsIGFwKTsKKwlpZiAocmV0ID09IGxlbikKKwkJX19vdXRzdHIocywgbGVuLCBkZXN0KTsKKwllbHNlCisJCWRlc3QtPmZsYWdzIHw9IE9VVFBVVF9FUlI7CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7Cit9CisjZW5kaWYKKworCisKKy8qCisgKiBWZXJzaW9uIG9mIHdyaXRlIHdoaWNoIHJlc3VtZXMgYWZ0ZXIgYSBzaWduYWwgaXMgY2F1Z2h0LgorICovCisKK2ludAoreHdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG4pCit7CisJY29uc3QgY2hhciAqYnVmID0gcDsKKworCXdoaWxlIChuKSB7CisJCXNzaXplX3QgaTsKKwkJc2l6ZV90IG07CisKKwkJbSA9IG47CisJCWlmIChtID4gU1NJWkVfTUFYKQorCQkJbSA9IFNTSVpFX01BWDsKKwkJZG8geworCQkJaSA9IHdyaXRlKGZkLCBidWYsIG0pOworCQl9IHdoaWxlIChpIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisJCWlmIChpIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJYnVmICs9IGk7CisJCW4gLT0gaTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIG5vdHlldAorI2lmZGVmIFVTRV9HTElCQ19TVERJTwordm9pZCBpbml0c3RyZWFtcygpIHsKKwlvdXRwdXQuc3RyZWFtID0gc3Rkb3V0OworCWVycm91dC5zdHJlYW0gPSBzdGRlcnI7Cit9CisKKwordm9pZAorb3Blbm1lbW91dCh2b2lkKSB7CisJSU5UT0ZGOworCW1lbW91dC5zdHJlYW0gPSBvcGVuX21lbXN0cmVhbSgmbWVtb3V0LmJ1ZiwgJm1lbW91dC5idWZzaXplKTsKKwlJTlRPTjsKK30KKworCitpbnQKK19fY2xvc2VtZW1vdXQodm9pZCkgeworCWludCBlcnJvcjsKKwllcnJvciA9IGZjbG9zZShtZW1vdXQuc3RyZWFtKTsKKwltZW1vdXQuc3RyZWFtID0gTlVMTDsKKwlyZXR1cm4gZXJyb3I7Cit9CisjZW5kaWYKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQKK3h2c25wcmludGYoY2hhciAqb3V0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJaW50IHJldDsKKworCUlOVE9GRjsKKwlyZXQgPSB2c25wcmludGYob3V0YnVmLCBsZW5ndGgsIGZtdCwgYXApOworCUlOVE9OOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9vdXRwdXQuaCBiL3Vzci9kYXNoL291dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjMzMDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9vdXRwdXQuaApAQCAtMCwwICsxLDExMiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylvdXRwdXQuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisjaWZuZGVmIE9VVFBVVF9JTkNMCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZmRlZiBVU0VfR0xJQkNfU1RESU8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3N0cnVjdCBvdXRwdXQgeworI2lmZGVmIFVTRV9HTElCQ19TVERJTworCUZJTEUgKnN0cmVhbTsKKyNlbmRpZgorCWNoYXIgKm5leHRjOworCWNoYXIgKmVuZDsKKwljaGFyICpidWY7CisJc2l6ZV90IGJ1ZnNpemU7CisJaW50IGZkOworCWludCBmbGFnczsKK307CisKK2V4dGVybiBzdHJ1Y3Qgb3V0cHV0IG91dHB1dDsKK2V4dGVybiBzdHJ1Y3Qgb3V0cHV0IGVycm91dDsKK2V4dGVybiBzdHJ1Y3Qgb3V0cHV0IHByZXZlcnJvdXQ7CisjaWZkZWYgbm90eWV0CitleHRlcm4gc3RydWN0IG91dHB1dCBtZW1vdXQ7CisjZW5kaWYKK2V4dGVybiBzdHJ1Y3Qgb3V0cHV0ICpvdXQxOworZXh0ZXJuIHN0cnVjdCBvdXRwdXQgKm91dDI7CisKK3ZvaWQgb3V0c3RyKGNvbnN0IGNoYXIgKiwgc3RydWN0IG91dHB1dCAqKTsKKyNpZm5kZWYgVVNFX0dMSUJDX1NURElPCit2b2lkIG91dGNzbG93KGludCwgc3RydWN0IG91dHB1dCAqKTsKKyNlbmRpZgordm9pZCBmbHVzaGFsbCh2b2lkKTsKK3ZvaWQgZmx1c2hvdXQoc3RydWN0IG91dHB1dCAqKTsKK3ZvaWQgb3V0Zm10KHN0cnVjdCBvdXRwdXQgKiwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDIsMykpKTsKK3ZvaWQgb3V0MWZtdChjb25zdCBjaGFyICosIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sMSwyKSkpOworaW50IGZtdHN0cihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDMsNCkpKTsKKyNpZm5kZWYgVVNFX0dMSUJDX1NURElPCit2b2lkIGRvZm9ybWF0KHN0cnVjdCBvdXRwdXQgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgoraW50IHh3cml0ZShpbnQsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKyNpZmRlZiBub3R5ZXQKKyNpZmRlZiBVU0VfR0xJQkNfU1RESU8KK3ZvaWQgaW5pdHN0cmVhbXModm9pZCk7Cit2b2lkIG9wZW5tZW1vdXQodm9pZCk7CitpbnQgX19jbG9zZW1lbW91dCh2b2lkKTsKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnJlZXN0ZG91dCgpCit7CisJb3V0cHV0Lm5leHRjID0gb3V0cHV0LmJ1ZjsKKwlvdXRwdXQuZmxhZ3MgPSAwOworfQorCisjZGVmaW5lIE9VVFBVVF9FUlIgMDEJCS8qIGVycm9yIG9jY3VycmVkIG9uIG91dHB1dCAqLworCisjaWZkZWYgVVNFX0dMSUJDX1NURElPCisjZGVmaW5lIG91dGMoYywgbykJcHV0YygoYyksIChvKS0+c3RyZWFtKQorI2RlZmluZSBkb2Zvcm1hdChkLCBmLCBhKQl2ZnByaW50ZigoZCktPnN0cmVhbSwgKGYpLCAoYSkpCisjZWxzZQorI2RlZmluZSBvdXRjKGMsIGZpbGUpCSgoZmlsZSktPm5leHRjID09IChmaWxlKS0+ZW5kID8gb3V0Y3Nsb3coKGMpLCAoZmlsZSkpIDogKCooZmlsZSktPm5leHRjID0gKGMpLCAoZmlsZSktPm5leHRjKyspKQorI2VuZGlmCisjZGVmaW5lIG91dDFjKGMpCW91dGMoKGMpLCBvdXQxKQorI2RlZmluZSBvdXQyYyhjKQlvdXRjc2xvdygoYyksIG91dDIpCisjZGVmaW5lIG91dDFzdHIocykJb3V0c3RyKChzKSwgb3V0MSkKKyNkZWZpbmUgb3V0MnN0cihzKQlvdXRzdHIoKHMpLCBvdXQyKQorI2RlZmluZSBvdXRlcnIoZikJKGYpLT5mbGFncworCisjZGVmaW5lIE9VVFBVVF9JTkNMCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3BhcnNlci5jIGIvdXNyL2Rhc2gvcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmMDE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL3BhcnNlci5jCkBAIC0wLDAgKzEsMTU1NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAibm9kZXMuaCIKKyNpbmNsdWRlICJleHBhbmQuaCIJLyogZGVmaW5lcyBybWVzY2FwZXMoKSAqLworI2luY2x1ZGUgInJlZGlyLmgiCS8qIGRlZmluZXMgY29weWZkKCkgKi8KKyNpbmNsdWRlICJleGVjLmgiCS8qIGRlZmluZXMgZmluZF9idWlsdGluKCkgKi8KKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAiaW5wdXQuaCIKKyNpbmNsdWRlICJvdXRwdXQuaCIKKyNpbmNsdWRlICJ2YXIuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKyNpbmNsdWRlICJhbGlhcy5oIgorI2luY2x1ZGUgInNob3cuaCIKKyNpbmNsdWRlICJidWlsdGlucy5oIgorI2lmbmRlZiBTTUFMTAorI2luY2x1ZGUgIm15aGlzdGVkaXQuaCIKKyNlbmRpZgorCisvKgorICogU2hlbGwgY29tbWFuZCBwYXJzZXIuCisgKi8KKworI2RlZmluZSBFT0ZNQVJLTEVOIDc5CisKKy8qIHZhbHVlcyByZXR1cm5lZCBieSByZWFkdG9rZW4gKi8KKyNpbmNsdWRlICJ0b2tlbi5oIgorCisKKworc3RydWN0IGhlcmVkb2MgeworCXN0cnVjdCBoZXJlZG9jICpuZXh0OwkvKiBuZXh0IGhlcmUgZG9jdW1lbnQgaW4gbGlzdCAqLworCXVuaW9uIG5vZGUgKmhlcmU7CQkvKiByZWRpcmVjdGlvbiBub2RlICovCisJY2hhciAqZW9mbWFyazsJCS8qIHN0cmluZyBpbmRpY2F0aW5nIGVuZCBvZiBpbnB1dCAqLworCWludCBzdHJpcHRhYnM7CQkvKiBpZiBzZXQsIHN0cmlwIGxlYWRpbmcgdGFicyAqLworfTsKKworCisKK3N0cnVjdCBoZXJlZG9jICpoZXJlZG9jbGlzdDsJLyogbGlzdCBvZiBoZXJlIGRvY3VtZW50cyB0byByZWFkICovCitpbnQgZG9wcm9tcHQ7CQkJLyogaWYgc2V0LCBwcm9tcHQgdGhlIHVzZXIgKi8KK2ludCBuZWVkcHJvbXB0OwkJCS8qIHRydWUgaWYgaW50ZXJhY3RpdmUgYW5kIGF0IHN0YXJ0IG9mIGxpbmUgKi8KK2ludCBsYXN0dG9rZW47CQkJLyogbGFzdCB0b2tlbiByZWFkICovCitNS0lOSVQgaW50IHRva3B1c2hiYWNrOwkJLyogbGFzdCB0b2tlbiBwdXNoZWQgYmFjayAqLworY2hhciAqd29yZHRleHQ7CQkJLyogdGV4dCBvZiBsYXN0IHdvcmQgcmV0dXJuZWQgYnkgcmVhZHRva2VuICovCitpbnQgY2hlY2trd2Q7CitzdHJ1Y3Qgbm9kZWxpc3QgKmJhY2txdW90ZWxpc3Q7Cit1bmlvbiBub2RlICpyZWRpcm5vZGU7CitzdHJ1Y3QgaGVyZWRvYyAqaGVyZWRvYzsKK2ludCBxdW90ZWZsYWc7CQkJLyogc2V0IGlmIChwYXJ0IG9mKSBsYXN0IHRva2VuIHdhcyBxdW90ZWQgKi8KK2ludCBzdGFydGxpbm5vOwkJCS8qIGxpbmUgIyB3aGVyZSBsYXN0IHRva2VuIHN0YXJ0ZWQgKi8KKworCitTVEFUSUMgdW5pb24gbm9kZSAqbGlzdChpbnQpOworU1RBVElDIHVuaW9uIG5vZGUgKmFuZG9yKHZvaWQpOworU1RBVElDIHVuaW9uIG5vZGUgKnBpcGVsaW5lKHZvaWQpOworU1RBVElDIHVuaW9uIG5vZGUgKmNvbW1hbmQodm9pZCk7CitTVEFUSUMgdW5pb24gbm9kZSAqc2ltcGxlY21kKHZvaWQpOworU1RBVElDIHVuaW9uIG5vZGUgKm1ha2VuYW1lKHZvaWQpOworU1RBVElDIHZvaWQgcGFyc2VmbmFtZSh2b2lkKTsKK1NUQVRJQyB2b2lkIHBhcnNlaGVyZWRvYyh2b2lkKTsKK1NUQVRJQyBpbnQgcGVla3Rva2VuKHZvaWQpOworU1RBVElDIGludCByZWFkdG9rZW4odm9pZCk7CitTVEFUSUMgaW50IHh4cmVhZHRva2VuKHZvaWQpOworU1RBVElDIGludCByZWFkdG9rZW4xKGludCwgY2hhciBjb25zdCAqLCBjaGFyICosIGludCk7CitTVEFUSUMgaW50IG5vZXhwYW5kKGNoYXIgKik7CitTVEFUSUMgdm9pZCBzeW5leHBlY3QoaW50KSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKK1NUQVRJQyB2b2lkIHN5bmVycm9yKGNvbnN0IGNoYXIgKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CitTVEFUSUMgdm9pZCBzZXRwcm9tcHQoaW50KTsKKworCitzdGF0aWMgaW5saW5lIGludAoraXNhc3NpZ25tZW50KGNvbnN0IGNoYXIgKnApCit7CisJY29uc3QgY2hhciAqcSA9IGVuZG9mbmFtZShwKTsKKwlpZiAocCA9PSBxKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKnEgPT0gJz0nOworfQorCisKKy8qCisgKiBSZWFkIGFuZCBwYXJzZSBhIGNvbW1hbmQuICBSZXR1cm5zIE5FT0Ygb24gZW5kIG9mIGZpbGUuICAoTlVMTCBpcyBhCisgKiB2YWxpZCBwYXJzZSB0cmVlIGluZGljYXRpbmcgYSBibGFuayBsaW5lLikKKyAqLworCit1bmlvbiBub2RlICoKK3BhcnNlY21kKGludCBpbnRlcmFjdCkKK3sKKwlpbnQgdDsKKworCXRva3B1c2hiYWNrID0gMDsKKwlkb3Byb21wdCA9IGludGVyYWN0OworCWlmIChkb3Byb21wdCkKKwkJc2V0cHJvbXB0KGRvcHJvbXB0KTsKKwluZWVkcHJvbXB0ID0gMDsKKwl0ID0gcmVhZHRva2VuKCk7CisJaWYgKHQgPT0gVEVPRikKKwkJcmV0dXJuIE5FT0Y7CisJaWYgKHQgPT0gVE5MKQorCQlyZXR1cm4gTlVMTDsKKwl0b2twdXNoYmFjaysrOworCXJldHVybiBsaXN0KDEpOworfQorCisKK1NUQVRJQyB1bmlvbiBub2RlICoKK2xpc3QoaW50IG5sZmxhZykKK3sKKwl1bmlvbiBub2RlICpuMSwgKm4yLCAqbjM7CisJaW50IHRvazsKKworCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwlpZiAobmxmbGFnID09IDIgJiYgdG9rZW5kbGlzdFtwZWVrdG9rZW4oKV0pCisJCXJldHVybiBOVUxMOworCW4xID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCW4yID0gYW5kb3IoKTsKKwkJdG9rID0gcmVhZHRva2VuKCk7CisJCWlmICh0b2sgPT0gVEJBQ0tHTkQpIHsKKwkJCWlmIChuMi0+dHlwZSA9PSBOUElQRSkgeworCQkJCW4yLT5ucGlwZS5iYWNrZ25kID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG4yLT50eXBlICE9IE5SRURJUikgeworCQkJCQluMyA9IHN0YWxsb2Moc2l6ZW9mKHN0cnVjdCBucmVkaXIpKTsKKwkJCQkJbjMtPm5yZWRpci5uID0gbjI7CisJCQkJCW4zLT5ucmVkaXIucmVkaXJlY3QgPSBOVUxMOworCQkJCQluMiA9IG4zOworCQkJCX0KKwkJCQluMi0+dHlwZSA9IE5CQUNLR05EOworCQkJfQorCQl9CisJCWlmIChuMSA9PSBOVUxMKSB7CisJCQluMSA9IG4yOworCQl9CisJCWVsc2UgeworCQkJbjMgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmJpbmFyeSkpOworCQkJbjMtPnR5cGUgPSBOU0VNSTsKKwkJCW4zLT5uYmluYXJ5LmNoMSA9IG4xOworCQkJbjMtPm5iaW5hcnkuY2gyID0gbjI7CisJCQluMSA9IG4zOworCQl9CisJCXN3aXRjaCAodG9rKSB7CisJCWNhc2UgVEJBQ0tHTkQ6CisJCWNhc2UgVFNFTUk6CisJCQl0b2sgPSByZWFkdG9rZW4oKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFROTDoKKwkJCWlmICh0b2sgPT0gVE5MKSB7CisJCQkJcGFyc2VoZXJlZG9jKCk7CisJCQkJaWYgKG5sZmxhZyA9PSAxKQorCQkJCQlyZXR1cm4gbjE7CisJCQl9IGVsc2UgeworCQkJCXRva3B1c2hiYWNrKys7CisJCQl9CisJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQlpZiAodG9rZW5kbGlzdFtwZWVrdG9rZW4oKV0pCisJCQkJcmV0dXJuIG4xOworCQkJYnJlYWs7CisJCWNhc2UgVEVPRjoKKwkJCWlmIChoZXJlZG9jbGlzdCkKKwkJCQlwYXJzZWhlcmVkb2MoKTsKKwkJCWVsc2UKKwkJCQlwdW5nZXRjKCk7CQkvKiBwdXNoIGJhY2sgRU9GIG9uIGlucHV0ICovCisJCQlyZXR1cm4gbjE7CisJCWRlZmF1bHQ6CisJCQlpZiAobmxmbGFnID09IDEpCisJCQkJc3luZXhwZWN0KC0xKTsKKwkJCXRva3B1c2hiYWNrKys7CisJCQlyZXR1cm4gbjE7CisJCX0KKwl9Cit9CisKKworCitTVEFUSUMgdW5pb24gbm9kZSAqCithbmRvcih2b2lkKQoreworCXVuaW9uIG5vZGUgKm4xLCAqbjIsICpuMzsKKwlpbnQgdDsKKworCW4xID0gcGlwZWxpbmUoKTsKKwlmb3IgKDs7KSB7CisJCWlmICgodCA9IHJlYWR0b2tlbigpKSA9PSBUQU5EKSB7CisJCQl0ID0gTkFORDsKKwkJfSBlbHNlIGlmICh0ID09IFRPUikgeworCQkJdCA9IE5PUjsKKwkJfSBlbHNlIHsKKwkJCXRva3B1c2hiYWNrKys7CisJCQlyZXR1cm4gbjE7CisJCX0KKwkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCQluMiA9IHBpcGVsaW5lKCk7CisJCW4zID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5iaW5hcnkpKTsKKwkJbjMtPnR5cGUgPSB0OworCQluMy0+bmJpbmFyeS5jaDEgPSBuMTsKKwkJbjMtPm5iaW5hcnkuY2gyID0gbjI7CisJCW4xID0gbjM7CisJfQorfQorCisKKworU1RBVElDIHVuaW9uIG5vZGUgKgorcGlwZWxpbmUodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuMSwgKm4yLCAqcGlwZW5vZGU7CisJc3RydWN0IG5vZGVsaXN0ICpscCwgKnByZXY7CisJaW50IG5lZ2F0ZTsKKworCW5lZ2F0ZSA9IDA7CisJVFJBQ0UoKCJwaXBlbGluZTogZW50ZXJlZFxuIikpOworCWlmIChyZWFkdG9rZW4oKSA9PSBUTk9UKSB7CisJCW5lZ2F0ZSA9ICFuZWdhdGU7CisJCWNoZWNra3dkID0gQ0hLS1dEIHwgQ0hLQUxJQVM7CisJfSBlbHNlCisJCXRva3B1c2hiYWNrKys7CisJbjEgPSBjb21tYW5kKCk7CisJaWYgKHJlYWR0b2tlbigpID09IFRQSVBFKSB7CisJCXBpcGVub2RlID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5waXBlKSk7CisJCXBpcGVub2RlLT50eXBlID0gTlBJUEU7CisJCXBpcGVub2RlLT5ucGlwZS5iYWNrZ25kID0gMDsKKwkJbHAgPSAoc3RydWN0IG5vZGVsaXN0ICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBub2RlbGlzdCkpOworCQlwaXBlbm9kZS0+bnBpcGUuY21kbGlzdCA9IGxwOworCQlscC0+biA9IG4xOworCQlkbyB7CisJCQlwcmV2ID0gbHA7CisJCQlscCA9IChzdHJ1Y3Qgbm9kZWxpc3QgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5vZGVsaXN0KSk7CisJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQlscC0+biA9IGNvbW1hbmQoKTsKKwkJCXByZXYtPm5leHQgPSBscDsKKwkJfSB3aGlsZSAocmVhZHRva2VuKCkgPT0gVFBJUEUpOworCQlscC0+bmV4dCA9IE5VTEw7CisJCW4xID0gcGlwZW5vZGU7CisJfQorCXRva3B1c2hiYWNrKys7CisJaWYgKG5lZ2F0ZSkgeworCQluMiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBubm90KSk7CisJCW4yLT50eXBlID0gTk5PVDsKKwkJbjItPm5ub3QuY29tID0gbjE7CisJCXJldHVybiBuMjsKKwl9IGVsc2UKKwkJcmV0dXJuIG4xOworfQorCisKKworU1RBVElDIHVuaW9uIG5vZGUgKgorY29tbWFuZCh2b2lkKQoreworCXVuaW9uIG5vZGUgKm4xLCAqbjI7CisJdW5pb24gbm9kZSAqYXAsICoqYXBwOworCXVuaW9uIG5vZGUgKmNwLCAqKmNwcDsKKwl1bmlvbiBub2RlICpyZWRpciwgKipycHA7CisJdW5pb24gbm9kZSAqKnJwcDI7CisJaW50IHQ7CisKKwlyZWRpciA9IE5VTEw7CisJcnBwMiA9ICZyZWRpcjsKKworCXN3aXRjaCAocmVhZHRva2VuKCkpIHsKKwlkZWZhdWx0OgorCQlzeW5leHBlY3QoLTEpOworCQkvKiBOT1RSRUFDSEVEICovCisJY2FzZSBUSUY6CisJCW4xID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5pZikpOworCQluMS0+dHlwZSA9IE5JRjsKKwkJbjEtPm5pZi50ZXN0ID0gbGlzdCgwKTsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRUSEVOKQorCQkJc3luZXhwZWN0KFRUSEVOKTsKKwkJbjEtPm5pZi5pZnBhcnQgPSBsaXN0KDApOworCQluMiA9IG4xOworCQl3aGlsZSAocmVhZHRva2VuKCkgPT0gVEVMSUYpIHsKKwkJCW4yLT5uaWYuZWxzZXBhcnQgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmlmKSk7CisJCQluMiA9IG4yLT5uaWYuZWxzZXBhcnQ7CisJCQluMi0+dHlwZSA9IE5JRjsKKwkJCW4yLT5uaWYudGVzdCA9IGxpc3QoMCk7CisJCQlpZiAocmVhZHRva2VuKCkgIT0gVFRIRU4pCisJCQkJc3luZXhwZWN0KFRUSEVOKTsKKwkJCW4yLT5uaWYuaWZwYXJ0ID0gbGlzdCgwKTsKKwkJfQorCQlpZiAobGFzdHRva2VuID09IFRFTFNFKQorCQkJbjItPm5pZi5lbHNlcGFydCA9IGxpc3QoMCk7CisJCWVsc2UgeworCQkJbjItPm5pZi5lbHNlcGFydCA9IE5VTEw7CisJCQl0b2twdXNoYmFjaysrOworCQl9CisJCXQgPSBURkk7CisJCWJyZWFrOworCWNhc2UgVFdISUxFOgorCWNhc2UgVFVOVElMOiB7CisJCWludCBnb3Q7CisJCW4xID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5iaW5hcnkpKTsKKwkJbjEtPnR5cGUgPSAobGFzdHRva2VuID09IFRXSElMRSk/IE5XSElMRSA6IE5VTlRJTDsKKwkJbjEtPm5iaW5hcnkuY2gxID0gbGlzdCgwKTsKKwkJaWYgKChnb3Q9cmVhZHRva2VuKCkpICE9IFRETykgeworVFJBQ0UoKCJleHBlY3RpbmcgRE8gZ290ICVzICVzXG4iLCB0b2tuYW1lW2dvdF0sIGdvdCA9PSBUV09SRCA/IHdvcmR0ZXh0IDogIiIpKTsKKwkJCXN5bmV4cGVjdChURE8pOworCQl9CisJCW4xLT5uYmluYXJ5LmNoMiA9IGxpc3QoMCk7CisJCXQgPSBURE9ORTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVEZPUjoKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRXT1JEIHx8IHF1b3RlZmxhZyB8fCAhIGdvb2RuYW1lKHdvcmR0ZXh0KSkKKwkJCXN5bmVycm9yKCJCYWQgZm9yIGxvb3AgdmFyaWFibGUiKTsKKwkJbjEgPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmZvcikpOworCQluMS0+dHlwZSA9IE5GT1I7CisJCW4xLT5uZm9yLnZhciA9IHdvcmR0ZXh0OworCQljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCQlpZiAocmVhZHRva2VuKCkgPT0gVElOKSB7CisJCQlhcHAgPSAmYXA7CisJCQl3aGlsZSAocmVhZHRva2VuKCkgPT0gVFdPUkQpIHsKKwkJCQluMiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYXJnKSk7CisJCQkJbjItPnR5cGUgPSBOQVJHOworCQkJCW4yLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwkJCQluMi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQkJCSphcHAgPSBuMjsKKwkJCQlhcHAgPSAmbjItPm5hcmcubmV4dDsKKwkJCX0KKwkJCSphcHAgPSBOVUxMOworCQkJbjEtPm5mb3IuYXJncyA9IGFwOworCQkJaWYgKGxhc3R0b2tlbiAhPSBUTkwgJiYgbGFzdHRva2VuICE9IFRTRU1JKQorCQkJCXN5bmV4cGVjdCgtMSk7CisJCX0gZWxzZSB7CisJCQluMiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYXJnKSk7CisJCQluMi0+dHlwZSA9IE5BUkc7CisJCQluMi0+bmFyZy50ZXh0ID0gKGNoYXIgKilkb2xhdHN0cjsKKwkJCW4yLT5uYXJnLmJhY2txdW90ZSA9IE5VTEw7CisJCQluMi0+bmFyZy5uZXh0ID0gTlVMTDsKKwkJCW4xLT5uZm9yLmFyZ3MgPSBuMjsKKwkJCS8qCisJCQkgKiBOZXdsaW5lIG9yIHNlbWljb2xvbiBoZXJlIGlzIG9wdGlvbmFsIChidXQgbm90ZQorCQkJICogdGhhdCB0aGUgb3JpZ2luYWwgQm91cm5lIHNoZWxsIG9ubHkgYWxsb3dlZCBOTCkuCisJCQkgKi8KKwkJCWlmIChsYXN0dG9rZW4gIT0gVE5MICYmIGxhc3R0b2tlbiAhPSBUU0VNSSkKKwkJCQl0b2twdXNoYmFjaysrOworCQl9CisJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRETykKKwkJCXN5bmV4cGVjdChURE8pOworCQluMS0+bmZvci5ib2R5ID0gbGlzdCgwKTsKKwkJdCA9IFRET05FOworCQlicmVhazsKKwljYXNlIFRDQVNFOgorCQluMSA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuY2FzZSkpOworCQluMS0+dHlwZSA9IE5DQVNFOworCQlpZiAocmVhZHRva2VuKCkgIT0gVFdPUkQpCisJCQlzeW5leHBlY3QoVFdPUkQpOworCQluMS0+bmNhc2UuZXhwciA9IG4yID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5hcmcpKTsKKwkJbjItPnR5cGUgPSBOQVJHOworCQluMi0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCW4yLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCW4yLT5uYXJnLm5leHQgPSBOVUxMOworCQlkbyB7CisJCQljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCQl9IHdoaWxlIChyZWFkdG9rZW4oKSA9PSBUTkwpOworCQlpZiAobGFzdHRva2VuICE9IFRJTikKKwkJCXN5bmV4cGVjdChUSU4pOworCQljcHAgPSAmbjEtPm5jYXNlLmNhc2VzOworbmV4dF9jYXNlOgorCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEOworCQl0ID0gcmVhZHRva2VuKCk7CisJCXdoaWxlKHQgIT0gVEVTQUMpIHsKKwkJCWlmIChsYXN0dG9rZW4gPT0gVExQKQorCQkJCXJlYWR0b2tlbigpOworCQkJKmNwcCA9IGNwID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5jbGlzdCkpOworCQkJY3AtPnR5cGUgPSBOQ0xJU1Q7CisJCQlhcHAgPSAmY3AtPm5jbGlzdC5wYXR0ZXJuOworCQkJZm9yICg7OykgeworCQkJCSphcHAgPSBhcCA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuYXJnKSk7CisJCQkJYXAtPnR5cGUgPSBOQVJHOworCQkJCWFwLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwkJCQlhcC0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQkJCWlmIChyZWFkdG9rZW4oKSAhPSBUUElQRSkKKwkJCQkJYnJlYWs7CisJCQkJYXBwID0gJmFwLT5uYXJnLm5leHQ7CisJCQkJcmVhZHRva2VuKCk7CisJCQl9CisJCQlhcC0+bmFyZy5uZXh0ID0gTlVMTDsKKwkJCWlmIChsYXN0dG9rZW4gIT0gVFJQKQorCQkJCXN5bmV4cGVjdChUUlApOworCQkJY3AtPm5jbGlzdC5ib2R5ID0gbGlzdCgyKTsKKworCQkJY3BwID0gJmNwLT5uY2xpc3QubmV4dDsKKworCQkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRDsKKwkJCWlmICgodCA9IHJlYWR0b2tlbigpKSAhPSBURVNBQykgeworCQkJCWlmICh0ICE9IFRFTkRDQVNFKQorCQkJCQlzeW5leHBlY3QoVEVORENBU0UpOworCQkJCWVsc2UKKwkJCQkJZ290byBuZXh0X2Nhc2U7CisJCQl9CisJCX0KKwkJKmNwcCA9IE5VTEw7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBUTFA6CisJCW4xID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5yZWRpcikpOworCQluMS0+dHlwZSA9IE5TVUJTSEVMTDsKKwkJbjEtPm5yZWRpci5uID0gbGlzdCgwKTsKKwkJbjEtPm5yZWRpci5yZWRpcmVjdCA9IE5VTEw7CisJCXQgPSBUUlA7CisJCWJyZWFrOworCWNhc2UgVEJFR0lOOgorCQluMSA9IGxpc3QoMCk7CisJCXQgPSBURU5EOworCQlicmVhazsKKwljYXNlIFRXT1JEOgorCWNhc2UgVFJFRElSOgorCQl0b2twdXNoYmFjaysrOworCQlyZXR1cm4gc2ltcGxlY21kKCk7CisJfQorCisJaWYgKHJlYWR0b2tlbigpICE9IHQpCisJCXN5bmV4cGVjdCh0KTsKKworcmVkaXI6CisJLyogTm93IGNoZWNrIGZvciByZWRpcmVjdGlvbiB3aGljaCBtYXkgZm9sbG93IGNvbW1hbmQgKi8KKwljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCXJwcCA9IHJwcDI7CisJd2hpbGUgKHJlYWR0b2tlbigpID09IFRSRURJUikgeworCQkqcnBwID0gbjIgPSByZWRpcm5vZGU7CisJCXJwcCA9ICZuMi0+bmZpbGUubmV4dDsKKwkJcGFyc2VmbmFtZSgpOworCX0KKwl0b2twdXNoYmFjaysrOworCSpycHAgPSBOVUxMOworCWlmIChyZWRpcikgeworCQlpZiAobjEtPnR5cGUgIT0gTlNVQlNIRUxMKSB7CisJCQluMiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBucmVkaXIpKTsKKwkJCW4yLT50eXBlID0gTlJFRElSOworCQkJbjItPm5yZWRpci5uID0gbjE7CisJCQluMSA9IG4yOworCQl9CisJCW4xLT5ucmVkaXIucmVkaXJlY3QgPSByZWRpcjsKKwl9CisKKwlyZXR1cm4gbjE7Cit9CisKKworU1RBVElDIHVuaW9uIG5vZGUgKgorc2ltcGxlY21kKHZvaWQpIHsKKwl1bmlvbiBub2RlICphcmdzLCAqKmFwcDsKKwl1bmlvbiBub2RlICpuID0gTlVMTDsKKwl1bmlvbiBub2RlICp2YXJzLCAqKnZwcDsKKwl1bmlvbiBub2RlICoqcnBwLCAqcmVkaXI7CisJaW50IHNhdmVjaGVja2t3ZDsKKworCWFyZ3MgPSBOVUxMOworCWFwcCA9ICZhcmdzOworCXZhcnMgPSBOVUxMOworCXZwcCA9ICZ2YXJzOworCXJlZGlyID0gTlVMTDsKKwlycHAgPSAmcmVkaXI7CisKKwlzYXZlY2hlY2trd2QgPSBDSEtBTElBUzsKKwlmb3IgKDs7KSB7CisJCWNoZWNra3dkID0gc2F2ZWNoZWNra3dkOworCQlzd2l0Y2ggKHJlYWR0b2tlbigpKSB7CisJCWNhc2UgVFdPUkQ6CisJCQluID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5hcmcpKTsKKwkJCW4tPnR5cGUgPSBOQVJHOworCQkJbi0+bmFyZy50ZXh0ID0gd29yZHRleHQ7CisJCQluLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCQlpZiAoc2F2ZWNoZWNra3dkICYmIGlzYXNzaWdubWVudCh3b3JkdGV4dCkpIHsKKwkJCQkqdnBwID0gbjsKKwkJCQl2cHAgPSAmbi0+bmFyZy5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQkqYXBwID0gbjsKKwkJCQlhcHAgPSAmbi0+bmFyZy5uZXh0OworCQkJCXNhdmVjaGVja2t3ZCA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUUkVESVI6CisJCQkqcnBwID0gbiA9IHJlZGlybm9kZTsKKwkJCXJwcCA9ICZuLT5uZmlsZS5uZXh0OworCQkJcGFyc2VmbmFtZSgpOwkvKiByZWFkIG5hbWUgb2YgcmVkaXJlY3Rpb24gZmlsZSAqLworCQkJYnJlYWs7CisJCWNhc2UgVExQOgorCQkJaWYgKAorCQkJCWFyZ3MgJiYgYXBwID09ICZhcmdzLT5uYXJnLm5leHQgJiYKKwkJCQkhdmFycyAmJiAhcmVkaXIKKwkJCSkgeworCQkJCXN0cnVjdCBidWlsdGluY21kICpiY21kOworCQkJCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkJCQkvKiBXZSBoYXZlIGEgZnVuY3Rpb24gKi8KKwkJCQlpZiAocmVhZHRva2VuKCkgIT0gVFJQKQorCQkJCQlzeW5leHBlY3QoVFJQKTsKKwkJCQluYW1lID0gbi0+bmFyZy50ZXh0OworCQkJCWlmICgKKwkJCQkJIWdvb2RuYW1lKG5hbWUpIHx8ICgKKwkJCQkJCShiY21kID0gZmluZF9idWlsdGluKG5hbWUpKSAmJgorCQkJCQkJYmNtZC0+ZmxhZ3MgJiBCVUlMVElOX1NQRUNJQUwKKwkJCQkJKQorCQkJCSkKKwkJCQkJc3luZXJyb3IoIkJhZCBmdW5jdGlvbiBuYW1lIik7CisJCQkJbi0+dHlwZSA9IE5ERUZVTjsKKwkJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQkJbi0+bmFyZy5uZXh0ID0gY29tbWFuZCgpOworCQkJCXJldHVybiBuOworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQl0b2twdXNoYmFjaysrOworCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJKmFwcCA9IE5VTEw7CisJKnZwcCA9IE5VTEw7CisJKnJwcCA9IE5VTEw7CisJbiA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuY21kKSk7CisJbi0+dHlwZSA9IE5DTUQ7CisJbi0+bmNtZC5hcmdzID0gYXJnczsKKwluLT5uY21kLmFzc2lnbiA9IHZhcnM7CisJbi0+bmNtZC5yZWRpcmVjdCA9IHJlZGlyOworCXJldHVybiBuOworfQorCitTVEFUSUMgdW5pb24gbm9kZSAqCittYWtlbmFtZSh2b2lkKQoreworCXVuaW9uIG5vZGUgKm47CisKKwluID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5hcmcpKTsKKwluLT50eXBlID0gTkFSRzsKKwluLT5uYXJnLm5leHQgPSBOVUxMOworCW4tPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCW4tPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwlyZXR1cm4gbjsKK30KKwordm9pZCBmaXhyZWRpcih1bmlvbiBub2RlICpuLCBjb25zdCBjaGFyICp0ZXh0LCBpbnQgZXJyKQorCXsKKwlUUkFDRSgoIkZpeCByZWRpciAlcyAlZFxuIiwgdGV4dCwgZXJyKSk7CisJaWYgKCFlcnIpCisJCW4tPm5kdXAudm5hbWUgPSBOVUxMOworCisJaWYgKGlzX2RpZ2l0KHRleHRbMF0pICYmIHRleHRbMV0gPT0gJ1wwJykKKwkJbi0+bmR1cC5kdXBmZCA9IGRpZ2l0X3ZhbCh0ZXh0WzBdKTsKKwllbHNlIGlmICh0ZXh0WzBdID09ICctJyAmJiB0ZXh0WzFdID09ICdcMCcpCisJCW4tPm5kdXAuZHVwZmQgPSAtMTsKKwllbHNlIHsKKworCQlpZiAoZXJyKQorCQkJc3luZXJyb3IoIkJhZCBmZCBudW1iZXIiKTsKKwkJZWxzZQorCQkJbi0+bmR1cC52bmFtZSA9IG1ha2VuYW1lKCk7CisJfQorfQorCisKK1NUQVRJQyB2b2lkCitwYXJzZWZuYW1lKHZvaWQpCit7CisJdW5pb24gbm9kZSAqbiA9IHJlZGlybm9kZTsKKworCWlmIChyZWFkdG9rZW4oKSAhPSBUV09SRCkKKwkJc3luZXhwZWN0KC0xKTsKKwlpZiAobi0+dHlwZSA9PSBOSEVSRSkgeworCQlzdHJ1Y3QgaGVyZWRvYyAqaGVyZSA9IGhlcmVkb2M7CisJCXN0cnVjdCBoZXJlZG9jICpwOworCQlpbnQgaTsKKworCQlpZiAocXVvdGVmbGFnID09IDApCisJCQluLT50eXBlID0gTlhIRVJFOworCQlUUkFDRSgoIkhlcmUgZG9jdW1lbnQgJWRcbiIsIG4tPnR5cGUpKTsKKwkJaWYgKCEgbm9leHBhbmQod29yZHRleHQpIHx8IChpID0gc3RybGVuKHdvcmR0ZXh0KSkgPT0gMCB8fCBpID4gRU9GTUFSS0xFTikKKwkJCXN5bmVycm9yKCJJbGxlZ2FsIGVvZiBtYXJrZXIgZm9yIDw8IHJlZGlyZWN0aW9uIik7CisJCXJtZXNjYXBlcyh3b3JkdGV4dCk7CisJCWhlcmUtPmVvZm1hcmsgPSB3b3JkdGV4dDsKKwkJaGVyZS0+bmV4dCA9IE5VTEw7CisJCWlmIChoZXJlZG9jbGlzdCA9PSBOVUxMKQorCQkJaGVyZWRvY2xpc3QgPSBoZXJlOworCQllbHNlIHsKKwkJCWZvciAocCA9IGhlcmVkb2NsaXN0IDsgcC0+bmV4dCA7IHAgPSBwLT5uZXh0KTsKKwkJCXAtPm5leHQgPSBoZXJlOworCQl9CisJfSBlbHNlIGlmIChuLT50eXBlID09IE5UT0ZEIHx8IG4tPnR5cGUgPT0gTkZST01GRCkgeworCQlmaXhyZWRpcihuLCB3b3JkdGV4dCwgMCk7CisJfSBlbHNlIHsKKwkJbi0+bmZpbGUuZm5hbWUgPSBtYWtlbmFtZSgpOworCX0KK30KKworCisvKgorICogSW5wdXQgYW55IGhlcmUgZG9jdW1lbnRzLgorICovCisKK1NUQVRJQyB2b2lkCitwYXJzZWhlcmVkb2Modm9pZCkKK3sKKwlzdHJ1Y3QgaGVyZWRvYyAqaGVyZTsKKwl1bmlvbiBub2RlICpuOworCisJaGVyZSA9IGhlcmVkb2NsaXN0OworCWhlcmVkb2NsaXN0ID0gMDsKKworCXdoaWxlIChoZXJlKSB7CisJCWlmIChuZWVkcHJvbXB0KSB7CisJCQlzZXRwcm9tcHQoMik7CisJCX0KKwkJcmVhZHRva2VuMShwZ2V0YygpLCBoZXJlLT5oZXJlLT50eXBlID09IE5IRVJFPyBTUVNZTlRBWCA6IERRU1lOVEFYLAorCQkJCWhlcmUtPmVvZm1hcmssIGhlcmUtPnN0cmlwdGFicyk7CisJCW4gPSAodW5pb24gbm9kZSAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbmFyZykpOworCQluLT5uYXJnLnR5cGUgPSBOQVJHOworCQluLT5uYXJnLm5leHQgPSBOVUxMOworCQluLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwkJbi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQloZXJlLT5oZXJlLT5uaGVyZS5kb2MgPSBuOworCQloZXJlID0gaGVyZS0+bmV4dDsKKwl9Cit9CisKK1NUQVRJQyBpbnQKK3BlZWt0b2tlbih2b2lkKQoreworCWludCB0OworCisJdCA9IHJlYWR0b2tlbigpOworCXRva3B1c2hiYWNrKys7CisJcmV0dXJuICh0KTsKK30KKworU1RBVElDIGludAorcmVhZHRva2VuKHZvaWQpCit7CisJaW50IHQ7CisjaWZkZWYgREVCVUcKKwlpbnQgYWxyZWFkeXNlZW4gPSB0b2twdXNoYmFjazsKKyNlbmRpZgorCit0b3A6CisJdCA9IHh4cmVhZHRva2VuKCk7CisKKwkvKgorCSAqIGVhdCBuZXdsaW5lcworCSAqLworCWlmIChjaGVja2t3ZCAmIENIS05MKSB7CisJCXdoaWxlICh0ID09IFROTCkgeworCQkJcGFyc2VoZXJlZG9jKCk7CisJCQl0ID0geHhyZWFkdG9rZW4oKTsKKwkJfQorCX0KKworCWlmICh0ICE9IFRXT1JEIHx8IHF1b3RlZmxhZykgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGZvciBrZXl3b3JkcworCSAqLworCWlmIChjaGVja2t3ZCAmIENIS0tXRCkgeworCQljb25zdCBjaGFyICpjb25zdCAqcHA7CisKKwkJaWYgKChwcCA9IGZpbmRrd2Qod29yZHRleHQpKSkgeworCQkJbGFzdHRva2VuID0gdCA9IHBwIC0gcGFyc2Vrd2QgKyBLV0RPRkZTRVQ7CisJCQlUUkFDRSgoImtleXdvcmQgJXMgcmVjb2duaXplZFxuIiwgdG9rbmFtZVt0XSkpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoY2hlY2trd2QgJiBDSEtBTElBUykgeworCQlzdHJ1Y3QgYWxpYXMgKmFwOworCQlpZiAoKGFwID0gbG9va3VwYWxpYXMod29yZHRleHQsIDEpKSAhPSBOVUxMKSB7CisJCQlpZiAoKmFwLT52YWwpIHsKKwkJCQlwdXNoc3RyaW5nKGFwLT52YWwsIGFwKTsKKwkJCX0KKwkJCWdvdG8gdG9wOworCQl9CisJfQorb3V0OgorCWNoZWNra3dkID0gMDsKKyNpZmRlZiBERUJVRworCWlmICghYWxyZWFkeXNlZW4pCisJICAgIFRSQUNFKCgidG9rZW4gJXMgJXNcbiIsIHRva25hbWVbdF0sIHQgPT0gVFdPUkQgPyB3b3JkdGV4dCA6ICIiKSk7CisJZWxzZQorCSAgICBUUkFDRSgoInJlcmVhZCB0b2tlbiAlcyAlc1xuIiwgdG9rbmFtZVt0XSwgdCA9PSBUV09SRCA/IHdvcmR0ZXh0IDogIiIpKTsKKyNlbmRpZgorCXJldHVybiAodCk7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIG5leHQgaW5wdXQgdG9rZW4uCisgKiBJZiB0aGUgdG9rZW4gaXMgYSB3b3JkLCB3ZSBzZXQgYmFja3F1b3RlbGlzdCB0byB0aGUgbGlzdCBvZiBjbWRzIGluCisgKgliYWNrcXVvdGVzLiAgV2Ugc2V0IHF1b3RlZmxhZyB0byB0cnVlIGlmIGFueSBwYXJ0IG9mIHRoZSB3b3JkIHdhcworICoJcXVvdGVkLgorICogSWYgdGhlIHRva2VuIGlzIFRSRURJUiwgdGhlbiB3ZSBzZXQgcmVkaXJub2RlIHRvIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcKKyAqCXRoZSByZWRpcmVjdGlvbi4KKyAqIEluIGFsbCBjYXNlcywgdGhlIHZhcmlhYmxlIHN0YXJ0bGlubm8gaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUKKyAqCW9uIHdoaWNoIHRoZSB0b2tlbiBzdGFydHMuCisgKgorICogW0NoYW5nZSBjb21tZW50OiAgaGVyZSBkb2N1bWVudHMgYW5kIGludGVybmFsIHByb2NlZHVyZXNdCisgKiBbUmVhZHRva2VuIHNob3VsZG4ndCBoYXZlIGFueSBhcmd1bWVudHMuICBQZXJoYXBzIHdlIHNob3VsZCBtYWtlIHRoZQorICogIHdvcmQgcGFyc2luZyBjb2RlIGludG8gYSBzZXBhcmF0ZSByb3V0aW5lLiAgSW4gdGhpcyBjYXNlLCByZWFkdG9rZW4KKyAqICBkb2Vzbid0IG5lZWQgdG8gaGF2ZSBhbnkgaW50ZXJuYWwgcHJvY2VkdXJlcywgYnV0IHBhcnNld29yZCBkb2VzLgorICogIFdlIGNvdWxkIGFsc28gbWFrZSBwYXJzZW9wZXJhdG9yIGluIGVzc2VuY2UgdGhlIG1haW4gcm91dGluZSwgYW5kCisgKiAgaGF2ZSBwYXJzZXdvcmQgKHJlYWR0b2tlbjE/KSBoYW5kbGUgYm90aCB3b3JkcyBhbmQgcmVkaXJlY3Rpb24uXQorICovCisKKyNkZWZpbmUgUkVUVVJOKHRva2VuKQlyZXR1cm4gbGFzdHRva2VuID0gdG9rZW4KKworU1RBVElDIGludAoreHhyZWFkdG9rZW4odm9pZCkKK3sKKwlpbnQgYzsKKworCWlmICh0b2twdXNoYmFjaykgeworCQl0b2twdXNoYmFjayA9IDA7CisJCXJldHVybiBsYXN0dG9rZW47CisJfQorCWlmIChuZWVkcHJvbXB0KSB7CisJCXNldHByb21wdCgyKTsKKwl9CisJc3RhcnRsaW5ubyA9IHBsaW5ubzsKKwlmb3IgKDs7KSB7CS8qIHVudGlsIHRva2VuIG9yIHN0YXJ0IG9mIHdvcmQgZm91bmQgKi8KKwkJYyA9IHBnZXRjX21hY3JvKCk7CisJCXN3aXRjaCAoYykgeworCQljYXNlICcgJzogY2FzZSAnXHQnOgorCQljYXNlIFBFT0E6CisJCQljb250aW51ZTsKKwkJY2FzZSAnIyc6CisJCQl3aGlsZSAoKGMgPSBwZ2V0YygpKSAhPSAnXG4nICYmIGMgIT0gUEVPRik7CisJCQlwdW5nZXRjKCk7CisJCQljb250aW51ZTsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKHBnZXRjKCkgPT0gJ1xuJykgeworCQkJCXN0YXJ0bGlubm8gPSArK3BsaW5ubzsKKwkJCQlpZiAoZG9wcm9tcHQpCisJCQkJCXNldHByb21wdCgyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB1bmdldGMoKTsKKwkJCWdvdG8gYnJlYWtsb29wOworCQljYXNlICdcbic6CisJCQlwbGlubm8rKzsKKwkJCW5lZWRwcm9tcHQgPSBkb3Byb21wdDsKKwkJCVJFVFVSTihUTkwpOworCQljYXNlIFBFT0Y6CisJCQlSRVRVUk4oVEVPRik7CisJCWNhc2UgJyYnOgorCQkJaWYgKHBnZXRjKCkgPT0gJyYnKQorCQkJCVJFVFVSTihUQU5EKTsKKwkJCXB1bmdldGMoKTsKKwkJCVJFVFVSTihUQkFDS0dORCk7CisJCWNhc2UgJ3wnOgorCQkJaWYgKHBnZXRjKCkgPT0gJ3wnKQorCQkJCVJFVFVSTihUT1IpOworCQkJcHVuZ2V0YygpOworCQkJUkVUVVJOKFRQSVBFKTsKKwkJY2FzZSAnOyc6CisJCQlpZiAocGdldGMoKSA9PSAnOycpCisJCQkJUkVUVVJOKFRFTkRDQVNFKTsKKwkJCXB1bmdldGMoKTsKKwkJCVJFVFVSTihUU0VNSSk7CisJCWNhc2UgJygnOgorCQkJUkVUVVJOKFRMUCk7CisJCWNhc2UgJyknOgorCQkJUkVUVVJOKFRSUCk7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGJyZWFrbG9vcDsKKwkJfQorCX0KK2JyZWFrbG9vcDoKKwlyZXR1cm4gcmVhZHRva2VuMShjLCBCQVNFU1lOVEFYLCAoY2hhciAqKU5VTEwsIDApOworI3VuZGVmIFJFVFVSTgorfQorCisKKworLyoKKyAqIElmIGVvZm1hcmsgaXMgTlVMTCwgcmVhZCBhIHdvcmQgb3IgYSByZWRpcmVjdGlvbiBzeW1ib2wuICBJZiBlb2ZtYXJrCisgKiBpcyBub3QgTlVMTCwgcmVhZCBhIGhlcmUgZG9jdW1lbnQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIGVvZm1hcmsgaXMgdGhlCisgKiB3b3JkIHdoaWNoIG1hcmtzIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IGFuZCBzdHJpcHRhYnMgaXMgdHJ1ZSBpZgorICogbGVhZGluZyB0YWJzIHNob3VsZCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBkb2N1bWVudC4gIFRoZSBhcmd1bWVudCBmaXJzdGMKKyAqIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHRva2VuIG9yIGRvY3VtZW50LgorICoKKyAqIEJlY2F1c2UgQyBkb2VzIG5vdCBoYXZlIGludGVybmFsIHN1YnJvdXRpbmVzLCBJIGhhdmUgc2ltdWxhdGVkIHRoZW0KKyAqIHVzaW5nIGdvdG8ncyB0byBpbXBsZW1lbnQgdGhlIHN1YnJvdXRpbmUgbGlua2FnZS4gIFRoZSBmb2xsb3dpbmcgbWFjcm9zCisgKiB3aWxsIHJ1biBjb2RlIHRoYXQgYXBwZWFycyBhdCB0aGUgZW5kIG9mIHJlYWR0b2tlbjEuCisgKi8KKworI2RlZmluZSBDSEVDS0VORCgpCXtnb3RvIGNoZWNrZW5kOyBjaGVja2VuZF9yZXR1cm46O30KKyNkZWZpbmUgUEFSU0VSRURJUigpCXtnb3RvIHBhcnNlcmVkaXI7IHBhcnNlcmVkaXJfcmV0dXJuOjt9CisjZGVmaW5lIFBBUlNFU1VCKCkJe2dvdG8gcGFyc2VzdWI7IHBhcnNlc3ViX3JldHVybjo7fQorI2RlZmluZSBQQVJTRUJBQ0tRT0xEKCkJe29sZHN0eWxlID0gMTsgZ290byBwYXJzZWJhY2txOyBwYXJzZWJhY2txX29sZHJldHVybjo7fQorI2RlZmluZSBQQVJTRUJBQ0tRTkVXKCkJe29sZHN0eWxlID0gMDsgZ290byBwYXJzZWJhY2txOyBwYXJzZWJhY2txX25ld3JldHVybjo7fQorI2RlZmluZQlQQVJTRUFSSVRIKCkJe2dvdG8gcGFyc2Vhcml0aDsgcGFyc2Vhcml0aF9yZXR1cm46O30KKworU1RBVElDIGludAorcmVhZHRva2VuMShpbnQgZmlyc3RjLCBjaGFyIGNvbnN0ICpzeW50YXgsIGNoYXIgKmVvZm1hcmssIGludCBzdHJpcHRhYnMpCit7CisJaW50IGMgPSBmaXJzdGM7CisJY2hhciAqb3V0OworCWludCBsZW47CisJY2hhciBsaW5lW0VPRk1BUktMRU4gKyAxXTsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmJxbGlzdDsKKwlpbnQgcXVvdGVmOworCWludCBkYmxxdW90ZTsKKwlpbnQgdmFybmVzdDsJLyogbGV2ZWxzIG9mIHZhcmlhYmxlcyBleHBhbnNpb24gKi8KKwlpbnQgYXJpbmVzdDsJLyogbGV2ZWxzIG9mIGFyaXRobWV0aWMgZXhwYW5zaW9uICovCisJaW50IHBhcmVubGV2ZWw7CS8qIGxldmVscyBvZiBwYXJlbnMgaW4gYXJpdGhtZXRpYyAqLworCWludCBkcXZhcm5lc3Q7CS8qIGxldmVscyBvZiB2YXJpYWJsZXMgZXhwYW5zaW9uIHdpdGhpbiBkb3VibGUgcXVvdGVzICovCisJaW50IG9sZHN0eWxlOworCWNoYXIgY29uc3QgKnByZXZzeW50YXggPSBOVUxMOyAvKiBzeW50YXggYmVmb3JlIGFyaXRobWV0aWMgKi8KKworCXN0YXJ0bGlubm8gPSBwbGlubm87CisJZGJscXVvdGUgPSAwOworCWlmIChzeW50YXggPT0gRFFTWU5UQVgpCisJCWRibHF1b3RlID0gMTsKKwlxdW90ZWYgPSAwOworCWJxbGlzdCA9IE5VTEw7CisJdmFybmVzdCA9IDA7CisJYXJpbmVzdCA9IDA7CisJcGFyZW5sZXZlbCA9IDA7CisJZHF2YXJuZXN0ID0gMDsKKworCVNUQVJUU1RBQ0tTVFIob3V0KTsKKwlsb29wOiB7CS8qIGZvciBlYWNoIGxpbmUsIHVudGlsIGVuZCBvZiB3b3JkICovCisjaWYgQVRUWQorCQlpZiAoYyA9PSAnXDAzNCcgJiYgZG9wcm9tcHQKKwkJICYmIGF0dHlzZXQoKSAmJiAhIGVxdWFsKHRlcm12YWwoKSwgImVtYWNzIikpIHsKKwkJCWF0dHlsaW5lKCk7CisJCQlpZiAoc3ludGF4ID09IEJBU0VTWU5UQVgpCisJCQkJcmV0dXJuIHJlYWR0b2tlbigpOworCQkJYyA9IHBnZXRjKCk7CisJCQlnb3RvIGxvb3A7CisJCX0KKyNlbmRpZgorCQlDSEVDS0VORCgpOwkvKiBzZXQgYyB0byBQRU9GIGlmIGF0IGVuZCBvZiBoZXJlIGRvY3VtZW50ICovCisJCWZvciAoOzspIHsJLyogdW50aWwgZW5kIG9mIGxpbmUgb3IgZW5kIG9mIHdvcmQgKi8KKwkJCUNIRUNLU1RSU1BBQ0UoNCwgb3V0KTsJLyogcGVybWl0IDQgY2FsbHMgdG8gVVNUUFVUQyAqLworCQkJc3dpdGNoKHN5bnRheFtjXSkgeworCQkJY2FzZSBDTkw6CS8qICdcbicgKi8KKwkJCQlpZiAoc3ludGF4ID09IEJBU0VTWU5UQVgpCisJCQkJCWdvdG8gZW5kd29yZDsJLyogZXhpdCBvdXRlciBsb29wICovCisJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCXBsaW5ubysrOworCQkJCWlmIChkb3Byb21wdCkKKwkJCQkJc2V0cHJvbXB0KDIpOworCQkJCWMgPSBwZ2V0YygpOworCQkJCWdvdG8gbG9vcDsJCS8qIGNvbnRpbnVlIG91dGVyIGxvb3AgKi8KKwkJCWNhc2UgQ1dPUkQ6CisJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBDQ1RMOgorCQkJCWlmIChlb2ZtYXJrID09IE5VTEwgfHwgZGJscXVvdGUpCisJCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0JBQ0s6CS8qIGJhY2tzbGFzaCAqLworCQkJCWMgPSBwZ2V0YzIoKTsKKwkJCQlpZiAoYyA9PSBQRU9GKSB7CisJCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJCXB1bmdldGMoKTsKKwkJCQl9IGVsc2UgaWYgKGMgPT0gJ1xuJykgeworCQkJCQlpZiAoZG9wcm9tcHQpCisJCQkJCQlzZXRwcm9tcHQoMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKAorCQkJCQkJZGJscXVvdGUgJiYKKwkJCQkJCWMgIT0gJ1xcJyAmJiBjICE9ICdgJyAmJgorCQkJCQkJYyAhPSAnJCcgJiYgKAorCQkJCQkJCWMgIT0gJyInIHx8CisJCQkJCQkJZW9mbWFyayAhPSBOVUxMCisJCQkJCQkpCisJCQkJCSkgeworCQkJCQkJVVNUUFVUQyhDVExFU0MsIG91dCk7CisJCQkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJCX0KKwkJCQkJaWYgKFNRU1lOVEFYW2NdID09IENDVEwpCisJCQkJCQlVU1RQVVRDKENUTEVTQywgb3V0KTsKKwkJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCQlxdW90ZWYrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENTUVVPVEU6CisJCQkJc3ludGF4ID0gU1FTWU5UQVg7CitxdW90ZW1hcms6CisJCQkJaWYgKGVvZm1hcmsgPT0gTlVMTCkgeworCQkJCQlVU1RQVVRDKENUTFFVT1RFTUFSSywgb3V0KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENEUVVPVEU6CisJCQkJc3ludGF4ID0gRFFTWU5UQVg7CisJCQkJZGJscXVvdGUgPSAxOworCQkJCWdvdG8gcXVvdGVtYXJrOworCQkJY2FzZSBDRU5EUVVPVEU6CisJCQkJaWYgKGVvZm1hcmsgIT0gTlVMTCAmJiBhcmluZXN0ID09IDAgJiYKKwkJCQkgICAgdmFybmVzdCA9PSAwKSB7CisJCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZHF2YXJuZXN0ID09IDApIHsKKwkJCQkJCXN5bnRheCA9IEJBU0VTWU5UQVg7CisJCQkJCQlkYmxxdW90ZSA9IDA7CisJCQkJCX0KKwkJCQkJcXVvdGVmKys7CisJCQkJCWdvdG8gcXVvdGVtYXJrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ1ZBUjoJLyogJyQnICovCisJCQkJUEFSU0VTVUIoKTsJCS8qIHBhcnNlIHN1YnN0aXR1dGlvbiAqLworCQkJCWJyZWFrOworCQkJY2FzZSBDRU5EVkFSOgkvKiAnfScgKi8KKwkJCQlpZiAodmFybmVzdCA+IDApIHsKKwkJCQkJdmFybmVzdC0tOworCQkJCQlpZiAoZHF2YXJuZXN0ID4gMCkgeworCQkJCQkJZHF2YXJuZXN0LS07CisJCQkJCX0KKwkJCQkJVVNUUFVUQyhDVExFTkRWQVIsIG91dCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ0xQOgkvKiAnKCcgaW4gYXJpdGhtZXRpYyAqLworCQkJCXBhcmVubGV2ZWwrKzsKKwkJCQlVU1RQVVRDKGMsIG91dCk7CisJCQkJYnJlYWs7CisJCQljYXNlIENSUDoJLyogJyknIGluIGFyaXRobWV0aWMgKi8KKwkJCQlpZiAocGFyZW5sZXZlbCA+IDApIHsKKwkJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCQktLXBhcmVubGV2ZWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHBnZXRjKCkgPT0gJyknKSB7CisJCQkJCQlpZiAoLS1hcmluZXN0ID09IDApIHsKKwkJCQkJCQlVU1RQVVRDKENUTEVOREFSSSwgb3V0KTsKKwkJCQkJCQlzeW50YXggPSBwcmV2c3ludGF4OworCQkJCQkJCWlmIChzeW50YXggPT0gRFFTWU5UQVgpCisJCQkJCQkJCWRibHF1b3RlID0gMTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCWRibHF1b3RlID0gMDsKKwkJCQkJCX0gZWxzZQorCQkJCQkJCVVTVFBVVEMoJyknLCBvdXQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoKKwkJCQkJCSAqIHVuYmFsYW5jZWQgcGFyZW5zCisJCQkJCQkgKiAgKGRvbid0IDJuZCBndWVzcyAtIG5vIGVycm9yKQorCQkJCQkJICovCisJCQkJCQlwdW5nZXRjKCk7CisJCQkJCQlVU1RQVVRDKCcpJywgb3V0KTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ0JRVU9URToJLyogJ2AnICovCisJCQkJUEFSU0VCQUNLUU9MRCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBDRU9GOgorCQkJCWdvdG8gZW5kd29yZDsJCS8qIGV4aXQgb3V0ZXIgbG9vcCAqLworCQkJY2FzZSBDSUdOOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAodmFybmVzdCA9PSAwKQorCQkJCQlnb3RvIGVuZHdvcmQ7CS8qIGV4aXQgb3V0ZXIgbG9vcCAqLworCQkJCWlmIChjICE9IFBFT0EpIHsKKwkJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCX0KKwkJCX0KKwkJCWMgPSBwZ2V0Y19tYWNybygpOworCQl9CisJfQorZW5kd29yZDoKKwlpZiAoc3ludGF4ID09IEFSSVNZTlRBWCkKKwkJc3luZXJyb3IoIk1pc3NpbmcgJykpJyIpOworCWlmIChzeW50YXggIT0gQkFTRVNZTlRBWCAmJiBlb2ZtYXJrID09IE5VTEwpCisJCXN5bmVycm9yKCJVbnRlcm1pbmF0ZWQgcXVvdGVkIHN0cmluZyIpOworCWlmICh2YXJuZXN0ICE9IDApIHsKKwkJc3RhcnRsaW5ubyA9IHBsaW5ubzsKKwkJLyogeyAqLworCQlzeW5lcnJvcigiTWlzc2luZyAnfSciKTsKKwl9CisJVVNUUFVUQygnXDAnLCBvdXQpOworCWxlbiA9IG91dCAtIChjaGFyICopc3RhY2tibG9jaygpOworCW91dCA9IHN0YWNrYmxvY2soKTsKKwlpZiAoZW9mbWFyayA9PSBOVUxMKSB7CisJCWlmICgoYyA9PSAnPicgfHwgYyA9PSAnPCcpCisJCSAmJiBxdW90ZWYgPT0gMAorCQkgJiYgbGVuIDw9IDIKKwkJICYmICgqb3V0ID09ICdcMCcgfHwgaXNfZGlnaXQoKm91dCkpKSB7CisJCQlQQVJTRVJFRElSKCk7CisJCQlyZXR1cm4gbGFzdHRva2VuID0gVFJFRElSOworCQl9IGVsc2UgeworCQkJcHVuZ2V0YygpOworCQl9CisJfQorCXF1b3RlZmxhZyA9IHF1b3RlZjsKKwliYWNrcXVvdGVsaXN0ID0gYnFsaXN0OworCWdyYWJzdGFja2Jsb2NrKGxlbik7CisJd29yZHRleHQgPSBvdXQ7CisJcmV0dXJuIGxhc3R0b2tlbiA9IFRXT1JEOworLyogZW5kIG9mIHJlYWR0b2tlbiByb3V0aW5lICovCisKKworCisvKgorICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGhlcmUgZG9jdW1lbnQuICBXaGVuIHRoaXMKKyAqIGlzIGNhbGxlZCwgYyBpcyBzZXQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbmV4dCBpbnB1dCBsaW5lLiAgSWYKKyAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBoZXJlIGRvY3VtZW50LCB0aGlzIHJvdXRpbmUgc2V0cyB0aGUgYyB0byBQRU9GLgorICovCisKK2NoZWNrZW5kOiB7CisJaWYgKGVvZm1hcmspIHsKKwkJaWYgKGMgPT0gUEVPQSkgeworCQkJYyA9IHBnZXRjMigpOworCQl9CisJCWlmIChzdHJpcHRhYnMpIHsKKwkJCXdoaWxlIChjID09ICdcdCcpIHsKKwkJCQljID0gcGdldGMyKCk7CisJCQl9CisJCX0KKwkJaWYgKGMgPT0gKmVvZm1hcmspIHsKKwkJCWlmIChwZmdldHMobGluZSwgc2l6ZW9mIGxpbmUpICE9IE5VTEwpIHsKKwkJCQljaGFyICpwLCAqcTsKKworCQkJCXAgPSBsaW5lOworCQkJCWZvciAocSA9IGVvZm1hcmsgKyAxIDsgKnEgJiYgKnAgPT0gKnEgOyBwKyssIHErKyk7CisJCQkJaWYgKCpwID09ICdcbicgJiYgKnEgPT0gJ1wwJykgeworCQkJCQljID0gUEVPRjsKKwkJCQkJcGxpbm5vKys7CisJCQkJCW5lZWRwcm9tcHQgPSBkb3Byb21wdDsKKwkJCQl9IGVsc2UgeworCQkJCQlwdXNoc3RyaW5nKGxpbmUsIE5VTEwpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlnb3RvIGNoZWNrZW5kX3JldHVybjsKK30KKworCisvKgorICogUGFyc2UgYSByZWRpcmVjdGlvbiBvcGVyYXRvci4gIFRoZSB2YXJpYWJsZSAib3V0IiBwb2ludHMgdG8gYSBzdHJpbmcKKyAqIHNwZWNpZnlpbmcgdGhlIGZkIHRvIGJlIHJlZGlyZWN0ZWQuICBUaGUgdmFyaWFibGUgImMiIGNvbnRhaW5zIHRoZQorICogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSByZWRpcmVjdGlvbiBvcGVyYXRvci4KKyAqLworCitwYXJzZXJlZGlyOiB7CisJY2hhciBmZCA9ICpvdXQ7CisJdW5pb24gbm9kZSAqbnA7CisKKwlucCA9ICh1bmlvbiBub2RlICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBuZmlsZSkpOworCWlmIChjID09ICc+JykgeworCQlucC0+bmZpbGUuZmQgPSAxOworCQljID0gcGdldGMoKTsKKwkJaWYgKGMgPT0gJz4nKQorCQkJbnAtPnR5cGUgPSBOQVBQRU5EOworCQllbHNlIGlmIChjID09ICd8JykKKwkJCW5wLT50eXBlID0gTkNMT0JCRVI7CisJCWVsc2UgaWYgKGMgPT0gJyYnKQorCQkJbnAtPnR5cGUgPSBOVE9GRDsKKwkJZWxzZSB7CisJCQlucC0+dHlwZSA9IE5UTzsKKwkJCXB1bmdldGMoKTsKKwkJfQorCX0gZWxzZSB7CS8qIGMgPT0gJzwnICovCisJCW5wLT5uZmlsZS5mZCA9IDA7CisJCXN3aXRjaCAoYyA9IHBnZXRjKCkpIHsKKwkJY2FzZSAnPCc6CisJCQlpZiAoc2l6ZW9mIChzdHJ1Y3QgbmZpbGUpICE9IHNpemVvZiAoc3RydWN0IG5oZXJlKSkgeworCQkJCW5wID0gKHVuaW9uIG5vZGUgKilzdGFsbG9jKHNpemVvZiAoc3RydWN0IG5oZXJlKSk7CisJCQkJbnAtPm5maWxlLmZkID0gMDsKKwkJCX0KKwkJCW5wLT50eXBlID0gTkhFUkU7CisJCQloZXJlZG9jID0gKHN0cnVjdCBoZXJlZG9jICopc3RhbGxvYyhzaXplb2YgKHN0cnVjdCBoZXJlZG9jKSk7CisJCQloZXJlZG9jLT5oZXJlID0gbnA7CisJCQlpZiAoKGMgPSBwZ2V0YygpKSA9PSAnLScpIHsKKwkJCQloZXJlZG9jLT5zdHJpcHRhYnMgPSAxOworCQkJfSBlbHNlIHsKKwkJCQloZXJlZG9jLT5zdHJpcHRhYnMgPSAwOworCQkJCXB1bmdldGMoKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJyYnOgorCQkJbnAtPnR5cGUgPSBORlJPTUZEOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPic6CisJCQlucC0+dHlwZSA9IE5GUk9NVE87CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbnAtPnR5cGUgPSBORlJPTTsKKwkJCXB1bmdldGMoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmZCAhPSAnXDAnKQorCQlucC0+bmZpbGUuZmQgPSBkaWdpdF92YWwoZmQpOworCXJlZGlybm9kZSA9IG5wOworCWdvdG8gcGFyc2VyZWRpcl9yZXR1cm47Cit9CisKKworLyoKKyAqIFBhcnNlIGEgc3Vic3RpdHV0aW9uLiAgQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSByZWFkIHRoZSBkb2xsYXIgc2lnbgorICogYW5kIG5vdGhpbmcgZWxzZS4KKyAqLworCitwYXJzZXN1YjogeworCWludCBzdWJ0eXBlOworCWludCB0eXBlbG9jOworCWludCBmbGFnczsKKwljaGFyICpwOworCXN0YXRpYyBjb25zdCBjaGFyIHR5cGVzW10gPSAifS0rPz0iOworCisJYyA9IHBnZXRjKCk7CisJaWYgKAorCQljIDw9IFBFT0EgIHx8CisJCShjICE9ICcoJyAmJiBjICE9ICd7JyAmJiAhaXNfbmFtZShjKSAmJiAhaXNfc3BlY2lhbChjKSkKKwkpIHsKKwkJVVNUUFVUQygnJCcsIG91dCk7CisJCXB1bmdldGMoKTsKKwl9IGVsc2UgaWYgKGMgPT0gJygnKSB7CS8qICQoY29tbWFuZCkgb3IgJCgoYXJpdGgpKSAqLworCQlpZiAocGdldGMoKSA9PSAnKCcpIHsKKwkJCVBBUlNFQVJJVEgoKTsKKwkJfSBlbHNlIHsKKwkJCXB1bmdldGMoKTsKKwkJCVBBUlNFQkFDS1FORVcoKTsKKwkJfQorCX0gZWxzZSB7CisJCVVTVFBVVEMoQ1RMVkFSLCBvdXQpOworCQl0eXBlbG9jID0gb3V0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJCVVTVFBVVEMoVlNOT1JNQUwsIG91dCk7CisJCXN1YnR5cGUgPSBWU05PUk1BTDsKKwkJaWYgKGMgPT0gJ3snKSB7CisJCQljID0gcGdldGMoKTsKKwkJCWlmIChjID09ICcjJykgeworCQkJCWlmICgoYyA9IHBnZXRjKCkpID09ICd9JykKKwkJCQkJYyA9ICcjJzsKKwkJCQllbHNlCisJCQkJCXN1YnR5cGUgPSBWU0xFTkdUSDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlzdWJ0eXBlID0gMDsKKwkJfQorCQlpZiAoYyA+IFBFT0EgJiYgaXNfbmFtZShjKSkgeworCQkJZG8geworCQkJCVNUUFVUQyhjLCBvdXQpOworCQkJCWMgPSBwZ2V0YygpOworCQkJfSB3aGlsZSAoYyA+IFBFT0EgJiYgaXNfaW5fbmFtZShjKSk7CisJCX0gZWxzZSBpZiAoaXNfZGlnaXQoYykpIHsKKwkJCWRvIHsKKwkJCQlTVFBVVEMoYywgb3V0KTsKKwkJCQljID0gcGdldGMoKTsKKwkJCX0gd2hpbGUgKGlzX2RpZ2l0KGMpKTsKKwkJfQorCQllbHNlIGlmIChpc19zcGVjaWFsKGMpKSB7CisJCQlVU1RQVVRDKGMsIG91dCk7CisJCQljID0gcGdldGMoKTsKKwkJfQorCQllbHNlCitiYWRzdWI6CQkJc3luZXJyb3IoIkJhZCBzdWJzdGl0dXRpb24iKTsKKworCQlTVFBVVEMoJz0nLCBvdXQpOworCQlmbGFncyA9IDA7CisJCWlmIChzdWJ0eXBlID09IDApIHsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnOic6CisJCQkJZmxhZ3MgPSBWU05VTDsKKwkJCQljID0gcGdldGMoKTsKKwkJCQkvKkZBTExUSFJPVUdIKi8KKwkJCWRlZmF1bHQ6CisJCQkJcCA9IHN0cmNocih0eXBlcywgYyk7CisJCQkJaWYgKHAgPT0gTlVMTCkKKwkJCQkJZ290byBiYWRzdWI7CisJCQkJc3VidHlwZSA9IHAgLSB0eXBlcyArIFZTTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAnJSc6CisJCQljYXNlICcjJzoKKwkJCQl7CisJCQkJCWludCBjYyA9IGM7CisJCQkJCXN1YnR5cGUgPSBjID09ICcjJyA/IFZTVFJJTUxFRlQgOgorCQkJCQkJCSAgICAgVlNUUklNUklHSFQ7CisJCQkJCWMgPSBwZ2V0YygpOworCQkJCQlpZiAoYyA9PSBjYykKKwkJCQkJCXN1YnR5cGUrKzsKKwkJCQkJZWxzZQorCQkJCQkJcHVuZ2V0YygpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwdW5nZXRjKCk7CisJCX0KKwkJaWYgKGRibHF1b3RlIHx8IGFyaW5lc3QpCisJCQlmbGFncyB8PSBWU1FVT1RFOworCQkqKChjaGFyICopc3RhY2tibG9jaygpICsgdHlwZWxvYykgPSBzdWJ0eXBlIHwgZmxhZ3M7CisJCWlmIChzdWJ0eXBlICE9IFZTTk9STUFMKSB7CisJCQl2YXJuZXN0Kys7CisJCQlpZiAoZGJscXVvdGUgfHwgYXJpbmVzdCkgeworCQkJCWRxdmFybmVzdCsrOworCQkJfQorCQl9CisJfQorCWdvdG8gcGFyc2VzdWJfcmV0dXJuOworfQorCisKKy8qCisgKiBDYWxsZWQgdG8gcGFyc2UgY29tbWFuZCBzdWJzdGl0dXRpb25zLiAgTmV3c3R5bGUgaXMgc2V0IGlmIHRoZSBjb21tYW5kCisgKiBpcyBlbmNsb3NlZCBpbnNpZGUgJCguLi4pOyBubHBwIGlzIGEgcG9pbnRlciB0byB0aGUgaGVhZCBvZiB0aGUgbGlua2VkCisgKiBsaXN0IG9mIGNvbW1hbmRzIChwYXNzZWQgYnkgcmVmZXJlbmNlKSwgYW5kIHNhdmVsZW4gaXMgdGhlIG51bWJlciBvZgorICogY2hhcmFjdGVycyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aGljaCBtdXN0IGJlIHByZXNlcnZlZC4KKyAqLworCitwYXJzZWJhY2txOiB7CisJc3RydWN0IG5vZGVsaXN0ICoqbmxwcDsKKwl1bmlvbiBub2RlICpuOworCWNoYXIgKnN0cjsKKwlzaXplX3Qgc2F2ZWxlbjsKKwlpbnQgc2F2ZXByb21wdCA9IDA7CisKKwlzdHIgPSBOVUxMOworCXNhdmVsZW4gPSBvdXQgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlpZiAoc2F2ZWxlbiA+IDApIHsKKwkJc3RyID0gYWxsb2NhKHNhdmVsZW4pOworCQltZW1jcHkoc3RyLCBzdGFja2Jsb2NrKCksIHNhdmVsZW4pOworCX0KKyAgICAgICAgaWYgKG9sZHN0eWxlKSB7CisgICAgICAgICAgICAgICAgLyogV2UgbXVzdCByZWFkIHVudGlsIHRoZSBjbG9zaW5nIGJhY2txdW90ZSwgZ2l2aW5nIHNwZWNpYWwKKyAgICAgICAgICAgICAgICAgICB0cmVhdG1lbnQgdG8gc29tZSBzbGFzaGVzLCBhbmQgdGhlbiBwdXNoIHRoZSBzdHJpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgcmVyZWFkIGl0IGFzIGlucHV0LCBpbnRlcnByZXRpbmcgaXQgbm9ybWFsbHkuICAqLworICAgICAgICAgICAgICAgIGNoYXIgKnBvdXQ7CisgICAgICAgICAgICAgICAgaW50IHBjOworICAgICAgICAgICAgICAgIHNpemVfdCBwc2F2ZWxlbjsKKyAgICAgICAgICAgICAgICBjaGFyICpwc3RyOworCisKKyAgICAgICAgICAgICAgICBTVEFSVFNUQUNLU1RSKHBvdXQpOworCQlmb3IgKDs7KSB7CisJCQlpZiAobmVlZHByb21wdCkgeworCQkJCXNldHByb21wdCgyKTsKKwkJCX0KKwkJCXN3aXRjaCAocGMgPSBwZ2V0YygpKSB7CisJCQljYXNlICdgJzoKKwkJCQlnb3RvIGRvbmU7CisKKwkJCWNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYyA9IHBnZXRjKCkpID09ICdcbicpIHsKKwkJCQkJcGxpbm5vKys7CisJCQkJCWlmIChkb3Byb21wdCkKKwkJCQkJCXNldHByb21wdCgyKTsKKwkJCQkJLyoKKwkJCQkJICogSWYgZWF0aW5nIGEgbmV3bGluZSwgYXZvaWQgcHV0dGluZworCQkJCQkgKiB0aGUgbmV3bGluZSBpbnRvIHRoZSBuZXcgY2hhcmFjdGVyCisJCQkJCSAqIHN0cmVhbSAodmlhIHRoZSBTVFBVVEMgYWZ0ZXIgdGhlCisJCQkJCSAqIHN3aXRjaCkuCisJCQkJCSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYyAhPSAnXFwnICYmIHBjICE9ICdgJyAmJiBwYyAhPSAnJCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGJscXVvdGUgfHwgcGMgIT0gJyInKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFBVVEMoJ1xcJywgcG91dCk7CisJCQkJaWYgKHBjID4gUEVPQSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJCWNhc2UgUEVPRjoKKwkJCWNhc2UgUEVPQToKKwkJCSAgICAgICAgc3RhcnRsaW5ubyA9IHBsaW5ubzsKKwkJCQlzeW5lcnJvcigiRU9GIGluIGJhY2txdW90ZSBzdWJzdGl0dXRpb24iKTsKKworCQkJY2FzZSAnXG4nOgorCQkJCXBsaW5ubysrOworCQkJCW5lZWRwcm9tcHQgPSBkb3Byb21wdDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCVNUUFVUQyhwYywgcG91dCk7CisgICAgICAgICAgICAgICAgfQorZG9uZToKKyAgICAgICAgICAgICAgICBTVFBVVEMoJ1wwJywgcG91dCk7CisgICAgICAgICAgICAgICAgcHNhdmVsZW4gPSBwb3V0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHBzYXZlbGVuID4gMCkgeworCQkJcHN0ciA9IGdyYWJzdGFja3N0cihwb3V0KTsKKwkJCXNldGlucHV0c3RyaW5nKHBzdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCW5scHAgPSAmYnFsaXN0OworCXdoaWxlICgqbmxwcCkKKwkJbmxwcCA9ICYoKm5scHApLT5uZXh0OworCSpubHBwID0gKHN0cnVjdCBub2RlbGlzdCAqKXN0YWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgbm9kZWxpc3QpKTsKKwkoKm5scHApLT5uZXh0ID0gTlVMTDsKKworCWlmIChvbGRzdHlsZSkgeworCQlzYXZlcHJvbXB0ID0gZG9wcm9tcHQ7CisJCWRvcHJvbXB0ID0gMDsKKwl9CisKKwluID0gbGlzdCgyKTsKKworCWlmIChvbGRzdHlsZSkKKwkJZG9wcm9tcHQgPSBzYXZlcHJvbXB0OworCWVsc2UgeworCQlpZiAocmVhZHRva2VuKCkgIT0gVFJQKQorCQkJc3luZXhwZWN0KFRSUCk7CisJfQorCisJKCpubHBwKS0+biA9IG47CisgICAgICAgIGlmIChvbGRzdHlsZSkgeworCQkvKgorCQkgKiBTdGFydCByZWFkaW5nIGZyb20gb2xkIGZpbGUgYWdhaW4sIGlnbm9yaW5nIGFueSBwdXNoZWQgYmFjaworCQkgKiB0b2tlbnMgbGVmdCBmcm9tIHRoZSBiYWNrcXVvdGUgcGFyc2luZworCQkgKi8KKyAgICAgICAgICAgICAgICBwb3BmaWxlKCk7CisJCXRva3B1c2hiYWNrID0gMDsKKwl9CisJd2hpbGUgKHN0YWNrYmxvY2tzaXplKCkgPD0gc2F2ZWxlbikKKwkJZ3Jvd3N0YWNrYmxvY2soKTsKKwlTVEFSVFNUQUNLU1RSKG91dCk7CisJaWYgKHN0cikgeworCQltZW1jcHkob3V0LCBzdHIsIHNhdmVsZW4pOworCQlTVEFESlVTVChzYXZlbGVuLCBvdXQpOworCX0KKwlpZiAoYXJpbmVzdCB8fCBkYmxxdW90ZSkKKwkJVVNUUFVUQyhDVExCQUNLUSB8IENUTFFVT1RFLCBvdXQpOworCWVsc2UKKwkJVVNUUFVUQyhDVExCQUNLUSwgb3V0KTsKKwlpZiAob2xkc3R5bGUpCisJCWdvdG8gcGFyc2ViYWNrcV9vbGRyZXR1cm47CisJZWxzZQorCQlnb3RvIHBhcnNlYmFja3FfbmV3cmV0dXJuOworfQorCisvKgorICogUGFyc2UgYW4gYXJpdGhtZXRpYyBleHBhbnNpb24gKGluZGljYXRlIHN0YXJ0IG9mIG9uZSBhbmQgc2V0IHN0YXRlKQorICovCitwYXJzZWFyaXRoOiB7CisKKwlpZiAoKythcmluZXN0ID09IDEpIHsKKwkJcHJldnN5bnRheCA9IHN5bnRheDsKKwkJc3ludGF4ID0gQVJJU1lOVEFYOworCQlVU1RQVVRDKENUTEFSSSwgb3V0KTsKKwkJaWYgKGRibHF1b3RlKQorCQkJVVNUUFVUQygnIicsb3V0KTsKKwkJZWxzZQorCQkJVVNUUFVUQygnICcsb3V0KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiB3ZSBjb2xsYXBzZSBlbWJlZGRlZCBhcml0aG1ldGljIGV4cGFuc2lvbiB0bworCQkgKiBwYXJlbnRoZXNpcywgd2hpY2ggc2hvdWxkIGJlIGVxdWl2YWxlbnQKKwkJICovCisJCVVTVFBVVEMoJygnLCBvdXQpOworCX0KKwlnb3RvIHBhcnNlYXJpdGhfcmV0dXJuOworfQorCit9IC8qIGVuZCBvZiByZWFkdG9rZW4gKi8KKworCisKKyNpZmRlZiBta2luaXQKK0lOQ0xVREUgInBhcnNlci5oIgorUkVTRVQgeworCXRva3B1c2hiYWNrID0gMDsKKwljaGVja2t3ZCA9IDA7Cit9CisjZW5kaWYKKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBjb250YWlucyBub3RoaW5nIHRvIGV4cGFuZCAobm8gZG9sbGFyIHNpZ25zCisgKiBvciBiYWNrcXVvdGVzKS4KKyAqLworCitTVEFUSUMgaW50Citub2V4cGFuZChjaGFyICp0ZXh0KQoreworCWNoYXIgKnA7CisJc2lnbmVkIGNoYXIgYzsKKworCXAgPSB0ZXh0OworCXdoaWxlICgoYyA9ICpwKyspICE9ICdcMCcpIHsKKwkJaWYgKGMgPT0gQ1RMUVVPVEVNQVJLKQorCQkJY29udGludWU7CisJCWlmIChjID09IENUTEVTQykKKwkJCXArKzsKKwkJZWxzZSBpZiAoQkFTRVNZTlRBWFsoaW50KWNdID09IENDVEwpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFJldHVybiBvZiBhIGxlZ2FsIHZhcmlhYmxlIG5hbWUgKGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgemVybyBvcgorICogbW9yZSBsZXR0ZXJzLCB1bmRlcnNjb3JlcywgYW5kIGRpZ2l0cykuCisgKi8KKworY2hhciAqCitlbmRvZm5hbWUoY29uc3QgY2hhciAqbmFtZSkKKwl7CisJY2hhciAqcDsKKworCXAgPSAoY2hhciAqKSBuYW1lOworCWlmICghIGlzX25hbWUoKnApKQorCQlyZXR1cm4gcDsKKwl3aGlsZSAoKisrcCkgeworCQlpZiAoISBpc19pbl9uYW1lKCpwKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcDsKK30KKworCisvKgorICogQ2FsbGVkIHdoZW4gYW4gdW5leHBlY3RlZCB0b2tlbiBpcyByZWFkIGR1cmluZyB0aGUgcGFyc2UuICBUaGUgYXJndW1lbnQKKyAqIGlzIHRoZSB0b2tlbiB0aGF0IGlzIGV4cGVjdGVkLCBvciAtMSBpZiBtb3JlIHRoYW4gb25lIHR5cGUgb2YgdG9rZW4gY2FuCisgKiBvY2N1ciBhdCB0aGlzIHBvaW50LgorICovCisKK1NUQVRJQyB2b2lkCitzeW5leHBlY3QoaW50IHRva2VuKQoreworCWNoYXIgbXNnWzY0XTsKKworCWlmICh0b2tlbiA+PSAwKSB7CisJCWZtdHN0cihtc2csIDY0LCAiJXMgdW5leHBlY3RlZCAoZXhwZWN0aW5nICVzKSIsCisJCQl0b2tuYW1lW2xhc3R0b2tlbl0sIHRva25hbWVbdG9rZW5dKTsKKwl9IGVsc2UgeworCQlmbXRzdHIobXNnLCA2NCwgIiVzIHVuZXhwZWN0ZWQiLCB0b2tuYW1lW2xhc3R0b2tlbl0pOworCX0KKwlzeW5lcnJvcihtc2cpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworCitTVEFUSUMgdm9pZAorc3luZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworCXNoX2Vycm9yKCJTeW50YXggZXJyb3I6ICVzIiwgbXNnKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK1NUQVRJQyB2b2lkCitzZXRwcm9tcHQoaW50IHdoaWNoKQoreworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJaW50IHNob3c7CisKKwluZWVkcHJvbXB0ID0gMDsKKwl3aGljaHByb21wdCA9IHdoaWNoOworCisjaWZkZWYgU01BTEwKKwlzaG93ID0gMTsKKyNlbHNlCisJc2hvdyA9ICFlbDsKKyNlbmRpZgorCWlmIChzaG93KSB7CisJCXNldHN0YWNrbWFyaygmc21hcmspOworCQlzdGFsbG9jKHN0YWNrYmxvY2tzaXplKCkpOworCQlvdXQyc3RyKGdldHByb21wdChOVUxMKSk7CisJCXBvcHN0YWNrbWFyaygmc21hcmspOworCX0KK30KKworY29uc3QgY2hhciAqCitleHBhbmRzdHIoY29uc3QgY2hhciAqcHMpCit7CisJdW5pb24gbm9kZSBuOworCisJLyogWFhYIEZpeCAoY2hhciAqKSBjYXN0LiAqLworCXNldGlucHV0c3RyaW5nKChjaGFyICopcHMpOworCXJlYWR0b2tlbjEocGdldGMoKSwgRFFTWU5UQVgsIG51bGxzdHIsIDApOworCXBvcGZpbGUoKTsKKworCW4ubmFyZy50eXBlID0gTkFSRzsKKwluLm5hcmcubmV4dCA9IE5VTEw7CisJbi5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwluLm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKworCWV4cGFuZGFyZygmbiwgTlVMTCwgMCk7CisJcmV0dXJuIHN0YWNrYmxvY2soKTsKK30KKworLyoKKyAqIGNhbGxlZCBieSBlZGl0bGluZSAtLSBhbnkgZXhwYW5zaW9ucyB0byB0aGUgcHJvbXB0CisgKiAgICBzaG91bGQgYmUgYWRkZWQgaGVyZS4KKyAqLworY29uc3QgY2hhciAqCitnZXRwcm9tcHQodm9pZCAqdW51c2VkKQoreworCWNvbnN0IGNoYXIgKnByb21wdDsKKworCXN3aXRjaCAod2hpY2hwcm9tcHQpIHsKKwlkZWZhdWx0OgorI2lmZGVmIERFQlVHCisJCXJldHVybiAiPGludGVybmFsIHByb21wdCBlcnJvcj4iOworI2VuZGlmCisJY2FzZSAwOgorCQlyZXR1cm4gbnVsbHN0cjsKKwljYXNlIDE6CisJCXByb21wdCA9IHBzMXZhbCgpOworCQlicmVhazsKKwljYXNlIDI6CisJCXByb21wdCA9IHBzMnZhbCgpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXhwYW5kc3RyKHByb21wdCk7Cit9CisKK2NvbnN0IGNoYXIgKmNvbnN0ICoKK2ZpbmRrd2QoY29uc3QgY2hhciAqcykKK3sKKwlyZXR1cm4gZmluZHN0cmluZygKKwkJcywgcGFyc2Vrd2QsIHNpemVvZihwYXJzZWt3ZCkgLyBzaXplb2YoY29uc3QgY2hhciAqKQorCSk7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9wYXJzZXIuaCBiL3Vzci9kYXNoL3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2Y0NDAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9wYXJzZXIuaApAQCAtMCwwICsxLDk2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXBhcnNlci5oCTguMyAoQmVya2VsZXkpIDUvNC85NQorICovCisKKy8qIGNvbnRyb2wgY2hhcmFjdGVycyBpbiBhcmd1bWVudCBzdHJpbmdzICovCisjZGVmaW5lIENUTF9GSVJTVCAtMTI3CQkvKiBmaXJzdCAnc3BlY2lhbCcgY2hhcmFjdGVyICovCisjZGVmaW5lIENUTEVTQyAtMTI3CQkvKiBlc2NhcGUgbmV4dCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ1RMVkFSIC0xMjYJCS8qIHZhcmlhYmxlIGRlZm4gKi8KKyNkZWZpbmUgQ1RMRU5EVkFSIC0xMjUKKyNkZWZpbmUgQ1RMQkFDS1EgLTEyNAorI2RlZmluZSBDVExRVU9URSAwMQkJLyogb3JlZCB3aXRoIENUTEJBQ0tRIGNvZGUgaWYgaW4gcXVvdGVzICovCisvKglDVExCQUNLUSB8IENUTFFVT1RFID09IDEzMyAqLworI2RlZmluZQlDVExBUkkgLTEyMgkJLyogYXJpdGhtZXRpYyBleHByZXNzaW9uICovCisjZGVmaW5lCUNUTEVOREFSSSAtMTIxCisjZGVmaW5lCUNUTFFVT1RFTUFSSyAtMTIwCisjZGVmaW5lCUNUTF9MQVNUIC0xMjAJCS8qIGxhc3QgJ3NwZWNpYWwnIGNoYXJhY3RlciAqLworCisvKiB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnl0ZSAoZm9sbG93cyBDVExWQVIpICovCisjZGVmaW5lIFZTVFlQRQkweDBmCQkvKiB0eXBlIG9mIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiAqLworI2RlZmluZSBWU05VTAkweDEwCQkvKiBjb2xvbi0tdHJlYXQgdGhlIGVtcHR5IHN0cmluZyBhcyB1bnNldCAqLworI2RlZmluZSBWU1FVT1RFIDB4ODAJCS8qIGluc2lkZSBkb3VibGUgcXVvdGVzLS1zdXBwcmVzcyBzcGxpdHRpbmcgKi8KKworLyogdmFsdWVzIG9mIFZTVFlQRSBmaWVsZCAqLworI2RlZmluZSBWU05PUk1BTAkweDEJCS8qIG5vcm1hbCB2YXJpYWJsZTogICR2YXIgb3IgJHt2YXJ9ICovCisjZGVmaW5lIFZTTUlOVVMJCTB4MgkJLyogJHt2YXItdGV4dH0gKi8KKyNkZWZpbmUgVlNQTFVTCQkweDMJCS8qICR7dmFyK3RleHR9ICovCisjZGVmaW5lIFZTUVVFU1RJT04JMHg0CQkvKiAke3Zhcj9tZXNzYWdlfSAqLworI2RlZmluZSBWU0FTU0lHTgkweDUJCS8qICR7dmFyPXRleHR9ICovCisjZGVmaW5lIFZTVFJJTVJJR0hUCTB4NgkJLyogJHt2YXIlcGF0dGVybn0gKi8KKyNkZWZpbmUgVlNUUklNUklHSFRNQVggCTB4NwkJLyogJHt2YXIlJXBhdHRlcm59ICovCisjZGVmaW5lIFZTVFJJTUxFRlQJMHg4CQkvKiAke3ZhciNwYXR0ZXJufSAqLworI2RlZmluZSBWU1RSSU1MRUZUTUFYCTB4OQkJLyogJHt2YXIjI3BhdHRlcm59ICovCisjZGVmaW5lIFZTTEVOR1RICTB4YQkJLyogJHsjdmFyfSAqLworCisvKiB2YWx1ZXMgb2YgY2hlY2trd2QgdmFyaWFibGUgKi8KKyNkZWZpbmUgQ0hLQUxJQVMJMHgxCisjZGVmaW5lIENIS0tXRAkJMHgyCisjZGVmaW5lIENIS05MCQkweDQKKworCisvKgorICogTkVPRiBpcyByZXR1cm5lZCBieSBwYXJzZWNtZCB3aGVuIGl0IGVuY291bnRlcnMgYW4gZW5kIG9mIGZpbGUuICBJdAorICogbXVzdCBiZSBkaXN0aW5jdCBmcm9tIE5VTEwsIHNvIHdlIHVzZSB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIHRoYXQKKyAqIGhhcHBlbnMgdG8gYmUgaGFuZHkuCisgKi8KK2V4dGVybiBpbnQgdG9rcHVzaGJhY2s7CisjZGVmaW5lIE5FT0YgKCh1bmlvbiBub2RlICopJnRva3B1c2hiYWNrKQorZXh0ZXJuIGludCB3aGljaHByb21wdDsJCS8qIDEgPT0gUFMxLCAyID09IFBTMiAqLworZXh0ZXJuIGludCBjaGVja2t3ZDsKK2V4dGVybiBpbnQgc3RhcnRsaW5ubzsJCS8qIGxpbmUgIyB3aGVyZSBsYXN0IHRva2VuIHN0YXJ0ZWQgKi8KKworCit1bmlvbiBub2RlICpwYXJzZWNtZChpbnQpOwordm9pZCBmaXhyZWRpcih1bmlvbiBub2RlICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2NvbnN0IGNoYXIgKmdldHByb21wdCh2b2lkICopOworY29uc3QgY2hhciAqY29uc3QgKmZpbmRrd2QoY29uc3QgY2hhciAqKTsKK2NoYXIgKmVuZG9mbmFtZShjb25zdCBjaGFyICopOworY29uc3QgY2hhciAqZXhwYW5kc3RyKGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyBpbmxpbmUgaW50Citnb29kbmFtZShjb25zdCBjaGFyICpwKQoreworCXJldHVybiAhKmVuZG9mbmFtZShwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3JlZGlyLmMgYi91c3IvZGFzaC9yZWRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZDhlOWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9yZWRpci5jCkBAIC0wLDAgKzEsNDc1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CS8qIFBJUEVfQlVGICovCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoKKyAqIENvZGUgZm9yIGRlYWxpbmcgd2l0aCBpbnB1dC9vdXRwdXQgcmVkaXJlY3Rpb24uCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCisjaW5jbHVkZSAiam9icy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNpbmNsdWRlICJleHBhbmQuaCIKKyNpbmNsdWRlICJyZWRpci5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKworCisjZGVmaW5lIEVNUFRZIC0yCQkvKiBtYXJrcyBhbiB1bnVzZWQgc2xvdCBpbiByZWRpcnRhYiAqLworI2lmbmRlZiBQSVBFX0JVRgorIyBkZWZpbmUgUElQRVNJWkUgNDA5NgkJLyogYW1vdW50IG9mIGJ1ZmZlcmluZyBpbiBhIHBpcGUgKi8KKyNlbHNlCisjIGRlZmluZSBQSVBFU0laRSBQSVBFX0JVRgorI2VuZGlmCisKKworTUtJTklUCitzdHJ1Y3QgcmVkaXJ0YWIgeworCXN0cnVjdCByZWRpcnRhYiAqbmV4dDsKKwlpbnQgcmVuYW1lZFsxMF07CisJaW50IG51bGxyZWRpcnM7Cit9OworCisKK01LSU5JVCBzdHJ1Y3QgcmVkaXJ0YWIgKnJlZGlybGlzdDsKK01LSU5JVCBpbnQgbnVsbHJlZGlyczsKKworU1RBVElDIGludCBvcGVucmVkaXJlY3QodW5pb24gbm9kZSAqKTsKKyNpZmRlZiBub3R5ZXQKK1NUQVRJQyB2b2lkIGR1cHJlZGlyZWN0KHVuaW9uIG5vZGUgKiwgaW50LCBjaGFyWzEwXSk7CisjZWxzZQorU1RBVElDIHZvaWQgZHVwcmVkaXJlY3QodW5pb24gbm9kZSAqLCBpbnQpOworI2VuZGlmCitTVEFUSUMgaW50IG9wZW5oZXJlKHVuaW9uIG5vZGUgKik7CitTVEFUSUMgaW50IG5vY2xvYmJlcm9wZW4oY29uc3QgY2hhciAqKTsKKworCisvKgorICogUHJvY2VzcyBhIGxpc3Qgb2YgcmVkaXJlY3Rpb24gY29tbWFuZHMuICBJZiB0aGUgUkVESVJfUFVTSCBmbGFnIGlzIHNldCwKKyAqIG9sZCBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzdGFzaGVkIGF3YXkgc28gdGhhdCB0aGUgcmVkaXJlY3Rpb24gY2FuIGJlCisgKiB1bmRvbmUgYnkgY2FsbGluZyBwb3ByZWRpci4gIElmIHRoZSBSRURJUl9CQUNLUSBmbGFnIGlzIHNldCwgdGhlbiB0aGUKKyAqIHN0YW5kYXJkIG91dHB1dCwgYW5kIHRoZSBzdGFuZGFyZCBlcnJvciBpZiBpdCBiZWNvbWVzIGEgZHVwbGljYXRlIG9mCisgKiBzdGRvdXQsIGlzIHNhdmVkIGluIG1lbW9yeS4KKyAqLworCit2b2lkCityZWRpcmVjdCh1bmlvbiBub2RlICpyZWRpciwgaW50IGZsYWdzKQoreworCXVuaW9uIG5vZGUgKm47CisJc3RydWN0IHJlZGlydGFiICpzdjsKKwlpbnQgaTsKKwlpbnQgZmQ7CisJaW50IG5ld2ZkOworCWludCAqcDsKKyNpZiBub3R5ZXQKKwljaGFyIG1lbW9yeVsxMF07CS8qIGZpbGUgZGVzY3JpcHRvcnMgdG8gd3JpdGUgdG8gbWVtb3J5ICovCisKKwlmb3IgKGkgPSAxMCA7IC0taSA+PSAwIDsgKQorCQltZW1vcnlbaV0gPSAwOworCW1lbW9yeVsxXSA9IGZsYWdzICYgUkVESVJfQkFDS1E7CisjZW5kaWYKKwludWxscmVkaXJzKys7CisJaWYgKCFyZWRpcikgeworCQlyZXR1cm47CisJfQorCXN2ID0gTlVMTDsKKwlJTlRPRkY7CisJaWYgKGZsYWdzICYgUkVESVJfUFVTSCkgeworCQlzdHJ1Y3QgcmVkaXJ0YWIgKnE7CisJCXEgPSBja21hbGxvYyhzaXplb2YgKHN0cnVjdCByZWRpcnRhYikpOworCQlxLT5uZXh0ID0gcmVkaXJsaXN0OworCQlyZWRpcmxpc3QgPSBxOworCQlxLT5udWxscmVkaXJzID0gbnVsbHJlZGlycyAtIDE7CisJCWZvciAoaSA9IDAgOyBpIDwgMTAgOyBpKyspCisJCQlxLT5yZW5hbWVkW2ldID0gRU1QVFk7CisJCW51bGxyZWRpcnMgPSAwOworCQlzdiA9IHE7CisJfQorCW4gPSByZWRpcjsKKwlkbyB7CisJCWZkID0gbi0+bmZpbGUuZmQ7CisJCWlmICgobi0+bmZpbGUudHlwZSA9PSBOVE9GRCB8fCBuLT5uZmlsZS50eXBlID09IE5GUk9NRkQpICYmCisJCSAgICBuLT5uZHVwLmR1cGZkID09IGZkKQorCQkJY29udGludWU7IC8qIHJlZGlyZWN0IGZyb20vdG8gc2FtZSBmaWxlIGRlc2NyaXB0b3IgKi8KKworCQluZXdmZCA9IG9wZW5yZWRpcmVjdChuKTsKKwkJaWYgKGZkID09IG5ld2ZkKQorCQkJY29udGludWU7CisJCWlmIChzdiAmJiAqKHAgPSAmc3YtPnJlbmFtZWRbZmRdKSA9PSBFTVBUWSkgeworCQkJaW50IGkgPSBmY250bChmZCwgRl9EVVBGRCwgMTApOworCQkJaWYgKGkgPT0gLTEpIHsKKwkJCQlpID0gZXJybm87CisJCQkJaWYgKGkgIT0gRUJBREYpIHsKKwkJCQkJY29uc3QgY2hhciAqbSA9IHN0cmVycm9yKGkpOworCQkJCQljbG9zZShuZXdmZCk7CisJCQkJCXNoX2Vycm9yKCIlZDogJXMiLCBmZCwgbSk7CisJCQkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCSpwID0gaTsKKwkJCQljbG9zZShmZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljbG9zZShmZCk7CisJCX0KKyNpZmRlZiBub3R5ZXQKKwkJZHVwcmVkaXJlY3QobiwgbmV3ZmQsIG1lbW9yeSk7CisjZWxzZQorCQlkdXByZWRpcmVjdChuLCBuZXdmZCk7CisjZW5kaWYKKwl9IHdoaWxlICgobiA9IG4tPm5maWxlLm5leHQpKTsKKwlJTlRPTjsKKyNpZmRlZiBub3R5ZXQKKwlpZiAobWVtb3J5WzFdKQorCQlvdXQxID0gJm1lbW91dDsKKwlpZiAobWVtb3J5WzJdKQorCQlvdXQyID0gJm1lbW91dDsKKyNlbmRpZgorCWlmIChmbGFncyAmIFJFRElSX1NBVkVGRDIgJiYgc3YgJiYgc3YtPnJlbmFtZWRbMl0gPj0gMCkKKwkJcHJldmVycm91dC5mZCA9IHN2LT5yZW5hbWVkWzJdOworfQorCisKK1NUQVRJQyBpbnQKK29wZW5yZWRpcmVjdCh1bmlvbiBub2RlICpyZWRpcikKK3sKKwljaGFyICpmbmFtZTsKKwlpbnQgZjsKKworCXN3aXRjaCAocmVkaXItPm5maWxlLnR5cGUpIHsKKwljYXNlIE5GUk9NOgorCQlmbmFtZSA9IHJlZGlyLT5uZmlsZS5leHBmbmFtZTsKKwkJaWYgKChmID0gb3BlbjY0KGZuYW1lLCBPX1JET05MWSkpIDwgMCkKKwkJCWdvdG8gZW9wZW47CisJCWJyZWFrOworCWNhc2UgTkZST01UTzoKKwkJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJCWlmICgoZiA9IG9wZW42NChmbmFtZSwgT19SRFdSfE9fQ1JFQVR8T19UUlVOQywgMDY2NikpIDwgMCkKKwkJCWdvdG8gZWNyZWF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOVE86CisJCS8qIFRha2UgY2FyZSBvZiBub2Nsb2JiZXIgbW9kZS4gKi8KKwkJaWYgKENmbGFnKSB7CisJCQlmbmFtZSA9IHJlZGlyLT5uZmlsZS5leHBmbmFtZTsKKwkJCWlmICgoZiA9IG5vY2xvYmJlcm9wZW4oZm5hbWUpKSA8IDApCisJCQkJZ290byBlY3JlYXRlOworCQkJYnJlYWs7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE5DTE9CQkVSOgorCQlmbmFtZSA9IHJlZGlyLT5uZmlsZS5leHBmbmFtZTsKKwkJaWYgKChmID0gb3BlbjY0KGZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIDA2NjYpKSA8IDApCisJCQlnb3RvIGVjcmVhdGU7CisJCWJyZWFrOworCWNhc2UgTkFQUEVORDoKKwkJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJCWlmICgoZiA9IG9wZW42NChmbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX0FQUEVORCwgMDY2NikpIDwgMCkKKwkJCWdvdG8gZWNyZWF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKyNpZmRlZiBERUJVRworCQlhYm9ydCgpOworI2VuZGlmCisJCS8qIEZhbGwgdGhyb3VnaCB0byBlbGltaW5hdGUgd2FybmluZy4gKi8KKwljYXNlIE5UT0ZEOgorCWNhc2UgTkZST01GRDoKKwkJZiA9IC0xOworCQlicmVhazsKKwljYXNlIE5IRVJFOgorCWNhc2UgTlhIRVJFOgorCQlmID0gb3BlbmhlcmUocmVkaXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZjsKK2VjcmVhdGU6CisJc2hfZXJyb3IoImNhbm5vdCBjcmVhdGUgJXM6ICVzIiwgZm5hbWUsIGVycm1zZyhlcnJubywgRV9DUkVBVCkpOworZW9wZW46CisJc2hfZXJyb3IoImNhbm5vdCBvcGVuICVzOiAlcyIsIGZuYW1lLCBlcnJtc2coZXJybm8sIEVfT1BFTikpOworfQorCisKK1NUQVRJQyB2b2lkCisjaWZkZWYgbm90eWV0CitkdXByZWRpcmVjdChyZWRpciwgZiwgbWVtb3J5KQorI2Vsc2UKK2R1cHJlZGlyZWN0KHJlZGlyLCBmKQorI2VuZGlmCisJdW5pb24gbm9kZSAqcmVkaXI7CisJaW50IGY7CisjaWZkZWYgbm90eWV0CisJY2hhciBtZW1vcnlbMTBdOworI2VuZGlmCisJeworCWludCBmZCA9IHJlZGlyLT5uZmlsZS5mZDsKKworI2lmZGVmIG5vdHlldAorCW1lbW9yeVtmZF0gPSAwOworI2VuZGlmCisJaWYgKHJlZGlyLT5uZmlsZS50eXBlID09IE5UT0ZEIHx8IHJlZGlyLT5uZmlsZS50eXBlID09IE5GUk9NRkQpIHsKKwkJaWYgKHJlZGlyLT5uZHVwLmR1cGZkID49IDApIHsJLyogaWYgbm90ICI+Ji0iICovCisjaWZkZWYgbm90eWV0CisJCQlpZiAobWVtb3J5W3JlZGlyLT5uZHVwLmR1cGZkXSkKKwkJCQltZW1vcnlbZmRdID0gMTsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCWNvcHlmZChyZWRpci0+bmR1cC5kdXBmZCwgZmQpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoZiAhPSBmZCkgeworCQljb3B5ZmQoZiwgZmQpOworCQljbG9zZShmKTsKKwl9CisJcmV0dXJuOworfQorCisKKy8qCisgKiBIYW5kbGUgaGVyZSBkb2N1bWVudHMuICBOb3JtYWxseSB3ZSBmb3JrIG9mZiBhIHByb2Nlc3MgdG8gd3JpdGUgdGhlCisgKiBkYXRhIHRvIGEgcGlwZS4gIElmIHRoZSBkb2N1bWVudCBpcyBzaG9ydCwgd2UgY2FuIHN0dWZmIHRoZSBkYXRhIGluCisgKiB0aGUgcGlwZSB3aXRob3V0IGZvcmtpbmcuCisgKi8KKworU1RBVElDIGludAorb3BlbmhlcmUodW5pb24gbm9kZSAqcmVkaXIpCit7CisJaW50IHBpcFsyXTsKKwlzaXplX3QgbGVuID0gMDsKKworCWlmIChwaXBlKHBpcCkgPCAwKQorCQlzaF9lcnJvcigiUGlwZSBjYWxsIGZhaWxlZCIpOworCWlmIChyZWRpci0+dHlwZSA9PSBOSEVSRSkgeworCQlsZW4gPSBzdHJsZW4ocmVkaXItPm5oZXJlLmRvYy0+bmFyZy50ZXh0KTsKKwkJaWYgKGxlbiA8PSBQSVBFU0laRSkgeworCQkJeHdyaXRlKHBpcFsxXSwgcmVkaXItPm5oZXJlLmRvYy0+bmFyZy50ZXh0LCBsZW4pOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKGZvcmtzaGVsbCgoc3RydWN0IGpvYiAqKU5VTEwsICh1bmlvbiBub2RlICopTlVMTCwgRk9SS19OT0pPQikgPT0gMCkgeworCQljbG9zZShwaXBbMF0pOworCQlzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKwkJc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOworCQlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKyNpZmRlZiBTSUdUU1RQCisJCXNpZ25hbChTSUdUU1RQLCBTSUdfSUdOKTsKKyNlbmRpZgorCQlzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisJCWlmIChyZWRpci0+dHlwZSA9PSBOSEVSRSkKKwkJCXh3cml0ZShwaXBbMV0sIHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCwgbGVuKTsKKwkJZWxzZQorCQkJZXhwYW5kaGVyZShyZWRpci0+bmhlcmUuZG9jLCBwaXBbMV0pOworCQlfZXhpdCgwKTsKKwl9CitvdXQ6CisJY2xvc2UocGlwWzFdKTsKKwlyZXR1cm4gcGlwWzBdOworfQorCisKKworLyoKKyAqIFVuZG8gdGhlIGVmZmVjdHMgb2YgdGhlIGxhc3QgcmVkaXJlY3Rpb24uCisgKi8KKwordm9pZAorcG9wcmVkaXIoaW50IGRyb3ApCit7CisJc3RydWN0IHJlZGlydGFiICpycDsKKwlpbnQgaTsKKworCWlmICgtLW51bGxyZWRpcnMgPj0gMCkKKwkJcmV0dXJuOworCUlOVE9GRjsKKwlycCA9IHJlZGlybGlzdDsKKwlmb3IgKGkgPSAwIDsgaSA8IDEwIDsgaSsrKSB7CisJCWlmIChycC0+cmVuYW1lZFtpXSAhPSBFTVBUWSkgeworCQkJaWYgKCFkcm9wKSB7CisJCQkJY2xvc2UoaSk7CisJCQkJY29weWZkKHJwLT5yZW5hbWVkW2ldLCBpKTsKKwkJCX0KKwkJCWNsb3NlKHJwLT5yZW5hbWVkW2ldKTsKKwkJfQorCX0KKwlyZWRpcmxpc3QgPSBycC0+bmV4dDsKKwludWxscmVkaXJzID0gcnAtPm51bGxyZWRpcnM7CisJY2tmcmVlKHJwKTsKKwlJTlRPTjsKK30KKworLyoKKyAqIFVuZG8gYWxsIHJlZGlyZWN0aW9ucy4gIENhbGxlZCBvbiBlcnJvciBvciBpbnRlcnJ1cHQuCisgKi8KKworI2lmZGVmIG1raW5pdAorCitJTkNMVURFICJyZWRpci5oIgorCitSRVNFVCB7CisJY2xlYXJyZWRpcigwKTsKK30KKworI2VuZGlmCisKKy8qCisgKiBEaXNjYXJkIGFsbCBzYXZlZCBmaWxlIGRlc2NyaXB0b3JzLgorICovCisKK3ZvaWQKK2NsZWFycmVkaXIoaW50IGRyb3ApCit7CisJZm9yICg7OykgeworCQludWxscmVkaXJzID0gMDsKKwkJaWYgKCFyZWRpcmxpc3QpCisJCQlicmVhazsKKwkJcG9wcmVkaXIoZHJvcCk7CisJfQorfQorCisKKworLyoKKyAqIENvcHkgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgPj0gdG8uICBSZXR1cm5zIC0xCisgKiBpZiB0aGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQsIEVNUFRZIGlmIHRoZXJlIGFyZSBubyB1bnVzZWQKKyAqIGZpbGUgZGVzY3JpcHRvcnMgbGVmdC4KKyAqLworCitpbnQKK2NvcHlmZChpbnQgZnJvbSwgaW50IHRvKQoreworCWludCBuZXdmZDsKKworCW5ld2ZkID0gZmNudGwoZnJvbSwgRl9EVVBGRCwgdG8pOworCWlmIChuZXdmZCA8IDApIHsKKwkJaW50IGVycm5vMiA9IGVycm5vOworCQlpZiAoZXJybm8yID09IEVNRklMRSkKKwkJCXJldHVybiBFTVBUWTsKKwkJZWxzZQorCQkJc2hfZXJyb3IoIiVkOiAlcyIsIGZyb20sIHN0cmVycm9yKGVycm5vMikpOworCX0KKwlyZXR1cm4gbmV3ZmQ7Cit9CisKKworLyoKKyAqIE9wZW4gYSBmaWxlIGluIG5vY2xvYmJlciBtb2RlLgorICogVGhlIGNvZGUgd2FzIGNvcGllZCBmcm9tIGJhc2guCisgKi8KK2ludAorbm9jbG9iYmVyb3BlbihmbmFtZSkKKwljb25zdCBjaGFyICpmbmFtZTsKK3sKKwlpbnQgciwgZmQ7CisJc3RydWN0IHN0YXQ2NCBmaW5mbywgZmluZm8yOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlLCByZXR1cm4gYW4gZXJyb3IKKwkgKiBpbW1lZGlhdGVseS4KKwkgKi8KKwlyID0gc3RhdDY0KGZuYW1lLCAmZmluZm8pOworCWlmIChyID09IDAgJiYgU19JU1JFRyhmaW5mby5zdF9tb2RlKSkgeworCQllcnJubyA9IEVFWElTVDsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogSWYgdGhlIGZpbGUgd2FzIG5vdCBwcmVzZW50IChyICE9IDApLCBtYWtlIHN1cmUgd2Ugb3BlbiBpdAorCSAqIGV4Y2x1c2l2ZWx5IHNvIHRoYXQgaWYgaXQgaXMgY3JlYXRlZCBiZWZvcmUgd2Ugb3BlbiBpdCwgb3VyIG9wZW4KKwkgKiB3aWxsIGZhaWwuICBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgdHJ1bmNhdGUgYW4gZXhpc3RpbmcgZmlsZS4KKwkgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgdHVybiBvbiBPX0VYQ0wgdW5sZXNzIHRoZSBzdGF0IGZhaWxlZCAtLSBpZiB0aGUKKwkgKiBmaWxlIHdhcyBub3QgYSByZWd1bGFyIGZpbGUsIHdlIGxlYXZlIE9fRVhDTCBvZmYuCisJICovCisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIG9wZW42NChmbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX0VYQ0wsIDA2NjYpOworCWZkID0gb3BlbjY0KGZuYW1lLCBPX1dST05MWXxPX0NSRUFULCAwNjY2KTsKKworCS8qIElmIHRoZSBvcGVuIGZhaWxlZCwgcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmlnaHQgYXdheS4gKi8KKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwkvKgorCSAqIE9LLCB0aGUgb3BlbiBzdWNjZWVkZWQsIGJ1dCB0aGUgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBhCisJICogbm9uLXJlZ3VsYXIgZmlsZSB0byBhIHJlZ3VsYXIgZmlsZSBiZXR3ZWVuIHRoZSBzdGF0IGFuZCB0aGUgb3Blbi4KKwkgKiBXZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgT19FWENMIG9wZW4gaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBGSUxFTkFNRQorCSAqIGRpZCBub3QgZXhpc3QgYW5kIGlzIHN5bWxpbmtlZCB0byBhbiBleGlzdGluZyBmaWxlIGJldHdlZW4gdGhlIHN0YXQKKwkgKiBhbmQgb3Blbi4KKwkgKi8KKworCS8qCisJICogSWYgd2UgY2FuIG9wZW4gaXQgYW5kIGZzdGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IsIGFuZCBuZWl0aGVyIGNoZWNrCisJICogcmV2ZWFsZWQgdGhhdCBpdCB3YXMgYSByZWd1bGFyIGZpbGUsIGFuZCB0aGUgZmlsZSBoYXMgbm90IGJlZW4KKwkgKiByZXBsYWNlZCwgcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisJICovCisJIGlmIChmc3RhdDY0KGZkLCAmZmluZm8yKSA9PSAwICYmICFTX0lTUkVHKGZpbmZvMi5zdF9tb2RlKSAmJgorCSAgICAgZmluZm8uc3RfZGV2ID09IGZpbmZvMi5zdF9kZXYgJiYgZmluZm8uc3RfaW5vID09IGZpbmZvMi5zdF9pbm8pCisJIAlyZXR1cm4gZmQ7CisKKwkvKiBUaGUgZmlsZSBoYXMgYmVlbiByZXBsYWNlZC4gIGJhZG5lc3MuICovCisJY2xvc2UoZmQpOworCWVycm5vID0gRUVYSVNUOworCXJldHVybiAtMTsKK30KKworCitpbnQKK3JlZGlyZWN0c2FmZSh1bmlvbiBub2RlICpyZWRpciwgaW50IGZsYWdzKQoreworCWludCBlcnI7CisJdm9sYXRpbGUgaW50IHNhdmVpbnQ7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXIgPSBoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCisJU0FWRUlOVChzYXZlaW50KTsKKwlpZiAoIShlcnIgPSBzZXRqbXAoam1wbG9jLmxvYykgKiAyKSkgeworCQloYW5kbGVyID0gJmptcGxvYzsKKwkJcmVkaXJlY3QocmVkaXIsIGZsYWdzKTsKKwl9CisJaGFuZGxlciA9IHNhdmVoYW5kbGVyOworCWlmIChlcnIgJiYgZXhjZXB0aW9uICE9IEVYRVJST1IpCisJCWxvbmdqbXAoaGFuZGxlci0+bG9jLCAxKTsKKwlSRVNUT1JFSU5UKHNhdmVpbnQpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS91c3IvZGFzaC9yZWRpci5oIGIvdXNyL2Rhc2gvcmVkaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjk3ZjZhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvcmVkaXIuaApAQCAtMCwwICsxLDQ5IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXJlZGlyLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworLyogZmxhZ3MgcGFzc2VkIHRvIHJlZGlyZWN0ICovCisjZGVmaW5lIFJFRElSX1BVU0ggMDEJCS8qIHNhdmUgcHJldmlvdXMgdmFsdWVzIG9mIGZpbGUgZGVzY3JpcHRvcnMgKi8KKyNpZmRlZiBub3R5ZXQKKyNkZWZpbmUgUkVESVJfQkFDS1EgMDIJCS8qIHNhdmUgdGhlIGNvbW1hbmQgb3V0cHV0IGluIG1lbW9yeSAqLworI2VuZGlmCisjZGVmaW5lIFJFRElSX1NBVkVGRDIgMDMJLyogc2V0IHByZXZlcnJvdXQgKi8KKwordW5pb24gbm9kZTsKK3ZvaWQgcmVkaXJlY3QodW5pb24gbm9kZSAqLCBpbnQpOwordm9pZCBwb3ByZWRpcihpbnQpOwordm9pZCBjbGVhcnJlZGlyKGludCk7CitpbnQgY29weWZkKGludCwgaW50KTsKK2ludCByZWRpcmVjdHNhZmUodW5pb24gbm9kZSAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvc2guMSBiL3Vzci9kYXNoL3NoLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ODgxYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL3NoLjEKQEAgLTAsMCArMSwyMzMyIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKy5cIglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKy5cIiBLZW5uZXRoIEFsbXF1aXN0LgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisuXCIgYXJlIG1ldDoKKy5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy5cIiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLlwiIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisuXCIgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisuXCIgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIKKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorLlwiIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisuXCIgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiCUAoIylzaC4xCTguNiAoQmVya2VsZXkpIDUvNC85NQorLlwiCisuRGQgSmFudWFyeSAxOSwgMjAwMworLk9zCisuRHQgU0ggMQorLlNoIE5BTUUKKy5ObSBzaAorLk5kIGNvbW1hbmQgaW50ZXJwcmV0ZXIgKHNoZWxsKQorLlNoIFNZTk9QU0lTCisuTm0KKy5CayAtd29yZHMKKy5PcCBGbCBhQ2VmbnV2eElpbXFWRWIKKy5PcCBDbSArYUNlZm51dnhJaW1xVkViCisuRWsKKy5CayAtd29yZHMKKy5PcCBGbCBvIEFyIG9wdGlvbl9uYW1lCisuT3AgQ20gK28gQXIgb3B0aW9uX25hbWUKKy5FaworLkJrIC13b3JkcworLk9wIEFyIGNvbW1hbmRfZmlsZSBPbyBBciBhcmd1bWVudCAuLi4gT2MKKy5FaworLk5tCisuRmwgYworLkJrIC13b3JkcworLk9wIEZsIGFDZWZudXZ4SWltcVZFYgorLk9wIENtICthQ2VmbnV2eElpbXFWRWIKKy5FaworLkJrIC13b3JkcworLk9wIEZsIG8gQXIgb3B0aW9uX25hbWUKKy5PcCBDbSArbyBBciBvcHRpb25fbmFtZQorLkVrCisuQmsgLXdvcmRzCisuQXIgY29tbWFuZF9zdHJpbmcKKy5PcCBBciBjb21tYW5kX25hbWUgT28gQXIgYXJndW1lbnQgLi4uIE9jCisuRWsKKy5ObQorLkZsIHMKKy5CayAtd29yZHMKKy5PcCBGbCBhQ2VmbnV2eElpbXFWRWIKKy5PcCBDbSArYUNlZm51dnhJaW1xVkViCisuRWsKKy5CayAtd29yZHMKKy5PcCBGbCBvIEFyIG9wdGlvbl9uYW1lCisuT3AgQ20gK28gQXIgb3B0aW9uX25hbWUKKy5FaworLkJrIC13b3JkcworLk9wIEFyIGFyZ3VtZW50IC4uLgorLkVrCisuU2ggREVTQ1JJUFRJT04KKy5ObQoraXMgdGhlIHN0YW5kYXJkIGNvbW1hbmQgaW50ZXJwcmV0ZXIgZm9yIHRoZSBzeXN0ZW0uCitUaGUgY3VycmVudCB2ZXJzaW9uIG9mCisuTm0KK2lzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNoYW5nZWQgdG8gY29uZm9ybSB3aXRoIHRoZQorLlRuIFBPU0lYCisxMDAzLjIgYW5kIDEwMDMuMmEgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBzaGVsbC4KK1RoaXMgdmVyc2lvbiBoYXMgbWFueQorZmVhdHVyZXMgd2hpY2ggbWFrZSBpdCBhcHBlYXIgc2ltaWxhciBpbiBzb21lIHJlc3BlY3RzIHRvIHRoZSBLb3JuIHNoZWxsLAorYnV0IGl0IGlzIG5vdCBhIEtvcm4gc2hlbGwgY2xvbmUgKHNlZQorLlhyIGtzaCAxICkgLgorT25seSBmZWF0dXJlcyBkZXNpZ25hdGVkIGJ5CisuVG4gUE9TSVggLAorcGx1cyBhIGZldyBCZXJrZWxleSBleHRlbnNpb25zLCBhcmUgYmVpbmcgaW5jb3Jwb3JhdGVkIGludG8gdGhpcyBzaGVsbC4KK1dlIGV4cGVjdAorLlRuIFBPU0lYCitjb25mb3JtYW5jZSBieSB0aGUgdGltZSA0LjQgQlNEIGlzIHJlbGVhc2VkLgorVGhpcyBtYW4gcGFnZSBpcyBub3QgaW50ZW5kZWQKK3RvIGJlIGEgdHV0b3JpYWwgb3IgYSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzaGVsbC4KKy5TcyBPdmVydmlldworVGhlIHNoZWxsIGlzIGEgY29tbWFuZCB0aGF0IHJlYWRzIGxpbmVzIGZyb20gZWl0aGVyIGEgZmlsZSBvciB0aGUKK3Rlcm1pbmFsLCBpbnRlcnByZXRzIHRoZW0sIGFuZCBnZW5lcmFsbHkgZXhlY3V0ZXMgb3RoZXIgY29tbWFuZHMuCitJdCBpcyB0aGUgcHJvZ3JhbSB0aGF0IGlzIHJ1bm5pbmcgd2hlbiBhIHVzZXIgbG9ncyBpbnRvIHRoZSBzeXN0ZW0KKyhhbHRob3VnaCBhIHVzZXIgY2FuIHNlbGVjdCBhIGRpZmZlcmVudCBzaGVsbCB3aXRoIHRoZQorLlhyIGNoc2ggMQorY29tbWFuZCkuCitUaGUgc2hlbGwgaW1wbGVtZW50cyBhIGxhbmd1YWdlIHRoYXQgaGFzIGZsb3cgY29udHJvbAorY29uc3RydWN0cywgYSBtYWNybyBmYWNpbGl0eSB0aGF0IHByb3ZpZGVzIGEgdmFyaWV0eSBvZiBmZWF0dXJlcyBpbgorYWRkaXRpb24gdG8gZGF0YSBzdG9yYWdlLCBhbG9uZyB3aXRoIGJ1aWx0IGluIGhpc3RvcnkgYW5kIGxpbmUgZWRpdGluZworY2FwYWJpbGl0aWVzLgorSXQgaW5jb3Jwb3JhdGVzIG1hbnkgZmVhdHVyZXMgdG8gYWlkIGludGVyYWN0aXZlIHVzZSBhbmQKK2hhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIGludGVycHJldGF0aXZlIGxhbmd1YWdlIGlzIGNvbW1vbiB0byBib3RoCitpbnRlcmFjdGl2ZSBhbmQgbm9uLWludGVyYWN0aXZlIHVzZSAoc2hlbGwgc2NyaXB0cykuCitUaGF0IGlzLCBjb21tYW5kcworY2FuIGJlIHR5cGVkIGRpcmVjdGx5IHRvIHRoZSBydW5uaW5nIHNoZWxsIG9yIGNhbiBiZSBwdXQgaW50byBhIGZpbGUgYW5kCit0aGUgZmlsZSBjYW4gYmUgZXhlY3V0ZWQgZGlyZWN0bHkgYnkgdGhlIHNoZWxsLgorLlNzIEludm9jYXRpb24KK0lmIG5vIGFyZ3MgYXJlIHByZXNlbnQgYW5kIGlmIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiB0aGUgc2hlbGwKK2lzIGNvbm5lY3RlZCB0byBhIHRlcm1pbmFsIChvciBpZiB0aGUKKy5GbCBpCitmbGFnIGlzIHNldCksCithbmQgdGhlCisuRmwgYworb3B0aW9uIGlzIG5vdCBwcmVzZW50LCB0aGUgc2hlbGwgaXMgY29uc2lkZXJlZCBhbiBpbnRlcmFjdGl2ZSBzaGVsbC4KK0FuIGludGVyYWN0aXZlIHNoZWxsIGdlbmVyYWxseSBwcm9tcHRzIGJlZm9yZSBlYWNoIGNvbW1hbmQgYW5kIGhhbmRsZXMKK3Byb2dyYW1taW5nIGFuZCBjb21tYW5kIGVycm9ycyBkaWZmZXJlbnRseSAoYXMgZGVzY3JpYmVkIGJlbG93KS4KK1doZW4gZmlyc3Qgc3RhcnRpbmcsCit0aGUgc2hlbGwgaW5zcGVjdHMgYXJndW1lbnQgMCwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoIGEgZGFzaAorLlNxIC0gLAordGhlIHNoZWxsIGlzIGFsc28gY29uc2lkZXJlZAorYSBsb2dpbiBzaGVsbC4KK1RoaXMgaXMgbm9ybWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBzeXN0ZW0KK3doZW4gdGhlIHVzZXIgZmlyc3QgbG9ncyBpbi4KK0EgbG9naW4gc2hlbGwgZmlyc3QgcmVhZHMgY29tbWFuZHMKK2Zyb20gdGhlIGZpbGVzCisuUGEgL2V0Yy9wcm9maWxlCithbmQKKy5QYSAucHJvZmlsZQoraWYgdGhleSBleGlzdC4KK0lmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLkV2IEVOVgoraXMgc2V0IG9uIGVudHJ5IHRvIGFuIGludGVyYWN0aXZlIHNoZWxsLCBvciBpcyBzZXQgaW4gdGhlCisuUGEgLnByb2ZpbGUKK29mIGEgbG9naW4gc2hlbGwsIHRoZSBzaGVsbCBuZXh0IHJlYWRzCitjb21tYW5kcyBmcm9tIHRoZSBmaWxlIG5hbWVkIGluCisuRXYgRU5WIC4KK1RoZXJlZm9yZSwgYSB1c2VyIHNob3VsZCBwbGFjZSBjb21tYW5kcyB0aGF0IGFyZSB0byBiZSBleGVjdXRlZCBvbmx5IGF0Citsb2dpbiB0aW1lIGluIHRoZQorLlBhIC5wcm9maWxlCitmaWxlLCBhbmQgY29tbWFuZHMgdGhhdCBhcmUgZXhlY3V0ZWQgZm9yIGV2ZXJ5IGludGVyYWN0aXZlIHNoZWxsIGluc2lkZSB0aGUKKy5FdiBFTlYKK2ZpbGUuCitUbyBzZXQgdGhlCisuRXYgRU5WCit2YXJpYWJsZSB0byBzb21lIGZpbGUsIHBsYWNlIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyCisuUGEgLnByb2ZpbGUKK29mIHlvdXIgaG9tZSBkaXJlY3RvcnkKKy5QcAorLkRsIEVOVj0kSE9NRS8uc2hpbml0OyBleHBvcnQgRU5WCisuUHAKK3N1YnN0aXR1dGluZyBmb3IKKy5EcSAuc2hpbml0CithbnkgZmlsZW5hbWUgeW91IHdpc2guCisuUHAKK0lmIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYmVzaWRlcyB0aGUgb3B0aW9ucyBoYXZlIGJlZW4gc3BlY2lmaWVkLCB0aGVuCit0aGUgc2hlbGwgdHJlYXRzIHRoZSBmaXJzdCBhcmd1bWVudCBhcyB0aGUgbmFtZSBvZiBhIGZpbGUgZnJvbSB3aGljaCB0bworcmVhZCBjb21tYW5kcyAoYSBzaGVsbCBzY3JpcHQpLCBhbmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHNldCBhcyB0aGUKK3Bvc2l0aW9uYWwgcGFyYW1ldGVycyBvZiB0aGUgc2hlbGwgKCQxLCAkMiwgZXRjKS4KK090aGVyd2lzZSwgdGhlIHNoZWxsCityZWFkcyBjb21tYW5kcyBmcm9tIGl0cyBzdGFuZGFyZCBpbnB1dC4KKy5TcyBBcmd1bWVudCBMaXN0IFByb2Nlc3NpbmcKK0FsbCBvZiB0aGUgc2luZ2xlIGxldHRlciBvcHRpb25zIGhhdmUgYSBjb3JyZXNwb25kaW5nIG5hbWUgdGhhdCBjYW4gYmUKK3VzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlCisuRmwgbworb3B0aW9uLgorVGhlIHNldAorLkZsIG8KK25hbWUgaXMgcHJvdmlkZWQgbmV4dCB0byB0aGUgc2luZ2xlIGxldHRlciBvcHRpb24gaW4KK3RoZSBkZXNjcmlwdGlvbiBiZWxvdy4KK1NwZWNpZnlpbmcgYSBkYXNoCisuRHEgLQordHVybnMgdGhlIG9wdGlvbiBvbiwgd2hpbGUgdXNpbmcgYSBwbHVzCisuRHEgKworZGlzYWJsZXMgdGhlIG9wdGlvbi4KK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSBvcgord2l0aCB0aGUKKy5JYyBzZXQKK2J1aWx0aW4gKGRlc2NyaWJlZCBsYXRlcikuCisuQmwgLXRhZyAtd2lkdGggYWFhYWxsZXhwb3J0Zm9vIC1vZmZzZXQgaW5kZW50CisuSXQgRmwgYSBFbSBhbGxleHBvcnQKK0V4cG9ydCBhbGwgdmFyaWFibGVzIGFzc2lnbmVkIHRvLgorLkl0IEZsIGMKK1JlYWQgY29tbWFuZHMgZnJvbSB0aGUKKy5BciBjb21tYW5kX3N0cmluZworb3BlcmFuZCBpbnN0ZWFkIG9mIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorU3BlY2lhbCBwYXJhbWV0ZXIgMCB3aWxsIGJlIHNldCBmcm9tIHRoZQorLkFyIGNvbW1hbmRfbmFtZQorb3BlcmFuZCBhbmQgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyAoJDEsICQyLCBldGMuKQorc2V0IGZyb20gdGhlIHJlbWFpbmluZyBhcmd1bWVudCBvcGVyYW5kcy4KKy5JdCBGbCBDIEVtIG5vY2xvYmJlcgorRG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdpdGgKKy5EcSBcKltHdF0gLgorLkl0IEZsIGUgRW0gZXJyZXhpdAorSWYgbm90IGludGVyYWN0aXZlLCBleGl0IGltbWVkaWF0ZWx5IGlmIGFueSB1bnRlc3RlZCBjb21tYW5kIGZhaWxzLgorVGhlIGV4aXQgc3RhdHVzIG9mIGEgY29tbWFuZCBpcyBjb25zaWRlcmVkIHRvIGJlCitleHBsaWNpdGx5IHRlc3RlZCBpZiB0aGUgY29tbWFuZCBpcyB1c2VkIHRvIGNvbnRyb2wgYW4KKy5JYyBpZiAsCisuSWMgZWxpZiAsCisuSWMgd2hpbGUgLAorb3IKKy5JYyB1bnRpbCA7CitvciBpZiB0aGUgY29tbWFuZCBpcyB0aGUgbGVmdCBoYW5kIG9wZXJhbmQgb2YgYW4KKy5EcSAmJgorb3IKKy5EcSB8fAorb3BlcmF0b3IuCisuSXQgRmwgZiBFbSBub2dsb2IKK0Rpc2FibGUgcGF0aG5hbWUgZXhwYW5zaW9uLgorLkl0IEZsIG4gRW0gbm9leGVjCitJZiBub3QgaW50ZXJhY3RpdmUsIHJlYWQgY29tbWFuZHMgYnV0IGRvIG5vdCBleGVjdXRlIHRoZW0uCitUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhlIHN5bnRheCBvZiBzaGVsbCBzY3JpcHRzLgorLkl0IEZsIHUgRW0gbm91bnNldAorV3JpdGUgYSBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBleHBhbmQgYSB2YXJpYWJsZQordGhhdCBpcyBub3Qgc2V0LCBhbmQgaWYgdGhlIHNoZWxsIGlzIG5vdCBpbnRlcmFjdGl2ZSwgZXhpdCBpbW1lZGlhdGVseS4KKy5JdCBGbCB2IEVtIHZlcmJvc2UKK1RoZSBzaGVsbCB3cml0ZXMgaXRzIGlucHV0IHRvIHN0YW5kYXJkIGVycm9yIGFzIGl0IGlzIHJlYWQuCitVc2VmdWwgZm9yIGRlYnVnZ2luZy4KKy5JdCBGbCB4IEVtIHh0cmFjZQorV3JpdGUgZWFjaCBjb21tYW5kIHRvIHN0YW5kYXJkIGVycm9yIChwcmVjZWRlZCBieSBhCisuU3EgK1wgICkKK2JlZm9yZSBpdCBpcyBleGVjdXRlZC4KK1VzZWZ1bCBmb3IgZGVidWdnaW5nLgorLkl0IEZsIEkgRW0gaWdub3JlZW9mCitJZ25vcmUgRU9GJ3MgZnJvbSBpbnB1dCB3aGVuIGludGVyYWN0aXZlLgorLkl0IEZsIGkgRW0gaW50ZXJhY3RpdmUKK0ZvcmNlIHRoZSBzaGVsbCB0byBiZWhhdmUgaW50ZXJhY3RpdmVseS4KKy5JdCBGbCBtIEVtIG1vbml0b3IKK1R1cm4gb24gam9iIGNvbnRyb2wgKHNldCBhdXRvbWF0aWNhbGx5IHdoZW4gaW50ZXJhY3RpdmUpLgorLkl0IEZsIHMgRW0gc3RkaW4KK1JlYWQgY29tbWFuZHMgZnJvbSBzdGFuZGFyZCBpbnB1dCAoc2V0IGF1dG9tYXRpY2FsbHkgaWYgbm8gZmlsZSBhcmd1bWVudHMKK2FyZSBwcmVzZW50KS4KK1RoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgd2hlbiBzZXQgYWZ0ZXIgdGhlIHNoZWxsIGhhcworYWxyZWFkeSBzdGFydGVkIHJ1bm5pbmcgKGkuZS4gd2l0aAorLkljIHNldCApIC4KKy5JdCBGbCBWIEVtIHZpCitFbmFibGUgdGhlIGJ1aWx0LWluCisuWHIgdmkgMQorY29tbWFuZCBsaW5lIGVkaXRvciAoZGlzYWJsZXMKKy5GbCBFCitpZiBpdCBoYXMgYmVlbiBzZXQpLgorLkl0IEZsIEUgRW0gZW1hY3MKK0VuYWJsZSB0aGUgYnVpbHQtaW4KKy5YciBlbWFjcyAxCitjb21tYW5kIGxpbmUgZWRpdG9yIChkaXNhYmxlcworLkZsIFYKK2lmIGl0IGhhcyBiZWVuIHNldCkuCisuSXQgRmwgYiBFbSBub3RpZnkKK0VuYWJsZSBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIG9mIGJhY2tncm91bmQgam9iIGNvbXBsZXRpb24uCisoVU5JTVBMRU1FTlRFRCBmb3IgNC40YWxwaGEpCisuRWwKKy5TcyBMZXhpY2FsIFN0cnVjdHVyZQorVGhlIHNoZWxsIHJlYWRzIGlucHV0IGluIHRlcm1zIG9mIGxpbmVzIGZyb20gYSBmaWxlIGFuZCBicmVha3MgaXQgdXAgaW50bword29yZHMgYXQgd2hpdGVzcGFjZSAoYmxhbmtzIGFuZCB0YWJzKSwgYW5kIGF0IGNlcnRhaW4gc2VxdWVuY2VzIG9mCitjaGFyYWN0ZXJzIHRoYXQgYXJlIHNwZWNpYWwgdG8gdGhlIHNoZWxsIGNhbGxlZAorLkRxIG9wZXJhdG9ycyAuCitUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIG9wZXJhdG9yczogY29udHJvbCBvcGVyYXRvcnMgYW5kIHJlZGlyZWN0aW9uCitvcGVyYXRvcnMgKHRoZWlyIG1lYW5pbmcgaXMgZGlzY3Vzc2VkIGxhdGVyKS4KK0ZvbGxvd2luZyBpcyBhIGxpc3Qgb2Ygb3BlcmF0b3JzOgorLkJsIC1vaGFuZyAtb2Zmc2V0IGluZGVudAorLkl0ICJDb250cm9sIG9wZXJhdG9yczoiCisuRGwgJiAgJiYgIFwmKCAgXCYpICBcJjsgIDs7IHwgfHwgXCpbTHRdbmV3bGluZVwqW0d0XQorLkl0ICJSZWRpcmVjdGlvbiBvcGVyYXRvcnM6IgorLkRsIFwqW0x0XSAgXCpbR3RdICBcKltHdF18ICBcKltMdF1cKltMdF0gIFwqW0d0XVwqW0d0XSAgXCpbTHRdJiAgXCpbR3RdJiAgXCpbTHRdXCpbTHRdLSAgXCpbTHRdXCpbR3RdCisuRWwKKy5TcyBRdW90aW5nCitRdW90aW5nIGlzIHVzZWQgdG8gcmVtb3ZlIHRoZSBzcGVjaWFsIG1lYW5pbmcgb2YgY2VydGFpbiBjaGFyYWN0ZXJzIG9yCit3b3JkcyB0byB0aGUgc2hlbGwsIHN1Y2ggYXMgb3BlcmF0b3JzLCB3aGl0ZXNwYWNlLCBvciBrZXl3b3Jkcy4KK1RoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBxdW90aW5nOiBtYXRjaGVkIHNpbmdsZSBxdW90ZXMsCittYXRjaGVkIGRvdWJsZSBxdW90ZXMsIGFuZCBiYWNrc2xhc2guCisuU3MgQmFja3NsYXNoCitBIGJhY2tzbGFzaCBwcmVzZXJ2ZXMgdGhlIGxpdGVyYWwgbWVhbmluZyBvZiB0aGUgZm9sbG93aW5nCitjaGFyYWN0ZXIsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgorLkFxIG5ld2xpbmUgLgorQSBiYWNrc2xhc2ggcHJlY2VkaW5nIGEKKy5BcSBuZXdsaW5lCitpcyB0cmVhdGVkIGFzIGEgbGluZSBjb250aW51YXRpb24uCisuU3MgU2luZ2xlIFF1b3RlcworRW5jbG9zaW5nIGNoYXJhY3RlcnMgaW4gc2luZ2xlIHF1b3RlcyBwcmVzZXJ2ZXMgdGhlIGxpdGVyYWwgbWVhbmluZyBvZiBhbGwKK3RoZSBjaGFyYWN0ZXJzIChleGNlcHQgc2luZ2xlIHF1b3RlcywgbWFraW5nIGl0IGltcG9zc2libGUgdG8gcHV0CitzaW5nbGUtcXVvdGVzIGluIGEgc2luZ2xlLXF1b3RlZCBzdHJpbmcpLgorLlNzIERvdWJsZSBRdW90ZXMKK0VuY2xvc2luZyBjaGFyYWN0ZXJzIHdpdGhpbiBkb3VibGUgcXVvdGVzIHByZXNlcnZlcyB0aGUgbGl0ZXJhbAorbWVhbmluZyBvZiBhbGwgY2hhcmFjdGVycyBleGNlcHQgZG9sbGFyc2lnbgorLlBxICQgLAorYmFja3F1b3RlCisuUHEgYCAsCithbmQgYmFja3NsYXNoCisuUHEgXGUgLgorVGhlIGJhY2tzbGFzaCBpbnNpZGUgZG91YmxlIHF1b3RlcyBpcyBoaXN0b3JpY2FsbHkgd2VpcmQsIGFuZCBzZXJ2ZXMgdG8KK3F1b3RlIG9ubHkgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgorLkRsICQgIGAgIFwqcSAgXGUgIFwqW0x0XW5ld2xpbmVcKltHdF0gLgorT3RoZXJ3aXNlIGl0IHJlbWFpbnMgbGl0ZXJhbC4KKy5TcyBSZXNlcnZlZCBXb3JkcworUmVzZXJ2ZWQgd29yZHMgYXJlIHdvcmRzIHRoYXQgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlCitzaGVsbCBhbmQgYXJlIHJlY29nbml6ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgYW5kCithZnRlciBhIGNvbnRyb2wgb3BlcmF0b3IuCitUaGUgZm9sbG93aW5nIGFyZSByZXNlcnZlZCB3b3JkczoKKy5CbCAtY29sdW1uIHdoaWxlIHdoaWxlIHdoaWxlIHdoaWxlIHdoaWxlIC1vZmZzZXQgaW5kZW50CisuSXQgISBUYSBlbGlmIFRhIGZpIFRhIHdoaWxlIFRhIGNhc2UKKy5JdCBlbHNlIFRhIGZvciBUYSB0aGVuIFRhIHsgVGEgfQorLkl0IGRvIFRhIGRvbmUgVGEgdW50aWwgVGEgaWYgVGEgZXNhYworLkVsCisuUHAKK1RoZWlyIG1lYW5pbmcgaXMgZGlzY3Vzc2VkIGxhdGVyLgorLlNzIEFsaWFzZXMKK0FuIGFsaWFzIGlzIGEgbmFtZSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZSBzZXQgdXNpbmcgdGhlCisuWHIgYWxpYXMgMQorYnVpbHRpbiBjb21tYW5kLgorV2hlbmV2ZXIgYSByZXNlcnZlZCB3b3JkIG1heSBvY2N1ciAoc2VlIGFib3ZlKSwKK2FuZCBhZnRlciBjaGVja2luZyBmb3IgcmVzZXJ2ZWQgd29yZHMsIHRoZSBzaGVsbAorY2hlY2tzIHRoZSB3b3JkIHRvIHNlZSBpZiBpdCBtYXRjaGVzIGFuIGFsaWFzLgorSWYgaXQgZG9lcywgaXQgcmVwbGFjZXMgaXQgaW4gdGhlIGlucHV0IHN0cmVhbSB3aXRoIGl0cyB2YWx1ZS4KK0ZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhbiBhbGlhcyBjYWxsZWQKKy5EcSBsZgord2l0aCB0aGUgdmFsdWUKKy5EcSAibHMgLUYiICwKK3RoZW4gdGhlIGlucHV0OgorLlBwCisuRGwgbGYgZm9vYmFyIEFxIHJldHVybgorLlBwCit3b3VsZCBiZWNvbWUKKy5QcAorLkRsIGxzIC1GIGZvb2JhciBBcSByZXR1cm4KKy5QcAorQWxpYXNlcyBwcm92aWRlIGEgY29udmVuaWVudCB3YXkgZm9yIG5haXZlIHVzZXJzIHRvIGNyZWF0ZSBzaG9ydGhhbmRzIGZvcgorY29tbWFuZHMgd2l0aG91dCBoYXZpbmcgdG8gbGVhcm4gaG93IHRvIGNyZWF0ZSBmdW5jdGlvbnMgd2l0aCBhcmd1bWVudHMuCitUaGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIGxleGljYWxseSBvYnNjdXJlIGNvZGUuCitUaGlzIHVzZSBpcyBkaXNjb3VyYWdlZC4KKy5TcyBDb21tYW5kcworVGhlIHNoZWxsIGludGVycHJldHMgdGhlIHdvcmRzIGl0IHJlYWRzIGFjY29yZGluZyB0byBhIGxhbmd1YWdlLCB0aGUKK3NwZWNpZmljYXRpb24gb2Ygd2hpY2ggaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBtYW4gcGFnZSAocmVmZXIgdG8gdGhlCitCTkYgaW4gdGhlCisuVG4gUE9TSVgKKzEwMDMuMiBkb2N1bWVudCkuCitFc3NlbnRpYWxseSB0aG91Z2gsIGEgbGluZSBpcyByZWFkIGFuZCBpZiB0aGUgZmlyc3QKK3dvcmQgb2YgdGhlIGxpbmUgKG9yIGFmdGVyIGEgY29udHJvbCBvcGVyYXRvcikgaXMgbm90IGEgcmVzZXJ2ZWQgd29yZCwKK3RoZW4gdGhlIHNoZWxsIGhhcyByZWNvZ25pemVkIGEgc2ltcGxlIGNvbW1hbmQuCitPdGhlcndpc2UsIGEgY29tcGxleAorY29tbWFuZCBvciBzb21lIG90aGVyIHNwZWNpYWwgY29uc3RydWN0IG1heSBoYXZlIGJlZW4gcmVjb2duaXplZC4KKy5TcyBTaW1wbGUgQ29tbWFuZHMKK0lmIGEgc2ltcGxlIGNvbW1hbmQgaGFzIGJlZW4gcmVjb2duaXplZCwgdGhlIHNoZWxsIHBlcmZvcm1zCit0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisuQmwgLWVudW0gLW9mZnNldCBpbmRlbnQKKy5JdAorTGVhZGluZyB3b3JkcyBvZiB0aGUgZm9ybQorLkRxIG5hbWU9dmFsdWUKK2FyZSBzdHJpcHBlZCBvZmYgYW5kIGFzc2lnbmVkIHRvIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgc2ltcGxlIGNvbW1hbmQuCitSZWRpcmVjdGlvbiBvcGVyYXRvcnMgYW5kIHRoZWlyIGFyZ3VtZW50cyAoYXMgZGVzY3JpYmVkIGJlbG93KSBhcmUKK3N0cmlwcGVkIG9mZiBhbmQgc2F2ZWQgZm9yIHByb2Nlc3NpbmcuCisuSXQKK1RoZSByZW1haW5pbmcgd29yZHMgYXJlIGV4cGFuZGVkIGFzIGRlc2NyaWJlZCBpbgordGhlIHNlY3Rpb24gY2FsbGVkCisuRHEgRXhwYW5zaW9ucyAsCithbmQgdGhlIGZpcnN0IHJlbWFpbmluZyB3b3JkIGlzIGNvbnNpZGVyZWQgdGhlIGNvbW1hbmQgbmFtZSBhbmQgdGhlCitjb21tYW5kIGlzIGxvY2F0ZWQuCitUaGUgcmVtYWluaW5nIHdvcmRzIGFyZSBjb25zaWRlcmVkIHRoZSBhcmd1bWVudHMgb2YgdGhlIGNvbW1hbmQuCitJZiBubyBjb21tYW5kIG5hbWUgcmVzdWx0ZWQsIHRoZW4gdGhlCisuRHEgbmFtZT12YWx1ZQordmFyaWFibGUgYXNzaWdubWVudHMgcmVjb2duaXplZCBpbiBpdGVtIDEgYWZmZWN0IHRoZSBjdXJyZW50IHNoZWxsLgorLkl0CitSZWRpcmVjdGlvbnMgYXJlIHBlcmZvcm1lZCBhcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KKy5FbAorLlNzIFJlZGlyZWN0aW9ucworUmVkaXJlY3Rpb25zIGFyZSB1c2VkIHRvIGNoYW5nZSB3aGVyZSBhIGNvbW1hbmQgcmVhZHMgaXRzIGlucHV0IG9yIHNlbmRzCitpdHMgb3V0cHV0LgorSW4gZ2VuZXJhbCwgcmVkaXJlY3Rpb25zIG9wZW4sIGNsb3NlLCBvciBkdXBsaWNhdGUgYW4KK2V4aXN0aW5nIHJlZmVyZW5jZSB0byBhIGZpbGUuCitUaGUgb3ZlcmFsbCBmb3JtYXQgdXNlZCBmb3IgcmVkaXJlY3Rpb24gaXM6CisuUHAKKy5EbCBbbl0gVmEgcmVkaXItb3AgQXIgZmlsZQorLlBwCit3aGVyZQorLlZhIHJlZGlyLW9wCitpcyBvbmUgb2YgdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9ycyBtZW50aW9uZWQgcHJldmlvdXNseS4KK0ZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhlIHBvc3NpYmxlIHJlZGlyZWN0aW9ucy4KK1RoZQorLkJxIG4KK2lzIGFuIG9wdGlvbmFsIG51bWJlciwgYXMgaW4KKy5TcSAzCisobm90CisuU3EgQnEgMyAsCit0aGF0IHJlZmVycyB0byBhIGZpbGUgZGVzY3JpcHRvci4KKy5CbCAtdGFnIC13aWR0aCBhYWFic2ZpbGVzIC1vZmZzZXQgaW5kZW50CisuSXQgW25dIE5zIFwqW0d0XSBmaWxlCitSZWRpcmVjdCBzdGFuZGFyZCBvdXRwdXQgKG9yIG4pIHRvIGZpbGUuCisuSXQgW25dIE5zIFwqW0d0XXwgZmlsZQorU2FtZSwgYnV0IG92ZXJyaWRlIHRoZQorLkZsIEMKK29wdGlvbi4KKy5JdCBbbl0gTnMgXCpbR3RdXCpbR3RdIGZpbGUKK0FwcGVuZCBzdGFuZGFyZCBvdXRwdXQgKG9yIG4pIHRvIGZpbGUuCisuSXQgW25dIE5zIFwqW0x0XSBmaWxlCitSZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCAob3IgbikgZnJvbSBmaWxlLgorLkl0IFtuMV0gTnMgXCpbTHRdJiBOcyBuMgorRHVwbGljYXRlIHN0YW5kYXJkIGlucHV0IChvciBuMSkgZnJvbSBmaWxlIGRlc2NyaXB0b3IgbjIuCisuSXQgW25dIE5zIFwqW0x0XSYtCitDbG9zZSBzdGFuZGFyZCBpbnB1dCAob3IgbikuCisuSXQgW24xXSBOcyBcKltHdF0mIE5zIG4yCitEdXBsaWNhdGUgc3RhbmRhcmQgb3V0cHV0IChvciBuMSkgdG8gbjIuCisuSXQgW25dIE5zIFwqW0d0XSYtCitDbG9zZSBzdGFuZGFyZCBvdXRwdXQgKG9yIG4pLgorLkl0IFtuXSBOcyBcKltMdF1cKltHdF0gZmlsZQorT3BlbiBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIG9uIHN0YW5kYXJkIGlucHV0IChvciBuKS4KKy5FbAorLlBwCitUaGUgZm9sbG93aW5nIHJlZGlyZWN0aW9uIGlzIG9mdGVuIGNhbGxlZCBhCisuRHEgaGVyZS1kb2N1bWVudCAuCisuQmwgLWl0ZW0gLW9mZnNldCBpbmRlbnQKKy5JdAorLkxpIFtuXVwqW0x0XVwqW0x0XSBkZWxpbWl0ZXIKKy5EbCBoZXJlLWRvYy10ZXh0IC4uLgorLkxpIGRlbGltaXRlcgorLkVsCisuUHAKK0FsbCB0aGUgdGV4dCBvbiBzdWNjZXNzaXZlIGxpbmVzIHVwIHRvIHRoZSBkZWxpbWl0ZXIgaXMgc2F2ZWQgYXdheSBhbmQKK21hZGUgYXZhaWxhYmxlIHRvIHRoZSBjb21tYW5kIG9uIHN0YW5kYXJkIGlucHV0LCBvciBmaWxlIGRlc2NyaXB0b3IgbiBpZgoraXQgaXMgc3BlY2lmaWVkLgorSWYgdGhlIGRlbGltaXRlciBhcyBzcGVjaWZpZWQgb24gdGhlIGluaXRpYWwgbGluZSBpcworcXVvdGVkLCB0aGVuIHRoZSBoZXJlLWRvYy10ZXh0IGlzIHRyZWF0ZWQgbGl0ZXJhbGx5LCBvdGhlcndpc2UgdGhlIHRleHQgaXMKK3N1YmplY3RlZCB0byBwYXJhbWV0ZXIgZXhwYW5zaW9uLCBjb21tYW5kIHN1YnN0aXR1dGlvbiwgYW5kIGFyaXRobWV0aWMKK2V4cGFuc2lvbiAoYXMgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIG9uCisuRHEgRXhwYW5zaW9ucyApIC4KK0lmIHRoZSBvcGVyYXRvciBpcworLkRxIFwqW0x0XVwqW0x0XS0KK2luc3RlYWQgb2YKKy5EcSBcKltMdF1cKltMdF0gLAordGhlbiBsZWFkaW5nIHRhYnMgaW4gdGhlIGhlcmUtZG9jLXRleHQgYXJlIHN0cmlwcGVkLgorLlNzIFNlYXJjaCBhbmQgRXhlY3V0aW9uCitUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgY29tbWFuZHM6IHNoZWxsIGZ1bmN0aW9ucywgYnVpbHRpbiBjb21tYW5kcywgYW5kCitub3JtYWwgcHJvZ3JhbXMgLS0gYW5kIHRoZSBjb21tYW5kIGlzIHNlYXJjaGVkIGZvciAoYnkgbmFtZSkgaW4gdGhhdCBvcmRlci4KK1RoZXkgZWFjaCBhcmUgZXhlY3V0ZWQgaW4gYSBkaWZmZXJlbnQgd2F5LgorLlBwCitXaGVuIGEgc2hlbGwgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIGFsbCBvZiB0aGUgc2hlbGwgcG9zaXRpb25hbCBwYXJhbWV0ZXJzCisoZXhjZXB0ICQwLCB3aGljaCByZW1haW5zIHVuY2hhbmdlZCkgYXJlIHNldCB0byB0aGUgYXJndW1lbnRzIG9mIHRoZSBzaGVsbAorZnVuY3Rpb24uCitUaGUgdmFyaWFibGVzIHdoaWNoIGFyZSBleHBsaWNpdGx5IHBsYWNlZCBpbiB0aGUgZW52aXJvbm1lbnQgb2YKK3RoZSBjb21tYW5kIChieSBwbGFjaW5nIGFzc2lnbm1lbnRzIHRvIHRoZW0gYmVmb3JlIHRoZSBmdW5jdGlvbiBuYW1lKSBhcmUKK21hZGUgbG9jYWwgdG8gdGhlIGZ1bmN0aW9uIGFuZCBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgZ2l2ZW4uCitUaGVuIHRoZSBjb21tYW5kIGdpdmVuIGluIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLgorVGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBhcmUgcmVzdG9yZWQgdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzCit3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcy4KK1RoaXMgYWxsIG9jY3VycyB3aXRoaW4gdGhlIGN1cnJlbnQgc2hlbGwuCisuUHAKK1NoZWxsIGJ1aWx0aW5zIGFyZSBleGVjdXRlZCBpbnRlcm5hbGx5IHRvIHRoZSBzaGVsbCwgd2l0aG91dCBzcGF3bmluZyBhCituZXcgcHJvY2Vzcy4KKy5QcAorT3RoZXJ3aXNlLCBpZiB0aGUgY29tbWFuZCBuYW1lIGRvZXNuJ3QgbWF0Y2ggYSBmdW5jdGlvbiBvciBidWlsdGluLCB0aGUKK2NvbW1hbmQgaXMgc2VhcmNoZWQgZm9yIGFzIGEgbm9ybWFsIHByb2dyYW0gaW4gdGhlIGZpbGUgc3lzdGVtIChhcworZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24pLgorV2hlbiBhIG5vcm1hbCBwcm9ncmFtIGlzIGV4ZWN1dGVkLCB0aGUgc2hlbGwgcnVucyB0aGUgcHJvZ3JhbSwKK3Bhc3NpbmcgdGhlIGFyZ3VtZW50cyBhbmQgdGhlIGVudmlyb25tZW50IHRvIHRoZSBwcm9ncmFtLgorSWYgdGhlIHByb2dyYW0gaXMgbm90IGEgbm9ybWFsIGV4ZWN1dGFibGUgZmlsZSAoaS5lLiwgaWYgaXQgZG9lcworbm90IGJlZ2luIHdpdGggdGhlICJtYWdpYyBudW1iZXIiIHdob3NlCisuVG4gQVNDSUkKK3JlcHJlc2VudGF0aW9uIGlzICIjISIsIHNvCisuWHIgZXhlY3ZlIDIKK3JldHVybnMKKy5FciBFTk9FWEVDCit0aGVuKSB0aGUgc2hlbGwgd2lsbCBpbnRlcnByZXQgdGhlIHByb2dyYW0gaW4gYSBzdWJzaGVsbC4KK1RoZSBjaGlsZCBzaGVsbCB3aWxsIHJlaW5pdGlhbGl6ZSBpdHNlbGYgaW4gdGhpcyBjYXNlLAorc28gdGhhdCB0aGUgZWZmZWN0IHdpbGwgYmUgYXMgaWYgYQorbmV3IHNoZWxsIGhhZCBiZWVuIGludm9rZWQgdG8gaGFuZGxlIHRoZSBhZC1ob2Mgc2hlbGwgc2NyaXB0LCBleGNlcHQgdGhhdAordGhlIGxvY2F0aW9uIG9mIGhhc2hlZCBjb21tYW5kcyBsb2NhdGVkIGluIHRoZSBwYXJlbnQgc2hlbGwgd2lsbCBiZQorcmVtZW1iZXJlZCBieSB0aGUgY2hpbGQuCisuUHAKK05vdGUgdGhhdCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50IGFuZCB0aGUgc291cmNlIGNvZGUgaXRzZWxmCittaXNsZWFkaW5nbHkgYW5kIHNwb3JhZGljYWxseSByZWZlciB0byBhIHNoZWxsIHNjcmlwdCB3aXRob3V0IGEgbWFnaWMKK251bWJlciBhcyBhICJzaGVsbCBwcm9jZWR1cmUiLgorLlNzIFBhdGggU2VhcmNoCitXaGVuIGxvY2F0aW5nIGEgY29tbWFuZCwgdGhlIHNoZWxsIGZpcnN0IGxvb2tzIHRvIHNlZSBpZiBpdCBoYXMgYSBzaGVsbAorZnVuY3Rpb24gYnkgdGhhdCBuYW1lLgorVGhlbiBpdCBsb29rcyBmb3IgYSBidWlsdGluIGNvbW1hbmQgYnkgdGhhdCBuYW1lLgorSWYgYSBidWlsdGluIGNvbW1hbmQgaXMgbm90IGZvdW5kLCBvbmUgb2YgdHdvIHRoaW5ncyBoYXBwZW46CisuQmwgLWVudW0KKy5JdAorQ29tbWFuZCBuYW1lcyBjb250YWluaW5nIGEgc2xhc2ggYXJlIHNpbXBseSBleGVjdXRlZCB3aXRob3V0IHBlcmZvcm1pbmcKK2FueSBzZWFyY2hlcy4KKy5JdAorVGhlIHNoZWxsIHNlYXJjaGVzIGVhY2ggZW50cnkgaW4KKy5FdiBQQVRICitpbiB0dXJuIGZvciB0aGUgY29tbWFuZC4KK1RoZSB2YWx1ZSBvZiB0aGUKKy5FdiBQQVRICit2YXJpYWJsZSBzaG91bGQgYmUgYSBzZXJpZXMgb2YgZW50cmllcyBzZXBhcmF0ZWQgYnkgY29sb25zLgorRWFjaCBlbnRyeSBjb25zaXN0cyBvZiBhIGRpcmVjdG9yeSBuYW1lLgorVGhlIGN1cnJlbnQgZGlyZWN0b3J5IG1heSBiZSBpbmRpY2F0ZWQKK2ltcGxpY2l0bHkgYnkgYW4gZW1wdHkgZGlyZWN0b3J5IG5hbWUsIG9yIGV4cGxpY2l0bHkgYnkgYSBzaW5nbGUgcGVyaW9kLgorLkVsCisuU3MgQ29tbWFuZCBFeGl0IFN0YXR1cworRWFjaCBjb21tYW5kIGhhcyBhbiBleGl0IHN0YXR1cyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlIGJlaGF2aW91cgorb2Ygb3RoZXIgc2hlbGwgY29tbWFuZHMuCitUaGUgcGFyYWRpZ20gaXMgdGhhdCBhIGNvbW1hbmQgZXhpdHMKK3dpdGggemVybyBmb3Igbm9ybWFsIG9yIHN1Y2Nlc3MsIGFuZCBub24temVybyBmb3IgZmFpbHVyZSwKK2Vycm9yLCBvciBhIGZhbHNlIGluZGljYXRpb24uCitUaGUgbWFuIHBhZ2UgZm9yIGVhY2ggY29tbWFuZAorc2hvdWxkIGluZGljYXRlIHRoZSB2YXJpb3VzIGV4aXQgY29kZXMgYW5kIHdoYXQgdGhleSBtZWFuLgorQWRkaXRpb25hbGx5LCB0aGUgYnVpbHRpbiBjb21tYW5kcyByZXR1cm4gZXhpdCBjb2RlcywgYXMgZG9lcworYW4gZXhlY3V0ZWQgc2hlbGwgZnVuY3Rpb24uCisuUHAKK0lmIGEgY29tbWFuZCBjb25zaXN0cyBlbnRpcmVseSBvZiB2YXJpYWJsZSBhc3NpZ25tZW50cyB0aGVuIHRoZQorZXhpdCBzdGF0dXMgb2YgdGhlIGNvbW1hbmQgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kIHN1YnN0aXR1dGlvbgoraWYgYW55LCBvdGhlcndpc2UgMC4KKy5TcyBDb21wbGV4IENvbW1hbmRzCitDb21wbGV4IGNvbW1hbmRzIGFyZSBjb21iaW5hdGlvbnMgb2Ygc2ltcGxlIGNvbW1hbmRzIHdpdGggY29udHJvbAorb3BlcmF0b3JzIG9yIHJlc2VydmVkIHdvcmRzLCB0b2dldGhlciBjcmVhdGluZyBhIGxhcmdlciBjb21wbGV4IGNvbW1hbmQuCitNb3JlIGdlbmVyYWxseSwgYSBjb21tYW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorLkJsIC1idWxsZXQKKy5JdAorc2ltcGxlIGNvbW1hbmQKKy5JdAorcGlwZWxpbmUKKy5JdAorbGlzdCBvciBjb21wb3VuZC1saXN0CisuSXQKK2NvbXBvdW5kIGNvbW1hbmQKKy5JdAorZnVuY3Rpb24gZGVmaW5pdGlvbgorLkVsCisuUHAKK1VubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCB0aGUgZXhpdCBzdGF0dXMgb2YgYSBjb21tYW5kIGlzIHRoYXQgb2YgdGhlIGxhc3QKK3NpbXBsZSBjb21tYW5kIGV4ZWN1dGVkIGJ5IHRoZSBjb21tYW5kLgorLlNzIFBpcGVsaW5lcworQSBwaXBlbGluZSBpcyBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlIGNvbW1hbmRzIHNlcGFyYXRlZAorYnkgdGhlIGNvbnRyb2wgb3BlcmF0b3IgfC4KK1RoZSBzdGFuZGFyZCBvdXRwdXQgb2YgYWxsIGJ1dAordGhlIGxhc3QgY29tbWFuZCBpcyBjb25uZWN0ZWQgdG8gdGhlIHN0YW5kYXJkIGlucHV0CitvZiB0aGUgbmV4dCBjb21tYW5kLgorVGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgbGFzdAorY29tbWFuZCBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgc2hlbGwsIGFzIHVzdWFsLgorLlBwCitUaGUgZm9ybWF0IGZvciBhIHBpcGVsaW5lIGlzOgorLlBwCisuRGwgWyFdIGNvbW1hbmQxIFsgfCBjb21tYW5kMiAuLi5dCisuUHAKK1RoZSBzdGFuZGFyZCBvdXRwdXQgb2YgY29tbWFuZDEgaXMgY29ubmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZgorY29tbWFuZDIuCitUaGUgc3RhbmRhcmQgaW5wdXQsIHN0YW5kYXJkIG91dHB1dCwgb3IgYm90aCBvZiBhIGNvbW1hbmQgaXMKK2NvbnNpZGVyZWQgdG8gYmUgYXNzaWduZWQgYnkgdGhlIHBpcGVsaW5lIGJlZm9yZSBhbnkgcmVkaXJlY3Rpb24gc3BlY2lmaWVkCitieSByZWRpcmVjdGlvbiBvcGVyYXRvcnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY29tbWFuZC4KKy5QcAorSWYgdGhlIHBpcGVsaW5lIGlzIG5vdCBpbiB0aGUgYmFja2dyb3VuZCAoZGlzY3Vzc2VkIGxhdGVyKSwgdGhlIHNoZWxsCit3YWl0cyBmb3IgYWxsIGNvbW1hbmRzIHRvIGNvbXBsZXRlLgorLlBwCitJZiB0aGUgcmVzZXJ2ZWQgd29yZCAhIGRvZXMgbm90IHByZWNlZGUgdGhlIHBpcGVsaW5lLCB0aGUgZXhpdCBzdGF0dXMgaXMKK3RoZSBleGl0IHN0YXR1cyBvZiB0aGUgbGFzdCBjb21tYW5kIHNwZWNpZmllZCBpbiB0aGUgcGlwZWxpbmUuCitPdGhlcndpc2UsIHRoZSBleGl0IHN0YXR1cyBpcyB0aGUgbG9naWNhbCBOT1Qgb2YgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZQorbGFzdCBjb21tYW5kLgorVGhhdCBpcywgaWYgdGhlIGxhc3QgY29tbWFuZCByZXR1cm5zIHplcm8sIHRoZSBleGl0IHN0YXR1cworaXMgMTsgaWYgdGhlIGxhc3QgY29tbWFuZCByZXR1cm5zIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGUgZXhpdCBzdGF0dXMgaXMKK3plcm8uCisuUHAKK0JlY2F1c2UgcGlwZWxpbmUgYXNzaWdubWVudCBvZiBzdGFuZGFyZCBpbnB1dCBvciBzdGFuZGFyZCBvdXRwdXQgb3IgYm90aAordGFrZXMgcGxhY2UgYmVmb3JlIHJlZGlyZWN0aW9uLCBpdCBjYW4gYmUgbW9kaWZpZWQgYnkgcmVkaXJlY3Rpb24uCitGb3IgZXhhbXBsZToKKy5QcAorLkRsICQgY29tbWFuZDEgMlwqW0d0XSYxIHwgY29tbWFuZDIKKy5QcAorc2VuZHMgYm90aCB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBvZiBjb21tYW5kMQordG8gdGhlIHN0YW5kYXJkIGlucHV0IG9mIGNvbW1hbmQyLgorLlBwCitBIDsgb3IKKy5BcSBuZXdsaW5lCit0ZXJtaW5hdG9yIGNhdXNlcyB0aGUgcHJlY2VkaW5nIEFORC1PUi1saXN0IChkZXNjcmliZWQKK25leHQpIHRvIGJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseTsgYSAmIGNhdXNlcyBhc3luY2hyb25vdXMgZXhlY3V0aW9uIG9mCit0aGUgcHJlY2VkaW5nIEFORC1PUi1saXN0LgorLlBwCitOb3RlIHRoYXQgdW5saWtlIHNvbWUgb3RoZXIgc2hlbGxzLCBlYWNoIHByb2Nlc3MgaW4gdGhlIHBpcGVsaW5lIGlzIGEKK2NoaWxkIG9mIHRoZSBpbnZva2luZyBzaGVsbCAodW5sZXNzIGl0IGlzIGEgc2hlbGwgYnVpbHRpbiwgaW4gd2hpY2ggY2FzZQoraXQgZXhlY3V0ZXMgaW4gdGhlIGN1cnJlbnQgc2hlbGwgLS0gYnV0IGFueSBlZmZlY3QgaXQgaGFzIG9uIHRoZQorZW52aXJvbm1lbnQgaXMgd2lwZWQpLgorLlNzIEJhY2tncm91bmQgQ29tbWFuZHMgLS0gJgorSWYgYSBjb21tYW5kIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIGNvbnRyb2wgb3BlcmF0b3IgYW1wZXJzYW5kICgmKSwgdGhlCitzaGVsbCBleGVjdXRlcyB0aGUgY29tbWFuZCBhc3luY2hyb25vdXNseSAtLSB0aGF0IGlzLCB0aGUgc2hlbGwgZG9lcyBub3QKK3dhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGZpbmlzaCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBuZXh0IGNvbW1hbmQuCisuUHAKK1RoZSBmb3JtYXQgZm9yIHJ1bm5pbmcgYSBjb21tYW5kIGluIGJhY2tncm91bmQgaXM6CisuUHAKKy5EbCBjb21tYW5kMSAmIFtjb21tYW5kMiAmIC4uLl0KKy5QcAorSWYgdGhlIHNoZWxsIGlzIG5vdCBpbnRlcmFjdGl2ZSwgdGhlIHN0YW5kYXJkIGlucHV0IG9mIGFuIGFzeW5jaHJvbm91cworY29tbWFuZCBpcyBzZXQgdG8KKy5QYSAvZGV2L251bGwgLgorLlNzIExpc3RzIC0tIEdlbmVyYWxseSBTcGVha2luZworQSBsaXN0IGlzIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIGNvbW1hbmRzIHNlcGFyYXRlZCBieSBuZXdsaW5lcywKK3NlbWljb2xvbnMsIG9yIGFtcGVyc2FuZHMsIGFuZCBvcHRpb25hbGx5IHRlcm1pbmF0ZWQgYnkgb25lIG9mIHRoZXNlIHRocmVlCitjaGFyYWN0ZXJzLgorVGhlIGNvbW1hbmRzIGluIGEgbGlzdCBhcmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHdyaXR0ZW4uCitJZiBjb21tYW5kIGlzIGZvbGxvd2VkIGJ5IGFuIGFtcGVyc2FuZCwgdGhlIHNoZWxsIHN0YXJ0cyB0aGUKK2NvbW1hbmQgYW5kIGltbWVkaWF0ZWx5IHByb2NlZWQgb250byB0aGUgbmV4dCBjb21tYW5kOyBvdGhlcndpc2UgaXQgd2FpdHMKK2ZvciB0aGUgY29tbWFuZCB0byB0ZXJtaW5hdGUgYmVmb3JlIHByb2NlZWRpbmcgdG8gdGhlIG5leHQgb25lLgorLlNzIFNob3J0LUNpcmN1aXQgTGlzdCBPcGVyYXRvcnMKKy5EcSAmJgorYW5kCisuRHEgfHwKK2FyZSBBTkQtT1IgbGlzdCBvcGVyYXRvcnMuCisuRHEgJiYKK2V4ZWN1dGVzIHRoZSBmaXJzdCBjb21tYW5kLCBhbmQgdGhlbiBleGVjdXRlcyB0aGUgc2Vjb25kIGNvbW1hbmQgaWZmIHRoZQorZXhpdCBzdGF0dXMgb2YgdGhlIGZpcnN0IGNvbW1hbmQgaXMgemVyby4KKy5EcSB8fAoraXMgc2ltaWxhciwgYnV0IGV4ZWN1dGVzIHRoZSBzZWNvbmQgY29tbWFuZCBpZmYgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBmaXJzdAorY29tbWFuZCBpcyBub256ZXJvLgorLkRxICYmCithbmQKKy5EcSB8fAorYm90aCBoYXZlIHRoZSBzYW1lIHByaW9yaXR5LgorLlNzIEZsb3ctQ29udHJvbCBDb25zdHJ1Y3RzIC0tIGlmLCB3aGlsZSwgZm9yLCBjYXNlCitUaGUgc3ludGF4IG9mIHRoZSBpZiBjb21tYW5kIGlzCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK2lmIGxpc3QKK3RoZW4gbGlzdAorWyBlbGlmIGxpc3QKK3RoZW4gICAgbGlzdCBdIC4uLgorWyBlbHNlIGxpc3QgXQorZmkKKy5FZAorLlBwCitUaGUgc3ludGF4IG9mIHRoZSB3aGlsZSBjb21tYW5kIGlzCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK3doaWxlIGxpc3QKK2RvICAgbGlzdAorZG9uZQorLkVkCisuUHAKK1RoZSB0d28gbGlzdHMgYXJlIGV4ZWN1dGVkIHJlcGVhdGVkbHkgd2hpbGUgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZQorZmlyc3QgbGlzdCBpcyB6ZXJvLgorVGhlIHVudGlsIGNvbW1hbmQgaXMgc2ltaWxhciwgYnV0IGhhcyB0aGUgd29yZAordW50aWwgaW4gcGxhY2Ugb2Ygd2hpbGUsIHdoaWNoIGNhdXNlcyBpdCB0bworcmVwZWF0IHVudGlsIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgZmlyc3QgbGlzdCBpcyB6ZXJvLgorLlBwCitUaGUgc3ludGF4IG9mIHRoZSBmb3IgY29tbWFuZCBpcworLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50Citmb3IgdmFyaWFibGUgaW4gd29yZCAuLi4KK2RvICAgbGlzdAorZG9uZQorLkVkCisuUHAKK1RoZSB3b3JkcyBhcmUgZXhwYW5kZWQsIGFuZCB0aGVuIHRoZSBsaXN0IGlzIGV4ZWN1dGVkIHJlcGVhdGVkbHkgd2l0aCB0aGUKK3ZhcmlhYmxlIHNldCB0byBlYWNoIHdvcmQgaW4gdHVybi4KK2RvIGFuZCBkb25lIG1heSBiZSByZXBsYWNlZCB3aXRoCisuRHEgeworYW5kCisuRHEgfSAuCisuUHAKK1RoZSBzeW50YXggb2YgdGhlIGJyZWFrIGFuZCBjb250aW51ZSBjb21tYW5kIGlzCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK2JyZWFrIFsgbnVtIF0KK2NvbnRpbnVlIFsgbnVtIF0KKy5FZAorLlBwCitCcmVhayB0ZXJtaW5hdGVzIHRoZSBudW0gaW5uZXJtb3N0IGZvciBvciB3aGlsZSBsb29wcy4KK0NvbnRpbnVlIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgaW5uZXJtb3N0IGxvb3AuCitUaGVzZSBhcmUgaW1wbGVtZW50ZWQgYXMgYnVpbHRpbiBjb21tYW5kcy4KKy5QcAorVGhlIHN5bnRheCBvZiB0aGUgY2FzZSBjb21tYW5kIGlzCisuQmQgLWxpdGVyYWwgLW9mZnNldCBpbmRlbnQKK2Nhc2Ugd29yZCBpbgorcGF0dGVybikgbGlzdCA7OworXCYuLi4KK2VzYWMKKy5FZAorLlBwCitUaGUgcGF0dGVybiBjYW4gYWN0dWFsbHkgYmUgb25lIG9yIG1vcmUgcGF0dGVybnMgKHNlZQorLlN4IFNoZWxsIFBhdHRlcm5zCitkZXNjcmliZWQgbGF0ZXIpLCBzZXBhcmF0ZWQgYnkKKy5EcSBcKihCYQorY2hhcmFjdGVycy4KKy5TcyBHcm91cGluZyBDb21tYW5kcyBUb2dldGhlcgorQ29tbWFuZHMgbWF5IGJlIGdyb3VwZWQgYnkgd3JpdGluZyBlaXRoZXIKKy5QcAorLkRsIChsaXN0KQorLlBwCitvcgorLlBwCisuRGwgeyBsaXN0OyB9CisuUHAKK1RoZSBmaXJzdCBvZiB0aGVzZSBleGVjdXRlcyB0aGUgY29tbWFuZHMgaW4gYSBzdWJzaGVsbC4KK0J1aWx0aW4gY29tbWFuZHMgZ3JvdXBlZCBpbnRvIGEgKGxpc3QpIHdpbGwgbm90IGFmZmVjdCB0aGUgY3VycmVudCBzaGVsbC4KK1RoZSBzZWNvbmQgZm9ybSBkb2VzIG5vdCBmb3JrIGFub3RoZXIgc2hlbGwgc28gaXMgc2xpZ2h0bHkgbW9yZSBlZmZpY2llbnQuCitHcm91cGluZyBjb21tYW5kcyB0b2dldGhlciB0aGlzIHdheSBhbGxvd3MgeW91IHRvIHJlZGlyZWN0Cit0aGVpciBvdXRwdXQgYXMgdGhvdWdoIHRoZXkgd2VyZSBvbmUgcHJvZ3JhbToKKy5QcAorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50Cit7IHByaW50ZiBcKnEgaGVsbG8gXCpxIDsgcHJpbnRmIFwqcSB3b3JsZFxcbiIgOyB9IFwqW0d0XSBncmVldGluZworLkVkCisuUHAKK05vdGUgdGhhdAorLkRxIH0KK211c3QgZm9sbG93IGEgY29udHJvbCBvcGVyYXRvciAoaGVyZSwKKy5EcSBcJjsgKQorc28gdGhhdCBpdCBpcyByZWNvZ25pemVkIGFzIGEgcmVzZXJ2ZWQgd29yZCBhbmQgbm90IGFzIGFub3RoZXIgY29tbWFuZCBhcmd1bWVudC4KKy5TcyBGdW5jdGlvbnMKK1RoZSBzeW50YXggb2YgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzCisuUHAKKy5EbCBuYW1lICggKSBjb21tYW5kCisuUHAKK0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudDsgd2hlbiBleGVjdXRlZCBpdAoraW5zdGFsbHMgYSBmdW5jdGlvbiBuYW1lZCBuYW1lIGFuZCByZXR1cm5zIGFuIGV4aXQgc3RhdHVzIG9mIHplcm8uCitUaGUgY29tbWFuZCBpcyBub3JtYWxseSBhIGxpc3QgZW5jbG9zZWQgYmV0d2VlbgorLkRxIHsKK2FuZAorLkRxIH0gLgorLlBwCitWYXJpYWJsZXMgbWF5IGJlIGRlY2xhcmVkIHRvIGJlIGxvY2FsIHRvIGEgZnVuY3Rpb24gYnkgdXNpbmcgYSBsb2NhbAorY29tbWFuZC4KK1RoaXMgc2hvdWxkIGFwcGVhciBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mIGEgZnVuY3Rpb24sIGFuZCB0aGUgc3ludGF4IGlzCisuUHAKKy5EbCBsb2NhbCBbIHZhcmlhYmxlIHwgLSBdIC4uLgorLlBwCitMb2NhbCBpcyBpbXBsZW1lbnRlZCBhcyBhIGJ1aWx0aW4gY29tbWFuZC4KKy5QcAorV2hlbiBhIHZhcmlhYmxlIGlzIG1hZGUgbG9jYWwsIGl0IGluaGVyaXRzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBleHBvcnRlZAorYW5kIHJlYWRvbmx5IGZsYWdzIGZyb20gdGhlIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGUgc3Vycm91bmRpbmcKK3Njb3BlLCBpZiB0aGVyZSBpcyBvbmUuCitPdGhlcndpc2UsIHRoZSB2YXJpYWJsZSBpcyBpbml0aWFsbHkgdW5zZXQuCitUaGUgc2hlbGwgdXNlcyBkeW5hbWljIHNjb3BpbmcsIHNvIHRoYXQgaWYgeW91IG1ha2UgdGhlIHZhcmlhYmxlIHggbG9jYWwgdG8KK2Z1bmN0aW9uIGYsIHdoaWNoIHRoZW4gY2FsbHMgZnVuY3Rpb24gZywgcmVmZXJlbmNlcyB0byB0aGUgdmFyaWFibGUgeCBtYWRlCitpbnNpZGUgZyB3aWxsIHJlZmVyIHRvIHRoZSB2YXJpYWJsZSB4IGRlY2xhcmVkIGluc2lkZSBmLCBub3QgdG8gdGhlIGdsb2JhbAordmFyaWFibGUgbmFtZWQgeC4KKy5QcAorVGhlIG9ubHkgc3BlY2lhbCBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgbWFkZSBsb2NhbCBpcworLkRxIC0gLgorTWFraW5nCisuRHEgLQorbG9jYWwgYW55IHNoZWxsIG9wdGlvbnMgdGhhdCBhcmUgY2hhbmdlZCB2aWEgdGhlIHNldCBjb21tYW5kIGluc2lkZSB0aGUKK2Z1bmN0aW9uIHRvIGJlIHJlc3RvcmVkIHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcyB3aGVuIHRoZSBmdW5jdGlvbgorcmV0dXJucy4KKy5QcAorVGhlIHN5bnRheCBvZiB0aGUgcmV0dXJuIGNvbW1hbmQgaXMKKy5QcAorLkRsIHJldHVybiBbIGV4aXRzdGF0dXMgXQorLlBwCitJdCB0ZXJtaW5hdGVzIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGZ1bmN0aW9uLgorUmV0dXJuIGlzIGltcGxlbWVudGVkIGFzIGEgYnVpbHRpbiBjb21tYW5kLgorLlNzIFZhcmlhYmxlcyBhbmQgUGFyYW1ldGVycworVGhlIHNoZWxsIG1haW50YWlucyBhIHNldCBvZiBwYXJhbWV0ZXJzLgorQSBwYXJhbWV0ZXIgZGVub3RlZCBieSBhIG5hbWUgaXMgY2FsbGVkIGEgdmFyaWFibGUuCitXaGVuIHN0YXJ0aW5nIHVwLCB0aGUgc2hlbGwgdHVybnMgYWxsIHRoZSBlbnZpcm9ubWVudAordmFyaWFibGVzIGludG8gc2hlbGwgdmFyaWFibGVzLgorTmV3IHZhcmlhYmxlcyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBmb3JtCisuUHAKKy5EbCBuYW1lPXZhbHVlCisuUHAKK1ZhcmlhYmxlcyBzZXQgYnkgdGhlIHVzZXIgbXVzdCBoYXZlIGEgbmFtZSBjb25zaXN0aW5nIHNvbGVseSBvZgorYWxwaGFiZXRpY3MsIG51bWVyaWNzLCBhbmQgdW5kZXJzY29yZXMgLSB0aGUgZmlyc3Qgb2Ygd2hpY2ggbXVzdCBub3QgYmUKK251bWVyaWMuCitBIHBhcmFtZXRlciBjYW4gYWxzbyBiZSBkZW5vdGVkIGJ5IGEgbnVtYmVyIG9yIGEgc3BlY2lhbAorY2hhcmFjdGVyIGFzIGV4cGxhaW5lZCBiZWxvdy4KKy5TcyBQb3NpdGlvbmFsIFBhcmFtZXRlcnMKK0EgcG9zaXRpb25hbCBwYXJhbWV0ZXIgaXMgYSBwYXJhbWV0ZXIgZGVub3RlZCBieSBhIG51bWJlciAobiBcKltHdF0gMCkuCitUaGUgc2hlbGwgc2V0cyB0aGVzZSBpbml0aWFsbHkgdG8gdGhlIHZhbHVlcyBvZiBpdHMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwordGhhdCBmb2xsb3cgdGhlIG5hbWUgb2YgdGhlIHNoZWxsIHNjcmlwdC4KK1RoZQorLkljIHNldAorYnVpbHRpbiBjYW4gYWxzbyBiZSB1c2VkIHRvIHNldCBvciByZXNldCB0aGVtLgorLlNzIFNwZWNpYWwgUGFyYW1ldGVycworQSBzcGVjaWFsIHBhcmFtZXRlciBpcyBhIHBhcmFtZXRlciBkZW5vdGVkIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHNwZWNpYWwKK2NoYXJhY3RlcnMuCitUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBpcyBsaXN0ZWQgbmV4dCB0byBpdHMgY2hhcmFjdGVyLgorLkJsIC10YWcgLXdpZHRoIHRoaW5oeXBoZW5hCisuSXQgKgorRXhwYW5kcyB0byB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzdGFydGluZyBmcm9tIG9uZS4KK1doZW4gdGhlCitleHBhbnNpb24gb2NjdXJzIHdpdGhpbiBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nIGl0IGV4cGFuZHMgdG8gYSBzaW5nbGUKK2ZpZWxkIHdpdGggdGhlIHZhbHVlIG9mIGVhY2ggcGFyYW1ldGVyIHNlcGFyYXRlZCBieSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCit0aGUKKy5FdiBJRlMKK3ZhcmlhYmxlLCBvciBieSBhCisuQXEgc3BhY2UKK2lmCisuRXYgSUZTCitpcyB1bnNldC4KKy5JdCBACitFeHBhbmRzIHRvIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIHN0YXJ0aW5nIGZyb20gb25lLgorV2hlbiB0aGUgZXhwYW5zaW9uIG9jY3VycyB3aXRoaW4gZG91YmxlLXF1b3RlcywgZWFjaCBwb3NpdGlvbmFsCitwYXJhbWV0ZXIgZXhwYW5kcyBhcyBhIHNlcGFyYXRlIGFyZ3VtZW50LgorSWYgdGhlcmUgYXJlIG5vIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgdGhlCitleHBhbnNpb24gb2YgQCBnZW5lcmF0ZXMgemVybyBhcmd1bWVudHMsIGV2ZW4gd2hlbiBAIGlzCitkb3VibGUtcXVvdGVkLgorV2hhdCB0aGlzIGJhc2ljYWxseSBtZWFucywgZm9yIGV4YW1wbGUsIGlzCitpZiAkMSBpcworLkRxIGFiYworYW5kICQyIGlzCisuRHEgZGVmIGdoaSAsCit0aGVuCisuUXEgJEAKK2V4cGFuZHMgdG8KK3RoZSB0d28gYXJndW1lbnRzOgorLlBwCisuU20gb2ZmCisuRGwgXCpxIGFiYyBcKnEgXCAgXCpxIGRlZlwgZ2hpIFwqcQorLlNtIG9uCisuSXQgIworRXhwYW5kcyB0byB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KKy5JdCA/CitFeHBhbmRzIHRvIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgbW9zdCByZWNlbnQgcGlwZWxpbmUuCisuSXQgLSAoSHlwaGVuLikKK0V4cGFuZHMgdG8gdGhlIGN1cnJlbnQgb3B0aW9uIGZsYWdzICh0aGUgc2luZ2xlLWxldHRlcgorb3B0aW9uIG5hbWVzIGNvbmNhdGVuYXRlZCBpbnRvIGEgc3RyaW5nKSBhcyBzcGVjaWZpZWQgb24KK2ludm9jYXRpb24sIGJ5IHRoZSBzZXQgYnVpbHRpbiBjb21tYW5kLCBvciBpbXBsaWNpdGx5CitieSB0aGUgc2hlbGwuCisuSXQgJAorRXhwYW5kcyB0byB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgaW52b2tlZCBzaGVsbC4KK0Egc3Vic2hlbGwgcmV0YWlucyB0aGUgc2FtZSB2YWx1ZSBvZiAkIGFzIGl0cyBwYXJlbnQuCisuSXQgIQorRXhwYW5kcyB0byB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgbW9zdCByZWNlbnQgYmFja2dyb3VuZAorY29tbWFuZCBleGVjdXRlZCBmcm9tIHRoZSBjdXJyZW50IHNoZWxsLgorRm9yIGEgcGlwZWxpbmUsIHRoZSBwcm9jZXNzIElEIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgcGlwZWxpbmUuCisuSXQgMCAoWmVyby4pCitFeHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZSBzaGVsbCBvciBzaGVsbCBzY3JpcHQuCisuRWwKKy5TcyBXb3JkIEV4cGFuc2lvbnMKK1RoaXMgY2xhdXNlIGRlc2NyaWJlcyB0aGUgdmFyaW91cyBleHBhbnNpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCBvbiB3b3Jkcy4KK05vdCBhbGwgZXhwYW5zaW9ucyBhcmUgcGVyZm9ybWVkIG9uIGV2ZXJ5IHdvcmQsIGFzIGV4cGxhaW5lZCBsYXRlci4KKy5QcAorVGlsZGUgZXhwYW5zaW9ucywgcGFyYW1ldGVyIGV4cGFuc2lvbnMsIGNvbW1hbmQgc3Vic3RpdHV0aW9ucywgYXJpdGhtZXRpYworZXhwYW5zaW9ucywgYW5kIHF1b3RlIHJlbW92YWxzIHRoYXQgb2NjdXIgd2l0aGluIGEgc2luZ2xlIHdvcmQgZXhwYW5kIHRvIGEKK3NpbmdsZSBmaWVsZC4KK0l0IGlzIG9ubHkgZmllbGQgc3BsaXR0aW5nIG9yIHBhdGhuYW1lIGV4cGFuc2lvbiB0aGF0IGNhbgorY3JlYXRlIG11bHRpcGxlIGZpZWxkcyBmcm9tIGEgc2luZ2xlIHdvcmQuCitUaGUgc2luZ2xlIGV4Y2VwdGlvbiB0byB0aGlzCitydWxlIGlzIHRoZSBleHBhbnNpb24gb2YgdGhlIHNwZWNpYWwgcGFyYW1ldGVyIEAgd2l0aGluIGRvdWJsZS1xdW90ZXMsIGFzCit3YXMgZGVzY3JpYmVkIGFib3ZlLgorLlBwCitUaGUgb3JkZXIgb2Ygd29yZCBleHBhbnNpb24gaXM6CisuQmwgLWVudW0KKy5JdAorVGlsZGUgRXhwYW5zaW9uLCBQYXJhbWV0ZXIgRXhwYW5zaW9uLCBDb21tYW5kIFN1YnN0aXR1dGlvbiwKK0FyaXRobWV0aWMgRXhwYW5zaW9uICh0aGVzZSBhbGwgb2NjdXIgYXQgdGhlIHNhbWUgdGltZSkuCisuSXQKK0ZpZWxkIFNwbGl0dGluZyBpcyBwZXJmb3JtZWQgb24gZmllbGRzCitnZW5lcmF0ZWQgYnkgc3RlcCAoMSkgdW5sZXNzIHRoZQorLkV2IElGUwordmFyaWFibGUgaXMgbnVsbC4KKy5JdAorUGF0aG5hbWUgRXhwYW5zaW9uICh1bmxlc3Mgc2V0CisuRmwgZgoraXMgaW4gZWZmZWN0KS4KKy5JdAorUXVvdGUgUmVtb3ZhbC4KKy5FbAorLlBwCitUaGUgJCBjaGFyYWN0ZXIgaXMgdXNlZCB0byBpbnRyb2R1Y2UgcGFyYW1ldGVyIGV4cGFuc2lvbiwgY29tbWFuZAorc3Vic3RpdHV0aW9uLCBvciBhcml0aG1ldGljIGV2YWx1YXRpb24uCisuU3MgVGlsZGUgRXhwYW5zaW9uIChzdWJzdGl0dXRpbmcgYSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkpCitBIHdvcmQgYmVnaW5uaW5nIHdpdGggYW4gdW5xdW90ZWQgdGlsZGUgY2hhcmFjdGVyICh+KSBpcworc3ViamVjdGVkIHRvIHRpbGRlIGV4cGFuc2lvbi4KK0FsbCB0aGUgY2hhcmFjdGVycyB1cCB0bworYSBzbGFzaCAoLykgb3IgdGhlIGVuZCBvZiB0aGUgd29yZCBhcmUgdHJlYXRlZCBhcyBhIHVzZXJuYW1lCithbmQgYXJlIHJlcGxhY2VkIHdpdGggdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KK0lmIHRoZSB1c2VybmFtZSBpcyBtaXNzaW5nIChhcyBpbgorLlBhIH4vZm9vYmFyICkgLAordGhlIHRpbGRlIGlzIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIG9mIHRoZQorLlZhIEhPTUUKK3ZhcmlhYmxlICh0aGUgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkpLgorLlNzIFBhcmFtZXRlciBFeHBhbnNpb24KK1RoZSBmb3JtYXQgZm9yIHBhcmFtZXRlciBleHBhbnNpb24gaXMgYXMgZm9sbG93czoKKy5QcAorLkRsICR7ZXhwcmVzc2lvbn0KKy5QcAord2hlcmUgZXhwcmVzc2lvbiBjb25zaXN0cyBvZiBhbGwgY2hhcmFjdGVycyB1bnRpbCB0aGUgbWF0Y2hpbmcKKy5EcSB9IC4KK0FueQorLkRxIH0KK2VzY2FwZWQgYnkgYSBiYWNrc2xhc2ggb3Igd2l0aGluIGEgcXVvdGVkIHN0cmluZywgYW5kIGNoYXJhY3RlcnMgaW4KK2VtYmVkZGVkIGFyaXRobWV0aWMgZXhwYW5zaW9ucywgY29tbWFuZCBzdWJzdGl0dXRpb25zLCBhbmQgdmFyaWFibGUKK2V4cGFuc2lvbnMsIGFyZSBub3QgZXhhbWluZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG1hdGNoaW5nCisuRHEgfSAuCisuUHAKK1RoZSBzaW1wbGVzdCBmb3JtIGZvciBwYXJhbWV0ZXIgZXhwYW5zaW9uIGlzOgorLlBwCisuRGwgJHtwYXJhbWV0ZXJ9CisuUHAKK1RoZSB2YWx1ZSwgaWYgYW55LCBvZiBwYXJhbWV0ZXIgaXMgc3Vic3RpdHV0ZWQuCisuUHAKK1RoZSBwYXJhbWV0ZXIgbmFtZSBvciBzeW1ib2wgY2FuIGJlIGVuY2xvc2VkIGluIGJyYWNlcywgd2hpY2ggYXJlCitvcHRpb25hbCBleGNlcHQgZm9yIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3aXRoIG1vcmUgdGhhbiBvbmUgZGlnaXQgb3IKK3doZW4gcGFyYW1ldGVyIGlzIGZvbGxvd2VkIGJ5IGEgY2hhcmFjdGVyIHRoYXQgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMKK3BhcnQgb2YgdGhlIG5hbWUuCitJZiBhIHBhcmFtZXRlciBleHBhbnNpb24gb2NjdXJzIGluc2lkZSBkb3VibGUtcXVvdGVzOgorLkJsIC1lbnVtCisuSXQKK1BhdGhuYW1lIGV4cGFuc2lvbiBpcyBub3QgcGVyZm9ybWVkIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBleHBhbnNpb24uCisuSXQKK0ZpZWxkIHNwbGl0dGluZyBpcyBub3QgcGVyZm9ybWVkIG9uIHRoZSByZXN1bHRzIG9mIHRoZQorZXhwYW5zaW9uLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgQC4KKy5FbAorLlBwCitJbiBhZGRpdGlvbiwgYSBwYXJhbWV0ZXIgZXhwYW5zaW9uIGNhbiBiZSBtb2RpZmllZCBieSB1c2luZyBvbmUgb2YgdGhlCitmb2xsb3dpbmcgZm9ybWF0cy4KKy5CbCAtdGFnIC13aWR0aCBhYXBhcmFtZXRlcndvcmRhYWFhYQorLkl0ICR7cGFyYW1ldGVyOi13b3JkfQorVXNlIERlZmF1bHQgVmFsdWVzLgorSWYgcGFyYW1ldGVyIGlzIHVuc2V0IG9yIG51bGwsIHRoZSBleHBhbnNpb24gb2Ygd29yZAoraXMgc3Vic3RpdHV0ZWQ7IG90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIHBhcmFtZXRlciBpcyBzdWJzdGl0dXRlZC4KKy5JdCAke3BhcmFtZXRlcjo9d29yZH0KK0Fzc2lnbiBEZWZhdWx0IFZhbHVlcy4KK0lmIHBhcmFtZXRlciBpcyB1bnNldCBvciBudWxsLCB0aGUgZXhwYW5zaW9uIG9mCit3b3JkIGlzIGFzc2lnbmVkIHRvIHBhcmFtZXRlci4KK0luIGFsbCBjYXNlcywgdGhlIGZpbmFsIHZhbHVlIG9mIHBhcmFtZXRlciBpcyBzdWJzdGl0dXRlZC4KK09ubHkgdmFyaWFibGVzLCBub3QgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIG9yIHNwZWNpYWwKK3BhcmFtZXRlcnMsIGNhbiBiZSBhc3NpZ25lZCBpbiB0aGlzIHdheS4KKy5JdCAke3BhcmFtZXRlcjo/W3dvcmRdfQorSW5kaWNhdGUgRXJyb3IgaWYgTnVsbCBvciBVbnNldC4KK0lmIHBhcmFtZXRlciBpcyB1bnNldCBvciBudWxsLCB0aGUKK2V4cGFuc2lvbiBvZiB3b3JkIChvciBhIG1lc3NhZ2UgaW5kaWNhdGluZyBpdCBpcyB1bnNldCBpZiB3b3JkIGlzIG9taXR0ZWQpCitpcyB3cml0dGVuIHRvIHN0YW5kYXJkIGVycm9yIGFuZCB0aGUgc2hlbGwgZXhpdHMgd2l0aCBhIG5vbnplcm8gZXhpdCBzdGF0dXMuCitPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBwYXJhbWV0ZXIgaXMgc3Vic3RpdHV0ZWQuCitBbiBpbnRlcmFjdGl2ZSBzaGVsbCBuZWVkIG5vdCBleGl0LgorLkl0ICR7cGFyYW1ldGVyOit3b3JkfQorVXNlIEFsdGVybmF0aXZlIFZhbHVlLgorSWYgcGFyYW1ldGVyIGlzIHVuc2V0IG9yIG51bGwsIG51bGwgaXMKK3N1YnN0aXR1dGVkOyBvdGhlcndpc2UsIHRoZSBleHBhbnNpb24gb2Ygd29yZCBpcyBzdWJzdGl0dXRlZC4KKy5FbAorLlBwCitJbiB0aGUgcGFyYW1ldGVyIGV4cGFuc2lvbnMgc2hvd24gcHJldmlvdXNseSwgdXNlIG9mIHRoZSBjb2xvbiBpbiB0aGUKK2Zvcm1hdCByZXN1bHRzIGluIGEgdGVzdCBmb3IgYSBwYXJhbWV0ZXIgdGhhdCBpcyB1bnNldCBvciBudWxsOyBvbWlzc2lvbgorb2YgdGhlIGNvbG9uIHJlc3VsdHMgaW4gYSB0ZXN0IGZvciBhIHBhcmFtZXRlciB0aGF0IGlzIG9ubHkgdW5zZXQuCisuQmwgLXRhZyAtd2lkdGggYWFwYXJhbWV0ZXJ3b3JkYWFhYWEKKy5JdCAkeyNwYXJhbWV0ZXJ9CitTdHJpbmcgTGVuZ3RoLgorVGhlIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSB2YWx1ZSBvZiBwYXJhbWV0ZXIuCisuRWwKKy5QcAorVGhlIGZvbGxvd2luZyBmb3VyIHZhcmlldGllcyBvZiBwYXJhbWV0ZXIgZXhwYW5zaW9uIHByb3ZpZGUgZm9yIHN1YnN0cmluZworcHJvY2Vzc2luZy4KK0luIGVhY2ggY2FzZSwgcGF0dGVybiBtYXRjaGluZyBub3RhdGlvbiAoc2VlCisuU3ggU2hlbGwgUGF0dGVybnMgKSAsCityYXRoZXIgdGhhbiByZWd1bGFyIGV4cHJlc3Npb24gbm90YXRpb24sIGlzIHVzZWQgdG8gZXZhbHVhdGUgdGhlIHBhdHRlcm5zLgorSWYgcGFyYW1ldGVyIGlzICogb3IgQCwgdGhlIHJlc3VsdCBvZiB0aGUgZXhwYW5zaW9uIGlzIHVuc3BlY2lmaWVkLgorRW5jbG9zaW5nIHRoZSBmdWxsIHBhcmFtZXRlciBleHBhbnNpb24gc3RyaW5nIGluIGRvdWJsZS1xdW90ZXMgZG9lcyBub3QKK2NhdXNlIHRoZSBmb2xsb3dpbmcgZm91ciB2YXJpZXRpZXMgb2YgcGF0dGVybiBjaGFyYWN0ZXJzIHRvIGJlIHF1b3RlZCwKK3doZXJlYXMgcXVvdGluZyBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgYnJhY2VzIGhhcyB0aGlzIGVmZmVjdC4KKy5CbCAtdGFnIC13aWR0aCBhYXBhcmFtZXRlcndvcmRhYWFhYQorLkl0ICR7cGFyYW1ldGVyJXdvcmR9CitSZW1vdmUgU21hbGxlc3QgU3VmZml4IFBhdHRlcm4uCitUaGUgd29yZCBpcyBleHBhbmRlZCB0byBwcm9kdWNlIGEgcGF0dGVybi4KK1RoZSBwYXJhbWV0ZXIgZXhwYW5zaW9uIHRoZW4gcmVzdWx0cyBpbiBwYXJhbWV0ZXIsIHdpdGggdGhlCitzbWFsbGVzdCBwb3J0aW9uIG9mIHRoZSBzdWZmaXggbWF0Y2hlZCBieSB0aGUgcGF0dGVybiBkZWxldGVkLgorLkl0ICR7cGFyYW1ldGVyJSV3b3JkfQorUmVtb3ZlIExhcmdlc3QgU3VmZml4IFBhdHRlcm4uCitUaGUgd29yZCBpcyBleHBhbmRlZCB0byBwcm9kdWNlIGEgcGF0dGVybi4KK1RoZSBwYXJhbWV0ZXIgZXhwYW5zaW9uIHRoZW4gcmVzdWx0cyBpbiBwYXJhbWV0ZXIsIHdpdGggdGhlIGxhcmdlc3QKK3BvcnRpb24gb2YgdGhlIHN1ZmZpeCBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuIGRlbGV0ZWQuCisuSXQgJHtwYXJhbWV0ZXIjd29yZH0KK1JlbW92ZSBTbWFsbGVzdCBQcmVmaXggUGF0dGVybi4KK1RoZSB3b3JkIGlzIGV4cGFuZGVkIHRvIHByb2R1Y2UgYSBwYXR0ZXJuLgorVGhlIHBhcmFtZXRlciBleHBhbnNpb24gdGhlbiByZXN1bHRzIGluIHBhcmFtZXRlciwgd2l0aCB0aGUKK3NtYWxsZXN0IHBvcnRpb24gb2YgdGhlIHByZWZpeCBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJuIGRlbGV0ZWQuCisuSXQgJHtwYXJhbWV0ZXIjI3dvcmR9CitSZW1vdmUgTGFyZ2VzdCBQcmVmaXggUGF0dGVybi4KK1RoZSB3b3JkIGlzIGV4cGFuZGVkIHRvIHByb2R1Y2UgYSBwYXR0ZXJuLgorVGhlIHBhcmFtZXRlciBleHBhbnNpb24gdGhlbiByZXN1bHRzIGluIHBhcmFtZXRlciwgd2l0aCB0aGUgbGFyZ2VzdAorcG9ydGlvbiBvZiB0aGUgcHJlZml4IG1hdGNoZWQgYnkgdGhlIHBhdHRlcm4gZGVsZXRlZC4KKy5FbAorLlNzIENvbW1hbmQgU3Vic3RpdHV0aW9uCitDb21tYW5kIHN1YnN0aXR1dGlvbiBhbGxvd3MgdGhlIG91dHB1dCBvZiBhIGNvbW1hbmQgdG8gYmUgc3Vic3RpdHV0ZWQgaW4KK3BsYWNlIG9mIHRoZSBjb21tYW5kIG5hbWUgaXRzZWxmLgorQ29tbWFuZCBzdWJzdGl0dXRpb24gb2NjdXJzIHdoZW4gdGhlIGNvbW1hbmQgaXMgZW5jbG9zZWQgYXMgZm9sbG93czoKKy5QcAorLkRsICQoY29tbWFuZCkKKy5QcAorb3IKKy5QbworLkRxIGJhY2txdW90ZWQKK3ZlcnNpb24KKy5QYyA6CisuUHAKKy5EbCBgY29tbWFuZGAKKy5QcAorVGhlIHNoZWxsIGV4cGFuZHMgdGhlIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGJ5IGV4ZWN1dGluZyBjb21tYW5kIGluIGEKK3N1YnNoZWxsIGVudmlyb25tZW50IGFuZCByZXBsYWNpbmcgdGhlIGNvbW1hbmQgc3Vic3RpdHV0aW9uIHdpdGggdGhlCitzdGFuZGFyZCBvdXRwdXQgb2YgdGhlIGNvbW1hbmQsIHJlbW92aW5nIHNlcXVlbmNlcyBvZiBvbmUgb3IgbW9yZQorLkFvIG5ld2xpbmUgQWMgTnMgcworYXQgdGhlIGVuZCBvZiB0aGUgc3Vic3RpdHV0aW9uLgorKEVtYmVkZGVkCisuQW8gbmV3bGluZSBBYyBOcyBzCitiZWZvcmUKK3RoZSBlbmQgb2YgdGhlIG91dHB1dCBhcmUgbm90IHJlbW92ZWQ7IGhvd2V2ZXIsIGR1cmluZyBmaWVsZCBzcGxpdHRpbmcsCit0aGV5IG1heSBiZSB0cmFuc2xhdGVkIGludG8KKy5BbyBzcGFjZSBBYyBOcyBzICwKK2RlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKKy5FdiBJRlMKK2FuZCBxdW90aW5nIHRoYXQgaXMgaW4gZWZmZWN0LikKKy5TcyBBcml0aG1ldGljIEV4cGFuc2lvbgorQXJpdGhtZXRpYyBleHBhbnNpb24gcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGV2YWx1YXRpbmcgYW4gYXJpdGhtZXRpYworZXhwcmVzc2lvbiBhbmQgc3Vic3RpdHV0aW5nIGl0cyB2YWx1ZS4KK1RoZSBmb3JtYXQgZm9yIGFyaXRobWV0aWMgZXhwYW5zaW9uIGlzIGFzIGZvbGxvd3M6CisuUHAKKy5EbCAkKChleHByZXNzaW9uKSkKKy5QcAorVGhlIGV4cHJlc3Npb24gaXMgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGluIGRvdWJsZS1xdW90ZXMsIGV4Y2VwdAordGhhdCBhIGRvdWJsZS1xdW90ZSBpbnNpZGUgdGhlIGV4cHJlc3Npb24gaXMgbm90IHRyZWF0ZWQgc3BlY2lhbGx5LgorVGhlIHNoZWxsIGV4cGFuZHMgYWxsIHRva2VucyBpbiB0aGUgZXhwcmVzc2lvbiBmb3IgcGFyYW1ldGVyIGV4cGFuc2lvbiwKK2NvbW1hbmQgc3Vic3RpdHV0aW9uLCBhbmQgcXVvdGUgcmVtb3ZhbC4KKy5QcAorTmV4dCwgdGhlIHNoZWxsIHRyZWF0cyB0aGlzIGFzIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbiBhbmQKK3N1YnN0aXR1dGVzIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKy5TcyBXaGl0ZSBTcGFjZSBTcGxpdHRpbmcgKEZpZWxkIFNwbGl0dGluZykKK0FmdGVyIHBhcmFtZXRlciBleHBhbnNpb24sIGNvbW1hbmQgc3Vic3RpdHV0aW9uLCBhbmQKK2FyaXRobWV0aWMgZXhwYW5zaW9uIHRoZSBzaGVsbCBzY2FucyB0aGUgcmVzdWx0cyBvZgorZXhwYW5zaW9ucyBhbmQgc3Vic3RpdHV0aW9ucyB0aGF0IGRpZCBub3Qgb2NjdXIgaW4gZG91YmxlLXF1b3RlcyBmb3IKK2ZpZWxkIHNwbGl0dGluZyBhbmQgbXVsdGlwbGUgZmllbGRzIGNhbiByZXN1bHQuCisuUHAKK1RoZSBzaGVsbCB0cmVhdHMgZWFjaCBjaGFyYWN0ZXIgb2YgdGhlCisuRXYgSUZTCithcyBhIGRlbGltaXRlciBhbmQgdXNlcyB0aGUgZGVsaW1pdGVycyB0byBzcGxpdCB0aGUgcmVzdWx0cyBvZiBwYXJhbWV0ZXIKK2V4cGFuc2lvbiBhbmQgY29tbWFuZCBzdWJzdGl0dXRpb24gaW50byBmaWVsZHMuCisuU3MgUGF0aG5hbWUgRXhwYW5zaW9uIChGaWxlIE5hbWUgR2VuZXJhdGlvbikKK1VubGVzcyB0aGUKKy5GbCBmCitmbGFnIGlzIHNldCwgZmlsZSBuYW1lIGdlbmVyYXRpb24gaXMgcGVyZm9ybWVkIGFmdGVyIHdvcmQgc3BsaXR0aW5nIGlzCitjb21wbGV0ZS4KK0VhY2ggd29yZCBpcyB2aWV3ZWQgYXMgYSBzZXJpZXMgb2YgcGF0dGVybnMsIHNlcGFyYXRlZCBieSBzbGFzaGVzLgorVGhlIHByb2Nlc3Mgb2YgZXhwYW5zaW9uIHJlcGxhY2VzIHRoZSB3b3JkIHdpdGggdGhlIG5hbWVzIG9mIGFsbAorZXhpc3RpbmcgZmlsZXMgd2hvc2UgbmFtZXMgY2FuIGJlIGZvcm1lZCBieSByZXBsYWNpbmcgZWFjaCBwYXR0ZXJuIHdpdGggYQorc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHBhdHRlcm4uCitUaGVyZSBhcmUgdHdvIHJlc3RyaWN0aW9ucyBvbgordGhpczogZmlyc3QsIGEgcGF0dGVybiBjYW5ub3QgbWF0Y2ggYSBzdHJpbmcgY29udGFpbmluZyBhIHNsYXNoLCBhbmQKK3NlY29uZCwgYSBwYXR0ZXJuIGNhbm5vdCBtYXRjaCBhIHN0cmluZyBzdGFydGluZyB3aXRoIGEgcGVyaW9kIHVubGVzcyB0aGUKK2ZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcGF0dGVybiBpcyBhIHBlcmlvZC4KK1RoZSBuZXh0IHNlY3Rpb24gZGVzY3JpYmVzIHRoZQorcGF0dGVybnMgdXNlZCBmb3IgYm90aCBQYXRobmFtZSBFeHBhbnNpb24gYW5kIHRoZQorLkljIGNhc2UKK2NvbW1hbmQuCisuU3MgU2hlbGwgUGF0dGVybnMKK0EgcGF0dGVybiBjb25zaXN0cyBvZiBub3JtYWwgY2hhcmFjdGVycywgd2hpY2ggbWF0Y2ggdGhlbXNlbHZlcywKK2FuZCBtZXRhLWNoYXJhY3RlcnMuCitUaGUgbWV0YS1jaGFyYWN0ZXJzIGFyZQorLkRxIFwmISAsCisuRHEgKiAsCisuRHEgXCY/ICwKK2FuZAorLkRxIFwmWyAuCitUaGVzZSBjaGFyYWN0ZXJzIGxvc2UgdGhlaXIgc3BlY2lhbCBtZWFuaW5ncyBpZiB0aGV5IGFyZSBxdW90ZWQuCitXaGVuIGNvbW1hbmQgb3IgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIHBlcmZvcm1lZAorYW5kIHRoZSBkb2xsYXIgc2lnbiBvciBiYWNrIHF1b3RlcyBhcmUgbm90IGRvdWJsZSBxdW90ZWQsCit0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIG9yIHRoZSBvdXRwdXQgb2YKK3RoZSBjb21tYW5kIGlzIHNjYW5uZWQgZm9yIHRoZXNlIGNoYXJhY3RlcnMgYW5kIHRoZXkgYXJlIHR1cm5lZCBpbnRvCittZXRhLWNoYXJhY3RlcnMuCisuUHAKK0FuIGFzdGVyaXNrCisuUHEgRHEgKgorbWF0Y2hlcyBhbnkgc3RyaW5nIG9mIGNoYXJhY3RlcnMuCitBIHF1ZXN0aW9uIG1hcmsgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci4KK0EgbGVmdCBicmFja2V0CisuUHEgRHEgXCZbCitpbnRyb2R1Y2VzIGEgY2hhcmFjdGVyIGNsYXNzLgorVGhlIGVuZCBvZiB0aGUgY2hhcmFjdGVyIGNsYXNzIGlzIGluZGljYXRlZCBieSBhCisuUHEgRHEgXCZdIDsKK2lmIHRoZQorLkRxIFwmXQoraXMgbWlzc2luZyB0aGVuIHRoZQorLkRxIFwmWworbWF0Y2hlcyBhCisuRHEgXCZbCityYXRoZXIgdGhhbiBpbnRyb2R1Y2luZyBhIGNoYXJhY3RlciBjbGFzcy4KK0EgY2hhcmFjdGVyIGNsYXNzIG1hdGNoZXMgYW55IG9mIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHNxdWFyZSBicmFja2V0cy4KK0EgcmFuZ2Ugb2YgY2hhcmFjdGVycyBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIGEgbWludXMgc2lnbi4KK1RoZSBjaGFyYWN0ZXIgY2xhc3MgbWF5IGJlIGNvbXBsZW1lbnRlZAorYnkgbWFraW5nIGFuIGV4Y2xhbWF0aW9uIHBvaW50IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGNoYXJhY3RlciBjbGFzcy4KKy5QcAorVG8gaW5jbHVkZSBhCisuRHEgXCZdCitpbiBhIGNoYXJhY3RlciBjbGFzcywgbWFrZSBpdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGxpc3RlZCAoYWZ0ZXIgdGhlCisuRHEgXCYhICwKK2lmIGFueSkuCitUbyBpbmNsdWRlIGEgbWludXMgc2lnbiwgbWFrZSBpdCB0aGUgZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIgbGlzdGVkLgorLlNzIEJ1aWx0aW5zCitUaGlzIHNlY3Rpb24gbGlzdHMgdGhlIGJ1aWx0aW4gY29tbWFuZHMgd2hpY2ggYXJlIGJ1aWx0aW4gYmVjYXVzZSB0aGV5CituZWVkIHRvIHBlcmZvcm0gc29tZSBvcGVyYXRpb24gdGhhdCBjYW4ndCBiZSBwZXJmb3JtZWQgYnkgYSBzZXBhcmF0ZQorcHJvY2Vzcy4KK0luIGFkZGl0aW9uIHRvIHRoZXNlLCB0aGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBjb21tYW5kcyB0aGF0IG1heQorYmUgYnVpbHRpbiBmb3IgZWZmaWNpZW5jeSAoZS5nLgorLlhyIHByaW50ZiAxICwKKy5YciBlY2hvIDEgLAorLlhyIHRlc3QgMSAsCitldGMpLgorLkJsIC10YWcgLXdpZHRoIDVuCisuSXQgOgorLkl0IHRydWUKK0EgbnVsbCBjb21tYW5kIHRoYXQgcmV0dXJucyBhIDAgKHRydWUpIGV4aXQgdmFsdWUuCisuSXQgXCYuIGZpbGUKK1RoZSBjb21tYW5kcyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgYXJlIHJlYWQgYW5kIGV4ZWN1dGVkIGJ5IHRoZSBzaGVsbC4KKy5JdCBhbGlhcyBPcCBBciBuYW1lIE5zIE9wIEFyICI9c3RyaW5nIC4uLiIKK0lmCisuQXIgbmFtZT1zdHJpbmcKK2lzIHNwZWNpZmllZCwgdGhlIHNoZWxsIGRlZmluZXMgdGhlIGFsaWFzCisuQXIgbmFtZQord2l0aCB2YWx1ZQorLkFyIHN0cmluZyAuCitJZiBqdXN0CisuQXIgbmFtZQoraXMgc3BlY2lmaWVkLCB0aGUgdmFsdWUgb2YgdGhlIGFsaWFzCisuQXIgbmFtZQoraXMgcHJpbnRlZC4KK1dpdGggbm8gYXJndW1lbnRzLCB0aGUKKy5JYyBhbGlhcworYnVpbHRpbiBwcmludHMgdGhlCituYW1lcyBhbmQgdmFsdWVzIG9mIGFsbCBkZWZpbmVkIGFsaWFzZXMgKHNlZQorLkljIHVuYWxpYXMgKSAuCisuSXQgYmcgWyBBciBqb2IgXSAuLi4KK0NvbnRpbnVlIHRoZSBzcGVjaWZpZWQgam9icyAob3IgdGhlIGN1cnJlbnQgam9iIGlmIG5vCitqb2JzIGFyZSBnaXZlbikgaW4gdGhlIGJhY2tncm91bmQuCisuSXQgWG8gY29tbWFuZAorLk9wIEZsIHAKKy5PcCBGbCB2CisuT3AgRmwgVgorLkFyIGNvbW1hbmQKKy5PcCBBciBhcmcgLi4uCisuWGMKK0V4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGJ1dCBpZ25vcmUgc2hlbGwgZnVuY3Rpb25zIHdoZW4gc2VhcmNoaW5nCitmb3IgaXQuCisoVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UKK2hhdmUgYSBzaGVsbCBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBidWlsdGluIGNvbW1hbmQuKQorLkJsIC10YWcgLXdpZHRoIDVuCisuSXQgRmwgcAorc2VhcmNoIGZvciBjb21tYW5kIHVzaW5nIGEKKy5FdiBQQVRICit0aGF0IGd1YXJhbnRlZXMgdG8gZmluZCBhbGwgdGhlIHN0YW5kYXJkIHV0aWxpdGllcy4KKy5JdCBGbCBWCitEbyBub3QgZXhlY3V0ZSB0aGUgY29tbWFuZCBidXQKK3NlYXJjaCBmb3IgdGhlIGNvbW1hbmQgYW5kIHByaW50IHRoZSByZXNvbHV0aW9uIG9mIHRoZQorY29tbWFuZCBzZWFyY2guCitUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSB0eXBlIGJ1aWx0aW4uCisuSXQgRmwgdgorRG8gbm90IGV4ZWN1dGUgdGhlIGNvbW1hbmQgYnV0CitzZWFyY2ggZm9yIHRoZSBjb21tYW5kIGFuZCBwcmludCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUKK29mIHV0aWxpdGllcywgdGhlIG5hbWUgZm9yIGJ1aWx0aW5zIG9yIHRoZSBleHBhbnNpb24gb2YgYWxpYXNlcy4KKy5FbAorLkl0IGNkIEFyIC0KKy5JdCBYbyBjZCBPcCBGbCBMUAorLk9wIEFyIGRpcmVjdG9yeQorLlhjCitTd2l0Y2ggdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgKGRlZmF1bHQKKy5FdiBIT01FICkgLgorSWYgYW4gZW50cnkgZm9yCisuRXYgQ0RQQVRICithcHBlYXJzIGluIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUKKy5JYyBjZAorY29tbWFuZCBvciB0aGUgc2hlbGwgdmFyaWFibGUKKy5FdiBDRFBBVEgKK2lzIHNldCBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lIGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaCwgdGhlbiB0aGUKK2RpcmVjdG9yaWVzIGxpc3RlZCBpbgorLkV2IENEUEFUSAord2lsbCBiZSBzZWFyY2hlZCBmb3IgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCitUaGUgZm9ybWF0IG9mCisuRXYgQ0RQQVRICitpcyB0aGUgc2FtZSBhcyB0aGF0IG9mCisuRXYgUEFUSCAuCitJZiBhIHNpbmdsZSBkYXNoIGlzIHNwZWNpZmllZCBhcyB0aGUgYXJndW1lbnQsIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlCit2YWx1ZSBvZgorLkV2IE9MRFBXRCAuCitUaGUKKy5JYyBjZAorY29tbWFuZCB3aWxsIHByaW50IG91dCB0aGUgbmFtZSBvZiB0aGUKK2RpcmVjdG9yeSB0aGF0IGl0IGFjdHVhbGx5IHN3aXRjaGVkIHRvIGlmIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIG5hbWUKK3RoYXQgdGhlIHVzZXIgZ2F2ZS4KK1RoZXNlIG1heSBiZSBkaWZmZXJlbnQgZWl0aGVyIGJlY2F1c2UgdGhlCisuRXYgQ0RQQVRICittZWNoYW5pc20gd2FzIHVzZWQgb3IgYmVjYXVzZSB0aGUgYXJndW1lbnQgaXMgYSBzaW5nbGUgZGFzaC4KK1RoZQorLkZsIFAKK29wdGlvbiBjYXVzZXMgdGhlIHBoeXNpY2FsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCwgdGhhdCBpcywgYWxsCitzeW1ib2xpYyBsaW5rcyBhcmUgcmVzb2x2ZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMuICBUaGUKKy5GbCBMCitvcHRpb24gdHVybnMgb2ZmIHRoZSBlZmZlY3Qgb2YgYW55IHByZWNlZGluZworLkZsIFAKK29wdGlvbnMuCisuSXQgWG8gZWNobyBPcCBGbCBuCisuQXIgYXJncy4uLgorLlhjCitQcmludCB0aGUgYXJndW1lbnRzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIHNlcGFyYXRlZCBieSBzcGFjZXMuCitVbmxlc3MgdGhlCisuRmwgbgorb3B0aW9uIGlzIHByZXNlbnQsIGEgbmV3bGluZSBpcyBvdXRwdXQgZm9sbG93aW5nIHRoZSBhcmd1bWVudHMuCisuUHAKK0lmIGFueSBvZiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIGlzIGVuY291bnRlcmVkIGR1cmluZworb3V0cHV0LCB0aGUgc2VxdWVuY2UgaXMgbm90IG91dHB1dC4gIEluc3RlYWQsIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGlzCitwZXJmb3JtZWQ6CisuQmwgLXRhZyAtd2lkdGggaW5kZW50CisuSXQgTGkgXGViCitBIGJhY2tzcGFjZSBjaGFyYWN0ZXIgaXMgb3V0cHV0LgorLkl0IExpIFxlYworU3Vic2VxdWVudCBvdXRwdXQgaXMgc3VwcHJlc3NlZC4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZQorbGFzdCBhcmd1bWVudCB0byBzdXBwcmVzcyB0aGUgdHJhaWxpbmcgbmV3bGluZSB0aGF0CisuSWMgZWNobword291bGQgb3RoZXJ3aXNlIG91dHB1dC4KKy5JdCBMaSBcZWYKK091dHB1dCBhIGZvcm0gZmVlZC4KKy5JdCBMaSBcZW4KK091dHB1dCBhIG5ld2xpbmUgY2hhcmFjdGVyLgorLkl0IExpIFxlcgorT3V0cHV0IGEgY2FycmlhZ2UgcmV0dXJuLgorLkl0IExpIFxldAorT3V0cHV0IGEgKGhvcml6b250YWwpIHRhYiBjaGFyYWN0ZXIuCisuSXQgTGkgXGV2CitPdXRwdXQgYSB2ZXJ0aWNhbCB0YWIuCisuSXQgTGkgXGUwIE5zIEFyIGRpZ2l0cworT3V0cHV0IHRoZSBjaGFyYWN0ZXIgd2hvc2UgdmFsdWUgaXMgZ2l2ZW4gYnkgemVybyB0byB0aHJlZSBvY3RhbCBkaWdpdHMuCitJZiB0aGVyZSBhcmUgemVybyBkaWdpdHMsIGEgbnVsIGNoYXJhY3RlciBpcyBvdXRwdXQuCisuSXQgTGkgXGVcZQorT3V0cHV0IGEgYmFja3NsYXNoLgorLkVsCisuUHAKK0FsbCBvdGhlciBiYWNrc2xhc2ggc2VxdWVuY2VzIGVsaWNpdCB1bmRlZmluZWQgYmVoYXZpb3VyLgorLkl0IGV2YWwgQXIgc3RyaW5nIC4uLgorQ29uY2F0ZW5hdGUgYWxsIHRoZSBhcmd1bWVudHMgd2l0aCBzcGFjZXMuCitUaGVuIHJlLXBhcnNlIGFuZCBleGVjdXRlIHRoZSBjb21tYW5kLgorLkl0IGV4ZWMgT3AgQXIgY29tbWFuZCBhcmcgLi4uCitVbmxlc3MgY29tbWFuZCBpcyBvbWl0dGVkLCB0aGUgc2hlbGwgcHJvY2VzcyBpcyByZXBsYWNlZCB3aXRoIHRoZQorc3BlY2lmaWVkIHByb2dyYW0gKHdoaWNoIG11c3QgYmUgYSByZWFsIHByb2dyYW0sIG5vdCBhIHNoZWxsIGJ1aWx0aW4gb3IKK2Z1bmN0aW9uKS4KK0FueSByZWRpcmVjdGlvbnMgb24gdGhlCisuSWMgZXhlYworY29tbWFuZCBhcmUgbWFya2VkIGFzIHBlcm1hbmVudCwgc28gdGhhdCB0aGV5IGFyZSBub3QgdW5kb25lIHdoZW4gdGhlCisuSWMgZXhlYworY29tbWFuZCBmaW5pc2hlcy4KKy5JdCBleGl0IE9wIEFyIGV4aXRzdGF0dXMKK1Rlcm1pbmF0ZSB0aGUgc2hlbGwgcHJvY2Vzcy4KK0lmCisuQXIgZXhpdHN0YXR1cworaXMgZ2l2ZW4gaXQgaXMgdXNlZCBhcyB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHNoZWxsOyBvdGhlcndpc2UgdGhlCitleGl0IHN0YXR1cyBvZiB0aGUgcHJlY2VkaW5nIGNvbW1hbmQgaXMgdXNlZC4KKy5JdCBleHBvcnQgQXIgbmFtZSAuLi4KKy5JdCBleHBvcnQgRmwgcAorVGhlIHNwZWNpZmllZCBuYW1lcyBhcmUgZXhwb3J0ZWQgc28gdGhhdCB0aGV5IHdpbGwgYXBwZWFyIGluIHRoZQorZW52aXJvbm1lbnQgb2Ygc3Vic2VxdWVudCBjb21tYW5kcy4KK1RoZSBvbmx5IHdheSB0byB1bi1leHBvcnQgYSB2YXJpYWJsZSBpcyB0byB1bnNldCBpdC4KK1RoZSBzaGVsbCBhbGxvd3MgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgdG8gYmUgc2V0IGF0IHRoZQorc2FtZSB0aW1lIGl0IGlzIGV4cG9ydGVkIGJ5IHdyaXRpbmcKKy5QcAorLkRsIGV4cG9ydCBuYW1lPXZhbHVlCisuUHAKK1dpdGggbm8gYXJndW1lbnRzIHRoZSBleHBvcnQgY29tbWFuZCBsaXN0cyB0aGUgbmFtZXMgb2YgYWxsIGV4cG9ydGVkIHZhcmlhYmxlcy4KK1dpdGggdGhlCisuRmwgcAorb3B0aW9uIHNwZWNpZmllZCB0aGUgb3V0cHV0IHdpbGwgYmUgZm9ybWF0dGVkIHN1aXRhYmx5IGZvciBub24taW50ZXJhY3RpdmUgdXNlLgorLkl0IFhvIGZjIE9wIEZsIGUgQXIgZWRpdG9yCisuT3AgQXIgZmlyc3QgT3AgQXIgbGFzdAorLlhjCisuSXQgWG8gZmMgRmwgbAorLk9wIEZsIG5yCisuT3AgQXIgZmlyc3QgT3AgQXIgbGFzdAorLlhjCisuSXQgWG8gZmMgRmwgcyBPcCBBciBvbGQ9bmV3CisuT3AgQXIgZmlyc3QKKy5YYworVGhlCisuSWMgZmMKK2J1aWx0aW4gbGlzdHMsIG9yIGVkaXRzIGFuZCByZS1leGVjdXRlcywgY29tbWFuZHMgcHJldmlvdXNseSBlbnRlcmVkCit0byBhbiBpbnRlcmFjdGl2ZSBzaGVsbC4KKy5CbCAtdGFnIC13aWR0aCA1bgorLkl0IEZsIGUgTm8gZWRpdG9yCitVc2UgdGhlIGVkaXRvciBuYW1lZCBieSBlZGl0b3IgdG8gZWRpdCB0aGUgY29tbWFuZHMuCitUaGUgZWRpdG9yIHN0cmluZyBpcyBhIGNvbW1hbmQgbmFtZSwgc3ViamVjdCB0byBzZWFyY2ggdmlhIHRoZQorLkV2IFBBVEgKK3ZhcmlhYmxlLgorVGhlIHZhbHVlIGluIHRoZQorLkV2IEZDRURJVAordmFyaWFibGUgaXMgdXNlZCBhcyBhIGRlZmF1bHQgd2hlbgorLkZsIGUKK2lzIG5vdCBzcGVjaWZpZWQuCitJZgorLkV2IEZDRURJVAoraXMgbnVsbCBvciB1bnNldCwgdGhlIHZhbHVlIG9mIHRoZQorLkV2IEVESVRPUgordmFyaWFibGUgaXMgdXNlZC4KK0lmCisuRXYgRURJVE9SCitpcyBudWxsIG9yIHVuc2V0LAorLlhyIGVkIDEKK2lzIHVzZWQgYXMgdGhlIGVkaXRvci4KKy5JdCBGbCBsIE5vIChlbGwpCitMaXN0IHRoZSBjb21tYW5kcyByYXRoZXIgdGhhbiBpbnZva2luZyBhbiBlZGl0b3Igb24gdGhlbS4KK1RoZSBjb21tYW5kcyBhcmUgd3JpdHRlbiBpbiB0aGUgc2VxdWVuY2UgaW5kaWNhdGVkIGJ5Cit0aGUgZmlyc3QgYW5kIGxhc3Qgb3BlcmFuZHMsIGFzIGFmZmVjdGVkIGJ5CisuRmwgciAsCit3aXRoIGVhY2ggY29tbWFuZCBwcmVjZWRlZCBieSB0aGUgY29tbWFuZCBudW1iZXIuCisuSXQgRmwgbgorU3VwcHJlc3MgY29tbWFuZCBudW1iZXJzIHdoZW4gbGlzdGluZyB3aXRoIC1sLgorLkl0IEZsIHIKK1JldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBjb21tYW5kcyBsaXN0ZWQgKHdpdGgKKy5GbCBsICkKK29yIGVkaXRlZCAod2l0aCBuZWl0aGVyCisuRmwgbAorbm9yCisuRmwgcyApIC4KKy5JdCBGbCBzCitSZS1leGVjdXRlIHRoZSBjb21tYW5kIHdpdGhvdXQgaW52b2tpbmcgYW4gZWRpdG9yLgorLkl0IGZpcnN0CisuSXQgbGFzdAorU2VsZWN0IHRoZSBjb21tYW5kcyB0byBsaXN0IG9yIGVkaXQuCitUaGUgbnVtYmVyIG9mIHByZXZpb3VzIGNvbW1hbmRzIHRoYXQKK2NhbiBiZSBhY2Nlc3NlZCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUgb2YgdGhlCisuRXYgSElTVFNJWkUKK3ZhcmlhYmxlLgorVGhlIHZhbHVlIG9mIGZpcnN0IG9yIGxhc3Qgb3IgYm90aCBhcmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisuQmwgLXRhZyAtd2lkdGggNW4KKy5JdCBbK11udW1iZXIKK0EgcG9zaXRpdmUgbnVtYmVyIHJlcHJlc2VudGluZyBhIGNvbW1hbmQgbnVtYmVyOyBjb21tYW5kIG51bWJlcnMgY2FuIGJlCitkaXNwbGF5ZWQgd2l0aCB0aGUKKy5GbCBsCitvcHRpb24uCisuSXQgRmwgbnVtYmVyCitBIG5lZ2F0aXZlIGRlY2ltYWwgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgY29tbWFuZCB0aGF0IHdhcyBleGVjdXRlZAorbnVtYmVyIG9mIGNvbW1hbmRzIHByZXZpb3VzbHkuCitGb3IgZXhhbXBsZSwgXC0xIGlzIHRoZSBpbW1lZGlhdGVseSBwcmV2aW91cyBjb21tYW5kLgorLkVsCisuSXQgc3RyaW5nCitBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBtb3N0IHJlY2VudGx5IGVudGVyZWQgY29tbWFuZCB0aGF0IGJlZ2lucyB3aXRoCit0aGF0IHN0cmluZy4KK0lmIHRoZSBvbGQ9bmV3IG9wZXJhbmQgaXMgbm90IGFsc28gc3BlY2lmaWVkIHdpdGgKKy5GbCBzICwKK3RoZSBzdHJpbmcgZm9ybSBvZiB0aGUgZmlyc3Qgb3BlcmFuZCBjYW5ub3QgY29udGFpbiBhbiBlbWJlZGRlZCBlcXVhbCBzaWduLgorLkVsCisuUHAKK1RoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFmZmVjdCB0aGUgZXhlY3V0aW9uIG9mIGZjOgorLkJsIC10YWcgLXdpZHRoIEhJU1RTSVpFCisuSXQgRXYgRkNFRElUCitOYW1lIG9mIHRoZSBlZGl0b3IgdG8gdXNlLgorLkl0IEV2IEhJU1RTSVpFCitUaGUgbnVtYmVyIG9mIHByZXZpb3VzIGNvbW1hbmRzIHRoYXQgYXJlIGFjY2Vzc2libGUuCisuRWwKKy5JdCBmZyBPcCBBciBqb2IKK01vdmUgdGhlIHNwZWNpZmllZCBqb2Igb3IgdGhlIGN1cnJlbnQgam9iIHRvIHRoZSBmb3JlZ3JvdW5kLgorLkl0IGdldG9wdHMgQXIgb3B0c3RyaW5nIHZhcgorVGhlCisuVG4gUE9TSVgKKy5JYyBnZXRvcHRzCitjb21tYW5kLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUKKy5FbSBCZWxsIExhYnMKKy1kZXJpdmVkCisuWHIgZ2V0b3B0IDEgLgorLlBwCitUaGUgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGEgc2VyaWVzIG9mIGxldHRlcnMsIGVhY2ggb2Ygd2hpY2ggbWF5IGJlCitvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgY29sb24gdG8gaW5kaWNhdGUgdGhhdCB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuCithcmd1bWVudC4KK1RoZSB2YXJpYWJsZSBzcGVjaWZpZWQgaXMgc2V0IHRvIHRoZSBwYXJzZWQgb3B0aW9uLgorLlBwCitUaGUKKy5JYyBnZXRvcHRzCitjb21tYW5kIGRlcHJlY2F0ZXMgdGhlIG9sZGVyCisuWHIgZ2V0b3B0IDEKK3V0aWxpdHkgZHVlIHRvIGl0cyBoYW5kbGluZyBvZiBhcmd1bWVudHMgY29udGFpbmluZyB3aGl0ZXNwYWNlLgorLlBwCitUaGUKKy5JYyBnZXRvcHRzCitidWlsdGluIG1heSBiZSB1c2VkIHRvIG9idGFpbiBvcHRpb25zIGFuZCB0aGVpciBhcmd1bWVudHMKK2Zyb20gYSBsaXN0IG9mIHBhcmFtZXRlcnMuCitXaGVuIGludm9rZWQsCisuSWMgZ2V0b3B0cworcGxhY2VzIHRoZSB2YWx1ZSBvZiB0aGUgbmV4dCBvcHRpb24gZnJvbSB0aGUgb3B0aW9uIHN0cmluZyBpbiB0aGUgbGlzdCBpbgordGhlIHNoZWxsIHZhcmlhYmxlIHNwZWNpZmllZCBieQorLlZhIHZhcgorYW5kIGl0cyBpbmRleCBpbiB0aGUgc2hlbGwgdmFyaWFibGUKKy5FdiBPUFRJTkQgLgorV2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCwKKy5FdiBPUFRJTkQKK2lzIGluaXRpYWxpemVkIHRvIDEuCitGb3IgZWFjaCBvcHRpb24gdGhhdCByZXF1aXJlcyBhbiBhcmd1bWVudCwgdGhlCisuSWMgZ2V0b3B0cworYnVpbHRpbiB3aWxsIHBsYWNlIGl0IGluIHRoZSBzaGVsbCB2YXJpYWJsZQorLkV2IE9QVEFSRyAuCitJZiBhbiBvcHRpb24gaXMgbm90IGFsbG93ZWQgZm9yIGluIHRoZQorLlZhIG9wdHN0cmluZyAsCit0aGVuCisuRXYgT1BUQVJHCit3aWxsIGJlIHVuc2V0LgorLlBwCisuVmEgb3B0c3RyaW5nCitpcyBhIHN0cmluZyBvZiByZWNvZ25pemVkIG9wdGlvbiBsZXR0ZXJzIChzZWUKKy5YciBnZXRvcHQgMyApIC4KK0lmIGEgbGV0dGVyIGlzIGZvbGxvd2VkIGJ5IGEgY29sb24sIHRoZSBvcHRpb24gaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhbgorYXJndW1lbnQgd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgc2VwYXJhdGVkIGZyb20gaXQgYnkgd2hpdGUgc3BhY2UuCitJZiBhbiBvcHRpb24gY2hhcmFjdGVyIGlzIG5vdCBmb3VuZCB3aGVyZSBleHBlY3RlZCwKKy5JYyBnZXRvcHRzCit3aWxsIHNldCB0aGUgdmFyaWFibGUKKy5WYSB2YXIKK3RvIGEKKy5EcSBcJj8gOworLkljIGdldG9wdHMKK3dpbGwgdGhlbiB1bnNldAorLkV2IE9QVEFSRworYW5kIHdyaXRlIG91dHB1dCB0byBzdGFuZGFyZCBlcnJvci4KK0J5IHNwZWNpZnlpbmcgYSBjb2xvbiBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCisuVmEgb3B0c3RyaW5nCithbGwgZXJyb3JzIHdpbGwgYmUgaWdub3JlZC4KKy5QcAorQSBub256ZXJvIHZhbHVlIGlzIHJldHVybmVkIHdoZW4gdGhlIGxhc3Qgb3B0aW9uIGlzIHJlYWNoZWQuCitJZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGFyZ3VtZW50cywKKy5JYyBnZXRvcHRzCit3aWxsIHNldAorLlZhIHZhcgordG8gdGhlIHNwZWNpYWwgb3B0aW9uLAorLkRxIC0tICwKK290aGVyd2lzZSwgaXQgd2lsbCBzZXQKKy5WYSB2YXIKK3RvCisuRHEgXCY/IC4KKy5QcAorVGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IHNob3dzIGhvdyBvbmUgbWlnaHQgcHJvY2VzcyB0aGUgYXJndW1lbnRzCitmb3IgYSBjb21tYW5kIHRoYXQgY2FuIHRha2UgdGhlIG9wdGlvbnMKKy5PcCBhCithbmQKKy5PcCBiICwKK2FuZCB0aGUgb3B0aW9uCisuT3AgYyAsCit3aGljaCByZXF1aXJlcyBhbiBhcmd1bWVudC4KKy5QcAorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50Cit3aGlsZSBnZXRvcHRzIGFiYzogZgorZG8KKwljYXNlICRmIGluCisJYSB8IGIpCWZsYWc9JGY7OworCWMpCWNhcmc9JE9QVEFSRzs7CisJXFw/KQllY2hvICRVU0FHRTsgZXhpdCAxOzsKKwllc2FjCitkb25lCitzaGlmdCBgZXhwciAkT1BUSU5EIC0gMWAKKy5FZAorLlBwCitUaGlzIGNvZGUgd2lsbCBhY2NlcHQgYW55IG9mIHRoZSBmb2xsb3dpbmcgYXMgZXF1aXZhbGVudDoKKy5QcAorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitjbWQgXC1hY2FyZyBmaWxlIGZpbGUKK2NtZCBcLWEgXC1jIGFyZyBmaWxlIGZpbGUKK2NtZCBcLWNhcmcgLWEgZmlsZSBmaWxlCitjbWQgXC1hIFwtY2FyZyBcLVwtIGZpbGUgZmlsZQorLkVkCisuSXQgaGFzaCBGbCBydiBBciBjb21tYW5kIC4uLgorVGhlIHNoZWxsIG1haW50YWlucyBhIGhhc2ggdGFibGUgd2hpY2ggcmVtZW1iZXJzIHRoZQorbG9jYXRpb25zIG9mIGNvbW1hbmRzLgorV2l0aCBubyBhcmd1bWVudHMgd2hhdHNvZXZlciwKK3RoZQorLkljIGhhc2gKK2NvbW1hbmQgcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhpcyB0YWJsZS4KK0VudHJpZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiBsb29rZWQgYXQgc2luY2UgdGhlIGxhc3QKKy5JYyBjZAorY29tbWFuZCBhcmUgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2s7IGl0IGlzIHBvc3NpYmxlIGZvciB0aGVzZSBlbnRyaWVzCit0byBiZSBpbnZhbGlkLgorLlBwCitXaXRoIGFyZ3VtZW50cywgdGhlCisuSWMgaGFzaAorY29tbWFuZCByZW1vdmVzIHRoZSBzcGVjaWZpZWQgY29tbWFuZHMgZnJvbSB0aGUgaGFzaCB0YWJsZSAodW5sZXNzCit0aGV5IGFyZSBmdW5jdGlvbnMpIGFuZCB0aGVuIGxvY2F0ZXMgdGhlbS4KK1dpdGggdGhlCisuRmwgdgorb3B0aW9uLCBoYXNoIHByaW50cyB0aGUgbG9jYXRpb25zIG9mIHRoZSBjb21tYW5kcyBhcyBpdCBmaW5kcyB0aGVtLgorVGhlCisuRmwgcgorb3B0aW9uIGNhdXNlcyB0aGUgaGFzaCBjb21tYW5kIHRvIGRlbGV0ZSBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUKK2V4Y2VwdCBmb3IgZnVuY3Rpb25zLgorLkl0IHB3ZCBPcCBGbCBMUAorYnVpbHRpbiBjb21tYW5kIHJlbWVtYmVycyB3aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeQoraXMgcmF0aGVyIHRoYW4gcmVjb21wdXRpbmcgaXQgZWFjaCB0aW1lLgorVGhpcyBtYWtlcyBpdCBmYXN0ZXIuCitIb3dldmVyLCBpZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgcmVuYW1lZCwgdGhlIGJ1aWx0aW4gdmVyc2lvbiBvZgorLkljIHB3ZAord2lsbCBjb250aW51ZSB0byBwcmludCB0aGUgb2xkIG5hbWUgZm9yIHRoZSBkaXJlY3RvcnkuCitUaGUKKy5GbCBQCitvcHRpb24gY2F1c2VzIHRoZSBwaHlzaWNhbCB2YWx1ZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSBzaG93biwKK3RoYXQgaXMsIGFsbCBzeW1ib2xpYyBsaW5rcyBhcmUgcmVzb2x2ZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMuICBUaGUKKy5GbCBMCitvcHRpb24gdHVybnMgb2ZmIHRoZSBlZmZlY3Qgb2YgYW55IHByZWNlZGluZworLkZsIFAKK29wdGlvbnMuCisuSXQgWG8gcmVhZCBPcCBGbCBwIEFyIHByb21wdAorLk9wIEZsIHIKKy5BciB2YXJpYWJsZQorLk9wIEFyIC4uLgorLlhjCitUaGUgcHJvbXB0IGlzIHByaW50ZWQgaWYgdGhlCisuRmwgcAorb3B0aW9uIGlzIHNwZWNpZmllZCBhbmQgdGhlIHN0YW5kYXJkIGlucHV0IGlzIGEgdGVybWluYWwuCitUaGVuIGEgbGluZSBpcyByZWFkIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LgorVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgZGVsZXRlZCBmcm9tIHRoZQorbGluZSBhbmQgdGhlIGxpbmUgaXMgc3BsaXQgYXMgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIG9uIHdvcmQgc3BsaXR0aW5nCithYm92ZSwgYW5kIHRoZSBwaWVjZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSB2YXJpYWJsZXMgaW4gb3JkZXIuCitBdCBsZWFzdCBvbmUgdmFyaWFibGUgbXVzdCBiZSBzcGVjaWZpZWQuCitJZiB0aGVyZSBhcmUgbW9yZSBwaWVjZXMgdGhhbiB2YXJpYWJsZXMsIHRoZSByZW1haW5pbmcgcGllY2VzCisoYWxvbmcgd2l0aCB0aGUgY2hhcmFjdGVycyBpbgorLkV2IElGUwordGhhdCBzZXBhcmF0ZWQgdGhlbSkgYXJlIGFzc2lnbmVkIHRvIHRoZSBsYXN0IHZhcmlhYmxlLgorSWYgdGhlcmUgYXJlIG1vcmUgdmFyaWFibGVzIHRoYW4gcGllY2VzLAordGhlIHJlbWFpbmluZyB2YXJpYWJsZXMgYXJlIGFzc2lnbmVkIHRoZSBudWxsIHN0cmluZy4KK1RoZQorLkljIHJlYWQKK2J1aWx0aW4gd2lsbCBpbmRpY2F0ZSBzdWNjZXNzIHVubGVzcyBFT0YgaXMgZW5jb3VudGVyZWQgb24gaW5wdXQsIGluCit3aGljaCBjYXNlIGZhaWx1cmUgaXMgcmV0dXJuZWQuCisuUHAKK0J5IGRlZmF1bHQsIHVubGVzcyB0aGUKKy5GbCByCitvcHRpb24gaXMgc3BlY2lmaWVkLCB0aGUgYmFja3NsYXNoCisuRHEgXGUKK2FjdHMgYXMgYW4gZXNjYXBlIGNoYXJhY3RlciwgY2F1c2luZyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlciB0byBiZSB0cmVhdGVkCitsaXRlcmFsbHkuCitJZiBhIGJhY2tzbGFzaCBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUsIHRoZSBiYWNrc2xhc2ggYW5kIHRoZQorbmV3bGluZSB3aWxsIGJlIGRlbGV0ZWQuCisuSXQgcmVhZG9ubHkgQXIgbmFtZSAuLi4KKy5JdCByZWFkb25seSBGbCBwCitUaGUgc3BlY2lmaWVkIG5hbWVzIGFyZSBtYXJrZWQgYXMgcmVhZCBvbmx5LCBzbyB0aGF0IHRoZXkgY2Fubm90IGJlCitzdWJzZXF1ZW50bHkgbW9kaWZpZWQgb3IgdW5zZXQuCitUaGUgc2hlbGwgYWxsb3dzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlCit0byBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBpdCBpcyBtYXJrZWQgcmVhZCBvbmx5IGJ5IHdyaXRpbmcKKy5QcAorLkRsIHJlYWRvbmx5IG5hbWU9dmFsdWUKKy5QcAorV2l0aCBubyBhcmd1bWVudHMgdGhlIHJlYWRvbmx5IGNvbW1hbmQgbGlzdHMgdGhlIG5hbWVzIG9mIGFsbCByZWFkIG9ubHkKK3ZhcmlhYmxlcy4KK1dpdGggdGhlCisuRmwgcAorb3B0aW9uIHNwZWNpZmllZCB0aGUgb3V0cHV0IHdpbGwgYmUgZm9ybWF0dGVkIHN1aXRhYmx5IGZvciBub24taW50ZXJhY3RpdmUgdXNlLgorLlBwCisuSXQgWG8gcHJpbnRmIEFyIGZvcm1hdAorLk9wIEFyIGFyZ3VtZW50cyAgLi4uCisuWGMKKy5JYyBwcmludGYKK2Zvcm1hdHMgYW5kIHByaW50cyBpdHMgYXJndW1lbnRzLCBhZnRlciB0aGUgZmlyc3QsIHVuZGVyIGNvbnRyb2wKK29mIHRoZQorLkFyIGZvcm1hdCAgLgorVGhlCisuQXIgZm9ybWF0CitpcyBhIGNoYXJhY3RlciBzdHJpbmcgd2hpY2ggY29udGFpbnMgdGhyZWUgdHlwZXMgb2Ygb2JqZWN0czogcGxhaW4gY2hhcmFjdGVycywKK3doaWNoIGFyZSBzaW1wbHkgY29waWVkIHRvIHN0YW5kYXJkIG91dHB1dCwgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgd2hpY2gKK2FyZSBjb252ZXJ0ZWQgYW5kIGNvcGllZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb25zLAorZWFjaCBvZiB3aGljaCBjYXVzZXMgcHJpbnRpbmcgb2YgdGhlIG5leHQgc3VjY2Vzc2l2ZQorLkFyIGFyZ3VtZW50ICAuCisuUHAKK1RoZQorLkFyIGFyZ3VtZW50cworYWZ0ZXIgdGhlIGZpcnN0IGFyZSB0cmVhdGVkIGFzIHN0cmluZ3MgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWF0IGlzCitlaXRoZXIKKy5DbSBiICwKKy5DbSBjCitvcgorLkNtIHMgOworb3RoZXJ3aXNlIGl0IGlzIGV2YWx1YXRlZCBhcyBhIEMgY29uc3RhbnQsIHdpdGggdGhlIGZvbGxvd2luZyBleHRlbnNpb25zOgorLlBwCisuQmwgLWJ1bGxldCAtb2Zmc2V0IGluZGVudCAtY29tcGFjdAorLkl0CitBIGxlYWRpbmcgcGx1cyBvciBtaW51cyBzaWduIGlzIGFsbG93ZWQuCisuSXQKK0lmIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBpcyBhIHNpbmdsZSBvciBkb3VibGUgcXVvdGUsIHRoZSB2YWx1ZSBpcyB0aGUKKy5UbiBBU0NJSQorY29kZSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIuCisuRWwKKy5QcAorVGhlIGZvcm1hdCBzdHJpbmcgaXMgcmV1c2VkIGFzIG9mdGVuIGFzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IHRoZQorLkFyIGFyZ3VtZW50cyAgLgorQW55IGV4dHJhIGZvcm1hdCBzcGVjaWZpY2F0aW9ucyBhcmUgZXZhbHVhdGVkIHdpdGggemVybyBvciB0aGUgbnVsbAorc3RyaW5nLgorLlBwCitDaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyBhcmUgaW4gYmFja3NsYXNoIG5vdGF0aW9uIGFzIGRlZmluZWQgaW4KKy5TdCAtYW5zaUMgLgorVGhlIGNoYXJhY3RlcnMgYW5kIHRoZWlyIG1lYW5pbmdzIGFyZSBhcyBmb2xsb3dzOgorLkJsIC10YWcgLXdpZHRoIERzIC1vZmZzZXQgaW5kZW50CisuSXQgQ20gXGVhCitXcml0ZSBhIFwqW0x0XWJlbGxcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlYgorV3JpdGUgYSBcKltMdF1iYWNrc3BhY2VcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlZgorV3JpdGUgYSBcKltMdF1mb3JtLWZlZWRcKltHdF0gY2hhcmFjdGVyLgorLkl0IENtIFxlbgorV3JpdGUgYSBcKltMdF1uZXctbGluZVwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVyCitXcml0ZSBhIFwqW0x0XWNhcnJpYWdlIHJldHVyblwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGV0CitXcml0ZSBhIFwqW0x0XXRhYlwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGV2CitXcml0ZSBhIFwqW0x0XXZlcnRpY2FsIHRhYlwqW0d0XSBjaGFyYWN0ZXIuCisuSXQgQ20gXGVcZQorV3JpdGUgYSBiYWNrc2xhc2ggY2hhcmFjdGVyLgorLkl0IENtIFxlIE5zIEFyIG51bQorV3JpdGUgYW4gOFwtYml0IGNoYXJhY3RlciB3aG9zZQorLlRuIEFTQ0lJCit2YWx1ZSBpcyB0aGUgMVwtLCAyXC0sIG9yIDNcLWRpZ2l0CitvY3RhbCBudW1iZXIKKy5BciBudW0gLgorLkVsCisuUHAKK0VhY2ggZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgaW50cm9kdWNlZCBieSB0aGUgcGVyY2VudCBjaGFyYWN0ZXIKKyhgYCUnJykuCitUaGUgcmVtYWluZGVyIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcywKK2luIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCAiWmVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6IgorLkJsIC10YWcgLXdpZHRoIERzCisuSXQgQ20gIworQSBgIycgY2hhcmFjdGVyCitzcGVjaWZ5aW5nIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSBwcmludGVkIGluIGFuIGBgYWx0ZXJuYXRpdmUgZm9ybScnLgorRm9yCisuQ20gYiAsCisuQ20gYyAsCisuQ20gZCAsCithbmQKKy5DbSBzCitmb3JtYXRzLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LgorRm9yIHRoZQorLkNtIG8KK2Zvcm1hdCB0aGUgcHJlY2lzaW9uIG9mIHRoZSBudW1iZXIgaXMgaW5jcmVhc2VkIHRvIGZvcmNlIHRoZSBmaXJzdAorY2hhcmFjdGVyIG9mIHRoZSBvdXRwdXQgc3RyaW5nIHRvIGEgemVyby4KK0ZvciB0aGUKKy5DbSB4CisuUHEgQ20gWAorZm9ybWF0LCBhIG5vbi16ZXJvIHJlc3VsdCBoYXMgdGhlIHN0cmluZworLkxpIDB4CisuUHEgTGkgMFgKK3ByZXBlbmRlZCB0byBpdC4KK0ZvcgorLkNtIGUgICwKKy5DbSBFICwKKy5DbSBmICAsCisuQ20gZyAsCithbmQKKy5DbSBHCitmb3JtYXRzLCB0aGUgcmVzdWx0IHdpbGwgYWx3YXlzIGNvbnRhaW4gYSBkZWNpbWFsIHBvaW50LCBldmVuIGlmIG5vCitkaWdpdHMgZm9sbG93IHRoZSBwb2ludCAobm9ybWFsbHksIGEgZGVjaW1hbCBwb2ludCBvbmx5IGFwcGVhcnMgaW4gdGhlCityZXN1bHRzIG9mIHRob3NlIGZvcm1hdHMgaWYgYSBkaWdpdCBmb2xsb3dzIHRoZSBkZWNpbWFsIHBvaW50KS4KK0ZvcgorLkNtIGcKK2FuZAorLkNtIEcKK2Zvcm1hdHMsIHRyYWlsaW5nIHplcm9zIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSByZXN1bHQgYXMgdGhleQord291bGQgb3RoZXJ3aXNlIGJlLgorLkl0IENtIFwmXC0KK0EgbWludXMgc2lnbiBgXC0nIHdoaWNoIHNwZWNpZmllcworLkVtIGxlZnQgYWRqdXN0bWVudAorb2YgdGhlIG91dHB1dCBpbiB0aGUgaW5kaWNhdGVkIGZpZWxkOworLkl0IENtIFwmKworQSBgKycgY2hhcmFjdGVyIHNwZWNpZnlpbmcgdGhhdCB0aGVyZSBzaG91bGQgYWx3YXlzIGJlCithIHNpZ24gcGxhY2VkIGJlZm9yZSB0aGUgbnVtYmVyIHdoZW4gdXNpbmcgc2lnbmVkIGZvcm1hdHMuCisuSXQgU3EgXCZcIFwmCitBIHNwYWNlIHNwZWNpZnlpbmcgdGhhdCBhIGJsYW5rIHNob3VsZCBiZSBsZWZ0IGJlZm9yZSBhIHBvc2l0aXZlIG51bWJlcgorZm9yIGEgc2lnbmVkIGZvcm1hdC4KK0EgYCsnIG92ZXJyaWRlcyBhIHNwYWNlIGlmIGJvdGggYXJlIHVzZWQ7CisuSXQgQ20gXCYwCitBIHplcm8gYDAnIGNoYXJhY3RlciBpbmRpY2F0aW5nIHRoYXQgemVyby1wYWRkaW5nIHNob3VsZCBiZSB1c2VkCityYXRoZXIgdGhhbiBibGFuay1wYWRkaW5nLgorQSBgXC0nIG92ZXJyaWRlcyBhIGAwJyBpZiBib3RoIGFyZSB1c2VkOworLkVsCisuSXQgIkZpZWxkIFdpZHRoOiIKK0FuIG9wdGlvbmFsIGRpZ2l0IHN0cmluZyBzcGVjaWZ5aW5nIGEKKy5FbSBmaWVsZCB3aWR0aCA7CitpZiB0aGUgb3V0cHV0IHN0cmluZyBoYXMgZmV3ZXIgY2hhcmFjdGVycyB0aGFuIHRoZSBmaWVsZCB3aWR0aCBpdCB3aWxsCitiZSBibGFuay1wYWRkZWQgb24gdGhlIGxlZnQgKG9yIHJpZ2h0LCBpZiB0aGUgbGVmdC1hZGp1c3RtZW50IGluZGljYXRvcgoraGFzIGJlZW4gZ2l2ZW4pIHRvIG1ha2UgdXAgdGhlIGZpZWxkIHdpZHRoIChub3RlIHRoYXQgYSBsZWFkaW5nIHplcm8KK2lzIGEgZmxhZywgYnV0IGFuIGVtYmVkZGVkIHplcm8gaXMgcGFydCBvZiBhIGZpZWxkIHdpZHRoKTsKKy5JdCBQcmVjaXNpb24gOgorQW4gb3B0aW9uYWwgcGVyaW9kLAorLlNxIENtIFwmLlwmICwKK2ZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGRpZ2l0IHN0cmluZyBnaXZpbmcgYQorLkVtIHByZWNpc2lvbgord2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIGFwcGVhciBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCwKK2ZvcgorLkNtIGUKK2FuZAorLkNtIGYKK2Zvcm1hdHMsIG9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHByaW50ZWQKK2Zyb20gYSBzdHJpbmcKKy5TbSBvZmYKKy5QZiAoIENtIGIKKy5TbSBvbgorYW5kCisuQ20gcworZm9ybWF0cyk7IGlmIHRoZSBkaWdpdCBzdHJpbmcgaXMgbWlzc2luZywgdGhlIHByZWNpc2lvbiBpcyB0cmVhdGVkCithcyB6ZXJvOworLkl0IEZvcm1hdCA6CitBIGNoYXJhY3RlciB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZm9ybWF0IHRvIHVzZSAob25lIG9mCisuQ20gZGlvdXhYZndFZ0diY3MgKSAuCisuRWwKKy5QcAorQSBmaWVsZCB3aWR0aCBvciBwcmVjaXNpb24gbWF5IGJlCisuU3EgQ20gXCYqCitpbnN0ZWFkIG9mIGEgZGlnaXQgc3RyaW5nLgorSW4gdGhpcyBjYXNlIGFuCisuQXIgYXJndW1lbnQKK3N1cHBsaWVzIHRoZSBmaWVsZCB3aWR0aCBvciBwcmVjaXNpb24uCisuUHAKK1RoZSBmb3JtYXQgY2hhcmFjdGVycyBhbmQgdGhlaXIgbWVhbmluZ3MgYXJlOgorLkJsIC10YWcgLXdpZHRoIEZsCisuSXQgQ20gZGlvdVh4CitUaGUKKy5BciBhcmd1bWVudAoraXMgcHJpbnRlZCBhcyBhIHNpZ25lZCBkZWNpbWFsIChkIG9yIGkpLCB1bnNpZ25lZCBvY3RhbCwgdW5zaWduZWQgZGVjaW1hbCwKK29yIHVuc2lnbmVkIGhleGFkZWNpbWFsIChYIG9yIHgpLCByZXNwZWN0aXZlbHkuCisuSXQgQ20gZgorVGhlCisuQXIgYXJndW1lbnQKK2lzIHByaW50ZWQgaW4gdGhlIHN0eWxlCisuU20gb2ZmCisuUGYgW1wtXWRkZCBDbSBcJi4gTm8gZGRkCisuU20gb24KK3doZXJlIHRoZSBudW1iZXIgb2YgZCdzCithZnRlciB0aGUgZGVjaW1hbCBwb2ludCBpcyBlcXVhbCB0byB0aGUgcHJlY2lzaW9uIHNwZWNpZmljYXRpb24gZm9yCit0aGUgYXJndW1lbnQuCitJZiB0aGUgcHJlY2lzaW9uIGlzIG1pc3NpbmcsIDYgZGlnaXRzIGFyZSBnaXZlbjsgaWYgdGhlIHByZWNpc2lvbgoraXMgZXhwbGljaXRseSAwLCBubyBkaWdpdHMgYW5kIG5vIGRlY2ltYWwgcG9pbnQgYXJlIHByaW50ZWQuCisuSXQgQ20gZUUKK1RoZQorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkIGluIHRoZSBzdHlsZQorLlNtIG9mZgorLlBmIFtcLV1kIENtIFwmLiBObyBkZGQgQ20gZSBObyBcXCooUG1kZAorLlNtIG9uCit3aGVyZSB0aGVyZQoraXMgb25lIGRpZ2l0IGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludCBhbmQgdGhlIG51bWJlciBhZnRlciBpcyBlcXVhbCB0bwordGhlIHByZWNpc2lvbiBzcGVjaWZpY2F0aW9uIGZvciB0aGUgYXJndW1lbnQ7IHdoZW4gdGhlIHByZWNpc2lvbiBpcworbWlzc2luZywgNiBkaWdpdHMgYXJlIHByb2R1Y2VkLgorQW4gdXBwZXItY2FzZSBFIGlzIHVzZWQgZm9yIGFuIGBFJyBmb3JtYXQuCisuSXQgQ20gZ0cKK1RoZQorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkIGluIHN0eWxlCisuQ20gZgorb3IgaW4gc3R5bGUKKy5DbSBlCisuUHEgQ20gRQord2hpY2hldmVyIGdpdmVzIGZ1bGwgcHJlY2lzaW9uIGluIG1pbmltdW0gc3BhY2UuCisuSXQgQ20gYgorQ2hhcmFjdGVycyBmcm9tIHRoZSBzdHJpbmcKKy5BciBhcmd1bWVudAorYXJlIHByaW50ZWQgd2l0aCBiYWNrc2xhc2gtZXNjYXBlIHNlcXVlbmNlcyBleHBhbmRlZC4KKy5icgorVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGJhY2tzbGFzaC1lc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQ6CisuQmwgLXRhZyAtd2lkdGggRHMKKy5JdCBDbSBcZWMKK0NhdXNlcworLk5tCit0byBpZ25vcmUgYW55IHJlbWFpbmluZyBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgb3BlcmFuZCBjb250YWluaW5nIGl0LAorYW55IHJlbWFpbmluZyBzdHJpbmcgb3BlcmFuZHMsIGFuZCBhbnkgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGluCit0aGUgZm9ybWF0IG9wZXJhbmQuCisuSXQgQ20gXGUwIE5zIEFyIG51bQorV3JpdGUgYW4gOFwtYml0IGNoYXJhY3RlciB3aG9zZQorLlRuIEFTQ0lJCit2YWx1ZSBpcyB0aGUgMVwtLCAyXC0sIG9yIDNcLWRpZ2l0CitvY3RhbCBudW1iZXIKKy5BciBudW0gLgorLkVsCisuSXQgQ20gYworVGhlIGZpcnN0IGNoYXJhY3RlciBvZgorLkFyIGFyZ3VtZW50CitpcyBwcmludGVkLgorLkl0IENtIHMKK0NoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nCisuQXIgYXJndW1lbnQKK2FyZSBwcmludGVkIHVudGlsIHRoZSBlbmQgaXMgcmVhY2hlZCBvciB1bnRpbCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKK2luZGljYXRlZCBieSB0aGUgcHJlY2lzaW9uIHNwZWNpZmljYXRpb24gaXMgcmVhY2hlZDsgaWYgdGhlCitwcmVjaXNpb24gaXMgb21pdHRlZCwgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgcHJpbnRlZC4KKy5JdCBDbSBcJiUKK1ByaW50IGEgYCUnOyBubyBhcmd1bWVudCBpcyB1c2VkLgorLkVsCisuUHAKK0luIG5vIGNhc2UgZG9lcyBhIG5vbi1leGlzdGVudCBvciBzbWFsbCBmaWVsZCB3aWR0aCBjYXVzZSB0cnVuY2F0aW9uIG9mCithIGZpZWxkOyBwYWRkaW5nIHRha2VzIHBsYWNlIG9ubHkgaWYgdGhlIHNwZWNpZmllZCBmaWVsZCB3aWR0aCBleGNlZWRzCit0aGUgYWN0dWFsIHdpZHRoLgorLkl0IFhvIHNldAorLk9vIHsKKy5GbCBvcHRpb25zIHwgQ20gK29wdGlvbnMgfCBDbSAtLSB9CisuT2MgQXIgYXJnIC4uLgorLlhjCitUaGUKKy5JYyBzZXQKK2NvbW1hbmQgcGVyZm9ybXMgdGhyZWUgZGlmZmVyZW50IGZ1bmN0aW9ucy4KKy5QcAorV2l0aCBubyBhcmd1bWVudHMsIGl0IGxpc3RzIHRoZSB2YWx1ZXMgb2YgYWxsIHNoZWxsIHZhcmlhYmxlcy4KKy5QcAorSWYgb3B0aW9ucyBhcmUgZ2l2ZW4sIGl0IHNldHMgdGhlIHNwZWNpZmllZCBvcHRpb24KK2ZsYWdzLCBvciBjbGVhcnMgdGhlbSBhcyBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gY2FsbGVkCisuU3ggQXJndW1lbnQgTGlzdCBQcm9jZXNzaW5nIC4KKy5QcAorVGhlIHRoaXJkIHVzZSBvZiB0aGUgc2V0IGNvbW1hbmQgaXMgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHNoZWxsJ3MKK3Bvc2l0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgc3BlY2lmaWVkIGFyZ3MuCitUbyBjaGFuZ2UgdGhlIHBvc2l0aW9uYWwKK3BhcmFtZXRlcnMgd2l0aG91dCBjaGFuZ2luZyBhbnkgb3B0aW9ucywgdXNlCisuRHEgLS0KK2FzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXQuCitJZiBubyBhcmdzIGFyZSBwcmVzZW50LCB0aGUgc2V0IGNvbW1hbmQKK3dpbGwgY2xlYXIgYWxsIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKGVxdWl2YWxlbnQgdG8gZXhlY3V0aW5nCisuRHEgc2hpZnQgJCMgLiApCisuSXQgc2hpZnQgT3AgQXIgbgorU2hpZnQgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBuIHRpbWVzLgorQQorLkljIHNoaWZ0CitzZXRzIHRoZSB2YWx1ZSBvZgorLlZhICQxCit0byB0aGUgdmFsdWUgb2YKKy5WYSAkMiAsCit0aGUgdmFsdWUgb2YKKy5WYSAkMgordG8gdGhlIHZhbHVlIG9mCisuVmEgJDMgLAorYW5kIHNvIG9uLCBkZWNyZWFzaW5nCit0aGUgdmFsdWUgb2YKKy5WYSAkIworYnkgb25lLgorSWYgbiBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsCisuSWMgc2hpZnQKK3dpbGwgaXNzdWUgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIGV4aXQgd2l0aCByZXR1cm4gc3RhdHVzIDIuCisuSXQgdGVzdCBBciBleHByZXNzaW9uCisuSXQgXCZbIEFyIGV4cHJlc3Npb24gQ20gXQorVGhlCisuSWMgdGVzdAordXRpbGl0eSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBldmFsdWF0ZXMKK3RvIHRydWUsIHJldHVybnMgYSB6ZXJvICh0cnVlKSBleGl0IHN0YXR1czsgb3RoZXJ3aXNlCitpdCByZXR1cm5zIDEgKGZhbHNlKS4KK0lmIHRoZXJlIGlzIG5vIGV4cHJlc3Npb24sIHRlc3QgYWxzbworcmV0dXJucyAxIChmYWxzZSkuCisuUHAKK0FsbCBvcGVyYXRvcnMgYW5kIGZsYWdzIGFyZSBzZXBhcmF0ZSBhcmd1bWVudHMgdG8gdGhlCisuSWMgdGVzdAordXRpbGl0eS4KKy5QcAorVGhlIGZvbGxvd2luZyBwcmltYXJpZXMgYXJlIHVzZWQgdG8gY29uc3RydWN0IGV4cHJlc3Npb246CisuQmwgLXRhZyAtd2lkdGggQXIKKy5JdCBGbCBiIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgYmxvY2sgc3BlY2lhbAorZmlsZS4KKy5JdCBGbCBjIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgY2hhcmFjdGVyCitzcGVjaWFsIGZpbGUuCisuSXQgRmwgZCBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeS4KKy5JdCBGbCBlIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgKHJlZ2FyZGxlc3Mgb2YgdHlwZSkuCisuSXQgRmwgZiBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZS4KKy5JdCBGbCBnIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBzZXQgZ3JvdXAgSUQgZmxhZworaXMgc2V0LgorLkl0IEZsIGggQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgYSBzeW1ib2xpYyBsaW5rLgorLkl0IEZsIGsgQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXRzIHN0aWNreSBiaXQgaXMgc2V0LgorLkl0IEZsIG4gQXIgc3RyaW5nCitUcnVlIGlmIHRoZSBsZW5ndGggb2YKKy5BciBzdHJpbmcKK2lzIG5vbnplcm8uCisuSXQgRmwgcCBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQoraXMgYSBuYW1lZCBwaXBlCisuUG8gVG4gRklGTyBQYyAuCisuSXQgRmwgciBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyByZWFkYWJsZS4KKy5JdCBGbCBzIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGhhcyBhIHNpemUgZ3JlYXRlcgordGhhbiB6ZXJvLgorLkl0IEZsIHQgQXIgZmlsZV9kZXNjcmlwdG9yCitUcnVlIGlmIHRoZSBmaWxlIHdob3NlIGZpbGUgZGVzY3JpcHRvciBudW1iZXIKK2lzCisuQXIgZmlsZV9kZXNjcmlwdG9yCitpcyBvcGVuIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0ZXJtaW5hbC4KKy5JdCBGbCB1IEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBzZXQgdXNlciBJRCBmbGFnCitpcyBzZXQuCisuSXQgRmwgdyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpcyB3cml0YWJsZS4KK1RydWUKK2luZGljYXRlcyBvbmx5IHRoYXQgdGhlIHdyaXRlIGZsYWcgaXMgb24uCitUaGUgZmlsZSBpcyBub3Qgd3JpdGFibGUgb24gYSByZWFkLW9ubHkgZmlsZQorc3lzdGVtIGV2ZW4gaWYgdGhpcyB0ZXN0IGluZGljYXRlcyB0cnVlLgorLkl0IEZsIHggQXIgZmlsZQorVHJ1ZSBpZgorLkFyIGZpbGUKK2V4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZS4KK1RydWUKK2luZGljYXRlcyBvbmx5IHRoYXQgdGhlIGV4ZWN1dGUgZmxhZyBpcyBvbi4KK0lmCisuQXIgZmlsZQoraXMgYSBkaXJlY3RvcnksIHRydWUgaW5kaWNhdGVzIHRoYXQKKy5BciBmaWxlCitjYW4gYmUgc2VhcmNoZWQuCisuSXQgRmwgeiBBciBzdHJpbmcKK1RydWUgaWYgdGhlIGxlbmd0aCBvZgorLkFyIHN0cmluZworaXMgemVyby4KKy5JdCBGbCBMIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgc3ltYm9saWMgbGluay4KK1RoaXMgb3BlcmF0b3IgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZgordGhpcyBwcm9ncmFtLgorRG8gbm90IHJlbHkgb24gaXRzIGV4aXN0ZW5jZTsgdXNlCisuRmwgaAoraW5zdGVhZC4KKy5JdCBGbCBPIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGl0cyBvd25lciBtYXRjaGVzIHRoZSBlZmZlY3RpdmUgdXNlciBpZCBvZiB0aGlzIHByb2Nlc3MuCisuSXQgRmwgRyBBciBmaWxlCitUcnVlIGlmCisuQXIgZmlsZQorZXhpc3RzIGFuZCBpdHMgZ3JvdXAgbWF0Y2hlcyB0aGUgZWZmZWN0aXZlIGdyb3VwIGlkIG9mIHRoaXMgcHJvY2Vzcy4KKy5JdCBGbCBTIEFyIGZpbGUKK1RydWUgaWYKKy5BciBmaWxlCitleGlzdHMgYW5kIGlzIGEgc29ja2V0LgorLkl0IEFyIGZpbGUxIEZsIG50IEFyIGZpbGUyCitUcnVlIGlmCisuQXIgZmlsZTEKK2V4aXN0cyBhbmQgaXMgbmV3ZXIgdGhhbgorLkFyIGZpbGUyIC4KKy5JdCBBciBmaWxlMSBGbCBvdCBBciBmaWxlMgorVHJ1ZSBpZgorLkFyIGZpbGUxCitleGlzdHMgYW5kIGlzIG9sZGVyIHRoYW4KKy5BciBmaWxlMiAuCisuSXQgQXIgZmlsZTEgRmwgZWYgQXIgZmlsZTIKK1RydWUgaWYKKy5BciBmaWxlMQorYW5kCisuQXIgZmlsZTIKK2V4aXN0IGFuZCByZWZlciB0byB0aGUgc2FtZSBmaWxlLgorLkl0IEFyIHN0cmluZworVHJ1ZSBpZgorLkFyIHN0cmluZworaXMgbm90IHRoZSBudWxsCitzdHJpbmcuCisuSXQgQXIgXCZzXCYxIENtIFwmPSBBciBcJnNcJjIKK1RydWUgaWYgdGhlIHN0cmluZ3MKKy5BciBcJnNcJjEKK2FuZAorLkFyIFwmc1wmMgorYXJlIGlkZW50aWNhbC4KKy5JdCBBciBcJnNcJjEgQ20gXCYhPSBBciBcJnNcJjIKK1RydWUgaWYgdGhlIHN0cmluZ3MKKy5BciBcJnNcJjEKK2FuZAorLkFyIFwmc1wmMgorYXJlIG5vdCBpZGVudGljYWwuCisuSXQgQXIgXCZzXCYxIENtIFwmXCpbTHRdIEFyIFwmc1wmMgorVHJ1ZSBpZiBzdHJpbmcKKy5BciBcJnNcJjEKK2NvbWVzIGJlZm9yZQorLkFyIFwmc1wmMgorYmFzZWQgb24gdGhlIEFTQ0lJIHZhbHVlIG9mIHRoZWlyIGNoYXJhY3RlcnMuCisuSXQgQXIgXCZzXCYxIENtIFwmXCpbR3RdIEFyIFwmc1wmMgorVHJ1ZSBpZiBzdHJpbmcKKy5BciBcJnNcJjEKK2NvbWVzIGFmdGVyCisuQXIgXCZzXCYyCitiYXNlZCBvbiB0aGUgQVNDSUkgdmFsdWUgb2YgdGhlaXIgY2hhcmFjdGVycy4KKy5JdCBBciBcJm5cJjEgRmwgXCZlcSBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXJzCisuQXIgXCZuXCYxCithbmQKKy5BciBcJm5cJjIKK2FyZSBhbGdlYnJhaWNhbGx5CitlcXVhbC4KKy5JdCBBciBcJm5cJjEgRmwgXCZuZSBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXJzCisuQXIgXCZuXCYxCithbmQKKy5BciBcJm5cJjIKK2FyZSBub3QKK2FsZ2VicmFpY2FsbHkgZXF1YWwuCisuSXQgQXIgXCZuXCYxIEZsIFwmZ3QgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYxCitpcyBhbGdlYnJhaWNhbGx5CitncmVhdGVyIHRoYW4gdGhlIGludGVnZXIKKy5BciBcJm5cJjIgLgorLkl0IEFyIFwmblwmMSBGbCBcJmdlIEFyIFwmblwmMgorVHJ1ZSBpZiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMQoraXMgYWxnZWJyYWljYWxseQorZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYyIC4KKy5JdCBBciBcJm5cJjEgRmwgXCZsdCBBciBcJm5cJjIKK1RydWUgaWYgdGhlIGludGVnZXIKKy5BciBcJm5cJjEKK2lzIGFsZ2VicmFpY2FsbHkgbGVzcwordGhhbiB0aGUgaW50ZWdlcgorLkFyIFwmblwmMiAuCisuSXQgQXIgXCZuXCYxIEZsIFwmbGUgQXIgXCZuXCYyCitUcnVlIGlmIHRoZSBpbnRlZ2VyCisuQXIgXCZuXCYxCitpcyBhbGdlYnJhaWNhbGx5IGxlc3MKK3RoYW4gb3IgZXF1YWwgdG8gdGhlIGludGVnZXIKKy5BciBcJm5cJjIgLgorLkVsCisuUHAKK1RoZXNlIHByaW1hcmllcyBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgZm9sbG93aW5nIG9wZXJhdG9yczoKKy5CbCAtdGFnIC13aWR0aCBBcgorLkl0IENtIFwmISBBciBleHByZXNzaW9uCitUcnVlIGlmCisuQXIgZXhwcmVzc2lvbgoraXMgZmFsc2UuCisuSXQgQXIgZXhwcmVzc2lvbjEgRmwgYSBBciBleHByZXNzaW9uMgorVHJ1ZSBpZiBib3RoCisuQXIgZXhwcmVzc2lvbjEKK2FuZAorLkFyIGV4cHJlc3Npb24yCithcmUgdHJ1ZS4KKy5JdCBBciBleHByZXNzaW9uMSBGbCBvIEFyIGV4cHJlc3Npb24yCitUcnVlIGlmIGVpdGhlcgorLkFyIGV4cHJlc3Npb24xCitvcgorLkFyIGV4cHJlc3Npb24yCithcmUgdHJ1ZS4KKy5JdCBDbSBcJiggTnMgQXIgZXhwcmVzc2lvbiBOcyBDbSBcJikKK1RydWUgaWYgZXhwcmVzc2lvbiBpcyB0cnVlLgorLkVsCisuUHAKK1RoZQorLkZsIGEKK29wZXJhdG9yIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHRoZQorLkZsIG8KK29wZXJhdG9yLgorLkl0IHRpbWVzCitQcmludCB0aGUgYWNjdW11bGF0ZWQgdXNlciBhbmQgc3lzdGVtIHRpbWVzIGZvciB0aGUgc2hlbGwgYW5kIGZvciBwcm9jZXNzZXMKK3J1biBmcm9tIHRoZSBzaGVsbC4gIFRoZSByZXR1cm4gc3RhdHVzIGlzIDAuCisuSXQgWG8gdHJhcAorLk9wIEFyIGFjdGlvbiBBciBzaWduYWwgLi4uCisuWGMKK0NhdXNlIHRoZSBzaGVsbCB0byBwYXJzZSBhbmQgZXhlY3V0ZSBhY3Rpb24gd2hlbiBhbnkgb2YgdGhlIHNwZWNpZmllZAorc2lnbmFscyBhcmUgcmVjZWl2ZWQuCitUaGUgc2lnbmFscyBhcmUgc3BlY2lmaWVkIGJ5IHNpZ25hbCBudW1iZXIgb3IgYXMgdGhlIG5hbWUgb2YgdGhlIHNpZ25hbC4KK0lmCisuQXIgc2lnbmFsCitpcworLkxpIDAgLAordGhlIGFjdGlvbiBpcyBleGVjdXRlZCB3aGVuIHRoZSBzaGVsbCBleGl0cy4KKy5BciBhY3Rpb24KK21heSBiZSBudWxsLCB3aGljaCBjYXVzZSB0aGUgc3BlY2lmaWVkIHNpZ25hbHMgdG8gYmUgaWdub3JlZC4KK1dpdGgKKy5BciBhY3Rpb24KK29taXR0ZWQgb3Igc2V0IHRvIGAtJyB0aGUgc3BlY2lmaWVkIHNpZ25hbHMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IGFjdGlvbi4KK1doZW4gdGhlIHNoZWxsIGZvcmtzIG9mZiBhIHN1YnNoZWxsLCBpdCByZXNldHMgdHJhcHBlZCAoYnV0IG5vdCBpZ25vcmVkKQorc2lnbmFscyB0byB0aGUgZGVmYXVsdCBhY3Rpb24uCitUaGUKKy5JYyB0cmFwCitjb21tYW5kIGhhcyBubyBlZmZlY3Qgb24gc2lnbmFscyB0aGF0IHdlcmUKK2lnbm9yZWQgb24gZW50cnkgdG8gdGhlIHNoZWxsLgorLkljIHRyYXAKK3dpdGhvdXQgYW55IGFyZ3VtZW50cyBjYXVzZSBpdCB0byB3cml0ZSBhIGxpc3Qgb2Ygc2lnbmFscyBhbmQgdGhlaXIKK2Fzc29jaWF0ZWQgYWN0aW9uIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgaW4gYSBmb3JtYXQgdGhhdCBpcyBzdWl0YWJsZQorYXMgYW4gaW5wdXQgdG8gdGhlIHNoZWxsIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdHJhcHBpbmcgcmVzdWx0cy4KKy5QcAorRXhhbXBsZXM6CisuUHAKKy5EbCB0cmFwCisuUHAKK0xpc3QgdHJhcHBlZCBzaWduYWxzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGFjdGlvbgorLlBwCisuRGwgdHJhcCAnJyBJTlQgUVVJVCB0c3RwIDMwCisuUHAKK0lnbm9yZSBzaWduYWxzIElOVCBRVUlUIFRTVFAgVVNSMQorLlBwCisuRGwgdHJhcCBkYXRlIElOVAorLlBwCitQcmludCBkYXRlIHVwb24gcmVjZWl2aW5nIHNpZ25hbCBJTlQKKy5JdCB0eXBlIE9wIEFyIG5hbWUgLi4uCitJbnRlcnByZXQgZWFjaCBuYW1lIGFzIGEgY29tbWFuZCBhbmQgcHJpbnQgdGhlIHJlc29sdXRpb24gb2YgdGhlIGNvbW1hbmQKK3NlYXJjaC4KK1Bvc3NpYmxlIHJlc29sdXRpb25zIGFyZToKK3NoZWxsIGtleXdvcmQsIGFsaWFzLCBzaGVsbCBidWlsdGluLAorY29tbWFuZCwgdHJhY2tlZCBhbGlhcyBhbmQgbm90IGZvdW5kLgorRm9yIGFsaWFzZXMgdGhlIGFsaWFzIGV4cGFuc2lvbiBpcworcHJpbnRlZDsgZm9yIGNvbW1hbmRzIGFuZCB0cmFja2VkIGFsaWFzZXMgdGhlIGNvbXBsZXRlIHBhdGhuYW1lIG9mIHRoZQorY29tbWFuZCBpcyBwcmludGVkLgorLkl0IHVsaW1pdCBYbworLk9wIEZsIEggXCooQmEgRmwgUworLk9wIEZsIGEgXCooQmEgRmwgdGZkc2NtbHBuIE9wIEFyIHZhbHVlCisuWGMKK0lucXVpcmUgYWJvdXQgb3Igc2V0IHRoZSBoYXJkIG9yIHNvZnQgbGltaXRzIG9uIHByb2Nlc3NlcyBvciBzZXQgbmV3CitsaW1pdHMuCitUaGUgY2hvaWNlIGJldHdlZW4gaGFyZCBsaW1pdCAod2hpY2ggbm8gcHJvY2VzcyBpcyBhbGxvd2VkIHRvCit2aW9sYXRlLCBhbmQgd2hpY2ggbWF5IG5vdCBiZSByYWlzZWQgb25jZSBpdCBoYXMgYmVlbiBsb3dlcmVkKSBhbmQgc29mdAorbGltaXQgKHdoaWNoIGNhdXNlcyBwcm9jZXNzZXMgdG8gYmUgc2lnbmFsZWQgYnV0IG5vdCBuZWNlc3NhcmlseSBraWxsZWQsCithbmQgd2hpY2ggbWF5IGJlIHJhaXNlZCkgaXMgbWFkZSB3aXRoIHRoZXNlIGZsYWdzOgorLkJsIC10YWcgLXdpZHRoIEZsCisuSXQgRmwgSAorc2V0IG9yIGlucXVpcmUgYWJvdXQgaGFyZCBsaW1pdHMKKy5JdCBGbCBTCitzZXQgb3IgaW5xdWlyZSBhYm91dCBzb2Z0IGxpbWl0cy4KK0lmIG5laXRoZXIKKy5GbCBICitub3IKKy5GbCBTCitpcyBzcGVjaWZpZWQsIHRoZSBzb2Z0IGxpbWl0IGlzIGRpc3BsYXllZCBvciBib3RoIGxpbWl0cyBhcmUgc2V0LgorSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgbGFzdCBvbmUgd2lucy4KKy5FbAorLlBwCisuQmwgLXRhZyAtd2lkdGggRmwKK1RoZSBsaW1pdCB0byBiZSBpbnRlcnJvZ2F0ZWQgb3Igc2V0LCB0aGVuLCBpcyBjaG9zZW4gYnkgc3BlY2lmeWluZworYW55IG9uZSBvZiB0aGVzZSBmbGFnczoKKy5JdCBGbCBhCitzaG93IGFsbCB0aGUgY3VycmVudCBsaW1pdHMKKy5JdCBGbCB0CitzaG93IG9yIHNldCB0aGUgbGltaXQgb24gQ1BVIHRpbWUgKGluIHNlY29uZHMpCisuSXQgRmwgZgorc2hvdyBvciBzZXQgdGhlIGxpbWl0IG9uIHRoZSBsYXJnZXN0IGZpbGUgdGhhdCBjYW4gYmUgY3JlYXRlZAorKGluIDUxMi1ieXRlIGJsb2NrcykKKy5JdCBGbCBkCitzaG93IG9yIHNldCB0aGUgbGltaXQgb24gdGhlIGRhdGEgc2VnbWVudCBzaXplIG9mIGEgcHJvY2VzcyAoaW4ga2lsb2J5dGVzKQorLkl0IEZsIHMKK3Nob3cgb3Igc2V0IHRoZSBsaW1pdCBvbiB0aGUgc3RhY2sgc2l6ZSBvZiBhIHByb2Nlc3MgKGluIGtpbG9ieXRlcykKKy5JdCBGbCBjCitzaG93IG9yIHNldCB0aGUgbGltaXQgb24gdGhlIGxhcmdlc3QgY29yZSBkdW1wIHNpemUgdGhhdCBjYW4gYmUgcHJvZHVjZWQKKyhpbiA1MTItYnl0ZSBibG9ja3MpCisuSXQgRmwgbQorc2hvdyBvciBzZXQgdGhlIGxpbWl0IG9uIHRoZSB0b3RhbCBwaHlzaWNhbCBtZW1vcnkgdGhhdCBjYW4gYmUKK2luIHVzZSBieSBhIHByb2Nlc3MgKGluIGtpbG9ieXRlcykKKy5JdCBGbCBsCitzaG93IG9yIHNldCB0aGUgbGltaXQgb24gaG93IG11Y2ggbWVtb3J5IGEgcHJvY2VzcyBjYW4gbG9jayB3aXRoCisuWHIgbWxvY2sgMgorKGluIGtpbG9ieXRlcykKKy5JdCBGbCBwCitzaG93IG9yIHNldCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgdGhpcyB1c2VyIGNhbgoraGF2ZSBhdCBvbmUgdGltZQorLkl0IEZsIG4KK3Nob3cgb3Igc2V0IHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIGZpbGVzIGEgcHJvY2VzcyBjYW4gaGF2ZSBvcGVuIGF0IG9uY2UKKy5FbAorLlBwCitJZiBub25lIG9mIHRoZXNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdGhlIGxpbWl0IG9uIGZpbGUgc2l6ZSB0aGF0IGlzIHNob3duCitvciBzZXQuCitJZiB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBsaW1pdCBpcyBzZXQgdG8gdGhhdCBudW1iZXI7IG90aGVyd2lzZQordGhlIGN1cnJlbnQgbGltaXQgaXMgZGlzcGxheWVkLgorLlBwCitMaW1pdHMgb2YgYW4gYXJiaXRyYXJ5IHByb2Nlc3MgY2FuIGJlIGRpc3BsYXllZCBvciBzZXQgdXNpbmcgdGhlCisuWHIgc3lzY3RsIDgKK3V0aWxpdHkuCisuUHAKKy5JdCB1bWFzayBPcCBBciBtYXNrCitTZXQgdGhlIHZhbHVlIG9mIHVtYXNrIChzZWUKKy5YciB1bWFzayAyICkKK3RvIHRoZSBzcGVjaWZpZWQgb2N0YWwgdmFsdWUuCitJZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIHVtYXNrIHZhbHVlIGlzIHByaW50ZWQuCisuSXQgdW5hbGlhcyBYbworLk9wIEZsIGEKKy5PcCBBciBuYW1lCisuWGMKK0lmCisuQXIgbmFtZQoraXMgc3BlY2lmaWVkLCB0aGUgc2hlbGwgcmVtb3ZlcyB0aGF0IGFsaWFzLgorSWYKKy5GbCBhCitpcyBzcGVjaWZpZWQsIGFsbCBhbGlhc2VzIGFyZSByZW1vdmVkLgorLkl0IHVuc2V0IFhvCisuT3AgRmwgZnYKKy5BciBuYW1lIC4uLgorLlhjCitUaGUgc3BlY2lmaWVkIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGFyZSB1bnNldCBhbmQgdW5leHBvcnRlZC4KK0lmCisuRmwgZgorb3IKKy5GbCB2CitpcyBzcGVjaWZpZWQsIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGlzIHVuc2V0LCByZXNwZWN0aXZlbHkuCitJZiBhIGdpdmVuIG5hbWUgY29ycmVzcG9uZHMgdG8gYm90aCBhIHZhcmlhYmxlIGFuZCBhIGZ1bmN0aW9uLCBhbmQgbm8KK29wdGlvbnMgYXJlIGdpdmVuLCBvbmx5IHRoZSB2YXJpYWJsZSBpcyB1bnNldC4KKy5JdCB3YWl0IE9wIEFyIGpvYgorV2FpdCBmb3IgdGhlIHNwZWNpZmllZCBqb2IgdG8gY29tcGxldGUgYW5kIHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlCitsYXN0IHByb2Nlc3MgaW4gdGhlIGpvYi4KK0lmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkLCB3YWl0IGZvciBhbGwgam9icyB0bworY29tcGxldGUgYW5kIHRoZSByZXR1cm4gYW4gZXhpdCBzdGF0dXMgb2YgemVyby4KKy5FbAorLlNzIENvbW1hbmQgTGluZSBFZGl0aW5nCitXaGVuCisuTm0KK2lzIGJlaW5nIHVzZWQgaW50ZXJhY3RpdmVseSBmcm9tIGEgdGVybWluYWwsIHRoZSBjdXJyZW50IGNvbW1hbmQKK2FuZCB0aGUgY29tbWFuZCBoaXN0b3J5IChzZWUKKy5JYyBmYworaW4KKy5TeCBCdWlsdGlucyApCitjYW4gYmUgZWRpdGVkIHVzaW5nIHZpLW1vZGUgY29tbWFuZC1saW5lIGVkaXRpbmcuCitUaGlzIG1vZGUgdXNlcyBjb21tYW5kcywgZGVzY3JpYmVkIGJlbG93LAorc2ltaWxhciB0byBhIHN1YnNldCBvZiB0aG9zZSBkZXNjcmliZWQgaW4gdGhlIHZpIG1hbiBwYWdlLgorVGhlIGNvbW1hbmQKKy5RbCBzZXQgLW8gdmkKK2VuYWJsZXMgdmktbW9kZSBlZGl0aW5nIGFuZCBwbGFjZSBzaCBpbnRvIHZpIGluc2VydCBtb2RlLgorV2l0aCB2aS1tb2RlCitlbmFibGVkLCBzaCBjYW4gYmUgc3dpdGNoZWQgYmV0d2VlbiBpbnNlcnQgbW9kZSBhbmQgY29tbWFuZCBtb2RlLgorVGhlIGVkaXRvciBpcyBub3QgZGVzY3JpYmVkIGluIGZ1bGwgaGVyZSwgYnV0IHdpbGwgYmUgaW4gYSBsYXRlciBkb2N1bWVudC4KK0l0J3Mgc2ltaWxhciB0byB2aTogdHlwaW5nCisuQXEgRVNDCit3aWxsIHRocm93IHlvdSBpbnRvIGNvbW1hbmQgVkkgY29tbWFuZCBtb2RlLgorSGl0dGluZworLkFxIHJldHVybgord2hpbGUgaW4gY29tbWFuZCBtb2RlIHdpbGwgcGFzcyB0aGUgbGluZSB0byB0aGUgc2hlbGwuCisuU2ggRVhJVCBTVEFUVVMKK0Vycm9ycyB0aGF0IGFyZSBkZXRlY3RlZCBieSB0aGUgc2hlbGwsIHN1Y2ggYXMgYSBzeW50YXggZXJyb3IsIHdpbGwgY2F1c2UgdGhlCitzaGVsbCB0byBleGl0IHdpdGggYSBub24temVybyBleGl0IHN0YXR1cy4KK0lmIHRoZSBzaGVsbCBpcyBub3QgYW4KK2ludGVyYWN0aXZlIHNoZWxsLCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzaGVsbCBmaWxlIHdpbGwgYmUgYWJvcnRlZC4KK090aGVyd2lzZQordGhlIHNoZWxsIHdpbGwgcmV0dXJuIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgbGFzdCBjb21tYW5kIGV4ZWN1dGVkLCBvcgoraWYgdGhlIGV4aXQgYnVpbHRpbiBpcyB1c2VkIHdpdGggYSBudW1lcmljIGFyZ3VtZW50LCBpdCB3aWxsIHJldHVybiB0aGUKK2FyZ3VtZW50LgorLlNoIEVOVklST05NRU5UCisuQmwgLXRhZyAtd2lkdGggTUFJTENIRUNLCisuSXQgRXYgSE9NRQorU2V0IGF1dG9tYXRpY2FsbHkgYnkKKy5YciBsb2dpbiAxCitmcm9tIHRoZSB1c2VyJ3MgbG9naW4gZGlyZWN0b3J5IGluIHRoZSBwYXNzd29yZCBmaWxlCisuUHEgWHIgcGFzc3dkIDQgLgorVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbHNvIGZ1bmN0aW9ucyBhcyB0aGUgZGVmYXVsdCBhcmd1bWVudCBmb3IgdGhlCitjZCBidWlsdGluLgorLkl0IEV2IFBBVEgKK1RoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGZvciBleGVjdXRhYmxlcy4KK1NlZSB0aGUgYWJvdmUgc2VjdGlvbgorLlN4IFBhdGggU2VhcmNoIC4KKy5JdCBFdiBDRFBBVEgKK1RoZSBzZWFyY2ggcGF0aCB1c2VkIHdpdGggdGhlIGNkIGJ1aWx0aW4uCisuSXQgRXYgTUFJTAorVGhlIG5hbWUgb2YgYSBtYWlsIGZpbGUsIHRoYXQgd2lsbCBiZSBjaGVja2VkIGZvciB0aGUgYXJyaXZhbCBvZiBuZXcgbWFpbC4KK092ZXJyaWRkZW4gYnkKKy5FdiBNQUlMUEFUSCAuCisuSXQgRXYgTUFJTENIRUNLCitUaGUgZnJlcXVlbmN5IGluIHNlY29uZHMgdGhhdCB0aGUgc2hlbGwgY2hlY2tzIGZvciB0aGUgYXJyaXZhbCBvZiBtYWlsCitpbiB0aGUgZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZQorLkV2IE1BSUxQQVRICitvciB0aGUKKy5FdiBNQUlMCitmaWxlLgorSWYgc2V0IHRvIDAsIHRoZSBjaGVjayB3aWxsIG9jY3VyIGF0IGVhY2ggcHJvbXB0LgorLkl0IEV2IE1BSUxQQVRICitBIGNvbG9uCisuRHEgXCY6CitzZXBhcmF0ZWQgbGlzdCBvZiBmaWxlIG5hbWVzLCBmb3IgdGhlIHNoZWxsIHRvIGNoZWNrIGZvciBpbmNvbWluZyBtYWlsLgorVGhpcyBlbnZpcm9ubWVudCBzZXR0aW5nIG92ZXJyaWRlcyB0aGUKKy5FdiBNQUlMCitzZXR0aW5nLgorVGhlcmUgaXMgYSBtYXhpbXVtIG9mIDEwIG1haWxib3hlcyB0aGF0IGNhbiBiZSBtb25pdG9yZWQgYXQgb25jZS4KKy5JdCBFdiBQUzEKK1RoZSBwcmltYXJ5IHByb21wdCBzdHJpbmcsIHdoaWNoIGRlZmF1bHRzIHRvCisuRHEgJCBcICAsCit1bmxlc3MgeW91IGFyZSB0aGUgc3VwZXJ1c2VyLCBpbiB3aGljaCBjYXNlIGl0IGRlZmF1bHRzIHRvCisuRHEgIyBcICAuCisuSXQgRXYgUFMyCitUaGUgc2Vjb25kYXJ5IHByb21wdCBzdHJpbmcsIHdoaWNoIGRlZmF1bHRzIHRvCisuRHEgXCpbR3RdIFwgIC4KKy5JdCBFdiBQUzQKK091dHB1dCBiZWZvcmUgZWFjaCBsaW5lIHdoZW4gZXhlY3V0aW9uIHRyYWNlIChzZXQgLXgpIGlzIGVuYWJsZWQsCitkZWZhdWx0cyB0bworLkRxICsgXCAgLgorLkl0IEV2IElGUworSW5wdXQgRmllbGQgU2VwYXJhdG9ycy4KK1RoaXMgaXMgbm9ybWFsbHkgc2V0IHRvCisuQXEgc3BhY2UgLAorLkFxIHRhYiAsCithbmQKKy5BcSBuZXdsaW5lIC4KK1NlZSB0aGUKKy5TeCBXaGl0ZSBTcGFjZSBTcGxpdHRpbmcKK3NlY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4KKy5JdCBFdiBURVJNCitUaGUgZGVmYXVsdCB0ZXJtaW5hbCBzZXR0aW5nIGZvciB0aGUgc2hlbGwuCitUaGlzIGlzIGluaGVyaXRlZCBieQorY2hpbGRyZW4gb2YgdGhlIHNoZWxsLCBhbmQgaXMgdXNlZCBpbiB0aGUgaGlzdG9yeSBlZGl0aW5nIG1vZGVzLgorLkl0IEV2IEhJU1RTSVpFCitUaGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBoaXN0b3J5IGJ1ZmZlciBmb3IgdGhlIHNoZWxsLgorLkl0IEV2IFBXRAorVGhlIGxvZ2ljYWwgdmFsdWUgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBUaGlzIGlzIHNldCBieSB0aGUKKy5JYyBjZAorY29tbWFuZC4KKy5JdCBFdiBPTERQV0QKK1RoZSBwcmV2aW91cyBsb2dpY2FsIHZhbHVlIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgVGhpcyBpcyBzZXQgYnkKK3RoZQorLkljIGNkCitjb21tYW5kLgorLkl0IEV2IFBQSUQKK1RoZSBwcm9jZXNzIElEIG9mIHRoZSBwYXJlbnQgcHJvY2VzcyBvZiB0aGUgc2hlbGwuCisuRWwKKy5TaCBGSUxFUworLkJsIC1pdGVtIC13aWR0aCBIT01FcHJvZmlsZXh4eHgKKy5JdAorLlBhICRIT01FLy5wcm9maWxlCisuSXQKKy5QYSAvZXRjL3Byb2ZpbGUKKy5FbAorLlNoIFNFRSBBTFNPCisuWHIgY3NoIDEgLAorLlhyIGVjaG8gMSAsCisuWHIgZ2V0b3B0IDEgLAorLlhyIGtzaCAxICwKKy5YciBsb2dpbiAxICwKKy5YciBwcmludGYgMSAsCisuWHIgdGVzdCAxICwKKy5YciBnZXRvcHQgMyAsCisuWHIgcGFzc3dkIDUgLAorLlwiIC5YciBwcm9maWxlIDQgLAorLlhyIGVudmlyb24gNyAsCisuWHIgc3lzY3RsIDgKKy5TaCBISVNUT1JZCitBCisuTm0KK2NvbW1hbmQgYXBwZWFyZWQgaW4KKy5BdCB2MSAuCitJdCB3YXMsIGhvd2V2ZXIsIHVubWFpbnRhaW5hYmxlIHNvIHdlIHdyb3RlIHRoaXMgb25lLgorLlNoIEJVR1MKK1NldHVpZCBzaGVsbCBzY3JpcHRzIHNob3VsZCBiZSBhdm9pZGVkIGF0IGFsbCBjb3N0cywgYXMgdGhleSBhcmUgYQorc2lnbmlmaWNhbnQgc2VjdXJpdHkgcmlzay4KKy5QcAorUFMxLCBQUzIsIGFuZCBQUzQgc2hvdWxkIGJlIHN1YmplY3QgdG8gcGFyYW1ldGVyIGV4cGFuc2lvbiBiZWZvcmUKK2JlaW5nIGRpc3BsYXllZC4KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3NoZWxsLmggYi91c3IvZGFzaC9zaGVsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjc2OTYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9zaGVsbC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpc2hlbGwuaAk4LjIgKEJlcmtlbGV5KSA1LzQvOTUKKyAqLworCisvKgorICogVGhlIGZvbGxvdyBzaG91bGQgYmUgc2V0IHRvIHJlZmxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHlvdSBoYXZlOgorICoJSk9CUyAtPiAxIGlmIHlvdSBoYXZlIEJlcmtlbGV5IGpvYiBjb250cm9sLCAwIG90aGVyd2lzZS4KKyAqCVNIT1JUTkFNRVMgLT4gMSBpZiB5b3VyIGxpbmtlciBjYW5ub3QgaGFuZGxlIGxvbmcgbmFtZXMuCisgKglkZWZpbmUgQlNEIGlmIHlvdSBhcmUgcnVubmluZyA0LjIgQlNEIG9yIGxhdGVyLgorICoJZGVmaW5lIFNZU1YgaWYgeW91IGFyZSBydW5uaW5nIHVuZGVyIFN5c3RlbSBWLgorICoJZGVmaW5lIERFQlVHPTEgdG8gY29tcGlsZSBpbiBkZWJ1Z2dpbmcgKCdzZXQgLW8gZGVidWcnIHRvIHR1cm4gb24pCisgKglkZWZpbmUgREVCVUc9MiB0byBjb21waWxlIGluIGFuZCB0dXJuIG9uIGRlYnVnZ2luZy4KKyAqCWRlZmluZSBET19TSEFSRURWRk9SSyB0byBpbmRpY2F0ZSB0aGF0IHZmb3JrKDIpIHNoYXJlcyBpdHMgYWRkcmVzcworICoJICAgICAgIHdpdGggaXRzIHBhcmVudC4KKyAqCisgKiBXaGVuIGRlYnVnZ2luZyBpcyBvbiwgZGVidWdnaW5nIGluZm8gd2lsbCBiZSB3cml0dGVuIHRvIC4vdHJhY2UgYW5kCisgKiBhIHF1aXQgc2lnbmFsIHdpbGwgZ2VuZXJhdGUgYSBjb3JlIGR1bXAuCisgKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaWZuZGVmIEpPQlMKKyNkZWZpbmUgSk9CUyAxCisjZW5kaWYKKyNpZm5kZWYgQlNECisjZGVmaW5lIEJTRCAxCisjZW5kaWYKKworI2lmbmRlZiBET19TSEFSRURWRk9SSworI2lmIF9fTmV0QlNEX1ZlcnNpb25fXyA+PSAxMDQwMDAwMDAKKyNkZWZpbmUgRE9fU0hBUkVEVkZPUksKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAqcG9pbnRlcjsKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICh2b2lkICopMAorI2VuZGlmCisjZGVmaW5lIFNUQVRJQyBzdGF0aWMKKyNkZWZpbmUgTUtJTklUCS8qIGVtcHR5ICovCisKK2V4dGVybiBjaGFyIG51bGxzdHJbMV07CQkvKiBudWxsIHN0cmluZyAqLworCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBUUkFDRShwYXJhbSkJdHJhY2UgcGFyYW0KKyNkZWZpbmUgVFJBQ0VWKHBhcmFtKQl0cmFjZXYgcGFyYW0KKyNlbHNlCisjZGVmaW5lIFRSQUNFKHBhcmFtKQorI2RlZmluZSBUUkFDRVYocGFyYW0pCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fIDwgMworI2RlZmluZSB2YV9jb3B5IF9fdmFfY29weQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA5NikKKyNkZWZpbmUgX19idWlsdGluX2V4cGVjdCh4LCBleHBlY3RlZF92YWx1ZSkgKHgpCisjZW5kaWYKKworI2RlZmluZSBsaWtlbHkoeCkJX19idWlsdGluX2V4cGVjdCghISh4KSwxKQorI2RlZmluZSB1bmxpa2VseSh4KQlfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLDApCmRpZmYgLS1naXQgYS91c3IvZGFzaC9zaG93LmMgYi91c3IvZGFzaC9zaG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1OGRlMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL3Nob3cuYwpAQCAtMCwwICsxLDQwMyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJub2Rlcy5oIgorI2luY2x1ZGUgIm15c3RyaW5nLmgiCisjaW5jbHVkZSAic2hvdy5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIHNodHJlZSh1bmlvbiBub2RlICosIGludCwgY2hhciAqLCBGSUxFKik7CitzdGF0aWMgdm9pZCBzaGNtZCh1bmlvbiBub2RlICosIEZJTEUgKik7CitzdGF0aWMgdm9pZCBzaGFyZyh1bmlvbiBub2RlICosIEZJTEUgKik7CitzdGF0aWMgdm9pZCBpbmRlbnQoaW50LCBjaGFyICosIEZJTEUgKik7CitzdGF0aWMgdm9pZCB0cnN0cmluZyhjaGFyICopOworCisKK3ZvaWQKK3Nob3d0cmVlKHVuaW9uIG5vZGUgKm4pCit7CisJdHJwdXRzKCJzaG93dHJlZSBjYWxsZWRcbiIpOworCXNodHJlZShuLCAxLCBOVUxMLCBzdGRvdXQpOworfQorCisKK3N0YXRpYyB2b2lkCitzaHRyZWUodW5pb24gbm9kZSAqbiwgaW50IGluZCwgY2hhciAqcGZ4LCBGSUxFICpmcCkKK3sKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmxwOworCWNvbnN0IGNoYXIgKnM7CisKKwlpZiAobiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpbmRlbnQoaW5kLCBwZngsIGZwKTsKKwlzd2l0Y2gobi0+dHlwZSkgeworCWNhc2UgTlNFTUk6CisJCXMgPSAiOyAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTkFORDoKKwkJcyA9ICIgJiYgIjsKKwkJZ290byBiaW5vcDsKKwljYXNlIE5PUjoKKwkJcyA9ICIgfHwgIjsKK2Jpbm9wOgorCQlzaHRyZWUobi0+bmJpbmFyeS5jaDEsIGluZCwgTlVMTCwgZnApOworCSAgIC8qICAgIGlmIChpbmQgPCAwKSAqLworCQkJZnB1dHMocywgZnApOworCQlzaHRyZWUobi0+bmJpbmFyeS5jaDIsIGluZCwgTlVMTCwgZnApOworCQlicmVhazsKKwljYXNlIE5DTUQ6CisJCXNoY21kKG4sIGZwKTsKKwkJaWYgKGluZCA+PSAwKQorCQkJcHV0YygnXG4nLCBmcCk7CisJCWJyZWFrOworCWNhc2UgTlBJUEU6CisJCWZvciAobHAgPSBuLT5ucGlwZS5jbWRsaXN0IDsgbHAgOyBscCA9IGxwLT5uZXh0KSB7CisJCQlzaGNtZChscC0+biwgZnApOworCQkJaWYgKGxwLT5uZXh0KQorCQkJCWZwdXRzKCIgfCAiLCBmcCk7CisJCX0KKwkJaWYgKG4tPm5waXBlLmJhY2tnbmQpCisJCQlmcHV0cygiICYiLCBmcCk7CisJCWlmIChpbmQgPj0gMCkKKwkJCXB1dGMoJ1xuJywgZnApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKGZwLCAiPG5vZGUgdHlwZSAlZD4iLCBuLT50eXBlKTsKKwkJaWYgKGluZCA+PSAwKQorCQkJcHV0YygnXG4nLCBmcCk7CisJCWJyZWFrOworCX0KK30KKworCisKK3N0YXRpYyB2b2lkCitzaGNtZCh1bmlvbiBub2RlICpjbWQsIEZJTEUgKmZwKQoreworCXVuaW9uIG5vZGUgKm5wOworCWludCBmaXJzdDsKKwljb25zdCBjaGFyICpzOworCWludCBkZnRmZDsKKworCWZpcnN0ID0gMTsKKwlmb3IgKG5wID0gY21kLT5uY21kLmFyZ3MgOyBucCA7IG5wID0gbnAtPm5hcmcubmV4dCkgeworCQlpZiAoISBmaXJzdCkKKwkJCXB1dGNoYXIoJyAnKTsKKwkJc2hhcmcobnAsIGZwKTsKKwkJZmlyc3QgPSAwOworCX0KKwlmb3IgKG5wID0gY21kLT5uY21kLnJlZGlyZWN0IDsgbnAgOyBucCA9IG5wLT5uZmlsZS5uZXh0KSB7CisJCWlmICghIGZpcnN0KQorCQkJcHV0Y2hhcignICcpOworCQlzd2l0Y2ggKG5wLT5uZmlsZS50eXBlKSB7CisJCQljYXNlIE5UTzoJcyA9ICI+IjsgIGRmdGZkID0gMTsgYnJlYWs7CisJCQljYXNlIE5DTE9CQkVSOglzID0gIj58IjsgZGZ0ZmQgPSAxOyBicmVhazsKKwkJCWNhc2UgTkFQUEVORDoJcyA9ICI+PiI7IGRmdGZkID0gMTsgYnJlYWs7CisJCQljYXNlIE5UT0ZEOglzID0gIj4mIjsgZGZ0ZmQgPSAxOyBicmVhazsKKwkJCWNhc2UgTkZST006CXMgPSAiPCI7ICBkZnRmZCA9IDA7IGJyZWFrOworCQkJY2FzZSBORlJPTUZEOglzID0gIjwmIjsgZGZ0ZmQgPSAwOyBicmVhazsKKwkJCWNhc2UgTkZST01UTzoJcyA9ICI8PiI7IGRmdGZkID0gMDsgYnJlYWs7CisJCQlkZWZhdWx0OiAgCXMgPSAiKmVycm9yKiI7IGRmdGZkID0gMDsgYnJlYWs7CisJCX0KKwkJaWYgKG5wLT5uZmlsZS5mZCAhPSBkZnRmZCkKKwkJCWZwcmludGYoZnAsICIlZCIsIG5wLT5uZmlsZS5mZCk7CisJCWZwdXRzKHMsIGZwKTsKKwkJaWYgKG5wLT5uZmlsZS50eXBlID09IE5UT0ZEIHx8IG5wLT5uZmlsZS50eXBlID09IE5GUk9NRkQpIHsKKwkJCWZwcmludGYoZnAsICIlZCIsIG5wLT5uZHVwLmR1cGZkKTsKKwkJfSBlbHNlIHsKKwkJCXNoYXJnKG5wLT5uZmlsZS5mbmFtZSwgZnApOworCQl9CisJCWZpcnN0ID0gMDsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZAorc2hhcmcodW5pb24gbm9kZSAqYXJnLCBGSUxFICpmcCkKK3sKKwljaGFyICpwOworCXN0cnVjdCBub2RlbGlzdCAqYnFsaXN0OworCWludCBzdWJ0eXBlOworCisJaWYgKGFyZy0+dHlwZSAhPSBOQVJHKSB7CisJCXByaW50ZigiPG5vZGUgdHlwZSAlZD5cbiIsIGFyZy0+dHlwZSk7CisJCWFib3J0KCk7CisJfQorCWJxbGlzdCA9IGFyZy0+bmFyZy5iYWNrcXVvdGU7CisJZm9yIChwID0gYXJnLT5uYXJnLnRleHQgOyAqcCA7IHArKykgeworCQlzd2l0Y2ggKChzaWduZWQgY2hhcikqcCkgeworCQljYXNlIENUTEVTQzoKKwkJCXB1dGMoKisrcCwgZnApOworCQkJYnJlYWs7CisJCWNhc2UgQ1RMVkFSOgorCQkJcHV0YygnJCcsIGZwKTsKKwkJCXB1dGMoJ3snLCBmcCk7CisJCQlzdWJ0eXBlID0gKisrcDsKKwkJCWlmIChzdWJ0eXBlID09IFZTTEVOR1RIKQorCQkJCXB1dGMoJyMnLCBmcCk7CisKKwkJCXdoaWxlICgqcCAhPSAnPScpCisJCQkJcHV0YygqcCsrLCBmcCk7CisKKwkJCWlmIChzdWJ0eXBlICYgVlNOVUwpCisJCQkJcHV0YygnOicsIGZwKTsKKworCQkJc3dpdGNoIChzdWJ0eXBlICYgVlNUWVBFKSB7CisJCQljYXNlIFZTTk9STUFMOgorCQkJCXB1dGMoJ30nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTTUlOVVM6CisJCQkJcHV0YygnLScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNQTFVTOgorCQkJCXB1dGMoJysnLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTUVVFU1RJT046CisJCQkJcHV0YygnPycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNBU1NJR046CisJCQkJcHV0YygnPScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNTEVGVDoKKwkJCQlwdXRjKCcjJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU1RSSU1MRUZUTUFYOgorCQkJCXB1dGMoJyMnLCBmcCk7CisJCQkJcHV0YygnIycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNUklHSFQ6CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNUklHSFRNQVg6CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlwdXRjKCclJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU0xFTkdUSDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCI8c3VidHlwZSAlZD4iLCBzdWJ0eXBlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENUTEVORFZBUjoKKwkJICAgICBwdXRjKCd9JywgZnApOworCQkgICAgIGJyZWFrOworCQljYXNlIENUTEJBQ0tROgorCQljYXNlIENUTEJBQ0tRfENUTFFVT1RFOgorCQkJcHV0YygnJCcsIGZwKTsKKwkJCXB1dGMoJygnLCBmcCk7CisJCQlzaHRyZWUoYnFsaXN0LT5uLCAtMSwgTlVMTCwgZnApOworCQkJcHV0YygnKScsIGZwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHV0YygqcCwgZnApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2luZGVudChpbnQgYW1vdW50LCBjaGFyICpwZngsIEZJTEUgKmZwKQoreworCWludCBpOworCisJZm9yIChpID0gMCA7IGkgPCBhbW91bnQgOyBpKyspIHsKKwkJaWYgKHBmeCAmJiBpID09IGFtb3VudCAtIDEpCisJCQlmcHV0cyhwZngsIGZwKTsKKwkJcHV0YygnXHQnLCBmcCk7CisJfQorfQorCisKKworLyoKKyAqIERlYnVnZ2luZyBzdHVmZi4KKyAqLworCisKK0ZJTEUgKnRyYWNlZmlsZTsKKworCit2b2lkCit0cnB1dGMoaW50IGMpCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlwdXRjKGMsIHRyYWNlZmlsZSk7Cit9CisKK3ZvaWQKK3RyYWNlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCSh2b2lkKSB2ZnByaW50Zih0cmFjZWZpbGUsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKK3ZvaWQKK3RyYWNldihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwkodm9pZCkgdmZwcmludGYodHJhY2VmaWxlLCBmbXQsIHZhKTsKK30KKworCit2b2lkCit0cnB1dHMoY29uc3QgY2hhciAqcykKK3sKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCWZwdXRzKHMsIHRyYWNlZmlsZSk7Cit9CisKKworc3RhdGljIHZvaWQKK3Ryc3RyaW5nKGNoYXIgKnMpCit7CisJY2hhciAqcDsKKwljaGFyIGM7CisKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCXB1dGMoJyInLCB0cmFjZWZpbGUpOworCWZvciAocCA9IHMgOyAqcCA7IHArKykgeworCQlzd2l0Y2ggKChzaWduZWQgY2hhcikqcCkgeworCQljYXNlICdcbic6ICBjID0gJ24nOyAgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1x0JzogIGMgPSAndCc7ICBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXHInOiAgYyA9ICdyJzsgIGdvdG8gYmFja3NsYXNoOworCQljYXNlICciJzogIGMgPSAnIic7ICBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXFwnOiAgYyA9ICdcXCc7ICBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExFU0M6ICBjID0gJ2UnOyAgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMVkFSOiAgYyA9ICd2JzsgIGdvdG8gYmFja3NsYXNoOworCQljYXNlIENUTFZBUitDVExRVU9URTogIGMgPSAnVic7ICBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExCQUNLUTogIGMgPSAncSc7ICBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExCQUNLUStDVExRVU9URTogIGMgPSAnUSc7ICBnb3RvIGJhY2tzbGFzaDsKK2JhY2tzbGFzaDoJICBwdXRjKCdcXCcsIHRyYWNlZmlsZSk7CisJCQlwdXRjKGMsIHRyYWNlZmlsZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICgqcCA+PSAnICcgJiYgKnAgPD0gJ34nKQorCQkJCXB1dGMoKnAsIHRyYWNlZmlsZSk7CisJCQllbHNlIHsKKwkJCQlwdXRjKCdcXCcsIHRyYWNlZmlsZSk7CisJCQkJcHV0YygqcCA+PiA2ICYgMDMsIHRyYWNlZmlsZSk7CisJCQkJcHV0YygqcCA+PiAzICYgMDcsIHRyYWNlZmlsZSk7CisJCQkJcHV0YygqcCAmIDA3LCB0cmFjZWZpbGUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcHV0YygnIicsIHRyYWNlZmlsZSk7Cit9CisKKwordm9pZAordHJhcmdzKGNoYXIgKiphcCkKK3sKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCXdoaWxlICgqYXApIHsKKwkJdHJzdHJpbmcoKmFwKyspOworCQlpZiAoKmFwKQorCQkJcHV0YygnICcsIHRyYWNlZmlsZSk7CisJCWVsc2UKKwkJCXB1dGMoJ1xuJywgdHJhY2VmaWxlKTsKKwl9Cit9CisKKwordm9pZAorb3BlbnRyYWNlKHZvaWQpCit7CisJY2hhciBzWzEwMF07CisjaWZkZWYgT19BUFBFTkQKKwlpbnQgZmxhZ3M7CisjZW5kaWYKKworCWlmIChkZWJ1ZyAhPSAxKSB7CisJCWlmICh0cmFjZWZpbGUpCisJCQlmZmx1c2godHJhY2VmaWxlKTsKKwkJLyogbGVhdmUgb3BlbiBiZWNhdXNlIGxpYmVkaXQgbWlnaHQgYmUgdXNpbmcgaXQgKi8KKwkJcmV0dXJuOworCX0KKyNpZmRlZiBub3RfdGhpc193YXkKKwl7CisJCWNoYXIgKnA7CisJCWlmICgocCA9IGdldGVudihob21lc3RyKSkgPT0gTlVMTCkgeworCQkJaWYgKGdldGV1aWQoKSA9PSAwKQorCQkJCXAgPSAiLyI7CisJCQllbHNlCisJCQkJcCA9ICIvdG1wIjsKKwkJfQorCQlzY29weShwLCBzKTsKKwkJc3RyY2F0KHMsICIvdHJhY2UiKTsKKwl9CisjZWxzZQorCXNjb3B5KCIuL3RyYWNlIiwgcyk7CisjZW5kaWYgLyogbm90X3RoaXNfd2F5ICovCisJaWYgKHRyYWNlZmlsZSkgeworCQlpZiAoIWZyZW9wZW4ocywgImEiLCB0cmFjZWZpbGUpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHJlLW9wZW4gJXNcbiIsIHMpOworCQkJZGVidWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCh0cmFjZWZpbGUgPSBmb3BlbihzLCAiYSIpKSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gJXNcbiIsIHMpOworCQkJZGVidWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorI2lmZGVmIE9fQVBQRU5ECisJaWYgKChmbGFncyA9IGZjbnRsKGZpbGVubyh0cmFjZWZpbGUpLCBGX0dFVEZMLCAwKSkgPj0gMCkKKwkJZmNudGwoZmlsZW5vKHRyYWNlZmlsZSksIEZfU0VURkwsIGZsYWdzIHwgT19BUFBFTkQpOworI2VuZGlmCisJc2V0bGluZWJ1Zih0cmFjZWZpbGUpOworCWZwdXRzKCJcblRyYWNpbmcgc3RhcnRlZC5cbiIsIHRyYWNlZmlsZSk7Cit9CisjZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3Nob3cuaCBiL3Vzci9kYXNoL3Nob3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGNjYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvc2hvdy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTk1CisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpc2hvdy5oCTEuMSAoQmVya2VsZXkpIDUvNC85NQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmZGVmIERFQlVHCit1bmlvbiBub2RlOwordm9pZCBzaG93dHJlZSh1bmlvbiBub2RlICopOwordm9pZCB0cmFjZShjb25zdCBjaGFyICosIC4uLik7Cit2b2lkIHRyYWNldihjb25zdCBjaGFyICosIHZhX2xpc3QpOwordm9pZCB0cmFyZ3MoY2hhciAqKik7Cit2b2lkIHRycHV0YyhpbnQpOwordm9pZCB0cnB1dHMoY29uc3QgY2hhciAqKTsKK3ZvaWQgb3BlbnRyYWNlKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvZGFzaC9zeXN0ZW0uYyBiL3Vzci9kYXNoL3N5c3RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YmNkZGMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9zeXN0ZW0uYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNAorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBIQVZFX0lTQUxQSEEKKyNkZWZpbmUgaXNhbG51bSBfaXNhbG51bQorI2RlZmluZSBpc2NudHJsIF9pc2NudHJsCisjZGVmaW5lIGlzbG93ZXIgX2lzbG93ZXIKKyNkZWZpbmUgaXNzcGFjZSBfaXNzcGFjZQorI2RlZmluZSBpc2FscGhhIF9pc2FscGhhCisjZGVmaW5lIGlzZGlnaXQgX2lzZGlnaXQKKyNkZWZpbmUgaXNwcmludCBfaXNwcmludAorI2RlZmluZSBpc3VwcGVyIF9pc3VwcGVyCisjZGVmaW5lIGlzYmxhbmsgX2lzYmxhbmsKKyNkZWZpbmUgaXNncmFwaCBfaXNncmFwaAorI2RlZmluZSBpc3B1bmN0IF9pc3B1bmN0CisjZGVmaW5lIGlzeGRpZ2l0IF9pc3hkaWdpdAorI2luY2x1ZGUgPGN0eXBlLmg+CisjdW5kZWYgaXNhbG51bQorI3VuZGVmIGlzY250cmwKKyN1bmRlZiBpc2xvd2VyCisjdW5kZWYgaXNzcGFjZQorI3VuZGVmIGlzYWxwaGEKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNwcmludAorI3VuZGVmIGlzdXBwZXIKKyN1bmRlZiBpc2JsYW5rCisjdW5kZWYgaXNncmFwaAorI3VuZGVmIGlzcHVuY3QKKyN1bmRlZiBpc3hkaWdpdAorI2VuZGlmCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVycm9yLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisKKyNpZm5kZWYgSEFWRV9NRU1QQ1BZCit2b2lkICptZW1wY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJcmV0dXJuIG1lbWNweShkZXN0LCBzcmMsIG4pICsgbjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RQQ1BZCitjaGFyICpzdHBjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oc3JjKTsKKwlkZXN0W2xlbl0gPSAwOworCXJldHVybiBtZW1wY3B5KGRlc3QsIHNyYywgbGVuKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0hSTlVMCitjaGFyICpzdHJjaHJudWwoY29uc3QgY2hhciAqcywgaW50IGMpCit7CisJY2hhciAqcCA9IHN0cmNocihzLCBjKTsKKwlpZiAoIXApCisJCXAgPSAoY2hhciAqKXMgKyBzdHJsZW4ocyk7CisJcmV0dXJuIHA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlNJR05BTAorY2hhciAqc3Ryc2lnbmFsKGludCBzaWcpCit7CisJc3RhdGljIGNoYXIgYnVmWzE5XTsKKworCWlmICgodW5zaWduZWQpc2lnIDwgTlNJRyAmJiBzeXNfc2lnbGlzdFtzaWddKQorCQlyZXR1cm4gKGNoYXIgKilzeXNfc2lnbGlzdFtzaWddOworCWZtdHN0cihidWYsIHNpemVvZihidWYpLCAiU2lnbmFsICVkIiwgc2lnKTsKKwlyZXR1cm4gYnVmOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9CU0VBUkNICit2b2lkICpic2VhcmNoKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLAorCSAgICAgIHNpemVfdCBzaXplLCBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKwl3aGlsZSAobm1lbWIpIHsKKwkJc2l6ZV90IG1pZGlkeCA9IG5tZW1iIC8gMjsKKwkJY29uc3Qgdm9pZCAqbWlkb2JqID0gYmFzZSArIG1pZGlkeCAqIHNpemU7CisJCWludCBkaWZmID0gY21wKGtleSwgbWlkb2JqKTsKKworCQlpZiAoZGlmZiA9PSAwKQorCQkJcmV0dXJuICh2b2lkICopbWlkb2JqOworCisJCWlmIChkaWZmID4gMCkgeworCQkJYmFzZSA9IG1pZG9iaiArIHNpemU7CisJCQlubWVtYiAtPSBtaWRpZHggKyAxOworCQl9IGVsc2UKKwkJCW5tZW1iID0gbWlkaWR4OworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TWVNDT05GCitsb25nIHN5c2NvbmYoaW50IG5hbWUpCit7CisJc2hfZXJyb3IoIm5vIHN5c2NvbmYgZm9yOiAlZCIsIG5hbWUpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9JU0FMUEhBCitpbnQgaXNhbG51bShpbnQgYykgeworCXJldHVybiBfaXNhbG51bShjKTsKK30KKworCitpbnQgaXNjbnRybChpbnQgYykgeworCXJldHVybiBfaXNjbnRybChjKTsKK30KKworCitpbnQgaXNsb3dlcihpbnQgYykgeworCXJldHVybiBfaXNsb3dlcihjKTsKK30KKworCitpbnQgaXNzcGFjZShpbnQgYykgeworCXJldHVybiBfaXNzcGFjZShjKTsKK30KKworCitpbnQgaXNhbHBoYShpbnQgYykgeworCXJldHVybiBfaXNhbHBoYShjKTsKK30KKworCitpbnQgaXNkaWdpdChpbnQgYykgeworCXJldHVybiBfaXNkaWdpdChjKTsKK30KKworCitpbnQgaXNwcmludChpbnQgYykgeworCXJldHVybiBfaXNwcmludChjKTsKK30KKworCitpbnQgaXN1cHBlcihpbnQgYykgeworCXJldHVybiBfaXN1cHBlcihjKTsKK30KKworCitpbnQgaXNibGFuayhpbnQgYykgeworCXJldHVybiBfaXNibGFuayhjKTsKK30KKworCitpbnQgaXNncmFwaChpbnQgYykgeworCXJldHVybiBfaXNncmFwaChjKTsKK30KKworCitpbnQgaXNwdW5jdChpbnQgYykgeworCXJldHVybiBfaXNwdW5jdChjKTsKK30KKworCitpbnQgaXN4ZGlnaXQoaW50IGMpIHsKKwlyZXR1cm4gX2lzeGRpZ2l0KGMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvZGFzaC9zeXN0ZW0uaCBiL3Vzci9kYXNoL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOGVlYzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC9zeXN0ZW0uaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZm5kZWYgU1NJWkVfTUFYCisjZGVmaW5lIFNTSVpFX01BWCAoKHNzaXplX3QpKChzaXplX3QpLTEgPj4gMSkpCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHNpZ2NsZWFybWFzayh2b2lkKQoreworI2lmZGVmIEhBVkVfU0lHU0VUTUFTSworCXNpZ3NldG1hc2soMCk7CisjZWxzZQorCXNpZ3NldF90IHNldDsKKwlzaWdlbXB0eXNldCgmc2V0KTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNldCwgMCk7CisjZW5kaWYKK30KKworI2lmbmRlZiBIQVZFX01FTVBDUFkKK3ZvaWQgKm1lbXBjcHkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUENQWQorY2hhciAqc3RwY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0hSTlVMCitjaGFyICpzdHJjaHJudWwoY29uc3QgY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKK2NoYXIgKnN0cnNpZ25hbChpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJUT0lNQVgKKyNkZWZpbmUgc3RydG9pbWF4IHN0cnRvbGwKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSVE9VTUFYCisjZGVmaW5lIHN0cnRvdW1heCBzdHJ0b3VsbAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9CU0VBUkNICit2b2lkICpic2VhcmNoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIHNpemVfdCwKKwkgICAgICBpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0tJTExQRworc3RhdGljIGlubGluZSBpbnQga2lsbHBnKHBpZF90IHBpZCwgaW50IHNpZ25hbCkKK3sKKyNpZmRlZiBERUJVRworCWlmIChwaWQgPCAwKQorCQlhYm9ydCgpOworI2VuZGlmCisJcmV0dXJuIGtpbGwoLXBpZCwgc2lnbmFsKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1lTQ09ORgorI2RlZmluZSBfU0NfQ0xLX1RDSyAyCitsb25nIHN5c2NvbmYoaW50KSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvdHJhcC5jIGIvdXNyL2Rhc2gvdHJhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTFkNTYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC90cmFwLmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIm5vZGVzLmgiCS8qIGZvciBvdGhlciBoZWFkZXJzICovCisjaW5jbHVkZSAiZXZhbC5oIgorI2luY2x1ZGUgImpvYnMuaCIKKyNpbmNsdWRlICJzaG93LmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgInN5bnRheC5oIgorI2luY2x1ZGUgIm91dHB1dC5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJ0cmFwLmgiCisjaW5jbHVkZSAibXlzdHJpbmcuaCIKKworI2lmZGVmIEhFVElPCisjaW5jbHVkZSAiaGV0aW8uaCIKKyNlbmRpZgorCisvKgorICogU2lnbW9kZSByZWNvcmRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzaWduYWwgaGFuZGxlcnMgZm9yIHRoZSB2YXJpb3VzCisgKiBtb2Rlcy4gIEEgdmFsdWUgb2YgemVybyBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGhhbmRsZXIgaXMgbm90IGtub3duLgorICogU19IQVJEX0lHTiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2lnbmFsIHdhcyBpZ25vcmVkIG9uIGVudHJ5IHRvIHRoZSBzaGVsbCwKKyAqLworCisjZGVmaW5lIFNfREZMIDEJCQkvKiBkZWZhdWx0IHNpZ25hbCBoYW5kbGluZyAoU0lHX0RGTCkgKi8KKyNkZWZpbmUgU19DQVRDSCAyCQkvKiBzaWduYWwgaXMgY2F1Z2h0ICovCisjZGVmaW5lIFNfSUdOIDMJCQkvKiBzaWduYWwgaXMgaWdub3JlZCAoU0lHX0lHTikgKi8KKyNkZWZpbmUgU19IQVJEX0lHTiA0CQkvKiBzaWduYWwgaXMgaWdub3JlZCBwZXJtZW5hbnRseSAqLworI2RlZmluZSBTX1JFU0VUIDUJCS8qIHRlbXBvcmFyeSAtIHRvIHJlc2V0IGEgaGFyZCBpZ25vcmVkIHNpZyAqLworCisKKy8qIHRyYXAgaGFuZGxlciBjb21tYW5kcyAqLworY2hhciAqdHJhcFtOU0lHXTsKKy8qIGN1cnJlbnQgdmFsdWUgb2Ygc2lnbmFsICovCitzdGF0aWMgY2hhciBzaWdtb2RlW05TSUcgLSAxXTsKKy8qIGluZGljYXRlcyBzcGVjaWZpZWQgc2lnbmFsIHJlY2VpdmVkICovCitjaGFyIGdvdHNpZ1tOU0lHIC0gMV07CisvKiBsYXN0IHBlbmRpbmcgc2lnbmFsICovCit2b2xhdGlsZSBzaWdfYXRvbWljX3QgcGVuZGluZ3NpZ3M7CisvKiBkbyB3ZSBnZW5lcmF0ZSBFWFNJRyBldmVudHMgKi8KK2ludCBleHNpZzsKKworI2lmZGVmIG1raW5pdAorSU5DTFVERSA8c2lnbmFsLmg+CitJTklUIHsKKwlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoZSB0cmFwIGJ1aWx0aW4uCisgKi8KKworaW50Cit0cmFwY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICphY3Rpb247CisJY2hhciAqKmFwOworCWludCBzaWdubzsKKworCW5leHRvcHQobnVsbHN0cik7CisJYXAgPSBhcmdwdHI7CisJaWYgKCEqYXApIHsKKwkJZm9yIChzaWdubyA9IDAgOyBzaWdubyA8IE5TSUcgOyBzaWdubysrKSB7CisJCQlpZiAodHJhcFtzaWdub10gIT0gTlVMTCkgeworCQkJCW91dDFmbXQoCisJCQkJCSJ0cmFwIC0tICVzICVzXG4iLAorCQkJCQlzaW5nbGVfcXVvdGUodHJhcFtzaWdub10pLAorCQkJCQlzaWduYWxfbmFtZShzaWdubykKKwkJCQkpOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoIWFwWzFdKQorCQlhY3Rpb24gPSBOVUxMOworCWVsc2UKKwkJYWN0aW9uID0gKmFwKys7CisJd2hpbGUgKCphcCkgeworCQlpZiAoKHNpZ25vID0gZGVjb2RlX3NpZ25hbCgqYXAsIDApKSA8IDApCisJCQlzaF9lcnJvcigiJXM6IGJhZCB0cmFwIiwgKmFwKTsKKwkJSU5UT0ZGOworCQlpZiAoYWN0aW9uKSB7CisJCQlpZiAoYWN0aW9uWzBdID09ICctJyAmJiBhY3Rpb25bMV0gPT0gJ1wwJykKKwkJCQlhY3Rpb24gPSBOVUxMOworCQkJZWxzZQorCQkJCWFjdGlvbiA9IHNhdmVzdHIoYWN0aW9uKTsKKwkJfQorCQlpZiAodHJhcFtzaWdub10pCisJCQlja2ZyZWUodHJhcFtzaWdub10pOworCQl0cmFwW3NpZ25vXSA9IGFjdGlvbjsKKwkJaWYgKHNpZ25vICE9IDApCisJCQlzZXRzaWduYWwoc2lnbm8pOworCQlJTlRPTjsKKwkJYXArKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCisvKgorICogQ2xlYXIgdHJhcHMgb24gYSBmb3JrLgorICovCisKK3ZvaWQKK2NsZWFyX3RyYXBzKHZvaWQpCit7CisJY2hhciAqKnRwOworCisJZm9yICh0cCA9IHRyYXAgOyB0cCA8ICZ0cmFwW05TSUddIDsgdHArKykgeworCQlpZiAoKnRwICYmICoqdHApIHsJLyogdHJhcCBub3QgTlVMTCBvciBTSUdfSUdOICovCisJCQlJTlRPRkY7CisJCQlja2ZyZWUoKnRwKTsKKwkJCSp0cCA9IE5VTEw7CisJCQlpZiAodHAgIT0gJnRyYXBbMF0pCisJCQkJc2V0c2lnbmFsKHRwIC0gdHJhcCk7CisJCQlJTlRPTjsKKwkJfQorCX0KK30KKworCisKKy8qCisgKiBTZXQgdGhlIHNpZ25hbCBoYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIHNpZ25hbC4gIFRoZSByb3V0aW5lIGZpZ3VyZXMKKyAqIG91dCB3aGF0IGl0IHNob3VsZCBiZSBzZXQgdG8uCisgKi8KKwordm9pZAorc2V0c2lnbmFsKGludCBzaWdubykKK3sKKwlpbnQgYWN0aW9uOworCWNoYXIgKnQsIHRzaWc7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisKKwlpZiAoKHQgPSB0cmFwW3NpZ25vXSkgPT0gTlVMTCkKKwkJYWN0aW9uID0gU19ERkw7CisJZWxzZSBpZiAoKnQgIT0gJ1wwJykKKwkJYWN0aW9uID0gU19DQVRDSDsKKwllbHNlCisJCWFjdGlvbiA9IFNfSUdOOworCWlmIChyb290c2hlbGwgJiYgYWN0aW9uID09IFNfREZMKSB7CisJCXN3aXRjaCAoc2lnbm8pIHsKKwkJY2FzZSBTSUdJTlQ6CisJCQlpZiAoaWZsYWcgfHwgbWludXNjIHx8IHNmbGFnID09IDApCisJCQkJYWN0aW9uID0gU19DQVRDSDsKKwkJCWJyZWFrOworCQljYXNlIFNJR1FVSVQ6CisjaWZkZWYgREVCVUcKKwkJCWlmIChkZWJ1ZykKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBTSUdURVJNOgorCQkJaWYgKGlmbGFnKQorCQkJCWFjdGlvbiA9IFNfSUdOOworCQkJYnJlYWs7CisjaWYgSk9CUworCQljYXNlIFNJR1RTVFA6CisJCWNhc2UgU0lHVFRPVToKKwkJCWlmIChtZmxhZykKKwkJCQlhY3Rpb24gPSBTX0lHTjsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwl9CisKKwl0ID0gJnNpZ21vZGVbc2lnbm8gLSAxXTsKKwl0c2lnID0gKnQ7CisJaWYgKHRzaWcgPT0gMCkgeworCQkvKgorCQkgKiBjdXJyZW50IHNldHRpbmcgdW5rbm93bgorCQkgKi8KKwkJaWYgKHNpZ2FjdGlvbihzaWdubywgMCwgJmFjdCkgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBQcmV0ZW5kIGl0IHdvcmtlZDsgbWF5YmUgd2Ugc2hvdWxkIGdpdmUgYSB3YXJuaW5nCisJCQkgKiBoZXJlLCBidXQgb3RoZXIgc2hlbGxzIGRvbid0LiBXZSBkb24ndCBhbHRlcgorCQkJICogc2lnbW9kZSwgc28gdGhhdCB3ZSByZXRyeSBldmVyeSB0aW1lLgorCQkJICovCisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGFjdC5zYV9oYW5kbGVyID09IFNJR19JR04pIHsKKwkJCWlmIChtZmxhZyAmJiAoc2lnbm8gPT0gU0lHVFNUUCB8fAorCQkJICAgICBzaWdubyA9PSBTSUdUVElOIHx8IHNpZ25vID09IFNJR1RUT1UpKSB7CisJCQkJdHNpZyA9IFNfSUdOOwkvKiBkb24ndCBoYXJkIGlnbm9yZSB0aGVzZSAqLworCQkJfSBlbHNlCisJCQkJdHNpZyA9IFNfSEFSRF9JR047CisJCX0gZWxzZSB7CisJCQl0c2lnID0gU19SRVNFVDsJLyogZm9yY2UgdG8gYmUgc2V0ICovCisJCX0KKwl9CisJaWYgKHRzaWcgPT0gU19IQVJEX0lHTiB8fCB0c2lnID09IGFjdGlvbikKKwkJcmV0dXJuOworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBTX0NBVENIOgorCQlhY3Quc2FfaGFuZGxlciA9IG9uc2lnOworCQlicmVhazsKKwljYXNlIFNfSUdOOgorCQlhY3Quc2FfaGFuZGxlciA9IFNJR19JR047CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFjdC5zYV9oYW5kbGVyID0gU0lHX0RGTDsKKwl9CisJKnQgPSBhY3Rpb247CisJYWN0LnNhX2ZsYWdzID0gMDsKKwlzaWdmaWxsc2V0KCZhY3Quc2FfbWFzayk7CisJc2lnYWN0aW9uKHNpZ25vLCAmYWN0LCAwKTsKK30KKworLyoKKyAqIElnbm9yZSBhIHNpZ25hbC4KKyAqLworCit2b2lkCitpZ25vcmVzaWcoaW50IHNpZ25vKQoreworCWlmIChzaWdtb2RlW3NpZ25vIC0gMV0gIT0gU19JR04gJiYgc2lnbW9kZVtzaWdubyAtIDFdICE9IFNfSEFSRF9JR04pIHsKKwkJc2lnbmFsKHNpZ25vLCBTSUdfSUdOKTsKKwl9CisJc2lnbW9kZVtzaWdubyAtIDFdID0gU19IQVJEX0lHTjsKK30KKworCisKKy8qCisgKiBTaWduYWwgaGFuZGxlci4KKyAqLworCit2b2lkCitvbnNpZyhpbnQgc2lnbm8pCit7CisJZ290c2lnW3NpZ25vIC0gMV0gPSAxOworCXBlbmRpbmdzaWdzID0gc2lnbm87CisKKwlpZiAoZXhzaWcgfHwgKHNpZ25vID09IFNJR0lOVCAmJiAhdHJhcFtTSUdJTlRdKSkgeworCQlpZiAoIXN1cHByZXNzaW50KQorCQkJb25pbnQoKTsKKwkJaW50cGVuZGluZyA9IDE7CisJfQorfQorCisKKworLyoKKyAqIENhbGxlZCB0byBleGVjdXRlIGEgdHJhcC4gIFBlcmhhcHMgd2Ugc2hvdWxkIGF2b2lkIGVudGVyaW5nIG5ldyB0cmFwCisgKiBoYW5kbGVycyB3aGlsZSB3ZSBhcmUgZXhlY3V0aW5nIGEgdHJhcCBoYW5kbGVyLgorICovCisKK2ludAorZG90cmFwKHZvaWQpCit7CisJY2hhciAqcDsKKwljaGFyICpxOworCWludCBpOworCWludCBzYXZlc3RhdHVzOworCWludCBza2lwID0gMDsKKworCXNhdmVzdGF0dXMgPSBleGl0c3RhdHVzOworCXBlbmRpbmdzaWdzID0gMDsKKwliYXJyaWVyKCk7CisKKwlmb3IgKGkgPSAwLCBxID0gZ290c2lnOyBpIDwgTlNJRyAtIDE7IGkrKywgcSsrKSB7CisJCWlmICghKnEpCisJCQljb250aW51ZTsKKwkJKnEgPSAwOworCisJCXAgPSB0cmFwW2kgKyAxXTsKKwkJaWYgKCFwKQorCQkJY29udGludWU7CisJCXNraXAgPSBldmFsc3RyaW5nKHAsIFNLSVBFVkFMKTsKKwkJZXhpdHN0YXR1cyA9IHNhdmVzdGF0dXM7CisJCWlmIChza2lwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNraXA7Cit9CisKKworCisvKgorICogQ29udHJvbHMgd2hldGhlciB0aGUgc2hlbGwgaXMgaW50ZXJhY3RpdmUgb3Igbm90LgorICovCisKKwordm9pZAorc2V0aW50ZXJhY3RpdmUoaW50IG9uKQoreworCXN0YXRpYyBpbnQgaXNfaW50ZXJhY3RpdmU7CisKKwlpZiAoKytvbiA9PSBpc19pbnRlcmFjdGl2ZSkKKwkJcmV0dXJuOworCWlzX2ludGVyYWN0aXZlID0gb247CisJc2V0c2lnbmFsKFNJR0lOVCk7CisJc2V0c2lnbmFsKFNJR1FVSVQpOworCXNldHNpZ25hbChTSUdURVJNKTsKK30KKworCisKKy8qCisgKiBDYWxsZWQgdG8gZXhpdCB0aGUgc2hlbGwuCisgKi8KKwordm9pZAorZXhpdHNoZWxsKHZvaWQpCit7CisJc3RydWN0IGptcGxvYyBsb2M7CisJY2hhciAqcDsKKwlpbnQgc3RhdHVzOworCisjaWZkZWYgSEVUSU8KKwloZXRpb19yZXNldF90ZXJtKCk7CisjZW5kaWYKKwlzdGF0dXMgPSBleGl0c3RhdHVzOworCVRSQUNFKCgicGlkICVkLCBleGl0c2hlbGwoJWQpXG4iLCBnZXRwaWQoKSwgc3RhdHVzKSk7CisJaWYgKHNldGptcChsb2MubG9jKSkgeworCQlpZiAoZXhjZXB0aW9uID09IEVYRVhJVCkKKwkJCV9leGl0KGV4aXRzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJaGFuZGxlciA9ICZsb2M7CisJaWYgKChwID0gdHJhcFswXSkpIHsKKwkJdHJhcFswXSA9IE5VTEw7CisJCWV2YWxzdHJpbmcocCwgMCk7CisJfQorCWZsdXNoYWxsKCk7CitvdXQ6CisJX2V4aXQoc3RhdHVzKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qCisgKiBEZWNvZGUgYSBzaWduYWwgbmFtZQorICovCitpbnQgZGVjb2RlX3NpZ25hbChjb25zdCBjaGFyICpzdHJpbmcsIGludCBtaW5zaWcpCit7CisJaW50IGk7CisKKwlpZiAoaXNfbnVtYmVyKHN0cmluZykpIHsKKwkJaSA9IGF0b2koc3RyaW5nKTsKKwkJaWYgKGkgPj0gTlNJRykgeworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiBpOworCX0KKworCWZvciAoIGkgPSBtaW5zaWcgOyBpIDwgTlNJRyA7IGkrKyApIHsKKwkJaWYgKCBzeXNfc2lnYWJicmV2W2ldICYmCisJCSAgICAgIXN0cmNhc2VjbXAoc3RyaW5nLCBzeXNfc2lnYWJicmV2W2ldKSApCisJCQlyZXR1cm4gaTsKKwl9CisKKyNpZmRlZiBTSUdSVE1JTgorCWlmICggIXN0cm5jYXNlY21wKHN0cmluZywgIlJUTUlOIiwgNSkgKSB7CisJCWNoYXIgKmVwOworCisJCWlmICggc3RyaW5nWzVdICYmIHN0cmluZ1s1XSAhPSAnKycgKQorCQkJcmV0dXJuIC0xOworCQlpID0gU0lHUlRNSU4gKyBzdHJ0b2woc3RyaW5nKzUsICZlcCwgMTApOworCQlpZiAoICplcCB8fCBpIDwgU0lHUlRNSU4gfHwgaSA+IFNJR1JUTUFYICkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIGk7CisJfQorCisJaWYgKCAhc3RybmNhc2VjbXAoc3RyaW5nLCAiUlRNQVgiLCA1KSApIHsKKwkJY2hhciAqZXA7CisKKwkJaWYgKCBzdHJpbmdbNV0gJiYgc3RyaW5nWzVdICE9ICctJyApCisJCQlyZXR1cm4gLTE7CisJCWkgPSBTSUdSVE1BWCArIHN0cnRvbChzdHJpbmcrNSwgJmVwLCAxMCk7CisJCWlmICggKmVwIHx8IGkgPCBTSUdSVE1JTiB8fCBpID4gU0lHUlRNQVggKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gaTsKKwl9CisjZW5kaWYKKworCXJldHVybiAtMTsKK30KKworLyoKKyAqIEh1bWFuLXJlYWRhYmxlIHNpZ25hbCBuYW1lCisgKi8KK2NvbnN0IGNoYXIgKgorc2lnbmFsX25hbWUoaW50IHNpZykKK3sKKwlzdGF0aWMgY2hhciBidWZbNjRdOworCisJaWYgKCBzaWcgPCAwIHx8IHNpZyA+PSBOU0lHICkgeworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCBzeXNfc2lnYWJicmV2W3NpZ10gKSB7CisJCXJldHVybiBzeXNfc2lnYWJicmV2W3NpZ107CisjaWZkZWYgU0lHUlRNSU4KKwl9IGVsc2UgaWYgKCBzaWcgPj0gU0lHUlRNSU4gJiYgc2lnIDw9IFNJR1JUTUFYICkgeworCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJSVE1JTislZCIsIHNpZy1TSUdSVE1JTik7CisJCXJldHVybiBidWY7CisjZW5kaWYKKwl9IGVsc2UgeworCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZCIsIHNpZyk7CisJCXJldHVybiBidWY7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvdHJhcC5oIGIvdXNyL2Rhc2gvdHJhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWRlNWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZGFzaC90cmFwLmgKQEAgLTAsMCArMSw1MiBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUKKyAqCUhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0cmFwLmgJOC4zIChCZXJrZWxleSkgNi81Lzk1CisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCitleHRlcm4gY2hhciAqdHJhcFtdOworZXh0ZXJuIGNoYXIgZ290c2lnW107CitleHRlcm4gdm9sYXRpbGUgc2lnX2F0b21pY190IHBlbmRpbmdzaWdzOworCitpbnQgdHJhcGNtZChpbnQsIGNoYXIgKiopOwordm9pZCBjbGVhcl90cmFwcyh2b2lkKTsKK3ZvaWQgc2V0c2lnbmFsKGludCk7Cit2b2lkIGlnbm9yZXNpZyhpbnQpOwordm9pZCBvbnNpZyhpbnQpOworaW50IGRvdHJhcCh2b2lkKTsKK3ZvaWQgc2V0aW50ZXJhY3RpdmUoaW50KTsKK3ZvaWQgZXhpdHNoZWxsKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworaW50IGRlY29kZV9zaWduYWwoY29uc3QgY2hhciAqLCBpbnQpOworY29uc3QgY2hhciAqc2lnbmFsX25hbWUoaW50KTsKZGlmZiAtLWdpdCBhL3Vzci9kYXNoL3Zhci5jIGIvdXNyL2Rhc2gvdmFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2M2RjNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9kYXNoL3Zhci5jCkBAIC0wLDAgKzEsNjc2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNQorICoJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1Pi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2VubmV0aCBBbG1xdWlzdC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHBhdGhzLmg+CisKKy8qCisgKiBTaGVsbCB2YXJpYWJsZXMuCisgKi8KKworI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5jbHVkZSAiZXhwYW5kLmgiCisjaW5jbHVkZSAibm9kZXMuaCIJLyogZm9yIG90aGVyIGhlYWRlcnMgKi8KKyNpbmNsdWRlICJldmFsLmgiCS8qIGRlZmluZXMgY21kZW52aXJvbiAqLworI2luY2x1ZGUgImV4ZWMuaCIKKyNpbmNsdWRlICJzeW50YXguaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAibWFpbC5oIgorI2luY2x1ZGUgInZhci5oIgorI2luY2x1ZGUgIm1lbWFsbG9jLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJteXN0cmluZy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgInNob3cuaCIKKyNpZm5kZWYgU01BTEwKKyNpbmNsdWRlICJteWhpc3RlZGl0LmgiCisjZW5kaWYKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworCisjZGVmaW5lIFZUQUJTSVpFIDM5CisKKworc3RydWN0IGxvY2FsdmFyICpsb2NhbHZhcnM7CisKK2NvbnN0IGNoYXIgZGVmcGF0aHZhcltdID0KKwkiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iOworI2lmZGVmIElGU19CUk9LRU4KK2NvbnN0IGNoYXIgZGVmaWZzdmFyW10gPSAiSUZTPSBcdFxuIjsKKyNlbHNlCitjb25zdCBjaGFyIGRlZmlmc1tdID0gIiBcdFxuIjsKKyNlbmRpZgorCitzdHJ1Y3QgdmFyIHZhcmluaXRbXSA9IHsKKyNpZiBBVFRZCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsCSJBVFRZXDAiLAkwIH0sCisjZW5kaWYKKyNpZmRlZiBJRlNfQlJPS0VOCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRCwJCWRlZmlmc3ZhciwJMCB9LAorI2Vsc2UKKwl7IDAsCVZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwJIklGU1wwIiwJMCB9LAorI2VuZGlmCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsCSJNQUlMXDAiLAljaGFuZ2VtYWlsIH0sCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsCSJNQUlMUEFUSFwwIiwJY2hhbmdlbWFpbCB9LAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUQsCQlkZWZwYXRodmFyLAljaGFuZ2VwYXRoIH0sCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRCwJCSJQUzE9JCAiLAkwIH0sCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRCwJCSJQUzI9PiAiLAkwIH0sCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRCwJCSJQUzQ9KyAiLAkwIH0sCisJeyAwLAlWU1RSRklYRUR8VlRFWFRGSVhFRCwJCSJPUFRJTkQ9MSIsCWdldG9wdHNyZXNldCB9LAorI2lmbmRlZiBTTUFMTAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VULAkiVEVSTVwwIiwJMCB9LAorCXsgMCwJVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VULAkiSElTVFNJWkVcMCIsCXNldGhpc3RzaXplIH0sCisjZW5kaWYKK307CisKK1NUQVRJQyBzdHJ1Y3QgdmFyICp2YXJ0YWJbVlRBQlNJWkVdOworCitTVEFUSUMgdm9pZCBta2xvY2FsKGNoYXIgKik7CitTVEFUSUMgc3RydWN0IHZhciAqKmhhc2h2YXIoY29uc3QgY2hhciAqKTsKK1NUQVRJQyBpbnQgdnBjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworU1RBVElDIHN0cnVjdCB2YXIgKipmaW5kdmFyKHN0cnVjdCB2YXIgKiosIGNvbnN0IGNoYXIgKik7CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSB2YXJhYmxlIHN5bWJvbCB0YWJsZXMgYW5kIGltcG9ydCB0aGUgZW52aXJvbm1lbnQKKyAqLworCisjaWZkZWYgbWtpbml0CitJTkNMVURFIDx1bmlzdGQuaD4KK0lOQ0xVREUgPHN5cy90eXBlcy5oPgorSU5DTFVERSA8c3lzL3N0YXQuaD4KK0lOQ0xVREUgImNkLmgiCitJTkNMVURFICJvdXRwdXQuaCIKK0lOQ0xVREUgInZhci5oIgorTUtJTklUIGNoYXIgKiplbnZpcm9uOworSU5JVCB7CisJY2hhciAqKmVudnA7CisJc3RhdGljIGNoYXIgcHBpZFszMl0gPSAiUFBJRD0iOworCWNvbnN0IGNoYXIgKnA7CisJc3RydWN0IHN0YXQgc3QxLCBzdDI7CisKKwlpbml0dmFyKCk7CisJZm9yIChlbnZwID0gZW52aXJvbiA7ICplbnZwIDsgZW52cCsrKSB7CisJCWlmIChzdHJjaHIoKmVudnAsICc9JykpIHsKKwkJCXNldHZhcmVxKCplbnZwLCBWRVhQT1JUfFZURVhURklYRUQpOworCQl9CisJfQorCisJZm10c3RyKHBwaWQgKyA1LCBzaXplb2YocHBpZCkgLSA1LCAiJWxkIiwgKGxvbmcpIGdldHBwaWQoKSk7CisJc2V0dmFyZXEocHBpZCwgVlRFWFRGSVhFRCk7CisKKwlwID0gbG9va3VwdmFyKCJQV0QiKTsKKwlpZiAocCkKKwkJaWYgKCpwICE9ICcvJyB8fCBzdGF0KHAsICZzdDEpIHx8IHN0YXQoIi4iLCAmc3QyKSB8fAorCQkgICAgc3QxLnN0X2RldiAhPSBzdDIuc3RfZGV2IHx8IHN0MS5zdF9pbm8gIT0gc3QyLnN0X2lubykKKwkJCXAgPSAwOworCXNldHB3ZChwLCAwKTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIGJ1aWx0aW4gdmFyaWFibGVzLiAgSXQgaXMgY2FsbGVkIHdoZW4gdGhlCisgKiBzaGVsbCBpcyBpbml0aWFsaXplZC4KKyAqLworCit2b2lkCitpbml0dmFyKHZvaWQpCit7CisJc3RydWN0IHZhciAqdnA7CisJc3RydWN0IHZhciAqZW5kOworCXN0cnVjdCB2YXIgKip2cHA7CisKKwl2cCA9IHZhcmluaXQ7CisJZW5kID0gdnAgKyBzaXplb2YodmFyaW5pdCkgLyBzaXplb2YodmFyaW5pdFswXSk7CisJZG8geworCQl2cHAgPSBoYXNodmFyKHZwLT50ZXh0KTsKKwkJdnAtPm5leHQgPSAqdnBwOworCQkqdnBwID0gdnA7CisJfSB3aGlsZSAoKyt2cCA8IGVuZCk7CisJLyoKKwkgKiBQUzEgZGVwZW5kcyBvbiB1aWQKKwkgKi8KKwlpZiAoIWdldGV1aWQoKSkKKwkJdnBzMS50ZXh0ID0gIlBTMT0jICI7Cit9CisKKy8qCisgKiBTYWZlIHZlcnNpb24gb2Ygc2V0dmFyLCByZXR1cm5zIDEgb24gc3VjY2VzcyAwIG9uIGZhaWx1cmUuCisgKi8KKworaW50CitzZXR2YXJzYWZlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCwgaW50IGZsYWdzKQoreworCWludCBlcnI7CisJdm9sYXRpbGUgaW50IHNhdmVpbnQ7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXIgPSBoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCisJU0FWRUlOVChzYXZlaW50KTsKKwlpZiAoc2V0am1wKGptcGxvYy5sb2MpKQorCQllcnIgPSAxOworCWVsc2UgeworCQloYW5kbGVyID0gJmptcGxvYzsKKwkJc2V0dmFyKG5hbWUsIHZhbCwgZmxhZ3MpOworCQllcnIgPSAwOworCX0KKwloYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisJUkVTVE9SRUlOVChzYXZlaW50KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLiAgVGhlIGZsYWdzIGFyZ3VtZW50IGlzIG9yZWQgd2l0aCB0aGUKKyAqIGZsYWdzIG9mIHRoZSB2YXJpYWJsZS4gIElmIHZhbCBpcyBOVUxMLCB0aGUgdmFyaWFibGUgaXMgdW5zZXQuCisgKi8KKwordm9pZAorc2V0dmFyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCwgaW50IGZsYWdzKQoreworCWNoYXIgKnAsICpxOworCXNpemVfdCBuYW1lbGVuOworCWNoYXIgKm5hbWVlcTsKKwlzaXplX3QgdmFsbGVuOworCisJcSA9IGVuZG9mbmFtZShuYW1lKTsKKwlwID0gc3RyY2hybnVsKHEsICc9Jyk7CisJbmFtZWxlbiA9IHAgLSBuYW1lOworCWlmICghbmFtZWxlbiB8fCBwICE9IHEpCisJCXNoX2Vycm9yKCIlLipzOiBiYWQgdmFyaWFibGUgbmFtZSIsIG5hbWVsZW4sIG5hbWUpOworCXZhbGxlbiA9IDA7CisJaWYgKHZhbCA9PSBOVUxMKSB7CisJCWZsYWdzIHw9IFZVTlNFVDsKKwl9IGVsc2UgeworCQl2YWxsZW4gPSBzdHJsZW4odmFsKTsKKwl9CisJSU5UT0ZGOworCXAgPSBtZW1wY3B5KG5hbWVlcSA9IGNrbWFsbG9jKG5hbWVsZW4gKyB2YWxsZW4gKyAyKSwgbmFtZSwgbmFtZWxlbik7CisJaWYgKHZhbCkgeworCQkqcCsrID0gJz0nOworCQlwID0gbWVtcGNweShwLCB2YWwsIHZhbGxlbik7CisJfQorCSpwID0gJ1wwJzsKKwlzZXR2YXJlcShuYW1lZXEsIGZsYWdzIHwgVk5PU0FWRSk7CisJSU5UT047Cit9CisKKworCisvKgorICogU2FtZSBhcyBzZXR2YXIgZXhjZXB0IHRoYXQgdGhlIHZhcmlhYmxlIGFuZCB2YWx1ZSBhcmUgcGFzc2VkIGluCisgKiB0aGUgZmlyc3QgYXJndW1lbnQgYXMgbmFtZT12YWx1ZS4gIFNpbmNlIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsCisgKiBiZSBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIHRhYmxlLCBpdCBzaG91bGQgbm90IGJlIGEgc3RyaW5nIHRoYXQKKyAqIHdpbGwgZ28gYXdheS4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCisKK3ZvaWQKK3NldHZhcmVxKGNoYXIgKnMsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdmFyICp2cCwgKip2cHA7CisKKwl2cHAgPSBoYXNodmFyKHMpOworCWZsYWdzIHw9IChWRVhQT1JUICYgKCgodW5zaWduZWQpICgxIC0gYWZsYWcpKSAtIDEpKTsKKwl2cCA9ICpmaW5kdmFyKHZwcCwgcyk7CisJaWYgKHZwKSB7CisJCWlmICh2cC0+ZmxhZ3MgJiBWUkVBRE9OTFkpIHsKKwkJCWNvbnN0IGNoYXIgKm47CisKKwkJCWlmIChmbGFncyAmIFZOT1NBVkUpCisJCQkJZnJlZShzKTsKKwkJCW4gPSB2cC0+dGV4dDsKKwkJCXNoX2Vycm9yKCIlLipzOiBpcyByZWFkIG9ubHkiLCBzdHJjaHJudWwobiwgJz0nKSAtIG4sCisJCQkJIG4pOworCQl9CisKKwkJaWYgKGZsYWdzICYgVk5PU0VUKQorCQkJcmV0dXJuOworCisJCWlmICh2cC0+ZnVuYyAmJiAoZmxhZ3MgJiBWTk9GVU5DKSA9PSAwKQorCQkJKCp2cC0+ZnVuYykoc3RyY2hybnVsKHMsICc9JykgKyAxKTsKKworCQlpZiAoKHZwLT5mbGFncyAmIChWVEVYVEZJWEVEfFZTVEFDSykpID09IDApCisJCQlja2ZyZWUodnAtPnRleHQpOworCisJCWZsYWdzIHw9IHZwLT5mbGFncyAmIH4oVlRFWFRGSVhFRHxWU1RBQ0t8Vk5PU0FWRXxWVU5TRVQpOworCX0gZWxzZSB7CisJCWlmIChmbGFncyAmIFZOT1NFVCkKKwkJCXJldHVybjsKKwkJLyogbm90IGZvdW5kICovCisJCXZwID0gY2ttYWxsb2Moc2l6ZW9mICgqdnApKTsKKwkJdnAtPm5leHQgPSAqdnBwOworCQl2cC0+ZnVuYyA9IE5VTEw7CisJCSp2cHAgPSB2cDsKKwl9CisJaWYgKCEoZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0t8Vk5PU0FWRSkpKQorCQlzID0gc2F2ZXN0cihzKTsKKwl2cC0+dGV4dCA9IHM7CisJdnAtPmZsYWdzID0gZmxhZ3M7Cit9CisKKworCisvKgorICogUHJvY2VzcyBhIGxpbmtlZCBsaXN0IG9mIHZhcmlhYmxlIGFzc2lnbm1lbnRzLgorICovCisKK3ZvaWQKK2xpc3RzZXR2YXIoc3RydWN0IHN0cmxpc3QgKmxpc3QsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqbHA7CisKKwlscCA9IGxpc3Q7CisJaWYgKCFscCkKKwkJcmV0dXJuOworCUlOVE9GRjsKKwlkbyB7CisJCXNldHZhcmVxKGxwLT50ZXh0LCBmbGFncyk7CisJfSB3aGlsZSAoKGxwID0gbHAtPm5leHQpKTsKKwlJTlRPTjsKK30KKworCisvKgorICogRmluZCB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4gIFJldHVybnMgTlVMTCBpZiBub3Qgc2V0LgorICovCisKK2NoYXIgKgorbG9va3VwdmFyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHZhciAqdjsKKworCWlmICgodiA9ICpmaW5kdmFyKGhhc2h2YXIobmFtZSksIG5hbWUpKSAmJiAhKHYtPmZsYWdzICYgVlVOU0VUKSkgeworCQlyZXR1cm4gc3RyY2hybnVsKHYtPnRleHQsICc9JykgKyAxOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisKKy8qCisgKiBTZWFyY2ggdGhlIGVudmlyb25tZW50IG9mIGEgYnVpbHRpbiBjb21tYW5kLgorICovCisKK2NoYXIgKgorYmx0aW5sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisKKwlmb3IgKHNwID0gY21kZW52aXJvbiA7IHNwIDsgc3AgPSBzcC0+bmV4dCkgeworCQlpZiAodmFyZXF1YWwoc3AtPnRleHQsIG5hbWUpKQorCQkJcmV0dXJuIHN0cmNocm51bChzcC0+dGV4dCwgJz0nKSArIDE7CisJfQorCXJldHVybiBsb29rdXB2YXIobmFtZSk7Cit9CisKKworCisvKgorICogR2VuZXJhdGUgYSBsaXN0IG9mIHZhcmlhYmxlcyBzYXRpc2Z5aW5nIHRoZSBnaXZlbiBjb25kaXRpb25zLgorICovCisKK2NoYXIgKioKK2xpc3R2YXJzKGludCBvbiwgaW50IG9mZiwgY2hhciAqKiplbmQpCit7CisJc3RydWN0IHZhciAqKnZwcDsKKwlzdHJ1Y3QgdmFyICp2cDsKKwljaGFyICoqZXA7CisJaW50IG1hc2s7CisKKwlTVEFSVFNUQUNLU1RSKGVwKTsKKwl2cHAgPSB2YXJ0YWI7CisJbWFzayA9IG9uIHwgb2ZmOworCWRvIHsKKwkJZm9yICh2cCA9ICp2cHAgOyB2cCA7IHZwID0gdnAtPm5leHQpCisJCQlpZiAoKHZwLT5mbGFncyAmIG1hc2spID09IG9uKSB7CisJCQkJaWYgKGVwID09IHN0YWNrc3RyZW5kKCkpCisJCQkJCWVwID0gZ3Jvd3N0YWNrc3RyKCk7CisJCQkJKmVwKysgPSAoY2hhciAqKSB2cC0+dGV4dDsKKwkJCX0KKwl9IHdoaWxlICgrK3ZwcCA8IHZhcnRhYiArIFZUQUJTSVpFKTsKKwlpZiAoZXAgPT0gc3RhY2tzdHJlbmQoKSkKKwkJZXAgPSBncm93c3RhY2tzdHIoKTsKKwlpZiAoZW5kKQorCQkqZW5kID0gZXA7CisJKmVwKysgPSBOVUxMOworCXJldHVybiBncmFic3RhY2tzdHIoZXApOworfQorCisKKworLyoKKyAqIFBPU0lYIHJlcXVpcmVzIHRoYXQgJ3NldCcgKGJ1dCBub3QgZXhwb3J0IG9yIHJlYWRvbmx5KSBvdXRwdXQgdGhlCisgKiB2YXJpYWJsZXMgaW4gbGV4aWNvZ3JhcGhpYyBvcmRlciAtIGJ5IHRoZSBsb2NhbGUncyBjb2xsYXRpbmcgb3JkZXIgKHNpZ2gpLgorICogTWF5YmUgd2UgY291bGQga2VlcCB0aGVtIGluIGFuIG9yZGVyZWQgYmFsYW5jZWQgYmluYXJ5IHRyZWUKKyAqIGluc3RlYWQgb2YgaGFzaGVkIGxpc3RzLgorICogRm9yIG5vdyBqdXN0IHJvbGwgJ2VtIHRocm91Z2ggcXNvcnQgZm9yIHByaW50aW5nLi4uCisgKi8KKworaW50CitzaG93dmFycyhjb25zdCBjaGFyICpwcmVmaXgsIGludCBvbiwgaW50IG9mZikKK3sKKwljb25zdCBjaGFyICpzZXA7CisJY2hhciAqKmVwLCAqKmVwZW5kOworCisJZXAgPSBsaXN0dmFycyhvbiwgb2ZmLCAmZXBlbmQpOworCXFzb3J0KGVwLCBlcGVuZCAtIGVwLCBzaXplb2YoY2hhciAqKSwgdnBjbXApOworCisJc2VwID0gKnByZWZpeCA/IHNwY3N0ciA6IHByZWZpeDsKKworCWZvciAoOyBlcCA8IGVwZW5kOyBlcCsrKSB7CisJCWNvbnN0IGNoYXIgKnA7CisJCWNvbnN0IGNoYXIgKnE7CisKKwkJcCA9IHN0cmNocm51bCgqZXAsICc9Jyk7CisJCXEgPSBudWxsc3RyOworCQlpZiAoKnApCisJCQlxID0gc2luZ2xlX3F1b3RlKCsrcCk7CisKKwkJb3V0MWZtdCgiJXMlcyUuKnMlc1xuIiwgcHJlZml4LCBzZXAsIChpbnQpKHAgLSAqZXApLCAqZXAsIHEpOworCX0KKworCXJldHVybiAwOworfQorCisKKworLyoKKyAqIFRoZSBleHBvcnQgYW5kIHJlYWRvbmx5IGNvbW1hbmRzLgorICovCisKK2ludAorZXhwb3J0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdmFyICp2cDsKKwljaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqKmFwdHI7CisJaW50IGZsYWcgPSBhcmd2WzBdWzBdID09ICdyJz8gVlJFQURPTkxZIDogVkVYUE9SVDsKKwlpbnQgbm90cDsKKworCW5vdHAgPSBuZXh0b3B0KCJwIikgLSAncCc7CisJaWYgKG5vdHAgJiYgKChuYW1lID0gKihhcHRyID0gYXJncHRyKSkpKSB7CisJCWRvIHsKKwkJCWlmICgocCA9IHN0cmNocihuYW1lLCAnPScpKSAhPSBOVUxMKSB7CisJCQkJcCsrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHZwID0gKmZpbmR2YXIoaGFzaHZhcihuYW1lKSwgbmFtZSkpKSB7CisJCQkJCXZwLT5mbGFncyB8PSBmbGFnOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlzZXR2YXIobmFtZSwgcCwgZmxhZyk7CisJCX0gd2hpbGUgKChuYW1lID0gKisrYXB0cikgIT0gTlVMTCk7CisJfSBlbHNlIHsKKwkJc2hvd3ZhcnMoYXJndlswXSwgZmxhZywgMCk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGUgImxvY2FsIiBjb21tYW5kLgorICovCisKK2ludAorbG9jYWxjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm5hbWU7CisKKwlhcmd2ID0gYXJncHRyOworCXdoaWxlICgobmFtZSA9ICphcmd2KyspICE9IE5VTEwpIHsKKwkJbWtsb2NhbChuYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIE1ha2UgYSB2YXJpYWJsZSBhIGxvY2FsIHZhcmlhYmxlLiAgV2hlbiBhIHZhcmlhYmxlIGlzIG1hZGUgbG9jYWwsIGl0J3MKKyAqIHZhbHVlIGFuZCBmbGFncyBhcmUgc2F2ZWQgaW4gYSBsb2NhbHZhciBzdHJ1Y3R1cmUuICBUaGUgc2F2ZWQgdmFsdWVzCisgKiB3aWxsIGJlIHJlc3RvcmVkIHdoZW4gdGhlIHNoZWxsIGZ1bmN0aW9uIHJldHVybnMuICBXZSBoYW5kbGUgdGhlIG5hbWUKKyAqICItIiBhcyBhIHNwZWNpYWwgY2FzZS4KKyAqLworCitTVEFUSUMgdm9pZAorbWtsb2NhbChjaGFyICpuYW1lKQoreworCXN0cnVjdCBsb2NhbHZhciAqbHZwOworCXN0cnVjdCB2YXIgKip2cHA7CisJc3RydWN0IHZhciAqdnA7CisKKwlJTlRPRkY7CisJbHZwID0gY2ttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbG9jYWx2YXIpKTsKKwlpZiAobmFtZVswXSA9PSAnLScgJiYgbmFtZVsxXSA9PSAnXDAnKSB7CisJCWNoYXIgKnA7CisJCXAgPSBja21hbGxvYyhzaXplb2Yob3B0bGlzdCkpOworCQlsdnAtPnRleHQgPSBtZW1jcHkocCwgb3B0bGlzdCwgc2l6ZW9mKG9wdGxpc3QpKTsKKwkJdnAgPSBOVUxMOworCX0gZWxzZSB7CisJCWNoYXIgKmVxOworCisJCXZwcCA9IGhhc2h2YXIobmFtZSk7CisJCXZwID0gKmZpbmR2YXIodnBwLCBuYW1lKTsKKwkJZXEgPSBzdHJjaHIobmFtZSwgJz0nKTsKKwkJaWYgKHZwID09IE5VTEwpIHsKKwkJCWlmIChlcSkKKwkJCQlzZXR2YXJlcShuYW1lLCBWU1RSRklYRUQpOworCQkJZWxzZQorCQkJCXNldHZhcihuYW1lLCBOVUxMLCBWU1RSRklYRUQpOworCQkJdnAgPSAqdnBwOwkvKiB0aGUgbmV3IHZhcmlhYmxlICovCisJCQlsdnAtPmZsYWdzID0gVlVOU0VUOworCQl9IGVsc2UgeworCQkJbHZwLT50ZXh0ID0gdnAtPnRleHQ7CisJCQlsdnAtPmZsYWdzID0gdnAtPmZsYWdzOworCQkJdnAtPmZsYWdzIHw9IFZTVFJGSVhFRHxWVEVYVEZJWEVEOworCQkJaWYgKGVxKQorCQkJCXNldHZhcmVxKG5hbWUsIDApOworCQl9CisJfQorCWx2cC0+dnAgPSB2cDsKKwlsdnAtPm5leHQgPSBsb2NhbHZhcnM7CisJbG9jYWx2YXJzID0gbHZwOworCUlOVE9OOworfQorCisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYSBmdW5jdGlvbiByZXR1cm5zLgorICogSW50ZXJydXB0cyBtdXN0IGJlIG9mZi4KKyAqLworCit2b2lkCitwb3Bsb2NhbHZhcnModm9pZCkKK3sKKwlzdHJ1Y3QgbG9jYWx2YXIgKmx2cDsKKwlzdHJ1Y3QgdmFyICp2cDsKKworCXdoaWxlICgobHZwID0gbG9jYWx2YXJzKSAhPSBOVUxMKSB7CisJCWxvY2FsdmFycyA9IGx2cC0+bmV4dDsKKwkJdnAgPSBsdnAtPnZwOworCQlUUkFDRSgoInBvcGxvY2FsdmFyICVzIiwgdnAgPyB2cC0+dGV4dCA6ICItIikpOworCQlpZiAodnAgPT0gTlVMTCkgewkvKiAkLSBzYXZlZCAqLworCQkJbWVtY3B5KG9wdGxpc3QsIGx2cC0+dGV4dCwgc2l6ZW9mKG9wdGxpc3QpKTsKKwkJCWNrZnJlZShsdnAtPnRleHQpOworCQkJb3B0c2NoYW5nZWQoKTsKKwkJfSBlbHNlIGlmICgobHZwLT5mbGFncyAmIChWVU5TRVR8VlNUUkZJWEVEKSkgPT0gVlVOU0VUKSB7CisJCQl1bnNldHZhcih2cC0+dGV4dCk7CisJCX0gZWxzZSB7CisJCQlpZiAodnAtPmZ1bmMpCisJCQkJKCp2cC0+ZnVuYykoc3RyY2hybnVsKGx2cC0+dGV4dCwgJz0nKSArIDEpOworCQkJaWYgKCh2cC0+ZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0spKSA9PSAwKQorCQkJCWNrZnJlZSh2cC0+dGV4dCk7CisJCQl2cC0+ZmxhZ3MgPSBsdnAtPmZsYWdzOworCQkJdnAtPnRleHQgPSBsdnAtPnRleHQ7CisJCX0KKwkJY2tmcmVlKGx2cCk7CisJfQorfQorCisKKy8qCisgKiBUaGUgdW5zZXQgYnVpbHRpbiBjb21tYW5kLiAgV2UgdW5zZXQgdGhlIGZ1bmN0aW9uIGJlZm9yZSB3ZSB1bnNldCB0aGUKKyAqIHZhcmlhYmxlIHRvIGFsbG93IGEgZnVuY3Rpb24gdG8gYmUgdW5zZXQgd2hlbiB0aGVyZSBpcyBhIHJlYWRvbmx5IHZhcmlhYmxlCisgKiB3aXRoIHRoZSBzYW1lIG5hbWUuCisgKi8KKworaW50Cit1bnNldGNtZChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKmFwOworCWludCBpOworCWludCBmbGFnID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXdoaWxlICgoaSA9IG5leHRvcHQoInZmIikpICE9ICdcMCcpIHsKKwkJZmxhZyA9IGk7CisJfQorCisJZm9yIChhcCA9IGFyZ3B0cjsgKmFwIDsgYXArKykgeworCQlpZiAoZmxhZyAhPSAnZicpIHsKKwkJCWkgPSB1bnNldHZhcigqYXApOworCQkJcmV0IHw9IGk7CisJCQlpZiAoIShpICYgMikpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZsYWcgIT0gJ3YnKQorCQkJdW5zZXRmdW5jKCphcCk7CisJfQorCXJldHVybiByZXQgJiAxOworfQorCisKKy8qCisgKiBVbnNldCB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlLgorICovCisKK2ludAordW5zZXR2YXIoY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgdmFyICoqdnBwOworCXN0cnVjdCB2YXIgKnZwOworCWludCByZXR2YWw7CisKKwl2cHAgPSBmaW5kdmFyKGhhc2h2YXIocyksIHMpOworCXZwID0gKnZwcDsKKwlyZXR2YWwgPSAyOworCWlmICh2cCkgeworCQlpbnQgZmxhZ3MgPSB2cC0+ZmxhZ3M7CisKKwkJcmV0dmFsID0gMTsKKwkJaWYgKGZsYWdzICYgVlJFQURPTkxZKQorCQkJZ290byBvdXQ7CisJCWlmIChmbGFncyAmIFZVTlNFVCkKKwkJCWdvdG8gb2s7CisJCWlmICgoZmxhZ3MgJiBWU1RSRklYRUQpID09IDApIHsKKwkJCUlOVE9GRjsKKwkJCWlmICgoZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0spKSA9PSAwKQorCQkJCWNrZnJlZSh2cC0+dGV4dCk7CisJCQkqdnBwID0gdnAtPm5leHQ7CisJCQlja2ZyZWUodnApOworCQkJSU5UT047CisJCX0gZWxzZSB7CisJCQlzZXR2YXIocywgMCwgMCk7CisJCQl2cC0+ZmxhZ3MgJj0gflZFWFBPUlQ7CisJCX0KK29rOgorCQlyZXR2YWwgPSAwOworCX0KKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKworCisvKgorICogRmluZCB0aGUgYXBwcm9wcmlhdGUgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgZnJvbSB0aGUgbmFtZS4KKyAqLworCitTVEFUSUMgc3RydWN0IHZhciAqKgoraGFzaHZhcihjb25zdCBjaGFyICpwKQoreworCXVuc2lnbmVkIGludCBoYXNodmFsOworCisJaGFzaHZhbCA9ICgodW5zaWduZWQgY2hhcikgKnApIDw8IDQ7CisJd2hpbGUgKCpwICYmICpwICE9ICc9JykKKwkJaGFzaHZhbCArPSAodW5zaWduZWQgY2hhcikgKnArKzsKKwlyZXR1cm4gJnZhcnRhYltoYXNodmFsICUgVlRBQlNJWkVdOworfQorCisKKworLyoKKyAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVwIHRvIHRoZSBmaXJzdCA9IG9yICdcMCcuICBUaGUgZmlyc3QKKyAqIHN0cmluZyBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgJz0nOyB0aGUgc2Vjb25kIG1heSBiZSB0ZXJtaW5hdGVkIGJ5CisgKiBlaXRoZXIgJz0nIG9yICdcMCcuCisgKi8KKworaW50Cit2YXJjbXAoY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqcSkKK3sKKwlpbnQgYywgZDsKKworCXdoaWxlICgoYyA9ICpwKSA9PSAoZCA9ICpxKSkgeworCQlpZiAoIWMgfHwgYyA9PSAnPScpCisJCQlnb3RvIG91dDsKKwkJcCsrOworCQlxKys7CisJfQorCWlmIChjID09ICc9JykKKwkJYyA9IDA7CisJaWYgKGQgPT0gJz0nKQorCQlkID0gMDsKK291dDoKKwlyZXR1cm4gYyAtIGQ7Cit9CisKK1NUQVRJQyBpbnQKK3ZwY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIHZhcmNtcCgqKGNvbnN0IGNoYXIgKiopYSwgKihjb25zdCBjaGFyICoqKWIpOworfQorCitTVEFUSUMgc3RydWN0IHZhciAqKgorZmluZHZhcihzdHJ1Y3QgdmFyICoqdnBwLCBjb25zdCBjaGFyICpuYW1lKQoreworCWZvciAoOyAqdnBwOyB2cHAgPSAmKCp2cHApLT5uZXh0KSB7CisJCWlmICh2YXJlcXVhbCgoKnZwcCktPnRleHQsIG5hbWUpKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gdnBwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2Rhc2gvdmFyLmggYi91c3IvZGFzaC92YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MyY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2Rhc2gvdmFyLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1CisgKglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdmFyLmgJOC4yIChCZXJrZWxleSkgNS80Lzk1CisgKi8KKworLyoKKyAqIFNoZWxsIHZhcmlhYmxlcy4KKyAqLworCisvKiBmbGFncyAqLworI2RlZmluZSBWRVhQT1JUCQkweDAxCS8qIHZhcmlhYmxlIGlzIGV4cG9ydGVkICovCisjZGVmaW5lIFZSRUFET05MWQkweDAyCS8qIHZhcmlhYmxlIGNhbm5vdCBiZSBtb2RpZmllZCAqLworI2RlZmluZSBWU1RSRklYRUQJMHgwNAkvKiB2YXJpYWJsZSBzdHJ1Y3QgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgVlRFWFRGSVhFRAkweDA4CS8qIHRleHQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgVlNUQUNLCQkweDEwCS8qIHRleHQgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayAqLworI2RlZmluZSBWVU5TRVQJCTB4MjAJLyogdGhlIHZhcmlhYmxlIGlzIG5vdCBzZXQgKi8KKyNkZWZpbmUgVk5PRlVOQwkJMHg0MAkvKiBkb24ndCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLworI2RlZmluZSBWTk9TRVQJCTB4ODAJLyogZG8gbm90IHNldCB2YXJpYWJsZSAtIGp1c3QgcmVhZG9ubHkgdGVzdCAqLworI2RlZmluZSBWTk9TQVZFCQkweDEwMAkvKiB3aGVuIHRleHQgaXMgb24gdGhlIGhlYXAgYmVmb3JlIHNldHZhcmVxICovCisKKworc3RydWN0IHZhciB7CisJc3RydWN0IHZhciAqbmV4dDsJCS8qIG5leHQgZW50cnkgaW4gaGFzaCBsaXN0ICovCisJaW50IGZsYWdzOwkJCS8qIGZsYWdzIGFyZSBkZWZpbmVkIGFib3ZlICovCisJY29uc3QgY2hhciAqdGV4dDsJCS8qIG5hbWU9dmFsdWUgKi8KKwl2b2lkICgqZnVuYykoY29uc3QgY2hhciAqKTsKKwkJCQkJLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gICovCisJCQkJCS8qIHRoZSB2YXJpYWJsZSBnZXRzIHNldC91bnNldCAqLworfTsKKworCitzdHJ1Y3QgbG9jYWx2YXIgeworCXN0cnVjdCBsb2NhbHZhciAqbmV4dDsJCS8qIG5leHQgbG9jYWwgdmFyaWFibGUgaW4gbGlzdCAqLworCXN0cnVjdCB2YXIgKnZwOwkJCS8qIHRoZSB2YXJpYWJsZSB0aGF0IHdhcyBtYWRlIGxvY2FsICovCisJaW50IGZsYWdzOwkJCS8qIHNhdmVkIGZsYWdzICovCisJY29uc3QgY2hhciAqdGV4dDsJCS8qIHNhdmVkIHRleHQgKi8KK307CisKKworZXh0ZXJuIHN0cnVjdCBsb2NhbHZhciAqbG9jYWx2YXJzOworZXh0ZXJuIHN0cnVjdCB2YXIgdmFyaW5pdFtdOworCisjaWYgQVRUWQorI2RlZmluZSB2YXR0eSB2YXJpbml0WzBdCisjZGVmaW5lIHZpZnMgdmFyaW5pdFsxXQorI2Vsc2UKKyNkZWZpbmUgdmlmcyB2YXJpbml0WzBdCisjZW5kaWYKKyNkZWZpbmUgdm1haWwgKCZ2aWZzKVsxXQorI2RlZmluZSB2bXBhdGggKCZ2bWFpbClbMV0KKyNkZWZpbmUgdnBhdGggKCZ2bXBhdGgpWzFdCisjZGVmaW5lIHZwczEgKCZ2cGF0aClbMV0KKyNkZWZpbmUgdnBzMiAoJnZwczEpWzFdCisjZGVmaW5lIHZwczQgKCZ2cHMyKVsxXQorI2RlZmluZSB2b3B0aW5kICgmdnBzNClbMV0KKyNpZm5kZWYgU01BTEwKKyNkZWZpbmUgdnRlcm0gKCZ2b3B0aW5kKVsxXQorI2RlZmluZSB2aGlzdHNpemUgKCZ2dGVybSlbMV0KKyNlbmRpZgorCisjaWZkZWYgSUZTX0JST0tFTgorZXh0ZXJuIGNvbnN0IGNoYXIgZGVmaWZzdmFyW107CisjZGVmaW5lIGRlZmlmcyAoZGVmaWZzdmFyICsgNCkKKyNlbHNlCitleHRlcm4gY29uc3QgY2hhciBkZWZpZnNbXTsKKyNlbmRpZgorZXh0ZXJuIGNvbnN0IGNoYXIgZGVmcGF0aHZhcltdOworI2RlZmluZSBkZWZwYXRoIChkZWZwYXRodmFyICsgNSkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFjY2VzcyB0aGUgdmFsdWVzIG9mIHRoZSBhYm92ZSB2YXJpYWJsZXMuCisgKiBUaGV5IGhhdmUgdG8gc2tpcCBvdmVyIHRoZSBuYW1lLiAgVGhleSByZXR1cm4gdGhlIG51bGwgc3RyaW5nCisgKiBmb3IgdW5zZXQgdmFyaWFibGVzLgorICovCisKKyNkZWZpbmUgaWZzdmFsKCkJKHZpZnMudGV4dCArIDQpCisjZGVmaW5lIGlmc3NldCgpCSgodmlmcy5mbGFncyAmIFZVTlNFVCkgPT0gMCkKKyNkZWZpbmUgbWFpbHZhbCgpCSh2bWFpbC50ZXh0ICsgNSkKKyNkZWZpbmUgbXBhdGh2YWwoKQkodm1wYXRoLnRleHQgKyA5KQorI2RlZmluZSBwYXRodmFsKCkJKHZwYXRoLnRleHQgKyA1KQorI2RlZmluZSBwczF2YWwoKQkodnBzMS50ZXh0ICsgNCkKKyNkZWZpbmUgcHMydmFsKCkJKHZwczIudGV4dCArIDQpCisjZGVmaW5lIHBzNHZhbCgpCSh2cHM0LnRleHQgKyA0KQorI2RlZmluZSBvcHRpbmR2YWwoKQkodm9wdGluZC50ZXh0ICsgNykKKyNpZm5kZWYgU01BTEwKKyNkZWZpbmUgaGlzdHNpemV2YWwoKQkodmhpc3RzaXplLnRleHQgKyA5KQorI2RlZmluZSB0ZXJtdmFsKCkJKHZ0ZXJtLnRleHQgKyA1KQorI2VuZGlmCisKKyNpZiBBVFRZCisjZGVmaW5lIGF0dHlzZXQoKQkoKHZhdHR5LmZsYWdzICYgVlVOU0VUKSA9PSAwKQorI2VuZGlmCisjZGVmaW5lIG1wYXRoc2V0KCkJKCh2bXBhdGguZmxhZ3MgJiBWVU5TRVQpID09IDApCisKK3ZvaWQgaW5pdHZhcih2b2lkKTsKK3ZvaWQgc2V0dmFyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwordm9pZCBzZXR2YXJlcShjaGFyICosIGludCk7CitzdHJ1Y3Qgc3RybGlzdDsKK3ZvaWQgbGlzdHNldHZhcihzdHJ1Y3Qgc3RybGlzdCAqLCBpbnQpOworY2hhciAqbG9va3VwdmFyKGNvbnN0IGNoYXIgKik7CitjaGFyICpibHRpbmxvb2t1cChjb25zdCBjaGFyICopOworY2hhciAqKmxpc3R2YXJzKGludCwgaW50LCBjaGFyICoqKik7CisjZGVmaW5lIGVudmlyb25tZW50KCkgbGlzdHZhcnMoVkVYUE9SVCwgVlVOU0VULCAwKQoraW50IHNob3d2YXJzKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworaW50IGV4cG9ydGNtZChpbnQsIGNoYXIgKiopOworaW50IGxvY2FsY21kKGludCwgY2hhciAqKik7Cit2b2lkIHBvcGxvY2FsdmFycyh2b2lkKTsKK2ludCB1bnNldGNtZChpbnQsIGNoYXIgKiopOworaW50IHVuc2V0dmFyKGNvbnN0IGNoYXIgKik7CitpbnQgc2V0dmFyc2FmZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludCB2YXJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCitzdGF0aWMgaW5saW5lIGludCB2YXJlcXVhbChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKSB7CisJcmV0dXJuICF2YXJjbXAoYSwgYik7Cit9CmRpZmYgLS1naXQgYS91c3IvZ3ppcC9DT1BZSU5HIGIvdXNyL2d6aXAvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDNlYTIxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvQ09QWUlORwpAQCAtMCwwICsxLDMzOSBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCUFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvS2J1aWxkIGIvdXNyL2d6aXAvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmFlMDQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC9LYnVpbGQKQEAgLTAsMCArMSwyNSBAQAorIworIyBLYnVpbGQgZmlsZSBmb3IgZ3ppcAorIworCisjIFRoZSBnemlwIGV4ZWN1dGFibGUKK3N0YXRpYy15IDo9IGd6aXAKK2d6aXAteSAgIDo9IGd6aXAubyB1dGlsLm8gdW56aXAubyBpbmZsYXRlLm8KKworIyBBZGRpdGlvbmFsIHRhcmdldHMKK2Fsd2F5cyA6PSBndW56aXAgemNhdAorCisjIE9wdGlvbmFsIFpJUCBzdXBwb3J0CitnemlwLSQoQ09ORklHX0tMSUJfWklQKSAgICs9IHppcC5vIGRlZmxhdGUubyB0cmVlcy5vIGJpdHMubworY2ZsYWdzLSQoQ09ORklHX0tMSUJfWklQKSArPSAtRFNVUFBPUlRfWklQCitFWFRSQV9LTElCQ0NGTEFHUyA6PSAkKGNmbGFncy15KQorCisjIEFkZGl0aW9uYWxseSBsaW5rZWQgdGFyZ2V0cworJChvYmopL2d1bnppcCAkKG9iaikvemNhdDogJChvYmopL2d6aXAKKwkkKGNhbGwgY21kLGxuKQorCisjIENsZWFuaW5nCit0YXJnZXRzIDo9IGd6aXAgZ3ppcC5nIGd1bnppcCB6Y2F0CisKKyMgVGFyZ2V0cyB0byBpbnN0YWxsCitpbnN0YWxsLXkgOj0gZ3ppcCBndW56aXAgemNhdApkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvUkVBRE1FIGIvdXNyL2d6aXAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDczMTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC9SRUFETUUKQEAgLTAsMCArMSwxNDQgQEAKK1RoaXMgaXMgdGhlIGZpbGUgUkVBRE1FIGZvciB0aGUgZ3ppcCBkaXN0cmlidXRpb24sIHZlcnNpb24gMS4yLjQuCisKK2d6aXAgKEdOVSB6aXApIGlzIGEgY29tcHJlc3Npb24gdXRpbGl0eSBkZXNpZ25lZCB0byBiZSBhIHJlcGxhY2VtZW50Citmb3IgJ2NvbXByZXNzJy4gSXRzIG1haW4gYWR2YW50YWdlcyBvdmVyIGNvbXByZXNzIGFyZSBtdWNoIGJldHRlcgorY29tcHJlc3Npb24gYW5kIGZyZWVkb20gZnJvbSBwYXRlbnRlZCBhbGdvcml0aG1zLiAgVGhlIEdOVSBQcm9qZWN0Cit1c2VzIGl0IGFzIHRoZSBzdGFuZGFyZCBjb21wcmVzc2lvbiBwcm9ncmFtIGZvciBpdHMgc3lzdGVtLgorCitnemlwIGN1cnJlbnRseSB1c2VzIGJ5IGRlZmF1bHQgdGhlIExaNzcgYWxnb3JpdGhtIHVzZWQgaW4gemlwIDEuOSAodGhlCitwb3J0YWJsZSBwa3ppcCBjb21wYXRpYmxlIGFyY2hpdmVyKS4gVGhlIGd6aXAgZm9ybWF0IHdhcyBob3dldmVyCitkZXNpZ25lZCB0byBhY2NvbW1vZGF0ZSBzZXZlcmFsIGNvbXByZXNzaW9uIGFsZ29yaXRobXMuIFNlZSBiZWxvdworZm9yIGEgY29tcGFyaXNvbiBvZiB6aXAgYW5kIGd6aXAuCisKK2d1bnppcCBjYW4gY3VycmVudGx5IGRlY29tcHJlc3MgZmlsZXMgY3JlYXRlZCBieSBnemlwLCBjb21wcmVzcyBvcgorcGFjay4gVGhlIGRldGVjdGlvbiBvZiB0aGUgaW5wdXQgZm9ybWF0IGlzIGF1dG9tYXRpYy4gIEZvciB0aGUKK2d6aXAgZm9ybWF0LCBndW56aXAgY2hlY2tzIGEgMzIgYml0IENSQy4gRm9yIHBhY2ssIGd1bnppcCBjaGVja3MgdGhlCit1bmNvbXByZXNzZWQgbGVuZ3RoLiAgVGhlICdjb21wcmVzcycgZm9ybWF0IHdhcyBub3QgZGVzaWduZWQgdG8gYWxsb3cKK2NvbnNpc3RlbmN5IGNoZWNrcy4gSG93ZXZlciBndW56aXAgaXMgc29tZXRpbWVzIGFibGUgdG8gZGV0ZWN0IGEgYmFkCisuWiBmaWxlIGJlY2F1c2UgdGhlcmUgaXMgc29tZSByZWR1bmRhbmN5IGluIHRoZSAuWiBjb21wcmVzc2lvbiBmb3JtYXQuCitJZiB5b3UgZ2V0IGFuIGVycm9yIHdoZW4gdW5jb21wcmVzc2luZyBhIC5aIGZpbGUsIGRvIG5vdCBhc3N1bWUgdGhhdAordGhlIC5aIGZpbGUgaXMgY29ycmVjdCBzaW1wbHkgYmVjYXVzZSB0aGUgc3RhbmRhcmQgdW5jb21wcmVzcyBkb2VzIG5vdAorY29tcGxhaW4uICBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHRoZSBzdGFuZGFyZCB1bmNvbXByZXNzIGRvZXMgbm90CitjaGVjayBpdHMgaW5wdXQsIGFuZCBoYXBwaWx5IGdlbmVyYXRlcyBnYXJiYWdlIG91dHB1dC4KKworZ3ppcCBwcm9kdWNlcyBmaWxlcyB3aXRoIGEgLmd6IGV4dGVuc2lvbi4gUHJldmlvdXMgdmVyc2lvbnMgb2YgZ3ppcAordXNlZCB0aGUgLnogZXh0ZW5zaW9uLCB3aGljaCB3YXMgYWxyZWFkeSB1c2VkIGJ5IHRoZSAncGFjaycKK0h1ZmZtYW4gZW5jb2Rlci4gZ3VuemlwIGlzIGFibGUgdG8gZGVjb21wcmVzcyAueiBmaWxlcyAocGFja2VkCitvciBnemlwJ2VkKS4KKworU2V2ZXJhbCBwbGFubmVkIGZlYXR1cmVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAoc2VlIHRoZSBmaWxlIFRPRE8pLgorU2VlIHRoZSBmaWxlIE5FV1MgZm9yIGEgc3VtbWFyeSBvZiBjaGFuZ2VzIHNpbmNlIDAuNS4gIFNlZSB0aGUgZmlsZQorSU5TVEFMTCBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4gU29tZSBhbnN3ZXJzIHRvIGZyZXF1ZW50bHkKK2Fza2VkIHF1ZXN0aW9ucyBhcmUgZ2l2ZW4gaW4gdGhlIGZpbGUgSU5TVEFMTCwgcGxlYXNlIHJlYWQgaXQuIChJbgorcGFydGljdWxhciwgcGxlYXNlIGRvbid0IGFzayBtZSBvbmNlIG1vcmUgZm9yIGFuIC9ldGMvbWFnaWMgZW50cnkuKQorCitXQVJOSU5HOiBvbiBzZXZlcmFsIHN5c3RlbXMsIGNvbXBpbGVyIGJ1Z3MgY2F1c2UgZ3ppcCB0byBmYWlsLCBpbgorcGFydGljdWxhciB3aGVuIG9wdGltaXphdGlvbiBvcHRpb25zIGFyZSBvbi4gIFNlZSB0aGUgc2VjdGlvbiAiU3BlY2lhbAordGFyZ2V0cyIgYXQgdGhlIGVuZCBvZiB0aGUgSU5TVEFMTCBmaWxlIGZvciBhIGxpc3Qgb2Yga25vd24gcHJvYmxlbXMuCitGb3IgYWxsIG1hY2hpbmVzLCB1c2UgIm1ha2UgY2hlY2siIHRvIGNoZWNrIHRoYXQgZ3ppcCB3YXMgY29tcGlsZWQKK2NvcnJlY3RseS4gIFRyeSBjb21waWxpbmcgZ3ppcCB3aXRob3V0IGFueSBvcHRpbWl6YXRpb24gaWYgeW91IGhhdmUgYQorcHJvYmxlbS4KKworUGxlYXNlIHNlbmQgYWxsIGNvbW1lbnRzIGFuZCBidWcgcmVwb3J0cyBieSBlbGVjdHJvbmljIG1haWwgdG86CisgICBKZWFuLWxvdXAgR2FpbGx5IDxqbG91cEBjaG9ydXMuZnI+CisKK29yLCBpZiB0aGlzIGZhaWxzLCB0byBidWctZ251LXV0aWxzQHByZXAuYWkubWl0LmVkdS4KK0J1ZyByZXBvcnRzIHNob3VsZCBpZGVhbGx5IGluY2x1ZGU6CisKKyAgICAqIFRoZSBjb21wbGV0ZSBvdXRwdXQgb2YgImd6aXAgLVYiIChvciB0aGUgY29udGVudHMgb2YgcmV2aXNpb24uaAorICAgICAgaWYgeW91IGNhbid0IGdldCBnemlwIHRvIGNvbXBpbGUpCisgICAgKiBUaGUgaGFyZHdhcmUgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKHRyeSAidW5hbWUgLWEiKQorICAgICogVGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSAoaWYgaXQgaXMgZ2NjLCB1c2UgImdjYyAtdiIpCisgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgYmVoYXZpb3IKKyAgICAqIFRoZSBpbnB1dCB0byBnemlwLCB0aGF0IHRyaWdnZXJlZCB0aGUgYnVnCisKK0lmIHlvdSBzZW5kIG1lIHBhdGNoZXMgZm9yIG1hY2hpbmVzIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8sIHBsZWFzZSB0ZXN0IHRoZW0KK3ZlcnkgY2FyZWZ1bGx5LiBnemlwIGlzIHVzZWQgZm9yIGJhY2t1cHMsIGl0IG11c3QgYmUgZXh0cmVtZWx5IHJlbGlhYmxlLgorCitUaGUgcGFja2FnZSBjcnlwdCsrLmVsIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBtYW5pcHVsYXRlIGd6aXAnZWQKK2ZpbGUgZnJvbSBlbWFjcy4gSXQgcmVjb2duaXplcyBhdXRvbWF0aWNhbGx5IGVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZAorZmlsZXMgd2hlbiB0aGV5IGFyZSBmaXJzdCB2aXNpdGVkIG9yIHdyaXR0ZW4uIEl0IGlzIGF2YWlsYWJsZSB2aWEKK2Fub255bW91cyBmdHAgdG8gcm9lYmxpbmcucG9seS5lZHUgWzEyOC4yMzguNS4zMV0gaW4gL3B1Yi9jcnlwdCsrLmVsLgorVGhlIHNhbWUgZGlyZWN0b3J5IGNvbnRhaW5zIGFsc28gcGF0Y2hlcyB0byBkaXJlZCwgYW5nZS1mdHAgYW5kIGluZm8uCitHTlUgdGFyIDEuMTEuMiBoYXMgYSAteiBvcHRpb24gdG8gaW52b2tlIGRpcmVjdGx5IGd6aXAsIHNvIHlvdSBkb24ndCBoYXZlIHRvCitwYXRjaCBpdC4gVGhlIHBhY2thZ2UgZnRwLnV1Lm5ldDovbGFuZ3VhZ2VzL2VtYWNzLWxpc3AvbWlzYy9qa2EtY29tcHIxOS5lbC5aCithbHNvIHN1cHBvcnRzIGd6aXAnZWQgZmlsZXMuCisKK1RoZSB6bmV3IGFuZCBnemV4ZSBzaGVsbCBzY3JpcHRzIHByb3ZpZGVkIHdpdGggZ3ppcCBiZW5lZml0IGZyb20KKyhidXQgZG8gbm90IHJlcXVpcmUpIHRoZSBjcG1vZCB1dGlsaXR5IHRvIHRyYW5zZmVyIGZpbGUgYXR0cmlidXRlcy4KK0l0IGlzIGF2YWlsYWJsZSBieSBhbm9ueW1vdXMgZnRwIG9uIGdhdGVrZWVwZXIuZGVjLmNvbSBpbgorLy4wL3VzZW5ldC9jb21wLnNvdXJjZXMudW5peC92b2x1bWUxMS9jcG1vZC5aLgorCitUaGUgc2FtcGxlIHByb2dyYW1zIHpyZWFkLmMsIHN1Yi5jIGFuZCBhZGQuYyBpbiBzdWJkaXJlY3Rvcnkgc2FtcGxlCithcmUgcHJvdmlkZWQgYXMgZXhhbXBsZXMgb2YgdXNlZnVsIGNvbXBsZW1lbnRzIHRvIGd6aXAuIFJlYWQgdGhlCitjb21tZW50cyBpbnNpZGUgZWFjaCBzb3VyY2UgZmlsZS4gIFRoZSBwZXJsIHNjcmlwdCB6dG91Y2ggaXMgYWxzbworcHJvdmlkZWQgYXMgZXhhbXBsZSAobm90IGluc3RhbGxlZCBieSBkZWZhdWx0IHNpbmNlIGl0IHJlbGllcyBvbiBwZXJsKS4KKworCitnemlwIGlzIGZyZWUgc29mdHdhcmUsIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGEgY29weSBvZiB3aGljaCBpcworcHJvdmlkZWQgdW5kZXIgdGhlIG5hbWUgQ09QWUlORy4gVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGd6aXAgYXJlIGFsd2F5cworYXZhaWxhYmxlIGJ5IGZ0cCBpbiBwcmVwLmFpLm1pdC5lZHU6L3B1Yi9nbnUsIG9yIGluIGFueSBvZiB0aGUgcHJlcAorbWlycm9yIHNpdGVzOgorCistIHNvdXJjZXMgaW4gZ3ppcC0qLnRhciAob3IgLnNoYXIgb3IgLnRhci5neikuCistIFNvbGFyaXMgMiBleGVjdXRhYmxlcyBpbiBzcGFyYy1zdW4tc29sYXJpczIvZ3ppcC1iaW5hcmllcy0qLnRhcgorLSBNU0RPUyBsaGEgc2VsZi1leHRyYWN0aW5nIGV4ZSBpbiBnemlwLW1zZG9zLSouZXhlLiBPbmNlIGV4dHJhY3RlZCwKKyAgY29weSBnemlwLmV4ZSB0byBndW56aXAuZXhlIGFuZCB6Y2F0LmV4ZSwgb3IgdXNlICJnemlwIC1kIiB0byBkZWNvbXByZXNzLgorICBnemlwMzg2LmV4ZSBydW5zIG11Y2ggZmFzdGVyIGJ1dCBvbmx5IG9uIDM4NiBhbmQgYWJvdmU7IGl0IGlzIGNvbXBpbGVkIHdpdGgKKyAgZGpncHAgMS4xMCBhdmFpbGFibGUgaW4gZGlyZWN0b3J5IG9tbmlnYXRlLmNsYXJrc29uLmVkdTovcHViL21zZG9zL2RqZ3BwLgorCitBIFZNUyBleGVjdXRhYmxlIGlzIGF2YWlsYWJsZSBpbiBmdHAuc3BjLmVkdTpbLm1hY3JvMzIuc2F2ZXNldHNdZ3ppcC0xLSouemlwCisodXNlIFsubWFjcm8zMl11bnppcC5leGUgdG8gZXh0cmFjdCkuIEEgUFJJTU9TIGV4ZWN1dGFibGUgaXMgYXZhaWxhYmxlCitpbiBmdHAubHlzYXRvci5saXUuc2U6L3B1Yi9wcmltb3MvcnVuL2d6aXAucnVuLgorT1MvMiBleGVjdXRhYmxlcyAoMTYgYW5kIDMyIGJpdHMgdmVyc2lvbnMpIGFyZSBhdmFpbGFibGUgaW4KK2Z0cC50dS1tdWVuY2hlbi5kZTovcHViL2NvbXAvb3Mvb3MyL2FyY2hpdmVyL2d6Ki1bMTYsMzJdLnppcAorCitTb21lIGZ0cCBzZXJ2ZXJzIGNhbiBhdXRvbWF0aWNhbGx5IG1ha2UgYSB0YXIuWiBmcm9tIGEgdGFyIGZpbGUuIElmCit5b3UgYXJlIGdldHRpbmcgZ3ppcCBmb3IgdGhlIGZpcnN0IHRpbWUsIHlvdSBjYW4gYXNrIGZvciBhIHRhci5aIGZpbGUKK2luc3RlYWQgb2YgdGhlIG11Y2ggbGFyZ2VyIHRhciBmaWxlLgorCitNYW55IHRoYW5rcyB0byB0aG9zZSB3aG8gcHJvdmlkZWQgbWUgd2l0aCBidWcgcmVwb3J0cyBhbmQgZmVlZGJhY2suCitTZWUgdGhlIGZpbGVzIFRIQU5LUyBhbmQgQ2hhbmdlTG9nIGZvciBtb3JlIGRldGFpbHMuCisKKworCQlOb3RlIGFib3V0IHppcCB2cy4gZ3ppcDoKKworVGhlIG5hbWUgJ2d6aXAnIHdhcyBhIHZlcnkgdW5mb3J0dW5hdGUgY2hvaWNlLCBiZWNhdXNlIHppcCBhbmQgZ3ppcAorYXJlIHR3byByZWFsbHkgZGlmZmVyZW50IHByb2dyYW1zLCBhbHRob3VnaCB0aGUgYWN0dWFsIGNvbXByZXNzaW9uIGFuZAorZGVjb21wcmVzc2lvbiBzb3VyY2VzIHdlcmUgd3JpdHRlbiBieSB0aGUgc2FtZSBwZXJzb25zLiBBIGRpZmZlcmVudAorbmFtZSBzaG91bGQgaGF2ZSBiZWVuIHVzZWQgZm9yIGd6aXAsIGJ1dCBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2Ugbm93LgorCit6aXAgaXMgYW4gYXJjaGl2ZXI6IGl0IGNvbXByZXNzZXMgc2V2ZXJhbCBmaWxlcyBpbnRvIGEgc2luZ2xlIGFyY2hpdmUKK2ZpbGUuIGd6aXAgaXMgYSBzaW1wbGUgY29tcHJlc3NvcjogZWFjaCBmaWxlIGlzIGNvbXByZXNzZWQgc2VwYXJhdGVseS4KK0JvdGggc2hhcmUgdGhlIHNhbWUgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZSBmb3IgdGhlCisnZGVmbGF0ZScgbWV0aG9kLiAgdW56aXAgY2FuIGFsc28gZGVjb21wcmVzcyBvbGQgemlwIGFyY2hpdmVzCisoaW1wbG9kZSwgc2hyaW5rIGFuZCByZWR1Y2UgbWV0aG9kcykuIGd1bnppcCBjYW4gYWxzbyBkZWNvbXByZXNzIGZpbGVzCitjcmVhdGVkIGJ5IGNvbXByZXNzIGFuZCBwYWNrLiB6aXAgMS45IGFuZCBnemlwIGRvIG5vdCBzdXBwb3J0Citjb21wcmVzc2lvbiBtZXRob2RzIG90aGVyIHRoYW4gZGVmbGF0aW9uLiAoemlwIDEuMCBzdXBwb3J0cyBzaHJpbmsgYW5kCitpbXBsb2RlKS4gQmV0dGVyIGNvbXByZXNzaW9uIG1ldGhvZHMgbWF5IGJlIGFkZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucworb2YgZ3ppcC4gemlwIHdpbGwgYWx3YXlzIHN0aWNrIHRvIGFic29sdXRlIGNvbXBhdGliaWxpdHkgd2l0aCBwa3ppcCwKK2l0IGlzIHRodXMgY29uc3RyYWluZWQgYnkgUEtXYXJlLCB3aGljaCBpcyBhIGNvbW1lcmNpYWwgY29tcGFueS4gIFRoZQorZ3ppcCBoZWFkZXIgZm9ybWF0IGlzIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHBremlwIHRvCithdm9pZCBzdWNoIGEgY29uc3RyYWludC4KKworT24gVW5peCwgZ3ppcCBpcyBtb3N0bHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGFyLiBHTlUgdGFyCisxLjExLjIgaGFzIGEgLXogb3B0aW9uIHRvIGludm9rZSBnemlwIGF1dG9tYXRpY2FsbHkuICAidGFyIC16IgorY29tcHJlc3NlcyBiZXR0ZXIgdGhhbiB6aXAsIHNpbmNlIGd6aXAgY2FuIHRoZW4gdGFrZSBhZHZhbnRhZ2Ugb2YKK3JlZHVuZGFuY3kgYmV0d2VlbiBkaXN0aW5jdCBmaWxlcy4gVGhlIGRyYXdiYWNrIGlzIHRoYXQgeW91IG11c3QKK3NjYW4gdGhlIHdob2xlIHRhci5neiBmaWxlIGluIG9yZGVyIHRvIGV4dHJhY3QgYSBzaW5nbGUgZmlsZSBuZWFyCit0aGUgZW5kOyB1bnppcCBjYW4gZGlyZWN0bHkgc2VlayB0byB0aGUgZW5kIG9mIHRoZSB6aXAgZmlsZS4gVGhlcmUKK2lzIG5vIG92ZXJoZWFkIHdoZW4geW91IGV4dHJhY3QgdGhlIHdob2xlIGFyY2hpdmUgYW55d2F5LgorSWYgYSBtZW1iZXIgb2YgYSAuemlwIGFyY2hpdmUgaXMgZGFtYWdlZCwgb3RoZXIgZmlsZXMgY2FuIHN0aWxsCitiZSByZWNvdmVyZWQuIElmIGEgLnRhci5neiBmaWxlIGlzIGRhbWFnZWQsIGZpbGVzIGJleW9uZCB0aGUgZmFpbHVyZQorcG9pbnQgY2Fubm90IGJlIHJlY292ZXJlZC4gKEZ1dHVyZSB2ZXJzaW9ucyBvZiBnemlwIHdpbGwgaGF2ZQorZXJyb3IgcmVjb3ZlcnkgZmVhdHVyZXMuKQorCitnemlwIGFuZCBndW56aXAgYXJlIGRpc3RyaWJ1dGVkIGFzIGEgc2luZ2xlIHByb2dyYW0uIHppcCBhbmQgdW56aXAKK2FyZSwgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgdHdvIHNlcGFyYXRlIHByb2dyYW1zLCBhbHRob3VnaCB0aGUKK2F1dGhvcnMgb2YgdGhlc2UgdHdvIHByb2dyYW1zIHdvcmsgY2xvc2VseSB0b2dldGhlciBpbiB0aGUgaW5mby16aXAKK3RlYW0uIHppcCBhbmQgdW56aXAgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEdOVSBwcm9qZWN0LgorVGhlIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSBieSBmdHAgaW4KKworCSBvYWsub2FrbGFuZC5lZHU6L3B1Yi9taXNjL3VuaXgvemlwMTlwMS56aXAKKwkgb2FrLm9ha2xhbmQuZWR1Oi9wdWIvbWlzYy91bml4L3VuejUwcDEudGFyLXoKZGlmZiAtLWdpdCBhL3Vzci9nemlwL2JpdHMuYyBiL3Vzci9nemlwL2JpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA3YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvYml0cy5jCkBAIC0wLDAgKzEsMjAwIEBACisvKiBiaXRzLmMgLS0gb3V0cHV0IHZhcmlhYmxlLWxlbmd0aCBiaXQgc3RyaW5ncworICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseQorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisKKy8qCisgKiAgUFVSUE9TRQorICoKKyAqICAgICAgT3V0cHV0IHZhcmlhYmxlLWxlbmd0aCBiaXQgc3RyaW5ncy4gQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUKKyAqICAgICAgdG8gYSBmaWxlIG9yIHRvIG1lbW9yeS4gKFRoZSBsYXR0ZXIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24uKQorICoKKyAqICBESVNDVVNTSU9OCisgKgorICogICAgICBUaGUgUEtaSVAgImRlZmxhdGUiIGZpbGUgZm9ybWF0IGludGVycHJldHMgY29tcHJlc3NlZCBmaWxlIGRhdGEKKyAqICAgICAgYXMgYSBzZXF1ZW5jZSBvZiBiaXRzLiAgTXVsdGktYml0IHN0cmluZ3MgaW4gdGhlIGZpbGUgbWF5IGNyb3NzCisgKiAgICAgIGJ5dGUgYm91bmRhcmllcyB3aXRob3V0IHJlc3RyaWN0aW9uLgorICoKKyAqICAgICAgVGhlIGZpcnN0IGJpdCBvZiBlYWNoIGJ5dGUgaXMgdGhlIGxvdy1vcmRlciBiaXQuCisgKgorICogICAgICBUaGUgcm91dGluZXMgaW4gdGhpcyBmaWxlIGFsbG93IGEgdmFyaWFibGUtbGVuZ3RoIGJpdCB2YWx1ZSB0bworICogICAgICBiZSBvdXRwdXQgcmlnaHQtdG8tbGVmdCAodXNlZnVsIGZvciBsaXRlcmFsIHZhbHVlcykuIEZvcgorICogICAgICBsZWZ0LXRvLXJpZ2h0IG91dHB1dCAodXNlZnVsIGZvciBjb2RlIHN0cmluZ3MgZnJvbSB0aGUgdHJlZSByb3V0aW5lcyksCisgKiAgICAgIHRoZSBiaXRzIG11c3QgaGF2ZSBiZWVuIHJldmVyc2VkIGZpcnN0IHdpdGggYmlfcmV2ZXJzZSgpLgorICoKKyAqICAgICAgRm9yIGluLW1lbW9yeSBjb21wcmVzc2lvbiwgdGhlIGNvbXByZXNzZWQgYml0IHN0cmVhbSBnb2VzIGRpcmVjdGx5CisgKiAgICAgIGludG8gdGhlIHJlcXVlc3RlZCBvdXRwdXQgYnVmZmVyLiBUaGUgaW5wdXQgZGF0YSBpcyByZWFkIGluIGJsb2NrcworICogICAgICBieSB0aGUgbWVtX3JlYWQoKSBmdW5jdGlvbi4gVGhlIGJ1ZmZlciBpcyBsaW1pdGVkIHRvIDY0SyBvbiAxNiBiaXQKKyAqICAgICAgbWFjaGluZXMuCisgKgorICogIElOVEVSRkFDRQorICoKKyAqICAgICAgdm9pZCBiaV9pbml0IChGSUxFICp6aXBmaWxlKQorICogICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgYml0IHN0cmluZyByb3V0aW5lcy4KKyAqCisgKiAgICAgIHZvaWQgc2VuZF9iaXRzIChpbnQgdmFsdWUsIGludCBsZW5ndGgpCisgKiAgICAgICAgICBXcml0ZSBvdXQgYSBiaXQgc3RyaW5nLCB0YWtpbmcgdGhlIHNvdXJjZSBiaXRzIHJpZ2h0IHRvCisgKiAgICAgICAgICBsZWZ0LgorICoKKyAqICAgICAgaW50IGJpX3JldmVyc2UgKGludCB2YWx1ZSwgaW50IGxlbmd0aCkKKyAqICAgICAgICAgIFJldmVyc2UgdGhlIGJpdHMgb2YgYSBiaXQgc3RyaW5nLCB0YWtpbmcgdGhlIHNvdXJjZSBiaXRzIGxlZnQgdG8KKyAqICAgICAgICAgIHJpZ2h0IGFuZCBlbWl0dGluZyB0aGVtIHJpZ2h0IHRvIGxlZnQuCisgKgorICogICAgICB2b2lkIGJpX3dpbmR1cCAodm9pZCkKKyAqICAgICAgICAgIFdyaXRlIG91dCBhbnkgcmVtYWluaW5nIGJpdHMgaW4gYW4gaW5jb21wbGV0ZSBieXRlLgorICoKKyAqICAgICAgdm9pZCBjb3B5X2Jsb2NrKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBpbnQgaGVhZGVyKQorICogICAgICAgICAgQ29weSBhIHN0b3JlZCBibG9jayB0byB0aGUgemlwIGZpbGUsIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQKKyAqICAgICAgICAgIGl0cyBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgInRhaWxvci5oIgorI2luY2x1ZGUgImd6aXAuaCIKKworI2lmZGVmIERFQlVHCisjICBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGJpdHMuYyx2IDEuMSAyMDAyLzA4LzE4IDAwOjU5OjIxIGhwYSBFeHAgJCI7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCBkYXRhIHVzZWQgYnkgdGhlICJiaXQgc3RyaW5nIiByb3V0aW5lcy4KKyAqLworCitsb2NhbCBmaWxlX3QgemZpbGU7IC8qIG91dHB1dCBnemlwIGZpbGUgKi8KKworbG9jYWwgdW5zaWduZWQgc2hvcnQgYmlfYnVmOworLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3Qgc2lnbmlmaWNhbnQKKyAqIGJpdHMpLgorICovCisKKyNkZWZpbmUgQnVmX3NpemUgKDggKiAyKnNpemVvZihjaGFyKSkKKy8qIE51bWJlciBvZiBiaXRzIHVzZWQgd2l0aGluIGJpX2J1Zi4gKGJpX2J1ZiBtaWdodCBiZSBpbXBsZW1lbnRlZCBvbgorICogbW9yZSB0aGFuIDE2IGJpdHMgb24gc29tZSBzeXN0ZW1zLikKKyAqLworCitsb2NhbCBpbnQgYmlfdmFsaWQ7CisvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXQKKyAqIGFyZSBhbHdheXMgemVyby4KKyAqLworCitpbnQgKCpyZWFkX2J1ZikgT0YoKGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOworLyogQ3VycmVudCBpbnB1dCBmdW5jdGlvbi4gU2V0IHRvIG1lbV9yZWFkIGZvciBpbi1tZW1vcnkgY29tcHJlc3Npb24gKi8KKworI2lmZGVmIERFQlVHCisgIHVsZyBiaXRzX3NlbnQ7ICAgLyogYml0IGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhICovCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSBiaXQgc3RyaW5nIHJvdXRpbmVzLgorICovCit2b2lkIGJpX2luaXQgKHppcGZpbGUpCisgICAgZmlsZV90IHppcGZpbGU7IC8qIG91dHB1dCB6aXAgZmlsZSwgTk9fRklMRSBmb3IgaW4tbWVtb3J5IGNvbXByZXNzaW9uICovCit7CisgICAgemZpbGUgID0gemlwZmlsZTsKKyAgICBiaV9idWYgPSAwOworICAgIGJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworICAgIGJpdHNfc2VudCA9IDBMOworI2VuZGlmCisKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHRzIGZvciBmaWxlIGNvbXByZXNzaW9uLiBUaGV5IGFyZSBzZXQgYnkgbWVtY29tcHJlc3MKKyAgICAgKiBmb3IgaW4tbWVtb3J5IGNvbXByZXNzaW9uLgorICAgICAqLworICAgIGlmICh6ZmlsZSAhPSBOT19GSUxFKSB7CisJcmVhZF9idWYgID0gZmlsZV9yZWFkOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy4KKyAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLgorICovCit2b2lkIHNlbmRfYml0cyh2YWx1ZSwgbGVuZ3RoKQorICAgIGludCB2YWx1ZTsgIC8qIHZhbHVlIHRvIHNlbmQgKi8KKyAgICBpbnQgbGVuZ3RoOyAvKiBudW1iZXIgb2YgYml0cyAqLworeworI2lmZGVmIERFQlVHCisgICAgVHJhY2V2KChzdGRlcnIsIiBsICUyZCB2ICU0eCAiLCBsZW5ndGgsIHZhbHVlKSk7CisgICAgQXNzZXJ0KGxlbmd0aCA+IDAgJiYgbGVuZ3RoIDw9IDE1LCAiaW52YWxpZCBsZW5ndGgiKTsKKyAgICBiaXRzX3NlbnQgKz0gKHVsZylsZW5ndGg7CisjZW5kaWYKKyAgICAvKiBJZiBub3QgZW5vdWdoIHJvb20gaW4gYmlfYnVmLCB1c2UgKHZhbGlkKSBiaXRzIGZyb20gYmlfYnVmIGFuZAorICAgICAqICgxNiAtIGJpX3ZhbGlkKSBiaXRzIGZyb20gdmFsdWUsIGxlYXZpbmcgKHdpZHRoIC0gKDE2LWJpX3ZhbGlkKSkKKyAgICAgKiB1bnVzZWQgYml0cyBpbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAoYmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuZ3RoKSB7CisgICAgICAgIGJpX2J1ZiB8PSAodmFsdWUgPDwgYmlfdmFsaWQpOworICAgICAgICBwdXRfc2hvcnQoYmlfYnVmKTsKKyAgICAgICAgYmlfYnVmID0gKHVzaCl2YWx1ZSA+PiAoQnVmX3NpemUgLSBiaV92YWxpZCk7CisgICAgICAgIGJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGJpX2J1ZiB8PSB2YWx1ZSA8PCBiaV92YWxpZDsKKyAgICAgICAgYmlfdmFsaWQgKz0gbGVuZ3RoOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlcgorICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKQorICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNQorICovCit1bnNpZ25lZCBiaV9yZXZlcnNlKGNvZGUsIGxlbikKKyAgICB1bnNpZ25lZCBjb2RlOyAvKiB0aGUgdmFsdWUgdG8gaW52ZXJ0ICovCisgICAgaW50IGxlbjsgICAgICAgLyogaXRzIGJpdCBsZW5ndGggKi8KK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCByZXMgPSAwOworICAgIGRvIHsKKyAgICAgICAgcmVzIHw9IGNvZGUgJiAxOworICAgICAgICBjb2RlID4+PSAxLCByZXMgPDw9IDE7CisgICAgfSB3aGlsZSAoLS1sZW4gPiAwKTsKKyAgICByZXR1cm4gcmVzID4+IDE7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdGUgb3V0IGFueSByZW1haW5pbmcgYml0cyBpbiBhbiBpbmNvbXBsZXRlIGJ5dGUuCisgKi8KK3ZvaWQgYmlfd2luZHVwKCkKK3sKKyAgICBpZiAoYmlfdmFsaWQgPiA4KSB7CisgICAgICAgIHB1dF9zaG9ydChiaV9idWYpOworICAgIH0gZWxzZSBpZiAoYmlfdmFsaWQgPiAwKSB7CisgICAgICAgIHB1dF9ieXRlKGJpX2J1Zik7CisgICAgfQorICAgIGJpX2J1ZiA9IDA7CisgICAgYmlfdmFsaWQgPSAwOworI2lmZGVmIERFQlVHCisgICAgYml0c19zZW50ID0gKGJpdHNfc2VudCs3KSAmIH43OworI2VuZGlmCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSBhIHN0b3JlZCBibG9jayB0byB0aGUgemlwIGZpbGUsIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzCisgKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC4KKyAqLwordm9pZCBjb3B5X2Jsb2NrKGJ1ZiwgbGVuLCBoZWFkZXIpCisgICAgY2hhciAgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovCisgICAgaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovCit7CisgICAgYmlfd2luZHVwKCk7ICAgICAgICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisKKyAgICBpZiAoaGVhZGVyKSB7CisgICAgICAgIHB1dF9zaG9ydCgodXNoKWxlbik7CisgICAgICAgIHB1dF9zaG9ydCgodXNoKX5sZW4pOworI2lmZGVmIERFQlVHCisgICAgICAgIGJpdHNfc2VudCArPSAyKjE2OworI2VuZGlmCisgICAgfQorI2lmZGVmIERFQlVHCisgICAgYml0c19zZW50ICs9ICh1bGcpbGVuPDwzOworI2VuZGlmCisgICAgd2hpbGUgKGxlbi0tKSB7CisJcHV0X2J5dGUoKmJ1ZisrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS91c3IvZ3ppcC9kZWZsYXRlLmMgYi91c3IvZ3ppcC9kZWZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiNDRmZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL2RlZmxhdGUuYwpAQCAtMCwwICsxLDc1OSBAQAorLyogZGVmbGF0ZS5jIC0tIGNvbXByZXNzIGRhdGEgdXNpbmcgdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKi8KKworLyoKKyAqICBQVVJQT1NFCisgKgorICogICAgICBJZGVudGlmeSBuZXcgdGV4dCBhcyByZXBldGl0aW9ucyBvZiBvbGQgdGV4dCB3aXRoaW4gYSBmaXhlZC0KKyAqICAgICAgbGVuZ3RoIHNsaWRpbmcgd2luZG93IHRyYWlsaW5nIGJlaGluZCB0aGUgbmV3IHRleHQuCisgKgorICogIERJU0NVU1NJT04KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIGRlcGVuZHMgb24gYmVpbmcgYWJsZSB0byBpZGVudGlmeSBwb3J0aW9ucworICogICAgICBvZiB0aGUgaW5wdXQgdGV4dCB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIGVhcmxpZXIgaW5wdXQgKHdpdGhpbiBhCisgKiAgICAgIHNsaWRpbmcgd2luZG93IHRyYWlsaW5nIGJlaGluZCB0aGUgaW5wdXQgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCkuCisgKgorICogICAgICBUaGUgbW9zdCBzdHJhaWdodGZvcndhcmQgdGVjaG5pcXVlIHR1cm5zIG91dCB0byBiZSB0aGUgZmFzdGVzdCBmb3IKKyAqICAgICAgbW9zdCBpbnB1dCBmaWxlczogdHJ5IGFsbCBwb3NzaWJsZSBtYXRjaGVzIGFuZCBzZWxlY3QgdGhlIGxvbmdlc3QuCisgKiAgICAgIFRoZSBrZXkgZmVhdHVyZSBvZiB0aGlzIGFsZ29yaXRobSBpcyB0aGF0IGluc2VydGlvbnMgaW50byB0aGUgc3RyaW5nCisgKiAgICAgIGRpY3Rpb25hcnkgYXJlIHZlcnkgc2ltcGxlIGFuZCB0aHVzIGZhc3QsIGFuZCBkZWxldGlvbnMgYXJlIGF2b2lkZWQKKyAqICAgICAgY29tcGxldGVseS4gSW5zZXJ0aW9ucyBhcmUgcGVyZm9ybWVkIGF0IGVhY2ggaW5wdXQgY2hhcmFjdGVyLCB3aGVyZWFzCisgKiAgICAgIHN0cmluZyBtYXRjaGVzIGFyZSBwZXJmb3JtZWQgb25seSB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBlbmRzLiBTbyBpdAorICogICAgICBpcyBwcmVmZXJhYmxlIHRvIHNwZW5kIG1vcmUgdGltZSBpbiBtYXRjaGVzIHRvIGFsbG93IHZlcnkgZmFzdCBzdHJpbmcKKyAqICAgICAgaW5zZXJ0aW9ucyBhbmQgYXZvaWQgZGVsZXRpb25zLiBUaGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGZvciBzbWFsbAorICogICAgICBzdHJpbmdzIGlzIGluc3BpcmVkIGZyb20gdGhhdCBvZiBSYWJpbiAmIEthcnAuIEEgYnJ1dGUgZm9yY2UgYXBwcm9hY2gKKyAqICAgICAgaXMgdXNlZCB0byBmaW5kIGxvbmdlciBzdHJpbmdzIHdoZW4gYSBzbWFsbCBtYXRjaCBoYXMgYmVlbiBmb3VuZC4KKyAqICAgICAgQSBzaW1pbGFyIGFsZ29yaXRobSBpcyB1c2VkIGluIGNvbWljIChieSBKYW4tTWFyayBXYW1zKSBhbmQgZnJlZXplCisgKiAgICAgIChieSBMZW9uaWQgQnJvdWtoaXMpLgorICogICAgICAgICBBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVzZWQgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgYWxnb3JpdGhtCisgKiAgICAgIChieSBGaWFsYSBhbmQgR3JlZW5lKSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiBsaW5lYXIgYW1vcnRpemVkCisgKiAgICAgIHRpbWUsIGJ1dCBoYXMgYSBsYXJnZXIgYXZlcmFnZSBjb3N0LCB1c2VzIG1vcmUgbWVtb3J5IGFuZCBpcyBwYXRlbnRlZC4KKyAqICAgICAgSG93ZXZlciB0aGUgRiZHIGFsZ29yaXRobSBtYXkgYmUgZmFzdGVyIGZvciBzb21lIGhpZ2hseSByZWR1bmRhbnQKKyAqICAgICAgZmlsZXMgaWYgdGhlIHBhcmFtZXRlciBtYXhfY2hhaW5fbGVuZ3RoIChkZXNjcmliZWQgYmVsb3cpIGlzIHRvbyBsYXJnZS4KKyAqCisgKiAgQUNLTk9XTEVER0VNRU5UUworICoKKyAqICAgICAgVGhlIGlkZWEgb2YgbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgaXMgZHVlIHRvIEphbi1NYXJrIFdhbXMsIGFuZAorICogICAgICBJIGZvdW5kIGl0IGluICdmcmVlemUnIHdyaXR0ZW4gYnkgTGVvbmlkIEJyb3VraGlzLgorICogICAgICBUaGFua3MgdG8gbWFueSBpbmZvLXppcHBlcnMgZm9yIGJ1ZyByZXBvcnRzIGFuZCB0ZXN0aW5nLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBBUFBOT1RFLlRYVCBkb2N1bWVudGF0aW9uIGZpbGUgaW4gUEtaSVAgMS45M2EgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICAgQSBkZXNjcmlwdGlvbiBvZiB0aGUgUmFiaW4gYW5kIEthcnAgYWxnb3JpdGhtIGlzIGdpdmVuIGluIHRoZSBib29rCisgKiAgICAgICAgICJBbGdvcml0aG1zIiBieSBSLiBTZWRnZXdpY2ssIEFkZGlzb24tV2VzbGV5LCBwMjUyLgorICoKKyAqICAgICAgRmlhbGEsRS5SLiwgYW5kIEdyZWVuZSxELkguCisgKiAgICAgICAgIERhdGEgQ29tcHJlc3Npb24gd2l0aCBGaW5pdGUgV2luZG93cywgQ29tbS5BQ00sIDMyLDQgKDE5ODkpIDQ5MC01OTUKKyAqCisgKiAgSU5URVJGQUNFCisgKgorICogICAgICB2b2lkIGxtX2luaXQgKGludCBwYWNrX2xldmVsLCB1c2ggKmZsYWdzKQorICogICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgImxvbmdlc3QgbWF0Y2giIHJvdXRpbmVzIGZvciBhIG5ldyBmaWxlCisgKgorICogICAgICB1bGcgZGVmbGF0ZSAodm9pZCkKKyAqICAgICAgICAgIFByb2Nlc3NlcyBhIG5ldyBpbnB1dCBmaWxlIGFuZCByZXR1cm4gaXRzIGNvbXByZXNzZWQgbGVuZ3RoLiBTZXRzCisgKiAgICAgICAgICB0aGUgY29tcHJlc3NlZCBsZW5ndGgsIGNyYywgZGVmbGF0ZSBmbGFncyBhbmQgaW50ZXJuYWwgZmlsZQorICogICAgICAgICAgYXR0cmlidXRlcy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInRhaWxvci5oIgorI2luY2x1ZGUgImd6aXAuaCIKKworI2lmZGVmIFJDU0lECitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZGVmbGF0ZS5jLHYgMS4xIDIwMDIvMDgvMTggMDA6NTk6MjEgaHBhIEV4cCAkIjsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICovCisKKy8qIENvbXBpbGUgd2l0aCBNRURJVU1fTUVNIHRvIHJlZHVjZSB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBvcgorICogd2l0aCBTTUFMTF9NRU0gdG8gdXNlIGFzIGxpdHRsZSBtZW1vcnkgYXMgcG9zc2libGUuIFVzZSBCSUdfTUVNIGlmIHRoZQorICogZW50aXJlIGlucHV0IGZpbGUgY2FuIGJlIGhlbGQgaW4gbWVtb3J5IChub3QgcG9zc2libGUgb24gMTYgYml0IHN5c3RlbXMpLgorICogV2FybmluZzogZGVmaW5pbmcgdGhlc2Ugc3ltYm9scyBhZmZlY3RzIEhBU0hfQklUUyAoc2VlIGJlbG93KSBhbmQgdGh1cworICogYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8uIFRoZSBjb21wcmVzc2VkIG91dHB1dAorICogaXMgc3RpbGwgY29ycmVjdCwgYW5kIG1pZ2h0IGV2ZW4gYmUgc21hbGxlciBpbiBzb21lIGNhc2VzLgorICovCisKKyNpZmRlZiBTTUFMTF9NRU0KKyMgICBkZWZpbmUgSEFTSF9CSVRTICAxMyAgLyogTnVtYmVyIG9mIGJpdHMgdXNlZCB0byBoYXNoIHN0cmluZ3MgKi8KKyNlbmRpZgorI2lmZGVmIE1FRElVTV9NRU0KKyMgICBkZWZpbmUgSEFTSF9CSVRTICAxNAorI2VuZGlmCisjaWZuZGVmIEhBU0hfQklUUworIyAgIGRlZmluZSBIQVNIX0JJVFMgIDE1CisgICAvKiBGb3IgcG9ydGFiaWxpdHkgdG8gMTYgYml0IG1hY2hpbmVzLCBkbyBub3QgdXNlIHZhbHVlcyBhYm92ZSAxNS4gKi8KKyNlbmRpZgorCisvKiBUbyBzYXZlIHNwYWNlIChzZWUgdW5sencuYyksIHdlIG92ZXJsYXkgcHJlditoZWFkIHdpdGggdGFiX3ByZWZpeCBhbmQKKyAqIHdpbmRvdyB3aXRoIHRhYl9zdWZmaXguIENoZWNrIHRoYXQgd2UgY2FuIGRvIHRoaXM6CisgKi8KKyNpZiAoV1NJWkU8PDEpID4gKDE8PEJJVFMpCisgICBlcnJvcjogY2Fubm90IG92ZXJsYXkgd2luZG93IHdpdGggdGFiX3N1ZmZpeCBhbmQgcHJldiB3aXRoIHRhYl9wcmVmaXgwCisjZW5kaWYKKyNpZiBIQVNIX0JJVFMgPiBCSVRTLTEKKyAgIGVycm9yOiBjYW5ub3Qgb3ZlcmxheSBoZWFkIHdpdGggdGFiX3ByZWZpeDEKKyNlbmRpZgorCisjZGVmaW5lIEhBU0hfU0laRSAodW5zaWduZWQpKDE8PEhBU0hfQklUUykKKyNkZWZpbmUgSEFTSF9NQVNLIChIQVNIX1NJWkUtMSkKKyNkZWZpbmUgV01BU0sgICAgIChXU0laRS0xKQorLyogSEFTSF9TSVpFIGFuZCBXU0laRSBtdXN0IGJlIHBvd2VycyBvZiB0d28gKi8KKworI2RlZmluZSBOSUwgMAorLyogVGFpbCBvZiBoYXNoIGNoYWlucyAqLworCisjZGVmaW5lIEZBU1QgNAorI2RlZmluZSBTTE9XIDIKKy8qIHNwZWVkIG9wdGlvbnMgZm9yIHRoZSBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgKi8KKworI2lmbmRlZiBUT09fRkFSCisjICBkZWZpbmUgVE9PX0ZBUiA0MDk2CisjZW5kaWYKKy8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCBkYXRhIHVzZWQgYnkgdGhlICJsb25nZXN0IG1hdGNoIiByb3V0aW5lcy4KKyAqLworCit0eXBlZGVmIHVzaCBQb3M7Cit0eXBlZGVmIHVuc2lnbmVkIElQb3M7CisvKiBBIFBvcyBpcyBhbiBpbmRleCBpbiB0aGUgY2hhcmFjdGVyIHdpbmRvdy4gV2UgdXNlIHNob3J0IGluc3RlYWQgb2YgaW50IHRvCisgKiBzYXZlIHNwYWNlIGluIHRoZSB2YXJpb3VzIHRhYmxlcy4gSVBvcyBpcyB1c2VkIG9ubHkgZm9yIHBhcmFtZXRlciBwYXNzaW5nLgorICovCisKKy8qIERFQ0xBUkUodWNoLCB3aW5kb3csIDJMKldTSVpFKTsgKi8KKy8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LAorICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3QgV1NJWkUKKyAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKKyAqIFdTSVpFLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5cworICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cworICogdGhlIHdpbmRvdyBzaXplIHRvIDY0Sywgd2hpY2ggaXMgcXVpdGUgdXNlZnVsIG9uIE1TRE9TLgorICogVG8gZG86IGxpbWl0IHRoZSB3aW5kb3cgc2l6ZSB0byBXU0laRStCU1ogaWYgU01BTExfTUVNICh0aGUgY29kZSB3b3VsZAorICogYmUgbGVzcyBlZmZpY2llbnQpLgorICovCisKKy8qIERFQ0xBUkUoUG9zLCBwcmV2LCBXU0laRSk7ICovCisvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpcworICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy4KKyAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLgorICovCisKKy8qIERFQ0xBUkUoUG9zLCBoZWFkLCAxPDxIQVNIX0JJVFMpOyAqLworLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi8KKwordWxnIHdpbmRvd19zaXplID0gKHVsZykyKldTSVpFOworLyogd2luZG93IHNpemUsIDIqV1NJWkUgZXhjZXB0IGZvciBNTUFQIG9yIEJJR19NRU0sIHdoZXJlIGl0IGlzIHRoZQorICogaW5wdXQgZmlsZSBsZW5ndGggcGx1cyBNSU5fTE9PS0FIRUFELgorICovCisKK2xvbmcgYmxvY2tfc3RhcnQ7CisvKiB3aW5kb3cgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBvdXRwdXQgYmxvY2suIEdldHMKKyAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuCisgKi8KKworbG9jYWwgdW5zaWduZWQgaW5zX2g7ICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqLworCisjZGVmaW5lIEhfU0hJRlQgICgoSEFTSF9CSVRTK01JTl9NQVRDSC0xKS9NSU5fTUFUQ0gpCisvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBhbmQgZGVsX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2gKKyAqIGlucHV0IHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdAorICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6CisgKiAgIEhfU0hJRlQgKiBNSU5fTUFUQ0ggPj0gSEFTSF9CSVRTCisgKi8KKwordW5zaWduZWQgaW50IHByZXZfbGVuZ3RoOworLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzCisgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi4KKyAqLworCisgICAgICB1bnNpZ25lZCAgICAgIHN0cnN0YXJ0OyAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi8KKyAgICAgIHVuc2lnbmVkICAgICAgbWF0Y2hfc3RhcnQ7ICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovCitsb2NhbCBpbnQgICAgICAgICAgIGVvZmlsZTsgICAgICAgIC8qIGZsYWcgc2V0IGF0IGVuZCBvZiBpbnB1dCBmaWxlICovCitsb2NhbCB1bnNpZ25lZCAgICAgIGxvb2thaGVhZDsgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi8KKwordW5zaWduZWQgbWF4X2NoYWluX2xlbmd0aDsKKy8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzIGxlbmd0aC4KKyAqIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGUgc3BlZWQuCisgKi8KKworbG9jYWwgdW5zaWduZWQgaW50IG1heF9sYXp5X21hdGNoOworLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseQorICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24KKyAqIGxldmVscyA+PSA0LgorICovCisjZGVmaW5lIG1heF9pbnNlcnRfbGVuZ3RoICBtYXhfbGF6eV9tYXRjaAorLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aAorICogaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuCisgKi8KKworbG9jYWwgaW50IGNvbXByX2xldmVsOworLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovCisKK3Vuc2lnbmVkIGdvb2RfbWF0Y2g7CisvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi8KKworCisvKiBWYWx1ZXMgZm9yIG1heF9sYXp5X21hdGNoLCBnb29kX21hdGNoIGFuZCBtYXhfY2hhaW5fbGVuZ3RoLCBkZXBlbmRpbmcgb24KKyAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUgYmVlbiB0dW5lZCB0bworICogZXhjbHVkZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGZvciBwYXRob2xvZ2ljYWwgZmlsZXMuIEJldHRlciB2YWx1ZXMgbWF5IGJlCisgKiBmb3VuZCBmb3Igc3BlY2lmaWMgZmlsZXMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29uZmlnIHsKKyAgIHVzaCBnb29kX2xlbmd0aDsgLyogcmVkdWNlIGxhenkgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCisgICB1c2ggbWF4X2xhenk7ICAgIC8qIGRvIG5vdCBwZXJmb3JtIGxhenkgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCisgICB1c2ggbmljZV9sZW5ndGg7IC8qIHF1aXQgc2VhcmNoIGFib3ZlIHRoaXMgbWF0Y2ggbGVuZ3RoICovCisgICB1c2ggbWF4X2NoYWluOworfSBjb25maWc7CisKKyNpZmRlZiAgRlVMTF9TRUFSQ0gKKyMgZGVmaW5lIG5pY2VfbWF0Y2ggTUFYX01BVENICisjZWxzZQorICBpbnQgbmljZV9tYXRjaDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqLworI2VuZGlmCisKK2xvY2FsIGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzEwXSA9IHsKKy8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi8KKy8qIDAgKi8gezAsICAgIDAsICAwLCAgICAwfSwgIC8qIHN0b3JlIG9ubHkgKi8KKy8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0fSwgIC8qIG1heGltdW0gc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqLworLyogMiAqLyB7NCwgICAgNSwgMTYsICAgIDh9LAorLyogMyAqLyB7NCwgICAgNiwgMzIsICAgMzJ9LAorCisvKiA0ICovIHs0LCAgICA0LCAxNiwgICAxNn0sICAvKiBsYXp5IG1hdGNoZXMgKi8KKy8qIDUgKi8gezgsICAgMTYsIDMyLCAgIDMyfSwKKy8qIDYgKi8gezgsICAgMTYsIDEyOCwgMTI4fSwKKy8qIDcgKi8gezgsICAgMzIsIDEyOCwgMjU2fSwKKy8qIDggKi8gezMyLCAxMjgsIDI1OCwgMTAyNH0sCisvKiA5ICovIHszMiwgMjU4LCAyNTgsIDQwOTZ9fTsgLyogbWF4aW11bSBjb21wcmVzc2lvbiAqLworCisvKiBOb3RlOiB0aGUgZGVmbGF0ZSgpIGNvZGUgcmVxdWlyZXMgbWF4X2xhenkgPj0gTUlOX01BVENIIGFuZCBtYXhfY2hhaW4gPj0gNAorICogRm9yIGRlZmxhdGVfZmFzdCgpIChsZXZlbHMgPD0gMykgZ29vZCBpcyBpZ25vcmVkIGFuZCBsYXp5IGhhcyBhIGRpZmZlcmVudAorICogbWVhbmluZy4KKyAqLworCisjZGVmaW5lIEVRVUFMIDAKKy8qIHJlc3VsdCBvZiBtZW1jbXAgZm9yIGVxdWFsIHN0cmluZ3MgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorICovCitsb2NhbCB2b2lkIGZpbGxfd2luZG93ICAgT0YoKHZvaWQpKTsKK2xvY2FsIHVsZyBkZWZsYXRlX2Zhc3QgICBPRigodm9pZCkpOworCisgICAgICBpbnQgIGxvbmdlc3RfbWF0Y2ggT0YoKElQb3MgY3VyX21hdGNoKSk7CisjaWZkZWYgQVNNVgorICAgICAgdm9pZCBtYXRjaF9pbml0IE9GKCh2b2lkKSk7IC8qIGFzbSBjb2RlIGluaXRpYWxpemF0aW9uICovCisjZW5kaWYKKworI2lmZGVmIERFQlVHCitsb2NhbCAgdm9pZCBjaGVja19tYXRjaCBPRigoSVBvcyBzdGFydCwgSVBvcyBtYXRjaCwgaW50IGxlbmd0aCkpOworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGEgaGFzaCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbnB1dCBieXRlCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gVVBEQVRFX0hBU0ggYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogICAgaW5wdXQgY2hhcmFjdGVycywgc28gdGhhdCBhIHJ1bm5pbmcgaGFzaCBrZXkgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlCisgKiAgICBwcmV2aW91cyBrZXkgaW5zdGVhZCBvZiBjb21wbGV0ZSByZWNhbGN1bGF0aW9uIGVhY2ggdGltZS4KKyAqLworI2RlZmluZSBVUERBVEVfSEFTSChoLGMpIChoID0gKCgoaCk8PEhfU0hJRlQpIF4gKGMpKSAmIEhBU0hfTUFTSykKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbnNlcnQgc3RyaW5nIHMgaW4gdGhlIGRpY3Rpb25hcnkgYW5kIHNldCBtYXRjaF9oZWFkIHRvIHRoZSBwcmV2aW91cyBoZWFkCisgKiBvZiB0aGUgaGFzaCBjaGFpbiAodGhlIG1vc3QgcmVjZW50IHN0cmluZyB3aXRoIHNhbWUgaGFzaCBrZXkpLiBSZXR1cm4KKyAqIHRoZSBwcmV2aW91cyBsZW5ndGggb2YgdGhlIGhhc2ggY2hhaW4uCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHMgYXJlIHZhbGlkCisgKiAgICAoZXhjZXB0IGZvciB0aGUgbGFzdCBNSU5fTUFUQ0gtMSBieXRlcyBvZiB0aGUgaW5wdXQgZmlsZSkuCisgKi8KKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBtYXRjaF9oZWFkKSBcCisgICAoVVBEQVRFX0hBU0goaW5zX2gsIHdpbmRvd1socykgKyBNSU5fTUFUQ0gtMV0pLCBcCisgICAgcHJldlsocykgJiBXTUFTS10gPSBtYXRjaF9oZWFkID0gaGVhZFtpbnNfaF0sIFwKKyAgICBoZWFkW2luc19oXSA9IChzKSkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IGZpbGUKKyAqLwordm9pZCBsbV9pbml0IChwYWNrX2xldmVsLCBmbGFncykKKyAgICBpbnQgcGFja19sZXZlbDsgLyogMDogc3RvcmUsIDE6IGJlc3Qgc3BlZWQsIDk6IGJlc3QgY29tcHJlc3Npb24gKi8KKyAgICB1c2ggKmZsYWdzOyAgICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICovCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgajsKKworICAgIGlmIChwYWNrX2xldmVsIDwgMSB8fCBwYWNrX2xldmVsID4gOSkgZXJyb3IoImJhZCBwYWNrIGxldmVsIik7CisgICAgY29tcHJfbGV2ZWwgPSBwYWNrX2xldmVsOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZS4gKi8KKyAgICBtZW16ZXJvKChjaGFyKiloZWFkLCBIQVNIX1NJWkUqc2l6ZW9mKCpoZWFkKSk7CisKKyAgICAvKiBwcmV2IHdpbGwgYmUgaW5pdGlhbGl6ZWQgb24gdGhlIGZseSAqLworCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczoKKyAgICAgKi8KKyAgICBtYXhfbGF6eV9tYXRjaCAgID0gY29uZmlndXJhdGlvbl90YWJsZVtwYWNrX2xldmVsXS5tYXhfbGF6eTsKKyAgICBnb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtwYWNrX2xldmVsXS5nb29kX2xlbmd0aDsKKyNpZm5kZWYgRlVMTF9TRUFSQ0gKKyAgICBuaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtwYWNrX2xldmVsXS5uaWNlX2xlbmd0aDsKKyNlbmRpZgorICAgIG1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3BhY2tfbGV2ZWxdLm1heF9jaGFpbjsKKyAgICBpZiAocGFja19sZXZlbCA9PSAxKSB7CisgICAgICAgKmZsYWdzIHw9IEZBU1Q7CisgICAgfSBlbHNlIGlmIChwYWNrX2xldmVsID09IDkpIHsKKyAgICAgICAqZmxhZ3MgfD0gU0xPVzsKKyAgICB9CisgICAgLyogPz8/IHJlZHVjZSBtYXhfY2hhaW5fbGVuZ3RoIGZvciBiaW5hcnkgZmlsZXMgKi8KKworICAgIHN0cnN0YXJ0ID0gMDsKKyAgICBibG9ja19zdGFydCA9IDBMOworI2lmZGVmIEFTTVYKKyAgICBtYXRjaF9pbml0KCk7IC8qIGluaXRpYWxpemUgdGhlIGFzbSBjb2RlICovCisjZW5kaWYKKworICAgIGxvb2thaGVhZCA9IHJlYWRfYnVmKChjaGFyKil3aW5kb3csCisJCQkgc2l6ZW9mKGludCkgPD0gMiA/ICh1bnNpZ25lZClXU0laRSA6IDIqV1NJWkUpOworCisgICAgaWYgKGxvb2thaGVhZCA9PSAwIHx8IGxvb2thaGVhZCA9PSAodW5zaWduZWQpRU9GKSB7CisgICAgICAgZW9maWxlID0gMSwgbG9va2FoZWFkID0gMDsKKyAgICAgICByZXR1cm47CisgICAgfQorICAgIGVvZmlsZSA9IDA7CisgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZC4gVGhpcyBpcyBpbXBvcnRhbnQKKyAgICAgKiBpZiBpbnB1dCBjb21lcyBmcm9tIGEgZGV2aWNlIHN1Y2ggYXMgYSB0dHkuCisgICAgICovCisgICAgd2hpbGUgKGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgIWVvZmlsZSkgZmlsbF93aW5kb3coKTsKKworICAgIGluc19oID0gMDsKKyAgICBmb3IgKGo9MDsgajxNSU5fTUFUQ0gtMTsgaisrKSBVUERBVEVfSEFTSChpbnNfaCwgd2luZG93W2pdKTsKKyAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCB0aGlzIGlzCisgICAgICogbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLgorICAgICAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZAorICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpcworICogZ2FyYmFnZS4KKyAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnQKKyAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDEKKyAqLworI2lmbmRlZiBBU01WCisvKiBGb3IgTVNET1MsIE9TLzIgYW5kIDM4NiBVbml4LCBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBpcyBpbiBtYXRjaC5hc20gb3IKKyAqIG1hdGNoLnMuIFRoZSBjb2RlIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LCBzbyB5b3UgY2FuIHVzZSB0aGUgQyB2ZXJzaW9uCisgKiBpZiBkZXNpcmVkLgorICovCitpbnQgbG9uZ2VzdF9tYXRjaChjdXJfbWF0Y2gpCisgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCit7CisgICAgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gbWF4X2NoYWluX2xlbmd0aDsgICAvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8KKyAgICByZWdpc3RlciB1Y2ggKnNjYW4gPSB3aW5kb3cgKyBzdHJzdGFydDsgICAgIC8qIGN1cnJlbnQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgdWNoICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLworICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KKyAgICBpbnQgYmVzdF9sZW4gPSBwcmV2X2xlbmd0aDsgICAgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworICAgIElQb3MgbGltaXQgPSBzdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUID8gc3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVCA6IE5JTDsKKyAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisgICAgICovCisKKy8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAqLworI2lmIEhBU0hfQklUUyA8IDggfHwgTUFYX01BVENIICE9IDI1OAorICAgZXJyb3I6IENvZGUgdG9vIGNsZXZlcgorI2VuZGlmCisKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAvKiBDb21wYXJlIHR3byBieXRlcyBhdCBhIHRpbWUuIE5vdGU6IHRoaXMgaXMgbm90IGFsd2F5cyBiZW5lZmljaWFsLgorICAgICAqIFRyeSB3aXRoIGFuZCB3aXRob3V0IC1EVU5BTElHTkVEX09LIHRvIGNoZWNrLgorICAgICAqLworICAgIHJlZ2lzdGVyIHVjaCAqc3RyZW5kID0gd2luZG93ICsgc3Ryc3RhcnQgKyBNQVhfTUFUQ0ggLSAxOworICAgIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2gqKXNjYW47CisgICAgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaCopKHNjYW4rYmVzdF9sZW4tMSk7CisjZWxzZQorICAgIHJlZ2lzdGVyIHVjaCAqc3RyZW5kID0gd2luZG93ICsgc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CisgICAgcmVnaXN0ZXIgdWNoIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgIHJlZ2lzdGVyIHVjaCBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07CisjZW5kaWYKKworICAgIC8qIERvIG5vdCB3YXN0ZSB0b28gbXVjaCB0aW1lIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGdvb2QgbWF0Y2g6ICovCisgICAgaWYgKHByZXZfbGVuZ3RoID49IGdvb2RfbWF0Y2gpIHsKKyAgICAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOworICAgIH0KKyAgICBBc3NlcnQoc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgImluc3VmZmljaWVudCBsb29rYWhlYWQiKTsKKworICAgIGRvIHsKKyAgICAgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisgICAgICAgIG1hdGNoID0gd2luZG93ICsgY3VyX21hdGNoOworCisgICAgICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZQorICAgICAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyOgorICAgICAgICAgKi8KKyNpZiAoZGVmaW5lZChVTkFMSUdORURfT0spICYmIE1BWF9NQVRDSCA9PSAyNTgpCisgICAgICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgPT0gMi4gRG8gbm90IHVzZQorICAgICAgICAgKiBVTkFMSUdORURfT0sgaWYgeW91ciBjb21waWxlciB1c2VzIGEgZGlmZmVyZW50IHNpemUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKih1c2gqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAorICAgICAgICAgICAgKih1c2gqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOworCisgICAgICAgIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5IGFyZQorICAgICAgICAgKiBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQgdGhlIGhhc2gga2V5cworICAgICAgICAgKiBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguIENvbXBhcmUgMiBieXRlcyBhdCBhIHRpbWUgYXQKKyAgICAgICAgICogc3Ryc3RhcnQrMywgKzUsIC4uLiB1cCB0byBzdHJzdGFydCsyNTcuIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQKKyAgICAgICAgICogbG9va2FoZWFkIG9ubHkgZXZlcnkgNHRoIGNvbXBhcmlzb247IHRoZSAxMjh0aCBjaGVjayB3aWxsIGJlIG1hZGUKKyAgICAgICAgICogYXQgc3Ryc3RhcnQrMjU3LiBJZiBNQVhfTUFUQ0gtMiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LCBpdCBpcworICAgICAgICAgKiBuZWNlc3NhcnkgdG8gcHV0IG1vcmUgZ3VhcmQgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LCBvcgorICAgICAgICAgKiB0byBjaGVjayBtb3JlIG9mdGVuIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgc2NhbisrLCBtYXRjaCsrOworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCoodXNoKikoc2Nhbis9MikgPT0gKih1c2gqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2gqKShzY2FuKz0yKSA9PSAqKHVzaCopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaCopKHNjYW4rPTIpID09ICoodXNoKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoKikoc2Nhbis9MikgPT0gKih1c2gqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7CisgICAgICAgIC8qIFRoZSBmdW5ueSAiZG8ge30iIGdlbmVyYXRlcyBiZXR0ZXIgY29kZSBvbiBtb3N0IGNvbXBpbGVycyAqLworCisgICAgICAgIC8qIEhlcmUsIHNjYW4gPD0gd2luZG93K3N0cnN0YXJ0KzI1NyAqLworICAgICAgICBBc3NlcnQoc2NhbiA8PSB3aW5kb3crKHVuc2lnbmVkKSh3aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworICAgICAgICBpZiAoKnNjYW4gPT0gKm1hdGNoKSBzY2FuKys7CisKKyAgICAgICAgbGVuID0gKE1BWF9NQVRDSCAtIDEpIC0gKGludCkoc3RyZW5kLXNjYW4pOworICAgICAgICBzY2FuID0gc3RyZW5kIC0gKE1BWF9NQVRDSC0xKTsKKworI2Vsc2UgLyogVU5BTElHTkVEX09LICovCisKKyAgICAgICAgaWYgKG1hdGNoW2Jlc3RfbGVuXSAgICE9IHNjYW5fZW5kICB8fAorICAgICAgICAgICAgbWF0Y2hbYmVzdF9sZW4tMV0gIT0gc2Nhbl9lbmQxIHx8CisgICAgICAgICAgICAqbWF0Y2ggICAgICAgICAgICAhPSAqc2NhbiAgICAgfHwKKyAgICAgICAgICAgICorK21hdGNoICAgICAgICAgICE9IHNjYW5bMV0pICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKKyAgICAgICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLikKKyAgICAgICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkKKyAgICAgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAorICAgICAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KKyAgICAgICAgICovCisgICAgICAgIHNjYW4gKz0gMiwgbWF0Y2grKzsKKworICAgICAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KKyAgICAgICAgICovCisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworCisgICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisjZW5kaWYgLyogVU5BTElHTkVEX09LICovCisKKyAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7CisgICAgICAgICAgICBtYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOworICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2gqKShzY2FuK2Jlc3RfbGVuLTEpOworI2Vsc2UKKyAgICAgICAgICAgIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgICAgICAgICAgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiBXTUFTS10pID4gbGltaXQKKwkgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOworCisgICAgcmV0dXJuIGJlc3RfbGVuOworfQorI2VuZGlmIC8qIEFTTVYgKi8KKworI2lmZGVmIERFQlVHCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRoYXQgdGhlIG1hdGNoIGF0IG1hdGNoX3N0YXJ0IGlzIGluZGVlZCBhIG1hdGNoLgorICovCitsb2NhbCB2b2lkIGNoZWNrX21hdGNoKHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQorICAgIElQb3Mgc3RhcnQsIG1hdGNoOworICAgIGludCBsZW5ndGg7Cit7CisgICAgLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KKyAgICBpZiAobWVtY21wKChjaGFyKil3aW5kb3cgKyBtYXRjaCwKKyAgICAgICAgICAgICAgICAoY2hhciopd2luZG93ICsgc3RhcnQsIGxlbmd0aCkgIT0gRVFVQUwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiIHN0YXJ0ICVkLCBtYXRjaCAlZCwgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgc3RhcnQsIG1hdGNoLCBsZW5ndGgpOworICAgICAgICBlcnJvcigiaW52YWxpZCBtYXRjaCIpOworICAgIH0KKyAgICBpZiAodmVyYm9zZSA+IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlxcWyVkLCVkXSIsIHN0YXJ0LW1hdGNoLCBsZW5ndGgpOworICAgICAgICBkbyB7IHB1dGMod2luZG93W3N0YXJ0KytdLCBzdGRlcnIpOyB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICB9Cit9CisjZWxzZQorIyAgZGVmaW5lIGNoZWNrX21hdGNoKHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC4KKyAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZCwgYW5kIHNldHMgZW9maWxlIGlmIGVuZCBvZiBpbnB1dCBmaWxlLgorICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHN0cnN0YXJ0ICsgbG9va2FoZWFkID4gMAorICogT1VUIGFzc2VydGlvbnM6IGF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGVvZmlsZSBpcyBzZXQ7CisgKiAgICBmaWxlIHJlYWRzIGFyZSBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZQorICogICAgdHJhbnNsYXRlX2VvbCBvcHRpb24pLgorICovCitsb2NhbCB2b2lkIGZpbGxfd2luZG93KCkKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBuLCBtOworICAgIHVuc2lnbmVkIG1vcmUgPSAodW5zaWduZWQpKHdpbmRvd19zaXplIC0gKHVsZylsb29rYWhlYWQgLSAodWxnKXN0cnN0YXJ0KTsKKyAgICAvKiBBbW91bnQgb2YgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuICovCisKKyAgICAvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLAorICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCisgICAgICovCisgICAgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKUVPRikgeworICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYgc3Ryc3RhcnQgPT0gMAorICAgICAgICAgKiBhbmQgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgb25lIGJ5dGUgYXQgdGltZSkKKyAgICAgICAgICovCisgICAgICAgIG1vcmUtLTsKKyAgICB9IGVsc2UgaWYgKHN0cnN0YXJ0ID49IFdTSVpFK01BWF9ESVNUKSB7CisgICAgICAgIC8qIEJ5IHRoZSBJTiBhc3NlcnRpb24sIHRoZSB3aW5kb3cgaXMgbm90IGVtcHR5IHNvIHdlIGNhbid0IGNvbmZ1c2UKKyAgICAgICAgICogbW9yZSA9PSAwIHdpdGggbW9yZSA9PSA2NEsgb24gYSAxNiBiaXQgbWFjaGluZS4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydCh3aW5kb3dfc2l6ZSA9PSAodWxnKTIqV1NJWkUsICJubyBzbGlkaW5nIHdpdGggQklHX01FTSIpOworCisgICAgICAgIG1lbWNweSgoY2hhciopd2luZG93LCAoY2hhciopd2luZG93K1dTSVpFLCAodW5zaWduZWQpV1NJWkUpOworICAgICAgICBtYXRjaF9zdGFydCAtPSBXU0laRTsKKyAgICAgICAgc3Ryc3RhcnQgICAgLT0gV1NJWkU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUOiAqLworCisgICAgICAgIGJsb2NrX3N0YXJ0IC09IChsb25nKSBXU0laRTsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgSEFTSF9TSVpFOyBuKyspIHsKKyAgICAgICAgICAgIG0gPSBoZWFkW25dOworICAgICAgICAgICAgaGVhZFtuXSA9IChQb3MpKG0gPj0gV1NJWkUgPyBtLVdTSVpFIDogTklMKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgV1NJWkU7IG4rKykgeworICAgICAgICAgICAgbSA9IHByZXZbbl07CisgICAgICAgICAgICBwcmV2W25dID0gKFBvcykobSA+PSBXU0laRSA/IG0tV1NJWkUgOiBOSUwpOworICAgICAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXQKKyAgICAgICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgICAgICBtb3JlICs9IFdTSVpFOworICAgIH0KKyAgICAvKiBBdCB0aGlzIHBvaW50LCBtb3JlID49IDIgKi8KKyAgICBpZiAoIWVvZmlsZSkgeworICAgICAgICBuID0gcmVhZF9idWYoKGNoYXIqKXdpbmRvdytzdHJzdGFydCtsb29rYWhlYWQsIG1vcmUpOworICAgICAgICBpZiAobiA9PSAwIHx8IG4gPT0gKHVuc2lnbmVkKUVPRikgeworICAgICAgICAgICAgZW9maWxlID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvb2thaGVhZCArPSBuOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCisgKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgorICovCisjZGVmaW5lIEZMVVNIX0JMT0NLKGVvZikgXAorICAgZmx1c2hfYmxvY2soYmxvY2tfc3RhcnQgPj0gMEwgPyAoY2hhciopJndpbmRvd1sodW5zaWduZWQpYmxvY2tfc3RhcnRdIDogXAorICAgICAgICAgICAgICAgIChjaGFyKilOVUxMLCAobG9uZylzdHJzdGFydCAtIGJsb2NrX3N0YXJ0LCAoZW9mKSkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcm9jZXNzZXMgYSBuZXcgaW5wdXQgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb21wcmVzc2VkIGxlbmd0aC4gVGhpcworICogZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb25vZiBtYXRjaGVzIGFuZCBpbnNlcnRzCisgKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnQKKyAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy4KKyAqLworbG9jYWwgdWxnIGRlZmxhdGVfZmFzdCgpCit7CisgICAgSVBvcyBoYXNoX2hlYWQ7IC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi8KKyAgICBpbnQgZmx1c2g7ICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisgICAgdW5zaWduZWQgbWF0Y2hfbGVuZ3RoID0gMDsgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovCisKKyAgICBwcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgIHdoaWxlIChsb29rYWhlYWQgIT0gMCkgeworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgSU5TRVJUX1NUUklORyhzdHJzdGFydCwgaGFzaF9oZWFkKTsKKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAoaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisgICAgICAgICAgICBpZiAobWF0Y2hfbGVuZ3RoID4gbG9va2FoZWFkKSBtYXRjaF9sZW5ndGggPSBsb29rYWhlYWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHN0cnN0YXJ0LCBtYXRjaF9zdGFydCwgbWF0Y2hfbGVuZ3RoKTsKKworICAgICAgICAgICAgZmx1c2ggPSBjdF90YWxseShzdHJzdGFydC1tYXRjaF9zdGFydCwgbWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTsKKworICAgICAgICAgICAgbG9va2FoZWFkIC09IG1hdGNoX2xlbmd0aDsKKworCSAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCisgICAgICAgICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobWF0Y2hfbGVuZ3RoIDw9IG1heF9pbnNlcnRfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIGhhc2ggdGFibGUgKi8KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0Kys7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcoc3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4gSWYgbG9va2FoZWFkIDwgTUlOX01BVENICisgICAgICAgICAgICAgICAgICAgICAqIHRoZXNlIGJ5dGVzIGFyZSBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3QgbWF0dGVyIHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBuZXh0IGxvb2thaGVhZCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQgYXMgbGl0ZXJhbHMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbWF0Y2hfbGVuZ3RoICE9IDApOworCSAgICAgICAgc3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJICAgICAgICBzdHJzdGFydCArPSBtYXRjaF9sZW5ndGg7CisJICAgICAgICBtYXRjaF9sZW5ndGggPSAwOworCSAgICAgICAgaW5zX2ggPSB3aW5kb3dbc3Ryc3RhcnRdOworCSAgICAgICAgVVBEQVRFX0hBU0goaW5zX2gsIHdpbmRvd1tzdHJzdGFydCsxXSk7CisjaWYgTUlOX01BVENIICE9IDMKKyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lcworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIix3aW5kb3dbc3Ryc3RhcnRdKSk7CisgICAgICAgICAgICBmbHVzaCA9IGN0X3RhbGx5ICgwLCB3aW5kb3dbc3Ryc3RhcnRdKTsKKyAgICAgICAgICAgIGxvb2thaGVhZC0tOworCSAgICBzdHJzdGFydCsrOworICAgICAgICB9CisgICAgICAgIGlmIChmbHVzaCkgRkxVU0hfQkxPQ0soMCksIGJsb2NrX3N0YXJ0ID0gc3Ryc3RhcnQ7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CisgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQorICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgIWVvZmlsZSkgZmlsbF93aW5kb3coKTsKKworICAgIH0KKyAgICByZXR1cm4gRkxVU0hfQkxPQ0soMSk7IC8qIGVvZiAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenkKKyAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKKyAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uCisgKi8KK3VsZyBkZWZsYXRlKCkKK3sKKyAgICBJUG9zIGhhc2hfaGVhZDsgICAgICAgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCisgICAgSVBvcyBwcmV2X21hdGNoOyAgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovCisgICAgaW50IGZsdXNoOyAgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworICAgIGludCBtYXRjaF9hdmFpbGFibGUgPSAwOyAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7IC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovCisjaWZkZWYgREVCVUcKKyAgICBleHRlcm4gbG9uZyBpc2l6ZTsgICAgICAgIC8qIGJ5dGUgbGVuZ3RoIG9mIGlucHV0IGZpbGUsIGZvciBkZWJ1ZyBvbmx5ICovCisjZW5kaWYKKworICAgIGlmIChjb21wcl9sZXZlbCA8PSAzKSByZXR1cm4gZGVmbGF0ZV9mYXN0KCk7IC8qIG9wdGltaXplZCBmb3Igc3BlZWQgKi8KKworICAgIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqLworICAgIHdoaWxlIChsb29rYWhlYWQgIT0gMCkgeworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgSU5TRVJUX1NUUklORyhzdHJzdGFydCwgaGFzaF9oZWFkKTsKKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKi8KKyAgICAgICAgcHJldl9sZW5ndGggPSBtYXRjaF9sZW5ndGgsIHByZXZfbWF0Y2ggPSBtYXRjaF9zdGFydDsKKyAgICAgICAgbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisKKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcHJldl9sZW5ndGggPCBtYXhfbGF6eV9tYXRjaCAmJgorICAgICAgICAgICAgc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAoaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisgICAgICAgICAgICBpZiAobWF0Y2hfbGVuZ3RoID4gbG9va2FoZWFkKSBtYXRjaF9sZW5ndGggPSBsb29rYWhlYWQ7CisKKyAgICAgICAgICAgIC8qIElnbm9yZSBhIGxlbmd0aCAzIG1hdGNoIGlmIGl0IGlzIHRvbyBkaXN0YW50OiAqLworICAgICAgICAgICAgaWYgKG1hdGNoX2xlbmd0aCA9PSBNSU5fTUFUQ0ggJiYgc3Ryc3RhcnQtbWF0Y2hfc3RhcnQgPiBUT09fRkFSKXsKKyAgICAgICAgICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlCisgICAgICAgICAgICAgICAgICogYnV0IHdlIHdpbGwgaWdub3JlIHRoZSBjdXJyZW50IG1hdGNoIGFueXdheS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBtYXRjaF9sZW5ndGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnQKKyAgICAgICAgICogbWF0Y2ggaXMgbm90IGJldHRlciwgb3V0cHV0IHRoZSBwcmV2aW91cyBtYXRjaDoKKyAgICAgICAgICovCisgICAgICAgIGlmIChwcmV2X2xlbmd0aCA+PSBNSU5fTUFUQ0ggJiYgbWF0Y2hfbGVuZ3RoIDw9IHByZXZfbGVuZ3RoKSB7CisKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHN0cnN0YXJ0LTEsIHByZXZfbWF0Y2gsIHByZXZfbGVuZ3RoKTsKKworICAgICAgICAgICAgZmx1c2ggPSBjdF90YWxseShzdHJzdGFydC0xLXByZXZfbWF0Y2gsIHByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTsKKworICAgICAgICAgICAgLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guCisgICAgICAgICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbG9va2FoZWFkIC09IHByZXZfbGVuZ3RoLTE7CisgICAgICAgICAgICBwcmV2X2xlbmd0aCAtPSAyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHN0cnN0YXJ0Kys7CisgICAgICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4gSWYgbG9va2FoZWFkIDwgTUlOX01BVENICisgICAgICAgICAgICAgICAgICogdGhlc2UgYnl0ZXMgYXJlIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdCBtYXR0ZXIgc2luY2UgdGhlCisgICAgICAgICAgICAgICAgICogbmV4dCBsb29rYWhlYWQgYnl0ZXMgd2lsbCBhbHdheXMgYmUgZW1pdHRlZCBhcyBsaXRlcmFscy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0gd2hpbGUgKC0tcHJldl9sZW5ndGggIT0gMCk7CisgICAgICAgICAgICBtYXRjaF9hdmFpbGFibGUgPSAwOworICAgICAgICAgICAgbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisgICAgICAgICAgICBzdHJzdGFydCsrOworICAgICAgICAgICAgaWYgKGZsdXNoKSBGTFVTSF9CTE9DSygwKSwgYmxvY2tfc3RhcnQgPSBzdHJzdGFydDsKKworICAgICAgICB9IGVsc2UgaWYgKG1hdGNoX2F2YWlsYWJsZSkgeworICAgICAgICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGEKKyAgICAgICAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2gKKyAgICAgICAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwiJWMiLHdpbmRvd1tzdHJzdGFydC0xXSkpOworICAgICAgICAgICAgaWYgKGN0X3RhbGx5ICgwLCB3aW5kb3dbc3Ryc3RhcnQtMV0pKSB7CisgICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0soMCksIGJsb2NrX3N0YXJ0ID0gc3Ryc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJzdGFydCsrOworICAgICAgICAgICAgbG9va2FoZWFkLS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yCisgICAgICAgICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWF0Y2hfYXZhaWxhYmxlID0gMTsKKyAgICAgICAgICAgIHN0cnN0YXJ0Kys7CisgICAgICAgICAgICBsb29rYWhlYWQtLTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQgKHN0cnN0YXJ0IDw9IGlzaXplICYmIGxvb2thaGVhZCA8PSBpc2l6ZSwgImEgYml0IHRvbyBmYXIiKTsKKworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAobG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiAhZW9maWxlKSBmaWxsX3dpbmRvdygpOworICAgIH0KKyAgICBpZiAobWF0Y2hfYXZhaWxhYmxlKSBjdF90YWxseSAoMCwgd2luZG93W3N0cnN0YXJ0LTFdKTsKKworICAgIHJldHVybiBGTFVTSF9CTE9DSygxKTsgLyogZW9mICovCit9CmRpZmYgLS1naXQgYS91c3IvZ3ppcC9nemlwLmMgYi91c3IvZ3ppcC9nemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0YzEyMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL2d6aXAuYwpAQCAtMCwwICsxLDEyMTQgQEAKKy8qIGd6aXAgKEdOVSB6aXApIC0tIGNvbXByZXNzIGZpbGVzIHdpdGggemlwIGFsZ29yaXRobSBhbmQgJ2NvbXByZXNzJyBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkKKyAqIFRoZSB1bnppcCBjb2RlIHdhcyB3cml0dGVuIGFuZCBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgTWFyayBBZGxlci4KKyAqIFBvcnRpb25zIG9mIHRoZSBsencgY29kZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBwdWJsaWMgZG9tYWluICdjb21wcmVzcycKKyAqIHdyaXR0ZW4gYnkgU3BlbmNlciBUaG9tYXMsIEpvZSBPcm9zdCwgSmFtZXMgV29vZHMsIEppbSBNY0tpZSwgU3RldmUgRGF2aWVzLAorICogS2VuIFR1cmtvd3NraSwgRGF2ZSBNYWNrIGFuZCBQZXRlciBKYW5uZXNlbi4KKyAqCisgKiBTZWUgdGhlIGxpY2Vuc2VfbXNnIGJlbG93IGFuZCB0aGUgZmlsZSBDT1BZSU5HIGZvciB0aGUgc29mdHdhcmUgbGljZW5zZS4KKyAqIFNlZSB0aGUgZmlsZSBhbGdvcml0aG0uZG9jIGZvciB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgZmlsZSBmb3JtYXRzLgorICovCisKK3N0YXRpYyBjaGFyICAqbGljZW5zZV9tc2dbXSA9IHsKKyIgICBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5IiwKKyIgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSIsCisiICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkiLAorIiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikiLAorIiAgIGFueSBsYXRlciB2ZXJzaW9uLiIsCisiIiwKKyIgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwiLAorIiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIiwKKyIgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIiwKKyIgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiIsCisiIiwKKyIgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSIsCisiICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUiLAorIiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiIsCiswfTsKKworLyogQ29tcHJlc3MgZmlsZXMgd2l0aCB6aXAgYWxnb3JpdGhtIGFuZCAnY29tcHJlc3MnIGludGVyZmFjZS4KKyAqIFNlZSB1c2FnZSgpIGFuZCBoZWxwKCkgZnVuY3Rpb25zIGJlbG93IGZvciBhbGwgb3B0aW9ucy4KKyAqIE91dHB1dHM6CisgKiAgICAgICAgZmlsZS5nejogICBjb21wcmVzc2VkIGZpbGUgd2l0aCBzYW1lIG1vZGUsIG93bmVyLCBhbmQgdXRpbWVzCisgKiAgICAgb3Igc3Rkb3V0IHdpdGggLWMgb3B0aW9uIG9yIGlmIHN0ZGluIHVzZWQgYXMgaW5wdXQuCisgKiBJZiB0aGUgb3V0cHV0IGZpbGUgbmFtZSBoYWQgdG8gYmUgdHJ1bmNhdGVkLCB0aGUgb3JpZ2luYWwgbmFtZSBpcyBrZXB0CisgKiBpbiB0aGUgY29tcHJlc3NlZCBmaWxlLgorICogT24gTVNET1MsIGZpbGUudG1wIC0+IGZpbGUudG16LiBPbiBWTVMsIGZpbGUudG1wIC0+IGZpbGUudG1wLWd6LgorICoKKyAqIFVzaW5nIGd6IG9uIE1TRE9TIHdvdWxkIGNyZWF0ZSB0b28gbWFueSBmaWxlIG5hbWUgY29uZmxpY3RzLiBGb3IKKyAqIGV4YW1wbGUsIGZvby50eHQgLT4gZm9vLnRneiAoLnRneiBtdXN0IGJlIHJlc2VydmVkIGFzIHNob3J0aGFuZCBmb3IKKyAqIHRhci5neikuIFNpbWlsYXJseSwgZm9vLmRpciBhbmQgZm9vLmRvYyB3b3VsZCBib3RoIGJlIG1hcHBlZCB0byBmb28uZGd6LgorICogSSBhbHNvIGNvbnNpZGVyZWQgMTIzNDU2NzgudHh0IC0+IDEyMzQ1dHh0Lmd6IGJ1dCB0aGlzIHRydW5jYXRlcyB0aGUgbmFtZQorICogdG9vIGhlYXZpbHkuIFRoZXJlIGlzIG5vIGlkZWFsIHNvbHV0aW9uIGdpdmVuIHRoZSBNU0RPUyA4KzMgbGltaXRhdGlvbi4KKyAqCisgKiBGb3IgdGhlIG1lYW5pbmcgb2YgYWxsIGNvbXBpbGF0aW9uIGZsYWdzLCBzZWUgY29tbWVudHMgaW4gTWFrZWZpbGUuaW4uCisgKi8KKworI2lmZGVmIFJDU0lECitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZ3ppcC5jLHYgMS4zIDIwMDUvMDIvMTIgMjE6MDM6Mjggb2xoIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJ0YWlsb3IuaCIKKyNpbmNsdWRlICJnemlwLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8dXRpbWUuaD4KKwordHlwZWRlZiB2b2lkICgqc2lnX3R5cGUpIE9GKChpbnQpKTsKKworI2RlZmluZSBSV19VU0VSIChTX0lSVVNSIHwgU19JV1VTUikgIC8qIGNyZWF0aW9uIG1vZGUgZm9yIG9wZW4oKSAqLworCisjaWZuZGVmIE1BWF9QQVRIX0xFTgorIyAgZGVmaW5lIE1BWF9QQVRIX0xFTiAgIDEwMjQgLyogbWF4IHBhdGhuYW1lIGxlbmd0aCAqLworI2VuZGlmCisKKwkJLyogZ2xvYmFsIGJ1ZmZlcnMgKi8KKworREVDTEFSRSh1Y2gsIGluYnVmLCAgSU5CVUZTSVogK0lOQlVGX0VYVFJBKTsKK0RFQ0xBUkUodWNoLCBvdXRidWYsIE9VVEJVRlNJWitPVVRCVUZfRVhUUkEpOworREVDTEFSRSh1c2gsIGRfYnVmLCAgRElTVF9CVUZTSVpFKTsKK0RFQ0xBUkUodWNoLCB3aW5kb3csIDJMKldTSVpFKTsKK0RFQ0xBUkUodXNoLCB0YWJfcHJlZml4LCAxTDw8QklUUyk7CisKKwkJLyogbG9jYWwgdmFyaWFibGVzICovCisKKyNpZm5kZWYgU1VQUE9SVF9aSVAKKyNkZWZpbmUgZGVjb21wcmVzcyAxCisjZWxzZQoraW50IGxldmVsID0gNjsgICAgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICovCisjZW5kaWYKKworaW50IHRvX3N0ZG91dDsgICAgICAgIC8qIG91dHB1dCB0byBzdGRvdXQgKC1jKSAqLworI2lmbmRlZiBkZWNvbXByZXNzCitpbnQgZGVjb21wcmVzczsgICAgICAgLyogZGVjb21wcmVzcyAoLWQpICovCisjZW5kaWYKK2ludCBmb3JjZTsgICAgICAgICAgICAvKiBkb24ndCBhc2sgcXVlc3Rpb25zLCBjb21wcmVzcyBsaW5rcyAoLWYpICovCitpbnQgbm9fbmFtZSA9IC0xOyAgICAgLyogZG9uJ3Qgc2F2ZSBvciByZXN0b3JlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgKi8KK2ludCBub190aW1lID0gLTE7ICAgICAvKiBkb24ndCBzYXZlIG9yIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGZpbGUgdGltZSAqLworaW50IHZlcmJvc2U7ICAgICAgICAgIC8qIGJlIHZlcmJvc2UgKC12KSAqLworaW50IHF1aWV0OyAgICAgICAgICAgIC8qIGJlIHZlcnkgcXVpZXQgKC1xKSAqLworaW50IHRlc3Q7ICAgICAgICAgICAgIC8qIHRlc3QgLmd6IGZpbGUgaW50ZWdyaXR5ICovCitpbnQgZm9yZWdyb3VuZDsgICAgICAgLyogc2V0IGlmIHByb2dyYW0gcnVuIGluIGZvcmVncm91bmQgKi8KK2NoYXIgKnByb2duYW1lOyAgICAgICAvKiBwcm9ncmFtIG5hbWUgKi8KK2ludCBtZXRob2QgPSBERUZMQVRFRDsvKiBjb21wcmVzc2lvbiBtZXRob2QgKi8KK2ludCBleGl0X2NvZGUgPSBPSzsgICAvKiBwcm9ncmFtIGV4aXQgY29kZSAqLworaW50IHNhdmVfb3JpZ19uYW1lOyAgIC8qIHNldCBpZiBvcmlnaW5hbCBuYW1lIG11c3QgYmUgc2F2ZWQgKi8KK2ludCBsYXN0X21lbWJlcjsgICAgICAvKiBzZXQgZm9yIC56aXAgYW5kIC5aIGZpbGVzICovCitpbnQgcGFydF9uYjsgICAgICAgICAgLyogbnVtYmVyIG9mIHBhcnRzIGluIC5neiBmaWxlICovCit0aW1lX3QgdGltZV9zdGFtcDsgLyogb3JpZ2luYWwgdGltZSBzdGFtcCAobW9kaWZpY2F0aW9uIHRpbWUpICovCitsb25nIGlmaWxlX3NpemU7ICAgICAgLyogaW5wdXQgZmlsZSBzaXplLCAtMSBmb3IgZGV2aWNlcyAoZGVidWcgb25seSkgKi8KK2NoYXIgKmVudjsgICAgICAgICAgICAvKiBjb250ZW50cyBvZiBHWklQIGVudiB2YXJpYWJsZSAqLworY2hhciAqKmFyZ3MgPSBOVUxMOyAgIC8qIGFyZ3YgcG9pbnRlciBpZiBHWklQIGVudiB2YXJpYWJsZSBkZWZpbmVkICovCitjaGFyIHpfc3VmZml4W01BWF9TVUZGSVgrMV07IC8qIGRlZmF1bHQgc3VmZml4IChjYW4gYmUgc2V0IHdpdGggLS1zdWZmaXgpICovCitpbnQgIHpfbGVuOyAgICAgICAgICAgLyogc3RybGVuKHpfc3VmZml4KSAqLworCitsb25nIGhlYWRlcl9ieXRlczsJICAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIGd6aXAgaGVhZGVyICovCitsb25nIGJ5dGVzX2luOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgKi8KK2xvbmcgYnl0ZXNfb3V0OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgKi8KK2xvbmcgdG90YWxfaW47ICAgICAgICAgICAgIC8qIGlucHV0IGJ5dGVzIGZvciBhbGwgZmlsZXMgKi8KK2xvbmcgdG90YWxfb3V0OyAgICAgICAgICAgIC8qIG91dHB1dCBieXRlcyBmb3IgYWxsIGZpbGVzICovCitjaGFyIGlmbmFtZVtNQVhfUEFUSF9MRU5dOyAvKiBpbnB1dCBmaWxlIG5hbWUgKi8KK2NoYXIgb2ZuYW1lW01BWF9QQVRIX0xFTl07IC8qIG91dHB1dCBmaWxlIG5hbWUgKi8KK2ludCAgcmVtb3ZlX29mbmFtZTsJICAgLyogcmVtb3ZlIG91dHB1dCBmaWxlIG9uIGVycm9yICovCitzdHJ1Y3Qgc3RhdCBpc3RhdDsgICAgICAgICAvKiBzdGF0dXMgZm9yIGlucHV0IGZpbGUgKi8KK2ludCAgaWZkOyAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGZpbGUgZGVzY3JpcHRvciAqLworaW50ICBvZmQ7ICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IGZpbGUgZGVzY3JpcHRvciAqLwordW5zaWduZWQgaW5zaXplOyAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gaW5idWYgKi8KK3Vuc2lnbmVkIGlucHRyOyAgICAgICAgICAgIC8qIGluZGV4IG9mIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQgaW4gaW5idWYgKi8KK3Vuc2lnbmVkIG91dGNudDsgICAgICAgICAgIC8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKworLyogbG9jYWwgZnVuY3Rpb25zICovCisKK2xvY2FsIHZvaWQgdXNhZ2UgICAgICAgIE9GKCh2b2lkKSk7Citsb2NhbCB2b2lkIGhlbHAgICAgICAgICBPRigodm9pZCkpOworbG9jYWwgdm9pZCBsaWNlbnNlICAgICAgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgdmVyc2lvbiAgICAgIE9GKCh2b2lkKSk7Citsb2NhbCB2b2lkIHRyZWF0X3N0ZGluICBPRigodm9pZCkpOworbG9jYWwgdm9pZCB0cmVhdF9maWxlICAgT0YoKGNoYXIgKmluYW1lKSk7Citsb2NhbCBpbnQgY3JlYXRlX291dGZpbGUgT0YoKHZvaWQpKTsKK2xvY2FsIGludCAgZG9fc3RhdCAgICAgIE9GKChjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc2J1ZikpOworbG9jYWwgY2hhciAqZ2V0X3N1ZmZpeCAgT0YoKGNoYXIgKm5hbWUpKTsKK2xvY2FsIGludCAgZ2V0X2lzdGF0ICAgIE9GKChjaGFyICppbmFtZSwgc3RydWN0IHN0YXQgKnNidWYpKTsKK2xvY2FsIGludCAgbWFrZV9vZm5hbWUgIE9GKCh2b2lkKSk7Citsb2NhbCBpbnQgIHNhbWVfZmlsZSAgICBPRigoc3RydWN0IHN0YXQgKnN0YXQxLCBzdHJ1Y3Qgc3RhdCAqc3RhdDIpKTsKK2xvY2FsIGludCBuYW1lX3Rvb19sb25nIE9GKChjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdGIpKTsKK2xvY2FsIHZvaWQgc2hvcnRlbl9uYW1lICBPRigoY2hhciAqbmFtZSkpOworbG9jYWwgaW50ICBnZXRfbWV0aG9kICAgT0YoKHZvaWQpKTsKK2xvY2FsIGludCAgY2hlY2tfb2ZuYW1lIE9GKCh2b2lkKSk7Citsb2NhbCB2b2lkIGNvcHlfc3RhdCAgICBPRigoc3RydWN0IHN0YXQgKmlmc3RhdCkpOworbG9jYWwgdm9pZCBkb19leGl0ICAgICAgT0YoKGludCBleGl0Y29kZSkpOworICAgICAgaW50IG1haW4gICAgICAgICAgT0YoKGludCBhcmdjLCBjaGFyICoqYXJndikpOworaW50ICgqd29yaykgT0YoKGludCBpbmZpbGUsIGludCBvdXRmaWxlKSkKKyNpZmRlZiBTVVBQT1JUX1pJUAorID0gemlwOyAvKiBmdW5jdGlvbiB0byBjYWxsICovCisjZWxzZQorID0gdW56aXA7CisjZW5kaWYKK2xvY2FsIHZvaWQgcmVzZXRfdGltZXMgIE9GKChjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdGIpKTsKKworI2RlZmluZSBzdHJlcXUoczEsIHMyKSAoc3RyY21wKChzMSksKHMyKSkgPT0gMCkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB2b2lkIHVzYWdlKCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLWNkZmhsTG5OdHZWMTldIFstUyBzdWZmaXhdIFtmaWxlIC4uLl1cbiIsCisJICAgIHByb2duYW1lKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB2b2lkIGhlbHAoKQoreworICAgIHN0YXRpYyBjaGFyICAqaGVscF9tc2dbXSA9IHsKKyAiIC1jIC0tc3Rkb3V0ICAgICAgd3JpdGUgb24gc3RhbmRhcmQgb3V0cHV0LCBrZWVwIG9yaWdpbmFsIGZpbGVzIHVuY2hhbmdlZCIsCisgIiAtZCAtLWRlY29tcHJlc3MgIGRlY29tcHJlc3MiLAorICIgLWYgLS1mb3JjZSAgICAgICBmb3JjZSBvdmVyd3JpdGUgb2Ygb3V0cHV0IGZpbGUgYW5kIGNvbXByZXNzIGxpbmtzIiwKKyAiIC1oIC0taGVscCAgICAgICAgZ2l2ZSB0aGlzIGhlbHAiLAorICIgLUwgLS1saWNlbnNlICAgICBkaXNwbGF5IHNvZnR3YXJlIGxpY2Vuc2UiLAorI2lmZGVmIFVORE9DVU1FTlRFRAorICIgLW0gLS1uby10aW1lICAgICBkbyBub3Qgc2F2ZSBvciByZXN0b3JlIHRoZSBvcmlnaW5hbCBtb2RpZmljYXRpb24gdGltZSIsCisgIiAtTSAtLXRpbWUgICAgICAgIHNhdmUgb3IgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbW9kaWZpY2F0aW9uIHRpbWUiLAorI2VuZGlmCisgIiAtbiAtLW5vLW5hbWUgICAgIGRvIG5vdCBzYXZlIG9yIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG5hbWUgYW5kIHRpbWUgc3RhbXAiLAorICIgLU4gLS1uYW1lICAgICAgICBzYXZlIG9yIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG5hbWUgYW5kIHRpbWUgc3RhbXAiLAorICIgLXEgLS1xdWlldCAgICAgICBzdXBwcmVzcyBhbGwgd2FybmluZ3MiLAorICIgLVMgLnN1ZiAgLS1zdWZmaXggLnN1ZiAgICAgdXNlIHN1ZmZpeCAuc3VmIG9uIGNvbXByZXNzZWQgZmlsZXMiLAorICIgLXQgLS10ZXN0ICAgICAgICB0ZXN0IGNvbXByZXNzZWQgZmlsZSBpbnRlZ3JpdHkiLAorICIgLXYgLS12ZXJib3NlICAgICB2ZXJib3NlIG1vZGUiLAorICIgLVYgLS12ZXJzaW9uICAgICBkaXNwbGF5IHZlcnNpb24gbnVtYmVyIiwKKyNpZmRlZiBTVVBQT1JUX1pJUAorICIgLTEgLS1mYXN0ICAgICAgICBjb21wcmVzcyBmYXN0ZXIiLAorICIgLTkgLS1iZXN0ICAgICAgICBjb21wcmVzcyBiZXR0ZXIiLAorICIgZmlsZS4uLiAgICAgICAgICBmaWxlcyB0byAoZGUpY29tcHJlc3MuIElmIG5vbmUgZ2l2ZW4sIHVzZSBzdGFuZGFyZCBpbnB1dC4iLAorI2Vsc2UKKyAiIGZpbGUuLi4gICAgICAgICAgZmlsZXMgdG8gZGVjb21wcmVzcy4gSWYgbm9uZSBnaXZlbiwgdXNlIHN0YW5kYXJkIGlucHV0LiIsCisjZW5kaWYKKyAgMH07CisgICAgY2hhciAqKnAgPSBoZWxwX21zZzsKKworICAgIGZwcmludGYoc3RkZXJyLCIlcyAlcyAoJXMpXG4iLCBwcm9nbmFtZSwgVkVSU0lPTiwgUkVWREFURSk7CisgICAgdXNhZ2UoKTsKKyAgICB3aGlsZSAoKnApIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsICpwKyspOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHZvaWQgbGljZW5zZSgpCit7CisgICAgY2hhciAqKnAgPSBsaWNlbnNlX21zZzsKKworICAgIGZwcmludGYoc3RkZXJyLCIlcyAlcyAoJXMpXG4iLCBwcm9nbmFtZSwgVkVSU0lPTiwgUkVWREFURSk7CisgICAgd2hpbGUgKCpwKSBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCAqcCsrKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB2b2lkIHZlcnNpb24oKQoreworICAgIGZwcmludGYoc3RkZXJyLCIlcyAlcyAoJXMpXG4iLCBwcm9nbmFtZSwgVkVSU0lPTiwgUkVWREFURSk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbXBpbGF0aW9uIG9wdGlvbnM6IFVUSU1FIFNURENfSEVBREVSUyIKKyNpZm5kZWYgU1VQUE9SVF9aSVAKKwkiIERFQ09NUFJFU1NfT05MWSIKKyNlbmRpZgorCSJcbiIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBtYWluIChhcmdjLCBhcmd2KQorICAgIGludCBhcmdjOworICAgIGNoYXIgKiphcmd2OworeworICAgIGludCBmaWxlX2NvdW50OyAgICAgLyogbnVtYmVyIG9mIGZpbGVzIHRvIHByZWNlc3MgKi8KKyAgICBpbnQgcHJvZ2xlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBwcm9nbmFtZSAqLworICAgIGludCBvcHRjOyAgICAgICAgICAgLyogY3VycmVudCBvcHRpb24gKi8KKworICAgIHByb2duYW1lID0gYmFzZW5hbWUoYXJndlswXSk7CisgICAgcHJvZ2xlbiA9IHN0cmxlbihwcm9nbmFtZSk7CisKKyAgICAvKiBBZGQgb3B0aW9ucyBpbiBHWklQIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHRoZXJlIGlzIG9uZSAqLworICAgIGVudiA9IGFkZF9lbnZvcHQoJmFyZ2MsICZhcmd2LCBPUFRJT05TX1ZBUik7CisgICAgaWYgKGVudiAhPSBOVUxMKSBhcmdzID0gYXJndjsKKworICAgIGZvcmVncm91bmQgPSBzeXN2X3NpZ25hbChTSUdJTlQsIFNJR19JR04pICE9IFNJR19JR047CisgICAgaWYgKGZvcmVncm91bmQpIHsKKwkodm9pZCkgc3lzdl9zaWduYWwoU0lHSU5ULCAoc2lnX3R5cGUpYWJvcnRfZ3ppcCk7CisgICAgfQorI2lmZGVmIFNJR1RFUk0KKyAgICBpZiAoc3lzdl9zaWduYWwoU0lHVEVSTSwgU0lHX0lHTikgIT0gU0lHX0lHTikgeworCSh2b2lkKSBzeXN2X3NpZ25hbChTSUdURVJNLCAoc2lnX3R5cGUpYWJvcnRfZ3ppcCk7CisgICAgfQorI2VuZGlmCisjaWZkZWYgU0lHSFVQCisgICAgaWYgKHN5c3Zfc2lnbmFsKFNJR0hVUCwgU0lHX0lHTikgIT0gU0lHX0lHTikgeworCSh2b2lkKSBzeXN2X3NpZ25hbChTSUdIVVAsICAoc2lnX3R5cGUpYWJvcnRfZ3ppcCk7CisgICAgfQorI2VuZGlmCisKKyNpZm5kZWYgR05VX1NUQU5EQVJECisgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgY29tcHJlc3MsIHVzZSBwcm9ncmFtIG5hbWUgYXMgYW4gb3B0aW9uLgorICAgICAqIElmIHlvdSBjb21waWxlIHdpdGggLURHTlVfU1RBTkRBUkQsIHRoaXMgcHJvZ3JhbSB3aWxsIGJlaGF2ZSBhcworICAgICAqIGd6aXAgZXZlbiBpZiBpdCBpcyBpbnZva2VkIHVuZGVyIHRoZSBuYW1lIGd1bnppcCBvciB6Y2F0LgorICAgICAqCisgICAgICogU3lzdGVtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBsaW5rcyBjYW4gc3RpbGwgdXNlIC1kIG9yIC1kYy4KKyAgICAgKiBJZ25vcmUgYW4gLmV4ZSBleHRlbnNpb24gZm9yIE1TRE9TLCBPUy8yIGFuZCBWTVMuCisgICAgICovCisjaWZuZGVmIGRlY29tcHJlc3MKKyAgICBpZiAoICBzdHJuY21wKHByb2duYW1lLCAidW4iLCAgMikgPT0gMCAgICAgLyogdW5nemlwLCB1bmNvbXByZXNzICovCisgICAgICAgfHwgc3RybmNtcChwcm9nbmFtZSwgImd1biIsIDMpID09IDApIHsgIC8qIGd1bnppcCAqLworCWRlY29tcHJlc3MgPSAxOworICAgIH0KKyNlbmRpZgorICAgIGlmIChzdHJlcXUocHJvZ25hbWUrMSwgImNhdCIpICAgICAgIC8qIHpjYXQsIHBjYXQsIGdjYXQgKi8KKwl8fCBzdHJlcXUocHJvZ25hbWUsICJnemNhdCIpKSB7ICAgIC8qIGd6Y2F0ICovCisjaWZuZGVmIGRlY29tcHJlc3MKKwlkZWNvbXByZXNzID0gMTsKKyNlbmRpZgorCXRvX3N0ZG91dCA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICBzdHJuY3B5KHpfc3VmZml4LCBaX1NVRkZJWCwgc2l6ZW9mKHpfc3VmZml4KS0xKTsKKyAgICB6X2xlbiA9IHN0cmxlbih6X3N1ZmZpeCk7CisKKyAgICB3aGlsZSAoKG9wdGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImNkZmhIP0xtTW5OcXJTOnR2VjEyMzQ1Njc4OSIpKSAhPSBFT0YpIHsKKwlzd2l0Y2ggKG9wdGMpIHsKKwljYXNlICdjJzoKKwkgICAgdG9fc3Rkb3V0ID0gMTsgYnJlYWs7CisJY2FzZSAnZCc6CisjaWZuZGVmIGRlY29tcHJlc3MKKwkgICAgZGVjb21wcmVzcyA9IDE7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJY2FzZSAnZic6CisJICAgIGZvcmNlKys7IGJyZWFrOworCWNhc2UgJ2gnOiBjYXNlICdIJzogY2FzZSAnPyc6CisJICAgIGhlbHAoKTsgZG9fZXhpdChPSyk7IGJyZWFrOworCWNhc2UgJ0wnOgorCSAgICBsaWNlbnNlKCk7IGRvX2V4aXQoT0spOyBicmVhazsKKwljYXNlICdtJzogLyogdW5kb2N1bWVudGVkLCBtYXkgY2hhbmdlIGxhdGVyICovCisJICAgIG5vX3RpbWUgPSAxOyBicmVhazsKKwljYXNlICdNJzogLyogdW5kb2N1bWVudGVkLCBtYXkgY2hhbmdlIGxhdGVyICovCisJICAgIG5vX3RpbWUgPSAwOyBicmVhazsKKwljYXNlICduJzoKKwkgICAgbm9fbmFtZSA9IG5vX3RpbWUgPSAxOyBicmVhazsKKwljYXNlICdOJzoKKwkgICAgbm9fbmFtZSA9IG5vX3RpbWUgPSAwOyBicmVhazsKKwljYXNlICdxJzoKKwkgICAgcXVpZXQgPSAxOyB2ZXJib3NlID0gMDsgYnJlYWs7CisJY2FzZSAnUyc6CisgICAgICAgICAgICB6X2xlbiA9IHN0cmxlbihvcHRhcmcpOworICAgICAgICAgICAgc3RyY3B5KHpfc3VmZml4LCBvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisJY2FzZSAndCc6CisJICAgIHRlc3QgPSB0b19zdGRvdXQgPSAxOworI2lmbmRlZiBkZWNvbXByZXNzCisJICAgIGRlY29tcHJlc3MgPSAxOworI2VuZGlmCisJICAgIGJyZWFrOworCWNhc2UgJ3YnOgorCSAgICB2ZXJib3NlKys7IHF1aWV0ID0gMDsgYnJlYWs7CisJY2FzZSAnVic6CisJICAgIHZlcnNpb24oKTsgZG9fZXhpdChPSyk7IGJyZWFrOworI2lmZGVmIFNVUFBPUlRfWklQCisJY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOiAgY2FzZSAnNCc6CisJY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOiAgY2FzZSAnOCc6ICBjYXNlICc5JzoKKwkgICAgbGV2ZWwgPSBvcHRjIC0gJzAnOworCSAgICBicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJICAgIC8qIEVycm9yIG1lc3NhZ2UgYWxyZWFkeSBlbWl0dGVkIGJ5IGdldG9wdF9sb25nLiAqLworCSAgICB1c2FnZSgpOworCSAgICBkb19leGl0KEVSUk9SKTsKKwl9CisgICAgfSAvKiBsb29wIG9uIGFsbCBhcmd1bWVudHMgKi8KKworICAgIC8qIEJ5IGRlZmF1bHQsIHNhdmUgbmFtZSBhbmQgdGltZXN0YW1wIG9uIGNvbXByZXNzaW9uIGJ1dCBkbyBub3QKKyAgICAgKiByZXN0b3JlIHRoZW0gb24gZGVjb21wcmVzc2lvbi4KKyAgICAgKi8KKyAgICBpZiAobm9fdGltZSA8IDApIG5vX3RpbWUgPSBkZWNvbXByZXNzOworICAgIGlmIChub19uYW1lIDwgMCkgbm9fbmFtZSA9IGRlY29tcHJlc3M7CisKKyAgICBmaWxlX2NvdW50ID0gYXJnYyAtIG9wdGluZDsKKworICAgIGlmICgoel9sZW4gPT0gMCAmJiAhZGVjb21wcmVzcykgfHwgel9sZW4gPiBNQVhfU1VGRklYKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGluY29ycmVjdCBzdWZmaXggJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICBwcm9nbmFtZSwgb3B0YXJnKTsKKyAgICAgICAgZG9fZXhpdChFUlJPUik7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYWxsIGdsb2JhbCBidWZmZXJzIChmb3IgRFlOX0FMTE9DIG9wdGlvbikgKi8KKyAgICBBTExPQyh1Y2gsIGluYnVmLCAgSU5CVUZTSVogK0lOQlVGX0VYVFJBKTsKKyAgICBBTExPQyh1Y2gsIG91dGJ1ZiwgT1VUQlVGU0laK09VVEJVRl9FWFRSQSk7CisgICAgQUxMT0ModXNoLCBkX2J1ZiwgIERJU1RfQlVGU0laRSk7CisgICAgQUxMT0ModWNoLCB3aW5kb3csIDJMKldTSVpFKTsKKyAgICBBTExPQyh1c2gsIHRhYl9wcmVmaXgsIDFMPDxCSVRTKTsKKworICAgIC8qIEFuZCBnZXQgdG8gd29yayAqLworICAgIGlmIChmaWxlX2NvdW50ICE9IDApIHsKKyAgICAgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKKwkgICAgdHJlYXRfZmlsZShhcmd2W29wdGluZCsrXSk7CisJfQorICAgIH0gZWxzZSB7ICAvKiBTdGFuZGFyZCBpbnB1dCAqLworCXRyZWF0X3N0ZGluKCk7CisgICAgfQorICAgIGRvX2V4aXQoZXhpdF9jb2RlKTsKKyAgICByZXR1cm4gZXhpdF9jb2RlOyAvKiBqdXN0IHRvIGF2b2lkIGxpbnQgd2FybmluZyAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXByZXNzIG9yIGRlY29tcHJlc3Mgc3RkaW4KKyAqLworbG9jYWwgdm9pZCB0cmVhdF9zdGRpbigpCit7CisgICAgaWYgKCFmb3JjZSAmJgorCWlzYXR0eShmaWxlbm8oKEZJTEUgKikoZGVjb21wcmVzcyA/IHN0ZGluIDogc3Rkb3V0KSkpKSB7CisJLyogRG8gbm90IHNlbmQgY29tcHJlc3NlZCBkYXRhIHRvIHRoZSB0ZXJtaW5hbCBvciByZWFkIGl0IGZyb20KKwkgKiB0aGUgdGVybWluYWwuIFdlIGdldCBoZXJlIHdoZW4gdXNlciBpbnZva2VkIHRoZSBwcm9ncmFtCisJICogd2l0aG91dCBwYXJhbWV0ZXJzLCBzbyBiZSBoZWxwZnVsLiBBY2NvcmRpbmcgdG8gdGhlIEdOVSBzdGFuZGFyZHM6CisJICoKKwkgKiAgIElmIHRoZXJlIGlzIG9uZSBiZWhhdmlvciB5b3UgdGhpbmsgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgb3V0cHV0CisJICogICBpcyB0byBhIHRlcm1pbmFsLCBhbmQgYW5vdGhlciB0aGF0IHlvdSB0aGluayBpcyBtb3N0IHVzZWZ1bCB3aGVuCisJICogICB0aGUgb3V0cHV0IGlzIGEgZmlsZSBvciBhIHBpcGUsIHRoZW4gaXQgaXMgdXN1YWxseSBiZXN0IHRvIG1ha2UKKwkgKiAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHRoZSBvbmUgdGhhdCBpcyB1c2VmdWwgd2l0aCBvdXRwdXQgdG8gYQorCSAqICAgdGVybWluYWwsIGFuZCBoYXZlIGFuIG9wdGlvbiBmb3IgdGhlIG90aGVyIGJlaGF2aW9yLgorCSAqCisJICogSGVyZSB3ZSB1c2UgdGhlIC0tZm9yY2Ugb3B0aW9uIHRvIGdldCB0aGUgb3RoZXIgYmVoYXZpb3IuCisJICovCisJZnByaW50ZihzdGRlcnIsCisgICAgIiVzOiBjb21wcmVzc2VkIGRhdGEgbm90ICVzIGEgdGVybWluYWwuIFVzZSAtZiB0byBmb3JjZSAlc2NvbXByZXNzaW9uLlxuIiwKKwkJcHJvZ25hbWUsIGRlY29tcHJlc3MgPyAicmVhZCBmcm9tIiA6ICJ3cml0dGVuIHRvIiwKKwkJZGVjb21wcmVzcyA/ICJkZSIgOiAiIik7CisJZnByaW50ZihzdGRlcnIsIkZvciBoZWxwLCB0eXBlOiAlcyAtaFxuIiwgcHJvZ25hbWUpOworCWRvX2V4aXQoRVJST1IpOworICAgIH0KKworICAgIHN0cmNweShpZm5hbWUsICJzdGRpbiIpOworICAgIHN0cmNweShvZm5hbWUsICJzdGRvdXQiKTsKKworICAgIC8qIEdldCB0aGUgdGltZSBzdGFtcCBvbiB0aGUgaW5wdXQgZmlsZS4gKi8KKyAgICB0aW1lX3N0YW1wID0gMDsgLyogdGltZSB1bmtub3duIGJ5IGRlZmF1bHQgKi8KKworICAgIGlmICghbm9fdGltZSkgeworCWlmIChmc3RhdChmaWxlbm8oc3RkaW4pLCAmaXN0YXQpICE9IDApIHsKKwkgICAgZXJyb3IoImZzdGF0KHN0ZGluKSIpOworCX0KKwl0aW1lX3N0YW1wID0gaXN0YXQuc3RfbXRpbWU7CisgICAgfQorICAgIGlmaWxlX3NpemUgPSAtMUw7IC8qIGNvbnZlbnRpb24gZm9yIHVua25vd24gc2l6ZSAqLworCisgICAgY2xlYXJfYnVmcygpOyAvKiBjbGVhciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgKi8KKyAgICB0b19zdGRvdXQgPSAxOworICAgIHBhcnRfbmIgPSAwOworCisgICAgaWYgKGRlY29tcHJlc3MpIHsKKwltZXRob2QgPSBnZXRfbWV0aG9kKCk7CisJaWYgKG1ldGhvZCA8IDApIHsKKwkgICAgZG9fZXhpdChleGl0X2NvZGUpOyAvKiBlcnJvciBtZXNzYWdlIGFscmVhZHkgZW1pdHRlZCAqLworCX0KKyAgICB9CisKKyAgICAvKiBBY3R1YWxseSBkbyB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4gTG9vcCBvdmVyIHppcHBlZCBtZW1iZXJzLgorICAgICAqLworICAgIGZvciAoOzspIHsKKwlpZiAoKCp3b3JrKShmaWxlbm8oc3RkaW4pLCBmaWxlbm8oc3Rkb3V0KSkgIT0gT0spIHJldHVybjsKKworCWlmICghZGVjb21wcmVzcyB8fCBsYXN0X21lbWJlciB8fCBpbnB0ciA9PSBpbnNpemUpIGJyZWFrOworCS8qIGVuZCBvZiBmaWxlICovCisKKwltZXRob2QgPSBnZXRfbWV0aG9kKCk7CisJaWYgKG1ldGhvZCA8IDApIHJldHVybjsgLyogZXJyb3IgbWVzc2FnZSBhbHJlYWR5IGVtaXR0ZWQgKi8KKwlieXRlc19vdXQgPSAwOyAgICAgICAgICAgIC8qIHJlcXVpcmVkIGZvciBsZW5ndGggY2hlY2sgKi8KKyAgICB9CisKKyAgICBpZiAodmVyYm9zZSkgeworCWlmICh0ZXN0KSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiIE9LXG4iKTsKKworCX0gZWxzZSBpZiAoIWRlY29tcHJlc3MpIHsKKwkgICAgZGlzcGxheV9yYXRpbyhieXRlc19pbi0oYnl0ZXNfb3V0LWhlYWRlcl9ieXRlcyksIGJ5dGVzX2luLCBzdGRlcnIpOworCSAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjaWZkZWYgRElTUExBWV9TVERJTl9SQVRJTworCX0gZWxzZSB7CisJICAgIGRpc3BsYXlfcmF0aW8oYnl0ZXNfb3V0LShieXRlc19pbi1oZWFkZXJfYnl0ZXMpLCBieXRlc19vdXQsc3RkZXJyKTsKKwkgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworI2VuZGlmCisJfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wcmVzcyBvciBkZWNvbXByZXNzIHRoZSBnaXZlbiBmaWxlCisgKi8KK2xvY2FsIHZvaWQgdHJlYXRfZmlsZShpbmFtZSkKKyAgICBjaGFyICppbmFtZTsKK3sKKyAgICAvKiBBY2NlcHQgIi0iIGFzIHN5bm9ueW0gZm9yIHN0ZGluICovCisgICAgaWYgKHN0cmVxdShpbmFtZSwgIi0iKSkgeworCWludCBjZmxhZyA9IHRvX3N0ZG91dDsKKwl0cmVhdF9zdGRpbigpOworCXRvX3N0ZG91dCA9IGNmbGFnOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgZmlsZSBpcyBwcmVzZW50LCBzZXQgaWZuYW1lIGFuZCBpc3RhdDogKi8KKyAgICBpZiAoZ2V0X2lzdGF0KGluYW1lLCAmaXN0YXQpICE9IE9LKSByZXR1cm47CisKKyAgICAvKiBJZiB0aGUgaW5wdXQgbmFtZSBpcyB0aGF0IG9mIGEgZGlyZWN0b3J5LCByZWN1cnNlIG9yIGlnbm9yZTogKi8KKyAgICBpZiAoU19JU0RJUihpc3RhdC5zdF9tb2RlKSkgeworCVdBUk4oKHN0ZGVyciwiJXM6ICVzIGlzIGEgZGlyZWN0b3J5IC0tIGlnbm9yZWRcbiIsIHByb2duYW1lLCBpZm5hbWUpKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmICghU19JU1JFRyhpc3RhdC5zdF9tb2RlKSkgeworCVdBUk4oKHN0ZGVyciwKKwkgICAgICAiJXM6ICVzIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIHJlZ3VsYXIgZmlsZSAtIGlnbm9yZWRcbiIsCisJICAgICAgcHJvZ25hbWUsIGlmbmFtZSkpOworCXJldHVybjsKKyAgICB9CisgICAgaWYgKGlzdGF0LnN0X25saW5rID4gMSAmJiAhdG9fc3Rkb3V0ICYmICFmb3JjZSkgeworCVdBUk4oKHN0ZGVyciwgIiVzOiAlcyBoYXMgJWQgb3RoZXIgbGluayVjIC0tIHVuY2hhbmdlZFxuIiwKKwkgICAgICBwcm9nbmFtZSwgaWZuYW1lLAorCSAgICAgIChpbnQpaXN0YXQuc3RfbmxpbmsgLSAxLCBpc3RhdC5zdF9ubGluayA+IDIgPyAncycgOiAnICcpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWZpbGVfc2l6ZSA9IGlzdGF0LnN0X3NpemU7CisgICAgdGltZV9zdGFtcCA9IG5vX3RpbWUgPyAwIDogaXN0YXQuc3RfbXRpbWU7CisKKyAgICAvKiBHZW5lcmF0ZSBvdXRwdXQgZmlsZSBuYW1lLiBGb3IgLXIgYW5kICgtdCBvciAtbCksIHNraXAgZmlsZXMKKyAgICAgKiB3aXRob3V0IGEgdmFsaWQgZ3ppcCBzdWZmaXggKGNoZWNrIGRvbmUgaW4gbWFrZV9vZm5hbWUpLgorICAgICAqLworICAgIGlmICh0b19zdGRvdXQgJiYgIXRlc3QpIHsKKwlzdHJjcHkob2ZuYW1lLCAic3Rkb3V0Iik7CisKKyAgICB9IGVsc2UgaWYgKG1ha2Vfb2ZuYW1lKCkgIT0gT0spIHsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZSBhbmQgZGV0ZXJtaW5lIGNvbXByZXNzaW9uIG1ldGhvZC4gVGhlIG1vZGUKKyAgICAgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZCBidXQgcmVxdWlyZWQgYnkgc29tZSBzeXN0ZW1zIChWTVMpIGFuZCBmb3JiaWRkZW4KKyAgICAgKiBvbiBvdGhlciBzeXN0ZW1zIChNYWNPUykuCisgICAgICovCisgICAgaWZkID0gb3BlbihpZm5hbWUsICFkZWNvbXByZXNzID8gT19SRE9OTFkgOiBPX1JET05MWSwKKwkgICAgICAgUldfVVNFUik7CisgICAgaWYgKGlmZCA9PSAtMSkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKKwlwZXJyb3IoaWZuYW1lKTsKKwlleGl0X2NvZGUgPSBFUlJPUjsKKwlyZXR1cm47CisgICAgfQorICAgIGNsZWFyX2J1ZnMoKTsgLyogY2xlYXIgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzICovCisgICAgcGFydF9uYiA9IDA7CisKKyAgICBpZiAoZGVjb21wcmVzcykgeworCW1ldGhvZCA9IGdldF9tZXRob2QoKTsgLyogdXBkYXRlcyBvZm5hbWUgaWYgb3JpZ2luYWwgZ2l2ZW4gKi8KKwlpZiAobWV0aG9kIDwgMCkgeworCSAgICBjbG9zZShpZmQpOworCSAgICByZXR1cm47ICAgICAgICAgICAgICAgLyogZXJyb3IgbWVzc2FnZSBhbHJlYWR5IGVtaXR0ZWQgKi8KKwl9CisgICAgfQorCisgICAgLyogSWYgY29tcHJlc3NpbmcgdG8gYSBmaWxlLCBjaGVjayBpZiBvZm5hbWUgaXMgbm90IGFtYmlndW91cworICAgICAqIGJlY2F1c2UgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdHJ1bmNhdGVzIG5hbWVzLiBPdGhlcndpc2UsIGdlbmVyYXRlCisgICAgICogYSBuZXcgb2ZuYW1lIGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBuYW1lIGluIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICAgICovCisgICAgaWYgKHRvX3N0ZG91dCkgeworCW9mZCA9IGZpbGVubyhzdGRvdXQpOworCS8qIGtlZXAgcmVtb3ZlX29mbmFtZSBhcyB6ZXJvICovCisgICAgfSBlbHNlIHsKKwlpZiAoY3JlYXRlX291dGZpbGUoKSAhPSBPSykgcmV0dXJuOworCisJaWYgKCFkZWNvbXByZXNzICYmIHNhdmVfb3JpZ19uYW1lICYmICF2ZXJib3NlICYmICFxdWlldCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBjb21wcmVzc2VkIHRvICVzXG4iLAorCQkgICAgcHJvZ25hbWUsIGlmbmFtZSwgb2ZuYW1lKTsKKwl9CisgICAgfQorICAgIC8qIEtlZXAgdGhlIG5hbWUgZXZlbiBpZiBub3QgdHJ1bmNhdGVkIGV4Y2VwdCB3aXRoIC0tbm8tbmFtZTogKi8KKyAgICBpZiAoIXNhdmVfb3JpZ19uYW1lKSBzYXZlX29yaWdfbmFtZSA9ICFub19uYW1lOworCisgICAgaWYgKHZlcmJvc2UpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOlx0JXMiLCBpZm5hbWUsIChpbnQpc3RybGVuKGlmbmFtZSkgPj0gMTUgPworCQkiIiA6ICgoaW50KXN0cmxlbihpZm5hbWUpID49IDcgPyAiXHQiIDogIlx0XHQiKSk7CisgICAgfQorCisgICAgLyogQWN0dWFsbHkgZG8gdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uIExvb3Agb3ZlciB6aXBwZWQgbWVtYmVycy4KKyAgICAgKi8KKyAgICBmb3IgKDs7KSB7CisJaWYgKCgqd29yaykoaWZkLCBvZmQpICE9IE9LKSB7CisJICAgIG1ldGhvZCA9IC0xOyAvKiBmb3JjZSBjbGVhbnVwICovCisJICAgIGJyZWFrOworCX0KKwlpZiAoIWRlY29tcHJlc3MgfHwgbGFzdF9tZW1iZXIgfHwgaW5wdHIgPT0gaW5zaXplKSBicmVhazsKKwkvKiBlbmQgb2YgZmlsZSAqLworCisJbWV0aG9kID0gZ2V0X21ldGhvZCgpOworCWlmIChtZXRob2QgPCAwKSBicmVhazsgICAgLyogZXJyb3IgbWVzc2FnZSBhbHJlYWR5IGVtaXR0ZWQgKi8KKwlieXRlc19vdXQgPSAwOyAgICAgICAgICAgIC8qIHJlcXVpcmVkIGZvciBsZW5ndGggY2hlY2sgKi8KKyAgICB9CisKKyAgICBjbG9zZShpZmQpOworICAgIGlmICghdG9fc3Rkb3V0ICYmIGNsb3NlKG9mZCkpIHsKKwl3cml0ZV9lcnJvcigpOworICAgIH0KKyAgICBpZiAobWV0aG9kID09IC0xKSB7CisJaWYgKCF0b19zdGRvdXQpIHVubGluayAob2ZuYW1lKTsKKwlyZXR1cm47CisgICAgfQorICAgIC8qIERpc3BsYXkgc3RhdGlzdGljcyAqLworICAgIGlmKHZlcmJvc2UpIHsKKwlpZiAodGVzdCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiBPSyIpOworCX0gZWxzZSBpZiAoZGVjb21wcmVzcykgeworCSAgICBkaXNwbGF5X3JhdGlvKGJ5dGVzX291dC0oYnl0ZXNfaW4taGVhZGVyX2J5dGVzKSwgYnl0ZXNfb3V0LHN0ZGVycik7CisJfSBlbHNlIHsKKwkgICAgZGlzcGxheV9yYXRpbyhieXRlc19pbi0oYnl0ZXNfb3V0LWhlYWRlcl9ieXRlcyksIGJ5dGVzX2luLCBzdGRlcnIpOworCX0KKwlpZiAoIXRlc3QgJiYgIXRvX3N0ZG91dCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiAtLSByZXBsYWNlZCB3aXRoICVzIiwgb2ZuYW1lKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIH0KKyAgICAvKiBDb3B5IG1vZGVzLCB0aW1lcywgb3duZXJzaGlwLCBhbmQgcmVtb3ZlIHRoZSBpbnB1dCBmaWxlICovCisgICAgaWYgKCF0b19zdGRvdXQpIHsKKwljb3B5X3N0YXQoJmlzdGF0KTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gUmV0dXJuIE9LIG9yIEVSUk9SLgorICogVHJ5IHNldmVyYWwgdGltZXMgaWYgbmVjZXNzYXJ5IHRvIGF2b2lkIHRydW5jYXRpbmcgdGhlIHpfc3VmZml4LiBGb3IKKyAqIGV4YW1wbGUsIGRvIG5vdCBjcmVhdGUgYSBjb21wcmVzc2VkIGZpbGUgb2YgbmFtZSAiMTIzNDU2Nzg5MDEyMy4iCisgKiBTZXRzIHNhdmVfb3JpZ19uYW1lIHRvIHRydWUgaWYgdGhlIGZpbGUgbmFtZSBoYXMgYmVlbiB0cnVuY2F0ZWQuCisgKiBJTiBhc3NlcnRpb25zOiB0aGUgaW5wdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIG9wZW4gKGlmZCBpcyBzZXQpIGFuZAorICogICBvZm5hbWUgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIGlmIHRoZXJlIHdhcyBhbiBvcmlnaW5hbCBuYW1lLgorICogT1VUIGFzc2VydGlvbnM6IGlmZCBhbmQgb2ZkIGFyZSBjbG9zZWQgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworbG9jYWwgaW50IGNyZWF0ZV9vdXRmaWxlKCkKK3sKKyAgICBzdHJ1Y3Qgc3RhdAlvc3RhdDsgLyogc3RhdCBmb3Igb2ZuYW1lICovCisgICAgaW50IGZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMOworCisgICAgZm9yICg7OykgeworCS8qIE1ha2Ugc3VyZSB0aGF0IG9mbmFtZSBpcyBub3QgYW4gZXhpc3RpbmcgZmlsZSAqLworCWlmIChjaGVja19vZm5hbWUoKSAhPSBPSykgeworCSAgICBjbG9zZShpZmQpOworCSAgICByZXR1cm4gRVJST1I7CisJfQorCS8qIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgKi8KKwlyZW1vdmVfb2ZuYW1lID0gMTsKKwlvZmQgPSBvcGVuKG9mbmFtZSwgZmxhZ3MsIFJXX1VTRVIpOworCWlmIChvZmQgPT0gLTEpIHsKKwkgICAgcGVycm9yKG9mbmFtZSk7CisJICAgIGNsb3NlKGlmZCk7CisJICAgIGV4aXRfY29kZSA9IEVSUk9SOworCSAgICByZXR1cm4gRVJST1I7CisJfQorCisJLyogQ2hlY2sgZm9yIG5hbWUgdHJ1bmNhdGlvbiBvbiBuZXcgZmlsZSAoMTIzNDU2Nzg5MDEyMy5neikgKi8KKwlpZiAoZnN0YXQob2ZkLCAmb3N0YXQpICE9IDApIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ25hbWUpOworCSAgICBwZXJyb3Iob2ZuYW1lKTsKKwkgICAgY2xvc2UoaWZkKTsgY2xvc2Uob2ZkKTsKKwkgICAgdW5saW5rKG9mbmFtZSk7CisJICAgIGV4aXRfY29kZSA9IEVSUk9SOworCSAgICByZXR1cm4gRVJST1I7CisJfQorCWlmICghbmFtZV90b29fbG9uZyhvZm5hbWUsICZvc3RhdCkpIHJldHVybiBPSzsKKworCWlmIChkZWNvbXByZXNzKSB7CisJICAgIC8qIG5hbWUgbWlnaHQgYmUgdG9vIGxvbmcgaWYgYW4gb3JpZ2luYWwgbmFtZSB3YXMgc2F2ZWQgKi8KKwkgICAgV0FSTigoc3RkZXJyLCAiJXM6ICVzOiB3YXJuaW5nLCBuYW1lIHRydW5jYXRlZFxuIiwKKwkJICBwcm9nbmFtZSwgb2ZuYW1lKSk7CisJICAgIHJldHVybiBPSzsKKwl9CisJY2xvc2Uob2ZkKTsKKwl1bmxpbmsob2ZuYW1lKTsKKwlzaG9ydGVuX25hbWUob2ZuYW1lKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXNlIGxzdGF0IGlmIGF2YWlsYWJsZSwgZXhjZXB0IGZvciAtYyBvciAtZi4gVXNlIHN0YXQgb3RoZXJ3aXNlLgorICogVGhpcyBhbGxvd3MgbGlua3Mgd2hlbiBub3QgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsIGZpbGUuCisgKi8KK2xvY2FsIGludCBkb19zdGF0KG5hbWUsIHNidWYpCisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3Qgc3RhdCAqc2J1ZjsKK3sKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKCF0b19zdGRvdXQgJiYgIWZvcmNlKSB7CisJcmV0dXJuIGxzdGF0KG5hbWUsIHNidWYpOworICAgIH0KKyAgICByZXR1cm4gc3RhdChuYW1lLCBzYnVmKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSAneicgc3VmZml4IG9mIGEgZmlsZSBuYW1lLCBvciBOVUxMLiBGb3IgYWxsCisgKiBzeXN0ZW1zLCAiLmd6IiwgIi56IiwgIi5aIiwgIi50YXoiLCAiLnRneiIsICItZ3oiLCAiLXoiIGFuZCAiX3oiIGFyZQorICogYWNjZXB0ZWQgc3VmZml4ZXMsIGluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZSBvZiB0aGUgLS1zdWZmaXggb3B0aW9uLgorICogIi50Z3oiIGlzIGEgdXNlZnVsIGNvbnZlbnRpb24gZm9yIHRhci56IGZpbGVzIG9uIHN5c3RlbXMgbGltaXRlZAorICogdG8gMyBjaGFyYWN0ZXJzIGV4dGVuc2lvbnMuIE9uIHN1Y2ggc3lzdGVtcywgIi4/eiIgYW5kICIuPz96IiBhcmUKKyAqIGFsc28gYWNjZXB0ZWQgc3VmZml4ZXMuIEZvciBVbml4LCB3ZSBkbyBub3Qgd2FudCB0byBhY2NlcHQgYW55CisgKiAuPz96IHN1ZmZpeCBhcyBpbmRpY2F0aW5nIGEgY29tcHJlc3NlZCBmaWxlOyBzb21lIHBlb3BsZSB1c2UgLnh5egorICogdG8gZGVub3RlIHZvbHVtZSBkYXRhLgorICogICBPbiBzeXN0ZW1zIGFsbG93aW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBzYW1lIGZpbGUgKHN1Y2ggYXMgVk1TKSwKKyAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhbnkgdmVyc2lvbiBzdWZmaXggaW4gdGhlIGdpdmVuIG5hbWUuCisgKi8KK2xvY2FsIGNoYXIgKmdldF9zdWZmaXgobmFtZSkKKyAgICBjaGFyICpuYW1lOworeworICAgIGludCBubGVuLCBzbGVuOworICAgIGNoYXIgc3VmZml4W01BWF9TVUZGSVgrM107IC8qIGxhc3QgY2hhcnMgb2YgbmFtZSwgZm9yY2VkIHRvIGxvd2VyIGNhc2UgKi8KKyAgICBzdGF0aWMgY2hhciAqa25vd25fc3VmZml4ZXNbXSA9CisgICAgICAge3pfc3VmZml4LCAiLmd6IiwgIi56IiwgIi50YXoiLCAiLnRneiIsICItZ3oiLCAiLXoiLCAiX3oiLAorICAgICAgICAgIE5VTEx9OworICAgIGNoYXIgKipzdWYgPSBrbm93bl9zdWZmaXhlczsKKworICAgIGlmIChzdHJlcXUoel9zdWZmaXgsICJ6IikpIHN1ZisrOyAvKiBjaGVjayBsb25nIHN1ZmZpeGVzIGZpcnN0ICovCisKKyAgICBubGVuID0gc3RybGVuKG5hbWUpOworICAgIGlmIChubGVuIDw9IE1BWF9TVUZGSVgrMikgeworICAgICAgICBzdHJjcHkoc3VmZml4LCBuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJjcHkoc3VmZml4LCBuYW1lK25sZW4tTUFYX1NVRkZJWC0yKTsKKyAgICB9CisgICAgc3RybHdyKHN1ZmZpeCk7CisgICAgc2xlbiA9IHN0cmxlbihzdWZmaXgpOworICAgIGRvIHsKKyAgICAgICBpbnQgcyA9IHN0cmxlbigqc3VmKTsKKyAgICAgICBpZiAoc2xlbiA+IHMgJiYgc3VmZml4W3NsZW4tcy0xXSAhPSBQQVRIX1NFUAorICAgICAgICAgICAmJiBzdHJlcXUoc3VmZml4ICsgc2xlbiAtIHMsICpzdWYpKSB7CisgICAgICAgICAgIHJldHVybiBuYW1lK25sZW4tczsKKyAgICAgICB9CisgICAgfSB3aGlsZSAoKisrc3VmICE9IE5VTEwpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgaWZuYW1lIHRvIHRoZSBpbnB1dCBmaWxlIG5hbWUgKHdpdGggYSBzdWZmaXggYXBwZW5kZWQgaWYgbmVjZXNzYXJ5KQorICogYW5kIGlzdGF0IHRvIGl0cyBzdGF0cy4gRm9yIGRlY29tcHJlc3Npb24sIGlmIG5vIGZpbGUgZXhpc3RzIHdpdGggdGhlCisgKiBvcmlnaW5hbCBuYW1lLCB0cnkgYWRkaW5nIHN1Y2Nlc3NpdmVseSB6X3N1ZmZpeCwgLmd6LCAueiwgLXogYW5kIC5aLgorICogRm9yIE1TRE9TLCB3ZSB0cnkgb25seSB6X3N1ZmZpeCBhbmQgei4KKyAqIFJldHVybiBPSyBvciBFUlJPUi4KKyAqLworbG9jYWwgaW50IGdldF9pc3RhdChpbmFtZSwgc2J1ZikKKyAgICBjaGFyICppbmFtZTsKKyAgICBzdHJ1Y3Qgc3RhdCAqc2J1ZjsKK3sKKyAgICBpbnQgaWxlbjsgIC8qIHN0cmxlbihpZm5hbWUpICovCisgICAgc3RhdGljIGNoYXIgKnN1ZmZpeGVzW10gPSB7el9zdWZmaXgsICIuZ3oiLCAiLnoiLCAiLXoiLCAiLloiLCBOVUxMfTsKKyAgICBjaGFyICoqc3VmID0gc3VmZml4ZXM7CisgICAgY2hhciAqczsKKworICAgIHN0cmNweShpZm5hbWUsIGluYW1lKTsKKworICAgIC8qIElmIGlucHV0IGZpbGUgZXhpc3RzLCByZXR1cm4gT0suICovCisgICAgaWYgKGRvX3N0YXQoaWZuYW1lLCBzYnVmKSA9PSAwKSByZXR1cm4gT0s7CisKKyAgICBpZiAoIWRlY29tcHJlc3MgfHwgZXJybm8gIT0gRU5PRU5UKSB7CisJcGVycm9yKGlmbmFtZSk7CisJZXhpdF9jb2RlID0gRVJST1I7CisJcmV0dXJuIEVSUk9SOworICAgIH0KKyAgICAvKiBmaWxlLmV4dCBkb2Vzbid0IGV4aXN0LCB0cnkgYWRkaW5nIGEgc3VmZml4IChhZnRlciByZW1vdmluZyBhbnkKKyAgICAgKiB2ZXJzaW9uIG51bWJlciBmb3IgVk1TKS4KKyAgICAgKi8KKyAgICBzID0gZ2V0X3N1ZmZpeChpZm5hbWUpOworICAgIGlmIChzICE9IE5VTEwpIHsKKwlwZXJyb3IoaWZuYW1lKTsgLyogaWZuYW1lIGFscmVhZHkgaGFzIHogc3VmZml4IGFuZCBkb2VzIG5vdCBleGlzdCAqLworCWV4aXRfY29kZSA9IEVSUk9SOworCXJldHVybiBFUlJPUjsKKyAgICB9CisgICAgaWxlbiA9IHN0cmxlbihpZm5hbWUpOworICAgIGlmIChzdHJlcXUoel9zdWZmaXgsICIuZ3oiKSkgc3VmKys7CisKKyAgICAvKiBTZWFyY2ggZm9yIGFsbCBzdWZmaXhlcyAqLworICAgIGRvIHsKKyAgICAgICAgcyA9ICpzdWY7CisgICAgICAgIHN0cmNhdChpZm5hbWUsIHMpOworICAgICAgICBpZiAoZG9fc3RhdChpZm5hbWUsIHNidWYpID09IDApIHJldHVybiBPSzsKKwlpZm5hbWVbaWxlbl0gPSAnXDAnOworICAgIH0gd2hpbGUgKCorK3N1ZiAhPSBOVUxMKTsKKworICAgIC8qIE5vIHN1ZmZpeCBmb3VuZCwgY29tcGxhaW4gdXNpbmcgel9zdWZmaXg6ICovCisgICAgc3RyY2F0KGlmbmFtZSwgel9zdWZmaXgpOworICAgIHBlcnJvcihpZm5hbWUpOworICAgIGV4aXRfY29kZSA9IEVSUk9SOworICAgIHJldHVybiBFUlJPUjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmF0ZSBvZm5hbWUgZ2l2ZW4gaWZuYW1lLiBSZXR1cm4gT0ssIG9yIFdBUk5JTkcgaWYgZmlsZSBtdXN0IGJlIHNraXBwZWQuCisgKiBTZXRzIHNhdmVfb3JpZ19uYW1lIHRvIHRydWUgaWYgdGhlIGZpbGUgbmFtZSBoYXMgYmVlbiB0cnVuY2F0ZWQuCisgKi8KK2xvY2FsIGludCBtYWtlX29mbmFtZSgpCit7CisgICAgY2hhciAqc3VmZjsgICAgICAgICAgICAvKiBvZm5hbWUgeiBzdWZmaXggKi8KKworICAgIHN0cmNweShvZm5hbWUsIGlmbmFtZSk7CisgICAgLyogc3RyaXAgYSB2ZXJzaW9uIG51bWJlciBpZiBhbnkgYW5kIGdldCB0aGUgZ3ppcCBzdWZmaXggaWYgcHJlc2VudDogKi8KKyAgICBzdWZmID0gZ2V0X3N1ZmZpeChvZm5hbWUpOworCisgICAgaWYgKGRlY29tcHJlc3MpIHsKKwlpZiAoc3VmZiA9PSBOVUxMKSB7CisJICAgIC8qIFdoaXRoIC10IG9yIC1sLCB0cnkgYWxsIGZpbGVzIChldmVuIHdpdGhvdXQgLmd6IHN1ZmZpeCkKKwkgICAgICogZXhjZXB0IHdpdGggLXIgKGJlaGF2ZSBhcyB3aXRoIGp1c3QgLWRyKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHRlc3QpIHJldHVybiBPSzsKKworCSAgICAvKiBBdm9pZCBhbm5veWluZyBtZXNzYWdlcyB3aXRoIC1yICovCisJICAgIGlmICh2ZXJib3NlIHx8ICFxdWlldCkgeworCQlXQVJOKChzdGRlcnIsIiVzOiAlczogdW5rbm93biBzdWZmaXggLS0gaWdub3JlZFxuIiwKKwkJICAgICAgcHJvZ25hbWUsIGlmbmFtZSkpOworCSAgICB9CisJICAgIHJldHVybiBXQVJOSU5HOworCX0KKwkvKiBNYWtlIGEgc3BlY2lhbCBjYXNlIGZvciAudGd6IGFuZCAudGF6OiAqLworCXN0cmx3cihzdWZmKTsKKwlpZiAoc3RyZXF1KHN1ZmYsICIudGd6IikgfHwgc3RyZXF1KHN1ZmYsICIudGF6IikpIHsKKwkgICAgc3RyY3B5KHN1ZmYsICIudGFyIik7CisJfSBlbHNlIHsKKwkgICAgKnN1ZmYgPSAnXDAnOyAvKiBzdHJpcCB0aGUgeiBzdWZmaXggKi8KKwl9CisgICAgICAgIC8qIG9mbmFtZSBtaWdodCBiZSBjaGFuZ2VkIGxhdGVyIGlmIGluZmlsZSBjb250YWlucyBhbiBvcmlnaW5hbCBuYW1lICovCisKKyAgICB9IGVsc2UgaWYgKHN1ZmYgIT0gTlVMTCkgeworCS8qIEF2b2lkIGFubm95aW5nIG1lc3NhZ2VzIHdpdGggLXIgKHNlZSB0cmVhdF9kaXIoKSkgKi8KKwlpZiAodmVyYm9zZSB8fCAhcXVpZXQpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgYWxyZWFkeSBoYXMgJXMgc3VmZml4IC0tIHVuY2hhbmdlZFxuIiwKKwkJICAgIHByb2duYW1lLCBpZm5hbWUsIHN1ZmYpOworCX0KKwlpZiAoZXhpdF9jb2RlID09IE9LKSBleGl0X2NvZGUgPSBXQVJOSU5HOworCXJldHVybiBXQVJOSU5HOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhdmVfb3JpZ19uYW1lID0gMDsKKwlzdHJjYXQob2ZuYW1lLCB6X3N1ZmZpeCk7CisKKyAgICB9IC8qIGRlY29tcHJlc3MgPyAqLworICAgIHJldHVybiBPSzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGlucHV0IGZpbGUgYW5kIHVwZGF0ZSBvZm5hbWUgaWYgYW4KKyAqIG9yaWdpbmFsIG5hbWUgd2FzIGdpdmVuIGFuZCB0b19zdGRvdXQgaXMgbm90IHNldC4KKyAqIFJldHVybiB0aGUgY29tcHJlc3Npb24gbWV0aG9kLCAtMSBmb3IgZXJyb3IsIC0yIGZvciB3YXJuaW5nLgorICogU2V0IGlucHRyIHRvIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgYnl0ZSB0byBiZSBwcm9jZXNzZWQuCisgKiBVcGRhdGVzIHRpbWVfc3RhbXAgaWYgdGhlcmUgaXMgb25lIGFuZCAtLW5vLXRpbWUgaXMgbm90IHVzZWQuCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseSBmb3IgYW4gaW5wdXQgZmlsZSBjb25zaXN0aW5nCisgKiBvZiBzZXZlcmFsIGNvbnRpZ3VvdXMgZ3ppcCdlZCBtZW1iZXJzLgorICogSU4gYXNzZXJ0aW9uczogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlbWFpbmluZyBjb21wcmVzc2VkIG1lbWJlci4KKyAqICAgSWYgdGhlIG1lbWJlciBpcyBhIHppcCBmaWxlLCBpdCBtdXN0IGJlIHRoZSBvbmx5IG9uZS4KKyAqLworbG9jYWwgaW50IGdldF9tZXRob2QoKQoreworICAgIHVjaCBmbGFnczsgICAgIC8qIGNvbXByZXNzaW9uIGZsYWdzICovCisgICAgY2hhciBtYWdpY1syXTsgLyogbWFnaWMgaGVhZGVyICovCisgICAgdWxnIHN0YW1wOyAgICAgLyogdGltZSBzdGFtcCAqLworCisgICAgLyogSWYgLS1mb3JjZSBhbmQgLS1zdGRvdXQsIHpjYXQgPT0gY2F0LCBzbyBkbyBub3QgY29tcGxhaW4gYWJvdXQKKyAgICAgKiBwcmVtYXR1cmUgZW5kIG9mIGZpbGU6IHVzZSB0cnlfYnl0ZSBpbnN0ZWFkIG9mIGdldF9ieXRlLgorICAgICAqLworICAgIGlmIChmb3JjZSAmJiB0b19zdGRvdXQpIHsKKwltYWdpY1swXSA9IChjaGFyKXRyeV9ieXRlKCk7CisJbWFnaWNbMV0gPSAoY2hhcil0cnlfYnl0ZSgpOworCS8qIElmIHRyeV9ieXRlIHJldHVybmVkIEVPRiwgbWFnaWNbMV0gPT0gMHhmZiAqLworICAgIH0gZWxzZSB7CisJbWFnaWNbMF0gPSAoY2hhcilnZXRfYnl0ZSgpOworCW1hZ2ljWzFdID0gKGNoYXIpZ2V0X2J5dGUoKTsKKyAgICB9CisgICAgbWV0aG9kID0gLTE7ICAgICAgICAgICAgICAgICAvKiB1bmtub3duIHlldCAqLworICAgIHBhcnRfbmIrKzsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHBhcnRzIGluIGd6aXAgZmlsZSAqLworICAgIGhlYWRlcl9ieXRlcyA9IDA7CisgICAgbGFzdF9tZW1iZXIgPSBSRUNPUkRfSU87CisgICAgLyogYXNzdW1lIG11bHRpcGxlIG1lbWJlcnMgaW4gZ3ppcCBmaWxlIGV4Y2VwdCBmb3IgcmVjb3JkIG9yaWVudGVkIEkvTyAqLworCisgICAgaWYgKG1lbWNtcChtYWdpYywgR1pJUF9NQUdJQywgMikgPT0gMAorICAgICAgICB8fCBtZW1jbXAobWFnaWMsIE9MRF9HWklQX01BR0lDLCAyKSA9PSAwKSB7CisKKwltZXRob2QgPSAoaW50KWdldF9ieXRlKCk7CisJaWYgKG1ldGhvZCAhPSBERUZMQVRFRCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJICAgICIlczogJXM6IHVua25vd24gbWV0aG9kICVkIC0tIGdldCBuZXdlciB2ZXJzaW9uIG9mIGd6aXBcbiIsCisJCSAgICBwcm9nbmFtZSwgaWZuYW1lLCBtZXRob2QpOworCSAgICBleGl0X2NvZGUgPSBFUlJPUjsKKwkgICAgcmV0dXJuIC0xOworCX0KKwl3b3JrID0gdW56aXA7CisJZmxhZ3MgID0gKHVjaClnZXRfYnl0ZSgpOworCisJaWYgKChmbGFncyAmIEVOQ1JZUFRFRCkgIT0gMCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJICAgICIlczogJXMgaXMgZW5jcnlwdGVkIC0tIGdldCBuZXdlciB2ZXJzaW9uIG9mIGd6aXBcbiIsCisJCSAgICBwcm9nbmFtZSwgaWZuYW1lKTsKKwkgICAgZXhpdF9jb2RlID0gRVJST1I7CisJICAgIHJldHVybiAtMTsKKwl9CisJaWYgKChmbGFncyAmIENPTlRJTlVBVElPTikgIT0gMCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkgICAiJXM6ICVzIGlzIGEgYSBtdWx0aS1wYXJ0IGd6aXAgZmlsZSAtLSBnZXQgbmV3ZXIgdmVyc2lvbiBvZiBnemlwXG4iLAorCQkgICAgcHJvZ25hbWUsIGlmbmFtZSk7CisJICAgIGV4aXRfY29kZSA9IEVSUk9SOworCSAgICBpZiAoZm9yY2UgPD0gMSkgcmV0dXJuIC0xOworCX0KKwlpZiAoKGZsYWdzICYgUkVTRVJWRUQpICE9IDApIHsKKwkgICAgZnByaW50ZihzdGRlcnIsCisJCSAgICAiJXM6ICVzIGhhcyBmbGFncyAweCV4IC0tIGdldCBuZXdlciB2ZXJzaW9uIG9mIGd6aXBcbiIsCisJCSAgICBwcm9nbmFtZSwgaWZuYW1lLCBmbGFncyk7CisJICAgIGV4aXRfY29kZSA9IEVSUk9SOworCSAgICBpZiAoZm9yY2UgPD0gMSkgcmV0dXJuIC0xOworCX0KKwlzdGFtcCAgPSAodWxnKWdldF9ieXRlKCk7CisJc3RhbXAgfD0gKCh1bGcpZ2V0X2J5dGUoKSkgPDwgODsKKwlzdGFtcCB8PSAoKHVsZylnZXRfYnl0ZSgpKSA8PCAxNjsKKwlzdGFtcCB8PSAoKHVsZylnZXRfYnl0ZSgpKSA8PCAyNDsKKwlpZiAoc3RhbXAgIT0gMCAmJiAhbm9fdGltZSkgdGltZV9zdGFtcCA9IHN0YW1wOworCisJKHZvaWQpZ2V0X2J5dGUoKTsgIC8qIElnbm9yZSBleHRyYSBmbGFncyBmb3IgdGhlIG1vbWVudCAqLworCSh2b2lkKWdldF9ieXRlKCk7ICAvKiBJZ25vcmUgT1MgdHlwZSBmb3IgdGhlIG1vbWVudCAqLworCisJaWYgKChmbGFncyAmIENPTlRJTlVBVElPTikgIT0gMCkgeworCSAgICB1bnNpZ25lZCBwYXJ0ID0gKHVuc2lnbmVkKWdldF9ieXRlKCk7CisJICAgIHBhcnQgfD0gKCh1bnNpZ25lZClnZXRfYnl0ZSgpKTw8ODsKKwkgICAgaWYgKHZlcmJvc2UpIHsKKwkJZnByaW50ZihzdGRlcnIsIiVzOiAlczogcGFydCBudW1iZXIgJXVcbiIsCisJCQlwcm9nbmFtZSwgaWZuYW1lLCBwYXJ0KTsKKwkgICAgfQorCX0KKwlpZiAoKGZsYWdzICYgRVhUUkFfRklFTEQpICE9IDApIHsKKwkgICAgdW5zaWduZWQgbGVuID0gKHVuc2lnbmVkKWdldF9ieXRlKCk7CisJICAgIGxlbiB8PSAoKHVuc2lnbmVkKWdldF9ieXRlKCkpPDw4OworCSAgICBpZiAodmVyYm9zZSkgeworCQlmcHJpbnRmKHN0ZGVyciwiJXM6ICVzOiBleHRyYSBmaWVsZCBvZiAldSBieXRlcyBpZ25vcmVkXG4iLAorCQkJcHJvZ25hbWUsIGlmbmFtZSwgbGVuKTsKKwkgICAgfQorCSAgICB3aGlsZSAobGVuLS0pICh2b2lkKWdldF9ieXRlKCk7CisJfQorCisJLyogR2V0IG9yaWdpbmFsIGZpbGUgbmFtZSBpZiBpdCB3YXMgdHJ1bmNhdGVkICovCisJaWYgKChmbGFncyAmIE9SSUdfTkFNRSkgIT0gMCkgeworCSAgICBpZiAobm9fbmFtZSB8fCB0b19zdGRvdXQgfHwgcGFydF9uYiA+IDEpIHsKKwkJLyogRGlzY2FyZCB0aGUgb2xkIG5hbWUgKi8KKwkJY2hhciBjOyAvKiBkdW1teSB1c2VkIGZvciBOZVhUc3RlcCAzLjAgY2Mgb3B0aW1pemVyIGJ1ZyAqLworCQlkbyB7Yz1nZXRfYnl0ZSgpO30gd2hpbGUgKGMgIT0gMCk7CisJICAgIH0gZWxzZSB7CisJCS8qIENvcHkgdGhlIGJhc2UgbmFtZS4gS2VlcCBhIGRpcmVjdG9yeSBwcmVmaXggaW50YWN0LiAqLworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBiYXNlbmFtZShvZm5hbWUpOworCQlmb3IgKDs7KSB7CisJCSAgICAqcCA9IChjaGFyKWdldF9jaGFyKCk7CisJCSAgICBpZiAoKnArKyA9PSAnXDAnKSBicmVhazsKKwkJICAgIGlmIChwID49IG9mbmFtZStzaXplb2Yob2ZuYW1lKSkgeworCQkJZXJyb3IoImNvcnJ1cHRlZCBpbnB1dCAtLSBmaWxlIG5hbWUgdG9vIGxhcmdlIik7CisJCSAgICB9CisJCX0KKwkgICAgfSAvKiBub19uYW1lIHx8IHRvX3N0ZG91dCAqLworCX0gLyogT1JJR19OQU1FICovCisKKwkvKiBEaXNjYXJkIGZpbGUgY29tbWVudCBpZiBhbnkgKi8KKwlpZiAoKGZsYWdzICYgQ09NTUVOVCkgIT0gMCkgeworCSAgICB3aGlsZSAoZ2V0X2NoYXIoKSAhPSAwKSAvKiBudWxsICovIDsKKwl9CisJaWYgKHBhcnRfbmIgPT0gMSkgeworCSAgICBoZWFkZXJfYnl0ZXMgPSBpbnB0ciArIDIqc2l6ZW9mKGxvbmcpOyAvKiBpbmNsdWRlIGNyYyBhbmQgc2l6ZSAqLworCX0KKyAgICB9IGVsc2UgaWYgKGZvcmNlICYmIHRvX3N0ZG91dCkgeyAvKiBwYXNzIGlucHV0IHVuY2hhbmdlZCAqLworCW1ldGhvZCA9IFNUT1JFRDsKKwl3b3JrID0gY29weTsKKyAgICAgICAgaW5wdHIgPSAwOworCWxhc3RfbWVtYmVyID0gMTsKKyAgICB9CisgICAgaWYgKG1ldGhvZCA+PSAwKSByZXR1cm4gbWV0aG9kOworCisgICAgaWYgKHBhcnRfbmIgPT0gMSkgeworCWZwcmludGYoc3RkZXJyLCAiXG4lczogJXM6IG5vdCBpbiBnemlwIGZvcm1hdFxuIiwgcHJvZ25hbWUsIGlmbmFtZSk7CisJZXhpdF9jb2RlID0gRVJST1I7CisJcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisJV0FSTigoc3RkZXJyLCAiXG4lczogJXM6IGRlY29tcHJlc3Npb24gT0ssIHRyYWlsaW5nIGdhcmJhZ2UgaWdub3JlZFxuIiwKKwkgICAgICBwcm9nbmFtZSwgaWZuYW1lKSk7CisJcmV0dXJuIC0yOworICAgIH0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldHVybiB0cnVlIGlmIHRoZSB0d28gc3RhdCBzdHJ1Y3R1cmVzIGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZmlsZS4KKyAqLworbG9jYWwgaW50IHNhbWVfZmlsZShzdGF0MSwgc3RhdDIpCisgICAgc3RydWN0IHN0YXQgKnN0YXQxOworICAgIHN0cnVjdCBzdGF0ICpzdGF0MjsKK3sKKyAgICByZXR1cm4gc3RhdDEtPnN0X2lubyAgID09IHN0YXQyLT5zdF9pbm8KKwkmJiBzdGF0MS0+c3RfZGV2ICAgPT0gc3RhdDItPnN0X2RldgorI2lmZGVmIE5PX1NUX0lOTworICAgICAgICAvKiBDYW4ndCByZWx5IG9uIHN0X2lubyBhbmQgc3RfZGV2LCB1c2Ugb3RoZXIgZmllbGRzOiAqLworCSYmIHN0YXQxLT5zdF9tb2RlICA9PSBzdGF0Mi0+c3RfbW9kZQorCSYmIHN0YXQxLT5zdF91aWQgICA9PSBzdGF0Mi0+c3RfdWlkCisJJiYgc3RhdDEtPnN0X2dpZCAgID09IHN0YXQyLT5zdF9naWQKKwkmJiBzdGF0MS0+c3Rfc2l6ZSAgPT0gc3RhdDItPnN0X3NpemUKKwkmJiBzdGF0MS0+c3RfYXRpbWUgPT0gc3RhdDItPnN0X2F0aW1lCisJJiYgc3RhdDEtPnN0X210aW1lID09IHN0YXQyLT5zdF9tdGltZQorCSYmIHN0YXQxLT5zdF9jdGltZSA9PSBzdGF0Mi0+c3RfY3RpbWUKKyNlbmRpZgorCSAgICA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmV0dXJuIHRydWUgaWYgYSBmaWxlIG5hbWUgaXMgYW1iaWd1b3VzIGJlY2F1c2UgdGhlIG9wZXJhdGluZyBzeXN0ZW0KKyAqIHRydW5jYXRlcyBmaWxlIG5hbWVzLgorICovCitsb2NhbCBpbnQgbmFtZV90b29fbG9uZyhuYW1lLCBzdGF0YikKKyAgICBjaGFyICpuYW1lOyAgICAgICAgICAgLyogZmlsZSBuYW1lIHRvIGNoZWNrICovCisgICAgc3RydWN0IHN0YXQgKnN0YXRiOyAgIC8qIHN0YXQgYnVmIGZvciB0aGlzIGZpbGUgbmFtZSAqLworeworICAgIGludCBzID0gc3RybGVuKG5hbWUpOworICAgIGNoYXIgYyA9IG5hbWVbcy0xXTsKKyAgICBzdHJ1Y3Qgc3RhdAl0c3RhdDsgLyogc3RhdCBmb3IgdHJ1bmNhdGVkIG5hbWUgKi8KKyAgICBpbnQgcmVzOworCisgICAgdHN0YXQgPSAqc3RhdGI7ICAgICAgLyogSnVzdCBpbiBjYXNlIE9TIGRvZXMgbm90IGZpbGwgYWxsIGZpZWxkcyAqLworICAgIG5hbWVbcy0xXSA9ICdcMCc7CisgICAgcmVzID0gc3RhdChuYW1lLCAmdHN0YXQpID09IDAgJiYgc2FtZV9maWxlKHN0YXRiLCAmdHN0YXQpOworICAgIG5hbWVbcy0xXSA9IGM7CisgICAgVHJhY2UoKHN0ZGVyciwgIiB0b29fbG9uZyglcykgPT4gJWRcbiIsIG5hbWUsIHJlcykpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2hvcnRlbiB0aGUgZ2l2ZW4gbmFtZSBieSBvbmUgY2hhcmFjdGVyLCBvciByZXBsYWNlIGEgLnRhciBleHRlbnNpb24KKyAqIHdpdGggLnRnei4gVHJ1bmNhdGUgdGhlIGxhc3QgcGFydCBvZiB0aGUgbmFtZSB3aGljaCBpcyBsb25nZXIgdGhhbgorICogTUlOX1BBUlQgY2hhcmFjdGVyczogMTIzNC42NzguMDEyLmd6IC0+IDEyMy42NzguMDEyLmd6LiBJZiB0aGUgbmFtZQorICogaGFzIG9ubHkgcGFydHMgc2hvcnRlciB0aGFuIE1JTl9QQVJUIHRydW5jYXRlIHRoZSBsb25nZXN0IHBhcnQuCisgKiBGb3IgZGVjb21wcmVzc2lvbiwganVzdCByZW1vdmUgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBuYW1lLgorICoKKyAqIElOIGFzc2VydGlvbjogZm9yIGNvbXByZXNzaW9uLCB0aGUgc3VmZml4IG9mIHRoZSBnaXZlbiBuYW1lIGlzIHpfc3VmZml4LgorICovCitsb2NhbCB2b2lkIHNob3J0ZW5fbmFtZShuYW1lKQorICAgIGNoYXIgKm5hbWU7Cit7CisgICAgaW50IGxlbjsgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBuYW1lIHdpdGhvdXQgel9zdWZmaXggKi8KKyAgICBjaGFyICp0cnVuYyA9IE5VTEw7ICAgICAgLyogY2hhcmFjdGVyIHRvIGJlIHRydW5jYXRlZCAqLworICAgIGludCBwbGVuOyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHBhcnQgbGVuZ3RoICovCisgICAgaW50IG1pbl9wYXJ0ID0gTUlOX1BBUlQ7IC8qIGN1cnJlbnQgbWluaW11bSBwYXJ0IGxlbmd0aCAqLworICAgIGNoYXIgKnA7CisKKyAgICBsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgaWYgKGRlY29tcHJlc3MpIHsKKwlpZiAobGVuIDw9IDEpIGVycm9yKCJuYW1lIHRvbyBzaG9ydCIpOworCW5hbWVbbGVuLTFdID0gJ1wwJzsKKwlyZXR1cm47CisgICAgfQorICAgIHAgPSBnZXRfc3VmZml4KG5hbWUpOworICAgIGlmIChwID09IE5VTEwpIGVycm9yKCJjYW4ndCByZWNvdmVyIHN1ZmZpeFxuIik7CisgICAgKnAgPSAnXDAnOworICAgIHNhdmVfb3JpZ19uYW1lID0gMTsKKworICAgIC8qIGNvbXByZXNzIDEyMzQ1Njc4OTAudGFyIHRvIDEyMzQ1Njc4OTAudGd6ICovCisgICAgaWYgKGxlbiA+IDQgJiYgc3RyZXF1KHAtNCwgIi50YXIiKSkgeworCXN0cmNweShwLTQsICIudGd6Iik7CisJcmV0dXJuOworICAgIH0KKyAgICAvKiBUcnkga2VlcGluZyBzaG9ydCBleHRlbnNpb25zIGludGFjdDoKKyAgICAgKiAxMjM0LjY3OC4wMTIuZ3ogLT4gMTIzLjY3OC4wMTIuZ3oKKyAgICAgKi8KKyAgICBkbyB7CisJcCA9IHN0cnJjaHIobmFtZSwgUEFUSF9TRVApOworCXAgPSBwID8gcCsxIDogbmFtZTsKKwl3aGlsZSAoKnApIHsKKwkgICAgcGxlbiA9IHN0cmNzcG4ocCwgIi4iKTsKKwkgICAgcCArPSBwbGVuOworCSAgICBpZiAocGxlbiA+IG1pbl9wYXJ0KSB0cnVuYyA9IHAtMTsKKwkgICAgaWYgKCpwKSBwKys7CisJfQorICAgIH0gd2hpbGUgKHRydW5jID09IE5VTEwgJiYgLS1taW5fcGFydCAhPSAwKTsKKworICAgIGlmICh0cnVuYyAhPSBOVUxMKSB7CisJZG8geworCSAgICB0cnVuY1swXSA9IHRydW5jWzFdOworCX0gd2hpbGUgKCp0cnVuYysrKTsKKwl0cnVuYy0tOworICAgIH0gZWxzZSB7CisJdHJ1bmMgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisJaWYgKHRydW5jID09IE5VTEwpIGVycm9yKCJpbnRlcm5hbCBlcnJvciBpbiBzaG9ydGVuX25hbWUiKTsKKwlpZiAodHJ1bmNbMV0gPT0gJ1wwJykgdHJ1bmMtLTsgLyogZm9yY2UgdHJ1bmNhdGlvbiAqLworICAgIH0KKyAgICBzdHJjcHkodHJ1bmMsIHpfc3VmZml4KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJZiBjb21wcmVzc2luZyB0byBhIGZpbGUsIGNoZWNrIGlmIG9mbmFtZSBpcyBub3QgYW1iaWd1b3VzCisgKiBiZWNhdXNlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRydW5jYXRlcyBuYW1lcy4gT3RoZXJ3aXNlLCBnZW5lcmF0ZQorICogYSBuZXcgb2ZuYW1lIGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBuYW1lIGluIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgKiBJZiB0aGUgY29tcHJlc3NlZCBmaWxlIGFscmVhZHkgZXhpc3RzLCBhc2sgZm9yIGNvbmZpcm1hdGlvbi4KKyAqICAgIFRoZSBjaGVjayBmb3IgbmFtZSB0cnVuY2F0aW9uIGlzIG1hZGUgZHluYW1pY2FsbHksIGJlY2F1c2UgZGlmZmVyZW50CisgKiBmaWxlIHN5c3RlbXMgb24gdGhlIHNhbWUgT1MgbWlnaHQgdXNlIGRpZmZlcmVudCB0cnVuY2F0aW9uIHJ1bGVzIChvbiBTVlI0CisgKiBzNSB0cnVuY2F0ZXMgdG8gMTQgY2hhcnMgYW5kIHVmcyBkb2VzIG5vdCB0cnVuY2F0ZSkuCisgKiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgLTEgaWYgdGhlIGZpbGUgbXVzdCBiZSBza2lwcGVkLCBhbmQKKyAqIHVwZGF0ZXMgc2F2ZV9vcmlnX25hbWUgaWYgbmVjZXNzYXJ5LgorICogSU4gYXNzZXJ0aW9uczogc2F2ZV9vcmlnX25hbWUgaXMgYWxyZWFkeSBzZXQgaWYgb2ZuYW1lIGhhcyBiZWVuCisgKiBhbHJlYWR5IHRydW5jYXRlZCBiZWNhdXNlIG9mIE5PX01VTFRJUExFX0RPVFMuIFRoZSBpbnB1dCBmaWxlIGhhcworICogYWxyZWFkeSBiZWVuIG9wZW4gYW5kIGlzdGF0IGlzIHNldC4KKyAqLworbG9jYWwgaW50IGNoZWNrX29mbmFtZSgpCit7CisgICAgc3RydWN0IHN0YXQJb3N0YXQ7IC8qIHN0YXQgZm9yIG9mbmFtZSAqLworCisjaWZkZWYgRU5BTUVUT09MT05HCisgICAgLyogQ2hlY2sgZm9yIHN0cmljdGx5IGNvbmZvcm1pbmcgUG9zaXggc3lzdGVtcyAod2hpY2ggcmV0dXJuIEVOQU1FVE9PTE9ORworICAgICAqIGluc3RlYWQgb2Ygc2lsZW50bHkgdHJ1bmNhdGluZyBmaWxlbmFtZXMpLgorICAgICAqLworICAgIGVycm5vID0gMDsKKyAgICB3aGlsZSAoc3RhdChvZm5hbWUsICZvc3RhdCkgIT0gMCkgeworICAgICAgICBpZiAoZXJybm8gIT0gRU5BTUVUT09MT05HKSByZXR1cm4gMDsgLyogb2ZuYW1lIGRvZXMgbm90IGV4aXN0ICovCisJc2hvcnRlbl9uYW1lKG9mbmFtZSk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoc3RhdChvZm5hbWUsICZvc3RhdCkgIT0gMCkgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAvKiBDaGVjayBmb3IgbmFtZSB0cnVuY2F0aW9uIG9uIGV4aXN0aW5nIGZpbGUuIERvIHRoaXMgZXZlbiBvbiBzeXN0ZW1zCisgICAgICogZGVmaW5pbmcgRU5BTUVUT09MT05HLCBiZWNhdXNlIG9uIG1vc3Qgc3lzdGVtcyB0aGUgc3RyaWN0IFBvc2l4CisgICAgICogYmVoYXZpb3IgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAoc2lsZW50IG5hbWUgdHJ1bmNhdGlvbiBhbGxvd2VkKS4KKyAgICAgKi8KKyAgICBpZiAoIWRlY29tcHJlc3MgJiYgbmFtZV90b29fbG9uZyhvZm5hbWUsICZvc3RhdCkpIHsKKwlzaG9ydGVuX25hbWUob2ZuYW1lKTsKKwlpZiAoc3RhdChvZm5hbWUsICZvc3RhdCkgIT0gMCkgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBhcmUgZGlmZmVyZW50IChjb3VsZCBiZQorICAgICAqIHRoZSBzYW1lIGJ5IG5hbWUgdHJ1bmNhdGlvbiBvciBsaW5rcykuCisgICAgICovCisgICAgaWYgKHNhbWVfZmlsZSgmaXN0YXQsICZvc3RhdCkpIHsKKwlpZiAoc3RyZXF1KGlmbmFtZSwgb2ZuYW1lKSkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogY2Fubm90ICVzY29tcHJlc3Mgb250byBpdHNlbGZcbiIsCisJCSAgICBwcm9nbmFtZSwgaWZuYW1lLCBkZWNvbXByZXNzID8gImRlIiA6ICIiKTsKKwl9IGVsc2UgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBhbmQgJXMgYXJlIHRoZSBzYW1lIGZpbGVcbiIsCisJCSAgICBwcm9nbmFtZSwgaWZuYW1lLCBvZm5hbWUpOworCX0KKwlleGl0X2NvZGUgPSBFUlJPUjsKKwlyZXR1cm4gRVJST1I7CisgICAgfQorICAgIC8qIEFzayBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZSAqLworICAgIGlmICghZm9yY2UpIHsKKyNpZiAwCisJY2hhciByZXNwb25zZVs4MF07CisJc3RyY3B5KHJlc3BvbnNlLCJuIik7CisJZnByaW50ZihzdGRlcnIsICIlczogJXMgYWxyZWFkeSBleGlzdHM7IiwgcHJvZ25hbWUsIG9mbmFtZSk7CisJaWYgKGZvcmVncm91bmQgJiYgaXNhdHR5KGZpbGVubyhzdGRpbikpKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiIGRvIHlvdSB3aXNoIHRvIG92ZXJ3cml0ZSAoeSBvciBuKT8gIik7CisJICAgICh2b2lkKWZnZXRzKHJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpLTEsIHN0ZGluKTsKKwl9CisJaWYgKHRvbG93KCpyZXNwb25zZSkgIT0gJ3knKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiXHRub3Qgb3ZlcndyaXR0ZW5cbiIpOworI2VuZGlmCisJICAgIGlmIChleGl0X2NvZGUgPT0gT0spIGV4aXRfY29kZSA9IFdBUk5JTkc7CisJICAgIHJldHVybiBFUlJPUjsKKyNpZiAwCisJfQorI2VuZGlmCisgICAgfQorICAgICh2b2lkKSBjaG1vZChvZm5hbWUsIDA3NzcpOworICAgIGlmICh1bmxpbmsob2ZuYW1lKSkgeworCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKKwlwZXJyb3Iob2ZuYW1lKTsKKwlleGl0X2NvZGUgPSBFUlJPUjsKKwlyZXR1cm4gRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgZnJvbSB0aGUgZ2l2ZW4gc3RhdCBidWZmZXIuCisgKi8KK2xvY2FsIHZvaWQgcmVzZXRfdGltZXMgKG5hbWUsIHN0YXRiKQorICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IHN0YXQgKnN0YXRiOworeworICAgIHN0cnVjdCB1dGltYnVmCXRpbWVwOworCisgICAgLyogQ29weSB0aGUgdGltZSBzdGFtcCAqLworICAgIHRpbWVwLmFjdGltZSAgPSBzdGF0Yi0+c3RfYXRpbWU7CisgICAgdGltZXAubW9kdGltZSA9IHN0YXRiLT5zdF9tdGltZTsKKworICAgIC8qIFNvbWUgc3lzdGVtcyAoYXQgbGVhc3QgT1MvMikgZG8gbm90IHN1cHBvcnQgdXRpbWUgb24gZGlyZWN0b3JpZXMgKi8KKyAgICBpZiAodXRpbWUobmFtZSwgJnRpbWVwKSAmJiAhU19JU0RJUihzdGF0Yi0+c3RfbW9kZSkpIHsKKwlXQVJOKChzdGRlcnIsICIlczogIiwgcHJvZ25hbWUpKTsKKwlpZiAoIXF1aWV0KSBwZXJyb3Iob2ZuYW1lKTsKKyAgICB9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IG1vZGVzLCB0aW1lcywgb3duZXJzaGlwIGZyb20gaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZS4KKyAqIElOIGFzc2VydGlvbjogdG9fc3Rkb3V0IGlzIGZhbHNlLgorICovCitsb2NhbCB2b2lkIGNvcHlfc3RhdChpZnN0YXQpCisgICAgc3RydWN0IHN0YXQgKmlmc3RhdDsKK3sKKyAgICBpZiAoZGVjb21wcmVzcyAmJiB0aW1lX3N0YW1wICE9IDAgJiYgaWZzdGF0LT5zdF9tdGltZSAhPSB0aW1lX3N0YW1wKSB7CisJaWZzdGF0LT5zdF9tdGltZSA9IHRpbWVfc3RhbXA7CisJaWYgKHZlcmJvc2UgPiAxKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHRpbWUgc3RhbXAgcmVzdG9yZWRcbiIsIG9mbmFtZSk7CisJfQorICAgIH0KKyAgICByZXNldF90aW1lcyhvZm5hbWUsIGlmc3RhdCk7CisKKyAgICAvKiBDb3B5IHRoZSBwcm90ZWN0aW9uIG1vZGVzICovCisgICAgaWYgKGNobW9kKG9mbmFtZSwgaWZzdGF0LT5zdF9tb2RlICYgMDc3NzcpKSB7CisJV0FSTigoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKSk7CisJaWYgKCFxdWlldCkgcGVycm9yKG9mbmFtZSk7CisgICAgfQorCisgICAgY2hvd24ob2ZuYW1lLCBpZnN0YXQtPnN0X3VpZCwgaWZzdGF0LT5zdF9naWQpOyAgLyogQ29weSBvd25lcnNoaXAgKi8KKworICAgIHJlbW92ZV9vZm5hbWUgPSAwOworICAgIC8qIEl0J3Mgbm93IHNhZmUgdG8gcmVtb3ZlIHRoZSBpbnB1dCBmaWxlOiAqLworICAgICh2b2lkKSBjaG1vZChpZm5hbWUsIDA3NzcpOworICAgIGlmICh1bmxpbmsoaWZuYW1lKSkgeworCVdBUk4oKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSkpOworCWlmICghcXVpZXQpIHBlcnJvcihpZm5hbWUpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGcmVlIGFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGVzIGFuZCBleGl0IHdpdGggdGhlIGdpdmVuIGNvZGUuCisgKi8KK2xvY2FsIHZvaWQgZG9fZXhpdChleGl0Y29kZSkKKyAgICBpbnQgZXhpdGNvZGU7Cit7CisgICAgc3RhdGljIGludCBpbl9leGl0ID0gMDsKKworICAgIGlmIChpbl9leGl0KSBleGl0KGV4aXRjb2RlKTsKKyAgICBpbl9leGl0ID0gMTsKKyAgICBpZiAoZW52ICE9IE5VTEwpICBmcmVlKGVudiksICBlbnYgID0gTlVMTDsKKyAgICBpZiAoYXJncyAhPSBOVUxMKSBmcmVlKChjaGFyKilhcmdzKSwgYXJncyA9IE5VTEw7CisgICAgRlJFRShpbmJ1Zik7CisgICAgRlJFRShvdXRidWYpOworICAgIEZSRUUoZF9idWYpOworICAgIEZSRUUod2luZG93KTsKKyAgICBGUkVFKHRhYl9wcmVmaXgpOworICAgIGV4aXQoZXhpdGNvZGUpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNpZ25hbCBhbmQgZXJyb3IgaGFuZGxlci4KKyAqLwordm9pZCBhYm9ydF9nemlwKCkKK3sKKyAgIGlmIChyZW1vdmVfb2ZuYW1lKSB7CisgICAgICAgY2xvc2Uob2ZkKTsKKyAgICAgICB1bmxpbmsgKG9mbmFtZSk7CisgICB9CisgICBkb19leGl0KEVSUk9SKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9nemlwL2d6aXAuaCBiL3Vzci9nemlwL2d6aXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2QyZmJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvZ3ppcC5oCkBAIC0wLDAgKzEsMjk4IEBACisvKiBnemlwLmggLS0gY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGd6aXAgbW9kdWxlcworICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseS4KKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoUFJPVE8pCisjICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyNlbHNlCisjICBkZWZpbmUgT0YoYXJncykgICgpCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19fCisgICB0eXBlZGVmIHZvaWQgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgY2hhciAqdm9pZHA7CisjZW5kaWYKKworLyogSSBkb24ndCBsaWtlIG5lc3RlZCBpbmNsdWRlcywgYnV0IHRoZSBzdHJpbmcgYW5kIGlvIGZ1bmN0aW9ucyBhcmUgdXNlZAorICogdG9vIG9mdGVuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBtZW16ZXJvKHMsIG4pICAgICBtZW1zZXQgKCh2b2lkcCkocyksIDAsIChuKSkKKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCisvKiBSZXR1cm4gY29kZXMgZnJvbSBnemlwICovCisjZGVmaW5lIE9LICAgICAgMAorI2RlZmluZSBFUlJPUiAgIDEKKyNkZWZpbmUgV0FSTklORyAyCisKKy8qIENvbXByZXNzaW9uIG1ldGhvZHMgKHNlZSBhbGdvcml0aG0uZG9jKSAqLworI2RlZmluZSBTVE9SRUQgICAgICAwCisjZGVmaW5lIENPTVBSRVNTRUQgIDEKKyNkZWZpbmUgUEFDS0VEICAgICAgMgorI2RlZmluZSBMWkhFRCAgICAgICAzCisvKiBtZXRob2RzIDQgdG8gNyByZXNlcnZlZCAqLworI2RlZmluZSBERUZMQVRFRCAgICA4CisjZGVmaW5lIE1BWF9NRVRIT0RTIDkKK2V4dGVybiBpbnQgbWV0aG9kOyAgICAgICAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCAqLworCisvKiBUbyBzYXZlIG1lbW9yeSBmb3IgMTYgYml0IHN5c3RlbXMsIHNvbWUgYXJyYXlzIGFyZSBvdmVybGFpZCBiZXR3ZWVuCisgKiB0aGUgdmFyaW91cyBtb2R1bGVzOgorICogZGVmbGF0ZTogIHByZXYraGVhZCAgIHdpbmRvdyAgICAgIGRfYnVmICBsX2J1ZiAgb3V0YnVmCisgKiB1bmx6dzogICAgdGFiX3ByZWZpeCAgdGFiX3N1ZmZpeCAgc3RhY2sgIGluYnVmICBvdXRidWYKKyAqIGluZmxhdGU6ICAgICAgICAgICAgICB3aW5kb3cgICAgICAgICAgICAgaW5idWYKKyAqIHVucGFjazogICAgICAgICAgICAgICB3aW5kb3cgICAgICAgICAgICAgaW5idWYgIHByZWZpeF9sZW4KKyAqIHVubHpoOiAgICBsZWZ0K3JpZ2h0ICB3aW5kb3cgICAgICBjX3RhYmxlIGluYnVmIGNfbGVuCisgKiBGb3IgY29tcHJlc3Npb24sIGlucHV0IGlzIGRvbmUgaW4gd2luZG93W10uIEZvciBkZWNvbXByZXNzaW9uLCBvdXRwdXQKKyAqIGlzIGRvbmUgaW4gd2luZG93IGV4Y2VwdCBmb3IgdW5sencuCisgKi8KKworI2lmbmRlZglJTkJVRlNJWgorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBJTkJVRlNJWiAgMHgyMDAwICAvKiBpbnB1dCBidWZmZXIgc2l6ZSAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgSU5CVUZTSVogIDB4ODAwMCAgLyogaW5wdXQgYnVmZmVyIHNpemUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKyNkZWZpbmUgSU5CVUZfRVhUUkEgIDY0ICAgICAvKiByZXF1aXJlZCBieSB1bmx6dygpICovCisKKyNpZm5kZWYJT1VUQlVGU0laCisjICBpZmRlZiBTTUFMTF9NRU0KKyMgICAgZGVmaW5lIE9VVEJVRlNJWiAgIDgxOTIgIC8qIG91dHB1dCBidWZmZXIgc2l6ZSAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgT1VUQlVGU0laICAxNjM4NCAgLyogb3V0cHV0IGJ1ZmZlciBzaXplICovCisjICBlbmRpZgorI2VuZGlmCisjZGVmaW5lIE9VVEJVRl9FWFRSQSAyMDQ4ICAgLyogcmVxdWlyZWQgYnkgdW5sencoKSAqLworCisjaWZuZGVmIERJU1RfQlVGU0laRQorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBESVNUX0JVRlNJWkUgMHgyMDAwIC8qIGJ1ZmZlciBmb3IgZGlzdGFuY2VzLCBzZWUgdHJlZXMuYyAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgRElTVF9CVUZTSVpFIDB4ODAwMCAvKiBidWZmZXIgZm9yIGRpc3RhbmNlcywgc2VlIHRyZWVzLmMgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIERZTl9BTExPQworIyAgZGVmaW5lIEVYVEVSTih0eXBlLCBhcnJheSkgIGV4dGVybiB0eXBlICogbmVhciBhcnJheQorIyAgZGVmaW5lIERFQ0xBUkUodHlwZSwgYXJyYXksIHNpemUpICB0eXBlICogbmVhciBhcnJheQorIyAgZGVmaW5lIEFMTE9DKHR5cGUsIGFycmF5LCBzaXplKSB7IFwKKyAgICAgIGFycmF5ID0gKHR5cGUqKWZjYWxsb2MoKHNpemVfdCkoKChzaXplKSsxTCkvMiksIDIqc2l6ZW9mKHR5cGUpKTsgXAorICAgICAgaWYgKGFycmF5ID09IE5VTEwpIGVycm9yKCJpbnN1ZmZpY2llbnQgbWVtb3J5Iik7IFwKKyAgIH0KKyMgIGRlZmluZSBGUkVFKGFycmF5KSB7aWYgKGFycmF5ICE9IE5VTEwpIGZjZnJlZShhcnJheSksIGFycmF5PU5VTEw7fQorI2Vsc2UKKyMgIGRlZmluZSBFWFRFUk4odHlwZSwgYXJyYXkpICBleHRlcm4gdHlwZSBhcnJheVtdCisjICBkZWZpbmUgREVDTEFSRSh0eXBlLCBhcnJheSwgc2l6ZSkgIHR5cGUgYXJyYXlbc2l6ZV0KKyMgIGRlZmluZSBBTExPQyh0eXBlLCBhcnJheSwgc2l6ZSkKKyMgIGRlZmluZSBGUkVFKGFycmF5KQorI2VuZGlmCisKK0VYVEVSTih1Y2gsIGluYnVmKTsgICAgICAgICAgLyogaW5wdXQgYnVmZmVyICovCitFWFRFUk4odWNoLCBvdXRidWYpOyAgICAgICAgIC8qIG91dHB1dCBidWZmZXIgKi8KK0VYVEVSTih1c2gsIGRfYnVmKTsgICAgICAgICAgLyogYnVmZmVyIGZvciBkaXN0YW5jZXMsIHNlZSB0cmVlcy5jICovCitFWFRFUk4odWNoLCB3aW5kb3cpOyAgICAgICAgIC8qIFNsaWRpbmcgd2luZG93IGFuZCBzdWZmaXggdGFibGUgKHVubHp3KSAqLworI2RlZmluZSB0YWJfc3VmZml4IHdpbmRvdworI2lmbmRlZiBNQVhTRUdfNjRLCisjICBkZWZpbmUgdGFiX3ByZWZpeCBwcmV2ICAgIC8qIGhhc2ggbGluayAoc2VlIGRlZmxhdGUuYykgKi8KKyMgIGRlZmluZSBoZWFkIChwcmV2K1dTSVpFKSAgLyogaGFzaCBoZWFkIChzZWUgZGVmbGF0ZS5jKSAqLworICAgRVhURVJOKHVzaCwgdGFiX3ByZWZpeCk7ICAvKiBwcmVmaXggY29kZSAoc2VlIHVubHp3LmMpICovCisjZWxzZQorIyAgZGVmaW5lIHRhYl9wcmVmaXgwIHByZXYKKyMgIGRlZmluZSBoZWFkIHRhYl9wcmVmaXgxCisgICBFWFRFUk4odXNoLCB0YWJfcHJlZml4MCk7IC8qIHByZWZpeCBmb3IgZXZlbiBjb2RlcyAqLworICAgRVhURVJOKHVzaCwgdGFiX3ByZWZpeDEpOyAvKiBwcmVmaXggZm9yIG9kZCAgY29kZXMgKi8KKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgaW5zaXplOyAvKiB2YWxpZCBieXRlcyBpbiBpbmJ1ZiAqLworZXh0ZXJuIHVuc2lnbmVkIGlucHRyOyAgLyogaW5kZXggb2YgbmV4dCBieXRlIHRvIGJlIHByb2Nlc3NlZCBpbiBpbmJ1ZiAqLworZXh0ZXJuIHVuc2lnbmVkIG91dGNudDsgLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLworCitleHRlcm4gbG9uZyBieXRlc19pbjsgICAvKiBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgKi8KK2V4dGVybiBsb25nIGJ5dGVzX291dDsgIC8qIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgKi8KK2V4dGVybiBsb25nIGhlYWRlcl9ieXRlczsvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZ3ppcCBoZWFkZXIgKi8KKworI2RlZmluZSBpc2l6ZSBieXRlc19pbgorLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgemlwIHNvdXJjZXMgKHRvIGJlIGNsZWFuZWQpICovCisKK2V4dGVybiBpbnQgIGlmZDsgICAgICAgIC8qIGlucHV0IGZpbGUgZGVzY3JpcHRvciAqLworZXh0ZXJuIGludCAgb2ZkOyAgICAgICAgLyogb3V0cHV0IGZpbGUgZGVzY3JpcHRvciAqLworZXh0ZXJuIGNoYXIgaWZuYW1lW107ICAgLyogaW5wdXQgZmlsZSBuYW1lIG9yICJzdGRpbiIgKi8KK2V4dGVybiBjaGFyIG9mbmFtZVtdOyAgIC8qIG91dHB1dCBmaWxlIG5hbWUgb3IgInN0ZG91dCIgKi8KK2V4dGVybiBjaGFyICpwcm9nbmFtZTsgIC8qIHByb2dyYW0gbmFtZSAqLworCitleHRlcm4gdGltZV90IHRpbWVfc3RhbXA7IC8qIG9yaWdpbmFsIHRpbWUgc3RhbXAgKG1vZGlmaWNhdGlvbiB0aW1lKSAqLworZXh0ZXJuIGxvbmcgaWZpbGVfc2l6ZTsgLyogaW5wdXQgZmlsZSBzaXplLCAtMSBmb3IgZGV2aWNlcyAoZGVidWcgb25seSkgKi8KKwordHlwZWRlZiBpbnQgZmlsZV90OyAgICAgLyogRG8gbm90IHVzZSBzdGRpbyAqLworI2RlZmluZSBOT19GSUxFICAoLTEpICAgLyogaW4gbWVtb3J5IGNvbXByZXNzaW9uICovCisKKworI2RlZmluZQlQQUNLX01BR0lDICAgICAiXDAzN1wwMzYiIC8qIE1hZ2ljIGhlYWRlciBmb3IgcGFja2VkIGZpbGVzICovCisjZGVmaW5lCUdaSVBfTUFHSUMgICAgICJcMDM3XDIxMyIgLyogTWFnaWMgaGVhZGVyIGZvciBnemlwIGZpbGVzLCAxRiA4QiAqLworI2RlZmluZQlPTERfR1pJUF9NQUdJQyAiXDAzN1wyMzYiIC8qIE1hZ2ljIGhlYWRlciBmb3IgZ3ppcCAwLjUgPSBmcmVlemUgMS54ICovCisjZGVmaW5lCUxaSF9NQUdJQyAgICAgICJcMDM3XDI0MCIgLyogTWFnaWMgaGVhZGVyIGZvciBTQ08gTFpIIENvbXByZXNzIGZpbGVzKi8KKyNkZWZpbmUgUEtaSVBfTUFHSUMgICAgIlwxMjBcMTEzXDAwM1wwMDQiIC8qIE1hZ2ljIGhlYWRlciBmb3IgcGt6aXAgZmlsZXMgKi8KKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIgLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBFTkNSWVBURUQgICAgMHgyMCAvKiBiaXQgNSBzZXQ6IGZpbGUgaXMgZW5jcnlwdGVkICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEMwIC8qIGJpdCA2LDc6ICAgcmVzZXJ2ZWQgKi8KKworLyogaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgVU5LTk9XTiAweGZmZmYKKyNkZWZpbmUgQklOQVJZICAwCisjZGVmaW5lIEFTQ0lJICAgMQorCisjaWZuZGVmIFdTSVpFCisjICBkZWZpbmUgV1NJWkUgMHg4MDAwICAgICAvKiB3aW5kb3cgc2l6ZS0tbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAvKiAgYXQgbGVhc3QgMzJLIGZvciB6aXAncyBkZWZsYXRlIG1ldGhvZCAqLworCisjZGVmaW5lIE1JTl9NQVRDSCAgMworI2RlZmluZSBNQVhfTUFUQ0ggIDI1OAorLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqLworCisjZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKKy8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCisgKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCisgKi8KKworI2RlZmluZSBNQVhfRElTVCAgKFdTSVpFLU1JTl9MT09LQUhFQUQpCisvKiBJbiBvcmRlciB0byBzaW1wbGlmeSB0aGUgY29kZSwgcGFydGljdWxhcmx5IG9uIDE2IGJpdCBtYWNoaW5lcywgbWF0Y2gKKyAqIGRpc3RhbmNlcyBhcmUgbGltaXRlZCB0byBNQVhfRElTVCBpbnN0ZWFkIG9mIFdTSVpFLgorICovCisKK2V4dGVybiBpbnQgZGVjcnlwdDsgICAgICAgIC8qIGZsYWcgdG8gdHVybiBvbiBkZWNyeXB0aW9uICovCitleHRlcm4gaW50IGV4aXRfY29kZTsgICAgICAvKiBwcm9ncmFtIGV4aXQgY29kZSAqLworZXh0ZXJuIGludCB2ZXJib3NlOyAgICAgICAgLyogYmUgdmVyYm9zZSAoLXYpICovCitleHRlcm4gaW50IHF1aWV0OyAgICAgICAgICAvKiBiZSBxdWlldCAoLXEpICovCitleHRlcm4gaW50IGxldmVsOyAgICAgICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAqLworZXh0ZXJuIGludCB0ZXN0OyAgICAgICAgICAgLyogY2hlY2sgLnogZmlsZSBpbnRlZ3JpdHkgKi8KK2V4dGVybiBpbnQgdG9fc3Rkb3V0OyAgICAgIC8qIG91dHB1dCB0byBzdGRvdXQgKC1jKSAqLworZXh0ZXJuIGludCBzYXZlX29yaWdfbmFtZTsgLyogc2V0IGlmIG9yaWdpbmFsIG5hbWUgbXVzdCBiZSBzYXZlZCAqLworCisjZGVmaW5lIGdldF9ieXRlKCkgIChpbnB0ciA8IGluc2l6ZSA/IGluYnVmW2lucHRyKytdIDogZmlsbF9pbmJ1ZigwKSkKKyNkZWZpbmUgdHJ5X2J5dGUoKSAgKGlucHRyIDwgaW5zaXplID8gaW5idWZbaW5wdHIrK10gOiBmaWxsX2luYnVmKDEpKQorCisvKiBwdXRfYnl0ZSBpcyB1c2VkIGZvciB0aGUgY29tcHJlc3NlZCBvdXRwdXQsIHB1dF91Ynl0ZSBmb3IgdGhlCisgKiB1bmNvbXByZXNzZWQgb3V0cHV0LiBIb3dldmVyIHVubHp3KCkgdXNlcyB3aW5kb3cgZm9yIGl0cworICogc3VmZml4IHRhYmxlIGluc3RlYWQgb2YgaXRzIG91dHB1dCBidWZmZXIsIHNvIGl0IGRvZXMgbm90IHVzZSBwdXRfdWJ5dGUKKyAqICh0byBiZSBjbGVhbmVkIHVwKS4KKyAqLworI2RlZmluZSBwdXRfYnl0ZShjKSB7b3V0YnVmW291dGNudCsrXT0odWNoKShjKTsgaWYgKG91dGNudD09T1VUQlVGU0laKVwKKyAgIGZsdXNoX291dGJ1ZigpO30KKyNkZWZpbmUgcHV0X3VieXRlKGMpIHt3aW5kb3dbb3V0Y250KytdPSh1Y2gpKGMpOyBpZiAob3V0Y250PT1XU0laRSlcCisgICBmbHVzaF93aW5kb3coKTt9CisKKy8qIE91dHB1dCBhIDE2IGJpdCB2YWx1ZSwgbHNiIGZpcnN0ICovCisjZGVmaW5lIHB1dF9zaG9ydCh3KSBcCit7IGlmIChvdXRjbnQgPCBPVVRCVUZTSVotMikgeyBcCisgICAgb3V0YnVmW291dGNudCsrXSA9ICh1Y2gpICgodykgJiAweGZmKTsgXAorICAgIG91dGJ1ZltvdXRjbnQrK10gPSAodWNoKSAoKHVzaCkodykgPj4gOCk7IFwKKyAgfSBlbHNlIHsgXAorICAgIHB1dF9ieXRlKCh1Y2gpKCh3KSAmIDB4ZmYpKTsgXAorICAgIHB1dF9ieXRlKCh1Y2gpKCh1c2gpKHcpID4+IDgpKTsgXAorICB9IFwKK30KKworLyogT3V0cHV0IGEgMzIgYml0IHZhbHVlIHRvIHRoZSBiaXQgc3RyZWFtLCBsc2IgZmlyc3QgKi8KKyNkZWZpbmUgcHV0X2xvbmcobikgeyBcCisgICAgcHV0X3Nob3J0KChuKSAmIDB4ZmZmZik7IFwKKyAgICBwdXRfc2hvcnQoKCh1bGcpKG4pKSA+PiAxNik7IFwKK30KKworI2RlZmluZSBzZWVrYWJsZSgpICAgIDAgIC8qIGZvcmNlIHNlcXVlbnRpYWwgb3V0cHV0ICovCisjZGVmaW5lIHRyYW5zbGF0ZV9lb2wgMCAgLyogbm8gb3B0aW9uIC1hIHlldCAqLworCisjZGVmaW5lIHRvbG93KGMpICAoaXN1cHBlcihjKSA/IChjKS0nQScrJ2EnIDogKGMpKSAgICAvKiBmb3JjZSB0byBsb3dlciBjYXNlICovCisKKy8qIE1hY3JvcyBmb3IgZ2V0dGluZyB0d28tYnl0ZSBhbmQgZm91ci1ieXRlIGhlYWRlciB2YWx1ZXMgKi8KKyNkZWZpbmUgU0gocCkgKCh1c2gpKHVjaCkoKHApWzBdKSB8ICgodXNoKSh1Y2gpKChwKVsxXSkgPDwgOCkpCisjZGVmaW5lIExHKHApICgodWxnKShTSChwKSkgfCAoKHVsZykoU0goKHApKzIpKSA8PCAxNikpCisKKy8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCisjaWZkZWYgREVCVUcKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSBlcnJvcihtc2cpO30KKyMgIGRlZmluZSBUcmFjZSh4KSBmcHJpbnRmIHgKKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh2ZXJib3NlKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXZ2KHgpIHtpZiAodmVyYm9zZT4xKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHZlcmJvc2UgJiYgKGMpKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWN2KGMseCkge2lmICh2ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KKyNlbHNlCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQorIyAgZGVmaW5lIFRyYWNlKHgpCisjICBkZWZpbmUgVHJhY2V2KHgpCisjICBkZWZpbmUgVHJhY2V2dih4KQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpCisjICBkZWZpbmUgVHJhY2VjdihjLHgpCisjZW5kaWYKKworI2RlZmluZSBXQVJOKG1zZykge2lmICghcXVpZXQpIGZwcmludGYgbXNnIDsgXAorCQkgICBpZiAoZXhpdF9jb2RlID09IE9LKSBleGl0X2NvZGUgPSBXQVJOSU5HO30KKworCS8qIGluIHppcC5jOiAqLworZXh0ZXJuIGludCB6aXAgICAgICAgIE9GKChpbnQgaW4sIGludCBvdXQpKTsKK2V4dGVybiBpbnQgZmlsZV9yZWFkICBPRigoY2hhciAqYnVmLCAgdW5zaWduZWQgc2l6ZSkpOworCisJLyogaW4gdW56aXAuYyAqLworZXh0ZXJuIGludCB1bnppcCAgICAgIE9GKChpbnQgaW4sIGludCBvdXQpKTsKK2V4dGVybiBpbnQgY2hlY2tfemlwZmlsZSBPRigoaW50IGluKSk7CisKKwkvKiBpbiBnemlwLmMgKi8KK3ZvaWQgYWJvcnRfZ3ppcCBPRigodm9pZCkpOworCisgICAgICAgIC8qIGluIGRlZmxhdGUuYyAqLwordm9pZCBsbV9pbml0IE9GKChpbnQgcGFja19sZXZlbCwgdXNoICpmbGFncykpOwordWxnICBkZWZsYXRlIE9GKCh2b2lkKSk7CisKKyAgICAgICAgLyogaW4gdHJlZXMuYyAqLwordm9pZCBjdF9pbml0ICAgICBPRigodXNoICphdHRyLCBpbnQgKm1ldGhvZCkpOworaW50ICBjdF90YWxseSAgICBPRigoaW50IGRpc3QsIGludCBsYykpOwordWxnICBmbHVzaF9ibG9jayBPRigoY2hhciAqYnVmLCB1bGcgc3RvcmVkX2xlbiwgaW50IGVvZikpOworCisgICAgICAgIC8qIGluIGJpdHMuYyAqLwordm9pZCAgICAgYmlfaW5pdCAgICBPRigoZmlsZV90IHppcGZpbGUpKTsKK3ZvaWQgICAgIHNlbmRfYml0cyAgT0YoKGludCB2YWx1ZSwgaW50IGxlbmd0aCkpOwordW5zaWduZWQgYmlfcmV2ZXJzZSBPRigodW5zaWduZWQgdmFsdWUsIGludCBsZW5ndGgpKTsKK3ZvaWQgICAgIGJpX3dpbmR1cCAgT0YoKHZvaWQpKTsKK3ZvaWQgICAgIGNvcHlfYmxvY2sgT0YoKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBpbnQgaGVhZGVyKSk7CitleHRlcm4gICBpbnQgKCpyZWFkX2J1ZikgT0YoKGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOworCisJLyogaW4gdXRpbC5jOiAqLworZXh0ZXJuIGludCBjb3B5ICAgICAgICAgICBPRigoaW50IGluLCBpbnQgb3V0KSk7CitleHRlcm4gdWxnICB1cGRjcmMgICAgICAgIE9GKCh1Y2ggKnMsIHVuc2lnbmVkIG4pKTsKK2V4dGVybiB2b2lkIGNsZWFyX2J1ZnMgICAgT0YoKHZvaWQpKTsKK2V4dGVybiBpbnQgIGZpbGxfaW5idWYgICAgT0YoKGludCBlb2Zfb2spKTsKK2V4dGVybiB2b2lkIGZsdXNoX291dGJ1ZiAgT0YoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGZsdXNoX3dpbmRvdyAgT0YoKHZvaWQpKTsKK2V4dGVybiB2b2lkIHdyaXRlX2J1ZiAgICAgT0YoKGludCBmZCwgdm9pZHAgYnVmLCB1bnNpZ25lZCBjbnQpKTsKK2V4dGVybiBjaGFyICpzdHJsd3IgICAgICAgT0YoKGNoYXIgKnMpKTsKK2V4dGVybiBjaGFyICpiYXNlbmFtZSAgICAgT0YoKGNoYXIgKmZuYW1lKSk7CitleHRlcm4gdm9pZCBtYWtlX3NpbXBsZV9uYW1lIE9GKChjaGFyICpuYW1lKSk7CitleHRlcm4gY2hhciAqYWRkX2Vudm9wdCAgIE9GKChpbnQgKmFyZ2NwLCBjaGFyICoqKmFyZ3ZwLCBjaGFyICplbnYpKTsKK2V4dGVybiB2b2lkIGVycm9yICAgICAgICAgT0YoKGNoYXIgKm0pKTsKK2V4dGVybiB2b2lkIHdhcm4gICAgICAgICAgT0YoKGNoYXIgKmEsIGNoYXIgKmIpKTsKK2V4dGVybiB2b2lkIHJlYWRfZXJyb3IgICAgT0YoKHZvaWQpKTsKK2V4dGVybiB2b2lkIHdyaXRlX2Vycm9yICAgT0YoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGRpc3BsYXlfcmF0aW8gT0YoKGxvbmcgbnVtLCBsb25nIGRlbiwgRklMRSAqZmlsZSkpOworZXh0ZXJuIHZvaWRwIHhtYWxsb2MgICAgICBPRigodW5zaWduZWQgaW50IHNpemUpKTsKKworCS8qIGluIGluZmxhdGUuYyAqLworZXh0ZXJuIGludCBpbmZsYXRlIE9GKCh2b2lkKSk7CisKKy8qIHN0dWZmIGZyb20gbHp3LmggKi8KKyNpZm5kZWYgQklUUworIyAgZGVmaW5lIEJJVFMgMTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvaW5mbGF0ZS5jIGIvdXNyL2d6aXAvaW5mbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDA1MzgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC9pbmZsYXRlLmMKQEAgLTAsMCArMSw5NTAgQEAKKy8qIGluZmxhdGUuYyAtLSBOb3QgY29weXJpZ2h0ZWQgMTk5MiBieSBNYXJrIEFkbGVyCisgICB2ZXJzaW9uIGMxMHAxLCAxMCBKYW51YXJ5IDE5OTMgKi8KKworLyogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3UgbGlrZSB3aXRoIHRoaXMgc291cmNlIGZpbGUsIHRob3VnaCBJIHdvdWxkCisgICBwcmVmZXIgdGhhdCBpZiB5b3UgbW9kaWZ5IGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgdGhhdCB5b3UgaW5jbHVkZQorICAgY29tbWVudHMgdG8gdGhhdCBlZmZlY3Qgd2l0aCB5b3VyIG5hbWUgYW5kIHRoZSBkYXRlLiAgVGhhbmsgeW91LgorICAgW1RoZSBoaXN0b3J5IGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBmaWxlIENoYW5nZUxvZy5dCisgKi8KKworLyoKKyAgIEluZmxhdGUgZGVmbGF0ZWQgKFBLWklQJ3MgbWV0aG9kIDggY29tcHJlc3NlZCkgZGF0YS4gIFRoZSBjb21wcmVzc2lvbgorICAgbWV0aG9kIHNlYXJjaGVzIGZvciBhcyBtdWNoIG9mIHRoZSBjdXJyZW50IHN0cmluZyBvZiBieXRlcyAodXAgdG8gYQorICAgbGVuZ3RoIG9mIDI1OCkgaW4gdGhlIHByZXZpb3VzIDMySyBieXRlcy4gIElmIGl0IGRvZXNuJ3QgZmluZCBhbnkKKyAgIG1hdGNoZXMgKG9mIGF0IGxlYXN0IGxlbmd0aCAzKSwgaXQgY29kZXMgdGhlIG5leHQgYnl0ZS4gIE90aGVyd2lzZSwgaXQKKyAgIGNvZGVzIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgc3RyaW5nIGFuZCBpdHMgZGlzdGFuY2UgYmFja3dhcmRzIGZyb20KKyAgIHRoZSBjdXJyZW50IHBvc2l0aW9uLiAgVGhlcmUgaXMgYSBzaW5nbGUgSHVmZm1hbiBjb2RlIHRoYXQgY29kZXMgYm90aAorICAgc2luZ2xlIGJ5dGVzIChjYWxsZWQgImxpdGVyYWxzIikgYW5kIG1hdGNoIGxlbmd0aHMuICBBIHNlY29uZCBIdWZmbWFuCisgICBjb2RlIGNvZGVzIHRoZSBkaXN0YW5jZSBpbmZvcm1hdGlvbiwgd2hpY2ggZm9sbG93cyBhIGxlbmd0aCBjb2RlLiAgRWFjaAorICAgbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGUgYWN0dWFsbHkgcmVwcmVzZW50cyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyCisgICBvZiAiZXh0cmEiIChzb21ldGltZXMgemVybykgYml0cyB0byBnZXQgdG8gYWRkIHRvIHRoZSBiYXNlIHZhbHVlLiAgQXQKKyAgIHRoZSBlbmQgb2YgZWFjaCBkZWZsYXRlZCBibG9jayBpcyBhIHNwZWNpYWwgZW5kLW9mLWJsb2NrIChFT0IpIGxpdGVyYWwvCisgICBsZW5ndGggY29kZS4gIFRoZSBkZWNvZGluZyBwcm9jZXNzIGlzIGJhc2ljYWxseTogZ2V0IGEgbGl0ZXJhbC9sZW5ndGgKKyAgIGNvZGU7IGlmIEVPQiB0aGVuIGRvbmU7IGlmIGEgbGl0ZXJhbCwgZW1pdCB0aGUgZGVjb2RlZCBieXRlOyBpZiBhCisgICBsZW5ndGggdGhlbiBnZXQgdGhlIGRpc3RhbmNlIGFuZCBlbWl0IHRoZSByZWZlcnJlZC10byBieXRlcyBmcm9tIHRoZQorICAgc2xpZGluZyB3aW5kb3cgb2YgcHJldmlvdXNseSBlbWl0dGVkIGRhdGEuCisKKyAgIFRoZXJlIGFyZSAoY3VycmVudGx5KSB0aHJlZSBraW5kcyBvZiBpbmZsYXRlIGJsb2Nrczogc3RvcmVkLCBmaXhlZCwgYW5kCisgICBkeW5hbWljLiAgVGhlIGNvbXByZXNzb3IgZGVhbHMgd2l0aCBzb21lIGNodW5rIG9mIGRhdGEgYXQgYSB0aW1lLCBhbmQKKyAgIGRlY2lkZXMgd2hpY2ggbWV0aG9kIHRvIHVzZSBvbiBhIGNodW5rLWJ5LWNodW5rIGJhc2lzLiAgQSBjaHVuayBtaWdodAorICAgdHlwaWNhbGx5IGJlIDMySyBvciA2NEsuICBJZiB0aGUgY2h1bmsgaXMgdW5jb21wcmVzc2libGUsIHRoZW4gdGhlCisgICAic3RvcmVkIiBtZXRob2QgaXMgdXNlZC4gIEluIHRoaXMgY2FzZSwgdGhlIGJ5dGVzIGFyZSBzaW1wbHkgc3RvcmVkIGFzCisgICBpcywgZWlnaHQgYml0cyBwZXIgYnl0ZSwgd2l0aCBub25lIG9mIHRoZSBhYm92ZSBjb2RpbmcuICBUaGUgYnl0ZXMgYXJlCisgICBwcmVjZWRlZCBieSBhIGNvdW50LCBzaW5jZSB0aGVyZSBpcyBubyBsb25nZXIgYW4gRU9CIGNvZGUuCisKKyAgIElmIHRoZSBkYXRhIGlzIGNvbXByZXNzaWJsZSwgdGhlbiBlaXRoZXIgdGhlIGZpeGVkIG9yIGR5bmFtaWMgbWV0aG9kcworICAgYXJlIHVzZWQuICBJbiB0aGUgZHluYW1pYyBtZXRob2QsIHRoZSBjb21wcmVzc2VkIGRhdGEgaXMgcHJlY2VkZWQgYnkKKyAgIGFuIGVuY29kaW5nIG9mIHRoZSBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgSHVmZm1hbiBjb2RlcyB0aGF0IGFyZQorICAgdG8gYmUgdXNlZCB0byBkZWNvZGUgdGhpcyBibG9jay4gIFRoZSByZXByZXNlbnRhdGlvbiBpcyBpdHNlbGYgSHVmZm1hbgorICAgY29kZWQsIGFuZCBzbyBpcyBwcmVjZWRlZCBieSBhIGRlc2NyaXB0aW9uIG9mIHRoYXQgY29kZS4gIFRoZXNlIGNvZGUKKyAgIGRlc2NyaXB0aW9ucyB0YWtlIHVwIGEgbGl0dGxlIHNwYWNlLCBhbmQgc28gZm9yIHNtYWxsIGJsb2NrcywgdGhlcmUgaXMKKyAgIGEgcHJlZGVmaW5lZCBzZXQgb2YgY29kZXMsIGNhbGxlZCB0aGUgZml4ZWQgY29kZXMuICBUaGUgZml4ZWQgbWV0aG9kIGlzCisgICB1c2VkIGlmIHRoZSBibG9jayBjb2RlcyB1cCBzbWFsbGVyIHRoYXQgd2F5ICh1c3VhbGx5IGZvciBxdWl0ZSBzbWFsbAorICAgY2h1bmtzKSwgb3RoZXJ3aXNlIHRoZSBkeW5hbWljIG1ldGhvZCBpcyB1c2VkLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKyAgIGNvZGVzIGFyZSBjdXN0b21pemVkIHRvIHRoZSBwcm9iYWJpbGl0aWVzIGluIHRoZSBjdXJyZW50IGJsb2NrLCBhbmQgc28KKyAgIGNhbiBjb2RlIGl0IG11Y2ggYmV0dGVyIHRoYW4gdGhlIHByZS1kZXRlcm1pbmVkIGZpeGVkIGNvZGVzLgorCisgICBUaGUgSHVmZm1hbiBjb2RlcyB0aGVtc2VsdmVzIGFyZSBkZWNvZGVkIHVzaW5nIGEgbXV0bGktbGV2ZWwgdGFibGUKKyAgIGxvb2t1cCwgaW4gb3JkZXIgdG8gbWF4aW1pemUgdGhlIHNwZWVkIG9mIGRlY29kaW5nIHBsdXMgdGhlIHNwZWVkIG9mCisgICBidWlsZGluZyB0aGUgZGVjb2RpbmcgdGFibGVzLiAgU2VlIHRoZSBjb21tZW50cyBiZWxvdyB0aGF0IHByZWNlZGUgdGhlCisgICBsYml0cyBhbmQgZGJpdHMgdHVuaW5nIHBhcmFtZXRlcnMuCisgKi8KKworCisvKgorICAgTm90ZXMgYmV5b25kIHRoZSAxLjkzYSBhcHBub3RlLnR4dDoKKworICAgMS4gRGlzdGFuY2UgcG9pbnRlcnMgbmV2ZXIgcG9pbnQgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dAorICAgICAgc3RyZWFtLgorICAgMi4gRGlzdGFuY2UgcG9pbnRlcnMgY2FuIHBvaW50IGJhY2sgYWNyb3NzIGJsb2NrcywgdXAgdG8gMzJrIGF3YXkuCisgICAzLiBUaGVyZSBpcyBhbiBpbXBsaWVkIG1heGltdW0gb2YgNyBiaXRzIGZvciB0aGUgYml0IGxlbmd0aCB0YWJsZSBhbmQKKyAgICAgIDE1IGJpdHMgZm9yIHRoZSBhY3R1YWwgZGF0YS4KKyAgIDQuIElmIG9ubHkgb25lIGNvZGUgZXhpc3RzLCB0aGVuIGl0IGlzIGVuY29kZWQgdXNpbmcgb25lIGJpdC4gIChaZXJvCisgICAgICB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCwgYnV0IHBlcmhhcHMgYSBsaXR0bGUgY29uZnVzaW5nLikgIElmIHR3bworICAgICAgY29kZXMgZXhpc3QsIHRoZXkgYXJlIGNvZGVkIHVzaW5nIG9uZSBiaXQgZWFjaCAoMCBhbmQgMSkuCisgICA1LiBUaGVyZSBpcyBubyB3YXkgb2Ygc2VuZGluZyB6ZXJvIGRpc3RhbmNlIGNvZGVzLS1hIGR1bW15IG11c3QgYmUKKyAgICAgIHNlbnQgaWYgdGhlcmUgYXJlIG5vbmUuICAoSGlzdG9yeTogYSBwcmUgMi4wIHZlcnNpb24gb2YgUEtaSVAgd291bGQKKyAgICAgIHN0b3JlIGJsb2NrcyB3aXRoIG5vIGRpc3RhbmNlIGNvZGVzLCBidXQgdGhpcyB3YXMgZGlzY292ZXJlZCB0byBiZQorICAgICAgdG9vIGhhcnNoIGEgY3JpdGVyaW9uLikgIFZhbGlkIG9ubHkgZm9yIDEuOTNhLiAgMi4wNGMgZG9lcyBhbGxvdworICAgICAgemVybyBkaXN0YW5jZSBjb2Rlcywgd2hpY2ggaXMgc2VudCBhcyBvbmUgY29kZSBvZiB6ZXJvIGJpdHMgaW4KKyAgICAgIGxlbmd0aC4KKyAgIDYuIFRoZXJlIGFyZSB1cCB0byAyODYgbGl0ZXJhbC9sZW5ndGggY29kZXMuICBDb2RlIDI1NiByZXByZXNlbnRzIHRoZQorICAgICAgZW5kLW9mLWJsb2NrLiAgTm90ZSBob3dldmVyIHRoYXQgdGhlIHN0YXRpYyBsZW5ndGggdHJlZSBkZWZpbmVzCisgICAgICAyODggY29kZXMganVzdCB0byBmaWxsIG91dCB0aGUgSHVmZm1hbiBjb2Rlcy4gIENvZGVzIDI4NiBhbmQgMjg3CisgICAgICBjYW5ub3QgYmUgdXNlZCB0aG91Z2gsIHNpbmNlIHRoZXJlIGlzIG5vIGxlbmd0aCBiYXNlIG9yIGV4dHJhIGJpdHMKKyAgICAgIGRlZmluZWQgZm9yIHRoZW0uICBTaW1pbGFybHksIHRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBjb2Rlcy4KKyAgICAgIEhvd2V2ZXIsIHN0YXRpYyB0cmVlcyBkZWZpbmUgMzIgY29kZXMgKGFsbCA1IGJpdHMpIHRvIGZpbGwgb3V0IHRoZQorICAgICAgSHVmZm1hbiBjb2RlcywgYnV0IHRoZSBsYXN0IHR3byBoYWQgYmV0dGVyIG5vdCBzaG93IHVwIGluIHRoZSBkYXRhLgorICAgNy4gVW56aXAgY2FuIGNoZWNrIGR5bmFtaWMgSHVmZm1hbiBibG9ja3MgZm9yIGNvbXBsZXRlIGNvZGUgc2V0cy4KKyAgICAgIFRoZSBleGNlcHRpb24gaXMgdGhhdCBhIHNpbmdsZSBjb2RlIHdvdWxkIG5vdCBiZSBjb21wbGV0ZSAoc2VlICM0KS4KKyAgIDguIFRoZSBmaXZlIGJpdHMgZm9sbG93aW5nIHRoZSBibG9jayB0eXBlIGlzIHJlYWxseSB0aGUgbnVtYmVyIG9mCisgICAgICBsaXRlcmFsIGNvZGVzIHNlbnQgbWludXMgMjU3LgorICAgOS4gTGVuZ3RoIGNvZGVzIDgsMTYsMTYgYXJlIGludGVycHJldGVkIGFzIDEzIGxlbmd0aCBjb2RlcyBvZiA4IGJpdHMKKyAgICAgICgxKzYrNikuICBUaGVyZWZvcmUsIHRvIG91dHB1dCB0aHJlZSB0aW1lcyB0aGUgbGVuZ3RoLCB5b3Ugb3V0cHV0CisgICAgICB0aHJlZSBjb2RlcyAoMSsxKzEpLCB3aGVyZWFzIHRvIG91dHB1dCBmb3VyIHRpbWVzIHRoZSBzYW1lIGxlbmd0aCwKKyAgICAgIHlvdSBvbmx5IG5lZWQgdHdvIGNvZGVzICgxKzMpLiAgSG1tLgorICAxMC4gSW4gdGhlIHRyZWUgcmVjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLCBDb2RlID0gQ29kZSArIEluY3JlbWVudAorICAgICAgb25seSBpZiBCaXRMZW5ndGgoaSkgaXMgbm90IHplcm8uICAoUHJldHR5IG9idmlvdXMuKQorICAxMS4gQ29ycmVjdGlvbjogNCBCaXRzOiAjIG9mIEJpdCBMZW5ndGggY29kZXMgLSA0ICAgICAoNCAtIDE5KQorICAxMi4gTm90ZTogbGVuZ3RoIGNvZGUgMjg0IGNhbiByZXByZXNlbnQgMjI3LTI1OCwgYnV0IGxlbmd0aCBjb2RlIDI4NQorICAgICAgcmVhbGx5IGlzIDI1OC4gIFRoZSBsYXN0IGxlbmd0aCBkZXNlcnZlcyBpdHMgb3duLCBzaG9ydCBjb2RlCisgICAgICBzaW5jZSBpdCBnZXRzIHVzZWQgYSBsb3QgaW4gdmVyeSByZWR1bmRhbnQgZmlsZXMuICBUaGUgbGVuZ3RoCisgICAgICAyNTggaXMgc3BlY2lhbCBzaW5jZSAyNTggLSAzICh0aGUgbWluIG1hdGNoIGxlbmd0aCkgaXMgMjU1LgorICAxMy4gVGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGJpdCBsZW5ndGhzIGFyZSByZWFkIGFzIGEKKyAgICAgIHNpbmdsZSBzdHJlYW0gb2YgbGVuZ3Rocy4gIEl0IGlzIHBvc3NpYmxlIChhbmQgYWR2YW50YWdlb3VzKSBmb3IKKyAgICAgIGEgcmVwZWF0IGNvZGUgKDE2LCAxNywgb3IgMTgpIHRvIGdvIGFjcm9zcyB0aGUgYm91bmRhcnkgYmV0d2VlbgorICAgICAgdGhlIHR3byBzZXRzIG9mIGxlbmd0aHMuCisgKi8KKworI2lmZGVmIFJDU0lECitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogaW5mbGF0ZS5jLHYgMS4xIDIwMDIvMDgvMTggMDA6NTk6MjEgaHBhIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0YWlsb3IuaCIKKyNpbmNsdWRlICJnemlwLmgiCisjZGVmaW5lIHNsaWRlIHdpbmRvdworCisvKiBIdWZmbWFuIGNvZGUgbG9va3VwIHRhYmxlIGVudHJ5LS10aGlzIGVudHJ5IGlzIGZvdXIgYnl0ZXMgZm9yIG1hY2hpbmVzCisgICB0aGF0IGhhdmUgMTYtYml0IHBvaW50ZXJzIChlLmcuIFBDJ3MgaW4gdGhlIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCkuCisgICBWYWxpZCBleHRyYSBiaXRzIGFyZSAwLi4xMy4gIGUgPT0gMTUgaXMgRU9CIChlbmQgb2YgYmxvY2spLCBlID09IDE2CisgICBtZWFucyB0aGF0IHYgaXMgYSBsaXRlcmFsLCAxNiA8IGUgPCAzMiBtZWFucyB0aGF0IHYgaXMgYSBwb2ludGVyIHRvCisgICB0aGUgbmV4dCB0YWJsZSwgd2hpY2ggY29kZXMgZSAtIDE2IGJpdHMsIGFuZCBsYXN0bHkgZSA9PSA5OSBpbmRpY2F0ZXMKKyAgIGFuIHVudXNlZCBjb2RlLiAgSWYgYSBjb2RlIHdpdGggZSA9PSA5OSBpcyBsb29rZWQgdXAsIHRoaXMgaW1wbGllcyBhbgorICAgZXJyb3IgaW4gdGhlIGRhdGEuICovCitzdHJ1Y3QgaHVmdCB7CisgIHVjaCBlOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KKyAgdWNoIGI7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBzdWJjb2RlICovCisgIHVuaW9uIHsKKyAgICB1c2ggbjsgICAgICAgICAgICAgIC8qIGxpdGVyYWwsIGxlbmd0aCBiYXNlLCBvciBkaXN0YW5jZSBiYXNlICovCisgICAgc3RydWN0IGh1ZnQgKnQ7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgbGV2ZWwgb2YgdGFibGUgKi8KKyAgfSB2OworfTsKKworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCitpbnQgaHVmdF9idWlsZCBPRigodW5zaWduZWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1c2ggKiwgdXNoICosCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGh1ZnQgKiosIGludCAqKSk7CitpbnQgaHVmdF9mcmVlIE9GKChzdHJ1Y3QgaHVmdCAqKSk7CitpbnQgaW5mbGF0ZV9jb2RlcyBPRigoc3RydWN0IGh1ZnQgKiwgc3RydWN0IGh1ZnQgKiwgaW50LCBpbnQpKTsKK2ludCBpbmZsYXRlX3N0b3JlZCBPRigodm9pZCkpOworaW50IGluZmxhdGVfZml4ZWQgT0YoKHZvaWQpKTsKK2ludCBpbmZsYXRlX2R5bmFtaWMgT0YoKHZvaWQpKTsKK2ludCBpbmZsYXRlX2Jsb2NrIE9GKChpbnQgKikpOworaW50IGluZmxhdGUgT0YoKHZvaWQpKTsKKworCisvKiBUaGUgaW5mbGF0ZSBhbGdvcml0aG0gdXNlcyBhIHNsaWRpbmcgMzJLIGJ5dGUgd2luZG93IG9uIHRoZSB1bmNvbXByZXNzZWQKKyAgIHN0cmVhbSB0byBmaW5kIHJlcGVhdGVkIGJ5dGUgc3RyaW5ncy4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBhcyBhCisgICBjaXJjdWxhciBidWZmZXIuICBUaGUgaW5kZXggaXMgdXBkYXRlZCBzaW1wbHkgYnkgaW5jcmVtZW50aW5nIGFuZCB0aGVuCisgICBhbmQnaW5nIHdpdGggMHg3ZmZmICgzMkstMSkuICovCisvKiBJdCBpcyBsZWZ0IHRvIG90aGVyIG1vZHVsZXMgdG8gc3VwcGx5IHRoZSAzMksgYXJlYS4gIEl0IGlzIGFzc3VtZWQKKyAgIHRvIGJlIHVzYWJsZSBhcyBpZiBpdCB3ZXJlIGRlY2xhcmVkICJ1Y2ggc2xpZGVbMzI3NjhdOyIgb3IgYXMganVzdAorICAgInVjaCAqc2xpZGU7IiBhbmQgdGhlbiBtYWxsb2MnZWQgaW4gdGhlIGxhdHRlciBjYXNlLiAgVGhlIGRlZmluaXRpb24KKyAgIG11c3QgYmUgaW4gdW56aXAuaCwgaW5jbHVkZWQgYWJvdmUuICovCisvKiB1bnNpZ25lZCB3cDsgICAgICAgICAgICAgY3VycmVudCBwb3NpdGlvbiBpbiBzbGlkZSAqLworI2RlZmluZSB3cCBvdXRjbnQKKyNkZWZpbmUgZmx1c2hfb3V0cHV0KHcpICh3cD0odyksZmx1c2hfd2luZG93KCkpCisKKy8qIFRhYmxlcyBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCitzdGF0aWMgdW5zaWduZWQgYm9yZGVyW10gPSB7ICAgIC8qIE9yZGVyIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKK3N0YXRpYyB1c2ggY3BsZW5zW10gPSB7ICAgICAgICAgLyogQ29weSBsZW5ndGhzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCisgICAgICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsCisgICAgICAgIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwfTsKKyAgICAgICAgLyogbm90ZTogc2VlIG5vdGUgIzEzIGFib3ZlIGFib3V0IHRoZSAyNTggaW4gdGhpcyBsaXN0LiAqLworc3RhdGljIHVzaCBjcGxleHRbXSA9IHsgICAgICAgICAvKiBFeHRyYSBiaXRzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsCisgICAgICAgIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDAsIDk5LCA5OX07IC8qIDk5PT1pbnZhbGlkICovCitzdGF0aWMgdXNoIGNwZGlzdFtdID0geyAgICAgICAgIC8qIENvcHkgb2Zmc2V0cyBmb3IgZGlzdGFuY2UgY29kZXMgMC4uMjkgKi8KKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAorICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCisgICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1Nzd9Oworc3RhdGljIHVzaCBjcGRleHRbXSA9IHsgICAgICAgICAvKiBFeHRyYSBiaXRzIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAgICAgICAwLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LAorICAgICAgICA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwKKyAgICAgICAgMTIsIDEyLCAxMywgMTN9OworCisKKworLyogTWFjcm9zIGZvciBpbmZsYXRlKCkgYml0IHBlZWtpbmcgYW5kIGdyYWJiaW5nLgorICAgVGhlIHVzYWdlIGlzOgorCisgICAgICAgIE5FRURCSVRTKGopCisgICAgICAgIHggPSBiICYgbWFza19iaXRzW2pdOworICAgICAgICBEVU1QQklUUyhqKQorCisgICB3aGVyZSBORUVEQklUUyBtYWtlcyBzdXJlIHRoYXQgYiBoYXMgYXQgbGVhc3QgaiBiaXRzIGluIGl0LCBhbmQKKyAgIERVTVBCSVRTIHJlbW92ZXMgdGhlIGJpdHMgZnJvbSBiLiAgVGhlIG1hY3JvcyB1c2UgdGhlIHZhcmlhYmxlIGsKKyAgIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYi4gIE5vcm1hbGx5LCBiIGFuZCBrIGFyZSByZWdpc3RlcgorICAgdmFyaWFibGVzIGZvciBzcGVlZCwgYW5kIGFyZSBpbml0aWFsaXplZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgIHJvdXRpbmUgdGhhdCB1c2VzIHRoZXNlIG1hY3JvcyBmcm9tIGEgZ2xvYmFsIGJpdCBidWZmZXIgYW5kIGNvdW50LgorCisgICBJZiB3ZSBhc3N1bWUgdGhhdCBFT0Igd2lsbCBiZSB0aGUgbG9uZ2VzdCBjb2RlLCB0aGVuIHdlIHdpbGwgbmV2ZXIKKyAgIGFzayBmb3IgYml0cyB3aXRoIE5FRURCSVRTIHRoYXQgYXJlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgICBTbywgTkVFREJJVFMgc2hvdWxkIG5vdCByZWFkIGFueSBtb3JlIGJ5dGVzIHRoYW4gYXJlIG5lZWRlZCB0bworICAgbWVldCB0aGUgcmVxdWVzdC4gIFRoZW4gbm8gYnl0ZXMgbmVlZCB0byBiZSAicmV0dXJuZWQiIHRvIHRoZSBidWZmZXIKKyAgIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgYmxvY2suCisKKyAgIEhvd2V2ZXIsIHRoaXMgYXNzdW1wdGlvbiBpcyBub3QgdHJ1ZSBmb3IgZml4ZWQgYmxvY2tzLS10aGUgRU9CIGNvZGUKKyAgIGlzIDcgYml0cywgYnV0IHRoZSBvdGhlciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBjYW4gYmUgOCBvciA5IGJpdHMuCisgICAoVGhlIEVPQiBjb2RlIGlzIHNob3J0ZXIgdGhhbiBvdGhlciBjb2RlcyBiZWNhdXNlIGZpeGVkIGJsb2NrcyBhcmUKKyAgIGdlbmVyYWxseSBzaG9ydC4gIFNvLCB3aGlsZSBhIGJsb2NrIGFsd2F5cyBoYXMgYW4gRU9CLCBtYW55IG90aGVyCisgICBsaXRlcmFsL2xlbmd0aCBjb2RlcyBoYXZlIGEgc2lnbmlmaWNhbnRseSBsb3dlciBwcm9iYWJpbGl0eSBvZgorICAgc2hvd2luZyB1cCBhdCBhbGwuKSAgSG93ZXZlciwgYnkgbWFraW5nIHRoZSBmaXJzdCB0YWJsZSBoYXZlIGEKKyAgIGxvb2t1cCBvZiBzZXZlbiBiaXRzLCB0aGUgRU9CIGNvZGUgd2lsbCBiZSBmb3VuZCBpbiB0aGF0IGZpcnN0CisgICBsb29rdXAsIGFuZCBzbyB3aWxsIG5vdCByZXF1aXJlIHRoYXQgdG9vIG1hbnkgYml0cyBiZSBwdWxsZWQgZnJvbQorICAgdGhlIHN0cmVhbS4KKyAqLworCit1bGcgYmI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KK3Vuc2lnbmVkIGJrOyAgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisKK3VzaCBtYXNrX2JpdHNbXSA9IHsKKyAgICAweDAwMDAsCisgICAgMHgwMDAxLCAweDAwMDMsIDB4MDAwNywgMHgwMDBmLCAweDAwMWYsIDB4MDAzZiwgMHgwMDdmLCAweDAwZmYsCisgICAgMHgwMWZmLCAweDAzZmYsIDB4MDdmZiwgMHgwZmZmLCAweDFmZmYsIDB4M2ZmZiwgMHg3ZmZmLCAweGZmZmYKK307CisKKyNpZmRlZiBDUllQVAorICB1Y2ggY2M7CisjICBkZWZpbmUgTkVYVEJZVEUoKSBcCisgICAgIChkZWNyeXB0ID8gKGNjID0gZ2V0X2J5dGUoKSwgY2MpIDogZ2V0X2J5dGUoKSkKKyNlbHNlCisjICBkZWZpbmUgTkVYVEJZVEUoKSAgKHVjaClnZXRfYnl0ZSgpCisjZW5kaWYKKyNkZWZpbmUgTkVFREJJVFMobikge3doaWxlKGs8KG4pKXtifD0oKHVsZylORVhUQllURSgpKTw8aztrKz04O319CisjZGVmaW5lIERVTVBCSVRTKG4pIHtiPj49KG4pO2stPShuKTt9CisKKworLyoKKyAgIEh1ZmZtYW4gY29kZSBkZWNvZGluZyBpcyBwZXJmb3JtZWQgdXNpbmcgYSBtdWx0aS1sZXZlbCB0YWJsZSBsb29rdXAuCisgICBUaGUgZmFzdGVzdCB3YXkgdG8gZGVjb2RlIGlzIHRvIHNpbXBseSBidWlsZCBhIGxvb2t1cCB0YWJsZSB3aG9zZQorICAgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb25nZXN0IGNvZGUuICBIb3dldmVyLCB0aGUgdGltZSBpdCB0YWtlcworICAgdG8gYnVpbGQgdGhpcyB0YWJsZSBjYW4gYWxzbyBiZSBhIGZhY3RvciBpZiB0aGUgZGF0YSBiZWluZyBkZWNvZGVkCisgICBpcyBub3QgdmVyeSBsb25nLiAgVGhlIG1vc3QgY29tbW9uIGNvZGVzIGFyZSBuZWNlc3NhcmlseSB0aGUKKyAgIHNob3J0ZXN0IGNvZGVzLCBzbyB0aG9zZSBjb2RlcyBkb21pbmF0ZSB0aGUgZGVjb2RpbmcgdGltZSwgYW5kIGhlbmNlCisgICB0aGUgc3BlZWQuICBUaGUgaWRlYSBpcyB5b3UgY2FuIGhhdmUgYSBzaG9ydGVyIHRhYmxlIHRoYXQgZGVjb2RlcyB0aGUKKyAgIHNob3J0ZXIsIG1vcmUgcHJvYmFibGUgY29kZXMsIGFuZCB0aGVuIHBvaW50IHRvIHN1YnNpZGlhcnkgdGFibGVzIGZvcgorICAgdGhlIGxvbmdlciBjb2Rlcy4gIFRoZSB0aW1lIGl0IGNvc3RzIHRvIGRlY29kZSB0aGUgbG9uZ2VyIGNvZGVzIGlzCisgICB0aGVuIHRyYWRlZCBhZ2FpbnN0IHRoZSB0aW1lIGl0IHRha2VzIHRvIG1ha2UgbG9uZ2VyIHRhYmxlcy4KKworICAgVGhpcyByZXN1bHRzIG9mIHRoaXMgdHJhZGUgYXJlIGluIHRoZSB2YXJpYWJsZXMgbGJpdHMgYW5kIGRiaXRzCisgICBiZWxvdy4gIGxiaXRzIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGUgZmlyc3QgbGV2ZWwgdGFibGUgZm9yIGxpdGVyYWwvCisgICBsZW5ndGggY29kZXMgY2FuIGRlY29kZSBpbiBvbmUgc3RlcCwgYW5kIGRiaXRzIGlzIHRoZSBzYW1lIHRoaW5nIGZvcgorICAgdGhlIGRpc3RhbmNlIGNvZGVzLiAgU3Vic2VxdWVudCB0YWJsZXMgYXJlIGFsc28gbGVzcyB0aGFuIG9yIGVxdWFsIHRvCisgICB0aG9zZSBzaXplcy4gIFRoZXNlIHZhbHVlcyBtYXkgYmUgYWRqdXN0ZWQgZWl0aGVyIHdoZW4gYWxsIG9mIHRoZQorICAgY29kZXMgYXJlIHNob3J0ZXIgdGhhbiB0aGF0LCBpbiB3aGljaCBjYXNlIHRoZSBsb25nZXN0IGNvZGUgbGVuZ3RoIGluCisgICBiaXRzIGlzIHVzZWQsIG9yIHdoZW4gdGhlIHNob3J0ZXN0IGNvZGUgaXMgKmxvbmdlciogdGhhbiB0aGUgcmVxdWVzdGVkCisgICB0YWJsZSBzaXplLCBpbiB3aGljaCBjYXNlIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0IGNvZGUgaW4gYml0cyBpcworICAgdXNlZC4KKworICAgVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgdHdvIHRhYmxlcywgc2luY2UgdGhleSBjb2RlIGEKKyAgIGRpZmZlcmVudCBudW1iZXIgb2YgcG9zc2liaWxpdGllcyBlYWNoLiAgVGhlIGxpdGVyYWwvbGVuZ3RoIHRhYmxlCisgICBjb2RlcyAyODYgcG9zc2libGUgdmFsdWVzLCBvciBpbiBhIGZsYXQgY29kZSwgYSBsaXR0bGUgb3ZlciBlaWdodAorICAgYml0cy4gIFRoZSBkaXN0YW5jZSB0YWJsZSBjb2RlcyAzMCBwb3NzaWJsZSB2YWx1ZXMsIG9yIGEgbGl0dGxlIGxlc3MKKyAgIHRoYW4gZml2ZSBiaXRzLCBmbGF0LiAgVGhlIG9wdGltdW0gdmFsdWVzIGZvciBzcGVlZCBlbmQgdXAgYmVpbmcKKyAgIGFib3V0IG9uZSBiaXQgbW9yZSB0aGFuIHRob3NlLCBzbyBsYml0cyBpcyA4KzEgYW5kIGRiaXRzIGlzIDUrMS4KKyAgIFRoZSBvcHRpbXVtIHZhbHVlcyBtYXkgZGlmZmVyIHRob3VnaCBmcm9tIG1hY2hpbmUgdG8gbWFjaGluZSwgYW5kCisgICBwb3NzaWJseSBldmVuIGJldHdlZW4gY29tcGlsZXJzLiAgWW91ciBtaWxlYWdlIG1heSB2YXJ5LgorICovCisKKworaW50IGxiaXRzID0gOTsgICAgICAgICAgLyogYml0cyBpbiBiYXNlIGxpdGVyYWwvbGVuZ3RoIGxvb2t1cCB0YWJsZSAqLworaW50IGRiaXRzID0gNjsgICAgICAgICAgLyogYml0cyBpbiBiYXNlIGRpc3RhbmNlIGxvb2t1cCB0YWJsZSAqLworCisKKy8qIElmIEJNQVggbmVlZHMgdG8gYmUgbGFyZ2VyIHRoYW4gMTYsIHRoZW4gaCBhbmQgeFtdIHNob3VsZCBiZSB1bGcuICovCisjZGVmaW5lIEJNQVggMTYgICAgICAgICAvKiBtYXhpbXVtIGJpdCBsZW5ndGggb2YgYW55IGNvZGUgKDE2IGZvciBleHBsb2RlKSAqLworI2RlZmluZSBOX01BWCAyODggICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgY29kZXMgaW4gYW55IHNldCAqLworCisKK3Vuc2lnbmVkIGh1ZnRzOyAgICAgICAgIC8qIHRyYWNrIG1lbW9yeSB1c2FnZSAqLworCisKK2ludCBodWZ0X2J1aWxkKGIsIG4sIHMsIGQsIGUsIHQsIG0pCit1bnNpZ25lZCAqYjsgICAgICAgICAgICAvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAoYWxsIGFzc3VtZWQgPD0gQk1BWCkgKi8KK3Vuc2lnbmVkIG47ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyAoYXNzdW1lZCA8PSBOX01BWCkgKi8KK3Vuc2lnbmVkIHM7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzaW1wbGUtdmFsdWVkIGNvZGVzICgwLi5zLTEpICovCit1c2ggKmQ7ICAgICAgICAgICAgICAgICAvKiBsaXN0IG9mIGJhc2UgdmFsdWVzIGZvciBub24tc2ltcGxlIGNvZGVzICovCit1c2ggKmU7ICAgICAgICAgICAgICAgICAvKiBsaXN0IG9mIGV4dHJhIGJpdHMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KK3N0cnVjdCBodWZ0ICoqdDsgICAgICAgIC8qIHJlc3VsdDogc3RhcnRpbmcgdGFibGUgKi8KK2ludCAqbTsgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gbG9va3VwIGJpdHMsIHJldHVybnMgYWN0dWFsICovCisvKiBHaXZlbiBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGFuZCBhIG1heGltdW0gdGFibGUgc2l6ZSwgbWFrZSBhIHNldCBvZgorICAgdGFibGVzIHRvIGRlY29kZSB0aGF0IHNldCBvZiBjb2Rlcy4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9uZSBpZgorICAgdGhlIGdpdmVuIGNvZGUgc2V0IGlzIGluY29tcGxldGUgKHRoZSB0YWJsZXMgYXJlIHN0aWxsIGJ1aWx0IGluIHRoaXMKKyAgIGNhc2UpLCB0d28gaWYgdGhlIGlucHV0IGlzIGludmFsaWQgKGFsbCB6ZXJvIGxlbmd0aCBjb2RlcyBvciBhbgorICAgb3ZlcnN1YnNjcmliZWQgc2V0IG9mIGxlbmd0aHMpLCBhbmQgdGhyZWUgaWYgbm90IGVub3VnaCBtZW1vcnkuICovCit7CisgIHVuc2lnbmVkIGE7ICAgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXIgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCisgIHVuc2lnbmVkIGNbQk1BWCsxXTsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggY291bnQgdGFibGUgKi8KKyAgdW5zaWduZWQgZjsgICAgICAgICAgICAgICAgICAgLyogaSByZXBlYXRzIGluIHRhYmxlIGV2ZXJ5IGYgZW50cmllcyAqLworICBpbnQgZzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisgIGludCBoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGxldmVsICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGk7ICAgICAgICAgIC8qIGNvdW50ZXIsIGN1cnJlbnQgY29kZSAqLworICByZWdpc3RlciB1bnNpZ25lZCBqOyAgICAgICAgICAvKiBjb3VudGVyICovCisgIHJlZ2lzdGVyIGludCBrOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGN1cnJlbnQgY29kZSAqLworICBpbnQgbDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIHBlciB0YWJsZSAocmV0dXJuZWQgaW4gbSkgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgKnA7ICAgICAgICAgLyogcG9pbnRlciBpbnRvIGNbXSwgYltdLCBvciB2W10gKi8KKyAgcmVnaXN0ZXIgc3RydWN0IGh1ZnQgKnE7ICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUgKi8KKyAgc3RydWN0IGh1ZnQgcjsgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIHN0cnVjdHVyZSBhc3NpZ25tZW50ICovCisgIHN0cnVjdCBodWZ0ICp1W0JNQVhdOyAgICAgICAgIC8qIHRhYmxlIHN0YWNrICovCisgIHVuc2lnbmVkIHZbTl9NQVhdOyAgICAgICAgICAgIC8qIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RoICovCisgIHJlZ2lzdGVyIGludCB3OyAgICAgICAgICAgICAgIC8qIGJpdHMgYmVmb3JlIHRoaXMgdGFibGUgPT0gKGwgKiBoKSAqLworICB1bnNpZ25lZCB4W0JNQVgrMV07ICAgICAgICAgICAvKiBiaXQgb2Zmc2V0cywgdGhlbiBjb2RlIHN0YWNrICovCisgIHVuc2lnbmVkICp4cDsgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgaW50byB4ICovCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkdW1teSBjb2RlcyBhZGRlZCAqLworICB1bnNpZ25lZCB6OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBjdXJyZW50IHRhYmxlICovCisKKworICAvKiBHZW5lcmF0ZSBjb3VudHMgZm9yIGVhY2ggYml0IGxlbmd0aCAqLworICBtZW16ZXJvKGMsIHNpemVvZihjKSk7CisgIHAgPSBiOyAgaSA9IG47CisgIGRvIHsKKyAgICBUcmFjZWN2KCpwLCAoc3RkZXJyLCAobi1pID49ICcgJyAmJiBuLWkgPD0gJ34nID8gIiVjICVkXG4iIDogIjB4JXggJWRcbiIpLAorCSAgICBuLWksICpwKSk7CisgICAgY1sqcF0rKzsgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBhbGwgZW50cmllcyA8PSBCTUFYICovCisgICAgcCsrOyAgICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBjb21iaW5lIHdpdGggYWJvdmUgbGluZSAoU29sYXJpcyBidWcpICovCisgIH0gd2hpbGUgKC0taSk7CisgIGlmIChjWzBdID09IG4pICAgICAgICAgICAgICAgIC8qIG51bGwgaW5wdXQtLWFsbCB6ZXJvIGxlbmd0aCBjb2RlcyAqLworICB7CisgICAgKnQgPSAoc3RydWN0IGh1ZnQgKilOVUxMOworICAgICptID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KKyAgbCA9ICptOworICBmb3IgKGogPSAxOyBqIDw9IEJNQVg7IGorKykKKyAgICBpZiAoY1tqXSkKKyAgICAgIGJyZWFrOworICBrID0gajsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGNvZGUgbGVuZ3RoICovCisgIGlmICgodW5zaWduZWQpbCA8IGopCisgICAgbCA9IGo7CisgIGZvciAoaSA9IEJNQVg7IGk7IGktLSkKKyAgICBpZiAoY1tpXSkKKyAgICAgIGJyZWFrOworICBnID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisgIGlmICgodW5zaWduZWQpbCA+IGkpCisgICAgbCA9IGk7CisgICptID0gbDsKKworCisgIC8qIEFkanVzdCBsYXN0IGxlbmd0aCBjb3VudCB0byBmaWxsIG91dCBjb2RlcywgaWYgbmVlZGVkICovCisgIGZvciAoeSA9IDEgPDwgajsgaiA8IGk7IGorKywgeSA8PD0gMSkKKyAgICBpZiAoKHkgLT0gY1tqXSkgPCAwKQorICAgICAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAvKiBiYWQgaW5wdXQ6IG1vcmUgY29kZXMgdGhhbiBiaXRzICovCisgIGlmICgoeSAtPSBjW2ldKSA8IDApCisgICAgcmV0dXJuIDI7CisgIGNbaV0gKz0geTsKKworCisgIC8qIEdlbmVyYXRlIHN0YXJ0aW5nIG9mZnNldHMgaW50byB0aGUgdmFsdWUgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisgIHhbMV0gPSBqID0gMDsKKyAgcCA9IGMgKyAxOyAgeHAgPSB4ICsgMjsKKyAgd2hpbGUgKC0taSkgeyAgICAgICAgICAgICAgICAgLyogbm90ZSB0aGF0IGkgPT0gZyBmcm9tIGFib3ZlICovCisgICAgKnhwKysgPSAoaiArPSAqcCsrKTsKKyAgfQorCisKKyAgLyogTWFrZSBhIHRhYmxlIG9mIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RocyAqLworICBwID0gYjsgIGkgPSAwOworICBkbyB7CisgICAgaWYgKChqID0gKnArKykgIT0gMCkKKyAgICAgIHZbeFtqXSsrXSA9IGk7CisgIH0gd2hpbGUgKCsraSA8IG4pOworCisKKyAgLyogR2VuZXJhdGUgdGhlIEh1ZmZtYW4gY29kZXMgYW5kIGZvciBlYWNoLCBtYWtlIHRoZSB0YWJsZSBlbnRyaWVzICovCisgIHhbMF0gPSBpID0gMDsgICAgICAgICAgICAgICAgIC8qIGZpcnN0IEh1ZmZtYW4gY29kZSBpcyB6ZXJvICovCisgIHAgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYWIgdmFsdWVzIGluIGJpdCBvcmRlciAqLworICBoID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyB0YWJsZXMgeWV0LS1sZXZlbCAtMSAqLworICB3ID0gLWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIGRlY29kZWQgPT0gKGwgKiBoKSAqLworICB1WzBdID0gKHN0cnVjdCBodWZ0ICopTlVMTDsgICAvKiBqdXN0IHRvIGtlZXAgY29tcGlsZXJzIGhhcHB5ICovCisgIHEgPSAoc3RydWN0IGh1ZnQgKilOVUxMOyAgICAgIC8qIGRpdHRvICovCisgIHogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpdHRvICovCisKKyAgLyogZ28gdGhyb3VnaCB0aGUgYml0IGxlbmd0aHMgKGsgYWxyZWFkeSBpcyBiaXRzIGluIHNob3J0ZXN0IGNvZGUpICovCisgIGZvciAoOyBrIDw9IGc7IGsrKykKKyAgeworICAgIGEgPSBjW2tdOworICAgIHdoaWxlIChhLS0pCisgICAgeworICAgICAgLyogaGVyZSBpIGlzIHRoZSBIdWZmbWFuIGNvZGUgb2YgbGVuZ3RoIGsgYml0cyBmb3IgdmFsdWUgKnAgKi8KKyAgICAgIC8qIG1ha2UgdGFibGVzIHVwIHRvIHJlcXVpcmVkIGxldmVsICovCisgICAgICB3aGlsZSAoayA+IHcgKyBsKQorICAgICAgeworICAgICAgICBoKys7CisgICAgICAgIHcgKz0gbDsgICAgICAgICAgICAgICAgIC8qIHByZXZpb3VzIHRhYmxlIGFsd2F5cyBsIGJpdHMgKi8KKworICAgICAgICAvKiBjb21wdXRlIG1pbmltdW0gc2l6ZSB0YWJsZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbCBiaXRzICovCisgICAgICAgIHogPSAoeiA9IGcgLSB3KSA+ICh1bnNpZ25lZClsID8gKHVuc2lnbmVkKWwgOiB6OyAgLyogdXBwZXIgbGltaXQgb24gdGFibGUgc2l6ZSAqLworICAgICAgICBpZiAoKGYgPSAxIDw8IChqID0gayAtIHcpKSA+IGEgKyAxKSAgICAgLyogdHJ5IGEgay13IGJpdCB0YWJsZSAqLworICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gZmV3IGNvZGVzIGZvciBrLXcgYml0IHRhYmxlICovCisgICAgICAgICAgZiAtPSBhICsgMTsgICAgICAgICAgIC8qIGRlZHVjdCBjb2RlcyBmcm9tIHBhdHRlcm5zIGxlZnQgKi8KKyAgICAgICAgICB4cCA9IGMgKyBrOworICAgICAgICAgIHdoaWxlICgrK2ogPCB6KSAgICAgICAvKiB0cnkgc21hbGxlciB0YWJsZXMgdXAgdG8geiBiaXRzICovCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKChmIDw8PSAxKSA8PSAqKyt4cCkKKyAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgLyogZW5vdWdoIGNvZGVzIHRvIHVzZSB1cCBqIGJpdHMgKi8KKyAgICAgICAgICAgIGYgLT0gKnhwOyAgICAgICAgICAgLyogZWxzZSBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyAqLworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB6ID0gMSA8PCBqOyAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyaWVzIGZvciBqLWJpdCB0YWJsZSAqLworCisgICAgICAgIC8qIGFsbG9jYXRlIGFuZCBsaW5rIGluIG5ldyB0YWJsZSAqLworICAgICAgICBpZiAoKHEgPSAoc3RydWN0IGh1ZnQgKiltYWxsb2MoKHogKyAxKSpzaXplb2Yoc3RydWN0IGh1ZnQpKSkgPT0KKyAgICAgICAgICAgIChzdHJ1Y3QgaHVmdCAqKU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaCkKKyAgICAgICAgICAgIGh1ZnRfZnJlZSh1WzBdKTsKKyAgICAgICAgICByZXR1cm4gMzsgICAgICAgICAgICAgLyogbm90IGVub3VnaCBtZW1vcnkgKi8KKyAgICAgICAgfQorICAgICAgICBodWZ0cyArPSB6ICsgMTsgICAgICAgICAvKiB0cmFjayBtZW1vcnkgdXNhZ2UgKi8KKyAgICAgICAgKnQgPSBxICsgMTsgICAgICAgICAgICAgLyogbGluayB0byBsaXN0IGZvciBodWZ0X2ZyZWUoKSAqLworICAgICAgICAqKHQgPSAmKHEtPnYudCkpID0gKHN0cnVjdCBodWZ0ICopTlVMTDsKKyAgICAgICAgdVtoXSA9ICsrcTsgICAgICAgICAgICAgLyogdGFibGUgc3RhcnRzIGFmdGVyIGxpbmsgKi8KKworICAgICAgICAvKiBjb25uZWN0IHRvIGxhc3QgdGFibGUsIGlmIHRoZXJlIGlzIG9uZSAqLworICAgICAgICBpZiAoaCkKKyAgICAgICAgeworICAgICAgICAgIHhbaF0gPSBpOyAgICAgICAgICAgICAvKiBzYXZlIHBhdHRlcm4gZm9yIGJhY2tpbmcgdXAgKi8KKyAgICAgICAgICByLmIgPSAodWNoKWw7ICAgICAgICAgLyogYml0cyB0byBkdW1wIGJlZm9yZSB0aGlzIHRhYmxlICovCisgICAgICAgICAgci5lID0gKHVjaCkoMTYgKyBqKTsgIC8qIGJpdHMgaW4gdGhpcyB0YWJsZSAqLworICAgICAgICAgIHIudi50ID0gcTsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoaXMgdGFibGUgKi8KKyAgICAgICAgICBqID0gaSA+PiAodyAtIGwpOyAgICAgLyogKGdldCBhcm91bmQgVHVyYm8gQyBidWcpICovCisgICAgICAgICAgdVtoLTFdW2pdID0gcjsgICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSAqLworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIHNldCB1cCB0YWJsZSBlbnRyeSBpbiByICovCisgICAgICByLmIgPSAodWNoKShrIC0gdyk7CisgICAgICBpZiAocCA+PSB2ICsgbikKKyAgICAgICAgci5lID0gOTk7ICAgICAgICAgICAgICAgLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCisgICAgICBlbHNlIGlmICgqcCA8IHMpCisgICAgICB7CisgICAgICAgIHIuZSA9ICh1Y2gpKCpwIDwgMjU2ID8gMTYgOiAxNSk7ICAgIC8qIDI1NiBpcyBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgICAgICByLnYubiA9ICh1c2gpKCpwKTsgICAgICAgICAgICAgLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KKwlwKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25lIGNvbXBpbGVyIGRvZXMgbm90IGxpa2UgKnArKyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByLmUgPSAodWNoKWVbKnAgLSBzXTsgICAvKiBub24tc2ltcGxlLS1sb29rIHVwIGluIGxpc3RzICovCisgICAgICAgIHIudi5uID0gZFsqcCsrIC0gc107CisgICAgICB9CisKKyAgICAgIC8qIGZpbGwgY29kZS1saWtlIGVudHJpZXMgd2l0aCByICovCisgICAgICBmID0gMSA8PCAoayAtIHcpOworICAgICAgZm9yIChqID0gaSA+PiB3OyBqIDwgejsgaiArPSBmKQorICAgICAgICBxW2pdID0gcjsKKworICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgay1iaXQgY29kZSBpICovCisgICAgICBmb3IgKGogPSAxIDw8IChrIC0gMSk7IGkgJiBqOyBqID4+PSAxKQorICAgICAgICBpIF49IGo7CisgICAgICBpIF49IGo7CisKKyAgICAgIC8qIGJhY2t1cCBvdmVyIGZpbmlzaGVkIHRhYmxlcyAqLworICAgICAgd2hpbGUgKChpICYgKCgxIDw8IHcpIC0gMSkpICE9IHhbaF0pCisgICAgICB7CisgICAgICAgIGgtLTsgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gdXBkYXRlIHEgKi8KKyAgICAgICAgdyAtPSBsOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyogUmV0dXJuIHRydWUgKDEpIGlmIHdlIHdlcmUgZ2l2ZW4gYW4gaW5jb21wbGV0ZSB0YWJsZSAqLworICByZXR1cm4geSAhPSAwICYmIGcgIT0gMTsKK30KKworCisKK2ludCBodWZ0X2ZyZWUodCkKK3N0cnVjdCBodWZ0ICp0OyAgICAgICAgIC8qIHRhYmxlIHRvIGZyZWUgKi8KKy8qIEZyZWUgdGhlIG1hbGxvYydlZCB0YWJsZXMgYnVpbHQgYnkgaHVmdF9idWlsZCgpLCB3aGljaCBtYWtlcyBhIGxpbmtlZAorICAgbGlzdCBvZiB0aGUgdGFibGVzIGl0IG1hZGUsIHdpdGggdGhlIGxpbmtzIGluIGEgZHVtbXkgZmlyc3QgZW50cnkgb2YKKyAgIGVhY2ggdGFibGUuICovCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBodWZ0ICpwLCAqcTsKKworCisgIC8qIEdvIHRocm91Z2ggbGlua2VkIGxpc3QsIGZyZWVpbmcgZnJvbSB0aGUgbWFsbG9jZWQgKHRbLTFdKSBhZGRyZXNzLiAqLworICBwID0gdDsKKyAgd2hpbGUgKHAgIT0gKHN0cnVjdCBodWZ0ICopTlVMTCkKKyAgeworICAgIHEgPSAoLS1wKS0+di50OworICAgIGZyZWUoKGNoYXIqKXApOworICAgIHAgPSBxOworICB9CisgIHJldHVybiAwOworfQorCisKK2ludCBpbmZsYXRlX2NvZGVzKHRsLCB0ZCwgYmwsIGJkKQorc3RydWN0IGh1ZnQgKnRsLCAqdGQ7ICAgLyogbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kZXIgdGFibGVzICovCitpbnQgYmwsIGJkOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBkZWNvZGVkIGJ5IHRsW10gYW5kIHRkW10gKi8KKy8qIGluZmxhdGUgKGRlY29tcHJlc3MpIHRoZSBjb2RlcyBpbiBhIGRlZmxhdGVkIChjb21wcmVzc2VkKSBibG9jay4KKyAgIFJldHVybiBhbiBlcnJvciBjb2RlIG9yIHplcm8gaWYgaXQgYWxsIGdvZXMgb2suICovCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGU7ICAvKiB0YWJsZSBlbnRyeSBmbGFnL251bWJlciBvZiBleHRyYSBiaXRzICovCisgIHVuc2lnbmVkIG4sIGQ7ICAgICAgICAvKiBsZW5ndGggYW5kIGluZGV4IGZvciBjb3B5ICovCisgIHVuc2lnbmVkIHc7ICAgICAgICAgICAvKiBjdXJyZW50IHdpbmRvdyBwb3NpdGlvbiAqLworICBzdHJ1Y3QgaHVmdCAqdDsgICAgICAgLyogcG9pbnRlciB0byB0YWJsZSBlbnRyeSAqLworICB1bnNpZ25lZCBtbCwgbWQ7ICAgICAgLyogbWFza3MgZm9yIGJsIGFuZCBiZCBiaXRzICovCisgIHJlZ2lzdGVyIHVsZyBiOyAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGs7ICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKworICAvKiBtYWtlIGxvY2FsIGNvcGllcyBvZiBnbG9iYWxzICovCisgIGIgPSBiYjsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgYml0IGJ1ZmZlciAqLworICBrID0gYms7CisgIHcgPSB3cDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgd2luZG93IHBvc2l0aW9uICovCisKKyAgLyogaW5mbGF0ZSB0aGUgY29kZWQgZGF0YSAqLworICBtbCA9IG1hc2tfYml0c1tibF07ICAgICAgICAgICAvKiBwcmVjb21wdXRlIG1hc2tzIGZvciBzcGVlZCAqLworICBtZCA9IG1hc2tfYml0c1tiZF07CisgIGZvciAoOzspICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIHVudGlsIGVuZCBvZiBibG9jayAqLworICB7CisgICAgTkVFREJJVFMoKHVuc2lnbmVkKWJsKQorICAgIGlmICgoZSA9ICh0ID0gdGwgKyAoKHVuc2lnbmVkKWIgJiBtbCkpLT5lKSA+IDE2KQorICAgICAgZG8geworICAgICAgICBpZiAoZSA9PSA5OSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgRFVNUEJJVFModC0+YikKKyAgICAgICAgZSAtPSAxNjsKKyAgICAgICAgTkVFREJJVFMoZSkKKyAgICAgIH0gd2hpbGUgKChlID0gKHQgPSB0LT52LnQgKyAoKHVuc2lnbmVkKWIgJiBtYXNrX2JpdHNbZV0pKS0+ZSkgPiAxNik7CisgICAgRFVNUEJJVFModC0+YikKKyAgICBpZiAoZSA9PSAxNikgICAgICAgICAgICAgICAgLyogdGhlbiBpdCdzIGEgbGl0ZXJhbCAqLworICAgIHsKKyAgICAgIHNsaWRlW3crK10gPSAodWNoKXQtPnYubjsKKyAgICAgIFRyYWNldnYoKHN0ZGVyciwgIiVjIiwgc2xpZGVbdy0xXSkpOworICAgICAgaWYgKHcgPT0gV1NJWkUpCisgICAgICB7CisgICAgICAgIGZsdXNoX291dHB1dCh3KTsKKyAgICAgICAgdyA9IDA7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBpdCdzIGFuIEVPQiBvciBhIGxlbmd0aCAqLworICAgIHsKKyAgICAgIC8qIGV4aXQgaWYgZW5kIG9mIGJsb2NrICovCisgICAgICBpZiAoZSA9PSAxNSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGdldCBsZW5ndGggb2YgYmxvY2sgdG8gY29weSAqLworICAgICAgTkVFREJJVFMoZSkKKyAgICAgIG4gPSB0LT52Lm4gKyAoKHVuc2lnbmVkKWIgJiBtYXNrX2JpdHNbZV0pOworICAgICAgRFVNUEJJVFMoZSk7CisKKyAgICAgIC8qIGRlY29kZSBkaXN0YW5jZSBvZiBibG9jayB0byBjb3B5ICovCisgICAgICBORUVEQklUUygodW5zaWduZWQpYmQpCisgICAgICBpZiAoKGUgPSAodCA9IHRkICsgKCh1bnNpZ25lZCliICYgbWQpKS0+ZSkgPiAxNikKKyAgICAgICAgZG8geworICAgICAgICAgIGlmIChlID09IDk5KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgRFVNUEJJVFModC0+YikKKyAgICAgICAgICBlIC09IDE2OworICAgICAgICAgIE5FRURCSVRTKGUpCisgICAgICAgIH0gd2hpbGUgKChlID0gKHQgPSB0LT52LnQgKyAoKHVuc2lnbmVkKWIgJiBtYXNrX2JpdHNbZV0pKS0+ZSkgPiAxNik7CisgICAgICBEVU1QQklUUyh0LT5iKQorICAgICAgTkVFREJJVFMoZSkKKyAgICAgIGQgPSB3IC0gdC0+di5uIC0gKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKTsKKyAgICAgIERVTVBCSVRTKGUpCisgICAgICBUcmFjZXZ2KChzdGRlcnIsIlxcWyVkLCVkXSIsIHctZCwgbikpOworCisgICAgICAvKiBkbyB0aGUgY29weSAqLworICAgICAgZG8geworICAgICAgICBuIC09IChlID0gKGUgPSBXU0laRSAtICgoZCAmPSBXU0laRS0xKSA+IHcgPyBkIDogdykpID4gbiA/IG4gOiBlKTsKKyNpZiAhZGVmaW5lZChOT01FTUNQWSkgJiYgIWRlZmluZWQoREVCVUcpCisgICAgICAgIGlmICh3IC0gZCA+PSBlKSAgICAgICAgIC8qICh0aGlzIHRlc3QgYXNzdW1lcyB1bnNpZ25lZCBjb21wYXJpc29uKSAqLworICAgICAgICB7CisgICAgICAgICAgbWVtY3B5KHNsaWRlICsgdywgc2xpZGUgKyBkLCBlKTsKKyAgICAgICAgICB3ICs9IGU7CisgICAgICAgICAgZCArPSBlOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgLyogZG8gaXQgc2xvdyB0byBhdm9pZCBtZW1jcHkoKSBvdmVybGFwICovCisjZW5kaWYgLyogIU5PTUVNQ1BZICovCisgICAgICAgICAgZG8geworICAgICAgICAgICAgc2xpZGVbdysrXSA9IHNsaWRlW2QrK107CisJICAgIFRyYWNldnYoKHN0ZGVyciwgIiVjIiwgc2xpZGVbdy0xXSkpOworICAgICAgICAgIH0gd2hpbGUgKC0tZSk7CisgICAgICAgIGlmICh3ID09IFdTSVpFKQorICAgICAgICB7CisgICAgICAgICAgZmx1c2hfb3V0cHV0KHcpOworICAgICAgICAgIHcgPSAwOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChuKTsKKyAgICB9CisgIH0KKworCisgIC8qIHJlc3RvcmUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgbG9jYWxzICovCisgIHdwID0gdzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgZ2xvYmFsIHdpbmRvdyBwb2ludGVyICovCisgIGJiID0gYjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKyAgYmsgPSBrOworCisgIC8qIGRvbmUgKi8KKyAgcmV0dXJuIDA7Cit9CisKKworCitpbnQgaW5mbGF0ZV9zdG9yZWQoKQorLyogImRlY29tcHJlc3MiIGFuIGluZmxhdGVkIHR5cGUgMCAoc3RvcmVkKSBibG9jay4gKi8KK3sKKyAgdW5zaWduZWQgbjsgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBpbiBibG9jayAqLworICB1bnNpZ25lZCB3OyAgICAgICAgICAgLyogY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KKyAgcmVnaXN0ZXIgdWxnIGI7ICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgazsgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworCisgIC8qIG1ha2UgbG9jYWwgY29waWVzIG9mIGdsb2JhbHMgKi8KKyAgYiA9IGJiOyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBiaXQgYnVmZmVyICovCisgIGsgPSBiazsKKyAgdyA9IHdwOyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSB3aW5kb3cgcG9zaXRpb24gKi8KKworCisgIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi8KKyAgbiA9IGsgJiA3OworICBEVU1QQklUUyhuKTsKKworCisgIC8qIGdldCB0aGUgbGVuZ3RoIGFuZCBpdHMgY29tcGxlbWVudCAqLworICBORUVEQklUUygxNikKKyAgbiA9ICgodW5zaWduZWQpYiAmIDB4ZmZmZik7CisgIERVTVBCSVRTKDE2KQorICBORUVEQklUUygxNikKKyAgaWYgKG4gIT0gKHVuc2lnbmVkKSgofmIpICYgMHhmZmZmKSkKKyAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgLyogZXJyb3IgaW4gY29tcHJlc3NlZCBkYXRhICovCisgIERVTVBCSVRTKDE2KQorCisKKyAgLyogcmVhZCBhbmQgb3V0cHV0IHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KKyAgd2hpbGUgKG4tLSkKKyAgeworICAgIE5FRURCSVRTKDgpCisgICAgc2xpZGVbdysrXSA9ICh1Y2gpYjsKKyAgICBpZiAodyA9PSBXU0laRSkKKyAgICB7CisgICAgICBmbHVzaF9vdXRwdXQodyk7CisgICAgICB3ID0gMDsKKyAgICB9CisgICAgRFVNUEJJVFMoOCkKKyAgfQorCisKKyAgLyogcmVzdG9yZSB0aGUgZ2xvYmFscyBmcm9tIHRoZSBsb2NhbHMgKi8KKyAgd3AgPSB3OyAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBnbG9iYWwgd2luZG93IHBvaW50ZXIgKi8KKyAgYmIgPSBiOyAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworICBiayA9IGs7CisgIHJldHVybiAwOworfQorCisKKworaW50IGluZmxhdGVfZml4ZWQoKQorLyogZGVjb21wcmVzcyBhbiBpbmZsYXRlZCB0eXBlIDEgKGZpeGVkIEh1ZmZtYW4gY29kZXMpIGJsb2NrLiAgV2Ugc2hvdWxkCisgICBlaXRoZXIgcmVwbGFjZSB0aGlzIHdpdGggYSBjdXN0b20gZGVjb2Rlciwgb3IgYXQgbGVhc3QgcHJlY29tcHV0ZSB0aGUKKyAgIEh1ZmZtYW4gdGFibGVzLiAqLworeworICBpbnQgaTsgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisgIHN0cnVjdCBodWZ0ICp0bDsgICAgICAvKiBsaXRlcmFsL2xlbmd0aCBjb2RlIHRhYmxlICovCisgIHN0cnVjdCBodWZ0ICp0ZDsgICAgICAvKiBkaXN0YW5jZSBjb2RlIHRhYmxlICovCisgIGludCBibDsgICAgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGwgKi8KKyAgaW50IGJkOyAgICAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0ZCAqLworICB1bnNpZ25lZCBsWzI4OF07ICAgICAgLyogbGVuZ3RoIGxpc3QgZm9yIGh1ZnRfYnVpbGQgKi8KKworCisgIC8qIHNldCB1cCBsaXRlcmFsIHRhYmxlICovCisgIGZvciAoaSA9IDA7IGkgPCAxNDQ7IGkrKykKKyAgICBsW2ldID0gODsKKyAgZm9yICg7IGkgPCAyNTY7IGkrKykKKyAgICBsW2ldID0gOTsKKyAgZm9yICg7IGkgPCAyODA7IGkrKykKKyAgICBsW2ldID0gNzsKKyAgZm9yICg7IGkgPCAyODg7IGkrKykgICAgICAgICAgLyogbWFrZSBhIGNvbXBsZXRlLCBidXQgd3JvbmcgY29kZSBzZXQgKi8KKyAgICBsW2ldID0gODsKKyAgYmwgPSA3OworICBpZiAoKGkgPSBodWZ0X2J1aWxkKGwsIDI4OCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgJnRsLCAmYmwpKSAhPSAwKQorICAgIHJldHVybiBpOworCisKKyAgLyogc2V0IHVwIGRpc3RhbmNlIHRhYmxlICovCisgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSAgICAgIC8qIG1ha2UgYW4gaW5jb21wbGV0ZSBjb2RlIHNldCAqLworICAgIGxbaV0gPSA1OworICBiZCA9IDU7CisgIGlmICgoaSA9IGh1ZnRfYnVpbGQobCwgMzAsIDAsIGNwZGlzdCwgY3BkZXh0LCAmdGQsICZiZCkpID4gMSkKKyAgeworICAgIGh1ZnRfZnJlZSh0bCk7CisgICAgcmV0dXJuIGk7CisgIH0KKworCisgIC8qIGRlY29tcHJlc3MgdW50aWwgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgaWYgKGluZmxhdGVfY29kZXModGwsIHRkLCBibCwgYmQpKQorICAgIHJldHVybiAxOworCisKKyAgLyogZnJlZSB0aGUgZGVjb2RpbmcgdGFibGVzLCByZXR1cm4gKi8KKyAgaHVmdF9mcmVlKHRsKTsKKyAgaHVmdF9mcmVlKHRkKTsKKyAgcmV0dXJuIDA7Cit9CisKKworCitpbnQgaW5mbGF0ZV9keW5hbWljKCkKKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgdHlwZSAyIChkeW5hbWljIEh1ZmZtYW4gY29kZXMpIGJsb2NrLiAqLworeworICBpbnQgaTsgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLworICB1bnNpZ25lZCBqOworICB1bnNpZ25lZCBsOyAgICAgICAgICAgLyogbGFzdCBsZW5ndGggKi8KKyAgdW5zaWduZWQgbTsgICAgICAgICAgIC8qIG1hc2sgZm9yIGJpdCBsZW5ndGhzIHRhYmxlICovCisgIHVuc2lnbmVkIG47ICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RocyB0byBnZXQgKi8KKyAgc3RydWN0IGh1ZnQgKnRsOyAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIGNvZGUgdGFibGUgKi8KKyAgc3RydWN0IGh1ZnQgKnRkOyAgICAgIC8qIGRpc3RhbmNlIGNvZGUgdGFibGUgKi8KKyAgaW50IGJsOyAgICAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0bCAqLworICBpbnQgYmQ7ICAgICAgICAgICAgICAgLyogbG9va3VwIGJpdHMgZm9yIHRkICovCisgIHVuc2lnbmVkIG5iOyAgICAgICAgICAvKiBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyAqLworICB1bnNpZ25lZCBubDsgICAgICAgICAgLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisgIHVuc2lnbmVkIG5kOyAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorICB1bnNpZ25lZCBsbFsyODgrMzJdOyAgLyogbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworI2Vsc2UKKyAgdW5zaWduZWQgbGxbMjg2KzMwXTsgIC8qIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyNlbmRpZgorICByZWdpc3RlciB1bGcgYjsgICAgICAgLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOyAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisKKyAgLyogbWFrZSBsb2NhbCBiaXQgYnVmZmVyICovCisgIGIgPSBiYjsKKyAgayA9IGJrOworCisKKyAgLyogcmVhZCBpbiB0YWJsZSBsZW5ndGhzICovCisgIE5FRURCSVRTKDUpCisgIG5sID0gMjU3ICsgKCh1bnNpZ25lZCliICYgMHgxZik7ICAgICAgLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisgIERVTVBCSVRTKDUpCisgIE5FRURCSVRTKDUpCisgIG5kID0gMSArICgodW5zaWduZWQpYiAmIDB4MWYpOyAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisgIERVTVBCSVRTKDUpCisgIE5FRURCSVRTKDQpCisgIG5iID0gNCArICgodW5zaWduZWQpYiAmIDB4Zik7ICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgKi8KKyAgRFVNUEJJVFMoNCkKKyNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorICBpZiAobmwgPiAyODggfHwgbmQgPiAzMikKKyNlbHNlCisgIGlmIChubCA+IDI4NiB8fCBuZCA+IDMwKQorI2VuZGlmCisgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgIC8qIGJhZCBsZW5ndGhzICovCisKKworICAvKiByZWFkIGluIGJpdC1sZW5ndGgtY29kZSBsZW5ndGhzICovCisgIGZvciAoaiA9IDA7IGogPCBuYjsgaisrKQorICB7CisgICAgTkVFREJJVFMoMykKKyAgICBsbFtib3JkZXJbal1dID0gKHVuc2lnbmVkKWIgJiA3OworICAgIERVTVBCSVRTKDMpCisgIH0KKyAgZm9yICg7IGogPCAxOTsgaisrKQorICAgIGxsW2JvcmRlcltqXV0gPSAwOworCisKKyAgLyogYnVpbGQgZGVjb2RpbmcgdGFibGUgZm9yIHRyZWVzLS1zaW5nbGUgbGV2ZWwsIDcgYml0IGxvb2t1cCAqLworICBibCA9IDc7CisgIGlmICgoaSA9IGh1ZnRfYnVpbGQobGwsIDE5LCAxOSwgTlVMTCwgTlVMTCwgJnRsLCAmYmwpKSAhPSAwKQorICB7CisgICAgaWYgKGkgPT0gMSkKKyAgICAgIGh1ZnRfZnJlZSh0bCk7CisgICAgcmV0dXJuIGk7ICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgY29kZSBzZXQgKi8KKyAgfQorCisKKyAgLyogcmVhZCBpbiBsaXRlcmFsIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgbiA9IG5sICsgbmQ7CisgIG0gPSBtYXNrX2JpdHNbYmxdOworICBpID0gbCA9IDA7CisgIHdoaWxlICgodW5zaWduZWQpaSA8IG4pCisgIHsKKyAgICBORUVEQklUUygodW5zaWduZWQpYmwpCisgICAgaiA9ICh0ZCA9IHRsICsgKCh1bnNpZ25lZCliICYgbSkpLT5iOworICAgIERVTVBCSVRTKGopCisgICAgaiA9IHRkLT52Lm47CisgICAgaWYgKGogPCAxNikgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjb2RlIGluIGJpdHMgKDAuLjE1KSAqLworICAgICAgbGxbaSsrXSA9IGwgPSBqOyAgICAgICAgICAvKiBzYXZlIGxhc3QgbGVuZ3RoIGluIGwgKi8KKyAgICBlbHNlIGlmIChqID09IDE2KSAgICAgICAgICAgLyogcmVwZWF0IGxhc3QgbGVuZ3RoIDMgdG8gNiB0aW1lcyAqLworICAgIHsKKyAgICAgIE5FRURCSVRTKDIpCisgICAgICBqID0gMyArICgodW5zaWduZWQpYiAmIDMpOworICAgICAgRFVNUEJJVFMoMikKKyAgICAgIGlmICgodW5zaWduZWQpaSArIGogPiBuKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIGxsW2krK10gPSBsOworICAgIH0KKyAgICBlbHNlIGlmIChqID09IDE3KSAgICAgICAgICAgLyogMyB0byAxMCB6ZXJvIGxlbmd0aCBjb2RlcyAqLworICAgIHsKKyAgICAgIE5FRURCSVRTKDMpCisgICAgICBqID0gMyArICgodW5zaWduZWQpYiAmIDcpOworICAgICAgRFVNUEJJVFMoMykKKyAgICAgIGlmICgodW5zaWduZWQpaSArIGogPiBuKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIGxsW2krK10gPSAwOworICAgICAgbCA9IDA7CisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBqID09IDE4OiAxMSB0byAxMzggemVybyBsZW5ndGggY29kZXMgKi8KKyAgICB7CisgICAgICBORUVEQklUUyg3KQorICAgICAgaiA9IDExICsgKCh1bnNpZ25lZCliICYgMHg3Zik7CisgICAgICBEVU1QQklUUyg3KQorICAgICAgaWYgKCh1bnNpZ25lZClpICsgaiA+IG4pCisgICAgICAgIHJldHVybiAxOworICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgbGxbaSsrXSA9IDA7CisgICAgICBsID0gMDsKKyAgICB9CisgIH0KKworCisgIC8qIGZyZWUgZGVjb2RpbmcgdGFibGUgZm9yIHRyZWVzICovCisgIGh1ZnRfZnJlZSh0bCk7CisKKworICAvKiByZXN0b3JlIHRoZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworICBiYiA9IGI7CisgIGJrID0gazsKKworCisgIC8qIGJ1aWxkIHRoZSBkZWNvZGluZyB0YWJsZXMgZm9yIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcyAqLworICBibCA9IGxiaXRzOworICBpZiAoKGkgPSBodWZ0X2J1aWxkKGxsLCBubCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgJnRsLCAmYmwpKSAhPSAwKQorICB7CisgICAgaWYgKGkgPT0gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIgaW5jb21wbGV0ZSBsaXRlcmFsIHRyZWVcbiIpOworICAgICAgaHVmdF9mcmVlKHRsKTsKKyAgICB9CisgICAgcmV0dXJuIGk7ICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgY29kZSBzZXQgKi8KKyAgfQorICBiZCA9IGRiaXRzOworICBpZiAoKGkgPSBodWZ0X2J1aWxkKGxsICsgbmwsIG5kLCAwLCBjcGRpc3QsIGNwZGV4dCwgJnRkLCAmYmQpKSAhPSAwKQorICB7CisgICAgaWYgKGkgPT0gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIgaW5jb21wbGV0ZSBkaXN0YW5jZSB0cmVlXG4iKTsKKyNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAorICAgICAgaSA9IDA7CisgICAgfQorI2Vsc2UKKyAgICAgIGh1ZnRfZnJlZSh0ZCk7CisgICAgfQorICAgIGh1ZnRfZnJlZSh0bCk7CisgICAgcmV0dXJuIGk7ICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgY29kZSBzZXQgKi8KKyNlbmRpZgorICB9CisKKworICAvKiBkZWNvbXByZXNzIHVudGlsIGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChpbmZsYXRlX2NvZGVzKHRsLCB0ZCwgYmwsIGJkKSkKKyAgICByZXR1cm4gMTsKKworCisgIC8qIGZyZWUgdGhlIGRlY29kaW5nIHRhYmxlcywgcmV0dXJuICovCisgIGh1ZnRfZnJlZSh0bCk7CisgIGh1ZnRfZnJlZSh0ZCk7CisgIHJldHVybiAwOworfQorCisKKworaW50IGluZmxhdGVfYmxvY2soZSkKK2ludCAqZTsgICAgICAgICAgICAgICAgIC8qIGxhc3QgYmxvY2sgZmxhZyAqLworLyogZGVjb21wcmVzcyBhbiBpbmZsYXRlZCBibG9jayAqLworeworICB1bnNpZ25lZCB0OyAgICAgICAgICAgLyogYmxvY2sgdHlwZSAqLworICByZWdpc3RlciB1bGcgYjsgICAgICAgLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOyAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisKKyAgLyogbWFrZSBsb2NhbCBiaXQgYnVmZmVyICovCisgIGIgPSBiYjsKKyAgayA9IGJrOworCisKKyAgLyogcmVhZCBpbiBsYXN0IGJsb2NrIGJpdCAqLworICBORUVEQklUUygxKQorICAqZSA9IChpbnQpYiAmIDE7CisgIERVTVBCSVRTKDEpCisKKworICAvKiByZWFkIGluIGJsb2NrIHR5cGUgKi8KKyAgTkVFREJJVFMoMikKKyAgdCA9ICh1bnNpZ25lZCliICYgMzsKKyAgRFVNUEJJVFMoMikKKworCisgIC8qIHJlc3RvcmUgdGhlIGdsb2JhbCBiaXQgYnVmZmVyICovCisgIGJiID0gYjsKKyAgYmsgPSBrOworCisKKyAgLyogaW5mbGF0ZSB0aGF0IGJsb2NrIHR5cGUgKi8KKyAgaWYgKHQgPT0gMikKKyAgICByZXR1cm4gaW5mbGF0ZV9keW5hbWljKCk7CisgIGlmICh0ID09IDApCisgICAgcmV0dXJuIGluZmxhdGVfc3RvcmVkKCk7CisgIGlmICh0ID09IDEpCisgICAgcmV0dXJuIGluZmxhdGVfZml4ZWQoKTsKKworCisgIC8qIGJhZCBibG9jayB0eXBlICovCisgIHJldHVybiAyOworfQorCisKKworaW50IGluZmxhdGUoKQorLyogZGVjb21wcmVzcyBhbiBpbmZsYXRlZCBlbnRyeSAqLworeworICBpbnQgZTsgICAgICAgICAgICAgICAgLyogbGFzdCBibG9jayBmbGFnICovCisgIGludCByOyAgICAgICAgICAgICAgICAvKiByZXN1bHQgY29kZSAqLworICB1bnNpZ25lZCBoOyAgICAgICAgICAgLyogbWF4aW11bSBzdHJ1Y3QgaHVmdCdzIG1hbGxvYydlZCAqLworCisKKyAgLyogaW5pdGlhbGl6ZSB3aW5kb3csIGJpdCBidWZmZXIgKi8KKyAgd3AgPSAwOworICBiayA9IDA7CisgIGJiID0gMDsKKworCisgIC8qIGRlY29tcHJlc3MgdW50aWwgdGhlIGxhc3QgYmxvY2sgKi8KKyAgaCA9IDA7CisgIGRvIHsKKyAgICBodWZ0cyA9IDA7CisgICAgaWYgKChyID0gaW5mbGF0ZV9ibG9jaygmZSkpICE9IDApCisgICAgICByZXR1cm4gcjsKKyAgICBpZiAoaHVmdHMgPiBoKQorICAgICAgaCA9IGh1ZnRzOworICB9IHdoaWxlICghZSk7CisKKyAgLyogVW5kbyB0b28gbXVjaCBsb29rYWhlYWQuIFRoZSBuZXh0IHJlYWQgd2lsbCBiZSBieXRlIGFsaWduZWQgc28gd2UKKyAgICogY2FuIGRpc2NhcmQgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgbWVhbmluZ2Z1bCBieXRlLgorICAgKi8KKyAgd2hpbGUgKGJrID49IDgpIHsKKyAgICBiayAtPSA4OworICAgIGlucHRyLS07CisgIH0KKworICAvKiBmbHVzaCBvdXQgc2xpZGUgKi8KKyAgZmx1c2hfb3V0cHV0KHdwKTsKKworCisgIC8qIHJldHVybiBzdWNjZXNzICovCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICI8JXU+ICIsIGgpOworI2VuZGlmIC8qIERFQlVHICovCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvcmV2aXNpb24uaCBiL3Vzci9nemlwL3JldmlzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2MDIwYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL3JldmlzaW9uLmgKQEAgLTAsMCArMSwxMSBAQAorLyogcmV2aXNpb24uaCAtLSBkZWZpbmUgdGhlIHZlcnNpb24gbnVtYmVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5LgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisjZGVmaW5lIFZFUlNJT04gIjEuMi40IgorI2RlZmluZSBQQVRDSExFVkVMIDAKKyNkZWZpbmUgUkVWREFURSAiMTggQXVnIDkzIgorCisvKiAkSWQ6IHJldmlzaW9uLmgsdiAxLjEgMjAwMi8wOC8xOCAwMDo1OToyMSBocGEgRXhwICQgKi8KZGlmZiAtLWdpdCBhL3Vzci9nemlwL3RhaWxvci5oIGIvdXNyL2d6aXAvdGFpbG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5ZTU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL3RhaWxvci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIHRhaWxvci5oIC0tIHRhcmdldCBkZXBlbmRlbnQgZGVmaW5pdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkuCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKy8qIFRoZSB0YXJnZXQgZGVwZW5kZW50IGRlZmluaXRpb25zIHNob3VsZCBiZSBkZWZpbmVkIGhlcmUgb25seS4KKyAqIFRoZSB0YXJnZXQgZGVwZW5kZW50IGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0YWlsb3IuYy4KKyAqLworCisvKiAkSWQ6IHRhaWxvci5oLHYgMS4xIDIwMDIvMDgvMTggMDA6NTk6MjEgaHBhIEV4cCAkICovCisKKwkvKiBDb21tb24gZGVmYXVsdHMgKi8KKworI2lmbmRlZiBPU19DT0RFCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMyAgLyogYXNzdW1lIFVuaXggKi8KKyNlbmRpZgorCisjZGVmaW5lIFBBVEhfU0VQICcvJworCisjaWZuZGVmIGNhc2VtYXAKKyMgIGRlZmluZSBjYXNlbWFwKGMpIChjKQorI2VuZGlmCisKKyNpZm5kZWYgT1BUSU9OU19WQVIKKyMgIGRlZmluZSBPUFRJT05TX1ZBUiAiR1pJUCIKKyNlbmRpZgorCisjaWZuZGVmIFpfU1VGRklYCisjICBkZWZpbmUgWl9TVUZGSVggIi5neiIKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9TVUZGSVggIDMwCisKKyNpZm5kZWYgTUlOX1BBUlQKKyMgIGRlZmluZSBNSU5fUEFSVCAzCisgICAvKiBrZWVwIGF0IGxlYXN0IE1JTl9QQVJUIGNoYXJzIGJldHdlZW4gZG90cyBpbiBhIGZpbGUgbmFtZS4gKi8KKyNlbmRpZgorCisjaWZuZGVmIFJFQ09SRF9JTworIyAgZGVmaW5lIFJFQ09SRF9JTyAwCisjZW5kaWYKKworI2lmbmRlZiBnZXRfY2hhcgorIyAgZGVmaW5lIGdldF9jaGFyKCkgZ2V0X2J5dGUoKQorI2VuZGlmCisKKyNpZm5kZWYgcHV0X2NoYXIKKyMgIGRlZmluZSBwdXRfY2hhcihjKSBwdXRfYnl0ZShjKQorI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvZ3ppcC90cmVlcy5jIGIvdXNyL2d6aXAvdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVmYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2d6aXAvdHJlZXMuYwpAQCAtMCwwICsxLDEwNzUgQEAKKy8qIHRyZWVzLmMgLS0gb3V0cHV0IGRlZmxhdGVkIGRhdGEgdXNpbmcgSHVmZm1hbiBjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKi8KKworLyoKKyAqICBQVVJQT1NFCisgKgorICogICAgICBFbmNvZGUgdmFyaW91cyBzZXRzIG9mIHNvdXJjZSB2YWx1ZXMgdXNpbmcgdmFyaWFibGUtbGVuZ3RoCisgKiAgICAgIGJpbmFyeSBjb2RlIHRyZWVzLgorICoKKyAqICBESVNDVVNTSU9OCisgKgorICogICAgICBUaGUgUEtaSVAgImRlZmxhdGlvbiIgcHJvY2VzcyB1c2VzIHNldmVyYWwgSHVmZm1hbiB0cmVlcy4gVGhlIG1vcmUKKyAqICAgICAgY29tbW9uIHNvdXJjZSB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHNob3J0ZXIgYml0IHNlcXVlbmNlcy4KKyAqCisgKiAgICAgIEVhY2ggY29kZSB0cmVlIGlzIHN0b3JlZCBpbiB0aGUgWklQIGZpbGUgaW4gYSBjb21wcmVzc2VkIGZvcm0KKyAqICAgICAgd2hpY2ggaXMgaXRzZWxmIGEgSHVmZm1hbiBlbmNvZGluZyBvZiB0aGUgbGVuZ3RocyBvZgorICogICAgICBhbGwgdGhlIGNvZGUgc3RyaW5ncyAoaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHNvdXJjZSB2YWx1ZXMpLgorICogICAgICBUaGUgYWN0dWFsIGNvZGUgc3RyaW5ncyBhcmUgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsZW5ndGhzIGluCisgKiAgICAgIHRoZSBVTlpJUCBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gdGhlICJhcHBsaWNhdGlvbiBub3RlIgorICogICAgICAoQVBQTk9URS5UWFQpIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgUEtXQVJFJ3MgUEtaSVAgcHJvZ3JhbS4KKyAqCisgKiAgUkVGRVJFTkNFUworICoKKyAqICAgICAgTHluY2gsIFRob21hcyBKLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIFRlY2huaXF1ZXMgYW5kIEFwcGxpY2F0aW9ucywgcHAuIDUzLTU1LgorICogICAgICAgICAgTGlmZXRpbWUgTGVhcm5pbmcgUHVibGljYXRpb25zLCAxOTg1LiAgSVNCTiAwLTUzNC0wMzQxOC03LgorICoKKyAqICAgICAgU3RvcmVyLCBKYW1lcyBBLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIE1ldGhvZHMgYW5kIFRoZW9yeSwgcHAuIDQ5LTUwLgorICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4gIElTQk4gMC03MTY3LTgxNTYtNS4KKyAqCisgKiAgICAgIFNlZGdld2ljaywgUi4KKyAqICAgICAgICAgIEFsZ29yaXRobXMsIHAyOTAuCisgKiAgICAgICAgICBBZGRpc29uLVdlc2xleSwgMTk4My4gSVNCTiAwLTIwMS0wNjY3Mi02LgorICoKKyAqICBJTlRFUkZBQ0UKKyAqCisgKiAgICAgIHZvaWQgY3RfaW5pdCAodXNoICphdHRyLCBpbnQgKm1ldGhvZHApCisgKiAgICAgICAgICBBbGxvY2F0ZSB0aGUgbWF0Y2ggYnVmZmVyLCBpbml0aWFsaXplIHRoZSB2YXJpb3VzIHRhYmxlcyBhbmQgc2F2ZQorICogICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZSAoYXNjaWkvYmluYXJ5KSBhbmQKKyAqICAgICAgICAgIG1ldGhvZCAoREVGTEFURS9TVE9SRSkKKyAqCisgKiAgICAgIHZvaWQgY3RfdGFsbHkgKGludCBkaXN0LCBpbnQgbGMpOworICogICAgICAgICAgU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuCisgKgorICogICAgICBsb25nIGZsdXNoX2Jsb2NrIChjaGFyICpidWYsIHVsZyBzdG9yZWRfbGVuLCBpbnQgZW9mKQorICogICAgICAgICAgRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywKKyAqICAgICAgICAgIHN0YXRpYyB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwCisgKiAgICAgICAgICBmaWxlLiBSZXR1cm5zIHRoZSB0b3RhbCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGhlIGZpbGUgc28gZmFyLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgInRhaWxvci5oIgorI2luY2x1ZGUgImd6aXAuaCIKKworI2lmZGVmIFJDU0lECitzdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogdHJlZXMuYyx2IDEuMSAyMDAyLzA4LzE4IDAwOjU5OjIxIGhwYSBFeHAgJCI7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdGFudHMKKyAqLworCisjZGVmaW5lIE1BWF9CSVRTIDE1CisvKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi8KKworI2RlZmluZSBNQVhfQkxfQklUUyA3CisvKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovCisKKyNkZWZpbmUgTEVOR1RIX0NPREVTIDI5CisvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBMSVRFUkFMUyAgMjU2CisvKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi8KKworI2RlZmluZSBFTkRfQkxPQ0sgMjU2CisvKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovCisKKyNkZWZpbmUgTF9DT0RFUyAoTElURVJBTFMrMStMRU5HVEhfQ09ERVMpCisvKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBEX0NPREVTICAgMzAKKy8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisjZGVmaW5lIEJMX0NPREVTICAxOQorLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovCisKKworbG9jYWwgaW50IGV4dHJhX2xiaXRzW0xFTkdUSF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLworICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKKworbG9jYWwgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworICAgPSB7MCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM307CisKK2xvY2FsIGludCBleHRyYV9ibGJpdHNbQkxfQ09ERVNdLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDd9OworCisjZGVmaW5lIFNUT1JFRF9CTE9DSyAwCisjZGVmaW5lIFNUQVRJQ19UUkVFUyAxCisjZGVmaW5lIERZTl9UUkVFUyAgICAyCisvKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqLworCisjaWZuZGVmIExJVF9CVUZTSVpFCisjICBpZmRlZiBTTUFMTF9NRU0KKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDIwMDAKKyMgIGVsc2UKKyMgIGlmZGVmIE1FRElVTV9NRU0KKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDQwMDAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDgwMDAKKyMgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIERJU1RfQlVGU0laRQorIyAgZGVmaW5lIERJU1RfQlVGU0laRSAgTElUX0JVRlNJWkUKKyNlbmRpZgorLyogU2l6ZXMgb2YgbWF0Y2ggYnVmZmVycyBmb3IgbGl0ZXJhbHMvbGVuZ3RocyBhbmQgZGlzdGFuY2VzLiAgVGhlcmUgYXJlCisgKiA0IHJlYXNvbnMgZm9yIGxpbWl0aW5nIExJVF9CVUZTSVpFIHRvIDY0SzoKKyAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnMKKyAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQgZGF0YSBpcworICogICAgIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlbiB3aGVuIGlucHV0CisgKiAgICAgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yIGFsbCBibG9ja3MgaWYKKyAqICAgICBMSVRfQlVGU0laRSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW4KKyAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuCisgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0CisgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgorICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlCisgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nIHRyZWVzCisgKiAgICAgbW9yZSBmcmVxdWVudGx5LgorICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNAorICogVGhlIGN1cnJlbnQgY29kZSBpcyBnZW5lcmFsIGFuZCBhbGxvd3MgRElTVF9CVUZTSVpFIDwgTElUX0JVRlNJWkUgKHRvIHNhdmUKKyAqIG1lbW9yeSBhdCB0aGUgZXhwZW5zZSBvZiBjb21wcmVzc2lvbikuIFNvbWUgb3B0aW1pemF0aW9ucyB3b3VsZCBiZSBwb3NzaWJsZQorICogaWYgd2UgcmVseSBvbiBESVNUX0JVRlNJWkUgPT0gTElUX0JVRlNJWkUuCisgKi8KKyNpZiBMSVRfQlVGU0laRSA+IElOQlVGU0laCisgICAgZXJyb3IgY2Fubm90IG92ZXJsYXkgbF9idWYgYW5kIGluYnVmCisjZW5kaWYKKworI2RlZmluZSBSRVBfM182ICAgICAgMTYKKy8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzNfMTAgICAgMTcKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCisjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAorLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCBkYXRhCisgKi8KKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwordHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YSB7CisgICAgdW5pb24geworICAgICAgICB1c2ggIGZyZXE7ICAgICAgIC8qIGZyZXF1ZW5jeSBjb3VudCAqLworICAgICAgICB1c2ggIGNvZGU7ICAgICAgIC8qIGJpdCBzdHJpbmcgKi8KKyAgICB9IGZjOworICAgIHVuaW9uIHsKKyAgICAgICAgdXNoICBkYWQ7ICAgICAgICAvKiBmYXRoZXIgbm9kZSBpbiBIdWZmbWFuIHRyZWUgKi8KKyAgICAgICAgdXNoICBsZW47ICAgICAgICAvKiBsZW5ndGggb2YgYml0IHN0cmluZyAqLworICAgIH0gZGw7Cit9IGN0X2RhdGE7CisKKyNkZWZpbmUgRnJlcSBmYy5mcmVxCisjZGVmaW5lIENvZGUgZmMuY29kZQorI2RlZmluZSBEYWQgIGRsLmRhZAorI2RlZmluZSBMZW4gIGRsLmxlbgorCisjZGVmaW5lIEhFQVBfU0laRSAoMipMX0NPREVTKzEpCisvKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLworCitsb2NhbCBjdF9kYXRhIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCitsb2NhbCBjdF9kYXRhIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi8KKworbG9jYWwgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXTsKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIGN0X2luaXQKKyAqIGJlbG93KS4KKyAqLworCitsb2NhbCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXTsKKy8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKKyAqIDUgYml0cy4pCisgKi8KKworbG9jYWwgY3RfZGF0YSBibF90cmVlWzIqQkxfQ09ERVMrMV07CisvKiBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyAqLworCit0eXBlZGVmIHN0cnVjdCB0cmVlX2Rlc2MgeworICAgIGN0X2RhdGEgKmR5bl90cmVlOyAgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi8KKyAgICBjdF9kYXRhICpzdGF0aWNfdHJlZTsgICAvKiBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KKyAgICBpbnQgICAgICpleHRyYV9iaXRzOyAgICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqLworICAgIGludCAgICAgZXh0cmFfYmFzZTsgICAgICAgICAgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqLworICAgIGludCAgICAgZWxlbXM7ICAgICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHJlZSAqLworICAgIGludCAgICAgbWF4X2xlbmd0aDsgICAgICAgICAgLyogbWF4IGJpdCBsZW5ndGggZm9yIHRoZSBjb2RlcyAqLworICAgIGludCAgICAgbWF4X2NvZGU7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCit9IHRyZWVfZGVzYzsKKworbG9jYWwgdHJlZV9kZXNjIGxfZGVzYyA9Cit7ZHluX2x0cmVlLCBzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUysxLCBMX0NPREVTLCBNQVhfQklUUywgMH07CisKK2xvY2FsIHRyZWVfZGVzYyBkX2Rlc2MgPQore2R5bl9kdHJlZSwgc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMsIDB9OworCitsb2NhbCB0cmVlX2Rlc2MgYmxfZGVzYyA9Cit7YmxfdHJlZSwgKGN0X2RhdGEgKikwLCBleHRyYV9ibGJpdHMsIDAsICAgICAgQkxfQ09ERVMsIE1BWF9CTF9CSVRTLCAwfTsKKworCitsb2NhbCB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07CisvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworbG9jYWwgdWNoIGJsX29yZGVyW0JMX0NPREVTXQorICAgPSB7MTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNX07CisvKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCisgKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KKyAqLworCitsb2NhbCBpbnQgaGVhcFsyKkxfQ09ERVMrMV07IC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqLworbG9jYWwgaW50IGhlYXBfbGVuOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqLworbG9jYWwgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKy8qIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uIGhlYXBbMF0gaXMgbm90IHVzZWQuCisgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLgorICovCisKK2xvY2FsIHVjaCBkZXB0aFsyKkxfQ09ERVMrMV07CisvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5ICovCisKK2xvY2FsIHVjaCBsZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdOworLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLworCitsb2NhbCB1Y2ggZGlzdF9jb2RlWzUxMl07CisvKiBkaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzCisgKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mCisgKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KKyAqLworCitsb2NhbCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2Rpc3RbRF9DT0RFU107CisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCisjZGVmaW5lIGxfYnVmIGluYnVmCisvKiBERUNMQVJFKHVjaCwgbF9idWYsIExJVF9CVUZTSVpFKTsgIGJ1ZmZlciBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqLworCisvKiBERUNMQVJFKHVzaCwgZF9idWYsIERJU1RfQlVGU0laRSk7IGJ1ZmZlciBmb3IgZGlzdGFuY2VzICovCisKK2xvY2FsIHVjaCBmbGFnX2J1ZlsoTElUX0JVRlNJWkUvOCldOworLyogZmxhZ19idWYgaXMgYSBiaXQgYXJyYXkgZGlzdGluZ3Vpc2hpbmcgbGl0ZXJhbHMgZnJvbSBsZW5ndGhzIGluCisgKiBsX2J1ZiwgdGh1cyBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGEgZGlzdGFuY2UuCisgKi8KKworbG9jYWwgdW5zaWduZWQgbGFzdF9saXQ7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KK2xvY2FsIHVuc2lnbmVkIGxhc3RfZGlzdDsgICAvKiBydW5uaW5nIGluZGV4IGluIGRfYnVmICovCitsb2NhbCB1bnNpZ25lZCBsYXN0X2ZsYWdzOyAgLyogcnVubmluZyBpbmRleCBpbiBmbGFnX2J1ZiAqLworbG9jYWwgdWNoIGZsYWdzOyAgICAgICAgICAgIC8qIGN1cnJlbnQgZmxhZ3Mgbm90IHlldCBzYXZlZCBpbiBmbGFnX2J1ZiAqLworbG9jYWwgdWNoIGZsYWdfYml0OyAgICAgICAgIC8qIGN1cnJlbnQgYml0IHVzZWQgaW4gZmxhZ3MgKi8KKy8qIGJpdHMgYXJlIGZpbGxlZCBpbiBmbGFncyBzdGFydGluZyBhdCBiaXQgMCAobGVhc3Qgc2lnbmlmaWNhbnQpLgorICogTm90ZTogdGhlc2UgZmxhZ3MgYXJlIG92ZXJraWxsIGluIHRoZSBjdXJyZW50IGNvZGUgc2luY2Ugd2UgZG9uJ3QKKyAqIHRha2UgYWR2YW50YWdlIG9mIERJU1RfQlVGU0laRSA9PSBMSVRfQlVGU0laRS4KKyAqLworCitsb2NhbCB1bGcgb3B0X2xlbjsgICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi8KK2xvY2FsIHVsZyBzdGF0aWNfbGVuOyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovCisKK2xvY2FsIHVsZyBjb21wcmVzc2VkX2xlbjsgLyogdG90YWwgYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGZpbGUgKi8KKworbG9jYWwgdWxnIGlucHV0X2xlbjsgICAgICAvKiB0b3RhbCBieXRlIGxlbmd0aCBvZiBpbnB1dCBmaWxlICovCisvKiBpbnB1dF9sZW4gaXMgZm9yIGRlYnVnZ2luZyBvbmx5IHNpbmNlIHdlIGNhbiBnZXQgaXQgYnkgb3RoZXIgbWVhbnMuICovCisKK3VzaCAqZmlsZV90eXBlOyAgICAgICAgLyogcG9pbnRlciB0byBVTktOT1dOLCBCSU5BUlkgb3IgQVNDSUkgKi8KK2ludCAqZmlsZV9tZXRob2Q7ICAgICAgLyogcG9pbnRlciB0byBERUZMQVRFIG9yIFNUT1JFICovCisKKyNpZmRlZiBERUJVRworZXh0ZXJuIHVsZyBiaXRzX3NlbnQ7ICAvKiBiaXQgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KK2V4dGVybiBsb25nIGlzaXplOyAgICAgLyogYnl0ZSBsZW5ndGggb2YgaW5wdXQgZmlsZSAqLworI2VuZGlmCisKK2V4dGVybiBsb25nIGJsb2NrX3N0YXJ0OyAgICAgICAvKiB3aW5kb3cgb2Zmc2V0IG9mIGN1cnJlbnQgYmxvY2sgKi8KK2V4dGVybiB1bnNpZ25lZCBzdHJzdGFydDsgLyogd2luZG93IG9mZnNldCBvZiBjdXJyZW50IHN0cmluZyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIChzdGF0aWMpIHJvdXRpbmVzIGluIHRoaXMgZmlsZS4KKyAqLworCitsb2NhbCB2b2lkIGluaXRfYmxvY2sgICAgIE9GKCh2b2lkKSk7Citsb2NhbCB2b2lkIHBxZG93bmhlYXAgICAgIE9GKChjdF9kYXRhICp0cmVlLCBpbnQgaykpOworbG9jYWwgdm9pZCBnZW5fYml0bGVuICAgICBPRigodHJlZV9kZXNjICpkZXNjKSk7Citsb2NhbCB2b2lkIGdlbl9jb2RlcyAgICAgIE9GKChjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIHZvaWQgYnVpbGRfdHJlZSAgICAgT0YoKHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBzY2FuX3RyZWUgICAgICBPRigoY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Citsb2NhbCB2b2lkIHNlbmRfdHJlZSAgICAgIE9GKChjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKHZvaWQpKTsKK2xvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMgT0YoKGludCBsY29kZXMsIGludCBkY29kZXMsIGludCBibGNvZGVzKSk7Citsb2NhbCB2b2lkIGNvbXByZXNzX2Jsb2NrIE9GKChjdF9kYXRhICpsdHJlZSwgY3RfZGF0YSAqZHRyZWUpKTsKK2xvY2FsIHZvaWQgc2V0X2ZpbGVfdHlwZSAgT0YoKHZvaWQpKTsKKworCisjaWZuZGVmIERFQlVHCisjICBkZWZpbmUgc2VuZF9jb2RlKGMsIHRyZWUpIHNlbmRfYml0cyh0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKQorICAgLyogU2VuZCBhIGNvZGUgb2YgdGhlIGdpdmVuIHRyZWUuIGMgYW5kIHRyZWUgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKworI2Vsc2UgLyogREVCVUcgKi8KKyMgIGRlZmluZSBzZW5kX2NvZGUoYywgdHJlZSkgXAorICAgICB7IGlmICh2ZXJib3NlPjEpIGZwcmludGYoc3RkZXJyLCJcbmNkICUzZCAiLChjKSk7IFwKKyAgICAgICBzZW5kX2JpdHModHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbik7IH0KKyNlbmRpZgorCisjZGVmaW5lIGRfY29kZShkaXN0KSBcCisgICAoKGRpc3QpIDwgMjU2ID8gZGlzdF9jb2RlW2Rpc3RdIDogZGlzdF9jb2RlWzI1NisoKGRpc3QpPj43KV0pCisvKiBNYXBwaW5nIGZyb20gYSBkaXN0YW5jZSB0byBhIGRpc3RhbmNlIGNvZGUuIGRpc3QgaXMgdGhlIGRpc3RhbmNlIC0gMSBhbmQKKyAqIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLiBkaXN0X2NvZGVbMjU2XSBhbmQgZGlzdF9jb2RlWzI1N10gYXJlIG5ldmVyCisgKiB1c2VkLgorICovCisKKyNkZWZpbmUgTUFYKGEsYikgKGEgPj0gYiA/IGEgOiBiKQorLyogdGhlIGFyZ3VtZW50cyBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEFsbG9jYXRlIHRoZSBtYXRjaCBidWZmZXIsIGluaXRpYWxpemUgdGhlIHZhcmlvdXMgdGFibGVzIGFuZCBzYXZlIHRoZQorICogbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlIChhc2NpaS9iaW5hcnkpIGFuZCBtZXRob2QKKyAqIChERUZMQVRFL1NUT1JFKS4KKyAqLwordm9pZCBjdF9pbml0KGF0dHIsIG1ldGhvZHApCisgICAgdXNoICAqYXR0cjsgICAvKiBwb2ludGVyIHRvIGludGVybmFsIGZpbGUgYXR0cmlidXRlICovCisgICAgaW50ICAqbWV0aG9kcDsgLyogcG9pbnRlciB0byBjb21wcmVzc2lvbiBtZXRob2QgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi8KKyAgICBpbnQgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqLworICAgIGludCBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqLworICAgIGludCBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi8KKworICAgIGZpbGVfdHlwZSA9IGF0dHI7CisgICAgZmlsZV9tZXRob2QgPSBtZXRob2RwOworICAgIGNvbXByZXNzZWRfbGVuID0gaW5wdXRfbGVuID0gMEw7CisKKyAgICBpZiAoc3RhdGljX2R0cmVlWzBdLkxlbiAhPSAwKSByZXR1cm47IC8qIGN0X2luaXQgYWxyZWFkeSBjYWxsZWQgKi8KKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KKyAgICBsZW5ndGggPSAwOworICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMtMTsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBsZW5ndGhfY29kZVtsZW5ndGgrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChsZW5ndGggPT0gMjU2LCAiY3RfaW5pdDogbGVuZ3RoICE9IDI1NiIpOworICAgIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkCisgICAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2UKKyAgICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6CisgICAgICovCisgICAgbGVuZ3RoX2NvZGVbbGVuZ3RoLTFdID0gKHVjaCljb2RlOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovCisgICAgZGlzdCA9IDA7CisgICAgZm9yIChjb2RlID0gMCA7IGNvZGUgPCAxNjsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHsKKyAgICAgICAgICAgIGRpc3RfY29kZVtkaXN0KytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJjdF9pbml0OiBkaXN0ICE9IDI1NiIpOworICAgIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqLworICAgIGZvciAoIDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8KGV4dHJhX2RiaXRzW2NvZGVdLTcpKTsgbisrKSB7CisgICAgICAgICAgICBkaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAiY3RfaW5pdDogMjU2K2Rpc3QgIT0gNTEyIik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBibF9jb3VudFtiaXRzXSA9IDA7CisgICAgbiA9IDA7CisgICAgd2hpbGUgKG4gPD0gMTQzKSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIHdoaWxlIChuIDw9IDI1NSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOSwgYmxfY291bnRbOV0rKzsKKyAgICB3aGlsZSAobiA8PSAyNzkpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDcsIGJsX2NvdW50WzddKys7CisgICAgd2hpbGUgKG4gPD0gMjg3KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZQorICAgICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZQorICAgICAqIGFsbCBvbmVzKQorICAgICAqLworICAgIGdlbl9jb2RlcygoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgTF9DT0RFUysxKTsKKworICAgIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqLworICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHsKKyAgICAgICAgc3RhdGljX2R0cmVlW25dLkxlbiA9IDU7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuLCA1KTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KKyAgICBpbml0X2Jsb2NrKCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay4KKyAqLworbG9jYWwgdm9pZCBpbml0X2Jsb2NrKCkKK3sKKyAgICBpbnQgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgZHluX2x0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSBkeW5fZHRyZWVbbl0uRnJlcSA9IDA7CisgICAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIGJsX3RyZWVbbl0uRnJlcSA9IDA7CisKKyAgICBkeW5fbHRyZWVbRU5EX0JMT0NLXS5GcmVxID0gMTsKKyAgICBvcHRfbGVuID0gc3RhdGljX2xlbiA9IDBMOworICAgIGxhc3RfbGl0ID0gbGFzdF9kaXN0ID0gbGFzdF9mbGFncyA9IDA7CisgICAgZmxhZ3MgPSAwOyBmbGFnX2JpdCA9IDE7Cit9CisKKyNkZWZpbmUgU01BTExFU1QgMQorLyogSW5kZXggd2l0aGluIHRoZSBoZWFwIGFycmF5IG9mIGxlYXN0IGZyZXF1ZW50IG5vZGUgaW4gdGhlIEh1ZmZtYW4gdHJlZSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVtb3ZlIHRoZSBzbWFsbGVzdCBlbGVtZW50IGZyb20gdGhlIGhlYXAgYW5kIHJlY3JlYXRlIHRoZSBoZWFwIHdpdGgKKyAqIG9uZSBsZXNzIGVsZW1lbnQuIFVwZGF0ZXMgaGVhcCBhbmQgaGVhcF9sZW4uCisgKi8KKyNkZWZpbmUgcHFyZW1vdmUodHJlZSwgdG9wKSBcCit7XAorICAgIHRvcCA9IGhlYXBbU01BTExFU1RdOyBcCisgICAgaGVhcFtTTUFMTEVTVF0gPSBoZWFwW2hlYXBfbGVuLS1dOyBcCisgICAgcHFkb3duaGVhcCh0cmVlLCBTTUFMTEVTVCk7IFwKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlbgorICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguCisgKi8KKyNkZWZpbmUgc21hbGxlcih0cmVlLCBuLCBtKSBcCisgICAodHJlZVtuXS5GcmVxIDwgdHJlZVttXS5GcmVxIHx8IFwKKyAgICh0cmVlW25dLkZyZXEgPT0gdHJlZVttXS5GcmVxICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSkKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgaywKKyAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCisgKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzCisgKiB0d28gc29ucykuCisgKi8KK2xvY2FsIHZvaWQgcHFkb3duaGVhcCh0cmVlLCBrKQorICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovCisgICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi8KK3sKKyAgICBpbnQgdiA9IGhlYXBba107CisgICAgaW50IGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovCisgICAgd2hpbGUgKGogPD0gaGVhcF9sZW4pIHsKKyAgICAgICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KKyAgICAgICAgaWYgKGogPCBoZWFwX2xlbiAmJiBzbWFsbGVyKHRyZWUsIGhlYXBbaisxXSwgaGVhcFtqXSkpIGorKzsKKworICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworICAgICAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBoZWFwW2pdKSkgYnJlYWs7CisKKyAgICAgICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi8KKyAgICAgICAgaGVhcFtrXSA9IGhlYXBbal07ICBrID0gajsKKworICAgICAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCisgICAgICAgIGogPDw9IDE7CisgICAgfQorICAgIGhlYXBba10gPSB2OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoCisgKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZAorICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGUKKyAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC4KKyAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMKKyAqICAgICBub3QgbnVsbC4KKyAqLworbG9jYWwgdm9pZCBnZW5fYml0bGVuKGRlc2MpCisgICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBpbnQgKmV4dHJhICAgICA9IGRlc2MtPmV4dHJhX2JpdHM7CisgICAgaW50IGJhc2UgICAgICAgICAgICA9IGRlc2MtPmV4dHJhX2Jhc2U7CisgICAgaW50IG1heF9jb2RlICAgICAgICA9IGRlc2MtPm1heF9jb2RlOworICAgIGludCBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLT5tYXhfbGVuZ3RoOworICAgIGN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdGljX3RyZWU7CisgICAgaW50IGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovCisgICAgaW50IG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi8KKyAgICBpbnQgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi8KKyAgICB1c2ggZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqLworICAgIGludCBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi8KKworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgYmxfY291bnRbYml0c10gPSAwOworCisgICAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXkKKyAgICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS4KKyAgICAgKi8KKyAgICB0cmVlW2hlYXBbaGVhcF9tYXhdXS5MZW4gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovCisKKyAgICBmb3IgKGggPSBoZWFwX21heCsxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHsKKyAgICAgICAgbiA9IGhlYXBbaF07CisgICAgICAgIGJpdHMgPSB0cmVlW3RyZWVbbl0uRGFkXS5MZW4gKyAxOworICAgICAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIGJpdHMgPSBtYXhfbGVuZ3RoLCBvdmVyZmxvdysrOworICAgICAgICB0cmVlW25dLkxlbiA9ICh1c2gpYml0czsKKyAgICAgICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKworICAgICAgICBpZiAobiA+IG1heF9jb2RlKSBjb250aW51ZTsgLyogbm90IGEgbGVhZiBub2RlICovCisKKyAgICAgICAgYmxfY291bnRbYml0c10rKzsKKyAgICAgICAgeGJpdHMgPSAwOworICAgICAgICBpZiAobiA+PSBiYXNlKSB4Yml0cyA9IGV4dHJhW24tYmFzZV07CisgICAgICAgIGYgPSB0cmVlW25dLkZyZXE7CisgICAgICAgIG9wdF9sZW4gKz0gKHVsZylmICogKGJpdHMgKyB4Yml0cyk7CisgICAgICAgIGlmIChzdHJlZSkgc3RhdGljX2xlbiArPSAodWxnKWYgKiAoc3RyZWVbbl0uTGVuICsgeGJpdHMpOworICAgIH0KKyAgICBpZiAob3ZlcmZsb3cgPT0gMCkgcmV0dXJuOworCisgICAgVHJhY2UoKHN0ZGVyciwiXG5iaXQgbGVuZ3RoIG92ZXJmbG93XG4iKSk7CisgICAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KKworICAgIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovCisgICAgZG8geworICAgICAgICBiaXRzID0gbWF4X2xlbmd0aC0xOworICAgICAgICB3aGlsZSAoYmxfY291bnRbYml0c10gPT0gMCkgYml0cy0tOworICAgICAgICBibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqLworICAgICAgICBibF9jb3VudFtiaXRzKzFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi8KKyAgICAgICAgYmxfY291bnRbbWF4X2xlbmd0aF0tLTsKKyAgICAgICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCwKKyAgICAgICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdCisgICAgICAgICAqLworICAgICAgICBvdmVyZmxvdyAtPSAyOworICAgIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7CisKKyAgICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgICAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbAorICAgICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuCisgICAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pCisgICAgICovCisgICAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKKyAgICAgICAgbiA9IGJsX2NvdW50W2JpdHNdOworICAgICAgICB3aGlsZSAobiAhPSAwKSB7CisgICAgICAgICAgICBtID0gaGVhcFstLWhdOworICAgICAgICAgICAgaWYgKG0gPiBtYXhfY29kZSkgY29udGludWU7CisgICAgICAgICAgICBpZiAodHJlZVttXS5MZW4gIT0gKHVuc2lnbmVkKSBiaXRzKSB7CisgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTsKKyAgICAgICAgICAgICAgICBvcHRfbGVuICs9ICgobG9uZyliaXRzLShsb25nKXRyZWVbbV0uTGVuKSoobG9uZyl0cmVlW21dLkZyZXE7CisgICAgICAgICAgICAgICAgdHJlZVttXS5MZW4gPSAodXNoKWJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlCisgKiBvcHRpbWFsKS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yCisgKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLgorICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub24KKyAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLgorICovCitsb2NhbCB2b2lkIGdlbl9jb2RlcyAodHJlZSwgbWF4X2NvZGUpCisgICAgY3RfZGF0YSAqdHJlZTsgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovCisgICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCit7CisgICAgdXNoIG5leHRfY29kZVtNQVhfQklUUysxXTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgICB1c2ggY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovCisKKyAgICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXMKKyAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHsKKyAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAorICAgICAgICAgICAgImluY29uc2lzdGVudCBiaXQgY291bnRzIik7CisgICAgVHJhY2V2KChzdGRlcnIsIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOworCisgICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBpbnQgbGVuID0gdHJlZVtuXS5MZW47CisgICAgICAgIGlmIChsZW4gPT0gMCkgY29udGludWU7CisgICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCisgICAgICAgIHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTsKKworICAgICAgICBUcmFjZWModHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSAiLAorICAgICAgICAgICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgorICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKKyAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcworICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KKyAqLworbG9jYWwgdm9pZCBidWlsZF90cmVlKGRlc2MpCisgICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCit7CisgICAgY3RfZGF0YSAqdHJlZSAgID0gZGVzYy0+ZHluX3RyZWU7CisgICAgY3RfZGF0YSAqc3RyZWUgID0gZGVzYy0+c3RhdGljX3RyZWU7CisgICAgaW50IGVsZW1zICAgICAgICAgICAgPSBkZXNjLT5lbGVtczsKKyAgICBpbnQgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi8KKyAgICBpbnQgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgaW50IG5vZGUgPSBlbGVtczsgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLworCisgICAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgorICAgICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgorICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCisgICAgICovCisgICAgaGVhcF9sZW4gPSAwLCBoZWFwX21heCA9IEhFQVBfU0laRTsKKworICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7CisgICAgICAgIGlmICh0cmVlW25dLkZyZXEgIT0gMCkgeworICAgICAgICAgICAgaGVhcFsrK2hlYXBfbGVuXSA9IG1heF9jb2RlID0gbjsKKyAgICAgICAgICAgIGRlcHRoW25dID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyZWVbbl0uTGVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsCisgICAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lCisgICAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3QKKyAgICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LgorICAgICAqLworICAgIHdoaWxlIChoZWFwX2xlbiA8IDIpIHsKKyAgICAgICAgaW50IG5ldyA9IGhlYXBbKytoZWFwX2xlbl0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApOworICAgICAgICB0cmVlW25ld10uRnJlcSA9IDE7CisgICAgICAgIGRlcHRoW25ld10gPSAwOworICAgICAgICBvcHRfbGVuLS07IGlmIChzdHJlZSkgc3RhdGljX2xlbiAtPSBzdHJlZVtuZXddLkxlbjsKKyAgICAgICAgLyogbmV3IGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi8KKyAgICB9CisgICAgZGVzYy0+bWF4X2NvZGUgPSBtYXhfY29kZTsKKworICAgIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSwKKyAgICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczoKKyAgICAgKi8KKyAgICBmb3IgKG4gPSBoZWFwX2xlbi8yOyBuID49IDE7IG4tLSkgcHFkb3duaGVhcCh0cmVlLCBuKTsKKworICAgIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d28KKyAgICAgKiBmcmVxdWVudCBub2Rlcy4KKyAgICAgKi8KKyAgICBkbyB7CisgICAgICAgIHBxcmVtb3ZlKHRyZWUsIG4pOyAgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqLworICAgICAgICBtID0gaGVhcFtTTUFMTEVTVF07ICAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLworCisgICAgICAgIGhlYXBbLS1oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovCisgICAgICAgIGhlYXBbLS1oZWFwX21heF0gPSBtOworCisgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovCisgICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IHRyZWVbbl0uRnJlcSArIHRyZWVbbV0uRnJlcTsKKyAgICAgICAgZGVwdGhbbm9kZV0gPSAodWNoKSAoTUFYKGRlcHRoW25dLCBkZXB0aFttXSkgKyAxKTsKKyAgICAgICAgdHJlZVtuXS5EYWQgPSB0cmVlW21dLkRhZCA9ICh1c2gpbm9kZTsKKyNpZmRlZiBEVU1QX0JMX1RSRUUKKyAgICAgICAgaWYgKHRyZWUgPT0gYmxfdHJlZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgaGVhcFtTTUFMTEVTVF0gPSBub2RlKys7CisgICAgICAgIHBxZG93bmhlYXAodHJlZSwgU01BTExFU1QpOworCisgICAgfSB3aGlsZSAoaGVhcF9sZW4gPj0gMik7CisKKyAgICBoZWFwWy0taGVhcF9tYXhdID0gaGVhcFtTTUFMTEVTVF07CisKKyAgICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93CisgICAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLgorICAgICAqLworICAgIGdlbl9iaXRsZW4oKHRyZWVfZGVzYyAqKWRlc2MpOworCisgICAgLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqLworICAgIGdlbl9jb2RlcyAoKGN0X2RhdGEgKil0cmVlLCBtYXhfY29kZSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcworICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4gVXBkYXRlcyBvcHRfbGVuIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSByZXBlYXQKKyAqIGNvdW50cy4gKFRoZSBjb250cmlidXRpb24gb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgd2lsbCBiZSBhZGRlZCBsYXRlcgorICogZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYmxfdHJlZS4pCisgKi8KK2xvY2FsIHZvaWQgc2Nhbl90cmVlICh0cmVlLCBtYXhfY29kZSkKKyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCisgICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgYmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgYmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKKyAgICAgICAgICAgIGJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisgICAgICAgICAgICBibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKKyAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCisgKiBibF90cmVlLgorICovCitsb2NhbCB2b2lkIHNlbmRfdHJlZSAodHJlZSwgbWF4X2NvZGUpCisgICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqLworICAgIGludCBtYXhfY29kZTsgICAgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovCit7CisgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLworICAgIGludCBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi8KKyAgICBpbnQgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCisgICAgaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLworICAgIGludCBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovCisgICAgaW50IG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqLworICAgIGludCBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi8KKworICAgIC8qIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gLTE7ICovICAvKiBndWFyZCBhbHJlYWR5IHNldCAqLworICAgIGlmIChuZXh0bGVuID09IDApIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKworICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKKyAgICAgICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CisgICAgICAgICAgICBkbyB7IHNlbmRfY29kZShjdXJsZW4sIGJsX3RyZWUpOyB9IHdoaWxlICgtLWNvdW50ICE9IDApOworCisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgeworICAgICAgICAgICAgICAgIHNlbmRfY29kZShjdXJsZW4sIGJsX3RyZWUpOyBjb3VudC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgIiAzXzY/Iik7CisgICAgICAgICAgICBzZW5kX2NvZGUoUkVQXzNfNiwgYmxfdHJlZSk7IHNlbmRfYml0cyhjb3VudC0zLCAyKTsKKworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisgICAgICAgICAgICBzZW5kX2NvZGUoUkVQWl8zXzEwLCBibF90cmVlKTsgc2VuZF9iaXRzKGNvdW50LTMsIDMpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kX2NvZGUoUkVQWl8xMV8xMzgsIGJsX3RyZWUpOyBzZW5kX2JpdHMoY291bnQtMTEsIDcpOworICAgICAgICB9CisgICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKKyAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluCisgKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKyAqLworbG9jYWwgaW50IGJ1aWxkX2JsX3RyZWUoKQoreworICAgIGludCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworICAgIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKyAgICBzY2FuX3RyZWUoKGN0X2RhdGEgKilkeW5fbHRyZWUsIGxfZGVzYy5tYXhfY29kZSk7CisgICAgc2Nhbl90cmVlKChjdF9kYXRhICopZHluX2R0cmVlLCBkX2Rlc2MubWF4X2NvZGUpOworCisgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi8KKyAgICBidWlsZF90cmVlKCh0cmVlX2Rlc2MgKikoJmJsX2Rlc2MpKTsKKyAgICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0CisgICAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy4KKyAgICAgKi8KKworICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdAorICAgICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzCisgICAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKQorICAgICAqLworICAgIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUy0xOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CisgICAgICAgIGlmIChibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XV0uTGVuICE9IDApIGJyZWFrOworICAgIH0KKyAgICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqLworICAgIG9wdF9sZW4gKz0gMyoobWF4X2JsaW5kZXgrMSkgKyA1KzUrNDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZCIsIG9wdF9sZW4sIHN0YXRpY19sZW4pKTsKKworICAgIHJldHVybiBtYXhfYmxpbmRleDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKKyAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLgorICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LgorICovCitsb2NhbCB2b2lkIHNlbmRfYWxsX3RyZWVzKGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKQorICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi8KK3sKKyAgICBpbnQgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovCisKKyAgICBBc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOworICAgIEFzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUywKKyAgICAgICAgICAgICJ0b28gbWFueSBjb2RlcyIpOworICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb3VudHM6ICIpKTsKKyAgICBzZW5kX2JpdHMobGNvZGVzLTI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLworICAgIHNlbmRfYml0cyhkY29kZXMtMSwgICA1KTsKKyAgICBzZW5kX2JpdHMoYmxjb2Rlcy00LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb2RlICUyZCAiLCBibF9vcmRlcltyYW5rXSkpOworICAgICAgICBzZW5kX2JpdHMoYmxfdHJlZVtibF9vcmRlcltyYW5rXV0uTGVuLCAzKTsKKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIHRyZWU6IHNlbnQgJWxkIiwgYml0c19zZW50KSk7CisKKyAgICBzZW5kX3RyZWUoKGN0X2RhdGEgKilkeW5fbHRyZWUsIGxjb2Rlcy0xKTsgLyogc2VuZCB0aGUgbGl0ZXJhbCB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCB0cmVlOiBzZW50ICVsZCIsIGJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKChjdF9kYXRhICopZHluX2R0cmVlLCBkY29kZXMtMSk7IC8qIHNlbmQgdGhlIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCB0cmVlOiBzZW50ICVsZCIsIGJpdHNfc2VudCkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYworICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLiBUaGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIHRoZSB0b3RhbCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGhlIGZpbGUgc28gZmFyLgorICovCit1bGcgZmx1c2hfYmxvY2soYnVmLCBzdG9yZWRfbGVuLCBlb2YpCisgICAgY2hhciAqYnVmOyAgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqLworICAgIHVsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLworICAgIGludCBlb2Y7ICAgICAgICAgIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCit7CisgICAgdWxnIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgLyogb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBpbiBieXRlcyAqLworICAgIGludCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworICAgIGZsYWdfYnVmW2xhc3RfZmxhZ3NdID0gZmxhZ3M7IC8qIFNhdmUgdGhlIGZsYWdzIGZvciB0aGUgbGFzdCA4IGl0ZW1zICovCisKKyAgICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYXNjaWkgb3IgYmluYXJ5ICovCisgICAgaWYgKCpmaWxlX3R5cGUgPT0gKHVzaClVTktOT1dOKSBzZXRfZmlsZV90eXBlKCk7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisgICAgYnVpbGRfdHJlZSgodHJlZV9kZXNjICopKCZsX2Rlc2MpKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgb3B0X2xlbiwgc3RhdGljX2xlbikpOworCisgICAgYnVpbGRfdHJlZSgodHJlZV9kZXNjICopKCZkX2Rlc2MpKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIG9wdF9sZW4sIHN0YXRpY19sZW4pKTsKKyAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKyAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLgorICAgICAqLworCisgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKyAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKyAgICAgKi8KKyAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUoKTsKKworICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSBmaXJzdCB0aGUgYmxvY2sgbGVuZ3RoIGluIGJ5dGVzICovCisgICAgb3B0X2xlbmIgPSAob3B0X2xlbiszKzcpPj4zOworICAgIHN0YXRpY19sZW5iID0gKHN0YXRpY19sZW4rMys3KT4+MzsKKyAgICBpbnB1dF9sZW4gKz0gc3RvcmVkX2xlbjsgLyogZm9yIGRlYnVnZ2luZyBvbmx5ICovCisKKyAgICBUcmFjZSgoc3RkZXJyLCAiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBkaXN0ICV1ICIsCisgICAgICAgICAgICBvcHRfbGVuYiwgb3B0X2xlbiwgc3RhdGljX2xlbmIsIHN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisgICAgICAgICAgICBsYXN0X2xpdCwgbGFzdF9kaXN0KSk7CisKKyAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisKKyAgICAvKiBJZiBjb21wcmVzc2lvbiBmYWlsZWQgYW5kIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCBsYXN0IGJsb2NrLAorICAgICAqIGFuZCBpZiB0aGUgemlwIGZpbGUgY2FuIGJlIHNlZWtlZCAodG8gcmV3cml0ZSB0aGUgbG9jYWwgaGVhZGVyKSwKKyAgICAgKiB0aGUgd2hvbGUgZmlsZSBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgc3RvcmVkIGZpbGU6CisgICAgICovCisjaWZkZWYgRk9SQ0VfTUVUSE9ECisgICAgaWYgKGxldmVsID09IDEgJiYgZW9mICYmIGNvbXByZXNzZWRfbGVuID09IDBMKSB7IC8qIGZvcmNlIHN0b3JlZCBmaWxlICovCisjZWxzZQorICAgIGlmIChzdG9yZWRfbGVuIDw9IG9wdF9sZW5iICYmIGVvZiAmJiBjb21wcmVzc2VkX2xlbiA9PSAwTCAmJiBzZWVrYWJsZSgpKSB7CisjZW5kaWYKKyAgICAgICAgLyogU2luY2UgTElUX0JVRlNJWkUgPD0gMipXU0laRSwgdGhlIGlucHV0IGRhdGEgbXVzdCBiZSB0aGVyZTogKi8KKyAgICAgICAgaWYgKGJ1ZiA9PSAoY2hhciopMCkgZXJyb3IgKCJibG9jayB2YW5pc2hlZCIpOworCisgICAgICAgIGNvcHlfYmxvY2soYnVmLCAodW5zaWduZWQpc3RvcmVkX2xlbiwgMCk7IC8qIHdpdGhvdXQgaGVhZGVyICovCisgICAgICAgIGNvbXByZXNzZWRfbGVuID0gc3RvcmVkX2xlbiA8PCAzOworICAgICAgICAqZmlsZV9tZXRob2QgPSBTVE9SRUQ7CisKKyNpZmRlZiBGT1JDRV9NRVRIT0QKKyAgICB9IGVsc2UgaWYgKGxldmVsID09IDIgJiYgYnVmICE9IChjaGFyKikwKSB7IC8qIGZvcmNlIHN0b3JlZCBibG9jayAqLworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKHN0b3JlZF9sZW4rNCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gKGNoYXIqKTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqLworI2VuZGlmCisgICAgICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuCisgICAgICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2UKKyAgICAgICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuCisgICAgICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bworICAgICAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgc2VuZF9iaXRzKChTVE9SRURfQkxPQ0s8PDEpK2VvZiwgMyk7ICAvKiBzZW5kIGJsb2NrIHR5cGUgKi8KKyAgICAgICAgY29tcHJlc3NlZF9sZW4gPSAoY29tcHJlc3NlZF9sZW4gKyAzICsgNykgJiB+N0w7CisgICAgICAgIGNvbXByZXNzZWRfbGVuICs9IChzdG9yZWRfbGVuICsgNCkgPDwgMzsKKworICAgICAgICBjb3B5X2Jsb2NrKGJ1ZiwgKHVuc2lnbmVkKXN0b3JlZF9sZW4sIDEpOyAvKiB3aXRoIGhlYWRlciAqLworCisjaWZkZWYgRk9SQ0VfTUVUSE9ECisgICAgfSBlbHNlIGlmIChsZXZlbCA9PSAzKSB7IC8qIGZvcmNlIHN0YXRpYyB0cmVlcyAqLworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CisjZW5kaWYKKyAgICAgICAgc2VuZF9iaXRzKChTVEFUSUNfVFJFRVM8PDEpK2VvZiwgMyk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKChjdF9kYXRhICopc3RhdGljX2x0cmVlLCAoY3RfZGF0YSAqKXN0YXRpY19kdHJlZSk7CisgICAgICAgIGNvbXByZXNzZWRfbGVuICs9IDMgKyBzdGF0aWNfbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlbmRfYml0cygoRFlOX1RSRUVTPDwxKStlb2YsIDMpOworICAgICAgICBzZW5kX2FsbF90cmVlcyhsX2Rlc2MubWF4X2NvZGUrMSwgZF9kZXNjLm1heF9jb2RlKzEsIG1heF9ibGluZGV4KzEpOworICAgICAgICBjb21wcmVzc19ibG9jaygoY3RfZGF0YSAqKWR5bl9sdHJlZSwgKGN0X2RhdGEgKilkeW5fZHRyZWUpOworICAgICAgICBjb21wcmVzc2VkX2xlbiArPSAzICsgb3B0X2xlbjsKKyAgICB9CisgICAgQXNzZXJ0IChjb21wcmVzc2VkX2xlbiA9PSBiaXRzX3NlbnQsICJiYWQgY29tcHJlc3NlZCBzaXplIik7CisgICAgaW5pdF9ibG9jaygpOworCisgICAgaWYgKGVvZikgeworICAgICAgICBBc3NlcnQgKGlucHV0X2xlbiA9PSBpc2l6ZSwgImJhZCBpbnB1dCBzaXplIik7CisgICAgICAgIGJpX3dpbmR1cCgpOworICAgICAgICBjb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworICAgIH0KKyAgICBUcmFjZXYoKHN0ZGVyciwiXG5jb21wcmxlbiAlbHUoJWx1KSAiLCBjb21wcmVzc2VkX2xlbj4+MywKKyAgICAgICAgICAgY29tcHJlc3NlZF9sZW4tNyplb2YpKTsKKworICAgIHJldHVybiBjb21wcmVzc2VkX2xlbiA+PiAzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgorICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLgorICovCitpbnQgY3RfdGFsbHkgKGRpc3QsIGxjKQorICAgIGludCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICBpbnQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovCit7CisgICAgbF9idWZbbGFzdF9saXQrK10gPSAodWNoKWxjOworICAgIGlmIChkaXN0ID09IDApIHsKKyAgICAgICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovCisgICAgICAgIGR5bl9sdHJlZVtsY10uRnJlcSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKyAgICAgICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovCisgICAgICAgIEFzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUICYmCisgICAgICAgICAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmCisgICAgICAgICAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgICJjdF90YWxseTogYmFkIG1hdGNoIik7CisKKyAgICAgICAgZHluX2x0cmVlW2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7CisgICAgICAgIGR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKKworICAgICAgICBkX2J1ZltsYXN0X2Rpc3QrK10gPSAodXNoKWRpc3Q7CisgICAgICAgIGZsYWdzIHw9IGZsYWdfYml0OworICAgIH0KKyAgICBmbGFnX2JpdCA8PD0gMTsKKworICAgIC8qIE91dHB1dCB0aGUgZmxhZ3MgaWYgdGhleSBmaWxsIGEgYnl0ZTogKi8KKyAgICBpZiAoKGxhc3RfbGl0ICYgNykgPT0gMCkgeworICAgICAgICBmbGFnX2J1ZltsYXN0X2ZsYWdzKytdID0gZmxhZ3M7CisgICAgICAgIGZsYWdzID0gMCwgZmxhZ19iaXQgPSAxOworICAgIH0KKyAgICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi8KKyAgICBpZiAobGV2ZWwgPiAyICYmIChsYXN0X2xpdCAmIDB4ZmZmKSA9PSAwKSB7CisgICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLworICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpbGFzdF9saXQqOEw7CisgICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKXN0cnN0YXJ0LWJsb2NrX3N0YXJ0OworICAgICAgICBpbnQgZGNvZGU7CisgICAgICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHsKKyAgICAgICAgICAgIG91dF9sZW5ndGggKz0gKHVsZylkeW5fZHRyZWVbZGNvZGVdLkZyZXEqKDVMK2V4dHJhX2RiaXRzW2Rjb2RlXSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0X2xlbmd0aCA+Pj0gMzsKKyAgICAgICAgVHJhY2UoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgbGFzdF9kaXN0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSAiLAorICAgICAgICAgICAgICAgbGFzdF9saXQsIGxhc3RfZGlzdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLAorICAgICAgICAgICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTsKKyAgICAgICAgaWYgKGxhc3RfZGlzdCA8IGxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIChsYXN0X2xpdCA9PSBMSVRfQlVGU0laRS0xIHx8IGxhc3RfZGlzdCA9PSBESVNUX0JVRlNJWkUpOworICAgIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggTElUX0JVRlNJWkUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SworICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCisgICAgICogNjRLLTEgYnl0ZXMuCisgICAgICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCisgKi8KK2xvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2sobHRyZWUsIGR0cmVlKQorICAgIGN0X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi8KKyAgICBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqLworeworICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICBpbnQgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqLworICAgIHVuc2lnbmVkIGx4ID0gMDsgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworICAgIHVuc2lnbmVkIGR4ID0gMDsgICAgLyogcnVubmluZyBpbmRleCBpbiBkX2J1ZiAqLworICAgIHVuc2lnbmVkIGZ4ID0gMDsgICAgLyogcnVubmluZyBpbmRleCBpbiBmbGFnX2J1ZiAqLworICAgIHVjaCBmbGFnID0gMDsgICAgICAgLyogY3VycmVudCBmbGFncyAqLworICAgIHVuc2lnbmVkIGNvZGU7ICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqLworICAgIGludCBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqLworCisgICAgaWYgKGxhc3RfbGl0ICE9IDApIGRvIHsKKyAgICAgICAgaWYgKChseCAmIDcpID09IDApIGZsYWcgPSBmbGFnX2J1ZltmeCsrXTsKKyAgICAgICAgbGMgPSBsX2J1ZltseCsrXTsKKyAgICAgICAgaWYgKChmbGFnICYgMSkgPT0gMCkgeworICAgICAgICAgICAgc2VuZF9jb2RlKGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi8KKyAgICAgICAgICAgIFRyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsIiAnJWMnICIsIGxjKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgICAgICBjb2RlID0gbGVuZ3RoX2NvZGVbbGNdOworICAgICAgICAgICAgc2VuZF9jb2RlKGNvZGUrTElURVJBTFMrMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKGxjLCBleHRyYSk7ICAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzdCA9IGRfYnVmW2R4KytdOworICAgICAgICAgICAgLyogSGVyZSwgZGlzdCBpcyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovCisgICAgICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpOworICAgICAgICAgICAgQXNzZXJ0IChjb2RlIDwgRF9DT0RFUywgImJhZCBkX2NvZGUiKTsKKworICAgICAgICAgICAgc2VuZF9jb2RlKGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGlzdCAtPSBiYXNlX2Rpc3RbY29kZV07CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKGRpc3QsIGV4dHJhKTsgICAvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gLyogbGl0ZXJhbCBvciBtYXRjaCBwYWlyID8gKi8KKyAgICAgICAgZmxhZyA+Pj0gMTsKKyAgICB9IHdoaWxlIChseCA8IGxhc3RfbGl0KTsKKworICAgIHNlbmRfY29kZShFTkRfQkxPQ0ssIGx0cmVlKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgdGhlIGZpbGUgdHlwZSB0byBBU0NJSSBvciBCSU5BUlksIHVzaW5nIGEgY3J1ZGUgYXBwcm94aW1hdGlvbjoKKyAqIGJpbmFyeSBpZiBtb3JlIHRoYW4gMjAlIG9mIHRoZSBieXRlcyBhcmUgPD0gNiBvciA+PSAxMjgsIGFzY2lpIG90aGVyd2lzZS4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0IGFuZCB0aGUgdG90YWwgb2YgYWxsCisgKiBmcmVxdWVuY2llcyBkb2VzIG5vdCBleGNlZWQgNjRLICh0byBmaXQgaW4gYW4gaW50IG9uIDE2IGJpdCBtYWNoaW5lcykuCisgKi8KK2xvY2FsIHZvaWQgc2V0X2ZpbGVfdHlwZSgpCit7CisgICAgaW50IG4gPSAwOworICAgIHVuc2lnbmVkIGFzY2lpX2ZyZXEgPSAwOworICAgIHVuc2lnbmVkIGJpbl9mcmVxID0gMDsKKyAgICB3aGlsZSAobiA8IDcpICAgICAgICBiaW5fZnJlcSArPSBkeW5fbHRyZWVbbisrXS5GcmVxOworICAgIHdoaWxlIChuIDwgMTI4KSAgICBhc2NpaV9mcmVxICs9IGR5bl9sdHJlZVtuKytdLkZyZXE7CisgICAgd2hpbGUgKG4gPCBMSVRFUkFMUykgYmluX2ZyZXEgKz0gZHluX2x0cmVlW24rK10uRnJlcTsKKyAgICAqZmlsZV90eXBlID0gYmluX2ZyZXEgPiAoYXNjaWlfZnJlcSA+PiAyKSA/IEJJTkFSWSA6IEFTQ0lJOworICAgIGlmICgqZmlsZV90eXBlID09IEJJTkFSWSAmJiB0cmFuc2xhdGVfZW9sKSB7CisgICAgICAgIHdhcm4oIi1sIHVzZWQgb24gYmluYXJ5IGZpbGUiLCAiIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvdW56aXAuYyBiL3Vzci9nemlwL3VuemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMTRhMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9nemlwL3VuemlwLmMKQEAgLTAsMCArMSw3NyBAQAorLyogdW56aXAuYyAtLSBkZWNvbXByZXNzIGZpbGVzIGluIGd6aXAgb3IgcGt6aXAgZm9ybWF0LgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTMgSmVhbi1sb3VwIEdhaWxseQorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqCisgKiBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBmaWxlIGZ1bnppcC5jIHdyaXR0ZW4KKyAqIGFuZCBwdXQgaW4gdGhlIHB1YmxpYyBkb21haW4gYnkgTWFyayBBZGxlci4KKyAqLworCisvKgorICAgVGhpcyB2ZXJzaW9uIGNhbiBleHRyYWN0IGZpbGVzIGluIGd6aXAgZm9ybWF0LgorICAgT25seSB0aGUgZmlyc3QgZW50cnkgaXMgZXh0cmFjdGVkLCBhbmQgaXQgaGFzIHRvIGJlCisgICBlaXRoZXIgZGVmbGF0ZWQgb3Igc3RvcmVkLgorICovCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHVuemlwLmMsdiAxLjEgMjAwMi8wOC8xOCAwMDo1OToyMSBocGEgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlICJ0YWlsb3IuaCIKKyNpbmNsdWRlICJnemlwLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW56aXAgaW4gdG8gb3V0LiAgVGhpcyByb3V0aW5lIHdvcmtzIG9uIGd6aXAgZmlsZXMgb25seS4KKyAqCisgKiBJTiBhc3NlcnRpb25zOiB0aGUgYnVmZmVyIGluYnVmIGNvbnRhaW5zIGFscmVhZHkgdGhlIGJlZ2lubmluZyBvZgorICogICB0aGUgY29tcHJlc3NlZCBkYXRhLCBmcm9tIG9mZnNldHMgaW5wdHIgdG8gaW5zaXplLTEgaW5jbHVkZWQuCisgKiAgIFRoZSBtYWdpYyBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLiBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBjbGVhcmVkLgorICovCitpbnQgdW56aXAoaW4sIG91dCkKKyAgICBpbnQgaW4sIG91dDsgICAvKiBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgZGVzY3JpcHRvcnMgKi8KK3sKKyAgICB1bGcgb3JpZ19jcmMgPSAwOyAgICAgICAvKiBvcmlnaW5hbCBjcmMgKi8KKyAgICB1bGcgb3JpZ19sZW4gPSAwOyAgICAgICAvKiBvcmlnaW5hbCB1bmNvbXByZXNzZWQgbGVuZ3RoICovCisgICAgaW50IG47CisgICAgdWNoIGJ1Zls4XTsgICAgICAgIC8qIGV4dGVuZGVkIGxvY2FsIGhlYWRlciAqLworCisgICAgaWZkID0gaW47CisgICAgb2ZkID0gb3V0OworCisgICAgdXBkY3JjKE5VTEwsIDApOyAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBjcmMgKi8KKworICAgIC8qIERlY29tcHJlc3MgKi8KKyAgICBpZiAobWV0aG9kID09IERFRkxBVEVEKSAgeworCisJaW50IHJlcyA9IGluZmxhdGUoKTsKKworCWlmIChyZXMgPT0gMykgeworCSAgICBlcnJvcigib3V0IG9mIG1lbW9yeSIpOworCX0gZWxzZSBpZiAocmVzICE9IDApIHsKKwkgICAgZXJyb3IoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1mb3JtYXQgdmlvbGF0ZWQiKTsKKwl9CisKKyAgICB9IGVsc2UgeworCWVycm9yKCJpbnRlcm5hbCBlcnJvciwgaW52YWxpZCBtZXRob2QiKTsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIGNyYyBhbmQgb3JpZ2luYWwgbGVuZ3RoICovCisgICAgLyogY3JjMzIgIChzZWUgYWxnb3JpdGhtLmRvYykKKyAgICAgKiB1bmNvbXByZXNzZWQgaW5wdXQgc2l6ZSBtb2R1bG8gMl4zMgorICAgICAqLworICAgIGZvciAobiA9IDA7IG4gPCA4OyBuKyspIHsKKwlidWZbbl0gPSAodWNoKWdldF9ieXRlKCk7IC8qIG1heSBjYXVzZSBhbiBlcnJvciBpZiBFT0YgKi8KKyAgICB9CisgICAgb3JpZ19jcmMgPSBMRyhidWYpOworICAgIG9yaWdfbGVuID0gTEcoYnVmKzQpOworCisgICAgLyogVmFsaWRhdGUgZGVjb21wcmVzc2lvbiAqLworICAgIGlmIChvcmlnX2NyYyAhPSB1cGRjcmMob3V0YnVmLCAwKSkgeworCWVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YS0tY3JjIGVycm9yIik7CisgICAgfQorICAgIGlmIChvcmlnX2xlbiAhPSAodWxnKWJ5dGVzX291dCkgeworCWVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YS0tbGVuZ3RoIGVycm9yIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQpkaWZmIC0tZ2l0IGEvdXNyL2d6aXAvdXRpbC5jIGIvdXNyL2d6aXAvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZmY2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC91dGlsLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8qIHV0aWwuYyAtLSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZ3ppcCBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHV0aWwuYyx2IDEuMSAyMDAyLzA4LzE4IDAwOjU5OjIxIGhwYSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgInRhaWxvci5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImd6aXAuaCIKKworZXh0ZXJuIHVsZyBjcmNfMzJfdGFiW107ICAgLyogY3JjIHRhYmxlLCBkZWZpbmVkIGJlbG93ICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSBpbnB1dCB0byBvdXRwdXQgdW5jaGFuZ2VkOiB6Y2F0ID09IGNhdCB3aXRoIC0tZm9yY2UuCisgKiBJTiBhc3NlcnRpb246IGluc2l6ZSBieXRlcyBoYXZlIGFscmVhZHkgYmVlbiByZWFkIGluIGluYnVmLgorICovCitpbnQgY29weShpbiwgb3V0KQorICAgIGludCBpbiwgb3V0OyAgIC8qIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBkZXNjcmlwdG9ycyAqLworeworICAgIGVycm5vID0gMDsKKyAgICB3aGlsZSAoaW5zaXplICE9IDAgJiYgKGludClpbnNpemUgIT0gRU9GKSB7CisJd3JpdGVfYnVmKG91dCwgKGNoYXIqKWluYnVmLCBpbnNpemUpOworCWJ5dGVzX291dCArPSBpbnNpemU7CisJaW5zaXplID0gcmVhZChpbiwgKGNoYXIqKWluYnVmLCBJTkJVRlNJWik7CisgICAgfQorICAgIGlmICgoaW50KWluc2l6ZSA9PSBFT0YgJiYgZXJybm8gIT0gMCkgeworCXJlYWRfZXJyb3IoKTsKKyAgICB9CisgICAgYnl0ZXNfaW4gPSBieXRlc19vdXQ7CisgICAgcmV0dXJuIE9LOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJ1biBhIHNldCBvZiBieXRlcyB0aHJvdWdoIHRoZSBjcmMgc2hpZnQgcmVnaXN0ZXIuICBJZiBzIGlzIGEgTlVMTAorICogcG9pbnRlciwgdGhlbiBpbml0aWFsaXplIHRoZSBjcmMgc2hpZnQgcmVnaXN0ZXIgY29udGVudHMgaW5zdGVhZC4KKyAqIFJldHVybiB0aGUgY3VycmVudCBjcmMgaW4gZWl0aGVyIGNhc2UuCisgKi8KK3VsZyB1cGRjcmMocywgbikKKyAgICB1Y2ggKnM7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ5dGVzIHRvIHB1bXAgdGhyb3VnaCAqLworICAgIHVuc2lnbmVkIG47ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBpbiBzW10gKi8KK3sKKyAgICByZWdpc3RlciB1bGcgYzsgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKworICAgIHN0YXRpYyB1bGcgY3JjID0gKHVsZykweGZmZmZmZmZmTDsgLyogc2hpZnQgcmVnaXN0ZXIgY29udGVudHMgKi8KKworICAgIGlmIChzID09IE5VTEwpIHsKKwljID0gMHhmZmZmZmZmZkw7CisgICAgfSBlbHNlIHsKKwljID0gY3JjOworICAgICAgICBpZiAobikgZG8geworICAgICAgICAgICAgYyA9IGNyY18zMl90YWJbKChpbnQpYyBeICgqcysrKSkgJiAweGZmXSBeIChjID4+IDgpOworICAgICAgICB9IHdoaWxlICgtLW4pOworICAgIH0KKyAgICBjcmMgPSBjOworICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7ICAgICAgIC8qIChpbnN0ZWFkIG9mIH5jIGZvciA2NC1iaXQgbWFjaGluZXMpICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2xlYXIgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgKi8KK3ZvaWQgY2xlYXJfYnVmcygpCit7CisgICAgb3V0Y250ID0gMDsKKyAgICBpbnNpemUgPSBpbnB0ciA9IDA7CisgICAgYnl0ZXNfaW4gPSBieXRlc19vdXQgPSAwTDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LgorICovCitpbnQgZmlsbF9pbmJ1Zihlb2Zfb2spCisgICAgaW50IGVvZl9vazsgICAgICAgICAgLyogc2V0IGlmIEVPRiBhY2NlcHRhYmxlIGFzIGEgcmVzdWx0ICovCit7CisgICAgaW50IGxlbjsKKworICAgIC8qIFJlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZSAqLworICAgIGluc2l6ZSA9IDA7CisgICAgZXJybm8gPSAwOworICAgIGRvIHsKKwlsZW4gPSByZWFkKGlmZCwgKGNoYXIqKWluYnVmK2luc2l6ZSwgSU5CVUZTSVotaW5zaXplKTsKKyAgICAgICAgaWYgKGxlbiA9PSAwIHx8IGxlbiA9PSBFT0YpIGJyZWFrOworCWluc2l6ZSArPSBsZW47CisgICAgfSB3aGlsZSAoaW5zaXplIDwgSU5CVUZTSVopOworCisgICAgaWYgKGluc2l6ZSA9PSAwKSB7CisJaWYgKGVvZl9vaykgcmV0dXJuIEVPRjsKKwlyZWFkX2Vycm9yKCk7CisgICAgfQorICAgIGJ5dGVzX2luICs9ICh1bGcpaW5zaXplOworICAgIGlucHRyID0gMTsKKyAgICByZXR1cm4gaW5idWZbMF07Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdGUgdGhlIG91dHB1dCBidWZmZXIgb3V0YnVmWzAuLm91dGNudC0xXSBhbmQgdXBkYXRlIGJ5dGVzX291dC4KKyAqICh1c2VkIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIG9ubHkpCisgKi8KK3ZvaWQgZmx1c2hfb3V0YnVmKCkKK3sKKyAgICBpZiAob3V0Y250ID09IDApIHJldHVybjsKKworICAgIHdyaXRlX2J1ZihvZmQsIChjaGFyICopb3V0YnVmLCBvdXRjbnQpOworICAgIGJ5dGVzX291dCArPSAodWxnKW91dGNudDsKKyAgICBvdXRjbnQgPSAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIHRoZSBvdXRwdXQgd2luZG93IHdpbmRvd1swLi5vdXRjbnQtMV0gYW5kIHVwZGF0ZSBjcmMgYW5kIGJ5dGVzX291dC4KKyAqIChVc2VkIGZvciB0aGUgZGVjb21wcmVzc2VkIGRhdGEgb25seS4pCisgKi8KK3ZvaWQgZmx1c2hfd2luZG93KCkKK3sKKyAgICBpZiAob3V0Y250ID09IDApIHJldHVybjsKKyAgICB1cGRjcmMod2luZG93LCBvdXRjbnQpOworCisgICAgaWYgKCF0ZXN0KSB7CisJd3JpdGVfYnVmKG9mZCwgKGNoYXIgKil3aW5kb3csIG91dGNudCk7CisgICAgfQorICAgIGJ5dGVzX291dCArPSAodWxnKW91dGNudDsKKyAgICBvdXRjbnQgPSAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERvZXMgdGhlIHNhbWUgYXMgd3JpdGUoKSwgYnV0IGFsc28gaGFuZGxlcyBwYXJ0aWFsIHBpcGUgd3JpdGVzIGFuZCBjaGVja3MKKyAqIGZvciBlcnJvciByZXR1cm4uCisgKi8KK3ZvaWQgd3JpdGVfYnVmKGZkLCBidWYsIGNudCkKKyAgICBpbnQgICAgICAgZmQ7CisgICAgdm9pZHAgICAgIGJ1ZjsKKyAgICB1bnNpZ25lZCAgY250OworeworICAgIHVuc2lnbmVkICBuOworCisgICAgd2hpbGUgKChuID0gd3JpdGUoZmQsIGJ1ZiwgY250KSkgIT0gY250KSB7CisJaWYgKG4gPT0gKHVuc2lnbmVkKSgtMSkpIHsKKwkgICAgd3JpdGVfZXJyb3IoKTsKKwl9CisJY250IC09IG47CisJYnVmID0gKHZvaWRwKSgoY2hhciopYnVmK24pOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQdXQgc3RyaW5nIHMgaW4gbG93ZXIgY2FzZSwgcmV0dXJuIHMuCisgKi8KK2NoYXIgKnN0cmx3cihzKQorICAgIGNoYXIgKnM7Cit7CisgICAgY2hhciAqdDsKKyAgICBmb3IgKHQgPSBzOyAqdDsgdCsrKSAqdCA9IHRvbG93KCp0KTsKKyAgICByZXR1cm4gczsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXR1cm4gdGhlIGJhc2UgbmFtZSBvZiBhIGZpbGUgKHJlbW92ZSBhbnkgZGlyZWN0b3J5IHByZWZpeCBhbmQKKyAqIGFueSB2ZXJzaW9uIHN1ZmZpeCkuIEZvciBzeXN0ZW1zIHdpdGggZmlsZSBuYW1lcyB0aGF0IGFyZSBub3QKKyAqIGNhc2Ugc2Vuc2l0aXZlLCBmb3JjZSB0aGUgYmFzZSBuYW1lIHRvIGxvd2VyIGNhc2UuCisgKi8KK2NoYXIgKmJhc2VuYW1lKGZuYW1lKQorICAgIGNoYXIgKmZuYW1lOworeworICAgIGNoYXIgKnA7CisKKyAgICBpZiAoKHAgPSBzdHJyY2hyKGZuYW1lLCBQQVRIX1NFUCkpICAhPSBOVUxMKSBmbmFtZSA9IHArMTsKKyAgICBpZiAoY2FzZW1hcCgnQScpID09ICdhJykgc3RybHdyKGZuYW1lKTsKKyAgICByZXR1cm4gZm5hbWU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIChpZiBhbnkpIGJlZm9yZSBhcmd2LCBhbmQgdXBkYXRlIGFyZ2MuCisgKiBSZXR1cm4gdGhlIGV4cGFuZGVkIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGJlIGZyZWVkIGxhdGVyLCBvciBOVUxMCisgKiBpZiBubyBvcHRpb25zIHdlcmUgYWRkZWQgdG8gYXJndi4KKyAqLworI2RlZmluZSBTRVBBUkFUT1IJIiBcdCIJLyogc2VwYXJhdG9ycyBpbiBlbnYgdmFyaWFibGUgKi8KKworY2hhciAqYWRkX2Vudm9wdChhcmdjcCwgYXJndnAsIGVudikKKyAgICBpbnQgKmFyZ2NwOyAgICAgICAgICAvKiBwb2ludGVyIHRvIGFyZ2MgKi8KKyAgICBjaGFyICoqKmFyZ3ZwOyAgICAgICAvKiBwb2ludGVyIHRvIGFyZ3YgKi8KKyAgICBjaGFyICplbnY7ICAgICAgICAgICAvKiBuYW1lIG9mIGVudmlyb25tZW50IHZhcmlhYmxlICovCit7CisgICAgY2hhciAqcDsgICAgICAgICAgICAgLyogcnVubmluZyBwb2ludGVyIHRocm91Z2ggZW52IHZhcmlhYmxlICovCisgICAgY2hhciAqKm9hcmd2OyAgICAgICAgLyogcnVucyB0aHJvdWdoIG9sZCBhcmd2IGFycmF5ICovCisgICAgY2hhciAqKm5hcmd2OyAgICAgICAgLyogcnVucyB0aHJvdWdoIG5ldyBhcmd2IGFycmF5ICovCisgICAgaW50CSBvYXJnYyA9ICphcmdjcDsgLyogb2xkIGFyZ2MgKi8KKyAgICBpbnQgIG5hcmdjID0gMDsgICAgICAvKiBudW1iZXIgb2YgYXJndW1lbnRzIGluIGVudiB2YXJpYWJsZSAqLworCisgICAgZW52ID0gKGNoYXIqKWdldGVudihlbnYpOworICAgIGlmIChlbnYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBwID0gKGNoYXIqKXhtYWxsb2Moc3RybGVuKGVudikrMSk7CisgICAgZW52ID0gc3RyY3B5KHAsIGVudik7ICAgICAgICAgICAgICAgICAgICAvKiBrZWVwIGVudiB2YXJpYWJsZSBpbnRhY3QgKi8KKworICAgIGZvciAocCA9IGVudjsgKnA7IG5hcmdjKysgKSB7ICAgICAgICAgICAgLyogbW92ZSB0aHJvdWdoIGVudiAqLworCXAgKz0gc3Ryc3BuKHAsIFNFUEFSQVRPUik7CSAgICAgLyogc2tpcCBsZWFkaW5nIHNlcGFyYXRvcnMgKi8KKwlpZiAoKnAgPT0gJ1wwJykgYnJlYWs7CisKKwlwICs9IHN0cmNzcG4ocCwgU0VQQVJBVE9SKTsJICAgICAvKiBmaW5kIGVuZCBvZiB3b3JkICovCisJaWYgKCpwKSAqcCsrID0gJ1wwJzsJCSAgICAgLyogbWFyayBpdCAqLworICAgIH0KKyAgICBpZiAobmFyZ2MgPT0gMCkgeworCWZyZWUoZW52KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKmFyZ2NwICs9IG5hcmdjOworICAgIC8qIEFsbG9jYXRlIHRoZSBuZXcgYXJndiBhcnJheSwgd2l0aCBhbiBleHRyYSBlbGVtZW50IGp1c3QgaW4gY2FzZQorICAgICAqIHRoZSBvcmlnaW5hbCBhcmcgbGlzdCBkaWQgbm90IGVuZCB3aXRoIGEgTlVMTC4KKyAgICAgKi8KKyAgICBuYXJndiA9IChjaGFyKiopY2FsbG9jKCphcmdjcCsxLCBzaXplb2YoY2hhciAqKSk7CisgICAgaWYgKG5hcmd2ID09IE5VTEwpIGVycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisgICAgb2FyZ3YgID0gKmFyZ3ZwOworICAgICphcmd2cCA9IG5hcmd2OworCisgICAgLyogQ29weSB0aGUgcHJvZ3JhbSBuYW1lIGZpcnN0ICovCisgICAgaWYgKG9hcmdjLS0gPCAwKSBlcnJvcigiYXJnYzw9MCIpOworICAgICoobmFyZ3YrKykgPSAqKG9hcmd2KyspOworCisgICAgLyogVGhlbiBjb3B5IHRoZSBlbnZpcm9ubWVudCBhcmdzICovCisgICAgZm9yIChwID0gZW52OyBuYXJnYyA+IDA7IG5hcmdjLS0pIHsKKwlwICs9IHN0cnNwbihwLCBTRVBBUkFUT1IpOwkgICAgIC8qIHNraXAgc2VwYXJhdG9ycyAqLworCSoobmFyZ3YrKykgPSBwOwkJCSAgICAgLyogc3RvcmUgc3RhcnQgKi8KKwl3aGlsZSAoKnArKykgOwkJCSAgICAgLyogc2tpcCBvdmVyIHdvcmQgKi8KKyAgICB9CisKKyAgICAvKiBGaW5hbGx5IGNvcHkgdGhlIG9sZCBhcmdzIGFuZCBhZGQgYSBOVUxMICh1c3VhbCBjb252ZW50aW9uKSAqLworICAgIHdoaWxlIChvYXJnYy0tKSAqKG5hcmd2KyspID0gKihvYXJndisrKTsKKyAgICAqbmFyZ3YgPSBOVUxMOworICAgIHJldHVybiBlbnY7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXJyb3IgaGFuZGxlcnMuCisgKi8KK3ZvaWQgZXJyb3IobSkKKyAgICBjaGFyICptOworeworICAgIGZwcmludGYoc3RkZXJyLCAiXG4lczogJXM6ICVzXG4iLCBwcm9nbmFtZSwgaWZuYW1lLCBtKTsKKyAgICBhYm9ydF9nemlwKCk7Cit9CisKK3ZvaWQgd2FybihhLCBiKQorICAgIGNoYXIgKmEsICpiOyAgICAgICAgICAgIC8qIG1lc3NhZ2Ugc3RyaW5ncyBqdXh0YXBvc2VkIGluIG91dHB1dCAqLworeworICAgIFdBUk4oKHN0ZGVyciwgIiVzOiAlczogd2FybmluZzogJXMlc1xuIiwgcHJvZ25hbWUsIGlmbmFtZSwgYSwgYikpOworfQorCit2b2lkIHJlYWRfZXJyb3IoKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiXG4lczogIiwgcHJvZ25hbWUpOworICAgIGlmIChlcnJubyAhPSAwKSB7CisJcGVycm9yKGlmbmFtZSk7CisgICAgfSBlbHNlIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlXG4iLCBpZm5hbWUpOworICAgIH0KKyAgICBhYm9ydF9nemlwKCk7Cit9CisKK3ZvaWQgd3JpdGVfZXJyb3IoKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiXG4lczogIiwgcHJvZ25hbWUpOworICAgIHBlcnJvcihvZm5hbWUpOworICAgIGFib3J0X2d6aXAoKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXNwbGF5IGNvbXByZXNzaW9uIHJhdGlvIG9uIHRoZSBnaXZlbiBzdHJlYW0gb24gNiBjaGFyYWN0ZXJzLgorICovCit2b2lkIGRpc3BsYXlfcmF0aW8obnVtLCBkZW4sIGZpbGUpCisgICAgbG9uZyBudW07CisgICAgbG9uZyBkZW47CisgICAgRklMRSAqZmlsZTsKK3sKKyAgICBsb25nIHJhdGlvOyAgLyogMTAwMCB0aW1lcyB0aGUgY29tcHJlc3Npb24gcmF0aW8gKi8KKyAgICBjaGFyIHNpZ247CisKKyAgICBpZiAoZGVuID09IDApIHsKKwlyYXRpbyA9IDA7IC8qIG5vIGNvbXByZXNzaW9uICovCisgICAgfSBlbHNlIGlmIChkZW4gPCAyMTQ3NDgzTCkgeyAvKiAoMioqMzEgLTEpLzEwMDAgKi8KKwlyYXRpbyA9IDEwMDBMKm51bS9kZW47CisgICAgfSBlbHNlIHsKKwlyYXRpbyA9IG51bS8oZGVuLzEwMDBMKTsKKyAgICB9CisgICAgaWYgKHJhdGlvIDwgMCkgeworCXNpZ24gPSAnLSc7CisJcmF0aW8gPSAtcmF0aW87CisgICAgfSBlbHNlIHsKKwlzaWduID0gJyAnOworICAgIH0KKyAgICBmcHJpbnRmKGZpbGUsICIlYyUybGQuJTFsZCUlIiwgc2lnbiwgcmF0aW8gLyAxMEwsIHJhdGlvICUgMTBMKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbWktc2FmZSBtYWxsb2MgLS0gbmV2ZXIgcmV0dXJucyBOVUxMLgorICovCit2b2lkcCB4bWFsbG9jIChzaXplKQorICAgIHVuc2lnbmVkIHNpemU7Cit7CisgICAgdm9pZHAgY3AgPSAodm9pZHApbWFsbG9jIChzaXplKTsKKworICAgIGlmIChjcCA9PSBOVUxMKSBlcnJvcigib3V0IG9mIG1lbW9yeSIpOworICAgIHJldHVybiBjcDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUYWJsZSBvZiBDUkMtMzIncyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzIChtYWRlIGJ5IG1ha2VjcmMuYykKKyAqLwordWxnIGNyY18zMl90YWJbXSA9IHsKKyAgMHgwMDAwMDAwMEwsIDB4NzcwNzMwOTZMLCAweGVlMGU2MTJjTCwgMHg5OTA5NTFiYUwsIDB4MDc2ZGM0MTlMLAorICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgIDB4ZTBkNWU5MWVMLCAweDk3ZDJkOTg4TCwgMHgwOWI2NGMyYkwsIDB4N2ViMTdjYmRMLCAweGU3YjgyZDA3TCwKKyAgMHg5MGJmMWQ5MUwsIDB4MWRiNzEwNjRMLCAweDZhYjAyMGYyTCwgMHhmM2I5NzE0OEwsIDB4ODRiZTQxZGVMLAorICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgIDB4NjQ2YmE4YzBMLCAweGZkNjJmOTdhTCwgMHg4YTY1YzllY0wsIDB4MTQwMTVjNGZMLCAweDYzMDY2Y2Q5TCwKKyAgMHhmYTBmM2Q2M0wsIDB4OGQwODBkZjVMLCAweDNiNmUyMGM4TCwgMHg0YzY5MTA1ZUwsIDB4ZDU2MDQxZTRMLAorICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgIDB4MzViNWE4ZmFMLCAweDQyYjI5ODZjTCwgMHhkYmJiYzlkNkwsIDB4YWNiY2Y5NDBMLCAweDMyZDg2Y2UzTCwKKyAgMHg0NWRmNWM3NUwsIDB4ZGNkNjBkY2ZMLCAweGFiZDEzZDU5TCwgMHgyNmQ5MzBhY0wsIDB4NTFkZTAwM2FMLAorICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgIDB4YjhiZGE1MGZMLCAweDI4MDJiODllTCwgMHg1ZjA1ODgwOEwsIDB4YzYwY2Q5YjJMLCAweGIxMGJlOTI0TCwKKyAgMHgyZjZmN2M4N0wsIDB4NTg2ODRjMTFMLCAweGMxNjExZGFiTCwgMHhiNjY2MmQzZEwsIDB4NzZkYzQxOTBMLAorICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgIDB4OWZiZmU0YTVMLCAweGU4YjhkNDMzTCwgMHg3ODA3YzlhMkwsIDB4MGYwMGY5MzRMLCAweDk2MDlhODhlTCwKKyAgMHhlMTBlOTgxOEwsIDB4N2Y2YTBkYmJMLCAweDA4NmQzZDJkTCwgMHg5MTY0NmM5N0wsIDB4ZTY2MzVjMDFMLAorICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgIDB4MWIwMWE1N2JMLCAweDgyMDhmNGMxTCwgMHhmNTBmYzQ1N0wsIDB4NjViMGQ5YzZMLCAweDEyYjdlOTUwTCwKKyAgMHg4YmJlYjhlYUwsIDB4ZmNiOTg4N2NMLCAweDYyZGQxZGRmTCwgMHgxNWRhMmQ0OUwsIDB4OGNkMzdjZjNMLAorICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgIDB4NGFkZmE1NDFMLCAweDNkZDg5NWQ3TCwgMHhhNGQxYzQ2ZEwsIDB4ZDNkNmY0ZmJMLCAweDQzNjllOTZhTCwKKyAgMHgzNDZlZDlmY0wsIDB4YWQ2Nzg4NDZMLCAweGRhNjBiOGQwTCwgMHg0NDA0MmQ3M0wsIDB4MzMwMzFkZTVMLAorICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgIDB4YzkwYzIwODZMLCAweDU3NjhiNTI1TCwgMHgyMDZmODViM0wsIDB4Yjk2NmQ0MDlMLCAweGNlNjFlNDlmTCwKKyAgMHg1ZWRlZjkwZUwsIDB4MjlkOWM5OThMLCAweGIwZDA5ODIyTCwgMHhjN2Q3YThiNEwsIDB4NTliMzNkMTdMLAorICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgIDB4MDNiNmUyMGNMLCAweDc0YjFkMjlhTCwgMHhlYWQ1NDczOUwsIDB4OWRkMjc3YWZMLCAweDA0ZGIyNjE1TCwKKyAgMHg3M2RjMTY4M0wsIDB4ZTM2MzBiMTJMLCAweDk0NjQzYjg0TCwgMHgwZDZkNmEzZUwsIDB4N2E2YTVhYThMLAorICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgIDB4ODcwOGEzZDJMLCAweDFlMDFmMjY4TCwgMHg2OTA2YzJmZUwsIDB4Zjc2MjU3NWRMLCAweDgwNjU2N2NiTCwKKyAgMHgxOTZjMzY3MUwsIDB4NmU2YjA2ZTdMLCAweGZlZDQxYjc2TCwgMHg4OWQzMmJlMEwsIDB4MTBkYTdhNWFMLAorICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgIDB4ZDZkNmEzZThMLCAweGExZDE5MzdlTCwgMHgzOGQ4YzJjNEwsIDB4NGZkZmYyNTJMLCAweGQxYmI2N2YxTCwKKyAgMHhhNmJjNTc2N0wsIDB4M2ZiNTA2ZGRMLCAweDQ4YjIzNjRiTCwgMHhkODBkMmJkYUwsIDB4YWYwYTFiNGNMLAorICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgIDB4NDY2OWJlNzlMLCAweGNiNjFiMzhjTCwgMHhiYzY2ODMxYUwsIDB4MjU2ZmQyYTBMLCAweDUyNjhlMjM2TCwKKyAgMHhjYzBjNzc5NUwsIDB4YmIwYjQ3MDNMLCAweDIyMDIxNmI5TCwgMHg1NTA1MjYyZkwsIDB4YzViYTNiYmVMLAorICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgIDB4MmNkOTllOGJMLCAweDViZGVhZTFkTCwgMHg5YjY0YzJiMEwsIDB4ZWM2M2YyMjZMLCAweDc1NmFhMzljTCwKKyAgMHgwMjZkOTMwYUwsIDB4OWMwOTA2YTlMLCAweGViMGUzNjNmTCwgMHg3MjA3Njc4NUwsIDB4MDUwMDU3MTNMLAorICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgIDB4ZTVkNWJlMGRMLCAweDdjZGNlZmI3TCwgMHgwYmRiZGYyMUwsIDB4ODZkM2QyZDRMLCAweGYxZDRlMjQyTCwKKyAgMHg2OGRkYjNmOEwsIDB4MWZkYTgzNmVMLCAweDgxYmUxNmNkTCwgMHhmNmI5MjY1YkwsIDB4NmZiMDc3ZTFMLAorICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgIDB4OGY2NTllZmZMLCAweGY4NjJhZTY5TCwgMHg2MTZiZmZkM0wsIDB4MTY2Y2NmNDVMLCAweGEwMGFlMjc4TCwKKyAgMHhkNzBkZDJlZUwsIDB4NGUwNDgzNTRMLCAweDM5MDNiM2MyTCwgMHhhNzY3MjY2MUwsIDB4ZDA2MDE2ZjdMLAorICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgIDB4MzdkODNiZjBMLCAweGE5YmNhZTUzTCwgMHhkZWJiOWVjNUwsIDB4NDdiMmNmN2ZMLCAweDMwYjVmZmU5TCwKKyAgMHhiZGJkZjIxY0wsIDB4Y2FiYWMyOGFMLCAweDUzYjM5MzMwTCwgMHgyNGI0YTNhNkwsIDB4YmFkMDM2MDVMLAorICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgIDB4NWQ2ODFiMDJMLCAweDJhNmYyYjk0TCwgMHhiNDBiYmUzN0wsIDB4YzMwYzhlYTFMLCAweDVhMDVkZjFiTCwKKyAgMHgyZDAyZWY4ZEwKK307CmRpZmYgLS1naXQgYS91c3IvZ3ppcC96aXAuYyBiL3Vzci9nemlwL3ppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzk0YzIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvZ3ppcC96aXAuYwpAQCAtMCwwICsxLDExMCBAQAorLyogemlwLmMgLS0gY29tcHJlc3MgZmlsZXMgdG8gdGhlIGd6aXAgb3IgcGt6aXAgZm9ybWF0CisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHppcC5jLHYgMS4xIDIwMDIvMDgvMTggMDA6NTk6MjEgaHBhIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAidGFpbG9yLmgiCisjaW5jbHVkZSAiZ3ppcC5oIgorCitsb2NhbCB1bGcgY3JjOyAgICAgICAvKiBjcmMgb24gdW5jb21wcmVzc2VkIGZpbGUgZGF0YSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlZmxhdGUgaW4gdG8gb3V0LgorICogSU4gYXNzZXJ0aW9uczogdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgY2xlYXJlZC4KKyAqICAgVGhlIHZhcmlhYmxlcyB0aW1lX3N0YW1wIGFuZCBzYXZlX29yaWdfbmFtZSBhcmUgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCB6aXAoaW4sIG91dCkKKyAgICBpbnQgaW4sIG91dDsgICAgICAgICAgICAvKiBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgZGVzY3JpcHRvcnMgKi8KK3sKKyAgICB1Y2ggIGZsYWdzID0gMDsgICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdzICovCisgICAgdXNoICBhdHRyID0gMDsgICAgICAgICAgLyogYXNjaWkvYmluYXJ5IGZsYWcgKi8KKyAgICB1c2ggIGRlZmxhdGVfZmxhZ3MgPSAwOyAvKiBwa3ppcCAtZXMsIC1lbiBvciAtZXggZXF1aXZhbGVudCAqLworCisgICAgaWZkID0gaW47CisgICAgb2ZkID0gb3V0OworICAgIG91dGNudCA9IDA7CisKKyAgICAvKiBXcml0ZSB0aGUgaGVhZGVyIHRvIHRoZSBnemlwIGZpbGUuIFNlZSBhbGdvcml0aG0uZG9jIGZvciB0aGUgZm9ybWF0ICovCisKKyAgICBtZXRob2QgPSBERUZMQVRFRDsKKyAgICBwdXRfYnl0ZShHWklQX01BR0lDWzBdKTsgLyogbWFnaWMgaGVhZGVyICovCisgICAgcHV0X2J5dGUoR1pJUF9NQUdJQ1sxXSk7CisgICAgcHV0X2J5dGUoREVGTEFURUQpOyAgICAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCAqLworCisgICAgaWYgKHNhdmVfb3JpZ19uYW1lKSB7CisJZmxhZ3MgfD0gT1JJR19OQU1FOworICAgIH0KKyAgICBwdXRfYnl0ZShmbGFncyk7ICAgICAgICAgLyogZ2VuZXJhbCBmbGFncyAqLworICAgIHB1dF9sb25nKHRpbWVfc3RhbXApOworCisgICAgLyogV3JpdGUgZGVmbGF0ZWQgZmlsZSB0byB6aXAgZmlsZSAqLworICAgIGNyYyA9IHVwZGNyYygwLCAwKTsKKworICAgIGJpX2luaXQob3V0KTsKKyAgICBjdF9pbml0KCZhdHRyLCAmbWV0aG9kKTsKKyAgICBsbV9pbml0KGxldmVsLCAmZGVmbGF0ZV9mbGFncyk7CisKKyAgICBwdXRfYnl0ZSgodWNoKWRlZmxhdGVfZmxhZ3MpOyAvKiBleHRyYSBmbGFncyAqLworICAgIHB1dF9ieXRlKE9TX0NPREUpOyAgICAgICAgICAgIC8qIE9TIGlkZW50aWZpZXIgKi8KKworICAgIGlmIChzYXZlX29yaWdfbmFtZSkgeworCWNoYXIgKnAgPSBiYXNlbmFtZShpZm5hbWUpOyAvKiBEb24ndCBzYXZlIHRoZSBkaXJlY3RvcnkgcGFydC4gKi8KKwlkbyB7CisJICAgIHB1dF9jaGFyKCpwKTsKKwl9IHdoaWxlICgqcCsrKTsKKyAgICB9CisgICAgaGVhZGVyX2J5dGVzID0gKGxvbmcpb3V0Y250OworCisgICAgKHZvaWQpZGVmbGF0ZSgpOworCisjaWYgIWRlZmluZWQoTk9fU0laRV9DSEVDSykgJiYgIWRlZmluZWQoUkVDT1JEX0lPKQorICAvKiBDaGVjayBpbnB1dCBzaXplIChidXQgbm90IGluIFZNUyAtLSB2YXJpYWJsZSByZWNvcmQgbGVuZ3RocyBtZXNzIGl0IHVwKQorICAgKiBhbmQgbm90IG9uIE1TRE9TIC0tIGRpZXQgaW4gVFNSIG1vZGUgcmVwb3J0cyBhbiBpbmNvcnJlY3QgZmlsZSBzaXplKQorICAgKi8KKyAgICBpZiAoaWZpbGVfc2l6ZSAhPSAtMUwgJiYgaXNpemUgIT0gKHVsZylpZmlsZV9zaXplKSB7CisJVHJhY2UoKHN0ZGVyciwgIiBhY3R1YWw9JWxkLCByZWFkPSVsZCAiLCBpZmlsZV9zaXplLCBpc2l6ZSkpOworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiBmaWxlIHNpemUgY2hhbmdlZCB3aGlsZSB6aXBwaW5nXG4iLAorCQlwcm9nbmFtZSwgaWZuYW1lKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFdyaXRlIHRoZSBjcmMgYW5kIHVuY29tcHJlc3NlZCBzaXplICovCisgICAgcHV0X2xvbmcoY3JjKTsKKyAgICBwdXRfbG9uZyhpc2l6ZSk7CisgICAgaGVhZGVyX2J5dGVzICs9IDIqc2l6ZW9mKGxvbmcpOworCisgICAgZmx1c2hfb3V0YnVmKCk7CisgICAgcmV0dXJuIE9LOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBmaWxlLCBwZXJmb3JtIGVuZC1vZi1saW5lCisgKiB0cmFuc2xhdGlvbiwgYW5kIHVwZGF0ZSB0aGUgY3JjIGFuZCBpbnB1dCBmaWxlIHNpemUuCisgKiBJTiBhc3NlcnRpb246IHNpemUgPj0gMiAoZm9yIGVuZC1vZi1saW5lIHRyYW5zbGF0aW9uKQorICovCitpbnQgZmlsZV9yZWFkKGJ1Ziwgc2l6ZSkKKyAgICBjaGFyICpidWY7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICB1bnNpZ25lZCBsZW47CisKKyAgICBBc3NlcnQoaW5zaXplID09IDAsICJpbmJ1ZiBub3QgZW1wdHkiKTsKKworICAgIGxlbiA9IHJlYWQoaWZkLCBidWYsIHNpemUpOworICAgIGlmIChsZW4gPT0gKHVuc2lnbmVkKSgtMSkgfHwgbGVuID09IDApIHJldHVybiAoaW50KWxlbjsKKworICAgIGNyYyA9IHVwZGNyYygodWNoKilidWYsIGxlbik7CisgICAgaXNpemUgKz0gKHVsZylsZW47CisgICAgcmV0dXJuIChpbnQpbGVuOworfQpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvS2J1aWxkIGIvdXNyL2luY2x1ZGUvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjAwMjYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9LYnVpbGQKQEAgLTAsMCArMSwxMSBAQAorYWx3YXlzIDo9IGFzbQorCiskKG9iaikvYXNtOgorCUBlY2hvICcgIFNZTUxJTksgJEAgLT4gaW5jbHVkZS9hc20tJChLTElCQ0FTTUFSQ0gpJworCSQoUSlpZiBbICckKEtMSUJDS0VSTkVMU1JDKS4nIC1lZiAnJChvYmopLy4uLy4uJyBdOyB0aGVuIFwKKwkJbG4gLWZzbiAuLi8uLi9pbmNsdWRlL2FzbS0kKEtMSUJDQVNNQVJDSCkgJEA7IFwKKwkgZWxzZSBcCisJCWxuIC1mc24gJChLTElCQ0tFUk5FTFNSQykuL2luY2x1ZGUvYXNtLSQoS0xJQkNBU01BUkNIKSAkQDsgXAorCSBmaQorCitjbGVhbi1maWxlcyA6PSBhc20KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FsbG9jYS5oIGIvdXNyL2luY2x1ZGUvYWxsb2NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZjRjMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FsbG9jYS5oCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiBhbGxvY2EuaAorICoKKyAqIEp1c3QgY2FsbCB0aGUgYnVpbHRpbiBhbGxvY2EoKSBmdW5jdGlvbgorICovCisKKyNpZm5kZWYgX0FMTE9DQV9ICisjZGVmaW5lIF9BTExPQ0FfSAorCisjZGVmaW5lIGFsbG9jYShzaXplKSBfX2J1aWx0aW5fYWxsb2NhKHNpemUpCisKKyNlbmRpZgkJCQkvKiBfQUxMT0NBX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyZmVlMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisjZGVmaW5lIF9LTElCQ19VU0VfUlRfU0lHIDEKKyNkZWZpbmUgX0tMSUJDX1NUQVRGU19GX1RZUEVfNjQgMAorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzYzOGIzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIGFyY2gvYWxwaGEvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fczA7CisJdW5zaWduZWQgbG9uZyBfX3MxOworCXVuc2lnbmVkIGxvbmcgX19zMjsKKwl1bnNpZ25lZCBsb25nIF9fczM7CisJdW5zaWduZWQgbG9uZyBfX3M0OworCXVuc2lnbmVkIGxvbmcgX19zNTsKKwl1bnNpZ25lZCBsb25nIF9fZnA7CisJdW5zaWduZWQgbG9uZyBfX3JhOworCXVuc2lnbmVkIGxvbmcgX19ncDsKKwl1bnNpZ25lZCBsb25nIF9fc3A7CisKKwl1bnNpZ25lZCBsb25nIF9fZjI7CisJdW5zaWduZWQgbG9uZyBfX2YzOworCXVuc2lnbmVkIGxvbmcgX19mNDsKKwl1bnNpZ25lZCBsb25nIF9fZjU7CisJdW5zaWduZWQgbG9uZyBfX2Y2OworCXVuc2lnbmVkIGxvbmcgX19mNzsKKwl1bnNpZ25lZCBsb25nIF9fZjg7CisJdW5zaWduZWQgbG9uZyBfX2Y5OworfTsKKworLyogTXVzdCBiZSBhbiBhcnJheSBzbyBpdCB3aWxsIGRlY2F5IHRvIGEgcG9pbnRlciB3aGVuIGEgZnVuY3Rpb24gaXMgY2FsbGVkICovCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9hbHBoYS9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5M2EzNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL2FscGhhL2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorLyogTm8gc3BlY2lhbCBzdHVmZiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL2FscGhhL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlMjliZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCWxvbmcJCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibG9ja3M7CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisJdW5zaWduZWQgaW50CXN0X2Jsa3NpemU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCXVuc2lnbmVkIGludAlfX3BhZDA7CisKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKyAgCWxvbmcJCV9fdW51c2VkWzNdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2FscGhhL21hY2hpbmUvYXNtLmggYi91c3IvaW5jbHVkZS9hcmNoL2FscGhhL21hY2hpbmUvYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhZTRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYWxwaGEvbWFjaGluZS9hc20uaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogbWFjaGluZS9hc20uaAorICovCisKKyNpZm5kZWYgX01BQ0hJTkVfQVNNX0gKKyNkZWZpbmUgX01BQ0hJTkVfQVNNX0gKKworLyogU3RhbmRhcmQgYWxpYXNlcyBmb3IgQWxwaGEgcmVnaXN0ZXIgbmFtZXMgKi8KKworI2RlZmluZSB2MAkkMAorI2RlZmluZSB0MAkkMQorI2RlZmluZSB0MQkkMgorI2RlZmluZSB0MgkkMworI2RlZmluZSB0MwkkNAorI2RlZmluZSB0NAkkNQorI2RlZmluZSB0NQkkNgorI2RlZmluZSB0NgkkNworI2RlZmluZSB0NwkkOAorI2RlZmluZSBzMAkkOQorI2RlZmluZSBzMQkkMTAKKyNkZWZpbmUgczIJJDExCisjZGVmaW5lIHMzCSQxMgorI2RlZmluZSBzNAkkMTMKKyNkZWZpbmUgczUJJDE0CisjZGVmaW5lIGZwCSQxNQorI2RlZmluZSBhMAkkMTYKKyNkZWZpbmUgYTEJJDE3CisjZGVmaW5lIGEyCSQxOAorI2RlZmluZSBhMwkkMTkKKyNkZWZpbmUgYTQJJDIwCisjZGVmaW5lIGE1CSQyMQorI2RlZmluZSB0OAkkMjIKKyNkZWZpbmUgdDkJJDIzCisjZGVmaW5lIHQxMAkkMjQKKyNkZWZpbmUgdDExCSQyNQorI2RlZmluZSByYQkkMjYKKyNkZWZpbmUgdDEyCSQyNwkJLyogdDEyIGFuZCBwdiBhcmUgYm90aCB1c2VkIGZvciAkMjcgKi8KKyNkZWZpbmUgcHYJJDI3CQkvKiB0MTIgYW5kIHB2IGFyZSBib3RoIHVzZWQgZm9yICQyNyAqLworI2RlZmluZSBhdAkkMjgKKyNkZWZpbmUgZ3AJJDI5CisjZGVmaW5lIHNwCSQzMAorI2RlZmluZSB6ZXJvCSQzMQorCisjZW5kaWYJCQkJLyogX01BQ0hJTkVfQVNNX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzRiZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogQWxsIGRlZmF1bHRzICovCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYjhhMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9pMzg2L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgaW50IHJlZ3NbMTBdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg5NTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL2FybS9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIE5vIHNwZWNpYWwgc3R1ZmYgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViYmM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLCBoZW5jZSB0aGUgYWJzb2x1dGVseQorICogaW5zYW5lIGFtb3VudHMgb2YgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4KKyAqIE5vdGU6IFRoZSBrZXJuZWwgemVybydzIHRoZSBwYWRkZWQgcmVnaW9uIGJlY2F1c2UgZ2xpYmMgbWlnaHQgcmVhZCB0aGVtCisgKiBpbiB0aGUgaG9wZSB0aGF0IHRoZSBrZXJuZWwgaGFzIHN0cmV0Y2hlZCB0byB1c2luZyBsYXJnZXIgc2l6ZXMuCisgKi8KKworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBjaGFyICAgX19wYWQwWzRdOworCisJdW5zaWduZWQgbG9uZwlfX3N0X2lubzsKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJdW5zaWduZWQgY2hhciAgIF9fcGFkM1s0XTsKKworCWxvbmcgbG9uZwlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZyAgc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXNtbWFjcm9zLmggYi91c3IvaW5jbHVkZS9hcmNoL2FybS9rbGliYy9hc21tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTIxYzk0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9hcm0va2xpYmMvYXNtbWFjcm9zLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIHVzci9pbmNsdWRlL2FyY2gvYXJtL2tsaWJjL2FzbW1hY3Jvcy5oCisgKgorICogQXNzZW1ibHkgbWFjcm9zIHVzZWQgYnkgQVJNIHN5c3RlbSBjYWxsIHN0dWJzCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVNNTUFDUk9TX0gKKyNkZWZpbmUgX0tMSUJDX0FTTU1BQ1JPU19ICisKKy8qIEFuIGltbWVkaWF0ZSBpbiBBUk0gY2FuIGJlIGFueSA4LWJpdCB2YWx1ZSByb3RhdGVkIGJ5IGFuIGV2ZW4gbnVtYmVyIG9mIGJpdHMgKi8KKworI2RlZmluZSBBUk1fVkFMSURfSU1NKHgpCVwKKwkoKCgoeCkgJiB+MHgwMDAwMDBmZikgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDAwMDAwM2ZjKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4MDAwMDBmZjApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHgwMDAwM2ZjMCkgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDAwMDBmZjAwKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4MDAwM2ZjMDApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHgwMDBmZjAwMCkgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDAwM2ZjMDAwKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4MDBmZjAwMDApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHgwM2ZjMDAwMCkgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weDBmZjAwMDAwKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4M2ZjMDAwMDApID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHhmZjAwMDAwMCkgPT0gMCkgfHwgXAorCSAoKCh4KSAmIH4weGZjMDAwMDAzKSA9PSAwKSB8fCBcCisJICgoKHgpICYgfjB4ZjAwMDAwMGYpID09IDApIHx8IFwKKwkgKCgoeCkgJiB+MHhjMDAwMDAzZikgPT0gMCkpCisKKyNlbmRpZiAvKiBfS0xJQkNfQVNNTUFDUk9TX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDYwNzgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIGNyaXMgdXNlcyAxMyBhcyB0aGUgcGFnZSBzaGlmdCBmYWN0b3IgZm9yIHN5c19tbWFwMiAqLworI2RlZmluZSBfS0xJQkNfTU1BUDJfU0hJRlQJMTMKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDVjY2IKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBhcmNoL2NyaXMvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fcjA7CisJdW5zaWduZWQgbG9uZyBfX3IxOworCXVuc2lnbmVkIGxvbmcgX19yMjsKKwl1bnNpZ25lZCBsb25nIF9fcjM7CisJdW5zaWduZWQgbG9uZyBfX3I0OworCXVuc2lnbmVkIGxvbmcgX19yNTsKKwl1bnNpZ25lZCBsb25nIF9fcjY7CisJdW5zaWduZWQgbG9uZyBfX3I3OworCXVuc2lnbmVkIGxvbmcgX19yODsKKwl1bnNpZ25lZCBsb25nIF9fc3A7CisJdW5zaWduZWQgbG9uZyBfX3NycDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hTRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhNzQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvY3Jpcy9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIE5vIHNwZWNpYWwgc3R1ZmYgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL2NyaXMva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQzYWRlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLCBoZW5jZSB0aGUgYWJzb2x1dGVseQorICogaW5zYW5lIGFtb3VudHMgb2YgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4KKyAqLworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkMFs0XTsKKworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJdW5zaWduZWQgY2hhcglfX3BhZDNbNF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisKKwl1bnNpZ25lZCBsb25nCXN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZwlfX3BhZDQ7CQkvKiBmdXR1cmUgcG9zc2libGUgc3RfYmxvY2tzIGhpZ2ggYml0cyAqLworCisJc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E0YzhhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBPbiBpMzg2LCBvbmx5IGhhbGYgdGhlIHNpZ25hbHMgYXJlIGFjY2Vzc2libGUgdXNpbmcgdGhlIGxlZ2FjeSBjYWxscy4gKi8KKyNkZWZpbmUgX0tMSUJDX1VTRV9SVF9TSUcgMQorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExYmEzZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIGFyY2gvaTM4Ni9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGludCBfX2VieDsKKwl1bnNpZ25lZCBpbnQgX19lc3A7CisJdW5zaWduZWQgaW50IF9fZWJwOworCXVuc2lnbmVkIGludCBfX2VzaTsKKwl1bnNpZ25lZCBpbnQgX19lZGk7CisJdW5zaWduZWQgaW50IF9fZWlwOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTQyZGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2kzODYva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogYXJjaC9pMzg2L2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisvKiBUaGUgaW4ta2VybmVsIGhlYWRlcnMgZm9yIGkzODYgc3RpbGwgaGF2ZSBsaWJjNQorICAgY3JhcCBpbiB0aGVtLiAgUmVjb25zaWRlciB1c2luZyA8YXNtL3NpZ25hbC5oPgorICAgd2hlbi9pZiBpdCBnZXRzIGNsZWFuZWQgdXA7IGZvciBub3csIGR1cGxpY2F0ZQorICAgdGhlIGRlZmluaXRpb25zIGhlcmUuICovCisKKyNkZWZpbmUgX05TSUcgICAgICAgICAgIDY0CisjZGVmaW5lIF9OU0lHX0JQVyAgICAgICAzMgorI2RlZmluZSBfTlNJR19XT1JEUyAgICAgKF9OU0lHIC8gX05TSUdfQlBXKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzaWdbX05TSUdfV09SRFNdOworfSBzaWdzZXRfdDsKKworI2RlZmluZSBTSUdIVVAgICAgICAgICAgIDEKKyNkZWZpbmUgU0lHSU5UICAgICAgICAgICAyCisjZGVmaW5lIFNJR1FVSVQgICAgICAgICAgMworI2RlZmluZSBTSUdJTEwgICAgICAgICAgIDQKKyNkZWZpbmUgU0lHVFJBUCAgICAgICAgICA1CisjZGVmaW5lIFNJR0FCUlQgICAgICAgICAgNgorI2RlZmluZSBTSUdJT1QgICAgICAgICAgIDYKKyNkZWZpbmUgU0lHQlVTICAgICAgICAgICA3CisjZGVmaW5lIFNJR0ZQRSAgICAgICAgICAgOAorI2RlZmluZSBTSUdLSUxMICAgICAgICAgIDkKKyNkZWZpbmUgU0lHVVNSMSAgICAgICAgIDEwCisjZGVmaW5lIFNJR1NFR1YgICAgICAgICAxMQorI2RlZmluZSBTSUdVU1IyICAgICAgICAgMTIKKyNkZWZpbmUgU0lHUElQRSAgICAgICAgIDEzCisjZGVmaW5lIFNJR0FMUk0gICAgICAgICAxNAorI2RlZmluZSBTSUdURVJNICAgICAgICAgMTUKKyNkZWZpbmUgU0lHU1RLRkxUICAgICAgIDE2CisjZGVmaW5lIFNJR0NITEQgICAgICAgICAxNworI2RlZmluZSBTSUdDT05UICAgICAgICAgMTgKKyNkZWZpbmUgU0lHU1RPUCAgICAgICAgIDE5CisjZGVmaW5lIFNJR1RTVFAgICAgICAgICAyMAorI2RlZmluZSBTSUdUVElOICAgICAgICAgMjEKKyNkZWZpbmUgU0lHVFRPVSAgICAgICAgIDIyCisjZGVmaW5lIFNJR1VSRyAgICAgICAgICAyMworI2RlZmluZSBTSUdYQ1BVICAgICAgICAgMjQKKyNkZWZpbmUgU0lHWEZTWiAgICAgICAgIDI1CisjZGVmaW5lIFNJR1ZUQUxSTSAgICAgICAyNgorI2RlZmluZSBTSUdQUk9GICAgICAgICAgMjcKKyNkZWZpbmUgU0lHV0lOQ0ggICAgICAgIDI4CisjZGVmaW5lIFNJR0lPICAgICAgICAgICAyOQorI2RlZmluZSBTSUdQT0xMICAgICAgICAgU0lHSU8KKyNkZWZpbmUgU0lHUFdSICAgICAgICAgIDMwCisjZGVmaW5lIFNJR1NZUyAgICAgICAgICAzMQorI2RlZmluZSBTSUdVTlVTRUQgICAgICAgMzEKKworI2RlZmluZSBTSUdSVE1JTiAgICAgICAgMzIKKyNkZWZpbmUgU0lHUlRNQVggICAgICAgIChfTlNJRy0xKQorCisvKgorICogU0FfRkxBR1MgdmFsdWVzOgorICoKKyAqIFNBX09OU1RBQ0sgaW5kaWNhdGVzIHRoYXQgYSByZWdpc3RlcmVkIHN0YWNrX3Qgd2lsbCBiZSB1c2VkLgorICogU0FfSU5URVJSVVBUIGlzIGEgbm8tb3AsIGJ1dCBsZWZ0IGR1ZSB0byBoaXN0b3JpY2FsIHJlYXNvbnMuIFVzZSB0aGUKKyAqIFNBX1JFU1RBUlQgZmxhZyB0byBnZXQgcmVzdGFydGluZyBzaWduYWxzICh3aGljaCB3ZXJlIHRoZSBkZWZhdWx0IGxvbmcgYWdvKQorICogU0FfTk9DTERTVE9QIGZsYWcgdG8gdHVybiBvZmYgU0lHQ0hMRCB3aGVuIGNoaWxkcmVuIHN0b3AuCisgKiBTQV9SRVNFVEhBTkQgY2xlYXJzIHRoZSBoYW5kbGVyIHdoZW4gdGhlIHNpZ25hbCBpcyBkZWxpdmVyZWQuCisgKiBTQV9OT0NMRFdBSVQgZmxhZyBvbiBTSUdDSExEIHRvIGluaGliaXQgem9tYmllcy4KKyAqIFNBX05PREVGRVIgcHJldmVudHMgdGhlIGN1cnJlbnQgc2lnbmFsIGZyb20gYmVpbmcgbWFza2VkIGluIHRoZSBoYW5kbGVyLgorICoKKyAqIFNBX09ORVNIT1QgYW5kIFNBX05PTUFTSyBhcmUgdGhlIGhpc3RvcmljYWwgTGludXggbmFtZXMgZm9yIHRoZSBTaW5nbGUKKyAqIFVuaXggbmFtZXMgUkVTRVRIQU5EIGFuZCBOT0RFRkVSIHJlc3BlY3RpdmVseS4KKyAqLworI2RlZmluZSBTQV9OT0NMRFNUT1AJMHgwMDAwMDAwMXUKKyNkZWZpbmUgU0FfTk9DTERXQUlUCTB4MDAwMDAwMDJ1CisjZGVmaW5lIFNBX1NJR0lORk8JMHgwMDAwMDAwNHUKKyNkZWZpbmUgU0FfT05TVEFDSwkweDA4MDAwMDAwdQorI2RlZmluZSBTQV9SRVNUQVJUCTB4MTAwMDAwMDB1CisjZGVmaW5lIFNBX05PREVGRVIJMHg0MDAwMDAwMHUKKyNkZWZpbmUgU0FfUkVTRVRIQU5ECTB4ODAwMDAwMDB1CisKKyNkZWZpbmUgU0FfTk9NQVNLCVNBX05PREVGRVIKKyNkZWZpbmUgU0FfT05FU0hPVAlTQV9SRVNFVEhBTkQKKyNkZWZpbmUgU0FfSU5URVJSVVBUCTB4MjAwMDAwMDAJLyogZHVtbXkgLS0gaWdub3JlZCAqLworCisjZGVmaW5lIFNBX1JFU1RPUkVSCTB4MDQwMDAwMDAKKworLyoKKyAqIHNpZ2FsdHN0YWNrIGNvbnRyb2xzCisgKi8KKyNkZWZpbmUgU1NfT05TVEFDSwkxCisjZGVmaW5lIFNTX0RJU0FCTEUJMgorCisjZGVmaW5lIE1JTlNJR1NUS1NaCTIwNDgKKyNkZWZpbmUgU0lHU1RLU1oJODE5MgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLmg+CisKKy8qIFRoaXMgdXNlcyBnY2MgYW5vbnltb3VzIHVuaW9uIHN1cHBvcnQuLi4gKi8KK3N0cnVjdCBzaWdpbmZvOworCitzdHJ1Y3Qgc2lnYWN0aW9uIHsKKwl1bmlvbiB7CisJCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJCXZvaWQgKCpzYV9zaWdhY3Rpb24pKGludCwgc3RydWN0IHNpZ2luZm8gKiwgdm9pZCAqKTsKKwl9OworCXVuc2lnbmVkIGxvbmcJc2FfZmxhZ3M7CisJX19zaWdyZXN0b3JlX3QgCXNhX3Jlc3RvcmVyOworCXNpZ3NldF90CXNhX21hc2s7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwZjk1NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMSwgaGVuY2UgdGhlIGFic29sdXRlbHkKKyAqIGluc2FuZSBhbW91bnRzIG9mIHBhZGRpbmcgYXJvdW5kIGRldl90J3MuCisgKi8KK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgY2hhcglfX3BhZDBbNF07CisKKwl1bnNpZ25lZCBsb25nCV9fc3RfaW5vOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgbG9uZwlzdF91aWQ7CisJdW5zaWduZWQgbG9uZwlzdF9naWQ7CisKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzRdOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCisJdW5zaWduZWQgbG9uZyBsb25nIHN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9pbm87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9kaXZlcnIuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9rbGliYy9kaXZlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTIzOGFjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L2tsaWJjL2RpdmVyci5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBhcmNoL2kzODYvaW5jbHVkZS9rbGliYy9kaXZlcnIuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0RJVkVSUl9ICisjZGVmaW5lIF9LTElCQ19ESVZFUlJfSAorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19kaXZpZGVfZXJyb3Iodm9pZCkKK3sKKwlhc20gdm9sYXRpbGUgKCJpbnQgJDAiKTsKK30KKworI2VuZGlmCQkJCS8qIF9LTElCQ19ESVZFUlJfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L3N5cy9pby5oIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L3N5cy9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzFiOTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2kzODYvc3lzL2lvLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzL2lvLmggZm9yIHRoZSBpMzg2IGFyY2hpdGVjdHVyZQorICoKKyAqIEJhc2ljIEkvTyBtYWNyb3MKKyAqLworCisjaWZuZGVmIF9TWVNfSU9fSAorI2RlZmluZSBfU1lTX0lPX0ggMQorCisvKiBJL08tcmVsYXRlZCBzeXN0ZW0gY2FsbHMgKi8KKworaW50IGlvcGwoaW50KTsKK2ludCBpb3Blcm0odW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKKworLyogQmFzaWMgSS9PIG1hY3JvcyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG91dGIodW5zaWduZWQgY2hhciBfX3YsIHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwlhc20gdm9sYXRpbGUgKCJvdXRiICUwLCUxIiA6IDogImEiIChfX3YpLCAiZE4iIChfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvdXR3KHVuc2lnbmVkIHNob3J0IF9fdiwgdW5zaWduZWQgc2hvcnQgX19wKQoreworCWFzbSB2b2xhdGlsZSAoIm91dHcgJTAsJTEiIDogOiAiYSIgKF9fdiksICJkTiIgKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG91dGwodW5zaWduZWQgaW50IF9fdiwgdW5zaWduZWQgc2hvcnQgX19wKQoreworCWFzbSB2b2xhdGlsZSAoIm91dGwgJTAsJTEiIDogOiAiYSIgKF9fdiksICJkTiIgKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIGluYih1bnNpZ25lZCBzaG9ydCBfX3ApCit7CisJdW5zaWduZWQgY2hhciBfX3Y7CisJYXNtIHZvbGF0aWxlICgiaW5iICUxLCUwIiA6ICI9YSIgKF9fdikgOiAiZE4iIChfX3ApKTsKKwlyZXR1cm4gX192OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbncodW5zaWduZWQgc2hvcnQgX19wKQoreworCXVuc2lnbmVkIHNob3J0IF9fdjsKKwlhc20gdm9sYXRpbGUgKCJpbncgJTEsJTAiIDogIj1hIiAoX192KSA6ICJkTiIgKF9fcCkpOworCXJldHVybiBfX3Y7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBpbmwodW5zaWduZWQgc2hvcnQgX19wKQoreworCXVuc2lnbmVkIGludCBfX3Y7CisJYXNtIHZvbGF0aWxlICgiaW5sICUxLCUwIiA6ICI9YSIgKF9fdikgOiAiZE4iIChfX3ApKTsKKwlyZXR1cm4gX192OworfQorCisvKiBTdHJpbmcgSS9PIG1hY3JvcyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXRzYih1bnNpZ25lZCBzaG9ydCBfX3AsIGNvbnN0IHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IG91dHNiIgorCQkgICAgICA6ICIrUyIgKF9fZCksICIrYyIgKF9fbikKKwkJICAgICAgOiAiZCIgKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXRzdyh1bnNpZ25lZCBzaG9ydCBfX3AsIGNvbnN0IHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IG91dHN3IgorCQkgICAgICA6ICIrUyIgKF9fZCksICIrYyIgKF9fbikKKwkJICAgICAgOiAiZCIgKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXRzbCh1bnNpZ25lZCBzaG9ydCBfX3AsIGNvbnN0IHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IG91dHNsIgorCQkgICAgICA6ICIrUyIgKF9fZCksICIrYyIoX19uKQorCQkgICAgICA6ICJkIiAoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5zYih1bnNpZ25lZCBzaG9ydCBfX3AsIHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc2IiCisJCSAgICAgIDogIitEIiAoX19kKSwgIitjIiAoX19uKQorCQkgICAgICA6ICJkIiAoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5zdyh1bnNpZ25lZCBzaG9ydCBfX3AsIHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc3ciCisJCSAgICAgIDogIitEIiAoX19kKSwgIitjIiAoX19uKQorCQkgICAgICA6ICJkIiAoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5zbCh1bnNpZ25lZCBzaG9ydCBfX3AsIHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc2wiCisJCSAgICAgIDogIitEIiAoX19kKSwgIitjIiAoX19uKQorCQkgICAgICA6ICJkIiAoX19wKSk7Cit9CisKKyNlbmRpZgkJCQkvKiBfU1lTX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9zeXMvdm04Ni5oIGIvdXNyL2luY2x1ZGUvYXJjaC9pMzg2L3N5cy92bTg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2NTFjZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaTM4Ni9zeXMvdm04Ni5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzL3ZtODYuaCBmb3IgaTM4NgorICovCisKKyNpZm5kZWYgX1NZU19WTTg2X0gKKyNkZWZpbmUgX1NZU19WTTg2X0ggMQorCisjaW5jbHVkZSA8YXNtL3ZtODYuaD4KKworLyogQWN0dWFsIHN5c3RlbSBjYWxsICovCitpbnQgdm04NihzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiZDFlZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogSUE2NCBkb2Vzbid0IGhhdmUgc3lzX2ZvcmssIGJ1dCBpdCBkb2VzIGhhdmUgYW4gTU1VICovCisjZGVmaW5lIF9LTElCQ19OT19NTVUgMAorLyogSUE2NCBkb2Vzbid0IGhhdmUgc3lzX3Zmb3JrLCBpdCBoYXMgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgKi8KKyNkZWZpbmUgX0tMSUJDX1JFQUxfVkZPUksgMQorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1NjRlZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGFyY2gvaWE2NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICoKKyAqIENvZGUgYm9ycm93ZWQgZnJvbSB0aGUgRnJlZUJTRCBrZXJuZWwuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKKy8qIFVzZXIgY29kZSBtdXN0IG5vdCBkZXBlbmQgb24gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGptcF9idWYuICovCisjZGVmaW5lIF9KQkxFTiAweDIwMAorCisvKiBndWFyYW50ZWVkIDEyOC1iaXQgYWxpZ25tZW50ISAqLwordHlwZWRlZiBjaGFyIGptcF9idWZbX0pCTEVOXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM5NjFiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogYXJjaC9pYTY0L2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucy4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKyNkZWZpbmUgX05TSUcgICAgICAgIDY0CisjZGVmaW5lIF9OU0lHX0JQVyAgICA2NAorI2RlZmluZSBfTlNJR19XT1JEUyAoX05TSUcgLyBfTlNJR19CUFcpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHNpZ1tfTlNJR19XT1JEU107Cit9IHNpZ3NldF90OworCitzdHJ1Y3Qgc2lnYWN0aW9uIHsKKwl1bmlvbiB7CisJCV9fc2lnaGFuZGxlcl90IF9zYV9oYW5kbGVyOworCQl2b2lkICgqX3NhX3NpZ2FjdGlvbikgKGludCwgc3RydWN0IHNpZ2luZm8gKiwgdm9pZCAqKTsKKwl9IF91OworCXNpZ3NldF90IHNhX21hc2s7CisJaW50IHNhX2ZsYWdzOworfTsKKworI2RlZmluZSBzYV9oYW5kbGVyICAgICAgX3UuX3NhX2hhbmRsZXIKKyNkZWZpbmUgc2Ffc2lnYWN0aW9uICAgIF91Ll9zYV9zaWdhY3Rpb24KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzhlNDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL2lhNjQva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF91aWQ7CisJdW5zaWduZWQgaW50CXN0X2dpZDsKKwl1bnNpZ25lZCBpbnQJX19wYWQwOworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJdW5zaWduZWQgbG9uZwlzdF9zaXplOworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKwlsb25nCQlzdF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZFszXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9pYTY0L2tsaWJjL2FyY2hzeXMuaCBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwNzgyMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvaWE2NC9rbGliYy9hcmNoc3lzLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBhcmNoL2lhNjQvaW5jbHVkZS9rbGliYy9hcmNoc3lzLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc3lzY2FsbCBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTWVNfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNZU19ICisKKyNkZWZpbmUgX19JQTY0X0JSRUFLICJicmVhayAweDEwMDAwMDs7XG5cdCIKKworI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSAodm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3I4IGFzbSAoInI4Iik7CQkJCQlcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjEwIGFzbSAoInIxMCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjE1IGFzbSAoInIxNSIpID0gX19OUl8jI25hbWU7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgbG9uZyBfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX19hc20gX192b2xhdGlsZSAoX19JQTY0X0JSRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChfcjgpLCAiPXIiIChfcjEwKSwgIj1yIiAoX3IxNSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMiIgKF9yMTUpIEFTTV9BUkdTXzAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiBBU01fQ0xPQkJFUlNfMCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3JldHZhbCA9IF9yODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKF9yMTAgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBlcnJubyA9IChfcmV0dmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBfcmV0dmFsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuICh0eXBlKV9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGwxKHR5cGUsbmFtZSx0eXBlMSxhcmcxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUgKHR5cGUxIGFyZzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yOCBhc20gKCJyOCIpOwkJCQkJXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxMCBhc20gKCJyMTAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3IxNSBhc20gKCJyMTUiKSA9IF9fTlJfIyNuYW1lOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGxvbmcgX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIExPQURfQVJHU18xKGFyZzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKF9fSUE2NF9CUkVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAoX3I4KSwgIj1yIiAoX3IxMCksICI9ciIgKF9yMTUpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNNX09VVEFSR1NfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIjIiIChfcjE1KSBBU01fQVJHU18xICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIgQVNNX0NMT0JCRVJTXzEpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIF9yZXR2YWwgPSBfcjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmIChfcjEwID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgZXJybm8gPSAoX3JldHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgX3JldHZhbCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJldHVybiAodHlwZSlfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIF9zeXNjYWxsMih0eXBlLG5hbWUsdHlwZTEsYXJnMSx0eXBlMixhcmcyKSAgICAgICAgICAgICAgICAgICAgICBcCit0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lICh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjggYXNtICgicjgiKTsJCQkJCVwKKyAgICAgICByZWdpc3RlciBsb25nIF9yMTAgYXNtICgicjEwIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yMTUgYXNtICgicjE1IikgPSBfX05SXyMjbmFtZTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBsb25nIF9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBMT0FEX0FSR1NfMihhcmcxLCBhcmcyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfX2FzbSBfX3ZvbGF0aWxlIChfX0lBNjRfQlJFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKF9yOCksICI9ciIgKF9yMTApLCAiPXIiIChfcjE1KSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTV9PVVRBUkdTXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICIyIiAoX3IxNSkgQVNNX0FSR1NfMiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiIEFTTV9DTE9CQkVSU18yKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfcmV0dmFsID0gX3I4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBpZiAoX3IxMCA9PSAtMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGVycm5vID0gKF9yZXR2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIF9yZXR2YWwgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gKHR5cGUpX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBfc3lzY2FsbDModHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKSAgICAgICAgICAgXAordHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3I4IGFzbSAoInI4Iik7CQkJCQlcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjEwIGFzbSAoInIxMCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjE1IGFzbSAoInIxNSIpID0gX19OUl8jI25hbWU7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgbG9uZyBfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTE9BRF9BUkdTXzMoYXJnMSwgYXJnMiwgYXJnMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX19hc20gX192b2xhdGlsZSAoX19JQTY0X0JSRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChfcjgpLCAiPXIiIChfcjEwKSwgIj1yIiAoX3IxNSksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU01fT1VUQVJHU18zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMiIgKF9yMTUpIEFTTV9BUkdTXzMgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiBBU01fQ0xPQkJFUlNfMyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3JldHZhbCA9IF9yODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKF9yMTAgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBlcnJubyA9IChfcmV0dmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBfcmV0dmFsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuICh0eXBlKV9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0KSBcCit0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lICh0eXBlMSBhcmcxLCB0eXBlMiBhcmcyLCB0eXBlMyBhcmczLCB0eXBlNCBhcmc0KSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjggYXNtICgicjgiKTsJCQkJCVwKKyAgICAgICByZWdpc3RlciBsb25nIF9yMTAgYXNtICgicjEwIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZWdpc3RlciBsb25nIF9yMTUgYXNtICgicjE1IikgPSBfX05SXyMjbmFtZTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBsb25nIF9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBMT0FEX0FSR1NfNChhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfX2FzbSBfX3ZvbGF0aWxlIChfX0lBNjRfQlJFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKF9yOCksICI9ciIgKF9yMTApLCAiPXIiIChfcjE1KSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTV9PVVRBUkdTXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICIyIiAoX3IxNSkgQVNNX0FSR1NfNCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiIEFTTV9DTE9CQkVSU180KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBfcmV0dmFsID0gX3I4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBpZiAoX3IxMCA9PSAtMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGVycm5vID0gKF9yZXR2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIF9yZXR2YWwgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gKHR5cGUpX3JldHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBfc3lzY2FsbDUodHlwZSxuYW1lLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczLHR5cGU0LGFyZzQsdHlwZTUsYXJnNSkgXAordHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCwgdHlwZTUgYXJnNSkgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3I4IGFzbSAoInI4Iik7CQkJCQlcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjEwIGFzbSAoInIxMCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjE1IGFzbSAoInIxNSIpID0gX19OUl8jI25hbWU7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgbG9uZyBfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTE9BRF9BUkdTXzUoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX19hc20gX192b2xhdGlsZSAoX19JQTY0X0JSRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChfcjgpLCAiPXIiIChfcjEwKSwgIj1yIiAoX3IxNSksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU01fT1VUQVJHU181ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMiIgKF9yMTUpIEFTTV9BUkdTXzUgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiBBU01fQ0xPQkJFUlNfNSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3JldHZhbCA9IF9yODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKF9yMTAgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBlcnJubyA9IChfcmV0dmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBfcmV0dmFsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuICh0eXBlKV9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGw2KHR5cGUsbmFtZSx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LHR5cGU1LGFyZzUsdHlwZTYsYXJnNikgXAordHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSAodHlwZTEgYXJnMSwgdHlwZTIgYXJnMiwgdHlwZTMgYXJnMywgdHlwZTQgYXJnNCwgdHlwZTUgYXJnNSwgdHlwZTYgYXJnNikgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHJlZ2lzdGVyIGxvbmcgX3I4IGFzbSAoInI4Iik7CQkJCQlcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjEwIGFzbSAoInIxMCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmVnaXN0ZXIgbG9uZyBfcjE1IGFzbSAoInIxNSIpID0gX19OUl8jI25hbWU7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgbG9uZyBfcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgTE9BRF9BUkdTXzYoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgX19hc20gX192b2xhdGlsZSAoX19JQTY0X0JSRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChfcjgpLCAiPXIiIChfcjEwKSwgIj1yIiAoX3IxNSksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBU01fT1VUQVJHU182ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMiIgKF9yMTUpIEFTTV9BUkdTXzYgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiBBU01fQ0xPQkJFUlNfNik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgX3JldHZhbCA9IF9yODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKF9yMTAgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBlcnJubyA9IChfcmV0dmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBfcmV0dmFsID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgcmV0dXJuICh0eXBlKV9yZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTE9BRF9BUkdTXzAoKSAgIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTE9BRF9BUkdTXzEob3V0MCkJCQkJXAorICByZWdpc3RlciBsb25nIF9vdXQwIGFzbSAoIm91dDAiKSA9IChsb25nKSAob3V0MCk7CVwKKyAgTE9BRF9BUkdTXzAgKCkKKyNkZWZpbmUgTE9BRF9BUkdTXzIob3V0MCwgb3V0MSkJCQkJXAorICByZWdpc3RlciBsb25nIF9vdXQxIGFzbSAoIm91dDEiKSA9IChsb25nKSAob3V0MSk7CVwKKyAgTE9BRF9BUkdTXzEgKG91dDApCisjZGVmaW5lIExPQURfQVJHU18zKG91dDAsIG91dDEsIG91dDIpCQkJXAorICByZWdpc3RlciBsb25nIF9vdXQyIGFzbSAoIm91dDIiKSA9IChsb25nKSAob3V0Mik7CVwKKyAgTE9BRF9BUkdTXzIgKG91dDAsIG91dDEpCisjZGVmaW5lIExPQURfQVJHU180KG91dDAsIG91dDEsIG91dDIsIG91dDMpCQlcCisgIHJlZ2lzdGVyIGxvbmcgX291dDMgYXNtICgib3V0MyIpID0gKGxvbmcpIChvdXQzKTsJXAorICBMT0FEX0FSR1NfMyAob3V0MCwgb3V0MSwgb3V0MikKKyNkZWZpbmUgTE9BRF9BUkdTXzUob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCkJXAorICByZWdpc3RlciBsb25nIF9vdXQ0IGFzbSAoIm91dDQiKSA9IChsb25nKSAob3V0NCk7CVwKKyAgTE9BRF9BUkdTXzQgKG91dDAsIG91dDEsIG91dDIsIG91dDMpCisjZGVmaW5lIExPQURfQVJHU182KG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUpCVwKKyAgcmVnaXN0ZXIgbG9uZyBfb3V0NSBhc20gKCJvdXQ1IikgPSAobG9uZykgKG91dDUpOwlcCisgIExPQURfQVJHU181IChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0KQorCisjZGVmaW5lIEFTTV9PVVRBUkdTXzEJIj1yIiAoX291dDApCisjZGVmaW5lIEFTTV9PVVRBUkdTXzIJQVNNX09VVEFSR1NfMSwgIj1yIiAoX291dDEpCisjZGVmaW5lIEFTTV9PVVRBUkdTXzMJQVNNX09VVEFSR1NfMiwgIj1yIiAoX291dDIpCisjZGVmaW5lIEFTTV9PVVRBUkdTXzQJQVNNX09VVEFSR1NfMywgIj1yIiAoX291dDMpCisjZGVmaW5lIEFTTV9PVVRBUkdTXzUJQVNNX09VVEFSR1NfNCwgIj1yIiAoX291dDQpCisjZGVmaW5lIEFTTV9PVVRBUkdTXzYJQVNNX09VVEFSR1NfNSwgIj1yIiAoX291dDUpCisKKyNkZWZpbmUgQVNNX0FSR1NfMAorI2RlZmluZSBBU01fQVJHU18xCUFTTV9BUkdTXzAsICIzIiAoX291dDApCisjZGVmaW5lIEFTTV9BUkdTXzIJQVNNX0FSR1NfMSwgIjQiIChfb3V0MSkKKyNkZWZpbmUgQVNNX0FSR1NfMwlBU01fQVJHU18yLCAiNSIgKF9vdXQyKQorI2RlZmluZSBBU01fQVJHU180CUFTTV9BUkdTXzMsICI2IiAoX291dDMpCisjZGVmaW5lIEFTTV9BUkdTXzUJQVNNX0FSR1NfNCwgIjciIChfb3V0NCkKKyNkZWZpbmUgQVNNX0FSR1NfNglBU01fQVJHU181LCAiOCIgKF9vdXQ1KQorCisjZGVmaW5lIEFTTV9DTE9CQkVSU18wCUFTTV9DTE9CQkVSU18xLCAib3V0MCIKKyNkZWZpbmUgQVNNX0NMT0JCRVJTXzEJQVNNX0NMT0JCRVJTXzIsICJvdXQxIgorI2RlZmluZSBBU01fQ0xPQkJFUlNfMglBU01fQ0xPQkJFUlNfMywgIm91dDIiCisjZGVmaW5lIEFTTV9DTE9CQkVSU18zCUFTTV9DTE9CQkVSU180LCAib3V0MyIKKyNkZWZpbmUgQVNNX0NMT0JCRVJTXzQJQVNNX0NMT0JCRVJTXzUsICJvdXQ0IgorI2RlZmluZSBBU01fQ0xPQkJFUlNfNQlBU01fQ0xPQkJFUlNfNiwgIm91dDUiCisjZGVmaW5lIEFTTV9DTE9CQkVSU182CSwgIm91dDYiLCAib3V0NyIsCQkJCVwKKyAgLyogTm9uLXN0YWNrZWQgaW50ZWdlciByZWdpc3RlcnMsIG1pbnVzIHI4LCByMTAsIHIxNS4gICovCQlcCisgICJyMiIsICJyMyIsICJyOSIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE2IiwgInIxNyIsICJyMTgiLAlcCisgICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsCVwKKyAgInIyOCIsICJyMjkiLCAicjMwIiwgInIzMSIsCQkJCQkJXAorICAvKiBQcmVkaWNhdGUgcmVnaXN0ZXJzLiAgKi8JCQkJCQlcCisgICJwNiIsICJwNyIsICJwOCIsICJwOSIsICJwMTAiLCAicDExIiwgInAxMiIsICJwMTMiLCAicDE0IiwgInAxNSIsCVwKKyAgLyogTm9uLXJvdGF0aW5nIGZwIHJlZ2lzdGVycy4gICovCQkJCQlcCisgICJmNiIsICJmNyIsICJmOCIsICJmOSIsICJmMTAiLCAiZjExIiwgImYxMiIsICJmMTMiLCAiZjE0IiwgImYxNSIsCVwKKyAgLyogQnJhbmNoIHJlZ2lzdGVycy4gICovCQkJCQkJXAorICAiYjYiLCAiYjciCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSFNZU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDg5ODc3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBBbGwgZGVmYXVsdHMgKi8KKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbTMyci9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmRmOWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBhcmNoL20zMnIvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fcjg7CisJdW5zaWduZWQgbG9uZyBfX3I5OworCXVuc2lnbmVkIGxvbmcgX19yMTA7CisJdW5zaWduZWQgbG9uZyBfX3IxMTsKKwl1bnNpZ25lZCBsb25nIF9fcjEyOworCXVuc2lnbmVkIGxvbmcgX19yMTM7CisJdW5zaWduZWQgbG9uZyBfX3IxNDsKKwl1bnNpZ25lZCBsb25nIF9fcjE1OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSFNFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzUzMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9tMzJyL2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorLyogTm8gc3BlY2lhbCBzdHVmZiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbTMyci9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDNhZGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL20zMnIva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5CisgKiBpbnNhbmUgYW1vdW50cyBvZiBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLgorICovCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCXVuc2lnbmVkIGNoYXIJX19wYWQwWzRdOworCisJdW5zaWduZWQgbG9uZwlfX3N0X2lubzsKKworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKworCXVuc2lnbmVkIGxvbmcJc3RfdWlkOworCXVuc2lnbmVkIGxvbmcJc3RfZ2lkOworCisJX19zdGRldjY0CShzdF9yZGV2KTsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkM1s0XTsKKworCWxvbmcgbG9uZwlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKworCXVuc2lnbmVkIGxvbmcJc3RfYmxvY2tzOwkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKwl1bnNpZ25lZCBsb25nCV9fcGFkNDsJCS8qIGZ1dHVyZSBwb3NzaWJsZSBzdF9ibG9ja3MgaGlnaCBiaXRzICovCisKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9pbm87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZWY2MmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaGNvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBpbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIE9uIG02OGssIHN5c19tbWFwMiB1c2VzIHRoZSBjdXJyZW50IHBhZ2Ugc2l6ZSBhcyB0aGUgc2hpZnQgZmFjdG9yICovCisjZGVmaW5lIF9LTElCQ19NTUFQMl9TSElGVAlfX2dldHBhZ2VzaGlmdCgpCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVjODEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGludCBfX2QyOworCXVuc2lnbmVkIGludCBfX2QzOworCXVuc2lnbmVkIGludCBfX2Q0OworCXVuc2lnbmVkIGludCBfX2Q1OworCXVuc2lnbmVkIGludCBfX2Q2OworCXVuc2lnbmVkIGludCBfX2Q3OworCXVuc2lnbmVkIGludCBfX2EyOworCXVuc2lnbmVkIGludCBfX2EzOworCXVuc2lnbmVkIGludCBfX2E0OworCXVuc2lnbmVkIGludCBfX2E1OworCXVuc2lnbmVkIGludCBfX2ZwOwkvKiBhNiAqLworCXVuc2lnbmVkIGludCBfX3NwOwkvKiBhNyAqLworCXVuc2lnbmVkIGludCBfX3JldGFkZHI7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9LTEJJQ19BUkNIU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzkxMmEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL202OGsva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL202OGsvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9tNjhrL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlMjVmOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbTY4ay9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMSwgaGVuY2UgdGhlIGFic29sdXRlbHkKKyAqIGluc2FuZSBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLgorICovCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCXVuc2lnbmVkIGNoYXIJX19wYWQxWzJdOworCisJdW5zaWduZWQgbG9uZwlfX3N0X2lubzsKKworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKworCXVuc2lnbmVkIGxvbmcJc3RfdWlkOworCXVuc2lnbmVkIGxvbmcJc3RfZ2lkOworCisJX19zdGRldjY0CShzdF9yZGV2KTsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkM1syXTsKKworCWxvbmcgbG9uZwlzdF9zaXplOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCisJc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjBhZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBNSVBTIGhhcyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSBmb3IgdmZvcmsoKSAqLworI2RlZmluZSBfS0xJQkNfUkVBTF9WRk9SSyAxCisKKy8qIE1JUFMgZGVmaW5lcyBpdCdzIG93biBzdGF0ZnMgKi8KKyNkZWZpbmUgX0tMSUJDX1NUQVRGU19GX1RZUEVfMzJCIDEKKworLyogTUlQUyBoYXMgbm9uc3RhbmRhcmQgc29ja2V0IGRlZmluaXRpb25zICovCisjZGVmaW5lIF9LTElCQ19IQVNfQVJDSFNPQ0tFVF9IIDEKKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoZmNudGwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjYxODIyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hmY250bC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBhcmNoL21pcHMvaW5jbHVkZS9rbGliYy9hcmNoZmNudGwuaAorICoKKyAqIE9uIE1JUFMsIDxhc20vZmNudGwuaD4gaXNuJ3QgdXNhYmxlIChjb21waWxpbmcgc3RydWN0IHN0YXQgd2l0aAorICogdGhlIGNvcnJlY3QgZGVmaW5pdGlvbnMgZG9lc24ndCAianVzdCB3b3JrIiksIHNvIHdlIG5lZWQgdG8gcHJvdmlkZQorICogb3VyIG93biBkZWZpbml0aW9ucy4KKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIRkNOVExfSAorI2RlZmluZSBfS0xJQkNfQVJDSEZDTlRMX0gKKworI2lmZGVmIF9BU01fRkNOVExfSAkJLyogV2Ugd2VyZSB0b28gbGF0ZSEgKi8KKyMgZXJyb3IgIjxhc20vZmNudGwuaD4gaW5jbHVkZWQgYmVmb3JlIDxrbGliYy9hcmNoZmNudGwuaD4iCisjZW5kaWYKKyNkZWZpbmUgX0FTTV9GQ05UTF9ICQkvKiBLZWVwIDxhc20vZmNudGwuaD4gZnJvbSBnZXR0aW5nIGluY2x1ZGVkICovCisKKyNkZWZpbmUgT19BQ0NNT0RFCTB4MDAwMworI2RlZmluZSBPX1JET05MWQkweDAwMDAKKyNkZWZpbmUgT19XUk9OTFkJMHgwMDAxCisjZGVmaW5lIE9fUkRXUgkJMHgwMDAyCisjZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAorI2RlZmluZSBPX1NZTkMJCTB4MDAxMAorI2RlZmluZSBPX05PTkJMT0NLCTB4MDA4MAorI2RlZmluZSBPX0NSRUFUICAgICAgICAgMHgwMTAwCisjZGVmaW5lIE9fVFJVTkMJCTB4MDIwMAorI2RlZmluZSBPX0VYQ0wJCTB4MDQwMAorI2RlZmluZSBPX05PQ1RUWQkweDA4MDAKKyNkZWZpbmUgRkFTWU5DCQkweDEwMDAKKyNkZWZpbmUgT19MQVJHRUZJTEUJMHgyMDAwCisjZGVmaW5lIE9fRElSRUNUCTB4ODAwMAorI2RlZmluZSBPX0RJUkVDVE9SWQkweDEwMDAwCisjZGVmaW5lIE9fTk9GT0xMT1cJMHgyMDAwMAorI2RlZmluZSBPX05PQVRJTUUJMHg0MDAwMAorCisjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKKworI2RlZmluZSBGX0RVUEZECQkwCisjZGVmaW5lIEZfR0VURkQJCTEKKyNkZWZpbmUgRl9TRVRGRAkJMgorI2RlZmluZSBGX0dFVEZMCQkzCisjZGVmaW5lIEZfU0VURkwJCTQKKyNkZWZpbmUgRl9HRVRMSwkJMTQKKyNkZWZpbmUgRl9TRVRMSwkJNgorI2RlZmluZSBGX1NFVExLVwk3CisKKyNkZWZpbmUgRl9TRVRPV04JMjQKKyNkZWZpbmUgRl9HRVRPV04JMjMKKyNkZWZpbmUgRl9TRVRTSUcJMTAKKyNkZWZpbmUgRl9HRVRTSUcJMTEKKworI2RlZmluZSBGX0dFVExLNjQJMzMKKyNkZWZpbmUgRl9TRVRMSzY0CTM0CisjZGVmaW5lIEZfU0VUTEtXNjQJMzUKKworI2RlZmluZSBGRF9DTE9FWEVDCTEKKworI2RlZmluZSBGX1JETENLCQkwCisjZGVmaW5lIEZfV1JMQ0sJCTEKKyNkZWZpbmUgRl9VTkxDSwkJMgorCisjZGVmaW5lIEZfRVhMQ0sJCTQKKyNkZWZpbmUgRl9TSExDSwkJOAorCisjZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgorCisjZGVmaW5lIExPQ0tfU0gJCTEKKyNkZWZpbmUgTE9DS19FWAkJMgorI2RlZmluZSBMT0NLX05CCQk0CisjZGVmaW5lIExPQ0tfVU4JCTgKKworI2RlZmluZSBMT0NLX01BTkQJMzIKKyNkZWZpbmUgTE9DS19SRUFECTY0CisjZGVmaW5lIExPQ0tfV1JJVEUJMTI4CisjZGVmaW5lIExPQ0tfUlcJCTE5MgorCit0eXBlZGVmIHN0cnVjdCBmbG9jayB7CisJc2hvcnQJbF90eXBlOworCXNob3J0CWxfd2hlbmNlOworCWxvZmZfdAlsX3N0YXJ0OworCWxvZmZfdAlsX2xlbjsKKwlwaWRfdAlsX3BpZDsKK30gZmxvY2tfdDsKKworI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hGQ05UTF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJlODNlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogYXJjaC9taXBzL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3MwOworCXVuc2lnbmVkIGxvbmcgX19zMTsKKwl1bnNpZ25lZCBsb25nIF9fczI7CisJdW5zaWduZWQgbG9uZyBfX3MzOworCXVuc2lnbmVkIGxvbmcgX19zNDsKKwl1bnNpZ25lZCBsb25nIF9fczU7CisJdW5zaWduZWQgbG9uZyBfX3M2OworCXVuc2lnbmVkIGxvbmcgX19zNzsKKwl1bnNpZ25lZCBsb25nIF9fZ3A7CisJdW5zaWduZWQgbG9uZyBfX3NwOworCXVuc2lnbmVkIGxvbmcgX19zODsKKwl1bnNpZ25lZCBsb25nIF9fcmE7CisJdW5zaWduZWQgbG9uZyBfX2YyMDsKKwl1bnNpZ25lZCBsb25nIF9fZjIxOworCXVuc2lnbmVkIGxvbmcgX19mMjI7CisJdW5zaWduZWQgbG9uZyBfX2YyMzsKKwl1bnNpZ25lZCBsb25nIF9fZjI0OworCXVuc2lnbmVkIGxvbmcgX19mMjU7CisJdW5zaWduZWQgbG9uZyBfX2YyNjsKKwl1bnNpZ25lZCBsb25nIF9fZjI3OworCXVuc2lnbmVkIGxvbmcgX19mMjg7CisJdW5zaWduZWQgbG9uZyBfX2YyOTsKKwl1bnNpZ25lZCBsb25nIF9fZjMwOworCXVuc2lnbmVkIGxvbmcgX19mMzE7CisJdW5zaWduZWQgbG9uZyBfX2ZjcjMxOworCXVuc2lnbmVkIGxvbmcgX191bnVzZWQ7Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hTRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljYTc1NgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvbWlwcy9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIE5vIHNwZWNpYWwgc3R1ZmYgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzL2tsaWJjL2FyY2hzb2NrZXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkYWYxYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc29ja2V0LmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGFyY2gvbWlwcy9rbGliYy9hcmNoc29ja2V0LmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU09DS0VUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTT0NLRVRfSAorCisjaWZuZGVmIFNPQ0tfU1RSRUFNCisjIGRlZmluZSBTT0NLX0RHUkFNICAgICAxCisjIGRlZmluZSBTT0NLX1NUUkVBTSAgICAyCisjIGRlZmluZSBTT0NLX1JBVyAgICAgICAzCisjIGRlZmluZSBTT0NLX1JETSAgICAgICA0CisjIGRlZmluZSBTT0NLX1NFUVBBQ0tFVCA1CisjIGRlZmluZSBTT0NLX1BBQ0tFVCAgICAxMAorI2VuZGlmCisKKyNlbmRpZiAvKiBfS0xJQkNfQVJDSFNPQ0tFVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDYwZDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL21pcHMva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDQwIEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKgorICogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5IGluc2FuZQorICogYW1vdW50cyBvZiBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLiAgVGhlIG1lbW9yeSBsYXlvdXQgaXMgdGhlIHNhbWUgYXMgb2YKKyAqIHN0cnVjdCBzdGF0IG9mIHRoZSA2NC1iaXQga2VybmVsLCB3aGljaCBtYWtlcyB0aGlzIG9uZSBvZiB0aGUgc2FuZXN0CisgKiAzMi1iaXQgc3RydWN0IHN0YXRzLgorICovCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBpbnQJc3RfZGV2OworCXVuc2lnbmVkIGxvbmcJc3RfcGFkMFszXTsJLyogUmVzZXJ2ZWQgZm9yIHN0X2RldiBleHBhbnNpb24gICovCisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworCisJbW9kZV90CQlzdF9tb2RlOworCW5saW5rX3QJCXN0X25saW5rOworCisJdWlkX3QJCXN0X3VpZDsKKwlnaWRfdAkJc3RfZ2lkOworCisJdW5zaWduZWQgaW50CXN0X3JkZXY7CisJdW5zaWduZWQgbG9uZwlzdF9wYWQxWzNdOwkvKiBSZXNlcnZlZCBmb3Igc3RfcmRldiBleHBhbnNpb24gICovCisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKworCXN0cnVjdCB0aW1lc3BlYwkJc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMJCXN0X210aW07CisJc3RydWN0IHRpbWVzcGVjCQlzdF9jdGltOworCisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCXVuc2lnbmVkIGxvbmcJc3RfcGFkMjsKKworCWxvbmcgbG9uZwlzdF9ibG9ja3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9tYWNoaW5lL2FzbS5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL21hY2hpbmUvYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyNGJjNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwcy9tYWNoaW5lL2FzbS5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBhcmNoL21pcHMvaW5jbHVkZS9tYWNoaW5lL2FzbS5oCisgKi8KKworI2lmbmRlZiBfTUFDSElORV9BU01fSAorI2RlZmluZSBfTUFDSElORV9BU01fSAorCisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorI2luY2x1ZGUgPGFzbS9hc20uaD4KKworI2VuZGlmCQkJCS8qIF9NQUNISU5FX0FTTV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHMvc2dpZGVmcy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL3NnaWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE4YWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL3NnaWRlZnMuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogYXJjaC9taXBzL2luY2x1ZGUvc2dpZGVmcy5oCisgKi8KKworLyogU29tZSBBQkkgY29uc3RhbnRzICovCisKKyNpZm5kZWYgX1NHSURFRlNfSAorI2RlZmluZSBfU0dJREVGU19ICisKKyNkZWZpbmUgX01JUFNfSVNBX01JUFMxIDEKKyNkZWZpbmUgX01JUFNfSVNBX01JUFMyIDIKKyNkZWZpbmUgX01JUFNfSVNBX01JUFMzIDMKKyNkZWZpbmUgX01JUFNfSVNBX01JUFM0IDQKKyNkZWZpbmUgX01JUFNfSVNBX01JUFM1IDUKKworI2RlZmluZSBfTUlQU19TSU1fQUJJMzIgICAgICAgICAxCisjZGVmaW5lIF9NSVBTX1NJTV9OQUJJMzIgICAgICAgIDIKKyNkZWZpbmUgX01JUFNfU0lNX0FCSTY0ICAgICAgICAgMworCisjZW5kaWYJCQkJLyogX1NHSURFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9taXBzL3NwYWNlcy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzL3NwYWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjUzMGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL21pcHMvc3BhY2VzLmgKQEAgLTAsMCArMSBAQAorLyogSW5jbHVkZWQgYnkgPGFzbS9wYWdlLmg+IGJ1dCBub3QgYWN0dWFsbHkgbmVlZGVkICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3MWNiNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwczY0L2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIE1JUFMgaGFzIG5vbnN0YW5kYXJkIHNvY2tldCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBfS0xJQkNfSEFTX0FSQ0hTT0NLRVRfSCAxCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1MGFmOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwczY0L2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9taXBzNjQvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvbWlwczY0L2tsaWJjL2FyY2hzb2NrZXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvbWlwczY0L2tsaWJjL2FyY2hzb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM5NDdkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaHNvY2tldC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBhcmNoL21pcHM2NC9rbGliYy9hcmNoc29ja2V0LmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU09DS0VUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTT0NLRVRfSAorCisjaWZuZGVmIFNPQ0tfU1RSRUFNCisjIGRlZmluZSBTT0NLX0RHUkFNICAgICAxCisjIGRlZmluZSBTT0NLX1NUUkVBTSAgICAyCisjIGRlZmluZSBTT0NLX1JBVyAgICAgICAzCisjIGRlZmluZSBTT0NLX1JETSAgICAgICA0CisjIGRlZmluZSBTT0NLX1NFUVBBQ0tFVCA1CisjIGRlZmluZSBTT0NLX1BBQ0tFVCAgICAxMAorI2VuZGlmCisKKyNlbmRpZiAvKiBfS0xJQkNfQVJDSFNPQ0tFVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL21pcHM2NC9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdmOWFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9taXBzNjQva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgaW50CQlzdF9kZXY7CisJdW5zaWduZWQgaW50CQlzdF9wYWQwWzNdOyAvKiBSZXNlcnZlZCBmb3Igc3RfZGV2IGV4cGFuc2lvbiAqLworCisJdW5zaWduZWQgbG9uZwkJc3RfaW5vOworCisJbW9kZV90CQkJc3RfbW9kZTsKKwlubGlua190CQkJc3Rfbmxpbms7CisKKwl1aWRfdAkJCXN0X3VpZDsKKwlnaWRfdAkJCXN0X2dpZDsKKworCXVuc2lnbmVkIGludAkJc3RfcmRldjsKKwl1bnNpZ25lZCBpbnQJCXN0X3BhZDFbM107IC8qIFJlc2VydmVkIGZvciBzdF9yZGV2IGV4cGFuc2lvbiAqLworCisJb2ZmX3QJCQlzdF9zaXplOworCisJc3RydWN0IHRpbWVzcGVjCQlzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYwkJc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMJCXN0X2N0aW07CisKKwl1bnNpZ25lZCBpbnQJCXN0X2Jsa3NpemU7CisJdW5zaWduZWQgaW50CQlzdF9wYWQyOworCisJdW5zaWduZWQgbG9uZwkJc3RfYmxvY2tzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiYTllMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIEFsbCBkZWZhdWx0cyAqLworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTk0M2UKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BhcmlzYy9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvcGFyaXNjL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJZG91YmxlIHJlZ3NbMjFdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTZhZWVhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBhcmNoL3BhcmlzYy9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKyNkZWZpbmUgX05TSUcgICAgNjQKKyNkZWZpbmUgX05TSUdfU1ogKF9OU0lHIC8gTE9OR19CSVQpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHNpZ1tfTlNJR19TWl07Cit9IHNpZ3NldF90OworCitzdHJ1Y3Qgc2lnYWN0aW9uIHsKKwlfX3NpZ2hhbmRsZXJfdAlzYV9oYW5kbGVyOworCXVuc2lnbmVkIGxvbmcJc2FfZmxhZ3M7CisJc2lnc2V0X3QJc2FfbWFzazsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wYXJpc2Mva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4ZWY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvcGFyaXNjL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJCShzdF9kZXYpOworCXVuc2lnbmVkIGludAkJX19wYWQxOworCisJdW5zaWduZWQgaW50CQlfX3N0X2lubzsJLyogTm90IGFjdHVhbGx5IGZpbGxlZCBpbiAqLworCXVuc2lnbmVkIGludAkJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJCXN0X25saW5rOworCXVuc2lnbmVkIGludAkJc3RfdWlkOworCXVuc2lnbmVkIGludAkJc3RfZ2lkOworCV9fc3RkZXY2NAkJKHN0X3JkZXYpOworCXVuc2lnbmVkIGludAkJX19wYWQyOworCXNpZ25lZCBsb25nIGxvbmcJc3Rfc2l6ZTsKKwlzaWduZWQgaW50CQlzdF9ibGtzaXplOworCisJc2lnbmVkIGxvbmcgbG9uZwlzdF9ibG9ja3M7CisJc3RydWN0IHRpbWVzcGVjCQlzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYwkJc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMJCXN0X2N0aW07CisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wcGMva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGMva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDRlZWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BwYy9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9wcGMva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiBBbGwgZGVmYXVsdHMgKi8KKworI2VuZGlmCQkJCS8qIF9LTElCQ19BUkNIQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU5ZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGMva2xpYmMvYXJjaHNldGptcC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBhcmNoL3BwYy9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGxvbmcgX19yMjsKKwl1bnNpZ25lZCBsb25nIF9fc3A7CisJdW5zaWduZWQgbG9uZyBfX2xyOworCXVuc2lnbmVkIGxvbmcgX19jcjsKKwl1bnNpZ25lZCBsb25nIF9fcjEzOworCXVuc2lnbmVkIGxvbmcgX19yMTQ7CisJdW5zaWduZWQgbG9uZyBfX3IxNTsKKwl1bnNpZ25lZCBsb25nIF9fcjE2OworCXVuc2lnbmVkIGxvbmcgX19yMTc7CisJdW5zaWduZWQgbG9uZyBfX3IxODsKKwl1bnNpZ25lZCBsb25nIF9fcjE5OworCXVuc2lnbmVkIGxvbmcgX19yMjA7CisJdW5zaWduZWQgbG9uZyBfX3IyMTsKKwl1bnNpZ25lZCBsb25nIF9fcjIyOworCXVuc2lnbmVkIGxvbmcgX19yMjM7CisJdW5zaWduZWQgbG9uZyBfX3IyNDsKKwl1bnNpZ25lZCBsb25nIF9fcjI1OworCXVuc2lnbmVkIGxvbmcgX19yMjY7CisJdW5zaWduZWQgbG9uZyBfX3IyNzsKKwl1bnNpZ25lZCBsb25nIF9fcjI4OworCXVuc2lnbmVkIGxvbmcgX19yMjk7CisJdW5zaWduZWQgbG9uZyBfX3IzMDsKKwl1bnNpZ25lZCBsb25nIF9fcjMxOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzNhYzkyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGMva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL3BwYy9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIE5vIHNwZWNpYWwgc3R1ZmYgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wcGMva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzMWY0YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjL2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLgorICovCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0IChzdF9kZXYpOwkJLyogRGV2aWNlLiAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9pbm87CS8qIEZpbGUgc2VyaWFsIG51bWJlci4gICovCisJdW5zaWduZWQgaW50IHN0X21vZGU7CQkvKiBGaWxlIG1vZGUuICAqLworCXVuc2lnbmVkIGludCBzdF9ubGluazsJCS8qIExpbmsgY291bnQuICAqLworCXVuc2lnbmVkIGludCBzdF91aWQ7CQkvKiBVc2VyIElEIG9mIHRoZSBmaWxlJ3Mgb3duZXIuICAqLworCXVuc2lnbmVkIGludCBzdF9naWQ7CQkvKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwLiAqLworCV9fc3RkZXY2NCAoc3RfcmRldik7IAkJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAgKi8KKwl1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQyOworCWxvbmcgbG9uZyBzdF9zaXplOwkJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gICovCisJbG9uZyBzdF9ibGtzaXplOwkJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICAqLworCisJbG9uZyBsb25nIHN0X2Jsb2NrczsJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOwkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKwl1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjNjQva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzU2MzAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hjb25maWcuaApAQCAtMCwwICsxLDEyIEBACisvKgorICogaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4gdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKyNkZWZpbmUgX0tMSUJDX1VTRV9SVF9TSUcgMQorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI3NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGFyY2gvcHBjNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fcjI7CisJdW5zaWduZWQgbG9uZyBfX3NwOworCXVuc2lnbmVkIGxvbmcgX19scjsKKwl1bnNpZ25lZCBsb25nIF9fY3I7CisJdW5zaWduZWQgbG9uZyBfX3IxMzsKKwl1bnNpZ25lZCBsb25nIF9fcjE0OworCXVuc2lnbmVkIGxvbmcgX19yMTU7CisJdW5zaWduZWQgbG9uZyBfX3IxNjsKKwl1bnNpZ25lZCBsb25nIF9fcjE3OworCXVuc2lnbmVkIGxvbmcgX19yMTg7CisJdW5zaWduZWQgbG9uZyBfX3IxOTsKKwl1bnNpZ25lZCBsb25nIF9fcjIwOworCXVuc2lnbmVkIGxvbmcgX19yMjE7CisJdW5zaWduZWQgbG9uZyBfX3IyMjsKKwl1bnNpZ25lZCBsb25nIF9fcjIzOworCXVuc2lnbmVkIGxvbmcgX19yMjQ7CisJdW5zaWduZWQgbG9uZyBfX3IyNTsKKwl1bnNpZ25lZCBsb25nIF9fcjI2OworCXVuc2lnbmVkIGxvbmcgX19yMjc7CisJdW5zaWduZWQgbG9uZyBfX3IyODsKKwl1bnNpZ25lZCBsb25nIF9fcjI5OworCXVuc2lnbmVkIGxvbmcgX19yMzA7CisJdW5zaWduZWQgbG9uZyBfX3IzMTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvcHBjNjQva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNGNlZjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hzaWduYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9wcGM2NC9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKy8qIE5vIHNwZWNpYWwgc3R1ZmYgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9wcGM2NC9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTMxNmMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3BwYzY0L2tsaWJjL2FyY2hzdGF0LmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfS0xJQkNfQVJDSFNUQVRfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNUQVRfSAorCisjaW5jbHVkZSA8a2xpYmMvc3RhdGhlbHAuaD4KKworI2RlZmluZSBfU1RBVEJVRl9TVF9OU0VDCisKK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJaW5vX3QJCXN0X2lubzsKKwlubGlua190CQlzdF9ubGluazsKKwltb2RlX3QJCXN0X21vZGU7CisJdWlkX3QgCQlzdF91aWQ7CisJZ2lkX3QgCQlzdF9naWQ7CisJX19zdGRldjY0CShzdF9yZGV2KTsKKwlvZmZfdAkJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nICAJc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZCBsb25nICAJc3RfYmxvY2tzOworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOwkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsJLyogVGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbi4gICovCisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDU7CisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkNjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zMzkwL2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhNzFhNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9zMzkwL2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworLyogQm90aCBzMzkwIGFuZCBzMzkweCB1c2UgdGhlICIzMi1iaXQiIHZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgX0tMSUJDX1NUQVRGU19GX1RZUEVfNjQgMAorCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zMzkwL2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4NzgwYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGFyY2gvczM5MC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKKyNpZm5kZWYgX19zMzkweF9fCisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVpbnQzMl90IF9fZ3JlZ3NbMTBdOwkvKiBnZW5lcmFsIHJlZ2lzdGVycyByNi1yMTUgKi8KKwl1aW50NjRfdCBfX2ZwcmVnc1syXTsJLyogZnAgcmVnaXN0ZXJzIGY0IGFuZCBmNiAgICovCit9OworCisjZWxzZSAvKiBfX3MzOTB4X18gKi8KKworc3RydWN0IF9fam1wX2J1ZiB7CisJdWludDY0X3QgX19ncmVnc1sxMF07IC8qIGdlbmVyYWwgcmVnaXN0ZXJzIHI2LXIxNSAqLworCXVpbnQ2NF90IF9fZnByZWdzWzRdOyAvKiBmcCByZWdpc3RlcnMgZjEsIGYzLCBmNSwgZjcgKi8KK307CisKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmI5NzcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3MzOTAva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBhcmNoL3MzOTAvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zMzkwL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0YzgyMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvczM5MC9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisjaWZuZGVmIF9fczM5MHhfXworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMSwgaGVuY2UgdGhlIGFic29sdXRlbHkKKyAqIGluc2FuZSBhbW91bnRzIG9mIHBhZGRpbmcgYXJvdW5kIGRldl90J3MuCisgKi8KK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgaW50CV9fcGFkMTsKKyNkZWZpbmUgU1RBVDY0X0hBU19CUk9LRU5fU1RfSU5PCTEKKwl1bnNpZ25lZCBsb25nCV9fc3RfaW5vOworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCXVuc2lnbmVkIGludAlfX3BhZDM7CisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCXVuc2lnbmVkIGNoYXIJX19wYWQ0WzRdOworCXVuc2lnbmVkIGxvbmcJX19wYWQ1OyAgICAgLyogZnV0dXJlIHBvc3NpYmxlIHN0X2Jsb2NrcyBoaWdoIGJpdHMgKi8KKwl1bnNpZ25lZCBsb25nCXN0X2Jsb2NrczsgIC8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9pbm87Cit9OworCisjZWxzZSAvKiBfX3MzOTB4X18gKi8KKworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF91aWQ7CisJdW5zaWduZWQgaW50CXN0X2dpZDsKKwl1bnNpZ25lZCBpbnQJX19wYWQxOworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJdW5zaWduZWQgbG9uZwlzdF9zaXplOworCXN0cnVjdCB0aW1lc3BlYwlzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYwlzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYwlzdF9jdGltOworCXVuc2lnbmVkIGxvbmcJc3RfYmxrc2l6ZTsKKwlsb25nCQlzdF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZFszXTsKK307CisKKyNlbmRpZiAvKiBfX3MzOTB4X18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL3NoL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzllM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKy8qIEFsbCBkZWZhdWx0cyAqLworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL3NoL2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjk3MTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoc2V0am1wLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGFyY2gvc2gvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fcjg7CisJdW5zaWduZWQgbG9uZyBfX3I5OworCXVuc2lnbmVkIGxvbmcgX19yMTA7CisJdW5zaWduZWQgbG9uZyBfX3IxMTsKKwl1bnNpZ25lZCBsb25nIF9fcjEyOworCXVuc2lnbmVkIGxvbmcgX19yMTM7CisJdW5zaWduZWQgbG9uZyBfX3IxNDsKKwl1bnNpZ25lZCBsb25nIF9fcjE1OworCXVuc2lnbmVkIGxvbmcgX19wcjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYJCQkJLyogX0tMSUJDX0FSQ0hTRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoc2lnbmFsLmggYi91c3IvaW5jbHVkZS9hcmNoL3NoL2tsaWJjL2FyY2hzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ4ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFyY2gvc2gvaW5jbHVkZS9rbGliYy9hcmNoc2lnbmFsLmgKKyAqCisgKiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2lnbmFsIGRlZmluaXRpb25zCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTSUdOQUxfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisvKiBObyBzcGVjaWFsIHN0dWZmIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaHN0YXQuaCBiL3Vzci9pbmNsdWRlL2FyY2gvc2gva2xpYmMvYXJjaHN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM5MTgxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zaC9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYzIuMSwgaGVuY2UgdGhlIGFic29sdXRlbHkKKyAqIGluc2FuZSBhbW91bnRzIG9mIHBhZGRpbmcgYXJvdW5kIGRldl90J3MuCisgKi8KK3N0cnVjdCBzdGF0IHsKKwlfX3N0ZGV2NjQJKHN0X2Rldik7CisJdW5zaWduZWQgY2hhcglfX3BhZDBbNF07CisKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCV9fc3RkZXY2NAkoc3RfcmRldik7CisJdW5zaWduZWQgY2hhcglfX3BhZDNbNF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfYmxvY2tzOworCisJc3RydWN0IHRpbWVzcGVjCXN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoY29uZmlnLmggYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE2YzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoY29uZmlnLmgKKyAqCisgKiBTZWUgaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaCBmb3IgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluCisgKiB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hDT05GSUdfSAorI2RlZmluZSBfS0xJQkNfQVJDSENPTkZJR19ICisKKyNkZWZpbmUgX0tMSUJDX1VTRV9SVF9TSUcgMQkvKiBVc2UgcnRfKiBzaWduYWxzICovCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzZXRqbXAuaCBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaHNldGptcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNGQ2YTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogYXJjaC9zcGFyYy9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisKK3N0cnVjdCBfX2ptcF9idWYgeworCXVuc2lnbmVkIGxvbmcgX19zcDsKKwl1bnNpZ25lZCBsb25nIF9fZnA7CisJdW5zaWduZWQgbG9uZyBfX3BjOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4NDVhOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaHNpZ25hbC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBhcmNoL3NwYXJjL2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjZGVmaW5lIF9fV0FOVF9QT1NJWDFCX1NJR05BTFNfXworI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KKworc3RydWN0IHNpZ2FjdGlvbiB7CisJX19zaWdoYW5kbGVyX3QJc2FfaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nCXNhX2ZsYWdzOworCXZvaWQJCSgqc2FfcmVzdG9yZXIpKHZvaWQpOwkvKiBOb3QgdXNlZCBieSBMaW51eC9TUEFSQyAqLworCXNpZ3NldF90CXNhX21hc2s7Cit9OworCisvKiBOb3QgYWN0dWFsbHkgdXNlZCBieSB0aGUga2VybmVsLi4uICovCisjZGVmaW5lIFNBX1JFU1RPUkVSCTB4ODAwMDAwMDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzZDQwYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMva2xpYmMvYXJjaHN0YXQuaApAQCAtMCwwICsxLDM3IEBACisjaWZuZGVmIF9LTElCQ19BUkNIU1RBVF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU1RBVF9ICisKKyNpbmNsdWRlIDxrbGliYy9zdGF0aGVscC5oPgorCisjZGVmaW5lIF9TVEFUQlVGX1NUX05TRUMKKworc3RydWN0IHN0YXQgeworCV9fc3RkZXY2NAkoc3RfZGV2KTsKKworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9pbm87CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCisJdW5zaWduZWQgY2hhcglfX3BhZDNbOF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJc3RfYmxrc2l6ZTsKKworCXVuc2lnbmVkIGNoYXIJX19wYWQ0WzhdOworCXVuc2lnbmVkIGludAlzdF9ibG9ja3M7CisKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfYXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsKKworCXVuc2lnbmVkIGludAlfX3VudXNlZDQ7CisJdW5zaWduZWQgaW50CV9fdW51c2VkNTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL2FzbS5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZmU5YjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL21hY2hpbmUvYXNtLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCSROZXRCU0Q6IGFzbS5oLHYgMS4xNCAyMDAyLzA3LzIwIDA4OjM3OjMwIG1yZyBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0IEFsbGVuIEJyaWdncworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBHbGVhbmVkIGZyb20gbG9jb3JlLnMgYW5kIHN1bjMgYXNtLmggd2hpY2ggaGFkIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0czoKKyAqIGxvY29yZS5zOgorICogQ29weXJpZ2h0IChjKSAxOTg4IFVuaXZlcnNpdHkgb2YgVXRhaC4KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogc3VuMy9pbmNsdWRlL2FzbS5oOgorICogQ29weXJpZ2h0IChjKSAxOTkzIEFkYW0gR2xhc3MKKyAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQVNNX0hfCisjZGVmaW5lIF9BU01fSF8KKworLyogUHVsbCBpbiBDQ0ZTWiwgQ0M2NEZTWiwgYW5kIEJJQVMgZnJvbSBmcmFtZS5oICovCisjaWZuZGVmIF9MT0NPUkUKKyNkZWZpbmUgX0xPQ09SRQorI2VuZGlmCisjaW5jbHVkZSA8bWFjaGluZS9mcmFtZS5oPgorCisjaWZkZWYgX19FTEZfXworI2RlZmluZQlfQ19MQUJFTChuYW1lKQkJbmFtZQorI2Vsc2UKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBfQ19MQUJFTChuYW1lKQkJXyAjIyBuYW1lCisjZWxzZQorI2RlZmluZSBfQ19MQUJFTChuYW1lKQkJXy8qKi9uYW1lCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZQlfQVNNX0xBQkVMKG5hbWUpCW5hbWUKKworI2lmZGVmIFBJQworLyoKKyAqIFBJQ19QUk9MT0dVRSgpIGlzIGFraW4gdG8gdGhlIGNvbXBpbGVyIGdlbmVyYXRlZCBmdW5jdGlvbiBwcm9sb2d1ZSBmb3IKKyAqIFBJQyBjb2RlLiBJdCBsZWF2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIEdsb2JhbCBPZmZzZXQgVGFibGUgaW4gREVTVCwKKyAqIGNsb2JiZXJpbmcgcmVnaXN0ZXIgVE1QIGluIHRoZSBwcm9jZXNzLgorICoKKyAqIFdlIGNhbiB1c2UgdHdvIGNvZGUgc2VxdWVuY2VzLiAgV2UgY2FuIHJlYWQgdGhlICVwYyBvciB1c2UgdGhlIGNhbGwKKyAqIGluc3RydWN0aW9uIHRoYXQgc2F2ZXMgdGhlIHBjIGluICVvNy4gIENhbGwgcmVxdWlyZXMgdGhlIGJyYW5jaCB1bml0IGFuZAorICogSUVVMSwgYW5kIGNsb2JiZXJzICVvNyB3aGljaCBuZWVkcyB0byBiZSByZXN0b3JlZC4gIFRoaXMgaW5zdHJ1Y3Rpb24KKyAqIHNlcXVlbmNlIHRha2VzIGFib3V0IDQgY3ljbGVzIGR1ZSB0byBpbnN0cnVjdGlvbiBpbnRlcmRlcGVuZGVuY2UuICBSZWFkaW5nCisgKiB0aGUgcGMgdGFrZXMgNCBjeWNsZXMgdG8gZGlzcGF0Y2ggYW5kIGlzIGFsd2F5cyBkaXNwYXRjaGVkIGFsb25lLiAgVGhhdAorICogc2VxdWVuY2UgdGFrZXMgNyBjeWNsZXMuCisgKi8KKyNpZmRlZiBfX2FyY2g2NF9fCisjZGVmaW5lIFBJQ19QUk9MT0dVRShkZXN0LHRtcCkgXAorCW1vdiAlbzcsIHRtcDsgXAorCXNldGhpICVoaShfR0xPQkFMX09GRlNFVF9UQUJMRV8tNCksZGVzdDsgXAorCWNhbGwgMGY7IFwKKwkgb3IgZGVzdCwlbG8oX0dMT0JBTF9PRkZTRVRfVEFCTEVfKzQpLGRlc3Q7IFwKKzA6IFwKKwlhZGQgZGVzdCwlbzcsZGVzdDsgXAorCW1vdiB0bXAsICVvNworI2Vsc2UKKyNkZWZpbmUgUElDX1BST0xPR1VFKGRlc3QsdG1wKSBcCisJbW92ICVvNyx0bXA7IDM6IGNhbGwgNGY7IG5vcDsgNDogXAorCXNldGhpICVoaShfQ19MQUJFTChfR0xPQkFMX09GRlNFVF9UQUJMRV8pLSgzYi0uKSksZGVzdDsgXAorCW9yIGRlc3QsJWxvKF9DX0xBQkVMKF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyktKDNiLS4pKSxkZXN0OyBcCisJYWRkIGRlc3QsJW83LGRlc3Q7IG1vdiB0bXAsJW83CisjZW5kaWYKKworLyoKKyAqIFBJQ0NZX1NFVCgpIGRvZXMgdGhlIGVxdWl2YWxlbnQgb2YgYSBgc2V0IHZhciwgJWRlc3QnIGluc3RydWN0aW9uIGluCisgKiBhIFBJQy1saWtlIHdheSwgYnV0IHdpdGhvdXQgaW52b2x2aW5nIHRoZSBHbG9iYWwgT2Zmc2V0IFRhYmxlLiBUaGlzCisgKiBvbmx5IHdvcmtzIGZvciBWQVJzIGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZSAqYW5kKiBpbiB0aGUgdGV4dCBzZWdtZW50LgorICovCisjaWZkZWYgX19hcmNoNjRfXworI2RlZmluZSBQSUNDWV9TRVQodmFyLGRlc3QsdG1wKSBcCisJMzogcmQgJXBjLCB0bXA7IGFkZCB0bXAsKHZhci0zYiksZGVzdAorI2Vsc2UKKyNkZWZpbmUgUElDQ1lfU0VUKHZhcixkZXN0LHRtcCkgXAorCW1vdiAlbzcsdG1wOyAzOiBjYWxsIDRmOyBub3A7IDQ6IFwKKwlhZGQgJW83LCh2YXItM2IpLGRlc3Q7IG1vdiB0bXAsJW83CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFBJQ19QUk9MT0dVRShkZXN0LHRtcCkKKyNkZWZpbmUgUElDQ1lfT0ZGU0VUKHZhcixkZXN0LHRtcCkKKyNlbmRpZgorCisjZGVmaW5lIEZUWVBFKHgpCQkudHlwZSB4LEBmdW5jdGlvbgorI2RlZmluZSBPVFlQRSh4KQkJLnR5cGUgeCxAb2JqZWN0CisKKyNkZWZpbmUJX0VOVFJZKG5hbWUpIFwKKwkuYWxpZ24gNDsgLmdsb2JsIG5hbWU7IC5wcm9jIDE7IEZUWVBFKG5hbWUpOyBuYW1lOgorCisjaWZkZWYgR1BST0YKKy8qIHNlZSBfTUNPVU5UX0VOVFJZIGluIHByb2ZpbGUuaCAqLworI2lmZGVmIF9fRUxGX18KKyNpZmRlZiBfX2FyY2g2NF9fCisjZGVmaW5lIF9QUk9GX1BST0xPR1VFIFwKKwkuZGF0YTsgLmFsaWduIDg7IDE6IC51YXdvcmQgMDsgLnVhd29yZCAwOyBcCisJLnRleHQ7IHNhdmUgJXNwLC1DQzY0RlNaLCVzcDsgc2V0aGkgJWhpKDFiKSwlbzA7IGNhbGwgX21jb3VudDsgXAorCW9yICVvMCwlbG8oMWIpLCVvMDsgcmVzdG9yZQorI2Vsc2UKKyNkZWZpbmUgX1BST0ZfUFJPTE9HVUUgXAorCS5kYXRhOyAuYWxpZ24gNDsgMTogLmxvbmcgMDsgXAorCS50ZXh0OyBzYXZlICVzcCwtOTYsJXNwOyBzZXRoaSAlaGkoMWIpLCVvMDsgY2FsbCBfbWNvdW50OyBcCisJb3IgJW8wLCVsbygxYiksJW8wOyByZXN0b3JlCisjZW5kaWYKKyNlbHNlCisjaWZkZWYgX19hcmNoNjRfXworI2RlZmluZSBfUFJPRl9QUk9MT0dVRSBcCisJLmRhdGE7IC5hbGlnbiA4OyAxOiAudWF3b3JkIDA7IC51YXdvcmQgMDsgXAorCS50ZXh0OyBzYXZlICVzcCwtQ0M2NEZTWiwlc3A7IHNldGhpICVoaSgxYiksJW8wOyBjYWxsIG1jb3VudDsgXAorCW9yICVvMCwlbG8oMWIpLCVvMDsgcmVzdG9yZQorI2Vsc2UKKyNkZWZpbmUJX1BST0ZfUFJPTE9HVUUgXAorCS5kYXRhOyAuYWxpZ24gNDsgMTogLmxvbmcgMDsgXAorCS50ZXh0OyBzYXZlICVzcCwtOTYsJXNwOyBzZXRoaSAlaGkoMWIpLCVvMDsgY2FsbCBtY291bnQ7IFwKKwlvciAlbzAsJWxvKDFiKSwlbzA7IHJlc3RvcmUKKyNlbmRpZgorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfUFJPRl9QUk9MT0dVRQorI2VuZGlmCisKKyNkZWZpbmUgRU5UUlkobmFtZSkJCV9FTlRSWShfQ19MQUJFTChuYW1lKSk7IF9QUk9GX1BST0xPR1VFCisjZGVmaW5lIEVOVFJZX05PUFJPRklMRShuYW1lKQlfRU5UUlkoX0NfTEFCRUwobmFtZSkpCisjZGVmaW5lCUFTRU5UUlkobmFtZSkJCV9FTlRSWShfQVNNX0xBQkVMKG5hbWUpKTsgX1BST0ZfUFJPTE9HVUUKKyNkZWZpbmUJRlVOQyhuYW1lKQkJQVNFTlRSWShuYW1lKQorI2RlZmluZSBST0RBVEEobmFtZSkJCS5hbGlnbiA0OyAudGV4dDsgLmdsb2JsIF9DX0xBQkVMKG5hbWUpOyBcCisJCQkJT1RZUEUoX0NfTEFCRUwobmFtZSkpOyBfQ19MQUJFTChuYW1lKToKKworI2RlZmluZSBBU01TVFIJCQkuYXNjaXoKKworI2RlZmluZSBSQ1NJRChuYW1lKQkJLmFzY2l6IG5hbWUKKworI2lmZGVmIF9fRUxGX18KKyNkZWZpbmUJV0VBS19BTElBUyhhbGlhcyxzeW0pCQkJCQkJXAorCS53ZWFrIGFsaWFzOwkJCQkJCQlcCisJYWxpYXMgPSBzeW0KKyNlbmRpZgorCisvKgorICogV0FSTl9SRUZFUkVOQ0VTOiBjcmVhdGUgYSB3YXJuaW5nIGlmIHRoZSBzcGVjaWZpZWQgc3ltYm9sIGlzIHJlZmVyZW5jZWQuCisgKi8KKyNpZmRlZiBfX0VMRl9fCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUJV0FSTl9SRUZFUkVOQ0VTKF9zeW0sX21zZykJCQkJXAorCS5zZWN0aW9uIC5nbnUud2FybmluZy4gIyMgX3N5bSA7IC5hc2NpaSBfbXNnIDsgLnRleHQKKyNlbHNlCisjZGVmaW5lCVdBUk5fUkVGRVJFTkNFUyhfc3ltLF9tc2cpCQkJCVwKKwkuc2VjdGlvbiAuZ251Lndhcm5pbmcuLyoqL19zeW0gOyAuYXNjaWkgX21zZyA7IC50ZXh0CisjZW5kaWYJCQkJLyogX19TVERDX18gKi8KKyNlbHNlCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUJX19TVFJJTkcoeCkJCQkjeAorI2RlZmluZQlXQVJOX1JFRkVSRU5DRVMoc3ltLG1zZykJCQkJCVwKKwkuc3RhYnMgbXNnICMjICwzMCwwLDAsMCA7CQkJCQlcCisJLnN0YWJzIF9fU1RSSU5HKF8gIyMgc3ltKSAjIyAsMSwwLDAsMAorI2Vsc2UKKyNkZWZpbmUJX19TVFJJTkcoeCkJCQkieCIKKyNkZWZpbmUJV0FSTl9SRUZFUkVOQ0VTKHN5bSxtc2cpCQkJCQlcCisJLnN0YWJzIG1zZywzMCwwLDAsMCA7CQkJCQkJXAorCS5zdGFicyBfX1NUUklORyhfLyoqL3N5bSksMSwwLDAsMAorI2VuZGlmCQkJCS8qIF9fU1REQ19fICovCisjZW5kaWYJCQkJLyogX19FTEZfXyAqLworCisjZW5kaWYJCQkJLyogX0FTTV9IXyAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL2ZyYW1lLmggYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL21hY2hpbmUvZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI5YzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYy9tYWNoaW5lL2ZyYW1lLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qCSROZXRCU0Q6IGZyYW1lLmgsdiAxLjQgMjAwMS8xMi8wNCAwMDowNTowNSBkYXJyZW5yIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcyBFbmdpbmVlcmluZyBncm91cAorICogYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSB1bmRlciBEQVJQQSBjb250cmFjdCBCRyA5MS02NiBhbmQKKyAqIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5LgorICoKKyAqIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylmcmFtZS5oCTguMSAoQmVya2VsZXkpIDYvMTEvOTMKKyAqLworCisjaWZuZGVmIF9NQUNISU5FX0ZSQU1FX0gKKyNkZWZpbmUgX01BQ0hJTkVfRlJBTUVfSAorCisjaWZkZWYgX19BU1NFTUJMWV9fCisjIGRlZmluZSBfTE9DT1JFCisjZW5kaWYKKworI2lmbmRlZiBfTE9DT1JFCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qCisgKiBTcGFyYyBzdGFjayBmcmFtZSBmb3JtYXQuCisgKgorICogTm90ZSB0aGF0IHRoZSBjb250ZW50cyBvZiBlYWNoIHN0YWNrIGZyYW1lIG1heSBiZSBoZWxkIG9ubHkgaW4KKyAqIG1hY2hpbmUgcmVnaXN0ZXIgd2luZG93cy4gIEluIG9yZGVyIHRvIGdldCBhbiBhY2N1cmF0ZSBwaWN0dXJlCisgKiBvZiB0aGUgZnJhbWUsIHlvdSBtdXN0IGZpcnN0IGZvcmNlIHRoZSBrZXJuZWwgdG8gd3JpdGUgYW55IHN1Y2gKKyAqIHdpbmRvd3MgdG8gdGhlIHN0YWNrLgorICovCisjaWZuZGVmIF9MT0NPUkUKKyNpZm5kZWYgU1VONFUKK3N0cnVjdCBmcmFtZSB7CisJaW50MzJfdCBmcl9sb2NhbFs4XTsJLyogc3BhY2UgdG8gc2F2ZSBsb2NhbHMgKCVsMC4uJWw3KSAqLworCWludDMyX3QgZnJfYXJnWzZdOwkvKiBzcGFjZSB0byBzYXZlIGFyZ3VtZW50cyAoJWkwLi4laTUpICovCisJc3RydWN0IGZyYW1lICpmcl9mcDsJLyogc3BhY2UgdG8gc2F2ZSBmcmFtZSBwb2ludGVyICglaTYpICovCisJaW50MzJfdCBmcl9wYzsJCS8qIHNwYWNlIHRvIHNhdmUgcmV0dXJuIHBjICglaTcpICovCisJLyoKKwkgKiBTdW5PUyByZXNlcnZlcyBhbm90aGVyIDggd29yZHMgaGVyZTsgdGhpcyBpcyBwb2ludGxlc3MKKwkgKiBidXQgd2UgZG8gaXQgZm9yIGNvbXBhdGliaWxpdHkuCisJICovCisJaW50MzJfdCBmcl94eHg7CQkvKiBgc3RydWN0dXJlIHJldHVybiBwb2ludGVyJyAodW51c2VkKSAqLworCWludDMyX3QgZnJfYXJnZFs2XTsJLyogYGFyZyBkdW1wIGFyZWEnIChsdW5hY3kpICovCisJaW50MzJfdCBmcl9hcmd4WzFdOwkvKiBhcmcgZXh0ZW5zaW9uIChhcmdzIDcuLm47IHZhcmlhYmxlIHNpemUpICovCit9OworI2Vsc2UKK3N0cnVjdCBmcmFtZTMyIHsKKwlpbnQzMl90IGZyX2xvY2FsWzhdOwkvKiBzcGFjZSB0byBzYXZlIGxvY2FscyAoJWwwLi4lbDcpICovCisJaW50MzJfdCBmcl9hcmdbNl07CS8qIHNwYWNlIHRvIHNhdmUgYXJndW1lbnRzICglaTAuLiVpNSkgKi8KKwl1aW50MzJfdCBmcl9mcDsJLyogc3BhY2UgdG8gc2F2ZSBmcmFtZSBwb2ludGVyICglaTYpICovCisJdWludDMyX3QgZnJfcGM7CS8qIHNwYWNlIHRvIHNhdmUgcmV0dXJuIHBjICglaTcpICovCisJLyoKKwkgKiBTdW5PUyByZXNlcnZlcyBhbm90aGVyIDggd29yZHMgaGVyZTsgdGhpcyBpcyBwb2ludGxlc3MKKwkgKiBidXQgd2UgZG8gaXQgZm9yIGNvbXBhdGliaWxpdHkuCisJICovCisJaW50MzJfdCBmcl94eHg7CQkvKiBgc3RydWN0dXJlIHJldHVybiBwb2ludGVyJyAodW51c2VkKSAqLworCWludDMyX3QgZnJfYXJnZFs2XTsJLyogYGFyZyBkdW1wIGFyZWEnIChsdW5hY3kpICovCisJaW50MzJfdCBmcl9hcmd4WzFdOwkvKiBhcmcgZXh0ZW5zaW9uIChhcmdzIDcuLm47IHZhcmlhYmxlIHNpemUpICovCit9OworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIENDRlNaIChDIENvbXBpbGVyIEZyYW1lIFNpWmUpIGlzIHRoZSBzaXplIG9mIGEgc3RhY2sgZnJhbWUgcmVxdWlyZWQgaWYKKyAqIGEgZnVuY3Rpb24gaXMgdG8gY2FsbCBDIGNvZGUuICBJdCBzaG91bGQgYmUganVzdCA2NCwgYnV0IFN1biBkZWZpbmVkCisgKiB0aGVpciBmcmFtZSB3aXRoIHNwYWNlIHRvIGhvbGQgYXJndW1lbnRzIDAgdGhyb3VnaCA1IChwbHVzIHNvbWUganVuayksCisgKiBhbmQgdmFyYXJncyByb3V0aW5lcyAoc3VjaCBhcyBrcHJpbnRmKSBkZW1hbmQgdGhpcywgYW5kIGdjYyB1c2VzIHRoaXMKKyAqIGFyZWEgYXQgdGltZXMgYW55d2F5LgorICovCisjZGVmaW5lIENDRlNaCQk5NgorCisvKgorICogU3BhcmMgdjkgc3RhY2sgZnJhbWUgZm9ybWF0LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgY29udGVudHMgb2YgZWFjaCBzdGFjayBmcmFtZSBtYXkgYmUgaGVsZCBvbmx5IGluCisgKiBtYWNoaW5lIHJlZ2lzdGVyIHdpbmRvd3MuICBJbiBvcmRlciB0byBnZXQgYW4gYWNjdXJhdGUgcGljdHVyZQorICogb2YgdGhlIGZyYW1lLCB5b3UgbXVzdCBmaXJzdCBmb3JjZSB0aGUga2VybmVsIHRvIHdyaXRlIGFueSBzdWNoCisgKiB3aW5kb3dzIHRvIHRoZSBzdGFjay4KKyAqCisgKiBWOSBmcmFtZXMgaGF2ZSBhbiBvZGQgYmlhcywgc28geW91IGNhbiB0YWxsIGEgdjkgZnJhbWUgZnJvbQorICogYSB2OCBmcmFtZSBieSB0ZXN0aW5nIHRoZSBzdGFjayBwb2ludGVyJ3MgbHNiLgorICovCisjaWYgIWRlZmluZWQoX0xPQ09SRSkgJiYgIWRlZmluZWQoX0xJQkMpCitzdHJ1Y3QgZnJhbWU2NCB7CisJaW50NjRfdCBmcl9sb2NhbFs4XTsJLyogc3BhY2UgdG8gc2F2ZSBsb2NhbHMgKCVsMC4uJWw3KSAqLworCWludDY0X3QgZnJfYXJnWzZdOwkvKiBzcGFjZSB0byBzYXZlIGFyZ3VtZW50cyAoJWkwLi4laTUpICovCisJdWludDY0X3QgZnJfZnA7CQkvKiBzcGFjZSB0byBzYXZlIGZyYW1lIHBvaW50ZXIgKCVpNikgKi8KKwl1aW50NjRfdCBmcl9wYzsJCS8qIHNwYWNlIHRvIHNhdmUgcmV0dXJuIHBjICglaTcpICovCisJLyoKKwkgKiBTVlI0IHJlc2VydmVzIGEgYnVuY2ggb2YgZXh0cmEgc3R1ZmYuCisJICovCisJaW50NjRfdCBmcl9hcmdkWzZdOwkvKiBgcmVnaXN0ZXIgc2F2ZSBhcmVhJyAobHVuYWN5KSAqLworCWludDY0X3QgZnJfYXJneFswXTsJLyogYXJnIGV4dGVuc2lvbiAoYXJncyA3Li5uOyB2YXJpYWJsZSBzaXplKSAqLworfTsKKworI2RlZmluZSB2OW5leHRfZnJhbWUoZikJCSgoc3RydWN0IGZyYW1lNjQqKShmLT5mcl9mcCtCSUFTKSkKKyNlbmRpZgorCisvKgorICogQ0M2NEZTWiAoQyBDb21waWxlciA2NC1iaXQgRnJhbWUgU2laZSkgaXMgdGhlIHNpemUgb2YgYSBzdGFjayBmcmFtZSB1c2VkCisgKiBieSB0aGUgY29tcGlsZXIgaW4gNjQtYml0IG1vZGUuICBJdCBpcyAoMTYpKjg7IHNwYWNlIGZvciA4IGlucywgOCBvdXRzLgorICovCisjZGVmaW5lIENDNjRGU1oJCTE3NgorCisvKgorICogdjkgc3RhY2tzIGFsbCBoYXZlIGEgYmlhcyBvZiAyMDQ3IGFkZGVkIHRvIHRoZSAlc3AgYW5kICVmcCwgc28geW91IGNhbiBlYXNpbHkKKyAqIGRldGVjdCBpdCBieSB0ZXN0aW5nIHRoZSByZWdpc3RlciBmb3IgYW4gb2RkIHZhbHVlLiAgV2h5IDJLLTEgSSBkb24ndCBrbm93LgorICovCisjZGVmaW5lIEJJQVMJKDIwNDgtMSkKKworI2VuZGlmIC8qIF9NQUNISU5FX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmMvbWFjaGluZS90cmFwLmggYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL21hY2hpbmUvdHJhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzc4YzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3NwYXJjL21hY2hpbmUvdHJhcC5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgkkTmV0QlNEOiB0cmFwLmgsdiAxLjExIDE5OTkvMDEvMjAgMDA6MTU6MDggcGsgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zIEVuZ2luZWVyaW5nIGdyb3VwCisgKiBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IHVuZGVyIERBUlBBIGNvbnRyYWN0IEJHIDkxLTY2IGFuZAorICogY29udHJpYnV0ZWQgdG8gQmVya2VsZXkuCisgKgorICogQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRyYXAuaAk4LjEgKEJlcmtlbGV5KSA2LzExLzkzCisgKi8KKy8qCisgKiBTdW40bSBzdXBwb3J0IGJ5IEFhcm9uIEJyb3duLCBIYXJ2YXJkIFVuaXZlcnNpdHkuCisgKiBDaGFuZ2VzIENvcHlyaWdodCAoYykgMTk5NSBUaGUgUHJlc2lkZW50IGFuZCBGZWxsb3dzIG9mIEhhcnZhcmQgQ29sbGVnZS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZglfTUFDSElORV9UUkFQX0gKKyNkZWZpbmUJX01BQ0hJTkVfVFJBUF9ICisKKy8qCXRyYXAJCXZlYwkgIChwcmkpIGRlc2NyaXB0aW9uCSovCisjZGVmaW5lCVRfUkVTRVQJCTB4MDAJLyogKDEpIG5vdCBhY3R1YWxseSB2ZWN0b3JlZDsganVtcHMgdG8gMCAqLworI2RlZmluZQlUX1RFWFRGQVVMVAkweDAxCS8qICgyKSBhZGRyZXNzIGZhdWx0IGR1cmluZyBpbnN0ciBmZXRjaCAqLworI2RlZmluZQlUX0lMTElOU1QJMHgwMgkvKiAoMykgaWxsZWdhbCBpbnN0cnVjdGlvbiAqLworI2RlZmluZQlUX1BSSVZJTlNUCTB4MDMJLyogKDQpIHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUJVF9GUERJU0FCTEVECTB4MDQJLyogKDUpIGZwIGluc3RyIHdoaWxlIGZwIGRpc2FibGVkICovCisjZGVmaW5lCVRfV0lOT0YJCTB4MDUJLyogKDYpIHJlZ2lzdGVyIHdpbmRvdyBvdmVyZmxvdyAqLworI2RlZmluZQlUX1dJTlVGCQkweDA2CS8qICg3KSByZWdpc3RlciB3aW5kb3cgdW5kZXJmbG93ICovCisjZGVmaW5lCVRfQUxJR04JCTB4MDcJLyogKDgpIGFkZHJlc3Mgbm90IHByb3Blcmx5IGFsaWduZWQgKi8KKyNkZWZpbmUJVF9GUEUJCTB4MDgJLyogKDkpIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiAqLworI2RlZmluZQlUX0RBVEFGQVVMVAkweDA5CS8qICgxMCkgYWRkcmVzcyBmYXVsdCBkdXJpbmcgZGF0YSBmZXRjaCAqLworI2RlZmluZQlUX1RBR09GCQkweDBhCS8qICgxMSkgdGFnIG92ZXJmbG93ICovCisvKgkJCTB4MGIJICAgdW51c2VkICovCisvKgkJCTB4MGMJICAgdW51c2VkICovCisvKgkJCTB4MGQJICAgdW51c2VkICovCisvKgkJCTB4MGUJICAgdW51c2VkICovCisvKgkJCTB4MGYJICAgdW51c2VkICovCisvKgkJCTB4MTAJICAgdW51c2VkICovCisjZGVmaW5lCVRfTDFJTlQJCTB4MTEJLyogKDI3KSBsZXZlbCAxIGludGVycnVwdCAqLworI2RlZmluZQlUX0wySU5UCQkweDEyCS8qICgyNikgbGV2ZWwgMiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MM0lOVAkJMHgxMwkvKiAoMjUpIGxldmVsIDMgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDRJTlQJCTB4MTQJLyogKDI0KSBsZXZlbCA0IGludGVycnVwdCAqLworI2RlZmluZQlUX0w1SU5UCQkweDE1CS8qICgyMykgbGV2ZWwgNSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MNklOVAkJMHgxNgkvKiAoMjIpIGxldmVsIDYgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDdJTlQJCTB4MTcJLyogKDIxKSBsZXZlbCA3IGludGVycnVwdCAqLworI2RlZmluZQlUX0w4SU5UCQkweDE4CS8qICgyMCkgbGV2ZWwgOCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MOUlOVAkJMHgxOQkvKiAoMTkpIGxldmVsIDkgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDEwSU5UCTB4MWEJLyogKDE4KSBsZXZlbCAxMCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MMTFJTlQJMHgxYgkvKiAoMTcpIGxldmVsIDExIGludGVycnVwdCAqLworI2RlZmluZQlUX0wxMklOVAkweDFjCS8qICgxNikgbGV2ZWwgMTIgaW50ZXJydXB0ICovCisjZGVmaW5lCVRfTDEzSU5UCTB4MWQJLyogKDE1KSBsZXZlbCAxMyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVF9MMTRJTlQJMHgxZQkvKiAoMTQpIGxldmVsIDE0IGludGVycnVwdCAqLworI2RlZmluZQlUX0wxNUlOVAkweDFmCS8qICgxMykgbGV2ZWwgMTUgaW50ZXJydXB0ICovCisvKgkJCTB4MjAJICAgdW51c2VkICovCisvKgl0aHJvdWdoCQkweDIzCSAgIHVudXNlZCAqLworI2RlZmluZQlUX0NQRElTQUJMRUQJMHgyNAkvKiAoNSkgY29wcm9jZXNzb3IgaW5zdHIgd2hpbGUgZGlzYWJsZWQgKi8KKyNkZWZpbmUJVF9VTklNUExGTFVTSAkweDI1CS8qIFVuaW1wbGVtZW50ZWQgRkxVU0ggKi8KKy8qCXRocm91Z2gJCTB4MjcJICAgdW51c2VkICovCisjZGVmaW5lCVRfQ1BFWENFUFRJT04JMHgyOAkvKiAoOSkgY29wcm9jZXNzb3IgZXhjZXB0aW9uICovCisvKgkJCTB4MjkJICAgdW51c2VkICovCisjZGVmaW5lIFRfSURJVjAJCTB4MmEJLyogZGl2aWRlIGJ5IHplcm8gKGZyb20gaHcgW3N1XWRpdiBpbnN0cikgKi8KKyNkZWZpbmUgVF9TVE9SRUJVRkZBVUxUCTB4MmIJLyogU3VwZXJTUEFSQzogU3RvcmUgYnVmZmVyIGNvcHktYmFjayBmYXVsdCAqLworLyoJCQkweDJjCSAgIHVudXNlZCAqLworLyoJdGhyb3VnaAkJMHg3ZgkgICB1bnVzZWQgKi8KKworLyogYmVnaW5uaW5nIG9mIGB1c2VyJyB2ZWN0b3JzIChmcm9tIHRyYXAgaW5zdHJ1Y3Rpb25zKSAtIGFsbCBwcmlvcml0eSAxMiAqLworI2RlZmluZQlUX1NVTl9TWVNDQUxMCTB4ODAJLyogc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUJVF9CUkVBS1BPSU5UCTB4ODEJLyogYnJlYWtwb2ludCBgaW5zdHJ1Y3Rpb24nICovCisjZGVmaW5lCVRfRElWMAkJMHg4MgkvKiBkaXZpc2lvbiByb3V0aW5lIHdhcyBoYW5kZWQgMCAqLworI2RlZmluZQlUX0ZMVVNIV0lOCTB4ODMJLyogZmx1c2ggd2luZG93cyAqLworI2RlZmluZQlUX0NMRUFOV0lOCTB4ODQJLyogcHJvdmlkZSBjbGVhbiB3aW5kb3dzICovCisjZGVmaW5lCVRfUkFOR0VDSEVDSwkweDg1CS8qID8gKi8KKyNkZWZpbmUJVF9GSVhBTElHTgkweDg2CS8qIGZpeCB1cCB1bmFsaWduZWQgYWNjZXNzZXMgKi8KKyNkZWZpbmUJVF9JTlRPRgkJMHg4NwkvKiBpbnRlZ2VyIG92ZXJmbG93ID8gKi8KKyNkZWZpbmUJVF9TVlI0X1NZU0NBTEwJMHg4OAkvKiBTVlI0IHN5c3RlbSBjYWxsICovCisjZGVmaW5lCVRfQlNEX1NZU0NBTEwJMHg4OQkvKiBCU0Qgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUJVF9LR0RCX0VYRUMJMHg4YQkvKiBmb3Iga2VybmVsIGdkYiAqLworCisvKiAweDhiLi4weGZmIGFyZSBjdXJyZW50bHkgdW5hbGxvY2F0ZWQsIGV4Y2VwdCB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIFRfU1ZSNF9HRVRDQwkJMHhhMAorI2RlZmluZSBUX1NWUjRfU0VUQ0MJCTB4YTEKKyNkZWZpbmUgVF9TVlI0X0dFVFBTUgkJMHhhMgorI2RlZmluZSBUX1NWUjRfU0VUUFNSCQkweGEzCisjZGVmaW5lIFRfU1ZSNF9HRVRIUlRJTUUJMHhhNAorI2RlZmluZSBUX1NWUjRfR0VUSFJWVElNRQkweGE1CisjZGVmaW5lIFRfU1ZSNF9HRVRIUkVTVElNRQkweGE3CisKKyNpZmRlZiBfS0VSTkVMCQkJLyogcHNldWRvIHRyYXBzIGZvciBsb2NvcmUucyAqLworI2RlZmluZQlUX1JXUkVUCQktMQkvKiBuZWVkIGZpcnN0IHVzZXIgd2luZG93IGZvciB0cmFwIHJldHVybiAqLworI2RlZmluZQlUX0FTVAkJLTIJLyogbm8tb3AsIGp1c3QgbmVlZGVkIHJlc2NoZWR1bGUgb3IgcHJvZmlsZSAqLworI2VuZGlmCisKKy8qIGZsYWdzIHRvIHN5c3RlbSBjYWxsIChmbGFncyBpbiAlZzEgYWxvbmcgd2l0aCBzeXNjYWxsIG51bWJlcikgKi8KKyNkZWZpbmUJU1lTQ0FMTF9HMlJGTEFHCTB4NDAwCS8qIG9uIHN1Y2Nlc3MsIHJldHVybiB0byAlZzIgcmF0aGVyIHRoYW4gbnBjICovCisjZGVmaW5lCVNZU0NBTExfRzdSRkxBRwkweDgwMAkvKiB1c2UgJWc3IGFzIGFib3ZlIChkZXByZWNhdGVkKSAqLworCisvKgorICogYHNvZnR3YXJlIHRyYXAnIG1hY3JvcyB0byBrZWVwIHBlb3BsZSBoYXBweSAoc3BhcmMgdjggbWFudWFsIHNheXMgbm90CisgKiB0byBzZXQgdGhlIHVwcGVyIGJpdHMpLgorICovCisjZGVmaW5lCVNUX0JSRUFLUE9JTlQJKFRfQlJFQUtQT0lOVCAmIDB4N2YpCisjZGVmaW5lCVNUX0RJVjAJCShUX0RJVjAgJiAweDdmKQorI2RlZmluZQlTVF9GTFVTSFdJTgkoVF9GTFVTSFdJTiAmIDB4N2YpCisjZGVmaW5lCVNUX1NZU0NBTEwJKFRfU1VOX1NZU0NBTEwgJiAweDdmKQorCisjZW5kaWYJCQkJLyogX01BQ0hJTkVfVFJBUF9IXyAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYzY0L2tsaWJjL2FyY2hjb25maWcuaCBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwYzAwMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC9zcGFyYzY0L2tsaWJjL2FyY2hjb25maWcuaAorICoKKyAqIFNlZSBpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oIGZvciB0aGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4KKyAqIHRoaXMgZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSENPTkZJR19ICisjZGVmaW5lIF9LTElCQ19BUkNIQ09ORklHX0gKKworI2RlZmluZSBfS0xJQkNfVVNFX1JUX1NJRyAxCS8qIFVzZSBydF8qIHNpZ25hbHMgKi8KKyNkZWZpbmUgX0tMSUJDX05FRURTX1NBX1JFU1RPUkVSIDEgLyogTmVlZCBhIHJlc3RvcmVyIGZ1bmN0aW9uICovCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3NwYXJjNjQva2xpYmMvYXJjaHNldGptcC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYzY0L2tsaWJjL2FyY2hzZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTgyNWJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYzY0L2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogYXJjaC9zcGFyYzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0VUSk1QX0gKKworc3RydWN0IF9fam1wX2J1ZiB7CisJdW5zaWduZWQgbG9uZyBfX3NwOworCXVuc2lnbmVkIGxvbmcgX19mcDsKKwl1bnNpZ25lZCBsb25nIF9fcGM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYzY0L2tsaWJjL2FyY2hzaWduYWwuaCBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwYTVjZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGFyY2gvc3BhcmM2NC9pbmNsdWRlL2tsaWJjL2FyY2hzaWduYWwuaAorICoKKyAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzaWduYWwgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfS0xJQkNfQVJDSFNJR05BTF9ICisjZGVmaW5lIF9LTElCQ19BUkNIU0lHTkFMX0gKKworI2RlZmluZSBfX1dBTlRfUE9TSVgxQl9TSUdOQUxTX18KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisKKy8qIE5vdCBhY3R1YWxseSB1c2VkIGJ5IHRoZSBrZXJuZWwuLi4gKi8KKyNkZWZpbmUgU0FfUkVTVE9SRVIJMHg4MDAwMDAwMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc3RhdC5oIGIvdXNyL2luY2x1ZGUvYXJjaC9zcGFyYzY0L2tsaWJjL2FyY2hzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmYjJhNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gvc3BhcmM2NC9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCXVuc2lnbmVkIGxvbmcJc3RfaW5vOworCXVuc2lnbmVkIGxvbmcJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisJdW5zaWduZWQgaW50CV9fcGFkMDsKKworCV9fc3RkZXY2NCAoc3RfcmRldik7CisJbG9uZwkJc3Rfc2l6ZTsKKwlsb25nCQlzdF9ibGtzaXplOworCWxvbmcJCXN0X2Jsb2NrczsKKworCXN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9tdGltOworCXN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOworCisJdW5zaWduZWQgbG9uZyBfX3VudXNlZFszXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaGNvbmZpZy5oIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTJhNmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGluY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaGNvbmZpZy5oCisgKgorICogU2VlIGluY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggZm9yIHRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbgorICogdGhpcyBmaWxlLgorICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hDT05GSUdfSAorCisvKiB4ODYtNjQgZG9lc24ndCBwcm92aWRlIGEgZGVmYXVsdCBzaWdyZXR1cm4uICovCisjZGVmaW5lIF9LTElCQ19ORUVEU19TQV9SRVNUT1JFUiAxCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfQVJDSENPTkZJR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc2V0am1wLmggYi91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0ZmM2MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L2tsaWJjL2FyY2hzZXRqbXAuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKwl1bnNpZ25lZCBsb25nIF9fcmJ4OworCXVuc2lnbmVkIGxvbmcgX19yc3A7CisJdW5zaWduZWQgbG9uZyBfX3JicDsKKwl1bnNpZ25lZCBsb25nIF9fcjEyOworCXVuc2lnbmVkIGxvbmcgX19yMTM7CisJdW5zaWduZWQgbG9uZyBfX3IxNDsKKwl1bnNpZ25lZCBsb25nIF9fcjE1OworCXVuc2lnbmVkIGxvbmcgX19yaXA7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKKworI2VuZGlmCQkJCS8qIF9TRVRKTVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaHNpZ25hbC5oIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQva2xpYmMvYXJjaHNpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGVjNzcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc2lnbmFsLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGFyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNpZ25hbC5oCisgKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNpZ25hbCBkZWZpbml0aW9ucworICoKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0lHTkFMX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgorLyogVGhlIHg4Ni02NCBoZWFkZXJzIGRlZmluZXMgTlNJRyAzMiwgYnV0IGl0J3MgYWN0dWFsbHkgNjQgKi8KKyN1bmRlZiAgX05TSUcKKyN1bmRlZiAgTlNJRworI2RlZmluZSBfTlNJRyA2NAorI2RlZmluZSBOU0lHICBfTlNJRworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2FyY2gveDg2XzY0L2tsaWJjL2FyY2hzdGF0LmggYi91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTY4YWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9rbGliYy9hcmNoc3RhdC5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgX0tMSUJDX0FSQ0hTVEFUX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL3N0YXRoZWxwLmg+CisKKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCitzdHJ1Y3Qgc3RhdCB7CisJX19zdGRldjY0CShzdF9kZXYpOworCXVuc2lnbmVkIGxvbmcJc3RfaW5vOworCXVuc2lnbmVkIGxvbmcJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisJdW5zaWduZWQgaW50CV9fcGFkMDsKKwlfX3N0ZGV2NjQJKHN0X3JkZXYpOworCWxvbmcJCXN0X3NpemU7CisJbG9uZwkJc3RfYmxrc2l6ZTsKKwlsb25nCQlzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCisJc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X210aW07CisJc3RydWN0IHRpbWVzcGVjIHN0X2N0aW07CisgIAlsb25nCQlfX3VudXNlZFszXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQvc3lzL2lvLmggYi91c3IvaW5jbHVkZS9hcmNoL3g4Nl82NC9zeXMvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTBjYTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXJjaC94ODZfNjQvc3lzL2lvLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogc3lzL2lvLmggZm9yIHRoZSBpMzg2IGFyY2hpdGVjdHVyZQorICoKKyAqIEJhc2ljIEkvTyBtYWNyb3MKKyAqLworCisjaWZuZGVmIF9TWVNfSU9fSAorI2RlZmluZSBfU1lTX0lPX0ggMQorCisvKiBJL08tcmVsYXRlZCBzeXN0ZW0gY2FsbHMgKi8KKworaW50IGlvcGwoaW50KTsKK2ludCBpb3Blcm0odW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKKworLyogQmFzaWMgSS9PIG1hY3JvcyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG91dGIodW5zaWduZWQgY2hhciBfX3YsIHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwlhc20gdm9sYXRpbGUgKCJvdXRiICUwLCUxIiA6IDogImEiIChfX3YpLCAiZE4iKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG91dHcodW5zaWduZWQgc2hvcnQgX192LCB1bnNpZ25lZCBzaG9ydCBfX3ApCit7CisJYXNtIHZvbGF0aWxlICgib3V0dyAlMCwlMSIgOiA6ICJhIiAoX192KSwgImROIihfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvdXRsKHVuc2lnbmVkIGludCBfX3YsIHVuc2lnbmVkIHNob3J0IF9fcCkKK3sKKwlhc20gdm9sYXRpbGUgKCJvdXRsICUwLCUxIiA6IDogImEiIChfX3YpLCAiZE4iKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIGluYih1bnNpZ25lZCBzaG9ydCBfX3ApCit7CisJdW5zaWduZWQgY2hhciBfX3Y7CisJYXNtIHZvbGF0aWxlICgiaW5iICUxLCUwIiA6ICI9YSIgKF9fdikgOiAiZE4iKF9fcCkpOworCXJldHVybiB2OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbncodW5zaWduZWQgc2hvcnQgX19wKQoreworCXVuc2lnbmVkIHNob3J0IF9fdjsKKwlhc20gdm9sYXRpbGUgKCJpbncgJTEsJTAiIDogIj1hIiAoX192KSA6ICJkTiIoX19wKSk7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBpbmwodW5zaWduZWQgc2hvcnQgX19wKQoreworCXVuc2lnbmVkIGludCBfX3Y7CisJYXNtIHZvbGF0aWxlICgiaW5sICUxLCUwIiA6ICI9YSIgKF9fdikgOiAiZE4iKF9fcCkpOworCXJldHVybiB2OworfQorCisvKiBTdHJpbmcgSS9PIG1hY3JvcyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitvdXRzYih1bnNpZ25lZCBzaG9ydCBfX3AsIGNvbnN0IHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IG91dHNiIgorCQkgICAgICA6ICIrUyIgKF9fZCksICIrYyIoX19uKQorCQkgICAgICA6ICJkIihfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAorb3V0c3codW5zaWduZWQgc2hvcnQgX19wLCBjb25zdCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzdyIKKwkJICAgICAgOiAiK1MiIChfX2QpLCAiK2MiKF9fbikKKwkJICAgICAgOiAiZCIoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK291dHNsKHVuc2lnbmVkIHNob3J0IF9fcCwgY29uc3Qgdm9pZCAqX19kLCB1bnNpZ25lZCBsb25nIF9fbikKK3sKKwlhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgb3V0c2wiCisJCSAgICAgIDogIitTIiAoX19kKSwgIitjIihfX24pCisJCSAgICAgIDogImQiKF9fcCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGluc2IodW5zaWduZWQgc2hvcnQgX19wLCB2b2lkICpfX2QsIHVuc2lnbmVkIGxvbmcgX19uKQoreworCWFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNiIgorCQkgICAgICA6ICIrRCIgKF9fZCksICIrYyIoX19uKQorCQkgICAgICA6ICJkIihfX3ApKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBpbnN3KHVuc2lnbmVkIHNob3J0IF9fcCwgdm9pZCAqX19kLCB1bnNpZ25lZCBsb25nIF9fbikKK3sKKwlhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgaW5zdyIKKwkJICAgICAgOiAiK0QiIChfX2QpLCAiK2MiKF9fbikKKwkJICAgICAgOiAiZCIoX19wKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5zbCh1bnNpZ25lZCBzaG9ydCBfX3AsIHZvaWQgKl9fZCwgdW5zaWduZWQgbG9uZyBfX24pCit7CisJYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc2wiCisJCSAgICAgIDogIitEIiAoX19kKSwgIitjIihfX24pCisJCSAgICAgIDogImQiKF9fcCkpOworfQorCisjZW5kaWYJCQkJLyogX1NZU19JT19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9hcnBhL2luZXQuaCBiL3Vzci9pbmNsdWRlL2FycGEvaW5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzJmNjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9hcnBhL2luZXQuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogYXJwYS9pbmV0LmgKKyAqLworCisjaWZuZGVmIF9BUlBBX0lORVRfSAorI2RlZmluZSBfQVJQQV9JTkVUX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luNi5oPgorCitfX2V4dGVybiB1aW50MzJfdCBpbmV0X2FkZHIoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBpbmV0X2F0b24oY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW5fYWRkciAqKTsKK19fZXh0ZXJuIGNoYXIgKmluZXRfbnRvYShzdHJ1Y3QgaW5fYWRkcik7CitfX2V4dGVybiBpbnQgaW5ldF9wdG9uKGludCwgY29uc3QgY2hhciAqLCB2b2lkICopOworX19leHRlcm4gY29uc3QgY2hhciAqaW5ldF9udG9wKGludCwgY29uc3Qgdm9pZCAqLCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiB1bnNpZ25lZCBpbnQgaW5ldF9uc2FwX2FkZHIoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CitfX2V4dGVybiBjaGFyICppbmV0X25zYXBfbnRvYShpbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY2hhciAqKTsKKworI2VuZGlmCQkJCS8qIF9BUlBBX0lORVRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYXNzZXJ0LmggYi91c3IvaW5jbHVkZS9hc3NlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODllMDgyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYXNzZXJ0LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGFzc2VydC5oCisgKi8KKworI2lmbmRlZiBfQVNTRVJUX0gKKyNkZWZpbmUgX0FTU0VSVF9ICisKKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCisjaWZkZWYgTkRFQlVHCisKKyNkZWZpbmUgYXNzZXJ0KHgpICgodm9pZCkoeCkpCisKKyNlbHNlCisKK2V4dGVybiBfX25vcmV0dXJuIF9fYXNzZXJ0X2ZhaWwoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCk7CisKKyNkZWZpbmUgYXNzZXJ0KHgpICgoeCkgPyAodm9pZCkwIDogX19hc3NlcnRfZmFpbCgjeCwgX19GSUxFX18sIF9fTElORV9fKSkKKworI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfQVNTRVJUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplLmggYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Y2M4ODUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS5oCkBAIC0wLDAgKzEsMyBAQAorI2lmbmRlZiBfQklUU0laRQorI2RlZmluZSBfQklUU0laRSAzMgorI2VuZGlmCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9saW1pdHMuaCBiL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjk3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9saW1pdHMuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogYml0czMyL2xpbWl0cy5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9MSU1JVFNfSAorI2RlZmluZSBfQklUU0laRV9MSU1JVFNfSAorCisjZGVmaW5lIExPTkdfQklUCTMyCisKKyNkZWZpbmUgTE9OR19NSU4JKC0yMTQ3NDgzNjQ3TC0xKQorI2RlZmluZSBMT05HX01BWAkyMTQ3NDgzNjQ3TAorI2RlZmluZSBVTE9OR19NQVgJNDI5NDk2NzI5NVVMCisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9MSU1JVFNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvc3RkZGVmLmggYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q3MzNjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvc3RkZGVmLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGJpdHMzMi9zdGRkZWYuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfU1REREVGX0gKKyNkZWZpbmUgX0JJVFNJWkVfU1REREVGX0gKKworI2RlZmluZSBfU0laRV9UCisjaWYgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX2NyaXNfXykKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaXplX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OworI2VuZGlmCisKKyNkZWZpbmUgX1BUUkRJRkZfVAordHlwZWRlZiBzaWduZWQgaW50IHB0cmRpZmZfdDsKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURERFRl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRpbnQuaCBiL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDQ0YjYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9iaXRzMzIvYml0c2l6ZS9zdGRpbnQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogYml0czMyL3N0ZGludC5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9TVERJTlRfSAorI2RlZmluZSBfQklUU0laRV9TVERJTlRfSAorCit0eXBlZGVmIHNpZ25lZCBjaGFyCQlpbnQ4X3Q7Cit0eXBlZGVmIHNob3J0IGludAkJaW50MTZfdDsKK3R5cGVkZWYgaW50CQkJaW50MzJfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludAkJaW50NjRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQJdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludDY0X3Q7CisKK3R5cGVkZWYgaW50CQkJaW50X2Zhc3QxNl90OwordHlwZWRlZiBpbnQJCQlpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgaW50CQkJaW50cHRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludHB0cl90OworCisjZGVmaW5lIF9fSU5UNjRfQyhjKSAgIGMgIyMgTEwKKyNkZWZpbmUgX19VSU5UNjRfQyhjKSAgYyAjIyBVTEwKKworI2RlZmluZSBfX1BSSTY0X1JBTksgICAibGwiCisjZGVmaW5lIF9fUFJJRkFTVF9SQU5LICIiCisjZGVmaW5lIF9fUFJJUFRSX1JBTksgICIiCisKKyNlbmRpZgkJCQkvKiBfQklUU0laRV9TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvc3RkaW50Y29uc3QuaCBiL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGludGNvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiNjNiZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGludGNvbnN0LmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGJpdHMzMi9zdGRpbnRjb25zdC5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9TVERJTlRDT05TVF9ICisjZGVmaW5lIF9CSVRTSVpFX1NURElOVENPTlNUX0gKKworI2RlZmluZSBJTlRfRkFTVDE2X0MoYykJIElOVDMyX0MoYykKKyNkZWZpbmUgSU5UX0ZBU1QzMl9DKGMpICBJTlQzMl9DKGMpCisKKyNkZWZpbmUgVUlOVF9GQVNUMTZfQyhjKSBVSU5UMzJfQyhjKQorI2RlZmluZSBVSU5UX0ZBU1QzMl9DKGMpIFVJTlQzMl9DKGMpCisKKyNkZWZpbmUgSU5UUFRSX0MoYykJIElOVDMyX0MoYykKKyNkZWZpbmUgVUlOVFBUUl9DKGMpCSBVSU5UMzJfQyhjKQorI2RlZmluZSBQVFJESUZGX0MoYykgICAgIElOVDMyX0MoYykKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURElOVENPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGludGxpbWl0cy5oIGIvdXNyL2luY2x1ZGUvYml0czMyL2JpdHNpemUvc3RkaW50bGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1MDk0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHMzMi9iaXRzaXplL3N0ZGludGxpbWl0cy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBiaXRzMzIvc3RkaW50bGltaXRzLmgKKyAqLworCisjaWZuZGVmIF9CSVRTSVpFX1NURElOVExJTUlUU19ICisjZGVmaW5lIF9CSVRTSVpFX1NURElOVExJTUlUU19ICisKKyNkZWZpbmUgSU5UX0ZBU1QxNl9NSU4JSU5UMzJfTUlOCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOCUlOVDMyX01JTgorI2RlZmluZSBJTlRfRkFTVDE2X01BWAlJTlQzMl9NQVgKKyNkZWZpbmUgSU5UX0ZBU1QzMl9NQVgJSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDE2X01BWCBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDMyX01BWCBVSU5UMzJfTUFYCisKKyNkZWZpbmUgSU5UUFRSX01JTglJTlQzMl9NSU4KKyNkZWZpbmUgSU5UUFRSX01BWAlJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVFBUUl9NQVgJVUlOVDMyX01BWAorCisjZGVmaW5lIFBUUkRJRkZfTUlOCUlOVDMyX01JTgorI2RlZmluZSBQVFJESUZGX01BWAlJTlQzMl9NQVgKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURElOVExJTUlUU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS5oIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDY5NmZkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUuaApAQCAtMCwwICsxLDMgQEAKKyNpZm5kZWYgX0JJVFNJWkUKKyNkZWZpbmUgX0JJVFNJWkUgNjQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvbGltaXRzLmggYi91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWJiZjgzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvbGltaXRzLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGJpdHM2NC9saW1pdHMuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfTElNSVRTX0gKKyNkZWZpbmUgX0JJVFNJWkVfTElNSVRTX0gKKworI2RlZmluZSBMT05HX0JJVAk2NAorCisjZGVmaW5lIExPTkdfTUlOCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyNkZWZpbmUgTE9OR19NQVgJOTIyMzM3MjAzNjg1NDc3NTgwN0wKKyNkZWZpbmUgVUxPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX0xJTUlUU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9zdGRkZWYuaCBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTQyYTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9zdGRkZWYuaApAQCAtMCwwICsxLDEzIEBACisvKgorICogYml0czY0L3N0ZGRlZi5oCisgKi8KKworI2lmbmRlZiBfQklUU0laRV9TVERERUZfSAorI2RlZmluZSBfQklUU0laRV9TVERERUZfSAorCisjZGVmaW5lIF9TSVpFX1QKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzaXplX3Q7CisjZGVmaW5lIF9QVFJESUZGX1QKK3R5cGVkZWYgc2lnbmVkIGxvbmcgcHRyZGlmZl90OworCisjZW5kaWYJCQkJLyogX0JJVFNJWkVfU1REREVGX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGludC5oIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4ZTYzOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2JpdHM2NC9iaXRzaXplL3N0ZGludC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBiaXRzNjQvc3RkaW50LmgKKyAqLworCisjaWZuZGVmIF9CSVRTSVpFX1NURElOVF9ICisjZGVmaW5lIF9CSVRTSVpFX1NURElOVF9ICisKK3R5cGVkZWYgc2lnbmVkIGNoYXIJCWludDhfdDsKK3R5cGVkZWYgc2hvcnQgaW50CQlpbnQxNl90OwordHlwZWRlZiBpbnQJCQlpbnQzMl90OwordHlwZWRlZiBsb25nIGludAkJaW50NjRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1aW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQJdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnQ2NF90OworCit0eXBlZGVmIGxvbmcgaW50CQlpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGxvbmcgaW50CQlpbnRfZmFzdDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludF9mYXN0MzJfdDsKKwordHlwZWRlZiBsb25nIGludAkJaW50cHRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CXVpbnRwdHJfdDsKKworI2RlZmluZSBfX0lOVDY0X0MoYykgIGMgIyMgTAorI2RlZmluZSBfX1VJTlQ2NF9DKGMpIGMgIyMgVUwKKworI2RlZmluZSBfX1BSSTY0X1JBTksJImwiCisjZGVmaW5lIF9fUFJJRkFTVF9SQU5LICAibCIKKyNkZWZpbmUgX19QUklQVFJfUkFOSwkibCIKKworI2VuZGlmCQkJCS8qIF9CSVRTSVpFX1NURElOVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9zdGRpbnRjb25zdC5oIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkaW50Y29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU4ZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkaW50Y29uc3QuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogYml0czY0L3N0ZGludGNvbnN0LmgKKyAqLworCisjaWZuZGVmIF9CSVRTSVpFX1NURElOVENPTlNUX0gKKyNkZWZpbmUgX0JJVFNJWkVfU1RESU5UQ09OU1RfSAorCisjZGVmaW5lIElOVF9GQVNUMTZfQyhjKQkgSU5UNjRfQyhjKQorI2RlZmluZSBJTlRfRkFTVDMyX0MoYykgIElOVDY0X0MoYykKKworI2RlZmluZSBVSU5UX0ZBU1QxNl9DKGMpIFVJTlQ2NF9DKGMpCisjZGVmaW5lIFVJTlRfRkFTVDMyX0MoYykgVUlOVDY0X0MoYykKKworI2RlZmluZSBJTlRQVFJfQyhjKQkgSU5UNjRfQyhjKQorI2RlZmluZSBVSU5UUFRSX0MoYykJIFVJTlQ2NF9DKGMpCisjZGVmaW5lIFBUUkRJRkZfQyhjKSAgICAgSU5UNjRfQyhjKQorCisjZW5kaWYJCQkJLyogX0JJVFNJWkVfU1RESU5UQ09OU1RfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkaW50bGltaXRzLmggYi91c3IvaW5jbHVkZS9iaXRzNjQvYml0c2l6ZS9zdGRpbnRsaW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDVkNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvYml0czY0L2JpdHNpemUvc3RkaW50bGltaXRzLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGJpdHM2NC9zdGRpbnRsaW1pdHMuaAorICovCisKKyNpZm5kZWYgX0JJVFNJWkVfU1RESU5UTElNSVRTX0gKKyNkZWZpbmUgX0JJVFNJWkVfU1RESU5UTElNSVRTX0gKKworI2RlZmluZSBJTlRfRkFTVDE2X01JTglJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1QzMl9NSU4JSU5UNjRfTUlOCisjZGVmaW5lIElOVF9GQVNUMTZfTUFYCUlOVDY0X01BWAorI2RlZmluZSBJTlRfRkFTVDMyX01BWAlJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMTZfTUFYIFVJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVF9GQVNUMzJfTUFYIFVJTlQ2NF9NQVgKKworI2RlZmluZSBJTlRQVFJfTUlOCUlOVDY0X01JTgorI2RlZmluZSBJTlRQVFJfTUFYCUlOVDY0X01BWAorI2RlZmluZSBVSU5UUFRSX01BWAlVSU5UNjRfTUFYCisKKyNkZWZpbmUgUFRSRElGRl9NSU4JSU5UNjRfTUlOCisjZGVmaW5lIFBUUkRJRkZfTUFYCUlOVDY0X01BWAorCisjZW5kaWYJCQkJLyogX0JJVFNJWkVfU1RESU5UTElNSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2J5dGVzd2FwLmggYi91c3IvaW5jbHVkZS9ieXRlc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDFhMjgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9ieXRlc3dhcC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBieXRlc3dhcC5oCisgKi8KKworI2lmbmRlZiBfQllURVNXQVBfSAorI2RlZmluZSBfQllURVNXQVBfSAorCisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNkZWZpbmUgYnN3YXBfMTYoeCkgX19zd2FiMTYoeCkKKyNkZWZpbmUgYnN3YXBfMzIoeCkgX19zd2FiMzIoeCkKKyNkZWZpbmUgYnN3YXBfNjQoeCkgX19zd2FiNjQoeCkKKworI2VuZGlmCQkJCS8qIF9CWVRFU1dBUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9jdHlwZS5oIGIvdXNyL2luY2x1ZGUvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzBhZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvY3R5cGUuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIGN0eXBlLmgKKyAqCisgKiBUaGlzIGFzc3VtZXMgSVNPIDg4NTktMSwgYmVpbmcgYSByZWFzb25hYmxlIHN1cGVyc2V0IG9mIEFTQ0lJLgorICovCisKKyNpZm5kZWYgX0NUWVBFX0gKKyNkZWZpbmUgX0NUWVBFX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorCisvKgorICogVGhpcyByZWxpZXMgb24gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKKyAqCisgKiBjbnRybCA9ICFwcmludAorICogYWxwaGEgPSB1cHBlcnxsb3dlcgorICogZ3JhcGggPSBwdW5jdHxhbHBoYXxkaWdpdAorICogYmxhbmsgPSAnXHQnIHx8ICcgJyAocGVyIFBPU0lYIHJlcXVpcmVtZW50KQorICovCitlbnVtIHsKKwlfX2N0eXBlX3VwcGVyID0gKDEgPDwgMCksCisJX19jdHlwZV9sb3dlciA9ICgxIDw8IDEpLAorCV9fY3R5cGVfZGlnaXQgPSAoMSA8PCAyKSwKKwlfX2N0eXBlX3hkaWdpdCA9ICgxIDw8IDMpLAorCV9fY3R5cGVfc3BhY2UgPSAoMSA8PCA0KSwKKwlfX2N0eXBlX3ByaW50ID0gKDEgPDwgNSksCisJX19jdHlwZV9wdW5jdCA9ICgxIDw8IDYpLAorCV9fY3R5cGVfY250cmwgPSAoMSA8PCA3KSwKK307CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIF9fY3R5cGVzW107CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNhbG51bShpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmCisJICAgIChfX2N0eXBlX3VwcGVyIHwgX19jdHlwZV9sb3dlciB8IF9fY3R5cGVfZGlnaXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzYWxwaGEoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiAoX19jdHlwZV91cHBlciB8IF9fY3R5cGVfbG93ZXIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzYXNjaWkoaW50IF9fYykKK3sKKwlyZXR1cm4gIShfX2MgJiB+MHg3Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNibGFuayhpbnQgX19jKQoreworCXJldHVybiAoX19jID09ICdcdCcpIHx8IChfX2MgPT0gJyAnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19jdHlwZV9pc2NudHJsKGludCBfX2MpCit7CisJcmV0dXJuIF9fY3R5cGVzW19fYyArIDFdICYgX19jdHlwZV9jbnRybDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19jdHlwZV9pc2RpZ2l0KGludCBfX2MpCit7CisJcmV0dXJuICgodW5zaWduZWQpX19jIC0gJzAnKSA8PSA5OworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2N0eXBlX2lzZ3JhcGgoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJgorCSAgICAoX19jdHlwZV91cHBlciB8IF9fY3R5cGVfbG93ZXIgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV9wdW5jdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNsb3dlcihpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfbG93ZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNwcmludChpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfcHJpbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNwdW5jdChpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfcHVuY3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXNzcGFjZShpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfc3BhY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXN1cHBlcihpbnQgX19jKQoreworCXJldHVybiBfX2N0eXBlc1tfX2MgKyAxXSAmIF9fY3R5cGVfdXBwZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fY3R5cGVfaXN4ZGlnaXQoaW50IF9fYykKK3sKKwlyZXR1cm4gX19jdHlwZXNbX19jICsgMV0gJiBfX2N0eXBlX3hkaWdpdDsKK30KKworLyogTm90ZTogdGhpcyBpcyBkZWNpbWFsLCBub3QgaGV4LCB0byBhdm9pZCBhY2NpZGVudGFsIHByb21vdGlvbiB0byB1bnNpZ25lZCAqLworI2RlZmluZSBfdG91cHBlcihfX2MpICgoX19jKSAmIH4zMikKKyNkZWZpbmUgX3RvbG93ZXIoX19jKSAoKF9fYykgfCAzMikKKworc3RhdGljIGlubGluZSBpbnQgX19jdHlwZV90b3VwcGVyKGludCBfX2MpCit7CisJcmV0dXJuIF9fY3R5cGVfaXNsb3dlcihfX2MpID8gX3RvdXBwZXIoX19jKSA6IF9fYzsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19jdHlwZV90b2xvd2VyKGludCBfX2MpCit7CisJcmV0dXJuIF9fY3R5cGVfaXN1cHBlcihfX2MpID8gX3RvbG93ZXIoX19jKSA6IF9fYzsKK30KKworI2lmZGVmIF9fQ1RZUEVfTk9fSU5MSU5FCisjIGRlZmluZSBfX0NUWVBFRlVOQyhYKSBcCisgIF9fZXh0ZXJuIGludCBYKGludCk7CisjZWxzZQorI2RlZmluZSBfX0NUWVBFRlVOQyhYKSBcCisgIF9fZXh0ZXJuIGlubGluZSBpbnQgWChpbnQgX19jKQkJXAorICB7CQkJCQkJXAorICAgIHJldHVybiBfX2N0eXBlXyMjWChfX2MpOyAJCQlcCisgIH0KKyNlbmRpZgorCitfX0NUWVBFRlVOQyhpc2FsbnVtKQorICAgIF9fQ1RZUEVGVU5DKGlzYWxwaGEpCisgICAgX19DVFlQRUZVTkMoaXNhc2NpaSkKKyAgICBfX0NUWVBFRlVOQyhpc2JsYW5rKQorICAgIF9fQ1RZUEVGVU5DKGlzY250cmwpCisgICAgX19DVFlQRUZVTkMoaXNkaWdpdCkKKyAgICBfX0NUWVBFRlVOQyhpc2dyYXBoKQorICAgIF9fQ1RZUEVGVU5DKGlzbG93ZXIpCisgICAgX19DVFlQRUZVTkMoaXNwcmludCkKKyAgICBfX0NUWVBFRlVOQyhpc3B1bmN0KQorICAgIF9fQ1RZUEVGVU5DKGlzc3BhY2UpCisgICAgX19DVFlQRUZVTkMoaXN1cHBlcikKKyAgICBfX0NUWVBFRlVOQyhpc3hkaWdpdCkKKyAgICBfX0NUWVBFRlVOQyh0b3VwcGVyKQorICAgIF9fQ1RZUEVGVU5DKHRvbG93ZXIpCisjZW5kaWYJCQkJLyogX0NUWVBFX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2RpcmVudC5oIGIvdXNyL2luY2x1ZGUvZGlyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyNDQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2RpcmVudC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBkaXJlbnQuaAorICovCisKKyNpZm5kZWYgX0RJUkVOVF9ICisjZGVmaW5lIF9ESVJFTlRfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3lzL2RpcmVudC5oPgorCitzdHJ1Y3QgX0lPX2RpciB7CisJaW50IF9fZmQ7CisKKyNpZmRlZiBfX0tMSUJDX0RJUkVOVF9JTlRFUk5BTFMKKwkvKiBUaGVzZSBmaWVsZHMgZm9yIGludGVybmFsIHVzZSBvbmx5ICovCisKKwlzaXplX3QgYnl0ZXNfbGVmdDsKKwlzdHJ1Y3QgZGlyZW50ICpuZXh0OworCS8qIERlY2xhcmluZyB0aGlzIGFzIGFuIGFycmF5IG9mIHN0cnVjdCBlbmZvcmNlcyBjb3JyZWN0IGFsaWdubWVudCAqLworCXN0cnVjdCBkaXJlbnQgYnVmZmVyWzE1XTsJLyogMTUgdGltZXMgbWF4IGRpcmVudCBzaXplID1+IDRLICovCisjZW5kaWYKK307Cit0eXBlZGVmIHN0cnVjdCBfSU9fZGlyIERJUjsKKworX19leHRlcm4gRElSICpvcGVuZGlyKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBzdHJ1Y3QgZGlyZW50ICpyZWFkZGlyKERJUiAqKTsKK19fZXh0ZXJuIGludCBjbG9zZWRpcihESVIgKik7CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZGlyZmQoRElSICogX19kKQoreworCXJldHVybiBfX2QtPl9fZmQ7Cit9CisKKyNlbmRpZgkJCQkvKiBfRElSRU5UX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2VsZi5oIGIvdXNyL2luY2x1ZGUvZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0M2E4MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2VsZi5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBlbGYuaAorICovCisKKyNpZm5kZWYgX0VMRl9ICisjZGVmaW5lIF9FTEZfSAorCisjaW5jbHVkZSA8c3lzL2VsZjMyLmg+CisjaW5jbHVkZSA8c3lzL2VsZjY0Lmg+CisKKyNlbmRpZgkJCQkvKiBfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2VuZGlhbi5oIGIvdXNyL2luY2x1ZGUvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjZDZkOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2VuZGlhbi5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBlbmRpYW4uaAorICovCisKKyNpZm5kZWYgX0VORElBTl9ICisjZGVmaW5lIF9FTkRJQU5fSAorCisjaW5jbHVkZSA8a2xpYmMvZW5kaWFuLmg+CisKKyNkZWZpbmUgTElUVExFX0VORElBTglfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgQklHX0VORElBTglfX0JJR19FTkRJQU4KKyNkZWZpbmUgUERQX0VORElBTglfX1BEUF9FTkRJQU4KKyNkZWZpbmUgQllURV9PUkRFUglfX0JZVEVfT1JERVIKKworI2VuZGlmCQkJCS8qIF9FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvZXJybm8uaCBiL3Vzci9pbmNsdWRlL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlMjBiZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2Vycm5vLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGVycm5vLmgKKyAqLworCisjaWZuZGVmIF9FUlJOT19ICisjZGVmaW5lIF9FUlJOT19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworX19leHRlcm4gaW50IGVycm5vOworCisjZW5kaWYgLyogX0VSUk5PX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2ZjbnRsLmggYi91c3IvaW5jbHVkZS9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDhlMjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9mY250bC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBmY250bC5oCisgKi8KKworI2lmbmRlZiBfRkNOVExfSAorI2RlZmluZSBfRkNOVExfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiAhZGVmaW5lZChfX21pcHM2NF9fKQorIyBpbmNsdWRlIDxrbGliYy9hcmNoZmNudGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKy8qIFRoaXMgaXMgdWdseSwgYnV0ICJzdHJ1Y3QgZmxvY2siIGhhcyBhY3R1YWxseSBiZWVuIGRlZmluZWQgd2l0aAorICAgYSBsb25nIG9mZl90LCBzbyBpdCdzIHJlYWxseSAic3RydWN0IGZsb2NrNjQiLiAgSXQganVzdCBoYXBwZW5zCisgICB0byB3b3JrLiAgR2FnLiAgQmFyZi4KKworICAgVGhpcyBoYXBwZW5zIHRvIHdvcmsgb24gYWxsIDMyLWJpdCBhcmNoaXRlY3R1cmVzIGV4Y2VwdCBNSVBTLiAqLworCisjaWZkZWYgRl9HRVRMSzY0CisjIHVuZGVmIEZfR0VUTEsKKyMgZGVmaW5lIEZfR0VUTEsgRl9HRVRMSzY0CisjZW5kaWYKKworI2lmZGVmIEZfU0VUTEs2NAorIyB1bmRlZiBGX1NFVExLCisjIGRlZmluZSBGX1NFVExLIEZfU0VUTEs2NAorI2VuZGlmCisKKyNpZmRlZiBGX1NFVExLVzY0CisjIHVuZGVmIEZfU0VUTEtXCisjIGRlZmluZSBGX1NFVExLVyBGX1NFVExLVzY0CisjZW5kaWYKKworLyogVGhpcyBpcyBkZWZpbmVkIGhlcmUgYXMgd2VsbCBhcyBpbiA8dW5pc3RkLmg+ICovCisjaWZuZGVmIF9LTElCQ19JTl9PUEVOX0MKK19fZXh0ZXJuIGludCBvcGVuKGNvbnN0IGNoYXIgKiwgaW50LCAuLi4pOworX19leHRlcm4gaW50IG9wZW5hdChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCAuLi4pOworI2VuZGlmCisKK19fZXh0ZXJuIGludCBjcmVhdChjb25zdCBjaGFyICosIG1vZGVfdCk7CitfX2V4dGVybiBpbnQgZmNudGwoaW50LCBpbnQsIC4uLik7CisKKyNlbmRpZgkJCQkvKiBfRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvZm5tYXRjaC5oIGIvdXNyL2luY2x1ZGUvZm5tYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODgxNDAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9mbm1hdGNoLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfRk5NQVRDSF9ICisjZGVmaW5lIF9GTk1BVENIX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorCisjZGVmaW5lIEZOTV9OT01BVENICQkxCisKKyNkZWZpbmUgRk5NX1BBVEhOQU1FCQkxCisjZGVmaW5lIEZOTV9GSUxFX05BTUUJCUZOTV9QQVRITkFNRQorI2RlZmluZSBGTk1fTk9FU0NBUEUJCTIKKyNkZWZpbmUgRk5NX1BFUklPRAkJNAorCitfX2V4dGVybiBpbnQgZm5tYXRjaChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2VuZGlmIC8qIF9GTk1BVENIX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2dldG9wdC5oIGIvdXNyL2luY2x1ZGUvZ2V0b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjNDFjZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2dldG9wdC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0dFVE9QVF9ICisjZGVmaW5lIF9HRVRPUFRfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisKK3N0cnVjdCBvcHRpb24geworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGhhc19hcmc7CisJaW50ICpmbGFnOworCWludCB2YWw7Cit9OworCitlbnVtIHsKKwlub19hcmd1bWVudAkgID0gMCwKKwlyZXF1aXJlZF9hcmd1bWVudCA9IDEsCisJb3B0aW9uYWxfYXJndW1lbnQgPSAyLAorfTsKKworX19leHRlcm4gaW50IGdldG9wdF9sb25nKGludCwgY2hhciAqY29uc3QgKiwgY29uc3QgY2hhciAqLAorCQkJIGNvbnN0IHN0cnVjdCBvcHRpb24gKiwgaW50ICopOworCisjZW5kaWYgLyogX0dFVE9QVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9ncnAuaCBiL3Vzci9pbmNsdWRlL2dycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YmY3OWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9ncnAuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogZ3JwLmgKKyAqLworCisjaWZuZGVmIF9HUlBfSAorI2RlZmluZSBfR1JQX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitzdHJ1Y3QgZ3JvdXAgeworCWNoYXIgKmdyX25hbWU7CisJY2hhciAqZ3JfcGFzc3dkOworCWdpZF90IGdyX2dpZDsKKwljaGFyICoqZ3JfbWVtOworfTsKKworX19leHRlcm4gaW50IHNldGdyb3VwcyhzaXplX3QsIGNvbnN0IGdpZF90ICopOworCisjZW5kaWYJCQkJLyogX0dSUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9pbnR0eXBlcy5oIGIvdXNyL2luY2x1ZGUvaW50dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMxMWZlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvaW50dHlwZXMuaApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIGludHR5cGVzLmgKKyAqLworCisjaWZuZGVmIF9JTlRUWVBFU19ICisjZGVmaW5lIF9JTlRUWVBFU19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworc3RhdGljIF9faW5saW5lX18gaW50bWF4X3QgaW1heGFicyhpbnRtYXhfdCBfX24pCit7CisJcmV0dXJuIChfX24gPCAoaW50bWF4X3QpIDApID8gLV9fbiA6IF9fbjsKK30KKworX19leHRlcm4gaW50bWF4X3Qgc3RydG9pbWF4KGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKK19fZXh0ZXJuIHVpbnRtYXhfdCBzdHJ0b3VtYXgoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworCisvKiBleHRlbnNpb25zICovCitfX2V4dGVybiBpbnRtYXhfdCBzdHJudG9pbWF4KGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50LCBzaXplX3QpOworX19leHRlcm4gdWludG1heF90IHN0cm50b3VtYXgoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQsIHNpemVfdCk7CisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfRk9STUFUX01BQ1JPUykKKworI2RlZmluZSBQUklkOAkiZCIKKyNkZWZpbmUgUFJJZDE2CSJkIgorI2RlZmluZSBQUklkMzIJImQiCisjZGVmaW5lIFBSSWQ2NAlfX1BSSTY0X1JBTksgImQiCisKKyNkZWZpbmUgUFJJZExFQVNUOAkiZCIKKyNkZWZpbmUgUFJJZExFQVNUMTYJImQiCisjZGVmaW5lIFBSSWRMRUFTVDMyCSJkIgorI2RlZmluZSBQUklkTEVBU1Q2NAlfX1BSSTY0X1JBTksgImQiCisKKyNkZWZpbmUgUFJJZEZBU1Q4CSJkIgorI2RlZmluZSBQUklkRkFTVDE2CV9fUFJJRkFTVF9SQU5LICJkIgorI2RlZmluZSBQUklkRkFTVDMyCV9fUFJJRkFTVF9SQU5LICJkIgorI2RlZmluZSBQUklkRkFTVDY0CV9fUFJJNjRfUkFOSyAiZCIKKworI2RlZmluZSBQUklkTUFYCSBfX1BSSTY0X1JBTksgImQiCisjZGVmaW5lIFBSSWRQVFIgIF9fUFJJUFRSX1JBTksgImQiCisKKyNkZWZpbmUgUFJJaTgJImkiCisjZGVmaW5lIFBSSWkxNgkiaSIKKyNkZWZpbmUgUFJJaTMyCSJpIgorI2RlZmluZSBQUklpNjQJX19QUkk2NF9SQU5LICJpIgorCisjZGVmaW5lIFBSSWlMRUFTVDgJImkiCisjZGVmaW5lIFBSSWlMRUFTVDE2CSJpIgorI2RlZmluZSBQUklpTEVBU1QzMgkiaSIKKyNkZWZpbmUgUFJJaUxFQVNUNjQJX19QUkk2NF9SQU5LICJpIgorCisjZGVmaW5lIFBSSWlGQVNUOAkiaSIKKyNkZWZpbmUgUFJJaUZBU1QxNglfX1BSSUZBU1RfUkFOSyAiaSIKKyNkZWZpbmUgUFJJaUZBU1QzMglfX1BSSUZBU1RfUkFOSyAiaSIKKyNkZWZpbmUgUFJJaUZBU1Q2NAlfX1BSSTY0X1JBTksgImkiCisKKyNkZWZpbmUgUFJJaU1BWAkgX19QUkk2NF9SQU5LICJpIgorI2RlZmluZSBQUklpUFRSICBfX1BSSVBUUl9SQU5LICJpIgorCisjZGVmaW5lIFBSSW84CSJvIgorI2RlZmluZSBQUklvMTYJIm8iCisjZGVmaW5lIFBSSW8zMgkibyIKKyNkZWZpbmUgUFJJbzY0CV9fUFJJNjRfUkFOSyAibyIKKworI2RlZmluZSBQUklvTEVBU1Q4CSJvIgorI2RlZmluZSBQUklvTEVBU1QxNgkibyIKKyNkZWZpbmUgUFJJb0xFQVNUMzIJIm8iCisjZGVmaW5lIFBSSW9MRUFTVDY0CV9fUFJJNjRfUkFOSyAibyIKKworI2RlZmluZSBQUklvRkFTVDgJIm8iCisjZGVmaW5lIFBSSW9GQVNUMTYJX19QUklGQVNUX1JBTksgIm8iCisjZGVmaW5lIFBSSW9GQVNUMzIJX19QUklGQVNUX1JBTksgIm8iCisjZGVmaW5lIFBSSW9GQVNUNjQJX19QUkk2NF9SQU5LICJvIgorCisjZGVmaW5lIFBSSW9NQVgJIF9fUFJJNjRfUkFOSyAibyIKKyNkZWZpbmUgUFJJb1BUUiAgX19QUklQVFJfUkFOSyAibyIKKworI2RlZmluZSBQUkl1OAkidSIKKyNkZWZpbmUgUFJJdTE2CSJ1IgorI2RlZmluZSBQUkl1MzIJInUiCisjZGVmaW5lIFBSSXU2NAlfX1BSSTY0X1JBTksgInUiCisKKyNkZWZpbmUgUFJJdUxFQVNUOAkidSIKKyNkZWZpbmUgUFJJdUxFQVNUMTYJInUiCisjZGVmaW5lIFBSSXVMRUFTVDMyCSJ1IgorI2RlZmluZSBQUkl1TEVBU1Q2NAlfX1BSSTY0X1JBTksgInUiCisKKyNkZWZpbmUgUFJJdUZBU1Q4CSJ1IgorI2RlZmluZSBQUkl1RkFTVDE2CV9fUFJJRkFTVF9SQU5LICJ1IgorI2RlZmluZSBQUkl1RkFTVDMyCV9fUFJJRkFTVF9SQU5LICJ1IgorI2RlZmluZSBQUkl1RkFTVDY0CV9fUFJJNjRfUkFOSyAidSIKKworI2RlZmluZSBQUkl1TUFYCSBfX1BSSTY0X1JBTksgInUiCisjZGVmaW5lIFBSSXVQVFIgIF9fUFJJUFRSX1JBTksgInUiCisKKyNkZWZpbmUgUFJJeDgJIngiCisjZGVmaW5lIFBSSXgxNgkieCIKKyNkZWZpbmUgUFJJeDMyCSJ4IgorI2RlZmluZSBQUkl4NjQJX19QUkk2NF9SQU5LICJ4IgorCisjZGVmaW5lIFBSSXhMRUFTVDgJIngiCisjZGVmaW5lIFBSSXhMRUFTVDE2CSJ4IgorI2RlZmluZSBQUkl4TEVBU1QzMgkieCIKKyNkZWZpbmUgUFJJeExFQVNUNjQJX19QUkk2NF9SQU5LICJ4IgorCisjZGVmaW5lIFBSSXhGQVNUOAkieCIKKyNkZWZpbmUgUFJJeEZBU1QxNglfX1BSSUZBU1RfUkFOSyAieCIKKyNkZWZpbmUgUFJJeEZBU1QzMglfX1BSSUZBU1RfUkFOSyAieCIKKyNkZWZpbmUgUFJJeEZBU1Q2NAlfX1BSSTY0X1JBTksgIngiCisKKyNkZWZpbmUgUFJJeE1BWAkgX19QUkk2NF9SQU5LICJ4IgorI2RlZmluZSBQUkl4UFRSICBfX1BSSVBUUl9SQU5LICJ4IgorCisjZGVmaW5lIFBSSVg4CSJYIgorI2RlZmluZSBQUklYMTYJIlgiCisjZGVmaW5lIFBSSVgzMgkiWCIKKyNkZWZpbmUgUFJJWDY0CV9fUFJJNjRfUkFOSyAiWCIKKworI2RlZmluZSBQUklYTEVBU1Q4CSJYIgorI2RlZmluZSBQUklYTEVBU1QxNgkiWCIKKyNkZWZpbmUgUFJJWExFQVNUMzIJIlgiCisjZGVmaW5lIFBSSVhMRUFTVDY0CV9fUFJJNjRfUkFOSyAiWCIKKworI2RlZmluZSBQUklYRkFTVDgJIlgiCisjZGVmaW5lIFBSSVhGQVNUMTYJX19QUklGQVNUX1JBTksgIlgiCisjZGVmaW5lIFBSSVhGQVNUMzIJX19QUklGQVNUX1JBTksgIlgiCisjZGVmaW5lIFBSSVhGQVNUNjQJX19QUkk2NF9SQU5LICJYIgorCisjZGVmaW5lIFBSSVhNQVgJIF9fUFJJNjRfUkFOSyAiWCIKKyNkZWZpbmUgUFJJWFBUUiAgX19QUklQVFJfUkFOSyAiWCIKKworI2RlZmluZSBTQ05kOAkiaGhkIgorI2RlZmluZSBTQ05kMTYJImhkIgorI2RlZmluZSBTQ05kMzIJImQiCisjZGVmaW5lIFNDTmQ2NAlfX1BSSTY0X1JBTksgImQiCisKKyNkZWZpbmUgU0NOZExFQVNUOAkiaGhkIgorI2RlZmluZSBTQ05kTEVBU1QxNgkiaGQiCisjZGVmaW5lIFNDTmRMRUFTVDMyCSJkIgorI2RlZmluZSBTQ05kTEVBU1Q2NAlfX1BSSTY0X1JBTksgImQiCisKKyNkZWZpbmUgU0NOZEZBU1Q4CSJoaGQiCisjZGVmaW5lIFNDTmRGQVNUMTYJX19QUklGQVNUX1JBTksgImQiCisjZGVmaW5lIFNDTmRGQVNUMzIJX19QUklGQVNUX1JBTksgImQiCisjZGVmaW5lIFNDTmRGQVNUNjQJX19QUkk2NF9SQU5LICJkIgorCisjZGVmaW5lIFNDTmRNQVgJIF9fUFJJNjRfUkFOSyAiZCIKKyNkZWZpbmUgU0NOZFBUUiAgX19QUklQVFJfUkFOSyAiZCIKKworI2RlZmluZSBTQ05pOAkiaGhpIgorI2RlZmluZSBTQ05pMTYJImhpIgorI2RlZmluZSBTQ05pMzIJImkiCisjZGVmaW5lIFNDTmk2NAlfX1BSSTY0X1JBTksgImkiCisKKyNkZWZpbmUgU0NOaUxFQVNUOAkiaGhpIgorI2RlZmluZSBTQ05pTEVBU1QxNgkiaGkiCisjZGVmaW5lIFNDTmlMRUFTVDMyCSJpIgorI2RlZmluZSBTQ05pTEVBU1Q2NAlfX1BSSTY0X1JBTksgImkiCisKKyNkZWZpbmUgU0NOaUZBU1Q4CSJoaGkiCisjZGVmaW5lIFNDTmlGQVNUMTYJX19QUklGQVNUX1JBTksgImkiCisjZGVmaW5lIFNDTmlGQVNUMzIJX19QUklGQVNUX1JBTksgImkiCisjZGVmaW5lIFNDTmlGQVNUNjQJX19QUkk2NF9SQU5LICJpIgorCisjZGVmaW5lIFNDTmlNQVgJIF9fUFJJNjRfUkFOSyAiaSIKKyNkZWZpbmUgU0NOaVBUUiAgX19QUklQVFJfUkFOSyAiaSIKKworI2RlZmluZSBTQ05vOAkiaGhvIgorI2RlZmluZSBTQ05vMTYJImhvIgorI2RlZmluZSBTQ05vMzIJIm8iCisjZGVmaW5lIFNDTm82NAlfX1BSSTY0X1JBTksgIm8iCisKKyNkZWZpbmUgU0NOb0xFQVNUOAkiaGhvIgorI2RlZmluZSBTQ05vTEVBU1QxNgkiaG8iCisjZGVmaW5lIFNDTm9MRUFTVDMyCSJvIgorI2RlZmluZSBTQ05vTEVBU1Q2NAlfX1BSSTY0X1JBTksgIm8iCisKKyNkZWZpbmUgU0NOb0ZBU1Q4CSJoaG8iCisjZGVmaW5lIFNDTm9GQVNUMTYJX19QUklGQVNUX1JBTksgIm8iCisjZGVmaW5lIFNDTm9GQVNUMzIJX19QUklGQVNUX1JBTksgIm8iCisjZGVmaW5lIFNDTm9GQVNUNjQJX19QUkk2NF9SQU5LICJvIgorCisjZGVmaW5lIFNDTm9NQVgJIF9fUFJJNjRfUkFOSyAibyIKKyNkZWZpbmUgU0NOb1BUUiAgX19QUklQVFJfUkFOSyAibyIKKworI2RlZmluZSBTQ051OAkiaGh1IgorI2RlZmluZSBTQ051MTYJImh1IgorI2RlZmluZSBTQ051MzIJInUiCisjZGVmaW5lIFNDTnU2NAlfX1BSSTY0X1JBTksgInUiCisKKyNkZWZpbmUgU0NOdUxFQVNUOAkiaGh1IgorI2RlZmluZSBTQ051TEVBU1QxNgkiaHUiCisjZGVmaW5lIFNDTnVMRUFTVDMyCSJ1IgorI2RlZmluZSBTQ051TEVBU1Q2NAlfX1BSSTY0X1JBTksgInUiCisKKyNkZWZpbmUgU0NOdUZBU1Q4CSJoaHUiCisjZGVmaW5lIFNDTnVGQVNUMTYJX19QUklGQVNUX1JBTksgInUiCisjZGVmaW5lIFNDTnVGQVNUMzIJX19QUklGQVNUX1JBTksgInUiCisjZGVmaW5lIFNDTnVGQVNUNjQJX19QUkk2NF9SQU5LICJ1IgorCisjZGVmaW5lIFNDTnVNQVgJIF9fUFJJNjRfUkFOSyAidSIKKyNkZWZpbmUgU0NOdVBUUiAgX19QUklQVFJfUkFOSyAidSIKKworI2RlZmluZSBTQ054OAkiaGh4IgorI2RlZmluZSBTQ054MTYJImh4IgorI2RlZmluZSBTQ054MzIJIngiCisjZGVmaW5lIFNDTng2NAlfX1BSSTY0X1JBTksgIngiCisKKyNkZWZpbmUgU0NOeExFQVNUOAkiaGh4IgorI2RlZmluZSBTQ054TEVBU1QxNgkiaHgiCisjZGVmaW5lIFNDTnhMRUFTVDMyCSJ4IgorI2RlZmluZSBTQ054TEVBU1Q2NAlfX1BSSTY0X1JBTksgIngiCisKKyNkZWZpbmUgU0NOeEZBU1Q4CSJoaHgiCisjZGVmaW5lIFNDTnhGQVNUMTYJX19QUklGQVNUX1JBTksgIngiCisjZGVmaW5lIFNDTnhGQVNUMzIJX19QUklGQVNUX1JBTksgIngiCisjZGVmaW5lIFNDTnhGQVNUNjQJX19QUkk2NF9SQU5LICJ4IgorCisjZGVmaW5lIFNDTnhNQVgJIF9fUFJJNjRfUkFOSyAieCIKKyNkZWZpbmUgU0NOeFBUUiAgX19QUklQVFJfUkFOSyAieCIKKworI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfSU5UVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUva2xpYmMvY29tcGlsZXIuaCBiL3Vzci9pbmNsdWRlL2tsaWJjL2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2NjIzNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2tsaWJjL2NvbXBpbGVyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBrbGliYy9jb21waWxlci5oCisgKgorICogVmFyaW91cyBjb21waWxlciBmZWF0dXJlcworICovCisKKyNpZm5kZWYgX0tMSUJDX0NPTVBJTEVSX0gKKyNkZWZpbmUgX0tMSUJDX0NPTVBJTEVSX0gKKworLyogU3BlY2lmaWMgY2FsbGluZyBjb252ZW50aW9ucyAqLworLyogX19jZGVjbCBpcyB1c2VkIHdoZW4gd2Ugd2FudCB2YXJhZGljIGFuZCBub24tdmFyYWRpYyBmdW5jdGlvbnMgdG8gaGF2ZQorICAgdGhlIHNhbWUgYmluYXJ5IGNhbGxpbmcgY29udmVudGlvbi4gKi8KKyNpZmRlZiBfX2kzODZfXworIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fY2RlY2wgX19hdHRyaWJ1dGVfXygoY2RlY2wscmVncGFybSgwKSkpCisjIGVsc2UKKyAgLyogTW9zdCBvdGhlciBDIGNvbXBpbGVycyBoYXZlIF9fY2RlY2wgYXMgYSBrZXl3b3JkICovCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgX19jZGVjbAkJLyogTWVhbmluZ2xlc3Mgb24gbm9uLWkzODYgKi8KKyNlbmRpZgorCisvKiBIb3cgdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIHRoYXQgKm11c3QqIGJlIGlubGluZWQgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBpZiBfX0dOVUNfXyA+PSAzCisjICBkZWZpbmUgX19tdXN0X2lubGluZSBzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyMgZWxzZQorIyAgZGVmaW5lIF9fbXVzdF9pbmxpbmUgZXh0ZXJuIF9faW5saW5lX18KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBfX211c3RfaW5saW5lIGlubGluZQkvKiBKdXN0IGhvcGUgdGhpcyB3b3Jrcy4uLiAqLworI2VuZGlmCisKKy8qIEhvdyB0byBkZWNsYXJlIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCByZXR1cm4gKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgX19ub3JldHVybiB2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKKyNlbHNlCisjIGRlZmluZSBfX25vcmV0dXJuIHZvaWQKKyNlbmRpZgorCisvKiAiY29uc3QiIGZ1bmN0aW9uOgorCisgICAgIE1hbnkgZnVuY3Rpb25zIGRvIG5vdCBleGFtaW5lIGFueSB2YWx1ZXMgZXhjZXB0IHRoZWlyIGFyZ3VtZW50cywKKyAgICAgYW5kIGhhdmUgbm8gZWZmZWN0cyBleGNlcHQgdGhlIHJldHVybiB2YWx1ZS4gIEJhc2ljYWxseSB0aGlzIGlzCisgICAgIGp1c3Qgc2xpZ2h0bHkgbW9yZSBzdHJpY3QgY2xhc3MgdGhhbiB0aGUgYHB1cmUnIGF0dHJpYnV0ZSBhYm92ZSwKKyAgICAgc2luY2UgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgdG8gcmVhZCBnbG9iYWwgbWVtb3J5LgorCisgICAgIE5vdGUgdGhhdCBhIGZ1bmN0aW9uIHRoYXQgaGFzIHBvaW50ZXIgYXJndW1lbnRzIGFuZCBleGFtaW5lcyB0aGUKKyAgICAgZGF0YSBwb2ludGVkIHRvIG11c3QgX25vdF8gYmUgZGVjbGFyZWQgYGNvbnN0Jy4gIExpa2V3aXNlLCBhCisgICAgIGZ1bmN0aW9uIHRoYXQgY2FsbHMgYSBub24tYGNvbnN0JyBmdW5jdGlvbiB1c3VhbGx5IG11c3Qgbm90IGJlCisgICAgIGBjb25zdCcuICBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIGZvciBhIGBjb25zdCcgZnVuY3Rpb24gdG8gcmV0dXJuCisgICAgIGB2b2lkJy4KKyovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIF9fY29uc3RmdW5jIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKKyNlbHNlCisjIGRlZmluZSBfX2NvbnN0ZnVuYworI2VuZGlmCisjdW5kZWYgX19hdHRyaWJ1dGVfY29uc3RfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fY29uc3RmdW5jCisKKy8qICJwdXJlIiBmdW5jdGlvbjoKKworICAgICBNYW55IGZ1bmN0aW9ucyBoYXZlIG5vIGVmZmVjdHMgZXhjZXB0IHRoZSByZXR1cm4gdmFsdWUgYW5kIHRoZWlyCisgICAgIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9ubHkgb24gdGhlIHBhcmFtZXRlcnMgYW5kL29yIGdsb2JhbAorICAgICB2YXJpYWJsZXMuICBTdWNoIGEgZnVuY3Rpb24gY2FuIGJlIHN1YmplY3QgdG8gY29tbW9uIHN1YmV4cHJlc3Npb24KKyAgICAgZWxpbWluYXRpb24gYW5kIGxvb3Agb3B0aW1pemF0aW9uIGp1c3QgYXMgYW4gYXJpdGhtZXRpYyBvcGVyYXRvcgorICAgICB3b3VsZCBiZS4gIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgd2l0aCB0aGUgYXR0cmlidXRlCisgICAgIGBwdXJlJy4KKyovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIF9fcHVyZWZ1bmMgX19hdHRyaWJ1dGVfXygocHVyZSkpCisjZWxzZQorIyBkZWZpbmUgX19wdXJlZnVuYworI2VuZGlmCisjdW5kZWYgX19hdHRyaWJ1dGVfcHVyZV9fCisjZGVmaW5lIF9fYXR0cmlidXRlX3B1cmVfXyBfX3B1cmVmdW5jCisKKy8qIEZvcm1hdCBhdHRyaWJ1dGUgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgX19mb3JtYXRmdW5jKHQsZixhKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQodCxmLGEpKSkKKyNlbHNlCisjIGRlZmluZSBfX2Zvcm1hdGZ1bmModCxmLGEpCisjZW5kaWYKKworLyogbWFsbG9jKCkgZnVuY3Rpb24gKHJldHVybnMgdW5hbGlhc2VkIHBvaW50ZXIpICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDMpCisjIGRlZmluZSBfX21hbGxvY2Z1bmMgX19hdHRyaWJ1dGVfXygobWFsbG9jKSkKKyNlbHNlCisjIGRlZmluZSBfX21hbGxvY2Z1bmMKKyNlbmRpZgorCisvKiBsaWtlbHkvdW5saWtlbHkgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDk1KSkKKyMgZGVmaW5lIF9fbGlrZWx5KHgpICAgX19idWlsdGluX2V4cGVjdCgoeCksIDEpCisjIGRlZmluZSBfX3VubGlrZWx5KHgpIF9fYnVpbHRpbl9leHBlY3QoKHgpLCAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGlrZWx5KHgpICAgKHgpCisjIGRlZmluZSBfX3VubGlrZWx5KHgpICh4KQorI2VuZGlmCisKKy8qIFBvc3NpYmx5IHVudXNlZCBmdW5jdGlvbiAqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBfX3VudXNlZGZ1bmMJX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjIGRlZmluZSBfX3VudXNlZGZ1bmMKKyNlbmRpZgorCisvKiBJdCdzIGFsbCB1c2VyIHNwYWNlLi4uICovCisjZGVmaW5lIF9fdXNlcgorCisvKiBUaGUgYml0d2lzZSBhdHRyaWJ1dGU6IGRpc2FsbG93IGFyaXRobWV0cmljIG9wZXJhdGlvbnMgKi8KKyNpZmRlZiBfX0NIRUNLRVJfXwkJLyogc3BhcnNlIG9ubHkgKi8KKyMgZGVmaW5lIF9fYml0d2lzZQlfX2F0dHJpYnV0ZV9fKChiaXR3aXNlKSkKKyNlbHNlCisjIGRlZmluZSBfX2JpdHdpc2UKKyNlbmRpZgorCisvKiBTaHV0IHVwIHVudXNlZCB3YXJuaW5ncyAqLworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBfX2F0dHJpYnV0ZV91c2VkX18gX19hdHRyaWJ1dGVfXygodXNlZCkpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfdXNlZF9fCisjZW5kaWYKKworLyogQ29tcGlsZXIgcHJhZ21hIHRvIG1ha2UgYW4gYWxpYXMgc3ltYm9sICovCisjZGVmaW5lIF9fQUxJQVMoX190LCBfX2YsIF9fcCwgX19hKSBcCisgIF9fdCBfX2YgX19wIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCNfX2EpKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUva2xpYmMvZGl2ZXJyLmggYi91c3IvaW5jbHVkZS9rbGliYy9kaXZlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzA4ODdlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUva2xpYmMvZGl2ZXJyLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIGtsaWJjL2RpdmVyci5oCisgKi8KKworI2lmbmRlZiBfS0xJQkNfRElWRVJSX0gKKyNkZWZpbmUgX0tMSUJDX0RJVkVSUl9ICisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2RpdmlkZV9lcnJvcih2b2lkKQoreworCXJhaXNlKFNJR0ZQRSk7Cit9CisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfRElWRVJSX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2tsaWJjL2VuZGlhbi5oIGIvdXNyL2luY2x1ZGUva2xpYmMvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1NjNkZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2tsaWJjL2VuZGlhbi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBrbGliYy9lbmRpYW4uaAorICoKKyAqIExpa2UgPGVuZGlhbi5oPiwgYnV0IGV4cG9ydCBvbmx5IGRvdWJsZS11bmRlcnNjb3JlIHN5bWJvbHMKKyAqLworCisjaWZuZGVmIF9LTElCQ19FTkRJQU5fSAorI2RlZmluZSBfS0xJQkNfRU5ESUFOX0gKKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBMaW51eCcgYXNtL2J5dGVvcmRlci5oIGRlZmluZXMgZWl0aGVyIF9fTElUVExFX0VORElBTiBvcgorICAgX19CSUdfRU5ESUFOLCBidXQgdGhlIGdsaWJjL0JTRC1pc2ggbWFjcm9zIGV4cGVjdCBib3RoIHRvIGJlCisgICBkZWZpbmVkIHdpdGggX19CWVRFX09SREVSIGRlZmluaW5nIHdoaWNoIGlzIGFjdHVhbGx5IHVzZWQuLi4gKi8KKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorIyB1bmRlZiAgX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4gMTIzNAorIyBkZWZpbmUgX19CSUdfRU5ESUFOICAgIDQzMjEKKyMgZGVmaW5lIF9fUERQX0VORElBTiAgICAzNDEyCisjIGRlZmluZSBfX0JZVEVfT1JERVIgICAgX19MSVRUTEVfRU5ESUFOCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyMgdW5kZWYgIF9fQklHX0VORElBTgorIyBkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyMgZGVmaW5lIF9fQklHX0VORElBTiAgICA0MzIxCisjIGRlZmluZSBfX1BEUF9FTkRJQU4gICAgMzQxMgorIyBkZWZpbmUgX19CWVRFX09SREVSICAgIF9fQklHX0VORElBTgorI2VsaWYgZGVmaW5lZChfX1BEUF9FTkRJQU4pCisjIHVuZGVmICBfX1BEUF9FTkRJQU4KKyMgZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjIGRlZmluZSBfX0JJR19FTkRJQU4gICAgNDMyMQorIyBkZWZpbmUgX19QRFBfRU5ESUFOICAgIDM0MTIKKyMgZGVmaW5lIF9fQllURV9PUkRFUiAgICBfX1BEUF9FTkRJQU4KKyNlbHNlCisjIGVycm9yICJVbmtub3duIGJ5dGUgb3JkZXIhIgorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL2tsaWJjL2V4dGVybi5oIGIvdXNyL2luY2x1ZGUva2xpYmMvZXh0ZXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3YzdiOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2tsaWJjL2V4dGVybi5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBrbGliYy9leHRlcm4uaAorICovCisKKyNpZm5kZWYgX0tMSUJDX0VYVEVSTl9ICisjZGVmaW5lIF9LTElCQ19FWFRFUk5fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgX19leHRlcm4gZXh0ZXJuICJDIgorI2Vsc2UKKyNkZWZpbmUgX19leHRlcm4gZXh0ZXJuCisjZW5kaWYKKworI2RlZmluZSBfX2FsaWFzKHgpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKHgpKSkKKworI2VuZGlmCQkJCS8qIF9LTElCQ19FWFRFUk5fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUva2xpYmMvc3RhdGhlbHAuaCBiL3Vzci9pbmNsdWRlL2tsaWJjL3N0YXRoZWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyMGRhZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL2tsaWJjL3N0YXRoZWxwLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHN0YXRoZWxwLmgKKyAqCisgKiBIZWxwZXIgbWFjcm9zIGZvciA8a2xpYmMvYXJjaHN0YXQuaD4KKyAqLworCisjaWZuZGVmIF9LTElCQ19TVEFUSEVMUF9ICisjZGVmaW5lIF9LTElCQ19TVEFUSEVMUF9ICisKKyNpbmNsdWRlIDxrbGliYy9lbmRpYW4uaD4KKworLyoKKyAqIE1vc3QgYXJjaGl0ZWN0dXJlcyBoYXZlIGEgNjQtYml0IGZpZWxkIGZvciBzdF9kZXYgYW5kIHN0X3JkZXYsCisgKiBidXQgZGV2X3QgaXMgMzIgYml0cyAodWludDMyX3QgPT0gdW5zaWduZWQgaW50KSwgc28gbWFrZSBhCisgKiBtYWNybyB3ZSBjYW4gdXNlIGFjcm9zcyBhbGwgYXJjaGl0ZWN0dXJlcy4KKyAqLworCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyBkZWZpbmUgX19zdGRldjY0KHgpCXVuc2lnbmVkIGludCBfXyMjeCwgeDsKKyNlbHNlCisjIGRlZmluZSBfX3N0ZGV2NjQoeCkJdW5zaWduZWQgaW50IHgsIF9fIyN4OworI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfS0xJQkNfU1RBVEhFTFBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUva2xpYmMvc3lzY29uZmlnLmggYi91c3IvaW5jbHVkZS9rbGliYy9zeXNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzEzMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUva2xpYmMvc3lzY29uZmlnLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBrbGliYy9zeXNjb25maWcuaAorICoKKyAqIEFsbG93cyBmb3IgZGVmaW5pdGlvbnMgb2Ygc29tZSB0aGluZ3Mgd2hpY2ggbWF5IGJlIHN5c3RlbS1kZXBlbmRlbnQKKyAqIE5PVEU6IHRoaXMgZmlsZSBtdXN0IG5vdCByZXN1bHQgaW4gYW55IG91dHB1dCBmcm9tIHRoZSBwcmVwcm9jZXNzb3IuCisgKi8KKworI2lmbmRlZiBfS0xJQkNfU1lTQ09ORklHX0gKKyNkZWZpbmUgX0tMSUJDX1NZU0NPTkZJR19ICisKKyNpbmNsdWRlIDxrbGliYy9hcmNoY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisvKgorICogVGhlc2UgYXJlIHRoZSB2YXJpYWJsZXMgdGhhdCBjYW4gYmUgZGVmaW5lZCBpbiA8a2xpYmMvYXJjaGNvbmZpZy5oPi4KKyAqIEZvciBib29sZWFuIG9wdGlvbnMsICNkZWZpbmUgdG8gMCB0byBkaXNhYmxlLCAjZGVmaW5lIHRvIDEgdG8gZW5hYmxlLgorICoKKyAqIElmIHVuZGVmaW5lZCwgdGhleSB3aWxsIGJlIGdpdmVuIGRlZmF1bHRzIGhlcmUuCisgKi8KKworCisvKgorICogX0tMSUJDX05PX01NVToKKyAqCisgKglJbmRpY2F0ZXMgdGhpcyBhcmNoaXRlY3R1cmUgZG9lc24ndCBoYXZlIGFuIE1NVSwgYW5kIHRoZXJlZm9yZQorICoJZG9lcyBub3QgaGF2ZSB0aGUgc3lzX2ZvcmsgYW5kIHN5c19icmsgc3lzdGVtIGNhbGxzLgorICovCisvKiBEZWZhdWx0IHRvIGhhdmluZyBhbiBNTVUgaWYgd2UgY2FuIGZpbmQgdGhlIGZvcmsgc3lzdGVtIGNhbGwgKi8KKyNpZm5kZWYgX0tMSUJDX05PX01NVQorIyBpZiBkZWZpbmVkKF9fTlJfZm9yaykKKyMgIGRlZmluZSBfS0xJQkNfTk9fTU1VIDAKKyMgZWxzZQorIyAgZGVmaW5lIF9LTElCQ19OT19NTVUgMQorIyBlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19SRUFMX1ZGT1JLOgorICoKKyAqCUluZGljYXRlcyB0aGF0IHRoaXMgYXJjaGl0ZWN0dXJlIGhhcyBhIHJlYWwgdmZvcmsoKSBzeXN0ZW0gY2FsbC4KKyAqCVRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgc3lzX3Zmb3JrIGV4aXN0czsgaWYgdGhlcmUgaXMgYW4KKyAqCWFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgdmZvcmsoKSwgZGVmaW5lIHRoaXMKKyAqCXN5bWJvbC4KKyAqLworI2lmbmRlZiBfS0xJQkNfUkVBTF9WRk9SSworIyBpZiBkZWZpbmVkKF9fTlJfdmZvcmspCisjICBkZWZpbmUgX0tMSUJDX1JFQUxfVkZPUksgMQorIyBlbHNlCisjICBkZWZpbmUgX0tMSUJDX1JFQUxfVkZPUksgMAorIyBlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19VU0VfTU1BUDI6CisgKgorICoJSW5kaWNhdGVzIHRoYXQgdGhpcyBhcmNoaXRlY3R1cmUgc2hvdWxkIHVzZSBzeXNfbW1hcDIgaW5zdGVhZAorICoJb2Ygc3lzX21tYXAuICBUaGlzIGlzIHRoZSBkZWZhdWx0IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLCBhc3N1bWluZworICoJc3lzX21tYXAyIGV4aXN0cy4KKyAqLworI2lmbmRlZiBfS0xJQkNfVVNFX01NQVAyCisjIGlmIChfQklUU0laRSA9PSAzMiAmJiBkZWZpbmVkKF9fTlJfbW1hcDIpKSB8fCBcCisgICAgIChfQklUU0laRSA9PSA2NCAmJiAhZGVmaW5lZChfX05SX21tYXApKQorIyAgZGVmaW5lIF9LTElCQ19VU0VfTU1BUDIgMQorIyBlbHNlCisjICBkZWZpbmUgX0tMSUJDX1VTRV9NTUFQMiAwCisjIGVuZGlmCisjZW5kaWYKKworCisvKgorICogX0tMSUJDX01NQVAyX1NISUZUOgorICoKKyAqCUluZGljYXRlIHRoZSBzaGlmdCBvZiB0aGUgb2Zmc2V0IHBhcmFtZXRlciBpbiBzeXNfbW1hcDIuCisgKglPbiBtb3N0IGFyY2hpdGVjdHVyZXMsIHRoaXMgaXMgYWx3YXlzIDEyLCBidXQgb24gc29tZQorICoJYXJjaGl0ZWN0dXJlcyBpdCBjYW4gYmUgYSBkaWZmZXJlbnQgbnVtYmVyLCBvciB0aGUgY3VycmVudAorICoJcGFnZSBzaXplLiAgSWYgdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHBhZ2Ugc2l6ZSwgZGVmaW5lCisgKgl0aGlzIHRvIGFuIGV4cHJlc3Npb24gd2hpY2ggaW5jbHVkZXMgX19nZXRwYWdlc2hpZnQoKS4KKyAqLworI2lmbmRlZiBfS0xJQkNfTU1BUDJfU0hJRlQKKyMgZGVmaW5lIF9LTElCQ19NTUFQMl9TSElGVCAxMgorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19NQUxMT0NfVVNFU19TQlJLOgorICoKKyAqCUluZGljYXRlcyB0aGF0IG1hbGxvYygpIHNob3VsZCB1c2Ugc2JyaygpIHRvIG9idGFpbiByYXcgbWVtb3J5CisgKglmcm9tIHRoZSBzeXN0ZW0sIHJhdGhlciB0aGFuIG1tYXAoKS4KKyAqLworLyogRGVmYXVsdCB0byBnZXQgbWVtb3J5IHVzaW5nIG1tYXAoKSAqLworI2lmbmRlZiBfS0xJQkNfTUFMTE9DX1VTRVNfU0JSSworIyBkZWZpbmUgX0tMSUJDX01BTExPQ19VU0VTX1NCUksgMAorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19NQUxMT0NfQ0hVTktfU0laRToKKyAqCVRoaXMgaXMgdGhlIG1pbmltdW0gY2h1bmsgc2l6ZSB3ZSB3aWxsIGFzayB0aGUga2VybmVsIGZvciB1c2luZworICoJbWFsbG9jKCk7IHRoaXMgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZSBhbmQgbXVzdAorICoJYmUgYSBwb3dlciBvZiAyLgorICovCisjaWZuZGVmIF9LTElCQ19NQUxMT0NfQ0hVTktfU0laRQorIyBkZWZpbmUgX0tMSUJDX01BTExPQ19DSFVOS19TSVpFCTY1NTM2CisjZW5kaWYKKworCisvKgorICogX0tMSUJDX1NCUktfQUxJR05NRU5UOgorICoKKyAqCVRoaXMgaXMgdGhlIG1pbmltdW0gYWxpZ25tZW50IGZvciB0aGUgbWVtb3J5IHJldHVybmVkIGJ5CisgKglzYnJrKCkuICBJdCBtdXN0IGJlIGEgcG93ZXIgb2YgMi4gIElmIF9LTElCQ19NQUxMT0NfVVNFU19TQlJLCisgKglpcyBzZXQgaXQgc2hvdWxkIGJlIG5vIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBzdHJ1Y3QKKyAqCWFyZW5hX2hlYWRlciBpbiBtYWxsb2MuaCAoPT0gNCBwb2ludGVycy4pCisgKi8KKyNpZm5kZWYgX0tMSUJDX1NCUktfQUxJR05NRU5UCisjIGRlZmluZSBfS0xJQkNfU0JSS19BTElHTk1FTlQJCTMyCisjZW5kaWYKKworCisvKgorICogX0tMSUJDX1VTRV9SVF9TSUc6CisgKgorICogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGlzIGFyY2hpdGVjdHVyZSBzaG91bGQgdXNlIHRoZSBydF9zaWcqKCkKKyAqICAgICAgZmFtaWx5IG9mIHN5c3RlbSBjYWxscywgZXZlbiBpZiB0aGUgb2xkZXIgc3lzdGVtIGNhbGxzIGFyZQorICogICAgICBwcm92aWRlZC4gIFRoaXMgcmVxdWlyZXMgdGhhdCA8YXNtL3NpZ25hbC5oPiBpcyBjb3JyZWN0IGZvcgorICogICAgICB1c2luZyB3aXRoIHRoZSBydF9zaWcqKCkgc3lzdGVtIGNhbGxzLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBpZgorICogICAgICB0aGUgb2xkZXIgc3lzdGVtIGNhbGxzIGFyZSB1bmRlZmluZWQgaW4gPGFzbS91bmlzdGQuaD4uCisgKgorICovCisjaWZuZGVmIF9LTElCQ19VU0VfUlRfU0lHCisjIGlmZGVmIF9fTlJfc2lnYWN0aW9uCisjICBkZWZpbmUgX0tMSUJDX1VTRV9SVF9TSUcgMAorIyBlbHNlCisjICBkZWZpbmUgX0tMSUJDX1VTRV9SVF9TSUcgMQorIyBlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIF9LTElCQ19ORUVEU19TQV9SRVNUT1JFUjoKKyAqCisgKglTb21lIGFyY2hpdGVjdHVyZXMsIGxpa2UgeDg2LTY0IGFuZCBzb21lIGkzODYgRmVkb3JhIGtlcm5lbHMsCisgKglkbyBub3QgcHJvdmlkZSBhIGRlZmF1bHQgc2lncmV0dXJuLCBhbmQgdGhlcmVmb3JlIG11c3QgaGF2ZQorICoJU0FfUkVTVE9SRVIgc2V0LgorICovCisjaWZuZGVmIF9LTElCQ19ORUVEU19TQV9SRVNUT1JFUgorIyBkZWZpbmUgX0tMSUJDX05FRURTX1NBX1JFU1RPUkVSIDAKKyNlbmRpZgorCisKKy8qCisgKiBfS0xJQkNfU1RBVEZTX0ZfVFlQRV82NDoKKyAqCisgKglUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBmX3R5cGUsIGZfYnNpemUsIGZfbmFtZWxlbiwKKyAqCWZfZnJzaXplLCBhbmQgZl9zcGFyZSBmaWVsZHMgb2Ygc3RydWN0IHN0YXRmcyBhcmUKKyAqCTY0IGJpdHMgbG9uZy4gIFRoaXMgaXMgbm9ybWFsbHkgdGhlIGNhc2UgZm9yIDY0LWJpdAorICoJcGxhdGZvcm1zLCBhbmQgc28gaXMgdGhlIGRlZmF1bHQgZm9yIHRob3NlLiAgU2VlCisgKgl1c3IvaW5jbHVkZS9zeXMvdmZzLmggZm9yIHRoZSBleGFjdCBkZXRhaWxzLgorICovCisjaWZuZGVmIF9LTElCQ19TVEFURlNfRl9UWVBFXzY0CisjIGRlZmluZSBfS0xJQkNfU1RBVEZTX0ZfVFlQRV82NCAoX0JJVFNJWkUgPT0gNjQpCisjZW5kaWYKKworCisvKgorICogX0tMSUJDX1NUQVRGU19GX1RZUEVfMzJCOgorICoKKyAqIAltaXBzIGhhcyBpdCdzIG93biBkZWZpbml0aW9uIG9mIHN0YXRmcywgd2hpY2ggaXMKKyAqIAlkaWZmZXJlbnQgZnJvbSBhbnkgb3RoZXIgMzIgYml0IGFyY2guCisgKi8JCisjaWZuZGVmIF9LTElCQ19TVEFURlNfRl9UWVBFXzMyQgorIyBkZWZpbmUgX0tMSUJDX1NUQVRGU19GX1RZUEVfMzJCIDAKKyNlbmRpZgorCisKKy8qCisgKiBfS0xJQkNfSEFTX0FSQ0hTT0NLRVRfSAorICoKKyAqICAgICAgIFRoaXMgYXJjaGl0ZWN0dXJlIGhhcyA8a2xpYmMvYXJjaHNvY2tldC5oPgorICovCisjaWZuZGVmIF9LTElCQ19IQVNfQVJDSFNPQ0tFVF9ICisjIGRlZmluZSBfS0xJQkNfSEFTX0FSQ0hTT0NLRVRfSCAwCisjZW5kaWYKKworI2VuZGlmIC8qIF9LTElCQ19TWVNDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbGltaXRzLmggYi91c3IvaW5jbHVkZS9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDJmMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbGltaXRzLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIGxpbWl0cy5oCisgKi8KKworI2lmbmRlZiBfTElNSVRTX0gKKyNkZWZpbmUgX0xJTUlUU19ICisKKyNkZWZpbmUgQ0hBUl9CSVQJOAorI2RlZmluZSBTSFJUX0JJVAkxNgorI2RlZmluZSBJTlRfQklUCQkzMgorI2RlZmluZSBMT05HTE9OR19CSVQJNjQKKworI2RlZmluZSBTQ0hBUl9NSU4JKC0xMjgpCisjZGVmaW5lIFNDSEFSX01BWAkxMjcKKyNkZWZpbmUgVUNIQVJfTUFYCTI1NQorCisjaWZkZWYgX19DSEFSX1VOU0lHTkVEX18KKyMgZGVmaW5lIENIQVJfTUlOIDAKKyMgZGVmaW5lIENIQVJfTUFYIFVDSEFSX01BWAorI2Vsc2UKKyMgZGVmaW5lIENIQVJfTUlOIFNDSEFSX01JTgorIyBkZWZpbmUgQ0hBUl9NQVggU0NIQVJfTUFYCisjZW5kaWYKKworI2RlZmluZSBTSFJUX01JTgkoLTMyNzY4KQorI2RlZmluZSBTSFJUX01BWAkzMjc2NworI2RlZmluZSBVU0hSVF9NQVgJNjU1MzUKKworI2RlZmluZSBJTlRfTUlOCQkoLTIxNDc0ODM2NDctMSkKKyNkZWZpbmUgSU5UX01BWAkJMjE0NzQ4MzY0NworI2RlZmluZSBVSU5UX01BWAk0Mjk0OTY3Mjk1VQorCisjZGVmaW5lIExPTkdMT05HX01JTgkoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTC0xKQorI2RlZmluZSBMT05HTE9OR19NQVgJOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisjZGVmaW5lIFVMT05HTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEwKKworI2luY2x1ZGUgPGJpdHNpemUvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKKyNlbmRpZgkJCQkvKiBfTElNSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL21hbGxvYy5oIGIvdXNyL2luY2x1ZGUvbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3MzE2NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL21hbGxvYy5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBtYWxsb2MuaAorICoKKyAqIEFwcGFyZW50bHkgcGVvcGxlIGhhdmVuJ3QgY2F1Z2h0IG9uIHRvIHVzZSA8c3RkbGliLmg+LCB3aGljaCBpcyB0aGUKKyAqIHN0YW5kYXJkIHBsYWNlIGZvciB0aGlzIGNyYXAgc2luY2UgdGhlIDE5ODAncy4uLgorICovCisKKyNpZm5kZWYgX01BTExPQ19ICisjZGVmaW5lIF9NQUxMT0NfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19leHRlcm4gdm9pZCBmcmVlKHZvaWQgKik7CisKK19fZXh0ZXJuIF9fbWFsbG9jZnVuYyB2b2lkICptYWxsb2Moc2l6ZV90KTsKK19fZXh0ZXJuIF9fbWFsbG9jZnVuYyB2b2lkICpjYWxsb2Moc2l6ZV90LCBzaXplX3QpOworX19leHRlcm4gX19tYWxsb2NmdW5jIHZvaWQgKnJlYWxsb2Modm9pZCAqLCBzaXplX3QpOworCisjZW5kaWYJCQkJLyogX01BTExPQ19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9uZXQvaWYuaCBiL3Vzci9pbmNsdWRlL25ldC9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWEwYzAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXQvaWYuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX05FVF9JRl9ICisjZGVmaW5lIF9ORVRfSUZfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworI2VuZGlmIC8qIF9ORVRfSUZfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0L2lmX2FycC5oIGIvdXNyL2luY2x1ZGUvbmV0L2lmX2FycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNWYxYjQKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXQvaWZfYXJwLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0L2lmX3BhY2tldC5oIGIvdXNyL2luY2x1ZGUvbmV0L2lmX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZThlMGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXQvaWZfcGFja2V0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0L3JvdXRlLmggYi91c3IvaW5jbHVkZS9uZXQvcm91dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjBkZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0L3JvdXRlLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmggYi91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwZWYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmggYi91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1MmJiMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApAQCAtMCwwICsxLDM3IEBACisvKgorICogbmV0aW5ldC9pbi5oCisgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JTl9ICisjZGVmaW5lIF9ORVRJTkVUX0lOX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgkJLyogTXVzdCBiZSBpbmNsdWRlZCAqYmVmb3JlKiA8bGludXgvaW4uaD4gKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CQkvKiBNdXN0IGJlIGluY2x1ZGVkICpiZWZvcmUqIDxsaW51eC9pbi5oPiAqLworI2luY2x1ZGUgPGxpbnV4L2luLmg+CisKKyNpZm5kZWYgaHRvbnMKKyMgZGVmaW5lIGh0b25zKHgpCV9fY3B1X3RvX2JlMTYoeCkKKyNlbmRpZgorI2lmbmRlZiBudG9ocworIyBkZWZpbmUgbnRvaHMoeCkJX19iZTE2X3RvX2NwdSh4KQorI2VuZGlmCisjaWZuZGVmIGh0b25sCisjIGRlZmluZSBodG9ubCh4KQlfX2NwdV90b19iZTMyKHgpCisjZW5kaWYKKyNpZm5kZWYgbnRvaGwKKyMgZGVmaW5lIG50b2hsKHgpCV9fYmUzMl90b19jcHUoeCkKKyNlbmRpZgorI2lmbmRlZiBodG9ucQorIyBkZWZpbmUgaHRvbnEoeCkJX19jcHVfdG9fYmU2NCh4KQorI2VuZGlmCisjaWZuZGVmIG50b2hxCisjIGRlZmluZSBudG9ocSh4KQlfX2JlNjRfdG9fY3B1KHgpCisjZW5kaWYKKworI2RlZmluZSBJUFBPUlRfUkVTRVJWRUQJMTAyNAorCitfX2V4dGVybiBpbnQgYmluZHJlc3Zwb3J0KGludCBzZCwgc3RydWN0IHNvY2thZGRyX2luICpzaW4pOworCisjZW5kaWYJCQkJLyogX05FVElORVRfSU5fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbjYuaCBiL3Vzci9pbmNsdWRlL25ldGluZXQvaW42LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2ZGE5MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL25ldGluZXQvaW42LmgKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIG5ldGluZXQvaW42LmgKKyAqLworCisjaWZuZGVmIF9ORVRJTkVUX0lONl9ICisjZGVmaW5lIF9ORVRJTkVUX0lONl9ICisKKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKworI2VuZGlmCQkJCS8qIF9ORVRJTkVUX0lONl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9uZXRpbmV0L2lwLmggYi91c3IvaW5jbHVkZS9uZXRpbmV0L2lwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4NGJmZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL25ldGluZXQvaXAuaApAQCAtMCwwICsxLDEzIEBACisvKgorICogbmV0aW5ldC9pcC5oCisgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JUF9ICisjZGVmaW5lIF9ORVRJTkVUX0lQX0gKKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisKKyNkZWZpbmUgSVBfREYJCTB4NDAwMAkvKiBGbGFnOiAiRG9uJ3QgRnJhZ21lbnQiICovCisKKyNlbmRpZgkJCQkvKiBfTkVUSU5FVF9JUF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9uZXRpbmV0L3RjcC5oIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC90Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM0NzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvbmV0aW5ldC90Y3AuaApAQCAtMCwwICsxLDExIEBACisvKgorICogbmV0aW5ldC90Y3AuaAorICovCisKKyNpZm5kZWYgX05FVElORVRfVENQX0gKKyNkZWZpbmUgX05FVElORVRfVENQX0gKKworI2luY2x1ZGUgPGVuZGlhbi5oPgkJLyogSW5jbHVkZSAqYmVmb3JlKiBsaW51eC90Y3AuaCAqLworI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorCisjZW5kaWYJCQkJLyogX05FVElORVRfVENQX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL25ldGluZXQvdWRwLmggYi91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNmY1ODgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBuZXRpbmV0L3VkcC5oCisgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9VRFBfSAorI2RlZmluZSBfTkVUSU5FVF9VRFBfSAorCisvKgorICogV2Ugd291bGQgaW5jbHVkZSBsaW51eC91ZHAuaCwgYnV0IGl0IGJyaW5ncyBpbiB0b28gbXVjaCBvdGhlciBzdHVmZgorICovCisKK3N0cnVjdCB1ZHBoZHIgeworCV9fdTE2IHNvdXJjZTsKKwlfX3UxNiBkZXN0OworCV9fdTE2IGxlbjsKKwlfX3UxNiBjaGVjazsKK307CisKKyNlbmRpZgkJCQkvKiBfTkVUSU5FVF9VRFBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvbmV0cGFja2V0L3BhY2tldC5oIGIvdXNyL2luY2x1ZGUvbmV0cGFja2V0L3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZThlMGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9uZXRwYWNrZXQvcGFja2V0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvcGF0aHMuaCBiL3Vzci9pbmNsdWRlL3BhdGhzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllZjMwMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3BhdGhzLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylwYXRocy5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1BBVEhTX0hfCisjZGVmaW5lCV9QQVRIU19IXworCisvKiBEZWZhdWx0IHNlYXJjaCBwYXRoLiAqLworI2RlZmluZQlfUEFUSF9ERUZQQVRICSIvdXNyL2JpbjovYmluIgorLyogQWxsIHN0YW5kYXJkIHV0aWxpdGllcyBwYXRoLiAqLworI2RlZmluZQlfUEFUSF9TVERQQVRIIFwKKwkiL3Vzci9iaW46L2JpbjovdXNyL3NiaW46L3NiaW4iCisKKyNkZWZpbmUJX1BBVEhfQlNIRUxMCSIvYmluL3NoIgorI2RlZmluZQlfUEFUSF9DT05TT0xFCSIvZGV2L2NvbnNvbGUiCisjZGVmaW5lCV9QQVRIX0NTSEVMTAkiL2Jpbi9jc2giCisjZGVmaW5lCV9QQVRIX0RFVkRCCSIvdmFyL3J1bi9kZXYuZGIiCisjZGVmaW5lCV9QQVRIX0RFVk5VTEwJIi9kZXYvbnVsbCIKKyNkZWZpbmUJX1BBVEhfRFJVTQkiL2Rldi9kcnVtIgorI2RlZmluZQlfUEFUSF9LTE9HCSIvcHJvYy9rbXNnIgorI2RlZmluZQlfUEFUSF9LTUVNCSIvZGV2L2ttZW0iCisjZGVmaW5lCV9QQVRIX0xBU1RMT0cJIi92YXIvbG9nL2xhc3Rsb2ciCisjZGVmaW5lCV9QQVRIX01BSUxESVIJIi92YXIvbWFpbCIKKyNkZWZpbmUJX1BBVEhfTUFOCSIvdXNyL3NoYXJlL21hbiIKKyNkZWZpbmUJX1BBVEhfTUVNCSIvZGV2L21lbSIKKyNkZWZpbmUJX1BBVEhfTU5UVEFCCSIvZXRjL2ZzdGFiIgorI2RlZmluZQlfUEFUSF9NT1VOVEVECSIvZXRjL210YWIiCisjZGVmaW5lCV9QQVRIX05PTE9HSU4JIi9ldGMvbm9sb2dpbiIKKyNkZWZpbmUJX1BBVEhfUFJFU0VSVkUJIi92YXIvbGliIgorI2RlZmluZQlfUEFUSF9SV0hPRElSCSIvdmFyL3Nwb29sL3J3aG8iCisjZGVmaW5lCV9QQVRIX1NFTkRNQUlMCSIvdXNyL3NiaW4vc2VuZG1haWwiCisjZGVmaW5lCV9QQVRIX1NIQURPVwkiL2V0Yy9zaGFkb3ciCisjZGVmaW5lCV9QQVRIX1NIRUxMUwkiL2V0Yy9zaGVsbHMiCisjZGVmaW5lCV9QQVRIX1RUWQkiL2Rldi90dHkiCisjZGVmaW5lCV9QQVRIX1VOSVgJIi9ib290L3ZtbGludXgiCisjZGVmaW5lIF9QQVRIX1VUTVAJIi92YXIvcnVuL3V0bXAiCisjZGVmaW5lCV9QQVRIX1ZJCSIvYmluL3ZpIgorI2RlZmluZSBfUEFUSF9XVE1QCSIvdmFyL2xvZy93dG1wIgorCisvKiBQcm92aWRlIHRyYWlsaW5nIHNsYXNoLCBzaW5jZSBtb3N0bHkgdXNlZCBmb3IgYnVpbGRpbmcgcGF0aG5hbWVzLiAqLworI2RlZmluZQlfUEFUSF9ERVYJIi9kZXYvIgorI2RlZmluZQlfUEFUSF9UTVAJIi90bXAvIgorI2RlZmluZQlfUEFUSF9WQVJEQgkiL3Zhci9kYi8iCisjZGVmaW5lCV9QQVRIX1ZBUlJVTgkiL3Zhci9ydW4vIgorI2RlZmluZQlfUEFUSF9WQVJUTVAJIi92YXIvdG1wLyIKKworI2VuZGlmCQkJCS8qICFfUEFUSFNfSF8gKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3BvbGwuaCBiL3Vzci9pbmNsdWRlL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZiNDFhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvcG9sbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvcHdkLmggYi91c3IvaW5jbHVkZS9wd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWRkYmZiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvcHdkLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfUFdEX0gKKyNkZWZpbmUgX1BXRF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworc3RydWN0IHBhc3N3ZCB7CisJY2hhciAqcHdfbmFtZTsKKwljaGFyICpwd19wYXNzd2Q7CisJdWlkX3QgcHdfdWlkOworCWdpZF90IHB3X2dpZDsKKwljaGFyICpwd19nZWNvczsKKwljaGFyICpwd19kaXI7CisJY2hhciAqcHdfc2hlbGw7Cit9OworCitfX2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbShjb25zdCBjaGFyICpuYW1lKTsKKworI2VuZGlmCS8qIF9QV0RfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc2NoZWQuaCBiL3Vzci9pbmNsdWRlL3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0ZGE4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3NjaGVkLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIHNjaGVkLmgKKyAqLworCisjaWZuZGVmIF9TQ0hFRF9ICisjZGVmaW5lIF9TQ0hFRF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKworLyogbGludXgvc2NoZWQuaCBpcyB1bnVzYWJsZTsgcHV0IHRoZSBkZWNsYXJhdGlvbnMgd2UgbmVlZCBoZXJlLi4uICovCisKKyNkZWZpbmUgU0NIRURfTk9STUFMICAgICAgICAgICAgMAorI2RlZmluZSBTQ0hFRF9GSUZPICAgICAgICAgICAgICAxCisjZGVmaW5lIFNDSEVEX1JSICAgICAgICAgICAgICAgIDIKKworc3RydWN0IHNjaGVkX3BhcmFtIHsKKwlpbnQgc2NoZWRfcHJpb3JpdHk7Cit9OworCitfX2V4dGVybiBpbnQgc2NoZWRfc2V0c2NoZWR1bGVyKHBpZF90LCBpbnQsIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKK19fZXh0ZXJuIGludCBzY2hlZF95aWVsZCh2b2lkKTsKKworLyogUmF3IGludGVyZmFjZXMgdG8gY2xvbmUoMik7IG9ubHkgYWN0dWFsbHkgdXNhYmxlIGZvciBub24tVk0tY2xvbmluZyAqLworI2lmZGVmIF9faWE2NF9fCitfX2V4dGVybiBwaWRfdCBfX2Nsb25lMihpbnQsIHZvaWQgKiwgdm9pZCAqKTsKK3N0YXRpYyBfX2lubGluZV9fIHBpZF90IF9fY2xvbmUoaW50IF9mLCB2b2lkICpfc3ApCit7CisJLyogSWYgdGhpcyBpcyB1c2VkIHdpdGggX3NwICE9IDAgaXQgd2lsbCBoYXZlIHRoZSBlZmZlY3Qgb2YgdGhlIHNwCisJICAgYW5kIHJzcCBncm93aW5nIGF3YXkgZnJvbSBhIHNpbmdsZSBwb2ludCBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zLiAqLworCXJldHVybiBfX2Nsb25lMihfZiwgX3NwLCBfc3ApOworfQorI2Vsc2UKK19fZXh0ZXJuIHBpZF90IF9fY2xvbmUoaW50LCB2b2lkICopOworI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfU0NIRURfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc2V0am1wLmggYi91c3IvaW5jbHVkZS9zZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmViY2NkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc2V0am1wLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIHNldGptcC5oCisgKi8KKworI2lmbmRlZiBfU0VUSk1QX0gKKyNkZWZpbmUgX1NFVEpNUF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8a2xpYmMvYXJjaHNldGptcC5oPgorCitfX2V4dGVybiBpbnQgc2V0am1wKGptcF9idWYpOworX19leHRlcm4gX19ub3JldHVybiBsb25nam1wKGptcF9idWYsIGludCk7CisKKy8qCisgIFdob3NlIGJyaWdodCBpZGVhIHdhcyBpdCB0byBhZGQgdW5yZWxhdGVkIGZ1bmN0aW9uYWxpdHkgdG8ganVzdCBhYm91dAorICB0aGUgb25seSBmdW5jdGlvbiBpbiB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IChzZXRqbXApIHdoaWNoIGNhbm5vdCBiZQorICB3cmFwcGVkIGJ5IGFuIG9yZGluYXJ5IGZ1bmN0aW9uIHdyYXBwZXI/ICBBbnl3YXksIHRoZSBkYW1hZ2UgaXMgZG9uZSwKKyAgYW5kIHRoZXJlZm9yZSwgdGhpcyB3cmFwcGVyICptdXN0KiBiZSBpbmxpbmUuICBIb3dldmVyLCBnY2Mgd2lsbAorICBjb21wbGFpbiBpZiB0aGlzIGlzIGFuIGlubGluZSBmdW5jdGlvbiBmb3IgdW5rbm93biByZWFzb24sIGFuZAorICB0aGVyZWZvcmUgc2lnc2V0am1wKCkgbmVlZHMgdG8gYmUgYSBtYWNyby4KKyovCisKK3N0cnVjdCBfX3NpZ2ptcF9idWYgeworCWptcF9idWYgX19qbXBidWY7CisJc2lnc2V0X3QgX19zaWdzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19zaWdqbXBfYnVmIHNpZ2ptcF9idWZbMV07CisKKyNkZWZpbmUgc2lnc2V0am1wKF9fZW52LCBfX3NhdmUpIFwKKyh7IFwKKyAgc3RydWN0IF9fc2lnam1wX2J1ZiAqX19lID0gKF9fZW52KTsgXAorICBzaWdwcm9jbWFzaygwLCBOVUxMLCAmX19lLT5fX3NpZ3MpOyBcCisgIHNldGptcChfX2UtPl9fam1wYnVmKTsgXAorfSkKKworX19leHRlcm4gX19ub3JldHVybiBzaWdsb25nam1wKHNpZ2ptcF9idWYsIGludCk7CisKKyNlbmRpZgkJCQkvKiBfU0VUSk1QX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3NpZ25hbC5oIGIvdXNyL2luY2x1ZGUvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2YjQ3MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3NpZ25hbC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogc2lnbmFsLmgKKyAqLworCisjaWZuZGVmIF9TSUdOQUxfSAorI2RlZmluZSBfU0lHTkFMX0gKKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBGb3IgbWVtc2V0KCkgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4JCS8qIEZvciBMT05HX0JJVCAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8a2xpYmMvYXJjaHNpZ25hbC5oPgkvKiBJbmNsdWRlcyA8YXNtL3NpZ25hbC5oPiBpZiBhcHByb3ByaWF0ZSAqLworCisvKiBnbGliYyBzZWVtcyB0byB1c2Ugc2lnX2F0b21pY190IGFzICJpbnQiIHByZXR0eSBtdWNoIG9uIGFsbCBhcmNoaXRlY3R1cmVzLgorICAgRG8gdGhlIHNhbWUsIGJ1dCBhbGxvdyB0aGUgYXJjaGl0ZWN0dXJlIHRvIG92ZXJyaWRlLiAqLworI2lmbmRlZiBfS0xJQkNfSEFTX0FSQ0hfU0lHX0FUT01JQ19UCit0eXBlZGVmIGludCBzaWdfYXRvbWljX3Q7CisjZW5kaWYKKworLyogU29tZSBhcmNoaXRlY3R1cmVzIGRvbid0IGRlZmluZSB0aGVzZSAqLworI2lmbmRlZiBTQV9SRVNFVEhBTkQKKyMgZGVmaW5lIFNBX1JFU0VUSEFORCBTQV9PTkVTSE9UCisjZW5kaWYKKyNpZm5kZWYgU0FfTk9ERUZFUgorIyBkZWZpbmUgU0FfTk9ERUZFUiBTQV9OT01BU0sKKyNlbmRpZgorLyogU29tZSBhcmNoaXRlY3R1cmVzIGRlZmluZSBOU0lHIGFuZCBub3QgX05TSUcgb3IgdmljZSB2ZXJzYSAqLworI2lmbmRlZiBOU0lHCisjIGRlZmluZSBOU0lHIF9OU0lHCisjZW5kaWYKKyNpZm5kZWYgX05TSUcKKyMgZGVmaW5lIF9OU0lHIE5TSUcKKyNlbmRpZgorCisvKiBJZiB3ZSBkb24ndCBoYXZlIGFueSByZWFsLXRpbWUgc2lnbmFscyBhdmFpbGFibGUgdG8gdXNlcnNwYWNlLAorICAgaGlkZSB0aGVtIGFsbCAqLworI2lmIFNJR1JUTUFYIDw9IFNJR1JUTUlOCisjIHVuZGVmIFNJR1JUTUlOCisjIHVuZGVmIFNJR1JUTUFYCisjZW5kaWYKKworLyogVGhlIGtlcm5lbCBoZWFkZXIgZmlsZXMgYXJlIGluY29uc2lzdGVudCB3aGV0aGVyIG9yIG5vdAorICAgU0lHUlRNQVggaXMgaW5jbHVzaXZlIG9yIGV4Y2x1c2l2ZS4gIFBPU0lYIHNlZW1zIHRvIHN0YXRlIHRoYXQKKyAgIGl0J3MgaW5jbHVzaXZlLCBob3dldmVyLiAqLworI2lmIFNJR1JUTUFYID49IF9OU0lHCisjIHVuZGVmICBTSUdSVE1BWAorIyBkZWZpbmUgU0lHUlRNQVggKF9OU0lHLTEpCisjZW5kaWYKKworX19leHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX3NpZ2xpc3RbX05TSUddOworX19leHRlcm4gY29uc3QgY2hhciAqY29uc3Qgc3lzX3NpZ2FiYnJldltfTlNJR107CisKKy8qIFRoaXMgYXNzdW1lcyBzaWdzZXRfdCBpcyBlaXRoZXIgYW4gdW5zaWduZWQgbG9uZyBvciBhbiBhcnJheSBvZiBzdWNoLAorICAgYW5kIHRoYXQgX05TSUdfQlBXIGluIHRoZSBrZXJuZWwgaXMgYWx3YXlzIExPTkdfQklUICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBzaWdlbXB0eXNldChzaWdzZXRfdCAqIF9fc2V0KQoreworCW1lbXNldChfX3NldCwgMCwgc2l6ZW9mICpfX3NldCk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgc2lnZmlsbHNldChzaWdzZXRfdCAqIF9fc2V0KQoreworCW1lbXNldChfX3NldCwgfjAsIHNpemVvZiAqX19zZXQpOworCXJldHVybiAwOworfQorc3RhdGljIF9faW5saW5lX18gaW50IHNpZ2FkZHNldChzaWdzZXRfdCAqIF9fc2V0LCBpbnQgX19zaWdudW0pCit7CisJdW5zaWduZWQgbG9uZyAqX19sc2V0ID0gKHVuc2lnbmVkIGxvbmcgKilfX3NldDsKKwlfX3NpZ251bS0tOwkJLyogU2lnbmFsIDAgaXMgbm90IGluIHRoZSBzZXQgKi8KKwlfX2xzZXRbX19zaWdudW0gLyBMT05HX0JJVF0gfD0gMVVMIDw8IChfX3NpZ251bSAlIExPTkdfQklUKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBfX2lubGluZV9fIGludCBzaWdkZWxzZXQoc2lnc2V0X3QgKiBfX3NldCwgaW50IF9fc2lnbnVtKQoreworCXVuc2lnbmVkIGxvbmcgKl9fbHNldCA9ICh1bnNpZ25lZCBsb25nICopX19zZXQ7CisJX19zaWdudW0tLTsJCS8qIFNpZ25hbCAwIGlzIG5vdCBpbiB0aGUgc2V0ICovCisJX19sc2V0W19fc2lnbnVtIC8gTE9OR19CSVRdICY9IH4oMVVMIDw8IChfX3NpZ251bSAlIExPTkdfQklUKSk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgc2lnaXNtZW1iZXIoc2lnc2V0X3QgKiBfX3NldCwgaW50IF9fc2lnbnVtKQoreworCXVuc2lnbmVkIGxvbmcgKl9fbHNldCA9ICh1bnNpZ25lZCBsb25nICopX19zZXQ7CisJX19zaWdudW0tLTsJCS8qIFNpZ25hbCAwIGlzIG5vdCBpbiB0aGUgc2V0ICovCisJcmV0dXJuIChpbnQpKChfX2xzZXRbX19zaWdudW0gLyBMT05HX0JJVF0gPj4gKF9fc2lnbnVtICUgTE9OR19CSVQpKSAmCisJCSAgICAgMSk7Cit9CisKK19fZXh0ZXJuIF9fc2lnaGFuZGxlcl90IF9fc2lnbmFsKGludCwgX19zaWdoYW5kbGVyX3QsIGludCk7CitfX2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBzeXN2X3NpZ25hbChpbnQsIF9fc2lnaGFuZGxlcl90KTsKK19fZXh0ZXJuIF9fc2lnaGFuZGxlcl90IGJzZF9zaWduYWwoaW50LCBfX3NpZ2hhbmRsZXJfdCk7CitfX2V4dGVybiBpbnQgc2lnYWN0aW9uKGludCwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqLCBzdHJ1Y3Qgc2lnYWN0aW9uICopOworX19leHRlcm4gaW50IHNpZ3Byb2NtYXNrKGludCwgY29uc3Qgc2lnc2V0X3QgKiwgc2lnc2V0X3QgKik7CitfX2V4dGVybiBpbnQgc2lncGVuZGluZyhzaWdzZXRfdCAqKTsKK19fZXh0ZXJuIGludCBzaWdzdXNwZW5kKGNvbnN0IHNpZ3NldF90ICopOworX19leHRlcm4gaW50IHJhaXNlKGludCk7CitfX2V4dGVybiBpbnQga2lsbChwaWRfdCwgaW50KTsKKworI2VuZGlmCQkJCS8qIF9TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3RkYXJnLmggYi91c3IvaW5jbHVkZS9zdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzMyNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3RkYXJnLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIHN0ZGFyZy5oCisgKgorICogVGhpcyBpcyBqdXN0IGEgd3JhcHBlciBmb3IgdGhlIGdjYyBvbmUsIGJ1dCBkZWZpbmVzIHZhX2NvcHkoKQorICogZXZlbiBpZiBnY2MgZG9lc24ndC4KKyAqLworCisvKiBOb3RlOiB0aGUgX1NUREFSR19IIG1hY3JvIGJlbG9uZ3MgdG8gdGhlIGdjYyBoZWFkZXIuLi4gKi8KKyNpbmNsdWRlX25leHQgPHN0ZGFyZy5oPgorCisvKiBPbGRlciBnY2MgY29uc2lkZXJzIHRoaXMgYW4gZXh0ZW5zaW9uLCBzbyBpdCdzIGRvdWJsZSB1bmRlcmJhciBvbmx5ICovCisjaWZuZGVmIHZhX2NvcHkKKyNkZWZpbmUgdmFfY29weShkLHMpIF9fdmFfY29weShkLHMpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N0ZGRlZi5oIGIvdXNyL2luY2x1ZGUvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MjlhNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N0ZGRlZi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzdGRkZWYuaAorICovCisKKyNpZm5kZWYgX1NURERFRl9ICisjZGVmaW5lIF9TVERERUZfSAorCisjaWZuZGVmIF9fS0xJQkNfXworIyBlcnJvciAiX19LTElCQ19fIG5vdCBkZWZpbmVkLCBjb21waWxlciBpbnZvY2F0aW9uIGVycm9yISIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0c2l6ZS9zdGRkZWYuaD4KKworI3VuZGVmIE5VTEwKKyNpZmRlZiBfX2NwbHVzcGx1cworIyBkZWZpbmUgTlVMTCAwCisjZWxzZQorIyBkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCisKKyN1bmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZih0LG0pICgoc2l6ZV90KSYoKHQgKikwKS0+bSkKKworI2VuZGlmCQkJCS8qIF9TVERERUZfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3RkaW50LmggYi91c3IvaW5jbHVkZS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRmMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3RkaW50LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBzdGRpbnQuaAorICovCisKKyNpZm5kZWYgX1NURElOVF9ICisjZGVmaW5lIF9TVERJTlRfSAorCisjaW5jbHVkZSA8Yml0c2l6ZS9zdGRpbnQuaD4KKwordHlwZWRlZiBpbnQ4X3QJCWludF9sZWFzdDhfdDsKK3R5cGVkZWYgaW50MTZfdAkJaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgaW50MzJfdAkJaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgaW50NjRfdAkJaW50X2xlYXN0NjRfdDsKKwordHlwZWRlZiB1aW50OF90CQl1aW50X2xlYXN0OF90OwordHlwZWRlZiB1aW50MTZfdAl1aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgdWludDMyX3QJdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIHVpbnQ2NF90CXVpbnRfbGVhc3Q2NF90OworCit0eXBlZGVmIGludDhfdAkJaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIGludDY0X3QJCWludF9mYXN0NjRfdDsKKwordHlwZWRlZiB1aW50OF90CQl1aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIHVpbnQ2NF90CXVpbnRfZmFzdDY0X3Q7CisKK3R5cGVkZWYgaW50NjRfdAkJaW50bWF4X3Q7Cit0eXBlZGVmIHVpbnQ2NF90CXVpbnRtYXhfdDsKKworI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fU1REQ19MSU1JVF9NQUNST1MpCisKKyNkZWZpbmUgSU5UOF9NSU4JKC0xMjgpCisjZGVmaW5lIElOVDE2X01JTgkoLTMyNzY4KQorI2RlZmluZSBJTlQzMl9NSU4JKC0yMTQ3NDgzNjQ3LTEpCisjZGVmaW5lIElOVDY0X01JTgkoX19JTlQ2NF9DKC05MjIzMzcyMDM2ODU0Nzc1ODA3KS0xKQorCisjZGVmaW5lIElOVDhfTUFYCSgxMjcpCisjZGVmaW5lIElOVDE2X01BWAkoMzI3NjcpCisjZGVmaW5lIElOVDMyX01BWAkoMjE0NzQ4MzY0NykKKyNkZWZpbmUgSU5UNjRfTUFYCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKyNkZWZpbmUgVUlOVDhfTUFYCSgyNTVVKQorI2RlZmluZSBVSU5UMTZfTUFYCSg2NTUzNVUpCisjZGVmaW5lIFVJTlQzMl9NQVgJKDQyOTQ5NjcyOTVVKQorI2RlZmluZSBVSU5UNjRfTUFYCShfX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSkKKworI2RlZmluZSBJTlRfTEVBU1Q4X01JTglJTlQ4X01JTgorI2RlZmluZSBJTlRfTEVBU1QxNl9NSU4JSU5UMTZfTUlOCisjZGVmaW5lIElOVF9MRUFTVDMyX01JTglJTlQzMl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUlOCUlOVDY0X01JTgorCisjZGVmaW5lIElOVF9MRUFTVDhfTUFYCUlOVDhfTUFYCisjZGVmaW5lIElOVF9MRUFTVDE2X01BWAlJTlQxNl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUFYCUlOVDMyX01BWAorI2RlZmluZSBJTlRfTEVBU1Q2NF9NQVgJSU5UNjRfTUFYCisKKyNkZWZpbmUgVUlOVF9MRUFTVDhfTUFYCSBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDE2X01BWCBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QzMl9NQVggVUlOVDMyX01BWAorI2RlZmluZSBVSU5UX0xFQVNUNjRfTUFYIFVJTlQ2NF9NQVgKKworI2RlZmluZSBJTlRfRkFTVDhfTUlOCUlOVDhfTUlOCisjZGVmaW5lIElOVF9GQVNUNjRfTUlOCUlOVDY0X01JTgorCisjZGVmaW5lIElOVF9GQVNUOF9NQVgJSU5UOF9NQVgKKyNkZWZpbmUgSU5UX0ZBU1Q2NF9NQVgJSU5UNjRfTUFYCisKKyNkZWZpbmUgVUlOVF9GQVNUOF9NQVgJVUlOVDhfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDY0X01BWCBVSU5UNjRfTUFYCisKKyNkZWZpbmUgSU5UTUFYX01JTglJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UTUFYX01BWAlJTlQ2NF9NQVgKKyNkZWZpbmUgVUlOVE1BWF9NQVgJVUlOVDY0X01BWAorCisjaW5jbHVkZSA8Yml0c2l6ZS9zdGRpbnRsaW1pdHMuaD4KKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChfX1NURENfQ09OU1RBTlRfTUFDUk9TKQorCisjZGVmaW5lIElOVDhfQyhjKQljCisjZGVmaW5lIElOVDE2X0MoYykJYworI2RlZmluZSBJTlQzMl9DKGMpCWMKKyNkZWZpbmUgSU5UNjRfQyhjKQlfX0lOVDY0X0MoYykKKworI2RlZmluZSBVSU5UOF9DKGMpCWMgIyMgVQorI2RlZmluZSBVSU5UMTZfQyhjKQljICMjIFUKKyNkZWZpbmUgVUlOVDMyX0MoYykJYyAjIyBVCisjZGVmaW5lIFVJTlQ2NF9DKGMpCV9fVUlOVDY0X0MoYykKKworI2RlZmluZSBJTlRfTEVBU1Q4X0MoYykJIElOVDhfQyhjKQorI2RlZmluZSBJTlRfTEVBU1QxNl9DKGMpIElOVDE2X0MoYykKKyNkZWZpbmUgSU5UX0xFQVNUMzJfQyhjKSBJTlQzMl9DKGMpCisjZGVmaW5lIElOVF9MRUFTVDY0X0MoYykgSU5UNjRfQyhjKQorCisjZGVmaW5lIFVJTlRfTEVBU1Q4X0MoYykgIFVJTlQ4X0MoYykKKyNkZWZpbmUgVUlOVF9MRUFTVDE2X0MoYykgVUlOVDE2X0MoYykKKyNkZWZpbmUgVUlOVF9MRUFTVDMyX0MoYykgVUlOVDMyX0MoYykKKyNkZWZpbmUgVUlOVF9MRUFTVDY0X0MoYykgVUlOVDY0X0MoYykKKworI2RlZmluZSBJTlRfRkFTVDhfQyhjKQlJTlQ4X0MoYykKKyNkZWZpbmUgSU5UX0ZBU1Q2NF9DKGMpIElOVDY0X0MoYykKKworI2RlZmluZSBVSU5UX0ZBU1Q4X0MoYykgIFVJTlQ4X0MoYykKKyNkZWZpbmUgVUlOVF9GQVNUNjRfQyhjKSBVSU5UNjRfQyhjKQorCisjZGVmaW5lIElOVE1BWF9DKGMpCUlOVDY0X0MoYykKKyNkZWZpbmUgVUlOVE1BWF9DKGMpCVVJTlQ2NF9DKGMpCisKKyNpbmNsdWRlIDxiaXRzaXplL3N0ZGludGNvbnN0Lmg+CisKKyNlbmRpZgorCisvKiBLZWVwIHRoZSBrZXJuZWwgZnJvbSB0cnlpbmcgdG8gZGVmaW5lIHRoZXNlIHR5cGVzLi4uICovCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXworCisjZW5kaWYJCQkJLyogX1NURElOVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zdGRpby5oIGIvdXNyL2luY2x1ZGUvc3RkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYyZjViCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3RkaW8uaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIHN0ZGlvLmgKKyAqLworCisjaWZuZGVmIF9TVERJT19ICisjZGVmaW5lIF9TVERJT19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogVGhpcyBzdHJ1Y3R1cmUgZG9lc24ndCByZWFsbHkgZXhpc3QsIGJ1dCBpdCBnaXZlcyB1cyBzb21ldGhpbmcKKyAgIHRvIGRlZmluZSBGSUxFICogd2l0aCAqLworc3RydWN0IF9JT19maWxlOwordHlwZWRlZiBzdHJ1Y3QgX0lPX2ZpbGUgRklMRTsKKworI2lmbmRlZiBFT0YKKyMgZGVmaW5lIEVPRiAoLTEpCisjZW5kaWYKKworI2lmbmRlZiBCVUZTSVoKKyMgZGVmaW5lIEJVRlNJWiA0MDk2CisjZW5kaWYKKworI2RlZmluZSBTRUVLX1NFVCAwCisjZGVmaW5lIFNFRUtfQ1VSIDEKKyNkZWZpbmUgU0VFS19FTkQgMgorCisvKgorICogQ29udmVydCBiZXR3ZWVuIGEgRklMRSAqIGFuZCBhIGZpbGUgZGVzY3JpcHRvci4gIFdlIGRvbid0IGFjdHVhbGx5CisgKiBoYXZlIGFueSBpbi1tZW1vcnkgZGF0YSwgc28gd2UganVzdCBhYnVzZSB0aGUgcG9pbnRlciBpdHNlbGYgdG8KKyAqIGhvbGQgdGhlIGRhdGEuICBOb3RlLCBob3dldmVyLCB0aGF0IGZvciBmaWxlIGRlc2NyaXB0b3JzLCAtMSBpcworICogZXJyb3IgYW5kIDAgaXMgYSB2YWxpZCB2YWx1ZTsgZm9yIEZJTEUgKiwgTlVMTCAoMCkgaXMgZXJyb3IgYW5kCisgKiBub24tTlVMTCBhcmUgdmFsaWQuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBmaWxlbm8oRklMRSAqIF9fZikKK3sKKwkvKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgaW50cHRyX3QsIGJ1dCBzaXplX3Qgc2hvdWxkIGJlIHRoZSBzYW1lIHNpemUgKi8KKwlyZXR1cm4gKGludCkoc2l6ZV90KSBfX2YgLSAxOworfQorCisvKiBUaGlzIGlzIGEgbWFjcm8gc28gaXQgY2FuIGJlIHVzZWQgYXMgaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgX19jcmVhdGVfZmlsZShfX2ZkKSAoKEZJTEUgKikoc2l6ZV90KSgoX19mZCkgKyAxKSkKKworI2RlZmluZSBzdGRpbiAgX19jcmVhdGVfZmlsZSgwKQorI2RlZmluZSBzdGRvdXQgX19jcmVhdGVfZmlsZSgxKQorI2RlZmluZSBzdGRlcnIgX19jcmVhdGVfZmlsZSgyKQorCitfX2V4dGVybiBGSUxFICpmb3Blbihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyBfX2lubGluZV9fIEZJTEUgKmZkb3BlbihpbnQgX19mZCwgY29uc3QgY2hhciAqX19tKQoreworCSh2b2lkKV9fbTsKKwlyZXR1cm4gX19jcmVhdGVfZmlsZShfX2ZkKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIGludCBmY2xvc2UoRklMRSAqIF9fZikKK3sKKwlleHRlcm4gaW50IGNsb3NlKGludCk7CisJcmV0dXJuIGNsb3NlKGZpbGVubyhfX2YpKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIGludCBmc2VlayhGSUxFICogX19mLCBvZmZfdCBfX28sIGludCBfX3cpCit7CisJZXh0ZXJuIG9mZl90IGxzZWVrKGludCwgb2ZmX3QsIGludCk7CisJcmV0dXJuIChsc2VlayhmaWxlbm8oX19mKSwgX19vLCBfX3cpID09IChvZmZfdCkgLSAxKSA/IC0xIDogMDsKK30KK3N0YXRpYyBfX2lubGluZV9fIG9mZl90IGZ0ZWxsKEZJTEUgKiBfX2YpCit7CisJZXh0ZXJuIG9mZl90IGxzZWVrKGludCwgb2ZmX3QsIGludCk7CisJcmV0dXJuIGxzZWVrKGZpbGVubyhfX2YpLCAwLCBTRUVLX0NVUik7Cit9CisKK19fZXh0ZXJuIGludCBmcHV0cyhjb25zdCBjaGFyICosIEZJTEUgKik7CitfX2V4dGVybiBpbnQgcHV0cyhjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IGZwdXRjKGludCwgRklMRSAqKTsKKyNkZWZpbmUgcHV0YyhjLGYpICBmcHV0YygoYyksKGYpKQorI2RlZmluZSBwdXRjaGFyKGMpIGZwdXRjKChjKSxzdGRvdXQpCisKK19fZXh0ZXJuIGludCBmZ2V0YyhGSUxFICopOworX19leHRlcm4gY2hhciAqZmdldHMoY2hhciAqLCBpbnQsIEZJTEUgKik7CisjZGVmaW5lIGdldGMoZikgZmdldGMoZikKKyNkZWZpbmUgZ2V0Y2hhcigpIGZnZXRjKHN0ZGluKQorCitfX2V4dGVybiBzaXplX3QgX2ZyZWFkKHZvaWQgKiwgc2l6ZV90LCBGSUxFICopOworX19leHRlcm4gc2l6ZV90IF9md3JpdGUoY29uc3Qgdm9pZCAqLCBzaXplX3QsIEZJTEUgKik7CisKKyNpZm5kZWYgX19OT19GUkVBRF9GV1JJVEVfSU5MSU5FUworZXh0ZXJuIF9faW5saW5lX18gc2l6ZV90IGZyZWFkKHZvaWQgKl9fcCwgc2l6ZV90IF9fcywgc2l6ZV90IF9fbiwgRklMRSAqIF9fZikKK3sKKwlyZXR1cm4gX2ZyZWFkKF9fcCwgX19zICogX19uLCBfX2YpIC8gX19zOworfQorCitleHRlcm4gX19pbmxpbmVfXyBzaXplX3QKK2Z3cml0ZShjb25zdCB2b2lkICpfX3AsIHNpemVfdCBfX3MsIHNpemVfdCBfX24sIEZJTEUgKiBfX2YpCit7CisJcmV0dXJuIF9md3JpdGUoX19wLCBfX3MgKiBfX24sIF9fZikgLyBfX3M7Cit9CisjZW5kaWYKKworX19leHRlcm4gaW50IHByaW50Zihjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgdnByaW50Zihjb25zdCBjaGFyICosIHZhX2xpc3QpOworX19leHRlcm4gaW50IGZwcmludGYoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgdmZwcmludGYoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworX19leHRlcm4gaW50IHNwcmludGYoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgdnNwcmludGYoY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworX19leHRlcm4gaW50IHNucHJpbnRmKGNoYXIgKiwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKiwgLi4uKTsKK19fZXh0ZXJuIGludCB2c25wcmludGYoY2hhciAqLCBzaXplX3QgbiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK19fZXh0ZXJuIGludCBhc3ByaW50ZihjaGFyICoqLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgdmFzcHJpbnRmKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKy8qIE5vIGJ1ZmZlcmluZywgc28gbm8gZmx1c2hpbmcgbmVlZGVkICovCitleHRlcm4gX19pbmxpbmVfXyBpbnQgZmZsdXNoKEZJTEUgKiBfX2YpCit7CisJKHZvaWQpX19mOworCXJldHVybiAwOworfQorCitfX2V4dGVybiBpbnQgc3NjYW5mKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IHZzc2NhbmYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCitfX2V4dGVybiB2b2lkIHBlcnJvcihjb25zdCBjaGFyICopOworCitfX2V4dGVybiBpbnQgcmVuYW1lKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCByZW5hbWVhdChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopOworCitfX2V4dGVybiBpbnQgcmVtb3ZlKGNvbnN0IGNoYXIgKik7CisKKyNlbmRpZgkJCQkvKiBfU1RESU9fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3RkbGliLmggYi91c3IvaW5jbHVkZS9zdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGNjMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3RkbGliLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIHN0ZGxpYi5oCisgKi8KKworI2lmbmRlZiBfU1RETElCX0gKKyNkZWZpbmUgX1NURExJQl9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKKyNkZWZpbmUgRVhJVF9TVUNDRVNTIDAKKworX19leHRlcm4gX19ub3JldHVybiBhYm9ydCh2b2lkKTsKK3N0YXRpYyBfX2lubGluZV9fIGludCBhYnMoaW50IF9fbikKK3sKKwlyZXR1cm4gKF9fbiA8IDApID8gLV9fbiA6IF9fbjsKK30KK19fZXh0ZXJuIGludCBzeXN0ZW0oY29uc3QgY2hhciAqc3RyaW5nKTsKK19fZXh0ZXJuIGludCBhdGV4aXQodm9pZCAoKikodm9pZCkpOworX19leHRlcm4gaW50IG9uX2V4aXQodm9pZCAoKikoaW50LCB2b2lkICopLCB2b2lkICopOworX19leHRlcm4gaW50IGF0b2koY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGxvbmcgYXRvbChjb25zdCBjaGFyICopOworX19leHRlcm4gbG9uZyBsb25nIGF0b2xsKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBfX25vcmV0dXJuIGV4aXQoaW50KTsKK19fZXh0ZXJuIF9fbm9yZXR1cm4gX2V4aXQoaW50KTsKKyNkZWZpbmUgX0V4aXQgX2V4aXQKK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgbGFicyhsb25nIF9fbikKK3sKKwlyZXR1cm4gKF9fbiA8IDBMKSA/IC1fX24gOiBfX247Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgbG9uZyBsbGFicyhsb25nIGxvbmcgX19uKQoreworCXJldHVybiAoX19uIDwgMExMKSA/IC1fX24gOiBfX247Cit9CisKK19fZXh0ZXJuIGxvbmcgc3RydG9sKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKK19fZXh0ZXJuIGxvbmcgbG9uZyBzdHJ0b2xsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKK19fZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3RydG91bChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7CitfX2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgc3RydG91bGwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworCitfX2V4dGVybiBjaGFyICpnZXRlbnYoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBwdXRlbnYoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBpbnQgdW5zZXRlbnYoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCBjbGVhcmVudih2b2lkKTsKKwordHlwZWRlZiBpbnQgKCpfX2NvbXBhcmVmdW5jX3QpIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CitfX2V4dGVybiB2b2lkICpic2VhcmNoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIHNpemVfdCwKKwkJICAgICAgIF9fY29tcGFyZWZ1bmNfdCk7CitfX2V4dGVybiB2b2lkIHFzb3J0KHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIF9fY29tcGFyZWZ1bmNfdCk7CisKK19fZXh0ZXJuIGxvbmcganJhbmQ0OCh1bnNpZ25lZCBzaG9ydCAqKTsKK19fZXh0ZXJuIGxvbmcgbXJhbmQ0OCh2b2lkKTsKK19fZXh0ZXJuIGxvbmcgbnJhbmQ0OCh1bnNpZ25lZCBzaG9ydCAqKTsKK19fZXh0ZXJuIGxvbmcgbHJhbmQ0OCh2b2lkKTsKK19fZXh0ZXJuIHVuc2lnbmVkIHNob3J0ICpzZWVkNDgoY29uc3QgdW5zaWduZWQgc2hvcnQgKik7CitfX2V4dGVybiB2b2lkIHNyYW5kNDgobG9uZyk7CisKKyNkZWZpbmUgUkFORF9NQVggMHg3ZmZmZmZmZgorc3RhdGljIF9faW5saW5lX18gaW50IHJhbmQodm9pZCkKK3sKKwlyZXR1cm4gKGludClscmFuZDQ4KCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNyYW5kKHVuc2lnbmVkIGludCBfX3MpCit7CisJc3JhbmQ0OChfX3MpOworfQorc3RhdGljIF9faW5saW5lX18gbG9uZyByYW5kb20odm9pZCkKK3sKKwlyZXR1cm4gbHJhbmQ0OCgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBzcmFuZG9tKHVuc2lnbmVkIGludCBfX3MpCit7CisJc3JhbmQ0OChfX3MpOworfQorCisvKiBCYXNpYyBQVFkgZnVuY3Rpb25zLiAgVGhlc2Ugb25seSB3b3JrIGlmIGRldnB0cyBpcyBtb3VudGVkISAqLworCitfX2V4dGVybiBpbnQgdW5sb2NrcHQoaW50KTsKK19fZXh0ZXJuIGNoYXIgKnB0c25hbWUoaW50KTsKK19fZXh0ZXJuIGludCBnZXRwdCh2b2lkKTsKKworc3RhdGljIF9faW5saW5lX18gaW50IGdyYW50cHQoaW50IF9fZmQpCit7CisJKHZvaWQpX19mZDsKKwlyZXR1cm4gMDsJCS8qIGRldnB0cyBkb2VzIHRoaXMgYWxsIGZvciB1cyEgKi8KK30KKworI2VuZGlmCQkJCS8qIF9TVERMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3RyaW5nLmggYi91c3IvaW5jbHVkZS9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTYwNzJjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3RyaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIHN0cmluZy5oCisgKi8KKworI2lmbmRlZiBfU1RSSU5HX0gKKyNkZWZpbmUgX1NUUklOR19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19leHRlcm4gdm9pZCAqbWVtY2NweSh2b2lkICosIGNvbnN0IHZvaWQgKiwgaW50LCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKiwgaW50LCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtcmNocihjb25zdCB2b2lkICosIGludCwgc2l6ZV90KTsKK19fZXh0ZXJuIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiB2b2lkICptZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiB2b2lkICptZW1tb3ZlKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBzaXplX3QpOworX19leHRlcm4gdm9pZCAqbWVtbWVtKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBjb25zdCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiB2b2lkIG1lbXN3YXAodm9pZCAqLCB2b2lkICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJjYXQoY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RyY2hyKGNvbnN0IGNoYXIgKiwgaW50KTsKK19fZXh0ZXJuIGNoYXIgKmluZGV4KGNvbnN0IGNoYXIgKiwgaW50KTsKK19fZXh0ZXJuIGNoYXIgKnN0cnJjaHIoY29uc3QgY2hhciAqLCBpbnQpOworX19leHRlcm4gY2hhciAqcmluZGV4KGNvbnN0IGNoYXIgKiwgaW50KTsKK19fZXh0ZXJuIGludCBzdHJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RyY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIHNpemVfdCBzdHJjc3BuKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cmR1cChjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3RybmR1cChjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJlcnJvcihpbnQpOworX19leHRlcm4gY2hhciAqc3Ryc2lnbmFsKGludCk7CitfX2V4dGVybiBzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBjaGFyICpzdHJuY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gc2l6ZV90IHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgc3RybmNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGNoYXIgKnN0cm5jcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBzaXplX3Qgc3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGNoYXIgKnN0cnBicmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gY2hhciAqc3Ryc2VwKGNoYXIgKiosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBzaXplX3Qgc3Ryc3BuKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGNoYXIgKnN0cnN0cihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBjaGFyICpzdHJ0b2soY2hhciAqLCBjb25zdCBjaGFyICopOworCisjZW5kaWYJCQkJLyogX1NUUklOR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvZGlyZW50LmggYi91c3IvaW5jbHVkZS9zeXMvZGlyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiN2EzMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9kaXJlbnQuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogc3lzL2RpcmVudC5oCisgKi8KKworI2lmbmRlZiBfU1lTX0RJUkVOVF9ICisjZGVmaW5lIF9TWVNfRElSRU5UX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBUaGUga2VybmVsIGNhbGxzIHRoaXMgc3RydWN0IGRpcmVudDY0ICovCitzdHJ1Y3QgZGlyZW50IHsKKwl1aW50NjRfdAlkX2lubzsKKwlpbnQ2NF90CQlkX29mZjsKKwl1bnNpZ25lZCBzaG9ydAlkX3JlY2xlbjsKKwl1bnNpZ25lZCBjaGFyCWRfdHlwZTsKKwljaGFyCQlkX25hbWVbMjU2XTsKK307CisKKy8qIEZpbGUgdHlwZXMgdG8gdXNlIGZvciBkX3R5cGUgKi8KKyNkZWZpbmUgRFRfVU5LTk9XTgkgMAorI2RlZmluZSBEVF9GSUZPCQkgMQorI2RlZmluZSBEVF9DSFIJCSAyCisjZGVmaW5lIERUX0RJUgkJIDQKKyNkZWZpbmUgRFRfQkxLCQkgNgorI2RlZmluZSBEVF9SRUcJCSA4CisjZGVmaW5lIERUX0xOSwkJMTAKKyNkZWZpbmUgRFRfU09DSwkJMTIKKyNkZWZpbmUgRFRfV0hUCQkxNAorCitfX2V4dGVybiBpbnQgZ2V0ZGVudHModW5zaWduZWQgaW50LCBzdHJ1Y3QgZGlyZW50ICosIHVuc2lnbmVkIGludCk7CisKKyNlbmRpZgkJCQkvKiBfU1lTX0RJUkVOVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvZWxmMzIuaCBiL3Vzci9pbmNsdWRlL3N5cy9lbGYzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZGY4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvZWxmMzIuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHN5cy9lbGYzMi5oCisgKi8KKworI2lmbmRlZiBfU1lTX0VMRjMyX0gKKyNkZWZpbmUgX1NZU19FTEYzMl9ICisKKyNpbmNsdWRlIDxzeXMvZWxmY29tbW9uLmg+CisKKy8qIEVMRiBzdGFuZGFyZCB0eXBlZGVmcyAoeWV0IG1vcmUgcHJvb2YgdGhhdCA8c3RkaW50Lmg+IHdhcyB3YXkgb3ZlcmR1ZSkgKi8KK3R5cGVkZWYgdWludDE2X3QgRWxmMzJfSGFsZjsKK3R5cGVkZWYgaW50MTZfdCBFbGYzMl9TSGFsZjsKK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfV29yZDsKK3R5cGVkZWYgaW50MzJfdCBFbGYzMl9Td29yZDsKK3R5cGVkZWYgdWludDY0X3QgRWxmMzJfWHdvcmQ7Cit0eXBlZGVmIGludDY0X3QgRWxmMzJfU3h3b3JkOworCit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX09mZjsKK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfQWRkcjsKK3R5cGVkZWYgdWludDE2X3QgRWxmMzJfU2VjdGlvbjsKKworLyogRHluYW1pYyBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfZHluIHsKKwlFbGYzMl9Td29yZCBkX3RhZzsKKwl1bmlvbiB7CisJCUVsZjMyX1N3b3JkIGRfdmFsOworCQlFbGYzMl9BZGRyIGRfcHRyOworCX0gZF91bjsKK30gRWxmMzJfRHluOworCisvKiBSZWxvY2F0aW9ucyAqLworCisjZGVmaW5lIEVMRjMyX1JfU1lNKHgpCSgoeCkgPj4gOCkKKyNkZWZpbmUgRUxGMzJfUl9UWVBFKHgpCSgoeCkgJiAweGZmKQorCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9yZWwgeworCUVsZjMyX0FkZHIgcl9vZmZzZXQ7CisJRWxmMzJfV29yZCByX2luZm87Cit9IEVsZjMyX1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcmVsYSB7CisJRWxmMzJfQWRkciByX29mZnNldDsKKwlFbGYzMl9Xb3JkIHJfaW5mbzsKKwlFbGYzMl9Td29yZCByX2FkZGVuZDsKK30gRWxmMzJfUmVsYTsKKworLyogU3ltYm9sICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3N5bSB7CisJRWxmMzJfV29yZCBzdF9uYW1lOworCUVsZjMyX0FkZHIgc3RfdmFsdWU7CisJRWxmMzJfV29yZCBzdF9zaXplOworCXVuc2lnbmVkIGNoYXIgc3RfaW5mbzsKKwl1bnNpZ25lZCBjaGFyIHN0X290aGVyOworCUVsZjMyX0hhbGYgc3Rfc2huZHg7Cit9IEVsZjMyX1N5bTsKKworLyogTWFpbiBmaWxlIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9oZHIgeworCXVuc2lnbmVkIGNoYXIgZV9pZGVudFtFSV9OSURFTlRdOworCUVsZjMyX0hhbGYgZV90eXBlOworCUVsZjMyX0hhbGYgZV9tYWNoaW5lOworCUVsZjMyX1dvcmQgZV92ZXJzaW9uOworCUVsZjMyX0FkZHIgZV9lbnRyeTsKKwlFbGYzMl9PZmYgZV9waG9mZjsKKwlFbGYzMl9PZmYgZV9zaG9mZjsKKwlFbGYzMl9Xb3JkIGVfZmxhZ3M7CisJRWxmMzJfSGFsZiBlX2Voc2l6ZTsKKwlFbGYzMl9IYWxmIGVfcGhlbnRzaXplOworCUVsZjMyX0hhbGYgZV9waG51bTsKKwlFbGYzMl9IYWxmIGVfc2hlbnRzaXplOworCUVsZjMyX0hhbGYgZV9zaG51bTsKKwlFbGYzMl9IYWxmIGVfc2hzdHJuZHg7Cit9IEVsZjMyX0VoZHI7CisKKy8qIFByb2dyYW0gaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3BoZHIgeworCUVsZjMyX1dvcmQgcF90eXBlOworCUVsZjMyX09mZiBwX29mZnNldDsKKwlFbGYzMl9BZGRyIHBfdmFkZHI7CisJRWxmMzJfQWRkciBwX3BhZGRyOworCUVsZjMyX1dvcmQgcF9maWxlc3o7CisJRWxmMzJfV29yZCBwX21lbXN6OworCUVsZjMyX1dvcmQgcF9mbGFnczsKKwlFbGYzMl9Xb3JkIHBfYWxpZ247Cit9IEVsZjMyX1BoZHI7CisKKy8qIFNlY3Rpb24gaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3NoZHIgeworCUVsZjMyX1dvcmQgc2hfbmFtZTsKKwlFbGYzMl9Xb3JkIHNoX3R5cGU7CisJRWxmMzJfV29yZCBzaF9mbGFnczsKKwlFbGYzMl9BZGRyIHNoX2FkZHI7CisJRWxmMzJfT2ZmIHNoX29mZnNldDsKKwlFbGYzMl9Xb3JkIHNoX3NpemU7CisJRWxmMzJfV29yZCBzaF9saW5rOworCUVsZjMyX1dvcmQgc2hfaW5mbzsKKwlFbGYzMl9Xb3JkIHNoX2FkZHJhbGlnbjsKKwlFbGYzMl9Xb3JkIHNoX2VudHNpemU7Cit9IEVsZjMyX1NoZHI7CisKKy8qIE5vdGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9ub3RlIHsKKwlFbGYzMl9Xb3JkIG5fbmFtZXN6OwkvKiBOYW1lIHNpemUgKi8KKwlFbGYzMl9Xb3JkIG5fZGVzY3N6OwkvKiBDb250ZW50IHNpemUgKi8KKwlFbGYzMl9Xb3JkIG5fdHlwZTsJLyogQ29udGVudCB0eXBlICovCit9IEVsZjMyX05oZHI7CisKKyNlbmRpZgkJCQkvKiBfU1lTX0VMRjMyX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9lbGY2NC5oIGIvdXNyL2luY2x1ZGUvc3lzL2VsZjY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0ODZhYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9lbGY2NC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogc3lzL2VsZjY0LmgKKyAqLworCisjaWZuZGVmIF9TWVNfRUxGNjRfSAorI2RlZmluZSBfU1lTX0VMRjY0X0gKKworI2luY2x1ZGUgPHN5cy9lbGZjb21tb24uaD4KKworLyogRUxGIHN0YW5kYXJkIHR5cGVkZWZzICh5ZXQgbW9yZSBwcm9vZiB0aGF0IDxzdGRpbnQuaD4gd2FzIHdheSBvdmVyZHVlKSAqLwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOwordHlwZWRlZiBpbnQxNl90IEVsZjY0X1NIYWxmOwordHlwZWRlZiB1aW50MzJfdCBFbGY2NF9Xb3JkOwordHlwZWRlZiBpbnQzMl90IEVsZjY0X1N3b3JkOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9Yd29yZDsKK3R5cGVkZWYgaW50NjRfdCBFbGY2NF9TeHdvcmQ7CisKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfT2ZmOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9BZGRyOwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9TZWN0aW9uOworCisvKiBEeW5hbWljIGhlYWRlciAqLworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9keW4geworCUVsZjY0X1N4d29yZCBkX3RhZzsKKwl1bmlvbiB7CisJCUVsZjY0X1h3b3JkIGRfdmFsOworCQlFbGY2NF9BZGRyIGRfcHRyOworCX0gZF91bjsKK30gRWxmNjRfRHluOworCisvKiBSZWxvY2F0aW9ucyAqLworCisjZGVmaW5lIEVMRjY0X1JfU1lNKHgpCSgoeCkgPj4gMzIpCisjZGVmaW5lIEVMRjY0X1JfVFlQRSh4KQkoKHgpICYgMHhmZmZmZmZmZikKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcmVsIHsKKwlFbGY2NF9BZGRyIHJfb2Zmc2V0OworCUVsZjY0X1h3b3JkIHJfaW5mbzsKK30gRWxmNjRfUmVsOworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9yZWxhIHsKKwlFbGY2NF9BZGRyIHJfb2Zmc2V0OworCUVsZjY0X1h3b3JkIHJfaW5mbzsKKwlFbGY2NF9TeHdvcmQgcl9hZGRlbmQ7Cit9IEVsZjY0X1JlbGE7CisKKy8qIFN5bWJvbCAqLworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9zeW0geworCUVsZjY0X1dvcmQgc3RfbmFtZTsKKwl1bnNpZ25lZCBjaGFyIHN0X2luZm87CisJdW5zaWduZWQgY2hhciBzdF9vdGhlcjsKKwlFbGY2NF9IYWxmIHN0X3NobmR4OworCUVsZjY0X0FkZHIgc3RfdmFsdWU7CisJRWxmNjRfWHdvcmQgc3Rfc2l6ZTsKK30gRWxmNjRfU3ltOworCisvKiBNYWluIGZpbGUgaGVhZGVyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X2hkciB7CisJdW5zaWduZWQgY2hhciBlX2lkZW50W0VJX05JREVOVF07CisJRWxmNjRfSGFsZiBlX3R5cGU7CisJRWxmNjRfSGFsZiBlX21hY2hpbmU7CisJRWxmNjRfV29yZCBlX3ZlcnNpb247CisJRWxmNjRfQWRkciBlX2VudHJ5OworCUVsZjY0X09mZiBlX3Bob2ZmOworCUVsZjY0X09mZiBlX3Nob2ZmOworCUVsZjY0X1dvcmQgZV9mbGFnczsKKwlFbGY2NF9IYWxmIGVfZWhzaXplOworCUVsZjY0X0hhbGYgZV9waGVudHNpemU7CisJRWxmNjRfSGFsZiBlX3BobnVtOworCUVsZjY0X0hhbGYgZV9zaGVudHNpemU7CisJRWxmNjRfSGFsZiBlX3NobnVtOworCUVsZjY0X0hhbGYgZV9zaHN0cm5keDsKK30gRWxmNjRfRWhkcjsKKworLyogUHJvZ3JhbSBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcGhkciB7CisJRWxmNjRfV29yZCBwX3R5cGU7CisJRWxmNjRfV29yZCBwX2ZsYWdzOworCUVsZjY0X09mZiBwX29mZnNldDsKKwlFbGY2NF9BZGRyIHBfdmFkZHI7CisJRWxmNjRfQWRkciBwX3BhZGRyOworCUVsZjY0X1h3b3JkIHBfZmlsZXN6OworCUVsZjY0X1h3b3JkIHBfbWVtc3o7CisJRWxmNjRfWHdvcmQgcF9hbGlnbjsKK30gRWxmNjRfUGhkcjsKKworLyogU2VjdGlvbiBoZWFkZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfc2hkciB7CisJRWxmNjRfV29yZCBzaF9uYW1lOworCUVsZjY0X1dvcmQgc2hfdHlwZTsKKwlFbGY2NF9Yd29yZCBzaF9mbGFnczsKKwlFbGY2NF9BZGRyIHNoX2FkZHI7CisJRWxmNjRfT2ZmIHNoX29mZnNldDsKKwlFbGY2NF9Yd29yZCBzaF9zaXplOworCUVsZjY0X1dvcmQgc2hfbGluazsKKwlFbGY2NF9Xb3JkIHNoX2luZm87CisJRWxmNjRfWHdvcmQgc2hfYWRkcmFsaWduOworCUVsZjY0X1h3b3JkIHNoX2VudHNpemU7Cit9IEVsZjY0X1NoZHI7CisKKy8qIE5vdGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9ub3RlIHsKKwlFbGY2NF9Xb3JkIG5fbmFtZXN6OwkvKiBOYW1lIHNpemUgKi8KKwlFbGY2NF9Xb3JkIG5fZGVzY3N6OwkvKiBDb250ZW50IHNpemUgKi8KKwlFbGY2NF9Xb3JkIG5fdHlwZTsJLyogQ29udGVudCB0eXBlICovCit9IEVsZjY0X05oZHI7CisKKyNlbmRpZgkJCQkvKiBfU1lTX0VMRjY0X0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9lbGZjb21tb24uaCBiL3Vzci9pbmNsdWRlL3N5cy9lbGZjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgxZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL2VsZmNvbW1vbi5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogc3lzL2VsZmNvbW1vbi5oCisgKi8KKworI2lmbmRlZiBfU1lTX0VMRkNPTU1PTl9ICisjZGVmaW5lIF9TWVNfRUxGQ09NTU9OX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBTZWdtZW50IHR5cGVzICovCisjZGVmaW5lIFBUX05VTEwgICAgCTAKKyNkZWZpbmUgUFRfTE9BRCAgICAJMQorI2RlZmluZSBQVF9EWU5BTUlDIAkyCisjZGVmaW5lIFBUX0lOVEVSUCAgCTMKKyNkZWZpbmUgUFRfTk9URSAgICAJNAorI2RlZmluZSBQVF9TSExJQiAgIAk1CisjZGVmaW5lIFBUX1BIRFIgICAgCTYKKyNkZWZpbmUgUFRfTE9PUyAgICAJMHg2MDAwMDAwMAorI2RlZmluZSBQVF9ISU9TICAgIAkweDZmZmZmZmZmCisjZGVmaW5lIFBUX0xPUFJPQyAgCTB4NzAwMDAwMDAKKyNkZWZpbmUgUFRfSElQUk9DICAJMHg3ZmZmZmZmZgorI2RlZmluZSBQVF9HTlVfRUhfRlJBTUUJMHg2NDc0ZTU1MAkvKiBFeHRlbnNpb24sIGVoPyAqLworCisvKiBFTEYgZmlsZSB0eXBlcyAqLworI2RlZmluZSBFVF9OT05FICAgCTAKKyNkZWZpbmUgRVRfUkVMICAgIAkxCisjZGVmaW5lIEVUX0VYRUMgICAJMgorI2RlZmluZSBFVF9EWU4gICAgCTMKKyNkZWZpbmUgRVRfQ09SRSAgIAk0CisjZGVmaW5lIEVUX0xPUFJPQyAJMHhmZjAwCisjZGVmaW5lIEVUX0hJUFJPQyAJMHhmZmZmCisKKy8qIEVMRiBtYWNoaW5lIHR5cGVzICovCisjZGVmaW5lIEVNX05PTkUgIAkwCisjZGVmaW5lIEVNX00zMiAgIAkxCisjZGVmaW5lIEVNX1NQQVJDIAkyCisjZGVmaW5lIEVNXzM4NiAgIAkzCisjZGVmaW5lIEVNXzY4SyAgIAk0CisjZGVmaW5lIEVNXzg4SyAgIAk1CisjZGVmaW5lIEVNXzQ4NiAgIAk2CS8qIE5vdCB1c2VkIGluIExpbnV4IGF0IGxlYXN0ICovCisjZGVmaW5lIEVNXzg2MCAgIAk3CisjZGVmaW5lIEVNX01JUFMgICAgICAgICA4CS8qIFIzaywgYmlnZW5kaWFuKD8pICovCisjZGVmaW5lIEVNX01JUFNfUlM0X0JFIAkxMAkvKiBSNGsgQkUgKi8KKyNkZWZpbmUgRU1fUEFSSVNDICAgICAgCTE1CisjZGVmaW5lIEVNX1NQQVJDMzJQTFVTIAkxOAorI2RlZmluZSBFTV9QUEMgICAgICAgICAJMjAKKyNkZWZpbmUgRU1fUFBDNjQgICAgICAgCTIxCisjZGVmaW5lIEVNX1MzOTAgICAgICAgICAyMgorI2RlZmluZSBFTV9TSCAgICAgICAgICAJNDIKKyNkZWZpbmUgRU1fU1BBUkNWOQk0MwkvKiB2OSA9IFNQQVJDNjQgKi8KKyNkZWZpbmUgRU1fSDhfMzAwSCAgICAgIDQ3CisjZGVmaW5lIEVNX0g4UyAgICAgICAgICA0OAorI2RlZmluZSBFTV9JQV82NCAgICAgICAgNTAJLyogSXRhbmljICovCisjZGVmaW5lIEVNX1g4Nl82NCAgICAgICA2MgorI2RlZmluZSBFTV9DUklTICAgICAgICAgNzYKKyNkZWZpbmUgRU1fVjg1MCAgICAgICAgIDg3CisjZGVmaW5lIEVNX0FMUEhBICAgICAgICAweDkwMjYJLyogSW50ZXJyaW0gQWxwaGEgdGhhdCBzdHVjayBhcm91bmQgKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX1Y4NTAgIDB4OTA4MAkvKiBPbGQgdjg1MCBJRCB1c2VkIGJ5IEN5Z251cyAqLworI2RlZmluZSBFTV9TMzkwX09MRCAgICAgMHhBMzkwCS8qIE9ic29sZXRlIGludGVycmltIHZhbHVlIGZvciBTLzM5MCAqLworCisvKiBEeW5hbWljIHR5cGUgdmFsdWVzICovCisjZGVmaW5lIERUX05VTEwJCTAKKyNkZWZpbmUgRFRfTkVFREVECTEKKyNkZWZpbmUgRFRfUExUUkVMU1oJMgorI2RlZmluZSBEVF9QTFRHT1QJMworI2RlZmluZSBEVF9IQVNICQk0CisjZGVmaW5lIERUX1NUUlRBQgk1CisjZGVmaW5lIERUX1NZTVRBQgk2CisjZGVmaW5lIERUX1JFTEEJCTcKKyNkZWZpbmUgRFRfUkVMQVNaCTgKKyNkZWZpbmUgRFRfUkVMQUVOVAk5CisjZGVmaW5lIERUX1NUUlNaCTEwCisjZGVmaW5lIERUX1NZTUVOVAkxMQorI2RlZmluZSBEVF9JTklUCQkxMgorI2RlZmluZSBEVF9GSU5JCQkxMworI2RlZmluZSBEVF9TT05BTUUJMTQKKyNkZWZpbmUgRFRfUlBBVEgJMTUKKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYKKyNkZWZpbmUgRFRfUkVMCQkxNworI2RlZmluZSBEVF9SRUxTWgkxOAorI2RlZmluZSBEVF9SRUxFTlQJMTkKKyNkZWZpbmUgRFRfUExUUkVMCTIwCisjZGVmaW5lIERUX0RFQlVHCTIxCisjZGVmaW5lIERUX1RFWFRSRUwJMjIKKyNkZWZpbmUgRFRfSk1QUkVMCTIzCisjZGVmaW5lIERUX0xPUFJPQwkweDcwMDAwMDAwCisjZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCisKKy8qIEF1eGlsbGlhcnkgdGFibGUgZW50cmllcyAqLworI2RlZmluZSBBVF9OVUxMCQkwCS8qIGVuZCBvZiB2ZWN0b3IgKi8KKyNkZWZpbmUgQVRfSUdOT1JFCTEJLyogZW50cnkgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyNkZWZpbmUgQVRfRVhFQ0ZECTIJLyogZmlsZSBkZXNjcmlwdG9yIG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhEUgkJMwkvKiBwcm9ncmFtIGhlYWRlcnMgZm9yIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhFTlQJNAkvKiBzaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICovCisjZGVmaW5lIEFUX1BITlVNCTUJLyogbnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyAqLworI2RlZmluZSBBVF9QQUdFU1oJNgkvKiBzeXN0ZW0gcGFnZSBzaXplICovCisjZGVmaW5lIEFUX0JBU0UJCTcJLyogYmFzZSBhZGRyZXNzIG9mIGludGVycHJldGVyICovCisjZGVmaW5lIEFUX0ZMQUdTCTgJLyogZmxhZ3MgKi8KKyNkZWZpbmUgQVRfRU5UUlkJOQkvKiBlbnRyeSBwb2ludCBvZiBwcm9ncmFtICovCisjZGVmaW5lIEFUX05PVEVMRgkxMAkvKiBwcm9ncmFtIGlzIG5vdCBFTEYgKi8KKyNkZWZpbmUgQVRfVUlECQkxMQkvKiByZWFsIHVpZCAqLworI2RlZmluZSBBVF9FVUlECQkxMgkvKiBlZmZlY3RpdmUgdWlkICovCisjZGVmaW5lIEFUX0dJRAkJMTMJLyogcmVhbCBnaWQgKi8KKyNkZWZpbmUgQVRfRUdJRAkJMTQJLyogZWZmZWN0aXZlIGdpZCAqLworI2RlZmluZSBBVF9QTEFURk9STQkxNQkvKiBzdHJpbmcgaWRlbnRpZnlpbmcgQ1BVIGZvciBvcHRpbWl6YXRpb25zICovCisjZGVmaW5lIEFUX0hXQ0FQICAJMTYJLyogYXJjaCBkZXBlbmRlbnQgaGludHMgYXQgQ1BVIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBBVF9DTEtUQ0sgCTE3CS8qIGZyZXF1ZW5jeSBhdCB3aGljaCB0aW1lcygpIGluY3JlbWVudHMgKi8KKy8qIDE4Li4yMiA9ID8gKi8KKyNkZWZpbmUgQVRfU0VDVVJFIAkyMwkvKiBzZWN1cmUgbW9kZSBib29sZWFuICovCisKKy8qIFByb2dyYW0gaGVhZGVyIHBlcm1pc3Npb24gZmxhZ3MgKi8KKyNkZWZpbmUgUEZfWCAgICAgICAgICAgIDB4MQorI2RlZmluZSBQRl9XICAgICAgICAgICAgMHgyCisjZGVmaW5lIFBGX1IgICAgICAgICAgICAweDQKKworLyogU2VjdGlvbiBoZWFkZXIgdHlwZXMgKi8KKyNkZWZpbmUgU0hUX05VTEwgICAgICAgIDAKKyNkZWZpbmUgU0hUX1BST0dCSVRTICAgIDEKKyNkZWZpbmUgU0hUX1NZTVRBQiAgICAgIDIKKyNkZWZpbmUgU0hUX1NUUlRBQiAgICAgIDMKKyNkZWZpbmUgU0hUX1JFTEEgICAgICAgIDQKKyNkZWZpbmUgU0hUX0hBU0ggICAgICAgIDUKKyNkZWZpbmUgU0hUX0RZTkFNSUMgICAgIDYKKyNkZWZpbmUgU0hUX05PVEUgICAgICAgIDcKKyNkZWZpbmUgU0hUX05PQklUUyAgICAgIDgKKyNkZWZpbmUgU0hUX1JFTCAgICAgICAgIDkKKyNkZWZpbmUgU0hUX1NITElCICAgICAgIDEwCisjZGVmaW5lIFNIVF9EWU5TWU0gICAgICAxMQorI2RlZmluZSBTSFRfTlVNICAgICAgICAgMTIKKyNkZWZpbmUgU0hUX0xPUFJPQyAgICAgIDB4NzAwMDAwMDAKKyNkZWZpbmUgU0hUX0hJUFJPQyAgICAgIDB4N2ZmZmZmZmYKKyNkZWZpbmUgU0hUX0xPVVNFUiAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgU0hUX0hJVVNFUiAgICAgIDB4ZmZmZmZmZmYKKworLyogU2VjdGlvbiBoZWFkZXIgZmxhZ3MgKi8KKyNkZWZpbmUgU0hGX1dSSVRFICAgICAgIDB4MQorI2RlZmluZSBTSEZfQUxMT0MgICAgICAgMHgyCisjZGVmaW5lIFNIRl9FWEVDSU5TVFIgICAweDQKKyNkZWZpbmUgU0hGX01BU0tQUk9DICAgIDB4ZjAwMDAwMDAKKworLyogU3BlY2lhbCBzZWN0aW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgU0hOX1VOREVGICAgICAgIDAKKyNkZWZpbmUgU0hOX0xPUkVTRVJWRSAgIDB4ZmYwMAorI2RlZmluZSBTSE5fTE9QUk9DICAgICAgMHhmZjAwCisjZGVmaW5lIFNITl9ISVBST0MgICAgICAweGZmMWYKKyNkZWZpbmUgU0hOX0FCUyAgICAgICAgIDB4ZmZmMQorI2RlZmluZSBTSE5fQ09NTU9OICAgICAgMHhmZmYyCisjZGVmaW5lIFNITl9ISVJFU0VSVkUgICAweGZmZmYKKworLyogTGVuZ2h0IG9mIG1hZ2ljIGF0IHRoZSBzdGFydCBvZiBhIGZpbGUgKi8KKyNkZWZpbmUgRUlfTklERU5UCTE2CisKKy8qIE1hZ2ljIG51bWJlciBjb25zdGFudHMuLi4gKi8KKyNkZWZpbmUgRUlfTUFHMCAgICAgICAgIDAJLyogZV9pZGVudFtdIGluZGV4ZXMgKi8KKyNkZWZpbmUgRUlfTUFHMSAgICAgICAgIDEKKyNkZWZpbmUgRUlfTUFHMiAgICAgICAgIDIKKyNkZWZpbmUgRUlfTUFHMyAgICAgICAgIDMKKyNkZWZpbmUgRUlfQ0xBU1MgICAgICAgIDQKKyNkZWZpbmUgRUlfREFUQSAgICAgICAgIDUKKyNkZWZpbmUgRUlfVkVSU0lPTiAgICAgIDYKKyNkZWZpbmUgRUlfT1NBQkkgICAgICAgIDcKKyNkZWZpbmUgRUlfUEFEICAgICAgICAgIDgKKworI2RlZmluZSBFTEZNQUcwICAgICAgICAgMHg3ZgkvKiBFSV9NQUcgKi8KKyNkZWZpbmUgRUxGTUFHMSAgICAgICAgICdFJworI2RlZmluZSBFTEZNQUcyICAgICAgICAgJ0wnCisjZGVmaW5lIEVMRk1BRzMgICAgICAgICAnRicKKyNkZWZpbmUgRUxGTUFHICAgICAgICAgICJcMTc3RUxGIgorI2RlZmluZSBTRUxGTUFHICAgICAgICAgNAorCisjZGVmaW5lIEVMRkNMQVNTTk9ORSAgICAwCS8qIEVJX0NMQVNTICovCisjZGVmaW5lIEVMRkNMQVNTMzIgICAgICAxCisjZGVmaW5lIEVMRkNMQVNTNjQgICAgICAyCisjZGVmaW5lIEVMRkNMQVNTTlVNICAgICAzCisKKyNkZWZpbmUgRUxGREFUQU5PTkUgICAgIDAJLyogZV9pZGVudFtFSV9EQVRBXSAqLworI2RlZmluZSBFTEZEQVRBMkxTQiAgICAgMQorI2RlZmluZSBFTEZEQVRBMk1TQiAgICAgMgorCisjZGVmaW5lIEVWX05PTkUgICAgICAgICAwCS8qIGVfdmVyc2lvbiwgRUlfVkVSU0lPTiAqLworI2RlZmluZSBFVl9DVVJSRU5UICAgICAgMQorI2RlZmluZSBFVl9OVU0gICAgICAgICAgMgorCisjZGVmaW5lIEVMRk9TQUJJX05PTkUgICAwCisjZGVmaW5lIEVMRk9TQUJJX0xJTlVYICAzCisKKyNlbmRpZgkJCQkvKiBfU1lTX0VMRkNPTU1PTl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvZnN1aWQuaCBiL3Vzci9pbmNsdWRlL3N5cy9mc3VpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NGUyOGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvZnN1aWQuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogc3lzL2ZzdWlkLmgKKyAqLworCisjaWZuZGVmIF9TWVNfRlNVSURfSAorI2RlZmluZSBfU1lTX0ZTVUlEX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX2V4dGVybiBpbnQgc2V0ZnN1aWQodWlkX3QpOworX19leHRlcm4gaW50IHNldGZzZ2lkKGdpZF90KTsKKworI2VuZGlmCQkJCS8qIF9TWVNfRlNVSURfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL2lub3RpZnkuaCBiL3Vzci9pbmNsdWRlL3N5cy9pbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4Y2IwNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9pbm90aWZ5LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIHN5cy9pbm90aWZ5LmgKKyAqLworCisjaWZuZGVmIF9TWVNfSU5PVElGWV9ICisjZGVmaW5lIF9TWVNfSU5PVElGWV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisKK19fZXh0ZXJuIGludCBpbm90aWZ5X2luaXQodm9pZCk7CitfX2V4dGVybiBpbnQgaW5vdGlmeV9hZGRfd2F0Y2goaW50LCBjb25zdCBjaGFyICosIF9fdTMyKTsKK19fZXh0ZXJuIGludCBpbm90aWZ5X3JtX3dhdGNoKGludCwgX191MzIpOworCisjZW5kaWYJCQkJLyogX1NZU19JTk9USUZZX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9pb2N0bC5oIGIvdXNyL2luY2x1ZGUvc3lzL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5ZjExMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9pb2N0bC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBzeXMvaW9jdGwuaAorICovCisKKyNpZm5kZWYgX1NZU19JT0NUTF9ICisjZGVmaW5lIF9TWVNfSU9DVExfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKK19fZXh0ZXJuIGludCBpb2N0bChpbnQsIGludCwgdm9pZCAqKTsKKworI2VuZGlmCQkJCS8qIF9TWVNfSU9DVExfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL2tsb2cuaCBiL3Vzci9pbmNsdWRlL3N5cy9rbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjNzIxNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9rbG9nLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHN5cy9rbG9nLmgKKyAqLworCisjaWZuZGVmIF9TWVNfS0xPR19ICisjZGVmaW5lIF9TWVNfS0xPR19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKworI2RlZmluZSBLTE9HX0NMT1NFCTAKKyNkZWZpbmUgS0xPR19PUEVOCTEKKyNkZWZpbmUgS0xPR19SRUFECTIKKyNkZWZpbmUgS0xPR19SRUFEX0FMTAkzCisjZGVmaW5lIEtMT0dfUkVBRF9DTEVBUgk0CisjZGVmaW5lIEtMT0dfQ0xFQVIJNQorI2RlZmluZSBLTE9HX0RJU0FCTEUJNgorI2RlZmluZSBLTE9HX0VOQUJMRQk3CisjZGVmaW5lIEtMT0dfU0VUTEVWRUwJOAorI2RlZmluZSBLTE9HX1VOUkVBRFNJWkUJOQorI2RlZmluZSBLTE9HX1dSSVRFCTEwCisKK19fZXh0ZXJuIGludCBrbG9nY3RsKGludCwgY2hhciAqLCBpbnQpOworCisjZW5kaWYJCQkJLyogX1NZU19LTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9tZC5oIGIvdXNyL2luY2x1ZGUvc3lzL21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0ZTRhYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9tZC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA2IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBzeXMvbWQuaAorICoKKyAqIERlZmluZXMgZm9yIHRoZSBMaW51eCBtZCBmdW5jdGlvbmFsaXR5LiAgU29tZSBvZiB0aGlzIHN0dWZmIGlzCisgKiB1c2Vyc3BhY2UtdmlzaWJsZSBidXQgbGl2ZXMgaW4gbWRfay5oLCB3aGljaCBpcyB1c2VyLXNwYWNlIHVuc2FmZS4KKyAqIFNpZ2guCisgKi8KKworI2lmbmRlZiBfU1lTX01EX0gKKyNkZWZpbmUgX1NZU19NRF9ICisKKyNkZWZpbmUgTEVWRUxfTVVMVElQQVRIICAgICAgICAgKC00KQorI2RlZmluZSBMRVZFTF9MSU5FQVIgICAgICAgICAgICAoLTEpCisjZGVmaW5lIExFVkVMX0ZBVUxUWSAgICAgICAgICAgICgtNSkKKyNkZWZpbmUgTUFYX01EX0RFVlMgIDI1NgkvKiBNYXggbnVtYmVyIG9mIG1kIGRldiAqLworCisjaW5jbHVkZSA8bGludXgvcmFpZC9tZF91Lmg+CisjaW5jbHVkZSA8bGludXgvcmFpZC9tZF9wLmg+CisKKyNlbmRpZgkJCQkvKiBfU1lTX01EX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9tbWFuLmggYi91c3IvaW5jbHVkZS9zeXMvbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjBiNjUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvbW1hbi5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBzeXMvbW1hbi5oCisgKi8KKworI2lmbmRlZiBfU1lTX01NQU5fSAorI2RlZmluZSBfU1lTX01NQU5fSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21tYW4uaD4KKworI2RlZmluZSBNQVBfRkFJTEVEICgodm9pZCAqKS0xKQorCitfX2V4dGVybiB2b2lkICptbWFwKHZvaWQgKiwgc2l6ZV90LCBpbnQsIGludCwgaW50LCBvZmZfdCk7CitfX2V4dGVybiBpbnQgbXVubWFwKHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHZvaWQgKm1yZW1hcCh2b2lkICosIHNpemVfdCwgc2l6ZV90LCB1bnNpZ25lZCBsb25nKTsKK19fZXh0ZXJuIGludCBzaG1fb3Blbihjb25zdCBjaGFyICosIGludCwgbW9kZV90KTsKK19fZXh0ZXJuIGludCBzaG1fdW5saW5rKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgbXN5bmMoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CitfX2V4dGVybiBpbnQgbXByb3RlY3QoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CitfX2V4dGVybiBpbnQgbWxvY2thbGwoaW50KTsKK19fZXh0ZXJuIGludCBtdW5sb2NrYWxsKHZvaWQpOworX19leHRlcm4gaW50IG1sb2NrKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGludCBtdW5sb2NrKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKworI2VuZGlmCQkJCS8qIF9TWVNfTU1BTl9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvbW91bnQuaCBiL3Vzci9pbmNsdWRlL3N5cy9tb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNmIwZWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvbW91bnQuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogc3lzL21vdW50LmgKKyAqLworCisjaWZuZGVmIF9TWVNfTU9VTlRfSAorI2RlZmluZSBfU1lTX01PVU5UX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisvKgorICogVGhlc2UgYXJlIHRoZSBmcy1pbmRlcGVuZGVudCBtb3VudC1mbGFnczogdXAgdG8gMzIgZmxhZ3MgYXJlIHN1cHBvcnRlZAorICovCisjZGVmaW5lIE1TX1JET05MWSAgICAgICAweDAwMDEJLyogTW91bnQgcmVhZC1vbmx5ICovCisjZGVmaW5lIE1TX05PU1VJRCAgICAgICAweDAwMDIJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cyAqLworI2RlZmluZSBNU19OT0RFViAgICAgICAgMHgwMDA0CS8qIERpc2FsbG93IGFjY2VzcyB0byBkZXZpY2Ugc3BlY2lhbCBmaWxlcyAqLworI2RlZmluZSBNU19OT0VYRUMgICAgICAgMHgwMDA4CS8qIERpc2FsbG93IHByb2dyYW0gZXhlY3V0aW9uICovCisjZGVmaW5lIE1TX1NZTkNIUk9OT1VTICAweDAwMTAJLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZSAqLworI2RlZmluZSBNU19SRU1PVU5UICAgICAgMHgwMDIwCS8qIEFsdGVyIGZsYWdzIG9mIGEgbW91bnRlZCBGUyAqLworI2RlZmluZSBNU19NQU5ETE9DSyAgICAgMHgwMDQwCS8qIEFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiBhbiBGUyAqLworI2RlZmluZSBNU19ESVJTWU5DICAgICAgMHgwMDgwCS8qIERpcmVjdG9yeSBtb2RpZmljYXRpb25zIGFyZSBzeW5jaHJvbm91cyAqLworI2RlZmluZSBNU19OT0FUSU1FICAgICAgMHgwNDAwCS8qIERvIG5vdCB1cGRhdGUgYWNjZXNzIHRpbWVzLiAqLworI2RlZmluZSBNU19OT0RJUkFUSU1FICAgMHgwODAwCS8qIERvIG5vdCB1cGRhdGUgZGlyZWN0b3J5IGFjY2VzcyB0aW1lcyAqLworI2RlZmluZSBNU19CSU5EICAgICAgICAgMHgxMDAwCisjZGVmaW5lIE1TX01PVkUgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTVNfUkVDICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBNU19WRVJCT1NFICAgICAgMHg4MDAwCisjZGVmaW5lIE1TX1BPU0lYQUNMICAgICAoMTw8MTYpCS8qIFZGUyBkb2VzIG5vdCBhcHBseSB0aGUgdW1hc2sgKi8KKyNkZWZpbmUgTVNfT05FX1NFQ09ORCAgICgxPDwxNykJLyogZnMgaGFzIDEgc2VjIGEvbS9jdGltZSByZXNvbHV0aW9uICovCisjZGVmaW5lIE1TX0FDVElWRSAgICAgICAoMTw8MzApCisjZGVmaW5lIE1TX05PVVNFUiAgICAgICAoMTw8MzEpCisKKy8qCisgKiBTdXBlcmJsb2NrIGZsYWdzIHRoYXQgY2FuIGJlIGFsdGVyZWQgYnkgTVNfUkVNT1VOVAorICovCisjZGVmaW5lIE1TX1JNVF9NQVNLICAgICAoTVNfUkRPTkxZfE1TX1NZTkNIUk9OT1VTfE1TX01BTkRMT0NLfE1TX05PQVRJTUV8TVNfTk9ESVJBVElNRSkKKworLyoKKyAqIE9sZCBtYWdpYyBtb3VudCBmbGFnIGFuZCBtYXNrCisgKi8KKyNkZWZpbmUgTVNfTUdDX1ZBTCAweEMwRUQwMDAwCisjZGVmaW5lIE1TX01HQ19NU0sgMHhmZmZmMDAwMAorCisvKgorICogdW1vdW50MigpIGZsYWdzCisgKi8KKyNkZWZpbmUgTU5UX0ZPUkNFCTEJLyogRm9yY2libHkgdW5tb3VudCAqLworI2RlZmluZSBNTlRfREVUQUNICTIJLyogRGV0YWNoIGZyb20gdHJlZSBvbmx5ICovCisjZGVmaW5lIE1OVF9FWFBJUkUJNAkvKiBNYXJrIGZvciBleHBpcnkgKi8KKworLyoKKyAqIEJsb2NrIGRldmljZSBpb2N0bHMKKyAqLworI2RlZmluZSBCTEtST1NFVCAgIF9JTygweDEyLCA5MykJLyogU2V0IGRldmljZSByZWFkLW9ubHkgKDAgPSByZWFkLXdyaXRlKS4gICovCisjZGVmaW5lIEJMS1JPR0VUICAgX0lPKDB4MTIsIDk0KQkvKiBHZXQgcmVhZC1vbmx5IHN0YXR1cyAoMCA9IHJlYWRfd3JpdGUpLiAgKi8KKyNkZWZpbmUgQkxLUlJQQVJUICBfSU8oMHgxMiwgOTUpCS8qIFJlLXJlYWQgcGFydGl0aW9uIHRhYmxlLiAgKi8KKyNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiwgOTYpCS8qIFJldHVybiBkZXZpY2Ugc2l6ZS4gICovCisjZGVmaW5lIEJMS0ZMU0JVRiAgX0lPKDB4MTIsIDk3KQkvKiBGbHVzaCBidWZmZXIgY2FjaGUuICAqLworI2RlZmluZSBCTEtSQVNFVCAgIF9JTygweDEyLCA5OCkJLyogU2V0IHJlYWQgYWhlYWQgZm9yIGJsb2NrIGRldmljZS4gICovCisjZGVmaW5lIEJMS1JBR0VUICAgX0lPKDB4MTIsIDk5KQkvKiBHZXQgY3VycmVudCByZWFkIGFoZWFkIHNldHRpbmcuICAqLworCisvKgorICogUHJvdG90eXBlcworICovCitfX2V4dGVybiBpbnQgbW91bnQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJCSAgIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgY29uc3Qgdm9pZCAqKTsKK19fZXh0ZXJuIGludCB1bW91bnQoY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCB1bW91bnQyKGNvbnN0IGNoYXIgKiwgaW50KTsKK19fZXh0ZXJuIGludCBwaXZvdF9yb290KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCQkJCS8qIF9TWVNfTU9VTlRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3BhcmFtLmggYi91c3IvaW5jbHVkZS9zeXMvcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNiMmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3BhcmFtLmgKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIHN5cy9wYXJhbS5oCisgKi8KKworI2lmbmRlZiBfU1lTX1BBUkFNX0gKKyNkZWZpbmUgX1NZU19QQVJBTV9ICisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorCisjZW5kaWYJCQkJLyogX1NZU19QQVJBTV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvcG9sbC5oIGIvdXNyL2luY2x1ZGUvc3lzL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM2MGMyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3BvbGwuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogcG9sbC5oCisgKi8KKworI2lmbmRlZiBfUE9MTF9ICisjZGVmaW5lIF9QT0xMX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCisvKiBQT1NJWCBzcGVjaWZpZXMgImludCIgZm9yIHRoZSB0aW1lb3V0LCBMaW51eCBzZWVtcyB0byB1c2UgbG9uZy4uLiAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBuZmRzX3Q7CitfX2V4dGVybiBpbnQgcG9sbChzdHJ1Y3QgcG9sbGZkICosIG5mZHNfdCwgbG9uZyk7CitfX2V4dGVybiBpbnQgcHBvbGwoc3RydWN0IHBvbGxmZCAqLCBuZmRzX3QsIHN0cnVjdCB0aW1lc3BlYyAqLAorCQkgICBjb25zdCBzaWdzZXRfdCAqKTsKKworI2VuZGlmCQkJCS8qIF9QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9wcmN0bC5oIGIvdXNyL2luY2x1ZGUvc3lzL3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyYzE5MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9wcmN0bC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1NZU19QUkNUTF9ICisjZGVmaW5lIF9TWVNfUFJDVExfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KKworLyogZ2xpYmMgaGFzIHRoaXMgYXMgYSB2YXJhZGljIGZ1bmN0aW9uLCBzbyBqb2luIHRoZSBjbHViLi4uICovCitfX2V4dGVybiBpbnQgcHJjdGwoaW50LCAuLi4pOworCisjZW5kaWYgLyogX1NZU19QUkNUTF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvcmVib290LmggYi91c3IvaW5jbHVkZS9zeXMvcmVib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzN2QyNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9yZWJvb3QuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogc3lzL3JlYm9vdC5oCisgKi8KKworI2lmbmRlZiBfU1lTX1JFQk9PVF9ICisjZGVmaW5lIF9TWVNfUkVCT09UX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorCisvKiBnbGliYyBuYW1lcyB0aGVzZSBjb25zdGFudHMgZGlmZmVyZW50bHk7IGFsbG93IGJvdGggdmVyc2lvbnMgKi8KKworI2RlZmluZSBSQl9BVVRPQk9PVAlMSU5VWF9SRUJPT1RfQ01EX1JFU1RBUlQKKyNkZWZpbmUgUkJfSEFMVF9TWVNURU0JTElOVVhfUkVCT09UX0NNRF9IQUxUCisjZGVmaW5lIFJCX0VOQUJMRV9DQUQJTElOVVhfUkVCT09UX0NNRF9DQURfT04KKyNkZWZpbmUgUkJfRElTQUJMRV9DQUQJTElOVVhfUkVCT09UX0NNRF9DQURfT0ZGCisjZGVmaW5lIFJCX1BPV0VSX09GRglMSU5VWF9SRUJPT1RfQ01EX1BPV0VSX09GRgorCisvKiBnbGliYy1pc2ggb25lLWFyZ3VtZW50IHZlcnNpb24gKi8KK19fZXh0ZXJuIGludCByZWJvb3QoaW50KTsKKworLyogTmF0aXZlIGZvdXItYXJndW1lbnQgc3lzdGVtIGNhbGwgKi8KK19fZXh0ZXJuIGludCBfX3JlYm9vdChpbnQsIGludCwgaW50LCB2b2lkICopOworCisjZW5kaWYJCQkJLyogX1NZU19SRUJPT1RfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3Jlc291cmNlLmggYi91c3IvaW5jbHVkZS9zeXMvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWNlZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3Jlc291cmNlLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIHN5cy9yZXNvdXJjZS5oCisgKi8KKworI2lmbmRlZiBfU1lTX1JFU09VUkNFX0gKKyNkZWZpbmUgX1NZU19SRVNPVVJDRV9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIE1VU1QgYmUgaW5jbHVkZWQgYmVmb3JlIGxpbnV4L3Jlc291cmNlLmggKi8KKyNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgorCitfX2V4dGVybiBpbnQgZ2V0cHJpb3JpdHkoaW50LCBpbnQpOworX19leHRlcm4gaW50IHNldHByaW9yaXR5KGludCwgaW50LCBpbnQpOworCisjZW5kaWYJCQkJLyogX1NZU19SRVNPVVJDRV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmggYi91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZTAwZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9zZWxlY3QuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogc3lzL3NlbGVjdC5oCisgKi8KKworI2lmbmRlZiBfU1lTX1NFTEVDVF9ICisjZGVmaW5lIF9TWVNfU0VMRUNUX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK19fZXh0ZXJuIGludCBzZWxlY3QoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICosIGZkX3NldCAqLCBzdHJ1Y3QgdGltZXZhbCAqKTsKK19fZXh0ZXJuIGludCBwc2VsZWN0KGludCwgZmRfc2V0ICosIGZkX3NldCAqLCBmZF9zZXQgKiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc2lnc2V0X3QgKik7CisKKyNlbmRpZgkJCQkvKiBfU1lTX1NFTEVDVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvc2VuZGZpbGUuaCBiL3Vzci9pbmNsdWRlL3N5cy9zZW5kZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDVmMTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc2VuZGZpbGUuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogc3lzL3NlbmRmaWxlLmgKKyAqLworCisjaWZuZGVmIF9TWVNfU0VOREZJTEVfSAorI2RlZmluZSBfU1lTX1NFTkRGSUxFX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX2V4dGVybiBzc2l6ZV90IHNlbmRmaWxlKGludCwgaW50LCBvZmZfdCAqLCBzaXplX3QsIG9mZl90KTsKKworI2VuZGlmIC8qIF9TWVNfU0VOREZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3NvY2tldC5oIGIvdXNyL2luY2x1ZGUvc3lzL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDcwODcKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc29ja2V0LmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIHN5cy9zb2NrZXQuaAorICovCisKKyNpZm5kZWYgX1NZU19TT0NLRVRfSAorI2RlZmluZSBfU1lTX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorI2luY2x1ZGUgPGtsaWJjL3N5c2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2lmIF9LTElCQ19IQVNfQVJDSFNPQ0tFVF9ICisjaW5jbHVkZSA8a2xpYmMvYXJjaHNvY2tldC5oPgorI2VuZGlmCisKKy8qIEdyZWF0IGpvYiwgZ3V5cyEgIFRoZXNlIGFyZSAqYXJjaGl0ZWN0dXJlLXNwZWNpZmljKiBBQkkgY29uc3RhbnRzLAorICAgdGhhdCBhcmUgaGlkZGVuIHVuZGVyICNpZmRlZiBfX0tFUk5FTF9fLi4uIHdoYXQgYSBicmlsbGlhbnQgaWRlYSEKKyAgIFRoZXNlIGFyZSB0aGUgImNvbW1vbiIgZGVmaW5pdGlvbnM7IGlmIG5vdCBhcHByb3ByaWF0ZSwgb3ZlcnJpZGUKKyAgIHRoZW0gaW4gPGtsaWJjL2FyY2hzb2NrZXQuaD4uICovCisgICAKKyNpZm5kZWYgU09DS19TVFJFQU0KKyMgZGVmaW5lIFNPQ0tfU1RSRUFNICAgIDEKKyMgZGVmaW5lIFNPQ0tfREdSQU0gICAgIDIKKyMgZGVmaW5lIFNPQ0tfUkFXICAgICAgIDMKKyMgZGVmaW5lIFNPQ0tfUkRNICAgICAgIDQKKyMgZGVmaW5lIFNPQ0tfU0VRUEFDS0VUIDUKKyMgZGVmaW5lIFNPQ0tfUEFDS0VUICAgIDEwCisjZW5kaWYKKwordHlwZWRlZiBpbnQgc29ja2xlbl90OworCitfX2V4dGVybiBpbnQgc29ja2V0KGludCwgaW50LCBpbnQpOworX19leHRlcm4gaW50IGJpbmQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKK19fZXh0ZXJuIGludCBjb25uZWN0KGludCwgc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCk7CitfX2V4dGVybiBpbnQgbGlzdGVuKGludCwgaW50KTsKK19fZXh0ZXJuIGludCBhY2NlcHQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICopOworX19leHRlcm4gaW50IGdldHNvY2tuYW1lKGludCwgc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCAqKTsKK19fZXh0ZXJuIGludCBnZXRwZWVybmFtZShpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QgKik7CitfX2V4dGVybiBpbnQgc29ja2V0cGFpcihpbnQsIGludCwgaW50LCBpbnQgKik7CitfX2V4dGVybiBpbnQgc2VuZChpbnQsIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworX19leHRlcm4gaW50IHNlbmR0byhpbnQsIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLAorCQkJc29ja2xlbl90KTsKK19fZXh0ZXJuIGludCByZWN2KGludCwgdm9pZCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CitfX2V4dGVybiBpbnQgcmVjdmZyb20oaW50LCB2b2lkICosIHNpemVfdCwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwKKwkJCSAgc29ja2xlbl90ICopOworX19leHRlcm4gaW50IHNodXRkb3duKGludCwgaW50KTsKK19fZXh0ZXJuIGludCBzZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIGNvbnN0IHZvaWQgKiwgc29ja2xlbl90KTsKK19fZXh0ZXJuIGludCBnZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIHZvaWQgKiwgc29ja2xlbl90ICopOworX19leHRlcm4gaW50IHNlbmRtc2coaW50LCBjb25zdCBzdHJ1Y3QgbXNnaGRyICosIHVuc2lnbmVkIGludCk7CitfX2V4dGVybiBpbnQgcmVjdm1zZyhpbnQsIHN0cnVjdCBtc2doZHIgKiwgdW5zaWduZWQgaW50KTsKKworI2VuZGlmCQkJCS8qIF9TWVNfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9zb2NrZXRjYWxscy5oIGIvdXNyL2luY2x1ZGUvc3lzL3NvY2tldGNhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0MzY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9zb2NrZXRjYWxscy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBzeXMvc29ja2V0Y2FsbHMuaAorICovCisKKyNpZm5kZWYgX1NZU19TT0NLRVRDQUxMU19ICisjZGVmaW5lIF9TWVNfU09DS0VUQ0FMTFNfSAorCisvKiBzb2NrZXRjYWxscyBieSBudW1iZXIsIHNpbmNlIDxsaW51eC9uZXQuaD4gaXNuJ3QgdXNhYmxlIGZvciBhc3NlbWJseSAqLworCisjZGVmaW5lIFNZU19TT0NLRVQgICAgICAxCS8qIHN5c19zb2NrZXQoMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTX0JJTkQgICAgICAgIDIJLyogc3lzX2JpbmQoMikgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfQ09OTkVDVCAgICAgMwkvKiBzeXNfY29ubmVjdCgyKSAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19MSVNURU4gICAgICA0CS8qIHN5c19saXN0ZW4oMikgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTX0FDQ0VQVCAgICAgIDUJLyogc3lzX2FjY2VwdCgyKSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfR0VUU09DS05BTUUgNgkvKiBzeXNfZ2V0c29ja25hbWUoMikgICAgICAgICAgICovCisjZGVmaW5lIFNZU19HRVRQRUVSTkFNRSA3CS8qIHN5c19nZXRwZWVybmFtZSgyKSAgICAgICAgICAgKi8KKyNkZWZpbmUgU1lTX1NPQ0tFVFBBSVIgIDgJLyogc3lzX3NvY2tldHBhaXIoMikgICAgICAgICAgICAqLworI2RlZmluZSBTWVNfU0VORCAgICAgICAgOQkvKiBzeXNfc2VuZCgyKSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19SRUNWICAgICAgICAxMAkvKiBzeXNfcmVjdigyKSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19TRU5EVE8gICAgICAxMQkvKiBzeXNfc2VuZHRvKDIpICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19SRUNWRlJPTSAgICAxMgkvKiBzeXNfcmVjdmZyb20oMikgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19TSFVURE9XTiAgICAxMwkvKiBzeXNfc2h1dGRvd24oMikgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19TRVRTT0NLT1BUICAxNAkvKiBzeXNfc2V0c29ja29wdCgyKSAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19HRVRTT0NLT1BUICAxNQkvKiBzeXNfZ2V0c29ja29wdCgyKSAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19TRU5ETVNHICAgICAxNgkvKiBzeXNfc2VuZG1zZygyKSAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNZU19SRUNWTVNHICAgICAxNwkvKiBzeXNfcmVjdm1zZygyKSAgICAgICAgICAgICAgICovCisKKyNlbmRpZgkJCQkvKiBfU1lTX1NPQ0tFVENBTExTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9zcGxpY2UuaCBiL3Vzci9pbmNsdWRlL3N5cy9zcGxpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEyNmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy9zcGxpY2UuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogc3lzL3NwbGljZS5oCisgKi8KKworI2lmbmRlZiBfU1lTX1NQTElDRV9ICisjZGVmaW5lIF9TWVNfU1BMSUNFX0gKKworLyogbW92ZSBwYWdlcyBpbnN0ZWFkIG9mIGNvcHlpbmcgKi8KKyNkZWZpbmUgU1BMSUNFX0ZfTU9WRQkJMQorLyogZG9uJ3QgYmxvY2sgb24gdGhlIHBpcGUgc3BsaWNpbmcgKGJ1dCB3ZSBtYXkgc3RpbGwgYmxvY2sgb24gdGhlIGZkCisgICB3ZSBzcGxpY2UgZnJvbS90bywgb2YgY291cnNlICovCisjZGVmaW5lIFNQTElDRV9GX05PTkJMT0NLCTIKKy8qIGV4cGVjdCBtb3JlIGRhdGEgKi8KKyNkZWZpbmUgU1BMSUNFX0ZfTU9SRQkJNAorCitfX2V4dGVybiBpbnQgc3BsaWNlKGludCwgb2ZmX3QgKiwgaW50LCBvZmZfdCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CitfX2V4dGVybiBpbnQgdGVlKGludCwgaW50LCBzaXplX3QsIHVuc2lnbmVkIGludCk7CisKKyNlbmRpZgkJCQkvKiBfU1lTX1NQTElDRV9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXMvc3RhdC5oIGIvdXNyL2luY2x1ZGUvc3lzL3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzE4MmZjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3N0YXQuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogc3lzL3N0YXQuaAorICovCisKKyNpZm5kZWYgX1NZU19TVEFUX0gKKyNkZWZpbmUgX1NZU19TVEFUX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CQkvKiBGb3Igc3RydWN0IHRpbWVzcGVjICovCisjaW5jbHVkZSA8a2xpYmMvYXJjaHN0YXQuaD4KKworLyogMi42LjIxIGtlcm5lbHMgaGF2ZSBvbmNlIGFnYWluIGhpZGRlbiBhIGJ1bmNoIG9mIHN0dWZmLi4uICovCisjaWZuZGVmIFNfSUZNVAorCisjZGVmaW5lIFNfSUZNVCAgMDAxNzAwMDAKKyNkZWZpbmUgU19JRlNPQ0sgMDE0MDAwMAorI2RlZmluZSBTX0lGTE5LCSAwMTIwMDAwCisjZGVmaW5lIFNfSUZSRUcgIDAxMDAwMDAKKyNkZWZpbmUgU19JRkJMSyAgMDA2MDAwMAorI2RlZmluZSBTX0lGRElSICAwMDQwMDAwCisjZGVmaW5lIFNfSUZDSFIgIDAwMjAwMDAKKyNkZWZpbmUgU19JRklGTyAgMDAxMDAwMAorI2RlZmluZSBTX0lTVUlEICAwMDA0MDAwCisjZGVmaW5lIFNfSVNHSUQgIDAwMDIwMDAKKyNkZWZpbmUgU19JU1ZUWCAgMDAwMTAwMAorCisjZGVmaW5lIFNfSVNMTksobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZMTkspCisjZGVmaW5lIFNfSVNSRUcobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZGVmaW5lIFNfSVNESVIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZGVmaW5lIFNfSVNDSFIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCisjZGVmaW5lIFNfSVNCTEsobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZCTEspCisjZGVmaW5lIFNfSVNGSUZPKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2RlZmluZSBTX0lTU09DSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCisKKyNkZWZpbmUgU19JUldYVSAwMDcwMAorI2RlZmluZSBTX0lSVVNSIDAwNDAwCisjZGVmaW5lIFNfSVdVU1IgMDAyMDAKKyNkZWZpbmUgU19JWFVTUiAwMDEwMAorCisjZGVmaW5lIFNfSVJXWEcgMDAwNzAKKyNkZWZpbmUgU19JUkdSUCAwMDA0MAorI2RlZmluZSBTX0lXR1JQIDAwMDIwCisjZGVmaW5lIFNfSVhHUlAgMDAwMTAKKworI2RlZmluZSBTX0lSV1hPIDAwMDA3CisjZGVmaW5lIFNfSVJPVEggMDAwMDQKKyNkZWZpbmUgU19JV09USCAwMDAwMgorI2RlZmluZSBTX0lYT1RIIDAwMDAxCisKKyNkZWZpbmUgU19JUldYVUdPCShTX0lSV1hVfFNfSVJXWEd8U19JUldYTykKKyNkZWZpbmUgU19JQUxMVUdPCShTX0lTVUlEfFNfSVNHSUR8U19JU1ZUWHxTX0lSV1hVR08pCisjZGVmaW5lIFNfSVJVR08JCShTX0lSVVNSfFNfSVJHUlB8U19JUk9USCkKKyNkZWZpbmUgU19JV1VHTwkJKFNfSVdVU1J8U19JV0dSUHxTX0lXT1RIKQorI2RlZmluZSBTX0lYVUdPCQkoU19JWFVTUnxTX0lYR1JQfFNfSVhPVEgpCisKKyNlbmRpZgorCisjaWZkZWYgX1NUQVRCVUZfU1RfTlNFQworICAvKiBzdHJ1Y3Qgc3RhdCBoYXMgc3RydWN0IHRpbWVzcGVjIGluc3RlYWQgb2YgdGltZV90ICovCisjIGRlZmluZSBzdF9hdGltZSAgc3RfYXRpbS50dl9zZWMKKyMgZGVmaW5lIHN0X210aW1lICBzdF9tdGltLnR2X3NlYworIyBkZWZpbmUgc3RfY3RpbWUgIHN0X2N0aW0udHZfc2VjCisjZW5kaWYKKworX19leHRlcm4gaW50IHN0YXQoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKK19fZXh0ZXJuIGludCBmc3RhdChpbnQsIHN0cnVjdCBzdGF0ICopOworX19leHRlcm4gaW50IGZzdGF0YXQoaW50LCBjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICosIGludCk7CitfX2V4dGVybiBpbnQgbHN0YXQoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKK19fZXh0ZXJuIG1vZGVfdCB1bWFzayhtb2RlX3QpOworX19leHRlcm4gaW50IG1rbm9kKGNvbnN0IGNoYXIgKiwgbW9kZV90LCBkZXZfdCk7CitfX2V4dGVybiBpbnQgbWtub2RhdChpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBtb2RlX3QsIGRldl90KTsKK3N0YXRpYyBfX2lubGluZV9fIGludCBta2ZpZm8oY29uc3QgY2hhciAqX19wLCBtb2RlX3QgX19tKQoreworCXJldHVybiBta25vZChfX3AsIChfX20gJiB+U19JRk1UKSB8IFNfSUZJRk8sIChkZXZfdCkgMCk7Cit9CisKKyNlbmRpZgkJCQkvKiBfU1lTX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3N0YXRmcy5oIGIvdXNyL2luY2x1ZGUvc3lzL3N0YXRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjNiNWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc3RhdGZzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN5cy92ZnMuaD4KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9zeXNjYWxsLmggYi91c3IvaW5jbHVkZS9zeXMvc3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTAxNDIKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc3lzY2FsbC5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBzeXMvc3lzY2FsbC5oCisgKgorICogR2VuZXJpYyBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UgbWFjcm9zCisgKi8KKyNpZm5kZWYgX1NZU19TWVNDQUxMX0gKKyNkZWZpbmUgX1NZU19TWVNDQUxMX0gKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjZW5kaWYJCQkJLyogX1NZU19TWVNDQUxMX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy9zeXNpbmZvLmggYi91c3IvaW5jbHVkZS9zeXMvc3lzaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTY4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc3lzaW5mby5oCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiBzeXMvc3lzaW5mby5oCisgKi8KKworI2lmbmRlZiBfU1lTX1NZU0lORk9fSAorI2RlZmluZSBfU1lTX1NZU0lORk9fSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK2V4dGVybiBpbnQgc3lzaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqaW5mbyk7CisKKyNlbmRpZgkJCQkvKiBfU1lTX1NZU0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oIGIvdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNDQzMzkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvc3lzbWFjcm9zLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIHN5cy9zeXNtYWNyb3MuaAorICoKKyAqIENvbnN0cnVjdHMgdG8gY3JlYXRlIGFuZCBwaWNrIGFwYXJ0IGRldl90LiAgVGhlIGRvdWJsZS11bmRlcnNjb3JlCisgKiB2ZXJzaW9ucyBhcmUgbWFjcm9zIHNvIHRoZXkgY2FuIGJlIHVzZWQgYXMgY29uc3RhbnRzLgorICovCisKKyNpZm5kZWYgX1NZU19TWVNNQUNST1NfSAorI2RlZmluZSBfU1lTX1NZU01BQ1JPU19ICisKKyNpZm5kZWYgX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNkZWZpbmUgX19tYWpvcihfX2QpICgoKF9fZCkgPj4gOCkgJiAweGZmZikKK3N0YXRpYyBfX2lubGluZV9fIGludCBtYWpvcihkZXZfdCBfX2QpCit7CisJcmV0dXJuIF9fbWFqb3IoX19kKTsKK30KKworI2RlZmluZSBfX21pbm9yKF9fZCkgKCgoX19kKSAmIDB4ZmYpfCgoKF9fZCkgPj4gMTIpICYgMHhmZmYwMCkpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbWlub3IoZGV2X3QgX19kKQoreworCXJldHVybiBfX21pbm9yKF9fZCk7Cit9CisKKyNkZWZpbmUgX19tYWtlZGV2KF9fbWEsIF9fbWkpIFwKKwkoKCgoX19tYSkgJiAweGZmZikgPDwgOCl8KChfX21pKSAmIDB4ZmYpfCgoKF9fbWkpICYgMHhmZmYwMCkgPDwgMTIpKQorc3RhdGljIF9faW5saW5lX18gZGV2X3QgbWFrZWRldihpbnQgX19tYSwgaW50IF9fbWkpCit7CisJcmV0dXJuIF9fbWFrZWRldihfX21hLCBfX21pKTsKK30KKworI2VuZGlmCQkJCS8qIF9TWVNfU1lTTUFDUk9TX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy90aW1lLmggYi91c3IvaW5jbHVkZS9zeXMvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmY4YjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS9zeXMvdGltZS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBzeXMvdGltZS5oCisgKi8KKworI2lmbmRlZiBfU1lTX1RJTUVfSAorI2RlZmluZSBfU1lTX1RJTUVfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisvKiBUaGUgMi42LjIwIExpbnV4IGhlYWRlcnMgYWx3YXlzICNkZWZpbmUgRkRfWkVSTyBfX0ZEX1pFUk8sIGV0YywgaW4KKyAgIDxsaW51eC90aW1lLmg+IGJ1dCBub3QgYWxsIGFyY2hpdGVjdHVyZXMgZGVmaW5lIHRoZQorICAgZG91YmxlLXVuZGVyc2NvcmUgb25lcywgZXhjZXB0IF9fTkZEQklUUywgX19GRF9TRVRTSVpFIGFuZAorICAgX19GRFNFVF9MT05HUyB3aGljaCBhcmUgZGVmaW5lZCBpbiA8bGludXgvcG9zaXhfdHlwZXMuaD4uCisKKyAgIFVuZm9ydHVuYXRlbHksIHNvbWUgYXJjaGl0ZWN0dXJlcyBkZWZpbmUgdGhlIGRvdWJsZS11bmRlcnNjb3JlIG9uZXMKKyAgIGFzIGlubGluZXMsIHNvIHdlIGNhbid0IHVzZSBhIHNpbXBsZSAjaWZkZWYgdGVzdC4gIFRodXMsIHRoZSBvbmx5CisgICBzYWZlIG9wdGlvbiByZW1haW5pbmcgaXMgdG8gI3VuZGVmIHRoZSB0b3AtbGV2ZWwgbWFjcm9zLiAqLworCisjdW5kZWYgRkRfWkVSTworI3VuZGVmIEZEX1NFVAorI3VuZGVmIEZEX0NMUgorI3VuZGVmIEZEX0lTU0VUCisKK19fZXh0ZXJuIHZvaWQgKm1lbXNldCh2b2lkICosIGludCwgc2l6ZV90KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBGRF9aRVJPKGZkX3NldCAqX19mZHNldHApCit7CisJbWVtc2V0KF9fZmRzZXRwLCAwLCBzaXplb2YoZmRfc2V0KSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgRkRfU0VUKGludCBfX2ZkLCBmZF9zZXQgKl9fZmRzZXRwKQoreworCV9fZmRzZXRwLT5mZHNfYml0c1tfX2ZkL0JJVFNfUEVSX0xPTkddIHw9CisJCSgxVUwgPDwgKF9fZmQgJSBCSVRTX1BFUl9MT05HKSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgRkRfQ0xSKGludCBfX2ZkLCBmZF9zZXQgKl9fZmRzZXRwKQoreworCV9fZmRzZXRwLT5mZHNfYml0c1tfX2ZkL0JJVFNfUEVSX0xPTkddICY9CisJCX4oMVVMIDw8IChfX2ZkICUgQklUU19QRVJfTE9ORykpOworfQorc3RhdGljIGlubGluZSBpbnQgRkRfSVNTRVQoaW50IF9fZmQsIGZkX3NldCAqX19mZHNldHApCit7CisJcmV0dXJuIChfX2Zkc2V0cC0+ZmRzX2JpdHNbX19mZC9CSVRTX1BFUl9MT05HXSA+PgorCQkoX19mZCAlIEJJVFNfUEVSX0xPTkcpKSAmIDE7Cit9CisKK19fZXh0ZXJuIGludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV6b25lICopOworX19leHRlcm4gaW50IHNldHRpbWVvZmRheShjb25zdCBzdHJ1Y3QgdGltZXZhbCAqLCBjb25zdCBzdHJ1Y3QgdGltZXpvbmUgKik7CitfX2V4dGVybiBpbnQgZ2V0aXRpbWVyKGludCwgc3RydWN0IGl0aW1lcnZhbCAqKTsKK19fZXh0ZXJuIGludCBzZXRpdGltZXIoaW50LCBjb25zdCBzdHJ1Y3QgaXRpbWVydmFsICosIHN0cnVjdCBpdGltZXJ2YWwgKik7CitfX2V4dGVybiBpbnQgdXRpbWVzKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKik7CisKKyNlbmRpZgkJCQkvKiBfU1lTX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3RpbWVzLmggYi91c3IvaW5jbHVkZS9zeXMvdGltZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmJlNjlhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3RpbWVzLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIHN5cy90aW1lcy5oCisgKi8KKworI2lmbmRlZiBfU1lTX1RJTUVTX0gKKyNkZWZpbmUgX1NZU19USU1FU19ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorCitfX2V4dGVybiBjbG9ja190IHRpbWVzKHN0cnVjdCB0bXMgKik7CisKKyNlbmRpZgkJCQkvKiBfU1lTX1RJTUVTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIGIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4MGVkMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogc3lzL3R5cGVzLmgKKyAqLworCisjaWZuZGVmIF9TWVNfVFlQRVNfSAorI2RlZmluZSBfU1lTX1RZUEVTX0gKKworI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgX1NTSVpFX1QKK3R5cGVkZWYgcHRyZGlmZl90IHNzaXplX3Q7CisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisvKiBLZWVwcyBsaW51eC90eXBlcy5oIGZyb20gZ2V0dGluZyBpbmNsdWRlZCBlbHNld2hlcmUgKi8KKyNkZWZpbmUgX0xJTlVYX1RZUEVTX0gKKwordHlwZWRlZiBfX2tlcm5lbF9mZF9zZXQgZmRfc2V0OwordHlwZWRlZiB1aW50MzJfdCBkZXZfdDsKK3R5cGVkZWYgX19rZXJuZWxfaW5vX3QgaW5vX3Q7Cit0eXBlZGVmIF9fa2VybmVsX21vZGVfdCBtb2RlX3Q7Cit0eXBlZGVmIF9fa2VybmVsX25saW5rX3QgbmxpbmtfdDsKK3R5cGVkZWYgX19rZXJuZWxfbG9mZl90IG9mZl90OwordHlwZWRlZiBfX2tlcm5lbF9sb2ZmX3QgbG9mZl90OwordHlwZWRlZiBfX2tlcm5lbF9waWRfdCBwaWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZGFkZHJfdCBkYWRkcl90OwordHlwZWRlZiBfX2tlcm5lbF9rZXlfdCBrZXlfdDsKK3R5cGVkZWYgX19rZXJuZWxfc3VzZWNvbmRzX3Qgc3VzZWNvbmRzX3Q7CisvKiB0eXBlZGVmIF9fa2VybmVsX3RpbWVyX3QJdGltZXJfdDsgKi8KK3R5cGVkZWYgaW50IHRpbWVyX3Q7CisKK3R5cGVkZWYgX19rZXJuZWxfdWlkMzJfdCB1aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkMzJfdCBnaWRfdDsKKwordHlwZWRlZiBfX2tlcm5lbF9mc2lkX3QgZnNpZF90OworCisvKgorICogVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgaW5kaXZpZHVhbCBpZmRlZnMgZm9yCisgKiBoaXN0b3JpY2FsIHJlYXNvbnM6CisgKi8KKyNpZm5kZWYgX1NJWkVfVAorI2RlZmluZSBfU0laRV9UCit0eXBlZGVmIF9fa2VybmVsX3NpemVfdCBzaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfU1NJWkVfVAorI2RlZmluZSBfU1NJWkVfVAordHlwZWRlZiBfX2tlcm5lbF9zc2l6ZV90IHNzaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfUFRSRElGRl9UCisjZGVmaW5lIF9QVFJESUZGX1QKK3R5cGVkZWYgX19rZXJuZWxfcHRyZGlmZl90IHB0cmRpZmZfdDsKKyNlbmRpZgorCisjaWZuZGVmIF9USU1FX1QKKyNkZWZpbmUgX1RJTUVfVAordHlwZWRlZiBfX2tlcm5lbF90aW1lX3QgdGltZV90OworI2VuZGlmCisKKyNpZm5kZWYgX0NMT0NLX1QKKyNkZWZpbmUgX0NMT0NLX1QKK3R5cGVkZWYgX19rZXJuZWxfY2xvY2tfdCBjbG9ja190OworI2VuZGlmCisKKyNpZm5kZWYgX0NBRERSX1QKKyNkZWZpbmUgX0NBRERSX1QKK3R5cGVkZWYgX19rZXJuZWxfY2FkZHJfdCBjYWRkcl90OworI2VuZGlmCisKKy8qIEJTRCAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVfY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9zaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVfbG9uZzsKKworLyogU3lzViAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVuY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKKworLyogTW9yZSBCU0QgKi8KK3R5cGVkZWYgdWludDhfdCB1X2ludDhfdDsKK3R5cGVkZWYgdWludDE2X3QgdV9pbnQxNl90OwordHlwZWRlZiB1aW50MzJfdCB1X2ludDMyX3Q7Cit0eXBlZGVmIHVpbnQ2NF90IHVfaW50NjRfdDsKKwordHlwZWRlZiB1aW50MTZfdCBfX2JpdHdpc2UgX19sZTE2OwordHlwZWRlZiB1aW50MTZfdCBfX2JpdHdpc2UgX19iZTE2OwordHlwZWRlZiB1aW50MzJfdCBfX2JpdHdpc2UgX19sZTMyOwordHlwZWRlZiB1aW50MzJfdCBfX2JpdHdpc2UgX19iZTMyOwordHlwZWRlZiB1aW50NjRfdCBfX2JpdHdpc2UgX19sZTY0OwordHlwZWRlZiB1aW50NjRfdCBfX2JpdHdpc2UgX19iZTY0OworCit0eXBlZGVmIHVpbnQxNl90IF9fc3VtMTY7Cit0eXBlZGVmIHVpbnQzMl90IF9fc3VtMzI7Cit0eXBlZGVmIHVpbnQ2NF90IF9fc3VtNjQ7CisKKy8qCisgKiBTb21lIGhlYWRlcnMgc2VlbSB0byByZXF1aXJlIHRoaXMuLi4KKyAqLworI2lmbmRlZiBCSVRTX1BFUl9MT05HCisjIGRlZmluZSBCSVRTX1BFUl9MT05HIF9CSVRTSVpFCisjZW5kaWYKKworLyoKKyAqIFNvbWUgYXBwcyB3YW50IHRoaXMgaW4gPHN5cy90eXBlcy5oPgorICovCisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy91aW8uaCBiL3Vzci9pbmNsdWRlL3N5cy91aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM0MWZiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3Vpby5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBzeXMvdWlvLmgKKyAqLworCisjaWZuZGVmIF9TWVNfVUlPX0gKKyNkZWZpbmUgX1NZU19VSU9fSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisKK19fZXh0ZXJuIGludCByZWFkdihpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpOworX19leHRlcm4gaW50IHdyaXRldihpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpOworCisjZW5kaWYJCQkJLyogX1NZU19VSU9fSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3VuLmggYi91c3IvaW5jbHVkZS9zeXMvdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTJkODdiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3VuLmgKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIDxzeXMvdW4uaD4KKyAqLworCisjaWZuZGVmIF9TWVNfVU5fSAorI2RlZmluZSBfU1lTX1VOX0gKKworI2luY2x1ZGUgPGxpbnV4L3VuLmg+CisKKyNlbmRpZgkJCQkvKiBfU1lTX1VOX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy91dGltZS5oIGIvdXNyL2luY2x1ZGUvc3lzL3V0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyODhhOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy91dGltZS5oCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBzeXMvdXRpbWUuaAorICovCisKKyNpZm5kZWYgX1NZU19VVElNRV9ICisjZGVmaW5lIF9TWVNfVVRJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdXRpbWUuaD4KKworI2VuZGlmCQkJCS8qIF9TWVNfVVRJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3V0c25hbWUuaCBiL3Vzci9pbmNsdWRlL3N5cy91dHNuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1NWMwYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy91dHNuYW1lLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIHN5cy91dHNuYW1lLmgKKyAqLworCisjaWZuZGVmIF9TWVNfVVRTTkFNRV9ICisjZGVmaW5lIF9TWVNfVVRTTkFNRV9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKworI2RlZmluZSBTWVNfTk1MTiA2NQorCitzdHJ1Y3QgdXRzbmFtZSB7CisJY2hhciBzeXNuYW1lW1NZU19OTUxOXTsKKwljaGFyIG5vZGVuYW1lW1NZU19OTUxOXTsKKwljaGFyIHJlbGVhc2VbU1lTX05NTE5dOworCWNoYXIgdmVyc2lvbltTWVNfTk1MTl07CisJY2hhciBtYWNoaW5lW1NZU19OTUxOXTsKKwljaGFyIGRvbWFpbm5hbWVbU1lTX05NTE5dOworfTsKKworX19leHRlcm4gaW50IHVuYW1lKHN0cnVjdCB1dHNuYW1lICopOworCisjZW5kaWYJCQkJLyogX1NZU19VVFNOQU1FX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5cy92ZnMuaCBiL3Vzci9pbmNsdWRlL3N5cy92ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmIxZWFiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzL3Zmcy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogc3lzL3Zmcy5oCisgKi8KKworI2lmbmRlZiBfU1lTX1ZGU19ICisjZGVmaW5lIF9TWVNfVkZTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHNpemUuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKworLyogc3RydWN0IHN0YXRmczY0IC0tIHRoZXJlIHNlZW1zIHRvIGJlIHR3byBzdGFuZGFyZHMgLQorICAgb25lIGZvciAzMiBhbmQgb25lIGZvciA2NCBiaXRzLCBhbmQgdGhleSdyZSBpbmNvbXBhdGlibGUuCisgICBXb3JzZSwgc29tZSA2NC1iaXQgcGxhdGZvcm1zIHNlZW0gdG8gdXNlIHRoZSAzMi1iaXQgbGF5b3V0LgorICAgT2YgY291cnNlLCB0aGVyZSBpcyBubyBpbmNsdWRhYmxlIGhlYWRlciB0aGF0IGRvZXMgdGhpcyB3ZWxsLiAqLworCisjaWYgX0tMSUJDX1NUQVRGU19GX1RZUEVfNjQKKworc3RydWN0IHN0YXRmcyB7CisJdWludDY0X3QgZl90eXBlOworCXVpbnQ2NF90IGZfYnNpemU7CisJdWludDY0X3QgZl9ibG9ja3M7CisJdWludDY0X3QgZl9iZnJlZTsKKwl1aW50NjRfdCBmX2JhdmFpbDsKKwl1aW50NjRfdCBmX2ZpbGVzOworCXVpbnQ2NF90IGZfZmZyZWU7CisJX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKKwl1aW50NjRfdCBmX25hbWVsZW47CisJdWludDY0X3QgZl9mcnNpemU7CisJdWludDY0X3QgZl9zcGFyZVs1XTsKK307CisKKyNlbGlmIF9LTElCQ19TVEFURlNfRl9UWVBFXzMyQgorCitzdHJ1Y3Qgc3RhdGZzIHsKKwl1aW50MzJfdCBmX3R5cGU7CisJdWludDMyX3QgZl9ic2l6ZTsKKwl1aW50MzJfdCBmX2Zyc2l6ZTsKKwl1aW50MzJfdCBfX3BhZDsKKwl1aW50NjRfdCBmX2Jsb2NrczsKKwl1aW50NjRfdCBmX2JmcmVlOworCXVpbnQ2NF90IGZfZmlsZXM7CisJdWludDY0X3QgZl9mZnJlZTsKKwl1aW50NjRfdCBmX2JhdmFpbDsKKwlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOworCXVpbnQzMl90IGZfbmFtZWxlbjsKKwl1aW50MzJfdCBmX3NwYXJlWzZdOworfTsKKworI2Vsc2UgLyogbm90IF9LTElCQ19TVEFURlNfRl9UWVBFXzY0ICovCisKK3N0cnVjdCBzdGF0ZnMgeworCXVpbnQzMl90IGZfdHlwZTsKKwl1aW50MzJfdCBmX2JzaXplOworCXVpbnQ2NF90IGZfYmxvY2tzOworCXVpbnQ2NF90IGZfYmZyZWU7CisJdWludDY0X3QgZl9iYXZhaWw7CisJdWludDY0X3QgZl9maWxlczsKKwl1aW50NjRfdCBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJdWludDMyX3QgZl9uYW1lbGVuOworCXVpbnQzMl90IGZfZnJzaXplOworCXVpbnQzMl90IGZfc3BhcmVbNV07Cit9OworCisjZW5kaWYgLyogX0tMSUJDX1NUQVRGU19GX1RZUEVfNjQgKi8KKworX19leHRlcm4gaW50IHN0YXRmcyhjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ZnMgKik7CitfX2V4dGVybiBpbnQgZnN0YXRmcyhpbnQsIHN0cnVjdCBzdGF0ZnMgKik7CisKKy8qIFZhcmlvdXMgZmlsZXN5c3RlbSB0eXBlcyAqLworI2RlZmluZSBBREZTX1NVUEVSX01BR0lDCTB4YWRmNQorI2RlZmluZSBBRkZTX1NVUEVSX01BR0lDCTB4YWRmZgorI2RlZmluZSBBRlNfRlNfTUFHSUMJCTB4NkI0MTQ2NTMJLyogJ2tBRlMnICovCisjZGVmaW5lIEFVVE9GU19TVVBFUl9NQUdJQwkweDAxODcKKyNkZWZpbmUgQkZTX01BR0lDCQkweDFCQURGQUNFCisjZGVmaW5lIENBUElGU19TVVBFUl9NQUdJQwkweDQzNGUKKyNkZWZpbmUgQ0lGU19NQUdJQ19OVU1CRVIJMHhGRjUzNEQ0MgorI2RlZmluZSBDT0RBX1NVUEVSX01BR0lDCTB4NzM3NTcyNDUKKyNkZWZpbmUgQ1JBTUZTX01BR0lDCQkweDI4Y2QzZDQ1CisjZGVmaW5lIERFVkZTX1NVUEVSX01BR0lDCTB4MTM3MworI2RlZmluZSBERVZQVFNfU1VQRVJfTUFHSUMJMHgxY2QxCisjZGVmaW5lIEVGU19TVVBFUl9NQUdJQwkJMHg0MTRBNTMKKyNkZWZpbmUgRVZFTlRQT0xMRlNfTUFHSUMJMHgwMzExMTk2NQorI2RlZmluZSBFWFQyX1NVUEVSX01BR0lDCTB4RUY1MworI2RlZmluZSBFWFQzX1NVUEVSX01BR0lDCTB4RUY1MworI2RlZmluZSBHQURHRVRGU19NQUdJQwkJMHhhZWU3MWVlNworI2RlZmluZSBIRlNQTFVTX1NVUEVSX01BR0lDCTB4NDgyYgorI2RlZmluZSBIRlNfTUZTX1NVUEVSX01BR0lDCTB4RDJENwkvKiBNRlMgTURCIChzdXBlciBibG9jaykgKi8KKyNkZWZpbmUgSEZTX1NVUEVSX01BR0lDCQkweDQyNDQJLyogIkJEIjogSEZTIE1EQiAoc3VwZXIgYmxvY2spICovCisjZGVmaW5lIEhQRlNfU1VQRVJfTUFHSUMgMHhmOTk1ZTg0OQorI2RlZmluZSBIVUdFVExCRlNfTUFHSUMJCTB4OTU4NDU4ZjYKKyNkZWZpbmUgSFdHRlNfTUFHSUMJCTB4MTIwNjE5ODMKKyNkZWZpbmUgSUJNQVNNRlNfTUFHSUMJCTB4NjY3MjZmNjcKKyNkZWZpbmUgSVNPRlNfU1VQRVJfTUFHSUMJMHg5NjYwCisjZGVmaW5lIEpGRlMyX1NVUEVSX01BR0lDCTB4NzJiNgorI2RlZmluZSBKRkZTX01BR0lDX0JJVE1BU0sJMHgzNDM4MzkzMQkvKiAiMTk4NCIgKi8KKyNkZWZpbmUgSkZGU19NQUdJQ19TQl9CSVRNQVNLCTB4MDdjMAkvKiAxOTg0ICovCisjZGVmaW5lIEpGU19TVVBFUl9NQUdJQwkJMHgzMTUzNDY0YQkvKiAiSkZTMSIgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDCTB4MjQ2OAkvKiBtaW5peCBWMiBmcyAqLworI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMyCTB4MjQ3OAkvKiBtaW5peCBWMiBmcywgMzAgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQwkweDEzN0YJLyogb3JpZ2luYWwgbWluaXggZnMgKi8KKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMyCTB4MTM4RgkvKiBtaW5peCBmcywgMzAgY2hhciBuYW1lcyAqLworI2RlZmluZSBNU0RPU19TVVBFUl9NQUdJQwkweDRkNDQJLyogTUQgKi8KKyNkZWZpbmUgTkNQX1NVUEVSX01BR0lDCQkweDU2NGMKKyNkZWZpbmUgTkZTX1NVUEVSX01BR0lDCQkweDY5NjkKKyNkZWZpbmUgTkZTX1NVUEVSX01BR0lDCQkweDY5NjkKKyNkZWZpbmUgT1BFTlBST01fU1VQRVJfTUFHSUMJMHg5ZmExCisjZGVmaW5lIE9QUk9GSUxFRlNfTUFHSUMJMHg2ZjcwNzI2ZgorI2RlZmluZSBQRk1GU19NQUdJQwkJMHhhMGI0ZDg4OQorI2RlZmluZSBQSVBFRlNfTUFHSUMJCTB4NTA0OTUwNDUKKyNkZWZpbmUgUFJPQ19TVVBFUl9NQUdJQwkweDlmYTAKKyNkZWZpbmUgUU5YNF9TVVBFUl9NQUdJQwkweDAwMmYJLyogcW54NCBmcyBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgUkFNRlNfTUFHSUMJCTB4ODU4NDU4ZjYKKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUMJMHg1MjY1NDk3MworI2RlZmluZSBST01GU19NQUdJQwkJMHg3Mjc1CisjZGVmaW5lIFNNQl9TVVBFUl9NQUdJQwkJMHg1MTdCCisjZGVmaW5lIFNPQ0tGU19NQUdJQwkJMHg1MzRGNDM0QgorI2RlZmluZSBTWVNGU19NQUdJQwkJMHg2MjY1NjU3MgorI2RlZmluZSBUTVBGU19NQUdJQwkJMHgwMTAyMTk5NAorI2RlZmluZSBVREZfU1VQRVJfTUFHSUMJCTB4MTUwMTMzNDYKKyNkZWZpbmUgVUZTX01BR0lDCQkweDAwMDExOTU0CisjZGVmaW5lIFVGU19NQUdJQ180R0IJCTB4MDUyMzE5OTQJLyogZnMgPiA0IEdCICYmIGZzX2ZlYXR1cmViaXRzICovCisjZGVmaW5lIFVGU19NQUdJQ19GRUEJCTB4MDAxOTU2MTIJLyogZnNfZmVhdHVyZWJpdHMgc3VwcG9ydGVkICovCisjZGVmaW5lIFVGU19NQUdJQ19MRk4JCTB4MDAwOTUwMTQJLyogZnMgc3VwcG9ydHMgZmlsZW5hbWVzID4gMTQgY2hhcnMgKi8KKyNkZWZpbmUgVUZTX01BR0lDX1NFQwkJMHgwMDYxMjE5NQkvKiBCMSBzZWN1cml0eSBmcyAqLworI2RlZmluZSBVU0JERVZJQ0VfU1VQRVJfTUFHSUMJMHg5ZmEyCisjZGVmaW5lIFZYRlNfU1VQRVJfTUFHSUMJMHhhNTAxRkNGNQorCisjZW5kaWYJCQkJLyogX1NZU19WRlNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvc3lzL3dhaXQuaCBiL3Vzci9pbmNsdWRlL3N5cy93YWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZWZhZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5cy93YWl0LmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIHN5cy93YWl0LmgKKyAqLworCisjaWZuZGVmIF9TWVNfV0FJVF9ICisjZGVmaW5lIF9TWVNfV0FJVF9ICisKKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2RlZmluZSBXRVhJVFNUQVRVUyhzKQkoKChzKSAmIDB4ZmYwMCkgPj4gOCkKKyNkZWZpbmUgV1RFUk1TSUcocykJKChzKSAmIDB4N2YpCisjZGVmaW5lIFdJRkVYSVRFRChzKQkoV1RFUk1TSUcocykgPT0gMCkKKyNkZWZpbmUgV0lGU1RPUFBFRChzKQkoV1RFUk1TSUcocykgPT0gMHg3ZikKKy8qIFVnbHkgaGFjayB0byBhdm9pZCBtdWx0aXBsZSBldmFsdWF0aW9uIG9mICJzIiAqLworI2RlZmluZSBXSUZTSUdOQUxFRChzKQkoV1RFUk1TSUcoKHMpKzEpID49IDIpCisjZGVmaW5lIFdDT1JFRFVNUChzKQkoKHMpICYgMHg4MCkKKyNkZWZpbmUgV1NUT1BTSUcocykJV0VYSVRTVEFUVVMocykKKworX19leHRlcm4gcGlkX3Qgd2FpdChpbnQgKik7CitfX2V4dGVybiBwaWRfdCB3YWl0cGlkKHBpZF90LCBpbnQgKiwgaW50KTsKK19fZXh0ZXJuIHBpZF90IHdhaXQzKGludCAqLCBpbnQsIHN0cnVjdCBydXNhZ2UgKik7CitfX2V4dGVybiBwaWRfdCB3YWl0NChwaWRfdCwgaW50ICosIGludCwgc3RydWN0IHJ1c2FnZSAqKTsKKworI2VuZGlmCQkJCS8qIF9TWVNfV0FJVF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS9zeXNleGl0cy5oIGIvdXNyL2luY2x1ZGUvc3lzZXhpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ1NGI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvc3lzZXhpdHMuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmCV9TWVNFWElUU19ICisjZGVmaW5lCV9TWVNFWElUU19ICisKKyNkZWZpbmUgRVhfT0sJCTAJLyogc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiAqLworCisjZGVmaW5lIEVYX19CQVNFCTY0CS8qIGJhc2UgdmFsdWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgRVhfVVNBR0UJNjQJLyogY29tbWFuZCBsaW5lIHVzYWdlIGVycm9yICovCisjZGVmaW5lIEVYX0RBVEFFUlIJNjUJLyogZGF0YSBmb3JtYXQgZXJyb3IgKi8KKyNkZWZpbmUgRVhfTk9JTlBVVAk2NgkvKiBjYW5ub3Qgb3BlbiBpbnB1dCAqLworI2RlZmluZSBFWF9OT1VTRVIJNjcJLyogYWRkcmVzc2VlIHVua25vd24gKi8KKyNkZWZpbmUgRVhfTk9IT1NUCTY4CS8qIGhvc3QgbmFtZSB1bmtub3duICovCisjZGVmaW5lIEVYX1VOQVZBSUxBQkxFCTY5CS8qIHNlcnZpY2UgdW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgRVhfU09GVFdBUkUJNzAJLyogaW50ZXJuYWwgc29mdHdhcmUgZXJyb3IgKi8KKyNkZWZpbmUgRVhfT1NFUlIJNzEJLyogc3lzdGVtIGVycm9yIChlLmcuLCBjYW4ndCBmb3JrKSAqLworI2RlZmluZSBFWF9PU0ZJTEUJNzIJLyogY3JpdGljYWwgT1MgZmlsZSBtaXNzaW5nICovCisjZGVmaW5lIEVYX0NBTlRDUkVBVAk3MwkvKiBjYW4ndCBjcmVhdGUgKHVzZXIpIG91dHB1dCBmaWxlICovCisjZGVmaW5lIEVYX0lPRVJSCTc0CS8qIGlucHV0L291dHB1dCBlcnJvciAqLworI2RlZmluZSBFWF9URU1QRkFJTAk3NQkvKiB0ZW1wIGZhaWx1cmU7IHVzZXIgaXMgaW52aXRlZCB0byByZXRyeSAqLworI2RlZmluZSBFWF9QUk9UT0NPTAk3NgkvKiByZW1vdGUgZXJyb3IgaW4gcHJvdG9jb2wgKi8KKyNkZWZpbmUgRVhfTk9QRVJNCTc3CS8qIHBlcm1pc3Npb24gZGVuaWVkICovCisjZGVmaW5lIEVYX0NPTkZJRwk3OAkvKiBjb25maWd1cmF0aW9uIGVycm9yICovCisKKyNkZWZpbmUgRVhfX01BWAk3OAkvKiBtYXhpbXVtIGxpc3RlZCB2YWx1ZSAqLworCisjZW5kaWYgLyogX1NZU0VYSVRTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3N5c2xvZy5oIGIvdXNyL2luY2x1ZGUvc3lzbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhMTdlMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3N5c2xvZy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBzeXNsb2cuaAorICovCisKKyNpZm5kZWYgX1NZU0xPR19ICisjZGVmaW5lIF9TWVNMT0dfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxrbGliYy9leHRlcm4uaD4KKworLyogQWxlcnQgbGV2ZWxzICovCisjZGVmaW5lIExPR19FTUVSRwkwCisjZGVmaW5lIExPR19BTEVSVAkxCisjZGVmaW5lIExPR19DUklUCTIKKyNkZWZpbmUgTE9HX0VSUgkJMworI2RlZmluZSBMT0dfV0FSTklORwk0CisjZGVmaW5lIExPR19OT1RJQ0UJNQorI2RlZmluZSBMT0dfSU5GTwk2CisjZGVmaW5lIExPR19ERUJVRwk3CisKKyNkZWZpbmUgTE9HX1BSSU1BU0sJNworI2RlZmluZSBMT0dfUFJJKHgpCSgoeCkgJiBMT0dfUFJJTUFTSykKKworLyogRmFjaWxpdGllczsgbm90IGFjdHVhbGx5IHVzZWQgKi8KKyNkZWZpbmUgTE9HX0tFUk4JMDAwMAorI2RlZmluZSBMT0dfVVNFUgkwMDEwCisjZGVmaW5lIExPR19NQUlMCTAwMjAKKyNkZWZpbmUgTE9HX0RBRU1PTgkwMDMwCisjZGVmaW5lIExPR19BVVRICTAwNDAKKyNkZWZpbmUgTE9HX1NZU0xPRwkwMDUwCisjZGVmaW5lIExPR19MUFIJCTAwNjAKKyNkZWZpbmUgTE9HX05FV1MJMDA3MAorI2RlZmluZSBMT0dfVVVDUAkwMTAwCisjZGVmaW5lIExPR19DUk9OCTAxMTAKKyNkZWZpbmUgTE9HX0FVVEhQUklWCTAxMjAKKyNkZWZpbmUgTE9HX0ZUUAkJMDEzMAorI2RlZmluZSBMT0dfTE9DQUwwCTAyMDAKKyNkZWZpbmUgTE9HX0xPQ0FMMQkwMjEwCisjZGVmaW5lIExPR19MT0NBTDIJMDIyMAorI2RlZmluZSBMT0dfTE9DQUwzCTAyMzAKKyNkZWZpbmUgTE9HX0xPQ0FMNAkwMjQwCisjZGVmaW5lIExPR19MT0NBTDUJMDI1MAorI2RlZmluZSBMT0dfTE9DQUw2CTAyNjAKKyNkZWZpbmUgTE9HX0xPQ0FMNwkwMjcwCisKKyNkZWZpbmUgTE9HX0ZBQ01BU0sJMDE3NzAKKyNkZWZpbmUgTE9HX0ZBQyh4KQkoKCh4KSA+PiAzKSAmIChMT0dfRkFDTUFTSyA+PiAzKSkKKworLyogb3BlbmxvZygpIGZsYWdzOyBvbmx5IExPR19QSUQgYW5kIExPR19QRVJST1Igc3VwcG9ydGVkICovCisjZGVmaW5lICAgICAgICBMT0dfUElEICAgICAgICAgMHgwMQkvKiBpbmNsdWRlIHBpZCB3aXRoIG1lc3NhZ2UgKi8KKyNkZWZpbmUgICAgICAgIExPR19DT05TICAgICAgICAweDAyCS8qIHdyaXRlIHRvIGNvbnNvbGUgb24gbG9nZ2VyIGVycm9yICovCisjZGVmaW5lICAgICAgICBMT0dfT0RFTEFZICAgICAgMHgwNAkvKiBkZWxheSBjb25uZWN0aW9uIHVudGlsIHN5c2xvZygpICovCisjZGVmaW5lICAgICAgICBMT0dfTkRFTEFZICAgICAgMHgwOAkvKiBvcGVuIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUgICAgICAgIExPR19OT1dBSVQgICAgICAweDEwCS8qIHdhaXQgZm9yIGNoaWxkIHByb2Nlc3NlcyAodW51c2VkIG9uIGxpbnV4KSAqLworI2RlZmluZSAgICAgICAgTE9HX1BFUlJPUiAgICAgIDB4MjAJLyogYWRkaXRpb25hbCBsb2dnaW5nIHRvIHN0ZGVyciAqLworCitfX2V4dGVybiB2b2lkIG9wZW5sb2coY29uc3QgY2hhciAqLCBpbnQsIGludCk7CitfX2V4dGVybiB2b2lkIHN5c2xvZyhpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKTsKK19fZXh0ZXJuIHZvaWQgdnN5c2xvZyhpbnQsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitfX2V4dGVybiB2b2lkIGNsb3NlbG9nKHZvaWQpOworCisjZW5kaWYJCQkJLyogX1NZU0xPR19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS90ZXJtaW9zLmggYi91c3IvaW5jbHVkZS90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOTg1OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3Rlcm1pb3MuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogdGVybWlvcy5oCisgKi8KKworI2lmbmRlZiBfVEVSTUlPU19ICisjZGVmaW5lIF9URVJNSU9TX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Rlcm1pb3MuaD4KKworLyogUmVkZWZpbmUgdGhlc2Ugc28gdGhlIG1hZ2ljIGNvbnN0YW50cyA9PSB0aGUgaW9jdGwgbnVtYmVyIHRvIHVzZS4gKi8KKyN1bmRlZiBUQ1NBTk9XCisjdW5kZWYgVENTQURSQUlOCisjdW5kZWYgVENTQUZMVVNICisjZGVmaW5lIFRDU0FOT1cJICAgVENTRVRTCisjZGVmaW5lIFRDU0FEUkFJTiAgVENTRVRTVworI2RlZmluZSBUQ1NBRkxVU0ggIFRDU0VUU0YKKworc3RhdGljIF9faW5saW5lX18gaW50IHRjZ2V0YXR0cihpbnQgX19mZCwgc3RydWN0IHRlcm1pb3MgKl9fcykKK3sKKwlyZXR1cm4gaW9jdGwoX19mZCwgVENHRVRTLCBfX3MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNzZXRhdHRyKGludCBfX2ZkLCBpbnQgX19vcHQsIGNvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3MpCit7CisJcmV0dXJuIGlvY3RsKF9fZmQsIF9fb3B0LCAodm9pZCAqKV9fcyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB0Y2Zsb3coaW50IF9fZmQsIGludCBfX2FjdGlvbikKK3sKKwlyZXR1cm4gaW9jdGwoX19mZCwgVENYT05DLCAodm9pZCAqKShpbnRwdHJfdCkgX19hY3Rpb24pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNmbHVzaChpbnQgX19mZCwgaW50IF9fcXVldWUpCit7CisJcmV0dXJuIGlvY3RsKF9fZmQsIFRDRkxTSCwgKHZvaWQgKikoaW50cHRyX3QpIF9fcXVldWUpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNkcmFpbihpbnQgX19mZCkKK3sKKwlyZXR1cm4gaW9jdGwoX19mZCwgVENTQlJLLCAodm9pZCAqKTFMKTsKK30KKworc3RhdGljIF9faW5saW5lX18gcGlkX3QgdGNnZXRwZ3JwKGludCBfX2ZkKQoreworCXBpZF90IF9fcDsKKwlyZXR1cm4gaW9jdGwoX19mZCwgVElPQ0dQR1JQLCAmX19wKSA/IChwaWRfdCkgLSAxIDogX19wOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBwaWRfdCB0Y2dldHNpZChpbnQgX19mZCkKK3sKKwlwaWRfdCBfX3A7CisJcmV0dXJuIGlvY3RsKF9fZmQsIFRJT0NHU0lELCAmX19wKSA/IChwaWRfdCkgLSAxIDogX19wOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNzZW5kYnJlYWsoaW50IF9fZmQsIGludCBfX2R1cmF0aW9uKQoreworCXJldHVybiBpb2N0bChfX2ZkLCBUQ1NCUktQLCAodm9pZCAqKSh1aW50cHRyX3QpIF9fZHVyYXRpb24pOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNzZXRwZ3JwKGludCBfX2ZkLCBwaWRfdCBfX3ApCit7CisJcmV0dXJuIGlvY3RsKF9fZmQsIFRJT0NTUEdSUCwgJl9fcCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHNwZWVkX3QgY2ZnZXRvc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKl9fcykKK3sKKwlyZXR1cm4gKHNwZWVkX3QpIChfX3MtPmNfY2ZsYWcgJiBDQkFVRCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHNwZWVkX3QgY2ZnZXRpc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKl9fcykKK3sKKwlyZXR1cm4gKHNwZWVkX3QpIChfX3MtPmNfY2ZsYWcgJiBDQkFVRCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBjZnNldG9zcGVlZChzdHJ1Y3QgdGVybWlvcyAqX19zLCBzcGVlZF90IF9fdikKK3sKKwlfX3MtPmNfY2ZsYWcgPSAoX19zLT5jX2NmbGFnICYgfkNCQVVEKSB8IChfX3YgJiBDQkFVRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBjZnNldGlzcGVlZChzdHJ1Y3QgdGVybWlvcyAqX19zLCBzcGVlZF90IF9fdikKK3sKKwlfX3MtPmNfY2ZsYWcgPSAoX19zLT5jX2NmbGFnICYgfkNCQVVEKSB8IChfX3YgJiBDQkFVRCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkJCQkvKiBfVEVSTUlPU19IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS90aW1lLmggYi91c3IvaW5jbHVkZS90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiMjk5MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9pbmNsdWRlL3RpbWUuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogdGltZS5oCisgKi8KKworI2lmbmRlZiBfVElNRV9ICisjZGVmaW5lIF9USU1FX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK19fZXh0ZXJuIHRpbWVfdCB0aW1lKHRpbWVfdCAqKTsKK19fZXh0ZXJuIGludCBuYW5vc2xlZXAoY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIHN0cnVjdCB0aW1lc3BlYyAqKTsKKworLyoga2xpYmMtc3BlY2lmaWMgYnV0IHVzZWZ1bCBzaW5jZSB3ZSBkb24ndCBoYXZlIGZsb2F0aW5nIHBvaW50ICovCitfX2V4dGVybiBjaGFyICpzdHJ0b3RpbWV2YWwoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgdGltZXZhbCAqdHYpOworX19leHRlcm4gY2hhciAqc3RydG90aW1lc3BlYyhjb25zdCBjaGFyICpzdHIsIHN0cnVjdCB0aW1lc3BlYyAqdHYpOworCisjZW5kaWYJCQkJLyogX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luY2x1ZGUvdW5pc3RkLmggYi91c3IvaW5jbHVkZS91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGZiZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvdW5pc3RkLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiB1bmlzdGQuaAorICovCisKKyNpZm5kZWYgX1VOSVNURF9ICisjZGVmaW5lIF9VTklTVERfSAorCisjaW5jbHVkZSA8a2xpYmMvZXh0ZXJuLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKK19fZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworX19leHRlcm4gX19ub3JldHVybiBfZXhpdChpbnQpOworCitfX2V4dGVybiBwaWRfdCBmb3JrKHZvaWQpOworX19leHRlcm4gcGlkX3QgdmZvcmsodm9pZCk7CitfX2V4dGVybiBwaWRfdCBnZXRwaWQodm9pZCk7CitfX2V4dGVybiBwaWRfdCBnZXRwZ2lkKHBpZF90KTsKK19fZXh0ZXJuIGludCBzZXRwZ2lkKHBpZF90LCBwaWRfdCk7CitfX2V4dGVybiBwaWRfdCBnZXRwcGlkKHZvaWQpOworX19leHRlcm4gcGlkX3QgZ2V0cGdycCh2b2lkKTsKK19fZXh0ZXJuIGludCBzZXRwZ3JwKHZvaWQpOworX19leHRlcm4gcGlkX3Qgc2V0c2lkKHZvaWQpOworX19leHRlcm4gcGlkX3QgZ2V0c2lkKHBpZF90KTsKK19fZXh0ZXJuIGludCBleGVjdihjb25zdCBjaGFyICosIGNoYXIgKmNvbnN0ICopOworX19leHRlcm4gaW50IGV4ZWN2cChjb25zdCBjaGFyICosIGNoYXIgKmNvbnN0ICopOworX19leHRlcm4gaW50IGV4ZWN2ZShjb25zdCBjaGFyICosIGNoYXIgKmNvbnN0ICosIGNoYXIgKmNvbnN0ICopOworX19leHRlcm4gaW50IGV4ZWN2cGUoY29uc3QgY2hhciAqLCBjaGFyICpjb25zdCAqLCBjaGFyICpjb25zdCAqKTsKK19fZXh0ZXJuIGludCBleGVjbChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK19fZXh0ZXJuIGludCBleGVjbHAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CitfX2V4dGVybiBpbnQgZXhlY2xlKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworX19leHRlcm4gaW50IGV4ZWNscGUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CisKK19fZXh0ZXJuIGludCBzZXR1aWQodWlkX3QpOworX19leHRlcm4gdWlkX3QgZ2V0dWlkKHZvaWQpOworX19leHRlcm4gaW50IHNldGV1aWQodWlkX3QpOworX19leHRlcm4gdWlkX3QgZ2V0ZXVpZCh2b2lkKTsKK19fZXh0ZXJuIGludCBzZXRnaWQoZ2lkX3QpOworX19leHRlcm4gZ2lkX3QgZ2V0Z2lkKHZvaWQpOworX19leHRlcm4gaW50IHNldGVnaWQoZ2lkX3QpOworX19leHRlcm4gZ2lkX3QgZ2V0ZWdpZCh2b2lkKTsKK19fZXh0ZXJuIGludCBnZXRncm91cHMoaW50LCBnaWRfdCAqKTsKK19fZXh0ZXJuIGludCBzZXRncm91cHMoc2l6ZV90LCBjb25zdCBnaWRfdCAqKTsKK19fZXh0ZXJuIGludCBzZXRyZXVpZCh1aWRfdCwgdWlkX3QpOworX19leHRlcm4gaW50IHNldHJlZ2lkKGdpZF90LCBnaWRfdCk7CitfX2V4dGVybiBpbnQgc2V0cmVzdWlkKHVpZF90LCB1aWRfdCwgdWlkX3QpOworX19leHRlcm4gaW50IHNldHJlc2dpZChnaWRfdCwgZ2lkX3QsIGdpZF90KTsKK19fZXh0ZXJuIGludCBnZXRmc3VpZCh1aWRfdCk7CitfX2V4dGVybiBpbnQgc2V0ZnN1aWQodWlkX3QpOworCisvKiBNYWNyb3MgZm9yIGFjY2VzcygpICovCisjZGVmaW5lIFJfT0sJNAkJLyogUmVhZCAqLworI2RlZmluZSBXX09LCTIJCS8qIFdyaXRlICovCisjZGVmaW5lIFhfT0sJMQkJLyogRXhlY3V0ZSAqLworI2RlZmluZSBGX09LCTAJCS8qIEV4aXN0ZW5jZSAqLworCitfX2V4dGVybiBpbnQgYWNjZXNzKGNvbnN0IGNoYXIgKiwgaW50KTsKK19fZXh0ZXJuIGludCBmYWNjZXNzYXQoaW50LCBjb25zdCBjaGFyICosIGludCk7CitfX2V4dGVybiBpbnQgbGluayhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgbGlua2F0KGludCwgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgdW5saW5rKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgdW5saW5rYXQoaW50LCBjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IGNoZGlyKGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBpbnQgZmNoZGlyKGludCk7CitfX2V4dGVybiBpbnQgY2htb2QoY29uc3QgY2hhciAqLCBtb2RlX3QpOworX19leHRlcm4gaW50IGZjaG1vZChpbnQsIG1vZGVfdCk7CitfX2V4dGVybiBpbnQgZmNobW9kYXQoaW50LCBjb25zdCBjaGFyICosIG1vZGVfdCk7CitfX2V4dGVybiBpbnQgbWtkaXIoY29uc3QgY2hhciAqLCBtb2RlX3QpOworX19leHRlcm4gaW50IG1rZGlyYXQoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKK19fZXh0ZXJuIGludCBybWRpcihjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IHBpcGUoaW50ICopOworX19leHRlcm4gaW50IGNocm9vdChjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IHN5bWxpbmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworX19leHRlcm4gaW50IHN5bWxpbmthdChpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK19fZXh0ZXJuIGludCByZWFkbGluayhjb25zdCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGludCByZWFkbGlua2F0KGludCwgY29uc3QgY2hhciAqLCBjaGFyICosIHNpemVfdCk7CitfX2V4dGVybiBpbnQgY2hvd24oY29uc3QgY2hhciAqLCB1aWRfdCwgZ2lkX3QpOworX19leHRlcm4gaW50IGZjaG93bihpbnQsIHVpZF90LCBnaWRfdCk7CitfX2V4dGVybiBpbnQgbGNob3duKGNvbnN0IGNoYXIgKiwgdWlkX3QsIGdpZF90KTsKK19fZXh0ZXJuIGNoYXIgKmdldGN3ZChjaGFyICosIHNpemVfdCk7CisKKy8qIEFsc28gaW4gPGZjbnRsLmg+ICovCisjaWZuZGVmIF9LTElCQ19JTl9PUEVOX0MKK19fZXh0ZXJuIGludCBvcGVuKGNvbnN0IGNoYXIgKiwgaW50LCAuLi4pOworX19leHRlcm4gaW50IG9wZW5hdChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCAuLi4pOworI2VuZGlmCitfX2V4dGVybiBpbnQgY3JlYXQoY29uc3QgY2hhciAqLCBtb2RlX3QpOworX19leHRlcm4gaW50IG9wZW5fY2xvZXhlYyhjb25zdCBjaGFyICosIGludCwgbW9kZV90KTsKK19fZXh0ZXJuIGludCBjbG9zZShpbnQpOworX19leHRlcm4gb2ZmX3QgbHNlZWsoaW50LCBvZmZfdCwgaW50KTsKKy8qIG9mZl90IGlzIDY0IGJpdHMgbm93IGV2ZW4gb24gMzItYml0IHBsYXRmb3Jtczsgc2VlIGxsc2Vlay5jICovCitzdGF0aWMgX19pbmxpbmVfXyBvZmZfdCBsbHNlZWsoaW50IF9fZiwgb2ZmX3QgX19vLCBpbnQgX193KQoreworCXJldHVybiBsc2VlayhfX2YsIF9fbywgX193KTsKK30KKworX19leHRlcm4gc3NpemVfdCByZWFkKGludCwgdm9pZCAqLCBzaXplX3QpOworX19leHRlcm4gc3NpemVfdCB3cml0ZShpbnQsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIHNzaXplX3QgcHJlYWQoaW50LCB2b2lkICosIHNpemVfdCwgb2ZmX3QpOworX19leHRlcm4gc3NpemVfdCBwd3JpdGUoaW50LCBjb25zdCB2b2lkICosIHNpemVfdCwgb2ZmX3QpOworCitfX2V4dGVybiBpbnQgZHVwKGludCk7CitfX2V4dGVybiBpbnQgZHVwMihpbnQsIGludCk7CitfX2V4dGVybiBpbnQgZmNudGwoaW50LCBpbnQsIC4uLik7CitfX2V4dGVybiBpbnQgaW9jdGwoaW50LCBpbnQsIHZvaWQgKik7CitfX2V4dGVybiBpbnQgZmxvY2soaW50LCBpbnQpOworX19leHRlcm4gaW50IGZ0cnVuY2F0ZShpbnQsIG9mZl90KTsKKworLyoKKyAqIE1hY3JvcyBmb3Igc3luY19maWxlX3JhbmdlKCkKKyAqLworI2RlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV0FJVF9CRUZPUkUgICAgIDEKKyNkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dSSVRFICAgICAgICAgICAyCisjZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSICAgICAgNAorCitfX2V4dGVybiBpbnQgc3luYyh2b2lkKTsKK19fZXh0ZXJuIGludCBmc3luYyhpbnQpOworX19leHRlcm4gaW50IGZkYXRhc3luYyhpbnQpOworX19leHRlcm4gaW50IHN5bmNfZmlsZV9yYW5nZShpbnQsIG9mZl90LCBvZmZfdCwgdW5zaWduZWQgaW50KTsKKworX19leHRlcm4gaW50IHBhdXNlKHZvaWQpOworX19leHRlcm4gdW5zaWduZWQgaW50IGFsYXJtKHVuc2lnbmVkIGludCk7CitfX2V4dGVybiB1bnNpZ25lZCBpbnQgc2xlZXAodW5zaWduZWQgaW50KTsKK19fZXh0ZXJuIHZvaWQgdXNsZWVwKHVuc2lnbmVkIGxvbmcpOworCitfX2V4dGVybiBpbnQgZ2V0aG9zdG5hbWUoY2hhciAqLCBzaXplX3QpOworX19leHRlcm4gaW50IHNldGhvc3RuYW1lKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGludCBnZXRkb21haW5uYW1lKGNoYXIgKiwgc2l6ZV90KTsKK19fZXh0ZXJuIGludCBzZXRkb21haW5uYW1lKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKKworX19leHRlcm4gdm9pZCAqX19icmsodm9pZCAqKTsKK19fZXh0ZXJuIGludCBicmsodm9pZCAqKTsKK19fZXh0ZXJuIHZvaWQgKnNicmsocHRyZGlmZl90KTsKKworX19leHRlcm4gaW50IGdldG9wdChpbnQsIGNoYXIgKmNvbnN0ICosIGNvbnN0IGNoYXIgKik7CitfX2V4dGVybiBjaGFyICpvcHRhcmc7CitfX2V4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKKworX19leHRlcm4gaW50IGlzYXR0eShpbnQpOworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZ2V0cGFnZXNpemUodm9pZCkKK3sKKwlleHRlcm4gdW5zaWduZWQgaW50IF9fcGFnZV9zaXplOworCXJldHVybiBfX3BhZ2Vfc2l6ZTsKK30KK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2dldHBhZ2VzaGlmdCh2b2lkKQoreworCWV4dGVybiB1bnNpZ25lZCBpbnQgX19wYWdlX3NoaWZ0OworCXJldHVybiBfX3BhZ2Vfc2hpZnQ7Cit9CisKK19fZXh0ZXJuIGludCBkYWVtb24oaW50LCBpbnQpOworCisvKiBTdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3IgbnVtYmVycy4gKi8KKyNkZWZpbmUgU1RESU5fRklMRU5PCTAKKyNkZWZpbmUgU1RET1VUX0ZJTEVOTwkxCisjZGVmaW5lIFNUREVSUl9GSUxFTk8JMgorCisjZW5kaWYJCQkJLyogX1VOSVNURF9IICovCmRpZmYgLS1naXQgYS91c3IvaW5jbHVkZS91dGltZS5oIGIvdXNyL2luY2x1ZGUvdXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAwNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvdXRpbWUuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogdXRpbWUuaAorICovCisKKyNpZm5kZWYgX1VUSU1FX0gKKyNkZWZpbmUgX1VUSU1FX0gKKworI2luY2x1ZGUgPGtsaWJjL2V4dGVybi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3V0aW1lLmg+CisKK19fZXh0ZXJuIGludCB1dGltZShjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCB1dGltYnVmICopOworCisjZW5kaWYJCQkJLyogX1VUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3pjb25mLmggYi91c3IvaW5jbHVkZS96Y29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTMyNGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5jbHVkZS96Y29uZi5oCkBAIC0wLDAgKzEsMzMyIEBACisvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZDogemNvbmYuaCx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjaWZuZGVmIFpDT05GX0gKKyNkZWZpbmUgWkNPTkZfSAorCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKi8KKyNpZmRlZiBaX1BSRUZJWAorIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBkZWZsYXRlSW5pdDJfICAgICAgICAgel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgICAgICAgICAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCisjICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKKyMgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgorIyAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBkZWZpbmUgYWRsZXIzMiAgICAgICAgICAgICAgIHpfYWRsZXIzMgorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQorIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgorCisjICBkZWZpbmUgYWxsb2NfZnVuYyAgICAgICAgICAgIHpfYWxsb2NfZnVuYworIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgZGVmaW5lIGluX2Z1bmMgICAgICAgICAgICAgICB6X2luX2Z1bmMKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSB1SW50ICAgICAgICAgICAgICAgICAgel91SW50CisjICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGNoYXJmICAgICAgICAgICAgICAgICB6X2NoYXJmCisjICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCisjICBkZWZpbmUgT1MyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQorIyAgZGVmaW5lIFdJTkRPV1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZuZGVmIFdJTjMyCisjICAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCisjICAgIGlmbmRlZiBTWVMxNkJJVAorIyAgICAgIGRlZmluZSBTWVMxNkJJVAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX1ZFUlNJT05fXworIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZm5kZWYgU1REQworIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogU29tZSBNYWMgY29tcGlsZXJzIG1lcmdlIGFsbCAuaCBmaWxlcyBpbmNvcnJlY3RseTogKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pfHxkZWZpbmVkKGFwcGxlYyl8fGRlZmluZWQoVEhJTktfQyl8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKKyAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9NU0NfVkVSCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKKyAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCisgICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQorIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvKiBaTElCX0RMTCAqLworICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCisgICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCisgICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9XSU5BUEkKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCisgICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCisjICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworI2lmIDAgICAgICAgICAgIC8qIEhBVkVfVU5JU1REX0ggLS0gdGhpcyBsaW5lIGlzIHVwZGF0ZWQgYnkgLi9jb25maWd1cmUgKi8KKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworIyAgaWZkZWYgVk1TCisjICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKKyMgIGRlZmluZSB6X29mZl90IG9mZl90CisjZW5kaWYKKyNpZm5kZWYgU0VFS19TRVQKKyMgIGRlZmluZSBTRUVLX1NFVCAgICAgICAgMCAgICAgICAvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyAgZGVmaW5lIFNFRUtfQ1VSICAgICAgICAxICAgICAgIC8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgIGRlZmluZSBTRUVLX0VORCAgICAgICAgMiAgICAgICAvKiBTZXQgZmlsZSBwb2ludGVyIHRvIEVPRiBwbHVzICJvZmZzZXQiICovCisjZW5kaWYKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT1M0MDBfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01WU19fKQorIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgaWZkZWYgRkFSCisjICAgIHVuZGVmIEZBUgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNVlMgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZXh0ZXJuYWwgbmFtZXMgbGFyZ2VyIHRoYW4gOCBieXRlcyAqLworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlRW5kLCJERUVORCIpCisjICAgcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdDJfLCJJTklOMiIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlU2V0RGljdGlvbmFyeSwiSU5TRURJIikKKyMgICBwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKworI2VuZGlmIC8qIFpDT05GX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9pbmNsdWRlL3psaWIuaCBiL3Vzci9pbmNsdWRlL3psaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjI4MTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2luY2x1ZGUvemxpYi5oCkBAIC0wLDAgKzEsMTM1NyBAQAorLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgIHZlcnNpb24gMS4yLjMsIEp1bHkgMTh0aCwgMjAwNQorCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgorICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dAorICAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgorKi8KKworI2lmbmRlZiBaTElCX0gKKyNkZWZpbmUgWkxJQl9ICisKKyNpbmNsdWRlICJ6Y29uZi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuMyIKKyNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjMwCisKKy8qCisgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCisgIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCisgIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQorICBzdHJlYW0gaW50ZXJmYWNlLgorCisgICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCisgIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKKyAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKyAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorCisgICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcworICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKKyAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgorCisgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0CisgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKKyAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgorCisgICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCisKKyAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CisgIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KKyAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCisgIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgorCisgICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKKyAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgorICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorKi8KKwordHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7Cit0eXBlZGVmIHZvaWQgICAoKmZyZWVfZnVuYykgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgYWRkcmVzcykpOworCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgeworICAgIEJ5dGVmICAgICpuZXh0X2luOyAgLyogbmV4dCBpbnB1dCBieXRlICovCisgICAgdUludCAgICAgYXZhaWxfaW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KKyAgICB1TG9uZyAgICB0b3RhbF9pbjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCisKKyAgICBCeXRlZiAgICAqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLworICAgIHVJbnQgICAgIGF2YWlsX291dDsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgbmV4dF9vdXQgKi8KKyAgICB1TG9uZyAgICB0b3RhbF9vdXQ7IC8qIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KKworICAgIGNoYXIgICAgICptc2c7ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCisgICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLworCisgICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworICAgIHZvaWRwZiAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLworCisgICAgaW50ICAgICBkYXRhX3R5cGU7ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovCisgICAgdUxvbmcgICBhZGxlcjsgICAgICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLworICAgIHVMb25nICAgcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KK30gel9zdHJlYW07CisKK3R5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7CisKKy8qCisgICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCisgIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KKyovCit0eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7CisgICAgaW50ICAgICB0ZXh0OyAgICAgICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCisgICAgdUxvbmcgICB0aW1lOyAgICAgICAvKiBtb2RpZmljYXRpb24gdGltZSAqLworICAgIGludCAgICAgeGZsYWdzOyAgICAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KKyAgICBpbnQgICAgIG9zOyAgICAgICAgIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi8KKyAgICBCeXRlZiAgICpleHRyYTsgICAgIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi8KKyAgICB1SW50ICAgIGV4dHJhX2xlbjsgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLworICAgIHVJbnQgICAgZXh0cmFfbWF4OyAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBCeXRlZiAgICpuYW1lOyAgICAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KKyAgICB1SW50ICAgIG5hbWVfbWF4OyAgIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBCeXRlZiAgICpjb21tZW50OyAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovCisgICAgdUludCAgICBjb21tX21heDsgICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgaW50ICAgICBoY3JjOyAgICAgICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqLworICAgIGludCAgICAgZG9uZTsgICAgICAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KK30gZ3pfaGVhZGVyOworCit0eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7CisKKy8qCisgICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMKKyAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dAorICAgaGFzIGRyb3BwZWQgdG8gemVyby4gVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGl6ZSB6YWxsb2MsIHpmcmVlIGFuZAorICAgb3BhcXVlIGJlZm9yZSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLiBBbGwgb3RoZXIgZmllbGRzIGFyZSBzZXQgYnkgdGhlCisgICBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBtdXN0IG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworICAgVGhlIG9wYXF1ZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0CisgICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIHphbGxvYyBhbmQgemZyZWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCisgICBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKKyAgIG9wYXF1ZSB2YWx1ZS4KKworICAgemFsbG9jIG11c3QgcmV0dXJuIFpfTlVMTCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIG9iamVjdC4KKyAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUKKyAgIHRocmVhZCBzYWZlLgorCisgICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQorICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzCisgICBpZiB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiBXQVJOSU5HOiBPbiBNU0RPUywKKyAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IHphbGxvYyBmb3Igb2JqZWN0cyBvZiBleGFjdGx5IDY1NTM2IGJ5dGVzICptdXN0KgorICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCisgICBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuIFRvIHJlZHVjZSBtZW1vcnkKKyAgIHJlcXVpcmVtZW50cyBhbmQgYXZvaWQgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mCisgICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCisKKyAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgorICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCisgICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKKyAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KKyAgIGEgc2luZ2xlIHN0ZXApLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCisKKyNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKKyNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEgLyogd2lsbCBiZSByZW1vdmVkLCB1c2UgWl9TWU5DX0ZMVVNIIGluc3RlYWQgKi8KKyNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKKyNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKKyNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKKyNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKKy8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX09LICAgICAgICAgICAgMAorI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQorI2RlZmluZSBaX05FRURfRElDVCAgICAgMgorI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCisjZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKKyNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQorI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCisjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKKyNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQorICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCisjZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5CisjZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQorLyogY29tcHJlc3Npb24gbGV2ZWxzICovCisKKyNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKKyNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKKy8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX0JJTkFSWSAgIDAKKyNkZWZpbmUgWl9URVhUICAgICAxCisjZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLworI2RlZmluZSBaX1VOS05PV04gIDIKKy8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KKworI2RlZmluZSBaX0RFRkxBVEVEICAgOAorLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KKworI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCisKKyNkZWZpbmUgemxpYl92ZXJzaW9uIHpsaWJWZXJzaW9uKCkKKy8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgPCAxLjAuMiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbiBPRigodm9pZCkpOworLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgorICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKKyAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgIFRoaXMgY2hlY2sgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KKyAqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCkpOworCisgICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGNvbXByZXNzaW9uLiBUaGUgZmllbGRzCisgICB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KKyAgIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGRlZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgICAgVGhlIGNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBvciBiZXR3ZWVuIDAgYW5kIDk6CisgICAxIGdpdmVzIGJlc3Qgc3BlZWQsIDkgZ2l2ZXMgYmVzdCBjb21wcmVzc2lvbiwgMCBnaXZlcyBubyBjb21wcmVzc2lvbiBhdAorICAgYWxsICh0aGUgaW5wdXQgZGF0YSBpcyBzaW1wbHkgY29waWVkIGEgYmxvY2sgYXQgYSB0aW1lKS4KKyAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZAorICAgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgorCisgICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKKyAgIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMgaW5jb21wYXRpYmxlCisgICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4KKyAgIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQgZG9lcyBub3QKKyAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOworLyoKKyAgICBkZWZsYXRlIGNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlIHNvbWUKKyAgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gZGVmbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgLSBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgorICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGFuZCBhdmFpbF9pbiBhcmUgdXBkYXRlZCBhbmQKKyAgICBwcm9jZXNzaW5nIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgorCisgIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKKyAgICBhY2NvcmRpbmdseS4gVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCisgICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKKyAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuCisgICAgU29tZSBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KKworICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIGF2YWlsX2luIG9yIGF2YWlsX291dCBhY2NvcmRpbmdseTsgYXZhaWxfb3V0CisgIHNob3VsZCBuZXZlciBiZSB6ZXJvIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZQorICBjb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwKKyAgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIGRlZmxhdGUoKS4gSWYgZGVmbGF0ZSByZXR1cm5zIFpfT0sKKyAgYW5kIHdpdGggemVybyBhdmFpbF9vdXQsIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfTk9fRkxVU0gsIHdoaWNoIGFsbG93cyBkZWZsYXRlIHRvCisgIGRlY2lkZSBob3cgbXVjaCBkYXRhIHRvIGFjY3VtdWFsdGUgYmVmb3JlIHByb2R1Y2luZyBvdXRwdXQsIGluIG9yZGVyIHRvCisgIG1heGltaXplIGNvbXByZXNzaW9uLgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKKyAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KKyAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKKyAgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCisgIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgorICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKKyAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KKyAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKKyAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICBjb21wcmVzc2lvbi4KKworICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCisgIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKKyAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybworICBhdmFpbF9vdXQpLiBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0CisgIGF2YWlsX291dCBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCisgIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKKyAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlCisgIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAgY2FsbGVkIGFnYWluIHdpdGggWl9GSU5JU0ggYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIGF2YWlsX291dCkgYnV0IG5vCisgIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvci4gQWZ0ZXIKKyAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQorICBzdHJlYW0gYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgorCisgICAgWl9GSU5JU0ggY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQgaWYgYWxsIHRoZSBjb21wcmVzc2lvbgorICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuIEluIHRoaXMgY2FzZSwgYXZhaWxfb3V0IG11c3QgYmUgYXQgbGVhc3QKKyAgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCAoc2VlIGJlbG93KS4gSWYgZGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4KKyAgWl9TVFJFQU1fRU5ELCB0aGVuIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICAgIGRlZmxhdGUoKSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCisgIHNvIGZhciAodGhhdCBpcywgdG90YWxfaW4gYnl0ZXMpLgorCisgICAgZGVmbGF0ZSgpIG1heSB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIGlmIGl0IGNhbiBtYWtlIGEgZ29vZCBndWVzcyBhYm91dAorICB0aGUgaW5wdXQgZGF0YSB0eXBlIChaX0JJTkFSWSBvciBaX1RFWFQpLiBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAorICBiaW5hcnkuIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdAorICB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCisKKyAgICBkZWZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAorICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgYWxsIGlucHV0IGhhcyBiZWVuCisgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCisgIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKKyAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QKKyAgZmF0YWwsIGFuZCBkZWZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0CisgIHNwYWNlIHRvIGNvbnRpbnVlIGNvbXByZXNzaW5nLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQorICAgcGVuZGluZyBvdXRwdXQuCisKKyAgICAgZGVmbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIGZyZWVkCisgICBwcmVtYXR1cmVseSAoc29tZSBpbnB1dCBvciBvdXRwdXQgd2FzIGRpc2NhcmRlZCkuIEluIHRoZSBlcnJvciBjYXNlLAorICAgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUKKyAgIGRlYWxsb2NhdGVkKS4KKyovCisKKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQorICAgdGhlIGNhbGxlci4gSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAorICAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKKyAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKKyAgIGFjY29yZGluZ2x5OyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgorICAgaW5mbGF0ZS4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGluZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgICAgaW5mbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvcgorICAgbWVzc2FnZS4gaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKKyAgIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQKKyAgIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0IG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVuY2hhbmdlZC4pCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOworLyoKKyAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2UKKyAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgorICBmb3JjZWQgdG8gZmx1c2guCisKKyAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gaW5mbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCisgICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKKyAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZworICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgorCisgIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKKyAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgdW50aWwgdGhlcmUKKyAgICBpcyBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAoc2VlIGJlbG93CisgICAgYWJvdXQgdGhlIGZsdXNoIHBhcmFtZXRlcikuCisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKKyAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgorICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoCisgIGNhbGwgb2YgaW5mbGF0ZSgpLiBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQKKyAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQorICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorCisgICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwKKyAgWl9GSU5JU0gsIG9yIFpfQkxPQ0suIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoCisgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gWl9CTE9DSyByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBzdG9wCisgIGlmIGFuZCB3aGVuIGl0IGdldHMgdG8gdGhlIG5leHQgZGVmbGF0ZSBibG9jayBib3VuZGFyeS4gV2hlbiBkZWNvZGluZyB0aGUKKyAgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLCBpbmZsYXRlKCkKKyAgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybiB3aGVuIGl0IGdldHMgdG8KKyAgdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCisKKyAgICBUaGUgWl9CTE9DSyBvcHRpb24gYXNzaXN0cyBpbiBhcHBlbmRpbmcgdG8gb3IgY29tYmluaW5nIGRlZmxhdGUgc3RyZWFtcy4KKyAgQWxzbyB0byBhc3Npc3QgaW4gdGhpcywgb24gcmV0dXJuIGluZmxhdGUoKSB3aWxsIHNldCBzdHJtLT5kYXRhX3R5cGUgdG8gdGhlCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pbiwgcGx1cyA2NAorICBpZiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBkZWZsYXRlIHN0cmVhbSwKKyAgcGx1cyAxMjggaWYgaW5mbGF0ZSgpIHJldHVybmVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nIGFuIGVuZC1vZi1ibG9jaworICBjb2RlIG9yIGRlY29kaW5nIHRoZSBjb21wbGV0ZSBoZWFkZXIgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCisgIGRlZmxhdGUgc3RyZWFtLiBUaGUgZW5kLW9mLWJsb2NrIHdpbGwgbm90IGJlIGluZGljYXRlZCB1bnRpbCBhbGwgb2YgdGhlCisgIHVuY29tcHJlc3NlZCBkYXRhIGZyb20gdGhhdCBibG9jayBoYXMgYmVlbiB3cml0dGVuIHRvIHN0cm0tPm5leHRfb3V0LiAgVGhlCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBtYXkgaW4gZ2VuZXJhbCBiZSBncmVhdGVyIHRoYW4gc2V2ZW4sIGV4Y2VwdCB3aGVuCisgIGJpdCA3IG9mIGRhdGFfdHlwZSBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyB3aWxsIGJlCisgIGxlc3MgdGhhbiBlaWdodC4KKworICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCisgIGVycm9yLiBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwCisgIChhIHNpbmdsZSBjYWxsIG9mIGluZmxhdGUpLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8KKyAgWl9GSU5JU0guIEluIHRoaXMgY2FzZSBhbGwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQgYW5kIGFsbCBwZW5kaW5nCisgIG91dHB1dCBpcyBmbHVzaGVkOyBhdmFpbF9vdXQgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgdGhlCisgIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4gc2F2ZWQKKyAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0CisgIGJlIGluZmxhdGVFbmQgdG8gZGVhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHVzZSBvZiBaX0ZJTklTSAorICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSBpbmZsYXRlIHRoYXQgYSBmYXN0ZXIgYXBwcm9hY2gKKyAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgaW5mbGF0ZSgpIGNhbGwuCisKKyAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaW5mbGF0ZSgpIGFsd2F5cyBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzCisgIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgYWx3YXlzIHVzZXMgdGhlIGZhc3RlciBhcHByb2FjaCBvbiB0aGUKKyAgZmlyc3QgY2FsbC4gU28gdGhlIG9ubHkgZWZmZWN0IG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorICBpcyBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGluZmxhdGUoKSwgYXMgbm90ZWQgYmVsb3csIG9yIHdoZW4gaXQgcmV0dXJucyBlYXJseQorICBiZWNhdXNlIFpfQkxPQ0sgaXMgdXNlZC4KKworICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhZnRlciB0aGlzIGNhbGwgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQorICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQorICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCisgIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQgc28gZmFyICh0aGF0IGlzLAorICB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZAorICBiZWxvdy4gQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIKKyAgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQKKyAgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KKworICAgIGluZmxhdGUoKSB3aWxsIGRlY29tcHJlc3MgYW5kIGNoZWNrIGVpdGhlciB6bGliLXdyYXBwZWQgb3IgZ3ppcC13cmFwcGVkCisgIGRlZmxhdGUgZGF0YS4gIFRoZSBoZWFkZXIgdHlwZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LiAgQW55IGluZm9ybWF0aW9uCisgIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcCBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQKKyAgaW5mb3JtYXRpb24gc2hvdWxkIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yCisgIGluZmxhdGVCYWNrKCkgYW5kIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZAorICB0cmFpbGVyLgorCisgICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCisgIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKKyAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQorICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcworICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCisgIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSwKKyAgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAorICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCisgIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCisgIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsIHJlY292ZXJ5CisgIG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CisgICBwZW5kaW5nIG91dHB1dC4KKworICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCisgICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKKyAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCisgICBmaWVsZHMgbmV4dF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLgorCisgICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQorICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgorICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgorICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBkZWZsYXRlKCkgd2lsbCB0aGVuIGdlbmVyYXRlIHJhdyBkZWZsYXRlIGRhdGEKKyAgIHdpdGggbm8gemxpYiBoZWFkZXIgb3IgdHJhaWxlciwgYW5kIHdpbGwgbm90IGNvbXB1dGUgYW4gYWRsZXIzMiBjaGVjayB2YWx1ZS4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBlbmNvZGluZy4gQWRkCisgICAxNiB0byB3aW5kb3dCaXRzIHRvIHdyaXRlIGEgc2ltcGxlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGFyb3VuZCB0aGUKKyAgIGNvbXByZXNzZWQgZGF0YSBpbnN0ZWFkIG9mIGEgemxpYiB3cmFwcGVyLiBUaGUgZ3ppcCBoZWFkZXIgd2lsbCBoYXZlIG5vCisgICBmaWxlIG5hbWUsIG5vIGV4dHJhIGRhdGEsIG5vIGNvbW1lbnQsIG5vIG1vZGlmaWNhdGlvbiB0aW1lIChzZXQgdG8gemVybyksCisgICBubyBoZWFkZXIgY3JjLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBiZSBzZXQgdG8gMjU1ICh1bmtub3duKS4gIElmIGEKKyAgIGd6aXAgc3RyZWFtIGlzIGJlaW5nIHdyaXR0ZW4sIHN0cm0tPmFkbGVyIGlzIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorCisgICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCisgICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0CisgICBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKKyAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5CisgICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgorCisgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uIFVzZSB0aGUKKyAgIHZhbHVlIFpfREVGQVVMVF9TVFJBVEVHWSBmb3Igbm9ybWFsIGRhdGEsIFpfRklMVEVSRUQgZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQorICAgZmlsdGVyIChvciBwcmVkaWN0b3IpLCBaX0hVRkZNQU5fT05MWSB0byBmb3JjZSBIdWZmbWFuIGVuY29kaW5nIG9ubHkgKG5vCisgICBzdHJpbmcgbWF0Y2gpLCBvciBaX1JMRSB0byBsaW1pdCBtYXRjaCBkaXN0YW5jZXMgdG8gb25lIChydW4tbGVuZ3RoCisgICBlbmNvZGluZykuIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKKyAgIHJhbmRvbSBkaXN0cmlidXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcyB0dW5lZCB0bworICAgY29tcHJlc3MgdGhlbSBiZXR0ZXIuIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlIEh1ZmZtYW4KKyAgIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmc7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZSBiZXR3ZWVuCisgICBaX0RFRkFVTFQgYW5kIFpfSFVGRk1BTl9PTkxZLiBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMgZmFzdCBhcworICAgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuIFRoZSBzdHJhdGVneQorICAgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlCisgICBjb21wcmVzc2VkIG91dHB1dCBldmVuIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4gIFpfRklYRUQgcHJldmVudHMgdGhlCisgICB1c2Ugb2YgZHluYW1pYyBIdWZmbWFuIGNvZGVzLCBhbGxvd2luZyBmb3IgYSBzaW1wbGVyIGRlY29kZXIgZm9yIHNwZWNpYWwKKyAgIGFwcGxpY2F0aW9ucy4KKworICAgICAgZGVmbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKKyAgIG1ldGhvZCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyIGRvZXMKKyAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKKy8qCisgICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUgc2VxdWVuY2UKKyAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQsIGRlZmxhdGVJbml0MiBvciBkZWZsYXRlUmVzZXQsIGJlZm9yZSBhbnkKKyAgIGNhbGwgb2YgZGVmbGF0ZS4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCisgICBkaWN0aW9uYXJ5IChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkpLgorCisgICAgIFRoZSBkaWN0aW9uYXJ5IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkKKyAgIHRvIGJlIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkKKyAgIHVzZWQgc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKKyAgIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4gYmUKKyAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KKyAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KKworICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQorICAgZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLCBhIHBhcnQgb2YgdGhlIGRpY3Rpb25hcnkgbWF5IGluIGVmZmVjdCBiZQorICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUgaW4KKyAgIGRlZmxhdGUgb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQorICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuIEluIGFkZGl0aW9uLCB0aGUKKyAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cgc2l6ZSBtaW51cworICAgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgorCisgICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQorICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQorICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIGFkbGVyMzIgdmFsdWUKKyAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCisgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikgSWYgYSByYXcgZGVmbGF0ZSB3YXMgcmVxdWVzdGVkLCB0aGVuIHRoZQorICAgYWRsZXIzMiB2YWx1ZSBpcyBub3QgY29tcHV0ZWQgYW5kIHN0cm0tPmFkbGVyIGlzIG5vdCBzZXQuCisKKyAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQorICAgb3IgaWYgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBic29ydCkuIGRlZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CisvKgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCisgICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAorICAgZGF0YSB3aXRoIGEgZmlsdGVyLiBUaGUgc3RyZWFtcyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkIHNob3VsZCB0aGVuIGJlIGZyZWVkCisgICBieSBjYWxsaW5nIGRlZmxhdGVFbmQuICBOb3RlIHRoYXQgZGVmbGF0ZUNvcHkgZHVwbGljYXRlcyB0aGUgaW50ZXJuYWwKKyAgIGNvbXByZXNzaW9uIHN0YXRlIHdoaWNoIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gdGhpcyBzdHJhdGVneSBpcyBzbG93IGFuZAorICAgY2FuIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuCisKKyAgICAgZGVmbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgZGVzdGluYXRpb24uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBkZWZsYXRlRW5kIGZvbGxvd2VkIGJ5IGRlZmxhdGVJbml0LAorICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KKyAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcworICAgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCisKKyAgICAgIGRlZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiBsZXZlbCBhbmQgc3RyYXRlZ3kgaXMgYXMgaW4gZGVmbGF0ZUluaXQyLiAgVGhpcyBjYW4gYmUKKyAgIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIGlucHV0IGRhdGEsIG9yCisgICB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZyBhIGRpZmZlcmVudAorICAgc3RyYXRlZ3kuIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQgYXZhaWxhYmxlIHNvIGZhcgorICAgaXMgY29tcHJlc3NlZCB3aXRoIHRoZSBvbGQgbGV2ZWwgKGFuZCBtYXkgYmUgZmx1c2hlZCk7IHRoZSBuZXcgbGV2ZWwgd2lsbAorICAgdGFrZSBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAgICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZVBhcmFtcywgdGhlIHN0cmVhbSBzdGF0ZSBtdXN0IGJlIHNldCBhcyBmb3IKKyAgIGEgY2FsbCBvZiBkZWZsYXRlKCksIHNpbmNlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGlucHV0IG1heSBoYXZlIHRvCisgICBiZSBjb21wcmVzc2VkIGFuZCBmbHVzaGVkLiBJbiBwYXJ0aWN1bGFyLCBzdHJtLT5hdmFpbF9vdXQgbXVzdCBiZSBub24temVyby4KKworICAgICBkZWZsYXRlUGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCBvciBpZiBhIHBhcmFtZXRlciB3YXMgaW52YWxpZCwgWl9CVUZfRVJST1IKKyAgIGlmIHN0cm0tPmF2YWlsX291dCB3YXMgemVyby4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVR1bmUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdvb2RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9sYXp5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pY2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jaGFpbikpOworLyoKKyAgICAgRmluZSB0dW5lIGRlZmxhdGUncyBpbnRlcm5hbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAgVGhpcyBzaG91bGQgb25seSBiZQorICAgdXNlZCBieSBzb21lb25lIHdobyB1bmRlcnN0YW5kcyB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgemxpYidzIGRlZmxhdGUgZm9yCisgICBzZWFyY2hpbmcgZm9yIHRoZSBiZXN0IG1hdGNoaW5nIHN0cmluZywgYW5kIGV2ZW4gdGhlbiBvbmx5IGJ5IHRoZSBtb3N0CisgICBmYW5hdGljIG9wdGltaXplciB0cnlpbmcgdG8gc3F1ZWV6ZSBvdXQgdGhlIGxhc3QgY29tcHJlc3NlZCBiaXQgZm9yIHRoZWlyCisgICBzcGVjaWZpYyBpbnB1dCBkYXRhLiAgUmVhZCB0aGUgZGVmbGF0ZS5jIHNvdXJjZSBjb2RlIGZvciB0aGUgbWVhbmluZyBvZiB0aGUKKyAgIG1heF9sYXp5LCBnb29kX2xlbmd0aCwgbmljZV9sZW5ndGgsIGFuZCBtYXhfY2hhaW4gcGFyYW1ldGVycy4KKworICAgICBkZWZsYXRlVHVuZSgpIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvciBkZWZsYXRlSW5pdDIoKSwgYW5kCisgICByZXR1cm5zIFpfT0sgb24gc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgZm9yIGFuIGludmFsaWQgZGVmbGF0ZSBzdHJlYW0uCisgKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGRlZmxhdGVCb3VuZCBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIGRlZmxhdGVCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgorICAgZGVmbGF0aW9uIG9mIHNvdXJjZUxlbiBieXRlcy4gIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkKKyAgIG9yIGRlZmxhdGVJbml0MigpLiAgVGhpcyB3b3VsZCBiZSB1c2VkIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIKKyAgIGZvciBkZWZsYXRpb24gaW4gYSBzaW5nbGUgcGFzcywgYW5kIHNvIHdvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOworLyoKKyAgICAgZGVmbGF0ZVByaW1lKCkgaW5zZXJ0cyBiaXRzIGluIHRoZSBkZWZsYXRlIG91dHB1dCBzdHJlYW0uICBUaGUgaW50ZW50CisgIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IG9mZiB0aGUgZGVmbGF0ZSBvdXRwdXQgd2l0aCB0aGUKKyAgYml0cyBsZWZ0b3ZlciBmcm9tIGEgcHJldmlvdXMgZGVmbGF0ZSBzdHJlYW0gd2hlbiBhcHBlbmRpbmcgdG8gaXQuICBBcyBzdWNoLAorICB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJhdyBkZWZsYXRlLCBhbmQgbXVzdCBiZSB1c2VkIGJlZm9yZSB0aGUKKyAgZmlyc3QgZGVmbGF0ZSgpIGNhbGwgYWZ0ZXIgYSBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZQorICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YKKyAgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0LgorCisgICAgICBkZWZsYXRlUHJpbWUgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7CisvKgorICAgICAgZGVmbGF0ZVNldEhlYWRlcigpIHByb3ZpZGVzIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIGZvciB3aGVuIGEgZ3ppcAorICAgc3RyZWFtIGlzIHJlcXVlc3RlZCBieSBkZWZsYXRlSW5pdDIoKS4gIGRlZmxhdGVTZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkCisgICBhZnRlciBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKSBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mCisgICBkZWZsYXRlKCkuICBUaGUgdGV4dCwgdGltZSwgb3MsIGV4dHJhIGZpZWxkLCBuYW1lLCBhbmQgY29tbWVudCBpbmZvcm1hdGlvbgorICAgaW4gdGhlIHByb3ZpZGVkIGd6X2hlYWRlciBzdHJ1Y3R1cmUgYXJlIHdyaXR0ZW4gdG8gdGhlIGd6aXAgaGVhZGVyICh4ZmxhZyBpcworICAgaWdub3JlZCAtLSB0aGUgZXh0cmEgZmxhZ3MgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGNvbXByZXNzaW9uIGxldmVsKS4gIFRoZQorICAgY2FsbGVyIG11c3QgYXNzdXJlIHRoYXQsIGlmIG5vdCBaX05VTEwsIG5hbWUgYW5kIGNvbW1lbnQgYXJlIHRlcm1pbmF0ZWQgd2l0aAorICAgYSB6ZXJvIGJ5dGUsIGFuZCB0aGF0IGlmIGV4dHJhIGlzIG5vdCBaX05VTEwsIHRoYXQgZXh0cmFfbGVuIGJ5dGVzIGFyZQorICAgYXZhaWxhYmxlIHRoZXJlLiAgSWYgaGNyYyBpcyB0cnVlLCBhIGd6aXAgaGVhZGVyIGNyYyBpcyBpbmNsdWRlZC4gIE5vdGUgdGhhdAorICAgdGhlIGN1cnJlbnQgdmVyc2lvbnMgb2YgdGhlIGNvbW1hbmQtbGluZSB2ZXJzaW9uIG9mIGd6aXAgKHVwIHRocm91Z2ggdmVyc2lvbgorICAgMS4zLngpIGRvIG5vdCBzdXBwb3J0IGhlYWRlciBjcmMncywgYW5kIHdpbGwgcmVwb3J0IHRoYXQgaXQgaXMgYSAibXVsdGktcGFydAorICAgZ3ppcCBmaWxlIiBhbmQgZ2l2ZSB1cC4KKworICAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCisgICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKKyAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KKworICAgICAgZGVmbGF0ZVNldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cykpOworCisgICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGluZmxhdGVJbml0IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdworICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQKKyAgIGluc3RlYWQuIHdpbmRvd0JpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHdpbmRvd0JpdHMgdmFsdWUKKyAgIHByb3ZpZGVkIHRvIGRlZmxhdGVJbml0MigpIHdoaWxlIGNvbXByZXNzaW5nLCBvciBpdCBtdXN0IGJlIGVxdWFsIHRvIDE1IGlmCisgICBkZWZsYXRlSW5pdDIoKSB3YXMgbm90IHVzZWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKKyAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCisgICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBpbmZsYXRlKCkgd2lsbCB0aGVuIHByb2Nlc3MgcmF3IGRlZmxhdGUgZGF0YSwKKyAgIG5vdCBsb29raW5nIGZvciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIsIG5vdCBnZW5lcmF0aW5nIGEgY2hlY2sgdmFsdWUsIGFuZCBub3QKKyAgIGxvb2tpbmcgZm9yIGFueSBjaGVjayB2YWx1ZXMgZm9yIGNvbXBhcmlzb24gYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiBUaGlzCisgICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0CisgICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiBJZiBhIGN1c3RvbQorICAgZm9ybWF0IGlzIGRldmVsb3BlZCB1c2luZyB0aGUgcmF3IGRlZmxhdGUgZm9ybWF0IGZvciBjb21wcmVzc2VkIGRhdGEsIGl0IGlzCisgICByZWNvbW1lbmRlZCB0aGF0IGEgY2hlY2sgdmFsdWUgc3VjaCBhcyBhbiBhZGxlcjMyIG9yIGEgY3JjMzIgYmUgYXBwbGllZCB0bworICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFzIGlzIGRvbmUgaW4gdGhlIHpsaWIsIGd6aXAsIGFuZCB6aXAgZm9ybWF0cy4gIEZvcgorICAgbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSB6bGliIGZvcm1hdCBzaG91bGQgYmUgdXNlZCBhcyBpcy4gTm90ZSB0aGF0IGNvbW1lbnRzCisgICBhYm92ZSBvbiB0aGUgdXNlIGluIGRlZmxhdGVJbml0MigpIGFwcGxpZXMgdG8gdGhlIG1hZ25pdHVkZSBvZiB3aW5kb3dCaXRzLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGRlY29kaW5nLiBBZGQKKyAgIDMyIHRvIHdpbmRvd0JpdHMgdG8gZW5hYmxlIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyCisgICBkZXRlY3Rpb24sIG9yIGFkZCAxNiB0byBkZWNvZGUgb25seSB0aGUgZ3ppcCBmb3JtYXQgKHRoZSB6bGliIGZvcm1hdCB3aWxsCisgICByZXR1cm4gYSBaX0RBVEFfRVJST1IpLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcworICAgYSBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCisKKyAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGEgbnVsbCBzdHJtKS4gbXNnCisgICBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0KKyAgIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogdGhpcyB3aWxsCisgICBiZSBkb25lIGJ5IGluZmxhdGUoKS4gKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0IG5leHRfb3V0CisgICBhbmQgYXZhaWxfb3V0IGFyZSB1bmNoYW5nZWQuKQorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKKy8qCisgICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKKyAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlLAorICAgaWYgdGhhdCBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKKyAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhhdCBjYWxsIG9mIGluZmxhdGUuCisgICBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCisgICBkZWZsYXRlU2V0RGljdGlvbmFyeSkuICBGb3IgcmF3IGluZmxhdGUsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IgaW5mbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZgorICAgaW5mbGF0ZSgpIHRvIHNldCB0aGUgZGljdGlvbmFyeS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZQorICAgZGljdGlvbmFyeSB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KKworICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQorICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCisgICBpbmZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKKyAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKKyAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KKworICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIFpfQlVGX0VSUk9SCisgIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCisgIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCisgIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKKyAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKKy8qCisgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCisKKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIGEgbGFyZ2Ugc3RyZWFtLiAgVGhlCisgICBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIHN0cmVhbSBjYW4gcGVyaW9kaWNhbGx5IHJlY29yZCB0aGUgaW5mbGF0ZSBzdGF0ZSwKKyAgIGFsbG93aW5nIHJlc3RhcnRpbmcgaW5mbGF0ZSBhdCB0aG9zZSBwb2ludHMgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgdGhlCisgICBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgZGVzdGluYXRpb24uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBpbmZsYXRlRW5kIGZvbGxvd2VkIGJ5IGluZmxhdGVJbml0LAorICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBkZWNvbXByZXNzaW9uIHN0YXRlLgorICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KKworICAgICAgaW5mbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgTlVMTCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYml0cyBpbiB0aGUgaW5mbGF0ZSBpbnB1dCBzdHJlYW0uICBUaGUgaW50ZW50IGlzCisgIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCisgIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKKyAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgorICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCisgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCisKKyAgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKKy8qCisgICAgICBpbmZsYXRlR2V0SGVhZGVyKCkgcmVxdWVzdHMgdGhhdCBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBiZSBzdG9yZWQgaW4gdGhlCisgICBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlLiAgaW5mbGF0ZUdldEhlYWRlcigpIG1heSBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpLCBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mIGluZmxhdGUoKS4KKyAgIEFzIGluZmxhdGUoKSBwcm9jZXNzZXMgdGhlIGd6aXAgc3RyZWFtLCBoZWFkLT5kb25lIGlzIHplcm8gdW50aWwgdGhlIGhlYWRlcgorICAgaXMgY29tcGxldGVkLCBhdCB3aGljaCB0aW1lIGhlYWQtPmRvbmUgaXMgc2V0IHRvIG9uZS4gIElmIGEgemxpYiBzdHJlYW0gaXMKKyAgIGJlaW5nIGRlY29kZWQsIHRoZW4gaGVhZC0+ZG9uZSBpcyBzZXQgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3aWxsIGJlCisgICBubyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3J0aGNvbWluZy4gIE5vdGUgdGhhdCBaX0JMT0NLIGNhbiBiZSB1c2VkIHRvCisgICBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlCisgICBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCisKKyAgICAgIFRoZSB0ZXh0LCB0aW1lLCB4ZmxhZ3MsIGFuZCBvcyBmaWVsZHMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBnemlwIGhlYWRlcgorICAgY29udGVudHMuICBoY3JjIGlzIHNldCB0byB0cnVlIGlmIHRoZXJlIGlzIGEgaGVhZGVyIENSQy4gIChUaGUgaGVhZGVyIENSQworICAgd2FzIHZhbGlkIGlmIGRvbmUgaXMgc2V0IHRvIG9uZS4pICBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAorICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCisgICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKKyAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KKyAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAorICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgorICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCisgICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4KKyAgIGFueSBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMKKyAgIG5vdCBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKKyAgIGFic2VuY2UuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIGRlZmxhdGVTZXRIZWFkZXIoKSB3aXRoIHRoZSByZXR1cm5lZAorICAgc3RydWN0dXJlIHRvIGR1cGxpY2F0ZSB0aGUgaGVhZGVyLiAgSG93ZXZlciBpZiB0aG9zZSBmaWVsZHMgYXJlIHNldCB0bworICAgYWxsb2NhdGVkIG1lbW9yeSwgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHNhdmUgdGhvc2UgcG9pbnRlcnMKKyAgIGVsc2V3aGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV2ZW50dWFsbHkgZnJlZWQuCisKKyAgICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKKyAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgorICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgorICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bworICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgorCisgICAgICBpbmZsYXRlR2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3cpKTsKKworICAgICBJbml0aWFsaXplIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24gdXNpbmcgaW5mbGF0ZUJhY2soKQorICAgY2FsbHMuICBUaGUgZmllbGRzIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBpbiBzdHJtIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSB0aGUgY2FsbC4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIFpfTlVMTCwgdGhlbiB0aGUgZGVmYXVsdCBsaWJyYXJ5LQorICAgZGVyaXZlZCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBhcmUgdXNlZC4gIHdpbmRvd0JpdHMgaXMgdGhlIGJhc2UgdHdvCisgICBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplLCBpbiB0aGUgcmFuZ2UgOC4uMTUuICB3aW5kb3cgaXMgYSBjYWxsZXIKKyAgIHN1cHBsaWVkIGJ1ZmZlciBvZiB0aGF0IHNpemUuICBFeGNlcHQgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIHdoZXJlIGl0IGlzCisgICBhc3N1cmVkIHRoYXQgZGVmbGF0ZSB3YXMgdXNlZCB3aXRoIHNtYWxsIHdpbmRvdyBzaXplcywgd2luZG93Qml0cyBtdXN0IGJlIDE1CisgICBhbmQgYSAzMksgYnl0ZSB3aW5kb3cgbXVzdCBiZSBzdXBwbGllZCB0byBiZSBhYmxlIHRvIGRlY29tcHJlc3MgZ2VuZXJhbAorICAgZGVmbGF0ZSBzdHJlYW1zLgorCisgICAgIFNlZSBpbmZsYXRlQmFjaygpIGZvciB0aGUgdXNhZ2Ugb2YgdGhlc2Ugcm91dGluZXMuCisKKyAgICAgaW5mbGF0ZUJhY2tJbml0IHdpbGwgcmV0dXJuIFpfT0sgb24gc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYW55IG9mCisgICB0aGUgcGFyYW1hdGVycyBhcmUgaW52YWxpZCwgWl9NRU1fRVJST1IgaWYgdGhlIGludGVybmFsIHN0YXRlIGNvdWxkIG5vdAorICAgYmUgYWxsb2NhdGVkLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lcyBub3QKKyAgIG1hdGNoIHRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZS4KKyovCisKK3R5cGVkZWYgdW5zaWduZWQgKCppbl9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiBGQVIgKikpOwordHlwZWRlZiBpbnQgKCpvdXRfZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2sgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZnVuYyBpbiwgdm9pZCBGQVIgKmluX2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZnVuYyBvdXQsIHZvaWQgRkFSICpvdXRfZGVzYykpOworLyoKKyAgICAgaW5mbGF0ZUJhY2soKSBkb2VzIGEgcmF3IGluZmxhdGUgd2l0aCBhIHNpbmdsZSBjYWxsIHVzaW5nIGEgY2FsbC1iYWNrCisgICBpbnRlcmZhY2UgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaW5mbGF0ZSgpIGZvcgorICAgZmlsZSBpL28gYXBwbGljYXRpb25zIGluIHRoYXQgaXQgYXZvaWRzIGNvcHlpbmcgYmV0d2VlbiB0aGUgb3V0cHV0IGFuZCB0aGUKKyAgIHNsaWRpbmcgd2luZG93IGJ5IHNpbXBseSBtYWtpbmcgdGhlIHdpbmRvdyBpdHNlbGYgdGhlIG91dHB1dCBidWZmZXIuICBUaGlzCisgICBmdW5jdGlvbiB0cnVzdHMgdGhlIGFwcGxpY2F0aW9uIHRvIG5vdCBjaGFuZ2UgdGhlIG91dHB1dCBidWZmZXIgcGFzc2VkIGJ5CisgICB0aGUgb3V0cHV0IGZ1bmN0aW9uLCBhdCBsZWFzdCB1bnRpbCBpbmZsYXRlQmFjaygpIHJldHVybnMuCisKKyAgICAgaW5mbGF0ZUJhY2tJbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlCisgICBhbmQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgd2l0aCB0aGUgdXNlci1wcm92aWRlZCB3aW5kb3cgYnVmZmVyLgorICAgaW5mbGF0ZUJhY2soKSBtYXkgdGhlbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIHRvIGluZmxhdGUgYSBjb21wbGV0ZSwgcmF3CisgICBkZWZsYXRlIHN0cmVhbSB3aXRoIGVhY2ggY2FsbC4gIGluZmxhdGVCYWNrRW5kKCkgaXMgdGhlbiBjYWxsZWQgdG8gZnJlZQorICAgdGhlIGFsbG9jYXRlZCBzdGF0ZS4KKworICAgICBBIHJhdyBkZWZsYXRlIHN0cmVhbSBpcyBvbmUgd2l0aCBubyB6bGliIG9yIGd6aXAgaGVhZGVyIG9yIHRyYWlsZXIuCisgICBUaGlzIHJvdXRpbmUgd291bGQgbm9ybWFsbHkgYmUgdXNlZCBpbiBhIHV0aWxpdHkgdGhhdCByZWFkcyB6aXAgb3IgZ3ppcAorICAgZmlsZXMgYW5kIHdyaXRlcyBvdXQgdW5jb21wcmVzc2VkIGZpbGVzLiAgVGhlIHV0aWxpdHkgd291bGQgZGVjb2RlIHRoZQorICAgaGVhZGVyIGFuZCBwcm9jZXNzIHRoZSB0cmFpbGVyIG9uIGl0cyBvd24sIGhlbmNlIHRoaXMgcm91dGluZSBleHBlY3RzCisgICBvbmx5IHRoZSByYXcgZGVmbGF0ZSBzdHJlYW0gdG8gZGVjb21wcmVzcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlCisgICBub3JtYWwgYmVoYXZpb3Igb2YgaW5mbGF0ZSgpLCB3aGljaCBleHBlY3RzIGVpdGhlciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGFyb3VuZCB0aGUgZGVmbGF0ZSBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUJhY2soKSB1c2VzIHR3byBzdWJyb3V0aW5lcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHRoYXQgYXJlIHRoZW4KKyAgIGNhbGxlZCBieSBpbmZsYXRlQmFjaygpIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgaW5mbGF0ZUJhY2soKSBjYWxscyB0aG9zZQorICAgcm91dGluZXMgdW50aWwgaXQgcmVhZHMgYSBjb21wbGV0ZSBkZWZsYXRlIHN0cmVhbSBhbmQgd3JpdGVzIG91dCBhbGwgb2YgdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSwgb3IgdW50aWwgaXQgZW5jb3VudGVycyBhbiBlcnJvci4gIFRoZSBmdW5jdGlvbidzCisgICBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXMgYXJlIGRlZmluZWQgYWJvdmUgaW4gdGhlIGluX2Z1bmMgYW5kIG91dF9mdW5jCisgICB0eXBlZGVmcy4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsIGluKGluX2Rlc2MsICZidWYpIHdoaWNoIHNob3VsZCByZXR1cm4gdGhlCisgICBudW1iZXIgb2YgYnl0ZXMgb2YgcHJvdmlkZWQgaW5wdXQsIGFuZCBhIHBvaW50ZXIgdG8gdGhhdCBpbnB1dCBpbiBidWYuICBJZgorICAgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLCBpbigpIG11c3QgcmV0dXJuIHplcm8tLWJ1ZiBpcyBpZ25vcmVkIGluIHRoYXQKKyAgIGNhc2UtLWFuZCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIGEgYnVmZmVyIGVycm9yLiAgaW5mbGF0ZUJhY2soKSB3aWxsIGNhbGwKKyAgIG91dChvdXRfZGVzYywgYnVmLCBsZW4pIHRvIHdyaXRlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBidWZbMC4ubGVuLTFdLiAgb3V0KCkKKyAgIHNob3VsZCByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBub24temVybyBvbiBmYWlsdXJlLiAgSWYgb3V0KCkgcmV0dXJucworICAgbm9uLXplcm8sIGluZmxhdGVCYWNrKCkgd2lsbCByZXR1cm4gd2l0aCBhbiBlcnJvci4gIE5laXRoZXIgaW4oKSBub3Igb3V0KCkKKyAgIGFyZSBwZXJtaXR0ZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgd2luZG93IHByb3ZpZGVkIHRvCisgICBpbmZsYXRlQmFja0luaXQoKSwgd2hpY2ggaXMgYWxzbyB0aGUgYnVmZmVyIHRoYXQgb3V0KCkgdXNlcyB0byB3cml0ZSBmcm9tLgorICAgVGhlIGxlbmd0aCB3cml0dGVuIGJ5IG91dCgpIHdpbGwgYmUgYXQgbW9zdCB0aGUgd2luZG93IHNpemUuICBBbnkgbm9uLXplcm8KKyAgIGFtb3VudCBvZiBpbnB1dCBtYXkgYmUgcHJvdmlkZWQgYnkgaW4oKS4KKworICAgICBGb3IgY29udmVuaWVuY2UsIGluZmxhdGVCYWNrKCkgY2FuIGJlIHByb3ZpZGVkIGlucHV0IG9uIHRoZSBmaXJzdCBjYWxsIGJ5CisgICBzZXR0aW5nIHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luLiAgSWYgdGhhdCBpbnB1dCBpcyBleGhhdXN0ZWQsIHRoZW4KKyAgIGluKCkgd2lsbCBiZSBjYWxsZWQuICBUaGVyZWZvcmUgc3RybS0+bmV4dF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZQorICAgY2FsbGluZyBpbmZsYXRlQmFjaygpLiAgSWYgc3RybS0+bmV4dF9pbiBpcyBaX05VTEwsIHRoZW4gaW4oKSB3aWxsIGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgZm9yIGlucHV0LiAgSWYgc3RybS0+bmV4dF9pbiBpcyBub3QgWl9OVUxMLCB0aGVuIHN0cm0tPmF2YWlsX2luCisgICBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGlmIHN0cm0tPmF2YWlsX2luIGlzIG5vdCB6ZXJvLCBpbnB1dCB3aWxsCisgICBpbml0aWFsbHkgYmUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luWzAgLi4gc3RybS0+YXZhaWxfaW4gLSAxXS4KKworICAgICBUaGUgaW5fZGVzYyBhbmQgb3V0X2Rlc2MgcGFyYW1ldGVycyBvZiBpbmZsYXRlQmFjaygpIGlzIHBhc3NlZCBhcyB0aGUKKyAgIGZpcnN0IHBhcmFtZXRlciBvZiBpbigpIGFuZCBvdXQoKSByZXNwZWN0aXZlbHkgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGVzZQorICAgZGVzY3JpcHRvcnMgY2FuIGJlIG9wdGlvbmFsbHkgdXNlZCB0byBwYXNzIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBjYWxsZXItCisgICBzdXBwbGllZCBpbigpIGFuZCBvdXQoKSBmdW5jdGlvbnMgbmVlZCB0byBkbyB0aGVpciBqb2IuCisKKyAgICAgT24gcmV0dXJuLCBpbmZsYXRlQmFjaygpIHdpbGwgc2V0IHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luIHRvCisgICBwYXNzIGJhY2sgYW55IHVudXNlZCBpbnB1dCB0aGF0IHdhcyBwcm92aWRlZCBieSB0aGUgbGFzdCBpbigpIGNhbGwuICBUaGUKKyAgIHJldHVybiB2YWx1ZXMgb2YgaW5mbGF0ZUJhY2soKSBjYW4gYmUgWl9TVFJFQU1fRU5EIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCisgICBpZiBpbigpIG9yIG91dCgpIHJldHVybmVkIGFuIGVycm9yLCBaX0RBVEFfRVJST1IgaWYgdGhlcmUgd2FzIGEgZm9ybWF0CisgICBlcnJvciBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0gKGluIHdoaWNoIGNhc2Ugc3RybS0+bXNnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUKKyAgIG5hdHVyZSBvZiB0aGUgZXJyb3IpLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBub3QgcHJvcGVybHkKKyAgIGluaXRpYWxpemVkLiAgSW4gdGhlIGNhc2Ugb2YgWl9CVUZfRVJST1IsIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBjYW4gYmUKKyAgIGRpc3Rpbmd1aXNoZWQgdXNpbmcgc3RybS0+bmV4dF9pbiB3aGljaCB3aWxsIGJlIFpfTlVMTCBvbmx5IGlmIGluKCkgcmV0dXJuZWQKKyAgIGFuIGVycm9yLiAgSWYgc3RybS0+bmV4dCBpcyBub3QgWl9OVUxMLCB0aGVuIHRoZSBaX0JVRl9FUlJPUiB3YXMgZHVlIHRvCisgICBvdXQoKSByZXR1cm5pbmcgbm9uLXplcm8uICAoaW4oKSB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIG91dCgpLCBzbworICAgc3RybS0+bmV4dF9pbiBpcyBhc3N1cmVkIHRvIGJlIGRlZmluZWQgaWYgb3V0KCkgcmV0dXJucyBub24temVyby4pICBOb3RlCisgICB0aGF0IGluZmxhdGVCYWNrKCkgY2Fubm90IHJldHVybiBaX09LLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgorCisgICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KKyAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOworLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCisKKyAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6CisgICAgIDEuMDogc2l6ZSBvZiB1SW50CisgICAgIDMuMjogc2l6ZSBvZiB1TG9uZworICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQorICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAorCisgICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6CisgICAgIDg6IERFQlVHCisgICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQorICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgorICAgICAxMTogMCAocmVzZXJ2ZWQpCisKKyAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgorICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKKworICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6CisgICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCisgICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCisgICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKKworICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6CisgICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQorICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKKyAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQorCisgICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgorICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAorICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKKyAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKKworICAgIFJlbWFpbmRlcjoKKyAgICAgMjctMzE6IDAgKHJlc2VydmVkKQorICovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQorICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAorICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCisgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgIGJ5IGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKKy8qCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZQorICAgYSBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKKyAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgorICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKKyAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisKKyAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkIG9yIGluY29tcGxldGUuCisqLworCisKK3R5cGVkZWYgdm9pZHAgZ3pGaWxlOworCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiAgT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpKTsKKy8qCisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgorICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikgYnV0IGNhbiBhbHNvIGluY2x1ZGUgYSBjb21wcmVzc2lvbiBsZXZlbAorICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCisgICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLCBvciAnUicgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcKKyAgIGFzIGluICJ3YjFSIi4gKFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikKKworICAgICBnem9wZW4gY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OyBpbiB0aGlzCisgICBjYXNlIGd6cmVhZCB3aWxsIGRpcmVjdGx5IHJlYWQgZnJvbSB0aGUgZmlsZSB3aXRob3V0IGRlY29tcHJlc3Npb24uCisKKyAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcworICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlOyBlcnJubworICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCisgICB6bGliIGVycm9yIGlzIFpfTUVNX0VSUk9SKS4gICovCisKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiAgT0YoKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkpOworLyoKKyAgICAgZ3pkb3BlbigpIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZQorICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCisgICBmaWxlbm8gKGluIHRoZSBmaWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLgorICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KKyAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZQorICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQorICAgZGVzY3JpcHRvciBmZC4gSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZ3pkb3BlbihkdXAoZmQpLCBtb2RlKS4KKyAgICAgZ3pkb3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKKyAgIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuIFNlZSB0aGUgZGVzY3JpcHRpb24KKyAgIG9mIGRlZmxhdGVJbml0MiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgcGFyYW1ldGVycy4KKyAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKKyAgIG9wZW5lZCBmb3Igd3JpdGluZy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZWFkICBPRigoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CisvKgorICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIKKyAgIG9mIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KKyAgICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IKKyAgIGVuZCBvZiBmaWxlLCAtMSBmb3IgZXJyb3IpLiAqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6d3JpdGUgT0YoKGd6RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGMgYnVmLCB1bnNpZ25lZCBsZW4pKTsKKy8qCisgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbgorICAgKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUVkEgICBnenByaW50ZiBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7CisvKgorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLiAgVGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA0MDk1LiBUaGUgY2FsbGVyIHNob3VsZCBhc3N1cmUgdGhhdAorICAgdGhpcyBsaW1pdCBpcyBub3QgZXhjZWVkZWQuIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4KKyAgIHJldHVybiBhbiBlcnJvciAoMCkgd2l0aCBub3RoaW5nIHdyaXR0ZW4uIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYQorICAgYnVmZmVyIG92ZXJmbG93IHdpdGggdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYKKyAgIHpsaWIgd2FzIGNvbXBpbGVkIHdpdGggdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKQorICAgYmVjYXVzZSB0aGUgc2VjdXJlIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOworLyoKKyAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKKyAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KKyAgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKKy8qCisgICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IKKyAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQorICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwKKyAgIGNoYXJhY3Rlci4KKyAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6cHV0YyBPRigoZ3pGaWxlIGZpbGUsIGludCBjKSk7CisvKgorICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnenB1dGMgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pnZXRjIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gZ3pnZXRjIHJldHVybnMgdGhpcyBieXRlCisgICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7CisvKgorICAgICAgUHVzaCBvbmUgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgc3RyZWFtIHRvIGJlIHJlYWQgYWdhaW4gbGF0ZXIuCisgICBPbmx5IG9uZSBjaGFyYWN0ZXIgb2YgcHVzaC1iYWNrIGlzIGFsbG93ZWQuICBnenVuZ2V0YygpIHJldHVybnMgdGhlCisgICBjaGFyYWN0ZXIgcHVzaGVkLCBvciAtMSBvbiBmYWlsdXJlLiAgZ3p1bmdldGMoKSB3aWxsIGZhaWwgaWYgYQorICAgY2hhcmFjdGVyIGhhcyBiZWVuIHB1c2hlZCBidXQgbm90IHJlYWQgeWV0LCBvciBpZiBjIGlzIC0xLiBUaGUgcHVzaGVkCisgICBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aCBnenNlZWsoKQorICAgb3IgZ3pyZXdpbmQoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBnemVycm9yIGJlbG93KS4gZ3pmbHVzaCByZXR1cm5zIFpfT0sgaWYKKyAgIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgWl9GSU5JU0ggYW5kIGFsbCBvdXRwdXQgY291bGQgYmUgZmx1c2hlZC4KKyAgICAgZ3pmbHVzaCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBzdHJpY3RseSBuZWNlc3NhcnkgYmVjYXVzZSBpdCBjYW4KKyAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCisqLworCitaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCAgICBnenNlZWsgT0YoKGd6RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkpOworLyoKKyAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiBUaGUgd2hlbmNlIHBhcmFtZXRlciBpcyBkZWZpbmVkIGFzIGluIGxzZWVrKDIpOworICAgdGhlIHZhbHVlIFNFRUtfRU5EIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCisgICBleHRyZW1lbHkgc2xvdy4gSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nLCBvbmx5IGZvcndhcmQgc2Vla3MgYXJlCisgICBzdXBwb3J0ZWQ7IGd6c2VlayB0aGVuIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiB6ZXJvZXMgdXAgdG8gdGhlIG5ldworICAgc3RhcnRpbmcgcG9zaXRpb24uCisKKyAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KKyAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCisgICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgorICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCisKKyAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQorKi8KKworWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCisKKyAgIGd6dGVsbChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6ZW9mIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KKyAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6ZGlyZWN0IE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyAxIGlmIGZpbGUgaXMgYmVpbmcgcmVhZCBkaXJlY3RseSB3aXRob3V0IGRlY29tcHJlc3Npb24sIG90aGVyd2lzZQorICAgemVyby4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pjbG9zZSBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgorICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZ3plcnJvciBiZWxvdykuCisqLworCitaRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IgT0YoKGd6RmlsZSBmaWxlLCBpbnQgKmVycm51bSkpOworLyoKKyAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCisgICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCisgICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisqLworCitaRVhURVJOIHZvaWQgWkVYUE9SVCBnemNsZWFyZXJyIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgQ2xlYXJzIHRoZSBlcnJvciBhbmQgZW5kLW9mLWZpbGUgZmxhZ3MgZm9yIGZpbGUuIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZQorICAgY2xlYXJlcnIoKSBmdW5jdGlvbiBpbiBzdGRpby4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKKyAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKKyAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKKyAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgIHRoZSByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCisgICBBbiBBZGxlci0zMiBjaGVja3N1bSBpcyBhbG1vc3QgYXMgcmVsaWFibGUgYXMgYSBDUkMzMiBidXQgY2FuIGJlIGNvbXB1dGVkCisgICBtdWNoIGZhc3Rlci4gVXNhZ2UgZXhhbXBsZToKKworICAgICB1TG9uZyBhZGxlciA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisKKyAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICBhZGxlciA9IGFkbGVyMzIoYWRsZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgfQorICAgICBpZiAoYWRsZXIgIT0gb3JpZ2luYWxfYWRsZXIpIGVycm9yKCk7CisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3QgbGVuMikpOworLyoKKyAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKKyAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgorICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMiAgIE9GKCh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIENSQy0zMiB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlCisgICB1cGRhdGVkIENSQy0zMi4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbAorICAgdmFsdWUgZm9yIHRoZSBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCisgICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVXNhZ2UgZXhhbXBsZToKKworICAgICB1TG9uZyBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGNyYyA9IGNyYzMyKGNyYywgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChjcmMgIT0gb3JpZ2luYWxfY3JjKSBlcnJvcigpOworKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOworCisvKgorICAgICBDb21iaW5lIHR3byBDUkMtMzIgY2hlY2sgdmFsdWVzIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsCisgICBzZXExIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBDUkMtMzIgY2hlY2sgdmFsdWVzIHdlcmUKKyAgIGNhbGN1bGF0ZWQgZm9yIGVhY2gsIGNyYzEgYW5kIGNyYzIuICBjcmMzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQ1JDLTMyCisgICBjaGVjayB2YWx1ZSBvZiBzZXExIGFuZCBzZXEyIGNvbmNhdGVuYXRlZCwgcmVxdWlyaW5nIG9ubHkgY3JjMSwgY3JjMiwgYW5kCisgICBsZW4yLgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopICovCisKKy8qIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbWFjcm9zIHRvIGFsbG93IGNoZWNraW5nIHRoZSB6bGliIHZlcnNpb24KKyAqIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIHpfc3RyZWFtOgorICovCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgbGV2ZWwsIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKKyNkZWZpbmUgZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIFwKKyAgICAgICAgZGVmbGF0ZUluaXRfKChzdHJtKSwgKGxldmVsKSwgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCisgICAgICAgIGluZmxhdGVJbml0Xygoc3RybSksICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAorICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAorICAgICAgICBpbmZsYXRlSW5pdDJfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVCYWNrSW5pdChzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3cpIFwKKyAgICAgICAgaW5mbGF0ZUJhY2tJbml0Xygoc3RybSksICh3aW5kb3dCaXRzKSwgKHdpbmRvdyksIFwKKyAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorCisKKyNpZiAhZGVmaW5lZChaVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQorICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307IC8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2VuZGlmCisKK1pFWFRFUk4gY29uc3QgY2hhciAgICogWkVYUE9SVCB6RXJyb3IgICAgICAgICAgIE9GKChpbnQpKTsKK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50IE9GKCh6X3N0cmVhbXAgeikpOworWkVYVEVSTiBjb25zdCB1TG9uZ2YgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUgICAgT0YoKHZvaWQpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFpMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2luaXRyYW1mcy5kZWZhdWx0IGIvdXNyL2luaXRyYW1mcy5kZWZhdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzQzN2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvaW5pdHJhbWZzLmRlZmF1bHQKQEAgLTAsMCArMSw5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBpcyBhIHZlcnkgc2ltcGxlLCBkZWZhdWx0IGluaXRyYW1mcworIyBTZWUgZ2VuX2luaXRfY3BpbyBmb3Igc3ludGF4CisKK2RpciBkZXYgMDc1NSAwIDAKK25vZCBkZXYvY29uc29sZSAwNjAwIDAgMCBjIDUgMQorZGlyIHJvb3QgMDcwMCAwIDAKK2ZpbGUga2luaXQgdXNyL2tpbml0L2tpbml0IDA3NTUgMCAwCitzbGluayBpbml0IGtpbml0IDA3NTUgMCAwCmRpZmYgLS1naXQgYS91c3Iva2luaXQvS2J1aWxkIGIvdXNyL2tpbml0L0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFkNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L0tidWlsZApAQCAtMCwwICsxLDM3IEBACisjCisjIEtidWlsZCBmaWxlIGZvciBraW5pdAorIworCisjIGxpYnJhcnkgcGFydCBvZiBraW5pdC4gSXMgdXNlZCBieSBwcm9ncmFtcyBpbiBzdWItZGlyZWN0b3JpZXMgKHJlc3VtZSBldCBhbCkKK2xpYi15ICAgOj0gbmFtZV90b19kZXYubyBkZXZuYW1lLm8gZ2V0YXJnLm8KKyMgdXNlIGxpYiBmb3Iga2luaXQKK2tpbml0LXkgIDo9IGxpYi5hCisKK2tpbml0LXkgICs9IGtpbml0Lm8gZG9fbW91bnRzLm8gcmFtZGlza19sb2FkLm8gaW5pdHJkLm8KK2tpbml0LXkgICs9IGdldGludGZpbGUubyByZWFkZmlsZS5vIHhwaW8ubwora2luaXQteSAgKz0gZG9fbW91bnRzX21kLm8gZG9fbW91bnRzX210ZC5vIG5mc3Jvb3QubworCitraW5pdC15ICArPSBpcGNvbmZpZy8KK2tpbml0LXkgICs9IG5mc21vdW50Lwora2luaXQteSAgKz0gcnVuLWluaXQvCitraW5pdC15ICArPSBmc3R5cGUvCitraW5pdC15ICArPSByZXN1bWUvCisKK3N0YXRpYy15IDo9IGtpbml0CitzaGFyZWQteSA6PSBraW5pdC5zaGFyZWQKK2tpbml0LnNoYXJlZC15IDo9ICQoa2luaXQteSkKKworIyBBZGRpdGlvbmFsIGluY2x1ZGUgcGF0aHMgZmlsZXMKK0tMSUJDQ0ZMQUdTICs9IC1JJChzcmN0cmVlKS8kKHNyYykvZnN0eXBlIFwKKwkgICAgICAgLUkkKHNyY3RyZWUpLyQoc3JjKS9pcGNvbmZpZyBcCisgIAkgICAgICAgLUkkKHNyY3RyZWUpLyQoc3JjKS9uZnNtb3VudCBcCisgIAkgICAgICAgLUkkKHNyY3RyZWUpLyQoc3JjKS9yZXN1bWUgXAorIAkgICAgICAgLUkkKHNyY3RyZWUpLyQoc3JjKS9ydW4taW5pdAorCisjIENsZWFuaW5nCit0YXJnZXRzICs9IGtpbml0IGtpbml0Lmcga2luaXQuc2hhcmVkIGtpbml0LnNoYXJlZC5nCitzdWJkaXItIDo9IGZzdHlwZSBpcGNvbmZpZyBuZnNtb3VudCByZXN1bWUgcnVuLWluaXQKKworCisjIGluc3RhbGwgYmluYXJ5CitpbnN0YWxsLXkgOj0ga2luaXQga2luaXQuc2hhcmVkCmRpZmYgLS1naXQgYS91c3Iva2luaXQvUkVBRE1FIGIvdXNyL2tpbml0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdmNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L1JFQURNRQpAQCAtMCwwICsxLDkgQEAKK2tpbml0IC0gdGlueSBpbml0IHByb2dyYW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIGZvciB1c2UgYXMgL3NiaW4vaW5pdCBpbiBhbiBpbml0cmFtZnMKK2Vudmlyb25tZW50LiAgSXQgY3VycmVudGx5IHJlcGxhY2VzIHRoZSBrZXJuZWwncyBpcGNvbmZpZyBhbmQgbmZzcm9vdAorY29kZS4KKworLS0KK0JyeWFuIE8nU3VsbGl2YW4gKDIwMDMvMDUvMDUpCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZGV2bmFtZS5jIGIvdXNyL2tpbml0L2Rldm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWIyMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2Rldm5hbWUuYwpAQCAtMCwwICsxLDExMiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorCisvKgorICogUHJpbnQgdGhlIG5hbWUgb2YgYSBibG9jayBkZXZpY2UuCisgKi8KKyNkZWZpbmUgQlVGX1NJWkUJNTEyCisKK3N0YXRpYyBpbnQgc2NhbnN5c2RpcihjaGFyICpuYW1lYnVmLCBjaGFyICpzeXNkaXIsIGRldl90IGRldikKK3sKKwljaGFyICpkaXJ0YWlscHRyID0gc3RyY2hyKHN5c2RpciwgJ1wwJyk7CisJRElSICpkaXI7CisJaW50IGRvbmUgPSAwOworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgKnN5c3RhaWw7CisJRklMRSAqc3lzZGV2OworCXVuc2lnbmVkIGxvbmcgbWEsIG1pOworCWNoYXIgKmVwOworCXNzaXplX3QgcmQ7CisKKwlpZiAoIShkaXIgPSBvcGVuZGlyKHN5c2RpcikpKQorCQlyZXR1cm4gMDsKKworCSpkaXJ0YWlscHRyKysgPSAnLyc7CisKKwl3aGlsZSAoIWRvbmUgJiYgKGRlID0gcmVhZGRpcihkaXIpKSkgeworCQkvKiBBc3N1bWUgaWYgd2Ugc2VlIGEgZG90LW5hbWUgaW4gc3lzZnMgaXQncyBzcGVjaWFsICovCisJCWlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZS0+ZF90eXBlICE9IERUX1VOS05PV04gJiYgZGUtPmRfdHlwZSAhPSBEVF9ESVIpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RybGVuKGRlLT5kX25hbWUpID49CisJCSAgICAoQlVGX1NJWkUgLSA2NCkgLSAoZGlydGFpbHB0ciAtIHN5c2RpcikpCisJCQljb250aW51ZTsJLyogQmFkbmVzcy4uLiAqLworCisJCXN0cmNweShkaXJ0YWlscHRyLCBkZS0+ZF9uYW1lKTsKKwkJc3lzdGFpbCA9IHN0cmNocihzeXNkaXIsICdcMCcpOworCisJCXN0cmNweShzeXN0YWlsLCAiL2RldiIpOworCQlpZiAoIShzeXNkZXYgPSBmb3BlbihzeXNkaXIsICJyIikpKQorCQkJY29udGludWU7CisKKwkJLyogQWJ1c2luZyB0aGUgbmFtZWJ1ZiBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBoZXJlLiAqLworCQlyZCA9IGZyZWFkKG5hbWVidWYsIDEsIEJVRl9TSVpFLCBzeXNkZXYpOworCQluYW1lYnVmW3JkXSA9ICdcMCc7CS8qIEp1c3QgaW4gY2FzZS4uLiAqLworCisJCWZjbG9zZShzeXNkZXYpOworCisJCW1hID0gc3RydG91bChuYW1lYnVmLCAmZXAsIDEwKTsKKwkJaWYgKG1hICE9IG1ham9yKGRldikgfHwgKmVwICE9ICc6JykKKwkJCWNvbnRpbnVlOworCisJCW1pID0gc3RydG91bChlcCArIDEsICZlcCwgMTApOworCQlpZiAoKmVwICE9ICdcbicpCisJCQljb250aW51ZTsKKworCQlpZiAobWkgPT0gbWlub3IoZGV2KSkgeworCQkJLyogRm91bmQgaXQhICovCisJCQlzdHJjcHkobmFtZWJ1ZiwgZGUtPmRfbmFtZSk7CisJCQlkb25lID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIHdlIGhhdmUgYSBtYWpvciBudW1iZXIgbWF0Y2gsIHNjYW4gZm9yIHBhcnRpdGlvbnMgKi8KKwkJCSpzeXN0YWlsID0gJ1wwJzsKKwkJCWRvbmUgPSBzY2Fuc3lzZGlyKG5hbWVidWYsIHN5c2RpciwgZGV2KTsKKwkJfQorCX0KKworCWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIGRvbmU7Cit9CisKK2NvbnN0IGNoYXIgKmJkZXZuYW1lKGRldl90IGRldikKK3sKKwlzdGF0aWMgY2hhciBidWZbQlVGX1NJWkVdOworCWNoYXIgc3lzZGlyW0JVRl9TSVpFXTsKKwljaGFyICpwOworCisJc3RyY3B5KHN5c2RpciwgIi9zeXMvYmxvY2siKTsKKworCWlmICghc2NhbnN5c2RpcihidWYsIHN5c2RpciwgZGV2KSkKKwkJc3RyY3B5KGJ1ZiwgImRldiIpOwkvKiBwcmludHMgZS5nLiBkZXYoMyw1KSAqLworCisJcCA9IHN0cmNocihidWYsICdcMCcpOworCXNucHJpbnRmKHAsIHNpemVvZiBidWYgLSAocCAtIGJ1ZiksICIoJWQsJWQpIiwgbWFqb3IoZGV2KSwgbWlub3IoZGV2KSk7CisKKwlyZXR1cm4gYnVmOworfQorCisjaWZkZWYgVEVTVF9ERVZOQU1FCQkvKiBTdGFuZGFsb25lIHRlc3QgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlkZXZfdCBkZXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWRldiA9IHN0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7CisKKwkJcHJpbnRmKCIweCUwOHggPSAlc1xuIiwgKHVuc2lnbmVkIGludClkZXYsIGJkZXZuYW1lKGRldikpOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYJCQkJLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2RvX21vdW50cy5jIGIvdXNyL2tpbml0L2RvX21vdW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWEwMDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZG9fbW91bnRzLmMKQEAgLTAsMCArMSwyMjEgQEAKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImRvX21vdW50cy5oIgorI2luY2x1ZGUgImtpbml0LmgiCisjaW5jbHVkZSAiZnN0eXBlLmgiCisjaW5jbHVkZSAiemxpYi5oIgorCisvKiBDcmVhdGUgdGhlIGRldmljZSBub2RlICJuYW1lIiAqLworaW50IGNyZWF0ZV9kZXYoY29uc3QgY2hhciAqbmFtZSwgZGV2X3QgZGV2KQoreworCXVubGluayhuYW1lKTsKKwlyZXR1cm4gbWtub2QobmFtZSwgU19JRkJMSyB8IDA2MDAsIGRldik7Cit9CisKKy8qIG1vdW50IGEgZmlsZXN5c3RlbSwgcG9zc2libHkgdHJ5aW5nIGEgc2V0IG9mIGRpZmZlcmVudCB0eXBlcyAqLworY29uc3QgY2hhciAqbW91bnRfYmxvY2soY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBjaGFyICp0YXJnZXQsCisJCQljb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpmc2xpc3QsICpwLCAqZXA7CisJY29uc3QgY2hhciAqcnA7CisJc3NpemVfdCBmc2J5dGVzOworCWludCBmZDsKKworCWlmICh0eXBlKSB7CisJCURFQlVHKCgia2luaXQ6IHRyeWluZyB0byBtb3VudCAlcyBvbiAlcyB3aXRoIHR5cGUgJXNcbiIsCisJCSAgICAgICBzb3VyY2UsIHRhcmdldCwgdHlwZSkpOworCQlpbnQgcnYgPSBtb3VudChzb3VyY2UsIHRhcmdldCwgdHlwZSwgZmxhZ3MsIGRhdGEpOworCQkvKiBNb3VudCByZWFkb25seSBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKHJ2ID09IC0xICYmIGVycm5vID09IEVBQ0NFUyAmJiAhKGZsYWdzICYgTVNfUkRPTkxZKSkKKwkJCXJ2ID0gbW91bnQoc291cmNlLCB0YXJnZXQsIHR5cGUsIGZsYWdzIHwgTVNfUkRPTkxZLAorCQkJCSAgIGRhdGEpOworCQlyZXR1cm4gcnYgPyBOVUxMIDogdHlwZTsKKwl9CisKKwkvKiBJZiBubyB0eXBlIGdpdmVuLCB0cnkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgZmlyc3Q7IHRoaXMKKwkgICBhbHNvIHRha2VzIGNhcmUgb2Ygc3BlY2lmaWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzLCBsaWtlCisJICAgZXh0MyBiZWZvcmUgZXh0Mi4uLiAqLworCWZkID0gb3Blbihzb3VyY2UsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPj0gMCkgeworCQlpbnQgZXJyID0gaWRlbnRpZnlfZnMoZmQsICZ0eXBlLCBOVUxMLCAwKTsKKwkJY2xvc2UoZmQpOworCisJCWlmICghZXJyICYmIHR5cGUpIHsKKwkJCURFQlVHKCgia2luaXQ6ICVzIGFwcGVhcnMgdG8gYmUgYSAlcyBmaWxlc3lzdGVtXG4iLAorCQkJICAgICAgIHNvdXJjZSwgdHlwZSkpOworCQkJdHlwZSA9IG1vdW50X2Jsb2NrKHNvdXJjZSwgdGFyZ2V0LCB0eXBlLCBmbGFncywgZGF0YSk7CisJCQlpZiAodHlwZSkKKwkJCQlyZXR1cm4gdHlwZTsKKwkJfQorCX0KKworCURFQlVHKCgia2luaXQ6IGZhaWxlZCB0byBpZGVudGlmeSBmaWxlc3lzdGVtICVzLCB0cnlpbmcgYWxsXG4iLAorCSAgICAgICBzb3VyY2UpKTsKKworCWZzYnl0ZXMgPSByZWFkZmlsZSgiL3Byb2MvZmlsZXN5c3RlbXMiLCAmZnNsaXN0KTsKKworCWVycm5vID0gRUlOVkFMOworCWlmIChmc2J5dGVzIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwID0gZnNsaXN0OworCWVwID0gZnNsaXN0ICsgZnNieXRlczsKKworCXJwID0gTlVMTDsKKworCXdoaWxlIChwIDwgZXApIHsKKwkJdHlwZSA9IHA7CisJCXAgPSBzdHJjaHIocCwgJ1xuJyk7CisJCWlmICghcCkKKwkJCWJyZWFrOworCQkqcCsrID0gJ1wwJzsKKwkJaWYgKCp0eXBlICE9ICdcdCcpCS8qIFdlIGNhbid0IG1vdW50IGEgYmxvY2sgZGV2aWNlIGFzIGEgIm5vZGV2IiBmcyAqLworCQkJY29udGludWU7CisKKwkJdHlwZSsrOworCQlycCA9IG1vdW50X2Jsb2NrKHNvdXJjZSwgdGFyZ2V0LCB0eXBlLCBmbGFncywgZGF0YSk7CisJCWlmIChycCkKKwkJCWJyZWFrOworCQlpZiAoZXJybm8gIT0gRUlOVkFMKQorCQkJYnJlYWs7CisJfQorCisJZnJlZShmc2xpc3QpOworCXJldHVybiBycDsKK30KKworLyogbW91bnQgdGhlIHJvb3QgZmlsZXN5c3RlbSBmcm9tIGEgYmxvY2sgZGV2aWNlICovCitzdGF0aWMgaW50Cittb3VudF9ibG9ja19yb290KGludCBhcmdjLCBjaGFyICphcmd2W10sIGRldl90IHJvb3RfZGV2LAorCQkgY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwljb25zdCBjaGFyICpkYXRhLCAqcnA7CisKKwlkYXRhID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAicm9vdGZsYWdzPSIpOworCWNyZWF0ZV9kZXYoIi9kZXYvcm9vdCIsIHJvb3RfZGV2KTsKKworCWVycm5vID0gMDsKKworCWlmICh0eXBlKSB7CisJCWlmICgocnAgPSBtb3VudF9ibG9jaygiL2Rldi9yb290IiwgIi9yb290IiwgdHlwZSwgZmxhZ3MsIGRhdGEpKSkKKwkJCWdvdG8gb2s7CisJCWlmIChlcnJubyAhPSBFSU5WQUwpCisJCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAoIWVycm5vCisJICAgICYmIChycCA9IG1vdW50X2Jsb2NrKCIvZGV2L3Jvb3QiLCAiL3Jvb3QiLCBOVUxMLCBmbGFncywgZGF0YSkpKQorCQlnb3RvIG9rOworCisgICAgICBiYWQ6CisJaWYgKGVycm5vICE9IEVJTlZBTCkgeworCQkvKgorCQkgKiBBbGxvdyB0aGUgdXNlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhaWxlZCBvcGVuCisJCSAqIGFuZCBiYWQgc3VwZXJibG9jayBvbiByb290IGRldmljZS4KKwkJICovCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IENhbm5vdCBvcGVuIHJvb3QgZGV2aWNlICVzXG4iLAorCQkJcHJvZ25hbWUsIGJkZXZuYW1lKHJvb3RfZGV2KSk7CisJCXJldHVybiAtZXJybm87CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogVW5hYmxlIHRvIG1vdW50IHJvb3QgZnMgb24gZGV2aWNlICVzXG4iLAorCQkJcHJvZ25hbWUsIGJkZXZuYW1lKHJvb3RfZGV2KSk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCisgICAgICBvazoKKwlwcmludGYoIiVzOiBNb3VudGVkIHJvb3QgKCVzIGZpbGVzeXN0ZW0pJXMuXG4iLAorCSAgICAgICBwcm9nbmFtZSwgcnAsIChmbGFncyAmIE1TX1JET05MWSkgPyAiIHJlYWRvbmx5IiA6ICIiKTsKKwlyZXR1cm4gMDsKK30KKworaW50Cittb3VudF9yb290KGludCBhcmdjLCBjaGFyICphcmd2W10sIGRldl90IHJvb3RfZGV2LCBjb25zdCBjaGFyICpyb290X2Rldl9uYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBNU19SRE9OTFkgfCBNU19WRVJCT1NFOworCWludCByZXQ7CisJY29uc3QgY2hhciAqdHlwZSA9IGdldF9hcmcoYXJnYywgYXJndiwgInJvb3Rmc3R5cGU9Iik7CisKKwlpZiAoZ2V0X2ZsYWcoYXJnYywgYXJndiwgInJ3IikgPiBnZXRfZmxhZyhhcmdjLCBhcmd2LCAicm8iKSkgeworCQlERUJVRygoImtpbml0OiBtb3VudGluZyByb290IHJ3XG4iKSk7CisJCWZsYWdzICY9IH5NU19SRE9OTFk7CisJfQorCisJaWYgKHR5cGUpIHsKKwkJaWYgKCFzdHJjbXAodHlwZSwgIm5mcyIpKQorCQkJcm9vdF9kZXYgPSBSb290X05GUzsKKwkJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiamZmczIiKSAmJiAhbWFqb3Iocm9vdF9kZXYpKQorCQkJcm9vdF9kZXYgPSBSb290X01URDsKKwl9CisKKwlzd2l0Y2ggKHJvb3RfZGV2KSB7CisJY2FzZSBSb290X05GUzoKKwkJcmV0ID0gbW91bnRfbmZzX3Jvb3QoYXJnYywgYXJndiwgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIFJvb3RfTVREOgorCQlyZXQgPSBtb3VudF9tdGRfcm9vdChhcmdjLCBhcmd2LCByb290X2Rldl9uYW1lLCB0eXBlLCBmbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IG1vdW50X2Jsb2NrX3Jvb3QoYXJnYywgYXJndiwgcm9vdF9kZXYsIHR5cGUsIGZsYWdzKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZXQpCisJCWNoZGlyKCIvcm9vdCIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGRvX21vdW50cyhpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNvbnN0IGNoYXIgKnJvb3RfZGV2X25hbWUgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyb290PSIpOworCWNvbnN0IGNoYXIgKnJvb3RfZGVsYXkgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyb290ZGVsYXk9Iik7CisJY29uc3QgY2hhciAqbG9hZF9yYW1kaXNrID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAibG9hZF9yYW1kaXNrPSIpOworCWRldl90IHJvb3RfZGV2ID0gMDsKKworCURFQlVHKCgia2luaXQ6IGRvX21vdW50c1xuIikpOworCisJaWYgKHJvb3RfZGVsYXkpIHsKKwkJaW50IGRlbGF5ID0gYXRvaShyb290X2RlbGF5KTsKKwkJZnByaW50ZihzdGRlcnIsICJXYWl0aW5nICVkIHMgYmVmb3JlIG1vdW50aW5nIHJvb3QgZGV2aWNlLi4uXG4iLAorCQkJZGVsYXkpOworCQlzbGVlcChkZWxheSk7CisJfQorCisJbWRfcnVuKGFyZ2MsIGFyZ3YpOworCisJaWYgKHJvb3RfZGV2X25hbWUpIHsKKwkJcm9vdF9kZXYgPSBuYW1lX3RvX2Rldl90KHJvb3RfZGV2X25hbWUpOworCX0gZWxzZSBpZiAoZ2V0X2FyZyhhcmdjLCBhcmd2LCAibmZzcm9vdD0iKSB8fAorCQkgICBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJuZnNhZGRycz0iKSkgeworCQlyb290X2RldiA9IFJvb3RfTkZTOworCX0gZWxzZSB7CisJCWxvbmcgcm9vdGRldjsKKwkJZ2V0aW50ZmlsZSgiL3Byb2Mvc3lzL2tlcm5lbC9yZWFsLXJvb3QtZGV2IiwgJnJvb3RkZXYpOworCQlyb290X2RldiA9IChkZXZfdCkgcm9vdGRldjsKKwl9CisKKwlERUJVRygoImtpbml0OiByb290X2RldiA9ICVzXG4iLCBiZGV2bmFtZShyb290X2RldikpKTsKKworCWlmIChpbml0cmRfbG9hZChhcmdjLCBhcmd2LCByb290X2RldikpIHsKKwkJREVCVUcoKCJpbml0cmQgbG9hZGVkXG4iKSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsb2FkX3JhbWRpc2sgJiYgYXRvaShsb2FkX3JhbWRpc2spKSB7CisJCWlmIChyYW1kaXNrX2xvYWQoYXJnYywgYXJndiwgcm9vdF9kZXYpKQorCQkJcm9vdF9kZXYgPSBSb290X1JBTTA7CisJfQorCisJcmV0dXJuIG1vdW50X3Jvb3QoYXJnYywgYXJndiwgcm9vdF9kZXYsIHJvb3RfZGV2X25hbWUpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2RvX21vdW50cy5oIGIvdXNyL2tpbml0L2RvX21vdW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMjRlODYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZG9fbW91bnRzLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIGRvX21vdW50cy5oCisgKi8KKworI2lmbmRlZiBET19NT1VOVFNfSAorI2RlZmluZSBET19NT1VOVFNfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNkZWZpbmUJUm9vdF9SQU0wCV9fbWFrZWRldigxLDApCisKKy8qIFRoZXNlIGRldmljZSBudW1iZXJzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLworI2RlZmluZSBSb290X05GUwlfX21ha2VkZXYoMCwyNTUpCisjZGVmaW5lIFJvb3RfTVRECV9fbWFrZWRldigwLDI1NCkKKworaW50IGNyZWF0ZV9kZXYoY29uc3QgY2hhciAqbmFtZSwgZGV2X3QgZGV2KTsKKworZGV2X3QgbmFtZV90b19kZXZfdChjb25zdCBjaGFyICpuYW1lKTsKKworY29uc3QgY2hhciAqbW91bnRfYmxvY2soY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBjaGFyICp0YXJnZXQsCisJCQljb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJY29uc3Qgdm9pZCAqZGF0YSk7CisKK2ludCBtb3VudF9yb290KGludCBhcmdjLCBjaGFyICphcmd2W10sIGRldl90IHJvb3RfZGV2LAorCSAgICAgICBjb25zdCBjaGFyICpyb290X2Rldl9uYW1lKTsKKworaW50IG1vdW50X210ZF9yb290KGludCBhcmdjLCBjaGFyICphcmd2W10sIGNvbnN0IGNoYXIgKnJvb3RfZGV2X25hbWUsCisJCSAgIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitpbnQgZG9fbW91bnRzKGludCBhcmdjLCBjaGFyICphcmd2W10pOworCitpbnQgaW5pdHJkX2xvYWQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgZGV2X3Qgcm9vdF9kZXYpOworCitzdGF0aWMgaW5saW5lIGRldl90IGJzdGF0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RhdChuYW1lLCAmc3QpIHx8ICFTX0lTQkxLKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc3Quc3RfcmRldjsKK30KKworaW50IGxvYWRfcmFtZGlza19jb21wcmVzc2VkKGNvbnN0IGNoYXIgKmRldnBhdGgsIEZJTEUgKiB3ZmQsCisJCQkgICAgb2ZmX3QgcmFtZGlza19zdGFydCk7CisKKyNlbmRpZgkJCQkvKiBET19NT1VOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2RvX21vdW50c19tZC5jIGIvdXNyL2tpbml0L2RvX21vdW50c19tZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NmZmYmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZG9fbW91bnRzX21kLmMKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBIYW5kbGUgYXV0b2NvbmZpZ3VyYXRpb24gb2YgbWQgZGV2aWNlcy4gIFRoaXMgaXMgdWdseSwgcGFydGlhbGx5IHNpbmNlCisgKiBpdCBzdGlsbCByZWxpZXMgb24gYSBzaXphYmxlIGtlcm5lbCBjb21wb25lbnQuCisgKgorICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgTGludXgga2VybmVsLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL21kLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKworI2luY2x1ZGUgImRvX21vdW50cy5oIgorCisjZGVmaW5lICBMRVZFTF9OT05FICAgICAgICAgICAgICAoLTEwMDAwMDApCisKKy8qCisgKiBXaGVuIG1kIChhbmQgYW55IHJlcXVpcmUgcGVyc29uYWxpdGllcykgYXJlIGNvbXBpbGVkIGludG8gdGhlIGtlcm5lbAorICogKG5vdCBhIG1vZHVsZSksIGFycmF5cyBjYW4gYmUgYXNzZW1ibGVzIGFyZSBib290IHRpbWUgdXNpbmcgd2l0aCBBVVRPREVURUNUCisgKiB3aGVyZSBzcGVjaWFsbHkgbWFya2VkIHBhcnRpdGlvbnMgYXJlIHJlZ2lzdGVyZWQgd2l0aCBtZF9hdXRvZGV0ZWN0X2RldigpLAorICogYW5kIHdpdGggTURfQk9PVCB3aGVyZSBkZXZpY2VzIHRvIGJlIGNvbGxlY3RlZCBhcmUgZ2l2ZW4gb24gdGhlIGJvb3QgbGluZQorICogd2l0aCBtZD0uLi4uLgorICogVGhlIGNvZGUgZm9yIHRoYXQgaXMgaGVyZS4KKyAqLworCitzdGF0aWMgaW50IHJhaWRfbm9hdXRvZGV0ZWN0LCByYWlkX2F1dG9wYXJ0OworCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgbWlub3I7CisJaW50IHBhcnRpdGlvbmVkOworCWludCBsZXZlbDsKKwlpbnQgY2h1bms7CisJY2hhciAqZGV2aWNlX25hbWVzOworfSBtZF9zZXR1cF9hcmdzW01BWF9NRF9ERVZTXTsKKworc3RhdGljIGludCBtZF9zZXR1cF9lbnRzOworCisvKioKKyAqCWdldF9vcHRpb24gLSBQYXJzZSBpbnRlZ2VyIGZyb20gYW4gb3B0aW9uIHN0cmluZworICoJQHN0cjogb3B0aW9uIHN0cmluZworICoJQHBpbnQ6IChvdXRwdXQpIGludGVnZXIgdmFsdWUgcGFyc2VkIGZyb20gQHN0cgorICoKKyAqCVJlYWQgYW4gaW50IGZyb20gYW4gb3B0aW9uIHN0cmluZzsgaWYgYXZhaWxhYmxlIGFjY2VwdCBhIHN1YnNlcXVlbnQKKyAqCWNvbW1hIGFzIHdlbGwuCisgKgorICoJUmV0dXJuIHZhbHVlczoKKyAqCTAgOiBubyBpbnQgaW4gc3RyaW5nCisgKgkxIDogaW50IGZvdW5kLCBubyBzdWJzZXF1ZW50IGNvbW1hCisgKgkyIDogaW50IGZvdW5kIGluY2x1ZGluZyBhIHN1YnNlcXVlbnQgY29tbWEKKyAqLworCitzdGF0aWMgaW50IGdldF9vcHRpb24oY2hhciAqKnN0ciwgaW50ICpwaW50KQoreworCWNoYXIgKmN1ciA9ICpzdHI7CisKKwlpZiAoIWN1ciB8fCAhKCpjdXIpKQorCQlyZXR1cm4gMDsKKwkqcGludCA9IHN0cnRvbChjdXIsIHN0ciwgMCk7CisJaWYgKGN1ciA9PSAqc3RyKQorCQlyZXR1cm4gMDsKKwlpZiAoKipzdHIgPT0gJywnKSB7CisJCSgqc3RyKSsrOworCQlyZXR1cm4gMjsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpbmQgdGhlIHBhcnRpdGlvbmVkIG1kIGRldmljZSBtYWpvciBudW1iZXIuLi4gb2YgY291cnNlIHRoaXMgKkhBRCoKKyAqIHRvIGJlIGRvbmUgZHluYW1pY2FsbHkgaW5zdGVhZCBvZiB1c2luZyBhIHJlZ2lzdGVyZWQgbnVtYmVyLgorICogU2lnaC4gIERvdWJsZSBzaWdoLgorICovCitzdGF0aWMgaW50IG1kcF9tYWpvcih2b2lkKQoreworCXN0YXRpYyBpbnQgZm91bmQgPSAwOworCUZJTEUgKmY7CisJY2hhciBsaW5lWzUxMl0sICpwOworCWludCBpc19ibGssIG1ham9yX25vOworCisJaWYgKGZvdW5kKQorCQlyZXR1cm4gZm91bmQ7CisKKwlmID0gZm9wZW4oIi9wcm9jL2RldmljZXMiLCAiciIpOworCWlzX2JsayA9IDA7CisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZiBsaW5lLCBmKSkgeworCQlpZiAoIXN0cmNtcChsaW5lLCAiQmxvY2sgZGV2aWNlczpcbiIpKQorCQkJaXNfYmxrID0gMTsKKwkJaWYgKGlzX2JsaykgeworCQkJbWFqb3Jfbm8gPSBzdHJ0b2wobGluZSwgJnAsIDEwKTsKKwkJCXdoaWxlICgqcCAmJiBpc3NwYWNlKCpwKSkKKwkJCQlwKys7CisKKwkJCWlmIChtYWpvcl9ubyA9PSAwKQkvKiBOb3QgYSBudW1iZXIgKi8KKwkJCQlpc19ibGsgPSAwOworCQkJZWxzZSBpZiAobWFqb3Jfbm8gPiAwICYmICFzdHJjbXAocCwgIm1kcCIpKSB7CisJCQkJZm91bmQgPSBtYWpvcl9ubzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2UoZik7CisKKwlpZiAoIWZvdW5kKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkVycm9yOiBtZHAgZGV2aWNlcyBkZXRlY3RlZCBidXQgbm8gbWRwIGRldmljZSBmb3VuZCFcbiIpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBjb21tYW5kLWxpbmUgcGFyYW1ldGVycyBnaXZlbiBvdXIga2VybmVsLCBidXQgZG8gbm90CisgKiBhY3R1YWxseSB0cnkgdG8gaW52b2tlIHRoZSBNRCBkZXZpY2Ugbm93OyB0aGF0IGlzIGhhbmRsZWQgYnkKKyAqIG1kX3NldHVwX2RyaXZlIGFmdGVyIHRoZSBsb3ctbGV2ZWwgZGlzayBkcml2ZXJzIGhhdmUgaW5pdGlhbGlzZWQuCisgKgorICogMjcvMTEvMTk5OTogRml4ZWQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgMi4zIGtlcm5lbCAod2hpY2gKKyAqICAgICAgICAgICAgIGFzc2lnbnMgdGhlIHRhc2sgb2YgcGFyc2luZyBpbnRlZ2VyIGFyZ3VtZW50cyB0byB0aGUKKyAqICAgICAgICAgICAgIGludm9rZWQgcHJvZ3JhbSBub3cpLiAgQWRkZWQgYWJpbGl0eSB0byBpbml0aWFsaXNlIGFsbAorICogICAgICAgICAgICAgdGhlIE1EIGRldmljZXMgKGJ5IHNwZWNpZnlpbmcgbXVsdGlwbGUgIm1kPSIgbGluZXMpCisgKiAgICAgICAgICAgICBpbnN0ZWFkIG9mIGp1c3Qgb25lLiAgLS0gS1RLCisgKiAxOE1heTIwMDA6IEFkZGVkIHN1cHBvcnQgZm9yIHBlcnNpc3RlbnQtc3VwZXJibG9jayBhcnJheXM6CisgKiAgICAgICAgICAgICBtZD1uLDAsZmFjdG9yLGZhdWx0LGRldmljZS1saXN0ICAgdXNlcyBSQUlEMCBmb3IgZGV2aWNlIG4KKyAqICAgICAgICAgICAgIG1kPW4sLTEsZmFjdG9yLGZhdWx0LGRldmljZS1saXN0ICB1c2VzIExJTkVBUiBmb3IgZGV2aWNlIG4KKyAqICAgICAgICAgICAgIG1kPW4sZGV2aWNlLWxpc3QgICAgICByZWFkcyBhIFJBSUQgc3VwZXJibG9jayBmcm9tIHRoZSBkZXZpY2VzCisgKiAgICAgICAgICAgICBlbGVtZW50cyBpbiBkZXZpY2UtbGlzdCBhcmUgcmVhZCBieSBuYW1lX3RvX2tkZXZfdCBzbyBjYW4gYmUKKyAqICAgICAgICAgICAgIGEgaGV4IG51bWJlciBvciBzb21ldGhpbmcgbGlrZSAvZGV2L2hkYTEgL2Rldi9zZGIKKyAqIDIwMDEtMDYtMDM6IERhdmUgQ2luZWdlIDxkY2luZWdlQHBzeWNob3Npcy5jb20+CisgKgkJU2hpZnRlZCBuYW1lX3RvX2tkZXZfdCgpIGFuZCByZWxhdGVkIG9wZXJhdGlvbnMgdG8gbWRfc2V0X2RyaXZlKCkKKyAqCQlmb3IgbGF0ZXIgZXhlY3V0aW9uLiBSZXdyb3RlIHNlY3Rpb24gdG8gbWFrZSBkZXZmcyBjb21wYXRpYmxlLgorICovCitzdGF0aWMgaW50IG1kX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgbWlub3IsIGxldmVsLCBmYWN0b3IsIGZhdWx0LCBwYXJ0aXRpb25lZCA9IDA7CisJY2hhciAqcGVybmFtZSA9ICIiOworCWNoYXIgKnN0cjE7CisJaW50IGVudDsKKworCWlmICgqc3RyID09ICdkJykgeworCQlwYXJ0aXRpb25lZCA9IDE7CisJCXN0cisrOworCX0KKwlpZiAoZ2V0X29wdGlvbigmc3RyLCAmbWlub3IpICE9IDIpIHsJLyogTUQgTnVtYmVyICovCisJCWZwcmludGYoc3RkZXJyLCAibWQ6IFRvbyBmZXcgYXJndW1lbnRzIHN1cHBsaWVkIHRvIG1kPS5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJc3RyMSA9IHN0cjsKKwlpZiAobWlub3IgPj0gTUFYX01EX0RFVlMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJtZDogbWQ9JWQsIE1pbm9yIGRldmljZSBudW1iZXIgdG9vIGhpZ2guXG4iLAorCQkJbWlub3IpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChlbnQgPSAwOyBlbnQgPCBtZF9zZXR1cF9lbnRzOyBlbnQrKykKKwkJaWYgKG1kX3NldHVwX2FyZ3NbZW50XS5taW5vciA9PSBtaW5vciAmJgorCQkgICAgbWRfc2V0dXBfYXJnc1tlbnRdLnBhcnRpdGlvbmVkID09IHBhcnRpdGlvbmVkKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkibWQ6IG1kPSVzJWQsIFNwZWNpZmllZCBtb3JlIHRoYW4gb25jZS4gIgorCQkJCSJSZXBsYWNpbmcgcHJldmlvdXMgZGVmaW5pdGlvbi5cbiIsCisJCQkJcGFydGl0aW9uZWQgPyAiZCIgOiAiIiwgbWlub3IpOworCQkJYnJlYWs7CisJCX0KKwlpZiAoZW50ID49IE1BWF9NRF9ERVZTKSB7CisJCWZwcmludGYoc3RkZXJyLCAibWQ6IG1kPSVzJWQgLSB0b28gbWFueSBtZCBpbml0aWFsaXNhdGlvbnNcbiIsCisJCQlwYXJ0aXRpb25lZCA/ICJkIiA6ICIiLCBtaW5vcik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZW50ID49IG1kX3NldHVwX2VudHMpCisJCW1kX3NldHVwX2VudHMrKzsKKwlzd2l0Y2ggKGdldF9vcHRpb24oJnN0ciwgJmxldmVsKSkgewkvKiBSQUlEIGxldmVsICovCisJY2FzZSAyOgkJLyogY291bGQgYmUgMCBvciAtMS4uICovCisJCWlmIChsZXZlbCA9PSAwIHx8IGxldmVsID09IExFVkVMX0xJTkVBUikgeworCQkJaWYgKGdldF9vcHRpb24oJnN0ciwgJmZhY3RvcikgIT0gMiB8fAkvKiBDaHVuayBTaXplICovCisJCQkgICAgZ2V0X29wdGlvbigmc3RyLCAmZmF1bHQpICE9IDIpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIm1kOiBUb28gZmV3IGFyZ3VtZW50cyBzdXBwbGllZCB0byBtZD0uXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW1kX3NldHVwX2FyZ3NbZW50XS5sZXZlbCA9IGxldmVsOworCQkJbWRfc2V0dXBfYXJnc1tlbnRdLmNodW5rID0gMSA8PCAoZmFjdG9yICsgMTIpOworCQkJaWYgKGxldmVsID09IExFVkVMX0xJTkVBUikKKwkJCQlwZXJuYW1lID0gImxpbmVhciI7CisJCQllbHNlCisJCQkJcGVybmFtZSA9ICJyYWlkMCI7CisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwljYXNlIDE6CQkvKiB0aGUgZmlyc3QgZGV2aWNlIGlzIG51bWVyaWMgKi8KKwkJc3RyID0gc3RyMTsKKwkJLyogRkFMTCBUSFJPVUdIICovCisJY2FzZSAwOgorCQltZF9zZXR1cF9hcmdzW2VudF0ubGV2ZWwgPSBMRVZFTF9OT05FOworCQlwZXJuYW1lID0gInN1cGVyLWJsb2NrIjsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIm1kOiBXaWxsIGNvbmZpZ3VyZSBtZCVzJWQgKCVzKSBmcm9tICVzLCBiZWxvdy5cbiIsCisJCXBhcnRpdGlvbmVkPyJfZCI6IiIsIG1pbm9yLCBwZXJuYW1lLCBzdHIpOworCW1kX3NldHVwX2FyZ3NbZW50XS5kZXZpY2VfbmFtZXMgPSBzdHI7CisJbWRfc2V0dXBfYXJnc1tlbnRdLnBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7CisJbWRfc2V0dXBfYXJnc1tlbnRdLm1pbm9yID0gbWlub3I7CisKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBNZHBNaW5vclNoaWZ0IDYKKworc3RhdGljIHZvaWQgbWRfc2V0dXBfZHJpdmUodm9pZCkKK3sKKwlpbnQgZGV2X21pbm9yLCBpLCBlbnQsIHBhcnRpdGlvbmVkOworCWRldl90IGRldjsKKwlkZXZfdCBkZXZpY2VzW01EX1NCX0RJU0tTICsgMV07CisKKwlmb3IgKGVudCA9IDA7IGVudCA8IG1kX3NldHVwX2VudHM7IGVudCsrKSB7CisJCWludCBmZDsKKwkJaW50IGVyciA9IDA7CisJCWNoYXIgKmRldm5hbWU7CisJCW1kdV9kaXNrX2luZm9fdCBkaW5mbzsKKwkJY2hhciBuYW1lWzE2XTsKKworCQlkZXZfbWlub3IgPSBtZF9zZXR1cF9hcmdzW2VudF0ubWlub3I7CisJCXBhcnRpdGlvbmVkID0gbWRfc2V0dXBfYXJnc1tlbnRdLnBhcnRpdGlvbmVkOworCQlkZXZuYW1lID0gbWRfc2V0dXBfYXJnc1tlbnRdLmRldmljZV9uYW1lczsKKworCQlzbnByaW50ZihuYW1lLCBzaXplb2YgbmFtZSwKKwkJCSAiL2Rldi9tZCVzJWQiLCBwYXJ0aXRpb25lZCA/ICJfZCIgOiAiIiwgZGV2X21pbm9yKTsKKworCQlpZiAocGFydGl0aW9uZWQpCisJCQlkZXYgPSBtYWtlZGV2KG1kcF9tYWpvcigpLCBkZXZfbWlub3IgPDwgTWRwTWlub3JTaGlmdCk7CisJCWVsc2UKKwkJCWRldiA9IG1ha2VkZXYoTURfTUFKT1IsIGRldl9taW5vcik7CisJCWNyZWF0ZV9kZXYobmFtZSwgZGV2KTsKKwkJZm9yIChpID0gMDsgaSA8IE1EX1NCX0RJU0tTICYmIGRldm5hbWUgIT0gMDsgaSsrKSB7CisJCQljaGFyICpwOworCisJCQlwID0gc3RyY2hyKGRldm5hbWUsICcsJyk7CisJCQlpZiAocCkKKwkJCQkqcCsrID0gMDsKKworCQkJZGV2ID0gbmFtZV90b19kZXZfdChkZXZuYW1lKTsKKwkJCWlmICghZGV2KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJtZDogVW5rbm93biBkZXZpY2UgbmFtZTogJXNcbiIsCisJCQkJCWRldm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlkZXZpY2VzW2ldID0gZGV2OworCisJCQlkZXZuYW1lID0gcDsKKwkJfQorCQlkZXZpY2VzW2ldID0gMDsKKworCQlpZiAoIWkpCisJCQljb250aW51ZTsKKworCQlmcHJpbnRmKHN0ZGVyciwgIm1kOiBMb2FkaW5nIG1kJXMlZDogJXNcbiIsCisJCQlwYXJ0aXRpb25lZCA/ICJfZCIgOiAiIiwgZGV2X21pbm9yLAorCQkJbWRfc2V0dXBfYXJnc1tlbnRdLmRldmljZV9uYW1lcyk7CisKKwkJZmQgPSBvcGVuKG5hbWUsIDAsIDApOworCQlpZiAoZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm1kOiBvcGVuIGZhaWxlZCAtIGNhbm5vdCBzdGFydCAiCisJCQkJImFycmF5ICVzXG4iLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpb2N0bChmZCwgU0VUX0FSUkFZX0lORk8sIDApID09IC1FQlVTWSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIm1kOiBJZ25vcmluZyBtZD0lZCwgYWxyZWFkeSBhdXRvZGV0ZWN0ZWQuIChVc2UgcmFpZD1ub2F1dG9kZXRlY3QpXG4iLAorCQkJCWRldl9taW5vcik7CisJCQljbG9zZShmZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtZF9zZXR1cF9hcmdzW2VudF0ubGV2ZWwgIT0gTEVWRUxfTk9ORSkgeworCQkJLyogbm9uLXBlcnNpc3RlbnQgKi8KKwkJCW1kdV9hcnJheV9pbmZvX3QgYWluZm87CisJCQlhaW5mby5sZXZlbCA9IG1kX3NldHVwX2FyZ3NbZW50XS5sZXZlbDsKKwkJCWFpbmZvLnNpemUgPSAwOworCQkJYWluZm8ubnJfZGlza3MgPSAwOworCQkJYWluZm8ucmFpZF9kaXNrcyA9IDA7CisJCQl3aGlsZSAoZGV2aWNlc1thaW5mby5yYWlkX2Rpc2tzXSkKKwkJCQlhaW5mby5yYWlkX2Rpc2tzKys7CisJCQlhaW5mby5tZF9taW5vciA9IGRldl9taW5vcjsKKwkJCWFpbmZvLm5vdF9wZXJzaXN0ZW50ID0gMTsKKworCQkJYWluZm8uc3RhdGUgPSAoMSA8PCBNRF9TQl9DTEVBTik7CisJCQlhaW5mby5sYXlvdXQgPSAwOworCQkJYWluZm8uY2h1bmtfc2l6ZSA9IG1kX3NldHVwX2FyZ3NbZW50XS5jaHVuazsKKwkJCWVyciA9IGlvY3RsKGZkLCBTRVRfQVJSQVlfSU5GTywgJmFpbmZvKTsKKwkJCWZvciAoaSA9IDA7ICFlcnIgJiYgaSA8PSBNRF9TQl9ESVNLUzsgaSsrKSB7CisJCQkJZGV2ID0gZGV2aWNlc1tpXTsKKwkJCQlpZiAoIWRldikKKwkJCQkJYnJlYWs7CisJCQkJZGluZm8ubnVtYmVyID0gaTsKKwkJCQlkaW5mby5yYWlkX2Rpc2sgPSBpOworCQkJCWRpbmZvLnN0YXRlID0KKwkJCQkgICAgKDEgPDwgTURfRElTS19BQ1RJVkUpIHwgKDEgPDwgTURfRElTS19TWU5DKTsKKwkJCQlkaW5mby5tYWpvciA9IG1ham9yKGRldik7CisJCQkJZGluZm8ubWlub3IgPSBtaW5vcihkZXYpOworCQkJCWVyciA9IGlvY3RsKGZkLCBBRERfTkVXX0RJU0ssICZkaW5mbyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBwZXJzaXN0ZW50ICovCisJCQlmb3IgKGkgPSAwOyBpIDw9IE1EX1NCX0RJU0tTOyBpKyspIHsKKwkJCQlkZXYgPSBkZXZpY2VzW2ldOworCQkJCWlmICghZGV2KQorCQkJCQlicmVhazsKKwkJCQlkaW5mby5tYWpvciA9IG1ham9yKGRldik7CisJCQkJZGluZm8ubWlub3IgPSBtaW5vcihkZXYpOworCQkJCWlvY3RsKGZkLCBBRERfTkVXX0RJU0ssICZkaW5mbyk7CisJCQl9CisJCX0KKwkJaWYgKCFlcnIpCisJCQllcnIgPSBpb2N0bChmZCwgUlVOX0FSUkFZLCAwKTsKKwkJaWYgKGVycikKKwkJCWZwcmludGYoc3RkZXJyLCAibWQ6IHN0YXJ0aW5nIG1kJWQgZmFpbGVkXG4iLAorCQkJCWRldl9taW5vcik7CisJCWVsc2UgeworCQkJLyogcmVyZWFkIHRoZSBwYXJ0aXRpb24gdGFibGUuCisJCQkgKiBJIChuZWlsYikgYW5kIG5vdCBzdXJlIHdoeSB0aGlzIGlzIG5lZWRlZCwgYnV0IEkgY2Fubm90CisJCQkgKiBib290IGEga2VybmVsIHdpdGggZGV2ZnMgY29tcGlsZWQgaW4gZnJvbSBwYXJ0aXRpb25lZCBtZAorCQkJICogYXJyYXkgd2l0aG91dCBpdAorCQkJICovCisJCQljbG9zZShmZCk7CisJCQlmZCA9IG9wZW4obmFtZSwgMCwgMCk7CisJCQlpb2N0bChmZCwgQkxLUlJQQVJULCAwKTsKKwkJfQorCQljbG9zZShmZCk7CisJfQorfQorCitzdGF0aWMgaW50IHJhaWRfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBsZW4sIHBvczsKKworCWxlbiA9IHN0cmxlbihzdHIpICsgMTsKKwlwb3MgPSAwOworCisJd2hpbGUgKHBvcyA8IGxlbikgeworCQljaGFyICpjb21tYSA9IHN0cmNocihzdHIgKyBwb3MsICcsJyk7CisJCWludCB3bGVuOworCQlpZiAoY29tbWEpCisJCQl3bGVuID0gKGNvbW1hIC0gc3RyKSAtIHBvczsKKwkJZWxzZQorCQkJd2xlbiA9IChsZW4gLSAxKSAtIHBvczsKKworCQlpZiAoIXN0cm5jbXAoc3RyLCAibm9hdXRvZGV0ZWN0Iiwgd2xlbikpCisJCQlyYWlkX25vYXV0b2RldGVjdCA9IDE7CisJCWlmIChzdHJuY21wKHN0ciwgInBhcnRpdGlvbmFibGUiLCB3bGVuKSA9PSAwKQorCQkJcmFpZF9hdXRvcGFydCA9IDE7CisJCWlmIChzdHJuY21wKHN0ciwgInBhcnQiLCB3bGVuKSA9PSAwKQorCQkJcmFpZF9hdXRvcGFydCA9IDE7CisJCXBvcyArPSB3bGVuICsgMTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG1kX3J1bl9zZXR1cCh2b2lkKQoreworCWNyZWF0ZV9kZXYoIi9kZXYvbWQwIiwgbWFrZWRldihNRF9NQUpPUiwgMCkpOworCWlmIChyYWlkX25vYXV0b2RldGVjdCkKKwkJZnByaW50ZihzdGRlcnIsCisJCQkibWQ6IFNraXBwaW5nIGF1dG9kZXRlY3Rpb24gb2YgUkFJRCBhcnJheXMuIChyYWlkPW5vYXV0b2RldGVjdClcbiIpOworCWVsc2UgeworCQlpbnQgZmQgPSBvcGVuKCIvZGV2L21kMCIsIDAsIDApOworCQlpZiAoZmQgPj0gMCkgeworCQkJaW9jdGwoZmQsIFJBSURfQVVUT1JVTiwKKwkJCSAgICAgICh2b2lkICopKGludHB0cl90KSByYWlkX2F1dG9wYXJ0KTsKKwkJCWNsb3NlKGZkKTsKKwkJfQorCX0KKwltZF9zZXR1cF9kcml2ZSgpOworfQorCit2b2lkIG1kX3J1bihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKipwcCwgKnA7CisKKwlmb3IgKHBwID0gYXJndjsgKHAgPSAqcHApOyBwcCsrKSB7CisJCWlmICghc3RybmNtcChwLCAicmFpZD0iLCA1KSkKKwkJCXJhaWRfc2V0dXAocCArIDUpOworCQllbHNlIGlmICghc3RybmNtcChwLCAibWQ9IiwgMykpCisJCQltZF9zZXR1cChwICsgMyk7CisJfQorCisJbWRfcnVuX3NldHVwKCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvZG9fbW91bnRzX210ZC5jIGIvdXNyL2tpbml0L2RvX21vdW50c19tdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjMwOTIwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2RvX21vdW50c19tdGQuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogTW91bnQgYW4gTVREIGRldmljZSBhcyBhIGNoYXJhY3RlciBkZXZpY2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImtpbml0LmgiCisjaW5jbHVkZSAiZG9fbW91bnRzLmgiCisKK2ludCBtb3VudF9tdGRfcm9vdChpbnQgYXJnYywgY2hhciAqYXJndltdLCBjb25zdCBjaGFyICpyb290X2Rldl9uYW1lLAorCQkgICBjb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWNvbnN0IGNoYXIgKmRhdGEgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyb290ZmxhZ3M9Iik7CisKKwlpZiAoIXR5cGUpCisJCXR5cGUgPSAiamZmczIiOworCisJREVCVUcoKCJUcnlpbmcgdG8gbW91bnQgTVREICVzIGFzIHJvb3QgKCVzIGZpbGVzeXN0ZW0pXG4iLAorCSAgICAgICByb290X2Rldl9uYW1lLCB0eXBlKSk7CisKKwlpZiAobW91bnQocm9vdF9kZXZfbmFtZSwgIi9yb290IiwgdHlwZSwgZmxhZ3MsIGRhdGEpKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiJXM6IFVuYWJsZSB0byBtb3VudCBNVEQgJXMgKCVzIGZpbGVzeXN0ZW0pICIKKwkJCSJhcyByb290OiAlc1xuIiwKKwkJCXByb2duYW1lLCByb290X2Rldl9uYW1lLCB0eXBlLCBzdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIC1lcnI7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogTW91bnRlZCByb290ICglcyBmaWxlc3lzdGVtKSVzLlxuIiwKKwkJCXByb2duYW1lLCB0eXBlLCAoZmxhZ3MgJiBNU19SRE9OTFkpID8gIiByZWFkb25seSIgOiAiIik7CisJCXJldHVybiAwOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9LYnVpbGQgYi91c3Iva2luaXQvZnN0eXBlL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjIwZGIxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2ZzdHlwZS9LYnVpbGQKQEAgLTAsMCArMSwyNSBAQAorIworIyBLYnVpbGQgZmlsZSBmb3IgZnN0eXBlCisjCisKK3N0YXRpYy15IDo9IHN0YXRpYy9mc3R5cGUKK3NoYXJlZC15IDo9IHNoYXJlZC9mc3R5cGUKKworIyBjb21tb24gLm8gZmlsZXMKK29ianMgOj0gbWFpbi5vIGZzdHlwZS5vCisKKyMgVE9ETyAtIGRvIHdlIHdhbnQgYSBzdHJpcHBlZCB2ZXJzaW9uCisjIFRPRE8gLSBkbyB3ZSB3YW50IHRoZSBzdGF0aWMuZyArIHNoYXJlZC5nIGRpcmVjdG9yaWVzPworCisjIENyZWF0ZSBidWlsdC1pbi5vIHdpdGggYWxsIG9iamVjdCBmaWxlcyAodXNlZCBieSBraW5pdCkKK2xpYi15IDo9ICQob2JqcykKKworIyAubyBmaWxlcyB1c2VkIHRvIGJ1aWx0IGV4ZWN1dGFibGVzCitzdGF0aWMvZnN0eXBlLXkgOj0gJChvYmpzKQorc2hhcmVkL2ZzdHlwZS15IDo9ICQob2JqcykKKworIyBDbGVhbmluZworY2xlYW4tZGlycyA6PSBzdGF0aWMgc2hhcmVkCisKKyMgaW5zdGFsbCBiaW5hcnkKK2luc3RhbGwteSA6PSAkKHNoYXJlZC15KQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9jcmFtZnNfZnMuaCBiL3Vzci9raW5pdC9mc3R5cGUvY3JhbWZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1YWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvY3JhbWZzX2ZzLmgKQEAgLTAsMCArMSw4NSBAQAorI2lmbmRlZiBfX0NSQU1GU19ICisjZGVmaW5lIF9fQ1JBTUZTX0gKKworI2RlZmluZSBDUkFNRlNfTUFHSUMJCTB4MjhjZDNkNDUJLyogc29tZSByYW5kb20gbnVtYmVyICovCisjZGVmaW5lIENSQU1GU19TSUdOQVRVUkUJIkNvbXByZXNzZWQgUk9NRlMiCisKKy8qCisgKiBXaWR0aCBvZiB2YXJpb3VzIGJpdGZpZWxkcyBpbiBzdHJ1Y3QgY3JhbWZzX2lub2RlLgorICogUHJpbWFyaWx5IHVzZWQgdG8gZ2VuZXJhdGUgd2FybmluZ3MgaW4gbWtjcmFtZnMuCisgKi8KKyNkZWZpbmUgQ1JBTUZTX01PREVfV0lEVEggMTYKKyNkZWZpbmUgQ1JBTUZTX1VJRF9XSURUSCAxNgorI2RlZmluZSBDUkFNRlNfU0laRV9XSURUSCAyNAorI2RlZmluZSBDUkFNRlNfR0lEX1dJRFRIIDgKKyNkZWZpbmUgQ1JBTUZTX05BTUVMRU5fV0lEVEggNgorI2RlZmluZSBDUkFNRlNfT0ZGU0VUX1dJRFRIIDI2CisKKy8qCisgKiBTaW5jZSBpbm9kZS5uYW1lbGVuIGlzIGEgdW5zaWduZWQgNi1iaXQgbnVtYmVyLCB0aGUgbWF4aW11bSBjcmFtZnMKKyAqIHBhdGggbGVuZ3RoIGlzIDYzIDw8IDIgPSAyNTIuCisgKi8KKyNkZWZpbmUgQ1JBTUZTX01BWFBBVEhMRU4gKCgoMSA8PCBDUkFNRlNfTkFNRUxFTl9XSURUSCkgLSAxKSA8PCAyKQorCisvKgorICogUmVhc29uYWJseSB0ZXJzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5vZGUgZGF0YS4KKyAqLworc3RydWN0IGNyYW1mc19pbm9kZSB7CisJX191MzIgbW9kZTpDUkFNRlNfTU9ERV9XSURUSCwgdWlkOkNSQU1GU19VSURfV0lEVEg7CisJLyogU0laRSBmb3IgZGV2aWNlIGZpbGVzIGlzIGlfcmRldiAqLworCV9fdTMyIHNpemU6Q1JBTUZTX1NJWkVfV0lEVEgsIGdpZDpDUkFNRlNfR0lEX1dJRFRIOworCS8qIE5BTUVMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBuYW1lLCBkaXZpZGVkIGJ5IDQgYW5kCisJICAgcm91bmRlZCB1cC4gIChjcmFtZnMgZG9lc24ndCBzdXBwb3J0IGhhcmQgbGlua3MuKSAqLworCS8qIE9GRlNFVDogRm9yIHN5bWxpbmtzIGFuZCBub24tZW1wdHkgcmVndWxhciBmaWxlcywgdGhpcworCSAgIGNvbnRhaW5zIHRoZSBvZmZzZXQgKGRpdmlkZWQgYnkgNCkgb2YgdGhlIGZpbGUgZGF0YSBpbgorCSAgIGNvbXByZXNzZWQgZm9ybSAoc3RhcnRpbmcgd2l0aCBhbiBhcnJheSBvZiBibG9jayBwb2ludGVyczsKKwkgICBzZWUgUkVBRE1FKS4gIEZvciBub24tZW1wdHkgZGlyZWN0b3JpZXMgaXQgaXMgdGhlIG9mZnNldAorCSAgIChkaXZpZGVkIGJ5IDQpIG9mIHRoZSBpbm9kZSBvZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGF0CisJICAgZGlyZWN0b3J5LiAgRm9yIGFueXRoaW5nIGVsc2UsIG9mZnNldCBpcyB6ZXJvLiAqLworCV9fdTMyIG5hbWVsZW46Q1JBTUZTX05BTUVMRU5fV0lEVEgsIG9mZnNldDpDUkFNRlNfT0ZGU0VUX1dJRFRIOworfTsKKworc3RydWN0IGNyYW1mc19pbmZvIHsKKwlfX3UzMiBjcmM7CisJX191MzIgZWRpdGlvbjsKKwlfX3UzMiBibG9ja3M7CisJX191MzIgZmlsZXM7Cit9OworCisvKgorICogU3VwZXJibG9jayBpbmZvcm1hdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBGUy4KKyAqLworc3RydWN0IGNyYW1mc19zdXBlciB7CisJX191MzIgbWFnaWM7CQkvKiAweDI4Y2QzZDQ1IC0gcmFuZG9tIG51bWJlciAqLworCV9fdTMyIHNpemU7CQkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwlfX3UzMiBmbGFnczsJCS8qIGZlYXR1cmUgZmxhZ3MgKi8KKwlfX3UzMiBmdXR1cmU7CQkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCV9fdTggc2lnbmF0dXJlWzE2XTsJLyogIkNvbXByZXNzZWQgUk9NRlMiICovCisJc3RydWN0IGNyYW1mc19pbmZvIGZzaWQ7CS8qIHVuaXF1ZSBmaWxlc3lzdGVtIGluZm8gKi8KKwlfX3U4IG5hbWVbMTZdOwkJLyogdXNlci1kZWZpbmVkIG5hbWUgKi8KKwlzdHJ1Y3QgY3JhbWZzX2lub2RlIHJvb3Q7CS8qIHJvb3QgaW5vZGUgZGF0YSAqLworfTsKKworLyoKKyAqIEZlYXR1cmUgZmxhZ3MKKyAqCisgKiAweDAwMDAwMDAwIC0gMHgwMDAwMDBmZjogZmVhdHVyZXMgdGhhdCB3b3JrIGZvciBhbGwgcGFzdCBrZXJuZWxzCisgKiAweDAwMDAwMTAwIC0gMHhmZmZmZmZmZjogZmVhdHVyZXMgdGhhdCBkb24ndCB3b3JrIGZvciBwYXN0IGtlcm5lbHMKKyAqLworI2RlZmluZSBDUkFNRlNfRkxBR19GU0lEX1ZFUlNJT05fMgkweDAwMDAwMDAxCS8qIGZzaWQgdmVyc2lvbiAjMiAqLworI2RlZmluZSBDUkFNRlNfRkxBR19TT1JURURfRElSUwkJMHgwMDAwMDAwMgkvKiBzb3J0ZWQgZGlycyAqLworI2RlZmluZSBDUkFNRlNfRkxBR19IT0xFUwkJMHgwMDAwMDEwMAkvKiBzdXBwb3J0IGZvciBob2xlcyAqLworI2RlZmluZSBDUkFNRlNfRkxBR19XUk9OR19TSUdOQVRVUkUJMHgwMDAwMDIwMAkvKiByZXNlcnZlZCAqLworI2RlZmluZSBDUkFNRlNfRkxBR19TSElGVEVEX1JPT1RfT0ZGU0VUCTB4MDAwMDA0MDAJLyogc2hpZnRlZCByb290IGZzICovCisKKy8qCisgKiBWYWxpZCB2YWx1ZXMgaW4gc3VwZXIuZmxhZ3MuICBDdXJyZW50bHkgd2UgcmVmdXNlIHRvIG1vdW50CisgKiBpZiAoZmxhZ3MgJiB+Q1JBTUZTX1NVUFBPUlRFRF9GTEFHUykuICBNYXliZSB0aGF0IHNob3VsZCBiZQorICogY2hhbmdlZCB0byB0ZXN0IHN1cGVyLmZ1dHVyZSBpbnN0ZWFkLgorICovCisjZGVmaW5lIENSQU1GU19TVVBQT1JURURfRkxBR1MJKCAweDAwMDAwMGZmIFwKKwkJCQl8IENSQU1GU19GTEFHX0hPTEVTIFwKKwkJCQl8IENSQU1GU19GTEFHX1dST05HX1NJR05BVFVSRSBcCisJCQkJfCBDUkFNRlNfRkxBR19TSElGVEVEX1JPT1RfT0ZGU0VUICkKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL2V4dDJfZnMuaCBiL3Vzci9raW5pdC9mc3R5cGUvZXh0Ml9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2M1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL2V4dDJfZnMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogVGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBtYWdpYyBudW1iZXIKKyAqLworI2RlZmluZSBFWFQyX1NVUEVSX01BR0lDCTB4RUY1MworCisvKgorICogU3RydWN0dXJlIG9mIHRoZSBzdXBlciBibG9jaworICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayB7CisJX19sZTMyIHNfaW5vZGVzX2NvdW50OwkvKiBJbm9kZXMgY291bnQgKi8KKwlfX2xlMzIgc19ibG9ja3NfY291bnQ7CS8qIEJsb2NrcyBjb3VudCAqLworCV9fbGUzMiBzX3JfYmxvY2tzX2NvdW50OwkvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKwlfX2xlMzIgc19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwlfX2xlMzIgc19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwlfX2xlMzIgc19maXJzdF9kYXRhX2Jsb2NrOwkvKiBGaXJzdCBEYXRhIEJsb2NrICovCisJX19sZTMyIHNfbG9nX2Jsb2NrX3NpemU7CS8qIEJsb2NrIHNpemUgKi8KKwlfX2xlMzIgc19sb2dfZnJhZ19zaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJX19sZTMyIHNfYmxvY2tzX3Blcl9ncm91cDsJLyogIyBCbG9ja3MgcGVyIGdyb3VwICovCisJX19sZTMyIHNfZnJhZ3NfcGVyX2dyb3VwOwkvKiAjIEZyYWdtZW50cyBwZXIgZ3JvdXAgKi8KKwlfX2xlMzIgc19pbm9kZXNfcGVyX2dyb3VwOwkvKiAjIElub2RlcyBwZXIgZ3JvdXAgKi8KKwlfX2xlMzIgc19tdGltZTsJCS8qIE1vdW50IHRpbWUgKi8KKwlfX2xlMzIgc193dGltZTsJCS8qIFdyaXRlIHRpbWUgKi8KKwlfX2xlMTYgc19tbnRfY291bnQ7CS8qIE1vdW50IGNvdW50ICovCisJX19sZTE2IHNfbWF4X21udF9jb3VudDsJLyogTWF4aW1hbCBtb3VudCBjb3VudCAqLworCV9fbGUxNiBzX21hZ2ljOwkJLyogTWFnaWMgc2lnbmF0dXJlICovCisJX19sZTE2IHNfc3RhdGU7CQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCV9fbGUxNiBzX2Vycm9yczsJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCV9fbGUxNiBzX21pbm9yX3Jldl9sZXZlbDsJLyogbWlub3IgcmV2aXNpb24gbGV2ZWwgKi8KKwlfX2xlMzIgc19sYXN0Y2hlY2s7CS8qIHRpbWUgb2YgbGFzdCBjaGVjayAqLworCV9fbGUzMiBzX2NoZWNraW50ZXJ2YWw7CS8qIG1heC4gdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworCV9fbGUzMiBzX2NyZWF0b3Jfb3M7CS8qIE9TICovCisJX19sZTMyIHNfcmV2X2xldmVsOwkvKiBSZXZpc2lvbiBsZXZlbCAqLworCV9fbGUxNiBzX2RlZl9yZXN1aWQ7CS8qIERlZmF1bHQgdWlkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwlfX2xlMTYgc19kZWZfcmVzZ2lkOwkvKiBEZWZhdWx0IGdpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGZvciBFWFQyX0RZTkFNSUNfUkVWIHN1cGVyYmxvY2tzIG9ubHkuCisJICoKKwkgKiBOb3RlOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb21wYXRpYmxlIGZlYXR1cmUgc2V0IGFuZAorCSAqIHRoZSBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgaXMgdGhhdCBpZiB0aGVyZSBpcyBhIGJpdCBzZXQKKwkgKiBpbiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IHRoYXQgdGhlIGtlcm5lbCBkb2Vzbid0CisJICoga25vdyBhYm91dCwgaXQgc2hvdWxkIHJlZnVzZSB0byBtb3VudCB0aGUgZmlsZXN5c3RlbS4KKwkgKgorCSAqIGUyZnNjaydzIHJlcXVpcmVtZW50cyBhcmUgbW9yZSBzdHJpY3Q7IGlmIGl0IGRvZXNuJ3Qga25vdworCSAqIGFib3V0IGEgZmVhdHVyZSBpbiBlaXRoZXIgdGhlIGNvbXBhdGlibGUgb3IgaW5jb21wYXRpYmxlCisJICogZmVhdHVyZSBzZXQsIGl0IG11c3QgYWJvcnQgYW5kIG5vdCB0cnkgdG8gbWVkZGxlIHdpdGgKKwkgKiB0aGluZ3MgaXQgZG9lc24ndCB1bmRlcnN0YW5kLi4uCisJICovCisJX19sZTMyIHNfZmlyc3RfaW5vOwkvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgKi8KKwlfX2xlMTYgc19pbm9kZV9zaXplOwkvKiBzaXplIG9mIGlub2RlIHN0cnVjdHVyZSAqLworCV9fbGUxNiBzX2Jsb2NrX2dyb3VwX25yOwkvKiBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jayAqLworCV9fbGUzMiBzX2ZlYXR1cmVfY29tcGF0OwkvKiBjb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX19sZTMyIHNfZmVhdHVyZV9pbmNvbXBhdDsJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX19sZTMyIHNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX3U4IHNfdXVpZFsxNl07CS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisJY2hhciBzX3ZvbHVtZV9uYW1lWzE2XTsJLyogdm9sdW1lIG5hbWUgKi8KKwljaGFyIHNfbGFzdF9tb3VudGVkWzY0XTsJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworCV9fbGUzMiBzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7CS8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUMl9DT01QQVRfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwlfX3U4IHNfcHJlYWxsb2NfYmxvY2tzOwkvKiBOciBvZiBibG9ja3MgdG8gdHJ5IHRvIHByZWFsbG9jYXRlICovCisJX191OCBzX3ByZWFsbG9jX2Rpcl9ibG9ja3M7CS8qIE5yIHRvIHByZWFsbG9jYXRlIGZvciBkaXJzICovCisJX191MTYgc19wYWRkaW5nMTsKKwkvKgorCSAqIEpvdXJuYWxpbmcgc3VwcG9ydCB2YWxpZCBpZiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMIHNldC4KKwkgKi8KKwlfX3U4IHNfam91cm5hbF91dWlkWzE2XTsJLyogdXVpZCBvZiBqb3VybmFsIHN1cGVyYmxvY2sgKi8KKwlfX3UzMiBzX2pvdXJuYWxfaW51bTsJLyogaW5vZGUgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyIHNfam91cm5hbF9kZXY7CS8qIGRldmljZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX191MzIgc19sYXN0X29ycGhhbjsJLyogc3RhcnQgb2YgbGlzdCBvZiBpbm9kZXMgdG8gZGVsZXRlICovCisJX191MzIgc19oYXNoX3NlZWRbNF07CS8qIEhUUkVFIGhhc2ggc2VlZCAqLworCV9fdTggc19kZWZfaGFzaF92ZXJzaW9uOwkvKiBEZWZhdWx0IGhhc2ggdmVyc2lvbiB0byB1c2UgKi8KKwlfX3U4IHNfcmVzZXJ2ZWRfY2hhcl9wYWQ7CisJX191MTYgc19yZXNlcnZlZF93b3JkX3BhZDsKKwlfX2xlMzIgc19kZWZhdWx0X21vdW50X29wdHM7CisJX19sZTMyIHNfZmlyc3RfbWV0YV9iZzsJLyogRmlyc3QgbWV0YWJsb2NrIGJsb2NrIGdyb3VwICovCisJX191MzIgc19yZXNlcnZlZFsxOTBdOwkvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9leHQzX2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL2V4dDNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWMxYmRkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2ZzdHlwZS9leHQzX2ZzLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gbWFnaWMgbnVtYmVyCisgKi8KKyNkZWZpbmUgRVhUM19TVVBFUl9NQUdJQyAgICAgICAgMHhFRjUzCisKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCAgICAgICAgIDB4MDAwNAorCisvKgorICogU3RydWN0dXJlIG9mIHRoZSBzdXBlciBibG9jaworICovCitzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayB7CisJCQkJCS8qMDAqLyBfX3UzMiBzX2lub2Rlc19jb3VudDsKKwkJCQkJLyogSW5vZGVzIGNvdW50ICovCisJX191MzIgc19ibG9ja3NfY291bnQ7CS8qIEJsb2NrcyBjb3VudCAqLworCV9fdTMyIHNfcl9ibG9ja3NfY291bnQ7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCV9fdTMyIHNfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJCQkJCQkvKjEwKi8gX191MzIgc19mcmVlX2lub2Rlc19jb3VudDsKKwkJCQkJCS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX191MzIgc19maXJzdF9kYXRhX2Jsb2NrOwkvKiBGaXJzdCBEYXRhIEJsb2NrICovCisJX191MzIgc19sb2dfYmxvY2tfc2l6ZTsJLyogQmxvY2sgc2l6ZSAqLworCV9fczMyIHNfbG9nX2ZyYWdfc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJCQkJLyoyMCovIF9fdTMyIHNfYmxvY2tzX3Blcl9ncm91cDsKKwkJCQkJCS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCV9fdTMyIHNfZnJhZ3NfcGVyX2dyb3VwOwkvKiAjIEZyYWdtZW50cyBwZXIgZ3JvdXAgKi8KKwlfX3UzMiBzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLworCV9fdTMyIHNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisJCQkJLyozMCovIF9fdTMyIHNfd3RpbWU7CisJCQkJLyogV3JpdGUgdGltZSAqLworCV9fdTE2IHNfbW50X2NvdW50OwkvKiBNb3VudCBjb3VudCAqLworCV9fczE2IHNfbWF4X21udF9jb3VudDsJLyogTWF4aW1hbCBtb3VudCBjb3VudCAqLworCV9fdTE2IHNfbWFnaWM7CQkvKiBNYWdpYyBzaWduYXR1cmUgKi8KKwlfX3UxNiBzX3N0YXRlOwkJLyogRmlsZSBzeXN0ZW0gc3RhdGUgKi8KKwlfX3UxNiBzX2Vycm9yczsJCS8qIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMgKi8KKwlfX3UxNiBzX21pbm9yX3Jldl9sZXZlbDsJLyogbWlub3IgcmV2aXNpb24gbGV2ZWwgKi8KKwkJCQkJLyo0MCovIF9fdTMyIHNfbGFzdGNoZWNrOworCQkJCQkvKiB0aW1lIG9mIGxhc3QgY2hlY2sgKi8KKwlfX3UzMiBzX2NoZWNraW50ZXJ2YWw7CS8qIG1heC4gdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworCV9fdTMyIHNfY3JlYXRvcl9vczsJLyogT1MgKi8KKwlfX3UzMiBzX3Jldl9sZXZlbDsJLyogUmV2aXNpb24gbGV2ZWwgKi8KKwkJCQkJLyo1MCovIF9fdTE2IHNfZGVmX3Jlc3VpZDsKKwkJCQkJLyogRGVmYXVsdCB1aWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCV9fdTE2IHNfZGVmX3Jlc2dpZDsJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUM19EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICoKKwkgKiBlMmZzY2sncyByZXF1aXJlbWVudHMgYXJlIG1vcmUgc3RyaWN0OyBpZiBpdCBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBhIGZlYXR1cmUgaW4gZWl0aGVyIHRoZSBjb21wYXRpYmxlIG9yIGluY29tcGF0aWJsZQorCSAqIGZlYXR1cmUgc2V0LCBpdCBtdXN0IGFib3J0IGFuZCBub3QgdHJ5IHRvIG1lZGRsZSB3aXRoCisJICogdGhpbmdzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgorCSAqLworCV9fdTMyIHNfZmlyc3RfaW5vOwkvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgKi8KKwlfX3UxNiBzX2lub2RlX3NpemU7CS8qIHNpemUgb2YgaW5vZGUgc3RydWN0dXJlICovCisJX191MTYgc19ibG9ja19ncm91cF9ucjsJLyogYmxvY2sgZ3JvdXAgIyBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KKwlfX3UzMiBzX2ZlYXR1cmVfY29tcGF0OwkvKiBjb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJCQkJCQkvKjYwKi8gX191MzIgc19mZWF0dXJlX2luY29tcGF0OworCQkJCQkJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX191MzIgc19mZWF0dXJlX3JvX2NvbXBhdDsJLyogcmVhZG9ubHktY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCQkJCS8qNjgqLyBfX3U4IHNfdXVpZFsxNl07CisJCQkJLyogMTI4LWJpdCB1dWlkIGZvciB2b2x1bWUgKi8KKwkJCQkJLyo3OCovIGNoYXIgc192b2x1bWVfbmFtZVsxNl07CisJCQkJCS8qIHZvbHVtZSBuYW1lICovCisJCQkJCS8qODgqLyBjaGFyIHNfbGFzdF9tb3VudGVkWzY0XTsKKwkJCQkJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworCQkJCQkJLypDOCovIF9fdTMyIHNfYWxnb3JpdGhtX3VzYWdlX2JpdG1hcDsKKwkJCQkJCS8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUM19GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwlfX3U4IHNfcHJlYWxsb2NfYmxvY2tzOwkvKiBOciBvZiBibG9ja3MgdG8gdHJ5IHRvIHByZWFsbG9jYXRlICovCisJX191OCBzX3ByZWFsbG9jX2Rpcl9ibG9ja3M7CS8qIE5yIHRvIHByZWFsbG9jYXRlIGZvciBkaXJzICovCisJX191MTYgc19wYWRkaW5nMTsKKwkvKgorCSAqIEpvdXJuYWxpbmcgc3VwcG9ydCB2YWxpZCBpZiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMIHNldC4KKwkgKi8KKwkJCQkJLypEMCovIF9fdTggc19qb3VybmFsX3V1aWRbMTZdOworCQkJCQkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworCQkJCQkvKkUwKi8gX191MzIgc19qb3VybmFsX2ludW07CisJCQkJCS8qIGlub2RlIG51bWJlciBvZiBqb3VybmFsIGZpbGUgKi8KKwlfX3UzMiBzX2pvdXJuYWxfZGV2OwkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyIHNfbGFzdF9vcnBoYW47CS8qIHN0YXJ0IG9mIGxpc3Qgb2YgaW5vZGVzIHRvIGRlbGV0ZSAqLworCV9fdTMyIHNfaGFzaF9zZWVkWzRdOwkvKiBIVFJFRSBoYXNoIHNlZWQgKi8KKwlfX3U4IHNfZGVmX2hhc2hfdmVyc2lvbjsJLyogRGVmYXVsdCBoYXNoIHZlcnNpb24gdG8gdXNlICovCisJX191OCBzX3Jlc2VydmVkX2NoYXJfcGFkOworCV9fdTE2IHNfcmVzZXJ2ZWRfd29yZF9wYWQ7CisJX191MzIgc19yZXNlcnZlZFsxOTJdOwkvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9mc3R5cGUuYyBiL3Vzci9raW5pdC9mc3R5cGUvZnN0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiZTdkNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvZnN0eXBlLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBieSBybWsKKyAqCisgKiBEZXRlY3QgZmlsZXN5c3RlbSB0eXBlIChvbiBzdGRpbikgYW5kIG91dHB1dCBzdHJpbmdzIGZvciB0d28KKyAqIGVudmlyb25tZW50IHZhcmlhYmxlczoKKyAqICBGU1RZUEUgLSBmaWxlc3lzdGVtIHR5cGUKKyAqICBGU1NJWkUgLSBmaWxlc3lzdGVtIHNpemUgKGlmIGtub3duKQorICoKKyAqIFdlIGN1cnJlbnRseSBkZXRlY3QgdGhlIGZpbGVzeXN0ZW1zIGxpc3RlZCBiZWxvdyBpbiB0aGUgc3RydWN0CisgKiAiaW1hZ2V0eXBlIGltYWdlcyIgKGluIHRoZSBvcmRlciB0aGV5IGFyZSBsaXN0ZWQpLgorICoKKyAqIE1JTklYLCBleHQzIGFuZCBSZWlzZXJmcyBiaXRzIGFyZSBjdXJyZW50bHkgdW50ZXN0ZWQuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCisjZGVmaW5lIGNwdV90b19iZTMyKHgpIF9fY3B1X3RvX2JlMzIoeCkJLyogTmVlZGVkIGJ5IHJvbWZzX2ZzLmggKi8KKworI2luY2x1ZGUgInJvbWZzX2ZzLmgiCisjaW5jbHVkZSAiY3JhbWZzX2ZzLmgiCisjaW5jbHVkZSAibWluaXhfZnMuaCIKKyNpbmNsdWRlICJleHQyX2ZzLmgiCisjaW5jbHVkZSAiZXh0M19mcy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgImx1a3NfZnMuaCIKKyNpbmNsdWRlICJsdm0yX3NiLmgiCisjaW5jbHVkZSAiaXNvOTY2MF9zYi5oIgorCisvKgorICogU2xpZ2h0bHkgY2xlYW5lZCB1cCB2ZXJzaW9uIG9mIGpmc19zdXBlcmJsb2NrIHRvCisgKiBhdm9pZCBwdWxsaW5nIGluIG90aGVyIGtlcm5lbCBoZWFkZXIgZmlsZXMuCisgKi8KKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorCisvKgorICogcmVpc2VyZnNfZnMuaCBpcyB0b28gc2ljayB0byBpbmNsdWRlIGRpcmVjdGx5LgorICogVXNlIGEgY2xlYW5lZCB1cCB2ZXJzaW9uLgorICovCisjaW5jbHVkZSAicmVpc2VyZnNfZnMuaCIKKworI2luY2x1ZGUgImZzdHlwZS5oIgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkJKHNpemVvZih4KSAvIHNpemVvZih4WzBdKSkKKworI2RlZmluZSBCTE9DS19TSVpFIDEwMjQKKworLyogU3dhcCBuZWVkcyB0aGUgZGVmaW5pdGlvbiBvZiBibG9jayBzaXplICovCisjaW5jbHVkZSAic3dhcF9mcy5oIgorCitzdGF0aWMgaW50IGd6aXBfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CisKKwlpZiAocFswXSA9PSAwMzcgJiYgKHBbMV0gPT0gMDIxMyB8fCBwWzFdID09IDAyMzYpKSB7CisJCS8qIFRoZSBsZW5ndGggb2YgYSBnemlwIHN0cmVhbSBjYW4gb25seSBiZSBkZXRlcm1pbmVkCisJCSAgIGJ5IHByb2Nlc3NpbmcgdGhlIHdob2xlIHN0cmVhbSAqLworCQkqYnl0ZXMgPSAwVUxMOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JhbWZzX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpieXRlcykKK3sKKwljb25zdCBzdHJ1Y3QgY3JhbWZzX3N1cGVyICpzYiA9IChjb25zdCBzdHJ1Y3QgY3JhbWZzX3N1cGVyICopYnVmOworCisJaWYgKHNiLT5tYWdpYyA9PSBDUkFNRlNfTUFHSUMpIHsKKwkJaWYgKHNiLT5mbGFncyAmIENSQU1GU19GTEFHX0ZTSURfVkVSU0lPTl8yKQorCQkJKmJ5dGVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZylzYi0+ZnNpZC5ibG9ja3MgPDwgMTA7CisJCWVsc2UKKwkJCSpieXRlcyA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb21mc19pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMpCit7CisJY29uc3Qgc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICpzYiA9CisJICAgIChjb25zdCBzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoc2ItPndvcmQwID09IFJPTVNCX1dPUkQwICYmIHNiLT53b3JkMSA9PSBST01TQl9XT1JEMSkgeworCQkqYnl0ZXMgPSBfX2JlMzJfdG9fY3B1KHNiLT5zaXplKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1pbml4X2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpieXRlcykKK3sKKwljb25zdCBzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKnNiID0KKwkgICAgKGNvbnN0IHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChzYi0+c19tYWdpYyA9PSBNSU5JWF9TVVBFUl9NQUdJQyB8fAorCSAgICBzYi0+c19tYWdpYyA9PSBNSU5JWF9TVVBFUl9NQUdJQzIpIHsKKwkJKmJ5dGVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZylzYi0+c19uem9uZXMKKwkJICAgIDw8IChzYi0+c19sb2dfem9uZV9zaXplICsgMTApOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMpCit7CisJY29uc3Qgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKnNiID0KKwkgICAgKGNvbnN0IHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHNiLT5zX21hZ2ljID09IF9fY3B1X3RvX2xlMTYoRVhUMl9TVVBFUl9NQUdJQykgJiYKKwkgICAgc2ItPgorCSAgICBzX2ZlYXR1cmVfY29tcGF0ICYgX19jcHVfdG9fbGUzMihFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkgeworCQkqYnl0ZXMgPSAodW5zaWduZWQgbG9uZyBsb25nKV9fbGUzMl90b19jcHUoc2ItPnNfYmxvY2tzX2NvdW50KQorCQkgICAgPDwgKDEwICsgX19sZTMyX3RvX2NwdShzYi0+c19sb2dfYmxvY2tfc2l6ZSkpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMpCit7CisJY29uc3Qgc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKnNiID0KKwkgICAgKGNvbnN0IHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKHNiLT5zX21hZ2ljID09IF9fY3B1X3RvX2xlMTYoRVhUMl9TVVBFUl9NQUdJQykpIHsKKwkJKmJ5dGVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZylfX2xlMzJfdG9fY3B1KHNiLT5zX2Jsb2Nrc19jb3VudCkKKwkJICAgIDw8ICgxMCArIF9fbGUzMl90b19jcHUoc2ItPnNfbG9nX2Jsb2NrX3NpemUpKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpieXRlcykKK3sKKwljb25zdCBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnNiID0KKwkgICAgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJ1ZjsKKworCWlmIChtZW1jbXAoUkVJU0VSRlNfTUFHSUMoc2IpLCBSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcsCisJCSAgIHNpemVvZihSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcpIC0gMSkgPT0gMCB8fAorCSAgICBtZW1jbXAoUkVJU0VSRlNfTUFHSUMoc2IpLCBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HLAorCQkgICBzaXplb2YoUkVJU0VSMkZTX1NVUEVSX01BR0lDX1NUUklORykgLSAxKSA9PSAwIHx8CisJICAgIG1lbWNtcChSRUlTRVJGU19NQUdJQyhzYiksIFJFSVNFUjJGU19KUl9TVVBFUl9NQUdJQ19TVFJJTkcsCisJCSAgIHNpemVvZihSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HKSAtIDEpID09IDApIHsKKwkJKmJ5dGVzID0gKHVuc2lnbmVkIGxvbmcgbG9uZylSRUlTRVJGU19CTE9DS19DT1VOVChzYikgKgorCQkgICAgUkVJU0VSRlNfQkxPQ0tTSVpFKHNiKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhmc19pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMpCit7CisJY29uc3Qgc3RydWN0IHhmc19zYiAqc2IgPSAoY29uc3Qgc3RydWN0IHhmc19zYiAqKWJ1ZjsKKworCWlmIChfX2JlMzJfdG9fY3B1KHNiLT5zYl9tYWdpY251bSkgPT0gWEZTX1NCX01BR0lDKSB7CisJCSpieXRlcyA9IF9fYmU2NF90b19jcHUoc2ItPnNiX2RibG9ja3MpICoKKwkJICAgIF9fYmUzMl90b19jcHUoc2ItPnNiX2Jsb2Nrc2l6ZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZnNfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzKQoreworCWNvbnN0IHN0cnVjdCBqZnNfc3VwZXJibG9jayAqc2IgPSAoY29uc3Qgc3RydWN0IGpmc19zdXBlcmJsb2NrICopYnVmOworCisJaWYgKCFtZW1jbXAoc2ItPnNfbWFnaWMsIEpGU19NQUdJQywgNCkpIHsKKwkJKmJ5dGVzID0gX19sZTMyX3RvX2NwdShzYi0+c19zaXplKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGx1a3NfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2NrcykKK3sKKwljb25zdCBzdHJ1Y3QgbHVrc19wYXJ0aXRpb25faGVhZGVyICpscGggPQorCSAgICAoY29uc3Qgc3RydWN0IGx1a3NfcGFydGl0aW9uX2hlYWRlciAqKWJ1ZjsKKworCWlmICghbWVtY21wKGxwaC0+bWFnaWMsIExVS1NfTUFHSUMsIExVS1NfTUFHSUNfTCkpIHsKKwkJLyogRlNTSVpFIGlzIGRpY3RhdGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGZzLCBub3QgYnkgTFVLUyAqLworCQkqYmxvY2tzID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN3YXBfaW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2NrcykKK3sKKwljb25zdCBzdHJ1Y3Qgc3dhcF9zdXBlcl9ibG9jayAqc3NiID0KKwkgICAgKGNvbnN0IHN0cnVjdCBzd2FwX3N1cGVyX2Jsb2NrICopYnVmOworCisJaWYgKCFtZW1jbXAoc3NiLT5tYWdpYywgU1dBUF9NQUdJQ18xLCBTV0FQX01BR0lDX0wpIHx8CisJICAgICFtZW1jbXAoc3NiLT5tYWdpYywgU1dBUF9NQUdJQ18yLCBTV0FQX01BR0lDX0wpKSB7CisJCSpibG9ja3MgPSAwOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VzcGVuZF9pbWFnZShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYmxvY2tzKQoreworCWNvbnN0IHN0cnVjdCBzd2FwX3N1cGVyX2Jsb2NrICpzc2IgPQorCSAgICAoY29uc3Qgc3RydWN0IHN3YXBfc3VwZXJfYmxvY2sgKilidWY7CisKKwlpZiAoIW1lbWNtcChzc2ItPm1hZ2ljLCBTVVNQX01BR0lDXzEsIFNVU1BfTUFHSUNfTCkgfHwKKwkgICAgIW1lbWNtcChzc2ItPm1hZ2ljLCBTVVNQX01BR0lDXzIsIFNVU1BfTUFHSUNfTCkgfHwKKwkgICAgIW1lbWNtcChzc2ItPm1hZ2ljLCBTVVNQX01BR0lDX1UsIFNVU1BfTUFHSUNfTCkpIHsKKwkJKmJsb2NrcyA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdm0yX2ltYWdlKGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICpibG9ja3MpCit7CisJY29uc3Qgc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgKmxzYjsKKwlpbnQgaTsKKworCS8qIFdlIG11c3QgY2hlY2sgZXZlcnkgNTEyIGJ5dGUgc2VjdG9yICovCisJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkU7IGkgKz0gMHgyMDApIHsKKwkJbHNiID0gKGNvbnN0IHN0cnVjdCBsdm0yX3N1cGVyX2Jsb2NrICopKGJ1ZiArIGkpOworCisJCWlmICghbWVtY21wKGxzYi0+bWFnaWMsIExWTTJfTUFHSUMsIExWTTJfTUFHSUNfTCkgJiYKKwkJICAgICFtZW1jbXAobHNiLT50eXBlLCBMVk0yX1RZUEUsIExWTTJfVFlQRV9MKSkgeworCQkJLyogVGhpcyBpcyBqdXN0IG9uZSBvZiBwb3NzaWJseSBtYW55IFBWJ3MgKi8KKwkJCSpibG9ja3MgPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc29faW1hZ2UoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2NrcykKK3sKKwljb25zdCBzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICppc292ZCA9CisJICAgIChjb25zdCBzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICopYnVmOworCWNvbnN0IHN0cnVjdCBpc29faHNfdm9sdW1lX2Rlc2NyaXB0b3IgKmlzb2hzdmQgPQorCSAgICAoY29uc3Qgc3RydWN0IGlzb19oc192b2x1bWVfZGVzY3JpcHRvciAqKWJ1ZjsKKworCWlmICghbWVtY21wKGlzb3ZkLT5pZCwgSVNPX01BR0lDLCBJU09fTUFHSUNfTCkgfHwKKwkgICAgIW1lbWNtcChpc29oc3ZkLT5pZCwgSVNPX0hTX01BR0lDLCBJU09fSFNfTUFHSUNfTCkpIHsKKwkJKmJsb2NrcyA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGltYWdldHlwZSB7CisJb2ZmX3QgYmxvY2s7CisJY29uc3QgY2hhciBuYW1lWzEyXTsKKwlpbnQgKCppZGVudGlmeSkgKGNvbnN0IHZvaWQgKiwgdW5zaWduZWQgbG9uZyBsb25nICopOworfTsKKworLyoKKyAqIE5vdGU6CisgKgorICogTWluaXggdGVzdCBuZWVkcyB0byBjb21lIGFmdGVyIGV4dDMvZXh0Miwgc2luY2UgaXQncyBwb3NzaWJsZSBmb3IKKyAqIGV4dDMvZXh0MiB0byBsb29rIGxpa2UgbWluaXggYnkgcHVyZSByYW5kb20gY2hhbmNlLgorICoKKyAqIExWTSBjb21lcyBhZnRlciBhbGwgb3RoZXIgZmlsZXN5c3RlbXMgc2luY2UgaXQncyBwb3NzaWJsZQorICogdGhhdCBhbiBvbGQgbHZtIHNpZ25hdHVyZSBpcyBsZWZ0IG9uIHRoZSBkaXNrIGlmIHB2cmVtb3ZlCisgKiBpcyBub3QgdXNlZCBiZWZvcmUgY3JlYXRpbmcgdGhlIG5ldyBmcy4KKyAqCisgKiBUaGUgc2FtZSBnb2VzIGZvciBMVUtTIGFzIGZvciBMVk0uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW1hZ2V0eXBlIGltYWdlc1tdID0geworCXswLCAiZ3ppcCIsIGd6aXBfaW1hZ2V9LAorCXswLCAiY3JhbWZzIiwgY3JhbWZzX2ltYWdlfSwKKwl7MCwgInJvbWZzIiwgcm9tZnNfaW1hZ2V9LAorCXswLCAieGZzIiwgeGZzX2ltYWdlfSwKKwl7MSwgImV4dDMiLCBleHQzX2ltYWdlfSwKKwl7MSwgImV4dDIiLCBleHQyX2ltYWdlfSwKKwl7MSwgIm1pbml4IiwgbWluaXhfaW1hZ2V9LAorCXs4LCAicmVpc2VyZnMiLCByZWlzZXJmc19pbWFnZX0sCisJezY0LCAicmVpc2VyZnMiLCByZWlzZXJmc19pbWFnZX0sCisJezMyLCAiamZzIiwgamZzX2ltYWdlfSwKKwl7MzIsICJpc285NjYwIiwgaXNvX2ltYWdlfSwKKwl7MCwgImx1a3MiLCBsdWtzX2ltYWdlfSwKKwl7MCwgImx2bTIiLCBsdm0yX2ltYWdlfSwKKwl7MSwgImx2bTIiLCBsdm0yX2ltYWdlfSwKKwl7LTEsICJzd2FwIiwgc3dhcF9pbWFnZX0sCisJey0xLCAic3VzcGVuZCIsIHN1c3BlbmRfaW1hZ2V9LAorCXswLCAiIiwgTlVMTH0KK307CisKK2ludCBpZGVudGlmeV9mcyhpbnQgZmQsIGNvbnN0IGNoYXIgKipmc3R5cGUsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqYnl0ZXMsIG9mZl90IG9mZnNldCkKK3sKKwl1aW50NjRfdCBidWZbQkxPQ0tfU0laRSA+PiAzXTsJLyogNjQtYml0IHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisJb2ZmX3QgY3VyX2Jsb2NrID0gKG9mZl90KSAtIDE7CisJc3RydWN0IGltYWdldHlwZSAqaXA7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZHVtbXk7CisKKwlpZiAoIWJ5dGVzKQorCQlieXRlcyA9ICZkdW1teTsKKworCSpmc3R5cGUgPSBOVUxMOworCSpieXRlcyA9IDA7CisKKwlmb3IgKGlwID0gaW1hZ2VzOyBpcC0+aWRlbnRpZnk7IGlwKyspIHsKKwkJLyogSGFjayBmb3Igc3dhcCwgd2hpY2ggYXBwYXJlbnRseSBpcyBkZXBlbmRlbnQgb24gcGFnZSBzaXplICovCisJCWlmIChpcC0+YmxvY2sgPT0gLTEpCisJCQlpcC0+YmxvY2sgPSBTV0FQX09GRlNFVCgpOworCisJCWlmIChjdXJfYmxvY2sgIT0gaXAtPmJsb2NrKSB7CisJCQkvKgorCQkJICogUmVhZCBibG9jay4KKwkJCSAqLworCQkJY3VyX2Jsb2NrID0gaXAtPmJsb2NrOworCQkJcmV0ID0gcHJlYWQoZmQsIGJ1ZiwgQkxPQ0tfU0laRSwKKwkJCQkgICAgb2Zmc2V0ICsgY3VyX2Jsb2NrICogQkxPQ0tfU0laRSk7CisJCQlpZiAocmV0ICE9IEJMT0NLX1NJWkUpCisJCQkJcmV0dXJuIC0xOwkvKiBlcnJvciAqLworCQl9CisKKwkJaWYgKGlwLT5pZGVudGlmeShidWYsIGJ5dGVzKSkgeworCQkJKmZzdHlwZSA9IGlwLT5uYW1lOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsJCS8qIFVua25vd24gZmlsZXN5c3RlbSAqLworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9mc3R5cGUuaCBiL3Vzci9raW5pdC9mc3R5cGUvZnN0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiMTlkZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvZnN0eXBlLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGJ5IHJtaworICoKKyAqIERldGVjdCBmaWxlc3lzdGVtIHR5cGUgKG9uIHN0ZGluKSBhbmQgb3V0cHV0IHN0cmluZ3MgZm9yIHR3bworICogZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICogIEZTVFlQRSAtIGZpbGVzeXN0ZW0gdHlwZQorICogIEZTU0laRSAtIGZpbGVzeXN0ZW0gc2l6ZSAoaWYga25vd24pCisgKgorICogV2UgY3VycmVudGx5IGRldGVjdCAoaW4gb3JkZXIpOgorICogIGd6aXAsIGNyYW1mcywgcm9tZnMsIHhmcywgbWluaXgsIGV4dDMsIGV4dDIsIHJlaXNlcmZzLCBqZnMKKyAqCisgKiBNSU5JWCwgZXh0MyBhbmQgUmVpc2VyZnMgYml0cyBhcmUgY3VycmVudGx5IHVudGVzdGVkLgorICovCisKKyNpZm5kZWYgRlNUWVBFX0gKKyNkZWZpbmUgRlNUWVBFX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgaWRlbnRpZnlfZnMoaW50IGZkLCBjb25zdCBjaGFyICoqZnN0eXBlLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKmJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvaXNvOTY2MF9zYi5oIGIvdXNyL2tpbml0L2ZzdHlwZS9pc285NjYwX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlMDczMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvaXNvOTY2MF9zYi5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX19JU085NjYwX1NCX0gKKyNkZWZpbmUgX19JU085NjYwX1NCX0gKKworI2RlZmluZSBJU09fTUFHSUNfTAk1CisjZGVmaW5lIElTT19NQUdJQwkiQ0QwMDEiCisjZGVmaW5lIElTT19IU19NQUdJQ19MCTUKKyNkZWZpbmUgSVNPX0hTX01BR0lDCSJDRFJPTSIKKworLyogSVNPOTY2MCBWb2x1bWUgRGVzY3JpcHRvciAqLworc3RydWN0IGlzb192b2x1bWVfZGVzY3JpcHRvciB7CisJX191OCB0eXBlOworCWNoYXIgaWRbSVNPX01BR0lDX0xdOworCV9fdTggdmVyc2lvbjsKK307CisKKy8qIEhpZ2ggU2llcnJhIFZvbHVtZSBEZXNjcmlwdG9yICovCitzdHJ1Y3QgaXNvX2hzX3ZvbHVtZV9kZXNjcmlwdG9yIHsKKwljaGFyIGZvb1s4XTsKKwlfX3U4IHR5cGU7CisJY2hhciBpZFtJU09fSFNfTUFHSUNfTF07CisJX191OCB2ZXJzaW9uOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL2pmc19zdXBlcmJsb2NrLmggYi91c3Iva2luaXQvZnN0eXBlL2pmc19zdXBlcmJsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxMzJhMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvamZzX3N1cGVyYmxvY2suaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDMKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZglfSF9KRlNfU1VQRVJCTE9DSworI2RlZmluZSBfSF9KRlNfU1VQRVJCTE9DSworCitzdHJ1Y3QgdGltZXN0cnVjX3QgeworCV9fbGUzMiB0dl9zZWM7CisJX19sZTMyIHR2X25zZWM7Cit9OworCisvKgorICogbWFrZSB0aGUgbWFnaWMgbnVtYmVyIHNvbWV0aGluZyBhIGh1bWFuIGNvdWxkIHJlYWQKKyAqLworI2RlZmluZSBKRlNfTUFHSUMgCSJKRlMxIgkvKiBNYWdpYyB3b3JkICovCisKKyNkZWZpbmUgSkZTX1ZFUlNJT04JMgkvKiBWZXJzaW9uIG51bWJlcjogVmVyc2lvbiAyICovCisKKyNkZWZpbmUgTFZfTkFNRV9TSVpFCTExCS8qIE1VU1QgQkUgMTEgZm9yIE9TLzIgYm9vdCBzZWN0b3IgKi8KKworLyoKKyAqCWFnZ3JlZ2F0ZSBzdXBlcmJsb2NrCisgKgorICogVGhlIG5hbWUgc3VwZXJibG9jayBpcyB0b28gY2xvc2UgdG8gc3VwZXJfYmxvY2ssIHNvIHRoZSBuYW1lIGhhcyBiZWVuCisgKiBjaGFuZ2VkIHRvIGpmc19zdXBlcmJsb2NrLiAgVGhlIHV0aWxpdGllcyBhcmUgc3RpbGwgdXNpbmcgdGhlIG9sZCBuYW1lLgorICovCitzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgeworCWNoYXIgc19tYWdpY1s0XTsJLyogNDogbWFnaWMgbnVtYmVyICovCisJX19sZTMyIHNfdmVyc2lvbjsJLyogNDogdmVyc2lvbiBudW1iZXIgKi8KKworCV9fbGU2NCBzX3NpemU7CQkvKiA4OiBhZ2dyZWdhdGUgc2l6ZSBpbiBoYXJkd2FyZS9MVk0gYmxvY2tzOworCQkJCSAqIFZGUzogbnVtYmVyIG9mIGJsb2NrcworCQkJCSAqLworCV9fbGUzMiBzX2JzaXplOwkJLyogNDogYWdncmVnYXRlIGJsb2NrIHNpemUgaW4gYnl0ZXM7CisJCQkJICogVkZTOiBmcmFnbWVudCBzaXplCisJCQkJICovCisJX19sZTE2IHNfbDJic2l6ZTsJLyogMjogbG9nMiBvZiBzX2JzaXplICovCisJX19sZTE2IHNfbDJiZmFjdG9yOwkvKiAyOiBsb2cyKHNfYnNpemUvaGFyZHdhcmUgYmxvY2sgc2l6ZSkgKi8KKwlfX2xlMzIgc19wYnNpemU7CS8qIDQ6IGhhcmR3YXJlL0xWTSBibG9jayBzaXplIGluIGJ5dGVzICovCisJX19sZTE2IHNfbDJwYnNpemU7CS8qIDI6IGxvZzIgb2Ygc19wYnNpemUgKi8KKwlfX2xlMTYgcGFkOwkJLyogMjogcGFkZGluZyBuZWNlc3NhcnkgZm9yIGFsaWdubWVudCAqLworCisJX19sZTMyIHNfYWdzaXplOwkvKiA0OiBhbGxvY2F0aW9uIGdyb3VwIHNpemUgaW4gYWdnci4gYmxvY2tzICovCisKKwlfX2xlMzIgc19mbGFnOwkJLyogNDogYWdncmVnYXRlIGF0dHJpYnV0ZXM6CisJCQkJICogICAgc2VlIGpmc19maWxzeXMuaAorCQkJCSAqLworCV9fbGUzMiBzX3N0YXRlOwkJLyogNDogbW91bnQvdW5tb3VudC9yZWNvdmVyeSBzdGF0ZToKKwkJCQkgKiAgICBzZWUgamZzX2ZpbHN5cy5oCisJCQkJICovCisJX19sZTMyIHNfY29tcHJlc3M7CS8qIDQ6ID4gMCBpZiBkYXRhIGNvbXByZXNzaW9uICovCisKKwlfX2xlNjQgc19haXQyOwkJLyogODogZmlyc3QgZXh0ZW50IG9mIHNlY29uZGFyeQorCQkJCSAqICAgIGFnZ3JlZ2F0ZSBpbm9kZSB0YWJsZQorCQkJCSAqLworCisJX19sZTY0IHNfYWltMjsJCS8qIDg6IGZpcnN0IGV4dGVudCBvZiBzZWNvbmRhcnkKKwkJCQkgKiAgICBhZ2dyZWdhdGUgaW5vZGUgbWFwCisJCQkJICovCisJX19sZTMyIHNfbG9nZGV2OwkvKiA0OiBkZXZpY2UgYWRkcmVzcyBvZiBsb2cgKi8KKwlfX2xlMzIgc19sb2dzZXJpYWw7CS8qIDQ6IGxvZyBzZXJpYWwgbnVtYmVyIGF0IGFnZ3JlZ2F0ZSBtb3VudCAqLworCV9fbGU2NCBzX2xvZ3B4ZDsJLyogODogaW5saW5lIGxvZyBleHRlbnQgKi8KKworCV9fbGU2NCBzX2ZzY2tweGQ7CS8qIDg6IGlubGluZSBmc2NrIHdvcmsgc3BhY2UgZXh0ZW50ICovCisKKwlzdHJ1Y3QgdGltZXN0cnVjX3Qgc190aW1lOwkvKiA4OiB0aW1lIGxhc3QgdXBkYXRlZCAqLworCisJX19sZTMyIHNfZnNja2xvZ2xlbjsJLyogNDogTnVtYmVyIG9mIGZpbGVzeXN0ZW0gYmxvY2tzIHJlc2VydmVkIGZvcgorCQkJCSAqICAgIHRoZSBmc2NrIHNlcnZpY2UgbG9nLgorCQkJCSAqICAgIE4uQi4gVGhlc2UgYmxvY2tzIGFyZSBkaXZpZGVkIGFtb25nIHRoZQorCQkJCSAqICAgICAgICAgdmVyc2lvbnMga2VwdC4gIFRoaXMgaXMgbm90IGEgcGVyCisJCQkJICogICAgICAgICB2ZXJzaW9uIHNpemUuCisJCQkJICogICAgTi5CLiBUaGVzZSBibG9ja3MgYXJlIGluY2x1ZGVkIGluIHRoZQorCQkJCSAqICAgICAgICAgbGVuZ3RoIGZpZWxkIG9mIHNfZnNja3B4ZC4KKwkJCQkgKi8KKwljaGFyIHNfZnNja2xvZzsJCS8qIDE6IHdoaWNoIGZzY2sgc2VydmljZSBsb2cgaXMgbW9zdCByZWNlbnQKKwkJCQkgKiAgICAwID0+IG5vIHNlcnZpY2UgbG9nIGRhdGEgeWV0CisJCQkJICogICAgMSA9PiB0aGUgZmlyc3Qgb25lCisJCQkJICogICAgMiA9PiB0aGUgMm5kIG9uZQorCQkJCSAqLworCWNoYXIgc19mcGFja1sxMV07CS8qIDExOiBmaWxlIHN5c3RlbSB2b2x1bWUgbmFtZQorCQkJCSAqICAgICBOLkIuIFRoaXMgbXVzdCBiZSAxMSBieXRlcyB0bworCQkJCSAqICAgICAgICAgIGNvbmZvcm0gd2l0aCB0aGUgT1MvMiBCb290U2VjdG9yCisJCQkJICogICAgICAgICAgcmVxdWlyZW1lbnRzCisJCQkJICogICAgICAgICAgT25seSB1c2VkIHdoZW4gc192ZXJzaW9uIGlzIDEKKwkJCQkgKi8KKworCS8qIGV4dGVuZGZzKCkgcGFyYW1ldGVyIHVuZGVyIHNfc3RhdGUgJiBGTV9FWFRFTkRGUyAqLworCV9fbGU2NCBzX3hzaXplOwkJLyogODogZXh0ZW5kZnMgc19zaXplICovCisJX19sZTY0IHNfeGZzY2tweGQ7CS8qIDg6IGV4dGVuZGZzIGZzY2tweGQgKi8KKwlfX2xlNjQgc194bG9ncHhkOwkvKiA4OiBleHRlbmRmcyBsb2dweGQgKi8KKwkvKiAtIDEyOCBieXRlIGJvdW5kYXJ5IC0gKi8KKworCWNoYXIgc191dWlkWzE2XTsJLyogMTY6IDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lICovCisJY2hhciBzX2xhYmVsWzE2XTsJLyogMTY6IHZvbHVtZSBsYWJlbCAqLworCWNoYXIgc19sb2d1dWlkWzE2XTsJLyogMTY6IDEyOC1iaXQgdXVpZCBmb3IgbG9nIGRldmljZSAqLworCit9OworCisjZW5kaWYgLypfSF9KRlNfU1VQRVJCTE9DSyAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS9sdWtzX2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL2x1a3NfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDhkZTMxNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvbHVrc19mcy5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX19MSU5VWF9MVUtTX0ZTX0gKKyNkZWZpbmUgX19MSU5VWF9MVUtTX0ZTX0gKKworLyogVGhlIGJhc2ljIHN0cnVjdHVyZXMgb2YgdGhlIGx1a3MgcGFydGl0aW9uIGhlYWRlciAqLworI2RlZmluZSBMVUtTX01BR0lDX0wJCTYKKyNkZWZpbmUgTFVLU19DSVBIRVJOQU1FX0wJMzIKKyNkZWZpbmUgTFVLU19DSVBIRVJNT0RFX0wJMzIKKyNkZWZpbmUgTFVLU19IQVNIU1BFQ19MCQkzMgorI2RlZmluZSBMVUtTX1VVSURfU1RSSU5HX0wJNDAKKworI2RlZmluZSBMVUtTX01BR0lDCQkiTFVLU1x4QkFceEJFIgorI2RlZmluZSBMVUtTX0RJR0VTVFNJWkUJCTIwCisjZGVmaW5lIExVS1NfU0FMVFNJWkUJCTMyCisjZGVmaW5lIExVS1NfTlVNS0VZUwkJOAorI2RlZmluZSBMVUtTX01LRF9JVEVSCQkxMAorI2RlZmluZSBMVUtTX0tFWV9ESVNBQkxFRAkweDAwMDBERUFECisjZGVmaW5lIExVS1NfS0VZX0VOQUJMRUQJMHgwMEFDNzFGMworI2RlZmluZSBMVUtTX1NUUklQRVMJCTQwMDAKKworLyogT24tZGlzayAic3VwZXIgYmxvY2siICovCitzdHJ1Y3QgbHVrc19wYXJ0aXRpb25faGVhZGVyIHsKKwljaGFyCW1hZ2ljW0xVS1NfTUFHSUNfTF07CisJX19iZTE2CXZlcnNpb247CisJY2hhcgljaXBoZXJOYW1lW0xVS1NfQ0lQSEVSTkFNRV9MXTsKKwljaGFyCWNpcGhlck1vZGVbTFVLU19DSVBIRVJNT0RFX0xdOworCWNoYXIJaGFzaFNwZWNbTFVLU19IQVNIU1BFQ19MXTsKKwlfX2JlMzIJcGF5bG9hZE9mZnNldDsKKwlfX2JlMzIJa2V5Qnl0ZXM7CisJY2hhcglta0RpZ2VzdFtMVUtTX0RJR0VTVFNJWkVdOworCWNoYXIJbWtEaWdlc3RTYWx0W0xVS1NfU0FMVFNJWkVdOworCV9fYmUzMglta0RpZ2VzdEl0ZXJhdGlvbnM7CisJY2hhcgl1dWlkW0xVS1NfVVVJRF9TVFJJTkdfTF07CisKKwlzdHJ1Y3QgeworCQlfX2JlMzIJYWN0aXZlOworCQkvKiBQYXJhbWV0ZXJzIGZvciBQQktERjIgcHJvY2Vzc2luZyAqLworCQlfX2JlMzIJcGFzc3dvcmRJdGVyYXRpb25zOworCQljaGFyCXBhc3N3b3JkU2FsdFtMVUtTX1NBTFRTSVpFXTsKKwkJX19iZTMyCWtleU1hdGVyaWFsT2Zmc2V0OworCQlfX2JlMzIJc3RyaXBlczsKKwl9IGtleWJsb2NrW0xVS1NfTlVNS0VZU107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvbHZtMl9zYi5oIGIvdXNyL2tpbml0L2ZzdHlwZS9sdm0yX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkZmMxMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvbHZtMl9zYi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX19MVk0yX1NCX0gKKyNkZWZpbmUgX19MVk0yX1NCX0gKKworLyogTFZNMiBzdXBlciBibG9jayBkZWZpbml0aW9ucyAqLworI2RlZmluZSBMVk0yX01BR0lDX0wJCTgKKyNkZWZpbmUgTFZNMl9NQUdJQwkJIkxBQkVMT05FIgorI2RlZmluZSBMVk0yX1RZUEVfTAkJOAorI2RlZmluZSBMVk0yX1RZUEUJCSJMVk0yIDAwMSIKKworc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgeworCWNoYXIgbWFnaWNbTFZNMl9NQUdJQ19MXTsKKwlfX2JlNjQgc2VjdG9yOworCV9fYmUzMiBjcmM7CisJX19iZTMyIG9mZnNldDsKKwljaGFyIHR5cGVbTFZNMl9UWVBFX0xdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL21haW4uYyBiL3Vzci9raW5pdC9mc3R5cGUvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZWI1OTMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL21haW4uYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogYnkgcm1rCisgKgorICogRGV0ZWN0IGZpbGVzeXN0ZW0gdHlwZSAob24gc3RkaW4pIGFuZCBvdXRwdXQgc3RyaW5ncyBmb3IgdHdvCisgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgKiAgRlNUWVBFIC0gZmlsZXN5c3RlbSB0eXBlCisgKiAgRlNTSVpFIC0gZmlsZXN5c3RlbSBzaXplIChpZiBrbm93bikKKyAqCisgKiBXZSBjdXJyZW50bHkgZGV0ZWN0IChpbiBvcmRlcik6CisgKiAgZ3ppcCwgY3JhbWZzLCByb21mcywgeGZzLCBtaW5peCwgZXh0MywgZXh0MiwgcmVpc2VyZnMsIGpmcworICoKKyAqIE1JTklYLCBleHQzIGFuZCBSZWlzZXJmcyBiaXRzIGFyZSBjdXJyZW50bHkgdW50ZXN0ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZzdHlwZS5oIgorCitjaGFyICpwcm9nbmFtZTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmQgPSAwOworCWludCBydjsKKwljb25zdCBjaGFyICpmc3R5cGU7CisJY29uc3QgY2hhciAqZmlsZSA9ICJzdGRpbiI7CisJdW5zaWduZWQgbG9uZyBsb25nIGJ5dGVzOworCisJcHJvZ25hbWUgPSBhcmd2WzBdOworCisJaWYgKGFyZ2MgPiAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtmaWxlXVxuIiwgcHJvZ25hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoYXJnYyA+IDEgJiYgIShhcmd2WzFdWzBdID09ICctJyAmJiBhcmd2WzFdWzFdID09ICdcMCcpKSB7CisJCWZkID0gb3BlbihmaWxlID0gYXJndlsxXSwgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwKSB7CisJCQlwZXJyb3IoYXJndlsxXSk7CisJCQlyZXR1cm4gMjsKKwkJfQorCX0KKworCXJ2ID0gaWRlbnRpZnlfZnMoZmQsICZmc3R5cGUsICZieXRlcywgMCk7CisJaWYgKHJ2ID09IC0xKSB7CisJCXBlcnJvcihmaWxlKTsKKwkJcmV0dXJuIDI7CisJfQorCisJZnN0eXBlID0gZnN0eXBlID8gZnN0eXBlIDogInVua25vd24iOworCisJZnByaW50ZihzdGRvdXQsICJGU1RZUEU9JXNcbkZTU0laRT0lbGx1XG4iLCBmc3R5cGUsIGJ5dGVzKTsKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL21pbml4X2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL21pbml4X2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4OTlmMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvbWluaXhfZnMuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIF9MSU5VWF9NSU5JWF9GU19ICisjZGVmaW5lIF9MSU5VWF9NSU5JWF9GU19ICisKKy8qCisgKiBUaGUgbWluaXggZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcworICovCisKKy8qCisgKiBUaGFua3MgdG8gS2VlcyBKIEJvdCBmb3Igc2VuZGluZyBtZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG5ldworICogbWluaXggZmlsZXN5c3RlbSAoYWthIFYyKSB3aXRoIGJpZ2dlciBpbm9kZXMgYW5kIDMyLWJpdCBibG9jaworICogcG9pbnRlcnMuCisgKi8KKworI2RlZmluZSBNSU5JWF9ST09UX0lOTyAxCisKKy8qIE5vdCB0aGUgc2FtZSBhcyB0aGUgYm9ndXMgTElOS19NQVggaW4gPGxpbnV4L2xpbWl0cy5oPi4gT2ggd2VsbC4gKi8KKyNkZWZpbmUgTUlOSVhfTElOS19NQVgJMjUwCisjZGVmaW5lIE1JTklYMl9MSU5LX01BWAk2NTUzMAorCisjZGVmaW5lIE1JTklYX0lfTUFQX1NMT1RTCTgKKyNkZWZpbmUgTUlOSVhfWl9NQVBfU0xPVFMJNjQKKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCisjZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDMgkweDEzOEYJLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDCTB4MjQ2OAkvKiBtaW5peCBWMiBmcyAqLworI2RlZmluZSBNSU5JWDJfU1VQRVJfTUFHSUMyCTB4MjQ3OAkvKiBtaW5peCBWMiBmcywgMzAgY2hhciBuYW1lcyAqLworI2RlZmluZSBNSU5JWF9WQUxJRF9GUwkJMHgwMDAxCS8qIENsZWFuIGZzLiAqLworI2RlZmluZSBNSU5JWF9FUlJPUl9GUwkJMHgwMDAyCS8qIGZzIGhhcyBlcnJvcnMuICovCisKKyNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQorI2RlZmluZSBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peDJfaW5vZGUpKSkKKworLyoKKyAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIG1pbml4IGlub2RlIGxheW91dCBvbiBkaXNrLgorICogTm90ZSB0aGUgOC1iaXQgZ2lkIGFuZCBhdGltZSBhbmQgY3RpbWUuCisgKi8KK3N0cnVjdCBtaW5peF9pbm9kZSB7CisJX191MTYgaV9tb2RlOworCV9fdTE2IGlfdWlkOworCV9fdTMyIGlfc2l6ZTsKKwlfX3UzMiBpX3RpbWU7CisJX191OCAgaV9naWQ7CisJX191OCAgaV9ubGlua3M7CisJX191MTYgaV96b25lWzldOworfTsKKworLyoKKyAqIFRoZSBuZXcgbWluaXggaW5vZGUgaGFzIGFsbCB0aGUgdGltZSBlbnRyaWVzLCBhcyB3ZWxsIGFzCisgKiBsb25nIGJsb2NrIG51bWJlcnMgYW5kIGEgdGhpcmQgaW5kaXJlY3QgYmxvY2sgKDcrMSsxKzEKKyAqIGluc3RlYWQgb2YgNysxKzEpLiBBbHNvLCBzb21lIHByZXZpb3VzbHkgOC1iaXQgdmFsdWVzIGFyZQorICogbm93IDE2LWJpdC4gVGhlIGlub2RlIGlzIG5vdyA2NCBieXRlcyBpbnN0ZWFkIG9mIDMyLgorICovCitzdHJ1Y3QgbWluaXgyX2lub2RlIHsKKwlfX3UxNiBpX21vZGU7CisJX191MTYgaV9ubGlua3M7CisJX191MTYgaV91aWQ7CisJX191MTYgaV9naWQ7CisJX191MzIgaV9zaXplOworCV9fdTMyIGlfYXRpbWU7CisJX191MzIgaV9tdGltZTsKKwlfX3UzMiBpX2N0aW1lOworCV9fdTMyIGlfem9uZVsxMF07Cit9OworCisvKgorICogbWluaXggc3VwZXItYmxvY2sgZGF0YSBvbiBkaXNrCisgKi8KK3N0cnVjdCBtaW5peF9zdXBlcl9ibG9jayB7CisJX191MTYgc19uaW5vZGVzOworCV9fdTE2IHNfbnpvbmVzOworCV9fdTE2IHNfaW1hcF9ibG9ja3M7CisJX191MTYgc196bWFwX2Jsb2NrczsKKwlfX3UxNiBzX2ZpcnN0ZGF0YXpvbmU7CisJX191MTYgc19sb2dfem9uZV9zaXplOworCV9fdTMyIHNfbWF4X3NpemU7CisJX191MTYgc19tYWdpYzsKKwlfX3UxNiBzX3N0YXRlOworCV9fdTMyIHNfem9uZXM7Cit9OworCitzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5IHsKKwlfX3UxNiBpbm9kZTsKKwljaGFyICBuYW1lWzBdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL3JlaXNlcmZzX2ZzLmggYi91c3Iva2luaXQvZnN0eXBlL3JlaXNlcmZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0Nzk5NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUvcmVpc2VyZnNfZnMuaApAQCAtMCwwICsxLDY5IEBACitzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgeworCV9fdTMyIGpwX2pvdXJuYWxfMXN0X2Jsb2NrOwkvKiB3aGVyZSBkb2VzIGpvdXJuYWwgc3RhcnQgZnJvbSBvbiBpdHMKKwkJCQkJICogZGV2aWNlICovCisJX191MzIganBfam91cm5hbF9kZXY7CS8qIGpvdXJuYWwgZGV2aWNlIHN0X3JkZXYgKi8KKwlfX3UzMiBqcF9qb3VybmFsX3NpemU7CS8qIHNpemUgb2YgdGhlIGpvdXJuYWwgKi8KKwlfX3UzMiBqcF9qb3VybmFsX3RyYW5zX21heDsJLyogbWF4IG51bWJlciBvZiBibG9ja3MgaW4gYSB0cmFuc2FjdGlvbi4gKi8KKwlfX3UzMiBqcF9qb3VybmFsX21hZ2ljOwkvKiByYW5kb20gdmFsdWUgbWFkZSBvbiBmcyBjcmVhdGlvbiAodGhpcworCQkJCSAqIHdhcyBzYl9qb3VybmFsX2Jsb2NrX2NvdW50KSAqLworCV9fdTMyIGpwX2pvdXJuYWxfbWF4X2JhdGNoOwkvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyB0byBiYXRjaCBpbnRvIGEKKwkJCQkJICogdHJhbnMgKi8KKwlfX3UzMiBqcF9qb3VybmFsX21heF9jb21taXRfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhbiBhc3luYworCQkJCQkJICogY29tbWl0IGJlICovCisJX191MzIganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhIHRyYW5zYWN0aW9uCisJCQkJCSAqIGJlICovCit9OworCisvKiB0aGlzIGlzIHRoZSBzdXBlciBmcm9tIDMuNS5YLCB3aGVyZSBYID49IDEwICovCitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgeworCV9fdTMyIHNfYmxvY2tfY291bnQ7CS8qIGJsb2NrcyBjb3VudCAgICAgICAgICovCisJX191MzIgc19mcmVlX2Jsb2NrczsJLyogZnJlZSBibG9ja3MgY291bnQgICAgKi8KKwlfX3UzMiBzX3Jvb3RfYmxvY2s7CS8qIHJvb3QgYmxvY2sgbnVtYmVyICAgICovCisJc3RydWN0IGpvdXJuYWxfcGFyYW1zIHNfam91cm5hbDsKKwlfX3UxNiBzX2Jsb2Nrc2l6ZTsJLyogYmxvY2sgc2l6ZSAqLworCV9fdTE2IHNfb2lkX21heHNpemU7CS8qIG1heCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSwgc2VlCisJCQkJICogZ2V0X29iamVjdGlkKCkgY29tbWVudGFyeSAgKi8KKwlfX3UxNiBzX29pZF9jdXJzaXplOwkvKiBjdXJyZW50IHNpemUgb2Ygb2JqZWN0IGlkIGFycmF5ICovCisJX191MTYgc191bW91bnRfc3RhdGU7CS8qIHRoaXMgaXMgc2V0IHRvIDEgd2hlbiBmaWxlc3lzdGVtIHdhcworCQkJCSAqIHVtb3VudGVkLCB0byAyIC0gd2hlbiBub3QgKi8KKwljaGFyIHNfbWFnaWNbMTBdOwkvKiByZWlzZXJmcyBtYWdpYyBzdHJpbmcgaW5kaWNhdGVzIHRoYXQKKwkJCQkgKiBmaWxlIHN5c3RlbSBpcyByZWlzZXJmczoKKwkJCQkgKiAiUmVJc0VyRnMiIG9yICJSZUlzRXIyRnMiIG9yICJSZUlzRXIzRnMiICovCisJX191MTYgc19mc19zdGF0ZTsJLyogaXQgaXMgc2V0IHRvIHVzZWQgYnkgZnNjayB0byBtYXJrIHdoaWNoCisJCQkJICogcGhhc2Ugb2YgcmVidWlsZGluZyBpcyBkb25lICovCisJX191MzIgc19oYXNoX2Z1bmN0aW9uX2NvZGU7CS8qIGluZGljYXRlLCB3aGF0IGhhc2ggZnVuY3Rpb24gaXMgYmVpbmcgdXNlCisJCQkJCSAqIHRvIHNvcnQgbmFtZXMgaW4gYSBkaXJlY3RvcnkqLworCV9fdTE2IHNfdHJlZV9oZWlnaHQ7CS8qIGhlaWdodCBvZiBkaXNrIHRyZWUgKi8KKwlfX3UxNiBzX2JtYXBfbnI7CS8qIGFtb3VudCBvZiBiaXRtYXAgYmxvY2tzIG5lZWRlZCB0byBhZGRyZXNzCisJCQkJICogZWFjaCBibG9jayBvZiBmaWxlIHN5c3RlbSAqLworCV9fdTE2IHNfdmVyc2lvbjsJLyogdGhpcyBmaWVsZCBpcyBvbmx5IHJlbGlhYmxlIG9uIGZpbGVzeXN0ZW0KKwkJCQkgKiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsICovCisJX191MTYgc19yZXNlcnZlZF9mb3Jfam91cm5hbDsJLyogc2l6ZSBpbiBibG9ja3Mgb2Ygam91cm5hbCBhcmVhIG9uIG1haW4KKwkJCQkJICogZGV2aWNlLCB3ZSBuZWVkIHRvIGtlZXAgYWZ0ZXIKKwkJCQkJICogbWFraW5nIGZzIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyogdGhpcyBpcyB0aGUgb24gZGlzayBzdXBlciBibG9jayAqLworc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrIHsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgc192MTsKKwlfX3UzMiBzX2lub2RlX2dlbmVyYXRpb247CisJX191MzIgc19mbGFnczsJCS8qIFJpZ2h0IG5vdyB1c2VkIG9ubHkgYnkgaW5vZGUtYXR0cmlidXRlcywgaWYgZW5hYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgc191dWlkWzE2XTsJLyogZmlsZXN5c3RlbSB1bmlxdWUgaWRlbnRpZmllciAqLworCXVuc2lnbmVkIGNoYXIgc19sYWJlbFsxNl07CS8qIGZpbGVzeXN0ZW0gdm9sdW1lIGxhYmVsICovCisJY2hhciBzX3VudXNlZFs4OF07CS8qIHplcm8gZmlsbGVkIGJ5IG1rcmVpc2VyZnMgYW5kCisJCQkJICogcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEoKQorCQkJCSAqIHNvIGFueSBhZGRpdGlvbnMgbXVzdCBiZSB1cGRhdGVkCisJCQkJICogdGhlcmUgYXMgd2VsbC4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcgIlJlSXNFckZzIgorI2RlZmluZSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIyRnMiCisjZGVmaW5lIFJFSVNFUjJGU19KUl9TVVBFUl9NQUdJQ19TVFJJTkcgIlJlSXNFcjNGcyIKKworI2RlZmluZSBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpICgmKChzKS0+c192MSkpCisjZGVmaW5lIFJFSVNFUkZTX0JMT0NLU0laRShzKSBcCisgICAgICAgIF9fbGUzMl90b19jcHUoKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfYmxvY2tzaXplKSkKKyNkZWZpbmUgUkVJU0VSRlNfQkxPQ0tfQ09VTlQocykgXAorICAgICAgICBfX2xlMzJfdG9fY3B1KChTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2Jsb2NrX2NvdW50KSkKKyNkZWZpbmUgUkVJU0VSRlNfTUFHSUMocykgXAorICAgICAgICAoU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKS0+c19tYWdpYykKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9mc3R5cGUvcm9tZnNfZnMuaCBiL3Vzci9raW5pdC9mc3R5cGUvcm9tZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDkwZmJjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2ZzdHlwZS9yb21mc19mcy5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgX19MSU5VWF9ST01GU19GU19ICisjZGVmaW5lIF9fTElOVVhfUk9NRlNfRlNfSAorCisvKiBUaGUgYmFzaWMgc3RydWN0dXJlcyBvZiB0aGUgcm9tZnMgZmlsZXN5c3RlbSAqLworCisjZGVmaW5lIFJPTUJTSVpFIEJMT0NLX1NJWkUKKyNkZWZpbmUgUk9NQlNCSVRTIEJMT0NLX1NJWkVfQklUUworI2RlZmluZSBST01CTUFTSyAoUk9NQlNJWkUtMSkKKyNkZWZpbmUgUk9NRlNfTUFHSUMgMHg3Mjc1CisKKyNkZWZpbmUgUk9NRlNfTUFYRk4gMTI4CisKKyNkZWZpbmUgX19ta3coaCxsKSAoKChoKSYweDAwZmYpPDwgOHwoKGwpJjB4MDBmZikpCisjZGVmaW5lIF9fbWtsKGgsbCkgKCgoaCkmMHhmZmZmKTw8MTZ8KChsKSYweGZmZmYpKQorI2RlZmluZSBfX21rNChhLGIsYyxkKSBjcHVfdG9fYmUzMihfX21rbChfX21rdyhhLGIpLF9fbWt3KGMsZCkpKQorI2RlZmluZSBST01TQl9XT1JEMCBfX21rNCgnLScsJ3InLCdvJywnbScpCisjZGVmaW5lIFJPTVNCX1dPUkQxIF9fbWs0KCcxJywnZicsJ3MnLCctJykKKworLyogT24tZGlzayAic3VwZXIgYmxvY2siICovCisKK3N0cnVjdCByb21mc19zdXBlcl9ibG9jayB7CisJX19iZTMyIHdvcmQwOworCV9fYmUzMiB3b3JkMTsKKwlfX2JlMzIgc2l6ZTsKKwlfX2JlMzIgY2hlY2tzdW07CisJY2hhciBuYW1lWzBdOwkJLyogdm9sdW1lIG5hbWUgKi8KK307CisKKy8qIE9uIGRpc2sgaW5vZGUgKi8KKworc3RydWN0IHJvbWZzX2lub2RlIHsKKwlfX2JlMzIgbmV4dDsJCS8qIGxvdyA0IGJpdHMgc2VlIFJPTUZIXyAqLworCV9fYmUzMiBzcGVjOworCV9fYmUzMiBzaXplOworCV9fYmUzMiBjaGVja3N1bTsKKwljaGFyIG5hbWVbMF07Cit9OworCisjZGVmaW5lIFJPTUZIX1RZUEUgNworI2RlZmluZSBST01GSF9IUkQgMAorI2RlZmluZSBST01GSF9ESVIgMQorI2RlZmluZSBST01GSF9SRUcgMgorI2RlZmluZSBST01GSF9TWU0gMworI2RlZmluZSBST01GSF9CTEsgNAorI2RlZmluZSBST01GSF9DSFIgNQorI2RlZmluZSBST01GSF9TQ0sgNgorI2RlZmluZSBST01GSF9GSUYgNworI2RlZmluZSBST01GSF9FWEVDIDgKKworLyogQWxpZ25tZW50ICovCisKKyNkZWZpbmUgUk9NRkhfU0laRSAxNgorI2RlZmluZSBST01GSF9QQUQgKFJPTUZIX1NJWkUtMSkKKyNkZWZpbmUgUk9NRkhfTUFTSyAoflJPTUZIX1BBRCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2luaXQvZnN0eXBlL3N3YXBfZnMuaCBiL3Vzci9raW5pdC9mc3R5cGUvc3dhcF9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2ZkZGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvZnN0eXBlL3N3YXBfZnMuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9fTElOVVhfU1dBUF9GU19ICisjZGVmaW5lIF9fTElOVVhfU1dBUF9GU19ICisKKy8qIFRoZSBiYXNpYyBzdHJ1Y3R1cmVzIG9mIHRoZSBzd2FwIHN1cGVyIGJsb2NrICovCisjZGVmaW5lIFNXQVBfTUFHSUNfTAkJMTAKKyNkZWZpbmUgU1dBUF9SRVNFUlZFRF9MCQkoMTAyNCAtIFNXQVBfTUFHSUNfTCkKKyNkZWZpbmUgU1dBUF9NQUdJQ18xCQkiU1dBUC1TUEFDRSIKKyNkZWZpbmUgU1dBUF9NQUdJQ18yCQkiU1dBUFNQQUNFMiIKKworLyogU3VzcGVuZCBzaWduYXR1cmVzLCBsb2NhdGVkIGF0IHNhbWUgYWRkciBhcyBzd2FwIG1hZ2ljICovCisjZGVmaW5lIFNVU1BfTUFHSUNfTAkJOQorI2RlZmluZSBTVVNQX01BR0lDXzEJCSJTMVNVU1BFTkQiCisjZGVmaW5lIFNVU1BfTUFHSUNfMgkJIlMyU1VTUEVORCIKKyNkZWZpbmUgU1VTUF9NQUdJQ19VCQkiVUxTVVNQRU5EIgorCisvKiBUaGUgc3VwZXJibG9jayBpcyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZmlyc3QgcGFnZSAqLworI2RlZmluZSBTV0FQX09GRlNFVCgpCQkoKGdldHBhZ2VzaXplKCkgLSAxMDI0KSA+PiAxMCkKKworLyogT24tZGlzayAic3VwZXIgYmxvY2siICovCitzdHJ1Y3Qgc3dhcF9zdXBlcl9ibG9jayB7CisJY2hhciByZXNlcnZlZFtTV0FQX1JFU0VSVkVEX0xdOworCWNoYXIgbWFnaWNbU1dBUF9NQUdJQ19MXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2ZzdHlwZS94ZnNfc2IuaCBiL3Vzci9raW5pdC9mc3R5cGUveGZzX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMGVlOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9mc3R5cGUveGZzX3NiLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIFN1cGVyIGJsb2NrCisgKiBGaXRzIGludG8gYSBzZWN0b3Itc2l6ZWQgYnVmZmVyIGF0IGFkZHJlc3MgMCBvZiBlYWNoIGFsbG9jYXRpb24gZ3JvdXAuCisgKiBPbmx5IHRoZSBmaXJzdCBvZiB0aGVzZSBpcyBldmVyIHVwZGF0ZWQgZXhjZXB0IGR1cmluZyBncm93ZnMuCisgKi8KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX21vdW50OworCisjZGVmaW5lCVhGU19TQl9NQUdJQwkJMHg1ODQ2NTM0MgkvKiAnWEZTQicgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX3NiIHsKKwlfX3UzMiBzYl9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19TQl9NQUdJQyAqLworCV9fdTMyIHNiX2Jsb2Nrc2l6ZTsJLyogbG9naWNhbCBibG9jayBzaXplLCBieXRlcyAqLworCV9fdTY0IHNiX2RibG9ja3M7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyAqLworfSB4ZnNfc2JfdDsKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9nZXRhcmcuYyBiL3Vzci9raW5pdC9nZXRhcmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2NlMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2dldGFyZy5jCkBAIC0wLDAgKzEsNTcgQEAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJraW5pdC5oIgorCisvKgorICogUm91dGluZXMgdGhhdCBodW50IGZvciBhIHNwZWNpZmljIGFyZ3VtZW50LiAgUGxlYXNlIG5vdGUgdGhhdAorICogdGhleSBhY3R1YWxseSBzZWFyY2ggdGhlIGFycmF5IGJhY2t3YXJkcy4gIFRoYXQgaXMgYmVjYXVzZSBvbiB0aGUKKyAqIGtlcm5lbCBjb21tYW5kIGxpbmVzLCBpdCdzIGxlZ2FsIHRvIG92ZXJyaWRlIGFuIGVhcmxpZXIgYXJndW1lbnQKKyAqIHdpdGggYSBsYXRlciBhcmd1bWVudC4KKyAqLworCisvKgorICogV2FzIHRoaXMgYm9vbGVhbiBhcmd1bWVudCBwYXNzZWQ/ICBJZiBzbyByZXR1cm4gdGhlIGluZGV4IGluIHRoZQorICogYXJndiBhcnJheSBmb3IgaXQuICBGb3IgY29uZmxpY3RpbmcgYm9vbGVhbiBvcHRpb25zLCB1c2UgdGhlCisgKiBvbmUgd2l0aCB0aGUgaGlnaGVyIGluZGV4LiAgVGhlIG9ubHkgY2FzZSB3aGVuIHRoZSByZXR1cm4gdmFsdWUKKyAqIGNhbiBiZSBlcXVhbCwgaXMgd2hlbiB0aGV5J3JlIGJvdGggemVybzsgc28gZXF1YWxpdHkgY2FuIGJlIHVzZWQKKyAqIGFzIHRoZSBkZWZhdWx0IG9wdGlvbiBjaG9pY2UuCisgKgorICogSW4gb3RoZXIgd29yZHMsIGlmIHR3byBvcHRpb25zICJhIiBhbmQgImIiIGFyZSBvcHBvc2l0ZXMsIGFuZCAiYSIKKyAqIGlzIHRoZSBkZWZhdWx0LCB0aGlzIGNhbiBiZSBjb2RlZCBhczoKKyAqCisgKiBpZiAoZ2V0X2ZsYWcoYXJnYyxhcmd2LCJhIikgPj0gZ2V0X2ZsYWcoYXJnYyxhcmd2LCJiIikpCisgKiAJZG9fYV9zdHVmZigpOworICogZWxzZQorICoJZG9fYl9zdHVmZigpOworICovCitpbnQgZ2V0X2ZsYWcoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IGFyZ2MtMTsgaSA+IDA7IGktLSkgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCBuYW1lKSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdhcyB0aGlzIHRleHR1YWwgcGFyYW1ldGVyIChmb289b3B0aW9uKSBwYXNzZWQ/CisgKgorICogVGhpcyByZXR1cm5zIHRoZSBsYXRlc3QgaW5zdGFuY2Ugb2Ygc3VjaCBhbiBvcHRpb24gaW4gdGhlIGFyZ3YgYXJyYXkuCisgKi8KK2NoYXIgKmdldF9hcmcoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKG5hbWUpOworCWNoYXIgKnJldCA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSBhcmdjLTE7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKGFyZ3ZbaV0gJiYgc3RybmNtcChhcmd2W2ldLCBuYW1lLCBsZW4pID09IDAgJiYKKwkJICAgIChhcmd2W2ldW2xlbl0gIT0gJ1wwJykpIHsKKwkJCXJldCA9IGFyZ3ZbaV0gKyBsZW47CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvZ2V0aW50ZmlsZS5jIGIvdXNyL2tpbml0L2dldGludGZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2I5NGJiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2dldGludGZpbGUuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogT3BlbiBhIGZpbGUgYW5kIHJlYWQgaXQsIGFzc3VtaW5nIGl0IGNvbnRhaW5zIGEgc2luZ2xlIGxvbmcgdmFsdWUuCisgKiBSZXR1cm4gMCBpZiB3ZSByZWFkIGEgdmFsaWQgdmFsdWUsIG90aGVyd2lzZSAtMS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworaW50IGdldGludGZpbGUoY29uc3QgY2hhciAqcGF0aCwgbG9uZyAqdmFsKQoreworCWNoYXIgYnVmZmVyWzY0XTsKKwljaGFyICplcDsKKwlGSUxFICpmOworCisJZiA9IGZvcGVuKHBhdGgsICJyIik7CisJaWYgKCFmKQorCQlyZXR1cm4gLTE7CisKKwllcCA9IGJ1ZmZlciArIGZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mIGJ1ZmZlciAtIDEsIGYpOworCWZjbG9zZShmKTsKKwkqZXAgPSAnXDAnOworCisJKnZhbCA9IHN0cnRvbChidWZmZXIsICZlcCwgMCk7CisJaWYgKCplcCAmJiAqZXAgIT0gJ1xuJykKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvaW5pdHJkLmMgYi91c3Iva2luaXQvaW5pdHJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzYWYxYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pbml0cmQuYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIEhhbmRsZSBpbml0cmQsIHRodXMgcHV0dGluZyB0aGUgYmFja3dhcmRzIGludG8gYmFja3dhcmRzIGNvbXBhdGlibGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgImRvX21vdW50cy5oIgorI2luY2x1ZGUgImtpbml0LmgiCisjaW5jbHVkZSAieHBpby5oIgorCisjZGVmaW5lIEJVRl9TSVpFCTY1NTM2CS8qIFNob3VsZCBiZSBhIHBvd2VyIG9mIDIgKi8KKworLyoKKyAqIENvcHkgdGhlIGluaXRyZCB0byAvZGV2L3JhbTAsIGNvcHkgZnJvbSB0aGUgZW5kIHRvIHRoZSBiZWdpbm5pbmcKKyAqIHRvIGF2b2lkIHRha2luZyAyeCB0aGUgbWVtb3J5LgorICovCitzdGF0aWMgaW50IHJkX2NvcHlfdW5jb21wcmVzc2VkKGludCBmZmQsIGludCBkZmQpCit7CisJY2hhciBidWZmZXJbQlVGX1NJWkVdOworCW9mZl90IGJ5dGVzOworCXN0cnVjdCBzdGF0IHN0OworCisJREVCVUcoKCJraW5pdDogdW5jb21wcmVzc2VkIGluaXRyZFxuIikpOworCisJaWYgKGZmZCA8IDAgfHwgZnN0YXQoZmZkLCAmc3QpIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpIHx8CisJICAgIChieXRlcyA9IHN0LnN0X3NpemUpID09IDApCisJCXJldHVybiAtMTsKKworCXdoaWxlIChieXRlcykgeworCQlzc2l6ZV90IGJsb2Nrc2l6ZSA9ICgoYnl0ZXMgLSAxKSAmIChCVUZfU0laRSAtIDEpKSArIDE7CisJCW9mZl90IG9mZnNldCA9IGJ5dGVzIC0gYmxvY2tzaXplOworCisJCURFQlVHKCgia2luaXQ6IGNvcHlpbmcgJXpkIGJ5dGVzIGF0IG9mZnNldCAlbGx1XG4iLAorCQkgICAgICAgYmxvY2tzaXplLCBvZmZzZXQpKTsKKworCQlpZiAoeHByZWFkKGZmZCwgYnVmZmVyLCBibG9ja3NpemUsIG9mZnNldCkgIT0gYmxvY2tzaXplIHx8CisJCSAgICB4cHdyaXRlKGRmZCwgYnVmZmVyLCBibG9ja3NpemUsIG9mZnNldCkgIT0gYmxvY2tzaXplKQorCQkJcmV0dXJuIC0xOworCisJCWZ0cnVuY2F0ZShmZmQsIG9mZnNldCk7CS8qIEZyZWUgdXAgbWVtb3J5ICovCisJCWJ5dGVzID0gb2Zmc2V0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZF9jb3B5X2ltYWdlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGZmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWludCBydiA9IC0xOworCXVuc2lnbmVkIGNoYXIgZ3ppcF9tYWdpY1syXTsKKworCWlmIChmZmQgPCAwKQorCQlnb3RvIGJhcmY7CisKKwlpZiAoeHByZWFkKGZmZCwgZ3ppcF9tYWdpYywgMiwgMCkgPT0gMiAmJgorCSAgICBnemlwX21hZ2ljWzBdID09IDAzNyAmJiBnemlwX21hZ2ljWzFdID09IDAyMTMpIHsKKwkJRklMRSAqd2ZkID0gZm9wZW4oIi9kZXYvcmFtMCIsICJ3Iik7CisJCWlmICghd2ZkKQorCQkJZ290byBiYXJmOworCQlydiA9IGxvYWRfcmFtZGlza19jb21wcmVzc2VkKHBhdGgsIHdmZCwgMCk7CisJCWZjbG9zZSh3ZmQpOworCX0gZWxzZSB7CisJCWludCBkZmQgPSBvcGVuKCIvZGV2L3JhbTAiLCBPX1dST05MWSk7CisJCWlmIChkZmQgPCAwKQorCQkJZ290byBiYXJmOworCQlydiA9IHJkX2NvcHlfdW5jb21wcmVzc2VkKGZmZCwgZGZkKTsKKwkJY2xvc2UoZGZkKTsKKwl9CisKK2JhcmY6CisJaWYgKGZmZCA+PSAwKQorCQljbG9zZShmZmQpOworCXJldHVybiBydjsKK30KKworLyoKKyAqIFJ1biAvbGludXhyYywgZm9yIGVtdWxhdGlvbiBvZiBvbGQtc3R5bGUgaW5pdHJkCisgKi8KK3N0YXRpYyBpbnQgcnVuX2xpbnV4cmMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgZGV2X3Qgcm9vdF9kZXYpCit7CisJaW50IHJvb3RfZmQsIG9sZF9mZDsKKwlwaWRfdCBwaWQ7CisJbG9uZyByZWFscm9vdCA9IFJvb3RfUkFNMDsKKwljb25zdCBjaGFyICpyYW1kaXNrX25hbWUgPSAiL2Rldi9yYW0wIjsKKwlGSUxFICpmcDsKKworCURFQlVHKCgia2luaXQ6IG1vdW50aW5nIGluaXRyZFxuIikpOworCW1rZGlyKCIvcm9vdCIsIDA3MDApOworCWlmICghbW91bnRfYmxvY2socmFtZGlza19uYW1lLCAiL3Jvb3QiLCBOVUxMLCBNU19WRVJCT1NFLCBOVUxMKSkKKwkJcmV0dXJuIC1lcnJubzsKKworCS8qIFdyaXRlIHRoZSBjdXJyZW50ICJyZWFsIHJvb3QgZGV2aWNlIiBvdXQgdG8gcHJvY2ZzICovCisJREVCVUcoKCJraW5pdDogcmVhbF9yb290X2RldiA9ICUjeFxuIiwgcm9vdF9kZXYpKTsKKwlmcCA9IGZvcGVuKCIvcHJvYy9zeXMva2VybmVsL3JlYWwtcm9vdC1kZXYiLCAidyIpOworCWZwcmludGYoZnAsICIldSIsIHJvb3RfZGV2KTsKKwlmY2xvc2UoZnApOworCisJbWtkaXIoIi9vbGQiLCAwNzAwKTsKKwlyb290X2ZkID0gb3Blbl9jbG9leGVjKCIvIiwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSwgMCk7CisJb2xkX2ZkID0gb3Blbl9jbG9leGVjKCIvb2xkIiwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSwgMCk7CisKKwlpZiAocm9vdF9mZCA8IDAgfHwgb2xkX2ZkIDwgMCkKKwkJcmV0dXJuIC1lcnJubzsKKworCWlmIChjaGRpcigiL3Jvb3QiKSB8fAorCSAgICBtb3VudCgiLiIsICIvIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkgfHwgY2hyb290KCIuIikpCisJCXJldHVybiAtZXJybm87CisKKwlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQlzZXRzaWQoKTsKKwkJLyogTG9va3MgbGlrZSBsaW51eHJjIGRvZXNuJ3QgZ2V0IHRoZSBpbml0IGVudmlyb25tZW50CisJCSAgIG9yIHBhcmFtZXRlcnMuICBXZWlyZCwgYnV0IHNvIGlzIHRoZSB3aG9sZSBsaW51eHJjIGJpdC4gKi8KKwkJZXhlY2woIi9saW51eHJjIiwgImxpbnV4cmMiLCBOVUxMKTsKKwkJX2V4aXQoMjU1KTsKKwl9IGVsc2UgaWYgKHBpZCA+IDApIHsKKwkJREVCVUcoKCJraW5pdDogV2FpdGluZyBmb3IgbGludXhyYyB0byBjb21wbGV0ZS4uLlxuIikpOworCQl3aGlsZSAod2FpdHBpZChwaWQsIE5VTEwsIDApICE9IHBpZCkgOworCQlERUJVRygoImtpbml0OiBsaW51eHJjIGRvbmVcbiIpKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLWVycm5vOworCX0KKworCWlmIChmY2hkaXIob2xkX2ZkKSB8fAorCSAgICBtb3VudCgiLyIsICIuIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkgfHwKKwkgICAgZmNoZGlyKHJvb3RfZmQpIHx8IGNocm9vdCgiLiIpKQorCQlyZXR1cm4gLWVycm5vOworCisJY2xvc2Uocm9vdF9mZCk7CisJY2xvc2Uob2xkX2ZkKTsKKworCWdldGludGZpbGUoIi9wcm9jL3N5cy9rZXJuZWwvcmVhbC1yb290LWRldiIsICZyZWFscm9vdCk7CisKKwkvKiBJZiByZWFscm9vdCBpcyBSb290X1JBTTAsIHRoZW4gdGhlIGluaXRyZCBkaWQgYW55IG5lY2Vzc2FyeSB3b3JrICovCisJaWYgKHJlYWxyb290ID09IFJvb3RfUkFNMCkgeworCQlpZiAobW91bnQoIi9vbGQiLCAiL3Jvb3QiLCBOVUxMLCBNU19NT1ZFLCBOVUxMKSkKKwkJCXJldHVybiAtZXJybm87CisJfSBlbHNlIHsKKwkJbW91bnRfcm9vdChhcmdjLCBhcmd2LCAoZGV2X3QpIHJlYWxyb290LCBOVUxMKTsKKworCQkvKiBJZiAvcm9vdC9pbml0cmQgZXhpc3RzLCBtb3ZlIHRoZSBpbml0cmQgdGhlcmUsIG90aGVyd2lzZSBkaXNjYXJkICovCisJCWlmICghbW91bnQoIi9vbGQiLCAiL3Jvb3QvaW5pdHJkIiwgTlVMTCwgTVNfTU9WRSwgTlVMTCkpIHsKKwkJCS8qIFdlJ3JlIGdvb2QgKi8KKwkJfSBlbHNlIHsKKwkJCWludCBvbGRkZXYgPSBvcGVuKHJhbWRpc2tfbmFtZSwgT19SRFdSKTsKKwkJCXVtb3VudDIoIi9vbGQiLCBNTlRfREVUQUNIKTsKKwkJCWlmIChvbGRkZXYgPCAwIHx8CisJCQkgICAgaW9jdGwob2xkZGV2LCBCTEtGTFNCVUYsIChsb25nKTApIHx8CisJCQkgICAgY2xvc2Uob2xkZGV2KSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiJXM6IENhbm5vdCBmbHVzaCBpbml0cmQgY29udGVudHNcbiIsCisJCQkJCXByb2duYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCXJtZGlyKCIvb2xkIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpbml0cmRfbG9hZChpbnQgYXJnYywgY2hhciAqYXJndltdLCBkZXZfdCByb290X2RldikKK3sKKwlpZiAoYWNjZXNzKCIvaW5pdHJkLmltYWdlIiwgUl9PSykpCisJCXJldHVybiAwOwkvKiBObyBpbml0cmQgKi8KKworCURFQlVHKCgia2luaXQ6IGluaXRyZCBmb3VuZFxuIikpOworCisJY3JlYXRlX2RldigiL2Rldi9yYW0wIiwgUm9vdF9SQU0wKTsKKworCWlmIChyZF9jb3B5X2ltYWdlKCIvaW5pdHJkLmltYWdlIikgfHwgdW5saW5rKCIvaW5pdHJkLmltYWdlIikpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogaW5pdHJkIGluc3RhbGxhdGlvbiBmYWlsZWQgKHRvbyBiaWc/KVxuIiwKKwkJCXByb2duYW1lKTsKKwkJcmV0dXJuIDA7CS8qIEZhaWxlZCB0byBjb3B5IGluaXRyZCAqLworCX0KKworCURFQlVHKCgia2luaXQ6IGluaXRyZCBjb3BpZWRcbiIpKTsKKworCWlmIChyb290X2RldiAhPSBSb290X1JBTTApIHsKKwkJaW50IGVycjsKKwkJREVCVUcoKCJraW5pdDogcnVubmluZyBsaW51eHJjXG4iKSk7CisJCWVyciA9IHJ1bl9saW51eHJjKGFyZ2MsIGFyZ3YsIHJvb3RfZGV2KTsKKwkJaWYgKGVycikKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHJ1bm5pbmcgbGludXhyYzogJXNcbiIsIHByb2duYW1lLAorCQkJCXN0cmVycm9yKC1lcnIpKTsKKwkJcmV0dXJuIDE7CS8qIGluaXRyZCBpcyByb290LCBvciBydW5fbGludXhyYyB0b29rIGNhcmUgb2YgaXQgKi8KKwl9IGVsc2UgeworCQlERUJVRygoImtpbml0OiBwZXJtYW1lbnQgKG9yIHBpdm90aW5nKSBpbml0cmQsIG5vdCBydW5uaW5nIGxpbnV4cmNcbiIpKTsKKwkJcmV0dXJuIDA7CS8qIE1vdW50aW5nIGluaXRyZCBhcyBvcmRpbmFyeSByb290ICovCisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL0tidWlsZCBiL3Vzci9raW5pdC9pcGNvbmZpZy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4ZDE4MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9LYnVpbGQKQEAgLTAsMCArMSwzMSBAQAorIworIyBLYnVpbGQgZmlsZSBmb3IgaXBjb25maWcKKyMKKworc3RhdGljLXkgOj0gc3RhdGljL2lwY29uZmlnCitzaGFyZWQteSA6PSBzaGFyZWQvaXBjb25maWcKKworIyBjb21tb24gLm8gZmlsZXMKK29ianMgOj0gbWFpbi5vIG5ldGRldi5vIHBhY2tldC5vCisjIGRoY3AKK29ianMgKz0gZGhjcF9wcm90by5vCisjIGJvb3RwCitvYmpzICs9IGJvb3RwX3Byb3RvLm8KKworCisjIFRPRE8gLSBkbyB3ZSB3YW50IGEgc3RyaXBwZWQgdmVyc2lvbgorIyBUT0RPIC0gZG8gd2Ugd2FudCB0aGUgc3RhdGljLmcgKyBzaGFyZWQuZyBkaXJlY3Rvcmllcz8KKworCisjIENyZWF0ZSBidWlsdC1pbi5vIHdpdGggYWxsIG9iamVjdCBmaWxlcyAodXNlZCBieSBraW5pdCkKK2xpYi15IDo9ICQob2JqcykKKworIyAubyBmaWxlcyB1c2VkIHRvIGJ1aWx0IGV4ZWN1dGFibGVzCitzdGF0aWMvaXBjb25maWcteSA6PSAkKG9ianMpCitzaGFyZWQvaXBjb25maWcteSA6PSAkKG9ianMpCisKKyMgQ2xlYW5pbmcKK2NsZWFuLWRpcnMgOj0gc3RhdGljIHNoYXJlZAorCisjIGluc3RhbGwgYmluYXJ5CitpbnN0YWxsLXkgOj0gJChzaGFyZWQteSkKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9SRUFETUUgYi91c3Iva2luaXQvaXBjb25maWcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODIyN2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvUkVBRE1FCkBAIC0wLDAgKzEsMTA2IEBACitCT09UUC9ESENQIGNsaWVudCBmb3Iga2xpYmMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVc2FnZToKKworaXBjb25maWcgWy1jIHByb3RvXSBbLWQgaW50ZXJmYWNlXSBbLWkgaWRlbnRpZmllcl0KKwkgWy1uXSBbLXAgcG9ydF0gWy10IHRpbWVvdXRdIFtpbnRlcmZhY2UgLi4uXQorCistYyBwcm90bwlVc2UgUFJPVE8gYXMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvdG9jb2wgZm9yIGFsbAorCQlpbnRlcmZhY2VzLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBzcGVjaWZpYyBpbnRlcmZhY2VzLgorLWQgaW50ZXJmYWNlCUVpdGhlciB0aGUgbmFtZSBvZiBhbiBpbnRlcmZhY2UsIG9yIGEgbG9uZyBzcGVjLgorLWkgaWRlbnRpZmllcglESENQIHZlbmRvciBjbGFzcyBpZGVudGlmaWVyLiAgVGhlIGRlZmF1bHQgaXMKKwkJIkxpbnV4IGlwY29uZmlnIi4KKy1uCQlEbyBub3RoaW5nIC0ganVzdCBwcmludCB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdvdWxkCisJCWJlIHBlcmZvcm1lZC4KKy1wIHBvcnQJCVNlbmQgYm9vdHAvZGhjcCBicm9hZGNhc3RzIGZyb20gUE9SVCwgdG8gUE9SVCAtIDEuCistdCB0aW1lb3V0CUdpdmUgdXAgb24gYWxsIHVuY29uZmlndXJlZCBpbnRlcmZhY2VzIGFmdGVyIFRJTUVPVVQgc2Vjcy4KKworWW91IGNhbiBjb25maWd1cmUgbXVsdGlwbGUgaW50ZXJmYWNlcyBieSBwYXNzaW5nIG11bHRpcGxlIGludGVyZmFjZQorc3BlY3Mgb24gdGhlIGNvbW1hbmQgbGluZSwgb3IgYnkgdXNpbmcgdGhlIHNwZWNpYWwgaW50ZXJmYWNlIG5hbWUKKyJhbGwiLiAgSWYgeW91J3JlIGF1dG9jb25maWd1cmluZyBhbnkgaW50ZXJmYWNlcywgaXBjb25maWcgd2lsbCB3YWl0Cit1bnRpbCBlaXRoZXIgYWxsIHN1Y2ggaW50ZXJmYWNlcyBoYXZlIGJlZW4gY29uZmlndXJlZCwgb3IgdGhlIHRpbWVvdXQKK3Bhc3Nlcy4KKworUFJPVE8gY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLCB3aGljaCBzZWxlY3RzIHRoZSBhdXRvY29uZmlndXJhdGlvbgorcHJvdG9jb2wgdG8gdXNlOgorCitub3Qgc3BlY2lmaWVkCXVzZSBhbGwgcHJvdG9jb2xzICh0aGUgZGVmYXVsdCkKK2RoY3AJCXVzZSBib290cCBhbmQgZGhjcAorYm9vdHAJCXVzZSBib290cCBvbmx5CityYXJwCQl1c2UgcmFycCAobm90IGN1cnJlbnRseSBzdXBwb3J0ZWQpCitub25lCQlubyBhdXRvY29uZmlndXJhdGlvbiAtIGVpdGhlciBzdGF0aWMgY29uZmlnLCBvciBub25lIGF0IGFsbAorCitBbiBpbnRlcmZhY2Ugc3BlYyBjYW4gYmUgZWl0aGVyIHNob3J0IGZvcm0sIHdoaWNoIGlzIGp1c3QgdGhlIG5hbWUgb2YKK2FuIGludGVyZmFjZSAoZXRoMCBvciB3aGF0ZXZlciksIG9yIGxvbmcgZm9ybS4gIFRoZSBsb25nIGZvcm0gY29uc2lzdHMKK29mIHVwIHRvIHNldmVuIGVsZW1lbnRzLCBzZXBhcmF0ZWQgYnkgY29sb25zOgorCis8Y2xpZW50LWlwPjo8c2VydmVyLWlwPjo8Z3ctaXA+OjxuZXRtYXNrPjo8aG9zdG5hbWU+OjxkZXZpY2U+OjxhdXRvY29uZj4KKworICA8Y2xpZW50LWlwPglJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQuIElmIGVtcHR5LCB0aGUgYWRkcmVzcyB3aWxsCisgICAgICAgICAgICAgICAgZWl0aGVyIGJlIGRldGVybWluZWQgYnkgUkFSUC9CT09UUC9ESENQLiBXaGF0IHByb3RvY29sCisgICAgICAgICAgICAgICAgaXMgdXNlZCBkZS0gcGVuZHMgb24gdGhlIDxhdXRvY29uZj4gcGFyYW1ldGVyLiBJZiB0aGlzCisgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCBlbXB0eSwgYXV0b2NvbmYgd2lsbCBiZSB1c2VkLgorCisgIDxzZXJ2ZXItaXA+ICAgSVAgYWRkcmVzcyBvZiB0aGUgTkZTIHNlcnZlci4gSWYgUkFSUCBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHRoZSBjbGllbnQgYWRkcmVzcyBhbmQgdGhpcyBwYXJhbWV0ZXIgaXMgTk9UCisgICAgICAgICAgICAgICAgZW1wdHkgb25seSByZXBsaWVzIGZyb20gdGhlIHNwZWNpZmllZCBzZXJ2ZXIgYXJlCisgICAgICAgICAgICAgICAgYWNjZXB0ZWQuIFRvIHVzZSBkaWZmZXJlbnQgUkFSUCBhbmQgTkZTIHNlcnZlciwKKyAgICAgICAgICAgICAgICBzcGVjaWZ5IHlvdXIgUkFSUCBzZXJ2ZXIgaGVyZSAob3IgbGVhdmUgaXQgYmxhbmspLCBhbmQKKyAgICAgICAgICAgICAgICBzcGVjaWZ5IHlvdXIgTkZTIHNlcnZlciBpbiB0aGUgYG5mc3Jvb3QnIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIChzZWUgYWJvdmUpLiBJZiB0aGlzIGVudHJ5IGlzIGJsYW5rIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgICAgICAgICAgICAgIHNlcnZlciBpcyB1c2VkIHdoaWNoIGFuc3dlcmVkIHRoZSBSQVJQL0JPT1RQL0RIQ1AKKyAgICAgICAgICAgICAgICByZXF1ZXN0LgorCisgIDxndy1pcD4gICAgICAgSVAgYWRkcmVzcyBvZiBhIGdhdGV3YXkgaWYgdGhlIHNlcnZlciBpcyBvbiBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIHN1Ym5ldC4gSWYgdGhpcyBlbnRyeSBpcyBlbXB0eSBubyBnYXRld2F5IGlzIHVzZWQgYW5kIHRoZQorICAgICAgICAgICAgICAgIHNlcnZlciBpcyBhc3N1bWVkIHRvIGJlIG9uIHRoZSBsb2NhbCBuZXR3b3JrLCB1bmxlc3MgYQorICAgICAgICAgICAgICAgIHZhbHVlIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IEJPT1RQL0RIQ1AuCisKKyAgPG5ldG1hc2s+ICAgICBOZXRtYXNrIGZvciBsb2NhbCBuZXR3b3JrIGludGVyZmFjZS4gSWYgdGhpcyBpcyBlbXB0eSwKKyAgICAgICAgICAgICAgICB0aGUgbmV0bWFzayBpcyBkZXJpdmVkIGZyb20gdGhlIGNsaWVudCBJUCBhZGRyZXNzIGFzc3VtaW5nCisgICAgICAgICAgICAgICAgY2xhc3NmdWwgYWRkcmVzc2luZywgdW5sZXNzIG92ZXJyaWRkZW4gaW4gQk9PVFAvREhDUCByZXBseS4KKworICA8aG9zdG5hbWU+ICAgIE5hbWUgb2YgdGhlIGNsaWVudC4gSWYgZW1wdHksIHRoZSBjbGllbnQgSVAgYWRkcmVzcyBpcworICAgICAgICAgICAgICAgIHVzZWQgaW4gQVNDSUkgbm90YXRpb24sIG9yIHRoZSB2YWx1ZSByZWNlaXZlZCBieQorICAgICAgICAgICAgICAgIEJPT1RQL0RIQ1AuCisKKyAgPGRldmljZT4gICAgICBOYW1lIG9mIG5ldHdvcmsgZGV2aWNlIHRvIHVzZS4gSWYgdGhpcyBpcyBlbXB0eSwgYWxsCisgICAgICAgICAgICAgICAgZGV2aWNlcyBhcmUgdXNlZCBmb3IgUkFSUC9CT09UUC9ESENQIHJlcXVlc3RzLCBhbmQgdGhlCisgICAgICAgICAgICAgICAgZmlyc3Qgb25lIHdlIHJlY2VpdmUgYSByZXBseSBvbiBpcyBjb25maWd1cmVkLiBJZiB5b3UKKyAgICAgICAgICAgICAgICBoYXZlIG9ubHkgb25lIGRldmljZSwgeW91IGNhbiBzYWZlbHkgbGVhdmUgdGhpcyBibGFuay4KKworICA8YXV0b2NvbmY+CU1ldGhvZCB0byB1c2UgZm9yIGF1dG9jb25maWd1cmF0aW9uLiBJZiB0aGlzIGlzIGVpdGhlcgorICAgICAgICAgICAgICAgICdyYXJwJywgJ2Jvb3RwJywgb3IgJ2RoY3AnIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wgaXMKKyAgICAgICAgICAgICAgICB1c2VkLiAgSWYgdGhlIHZhbHVlIGlzICdib3RoJywgJ2FsbCcgb3IgZW1wdHksIGFsbAorICAgICAgICAgICAgICAgIHByb3RvY29scyBhcmUgdXNlZC4gICdvZmYnLCAnc3RhdGljJyBvciAnbm9uZScgbWVhbnMKKyAgICAgICAgICAgICAgICBubyBhdXRvY29uZmlndXJhdGlvbi4KKworSVAgYWRkcmVzc2VzIGFuZCBuZXRtYXNrcyBtdXN0IGJlIGVpdGhlciBhYnNlbnQgKGRlZmF1bHRpbmcgdG8gemVybykKK29yIHByZXNlbnRlZCBpbiBkb3R0ZWQtcXVhZCBub3RhdGlvbi4KKworQW4gaW50ZXJmYWNlIHNwZWMgY2FuIGJlIHByZWZpeGVkIHdpdGggZWl0aGVyICJpcD0iLCAibmZzYWRkcnM9IiwgYm90aAorb2Ygd2hpY2ggYXJlIGlnbm9yZWQuICBUaGVzZSAoYWxvbmcgd2l0aCB0aGUgdWdsaW5lc3Mgb2YgdGhlIGxvbmcKK2Zvcm0pIGFyZSBwcmVzZW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGluLWtlcm5lbCBpcGNvbmZpZyBjb2RlCitmcm9tIDIuNCBhbmQgZWFybGllciBrZXJuZWxzLgorCitIZXJlIGFyZSBhIGZldyBleGFtcGxlcyBvZiB2YWxpZCBpcGNvbmZpZyBjb21tYW5kIGxpbmVzLgorCitFbmFibGUgdGhlIGxvb3BiYWNrIGludGVyZmFjZToKKyAgICBpcGNvbmZpZyAxMjcuMC4wLjE6Ojo6OmxvOm5vbmUKKworVHJ5IHRvIGNvbmZpZ3VyZSBldGgwIHVzaW5nIGJvb3RwIGZvciB1cCB0byAzMCBzZWNvbmRzOgorICAgIGlwY29uZmlnIC10IDMwIC1jIGJvb3RwIGV0aDAKKworQ29uZmlndXJlIGV0aDAgYW5kIGV0aDEgdXNpbmcgZGhjcCBvciBib290cCwgYW5kIGV0aDIgc3RhdGljYWxseToKKyAgICBpcGNvbmZpZyAtYyBhbnkgZXRoMCBldGgxIDE5Mi4xNjguMS4xOjo6OjpldGgyOm5vbmUKKworLS0KKworRnJvbSBSdXNzZWxsJ3Mgb3JpZ2luYWwgUkVBRE1FLCBhbmQgc3RpbGwgdHJ1ZToKKworVGhlIGNvZGUgaW4gbWFpbi5jIGlzIHl1Y2t5IGltaG8uICBOZWVkcyBjbGVhbmluZy4KKworLS0KK1J1c3NlbGwgS2luZyAoMjAwMi8xMC8yMikKK0JyeWFuIE8nU3VsbGl2YW4gKDIwMDMvMDQvMjkpCmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvYm9vdHBfcGFja2V0LmggYi91c3Iva2luaXQvaXBjb25maWcvYm9vdHBfcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNWVjMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9ib290cF9wYWNrZXQuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIEJPT1RQX1BBQ0tFVF9ICisjZGVmaW5lIEJPT1RQX1BBQ0tFVF9ICisKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisKK3N0cnVjdCBuZXRkZXY7CisKKy8qIHBhY2tldCBvcHMgKi8KKyNkZWZpbmUgQk9PVFBfUkVRVUVTVAkxCisjZGVmaW5lIEJPT1RQX1JFUExZCTIKKworLyogeW91ciBiYXNpYyBib290cCBwYWNrZXQgKi8KK3N0cnVjdCBib290cF9oZHIgeworCXVpbnQ4X3QJIG9wOworCXVpbnQ4X3QJIGh0eXBlOworCXVpbnQ4X3QJIGhsZW47CisJdWludDhfdAkgaG9wczsKKwl1aW50MzJfdCB4aWQ7CisJdWludDE2X3Qgc2VjczsKKwl1aW50MTZfdCBmbGFnczsKKwl1aW50MzJfdCBjaWFkZHI7CisJdWludDMyX3QgeWlhZGRyOworCXVpbnQzMl90IHNpYWRkcjsKKwl1aW50MzJfdCBnaWFkZHI7CisJdWludDhfdAkgY2hhZGRyWzE2XTsKKwljaGFyCSBzZXJ2ZXJfbmFtZVs2NF07CisJY2hhcgkgYm9vdF9maWxlWzEyOF07CisJLyogMzEyIGJ5dGVzIG9mIGV4dGVuc2lvbnMgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL2Jvb3RwX3Byb3RvLmMgYi91c3Iva2luaXQvaXBjb25maWcvYm9vdHBfcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU3OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2lwY29uZmlnL2Jvb3RwX3Byb3RvLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBCT09UUCBwYWNrZXQgcHJvdG9jb2wgaGFuZGxpbmcuCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSAiaXBjb25maWcuaCIKKyNpbmNsdWRlICJuZXRkZXYuaCIKKyNpbmNsdWRlICJib290cF9wYWNrZXQuaCIKKyNpbmNsdWRlICJib290cF9wcm90by5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorCitzdGF0aWMgdWludDhfdCBib290cF9vcHRpb25zWzMxMl0gPSB7CisJWyAgMF0gPSA5OSwgMTMwLCA4MywgOTksLyogUkZDMTA0OCBtYWdpYyBjb29raWUgKi8KKwlbICA0XSA9IDEsIDQsCQkvKiAgIDQtICA5IHN1Ym5ldCBtYXNrICovCisJWyAxMF0gPSAzLCA0LAkJLyogIDEwLSAxNSBkZWZhdWx0IGdhdGV3YXkgKi8KKwlbIDE2XSA9IDUsIDgsCQkvKiAgMTYtIDI1IG5hbWVzZXJ2ZXIgKi8KKwlbIDI2XSA9IDEyLCAzMiwJCS8qICAyNi0gNTkgaG9zdCBuYW1lICovCisJWyA2MF0gPSA0MCwgMzIsCQkvKiAgNjAtIDk1IG5pcyBkb21haW4gbmFtZSAqLworCVsgOTZdID0gMTcsIDQwLAkJLyogIDk2LTEzNyBib290IHBhdGggKi8KKwlbMTM4XSA9IDU3LCAyLCAxLCAxNTAsCS8qIDEzOC0xNDEgZXh0ZW5zaW9uIGJ1ZmZlciAqLworCVsxNDJdID0gMjU1LAkJLyogZW5kIG9mIGxpc3QgKi8KK307CisKKy8qCisgKiBTZW5kIGEgcGxhaW4gYm9vdHAgcmVxdWVzdCBwYWNrZXQgd2l0aCBvcHRpb25zCisgKi8KK2ludCBib290cF9zZW5kX3JlcXVlc3Qoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXN0cnVjdCBib290cF9oZHIgYm9vdHA7CisJc3RydWN0IGlvdmVjIGlvdltdID0geworCQkvKiBbMF0gPSBpcCArIHVkcCBoZWFkZXJzICovCisJCVsxXSA9IHsmYm9vdHAsIHNpemVvZihib290cCl9LAorCQlbMl0gPSB7Ym9vdHBfb3B0aW9ucywgMzEyfQorCX07CisKKwltZW1zZXQoJmJvb3RwLCAwLCBzaXplb2Yoc3RydWN0IGJvb3RwX2hkcikpOworCisJYm9vdHAub3AJPSBCT09UUF9SRVFVRVNULCBib290cC5odHlwZSA9IGRldi0+aHd0eXBlOworCWJvb3RwLmhsZW4JPSBkZXYtPmh3bGVuOworCWJvb3RwLnhpZAk9IGRldi0+Ym9vdHAueGlkOworCWJvb3RwLmNpYWRkcgk9IGRldi0+aXBfYWRkcjsKKwlib290cC5zZWNzCT0gaHRvbnModGltZShOVUxMKSAtIGRldi0+b3Blbl90aW1lKTsKKwltZW1jcHkoYm9vdHAuY2hhZGRyLCBkZXYtPmh3YWRkciwgMTYpOworCisJREVCVUcoKCItPiBib290cCB4aWQgMHglMDh4IHNlY3MgMHglMDh4ICIsCisJICAgICAgIGJvb3RwLnhpZCwgbnRvaHMoYm9vdHAuc2VjcykpKTsKKworCXJldHVybiBwYWNrZXRfc2VuZChkZXYsIGlvdiwgMik7Cit9CisKKy8qCisgKiBQYXJzZSBhIGJvb3RwIHJlcGx5IHBhY2tldAorICovCitpbnQgYm9vdHBfcGFyc2Uoc3RydWN0IG5ldGRldiAqZGV2LCBzdHJ1Y3QgYm9vdHBfaGRyICpoZHIsCisJCXVpbnQ4X3QgKmV4dHMsIGludCBleHRsZW4pCit7CisJZGV2LT5ib290cC5nYXRld2F5CT0gaGRyLT5naWFkZHI7CisJZGV2LT5pcF9hZGRyCQk9IGhkci0+eWlhZGRyOworCWRldi0+aXBfc2VydmVyCQk9IGhkci0+c2lhZGRyOworCWRldi0+aXBfbmV0bWFzawkJPSBJTkFERFJfQU5ZOworCWRldi0+aXBfYnJvYWRjYXN0CT0gSU5BRERSX0FOWTsKKwlkZXYtPmlwX2dhdGV3YXkJCT0gaGRyLT5naWFkZHI7CisJZGV2LT5pcF9uYW1lc2VydmVyWzBdCT0gSU5BRERSX0FOWTsKKwlkZXYtPmlwX25hbWVzZXJ2ZXJbMV0JPSBJTkFERFJfQU5ZOworCWRldi0+aG9zdG5hbWVbMF0JPSAnXDAnOworCWRldi0+bmlzZG9tYWlubmFtZVswXQk9ICdcMCc7CisJZGV2LT5ib290cGF0aFswXQk9ICdcMCc7CisJbWVtY3B5KCZkZXYtPmZpbGVuYW1lLCAmaGRyLT5ib290X2ZpbGUsIEZOTEVOKTsKKworCWlmIChleHRsZW4gPj0gNCAmJiBleHRzWzBdID09IDk5ICYmIGV4dHNbMV0gPT0gMTMwICYmCisJICAgIGV4dHNbMl0gPT0gODMgJiYgZXh0c1szXSA9PSA5OSkgeworCQl1aW50OF90ICpleHQ7CisKKwkJZm9yIChleHQgPSBleHRzICsgNDsgZXh0IC0gZXh0cyA8IGV4dGxlbjspIHsKKwkJCWludCBsZW47CisJCQl1aW50OF90IG9wdCA9ICpleHQrKzsKKworCQkJaWYgKG9wdCA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZSBpZiAob3B0ID09IDI1NSkKKwkJCQlicmVhazsKKworCQkJbGVuID0gKmV4dCsrOworCisJCQlzd2l0Y2ggKG9wdCkgeworCQkJY2FzZSAxOgkvKiBzdWJuZXQgbWFzayAqLworCQkJCWlmIChsZW4gPT0gNCkKKwkJCQkJbWVtY3B5KCZkZXYtPmlwX25ldG1hc2ssIGV4dCwgNCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CS8qIGRlZmF1bHQgZ2F0ZXdheSAqLworCQkJCWlmIChsZW4gPj0gNCkKKwkJCQkJbWVtY3B5KCZkZXYtPmlwX2dhdGV3YXksIGV4dCwgNCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CS8qIEROUyBzZXJ2ZXIgKi8KKwkJCQlpZiAobGVuID49IDQpCisJCQkJCW1lbWNweSgmZGV2LT5pcF9uYW1lc2VydmVyLCBleHQsCisJCQkJCSAgICAgICBsZW4gPj0gOCA/IDggOiA0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTI6CS8qIGhvc3QgbmFtZSAqLworCQkJCWlmIChsZW4gPiBzaXplb2YoZGV2LT5ob3N0bmFtZSkgLSAxKQorCQkJCQlsZW4gPSBzaXplb2YoZGV2LT5ob3N0bmFtZSkgLSAxOworCQkJCW1lbWNweSgmZGV2LT5ob3N0bmFtZSwgZXh0LCBsZW4pOworCQkJCWRldi0+aG9zdG5hbWVbbGVuXSA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIDE1OgkvKiBkb21haW4gbmFtZSAqLworCQkJCWlmIChsZW4gPiBzaXplb2YoZGV2LT5kbnNkb21haW5uYW1lKSAtIDEpCisJCQkJCWxlbiA9IHNpemVvZihkZXYtPmRuc2RvbWFpbm5hbWUpIC0gMTsKKwkJCQltZW1jcHkoJmRldi0+ZG5zZG9tYWlubmFtZSwgZXh0LCBsZW4pOworCQkJCWRldi0+ZG5zZG9tYWlubmFtZVtsZW5dID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTc6CS8qIHJvb3QgcGF0aCAqLworCQkJCWlmIChsZW4gPiBzaXplb2YoZGV2LT5ib290cGF0aCkgLSAxKQorCQkJCQlsZW4gPSBzaXplb2YoZGV2LT5ib290cGF0aCkgLSAxOworCQkJCW1lbWNweSgmZGV2LT5ib290cGF0aCwgZXh0LCBsZW4pOworCQkJCWRldi0+Ym9vdHBhdGhbbGVuXSA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQljYXNlIDI2OgkvKiBpbnRlcmZhY2UgTVRVICovCisJCQkJaWYgKGxlbiA9PSAyKQorCQkJCQlkZXYtPm10dSA9IChleHRbMF0gPDwgOCkgKyBleHRbMV07CisJCQkJYnJlYWs7CisJCQljYXNlIDI4OgkvKiBicm9hZGNhc3QgYWRkciAqLworCQkJCWlmIChsZW4gPT0gNCkKKwkJCQkJbWVtY3B5KCZkZXYtPmlwX2Jyb2FkY2FzdCwgZXh0LCA0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDA6CS8qIE5JUyBkb21haW4gbmFtZSAqLworCQkJCWlmIChsZW4gPiBzaXplb2YoZGV2LT5uaXNkb21haW5uYW1lKSAtIDEpCisJCQkJCWxlbiA9IHNpemVvZihkZXYtPm5pc2RvbWFpbm5hbWUpIC0gMTsKKwkJCQltZW1jcHkoJmRldi0+bmlzZG9tYWlubmFtZSwgZXh0LCBsZW4pOworCQkJCWRldi0+bmlzZG9tYWlubmFtZVtsZW5dID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgNTQ6IAkvKiBzZXJ2ZXIgaWRlbnRpZmllciAqLworCQkJCWlmIChsZW4gPT0gNCAmJiAhZGV2LT5pcF9zZXJ2ZXIpCisJCQkJCW1lbWNweSgmZGV2LT5pcF9zZXJ2ZXIsIGV4dCwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWV4dCArPSBsZW47CisJCX0KKwl9CisKKwkvKgorCSAqIEdvdCBwYWNrZXQuCisJICovCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgYm9vdHAgcmVwbHkgYW5kIHBhcnNlIHBhY2tldAorICovCitpbnQgYm9vdHBfcmVjdl9yZXBseShzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc3RydWN0IGJvb3RwX2hkciBib290cDsKKwl1aW50OF90IGJvb3RwX29wdGlvbnNbMzEyXTsKKwlzdHJ1Y3QgaW92ZWMgaW92W10gPSB7CisJCS8qIFswXSA9IGlwICsgdWRwIGhlYWRlcnMgKi8KKwkJWzFdID0geyZib290cCwgc2l6ZW9mKHN0cnVjdCBib290cF9oZHIpfSwKKwkJWzJdID0ge2Jvb3RwX29wdGlvbnMsIDMxMn0KKwl9OworCWludCByZXQ7CisKKwlyZXQgPSBwYWNrZXRfcmVjdihpb3YsIDMpOworCWlmIChyZXQgPD0gMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChyZXQgPCBzaXplb2Yoc3RydWN0IGJvb3RwX2hkcikgfHwKKwkgICAgYm9vdHAub3AgIT0gQk9PVFBfUkVQTFkgfHwJLyogUkZDOTUxIDcuNSAqLworCSAgICBib290cC54aWQgIT0gZGV2LT5ib290cC54aWQgfHwKKwkgICAgbWVtY21wKGJvb3RwLmNoYWRkciwgZGV2LT5od2FkZHIsIDE2KSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgLT0gc2l6ZW9mKHN0cnVjdCBib290cF9oZHIpOworCisJcmV0dXJuIGJvb3RwX3BhcnNlKGRldiwgJmJvb3RwLCBib290cF9vcHRpb25zLCByZXQpOworfQorCisvKgorICogSW5pdGlhbGlzZSBpbnRlcmZhY2UgZm9yIGJvb3RwLgorICovCitpbnQgYm9vdHBfaW5pdF9pZihzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc2hvcnQgZmxhZ3M7CisKKwkvKgorCSAqIEdldCB0aGUgZGV2aWNlIGZsYWdzCisJICovCisJaWYgKG5ldGRldl9nZXRmbGFncyhkZXYsICZmbGFncykpCisJCXJldHVybiAtMTsKKworCS8qCisJICogV2UgY2FuJ3QgZG8gREhDUCBub3IgQk9PVFAgaWYgdGhpcyBkZXZpY2UKKwkgKiBkb2Vzbid0IHN1cHBvcnQgYnJvYWRjYXN0LgorCSAqLworCWlmIChkZXYtPm10dSA8IDM2NCB8fCAoZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSA9PSAwKSB7CisJCWRldi0+Y2FwcyAmPSB+KENBUF9CT09UUCB8IENBUF9ESENQKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBHZXQgYSByYW5kb20gWElECisJICovCisJZGV2LT5ib290cC54aWQgPSAodWludDMyX3QpIGxyYW5kNDgoKTsKKwlkZXYtPm9wZW5fdGltZSA9IHRpbWUoTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9ib290cF9wcm90by5oIGIvdXNyL2tpbml0L2lwY29uZmlnL2Jvb3RwX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4NzNjZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9ib290cF9wcm90by5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgSVBDT05GSUdfQk9PVFBfUFJPVE9fSAorI2RlZmluZSBJUENPTkZJR19CT09UUF9QUk9UT19ICisKK2ludCBib290cF9zZW5kX3JlcXVlc3Qoc3RydWN0IG5ldGRldiAqZGV2KTsKK2ludCBib290cF9yZWN2X3JlcGx5KHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgYm9vdHBfcGFyc2Uoc3RydWN0IG5ldGRldiAqZGV2LCBzdHJ1Y3QgYm9vdHBfaGRyICpoZHIsIHVpbnQ4X3QgKiBleHRzLAorCQlpbnQgZXh0bGVuKTsKK2ludCBib290cF9pbml0X2lmKHN0cnVjdCBuZXRkZXYgKmRldik7CisKKyNlbmRpZiAvKiBJUENPTkZJR19CT09UUF9QUk9UT19IICovCmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvZGhjcF9wcm90by5jIGIvdXNyL2tpbml0L2lwY29uZmlnL2RoY3BfcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTA5MGYzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2lwY29uZmlnL2RoY3BfcHJvdG8uYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIERIQ1AgUkZDIDIxMzEgYW5kIDIxMzIKKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJpcGNvbmZpZy5oIgorI2luY2x1ZGUgIm5ldGRldi5oIgorI2luY2x1ZGUgImJvb3RwX3BhY2tldC5oIgorI2luY2x1ZGUgImJvb3RwX3Byb3RvLmgiCisjaW5jbHVkZSAiZGhjcF9wcm90by5oIgorI2luY2x1ZGUgInBhY2tldC5oIgorCitzdGF0aWMgdWludDhfdCBkaGNwX3BhcmFtc1tdID0geworCTEsCQkJLyogc3VibmV0IG1hc2sgKi8KKwkzLAkJCS8qIGRlZmF1bHQgZ2F0ZXdheSAqLworCTYsCQkJLyogRE5TIHNlcnZlciAqLworCTEyLAkJCS8qIGhvc3QgbmFtZSAqLworCTE1LAkJCS8qIGRvbWFpbiBuYW1lICovCisJMTcsCQkJLyogcm9vdCBwYXRoICovCisJMjYsCQkJLyogaW50ZXJmYWNlIG10dSAqLworCTI4LAkJCS8qIGJyb2FkY2FzdCBhZGRyICovCisJNDAsCQkJLyogTklTIGRvbWFpbiBuYW1lICh3aHk/KSAqLworfTsKKworc3RhdGljIHVpbnQ4X3QgZGhjcF9kaXNjb3Zlcl9oZHJbXSA9IHsKKwk5OSwgMTMwLCA4MywgOTksCQkvKiBib290cCBjb29raWUgKi8KKwk1MywgMSwgREhDUERJU0NPVkVSLAkJLyogZGhjcCBtZXNzYWdlIHR5cGUgKi8KKwk1NSwgc2l6ZW9mKGRoY3BfcGFyYW1zKSwJLyogcGFyYW1ldGVyIGxpc3QgKi8KK307CisKK3N0YXRpYyB1aW50OF90IGRoY3BfcmVxdWVzdF9oZHJbXSA9IHsKKwk5OSwgMTMwLCA4MywgOTksCQkvKiBib290IGNvb2tpZSAqLworCTUzLCAxLCBESENQUkVRVUVTVCwJCS8qIGRoY3AgbWVzc2FnZSB0eXBlICovCisjZGVmaW5lIFNFUlZFUl9JUF9PRkYgOQorCTU0LCA0LCAwLCAwLCAwLCAwLAkJLyogc2VydmVyIElQICovCisjZGVmaW5lIFJFUV9JUF9PRkYgMTUKKwk1MCwgNCwgMCwgMCwgMCwgMCwJCS8qIHJlcXVlc3RlZCBJUCBhZGRyZXNzICovCisJNTUsIHNpemVvZihkaGNwX3BhcmFtcyksCS8qIHBhcmFtZXRlciBsaXN0ICovCit9OworCitzdGF0aWMgdWludDhfdCBkaGNwX2VuZFtdID0geworCTI1NSwKK307CisKKy8qIEJvdGggaW92ZWNzIGJlbG93IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUsIHNpbmNlIGRoY3Bfc2VuZCgpCisgICBwb2tlcyBhdCB0aGUgaW50ZXJuYWxzICovCisjZGVmaW5lIERIQ1BfSU9WX0xFTiA2CisKK3N0YXRpYyBzdHJ1Y3QgaW92ZWMgZGhjcF9kaXNjb3Zlcl9pb3ZbXSA9IHsKKwkvKiBbMF0gPSBpcCArIHVkcCBoZWFkZXIgKi8KKwkvKiBbMV0gPSBib290cCBoZWFkZXIgKi8KKwlbMl0gPSB7ZGhjcF9kaXNjb3Zlcl9oZHIsIHNpemVvZihkaGNwX2Rpc2NvdmVyX2hkcil9LAorCVszXSA9IHtkaGNwX3BhcmFtcywgc2l6ZW9mKGRoY3BfcGFyYW1zKX0sCisJLyogWzRdID0gREhDUCB2ZW5kb3IgY2xhc3MgKi8KKwlbNV0gPSB7ZGhjcF9lbmQsIHNpemVvZihkaGNwX2VuZCl9Cit9OworCitzdGF0aWMgc3RydWN0IGlvdmVjIGRoY3BfcmVxdWVzdF9pb3ZbXSA9IHsKKwkvKiBbMF0gPSBpcCArIHVkcCBoZWFkZXIgKi8KKwkvKiBbMV0gPSBib290cCBoZWFkZXIgKi8KKwlbMl0gPSB7ZGhjcF9yZXF1ZXN0X2hkciwgc2l6ZW9mKGRoY3BfcmVxdWVzdF9oZHIpfSwKKwlbM10gPSB7ZGhjcF9wYXJhbXMsIHNpemVvZihkaGNwX3BhcmFtcyl9LAorCS8qIFs0XSA9IERIQ1AgdmVuZG9yIGNsYXNzICovCisJWzVdID0ge2RoY3BfZW5kLCBzaXplb2YoZGhjcF9lbmQpfQorfTsKKworLyoKKyAqIFBhcnNlIGEgREhDUCByZXNwb25zZSBwYWNrZXQKKyAqLworc3RhdGljIGludAorZGhjcF9wYXJzZShzdHJ1Y3QgbmV0ZGV2ICpkZXYsIHN0cnVjdCBib290cF9oZHIgKmhkciwgdWludDhfdCAqIGV4dHMsIGludCBleHRsZW4pCit7CisJdWludDhfdCB0eXBlID0gMDsKKwl1aW50MzJfdCBzZXJ2ZXJpZCA9IElOQUREUl9OT05FOworCWludCByZXQgPSAwOworCisJaWYgKGV4dGxlbiA+PSA0ICYmIGV4dHNbMF0gPT0gOTkgJiYgZXh0c1sxXSA9PSAxMzAgJiYKKwkgICAgZXh0c1syXSA9PSA4MyAmJiBleHRzWzNdID09IDk5KSB7CisJCXVpbnQ4X3QgKmV4dDsKKworCQlmb3IgKGV4dCA9IGV4dHMgKyA0OyBleHQgLSBleHRzIDwgZXh0bGVuOykgeworCQkJdWludDhfdCBsZW4sICpvcHQgPSBleHQrKzsKKwkJCWlmICgqb3B0ID09IDApCisJCQkJY29udGludWU7CisKKwkJCWxlbiA9ICpleHQrKzsKKworCQkJZXh0ICs9IGxlbjsKKworCQkJaWYgKCpvcHQgPT0gNTMpCisJCQkJdHlwZSA9IG9wdFsyXTsKKwkJCWlmICgqb3B0ID09IDU0KQorCQkJCW1lbWNweSgmc2VydmVyaWQsIG9wdCArIDIsIDQpOworCQl9CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBESENQT0ZGRVI6CisJCXJldCA9IGJvb3RwX3BhcnNlKGRldiwgaGRyLCBleHRzLCBleHRsZW4pOworCQlpZiAocmV0ID09IDEgJiYgc2VydmVyaWQgIT0gSU5BRERSX05PTkUpCisJCQlkZXYtPnNlcnZlcmlkID0gc2VydmVyaWQ7CisJCURFQlVHKCgiXG4gICBkaGNwIG9mZmVyXG4iKSk7CisJCWJyZWFrOworCisJY2FzZSBESENQQUNLOgorCQlyZXQgPSBib290cF9wYXJzZShkZXYsIGhkciwgZXh0cywgZXh0bGVuKTsKKwkJREVCVUcoKCJcbiAgIGRoY3AgYWNrXG4iKSk7CisJCWJyZWFrOworCisJY2FzZSBESENQTkFLOgorCQlyZXQgPSAyOworCQlERUJVRygoIlxuICAgZGhjcCBuYWtcbiIpKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWNlaXZlIGFuZCBwYXJzZSBhIERIQ1AgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQgZGhjcF9yZWN2KHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYm9vdHBfaGRyIGJvb3RwOworCXVpbnQ4X3QgZGhjcF9vcHRpb25zWzE1MDBdOworCXN0cnVjdCBpb3ZlYyBpb3ZbXSA9IHsKKwkJLyogWzBdID0gaXAgKyB1ZHAgaGVhZGVyICovCisJCVsxXSA9IHsmYm9vdHAsIHNpemVvZihzdHJ1Y3QgYm9vdHBfaGRyKX0sCisJCVsyXSA9IHtkaGNwX29wdGlvbnMsIHNpemVvZihkaGNwX29wdGlvbnMpfQorCX07CisJaW50IHJldDsKKworCXJldCA9IHBhY2tldF9yZWN2KGlvdiwgMyk7CisJaWYgKHJldCA8PSAwKQorCQlyZXR1cm4gcmV0OworCisJREVCVUcoKCJcbiAgIGRoY3AgeGlkICUwOHggIiwgZGV2LT5ib290cC54aWQpKTsKKworCWlmIChyZXQgPCBzaXplb2Yoc3RydWN0IGJvb3RwX2hkcikgfHwgYm9vdHAub3AgIT0gQk9PVFBfUkVQTFkgfHwJLyogUkZDOTUxIDcuNSAqLworCSAgICBib290cC54aWQgIT0gZGV2LT5ib290cC54aWQgfHwKKwkgICAgbWVtY21wKGJvb3RwLmNoYWRkciwgZGV2LT5od2FkZHIsIDE2KSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgLT0gc2l6ZW9mKHN0cnVjdCBib290cF9oZHIpOworCisJcmV0dXJuIGRoY3BfcGFyc2UoZGV2LCAmYm9vdHAsIGRoY3Bfb3B0aW9ucywgcmV0KTsKK30KKworc3RhdGljIGludCBkaGNwX3NlbmQoc3RydWN0IG5ldGRldiAqZGV2LCBzdHJ1Y3QgaW92ZWMgKnZlYykKK3sKKwlzdHJ1Y3QgYm9vdHBfaGRyIGJvb3RwOworCisJbWVtc2V0KCZib290cCwgMCwgc2l6ZW9mKHN0cnVjdCBib290cF9oZHIpKTsKKworCWJvb3RwLm9wCT0gQk9PVFBfUkVRVUVTVDsKKwlib290cC5odHlwZQk9IGRldi0+aHd0eXBlOworCWJvb3RwLmhsZW4JPSBkZXYtPmh3bGVuOworCWJvb3RwLnhpZAk9IGRldi0+Ym9vdHAueGlkOworCWJvb3RwLmNpYWRkcgk9IGRldi0+aXBfYWRkcjsKKwlib290cC5naWFkZHIJPSBkZXYtPmJvb3RwLmdhdGV3YXk7CisJYm9vdHAuc2Vjcwk9IGh0b25zKHRpbWUoTlVMTCkgLSBkZXYtPm9wZW5fdGltZSk7CisJbWVtY3B5KGJvb3RwLmNoYWRkciwgZGV2LT5od2FkZHIsIDE2KTsKKworCXZlY1sxXS5pb3ZfYmFzZQk9ICZib290cDsKKwl2ZWNbMV0uaW92X2xlbgk9IHNpemVvZihzdHJ1Y3QgYm9vdHBfaGRyKTsKKworCXZlY1s0XS5pb3ZfYmFzZSA9IHZlbmRvcl9jbGFzc19pZGVudGlmaWVyOworCXZlY1s0XS5pb3ZfbGVuICA9IHZlbmRvcl9jbGFzc19pZGVudGlmaWVyX2xlbjsKKworCURFQlVHKCgieGlkICUwOHggc2VjcyAlZCAiLCBib290cC54aWQsIG50b2hzKGJvb3RwLnNlY3MpKSk7CisKKwlyZXR1cm4gcGFja2V0X3NlbmQoZGV2LCB2ZWMsIERIQ1BfSU9WX0xFTik7Cit9CisKKy8qCisgKiBTZW5kIGEgREhDUCBkaXNjb3ZlciBwYWNrZXQKKyAqLworaW50IGRoY3Bfc2VuZF9kaXNjb3ZlcihzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJZGV2LT5pcF9hZGRyID0gSU5BRERSX0FOWTsKKwlkZXYtPmlwX2dhdGV3YXkgPSBJTkFERFJfQU5ZOworCisJREVCVUcoKCItPiBkaGNwIGRpc2NvdmVyICIpKTsKKworCXJldHVybiBkaGNwX3NlbmQoZGV2LCBkaGNwX2Rpc2NvdmVyX2lvdik7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgREhDUCBvZmZlciBwYWNrZXQKKyAqLworaW50IGRoY3BfcmVjdl9vZmZlcihzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJcmV0dXJuIGRoY3BfcmVjdihkZXYpOworfQorCisvKgorICogU2VuZCBhIERIQ1AgcmVxdWVzdCBwYWNrZXQKKyAqLworaW50IGRoY3Bfc2VuZF9yZXF1ZXN0KHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwltZW1jcHkoJmRoY3BfcmVxdWVzdF9oZHJbU0VSVkVSX0lQX09GRl0sICZkZXYtPnNlcnZlcmlkLCA0KTsKKwltZW1jcHkoJmRoY3BfcmVxdWVzdF9oZHJbUkVRX0lQX09GRl0sICZkZXYtPmlwX2FkZHIsIDQpOworCisJREVCVUcoKCItPiBkaGNwIHJlcXVlc3QgIikpOworCisJcmV0dXJuIGRoY3Bfc2VuZChkZXYsIGRoY3BfcmVxdWVzdF9pb3YpOworfQorCisvKgorICogUmVjZWl2ZSBhIERIQ1AgYWNrIHBhY2tldAorICovCitpbnQgZGhjcF9yZWN2X2FjayhzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJcmV0dXJuIGRoY3BfcmVjdihkZXYpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL2RoY3BfcHJvdG8uaCBiL3Vzci9raW5pdC9pcGNvbmZpZy9kaGNwX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiYTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9kaGNwX3Byb3RvLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBJUENPTkZJR19ESENQX1BST1RPX0gKKyNkZWZpbmUgSVBDT05GSUdfREhDUF9QUk9UT19ICisKKy8qIERIQ1AgbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBESENQRElTQ09WRVIgICAgMQorI2RlZmluZSBESENQT0ZGRVIgICAgICAgMgorI2RlZmluZSBESENQUkVRVUVTVCAgICAgMworI2RlZmluZSBESENQREVDTElORSAgICAgNAorI2RlZmluZSBESENQQUNLICAgICAgICAgNQorI2RlZmluZSBESENQTkFLICAgICAgICAgNgorI2RlZmluZSBESENQUkVMRUFTRSAgICAgNworI2RlZmluZSBESENQSU5GT1JNICAgICAgOAorCitpbnQgZGhjcF9zZW5kX2Rpc2NvdmVyKHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgZGhjcF9yZWN2X29mZmVyKHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgZGhjcF9zZW5kX3JlcXVlc3Qoc3RydWN0IG5ldGRldiAqZGV2KTsKK2ludCBkaGNwX3JlY3ZfYWNrKHN0cnVjdCBuZXRkZXYgKmRldik7CisKKyNlbmRpZiAvKiBJUENPTkZJR19ESENQX1BST1RPX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9pcGNvbmZpZy5oIGIvdXNyL2tpbml0L2lwY29uZmlnL2lwY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MDQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9pcGNvbmZpZy5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgSVBDT05GSUdfSVBDT05GSUdfSAorI2RlZmluZSBJUENPTkZJR19JUENPTkZJR19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2RlZmluZSBMT0NBTF9QT1JUCTY4CisjZGVmaW5lIFJFTU9URV9QT1JUCShMT0NBTF9QT1JUIC0gMSkKKworZXh0ZXJuIHVpbnQxNl90IGNmZ19sb2NhbF9wb3J0OworZXh0ZXJuIHVpbnQxNl90IGNmZ19yZW1vdGVfcG9ydDsKKworZXh0ZXJuIGNoYXIgdmVuZG9yX2NsYXNzX2lkZW50aWZpZXJbXTsKK2V4dGVybiBpbnQgdmVuZG9yX2NsYXNzX2lkZW50aWZpZXJfbGVuOworCitpbnQgaXBjb25maWdfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK3VpbnQzMl90IGlwY29uZmlnX3NlcnZlcl9hZGRyZXNzKHZvaWQgKm5leHQpOworCisvKgorICogTm90ZSBmb3IgZ2NjIDMuMi4yOgorICoKKyAqIElmIHlvdSdyZSB0dXJuaW5nIG9uIGRlYnVnZ2luZywgbWFrZSBzdXJlIHlvdSBnZXQgcmlkIG9mIC1PcyBmcm9tCisgKiB0aGUgZ2NjIGNvbW1hbmQgbGluZSwgb3IgZWxzZSBpcGNvbmZpZyB3aWxsIGZhaWwgdG8gbGluay4KKyAqLworI2RlZmluZSBJUENfREVCVUcKKworI3VuZGVmIERFQlVHCisjaWZkZWYgSVBDX0RFQlVHCisjZGVmaW5lIERFQlVHKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBERUJVRyh4KSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogSVBDT05GSUdfSVBDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL21haW4uYyBiL3Vzci9raW5pdC9pcGNvbmZpZy9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxNDFlNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9tYWluLmMKQEAgLTAsMCArMSw3ODYgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CQkvKiBmb3IgZ2V0b3B0cyAqLworCisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorCisjaW5jbHVkZSAiaXBjb25maWcuaCIKKyNpbmNsdWRlICJuZXRkZXYuaCIKKyNpbmNsdWRlICJib290cF9wYWNrZXQuaCIKKyNpbmNsdWRlICJib290cF9wcm90by5oIgorI2luY2x1ZGUgImRoY3BfcHJvdG8uaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgc3lzZnNfY2xhc3NfbmV0W10gPSAiL3N5cy9jbGFzcy9uZXQiOworc3RhdGljIGNvbnN0IGNoYXIgKnByb2duYW1lOworc3RhdGljIGptcF9idWYgYWJvcnRfYnVmOworc3RhdGljIGNoYXIgZG9fbm90X2NvbmZpZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVmYXVsdF9jYXBzID0gQ0FQX0RIQ1AgfCBDQVBfQk9PVFAgfCBDQVBfUkFSUDsKK3N0YXRpYyBpbnQgbG9vcF90aW1lb3V0ID0gLTE7CitzdGF0aWMgaW50IGNvbmZpZ3VyZWQ7CitzdGF0aWMgaW50IGJyaW5ndXBfZmlyc3QgPSAwOworCisvKiBESENQIHZlbmRvciBjbGFzcyBpZGVudGlmaWVyICovCitjaGFyIHZlbmRvcl9jbGFzc19pZGVudGlmaWVyWzI2MF07CitpbnQgdmVuZG9yX2NsYXNzX2lkZW50aWZpZXJfbGVuOworCitzdHJ1Y3Qgc3RhdGUgeworCWludCBzdGF0ZTsKKwlpbnQgcmVzdGFydF9zdGF0ZTsKKwl0aW1lX3QgZXhwaXJlOworCWludCByZXRyeV9wZXJpb2Q7CisKKwlzdHJ1Y3QgbmV0ZGV2ICpkZXY7CisJc3RydWN0IHN0YXRlICpuZXh0OworfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpteV9pbmV0X250b2EodWludDMyX3QgYWRkcikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBhOworCisJYS5zX2FkZHIgPSBhZGRyOworCisJcmV0dXJuIGluZXRfbnRvYShhKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZGV2aWNlX2NvbmZpZyhzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJcHJpbnRmKCJJUC1Db25maWc6ICVzIGNvbXBsZXRlIChmcm9tICVzKTpcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgbXlfaW5ldF9udG9hKGRldi0+c2VydmVyaWQgPyBkZXYtPnNlcnZlcmlkIDogZGV2LT5pcF9zZXJ2ZXIpKTsKKwlwcmludGYoIiBhZGRyZXNzOiAlLTE2cyAiLCBteV9pbmV0X250b2EoZGV2LT5pcF9hZGRyKSk7CisJcHJpbnRmKCJicm9hZGNhc3Q6ICUtMTZzICIsIG15X2luZXRfbnRvYShkZXYtPmlwX2Jyb2FkY2FzdCkpOworCXByaW50ZigibmV0bWFzazogJS0xNnNcbiIsIG15X2luZXRfbnRvYShkZXYtPmlwX25ldG1hc2spKTsKKwlwcmludGYoIiBnYXRld2F5OiAlLTE2cyAiLCBteV9pbmV0X250b2EoZGV2LT5pcF9nYXRld2F5KSk7CisJcHJpbnRmKCJkbnMwICAgICA6ICUtMTZzICIsIG15X2luZXRfbnRvYShkZXYtPmlwX25hbWVzZXJ2ZXJbMF0pKTsKKwlwcmludGYoImRuczEgICA6ICUtMTZzXG4iLCBteV9pbmV0X250b2EoZGV2LT5pcF9uYW1lc2VydmVyWzFdKSk7CisJaWYgKGRldi0+aG9zdG5hbWVbMF0pCisJCXByaW50ZigiIGhvc3QgICA6ICUtNjRzXG4iLCBkZXYtPmhvc3RuYW1lKTsKKwlpZiAoZGV2LT5kbnNkb21haW5uYW1lWzBdKQorCQlwcmludGYoIiBkb21haW4gOiAlLTY0c1xuIiwgZGV2LT5kbnNkb21haW5uYW1lKTsKKwlpZiAoZGV2LT5uaXNkb21haW5uYW1lWzBdKQorCQlwcmludGYoIiBuaXNkb21haW46ICUtNjRzXG4iLCBkZXYtPm5pc2RvbWFpbm5hbWUpOworCXByaW50ZigiIHJvb3RzZXJ2ZXI6ICVzICIsIG15X2luZXRfbnRvYShkZXYtPmlwX3NlcnZlcikpOworCXByaW50Zigicm9vdHBhdGg6ICVzXG4iLCBkZXYtPmJvb3RwYXRoKTsKKwlwcmludGYoIiBmaWxlbmFtZSAgOiAlc1xuIiwgZGV2LT5maWxlbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ3VyZV9kZXZpY2Uoc3RydWN0IG5ldGRldiAqZGV2KQoreworCWlmIChkb19ub3RfY29uZmlnKQorCQlyZXR1cm47CisKKwlpZiAobmV0ZGV2X3NldG10dShkZXYpKQorCQlwcmludGYoIklQLUNvbmZpZzogZmFpbGVkIHRvIHNldCBNVFUgb24gJXMgdG8gJXVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+bXR1KTsKKworCWlmIChuZXRkZXZfc2V0YWRkcmVzcyhkZXYpKQorCQlwcmludGYoIklQLUNvbmZpZzogZmFpbGVkIHRvIHNldCBhZGRyZXNzZXMgb24gJXNcbiIsIGRldi0+bmFtZSk7CisJaWYgKG5ldGRldl9zZXRkZWZhdWx0cm91dGUoZGV2KSkKKwkJcHJpbnRmKCJJUC1Db25maWc6IGZhaWxlZCB0byBzZXQgZGVmYXVsdCByb3V0ZSBvbiAlc1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJaWYgKGRldi0+aG9zdG5hbWVbMF0gJiYKKwkJCXNldGhvc3RuYW1lKGRldi0+aG9zdG5hbWUsIHN0cmxlbihkZXYtPmhvc3RuYW1lKSkpCisJCXByaW50ZigiSVAtQ29uZmlnOiBmYWlsZWQgdG8gc2V0IGhvc3RuYW1lICclcycgZnJvbSAlc1xuIiwKKwkJCWRldi0+aG9zdG5hbWUsIGRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZGV2aWNlX2NvbmZpZyhzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJY2hhciBmbls0MF07CisJRklMRSAqZjsKKworCXNucHJpbnRmKGZuLCBzaXplb2YoZm4pLCAiL3RtcC9uZXQtJXMuY29uZiIsIGRldi0+bmFtZSk7CisJZiA9IGZvcGVuKGZuLCAidyIpOworCWlmIChmKSB7CisJCWZwcmludGYoZiwgIkRFVklDRT0lc1xuIiwgZGV2LT5uYW1lKTsKKwkJZnByaW50ZihmLCAiSVBWNEFERFI9JXNcbiIsIG15X2luZXRfbnRvYShkZXYtPmlwX2FkZHIpKTsKKwkJZnByaW50ZihmLCAiSVBWNEJST0FEQ0FTVD0lc1xuIiwKKwkJCW15X2luZXRfbnRvYShkZXYtPmlwX2Jyb2FkY2FzdCkpOworCQlmcHJpbnRmKGYsICJJUFY0TkVUTUFTSz0lc1xuIiwgbXlfaW5ldF9udG9hKGRldi0+aXBfbmV0bWFzaykpOworCQlmcHJpbnRmKGYsICJJUFY0R0FURVdBWT0lc1xuIiwgbXlfaW5ldF9udG9hKGRldi0+aXBfZ2F0ZXdheSkpOworCQlmcHJpbnRmKGYsICJJUFY0RE5TMD0lc1xuIiwKKwkJCW15X2luZXRfbnRvYShkZXYtPmlwX25hbWVzZXJ2ZXJbMF0pKTsKKwkJZnByaW50ZihmLCAiSVBWNEROUzE9JXNcbiIsCisJCQlteV9pbmV0X250b2EoZGV2LT5pcF9uYW1lc2VydmVyWzFdKSk7CisJCWZwcmludGYoZiwgIkhPU1ROQU1FPSVzXG4iLCBkZXYtPmhvc3RuYW1lKTsKKwkJZnByaW50ZihmLCAiRE5TRE9NQUlOPSVzXG4iLCBkZXYtPmRuc2RvbWFpbm5hbWUpOworCQlmcHJpbnRmKGYsICJOSVNET01BSU49JXNcbiIsIGRldi0+bmlzZG9tYWlubmFtZSk7CisJCWZwcmludGYoZiwgIlJPT1RTRVJWRVI9JXNcbiIsIG15X2luZXRfbnRvYShkZXYtPmlwX3NlcnZlcikpOworCQlmcHJpbnRmKGYsICJST09UUEFUSD0lc1xuIiwgZGV2LT5ib290cGF0aCk7CisJCWZwcmludGYoZiwgImZpbGVuYW1lPVwiJXNcIlxuIiwgZGV2LT5maWxlbmFtZSk7CisJCWZjbG9zZShmKTsKKwl9Cit9CisKK3N0YXRpYyB1aW50MzJfdCBpbmV0X2NsYXNzX25ldG1hc2sodWludDMyX3QgaXApCit7CisJaXAgPSBudG9obChpcCk7CisJaWYgKElOX0NMQVNTQShpcCkpCisJCXJldHVybiBodG9ubChJTl9DTEFTU0FfTkVUKTsKKwlpZiAoSU5fQ0xBU1NCKGlwKSkKKwkJcmV0dXJuIGh0b25sKElOX0NMQVNTQl9ORVQpOworCWlmIChJTl9DTEFTU0MoaXApKQorCQlyZXR1cm4gaHRvbmwoSU5fQ0xBU1NDX05FVCk7CisJcmV0dXJuIElOQUREUl9BTlk7Cit9CisKK3N0YXRpYyB2b2lkIHBvc3Rwcm9jZXNzX2RldmljZShzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJaWYgKGRldi0+aXBfbmV0bWFzayA9PSBJTkFERFJfQU5ZKSB7CisJCWRldi0+aXBfbmV0bWFzayA9IGluZXRfY2xhc3NfbmV0bWFzayhkZXYtPmlwX2FkZHIpOworCQlwcmludGYoIklQLUNvbmZpZzogJXMgZ3Vlc3NlZCBuZXRtYXNrICVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBteV9pbmV0X250b2EoZGV2LT5pcF9uZXRtYXNrKSk7CisJfQorCWlmIChkZXYtPmlwX2Jyb2FkY2FzdCA9PSBJTkFERFJfQU5ZKSB7CisJCWRldi0+aXBfYnJvYWRjYXN0ID0KKwkJICAgIChkZXYtPmlwX2FkZHIgJiBkZXYtPmlwX25ldG1hc2spIHwgfmRldi0+aXBfbmV0bWFzazsKKwkJcHJpbnRmKCJJUC1Db25maWc6ICVzIGd1ZXNzZWQgYnJvYWRjYXN0IGFkZHJlc3MgJXNcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG15X2luZXRfbnRvYShkZXYtPmlwX2Jyb2FkY2FzdCkpOworCX0KKwlpZiAoZGV2LT5pcF9uYW1lc2VydmVyWzBdID09IElOQUREUl9BTlkpIHsKKwkJZGV2LT5pcF9uYW1lc2VydmVyWzBdID0gZGV2LT5pcF9zZXJ2ZXI7CisJCXByaW50ZigiSVAtQ29uZmlnOiAlcyBndWVzc2VkIG5hbWVzZXJ2ZXIgYWRkcmVzcyAlc1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbXlfaW5ldF9udG9hKGRldi0+aXBfbmFtZXNlcnZlclswXSkpOworCX0KK30KKworc3RhdGljIHZvaWQgY29tcGxldGVfZGV2aWNlKHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlwb3N0cHJvY2Vzc19kZXZpY2UoZGV2KTsKKwljb25maWd1cmVfZGV2aWNlKGRldik7CisJZHVtcF9kZXZpY2VfY29uZmlnKGRldik7CisJcHJpbnRfZGV2aWNlX2NvbmZpZyhkZXYpOworCisJKytjb25maWd1cmVkOworCisJZGV2LT5uZXh0ID0gaWZhY2VzOworCWlmYWNlcyA9IGRldjsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JlY2VpdmVfZXZlbnQoc3RydWN0IHN0YXRlICpzLCB0aW1lX3Qgbm93KQoreworCWludCBoYW5kbGVkID0gMTsKKworCXN3aXRjaCAocy0+c3RhdGUpIHsKKwljYXNlIERFVlNUX0JPT1RQOgorCQlzLT5yZXN0YXJ0X3N0YXRlID0gREVWU1RfQk9PVFA7CisJCXN3aXRjaCAoYm9vdHBfcmVjdl9yZXBseShzLT5kZXYpKSB7CisJCWNhc2UgLTE6CisJCQlzLT5zdGF0ZSA9IERFVlNUX0VSUk9SOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXMtPnN0YXRlID0gREVWU1RfQ09NUExFVEU7CisJCQlERUJVRygoIlxuICAgYm9vdHAgcmVwbHlcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBERVZTVF9ESENQRElTQzoKKwkJcy0+cmVzdGFydF9zdGF0ZSA9IERFVlNUX0RIQ1BESVNDOworCQlzd2l0Y2ggKGRoY3BfcmVjdl9vZmZlcihzLT5kZXYpKSB7CisJCWNhc2UgLTE6CisJCQlzLT5zdGF0ZSA9IERFVlNUX0VSUk9SOworCQkJYnJlYWs7CisJCWNhc2UgMToJLyogT2ZmZXIgcmVjZWl2ZWQgKi8KKwkJCXMtPnN0YXRlID0gREVWU1RfREhDUFJFUTsKKwkJCWRoY3Bfc2VuZF9yZXF1ZXN0KHMtPmRldik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgREVWU1RfREhDUFJFUToKKwkJcy0+cmVzdGFydF9zdGF0ZSA9IERFVlNUX0RIQ1BESVNDOworCQlzd2l0Y2ggKGRoY3BfcmVjdl9hY2socy0+ZGV2KSkgeworCQljYXNlIC0xOgkvKiBlcnJvciAqLworCQkJcy0+c3RhdGUgPSBERVZTVF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIEFDSyByZWNlaXZlZCAqLworCQkJcy0+c3RhdGUgPSBERVZTVF9DT01QTEVURTsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8qIE5BSyByZWNlaXZlZCAqLworCQkJcy0+c3RhdGUgPSBERVZTVF9ESENQRElTQzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocy0+c3RhdGUpIHsKKwljYXNlIERFVlNUX0NPTVBMRVRFOgorCQljb21wbGV0ZV9kZXZpY2Uocy0+ZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIERFVlNUX0VSUk9SOgorCQkvKiBlcnJvciBvY2N1cnJlZCwgdHJ5IGFnYWluIGluIDEwIHNlY29uZHMgKi8KKwkJcy0+ZXhwaXJlID0gbm93ICsgMTA7CisJZGVmYXVsdDoKKwkJREVCVUcoKCJcbiIpKTsKKwkJaGFuZGxlZCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3RpbWVvdXRfZXZlbnQoc3RydWN0IHN0YXRlICpzLCB0aW1lX3Qgbm93KQoreworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBJcyB0aGUgbGluayB1cD8gIElmIG5vdCwgdHJ5IGFnYWluIGluIDEgc2Vjb25kLgorCSAqLworCWlmICghbmV0ZGV2X3J1bm5pbmcocy0+ZGV2KSkgeworCQlzLT5leHBpcmUgPSBub3cgKyAxOworCQlzLT5zdGF0ZSA9IHMtPnJlc3RhcnRfc3RhdGU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhZCBhbiBlcnJvciwgcmVzdG9yZSBhIHNhbmUgc3RhdGUgdG8KKwkgKiByZXN0YXJ0IGZyb20uCisJICovCisJaWYgKHMtPnN0YXRlID09IERFVlNUX0VSUk9SKQorCQlzLT5zdGF0ZSA9IHMtPnJlc3RhcnRfc3RhdGU7CisKKwkvKgorCSAqIE5vdyBzZW5kIGEgcGFja2V0IGRlcGVuZGluZyBvbiBvdXIgc3RhdGUuCisJICovCisJc3dpdGNoIChzLT5zdGF0ZSkgeworCWNhc2UgREVWU1RfQk9PVFA6CisJCXJldCA9IGJvb3RwX3NlbmRfcmVxdWVzdChzLT5kZXYpOworCQlzLT5yZXN0YXJ0X3N0YXRlID0gREVWU1RfQk9PVFA7CisJCWJyZWFrOworCisJY2FzZSBERVZTVF9ESENQRElTQzoKKwkJcmV0ID0gZGhjcF9zZW5kX2Rpc2NvdmVyKHMtPmRldik7CisJCXMtPnJlc3RhcnRfc3RhdGUgPSBERVZTVF9ESENQRElTQzsKKwkJYnJlYWs7CisKKwljYXNlIERFVlNUX0RIQ1BSRVE6CisJCXJldCA9IGRoY3Bfc2VuZF9yZXF1ZXN0KHMtPmRldik7CisJCXMtPnJlc3RhcnRfc3RhdGUgPSBERVZTVF9ESENQRElTQzsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA9PSAtMSkgeworCQlzLT5zdGF0ZSA9IERFVlNUX0VSUk9SOworCQlzLT5leHBpcmUgPSBub3cgKyAxMDsKKwl9IGVsc2UgeworCQlzLT5leHBpcmUgPSBub3cgKyBzLT5yZXRyeV9wZXJpb2Q7CisKKwkJcy0+cmV0cnlfcGVyaW9kICo9IDI7CisJCWlmIChzLT5yZXRyeV9wZXJpb2QgPiA2MCkKKwkJCXMtPnJldHJ5X3BlcmlvZCA9IDYwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzdGF0ZSAqc2xpc3Q7CitzdHJ1Y3QgbmV0ZGV2ICppZmFjZXM7CisKK3N0YXRpYyBpbnQgZG9fcGt0X3JlY3YoaW50IHBrdF9mZCwgdGltZV90IG5vdykKK3sKKwlpbnQgaWZpbmRleCwgcmV0OworCXN0cnVjdCBzdGF0ZSAqczsKKworCXJldCA9IHBhY2tldF9wZWVrKCZpZmluZGV4KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBiYWlsOworCisJZm9yIChzID0gc2xpc3Q7IHM7IHMgPSBzLT5uZXh0KSB7CisJCWlmIChzLT5kZXYtPmlmaW5kZXggPT0gaWZpbmRleCkgeworCQkJcmV0IHw9IHByb2Nlc3NfcmVjZWl2ZV9ldmVudChzLCBub3cpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgIGJhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsb29wKHZvaWQpCit7CisjZGVmaW5lIE5SX0ZEUwkxCisJc3RydWN0IHBvbGxmZCBmZHNbTlJfRkRTXTsKKwlzdHJ1Y3Qgc3RhdGUgKnM7CisJaW50IHBrdF9mZDsKKwlpbnQgbnIgPSAwOworCXN0cnVjdCB0aW1ldmFsIG5vdywgcHJldjsKKwl0aW1lX3Qgc3RhcnQ7CisKKwlwa3RfZmQgPSBwYWNrZXRfb3BlbigpOworCWlmIChwa3RfZmQgPT0gLTEpIHsKKwkJcGVycm9yKCJwYWNrZXRfb3BlbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZmRzWzBdLmZkID0gcGt0X2ZkOworCWZkc1swXS5ldmVudHMgPSBQT0xMUkROT1JNOworCisJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCXN0YXJ0ID0gbm93LnR2X3NlYzsKKwl3aGlsZSAoMSkgeworCQlpbnQgdGltZW91dCA9IDYwOworCQlpbnQgcGVuZGluZyA9IDA7CisJCWludCBkb25lID0gMDsKKwkJaW50IHRpbWVvdXRfbXM7CisJCWludCB4OworCisJCWZvciAocyA9IHNsaXN0OyBzOyBzID0gcy0+bmV4dCkgeworCQkJREVCVUcoKCIlczogc3RhdGUgPSAlZFxuIiwgcy0+ZGV2LT5uYW1lLCBzLT5zdGF0ZSkpOworCisJCQlpZiAocy0+c3RhdGUgPT0gREVWU1RfQ09NUExFVEUpIHsKKwkJCQlkb25lKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXBlbmRpbmcrKzsKKworCQkJaWYgKHMtPmV4cGlyZSAtIG5vdy50dl9zZWMgPD0gMCkgeworCQkJCURFQlVHKCgidGltZW91dFxuIikpOworCQkJCXByb2Nlc3NfdGltZW91dF9ldmVudChzLCBub3cudHZfc2VjKTsKKwkJCX0KKworCQkJaWYgKHRpbWVvdXQgPiBzLT5leHBpcmUgLSBub3cudHZfc2VjKQorCQkJCXRpbWVvdXQgPSBzLT5leHBpcmUgLSBub3cudHZfc2VjOworCQl9CisKKwkJaWYgKHBlbmRpbmcgPT0gMCB8fCAoYnJpbmd1cF9maXJzdCAmJiBkb25lKSkKKwkJCWJyZWFrOworCisJCXRpbWVvdXRfbXMgPSB0aW1lb3V0ICogMTAwMDsKKworCQlmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7CisJCQlpbnQgZGVsdGFfbXM7CisKKwkJCWlmICh0aW1lb3V0X21zIDw9IDApCisJCQkJdGltZW91dF9tcyA9IDEwMDsKKworCQkJbnIgPSBwb2xsKGZkcywgTlJfRkRTLCB0aW1lb3V0X21zKTsKKwkJCXByZXYgPSBub3c7CisJCQlnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisKKwkJCWlmICgoZmRzWzBdLnJldmVudHMgJiBQT0xMUkROT1JNKSkgeworCQkJCW5yID0gZG9fcGt0X3JlY3YocGt0X2ZkLCBub3cudHZfc2VjKTsKKwkJCQlpZiAobnIgPT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZSBpZiAobnIgPT0gMCkKKwkJCQkJcGFja2V0X2Rpc2NhcmQoKTsKKwkJCX0KKworCQkJaWYgKGxvb3BfdGltZW91dCA+PSAwICYmCisJCQkgICAgbm93LnR2X3NlYyAtIHN0YXJ0ID49IGxvb3BfdGltZW91dCkgeworCQkJCXByaW50ZigiSVAtQ29uZmlnOiBubyByZXNwb25zZSBhZnRlciAlZCAiCisJCQkJICAgICAgICJzZWNzIC0gZ2l2aW5nIHVwXG4iLCBsb29wX3RpbWVvdXQpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKworCQkJZGVsdGFfbXMgPSAobm93LnR2X3NlYyAtIHByZXYudHZfc2VjKSAqIDEwMDA7CisJCQlkZWx0YV9tcyArPSAobm93LnR2X3VzZWMgLSBwcmV2LnR2X3VzZWMpIC8gMTAwMDsKKworCQkJREVCVUcoKCJEZWx0YTogJWQgbXNcbiIsIGRlbHRhX21zKSk7CisKKwkJCXRpbWVvdXRfbXMgLT0gZGVsdGFfbXM7CisJCX0KKwl9CisgICAgICBiYWlsOgorCXBhY2tldF9jbG9zZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX29uZV9kZXYoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXN0cnVjdCBzdGF0ZSAqc3RhdGU7CisKKwlzdGF0ZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0YXRlKSk7CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIC0xOworCisJc3RhdGUtPmRldiA9IGRldjsKKwlzdGF0ZS0+ZXhwaXJlID0gdGltZShOVUxMKTsKKwlzdGF0ZS0+cmV0cnlfcGVyaW9kID0gMTsKKworCS8qCisJICogU2VsZWN0IHRoZSBzdGF0ZSB0aGF0IHdlIHN0YXJ0IGZyb20uCisJICovCisJaWYgKGRldi0+Y2FwcyAmIENBUF9ESENQICYmIGRldi0+aXBfYWRkciA9PSBJTkFERFJfQU5ZKSB7CisJCXN0YXRlLT5yZXN0YXJ0X3N0YXRlID0gc3RhdGUtPnN0YXRlID0gREVWU1RfREhDUERJU0M7CisJfSBlbHNlIGlmIChkZXYtPmNhcHMgJiBDQVBfREhDUCkgeworCQlzdGF0ZS0+cmVzdGFydF9zdGF0ZSA9IHN0YXRlLT5zdGF0ZSA9IERFVlNUX0RIQ1BSRVE7CisJfSBlbHNlIGlmIChkZXYtPmNhcHMgJiBDQVBfQk9PVFApIHsKKwkJc3RhdGUtPnJlc3RhcnRfc3RhdGUgPSBzdGF0ZS0+c3RhdGUgPSBERVZTVF9CT09UUDsKKwl9CisKKwlzdGF0ZS0+bmV4dCA9IHNsaXN0OworCXNsaXN0ID0gc3RhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfYWRkcih1aW50MzJfdCAqIGFkZHIsIGNvbnN0IGNoYXIgKmlwKQoreworCXN0cnVjdCBpbl9hZGRyIGluOworCWlmIChpbmV0X2F0b24oaXAsICZpbikgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBwYXJzZSBJUCBhZGRyZXNzICclcydcbiIsCisJCQlwcm9nbmFtZSwgaXApOworCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJfQorCSphZGRyID0gaW4uc19hZGRyOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBhcnNlX3Byb3RvKGNvbnN0IGNoYXIgKmlwKQoreworCXVuc2lnbmVkIGludCBjYXBzID0gMDsKKworCWlmICgqaXAgPT0gJ1wwJyB8fCBzdHJjbXAoaXAsICJvbiIpID09IDAgfHwgc3RyY21wKGlwLCAiYW55IikgPT0gMCkKKwkJY2FwcyA9IENBUF9CT09UUCB8IENBUF9ESENQIHwgQ0FQX1JBUlA7CisJZWxzZSBpZiAoc3RyY21wKGlwLCAiYm90aCIpID09IDApCisJCWNhcHMgPSBDQVBfQk9PVFAgfCBDQVBfUkFSUDsKKwllbHNlIGlmIChzdHJjbXAoaXAsICJkaGNwIikgPT0gMCkKKwkJY2FwcyA9IENBUF9CT09UUCB8IENBUF9ESENQOworCWVsc2UgaWYgKHN0cmNtcChpcCwgImJvb3RwIikgPT0gMCkKKwkJY2FwcyA9IENBUF9CT09UUDsKKwllbHNlIGlmIChzdHJjbXAoaXAsICJyYXJwIikgPT0gMCkKKwkJY2FwcyA9IENBUF9SQVJQOworCWVsc2UgaWYgKHN0cmNtcChpcCwgIm5vbmUiKSA9PSAwIHx8IHN0cmNtcChpcCwgInN0YXRpYyIpID09IDAKKwkJIHx8IHN0cmNtcChpcCwgIm9mZiIpID09IDApCisJCWdvdG8gYmFpbDsKKwllbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBwcm90b2NvbCAnJXMnXG4iLCBwcm9nbmFtZSwgaXApOworCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJfQorICAgICAgYmFpbDoKKwlyZXR1cm4gY2FwczsKK30KKworc3RhdGljIGludCBhZGRfYWxsX2RldmljZXMoc3RydWN0IG5ldGRldiAqdGVtcGxhdGUpOworCitzdGF0aWMgaW50IHBhcnNlX2RldmljZShzdHJ1Y3QgbmV0ZGV2ICpkZXYsIGNvbnN0IGNoYXIgKmlwKQoreworCWNoYXIgKmNwOworCWludCBpLCBvcHQ7CisJaW50IGlzX2lwID0gMDsKKworCURFQlVHKCgiSVAtQ29uZmlnOiBwYXJzZV9kZXZpY2U6IFwiJXNcIlxuIiwgaXApKTsKKworCWlmIChzdHJuY21wKGlwLCAiaXA9IiwgMykgPT0gMCkgeworCQlpcCArPSAzOworCQlpc19pcCA9IDE7CisJfSBlbHNlIGlmIChzdHJuY21wKGlwLCAibmZzYWRkcnM9IiwgOSkgPT0gMCkgeworCQlpcCArPSA5OworCQlpc19pcCA9IDE7CS8qIE5vdCBzdXJlIGFib3V0IHRoaXMuLi4/ICovCisJfQorCisJaWYgKCFzdHJjaHIoaXAsICc6JykpIHsKKwkJLyogT25seSBvbmUgb3B0aW9uLCBlLmcuICJpcD1kaGNwIiwgb3IgaXQncyBhbiBpbnRlcmZhY2UgbmFtZSAqLworCQlpZiAoaXNfaXApIHsKKwkJCWRldi0+Y2FwcyA9IHBhcnNlX3Byb3RvKGlwKTsKKwkJCWJyaW5ndXBfZmlyc3QgPSAxOworCQl9IGVsc2UgeworCQkJZGV2LT5uYW1lID0gaXA7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSBvcHQgPSAwOyBpcCAmJiAqaXA7IGlwID0gY3AsIG9wdCsrKSB7CisJCQlpZiAoKGNwID0gc3RyY2hyKGlwLCAnOicpKSkgeworCQkJCSpjcCsrID0gJ1wwJzsKKwkJCX0KKwkJCWlmIChvcHQgPiA2KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogdG9vIG1hbnkgb3B0aW9ucyBmb3IgJXNcbiIsCisJCQkJCXByb2duYW1lLCBkZXYtPm5hbWUpOworCQkJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwkJCX0KKworCQkJaWYgKCppcCA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCQkJREVCVUcoKCJJUC1Db25maWc6IG9wdCAjJWQ6ICclcydcbiIsIG9wdCwgaXApKTsKKwkJCXN3aXRjaCAob3B0KSB7CisJCQljYXNlIDA6CisJCQkJcGFyc2VfYWRkcigmZGV2LT5pcF9hZGRyLCBpcCk7CisJCQkJZGV2LT5jYXBzID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlwYXJzZV9hZGRyKCZkZXYtPmlwX3NlcnZlciwgaXApOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBhcnNlX2FkZHIoJmRldi0+aXBfZ2F0ZXdheSwgaXApOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXBhcnNlX2FkZHIoJmRldi0+aXBfbmV0bWFzaywgaXApOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXN0cm5jcHkoZGV2LT5ob3N0bmFtZSwgaXAsIFNZU19OTUxOIC0gMSk7CisJCQkJZGV2LT5ob3N0bmFtZVtTWVNfTk1MTiAtIDFdID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlkZXYtPm5hbWUgPSBpcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQlkZXYtPmNhcHMgPSBwYXJzZV9wcm90byhpcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZGV2LT5uYW1lID09IE5VTEwgfHwKKwkgICAgZGV2LT5uYW1lWzBdID09ICdcMCcgfHwgc3RyY21wKGRldi0+bmFtZSwgImFsbCIpID09IDApIHsKKwkJYWRkX2FsbF9kZXZpY2VzKGRldik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgYnJpbmd1cF9kZXZpY2Uoc3RydWN0IG5ldGRldiAqZGV2KQoreworCWlmIChuZXRkZXZfdXAoZGV2KSA9PSAwKSB7CisJCWlmIChkZXYtPmNhcHMpIHsKKwkJCWFkZF9vbmVfZGV2KGRldik7CisJCX0gZWxzZSB7CisJCQljb21wbGV0ZV9kZXZpY2UoZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYnJpbmd1cF9vbmVfZGV2KHN0cnVjdCBuZXRkZXYgKnRlbXBsYXRlLCBzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJaWYgKHRlbXBsYXRlLT5pcF9hZGRyICE9IElOQUREUl9OT05FKQorCQlkZXYtPmlwX2FkZHIgPSB0ZW1wbGF0ZS0+aXBfYWRkcjsKKwlpZiAodGVtcGxhdGUtPmlwX3NlcnZlciAhPSBJTkFERFJfTk9ORSkKKwkJZGV2LT5pcF9zZXJ2ZXIgPSB0ZW1wbGF0ZS0+aXBfc2VydmVyOworCWlmICh0ZW1wbGF0ZS0+aXBfZ2F0ZXdheSAhPSBJTkFERFJfTk9ORSkKKwkJZGV2LT5pcF9nYXRld2F5ID0gdGVtcGxhdGUtPmlwX2dhdGV3YXk7CisJaWYgKHRlbXBsYXRlLT5pcF9uZXRtYXNrICE9IElOQUREUl9OT05FKQorCQlkZXYtPmlwX25ldG1hc2sgPSB0ZW1wbGF0ZS0+aXBfbmV0bWFzazsKKwlpZiAodGVtcGxhdGUtPmlwX25hbWVzZXJ2ZXJbMF0gIT0gSU5BRERSX05PTkUpCisJCWRldi0+aXBfbmFtZXNlcnZlclswXSA9IHRlbXBsYXRlLT5pcF9uYW1lc2VydmVyWzBdOworCWlmICh0ZW1wbGF0ZS0+aXBfbmFtZXNlcnZlclsxXSAhPSBJTkFERFJfTk9ORSkKKwkJZGV2LT5pcF9uYW1lc2VydmVyWzFdID0gdGVtcGxhdGUtPmlwX25hbWVzZXJ2ZXJbMV07CisJaWYgKHRlbXBsYXRlLT5ob3N0bmFtZVswXSAhPSAnXDAnKQorCQlzdHJjcHkoZGV2LT5ob3N0bmFtZSwgdGVtcGxhdGUtPmhvc3RuYW1lKTsKKwlkZXYtPmNhcHMgJj0gdGVtcGxhdGUtPmNhcHM7CisKKwlicmluZ3VwX2RldmljZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IG5ldGRldiAqYWRkX2RldmljZShjb25zdCBjaGFyICppbmZvKQoreworCXN0cnVjdCBuZXRkZXYgKmRldjsKKwlpbnQgaTsKKworCWRldiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG5ldGRldikpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBwcm9nbmFtZSk7CisJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwl9CisKKwltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IG5ldGRldikpOworCWRldi0+Y2FwcyA9IGRlZmF1bHRfY2FwczsKKworCWlmIChwYXJzZV9kZXZpY2UoZGV2LCBpbmZvKSA9PSAwKQorCQlnb3RvIGJhaWw7CisKKwlpZiAobmV0ZGV2X2luaXRfaWYoZGV2KSA9PSAtMSkKKwkJZ290byBiYWlsOworCisJaWYgKGJvb3RwX2luaXRfaWYoZGV2KSA9PSAtMSkKKwkJZ290byBiYWlsOworCisJcHJpbnRmKCJJUC1Db25maWc6ICVzIGhhcmR3YXJlIGFkZHJlc3MiLCBkZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmh3bGVuOyBpKyspCisJCXByaW50ZigiJWMlMDJ4IiwgaSA9PSAwID8gJyAnIDogJzonLCBkZXYtPmh3YWRkcltpXSk7CisJcHJpbnRmKCIgbXR1ICVkJXMlc1xuIiwgZGV2LT5tdHUsCisJICAgICAgIGRldi0+Y2FwcyAmIENBUF9ESENQID8gIiBESENQIiA6CisJICAgICAgIGRldi0+Y2FwcyAmIENBUF9CT09UUCA/ICIgQk9PVFAiIDogIiIsCisJICAgICAgIGRldi0+Y2FwcyAmIENBUF9SQVJQID8gIiBSQVJQIiA6ICIiKTsKKwlyZXR1cm4gZGV2OworICAgICAgYmFpbDoKKwlmcmVlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2FsbF9kZXZpY2VzKHN0cnVjdCBuZXRkZXYgKnRlbXBsYXRlKQoreworCURJUiAqZDsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwlzdHJ1Y3QgbmV0ZGV2ICpkZXY7CisJY2hhciB0W1BBVEhfTUFYXSwgcFsyNTVdOworCWludCBpLCBmZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZCA9IG9wZW5kaXIoc3lzZnNfY2xhc3NfbmV0KTsKKwlpZiAoIWQpCisJCXJldHVybiAwOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKwkJLyogVGhpcyBleGNsdWRlcyBkZXZpY2VzIGJlZ2lubmluZyB3aXRoIGRvdHMgb3IgImR1bW15IiwgYXMgd2VsbCBhcyAuIG9yIC4uICovCisJCWlmIChkZS0+ZF9uYW1lWzBdID09ICcuJyB8fCAhc3RyY21wKGRlLT5kX25hbWUsICIuLiIpKQorCQkJY29udGludWU7CisJCWkgPSBzbnByaW50Zih0LCBQQVRIX01BWCAtIDEsICIlcy8lcy9mbGFncyIsIHN5c2ZzX2NsYXNzX25ldCwKKwkJCSAgICAgZGUtPmRfbmFtZSk7CisJCWlmIChpIDwgMCB8fCBpID49IFBBVEhfTUFYIC0gMSkKKwkJCWNvbnRpbnVlOworCQl0W2ldID0gJ1wwJzsKKwkJZmQgPSBvcGVuKHQsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJcGVycm9yKHQpOworCQkJY29udGludWU7CisJCX0KKwkJaSA9IHJlYWQoZmQsICZwLCBzaXplb2YocCkgLSAxKTsKKwkJY2xvc2UoZmQpOworCQlpZiAoaSA8IDApIHsKKwkJCXBlcnJvcih0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBbaV0gPSAnXDAnOworCQlmbGFncyA9IHN0cnRvdWwocCwgTlVMTCwgMCk7CisJCS8qIEhldXJpc3RpYyBmb3IgaWYgdGhpcyBpcyBhIHJlYXNvbmFibGUgYm9vdCBpbnRlcmZhY2UuCisJCSAgIFRoaXMgaXMgdGhlIHNhbWUKKwkJICAgbG9naWMgdGhlIGluLWtlcm5lbCBpcGNvbmZpZyB1c2VzLi4uICovCisJCWlmICghKGZsYWdzICYgSUZGX0xPT1BCQUNLKSAmJgorCQkgICAgKGZsYWdzICYgKElGRl9CUk9BRENBU1QgfCBJRkZfUE9JTlRPUE9JTlQpKSkgeworCQkJREVCVUcoKCJUcnlpbmcgdG8gYnJpbmcgdXAgJXNcbiIsIGRlLT5kX25hbWUpKTsKKworCQkJaWYgKCEoZGV2ID0gYWRkX2RldmljZShkZS0+ZF9uYW1lKSkpCisJCQkJY29udGludWU7CisJCQlicmluZ3VwX29uZV9kZXYodGVtcGxhdGUsIGRldik7CisJCX0KKwl9CisJY2xvc2VkaXIoZCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYXV0b2NvbmZpZyh2b2lkKQoreworCWludCBuZGV2ID0gMCwgbmF1dG8gPSAwOworCXN0cnVjdCBzdGF0ZSAqczsKKworCWZvciAocyA9IHNsaXN0OyBzOyBzID0gcy0+bmV4dCkgeworCQluZGV2Kys7CisJCWlmIChzLT5kZXYtPmNhcHMpCisJCQluYXV0bysrOworCX0KKworCWlmIChuZGV2ID09IDApIHsKKwkJaWYgKGNvbmZpZ3VyZWQgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogbm8gZGV2aWNlcyB0byBjb25maWd1cmVcbiIsCisJCQkJcHJvZ25hbWUpOworCQkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCQl9CisJfQorCisJcmV0dXJuIG5hdXRvOworfQorCitzdGF0aWMgdm9pZCBzZXRfdmVuZG9yX2lkZW50aWZpZXIoY29uc3QgY2hhciAqaWQpCit7CisJaW50IGxlbiA9IHN0cmxlbihpZCk7CisJaWYgKGxlbiA+PSAyNTUpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiJXM6IGludmFsaWQgdmVuZG9yIGNsYXNzIGlkZW50aWZpZXI6ICIKKwkJCSIlc1xuIiwgcHJvZ25hbWUsIGlkKTsKKwkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCX0KKwltZW1jcHkodmVuZG9yX2NsYXNzX2lkZW50aWZpZXIrMiwgaWQsIGxlbik7CisJdmVuZG9yX2NsYXNzX2lkZW50aWZpZXJbMF0gPSA2MDsKKwl2ZW5kb3JfY2xhc3NfaWRlbnRpZmllclsxXSA9IGxlbjsKKwl2ZW5kb3JfY2xhc3NfaWRlbnRpZmllcl9sZW4gPSBsZW4rMjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaywgYWxpYXMoImlwY29uZmlnX21haW4iKSkpOworCitpbnQgaXBjb25maWdfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBuZXRkZXYgKmRldjsKKwlpbnQgYywgcG9ydDsKKwlpbnQgZXJyOworCisJLyogSWYgcHJvZ25hbWUgaXMgc2V0IHdlJ3JlIGludm9rZWQgZnJvbSBhbm90aGVyIHByb2dyYW0gKi8KKwlpZiAoIXByb2duYW1lKSB7CisJCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwkJcHJvZ25hbWUgPSBhcmd2WzBdOworCQlnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisJCXNyYW5kNDgobm93LnR2X3VzZWMgXiAobm93LnR2X3NlYyA8PCAyNCkpOworCX0KKworCWlmICgoZXJyID0gc2V0am1wKGFib3J0X2J1ZikpKQorCQlyZXR1cm4gZXJyOworCisJLyogRGVmYXVsdCB2ZW5kb3IgaWRlbnRpZmllciAqLworCXNldF92ZW5kb3JfaWRlbnRpZmllcigiTGludXggaXBjb25maWciKTsKKworCWRvIHsKKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYzpkOmk6b25wOnQ6Iik7CisJCWlmIChjID09IEVPRikKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdjJzoKKwkJCWRlZmF1bHRfY2FwcyA9IHBhcnNlX3Byb3RvKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwb3J0ID0gYXRvaShvcHRhcmcpOworCQkJaWYgKHBvcnQgPD0gMCB8fCBwb3J0ID4gVVNIUlRfTUFYKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSIlczogaW52YWxpZCBwb3J0IG51bWJlciAlZFxuIiwKKwkJCQkJcHJvZ25hbWUsIHBvcnQpOworCQkJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwkJCX0KKwkJCWNmZ19sb2NhbF9wb3J0ID0gcG9ydDsKKwkJCWNmZ19yZW1vdGVfcG9ydCA9IGNmZ19sb2NhbF9wb3J0IC0gMTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWxvb3BfdGltZW91dCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChsb29wX3RpbWVvdXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSIlczogaW52YWxpZCB0aW1lb3V0ICVkXG4iLAorCQkJCQlwcm9nbmFtZSwgbG9vcF90aW1lb3V0KTsKKwkJCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlzZXRfdmVuZG9yX2lkZW50aWZpZXIob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCWJyaW5ndXBfZmlyc3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJZG9fbm90X2NvbmZpZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlkZXYgPSBhZGRfZGV2aWNlKG9wdGFyZyk7CisJCQlpZiAoZGV2KQorCQkJCWJyaW5ndXBfZGV2aWNlKGRldik7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG9wdGlvbiAtJWNcbiIsCisJCQkJcHJvZ25hbWUsIG9wdG9wdCk7CisJCQlsb25nam1wKGFib3J0X2J1ZiwgMSk7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWZvciAoYyA9IG9wdGluZDsgYyA8IGFyZ2M7IGMrKykgeworCQlkZXYgPSBhZGRfZGV2aWNlKGFyZ3ZbY10pOworCQlpZiAoZGV2KQorCQkJYnJpbmd1cF9kZXZpY2UoZGV2KTsKKwl9CisKKwlpZiAoY2hlY2tfYXV0b2NvbmZpZygpKSB7CisJCWlmIChjZmdfbG9jYWxfcG9ydCAhPSBMT0NBTF9QT1JUKSB7CisJCQlwcmludGYoIklQLUNvbmZpZzogYmluZGluZyBzb3VyY2UgcG9ydCB0byAlZCwgIgorCQkJICAgICAgICJkZXN0IHRvICVkXG4iLCBjZmdfbG9jYWxfcG9ydCwgY2ZnX3JlbW90ZV9wb3J0KTsKKwkJfQorCQlsb29wKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvaXBjb25maWcvbmV0ZGV2LmMgYi91c3Iva2luaXQvaXBjb25maWcvbmV0ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhOTIwYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9pcGNvbmZpZy9uZXRkZXYuYwpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIGlvY3RsLWJhc2VkIGRldmljZSBjb25maWd1cmF0aW9uCisgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKworI2luY2x1ZGUgIm5ldGRldi5oIgorCitzdGF0aWMgaW50IGNmZCA9IC0xOworCitzdGF0aWMgdm9pZCBjb3B5X25hbWUoc3RydWN0IG5ldGRldiAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlzdHJuY3B5KGlmci0+aWZyX25hbWUsIGRldi0+bmFtZSwgc2l6ZW9mKGlmci0+aWZyX25hbWUpKTsKKwlpZnItPmlmcl9uYW1lW3NpemVvZihpZnItPmlmcl9uYW1lKSAtIDFdID0gJ1wwJzsKK30KKworaW50IG5ldGRldl9nZXRmbGFncyhzdHJ1Y3QgbmV0ZGV2ICpkZXYsIHNob3J0ICpmbGFncykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJY29weV9uYW1lKGRldiwgJmlmcik7CisKKwlpZiAoaW9jdGwoY2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCXBlcnJvcigiU0lPQ0dJRkZMQUdTIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqZmxhZ3MgPSBpZnIuaWZyX2ZsYWdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9zaWZfYWRkcihzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCwgdWludDMyX3QgYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZyLT5pZnJfYWRkcjsKKworCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOworCisJcmV0dXJuIGlvY3RsKGNmZCwgY21kLCBpZnIpOworfQorCitpbnQgbmV0ZGV2X3NldGFkZHJlc3Moc3RydWN0IG5ldGRldiAqZGV2KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwljb3B5X25hbWUoZGV2LCAmaWZyKTsKKworCWlmIChkZXYtPmlwX2FkZHIgIT0gSU5BRERSX0FOWSAmJgorCSAgICBuZXRkZXZfc2lmX2FkZHIoJmlmciwgU0lPQ1NJRkFERFIsIGRldi0+aXBfYWRkcikgPT0gLTEpIHsKKwkJcGVycm9yKCJTSU9DU0lGQUREUiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRldi0+aXBfYnJvYWRjYXN0ICE9IElOQUREUl9BTlkgJiYKKwkgICAgbmV0ZGV2X3NpZl9hZGRyKCZpZnIsIFNJT0NTSUZCUkRBRERSLCBkZXYtPmlwX2Jyb2FkY2FzdCkgPT0gLTEpIHsKKwkJcGVycm9yKCJTSU9DU0lGQlJEQUREUiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRldi0+aXBfbmV0bWFzayAhPSBJTkFERFJfQU5ZICYmCisJICAgIG5ldGRldl9zaWZfYWRkcigmaWZyLCBTSU9DU0lGTkVUTUFTSywgZGV2LT5pcF9uZXRtYXNrKSA9PSAtMSkgeworCQlwZXJyb3IoIlNJT0NTSUZORVRNQVNLIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5ldGRldl9zZXRkZWZhdWx0cm91dGUoc3RydWN0IG5ldGRldiAqZGV2KQoreworCXN0cnVjdCBydGVudHJ5IHI7CisKKwlpZiAoZGV2LT5pcF9nYXRld2F5ID09IElOQUREUl9BTlkpCisJCXJldHVybiAwOworCisJbWVtc2V0KCZyLCAwLCBzaXplb2YocikpOworCisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci5ydF9kc3QpLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZyLnJ0X2RzdCktPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci5ydF9nYXRld2F5KS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci5ydF9nYXRld2F5KS0+c2luX2FkZHIuc19hZGRyID0KKwkgICAgZGV2LT5pcF9nYXRld2F5OworCSgoc3RydWN0IHNvY2thZGRyX2luICopJnIucnRfZ2VubWFzayktPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCSgoc3RydWN0IHNvY2thZGRyX2luICopJnIucnRfZ2VubWFzayktPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJci5ydF9mbGFncyA9IFJURl9VUCB8IFJURl9HQVRFV0FZOworCisJaWYgKGlvY3RsKGNmZCwgU0lPQ0FERFJULCAmcikgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCXBlcnJvcigiU0lPQ0FERFJUIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXRkZXZfc2V0bXR1KHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJY29weV9uYW1lKGRldiwgJmlmcik7CisJaWZyLmlmcl9tdHUgPSBkZXYtPm10dTsKKworCXJldHVybiBpb2N0bChjZmQsIFNJT0NTSUZNVFUsICZpZnIpOworfQorCitzdGF0aWMgaW50IG5ldGRldl9naWZfYWRkcihzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCwgdWludDMyX3QgKiBwdHIpCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmci0+aWZyX2FkZHI7CisKKwlpZiAoaW9jdGwoY2ZkLCBjbWQsIGlmcikgPT0gLTEpCisJCXJldHVybiAtMTsKKworCSpwdHIgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKworCXJldHVybiAwOworfQorCitpbnQgbmV0ZGV2X3VwKHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJY29weV9uYW1lKGRldiwgJmlmcik7CisKKwlpZiAoaW9jdGwoY2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCXBlcnJvcigiU0lPQ0dJRkZMQUdTIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUDsKKworCWlmIChpb2N0bChjZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJcGVycm9yKCJTSU9DU0lGRkxBR1MiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG5ldGRldl9kb3duKHN0cnVjdCBuZXRkZXYgKmRldikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJY29weV9uYW1lKGRldiwgJmlmcik7CisKKwlpZiAoaW9jdGwoY2ZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCXBlcnJvcigiU0lPQ0dJRkZMQUdTIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZnIuaWZyX2ZsYWdzICY9IH5JRkZfVVA7CisKKwlpZiAoaW9jdGwoY2ZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCXBlcnJvcigiU0lPQ1NJRkZMQUdTIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZXRkZXZfaW5pdF9pZihzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWlmIChjZmQgPT0gLTEpCisJCWNmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoY2ZkID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaXBjb25maWc6ICVzOiBzb2NrZXQoQUZfSU5FVCk6ICVzXG4iLAorCQkJZGV2LT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29weV9uYW1lKGRldiwgJmlmcik7CisKKwlpZiAoaW9jdGwoY2ZkLCBTSU9DR0lGSU5ERVgsICZpZnIpID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaXBjb25maWc6ICVzOiBTSU9DR0lGSU5ERVg6ICVzXG4iLAorCQkJZGV2LT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2LT5pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworCisJaWYgKGlvY3RsKGNmZCwgU0lPQ0dJRk1UVSwgJmlmcikgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpcGNvbmZpZzogJXM6IFNJT0NHSUZNVFU6ICVzXG4iLAorCQkJZGV2LT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2LT5tdHUgPSBpZnIuaWZyX210dTsKKworCWlmIChpb2N0bChjZmQsIFNJT0NHSUZIV0FERFIsICZpZnIpID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaXBjb25maWc6ICVzOiBTSU9DR0lGSFdBRERSOiAlc1xuIiwKKwkJCWRldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRldi0+aHd0eXBlID0gaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5OworCWRldi0+aHdsZW4gID0gMDsKKworCXN3aXRjaCAoZGV2LT5od3R5cGUpIHsKKwljYXNlIEFSUEhSRF9FVEhFUjoKKwkJZGV2LT5od2xlbiA9IDY7CisJCWJyZWFrOworCWNhc2UgQVJQSFJEX0VVSTY0OgorCQlkZXYtPmh3bGVuID0gODsKKwkJYnJlYWs7CisJY2FzZSBBUlBIUkRfTE9PUEJBQ0s6CisJCWRldi0+aHdsZW4gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KGRldi0+aHdhZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBkZXYtPmh3bGVuKTsKKwltZW1zZXQoZGV2LT5od2JyZCwgMHhmZiwgZGV2LT5od2xlbik7CisKKwkvKgorCSAqIFRyeSB0byBnZXQgdGhlIGN1cnJlbnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uLgorCSAqLworCWlmIChkZXYtPmlwX2FkZHIgPT0gSU5BRERSX05PTkUgJiYKKwkgICAgbmV0ZGV2X2dpZl9hZGRyKCZpZnIsIFNJT0NHSUZBRERSLCAmZGV2LT5pcF9hZGRyKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImlwY29uZmlnOiAlczogU0lPQ0dJRkFERFI6ICVzXG4iLAorCQkJZGV2LT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlkZXYtPmlwX2FkZHIgPSAwOworCQlkZXYtPmlwX2Jyb2FkY2FzdCA9IDA7CisJCWRldi0+aXBfbmV0bWFzayA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChkZXYtPmlwX2Jyb2FkY2FzdCA9PSBJTkFERFJfTk9ORSAmJgorCSAgICBuZXRkZXZfZ2lmX2FkZHIoJmlmciwgU0lPQ0dJRkJSREFERFIsICZkZXYtPmlwX2Jyb2FkY2FzdCkgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpcGNvbmZpZzogJXM6IFNJT0NHSUZCUkRBRERSOiAlc1xuIiwKKwkJCWRldi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZGV2LT5pcF9icm9hZGNhc3QgPSAwOworCX0KKworCWlmIChkZXYtPmlwX25ldG1hc2sgPT0gSU5BRERSX05PTkUgJiYKKwkgICAgbmV0ZGV2X2dpZl9hZGRyKCZpZnIsIFNJT0NHSUZORVRNQVNLLCAmZGV2LT5pcF9uZXRtYXNrKSA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImlwY29uZmlnOiAlczogU0lPQ0dJRk5FVE1BU0s6ICVzXG4iLAorCQkJZGV2LT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlkZXYtPmlwX25ldG1hc2sgPSAwOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2lwY29uZmlnL25ldGRldi5oIGIvdXNyL2tpbml0L2lwY29uZmlnL25ldGRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjY0MGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvaXBjb25maWcvbmV0ZGV2LmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBJUENPTkZJR19ORVRERVZfSAorI2RlZmluZSBJUENPTkZJR19ORVRERVZfSAorCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworI2RlZmluZSBCUExFTgkJNDAKKyNkZWZpbmUgRk5MRU4JCTEyOAkJCS8qIGZyb20gREhDUCAgUkZDIDIxMzEgKi8KKworc3RydWN0IG5ldGRldiB7CisJY29uc3QgY2hhciAqbmFtZTsJLyogRGV2aWNlIG5hbWUgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgaWZpbmRleDsJLyogaW50ZXJmYWNlIGluZGV4ICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgaHd0eXBlOwkvKiBBUlBIUkRfeHh4ICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBod2xlbjsJLyogSFcgYWRkcmVzcyBsZW5ndGggICAgKi8KKwl1aW50OF90IGh3YWRkclsxNl07CS8qIEhXIGFkZHJlc3MgICAgICAgICAgICovCisJdWludDhfdCBod2JyZFsxNl07CS8qIEJyb2FkY2FzdCBIVyBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IG10dTsJLyogRGV2aWNlIG10dSAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgY2FwczsJLyogQ2FwYWJpbGl0aWVzICAgICAgICAgKi8KKwl0aW1lX3Qgb3Blbl90aW1lOworCisJc3RydWN0IHsJCS8qIEJPT1RQL0RIQ1AgaW5mbyAgICAgICovCisJCWludCBmZDsKKwkJdWludDMyX3QgeGlkOworCQl1aW50MzJfdCBnYXRld2F5OyAvKiBCT09UUC9ESENQIGdhdGV3YXkgICAqLworCX0gYm9vdHA7CisKKwlzdHJ1Y3QgewkJLyogUkFSUCBpbmZvcm1hdGlvbiAgICAgKi8KKwkJaW50IGZkOworCX0gcmFycDsKKworCXVpbnQzMl90IGlwX2FkZHI7CS8qIG15IGFkZHJlc3MgICAgICAgICAgICovCisJdWludDMyX3QgaXBfYnJvYWRjYXN0OwkvKiBicm9hZGNhc3QgYWRkcmVzcyAgICAqLworCXVpbnQzMl90IGlwX3NlcnZlcjsJLyogc2VydmVyIGFkZHJlc3MgICAgICAgKi8KKwl1aW50MzJfdCBpcF9uZXRtYXNrOwkvKiBteSBzdWJuZXQgbWFzayAgICAgICAqLworCXVpbnQzMl90IGlwX2dhdGV3YXk7CS8qIG15IGdhdGV3YXkgICAgICAgICAgICovCisJdWludDMyX3QgaXBfbmFtZXNlcnZlclsyXTsJLyogdHdvIG5hbWVzZXJ2ZXJzICAgICAgKi8KKwl1aW50MzJfdCBzZXJ2ZXJpZDsJCS8qIGRoY3Agc2VydmVyaWQgICAgICAgICovCisJY2hhciBob3N0bmFtZVtTWVNfTk1MTl07CS8qIGhvc3RuYW1lICAgICAgICAgICAgICovCisJY2hhciBkbnNkb21haW5uYW1lW1NZU19OTUxOXTsJLyogZG5zIGRvbWFpbiBuYW1lICAgICAgKi8KKwljaGFyIG5pc2RvbWFpbm5hbWVbU1lTX05NTE5dOwkvKiBuaXMgZG9tYWluIG5hbWUgICAgICAqLworCWNoYXIgYm9vdHBhdGhbQlBMRU5dOwkvKiBib290IHBhdGggICAgICAgICAgICAqLworCWNoYXIgZmlsZW5hbWVbRk5MRU5dOyAgIC8qIGZpbGVuYW1lICAgICAgICAgICAgICovCisJc3RydWN0IG5ldGRldiAqbmV4dDsJLyogbmV4dCBjb25maWd1cmVkIGkvZiAgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgbmV0ZGV2ICppZmFjZXM7CisKKy8qCisgKiBEZXZpY2UgY2FwYWJpbGl0aWVzCisgKi8KKyNkZWZpbmUgQ0FQX0JPT1RQCSgxPDwwKQorI2RlZmluZSBDQVBfREhDUAkoMTw8MSkKKyNkZWZpbmUgQ0FQX1JBUlAJKDE8PDIpCisKKy8qCisgKiBEZXZpY2Ugc3RhdGVzCisgKi8KKyNkZWZpbmUgREVWU1RfVVAJMAorI2RlZmluZSBERVZTVF9CT09UUAkxCisjZGVmaW5lIERFVlNUX0RIQ1BESVNDCTIKKyNkZWZpbmUgREVWU1RfREhDUFJFUQkzCisjZGVmaW5lIERFVlNUX0NPTVBMRVRFCTQKKyNkZWZpbmUgREVWU1RfRVJST1IJNQorCitpbnQgbmV0ZGV2X2dldGZsYWdzKHN0cnVjdCBuZXRkZXYgKmRldiwgc2hvcnQgKmZsYWdzKTsKK2ludCBuZXRkZXZfc2V0YWRkcmVzcyhzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworaW50IG5ldGRldl9zZXRkZWZhdWx0cm91dGUoc3RydWN0IG5ldGRldiAqZGV2KTsKK2ludCBuZXRkZXZfdXAoc3RydWN0IG5ldGRldiAqZGV2KTsKK2ludCBuZXRkZXZfZG93bihzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworaW50IG5ldGRldl9pbml0X2lmKHN0cnVjdCBuZXRkZXYgKmRldik7CitpbnQgbmV0ZGV2X3NldG10dShzdHJ1Y3QgbmV0ZGV2ICpkZXYpOworCitzdGF0aWMgaW5saW5lIGludCBuZXRkZXZfcnVubmluZyhzdHJ1Y3QgbmV0ZGV2ICpkZXYpCit7CisJc2hvcnQgZmxhZ3M7CisJaW50IHJldCA9IG5ldGRldl9nZXRmbGFncyhkZXYsICZmbGFncyk7CisKKwlyZXR1cm4gcmV0ID8gMCA6ICEhKGZsYWdzICYgSUZGX1JVTk5JTkcpOworfQorCisjZW5kaWYgLyogSVBDT05GSUdfTkVUREVWX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9wYWNrZXQuYyBiL3Vzci9raW5pdC9pcGNvbmZpZy9wYWNrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzU0MzFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2lwY29uZmlnL3BhY2tldC5jCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogUGFja2V0IHNvY2tldCBoYW5kbGluZyBnbHVlLgorICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bmV0L2lmX3BhY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KKworI2luY2x1ZGUgImlwY29uZmlnLmgiCisjaW5jbHVkZSAibmV0ZGV2LmgiCisjaW5jbHVkZSAicGFja2V0LmgiCisKK3N0YXRpYyBpbnQgcGt0X2ZkID0gLTE7CisKK3VpbnQxNl90IGNmZ19sb2NhbF9wb3J0ID0gTE9DQUxfUE9SVDsKK3VpbnQxNl90IGNmZ19yZW1vdGVfcG9ydCA9IFJFTU9URV9QT1JUOworCitpbnQgcGFja2V0X29wZW4odm9pZCkKK3sKKwlpbnQgZmQsIG9uZSA9IDE7CisKKwlpZiAocGt0X2ZkICE9IC0xKQorCQlyZXR1cm4gcGt0X2ZkOworCisJLyoKKwkgKiBHZXQgYSBQQUNLRVQgc29ja2V0IGZvciBJUCB0cmFmZmljLgorCSAqLworCWZkID0gc29ja2V0KEFGX1BBQ0tFVCwgU09DS19ER1JBTSwgaHRvbnMoRVRIX1BfSVApKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJcGVycm9yKCJzb2NrZXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogV2Ugd2FudCB0byBicm9hZGNhc3QKKwkgKi8KKwlpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmb25lLCBzaXplb2Yob25lKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJTT19CUk9BRENBU1QiKTsKKwkJY2xvc2UoZmQpOworCQlmZCA9IC0xOworCX0KKworCXBrdF9mZCA9IGZkOworCisJcmV0dXJuIGZkOworfQorCit2b2lkIHBhY2tldF9jbG9zZSh2b2lkKQoreworCWNsb3NlKHBrdF9mZCk7CisJcGt0X2ZkID0gLTE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY2hlY2tzdW0odWludDE2X3QgKmhkciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgY2hrc3VtID0gMDsKKworCXdoaWxlIChsZW4pIHsKKwkJY2hrc3VtICs9ICpoZHIrKzsKKwkJY2hrc3VtICs9ICpoZHIrKzsKKwkJbGVuLS07CisJfQorCWNoa3N1bSA9IChjaGtzdW0gJiAweGZmZmYpICsgKGNoa3N1bSA+PiAxNik7CisJY2hrc3VtID0gKGNoa3N1bSAmIDB4ZmZmZikgKyAoY2hrc3VtID4+IDE2KTsKKwlyZXR1cm4gKH5jaGtzdW0pICYgMHhmZmZmOworfQorCitzdHJ1Y3QgaGVhZGVyIHsKKwlzdHJ1Y3QgaXBoZHIgaXA7CisJc3RydWN0IHVkcGhkciB1ZHA7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIHN0cnVjdCBoZWFkZXIgaXB1ZHBfaGRycyA9IHsKKwkuaXAgPSB7CisJICAgICAgIC5paGwJCT0gNSwKKwkgICAgICAgLnZlcnNpb24JCT0gSVBWRVJTSU9OLAorCSAgICAgICAuZnJhZ19vZmYJPSBfX2NvbnN0YW50X2h0b25zKElQX0RGKSwKKwkgICAgICAgLnR0bAkJPSA2NCwKKwkgICAgICAgLnByb3RvY29sCT0gSVBQUk9UT19VRFAsCisJICAgICAgIC5zYWRkcgkJPSBJTkFERFJfQU5ZLAorCSAgICAgICAuZGFkZHIJCT0gSU5BRERSX0JST0FEQ0FTVCwKKwkgICAgICAgfSwKKwkudWRwID0geworCQkuc291cmNlCQk9IF9fY29uc3RhbnRfaHRvbnMoTE9DQUxfUE9SVCksCisJCS5kZXN0CQk9IF9fY29uc3RhbnRfaHRvbnMoUkVNT1RFX1BPUlQpLAorCQkubGVuCQk9IDAsCisJCS5jaGVjawkJPSAwLAorCQl9LAorfTsKKworI2lmZGVmIElQQ19ERUJVRwkJLyogT25seSB1c2VkIGJ5IERFQlVHKCgpKSAqLworc3RhdGljIGNoYXIgKm50b2EodWludDMyX3QgYWRkcikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpbiA9IHsgYWRkciB9OworCXJldHVybiBpbmV0X250b2EoaW4pOworfQorI2VuZGlmCisKKy8qCisgKiBTZW5kIGEgcGFja2V0LiAgVGhlIG9wdGlvbnMgYXJlIGxpc3RlZCBpbiBpb3ZbMS4uLmlvdl9sZW5dLgorICogaW92WzBdIGlzIHJlc2VydmVkIGZvciB0aGUgYm9vdHAgcGFja2V0IGhlYWRlci4KKyAqLworaW50IHBhY2tldF9zZW5kKHN0cnVjdCBuZXRkZXYgKmRldiwgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZfbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9sbCBzbGw7CisJc3RydWN0IG1zZ2hkciBtc2cgPSB7CisJCS5tc2dfbmFtZQk9ICZzbGwsCisJCS5tc2dfbmFtZWxlbgk9IHNpemVvZihzbGwpLAorCQkubXNnX2lvdgk9IGlvdiwKKwkJLm1zZ19pb3ZsZW4JPSBpb3ZfbGVuLAorCQkubXNnX2NvbnRyb2wJPSBOVUxMLAorCQkubXNnX2NvbnRyb2xsZW4JPSAwLAorCQkubXNnX2ZsYWdzCT0gMAorCX07CisJaW50IGksIGxlbiA9IDA7CisKKwlpZiAoY2ZnX2xvY2FsX3BvcnQgIT0gTE9DQUxfUE9SVCkgeworCQlpcHVkcF9oZHJzLnVkcC5zb3VyY2UgPSBodG9ucyhjZmdfbG9jYWxfcG9ydCk7CisJCWlwdWRwX2hkcnMudWRwLmRlc3QgPSBodG9ucyhjZmdfcmVtb3RlX3BvcnQpOworCX0KKworCURFQlVHKCgiXG4gICB1ZHAgc3JjICVkIGRzdCAlZCIsIG50b2hzKGlwdWRwX2hkcnMudWRwLnNvdXJjZSksCisJICAgICAgIG50b2hzKGlwdWRwX2hkcnMudWRwLmRlc3QpKSk7CisKKwlERUJVRygoIlxuICAgaXAgc3JjICVzICIsIG50b2EoaXB1ZHBfaGRycy5pcC5zYWRkcikpKTsKKwlERUJVRygoImRzdCAlcyAiLCBudG9hKGlwdWRwX2hkcnMuaXAuZGFkZHIpKSk7CisKKwkvKgorCSAqIEdsdWUgaW4gdGhlIGlwK3VkcCBoZWFkZXIgaW92ZWMKKwkgKi8KKwlpb3ZbMF0uaW92X2Jhc2UgPSAmaXB1ZHBfaGRyczsKKwlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihzdHJ1Y3QgaGVhZGVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBpb3ZfbGVuOyBpKyspCisJCWxlbiArPSBpb3ZbaV0uaW92X2xlbjsKKworCXNsbC5zbGxfZmFtaWx5CSA9IEFGX1BBQ0tFVDsKKwlzbGwuc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCXNsbC5zbGxfaWZpbmRleAkgPSBkZXYtPmlmaW5kZXg7CisJc2xsLnNsbF9oYXR5cGUJID0gZGV2LT5od3R5cGU7CisJc2xsLnNsbF9wa3R0eXBlCSA9IFBBQ0tFVF9CUk9BRENBU1Q7CisJc2xsLnNsbF9oYWxlbgkgPSBkZXYtPmh3bGVuOworCW1lbWNweShzbGwuc2xsX2FkZHIsIGRldi0+aHdicmQsIGRldi0+aHdsZW4pOworCisJaXB1ZHBfaGRycy5pcC50b3RfbGVuID0gaHRvbnMobGVuKTsKKwlpcHVkcF9oZHJzLmlwLmNoZWNrICAgPSAwOworCWlwdWRwX2hkcnMuaXAuY2hlY2sgICA9IGlwX2NoZWNrc3VtKCh1aW50MTZfdCAqKSAmIGlwdWRwX2hkcnMuaXAsCisJCQkJCSAgICBpcHVkcF9oZHJzLmlwLmlobCk7CisKKwlpcHVkcF9oZHJzLnVkcC5sZW4gICAgPSBodG9ucyhsZW4gLSBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisKKwlERUJVRygoIlxuICAgYnl0ZXMgJWRcbiIsIGxlbikpOworCisJcmV0dXJuIHNlbmRtc2cocGt0X2ZkLCAmbXNnLCAwKTsKK30KKworaW50IHBhY2tldF9wZWVrKGludCAqaWZpbmRleCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgc2xsOworCXN0cnVjdCBpcGhkciBpcGg7CisJaW50IHJldCwgc2xsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKTsKKworCS8qCisJICogUGVlayBhdCB0aGUgSVAgaGVhZGVyLgorCSAqLworCXJldCA9IHJlY3Zmcm9tKHBrdF9mZCwgJmlwaCwgc2l6ZW9mKHN0cnVjdCBpcGhkciksCisJCSAgICAgICBNU0dfUEVFSywgKHN0cnVjdCBzb2NrYWRkciAqKSZzbGwsICZzbGxlbik7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNsbC5zbGxfZmFtaWx5ICE9IEFGX1BBQ0tFVCkKKwkJZ290byBkaXNjYXJkX3BrdDsKKworCWlmIChpcGguaWhsIDwgNSB8fCBpcGgudmVyc2lvbiAhPSBJUFZFUlNJT04pCisJCWdvdG8gZGlzY2FyZF9wa3Q7CisKKwkqaWZpbmRleCA9IHNsbC5zbGxfaWZpbmRleDsKKworCXJldHVybiAwOworCitkaXNjYXJkX3BrdDoKKwlwYWNrZXRfZGlzY2FyZCgpOworCXJldHVybiAwOworfQorCit2b2lkIHBhY2tldF9kaXNjYXJkKHZvaWQpCit7CisJc3RydWN0IGlwaGRyIGlwaDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgc2xsOworCXNvY2tsZW5fdCBzbGxlbiA9IHNpemVvZihzbGwpOworCisJcmVjdmZyb20ocGt0X2ZkLCAmaXBoLCBzaXplb2YoaXBoKSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzbGwsICZzbGxlbik7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgYm9vdHAgcGFja2V0LiAgVGhlIG9wdGlvbnMgYXJlIGxpc3RlZCBpbiBpb3ZbMS4uLmlvdl9sZW5dLgorICogaW92WzBdIG11c3QgcG9pbnQgdG8gdGhlIGJvb3RwIHBhY2tldCBoZWFkZXIuCisgKi8KK2ludCBwYWNrZXRfcmVjdihzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdl9sZW4pCit7CisJc3RydWN0IGlwaGRyICppcCwgaXBoOworCXN0cnVjdCB1ZHBoZHIgKnVkcDsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJLm1zZ19uYW1lCT0gTlVMTCwKKwkJLm1zZ19uYW1lbGVuCT0gMCwKKwkJLm1zZ19pb3YJPSBpb3YsCisJCS5tc2dfaW92bGVuCT0gaW92X2xlbiwKKwkJLm1zZ19jb250cm9sCT0gTlVMTCwKKwkJLm1zZ19jb250cm9sbGVuID0gMCwKKwkJLm1zZ19mbGFncwk9IDAKKwl9OworCWludCByZXQsIGlwaGw7CisKKwlyZXQgPSByZWN2ZnJvbShwa3RfZmQsICZpcGgsIHNpemVvZihzdHJ1Y3QgaXBoZHIpLAorCQkgICAgICAgTVNHX1BFRUssIE5VTEwsIE5VTEwpOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmIChpcGguaWhsIDwgNSB8fCBpcGgudmVyc2lvbiAhPSBJUFZFUlNJT04pCisJCWdvdG8gZGlzY2FyZF9wa3Q7CisKKwlpcGhsID0gaXBoLmlobCAqIDQ7CisKKwlpcCA9IG1hbGxvYyhpcGhsICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKwlpZiAoIWlwKQorCQlnb3RvIGRpc2NhcmRfcGt0OworCisJdWRwID0gKHN0cnVjdCB1ZHBoZHIgKikoKGNoYXIgKilpcCArIGlwaGwpOworCisJaW92WzBdLmlvdl9iYXNlID0gaXA7CisJaW92WzBdLmlvdl9sZW4gPSBpcGhsICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCisJcmV0ID0gcmVjdm1zZyhwa3RfZmQsICZtc2csIDApOworCWlmIChyZXQgPT0gLTEpCisJCWdvdG8gZnJlZV9wa3Q7CisKKwlERUJVRygoIjwtIGJ5dGVzICVkICIsIHJldCkpOworCisJaWYgKGlwX2NoZWNrc3VtKCh1aW50MTZfdCAqKSBpcCwgaXAtPmlobCkgIT0gMCkKKwkJZ290byBmcmVlX3BrdDsKKworCURFQlVHKCgiXG4gICBpcCBzcmMgJXMgIiwgbnRvYShpcC0+c2FkZHIpKSk7CisJREVCVUcoKCJkc3QgJXMgIiwgbnRvYShpcC0+ZGFkZHIpKSk7CisKKwlpZiAobnRvaHMoaXAtPnRvdF9sZW4pID4gcmV0IHx8IGlwLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCkKKwkJZ290byBmcmVlX3BrdDsKKworCXJldCAtPSA0ICogaXAtPmlobDsKKworCURFQlVHKCgiXG4gICB1ZHAgc3JjICVkIGRzdCAlZCAiLCBudG9ocyh1ZHAtPnNvdXJjZSksCisJICAgICAgIG50b2hzKHVkcC0+ZGVzdCkpKTsKKworCWlmICh1ZHAtPnNvdXJjZSAhPSBodG9ucyhjZmdfcmVtb3RlX3BvcnQpIHx8CisJICAgIHVkcC0+ZGVzdCAhPSBodG9ucyhjZmdfbG9jYWxfcG9ydCkpCisJCWdvdG8gZnJlZV9wa3Q7CisKKwlpZiAobnRvaHModWRwLT5sZW4pID4gcmV0KQorCQlnb3RvIGZyZWVfcGt0OworCisJcmV0IC09IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworCWZyZWUoaXApOworCisJcmV0dXJuIHJldDsKKworZnJlZV9wa3Q6CisJZnJlZShpcCk7CisJcmV0dXJuIDA7CisKK2Rpc2NhcmRfcGt0OgorCURFQlVHKCgiZGlzY2FyZGVkXG4iKSk7CisJcGFja2V0X2Rpc2NhcmQoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9pcGNvbmZpZy9wYWNrZXQuaCBiL3Vzci9raW5pdC9pcGNvbmZpZy9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU0NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2lwY29uZmlnL3BhY2tldC5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgSVBDT05GSUdfUEFDS0VUX0gKKyNkZWZpbmUgSVBDT05GSUdfUEFDS0VUX0gKKworaW50IHBhY2tldF9vcGVuKHZvaWQpOwordm9pZCBwYWNrZXRfY2xvc2Uodm9pZCk7CitpbnQgcGFja2V0X3NlbmQoc3RydWN0IG5ldGRldiAqZGV2LCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdl9sZW4pOworaW50IHBhY2tldF9wZWVrKGludCAqaWZpbmRleCk7Cit2b2lkIHBhY2tldF9kaXNjYXJkKHZvaWQpOworaW50IHBhY2tldF9yZWN2KHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92X2xlbik7CisKKyNlbmRpZiAvKiBJUENPTkZJR19QQUNLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L2tpbml0LmMgYi91c3Iva2luaXQva2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzMzNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L2tpbml0LmMKQEAgLTAsMCArMSwzMzMgQEAKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorCisjaW5jbHVkZSAia2luaXQuaCIKKyNpbmNsdWRlICJpcGNvbmZpZy5oIgorI2luY2x1ZGUgInJ1bi1pbml0LmgiCisjaW5jbHVkZSAicmVzdW1lLmgiCisKK2NvbnN0IGNoYXIgKnByb2duYW1lID0gImtpbml0IjsKK2ludCBtbnRfcHJvY2ZzOworaW50IG1udF9zeXNmczsKKworI2lmZGVmIElOSV9ERUJVRwordm9pZCBkdW1wX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKworCXByaW50ZigiICBhcmdjID09ICVkXG4iLCBhcmdjKTsKKworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJcHJpbnRmKCIgIGFyZ3ZbJWRdOiBcIiVzXCJcbiIsIGksIGFyZ3ZbaV0pOworCX0KKworCWlmIChhcmd2W2FyZ2NdICE9IE5VTEwpIHsKKwkJcHJpbnRmKCIgIGFyZ3ZbJWRdOiBcIiVzXCIgKFNIT1VMRCBCRSBOVUxMKVxuIiwKKwkJICAgICAgIGFyZ2MsIGFyZ3ZbYXJnY10pOworCX0KK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgZG9faXBjb25maWcoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaSwgYSA9IDA7CisJY2hhciAqKmFyZ3MgPSBhbGxvY2EoKGFyZ2MgKyAzKSAqIHNpemVvZihjaGFyICopKTsKKworCWlmICghYXJncykKKwkJcmV0dXJuIC0xOworCisJYXJnc1thKytdID0gKGNoYXIgKikiSVAtQ29uZmlnIjsKKwlhcmdzW2ErK10gPSAoY2hhciAqKSItaSI7CisJYXJnc1thKytdID0gKGNoYXIgKikiTGludXgga2luaXQiOworCisJREVCVUcoKCJSdW5uaW5nIGlwY29uZmlnXG4iKSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChzdHJuY21wKGFyZ3ZbaV0sICJpcD0iLCAzKSA9PSAwIHx8CisJCSAgICBzdHJuY21wKGFyZ3ZbaV0sICJuZnNhZGRycz0iLCA5KSA9PSAwKSB7CisJCQlhcmdzW2ErK10gPSBhcmd2W2ldOworCQl9CisJfQorCisJaWYgKGEgPiAxKSB7CisJCWFyZ3NbYV0gPSBOVUxMOworCQlkdW1wX2FyZ3MoYSwgYXJncyk7CisJCXJldHVybiBpcGNvbmZpZ19tYWluKGEsIGFyZ3MpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwbGl0X2NtZGxpbmUoaW50IGNtZGNtYXgsIGNoYXIgKmNtZHZbXSwgY2hhciAqYXJndjAsCisJCQkgY2hhciAqY21kbGluZXNbXSwgY2hhciAqYXJnc1tdKQoreworCWludCB3YXNfc3BhY2U7CisJY2hhciBjLCAqcDsKKwlpbnQgdm1heCA9IGNtZGNtYXg7CisJaW50IHYgPSAxOworCWludCBzcGFjZTsKKworCWlmIChjbWR2KQorCQljbWR2WzBdID0gYXJndjA7CisKKwkvKiBGaXJzdCwgYWRkIHRoZSBwYXJzYWJsZSBjb21tYW5kIGxpbmVzICovCisKKwl3aGlsZSAoKmNtZGxpbmVzKSB7CisJCXAgPSAqY21kbGluZXMrKzsKKwkJd2FzX3NwYWNlID0gMTsKKwkJd2hpbGUgKHYgPCB2bWF4KSB7CisJCQljID0gKnA7CisJCQlzcGFjZSA9IGlzc3BhY2UoYyk7CisJCQlpZiAoKHNwYWNlIHx8ICFjKSAmJiAhd2FzX3NwYWNlKSB7CisJCQkJaWYgKGNtZHYpCisJCQkJCSpwID0gJ1wwJzsKKwkJCQl2Kys7CisJCQl9IGVsc2UgaWYgKHdhc19zcGFjZSkgeworCQkJCWlmIChjbWR2KQorCQkJCQljbWR2W3ZdID0gcDsKKwkJCX0KKworCQkJaWYgKCFjKQorCQkJCWJyZWFrOworCisJCQl3YXNfc3BhY2UgPSBzcGFjZTsKKwkJCXArKzsKKwkJfQorCX0KKworCS8qIFNlY29uZCwgYWRkIHRoZSBleHBsaWNpdCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisKKwl3aGlsZSAoKmFyZ3MgJiYgdiA8IHZtYXgpIHsKKwkJaWYgKGNtZHYpCisJCQljbWR2W3ZdID0gKmFyZ3M7CisJCXYrKzsKKwkJYXJncysrOworCX0KKworCWlmIChjbWR2KQorCQljbWR2W3ZdID0gTlVMTDsKKworCXJldHVybiB2OworfQorCitzdGF0aWMgaW50IG1vdW50X3N5c19mcyhjb25zdCBjaGFyICpjaGVjaywgY29uc3QgY2hhciAqZnNuYW1lLAorCQkJY29uc3QgY2hhciAqZnN0eXBlKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKHN0YXQoY2hlY2ssICZzdCkgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlta2Rpcihmc25hbWUsIDA1NTUpOworCisJaWYgKG1vdW50KCJub25lIiwgZnNuYW1lLCBmc3R5cGUsIDAsIE5VTEwpID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBtb3VudCAlcyBhcyAlc1xuIiwKKwkJCXByb2duYW1lLCBmc25hbWUsIGZzdHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKHN0YXQocGF0aCwgJnN0KSA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQlwZXJyb3IoInN0YXQiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKG1rZGlyKHBhdGgsIDA3NTUpID09IC0xKSB7CisJCQlwZXJyb3IoIm1rZGlyIik7CisJCQlleGl0KDEpOworCQl9CisJfSBlbHNlIGlmICghU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAnJXMnIG5vdCBhIGRpcmVjdG9yeVxuIiwgcHJvZ25hbWUsIHBhdGgpOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfaW5pdChjb25zdCBjaGFyICpyb290LCBjb25zdCBjaGFyICp1c2VyKQoreworCWNvbnN0IGNoYXIgKmluaXRfcGF0aHNbXSA9IHsKKwkJIi9zYmluL2luaXQiLCAiL2Jpbi9pbml0IiwgIi9ldGMvaW5pdCIsICIvYmluL3NoIiwgTlVMTAorCX07CisJY29uc3QgY2hhciAqKnA7CisJY29uc3QgY2hhciAqcGF0aDsKKworCWlmIChjaGRpcihyb290KSkgeworCQlwZXJyb3IoImNoZGlyIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKHVzZXIpCisJCURFQlVHKCgiQ2hlY2tpbmcgZm9yIGluaXQ6ICVzXG4iLCB1c2VyKSk7CisKKwlpZiAodXNlciAmJiB1c2VyWzBdID09ICcvJyAmJiAhYWNjZXNzKHVzZXIrMSwgWF9PSykpIHsKKwkJcGF0aCA9IHVzZXI7CisJfSBlbHNlIHsKKwkJZm9yIChwID0gaW5pdF9wYXRoczsgKnA7IHArKykgeworCQkJREVCVUcoKCJDaGVja2luZyBmb3IgaW5pdDogJXNcbiIsICpwKSk7CisJCQlpZiAoIWFjY2VzcygqcCsxLCBYX09LKSkKKwkJCQlicmVhazsKKwkJfQorCQlwYXRoID0gKnA7CisJfQorCWNoZGlyKCIvIik7CisJcmV0dXJuIHBhdGg7Cit9CisKKy8qIFRoaXMgaXMgdGhlIGFyZ2MgYW5kIGFyZ3Ygd2UgcGFzcyB0byBpbml0ICovCitjb25zdCBjaGFyICppbml0X3BhdGg7CitpbnQgaW5pdF9hcmdjOworY2hhciAqKmluaXRfYXJndjsKKworZXh0ZXJuIHNzaXplX3QgcmVhZGZpbGUoY29uc3QgY2hhciAqLCBjaGFyICoqKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICoqY21kdiwgKiphcmdzOworCWNoYXIgKmNtZGxpbmVzWzNdOworCWludCBpOworCWNvbnN0IGNoYXIgKmVycm1zZzsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY21kYzsKKwlpbnQgZmQ7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCXNyYW5kNDgobm93LnR2X3VzZWMgXiAobm93LnR2X3NlYyA8PCAyNCkpOworCisJLyogRGVmYXVsdCBwYXJhbWV0ZXJzIGZvciBhbnl0aGluZyBpbml0LWxpa2Ugd2UgZXhlY3V0ZSAqLworCWluaXRfYXJnYyA9IGFyZ2M7CisJaW5pdF9hcmd2ID0gYWxsb2NhKChhcmdjKzEpKnNpemVvZihjaGFyICopKTsKKwltZW1jcHkoaW5pdF9hcmd2LCBhcmd2LCAoYXJnYysxKSpzaXplb2YoY2hhciAqKSk7CisKKwlpZiAoKGZkID0gb3BlbigiL2Rldi9jb25zb2xlIiwgT19SRFdSKSkgIT0gLTEpIHsKKwkJZHVwMihmZCwgU1RESU5fRklMRU5PKTsKKwkJZHVwMihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCWR1cDIoZmQsIFNUREVSUl9GSUxFTk8pOworCisJCWlmIChmZCA+IFNUREVSUl9GSUxFTk8pIHsKKwkJCWNsb3NlKGZkKTsKKwkJfQorCX0KKworCW1udF9wcm9jZnMgPSBtb3VudF9zeXNfZnMoIi9wcm9jL2NtZGxpbmUiLCAiL3Byb2MiLCAicHJvYyIpID49IDA7CisJaWYgKCFtbnRfcHJvY2ZzKSB7CisJCXJldCA9IDE7CisJCWdvdG8gYmFpbDsKKwl9CisKKwltbnRfc3lzZnMgPSBtb3VudF9zeXNfZnMoIi9zeXMvYnVzIiwgIi9zeXMiLCAic3lzZnMiKSA+PSAwOworCWlmICghbW50X3N5c2ZzKSB7CisJCXJldCA9IDE7CisJCWdvdG8gYmFpbDsKKwl9CisKKwkvKiBDb25zdHJ1Y3QgdGhlIGVmZmVjdGl2ZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgVGhlCisJICAgZWZmZWN0aXZlIGtlcm5lbCBjb21tYW5kIGxpbmUgY29uc2lzdHMgb2YgL2FyY2guY21kLCBpZgorCSAgIGl0IGV4aXN0cywgL3Byb2MvY21kbGluZSwgcGx1cyBhbnkgYXJndW1lbnRzIGFmdGVyIGFuIC0tCisJICAgYXJndW1lbnQgb24gdGhlIHByb3BlciBjb21tYW5kIGxpbmUsIGluIHRoYXQgb3JkZXIuICovCisKKwlyZXQgPSByZWFkZmlsZSgiL2FyY2guY21kIiwgJmNtZGxpbmVzWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJY21kbGluZXNbMF0gPSAiIjsKKworCXJldCA9IHJlYWRmaWxlKCIvcHJvYy9jbWRsaW5lIiwgJmNtZGxpbmVzWzFdKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgcmVhZCAvcHJvYy9jbWRsaW5lXG4iLCBwcm9nbmFtZSk7CisJCXJldCA9IDE7CisJCWdvdG8gYmFpbDsKKwl9CisKKwljbWRsaW5lc1syXSA9IE5VTEw7CisKKwkvKiBGaW5kIGFuIC0tIGFyZ3VtZW50LCBhbmQgaWYgc28gYXBwZW5kIHRvIHRoZSBjb21tYW5kIGxpbmUgKi8KKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCX0KKwlhcmdzID0gJmFyZ3ZbaV07CS8qIFBvaW50cyBlaXRoZXIgdG8gZmlyc3QgYXJndW1lbnQgcGFzdCAtLSBvcgorCQkJCSAgIHRvIHRoZSBmaW5hbCBOVUxMICovCisKKwkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworCWNtZGMgPSBzcGxpdF9jbWRsaW5lKElOVF9NQVgsIE5VTEwsIGFyZ3ZbMF0sIGNtZGxpbmVzLCBhcmdzKTsKKworCS8qIEFjdHVhbGx5IGdlbmVyYXRlIHRoZSBjbWRsaW5lIGFycmF5ICovCisJY21kdiA9IChjaGFyICoqKWFsbG9jYSgoY21kYysxKSpzaXplb2YoY2hhciAqKSk7CisJaWYgKHNwbGl0X2NtZGxpbmUoY21kYywgY21kdiwgYXJndlswXSwgY21kbGluZXMsIGFyZ3MpICE9IGNtZGMpIHsKKwkJcmV0ID0gMTsKKwkJZ290byBiYWlsOworCX0KKworCS8qIERlYnVnZ2luZy4uLiAqLworCWR1bXBfYXJncyhjbWRjLCBjbWR2KTsKKworCS8qIFJlc3VtZSBmcm9tIHN1c3BlbmQtdG8tZGlzaywgaWYgYXBwcm9wcmlhdGUgKi8KKwkvKiBJZiBzdWNjZXNzZnVsLCBkb2VzIG5vdCByZXR1cm4gKi8KKwlkb19yZXN1bWUoY21kYywgY21kdik7CisKKwkvKiBJbml0aWFsaXplIG5ldHdvcmtpbmcsIGlmIGFwcGxpY2FibGUgKi8KKwlkb19pcGNvbmZpZyhjbWRjLCBjbWR2KTsKKworCWNoZWNrX3BhdGgoIi9yb290Iik7CisJZG9fbW91bnRzKGNtZGMsIGNtZHYpOworCisJaWYgKG1udF9wcm9jZnMpIHsKKwkJdW1vdW50MigiL3Byb2MiLCAwKTsKKwkJbW50X3Byb2NmcyA9IDA7CisJfQorCisJaWYgKG1udF9zeXNmcykgeworCQl1bW91bnQyKCIvc3lzIiwgMCk7CisJCW1udF9zeXNmcyA9IDA7CisJfQorCisJaW5pdF9wYXRoID0gZmluZF9pbml0KCIvcm9vdCIsIGdldF9hcmcoY21kYywgY21kdiwgImluaXQ9IikpOworCWlmICghaW5pdF9wYXRoKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGluaXQgbm90IGZvdW5kIVxuIiwgcHJvZ25hbWUpOworCQlyZXQgPSAyOworCQlnb3RvIGJhaWw7CisJfQorCisJaW5pdF9hcmd2WzBdID0gc3RycmNocihpbml0X3BhdGgsICcvJykgKyAxOworCisJZXJybXNnID0gcnVuX2luaXQoIi9yb290IiwgIi9kZXYvY29uc29sZSIsIGluaXRfcGF0aCwgaW5pdF9hcmd2KTsKKworCS8qIElmIHJ1bl9pbml0IHJldHVybmVkLCBzb21ldGhpbmcgd2VudCBiYWQgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsIHByb2duYW1lLCBlcnJtc2csIHN0cmVycm9yKGVycm5vKSk7CisJcmV0ID0gMjsKKwlnb3RvIGJhaWw7CisKK2JhaWw6CisJaWYgKG1udF9wcm9jZnMpCisJCXVtb3VudDIoIi9wcm9jIiwgMCk7CisKKwlpZiAobW50X3N5c2ZzKQorCQl1bW91bnQyKCIvc3lzIiwgMCk7CisKKwkvKgorCSAqIElmIHdlIGdldCBoZXJlLCBzb21ldGhpbmcgYmFkIHByb2JhYmx5IGhhcHBlbmVkLCBhbmQgdGhlIGtlcm5lbAorCSAqIHdpbGwgbW9zdCBsaWtlbHkgcGFuaWMuICBEcmFpbiBjb25zb2xlIG91dHB1dCBzbyB0aGUgdXNlciBjYW4KKwkgKiBmaWd1cmUgb3V0IHdoYXQgaGFwcGVuZWQuCisJICovCisJdGNkcmFpbigyKTsKKwl0Y2RyYWluKDEpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9raW5pdC5oIGIvdXNyL2tpbml0L2tpbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1ZjkyMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9raW5pdC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBraW5pdC9raW5pdC5oCisgKi8KKworI2lmbmRlZiBLSU5JVF9ICisjZGVmaW5lIEtJTklUX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK2ludCBkb19tb3VudHMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CitpbnQgbW91bnRfbmZzX3Jvb3QoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgaW50IGZsYWdzKTsKK2ludCByYW1kaXNrX2xvYWQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgZGV2X3Qgcm9vdF9kZXYpOwordm9pZCBtZF9ydW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7Citjb25zdCBjaGFyICpiZGV2bmFtZShkZXZfdCBkZXYpOworCitleHRlcm4gaW50IG1udF9wcm9jZnM7CitleHRlcm4gaW50IG1udF9zeXNmczsKKworZXh0ZXJuIGludCBpbml0X2FyZ2M7CitleHRlcm4gY2hhciAqKmluaXRfYXJndjsKK2V4dGVybiBjb25zdCBjaGFyICpwcm9nbmFtZTsKKworY2hhciAqZ2V0X2FyZyhpbnQgYXJnYywgY2hhciAqYXJndltdLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBnZXRfZmxhZyhpbnQgYXJnYywgY2hhciAqYXJndltdLCBjb25zdCBjaGFyICpuYW1lKTsKKworaW50IGdldGludGZpbGUoY29uc3QgY2hhciAqcGF0aCwgbG9uZyAqdmFsKTsKKworc3NpemVfdCByZWFkZmlsZShjb25zdCBjaGFyICpwYXRoLCBjaGFyICoqcHB0cik7Citzc2l6ZV90IGZyZWFkZmlsZShGSUxFICpmLCBjaGFyICoqcHB0cik7CisKKy8qCisgKiBtaW4oKS9tYXgoKSBtYWNyb3MgdGhhdCBhbHNvIGRvCisgKiBzdHJpY3QgdHlwZS1jaGVja2luZy4uIFNlZSB0aGUKKyAqICJ1bm5lY2Vzc2FyeSIgcG9pbnRlciBjb21wYXJpc29uLgorICogRnJvbSB0aGUgTGludXgga2VybmVsLgorICovCisjZGVmaW5lIG1pbih4LHkpICh7IFwKKyAgICAgICAgdHlwZW9mKHgpIF94ID0gKHgpOyAgICAgXAorICAgICAgICB0eXBlb2YoeSkgX3kgPSAoeSk7ICAgICBcCisgICAgICAgICh2b2lkKSAoJl94ID09ICZfeSk7ICAgICAgICAgICAgXAorICAgICAgICBfeCA8IF95ID8gX3ggOiBfeTsgfSkKKworI2RlZmluZSBtYXgoeCx5KSAoeyBcCisgICAgICAgIHR5cGVvZih4KSBfeCA9ICh4KTsgICAgIFwKKyAgICAgICAgdHlwZW9mKHkpIF95ID0gKHkpOyAgICAgXAorICAgICAgICAodm9pZCkgKCZfeCA9PSAmX3kpOyAgICAgICAgICAgIFwKKyAgICAgICAgX3ggPiBfeSA/IF94IDogX3k7IH0pCisKKyNkZWZpbmUgSU5JX0RFQlVHCisKKyN1bmRlZiBERUJVRworI2lmZGVmIElOSV9ERUJVRworI2RlZmluZSBERUJVRyh4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgREVCVUcoeCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBJTklfREVCVUcKK3ZvaWQgZHVtcF9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwkodm9pZClhcmdjOworCSh2b2lkKWFyZ3Y7Cit9CisjZW5kaWYKKworI2VuZGlmCQkJCS8qIEtJTklUX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uYW1lX3RvX2Rldi5jIGIvdXNyL2tpbml0L25hbWVfdG9fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzYmMxMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9uYW1lX3RvX2Rldi5jCkBAIC0wLDAgKzEsMjAyIEBACisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJkb19tb3VudHMuaCIKKyNpbmNsdWRlICJraW5pdC5oIgorCisjZGVmaW5lIEJVRl9TWgkJNjU1MzYKKworLyogRmluZCBkZXZfdCBmb3IgZS5nLiAiaGRhLE5VTEwiIG9yICJoZGIsMiIgKi8KK3N0YXRpYyBkZXZfdCB0cnlfbmFtZShjaGFyICpuYW1lLCBpbnQgcGFydCkKK3sKKwljaGFyIHBhdGhbQlVGX1NaXTsKKwljaGFyIGJ1ZltCVUZfU1pdOworCWludCByYW5nZTsKKwl1bnNpZ25lZCBpbnQgbWFqb3IsIG1pbm9yOworCWRldl90IHJlczsKKwljaGFyICpzOworCWludCBsZW47CisJaW50IGZkOworCisJLyogcmVhZCBkZXZpY2UgbnVtYmVyIGZyb20gL3N5cy9ibG9jay8uLi4vZGV2ICovCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiL3N5cy9ibG9jay8lcy9kZXYiLCBuYW1lKTsKKwlmZCA9IG9wZW4ocGF0aCwgMCwgMCk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBmYWlsOworCWxlbiA9IHJlYWQoZmQsIGJ1ZiwgQlVGX1NaKTsKKwljbG9zZShmZCk7CisKKwlpZiAobGVuIDw9IDAgfHwgbGVuID09IEJVRl9TWiB8fCBidWZbbGVuIC0gMV0gIT0gJ1xuJykKKwkJZ290byBmYWlsOworCWJ1ZltsZW4gLSAxXSA9ICdcMCc7CisJbWFqb3IgPSBzdHJ0b3VsKGJ1ZiwgJnMsIDEwKTsKKwlpZiAoKnMgIT0gJzonKQorCQlnb3RvIGZhaWw7CisJbWlub3IgPSBzdHJ0b3VsKHMgKyAxLCAmcywgMTApOworCWlmICgqcykKKwkJZ290byBmYWlsOworCXJlcyA9IG1ha2VkZXYobWFqb3IsIG1pbm9yKTsKKworCS8qIGlmIGl0J3MgdGhlcmUgYW5kIHdlIGFyZSBub3QgbG9va2luZyBmb3IgYSBwYXJ0aXRpb24gLSB0aGF0J3MgaXQgKi8KKwlpZiAoIXBhcnQpCisJCXJldHVybiByZXM7CisKKwkvKiBvdGhlcndpc2UgcmVhZCByYW5nZSBmcm9tIC4uLi9yYW5nZSAqLworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9zeXMvYmxvY2svJXMvcmFuZ2UiLCBuYW1lKTsKKwlmZCA9IG9wZW4ocGF0aCwgMCwgMCk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBmYWlsOworCWxlbiA9IHJlYWQoZmQsIGJ1ZiwgMzIpOworCWNsb3NlKGZkKTsKKwlpZiAobGVuIDw9IDAgfHwgbGVuID09IDMyIHx8IGJ1ZltsZW4gLSAxXSAhPSAnXG4nKQorCQlnb3RvIGZhaWw7CisJYnVmW2xlbiAtIDFdID0gJ1wwJzsKKwlyYW5nZSA9IHN0cnRvdWwoYnVmLCAmcywgMTApOworCWlmICgqcykKKwkJZ290byBmYWlsOworCisJLyogaWYgcGFydGl0aW9uIGlzIHdpdGhpbiByYW5nZSAtIHdlIGdvdCBpdCAqLworCWlmIChwYXJ0IDwgcmFuZ2UpIHsKKwkJREVCVUcoKCJraW5pdDogdHJ5X25hbWUgJXMsJWQgPSAlc1xuIiwgbmFtZSwgcGFydCwKKwkJICAgICAgIGJkZXZuYW1lKHJlcyArIHBhcnQpKSk7CisJCXJldHVybiByZXMgKyBwYXJ0OworCX0KKworICAgICAgZmFpbDoKKwlyZXR1cm4gKGRldl90KSAwOworfQorCisvKgorICoJQ29udmVydCBhIG5hbWUgaW50byBkZXZpY2UgbnVtYmVyLiAgV2UgYWNjZXB0IHRoZSBmb2xsb3dpbmcgdmFyaWFudHM6CisgKgorICoJMSkgZGV2aWNlIG51bWJlciBpbiBoZXhhZGVjaW1hbAlyZXByZXNlbnRzIGl0c2VsZgorICoJMikgZGV2aWNlIG51bWJlciBpbiBtYWpvcjptaW5vciBkZWNpbWFsIHJlcHJlc2VudHMgaXRzZWxmCisgKgkzKSAvZGV2L25mcyByZXByZXNlbnRzIFJvb3RfTkZTCisgKgk0KSAvZGV2LzxkaXNrX25hbWU+IHJlcHJlc2VudHMgdGhlIGRldmljZSBudW1iZXIgb2YgZGlzaworICoJNSkgL2Rldi88ZGlza19uYW1lPjxkZWNpbWFsPiByZXByZXNlbnRzIHRoZSBkZXZpY2UgbnVtYmVyCisgKiAgICAgICAgIG9mIHBhcnRpdGlvbiAtIGRldmljZSBudW1iZXIgb2YgZGlzayBwbHVzIHRoZSBwYXJ0aXRpb24gbnVtYmVyCisgKgk2KSAvZGV2LzxkaXNrX25hbWU+cDxkZWNpbWFsPiAtIHNhbWUgYXMgdGhlIGFib3ZlLCB0aGF0IGZvcm0gaXMKKyAqCSAgIHVzZWQgd2hlbiBkaXNrIG5hbWUgb2YgcGFydGl0aW9uZWQgZGlzayBlbmRzIG9uIGEgZGlnaXQuCisgKgk3KSBhbiBhY3R1YWwgYmxvY2sgZGV2aWNlIG5vZGUgaW4gdGhlIGluaXRyYW1mcyBmaWxlc3lzdGVtCisgKgorICoJSWYgbmFtZSBkb2Vzbid0IGhhdmUgZmFsbCBpbnRvIHRoZSBjYXRlZ29yaWVzIGFib3ZlLCB3ZSByZXR1cm4gMC4KKyAqCURyaXZlcmZzIGlzIHVzZWQgdG8gY2hlY2sgaWYgc29tZXRoaW5nIGlzIGEgZGlzayBuYW1lIC0gaXQgaGFzCisgKglhbGwga25vd24gZGlza3MgdW5kZXIgYnVzL2Jsb2NrL2RldmljZXMuICBJZiB0aGUgZGlzayBuYW1lCisgKgljb250YWlucyBzbGFzaGVzLCBuYW1lIG9mIGRyaXZlcmZzIG5vZGUgaGFzIHRoZW0gcmVwbGFjZWQgd2l0aAorICoJZG90cy4gIHRyeV9uYW1lKCkgZG9lcyB0aGUgYWN0dWFsIGNoZWNrcywgYXNzdW1pbmcgdGhhdCBkcml2ZXJmcworICoJaXMgbW91bnRlZCBvbiByb290ZnMgL3N5cy4KKyAqLworCitzdGF0aWMgaW5saW5lIGRldl90IG5hbWVfdG9fZGV2X3RfcmVhbChjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKnA7CisJZGV2X3QgcmVzID0gMDsKKwljaGFyICpzOworCWludCBwYXJ0OworCXN0cnVjdCBzdGF0IHN0OworCWludCBsZW47CisJY29uc3QgY2hhciAqZGV2bmFtZTsKKwljaGFyICpjcHRyLCAqZTEsICplMjsKKwlpbnQgbWFqb3IsIG1pbm9yOworCisKKwlpZiAobmFtZVswXSA9PSAnLycpIHsKKwkJZGV2bmFtZSA9IG5hbWU7CisJfSBlbHNlIHsKKwkJY2hhciAqZG5hbWUgPSBhbGxvY2Eoc3RybGVuKG5hbWUpICsgNik7CisJCXNwcmludGYoZG5hbWUsICIvZGV2LyVzIiwgbmFtZSk7CisJCWRldm5hbWUgPSBkbmFtZTsKKwl9CisKKwlpZiAoIXN0YXQoZGV2bmFtZSwgJnN0KSAmJiBTX0lTQkxLKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gc3Quc3RfcmRldjsKKworCWlmIChzdHJuY21wKG5hbWUsICIvZGV2LyIsIDUpKSB7CisJCWlmICgoY3B0ciA9IHN0cmNocihkZXZuYW1lKzUsICc6JykpICYmCisJCSAgICBjcHRyWzFdICE9ICdcMCcpIHsKKwkJCS8qIENvbG9uLXNlcGFyYXRlZCBkZWNpbWFsIGRldmljZSBudW1iZXIgKi8KKwkJCSpjcHRyID0gJ1wwJzsKKwkJCW1ham9yID0gc3RydG91bChkZXZuYW1lKzUsICZlMSwgMTApOworCQkJbWlub3IgPSBzdHJ0b3VsKGNwdHIrMSwgJmUyLCAxMCk7CisJCQlpZiAoISplMSAmJiAhKmUyKQorCQkJCXJldHVybiBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJCQkqY3B0ciA9ICc6JzsKKwkJfSBlbHNlIHsKKwkJCS8qIEhleGFkZWNpbWFsIGRldmljZSBudW1iZXIgKi8KKwkJCXJlcyA9IChkZXZfdCkgc3RydG91bChuYW1lLCAmcCwgMTYpOworCQkJaWYgKCEqcCkKKwkJCQlyZXR1cm4gcmVzOworCQl9CisJfSBlbHNlIHsKKwkJbmFtZSArPSA1OworCX0KKworCWlmICghc3RyY21wKG5hbWUsICJuZnMiKSkKKwkJcmV0dXJuIFJvb3RfTkZTOworCisJaWYgKCFzdHJjbXAobmFtZSwgInJhbSIpKSAvKiAvZGV2L3JhbSAtIGhpc3RvcmljIGFsaWFzIGZvciAvZGV2L3JhbTAgKi8KKwkJcmV0dXJuIFJvb3RfUkFNMDsKKworCWlmICghc3RybmNtcChuYW1lLCAibXRkIiwgMykpCisJCXJldHVybiBSb290X01URDsKKworCWxlbiA9IHN0cmxlbihuYW1lKTsKKwlzID0gYWxsb2NhKGxlbiArIDEpOworCW1lbWNweShzLCBuYW1lLCBsZW4gKyAxKTsKKworCWZvciAocCA9IHM7ICpwOyBwKyspCisJCWlmICgqcCA9PSAnLycpCisJCQkqcCA9ICchJzsKKwlyZXMgPSB0cnlfbmFtZShzLCAwKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJd2hpbGUgKHAgPiBzICYmIGlzZGlnaXQocFstMV0pKQorCQlwLS07CisJaWYgKHAgPT0gcyB8fCAhKnAgfHwgKnAgPT0gJzAnKQorCQlnb3RvIGZhaWw7CisJcGFydCA9IHN0cnRvdWwocCwgTlVMTCwgMTApOworCSpwID0gJ1wwJzsKKwlyZXMgPSB0cnlfbmFtZShzLCBwYXJ0KTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJaWYgKHAgPCBzICsgMiB8fCAhaXNkaWdpdChwWy0yXSkgfHwgcFstMV0gIT0gJ3AnKQorCQlnb3RvIGZhaWw7CisJcFstMV0gPSAnXDAnOworCXJlcyA9IHRyeV9uYW1lKHMsIHBhcnQpOworCXJldHVybiByZXM7CisKK2ZhaWw6CisJcmV0dXJuIChkZXZfdCkgMDsKK30KKworZGV2X3QgbmFtZV90b19kZXZfdChjb25zdCBjaGFyICpuYW1lKQoreworCWRldl90IGRldiA9IG5hbWVfdG9fZGV2X3RfcmVhbChuYW1lKTsKKworCURFQlVHKCgia2luaXQ6IG5hbWVfdG9fZGV2X3QoJXMpID0gJXNcbiIsIG5hbWUsIGJkZXZuYW1lKGRldikpKTsKKwlyZXR1cm4gZGV2OworfQorCisjaWZkZWYgVEVTVF9OQU1FVE9ERVYJCS8qIFN0YW5kYWxvbmUgdGVzdCAqLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJbmFtZV90b19kZXZfdChhcmd2W2ldKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9LYnVpbGQgYi91c3Iva2luaXQvbmZzbW91bnQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MWU2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvS2J1aWxkCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMga2J1aWxkIGZpbGUgZm9yIG5mc21vdW50CisjCisKK3N0YXRpYy15IDo9IHN0YXRpYy9uZnNtb3VudAorI0ZJWE1FIC0gYnVpbGQgaXMgYnJva2VuIHN0YXRpYy15IDo9IGR1bW15cG1hcAorc2hhcmVkLXkgOj0gc2hhcmVkL25mc21vdW50CisKK29ianMgOj0gbWFpbi5vIG1vdW50Lm8gcG9ydG1hcC5vIGR1bW15cG1hcC5vIHN1bnJwYy5vCisKKyMgQ3JlYXRlIGJ1aWx0LWluLm8gd2l0aCBhbGwgLm8gZmlsZXMgKHVzZWQgYnkga2luaXQpCitsaWIteSA6PSAkKG9ianMpCisKKyMgLm8gZmlsZXMgdXNlZCBmb3IgZXhlY3V0YWJsZXMKK3N0YXRpYy9uZnNtb3VudC15IDo9ICQob2JqcykKK3NoYXJlZC9uZnNtb3VudC15IDo9ICQob2JqcykKKworIyBkdW1teXBtYXAgdXNlcyBhIHNpbmdsZSAubyBmaWxlIChyZW5hbWUgc3JjIGZpbGU/KQorZHVtbXlwbWFwLXkgOj0gZHVtbXlwbWFwX3Rlc3QubworCisjIFRPRE8gLSBkbyB3ZSB3YW50IGEgc3RyaXBwZWQgdmVyc2lvbgorIyBUT0RPIC0gZG8gd2Ugd2FudCB0aGUgc3RhdGljLmcgKyBzaGFyZWQuZyBkaXJlY3Rvcmllcz8KKworY2xlYW4tZGlycyA6PSBzdGF0aWMgc2hhcmVkCisKKyMgSW5zdGFsbCBiaW5hcnkKK2luc3RhbGwteSA6PSAkKHNoYXJlZC15KQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc21vdW50L1JFQURNRS5sb2NraW5nIGIvdXNyL2tpbml0L25mc21vdW50L1JFQURNRS5sb2NraW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmU4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvUkVBRE1FLmxvY2tpbmcKQEAgLTAsMCArMSwyNiBAQAorSSBoYXZlIGltcGxlbWVudGVkIHBvcnRtYXAgc3Bvb2ZpbmcgaW4ga2xpYmMgbmZzbW91bnQgKHJlbGVhc2VkIGFzCitrbGliYy0wLjE0NCkgVGhpcyBpcyBiYXNpY2FsbHkgYSB2ZXN0aWdpYWwgcG9ydG1hcCBkYWVtb24gd2hpY2ggZ2V0cworbGF1bmNoZWQgYmVmb3JlIHRoZSBtb3VudCgpIGNhbGwgYW5kIHRoZW4ganVzdCByZWNvcmRzIGFueQordHJhbnNhY3Rpb25zIGl0IGdldHMgdG8gYSBmaWxlIGFuZCBzZW5kcyBiYWNrIGFuIGFmZmlybWF0aXZlIHJlcGx5LgorCitUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIGl0ICh0aGlzIGJlbG9uZ3MgaW4gYSBSRUFETUUgZmlsZSwgYnV0IGl0J3MKK3RvbyBsYXRlIGF0IG5pZ2h0IHJpZ2h0IG5vdyk6CisKK2EpIFNldCBhIGZpeGVkIHBvcnRudW1iZXIgaW4gL3Byb2Mvc3lzL25mcy9ubG1fdGNwcG9ydCBhbmQKKy9wcm9jL3N5cy9uZnMvbmxtX3VkcHBvcnQgYmVmb3JlIGNhbGxpbmcgbmZzbW91bnQ7IG9uY2UgdGhlIHBvcnRtYXBwZXIKK3N0YXJ0cyBmZWVkIHRoYXQgZml4ZWQgcG9ydG51bWJlciB0byBwbWFwX3NldCg4KS4gIEluIHRoaXMgY2FzZSB0aGUKK3BtYXBfZmlsZSBjYW4gYmUgL2Rldi9udWxsLgorCitiKSBBbGxvdyB0aGUga2VybmVsIHRvIGJpbmQgdG8gYW55IHBvcnQgYW5kIHVzZSB0aGUgZmlsZSBwcm9kdWNlZCBieQorbmZzcm9vdCB0byBmZWVkIHRvIHBtYXBfc2V0IChpdCBzaG91bGQgYmUgZGlyZWN0bHkgY29tcGF0aWJsZSk7IHRoaXMKK21lYW5zIHRoZSBmaWxlIG5lZWRzIHRvIGJlIHRyYW5zZmVycmVkIHRvIGEgcGxhY2Ugd2hlcmUgdGhlICJyZWFsCityb290IiBjYW4gZmluZCBpdCBiZWZvcmUgcnVuLWluaXQuCisKK0luIGVpdGhlciBjYXNlLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgdGhlIHJlYWwgcG9ydG1hcHBlciBpcyBsYXVuY2hlZAorYmVmb3JlIGFueSBwcm9ncmFtIGFjdHVhbGx5IHRyaWVzIHRvIGNyZWF0ZSBsb2NrcyEKKworVG8gdXNlIGl0OgorCisJIyBXZSBuZWVkIHRoZSBsb29wYmFjayBkZXZpY2UgdG8gYmUgdXAgYmVmb3JlIHdlIGRvIHRoaXMhCisJaXBjb25maWcgMTI3LjAuMC4xOjo6Ojpsbzpub25lCisJbmZzcm9vdCAtcCBwbWFwX2ZpbGUgLW8gbG9jayBzZXJ2ZXI6L3BhdGhuYW1lIC9yZWFscGF0aApkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc21vdW50L2R1bW15cG1hcC5jIGIvdXNyL2tpbml0L25mc21vdW50L2R1bW15cG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTI0MDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvZHVtbXlwbWFwLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBFbm91Z2ggcG9ydG1hcHBlciBmdW5jdGlvbmFsaXR5IHRoYXQgbW91bnQgZG9lc24ndCBoYW5nIHRyeWluZworICogdG8gc3RhcnQgbG9ja2QuICBFbmFibGVzIG5mc3Jvb3Qgd2l0aCBsb2NraW5nIGZ1bmN0aW9uYWxpdHkuCisgKgorICogTm90ZTogdGhlIGtlcm5lbCB3aWxsIG9ubHkgc3BlYWsgdG8gdGhlIGxvY2FsIHBvcnRtYXBwZXIKKyAqIHVzaW5nIFJQQyBvdmVyIFVEUC4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJzdW5ycGMuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnByb2duYW1lOworCitzdHJ1Y3QgcG9ydG1hcF9jYWxsIHsKKwlzdHJ1Y3QgcnBjX2NhbGwgcnBjOworCXVpbnQzMl90IHByb2dyYW07CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCBwcm90bzsKKwl1aW50MzJfdCBwb3J0OworfTsKKworc3RydWN0IHBvcnRtYXBfcmVwbHkgeworCXN0cnVjdCBycGNfcmVwbHkgcnBjOworCXVpbnQzMl90IHBvcnQ7Cit9OworCitzdGF0aWMgaW50IGJpbmRfcG9ydG1hcCh2b2lkKQoreworCWludCBzb2NrID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisKKwlpZiAoc29jayA8IDApCisJCXJldHVybiAtMTsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Ygc2luKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKDB4N2YwMDAwMDEpOwkvKiAxMjcuMC4wLjEgKi8KKwlzaW4uc2luX3BvcnQgPSBodG9ucyhSUENfUE1BUF9QT1JUKTsKKwlpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mIHNpbikgPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJY2xvc2Uoc29jayk7CisJCWVycm5vID0gZXJyOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHNvY2s7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm90b25hbWUodWludDMyX3QgcHJvdG8pCit7CisJc3dpdGNoIChudG9obChwcm90bykpIHsKKwljYXNlIElQUFJPVE9fVENQOgorCQlyZXR1cm4gInRjcCI7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJcmV0dXJuICJ1ZHAiOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKworc3RhdGljIGludCBkdW1teV9wb3J0bWFwKGludCBzb2NrLCBGSUxFICpwb3J0bWFwX2ZpbGUpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgcGt0bGVuLCBhZGRybGVuOworCXVuaW9uIHsKKwkJc3RydWN0IHBvcnRtYXBfY2FsbCBjOworCQl1bnNpZ25lZCBjaGFyIGJbNjU1MzZdOwkvKiBNYXggVURQIHBhY2tldCBzaXplICovCisJfSBwa3Q7CisJc3RydWN0IHBvcnRtYXBfcmVwbHkgcnBseTsKKworCWZvciAoOzspIHsKKwkJYWRkcmxlbiA9IHNpemVvZiBzaW47CisJCXBrdGxlbiA9IHJlY3Zmcm9tKHNvY2ssICZwa3QuYy5ycGMuaGRyLnVkcCwgc2l6ZW9mIHBrdCwgMCwKKwkJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCAmYWRkcmxlbik7CisKKwkJaWYgKHBrdGxlbiA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogKzQgdG8gc2tpcCB0aGUgVENQIGZyYWdtZW50IGhlYWRlciAqLworCQlpZiAocGt0bGVuICsgNCA8IHNpemVvZihzdHJ1Y3QgcG9ydG1hcF9jYWxsKSkKKwkJCWNvbnRpbnVlOwkvKiBCYWQgcGFja2V0ICovCisKKwkJaWYgKHBrdC5jLnJwYy5oZHIudWRwLm1zZ190eXBlICE9IGh0b25sKFJQQ19DQUxMKSkKKwkJCWNvbnRpbnVlOwkvKiBCYWQgcGFja2V0ICovCisKKwkJbWVtc2V0KCZycGx5LCAwLCBzaXplb2YgcnBseSk7CisKKwkJcnBseS5ycGMuaGRyLnVkcC54aWQgPSBwa3QuYy5ycGMuaGRyLnVkcC54aWQ7CisJCXJwbHkucnBjLmhkci51ZHAubXNnX3R5cGUgPSBodG9ubChSUENfUkVQTFkpOworCisJCWlmIChwa3QuYy5ycGMucnBjX3ZlcnMgIT0gaHRvbmwoMikpIHsKKwkJCXJwbHkucnBjLnJlcGx5X3N0YXRlID0gaHRvbmwoUkVQTFlfREVOSUVEKTsKKwkJCS8qIHN0YXRlIDwtIFJQQ19NSVNNQVRDSCA9PSAwICovCisJCX0gZWxzZSBpZiAocGt0LmMucnBjLnByb2dyYW0gIT0gaHRvbmwoUE9SVE1BUF9QUk9HUkFNKSkgeworCQkJcnBseS5ycGMucmVwbHlfc3RhdGUgPSBodG9ubChQUk9HX1VOQVZBSUwpOworCQl9IGVsc2UgaWYgKHBrdC5jLnJwYy5wcm9nX3ZlcnMgIT0gaHRvbmwoMikpIHsKKwkJCXJwbHkucnBjLnJlcGx5X3N0YXRlID0gaHRvbmwoUFJPR19NSVNNQVRDSCk7CisJCX0gZWxzZSBpZiAocGt0LmMucnBjLmNyZWRfbGVuICE9IDAgfHwgcGt0LmMucnBjLnZyZl9sZW4gIT0gMCkgeworCQkJLyogQ2FuJ3QgZGVhbCB3aXRoIGNyZWRlbnRpYWxzIGRhdGE7IHRoZSBrZXJuZWwKKwkJCSAgIHdvbid0IHNlbmQgdGhlbSAqLworCQkJcnBseS5ycGMucmVwbHlfc3RhdGUgPSBodG9ubChTWVNURU1fRVJSKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAobnRvaGwocGt0LmMucnBjLnByb2MpKSB7CisJCQljYXNlIFBNQVBfUFJPQ19OVUxMOgorCQkJCWJyZWFrOworCQkJY2FzZSBQTUFQX1BST0NfU0VUOgorCQkJCWlmIChwa3QuYy5wcm90byA9PSBodG9ubChJUFBST1RPX1RDUCkgfHwKKwkJCQkgICAgcGt0LmMucHJvdG8gPT0gaHRvbmwoSVBQUk9UT19VRFApKSB7CisJCQkJCWlmIChwb3J0bWFwX2ZpbGUpCisJCQkJCQlmcHJpbnRmKHBvcnRtYXBfZmlsZSwKKwkJCQkJCQkiJXUgJXUgJXMgJXVcbiIsCisJCQkJCQkJbnRvaGwocGt0LmMucHJvZ3JhbSksCisJCQkJCQkJbnRvaGwocGt0LmMudmVyc2lvbiksCisJCQkJCQkJcHJvdG9uYW1lKHBrdC5jLnByb3RvKSwKKwkJCQkJCQludG9obChwa3QuYy5wb3J0KSk7CisJCQkJCXJwbHkucG9ydCA9IGh0b25sKDEpOwkvKiBUUlVFID0gc3VjY2VzcyAqLworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUE1BUF9QUk9DX1VOU0VUOgorCQkJCXJwbHkucG9ydCA9IGh0b25sKDEpOwkvKiBUUlVFID0gc3VjY2VzcyAqLworCQkJCWJyZWFrOworCQkJY2FzZSBQTUFQX1BST0NfR0VUUE9SVDoKKwkJCQlicmVhazsKKwkJCWNhc2UgUE1BUF9QUk9DX0RVTVA6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJwbHkucnBjLnJlcGx5X3N0YXRlID0gaHRvbmwoUFJPQ19VTkFWQUlMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXNlbmR0byhzb2NrLCAmcnBseS5ycGMuaGRyLnVkcCwgc2l6ZW9mIHJwbHkgLSA0LCAwLAorCQkgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIGFkZHJsZW4pOworCX0KK30KKworcGlkX3Qgc3RhcnRfZHVtbXlfcG9ydG1hcChjb25zdCBjaGFyICpmaWxlKQoreworCUZJTEUgKnBvcnRtYXBfZmlsZXA7CisJaW50IHNvY2s7CisJcGlkX3Qgc3Bvb2ZfcG9ydG1hcDsKKworCXBvcnRtYXBfZmlsZXAgPSBmb3BlbihmaWxlLCAidyIpOworCWlmICghcG9ydG1hcF9maWxlcCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3Qgd3JpdGUgcG9ydG1hcCBmaWxlOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNvY2sgPSBiaW5kX3BvcnRtYXAoKTsKKwlpZiAoc29jayA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVBRERSSU5VU0UpCisJCQlyZXR1cm4gMDsJLyogQXNzdW1lIG5vdCBuZWVkZWQgKi8KKwkJZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBwb3J0bWFwIHNwb29maW5nIGZhaWxlZFxuIiwKKwkJCQlwcm9nbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlzcG9vZl9wb3J0bWFwID0gZm9yaygpOworCWlmIChzcG9vZl9wb3J0bWFwID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBmb3JrXG4iLCBwcm9nbmFtZSk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKHNwb29mX3BvcnRtYXAgPT0gMCkgeworCQkvKiBDaGlsZCBwcm9jZXNzICovCisJCWR1bW15X3BvcnRtYXAoc29jaywgcG9ydG1hcF9maWxlcCk7CisJCV9leGl0KDI1NSk7CS8qIEVycm9yICovCisJfSBlbHNlIHsKKwkJLyogUGFyZW50IHByb2Nlc3MgKi8KKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiBzcG9vZl9wb3J0bWFwOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9kdW1teXBtYXAuaCBiL3Vzci9raW5pdC9uZnNtb3VudC9kdW1teXBtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY1MGJmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L2R1bW15cG1hcC5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBGdW5jdGlvbnMgZm9yIHRoZSBwb3J0bWFwIHNwb29mZXIKKyAqLworCisjaWZuZGVmIE5GU01PVU5UX0RVTU1ZUE9SVE1BUF9ICisjZGVmaW5lIE5GU01PVU5UX0RVTU1ZUE9SVE1BUF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KK3BpZF90IHN0YXJ0X2R1bW15X3BvcnRtYXAoY29uc3QgY2hhciAqZmlsZSk7CisKKyNlbmRpZiAvKiBORlNNT1VOVF9EVU1NWVBPUlRNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc21vdW50L2R1bW15cG1hcF90ZXN0LmMgYi91c3Iva2luaXQvbmZzbW91bnQvZHVtbXlwbWFwX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODFhMTQxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L2R1bW15cG1hcF90ZXN0LmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFRFU1QKKyNpbmNsdWRlICJkdW1teXBtYXAuYyIKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9tYWluLmMgYi91c3Iva2luaXQvbmZzbW91bnQvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMmVlYzcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvbWFpbi5jCkBAIC0wLDAgKzEsMjU5IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4JLyogRm9yIF9LTElCQ19OT19NTVUgKi8KKworI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgorCisjaW5jbHVkZSAibmZzbW91bnQuaCIKKyNpbmNsdWRlICJzdW5ycGMuaCIKKyNpbmNsdWRlICJkdW1teXBtYXAuaCIKKworY29uc3QgY2hhciAqcHJvZ25hbWU7CitzdGF0aWMgam1wX2J1ZiBhYm9ydF9idWY7CisKK3N0YXRpYyBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgbW91bnRfZGF0YSA9IHsKKwkudmVyc2lvbgk9IE5GU19NT1VOVF9WRVJTSU9OLAorCS5mbGFncwkJPSBORlNfTU9VTlRfTk9OTE0gfCBORlNfTU9VTlRfVkVSMyB8IE5GU19NT1VOVF9UQ1AsCisJLnJzaXplCQk9IDAsCS8qIFNlcnZlcidzIGNob2ljZSAqLworCS53c2l6ZQkJPSAwLAkvKiBTZXJ2ZXIncyBjaG9pY2UgKi8KKwkudGltZW8JCT0gNywKKwkucmV0cmFucwk9IDMsCisJLmFjcmVnbWluCT0gMywKKwkuYWNyZWdtYXgJPSA2MCwKKwkuYWNkaXJtaW4JPSAzMCwKKwkuYWNkaXJtYXgJPSA2MCwKKwkubmFtbGVuCQk9IE5BTUVfTUFYLAorfTsKKworaW50IG5mc19wb3J0OworCitzdGF0aWMgc3RydWN0IGludF9vcHRzIHsKKwljaGFyICpuYW1lOworCWludCAqdmFsOworfSBpbnRfb3B0c1tdID0geworCXsicG9ydCIsCSZuZnNfcG9ydH0sCisJeyJyc2l6ZSIsCSZtb3VudF9kYXRhLnJzaXplfSwKKwl7IndzaXplIiwJJm1vdW50X2RhdGEud3NpemV9LAorCXsidGltZW8iLAkmbW91bnRfZGF0YS50aW1lb30sCisJeyJyZXRyYW5zIiwJJm1vdW50X2RhdGEucmV0cmFuc30sCisJeyJhY3JlZ21pbiIsCSZtb3VudF9kYXRhLmFjcmVnbWlufSwKKwl7ImFjcmVnbWF4IiwJJm1vdW50X2RhdGEuYWNyZWdtYXh9LAorCXsiYWNkaXJtaW4iLAkmbW91bnRfZGF0YS5hY2Rpcm1pbn0sCisJeyJhY2Rpcm1heCIsCSZtb3VudF9kYXRhLmFjZGlybWF4fSwKKwl7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYm9vbF9vcHRzIHsKKwljaGFyICpuYW1lOworCWludCBhbmRfbWFzazsKKwlpbnQgb3JfbWFzazsKK30gYm9vbF9vcHRzW10gPSB7CisJeyJzb2Z0Iiwgfk5GU19NT1VOVF9TT0ZULCBORlNfTU9VTlRfU09GVH0sCisJeyJoYXJkIiwgfk5GU19NT1VOVF9TT0ZULCAwfSwKKwl7ImludHIiLCB+TkZTX01PVU5UX0lOVFIsIE5GU19NT1VOVF9JTlRSfSwKKwl7Im5vaW50ciIsIH5ORlNfTU9VTlRfSU5UUiwgMH0sCisJeyJwb3NpeCIsIH5ORlNfTU9VTlRfUE9TSVgsIE5GU19NT1VOVF9QT1NJWH0sCisJeyJub3Bvc2l4Iiwgfk5GU19NT1VOVF9QT1NJWCwgMH0sCisJeyJjdG8iLCB+TkZTX01PVU5UX05PQ1RPLCAwfSwKKwl7Im5vY3RvIiwgfk5GU19NT1VOVF9OT0NUTywgTkZTX01PVU5UX05PQ1RPfSwKKwl7ImFjIiwgfk5GU19NT1VOVF9OT0FDLCAwfSwKKwl7Im5vYWMiLCB+TkZTX01PVU5UX05PQUMsIE5GU19NT1VOVF9OT0FDfSwKKwl7ImxvY2siLCB+TkZTX01PVU5UX05PTkxNLCAwfSwKKwl7Im5vbG9jayIsIH5ORlNfTU9VTlRfTk9OTE0sIE5GU19NT1VOVF9OT05MTX0sCisJeyJ2MiIsIH5ORlNfTU9VTlRfVkVSMywgMH0sCisJeyJ2MyIsIH5ORlNfTU9VTlRfVkVSMywgTkZTX01PVU5UX1ZFUjN9LAorCXsidWRwIiwgfk5GU19NT1VOVF9UQ1AsIDB9LAorCXsidGNwIiwgfk5GU19NT1VOVF9UQ1AsIE5GU19NT1VOVF9UQ1B9LAorCXsiYnJva2VuX3N1aWQiLCB+TkZTX01PVU5UX0JST0tFTl9TVUlELCBORlNfTU9VTlRfQlJPS0VOX1NVSUR9LAorCXsicm8iLCB+TkZTX01PVU5UX0tMSUJDX1JPTkxZLCBORlNfTU9VTlRfS0xJQkNfUk9OTFl9LAorCXsicnciLCB+TkZTX01PVU5UX0tMSUJDX1JPTkxZLCAwfSwKKwl7TlVMTCwgMCwgMH0KK307CisKK3N0YXRpYyBpbnQgcGFyc2VfaW50KGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqY3R4KQoreworCWNoYXIgKmVuZDsKKwlpbnQgcmV0OworCisJcmV0ID0gKGludClzdHJ0b3VsKHZhbCwgJmVuZCwgMCk7CisJaWYgKCp2YWwgPT0gJ1wwJyB8fCAqZW5kICE9ICdcMCcpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCB2YWx1ZSBmb3IgJXNcbiIsIHZhbCwgY3R4KTsKKwkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGNoYXIgKm9wdHMpCit7CisJY2hhciAqY3AsICp2YWw7CisKKwl3aGlsZSAoKGNwID0gc3Ryc2VwKCZvcHRzLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICgqY3AgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlpZiAoKHZhbCA9IHN0cmNocihjcCwgJz0nKSkgIT0gTlVMTCkgeworCQkJc3RydWN0IGludF9vcHRzICpvcHRzID0gaW50X29wdHM7CisJCQkqdmFsKysgPSAnXDAnOworCQkJd2hpbGUgKG9wdHMtPm5hbWUgJiYgc3RyY21wKG9wdHMtPm5hbWUsIGNwKSAhPSAwKQorCQkJCW9wdHMrKzsKKwkJCWlmIChvcHRzLT5uYW1lKQorCQkJCSoob3B0cy0+dmFsKSA9IHBhcnNlX2ludCh2YWwsIG9wdHMtPm5hbWUpOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogYmFkIG9wdGlvbiAnJXMnXG4iLAorCQkJCQlwcm9nbmFtZSwgY3ApOworCQkJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBib29sX29wdHMgKm9wdHMgPSBib29sX29wdHM7CisJCQl3aGlsZSAob3B0cy0+bmFtZSAmJiBzdHJjbXAob3B0cy0+bmFtZSwgY3ApICE9IDApCisJCQkJb3B0cysrOworCQkJaWYgKG9wdHMtPm5hbWUpIHsKKwkJCQltb3VudF9kYXRhLmZsYWdzICY9IG9wdHMtPmFuZF9tYXNrOworCQkJCW1vdW50X2RhdGEuZmxhZ3MgfD0gb3B0cy0+b3JfbWFzazsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogYmFkIG9wdGlvbiAnJXMnXG4iLAorCQkJCQlwcm9nbmFtZSwgY3ApOworCQkJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHVpbnQzMl90IHBhcnNlX2FkZHIoY29uc3QgY2hhciAqaXApCit7CisJc3RydWN0IGluX2FkZHIgaW47CisJaWYgKGluZXRfYXRvbihpcCwgJmluKSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IHBhcnNlIElQIGFkZHJlc3MgJyVzJ1xuIiwKKwkJCXByb2duYW1lLCBpcCk7CisJCWxvbmdqbXAoYWJvcnRfYnVmLCAxKTsKKwl9CisJcmV0dXJuIGluLnNfYWRkcjsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKHN0YXQocGF0aCwgJnN0KSA9PSAtMSkgeworCQlwZXJyb3IoInN0YXQiKTsKKwkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCX0gZWxzZSBpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogJyVzJyBub3QgYSBkaXJlY3RvcnlcbiIsIHByb2duYW1lLCBwYXRoKTsKKwkJbG9uZ2ptcChhYm9ydF9idWYsIDEpOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaywgYWxpYXMoIm5mc21vdW50X21haW4iKSkpOworCitpbnQgbmZzbW91bnRfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVpbnQzMl90IHNlcnZlcjsKKwljaGFyICpyZW1fbmFtZTsKKwljaGFyICpyZW1fcGF0aDsKKwljaGFyICpob3N0bmFtZTsKKwljaGFyICpwYXRoOworCWludCBjOworCWNvbnN0IGNoYXIgKnBvcnRtYXBfZmlsZTsKKwlwaWRfdCBzcG9vZl9wb3J0bWFwOworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHNldGptcChhYm9ydF9idWYpKSkKKwkJcmV0dXJuIGVycjsKKworCS8qIFNldCB0aGVzZSBoZXJlIHRvIGF2b2lkIGxvbmdqbXAgd2FybmluZyAqLworCXBvcnRtYXBfZmlsZSA9IE5VTEw7CisJc3Bvb2ZfcG9ydG1hcCA9IDA7CisJc2VydmVyID0gMDsKKworCS8qIElmIHByb2duYW1lIGlzIHNldCB3ZSdyZSBpbnZva2VkIGZyb20gYW5vdGhlciBwcm9ncmFtICovCisJaWYgKCFwcm9nbmFtZSkgeworCQlzdHJ1Y3QgdGltZXZhbCBub3c7CisJCXByb2duYW1lID0gYXJndlswXTsKKwkJZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCQlzcmFuZDQ4KG5vdy50dl91c2VjIF4gKG5vdy50dl9zZWMgPDwgMjQpKTsKKwl9CisKKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgIm86cDoiKSkgIT0gRU9GKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdvJzoKKwkJCXBhcnNlX29wdHMob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXBvcnRtYXBfZmlsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgb3B0aW9uIC0lY1xuIiwKKwkJCQlwcm9nbmFtZSwgb3B0b3B0KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKG9wdGluZCA9PSBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5lZWQgYSBwYXRoXG4iLCBwcm9nbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWhvc3RuYW1lID0gcmVtX3BhdGggPSBhcmd2W29wdGluZF07CisKKwlpZiAoKHJlbV9uYW1lID0gc3RyZHVwKHJlbV9wYXRoKSkgPT0gTlVMTCkgeworCQlwZXJyb3IoInN0cmR1cCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKHJlbV9wYXRoID0gc3RyY2hyKHJlbV9wYXRoLCAnOicpKSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5lZWQgYSBzZXJ2ZXJcbiIsIHByb2duYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJKnJlbV9wYXRoKysgPSAnXDAnOworCisJaWYgKCpyZW1fcGF0aCAhPSAnLycpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogbmVlZCBhIHBhdGhcbiIsIHByb2duYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJc2VydmVyID0gcGFyc2VfYWRkcihob3N0bmFtZSk7CisKKwlpZiAob3B0aW5kIDw9IGFyZ2MgLSAyKQorCQlwYXRoID0gYXJndltvcHRpbmQgKyAxXTsKKwllbHNlCisJCXBhdGggPSAiL25mc19yb290IjsKKworCWNoZWNrX3BhdGgocGF0aCk7CisKKyNpZiEgX0tMSUJDX05PX01NVQorCS8qIE5vdGU6IHVDbGludXggY2FuJ3QgZm9yaygpLCBzbyB0aGUgc3Bvb2YgcG9ydG1hcHBlciBpcyBub3QKKwkgICBhdmFpbGFibGUgb24gdUNsaW51eC4gKi8KKwlpZiAocG9ydG1hcF9maWxlKQorCQlzcG9vZl9wb3J0bWFwID0gc3RhcnRfZHVtbXlfcG9ydG1hcChwb3J0bWFwX2ZpbGUpOworCisJaWYgKHNwb29mX3BvcnRtYXAgPT0gLTEpCisJCXJldHVybiAxOworI2VuZGlmCisKKwlpZiAobmZzX21vdW50KHJlbV9uYW1lLCBob3N0bmFtZSwgc2VydmVyLCByZW1fcGF0aCwgcGF0aCwKKwkJICAgICAgJm1vdW50X2RhdGEpICE9IDApCisJCXJldHVybiAxOworCisJLyogSWYgd2Ugc2V0IHVwIHRoZSBzcG9vZmVyLCB0ZWFyIGl0IGRvd24gbm93ICovCisJaWYgKHNwb29mX3BvcnRtYXApIHsKKwkJa2lsbChTSUdURVJNLCBzcG9vZl9wb3J0bWFwKTsKKwkJd2hpbGUgKHdhaXRwaWQoc3Bvb2ZfcG9ydG1hcCwgTlVMTCwgMCkgPT0gLTEgJiYKKwkJICAgICAgIGVycm5vID09IEVJTlRSKQorCQkgIDsKKwl9CisKKwlmcmVlKHJlbV9uYW1lKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc21vdW50L21vdW50LmMgYi91c3Iva2luaXQvbmZzbW91bnQvbW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjZmNmNkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L25mc21vdW50L21vdW50LmMKQEAgLTAsMCArMSwzNTcgQEAKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIm5mc21vdW50LmgiCisjaW5jbHVkZSAic3VucnBjLmgiCisKK3N0YXRpYyB1aW50MzJfdCBtb3VudF9wb3J0OworCitzdHJ1Y3QgbW91bnRfY2FsbCB7CisJc3RydWN0IHJwY19jYWxsIHJwYzsKKwl1aW50MzJfdCBwYXRoX2xlbjsKKwljaGFyIHBhdGhbMF07Cit9OworCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdGhlIE5GUyB2MyBvbi10aGUtd2lyZSBmaWxlIGhhbmRsZSwKKyAqIGFzIGRlZmluZWQgaW4gcmZjMTgxMy4KKyAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUga2VybmVsLAorICogZGVmaW5lZCBpbiA8bGludXgvbmZoMy5oPjogcmZjIGhhcyBhIGxvbmcgaW4gbmV0d29yayBvcmRlciwKKyAqIGtlcm5lbCBoYXMgYSBzaG9ydCBpbiBuYXRpdmUgb3JkZXIuCisgKiBCb3RoIGtlcm5lbCBhbmQgcmZjIHVzZSB0aGUgbmFtZSBuZnNfZmg7IGtlcm5lbCBuYW1lIGlzCisgKiB2aXNpYmxlIHRvIHVzZXIgYXBwcyBpbiBzb21lIHZlcnNpb25zIG9mIGxpYmMuCisgKiBVc2UgZGlmZmVyZW50IG5hbWUgdG8gYXZvaWQgY2xhc2hlcy4KKyAqLworI2RlZmluZSBORlNfTUFYRkhTSVpFX1dJUkUgNjQKK3N0cnVjdCBuZnNfZmhfd2lyZSB7CisJdWludDMyX3Qgc2l6ZTsKKwljaGFyIGRhdGFbTkZTX01BWEZIU0laRV9XSVJFXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbW91bnRfcmVwbHkgeworCXN0cnVjdCBycGNfcmVwbHkgcmVwbHk7CisJdWludDMyX3Qgc3RhdHVzOworCXN0cnVjdCBuZnNfZmhfd2lyZSBmaDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIE1OVF9SRVBMWV9NSU5TSVpFIChzaXplb2Yoc3RydWN0IHJwY19yZXBseSkgKyBzaXplb2YodWludDMyX3QpKQorCitzdGF0aWMgaW50IGdldF9wb3J0cyh1aW50MzJfdCBzZXJ2ZXIsIGNvbnN0IHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSkKK3sKKwl1aW50MzJfdCBuZnNfdmVyLCBtb3VudF92ZXI7CisJdWludDMyX3QgcHJvdG87CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgeworCQluZnNfdmVyID0gTkZTM19WRVJTSU9OOworCQltb3VudF92ZXIgPSBORlNfTU5UM19WRVJTSU9OOworCX0gZWxzZSB7CisJCW5mc192ZXIgPSBORlMyX1ZFUlNJT047CisJCW1vdW50X3ZlciA9IE5GU19NTlRfVkVSU0lPTjsKKwl9CisKKwlwcm90byA9IChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUDsKKworCWlmIChuZnNfcG9ydCA9PSAwKSB7CisJCW5mc19wb3J0ID0gcG9ydG1hcChzZXJ2ZXIsIE5GU19QUk9HUkFNLCBuZnNfdmVyLCBwcm90byk7CisJCWlmIChuZnNfcG9ydCA9PSAwKSB7CisJCQlpZiAocHJvdG8gPT0gSVBQUk9UT19UQ1ApIHsKKwkJCQlzdHJ1Y3QgaW5fYWRkciBhZGRyID0geyBzZXJ2ZXIgfTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5GUyBvdmVyIFRDUCBub3QgIgorCQkJCQkiYXZhaWxhYmxlIGZyb20gJXNcbiIsIGluZXRfbnRvYShhZGRyKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJbmZzX3BvcnQgPSBORlNfUE9SVDsKKwkJfQorCX0KKworCWlmIChtb3VudF9wb3J0ID09IDApIHsKKwkJbW91bnRfcG9ydCA9IHBvcnRtYXAoc2VydmVyLCBORlNfTU5UX1BST0dSQU0sIG1vdW50X3ZlciwgcHJvdG8pOworCQlpZiAobW91bnRfcG9ydCA9PSAwKQorCQkJbW91bnRfcG9ydCA9IE1PVU5UX1BPUlQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwYWRfbGVuKGludCBsZW4pCit7CisJcmV0dXJuIChsZW4gKyAzKSAmIH4zOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9wYXJhbXModWludDMyX3Qgc2VydmVyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhKQoreworCSh2b2lkKXNlcnZlcjsKKwkodm9pZClwYXRoOworCSh2b2lkKWRhdGE7CisKKyNpZmRlZiBORlNfREVCVUcKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyID0geyBzZXJ2ZXIgfTsKKworCXByaW50ZigiTkZTIHBhcmFtczpcbiIpOworCXByaW50ZigiICBzZXJ2ZXIgPSAlcywgcGF0aCA9IFwiJXNcIiwgIiwgaW5ldF9udG9hKGFkZHIpLCBwYXRoKTsKKwlwcmludGYoInZlcnNpb24gPSAlZCwgcHJvdG8gPSAlc1xuIiwKKwkgICAgICAgZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMyA/IDMgOiAyLAorCSAgICAgICAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/ICJ0Y3AiIDogInVkcCIpOworCXByaW50ZigiICBtb3VudF9wb3J0ID0gJWQsIG5mc19wb3J0ID0gJWQsIGZsYWdzID0gJTA4eFxuIiwKKwkgICAgICAgbW91bnRfcG9ydCwgbmZzX3BvcnQsIGRhdGEtPmZsYWdzKTsKKwlwcmludGYoIiAgcnNpemUgPSAlZCwgd3NpemUgPSAlZCwgdGltZW8gPSAlZCwgcmV0cmFucyA9ICVkXG4iLAorCSAgICAgICBkYXRhLT5yc2l6ZSwgZGF0YS0+d3NpemUsIGRhdGEtPnRpbWVvLCBkYXRhLT5yZXRyYW5zKTsKKwlwcmludGYoIiAgYWNyZWcgKG1pbiwgbWF4KSA9ICglZCwgJWQpLCBhY2RpciAobWluLCBtYXgpID0gKCVkLCAlZClcbiIsCisJICAgICAgIGRhdGEtPmFjcmVnbWluLCBkYXRhLT5hY3JlZ21heCwgZGF0YS0+YWNkaXJtaW4sIGRhdGEtPmFjZGlybWF4KTsKKwlwcmludGYoIiAgc29mdCA9ICVkLCBpbnRyID0gJWQsIHBvc2l4ID0gJWQsIG5vY3RvID0gJWQsIG5vYWMgPSAlZFxuIiwKKwkgICAgICAgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1NPRlQpICE9IDAsCisJICAgICAgIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9JTlRSKSAhPSAwLAorCSAgICAgICAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfUE9TSVgpICE9IDAsCisJICAgICAgIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9OT0NUTykgIT0gMCwKKwkgICAgICAgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX05PQUMpICE9IDApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2ZoKGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJKHZvaWQpZGF0YTsKKwkodm9pZClsZW47CisKKyNpZmRlZiBORlNfREVCVUcKKwlpbnQgaSA9IDA7CisJaW50IG1heCA9IGxlbiAtIChsZW4gJSA4KTsKKworCXByaW50ZigiUm9vdCBmaWxlIGhhbmRsZTogJWQgYnl0ZXNcbiIsIE5GUzJfRkhTSVpFKTsKKworCXdoaWxlIChpIDwgbWF4KSB7CisJCWludCBqOworCisJCXByaW50ZigiICAlNGQ6ICAiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJcHJpbnRmKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICAiLAorCQkJICAgICAgIGRhdGFbaV0gJiAweGZmLCBkYXRhW2kgKyAxXSAmIDB4ZmYsCisJCQkgICAgICAgZGF0YVtpICsgMl0gJiAweGZmLCBkYXRhW2kgKyAzXSAmIDB4ZmYpOworCQl9CisJCWkgKz0gajsKKwkJcHJpbnRmKCJcbiIpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IG1vdW50X3JlcGx5IG1udF9yZXBseTsKKworc3RhdGljIGludCBtb3VudF9jYWxsKHVpbnQzMl90IHByb2MsIHVpbnQzMl90IHZlcnNpb24sCisJCSAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBjbGllbnQgKmNsbnQpCit7CisJc3RydWN0IG1vdW50X2NhbGwgKm1udF9jYWxsID0gTlVMTDsKKwlzaXplX3QgcGF0aF9sZW4sIGNhbGxfbGVuOworCXN0cnVjdCBycGMgcnBjOworCWludCByZXQgPSAwOworCisJcGF0aF9sZW4gPSBzdHJsZW4ocGF0aCk7CisJY2FsbF9sZW4gPSBzaXplb2YoKm1udF9jYWxsKSArIHBhZF9sZW4ocGF0aF9sZW4pOworCisJaWYgKChtbnRfY2FsbCA9IG1hbGxvYyhjYWxsX2xlbikpID09IE5VTEwpIHsKKwkJcGVycm9yKCJtYWxsb2MiKTsKKwkJZ290byBiYWlsOworCX0KKworCW1lbXNldChtbnRfY2FsbCwgMCwgc2l6ZW9mKCptbnRfY2FsbCkpOworCisJbW50X2NhbGwtPnJwYy5wcm9ncmFtID0gaHRvbmwoTkZTX01OVF9QUk9HUkFNKTsKKwltbnRfY2FsbC0+cnBjLnByb2dfdmVycyA9IGh0b25sKHZlcnNpb24pOworCW1udF9jYWxsLT5ycGMucHJvYyA9IGh0b25sKHByb2MpOworCW1udF9jYWxsLT5wYXRoX2xlbiA9IGh0b25sKHBhdGhfbGVuKTsKKwltZW1jcHkobW50X2NhbGwtPnBhdGgsIHBhdGgsIHBhdGhfbGVuKTsKKworCXJwYy5jYWxsID0gKHN0cnVjdCBycGNfY2FsbCAqKW1udF9jYWxsOworCXJwYy5jYWxsX2xlbiA9IGNhbGxfbGVuOworCXJwYy5yZXBseSA9IChzdHJ1Y3QgcnBjX3JlcGx5ICopJm1udF9yZXBseTsKKwlycGMucmVwbHlfbGVuID0gc2l6ZW9mKG1udF9yZXBseSk7CisKKwlpZiAocnBjX2NhbGwoY2xudCwgJnJwYykgPCAwKQorCQlnb3RvIGJhaWw7CisKKwlpZiAocHJvYyAhPSBNTlRQUk9DX01OVCkgeworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJwYy5yZXBseV9sZW4gPCBNTlRfUkVQTFlfTUlOU0laRSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImluY29tcGxldGUgcmVwbHk6ICV6dSA8ICV6dVxuIiwKKwkJCXJwYy5yZXBseV9sZW4sIE1OVF9SRVBMWV9NSU5TSVpFKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmIChtbnRfcmVwbHkuc3RhdHVzICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJtb3VudCBjYWxsIGZhaWxlZDogJWRcbiIsCisJCQludG9obChtbnRfcmVwbHkuc3RhdHVzKSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlnb3RvIGRvbmU7CisKK2JhaWw6CisJcmV0ID0gLTE7CisKK2RvbmU6CisJaWYgKG1udF9jYWxsKSB7CisJCWZyZWUobW50X2NhbGwpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbW91bnRfdjIoY29uc3QgY2hhciAqcGF0aCwKKwkJICAgIHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSwgc3RydWN0IGNsaWVudCAqY2xudCkKK3sKKwlpbnQgcmV0ID0gbW91bnRfY2FsbChNTlRQUk9DX01OVCwgTkZTX01OVF9WRVJTSU9OLCBwYXRoLCBjbG50KTsKKworCWlmIChyZXQgPT0gMCkgeworCQlkdW1wX2ZoKChjb25zdCBjaGFyICopJm1udF9yZXBseS5maCwgTkZTMl9GSFNJWkUpOworCisJCWRhdGEtPnJvb3Quc2l6ZSA9IE5GU19GSFNJWkU7CisJCW1lbWNweShkYXRhLT5yb290LmRhdGEsICZtbnRfcmVwbHkuZmgsIE5GU19GSFNJWkUpOworCQltZW1jcHkoZGF0YS0+b2xkX3Jvb3QuZGF0YSwgJm1udF9yZXBseS5maCwgTkZTX0ZIU0laRSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdW1vdW50X3YyKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBjbGllbnQgKmNsbnQpCit7CisJcmV0dXJuIG1vdW50X2NhbGwoTU5UUFJPQ19VTU5ULCBORlNfTU5UX1ZFUlNJT04sIHBhdGgsIGNsbnQpOworfQorCitzdGF0aWMgaW50IG1vdW50X3YzKGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgICBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEsIHN0cnVjdCBjbGllbnQgKmNsbnQpCit7CisJaW50IHJldCA9IG1vdW50X2NhbGwoTU5UUFJPQ19NTlQsIE5GU19NTlQzX1ZFUlNJT04sIHBhdGgsIGNsbnQpOworCisJaWYgKHJldCA9PSAwKSB7CisJCXNpemVfdCBmaHNpemUgPSBudG9obChtbnRfcmVwbHkuZmguc2l6ZSk7CisKKwkJZHVtcF9maCgoY29uc3QgY2hhciAqKSZtbnRfcmVwbHkuZmguZGF0YSwgZmhzaXplKTsKKworCQltZW1zZXQoZGF0YS0+b2xkX3Jvb3QuZGF0YSwgMCwgTkZTX0ZIU0laRSk7CisJCW1lbXNldCgmZGF0YS0+cm9vdCwgMCwgc2l6ZW9mKGRhdGEtPnJvb3QpKTsKKwkJZGF0YS0+cm9vdC5zaXplID0gZmhzaXplOworCQltZW1jcHkoJmRhdGEtPnJvb3QuZGF0YSwgbW50X3JlcGx5LmZoLmRhdGEsIGZoc2l6ZSk7CisJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9WRVIzOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVtb3VudF92Myhjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgY2xpZW50ICpjbG50KQoreworCXJldHVybiBtb3VudF9jYWxsKE1OVFBST0NfVU1OVCwgTkZTX01OVDNfVkVSU0lPTiwgcGF0aCwgY2xudCk7Cit9CisKK2ludCBuZnNfbW91bnQoY29uc3QgY2hhciAqcGF0aG5hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCSAgICAgIHVpbnQzMl90IHNlcnZlciwgY29uc3QgY2hhciAqcmVtX3BhdGgsIGNvbnN0IGNoYXIgKnBhdGgsCisJICAgICAgc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBjbGllbnQgKmNsbnQgPSBOVUxMOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWNoYXIgbW91bnRlZCA9IDA7CisJaW50IHNvY2sgPSAtMTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbW91bnRmbGFnczsKKworCWlmIChnZXRfcG9ydHMoc2VydmVyLCBkYXRhKSAhPSAwKSB7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlkdW1wX3BhcmFtcyhzZXJ2ZXIsIHJlbV9wYXRoLCBkYXRhKTsKKworCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApIHsKKwkJY2xudCA9IHRjcF9jbGllbnQoc2VydmVyLCBtb3VudF9wb3J0LCBDTElfUkVTVlBPUlQpOworCX0gZWxzZSB7CisJCWNsbnQgPSB1ZHBfY2xpZW50KHNlcnZlciwgbW91bnRfcG9ydCwgQ0xJX1JFU1ZQT1JUKTsKKwl9CisKKwlpZiAoY2xudCA9PSBOVUxMKSB7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgeworCQlyZXQgPSBtb3VudF92MyhyZW1fcGF0aCwgZGF0YSwgY2xudCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gbW91bnRfdjIocmVtX3BhdGgsIGRhdGEsIGNsbnQpOworCX0KKworCWlmIChyZXQgPT0gLTEpIHsKKwkJZ290byBiYWlsOworCX0KKwltb3VudGVkID0gMTsKKworCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApIHsKKwkJc29jayA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCX0gZWxzZSB7CisJCXNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCX0KKworCWlmIChzb2NrID09IC0xKSB7CisJCXBlcnJvcigic29ja2V0Iik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoYmluZHJlc3Zwb3J0KHNvY2ssIDApID09IC0xKSB7CisJCXBlcnJvcigiYmluZHJlc3Zwb3J0Iik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gc2VydmVyOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhuZnNfcG9ydCk7CisJbWVtY3B5KCZkYXRhLT5hZGRyLCAmYWRkciwgc2l6ZW9mKGRhdGEtPmFkZHIpKTsKKworCXN0cm5jcHkoZGF0YS0+aG9zdG5hbWUsIGhvc3RuYW1lLCBzaXplb2YoZGF0YS0+aG9zdG5hbWUpKTsKKworCWRhdGEtPmZkID0gc29jazsKKworCW1vdW50ZmxhZ3MgPSAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfS0xJQkNfUk9OTFkpID8gTVNfUkRPTkxZIDogMDsKKwlkYXRhLT5mbGFncyA9IGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOworCXJldCA9IG1vdW50KHBhdGhuYW1lLCBwYXRoLCAibmZzIiwgbW91bnRmbGFncywgZGF0YSk7CisKKwlpZiAocmV0ID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFTk9ERVYpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAibW91bnQ6IHRoZSBrZXJuZWwgbGFja3MgTkZTIHYlZCAiCisJCQkJInN1cHBvcnRcbiIsCisJCQkJKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpID8gMyA6IDIpOworCQl9IGVsc2UgeworCQkJcGVycm9yKCJtb3VudCIpOworCQl9CisJCWdvdG8gYmFpbDsKKwl9CisKKwlERUJVRygoIk1vdW50ZWQgJXMgb24gJXNcbiIsIHBhdGhuYW1lLCBwYXRoKSk7CisKKwlnb3RvIGRvbmU7CisKKyAgICAgIGJhaWw6CisJaWYgKG1vdW50ZWQpIHsKKwkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKwkJCXVtb3VudF92MyhwYXRoLCBjbG50KTsKKwkJfSBlbHNlIHsKKwkJCXVtb3VudF92MihwYXRoLCBjbG50KTsKKwkJfQorCX0KKworCXJldCA9IC0xOworCisgICAgICBkb25lOgorCWlmIChjbG50KSB7CisJCWNsaWVudF9mcmVlKGNsbnQpOworCX0KKworCWlmIChzb2NrICE9IC0xKSB7CisJCWNsb3NlKHNvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvbmZzbW91bnQvbmZzbW91bnQuaCBiL3Vzci9raW5pdC9uZnNtb3VudC9uZnNtb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTdjMTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvbmZzbW91bnQuaApAQCAtMCwwICsxLDM1IEBACisjaWZuZGVmIE5GU01PVU5UX05GU01PVU5UX0gKKyNkZWZpbmUgTkZTTU9VTlRfTkZTTU9VTlRfSAorCisjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CisKK2V4dGVybiBpbnQgbmZzX3BvcnQ7CisKK2V4dGVybiBpbnQgbmZzbW91bnRfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK2ludCBuZnNfbW91bnQoY29uc3QgY2hhciAqcmVtX25hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCSAgICAgIHVpbnQzMl90IHNlcnZlciwgY29uc3QgY2hhciAqcmVtX3BhdGgsCisJICAgICAgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhKTsKKworZW51bSBuZnNfcHJvdG8geworCXYyID0gMiwKKwl2MywKK307CisKKy8qIG1hc2tlZCB3aXRoIE5GU19NT1VOVF9GTEFHTUFTSyBiZWZvcmUgbW91bnQoKSBjYWxsICovCisjZGVmaW5lIE5GU19NT1VOVF9LTElCQ19ST05MWQkweDAwMDEwMDAwVQorLyoKKyAqIE5vdGUgZm9yIGdjYyAzLjIuMjoKKyAqCisgKiBJZiB5b3UncmUgdHVybmluZyBvbiBkZWJ1Z2dpbmcsIG1ha2Ugc3VyZSB5b3UgZ2V0IHJpZCBvZiAtT3MgZnJvbQorICogdGhlIGdjYyBjb21tYW5kIGxpbmUsIG9yIGVsc2UgaXBjb25maWcgd2lsbCBmYWlsIHRvIGxpbmsuCisgKi8KKyNkZWZpbmUgTkZTX0RFQlVHCisKKyN1bmRlZiBERUJVRworI2lmZGVmIE5GU19ERUJVRworI2RlZmluZSBERUJVRyh4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgREVCVUcoeCkgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2VuZGlmIC8qIE5GU01PVU5UX05GU01PVU5UX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9uZnNtb3VudC9wb3J0bWFwLmMgYi91c3Iva2luaXQvbmZzbW91bnQvcG9ydG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTExZDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvcG9ydG1hcC5jCkBAIC0wLDAgKzEsNzMgQEAKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBfX2NvbnN0YW50X2h0b24qICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm5mc21vdW50LmgiCisjaW5jbHVkZSAic3VucnBjLmgiCisKK3N0cnVjdCBwb3J0bWFwX2NhbGwgeworCXN0cnVjdCBycGNfY2FsbCBycGM7CisJdWludDMyX3QgcHJvZ3JhbTsKKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQzMl90IHByb3RvOworCXVpbnQzMl90IHBvcnQ7Cit9OworCitzdHJ1Y3QgcG9ydG1hcF9yZXBseSB7CisJc3RydWN0IHJwY19yZXBseSBycGM7CisJdWludDMyX3QgcG9ydDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG9ydG1hcF9jYWxsIGNhbGwgPSB7CisJLnJwYyA9IHsKKwkJLnByb2dyYW0JPSBfX2NvbnN0YW50X2h0b25sKFJQQ19QTUFQX1BST0dSQU0pLAorCQkucHJvZ192ZXJzCT0gX19jb25zdGFudF9odG9ubChSUENfUE1BUF9WRVJTSU9OKSwKKwkJLnByb2MJCT0gX19jb25zdGFudF9odG9ubChQTUFQX1BST0NfR0VUUE9SVCksCisJfQorfTsKKwordWludDMyX3QgcG9ydG1hcCh1aW50MzJfdCBzZXJ2ZXIsIHVpbnQzMl90IHByb2dyYW0sIHVpbnQzMl90IHZlcnNpb24sIHVpbnQzMl90IHByb3RvKQoreworCXN0cnVjdCBwb3J0bWFwX3JlcGx5IHJlcGx5OworCXN0cnVjdCBjbGllbnQgKmNsbnQ7CisJc3RydWN0IHJwYyBycGM7CisJdWludDMyX3QgcG9ydCA9IDA7CisKKwlpZiAoKGNsbnQgPSB0Y3BfY2xpZW50KHNlcnZlciwgUlBDX1BNQVBfUE9SVCwgMCkpID09IE5VTEwpIHsKKwkJaWYgKChjbG50ID0gdWRwX2NsaWVudChzZXJ2ZXIsIFJQQ19QTUFQX1BPUlQsIDApKSA9PSBOVUxMKSB7CisJCQlnb3RvIGJhaWw7CisJCX0KKwl9CisKKwljYWxsLnByb2dyYW0gPSBodG9ubChwcm9ncmFtKTsKKwljYWxsLnZlcnNpb24gPSBodG9ubCh2ZXJzaW9uKTsKKwljYWxsLnByb3RvID0gaHRvbmwocHJvdG8pOworCisJcnBjLmNhbGwgPSAoc3RydWN0IHJwY19jYWxsICopJmNhbGw7CisJcnBjLmNhbGxfbGVuID0gc2l6ZW9mKGNhbGwpOworCXJwYy5yZXBseSA9IChzdHJ1Y3QgcnBjX3JlcGx5ICopJnJlcGx5OworCXJwYy5yZXBseV9sZW4gPSBzaXplb2YocmVwbHkpOworCisJaWYgKHJwY19jYWxsKGNsbnQsICZycGMpIDwgMCkKKwkJZ290byBiYWlsOworCisJaWYgKHJwYy5yZXBseV9sZW4gPCBzaXplb2YocmVwbHkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW5jb21wbGV0ZSByZXBseTogJXp1IDwgJXp1XG4iLAorCQkJcnBjLnJlcGx5X2xlbiwgc2l6ZW9mKHJlcGx5KSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlwb3J0ID0gbnRvaGwocmVwbHkucG9ydCk7CisKK2JhaWw6CisJREVCVUcoKCJQb3J0IGZvciAlZC8lZFslc106ICVkXG4iLCBwcm9ncmFtLCB2ZXJzaW9uLAorCSAgICAgICBwcm90byA9PSBJUFBST1RPX1RDUCA/ICJ0Y3AiIDogInVkcCIsIHBvcnQpKTsKKworCWlmIChjbG50KSB7CisJCWNsaWVudF9mcmVlKGNsbnQpOworCX0KKworCXJldHVybiBwb3J0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc21vdW50L3N1bnJwYy5jIGIvdXNyL2tpbml0L25mc21vdW50L3N1bnJwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNWQ0MTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvc3VucnBjLmMKQEAgLTAsMCArMSwyNTMgQEAKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJuZnNtb3VudC5oIgorI2luY2x1ZGUgInN1bnJwYy5oIgorCisvKgorICogVGhlIG1hZ2ljIG9mZnNldCBpcyBuZWVkZWQgaGVyZSBiZWNhdXNlIFJQQyBvdmVyIFRDUCBpbmNsdWRlcyBhCisgKiBmaWVsZCB0aGF0IFJQQyBvdmVyIFVEUCBkb2Vzbid0LiAgTHV2dmVybHkuCisgKi8KK3N0YXRpYyBpbnQgcnBjX2RvX3JlcGx5KHN0cnVjdCBjbGllbnQgKmNsbnQsIHN0cnVjdCBycGMgKnJwYywgc2l6ZV90IG9mZikKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSByZWFkKGNsbnQtPnNvY2ssCisJCQkoKGNoYXIgKilycGMtPnJlcGx5KSArIG9mZiwKKwkJCXJwYy0+cmVwbHlfbGVuIC0gb2ZmKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJyZWFkIik7CisJCWdvdG8gYmFpbDsKKwl9IGVsc2UgaWYgKHJldCA8IHNpemVvZihzdHJ1Y3QgcnBjX3JlcGx5KSAtIG9mZikgeworCQlmcHJpbnRmKHN0ZGVyciwgInNob3J0IHJlYWQ6ICVkIDwgJXp1XG4iLCByZXQsCisJCQlzaXplb2Yoc3RydWN0IHJwY19yZXBseSkgLSBvZmYpOworCQlnb3RvIGJhaWw7CisJfQorCXJwYy0+cmVwbHlfbGVuID0gcmV0ICsgb2ZmOworCisJaWYgKCghb2ZmICYmICEobnRvaGwocnBjLT5yZXBseS0+aGRyLmZyYWdfaGRyKSAmIExBU1RfRlJBRykpIHx8CisJICAgIHJwYy0+cmVwbHktPmhkci51ZHAueGlkICE9IHJwYy0+Y2FsbC0+aGRyLnVkcC54aWQgfHwKKwkgICAgcnBjLT5yZXBseS0+aGRyLnVkcC5tc2dfdHlwZSAhPSBodG9ubChSUENfUkVQTFkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiYmFkIHJlcGx5XG4iKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmIChudG9obChycGMtPnJlcGx5LT5zdGF0ZSkgIT0gUkVQTFlfT0spIHsKKwkJZnByaW50ZihzdGRlcnIsICJycGMgZmFpbGVkOiAlZFxuIiwgbnRvaGwocnBjLT5yZXBseS0+c3RhdGUpKTsKKwkJZ290byBiYWlsOworCX0KKworCXJldCA9IDA7CisJZ290byBkb25lOworCitiYWlsOgorCXJldCA9IC0xOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBycGNfaGVhZGVyKHN0cnVjdCBjbGllbnQgKmNsbnQsIHN0cnVjdCBycGMgKnJwYykKK3sKKwkodm9pZCljbG50OworCisJcnBjLT5jYWxsLT5oZHIuZnJhZ19oZHIgPSBodG9ubChMQVNUX0ZSQUcgfCBycGMtPmNhbGxfbGVuKTsKKwlycGMtPmNhbGwtPmhkci51ZHAueGlkID0gbHJhbmQ0OCgpOworCXJwYy0+Y2FsbC0+aGRyLnVkcC5tc2dfdHlwZSA9IGh0b25sKFJQQ19DQUxMKTsKKwlycGMtPmNhbGwtPnJwY192ZXJzID0gaHRvbmwoMik7Cit9CisKK3N0YXRpYyBpbnQgcnBjX2NhbGxfdGNwKHN0cnVjdCBjbGllbnQgKmNsbnQsIHN0cnVjdCBycGMgKnJwYykKK3sKKwlpbnQgcmV0OworCisJcnBjX2hlYWRlcihjbG50LCBycGMpOworCisJaWYgKChyZXQgPSB3cml0ZShjbG50LT5zb2NrLCBycGMtPmNhbGwsIHJwYy0+Y2FsbF9sZW4pKSA9PSAtMSkgeworCQlwZXJyb3IoIndyaXRlIik7CisJCWdvdG8gYmFpbDsKKwl9IGVsc2UgaWYgKHJldCA8IHJwYy0+Y2FsbF9sZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJzaG9ydCB3cml0ZTogJWQgPCAlenVcbiIsIHJldCwgcnBjLT5jYWxsX2xlbik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlyZXQgPSBycGNfZG9fcmVwbHkoY2xudCwgcnBjLCAwKTsKKwlnb3RvIGRvbmU7CisKKyAgICAgIGJhaWw6CisJcmV0ID0gLTE7CisKKyAgICAgIGRvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBycGNfY2FsbF91ZHAoc3RydWN0IGNsaWVudCAqY2xudCwgc3RydWN0IHJwYyAqcnBjKQoreworI2RlZmluZSBOUl9GRFMgMQorI2RlZmluZSBUSU1FT1VUX01TIDMwMDAKKyNkZWZpbmUgTUFYX1RSSUVTIDEwMAorI2RlZmluZSBVRFBfSERSX09GRiAoc2l6ZW9mKHN0cnVjdCBycGNfaGVhZGVyKSAtIHNpemVvZihzdHJ1Y3QgcnBjX3VkcF9oZWFkZXIpKQorCXN0cnVjdCBwb2xsZmQgZmRzW05SX0ZEU107CisJaW50IHJldCA9IC0xOworCWludCBpOworCisJcnBjX2hlYWRlcihjbG50LCBycGMpOworCisJZmRzWzBdLmZkID0gY2xudC0+c29jazsKKwlmZHNbMF0uZXZlbnRzID0gUE9MTFJETk9STTsKKworCXJwYy0+Y2FsbF9sZW4gLT0gVURQX0hEUl9PRkY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1RSSUVTOyBpKyspIHsKKwkJaW50IHRpbWVvdXRfbXMgPSBUSU1FT1VUX01TICsgKGxyYW5kNDgoKSAlIChUSU1FT1VUX01TIC8gMikpOworCQlpZiAoKHJldCA9IHdyaXRlKGNsbnQtPnNvY2ssCisJCQkJICgoY2hhciAqKXJwYy0+Y2FsbCkgKyBVRFBfSERSX09GRiwKKwkJCQkgcnBjLT5jYWxsX2xlbikpID09IC0xKSB7CisJCQlwZXJyb3IoIndyaXRlIik7CisJCQlnb3RvIGJhaWw7CisJCX0gZWxzZSBpZiAocmV0IDwgcnBjLT5jYWxsX2xlbikgeworCQkJZnByaW50ZihzdGRlcnIsICJzaG9ydCB3cml0ZTogJWQgPCAlenVcbiIsIHJldCwKKwkJCQlycGMtPmNhbGxfbGVuKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlmb3IgKDsgaSA8IE1BWF9UUklFUzsgaSsrKSB7CisJCQlpZiAoKHJldCA9IHBvbGwoZmRzLCBOUl9GRFMsIHRpbWVvdXRfbXMpKSA9PSAtMSkgeworCQkJCXBlcnJvcigicG9sbCIpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCURFQlVHKCgiVGltZW91dCAjJWRcbiIsIGkgKyAxKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKHJldCA9IHJwY19kb19yZXBseShjbG50LCBycGMsIFVEUF9IRFJfT0ZGKSkgPT0gMCkgeworCQkJCWdvdG8gZG9uZTsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUcoKCJGYWlsZWQgb24gdHJ5ICMlZCAtIHJldHJ5aW5nXG4iLAorCQkJCSAgICAgICBpICsgMSkpOworCQkJfQorCQl9CisJfQorCisgICAgICBiYWlsOgorCXJldCA9IC0xOworCisgICAgICBkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBjbGllbnQgKnRjcF9jbGllbnQodWludDMyX3Qgc2VydmVyLCB1aW50MTZfdCBwb3J0LCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgY2xpZW50ICpjbG50ID0gbWFsbG9jKHNpemVvZigqY2xudCkpOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCBzb2NrOworCisJaWYgKGNsbnQgPT0gTlVMTCkgeworCQlwZXJyb3IoIm1hbGxvYyIpOworCQlnb3RvIGJhaWw7CisJfQorCisJbWVtc2V0KGNsbnQsIDAsIHNpemVvZihjbG50KSk7CisKKwlpZiAoKHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJzb2NrZXQiKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmICgoZmxhZ3MgJiBDTElfUkVTVlBPUlQpICYmIGJpbmRyZXN2cG9ydChzb2NrLCAwKSA9PSAtMSkgeworCQlwZXJyb3IoImJpbmRyZXN2cG9ydCIpOworCQlnb3RvIGJhaWw7CisJfQorCisJY2xudC0+c29jayA9IHNvY2s7CisJY2xudC0+Y2FsbF9zdHViID0gcnBjX2NhbGxfdGNwOworCisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBzZXJ2ZXI7CisKKwlpZiAoY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPT0gLTEpIHsKKwkJcGVycm9yKCJjb25uZWN0Iik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlnb3RvIGRvbmU7CisgICAgICBiYWlsOgorCWlmIChjbG50KSB7CisJCWZyZWUoY2xudCk7CisJCWNsbnQgPSBOVUxMOworCX0KKyAgICAgIGRvbmU6CisJcmV0dXJuIGNsbnQ7Cit9CisKK3N0cnVjdCBjbGllbnQgKnVkcF9jbGllbnQodWludDMyX3Qgc2VydmVyLCB1aW50MTZfdCBwb3J0LCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgY2xpZW50ICpjbG50ID0gbWFsbG9jKHNpemVvZigqY2xudCkpOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCBzb2NrOworCisJaWYgKGNsbnQgPT0gTlVMTCkgeworCQlwZXJyb3IoIm1hbGxvYyIpOworCQlnb3RvIGJhaWw7CisJfQorCisJbWVtc2V0KGNsbnQsIDAsIHNpemVvZihjbG50KSk7CisKKwlpZiAoKHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApKSA9PSAtMSkgeworCQlwZXJyb3IoInNvY2tldCIpOworCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKChmbGFncyAmIENMSV9SRVNWUE9SVCkgJiYgYmluZHJlc3Zwb3J0KHNvY2ssIDApID09IC0xKSB7CisJCXBlcnJvcigiYmluZHJlc3Zwb3J0Iik7CisJCWdvdG8gYmFpbDsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gbWU7CisKKwkJbWUuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCW1lLnNpbl9wb3J0ID0gMDsKKwkJbWUuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCQlpZiAoMCAmJiBiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmbWUsIHNpemVvZihtZSkpID09IC0xKSB7CisJCQlwZXJyb3IoImJpbmQiKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCX0KKworCWNsbnQtPnNvY2sgPSBzb2NrOworCWNsbnQtPmNhbGxfc3R1YiA9IHJwY19jYWxsX3VkcDsKKworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gc2VydmVyOworCisJaWYgKGNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IC0xKSB7CisJCXBlcnJvcigiY29ubmVjdCIpOworCQlnb3RvIGJhaWw7CisJfQorCisJZ290byBkb25lOworICAgICAgYmFpbDoKKwlpZiAoY2xudCkgeworCQlmcmVlKGNsbnQpOworCQljbG50ID0gTlVMTDsKKwl9CisgICAgICBkb25lOgorCXJldHVybiBjbG50OworfQorCit2b2lkIGNsaWVudF9mcmVlKHN0cnVjdCBjbGllbnQgKmMpCit7CisJaWYgKGMtPnNvY2sgIT0gLTEpCisJCWNsb3NlKGMtPnNvY2spOworCWZyZWUoYyk7Cit9CisKK2ludCBycGNfY2FsbChzdHJ1Y3QgY2xpZW50ICpjbGllbnQsIHN0cnVjdCBycGMgKnJwYykKK3sKKwlyZXR1cm4gY2xpZW50LT5jYWxsX3N0dWIoY2xpZW50LCBycGMpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc21vdW50L3N1bnJwYy5oIGIvdXNyL2tpbml0L25mc21vdW50L3N1bnJwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZDZjMTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvbmZzbW91bnQvc3VucnBjLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIG9wZW4tY29kZWQgU3VuUlBDIHN0cnVjdHVyZXMKKyAqLworI2lmbmRlZiBORlNNT1VOVF9TVU5SUENfSAorI2RlZmluZSBORlNNT1VOVF9TVU5SUENfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2RlZmluZSBTVU5SUENfUE9SVAkxMTEKKyNkZWZpbmUgTU9VTlRfUE9SVAk2MjcKKworI2RlZmluZSBSUENfQ0FMTAkwCisjZGVmaW5lIFJQQ19SRVBMWQkxCisKKyNkZWZpbmUgUE9SVE1BUF9QUk9HUkFNCTEwMDAwMAorI2RlZmluZSBOTE1fUFJPR1JBTQkxMDAwMjEKKworI2RlZmluZSBSUENfUE1BUF9QUk9HUkFNCTEwMDAwMAorI2RlZmluZSBSUENfUE1BUF9WRVJTSU9OCTIKKyNkZWZpbmUgUlBDX1BNQVBfUE9SVAkJMTExCisKKyNkZWZpbmUgUE1BUF9QUk9DX05VTEwJCTAKKyNkZWZpbmUgUE1BUF9QUk9DX1NFVAkJMQorI2RlZmluZSBQTUFQX1BST0NfVU5TRVQJCTIKKyNkZWZpbmUgUE1BUF9QUk9DX0dFVFBPUlQJMworI2RlZmluZSBQTUFQX1BST0NfRFVNUAkJNAorCisjZGVmaW5lIExBU1RfRlJBRwkweDgwMDAwMDAwCisKKyNkZWZpbmUgUkVQTFlfT0sJMAorI2RlZmluZSBSRVBMWV9ERU5JRUQgICAgMQorCisjZGVmaW5lIFNVQ0NFU1MJCTAKKyNkZWZpbmUgUFJPR19VTkFWQUlMCTEKKyNkZWZpbmUgUFJPR19NSVNNQVRDSAkyCisjZGVmaW5lIFBST0NfVU5BVkFJTAkzCisjZGVmaW5lIEdBUkJBR0VfQVJHUwk0CisjZGVmaW5lIFNZU1RFTV9FUlIJNQorCitzdHJ1Y3QgcnBjX3VkcF9oZWFkZXIgeworCXVpbnQzMl90IHhpZDsKKwl1aW50MzJfdCBtc2dfdHlwZTsKK307CisKK3N0cnVjdCBycGNfaGVhZGVyIHsKKwl1aW50MzJfdCBmcmFnX2hkcjsKKwlzdHJ1Y3QgcnBjX3VkcF9oZWFkZXIgdWRwOworfTsKKworc3RydWN0IHJwY19jYWxsIHsKKwlzdHJ1Y3QgcnBjX2hlYWRlciBoZHI7CisJdWludDMyX3QgcnBjX3ZlcnM7CisKKwl1aW50MzJfdCBwcm9ncmFtOworCXVpbnQzMl90IHByb2dfdmVyczsKKwl1aW50MzJfdCBwcm9jOworCXVpbnQzMl90IGNyZWRfZmxhdm9yOworCisJdWludDMyX3QgY3JlZF9sZW47CisJdWludDMyX3QgdnJmX2ZsYXZvcjsKKwl1aW50MzJfdCB2cmZfbGVuOworfTsKKworc3RydWN0IHJwY19yZXBseSB7CisJc3RydWN0IHJwY19oZWFkZXIgaGRyOworCXVpbnQzMl90IHJlcGx5X3N0YXRlOworCXVpbnQzMl90IHZyZl9mbGF2b3I7CisJdWludDMyX3QgdnJmX2xlbjsKKwl1aW50MzJfdCBzdGF0ZTsKK307CisKK3N0cnVjdCBycGMgeworCXN0cnVjdCBycGNfY2FsbCAqY2FsbDsKKwlzaXplX3QgY2FsbF9sZW47CisJc3RydWN0IHJwY19yZXBseSAqcmVwbHk7CisJc2l6ZV90IHJlcGx5X2xlbjsKK307CisKK3N0cnVjdCBjbGllbnQ7CisKK3R5cGVkZWYgaW50ICgqY2FsbF9zdHViKSAoc3RydWN0IGNsaWVudCAqLCBzdHJ1Y3QgcnBjICopOworCitzdHJ1Y3QgY2xpZW50IHsKKwlpbnQgc29jazsKKwljYWxsX3N0dWIgY2FsbF9zdHViOworfTsKKworI2RlZmluZSBDTElfUkVTVlBPUlQJMDAwMDAwMDEKKworc3RydWN0IGNsaWVudCAqdGNwX2NsaWVudCh1aW50MzJfdCBzZXJ2ZXIsIHVpbnQxNl90IHBvcnQsIHVpbnQzMl90IGZsYWdzKTsKK3N0cnVjdCBjbGllbnQgKnVkcF9jbGllbnQodWludDMyX3Qgc2VydmVyLCB1aW50MTZfdCBwb3J0LCB1aW50MzJfdCBmbGFncyk7Cit2b2lkIGNsaWVudF9mcmVlKHN0cnVjdCBjbGllbnQgKmNsaWVudCk7CisKK2ludCBycGNfY2FsbChzdHJ1Y3QgY2xpZW50ICpjbGllbnQsIHN0cnVjdCBycGMgKnJwYyk7CisKK3VpbnQzMl90IHBvcnRtYXAodWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCBwcm9ncmFtLCB1aW50MzJfdCB2ZXJzaW9uLCB1aW50MzJfdCBwcm90byk7CisKKyNlbmRpZiAvKiBORlNNT1VOVF9TVU5SUENfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L25mc3Jvb3QuYyBiL3Vzci9raW5pdC9uZnNyb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzMGZkNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9uZnNyb290LmMKQEAgLTAsMCArMSwxMTMgQEAKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJpcGNvbmZpZy5oIgorI2luY2x1ZGUgImtpbml0LmgiCisjaW5jbHVkZSAibmV0ZGV2LmgiCisjaW5jbHVkZSAibmZzbW91bnQuaCIKKworc3RhdGljIGNoYXIgKnN1Yl9jbGllbnQoX191MzIgY2xpZW50LCBjaGFyICpwYXRoLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpbl9hZGRyIGFkZHIgPSB7IGNsaWVudCB9OworCWNoYXIgYnVmW2xlbl07CisKKwlpZiAoc3Ryc3RyKHBhdGgsICIlcyIpICE9IE5VTEwpIHsKKwkJaWYgKGNsaWVudCA9PSBJTkFERFJfTk9ORSkgeworCQkJZnByaW50ZihzdGRlcnIsICJSb290LU5GUzogbm8gY2xpZW50IGFkZHJlc3NcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCXNucHJpbnRmKGJ1ZiwgbGVuLCBwYXRoLCBpbmV0X250b2EoYWRkcikpOworCQlzdHJjcHkocGF0aCwgYnVmKTsKKwl9CisKKwlyZXR1cm4gcGF0aDsKK30KKworI2RlZmluZSBORlNfQVJHQyA2CisjZGVmaW5lIE1PVU5UX1BPSU5UICIvcm9vdCIKKworaW50IG1vdW50X25mc19yb290KGludCBhcmdjLCBjaGFyICphcmd2W10sIGludCBmbGFncykKK3sKKwkodm9pZClmbGFnczsJCS8qIEZJWE1FIC0gZG9uJ3QgaWdub3JlIHRoaXMgKi8KKworCXN0cnVjdCBpbl9hZGRyIGFkZHIgPSB7IElOQUREUl9OT05FIH07CisJX191MzIgY2xpZW50ID0gSU5BRERSX05PTkU7CisJY29uc3QgaW50IGxlbiA9IDEwMjQ7CisJc3RydWN0IG5ldGRldiAqZGV2OworCWNoYXIgKm10cHQgPSBNT1VOVF9QT0lOVDsKKwljaGFyICpwYXRoID0gTlVMTDsKKwljaGFyICpkZXZfYm9vdHBhdGggPSBOVUxMOworCWNoYXIgcm9vdFtsZW5dOworCWNoYXIgKngsICpvcHRzOworCWludCByZXQgPSAwOworCWludCBhID0gMTsKKwljaGFyICpuZnNfYXJndltORlNfQVJHQyArIDFdID0geyAiTkZTLU1vdW50IiB9OworCisJZm9yIChkZXYgPSBpZmFjZXM7IGRldjsgZGV2ID0gZGV2LT5uZXh0KSB7CisJCWlmIChkZXYtPmlwX3NlcnZlciAhPSBJTkFERFJfTk9ORSAmJgorCQkgICAgZGV2LT5pcF9zZXJ2ZXIgIT0gSU5BRERSX0FOWSkgeworCQkJYWRkci5zX2FkZHIgPSBkZXYtPmlwX3NlcnZlcjsKKwkJCWNsaWVudCA9IGRldi0+aXBfYWRkcjsKKwkJCWRldl9ib290cGF0aCA9IGRldi0+Ym9vdHBhdGg7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZGV2LT5pcF9hZGRyICE9IElOQUREUl9OT05FICYmIGRldi0+aXBfYWRkciAhPSBJTkFERFJfQU5ZKSB7CisJCQljbGllbnQgPSBkZXYtPmlwX2FkZHI7CisJCX0KKwl9CisKKwkvKgorCSAqIGlmIHRoZSAibmZzcm9vdCIgb3B0aW9uIGlzIHNldCB0aGVuIGl0IG92ZXJyaWRlcworCSAqIGJvb3RwYXRoIHN1cHBsaWVkIGJ5IHRoZSBib290IHNlcnZlci4KKwkgKi8KKwlpZiAoKHBhdGggPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJuZnNyb290PSIpKSA9PSBOVUxMKSB7CisJCWlmICgocGF0aCA9IGRldl9ib290cGF0aCkgPT0gTlVMTCB8fCBwYXRoWzBdID09ICdcMCcpCisJCQkvKiBubyBwYXRoIC0gc2V0IGEgZGVmYXVsdCAqLworCQkJcGF0aCA9IChjaGFyICopIi90ZnRwYm9vdC8lcyI7CisJfSBlbHNlIGlmIChkZXZfYm9vdHBhdGggJiYgZGV2X2Jvb3RwYXRoWzBdICE9ICdcMCcpCisJCWZwcmludGYoc3RkZXJyLAorCQkJIm5mc3Jvb3Q9JXMgb3ZlcnJpZGVzIGJvb3Qgc2VydmVyIGJvb3RwYXRoICVzXG4iLAorCQkJcGF0aCwgZGV2X2Jvb3RwYXRoKTsKKworCWlmICgob3B0cyA9IHN0cmNocihwYXRoLCAnLCcpKSAhPSBOVUxMKSB7CisJCSpvcHRzKysgPSAnXDAnOworCQluZnNfYXJndlthKytdID0gKGNoYXIgKikiLW8iOworCQluZnNfYXJndlthKytdID0gb3B0czsKKwl9CisKKwlpZiAoKHggPSBzdHJjaHIocGF0aCwgJzonKSkgPT0gTlVMTCkgeworCQlpZiAoYWRkci5zX2FkZHIgPT0gSU5BRERSX05PTkUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiUm9vdC1ORlM6IG5vIHNlcnZlciBkZWZpbmVkXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlzbnByaW50Zihyb290LCBsZW4sICIlczolcyIsIGluZXRfbnRvYShhZGRyKSwgcGF0aCk7CisJfSBlbHNlIHsKKwkJc3RyY3B5KHJvb3QsIHBhdGgpOworCX0KKworCW5mc19hcmd2W2ErK10gPSBzdWJfY2xpZW50KGNsaWVudCwgcm9vdCwgbGVuKTsKKworCURFQlVHKCgiTkZTLVJvb3Q6IG1vdW50aW5nICVzIG9uICVzIHdpdGggb3B0aW9ucyBcIiVzXCJcbiIsCisJICAgICAgIG5mc19hcmd2W2EtMV0sIG10cHQsIG9wdHMgPyBvcHRzIDogIiIpKTsKKworCW5mc19hcmd2W2ErK10gPSBtdHB0OworCW5mc19hcmd2W2FdID0gTlVMTDsKKwlhc3NlcnQoYSA8PSBORlNfQVJHQyk7CisKKwlkdW1wX2FyZ3MoYSwgbmZzX2FyZ3YpOworCisJaWYgKChyZXQgPSBuZnNtb3VudF9tYWluKGEsIG5mc19hcmd2KSkgIT0gMCkgeworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworICAgICAgZG9uZToKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L3JhbWRpc2tfbG9hZC5jIGIvdXNyL2tpbml0L3JhbWRpc2tfbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMmUwYjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcmFtZGlza19sb2FkLmMKQEAgLTAsMCArMSwyNzEgQEAKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8bGludXgvZmQuaD4KKworI2luY2x1ZGUgImtpbml0LmgiCisjaW5jbHVkZSAiZG9fbW91bnRzLmgiCisjaW5jbHVkZSAiZnN0eXBlLmgiCisjaW5jbHVkZSAiemxpYi5oIgorCisjZGVmaW5lIEJVRl9TWgkJNjU1MzYKKworc3RhdGljIHZvaWQgd2FpdF9mb3Jfa2V5KHZvaWQpCit7CisJLyogV2FpdCB1bnRpbCB0aGUgdXNlciBwcmVzc2VzIEVudGVyICovCisJd2hpbGUgKGdldGNoYXIoKSAhPSAnXG4nKQorCQk7Cit9CisKK3N0YXRpYyBpbnQgY2hhbmdlX2Rpc2soY29uc3QgY2hhciAqZGV2cGF0aCwgaW50IHJmZCwgaW50IGRpc2spCit7CisJLyogVHJ5IHRvIGVqZWN0IGFuZC9vciBxdWllc2NlIHRoZSBkZXZpY2UgKi8KKwlzeW5jKCk7CisJaWYgKGlvY3RsKHJmZCwgRkRFSkVDVCwgMCkpIHsKKwkJaWYgKGVycm5vID09IEVOT1RUWSkgeworCQkJLyogTm90IGEgZmxvcHB5ICovCisJCQlpb2N0bChyZmQsIENEUk9NRUpFQ1QsIDApOworCQl9IGVsc2UgeworCQkJLyogTm9uLWVqZWN0YWJsZSBmbG9wcHkgKi8KKwkJCWlvY3RsKHJmZCwgRkRSRVNFVCwgRkRfUkVTRVRfSUZfTkVFREVEKTsKKwkJfQorCX0KKwljbG9zZShyZmQpOworCisJZnByaW50ZihzdGRlcnIsCisJCSJcblBsZWFzZSBpbnNlcnQgZGlzayAlZCBmb3IgcmFtZGlzayBhbmQgcHJlc3MgRW50ZXIuLi4iLCBkaXNrKTsKKwl3YWl0X2Zvcl9rZXkoKTsKKworCXJldHVybiBvcGVuKGRldnBhdGgsIE9fUkRPTkxZKTsKK30KKworLyogQWxzbyB1c2VkIGluIGluaXRyZC5jICovCitpbnQgbG9hZF9yYW1kaXNrX2NvbXByZXNzZWQoY29uc3QgY2hhciAqZGV2cGF0aCwgRklMRSAqIHdmZCwKKwkJCSAgICBvZmZfdCByYW1kaXNrX3N0YXJ0KQoreworCWludCByZmQgPSAtMTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmFtZGlza19zaXplLCByYW1kaXNrX2xlZnQ7CisJaW50IGRpc2sgPSAxOworCXNzaXplX3QgYnl0ZXM7CisJaW50IHJ2OworCXVuc2lnbmVkIGNoYXIgaW5fYnVmW0JVRl9TWl0sIG91dF9idWZbQlVGX1NaXTsKKwl6X3N0cmVhbSB6czsKKworCXpzLnphbGxvYyA9IFpfTlVMTDsJLyogVXNlIG1hbGxvYygpICovCisJenMuemZyZWUgPSBaX05VTEw7CS8qIFVzZSBmcmVlKCkgKi8KKwl6cy5uZXh0X2luID0gWl9OVUxMOwkvKiBObyBkYXRhIHJlYWQgeWV0ICovCisJenMuYXZhaWxfaW4gPSAwOworCXpzLm5leHRfb3V0ID0gb3V0X2J1ZjsKKwl6cy5hdmFpbF9vdXQgPSBCVUZfU1o7CisKKwlpZiAoaW5mbGF0ZUluaXQyKCZ6cywgMzIgKyAxNSkgIT0gWl9PSykKKwkJZ290byBlcnIxOworCisJcmZkID0gb3BlbihkZXZwYXRoLCBPX1JET05MWSk7CisJaWYgKHJmZCA8IDApCisJCWdvdG8gZXJyMjsKKworCS8qIFNldCB0byB0aGUgc2l6ZSBvZiB0aGUgbWVkaXVtLCBvciAiaW5maW5pdGUiICovCisJaWYgKGlvY3RsKHJmZCwgQkxLR0VUU0laRTY0LCAmcmFtZGlza19zaXplKSkKKwkJcmFtZGlza19zaXplID0gfjBVTEw7CisKKwlkbyB7CisJCS8qIFB1cmdlIHRoZSBvdXRwdXQgcHJlZmVyZW50aWFsbHkgb3ZlciByZWFkaW5nIG5ldworCQkgICBpbnB1dCwgc28gd2UgZG9uJ3QgZW5kIHVwIG92ZXJydW5uaW5nIHRoZSBpbnB1dCBieQorCQkgICBhY2NpZGVudCBhbmQgZGVtYW5kaW5nIGEgbmV3IGRpc2sgd2hpY2ggZG9lc24ndAorCQkgICBleGlzdC4uLiAqLworCQlpZiAoenMuYXZhaWxfb3V0ID09IDApIHsKKwkJCV9md3JpdGUob3V0X2J1ZiwgQlVGX1NaLCB3ZmQpOworCQkJenMubmV4dF9vdXQgPSBvdXRfYnVmOworCQkJenMuYXZhaWxfb3V0ID0gQlVGX1NaOworCQl9IGVsc2UgaWYgKHpzLmF2YWlsX2luID09IDApIHsKKwkJCWlmIChyYW1kaXNrX3N0YXJ0ID49IHJhbWRpc2tfc2l6ZSkgeworCQkJCXJmZCA9IGNoYW5nZV9kaXNrKGRldnBhdGgsIHJmZCwgKytkaXNrKTsKKwkJCQlpZiAocmZkIDwgMCkKKwkJCQkJZ290byBlcnIyOworCisJCQkJaWYgKGlvY3RsKHJmZCwgQkxLR0VUU0laRTY0LCAmcmFtZGlza19zaXplKSkKKwkJCQkJcmFtZGlza19zaXplID0gfjBVTEw7CisJCQkJcmFtZGlza19zdGFydCA9IDA7CisJCQkJREVCVUcoKCJOZXcgc2l6ZSA9ICVsbHVcbiIsIHJhbWRpc2tfc2l6ZSkpOworCQkJfQorCQkJZG8geworCQkJCXJhbWRpc2tfbGVmdCA9IHJhbWRpc2tfc2l6ZSAtIHJhbWRpc2tfc3RhcnQ7CisJCQkJYnl0ZXMgPSBtaW4ocmFtZGlza19sZWZ0LAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylCVUZfU1opOworCQkJCWJ5dGVzID0gcHJlYWQocmZkLCBpbl9idWYsIGJ5dGVzLAorCQkJCQkgICAgICByYW1kaXNrX3N0YXJ0KTsKKwkJCX0gd2hpbGUgKGJ5dGVzID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKwkJCWlmIChieXRlcyA8PSAwKQorCQkJCWdvdG8gZXJyMjsKKwkJCXJhbWRpc2tfc3RhcnQgKz0gYnl0ZXM7CisJCQl6cy5uZXh0X2luID0gaW5fYnVmOworCQkJenMuYXZhaWxfaW4gPSBieXRlczsKKworCQkJLyogUHJpbnQgZG90cyBpZiB3ZSdyZSByZWFkaW5nIGZyb20gYSByZWFsIGJsb2NrIGRldmljZSAqLworCQkJaWYgKHJhbWRpc2tfc2l6ZSAhPSB+MFVMTCkKKwkJCQlwdXRjKCcuJywgc3RkZXJyKTsKKwkJfQorCQlydiA9IGluZmxhdGUoJnpzLCBaX1NZTkNfRkxVU0gpOworCX0gd2hpbGUgKHJ2ID09IFpfT0sgfHwgcnYgPT0gWl9CVUZfRVJST1IpOworCisJREVCVUcoKCJraW5pdDogaW5mbGF0ZSByZXR1cm5lZCAlZFxuIiwgcnYpKTsKKworCWlmIChydiAhPSBaX1NUUkVBTV9FTkQpCisJCWdvdG8gZXJyMjsKKworCS8qIFdyaXRlIHRoZSBsYXN0ICovCisJX2Z3cml0ZShvdXRfYnVmLCBCVUZfU1ogLSB6cy5hdmFpbF9vdXQsIHdmZCk7CisJREVCVUcoKCJraW5pdDogd3JpdGluZyAlZCBieXRlc1xuIiwgQlVGX1NaIC0genMuYXZhaWxfb3V0KSk7CisKKwlpbmZsYXRlRW5kKCZ6cyk7CisJcmV0dXJuIDA7CisKK2VycjI6CisJaW5mbGF0ZUVuZCgmenMpOworZXJyMToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2xvYWRfcmFtZGlza19yYXcoY29uc3QgY2hhciAqZGV2cGF0aCwgRklMRSAqIHdmZCwgb2ZmX3QgcmFtZGlza19zdGFydCwKKwkJIHVuc2lnbmVkIGxvbmcgbG9uZyBmc3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHJhbWRpc2tfc2l6ZSwgcmFtZGlza19sZWZ0OworCWludCBkaXNrID0gMTsKKwlzc2l6ZV90IGJ5dGVzOworCXVuc2lnbmVkIGNoYXIgYnVmW0JVRl9TWl07CisJaW50IHJmZDsKKworCXJmZCA9IG9wZW4oZGV2cGF0aCwgT19SRE9OTFkpOworCWlmIChyZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBTZXQgdG8gdGhlIHNpemUgb2YgdGhlIG1lZGl1bSwgb3IgImluZmluaXRlIiAqLworCWlmIChpb2N0bChyZmQsIEJMS0dFVFNJWkU2NCwgJnJhbWRpc2tfc2l6ZSkpCisJCXJhbWRpc2tfc2l6ZSA9IH4wVUxMOworCisJREVCVUcoKCJzdGFydDogJWxsdSAgc2l6ZTogJWxsdSAgZnNzaXplOiAlbGx1XG4iLAorCSAgICAgICByYW1kaXNrX3N0YXJ0LCByYW1kaXNrX3NpemUsIGZzc2l6ZSkpOworCisJd2hpbGUgKGZzc2l6ZSkgeworCisJCWlmIChyYW1kaXNrX3N0YXJ0ID49IHJhbWRpc2tfc2l6ZSkgeworCQkJcmZkID0gY2hhbmdlX2Rpc2soZGV2cGF0aCwgcmZkLCArK2Rpc2spOworCQkJaWYgKHJmZCA8IDApCisJCQkJcmV0dXJuIC0xOworCisJCQlpZiAoaW9jdGwocmZkLCBCTEtHRVRTSVpFNjQsICZyYW1kaXNrX3NpemUpKQorCQkJCXJhbWRpc2tfc2l6ZSA9IH4wVUxMOworCQkJcmFtZGlza19zdGFydCA9IDA7CisJCX0KKworCQlkbyB7CisJCQlyYW1kaXNrX2xlZnQgPQorCQkJICAgIG1pbihyYW1kaXNrX3NpemUgLSByYW1kaXNrX3N0YXJ0LCBmc3NpemUpOworCQkJYnl0ZXMgPSBtaW4ocmFtZGlza19sZWZ0LCAodW5zaWduZWQgbG9uZyBsb25nKUJVRl9TWik7CisJCQlieXRlcyA9IHByZWFkKHJmZCwgYnVmLCBieXRlcywgcmFtZGlza19zdGFydCk7CisJCX0gd2hpbGUgKGJ5dGVzID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKwkJaWYgKGJ5dGVzIDw9IDApCisJCQlicmVhazsKKwkJX2Z3cml0ZShidWYsIGJ5dGVzLCB3ZmQpOworCisJCXJhbWRpc2tfc3RhcnQgKz0gYnl0ZXM7CisJCWZzc2l6ZSAtPSBieXRlczsKKworCQkvKiBQcmludCBkb3RzIGlmIHdlJ3JlIHJlYWRpbmcgZnJvbSBhIHJlYWwgYmxvY2sgZGV2aWNlICovCisJCWlmIChyYW1kaXNrX3NpemUgIT0gfjBVTEwpCisJCQlwdXRjKCcuJywgc3RkZXJyKTsKKwl9CisKKwlyZXR1cm4gISFmc3NpemU7Cit9CisKK2ludCByYW1kaXNrX2xvYWQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgZGV2X3Qgcm9vdF9kZXYpCit7CisJY29uc3QgY2hhciAqYXJnX3Byb21wdF9yYW1kaXNrID0gZ2V0X2FyZyhhcmdjLCBhcmd2LCAicHJvbXB0X3JhbWRpc2s9Iik7CisJY29uc3QgY2hhciAqYXJnX3JhbWRpc2tfYmxvY2tzaXplID0KKwkgICAgZ2V0X2FyZyhhcmdjLCBhcmd2LCAicmFtZGlza19ibG9ja3NpemU9Iik7CisJY29uc3QgY2hhciAqYXJnX3JhbWRpc2tfc3RhcnQgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyYW1kaXNrX3N0YXJ0PSIpOworCWNvbnN0IGNoYXIgKmFyZ19yYW1kaXNrX2RldmljZSA9IGdldF9hcmcoYXJnYywgYXJndiwgInJhbWRpc2tfZGV2aWNlPSIpOworCisJaW50IHByb21wdF9yYW1kaXNrID0gYXJnX3Byb21wdF9yYW1kaXNrID8gYXRvaShhcmdfcHJvbXB0X3JhbWRpc2spIDogMDsKKwlpbnQgcmFtZGlza19ibG9ja3NpemUgPQorCSAgICBhcmdfcmFtZGlza19ibG9ja3NpemUgPyBhdG9pKGFyZ19yYW1kaXNrX2Jsb2Nrc2l6ZSkgOiA1MTI7CisJb2ZmX3QgcmFtZGlza19zdGFydCA9CisJICAgIGFyZ19yYW1kaXNrX3N0YXJ0CisJICAgID8gc3RydG91bWF4KGFyZ19yYW1kaXNrX3N0YXJ0LCBOVUxMLCAxMCkgKiByYW1kaXNrX2Jsb2Nrc2l6ZSA6IDA7CisJY29uc3QgY2hhciAqcmFtZGlza19kZXZpY2UgPQorCSAgICBhcmdfcmFtZGlza19kZXZpY2UgPyBhcmdfcmFtZGlza19kZXZpY2UgOiAiL2Rldi9mZDAiOworCisJZGV2X3QgcmFtZGlza19kZXY7CisJaW50IHJmZDsKKwlGSUxFICp3ZmQ7CisJY29uc3QgY2hhciAqZnN0eXBlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmc3NpemU7CisJaW50IGlzX2d6aXAgPSAwOworCWludCBlcnI7CisKKwlpZiAocHJvbXB0X3JhbWRpc2spIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiUGxlYXNlIGluc2VydCBkaXNrIGZvciByYW1kaXNrIGFuZCBwcmVzcyBFbnRlci4uLiIpOworCQl3YWl0X2Zvcl9rZXkoKTsKKwl9CisKKwlyYW1kaXNrX2RldiA9IG5hbWVfdG9fZGV2X3QocmFtZGlza19kZXZpY2UpOworCWlmICghcmFtZGlza19kZXYpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiRmFpbHVyZSBsb2FkaW5nIHJhbWRpc2s6IHVua25vd24gZGV2aWNlOiAlc1xuIiwKKwkJCXJhbWRpc2tfZGV2aWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY3JlYXRlX2RldigiL2Rldi9yZGRldiIsIHJhbWRpc2tfZGV2KTsKKwljcmVhdGVfZGV2KCIvZGV2L3JhbTAiLCBSb290X1JBTTApOworCXJmZCA9IG9wZW4oIi9kZXYvcmRkZXYiLCBPX1JET05MWSk7CisJd2ZkID0gZm9wZW4oIi9kZXYvcmFtMCIsICJ3Iik7CisKKwlpZiAocmZkIDwgMCB8fCAhd2ZkKSB7CisJCXBlcnJvcigiQ291bGQgbm90IG9wZW4gcmFtZGlzayBkZXZpY2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgZmlsZXN5c3RlbSB0eXBlICovCisJaWYgKGlkZW50aWZ5X2ZzKHJmZCwgJmZzdHlwZSwgJmZzc2l6ZSwgcmFtZGlza19zdGFydCkgfHwKKwkgICAgKGZzc2l6ZSA9PSAwICYmICEoaXNfZ3ppcCA9ICFzdHJjbXAoZnN0eXBlLCAiZ3ppcCIpKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiRmFpbHVyZSBsb2FkaW5nIHJhbWRpc2s6IHVua25vd24gZmlsZXN5c3RlbSB0eXBlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCVUcoKCJraW5pdDogcmFtZGlzayBpcyAlcywgc2l6ZSAlbGx1XG4iLCBmc3R5cGUsIGZzc2l6ZSkpOworCisJZnByaW50ZihzdGRlcnIsICJMb2FkaW5nIHJhbWRpc2sgKCVzKSAuLi4iLCBpc19nemlwID8gImd6aXAiIDogInJhdyIpOworCisJY2xvc2UocmZkKTsKKworCWlmIChpc19nemlwKQorCQllcnIgPSBsb2FkX3JhbWRpc2tfY29tcHJlc3NlZCgiL2Rldi9yZGRldiIsIHdmZCwgcmFtZGlza19zdGFydCk7CisJZWxzZQorCQllcnIgPSBsb2FkX3JhbWRpc2tfcmF3KCIvZGV2L3JkZGV2Iiwgd2ZkLAorCQkJCSAgICAgICByYW1kaXNrX3N0YXJ0LCBmc3NpemUpOworCisJZmNsb3NlKHdmZCk7CisKKwlwdXRjKCdcbicsIHN0ZGVycik7CisKKwlpZiAoZXJyKSB7CisJCXBlcnJvcigiRmFpbHVyZSBsb2FkaW5nIHJhbWRpc2siKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvcmVhZGZpbGUuYyBiL3Vzci9raW5pdC9yZWFkZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Zjg1NGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcmVhZGZpbGUuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogUmVhZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIGEgZmlsZSBpbnRvIG1hbGxvYydkIHN0b3JhZ2UuICBUaGlzCisgKiBpcyBtb3N0bHkgdXNlZnVsIGZvciB0aGluZ3MgbGlrZSAvcHJvYyBmaWxlcyB3aGVyZSB3ZSBjYW4ndCBqdXN0CisgKiBmc3RhdCgpIHRvIGdldCB0aGUgbGVuZ3RoIGFuZCB0aGVuIG1tYXAoKS4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZXJyb3IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCitzc2l6ZV90IGZyZWFkZmlsZShGSUxFICpmLCBjaGFyICoqcHApCit7CisJc2l6ZV90IGJzOwkJLyogRGVjZW50IHN0YXJ0aW5nIHBvaW50Li4uICovCisJc2l6ZV90IGJmOwkJLyogQnl0ZXMgZnJlZSAqLworCXNpemVfdCBidSA9IDA7CQkvKiBCeXRlcyB1c2VkICovCisJY2hhciAqYnVmZmVyLCAqbmI7CisJc2l6ZV90IHJ2OworCWludCBvbGRfZXJybm8gPSBlcnJubzsKKworCWJzID0gQlVGU0laOwkJLyogQSBndWVzcyBhcyBnb29kIGFzIGFueSAqLworCWJmID0gYnM7CisJYnVmZmVyID0gbWFsbG9jKGJzKTsKKworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKDs7KSB7CisJCWVycm5vID0gMDsKKworCQl3aGlsZSAoYmYgJiYgKHJ2ID0gX2ZyZWFkKGJ1ZmZlciArIGJ1LCBiZiwgZikpKSB7CisJCQlidSArPSBydjsKKwkJCWJmIC09IHJ2OworCQl9CisKKwkJaWYgKGVycm5vICYmIGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgeworCQkJLyogZXJyb3IgKi8KKwkJCWZyZWUoYnVmZmVyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChiZikgeworCQkJLyogSGl0IEVPRiwgbm8gZXJyb3IgKi8KKworCQkJLyogVHJ5IHRvIGZyZWUgc3VwZXJmbHVvdXMgbWVtb3J5ICovCisJCQlpZiAoKG5iID0gcmVhbGxvYyhidWZmZXIsIGJ1ICsgMSkpKQorCQkJCWJ1ZmZlciA9IG5iOworCisJCQkvKiBOdWxsLXRlcm1pbmF0ZSByZXN1bHQgZm9yIGdvb2QgbWVhc3VyZSAqLworCQkJYnVmZmVyW2J1XSA9ICdcMCc7CisKKwkJCSpwcCA9IGJ1ZmZlcjsKKwkJCWVycm5vID0gb2xkX2Vycm5vOworCQkJcmV0dXJuIGJ1OworCQl9CisKKwkJLyogRG91YmxlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKwkJYmYgKz0gYnM7CisJCWJzICs9IGJzOworCQlpZiAoIShuYiA9IHJlYWxsb2MoYnVmZmVyLCBicykpKSB7CisJCQkvKiBvdXQgb2YgbWVtb3J5IGVycm9yICovCisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnVmZmVyID0gbmI7CisJfQorfQorCitzc2l6ZV90IHJlYWRmaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICoqcHApCit7CisJRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCXNzaXplX3QgcnY7CisKKwlpZiAoIWYpCisJCXJldHVybiAtMTsKKworCXJ2ID0gZnJlYWRmaWxlKGYsIHBwKTsKKworCWZjbG9zZShmKTsKKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9yZXN1bWUvS2J1aWxkIGIvdXNyL2tpbml0L3Jlc3VtZS9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0MTk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9yZXN1bWUvS2J1aWxkCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIHJlc3VtZQorIworCitzdGF0aWMteSA6PSBzdGF0aWMvcmVzdW1lCitzaGFyZWQteSA6PSBzaGFyZWQvcmVzdW1lCisKKyMgY29tbW9uIC5vIGZpbGVzCitvYmpzIDo9IHJlc3VtZS5vIHJlc3VtZWxpYi5vCisKKyMgVE9ETyAtIGRvIHdlIHdhbnQgYSBzdHJpcHBlZCB2ZXJzaW9uCisjIFRPRE8gLSBkbyB3ZSB3YW50IHRoZSBzdGF0aWMuZyArIHNoYXJlZC5nIGRpcmVjdG9yaWVzPworCisjIENyZWF0ZSBsaWIuYSB3aXRoIGFsbCBvYmplY3QgZmlsZXMgKHVzZWQgYnkga2luaXQpCitsaWIteSA6PSAkKG9ianMpCisKKyMgQWRkaXRpb25hbCBpbmNsdWRlIHBhdGhzIGZpbGVzCitLTElCQ0NGTEFHUyArPSAtSSQoc3JjdHJlZSkvJChzcmMpLy4uCisKKyMgLm8gZmlsZXMgdXNlZCB0byBidWlsdCBleGVjdXRhYmxlcworc3RhdGljL3Jlc3VtZS15ICAgOj0gJChvYmpzKQorc3RhdGljL3Jlc3VtZS1saWIgOj0gLi4vbGliLmEKK3NoYXJlZC9yZXN1bWUteSAgIDo9ICQob2JqcykKK3NoYXJlZC9yZXN1bWUtbGliIDo9IC4uL2xpYi5hCisKKyMgQ2xlYW5pbmcKK2NsZWFuLWRpcnMgOj0gc3RhdGljIHNoYXJlZAorCisjIGluc3RhbGwgYmluYXJ5CitpbnN0YWxsLXkgOj0gJChzaGFyZWQteSkKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9yZXN1bWUvcmVzdW1lLmMgYi91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDk5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBIYW5kbGUgcmVzdW1lIGZyb20gc3VzcGVuZC10by1kaXNrCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJyZXN1bWUuaCIKKworY2hhciAqcHJvZ25hbWU7CisKK3N0YXRpYyBfX25vcmV0dXJuIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgL2Rldi88cmVzdW1lZGV2aWNlPiBbb2Zmc2V0XVxuIiwgcHJvZ25hbWUpOworCWV4aXQoMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSkKK3sKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisJaWYgKGFyZ2MgPCAyIHx8IGFyZ2MgPiAzKQorCQl1c2FnZSgpOworCisJcmV0dXJuIHJlc3VtZShhcmd2WzFdLCAoYXJnYyA+IDIpID8gc3RydG91bGwoYXJndlsyXSwgTlVMTCwgMCkgOiAwVUxMKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9yZXN1bWUvcmVzdW1lLmggYi91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjkyOWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZS5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBSRVNVTUVfSAorI2RlZmluZSBSRVNVTUVfSAorCitpbnQgZG9fcmVzdW1lKGludCBhcmdjLCBjaGFyICphcmd2W10pOworaW50IHJlc3VtZShjb25zdCBjaGFyICpyZXN1bWVfZmlsZSwgdW5zaWduZWQgbG9uZyBsb25nIHJlc3VtZV9vZmZzZXQpOworCisjZW5kaWYgLyogUkVTVU1FX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9yZXN1bWUvcmVzdW1lbGliLmMgYi91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWY5ODQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcmVzdW1lL3Jlc3VtZWxpYi5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBIYW5kbGUgcmVzdW1lIGZyb20gc3VzcGVuZC10by1kaXNrCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorCisjaW5jbHVkZSAia2luaXQuaCIKKyNpbmNsdWRlICJkb19tb3VudHMuaCIKKyNpbmNsdWRlICJyZXN1bWUuaCIKKworI2lmbmRlZiBDT05GSUdfUE1fU1REX1BBUlRJVElPTgorIyBkZWZpbmUgQ09ORklHX1BNX1NURF9QQVJUSVRJT04gIiIKKyNlbmRpZgorCitpbnQgZG9fcmVzdW1lKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY29uc3QgY2hhciAqcmVzdW1lX2ZpbGUgPSBDT05GSUdfUE1fU1REX1BBUlRJVElPTjsKKwljb25zdCBjaGFyICpyZXN1bWVfYXJnOworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bWVfb2Zmc2V0OworCisJcmVzdW1lX2FyZyA9IGdldF9hcmcoYXJnYywgYXJndiwgInJlc3VtZT0iKTsKKwlyZXN1bWVfZmlsZSA9IHJlc3VtZV9hcmcgPyByZXN1bWVfYXJnIDogcmVzdW1lX2ZpbGU7CisJLyogTm8gcmVzdW1lIGRldmljZSBzcGVjaWZpZWQgKi8KKwlpZiAoIXJlc3VtZV9maWxlWzBdKQorCQlyZXR1cm4gMDsKKworCXJlc3VtZV9hcmcgPSBnZXRfYXJnKGFyZ2MsIGFyZ3YsICJyZXN1bWVfb2Zmc2V0PSIpOworCXJlc3VtZV9vZmZzZXQgPSByZXN1bWVfYXJnID8gc3RydG91bGwocmVzdW1lX2FyZywgTlVMTCwgMCkgOiAwVUxMOworCisJLyogRml4OiB3ZSBlaXRoZXIgc2hvdWxkIGNvbnNpZGVyIHJldmVydGluZyB0aGUgZGV2aWNlIGJhY2sgdG8KKwkgICBvcmRpbmFyeSBzd2FwLCBvciAoYmV0dGVyKSBwdXQgdGhhdCBjb2RlIGludG8gc3dhcG9uICovCisJLyogTm9yZXN1bWUgcmVxdWVzdGVkICovCisJaWYgKGdldF9mbGFnKGFyZ2MsIGFyZ3YsICJub3Jlc3VtZSIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVzdW1lKHJlc3VtZV9maWxlLCByZXN1bWVfb2Zmc2V0KTsKK30KKworaW50IHJlc3VtZShjb25zdCBjaGFyICpyZXN1bWVfZmlsZSwgdW5zaWduZWQgbG9uZyBsb25nIHJlc3VtZV9vZmZzZXQpCit7CisJZGV2X3QgcmVzdW1lX2RldmljZTsKKwlpbnQgcG93ZXJmZCA9IC0xOworCWNoYXIgZGV2aWNlX3N0cmluZ1s2NF07CisJaW50IGxlbjsKKworCXJlc3VtZV9kZXZpY2UgPSBuYW1lX3RvX2Rldl90KHJlc3VtZV9maWxlKTsKKworCWlmIChtYWpvcihyZXN1bWVfZGV2aWNlKSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCByZXN1bWUgZGV2aWNlOiAlc1xuIiwgcmVzdW1lX2ZpbGUpOworCQlnb3RvIGZhaWx1cmU7CisJfQorCisJaWYgKChwb3dlcmZkID0gb3BlbigiL3N5cy9wb3dlci9yZXN1bWUiLCBPX1dST05MWSkpIDwgMCkKKwkJZ290byBmYWlsX3I7CisKKwlsZW4gPSBzbnByaW50ZihkZXZpY2Vfc3RyaW5nLCBzaXplb2YgZGV2aWNlX3N0cmluZywKKwkJICAgICAgICIldToldTolbGx1IiwKKwkJICAgICAgIG1ham9yKHJlc3VtZV9kZXZpY2UpLCBtaW5vcihyZXN1bWVfZGV2aWNlKSwKKwkJICAgICAgIHJlc3VtZV9vZmZzZXQpOworCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJaWYgKGxlbiA+PSBzaXplb2YgZGV2aWNlX3N0cmluZykKKwkJZ290byBmYWlsX3I7CisKKwlERUJVRygoImtpbml0OiB0cnlpbmcgdG8gcmVzdW1lIGZyb20gJXNcbiIsIHJlc3VtZV9maWxlKSk7CisKKwlpZiAod3JpdGUocG93ZXJmZCwgZGV2aWNlX3N0cmluZywgbGVuKSAhPSBsZW4pCisJCWdvdG8gZmFpbF9yOworCisJLyogT2theSwgd2hhdCBhcmUgd2Ugc3RpbGwgZG9pbmcgYWxpdmUuLi4gKi8KK2ZhaWx1cmU6CisJaWYgKHBvd2VyZmQgPj0gMCkKKwkJY2xvc2UocG93ZXJmZCk7CisJZnByaW50ZihzdGRlcnIsICJraW5pdDogTm8gcmVzdW1lIGltYWdlLCBkb2luZyBub3JtYWwgYm9vdC4uLlxuIik7CisJcmV0dXJuIC0xOworCitmYWlsX3I6CisJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgd3JpdGUgL3N5cy9wb3dlci9yZXN1bWUgIgorCQkJIihubyBzb2Z0d2FyZSBzdXNwZW5kIGtlcm5lbCBzdXBwb3J0PylcbiIpOworCWdvdG8gZmFpbHVyZTsKK30KZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9ydW4taW5pdC9LYnVpbGQgYi91c3Iva2luaXQvcnVuLWluaXQvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTlkMGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcnVuLWluaXQvS2J1aWxkCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgS2J1aWxkIGZpbGUgZm9yIHJ1bi1pbml0CisjCisKK3N0YXRpYy15IDo9IHN0YXRpYy9ydW4taW5pdAorc2hhcmVkLXkgOj0gc2hhcmVkL3J1bi1pbml0CisKKyMgY29tbW9uIC5vIGZpbGVzCitvYmpzIDo9IHJ1bi1pbml0Lm8gcnVuaW5pdGxpYi5vCisKKyMgVE9ETyAtIGRvIHdlIHdhbnQgYSBzdHJpcHBlZCB2ZXJzaW9uCisjIFRPRE8gLSBkbyB3ZSB3YW50IHRoZSBzdGF0aWMuZyArIHNoYXJlZC5nIGRpcmVjdG9yaWVzPworCisjIENyZWF0ZSBidWlsdC1pbi5vIHdpdGggYWxsIG9iamVjdCBmaWxlcyAodXNlZCBieSBraW5pdCkKK2xpYi15IDo9ICQob2JqcykKKworIyAubyBmaWxlcyB1c2VkIHRvIGJ1aWx0IGV4ZWN1dGFibGVzCitzdGF0aWMvcnVuLWluaXQteSA6PSAkKG9ianMpCitzaGFyZWQvcnVuLWluaXQteSA6PSAkKG9ianMpCisKKyMgQ2xlYW5pbmcKK2NsZWFuLWRpcnMgOj0gc3RhdGljIHNoYXJlZAorCisjIGluc3RhbGwgYmluYXJ5CitpbnN0YWxsLXkgOj0gJChzaGFyZWQteSkKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9ydW4taW5pdC9ydW4taW5pdC5jIGIvdXNyL2tpbml0L3J1bi1pbml0L3J1bi1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNTBkZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC9ydW4taW5pdC9ydW4taW5pdC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDA0LTIwMDYgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbQorICogICB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgY29uZGl0aW9uczoKKyAqCisgKiAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsCisgKiAgIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBVc2FnZTogZXhlYyBydW4taW5pdCBbLWMgL2Rldi9jb25zb2xlXSAvcmVhbC1yb290IC9zYmluL2luaXQgIiRAIgorICoKKyAqIFRoaXMgcHJvZ3JhbSBzaG91bGQgYmUgY2FsbGVkIGFzIHRoZSBsYXN0IHRoaW5nIGluIGEgc2hlbGwgc2NyaXB0CisgKiBhY3RpbmcgYXMgL2luaXQgaW4gYW4gaW5pdHJhbWZzOyBpdCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgKgorICogLSBEZWxldGUgYWxsIGZpbGVzIGluIHRoZSBpbml0cmFtZnM7CisgKiAtIFJlbW91bnRzIC9yZWFsLXJvb3Qgb250byB0aGUgcm9vdCBmaWxlc3lzdGVtOworICogLSBDaHJvb3RzOworICogLSBPcGVucyAvZGV2L2NvbnNvbGU7CisgKiAtIFNwYXducyB0aGUgc3BlY2lmaWVkIGluaXQgcHJvZ3JhbSAod2l0aCBhcmd1bWVudHMuKQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAicnVuLWluaXQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKnByb2dyYW07CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18gKChub3JldHVybikpIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsCisJCSJVc2FnZTogZXhlYyAlcyBbLWMgY29uc29sZWRldl0gL3JlYWwtcm9vdCAvc2Jpbi9pbml0IFthcmdzXVxuIiwKKwkJcHJvZ3JhbSk7CisJZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwkvKiBDb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgZGVmYXVsdHMgKi8KKwljb25zdCBjaGFyICpjb25zb2xlID0gIi9kZXYvY29uc29sZSI7CisJY29uc3QgY2hhciAqcmVhbHJvb3Q7CisJY29uc3QgY2hhciAqaW5pdDsKKwljb25zdCBjaGFyICplcnJvcjsKKwljaGFyICoqaW5pdGFyZ3M7CisKKwkvKiBWYXJpYWJsZXMuLi4gKi8KKwlpbnQgbzsKKworCS8qIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgKi8KKwlwcm9ncmFtID0gYXJndlswXTsKKworCXdoaWxlICgobyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYzoiKSkgIT0gLTEpIHsKKwkJaWYgKG8gPT0gJ2MnKSB7CisJCQljb25zb2xlID0gb3B0YXJnOworCQl9IGVsc2UgeworCQkJdXNhZ2UoKTsKKwkJfQorCX0KKworCWlmIChhcmdjIC0gb3B0aW5kIDwgMikKKwkJdXNhZ2UoKTsKKworCXJlYWxyb290ID0gYXJndltvcHRpbmRdOworCWluaXQgPSBhcmd2W29wdGluZCArIDFdOworCWluaXRhcmdzID0gYXJndiArIG9wdGluZCArIDE7CisKKwllcnJvciA9IHJ1bl9pbml0KHJlYWxyb290LCBjb25zb2xlLCBpbml0LCBpbml0YXJncyk7CisKKwkvKiBJZiBydW5faW5pdCByZXR1cm5zLCBzb21ldGhpbmcgd2VudCB3cm9uZyAqLworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgcHJvZ3JhbSwgZXJyb3IsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQvcnVuLWluaXQvcnVuLWluaXQuaCBiL3Vzci9raW5pdC9ydW4taW5pdC9ydW4taW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTMyOGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcnVuLWluaXQvcnVuLWluaXQuaApAQCAtMCwwICsxLDM0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA2IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFJVTl9JTklUX0gKKyNkZWZpbmUgUlVOX0lOSVRfSAorCitjb25zdCBjaGFyICpydW5faW5pdChjb25zdCBjaGFyICpyZWFscm9vdCwgY29uc3QgY2hhciAqY29uc29sZSwKKwkJICAgICBjb25zdCBjaGFyICppbml0LCBjaGFyICoqaW5pdGFyZ3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9raW5pdC9ydW4taW5pdC9ydW5pbml0bGliLmMgYi91c3Iva2luaXQvcnVuLWluaXQvcnVuaW5pdGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzYzN2UKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2luaXQvcnVuLWluaXQvcnVuaW5pdGxpYi5jCkBAIC0wLDAgKzEsMjE0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA2IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcnVuX2luaXQoY29uc29sZWRldiwgcmVhbHJvb3QsIGluaXQsIGluaXRhcmdzKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhcyB0aGUgbGFzdCB0aGluZyBpbiBraW5pdCwKKyAqIGZyb20gaW5pdHJhbWZzLCBpdCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgKgorICogLSBEZWxldGUgYWxsIGZpbGVzIGluIHRoZSBpbml0cmFtZnM7CisgKiAtIFJlbW91bnRzIC9yZWFsLXJvb3Qgb250byB0aGUgcm9vdCBmaWxlc3lzdGVtOworICogLSBDaHJvb3RzOworICogLSBPcGVucyAvZGV2L2NvbnNvbGU7CisgKiAtIFNwYXducyB0aGUgc3BlY2lmaWVkIGluaXQgcHJvZ3JhbSAod2l0aCBhcmd1bWVudHMuKQorICoKKyAqIE9uIGZhaWx1cmUsIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICovCisKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlICJydW4taW5pdC5oIgorCisvKiBNYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgb24gZ2xpYmMgYnkgaW5jbHVkaW5nIGNvbnN0YW50cyB0aGF0IHRoZQorICAgYWx3YXlzLWJlaGluZCBzaGlwcGVkIGdsaWJjIGhlYWRlcnMgbWF5IG5vdCBpbmNsdWRlLiAgQ2xhc3NpYyBleGFtcGxlCisgICBvbiB3aHkgdGhlIGxhY2sgb2YgQUJJIGhlYWRlcnMgc2NyZXcgdXMgdXAuICovCisjaWZuZGVmIFRNUEZTX01BR0lDCisjIGRlZmluZSBUTVBGU19NQUdJQwkweDAxMDIxOTk0CisjZW5kaWYKKyNpZm5kZWYgUkFNRlNfTUFHSUMKKyMgZGVmaW5lIFJBTUZTX01BR0lDCTB4ODU4NDU4ZjYKKyNlbmRpZgorI2lmbmRlZiBNU19NT1ZFCisjIGRlZmluZSBNU19NT1ZFCTgxOTIKKyNlbmRpZgorCitzdGF0aWMgaW50IG51a2UoY29uc3QgY2hhciAqd2hhdCk7CisKK3N0YXRpYyBpbnQgbnVrZV9kaXJlbnQoaW50IGxlbiwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBkZXZfdCBtZSkKK3sKKwlpbnQgYnl0ZXMgPSBsZW4gKyBzdHJsZW4obmFtZSkgKyAyOworCWNoYXIgcGF0aFtieXRlc107CisJaW50IHhsZW47CisJc3RydWN0IHN0YXQgc3Q7CisKKwl4bGVuID0gc25wcmludGYocGF0aCwgYnl0ZXMsICIlcy8lcyIsIGRpciwgbmFtZSk7CisJYXNzZXJ0KHhsZW4gPCBieXRlcyk7CisKKwlpZiAobHN0YXQocGF0aCwgJnN0KSkKKwkJcmV0dXJuIEVOT0VOVDsJLyogUmV0dXJuIDAgc2luY2UgYWxyZWFkeSBnb25lPyAqLworCisJaWYgKHN0LnN0X2RldiAhPSBtZSkKKwkJcmV0dXJuIDA7CS8qIERPIE5PVCByZWN1cnNlIGRvd24gbW91bnQgcG9pbnRzISEhISEgKi8KKworCXJldHVybiBudWtlKHBhdGgpOworfQorCisvKiBXaXBlIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeSwgYnV0IG5vdCB0aGUgZGlyZWN0b3J5IGl0c2VsZiAqLworc3RhdGljIGludCBudWtlX2Rpcihjb25zdCBjaGFyICp3aGF0KQoreworCWludCBsZW4gPSBzdHJsZW4od2hhdCk7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChsc3RhdCh3aGF0LCAmc3QpKQorCQlyZXR1cm4gZXJybm87CisKKwlpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpCisJCXJldHVybiBFTk9URElSOworCisJaWYgKCEoZGlyID0gb3BlbmRpcih3aGF0KSkpIHsKKwkJLyogRUFDQ0VTIG1lYW5zIHdlIGNhbid0IHJlYWQgaXQuICBNaWdodCBiZSBlbXB0eSBhbmQgcmVtb3ZhYmxlOworCQkgICBpZiBub3QsIHRoZSBybWRpcigpIGluIG51a2UoKSB3aWxsIHRyaWdnZXIgYW4gZXJyb3IuICovCisJCXJldHVybiAoZXJybm8gPT0gRUFDQ0VTKSA/IDAgOiBlcnJubzsKKwl9CisKKwl3aGlsZSAoKGQgPSByZWFkZGlyKGRpcikpKSB7CisJCS8qIFNraXAgLiBhbmQgLi4gKi8KKwkJaWYgKGQtPmRfbmFtZVswXSA9PSAnLicgJiYKKwkJICAgIChkLT5kX25hbWVbMV0gPT0gJ1wwJyB8fAorCQkgICAgIChkLT5kX25hbWVbMV0gPT0gJy4nICYmIGQtPmRfbmFtZVsyXSA9PSAnXDAnKSkpCisJCQljb250aW51ZTsKKworCQllcnIgPSBudWtlX2RpcmVudChsZW4sIHdoYXQsIGQtPmRfbmFtZSwgc3Quc3RfZGV2KTsKKwkJaWYgKGVycikgeworCQkJY2xvc2VkaXIoZGlyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwljbG9zZWRpcihkaXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnVrZShjb25zdCBjaGFyICp3aGF0KQoreworCWludCBydjsKKwlpbnQgZXJyID0gMDsKKworCXJ2ID0gdW5saW5rKHdoYXQpOworCWlmIChydiA8IDApIHsKKwkJaWYgKGVycm5vID09IEVJU0RJUikgeworCQkJLyogSXQncyBhIGRpcmVjdG9yeS4gKi8KKwkJCWVyciA9IG51a2VfZGlyKHdoYXQpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gcm1kaXIod2hhdCkgPyBlcnJubyA6IGVycjsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IGVycm5vOworCQl9CisJfQorCisJaWYgKGVycikgeworCQllcnJubyA9IGVycjsKKwkJcmV0dXJuIGVycjsKKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKnJ1bl9pbml0KGNvbnN0IGNoYXIgKnJlYWxyb290LCBjb25zdCBjaGFyICpjb25zb2xlLAorCQkgICAgIGNvbnN0IGNoYXIgKmluaXQsIGNoYXIgKippbml0YXJncykKK3sKKwlzdHJ1Y3Qgc3RhdCByc3QsIGNzdCwgaXN0OworCXN0cnVjdCBzdGF0ZnMgc2ZzOworCWludCBjb25mZDsKKworCS8qIEZpcnN0LCBjaGFuZ2UgdG8gdGhlIG5ldyByb290IGRpcmVjdG9yeSAqLworCWlmIChjaGRpcihyZWFscm9vdCkpCisJCXJldHVybiAiY2hkaXIgdG8gbmV3IHJvb3QiOworCisJLyogVGhpcyBpcyBhIHBvdGVudGlhbGx5IGhpZ2hseSBkZXN0cnVjdGl2ZSBwcm9ncmFtLiAgVGFrZSBzb21lCisJICAgZXh0cmEgcHJlY2F1dGlvbnMuICovCisKKwkvKiBNYWtlIHN1cmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIG5vdCBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtCisJICAgYXMgdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJaWYgKHN0YXQoIi8iLCAmcnN0KSB8fCBzdGF0KCIuIiwgJmNzdCkpCisJCXJldHVybiAic3RhdCI7CisKKwlpZiAocnN0LnN0X2RldiA9PSBjc3Quc3RfZGV2KQorCQlyZXR1cm4gImN1cnJlbnQgZGlyZWN0b3J5IG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0gYXMgdGhlIHJvb3QiOworCisJLyogVGhlIGluaXRyYW1mcyBzaG91bGQgaGF2ZSAvaW5pdCAqLworCWlmIChzdGF0KCIvaW5pdCIsICZpc3QpIHx8ICFTX0lTUkVHKGlzdC5zdF9tb2RlKSkKKwkJcmV0dXJuICJjYW4ndCBmaW5kIC9pbml0IG9uIGluaXRyYW1mcyI7CisKKwkvKiBNYWtlIHN1cmUgd2UncmUgb24gYSByYW1mcyAqLworCWlmIChzdGF0ZnMoIi8iLCAmc2ZzKSkKKwkJcmV0dXJuICJzdGF0ZnMgLyI7CisJaWYgKHNmcy5mX3R5cGUgIT0gUkFNRlNfTUFHSUMgJiYgc2ZzLmZfdHlwZSAhPSBUTVBGU19NQUdJQykKKwkJcmV0dXJuICJyb290ZnMgbm90IGEgcmFtZnMgb3IgdG1wZnMiOworCisJLyogT2theSwgSSB0aGluayB3ZSBzaG91bGQgYmUgc2FmZS4uLiAqLworCisJLyogRGVsZXRlIHJvb3RmcyBjb250ZW50cyAqLworCWlmIChudWtlX2RpcigiLyIpKQorCQlyZXR1cm4gIm51a2luZyBpbml0cmFtZnMgY29udGVudHMiOworCisJLyogT3Zlcm1vdW50IHRoZSByb290ICovCisJaWYgKG1vdW50KCIuIiwgIi8iLCBOVUxMLCBNU19NT1ZFLCBOVUxMKSkKKwkJcmV0dXJuICJvdmVybW91bnRpbmcgcm9vdCI7CisKKwkvKiBjaHJvb3QsIGNoZGlyICovCisJaWYgKGNocm9vdCgiLiIpIHx8IGNoZGlyKCIvIikpCisJCXJldHVybiAiY2hyb290IjsKKworCS8qIE9wZW4gL2Rldi9jb25zb2xlICovCisJaWYgKChjb25mZCA9IG9wZW4oY29uc29sZSwgT19SRFdSKSkgPCAwKQorCQlyZXR1cm4gIm9wZW5pbmcgY29uc29sZSI7CisJZHVwMihjb25mZCwgMCk7CisJZHVwMihjb25mZCwgMSk7CisJZHVwMihjb25mZCwgMik7CisJY2xvc2UoY29uZmQpOworCisJLyogU3Bhd24gaW5pdCAqLworCWV4ZWN2KGluaXQsIGluaXRhcmdzKTsKKwlyZXR1cm4gaW5pdDsJCS8qIEZhaWxlZCB0byBzcGF3biBpbml0ICovCit9CmRpZmYgLS1naXQgYS91c3Iva2luaXQveHBpby5jIGIvdXNyL2tpbml0L3hwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzczZjdjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tpbml0L3hwaW8uYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogTG9vcGluZyB2ZXJzaW9ucyBvZiBwcmVhZCgpIGFuZCBwd3JpdGUoKQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitzc2l6ZV90IHhwcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpCit7CisJc3NpemVfdCBjdHIgPSAwOworCXNzaXplX3QgcnYgPSAwOworCWNoYXIgKmJwID0gYnVmOworCisJd2hpbGUgKGNvdW50KSB7CisJCXJ2ID0gcHJlYWQoZmQsIGJwLCBjb3VudCwgb2Zmc2V0KTsKKworCQlpZiAocnYgPT0gMCB8fCAocnYgPT0gLTEgJiYgZXJybm8gIT0gRUlOVFIpKQorCQkJYnJlYWs7CisKKwkJYnAJKz0gcnY7CisJCWNvdW50CS09IHJ2OworCQlvZmZzZXQJKz0gcnY7CisJCWN0cgkrPSBydjsKKwl9CisKKwlyZXR1cm4gY3RyID8gY3RyIDogcnY7Cit9CisKK3NzaXplX3QgeHB3cml0ZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpCit7CisJc3NpemVfdCBjdHIgPSAwOworCXNzaXplX3QgcnYgPSAwOworCWNoYXIgKmJwID0gYnVmOworCisJd2hpbGUgKGNvdW50KSB7CisJCXJ2ID0gcHdyaXRlKGZkLCBicCwgY291bnQsIG9mZnNldCk7CisKKwkJaWYgKHJ2ID09IDAgfHwgKHJ2ID09IC0xICYmIGVycm5vICE9IEVJTlRSKSkKKwkJCWJyZWFrOworCisJCWJwCSs9IHJ2OworCQljb3VudAktPSBydjsKKwkJb2Zmc2V0CSs9IHJ2OworCQljdHIJKz0gcnY7CisJfQorCisJcmV0dXJuIGN0ciA/IGN0ciA6IHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tpbml0L3hwaW8uaCBiL3Vzci9raW5pdC94cGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5NmEzMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9raW5pdC94cGlvLmgKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIGtpbml0L3hwaW8uaAorICovCisKKyNpZm5kZWYgS0lOSVRfWFBJT19ICisjZGVmaW5lIEtJTklUX1hQSU9fSAorCitzc2l6ZV90IHhwcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBvZmZfdCBvZmZzZXQpOworc3NpemVfdCB4cHdyaXRlKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCk7CisKKyNlbmRpZgkJCQkvKiBLSU5JVF9YUElPX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9DQVZFQVRTIGIvdXNyL2tsaWJjL0NBVkVBVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiOWI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9DQVZFQVRTCkBAIC0wLDAgKzEsNjAgQEAKKwkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgIFBsZWFzZSBub3RlIHRoZSBmb2xsb3dpbmcgY2F2ZWF0cyB0byB1c2luZyBrbGliYzoKKwkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb3B0aW1pemF0aW9uOgorLS0tLS0tLS0tLS0tLQorCitDb21waWxpbmcgd2l0aCAtTzAgaXMgbm90IHN1cHBvcnRlZC4gIEl0IG1heSBvciBtYXkgbm90IHdvcms7IHBsZWFzZQordXNlIC1PMSBpZiB5b3Ugd2FudCB0byBkbyBtYXhpbWl6ZSBkZWJ1Z2dhYmlsaXR5LgorCitDb21waWxpbmcgd2l0aCAtTzAgaXMgbW9yZSBsaWtlbHkgdG8gd29yayBvbiBnY2MgMy4KKworCitzZXRqbXAoKS9sb25nam1wKCk6CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NldGptcCgpIGFuZCBsb25nam1wKCkgKmRvIG5vdCogc2F2ZSBzaWduYWwgc3RhdGUuICBzaWdzZXRqbXAoKSBhbmQKK3NpZ2xvbmdqbXAoKSAqZG8qIHNhdmUgdGhlIHNpZ25hbCBtYXNrIC0tIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mCit0aGUgZXh0cmEgYXJndW1lbnQuCisKK1RoZSBzdGFuZGFyZHMgYWN0dWFsbHkgc3RhdGUgdGhhdCBpZiB5b3UgcGFzcyBsb25nam1wKCkgYSBmaW5hbCB2YWx1ZQorb2YgemVybyB0aGUgbGlicmFyeSBzaG91bGQgY2hhbmdlIHRoYXQgdG8gYSAxISAgUHJlc3VtYWJseSB0aGUgcmVhc29uCitpcyBzbyBwZW9wbGUgd2hvIHdyaXRlIGJyb2tlbiBjb2RlIGNhbiBnZXQgYXdheSB3aXRoIHdyaXRpbmcKK2xvbmdqbXAoYnVmKTsgb3Igc29tZXRoaW5nIGVxdWFsbHkgYmFkLiAgSWYgeW91IHBhc3MgbG9uZ2ptcCgpIGEgZmluYWwKK3ZhbHVlIG9mIDAgeW91IGdldCB3aGF0IHlvdSBkZXNlcnZlIC0tIHNldGptcCgpIHdpbGwgaGFwcGlseSByZXR1cm4gMC4KKworCitzdGRpbzoKKy0tLS0tLQorCitPbmx5IGEgc21hbGwgc3Vic2V0IG9mIHRoZSBzdGRpbyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkLiAgVGhvc2UKK3RoYXQgYXJlIGltcGxlbWVudGVkIGRvIG5vdCBidWZmZXIsIGFsdGhvdWdoIHRoZXkgKmRvKiB0cmFwIEVJTlRSIG9yCitzaG9ydCByZWFkL3dyaXRlcyBhbmQgaXRlcmF0ZS4KKworX2ZyZWFkKCkgYW5kIF9md3JpdGUoKSwgd2hpY2ggdGFrZSBvbmx5IG9uZSBzaXplIGFyZ3VtZW50IChsaWtlCityZWFkL3dyaXRlKSwgYnV0IGRvIGhhbmRsZSBFSU5UUi9zaG9ydCByZXR1cm4gYXJlIGFsc28gYXZhaWxhYmxlLgorCisKK25hbWVzcGFjZXM6CistLS0tLS0tLS0tLQorCitrbGliYyBmcmVxdWVudGx5IGluY2x1ZGVzIGhlYWRlcnMgaW4gb3RoZXIgaGVhZGVycyBpbiBhIHdheSB0aGF0CitleHBvc2VzIG1vcmUgc3ltYm9scyB0aGFuIFBPU0lYIHNheXMgdGhleSBzaG91bGQuICAiTGl2ZSB3aXRoIGl0LiIKKworCit0aGVhZGluZzoKKy0tLS0tLS0tLQorCitrbGliYyBpcyBub3QgdGhyZWFkLXNhZmUuICBDb25zZXF1ZW50bHksIGNsb25lKCkgb3IgYW55IG9mIHRoZQorcHRocmVhZHMgZnVuY3Rpb25zIGFyZSBub3QgaW5jbHVkZWQuCisKKworYnNkX3NpZ25hbCB2cyBzeXN2X3NpZ25hbDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGlzIG5vIHNpZ25hbCgpIGNhbGwsIGJlY2F1c2UgeW91IG5ldmVyIGtub3cgaWYgeW91IHdhbnQKK0xpbnV4L1N5c1Ygc2VtYW50aWNzIChTQV9SRVNFVEhBTkQpIG9yIEdOVS9CU0Qgc2VtYW50aWNzIChTQV9SRVNUQVJUKS4KK1RoZSBiZXN0LCBpbiAqYW55KiBjaXJjdW1zdGFuY2VzLCBpcyB0byBuZXZlciB1c2Ugc2lnbmFsKCkgYW5kIGluc3RlYWQKK3VzZSBzaWdhY3Rpb24oKSwgYnV0IGluIG9yZGVyIHRvIHNpbXBsaWZ5IHBvcnRpbmcgeW91IGNhbiB1c2UgZWl0aGVyCitzeXN2X3NpZ25hbCgpIG9yIGJzZF9zaWduYWwoKSwgZGVwZW5kaW5nIG9uIHdoYXQgeW91IGFjdHVhbGx5IHdhbnQuCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvS2J1aWxkIGIvdXNyL2tsaWJjL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDcyMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL0tidWlsZApAQCAtMCwwICsxLDE3OSBAQAorIworIyBLYnVpbGQgZmlsZSBmb3Iga2xpYmMKKyMKKworIyBUZWxsIHRoYXQgd2UgYXJlIGJ1aWxkaW5nIGtsaWJjCitleHBvcnQga2xpYmMtYnVpbGQgOj0geQorCitrbGliLXkgOj0gdnNucHJpbnRmLm8gc25wcmludGYubyB2c3ByaW50Zi5vIHNwcmludGYubyBcCisJICBhc3ByaW50Zi5vIHZhc3ByaW50Zi5vIFwKKwkgIHZzc2NhbmYubyBzc2NhbmYubyBjdHlwZXMubyBcCisJICBzdHJudG91bWF4Lm8gc3RybnRvaW1heC5vIFwKKwkgIGF0b2kubyBhdG9sLm8gYXRvbGwubyBcCisJICBzdHJ0b2wubyBzdHJ0b2xsLm8gc3RydG91bC5vIHN0cnRvdWxsLm8gXAorCSAgc3RydG9pbWF4Lm8gc3RydG91bWF4Lm8gXAorCSAgZ2xvYmFscy5vIGV4aXQubyBhdGV4aXQubyBvbmV4aXQubyBcCisJICBleGVjbC5vIGV4ZWNsZS5vIGV4ZWN2Lm8gZXhlY3ZwZS5vIGV4ZWN2cC5vIGV4ZWNscC5vIGV4ZWNscGUubyBcCisJICBmb3JrLm8gdmZvcmsubyB3YWl0Lm8gd2FpdDMubyB3YWl0cGlkLm8gc3lzdGVtLm8gXAorCSAgc2V0cGdycC5vIGdldHBncnAubyBkYWVtb24ubyBcCisJICBwcmludGYubyB2cHJpbnRmLm8gZnByaW50Zi5vIHZmcHJpbnRmLm8gcGVycm9yLm8gXAorCSAgc3RhdGZzLm8gZnN0YXRmcy5vIHVtb3VudC5vIFwKKwkgIGNyZWF0Lm8gb3Blbi5vIG9wZW5hdC5vIG9wZW5fY2xvZXhlYy5vIFwKKwkgIGZvcGVuLm8gZnJlYWQubyBmcmVhZDIubyBmZ2V0Yy5vIGZnZXRzLm8gXAorCSAgZndyaXRlLm8gZndyaXRlMi5vIGZwdXRjLm8gZnB1dHMubyBwdXRzLm8gcHV0Y2hhci5vIFwKKwkgIHNsZWVwLm8gdXNsZWVwLm8gc3RydG90aW1lc3BlYy5vIHN0cnRvdGltZXZhbC5vIFwKKwkgIHJhaXNlLm8gYWJvcnQubyBhc3NlcnQubyBhbGFybS5vIHBhdXNlLm8gXAorCSAgX19zaWduYWwubyBzeXN2X3NpZ25hbC5vIGJzZF9zaWduYWwubyBzaWdsaXN0Lm8gc2lnYWJicmV2Lm8gXAorCSAgc2lnbG9uZ2ptcC5vIFwKKwkgIHNpZ2FjdGlvbi5vIHNpZ3BlbmRpbmcubyBzaWdwcm9jbWFzay5vIHNpZ3N1c3BlbmQubyBcCisJICBwc2VsZWN0Lm8gcHBvbGwubyBcCisJICBicmsubyBzYnJrLm8gbWFsbG9jLm8gcmVhbGxvYy5vIGNhbGxvYy5vIFwKKwkgIG1tYXAubyBzaG1fb3Blbi5vIHNobV91bmxpbmsubyBcCisJICBtZW1jcHkubyBtZW1jbXAubyBtZW1zZXQubyBtZW1jY3B5Lm8gbWVtbWVtLm8gbWVtc3dhcC5vIFwKKwkgIG1lbW1vdmUubyBtZW1jaHIubyBtZW1yY2hyLm8gXAorCSAgc3RyY2FzZWNtcC5vIHN0cm5jYXNlY21wLm8gc3RybmR1cC5vIHN0cmVycm9yLm8gc3Ryc2lnbmFsLm8gXAorCSAgc3RyY2F0Lm8gc3RyY2hyLm8gc3RyY21wLm8gc3RyY3B5Lm8gc3RyZHVwLm8gc3RybGVuLm8gc3Rybmxlbi5vIFwKKwkgIHN0cm5jYXQubyBzdHJsY3B5Lm8gc3RybGNhdC5vIFwKKwkgIHN0cnN0ci5vIHN0cm5jbXAubyBzdHJuY3B5Lm8gc3RycmNoci5vIFwKKwkgIHN0cnhzcG4ubyBzdHJzcG4ubyBzdHJjc3BuLm8gc3RycGJyay5vIHN0cnNlcC5vIHN0cnRvay5vIFwKKwkgIGZubWF0Y2gubyBcCisJICBnZXRob3N0bmFtZS5vIGdldGRvbWFpbm5hbWUubyBnZXRjd2QubyBcCisJICBzZXRldWlkLm8gc2V0ZWdpZC5vIFwKKwkgIGdldGVudi5vIHNldGVudi5vIHB1dGVudi5vIF9fcHV0X2Vudi5vIHVuc2V0ZW52Lm8gXAorCSAgY2xlYXJlbnYubyBudWxsZW52Lm8gXAorCSAgZ2V0b3B0Lm8gZ2V0b3B0X2xvbmcubyByZWFkZGlyLm8gcmVtb3ZlLm8gXAorCSAgc3lzbG9nLm8gY2xvc2Vsb2cubyBwdHkubyBnZXRwdC5vIGlzYXR0eS5vIHJlYm9vdC5vIFwKKwkgIHRpbWUubyB1dGltZS5vIGxsc2Vlay5vIG5pY2UubyBnZXRwcmlvcml0eS5vIFwKKwkgIHFzb3J0Lm8gYnNlYXJjaC5vIFwKKwkgIGxyYW5kNDgubyBqcmFuZDQ4Lm8gbXJhbmQ0OC5vIG5yYW5kNDgubyBzcmFuZDQ4Lm8gc2VlZDQ4Lm8gXAorCSAgaW5ldC9pbmV0X250b2EubyBpbmV0L2luZXRfYXRvbi5vIGluZXQvaW5ldF9hZGRyLm8gXAorCSAgaW5ldC9pbmV0X250b3AubyBpbmV0L2luZXRfcHRvbi5vIGluZXQvYmluZHJlc3Zwb3J0Lm8gXAorCSAgc2VuZC5vIHJlY3YubyBcCisJICBjdHlwZS9pc2FsbnVtLm8gY3R5cGUvaXNhbHBoYS5vIGN0eXBlL2lzYXNjaWkubyBcCisJICBjdHlwZS9pc2JsYW5rLm8gY3R5cGUvaXNjbnRybC5vIGN0eXBlL2lzZGlnaXQubyBcCisJICBjdHlwZS9pc2dyYXBoLm8gY3R5cGUvaXNsb3dlci5vIGN0eXBlL2lzcHJpbnQubyBcCisJICBjdHlwZS9pc3B1bmN0Lm8gY3R5cGUvaXNzcGFjZS5vIGN0eXBlL2lzdXBwZXIubyBcCisJICBjdHlwZS9pc3hkaWdpdC5vIGN0eXBlL3RvbG93ZXIubyBjdHlwZS90b3VwcGVyLm8gXAorCSAgdXNlcmRiL2dldGdyZ2lkLm8gdXNlcmRiL2dldGdybmFtLm8gdXNlcmRiL2dldHB3bmFtLm8gXAorCSAgdXNlcmRiL2dldHB3dWlkLm8gdXNlcmRiL3Jvb3RfZ3JvdXAubyB1c2VyZGIvcm9vdF91c2VyLm8KKwora2xpYi0kKENPTkZJR19LTElCQ19FUlJMSVNUKSArPSBlcnJsaXN0Lm8KKworaWZlcSAoJChDT05GSUdfS0xJQkNfRVJSTElTVCkseSkKK0tMSUJDQ0ZMQUdTX3N0cmVycm9yLm8gKz0gLURXSVRIX0VSUkxJU1QKK2VuZGlmCisKK2tsaWItJChDT05GSUdfS0xJQkNfWkxJQikgKz0gemxpYi8KKyMgYXJjaCBzcGVjaWZpYyAubyBmaWxlcwora2xpYi15ICs9IGFyY2gvJChLTElCQ0FSQ0hESVIpLworCisjIyMjIworIyBTaGFyZWQgZGVmaW5pdGlvbnMKK0xJQkMgICAgIDo9IGxpYmMuYQorU09MSUIgICAgOj0gbGliYy5zbworU09IQVNIICAgOj0ga2xpYmMuc28KK0NSVDAgICAgIDo9IGFyY2gvJChLTElCQ0FSQ0hESVIpL2NydDAubworSU5URVJQX08gOj0gaW50ZXJwLm8KKworYWx3YXlzICAgOj0gJChMSUJDKSAkKFNPTElCKSAkKFNPSEFTSCkgJChJTlRFUlBfTykKK0xJQkMgICAgIDo9ICQoY2FsbCBvYmplY3RpZnksJChMSUJDKSkKK1NPTElCICAgIDo9ICQoY2FsbCBvYmplY3RpZnksJChTT0xJQikpCitTT0hBU0ggICA6PSAkKGNhbGwgb2JqZWN0aWZ5LCQoU09IQVNIKSkKK0NSVDAgICAgIDo9ICQoY2FsbCBvYmplY3RpZnksJChDUlQwKSkKK0lOVEVSUF9PIDo9ICQoY2FsbCBvYmplY3RpZnksJChJTlRFUlBfTykpCisKK1NPTElCSEFTSCA9ICQoc2hlbGwgY2F0ICQoU09MSUIpLmhhc2gpCisKKyMgR2VuZXJhdGUgc3lzY2FsbCBzdHVicwora2xpYi15ICs9IHN5c2NhbGxzLworIyBHZW5lcmF0ZSBzb2NrZXQgY2FsbHMgc3R1YnMKK2tsaWIteSArPSBzb2NrZXRjYWxscy8KKworIyMjIyMKKyMgUmVhZGFibGUgZXJyb3JtZXNzYWdlcyBleHRyYWN0ZWQgZnJvbSBzcmMuLgordGFyZ2V0cyArPSBlcnJsaXN0LmMKK3F1aWV0X2NtZF9lcnJsaXN0ID0gR0VOICAgICAkQAorICAgICAgY21kX2Vycmxpc3QgPSAkKFBFUkwpICQ8ICQoS0xJQkNDUFBGTEFHUykgLWVycmxpc3QgPiAkQCB8fCBybSAtZiAkQAorCiskKG9iaikvZXJybGlzdC5jOiAkKHNyY3RyZWUpLyQoc3JjKS9tYWtlZXJybGlzdC5wbAorCSQoY2FsbCBjbWQsZXJybGlzdCkKKworCisjIGFsbCAubyBmaWxlcyBmb3IgYWxsIGRpcnMKK2tsaWItby1maWxlcyA9ICQoc2hlbGwgY2F0ICQob2JqKS9rbGliLmxpc3QgXAorCQkkKGFkZHN1ZmZpeCAva2xpYi5saXN0LCAkKGtsaWItZGlycykpKQorIyMjIyMjCisjIEJ1aWxkIHN0YXRpYyBsaWJyYXJ5OiBsaWJjLmEKK3RhcmdldHMgKz0gbGliYy5hIF9fc3RhdGljX2luaXQubworcXVpZXRfY21kX2xpYmMgPSBLTElCQ0FSICRACisgICAgICBjbWRfbGliYyA9IHJtIC1mICRAOwkJCQkJCVwKKyAgICAgICAgICAgICAgICAgJChLTElCQ0FSKSBjcSAkQAkJCQkJXAorCQkgJChjYWxsIG9iamVjdGlmeSxfX3N0YXRpY19pbml0Lm8pICQoa2xpYi1vLWZpbGVzKTsJXAorICAgICAgICAgICAgICAgICAkKEtMSUJDUkFOTElCKSAkQAorCiskKExJQkMpOiAkKGNhbGwgb2JqZWN0aWZ5LF9fc3RhdGljX2luaXQubykgJChvYmopL2tsaWIubGlzdCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpYmMpCisKKyMjIyMjIworIyBCdWlsZCBzaGFyZWQgbGlicmFyeQordGFyZ2V0cyArPSBsaWJjLnNvIF9fc2hhcmVkX2luaXQubworCitxdWlldF9jbWRfbGliY3NvID0gS0xJQkNMRCAkQAorICAgICAgY21kX2xpYmNzbyA9ICQoS0xJQkNMRCkgJChLTElCQ0xERkxBR1MpICQoS0xJQkNTSEFSRURGTEFHUykgLW8gJEAgXAorCQkJLS1zdGFydC1ncm91cAkJCQkJXAorCQkJCSQoQ1JUMCkJCQkJCVwKKwkJCQkkKGNhbGwgb2JqZWN0aWZ5LF9fc2hhcmVkX2luaXQubykJXAorCQkJCSQoa2xpYi1vLWZpbGVzKQkJCQlcCisJCQkJJChLTElCQ0xJQkdDQykJCQkJXAorCQkJLS1lbmQtZ3JvdXAKKworJChTT0xJQik6ICQoY2FsbCBvYmplY3RpZnksX19zaGFyZWRfaW5pdC5vKSAkKG9iaikva2xpYi5saXN0IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGliY3NvKQorCisKKyMjIyMjCisjIEJ1aWxkIHNoYTEgaGFzaCB2YWx1ZXMKK3RhcmdldHMgICAgICs9IGtsaWJjLnNvIGxpYmMuc28uaGFzaAoraG9zdHByb2dzLXkgOj0gc2hhMWhhc2gKK2NsZWFuLWZpbGVzICs9IGtsaWJjLT8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py5zbworCitxdWlldF9jbWRfc29saWJoYXNoID0gSEFTSCAgICAkQAorICAgICAgY21kX3NvbGliaGFzaCA9ICQoS0xJQkNOTSkgJDwgfCBlZ3JlcCAnXlswLTlhLWZBLUZdKyBbQURSVFddICcgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydCB8ICQob2JqKS9zaGExaGFzaCA+ICRACiskKFNPTElCKS5oYXNoOiAkKFNPTElCKSAkKG9iaikvc2hhMWhhc2ggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxzb2xpYmhhc2gpCisKK3F1aWV0X2NtZF9zb2hhc2ggPSBHRU4gICAgICRACisgICAgICBjbWRfc29oYXNoID0gY2F0ICQ8ID4gJEA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNTVFJJUCkgJChLTElCQ1NUUklQRkxBR1MpICRAOyAgICAgICAgICAgICAgICAgXAorCQkgICAgIGNobW9kIGEreCAkQDsJCQkJCSAgXAorICAgICAgICAgICAgICAgICAgICAgcm0gLWYgJChvYmopL2tsaWJjLT8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py5zbzsgICBcCisgICAgICAgICAgICAgICAgICAgICBsbiAtZiAkQCAkKG9iaikva2xpYmMtJChTT0xJQkhBU0gpLnNvCiskKFNPSEFTSCk6ICQoU09MSUIpICQoU09MSUIpLmhhc2gKKwkkKGNhbGwgY21kLHNvaGFzaCkKKworCisjIyMjIworIyBidWlsZCBpbnRlcnAubwordGFyZ2V0cyArPSBpbnRlcnAubworCitxdWlldF9jbWRfaW50ZXJwID0gQlVJTEQgICAkQAorICAgICAgY21kX2ludGVycCA9ICQoS0xJQkNDQykgJChrbGliY2NmbGFncykgLURfX0FTU0VNQkxZX18gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURMSUJESVI9XCIkKFNITElCRElSKVwiICAgICAgICAgXAorCQkJICAgICAtRFNPSEFTSD1cIiQoU09MSUJIQVNIKVwiIFwKKwkJCSAgICAgLWMgLW8gJEAgJDwKKworJChJTlRFUlBfTyk6ICQob2JqKS9pbnRlcnAuUyAkKFNPTElCKS5oYXNoCisJJChjYWxsIGlmX2NoYW5nZWQsaW50ZXJwKQorCisjIyMjIworIyBJbnN0YWxsIGtsaWJjCitpbnN0YWxsLXJ1bGU6CisJQGVjaG8gIiAgSU5TVEFMTCBrbGliYyB0byAkKElOU1RBTExST09UKSQoSU5TVEFMTERJUikvJChLTElCQ0NST1NTKWxpYiIKKwkkKFEpJChmb3JlYWNoIGYsICQoTElCQykgJChTT0xJQikgJChDUlQwKSAkKElOVEVSUF9PKSwgXAorCSAgJChzaGVsbCAkKGluc3RhbGwtZGF0YSkgJChmKSBcCisJICAgICAgICAgICQoSU5TVEFMTFJPT1QpJChJTlNUQUxMRElSKS8kKEtMSUJDQ1JPU1MpbGliKSkKKwkkKFEpJChpbnN0YWxsLWxpYikgJChvYmopL2tsaWJjLSQoU09MSUJIQVNIKS5zbyBcCisJICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTFJPT1QpJChJTlNUQUxMRElSKS8kKEtMSUJDQ1JPU1MpbGliCisJJChRKSQoaW5zdGFsbC1saWIpICQob2JqKS9rbGliYy0kKFNPTElCSEFTSCkuc28gXAorCSAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExST09UKSQoU0hMSUJESVIpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvTElDRU5TRSBiL3Vzci9rbGliYy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmQ3YTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvTElDRU5TRQpAQCAtMCwwICsxLDczIEBACitUaGlzIGxpY2Vuc2UgYXBwbGllcyB0byBhbGwgZmlsZXMgaW4gZGlyZWN0b3J5IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMsCit1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkIGluIGluZGl2aWR1YWwgZmlsZXMuCisKKworU29tZSBmaWxlcyBhcmUgZGVyaXZlZCBmcm9tIGZpbGVzIGRlcml2ZWQgZnJvbSB0aGUgaW5jbHVkZS8gZGlyZWN0b3J5CitvZiB0aGUgTGludXgga2VybmVsLCBhbmQgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzIHJlbGVhc2VkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCQkJCS0tLS0tCisKK1NvbWUgZmlsZXMgYXJlIGRlcml2ZWQgZnJvbSBmaWxlcyBjb3B5cmlnaHRlZCBieSB0aGUgUmVnZW50cyBvZiBUaGUKK1VuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgYW5kIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZworbGljZW5zZToKKworTm90ZTogVGhlIGFkdmVydGlzaW5nIGNsYXVzZSBpbiB0aGUgbGljZW5zZSBhcHBlYXJpbmcgb24gQlNEIFVuaXgKK2ZpbGVzIHdhcyBvZmZpY2lhbGx5IHJlc2NpbmRlZCBieSB0aGUgRGlyZWN0b3Igb2YgdGhlIE9mZmljZSBvZgorVGVjaG5vbG9neSBMaWNlbnNpbmcgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBvbiBKdWx5IDIyCisxOTk5LiBIZSBzdGF0ZXMgdGhhdCBjbGF1c2UgMyBpcyAiaGVyZWJ5IGRlbGV0ZWQgaW4gaXRzIGVudGlyZXR5LiIKKworICogQ29weXJpZ2h0IChjKQorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKworCQkJCS0tLS0tCisKK0ZvciBhbGwgcmVtYWluaW5nIGZpbGVzLCB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYXBwbGllczoKKworICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogQW55IGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9SRUFETUUgYi91c3Iva2xpYmMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzJjZTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvUkVBRE1FCkBAIC0wLDAgKzEsODAgQEAKK1RoaXMgaXMga2xpYmMsIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYSBtaW5pbWFsaXN0aWMgbGliYyBzdWJzZXQgZm9yCit1c2Ugd2l0aCBpbml0cmFtZnMuICBJdCBpcyBkZWxpYmVyYXRlbHkgd3JpdHRlbiBmb3Igc21hbGwgc2l6ZSwKK21pbmltYWwgZW50YWdsZW1lbnQsIGFuZCBwb3J0YWJpbGl0eSwgbm90IHNwZWVkLiAgSXQgaXMgZGVmaW5pdGVseSBhCit3b3JrIGluIHByb2dyZXNzLCBhbmQgYSBsb3Qgb2YgdGhpbmdzIGFyZSBzdGlsbCBtaXNzaW5nLgorCisKK1RoZSBidWlsZCBwcm9jZWR1cmUgaXMgbm90IHZlcnkgcG9saXNoZWQgeWV0LCBidXQgaXQgc2hvdWxkIHdvcmsgbGlrZQordGhpczoKKworYSkgSW4gdGhlIHNvdXJjZSByb290IGRpcmVjdG9yeSAodGhlIGRpcmVjdG9yeSBhYm92ZSB0aGUgb25lIGluIHdoaWNoCisgICB0aGlzIGZpbGUgaXMgZm91bmQpIGNyZWF0ZSBhIHN5bWxpbmsgY2FsbGVkICJsaW51eCIgcG9pbnRpbmcgdG8gYQorICAgcmVhc29uYWJseSByZWNlbnQgTGludXgga2VybmVsIHRyZWUgKDIuNCBvciAyLjYgc2hvdWxkIGJlIE9LLikKKyAgIFRoaXMgdHJlZSBtdXN0IGhhdmUgdGhlIGluY2x1ZGUvYXNtIHN5bWxpbmsgc2V0IHVwIGZvciB0aGUKKyAgIGFyY2hpdGVjdHVyZSB5b3UncmUgY29tcGlsaW5nIGZvciwgYW5kIGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaAorICAgbXVzdCBleGlzdC4gIFRoZSBlYXNpZXN0IHdheSB0byBtYWtlIHN1cmUgb2YgYWxsIG9mIHRoZXNlIGlzIHRvIGRvCisgICBhICJtYWtlIGNvbmZpZyIgb3IgYW55IG9mIGl0cyB2YXJpYW50cyBvbiB0aGUga2VybmVsIHRyZWUgaXMKKyAgIHF1ZXN0aW9uLCBmb2xsb3dlZCBieSBhICJtYWtlIGRlcCIgKDIuNCkgb3IgIm1ha2UgcHJlcGFyZSIgKDIuNikuCisKK2IpIElmIHlvdSdyZSBjcm9zcy1jb21waWxpbmcsIHlvdSBuZWVkIHRvIHNldCBLTElCQ0FSQ0ggdG8gdGhlCisgICBhcHByb3ByaWF0ZSBhcmNoaXRlY3R1cmUsIGFuZCBzZXQgQ1JPU1NfQ09NUElMRSB0byB5b3VyIHRvb2xjaGFpbgorICAgcHJlZml4LgorCisgICBJTVBPUlRBTlQ6IGlmIHlvdSdyZSBvbiBhIDY0LWJpdCBtYWNoaW5lIHdpdGggYSAzMi1iaXQgdXNlcmxhbmQKKyAgIChpYTY0LCBtaXBzNjQsIHBwYzY0IHNwYXJjNjQsIHMzOTB4IG9yIHg4Nl82NCksIGFuZCB5b3Ugd2FudCB0bworICAgYnVpbGQgdGhlIDMyLWJpdCB2ZXJzaW9uOiB5b3UgbmVlZCB0byBzZXQgS0xJQkNBUkNIIHRvIHRoZSAzMi1iaXQKKyAgIGFyY2hpdGVjdHVyZSBhcyB3ZWxsIGFzIHNldCB1cCB0aGUgbGludXgvaW5jbHVkZS9hc20gc3ltbGluayB0bworICAgcG9pbnQgdG8gdGhlIDMyLWJpdCBhcmNoaXRlY3R1cmUuICBCdWlsZGluZyB0aGUgMzItYml0IGFyY2hpdGVjdHVyZQorICAgdXN1YWxseSAoYnV0IG5vdCBhbHdheXMpIHByb2R1Y2VzIHNtYWxsZXIgYmluYXJpZXMsIGFuZCBpcyBsaWtlbHkKKyAgIHRvIGJlIGJldHRlciB0ZXN0ZWQuCisKKyAgIElmIHlvdSBhcmUgb24gQVJNLCBhbmQgd2FudCB0byBidWlsZCBhIHRodW1iIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyAgICh0aGlzIGlzIHN1cHBvcnRlZCksIGNoYW5nZSBPUFRGTEFHUyBpbiBhcmNoL2FybS9NQ09ORklHIHRvIGJ1aWxkCisgICB0aHVtYiBjb2RlLgorCisgICBUaGUgZm9sbG93aW5nIGlzIHRoZSBsYXN0IGtub3duIHN0YXR1cyBvZiB2YXJpb3VzIGFyY2hpdGVjdHVyZXM6CisKKyAgIGFscGhhOgkgV29ya2luZworICAgYXJtLXRodW1iOgkgVW50ZXN0ZWQKKyAgIGFybToJCSBXb3JraW5nCisgICBhcm0yNjoJIE5vdCB5ZXQgcG9ydGVkCisgICBjcmlzOgkgV29ya2luZworICAgaDgzMDA6CSBOb3QgeWV0IHBvcnRlZAorICAgaTM4NjoJIFdvcmtpbmcKKyAgIGlhNjQ6CSBXb3JraW5nCisgICBtMzJyOgkgVW50ZXN0ZWQKKyAgIG02OGs6CSBVbnRlc3RlZAorICAgbTY4a25vbW11OgkgTm90IHlldCBwb3J0ZWQKKyAgIG1pcHM6CSBXb3JraW5nCisgICBtaXBzNjQ6CSBOb3QgeWV0IHBvcnRlZAorICAgcGFyaXNjOgkgV29ya2luZworICAgcGFyaXNjNjQ6CSBOb3QgeWV0IHBvcnRlZAorICAgcHBjOgkJIFdvcmtpbmcKKyAgIHBwYzY0OgkgV29ya2luZworICAgczM5MDoJIFdvcmtpbmcgc3RhdGljLCBzaGFyZWQgdW50ZXN0ZWQKKyAgIHMzOTB4OgkgV29ya2luZworICAgc2g6CQkgVW50ZXN0ZWQKKyAgIHNoNjQ6CSBOb3QgeWV0IHBvcnRlZAorICAgc3BhcmM6CSBXb3JraW5nCisgICBzcGFyYzY0OgkgVW50ZXN0ZWQKKyAgIHY4NTA6CSBOb3QgeWV0IHBvcnRlZAorICAgeDg2LTY0OgkgV29ya2luZworICAgeHRlbnNhOgkgTm90IHlldCBwb3J0ZWQKKworICAgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByZXF1aXJlcyByZWNlbnQgYmludXRpbHMgb24gbWFueQorICAgYXJjaGl0ZWN0dXJlcy4KKworICAgTm90ZSB0aGF0IGV2ZW4gdGhlICJ3b3JraW5nIiBvbmVzIGxpa2VseSBoYXZlIGJ1Z3MuICBQbGVhc2UgcmVwb3J0CisgICB0aGVtIGlmIHlvdSBydW4gaW50byB0aGVtLgorCitjKSBUeXBlICJtYWtlIiBhbmQgcHJheS4uLgorCitkKSBUcnkgdGhlIHRlc3QgcHJvZ3JhbXMgaW4gdGhlIHRlc3RzLyBkaXJlY3RvcnkuICBUaGV5IHNob3VsZCBydW4uLi4KKworQ29udGFjdCB0aGUga2xpYmMgbWFpbGluZyBsaXN0OgorCisJaHR0cDovL3d3dy56eXRvci5jb20vbWFpbG1hbi9saXN0aW5mby9rbGliYworCisuLi4gZm9yIG1vcmUgaW5mby4KKworCS1ocGEKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9TT0NLRVRDQUxMUy5kZWYgYi91c3Iva2xpYmMvU09DS0VUQ0FMTFMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZDQ3OGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvU09DS0VUQ0FMTFMuZGVmCkBAIC0wLDAgKzEsMjEgQEAKKy8qIC0qLSBjIC0qLQorICoKKyAqIFRoZXNlIGFyZSBjYWxscyB0aGF0IGFyZSBpbnZva2VkIHZpYSB0aGUgc29ja2V0Y2FsbCBtZWNoYW5pc20KKyAqIE5vdGUgdGhhdCBvbiBtb3N0IGFyY2hpdGVjdHVyZXMgdGhpcyBpcyBzaW1wbHkgI2luY2x1ZGVkIGludG8KKyAqIFNZU0NBTExTLmRlZi4KKyAqLworPD8+IGludCBzb2NrZXQoaW50LCBpbnQsIGludCk7Cis8Pz4gaW50IGJpbmQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKKzw/PiBpbnQgY29ubmVjdChpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QpOworPD8+IGludCBsaXN0ZW4oaW50LCBpbnQpOworPD8+IGludCBhY2NlcHQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICopOworPD8+IGludCBnZXRzb2NrbmFtZShpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QgKik7Cis8Pz4gaW50IGdldHBlZXJuYW1lKGludCwgc3RydWN0IHNvY2thZGRyICosIHNvY2tsZW5fdCAqKTsKKzw/PiBpbnQgc29ja2V0cGFpcihpbnQsIGludCwgaW50LCBpbnQgKik7Cis8Pz4gaW50IHNlbmR0byhpbnQsIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QpOworPD8+IGludCByZWN2ZnJvbShpbnQsIHZvaWQgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QgKik7Cis8Pz4gaW50IHNodXRkb3duKGludCwgaW50KTsKKzw/PiBpbnQgc2V0c29ja29wdChpbnQsIGludCwgaW50LCBjb25zdCB2b2lkICosIHNvY2tsZW5fdCk7Cis8Pz4gaW50IGdldHNvY2tvcHQoaW50LCBpbnQsIGludCwgdm9pZCAqLCBzb2NrbGVuX3QgKik7Cis8Pz4gaW50IHNlbmRtc2coaW50LCBjb25zdCBzdHJ1Y3QgbXNnaGRyICosIHVuc2lnbmVkIGludCk7Cis8Pz4gaW50IHJlY3Ztc2coaW50LCBzdHJ1Y3QgbXNnaGRyICosIHVuc2lnbmVkIGludCk7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvU1lTQ0FMTFMuZGVmIGIvdXNyL2tsaWJjL1NZU0NBTExTLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJkNTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL1NZU0NBTExTLmRlZgpAQCAtMCwwICsxLDI2MiBAQAorLyogLSotIGMgLSotCisgKgorICogVGhpcyBpcyBhIGxpc3Qgb2Ygc3lzdGVtIGNhbGxzIHdlIGludm9rZSAiZGlyZWN0bHkiLiAgVGhlc2UKKyAqIGFyZSBnZW5lcmF0ZWQgaW50byBzeXNjYWxsIHN0dWJzIGluIHRoZWlyIG93biBmaWxlcywgc28gdGhlCisgKiBsaW5rZXIgY2FuIGRvIGl0cyBqb2IgcHJvcGVybHkuCisgKgorICogVGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgYSBsaW5lIGlzOgorICogWzxbP11bIV1hcmNoLC4uLj5dIHR5cGUgW3N5c25hbWUsLi4uXVtAc3lzdHlwZV1bOjpmdW5jbmFtZV0oYXJncyk7CisgKgorICogPyBtZWFucyBvbmx5IGluc3RhbnRpYXRlIHRoaXMgc3lzdGVtIGNhbGwgaWYgcHJlc2VudCBpbiBhc20vdW5pc3RkLmgKKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGtsaWJjL3N5c2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHNpemUuaD4KKworLyoKKyAqIFByb2Nlc3MtcmVsYXRlZCBzeXNjYWxscworICovCit2b2lkIF9leGl0LGV4aXQ6Ol9leGl0KGludCk7Cis8PyFpYTY0PiBwaWRfdCBjbG9uZTo6X19jbG9uZSh1bnNpZ25lZCBsb25nLCB2b2lkICopOworPD9pYTY0PiBwaWRfdCBjbG9uZTo6X19jbG9uZTIodW5zaWduZWQgbG9uZywgdm9pZCAqLCB2b2lkICopOworIyBpZiAhIF9LTElCQ19OT19NTVUKKzwhc3BhcmMsc3BhcmM2NCxpYTY0PiBwaWRfdCBmb3JrKCk7Cis8c3BhcmMsc3BhcmM2ND4gcGlkX3QgZm9ya0Bmb3JraXNoKCk7CisjZW5kaWYKKyNpZiBfS0xJQkNfUkVBTF9WRk9SSworLyoKKyAqIEEgbG90IG9mIGFyY2hpdGVjdHVyZXMgbmVlZCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgdmZvcmsKKyAqIHN0dWJzLCBkdWUgdG8gdGhlIG5vLXN0YWNrIHJlcXVpcmVtZW50LiAgVGhlc2UgYXJlIHRoZQorICogYXJjaGl0ZWN0dXJlcyB3aGljaCBkbyBub3QuCisgKi8KKzxhbHBoYSxtMzJyLHBwYyxwcGM2NCxzaCxzMzkwLHMzOTB4PiBwaWRfdCB2Zm9yaygpOworPHNwYXJjLHNwYXJjNjQ+IHBpZF90IHZmb3JrQGZvcmtpc2goKTsKKyNlbmRpZgorPCFhbHBoYT4gcGlkX3QgZ2V0cGlkKCk7Cis8YWxwaGE+IHBpZF90IGdldHhwaWRAZHVhbDA6OmdldHBpZCgpOworaW50IHNldHBnaWQocGlkX3QsIHBpZF90KTsKK3BpZF90IGdldHBnaWQocGlkX3QpOworPCFhbHBoYT4gcGlkX3QgZ2V0cHBpZCgpOworPGFscGhhPiBwaWRfdCBnZXR4cGlkQGR1YWwxOjpnZXRwcGlkKCk7CitwaWRfdCBzZXRzaWQoKTsKK3BpZF90IGdldHNpZChwaWRfdCk7CitwaWRfdCB3YWl0NChwaWRfdCwgaW50ICosIGludCwgc3RydWN0IHJ1c2FnZSAqKTsKK2ludCBleGVjdmUoY29uc3QgY2hhciAqLCBjaGFyICogY29uc3QgKiwgY2hhciAqIGNvbnN0ICopOworPD8+IGludCBuaWNlKGludCk7Cis8YWxwaGEsaWE2ND4gaW50IGdldHByaW9yaXR5KGludCwgaW50KTsKKzwhYWxwaGEsaWE2ND4gaW50IGdldHByaW9yaXR5OjpfX2dldHByaW9yaXR5KGludCwgaW50KTsKK2ludCBzZXRwcmlvcml0eShpbnQsIGludCwgaW50KTsKK2ludCBzY2hlZF9zZXRzY2hlZHVsZXIocGlkX3QsIGludCwgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICopOworaW50IHNjaGVkX3lpZWxkKCk7Cis8aTM4Nj4gaW50IHByY3RsQHZhcmFkaWMoaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKzwhaTM4Nj4gaW50IHByY3RsKGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiBVc2VyIGFuZCBncm91cCBJRHMKKyAqLworaW50IHNldHVpZDMyLHNldHVpZDo6c2V0dWlkKHVpZF90KTsKK2ludCBzZXRnaWQzMixzZXRnaWQ6OnNldGdpZChnaWRfdCk7Cis8IWFscGhhPiB1aWRfdCBnZXR1aWQzMixnZXR1aWQ6OmdldHVpZCgpOworPGFscGhhPiAgdWlkX3QgZ2V0eHVpZEBkdWFsMDo6Z2V0dWlkKCk7Cis8IWFscGhhPiBnaWRfdCBnZXRnaWQzMixnZXRnaWQ6OmdldGdpZCgpOworPGFscGhhPiBnaWRfdCBnZXR4Z2lkQGR1YWwwOjpnZXRnaWQoKTsKKzwhYWxwaGE+IHVpZF90IGdldGV1aWQzMixnZXRldWlkOjpnZXRldWlkKCk7Cis8YWxwaGE+IHVpZF90IGdldHh1aWRAZHVhbDE6OmdldGV1aWQoKTsKKzwhYWxwaGE+IGdpZF90IGdldGVnaWQzMixnZXRlZ2lkOjpnZXRlZ2lkKCk7Cis8YWxwaGE+IGdpZF90IGdldHhnaWRAZHVhbDE6OmdldGVnaWQoKTsKK2ludCBnZXRncm91cHMzMixnZXRncm91cHM6OmdldGdyb3VwcyhpbnQsIGdpZF90ICopOworaW50IHNldGdyb3VwczMyLHNldGdyb3Vwczo6c2V0Z3JvdXBzKHNpemVfdCwgY29uc3QgZ2lkX3QgKik7CitpbnQgc2V0cmV1aWQzMixzZXRyZXVpZDo6c2V0cmV1aWQodWlkX3QsIHVpZF90KTsKK2ludCBzZXRyZWdpZDMyLHNldHJlZ2lkOjpzZXRyZWdpZChnaWRfdCwgZ2lkX3QpOworaW50IHNldGZzdWlkMzIsc2V0ZnN1aWQ6OnNldGZzdWlkKHVpZF90KTsKK2ludCBzZXRmc2dpZDMyLHNldGZzZ2lkOjpzZXRmc2dpZChnaWRfdCk7CitpbnQgc2V0cmVzdWlkMzIsc2V0cmVzdWlkOjpzZXRyZXN1aWQoaW50LCB1aWRfdCwgdWlkX3QsIHVpZF90KTsKKworLyoKKyAqIEZpbGVzeXN0ZW0tcmVsYXRlZCBzeXN0ZW0gY2FsbHMKKyAqLworaW50IG1vdW50KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHZvaWQgKik7Cis8IWFscGhhLGlhNjQ+IGludCB1bW91bnQyKGNvbnN0IGNoYXIgKiwgaW50KTsKKzxhbHBoYSxpYTY0PiBpbnQgdW1vdW50Ojp1bW91bnQyKGNvbnN0IGNoYXIgKiwgaW50KTsKKzw/PiBpbnQgcGl2b3Rfcm9vdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitpbnQgc3luYygpOworI2lmZGVmIF9fTlJfc3RhdGZzNjQKK2ludCBzdGF0ZnM2NDo6X19zdGF0ZnM2NChjb25zdCBjaGFyICosIHNpemVfdCwgc3RydWN0IHN0YXRmcyAqKTsKKyNlbHNlCitpbnQgc3RhdGZzKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXRmcyAqKTsKKyNlbmRpZgorI2lmZGVmIF9fTlJfZnN0YXRmczY0CitpbnQgZnN0YXRmczY0OjpfX2ZzdGF0ZnM2NChpbnQsIHNpemVfdCwgc3RydWN0IHN0YXRmcyAqKTsKKyNlbHNlCitpbnQgZnN0YXRmcyhpbnQsIHN0cnVjdCBzdGF0ZnMgKik7CisjZW5kaWYKK2ludCBzd2Fwb24oY29uc3QgY2hhciAqLCBpbnQpOworaW50IHN3YXBvZmYoY29uc3QgY2hhciAqKTsKKworLyoKKyAqIElub2RlLXJlbGF0ZWQgc3lzdGVtIGNhbGxzCisgKi8KK2ludCBhY2Nlc3MoY29uc3QgY2hhciAqLCBpbnQpOworPD8+IGludCBmYWNjZXNzYXQoaW50LCBjb25zdCBjaGFyICosIGludCk7CitpbnQgbGluayhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Cis8Pz4gaW50IGxpbmthdChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopOworaW50IHVubGluayhjb25zdCBjaGFyICopOworPD8+IGludCB1bmxpbmthdChpbnQsIGNvbnN0IGNoYXIgKik7CitpbnQgY2hkaXIoY29uc3QgY2hhciAqKTsKK2ludCBmY2hkaXIoaW50KTsKK2ludCByZW5hbWUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworPD8+IGludCByZW5hbWVhdChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopOworaW50IG1rbm9kKGNvbnN0IGNoYXIgKiwgbW9kZV90LCBkZXZfdCk7Cis8Pz4gaW50IG1rbm9kYXQoaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgbW9kZV90LCBkZXZfdCk7CitpbnQgY2htb2QoY29uc3QgY2hhciAqLCBtb2RlX3QpOworaW50IGZjaG1vZChpbnQsIG1vZGVfdCk7Cis8Pz4gaW50IGZjaG1vZGF0KGludCwgY29uc3QgY2hhciAqLCBtb2RlX3QpOworaW50IG1rZGlyKGNvbnN0IGNoYXIgKiwgbW9kZV90KTsKKzw/PiBpbnQgbWtkaXJhdChpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBtb2RlX3QpOworaW50IHJtZGlyKGNvbnN0IGNoYXIgKik7Cis8IWFscGhhLGlhNjQsbWlwcyxtaXBzNjQsc3BhcmMsc3BhcmM2ND4gaW50IHBpcGUoaW50ICopOworbW9kZV90IHVtYXNrKG1vZGVfdCk7CitpbnQgY2hyb290KGNvbnN0IGNoYXIgKik7CitpbnQgc3ltbGluayhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Cis8Pz4gaW50IHN5bWxpbmthdChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKTsKK2ludCByZWFkbGluayhjb25zdCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KTsKKzw/PiBpbnQgcmVhZGxpbmthdChpbnQsIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQpOworPCFwcGM2ND4gaW50IHN0YXQ2NCxzdGF0OjpzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7Cis8IXBwYzY0PiBpbnQgbHN0YXQ2NCxsc3RhdDo6bHN0YXQoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKKzwhcHBjNjQ+IGludCBmc3RhdDY0LGZzdGF0Ojpmc3RhdChpbnQsIHN0cnVjdCBzdGF0ICopOworPHBwYzY0PiBpbnQgc3RhdDo6c3RhdChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopOworPHBwYzY0PiBpbnQgbHN0YXQ6OmxzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7Cis8cHBjNjQ+IGludCBmc3RhdDo6ZnN0YXQoaW50LCBzdHJ1Y3Qgc3RhdCAqKTsKKy8qIFhYWDogSXMgdGhpcyByaWdodD8hICovCis8Pz4gaW50IGZzdGF0YXQ2NCxuZXdzdGF0YXQsZnN0YXRhdDo6ZnN0YXRhdChpbnQsIGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK2ludCBnZXRkZW50czY0LGdldGRlbnRzOjpnZXRkZW50cyh1bnNpZ25lZCBpbnQsIHN0cnVjdCBkaXJlbnQgKiwgdW5zaWduZWQgaW50KTsKK2ludCBjaG93bjMyLGNob3duOjpjaG93bihjb25zdCBjaGFyICosIHVpZF90LCBnaWRfdCk7CitpbnQgZmNob3duMzIsZmNob3duOjpmY2hvd24oaW50LCB1aWRfdCwgZ2lkX3QpOworPD8+IGludCBmY2hvd25hdChpbnQsIGNvbnN0IGNoYXIgKiwgdWlkX3QsIGdpZF90LCBpbnQpOworaW50IGxjaG93bjMyLGxjaG93bjo6bGNob3duKGNvbnN0IGNoYXIgKiwgdWlkX3QsIGdpZF90KTsKK2ludCBnZXRjd2Q6Ol9fZ2V0Y3dkKGNoYXIgKiwgc2l6ZV90KTsKKzw/PiBpbnQgdXRpbWUoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgdXRpbWJ1ZiAqKTsKKzw/PiBpbnQgdXRpbWVzKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKik7Cis8Pz4gaW50IGZ1dGltZXNhdChpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKik7Cis8Pz4gaW50IGlub3RpZnlfaW5pdCgpOworPD8+IGludCBpbm90aWZ5X2FkZF93YXRjaChpbnQsIGNvbnN0IGNoYXIgKiwgX191MzIpOworPD8+IGludCBpbm90aWZ5X3JtX3dhdGNoKGludCwgX191MzIpOworCisvKgorICogSS9PIG9wZXJhdGlvbnMKKyAqLworPCFpMzg2LDY0PiBpbnQgb3Blbjo6X19vcGVuKGNvbnN0IGNoYXIgKiwgaW50LCBtb2RlX3QpOworPD8haTM4Niw2ND4gaW50IG9wZW5hdDo6X19vcGVuYXQoaW50LCBjb25zdCBjaGFyICosIGludCwgbW9kZV90KTsKKzw2ND4gaW50IG9wZW4oY29uc3QgY2hhciAqLCBpbnQsIG1vZGVfdCk7Citzc2l6ZV90IHJlYWQoaW50LCB2b2lkICosIHNpemVfdCk7Citzc2l6ZV90IHdyaXRlKGludCwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworaW50IGNsb3NlKGludCk7Cis8NjQ+IG9mZl90IGxzZWVrKGludCwgb2ZmX3QsIGludCk7Cis8MzI+IGludCBfbGxzZWVrOjpfX2xsc2VlayhpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIG9mZl90ICosIGludCk7CitpbnQgZHVwKGludCk7CitpbnQgZHVwMihpbnQsIGludCk7Cis8aTM4Nj4gaW50IGZjbnRsNjRAdmFyYWRpYzo6ZmNudGwoaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcpOworPHBwYzY0PiBpbnQgZmNudGwoaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcpOworPCFpMzg2LHBwYzY0PiBpbnQgZmNudGw2NCxmY250bDo6ZmNudGwoaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcpOworaW50IGlvY3RsKGludCwgaW50LCB2b2lkICopOworaW50IGZsb2NrKGludCwgaW50KTsKK2ludCBfbmV3c2VsZWN0LHNlbGVjdDo6c2VsZWN0KGludCwgZmRfc2V0ICosIGZkX3NldCAqLCBmZF9zZXQgKiwgc3RydWN0IHRpbWV2YWwgKik7CisjaWYgZGVmaW5lZChfX05SX3BzZWxlY3QpICYmICFfS0xJQkNfVVNFX1JUX1NJRworaW50IHBzZWxlY3QoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICosIGZkX3NldCAqLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc2lnc2V0X3QgKik7CisjZWxpZiBkZWZpbmVkKF9fTlJfcHNlbGVjdDcpCitpbnQgcHNlbGVjdDc6Ol9fcHNlbGVjdDcoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICosIGZkX3NldCAqLCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc2lnc2V0X3QgKiwgc2l6ZV90KTsKKyNlbGlmIGRlZmluZWQoX19OUl9wc2VsZWN0NikKK2ludCBwc2VsZWN0Njo6X19wc2VsZWN0NihpbnQsIGZkX3NldCAqLCBmZF9zZXQgKiwgZmRfc2V0ICosIHN0cnVjdCB0aW1lc3BlYyAqLCBjb25zdCBzdHJ1Y3QgX19wc2VsZWN0NiAqKTsKKyNlbmRpZgoraW50IHBvbGwoc3RydWN0IHBvbGxmZCAqLCBuZmRzX3QsIGxvbmcpOworPD8+IGludCBwcG9sbDo6X19wcG9sbChzdHJ1Y3QgcG9sbGZkICosIG5mZHNfdCwgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHNpZ3NldF90ICosIHNpemVfdCk7CitpbnQgZnN5bmMoaW50KTsKK2ludCBmZGF0YXN5bmMsZnN5bmM6OmZkYXRhc3luYyhpbnQpOworaW50IHJlYWR2KGludCwgY29uc3Qgc3RydWN0IGlvdmVjICosIGludCk7CitpbnQgd3JpdGV2KGludCwgY29uc3Qgc3RydWN0IGlvdmVjICosIGludCk7CitpbnQgZnRydW5jYXRlNjQsZnRydW5jYXRlOjpmdHJ1bmNhdGUoaW50LCBvZmZfdCk7Citzc2l6ZV90IHByZWFkNjQscHJlYWQ6OnByZWFkKGludCwgdm9pZCAqLCBzaXplX3QsIG9mZl90KTsKK3NzaXplX3QgcHdyaXRlNjQscHdyaXRlOjpwd3JpdGUoaW50LCB2b2lkICosIHNpemVfdCwgb2ZmX3QpOworaW50IHN5bmNfZmlsZV9yYW5nZSxmZGF0YXN5bmMsZnN5bmM6OnN5bmNfZmlsZV9yYW5nZShpbnQsIG9mZl90LCBvZmZfdCwgdW5zaWduZWQgaW50KTsKKzw/PiBpbnQgc3BsaWNlKGludCwgb2ZmX3QgKiwgaW50LCBvZmZfdCAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7Cis8Pz4gaW50IHRlZShpbnQsIGludCwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworc3NpemVfdCBzZW5kZmlsZTY0LHNlbmRmaWxlOjpzZW5kZmlsZShpbnQsIGludCwgb2ZmX3QgKiwgc2l6ZV90LCBvZmZfdCk7CisKKy8qCisgKiBTaWduYWwgb3BlcmF0aW9ucworICoKKyAqIFdlIHJlYWxseSBzaG91bGQgZ2V0IHJpZCBvZiB0aGUgbm9uLXJ0Xyogb2YgdGhlc2UsIGJ1dCB0aGF0IHRha2VzCisgKiBzYW5pdGl6aW5nIDxzaWduYWwuaD4gZm9yIGFsbCBhcmNoaXRlY3R1cmVzLCBzaWdoLiAgU2VlIDxrbGliYy9jb25maWcuaD4uCisgKi8KKyNpZiBfS0xJQkNfVVNFX1JUX1NJRworPCFzcGFyYyxzcGFyYzY0PiBpbnQgcnRfc2lnYWN0aW9uOjpfX3J0X3NpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiwgc3RydWN0IHNpZ2FjdGlvbiAqLCBzaXplX3QpOworPHNwYXJjLHNwYXJjNjQ+IGludCBydF9zaWdhY3Rpb246Ol9fcnRfc2lnYWN0aW9uKGludCwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqLCBzdHJ1Y3Qgc2lnYWN0aW9uICosIHZvaWQgKiwgc2l6ZV90KTsKK2ludCBydF9zaWdzdXNwZW5kOjpfX3J0X3NpZ3N1c3BlbmQoY29uc3Qgc2lnc2V0X3QgKiwgc2l6ZV90KTsKK2ludCBydF9zaWdwZW5kaW5nOjpfX3J0X3NpZ3BlbmRpbmcoc2lnc2V0X3QgKiwgc2l6ZV90KTsKK2ludCBydF9zaWdwcm9jbWFzazo6X19ydF9zaWdwcm9jbWFzayhpbnQsIGNvbnN0IHNpZ3NldF90ICosIHNpZ3NldF90ICosIHNpemVfdCk7Cis8c3BhcmM2ND4gdm9pZCBydF9zaWdyZXR1cm46Ol9fc2lncmV0dXJuKCk7CisjZWxzZQoraW50IHNpZ2FjdGlvbjo6X19zaWdhY3Rpb24oaW50LCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICosIHN0cnVjdCBzaWdhY3Rpb24gKik7CitpbnQgc2lnc3VzcGVuZChjb25zdCBzaWdzZXRfdCAqKTsKK2ludCBzaWdwZW5kaW5nKHNpZ3NldF90ICopOworaW50IHNpZ3Byb2NtYXNrKGludCwgY29uc3Qgc2lnc2V0X3QgKiwgc2lnc2V0X3QgKik7CisjZW5kaWYKK2ludCBraWxsKHBpZF90LCBpbnQpOworPD8+IHVuc2lnbmVkIGludCBhbGFybSh1bnNpZ25lZCBpbnQpOworaW50IGdldGl0aW1lcihpbnQsIHN0cnVjdCBpdGltZXJ2YWwgKik7CitpbnQgc2V0aXRpbWVyKGludCwgY29uc3Qgc3RydWN0IGl0aW1lcnZhbCAqLCBzdHJ1Y3QgaXRpbWVydmFsICopOworCisvKgorICogVGltZS1yZWxhdGVkIHN5c3RlbSBjYWxscworICovCis8Pz4gdGltZV90IHRpbWUodGltZV90ICopOworY2xvY2tfdCB0aW1lcyhzdHJ1Y3QgdG1zICopOworaW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqLCBzdHJ1Y3QgdGltZXpvbmUgKik7CitpbnQgc2V0dGltZW9mZGF5KGNvbnN0IHN0cnVjdCB0aW1ldmFsICosIGNvbnN0IHN0cnVjdCB0aW1lem9uZSAqKTsKK2ludCBuYW5vc2xlZXAoY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIHN0cnVjdCB0aW1lc3BlYyAqKTsKKzw/PiBpbnQgcGF1c2UoKTsKKworLyoKKyAqIE1lbW9yeQorICovCis8Pz4gdm9pZCAqIGJyazo6X19icmsodm9pZCAqKTsKK2ludCBtdW5tYXAodm9pZCAqLCBzaXplX3QpOwordm9pZCAqIG1yZW1hcCh2b2lkICosIHNpemVfdCwgc2l6ZV90LCB1bnNpZ25lZCBsb25nKTsKK2ludCBtc3luYyhjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKK2ludCBtcHJvdGVjdChjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKKyMgaWYgX0tMSUJDX1VTRV9NTUFQMgorPCFzMzkwPiB2b2lkICogbW1hcDI6Ol9fbW1hcDIodm9pZCAqLCBzaXplX3QsIGludCwgaW50LCBpbnQsIGxvbmcpOworIyBlbHNlCis8IXMzOTB4PiB2b2lkICogbW1hcCh2b2lkICosIHNpemVfdCwgaW50LCBpbnQsIGludCwgbG9uZyk7CitpbnQgbWxvY2thbGwoaW50KTsKK2ludCBtdW5sb2NrYWxsKCk7CitpbnQgbWxvY2soY29uc3Qgdm9pZCAqLCBzaXplX3QpOworaW50IG11bmxvY2soY29uc3Qgdm9pZCAqLCBzaXplX3QpOworI2VuZGlmCisKKy8qCisgKiBTeXN0ZW0gc3R1ZmYKKyAqLworaW50IHVuYW1lKHN0cnVjdCB1dHNuYW1lICopOworaW50IHNldGRvbWFpbm5hbWUoY29uc3QgY2hhciAqLCBzaXplX3QpOworaW50IHNldGhvc3RuYW1lKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK2xvbmcgaW5pdF9tb2R1bGUodm9pZCAqLCB1bnNpZ25lZCBsb25nLCBjb25zdCBjaGFyICopOworbG9uZyBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KTsKK2ludCByZWJvb3Q6Ol9fcmVib290KGludCwgaW50LCBpbnQsIHZvaWQgKik7CitpbnQgc3lzbG9nOjprbG9nY3RsKGludCwgY2hhciAqLCBpbnQpOworaW50IHN5c2luZm8oc3RydWN0IHN5c2luZm8gKik7CisKKy8qCisgKiBMb3ctbGV2ZWwgSS9PIChnZW5lcmFsbHkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljKTsKKyAqLworPGkzODYseDg2XzY0PiBpbnQgaW9wbChpbnQpOworPGkzODYseDg2XzY0PiBpbnQgaW9wZXJtKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCk7Cis8aTM4Nj4gaW50IHZtODYoc3RydWN0IHZtODZfc3RydWN0ICopOworCisvKgorICogTW9zdCBhcmNoaXRlY3R1cmVzIGhhdmUgdGhlIHNvY2tldCBpbnRlcmZhY2VzIHVzaW5nIHJlZ3VsYXIKKyAqIHN5c3RlbSBjYWxscy4KKyAqLworPD8haTM4Nj4gbG9uZyBzb2NrZXRjYWxsOjpfX3NvY2tldGNhbGwoaW50LCBjb25zdCB1bnNpZ25lZCBsb25nICopOworI2luY2x1ZGUgIlNPQ0tFVENBTExTLmRlZiIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9fX3B1dF9lbnYuYyBiL3Vzci9rbGliYy9fX3B1dF9lbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQ0MTVjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL19fcHV0X2Vudi5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBfX3B1dF9lbnYuYyAtIGNvbW1vbiBjb2RlIGZvciBwdXRlbnYoKSBhbmQgc2V0ZW52KCkKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJlbnYuaCIKKworc3RhdGljIHNpemVfdCBfX2Vudmlyb25fc2l6ZTsKK3N0YXRpYyBjaGFyICoqX19lbnZpcm9uX2FsbG9jOworCisvKiBzdHIgc2hvdWxkIGJlIGEgZHVwbGljYXRlZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dCBzdHJpbmc7CisgICBsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGluY2x1ZGluZyB0aGUgPSBzaWduICovCisKK2ludCBfX3B1dF9lbnYoY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgb3ZlcndyaXRlKQoreworCXN0YXRpYyBjaGFyICpjb25zdCBudWxsX2Vudmlyb24gPSB7IE5VTEwgfTsKKwljaGFyICoqcCwgKnE7CisJY2hhciAqKm5ld2VudjsKKwlzaXplX3QgbjsKKworCWlmICghZW52aXJvbikKKwkJZW52aXJvbiA9IChjaGFyICoqKW51bGxfZW52aXJvbjsKKworCW4gPSAxOwkJCS8qIEluY2x1ZGUgc3BhY2UgZm9yIGZpbmFsIE5VTEwgKi8KKwlmb3IgKHAgPSBlbnZpcm9uOyAocSA9ICpwKTsgcCsrKSB7CisJCW4rKzsKKwkJaWYgKCFzdHJuY21wKHEsIHN0ciwgbGVuKSkgeworCQkJaWYgKCFvdmVyd3JpdGUpCisJCQkJZnJlZShzdHIpOworCQkJZWxzZQorCQkJCSpwID0gc3RyOwkvKiBQb3NzaWJsZSBtZW1vcnkgbGVhay4uLiAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoX19lbnZpcm9uX2FsbG9jICYmIGVudmlyb24gIT0gX19lbnZpcm9uX2FsbG9jKSB7CisJCWZyZWUoX19lbnZpcm9uX2FsbG9jKTsKKwkJX19lbnZpcm9uX2FsbG9jID0gTlVMTDsKKwl9CisKKwkvKiBOZWVkIHRvIGV4dGVuZCB0aGUgZW52aXJvbm1lbnQgKi8KKwlpZiAobiA8IF9fZW52aXJvbl9zaXplKSB7CisJCXBbMV0gPSBOVUxMOworCQkqcCA9IHN0cjsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKF9fZW52aXJvbl9hbGxvYykgeworCQkJbmV3ZW52ID0KKwkJCSAgICByZWFsbG9jKF9fZW52aXJvbl9hbGxvYywKKwkJCQkgICAgKF9fZW52aXJvbl9zaXplIDw8IDEpICogc2l6ZW9mKGNoYXIgKikpOworCQkJaWYgKCFuZXdlbnYpCisJCQkJcmV0dXJuIC0xOworCisJCQlfX2Vudmlyb25fc2l6ZSA8PD0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGhvdyBtdWNoIG1vcmUgc3BhY2UKKwkJCSAgIHdlIG5lZWQgKi8KKwkJCXNpemVfdCBuZXdzaXplID0gbiArIDMyOworCQkJbmV3ZW52ID0gbWFsbG9jKG5ld3NpemUgKiBzaXplb2YoY2hhciAqKSk7CisJCQlpZiAoIW5ld2VudikKKwkJCQlyZXR1cm4gLTE7CisKKwkJCW1lbWNweShuZXdlbnYsIGVudmlyb24sIG4gKiBzaXplb2YoY2hhciAqKSk7CisJCQlfX2Vudmlyb25fc2l6ZSA9IG5ld3NpemU7CisJCX0KKwkJbmV3ZW52W24tMV0gPSBzdHI7CS8qIE9sZCBOVUxMIHBvc2l0aW9uICovCisJCW5ld2VudltuXSAgID0gTlVMTDsKKwkJZW52aXJvbgk9IG5ld2VudjsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvX19zaGFyZWRfaW5pdC5jIGIvdXNyL2tsaWJjL19fc2hhcmVkX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTJhM2RiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL19fc2hhcmVkX2luaXQuYwpAQCAtMCwwICsxLDIgQEAKKyNkZWZpbmUgU0hBUkVEIDEKKyNpbmNsdWRlICJsaWJjX2luaXQuYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9fX3NpZ25hbC5jIGIvdXNyL2tsaWJjL19fc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NGI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9fX3NpZ25hbC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBfX3NpZ25hbC5jCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCitfX3NpZ2hhbmRsZXJfdCBfX3NpZ25hbChpbnQgc2lnbnVtLCBfX3NpZ2hhbmRsZXJfdCBoYW5kbGVyLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCXNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCXNhLnNhX2ZsYWdzID0gZmxhZ3M7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCisJaWYgKHNpZ2FjdGlvbihzaWdudW0sICZzYSwgJnNhKSkgeworCQlyZXR1cm4gKF9fc2lnaGFuZGxlcl90KSBTSUdfRVJSOworCX0gZWxzZSB7CisJCXJldHVybiAoX19zaWdoYW5kbGVyX3QpIHNhLnNhX2hhbmRsZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL19fc3RhdGljX2luaXQuYyBiL3Vzci9rbGliYy9fX3N0YXRpY19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OWVlZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9fX3N0YXRpY19pbml0LmMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFNIQVJFRCAwCisjaW5jbHVkZSAibGliY19pbml0LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYWJvcnQuYyBiL3Vzci9rbGliYy9hYm9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjlhMTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYWJvcnQuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogYWJvcnQuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKwordm9pZCBhYm9ydCh2b2lkKQoreworCXNpZ3NldF90IHNldDsKKworCXNpZ2VtcHR5c2V0KCZzZXQpOworCXNpZ2FkZHNldCgmc2V0LCBTSUdBQlJUKTsKKwlzaWdwcm9jbWFzayhTSUdfVU5CTE9DSywgJnNldCwgTlVMTCk7CisJcmFpc2UoU0lHQUJSVCk7CisJX2V4aXQoMjU1KTsJCS8qIHJhaXNlKCkgc2hvdWxkIGhhdmUga2lsbGVkIHVzICovCit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYWxhcm0uYyBiL3Vzci9rbGliYy9hbGFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDc0YzUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYWxhcm0uYwpAQCAtMCwwICsxLDI1IEBACisvKgorICogYWxhcm0uYworICovCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZm5kZWYgX19OUl9hbGFybQorCisvKiBFbXVsYXRlIGFsYXJtKCkgdmlhIHNldGl0aW1lcigpICovCisKK3Vuc2lnbmVkIGludCBhbGFybSh1bnNpZ25lZCBpbnQgc2Vjb25kcykKK3sKKwlzdHJ1Y3QgaXRpbWVydmFsIGl2OworCisJaXYuaXRfaW50ZXJ2YWwudHZfc2VjID0gaXYuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDA7CisJaXYuaXRfdmFsdWUudHZfc2VjID0gc2Vjb25kczsKKwlpdi5pdF92YWx1ZS50dl91c2VjID0gMDsKKworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJml2LCAmaXYpOworCisJcmV0dXJuIGl2Lml0X3ZhbHVlLnR2X3NlYyArIChpdi5pdF92YWx1ZS50dl91c2VjID8gMSA6IDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL1JFQURNRSBiL3Vzci9rbGliYy9hcmNoL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjJiOWQzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvUkVBRE1FCkBAIC0wLDAgKzEsODEgQEAKK1RvIHBvcnQga2xpYmMgdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLCB5b3UgbmVlZDoKKworYSkgQSBkaXJlY3Rvcnkgc3RydWN0dXJlCisKK0VhY2ggYXJjaHRlY3R1cmUgaGFzIGEga2xpYmMvYXJjaC8gZGlyZWN0b3J5LCB3aGljaCBzaG91bGQgaW5jbHVkZSBhbgorTUNPTkZJRyBhbmQgYSBNYWtlZmlsZS5pbmMgZmlsZSwgYW5kIGFuIGluY2x1ZGUvYXJjaC8gZGlyZWN0b3J5LCB3aGljaAoraW5jbHVkZXMgc29tZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaGVhZGVyIGZpbGVzLCBpbmNsdWRpbmcKK2tsaWJjL2FyY2hjb25maWcuaC4KKworCitiKSBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICAgKGluY2x1ZGUvYXJjaC8qL2tsaWJjL3N5c2NvbmZpZy5oKQorCitUaGlzIGZpbGUgY2FuIHNldCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmcm9tCitpbmNsdWRlL2tsaWJjL3N5c2NvbmZpZy5oLgorCisKK2MpIFN0YXJ0dXAgY29kZQorICAgKGtsaWJjL2FyY2gvKi9jcnQwLlMpCisKK1RoZSBjcnQwLlMgYXNzZW1ibHkgcm91dGluZSB0eXBpY2FsbHkgY29ycmVzcG9uZHMgdG8gdGhlIGZvbGxvd2luZworcHNldWRvLUMgY29kZS4gIEluIGFkZGl0aW9uLCBlYWNoIGFyY2hpdGVjdHVyZSBuZWVkcyBhbnkgc3VwcG9ydAorcm91dGluZXMgdGhhdCBnY2MtZ2VuZXJhdGVkIGNvZGUgZXhwZWN0cyB0byBmaW5kIGluIHRoZSBzeXN0ZW0gbGlicmFyeQorLS0gQWxwaGEsIGZvciBleGFtcGxlLCBuZWVkcyBkaXZpZGUgc3Vicm91dGluZXMuCisKK1RoZSAiZ2V0ZW52dGVzdCIgdGVzdCBwcm9ncmFtIGlzIGEgdmVyeSBnb29kIHRlc3QgZm9yIHByb3BlciBjcnQwLlMKK2Z1bmN0aW9uYWxpdHkuCisKKworZXh0ZXJuIF9fbm9yZXR1cm4gX19saWJjX2luaXQodm9pZCAqLCB2b2lkICopOworCitfX25vcmV0dXJuIF9zdGFydCh2b2lkKQoreworICB2b2lkICplbGZfZGF0YSAgID0gZ2V0X2VsZl9kYXRhX2FkZHJlc3MoKTsgLyogVXN1YWxseSB0aGUgc3RhY2sgYWRkcmVzcyAqLworICB2b2lkICphdGV4aXRfcHRyID0gZ2V0X2F0ZXhpdF9wdHIoKTsgICAgICAgLyogVXN1YWxseSBpbiBhIHJlZ2lzdGVyICovCisKKyAgLyogU29tZSBhcmNoaXRlY3R1cmVzIG5lZWQgdGhpcyBmb3IgZGVidWdnaW5nIHRvIHdvcmsgKi8KKyAgc2V0dXBfbnVsbF9zdGFja19mcmFtZV9pZl9uZWNlc3NhcnkoKTsKKworICBfX2xpYmNfaW5pdChlbGZfZGF0YSwgYXRleGl0X3B0cik7Cit9CisKKworZCkgQSBzZXRlbnYgaW1wbGVtZW50YXRpb24KKyAgIChrbGliYy9hcmNoLyovc2V0am1wLlMsIGluY2x1ZGUvYXJjaC8qa2xpYmMvYXJjaHNldGptcC5oKQorCitPbiBtb3N0IChidXQgbm90IGFsbCEpIGFyY2hpdGVjdHVyZXMsIHRoaXMgZW50YWlscyBjcmVhdGluZyBhIHNldGptcAorYnVmZmVyIGJpZyBlbm91Z2ggdG8gaG9sZCBhbGwgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycywgcGx1cyB0aGUgc3RhY2sKK3BvaW50ZXIgYW5kIHRoZSByZXR1cm4gYWRkcmVzcy4gIEluIHNldGptcC5TIHlvdSBoYXZlOgorCisqIEEgInNldGptcCIgZnVuY3Rpb24gdGhhdCB3cml0ZXMgb3V0IHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLCB0aGUKKyAgc3RhY2sgcG9pbnRlciBhbmQgdGhlIHJldHVybiBhZGRyZXNzIHRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUKKyAgZmlyc3QgYXJndW1lbnQsIGFuZCB0aGVuIHJldHVybnMgemVybyBub3JtYWxseS4KKworICBPbiBzb21lIGFyY2hpdGVjdHVyZXMgeW91IG5lZWQgdG8gdGFrZSBzb21lIGtpbmQgb2YgYWN0aW9uIHRvIG1ha2UKKyAgc3VyZSB0aGUgY29udGVudHMgb2YgdGhlIHN0YWNrIGlzIGFjdHVhbGx5IG1hbmlmZXN0IGluIG1lbW9yeSBhbmQKKyAgbm90IGNhY2hlZCBpbiB0aGUgQ1BVLiAgSW4gc29tZSBjYXNlcyAoZS5nLiBvbiBTUEFSQykgdGhpcyB3aWxsCisgIGF1dG9tYXRpY2FsbHkgc3BpbGwgdGhlIHJlZ2lzdGVycyBvbnRvIHRoZSBzdGFjazsgdGhlbiB0aGV5IGRvbid0CisgIG5lZWQgdG8gYmUgc3BpbGxlZCBpbnRvIHRoZSBqbXBfYnVmLgorCisqIEEgImxvbmdqbXAiIGZ1bmN0aW9uIHRoYXQgcmVhZCBiYWNrIHRoZXNlIHNhbWUgcmVnaXN0ZXJzIGZyb20gdGhlCisgIGptcF9idWYgcG9pbnRlZCB0byBieSB0aGUgZmlyc3QgYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBzZWNvbmQKKyAgYXJndW1lbnQgKnRvIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgam1wX2J1ZiouCisKKyAgT24gc29tZSBhcmNoaXRlY3R1cmVzIHlvdSBuZWVkIHRvIHRha2Ugc29tZSBraW5kIG9mIGFjdGlvbiB0byBmbHVzaAorICBhbnkgY2FjaGVkIHN0YWNrIGRhdGEgb3IgcmV0dXJuIHN0YWNrLgorCisKK2UpIEFueSBzdXBwb3J0IGZ1bmN0aW9ucyBuZWVkZWQgYnkgZ2NjLCAqdW5sZXNzKiB0aGV5IGFyZSBpbiBsaWJnY2MKKyAgKmFuZCogbGliZ2NjIGlzIHVzYWJsZSBmb3Iga2xpYmMgb24geW91ciBwYXJ0aWN1bGFyIHBsYXRmb3JtLiAgSWYKKyAgbGliZ2NjIGlzbid0IHVzYWJsZSBmb3Iga2xpYmMgKG9uIE1JUFMsIGZvciBleGFtcGxlLCBsaWJnY2MgaXMKKyAgY29tcGlsZWQgaW4gYSB3YXkgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGtsaWJjKSB0aGVyZSBhcmUKKyAgcmVhc29uYWJseSBnb29kIGNsb25lcyBvZiBtb3N0IG9mIHRoZSBsaWJnY2MgZnVuY3Rpb25zIGluIHRoZSBsaWJnY2MKKyAgZGlyZWN0b3J5LiAgVG8gdXNlIHRoZW0sIGFkZCB0aGVtIHRvIEFSQ0hPQkpTIGluCisgIGtsaWJjL2FyY2gvKi9NYWtlZmlsZS5pbmMuCisKKworZikgQSBsaW5rIGxvY2F0aW9uIGZvciB0aGUgc2hhcmVkIGtsaWJjLiAgVGhpcyBzaG91bGQgYmUgc3BlY2lmaWVkIGluCisgIFNIQVJFREZMQUdTIGluIGtsaWJjL2FyY2gvKi9NQ09ORklHLgorCisgIFRoaXMgaXMgbm90IGFwcGxpY2FibGUgdG8gbm8tTU1VIGFyY2hpdGVjdHVyZXMuCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hbHBoYS9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMzBmMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL0tidWlsZApAQCAtMCwwICsxLDUyIEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9hbHBoYS9NYWtlZmlsZS5pbmMKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KK2tsaWIteSA6PSBwaXBlLm8gc2V0am1wLm8gc3lzY2FsbC5vIHN5c2R1YWwubworCisjIFNwZWNpYWwgQ0ZMQUdTIGZvciB0aGUgZGl2aWRlIGNvZGUKK0RJVkNGTEFHUyA9ICQoS0xJQkNSRVFGTEFHUykgJChLTElCQ0FSQ0hSRVFGTEFHUykgXAorCS1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciAtZmNhbGwtc2F2ZWQtMSAtZmNhbGwtc2F2ZWQtMiBcCisJLWZjYWxsLXNhdmVkLTMgLWZjYWxsLXNhdmVkLTQgLWZjYWxsLXNhdmVkLTUgLWZjYWxsLXNhdmVkLTYgXAorCS1mY2FsbC1zYXZlZC03IC1mY2FsbC1zYXZlZC04IC1mZml4ZWQtMTUgLWZjYWxsLXNhdmVkLTE2IFwKKwktZmNhbGwtc2F2ZWQtMTcgLWZjYWxsLXNhdmVkLTE4IC1mY2FsbC1zYXZlZC0xOSAtZmNhbGwtc2F2ZWQtMjAgXAorCS1mY2FsbC1zYXZlZC0yMSAtZmNhbGwtc2F2ZWQtMjIgLWZmaXhlZC0yMyAtZmNhbGwtc2F2ZWQtMjQgXAorCS1mZml4ZWQtMjUgLWZmaXhlZC0yNworCitkaXYtb2JqcyA6PSBfX2RpdnF1Lm8gX19yZW1xdS5vIF9fZGl2cS5vIF9fcmVtcS5vCitkaXYtb2JqcyArPSBfX2Rpdmx1Lm8gX19yZW1sdS5vIF9fZGl2bC5vIF9fcmVtbC5vCitrbGliLXkgKz0gJChkaXYtb2JqcykKKworcXVpZXRfY21kX3JlZ3N3YXAgPSBSRUdTV0FQICRACisgICAgICBjbWRfcmVnc3dhcCA9IHNlZCAtZSAncy9cJCQwXGIvJCQyNy9nJyAgLWUgJ3MvXCQkMjRcYi8kJDk5L2cnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1lICdzL1wkJDE2XGIvJCQyNC9nJyAtZSAncy9cJCQxN1xiLyQkMjUvZycgXAorICAgICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvXCQkMjZcYi8kJDIzL2cnIC1lICdzL1wkJDk5XGIvJCQxNi9nJyA8ICQ8ID4gJEAKKworIyBVc2Ugc3RhdGljIHBhdHRlcm4gcnVsZSB0byBhdm9pZCB1c2luZyBhIHRlbXBvcmFyeSBmaWxlCiskKGFkZHByZWZpeCAkKG9iaikvLCQoZGl2LW9ianM6Lm89LlMpKTogJChvYmopLyUuUzogJChvYmopLyUuc3MKKwkkKGNhbGwgaWZfY2hhbmdlZCxyZWdzd2FwKQorCitxdWlldF9jbWRfZ2Vuc3MgPSBESVYtQ0MgICRACisgICAgICBjbWRfZ2Vuc3MgPSAkKENDKSAkKERJVkNGTEFHUykgJChGSUxFX0NGTEFHUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgLUROQU1FPSQoYmFzZW5hbWUgJChub3RkaXIgJEApKSAtUyAtbyAkQCAkPAorCiskKG9iaikvJS5zczogJChvYmopL2RpdmlkZS5jCisJJChjYWxsIGlmX2NoYW5nZWQsZ2Vuc3MpCisKKyQob2JqKS9fX2RpdnF1LnNzOiBGSUxFX0NGTEFHUyA6PSAtRFNJR05FRD0wIC1EUkVNPTAgLURCSVRTPTY0CiskKG9iaikvX19yZW1xdS5zczogRklMRV9DRkxBR1MgOj0gLURTSUdORUQ9MCAtRFJFTT0xIC1EQklUUz02NAorJChvYmopL19fZGl2cS5zczogIEZJTEVfQ0ZMQUdTIDo9IC1EU0lHTkVEPTEgLURSRU09MCAtREJJVFM9NjQKKyQob2JqKS9fX3JlbXEuc3M6ICBGSUxFX0NGTEFHUyA6PSAtRFNJR05FRD0xIC1EUkVNPTEgLURCSVRTPTY0CiskKG9iaikvX19kaXZsdS5zczogRklMRV9DRkxBR1MgOj0gLURTSUdORUQ9MCAtRFJFTT0wIC1EQklUUz0zMgorJChvYmopL19fcmVtbHUuc3M6IEZJTEVfQ0ZMQUdTIDo9IC1EU0lHTkVEPTAgLURSRU09MSAtREJJVFM9MzIKKyQob2JqKS9fX2Rpdmwuc3M6ICBGSUxFX0NGTEFHUyA6PSAtRFNJR05FRD0xIC1EUkVNPTAgLURCSVRTPTMyCiskKG9iaikvX19yZW1sLnNzOiAgRklMRV9DRkxBR1MgOj0gLURTSUdORUQ9MSAtRFJFTT0xIC1EQklUUz0zMgorCit0YXJnZXRzICAgICArPSAkKGRpdi1vYmpzOi5vPS5TKSAkKGRpdi1vYmpzOi5vPS5zcykKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FscGhhL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZGM2MWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9NQ09ORklHCkBAIC0wLDAgKzEsMTYgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL2FscGhhL01DT05GSUcKKyMKKyMgQnVpbGQgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMKKworS0xJQkNPUFRGTEFHUyArPSAtT3MKK0tMSUJDQklUU0laRSAgPSA2NAorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyA3IEdCIC0gbm9ybWFsIGJpbmFyaWVzIHN0YXJ0IGF0IDQuNSBHQiwgYW5kIHRoZSBzdGFjayBpcyBiZWxvdworIyB0aGUgYmluYXJ5LgorS0xJQkNTSEFSRURGTEFHUwk9IC1UdGV4dCAweDFjMDAwMDIwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvUkVBRE1FLWdjYyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL1JFQURNRS1nY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwMDUyZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL1JFQURNRS1nY2MKQEAgLTAsMCArMSwyMiBAQAorICAgVGhlIGN1cnJlbnQgQWxwaGEgY2hpcHMgZG9uJ3QgcHJvdmlkZSBoYXJkd2FyZSBmb3IgaW50ZWdlcgorICAgZGl2aXNpb24uICBUaGUgQyBjb21waWxlciBleHBlY3RzIHRoZSBmdW5jdGlvbnMKKworICAgICAgICBfX2RpdnF1OiA2NC1iaXQgdW5zaWduZWQgbG9uZyBkaXZpZGUKKyAgICAgICAgX19yZW1xdTogNjQtYml0IHVuc2lnbmVkIGxvbmcgcmVtYWluZGVyCisgICAgICAgIF9fZGl2cS9fX3JlbXE6ICAgc2lnbmVkIDY0LWJpdAorICAgICAgICBfX2Rpdmx1L19fcmVtbHU6IHVuc2lnbmVkIDMyLWJpdAorICAgICAgICBfX2RpdmwvX19yZW1sOiAgIHNpZ25lZCAzMi1iaXQKKworICAgVGhlc2UgYXJlIG5vdCBub3JtYWwgQyBmdW5jdGlvbnM6IGluc3RlYWQgb2YgdGhlIG5vcm1hbCBjYWxsaW5nCisgICBzZXF1ZW5jZSwgdGhlc2UgZXhwZWN0IHRoZWlyIGFyZ3VtZW50cyBpbiByZWdpc3RlcnMgdDEwIGFuZCB0MTEsIGFuZAorICAgcmV0dXJuIHRoZSByZXN1bHQgaW4gdDEyIChha2EgcHYpLiAgUmVnaXN0ZXIgQVQgbWF5IGJlIGNsb2JiZXJlZAorICAgKGFzc2VtYmx5IHRlbXBvcmFyeSksIGFueXRoaW5nIGVsc2UgbXVzdCBiZSBzYXZlZC4KKworICAgRnVydGhlcm1vcmUsIHRoZSByZXR1cm4gYWRkcmVzcyBpcyBpbiB0OSBpbnN0ZWFkIG9mIHJhLgorCisgICBOb3JtYWwgZnVuY3Rpb24JRGl2aWRlIGZ1bmN0aW9ucworICAgLS0tLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0KKyAgIHYwICgkMCkJCXQxMi9wdiAoJDI3KQorICAgYTAgKCQxNikJCXQxMCAoJDI0KQorICAgYTEgKCQxNykJCXQxMSAoJDI1KQorICAgcmEgKCQyNikJCXQ5ICgkMjMpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hbHBoYS9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyYmFiYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL2NydDAuUwpAQCAtMCwwICsxLDIyIEBACisjCisjIGFyY2gvYWxwaGEvY3J0MC5TCisjCisKKwkudGV4dAorCS50eXBlCV9zdGFydCxAZnVuY3Rpb24KKwkuZW50CV9zdGFydCwgMAorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwkuZnJhbWUgICQzMCwgMCwgJDI2LCAwCisJbW92CSQzMSwgJDE1CisJYnIJJDI5LCAxZgorMToJbGRncAkkMjksIDAoJDI5KQorCS5wcm9sb2d1ZSAwCisKKwlsZGEJJDE2LCAwKCQzMCkJCSMgRUxGIGRhdGEgc3RydWN0dXJlCisJbGRhCSQxNywgMCgkMCkJCSMgYXRleGl0IHBvaW50ZXIKKworCWpzcgkkMjYsIF9fbGliY19pbml0CisKKwkuc2l6ZQlfc3RhcnQsLi1fc3RhcnQKKwkuZW5kCV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvZGl2aWRlLmMgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9kaXZpZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQyNTRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvZGl2aWRlLmMKQEAgLTAsMCArMSw1OSBAQAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGFzbS9nZW50cmFwLmg+CisjaW5jbHVkZSA8YXNtL3BhbC5oPgorCisjaWYgQklUUyA9PSA2NAordHlwZWRlZiB1aW50NjRfdCB1aW50OwordHlwZWRlZiBpbnQ2NF90IHNpbnQ7CisjZWxzZQordHlwZWRlZiB1aW50MzJfdCB1aW50OwordHlwZWRlZiBpbnQzMl90IHNpbnQ7CisjZW5kaWYKKworI2lmZGVmIFNJR05FRAordHlwZWRlZiBzaW50IHhpbnQ7CisjZWxzZQordHlwZWRlZiB1aW50IHhpbnQ7CisjZW5kaWYKKworeGludCBOQU1FKHVpbnQgbnVtLCB1aW50IGRlbikKK3sKKwl1aW50IHF1b3QgPSAwLCBxYml0ID0gMTsKKwlpbnQgbWludXMgPSAwOworCXhpbnQgdjsKKworCWlmIChkZW4gPT0gMCkgeworCQkvKiBUaGlzIGlzIHJlYWxseSAkMTYsIGJ1dCAkMTYgYW5kICQyNCBhcmUgZXhjaGFuZ2VkIGJ5IGEgc2NyaXB0ICovCisJCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY2F1c2UgYXNtKCIkMjQiKSA9IEdFTl9JTlRESVY7CisJCWFzbSB2b2xhdGlsZSAoImNhbGxfcGFsICUwIjo6ImkiIChQQUxfZ2VudHJhcCksICJyIihjYXVzZSkpOworCQlyZXR1cm4gMDsJLyogSWYgdHJhcCByZXR1cm5zLi4uICovCisJfQorI2lmIFNJR05FRAorCWlmICgoc2ludCkgKG51bSBeIGRlbikgPCAwKQorCQltaW51cyA9IDE7CisJaWYgKChzaW50KSBudW0gPCAwKQorCQludW0gPSAtbnVtOworCWlmICgoc2ludCkgZGVuIDwgMCkKKwkJZGVuID0gLWRlbjsKKyNlbmRpZgorCisJLyogTGVmdC1qdXN0aWZ5IGRlbm9taW5hdG9yIGFuZCBjb3VudCBzaGlmdCAqLworCXdoaWxlICgoc2ludCkgZGVuID49IDApIHsKKwkJZGVuIDw8PSAxOworCQlxYml0IDw8PSAxOworCX0KKworCXdoaWxlIChxYml0KSB7CisJCWlmIChkZW4gPD0gbnVtKSB7CisJCQludW0gLT0gZGVuOworCQkJcXVvdCArPSBxYml0OworCQl9CisJCWRlbiA+Pj0gMTsKKwkJcWJpdCA+Pj0gMTsKKwl9CisKKwl2ID0gKHhpbnQpIChSRU0gPyBudW0gOiBxdW90KTsKKwlpZiAobWludXMpCisJCXYgPSAtdjsKKwlyZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FscGhhL3BpcGUuUyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL3BpcGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTcyNDEzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYWxwaGEvcGlwZS5TCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgYXJjaC9hbHBoYS9waXBlLlMKKyMKKworIworIyBwaXBlKCkgb24gYWxwaGEgcmV0dXJucyBib3RoIGZpbGUgZGVzY3JpcHRvcnMgaW4gcmVnaXN0ZXJzIC0tCisjICQwICh2MCkgYW5kICQyMCAoYTQpIHJlc3BlY3RpdmVseS4gIFRoaXMgaXMgdW5saWtlIGFueSBvdGhlciBzeXN0ZW0gY2FsbCwKKyMgYXMgZmFyIGFzIEkgY2FuIHRlbGwuCisjCisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworCS50ZXh0CisJLmFsaWduCTMKKwkudHlwZQlwaXBlLCBAZnVuY3Rpb24KKwkuZW50CXBpcGUsIDAKKwkuZ2xvYmwJcGlwZQorcGlwZToKKwkuZnJhbWUJc3AsMCxyYSwwCisJbGRhCXYwLCBfX05SX3BpcGUKKwljYWxsc3lzCisJYmVxCWEzLCAxZgorCWJyCXB2LCAyZgkJCSMgcHYgPC0gcGMKKzI6CisJbGRncAlncCwgMChwdikKKwlsZGEJYTEsIGVycm5vCisJbGRhCXYwLCAtMSh6ZXJvKQorCXN0bAlhMywgMChhMSkKKwlyZXQJemVybywocmEpLDEKKzE6CisJc3RsCXYwLCAwKGEwKQorCWxkYQl2MCwgMAorCXN0bAlhNCwgNChhMCkKKwlyZXQJemVybywocmEpLDEKKworCS5zaXplCXBpcGUsLi1waXBlCisJLmVuZAlwaXBlCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hbHBoYS9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjA0YmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zZXRqbXAuUwpAQCAtMCwwICsxLDc1IEBACisjCisjIHNldGptcC5TCisjCisKKyMKKyMgVGhlIGptcF9idWYgbG9va3MgbGlrZToKKyMKKyMJczAuLjUKKyMJZnAKKyMJcmEKKyMJZ3AKKyMJc3AKKyMKKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKKwkudGV4dAorCS5hbGlnbgkzCisJLnR5cGUJc2V0am1wLEBmdW5jdGlvbgorCS5lbnQJc2V0am1wLCAwCisJLmdsb2JsCXNldGptcAorc2V0am1wOgorCWxkYQl2MCwgICAwKHplcm8pCisJc3RxCXMwLCAgIDAoYTApCisJc3RxCXMxLCAgIDgoYTApCisJc3RxCXMyLCAgMTYoYTApCisJc3RxCXMzLCAgMjQoYTApCisJc3RxCXM0LCAgMzIoYTApCisJc3RxCXM1LCAgNDAoYTApCisJc3RxCWZwLCAgNDgoYTApCisJc3RxCXJhLCAgNTYoYTApCisJc3RxCWdwLCAgNjQoYTApCisJc3RxCXNwLCAgNzIoYTApCisJc3R0CSRmMiwgIDgwKGEwKQorCXN0dAkkZjMsICA4OChhMCkKKwlzdHQJJGY0LCAgOTYoYTApCisJc3R0CSRmNSwgMTA0KGEwKQorCXN0dAkkZjYsIDExMihhMCkKKwlzdHQJJGY3LCAxMjAoYTApCisJc3R0CSRmOCwgMTI4KGEwKQorCXN0dAkkZjksIDEzNihhMCkKKwlyZXQJemVybywocmEpLDEKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCS5lbmQgc2V0am1wCisKKwkudHlwZQlsb25nam1wLEBmdW5jdGlvbgorCS5lbnQJbG9uZ2ptcCwgMAorCS5nbG9ibAlsb25nam1wCitsb25nam1wOgorCW1vdglhMSwgdjAKKwlsZHEJczAsICAgMChhMCkKKwlsZHEJczEsICAgOChhMCkKKwlsZHEJczIsICAxNihhMCkKKwlsZHEJczMsICAyNChhMCkKKwlsZHEJczQsICAzMihhMCkKKwlsZHEJczUsICA0MChhMCkKKwlsZHEJZnAsICA0OChhMCkKKwlsZHEJcmEsICA1NihhMCkKKwlsZHEJZ3AsICA2NChhMCkKKwlsZHEJc3AsICA3MihhMCkKKwlsZHQJJGYyLCAgODAoYTApCisJbGR0CSRmMywgIDg4KGEwKQorCWxkdAkkZjQsICA5NihhMCkKKwlsZHQJJGY1LCAxMDQoYTApCisJbGR0CSRmNiwgMTEyKGEwKQorCWxkdAkkZjcsIDEyMChhMCkKKwlsZHQJJGY4LCAxMjgoYTApCisJbGR0CSRmOSwgMTM2KGEwKQorCS8qIFdlJ3JlIGJvdW5kIHRvIGdldCBhIG1pc3ByZWRpY3QgaGVyZSwgYnV0IGF0IGxlYXN0IGdpdmUgdXMKKwkgICBhIGNoYW5jZSB0byBnZXQgdGhlIHJldHVybiBzdGFjayBiYWNrIGluIHN5bmMuLi4gKi8KKwlyZXQJemVybywocmEpLDEKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCisJLmVuZCBsb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2OWVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL3N5c2NhbGwuUwpAQCAtMCwwICsxLDI2IEBACisjCisjIGFyY2gvYWxwaGEvc3lzY2FsbC5TCisjCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCisJLnRleHQKKwkuYWxpZ24JMworCS50eXBlCV9fc3lzY2FsbF9jb21tb24sQGZ1bmN0aW9uCisJLmVudAlfX3N5c2NhbGxfY29tbW9uLCAwCisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KK19fc3lzY2FsbF9jb21tb246CisJLmZyYW1lCXNwLDAscmEsMAorCWNhbGxzeXMKKwliZXEJYTMsIDFmCisJYnIJcHYsIDJmCQkJIyBwdiA8LSBwYworMjoKKwlsZGdwCWdwLCAwKHB2KQorCWxkYQlhMSwgZXJybm8KKwlzdGwJdjAsIDAoYTEpCisJbGRhCXYwLCAtMSh6ZXJvKQorMToKKwlyZXQJemVybywocmEpLDEKKworCS5zaXplCV9fc3lzY2FsbF9jb21tb24sLi1fX3N5c2NhbGxfY29tbW9uCisJLmVuZAlfX3N5c2NhbGxfY29tbW9uCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNkdWFsLlMgYi91c3Iva2xpYmMvYXJjaC9hbHBoYS9zeXNkdWFsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxOWUzNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL3N5c2R1YWwuUwpAQCAtMCwwICsxLDMzIEBACisjCisjIGFyY2gvYWxwaGEvc3lzZHVhbC5TCisjCisKKyMKKyMgU29tZSBzeXN0ZW0gY2FsbHMgaGF2ZSBhbiBhbHRlcm5hdGUgcmV0dXJuIHZhbHVlIGluIHIyMCAoYTQpLgorIyBUaGlzIHN5c3RlbSBjYWxsIHN0dWIgaXMgZm9yIHN5c3RlbSBjYWxscyB3aGVyZSB0aGF0IGlzCisjIHRoZSAicmVhbCIgcmV0dXJuIHZhbHVlLgorIworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKworCS50ZXh0CisJLmFsaWduCTMKKwkudHlwZQlfX3N5c2NhbGxfZHVhbDEsQGZ1bmN0aW9uCisJLmVudAlfX3N5c2NhbGxfZHVhbDEsIDAKKwkuZ2xvYmwJX19zeXNjYWxsX2R1YWwxCitfX3N5c2NhbGxfZHVhbDE6CisJLmZyYW1lCXNwLDAscmEsMAorCWNhbGxzeXMKKwltb3YJdjAsIGE0CisJYmVxCWEzLCAxZgorCWJyCXB2LCAyZgkJCSMgcHYgPC0gcGMKKzI6CisJbGRncAlncCwgMChwdikKKwlsZGEJYTEsIGVycm5vCisJbGRhCXYwLCAtMSh6ZXJvKQorCXN0bAlhMywgMChhMSkKKzE6CisJcmV0CXplcm8sKHJhKSwxCisKKwkuc2l6ZQlfX3N5c2NhbGxfZHVhbDEsLi1fX3N5c2NhbGxfZHVhbDEKKwkuZW5kCV9fc3lzY2FsbF9kdWFsMQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYWxwaGEvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL2FscGhhL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiOTdlOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FscGhhL3N5c3N0dWIucGgKQEAgLTAsMCArMSwzNyBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9hbHBoYS9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCisjIE9uIEFscGhhLCBtb3N0IHN5c3RlbSBjYWxscyBmb2xsb3cgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24sIHdpdGggdGhlCisjIHN5c3RlbSBjYWxsIG51bWJlciBpbiByMCAodjApLCByZXR1cm4gYW4gZXJyb3IgdmFsdWUgaW4gcjE5IChhMykgYXMKKyMgd2VsbCBhcyB0aGUgcmV0dXJuIHZhbHVlIGluIHIwICh2MCkuCisjCisjIEEgZmV3IHN5c3RlbSBjYWxscyBhcmUgZHVhbC1yZXR1cm4gd2l0aCB0aGUgc2Vjb25kIHJldHVybiB2YWx1ZSBpbgorIyByMjAgKGE0KS4KKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICAkc3R5cGUgPSAkc3R5cGUgfHwgJ2NvbW1vbic7CisgICAgJHN0eXBlID0gJ2NvbW1vbicgaWYgKCAkc3R5cGUgZXEgJ2R1YWwwJyApOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPlxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnRleHRcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlICR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5lbnRcdCR7Zm5hbWV9LCAwXG4iOyAjIFdoYXQgaXMgdGhpcz8KKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHRsZGFcdHYwLCBfX05SXyR7c25hbWV9KHplcm8pXG4iOworICAgIHByaW50IE9VVCAiXHRiciBfX3N5c2NhbGxfJHtzdHlwZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdC5zaXplXHQke2ZuYW1lfSwuLSR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHQuZW5kXHQke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYXJtL0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL2FybS9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0NmI2YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FybS9LYnVpbGQKQEAgLTAsMCArMSwxMyBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgYXJtCisjCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8gdmZvcmsubyBhZWFiaV9ub25zZW5zZS5vCisKK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2bW9kc2k0Lm8gLi4vLi4vbGliZ2NjL19fZGl2ZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19tb2RkaTMubyAgICAgLi4vLi4vbGliZ2NjL19fdWRpdmRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vICAgIC4uLy4uL2xpYmdjYy9fX3VkaXZtb2RkaTQubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2NsenNpMi5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYXJtL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9hcm0vTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThiYTAxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvYXJtL01DT05GSUcKQEAgLTAsMCArMSwzNSBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvYXJtL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitDUFVfQVJDSCA6PSBhcm12NAorQ1BVX1RVTkUgOj0gc3Ryb25nYXJtCisKK0tMSUJDT1BURkxBR1MgKz0gLU9zIC1tYXJjaD0kKENQVV9BUkNIKSAtbXR1bmU9JChDUFVfVFVORSkKK0tMSUJDQklUU0laRSAgPSAzMgorS0xJQkNSRVFGTEFHUyArPSAtZm5vLWV4Y2VwdGlvbnMKK0tMSUJDU1RSSVBGTEFHUyArPSAtUiAuQVJNLmV4aWR4CisKK2lmZXEgKCQoQ09ORklHX0tMSUJDX1RIVU1CKSx5KQorQ1BVX0FSQ0ggOj0gJChDUFVfQVJDSCl0CitLTElCQ1JFUUZMQUdTICs9IC1tdGh1bWIKK0tMSUJDTERGTEFHUyAgKz0gLS10aHVtYi1lbnRyeSBfc3RhcnQKK0tMSUJDRU1BSU4gICAgID0gLS10aHVtYi1lbnRyeSBfc3RhcnQKK0tMSUJDUkVRRkxBR1MgKz0gLW1hYmk9YWFwY3MtbGludXgKK0tMSUJDU0hBUkVERkxBR1MgPSAtVHRleHQgMHgzODAyMDAKK2Vsc2UKKyMgRXh0cmEgbGlua2ZsYWdzIHdoZW4gYnVpbGRpbmcgdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisjIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSByZWFjaGFibGUgdXNpbmcgbm9ybWFsIGludGVyLW1vZHVsZQorIyBjYWxscywgYW5kIHdvcmsgb24gdGhlIG1lbW9yeSBtb2RlbHMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCitLTElCQ1NIQVJFREZMQUdTID0gLVR0ZXh0IDB4MDE4MDAyMDAKK2lmZXEgKCQoQ09ORklHX0FFQUJJKSx5KQorS0xJQkNSRVFGTEFHUyArPSAtbWFiaT1hYXBjcy1saW51eCAtbW5vLXRodW1iLWludGVyd29yaworZWxzZQorS0xJQkNSRVFGTEFHUyArPSAtbWFiaT1hcGNzLWdudSAtbW5vLXRodW1iLWludGVyd29yaworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hcm0vX19tdWxkaTMuYyBiL3Vzci9rbGliYy9hcmNoL2FybS9fX211bGRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGViMmIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vX19tdWxkaTMuYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VpbnQ2NF90IF9fbXVsZGkzKHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisJdWludDMyX3QgYWwgPSAodWludDMyX3QpYTsKKwl1aW50MzJfdCBhaCA9ICh1aW50MzJfdCkoYSA+PiAzMik7CisJdWludDMyX3QgYmwgPSAodWludDMyX3QpYjsKKwl1aW50MzJfdCBiaCA9ICh1aW50MzJfdCkoYiA+PiAzMik7CisJdWludDY0X3QgdjsKKworCXYgPSAodWludDY0X3QpYWwgKiBibDsKKwl2ICs9ICh1aW50NjRfdCkoYWwqYmgrYWgqYmwpIDw8IDMyOworCisJcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9hcm0vYWVhYmlfbm9uc2Vuc2UuUyBiL3Vzci9rbGliYy9hcmNoL2FybS9hZWFiaV9ub25zZW5zZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OWViMTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vYWVhYmlfbm9uc2Vuc2UuUwpAQCAtMCwwICsxLDkgQEAKKwkudGV4dAorCS5nbG9ibAlfX2FlYWJpX3Vud2luZF9jcHBfcHIwCitfX2FlYWJpX3Vud2luZF9jcHBfcHIwOgorCS5nbG9ibAlfX2FlYWJpX3Vud2luZF9jcHBfcHIxCitfX2FlYWJpX3Vud2luZF9jcHBfcHIxOgorCS5nbG9ibAlfX2FlYWJpX3Vud2luZF9jcHBfcHIyCitfX2FlYWJpX3Vud2luZF9jcHBfcHIyOgorCS5nbG9ibAlfX2FlYWJpX3Vud2luZF9jcHBfcHIzCitfX2FlYWJpX3Vud2luZF9jcHBfcHIzOgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYXJtL2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL2FybS9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FybS9jcnQwLlMKQEAgLTAsMCArMSwyMyBAQAorIworIyBhcmNoL2FybS9jcnQwLlMKKyMKKyMgdm9pZCBfc3RhcnQodm9pZCkKKyMgeworIyAgICBfX2xpYmNfaW5pdChlbGZfc3RydWN0dXJlLCBhdGV4aXRfcHRyKTsKKyMgfQorIworCisJLnRleHQKKwkuYmFsaWduIDQKKwkudHlwZSBfc3RhcnQsI2Z1bmN0aW9uCisJLmdsb2JsIF9zdGFydAorCisjaWZkZWYgX190aHVtYl9fCisJLnRodW1iX2Z1bmMKKyNlbmRpZgorCitfc3RhcnQ6CW1vdglyMCwgc3AKKwltb3YJcjEsICMwCisJYmwJX19saWJjX2luaXQKKworCS5zaXplIF9zdGFydCwuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYXJtL3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvYXJtL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzI0NTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vc2V0am1wLlMKQEAgLTAsMCArMSwxMDIgQEAKKyMKKyMgYXJjaC9hcm0vc2V0am1wLlMKKyMKKyMgc2V0am1wL2xvbmdqbXAgZm9yIHRoZSBBUk0gYXJjaGl0ZWN0dXJlCisjCisKKyNpZm5kZWYJX190aHVtYl9fCisKKyMKKyMgIlB1cmUgQVJNIiB2ZXJzaW9uCisjCisjIFRoZSBqbXBfYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyMJCXI0CisjCQlyNQorIwkJcjYKKyMJCXI3CisjCQlyOAorIwkJcjkKKyMJCXIxMAorIwkJZnAKKyMJCXNwCisjCQlscgorIworCisJLnRleHQKKwkuYmFsaWduIDQKKwkuZ2xvYmwgc2V0am1wCisJLnR5cGUgc2V0am1wLCAjZnVuY3Rpb24KK3NldGptcDoKKwlzdG1pYQlyMCwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgZnAsIHNwLCBscn0KKwltb3YJcjAsICMwCisJbW92CXBjLCBscgorCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnRleHQKKwkuYmFsaWduIDQKKwkuZ2xvYmwgbG9uZ2ptcAorCS50eXBlIGxvbmdqbXAsICNmdW5jdGlvbgorbG9uZ2ptcDoKKwlsZG1pYQlyMCwge3I0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgZnAsIHNwLCBscn0KKwltb3YJcjAsIHIxCisJbW92CXBjLCBscgorCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCisKKyNlbHNlIC8qIF9fdGh1bWJfXyAqLworCisjCisjIFRodW1iIHZlcnNpb24KKyMKKyMgVGhlIGptcF9idWYgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyOgorIwkJbHIKKyMJCXI0CisjCQlyNQorIwkJcjYKKyMJCXI3CisjCQlyOAorIwkJcjkKKyMJCXIxMAorIwkJZnAKKyMJCXNwCisjCisKKwkudGV4dAorCS5iYWxpZ24gNAorCS5nbG9ibCBzZXRqbXAKKwkudHlwZSBzZXRqbXAsICNmdW5jdGlvbgorCS50aHVtYl9mdW5jCitzZXRqbXA6CisJbW92CXIzLCBscgorCXN0bWlhCXIwISwge3IzLCByNCwgcjUsIHI2LCByN30KKwltb3YJcjMsIHI4CisJbW92CXI0LCByOQorCW1vdglyNSwgcjEwCisJbW92CXI2LCBmcAorCW1vdglyNywgc3AKKwlzdG1pYQlyMCEsIHtyMywgcjQsIHI1LCByNiwgcjd9CisJbW92CXIwLCAjMAorCW1vdglwYywgbHIKKwkuc2l6ZSBzZXRqbXAsLi1zZXRqbXAKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCAjZnVuY3Rpb24KKwkudGh1bWJfZnVuYworbG9uZ2ptcDoKKwltb3YJcjIsIHIwCisJYWRkCXIwLCAjNSo0CisJbGRtaWEJcjAhLCB7cjMsIHI0LCByNSwgcjYsIHI3fQorCW1vdglyOCwgcjMKKwltb3YJcjksIHI0CisJbW92CXIxMCwgcjUKKwltb3YJZnAsIHI2CisJbW92CXNwLCByNworCWxkbWlhCXIyISwge3IzLCByNCwgcjUsIHI2LCByN30KKwltb3YJcjAsIHIxCisJYm5lCTFmCisJbW92CXIwLCAjMQorMToJbW92CXBjLCByMworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCisKKyNlbmRpZiAvKiBfX3RodW1iX18gKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FybS9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9hcm0vc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjA0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9hcm0vc3lzY2FsbC5TCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBhcmNoL2FybS9zeXNjYWxsLlMKKyAqCisgKiBTeXN0ZW0gY2FsbCBjb21tb24gaGFuZGxpbmcKKyAqLworCisJLnR5cGUJX19zeXNjYWxsX2NvbW1vbiwjZnVuY3Rpb24KKwkuZ2xvYmwJX19zeXNjYWxsX2NvbW1vbgorI2lmbmRlZiBfX3RodW1iX18KKwkvKiBBUk0gdmVyc2lvbiAtIHRoaXMgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHN3aSwgdW5sZXNzCisJICAgd2UgYXJlIGNvbXBpbGVkIGluIEVBQkkgbW9kZSAqLworCisJLmJhbGlnbgk0CitfX3N5c2NhbGxfY29tbW9uOgorI2lmZGVmIF9fQVJNX0VBQklfXworCWxkcglyNCwgW3NwLCMxNl0KKwlsZHIJcjUsIFtzcCwjMjBdCisJbGRyCXI3LCBbbHJdCisJc3dpCTAKKyNlbmRpZgorICAgICAgICBjbW4gICAgIHIwLCAjNDA5NgorICAgICAgICByc2JjcwlyMiwgcjAsICMwCisgICAgICAgIGxkcmNzCXIzLCAxZgorICAgICAgICBtdm5jcwlyMCwgIzAKKyAgICAgICAgc3RyY3MJcjIsIFtyM10KKyNpZmRlZiBfX0FSTV9FQUJJX18KKwlsZG1mZAlzcCEse3I0LHI1LHI3LHBjfQorI2Vsc2UKKwlsZG1mZAlzcCEse3I0LHI1LHBjfQorI2VuZGlmCisKKwkuYmFsaWduIDQKKzE6CisJLndvcmQJZXJybm8KKworI2Vsc2UKKwkvKiBUaHVtYiB2ZXJzaW9uIC0gbXVzdCBzdGlsbCBsb2FkIHI0IGFuZCByNSBhbmQgcnVuIHN3aSAqLworCisJLnRodW1iX2Z1bmMKKwkuYmFsaWduCTIKK19fc3lzY2FsbF9jb21tb246CisJbW92CXI3LCBscgorCWxkcglyNCwgW3NwLCMxNl0KKwlzdWIJcjcsICMxCQkvKiBSZW1vdmUgdGhlIFRodW1iIGJpdCAqLworCWxkcglyNSwgW3NwLCMyMF0KKwlsZHJoCXI3LCBbcjddCisJc3dpCTAKKwlsZHIJcjEsIDJmCisJY21wCXIwLCByMQorCWJjYwkxZgorCWxkcglyMSwgM2YKKwluZWcJcjIsIHIwCisJbW92CXIwLCAjMQorCXN0cglyMiwgW3IxXQorCW5lZwlyMCwgcjAKKzE6CisJcG9wCXtyNCxyNSxyNyxwY30KKworCS5iYWxpZ24JNAorMjoKKwkud29yZAktNDA5NQorMzoKKwkud29yZAllcnJubworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2FybS9zeXNzdHViLnBoIGIvdXNyL2tsaWJjL2FyY2gvYXJtL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxYWNlMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FybS9zeXNzdHViLnBoCkBAIC0wLDAgKzEsNTggQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvYXJtL3N5c3N0dWIucGgKKyMKKyMgU2NyaXB0IHRvIGdlbmVyYXRlIHN5c3RlbSBjYWxsIHN0dWJzCisjCisKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCAgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCAgT1VUICIjaW5jbHVkZSA8a2xpYmMvYXNtbWFjcm9zLmg+XG4iOworCisgICAgcHJpbnQgIE9VVCAiCS50ZXh0XG4iOworICAgIHByaW50ICBPVVQgIgkudHlwZQkke2ZuYW1lfSwgI2Z1bmN0aW9uXG4iOworICAgIHByaW50ICBPVVQgIgkuZ2xvYmwJJHtmbmFtZX1cbiI7CisKKyAgICBwcmludCAgT1VUICIjaWZuZGVmIF9fdGh1bWJfX1xuIjsKKworICAgIHByaW50ICBPVVQgIiNpZm5kZWYgX19BUk1fRUFCSV9fXG4iOworCisgICAgIyBBUk0gdmVyc2lvbiBmaXJzdAorICAgIHByaW50ICBPVVQgIgkuYmFsaWduCTRcbiI7CisgICAgcHJpbnQgIE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50ICBPVVQgIglzdG1mZAlzcCEse3I0LHI1LGxyfVxuIjsKKyAgICBwcmludCAgT1VUICIJbGRyCXI0LFtzcCwjMTJdXG4iOworICAgIHByaW50ICBPVVQgIglsZHIJcjUsW3NwLCMxNl1cbiI7CisgICAgcHJpbnQgIE9VVCAiCXN3aQkjIF9fTlJfJHtzbmFtZX1cbiI7CisgICAgcHJpbnQgIE9VVCAiCWIJX19zeXNjYWxsX2NvbW1vblxuIjsKKworICAgIHByaW50ICBPVVQgIiNlbHNlIC8qIF9fQVJNX0VBQklfXyAqL1xuIjsKKworICAgICMgQVJNIEVBQkkgdmVyc2lvbgorICAgIHByaW50ICBvdXQgIgkuYmFsaWduCTRcbiI7CisgICAgcHJpbnQgIE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50ICBPVVQgIglzdG1mZAlzcCEse3I0LHI1LHI3LGxyfVxuIjsKKyAgICBwcmludCAgT1VUICIJYmwJX19zeXNjYWxsX2NvbW1vblxuIjsKKyAgICBwcmludCAgT1VUICIJLndvcmQJX19OUl8ke3NuYW1lfVxuIjsKKworICAgIHByaW50ICBPVVQgIiNlbmRpZiAvKiBfX0FSTV9FQUJJX18gKi9cbiI7CisgICAgcHJpbnQgIE9VVCAiI2Vsc2UgLyogX190aHVtYl9fICovXG4iOworCisgICAgIyBUaHVtYiB2ZXJzaW9uCisgICAgcHJpbnQgIE9VVCAiCS5iYWxpZ24JOFxuIjsKKyAgICBwcmludCAgT1VUICIJLnRodW1iX2Z1bmNcbiI7CisgICAgcHJpbnQgIE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50ICBPVVQgIglwdXNoCXtyNCxyNSxyNyxscn1cbiI7CisgICAgcHJpbnQgIE9VVCAiCWJsCV9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgIE9VVCAiCS5zaG9ydAlfX05SXyR7c25hbWV9XG4iOworCisgICAgcHJpbnQgIE9VVCAiI2VuZGlmIC8qIF9fdGh1bWJfXyovXG4iOworCisgICAgcHJpbnQgIE9VVCAiCS5zaXplCV9fc3lzY2FsbCR7aX0sLi1fX3N5c2NhbGwke2l9XG4iOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvYXJtL3Zmb3JrLlMgYi91c3Iva2xpYmMvYXJjaC9hcm0vdmZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJkOWY3NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2FybS92Zm9yay5TCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBhcmNoL2FybS92Zm9yay5TCisgKgorICogdmZvcmsgLSBuYXN0eSBzeXN0ZW0gY2FsbCB3aGljaCBtdXN0IG5vdCB1c2UgdGhlIHN0YWNrLgorICovCisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKwkudHlwZQl2Zm9yaywjZnVuY3Rpb24KKwkuZ2xvYmwJdmZvcmsKKyNpZm5kZWYgX190aHVtYl9fCisKKwkuYmFsaWduCTQKK3Zmb3JrOgorI2lmZGVmCV9fQVJNX0VBQklfXworCW1vdglyMywgcjcKKwltb3YJcjcsICMgX19OUl92Zm9yaworCXN3aQkwCisJbW92CXI3LCByMworI2Vsc2UKKwlzd2kJIyBfX05SX3Zmb3JrCisjZW5kaWYKKyAgICAgICAgY21uICAgICByMCwgIzQwOTYKKyAgICAgICAgcnNiY3MJcjIsIHIwLCAjMAorICAgICAgICBsZHJjcwlyMywgMWYKKyAgICAgICAgbXZuY3MJcjAsICMwCisgICAgICAgIHN0cmNzCXIyLCBbcjNdCisJbW92CXBjLCBscgorCisJLmJhbGlnbiA0CisxOgorCS53b3JkCWVycm5vCisKKyNlbHNlCisKKwkudGh1bWJfZnVuYworCS5iYWxpZ24JMgordmZvcms6CisJbW92CXIzLCByNworCW1vdglyNywgIyBfX05SX3Zmb3JrCisJc3dpCTAKKwltb3YJcjcsIHIzCisJbGRyCXIxLCAyZgorCWNtcAlyMCwgcjEKKwliY2MJMWYKKwlsZHIJcjEsIDNmCisJbmVnCXIyLCByMAorCW1vdglyMCwgIzEKKwlzdHIJcjIsIFtyMV0KKwluZWcJcjAsIHIwCisxOgorCW1vdglwYywgbHIKKworCS5iYWxpZ24JNAorMjoKKwkud29yZAktNDA5NQorMzoKKwkud29yZAllcnJubworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2NyaXMvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjZWVlYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvS2J1aWxkCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yYSBjcmlzCisjCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubworCitrbGliLXkgKz0gX19uZWdkaTIubyBzZXRqbXAubyBzeXNjYWxsLm8gdmZvcmsubworCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fZGl2ZGkzLm8gICAgIC4uLy4uL2xpYmdjYy9fX21vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdmRpMy5vICAgIC4uLy4uL2xpYmdjYy9fX3Vtb2RkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZtb2RkaTQubworCisjIERpdmlkZSBzdXBwb3J0CitrbGliLXkgOj0gX19VbW9kLm8gX19VZGl2Lm8gX19Nb2QubyBfX0Rpdi5vCisKK3F1aWV0X2NtZF9jYy1kaXYgPSBESVYtQ0MgICRACisgICAgICBjbWRfY2MtZGl2ID0gJChLTElCQ0MpICQoa2xpYmNjZmxhZ3MpIC1jIC1vICRAICQ8CisKKworJChvYmopL19fVW1vZC5vOiAkKHNyYykvZGl2aWRlLmMKK0tMSUJDQ0ZMQUdTX19fVW1vZC5vIDo9IC1EU0lHTkVEPTAgLURSRU09MSAtREJJVFM9MzIgLUROQU1FPV9fVW1vZAorJChvYmopL19fVWRpdi5vOiAkKHNyYykvZGl2aWRlLmMKK0tMSUJDQ0ZMQUdTX19fVWRpdi5vIDo9IC1EU0lHTkVEPTAgLURSRU09MCAtREJJVFM9MzIgLUROQU1FPV9fVWRpdgorJChvYmopL19fTW9kLm86ICQoc3JjKS9kaXZpZGUuYworS0xJQkNDRkxBR1NfX19Nb2QubyAgOj0gLURTSUdORUQ9MSAtRFJFTT0xIC1EQklUUz0zMiAtRE5BTUU9X19Nb2QKKyQob2JqKS9fX0Rpdi5vOiAkKHNyYykvZGl2aWRlLmMKK0tMSUJDQ0ZMQUdTX19fRGl2Lm8gIDo9IC1EU0lHTkVEPTEgLURSRU09MCAtREJJVFM9MzIgLUROQU1FPV9fRGl2CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9jcmlzL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9jcmlzL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiZmU3MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvTUNPTkZJRwpAQCAtMCwwICsxLDI2IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9jcmlzL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitLTElCQ09QVEZMQUdTICs9IC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlcgorS0xJQkNCSVRTSVpFICA9IDMyCisKKyMgRXh0cmEgbGlua2ZsYWdzIHdoZW4gYnVpbGRpbmcgdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisjIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSByZWFjaGFibGUgdXNpbmcgbm9ybWFsIGludGVyLW1vZHVsZQorIyBjYWxscywgYW5kIHdvcmsgb24gdGhlIG1lbW9yeSBtb2RlbHMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCisjIDIyNCBNQiAtIG5vcm1hbCBiaW5hcmllcyBzdGFydCBhdCAwCisjIChsaWI/KWdjYyBvbiBjcmlzIHNlZW1zIHRvIGluc2lzdCBvbiBwcm9kdWNpbmcgLmluaXQgYW5kIC5maW5pIHNlY3Rpb25zCitLTElCQ1NIQVJFREZMQUdTICAgICA9IC0tc2VjdGlvbi1zdGFydCAuaW5pdD0weDBlMDAwMTAwCisKKyMgVGhlIENSSVMgY29tcGlsZXIgbmVlZHMgYW4gLWlwcmVmaXggdG8gZmluZCBsaWJnY2MgaW5jbHVkZXMgd2hlbgorIyBub3N0ZGluYyBpcyB1c2VkLiBJdCBhbHNvIG5lZWRzIC1tbGludXggdG8gY29tcGlsZSBsaW51eCBhcHBsaWNhdGlvbnMuCitJTkNMVURFX1BSRUZJWCAgPSAkKHNoZWxsICQoQ0MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lIHwgc2VkIC1lIHMvbGliZ2NjLmEvLykKK0tMSUJDQVJDSFJFUUZMQUdTID0gLWlwcmVmaXggJChJTkNMVURFX1BSRUZJWCkgLW1saW51eAorCisjIFNwZWNpYWwgZmxhZ3MgbmVlZGVkIGZvciBsaW5raW5nCitLTElCQ0xERkxBR1MgCSs9IC1tY3Jpc2xpbnV4CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9jcmlzL19fbmVnZGkyLlMgYi91c3Iva2xpYmMvYXJjaC9jcmlzL19fbmVnZGkyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjYTllZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvX19uZWdkaTIuUwpAQCAtMCwwICsxLDI1IEBACisvKgorICogYXJjaC9jcmlzL19fbmVnZGkyLmMKKyAqLworCisvKgorICogSW4gMidzIGNvbXBsZW1lbnQgYXJpdGhtZXRyaWMsIC14ID09ICh+eCArIDEpLCBzbworICogLXtoLGx9ID0gKH57aCxsfSArIHswLDEpCisgKiAte2gsbH0gPSB7fmgsfmx9ICsgezAsMX0KKyAqIC17aCxsfSA9IHt+aCArIGN5LCB+bCArIDF9CisgKiAuLi4gd2hlcmUgY3kgPSAobCA9PSAwKQorICogLXtoLGx9ID0ge35oICsgY3ksIC1sfQorICovCisKKwkudGV4dAorCS5iYWxpZ24gNAorCS50eXBlCV9fbmVnZGkyLEBmdW5jdGlvbgorCS5nbG9ibAlfX25lZ2RpMgorX19uZWdkaTI6CisJbmVnLmQJJHIxMCwkcjEwCisJc2VxCSRyMTIKKwlub3QJJHIxMQorCXJldAorCSAgYWRkLmQJJHIxMiwkcjExCisKKwkuc2l6ZSBfX25lZ2RpMiwgLi1fX25lZ2RpMgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvY3Jpcy9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9jcmlzL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNiOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9jcnQwLlMKQEAgLTAsMCArMSwyNyBAQAorIworIyBhcmNoL2NyaXMvY3J0MC5TCisjCisjIERvZXMgYXJjaC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBhbmQgaW52b2tlcyBfX2xpYmNfaW5pdAorIyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCisjCisjIFNlZSBfX3N0YXRpY19pbml0LmMgb3IgX19zaGFyZWRfaW5pdC5jIGZvciB0aGUgZXhwZWN0ZWQKKyMgYXJndW1lbnRzLgorIworCisJLnRleHQKKwkuYmFsaWduIDQKKwkudHlwZQlfc3RhcnQsQGZ1bmN0aW9uCisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCS8qIFNhdmUgdGhlIGFkZHJlc3Mgb2YgdGhlIEVMRiBhcmd1bWVudCBhcnJheSAqLworCW1vdmUuZAkkc3AsJHIxMAkvKiBBZGRyZXNzIG9mIEVMRiBhcmd1bWVudHMgKi8KKworCS8qIGF0ZXhpdCgpIGZ1bmN0aW9uIChhc3N1bWUgbnVsbCkgKi8KKwltb3ZlcQkwLCRyMTEKKworCS8qIFNldCB1cCBhIGR1bW15IHN0YWNrIGZyYW1lIHRvIGtlZXAgZ2NjIGZyb20gZ2V0dGluZyBjb25mdXNlZCAqLworCXB1c2gJJHIxMQorCXB1c2gJJHIxMQorCWp1bXAJX19saWJjX2luaXQKKworCS5zaXplIF9zdGFydCwgLi1fc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2NyaXMvZGl2aWRlLmMgYi91c3Iva2xpYmMvYXJjaC9jcmlzL2RpdmlkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGFiMjMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL2RpdmlkZS5jCkBAIC0wLDAgKzEsOTkgQEAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmIEJJVFMgPT0gNjQKK3R5cGVkZWYgdWludDY0X3QgdW51bTsKK3R5cGVkZWYgaW50NjRfdCBzbnVtOworI2Vsc2UKK3R5cGVkZWYgdWludDMyX3QgdW51bTsKK3R5cGVkZWYgaW50MzJfdCBzbnVtOworI2VuZGlmCisKKyNpZmRlZiBTSUdORUQKK3R5cGVkZWYgc251bSB4bnVtOworI2Vsc2UKK3R5cGVkZWYgdW51bSB4bnVtOworI2VuZGlmCisKKyNpZmRlZiBfX2NyaXNfXworc3RhdGljIGlubGluZSB1bnVtIF9fYXR0cmlidXRlX18gKChjb25zdCkpZHN0ZXAodW51bSBycywgdW51bSByZCkKK3sKKwlhc20oImRzdGVwICUxLCUwIjogIityIihyZCk6InIiKHJzKSk7CisJcmV0dXJuIHJkOworfQorCitzdGF0aWMgaW5saW5lIHVudW0gX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSlseih1bnVtIHJzKQoreworCXVudW0gcmQ7CisJYXNtKCJseiAlMSwlMCI6ICI9ciIocmQpOiJyIihycykpOworCXJldHVybiByZDsKK30KKworI2Vsc2UKKy8qIEZvciB0ZXN0aW5nICovCitzdGF0aWMgaW5saW5lIHVudW0gX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSlkc3RlcCh1bnVtIHJzLCB1bnVtIHJkKQoreworCXJkIDw8PSAxOworCWlmIChyZCA+PSBycykKKwkJcmQgLT0gcnM7CisKKwlyZXR1cm4gcmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW51bSBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKWx6KHVudW0gcnMpCit7CisJdW51bSByZCA9IDA7CisJd2hpbGUgKHJzID49IDB4N2ZmZmZmZmYpIHsKKwkJcmQrKzsKKwkJcnMgPDw9IDE7CisJfQorCXJldHVybiByZDsKK30KKworI2VuZGlmCisKK3hudW0gTkFNRSh1bnVtIG51bSwgdW51bSBkZW4pCit7CisJdW51bSBxdW90ID0gMCwgcWJpdCA9IDE7CisJaW50IG1pbnVzID0gMDsKKwl4bnVtIHY7CisKKwlpZiAoZGVuID09IDApIHsKKwkJcmFpc2UoU0lHRlBFKTsKKwkJcmV0dXJuIDA7CS8qIElmIHNpZ25hbCBpZ25vcmVkLi4uICovCisJfQorCisJaWYgKGRlbiA9PSAxKQorCQlyZXR1cm4gKHhudW0pIChSRU0gPyAwIDogbnVtKTsKKworI2lmIFNJR05FRAorCWlmICgoc251bSkgKG51bSBeIGRlbikgPCAwKQorCQltaW51cyA9IDE7CisJaWYgKChzbnVtKSBudW0gPCAwKQorCQludW0gPSAtbnVtOworCWlmICgoc251bSkgZGVuIDwgMCkKKwkJZGVuID0gLWRlbjsKKyNlbmRpZgorCisJZGVuLS07CisKKwkvKiBMZWZ0LWp1c3RpZnkgZGVub21pbmF0b3IgYW5kIGNvdW50IHNoaWZ0ICovCisJd2hpbGUgKChzbnVtKSBkZW4gPj0gMCkgeworCQlkZW4gPDw9IDE7CisJCXFiaXQgPDw9IDE7CisJfQorCisJd2hpbGUgKHFiaXQpIHsKKwkJaWYgKGRlbiA8PSBudW0pIHsKKwkJCW51bSAtPSBkZW47CisJCQlxdW90ICs9IHFiaXQ7CisJCX0KKwkJZGVuID4+PSAxOworCQlxYml0ID4+PSAxOworCX0KKworCXYgPSAoeG51bSkgKFJFTSA/IG51bSA6IHF1b3QpOworCWlmIChtaW51cykKKwkJdiA9IC12OworCXJldHVybiB2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvY3Jpcy9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0MWI4MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvc2V0am1wLlMKQEAgLTAsMCArMSwzNyBAQAorIworIyBhcmNoL2NyaXMvc2V0am1wLlMKKyMKKyMgc2V0am1wL2xvbmdqbXAgZm9yIHRoZSBjcmlzIGFyY2hpdGVjdHVyZQorIworCisjCisjIFRoZSBqbXBfYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyMJJHI4Li4kcjAJKGluIHRoYXQgb3JkZXIpCisjCSRzcAkoJHIxNCkKKyMJcmV0dXJuIGFkZHJlc3MKKyMKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLmdsb2JsCXNldGptcAorCS50eXBlCXNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisJbW92ZW0JJHI4LFskcjEwK10JCS8qIFNhdmUgJHI4Li4kcjAgYXQgJHIxMC4uLiAqLworCW1vdmUuZAkkc3AsWyRyMTArXQorCW1vdmUJJHNycCxbJHIxMF0KKwlyZXQKKwkgIG1vdmVxCTAsJHIxMAorCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5iYWxpZ24gNAorCS5nbG9ibAlsb25nam1wCisJLnR5cGUJbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorCW1vdmVtCVskcjEwK10sJHI4CQkvKiBMb2FkICRyOC4uJHIwIGZyb20gJHIxMC4uLiAqLworCW1vdmUuZAlbJHIxMCtdLCRzcAorCWp1bXAJWyRyMTBdCisJbW92ZS5kICRyMTEsJHIxMAorCisJLnNpemUgbG9uZ2ptcCwuLWxvbmdqbXAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2NyaXMvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxNDk1YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBhcmNoL2NyaXMvc3lzY2FsbC5TCisgKgorICogT24gY3JpcywgcjkgY29udGFpbnMgdGhlIHN5c2NhbGwgbnVtYmVyIChzZXQgYnkgZ2VuZXJhdGVkIHN0dWIpOworICogcjEwLi5yMTMgY29udGFpbiBhcmd1bWVudHMgMC0zIHBlciB0aGUgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uLAorICogYW5kIGFyZ3VtZW50cyA0LTUgYXJlIHBhc3NlZCBpbiAkbW9mIGFuZCAkc3JwOyBob3dldmVyLCB3ZSBoYXZlCisgKiB0byBzYXZlICRzcnAgYXJvdW5kIHRoZSBzeXN0ZW0gY2FsbC4KKyAqLworCisJLnNlY3Rpb24gIi50ZXh0IiwiYXgiCisJLmJhbGlnbgk0CisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KKwkudHlwZQlfX3N5c2NhbGxfY29tbW9uLEBmdW5jdGlvbgorX19zeXNjYWxsX2NvbW1vbjoKKwlwdXNoCSRzcnAKKwltb3ZlCVskc3ArNF0sJG1vZgorCW1vdmUJWyRzcCs4XSwkc3JwCisJYnJlYWsJMTMKKworCWNtcHMudwktNDA5NiwkcjEwCisJYmxvCTFmCisJbmVnLmQJJHIxMCwkcjExCisJbW92ZS5kCSRyMTEsW2Vycm5vXQorCW1vdmVxCS0xLCRyMTAKKzE6CisJcG9wCSRzcnAKKwlyZXQKKwlub3AKKworCS5zaXplCV9fc3lzY2FsbF9jb21tb24sLi1fX3N5c2NhbGxfY29tbW9uCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9jcmlzL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9jcmlzL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyYWQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2NyaXMvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI5IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL2NyaXMvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudGV4dFxuIjsKKyAgICBwcmludCBPVVQgIlx0LnR5cGVcdCR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibFx0JHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdC5iYWxpZ25cdDRcbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICIjaWYgX19OUl8ke3NuYW1lfSA8PSAzMVxuIjsKKyAgICBwcmludCBPVVQgIlx0ICBtb3ZlcVx0X19OUl8ke3NuYW1lfSwgXCRyOVxuIjsKKyAgICBwcmludCBPVVQgIiNlbHNlXG4iOworICAgIHByaW50IE9VVCAiXHQgIG1vdmUuZFx0X19OUl8ke3NuYW1lfSwgXCRyOVxuIjsKKyAgICBwcmludCBPVVQgIiNlbmRpZlxuIjsKKyAgICBwcmludCBPVVQgIlx0anVtcFx0X19zeXNjYWxsX2NvbW1vblxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvY3Jpcy92Zm9yay5TIGIvdXNyL2tsaWJjL2FyY2gvY3Jpcy92Zm9yay5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGIzNmMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9jcmlzL3Zmb3JrLlMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIGFyY2gvY3Jpcy92Zm9yay5TCisgKgorICogT24gY3JpcywgcjkgY29udGFpbnMgdGhlIHN5c2NhbGwgbnVtYmVyIChzZXQgYnkgZ2VuZXJhdGVkIHN0dWIpOworICogcjEwLi5yMTMgY29udGFpbiBhcmd1bWVudHMgMC0zIHBlciB0aGUgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uLgorICogVGhlIHJldHVybiBhZGRyZXNzIGlzIGluICRzcnA7IHNvIHdlIGp1c3QgbmVlZCB0byBhdm9pZCB0aGUgc3RhY2sKKyAqIHVzYWdlIG9mIHRoZSBub3JtYWwgc3lzY2FsbCBzdHVicy4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnNlY3Rpb24gIi50ZXh0IiwiYXgiCisJLmJhbGlnbgk0CisJLmdsb2JsCXZmb3JrCisJLnR5cGUJdmZvcmssQGZ1bmN0aW9uCit2Zm9yazoKKwltb3ZlLmQJX19OUl92Zm9yaywgJHI5CisJYnJlYWsJMTMKKworCWNtcHMudwktNDA5NiwkcjEwCisJYmxvCTFmCisJbmVnLmQJJHIxMCwkcjExCisJbW92ZS5kCSRyMTEsW2Vycm5vXQorCW1vdmVxCS0xLCRyMTAKKzE6CisJcmV0CisJbm9wCisKKwkuc2l6ZQl2Zm9yaywuLXZmb3JrCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL2kzODYvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzdiM2MKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L0tidWlsZApAQCAtMCwwICsxLDE3IEBACisjCisjIGtsaWJjIC5vIGZpbGVzIGZvciBpMzg2CisjCisKK2tsaWIteSA6PSBzb2NrZXRjYWxsLm8gc2V0am1wLm8gc3lzY2FsbC5vIHZhcnN5c2NhbGwubwora2xpYi15ICs9IG9wZW4ubyBvcGVuYXQubyB2Zm9yay5vCitrbGliLXkgKz0gbGliZ2NjL19fYXNobGRpMy5vIGxpYmdjYy9fX2FzaHJkaTMubyBsaWJnY2MvX19sc2hyZGkzLm8KK2tsaWIteSArPSBsaWJnY2MvX19tdWxkaTMubyAgbGliZ2NjL19fbmVnZGkyLm8KKwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fbW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2ZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191bW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2bW9kZGk0Lm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9pMzg2L01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxMTJhNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvTUNPTkZJRwpAQCAtMCwwICsxLDMzIEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9pMzg2L01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCisjIEVuYWJsZSB0aGlzIHRvIGNvbXBpbGUgd2l0aCByZWdpc3RlciBwYXJhbWV0ZXJzOyBvbmx5IHNhZmUgZm9yCisjIGdjYyA+PSAzCisKK2lmZXEgKCQoQ09ORklHX1JFR1BBUk0pLHkpCitSRUdQQVJNX09QVCA6PSAtbXJlZ3Bhcm09MyAtRF9SRUdQQVJNPTMKK2VuZGlmCisKK2djY19hbGlnbl9vcHRpb24gIDo9ICQoY2FsbCBjYy1vcHRpb24sIFwKKwkJLWZhbGlnbi1mdW5jdGlvbnM9MCAtZmFsaWduLWp1bXBzPTAgLWZhbGlnbi1sb29wcz0wLCBcCisJCS1tYWxpZ24tZnVuY3Rpb25zPTAgLW1hbGlnbi1qdW1wcz0wIC1tYWxpZ24tbG9vcHM9MCkKK2djY19tMzJfb3B0aW9uICA6PSAkKGNhbGwgY2Mtb3B0aW9uLCAtbTMyLCApCisKK0tMSUJDT1BURkxBR1MgICAgICs9IC1tYXJjaD1pMzg2IC1PcyAtZyAtZm9taXQtZnJhbWUtcG9pbnRlciAkKGdjY19hbGlnbl9vcHRpb24pCitLTElCQ0xERkxBR1MgICAgICA9IC1tIGVsZl9pMzg2CitLTElCQ1JFUUZMQUdTCSAgKz0gJChSRUdQQVJNX09QVCkKK0tMSUJDQVJDSFJFUUZMQUdTICs9ICQoZ2NjX20zMl9vcHRpb24pCisKK0tMSUJDQklUU0laRSAgPSAzMgorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyA5NiBNQiAtIG5vcm1hbCBiaW5hcmllcyBzdGFydCBhdCAxMjggTUIKK0tMSUJDU0hBUkVERkxBR1MJPSAtVHRleHQgMHgwNjAwMDIwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY2MzVlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9jcnQwLlMKQEAgLTAsMCArMSwzMSBAQAorIworIyBhcmNoL2kzODYvY3J0MC5TCisjCisjIERvZXMgYXJjaC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBhbmQgaW52b2tlcyBfX2xpYmNfaW5pdAorIyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCisjCisjIFNlZSBfX3N0YXRpY19pbml0LmMgb3IgX19zaGFyZWRfaW5pdC5jIGZvciB0aGUgZXhwZWN0ZWQKKyMgYXJndW1lbnRzLgorIworCisJLnRleHQKKwkuYWxpZ24gNAorCS50eXBlIF9zdGFydCxAZnVuY3Rpb24KKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJIyBTYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBFTEYgYXJndW1lbnQgYXJyYXkKKwltb3ZsICVlc3AsJWVheAkJIyBBZGRyZXNzIG9mIEVMRiBhcmd1bWVudHMKKwkjIFNldCB1cCBhIGZhdXggc3RhY2sgZnJhbWUgZm9yIHRoZSBiZW5lZml0IG9mIGdkYgorCXhvcmwgJWVicCwlZWJwCisJcHVzaCAlZWJwCQkjIEtlZXAgZ2RiIGZyb20gZ2V0dGluZyBjb25mdXNlZAorCXB1c2ggJWVicAkJIyBLZWVwIGdkYiBmcm9tIGdldHRpbmcgY29uZnVzZWQKKwkjIFB1c2ggdGhlIGFyZ3VtZW50cyBhbmQgY2FsbGVkIF9fbGliY19pbml0KCkKKyNpZm5kZWYgX1JFR1BBUk0KKwlwdXNoICVlZHgJCSMgYXRleGl0KCkgZnVuY3Rpb24KKwlwdXNoICVlYXgJCSMgRUxGIGFycmF5CisjZW5kaWYKKwljYWxsIF9fbGliY19pbml0CisJIyBJZiBfX2xpYmNfaW5pdCByZXR1cm5zLCBwcm9ibGVtLi4uCisJaGx0CisKKwkuc2l6ZSBfc3RhcnQsIC4tX3N0YXJ0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2FzaGxkaTMuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fYXNobGRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDQxNDIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2FzaGxkaTMuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2FzaGxkaTMuUworICoKKyAqIDY0LWJpdCBzaGwKKyAqLworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19hc2hsZGkzCisJLnR5cGUgX19hc2hsZGkzLEBmdW5jdGlvbgorX19hc2hsZGkzOgorI2lmbmRlZiBfUkVHUEFSTQorCW1vdmwgIDQoJWVzcCksJWVheAorCW1vdmwgIDgoJWVzcCksJWVkeAorCW1vdmIgIDEyKCVlc3ApLCVjbAorI2VuZGlmCisJY21wYiAgJDMyLCVjbAorCWphZSAgIDFmCisKKwlzaGxkbCAlY2wsJWVheCwlZWR4CisJc2hsICAgJWNsLCVlYXgKKwlyZXQKKworMToKKwl4b3JsICAlZWR4LCVlZHgKKwlzaGwgICAlY2wsJWVheAorCXhjaGdsICVlZHgsJWVheAorCXJldAorCisJLnNpemUgX19hc2hsZGkzLC4tX19hc2hsZGkzCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2FzaHJkaTMuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fYXNocmRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjZlYjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2FzaHJkaTMuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2FzaHJkaTMuUworICoKKyAqIDY0LWJpdCBzYXIKKyAqLworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19hc2hyZGkzCisJLnR5cGUgX19hc2hyZGkzLEBmdW5jdGlvbgorX19hc2hyZGkzOgorI2lmbmRlZiBfUkVHUEFSTQorCW1vdmwgIDQoJWVzcCksJWVheAorCW1vdmwgIDgoJWVzcCksJWVkeAorCW1vdmIgIDEyKCVlc3ApLCVjbAorI2VuZGlmCisJY21wYiAgJDMyLCVjbAorCWphZSAgIDFmCisKKwlzaHJkbCAlY2wsJWVkeCwlZWF4CisJc2FybCAgJWNsLCVlZHgKKwlyZXQKKworMToKKwlzYXJsICAlY2wsJWVkeAorCW1vdmwgICVlZHgsJWVheAorCWNkcQorCXJldAorCisJLnNpemUgX19hc2hyZGkzLC4tX19hc2hyZGkzCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2xzaHJkaTMuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fbHNocmRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjNjNTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX2xzaHJkaTMuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2xzaHJkaTMuUworICoKKyAqIDY0LWJpdCBzaHIKKyAqLworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgX19sc2hyZGkzCisJLnR5cGUgX19sc2hyZGkzLEBmdW5jdGlvbgorX19sc2hyZGkzOgorI2lmbmRlZiBfUkVHUEFSTQorCW1vdmwgIDQoJWVzcCksJWVheAorCW1vdmwgIDgoJWVzcCksJWVkeAorCW1vdmIgIDEyKCVlc3ApLCVjbAorI2VuZGlmCisJY21wYiAgJDMyLCVjbAorCWphZSAgIDFmCisKKwlzaHJkbCAlY2wsJWVkeCwlZWF4CisJc2hybCAgJWNsLCVlZHgKKwlyZXQKKworMToKKwlzaHJsICAlY2wsJWVkeAorCXhvcmwgICVlYXgsJWVheAorCXhjaGdsICVlZHgsJWVheAorCXJldAorCisJLnNpemUgX19sc2hyZGkzLC4tX19sc2hyZGkzCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L2xpYmdjYy9fX211bGRpMy5TIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19tdWxkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzJjN2NjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19tdWxkaTMuUwpAQCAtMCwwICsxLDM0IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX211bGRpMy5TCisgKgorICogNjQqNjQgPSA2NCBiaXQgdW5zaWduZWQgbXVsdGlwbGljYXRpb24KKyAqLworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBfX211bGRpMworCS50eXBlIF9fbXVsZGkzLEBmdW5jdGlvbgorX19tdWxkaTM6CisJcHVzaCAgJWVzaQorI2lmbmRlZiBfUkVHUEFSTQorCW1vdmwgIDgoJWVzcCksJWVheAorCW1vdmwgICVlYXgsJWVzaQorCW1vdmwgIDE2KCVlc3ApLCVlY3gKKwltdWxsICAlZWN4CisJaW11bGwgMTIoJWVzcCksJWVjeAorCWltdWxsIDIwKCVlc3ApLCVlc2kKKwlhZGRsICAlZWN4LCVlZHgKKwlhZGRsICAlZXNpLCVlZHgKKyNlbHNlCisJbW92bCAgJWVheCwlZXNpCisJcHVzaCAgJWVkeAorCW11bGwgICVlY3gKKwlpbXVsbCA4KCVlc3ApLCVlc2kKKwlhZGRsICAlZXNpLCVlZHgKKwlwb3AgICAlZXNpCisJaW11bGwgJWVzaSwlZWN4CisJYWRkbCAgJWVjeCwlZWR4CisjZW5kaWYKKwlwb3AgICAlZXNpCisJcmV0CisJLnNpemUgX19tdWxkaTMsLi1fX211bGRpMwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9saWJnY2MvX19uZWdkaTIuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fbmVnZGkyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3YWQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvbGliZ2NjL19fbmVnZGkyLlMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX19uZWdkaTIuUworICoKKyAqIDY0LWJpdCBuZWdhdGlvbgorICovCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIF9fbmVnZGkyCisJLnR5cGUgX19uZWdkaTIsQGZ1bmN0aW9uCitfX25lZ2RpMjoKKyNpZm5kZWYgX1JFR1BBUk0KKwltb3ZsIDQoJWVzcCksJWVheAorCW1vdmwgOCglZXNwKSwlZWR4CisjZW5kaWYKKwluZWdsICVlZHgKKwluZWdsICVlYXgKKwlzYmJsICQwLCVlZHgKKwlyZXQKKworCS5zaXplIF9fbmVnZGkyLC4tX19uZWdkaTIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvb3Blbi5TIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9vcGVuLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkMTM2YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvb3Blbi5TCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBhcmNoL2kzODYvb3Blbi5TCisgKgorICogSGFuZGxlIHRoZSBvcGVuKCkgc3lzdGVtIGNhbGwgLSBvZGRiYWxsIGR1ZSB0byB0aGUgdmFyYWRpYworICogcHJvdG90eXBlLCB3aGljaCBmb3JjZXMgdGhlIHVzZSBvZiB0aGUgY2RlY2wgY2FsbGluZyBjb252ZW50aW9uLAorICogYW5kIHRoZSBuZWVkIGZvciBPX0xBUkdFRklMRS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisvKiA8YXNtL2ZjbnRsLmg+LCBkZXNwaXRlIHRoZSBuYW1lLCBpc24ndCBhc3NlbWJseS1zYWZlICovCisjZGVmaW5lIE9fTEFSR0VGSUxFICAgICAwMTAwMDAwCisKKwkuZ2xvYmwJb3BlbgorCS50eXBlCW9wZW4sQGZ1bmN0aW9uCisKK29wZW46CisjaWZkZWYgX1JFR1BBUk0KKwltb3ZsCTQoJWVzcCksJWVheAorCW1vdmwJOCglZXNwKSwlZWR4CisJbW92bAkxMiglZXNwKSwlZWN4CisJb3JsCSRPX0xBUkdFRklMRSwlZWR4CisjZWxzZQorCW9ybAkkT19MQVJHRUZJTEUsOCglZXNwKQorI2VuZGlmCisJcHVzaGwJJF9fTlJfb3BlbgorCWptcAlfX3N5c2NhbGxfY29tbW9uCisKKwkuc2l6ZQlvcGVuLC4tb3BlbgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni9vcGVuYXQuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvb3BlbmF0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmZGZlMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvb3BlbmF0LlMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGFyY2gvaTM4Ni9vcGVuYXQuUworICoKKyAqIEhhbmRsZSB0aGUgb3BlbmF0KCkgc3lzdGVtIGNhbGwgLSBvZGRiYWxsIGR1ZSB0byB0aGUgdmFyYWRpYworICogcHJvdG90eXBlLCB3aGljaCBmb3JjZXMgdGhlIHVzZSBvZiB0aGUgY2RlY2wgY2FsbGluZyBjb252ZW50aW9uLAorICogYW5kIHRoZSBuZWVkIGZvciBPX0xBUkdFRklMRS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisvKiA8YXNtL2ZjbnRsLmg+LCBkZXNwaXRlIHRoZSBuYW1lLCBpc24ndCBhc3NlbWJseS1zYWZlICovCisjZGVmaW5lIE9fTEFSR0VGSUxFICAgICAwMTAwMDAwCisKKyNpZmRlZiBfX05SX29wZW5hdAkJLyogRG9uJ3QgYnVpbGQgaWYga2VybmVsIGhlYWRlcnMgdG9vIG9sZCAqLworCisJLmdsb2JsCW9wZW5hdAorCS50eXBlCW9wZW5hdCxAZnVuY3Rpb24KKworb3BlbmF0OgorCW9ybAkkT19MQVJHRUZJTEUsMTIoJWVzcCkKKwlwdXNobAkkX19OUl9vcGVuYXQKKwlqbXAJX19zeXNjYWxsX3ZhcmFkaWMKKworCS5zaXplCW9wZW5hdCwuLW9wZW5hdAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NjY3OTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L3NldGptcC5TCkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgYXJjaC9pMzg2L3NldGptcC5TCisjCisjIHNldGptcC9sb25nam1wIGZvciB0aGUgaTM4NiBhcmNoaXRlY3R1cmUKKyMKKworIworIyBUaGUgam1wX2J1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZywgaW4gb3JkZXI6CisjCSVlYngKKyMJJWVzcAorIwklZWJwCisjCSVlc2kKKyMJJWVkaQorIwk8cmV0dXJuIGFkZHJlc3M+CisjCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIHNldGptcAorCS50eXBlIHNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisjaWZkZWYgX1JFR1BBUk0KKwltb3ZsICVlYXgsJWVkeAorI2Vsc2UKKwltb3ZsIDQoJWVzcCksJWVkeAorI2VuZGlmCisJcG9wbCAlZWN4CQkJIyBSZXR1cm4gYWRkcmVzcywgYW5kIGFkanVzdCB0aGUgc3RhY2sKKwl4b3JsICVlYXgsJWVheAkJCSMgUmV0dXJuIHZhbHVlCisJbW92bCAlZWJ4LCglZWR4KQorCW1vdmwgJWVzcCw0KCVlZHgpCQkjIFBvc3QtcmV0dXJuICVlc3AhCisJcHVzaGwgJWVjeAkJCSMgTWFrZSB0aGUgY2FsbC9yZXR1cm4gc3RhY2sgaGFwcHkKKwltb3ZsICVlYnAsOCglZWR4KQorCW1vdmwgJWVzaSwxMiglZWR4KQorCW1vdmwgJWVkaSwxNiglZWR4KQorCW1vdmwgJWVjeCwyMCglZWR4KQkJIyBSZXR1cm4gYWRkcmVzcworCXJldAorCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCBAZnVuY3Rpb24KK2xvbmdqbXA6CisjaWZkZWYgX1JFR1BBUk0KKwl4Y2hnbCAlZWF4LCVlZHgKKyNlbHNlCisJbW92bCA0KCVlc3ApLCVlZHgJCSMgam1wX3B0ciBhZGRyZXNzCisJbW92bCA4KCVlc3ApLCVlYXgJCSMgUmV0dXJuIHZhbHVlCisjZW5kaWYKKwltb3ZsICglZWR4KSwlZWJ4CisJbW92bCA0KCVlZHgpLCVlc3AKKwltb3ZsIDgoJWVkeCksJWVicAorCW1vdmwgMTIoJWVkeCksJWVzaQorCW1vdmwgMTYoJWVkeCksJWVkaQorCWptcCAqMjAoJWVkeCkKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pMzg2L3NvY2tldGNhbGwuUyBiL3Vzci9rbGliYy9hcmNoL2kzODYvc29ja2V0Y2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MGNjMDIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L3NvY2tldGNhbGwuUwpAQCAtMCwwICsxLDU1IEBACisjCisjIHNvY2tldGNhbGwuUworIworIyBTb2NrZXRjYWxscyB1c2UgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uOgorIyAlZWF4ID0gX19OUl9zb2NrZXRjYWxsCisjICVlYnggPSBzb2NrZXRjYWxsIG51bWJlcgorIyAlZWN4ID0gcG9pbnRlciB0byBhcmd1bWVudHMgKHVwIHRvIDYpCisjCisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKyNpZmRlZiBfX2kzODZfXworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBfX3NvY2tldGNhbGxfY29tbW9uCisJLnR5cGUgX19zb2NrZXRjYWxsX2NvbW1vbiwgQGZ1bmN0aW9uCisKK19fc29ja2V0Y2FsbF9jb21tb246CisJeGNoZ2wJJWVieCwoJWVzcCkJIyBUaGUgc3R1YiBwYXNzZXMgdGhlIHNvY2tldGNhbGwgIyBvbiBzdGFjaworCisjaWZkZWYJX1JFR1BBUk0KKwlwdXNobAkxNiglZXNwKQkjIEFyZyA2CisJcHVzaGwJMTYoJWVzcCkJIyBBcmcgNQorCXB1c2hsCTE2KCVlc3ApCSMgQXJnIDQKKwlwdXNobAklZWN4CisJcHVzaGwJJWVkeAorCXB1c2hsCSVlYXgKKwltb3ZsCSVlc3AsJWVjeAorI2Vsc2UKKwlsZWFsCTgoJWVzcCksJWVjeAkjIEFyZ3VtZW50cyBhbHJlYWR5IGNvbnRpZ3VvdXMgb24tc3RhY2sKKyNlbmRpZgorCisJbW92bAkkX19OUl9zb2NrZXRjYWxsLCVlYXgKKwlpbnQJJDB4ODAKKworI2lmZGVmCV9SRUdQQVJNCisJYWRkbAkkNio0LCAlZXNwCisjZW5kaWYKKworCWNtcGwJJC00MDk1LCVlYXgJIyBFcnJvciByZXR1cm4/CisKKwlwb3BsCSVlYngKKworCWpiCTFmCisKKwluZWdsCSVlYXgKKwltb3ZsCSVlYXgsZXJybm8KKwlvcmwJJC0xLCVlYXgJIyBSZXR1cm4gLTEKKzE6CisJcmV0CisKKwkuc2l6ZSBfX3NvY2tldGNhbGxfY29tbW9uLC4tX19zb2NrZXRjYWxsX2NvbW1vbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NzE3YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2kzODYvc3lzY2FsbC5TCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBhcmNoL2kzODYvc3lzY2FsbC5TCisgKgorICogQ29tbW9uIHRhaWwtaGFuZGxpbmcgY29kZSBmb3Igc3lzdGVtIGNhbGxzLgorICoKKyAqIFRoZSBhcmd1bWVudHMgYXJlIG9uIHRoZSBzdGFjazsgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpbiAlZWF4LgorICovCisKKyNkZWZpbmUgQVJHKG4pCSg0Km4rMjApKCVlc3ApCisKKwkudGV4dAorCS5hbGlnbgk0CisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KKwkudHlwZQlfX3N5c2NhbGxfY29tbW9uLEBmdW5jdGlvbgorX19zeXNjYWxsX2NvbW1vbjoKKyNpZmRlZiBfUkVHUEFSTQorCXhjaGdsCSVlYngsKCVlc3ApCisjZWxzZQorCXBvcGwJJWVheAorCXB1c2hsCSVlYngKKyNlbmRpZgorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVicAorCisjaWZkZWYgX1JFR1BBUk0KKwl4Y2hnbAklZWF4LCVlYngKKwl4Y2hnbAklZWN4LCVlZHgKKwltb3ZsCUFSRygwKSwlZXNpCisJbW92bAlBUkcoMSksJWVkaQorCW1vdmwJQVJHKDIpLCVlYnAKKyNlbHNlCisJbW92bAlBUkcoMCksJWVieAkJIyBTeXNjYWxsIGFyZ3VtZW50cworCW1vdmwJQVJHKDEpLCVlY3gKKwltb3ZsCUFSRygyKSwlZWR4CisJbW92bAlBUkcoMyksJWVzaQorCW1vdmwJQVJHKDQpLCVlZGkKKwltb3ZsCUFSRyg1KSwlZWJwCisjZW5kaWYKKwkuZ2xvYmwgX19zeXNjYWxsX2NvbW1vbl90YWlsCitfX3N5c2NhbGxfY29tbW9uX3RhaWw6CisJaW50CSQweDgwCisKKwljbXBsCSQtNDA5NSwlZWF4CisKKwlwb3BsCSVlYnAKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKworCWpiCTFmCisKKwkjIEVycm9yIHJldHVybiwgbXVzdCBzZXQgZXJybm8KKwluZWdsCSVlYXgKKwltb3ZsCSVlYXgsZXJybm8KKwlvcmwJJC0xLCVlYXgJCSMgUmV0dXJuIC0xCisKKzE6CisJcmV0CisKKwkuc2l6ZQlfX3N5c2NhbGxfY29tbW9uLC4tX19zeXNjYWxsX2NvbW1vbgorCisjaWZuZGVmIF9SRUdQQVJNCisKKwkuZ2xvYmwJX19zeXNjYWxsX3ZhcmFkaWMKKwkudHlwZQlfX3N5c2NhbGxfdmFyYWRpYyxAZnVuY3Rpb24KK19fc3lzY2FsbF92YXJhZGljID0gX19zeXNjYWxsX2NvbW1vbgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2kzODYvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL2kzODYvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzNhM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMjYgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvaTM4Ni9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlICR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKworICAgICRzdHlwZSA9ICdjb21tb24nIGlmICggJHN0eXBlIGVxICcnICk7CisKKyAgICBwcmludCBPVVQgIlx0cHVzaGwgXCRfX05SXyR7c25hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHRqbXAgX19zeXNjYWxsXyRzdHlwZVxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni92YXJzeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9pMzg2L3ZhcnN5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMyOWVhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni92YXJzeXNjYWxsLlMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGFyY2gvaTM4Ni92YXJzeXNjYWxsLlMKKyAqCisgKiBDb21tb24gdGFpbC1oYW5kbGluZyBjb2RlIGZvciB2YXJhZGljIHN5c3RlbSBjYWxscyAod2hpY2ggYWx3YXlzCisgKiB1c2UgdGhlIGNkZWNsIGNvbnZlbnRpb24uKQorICoKKyAqIFRoZSBhcmd1bWVudHMgYXJlIG9uIHRoZSBzdGFjazsgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpbiAlZWF4LgorICovCisKKyNpZmRlZglfUkVHUEFSTQorCisjZGVmaW5lIEFSRyhuKQkoNCpuKzIwKSglZXNwKQorCisJLnRleHQKKwkuYWxpZ24JNAorCS5nbG9ibAlfX3N5c2NhbGxfdmFyYWRpYworCS50eXBlCV9fc3lzY2FsbF92YXJhZGljLEBmdW5jdGlvbgorX19zeXNjYWxsX3ZhcmFkaWM6CisJcG9wbAklZWF4CisJcHVzaGwJJWVieAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVicAorCisJbW92bAlBUkcoMCksJWVieAkJIyBTeXNjYWxsIGFyZ3VtZW50cworCW1vdmwJQVJHKDEpLCVlY3gKKwltb3ZsCUFSRygyKSwlZWR4CisJbW92bAlBUkcoMyksJWVzaQorCW1vdmwJQVJHKDQpLCVlZGkKKwltb3ZsCUFSRyg1KSwlZWJwCisKKwlqbXAJX19zeXNjYWxsX2NvbW1vbl90YWlsCisKKwkuc2l6ZQlfX3N5c2NhbGxfdmFyYWRpYywuLV9fc3lzY2FsbF92YXJhZGljCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaTM4Ni92Zm9yay5TIGIvdXNyL2tsaWJjL2FyY2gvaTM4Ni92Zm9yay5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGJhM2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pMzg2L3Zmb3JrLlMKQEAgLTAsMCArMSwyNiBAQAorIworIyB1c3Iva2xpYmMvYXJjaC9pMzg2L3Zmb3JrLlMKKyMKKyMgdmZvcmsgaXMgbmFzdHkgLSB0aGVyZSBtdXN0IGJlIG5vdGhpbmcgYXQgYWxsIG9uIHRoZSBzdGFjayBhYm92ZQorIyB0aGUgc3RhY2sgZnJhbWUgb2YgdGhlIGVuY2xvc2luZyBmdW5jdGlvbi4KKyMKKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworICAgICAgICAudGV4dAorICAgICAgICAuYWxpZ24gIDQKKwkuZ2xvYmwJdmZvcmsKKwkudHlwZQl2Zm9yaywgQGZ1bmN0aW9uCit2Zm9yazoKKwlwb3BsCSVlZHgJCQkvKiBSZXR1cm4gYWRkcmVzcyAqLworCW1vdmwJJF9fTlJfdmZvcmssICVlYXgKKwlpbnQJJDB4ODAKKwlwdXNobAklZWR4CisJY21wbAkkLTQwOTUsICVlYXgKKwlqYWUJMWYKKwlyZXQKKzE6CisJbmVnbAklZWF4CisJbW92bAklZWF4LCBlcnJubworCW9ybAkkLTEsICVlYXgKKwlyZXQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2lhNjQvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwNzBmZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvS2J1aWxkCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIGlhNjQKKyMKKwora2xpYi15IDo9IHZmb3JrLm8gc2V0am1wLm8gcGlwZS5vIHN5c2NhbGwubworCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fZGl2ZGkzLm8gICAgIC4uLy4uL2xpYmdjYy9fX2RpdnNpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdmRpMy5vICAgIC4uLy4uL2xpYmdjYy9fX3VkaXZzaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3Vtb2RzaTMubyAgICAuLi8uLi9saWJnY2MvX191bW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2bW9kc2k0Lm8gLi4vLi4vbGliZ2NjL19fdWRpdm1vZGRpNC5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaWE2NC9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODY4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pYTY0L01DT05GSUcKQEAgLTAsMCArMSwxMSBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvaWE2NC9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNPUFRGTEFHUyArPSAtT3MKK0tMSUJDQklUU0laRSAgPSA2NApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaWE2NC9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9pYTY0L2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjIyNzZlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9jcnQwLlMKQEAgLTAsMCArMSwyNyBAQAorCisjaW5jbHVkZSA8YXNtL2ZwdS5oPgorCisJLmFsaWduIDMyCisJLmdsb2JhbCBfc3RhcnQKKworCS5wcm9jIF9zdGFydAorCS50eXBlIF9zdGFydCxAZnVuY3Rpb24KK19zdGFydDoKKwkucHJvbG9ndWUKKwkuc2F2ZSBycCwgcjAKKworCWFsbG9jIHIyID0gYXIucGZzLDAsMCwyLDAKKwltb3ZsIHIzID0gRlBTUl9ERUZBVUxUCisJOzsKKwlhZGRzIG91dDA9IDE2LHNwICAgIC8qIGFyZ2MgcG9pbnRlciAqLworCW1vdmwgZ3AgPSBAZ3ByZWwoMGYpCiswOgltb3YgcjkgPSBpcAorCTs7CisJc3ViIGdwID0gcjksIGdwICAgICAvKiBiYWNrLWNvbXB1dGUgZ3AgdmFsdWUgKi8KKworCS5ib2R5CisJYnIuY2FsbC5zcHRrLmZldyBycCA9IF9fbGliY19pbml0CisJOzsKKwlicmVhayAwICAgICAgICAgICAgIC8qIGJyZWFrIG1pc2VyYWJseSBpZiB3ZSBldmVyIHJldHVybiAqLworCisJLmVuZHAgX3N0YXJ0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pYTY0L3BpcGUuYyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhM2EyNzIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9pYTY0L3BpcGUuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogcGlwZS5jCisgKi8KKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8a2xpYmMvYXJjaHN5cy5oPgorCisjZGVmaW5lIEFTTV9DTE9CQkVSUyAsIm91dDIiLCAib3V0MyIsICJvdXQ0IiwgIm91dDUiLCAib3V0NiIsICJvdXQ3IiwgICAgXAorICAgLyogTm9uLXN0YWNrZWQgaW50ZWdlciByZWdpc3RlcnMsIG1pbnVzIHI4LCByOSwgcjEwLCByMTUuICAqLwlcCisgICJyMiIsICJyMyIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE2IiwgInIxNyIsICJyMTgiLAkgICAgICAgIFwKKyAgInIxOSIsICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAicjI0IiwgInIyNSIsICJyMjYiLCAicjI3IiwJXAorICAicjI4IiwgInIyOSIsICJyMzAiLCAicjMxIiwJCQkJCQlcCisgIC8qIFByZWRpY2F0ZSByZWdpc3RlcnMuICAqLwkJCQkJCVwKKyAgInA2IiwgInA3IiwgInA4IiwgInA5IiwgInAxMCIsICJwMTEiLCAicDEyIiwgInAxMyIsICJwMTQiLCAicDE1IiwJXAorICAvKiBOb24tcm90YXRpbmcgZnAgcmVnaXN0ZXJzLiAgKi8JCQkJCVwKKyAgImY2IiwgImY3IiwgImY4IiwgImY5IiwgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwJXAorICAvKiBCcmFuY2ggcmVnaXN0ZXJzLiAgKi8JCQkJCQlcCisgICJiNiIsICJiNyIKKworaW50IHBpcGUoaW50ICpmaWxlZGVzKQoreworCXJlZ2lzdGVyIGxvbmcgX3I4IGFzbSgicjgiKTsKKwlyZWdpc3RlciBsb25nIF9yOSBhc20oInI5Iik7CisJcmVnaXN0ZXIgbG9uZyBfcjEwIGFzbSgicjEwIik7CisJcmVnaXN0ZXIgbG9uZyBfcjE1IGFzbSgicjE1IikgPSBfX05SX3BpcGU7CisJcmVnaXN0ZXIgbG9uZyBfb3V0MCBhc20oIm91dDAiKSA9IChsb25nKWZpbGVkZXM7CisJbG9uZyBfcmV0dmFsOworCV9fYXNtIF9fdm9sYXRpbGUoX19JQTY0X0JSRUFLOiI9ciIoX3I4KSwgIj1yIihfcjEwKSwgIj1yIihfcjE1KSwKKwkJCSAiPXIiKF9vdXQwKSwgIj1yIihfcjkpCisJCQkgOiIyIihfcjE1KSwgIjMiKF9vdXQwKQorCQkJIDoibWVtb3J5IiBBU01fQ0xPQkJFUlMpOworCWlmIChfcjEwID09IC0xKSB7CisJCWVycm5vID0gX3I4OworCQlfcmV0dmFsID0gLTE7CisJfSBlbHNlIHsKKwkJZmlsZWRlc1swXSA9IF9yODsKKwkJZmlsZWRlc1sxXSA9IF9yOTsKKwkJX3JldHZhbCA9IDA7CisJfQorCXJldHVybiBfcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvaWE2NC9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxY2VhMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvc2V0am1wLlMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBJQS02NCBzcGVjaWZpYyBzZXRqbXAvbG9uZ2ptcCByb3V0aW5lcworICoKKyAqIEluc3BpcmVkIGJ5IHNldGptcC5zIGZyb20gdGhlIEZyZWVCU0Qga2VybmVsLgorICovCisKKyNkZWZpbmUJSl9VTkFUCQkwCisjZGVmaW5lCUpfTkFUUwkJMHg4CisjZGVmaW5lCUpfUEZTCQkweDEwCisjZGVmaW5lCUpfQlNQCQkweDE4CisjZGVmaW5lCUpfUk5BVAkJMHgyMAorI2RlZmluZQlKX1BSRURTCQkweDI4CisjZGVmaW5lCUpfTEMJCTB4MzAKKyNkZWZpbmUJSl9SNAkJMHgzOAorI2RlZmluZQlKX1I1CQkweDQwCisjZGVmaW5lCUpfUjYJCTB4NDgKKyNkZWZpbmUJSl9SNwkJMHg1MAorI2RlZmluZQlKX1NQCQkweDU4CisjZGVmaW5lCUpfRjIJCTB4NjAKKyNkZWZpbmUJSl9GMwkJMHg3MAorI2RlZmluZQlKX0Y0CQkweDgwCisjZGVmaW5lCUpfRjUJCTB4OTAKKyNkZWZpbmUJSl9GMTYJCTB4YTAKKyNkZWZpbmUJSl9GMTcJCTB4YjAKKyNkZWZpbmUJSl9GMTgJCTB4YzAKKyNkZWZpbmUJSl9GMTkJCTB4ZDAKKyNkZWZpbmUJSl9GMjAJCTB4ZTAKKyNkZWZpbmUJSl9GMjEJCTB4ZjAKKyNkZWZpbmUJSl9GMjIJCTB4MTAwCisjZGVmaW5lCUpfRjIzCQkweDExMAorI2RlZmluZQlKX0YyNAkJMHgxMjAKKyNkZWZpbmUJSl9GMjUJCTB4MTMwCisjZGVmaW5lCUpfRjI2CQkweDE0MAorI2RlZmluZQlKX0YyNwkJMHgxNTAKKyNkZWZpbmUJSl9GMjgJCTB4MTYwCisjZGVmaW5lCUpfRjI5CQkweDE3MAorI2RlZmluZQlKX0YzMAkJMHgxODAKKyNkZWZpbmUJSl9GMzEJCTB4MTkwCisjZGVmaW5lCUpfRlBTUgkJMHgxYTAKKyNkZWZpbmUJSl9CMAkJMHgxYTgKKyNkZWZpbmUJSl9CMQkJMHgxYjAKKyNkZWZpbmUJSl9CMgkJMHgxYjgKKyNkZWZpbmUJSl9CMwkJMHgxYzAKKyNkZWZpbmUJSl9CNAkJMHgxYzgKKyNkZWZpbmUJSl9CNQkJMHgxZDAKKyNkZWZpbmUJSl9TSUdNQVNLCTB4MWQ4CisjZGVmaW5lCUpfU0lHU0VUCTB4MWUwCisjZGVmaW5lCUpfR1AJCTB4MWYwCisKKy8vIGludCBzZXRqbXAoc3RydWN0IGptcF9idWZmZXIgKikKKy8vCisvLyAgU2V0dXAgYSBub24tbG9jYWwgZ290by4KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLyAgU2V0SnVtcCBzdG9yZXMgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgc2V0IGluIHRoZSBhcmVhIHBvaW50ZWQgdG8KKy8vICBieSAic2F2ZSIuICBJdCByZXR1cm5zIHplcm8uICBTdWJzZXF1ZW50IGNhbGxzIHRvICJMb25nSnVtcCIgd2lsbAorLy8gIHJlc3RvcmUgdGhlIHJlZ2lzdGVycyBhbmQgcmV0dXJuIG5vbi16ZXJvIHRvIHRoZSBzYW1lIGxvY2F0aW9uLgorLy8KKy8vIE9uIGVudHJ5LCByMzIgY29udGFpbnMgdGhlIHBvaW50ZXIgdG8gdGhlIGptcF9idWZmZXIKKy8vCisJLmFsaWduIDMyCisJLmdsb2JhbCBzZXRqbXAKKwkucHJvYyBzZXRqbXAKK3NldGptcDoKKyAgICAvLworICAgIC8vICBNYWtlIHN1cmUgYnVmZmVyIGlzIGFsaWduZWQgYXQgMTZieXRlIGJvdW5kYXJ5CisgICAgLy8KKyAgICBhZGQgICAgIHIxMCA9IC0weDEwLHIwICA7OyAgLy8gbWFzayB0aGUgbG93ZXIgNCBiaXRzCisgICAgYW5kICAgICByMzIgPSByMzIsIHIxMDs7CisgICAgYWRkICAgICByMzIgPSAweDEwLCByMzI7OyAgIC8vIG1vdmUgdG8gbmV4dCAxNiBieXRlIGJvdW5kYXJ5CisKKyAgICBhZGQgICAgIHIxMCA9IEpfUFJFRFMsIHIzMiAgLy8gc2tpcCBVbmF0cyAmIHBmcyBzYXZlIGFyZWEKKyAgICBhZGQgICAgIHIxMSA9IEpfQlNQLCByMzIKKyAgICAvLworICAgIC8vICBzYXZlIGltbWVkaWF0ZSBjb250ZXh0CisgICAgLy8KKyAgICBtb3YgICAgIHIyID0gYXIuYnNwICAgICAgICAgLy8gc2F2ZSBiYWNraW5nIHN0b3JlIHBvaW50ZXIKKyAgICBtb3YgICAgIHIzID0gcHIgICAgICAgICAgICAgLy8gc2F2ZSBwcmVkaWNhdGVzCisgICAgZmx1c2hycworICAgIDs7CisgICAgLy8KKyAgICAvLyBzYXZlIHVzZXIgVW5hdCByZWdpc3RlcgorICAgIC8vCisgICAgbW92ICAgICByMTYgPSBhci5sYyAgICAgICAgIC8vIHNhdmUgbG9vcCBjb3VudCByZWdpc3RlcgorICAgIG1vdiAgICAgcjE0ID0gYXIudW5hdCAgICAgICAvLyBzYXZlIHVzZXIgVW5hdCByZWdpc3RlcgorCisgICAgc3Q4ICAgICBbcjEwXSA9IHIzLCBKX0xDLUpfUFJFRFMKKyAgICBzdDggICAgIFtyMTFdID0gcjIsIEpfUjQtSl9CU1AKKyAgICA7OworICAgIHN0OCAgICAgW3IxMF0gPSByMTYsIEpfUjUtSl9MQworICAgIHN0OCAgICAgW3IzMl0gPSByMTQsIEpfTkFUUyAvLyBOb3RlOiBVbmF0IGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHNhdmUgYXJlYQorICAgIG1vdiAgICAgcjE1ID0gYXIucGZzCisgICAgOzsKKyAgICAvLworICAgIC8vICBzYXZlIHByZXNlcnZlZCBnZW5lcmFsIHJlZ2lzdGVycyAmIE5hVCdzCisgICAgLy8KKyAgICBzdDguc3BpbGwgICBbcjExXSA9IHI0LCBKX1I2LUpfUjQKKyAgICA7OworICAgIHN0OC5zcGlsbCAgIFtyMTBdID0gcjUsIEpfUjctSl9SNQorICAgIDs7CisgICAgc3Q4LnNwaWxsICAgW3IxMV0gPSByNiwgSl9TUC1KX1I2CisgICAgOzsKKyAgICBzdDguc3BpbGwgICBbcjEwXSA9IHI3LCBKX0YzLUpfUjcKKyAgICA7OworICAgIHN0OC5zcGlsbCAgIFtyMTFdID0gc3AsIEpfRjItSl9TUAorICAgIDs7CisgICAgLy8KKyAgICAvLyBzYXZlIHNwaWxsZWQgVW5hdCBhbmQgcGZzIHJlZ2lzdGVycworICAgIC8vCisgICAgbW92ICAgICByMiA9IGFyLnVuYXQgICAgICAgIC8vIHNhdmUgVW5hdCByZWdpc3RlciBhZnRlciBzcGlsbAorICAgIDs7CisgICAgc3Q4ICAgICBbcjMyXSA9IHIyLCBKX1BGUy1KX05BVFMgICAgLy8gc2F2ZSB1bmF0IGZvciBzcGlsbGVkIHJlZ3MKKyAgICA7OworICAgIHN0OCAgICAgW3IzMl0gPSByMTUgICAgICAgICAvLyBzYXZlIHBmcworICAgIC8vCisgICAgLy8gIHNhdmUgZmxvYXRpbmcgcmVnaXN0ZXJzCisgICAgLy8KKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGYyLCBKX0Y0LUpfRjIKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGYzLCBKX0Y1LUpfRjMKKyAgICA7OworICAgIHN0Zi5zcGlsbCAgIFtyMTFdID0gZjQsIEpfRjE2LUpfRjQKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGY1LCBKX0YxNy1KX0Y1CisgICAgOzsKKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGYxNiwgSl9GMTgtSl9GMTYKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGYxNywgSl9GMTktSl9GMTcKKyAgICA7OworICAgIHN0Zi5zcGlsbCAgIFtyMTFdID0gZjE4LCBKX0YyMC1KX0YxOAorICAgIHN0Zi5zcGlsbCAgIFtyMTBdID0gZjE5LCBKX0YyMS1KX0YxOQorICAgIDs7CisgICAgc3RmLnNwaWxsICAgW3IxMV0gPSBmMjAsIEpfRjIyLUpfRjIwCisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmMjEsIEpfRjIzLUpfRjIxCisgICAgOzsKKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGYyMiwgSl9GMjQtSl9GMjIKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGYyMywgSl9GMjUtSl9GMjMKKyAgICA7OworICAgIHN0Zi5zcGlsbCAgIFtyMTFdID0gZjI0LCBKX0YyNi1KX0YyNAorICAgIHN0Zi5zcGlsbCAgIFtyMTBdID0gZjI1LCBKX0YyNy1KX0YyNQorICAgIDs7CisgICAgc3RmLnNwaWxsICAgW3IxMV0gPSBmMjYsIEpfRjI4LUpfRjI2CisgICAgc3RmLnNwaWxsICAgW3IxMF0gPSBmMjcsIEpfRjI5LUpfRjI3CisgICAgOzsKKyAgICBzdGYuc3BpbGwgICBbcjExXSA9IGYyOCwgSl9GMzAtSl9GMjgKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGYyOSwgSl9GMzEtSl9GMjkKKyAgICA7OworICAgIHN0Zi5zcGlsbCAgIFtyMTFdID0gZjMwLCBKX0ZQU1ItSl9GMzAKKyAgICBzdGYuc3BpbGwgICBbcjEwXSA9IGYzMSwgSl9CMC1KX0YzMSAgICAgLy8gc2l6ZSBvZiBmMzEgKyBmcHNyCisgICAgLy8KKyAgICAvLyBzYXZlIEZQU1IgcmVnaXN0ZXIgJiBicmFuY2ggcmVnaXN0ZXJzCisgICAgLy8KKyAgICBtb3YgICAgIHIyID0gYXIuZnBzciAgICAvLyBzYXZlIGZwc3IgcmVnaXN0ZXIKKyAgICBtb3YgICAgIHIzID0gYjAKKyAgICA7OworICAgIHN0OCAgICAgW3IxMV0gPSByMiwgSl9CMS1KX0ZQU1IKKyAgICBzdDggICAgIFtyMTBdID0gcjMsIEpfQjItSl9CMAorICAgIG1vdiAgICAgcjIgPSBiMQorICAgIG1vdiAgICAgcjMgPSBiMgorICAgIDs7CisgICAgc3Q4ICAgICBbcjExXSA9IHIyLCBKX0IzLUpfQjEKKyAgICBzdDggICAgIFtyMTBdID0gcjMsIEpfQjQtSl9CMgorICAgIG1vdiAgICAgcjIgPSBiMworICAgIG1vdiAgICAgcjMgPSBiNAorICAgIDs7CisgICAgc3Q4ICAgICBbcjExXSA9IHIyLCBKX0I1LUpfQjMKKyAgICBzdDggICAgIFtyMTBdID0gcjMKKyAgICBtb3YgICAgIHIyID0gYjUKKyAgICA7OworICAgIHN0OCAgICAgW3IxMV0gPSByMgorICAgIDs7CisgICAgLy8KKyAgICAvLyByZXR1cm4KKyAgICAvLworICAgIG1vdiAgICAgcjggPSByMCAgICAgICAgIC8vIHJldHVybiAwIGZyb20gc2V0am1wCisgICAgbW92ICAgICBhci51bmF0ID0gcjE0ICAgLy8gcmVzdG9yZSB1bmF0CisgICAgYnIucmV0LnNwdGsgYjAKKyAgICAuZW5kcCBzZXRqbXAKKworLy8KKy8vIHZvaWQgbG9uZ2ptcChzdHJ1Y3Qgam1wX2J1ZmZlciAqLCBpbnQgdmFsKQorLy8KKy8vICBQZXJmb3JtIGEgbm9uLWxvY2FsIGdvdG8uCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8gIExvbmdKdW1wIGluaXRpYWxpemVzIHRoZSByZWdpc3RlciBzZXQgdG8gdGhlIHZhbHVlcyBzYXZlZCBieSBhCisvLyAgcHJldmlvdXMgJ1NldEp1bXAnIGFuZCBqdW1wcyB0byB0aGUgcmV0dXJuIGxvY2F0aW9uIHNhdmVkIGJ5IHRoYXQKKy8vICAnU2V0SnVtcCcuICBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHVud2luZGluZyB0aGUgc3RhY2sgYW5kIHJldHVybmluZworLy8gIGZvciBhIHNlY29uZCB0aW1lIHRvIHRoZSAnU2V0SnVtcCcuCisvLworCisJLmFsaWduIDMyCisJLmdsb2JhbCBsb25nam1wCisJLnByb2MgbG9uZ2ptcAorbG9uZ2ptcDoKKyAgICAvLworICAgIC8vICBNYWtlIHN1cmUgYnVmZmVyIGlzIGFsaWduZWQgYXQgMTZieXRlIGJvdW5kYXJ5CisgICAgLy8KKyAgICBhZGQgICAgIHIxMCA9IC0weDEwLHIwICA7OyAgLy8gbWFzayB0aGUgbG93ZXIgNCBiaXRzCisgICAgYW5kICAgICByMzIgPSByMzIsIHIxMDs7CisgICAgYWRkICAgICByMzIgPSAweDEwLCByMzI7OyAgIC8vIG1vdmUgdG8gbmV4dCAxNiBieXRlIGJvdW5kYXJ5CisKKyAgICAvLworICAgIC8vIGNhY2hpbmcgdGhlIHJldHVybiB2YWx1ZSBhcyB3ZSBkbyBpbnZhbGEgaW4gdGhlIGVuZAorICAgIC8vCisgICAgbW92ICAgICByOCA9IHIzMyAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZQorCisgICAgLy8KKyAgICAvLyAgZ2V0IGltbWVkaWF0ZSBjb250ZXh0CisgICAgLy8KKyAgICBtb3YgICAgIHIxNCA9IGFyLnJzYyAgICAgICAgLy8gZ2V0IHVzZXIgUlNDIGNvbmYKKyAgICBhZGQgICAgIHIxMCA9IEpfUEZTLCByMzIgICAgLy8gZ2V0IGFkZHJlc3Mgb2YgcGZzCisgICAgYWRkICAgICByMTEgPSBKX05BVFMsIHIzMgorICAgIDs7CisgICAgbGQ4ICAgICByMTUgPSBbcjEwXSwgSl9CU1AtSl9QRlMgICAgLy8gZ2V0IHBmcworICAgIGxkOCAgICAgcjIgPSBbcjExXSwgSl9MQy1KX05BVFMgICAgIC8vIGdldCB1bmF0IGZvciBzcGlsbGVkIHJlZ3MKKyAgICA7OworICAgIG1vdiAgICAgYXIudW5hdCA9IHIyCisgICAgOzsKKyAgICBsZDggICAgIHIxNiA9IFtyMTBdLCBKX1BSRURTLUpfQlNQICAvLyBnZXQgYmFja2luZyBzdG9yZSBwb2ludGVyCisgICAgbW92ICAgICBhci5yc2MgPSByMCAgICAgICAgIC8vIHB1dCBSU0UgaW4gZW5mb3JjZWQgbGF6eQorICAgIG1vdiAgICAgYXIucGZzID0gcjE1CisgICAgOzsKKworICAgIC8vCisgICAgLy8gd2hpbGUgcmV0dXJuaW5nIGZyb20gbG9uZ2ptcCB0aGUgQlNQU1RPUkUgYW5kIEJTUCBuZWVkcyB0byBiZQorICAgIC8vIHNhbWUgYW5kIGRpc2NhcmQgYWxsIHRoZSByZWdpc3RlcnMgYWxsb2NhdGVkIGFmdGVyIHdlIGRpZAorICAgIC8vIHNldGptcC4gQWxzbywgd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgUk5BVCByZWdpc3RlciBzaW5jZSB3ZQorICAgIC8vIGRpZCBub3QgZmx1c2hlZCB0aGUgUlNFIG9uIHNldGptcC4KKyAgICAvLworICAgIG1vdiAgICAgcjE3ID0gYXIuYnNwc3RvcmUgICAvLyBnZXQgY3VycmVudCBCU1BTVE9SRQorICAgIDs7CisgICAgY21wLmx0dSBwNixwNyA9IHIxNywgcjE2ICAgIC8vIGlzIGl0IGxlc3MgdGhhbiBCU1Agb2YKKyhwNikgICAgYnIuc3BudC5mZXcgLmZsdXNoX3JzZQorICAgIG1vdiAgICAgcjE5ID0gYXIucm5hdCAgICAgICAvLyBnZXQgY3VycmVudCBSTkFUCisgICAgOzsKKyAgICBsb2FkcnMgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSBkaXJ0eSByZWdzCisgICAgYnIuc3B0ay5tYW55ICAgIC5yZXN0b3JlX3JuYXQgICAgICAgLy8gcmVzdG9yZSBSTkFUCisKKy5mbHVzaF9yc2U6CisgICAgZmx1c2hycworICAgIDs7CisgICAgbW92ICAgICByMTkgPSBhci5ybmF0ICAgICAgIC8vIGdldCBjdXJyZW50IFJOQVQKKyAgICBtb3YgICAgIHIxNyA9IHIxNiAgICAgICAgICAgLy8gY3VycmVudCBCU1BTVE9SRQorICAgIDs7CisucmVzdG9yZV9ybmF0OgorICAgIC8vCisgICAgLy8gY2hlY2sgaWYgUk5BVCBpcyBzYXZlZCBiZXR3ZWVuIHNhdmVkIEJTUCBhbmQgY3VyciBCU1BTVE9SRQorICAgIC8vCisgICAgbW92ICAgICByMTggPSAweDNmCisgICAgOzsKKyAgICBkZXAgICAgIHIxOCA9IHIxOCxyMTYsMyw2ICAgLy8gZ2V0IFJOQVQgYWRkcmVzcworICAgIDs7CisgICAgY21wLmx0dSBwOCxwOSA9IHIxOCwgcjE3ICAgIC8vIFJOQVQgc2F2ZWQgb24gUlNFCisgICAgOzsKKyhwOCkgICAgbGQ4ICAgICByMTkgPSBbcjE4XSAgICAgLy8gZ2V0IFJOQVQgZnJvbSBSU0UKKyAgICA7OworICAgIG1vdiAgICAgYXIuYnNwc3RvcmUgPSByMTYgICAvLyBzZXQgbmV3IEJTUFNUT1JFCisgICAgOzsKKyAgICBtb3YgICAgIGFyLnJuYXQgPSByMTkgICAgICAgLy8gcmVzdG9yZSBSTkFUCisgICAgbW92ICAgICBhci5yc2MgPSByMTQgICAgICAgIC8vIHJlc3RvcmUgUlNDIGNvbmYKKworCisgICAgbGQ4ICAgICByMyA9IFtyMTFdLCBKX1I0LUpfTEMgICAgICAgLy8gZ2V0IGxjIHJlZ2lzdGVyCisgICAgbGQ4ICAgICByMiA9IFtyMTBdLCBKX1I1LUpfUFJFRFMgICAgLy8gZ2V0IHByZWRpY2F0ZXMKKyAgICA7OworICAgIG1vdiAgICAgcHIgPSByMiwgLTEKKyAgICBtb3YgICAgIGFyLmxjID0gcjMKKyAgICAvLworICAgIC8vICByZXN0b3JlIHByZXNlcnZlZCBnZW5lcmFsIHJlZ2lzdGVycyAmIE5hVCdzCisgICAgLy8KKyAgICBsZDguZmlsbCAgICByNCA9IFtyMTFdLCBKX1I2LUpfUjQKKyAgICA7OworICAgIGxkOC5maWxsICAgIHI1ID0gW3IxMF0sIEpfUjctSl9SNQorICAgIGxkOC5maWxsICAgIHI2ID0gW3IxMV0sIEpfU1AtSl9SNgorICAgIDs7CisgICAgbGQ4LmZpbGwgICAgcjcgPSBbcjEwXSwgSl9GMi1KX1I3CisgICAgbGQ4LmZpbGwgICAgc3AgPSBbcjExXSwgSl9GMy1KX1NQCisgICAgOzsKKyAgICAvLworICAgIC8vICByZXN0b3JlIGZsb2F0aW5nIHJlZ2lzdGVycworICAgIC8vCisgICAgbGRmLmZpbGwgICAgZjIgPSBbcjEwXSwgSl9GNC1KX0YyCisgICAgbGRmLmZpbGwgICAgZjMgPSBbcjExXSwgSl9GNS1KX0YzCisgICAgOzsKKyAgICBsZGYuZmlsbCAgICBmNCA9IFtyMTBdLCBKX0YxNi1KX0Y0CisgICAgbGRmLmZpbGwgICAgZjUgPSBbcjExXSwgSl9GMTctSl9GNQorICAgIDs7CisgICAgbGRmLmZpbGwgICAgZjE2ID0gW3IxMF0sIEpfRjE4LUpfRjE2CisgICAgbGRmLmZpbGwgICAgZjE3ID0gW3IxMV0sIEpfRjE5LUpfRjE3CisgICAgOzsKKyAgICBsZGYuZmlsbCAgICBmMTggPSBbcjEwXSwgSl9GMjAtSl9GMTgKKyAgICBsZGYuZmlsbCAgICBmMTkgPSBbcjExXSwgSl9GMjEtSl9GMTkKKyAgICA7OworICAgIGxkZi5maWxsICAgIGYyMCA9IFtyMTBdLCBKX0YyMi1KX0YyMAorICAgIGxkZi5maWxsICAgIGYyMSA9IFtyMTFdLCBKX0YyMy1KX0YyMQorICAgIDs7CisgICAgbGRmLmZpbGwgICAgZjIyID0gW3IxMF0sIEpfRjI0LUpfRjIyCisgICAgbGRmLmZpbGwgICAgZjIzID0gW3IxMV0sIEpfRjI1LUpfRjIzCisgICAgOzsKKyAgICBsZGYuZmlsbCAgICBmMjQgPSBbcjEwXSwgSl9GMjYtSl9GMjQKKyAgICBsZGYuZmlsbCAgICBmMjUgPSBbcjExXSwgSl9GMjctSl9GMjUKKyAgICA7OworICAgIGxkZi5maWxsICAgIGYyNiA9IFtyMTBdLCBKX0YyOC1KX0YyNgorICAgIGxkZi5maWxsICAgIGYyNyA9IFtyMTFdLCBKX0YyOS1KX0YyNworICAgIDs7CisgICAgbGRmLmZpbGwgICAgZjI4ID0gW3IxMF0sIEpfRjMwLUpfRjI4CisgICAgbGRmLmZpbGwgICAgZjI5ID0gW3IxMV0sIEpfRjMxLUpfRjI5CisgICAgOzsKKyAgICBsZGYuZmlsbCAgICBmMzAgPSBbcjEwXSwgSl9GUFNSLUpfRjMwCisgICAgbGRmLmZpbGwgICAgZjMxID0gW3IxMV0sIEpfQjAtSl9GMzEgOzsKKworICAgIC8vCisgICAgLy8gcmVzdG9yZSBicmFuY2ggcmVnaXN0ZXJzIGFuZCBmcHNyCisgICAgLy8KKyAgICBsZDggICAgIHIxNiA9IFtyMTBdLCBKX0IxLUpfRlBTUiAgICAvLyBnZXQgZnBzcgorICAgIGxkOCAgICAgcjE3ID0gW3IxMV0sIEpfQjItSl9CMCAgICAgIC8vIGdldCByZXR1cm4gcG9pbnRlcgorICAgIDs7CisgICAgbW92ICAgICBhci5mcHNyID0gcjE2CisgICAgbW92ICAgICBiMCA9IHIxNworICAgIGxkOCAgICAgcjIgPSBbcjEwXSwgSl9CMy1KX0IxCisgICAgbGQ4ICAgICByMyA9IFtyMTFdLCBKX0I0LUpfQjIKKyAgICA7OworICAgIG1vdiAgICAgYjEgPSByMgorICAgIG1vdiAgICAgYjIgPSByMworICAgIGxkOCAgICAgcjIgPSBbcjEwXSwgSl9CNS1KX0IzCisgICAgbGQ4ICAgICByMyA9IFtyMTFdCisgICAgOzsKKyAgICBtb3YgICAgIGIzID0gcjIKKyAgICBtb3YgICAgIGI0ID0gcjMKKyAgICBsZDggICAgIHIyID0gW3IxMF0KKyAgICBsZDggICAgIHIyMSA9IFtyMzJdICAgICAgICAgLy8gZ2V0IHVzZXIgdW5hdAorICAgIDs7CisgICAgbW92ICAgICBiNSA9IHIyCisgICAgbW92ICAgICBhci51bmF0ID0gcjIxCisKKyAgICAvLworICAgIC8vIGludmFsaWRhdGUgQUxBVAorICAgIC8vCisgICAgaW52YWxhIDs7CisKKyAgICBici5yZXQuc3B0ayBiMAorICAgIC5lbmRwIGxvbmdqbXAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2lhNjQvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyOTYxOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgYXJjaC9pYTY0L3N5c2NhbGwuUworIworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnRleHQKKwkuYWxpZ24JMzIKKwkucHJvYwlfX3N5c2NhbGxfZXJyb3IKKwkuZ2xvYmwJX19zeXNjYWxsX2Vycm9yCitfX3N5c2NhbGxfZXJyb3I6CisJYWRkbAlyMiA9IEBsdG9mZngoZXJybm8pLGdwCisJOzsKKwlsZDgubW92CXIzID0gW3IyXSxlcnJubworCTs7CisJc3Q0CVtyM10gPSByOAorCW1vdglyOCA9IC0xCisJYnIucmV0LnNwdGsubWFueSBiMAorCS5zaXplCV9fc3lzY2FsbF9lcnJvciwgLi1fX3N5c2NhbGxfZXJyb3IKKwkuZW5kcAlfX3N5c2NhbGxfZXJyb3IKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL2lhNjQvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL2lhNjQvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY4NmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvaWE2NC9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMjkgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvaWE2NC9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50ZXh0XG4iOworICAgIHByaW50IE9VVCAiXHQuYWxpZ24gMzJcbiI7CisgICAgcHJpbnQgT1VUICJcdC5wcm9jICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmwgJHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICJcdG1vdlx0cjE1ID0gX19OUl8ke3NuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0YnJlYWsgX19CUkVBS19TWVNDQUxMXG4iOworICAgIHByaW50IE9VVCAiXHRjbXAuZXEgcDYscDAgPSAtMSxyMTBcbiI7CisgICAgcHJpbnQgT1VUICIocDYpXHRici5mZXcgX19zeXNjYWxsX2Vycm9yXG4iOworICAgIHByaW50IE9VVCAiXHRici5yZXQuc3B0ay5tYW55IGIwXG4iOworICAgIHByaW50IE9VVCAiXHQuc2l6ZVx0JHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIlx0LmVuZHBcdCR7Zm5hbWV9XG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9pYTY0L3Zmb3JrLlMgYi91c3Iva2xpYmMvYXJjaC9pYTY0L3Zmb3JrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4NDkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL2lhNjQvdmZvcmsuUwpAQCAtMCwwICsxLDQyIEBACisvKgorICogaWE2NCBzcGVjaWZpYyB2Zm9yayBzeXNjYWxsCisgKgorICogV3JpdHRlbiBCeToJIE1hcnRpbiBIaWNrcyA8bW9ydEB3aWxkb3BlbnNvdXJjZS5jb20+CisgKgorICovCisKKy8qIFRoaXMgc3lzY2FsbCBpcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgY2xvbmUgc3lzY2FsbCAqLworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjaW5jbHVkZSA8a2xpYmMvYXJjaHN5cy5oPgorCisvKiBUaGVzZSBhcmUgcmVkZWZpbmVkIGhlcmUgYmVjYXVzZSBsaW51eC9zY2hlZC5oIGlzbid0IHNhZmUgZm9yCisgKiBpbmNsdXNpb24gaW4gYXNtLgorICovCisjZGVmaW5lIENMT05FX1ZNICAgIDB4MDAwMDAxMDAgLyogc2V0IGlmIFZNIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyAqLworI2RlZmluZSBDTE9ORV9WRk9SSyAweDAwMDA0MDAwIC8qIHNldCBpZiBwYXJlbnQgd2FudHMgdGhlIGNoaWxkIHRvIHdha2UgaXQgdXAgb24gZXhpdCAqLworCisvKiBwaWRfdCB2Zm9yayh2b2lkKSAqLworLyogSW1wbGVtZW50ZWQgYXMgY2xvbmUoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsIDApICovCisKKwkuYWxpZ24gMzIKKwkucHJvYyB2Zm9yaworCS5nbG9iYWwgdmZvcmsKK3Zmb3JrOgorCWFsbG9jIHIyPWFyLnBmcywwLDAsMiwwCisJbW92CXIxNT1fX05SX2Nsb25lCisJbW92CW91dDA9Q0xPTkVfVk18Q0xPTkVfVkZPUkt8U0lHQ0hMRAorCW1vdiAgICAgb3V0MT0wCisJOzsKKwlicmVhayAweDEwMDAwMCAgICAgIC8vIERvIHRoZSBzeXNjYWxsCisJOzsKKwlhZGRsCXIxNT0wLHIxCisJY21wLmVxICBwNyxwNiA9IC0xLHIxMAorCTs7CisJbGQ4CXIxND1bcjE1XQorCTs7CisocDcpCXN0NAlbcjE0XT1yOAorCTs7CisocDcpCW1vdglyOD0tMQorCWJyLnJldC5zcHRrLm1hbnkgYjAKKwkuZW5kcCB2Zm9yawpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTMyci9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9tMzJyL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWIyYmEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9LYnVpbGQKQEAgLTAsMCArMSwxMyBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgbTMycgorIworCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8KKwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vICAgICAuLi8uLi9saWJnY2MvX19tb2RkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZkaTMubyAgICAuLi8uLi9saWJnY2MvX191bW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2bW9kZGk0Lm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tMzJyL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9tMzJyL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMjc4NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL20zMnIvTUNPTkZJRwpAQCAtMCwwICsxLDE4IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9tMzJyL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitLTElCQ09QVEZMQUdTICs9IC1PcworS0xJQkNCSVRTSVpFICA9IDMyCisKKyMgRXh0cmEgbGlua2ZsYWdzIHdoZW4gYnVpbGRpbmcgdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CisjIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSByZWFjaGFibGUgdXNpbmcgbm9ybWFsIGludGVyLW1vZHVsZQorIyBjYWxscywgYW5kIHdvcmsgb24gdGhlIG1lbW9yeSBtb2RlbHMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlCisjIDIyNCBNQiAtIG5vcm1hbCBiaW5hcmllcyBzdGFydCBhdCAwICg/KQorIyAobGliPylnY2Mgb24gY3JpcyBzZWVtcyB0byBpbnNpc3Qgb24gcHJvZHVjaW5nIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucworS0xJQkNTSEFSRURGTEFHUyAgICAgPSAtLXNlY3Rpb24tc3RhcnQgLmluaXQ9MHgwZTAwMDEwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTMyci9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9tMzJyL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhlNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9jcnQwLlMKQEAgLTAsMCArMSwyNCBAQAorIworIyBhcmNoL20zMnIvY3J0MC5TCisjCisjIERvZXMgYXJjaC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBhbmQgaW52b2tlcyBfX2xpYmNfaW5pdAorIyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCisjCisjIFNlZSBfX3N0YXRpY19pbml0LmMgb3IgX19zaGFyZWRfaW5pdC5jIGZvciB0aGUgZXhwZWN0ZWQKKyMgYXJndW1lbnRzLgorIworCisJLnRleHQKKwkuYmFsaWduIDQKKwkudHlwZQlfc3RhcnQsQGZ1bmN0aW9uCisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCS8qIFNhdmUgdGhlIGFkZHJlc3Mgb2YgdGhlIEVMRiBhcmd1bWVudCBhcnJheSAqLworCW12CXIwLCBzcAorCisJLyogYXRleGl0KCkgZnVuY3Rpb24gKGFzc3VtZSBudWxsKSAqLworCXhvcglyMSwgcjEKKworCWJsCV9fbGliY19pbml0CisKKwkuc2l6ZSBfc3RhcnQsIC4tX3N0YXJ0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tMzJyL3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmEyNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTMyci9zZXRqbXAuUwpAQCAtMCwwICsxLDQ3IEBACisjCisjIGFyY2gvbTMyci9zZXRqbXAuUworIworIyBzZXRqbXAvbG9uZ2ptcCBmb3IgdGhlIE0zMlIgYXJjaGl0ZWN0dXJlCisjCisKKyMKKyMgVGhlIGptcF9idWYgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyOgorIwlyOC1yMTUKKyMKKyMJTm90ZSB0aGF0IHIxNCBpcyB0aGUgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgYW5kCisjCXIxNSBpcyB0aGUgc3RhY2sgcG9pbnRlci4KKyMKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLmdsb2JsCXNldGptcAorCS50eXBlCXNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisJc3QJcjgsIEByMAorCXN0CXI5LCBAK3IwCisJc3QJcjEwLCBAK3IwCisJc3QJcjExLCBAK3IwCisJc3QJcjEyLCBAK3IwCisJc3QJcjEzLCBAK3IwCisJc3QJcjE0LCBAK3IwCisJc3QJcjE1LCBAK3IwCisJeG9yCXIwLCByMAorCWptcAlyMTQKKwkuc2l6ZQlzZXRqbXAsLi1zZXRqbXAKKworCS50ZXh0CisJLmJhbGlnbiA0CisJLmdsb2JsCWxvbmdqbXAKKwkudHlwZQlsb25nam1wLCBAZnVuY3Rpb24KK2xvbmdqbXA6CisJbGQJcjgsIEByMCsKKwlsZAlyOSwgQHIwKworCWxkCXIxMCwgQHIwKworCWxkCXIxMSwgQHIwKworCWxkCXIxMiwgQHIwKworCWxkCXIxMywgQHIwKworCWxkCXIxNCwgQHIwKworCWxkCXIxNSwgQHIwCisJbXYJcjAsIHIxCisJam1wCXIxNAorCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tMzJyL3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL20zMnIvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGEzMzYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9tMzJyL3N5c2NhbGwuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9tMzJyL3N5c2NhbGwuUworICoKKyAqICAgICByNyBjb250YWlucyB0aGUgc3lzY2FsbCBudW1iZXIgKHNldCBieSBzdHViKTsKKyAqIHIwLi5yMyBjb250YWlucyBhcmd1bWVudHMgMC0zIHBlciBzdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb247CisgKiByNC4ucjUgY29udGFpbnMgYXJndW1lbnRzIDQtNSwgYnV0IHdlIGhhdmUgdG8gZ2V0IHRob3NlIGZyb20KKyAqICAgICAgICB0aGUgc3RhY2suCisgKi8KKworCS5zZWN0aW9uICIudGV4dCIsImF4IgorCS5iYWxpZ24JNAorCS5nbG9ibAlfX3N5c2NhbGxfY29tbW9uCisJLnR5cGUJX19zeXNjYWxsX2NvbW1vbixAZnVuY3Rpb24KK19fc3lzY2FsbF9jb21tb246CisJbGQJcjQsQHNwCisJbGQJcjUsQCg0LHNwKQorCXRyYXAJIzIKKwljbXBpCXIwLCAjLTQwOTYKKwlibmMJMWYKKwlqbXAJcjE0CisxOgorCXNldGgJcjIsI2hpZ2goZXJybm8pCisJb3IzCXIyLHIyLCNsb3coZXJybm8pCisJbmVnCXIxLHIwCisJc3QJcjEsQHI3CisJbGRpCXIwLCMtMQorCWptcAlyMTQKKworCS5zaXplCV9fc3lzY2FsbF9jb21tb24sLi1fX3N5c2NhbGxfY29tbW9uCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9tMzJyL3N5c3N0dWIucGggYi91c3Iva2xpYmMvYXJjaC9tMzJyL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkZmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL20zMnIvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI1IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL20zMnIvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudGV4dFxuIjsKKyAgICBwcmludCBPVVQgIlx0LnR5cGVcdCR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibFx0JHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdC5iYWxpZ25cdDRcbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICJcdGxkaVx0cjcsI19fTlJfJHtzbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdGJyYVx0X19zeXNjYWxsX2NvbW1vblxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTY4ay9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9tNjhrL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDYxMzdjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay9LYnVpbGQKQEAgLTAsMCArMSw4IEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBtNjhrCisjCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8gdmZvcmsubworCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL202OGsvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL202OGsvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQ2MTVkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay9NQ09ORklHCkBAIC0wLDAgKzEsMTkgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL202OGsvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisKK0tMSUJDT1BURkxBR1MgKz0gLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyCitLTElCQ0JJVFNJWkUgID0gMzIKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgMjgxNiBNQiAtIG5vcm1hbCBiaW5hcmllcyBzdGFydCBhdCAyMDQ4IE1CIGlmIEkgcmVhZCB0aGUgbGluaworIyBzY3JpcHQgcmlnaHQuICBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhIGZ1bmRhbWVudGFsIHJlYXNvbgorIyB0byBub3QgZHVjayBiZWxvdyB0aGUgaGFsZndheSBwb2ludC4uLgorS0xJQkNTSEFSRURGTEFHUyAgICAgICAgPSAtVHRleHQgMHhiMDAwMDAwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTY4ay9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9tNjhrL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY2ZjEzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay9jcnQwLlMKQEAgLTAsMCArMSwyNyBAQAorIworIyBhcmNoL202OGsvY3J0MC5TCisjCisjIERvZXMgYXJjaC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBhbmQgaW52b2tlcyBfX2xpYmNfaW5pdAorIyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCisjCisjIFNlZSBfX3N0YXRpY19pbml0LmMgb3IgX19zaGFyZWRfaW5pdC5jIGZvciB0aGUgZXhwZWN0ZWQKKyMgYXJndW1lbnRzLgorIworCisJLnRleHQKKwkuYWxpZ24gNAorCS50eXBlIF9zdGFydCxAZnVuY3Rpb24KKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJIyBaZXJvIG91dCB0aGUgZnJhbWUgcG9pbnRlciB0byBiZSBuaWNlIHRvIHRoZSBkZWJ1Z2dlcgorCW1vdmVhLmwJIzAsJWE2CisJIyBTYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBFTEYgYXJndW1lbnQgYXJyYXkKKwltb3ZlLmwJJWE3LCAlZDAKKwkjIFB1c2ggYSB6ZXJvIG9uIHRoZSBzdGFjayBpbiBsaWV1IG9mIGF0ZXhpdCBwb2ludGVyCisJY2xyLmwJLSglc3ApCisJIyBQdXNoIEVMRiBhcmd1bWVudCBwb2ludGVyIG9uIHRoZSBzdGFjaworCW1vdmUubAklZDAsIC0oJWE3KQorCisJamJzcglfX2xpYmNfaW5pdAorCisJLnNpemUgX3N0YXJ0LCAuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbTY4ay9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL202OGsvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzNTkxZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL202OGsvc2V0am1wLlMKQEAgLTAsMCArMSw0MyBAQAorIworIyBhcmNoL202OGsvc2V0am1wLlMKKyMKKyMgc2V0am1wL2xvbmdqbXAgZm9yIHRoZSBtNjhrIGFyY2hpdGVjdHVyZQorIworCisjCisjIFRoZSBqbXBfYnVmIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nLCBpbiBvcmRlcjoKKyMJJWQyLi4lZDcKKyMJJWEyLi4lYTcKKyMJcmV0dXJuIGFkZHJlc3MKKyMKKworCS50ZXh0CisJLmFsaWduIDIKKwkuZ2xvYmwgc2V0am1wCisJLnR5cGUgc2V0am1wLCBAZnVuY3Rpb24KK3NldGptcDoKKwltb3ZlLmwJKCVzcCkrLCAlZDAJCXwgUmV0dXJuIGFkZHJlc3MKKwltb3ZlYS5sCSglc3ApLCAlYTAJCXwgQnVmZmVyIGFkZHJlc3MKKwl8IFBvc3RpbmNyZW1lbnQgbW9kZSBpcyBub3QgcGVybWl0dGVkIGhlcmUuLi4KKwltb3ZlbS5sCSVkMi0lZDcvJWEyLSVhNywgKCVhMCkKKwltb3ZlLmwJJWQwLCA0OCglYTApCQl8IFJldHVybiBhZGRyZXNzCisJbW92ZS5sCSVkMCwgLSglc3ApCQl8IFJlc3RvcmUgcmV0dXJuIGFkZHJlc3MKKwljbHIubAklZDAJCQl8IFJldHVybiB2YWx1ZQorCW1vdmVhLmwJJWQwLCAlYTAJCXwgUmVkdW5kYW50IHJldHVybi4uLgorCXJ0cworCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5hbGlnbiAyCisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCBAZnVuY3Rpb24KK2xvbmdqbXA6CisJbW92ZS5sCTQoJXNwKSwgJWEwCQl8IEJ1ZmZlciBhZGRyZXNzCisJbW92ZS5sCTgoJXNwKSwgJWQwCQl8IFJldHVybiB2YWx1ZQorCW1vdmVtLmwJKCVhMCkrLCAlZDItJWQ3LyVhMi0lYTcKKwltb3ZlYS5sCSglYTApLCAlYTEKKwltb3ZlYS5sCSVkMCwgJWEwCQl8IFJlZHVuZGFudCByZXR1cm4uLi4KKwlqbXAubAkoJWExKQorCisJLnNpemUgbG9uZ2ptcCwuLWxvbmdqbXAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL202OGsvc3lzY2FsbC5TIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2YzkyZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL202OGsvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBhcmNoL202OGsvc3lzY2FsbC5TCisgKgorICogQ29tbW9uIHRhaWwtaGFuZGxpbmcgY29kZSBmb3Igc3lzdGVtIGNhbGxzLgorICoKKyAqIFRoZSBhcmd1bWVudHMgYXJlIG9uIHRoZSBzdGFjazsgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpbiAlZDAuCisgKi8KKworCS50ZXh0CisJLmFsaWduCTIKKwkuZ2xvYmwJX19zeXNjYWxsX2NvbW1vbgorCS50eXBlCV9fc3lzY2FsbF9jb21tb24sIEBmdW5jdGlvbgorX19zeXNjYWxsX2NvbW1vbjoKKwltb3ZlbS5sICVkMi0lZDYsIC0oJXNwKQkvKiA1IHJlZ2lzdGVycyBzYXZlZCAqLworCW1vdmVtLmwJMjQoJXNwKSwgJWQxLSVkNgorCXRyYXAJIzAKKwljbXBpLmwJIy00MDk1LCAlZDAKKwlibHQubAkxZgorCW5lZy5sCSVkMAorCW1vdmUubAklZDAsIChlcnJubykKKwltb3ZlcQkjLTEsICVkMAorMToKKwltb3ZlYS5sCSVkMCwgJWEwCS8qIFJlZHVuZGFudCByZXR1cm4gKi8KKwltb3ZlbS5sICglc3ApKywgJWQyLSVkNiAvKiBSZXN0b3JlIHJlZ2lzdGVycyAqLworCXJ0cworCisJLnNpemUJX19zeXNjYWxsX2NvbW1vbiwuLV9fc3lzY2FsbF9jb21tb24KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL202OGsvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL202OGsvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMyMzlkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMjYgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvbTY4ay9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlICR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKworICAgICRzdHlwZSA9ICdjb21tb24nIGlmICggJHN0eXBlIGVxICcnICk7CisKKyAgICBwcmludCBPVVQgIlx0bW92ZS5sXHQjIF9fTlJfJHtzbmFtZX0sICVkMFxuIjsKKyAgICBwcmludCBPVVQgIlx0YnJcdF9fc3lzY2FsbF8kc3R5cGVcbiI7CisgICAgcHJpbnQgT1VUICJcdC5zaXplICR7Zm5hbWV9LC4tJHtmbmFtZX1cbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL202OGsvdmZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL202OGsvdmZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E3ZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbTY4ay92Zm9yay5TCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgdXNyL2tsaWJjL2FyY2gvbTY4ay92Zm9yay5TCisjCisjIHZmb3JrIGlzIG5hc3R5IC0gdGhlcmUgbXVzdCBiZSBub3RoaW5nIGF0IGFsbCBvbiB0aGUgc3RhY2sgYWJvdmUKKyMgdGhlIHN0YWNrIGZyYW1lIG9mIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24uCisjCisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKwkudGV4dAorCS5hbGlnbgkyCisJLmdsb2JsCXZmb3JrCisJLnR5cGUJdmZvcmssIEBmdW5jdGlvbgordmZvcms6CisJbW92ZS5sCSglc3ApKywgJWQxCQkvKiBSZXR1cm4gYWRkcmVzcyAqLworCW1vdmUubAkjIF9fTlJfdmZvcmssICVkMAorCXRyYXAJIzAKKwltb3ZlLmwJJWQxLCAtKCVzcCkKKwljbXBpLmwJIy00MDk1LCAlZDAKKwlibHQubAkxZgorCW5lZy5sCSVkMAorCW1vdmUubAklZDAsIChlcnJubykKKwltb3ZlcQkjLTEsICVkMAorMToKKwltb3ZlYS5sCSVkMCwgJWEwCisJcnRzCisKKwkuc2l6ZQl2Zm9yaywgLi12Zm9yawpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbWlwcy9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9taXBzL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzJlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9LYnVpbGQKQEAgLTAsMCArMSwxNCBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgbWlwcworIworCitrbGliLXkgOj0gcGlwZS5vIHZmb3JrLm8gc2V0am1wLm8gc3lzY2FsbC5vCisKK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19jbHpzaTIubyAgICAgLi4vLi4vbGliZ2NjL19fYXNobGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fYXNocmRpMy5vICAgIC4uLy4uL2xpYmdjYy9fX2xzaHJkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vICAgICAuLi8uLi9saWJnY2MvX19tb2RkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZkaTMubyAgICAuLi8uLi9saWJnY2MvX191bW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2bW9kZGk0Lm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9taXBzL01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzMzFhMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHMvTUNPTkZJRwpAQCAtMCwwICsxLDE1IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9taXBzL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitLTElCQ0FSQ0hSRVFGTEFHUyA9IC1mbm8tcGljIC1tbm8tYWJpY2FsbHMgLUcgMAorS0xJQkNPUFRGTEFHUyAgICAgKz0gLU9zCitLTElCQ0JJVFNJWkUgICAgICA9IDMyCisKKyMgRXh0cmEgbGlua2ZsYWdzIHdoZW4gYnVpbGRpbmcgdGhlIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CitLTElCQ1NIQVJFREZMQUdTCT0gLVQgJChzcmMpL2FyY2gvJChLTElCQ0FSQ0gpL2tsaWJjLmxkCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzL2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL21pcHMvY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmQ5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9taXBzL2NydDAuUwpAQCAtMCwwICsxLDI1IEBACisjCisjIGFyY2gvbWlwcy9jcnQwLlMKKyMKKyMgRG9lcyBhcmNoLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGFuZCBpbnZva2VzIF9fbGliY19pbml0CisjIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy4KKyMKKyMgU2VlIF9fc3RhdGljX2luaXQuYyBvciBfX3NoYXJlZF9pbml0LmMgZm9yIHRoZSBleHBlY3RlZAorIyBhcmd1bWVudHMuCisjCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorCitORVNURUQoX19zdGFydCwgMzIsIHNwKQorCXN1YnUJc3AsIDMyCisJc3cJemVybywgMTYoc3ApCisKKwlsdWkJZ3AsICVoaShfZ3ApCQkjIEluaXRpYWxpemUgZ3AKKwlhZGRpdQlncCwgZ3AsIF9ncAorCisJYWRkaXUJYTAsIHNwLCAzMgkJIyBQb2ludGVyIHRvIEVMRiBlbnRyeSBzdHJ1Y3R1cmUKKwltb3ZlCWExLCB2MAkJCSMgS2VybmVsLXByb3ZpZGVkIGF0ZXhpdCgpIHBvaW50ZXIKKworCWphbAlfX2xpYmNfaW5pdAorCisJRU5EKF9fc3RhcnQpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9taXBzL2tsaWJjLmxkIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9rbGliYy5sZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJhN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9rbGliYy5sZApAQCAtMCwwICsxLDIxNCBAQAorLyogTGlua2VyIHNjcmlwdCBmb3Iga2xpYmMuc28sIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSB0aGUgZGFtbmVkCisgICBHTlUgbGQgc2NyaXB0IGhlYWRlcnMgcHJvYmxlbSAqLworCitFTlRSWShfX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC8qIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSByZWFjaGFibGUgdXNpbmcgbm9ybWFsIGludGVyLW1vZHVsZQorICAgICAgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZSAqLworICAvKiAyIE1CIC0tIHRoZSBub3JtYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHRleHQgaXMgNCBNQiAqLworICAuID0gMHgwMDIwMDQwMDsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLnJlZ2luZm8gICAgICAgIDogeyAqKC5yZWdpbmZvKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuZHluICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLmluaXQpCisgICAgICAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWwuZmluaSkKKyAgICAgICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsLmN0b3JzKQorICAgICAgKigucmVsLmR0b3JzKQorICAgICAgKigucmVsLmdvdCkKKyAgICAgICooLnJlbC5zZGF0YSAucmVsLnNkYXRhLiogLnJlbC5nbnUubGlua29uY2Uucy4qKQorICAgICAgKigucmVsLnNic3MgLnJlbC5zYnNzLiogLnJlbC5nbnUubGlua29uY2Uuc2IuKikKKyAgICAgICooLnJlbC5zZGF0YTIgLnJlbC5zZGF0YTIuKiAucmVsLmdudS5saW5rb25jZS5zMi4qKQorICAgICAgKigucmVsLnNic3MyIC5yZWwuc2JzczIuKiAucmVsLmdudS5saW5rb25jZS5zYjIuKikKKyAgICAgICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopCisgICAgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuc2RhdGEgLnJlbGEuc2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uucy4qKQorICAgICAgKigucmVsYS5zYnNzIC5yZWxhLnNic3MuKiAucmVsYS5nbnUubGlua29uY2Uuc2IuKikKKyAgICAgICooLnJlbGEuc2RhdGEyIC5yZWxhLnNkYXRhMi4qIC5yZWxhLmdudS5saW5rb25jZS5zMi4qKQorICAgICAgKigucmVsYS5zYnNzMiAucmVsYS5zYnNzMi4qIC5yZWxhLmdudS5saW5rb25jZS5zYjIuKikKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgfQorICAucmVsLnBsdCAgICAgICAgOiB7ICooLnJlbC5wbHQpIH0KKyAgLnJlbGEucGx0ICAgICAgIDogeyAqKC5yZWxhLnBsdCkgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgIF9mdGV4dCA9IC4gOworICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgICAqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKikKKyAgfSA9MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuc2RhdGEyICAgICAgICAgOiB7ICooLnNkYXRhMiAuc2RhdGEyLiogLmdudS5saW5rb25jZS5zMi4qKSB9CisgIC5zYnNzMiAgICAgICAgICA6IHsgKiguc2JzczIgLnNic3MyLiogLmdudS5saW5rb25jZS5zYjIuKikgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTig4MTkyKTsKKyAgLyogRW5zdXJlIHRoZSBfX3ByZWluaXRfYXJyYXlfc3RhcnQgbGFiZWwgaXMgcHJvcGVybHkgYWxpZ25lZC4gIFdlCisgICAgIGNvdWxkIGluc3RlYWQgbW92ZSB0aGUgbGFiZWwgZGVmaW5pdGlvbiBpbnNpZGUgdGhlIHNlY3Rpb24sIGJ1dAorICAgICB0aGUgbGlua2VyIHdvdWxkIHRoZW4gY3JlYXRlIHRoZSBzZWN0aW9uIGV2ZW4gaWYgaXQgdHVybnMgb3V0IHRvCisgICAgIGJlIGVtcHR5LCB3aGljaCBpc24ndCBwcmV0dHkuICAqLworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgUFJPVklERSAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgIC5wcmVpbml0X2FycmF5ICAgICA6IHsgKigucHJlaW5pdF9hcnJheSkgfQorICBQUk9WSURFIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIFBST1ZJREUgKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAuaW5pdF9hcnJheSAgICAgOiB7ICooLmluaXRfYXJyYXkpIH0KKyAgUFJPVklERSAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICBQUk9WSURFIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgLmZpbmlfYXJyYXkgICAgIDogeyAqKC5maW5pX2FycmF5KSB9CisgIFBST1ZJREUgKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgIF9mZGF0YSA9IC4gOworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IHsgKiguZ2NjX2V4Y2VwdF90YWJsZSkgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQqLm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luKi5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQqLm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOworICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQorICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cworICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCisgIC5zZGF0YSAgICAgICAgICA6CisgIHsKKyAgICAqKC5zZGF0YSAuc2RhdGEuKiAuZ251LmxpbmtvbmNlLnMuKikKKyAgfQorICAubGl0OCAgICAgICAgICAgOiB7ICooLmxpdDgpIH0KKyAgLmxpdDQgICAgICAgICAgIDogeyAqKC5saXQ0KSB9CisgIF9lZGF0YSA9IC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgX2Zic3MgPSAuOworICAuc2JzcyAgICAgICAgICAgOgorICB7CisgICAgUFJPVklERSAoX19zYnNzX3N0YXJ0ID0gLik7CisgICAgUFJPVklERSAoX19fc2Jzc19zdGFydCA9IC4pOworICAgICooLmR5bnNic3MpCisgICAgKiguc2JzcyAuc2Jzcy4qIC5nbnUubGlua29uY2Uuc2IuKikKKyAgICAqKC5zY29tbW9uKQorICAgIFBST1ZJREUgKF9fc2Jzc19lbmQgPSAuKTsKKyAgICBQUk9WSURFIChfX19zYnNzX2VuZCA9IC4pOworICB9CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCisgICAuID0gQUxJR04oMzIgLyA4KTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKikgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KKyAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQorICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spIH0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHMvcGlwZS5TIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9waXBlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiOTQwNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHMvcGlwZS5TCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworTEVBRihwaXBlKQorCWxpCXYwLCBfX05SX3BpcGUKKwlzeXNjYWxsCisJYm5leglhMywgMWYKKwlzdwl2MCwgIChhMCkKKwlzdwl2MSwgNChhMCkKKwlsaQl2MCwgMAorCWIJMmYKKzE6CXN3CXYwLCBlcnJubworCWxpCXYwLCAtMQorMjoJanIJcmEKKwlFTkQocGlwZSkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHMvc2V0am1wLlMgYi91c3Iva2xpYmMvYXJjaC9taXBzL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZWVkMTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9taXBzL3NldGptcC5TCkBAIC0wLDAgKzEsODAgQEAKKyMKKyMgYXJjaC9taXBzL3NldGptcC5TCisjCisjIHNldGptcC9sb25nam1wIGZvciB0aGUgTUlQUyBhcmNoaXRlY3R1cmUKKyMKKyMgVGhlIGptcF9idWYgaXMgYXNzdW1lZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyOgorIwlzMC4uczcKKyMJZ3AKKyMJc3AKKyMJczgKKyMJcmEKKyMJZjIwLi5mMzEKKyMJZmNyMzEKKyMKKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisKK0xFQUYoc2V0am1wKQorCXN3CXMwLCAgMChhMCkKKwlzdwlzMSwgIDQoYTApCisJc3cJczIsICA4KGEwKQorCXN3CXMzLCAxMihhMCkKKwlzdwlzNCwgMTYoYTApCisJc3cJczUsIDIwKGEwKQorCXN3CXM2LCAyNChhMCkKKwlzdwlzNywgMjgoYTApCisJc3cJZ3AsIDMyKGEwKQorCXN3CXNwLCAzNihhMCkKKwlzdwlzOCwgNDAoYTApCisJc3cJcmEsIDQ0KGEwKQorCWNmYzEJdDAsJDMxCisJc3djMQkkZjIwLDQ4KGEwKQorCXN3YzEJJGYyMSw1MihhMCkKKwlzd2MxCSRmMjIsNTYoYTApCisJc3djMQkkZjIzLDYwKGEwKQorCXN3YzEJJGYyNCw2NChhMCkKKwlzd2MxCSRmMjUsNjgoYTApCisJc3djMQkkZjI2LDcyKGEwKQorCXN3YzEJJGYyNyw3NihhMCkKKwlzd2MxCSRmMjgsODAoYTApCisJc3djMQkkZjI5LDg0KGEwKQorCXN3YzEJJGYzMCw4OChhMCkKKwlzd2MxCSRmMzEsOTIoYTApCisJc3cJdDAsOTYoYTApCisJbW92ZQl2MCx6ZXJvCisJanIJcmEKKworCUVORChzZXRqbXApCisKK0xFQUYobG9uZ2ptcCkKKwlsdwlzMCwgIDAoYTApCisJbHcJczEsICA0KGEwKQorCWx3CXMyLCAgOChhMCkKKwlsdwlzMywgMTIoYTApCisJbHcJczQsIDE2KGEwKQorCWx3CXM1LCAyMChhMCkKKwlsdwlzNiwgMjQoYTApCisJbHcJczcsIDI4KGEwKQorCWx3CWdwLCAzMihhMCkKKwlsdwlzcCwgMzYoYTApCisJbHcJczgsIDQwKGEwKQorCWx3CXJhLCA0NChhMCkKKwlsdwl0MCwgOTYoYTApCisJbHdjMQkkZjIwLDQ4KGEwKQorCWx3YzEJJGYyMSw1MihhMCkKKwlsd2MxCSRmMjIsNTYoYTApCisJbHdjMQkkZjIzLDYwKGEwKQorCWx3YzEJJGYyNCw2NChhMCkKKwlsd2MxCSRmMjUsNjgoYTApCisJbHdjMQkkZjI2LDcyKGEwKQorCWx3YzEJJGYyNyw3NihhMCkKKwlsd2MxCSRmMjgsODAoYTApCisJbHdjMQkkZjI5LDg0KGEwKQorCWx3YzEJJGYzMCw4OChhMCkKKwlsd2MxCSRmMzEsOTIoYTApCisJY3RjMQl0MCwkMzEKKwltb3ZlCXYwLGExCisJanIJcmEKKworCUVORChsb25nam1wKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbWlwcy9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9taXBzL3N5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjMwOGRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9zeXNjYWxsLlMKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnNldCBub3Jlb3JkZXIKKworTEVBRihfX3N5c2NhbGxfY29tbW9uKQorCXN5c2NhbGwKKyAgICAgICAgYmVxeiAgICBhMywgMWYKKwkjIHN3IGlzIGFjdHVhbGx5IHR3byBpbnN0cnVjdGlvbnM7IHRoZSBmaXJzdCBvbmUgZ29lcworCSMgaW4gdGhlIGJyYW5jaCBkZWxheSBzbG90CisJIyBYWFg6IEJyZWFrIHRoaXMgdXAgbWFudWFsbHk7IGFzIGl0IGlzIG5vdyBpdCBnZW5lcmF0ZXMgd2FybmluZ3MuCisgICAgICAgIHN3ICAgICAgdjAsIGVycm5vCisgICAgICAgIGxpICAgICAgdjAsIC0xCisxOiAgICAgIGpyICAgICAgcmEKKwlFTkQoX19zeXNjYWxsX2NvbW1vbikKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHMvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL21pcHMvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzFkNWQwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMzAgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvbWlwcy9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCisjIE9uIE1JUFMsIG1vc3Qgc3lzdGVtIGNhbGxzIGZvbGxvdyB0aGUgc3RhbmRhcmQgY29udmVudGlvbiwgd2l0aCB0aGUKKyMgc3lzdGVtIGNhbGwgbnVtYmVyIGluIHIwICh2MCksIHJldHVybiBhbiBlcnJvciB2YWx1ZSBpbiByMTkgKGEzKSBhcworIyB3ZWxsIGFzIHRoZSByZXR1cm4gdmFsdWUgaW4gcjAgKHYwKS4KKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICAkc3R5cGUgPSAkc3R5cGUgfHwgJ2NvbW1vbic7CisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL2FzbS5oPlxuIjsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vcmVnZGVmLmg+XG4iOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC5zZXQgbm9yZW9yZGVyXG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiTEVBRigke2ZuYW1lfSlcbiI7CisgICAgcHJpbnQgT1VUICJcdGpcdF9fc3lzY2FsbF8ke3N0eXBlfVxuIjsKKyAgICBwcmludCBPVVQgIlx0ICBsaVx0djAsIF9fTlJfJHtzbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICJcdEVORCgke2ZuYW1lfSlcbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHMvdmZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL21pcHMvdmZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWYwMzViCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvbWlwcy92Zm9yay5TCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworI2RlZmluZSBDTE9ORV9WTQkweDAwMDAwMTAwCisjZGVmaW5lIENMT05FX1ZGT1JLCTB4MDAwMDQwMDAKKyNkZWZpbmUgU0lHQ0hMRAkJMTgKKworCS5zZXQgbm9yZW9yZGVyCisKK0xFQUYodmZvcmspCisJbGkJYTAsIENMT05FX1ZGT1JLIHwgQ0xPTkVfVk0gfCBTSUdDSExECisJbGkJYTEsIDAKKwlqCV9fc3lzY2FsbF9jb21tb24KKwkgIGxpCXYwLCBfX05SX2Nsb25lCisJRU5EKHZmb3JrKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvbWlwczY0L0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL21pcHM2NC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwYzBmOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHM2NC9LYnVpbGQKQEAgLTAsMCArMSwzIEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBtaXBzNjQKKyMKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL21pcHM2NC9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvbWlwczY0L01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1MGI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL21pcHM2NC9NQ09ORklHCkBAIC0wLDAgKzEsMTEgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL21pcHM2NC9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNPUFRGTEFHUyArPSAtT3MKK0tMSUJDQklUU0laRSAgPSA2NApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjYTVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9LYnVpbGQKQEAgLTAsMCArMSw4IEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBwYXJpc2MKKyMKKwora2xpYi15IDo9IHNldGptcC5vIHN5c2NhbGwubyB2Zm9yay5vCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2MvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhlOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL01DT05GSUcKQEAgLTAsMCArMSwxMiBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjCisjIGFyY2gvcGFyaXNjL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitLTElCQ09QVEZMQUdTICs9IC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlcgorS0xJQkNCSVRTSVpFICA9IDMyCitLTElCQ1NIQVJFREZMQUdTCT0gLVR0ZXh0IDB4NDAwMDEwMDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2MvY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjI0NDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2MvY3J0MC5TCkBAIC0wLDAgKzEsMzcgQEAKKwkuYWxpZ24gNAorCisJLmltcG9ydCAkZ2xvYmFsJCwgZGF0YQorCS5pbXBvcnQgX19saWJjX2luaXQsIGNvZGUKKworCS5nbG9iYWwgX3N0YXJ0CisJLmV4cG9ydCBfc3RhcnQsIEVOVFJZCisJLnR5cGUgX3N0YXJ0LEBmdW5jdGlvbgorCisJLnByb2MKKwkuY2FsbGluZm8KKworX3N0YXJ0OgorLyogZXh0ZW5kIHRoZSBzdGFjayBieSA2NC1ieXRlcyAqLworCWxkbwk2NCglc3ApLCAlc3AKKworLyogJXIyNSA9IGFyZ2MKKyAqICVyMjQgPSBhcmd2CisgKiBlbnZwID0gYXJndiArIChhcmdjICsgMSkKKyAqIGVsZmRhdGEgPSAoYXJndiAtIDQpCisgKi8KKwlsZG8JLTQoJXIyNCksICVyMjYKKworLyogbG9hZCBnbG9iYWwgZGF0YSAqLworCWxkaWwJTCUkZ2xvYmFsJCwgJWRwCisJbGRvCVIlJGdsb2JhbCQoJWRwKSwgJWRwCisKKy8qIHBhcmlzYyBhYmkgcHV0cyB0aGUgYXRleGl0IHBvaW50ZXIgaW4gJXIyMywgc2VlIEVMRl9QTEFUX0lOSVQoKSAqLworCWNvcHkJJXIyMywgJXIyNQorCisvKiBicmFuY2ggdG8gX19saWJjX2luaXQgKi8KKwlibAlfX2xpYmNfaW5pdCwlcjIKKwlub3AKKy8qIGJyZWFrIG1pc2VyYWJseSBpZiB3ZSBldmVyIHJldHVybiAqLworCWlpdGxicAklcjAsKCVzcjAsJXIwKSAvKiBpbGxlZ2FsIGluc3RydWN0aW9uICovCisJbm9wCisJLnByb2NlbmQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ3NjZjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL3NldGptcC5TCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBwYXJpc2Mgc3BlY2lmaWMgc2V0am1wL2xvbmdqbXAgcm91dGluZXMKKyAqCisgKi8KKworICAgICAgICAudGV4dAorICAgICAgICAuYWxpZ24gNAorICAgICAgICAuZ2xvYmFsIHNldGptcAorICAgICAgICAuZXhwb3J0IHNldGptcCwgY29kZQorICAgICAgICAucHJvYworICAgICAgICAuY2FsbGluZm8KK3NldGptcDoKKyAgICAgICAgc3R3ICAgICAlcjMsMCglcjI2KQorICAgICAgICBzdHcgICAgICVyNCw4KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXI1LDEyKCVyMjYpCisgICAgICAgIHN0dyAgICAgJXI2LDE2KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXI3LDIwKCVyMjYpCisgICAgICAgIHN0dyAgICAgJXI4LDI0KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXI5LDI4KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIxMCwzMiglcjI2KQorICAgICAgICBzdHcgICAgICVyMTEsMzYoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjEyLDQwKCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIxMyw0NCglcjI2KQorICAgICAgICBzdHcgICAgICVyMTQsNDgoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjE1LDUyKCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIxNiw1NiglcjI2KQorICAgICAgICBzdHcgICAgICVyMTcsNjAoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjE4LDY0KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXIxOSw2OCglcjI2KQorICAgICAgICBzdHcgICAgICVyMjcsNzIoJXIyNikKKyAgICAgICAgc3R3ICAgICAlcjMwLDc2KCVyMjYpCisgICAgICAgIHN0dyAgICAgJXJwLDgwKCVyMjYpCisgICAgICAgIGxkbyAgICAgODgoJXIyNiksJXIxOQorICAgICAgICBmc3RkLG1hICVmcjEyLDgoJXIxOSkKKyAgICAgICAgZnN0ZCxtYSAlZnIxMyw4KCVyMTkpCisgICAgICAgIGZzdGQsbWEgJWZyMTQsOCglcjE5KQorICAgICAgICBmc3RkLG1hICVmcjE1LDgoJXIxOSkKKyAgICAgICAgZnN0ZCxtYSAlZnIxNiw4KCVyMTkpCisgICAgICAgIGZzdGQsbWEgJWZyMTcsOCglcjE5KQorICAgICAgICBmc3RkLG1hICVmcjE4LDgoJXIxOSkKKyAgICAgICAgZnN0ZCxtYSAlZnIxOSw4KCVyMTkpCisgICAgICAgIGZzdGQsbWEgJWZyMjAsOCglcjE5KQorICAgICAgICBmc3RkICAgICAlZnIyMSwwKCVyMTkpCisgICAgICAgIGJ2ICAgICAgICVyMCglcnApCisgICAgICAgIGNvcHkgICAgICVyMCwlcjI4CisJLnByb2NlbmQKKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmFsIGxvbmdqbXAKKwkuZXhwb3J0IGxvbmdqbXAsIGNvZGUKKwkucHJvYworCS5jYWxsaW5mbworbG9uZ2ptcDoKKyAgICAgICAgbGR3ICAgICAwKCVyMjYpLCVyMworICAgICAgICBsZHcgICAgIDgoJXIyNiksJXI0CisgICAgICAgIGxkdyAgICAgMTIoJXIyNiksJXI1CisgICAgICAgIGxkdyAgICAgMTYoJXIyNiksJXI2CisgICAgICAgIGxkdyAgICAgMjAoJXIyNiksJXI3CisgICAgICAgIGxkdyAgICAgMjQoJXIyNiksJXI4CisgICAgICAgIGxkdyAgICAgMjgoJXIyNiksJXI5CisgICAgICAgIGxkdyAgICAgMzIoJXIyNiksJXIxMAorICAgICAgICBsZHcgICAgIDM2KCVyMjYpLCVyMTEKKyAgICAgICAgbGR3ICAgICA0MCglcjI2KSwlcjEyCisgICAgICAgIGxkdyAgICAgNDQoJXIyNiksJXIxMworICAgICAgICBsZHcgICAgIDQ4KCVyMjYpLCVyMTQKKyAgICAgICAgbGR3ICAgICA1MiglcjI2KSwlcjE1CisgICAgICAgIGxkdyAgICAgNTYoJXIyNiksJXIxNgorICAgICAgICBsZHcgICAgIDYwKCVyMjYpLCVyMTcKKyAgICAgICAgbGR3ICAgICA2NCglcjI2KSwlcjE4CisgICAgICAgIGxkdyAgICAgNjgoJXIyNiksJXIxOQorICAgICAgICBsZHcgICAgIDcyKCVyMjYpLCVyMjcKKyAgICAgICAgbGR3ICAgICA3NiglcjI2KSwlcjMwCisgICAgICAgIGxkdyAgICAgODAoJXIyNiksJXJwCisgICAgICAgIGxkbyAgICAgODgoJXIyNiksJXIyMAorICAgICAgICBmbGRkLG1hIDgoJXIyMCksJWZyMTIKKyAgICAgICAgZmxkZCxtYSA4KCVyMjApLCVmcjEzCisgICAgICAgIGZsZGQsbWEgOCglcjIwKSwlZnIxNAorICAgICAgICBmbGRkLG1hIDgoJXIyMCksJWZyMTUKKyAgICAgICAgZmxkZCxtYSA4KCVyMjApLCVmcjE2CisgICAgICAgIGZsZGQsbWEgOCglcjIwKSwlZnIxNworICAgICAgICBmbGRkLG1hIDgoJXIyMCksJWZyMTgKKyAgICAgICAgZmxkZCxtYSA4KCVyMjApLCVmcjE5CisgICAgICAgIGZsZGQsbWEgOCglcjIwKSwlZnIyMAorICAgICAgICBmbGRkICAgIDAoJXIyMCksJWZyMjEKKyAgICAgICAgYnYgICAgICAlcjAoJXJwKQorICAgICAgICBjb3B5ICAgICVyMjUsJXIyOAorICAgICAgICAucHJvY2VuZApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmMmE2NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9zeXNjYWxsLlMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIGFyY2gvcGFyaXNjL3N5c2NhbGwuUworICoKKyAqICVyMjAgY29udGFpbnMgdGhlIHN5c3RlbSBjYWxsIG51bWJlciwgJXIyIGNvbnRhaW5zIHdoZW5jZSB3ZSBjYW1lCisgKgorICovCisKKwkudGV4dAorCS5hbGlnbiA2NAkJCQk7IGNhY2hlLXdpZHRoIGFsaWduZWQKKwkuZ2xvYmwJX19zeXNjYWxsX2NvbW1vbgorCS50eXBlCV9fc3lzY2FsbF9jb21tb24sQGZ1bmN0aW9uCitfX3N5c2NhbGxfY29tbW9uOgorCWxkbyAJCTB4NDAoJXNwKSwlc3AKKwlzdHcgCQklcnAsLTB4NTQoJXNwKQkJOyBzYXZlIHJldHVybiBwb2ludGVyCisKKwlsZHcgCQktMHg3NCglc3ApLCVyMjIJCTsgJWFyZzQKKwlsZHcgCQktMHg3OCglc3ApLCVyMjEJCTsgJWFyZzUKKworCWJsZQkJMHgxMDAoJXNyMiwgJXIwKQk7IGp1bXAgdG8gZ2F0ZXdheSBwYWdlCisJbm9wCQkJCQk7IGNhbiB3ZSBtb3ZlIGEgbG9hZCBoZXJlPworCisJbGRpCQktMHgxMDAwLCVyMTkJCTsgJXIxOSA9IC00MDk2CisJc3ViCQklcjAsJXJldDAsJXIyMgkJOyAlcjIyID0gLSVyZXQwCisJY21wYiw+Pj0sbgklcjE5LCVyZXQwLDFmCQk7IGlmICVyZXQwID49IC00MDk2VUwKKwlsZGkJCS0xLCVyZXQwCQk7IG51bGxpZmllZCBvbiB0YWtlbiBmb3J3YXJkCisKKwkvKiBzdG9yZSAlcjIyIHRvIGVycm5vLi4uICovCisJbGRpbAkJTCVlcnJubywlcjEKKwlsZG8JCVIlZXJybm8oJXIxKSwlcjEKKwlzdHcJCSVyMjIsMCglcjEpCisxOgorCWxkdyAJCS0weDU0KCVzcCksJXJwCQk7IHJlc3RvcmUgcmV0dXJuIHBvaW50ZXIKKwlidgkJJXIwKCVycCkJCTsganVtcCBiYWNrCisJbGRvIAkJLTB4NDAoJXNwKSwlc3AKKworCS5zaXplIF9fc3lzY2FsbF9jb21tb24sLi1fX3N5c2NhbGxfY29tbW9uCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wYXJpc2Mvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTk2YWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wYXJpc2Mvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI4IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL3BhcmlzYy9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50ZXh0XG4iOworICAgIHByaW50IE9VVCAiXHQuYWxpZ24gNFxuIjsKKyAgICBwcmludCBPVVQgIlx0LmltcG9ydCBfX3N5c2NhbGxfY29tbW9uLCBjb2RlXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmFsICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHQuZXhwb3J0ICR7Zm5hbWV9LCBjb2RlXG4iOworICAgIHByaW50IE9VVCAiXHQucHJvY1xuIjsKKyAgICBwcmludCBPVVQgIlwuY2FsbGluZm9cbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICJcdGJcdF9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgT1VUICJcdCAgbGRvXHRfX05SXyR7c25hbWV9KCVyMCksJXIyMFxuIjsKKyAgICBwcmludCBPVVQgIlx0LnByb2NlbmRcbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BhcmlzYy92Zm9yay5TIGIvdXNyL2tsaWJjL2FyY2gvcGFyaXNjL3Zmb3JrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlYmM4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BhcmlzYy92Zm9yay5TCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBhcmNoL3BhcmlzYy92Zm9yay5TLCAidmZvcmsoKSBtZSBoYXJkZXIuIHVnaC4iIC0tIGt5bGUKKyAqCisgKiAlcjIwIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXIsICVycCBjb250YWlucyB3aGVuY2Ugd2UgY2FtZSwKKyAqICVycCBpcyBzYXZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIHRoZSBzeXNjYWxsLCB0aGFua2Z1bGx5LgorICoKKyAqLworCisJLnRleHQKKwkuYWxpZ24gNjQJCQkJOyBjYWNoZS13aWR0aCBhbGlnbmVkCisJLmdsb2JsCXZmb3JrCisJLnR5cGUJdmZvcmssQGZ1bmN0aW9uCit2Zm9yazoKKwkvKiBwaWRfdCB2Zm9yayh2b2lkKSAqLworCWJsZQkJMHgxMDAoJXNyMiwgJXIwKQk7IGp1bXAgdG8gZ2F0ZXdheSBwYWdlCisJbm9wCisKKwlsZGkJCS0weDEwMDAsJXIxOQkJOyAlcjE5ID0gLTQwOTYKKwlzdWIJCSVyMCwlcmV0MCwlcjIyCQk7ICVyMjIgPSAtJXJldDAKKwljbXBiLD4+PSxuCSVyMTksJXJldDAsMWYJCTsgaWYgJXJldDAgPj0gLTQwOTZVTAorCWxkaQkJLTEsJXJldDAJCTsgbnVsbGlmaWVkIG9uIHRha2VuIGZvcndhcmQKKworCS8qIHN0b3JlICVyMjIgdG8gZXJybm8uLi4gKi8KKwlsZGlsCQlMJWVycm5vLCVyMQorCWxkbwkJUiVlcnJubyglcjEpLCVyMQorCXN0dwkJJXIyMiwwKCVyMSkKKzE6CisJYnYJCSVyMCglcnApCQk7IGp1bXAgYmFjaworCW5vcAorCisJLnNpemUgdmZvcmssLi12Zm9yawpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjL0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL3BwYy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5MzgwZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BwYy9LYnVpbGQKQEAgLTAsMCArMSwxMiBAQAorIworIyBrbGliYyBmaWxlcyBmb3IgcHBjCisjCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8KKwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2RpdmRpMy5vICAgICAuLi8uLi9saWJnY2MvX19tb2RkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZkaTMubyAgICAuLi8uLi9saWJnY2MvX191bW9kZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191ZGl2bW9kZGk0Lm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGMvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL3BwYy9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzMzODkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGMvTUNPTkZJRwpAQCAtMCwwICsxLDI5IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9wcGMvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisKK2djY19tMzJfb3B0aW9uICA6PSAkKGNhbGwgY2Mtb3B0aW9uLCAtbTMyLCApCisKK0tMSUJDT1BURkxBR1MJICAgKz0gLU9zCitLTElCQ0xERkxBR1MgICAgICAgPSAtbSBlbGYzMnBwY2xpbnV4CitLTElCQ0FSQ0hSRVFGTEFHUyArPSAkKGdjY19tMzJfb3B0aW9uKQorCitLTElCQ0JJVFNJWkUgICAgICAgPSAzMgorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyAyNTYtMTYgTUIgLSBub3JtYWwgYmluYXJpZXMgc3RhcnQgYXQgMjU2IE1CLCBhbmQganVtcHMgYXJlIGxpbWl0ZWQKKyMgdG8gKy8tIDE2IE1CCitLTElCQ1NIQVJFREZMQUdTICAgICA9IC1UdGV4dCAweDBmODAwMjAwCisKKyMgVGhlIGtlcm5lbCBzbyBmYXIgaGFzIGJvdGggYXNtLXBwYyogYW5kIGFzbS1wb3dlcnBjLgorS0xJQkNBUkNISU5DRkxBR1MgPSAtSSQoS0xJQkNLRVJORUxPQkopYXJjaC8kKEtMSUJDQVJDSCkvaW5jbHVkZQorCisjIFRoZSBhc20gaW5jbHVkZSBmaWxlcyBsaXZlIGluIGFzbS1wb3dlcnBjCitLTElCQ0FTTUFSQ0gJPSBwb3dlcnBjCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGMvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvcHBjL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWI2ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjL2NydDAuUwpAQCAtMCwwICsxLDIzIEBACisjCisjIGFyY2gvcHBjL2NydDAuUworIworCisJLnRleHQKKwkuYWxpZ24gNAorCS50eXBlIF9zdGFydCxAZnVuY3Rpb24KKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJc3R3dQkxLC0xNigxKQorCWFkZGkJMywxLDE2CisJLyoKKwkgKiB0aGUgU1ZSNGFiaXBwYy5wZGYgc3BlY2lmaWVzIHI3IGFzIGEgcG9pbnRlciB0bworCSAqIGEgdGVybWluYXRpb24gZnVuY3Rpb24gcG9pbnQKKwkgKiBIb3dldmVyLCBTZWN0aW9uIDguNC4xIG9mIHRoZSBMU0IgQVBJIGRvY3Mgc2F5IHRoYXQKKwkgKiBUaGUgdmFsdWUgdG8gYmUgcGxhY2VkIGludG8gcmVnaXN0ZXIgcjcsIHRoZSB0ZXJtaW5hdGlvbgorCSAqIGZ1bmN0aW9uIHBvaW50ZXIsIGlzIG5vdCBwYXNzZWQgdG8gdGhlIHByb2Nlc3MuCisJICogU28gd2Ugc3R1YiBpdCBvdXQsIGluc3RlYWQuCisJICovCisJbGkJNCwwCisJYmwJX19saWJjX2luaXQKKworCS5zaXplIF9zdGFydCwuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjL3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvcHBjL3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmI3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGMvc2V0am1wLlMKQEAgLTAsMCArMSwzNCBAQAorIworIyBhcmNoL3BwYy9zZXRqbXAuUworIworIyBCYXNpYyBzZXRqbXAvbG9uZ2ptcCBpbXBsZW1lbnRhdGlvbgorIyBUaGlzIGZpbGUgd2FzIGRlcml2ZWQgZnJvbSB0aGUgZXF1aXZhbGVudCBmaWxlIGluIE5ldEJTRAorIworCisJLnRleHQKKwkuYWxpZ24gNAorCS50eXBlIHNldGptcCxAZnVuY3Rpb24KKwkuZ2xvYmwgc2V0am1wCitzZXRqbXA6CisgICAgICAgIG1mbHIgICAgJXIxMSAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSByZXR1cm4gYWRkcmVzcyAqLworICAgICAgICBtZmNyICAgICVyMTIgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgY29uZGl0aW9uIHJlZ2lzdGVyICovCisgICAgICAgIG1yICAgICAgJXIxMCwlcjEgICAgICAgICAgICAgICAgLyogc2F2ZSBzdGFjayBwb2ludGVyICovCisgICAgICAgIG1yICAgICAgJXI5LCVyMiAgICAgICAgICAgICAgICAgLyogc2F2ZSBHUFIyIChub3QgbmVlZGVkKSAqLworICAgICAgICBzdG13ICAgICVyOSwwKCVyMykgICAgICAgICAgICAgIC8qIHNhdmUgcjkuLnIzMSAqLworICAgICAgICBsaSAgICAgICVyMywwICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRlIHN1Y2Nlc3MgKi8KKyAgICAgICAgYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gKi8KKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLnR5cGUgbG9uZ2ptcCxAZnVuY3Rpb24KKwkuZ2xvYmwgbG9uZ2ptcAorbG9uZ2ptcDoKKyAgICAgICAgbG13ICAgICAlcjksMCglcjMpICAgICAgICAgICAgICAvKiBzYXZlIHI5Li5yMzEgKi8KKyAgICAgICAgbXRsciAgICAlcjExICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIExSICovCisgICAgICAgIG10Y3IgICAgJXIxMiAgICAgICAgICAgICAgICAgICAgLyogcmVzdG9yZSBDUiAqLworICAgICAgICBtciAgICAgICVyMiwlcjkgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgR1BSMiAobm90IG5lZWRlZCkgKi8KKyAgICAgICAgbXIgICAgICAlcjEsJXIxMCAgICAgICAgICAgICAgICAvKiByZXN0b3JlIHN0YWNrICovCisgICAgICAgIG1yICAgICAgJXIzLCVyNCAgICAgICAgICAgICAgICAgLyogZ2V0IHJldHVybiB2YWx1ZSAqLworICAgICAgICBibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiAqLworCisJLnNpemUgbG9uZ2ptcCwuLWxvbmdqbXAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3BwYy9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9wcGMvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhN2MzN2MKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGMvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBhcmNoL3BwYy9zeXNjYWxsLlMKKyAqCisgKiBDb21tb24gZXJyb3ItaGFuZGxpbmcgcGF0aCBmb3Igc3lzdGVtIGNhbGxzLgorICovCisKKwkudGV4dAorCS5hbGlnbgkyCisJLmdsb2JsCV9fc3lzY2FsbF9lcnJvcgorCS50eXBlCV9fc3lzY2FsbF9lcnJvcixAZnVuY3Rpb24KK19fc3lzY2FsbF9lcnJvcjoKKwlsaXMJOSxlcnJub0BoYQorCXN0dwkzLGVycm5vQGwoOSkKKwlsaQkzLC0xCisJYmxyCisJLnNpemUJX19zeXNjYWxsX2Vycm9yLC4tX19zeXNjYWxsX2Vycm9yCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGMvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3BwYy9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzkxNmMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGMvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI1IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL3BwYy9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlICR7Zm5hbWV9LFxAZnVuY3Rpb25cbiI7CisgICAgcHJpbnQgT1VUICJcdC5nbG9ibCAke2ZuYW1lfVxuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCBPVVQgIlx0bGkgMCxfX05SXyR7c25hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHRzY1xuIjsKKyAgICBwcmludCBPVVQgIlx0Ym5zbHJcbiI7CisgICAgcHJpbnQgT1VUICJcdGIgX19zeXNjYWxsX2Vycm9yXG4iOworICAgIHByaW50IE9VVCAiXHQuc2l6ZSAke2ZuYW1lfSwuLSR7Zm5hbWV9XG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGM2NC9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9wcGM2NC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5ZTkxZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L0tidWlsZApAQCAtMCwwICsxLDggQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIHBwYzY0CisjCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGM2NC9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJkMDdhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvTUNPTkZJRwpAQCAtMCwwICsxLDI2IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9wcGM2NC9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNBUkNIUkVRRkxBR1MgPSAtbTY0IC1tY2FsbC1haXhkZXNjCitLTElCQ09QVEZMQUdTICAgICArPSAtT3MKK0tMSUJDQklUU0laRSAgICAgID0gNjQKK0tMSUJDTERGTEFHUyAgICAgID0gLW0gZWxmNjRwcGMKKworIyBFeHRyYSBsaW5rZmxhZ3Mgd2hlbiBidWlsZGluZyB0aGUgc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKKyMgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIHJlYWNoYWJsZSB1c2luZyBub3JtYWwgaW50ZXItbW9kdWxlCisjIGNhbGxzLCBhbmQgd29yayBvbiB0aGUgbWVtb3J5IG1vZGVscyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUKKyMgMjU2LTE2IE1CIC0gbm9ybWFsIGJpbmFyaWVzIHN0YXJ0IGF0IDI1NiBNQiwgYW5kIGp1bXBzIGFyZSBsaW1pdGVkCisjIHRvICsvLSAxNiBNQgorS0xJQkNTSEFSRURGTEFHUyAgICAgPSAtVHRleHQgMHgwZjAwMDIwMAorCisjIFRoZSBrZXJuZWwgc28gZmFyIGhhcyBib3RoIGFzbS1wcGMqIGFuZCBhc20tcG93ZXJwYy4KK0tMSUJDQVJDSElOQ0ZMQUdTID0gLUkkKEtMSUJDS0VSTkVMT0JKKWFyY2gvJChLTElCQ0FSQ0gpL2luY2x1ZGUKKworIyBUaGUgYXNtIGluY2x1ZGUgZmlsZXMgbGl2ZSBpbiBhc20tcG93ZXJwYworS0xJQkNBU01BUkNICT0gcG93ZXJwYwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvcHBjNjQvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Nzc2YTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGM2NC9jcnQwLlMKQEAgLTAsMCArMSwzMiBAQAorIworIyBhcmNoL3BwYzY0L2NydDAuUworIworIyB2b2lkIF9zdGFydCh2b2lkKQorIyB7CisjICAgIC8qIERpdmluZSB1cCBhcmdjLCBhcmd2LCBhbmQgZW52cCAqLworIyAgICBlbnZpcm9uID0gZW52cDsKKyMgICAgZXhpdChtYWluKGFyZ2MsIGFyZ3YsIGVudnApKTsKKyMgfQorIworCisJLnNlY3Rpb24gIi50b2MiLCJhdyIKKy5MQzA6CS50YwllbnZpcm9uW1RDXSxlbnZpcm9uCisKKwkuc2VjdGlvbiAiLm9wZCIsImF3IgorCS5hbGlnbiAzCisJLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCS5xdWFkCS5fc3RhcnQKKwkucXVhZAkuVE9DLkB0b2NiYXNlLCAwCisKKwkudGV4dAorCS5nbG9ibAkuX3N0YXJ0CisJLnR5cGUJLl9zdGFydCxAZnVuY3Rpb24KKy5fc3RhcnQ6CisJc3RkdSAgICAlcjEsLTMyKCVyMSkKKwlhZGRpICAgICVyMywlcjEsMzIKKwlsaQklcjQsMAkJLyogZmluaSAodW51c2VkKSAqLworCWIgCS5fX2xpYmNfaW5pdAorCW5vcAorCisJLnNpemUgX3N0YXJ0LC4tX3N0YXJ0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGM2NC9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGI0MTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9wcGM2NC9zZXRqbXAuUwpAQCAtMCwwICsxLDg1IEBACisjCisjIGFyY2gvcHBjNjQvc2V0am1wLlMKKyMKKyMgQmFzaWMgc2V0am1wL2xvbmdqbXAgaW1wbGVtZW50YXRpb24KKyMKKworCS50ZXh0CisJLmFsaWduIDQKKworCS5zZWN0aW9uICIub3BkIiwiYXciCitzZXRqbXA6CisJLnF1YWQJLnNldGptcCwuVE9DLkB0b2NiYXNlLDAKKwkucHJldmlvdXMKKwkuc2l6ZQlzZXRqbXAsMjQKKwkudHlwZQkuc2V0am1wLEBmdW5jdGlvbgorCS5nbG9ibAlzZXRqbXAKKwkuZ2xvYmwJLnNldGptcAorLnNldGptcDoKKwltZmxyCSVyMTEJCQkvKiBzYXZlIHJldHVybiBhZGRyZXNzICovCisJbWZjcgklcjEyCQkJLyogc2F2ZSBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKwlzdGQJJXIyLDAoJXIzKQkJLyogc2F2ZSBUT0MgcG9pbnRlciAobm90IG5lZWRlZCkgKi8KKwlzdGR1CSVyMSw4KCVyMykJCS8qIHNhdmUgc3RhY2sgcG9pbnRlciAqLworCXN0ZHUJJXIxMSw4KCVyMykKKwlzdGR1CSVyMTIsOCglcjMpCisJc3RkdQklcjEzLDgoJXIzKQkJLyogc2F2ZSBjYWxsZXIgc2F2ZWQgcmVncyAqLworCXN0ZHUJJXIxNCw4KCVyMykKKwlzdGR1CSVyMTUsOCglcjMpCisJc3RkdQklcjE2LDgoJXIzKQorCXN0ZHUJJXIxNyw4KCVyMykKKwlzdGR1CSVyMTgsOCglcjMpCisJc3RkdQklcjE5LDgoJXIzKQorCXN0ZHUJJXIyMCw4KCVyMykKKwlzdGR1CSVyMjEsOCglcjMpCisJc3RkdQklcjIyLDgoJXIzKQorCXN0ZHUJJXIyMyw4KCVyMykKKwlzdGR1CSVyMjQsOCglcjMpCisJc3RkdQklcjI1LDgoJXIzKQorCXN0ZHUJJXIyNiw4KCVyMykKKwlzdGR1CSVyMjcsOCglcjMpCisJc3RkdQklcjI4LDgoJXIzKQorCXN0ZHUJJXIyOSw4KCVyMykKKwlzdGR1CSVyMzAsOCglcjMpCisJc3RkCSVyMzEsOCglcjMpCisJbGkJJXIzLDAJCQkvKiBpbmRpY2F0ZSBzdWNjZXNzICovCisJYmxyCQkJCS8qIHJldHVybiAqLworCisJLnNpemUgLnNldGptcCwuLS5zZXRqbXAKKwkuc2VjdGlvbiAiLm9wZCIsImF3IgorbG9uZ2ptcDoKKwkucXVhZAkubG9uZ2ptcCwuVE9DLkB0b2NiYXNlLDAKKwkucHJldmlvdXMKKwkuc2l6ZQlsb25nam1wLDI0CisJLnR5cGUJLmxvbmdqbXAsQGZ1bmN0aW9uCisJLmdsb2JsCWxvbmdqbXAKKwkuZ2xvYmwJLmxvbmdqbXAKKy5sb25nam1wOgorCWxkCSVyMiwwKCVyMykJCS8qIHJlc3RvcmUgVE9DIHBvaW50ZXIgKG5vdCBuZWVkZWQpICovCisJbGR1CSVyMSw4KCVyMykJCS8qIHJlc3RvcmUgc3RhY2sgKi8KKwlsZHUJJXIxMSw4KCVyMykKKwlsZHUJJXIxMiw4KCVyMykKKwlsZHUJJXIxMyw4KCVyMykJCS8qIHJlc3RvcmUgY2FsbGVyIHNhdmVkIHJlZ3MgKi8KKwlsZHUJJXIxNCw4KCVyMykKKwlsZHUJJXIxNSw4KCVyMykKKwlsZHUJJXIxNiw4KCVyMykKKwlsZHUJJXIxNyw4KCVyMykKKwlsZHUJJXIxOCw4KCVyMykKKwlsZHUJJXIxOSw4KCVyMykKKwlsZHUJJXIyMCw4KCVyMykKKwlsZHUJJXIyMSw4KCVyMykKKwlsZHUJJXIyMiw4KCVyMykKKwlsZHUJJXIyMyw4KCVyMykKKwlsZHUJJXIyNCw4KCVyMykKKwlsZHUJJXIyNSw4KCVyMykKKwlsZHUJJXIyNiw4KCVyMykKKwlsZHUJJXIyNyw4KCVyMykKKwlsZHUJJXIyOCw4KCVyMykKKwlsZHUJJXIyOSw4KCVyMykKKwlsZHUJJXIzMCw4KCVyMykKKwlsZAklcjMxLDgoJXIzKQorCW10bHIJJXIxMQkJCS8qIHJlc3RvcmUgTFIgKi8KKwltdGNyCSVyMTIJCQkvKiByZXN0b3JlIENSICovCisJbXIJJXIzLCVyNAkJCS8qIGdldCByZXR1cm4gdmFsdWUgKi8KKwlibHIJCQkJLyogcmV0dXJuICovCisKKwkuc2l6ZSAubG9uZ2ptcCwuLS5sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGM2NC9zeXNjYWxsLmMgYi91c3Iva2xpYmMvYXJjaC9wcGM2NC9zeXNjYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4OTVmZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3BwYzY0L3N5c2NhbGwuYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogYXJjaC9wcGM2NC9zeXNjYWxsLmMKKyAqCisgKiBDb21tb24gZXJyb3ItaGFuZGxpbmcgcGF0aCBmb3Igc3lzdGVtIGNhbGxzLgorICogVGhlIHJldHVybiB2YWx1ZSBmcm9tIF9fc3lzY2FsbF9lcnJvciBiZWNvbWVzIHRoZQorICogcmV0dXJuIHZhbHVlIGZyb20gdGhlIHN5c3RlbSBjYWxsLgorICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKworbG9uZyBpbnQgX19zeXNjYWxsX2Vycm9yKGxvbmcgaW50IGVycikKK3sKKwllcnJubyA9IGVycjsKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9wcGM2NC9zeXNzdHViLnBoIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU5MzcwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvcHBjNjQvc3lzc3R1Yi5waApAQCAtMCwwICsxLDMxIEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL3BwYzY0L3N5c3N0dWIucGgKKyMKKyMgU2NyaXB0IHRvIGdlbmVyYXRlIHN5c3RlbSBjYWxsIHN0dWJzCisjCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHQuc2VjdGlvbiBcIi5vcGRcIixcImF3XCJcbiI7CisgICAgcHJpbnQgT1VUICJcdC5hbGlnbiAzXG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHQucXVhZCAuJHtmbmFtZX0sLlRPQy5cQHRvY2Jhc2UsMFxuIjsKKyAgICBwcmludCBPVVQgIlx0LnRleHRcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlIC4ke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmwgLiR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiLiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCBPVVQgIlx0bGkgMCxfX05SXyR7c25hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHRzY1xuIjsKKyAgICBwcmludCBPVVQgIlx0Ym5zbHJcbiI7CisgICAgcHJpbnQgT1VUICJcdGIgLl9fc3lzY2FsbF9lcnJvclxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgLiR7Zm5hbWV9LC4tLiR7Zm5hbWV9XG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zMzkwL0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL3MzOTAvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGU5N2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zMzkwL0tidWlsZApAQCAtMCwwICsxLDIyIEBACisjCisjIGtsaWJjIGZpbGVzIGZvciBzMzkwCisjCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubworCitpZm5lcSAoIiQoS0xJQkNBUkNIKSIsICJzMzkweCIpCisKK2tsaWIteSA6PSBzZXRqbXAubyBtbWFwLm8gc3lzY2FsbC5vCisKK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX19jbHpzaTIubyAgIC4uLy4uL2xpYmdjYy9fX2FzaGxkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2FzaHJkaTMubyAgLi4vLi4vbGliZ2NjL19fbHNocmRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fZGl2ZGkzLm8gICAuLi8uLi9saWJnY2MvX19tb2RkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX3VkaXZkaTMubyAgLi4vLi4vbGliZ2NjL19fdW1vZGRpMy5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fdWRpdm1vZGRpNC5vCisKK2Vsc2UKKwora2xpYi15IDo9IHNldGptcC5vIG1tYXAubyBzeXNjYWxsLm8KKworZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3MzOTAvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ5YTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvczM5MC9NQ09ORklHCkBAIC0wLDAgKzEsMjMgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL3MzOTAvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworS0xJQkNPUFRGTEFHUyArPSAtT3MKKworaWZuZXEgKCIkKEtMSUJDQVJDSCkiLCAiczM5MHgiKQorCUtMSUJDQklUU0laRQk9IDMyCisJS0xJQkNDRkxBR1MJKz0gLW0zMQorCUtMSUJDTERGTEFHUwkrPSAtbSBlbGZfczM5MAorZWxzZQorCUtMSUJDQklUU0laRQk9IDY0CisJS0xJQkNDRkxBR1MJKz0gLW02NAorCUtMSUJDTERGTEFHUwkrPSAtbSBlbGY2NF9zMzkwCitlbmRpZgorCitLTElCQ0FTTUFSQ0gJCT0gczM5MAorS0xJQkNTSEFSRURGTEFHUwk9IC1UdGV4dCAweDQwMDAwMjAwCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zMzkwL2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTIzN2UKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zMzkwL2NydDAuUwpAQCAtMCwwICsxLDM1IEBACisjCisjIGFyY2gvczM5MC9jcnQwLlMKKyMKKyMgRG9lcyBhcmNoLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGFuZCBpbnZva2VzIF9fbGliY19pbml0CisjIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy4KKyMKKyMgU2VlIF9fc3RhdGljX2luaXQuYyBvciBfX3NoYXJlZF9pbml0LmMgZm9yIHRoZSBleHBlY3RlZAorIyBhcmd1bWVudHMuCisjCisJLnRleHQKKwkuYWxpZ24gNAorCS50eXBlIF9zdGFydCxAZnVuY3Rpb24KKwkuZ2xvYmwgX3N0YXJ0CisKKyNpZm5kZWYgX19zMzkweF9fCisKK19zdGFydDoKKwlscgklcjIsJXIxNQorCWxoaQklcjMsMAorCWFoaQklcjE1LC05NgorCWJyYXMJJXIxLC5MMAorLkwwOgorCWwJJXIxLC5MMS0uTDAoJXIxKQorCWJyCSVyMQorLkwxOgorCS5sb25nCV9fbGliY19pbml0CisjZWxzZQorCitfc3RhcnQ6CisJbGdyCSVyMiwlcjE1CisJbGdoaQklcjMsMAorCWFnaGkJJXIxNSwtMTYwCisJamcJX19saWJjX2luaXQKKyNlbmRpZgorCS5zaXplIF9zdGFydCwuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvczM5MC9tbWFwLmMgYi91c3Iva2xpYmMvYXJjaC9zMzkwL21tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzMxMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvczM5MC9tbWFwLmMKQEAgLTAsMCArMSw3NCBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKK3N0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwl1bnNpZ25lZCBsb25nIHByb3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZkOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfTsKKworI2lmbmRlZiBfX3MzOTB4X18KKwordm9pZCAqX19tbWFwMih2b2lkICphZGRyLCBzaXplX3QgbGVuLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgYXJncyA9IHsKKwkJLmFkZHIJPSAodW5zaWduZWQgbG9uZylhZGRyLAorCQkubGVuCT0gKHVuc2lnbmVkIGxvbmcpbGVuLAorCQkucHJvdAk9ICh1bnNpZ25lZCBsb25nKXByb3QsCisJCS5mbGFncwk9ICh1bnNpZ25lZCBsb25nKWZsYWdzLAorCQkuZmQJPSAodW5zaWduZWQgbG9uZylmZCwKKwkJLm9mZnNldCA9ICh1bnNpZ25lZCBsb25nKW9mZnNldCwKKwl9OworCisJcmVnaXN0ZXIgc3RydWN0IG1tYXBfYXJnX3N0cnVjdCAqX19hcmcxIGFzbSgiMiIpID0gJmFyZ3M7CisJcmVnaXN0ZXIgbG9uZyBfX3N2Y3JlcyBhc20oIjIiKTsKKwl1bnNpZ25lZCBsb25nIF9fcmVzOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiAgICBzdmMgJWIxXG4iCisJCQkgICAgIDogIj1kIihfX3N2Y3JlcykKKwkJCSAgICAgOiAiaSIoX19OUl9tbWFwMiksICIwIihfX2FyZzEpCisJCQkgICAgIDogIjEiLCAiY2MiLCAibWVtb3J5Iik7CisJX19yZXMgPSBfX3N2Y3JlczsKKwlpZiAoX19yZXMgPj0gKHVuc2lnbmVkIGxvbmcpLTQwOTUpIHsKKwkJZXJybm8gPSAtX19yZXM7CisJCV9fcmVzID0gLTE7CisJfQorCXJldHVybiAodm9pZCAqKV9fcmVzOworfQorCisjZWxzZSAvKiBfX3MzOTB4X18gKi8KKwordm9pZCAqbW1hcCh2b2lkICphZGRyLCBzaXplX3QgbGVuLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIG9mZl90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IGFyZ3MgPSB7CisJCS5hZGRyCT0gKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJLmxlbgk9ICh1bnNpZ25lZCBsb25nKWxlbiwKKwkJLnByb3QJPSAodW5zaWduZWQgbG9uZylwcm90LAorCQkuZmxhZ3MJPSAodW5zaWduZWQgbG9uZylmbGFncywKKwkJLmZkCT0gKHVuc2lnbmVkIGxvbmcpZmQsCisJCS5vZmZzZXQgPSAodW5zaWduZWQgbG9uZylvZmZzZXQsCisJfTsKKworCXJlZ2lzdGVyIHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgKl9fYXJnMSBhc20oIjIiKSA9ICZhcmdzOworCXJlZ2lzdGVyIGxvbmcgX19zdmNyZXMgYXNtKCIyIik7CisJdW5zaWduZWQgbG9uZyBfX3JlczsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgICBzdmMgJWIxXG4iCisJCTogIj1kIiAoX19zdmNyZXMpCisJCTogImkiIChfX05SX21tYXApLAorCQkgICIwIiAoX19hcmcxKQorCQk6ICIxIiwgImNjIiwgIm1lbW9yeSIpOworCV9fcmVzID0gX19zdmNyZXM7CisJaWYgKF9fcmVzID49ICh1bnNpZ25lZCBsb25nKS00MDk1KSB7CisJCWVycm5vID0gLV9fcmVzOworCQlfX3JlcyA9IC0xOworCX0KKwlyZXR1cm4gKHZvaWQgKilfX3JlczsKK30KKworI2VuZGlmIC8qIF9fczM5MHhfXyAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvczM5MC9zZXRqbXAuUyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2YTA1MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvc2V0am1wLlMKQEAgLTAsMCArMSw2NiBAQAorIworIyBhcmNoL3MzOTAvc2V0am1wLlMKKyMKKyMgc2V0am1wL2xvbmdqbXAgZm9yIHRoZSBzMzkwIGFyY2hpdGVjdHVyZQorIworCisJLnRleHQKKwkuYWxpZ24gNAorCS5nbG9ibCBzZXRqbXAKKwkudHlwZSBzZXRqbXAsIEBmdW5jdGlvbgorCisjaWZuZGVmIF9fczM5MHhfXworCitzZXRqbXA6CisJc3RtCSVyNiwlcjE1LDAoJXIyKQkJIyBzYXZlIGFsbCBnZW5lcmFsIHJlZ2lzdGVycworCXN0ZAklZjQsNDAoJXIyKQkJIyBzYXZlIGZwIHJlZ2lzdGVycyBmNCBhbmQgZjYKKwlzdGQJJWY2LDQ4KCVyMikKKwlsaGkJJXIyLDAJCQkjIHJldHVybiAwCisJYnIJJXIxNAorCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCBAZnVuY3Rpb24KK2xvbmdqbXA6CisJbHIJJXIxLCVyMgkJCSMgam1wX2J1ZgorCWxyCSVyMiwlcjMJCQkjIHJldHVybiB2YWx1ZQorCWxkCSVmNiw0OCglcjEpCQkjIHJlc3RvcmUgYWxsIHNhdmVkIHJlZ2lzdGVycworCWxkCSVmNCw0MCglcjEpCisJbG0JJXI2LCVyMTUsMCglcjEpCisJYnIJJXIxNAkJCSMgcmV0dXJuIHRvIHJlc3RvcmVkIGFkZHJlc3MKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCisKKyNlbHNlCisKK3NldGptcDoKKwlzdG1nCSVyNiwlcjE1LDAoJXIyKQkJIyBzYXZlIGFsbCBnZW5lcmFsIHJlZ2lzdGVycworCXN0ZAklZjEsODAoJXIyKQkJIyBzYXZlIGZwIHJlZ2lzdGVycyBmNCBhbmQgZjYKKwlzdGQJJWYzLDg4KCVyMikKKwlzdGQJJWY1LDk2KCVyMikKKwlzdGQJJWY3LDEwNCglcjIpCisJbGdoaQklcjIsMAkJCSMgcmV0dXJuIDAKKwlicgklcjE0CisKKwkuc2l6ZSBzZXRqbXAsLi1zZXRqbXAKKworCS50ZXh0CisJLmFsaWduIDQKKwkuZ2xvYmwgbG9uZ2ptcAorCS50eXBlIGxvbmdqbXAsIEBmdW5jdGlvbgorbG9uZ2ptcDoKKwlsZ3IJJXIxLCVyMgkJCSMgam1wX2J1ZgorCWxncgklcjIsJXIzCQkJIyByZXR1cm4gdmFsdWUKKwlsZAklZjcsMTA0KCVyMSkJCSMgcmVzdG9yZSBhbGwgc2F2ZWQgcmVnaXN0ZXJzCisJbGQJJWY1LDk2KCVyMSkKKwlsZAklZjMsODgoJXIxKQorCWxkCSVmMSw4MCglcjEpCisJbG1nCSVyNiwlcjE1LDAoJXIxKQorCWJyCSVyMTQJCQkjIHJldHVybiB0byByZXN0b3JlZCBhZGRyZXNzCisKKwkuc2l6ZSBsb25nam1wLC4tbG9uZ2ptcAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3MzOTAvc3lzY2FsbC5jIGIvdXNyL2tsaWJjL2FyY2gvczM5MC9zeXNjYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkMjAxZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3MzOTAvc3lzY2FsbC5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBhcmNoL3MzOTAvc3lzY2FsbC5jCisgKgorICogQ29tbW9uIGVycm9yLWhhbmRsaW5nIHBhdGggZm9yIHN5c3RlbSBjYWxscy4KKyAqIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBfX3N5c2NhbGxfY29tbW9uIGJlY29tZXMgdGhlCisgKiByZXR1cm4gdmFsdWUgZnJvbSB0aGUgc3lzdGVtIGNhbGwuCisgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorCit1bnNpZ25lZCBsb25nIF9fc3lzY2FsbF9jb21tb24odW5zaWduZWQgbG9uZyBlcnIpCit7CisJaWYgKGVyciA8IC00MDk1VUwpCisJCXJldHVybiBlcnI7CisJZXJybm8gPSAtZXJyOworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3MzOTAvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3MzOTAvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E3YjZiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvczM5MC9zeXNzdHViLnBoCkBAIC0wLDAgKzEsNjMgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gvczM5MC9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKyAgICBteSgkdCk7CisgICAgbXkoJHIsICRsbHJlZ3MpID0gKDAsICgkdHlwZXNpemV7J3ZvaWQgKid9ID09IDgpID8gMSA6IDIpOworCisgICAgZm9yZWFjaCAkdCAoQGFyZ3MpIHsKKwkgICAgJHIgKz0gKCR0eXBlc2l6ZXskdH0gPT0gOCkgPyAkbGxyZWdzIDogMTsKKyAgICB9CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgPDxFT0Y7CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnR5cGUgJHtmbmFtZX0sXEBmdW5jdGlvbgorCS5nbG9ibCAke2ZuYW1lfQorJHtmbmFtZX06CisuaWYgJHtyfSA+IDYKKy5wcmludCAiU3lzdGVtIGNhbGwgd2l0aCBtb3JlIHRoYW4gc2l4IHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCB5ZXQuIgorLmVycgorLmVuZGlmCisuaWYgJHtyfSA9PSA2CisjaWZuZGVmIF9fczM5MHhfXworCXN0CSVyNyw1NiglcjE1KQorCWwJJXI3LDk2KCVyMTUpCisjZWxzZQorCXN0ZwklcjcsODAoJXIxNSkKKwlsZwklcjcsMTYwKCVyMTUpCisjZW5kaWYKKy5lbmRpZgorLmlmIF9fTlJfJHtzbmFtZX0gPCAyNTYKKwlzdmMJX19OUl8ke3NuYW1lfQorLmVsc2UKKwlsYQklcjEsX19OUl8ke3NuYW1lfQorCXN2YwkwCisuZW5kaWYKKy5pZiAke3J9ID09IDYKKyNpZm5kZWYgX19zMzkweF9fCisJbAklcjcsNTYoJXIxNSkKKyNlbHNlCisJbGcJJXI3LDE2MCglcjE1KQorI2VuZGlmCisuZW5kaWYKKyNpZm5kZWYgX19zMzkweF9fCisJYnJhcwklcjMsMWYKKwkubG9uZwlfX3N5c2NhbGxfY29tbW9uCisxOglsCSVyMywwKCVyMykKKwlicgklcjMKKyNlbHNlCisJYnJhc2wJJXIzLF9fc3lzY2FsbF9jb21tb24KKyNlbmRpZgorCS5zaXplCSR7Zm5hbWV9LC4tJHtmbmFtZX0KK0VPRgorICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zaC9LYnVpbGQgYi91c3Iva2xpYmMvYXJjaC9zaC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3YWQ1YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NoL0tidWlsZApAQCAtMCwwICsxLDggQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIHNoCisjCisKK2tsaWIteSA6PSBzZXRqbXAubyBzeXNjYWxsLm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zaC9NQ09ORklHIGIvdXNyL2tsaWJjL2FyY2gvc2gvTUNPTkZJRwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTkwODUwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc2gvTUNPTkZJRwpAQCAtMCwwICsxLDE4IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9zaC9NQ09ORklHCisjCisjIFNwZWNpYWwgcnVsZXMgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkKKyMgaW5jbHVkZWQgZnJvbSB0aGUgbWFpbiBNYWtlZmlsZSwgYW5kIHRoYXQgcGF0aG5hbWVzIHNob3VsZCBiZQorIyBhY2NvcmRpbmdseS4KKyMKKworQVJDSFJFR0ZMQUdTID0gLW00IC1tbm8taW1wbGljaXQtZnAKK0tMSUJDT1BURkxBR1MgICAgICs9IC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlcgorS0xJQkNCSVRTSVpFICAgICAgPSAzMgorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyAyIE1CIC0tIHRoZSBub3JtYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHRleHQgaXMgNCBNQi4KK0tMSUJDU0hBUkVERkxBR1MJPSAtVHRleHQgMHgwMDIwMDIwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc2gvY3J0MC5TIGIvdXNyL2tsaWJjL2FyY2gvc2gvY3J0MC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGE2NDkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zaC9jcnQwLlMKQEAgLTAsMCArMSwyNyBAQAorIworIyBhcmNoL3NoL2NydDAuUworIworIyBEb2VzIGFyY2gtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gYW5kIGludm9rZXMgX19saWJjX2luaXQKKyMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgorIworIyBTZWUgX19zdGF0aWNfaW5pdC5jIG9yIF9fc2hhcmVkX2luaXQuYyBmb3IgdGhlIGV4cGVjdGVkCisjIGFyZ3VtZW50cy4KKyMKKworCS50ZXh0CisJLmFsaWduIDIKKwkudHlwZSBfc3RhcnQsI2Z1bmN0aW9uCisJLmdsb2JsIF9zdGFydAorCitfc3RhcnQ6CisJbW92CXIxNSwgcjQKKwltb3YJIzAsIHI1CisJbW92LmwJMWYsIHIwCisKKwlqc3IJQHIwCisJIG5vcAorCisJLmFsaWduIDIKKzE6CS5sb25nCV9fbGliY19pbml0CisKKwkuc2l6ZSBfc3RhcnQsLi1fc3RhcnQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NoL3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvc2gvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1MjM1OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NoL3NldGptcC5TCkBAIC0wLDAgKzEsNjQgQEAKKyMKKyMgYXJjaC9zaC9zZXRqbXAuUworIworIyBzZXRqbXAvbG9uZ2ptcCBmb3IgdGhlIFN1cGVySCBhcmNoaXRlY3R1cmUKKyMKKworIworIyBUaGUgam1wX2J1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZywgaW4gb3JkZXI6CisjCisjCQlyOAorIwkJcjkKKyMJCXIxMAorIwkJcjExCisjCQlyMTIKKyMJCXIxMworIwkJcjE0CisjCQlyMTUKKyMJCXByCisjCisKKwkudGV4dAorCS5hbGlnbiAyCisKKwkuZ2xvYmwgc2V0am1wCisJLnR5cGUgc2V0am1wLCAjZnVuY3Rpb24KKworc2V0am1wOgorCWFkZAkjKDkqNCksIHI0CisJc3RzLmwJcHIsIEAtcjQKKwltb3YubAlyMTUsIEAtcjQKKwltb3YubAlyMTQsIEAtcjQKKwltb3YubAlyMTMsIEAtcjQKKwltb3YubAlyMTIsIEAtcjQKKwltb3YubAlyMTEsIEAtcjQKKwltb3YubAlyMTAsIEAtcjQKKwltb3YubAlyOSwgQC1yNAorCW1vdi5sCXI4LCBALXI0CisJcnRzCisJIG1vdgkjMCwgcjAKKworCS5zaXplIHNldGptcCwuLXNldGptcAorCisJLmFsaWduIDIKKwkuZ2xvYmwgbG9uZ2ptcAorCS50eXBlIHNldGptcCwgI2Z1bmN0aW9uCisKK2xvbmdqbXA6CisJbW92LmwJQHI0KywgcjgKKwltb3YubAlAcjQrLCByOQorCW1vdi5sCUByNCssIHIxMAorCW1vdi5sCUByNCssIHIxMQorCW1vdi5sCUByNCssIHIxMgorCW1vdi5sCUByNCssIHIxMworCW1vdi5sCUByNCssIHIxNAorCW1vdi5sCUByNCssIHIxNQorCWxkcy5sCUByNCssIHByCisJbW92CXI1LCByMAorCXRzdAlyMCwgcjAKKwliZgkxZgorCW1vdgkjMSwgcjAJISBpbiBjYXNlIHZhbD09MAorMToJcnRzCisJIG5vcAorCisJLnNpemUgbG9uZ2ptcCwuLWxvbmdqbXAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NoL3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL3NoL3N5c2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY4NWNjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc2gvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBhcmNoL3NoL3N5c2NhbGwuUworICoKKyAqIE9uIHNoLCByMyBjb250YWlucyB0aGUgc3lzY2FsbCBudW1iZXIgKHNldCBieSBnZW5lcmF0ZWQgc3R1Yik7CisgKiByNC4ucjcgY29udGFpbiBhcmd1bWVudHMgMC0zIHBlciB0aGUgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uLAorICogYW5kIGFyZ3VtZW50cyA0LTUgYXJlIHBhc3NlZCBpbiByMCBhbmQgcjEuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyBpbiByMyByYXRoZXIgdGhhbiBzdGFuZGFyZCByMC4KKyAqLworCisJLnNlY3Rpb24gIi50ZXh0LnN5c2NhbGwiLCJheCIKKwkuYWxpZ24JMgorCS5nbG9ibAlfX3N5c2NhbGxfY29tbW9uCisJLnR5cGUJX19zeXNjYWxsX2NvbW1vbixAZnVuY3Rpb24KK19fc3lzY2FsbF9jb21tb246CisJbW92LmwJQCgwLHNwKSxyMAorCW1vdi5sCUAoNCxzcCkscjEKKwl0cmFwYQkjMHgxNQorCW1vdi5sCTFmLHIwCisJY21wL2hzCXIwLHIzCisJYnQvcwkzZgorCSAgbmVnCXIzLHI0CisJbW92LmwJMmYscjUKKwltb3YubAlyNCxAcjUKKwlydHMKKwkgIG1vdgkjLTEscjAKKzM6CisJcnRzCisJICBtb3YJcjMscjAKKworCS5hbGlnbiAyCisxOgkubG9uZwktNDA5NgkJLyogRXJybm8gbGltaXQgKi8KKzI6CS5sb25nCWVycm5vCisKKwkuc2l6ZQlfX3N5c2NhbGxfY29tbW9uLC4tX19zeXNjYWxsX2NvbW1vbgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc2gvc3lzc3R1Yi5waCBiL3Vzci9rbGliYy9hcmNoL3NoL3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmNDZkZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NoL3N5c3N0dWIucGgKQEAgLTAsMCArMSwzOCBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9zaC9zeXNzdHViLnBoCisjCisjIFNjcmlwdCB0byBnZW5lcmF0ZSBzeXN0ZW0gY2FsbCBzdHVicworIworCitzdWIgbWFrZV9zeXNzdHViKCQkJCQkQCkgeworICAgIG15KCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncykgPSBAXzsKKworICAgIG9wZW4oT1VULCAnPicsICIke291dHB1dGRpcn0vJHtmbmFtZX0uUyIpOworICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPGFzbS91bmlzdGQuaD5cbiI7CisgICAgcHJpbnQgT1VUICJcbiI7CisgICAgcHJpbnQgT1VUICJcdC5zZWN0aW9uXHRcIi50ZXh0LnN5c2NhbGxcIixcImF4XCJcbiI7CisgICAgcHJpbnQgT1VUICJcdC50eXBlXHQke2ZuYW1lfSxcI2Z1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmxcdCR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXHQuYWxpZ25cdDJcbiI7CisgICAgcHJpbnQgT1VUICJcdC5pbXBvcnQgX19zeXNjYWxsX2NvbW1vblxuIjsKKyAgICBwcmludCBPVVQgIiR7Zm5hbWV9OlxuIjsKKyAgICBwcmludCBPVVQgIlx0ICBtb3YubFx0MWYsIHIzXG4iOworICAgIHByaW50IE9VVCAiXHQgIGptcFx0XEByM1xuIjsKKyAgICBwcmludCBPVVQgIiNpZiBfX05SXyR7c25hbWV9ID49IDEyOFxuIjsKKyAgICBwcmludCBPVVQgIlx0ICBtb3YubFx0MmYsIHIzXG4iOworICAgIHByaW50IE9VVCAiI2Vsc2VcbiI7CisgICAgcHJpbnQgT1VUICJcdCAgbW92XHQjIF9fTlJfJHtzbmFtZX0sIHIzXG4iOworICAgIHByaW50IE9VVCAiI2VuZGlmXG4iOworICAgIHByaW50IE9VVCAiXHQuc2l6ZSAke2ZuYW1lfSwuLSR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQuYWxpZ25cdDJcbiI7CisgICAgcHJpbnQgT1VUICJcdC5pbXBvcnRcdF9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgT1VUICIxOlx0LmxvbmdcdF9fc3lzY2FsbF9jb21tb25cbiI7CisgICAgcHJpbnQgT1VUICIjaWYgX19OUl8ke3NuYW1lfSA+PSAxMjhcbiI7CisgICAgcHJpbnQgT1VUICIyOlx0LmxvbmdcdF9fTlJfJHtzbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICIjZW5kaWZcbiI7CisgICAgY2xvc2UoT1VUKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDEzZjVkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvS2J1aWxkCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMga2xpYmMgZmlsZXMgZm9yIHNwYXJjCisjCisKK2Fsd2F5cyAgOj0gY3J0MC5vCit0YXJnZXRzIDo9IGNydDAubworCittNC10YXJnZXRzIDo9IHNkaXYubyBzcmVtLm8gdWRpdi5vIHVyZW0ubworCitrbGliLXkgOj0gJChtNC10YXJnZXRzKSBzbXVsLm8gdW11bC5vIF9fbXVsZGkzLm8KK2tsaWIteSArPSBzZXRqbXAubyBwaXBlLm8gc3lzY2FsbC5vIHN5c2ZvcmsubworCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fYXNobGRpMy5vIC4uLy4uL2xpYmdjYy9fX2FzaHJkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX2xzaHJkaTMubyAuLi8uLi9saWJnY2MvX19kaXZkaTMubwora2xpYi15ICs9IC4uLy4uL2xpYmdjYy9fX21vZGRpMy5vICAuLi8uLi9saWJnY2MvX191ZGl2ZGkzLm8KK2tsaWIteSArPSAuLi8uLi9saWJnY2MvX191bW9kZGkzLm8gLi4vLi4vbGliZ2NjL19fdWRpdm1vZGRpNC5vCitrbGliLXkgKz0gLi4vLi4vbGliZ2NjL19fY2x6c2kyLm8KKworCiskKG9iaikvc2Rpdi5TOiBtNCA6PSBkZWZpbmUoTkFNRSxcYC5kaXYnKWRlZmluZShPUCxcYGRpdicpZGVmaW5lKFMsXGB0cnVlJykKKyQob2JqKS9zcmVtLlM6IG00IDo9IGRlZmluZShOQU1FLFxgLnJlbScpZGVmaW5lKE9QLFxgcmVtJylkZWZpbmUoUyxcYHRydWUnKQorJChvYmopL3VkaXYuUzogbTQgOj0gZGVmaW5lKE5BTUUsXGAudWRpdicpZGVmaW5lKE9QLFxgZGl2JylkZWZpbmUoUyxcYGZhbHNlJykKKyQob2JqKS91cmVtLlM6IG00IDo9IGRlZmluZShOQU1FLFxgLnVyZW0nKWRlZmluZShPUCxcYHJlbScpZGVmaW5lKFMsXGBmYWxzZScpCisKK3RhcmdldHMgKz0gJChtNC10YXJnZXRzKSAkKG00LXRhcmdldHM6Lm89LlMpCisKK3F1aWV0X2NtZF9tNCA9IE00ICAgICAgJEAKKyAgICAgIGNtZF9tNCA9IChlY2hvICIkKG00KSI7IGNhdCAkXikgfCBtNCA+ICRACisKKyMgYnVpbGQgLm8gZnJvbSAuUworJChhZGRwcmVmaXggJChvYmopLywkKG00LXRhcmdldHMpKTogJChvYmopLyUubyA6ICQob2JqKS8lLlMKKyMgYnVpbGQgLlMgZnJvbSAubTQKKyQoYWRkcHJlZml4ICQob2JqKS8sJChtNC10YXJnZXRzOi5vPS5TKSk6ICQoc3JjKS9kaXZyZW0ubTQKKwkkKGNhbGwgaWZfY2hhbmdlZCxtNCkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNWNlNjAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9NQ09ORklHCkBAIC0wLDAgKzEsMTkgQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBhcmNoL3NwYXJjL01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitLTElCQ09QVEZMQUdTCQkgKz0gLU9zIC1tMzIgLW1wdHIzMgorS0xJQkNCSVRTSVpFCQkgPSAzMgorS0xJQkNBUkNIUkVRRkxBR1MJKz0gLURfX3NwYXJjMzJfXworCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyBOb3JtYWwgYmluYXJpZXMgc3RhcnQgYXQgNjRLOyB0aGUgbGlua2VyIHdhbnRzIDY0SyBhbGlnbm1lbnQsCisjIGFuZCBjYWxsIGluc3RydWN0aW9ucyBoYXZlIGEgMzAtYml0IHNpZ25lZCBvZmZzZXQsIDw8IDIuCitLTElCQ1NIQVJFREZMQUdTCSA9IC1UdGV4dCAweDQwMDAwMTAwCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9fX211bGRpMy5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvX19tdWxkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM4NDhhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvX19tdWxkaTMuUwpAQCAtMCwwICsxLDI3IEBACisJLmdsb2JhbCAudW11bAorCS5zZWN0aW9uCSIudGV4dCIKKwkuYWxpZ24gNAorCS5nbG9iYWwgX19tdWxkaTMKKwkudHlwZQlfX211bGRpMywgI2Z1bmN0aW9uCisJLnByb2MJMDE3CitfX211bGRpMzoKKwlzYXZlCSVzcCwgLTEwNCwgJXNwCisJbW92CSVpMSwgJW8wCisJY2FsbAkudW11bCwgMAorCSBtb3YJJWkzLCAlbzEKKwltb3YJJW8wLCAlbDIKKwltb3YJJW8xLCAlbDMKKwltb3YJJWkxLCAlbzAKKwljYWxsCS51bXVsLCAwCisJIG1vdgklaTIsICVvMQorCW1vdgklaTAsICVvMQorCW1vdgklbzAsICVsMAorCWNhbGwJLnVtdWwsIDAKKwkgbW92CSVpMywgJW8wCisJbW92CTAsICVsMQorCWFkZAklbDAsICVvMCwgJWwwCisJYWRkY2MJJWwzLCAlbDEsICVpMQorCWFkZHgJJWwyLCAlbDAsICVpMAorCWptcAklaTcrOAorCSByZXN0b3JlCisJLnNpemUJX19tdWxkaTMsIC4tX19tdWxkaTMKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2RiMTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvY3J0MC5TCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBUQVJHRVRfUFRSX1NJWkUJMzIKKyNpbmNsdWRlICJjcnQwaS5TIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmMvY3J0MGkuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL2NydDBpLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyMGIwMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL2NydDBpLlMKQEAgLTAsMCArMSwxMDAgQEAKKyEgVGhpcyBmaWxlIGRlcml2ZWQgZnJvbSB0aGUgZXF1aXZhbGVudCBpbiBuZXdsaWIKKyEKKyEgQyBydW4gdGltZSBzdGFydCBvZmYKKworISBUaGlzIGZpbGUgc3VwcG9ydHM6CishCishIC0gYm90aCAzMmJpdCBwb2ludGVyIGFuZCA2NGJpdCBwb2ludGVyIGVudmlyb25tZW50cyAoYXQgY29tcGlsZSB0aW1lKQorISAtIGFuIGltcG9zZWQgc3RhY2sgYmlhcyAob2YgMjA0NykgKGF0IHJ1biB0aW1lKQorISAtIG1lZGl1bS9sb3cgYW5kIG1lZGl1bS9hbnl3aGVyZSBjb2RlIG1vZGVscyAoYXQgcnVuIHRpbWUpCisKKyEgSW5pdGlhbCBzdGFjayBzZXR1cDoKKyEKKyEgICAgYm90dG9tIG9mIHN0YWNrIChoaWdoZXIgbWVtb3J5IGFkZHJlc3MpCishIAkuLi4KKyEJdGV4dCBvZiBlbnZpcm9ubWVudCBzdHJpbmdzCishCXRleHQgb2YgYXJndW1lbnQgc3RyaW5ncworIQllbnZwW2VudmNdID0gMCAoNC84IGJ5dGVzKQorIQkuLi4KKyEJZW52WzBdICg0LzggYnl0ZXMpCishCWFyZ3ZbYXJnY10gPSAwICg0LzggYnl0ZXMpCishCS4uLgorIQlhcmd2WzBdICg0LzggYnl0ZXMpCishCWFyZ2MgKDQvOCBieXRlcykKKyEJcmVnaXN0ZXIgc2F2ZSBhcmVhICg2NCBiaXRzIGJ5IDE2IHJlZ2lzdGVycyA9IDEyOCBieXRlcykKKyEJdG9wIG9mIHN0YWNrICglc3ApCisKKyEgU3RhY2sgQmlhczoKKyEKKyEgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBvL3MgdG8gc2V0IHRoaXMgdXAuCishIFdlIGhhbmRsZSBib3RoIGEgMCBhbmQgMjA0NyB2YWx1ZSBmb3IgdGhlIHN0YWNrIGJpYXMuCisKKyEgTWVkaXVtL0FueXdoZXJlIGNvZGUgbW9kZWwgc3VwcG9ydDoKKyEKKyEgSW4gdGhpcyBtb2RlbCAlZzQgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LgorISBUaGUgdGV4dCBzZWdtZW50IGNhbiBnbyBhbnl3aGVyZSwgYnV0ICVnNCBwb2ludHMgdG8gdGhlICpkYXRhKiBzZWdtZW50LgorISBJdCBpcyB1cCB0byB0aGUgY29tcGlsZXIvbGlua2VyIHRvIGdldCB0aGlzIHJpZ2h0LgorIQorISBTaW5jZSB0aGlzIG1vZGVsIGlzIHN0YXRpY2FsbHkgbGlua2VkIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50CishIGlzIGtub3duIGF0IGxpbmsgdGltZS4gIEVnOgorIQorIQlzZXRoaQklaGgoZGF0YV9zdGFydCksICVnMQorIQlzZXRoaQklbG0oZGF0YV9zdGFydCksICVnNAorIQlvcgklZzEsICVobShkYXRhX3N0YXJ0KSwgJWcxCishCW9yCSVnNCwgJWxvKGRhdGFfc3RhcnQpLCAlZzQKKyEJc2xseAklZzEsIDMyLCAlZzEKKyEJb3IJJWc0LCAlZzEsICVnNAorIQorISBGSVhNRTogRm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSAwLgorCishIEZJWE1FOiBpZiAlZzEgY29udGFpbnMgYSBub24temVybyB2YWx1ZSwgYXRleGl0KCkgc2hvdWxkIGJlIGludm9rZWQKKyEgd2l0aCB0aGlzIHZhbHVlLgorCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIF9zdGFydAorCS50eXBlIF9zdGFydCwgQGZ1bmN0aW9uCitfc3RhcnQ6CisJY2xyCSVmcAorCishIFdlIHVzZSAlZzQgZXZlbiBpZiB0aGUgY29kZSBtb2RlbCBpcyBNZWRpdW0vTG93IChzaW1wbGlmaWVzIHRoZSBjb2RlKS4KKworCWNscgklZzQJCQkhIE1lZGl1bS9Bbnl3aGVyZSBiYXNlIHJlZworCishIElmIHRoZXJlIGlzIGEgc3RhY2sgYmlhcyBpbiBlZmZlY3QsIGFjY291bnQgZm9yIGl0IGluICVnNS4gIFRoZW4gYWx3YXlzCishIGFkZCAlZzUgdG8gc3RhY2sgcmVmZXJlbmNlcyBiZWxvdy4gIFRoaXMgd2F5IHRoZSBjb2RlIGNhbiBiZSB1c2VkIHdpdGgKKyEgb3Igd2l0aG91dCBhbiBpbXBvc2VkIGJpYXMuCisKKwlhbmRjYwklc3AsIDEsICVnNQorCWJ6LGEgLkxOb0JpYXMKKwkgbm9wCisJbW92CTIwNDcsICVnNQorLkxOb0JpYXM6CisJYWRkCSVzcCwgJWc1LCAlZzUKKworISBPbiBlbnRyeSwgdGhlIGtlcm5lbCBsZWF2ZXMgcm9vbSBmb3Igb25lIHJlZ2lzdGVyIGZyYW1lLCBidXQKKyEgdGhlIEMgQVBJIHdhbnRzIG1vcmUgZnJlZSBzcGFjZS4gIFRodXMsIHdlIG5lZWQgdG8gZHJvcCB0aGUgc3RhY2sKKyEgcG9pbnRlciBhZGRpdGlvbmFsbHkuCisKKyNpZiBUQVJHRVRfUFRSX1NJWkUgPT0gMzIKKwlzdWIJJXNwLCAzMiwgJXNwCQkhIG1ha2Ugcm9vbSBmb3IgaW5jb21pbmcgYXJndW1lbnRzCisjZWxzZSAvKiBUQVJHRVRfUFRSX1NJWkUgPT0gNjQgKi8KKwlzdWIJJXNwLCA2NCwgJXNwCQkhIG1ha2Ugcm9vbSBmb3IgaW5jb21pbmcgYXJndW1lbnRzCisjZW5kaWYKKworISBTZXQgdXAgcG9pbnRlcnMgdG8gdGhlIEVMRiBkYXRhIHN0cnVjdHVyZSAoYXJnYywgYXJndiwgLi4uKQorISBQYXNzIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBfX2xpYmNfaW5pdAorI2lmIFRBUkdFVF9QVFJfU0laRSA9PSAzMgorCWFkZAklZzUsIDB4NDAsICVvMAorI2Vsc2UgLyogVEFSR0VUX1BUUl9TSVpFID09IDY0ICovCisJYWRkCSVnNSwgMHg4MCwgJW8wCisjZW5kaWYKKworCWNhbGwJX19saWJjX2luaXQKKwkgbW92CSVnMSwgJW8xCSEgVGhpcyBpcyB0aGUgImF0ZXhpdCIgcG9pbnRlcjsKKwkJCQkhIHBhc3MgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBfX2xpYmNfaW5pdAorCishIElmIF9fbGliY19pbml0IHJldHVybnMsIHNvbWV0aGluZyBpcyBob3NlZC4gIFRyeSBhbiBpbGxlZ2FsIGluc24uCishIElmIHRoYXQgZG9lcyBub3Qgd29yaywgdGhlIG8vcyBpcyBob3NlZCBtb3JlIHRoYW4gd2UgYXJlLgorCS5sb25nIDAKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL2RpdnJlbS5tNCBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL2RpdnJlbS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQxNzFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvZGl2cmVtLm00CkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMgRW5naW5lZXJpbmcgZ3JvdXAKKyAqIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgdW5kZXIgREFSUEEgY29udHJhY3QgQkcgOTEtNjYgYW5kCisgKiBjb250cmlidXRlZCB0byBCZXJrZWxleS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIGZyb206IEhlYWRlcjogZGl2cmVtLm00LHYgMS40IDkyLzA2LzI1IDEzOjIzOjU3IHRvcmVrIEV4cAorICogJE5ldEJTRDogZGl2cmVtLm00LHYgMS40IDE5OTcvMTAvMDkgMTA6MDc6NTQgbHVrZW0gRXhwICQKKyAqLworCisvKgorICogRGl2aXNpb24gYW5kIHJlbWFpbmRlciwgZnJvbSBBcHBlbmRpeCBFIG9mIHRoZSBTcGFyYyBWZXJzaW9uIDgKKyAqIEFyY2hpdGVjdHVyZSBNYW51YWwsIHdpdGggZml4ZXMgZnJvbSBHb3Jkb24gSXJsYW0uCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorCS5hc2NpeiAiQCgjKWRpdnJlbS5tNAk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiCisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisvKgorICogSW5wdXQ6IGRpdmlkZW5kIGFuZCBkaXZpc29yIGluICVvMCBhbmQgJW8xIHJlc3BlY3RpdmVseS4KKyAqCisgKiBtNCBwYXJhbWV0ZXJzOgorICogIE5BTUUJbmFtZSBvZiBmdW5jdGlvbiB0byBnZW5lcmF0ZQorICogIE9QCQlPUD1kaXYgPT4gJW8wIC8gJW8xOyBPUD1yZW0gPT4gJW8wICUgJW8xCisgKiAgUwkJUz10cnVlID0+IHNpZ25lZDsgUz1mYWxzZSA9PiB1bnNpZ25lZAorICoKKyAqIEFsZ29yaXRobSBwYXJhbWV0ZXJzOgorICogIE4JCWhvdyBtYW55IGJpdHMgcGVyIGl0ZXJhdGlvbiB3ZSB0cnkgdG8gZ2V0ICg0KQorICogIFdPUkRTSVpFCXRvdGFsIG51bWJlciBvZiBiaXRzICgzMikKKyAqCisgKiBEZXJpdmVkIGNvbnN0YW50czoKKyAqICBUV09TVVBOCTJeTiwgZm9yIGxhYmVsIGdlbmVyYXRpb24gKG00IGV4cG9uZW50aWF0aW9uIGN1cnJlbnRseSBicm9rZW4pCisgKiAgVE9QQklUUwludW1iZXIgb2YgYml0cyBpbiB0aGUgdG9wIGBkZWNhZGUnIG9mIGEgbnVtYmVyCisgKgorICogSW1wb3J0YW50IHZhcmlhYmxlczoKKyAqICBRCQl0aGUgcGFydGlhbCBxdW90aWVudCB1bmRlciBkZXZlbG9wbWVudCAoaW5pdGlhbGx5IDApCisgKiAgUgkJdGhlIHJlbWFpbmRlciBzbyBmYXIsIGluaXRpYWxseSB0aGUgZGl2aWRlbmQKKyAqICBJVEVSCW51bWJlciBvZiBtYWluIGRpdmlzaW9uIGxvb3AgaXRlcmF0aW9ucyByZXF1aXJlZDsKKyAqCQllcXVhbCB0byBjZWlsKGxvZzIocXVvdGllbnQpIC8gTikuICBOb3RlIHRoYXQgdGhpcworICoJCWlzIHRoZSBsb2cgYmFzZSAoMl5OKSBvZiB0aGUgcXVvdGllbnQuCisgKiAgVgkJdGhlIGN1cnJlbnQgY29tcGFyYW5kLCBpbml0aWFsbHkgZGl2aXNvcioyXihJVEVSKk4tMSkKKyAqCisgKiBDb3N0OgorICogIEN1cnJlbnQgZXN0aW1hdGUgZm9yIG5vbi1sYXJnZSBkaXZpZGVuZCBpcworICoJY2VpbChsb2cyKHF1b3RpZW50KSAvIE4pICogKDEwICsgN04vMikgKyBDCisgKiAgQSBsYXJnZSBkaXZpZGVuZCBpcyBvbmUgZ3JlYXRlciB0aGFuIDJeKDMxLVRPUEJJVFMpIGFuZCB0YWtlcyBhCisgKiAgZGlmZmVyZW50IHBhdGgsIGFzIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBxdW90aWVudCBtdXN0IGJlIGRldmVsb3BlZAorICogIG9uZSBiaXQgYXQgYSB0aW1lLgorICovCisKK2RlZmluZShOLCBgNCcpCitkZWZpbmUoVFdPU1VQTiwgYDE2JykKK2RlZmluZShXT1JEU0laRSwgYDMyJykKK2RlZmluZShUT1BCSVRTLCBldmFsKFdPUkRTSVpFIC0gTiooKFdPUkRTSVpFLTEpL04pKSkKKworZGVmaW5lKGRpdmlkZW5kLCBgJW8wJykKK2RlZmluZShkaXZpc29yLCBgJW8xJykKK2RlZmluZShRLCBgJW8yJykKK2RlZmluZShSLCBgJW8zJykKK2RlZmluZShJVEVSLCBgJW80JykKK2RlZmluZShWLCBgJW81JykKKworLyogbTQgcmVtaW5kZXI6IGlmZWxzZShhLGIsYyxkKSA9PiBpZiBhIGlzIGIsIHRoZW4gYywgZWxzZSBkICovCitkZWZpbmUoVCwgYCVnMScpCitkZWZpbmUoU0MsIGAlZzcnKQoraWZlbHNlKFMsIGB0cnVlJywgYGRlZmluZShTSUdOLCBgJWc2JyknKQorCisvKgorICogVGhpcyBpcyB0aGUgcmVjdXJzaXZlIGRlZmluaXRpb24gZm9yIGRldmVsb3BpbmcgcXVvdGllbnQgZGlnaXRzLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAgJDEJdGhlIGN1cnJlbnQgZGVwdGgsIDEgPD0gJDEgPD0gTgorICogICQyCXRoZSBjdXJyZW50IGFjY3VtdWxhdGlvbiBvZiBxdW90aWVudCBiaXRzCisgKiAgTgltYXggZGVwdGgKKyAqCisgKiBXZSBhZGQgYSBuZXcgYml0IHRvICQyIGFuZCBlaXRoZXIgcmVjdXJzZSBvciBpbnNlcnQgdGhlIGJpdHMgaW4KKyAqIHRoZSBxdW90aWVudC4gIFIsIFEsIGFuZCBWIGFyZSBpbnB1dHMgYW5kIG91dHB1dHMgYXMgZGVmaW5lZCBhYm92ZTsKKyAqIHRoZSBjb25kaXRpb24gY29kZXMgYXJlIGV4cGVjdGVkIHRvIHJlZmxlY3QgdGhlIGlucHV0IFIsIGFuZCBhcmUKKyAqIG1vZGlmaWVkIHRvIHJlZmxlY3QgdGhlIG91dHB1dCBSLgorICovCitkZWZpbmUoREVWRUxPUF9RVU9USUVOVF9CSVRTLAorYAkhIGRlcHRoICQxLCBhY2N1bXVsYXRlZCBiaXRzICQyCisJYmwJTC4kMS5ldmFsKFRXT1NVUE4rJDIpCisJc3JsCVYsMSxWCisJISByZW1haW5kZXIgaXMgcG9zaXRpdmUKKwlzdWJjYwlSLFYsUgorCWlmZWxzZSgkMSwgTiwKKwlgCWIJOWYKKwkJYWRkCVEsICgkMioyKzEpLCBRCisJJywgYAlERVZFTE9QX1FVT1RJRU5UX0JJVFMoaW5jcigkMSksIGBldmFsKDIqJDIrMSknKScpCitMLiQxLmV2YWwoVFdPU1VQTiskMik6CisJISByZW1haW5kZXIgaXMgbmVnYXRpdmUKKwlhZGRjYwlSLFYsUgorCWlmZWxzZSgkMSwgTiwKKwlgCWIJOWYKKwkJYWRkCVEsICgkMioyLTEpLCBRCisJJywgYAlERVZFTE9QX1FVT1RJRU5UX0JJVFMoaW5jcigkMSksIGBldmFsKDIqJDItMSknKScpCisJaWZlbHNlKCQxLCAxLCBgOTonKScpCisKKyNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvdHJhcC5oPgorCitGVU5DKE5BTUUpCitpZmVsc2UoUywgYHRydWUnLAorYAkhIGNvbXB1dGUgc2lnbiBvZiByZXN1bHQ7IGlmIG5laXRoZXIgaXMgbmVnYXRpdmUsIG5vIHByb2JsZW0KKwlvcmNjCWRpdmlzb3IsIGRpdmlkZW5kLCAlZzAJISBlaXRoZXIgbmVnYXRpdmU/CisJYmdlCTJmCQkJISBubywgZ28gZG8gdGhlIGRpdmlkZQorCWlmZWxzZShPUCwgYGRpdicsCisJCWB4b3IJZGl2aXNvciwgZGl2aWRlbmQsIFNJR04nLAorCQlgbW92CWRpdmlkZW5kLCBTSUdOJykJISBjb21wdXRlIHNpZ24gaW4gYW55IGNhc2UKKwl0c3QJZGl2aXNvcgorCWJnZQkxZgorCXRzdAlkaXZpZGVuZAorCSEgZGl2aXNvciBpcyBkZWZpbml0ZWx5IG5lZ2F0aXZlOyBkaXZpZGVuZCBtaWdodCBhbHNvIGJlIG5lZ2F0aXZlCisJYmdlCTJmCQkJISBpZiBkaXZpZGVuZCBub3QgbmVnYXRpdmUuLi4KKwluZWcJZGl2aXNvcgkJCSEgaW4gYW55IGNhc2UsIG1ha2UgZGl2aXNvciBub25uZWcKKzE6CSEgZGl2aWRlbmQgaXMgbmVnYXRpdmUsIGRpdmlzb3IgaXMgbm9ubmVnYXRpdmUKKwluZWcJZGl2aWRlbmQJCSEgbWFrZSBkaXZpZGVuZCBub25uZWdhdGl2ZQorMjoKKycpCisJISBSZWFkeSB0byBkaXZpZGUuICBDb21wdXRlIHNpemUgb2YgcXVvdGllbnQ7IHNjYWxlIGNvbXBhcmFuZC4KKwlvcmNjCWRpdmlzb3IsICVnMCwgVgorCWJuegkxZgorCW1vdglkaXZpZGVuZCwgUgorCisJCSEgRGl2aWRlIGJ5IHplcm8gdHJhcC4gIElmIGl0IHJldHVybnMsIHJldHVybiAwIChhYm91dCBhcworCQkhIHdyb25nIGFzIHBvc3NpYmxlLCBidXQgdGhhdCBpcyB3aGF0IFN1bk9TIGRvZXMuLi4pLgorCQl0CVNUX0RJVjAKKwkJcmV0bAorCQljbHIJJW8wCisKKzE6CisJY21wCVIsIFYJCQkhIGlmIGRpdmlzb3IgZXhjZWVkcyBkaXZpZGVuZCwgZG9uZQorCWJsdQlMZ290X3Jlc3VsdAkJISAoYW5kIGFsZ29yaXRobSBmYWlscyBvdGhlcndpc2UpCisJY2xyCVEKKwlzZXRoaQklaGkoMSA8PCAoV09SRFNJWkUgLSBUT1BCSVRTIC0gMSkpLCBUCisJY21wCVIsIFQKKwlibHUJTG5vdF9yZWFsbHlfYmlnCisJY2xyCUlURVIKKworCSEgYEhlcmUgdGhlIGRpdmlkZW5kIGlzID49IDJeKDMxLU4pIG9yIHNvLiAgV2UgbXVzdCBiZSBjYXJlZnVsIGhlcmUsCisJISBhcyBvdXIgdXN1YWwgTi1hdC1hLXNob3QgZGl2aWRlIHN0ZXAgd2lsbCBjYXVzZSBvdmVyZmxvdyBhbmQgaGF2b2MuCisJISBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHJlc3VsdCBoZXJlIGlzIE4qSVRFUitTQywgd2hlcmUgU0MgPD0gTi4KKwkhIENvbXB1dGUgSVRFUiBpbiBhbiB1bm9ydGhvZG94IG1hbm5lcjoga25vdyB3ZSBuZWVkIHRvIHNoaWZ0IFYgaW50bworCSEgdGhlIHRvcCBkZWNhZGU6IHNvIGRvIG5vdCBldmVuIGJvdGhlciB0byBjb21wYXJlIHRvIFIuJworCTE6CisJCWNtcAlWLCBUCisJCWJnZXUJM2YKKwkJbW92CTEsIFNDCisJCXNsbAlWLCBOLCBWCisJCWIJMWIKKwkJaW5jCUlURVIKKworCSEgTm93IGNvbXB1dGUgU0MuCisJMjoJYWRkY2MJViwgViwgVgorCQliY2MJTG5vdF90b29fYmlnCisJCWluYwlTQworCisJCSEgV2UgZ2V0IGhlcmUgaWYgdGhlIGRpdmlzb3Igb3ZlcmZsb3dlZCB3aGlsZSBzaGlmdGluZy4KKwkJISBUaGlzIG1lYW5zIHRoYXQgUiBoYXMgdGhlIGhpZ2gtb3JkZXIgYml0IHNldC4KKwkJISBSZXN0b3JlIFYgYW5kIHN1YnRyYWN0IGZyb20gUi4KKwkJc2xsCVQsIFRPUEJJVFMsIFQJISBoaWdoIG9yZGVyIGJpdAorCQlzcmwJViwgMSwgVgkJISByZXN0IG9mIFYKKwkJYWRkCVYsIFQsIFYKKwkJYglMZG9fc2luZ2xlX2RpdgorCQlkZWMJU0MKKworCUxub3RfdG9vX2JpZzoKKwkzOgljbXAJViwgUgorCQlibHUJMmIKKwkJbm9wCisJCWJlCUxkb19zaW5nbGVfZGl2CisJCW5vcAorCS8qIE5COiB0aGVzZSBhcmUgY29tbWVudGVkIG91dCBpbiB0aGUgVjgtU3BhcmMgbWFudWFsIGFzIHdlbGwgKi8KKwkvKiAoSSBkbyBub3QgdW5kZXJzdGFuZCB0aGlzKSAqLworCSEgViA+IFI6IHdlbnQgdG9vIGZhcjogYmFjayB1cCAxIHN0ZXAKKwkhCXNybAlWLCAxLCBWCisJIQlkZWMJU0MKKwkhIGRvIHNpbmdsZS1iaXQgZGl2aWRlIHN0ZXBzCisJIQorCSEgV2UgaGF2ZSB0byBiZSBjYXJlZnVsIGhlcmUuICBXZSBrbm93IHRoYXQgUiA+PSBWLCBzbyB3ZSBjYW4gZG8gdGhlCisJISBmaXJzdCBkaXZpZGUgc3RlcCB3aXRob3V0IHRoaW5raW5nLiAgQlVULCB0aGUgb3RoZXJzIGFyZSBjb25kaXRpb25hbCwKKwkhIGFuZCBhcmUgb25seSBkb25lIGlmIFIgPj0gMC4gIEJlY2F1c2UgYm90aCBSIGFuZCBWIG1heSBoYXZlIHRoZSBoaWdoLQorCSEgb3JkZXIgYml0IHNldCBpbiB0aGUgZmlyc3Qgc3RlcCwganVzdCBmYWxsaW5nIGludG8gdGhlIHJlZ3VsYXIKKwkhIGRpdmlzaW9uIGxvb3Agd2lsbCBtZXNzIHVwIHRoZSBmaXJzdCB0aW1lIGFyb3VuZC4KKwkhIFNvIHdlIHVucm9sbCBzbGlnaHRseS4uLgorCUxkb19zaW5nbGVfZGl2OgorCQlkZWNjYwlTQworCQlibAlMZW5kX3JlZ3VsYXJfZGl2aWRlCisJCW5vcAorCQlzdWIJUiwgViwgUgorCQltb3YJMSwgUQorCQliCUxlbmRfc2luZ2xlX2Rpdmxvb3AKKwkJbm9wCisJTHNpbmdsZV9kaXZsb29wOgorCQlzbGwJUSwgMSwgUQorCQlibAkxZgorCQlzcmwJViwgMSwgVgorCQkhIFIgPj0gMAorCQlzdWIJUiwgViwgUgorCQliCTJmCisJCWluYwlRCisJMToJISBSIDwgMAorCQlhZGQJUiwgViwgUgorCQlkZWMJUQorCTI6CisJTGVuZF9zaW5nbGVfZGl2bG9vcDoKKwkJZGVjY2MJU0MKKwkJYmdlCUxzaW5nbGVfZGl2bG9vcAorCQl0c3QJUgorCQliLGEJTGVuZF9yZWd1bGFyX2RpdmlkZQorCitMbm90X3JlYWxseV9iaWc6CisxOgorCXNsbAlWLCBOLCBWCisJY21wCVYsIFIKKwlibGV1CTFiCisJaW5jY2MJSVRFUgorCWJlCUxnb3RfcmVzdWx0CisJZGVjCUlURVIKKworCXRzdAlSCSEgc2V0IHVwIGZvciBpbml0aWFsIGl0ZXJhdGlvbgorTGRpdmxvb3A6CisJc2xsCVEsIE4sIFEKKwlERVZFTE9QX1FVT1RJRU5UX0JJVFMoMSwgMCkKK0xlbmRfcmVndWxhcl9kaXZpZGU6CisJZGVjY2MJSVRFUgorCWJnZQlMZGl2bG9vcAorCXRzdAlSCisJYmwsYQlMZ290X3Jlc3VsdAorCSEgbm9uLXJlc3RvcmluZyBmaXh1cCBoZXJlIChvbmUgaW5zdHJ1Y3Rpb24gb25seSEpCitpZmVsc2UoT1AsIGBkaXYnLAorYAlkZWMJUQorJywgYAlhZGQJUiwgZGl2aXNvciwgUgorJykKKworTGdvdF9yZXN1bHQ6CitpZmVsc2UoUywgYHRydWUnLAorYAkhIGNoZWNrIHRvIHNlZSBpZiBhbnN3ZXIgc2hvdWxkIGJlIDwgMAorCXRzdAlTSUdOCisJYmwsYQkxZgorCWlmZWxzZShPUCwgYGRpdicsIGBuZWcgUScsIGBuZWcgUicpCisxOicpCisJcmV0bAorCWlmZWxzZShPUCwgYGRpdicsIGBtb3YgUSwgJW8wJywgYG1vdiBSLCAlbzAnKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmMvcGlwZS5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvcGlwZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YWJmM2MKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9waXBlLlMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGFyY2gvc3BhcmMvcGlwZS5TCisgKgorICogVGhlIHBpcGUgc3lzdGVtIGNhbGwgYXJlIHNwZWNpYWwgb24gc3BhcmNbNjRdOgorICogdGhleSByZXR1cm4gdGhlIHR3byBmaWxlIGRlc2NyaXB0b3JzIGluICVvMCBhbmQgJW8xLgorICovCisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKwkuZ2xvYmwJcGlwZQorCS50eXBlCXBpcGUsI2Z1bmN0aW9uCisgICAgICAgCS5hbGlnbgk0CitwaXBlOgorCW1vdglfX05SX3BpcGUsICVnMQorCW9yCSVvMCwgMCwgJWc0CisJdAkweDEwCisJYmNjCTFmCisJICBub3AKKwlzZXRoaQklaGkoZXJybm8pLCAlZzQKKwlvcgklZzQsICVsbyhlcnJubyksICVnNAorCXN0CSVvMCxbJWc0XQorCXJldGwKKwkgIG1vdgktMSwgJW8wCisxOgorCXN0CSVvMCxbJWc0XQorCXN0CSVvMSxbJWc0KzRdCisJcmV0bAorCSAgbW92CTAsICVvMAorCisJLnNpemUgcGlwZSwuLXBpcGUKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc2V0am1wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZWE3OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3NldGptcC5TCkBAIC0wLDAgKzEsMzggQEAKKyEKKyEgc2V0am1wLlMKKyEKKyEgQmFzaWMgc2V0am1wL2xvbmdqbXAKKyEKKyEgVGhpcyBjb2RlIHdhcyBiYXNlZCBvbiB0aGUgZXF1aXZhbGVudCBjb2RlIGluIE5ldEJTRAorIQorCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RyYXAuaD4KKworIQorISBUaGUgam1wX2J1ZiBjb250YWlucyB0aGUgZm9sbG93aW5nIGVudHJpZXM6CishICAgc3AKKyEgICBmcAorISAgIHBjCishCitFTlRSWShzZXRqbXApCisJc3QJJXNwLFslbzArMF0JISBDYWxsZXJzIHN0YWNrIHBvaW50ZXIKKwlzdAklbzcsWyVvMCs0XQkhIFJldHVybiBwYworCXN0CSVmcCxbJW8wKzhdCSEgRnJhbWUgcG9pbnRlcgorCXJldGwJCQkhIFJldHVybgorCSBjbHIJJW8wCQkhICAuLi4wCisKK0VOVFJZKGxvbmdqbXApCisJc3ViCSVzcCwgNjQsICVzcAkhIHNldCB1cCBhIGxvY2FsIHN0YWNrIGZyYW1lCiswOgorCXQJU1RfRkxVU0hXSU4JISBmbHVzaCByZWdpc3RlciB3aW5kb3dzIG91dCB0byBtZW1vcnkKKwkhCisJISBXZSByZXN0b3JlIHRoZSBzYXZlZCBzdGFjayBwb2ludGVyIHRvICVmcCwgdGhlbiBpc3N1ZQorCSEgYSByZXN0b3JlIGluc3RydWN0aW9uIHdoaWNoIHdpbGwgcmVsb2FkIHRoZSByZWdpc3RlcgorCSEgd2luZG93IGZyb20gdGhlIHN0YWNrLgorCSEKKyAgICAgICAgbGQgICAgICBbJW8wKzRdLCAlbzcgICAgLyogcmVzdG9yZSByZXR1cm4gcGMgKi8KKyAgICAgICAgbGQgICAgICBbJW8wKzBdLCAlZnAgICAgLyogYW5kIHN0YWNrIHBvaW50ZXIgKi8KKworICAgICAgICByZXRsICAgICAgICAgICAgICAgICAgICAhIHN1Y2Nlc3MsIHJldHVybiAlZzYKKyAgICAgICAgIHJlc3RvcmUgICAgICAgICVvMSwgMCwgJW8wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9zbXVsLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9zbXVsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0ZmY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3NtdWwuUwpAQCAtMCwwICsxLDE2MCBAQAorLyoJJE5ldEJTRDogbXVsLlMsdiAxLjMgMTk5Ny8wNy8xNiAxNDozNzo0MiBjaHJpc3RvcyBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMgRW5naW5lZXJpbmcgZ3JvdXAKKyAqIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgdW5kZXIgREFSUEEgY29udHJhY3QgQkcgOTEtNjYgYW5kCisgKiBjb250cmlidXRlZCB0byBCZXJrZWxleS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIGZyb206IEhlYWRlcjogbXVsLnMsdiAxLjUgOTIvMDYvMjUgMTM6MjQ6MDMgdG9yZWsgRXhwCisgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCisjaWYgMAorCS5hc2NpeiAiQCgjKW11bC5zCTguMSAoQmVya2VsZXkpIDYvNC85MyIKKyNlbHNlCisJUkNTSUQoIiROZXRCU0Q6IG11bC5TLHYgMS4zIDE5OTcvMDcvMTYgMTQ6Mzc6NDIgY2hyaXN0b3MgRXhwICQiKQorI2VuZGlmCisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisvKgorICogU2lnbmVkIG11bHRpcGx5LCBmcm9tIEFwcGVuZGl4IEUgb2YgdGhlIFNwYXJjIFZlcnNpb24gOAorICogQXJjaGl0ZWN0dXJlIE1hbnVhbC4KKyAqCisgKiBSZXR1cm5zICVvMCAqICVvMSBpbiAlbzElbzAgKGkuZS4sICVvMSBob2xkcyB0aGUgdXBwZXIgMzIgYml0cyBvZgorICogdGhlIDY0LWJpdCBwcm9kdWN0KS4KKyAqCisgKiBUaGlzIGNvZGUgb3B0aW1pemVzIHNob3J0IChsZXNzIHRoYW4gMTMtYml0KSBtdWx0aXBsaWVzLgorICovCisKK0ZVTkMoLm11bCkKKwltb3YJJW8wLCAleQkJISBtdWx0aXBsaWVyIC0+IFkKKwlhbmRuY2MJJW8wLCAweGZmZiwgJWcwCSEgdGVzdCBiaXRzIDEyLi4zMQorCWJlCUxtdWxfc2hvcnR3YXkJISBpZiB6ZXJvLCBjYW4gZG8gaXQgdGhlIHNob3J0IHdheQorCWFuZGNjCSVnMCwgJWcwLCAlbzQJISB6ZXJvIHRoZSBwYXJ0aWFsIHByb2R1Y3QgYW5kIGNsZWFyIE4gYW5kIFYKKworCS8qCisJICogTG9uZyBtdWx0aXBseS4gIDMyIHN0ZXBzLCBmb2xsb3dlZCBieSBhIGZpbmFsIHNoaWZ0IHN0ZXAuCisJICovCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAzCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA0CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA1CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA2CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA3CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA4CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA5CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEyCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTQKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE1CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxNgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTcKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE4CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxOQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjAKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIxCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyMgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjMKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI0CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyNQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjYKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI3CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyOAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjkKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDMwCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAzMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMzIKKwltdWxzY2MJJW80LCAlZzAsICVvNAkhIGZpbmFsIHNoaWZ0CisKKwkhIElmICVvMCB3YXMgbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMKKwkhCSglbzAgKiAlbzEpICsgKCVvMSA8PCAzMikpCisJISBXZSBmaXggdGhhdCBoZXJlLgorCisJdHN0CSVvMAorCWJnZQkxZgorCXJkCSV5LCAlbzAKKworCSEgJW8wIHdhcyBpbmRlZWQgbmVnYXRpdmU7IGZpeCB1cHBlciAzMiBiaXRzIG9mIHJlc3VsdCBieSBzdWJ0cmFjdGluZworCSEgJW8xIChpLmUuLCByZXR1cm4gJW80IC0gJW8xIGluICVvMSkuCisJcmV0bAorCXN1YgklbzQsICVvMSwgJW8xCisKKzE6CisJcmV0bAorCW1vdgklbzQsICVvMQorCitMbXVsX3Nob3J0d2F5OgorCS8qCisJICogU2hvcnQgbXVsdGlwbHkuICAxMiBzdGVwcywgZm9sbG93ZWQgYnkgYSBmaW5hbCBzaGlmdCBzdGVwLgorCSAqIFRoZSByZXN1bHRpbmcgYml0cyBhcmUgb2ZmIGJ5IDEyIGFuZCAoMzItMTIpID0gMjAgYml0IHBvc2l0aW9ucywKKwkgKiBidXQgdGhlcmUgaXMgbm8gcHJvYmxlbSB3aXRoICVvMCBiZWluZyBuZWdhdGl2ZSAodW5saWtlIGFib3ZlKS4KKwkgKi8KKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDMKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDQKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDUKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDYKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDcKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDgKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDkKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEwCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTIKKwltdWxzY2MJJW80LCAlZzAsICVvNAkhIGZpbmFsIHNoaWZ0CisKKwkvKgorCSAqICAlbzQgaGFzIDIwIG9mIHRoZSBiaXRzIHRoYXQgc2hvdWxkIGJlIGluIHRoZSBsb3cgcGFydCBvZiB0aGUKKwkgKiByZXN1bHQ7ICV5IGhhcyB0aGUgYm90dG9tIDEyIChhcyAleSdzIHRvcCAxMikuICBUaGF0IGlzOgorCSAqCisJICoJICAlbzQJCSAgICAleQorCSAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisJICogfCAtMTItIHwgICAtMjAtICB8IC0xMi0gfCAgIC0yMC0gIHwKKwkgKiArLS0tLS0tKC0tLS0tLS0tLSstLS0tLS0pLS0tLS0tLS0tKworCSAqICAtLWhpLS0gLS0tLWxvdy1wYXJ0LS0tLQorCSAqCisJICogVGhlIHVwcGVyIDEyIGJpdHMgb2YgJW80IHNob3VsZCBiZSBzaWduLWV4dGVuZGVkIHRvIGZvcm0gdGhlCisJICogaGlnaCBwYXJ0IG9mIHRoZSBwcm9kdWN0IChpLmUuLCBoaWdocGFydCA9ICVvNCA+PiAyMCkuCisJICovCisKKwlyZAkleSwgJW81CisJc2xsCSVvNCwgMTIsICVvMAkhIHNoaWZ0IG1pZGRsZSBiaXRzIGxlZnQgMTIKKwlzcmwJJW81LCAyMCwgJW81CSEgc2hpZnQgbG93IGJpdHMgcmlnaHQgMjAsIHplcm8gZmlsbCBhdCBsZWZ0CisJb3IJJW81LCAlbzAsICVvMAkhIGNvbnN0cnVjdCBsb3cgcGFydCBvZiByZXN1bHQKKwlyZXRsCisJc3JhCSVvNCwgMjAsICVvMQkhIC4uLiBhbmQgZXh0cmFjdCBoaWdoIHBhcnQgb2YgcmVzdWx0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy9zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAyNzNmNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3N5c2NhbGwuUwpAQCAtMCwwICsxLDE5IEBACisvKgorICogYXJjaC9zcGFyYy9zeXNjYWxsLlMKKyAqCisgKiBDb21tb24gc3lzdGVtLWNhbGwgc3R1YjsgJWcxIGFscmVhZHkgc2V0IHRvIHN5c2NhbGwgbnVtYmVyCisgKi8KKworCS5nbG9ibAlfX3N5c2NhbGxfY29tbW9uCisJLnR5cGUJX19zeXNjYWxsX2NvbW1vbiwjZnVuY3Rpb24KKyAgICAgICAJLmFsaWduCTQKK19fc3lzY2FsbF9jb21tb246CisJdAkweDEwCisJYmNjCTFmCisJICBzZXRoaQklaGkoZXJybm8pLCAlZzQKKwlvcgklZzQsICVsbyhlcnJubyksICVnNAorCXN0CSVvMCxbJWc0XQorCW1vdgktMSwgJW8wCisxOgorICAgICAgIAlyZXRsCisJICBub3AKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjL3N5c2ZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3N5c2ZvcmsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZjNzZlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc3lzZm9yay5TCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBhcmNoL3NwYXJjL3N5c2ZvcmsuUworICoKKyAqIFRoZSBmb3JrIGFuZCB2Zm9yayBzeXN0ZW0gY2FsbHMgYXJlIHNwZWNpYWwgb24gc3BhcmNbNjRdOgorICogdGhleSByZXR1cm4gdGhlICJvdGhlciBwcm9jZXNzIiBwaWQgaW4gJW8wIGFuZCB0aGUKKyAqICJpcyBjaGlsZCIgZmxhZyBpbiAlbzEKKyAqCisgKiBDb21tb24gc3lzdGVtLWNhbGwgc3R1YjsgJWcxIGFscmVhZHkgc2V0IHRvIHN5c2NhbGwgbnVtYmVyCisgKi8KKworCS5nbG9ibAlfX3N5c2NhbGxfZm9ya2lzaAorCS50eXBlCV9fc3lzY2FsbF9mb3JraXNoLCNmdW5jdGlvbgorICAgICAgIAkuYWxpZ24JNAorX19zeXNjYWxsX2Zvcmtpc2g6CisJdAkweDEwCisJc3ViCSVvMSwgMSwgJW8xCisJYmNjLGEJMWYKKwkgIGFuZAklbzAsICVvMSwgJW8wCisJc2V0aGkJJWhpKGVycm5vKSwgJWc0CisJb3IJJWc0LCAlbG8oZXJybm8pLCAlZzQKKwlzdAklbzAsWyVnNF0KKwltb3YJLTEsICVvMAorMToKKyAgICAgICAJcmV0bAorCSAgbm9wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy9zeXNzdHViLnBoIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc3lzc3R1Yi5waApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGNlZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmMvc3lzc3R1Yi5waApAQCAtMCwwICsxLDI1IEBACisjIC0qLSBwZXJsIC0qLQorIworIyBhcmNoL3NwYXJjMzIvc3lzc3R1Yi5waAorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgc3lzdGVtIGNhbGwgc3R1YnMKKyMKKworc3ViIG1ha2Vfc3lzc3R1YigkJCQkJEApIHsKKyAgICBteSgkb3V0cHV0ZGlyLCAkZm5hbWUsICR0eXBlLCAkc25hbWUsICRzdHlwZSwgQGFyZ3MpID0gQF87CisKKyAgICAkc3R5cGUgPSAkc3R5cGUgfHwgJ2NvbW1vbic7CisKKyAgICBvcGVuKE9VVCwgJz4nLCAiJHtvdXRwdXRkaXJ9LyR7Zm5hbWV9LlMiKTsKKyAgICBwcmludCBPVVQgIiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+XG4iOworICAgIHByaW50IE9VVCAiXG4iOworICAgIHByaW50IE9VVCAiXHQudHlwZSAke2ZuYW1lfSxcQGZ1bmN0aW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuZ2xvYmwgJHtmbmFtZX1cbiI7CisgICAgcHJpbnQgT1VUICIke2ZuYW1lfTpcbiI7CisgICAgcHJpbnQgT1VUICJcdGIgX19zeXNjYWxsXyR7c3R5cGV9XG4iOworICAgIHByaW50IE9VVCAiXHQgIG1vdlx0X19OUl8ke3NuYW1lfSwgJWcxXG4iOworICAgIHByaW50IE9VVCAiXHQuc2l6ZSAke2ZuYW1lfSwuLSR7Zm5hbWV9XG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYy91bXVsLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYy91bXVsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MTkzZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjL3VtdWwuUwpAQCAtMCwwICsxLDE5MyBAQAorLyoJJE5ldEJTRDogdW11bC5TLHYgMS4zIDE5OTcvMDcvMTYgMTQ6Mzc6NDQgY2hyaXN0b3MgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zIEVuZ2luZWVyaW5nIGdyb3VwCisgKiBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IHVuZGVyIERBUlBBIGNvbnRyYWN0IEJHIDkxLTY2IGFuZAorICogY29udHJpYnV0ZWQgdG8gQmVya2VsZXkuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBmcm9tOiBIZWFkZXI6IHVtdWwucyx2IDEuNCA5Mi8wNi8yNSAxMzoyNDowNSB0b3JlayBFeHAKKyAqLworCisjaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKKyNpZiAwCisJLmFzY2l6ICJAKCMpdW11bC5zCTguMSAoQmVya2VsZXkpIDYvNC85MyIKKyNlbHNlCisJUkNTSUQoIiROZXRCU0Q6IHVtdWwuUyx2IDEuMyAxOTk3LzA3LzE2IDE0OjM3OjQ0IGNocmlzdG9zIEV4cCAkIikKKyNlbmRpZgorI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworLyoKKyAqIFVuc2lnbmVkIG11bHRpcGx5LiAgUmV0dXJucyAlbzAgKiAlbzEgaW4gJW8xJW8wIChpLmUuLCAlbzEgaG9sZHMgdGhlCisgKiB1cHBlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgcHJvZHVjdCkuCisgKgorICogVGhpcyBjb2RlIG9wdGltaXplcyBzaG9ydCAobGVzcyB0aGFuIDEzLWJpdCkgbXVsdGlwbGllcy4gIFNob3J0CisgKiBtdWx0aXBsaWVzIHJlcXVpcmUgMjUgaW5zdHJ1Y3Rpb24gY3ljbGVzLCBhbmQgbG9uZyBvbmVzIHJlcXVpcmUKKyAqIDQ1IGluc3RydWN0aW9uIGN5Y2xlcy4KKyAqCisgKiBPbiByZXR1cm4sIG92ZXJmbG93IGhhcyBvY2N1cnJlZCAoJW8xIGlzIG5vdCB6ZXJvKSBpZiBhbmQgb25seSBpZgorICogdGhlIFogY29uZGl0aW9uIGNvZGUgaXMgY2xlYXIsIGFsbG93aW5nLCBlLmcuLCB0aGUgZm9sbG93aW5nOgorICoKKyAqCWNhbGwJLnVtdWwKKyAqCW5vcAorICoJYm56CW92ZXJmbG93CShvciB0bnopCisgKi8KKworRlVOQygudW11bCkKKwlvcgklbzAsICVvMSwgJW80CisJbW92CSVvMCwgJXkJCSEgbXVsdGlwbGllciAtPiBZCisJYW5kbmNjCSVvNCwgMHhmZmYsICVnMAkhIHRlc3QgYml0cyAxMi4uMzEgb2YgKmJvdGgqIGFyZ3MKKwliZQlMbXVsX3Nob3J0d2F5CSEgaWYgemVybywgY2FuIGRvIGl0IHRoZSBzaG9ydCB3YXkKKwlhbmRjYwklZzAsICVnMCwgJW80CSEgemVybyB0aGUgcGFydGlhbCBwcm9kdWN0IGFuZCBjbGVhciBOIGFuZCBWCisKKwkvKgorCSAqIExvbmcgbXVsdGlwbHkuICAzMiBzdGVwcywgZm9sbG93ZWQgYnkgYSBmaW5hbCBzaGlmdCBzdGVwLgorCSAqLworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMworCW11bHNjYwklbzQsICVvMSwgJW80CSEgNAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgNworCW11bHNjYwklbzQsICVvMSwgJW80CSEgOAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgOQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTAKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDExCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMgorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTMKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE0CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxNQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTYKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDE3CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxOAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTkKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIwCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyMQorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjIKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDIzCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyNAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjUKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI2CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyNworCW11bHNjYwklbzQsICVvMSwgJW80CSEgMjgKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDI5CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAzMAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMzEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDMyCisJbXVsc2NjCSVvNCwgJWcwLCAlbzQJISBmaW5hbCBzaGlmdAorCisKKwkvKgorCSAqIE5vcm1hbGx5LCB3aXRoIHRoZSBzaGlmdC1hbmQtYWRkIGFwcHJvYWNoLCBpZiBib3RoIG51bWJlcnMgYXJlCisJICogcG9zaXRpdmUgeW91IGdldCB0aGUgY29ycmVjdCByZXN1bHQuICBXSXRoIDMyLWJpdCB0d28ncy1jb21wbGVtZW50CisJICogbnVtYmVycywgLXggaXMgcmVwcmVzZW50ZWQgYXMKKwkgKgorCSAqCQkgIHgJCSAgICAzMgorCSAqCSggMiAgLSAgLS0tLS0tICkgbW9kIDIgICogIDIKKwkgKgkJICAgMzIKKwkgKgkJICAyCisJICoKKwkgKiAodGhlIGBtb2QgMicgc3VidHJhY3RzIDEgZnJvbSAxLmJiYmIpLiAgVG8gYXZvaWQgbG90cyBvZiAyXjMycywKKwkgKiB3ZSBjYW4gdHJlYXQgdGhpcyBhcyBpZiB0aGUgcmFkaXggcG9pbnQgd2VyZSBqdXN0IHRvIHRoZSBsZWZ0CisJICogb2YgdGhlIHNpZ24gYml0IChtdWx0aXBseSBieSAyXjMyKSwgYW5kIGdldAorCSAqCisJICoJLXggID0gICgyIC0geCkgbW9kIDIKKwkgKgorCSAqIFRoZW4sIGlnbm9yaW5nIHRoZSBgbW9kIDIncyBmb3IgY29udmVuaWVuY2U6CisJICoKKwkgKiAgIHggKiAgeQk9IHh5CisJICogIC14ICogIHkJPSAyeSAtIHh5CisJICogICB4ICogLXkJPSAyeCAtIHh5CisJICogIC14ICogLXkJPSA0IC0gMnggLSAyeSArIHh5CisJICoKKwkgKiBGb3Igc2lnbmVkIG11bHRpcGxpZXMsIHdlIHN1YnRyYWN0ICh4IDw8IDMyKSBmcm9tIHRoZSBwYXJ0aWFsCisJICogcHJvZHVjdCB0byBmaXggdGhpcyBwcm9ibGVtIGZvciBuZWdhdGl2ZSBtdWx0aXBsaWVycyAoc2VlIG11bC5zKS4KKwkgKiBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlIHNoaWZ0IGludG8gdGhlIHBhcnRpYWwgcHJvZHVjdCBpcyBjYWxjdWxhdGVkCisJICogKE4geG9yIFYpLCB0aGlzIHRlcm0gaXMgYXV0b21hdGljYWxseSByZW1vdmVkIGZvciB0aGUgbXVsdGlwbGljYW5kLAorCSAqIHNvIHdlIGRvbid0IGhhdmUgdG8gYWRqdXN0LgorCSAqCisJICogQnV0IGZvciB1bnNpZ25lZCBtdWx0aXBsaWVzLCB0aGUgaGlnaCBvcmRlciBiaXQgd2Fzbid0IGEgc2lnbiBiaXQsCisJICogYW5kIHRoZSBjb3JyZWN0aW9uIGlzIHdyb25nLiAgU28gZm9yIHVuc2lnbmVkIG11bHRpcGxpZXMgd2hlcmUgdGhlCisJICogaGlnaCBvcmRlciBiaXQgaXMgb25lLCB3ZSBlbmQgdXAgd2l0aCB4eSAtICh5IDw8IDMyKS4gIFRvIGZpeCBpdAorCSAqIHdlIGFkZCB5IDw8IDMyLgorCSAqLworCXRzdAklbzEKKwlibCxhCTFmCQkhIGlmICVvMSA8IDAgKGhpZ2ggb3JkZXIgYml0ID0gMSksCisJYWRkCSVvNCwgJW8wLCAlbzQJISAlbzQgKz0gJW8wIChhZGQgeSB0byB1cHBlciBoYWxmKQorMToJcmQJJXksICVvMAkJISBnZXQgbG93ZXIgaGFsZiBvZiBwcm9kdWN0CisJcmV0bAorCWFkZGNjCSVvNCwgJWcwLCAlbzEJISBwdXQgdXBwZXIgaGFsZiBpbiBwbGFjZSBhbmQgc2V0IFogZm9yICVvMT09MAorCitMbXVsX3Nob3J0d2F5OgorCS8qCisJICogU2hvcnQgbXVsdGlwbHkuICAxMiBzdGVwcywgZm9sbG93ZWQgYnkgYSBmaW5hbCBzaGlmdCBzdGVwLgorCSAqIFRoZSByZXN1bHRpbmcgYml0cyBhcmUgb2ZmIGJ5IDEyIGFuZCAoMzItMTIpID0gMjAgYml0IHBvc2l0aW9ucywKKwkgKiBidXQgdGhlcmUgaXMgbm8gcHJvYmxlbSB3aXRoICVvMCBiZWluZyBuZWdhdGl2ZSAodW5saWtlIGFib3ZlKSwKKwkgKiBhbmQgb3ZlcmZsb3cgaXMgaW1wb3NzaWJsZSAodGhlIGFuc3dlciBpcyBhdCBtb3N0IDI0IGJpdHMgbG9uZykuCisJICovCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAyCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAzCisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA0CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA1CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA2CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA3CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA4CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISA5CisJbXVsc2NjCSVvNCwgJW8xLCAlbzQJISAxMAorCW11bHNjYwklbzQsICVvMSwgJW80CSEgMTEKKwltdWxzY2MJJW80LCAlbzEsICVvNAkhIDEyCisJbXVsc2NjCSVvNCwgJWcwLCAlbzQJISBmaW5hbCBzaGlmdAorCisJLyoKKwkgKiAlbzQgaGFzIDIwIG9mIHRoZSBiaXRzIHRoYXQgc2hvdWxkIGJlIGluIHRoZSByZXN1bHQ7ICV5IGhhcworCSAqIHRoZSBib3R0b20gMTIgKGFzICV5J3MgdG9wIDEyKS4gIFRoYXQgaXM6CisJICoKKwkgKgkgICVvNAkJICAgICV5CisJICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiB8IC0xMi0gfCAgIC0yMC0gIHwgLTEyLSB8ICAgLTIwLSAgfAorCSAqICstLS0tLS0oLS0tLS0tLS0tKy0tLS0tLSktLS0tLS0tLS0rCisJICoJICAgLS0tLS1yZXN1bHQtLS0tLQorCSAqCisJICogVGhlIDEyIGJpdHMgb2YgJW80IGxlZnQgb2YgdGhlIGByZXN1bHQnIGFyZWEgYXJlIGFsbCB6ZXJvOworCSAqIGluIGZhY3QsIGFsbCB0b3AgMjAgYml0cyBvZiAlbzQgYXJlIHplcm8uCisJICovCisKKwlyZAkleSwgJW81CisJc2xsCSVvNCwgMTIsICVvMAkhIHNoaWZ0IG1pZGRsZSBiaXRzIGxlZnQgMTIKKwlzcmwJJW81LCAyMCwgJW81CSEgc2hpZnQgbG93IGJpdHMgcmlnaHQgMjAKKwlvcgklbzUsICVvMCwgJW8wCisJcmV0bAorCWFkZGNjCSVnMCwgJWcwLCAlbzEJISAlbzEgPSB6ZXJvLCBhbmQgc2V0IFoKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvS2J1aWxkIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1NGY2OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvS2J1aWxkCkBAIC0wLDAgKzEsOCBAQAorIworIyBrbGliYyBmaWxlcyBmb3Igc3BhcmM2NAorIworCitrbGliLXkgOj0gcGlwZS5vIHNldGptcC5vIHN5c2NhbGwubyBzeXNmb3JrLm8KKworYWx3YXlzICA6PSBjcnQwLm8KK3RhcmdldHMgOj0gY3J0MC5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L01DT05GSUcgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L01DT05GSUcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2ZjAwNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvTUNPTkZJRwpAQCAtMCwwICsxLDIxIEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC9zcGFyYzY0L01DT05GSUcKKyMKKyMgU3BlY2lhbCBydWxlcyBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBhY3R1YWxseQorIyBpbmNsdWRlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLCBhbmQgdGhhdCBwYXRobmFtZXMgc2hvdWxkIGJlCisjIGFjY29yZGluZ2x5LgorIworCitLTElCQ0FSQ0hSRVFGTEFHUyA9IC1tNjQgLW1wdHI2NCAtRF9fc3BhcmM2NF9fCitLTElCQ09QVEZMQUdTICAgICArPSAtT3MKK0tMSUJDQklUU0laRSAgICAgID0gNjQKKworS0xJQkNMREZMQUdTICAgICAgPSAtbSBlbGY2NF9zcGFyYworCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyBOb3JtYWwgYmluYXJpZXMgc3RhcnQgYXQgMSBNQjsgdGhlIGxpbmtlciB3YW50cyAxIE1CIGFsaWdubWVudCwKKyMgYW5kIGNhbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgYSAzMC1iaXQgc2lnbmVkIG9mZnNldCwgPDwgMi4KK0tMSUJDU0hBUkVERkxBR1MJPSAtVHRleHQgMHg4MDAwMDIwMApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9jcnQwLlMgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L2NydDAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFlZTdjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9jcnQwLlMKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFRBUkdFVF9QVFJfU0laRSA2NAorI2luY2x1ZGUgIi4uL3NwYXJjL2NydDBpLlMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3BpcGUuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvcGlwZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2IyMGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3BpcGUuUwpAQCAtMCwwICsxLDMwIEBACisvKgorICogYXJjaC9zcGFyYzY0L3BpcGUuUworICoKKyAqIFRoZSBwaXBlIHN5c3RlbSBjYWxsIGFyZSBzcGVjaWFsIG9uIHNwYXJjWzY0XToKKyAqIHRoZXkgcmV0dXJuIHRoZSB0d28gZmlsZSBkZXNjcmlwdG9ycyBpbiAlbzAgYW5kICVvMS4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLmdsb2JsCXBpcGUKKwkudHlwZQlwaXBlLCNmdW5jdGlvbgorICAgICAgIAkuYWxpZ24JNAorcGlwZToKKwltb3YJX19OUl9waXBlLCAlZzEKKwlvcgklbzAsIDAsICVnNAorCXQJMHg2ZAorCWJjYwkleGNjLCAxZgorCSAgbm9wCisJc2V0aGkJJWhpKGVycm5vKSwgJWc0CisJb3IJJWc0LCAlbG8oZXJybm8pLCAlZzQKKwlzdAklbzAsWyVnNF0KKwlyZXRsCisJICBtb3YJLTEsICVvMAorMToKKwlzdAklbzAsWyVnNF0KKwlzdAklbzEsWyVnNCs0XQorCXJldGwKKwkgIG1vdgkwLCAlbzAKKworCS5zaXplIHBpcGUsLi1waXBlCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zZXRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWE2YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zZXRqbXAuUwpAQCAtMCwwICsxLDU1IEBACishCishIHNldGptcC5TCishCishIEJhc2ljIHNldGptcC9sb25nam1wCishCishIFRoaXMgY29kZSB3YXMgYmFzZWQgb24gdGhlIGVxdWl2YWxlbnQgY29kZSBpbiBOZXRCU0QKKyEKKworIQorISBUaGUgam1wX2J1ZiBjb250YWlucyB0aGUgZm9sbG93aW5nIGVudHJpZXM6CishICAgc3AKKyEgICBmcAorISAgIHBjCishCisJLnRleHQKKwkuYWxpZ24JNAorCS5nbG9iYWwJc2V0am1wCisJLnR5cGUJc2V0am1wLCBAZnVuY3Rpb24KK3NldGptcDoKKwlzdHgJJXNwLFslbzArMF0JISBDYWxsZXJzIHN0YWNrIHBvaW50ZXIKKwlzdHgJJW83LFslbzArOF0JISBSZXR1cm4gcGMKKwlzdHgJJWZwLFslbzArMTZdCSEgRnJhbWUgcG9pbnRlcgorCXJldGwJCQkhIFJldHVybgorCSBjbHIJJW8wCQkhICAuLi4wCisKKwkuc2l6ZQlzZXRqbXAsLi1zZXRqbXAKKworCisgICAgICAgCS5nbG9ibAlsb25nam1wCisJLnR5cGUJbG9uZ2ptcCwgQGZ1bmN0aW9uCitsb25nam1wOgorCW1vdgklbzEsICVnNAkhIHNhdmUgcmV0dXJuIHZhbHVlCisJbW92CSVvMCwgJWcxCSEgc2F2ZSB0YXJnZXQKKwlsZHgJWyVnMSsxNl0sJWc1CSEgZ2V0IGNhbGxlcnMgZnJhbWUKKzE6CisJY21wCSVmcCwgJWc1CSEgY29tcGFyZSBhZ2FpbnN0IGRlc2lyZWQgZnJhbWUKKwlibCxhCTFiCQkhIGlmIGJlbG93Li4uCisJIHJlc3RvcmUJCSEgcG9wIGZyYW1lIGFuZCBsb29wCisJYmUsYQkyZgkJISBpZiB0aGVyZS4uLgorICAgICAgIAkgbGR4CVslZzErMF0sJW8yCSEgZmV0Y2ggcmV0dXJuICVzcAorCisuTGJvdGNoOgorCXVuaW1wCTAJCSEgLi4uIGVycm9yIC4uLgorCisyOgorICAgICAgIAljbXAJJW8yLCAlc3AJISAlc3AgbXVzdCBub3QgZGVjcmVhc2UKKwlibAkuTGJvdGNoCisJIG5vcAorCW1vdgklbzIsICVzcAkhIGl0IGlzIE9LLCBwdXQgaXQgaW4gcGxhY2UKKworCWxkeAlbJWcxKzhdLCVvMwkhIGZldGNoICVwYworCWptcAklbzMgKyA4CQkhIGlmIHN1Y2Vzcy4uLgorCSBtb3YJJWc0LCVvMAkJISAgIHJldHVybiAlZzQKKworCS5zaXplCWxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3N5c2NhbGwuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjlkOTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3N5c2NhbGwuUwpAQCAtMCwwICsxLDE4IEBACisvKgorICogYXJjaC9zcGFyYzY0L3N5c2NhbGwuUworICoKKyAqIENvbW1vbiBzeXN0ZW0tY2FsbCBzdHViOyAlZzEgYWxyZWFkeSBzZXQgdG8gc3lzY2FsbCBudW1iZXIKKyAqLworCisJLmdsb2JsCV9fc3lzY2FsbF9jb21tb24KKwkudHlwZQlfX3N5c2NhbGxfY29tbW9uLCNmdW5jdGlvbgorICAgICAgIAkuYWxpZ24JNAorX19zeXNjYWxsX2NvbW1vbjoKKwl0CTB4NmQKKwliY2MJJXhjYywgMWYKKwkgIHNldGhpCSVoaShlcnJubyksICVnNAorCW9yCSVnNCwgJWxvKGVycm5vKSwgJWc0CisJc3QJJW8wLFslZzRdCisxOgorICAgICAgIAlyZXRsCisJICBtb3ZjcwkleGNjLCAtMSwgJW8wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3N5c2ZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL3NwYXJjNjQvc3lzZm9yay5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZWQ2NTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3N5c2ZvcmsuUwpAQCAtMCwwICsxLDI2IEBACisvKgorICogYXJjaC9zcGFyYzY0L3N5c2ZvcmsuUworICoKKyAqIFRoZSBmb3JrIGFuZCB2Zm9yayBzeXN0ZW0gY2FsbHMgYXJlIHNwZWNpYWwgb24gc3BhcmNbNjRdOgorICogdGhleSByZXR1cm4gdGhlICJvdGhlciBwcm9jZXNzIiBwaWQgaW4gJW8wIGFuZCB0aGUKKyAqICJpcyBjaGlsZCIgZmxhZyBpbiAlbzEKKyAqCisgKiBDb21tb24gc3lzdGVtLWNhbGwgc3R1YjsgJWcxIGFscmVhZHkgc2V0IHRvIHN5c2NhbGwgbnVtYmVyCisgKi8KKworCS5nbG9ibAlfX3N5c2NhbGxfZm9ya2lzaAorCS50eXBlCV9fc3lzY2FsbF9mb3JraXNoLCNmdW5jdGlvbgorICAgICAgIAkuYWxpZ24JNAorX19zeXNjYWxsX2Zvcmtpc2g6CisJdAkweDZkCisJc3ViCSVvMSwgMSwgJW8xCisJYmNjLGEJJXhjYywgMWYKKwkgIGFuZAklbzAsICVvMSwgJW8wCisJc2V0aGkJJWhpKGVycm5vKSwgJWc0CisJb3IJJWc0LCAlbG8oZXJybm8pLCAlZzQKKwlzdAklbzAsIFslZzRdCisJcmV0bAorCSAgbW92CS0xLCAlbzAKKzE6CisgICAgICAgCXJldGwKKwkgIG5vcApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zeXNzdHViLnBoIGIvdXNyL2tsaWJjL2FyY2gvc3BhcmM2NC9zeXNzdHViLnBoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWI4OGMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC9zcGFyYzY0L3N5c3N0dWIucGgKQEAgLTAsMCArMSwyNSBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgYXJjaC9zcGFyYzY0L3N5c3N0dWIucGgKKyMKKyMgU2NyaXB0IHRvIGdlbmVyYXRlIHN5c3RlbSBjYWxsIHN0dWJzCisjCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgJHN0eXBlID0gJHN0eXBlIHx8ICdjb21tb24nOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnR5cGUgJHtmbmFtZX0sXEBmdW5jdGlvblxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHRiIF9fc3lzY2FsbF8ke3N0eXBlfVxuIjsKKyAgICBwcmludCBPVVQgIlx0ICBtb3ZcdF9fTlJfJHtzbmFtZX0sICVnMVxuIjsKKyAgICBwcmludCBPVVQgIlx0LnNpemUgJHtmbmFtZX0sLi0ke2ZuYW1lfVxuIjsKKyAgICBjbG9zZShPVVQpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gveDg2XzY0L0tidWlsZCBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2OWM1YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9LYnVpbGQKQEAgLTAsMCArMSw4IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMga2xpYmMgZmlsZXMgZm9yIHg4Nl82NAorCithbHdheXMgIDo9IGNydDAubwordGFyZ2V0cyA6PSBjcnQwLm8KKwora2xpYi15IDo9IHNldGptcC5vIHN5c2NhbGwubyBzaWdyZXR1cm4ubyB2Zm9yay5vCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC94ODZfNjQvTUNPTkZJRyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9NQ09ORklHCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGM2MjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvTUNPTkZJRwpAQCAtMCwwICsxLDM5IEBACisjIC0qLSBtYWtlZmlsZSAtKi0KKyMKKyMgYXJjaC94ODYtNjQvTUNPTkZJRworIworIyBTcGVjaWFsIHJ1bGVzIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5CisjIGluY2x1ZGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUsIGFuZCB0aGF0IHBhdGhuYW1lcyBzaG91bGQgYmUKKyMgYWNjb3JkaW5nbHkuCisjCisjIEJsYXRhbnRseSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gaTM4NiB2ZXJzaW9uIGJ5IE1hdHMgUGV0ZXJzc29uLCBBTUQuCisjCisKKyMKKyMgTk9URTogLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyBwcm9kdWNlIHNpZ25pZmljYW50bHkgc21hbGxlcgorIyBiaW5hcmllcyAoMjAlIHNtYWxsZXIpLCBidXQgbWFrZXMgdGhlIGNvZGUgY29tcGxldGVseSB1c2VsZXNzIGZvcgorIyBkZWJ1Z2dpbmcgdXNpbmcgZ2RiLgorIworS0xJQkNBUkNIUkVRRkxBR1MgPSAtbTY0CitpZmVxICgkKERFQlVHKSx5KQorS0xJQkNPUFRGTEFHUyAgICAgKz0gLWcgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIFwKKwkJLWZhbGlnbi1mdW5jdGlvbnM9MSAtZmFsaWduLWp1bXBzPTEgLWZhbGlnbi1sb29wcz0xCitlbHNlCitLTElCQ09QVEZMQUdTICAgICArPSAtT3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisJCS1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbG9vcHM9MQorZW5kaWYKK0tMSUJDQklUU0laRSAgICAgID0gNjQKK0tMSUJDTERGTEFHUyAgICAgID0gLW0gZWxmX3g4Nl82NAorCisjIEV4dHJhIGxpbmtmbGFncyB3aGVuIGJ1aWxkaW5nIHRoZSBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeQorIyBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmVhY2hhYmxlIHVzaW5nIG5vcm1hbCBpbnRlci1tb2R1bGUKKyMgY2FsbHMsIGFuZCB3b3JrIG9uIHRoZSBtZW1vcnkgbW9kZWxzIGZvciB0aGlzIGFyY2hpdGVjdHVyZQorIyAyIE1CIC0gbm9ybWFsIGJpbmFyaWVzIHN0YXJ0IGF0IDQgTUIKKyMKKyMgUmVjZW50IGJpbnV0aWxzIHVzZSBtYXgtcGFnZS1zaXplPTB4MjAwMDAwIGJ5IGRlZmF1bHQsIHdoaWNoIHB1c2hlcworIyBrbGliYy5zbyBkYXRhIG92ZXIgdGhlIDQgTUIgbWFyaywgb3ZlcmxhcHBpbmcgdGhlIGV4ZWN1dGFibGUuCisjIFJldmVydCB0byB0aGUgb2xkIG1heC1wYWdlLXNpemU9MHgxMDAwMDAgdmFsdWUuCitLTElCQ1NIQVJFREZMQUdTICAgICA9IC1UdGV4dCAweDAwMjAwMjAwIC16IG1heC1wYWdlLXNpemU9MHgxMDAwMDAKKworIyBBZGRpdGlvbmFsIGFzbS0gZGlyZWN0b3JpZXMgbmVlZGVkIGR1cmluZyBpbnN0YWxsYXRpb24KK0FTTUFSQ0ggPSBhc20taTM4NgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gveDg2XzY0L2NydDAuUyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9jcnQwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1ZjMzNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9jcnQwLlMKQEAgLTAsMCArMSwyMiBAQAorIworIyBhcmNoL3g4Nl82NC9jcnQwLlMKKyMKKyMgRG9lcyBhcmNoLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGFuZCBpbnZva2VzIF9fbGliY19pbml0CisjIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy4KKyMKKyMgU2VlIF9fc3RhdGljX2luaXQuYyBvciBfX3NoYXJlZF9pbml0LmMgZm9yIHRoZSBleHBlY3RlZAorIyBhcmd1bWVudHMuCisjCisKKwkudGV4dAorCS5hbGlnbiA0CisJLnR5cGUgX3N0YXJ0LEBmdW5jdGlvbgorCS5nbG9ibCBfc3RhcnQKK19zdGFydDoKKwltb3ZxICVyc3AsJXJkaQkJCSMgT2Zmc2V0IG9mIHRoZSBFTEYgZGF0YSBzdHJ1Y3R1cmUKKwltb3ZxICVyZHgsJXJzaQkJCSMgVGhlIGF0ZXhpdCgpIHBvaW50ZXIgKGlmIGFueSkKKwljYWxsIF9fbGliY19pbml0CisJIyBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KKwlobHQKKworCS5zaXplIF9zdGFydCwuLV9zdGFydApkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3NldGptcC5TIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3NldGptcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjU0N2IKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvc2V0am1wLlMKQEAgLTAsMCArMSw1NCBAQAorIworIyBhcmNoL3g4Nl82NC9zZXRqbXAuUworIworIyBzZXRqbXAvbG9uZ2ptcCBmb3IgdGhlIHg4Ni02NCBhcmNoaXRlY3R1cmUKKyMKKworIworIyBUaGUgam1wX2J1ZiBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGZvbGxvd2luZywgaW4gb3JkZXI6CisjCSVyYngKKyMJJXJzcCAocG9zdC1yZXR1cm4pCisjCSVyYnAKKyMJJXIxMgorIwklcjEzCisjCSVyMTQKKyMJJXIxNQorIwk8cmV0dXJuIGFkZHJlc3M+CisjCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIHNldGptcAorCS50eXBlIHNldGptcCwgQGZ1bmN0aW9uCitzZXRqbXA6CisJcG9wICAlcnNpCQkJIyBSZXR1cm4gYWRkcmVzcywgYW5kIGFkanVzdCB0aGUgc3RhY2sKKwl4b3JsICVlYXgsJWVheAkJCSMgUmV0dXJuIHZhbHVlCisJbW92cSAlcmJ4LCglcmRpKQorCW1vdnEgJXJzcCw4KCVyZGkpCQkjIFBvc3QtcmV0dXJuICVyc3AhCisJcHVzaCAlcnNpCQkJIyBNYWtlIHRoZSBjYWxsL3JldHVybiBzdGFjayBoYXBweQorCW1vdnEgJXJicCwxNiglcmRpKQorCW1vdnEgJXIxMiwyNCglcmRpKQorCW1vdnEgJXIxMywzMiglcmRpKQorCW1vdnEgJXIxNCw0MCglcmRpKQorCW1vdnEgJXIxNSw0OCglcmRpKQorCW1vdnEgJXJzaSw1NiglcmRpKQkJIyBSZXR1cm4gYWRkcmVzcworCXJldAorCisJLnNpemUgc2V0am1wLC4tc2V0am1wCisKKwkudGV4dAorCS5hbGlnbiA0CisJLmdsb2JsIGxvbmdqbXAKKwkudHlwZSBsb25nam1wLCBAZnVuY3Rpb24KK2xvbmdqbXA6CisJbW92bCAlZXNpLCVlYXgJCQkjIFJldHVybiB2YWx1ZSAoaW50KQorCW1vdnEgKCVyZGkpLCVyYngKKwltb3ZxIDgoJXJkaSksJXJzcAorCW1vdnEgMTYoJXJkaSksJXJicAorCW1vdnEgMjQoJXJkaSksJXIxMgorCW1vdnEgMzIoJXJkaSksJXIxMworCW1vdnEgNDAoJXJkaSksJXIxNAorCW1vdnEgNDgoJXJkaSksJXIxNQorCWptcCAqNTYoJXJkaSkKKworCS5zaXplIGxvbmdqbXAsLi1sb25nam1wCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC94ODZfNjQvc2lncmV0dXJuLlMgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvc2lncmV0dXJuLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNWEwYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9zaWdyZXR1cm4uUwpAQCAtMCwwICsxLDE1IEBACisvKgorICogYXJjaC94ODZfNjQvc2lncmV0dXJuLlMKKyAqLworCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisJLnRleHQKKwkuYWxpZ24JNAorCS5nbG9ibAlfX3NpZ3JldHVybgorCS50eXBlCV9fc2lncmV0dXJuLEBmdW5jdGlvbgorX19zaWdyZXR1cm46CisJbW92bAkkX19OUl9ydF9zaWdyZXR1cm4sJWVheAorCXN5c2NhbGwKKworCS5zaXplCV9fc2lncmV0dXJuLC4tX19zaWdyZXR1cm4KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9zeXNjYWxsLlMgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvc3lzY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTc3OTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvc3lzY2FsbC5TCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBhcmNoL3g4Ni02NC9zeXNjYWxsLlMKKyAqCisgKiBDb21tb24gdGFpbC1oYW5kbGluZyBjb2RlIGZvciBzeXN0ZW0gY2FsbHMuCisgKgorICogVGhlIGFyZ3VtZW50cyBhcmUgaW4gdGhlIHN0YW5kYXJkIGFyZ3VtZW50IHJlZ2lzdGVyczsgdGhlIHN5c3RlbQorICogY2FsbCBudW1iZXIgaW4gJWVheC4KKyAqLworCS50ZXh0CisJLmFsaWduCTQKKwkuZ2xvYmwJX19zeXNjYWxsX2NvbW1vbgorCS50eXBlCV9fc3lzY2FsbF9jb21tb24sQGZ1bmN0aW9uCitfX3N5c2NhbGxfY29tbW9uOgorCW1vdnEJJXJjeCwlcjEwCQkjIFRoZSBrZXJuZWwgdXNlcyAlcjEwIGlzdGYgJXJjeAorCXN5c2NhbGwKKworCWNtcHEJJC00MDk1LCVyYXgKKwlqbmIJMWYKKwlyZXQKKworCSMgRXJyb3IgcmV0dXJuLCBtdXN0IHNldCBlcnJubworMToKKwluZWdsCSVlYXgKKwltb3ZsCSVlYXgsZXJybm8oJXJpcCkJIyBlcnJubyBpcyB0eXBlIGludCwgc28gMzIgYml0cworCW9ycQkkLTEsJXJheAkJIyBvcnEgJC0xIHNtYWxsZXIgdGhhbiBtb3ZxICQtMQorCXJldAorCisJLnNpemUJX19zeXNjYWxsX2NvbW1vbiwuLV9fc3lzY2FsbF9jb21tb24KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9zeXNzdHViLnBoIGIvdXNyL2tsaWJjL2FyY2gveDg2XzY0L3N5c3N0dWIucGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkNzk3YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC9zeXNzdHViLnBoCkBAIC0wLDAgKzEsMjMgQEAKKyMgLSotIHBlcmwgLSotCisjCisjIGFyY2gveDg2XzY0L3N5c3N0dWIucGgKKyMKKyMgU2NyaXB0IHRvIGdlbmVyYXRlIHN5c3RlbSBjYWxsIHN0dWJzCisjCisKK3N1YiBtYWtlX3N5c3N0dWIoJCQkJCRAKSB7CisgICAgbXkoJG91dHB1dGRpciwgJGZuYW1lLCAkdHlwZSwgJHNuYW1lLCAkc3R5cGUsIEBhcmdzKSA9IEBfOworCisgICAgb3BlbihPVVQsICc+JywgIiR7b3V0cHV0ZGlyfS8ke2ZuYW1lfS5TIik7CisgICAgcHJpbnQgT1VUICIjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPlxuIjsKKyAgICBwcmludCBPVVQgIlxuIjsKKyAgICBwcmludCBPVVQgIlx0LnR5cGUgJHtmbmFtZX0sXEBmdW5jdGlvblxuIjsKKyAgICBwcmludCBPVVQgIlx0Lmdsb2JsICR7Zm5hbWV9XG4iOworICAgIHByaW50IE9VVCAiJHtmbmFtZX06XG4iOworICAgIHByaW50IE9VVCAiXHRtb3ZsIFwkX19OUl8ke3NuYW1lfSwlZWF4XG4iOyAjIFplcm8tZXh0ZW5kcyB0byA2NCBiaXRzCisgICAgcHJpbnQgT1VUICJcdGptcCBfX3N5c2NhbGxfY29tbW9uXG4iOworICAgIHByaW50IE9VVCAiXHQuc2l6ZSAke2ZuYW1lfSwuLSR7Zm5hbWV9XG4iOworICAgIGNsb3NlKE9VVCk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXJjaC94ODZfNjQvdmZvcmsuUyBiL3Vzci9rbGliYy9hcmNoL3g4Nl82NC92Zm9yay5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzgwOTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXJjaC94ODZfNjQvdmZvcmsuUwpAQCAtMCwwICsxLDI2IEBACisjCisjIHVzci9rbGliYy9hcmNoL3g4Nl82NC92Zm9yay5TCisjCisjIHZmb3JrIGlzIG5hc3R5IC0gdGhlcmUgbXVzdCBiZSBub3RoaW5nIGF0IGFsbCBvbiB0aGUgc3RhY2sgYWJvdmUKKyMgdGhlIHN0YWNrIGZyYW1lIG9mIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24uCisjCisKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKwkudGV4dAorCS5hbGlnbgk0CisJLmdsb2JsCXZmb3JrCisJLnR5cGUJdmZvcmssIEBmdW5jdGlvbgordmZvcms6CisJcG9wCSVyZHgJCQkvKiBSZXR1cm4gYWRkcmVzcyAqLworCW1vdmwJJF9fTlJfdmZvcmssICVlYXgKKwlzeXNjYWxsCisJcHVzaAklcmR4CisJY21wcQkkLTQwOTUsICVyYXgKKwlqYWUJMWYKKwlyZXQKKzE6CisJbmVnbAklZWF4CisJbW92bAklZWF4LCBlcnJubyglcmlwKQorCW9ycQkkLTEsICVyYXgKKwlyZXQKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hc3ByaW50Zi5jIGIvdXNyL2tsaWJjL2FzcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmNWYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hc3ByaW50Zi5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBhc3ByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBhc3ByaW50ZihjaGFyICoqYnVmcCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcCwgYXAxOworCWludCBydjsKKwlpbnQgYnl0ZXM7CisJY2hhciAqcDsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCXZhX2NvcHkoYXAxLCBhcCk7CisKKwlieXRlcyA9IHZzbnByaW50ZihOVUxMLCAwLCBmb3JtYXQsIGFwMSkgKyAxOworCXZhX2VuZChhcDEpOworCisJKmJ1ZnAgPSBwID0gbWFsbG9jKGJ5dGVzKTsKKwlpZiAoIXApCisJCXJldHVybiAtMTsKKworCXJ2ID0gdnNucHJpbnRmKHAsIGJ5dGVzLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2Fzc2VydC5jIGIvdXNyL2tsaWJjL2Fzc2VydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTQxMjkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXNzZXJ0LmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGFzc2VydC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworX19ub3JldHVybiBfX2Fzc2VydF9mYWlsKGNvbnN0IGNoYXIgKmV4cHIsIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKQoreworCXByaW50ZigiQXNzZXJ0aW9uICVzIGZhaWxlZCwgZmlsZSAlcywgbGluZSAldVxuIiwgZXhwciwgZmlsZSwgbGluZSk7CisJYWJvcnQoKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hdGV4aXQuYyBiL3Vzci9rbGliYy9hdGV4aXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjFiNDYxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2F0ZXhpdC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBhdGV4aXQuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworaW50IGF0ZXhpdCh2b2lkICgqZmN0bikgKHZvaWQpKQoreworCXJldHVybiBvbl9leGl0KCh2b2lkICgqKShpbnQsIHZvaWQgKikpZmN0biwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXRleGl0LmggYi91c3Iva2xpYmMvYXRleGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxODY4OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hdGV4aXQuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogYXRleGl0LmgKKyAqCisgKiBhdGV4aXQoKS9vbl9leGl0KCkgaW50ZXJuYWwgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmIEFURVhJVF9ICisjZGVmaW5lIEFURVhJVF9ICisKK3N0cnVjdCBhdGV4aXQgeworCXZvaWQgKCpmY3RuKSAoaW50LCB2b2lkICopOworCXZvaWQgKmFyZzsJCS8qIG9uX2V4aXQoKSBwYXJhbWV0ZXIgKi8KKwlzdHJ1Y3QgYXRleGl0ICpuZXh0OworfTsKKworZXh0ZXJuIHN0cnVjdCBhdGV4aXQgKl9fYXRleGl0X2xpc3Q7CisKKyNlbmRpZgkJCQkvKiBBVEVYSVRfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2F0b2kuYyBiL3Vzci9rbGliYy9hdG9pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlYzBiZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9hdG9pLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgaW50CisjZGVmaW5lIE5BTUUgYXRvaQorI2luY2x1ZGUgImF0b3guYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9hdG9sLmMgYi91c3Iva2xpYmMvYXRvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NTQ4NGUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYXRvbC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIGxvbmcKKyNkZWZpbmUgTkFNRSBhdG9sCisjaW5jbHVkZSAiYXRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2F0b2xsLmMgYi91c3Iva2xpYmMvYXRvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRmNzllCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2F0b2xsLmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgbG9uZyBsb25nCisjZGVmaW5lIE5BTUUgYXRvbGwKKyNpbmNsdWRlICJhdG94LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYXRveC5jIGIvdXNyL2tsaWJjL2F0b3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDEzYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2F0b3guYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogYXRveC5jCisgKgorICogYXRvaSgpLCBhdG9sKCksIGF0b2xsKCkKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitUWVBFIE5BTUUoY29uc3QgY2hhciAqbnB0cikKK3sKKwlyZXR1cm4gKFRZUEUpIHN0cm50b3VtYXgobnB0ciwgKGNoYXIgKiopTlVMTCwgMTAsIH4oc2l6ZV90KSAwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9icmsuYyBiL3Vzci9rbGliYy9icmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjBiYjdiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2Jyay5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGJyay5jIC0gQ2hhbmdlIGRhdGEgc2VnbWVudCBzaXplICovCisKKy8qIFdyaXR0ZW4gMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIm1hbGxvYy5oIgorCisjaWYgIV9LTElCQ19OT19NTVUJCS8qIHVDbGludXggZG9lc24ndCBoYXZlIGJyaygpICovCisKK2NoYXIgKl9fY3VycmVudF9icms7CisKKy8qCisgKiBUaGUgTGludXggYnJrKCkgaXNuJ3Qgd2hhdCBtb3N0IHBlb3BsZSBleHBlY3QsIHNvIHdlIGNhbGwgdGhlCisgKiBzeXN0ZW0gY2FsbCBfX2JyaygpIGFuZCBwcm92aWRlIGEgd3JhcHBlci4KKyAqLworaW50IGJyayh2b2lkICplbmRfZGF0YV9zZWdtZW50KQoreworCWNoYXIgKm5ld19icms7CisKKwluZXdfYnJrID0gX19icmsoZW5kX2RhdGFfc2VnbWVudCk7CisJaWYgKG5ld19icmsgIT0gZW5kX2RhdGFfc2VnbWVudCkKKwkJcmV0dXJuIC0xOworCV9fY3VycmVudF9icmsgPSBuZXdfYnJrOworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9ic2Rfc2lnbmFsLmMgYi91c3Iva2xpYmMvYnNkX3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjIzOGMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvYnNkX3NpZ25hbC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBic2Rfc2lnbmFsLmMKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK19fc2lnaGFuZGxlcl90IGJzZF9zaWduYWwoaW50IHNpZ251bSwgX19zaWdoYW5kbGVyX3QgaGFuZGxlcikKK3sKKwkvKiBCU0Qgc2lnbmFsKCkgc2VtYW50aWNzICovCisJcmV0dXJuIF9fc2lnbmFsKHNpZ251bSwgaGFuZGxlciwgU0FfUkVTVEFSVCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvYnNlYXJjaC5jIGIvdXNyL2tsaWJjL2JzZWFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhiMDdmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2JzZWFyY2guYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogYnNlYXJjaC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit2b2lkICpic2VhcmNoKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYmFzZSwgc2l6ZV90IG5tZW1iLAorCSAgICAgIHNpemVfdCBzaXplLCBpbnQgKCpjbXApIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpCit7CisJd2hpbGUgKG5tZW1iKSB7CisJCXNpemVfdCBtaWRpZHggPSBubWVtYiAvIDI7CisJCWNvbnN0IHZvaWQgKm1pZG9iaiA9IGJhc2UgKyBtaWRpZHggKiBzaXplOworCQlpbnQgZGlmZiA9IGNtcChrZXksIG1pZG9iaik7CisKKwkJaWYgKGRpZmYgPT0gMCkKKwkJCXJldHVybiAodm9pZCAqKW1pZG9iajsKKworCQlpZiAoZGlmZiA+IDApIHsKKwkJCWJhc2UgPSBtaWRvYmogKyBzaXplOworCQkJbm1lbWIgLT0gbWlkaWR4ICsgMTsKKwkJfSBlbHNlCisJCQlubWVtYiA9IG1pZGlkeDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jYWxsb2MuYyBiL3Vzci9rbGliYy9jYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGI3NjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2NhbGxvYy5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBjYWxsb2MuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogRklYTUU6IFRoaXMgc2hvdWxkIGxvb2sgZm9yIG11bHRpcGxpY2F0aW9uIG92ZXJmbG93ICovCisKK3ZvaWQgKmNhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnB0cjsKKworCXNpemUgKj0gbm1lbWI7CisJcHRyID0gbWFsbG9jKHNpemUpOworCWlmIChwdHIpCisJCW1lbXNldChwdHIsIDAsIHNpemUpOworCisJcmV0dXJuIHB0cjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jbGVhcmVudi5jIGIvdXNyL2tsaWJjL2NsZWFyZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyNDM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jbGVhcmVudi5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBjbGVhcmVudi5jCisgKgorICogRW1wdHkgdGhlIGVudmlyb25tZW50CisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImVudi5oIgorCisvKiBOb3RlOiBpZiBlbnZpcm9uIGhhcyBiZWVuIG1hbGxvYydkLCBpdCB3aWxsIGJlIGZyZWVkIG9uIHRoZSBuZXh0CisgICBzZXRlbnYoKSBvciBwdXRlbnYoKSAqLworaW50IGNsZWFyZW52KHZvaWQpCit7CisJZW52aXJvbiA9IChjaGFyICoqKV9fbnVsbF9lbnZpcm9uOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2Nsb3NlbG9nLmMgYi91c3Iva2xpYmMvY2xvc2Vsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM3NzEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2Nsb3NlbG9nLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGNsb3NlbG9nLmMKKyAqLworCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2V4dGVybiBpbnQgX19zeXNsb2dfZmQ7CisKK3ZvaWQgY2xvc2Vsb2codm9pZCkKK3sKKwlpbnQgbG9nZmQgPSBfX3N5c2xvZ19mZDsKKworCWlmIChsb2dmZCAhPSAtMSkgeworCQljbG9zZShsb2dmZCk7CisJCV9fc3lzbG9nX2ZkID0gLTE7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2NyZWF0LmMgYi91c3Iva2xpYmMvY3JlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTAzYmNhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2NyZWF0LmMKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIGNyZWF0LmMKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitpbnQgY3JlYXQoY29uc3QgY2hhciAqcGF0aG5hbWUsIG1vZGVfdCBtb2RlKQoreworCXJldHVybiBvcGVuKHBhdGhuYW1lLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DLCBtb2RlKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9jdHlwZWZ1bmMuaCBiL3Vzci9rbGliYy9jdHlwZS9jdHlwZWZ1bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWUyNDdkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2N0eXBlZnVuYy5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBjdHlwZS9jdHlwZS5oCisgKgorICogQ29tbW9uIGhlYWRlciBmb3Igb3V0LW9mLWxpbmUgY3R5cGUgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSBfX0NUWVBFX05PX0lOTElORQorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNkZWZpbmUgQ1RZUEVGVU5DKFgpCQkJCVwKKyAgaW50IFgoaW50IGMpIHsJCQkJXAorICAgIHJldHVybiBfX2N0eXBlXyMjWChjKTsJCQlcCisgIH0KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc2FsbnVtLmMgYi91c3Iva2xpYmMvY3R5cGUvaXNhbG51bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YWYxOGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXNhbG51bS5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzYWxudW0pCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNhbHBoYS5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzYWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjJlZmZlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzYWxwaGEuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc2FscGhhKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzYXNjaWkuYyBiL3Vzci9rbGliYy9jdHlwZS9pc2FzY2lpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5NzRkNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc2FzY2lpLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXNhc2NpaSkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc2JsYW5rLmMgYi91c3Iva2xpYmMvY3R5cGUvaXNibGFuay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Mjg1NTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXNibGFuay5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzYmxhbmspCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNjbnRybC5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzY250cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRiODA0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzY250cmwuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc2NudHJsKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzZGlnaXQuYyBiL3Vzci9rbGliYy9jdHlwZS9pc2RpZ2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhMzlkOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc2RpZ2l0LmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXNkaWdpdCkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc2dyYXBoLmMgYi91c3Iva2xpYmMvY3R5cGUvaXNncmFwaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjgzZDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXNncmFwaC5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzZ3JhcGgpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNsb3dlci5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzbG93ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTE3OWFlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzbG93ZXIuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc2xvd2VyKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzcHJpbnQuYyBiL3Vzci9rbGliYy9jdHlwZS9pc3ByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2YTM1MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc3ByaW50LmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXNwcmludCkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc3B1bmN0LmMgYi91c3Iva2xpYmMvY3R5cGUvaXNwdW5jdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjUyNTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvaXNwdW5jdC5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzcHVuY3QpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGUvaXNzcGFjZS5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQwNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2N0eXBlL2lzc3BhY2UuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlICJjdHlwZWZ1bmMuaCIKK0NUWVBFRlVOQyhpc3NwYWNlKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL2lzdXBwZXIuYyBiL3Vzci9rbGliYy9jdHlwZS9pc3VwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMTM5YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc3VwcGVyLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkMoaXN1cHBlcikKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS9pc3hkaWdpdC5jIGIvdXNyL2tsaWJjL2N0eXBlL2lzeGRpZ2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4OWMxZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS9pc3hkaWdpdC5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKGlzeGRpZ2l0KQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2N0eXBlL3RvbG93ZXIuYyBiL3Vzci9rbGliYy9jdHlwZS90b2xvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjYTcyYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZS90b2xvd2VyLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiY3R5cGVmdW5jLmgiCitDVFlQRUZVTkModG9sb3dlcikKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9jdHlwZS90b3VwcGVyLmMgYi91c3Iva2xpYmMvY3R5cGUvdG91cHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzYzZjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvY3R5cGUvdG91cHBlci5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImN0eXBlZnVuYy5oIgorQ1RZUEVGVU5DKHRvdXBwZXIpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvY3R5cGVzLmMgYi91c3Iva2xpYmMvY3R5cGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViNTY2YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9jdHlwZXMuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIGN0eXBlcy5jCisgKgorICogVGhpcyBpcyB0aGUgYXJyYXkgdGhhdCBkZWZpbmVzIDxjdHlwZS5oPiBjbGFzc2VzLgorICogVGhpcyBhc3N1bWVzIElTTyA4ODU5LTEuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgX19jdHlwZXNbMjU3XSA9IHsKKwkwLAkJCS8qIEVPRiAqLworCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCB8IF9fY3R5cGVfc3BhY2UsCS8qIEJTICovCisJX19jdHlwZV9jbnRybCB8IF9fY3R5cGVfc3BhY2UsCS8qIFRBQiAqLworCV9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBMRiAqLworCV9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBWVCAqLworCV9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBGRiAqLworCV9fY3R5cGVfY250cmwgfCBfX2N0eXBlX3NwYWNlLAkvKiBDUiAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9zcGFjZSwJLyogc3BhY2UgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfZGlnaXQgfCBfX2N0eXBlX3hkaWdpdCwJLyogZGlnaXQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9kaWdpdCB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBkaWdpdCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2RpZ2l0IHwgX19jdHlwZV94ZGlnaXQsCS8qIGRpZ2l0ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBBLUYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBBLUYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBBLUYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBBLUYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBBLUYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBBLUYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIEctWiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3VwcGVyLAkvKiBHLVogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogRy1aICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBhLWYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBhLWYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBhLWYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBhLWYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBhLWYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciB8IF9fY3R5cGVfeGRpZ2l0LAkvKiBhLWYgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGcteiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBnLXogKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogZy16ICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9jbnRybCwJCS8qIGNvbnRyb2wgY2hhcmFjdGVyICovCisKKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKwlfX2N0eXBlX2NudHJsLAkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8KKworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCV9fY3R5cGVfY250cmwsCQkvKiBjb250cm9sIGNoYXJhY3RlciAqLworCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfc3BhY2UsCS8qIE5CU1AgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX3B1bmN0LAkvKiBwdW5jdHVhdGlvbiAqLworCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfdXBwZXIsCS8qIHVwcGVyIGFjY2VudGVkICovCisKKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9wdW5jdCwJLyogcHVuY3R1YXRpb24gKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV91cHBlciwJLyogdXBwZXIgYWNjZW50ZWQgKi8KKwlfX2N0eXBlX3ByaW50IHwgX19jdHlwZV9sb3dlciwJLyogbG93ZXIgYWNjZW50ZWQgKi8KKworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCV9fY3R5cGVfcHJpbnQgfCBfX2N0eXBlX2xvd2VyLAkvKiBsb3dlciBhY2NlbnRlZCAqLworCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfcHVuY3QsCS8qIHB1bmN0dWF0aW9uICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCisJX19jdHlwZV9wcmludCB8IF9fY3R5cGVfbG93ZXIsCS8qIGxvd2VyIGFjY2VudGVkICovCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2RhZW1vbi5jIGIvdXNyL2tsaWJjL2RhZW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjg4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZGFlbW9uLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGRhZW1vbi5jIC0gImRhZW1vbml6ZSIgYSBwcm9jZXNzCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK2ludCBkYWVtb24oaW50IG5vY2hkaXIsIGludCBub2Nsb3NlKQoreworCWludCBudWxsZmQ7CisJcGlkX3QgZjsKKworCWlmICghbm9jaGRpcikgeworCQlpZiAoY2hkaXIoIi8iKSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIW5vY2xvc2UpIHsKKwkJaWYgKChudWxsZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpKSA8IDAgfHwKKwkJICAgIGR1cDIobnVsbGZkLCAwKSA8IDAgfHwKKwkJICAgIGR1cDIobnVsbGZkLCAxKSA8IDAgfHwKKwkJICAgIGR1cDIobnVsbGZkLCAyKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCWNsb3NlKG51bGxmZCk7CisJfQorCisJZiA9IGZvcmsoKTsKKwlpZiAoZiA8IDApCisJCXJldHVybiAtMTsKKwllbHNlIGlmIChmID4gMCkKKwkJX2V4aXQoMCk7CisKKwlyZXR1cm4gc2V0c2lkKCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZW52LmggYi91c3Iva2xpYmMvZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3MGJlOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9lbnYuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIEVOVl9ICisjZGVmaW5lIEVOVl9ICisKKy8qIHN0ciBzaG91bGQgYmUgYSBkdXBsaWNhdGVkIHZlcnNpb24gb2YgdGhlIGlucHV0IHN0cmluZzsKKyAgIGxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgaW5jbHVkaW5nIHRoZSA9IHNpZ24gKi8KK2ludCBfX3B1dF9lbnYoY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgb3ZlcndyaXRlKTsKKworZXh0ZXJuIGNoYXIgKmNvbnN0IF9fbnVsbF9lbnZpcm9uW107CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2V4ZWNfbC5jIGIvdXNyL2tsaWJjL2V4ZWNfbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YjcwZGYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZXhlY19sLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIGV4ZWNfbC5jCisgKgorICogQ29tbW9uIGltcGxlbWVudGF0aW9uIG9mIGV4ZWNsKCkgZXhlY2xlKCkgZXhlY2xwKCkKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBOQU1FKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFyZzAsIC4uLikKK3sKKwl2YV9saXN0IGFwLCBjYXA7CisJaW50IGFyZ2MgPSAxLCBydjsKKwljb25zdCBjaGFyICoqYXJndiwgKiphcmdwOworCWNvbnN0IGNoYXIgKmFyZzsKKwljaGFyICpjb25zdCAqZW52cDsKKworCXZhX3N0YXJ0KGFwLCBhcmcwKTsKKwl2YV9jb3B5KGNhcCwgYXApOworCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKwlkbyB7CisJCWFyZyA9IHZhX2FyZyhjYXAsIGNvbnN0IGNoYXIgKik7CisJCWFyZ2MrKzsKKwl9IHdoaWxlIChhcmcpOworCisJdmFfZW5kKGNhcCk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb2ludGVyIGFycmF5ICovCisJYXJncCA9IGFyZ3YgPSBhbGxvY2EoYXJnYyAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKwlpZiAoIWFyZ3YpIHsKKwkJdmFfZW5kKGFwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENvcHkgdGhlIGxpc3QgaW50byBhbiBhcnJheSAqLworCSphcmdwKysgPSBhcmcwOworCWRvIHsKKwkJKmFyZ3ArKyA9IGFyZyA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciAqKTsKKwl9IHdoaWxlIChhcmcpOworCisjaWYgRVhFQ19FCisJLyogZXhlY2xlKCkgdGFrZXMgb25lIG1vcmUgYXJndW1lbnQgZm9yIHRoZSBlbnZpcm9ubWVudCBwb2ludGVyICovCisJZW52cCA9IHZhX2FyZyhhcCwgY2hhciAqY29uc3QgKik7CisjZWxzZQorCWVudnAgPSBlbnZpcm9uOworI2VuZGlmCisKKyNpZiBFWEVDX1AKKwlydiA9IGV4ZWN2cGUocGF0aCwgKGNoYXIgKiBjb25zdCAqKWFyZ3YsIGVudnApOworI2Vsc2UKKwlydiA9IGV4ZWN2ZShwYXRoLCAoY2hhciAqIGNvbnN0ICopYXJndiwgZW52cCk7CisjZW5kaWYKKworCXZhX2VuZChhcCk7CisKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZXhlY2wuYyBiL3Vzci9rbGliYy9leGVjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ODExMTMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZXhlY2wuYwpAQCAtMCwwICsxLDggQEAKKy8qCisgKiBleGVjbC5jCisgKi8KKworI2RlZmluZSBOQU1FIGV4ZWNsCisjZGVmaW5lIEVYRUNfUCAwCisjZGVmaW5lIEVYRUNfRSAwCisjaW5jbHVkZSAiZXhlY19sLmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZXhlY2xlLmMgYi91c3Iva2xpYmMvZXhlY2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3Mzk4OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9leGVjbGUuYwpAQCAtMCwwICsxLDggQEAKKy8qCisgKiBleGVjbGUuYworICovCisKKyNkZWZpbmUgTkFNRSBleGVjbGUKKyNkZWZpbmUgRVhFQ19QIDAKKyNkZWZpbmUgRVhFQ19FIDEKKyNpbmNsdWRlICJleGVjX2wuYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9leGVjbHAuYyBiL3Vzci9rbGliYy9leGVjbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWM5YWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2V4ZWNscC5jCkBAIC0wLDAgKzEsOCBAQAorLyoKKyAqIGV4ZWNscC5jCisgKi8KKworI2RlZmluZSBOQU1FIGV4ZWNscAorI2RlZmluZSBFWEVDX1AgMQorI2RlZmluZSBFWEVDX0UgMAorI2luY2x1ZGUgImV4ZWNfbC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2V4ZWNscGUuYyBiL3Vzci9rbGliYy9leGVjbHBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmOTcyZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9leGVjbHBlLmMKQEAgLTAsMCArMSw4IEBACisvKgorICogZXhlY2xwZS5jCisgKi8KKworI2RlZmluZSBOQU1FIGV4ZWNscGUKKyNkZWZpbmUgRVhFQ19QIDEKKyNkZWZpbmUgRVhFQ19FIDEKKyNpbmNsdWRlICJleGVjX2wuYyIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9leGVjdi5jIGIvdXNyL2tsaWJjL2V4ZWN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllNTczNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9leGVjdi5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBleGVjdi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgZXhlY3YoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqY29uc3QgKmFyZ3YpCit7CisJcmV0dXJuIGV4ZWN2ZShwYXRoLCBhcmd2LCBlbnZpcm9uKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9leGVjdnAuYyBiL3Vzci9rbGliYy9leGVjdnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTlmMzFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2V4ZWN2cC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBleGVjdnAuYworICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IGV4ZWN2cChjb25zdCBjaGFyICpwYXRoLCBjaGFyICpjb25zdCAqYXJndikKK3sKKwlyZXR1cm4gZXhlY3ZwZShwYXRoLCBhcmd2LCBlbnZpcm9uKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9leGVjdnBlLmMgYi91c3Iva2xpYmMvZXhlY3ZwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODQ0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZXhlY3ZwZS5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBleGVjdnBlLmMKKyAqCisgKiBleGVjdnBlKCkgZnVuY3Rpb24gKGZyb20gd2hpY2ggd2UgYnVpbGQgZXhlY2xwLCBleGVjbHBlLCBleGVjdnApLgorICoKKyAqIFRoaXMgdmVyc2lvbiBvZiBleGVjdnBlKCkgd2lsbCAqbm90KiBzcGF3biAvYmluL3NoIGlmIHRoZSBjb21tYW5kCisgKiByZXR1cm4gRU5PRVhFQy4gIFRoYXQncyB3aGF0ICMhIGlzIGZvciwgZm9sa3MhCisgKgorICogU2luY2UgZXhlY2xwZSgpIGFuZCBleGVjdnBlKCkgYXJlbid0IGluIFBPU0lYLCBub3IgaW4gZ2xpYmMsCisgKiBJIGhhdmUgZm9sbG93ZWQgUU5YIHByZWNlZGVudCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBBVEg6CisgKiB0aGUgUEFUSCB0aGF0IGlzIHVzZWQgaXMgdGhlIG9uZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCwgbm90CisgKiBpbiB0aGUgbmV3IGVudmlyb25tZW50LiAgT3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gcGFzcworICogYSBkaWZmZXJlbnQgUEFUSCB0byB0aGUgbmV3IHByb2Nlc3MgdGhhbiB0aGUgb25lIG9uZSB3b3VsZCB3YW50IHRvCisgKiB1c2UgdG8gc2VhcmNoLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIERFRkFVTFRfUEFUSCAJIi9iaW46L3Vzci9iaW46LiIKKworaW50IGV4ZWN2cGUoY29uc3QgY2hhciAqZmlsZSwgY2hhciAqY29uc3QgKmFyZ3YsIGNoYXIgKmNvbnN0ICplbnZwKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJY29uc3QgY2hhciAqc2VhcmNocGF0aCwgKmVzcDsKKwlzaXplX3QgcHJlZml4bGVuLCBmaWxlbGVuLCB0b3RhbGxlbjsKKworCWlmIChzdHJjaHIoZmlsZSwgJy8nKSkJLyogU3BlY2lmaWMgcGF0aCAqLworCQlyZXR1cm4gZXhlY3ZlKGZpbGUsIGFyZ3YsIGVudnApOworCisJZmlsZWxlbiA9IHN0cmxlbihmaWxlKTsKKworCXNlYXJjaHBhdGggPSBnZXRlbnYoIlBBVEgiKTsKKwlpZiAoIXNlYXJjaHBhdGgpCisJCXNlYXJjaHBhdGggPSBERUZBVUxUX1BBVEg7CisKKwllcnJubyA9IEVOT0VOVDsJCS8qIERlZmF1bHQgZXJybm8sIGlmIGV4ZWN2ZSgpIGRvZXNuJ3QKKwkJCQkgICBjaGFuZ2UgaXQgKi8KKworCWRvIHsKKwkJZXNwID0gc3RyY2hyKHNlYXJjaHBhdGgsICc6Jyk7CisJCWlmIChlc3ApCisJCQlwcmVmaXhsZW4gPSBlc3AgLSBzZWFyY2hwYXRoOworCQllbHNlCisJCQlwcmVmaXhsZW4gPSBzdHJsZW4oc2VhcmNocGF0aCk7CisKKwkJaWYgKHByZWZpeGxlbiA9PSAwIHx8IHNlYXJjaHBhdGhbcHJlZml4bGVuIC0gMV0gPT0gJy8nKSB7CisJCQl0b3RhbGxlbiA9IHByZWZpeGxlbiArIGZpbGVsZW47CisJCQlpZiAodG90YWxsZW4gPj0gUEFUSF9NQVgpCisJCQkJY29udGludWU7CisJCQltZW1jcHkocGF0aCwgc2VhcmNocGF0aCwgcHJlZml4bGVuKTsKKwkJCW1lbWNweShwYXRoICsgcHJlZml4bGVuLCBmaWxlLCBmaWxlbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXRvdGFsbGVuID0gcHJlZml4bGVuICsgZmlsZWxlbiArIDE7CisJCQlpZiAodG90YWxsZW4gPj0gUEFUSF9NQVgpCisJCQkJY29udGludWU7CisJCQltZW1jcHkocGF0aCwgc2VhcmNocGF0aCwgcHJlZml4bGVuKTsKKwkJCXBhdGhbcHJlZml4bGVuXSA9ICcvJzsKKwkJCW1lbWNweShwYXRoICsgcHJlZml4bGVuICsgMSwgZmlsZSwgZmlsZWxlbik7CisJCX0KKwkJcGF0aFt0b3RhbGxlbl0gPSAnXDAnOworCisJCWV4ZWN2ZShwYXRoLCBhcmd2LCBlbnZwKTsKKwkJaWYgKGVycm5vID09IEUyQklHICB8fCBlcnJubyA9PSBFTk9FWEVDIHx8CisJCSAgICBlcnJubyA9PSBFTk9NRU0gfHwgZXJybm8gPT0gRVRYVEJTWSkKKwkJCWJyZWFrOwkvKiBSZXBvcnQgdGhpcyBhcyBhbiBlcnJvciwgbm8gbW9yZSBzZWFyY2ggKi8KKworCQlzZWFyY2hwYXRoID0gZXNwICsgMTsKKwl9IHdoaWxlIChlc3ApOworCisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2V4aXQuYyBiL3Vzci9rbGliYy9leGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmMTFjNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9leGl0LmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGV4aXQuYworICoKKyAqIGV4aXQoKSwgaW5jbHVkaW5nIHRoZSBoYW5kbGluZyBvZiB0aGUgYXRleGl0IGNoYWluLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgImF0ZXhpdC5oIgorCisvKiBMaW5rIGNoYWluIGZvciBhdGV4aXQvb25fZXhpdCAqLworc3RydWN0IGF0ZXhpdCAqX19hdGV4aXRfbGlzdDsKKworX19ub3JldHVybiBleGl0KGludCBydikKK3sKKwlzdHJ1Y3QgYXRleGl0ICphcDsKKworCWZvciAoYXAgPSBfX2F0ZXhpdF9saXN0OyBhcDsgYXAgPSBhcC0+bmV4dCkgeworCQkvKiBUaGlzIGFzc3VtZXMgZXh0cmEgYXJncyBhcmUgaGFybWxlc3MuICBUaGV5IHNob3VsZAorCQkgICBiZSBpbiBhbGwgbm9ybWFsIEMgQUJJcywgYnV0IGlmIGFuIGFyY2hpdGVjdHVyZSBoYXMKKwkJICAgc29tZSBwYXJ0aWN1bGFybHkgYml6YXJyZSBBQkkgdGhpcyBtaWdodCBiZSB3b3J0aAorCQkgICB3YXRjaGluZyBvdXQgZm9yLiAqLworCQlhcC0+ZmN0bihydiwgYXAtPmFyZyk7CisJfQorCisJLyogSGFuZGxlIGFueSBsaWJyYXJ5IGRlc3RydWN0b3JzIGlmIHdlIGV2ZXIgc3RhcnQgdXNpbmcgdGhlbS4uLiAqLworCisJX2V4aXQocnYpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2ZnZXRjLmMgYi91c3Iva2xpYmMvZmdldGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDkyZWFlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZnZXRjLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIGZnZXRjLmMKKyAqCisgKiBFeHRyZW1lbHkgc2xvdyBmZ2V0YyBpbXBsZW1lbnRhdGlvbiwgdXNpbmcgX2ZyZWFkKCkuICBJZiBwZW9wbGUKKyAqIGFjdHVhbGx5IG5lZWQgY2hhcmFjdGVyLW9yaWVudGVkIGlucHV0IHRvIGJlIGZhc3QsIHdlIG1heSBhY3R1YWxseQorICogaGF2ZSB0byBpbXBsZW1lbnQgYnVmZmVyaW5nLiAgU2lnaC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQgZmdldGMoRklMRSAqZikKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJcmV0dXJuIChfZnJlYWQoJmNoLCAxLCBmKSA9PSAxKSA/IChpbnQpY2ggOiBFT0Y7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZmdldHMuYyBiL3Vzci9rbGliYy9mZ2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOWNmNjgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZmdldHMuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogZmdldHMuYworICoKKyAqIFRoaXMgd2lsbCBiZSB2ZXJ5IHNsb3cgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRjKCksCisgKiBidXQgd2UgZG9uJ3QgaGF2ZSBhbnl3aGVyZSB0byBwdXQgY2hhcmFjdGVycyB3ZSBkb24ndCBuZWVkIGZyb20KKyAqIHRoZSBpbnB1dC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworY2hhciAqZmdldHMoY2hhciAqcywgaW50IG4sIEZJTEUgKmYpCit7CisJaW50IGNoOworCWNoYXIgKnAgPSBzOworCisJd2hpbGUgKG4gPiAxKSB7CisJCWNoID0gZ2V0YyhmKTsKKwkJaWYgKGNoID09IEVPRikgeworCQkJKnAgPSAnXDAnOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJKnArKyA9IGNoOworCQluLS07CisJCWlmIChjaCA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCWlmIChuKQorCQkqcCA9ICdcMCc7CisKKwlyZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mbm1hdGNoLmMgYi91c3Iva2xpYmMvZm5tYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGEyNWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZm5tYXRjaC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBmbm1hdGNoLmMKKyAqCisgKiBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBieSBLYXkgU2lldmVycywgbW9kaWZpZWQgYnkgSC4gUGV0ZXIgQW52aW4uCisgKi8KKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKworaW50IGZubWF0Y2goY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqcywgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIEZOTV9QQVRITkFNRSAmJiAqcyA9PSAnLycpCisJCXJldHVybiAoKnAgIT0gJy8nKSB8fCBmbm1hdGNoKHArMSwgcysxLCBmbGFncyk7CisJaWYgKGZsYWdzICYgRk5NX1BFUklPRCAmJiAqcyA9PSAnLicpCisJCXJldHVybiAoKnAgIT0gJy4nKSB8fCBmbm1hdGNoKHArMSwgcysxLCBmbGFncyk7CisKKwlmbGFncyAmPSB+Rk5NX1BFUklPRDsJLyogT25seSBhcHBsaWVzIGF0IGJlZ2lubmluZyAqLworCisJaWYgKCEoZmxhZ3MgJiBGTk1fTk9FU0NBUEUpICYmICpwID09ICdcXCcpIHsKKwkJcCsrOworCQlyZXR1cm4gKCpwICE9ICpzKSB8fCBmbm1hdGNoKHArMSwgcysxLCBmbGFncyk7CisJfQorCisJaWYgKCpzID09ICdcMCcpIHsKKwkJd2hpbGUgKCpwID09ICcqJykKKwkJCXArKzsKKwkJcmV0dXJuICgqcCAhPSAnXDAnKTsKKwl9CisKKwlzd2l0Y2ggKCpwKSB7CisJY2FzZSAnWyc6CisJCXsKKwkJCWludCBub3QgPSAwOworCQkJcCsrOworCQkJaWYgKCpwID09ICchJykgeworCQkJCW5vdCA9IDE7CisJCQkJcCsrOworCQkJfQorCQkJd2hpbGUgKCgqcCAhPSAnXDAnKSAmJiAoKnAgIT0gJ10nKSkgeworCQkJCWludCBtYXRjaCA9IDA7CisJCQkJaWYgKHBbMV0gPT0gJy0nKSB7CisJCQkJCWlmICgoKnMgPj0gKnApICYmICgqcyA8PSBwWzJdKSkKKwkJCQkJCW1hdGNoID0gMTsKKwkJCQkJcCArPSAzOworCQkJCX0gZWxzZSB7CisJCQkJCW1hdGNoID0gKCpwID09ICpzKTsKKwkJCQkJcCsrOworCQkJCX0KKwkJCQlpZiAobWF0Y2ggXiBub3QpIHsKKwkJCQkJd2hpbGUgKCgqcCAhPSAnXDAnKSAmJiAoKnAgIT0gJ10nKSkKKwkJCQkJCXArKzsKKwkJCQkJaWYgKCpwID09ICddJykKKwkJCQkJCXJldHVybiBmbm1hdGNoKHArMSwgcysxLCBmbGFncyk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgJyonOgorCQlpZiAoZm5tYXRjaChwLCBzKzEsIGZsYWdzKSkKKwkJCXJldHVybiBmbm1hdGNoKHArMSwgcywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwljYXNlICdcMCc6CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoKCpwID09ICpzKSB8fCAoKnAgPT0gJz8nKSkKKwkJCXJldHVybiBmbm1hdGNoKHArMSwgcysxLCBmbGFncyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mb3Blbi5jIGIvdXNyL2tsaWJjL2ZvcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhODBkNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9mb3Blbi5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBmb3Blbi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLyogVGhpcyBkZXBlbmRzIG9uIE9fUkRPTkxZID09IDAsIE9fV1JPTkxZID09IDEsIE9fUkRXUiA9PSAyICovCisKK0ZJTEUgKmZvcGVuKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisJaW50IGZsYWdzID0gT19SRE9OTFk7CisJaW50IHBsdXMgPSAwOworCisJd2hpbGUgKCptb2RlKSB7CisJCXN3aXRjaCAoKm1vZGUrKykgeworCQljYXNlICdyJzoKKwkJCWZsYWdzID0gT19SRE9OTFk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5EOworCQkJYnJlYWs7CisJCWNhc2UgJysnOgorCQkJcGx1cyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwbHVzKSB7CisJCWZsYWdzID0gKGZsYWdzICYgfihPX1JET05MWSB8IE9fV1JPTkxZKSkgfCBPX1JEV1I7CisJfQorCisJLyogTm90ZTogX19jcmVhdGVfZmlsZSgtMSkgPT0gTlVMTCwgc28gdGhpcyBpcyBzYWZlICovCisJcmV0dXJuIF9fY3JlYXRlX2ZpbGUob3BlbihmaWxlLCBmbGFncywgMDY2NikpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2ZvcmsuYyBiL3Vzci9rbGliYy9mb3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NDg2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9mb3JrLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIGZvcmsuYworICoKKyAqIFRoaXMgaXMgbm9ybWFsbHkganVzdCBhIHN5c2NhbGwgc3R1YiwgYnV0IGF0IGxlYXN0IG9uZSBzeXN0ZW0KKyAqIGRvZXNuJ3QgaGF2ZSBzeXNfZm9yaywgb25seSBzeXNfY2xvbmUuLi4KKyAqLworCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGtsaWJjL3N5c2NvbmZpZy5oPgorCisjaWYgIV9LTElCQ19OT19NTVUgJiYgIWRlZmluZWQoX19OUl9mb3JrKQorCitwaWRfdCBmb3JrKHZvaWQpCit7CisJcmV0dXJuIF9fY2xvbmUoU0lHQ0hMRCwgMCk7Cit9CisKKyNlbmRpZgkJCQkvKiBfX05SX2ZvcmsgKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mcHJpbnRmLmMgYi91c3Iva2xpYmMvZnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDM5MjMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZnByaW50Zi5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBmcHJpbnRmLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2RlZmluZSBCVUZGRVJfU0laRQkxNjM4NAorCitpbnQgZnByaW50ZihGSUxFICogZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcnY7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlydiA9IHZmcHJpbnRmKGZpbGUsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7CisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2ZwdXRjLmMgYi91c3Iva2xpYmMvZnB1dGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODZkODZjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ZwdXRjLmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGZwdXRjLmMKKyAqCisgKiBnY2MgInByaW50ZiBkZWNvbXBpbGF0aW9uIiBleHBlY3RzIHRoaXMgdG8gZXhpc3QuLi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IGZwdXRjKGludCBjLCBGSUxFICpmKQoreworCXVuc2lnbmVkIGNoYXIgY2ggPSBjOworCisJcmV0dXJuIF9md3JpdGUoJmNoLCAxLCBmKSA9PSAxID8gY2ggOiBFT0Y7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZnB1dHMuYyBiL3Vzci9rbGliYy9mcHV0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjQwZDYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZnB1dHMuYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogZnB1dHMuYworICoKKyAqIFRoaXMgaXNuJ3QgcXVpdGUgZnB1dHMoKSBpbiB0aGUgc3RkaW8gc2Vuc2UsIHNpbmNlIHdlIGRvbid0CisgKiBoYXZlIHN0ZGlvLCBidXQgaXQgdGFrZXMgYSBmaWxlIGRlc2NyaXB0b3IgYXJndW1lbnQgaW5zdGVhZAorICogb2YgdGhlIEZJTEUgKi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IGZwdXRzKGNvbnN0IGNoYXIgKnMsIEZJTEUgKmZpbGUpCit7CisJcmV0dXJuIF9md3JpdGUocywgc3RybGVuKHMpLCBmaWxlKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mcmVhZC5jIGIvdXNyL2tsaWJjL2ZyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0MzNhYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9mcmVhZC5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBmcmVhZC5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc2l6ZV90IF9mcmVhZCh2b2lkICpidWYsIHNpemVfdCBjb3VudCwgRklMRSAqZikKK3sKKwlzaXplX3QgYnl0ZXMgPSAwOworCXNzaXplX3QgcnY7CisJY2hhciAqcCA9IGJ1ZjsKKworCXdoaWxlIChjb3VudCkgeworCQlydiA9IHJlYWQoZmlsZW5vKGYpLCBwLCBjb3VudCk7CisJCWlmIChydiA9PSAtMSkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKSB7CisJCQkJZXJybm8gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocnYgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlwICs9IHJ2OworCQlieXRlcyArPSBydjsKKwkJY291bnQgLT0gcnY7CisJfQorCisJcmV0dXJuIGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2ZyZWFkMi5jIGIvdXNyL2tsaWJjL2ZyZWFkMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YzZlZDgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZnJlYWQyLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGZyZWFkMi5jCisgKgorICogVGhlIGFjdHVhbCBmcmVhZCgpIGZ1bmN0aW9uIGFzIGEgbm9uLWlubGluZQorICovCisKKyNkZWZpbmUgX19OT19GUkVBRF9GV1JJVEVfSU5MSU5FUworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3NpemVfdCBmcmVhZCh2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIEZJTEUgKiBmKQoreworCXJldHVybiBfZnJlYWQocHRyLCBzaXplICogbm1lbWIsIGYpIC8gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9mc3RhdGZzLmMgYi91c3Iva2xpYmMvZnN0YXRmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNGYyZWMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZnN0YXRmcy5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBmc3RhdGZzLmMKKyAqCisgKiBPbiBhcmNoaXRlY3R1cmVzIHdoaWNoIGRvIGZzdGF0ZnM2NCwgd3JhcCB0aGUgc3lzdGVtIGNhbGwKKyAqLworCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisKKyNpZmRlZiBfX05SX2ZzdGF0ZnM2NAorCitleHRlcm4gaW50IF9fZnN0YXRmczY0KGludCwgc2l6ZV90LCBzdHJ1Y3Qgc3RhdGZzICopOworCitpbnQgZnN0YXRmcyhpbnQgZmQsIHN0cnVjdCBzdGF0ZnMgKmJ1ZikKK3sKKwlyZXR1cm4gX19mc3RhdGZzNjQoZmQsIHNpemVvZiAqYnVmLCBidWYpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9md3JpdGUuYyBiL3Vzci9rbGliYy9md3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE4ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2Z3cml0ZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBmd3JpdGUuYworICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3NpemVfdCBfZndyaXRlKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBGSUxFICpmKQoreworCXNpemVfdCBieXRlcyA9IDA7CisJc3NpemVfdCBydjsKKwljb25zdCBjaGFyICpwID0gYnVmOworCisJd2hpbGUgKGNvdW50KSB7CisJCXJ2ID0gd3JpdGUoZmlsZW5vKGYpLCBwLCBjb3VudCk7CisJCWlmIChydiA9PSAtMSkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKSB7CisJCQkJZXJybm8gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocnYgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlwICs9IHJ2OworCQlieXRlcyArPSBydjsKKwkJY291bnQgLT0gcnY7CisJfQorCisJcmV0dXJuIGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2Z3cml0ZTIuYyBiL3Vzci9rbGliYy9md3JpdGUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYjBhNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9md3JpdGUyLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGZ3cml0ZTIuYworICoKKyAqIFRoZSBhY3R1YWwgZndyaXRlKCkgZnVuY3Rpb24gYXMgYSBub24taW5saW5lCisgKi8KKworI2RlZmluZSBfX05PX0ZSRUFEX0ZXUklURV9JTkxJTkVTCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc2l6ZV90IGZ3cml0ZShjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIEZJTEUgKiBmKQoreworCXJldHVybiBfZndyaXRlKHB0ciwgc2l6ZSAqIG5tZW1iLCBmKSAvIHNpemU7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2V0Y3dkLmMgYi91c3Iva2xpYmMvZ2V0Y3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlYzgxMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9nZXRjd2QuYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogZ2V0Y3dkLmMKKyAqCisgKiBUaGUgc3lzdGVtIGNhbGwgYmVoYXZlcyBkaWZmZXJlbnRseSB0aGFuIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCitleHRlcm4gaW50IF9fZ2V0Y3dkKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworCitjaGFyICpnZXRjd2QoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gKF9fZ2V0Y3dkKGJ1Ziwgc2l6ZSkgPCAwKSA/IE5VTEwgOiBidWY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2V0ZG9tYWlubmFtZS5jIGIvdXNyL2tsaWJjL2dldGRvbWFpbm5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTcyMmNhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dldGRvbWFpbm5hbWUuYwpAQCAtMCwwICsxLDI1IEBACisvKgorICogZ2V0ZG9tYWlubmFtZS5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworaW50IGdldGRvbWFpbm5hbWUoY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdXRzbmFtZSB1bjsKKworCWlmICghdW5hbWUoJnVuKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGxlbiA8IHN0cmxlbih1bi5kb21haW5uYW1lKSArIDEpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJjcHkobmFtZSwgdW4uZG9tYWlubmFtZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9nZXRlbnYuYyBiL3Vzci9rbGliYy9nZXRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRhZTVlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dldGVudi5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBnZXRlbnYuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworY2hhciAqZ2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqKnAsICpxOworCWludCBsZW4gPSBzdHJsZW4obmFtZSk7CisKKwlpZiAoIWVudmlyb24pCisJCXJldHVybiBOVUxMOworCisJZm9yIChwID0gZW52aXJvbjsgKHEgPSAqcCk7IHArKykgeworCQlpZiAoIXN0cm5jbXAobmFtZSwgcSwgbGVuKSAmJiBxW2xlbl0gPT0gJz0nKSB7CisJCQlyZXR1cm4gcSArIChsZW4gKyAxKTsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2dldGhvc3RuYW1lLmMgYi91c3Iva2xpYmMvZ2V0aG9zdG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI2YjVmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2dldGhvc3RuYW1lLmMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIGdldGhvc3RuYW1lLmMKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCitpbnQgZ2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgdXRzbmFtZSB1bjsKKworCWlmICghdW5hbWUoJnVuKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGxlbiA8IHN0cmxlbih1bi5ub2RlbmFtZSkgKyAxKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RyY3B5KG5hbWUsIHVuLm5vZGVuYW1lKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2dldG9wdC5jIGIvdXNyL2tsaWJjL2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjczNWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZ2V0b3B0LmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIGdldG9wdC5jCisgKgorICogU2ltcGxlIFBPU0lYIGdldG9wdCgpLCBubyBHTlUgZXh0ZW5zaW9ucy4uLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqb3B0YXJnOworaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CitzdGF0aWMgc3RydWN0IGdldG9wdF9wcml2YXRlX3N0YXRlIHsKKwljb25zdCBjaGFyICpvcHRwdHI7CisJY29uc3QgY2hhciAqbGFzdF9vcHRzdHJpbmc7CisJY2hhciAqY29uc3QgKmxhc3RfYXJndjsKK30gcHZ0OworCitpbnQgZ2V0b3B0KGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndiwgY29uc3QgY2hhciAqb3B0c3RyaW5nKQoreworCWNvbnN0IGNoYXIgKmNhcmc7CisJY29uc3QgY2hhciAqb3NwdHI7CisJaW50IG9wdDsKKworCS8qIGdldG9wdCgpIHJlbGllcyBvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgZ2xvYmFsIHN0YXRlCisJICAgdmFyaWFibGVzLCB3aGljaCBjYW4gbWFrZSB0aGlzIHJlYWxseSBjb25mdXNpbmcgaWYgdGhlcmUgaXMKKwkgICBtb3JlIHRoYW4gb25lIHVzZSBvZiBnZXRvcHQoKSBpbiB0aGUgc2FtZSBwcm9ncmFtLiAgVGhpcworCSAgIGF0dGVtcHRzIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbiBieSBkZXRlY3RpbmcgaWYgdGhlCisJICAgIm9wdHN0cmluZyIgb3IgImFyZ3YiIGFyZ3VtZW50IGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUKKwkgICB3ZSB3ZXJlIGNhbGxlZDsgaWYgc28sIHJlaW5pdGlhbGl6ZSB0aGUgcXVlcnkgc3RhdGUuICovCisKKwlpZiAob3B0c3RyaW5nICE9IHB2dC5sYXN0X29wdHN0cmluZyB8fCBhcmd2ICE9IHB2dC5sYXN0X2FyZ3YgfHwKKwkgICAgb3B0aW5kIDwgMSB8fCBvcHRpbmQgPiBhcmdjKSB7CisJCS8qIG9wdGluZCBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHF1ZXJ5ICovCisJCXB2dC5sYXN0X29wdHN0cmluZyA9IG9wdHN0cmluZzsKKwkJcHZ0Lmxhc3RfYXJndiA9IGFyZ3Y7CisJCW9wdGluZCA9IDE7CisJCXB2dC5vcHRwdHIgPSBOVUxMOworCX0KKworCWNhcmcgPSBhcmd2W29wdGluZF07CisKKwkvKiBGaXJzdCwgZWxpbWluYXRlIGFsbCBub24tb3B0aW9uIGNhc2VzICovCisKKwlpZiAoIWNhcmcgfHwgY2FyZ1swXSAhPSAnLScgfHwgIWNhcmdbMV0pIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjYXJnWzFdID09ICctJyAmJiAhY2FyZ1syXSkgeworCQlvcHRpbmQrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICgodWludHB0cl90KSAocHZ0Lm9wdHB0ciAtIGNhcmcpID4gKHVpbnRwdHJfdCkgc3RybGVuKGNhcmcpKSB7CisJCS8qIFNvbWVvbmUgZnJvYmJlZCBvcHRpbmQsIGNoYW5nZSB0byBuZXcgb3B0LiAqLworCQlwdnQub3B0cHRyID0gY2FyZyArIDE7CisJfQorCisJb3B0ID0gKnB2dC5vcHRwdHIrKzsKKworCWlmIChvcHQgIT0gJzonICYmIChvc3B0ciA9IHN0cmNocihvcHRzdHJpbmcsIG9wdCkpKSB7CisJCWlmIChvc3B0clsxXSA9PSAnOicpIHsKKwkJCWlmICgqcHZ0Lm9wdHB0cikgeworCQkJCS8qIEFyZ3VtZW50LXRha2luZyBvcHRpb24gd2l0aCBhdHRhY2hlZAorCQkJCSAgIGFyZ3VtZW50ICovCisJCQkJb3B0YXJnID0gKGNoYXIgKilwdnQub3B0cHRyOworCQkJCW9wdGluZCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBcmd1bWVudC10YWtpbmcgb3B0aW9uIHdpdGggbm9uLWF0dGFjaGVkCisJCQkJICAgYXJndW1lbnQgKi8KKwkJCQlpZiAoYXJndltvcHRpbmQgKyAxXSkgeworCQkJCQlvcHRhcmcgPSAoY2hhciAqKWFyZ3Zbb3B0aW5kKzFdOworCQkJCQlvcHRpbmQgKz0gMjsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBNaXNzaW5nIGFyZ3VtZW50ICovCisJCQkJCW9wdGluZCsrOworCQkJCQlyZXR1cm4gKG9wdHN0cmluZ1swXSA9PSAnOicpCisJCQkJCQk/ICc6JyA6ICc/JzsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gb3B0OworCQl9IGVsc2UgeworCQkJLyogTm9uLWFyZ3VtZW50LXRha2luZyBvcHRpb24gKi8KKwkJCS8qIHB2dC5vcHRwdHIgd2lsbCByZW1lbWJlciB0aGUgZXhhY3QgcG9zaXRpb24gdG8KKwkJCSAgIHJlc3VtZSBhdCAqLworCQkJaWYgKCEqcHZ0Lm9wdHB0cikKKwkJCQlvcHRpbmQrKzsKKwkJCXJldHVybiBvcHQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG9wdGlvbiAqLworCQlvcHRvcHQgPSBvcHQ7CisJCWlmICghKnB2dC5vcHRwdHIpCisJCQlvcHRpbmQrKzsKKwkJcmV0dXJuICc/JzsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2V0b3B0X2xvbmcuYyBiL3Vzci9rbGliYy9nZXRvcHRfbG9uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDA2NGIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZ2V0b3B0X2xvbmcuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIGdldG9wdC5jCisgKgorICogZ2V0b3B0X2xvbmcoKSwgb3IgYXQgbGVhc3QgYSBjb21tb24gc3Vic2V0IHRoZXJlb2Y6CisgKgorICogLSBPcHRpb24gcmVvcmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkCisgKiAtIC1XIGZvbyBpcyBub3Qgc3VwcG9ydGVkCisgKiAtIEZpcnN0IG9wdHN0cmluZyBjaGFyYWN0ZXIgIi0iIG5vdCBzdXBwb3J0ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCitjaGFyICpvcHRhcmc7CitpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKK3N0YXRpYyBzdHJ1Y3QgZ2V0b3B0X3ByaXZhdGVfc3RhdGUgeworCWNvbnN0IGNoYXIgKm9wdHB0cjsKKwljb25zdCBjaGFyICpsYXN0X29wdHN0cmluZzsKKwljaGFyICpjb25zdCAqbGFzdF9hcmd2OworfSBwdnQ7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqb3B0aW9uX21hdGNoZXMoY29uc3QgY2hhciAqYXJnX3N0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKm9wdF9uYW1lKQoreworCXdoaWxlICgqYXJnX3N0ciAhPSAnXDAnICYmICphcmdfc3RyICE9ICc9JykgeworCQlpZiAoKmFyZ19zdHIrKyAhPSAqb3B0X25hbWUrKykKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmICgqb3B0X25hbWUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGFyZ19zdHI7Cit9CisKK2ludCBnZXRvcHRfbG9uZyhpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKm9wdHN0cmluZywKKwkJY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMsIGludCAqbG9uZ2luZGV4KQoreworCWNvbnN0IGNoYXIgKmNhcmc7CisJY29uc3QgY2hhciAqb3NwdHI7CisJaW50IG9wdDsKKworCS8qIGdldG9wdCgpIHJlbGllcyBvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgZ2xvYmFsIHN0YXRlCisJICAgdmFyaWFibGVzLCB3aGljaCBjYW4gbWFrZSB0aGlzIHJlYWxseSBjb25mdXNpbmcgaWYgdGhlcmUgaXMKKwkgICBtb3JlIHRoYW4gb25lIHVzZSBvZiBnZXRvcHQoKSBpbiB0aGUgc2FtZSBwcm9ncmFtLiAgVGhpcworCSAgIGF0dGVtcHRzIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbiBieSBkZXRlY3RpbmcgaWYgdGhlCisJICAgIm9wdHN0cmluZyIgb3IgImFyZ3YiIGFyZ3VtZW50IGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUKKwkgICB3ZSB3ZXJlIGNhbGxlZDsgaWYgc28sIHJlaW5pdGlhbGl6ZSB0aGUgcXVlcnkgc3RhdGUuICovCisKKwlpZiAob3B0c3RyaW5nICE9IHB2dC5sYXN0X29wdHN0cmluZyB8fCBhcmd2ICE9IHB2dC5sYXN0X2FyZ3YgfHwKKwkgICAgb3B0aW5kIDwgMSB8fCBvcHRpbmQgPiBhcmdjKSB7CisJCS8qIG9wdGluZCBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHF1ZXJ5ICovCisJCXB2dC5sYXN0X29wdHN0cmluZyA9IG9wdHN0cmluZzsKKwkJcHZ0Lmxhc3RfYXJndiA9IGFyZ3Y7CisJCW9wdGluZCA9IDE7CisJCXB2dC5vcHRwdHIgPSBOVUxMOworCX0KKworCWNhcmcgPSBhcmd2W29wdGluZF07CisKKwkvKiBGaXJzdCwgZWxpbWluYXRlIGFsbCBub24tb3B0aW9uIGNhc2VzICovCisKKwlpZiAoIWNhcmcgfHwgY2FyZ1swXSAhPSAnLScgfHwgIWNhcmdbMV0pCisJCXJldHVybiAtMTsKKworCWlmIChjYXJnWzFdID09ICctJykgeworCQljb25zdCBzdHJ1Y3Qgb3B0aW9uICpsbzsKKwkJY29uc3QgY2hhciAqb3B0X2VuZCA9IE5VTEw7CisKKwkJb3B0aW5kKys7CisKKwkJLyogRWl0aGVyIGl0J3MgYSBsb25nIG9wdGlvbiwgb3IgaXQncyAtLSAqLworCQlpZiAoIWNhcmdbMl0pIHsKKwkJCS8qIEl0J3MgLS0gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWZvciAobG8gPSBsb25nb3B0czsgbG8tPm5hbWU7IGxvKyspIHsKKwkJCWlmICgob3B0X2VuZCA9IG9wdGlvbl9tYXRjaGVzKGNhcmcrMiwgbG8tPm5hbWUpKSkKKwkJCSAgICBicmVhazsKKwkJfQorCQlpZiAoIW9wdF9lbmQpCisJCQlyZXR1cm4gJz8nOworCisJCWlmIChsb25naW5kZXgpCisJCQkqbG9uZ2luZGV4ID0gbG8tbG9uZ29wdHM7CisKKwkJaWYgKCpvcHRfZW5kID09ICc9JykgeworCQkJaWYgKGxvLT5oYXNfYXJnKQorCQkJCW9wdGFyZyA9IChjaGFyICopb3B0X2VuZCsxOworCQkJZWxzZQorCQkJCXJldHVybiAnPyc7CisJCX0gZWxzZSBpZiAobG8tPmhhc19hcmcgPT0gMSkgeworCQkJaWYgKCEob3B0YXJnID0gYXJndltvcHRpbmRdKSkKKwkJCQlyZXR1cm4gJz8nOworCQkJb3B0aW5kKys7CisJCX0KKworCQlpZiAobG8tPmZsYWcpIHsKKwkJCSpsby0+ZmxhZyA9IGxvLT52YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBsby0+dmFsOworCQl9CisJfQorCisJaWYgKCh1aW50cHRyX3QpIChwdnQub3B0cHRyIC0gY2FyZykgPiAodWludHB0cl90KSBzdHJsZW4oY2FyZykpIHsKKwkJLyogU29tZW9uZSBmcm9iYmVkIG9wdGluZCwgY2hhbmdlIHRvIG5ldyBvcHQuICovCisJCXB2dC5vcHRwdHIgPSBjYXJnICsgMTsKKwl9CisKKwlvcHQgPSAqcHZ0Lm9wdHB0cisrOworCisJaWYgKG9wdCAhPSAnOicgJiYgKG9zcHRyID0gc3RyY2hyKG9wdHN0cmluZywgb3B0KSkpIHsKKwkJaWYgKG9zcHRyWzFdID09ICc6JykgeworCQkJaWYgKCpwdnQub3B0cHRyKSB7CisJCQkJLyogQXJndW1lbnQtdGFraW5nIG9wdGlvbiB3aXRoIGF0dGFjaGVkCisJCQkJICAgYXJndW1lbnQgKi8KKwkJCQlvcHRhcmcgPSAoY2hhciAqKXB2dC5vcHRwdHI7CisJCQkJb3B0aW5kKys7CisJCQl9IGVsc2UgeworCQkJCS8qIEFyZ3VtZW50LXRha2luZyBvcHRpb24gd2l0aCBub24tYXR0YWNoZWQKKwkJCQkgICBhcmd1bWVudCAqLworCQkJCWlmIChhcmd2W29wdGluZCArIDFdKSB7CisJCQkJCW9wdGFyZyA9IChjaGFyICopYXJndltvcHRpbmQrMV07CisJCQkJCW9wdGluZCArPSAyOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE1pc3NpbmcgYXJndW1lbnQgKi8KKwkJCQkJb3B0aW5kKys7CisJCQkJCXJldHVybiAob3B0c3RyaW5nWzBdID09ICc6JykKKwkJCQkJCT8gJzonIDogJz8nOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBvcHQ7CisJCX0gZWxzZSB7CisJCQkvKiBOb24tYXJndW1lbnQtdGFraW5nIG9wdGlvbiAqLworCQkJLyogcHZ0Lm9wdHB0ciB3aWxsIHJlbWVtYmVyIHRoZSBleGFjdCBwb3NpdGlvbiB0bworCQkJICAgcmVzdW1lIGF0ICovCisJCQlpZiAoISpwdnQub3B0cHRyKQorCQkJCW9wdGluZCsrOworCQkJcmV0dXJuIG9wdDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFVua25vd24gb3B0aW9uICovCisJCW9wdG9wdCA9IG9wdDsKKwkJaWYgKCEqcHZ0Lm9wdHB0cikKKwkJCW9wdGluZCsrOworCQlyZXR1cm4gJz8nOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9nZXRwZ3JwLmMgYi91c3Iva2xpYmMvZ2V0cGdycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMGIxN2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZ2V0cGdycC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBnZXRwZ3JwLmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3BpZF90IGdldHBncnAodm9pZCkKK3sKKwlyZXR1cm4gZ2V0cGdpZCgwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9nZXRwcmlvcml0eS5jIGIvdXNyL2tsaWJjL2dldHByaW9yaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkNmUwNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9nZXRwcmlvcml0eS5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBnZXRwcmlvcml0eS5jCisgKgorICogTmVlZHMgdG8gZG8gc29tZSBwb3N0LXN5c2NhbGwgbWFuZ2xpbmcgdG8gZGlzdGluZ3Vpc2ggZXJyb3IgcmV0dXJucy4uLgorICogYnV0IG9ubHkgb24gc29tZSBwbGF0Zm9ybXMuICBTaWdoLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9faWE2NF9fKQorCitleHRlcm4gaW50IF9fZ2V0cHJpb3JpdHkoaW50LCBpbnQpOworCitpbnQgZ2V0cHJpb3JpdHkoaW50IHdoaWNoLCBpbnQgd2hvKQoreworCWludCBydiA9IF9fZ2V0cHJpb3JpdHkod2hpY2gsIHdobyk7CisJcmV0dXJuIChydiA8IDApID8gcnYgOiAyMC1ydjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvZ2V0cHQuYyBiL3Vzci9rbGliYy9nZXRwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2EzNzEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZ2V0cHQuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogZ2V0cHQuYworICoKKyAqIEdOVSBleHRlbnNpb24gdG8gdGhlIHN0YW5kYXJkIFVuaXg5OCBwdHkgc3VpdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworaW50IGdldHB0KHZvaWQpCit7CisJcmV0dXJuIG9wZW4oIi9kZXYvcHRteCIsIE9fUkRXUiB8IE9fTk9DVFRZKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9nbG9iYWxzLmMgYi91c3Iva2xpYmMvZ2xvYmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYWU5MWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvZ2xvYmFscy5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBnbG9iYWxzLmMKKyAqCisgKiBUaGVzZSBoYXZlIHRvIGJlIGRlZmluZWQgc29tZXdoZXJlLi4uCisgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgZXJybm87CitjaGFyICoqZW52aXJvbjsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9pbmV0L2JpbmRyZXN2cG9ydC5jIGIvdXNyL2tsaWJjL2luZXQvYmluZHJlc3Zwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyYzFjMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9pbmV0L2JpbmRyZXN2cG9ydC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBpbmV0L2JpbmRyZXN2cG9ydC5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBTVEFSVF9QT1JUCTc2OAorI2RlZmluZSBFTkRfUE9SVAlJUFBPUlRfUkVTRVJWRUQKKyNkZWZpbmUgTlVNX1BPUlRTCShFTkRfUE9SVCAtIFNUQVJUX1BPUlQpCisKK2ludCBiaW5kcmVzdnBvcnQoaW50IHNkLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gbWU7CisJc3RhdGljIHNob3J0IHBvcnQ7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAoc2luID09IE5VTEwpIHsKKwkJbWVtc2V0KCZtZSwgMCwgc2l6ZW9mKG1lKSk7CisJCXNpbiA9ICZtZTsKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwl9IGVsc2UgaWYgKHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCWVycm5vID0gRVBGTk9TVVBQT1JUOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHBvcnQgPT0gMCkKKwkJcG9ydCA9IFNUQVJUX1BPUlQgKyAoZ2V0cGlkKCkgJSBOVU1fUE9SVFMpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9QT1JUUzsgaSsrLCBwb3J0KyspIHsKKwkJaWYgKHBvcnQgPT0gRU5EX1BPUlQpCisJCQlwb3J0ID0gU1RBUlRfUE9SVDsKKwkJc2luLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisJCXJldCA9IGJpbmQoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKilzaW4sIHNpemVvZigqc2luKSk7CisJCWlmIChyZXQgIT0gLTEpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2luZXQvaW5ldF9hZGRyLmMgYi91c3Iva2xpYmMvaW5ldC9pbmV0X2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWY0NTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2luZXQvaW5ldF9hZGRyLmMKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIGluZXQvaW5ldF9hZGRyLmMKKyAqLworCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKwordWludDMyX3QgaW5ldF9hZGRyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBhOworCWludCBydiA9IGluZXRfYXRvbihzdHIsICZhKTsKKworCXJldHVybiBydiA/IElOQUREUl9OT05FIDogYS5zX2FkZHI7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvaW5ldC9pbmV0X2F0b24uYyBiL3Vzci9rbGliYy9pbmV0L2luZXRfYXRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2VlZWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvaW5ldC9pbmV0X2F0b24uYwpAQCAtMCwwICsxLDIyIEBACisvKgorICogaW5ldC9pbmV0X2F0b24uYworICovCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgaW5ldF9hdG9uKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IGluX2FkZHIgKmFkZHIpCit7CisJdW5pb24geworCQl1aW50OF90CSBiWzRdOworCQl1aW50MzJfdCBsOworCX0gYTsKKworCWlmIChzc2NhbmYoc3RyLCAiJWhodS4laGh1LiVoaHUuJWhodSIsCisJCSAgICZhLmJbMF0sICZhLmJbMV0sICZhLmJbMl0sICZhLmJbM10pID09IDQpIHsKKwkJYWRkci0+c19hZGRyID0gYS5sOwkvKiBBbHdheXMgaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9pbmV0L2luZXRfbnRvYS5jIGIvdXNyL2tsaWJjL2luZXQvaW5ldF9udG9hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiZjA1NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9pbmV0L2luZXRfbnRvYS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBpbmV0L2luZXRfbnRvYS5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2NoYXIgKmluZXRfbnRvYShzdHJ1Y3QgaW5fYWRkciBhZGRyKQoreworCXN0YXRpYyBjaGFyIG5hbWVbMTZdOworCWNvbnN0IHVpbnQ4X3QgKmNwID0gKGNvbnN0IHVpbnQ4X3QgKikgJmFkZHIuc19hZGRyOworCisJc3ByaW50ZihuYW1lLCAiJXUuJXUuJXUuJXUiLCBjcFswXSwgY3BbMV0sIGNwWzJdLCBjcFszXSk7CisJcmV0dXJuIG5hbWU7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvaW5ldC9pbmV0X250b3AuYyBiL3Vzci9rbGliYy9pbmV0L2luZXRfbnRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNmZiNDUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvaW5ldC9pbmV0X250b3AuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogaW5ldC9pbmV0X250b3AuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW42Lmg+CisKK2NvbnN0IGNoYXIgKmluZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKmNwLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IHhsZW47CisKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9JTkVUOgorCQl7CisJCQljb25zdCB1aW50OF90ICpicCA9IChjb25zdCB1aW50OF90ICopCisJCQkJJigoY29uc3Qgc3RydWN0IGluX2FkZHIgKiljcCktPnNfYWRkcjsKKworCQkJeGxlbiA9IHNucHJpbnRmKGJ1ZiwgbGVuLCAiJXUuJXUuJXUuJXUiLAorCQkJCQlicFswXSwgYnBbMV0sIGJwWzJdLCBicFszXSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFGX0lORVQ2OgorCQl7CisJCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnMgPSAoY29uc3Qgc3RydWN0IGluNl9hZGRyICopY3A7CisKKwkJCXhsZW4gPSBzbnByaW50ZihidWYsIGxlbiwgIiV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4IiwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzBdKSwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzFdKSwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzJdKSwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzNdKSwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzRdKSwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzVdKSwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzZdKSwKKwkJCQkJbnRvaHMocy0+czZfYWRkcjE2WzddKSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHhsZW4gPiBsZW4pIHsKKwkJZXJybm8gPSBFTk9TUEM7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvaW5ldC9pbmV0X3B0b24uYyBiL3Vzci9rbGliYy9pbmV0L2luZXRfcHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZmUxNmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvaW5ldC9pbmV0X3B0b24uYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogaW5ldC9pbmV0X3B0b24uYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luNi5oPgorCitzdGF0aWMgaW5saW5lIGludCBoZXh2YWwoaW50IGNoKQoreworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJCXJldHVybiBjaCAtICcwJzsKKwl9IGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHsKKwkJcmV0dXJuIGNoIC0gJ0EnICsgMTA7CisJfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7CisJCXJldHVybiBjaCAtICdhJyArIDEwOworCX0gZWxzZSB7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK2ludCBpbmV0X3B0b24oaW50IGFmLCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmRzdCkKK3sKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9JTkVUOgorCQlyZXR1cm4gaW5ldF9hdG9uKHNyYywgKHN0cnVjdCBpbl9hZGRyICopZHN0KTsKKworCWNhc2UgQUZfSU5FVDY6CisJCXsKKwkJCXN0cnVjdCBpbjZfYWRkciAqZCA9IChzdHJ1Y3QgaW42X2FkZHIgKilkc3Q7CisJCQlpbnQgY29sb25zID0gMCwgZGNvbG9ucyA9IDA7CisJCQlpbnQgaTsKKwkJCWNvbnN0IGNoYXIgKnA7CisKKwkJCS8qIEEgZG91YmxlIGNvbG9uIHdpbGwgaW5jcmVtZW50IGNvbG9ucyBieSAyLAorCQkJICAgZGNvbG9ucyBieSAxICovCisJCQlmb3IgKHAgPSBkc3Q7ICpwOyBwKyspIHsKKwkJCQlpZiAocFswXSA9PSAnOicpIHsKKwkJCQkJY29sb25zKys7CisJCQkJCWlmIChwWzFdID09ICc6JykKKwkJCQkJCWRjb2xvbnMrKzsKKwkJCQl9IGVsc2UgaWYgKCFpc3hkaWdpdCgqcCkpCisJCQkJCXJldHVybiAwOwkvKiBJbnZhbGlkIGFkZHJlc3MgKi8KKwkJCX0KKworCQkJaWYgKGNvbG9ucyA+IDcgfHwgZGNvbG9ucyA+IDEKKwkJCSAgICB8fCAoIWRjb2xvbnMgJiYgY29sb25zICE9IDcpKQorCQkJCXJldHVybiAwOwkvKiBJbnZhbGlkIGFkZHJlc3MgKi8KKworCQkJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKworCQkJaSA9IDA7CisJCQlmb3IgKHAgPSBkc3Q7ICpwOyBwKyspIHsKKwkJCQlpZiAoKnAgPT0gJzonKSB7CisJCQkJCWlmIChwWzFdID09ICc6JykgeworCQkJCQkJaSArPSAoOCAtIGNvbG9ucyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlkLT5zNl9hZGRyMTZbaV0gPQorCQkJCQkgICAgaHRvbnMoKG50b2hzKGQtPnM2X2FkZHIxNltpXSkgPDwgNCkKKwkJCQkJCSAgKyBoZXh2YWwoKnApKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiAxOworCQl9CisKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIC0xOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9pbnRlcnAuUyBiL3Vzci9rbGliYy9pbnRlcnAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjE1Y2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2ludGVycC5TCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgVGhpcyBpcyBhIGhhY2sgdG8gZ2VuZXJhdGUgdGhlIC5pbnRycCBzZWN0aW9uLCB3aGljaCB0aGVuCisjIGxkIHR1cm5zIGludG8gYW4gUFRfSU5URVJQIGhlYWRlci4KKyMKKyMgTk9URTogVGhlIC5pbnRlcnAgc2VjdGlvbiBuZWVkcyB0byBiZSAiYSIsIG9yIGl0IGRvZXNudCB3b3JrLi4uCisjCisKKyAgICAgICAgLnNlY3Rpb24gIi5pbnRlcnAiLCJhIgorICAgICAgICAuYXNjaWkgTElCRElSCisJLmFzY2lpICIva2xpYmMtIgorICAgICAgICAuYXNjaWkgU09IQVNICisgICAgICAgIC5hc2NpaSAiLnNvIgorICAgICAgICAuYnl0ZSAwCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvaXNhdHR5LmMgYi91c3Iva2xpYmMvaXNhdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhODRiNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9pc2F0dHkuYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogaXNhdHR5LmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK2ludCBpc2F0dHkoaW50IGZkKQoreworCWludCBvbGRfZXJybm8gPSBlcnJubzsKKwlpbnQgaXN0dHk7CisJcGlkX3QgZHVtbXk7CisKKwkvKiBBbGwgdHR5cyBzdXBwb3J0IFRJT0NHUEdSUCAqLworCWlzdHR5ID0gIWlvY3RsKGZkLCBUSU9DR1BHUlAsICZkdW1teSk7CisJZXJybm8gPSBvbGRfZXJybm87CisKKwlyZXR1cm4gaXN0dHk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvanJhbmQ0OC5jIGIvdXNyL2tsaWJjL2pyYW5kNDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJiM2FjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2pyYW5kNDguYwpAQCAtMCwwICsxLDI0IEBACisvKgorICoganJhbmQ0OC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitsb25nIGpyYW5kNDgodW5zaWduZWQgc2hvcnQgeHN1YmlbM10pCit7CisJdWludDY0X3QgeDsKKworCS8qIFRoZSB4c3ViaVtdIGFycmF5IGlzIGxpdHRsZWVuZGlhbiBieSBzcGVjICovCisJeCA9ICh1aW50NjRfdCkgKHVpbnQxNl90KSB4c3ViaVswXSArCisJICAgICgodWludDY0X3QpICh1aW50MTZfdCkgeHN1YmlbMV0gPDwgMTYpICsKKwkgICAgKCh1aW50NjRfdCkgKHVpbnQxNl90KSB4c3ViaVsyXSA8PCAzMik7CisKKwl4ID0gKDB4NWRlZWNlNjZkVUxMICogeCkgKyAweGI7CisKKwl4c3ViaVswXSA9ICh1bnNpZ25lZCBzaG9ydCkodWludDE2X3QpIHg7CisJeHN1YmlbMV0gPSAodW5zaWduZWQgc2hvcnQpKHVpbnQxNl90KSAoeCA+PiAxNik7CisJeHN1YmlbMl0gPSAodW5zaWduZWQgc2hvcnQpKHVpbnQxNl90KSAoeCA+PiAzMik7CisKKwlyZXR1cm4gKGxvbmcpKGludDMyX3QpICh4ID4+IDE2KTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJjX2luaXQuYyBiL3Vzci9rbGliYy9saWJjX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQ2MGNlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmNfaW5pdC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogbGliY19pbml0LmMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSByYXcgZGF0YSBibG9jayBzZXQgdXAgYnkgdGhlIEVMRiBsb2FkZXIKKyAqIGluIHRoZSBrZXJuZWwgYW5kIHBhcnNlcyBpdC4gIEl0IGlzIGludm9rZWQgYnkgY3J0MC5TIHdoaWNoIG1ha2VzCisgKiBhbnkgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGFuZCBwYXNzZXMgY2FsbHMgdGhpcyBmdW5jdGlvbiB1c2luZworICogdGhlIHN0YW5kYXJkIEMgY2FsbGluZyBjb252ZW50aW9uLgorICoKKyAqIFRoZSBhcmd1bWVudHMgYXJlOgorICogIHVpbnRwdHJfdCAqZWxmZGF0YQkgLS0gVGhlIEVMRiBsb2FkZXIgZGF0YSBibG9jazsgdXN1YWxseSBmcm9tIHRoZSBzdGFjay4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIGFyZ2MuCisgKiAgdm9pZCAoKm9uZXhpdCkodm9pZCkgLS0gRnVuY3Rpb24gdG8gaW5zdGFsbCBpbnRvIG9uZXhpdAorICovCisKKy8qCisgKiBTZXZlcmFsIExpbnV4IEFCSXMgZG9uJ3QgcGFzcyB0aGUgb25leGl0IHBvaW50ZXIsIGFuZCB0aGUgb25lcyB0aGF0CisgKiBkbyBuZXZlciB1c2UgaXQuICBUaGVyZWZvcmUsIHVubGVzcyBVU0VfT05FWElUIGlzIGRlZmluZWQsIHdlIGp1c3QKKyAqIGlnbm9yZSB0aGUgb25leGl0IHBvaW50ZXIuCisgKi8KKy8qICNkZWZpbmUgVVNFX09ORVhJVCAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlICJhdGV4aXQuaCIKKworLyogVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGZyb20gX19zdGF0aWNfaW5pdC5jIG9yIF9fc2hhcmVkX2luaXQuYyAqLworI2lmbmRlZiBTSEFSRUQKKyMgZXJyb3IgIlNIQVJFRCBzaG91bGQgYmUgZGVmaW5lZCB0byAwIG9yIDEiCisjZW5kaWYKKworY2hhciAqKmVudmlyb247Cit1bnNpZ25lZCBpbnQgX19wYWdlX3NpemUsIF9fcGFnZV9zaGlmdDsKKworc3RydWN0IGF1eGVudHJ5IHsKKwl1aW50cHRyX3QgdHlwZTsKKwl1aW50cHRyX3QgdjsKK307CisKK19fbm9yZXR1cm4gX19saWJjX2luaXQodWludHB0cl90ICogZWxmZGF0YSwgdm9pZCAoKm9uZXhpdCkgKHZvaWQpKQoreworCWludCBhcmdjOworCWNoYXIgKiphcmd2LCAqKmVudnAsICoqZW52ZW5kOworCXN0cnVjdCBhdXhlbnRyeSAqYXV4ZW50cnk7CisjaWYgU0hBUkVECisJdHlwZWRlZiBpbnQgKCptYWluX3QpIChpbnQsIGNoYXIgKiosIGNoYXIgKiopOworCW1haW5fdCBNQUlOID0gTlVMTDsKKyNlbHNlCisJZXh0ZXJuIGludCBtYWluKGludCwgY2hhciAqKiwgY2hhciAqKik7CisjZGVmaW5lIE1BSU4gbWFpbgorI2VuZGlmCisJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IDAsIHBhZ2Vfc2hpZnQgPSAwOworCisjaWZkZWYgVVNFX09ORVhJVAorCWlmIChvbmV4aXQpIHsKKwkJc3RhdGljIHN0cnVjdCBhdGV4aXQgYXRfZXhpdDsKKworCQlhdF9leGl0LmZjdG4gPSAodm9pZCAoKikoaW50LCB2b2lkICopKW9uZXhpdDsKKwkJLyogYXRfZXhpdC5uZXh0ID0gTlVMTCBhbHJlYWR5ICovCisJCV9fYXRleGl0X2xpc3QgPSAmYXRfZXhpdDsKKwl9CisjZWxzZQorCSh2b2lkKW9uZXhpdDsJCS8qIElnbm9yZSB0aGlzLi4uICovCisjZW5kaWYKKworCWFyZ2MgPSAoaW50KSplbGZkYXRhKys7CisJYXJndiA9IChjaGFyICoqKWVsZmRhdGE7CisJZW52cCA9IGFyZ3YgKyAoYXJnYyArIDEpOworCisJLyogVGhlIGF1eGlsbGFyeSBlbnRyeSB2ZWN0b3IgaXMgYWZ0ZXIgYWxsIHRoZSBlbnZpcm9ubWVudCB2YXJzICovCisJZm9yIChlbnZlbmQgPSBlbnZwOyAqZW52ZW5kOyBlbnZlbmQrKykgOworCWF1eGVudHJ5ID0gKHN0cnVjdCBhdXhlbnRyeSAqKShlbnZlbmQgKyAxKTsKKworCXdoaWxlIChhdXhlbnRyeS0+dHlwZSkgeworCQlzd2l0Y2ggKGF1eGVudHJ5LT50eXBlKSB7CisjaWYgU0hBUkVECisJCWNhc2UgQVRfRU5UUlk6CisJCQlNQUlOID0gKG1haW5fdCkgKGF1eGVudHJ5LT52KTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQVRfUEFHRVNaOgorCQkJcGFnZV9zaXplID0gKHVuc2lnbmVkIGludCkoYXV4ZW50cnktPnYpOworCQkJYnJlYWs7CisJCX0KKwkJYXV4ZW50cnkrKzsKKwl9CisKKwlfX3BhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKworI2lmIF9fR05VQ19fID49IDQKKwkvKiB1bnNpZ25lZCBpbnQgaXMgMzIgYml0cyBvbiBhbGwgb3VyIGFyY2hpdGVjdHVyZXMgKi8KKwlwYWdlX3NoaWZ0ID0gX19idWlsdGluX2NseihwYWdlX3NpemUpIF4gMzE7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisgICAgICBhc20oImJzcmwgJTEsJTAiOiAiPXIiKHBhZ2Vfc2hpZnQpOiJyIihwYWdlX3NpemUpKTsKKyNlbHNlCisJd2hpbGUgKHBhZ2Vfc2l6ZSA+IDEpIHsKKwkJcGFnZV9zaGlmdCsrOworCQlwYWdlX3NpemUgPj49IDE7CisJfQorI2VuZGlmCisJX19wYWdlX3NoaWZ0ID0gcGFnZV9zaGlmdDsKKworCWVudmlyb24gPSBlbnZwOworCWV4aXQoTUFJTihhcmdjLCBhcmd2LCBlbnZwKSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fYXNobGRpMy5jIGIvdXNyL2tsaWJjL2xpYmdjYy9fX2FzaGxkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkzN2YwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX2FzaGxkaTMuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogbGliZ2NjL19fYXNobGRpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCit1aW50NjRfdCBfX2FzaGxkaTModWludDY0X3QgdiwgaW50IGNudCkKK3sKKwlpbnQgYyA9IGNudCAmIDMxOworCXVpbnQzMl90IHZsID0gKHVpbnQzMl90KSB2OworCXVpbnQzMl90IHZoID0gKHVpbnQzMl90KSAodiA+PiAzMik7CisKKwlpZiAoY250ICYgMzIpIHsKKwkJdmggPSAodmwgPDwgYyk7CisJCXZsID0gMDsKKwl9IGVsc2UgeworCQl2aCA9ICh2aCA8PCBjKSArICh2bCA+PiAoMzIgLSBjKSk7CisJCXZsID0gKHZsIDw8IGMpOworCX0KKworCXJldHVybiAoKHVpbnQ2NF90KSB2aCA8PCAzMikgKyB2bDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX19hc2hyZGkzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fYXNocmRpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTZkMTgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbGliZ2NjL19fYXNocmRpMy5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBsaWJnY2MvX19hc2hyZGkzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3VpbnQ2NF90IF9fYXNocmRpMyh1aW50NjRfdCB2LCBpbnQgY250KQoreworCWludCBjID0gY250ICYgMzE7CisJdWludDMyX3QgdmwgPSAodWludDMyX3QpIHY7CisJdWludDMyX3QgdmggPSAodWludDMyX3QpICh2ID4+IDMyKTsKKworCWlmIChjbnQgJiAzMikgeworCQl2bCA9ICgoaW50MzJfdCkgdmggPj4gYyk7CisJCXZoID0gKGludDMyX3QpIHZoID4+IDMxOworCX0gZWxzZSB7CisJCXZsID0gKHZsID4+IGMpICsgKHZoIDw8ICgzMiAtIGMpKTsKKwkJdmggPSAoKGludDMyX3QpIHZoID4+IGMpOworCX0KKworCXJldHVybiAoKHVpbnQ2NF90KSB2aCA8PCAzMikgKyB2bDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX19jbHpzaTIuYyBiL3Vzci9rbGliYy9saWJnY2MvX19jbHpzaTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmIxMWYwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX2NsenNpMi5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBsaWJnY2MvX19jbHpzaTIuYworICoKKyAqIFJldHVybnMgdGhlIGxlYWRpbmcgbnVtYmVyIG9mIDAgYml0cyBpbiB0aGUgYXJndW1lbnQKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3VpbnQzMl90IF9fY2x6c2kyKHVpbnQzMl90IHYpCit7CisJaW50IHAgPSAzMTsKKworCWlmICh2ICYgMHhmZmZmMDAwMCkgeworCQlwIC09IDE2OworCQl2ID4+PSAxNjsKKwl9CisJaWYgKHYgJiAweGZmMDApIHsKKwkJcCAtPSA4OworCQl2ID4+PSA4OworCX0KKwlpZiAodiAmIDB4ZjApIHsKKwkJcCAtPSA0OworCQl2ID4+PSA0OworCX0KKwlpZiAodiAmIDB4YykgeworCQlwIC09IDI7CisJCXYgPj49IDI7CisJfQorCWlmICh2ICYgMHgyKSB7CisJCXAgLT0gMTsKKwkJdiA+Pj0gMTsKKwl9CisKKwlyZXR1cm4gcDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX19kaXZkaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX19kaXZkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzNmZTYzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX2RpdmRpMy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBhcmNoL2kzODYvbGliZ2NjL19fZGl2ZGkzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50NjRfdCBfX3VkaXZtb2RkaTQodWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4sIHVpbnQ2NF90ICogcmVtKTsKKworaW50NjRfdCBfX2RpdmRpMyhpbnQ2NF90IG51bSwgaW50NjRfdCBkZW4pCit7CisJaW50IG1pbnVzID0gMDsKKwlpbnQ2NF90IHY7CisKKwlpZiAobnVtIDwgMCkgeworCQludW0gPSAtbnVtOworCQltaW51cyA9IDE7CisJfQorCWlmIChkZW4gPCAwKSB7CisJCWRlbiA9IC1kZW47CisJCW1pbnVzIF49IDE7CisJfQorCisJdiA9IF9fdWRpdm1vZGRpNChudW0sIGRlbiwgTlVMTCk7CisJaWYgKG1pbnVzKQorCQl2ID0gLXY7CisKKwlyZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX19kaXZzaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX19kaXZzaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQyMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX2RpdnNpMy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBsaWJnY2MvX19kaXZzaTMuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIHVpbnQzMl90IF9fdWRpdm1vZHNpNCh1aW50MzJfdCBudW0sIHVpbnQzMl90IGRlbiwgdWludDMyX3QgKiByZW0pOworCitpbnQzMl90IF9fZGl2c2kzKGludDMyX3QgbnVtLCBpbnQzMl90IGRlbikKK3sKKwlpbnQgbWludXMgPSAwOworCWludDMyX3QgdjsKKworCWlmIChudW0gPCAwKSB7CisJCW51bSA9IC1udW07CisJCW1pbnVzID0gMTsKKwl9CisJaWYgKGRlbiA8IDApIHsKKwkJZGVuID0gLWRlbjsKKwkJbWludXMgXj0gMTsKKwl9CisKKwl2ID0gX191ZGl2bW9kc2k0KG51bSwgZGVuLCBOVUxMKTsKKwlpZiAobWludXMpCisJCXYgPSAtdjsKKworCXJldHVybiB2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xpYmdjYy9fX2xzaHJkaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX19sc2hyZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZTFmMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX19sc2hyZGkzLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGxpYmdjYy9fX2xzaHJkaTMuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwordWludDY0X3QgX19sc2hyZGkzKHVpbnQ2NF90IHYsIGludCBjbnQpCit7CisJaW50IGMgPSBjbnQgJiAzMTsKKwl1aW50MzJfdCB2bCA9ICh1aW50MzJfdCkgdjsKKwl1aW50MzJfdCB2aCA9ICh1aW50MzJfdCkgKHYgPj4gMzIpOworCisJaWYgKGNudCAmIDMyKSB7CisJCXZsID0gKHZoID4+IGMpOworCQl2aCA9IDA7CisJfSBlbHNlIHsKKwkJdmwgPSAodmwgPj4gYykgKyAodmggPDwgKDMyIC0gYykpOworCQl2aCA9ICh2aCA+PiBjKTsKKwl9CisKKwlyZXR1cm4gKCh1aW50NjRfdCkgdmggPDwgMzIpICsgdmw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fbW9kZGkzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fbW9kZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3ZWQ5OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX19tb2RkaTMuYwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX21vZGRpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitleHRlcm4gdWludDY0X3QgX191ZGl2bW9kZGk0KHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLCB1aW50NjRfdCAqIHJlbSk7CisKK2ludDY0X3QgX19tb2RkaTMoaW50NjRfdCBudW0sIGludDY0X3QgZGVuKQoreworCWludCBtaW51cyA9IDA7CisJaW50NjRfdCB2OworCisJaWYgKG51bSA8IDApIHsKKwkJbnVtID0gLW51bTsKKwkJbWludXMgPSAxOworCX0KKwlpZiAoZGVuIDwgMCkgeworCQlkZW4gPSAtZGVuOworCQltaW51cyBePSAxOworCX0KKworCSh2b2lkKV9fdWRpdm1vZGRpNChudW0sIGRlbiwgKHVpbnQ2NF90ICopICYgdik7CisJaWYgKG1pbnVzKQorCQl2ID0gLXY7CisKKwlyZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX19tb2RzaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX19tb2RzaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2EyMWJhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX21vZHNpMy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBsaWJnY2MvX19tb2RzaTMuYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIHVpbnQzMl90IF9fdWRpdm1vZHNpNCh1aW50MzJfdCBudW0sIHVpbnQzMl90IGRlbiwgdWludDMyX3QgKiByZW0pOworCitpbnQzMl90IF9fbW9kc2kzKGludDMyX3QgbnVtLCBpbnQzMl90IGRlbikKK3sKKwlpbnQgbWludXMgPSAwOworCWludDMyX3QgdjsKKworCWlmIChudW0gPCAwKSB7CisJCW51bSA9IC1udW07CisJCW1pbnVzID0gMTsKKwl9CisJaWYgKGRlbiA8IDApIHsKKwkJZGVuID0gLWRlbjsKKwkJbWludXMgXj0gMTsKKwl9CisKKwkodm9pZClfX3VkaXZtb2RzaTQobnVtLCBkZW4sICh1aW50MzJfdCAqKSAmIHYpOworCWlmIChtaW51cykKKwkJdiA9IC12OworCisJcmV0dXJuIHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fdWRpdmRpMy5jIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWVhNDYxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZkaTMuYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogYXJjaC9pMzg2L2xpYmdjYy9fX2RpdmRpMy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitleHRlcm4gdWludDY0X3QgX191ZGl2bW9kZGk0KHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLCB1aW50NjRfdCAqIHJlbSk7CisKK3VpbnQ2NF90IF9fdWRpdmRpMyh1aW50NjRfdCBudW0sIHVpbnQ2NF90IGRlbikKK3sKKwlyZXR1cm4gX191ZGl2bW9kZGk0KG51bSwgZGVuLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX191ZGl2bW9kZGk0LmMgYi91c3Iva2xpYmMvbGliZ2NjL19fdWRpdm1vZGRpNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODYxMTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbGliZ2NjL19fdWRpdm1vZGRpNC5jCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDxrbGliYy9kaXZlcnIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordWludDY0X3QgX191ZGl2bW9kZGk0KHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuLCB1aW50NjRfdCAqIHJlbV9wKQoreworCXVpbnQ2NF90IHF1b3QgPSAwLCBxYml0ID0gMTsKKworCWlmIChkZW4gPT0gMCkgeworCQlfX2RpdmlkZV9lcnJvcigpOworCQlyZXR1cm4gMDsJLyogSWYgdHJhcCByZXR1cm5zLi4uICovCisJfQorCisJLyogTGVmdC1qdXN0aWZ5IGRlbm9taW5hdG9yIGFuZCBjb3VudCBzaGlmdCAqLworCXdoaWxlICgoaW50NjRfdCkgZGVuID49IDApIHsKKwkJZGVuIDw8PSAxOworCQlxYml0IDw8PSAxOworCX0KKworCXdoaWxlIChxYml0KSB7CisJCWlmIChkZW4gPD0gbnVtKSB7CisJCQludW0gLT0gZGVuOworCQkJcXVvdCArPSBxYml0OworCQl9CisJCWRlbiA+Pj0gMTsKKwkJcWJpdCA+Pj0gMTsKKwl9CisKKwlpZiAocmVtX3ApCisJCSpyZW1fcCA9IG51bTsKKworCXJldHVybiBxdW90OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZtb2RzaTQuYyBiL3Vzci9rbGliYy9saWJnY2MvX191ZGl2bW9kc2k0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5ODBmMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX191ZGl2bW9kc2k0LmMKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgPGtsaWJjL2RpdmVyci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1aW50MzJfdCBfX3VkaXZtb2RzaTQodWludDMyX3QgbnVtLCB1aW50MzJfdCBkZW4sIHVpbnQzMl90ICogcmVtX3ApCit7CisJdWludDMyX3QgcXVvdCA9IDAsIHFiaXQgPSAxOworCisJaWYgKGRlbiA9PSAwKSB7CisJCV9fZGl2aWRlX2Vycm9yKCk7CisJCXJldHVybiAwOwkvKiBJZiB0cmFwIHJldHVybnMuLi4gKi8KKwl9CisKKwkvKiBMZWZ0LWp1c3RpZnkgZGVub21pbmF0b3IgYW5kIGNvdW50IHNoaWZ0ICovCisJd2hpbGUgKChpbnQzMl90KSBkZW4gPj0gMCkgeworCQlkZW4gPDw9IDE7CisJCXFiaXQgPDw9IDE7CisJfQorCisJd2hpbGUgKHFiaXQpIHsKKwkJaWYgKGRlbiA8PSBudW0pIHsKKwkJCW51bSAtPSBkZW47CisJCQlxdW90ICs9IHFiaXQ7CisJCX0KKwkJZGVuID4+PSAxOworCQlxYml0ID4+PSAxOworCX0KKworCWlmIChyZW1fcCkKKwkJKnJlbV9wID0gbnVtOworCisJcmV0dXJuIHF1b3Q7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbGliZ2NjL19fdWRpdnNpMy5jIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZzaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjM1ZjNmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xpYmdjYy9fX3VkaXZzaTMuYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogbGliZ2NjL19fZGl2c2kzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50MzJfdCBfX3VkaXZtb2RzaTQodWludDMyX3QgbnVtLCB1aW50MzJfdCBkZW4sIHVpbnQzMl90ICogcmVtKTsKKwordWludDMyX3QgX191ZGl2c2kzKHVpbnQzMl90IG51bSwgdWludDMyX3QgZGVuKQoreworCXJldHVybiBfX3VkaXZtb2RzaTQobnVtLCBkZW4sIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xpYmdjYy9fX3Vtb2RkaTMuYyBiL3Vzci9rbGliYy9saWJnY2MvX191bW9kZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjNzU0YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9saWJnY2MvX191bW9kZGkzLmMKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGFyY2gvaTM4Ni9saWJnY2MvX191bW9kZGkzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50NjRfdCBfX3VkaXZtb2RkaTQodWludDY0X3QgbnVtLCB1aW50NjRfdCBkZW4sIHVpbnQ2NF90ICogcmVtKTsKKwordWludDY0X3QgX191bW9kZGkzKHVpbnQ2NF90IG51bSwgdWludDY0X3QgZGVuKQoreworCXVpbnQ2NF90IHY7CisKKwkodm9pZClfX3VkaXZtb2RkaTQobnVtLCBkZW4sICZ2KTsKKwlyZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9saWJnY2MvX191bW9kc2kzLmMgYi91c3Iva2xpYmMvbGliZ2NjL19fdW1vZHNpMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTZlM2MKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbGliZ2NjL19fdW1vZHNpMy5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBsaWJnY2MvX191bW9kc2kzLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiB1aW50MzJfdCBfX3VkaXZtb2RzaTQodWludDMyX3QgbnVtLCB1aW50MzJfdCBkZW4sIHVpbnQzMl90ICogcmVtKTsKKwordWludDMyX3QgX191bW9kc2kzKHVpbnQzMl90IG51bSwgdWludDMyX3QgZGVuKQoreworCXVpbnQzMl90IHY7CisKKwkodm9pZClfX3VkaXZtb2RzaTQobnVtLCBkZW4sICZ2KTsKKwlyZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9sbHNlZWsuYyBiL3Vzci9rbGliYy9sbHNlZWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Q4MTNiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL2xsc2Vlay5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBsbHNlZWsuYworICoKKyAqIE9uIDMyLWJpdCBwbGF0Zm9ybXMsIHdlIG5lZWQgdG8gdXNlIHRoZSBfbGxzZWVrKCkgc3lzdGVtIGNhbGwKKyAqIHJhdGhlciB0aGFuIGxzZWVrKCksIHRvIGJlIGFibGUgdG8gaGFuZGxlIGxhcmdlIGRpc2tzLiAgX2xsc2VlaygpCisgKiBpc24ndCBqdXN0IGEgbm9ybWFsIHN5c2NhbGwgd2hpY2ggdGFrZXMgYSA2NC1iaXQgYXJndW1lbnQ7IGl0IG5lZWRzCisgKiB0byByZXR1cm4gYSA2NC1iaXQgdmFsdWUgYW5kIHNvIHRha2VzIGFuIGV4dHJhIHBvaW50ZXIuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8Yml0c2l6ZS5oPgorCisjaWYgX0JJVFNJWkUgPT0gMzIKKworZXh0ZXJuIGludCBfX2xsc2VlayhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgaGksIHVuc2lnbmVkIGxvbmcgbG8sIG9mZl90ICogcmVzLAorCQkgICAgaW50IHdoZW5jZSk7CisKK29mZl90IGxzZWVrKGludCBmZCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworCW9mZl90IHJlc3VsdDsKKwlpbnQgcnY7CisKKwlydiA9IF9fbGxzZWVrKGZkLCAodW5zaWduZWQgbG9uZykob2Zmc2V0ID4+IDMyKSwgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0LAorCQkgICAgICAmcmVzdWx0LCB3aGVuY2UpOworCisJcmV0dXJuIHJ2ID8gKG9mZl90KSAtIDEgOiByZXN1bHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL2xyYW5kNDguYyBiL3Vzci9rbGliYy9scmFuZDQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmY2Y5MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9scmFuZDQ4LmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGxyYW5kNDguYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordW5zaWduZWQgc2hvcnQgX19yYW5kNDhfc2VlZFszXTsJLyogQ29tbW9uIHdpdGggbXJhbmQ0OC5jLCBzcmFuZDQ4LmMgKi8KKworbG9uZyBscmFuZDQ4KHZvaWQpCit7CisJcmV0dXJuICh1aW50MzJfdCkganJhbmQ0OChfX3JhbmQ0OF9zZWVkKSA+PiAxOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21ha2VlcnJsaXN0LnBsIGIvdXNyL2tsaWJjL21ha2VlcnJsaXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzc0N2MKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbWFrZWVycmxpc3QucGwKQEAgLTAsMCArMSw5OCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFRoaXMgY3JlYXRlcyBzeXNfZXJybGlzdCBmcm9tIDxhc20vZXJybm8uaD4gdGhyb3VnaCBzb21ld2hhdAorIyBoZXVyaXN0aWMgbWF0Y2hpbmcuICBJdCBwcmVzdW1lcyB0aGUgcmVsZXZhbnQgZW50cmllcyBhcmUgb2YgdGhlIGZvcm0KKyMgI2RlZmluZSBFeHh4eCA8aW50ZWdlcj4gLyogY29tbWVudCAqLworIworCit1c2UgRmlsZUhhbmRsZTsKKworJWVycm9ycyAgPSAoKTsKKyVlcnJtc2cgID0gKCk7CiskbWF4ZXJyICA9IC0xOworQGluY2x1ZGVsaXN0ID0gKCk7CQkjIEluY2x1ZGUgZGlyZWN0b3JpZXMKKworc3ViIHBhcnNlX2ZpbGUoJCkgeworICAgIG15KCRmaWxlKSA9IEBfOworICAgIG15KCRmaCkgPSBuZXcgRmlsZUhhbmRsZTsKKyAgICBteSgkbGluZSwgJGVycm9yLCAkbXNnKTsKKyAgICBteSgka2VybmVsb25seSkgPSAwOworICAgIG15KCRyb290KTsKKworICAgIHByaW50IFNUREVSUiAib3BlbmluZyAkZmlsZVxuIiB1bmxlc3MgKCAkcXVpZXQgKTsKKworICAgICRvayA9IDA7CisgICAgZm9yZWFjaCAkcm9vdCAoIEBpbmNsdWRlbGlzdCApIHsKKwlpZiAoICRmaC0+b3Blbigkcm9vdC4nLy8nLiRmaWxlLCAnPCcpICkgeworCSAgICAkb2sgPSAxOworCSAgICBsYXN0OworCX0KKyAgICB9CisKKyAgICBpZiAoICEgJG9rICkgeworCWRpZSAiJDA6IENhbm5vdCBmaW5kIGZpbGUgJGZpbGVcbiI7CisgICAgfQorCisgICAgd2hpbGUgKCBkZWZpbmVkKCRsaW5lID0gPCRmaD4pICkgeworCWlmICggJGtlcm5lbG9ubHkgKSB7CisJICAgIGlmICggJGxpbmUgPX4gL15cI1xzKmVuZGlmLyApIHsKKwkJJGtlcm5lbG9ubHktLTsKKwkgICAgfSBlbHNpZiAoICRsaW5lID1+IC9eXCNcc2lmLyApIHsKKwkJJGtlcm5lbG9ubHkrKzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmICggJGxpbmUgPX4gL15cI1xzKmRlZmluZVxzKyhbQS1aMC05X10rKVxzKyhbMC05XSspXHMqXC9cKlxzKiguKlxTKVxzKlwqXC8vICkgeworCQkkZXJyb3IgPSAkMTsKKwkJJGVycm5vID0gJDIrMDsKKwkJJG1zZyAgID0gJDM7CisJCXByaW50IFNUREVSUiAiJGVycm9yICgkZXJybm8pID0+IFwiJG1zZ1wiXG4iIHVubGVzcyAoICRxdWlldCApOworCQkkZXJyb3JzeyRlcnJub30gPSAkZXJyb3I7CisJCSRlcnJtc2d7JGVycm5vfSA9ICRtc2c7CisJCSRtYXhlcnIgPSAkZXJybm8gaWYgKCAkZXJybm8gPiAkbWF4ZXJyICk7CisJICAgIH0gZWxzaWYgKCAkbGluZSA9fiAvXlwjXHMqaW5jbHVkZVxzK1tcPFwiXSguKilbXD5cIl0vICkgeworCQlwYXJzZV9maWxlKCQxKTsKKwkgICAgfSBlbHNpZiAoICRsaW5lID1+IC9eXCNccyppZmRlZlxzK19fS0VSTkVMX18vICkgeworCQkka2VybmVsb25seSsrOworCSAgICB9CisJfQorICAgIH0KKyAgICBjbG9zZSgkZmgpOworICAgIHByaW50IFNUREVSUiAiY2xvc2luZyAkZmlsZVxuIiB1bmxlc3MgKCAkcXVpZXQgKTsKK30KKworJHYgPSAkRU5WeydLQlVJTERfVkVSQk9TRSd9OworJHF1aWV0ID0gZGVmaW5lZCgkdikgPyAhJHYgOiAwOworCitmb3JlYWNoICRhcmcgKCBAQVJHViApIHsKKyAgICBpZiAoICRhcmcgZXEgJy1xJyApIHsKKwkkcXVpZXQgPSAxOworICAgIH0gZWxzaWYgKCAkYXJnID1+IC9eLShlcnJsaXN0fGVycm5vc3xtYXhlcnIpJC8gKSB7CisJJHR5cGUgPSAkYXJnOworICAgIH0gZWxzaWYgKCAkYXJnID1+ICdeXC1JJyApIHsKKwlwdXNoKEBpbmNsdWRlbGlzdCwgIiQnIik7CisgICAgfSBlbHNlIHsKKwkjIElnbm9yZQorICAgIH0KK30KKworcGFyc2VfZmlsZSgnbGludXgvZXJybm8uaCcpOworCitpZiAoICR0eXBlIGVxICctZXJybGlzdCcgKSB7CisgICAgcHJpbnQgICIjaW5jbHVkZSA8ZXJybm8uaD5cbiI7CisgICAgcHJpbnRmICJjb25zdCBpbnQgc3lzX25lcnIgPSAlZDtcbiIsICRtYXhlcnIrMTsKKyAgICBwcmludGYgImNvbnN0IGNoYXIgKiBjb25zdCBzeXNfZXJybGlzdFslZF0gPSB7XG4iLCAkbWF4ZXJyKzE7CisgICAgZm9yZWFjaCAkZSAoIHNvcnQoa2V5cyglZXJyb3JzKSkgKSB7CisJcHJpbnRmICIgIFslc10gPSBcIiVzXCIsXG4iLCAkZXJyb3JzeyRlfSwgJGVycm1zZ3skZX07CisgICAgfQorICAgIHByaW50ICJ9O1xuIjsKK30gZWxzaWYgKCAkdHlwZSBlcSAnLWVycm5vcycgKSB7CisgICAgcHJpbnQgICIjaW5jbHVkZSA8ZXJybm8uaD5cbiI7CisgICAgcHJpbnRmICJjb25zdCBpbnQgc3lzX25lcnIgPSAlZDtcbiIsICRtYXhlcnIrMTsKKyAgICBwcmludGYgImNvbnN0IGNoYXIgKiBjb25zdCBzeXNfZXJybGlzdFslZF0gPSB7XG4iLCAkbWF4ZXJyKzE7CisgICAgZm9yZWFjaCAkZSAoIHNvcnQoa2V5cyglZXJyb3JzKSkgKSB7CisJcHJpbnRmICIgIFslc10gPSBcIiVzXCIsXG4iLCAkZXJyb3JzeyRlfSwgJGVycm9yc3skZX07CisgICAgfQorICAgIHByaW50ICJ9O1xuIjsKK30gZWxzaWYgKCAkdHlwZSBlcSAnLW1heGVycicgKSB7CisgICAgcHJpbnQgJG1heGVyciwgIlxuIjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tYWxsb2MuYyBiL3Vzci9rbGliYy9tYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJiYmJjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21hbGxvYy5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogbWFsbG9jLmMKKyAqCisgKiBWZXJ5IHNpbXBsZSBsaW5rZWQtbGlzdCBiYXNlZCBtYWxsb2MoKS9mcmVlKCkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAibWFsbG9jLmgiCisKKy8qIEJvdGggdGhlIGFyZW5hIGxpc3QgYW5kIHRoZSBmcmVlIG1lbW9yeSBsaXN0IGFyZSBkb3VibGUgbGlua2VkCisgICBsaXN0IHdpdGggaGVhZCBub2RlLiAgVGhpcyB0aGUgaGVhZCBub2RlLiBOb3RlIHRoYXQgdGhlIGFyZW5hIGxpc3QKKyAgIGlzIHNvcnRlZCBpbiBvcmRlciBvZiBhZGRyZXNzLiAqLworc3RhdGljIHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciBfX21hbGxvY19oZWFkID0geworCXsKKwkJQVJFTkFfVFlQRV9IRUFELAorCQkwLAorCQkmX19tYWxsb2NfaGVhZCwKKwkJJl9fbWFsbG9jX2hlYWQsCisJfSwKKwkmX19tYWxsb2NfaGVhZCwKKwkmX19tYWxsb2NfaGVhZAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIG1hcmtfYmxvY2tfZGVhZChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoKQoreworI2lmZGVmIERFQlVHX01BTExPQworCWFoLT5hLnR5cGUgPSBBUkVOQV9UWVBFX0RFQUQ7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9mcm9tX21haW5fY2hhaW4oc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaCkKK3sKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFwLCAqYW47CisKKwltYXJrX2Jsb2NrX2RlYWQoYWgpOworCisJYXAgPSBhaC0+YS5wcmV2OworCWFuID0gYWgtPmEubmV4dDsKKwlhcC0+YS5uZXh0ID0gYW47CisJYW4tPmEucHJldiA9IGFwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX2Zyb21fZnJlZV9jaGFpbihzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoKQoreworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqYXAsICphbjsKKworCWFwID0gYWgtPnByZXZfZnJlZTsKKwlhbiA9IGFoLT5uZXh0X2ZyZWU7CisJYXAtPm5leHRfZnJlZSA9IGFuOworCWFuLT5wcmV2X2ZyZWUgPSBhcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9mcm9tX2NoYWlucyhzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoKQoreworCXJlbW92ZV9mcm9tX2ZyZWVfY2hhaW4oYWgpOworCXJlbW92ZV9mcm9tX21haW5fY2hhaW4oYWgpOworfQorCitzdGF0aWMgdm9pZCAqX19tYWxsb2NfZnJvbV9ibG9jayhzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmZwLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgZnNpemU7CisJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpuZnAsICpuYSwgKmZwbiwgKmZwcDsKKworCWZzaXplID0gZnAtPmEuc2l6ZTsKKworCS8qIFdlIG5lZWQgdGhlIDIqIHRvIGFjY291bnQgZm9yIHRoZSBsYXJnZXIgcmVxdWlyZW1lbnRzIG9mIGEKKwkgICBmcmVlIGJsb2NrICovCisJaWYgKGZzaXplID49IHNpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpKSB7CisJCS8qIEJpZ2dlciBibG9jayB0aGFuIHJlcXVpcmVkIC0tIHNwbGl0IGJsb2NrICovCisJCW5mcCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikoKGNoYXIgKilmcCArIHNpemUpOworCQluYSA9IGZwLT5hLm5leHQ7CisKKwkJbmZwLT5hLnR5cGUgPSBBUkVOQV9UWVBFX0ZSRUU7CisJCW5mcC0+YS5zaXplID0gZnNpemUgLSBzaXplOworCQlmcC0+YS50eXBlID0gQVJFTkFfVFlQRV9VU0VEOworCQlmcC0+YS5zaXplID0gc2l6ZTsKKworCQkvKiBJbnNlcnQgaW50byBhbGwtYmxvY2sgY2hhaW4gKi8KKwkJbmZwLT5hLnByZXYgPSBmcDsKKwkJbmZwLT5hLm5leHQgPSBuYTsKKwkJbmEtPmEucHJldiA9IG5mcDsKKwkJZnAtPmEubmV4dCA9IG5mcDsKKworCQkvKiBSZXBsYWNlIGN1cnJlbnQgYmxvY2sgb24gZnJlZSBjaGFpbiAqLworCQluZnAtPm5leHRfZnJlZSA9IGZwbiA9IGZwLT5uZXh0X2ZyZWU7CisJCW5mcC0+cHJldl9mcmVlID0gZnBwID0gZnAtPnByZXZfZnJlZTsKKwkJZnBuLT5wcmV2X2ZyZWUgPSBuZnA7CisJCWZwcC0+bmV4dF9mcmVlID0gbmZwOworCX0gZWxzZSB7CisJCWZwLT5hLnR5cGUgPSBBUkVOQV9UWVBFX1VTRUQ7IC8qIEFsbG9jYXRlIHRoZSB3aG9sZSBibG9jayAqLworCQlyZW1vdmVfZnJvbV9mcmVlX2NoYWluKGZwKTsKKwl9CisKKwlyZXR1cm4gKHZvaWQgKikoJmZwLT5hICsgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKl9fZnJlZV9ibG9jayhzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoKQoreworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqcGFoLCAqbmFoOworCisJcGFoID0gYWgtPmEucHJldjsKKwluYWggPSBhaC0+YS5uZXh0OworCWlmIChwYWgtPmEudHlwZSA9PSBBUkVOQV9UWVBFX0ZSRUUgJiYKKwkgICAgKGNoYXIgKilwYWggKyBwYWgtPmEuc2l6ZSA9PSAoY2hhciAqKWFoKSB7CisJCS8qIENvYWxlc2NlIGludG8gdGhlIHByZXZpb3VzIGJsb2NrICovCisJCXBhaC0+YS5zaXplICs9IGFoLT5hLnNpemU7CisJCXBhaC0+YS5uZXh0ID0gbmFoOworCQluYWgtPmEucHJldiA9IHBhaDsKKwkJbWFya19ibG9ja19kZWFkKGFoKTsKKworCQlhaCA9IHBhaDsKKwkJcGFoID0gYWgtPmEucHJldjsKKwl9IGVsc2UgeworCQkvKiBOZWVkIHRvIGFkZCB0aGlzIGJsb2NrIHRvIHRoZSBmcmVlIGNoYWluICovCisJCWFoLT5hLnR5cGUgPSBBUkVOQV9UWVBFX0ZSRUU7CisKKwkJYWgtPm5leHRfZnJlZSA9IF9fbWFsbG9jX2hlYWQubmV4dF9mcmVlOworCQlhaC0+cHJldl9mcmVlID0gJl9fbWFsbG9jX2hlYWQ7CisJCV9fbWFsbG9jX2hlYWQubmV4dF9mcmVlID0gYWg7CisJCWFoLT5uZXh0X2ZyZWUtPnByZXZfZnJlZSA9IGFoOworCX0KKworCS8qIEluIGVpdGhlciBvZiB0aGUgcHJldmlvdXMgY2FzZXMsIHdlIG1pZ2h0IGJlIGFibGUgdG8gbWVyZ2UKKwkgICB3aXRoIHRoZSBzdWJzZXF1ZW50IGJsb2NrLi4uICovCisJaWYgKG5haC0+YS50eXBlID09IEFSRU5BX1RZUEVfRlJFRSAmJgorCSAgICAoY2hhciAqKWFoICsgYWgtPmEuc2l6ZSA9PSAoY2hhciAqKW5haCkgeworCQlhaC0+YS5zaXplICs9IG5haC0+YS5zaXplOworCisJCS8qIFJlbW92ZSB0aGUgb2xkIGJsb2NrIGZyb20gdGhlIGNoYWlucyAqLworCQlyZW1vdmVfZnJvbV9jaGFpbnMobmFoKTsKKwl9CisKKwkvKiBSZXR1cm4gdGhlIGJsb2NrIHRoYXQgY29udGFpbnMgdGhlIGNhbGxlZCBibG9jayAqLworCXJldHVybiBhaDsKK30KKwordm9pZCAqbWFsbG9jKHNpemVfdCBzaXplKQoreworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqZnA7CisJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICpwYWg7CisJc2l6ZV90IGZzaXplOworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBZGQgdGhlIG9ibGlnYXRvcnkgYXJlbmEgaGVhZGVyLCBhbmQgcm91bmQgdXAgKi8KKwlzaXplID0gKHNpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpIC0gMSkgJiBBUkVOQV9TSVpFX01BU0s7CisKKwlmb3IgKGZwID0gX19tYWxsb2NfaGVhZC5uZXh0X2ZyZWU7IGZwLT5hLnR5cGUgIT0gQVJFTkFfVFlQRV9IRUFEOworCSAgICAgZnAgPSBmcC0+bmV4dF9mcmVlKSB7CisJCWlmIChmcC0+YS5zaXplID49IHNpemUpIHsKKwkJCS8qIEZvdW5kIGZpdCAtLSBhbGxvY2F0ZSBvdXQgb2YgdGhpcyBibG9jayAqLworCQkJcmV0dXJuIF9fbWFsbG9jX2Zyb21fYmxvY2soZnAsIHNpemUpOworCQl9CisJfQorCisJLyogTm90aGluZyBmb3VuZC4uLiBuZWVkIHRvIHJlcXVlc3QgYSBibG9jayBmcm9tIHRoZSBrZXJuZWwgKi8KKwlmc2l6ZSA9IChzaXplICsgTUFMTE9DX0NIVU5LX01BU0spICYgfk1BTExPQ19DSFVOS19NQVNLOworCisjaWYgX0tMSUJDX01BTExPQ19VU0VTX1NCUksKKwlmcCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKilzYnJrKGZzaXplKTsKKyNlbHNlCisJZnAgPSAoc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICopCisJICAgIG1tYXAoTlVMTCwgZnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIDAsIDApOworI2VuZGlmCisKKwlpZiAoZnAgPT0gKHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqKU1BUF9GQUlMRUQpIHsKKwkJcmV0dXJuIE5VTEw7CS8qIEZhaWxlZCB0byBnZXQgYSBibG9jayAqLworCX0KKworCS8qIEluc2VydCB0aGUgYmxvY2sgaW50byB0aGUgbWFuYWdlbWVudCBjaGFpbnMuICBXZSBuZWVkIHRvIHNldAorCSAgIHVwIHRoZSBzaXplIGFuZCB0aGUgbWFpbiBibG9jayBsaXN0IHBvaW50ZXIsIHRoZSByZXN0IG9mCisJICAgdGhlIHdvcmsgaXMgbG9naWNhbGx5IGlkZW50aWNhbCB0byBmcmVlKCkuICovCisJZnAtPmEudHlwZSA9IEFSRU5BX1RZUEVfRlJFRTsKKwlmcC0+YS5zaXplID0gZnNpemU7CisKKwkvKiBXZSBuZWVkIHRvIGluc2VydCB0aGlzIGludG8gdGhlIG1haW4gYmxvY2sgbGlzdCBpbiB0aGUgcHJvcGVyCisJICAgcGxhY2UgLS0gdGhpcyBsaXN0IGlzIHJlcXVpcmVkIHRvIGJlIHNvcnRlZC4gIFNpbmNlIHdlIG1vc3QgbGlrZWx5CisJICAgZ2V0IG1lbW9yeSBhc3NpZ25tZW50cyBpbiBhc2NlbmRpbmcgb3JkZXIsIHNlYXJjaCBiYWNrd2FyZHMgZm9yCisJICAgdGhlIHByb3BlciBwbGFjZS4gKi8KKwlmb3IgKHBhaCA9IF9fbWFsbG9jX2hlYWQuYS5wcmV2OyBwYWgtPmEudHlwZSAhPSBBUkVOQV9UWVBFX0hFQUQ7CisJICAgICBwYWggPSBwYWgtPmEucHJldikgeworCQlpZiAocGFoIDwgZnApCisJCQlicmVhazsKKwl9CisKKwkvKiBOb3cgcGFoIHBvaW50cyB0byB0aGUgbm9kZSB0aGF0IHNob3VsZCBiZSB0aGUgcHJlZGVjZXNzb3Igb2YKKwkgICB0aGUgbmV3IG5vZGUgKi8KKwlmcC0+YS5uZXh0ID0gcGFoLT5hLm5leHQ7CisJZnAtPmEucHJldiA9IHBhaDsKKwlwYWgtPmEubmV4dCA9IGZwOworCWZwLT5hLm5leHQtPmEucHJldiA9IGZwOworCisJLyogSW5zZXJ0IGludG8gdGhlIGZyZWUgY2hhaW4gYW5kIGNvYWxlc2NlIHdpdGggYWRqYWNlbnQgYmxvY2tzICovCisJZnAgPSBfX2ZyZWVfYmxvY2soZnApOworCisJLyogTm93IHdlIGNhbiBhbGxvY2F0ZSBmcm9tIHRoaXMgYmxvY2sgKi8KKwlyZXR1cm4gX19tYWxsb2NfZnJvbV9ibG9jayhmcCwgc2l6ZSk7Cit9CisKK3ZvaWQgZnJlZSh2b2lkICpwdHIpCit7CisJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICphaDsKKworCWlmICghcHRyKQorCQlyZXR1cm47CisKKwlhaCA9IChzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKikKKwkgICAgKChzdHJ1Y3QgYXJlbmFfaGVhZGVyICopcHRyIC0gMSk7CisKKyNpZmRlZiBERUJVR19NQUxMT0MKKwlhc3NlcnQoYWgtPmEudHlwZSA9PSBBUkVOQV9UWVBFX1VTRUQpOworI2VuZGlmCisKKwkvKiBNZXJnZSBpbnRvIGFkamFjZW50IGZyZWUgYmxvY2tzICovCisJYWggPSBfX2ZyZWVfYmxvY2soYWgpOworCisJLyogU2VlIGlmIGl0IG1ha2VzIHNlbnNlIHRvIHJldHVybiBtZW1vcnkgdG8gdGhlIHN5c3RlbSAqLworI2lmIF9LTElCQ19NQUxMT0NfVVNFU19TQlJLCisJaWYgKGFoLT5hLnNpemUgPj0gX0tMSUJDX01BTExPQ19DSFVOS19TSVpFICYmCisJICAgIChjaGFyICopYWggKyBhaC0+YS5zaXplID09IF9fY3VycmVudF9icmspIHsKKwkJcmVtb3ZlX2Zyb21fY2hhaW5zKGFoKTsKKwkJYnJrKGFoKTsKKwl9CisjZWxzZQorCXsKKwkJc2l6ZV90IHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisJCXNpemVfdCBwYWdlX21hc2sgPSBwYWdlX3NpemUgLSAxOworCQlzaXplX3QgaGVhZF9wb3J0aW9uID0gLShzaXplX3QpYWggJiBwYWdlX21hc2s7CisJCXNpemVfdCB0YWlsX3BvcnRpb24gPSAoKHNpemVfdClhaCArIGFoLT5hLnNpemUpICYgcGFnZV9tYXNrOworCQlzaXplX3QgYWRqX3NpemU7CisKKwkJLyogQ2FyZWZ1bCBoZXJlLi4uIGFuIGluZGl2aWR1YWwgY2h1bmsgb2YgbWVtb3J5IG11c3QgaGF2ZQorCQkgICBhIG1pbmltdW0gc2l6ZSBpZiBpdCBleGlzdHMgYXQgYWxsLCBzbyBpZiBlaXRoZXIgdGhlCisJCSAgIGhlYWQgb3IgdGhlIHRhaWwgaXMgYmVsb3cgdGhlIG1pbmltdW0sIHRoZW4gZXh0ZW5kCisJCSAgIHRoYXQgY2h1bmsgYnkgYSBwYWdlLiAqLworCisJCWlmIChoZWFkX3BvcnRpb24gJiYKKwkJICAgIGhlYWRfcG9ydGlvbiA8IDIqc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpKQorCQkJaGVhZF9wb3J0aW9uICs9IHBhZ2Vfc2l6ZTsKKworCQlpZiAodGFpbF9wb3J0aW9uICYmCisJCSAgICB0YWlsX3BvcnRpb24gPCAyKnNpemVvZihzdHJ1Y3QgYXJlbmFfaGVhZGVyKSkKKwkJCXRhaWxfcG9ydGlvbiArPSBwYWdlX3NpemU7CisKKwkJYWRqX3NpemUgPSBhaC0+YS5zaXplIC0gaGVhZF9wb3J0aW9uIC0gdGFpbF9wb3J0aW9uOworCisJCS8qIFdvcnRoIGl0PyAgVGhpcyBpcyB3cml0dGVuIHRoZSB3YXkgaXQgaXMgdG8gZ3VhcmQKKwkJICAgYWdhaW5zdCBvdmVyZmxvd3MuLi4gKi8KKwkJaWYgKGFoLT5hLnNpemUgPj0gaGVhZF9wb3J0aW9uK3RhaWxfcG9ydGlvbisKKwkJICAgIF9LTElCQ19NQUxMT0NfQ0hVTktfU0laRSkgeworCQkJc3RydWN0IGZyZWVfYXJlbmFfaGVhZGVyICp0YWgsICp0YW4sICp0YXA7CisKKwkJCWlmICh0YWlsX3BvcnRpb24pIHsKKwkJCQkvKiBNYWtlIGEgbmV3IGhlYWRlciwgYW5kIGluc2VydCBpbnRvIGNoYWlucworCQkJCSAgIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IGJsb2NrICovCisJCQkJdGFoID0gKHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqKQorCQkJCQkoKGNoYXIgKilhaCArIGhlYWRfcG9ydGlvbiArIGFkal9zaXplKTsKKwkJCQl0YWgtPmEudHlwZSA9IEFSRU5BX1RZUEVfRlJFRTsKKwkJCQl0YWgtPmEuc2l6ZSA9IHRhaWxfcG9ydGlvbjsKKwkJCQl0YWgtPmEubmV4dCA9IHRhbiA9IGFoLT5hLm5leHQ7CisJCQkJdGFuLT5hLnByZXYgPSB0YWg7CisJCQkJdGFoLT5hLnByZXYgPSBhaDsKKwkJCQlhaC0+YS5uZXh0ID0gdGFoOworCQkJCXRhaC0+cHJldl9mcmVlID0gdGFwID0gYWgtPnByZXZfZnJlZTsKKwkJCQl0YXAtPm5leHRfZnJlZSA9IHRhaDsKKwkJCQl0YWgtPm5leHRfZnJlZSA9IGFoOworCQkJCWFoLT5wcmV2X2ZyZWUgPSB0YWg7CisJCQl9CisKKwkJCWlmIChoZWFkX3BvcnRpb24pCisJCQkJYWgtPmEuc2l6ZSA9IGhlYWRfcG9ydGlvbjsKKwkJCWVsc2UKKwkJCQlyZW1vdmVfZnJvbV9jaGFpbnMoYWgpOworCisJCQltdW5tYXAoKGNoYXIgKilhaCArIGhlYWRfcG9ydGlvbiwgYWRqX3NpemUpOworCQl9CisJfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWFsbG9jLmggYi91c3Iva2xpYmMvbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlYzBhOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tYWxsb2MuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogbWFsbG9jLmgKKyAqCisgKiBJbnRlcm5hbHMgZm9yIHRoZSBtZW1vcnkgYWxsb2NhdG9yCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGtsaWJjL3N5c2NvbmZpZy5oPgorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvLiAgVGhpcyBiZWNvbWVzIHRoZQorICogYWxpZ25tZW50IHVuaXQuCisgKi8KK3N0cnVjdCBmcmVlX2FyZW5hX2hlYWRlcjsKKworc3RydWN0IGFyZW5hX2hlYWRlciB7CisJc2l6ZV90IHR5cGU7CisJc2l6ZV90IHNpemU7CQkvKiBBbHNvIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbmV4dCBlbnRyeSAqLworCXN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqbmV4dCwgKnByZXY7Cit9OworCisjaWZkZWYgREVCVUdfTUFMTE9DCisjZGVmaW5lIEFSRU5BX1RZUEVfVVNFRCAweDY0ZTY5YzcwCisjZGVmaW5lIEFSRU5BX1RZUEVfRlJFRSAweDAxMmQ2MTBhCisjZGVmaW5lIEFSRU5BX1RZUEVfSEVBRCAweDk3MTY3NmI1CisjZGVmaW5lIEFSRU5BX1RZUEVfREVBRCAweGVlZWVlZWVlCisjZWxzZQorI2RlZmluZSBBUkVOQV9UWVBFX1VTRUQgMAorI2RlZmluZSBBUkVOQV9UWVBFX0ZSRUUgMQorI2RlZmluZSBBUkVOQV9UWVBFX0hFQUQgMgorI2VuZGlmCisKKyNkZWZpbmUgTUFMTE9DX0NIVU5LX01BU0sgKF9LTElCQ19NQUxMT0NfQ0hVTktfU0laRS0xKQorCisjZGVmaW5lIEFSRU5BX1NJWkVfTUFTSyAofihzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlciktMSkpCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIHR3aWNlIHRoZSBzaXplIG9mIHRoZQorICogcHJldmlvdXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgeworCXN0cnVjdCBhcmVuYV9oZWFkZXIgYTsKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKm5leHRfZnJlZSwgKnByZXZfZnJlZTsKK307CisKKy8qCisgKiBJbnRlcm5hbCB2YXJpYWJsZSB1c2VkIGJ5IGJyay9zYnJrCisgKi8KK2V4dGVybiBjaGFyICpfX2N1cnJlbnRfYnJrOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21lbWNjcHkuYyBiL3Vzci9rbGliYy9tZW1jY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkMDJjOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1jY3B5LmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIG1lbWNjcHkuYworICoKKyAqIG1lbWNjcHkoKQorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCAqbWVtY2NweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50IGMsIHNpemVfdCBuKQoreworCWNoYXIgKnEgPSBkc3Q7CisJY29uc3QgY2hhciAqcCA9IHNyYzsKKwljaGFyIGNoOworCisJd2hpbGUgKG4tLSkgeworCQkqcSsrID0gY2ggPSAqcCsrOworCQlpZiAoY2ggPT0gKGNoYXIpYykKKwkJCXJldHVybiBxOworCX0KKworCXJldHVybiBOVUxMOwkJLyogTm8gaW5zdGFuY2Ugb2YgImMiIGZvdW5kICovCit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWVtY2hyLmMgYi91c3Iva2xpYmMvbWVtY2hyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5NDdmYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1jaHIuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogbWVtY2hyLmMKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgKm1lbWNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3AgPSBzOworCisJd2hpbGUgKG4tLSkgeworCQlpZiAoKnNwID09ICh1bnNpZ25lZCBjaGFyKWMpCisJCQlyZXR1cm4gKHZvaWQgKilzcDsKKwkJc3ArKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tZW1jbXAuYyBiL3Vzci9rbGliYy9tZW1jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U5OTQxCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21lbWNtcC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBtZW1jbXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gczEsICpjMiA9IHMyOworCWludCBkID0gMDsKKworCXdoaWxlIChuLS0pIHsKKwkJZCA9IChpbnQpKmMxKysgLSAoaW50KSpjMisrOworCQlpZiAoZCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBkOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21lbWNweS5jIGIvdXNyL2tsaWJjL21lbWNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTIwNmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbWVtY3B5LmMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIG1lbWNweS5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkICptZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciAqcSA9IGRzdDsKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCXNpemVfdCBubCA9IG4gPj4gMjsKKwlhc20gdm9sYXRpbGUgKCJjbGQgOyByZXAgOyBtb3ZzbCA7IG1vdmwgJTMsJTAgOyByZXAgOyBtb3ZzYiI6IitjIiAobmwpLAorCQkgICAgICAiK1MiKHApLCAiK0QiKHEpCisJCSAgICAgIDoiciIobiAmIDMpKTsKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKwlzaXplX3QgbnEgPSBuID4+IDM7CisJYXNtIHZvbGF0aWxlICgiY2xkIDsgcmVwIDsgbW92c3EgOyBtb3ZsICUzLCUlZWN4IDsgcmVwIDsgbW92c2IiOiIrYyIKKwkJICAgICAgKG5xKSwgIitTIihwKSwgIitEIihxKQorCQkgICAgICA6InIiKCh1aW50MzJfdCkgKG4gJiA3KSkpOworI2Vsc2UKKwl3aGlsZSAobi0tKSB7CisJCSpxKysgPSAqcCsrOworCX0KKyNlbmRpZgorCisJcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tZW1tZW0uYyBiL3Vzci9rbGliYy9tZW1tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVmYWEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21lbW1lbS5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBtZW1tZW0uYworICoKKyAqIEZpbmQgYSBieXRlIHN0cmluZyBpbnNpZGUgYSBsb25nZXIgYnl0ZSBzdHJpbmcKKyAqCisgKiBUaGlzIHVzZXMgdGhlICJOb3QgU28gTmFpdmUiIGFsZ29yaXRobSwgYSB2ZXJ5IHNpbXBsZSBidXQKKyAqIHVzdWFsbHkgZWZmZWN0aXZlIGFsZ29yaXRobSwgc2VlOgorICoKKyAqIGh0dHA6Ly93d3ctaWdtLnVuaXYtbWx2LmZyL35sZWNyb3Evc3RyaW5nLworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordm9pZCAqbWVtbWVtKGNvbnN0IHZvaWQgKmhheXN0YWNrLCBzaXplX3QgbiwgY29uc3Qgdm9pZCAqbmVlZGxlLCBzaXplX3QgbSkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICp5ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiloYXlzdGFjazsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp4ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiluZWVkbGU7CisKKwlzaXplX3QgaiwgaywgbDsKKworCWlmIChtID4gbiB8fCAhbSB8fCAhbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoMSAhPSBtKSB7CisJCWlmICh4WzBdID09IHhbMV0pIHsKKwkJCWsgPSAyOworCQkJbCA9IDE7CisJCX0gZWxzZSB7CisJCQlrID0gMTsKKwkJCWwgPSAyOworCQl9CisKKwkJaiA9IDA7CisJCXdoaWxlIChqIDw9IG4gLSBtKSB7CisJCQlpZiAoeFsxXSAhPSB5W2ogKyAxXSkgeworCQkJCWogKz0gazsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFtZW1jbXAoeCArIDIsIHkgKyBqICsgMiwgbSAtIDIpCisJCQkJICAgICYmIHhbMF0gPT0geVtqXSkKKwkJCQkJcmV0dXJuICh2b2lkICopJnlbal07CisJCQkJaiArPSBsOworCQkJfQorCQl9CisJfSBlbHNlCisJCWRvIHsKKwkJCWlmICgqeSA9PSAqeCkKKwkJCQlyZXR1cm4gKHZvaWQgKil5OworCQkJeSsrOworCQl9IHdoaWxlICgtLW4pOworCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWVtbW92ZS5jIGIvdXNyL2tsaWJjL21lbW1vdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTljNzc4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21lbW1vdmUuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogbWVtbW92ZS5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkICptZW1tb3ZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgKnEgPSBkc3Q7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCWlmIChxIDwgcCkgeworCQlhc20gdm9sYXRpbGUoImNsZCA7IHJlcCA7IG1vdnNiIgorCQkJICAgICA6ICIrYyIgKG4pLCAiK1MiKHApLCAiK0QiKHEpKTsKKwl9IGVsc2UgeworCQlwICs9IChuIC0gMSk7CisJCXEgKz0gKG4gLSAxKTsKKwkJYXNtIHZvbGF0aWxlKCJzdGQgOyByZXAgOyBtb3ZzYiIKKwkJCSAgICAgOiAiK2MiIChuKSwgIitTIihwKSwgIitEIihxKSk7CisJfQorI2Vsc2UKKwlpZiAocSA8IHApIHsKKwkJd2hpbGUgKG4tLSkgeworCQkJKnErKyA9ICpwKys7CisJCX0KKwl9IGVsc2UgeworCQlwICs9IG47CisJCXEgKz0gbjsKKwkJd2hpbGUgKG4tLSkgeworCQkJKi0tcSA9ICotLXA7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbWVtcmNoci5jIGIvdXNyL2tsaWJjL21lbXJjaHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZkNzExCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21lbXJjaHIuYwpAQCAtMCwwICsxLDE5IEBACisvKgorICogbWVtcmNoci5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkICptZW1yY2hyKGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3QgbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcyArIG4gLSAxOworCisJd2hpbGUgKG4tLSkgeworCQlpZiAoKnNwID09ICh1bnNpZ25lZCBjaGFyKWMpCisJCQlyZXR1cm4gKHZvaWQgKilzcDsKKwkJc3AtLTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tZW1zZXQuYyBiL3Vzci9rbGliYy9tZW1zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAwYjViCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21lbXNldC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBtZW1zZXQuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCAqbWVtc2V0KHZvaWQgKmRzdCwgaW50IGMsIHNpemVfdCBuKQoreworCWNoYXIgKnEgPSBkc3Q7CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCXNpemVfdCBubCA9IG4gPj4gMjsKKwlhc20gdm9sYXRpbGUgKCJjbGQgOyByZXAgOyBzdG9zbCA7IG1vdmwgJTMsJTAgOyByZXAgOyBzdG9zYiIKKwkJICAgICAgOiAiK2MiIChubCksICIrRCIgKHEpCisJCSAgICAgIDogImEiICgodW5zaWduZWQgY2hhciljICogMHgwMTAxMDEwMVUpLCAiciIgKG4gJiAzKSk7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisJc2l6ZV90IG5xID0gbiA+PiAzOworCWFzbSB2b2xhdGlsZSAoImNsZCA7IHJlcCA7IHN0b3NxIDsgbW92bCAlMywlJWVjeCA7IHJlcCA7IHN0b3NiIgorCQkgICAgICA6IitjIiAobnEpLCAiK0QiIChxKQorCQkgICAgICA6ICJhIiAoKHVuc2lnbmVkIGNoYXIpYyAqIDB4MDEwMTAxMDEwMTAxMDEwMVUpLAorCQkJInIiICgodWludDMyX3QpIG4gJiA3KSk7CisjZWxzZQorCXdoaWxlIChuLS0pIHsKKwkJKnErKyA9IGM7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL21lbXN3YXAuYyBiL3Vzci9rbGliYy9tZW1zd2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMzE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9tZW1zd2FwLmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIG1lbXN3YXAoKQorICoKKyAqIFN3YXBzIHRoZSBjb250ZW50cyBvZiB0d28gbm9ub3ZlcmxhcHBpbmcgbWVtb3J5IGFyZWFzLgorICogVGhpcyByZWFsbHkgY291bGQgYmUgZG9uZSBmYXN0ZXIuLi4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgbWVtc3dhcCh2b2lkICptMSwgdm9pZCAqbTIsIHNpemVfdCBuKQoreworCWNoYXIgKnAgPSBtMTsKKwljaGFyICpxID0gbTI7CisJY2hhciB0bXA7CisKKwl3aGlsZSAobi0tKSB7CisJCXRtcCA9ICpwOworCQkqcCA9ICpxOworCQkqcSA9IHRtcDsKKworCQlwKys7CisJCXErKzsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbW1hcC5jIGIvdXNyL2tsaWJjL21tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjFkY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL21tYXAuYwpAQCAtMCwwICsxLDQwIEBACisvKgorICogbW1hcC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGJpdHNpemUuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKworLyoKKyAqIFNldCBpbiBTWVNDQUxMUyB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgdXNlIGFuIHVuYWRvcm5lZCBtbWFwKCkgc3lzdGVtCisgKiBjYWxsICh0eXBpY2FsIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzKS4KKyAqLworI2lmICFfS0xJQkNfTk9fTU1VICYmIF9LTElCQ19VU0VfTU1BUDIKKworLyogVGhpcyBhcmNoaXRlY3R1cmUgdXNlcyBtbWFwMigpLiBUaGUgTGludXggbW1hcDIoKSBzeXN0ZW0gY2FsbCB0YWtlcworICAgYSBwYWdlIG9mZnNldCBhcyB0aGUgb2Zmc2V0IGFyZ3VtZW50LiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZQorICAgdGhlIHByb3BlciBjb252ZXJzaW9uIGluIHBsYWNlLiAqLworCitleHRlcm4gdm9pZCAqX19tbWFwMih2b2lkICosIHNpemVfdCwgaW50LCBpbnQsIGludCwgc2l6ZV90KTsKKwordm9pZCAqbW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLAorCSAgIG9mZl90IG9mZnNldCkKK3sKKwljb25zdCBpbnQgbW1hcDJfc2hpZnQgPSBfS0xJQkNfTU1BUDJfU0hJRlQ7CisJY29uc3Qgb2ZmX3QgbW1hcDJfbWFzayA9ICgob2ZmX3QpIDEgPDwgbW1hcDJfc2hpZnQpIC0gMTsKKworCWlmIChvZmZzZXQgJiBtbWFwMl9tYXNrKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gTUFQX0ZBSUxFRDsKKwl9CisKKwlyZXR1cm4gX19tbWFwMihzdGFydCwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsCisJCSAgICAgICAoc2l6ZV90KSBvZmZzZXQgPj4gbW1hcDJfc2hpZnQpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9tcmFuZDQ4LmMgYi91c3Iva2xpYmMvbXJhbmQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjczY2MKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvbXJhbmQ0OC5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBtcmFuZDQ4LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3Vuc2lnbmVkIHNob3J0IF9fcmFuZDQ4X3NlZWRbM107CS8qIENvbW1vbiB3aXRoIGxyYW5kNDguYywgc3JhbmQ0OC5jICovCisKK2xvbmcgbXJhbmQ0OCh2b2lkKQoreworCXJldHVybiBqcmFuZDQ4KF9fcmFuZDQ4X3NlZWQpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL25pY2UuYyBiL3Vzci9rbGliYy9uaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlOTlhYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9uaWNlLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIG5pY2UuYworICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZm5kZWYgX19OUl9uaWNlCisKK2ludCBuaWNlKGludCBpbmMpCit7CisJcGlkX3QgbWUgPSBnZXRwaWQoKTsKKwlyZXR1cm4gc2V0cHJpb3JpdHkobWUsIFBSSU9fUFJPQ0VTUywKKwkJCSAgIGdldHByaW9yaXR5KG1lLCBQUklPX1BST0NFU1MpICsgaW5jKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvbnJhbmQ0OC5jIGIvdXNyL2tsaWJjL25yYW5kNDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM1MzJiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL25yYW5kNDguYwpAQCAtMCwwICsxLDExIEBACisvKgorICogbnJhbmQ0OC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitsb25nIG5yYW5kNDgodW5zaWduZWQgc2hvcnQgeHN1YmlbM10pCit7CisJcmV0dXJuIChsb25nKSgodWludDMyX3QpIGpyYW5kNDgoeHN1YmkpID4+IDEpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL251bGxlbnYuYyBiL3Vzci9rbGliYy9udWxsZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3ZTcxYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9udWxsZW52LmMKQEAgLTAsMCArMSw4IEBACisvKgorICogbnVsbGVudi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgImVudi5oIgorCitjaGFyICogY29uc3QgX19udWxsX2Vudmlyb25bXSA9IHsgTlVMTCB9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL29uZXhpdC5jIGIvdXNyL2tsaWJjL29uZXhpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTk2YjUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvb25leGl0LmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIG9uZXhpdC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImF0ZXhpdC5oIgorCitpbnQgb25fZXhpdCh2b2lkICgqZmN0bikgKGludCwgdm9pZCAqKSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBhdGV4aXQgKmFzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRleGl0KSk7CisKKwlpZiAoIWFzKQorCQlyZXR1cm4gLTE7CisKKwlhcy0+ZmN0biA9IGZjdG47CisJYXMtPmFyZyA9IGFyZzsKKworCWFzLT5uZXh0ID0gX19hdGV4aXRfbGlzdDsKKwlfX2F0ZXhpdF9saXN0ID0gYXM7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9vcGVuLmMgYi91c3Iva2xpYmMvb3Blbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDg5N2EKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvb3Blbi5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBvcGVuLmMKKyAqCisgKiBPbiAzMi1iaXQgcGxhdGZvcm1zIHdlIG5lZWQgdG8gcGFzcyBPX0xBUkdFRklMRSB0byB0aGUgb3BlbigpCisgKiBzeXN0ZW0gY2FsbCwgdG8gaW5kaWNhdGUgdGhhdCB3ZSdyZSA2NC1iaXQgc2FmZS4KKyAqLworCisjZGVmaW5lIF9LTElCQ19JTl9PUEVOX0MKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGJpdHNpemUuaD4KKworI2lmIF9CSVRTSVpFID09IDMyICYmICFkZWZpbmVkKF9faTM4Nl9fKQorCitleHRlcm4gaW50IF9fb3Blbihjb25zdCBjaGFyICosIGludCwgbW9kZV90KTsKKworaW50IG9wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncywgbW9kZV90IG1vZGUpCit7CisJcmV0dXJuIF9fb3BlbihwYXRobmFtZSwgZmxhZ3MgfCBPX0xBUkdFRklMRSwgbW9kZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL29wZW5fY2xvZXhlYy5jIGIvdXNyL2tsaWJjL29wZW5fY2xvZXhlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGIwOWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvb3Blbl9jbG9leGVjLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIG9wZW5fY2xvZXhlYy5jCisgKgorICogQSBxdWljayBoYWNrIHRvIGRvIGFuIG9wZW4oKSBhbmQgc2V0IHRoZSBjbG9leGVjIGZsYWcKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworaW50IG9wZW5fY2xvZXhlYyhjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsIG1vZGVfdCBtb2RlKQoreworCWludCBmZCA9IG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUpOworCisJaWYgKGZkID49IDApCisJCWZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworCXJldHVybiBmZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9vcGVuYXQuYyBiL3Vzci9rbGliYy9vcGVuYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M4N2NkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL29wZW5hdC5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBvcGVuYXQuYworICoKKyAqIE9uIDMyLWJpdCBwbGF0Zm9ybXMgd2UgbmVlZCB0byBwYXNzIE9fTEFSR0VGSUxFIHRvIHRoZSBvcGVuYXQoKQorICogc3lzdGVtIGNhbGwsIHRvIGluZGljYXRlIHRoYXQgd2UncmUgNjQtYml0IHNhZmUuCisgKi8KKworI2RlZmluZSBfS0xJQkNfSU5fT1BFTl9DCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxiaXRzaXplLmg+CisKKyNpZiBfQklUU0laRSA9PSAzMiAmJiAhZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChfX05SX29wZW5hdCkKKworZXh0ZXJuIGludCBfX29wZW5hdChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBtb2RlX3QpOworCitpbnQgb3BlbmF0KGludCBkaXJmZCwgY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncywgbW9kZV90IG1vZGUpCit7CisJcmV0dXJuIF9fb3BlbmF0KGRpcmZkLCBwYXRobmFtZSwgZmxhZ3MgfCBPX0xBUkdFRklMRSwgbW9kZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3BhdXNlLmMgYi91c3Iva2xpYmMvcGF1c2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM5N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3BhdXNlLmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIHBhdXNlLmMKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaWZuZGVmIF9fTlJfcGF1c2UKKworaW50IHBhdXNlKHZvaWQpCit7CisJcmV0dXJuIHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcGVycm9yLmMgYi91c3Iva2xpYmMvcGVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NzA1NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9wZXJyb3IuYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogcGVycm9yLmMKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkIHBlcnJvcihjb25zdCBjaGFyICpzKQoreworCWludCBlID0gZXJybm87CisJZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHMsIHN0cmVycm9yKGUpKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9wcG9sbC5jIGIvdXNyL2tsaWJjL3Bwb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyMGE4OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9wcG9sbC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBwcG9sbC5jCisgKi8KKworI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworI2lmZGVmIF9fTlJfcHBvbGwKKworX19leHRlcm4gaW50IF9fcHBvbGwoc3RydWN0IHBvbGxmZCAqLCBuZmRzX3QsIHN0cnVjdCB0aW1lc3BlYyAqLAorCQkgICAgIGNvbnN0IHNpZ3NldF90ICosIHNpemVfdCk7CisKK2ludCBwcG9sbChzdHJ1Y3QgcG9sbGZkICp1ZmRzLCBuZmRzX3QgbmZkcywgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0LAorCSAgY29uc3Qgc2lnc2V0X3QgKiBzaWdtYXNrKQoreworCXJldHVybiBfX3Bwb2xsKHVmZHMsIG5mZHMsIHRpbWVvdXQsIHNpZ21hc2ssIHNpemVvZiAqc2lnbWFzayk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3ByaW50Zi5jIGIvdXNyL2tsaWJjL3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcHJpbnRmLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIHByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNkZWZpbmUgQlVGRkVSX1NJWkUJMTYzODQKKworaW50IHByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCBydjsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCXJ2ID0gdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9wc2VsZWN0LmMgYi91c3Iva2xpYmMvcHNlbGVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjY4NTIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcHNlbGVjdC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBwc2VsZWN0LmMKKyAqLworCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZiBkZWZpbmVkKF9fTlJfcHNlbGVjdCkgJiYgIV9LTElCQ19VU0VfUlRfU0lHCisKKy8qIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZTsgdXNlIHN5c2NhbGwgc3R1YiBkaXJlY3RseSAqLworCisjZWxpZiBkZWZpbmVkKF9fTlJfcHNlbGVjdDcpCisKK19fZXh0ZXJuIGludCBfX3BzZWxlY3Q3KGludCwgZmRfc2V0ICosIGZkX3NldCAqLCBmZF9zZXQgKiwKKwkJCWNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqLCBjb25zdCBzaWdzZXRfdCAqLCBzaXplX3QpOworCitpbnQgcHNlbGVjdChpbnQgbiwgZmRfc2V0ICogcmVhZGZkcywgZmRfc2V0ICogd3JpdGVmZHMsIGZkX3NldCAqIGV4Y2VwdGZkcywKKwkgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lb3V0LCBjb25zdCBzaWdzZXRfdCAqIHNpZ21hc2spCit7CisJcmV0dXJuIF9fcHNlbGVjdDcobiwgcmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkcywKKwkJCSAgdGltZW91dCwgc2lnbWFzaywgc2l6ZW9mICpzaWdtYXNrKTsKK30KKworI2VsaWYgZGVmaW5lZChfX05SX3BzZWxlY3Q2KQorCitzdHJ1Y3QgX19wc2VsZWN0NiB7CisJY29uc3Qgc2lnc2V0X3QgKnNpZ21hc2s7CisJc2l6ZV90IHNpZ3NpemU7Cit9OworCitfX2V4dGVybiBpbnQgX19wc2VsZWN0NihpbnQsIGZkX3NldCAqLCBmZF9zZXQgKiwgZmRfc2V0ICosCisJCQljb25zdCBzdHJ1Y3QgdGltZXNwZWMgKiwgY29uc3Qgc3RydWN0IF9fcHNlbGVjdDYgKik7CisKK2ludCBwc2VsZWN0KGludCBuLCBmZF9zZXQgKiByZWFkZmRzLCBmZF9zZXQgKiB3cml0ZWZkcywgZmRfc2V0ICogZXhjZXB0ZmRzLAorCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQsIGNvbnN0IHNpZ3NldF90ICogc2lnbWFzaykKK3sKKwlzdHJ1Y3QgX19wc2VsZWN0NiBleHRlbmRlZF9zaWdtYXNrID0geyBzaWdtYXNrLCBzaXplb2YgKnNpZ21hc2sgfTsKKwlyZXR1cm4gX19wc2VsZWN0NihuLCByZWFkZmRzLCB3cml0ZWZkcywgZXhjZXB0ZmRzLAorCQkJICB0aW1lb3V0LCAmZXh0ZW5kZWRfc2lnbWFzayk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3B0eS5jIGIvdXNyL2tsaWJjL3B0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2IyYmEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcHR5LmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIHB0eS5jCisgKgorICogQmFzaWMgVW5peDk4IFBUWSBmdW5jdGlvbmFsaXR5OyBhc3N1bWVzIGRldnB0cyBtb3VudGVkIG9uIC9kZXYvcHRzCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCitjaGFyICpwdHNuYW1lKGludCBmZCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMzJdOwkvKiBCaWcgZW5vdWdoIHRvIGhvbGQgZXZlbiBhIDY0LWJpdCBwdHMgbm8gKi8KKwl1bnNpZ25lZCBpbnQgcHR5bm87CisKKwlpZiAoaW9jdGwoZmQsIFRJT0NHUFROLCAmcHR5bm8pKQorCQlyZXR1cm4gTlVMTDsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgIi9kZXYvcHRzLyV1IiwgcHR5bm8pOworCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworaW50IHVubG9ja3B0KGludCBmZCkKK3sKKwlpbnQgdW5sb2NrID0gMDsKKworCXJldHVybiBpb2N0bChmZCwgVElPQ1NQVExDSywgJnVubG9jayk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcHV0Y2hhci5jIGIvdXNyL2tsaWJjL3B1dGNoYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIyNGNhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3B1dGNoYXIuYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogcHV0Y2hhci5jCisgKgorICogLSBnY2Mgd2FudHMgdGhpcworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjdW5kZWYgcHV0Y2hhcgkJCS8qIERlZmluZWQgYXMgYSBtYWNybyAqLworaW50IHB1dGNoYXIoaW50KTsKKworaW50IHB1dGNoYXIoaW50IGMpCit7CisJcmV0dXJuIGZwdXRjKGMsIHN0ZG91dCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcHV0ZW52LmMgYi91c3Iva2xpYmMvcHV0ZW52LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1OWVjYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9wdXRlbnYuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogcHV0ZW52LmMKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJlbnYuaCIKKworaW50IHB1dGVudihjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqczsKKwljb25zdCBjaGFyICplLCAqejsKKworCWlmICghc3RyKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJZSA9IE5VTEw7CisJZm9yICh6ID0gc3RyOyAqejsgeisrKSB7CisJCWlmICgqeiA9PSAnPScpCisJCQllID0gejsKKwl9CisKKwlpZiAoIWUpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwlzID0gc3RyZHVwKHN0cik7CisJaWYgKCFzKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gX19wdXRfZW52KHMsIGUgLSBzdHIsIDEpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3B1dHMuYyBiL3Vzci9rbGliYy9wdXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMTZlMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9wdXRzLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIHB1dHMuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgcHV0cyhjb25zdCBjaGFyICpzKQoreworCWlmIChmcHV0cyhzLCBzdGRvdXQpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIF9md3JpdGUoIlxuIiwgMSwgc3Rkb3V0KTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9xc29ydC5jIGIvdXNyL2tsaWJjL3Fzb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0ODRhMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9xc29ydC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBxc29ydC5jCisgKgorICogVGhpcyBpcyBhY3R1YWxseSBjb21ic29ydC4gIEl0J3MgYW4gTyhuIGxvZyBuKSBhbGdvcml0aG0gd2l0aAorICogc2ltcGxpY2l0eS9zbWFsbCBjb2RlIHNpemUgYmVpbmcgaXRzIG1haW4gdmlydHVlLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIGlubGluZSBzaXplX3QgbmV3Z2FwKHNpemVfdCBnYXApCit7CisJZ2FwID0gKGdhcCAqIDEwKSAvIDEzOworCWlmIChnYXAgPT0gOSB8fCBnYXAgPT0gMTApCisJCWdhcCA9IDExOworCisJaWYgKGdhcCA8IDEpCisJCWdhcCA9IDE7CisJcmV0dXJuIGdhcDsKK30KKwordm9pZCBxc29ydCh2b2lkICpiYXNlLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLAorCSAgIGludCAoKmNvbXBhcikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKwlzaXplX3QgZ2FwID0gbm1lbWI7CisJc2l6ZV90IGksIGo7CisJY2hhciAqcDEsICpwMjsKKwlpbnQgc3dhcHBlZDsKKworCWlmICghbm1lbWIpCisJCXJldHVybjsKKworCWRvIHsKKwkJZ2FwID0gbmV3Z2FwKGdhcCk7CisJCXN3YXBwZWQgPSAwOworCisJCWZvciAoaSA9IDAsIHAxID0gYmFzZTsgaSA8IG5tZW1iIC0gZ2FwOyBpKyssIHAxICs9IHNpemUpIHsKKwkJCWogPSBpICsgZ2FwOworCQkJaWYgKGNvbXBhcihwMSwgcDIgPSAoY2hhciAqKWJhc2UgKyBqICogc2l6ZSkgPiAwKSB7CisJCQkJbWVtc3dhcChwMSwgcDIsIHNpemUpOworCQkJCXN3YXBwZWQgPSAxOworCQkJfQorCQl9CisJfSB3aGlsZSAoZ2FwID4gMSB8fCBzd2FwcGVkKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9yYWlzZS5jIGIvdXNyL2tsaWJjL3JhaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5ZDIzZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9yYWlzZS5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiByYWlzZS5jCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitpbnQgcmFpc2UoaW50IHNpZ25hbCkKK3sKKwlyZXR1cm4ga2lsbChnZXRwaWQoKSwgc2lnbmFsKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9yZWFkZGlyLmMgYi91c3Iva2xpYmMvcmVhZGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1M2ZjMDgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcmVhZGRpci5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiByZWFkZGlyLmM6IG9wZW5kaXIvcmVhZGRpci9jbG9zZWRpcgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIF9fS0xJQkNfRElSRU5UX0lOVEVSTkFMUworI2luY2x1ZGUgPGRpcmVudC5oPgorCitESVIgKm9wZW5kaXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlESVIgKmRwID0gbWFsbG9jKHNpemVvZihESVIpKTsKKworCWlmICghZHApCisJCXJldHVybiBOVUxMOworCisJZHAtPl9fZmQgPSBvcGVuKG5hbWUsIE9fRElSRUNUT1JZIHwgT19SRE9OTFkpOworCisJaWYgKGRwLT5fX2ZkIDwgMCkgeworCQlmcmVlKGRwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZHAtPmJ5dGVzX2xlZnQgPSAwOworCisJcmV0dXJuIGRwOworfQorCitzdHJ1Y3QgZGlyZW50ICpyZWFkZGlyKERJUiAqZGlyKQoreworCXN0cnVjdCBkaXJlbnQgKmRlbnQ7CisJaW50IHJ2OworCisJaWYgKCFkaXItPmJ5dGVzX2xlZnQpIHsKKwkJcnYgPSBnZXRkZW50cyhkaXItPl9fZmQsIGRpci0+YnVmZmVyLCBzaXplb2YoZGlyLT5idWZmZXIpKTsKKwkJaWYgKHJ2IDw9IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJZGlyLT5ieXRlc19sZWZ0ID0gcnY7CisJCWRpci0+bmV4dCA9IGRpci0+YnVmZmVyOworCX0KKworCWRlbnQgPSBkaXItPm5leHQ7CisJZGlyLT5uZXh0ID0gKHN0cnVjdCBkaXJlbnQgKikoKGNoYXIgKilkaXItPm5leHQgKyBkZW50LT5kX3JlY2xlbik7CisJZGlyLT5ieXRlc19sZWZ0IC09IGRlbnQtPmRfcmVjbGVuOworCisJcmV0dXJuIGRlbnQ7Cit9CisKK2ludCBjbG9zZWRpcihESVIgKmRpcikKK3sKKwlpbnQgcnY7CisJcnYgPSBjbG9zZShkaXItPl9fZmQpOworCWZyZWUoZGlyKTsKKwlyZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcmVhbGxvYy5jIGIvdXNyL2tsaWJjL3JlYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGEyZjJmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3JlYWxsb2MuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogcmVhbGxvYy5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibWFsbG9jLmgiCisKKy8qIEZJWE1FOiBUaGlzIGlzIGNoZWVzeSwgaXQgc2hvdWxkIGJlIGZpeGVkIGxhdGVyICovCisKK3ZvaWQgKnJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZnJlZV9hcmVuYV9oZWFkZXIgKmFoOworCXZvaWQgKm5ld3B0cjsKKwlzaXplX3Qgb2xkc2l6ZTsKKworCWlmICghcHRyKQorCQlyZXR1cm4gbWFsbG9jKHNpemUpOworCisJaWYgKHNpemUgPT0gMCkgeworCQlmcmVlKHB0cik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEFkZCB0aGUgb2JsaWdhdG9yeSBhcmVuYSBoZWFkZXIsIGFuZCByb3VuZCB1cCAqLworCXNpemUgPSAoc2l6ZSArIDIgKiBzaXplb2Yoc3RydWN0IGFyZW5hX2hlYWRlcikgLSAxKSAmIEFSRU5BX1NJWkVfTUFTSzsKKworCWFoID0gKHN0cnVjdCBmcmVlX2FyZW5hX2hlYWRlciAqKQorCSAgICAoKHN0cnVjdCBhcmVuYV9oZWFkZXIgKilwdHIgLSAxKTsKKworCWlmIChhaC0+YS5zaXplID49IHNpemUgJiYgc2l6ZSA+PSAoYWgtPmEuc2l6ZSA+PiAyKSkgeworCQkvKiBUaGlzIGZpZWxkIGlzIGEgZ29vZCBzaXplIGFscmVhZHkuICovCisJCXJldHVybiBwdHI7CisJfSBlbHNlIHsKKwkJLyogTWFrZSBtZSBhIG5ldyBibG9jay4gIFRoaXMgaXMga2luZCBvZiBib2d1czsgd2Ugc2hvdWxkCisJCSAgIGJlIGNoZWNraW5nIHRoZSBmb2xsb3dpbmcgYmxvY2sgdG8gc2VlIGlmIHdlIGNhbiBkbyBhbgorCQkgICBpbi1wbGFjZSBhZGp1c3RtZW50Li4uIGZpeCB0aGF0IGxhdGVyLiAqLworCisJCW9sZHNpemUgPSBhaC0+YS5zaXplIC0gc2l6ZW9mKHN0cnVjdCBhcmVuYV9oZWFkZXIpOworCisJCW5ld3B0ciA9IG1hbGxvYyhzaXplKTsKKwkJbWVtY3B5KG5ld3B0ciwgcHRyLCAoc2l6ZSA8IG9sZHNpemUpID8gc2l6ZSA6IG9sZHNpemUpOworCQlmcmVlKHB0cik7CisKKwkJcmV0dXJuIG5ld3B0cjsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcmVib290LmMgYi91c3Iva2xpYmMvcmVib290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5NWRjMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9yZWJvb3QuYwpAQCAtMCwwICsxLDE1IEBACisvKgorICogcmVib290LmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3JlYm9vdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKy8qIFRoaXMgcHJvdmlkZXMgdGhlIG9uZS1hcmd1bWVudCBnbGliYy1pc2ggdmVyc2lvbiBvZiByZWJvb3QuCisgICBUaGUgZnVsbCBmb3VyLWFyZ3VtZW50IHN5c3RlbSBjYWxsIGlzIGF2YWlsYWJsZSBhcyBfX3JlYm9vdCgpLiAqLworCitpbnQgcmVib290KGludCBmbGFnKQoreworCXJldHVybiBfX3JlYm9vdChMSU5VWF9SRUJPT1RfTUFHSUMxLCBMSU5VWF9SRUJPT1RfTUFHSUMyLCBmbGFnLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9yZWN2LmMgYi91c3Iva2xpYmMvcmVjdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYWEwMGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvcmVjdi5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiByZWN2LmMKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitpbnQgcmVjdihpbnQgcywgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIHJlY3Zmcm9tKHMsIGJ1ZiwgbGVuLCBmbGFncywgTlVMTCwgMCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvcmVtb3ZlLmMgYi91c3Iva2xpYmMvcmVtb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4ODIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9yZW1vdmUuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogcmVtb3ZlLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQgcmVtb3ZlKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWludCBydjsKKworCXJ2ID0gdW5saW5rKHBhdGhuYW1lKTsKKwlpZiAocnYgPT0gLTEgJiYgZXJybm8gPT0gRUlTRElSKQorCQlyZXR1cm4gcm1kaXIocGF0aG5hbWUpOworCisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NicmsuYyBiL3Vzci9rbGliYy9zYnJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5NmNlMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zYnJrLmMKQEAgLTAsMCArMSw0NSBAQAorLyogc2Jyay5jIC0gQ2hhbmdlIGRhdGEgc2VnbWVudCBzaXplICovCisKKy8qIFdyaXR0ZW4gMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KKy8qIE1vZGlmaWVkIDIwMDMtMjAwNCBmb3Iga2xpYmMgYnkgSC4gUGV0ZXIgQW52aW4gKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJtYWxsb2MuaCIKKworI2lmICFfS0xJQkNfTk9fTU1VCQkvKiB1Q2xpbnV4IGRvZXNuJ3QgaGF2ZSBicmsoKSAqLworCitjaGFyICpfX2N1cnJlbnRfYnJrOwkJLyogQ29tbW9uIHdpdGggYnJrLmMgKi8KKworLyogcCBpcyBhbiBhZGRyZXNzLCAgYSBpcyBhbGlnbm1lbnQ7IG11c3QgYmUgYSBwb3dlciBvZiAyICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmFsaWduX3VwKHZvaWQgKnAsIHVpbnRwdHJfdCBhKQoreworCXJldHVybiAodm9pZCAqKSgoKHVpbnRwdHJfdCkgcCArIGEgLSAxKSAmIH4oYSAtIDEpKTsKK30KKwordm9pZCAqc2JyayhwdHJkaWZmX3QgaW5jcmVtZW50KQoreworCWNoYXIgKnN0YXJ0LCAqZW5kLCAqbmV3X2JyazsKKworCWlmICghX19jdXJyZW50X2JyaykKKwkJX19jdXJyZW50X2JyayA9IF9fYnJrKE5VTEwpOworCisJc3RhcnQgPSBhbGlnbl91cChfX2N1cnJlbnRfYnJrLCBfS0xJQkNfU0JSS19BTElHTk1FTlQpOworCWVuZCA9IHN0YXJ0ICsgaW5jcmVtZW50OworCisJbmV3X2JyayA9IF9fYnJrKGVuZCk7CisKKwlpZiAobmV3X2JyayA9PSAodm9pZCAqKS0xKQorCQlyZXR1cm4gKHZvaWQgKiktMTsKKwllbHNlIGlmIChuZXdfYnJrIDwgZW5kKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlyZXR1cm4gKHZvaWQgKiktMTsKKwl9CisKKwlfX2N1cnJlbnRfYnJrID0gbmV3X2JyazsKKwlyZXR1cm4gc3RhcnQ7Cit9CisKKyNlbmRpZgkJCQkvKiAhX0tMSUJDX05PX01NVSAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NlZWQ0OC5jIGIvdXNyL2tsaWJjL3NlZWQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGYxODMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2VlZDQ4LmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHNlZWQ0OC5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit1bnNpZ25lZCBzaG9ydCBfX3JhbmQ0OF9zZWVkWzNdOworCit1bnNpZ25lZCBzaG9ydCAqc2VlZDQ4KGNvbnN0IHVuc2lnbmVkIHNob3J0IHhzdWJpWzNdKQoreworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBvbGRzZWVkWzNdOworCW1lbWNweShvbGRzZWVkLCBfX3JhbmQ0OF9zZWVkLCBzaXplb2YgX19yYW5kNDhfc2VlZCk7CisJbWVtY3B5KF9fcmFuZDQ4X3NlZWQsIHhzdWJpLCBzaXplb2YgX19yYW5kNDhfc2VlZCk7CisKKwlyZXR1cm4gb2xkc2VlZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zZW5kLmMgYi91c3Iva2xpYmMvc2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NjdkZDEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2VuZC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBzZW5kLmMKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitpbnQgc2VuZChpbnQgcywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIHNlbmR0byhzLCBidWYsIGxlbiwgZmxhZ3MsIE5VTEwsIDApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NldGVnaWQuYyBiL3Vzci9rbGliYy9zZXRlZ2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmOTY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zZXRlZ2lkLmMKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIHNldGVnaWQuYworICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IHNldGVnaWQoZ2lkX3QgZWdpZCkKK3sKKwlyZXR1cm4gc2V0cmVnaWQoLTEsIGVnaWQpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NldGVudi5jIGIvdXNyL2tsaWJjL3NldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTdhYWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2V0ZW52LmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIHNldGVudi5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZW52LmgiCisKK2ludCBzZXRlbnYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsLCBpbnQgb3ZlcndyaXRlKQoreworCWNvbnN0IGNoYXIgKno7CisJY2hhciAqczsKKwlzaXplX3QgbDEsIGwyOworCisJaWYgKCFuYW1lIHx8ICFuYW1lWzBdKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJbDEgPSAwOworCWZvciAoeiA9IG5hbWU7ICp6OyB6KyspIHsKKwkJbDErKzsKKwkJaWYgKCp6ID09ICc9JykgeworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlsMiA9IHN0cmxlbih2YWwpOworCisJcyA9IG1hbGxvYyhsMSArIGwyICsgMik7CisJaWYgKCFzKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkocywgbmFtZSwgbDEpOworCXNbbDFdID0gJz0nOworCW1lbWNweShzICsgbDEgKyAxLCB2YWwsIGwyICsgMSk7CisKKwlyZXR1cm4gX19wdXRfZW52KHMsIGwxICsgMSwgb3ZlcndyaXRlKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zZXRldWlkLmMgYi91c3Iva2xpYmMvc2V0ZXVpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZGRkYjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2V0ZXVpZC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBzZXRldWlkLmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBzZXRldWlkKHVpZF90IGV1aWQpCit7CisJcmV0dXJuIHNldHJldWlkKC0xLCBldWlkKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zZXRwZ3JwLmMgYi91c3Iva2xpYmMvc2V0cGdycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmJjYzcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2V0cGdycC5jCkBAIC0wLDAgKzEsMTAgQEAKKy8qCisgKiBzZXRwZ3JwLmMKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBzZXRwZ3JwKHZvaWQpCit7CisJcmV0dXJuIHNldHBnaWQoMCwgMCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2hhMWhhc2guYyBiL3Vzci9rbGliYy9zaGExaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOWVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2hhMWhhc2guYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKK1NIQS0xIGluIEMKK0J5IFN0ZXZlIFJlaWQgPHNyZWlkQHNlYS10by1za3kubmV0PgorMTAwJSBQdWJsaWMgRG9tYWluCisKKy0tLS0tLS0tLS0tLS0tLS0tCitNb2RpZmllZCA3Lzk4CitCeSBKYW1lcyBILiBCcm93biA8amJyb3duQGJ1cmdveW5lLmNvbT4KK1N0aWxsIDEwMCUgUHVibGljIERvbWFpbgorCitDb3JyZWN0ZWQgYSBwcm9ibGVtIHdoaWNoIGdlbmVyYXRlZCBpbXByb3BlciBoYXNoIHZhbHVlcyBvbiAxNiBiaXQgbWFjaGluZXMKK1JvdXRpbmUgU0hBMVVwZGF0ZSBjaGFuZ2VkIGZyb20KKwl2b2lkIFNIQTFVcGRhdGUoU0hBMV9DVFgqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIHVuc2lnbmVkIGludAorbGVuKQordG8KKwl2b2lkIFNIQTFVcGRhdGUoU0hBMV9DVFgqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIHVuc2lnbmVkCitsb25nIGxlbikKKworVGhlICdsZW4nIHBhcmFtZXRlciB3YXMgZGVjbGFyZWQgYW4gaW50IHdoaWNoIHdvcmtzIGZpbmUgb24gMzIgYml0IG1hY2hpbmVzLgorSG93ZXZlciwgb24gMTYgYml0IG1hY2hpbmVzIGFuIGludCBpcyB0b28gc21hbGwgZm9yIHRoZSBzaGlmdHMgYmVpbmcgZG9uZQorYWdhaW5zdAoraXQuICBUaGlzIGNhdXNlZCB0aGUgaGFzaCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBpbmNvcnJlY3QgdmFsdWVzIGlmIGxlbiB3YXMKK2dyZWF0ZXIgdGhhbiA4MTkxICg4SyAtIDEpIGR1ZSB0byB0aGUgJ2xlbiA8PCAzJyBvbiBsaW5lIDMgb2YgU0hBMVVwZGF0ZSgpLgorCitTaW5jZSB0aGUgZmlsZSBJTyBpbiBtYWluKCkgcmVhZHMgMTZLIGF0IGEgdGltZSwgYW55IGZpbGUgOEsgb3IgbGFyZ2VyIHdvdWxkCitiZSBndWFyYW50ZWVkIHRvIGdlbmVyYXRlIHRoZSB3cm9uZyBoYXNoIChlLmcuIFRlc3QgVmVjdG9yICMzLCBhIG1pbGxpb24KKyJhInMpLgorCitJIGFsc28gY2hhbmdlZCB0aGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzIGkgJiBqIGluIFNIQTFVcGRhdGUgdG8KK3Vuc2lnbmVkIGxvbmcgZnJvbSB1bnNpZ25lZCBpbnQgZm9yIHRoZSBzYW1lIHJlYXNvbi4KKworVGhlc2UgY2hhbmdlcyBzaG91bGQgbWFrZSBubyBkaWZmZXJlbmNlIHRvIGFueSAzMiBiaXQgaW1wbGVtZW50YXRpb25zIHNpbmNlCithbgoraW50IGFuZCBhIGxvbmcgYXJlIHRoZSBzYW1lIHNpemUgaW4gdGhvc2UgZW52aXJvbm1lbnRzLgorCistLQorSSBhbHNvIGNvcnJlY3RlZCBhIGZldyBjb21waWxlciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgQm9ybGFuZCBDLgorMS4gQWRkZWQgI2luY2x1ZGUgPHByb2Nlc3MuaD4gZm9yIGV4aXQoKSBwcm90b3R5cGUKKzIuIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlICdqJyBpbiBTSEExRmluYWwKKzMuIENoYW5nZWQgZXhpdCgwKSB0byByZXR1cm4oMCkgYXQgZW5kIG9mIG1haW4uCisKK0FMTCBjaGFuZ2VzIEkgbWFkZSBjYW4gYmUgbG9jYXRlZCBieSBzZWFyY2hpbmcgZm9yIGNvbW1lbnRzIGNvbnRhaW5pbmcgJ0pIQicKKy0tLS0tLS0tLS0tLS0tLS0tCitNb2RpZmllZCA4Lzk4CitCeSBTdGV2ZSBSZWlkIDxzcmVpZEBzZWEtdG8tc2t5Lm5ldD4KK1N0aWxsIDEwMCUgcHVibGljIGRvbWFpbgorCisxLSBSZW1vdmVkICNpbmNsdWRlIDxwcm9jZXNzLmg+IGFuZCB1c2VkIHJldHVybigpIGluc3RlYWQgb2YgZXhpdCgpCisyLSBGaXhlZCBvdmVyd3JpdGluZyBvZiBmaW5hbGNvdW50IGluIFNIQTFGaW5hbCgpIChkaXNjb3ZlcmVkIGJ5IENocmlzIEhhbGwpCiszLSBDaGFuZ2VkIGVtYWlsIGFkZHJlc3MgZnJvbSBzdGV2ZUBlZG13ZWIuY29tIHRvIHNyZWlkQHNlYS10by1za3kubmV0CisKKy0tLS0tLS0tLS0tLS0tLS0tCitNb2RpZmllZCA0LzAxCitCeSBTYXVsIEtyYXZpdHogPFNhdWwuS3Jhdml0ekBjZWxlcmEuY29tPgorU3RpbGwgMTAwJSBQRAorTW9kaWZpZWQgdG8gcnVuIG9uIENvbXBhcSBBbHBoYSBoYXJkd2FyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0KK01vZGlmaWVkIDIvMDMKK0J5IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorU3RpbGwgMTAwJSBQRAorTW9kaWZpZWQgdG8gcnVuIG9uIGFueSBoYXJkd2FyZSB3aXRoIDxpbnR0eXBlcy5oPiBhbmQgPG5ldGluZXQvaW4uaD4KK0NoYW5nZWQgdGhlIGRyaXZlciBwcm9ncmFtCisKKyovCisKKy8qCitUZXN0IFZlY3RvcnMgKGZyb20gRklQUyBQVUIgMTgwLTEpCisiYWJjIgorICBBOTk5M0UzNiA0NzA2ODE2QSBCQTNFMjU3MSA3ODUwQzI2QyA5Q0QwRDg5RAorImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIgorICA4NDk4M0U0NCAxQzNCRDI2RSBCQUFFNEFBMSBGOTUxMjlFNSBFNTQ2NzBGMQorQSBtaWxsaW9uIHJlcGV0aXRpb25zIG9mICJhIgorICAzNEFBOTczQyBENEM0REFBNCBGNjFFRUIyQiBEQkFEMjczMSA2NTM0MDE2RgorKi8KKworLyogI2RlZmluZSBTSEExSEFORFNPRkYgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgkJLyogRm9yIGh0b25sL250b2hsL2h0b25zL250b2hzICovCisKKy8qICNpbmNsdWRlIDxwcm9jZXNzLmg+ICovCS8qIHByb3RvdHlwZSBmb3IgZXhpdCgpIC0gSkhCICovCisvKiBVc2luZyByZXR1cm4oKSBpbnN0ZWFkIG9mIGV4aXQoKSAtIFNXUiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc3RhdGVbNV07CisgICAgdWludDMyX3QgY291bnRbMl07CisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbNjRdOworfSBTSEExX0NUWDsKKwordm9pZCBTSEExVHJhbnNmb3JtKHVpbnQzMl90IHN0YXRlWzVdLCB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF0pOwordm9pZCBTSEExSW5pdChTSEExX0NUWCogY29udGV4dCk7Cit2b2lkIFNIQTFVcGRhdGUoU0hBMV9DVFgqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIHVpbnQzMl90IGxlbik7CS8qCitKSEIgKi8KK3ZvaWQgU0hBMUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzIwXSwgU0hBMV9DVFgqIGNvbnRleHQpOworCisjZGVmaW5lIHJvbCh2YWx1ZSwgYml0cykgKCgodmFsdWUpIDw8IChiaXRzKSkgfCAoKHZhbHVlKSA+PiAoMzIgLSAoYml0cykpKSkKKworLyogYmxrMCgpIGFuZCBibGsoKSBwZXJmb3JtIHRoZSBpbml0aWFsIGV4cGFuZC4gKi8KKy8qIEkgZ290IHRoZSBpZGVhIG9mIGV4cGFuZGluZyBkdXJpbmcgdGhlIHJvdW5kIGZ1bmN0aW9uIGZyb20gU1NMZWF5ICovCisjZGVmaW5lIGJsazAoaSkgKGJsb2NrLT5sW2ldID0gbnRvaGwoYmxvY2stPmxbaV0pKQorI2RlZmluZSBibGsoaSkgKGJsb2NrLT5sW2kmMTVdID0gcm9sKGJsb2NrLT5sWyhpKzEzKSYxNV1eYmxvY2stPmxbKGkrOCkmMTVdIFwKKyAgICBeYmxvY2stPmxbKGkrMikmMTVdXmJsb2NrLT5sW2kmMTVdLDEpKQorCisvKiAoUjArUjEpLCBSMiwgUjMsIFI0IGFyZSB0aGUgZGlmZmVyZW50IG9wZXJhdGlvbnMgdXNlZCBpbiBTSEExICovCisjZGVmaW5lIFIwKHYsdyx4LHkseixpKSB6Kz0oKHcmKHheeSkpXnkpK2JsazAoaSkrMHg1QTgyNzk5OStyb2wodiw1KTt3PXJvbCh3LDMwKTsKKyNkZWZpbmUgUjEodix3LHgseSx6LGkpIHorPSgodyYoeF55KSleeSkrYmxrKGkpKzB4NUE4Mjc5OTkrcm9sKHYsNSk7dz1yb2wodywzMCk7CisjZGVmaW5lIFIyKHYsdyx4LHkseixpKSB6Kz0od154XnkpK2JsayhpKSsweDZFRDlFQkExK3JvbCh2LDUpO3c9cm9sKHcsMzApOworI2RlZmluZSBSMyh2LHcseCx5LHosaSkgeis9KCgod3x4KSZ5KXwodyZ4KSkrYmxrKGkpKzB4OEYxQkJDREMrcm9sKHYsNSk7dz1yb2wodywzMCk7CisjZGVmaW5lIFI0KHYsdyx4LHkseixpKSB6Kz0od154XnkpK2JsayhpKSsweENBNjJDMUQ2K3JvbCh2LDUpO3c9cm9sKHcsMzApOworCisKKyNpZmRlZiBWRVJCT1NFICAvKiBTQUsgKi8KK3ZvaWQgU0hBUHJpbnRDb250ZXh0KFNIQTFfQ1RYICpjb250ZXh0LCBjaGFyICptc2cpeworICBwcmludGYoIiVzICglZCwlZCkgJXggJXggJXggJXggJXhcbiIsCisJIG1zZywKKwkgY29udGV4dC0+Y291bnRbMF0sIGNvbnRleHQtPmNvdW50WzFdLAorCSBjb250ZXh0LT5zdGF0ZVswXSwKKwkgY29udGV4dC0+c3RhdGVbMV0sCisJIGNvbnRleHQtPnN0YXRlWzJdLAorCSBjb250ZXh0LT5zdGF0ZVszXSwKKwkgY29udGV4dC0+c3RhdGVbNF0pOworfQorI2VuZGlmCisKKy8qIEhhc2ggYSBzaW5nbGUgNTEyLWJpdCBibG9jay4gVGhpcyBpcyB0aGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLiAqLworCit2b2lkIFNIQTFUcmFuc2Zvcm0odWludDMyX3Qgc3RhdGVbNV0sIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XSkKK3sKK3VpbnQzMl90IGEsIGIsIGMsIGQsIGU7Cit0eXBlZGVmIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBjaGFyIGNbNjRdOworICAgIHVpbnQzMl90IGxbMTZdOworfSBDSEFSNjRMT05HMTY7CitDSEFSNjRMT05HMTYqIGJsb2NrOworI2lmZGVmIFNIQTFIQU5EU09GRgorc3RhdGljIHVuc2lnbmVkIGNoYXIgd29ya3NwYWNlWzY0XTsKKyAgICBibG9jayA9IChDSEFSNjRMT05HMTYqKXdvcmtzcGFjZTsKKyAgICBtZW1jcHkoYmxvY2ssIGJ1ZmZlciwgNjQpOworI2Vsc2UKKyAgICBibG9jayA9IChDSEFSNjRMT05HMTYqKWJ1ZmZlcjsKKyNlbmRpZgorICAgIC8qIENvcHkgY29udGV4dC0+c3RhdGVbXSB0byB3b3JraW5nIHZhcnMgKi8KKyAgICBhID0gc3RhdGVbMF07CisgICAgYiA9IHN0YXRlWzFdOworICAgIGMgPSBzdGF0ZVsyXTsKKyAgICBkID0gc3RhdGVbM107CisgICAgZSA9IHN0YXRlWzRdOworICAgIC8qIDQgcm91bmRzIG9mIDIwIG9wZXJhdGlvbnMgZWFjaC4gTG9vcCB1bnJvbGxlZC4gKi8KKyAgICBSMChhLGIsYyxkLGUsIDApOyBSMChlLGEsYixjLGQsIDEpOyBSMChkLGUsYSxiLGMsIDIpOyBSMChjLGQsZSxhLGIsIDMpOworICAgIFIwKGIsYyxkLGUsYSwgNCk7IFIwKGEsYixjLGQsZSwgNSk7IFIwKGUsYSxiLGMsZCwgNik7IFIwKGQsZSxhLGIsYywgNyk7CisgICAgUjAoYyxkLGUsYSxiLCA4KTsgUjAoYixjLGQsZSxhLCA5KTsgUjAoYSxiLGMsZCxlLDEwKTsgUjAoZSxhLGIsYyxkLDExKTsKKyAgICBSMChkLGUsYSxiLGMsMTIpOyBSMChjLGQsZSxhLGIsMTMpOyBSMChiLGMsZCxlLGEsMTQpOyBSMChhLGIsYyxkLGUsMTUpOworICAgIFIxKGUsYSxiLGMsZCwxNik7IFIxKGQsZSxhLGIsYywxNyk7IFIxKGMsZCxlLGEsYiwxOCk7IFIxKGIsYyxkLGUsYSwxOSk7CisgICAgUjIoYSxiLGMsZCxlLDIwKTsgUjIoZSxhLGIsYyxkLDIxKTsgUjIoZCxlLGEsYixjLDIyKTsgUjIoYyxkLGUsYSxiLDIzKTsKKyAgICBSMihiLGMsZCxlLGEsMjQpOyBSMihhLGIsYyxkLGUsMjUpOyBSMihlLGEsYixjLGQsMjYpOyBSMihkLGUsYSxiLGMsMjcpOworICAgIFIyKGMsZCxlLGEsYiwyOCk7IFIyKGIsYyxkLGUsYSwyOSk7IFIyKGEsYixjLGQsZSwzMCk7IFIyKGUsYSxiLGMsZCwzMSk7CisgICAgUjIoZCxlLGEsYixjLDMyKTsgUjIoYyxkLGUsYSxiLDMzKTsgUjIoYixjLGQsZSxhLDM0KTsgUjIoYSxiLGMsZCxlLDM1KTsKKyAgICBSMihlLGEsYixjLGQsMzYpOyBSMihkLGUsYSxiLGMsMzcpOyBSMihjLGQsZSxhLGIsMzgpOyBSMihiLGMsZCxlLGEsMzkpOworICAgIFIzKGEsYixjLGQsZSw0MCk7IFIzKGUsYSxiLGMsZCw0MSk7IFIzKGQsZSxhLGIsYyw0Mik7IFIzKGMsZCxlLGEsYiw0Myk7CisgICAgUjMoYixjLGQsZSxhLDQ0KTsgUjMoYSxiLGMsZCxlLDQ1KTsgUjMoZSxhLGIsYyxkLDQ2KTsgUjMoZCxlLGEsYixjLDQ3KTsKKyAgICBSMyhjLGQsZSxhLGIsNDgpOyBSMyhiLGMsZCxlLGEsNDkpOyBSMyhhLGIsYyxkLGUsNTApOyBSMyhlLGEsYixjLGQsNTEpOworICAgIFIzKGQsZSxhLGIsYyw1Mik7IFIzKGMsZCxlLGEsYiw1Myk7IFIzKGIsYyxkLGUsYSw1NCk7IFIzKGEsYixjLGQsZSw1NSk7CisgICAgUjMoZSxhLGIsYyxkLDU2KTsgUjMoZCxlLGEsYixjLDU3KTsgUjMoYyxkLGUsYSxiLDU4KTsgUjMoYixjLGQsZSxhLDU5KTsKKyAgICBSNChhLGIsYyxkLGUsNjApOyBSNChlLGEsYixjLGQsNjEpOyBSNChkLGUsYSxiLGMsNjIpOyBSNChjLGQsZSxhLGIsNjMpOworICAgIFI0KGIsYyxkLGUsYSw2NCk7IFI0KGEsYixjLGQsZSw2NSk7IFI0KGUsYSxiLGMsZCw2Nik7IFI0KGQsZSxhLGIsYyw2Nyk7CisgICAgUjQoYyxkLGUsYSxiLDY4KTsgUjQoYixjLGQsZSxhLDY5KTsgUjQoYSxiLGMsZCxlLDcwKTsgUjQoZSxhLGIsYyxkLDcxKTsKKyAgICBSNChkLGUsYSxiLGMsNzIpOyBSNChjLGQsZSxhLGIsNzMpOyBSNChiLGMsZCxlLGEsNzQpOyBSNChhLGIsYyxkLGUsNzUpOworICAgIFI0KGUsYSxiLGMsZCw3Nik7IFI0KGQsZSxhLGIsYyw3Nyk7IFI0KGMsZCxlLGEsYiw3OCk7IFI0KGIsYyxkLGUsYSw3OSk7CisgICAgLyogQWRkIHRoZSB3b3JraW5nIHZhcnMgYmFjayBpbnRvIGNvbnRleHQuc3RhdGVbXSAqLworICAgIHN0YXRlWzBdICs9IGE7CisgICAgc3RhdGVbMV0gKz0gYjsKKyAgICBzdGF0ZVsyXSArPSBjOworICAgIHN0YXRlWzNdICs9IGQ7CisgICAgc3RhdGVbNF0gKz0gZTsKKyAgICAvKiBXaXBlIHZhcmlhYmxlcyAqLworICAgIGEgPSBiID0gYyA9IGQgPSBlID0gMDsKK30KKworCisvKiBTSEExSW5pdCAtIEluaXRpYWxpemUgbmV3IGNvbnRleHQgKi8KKwordm9pZCBTSEExSW5pdChTSEExX0NUWCogY29udGV4dCkKK3sKKyAgICAvKiBTSEExIGluaXRpYWxpemF0aW9uIGNvbnN0YW50cyAqLworICAgIGNvbnRleHQtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBjb250ZXh0LT5zdGF0ZVsxXSA9IDB4RUZDREFCODk7CisgICAgY29udGV4dC0+c3RhdGVbMl0gPSAweDk4QkFEQ0ZFOworICAgIGNvbnRleHQtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKKyAgICBjb250ZXh0LT5zdGF0ZVs0XSA9IDB4QzNEMkUxRjA7CisgICAgY29udGV4dC0+Y291bnRbMF0gPSBjb250ZXh0LT5jb3VudFsxXSA9IDA7Cit9CisKKworLyogUnVuIHlvdXIgZGF0YSB0aHJvdWdoIHRoaXMuICovCisKK3ZvaWQgU0hBMVVwZGF0ZShTSEExX0NUWCogY29udGV4dCwgdW5zaWduZWQgY2hhciogZGF0YSwgdWludDMyX3QgbGVuKQkvKgorSkhCICovCit7Cit1aW50MzJfdCBpLCBqOwkvKiBKSEIgKi8KKworI2lmZGVmIFZFUkJPU0UKKyAgICBTSEFQcmludENvbnRleHQoY29udGV4dCwgImJlZm9yZSIpOworI2VuZGlmCisgICAgaiA9IChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDYzOworICAgIGlmICgoY29udGV4dC0+Y291bnRbMF0gKz0gbGVuIDw8IDMpIDwgKGxlbiA8PCAzKSkgY29udGV4dC0+Y291bnRbMV0rKzsKKyAgICBjb250ZXh0LT5jb3VudFsxXSArPSAobGVuID4+IDI5KTsKKyAgICBpZiAoKGogKyBsZW4pID4gNjMpIHsKKyAgICAgICAgbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbal0sIGRhdGEsIChpID0gNjQtaikpOworICAgICAgICBTSEExVHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOworICAgICAgICBmb3IgKCA7IGkgKyA2MyA8IGxlbjsgaSArPSA2NCkgeworICAgICAgICAgICAgU0hBMVRyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgJmRhdGFbaV0pOworICAgICAgICB9CisgICAgICAgIGogPSAwOworICAgIH0KKyAgICBlbHNlIGkgPSAwOworICAgIG1lbWNweSgmY29udGV4dC0+YnVmZmVyW2pdLCAmZGF0YVtpXSwgbGVuIC0gaSk7CisjaWZkZWYgVkVSQk9TRQorICAgIFNIQVByaW50Q29udGV4dChjb250ZXh0LCAiYWZ0ZXIgIik7CisjZW5kaWYKK30KKworCisvKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4gKi8KKwordm9pZCBTSEExRmluYWwodW5zaWduZWQgY2hhciBkaWdlc3RbMjBdLCBTSEExX0NUWCogY29udGV4dCkKK3sKK3VpbnQzMl90IGk7CS8qIEpIQiAqLwordW5zaWduZWQgY2hhciBmaW5hbGNvdW50WzhdOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmaW5hbGNvdW50W2ldID0gKHVuc2lnbmVkIGNoYXIpKChjb250ZXh0LT5jb3VudFsoaSA+PSA0ID8gMCA6IDEpXQorICAgICAgICAgPj4gKCgzLShpICYgMykpICogOCkgKSAmIDI1NSk7ICAvKiBFbmRpYW4gaW5kZXBlbmRlbnQgKi8KKyAgICB9CisgICAgU0hBMVVwZGF0ZShjb250ZXh0LCAodW5zaWduZWQgY2hhciAqKSJcMjAwIiwgMSk7CisgICAgd2hpbGUgKChjb250ZXh0LT5jb3VudFswXSAmIDUwNCkgIT0gNDQ4KSB7CisgICAgICAgIFNIQTFVcGRhdGUoY29udGV4dCwgKHVuc2lnbmVkIGNoYXIgKikiXDAiLCAxKTsKKyAgICB9CisgICAgU0hBMVVwZGF0ZShjb250ZXh0LCBmaW5hbGNvdW50LCA4KTsgIC8qIFNob3VsZCBjYXVzZSBhIFNIQTFUcmFuc2Zvcm0oKQorKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICBkaWdlc3RbaV0gPSAodW5zaWduZWQgY2hhcikKKyAgICAgICAgICgoY29udGV4dC0+c3RhdGVbaT4+Ml0gPj4gKCgzLShpICYgMykpICogOCkgKSAmIDI1NSk7CisgICAgfQorICAgIC8qIFdpcGUgdmFyaWFibGVzICovCisgICAgaSA9IDA7CS8qIEpIQiAqLworICAgIG1lbXNldChjb250ZXh0LT5idWZmZXIsIDAsIDY0KTsKKyAgICBtZW1zZXQoY29udGV4dC0+c3RhdGUsIDAsIDIwKTsKKyAgICBtZW1zZXQoY29udGV4dC0+Y291bnQsIDAsIDgpOworICAgIG1lbXNldChmaW5hbGNvdW50LCAwLCA4KTsJLyogU1dSICovCisjaWZkZWYgU0hBMUhBTkRTT0ZGICAvKiBtYWtlIFNIQTFUcmFuc2Zvcm0gb3ZlcndyaXRlIGl0J3Mgb3duIHN0YXRpYyB2YXJzICovCisgICAgU0hBMVRyYW5zZm9ybShjb250ZXh0LT5zdGF0ZSwgY29udGV4dC0+YnVmZmVyKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBpcyBub3QgcXVpdGUgdGhlIE1JTUUgYmFzZTY0IGFsZ29yaXRobTogaXQgdXNlcyBfIGluc3RlYWQgb2YgLywKKyAgIGFuZCBpbnN0ZWFkIG9mIHBhZGRpbmcgdGhlIG91dHB1dCB3aXRoID0gY2hhcmFjdGVycyB3ZSBqdXN0IG1ha2UgdGhlCisgICBvdXRwdXQgc2hvcnRlci4gKi8KK2NoYXIgKm15YmFzZTY0KHVpbnQ4X3QgZGlnZXN0WzIwXSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgY2hhcnpbXSA9CisgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8iOworICB1aW50OF90IGlucHV0WzIxXTsKKyAgc3RhdGljIGNoYXIgb3V0cHV0WzI4XTsKKyAgaW50IGksIGo7CisgIHVpbnQ4X3QgKnA7CisgIGNoYXIgKnE7CisgIHVpbnQzMl90IGJ2OworCisgIG1lbWNweShpbnB1dCwgZGlnZXN0LCAyMCk7CisgIGlucHV0WzIwXSA9IDA7CQkvKiBQYWQgdG8gbXVsdGlwbGUgb2YgMyBieXRlcyAqLworCisgIHAgPSBpbnB1dDsgIHEgPSBvdXRwdXQ7CisgIGZvciAoIGkgPSAwIDsgaSA8IDcgOyBpKysgKSB7CisgICAgYnYgPSAocFswXSA8PCAxNikgfCAocFsxXSA8PCA4KSB8IHBbMl07CisgICAgcCArPSAzOworICAgIGZvciAoIGogPSAwIDsgaiA8IDQgOyBqKysgKSB7CisgICAgICAqcSsrID0gY2hhcnpbKGJ2ID4+IDE4KSAmIDB4M2ZdOworICAgICAgYnYgPDw9IDY7CisgICAgfQorICB9CisgICotLXEgPSAnXDAnOwkJCS8qIFRoZSBsYXN0IGNoYXJhY3RlciBpcyBub3Qgc2lnbmlmaWNhbnQgKi8KKyAgcmV0dXJuIG91dHB1dDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICBpbnQgaTsKKyAgU0hBMV9DVFggY29udGV4dDsKKyAgdWludDhfdCBkaWdlc3RbMjBdLCBidWZmZXJbMTYzODRdOworICBGSUxFKiBmaWxlOworCisgIGlmIChhcmdjIDwgMikgeworICAgIGZpbGUgPSBzdGRpbjsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIShmaWxlID0gZm9wZW4oYXJndlsxXSwgInJiIikpKSB7CisgICAgICBmcHV0cygiVW5hYmxlIHRvIG9wZW4gZmlsZS4iLCBzdGRlcnIpOworICAgICAgcmV0dXJuKC0xKTsKKyAgICB9CisgIH0KKyAgU0hBMUluaXQoJmNvbnRleHQpOworICB3aGlsZSAoIWZlb2YoZmlsZSkpIHsgIC8qIG5vdGU6IHdoYXQgaWYgZmVycm9yKGZpbGUpICovCisgICAgaSA9IGZyZWFkKGJ1ZmZlciwgMSwgMTYzODQsIGZpbGUpOworICAgIFNIQTFVcGRhdGUoJmNvbnRleHQsIGJ1ZmZlciwgaSk7CisgIH0KKyAgU0hBMUZpbmFsKGRpZ2VzdCwgJmNvbnRleHQpOworICBmY2xvc2UoZmlsZSk7CisKKyAgcHV0cyhteWJhc2U2NChkaWdlc3QpKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zaG1fb3Blbi5jIGIvdXNyL2tsaWJjL3NobV9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlOTNhYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaG1fb3Blbi5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBzaG1fb3Blbi5jCisgKgorICogUE9TSVggc2hhcmVkIG1lbW9yeSBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKworaW50IHNobV9vcGVuKGNvbnN0IGNoYXIgKnBhdGgsIGludCBvZmxhZywgbW9kZV90IG1vZGUpCit7CisJaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKKwljaGFyICpwYXRoYnVmID0gYWxsb2NhKGxlbisxMCk7CisKKwltZW1jcHkocGF0aGJ1ZiwgIi9kZXYvc2htLyIsIDkpOworCW1lbWNweShwYXRoYnVmKzksIHBhdGgsIGxlbisxKTsKKworCXJldHVybiBvcGVuX2Nsb2V4ZWMocGF0aCwgb2ZsYWcsIG1vZGUpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NobV91bmxpbmsuYyBiL3Vzci9rbGliYy9zaG1fdW5saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhOThhMAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaG1fdW5saW5rLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIHNobV91bmxpbmsuYworICoKKyAqIFBPU0lYIHNoYXJlZCBtZW1vcnkgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisKK2ludCBzaG1fdW5saW5rKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKKwljaGFyICpwYXRoYnVmID0gYWxsb2NhKGxlbisxMCk7CisKKwltZW1jcHkocGF0aGJ1ZiwgIi9kZXYvc2htLyIsIDkpOworCW1lbWNweShwYXRoYnVmKzksIHBhdGgsIGxlbisxKTsKKworCXJldHVybiB1bmxpbmsocGF0aCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2lnYWJicmV2LmMgYi91c3Iva2xpYmMvc2lnYWJicmV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhNzk5YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaWdhYmJyZXYuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIHNpZ2FiYnJldi5oCisgKgorICogQ29uc3RydWN0IHRoZSBhYmJyZXZpYXRlZCBzaWduYWwgbGlzdAorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworY29uc3QgY2hhciAqY29uc3Qgc3lzX3NpZ2FiYnJldltOU0lHXSA9IHsKKyNpZmRlZiBTSUdBQlJUCisJW1NJR0FCUlRdID0gIkFCUlQiLAorI2VuZGlmCisjaWZkZWYgU0lHQUxSTQorCVtTSUdBTFJNXSA9ICJBTFJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR0JVUworCVtTSUdCVVNdID0gIkJVUyIsCisjZW5kaWYKKyNpZmRlZiBTSUdDSExECisJW1NJR0NITERdID0gIkNITEQiLAorI2VuZGlmCisjaWYgZGVmaW5lZChTSUdDTEQpICYmIChTSUdDSExEICE9IFNJR0NMRCkKKwlbU0lHQ0xEXSA9ICJDTEQiLAorI2VuZGlmCisjaWZkZWYgU0lHRU1UCisJW1NJR0VNVF0gPSAiRU1UIiwKKyNlbmRpZgorI2lmZGVmIFNJR0ZQRQorCVtTSUdGUEVdID0gIkZQRSIsCisjZW5kaWYKKyNpZmRlZiBTSUdIVVAKKwlbU0lHSFVQXSA9ICJIVVAiLAorI2VuZGlmCisjaWZkZWYgU0lHSUxMCisJW1NJR0lMTF0gPSAiSUxMIiwKKyNlbmRpZgorCS8qIFNJR0lORk8gPT0gU0lHUFdSICovCisjaWZkZWYgU0lHSU5UCisJW1NJR0lOVF0gPSAiSU5UIiwKKyNlbmRpZgorI2lmZGVmIFNJR0lPCisJW1NJR0lPXSA9ICJJTyIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJR0lPVCkgJiYgKFNJR0lPVCAhPSBTSUdBQlJUKQorCVtTSUdJT1RdID0gIklPVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdLSUxMCisJW1NJR0tJTExdID0gIktJTEwiLAorI2VuZGlmCisjaWYgZGVmaW5lZChTSUdMT1NUKSAmJiAoU0lHTE9TVCAhPSBTSUdJTykgJiYgKFNJR0xPU1QgIT0gU0lHUFdSKQorCVtTSUdMT1NUXSA9ICJMT1NUIiwKKyNlbmRpZgorI2lmZGVmIFNJR1BJUEUKKwlbU0lHUElQRV0gPSAiUElQRSIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJR1BPTEwpICYmIChTSUdQT0xMICE9IFNJR0lPKQorCVtTSUdQT0xMXSA9ICJQT0xMIiwKKyNlbmRpZgorI2lmZGVmIFNJR1BST0YKKwlbU0lHUFJPRl0gPSAiUFJPRiIsCisjZW5kaWYKKyNpZmRlZiBTSUdQV1IKKwlbU0lHUFdSXSA9ICJQV1IiLAorI2VuZGlmCisjaWZkZWYgU0lHUVVJVAorCVtTSUdRVUlUXSA9ICJRVUlUIiwKKyNlbmRpZgorCS8qIFNJR1JFU0VSVkUgPT0gU0lHVU5VU0VEICovCisjaWZkZWYgU0lHU0VHVgorCVtTSUdTRUdWXSA9ICJTRUdWIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NUS0ZMVAorCVtTSUdTVEtGTFRdID0gIlNUS0ZMVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdTVE9QCisJW1NJR1NUT1BdID0gIlNUT1AiLAorI2VuZGlmCisjaWZkZWYgU0lHU1lTCisJW1NJR1NZU10gPSAiU1lTIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RFUk0KKwlbU0lHVEVSTV0gPSAiVEVSTSIsCisjZW5kaWYKKyNpZmRlZiBTSUdUU1RQCisJW1NJR1RTVFBdID0gIlRTVFAiLAorI2VuZGlmCisjaWZkZWYgU0lHVFRJTgorCVtTSUdUVElOXSA9ICJUVElOIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RUT1UKKwlbU0lHVFRPVV0gPSAiVFRPVSIsCisjZW5kaWYKKyNpZmRlZiBTSUdVUkcKKwlbU0lHVVJHXSA9ICJVUkciLAorI2VuZGlmCisjaWZkZWYgU0lHVVNSMQorCVtTSUdVU1IxXSA9ICJVU1IxIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjIKKwlbU0lHVVNSMl0gPSAiVVNSMiIsCisjZW5kaWYKKyNpZmRlZiBTSUdWVEFMUk0KKwlbU0lHVlRBTFJNXSA9ICJWVEFMUk0iLAorI2VuZGlmCisjaWZkZWYgU0lHV0lOQ0gKKwlbU0lHV0lOQ0hdID0gIldJTkNIIiwKKyNlbmRpZgorI2lmZGVmIFNJR1hDUFUKKwlbU0lHWENQVV0gPSAiWENQVSIsCisjZW5kaWYKKyNpZmRlZiBTSUdYRlNaCisJW1NJR1hGU1pdID0gIlhGU1oiLAorI2VuZGlmCisjaWZkZWYgU0lHVFJBUAorCVtTSUdUUkFQXSA9ICJUUkFQIiwKKyNlbmRpZgorI2lmZGVmIFNJR0NPTlQKKwlbU0lHQ09OVF0gPSAiQ09OVCIsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2lnYWN0aW9uLmMgYi91c3Iva2xpYmMvc2lnYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4YzNhZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaWdhY3Rpb24uYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogc2lnYWN0aW9uLmMKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKworX19leHRlcm4gdm9pZCBfX3NpZ3JldHVybih2b2lkKTsKK19fZXh0ZXJuIGludCBfX3NpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiwgc3RydWN0IHNpZ2FjdGlvbiAqKTsKKyNpZmRlZiBfX3NwYXJjX18KK19fZXh0ZXJuIGludCBfX3J0X3NpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiwgc3RydWN0IHNpZ2FjdGlvbiAqLAorCQkJICAgIHZvaWQgKCopKHZvaWQpLCBzaXplX3QpOworI2Vsc2UKK19fZXh0ZXJuIGludCBfX3J0X3NpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKiwgc3RydWN0IHNpZ2FjdGlvbiAqLAorCQkJICAgIHNpemVfdCk7CisjZW5kaWYKKworaW50IHNpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9hY3QpCit7CisJaW50IHJ2OworCisjaWYgX0tMSUJDX05FRURTX1NBX1JFU1RPUkVSCisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCWlmIChhY3QgJiYgIShhY3QtPnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpKSB7CisJCXNhID0gKmFjdDsKKwkJYWN0ID0gJnNhOworCisJCS8qIFRoZSBrZXJuZWwgY2FuJ3QgYmUgdHJ1c3RlZCB0byBoYXZlIGEgdmFsaWQgZGVmYXVsdAorCQkgICByZXN0b3JlciAqLworCQlzYS5zYV9mbGFncyB8PSBTQV9SRVNUT1JFUjsKKwkJc2Euc2FfcmVzdG9yZXIgPSAmX19zaWdyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZiBfS0xJQkNfVVNFX1JUX1NJRworIyBpZmRlZiBfX3NwYXJjX18KKwl7CisJCXZvaWQgKCpyZXN0b3Jlcikodm9pZCk7CisJCXJlc3RvcmVyID0gKGFjdCAmJiBhY3QtPnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCisJCQk/ICh2b2lkICgqKSh2b2lkKSkoKHVpbnRwdHJfdClhY3QtPnNhX3Jlc3RvcmVyIC0gOCkKKwkJCTogTlVMTDsKKwkJcnYgPSBfX3J0X3NpZ2FjdGlvbihzaWcsIGFjdCwgb2FjdCwgcmVzdG9yZXIsIHNpemVvZihzaWdzZXRfdCkpOworCX0KKyMgZWxzZQorCXJ2ID0gX19ydF9zaWdhY3Rpb24oc2lnLCBhY3QsIG9hY3QsIHNpemVvZihzaWdzZXRfdCkpOworIyBlbmRpZgorI2Vsc2UKKwlydiA9IF9fc2lnYWN0aW9uKHNpZywgYWN0LCBvYWN0KTsKKyNlbmRpZgorCisjaWYgX0tMSUJDX05FRURTX1NBX1JFU1RPUkVSCisJaWYgKG9hY3QgJiYgKG9hY3QtPnNhX3Jlc3RvcmVyID09ICZfX3NpZ3JldHVybikpIHsKKwkJb2FjdC0+c2FfZmxhZ3MgJj0gflNBX1JFU1RPUkVSOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NpZ2xpc3QuYyBiL3Vzci9rbGliYy9zaWdsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MDA0OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaWdsaXN0LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBzaWdsaXN0LmgKKyAqCisgKiBDb25zdHJ1Y3QgdGhlIHNpZ25hbCBsaXN0CisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitjb25zdCBjaGFyICpjb25zdCBzeXNfc2lnbGlzdFtOU0lHXSA9IHsKKyNpZmRlZiBTSUdBQlJUCisJW1NJR0FCUlRdID0gIkFib3J0ZWQiLAorI2VuZGlmCisjaWZkZWYgU0lHQUxSTQorCVtTSUdBTFJNXSA9ICJBbGFybSBjbG9jayIsCisjZW5kaWYKKyNpZmRlZiBTSUdCVVMKKwlbU0lHQlVTXSA9ICJCdXMgZXJyb3IiLAorI2VuZGlmCisjaWZkZWYgU0lHQ0hMRAorCVtTSUdDSExEXSA9ICJDaGlsZCBleGl0ZWQiLAorI2VuZGlmCisjaWYgZGVmaW5lZChTSUdDTEQpICYmIChTSUdDSExEICE9IFNJR0NMRCkKKwlbU0lHQ0xEXSA9ICJDaGlsZCBleGl0ZWQiLAorI2VuZGlmCisjaWZkZWYgU0lHRU1UCisJW1NJR0VNVF0gPSAiRW11bGF0aW9uIHRyYXAiLAorI2VuZGlmCisjaWZkZWYgU0lHRlBFCisJW1NJR0ZQRV0gPSAiRmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIiwKKyNlbmRpZgorI2lmZGVmIFNJR0hVUAorCVtTSUdIVVBdID0gIkhhbmd1cCIsCisjZW5kaWYKKyNpZmRlZiBTSUdJTEwKKwlbU0lHSUxMXSA9ICJJbGxlZ2FsIGluc3RydWN0aW9uIiwKKyNlbmRpZgorCS8qIFNJR0lORk8gPT0gU0lHUFdSICovCisjaWZkZWYgU0lHSU5UCisJW1NJR0lOVF0gPSAiSW50ZXJydXB0IiwKKyNlbmRpZgorI2lmZGVmIFNJR0lPCisJW1NJR0lPXSA9ICJJL08gcG9zc2libGUiLAorI2VuZGlmCisjaWYgZGVmaW5lZChTSUdJT1QpICYmIChTSUdJT1QgIT0gU0lHQUJSVCkKKwlbU0lHSU9UXSA9ICJJL08gdHJhcCIsCisjZW5kaWYKKyNpZmRlZiBTSUdLSUxMCisJW1NJR0tJTExdID0gIktpbGxlZCIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJR0xPU1QpICYmIChTSUdMT1NUICE9IFNJR0lPKSAmJiAoU0lHTE9TVCAhPSBTSUdQV1IpCisJW1NJR0xPU1RdID0gIkxvY2sgbG9zdCIsCisjZW5kaWYKKyNpZmRlZiBTSUdQSVBFCisJW1NJR1BJUEVdID0gIkJyb2tlbiBwaXBlIiwKKyNlbmRpZgorI2lmIGRlZmluZWQoU0lHUE9MTCkgJiYgKFNJR1BPTEwgIT0gU0lHSU8pCisJW1NJR1BPTExdID0gIlBvbGxhYmxlIGV2ZW50IiwKKyNlbmRpZgorI2lmZGVmIFNJR1BST0YKKwlbU0lHUFJPRl0gPSAiUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQiLAorI2VuZGlmCisjaWZkZWYgU0lHUFdSCisJW1NJR1BXUl0gPSAiUG93ZXIgZmFpbHVyZSIsCisjZW5kaWYKKyNpZmRlZiBTSUdRVUlUCisJW1NJR1FVSVRdID0gIlF1aXQiLAorI2VuZGlmCisJLyogU0lHUkVTRVJWRSA9PSBTSUdVTlVTRUQgKi8KKyNpZmRlZiBTSUdTRUdWCisJW1NJR1NFR1ZdID0gIlNlZ21lbnQgdmlvbGF0aW9uIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NUS0ZMVAorCVtTSUdTVEtGTFRdID0gIlN0YWNrIGZhdWx0IiwKKyNlbmRpZgorI2lmZGVmIFNJR1NUT1AKKwlbU0lHU1RPUF0gPSAiU3RvcHBlZCAoc2lnbmFsKSIsCisjZW5kaWYKKyNpZmRlZiBTSUdTWVMKKwlbU0lHU1lTXSA9ICJCYWQgc3lzdGVtIGNhbGwiLAorI2VuZGlmCisjaWZkZWYgU0lHVEVSTQorCVtTSUdURVJNXSA9ICJUZXJtaW5hdGVkIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RTVFAKKwlbU0lHVFNUUF0gPSAiU3RvcHBlZCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUVElOCisJW1NJR1RUSU5dID0gIlN0b3BwZWQgKHR0eSBpbnB1dCkiLAorI2VuZGlmCisjaWZkZWYgU0lHVFRPVQorCVtTSUdUVE9VXSA9ICJTdG9wcGVkICh0dHkgb3V0cHV0KSIsCisjZW5kaWYKKyNpZmRlZiBTSUdVUkcKKwlbU0lHVVJHXSA9ICJVcmdlbnQgSS9PIGNvbmRpdGlvbiIsCisjZW5kaWYKKyNpZmRlZiBTSUdVU1IxCisJW1NJR1VTUjFdID0gIlVzZXIgc2lnbmFsIDEiLAorI2VuZGlmCisjaWZkZWYgU0lHVVNSMgorCVtTSUdVU1IyXSA9ICJVc2VyIHNpZ25hbCAyIiwKKyNlbmRpZgorI2lmZGVmIFNJR1ZUQUxSTQorCVtTSUdWVEFMUk1dID0gIlZpcnR1YWwgdGltZXIgZXhwaXJlZCIsCisjZW5kaWYKKyNpZmRlZiBTSUdXSU5DSAorCVtTSUdXSU5DSF0gPSAiV2luZG93IHNpemUgY2hhbmdlZCIsCisjZW5kaWYKKyNpZmRlZiBTSUdYQ1BVCisJW1NJR1hDUFVdID0gIkNQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkIiwKKyNlbmRpZgorI2lmZGVmIFNJR1hGU1oKKwlbU0lHWEZTWl0gPSAiRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RSQVAKKwlbU0lHVFJBUF0gPSAiVHJhY2UvYnJlYWtwb2ludCB0cmFwIiwKKyNlbmRpZgorI2lmZGVmIFNJR0NPTlQKKwlbU0lHQ09OVF0gPSAiQ29udGludWUiLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NpZ2xvbmdqbXAuYyBiL3Vzci9rbGliYy9zaWdsb25nam1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwNDJjYgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaWdsb25nam1wLmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIHNpZ2xvbmdqbXAuYworICoKKyAqIHNpZ3NldGptcCgpIGlzIGEgbWFjcm8sIGJ5IG5lY2Vzc2l0eSAoaXQncyBlaXRoZXIgdGhhdCBvciB3cml0ZQorICogaXQgaW4gYXNzZW1ibHkpLCBidXQgc2lnbG9uZ2ptcCgpIGlzIGEgbm9ybWFsIGZ1bmN0aW9uLgorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworX19ub3JldHVybiBzaWdsb25nam1wKHNpZ2ptcF9idWYgYnVmLCBpbnQgcmV0dmFsKQoreworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYnVmLT5fX3NpZ3MsIE5VTEwpOworCWxvbmdqbXAoYnVmLT5fX2ptcGJ1ZiwgcmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zaWdwZW5kaW5nLmMgYi91c3Iva2xpYmMvc2lncGVuZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmQzZTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc2lncGVuZGluZy5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBzaWdwZW5kaW5nLmMKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKworI2lmIF9LTElCQ19VU0VfUlRfU0lHCisKK19fZXh0ZXJuIGludCBfX3J0X3NpZ3BlbmRpbmcoc2lnc2V0X3QgKiwgc2l6ZV90KTsKKworaW50IHNpZ3BlbmRpbmcoc2lnc2V0X3QgKiBzZXQpCit7CisJcmV0dXJuIF9fcnRfc2lncGVuZGluZyhzZXQsIHNpemVvZihzaWdzZXRfdCkpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zaWdwcm9jbWFzay5jIGIvdXNyL2tsaWJjL3NpZ3Byb2NtYXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExMmMxMwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zaWdwcm9jbWFzay5jCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBzaWdwcm9jbWFzay5jCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CisKKyNpZiBfS0xJQkNfVVNFX1JUX1NJRworCitfX2V4dGVybiBpbnQgX19ydF9zaWdwcm9jbWFzayhpbnQsIGNvbnN0IHNpZ3NldF90ICosIHNpZ3NldF90ICosIHNpemVfdCk7CisKK2ludCBzaWdwcm9jbWFzayhpbnQgaG93LCBjb25zdCBzaWdzZXRfdCAqIHNldCwgc2lnc2V0X3QgKiBvc2V0KQoreworCXJldHVybiBfX3J0X3NpZ3Byb2NtYXNrKGhvdywgc2V0LCBvc2V0LCBzaXplb2Yoc2lnc2V0X3QpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc2lnc3VzcGVuZC5jIGIvdXNyL2tsaWJjL3NpZ3N1c3BlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDkxMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NpZ3N1c3BlbmQuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogc2lnc3VzcGVuZC5jCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8a2xpYmMvc3lzY29uZmlnLmg+CisKKyNpZiBfS0xJQkNfVVNFX1JUX1NJRworCitfX2V4dGVybiBpbnQgX19ydF9zaWdzdXNwZW5kKGNvbnN0IHNpZ3NldF90ICosIHNpemVfdCk7CisKK2ludCBzaWdzdXNwZW5kKGNvbnN0IHNpZ3NldF90ICogbWFzaykKK3sKKwlyZXR1cm4gX19ydF9zaWdzdXNwZW5kKG1hc2ssIHNpemVvZiAqbWFzayk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NsZWVwLmMgYi91c3Iva2xpYmMvc2xlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBjNTFkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NsZWVwLmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIHNsZWVwLmMKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3Vuc2lnbmVkIGludCBzbGVlcCh1bnNpZ25lZCBpbnQgc2Vjb25kcykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwl0cy50dl9zZWMgPSBzZWNvbmRzOworCXRzLnR2X25zZWMgPSAwOworCWlmICghbmFub3NsZWVwKCZ0cywgJnRzKSkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoZXJybm8gPT0gRUlOVFIpCisJCXJldHVybiB0cy50dl9zZWM7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc25wcmludGYuYyBiL3Vzci9rbGliYy9zbnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2IzY2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc25wcmludGYuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogc25wcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgc25wcmludGYoY2hhciAqYnVmZmVyLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcnY7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlydiA9IHZzbnByaW50ZihidWZmZXIsIG4sIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7CisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NvY2tldGNhbGxzLnBsIGIvdXNyL2tsaWJjL3NvY2tldGNhbGxzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Zjc1YWIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc29ja2V0Y2FsbHMucGwKQEAgLTAsMCArMSw4OCBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyR2ID0gJEVOVnsnS0JVSUxEX1ZFUkJPU0UnfTsKKyRxdWlldCA9IGRlZmluZWQoJHYpID8gISR2IDogMDsKKworQGFyZ3MgPSAoKTsKK2ZvciAkYXJnICggQEFSR1YgKSB7CisgICAgaWYgKCAkYXJnID1+IC9eLS8gKSB7CisJaWYgKCAkYXJnIGVxICctcScgKSB7CisJICAgICRxdWlldCA9IDE7CisJfSBlbHNlIHsKKwkgICAgZGllICIkMDogVW5rbm93biBvcHRpb246ICRhcmdcbiI7CisJfQorICAgIH0gZWxzZSB7CisJcHVzaChAYXJncywgJGFyZyk7CisgICAgfQorfQorKCRmaWxlLCAkYXJjaCwgJG91dHB1dGRpcikgPSBAYXJnczsKKworaWYgKCFvcGVuKEZJTEUsICI8ICRmaWxlIikpIHsKKyAgICBkaWUgIiRmaWxlOiAkIVxuIjsKK30KKworcHJpbnQgInNvY2tldGNhbGwtb2JqcyA6PSAiOword2hpbGUgKCBkZWZpbmVkKCRsaW5lID0gPEZJTEU+KSApIHsKKyAgICBjaG9tcCAkbGluZTsKKyAgICAkbGluZSA9fiBzL1xzKih8XCMuKnxcL1wvLiopJC8vOwkjIFN0cmlwIGNvbW1lbnRzIGFuZCB0cmFpbGluZyBibGFua3MKKyAgICBuZXh0IHVubGVzcyAkbGluZTsKKworICAgIGlmICggJGxpbmUgPX4gL15ccypcPFw/XD5ccyooLiopXHMrKFtfYS16QS1aXVtfYS16QS1aMC05XSspXHMqXCgoLiopXClccypcOyQvICkgeworCSR0eXBlID0gJDE7CisJJG5hbWUgPSAkMjsKKwkkYXJndiA9ICQzOworCisJQGFyZ3MgPSBzcGxpdCgvXHMqXCxccyovLCAkYXJndik7CisJQGNhcmdzID0gKCk7CisKKwkkaSA9IDA7CisJZm9yICRhcmcgKCBAYXJncyApIHsKKwkgICAgcHVzaChAY2FyZ3MsICIkYXJnIGEiLiRpKyspOworCX0KKwkkbmFyZ3MgPSAkaTsKKwlwcmludCAiIFxcXG5cdCR7bmFtZX0ubyI7CisKKwlpZiAoICRhcmNoIGVxICdpMzg2JyApIHsKKwkgICAgb3BlbihPVVQsICI+ICR7b3V0cHV0ZGlyfS8ke25hbWV9LlMiKQorCQlvciBkaWUgIiQwOiBDYW5ub3Qgb3BlbiAke291dHB1dGRpcn0vJHtuYW1lfS5TXG4iOworCisJICAgIHByaW50IE9VVCAiI2luY2x1ZGUgPHN5cy9zb2NrZXRjYWxscy5oPlxuIjsKKwkgICAgcHJpbnQgT1VUICJcbiI7CisJICAgIHByaW50IE9VVCAiXHQudGV4dFxuIjsKKwkgICAgcHJpbnQgT1VUICJcdC5hbGlnbgk0XG4iOworCSAgICBwcmludCBPVVQgIlx0Lmdsb2JsCSR7bmFtZX1cbiI7CisJICAgIHByaW50IE9VVCAiXHQudHlwZQkke25hbWV9LFxAZnVuY3Rpb25cbiI7CisJICAgIHByaW50IE9VVCAiJHtuYW1lfTpcbiI7CisJICAgIHByaW50IE9VVCAiXHRwdXNobAlcJFNZU19cVSR7bmFtZX1cbiI7CisJICAgIHByaW50IE9VVCAiXHRqbXAJX19zb2NrZXRjYWxsX2NvbW1vblxuIjsKKwkgICAgcHJpbnQgT1VUICJcdC5zaXplICR7bmFtZX0sLi0ke25hbWV9XG4iOworCSAgICBjbG9zZShPVVQpOworCX0gZWxzZSB7CisJICAgIG9wZW4oT1VULCAiPiAke291dHB1dGRpcn0vJHtuYW1lfS5jIikKKwkJb3IgZGllICIkMDogQ2Fubm90IG9wZW4gJHtvdXRwdXRkaXJ9LyR7bmFtZX0uY1xuIjsKKworCSAgICBwcmludCBPVVQgIiNpbmNsdWRlIFwic29ja2V0Y29tbW9uLmhcIlxuIjsKKwkgICAgcHJpbnQgT1VUICJcbiI7CisJICAgIHByaW50IE9VVCAiI2lmbmRlZiBfX05SXyR7bmFtZX1cblxuIjsKKworCSAgICBwcmludCBPVVQgImV4dGVybiBsb25nIF9fc29ja2V0Y2FsbChpbnQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKik7XG5cbiI7CisKKwkgICAgcHJpbnQgT1VUICIkdHlwZSAkbmFtZSAoIiwgam9pbignLCAnLCBAY2FyZ3MpLCAiKVxuIjsKKwkgICAgcHJpbnQgT1VUICJ7XG4iOworCSAgICBwcmludCBPVVQgIiAgICB1bnNpZ25lZCBsb25nIGFyZ3NbJG5hcmdzXTtcbiI7CisJICAgIGZvciAoICRpID0gMCA7ICRpIDwgJG5hcmdzIDsgJGkrKyApIHsKKwkJcHJpbnQgT1VUICIgICAgYXJnc1skaV0gPSAodW5zaWduZWQgbG9uZylhJGk7XG4iOworCSAgICB9CisJICAgIHByaW50IE9VVCAiICAgIHJldHVybiAoJHR5cGUpIF9fc29ja2V0Y2FsbChTWVNfXFUke25hbWV9XEUsIGFyZ3MpO1xuIjsKKwkgICAgcHJpbnQgT1VUICJ9XG5cbiI7CisKKwkgICAgcHJpbnQgT1VUICIjZW5kaWZcbiI7CisKKwkgICAgY2xvc2UoT1VUKTsKKwl9CisgICAgfSBlbHNlIHsKKwlkaWUgIiRmaWxlOiQuOiBDb3VsZCBub3QgcGFyc2UgaW5wdXRcbiI7CisgICAgfQorfQorCitwcmludCAiXG4iOwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NvY2tldGNhbGxzL0tidWlsZCBiL3Vzci9rbGliYy9zb2NrZXRjYWxscy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmYzlhOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zb2NrZXRjYWxscy9LYnVpbGQKQEAgLTAsMCArMSw1MCBAQAorIworIyBHZW5lcmF0ZSBzb2NrZXQgY2FsbHMgYmFzZWQgb24gU09DS0VUQ0FMTFMuZGVmCisjCisKKyMgSW5jbHVkZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBNYWtlZmlsZSBmcmFnbWVudC4KKyMgSXQgY29udGFpbnMgZGVmaW5pdGlvbiBvZiBzb2NrZXRjYWxsLW9ianMgc3BlY2lmeWluZyBuYW1lIG9mIGFsbCAubyBmaWxlcworaWZlcSAoJChjbGVhbiksKQorLWluY2x1ZGUgJChvYmopL3NvY2tldGNhbGxzLm1rCitlbmRpZgorCisjIExpc3Rpbmcgb2YgYWxsIC5vIGZpbGVzCithbHdheXMgOj0ga2xpYi5saXN0CisKKyMjIyMjCisjIEdlbmVyYXRlIHNvY2tldCBjYWxscyBzdHVicworIyBCYXNlZCBvbiBpbnB1dCBmcm9tIFNPQ0tFVENBTExTLmRlZiBnZW5lcmF0ZSBzb2NrZXQgY2FsbCBzdHVicwordGFyZ2V0cyAgICAgOj0ga2xpYi5saXN0Cit0YXJnZXRzICAgICArPSBzb2NrZXRjYWxscy5tawordGFyZ2V0cwkgICAgKz0gU09DS0VUQ0FMTFMuaQordGFyZ2V0cyAgICAgKz0gJChzb2NrZXRjYWxsLW9ianMpCitjbGVhbi1maWxlcyArPSAqLlMgKi5jICoubyAqLmxpc3QKKworRVhUUkFfS0xJQkNDRkxBR1MgOj0gLUkkKHNyY3RyZWUpLyQoc3JjKQorCitxdWlldF9jbWRfbWFrZWxpc3QgPSBMSVNUICAgICRACisgICAgICBjbWRfbWFrZWxpc3QgPSBlY2hvICckKGZpbHRlci1vdXQgRk9SQ0UsJF4pJyA+ICRACisKKyMgQ3JlYXRlIGxpc3Qgb2YgYWxsIGZpbGVzCiskKG9iaikva2xpYi5saXN0OiAkKGNhbGwgb2JqZWN0aWZ5LCQoc29ja2V0Y2FsbC1vYmpzKSkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxtYWtlbGlzdCkKKworIyBHZW5lcmF0ZSBhc3NlbWJsZXIgZmlsZSAoLmkpCisjIFdlIHBhc3MgLWFuc2kgdG8ga2VlcCBjcHAgZnJvbSBkZWZpbmUgZS5nLiAiaTM4NiIgYXMgd2VsbCBhcyAiX19pMzg2X18iCitxdWlldF9jbWRfc29ja2V0Y2FsbC5pID0gR0VOICAgICAkQAorICAgICAgY21kX3NvY2tldGNhbGwuaSA9ICQoS0xJQkNDQykgJChrbGliY2NmbGFncykgLURfX0FTU0VNQkxZX18gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYW5zaSAteCBjIC1FIC1vICRAICQ8CiskKG9iaikvU09DS0VUQ0FMTFMuaTogJChLTElCQ1NSQykvU09DS0VUQ0FMTFMuZGVmIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLHNvY2tldGNhbGwuaSkKKworIyBHZW5lcmF0ZSBzb2NrZXRjYWxsIHN0dWJzCitxdWlldF9jbWRfc29ja2V0Y2FsbHMgPSBHRU4gICAgICRACisgICAgICBjbWRfc29ja2V0Y2FsbHMgPSAkKFBFUkwpICQoS0xJQkNTUkMpL3NvY2tldGNhbGxzLnBsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChvYmopL1NPQ0tFVENBTExTLmkJICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDQVJDSCkgJChvYmopID4gJEAgCSAgICBcCisJCQkJfHwgKCBybSAtZiAkQCA7IGV4aXQgMSApCisKKyQob2JqKS9zb2NrZXRjYWxscy5tazogJChLTElCQ1NSQykvc29ja2V0Y2FsbHMucGwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAkKG9iaikvU09DS0VUQ0FMTFMuaSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICQoc3JjKS9zb2NrZXRjb21tb24uaAorCSQoY2FsbCBjbWQsc29ja2V0Y2FsbHMpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc29ja2V0Y2FsbHMvc29ja2V0Y29tbW9uLmggYi91c3Iva2xpYmMvc29ja2V0Y2FsbHMvc29ja2V0Y29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0YjExZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zb2NrZXRjYWxscy9zb2NrZXRjb21tb24uaApAQCAtMCwwICsxLDE2IEBACisvKgorICogc29ja2V0Y29tbW9uLmgKKyAqCisgKiBDb21tb24gaGVhZGVyIGZpbGUgZm9yIHNvY2tldGNhbGwgc3R1YnMKKyAqLworCisjZGVmaW5lIF9fSU5fU1lTX0NPTU1PTgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXRjYWxscy5oPgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3NwcmludGYuYyBiL3Vzci9rbGliYy9zcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkODc1OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zcHJpbnRmLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHNwcmludGYuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitpbnQgc3ByaW50ZihjaGFyICpidWZmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJ2OworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJcnYgPSB2c25wcmludGYoYnVmZmVyLCB+KHNpemVfdCkgMCwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zcmFuZDQ4LmMgYi91c3Iva2xpYmMvc3JhbmQ0OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzk1NjcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3JhbmQ0OC5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBzcmFuZDQ4LmMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3Vuc2lnbmVkIHNob3J0IF9fcmFuZDQ4X3NlZWRbM107CS8qIENvbW1vbiB3aXRoIG1yYW5kNDguYywgbHJhbmQ0OC5jICovCisKK3ZvaWQgc3JhbmQ0OChsb25nIHNlZWR2YWwpCit7CisJX19yYW5kNDhfc2VlZFswXSA9IDB4MzMwZTsKKwlfX3JhbmQ0OF9zZWVkWzFdID0gKHVuc2lnbmVkIHNob3J0KXNlZWR2YWw7CisJX19yYW5kNDhfc2VlZFsyXSA9ICh1bnNpZ25lZCBzaG9ydCkoKHVpbnQzMl90KSBzZWVkdmFsID4+IDE2KTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zc2NhbmYuYyBiL3Vzci9rbGliYy9zc2NhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTNiMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3NzY2FuZi5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBzc2NhbmYoKQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgc3NjYW5mKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcnY7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwlydiA9IHZzc2NhbmYoc3RyLCBmb3JtYXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJcmV0dXJuIHJ2OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0YXRmcy5jIGIvdXNyL2tsaWJjL3N0YXRmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Yjg3MDAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RhdGZzLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIHN0YXRmcy5jCisgKgorICogT24gYXJjaGl0ZWN0dXJlcyB3aGljaCBkbyBzdGF0ZnM2NCwgd3JhcCB0aGUgc3lzdGVtIGNhbGwKKyAqLworCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisKKyNpZmRlZiBfX05SX3N0YXRmczY0CisKK2V4dGVybiBpbnQgX19zdGF0ZnM2NChjb25zdCBjaGFyICosIHNpemVfdCwgc3RydWN0IHN0YXRmcyAqKTsKKworaW50IHN0YXRmcyhjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdGZzICpidWYpCit7CisJcmV0dXJuIF9fc3RhdGZzNjQocGF0aCwgc2l6ZW9mICpidWYsIGJ1Zik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmNhc2VjbXAuYyBiL3Vzci9rbGliYy9zdHJjYXNlY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUxZjI4YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJjYXNlY21wLmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHN0cmNhc2VjbXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCitpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYzEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMxOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmMyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMjsKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCBkID0gMDsKKworCXdoaWxlICgxKSB7CisJCS8qIHRvdXBwZXIoKSBleHBlY3RzIGFuIHVuc2lnbmVkIGNoYXIgKGltcGxpY2l0bHkgY2FzdCB0byBpbnQpCisJCSAgIGFzIGlucHV0LCBhbmQgcmV0dXJucyBhbiBpbnQsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiAqLworCQlkID0gdG91cHBlcihjaCA9ICpjMSsrKSAtIHRvdXBwZXIoKmMyKyspOworCQlpZiAoZCB8fCAhY2gpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJjYXQuYyBiL3Vzci9rbGliYy9zdHJjYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzViNjczCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cmNhdC5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBzdHJjYXQuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3RyY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCXN0cmNweShzdHJjaHIoZHN0LCAnXDAnKSwgc3JjKTsKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmNoci5jIGIvdXNyL2tsaWJjL3N0cmNoci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDBjYzQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RyY2hyLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIHN0cmNoci5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisKK2NoYXIgKnN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwl3aGlsZSAoKnMgIT0gKGNoYXIpYykgeworCQlpZiAoISpzKQorCQkJcmV0dXJuIE5VTEw7CisJCXMrKzsKKwl9CisKKwlyZXR1cm4gKGNoYXIgKilzOworfQorCitfX0FMSUFTKGNoYXIgKiwgaW5kZXgsIChjb25zdCBjaGFyICosIGludCksIHN0cmNocikKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJjbXAuYyBiL3Vzci9rbGliYy9zdHJjbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWI5ZjVhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cmNtcC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBzdHJjbXAuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IHN0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYzEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMxOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmMyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMjsKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCBkID0gMDsKKworCXdoaWxlICgxKSB7CisJCWQgPSAoaW50KShjaCA9ICpjMSsrKSAtIChpbnQpKmMyKys7CisJCWlmIChkIHx8ICFjaCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBkOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmNweS5jIGIvdXNyL2tsaWJjL3N0cmNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjU2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RyY3B5LmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIHN0cmNweS5jCisgKgorICogc3RyY3B5KCkKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NoYXIgKnN0cmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICpxID0gZHN0OworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciBjaDsKKworCWRvIHsKKwkJKnErKyA9IGNoID0gKnArKzsKKwl9IHdoaWxlIChjaCk7CisKKwlyZXR1cm4gZHN0OworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmNzcG4uYyBiL3Vzci9rbGliYy9zdHJjc3BuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzYWM3MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJjc3BuLmMKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIHN0cmNzcG4KKyAqLworCisjaW5jbHVkZSAic3RyeHNwbi5oIgorCitzaXplX3Qgc3RyY3Nwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpyZWplY3QpCit7CisJcmV0dXJuIF9fc3RyeHNwbihzLCByZWplY3QsIDEpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmR1cC5jIGIvdXNyL2tsaWJjL3N0cmR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWI1MWQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RyZHVwLmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIHN0cmR1cC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitjaGFyICpzdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgbCA9IHN0cmxlbihzKSArIDE7CisJY2hhciAqZCA9IG1hbGxvYyhsKTsKKworCWlmIChkKQorCQltZW1jcHkoZCwgcywgbCk7CisKKwlyZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJlcnJvci5jIGIvdXNyL2tsaWJjL3N0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkMGU0OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJlcnJvci5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBzdHJlcnJvci5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJlcnJvcihpbnQgZXJybnVtKQoreworCXN0YXRpYyBjaGFyIG1lc3NhZ2VbMzJdID0gImVycm9yICI7CS8qIGVub3VnaCBmb3IgZXJyb3IgMl42My0xICovCisJY2hhciBudW1idWZbMzJdOworCWNoYXIgKnA7CisJdW5zaWduZWQgaW50IGUgPSAodW5zaWduZWQgaW50KWVycm51bTsKKworI2lmZGVmIFdJVEhfRVJSTElTVAorCWV4dGVybiBjb25zdCBpbnQgc3lzX25lcnI7CisJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19lcnJsaXN0W107CisKKwlpZiAoZSA8ICh1bnNpZ25lZCBpbnQpc3lzX25lcnIgJiYgc3lzX2Vycmxpc3RbZV0pCisJCXJldHVybiAoY2hhciAqKXN5c19lcnJsaXN0W2VdOworI2VuZGlmCisKKwlwID0gbnVtYnVmICsgc2l6ZW9mIG51bWJ1ZjsKKwkqLS1wID0gJ1wwJzsKKworCWRvIHsKKwkJKi0tcCA9IChlICUgMTApICsgJzAnOworCQllIC89IDEwOworCX0gd2hpbGUgKGUpOworCisJbWVtY3B5KG1lc3NhZ2UgKyA2LCBwLCAobnVtYnVmICsgc2l6ZW9mIG51bWJ1ZikgLSBwKTsKKworCXJldHVybiBtZXNzYWdlOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmxjYXQuYyBiL3Vzci9rbGliYy9zdHJsY2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjMzM3NQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJsY2F0LmMKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIHN0cmxjYXQuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCitzaXplX3Qgc3RybGNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGJ5dGVzID0gMDsKKwljaGFyICpxID0gZHN0OworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciBjaDsKKworCXdoaWxlIChieXRlcyA8IHNpemUgJiYgKnEpIHsKKwkJcSsrOworCQlieXRlcysrOworCX0KKwlpZiAoYnl0ZXMgPT0gc2l6ZSkKKwkJcmV0dXJuIChieXRlcyArIHN0cmxlbihzcmMpKTsKKworCXdoaWxlICgoY2ggPSAqcCsrKSkgeworCQlpZiAoYnl0ZXMgKyAxIDwgc2l6ZSkKKwkJCSpxKysgPSBjaDsKKworCQlieXRlcysrOworCX0KKworCSpxID0gJ1wwJzsKKwlyZXR1cm4gYnl0ZXM7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RybGNweS5jIGIvdXNyL2tsaWJjL3N0cmxjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM3MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cmxjcHkuYwpAQCAtMCwwICsxLDI3IEBACisvKgorICogc3RybGNweS5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGtsaWJjL2NvbXBpbGVyLmg+CisKK3NpemVfdCBzdHJsY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgYnl0ZXMgPSAwOworCWNoYXIgKnEgPSBkc3Q7CisJY29uc3QgY2hhciAqcCA9IHNyYzsKKwljaGFyIGNoOworCisJd2hpbGUgKChjaCA9ICpwKyspKSB7CisJCWlmIChieXRlcyArIDEgPCBzaXplKQorCQkJKnErKyA9IGNoOworCisJCWJ5dGVzKys7CisJfQorCisJLyogSWYgc2l6ZSA9PSAwIHRoZXJlIGlzIG5vIHNwYWNlIGZvciBhIGZpbmFsIG51bGwuLi4gKi8KKwlpZiAoc2l6ZSkKKwkJKnEgPSAnXDAnOworCisJcmV0dXJuIGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cmxlbi5jIGIvdXNyL2tsaWJjL3N0cmxlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NTI2YTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybGVuLmMKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIHN0cmxlbigpCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqc3MgPSBzOworCXdoaWxlICgqc3MpCisJCXNzKys7CisJcmV0dXJuIHNzIC0gczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJuY2FzZWNtcC5jIGIvdXNyL2tsaWJjL3N0cm5jYXNlY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1MTkzNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJuY2FzZWNtcC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBzdHJuY2FzZWNtcC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKK2ludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgZCA9IDA7CisKKwl3aGlsZSAobi0tKSB7CisJCS8qIHRvdXBwZXIoKSBleHBlY3RzIGFuIHVuc2lnbmVkIGNoYXIgKGltcGxpY2l0bHkgY2FzdCB0byBpbnQpCisJCSAgIGFzIGlucHV0LCBhbmQgcmV0dXJucyBhbiBpbnQsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiAqLworCQlkID0gdG91cHBlcihjaCA9ICpjMSsrKSAtIHRvdXBwZXIoKmMyKyspOworCQlpZiAoZCB8fCAhY2gpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJuY2F0LmMgYi91c3Iva2xpYmMvc3RybmNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjAyNmMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybmNhdC5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBzdHJuY2F0LmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKworY2hhciAqc3RybmNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG4pCit7CisJY2hhciAqcSA9IHN0cmNocihkc3QsICdcMCcpOworCWNvbnN0IGNoYXIgKnAgPSBzcmM7CisJY2hhciBjaDsKKworCXdoaWxlIChuLS0pIHsKKwkJKnErKyA9IGNoID0gKnArKzsKKwkJaWYgKCFjaCkKKwkJCXJldHVybiBkc3Q7CisJfQorCSpxID0gJ1wwJzsKKworCXJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RybmNtcC5jIGIvdXNyL2tsaWJjL3N0cm5jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjM1NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cm5jbXAuYwpAQCAtMCwwICsxLDIxIEBACisvKgorICogc3RybmNtcC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgZCA9IDA7CisKKwl3aGlsZSAobi0tKSB7CisJCWQgPSAoaW50KShjaCA9ICpjMSsrKSAtIChpbnQpKmMyKys7CisJCWlmIChkIHx8ICFjaCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBkOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cm5jcHkuYyBiL3Vzci9rbGliYy9zdHJuY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmYzExOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJuY3B5LmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHN0cm5jcHkuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3RybmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG4pCit7CisJY2hhciAqcSA9IGRzdDsKKwljb25zdCBjaGFyICpwID0gc3JjOworCWNoYXIgY2g7CisKKwl3aGlsZSAobikgeworCQluLS07CisJCSpxKysgPSBjaCA9ICpwKys7CisJCWlmICghY2gpCisJCQlicmVhazsKKwl9CisKKwkvKiBUaGUgc3BlY3Mgc2F5IHN0cm5jcHkoKSBmaWxscyB0aGUgZW50aXJlIGJ1ZmZlciB3aXRoIE5VTC4gIFNpZ2guICovCisJbWVtc2V0KHEsIDAsIG4pOworCisJcmV0dXJuIGRzdDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJuZHVwLmMgYi91c3Iva2xpYmMvc3RybmR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTk3NGEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybmR1cC5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBzdHJuZHVwLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2NoYXIgKnN0cm5kdXAoY29uc3QgY2hhciAqcywgc2l6ZV90IG4pCit7CisJaW50IGwgPSBuID4gc3RybGVuKHMpID8gc3RybGVuKHMpICsgMSA6IG4gKyAxOworCWNoYXIgKmQgPSBtYWxsb2MobCk7CisKKwlpZiAoZCkKKwkJbWVtY3B5KGQsIHMsIGwpOworCWRbbl0gPSAnXDAnOworCXJldHVybiBkOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cm5sZW4uYyBiL3Vzci9rbGliYy9zdHJubGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3OGY0YgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJubGVuLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIHN0cm5sZW4oKQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG1heGxlbikKK3sKKwljb25zdCBjaGFyICpzcyA9IHM7CisKKwkvKiBJbXBvcnRhbnQ6IHRoZSBtYXhsZW4gdGVzdCBtdXN0IHByZWNlZGUgdGhlIHJlZmVyZW5jZSB0aHJvdWdoIHNzOworCSAgIHNpbmNlIHRoZSBieXRlIGJleW9uZCB0aGUgbWF4aW11bSBtYXkgc2VnZmF1bHQgKi8KKwl3aGlsZSAoKG1heGxlbiA+IDApICYmICpzcykgeworCQlzcysrOworCQltYXhsZW4tLTsKKwl9CisJcmV0dXJuIHNzIC0gczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJudG9pbWF4LmMgYi91c3Iva2xpYmMvc3RybnRvaW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RybnRvaW1heC5jCkBAIC0wLDAgKzEsMTMgQEAKKy8qCisgKiBzdHJudG9pbWF4LmMKKyAqCisgKiBzdHJudG9pbWF4KCkKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworaW50bWF4X3Qgc3RybnRvaW1heChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSwgc2l6ZV90IG4pCit7CisJcmV0dXJuIChpbnRtYXhfdCkgc3RybnRvdW1heChucHRyLCBlbmRwdHIsIGJhc2UsIG4pOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cm50b3VtYXguYyBiL3Vzci9rbGliYy9zdHJudG91bWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MDk2NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJudG91bWF4LmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIHN0cm50b3VtYXguYworICoKKyAqIFRoZSBzdHJudG91bWF4KCkgZnVuY3Rpb24gYW5kIGFzc29jaWF0ZWQKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIGlubGluZSBpbnQgZGlnaXR2YWwoaW50IGNoKQoreworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJCXJldHVybiBjaCAtICcwJzsKKwl9IGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHsKKwkJcmV0dXJuIGNoIC0gJ0EnICsgMTA7CisJfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB7CisJCXJldHVybiBjaCAtICdhJyArIDEwOworCX0gZWxzZSB7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3VpbnRtYXhfdCBzdHJudG91bWF4KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlLCBzaXplX3QgbikKK3sKKwlpbnQgbWludXMgPSAwOworCXVpbnRtYXhfdCB2ID0gMDsKKwlpbnQgZDsKKworCXdoaWxlIChuICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKm5wdHIpKSB7CisJCW5wdHIrKzsKKwkJbi0tOworCX0KKworCS8qIFNpbmdsZSBvcHRpb25hbCArIG9yIC0gKi8KKwlpZiAobikgeworCQljaGFyIGMgPSAqbnB0cjsKKwkJaWYgKGMgPT0gJy0nIHx8IGMgPT0gJysnKSB7CisJCQltaW51cyA9IChjID09ICctJyk7CisJCQlucHRyKys7CisJCQluLS07CisJCX0KKwl9CisKKwlpZiAoYmFzZSA9PSAwKSB7CisJCWlmIChuID49IDIgJiYgbnB0clswXSA9PSAnMCcgJiYKKwkJICAgIChucHRyWzFdID09ICd4JyB8fCBucHRyWzFdID09ICdYJykpIHsKKwkJCW4gLT0gMjsKKwkJCW5wdHIgKz0gMjsKKwkJCWJhc2UgPSAxNjsKKwkJfSBlbHNlIGlmIChuID49IDEgJiYgbnB0clswXSA9PSAnMCcpIHsKKwkJCW4tLTsKKwkJCW5wdHIrKzsKKwkJCWJhc2UgPSA4OworCQl9IGVsc2UgeworCQkJYmFzZSA9IDEwOworCQl9CisJfSBlbHNlIGlmIChiYXNlID09IDE2KSB7CisJCWlmIChuID49IDIgJiYgbnB0clswXSA9PSAnMCcgJiYKKwkJICAgIChucHRyWzFdID09ICd4JyB8fCBucHRyWzFdID09ICdYJykpIHsKKwkJCW4gLT0gMjsKKwkJCW5wdHIgKz0gMjsKKwkJfQorCX0KKworCXdoaWxlIChuICYmIChkID0gZGlnaXR2YWwoKm5wdHIpKSA+PSAwICYmIGQgPCBiYXNlKSB7CisJCXYgPSB2ICogYmFzZSArIGQ7CisJCW4tLTsKKwkJbnB0cisrOworCX0KKworCWlmIChlbmRwdHIpCisJCSplbmRwdHIgPSAoY2hhciAqKW5wdHI7CisKKwlyZXR1cm4gbWludXMgPyAtdiA6IHY7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RycGJyay5jIGIvdXNyL2tsaWJjL3N0cnBicmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTUzZDAyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnBicmsuYwpAQCAtMCwwICsxLDEyIEBACisvKgorICogc3RycGJyaworICovCisKKyNpbmNsdWRlICJzdHJ4c3BuLmgiCisKK2NoYXIgKnN0cnBicmsoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqYWNjZXB0KQoreworCWNvbnN0IGNoYXIgKnNzID0gcyArIF9fc3RyeHNwbihzLCBhY2NlcHQsIDEpOworCisJcmV0dXJuICpzcyA/IChjaGFyICopc3MgOiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnJjaHIuYyBiL3Vzci9rbGliYy9zdHJyY2hyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2ZDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJyY2hyLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIHN0cnJjaHIuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCitjaGFyICpzdHJyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworCWNvbnN0IGNoYXIgKmZvdW5kID0gTlVMTDsKKworCXdoaWxlICgqcykgeworCQlpZiAoKnMgPT0gKGNoYXIpYykKKwkJCWZvdW5kID0gczsKKwkJcysrOworCX0KKworCXJldHVybiAoY2hhciAqKWZvdW5kOworfQorCitfX0FMSUFTKGNoYXIgKiwgcmluZGV4LCAoY29uc3QgY2hhciAqLCBpbnQpLCBzdHJyY2hyKQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnNlcC5jIGIvdXNyL2tsaWJjL3N0cnNlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTc2YmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3Ryc2VwLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIHN0cnNlcC5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJzZXAoY2hhciAqKnN0cmluZ3AsIGNvbnN0IGNoYXIgKmRlbGltKQoreworCWNoYXIgKnMgPSAqc3RyaW5ncDsKKwljaGFyICplOworCisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCWUgPSBzdHJwYnJrKHMsIGRlbGltKTsKKwlpZiAoZSkKKwkJKmUrKyA9ICdcMCc7CisKKwkqc3RyaW5ncCA9IGU7CisJcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3Ryc2lnbmFsLmMgYi91c3Iva2xpYmMvc3Ryc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0NWU5YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJzaWduYWwuYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogc3Ryc2lnbmFsLmMKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworY2hhciAqc3Ryc2lnbmFsKGludCBzaWcpCit7CisJc3RhdGljIGNoYXIgYnVmWzY0XTsKKworCWlmICgodW5zaWduZWQpc2lnIDwgX05TSUcgJiYgc3lzX3NpZ2xpc3Rbc2lnXSkKKwkJcmV0dXJuIChjaGFyICopc3lzX3NpZ2xpc3Rbc2lnXTsKKworI2lmZGVmIFNJR1JUTUlOCisJaWYgKHNpZyA+PSBTSUdSVE1JTiAmJiBzaWcgPD0gU0lHUlRNQVgpIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiUmVhbC10aW1lIHNpZ25hbCAlZCIsCisJCQkgc2lnIC0gU0lHUlRNSU4pOworCQlyZXR1cm4gYnVmOworCX0KKyNlbmRpZgorCisJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiU2lnbmFsICVkIiwgc2lnKTsKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnNwbi5jIGIvdXNyL2tsaWJjL3N0cnNwbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMjJjZTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3Ryc3BuLmMKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIHN0cnNwbgorICovCisKKyNpbmNsdWRlICJzdHJ4c3BuLmgiCisKK3NpemVfdCBzdHJzcG4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqYWNjZXB0KQoreworCXJldHVybiBfX3N0cnhzcG4ocywgYWNjZXB0LCAwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJzdHIuYyBiL3Vzci9rbGliYy9zdHJzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODUwODU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnN0ci5jCkBAIC0wLDAgKzEsMTEgQEAKKy8qCisgKiBzdHJzdHIuYworICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqc3Ryc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCit7CisJcmV0dXJuIChjaGFyICopbWVtbWVtKGhheXN0YWNrLCBzdHJsZW4oaGF5c3RhY2spLCBuZWVkbGUsCisJCQkgICAgICBzdHJsZW4obmVlZGxlKSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG9pbWF4LmMgYi91c3Iva2xpYmMvc3RydG9pbWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkZDA4OAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ0b2ltYXguYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSBpbnRtYXhfdAorI2RlZmluZSBOQU1FIHN0cnRvaW1heAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvay5jIGIvdXNyL2tsaWJjL3N0cnRvay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjcxYWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG9rLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIHN0cnRvay5jCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpzdHJ0b2soY2hhciAqcywgY29uc3QgY2hhciAqZGVsaW0pCit7CisJc3RhdGljIGNoYXIgKmhvbGRlcjsKKworCWlmIChzKQorCQlob2xkZXIgPSBzOworCisJZG8geworCQlzID0gc3Ryc2VwKCZob2xkZXIsIGRlbGltKTsKKwl9IHdoaWxlIChzICYmICEqcyk7CisKKwlyZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJ0b2wuYyBiL3Vzci9rbGliYy9zdHJ0b2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZjOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnRvbC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIHNpZ25lZCBsb25nCisjZGVmaW5lIE5BTUUgc3RydG9sCisjaW5jbHVkZSAic3RydG94LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG9sbC5jIGIvdXNyL2tsaWJjL3N0cnRvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQyOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnRvbGwuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSBzaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIE5BTUUgc3RydG9sbAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvdGltZXNwZWMuYyBiL3Vzci9rbGliYy9zdHJ0b3RpbWVzcGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyNmJmOAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ0b3RpbWVzcGVjLmMKQEAgLTAsMCArMSw1IEBACisjZGVmaW5lIE5BTUUJIHN0cnRvdGltZXNwZWMKKyNkZWZpbmUgVElNRVgJIHN0cnVjdCB0aW1lc3BlYworI2RlZmluZSBGU0VDCSB0dl9uc2VjCisjZGVmaW5lIERFQ0lNQUxTIDkKKyNpbmNsdWRlICJzdHJ0b3RpbWV4LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG90aW1ldmFsLmMgYi91c3Iva2xpYmMvc3RydG90aW1ldmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwZDRiYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ0b3RpbWV2YWwuYwpAQCAtMCwwICsxLDUgQEAKKyNkZWZpbmUgTkFNRQkgc3RydG90aW1ldmFsCisjZGVmaW5lIFRJTUVYCSBzdHJ1Y3QgdGltZXZhbAorI2RlZmluZSBGU0VDCSB0dl91c2VjCisjZGVmaW5lIERFQ0lNQUxTIDYKKyNpbmNsdWRlICJzdHJ0b3RpbWV4LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG90aW1leC5jIGIvdXNyL2tsaWJjL3N0cnRvdGltZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU5YTRmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnRvdGltZXguYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogc3RydG90aW1leC5jCisgKgorICogTm9uc3RhbmRhcmQgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBzdHJpbmcgYW5kIGNvbnZlcnRzIGl0IHRvIGEKKyAqIHN0cnVjdCB0aW1lc3BlYy90aW1ldmFsLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbi1udW1lcmljCisgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitjaGFyICpOQU1FKGNvbnN0IGNoYXIgKnN0ciwgVElNRVggKiB0cykKK3sKKwlpbnQgbjsKKwljaGFyICpzLCAqczA7CisJX190eXBlb2ZfXyh0cy0+RlNFQykgZnM7CS8qIEZyYWN0aW9uYWwgc2Vjb25kcyAqLworCisJdHMtPnR2X3NlYyA9IHN0cm50b3VtYXgoc3RyLCAmcywgMTAsIH4oc2l6ZV90KSAwKTsKKwlmcyA9IDA7CisKKwlpZiAoKnMgPT0gJy4nKSB7CisJCXMwID0gcyArIDE7CisKKwkJZnMgPSBzdHJudG91bWF4KHMwLCAmcywgMTAsIERFQ0lNQUxTKTsKKwkJbiA9IHMgLSBzMDsKKworCQl3aGlsZSAoaXNkaWdpdCgqcykpCisJCQlzKys7CisKKwkJZm9yICg7IG4gPCBERUNJTUFMUzsgbisrKQorCQkJZnMgKj0gMTA7CisJfQorCisJdHMtPkZTRUMgPSBmczsKKwlyZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy9zdHJ0b3VsLmMgYi91c3Iva2xpYmMvc3RydG91bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODlhYWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG91bC5jCkBAIC0wLDAgKzEsMyBAQAorI2RlZmluZSBUWVBFIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgTkFNRSBzdHJ0b3VsCisjaW5jbHVkZSAic3RydG94LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG91bGwuYyBiL3Vzci9rbGliYy9zdHJ0b3VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzE0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG91bGwuYwpAQCAtMCwwICsxLDMgQEAKKyNkZWZpbmUgVFlQRSB1bnNpZ25lZCBsb25nIGxvbmcKKyNkZWZpbmUgTkFNRSBzdHJ0b3VsbAorI2luY2x1ZGUgInN0cnRveC5jIgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnRvdW1heC5jIGIvdXNyL2tsaWJjL3N0cnRvdW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzk3MTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3RydG91bWF4LmMKQEAgLTAsMCArMSwzIEBACisjZGVmaW5lIFRZUEUgdWludG1heF90CisjZGVmaW5lIE5BTUUgc3RydG91bWF4CisjaW5jbHVkZSAic3RydG94LmMiCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RydG94LmMgYi91c3Iva2xpYmMvc3RydG94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiZGVmYwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ0b3guYwpAQCAtMCwwICsxLDEzIEBACisvKgorICogc3RydG94LmMKKyAqCisgKiBzdHJ0by4uLigpIGZ1bmN0aW9ucywgYnkgbWFjcm8gZGVmaW5pdGlvbgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCitUWVBFIE5BTUUoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpCit7CisJcmV0dXJuIChUWVBFKSBzdHJudG91bWF4KG5wdHIsIGVuZHB0ciwgYmFzZSwgfihzaXplX3QpIDApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N0cnhzcG4uYyBiL3Vzci9rbGliYy9zdHJ4c3BuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZGJmZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zdHJ4c3BuLmMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIHN0cnBicmsKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJzdHJ4c3BuLmgiCisKK3NpemVfdCBfX3N0cnhzcG4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqbWFwLCBpbnQgcGFyaXR5KQoreworCWNoYXIgbWF0Y2htYXBbVUNIQVJfTUFYICsgMV07CisJc2l6ZV90IG4gPSAwOworCisJLyogQ3JlYXRlIGJpdG1hcCAqLworCW1lbXNldChtYXRjaG1hcCwgMCwgc2l6ZW9mIG1hdGNobWFwKTsKKwl3aGlsZSAoKm1hcCkKKwkJbWF0Y2htYXBbKHVuc2lnbmVkIGNoYXIpKm1hcCsrXSA9IDE7CisKKwkvKiBNYWtlIHN1cmUgdGhlIG51bGwgY2hhcmFjdGVyIG5ldmVyIG1hdGNoZXMgKi8KKwltYXRjaG1hcFswXSA9IHBhcml0eTsKKworCS8qIENhbGN1bGF0ZSBzcGFuIGxlbmd0aCAqLworCXdoaWxlIChtYXRjaG1hcFsodW5zaWduZWQgY2hhcikqcysrXSBeIHBhcml0eSkKKwkJbisrOworCisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3RyeHNwbi5oIGIvdXNyL2tsaWJjL3N0cnhzcG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTU2ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N0cnhzcG4uaApAQCAtMCwwICsxLDEyIEBACisvKgorICogc3RyeHNwbi5oCisgKi8KKworI2lmbmRlZiBTVFJYU1BOX0gKKyNkZWZpbmUgU1RSWFNQTl9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworZXh0ZXJuIHNpemVfdCBfX3N0cnhzcG4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqbWFwLCBpbnQgcGFyaXR5KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3lzY2FsbHMucGwgYi91c3Iva2xpYmMvc3lzY2FsbHMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmMDIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zeXNjYWxscy5wbApAQCAtMCwwICsxLDI4NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFNjcmlwdCB0byBwYXJzZSB0aGUgU1lTQ0FMTFMgZmlsZSBhbmQgZ2VuZXJhdGUgYXBwcm9wcmlhdGUKKyMgc3R1YnMuCisjCisjIFBhc3MgMTogZ2VuZXJhdGUgdGhlIEMgYXJyYXkgb2Ygc2l6ZXMKKyMgUGFzcyAyOiBnZW5lcmF0ZSB0aGUgc3lzY2FsbCBzdHVicyBhbmQgb3RoZXIgb3V0cHV0CisjCisKKyMKKyMgQ29udmVydCBhIHN0cmluZyB0byBhIEMgYXJyYXkgb2YgY2hhcmFjdGVycywKKyMgZS5nLiBmb28gLT4gJ2YnLCdvJywnbycsJ1wwJywKKyMKK3N1YiBjaGFyYXJyYXkoJCkgeworICAgIHVzZSBieXRlczsKKworICAgIG15KCRzKSA9IEBfOworICAgIG15KCRpLCAkYyk7CisgICAgbXkoJGEpID0gJyc7CisKKyAgICBmb3IgKCRpID0gMDsgJGkgPCBsZW5ndGgoJHMpOyAkaSsrKSB7CisJJGMgPSBzdWJzdHIoJHMsICRpLCAxKTsKKwlpZiAob3JkKCRjKSA8IDMyIHx8IG9yZCgkYykgPiAxMjYpIHsKKwkgICAgJGEgLj0gc3ByaW50ZigiMHglMDJ4LCIsIG9yZCgkYykpOworCX0gZWxzaWYgKCRjIGVxICJcXCIgfHwgJGMgZXEgIlwnIikgeworCSAgICAkYSAuPSAiXCdcXCRjXCcsIjsKKwl9IGVsc2UgeworCSAgICAkYSAuPSAiXCckY1wnLCI7CisJfQorICAgIH0KKworICAgIHJldHVybiAkYTsKK30KKworIworIyBUaGlzIGV4dHJhY3RzIGFuIEFTQ0lJWiBzdHJpbmcgZm9yIHRoZSB0eXBlIGFuZCB0aGUgYWRkaXRpb25hbAorIyBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgb3Blbi1jb2RlZCwgYmVjYXVzZSB1bnBhY2soIloqIikgYXBwYXJlbnRseQorIyBpcyBicm9rZW4gaW4gUGVybCA1LjYuMS4KKyMKK3N1YiBnZXRfb25lX3R5cGUoJCkgeworICAgIHVzZSBieXRlczsKKworICAgIG15KCR0eXBlc3RyKSA9IEBfOworICAgIG15ICRpLCAkYzsKKyAgICBteSAkbCA9IGxlbmd0aCgkdHlwZXN0cik7CisKKyAgICBmb3IgKCRpID0gMDsgJGkgPCAkbC0zOyAkaSsrKSB7CisJJGMgPSBzdWJzdHIoJHR5cGVzdHIsICRpLCAxKTsKKwlpZiAoJGMgZXEgIlwwIikgeworCSAgICByZXR1cm4gKHN1YnN0cigkdHlwZXN0ciwgMCwgJGkpLAorCQkgICAgdW5wYWNrKCJDQyIsIHN1YnN0cigkdHlwZXN0ciwgJGkrMSwgMikpLAorCQkgICAgc3Vic3RyKCR0eXBlc3RyLCAkaSszKSk7CisJfQorICAgIH0KKworICAgIHJldHVybiAodW5kZWYsIHVuZGVmLCB1bmRlZiwgdW5kZWYpOworfQorCiskdiA9ICRFTlZ7J0tCVUlMRF9WRVJCT1NFJ307CiskcXVpZXQgPSBkZWZpbmVkKCR2KSAmJiAoJHYgPT0gMCkgPyAxIDogdW5kZWY7CisKK0BhcmdzID0gKCk7Cit1bmRlZiAkcGFzczsKK2ZvciAkYXJnICggQEFSR1YgKSB7CisgICAgaWYgKCAkYXJnID1+IC9eLS8gKSB7CisJaWYgKCAkYXJnIGVxICctcScgKSB7CisJICAgICRxdWlldCA9IDE7CisJfSBlbHNpZiAoICRhcmcgZXEgJy12JyApIHsKKwkgICAgJHF1aWV0ID0gMDsKKwl9IGVsc2lmICggJGFyZyA9fiAvXC0oWzAtOV0rKSQvICkgeworCSAgICAkcGFzcyA9ICQxKzA7CisJfSBlbHNlIHsKKwkgICAgZGllICIkMDogVW5rbm93biBvcHRpb246ICRhcmdcbiI7CisJfQorICAgIH0gZWxzZSB7CisJcHVzaChAYXJncywgJGFyZyk7CisgICAgfQorfQorKCRmaWxlLCAkc3lzc3R1YiwgJGFyY2gsICRiaXRzLCAkdW5pc3RkLCAkb3V0cHV0ZGlyLAorICRoYXZlc3lzY2FsbCwgJHR5cGVzaXplKSA9IEBhcmdzOworCitpZiAoISRwYXNzKSB7CisgICAgZGllICIkMDogTmVlZCB0byBzcGVjaWZ5IHBhc3NcbiI7Cit9CisKKyRxdWlldCA9ICgkcGFzcyAhPSAyKSB1bmxlc3MgZGVmaW5lZCgkcXVpZXQpOworCityZXF1aXJlICIkc3lzc3R1YiI7CisKK2lmICghb3BlbihVTklTVEQsICI8ICR1bmlzdGRcMCIpKSB7CisgICAgZGllICIkMDogJHVuaXN0ZDogJCFcbiI7Cit9CisKK3doaWxlICggZGVmaW5lZCgkbGluZSA9IDxVTklTVEQ+KSApIHsKKyAgICBjaG9tcCAkbGluZTsKKworICAgIGlmICggJGxpbmUgPX4gL15cI1xzKmRlZmluZVxzK19fTlJfKFtBLVphLXowLTlfXSspXHMrKC4qXFMpXHMqJC8gKSB7CisJJHN5c2NhbGxzeyQxfSA9ICQyOworCXByaW50IFNUREVSUiAiU1lTQ0FMTCBGT1VORDogJDFcbiIgdW5sZXNzICggJHF1aWV0ICk7CisgICAgfQorfQorY2xvc2UoVU5JU1REKTsKKworaWYgKCRwYXNzID09IDIpIHsKKyAgICB1c2UgYnl0ZXM7CisKKyAgICBpZiAoIW9wZW4oVFlQRVNJWkUsICI8ICR0eXBlc2l6ZVwwIikpIHsKKwlkaWUgIiQwOiAkdHlwZXNpemU6ICQhXG4iOworICAgIH0KKworICAgIGJpbm1vZGUgVFlQRVNJWkU7CisKKyAgICAkbGVuID0gLXMgVFlQRVNJWkU7CisgICAgaWYgKHJlYWQoVFlQRVNJWkUsICR0eXBlYmluLCAkbGVuKSAhPSAkbGVuKSB7CisJZGllICIkMDogJHR5cGVzaXplOiBzaG9ydCByZWFkOiAkIVxuIjsKKyAgICB9CisgICAgY2xvc2UoVFlQRVNJWkUpOworCisgICAgJGl4ID0gaW5kZXgoJHR5cGViaW4sICJceDdhXHhjOFx4ZGJceDRlXHg5N1x4YjRceDljXHgxOSIpOworICAgIGlmICgkaXggPCAwKSB7CisJZGllICIkMDogJHR5cGVzaXplOiBtYWdpYyBudW1iZXIgbm90IGZvdW5kXG4iOworICAgIH0KKworICAgICMgUmVtb3ZlIG1hZ2ljIG51bWJlciBhbmQgYnl0ZXMgYmVmb3JlIGl0CisgICAgJHR5cGViaW4gPSBzdWJzdHIoJHR5cGViaW4sICRpeCs4KTsKKworICAgICMgRXhwYW5kIHRoZSB0eXBlcyB1bnRpbCBhIHRlcm1pbmF0aW5nIG51bGwKKyAgICAldHlwZXNpemUgPSAoKTsKKyAgICB3aGlsZSAoMSkgeworCW15ICRuLCAkc3osICRzaTsKKwkoJG4sICRzeiwgJHNpLCAkdHlwZWJpbikgPSBnZXRfb25lX3R5cGUoJHR5cGViaW4pOworCWxhc3QgaWYgKGxlbmd0aCgkbikgPT0gMCk7CisJJHR5cGVzaXpleyRufSA9ICRzejsKKwkkdHlwZXNpZ257JG59ID0gJHNpOworCXByaW50IFNUREVSUiAiVFlQRSAkbjogc2l6ZSAkc3osIHNpZ24gJHNpXG4iIHVubGVzcyAoJHF1aWV0KTsKKyAgICB9Cit9IGVsc2UgeworICAgICMgTGlzdCBoZXJlIGFueSB0eXBlcyB3aGljaCBzaG91bGQgYmUgc2l6ZWQgZXZlbiBpZiB0aGV5IG5ldmVyIG9jY3VyCisgICAgIyBpbiBhbnkgc3lzdGVtIGNhbGxzIGF0IGFsbC4KKyAgICAldHlwZV9saXN0ID0gKCdpbnQnID0+IDEsICdsb25nJyA9PiAxLCAnbG9uZyBsb25nJyA9PiAxLAorCQkgICd2b2lkIConID0+IDEsCisJCSAgJ2ludHB0cl90JyA9PiAxLCAndWludHB0cl90JyA9PiAxLAorCQkgICdpbnRtYXhfdCcgPT4gMSwgJ3VpbnRtYXhfdCcgPT4gMSk7Cit9CisKK2lmICgkcGFzcyA9PSAyKSB7CisgICAgaWYgKCFvcGVuKEhBVkVTWVMsICI+ICRoYXZlc3lzY2FsbFwwIikpIHsKKwlkaWUgIiQwOiAkaGF2ZXN5c2NhbGw6ICQhXG4iOworICAgIH0KKworICAgIHByaW50IEhBVkVTWVMgIiNpZm5kZWYgX0tMSUJDX0hBVkVTWVNDQUxMX0hcbiI7CisgICAgcHJpbnQgSEFWRVNZUyAiI2RlZmluZSBfS0xJQkNfSEFWRVNZU0NBTExfSCAxXG5cbiI7Cit9CisKK2lmICghb3BlbihGSUxFLCAiPCAkZmlsZVwwIikpIHsKKyAgICBkaWUgIiQwOiAkZmlsZTogJCFcbiI7Cit9CisKKworaWYgKCRwYXNzID09IDIpIHsKKyAgICBwcmludCAic3lzY2FsbC1vYmpzIDo9ICI7Cit9CisKKword2hpbGUgKCBkZWZpbmVkKCRsaW5lID0gPEZJTEU+KSApIHsKKyAgICBjaG9tcCAkbGluZTsKKyAgICAkbGluZSA9fiBzL1xzKih8XCMuKnxcL1wvLiopJC8vOyAjIFN0cmlwIGNvbW1lbnRzIGFuZCB0cmFpbGluZyBibGFua3MKKyAgICBuZXh0IHVubGVzcyAkbGluZTsKKworICAgIGlmICggJGxpbmUgPX4gL15ccyooXDxbXlw+XStcPlxzK3wpKFtBLVphLXowLTlfXCpcc10rKVxzKyhbQS1aYS16MC05XyxdKykofFxAW0EtWmEtejAtOV9dKykofFw6XDpbQS1aYS16MC05X10rKVxzKlwoKFteXDpcKV0qKVwpXHMqXDskLyApIHsKKwkkYXJjaHMgID0gJDE7CisJJHR5cGUgICA9ICQyOworCSRzbmFtZXMgPSAkMzsKKwkkc3R5cGUgID0gJDQ7CisJJGZuYW1lICA9ICQ1OworCSRhcmd2ICAgPSAkNjsKKworCSRkb2l0ICA9IDE7CisJJG1heWJlID0gMDsKKwlpZiAoICRhcmNocyBuZSAnJyApIHsKKwkgICAgZGllICIkZmlsZTokLjogSW52YWxpZCBhcmNoaXRlY3R1cmUgc3BlYzogPCRhcmNocz5cbiIKKwkJdW5sZXNzICggJGFyY2hzID1+IC9eXDwofFw/KSh8XCEpKFteXD5cIVw/XSopXD4vICk7CisJICAgICRtYXliZSA9ICQxIG5lICcnOworCSAgICAkbm90ID0gJDIgbmUgJyc7CisJICAgICRsaXN0ID0gJDM7CisKKwkgICAgJGRvaXQgPSAkbm90IHx8ICgkbGlzdCBlcSAnJyk7CisKKwkgICAgQGxpc3QgPSBzcGxpdCgvLC8sICRsaXN0KTsKKwkgICAgZm9yZWFjaCAgJGEgKCBAbGlzdCApIHsKKwkJaWYgKCAkYSBlcSAkYXJjaCB8fCAkYSBlcSAkYml0cyApIHsKKwkJICAgICRkb2l0ID0gISRub3Q7CisJCSAgICBsYXN0OworCQl9CisJICAgIH0KKwl9CisJbmV4dCBpZiAoICEgJGRvaXQgKTsKKworCXVuZGVmICRzbmFtZTsKKwlmb3JlYWNoICRzbiAoIHNwbGl0KC8sLywgJHNuYW1lcykgKSB7CisJICAgIGlmICggZGVmaW5lZCAkc3lzY2FsbHN7JHNufSApIHsKKwkJJHNuYW1lID0gJHNuOworCQlsYXN0OworCSAgICB9CisJfQorCWlmICggIWRlZmluZWQoJHNuYW1lKSApIHsKKwkgICAgbmV4dCBpZiAoICRtYXliZSApOworCSAgICBkaWUgIiRmaWxlOiQuOiBVbmRlZmluZWQgc3lzdGVtIGNhbGw6ICRzbmFtZXNcbiI7CisJfQorCisJJHR5cGUgID1+IHMvXHMqJC8vOworCSRzdHlwZSA9fiBzL15cQC8vOworCisJaWYgKCAkZm5hbWUgZXEgJycgKSB7CisJICAgICRmbmFtZSA9ICRzbmFtZTsKKwl9IGVsc2UgeworCSAgICAkZm5hbWUgPX4gcy9eXDpcOi8vOworCX0KKworCSRhcmd2ID1+IHMvXlxzKy8vOworCSRhcmd2ID1+IHMvXHMrJC8vOworCisJaWYgKCRhcmd2IGVxICd2b2lkJykgeworCSAgICBAYXJncyA9ICgpOworCX0gZWxzZSB7CisJICAgIEBhcmdzID0gc3BsaXQoL1xzKlwsXHMqLywgJGFyZ3YpOworCX0KKworCWlmICgkcGFzcyA9PSAxKSB7CisJICAgICMgUGFzcyAxOiBBZGQgdGhlIHR5cGVzIHRvIHRoZSB0eXBlIGxpc3QKKwkgICAgZm9yZWFjaCAkYSAoQGFyZ3MpIHsKKwkJJHR5cGVfbGlzdHskYX0rKzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgICMgUGFzcyAyOiBtYWtlIHN1cmUgYWxsIHR5cGVzIGRlZmluZWQsIGFuZCBhY3R1YWxseSBnZW5lcmF0ZSBzdHVicworCisJICAgIGZvcmVhY2ggJGEgKEBhcmdzKSB7CisJCWlmICghZGVmaW5lZCgkdHlwZXNpemV7JGF9KSkgeworCQkgICAgZGllICIkMDogJHR5cGVzaXplOiB0eXBlIG5hbWUgbWlzc2luZzogJGFcbiI7CisJCX0KKwkgICAgfQorCisJICAgIHByaW50IEhBVkVTWVMgIiNkZWZpbmUgX0tMSUJDX0hBVkVfU1lTQ0FMTF8ke2ZuYW1lfSAke3NuYW1lfVxuIjsKKwkgICAgcHJpbnQgIiBcXFxuXHQke2ZuYW1lfS5vIjsKKwkgICAgbWFrZV9zeXNzdHViKCRvdXRwdXRkaXIsICRmbmFtZSwgJHR5cGUsICRzbmFtZSwgJHN0eXBlLCBAYXJncyk7CisJfQorICAgIH0gZWxzZSB7CisJZGllICIkZmlsZTokLjogQ291bGQgbm90IHBhcnNlIGlucHV0OiBcIiRsaW5lXCJcbiI7CisgICAgfQorfQorCitpZiAoJHBhc3MgPT0gMSkgeworICAgICMgUGFzcyAxOiBnZW5lcmF0ZSB0eXBlc2l6ZS5jCisgICAgaWYgKCFvcGVuKFRZUEVTSVpFLCAiPiAkdHlwZXNpemUiKSkgeworCWRpZSAiJDA6IGNhbm5vdCBjcmVhdGUgZmlsZTogJHR5cGVzaXplOiAkIVxuIjsKKyAgICB9CisKKyAgICBwcmludCBUWVBFU0laRSAiI2luY2x1ZGUgXCJzeXNjb21tb24uaFwiXG4iOworCisgICAgIyBUaGlzIGNvbXBhcmVzIC0yIDwgMSBpbiB0aGUgYXBwcm9wcmlhdGUgdHlwZSwgd2hpY2ggaXMgdHJ1ZSBmb3IKKyAgICAjIHNpZ25lZCB0eXBlcyBhbmQgZmFsc2UgZm9yIHVuc2lnbmVkIHR5cGVzLiAgV2UgdXNlIC0yIGFuZCAxIHNpbmNlCisgICAgIyBnY2MgY29tcGxhaW5zIGFib3V0IGNvbXBhcmluZyB1bnNpZ25lZCB0eXBlcyB3aXRoIHplcm8sIGFuZCBtaWdodAorICAgICMgY29tcGxhaW4gZXF1YWxseSBhYm91dCAtMSBpbiB0aGUgZnV0dXJlLgorICAgICMKKyAgICAjIFRoaXMgdGVzdCBpcyB2YWxpZCAoYXMgaW4sIGRvZXNuJ3QgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGJhcmYpCisgICAgIyBmb3IgcG9pbnRlcnMgYXMgd2VsbCBhcyBmb3IgaW50ZWdyYWwgdHlwZXM7IGlmIHdlIGV2ZXIgYWRkIHN5c3RlbQorICAgICMgY2FsbHMgd2hpY2ggdGFrZSBhbnkgb3RoZXIga2luZHMgb2YgdHlwZXMgdGhhbiB0aGF0IHRoZW4gdGhpcyBuZWVkcworICAgICMgdG8gYmUgc21hcnRlci4KKyAgICBwcmludCBUWVBFU0laRSAiI2RlZmluZSBTSUdORUQoWCkgKChYKS0yIDwgKFgpMSlcbiI7CisKKyAgICBwcmludCBUWVBFU0laRSAiXG4iOworICAgIHByaW50IFRZUEVTSVpFICJjb25zdCB1bnNpZ25lZCBjaGFyIHR5cGVfc2l6ZXNbXSA9IHtcbiI7CisgICAgcHJpbnQgVFlQRVNJWkUgIlx0MHg3YSwweGM4LDB4ZGIsMHg0ZSwweDk3LDB4YjQsMHg5YywweDE5LCAvKiBtYWdpYyAqL1xuIjsKKyAgICBmb3JlYWNoICR0IChzb3J0KGtleXMoJXR5cGVfbGlzdCkpKSB7CisJcHJpbnQgVFlQRVNJWkUgIlx0IiwgY2hhcmFycmF5KCR0KSwgIjAsIHNpemVvZigkdCksIFNJR05FRCgkdCksXG4iOworICAgIH0KKyAgICBwcmludCBUWVBFU0laRSAiXHQwLCAwLFxuIjsJIyBFbmQgc2VudGluZWwKKyAgICBwcmludCBUWVBFU0laRSAifTtcbiI7CisgICAgY2xvc2UoVFlQRVNJWkUpOworfSBlbHNlIHsKKyAgICAjIFBhc3MgMjogZmluYWxpemUgb3V0cHV0IGZpbGVzCisgICAgcHJpbnQgIlxuIjsKKworICAgIHByaW50IEhBVkVTWVMgIlxuI2VuZGlmXG4iOworICAgIGNsb3NlKEhBVkVTWVMpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N5c2NhbGxzL0tidWlsZCBiL3Vzci9rbGliYy9zeXNjYWxscy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1Yjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zeXNjYWxscy9LYnVpbGQKQEAgLTAsMCArMSw5NCBAQAorIworIyBrYnVpbGQgZmlsZSBmb3IgZ2VuZXJhdGluZyBzeXNjYWxsIHN0dWJzCisjCisKKyMgSW5jbHVkZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBNYWtlZmlsZSBmcmFnbWVudC4KKyMgSXQgY29udGFpbnMgZGVmaW5pdGlvbiBvZiBzeXNjYWxsLW9ianMgc3BlY2lmeWluZyBuYW1lIG9mIGFsbCAubyBmaWxlcworaWZlcSAoJChjbGVhbiksKQorLWluY2x1ZGUgJChvYmopL3N5c2NhbGxzLm1rCitlbmRpZgorCisjIExpc3Rpbmcgb2YgYWxsIC5vIGZpbGVzCithbHdheXMgOj0ga2xpYi5saXN0CisKKworIyMjIyMKKyMgR2VuZXJhdGUgc3lzY2FsbHMgc3R1YnMKKyMgQmFzZWQgb24gbGlzdCBpbiBTWVNDQUxMUy5kZWYgZ2VuZXJhdGUgc3R1YnMgZm9yIHN5cyBjYWxscy4gQWN0dWFsIGFyY2ggY29kZQorIyBpcyBkZWZpbmVkIGluIGFuIGFyY2ggc3BlY2lmaWMgcGVybCBmaWxlCit0YXJnZXRzICs9IHN5c2NhbGxzLm1rCit0YXJnZXRzICs9IGtsaWIubGlzdAordGFyZ2V0cyArPSBTWVNDQUxMUy5pIHN5c2NhbGxzLm5ycwordGFyZ2V0cyArPSB0eXBlc2l6ZS5jIHR5cGVzaXplLm8gdHlwZXNpemUuYmluCit0YXJnZXRzICs9ICQoc3lzY2FsbC1vYmpzKQorCisjIFNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgc3lzY2FsbHMucGwKK2NsZWFuLWZpbGVzICs9ICQob2JqdHJlZSkvJChLTElCQ0lOQykva2xpYmMvaGF2ZXN5c2NhbGwuaAorY2xlYW4tZmlsZXMgKz0gJChLTElCQ0lOQykva2xpYmMvaGF2ZXN5c2NhbGwuaAorIyBBbGwgdGhlIHN5c2NhbGwgc3R1YnMKK2NsZWFuLWZpbGVzICs9ICoubyAqLlMgKi5jICoubGlzdCAqLmJpbgorCitFWFRSQV9LTElCQ0NGTEFHUyA6PSAtSSQoc3JjdHJlZSkvJChzcmMpCisKK3F1aWV0X2NtZF9tYWtlbGlzdCA9IExJU1QgICAgJEAKKyAgICAgIGNtZF9tYWtlbGlzdCA9IGVjaG8gJyQoZmlsdGVyLW91dCBGT1JDRSwkXiknID4gJEAKKworIyBDcmVhdGUgbGlzdCBvZiBhbGwgZmlsZXMKKyQob2JqKS9rbGliLmxpc3Q6ICQoY2FsbCBvYmplY3RpZnksJChzeXNjYWxsLW9ianMpKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG1ha2VsaXN0KQorCisjIEdlbmVyYXRlIGFzc2VtYmxlciBmaWxlICguaSkKKyMgV2UgcGFzcyAtYW5zaSB0byBrZWVwIGNwcCBmcm9tIGRlZmluZSBlLmcuICJpMzg2IiBhcyB3ZWxsIGFzICJfX2kzODZfXyIKK3F1aWV0X2NtZF9zeXNjYWxsLmkgPSBHRU4gICAgICRACisgICAgICBjbWRfc3lzY2FsbC5pID0gJChLTElCQ0NDKSAkKGtsaWJjY2ZsYWdzKSAtRF9fQVNTRU1CTFlfXyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1hbnNpIC14IGMgLUUgLW8gJEAgJDwKKyQob2JqKS9TWVNDQUxMUy5pOiAkKEtMSUJDU1JDKS9TWVNDQUxMUy5kZWYgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsc3lzY2FsbC5pKQorCisjIEdldCBzeXNjYWxscyBudW1iZXJzCitxdWlldF9jbWRfc3lzY2FsbC5ucnMgPSBHRU4gICAgICRACisgICAgICBjbWRfc3lzY2FsbC5ucnMgPSAkKEtMSUJDQ0MpICQoa2xpYmNjZmxhZ3MpIC1XcCwtZE0gLXggYyAtRSAtbyAkQCAkPAorJChvYmopL3N5c2NhbGxzLm5yczogJChLTElCQ0lOQykvc3lzL3N5c2NhbGwuaCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxzeXNjYWxsLm5ycykKKworIyBHZW5lcmF0ZSB0eXBlc2l6ZS5jCitxdWlldF9jbWRfc3lzY2Fsc3ogPSBHRU4gICAgICRACisgICAgICBjbWRfc3lzY2Fsc3ogPSBta2RpciAtcCAkKEtMSUJDSU5DKS9rbGliYy87ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgJChQRVJMKSAkKEtMSUJDU1JDKS9zeXNjYWxscy5wbCAtMSAkKG9iaikvU1lTQ0FMTFMuaSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ1NSQykvYXJjaC8kKEtMSUJDQVJDSERJUikvc3lzc3R1Yi5waCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNBUkNIKSAkKEtMSUJDQklUU0laRSkgJChvYmopL3N5c2NhbGxzLm5ycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDSU5DKS9rbGliYy9oYXZlc3lzY2FsbC5oIAkJICAgIFwKKwkJCSAgICAgJChvYmopL3R5cGVzaXplLmMgPiAkQCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICggcm0gLWYgJEAgOyBleGl0IDEgKQorCiskKG9iaikvdHlwZXNpemUuYzogJChLTElCQ1NSQykvc3lzY2FsbHMucGwgJChvYmopL1NZU0NBTExTLmkgXAorICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNTUkMpL2FyY2gvJChLTElCQ0FSQ0hESVIpL3N5c3N0dWIucGggXAorICAgICAgICAgICAgICAgICAgICAgICQoc3JjKS9zeXNjb21tb24uaCAkKG9iaikvc3lzY2FsbHMubnJzIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2Fsc3opCisKKyMgQ29udmVydCB0eXBlc2l6ZS5vIHRvIHR5cGVzaXplLmJpbgorcXVpZXRfY21kX21rYmluID0gT0JKQ09QWSAkQAorICAgICAgY21kX21rYmluID0gJChLTElCQ09CSkNPUFkpIC1PIGJpbmFyeSAkPCAkQAorCiskKG9iaikvdHlwZXNpemUuYmluOiAkKG9iaikvdHlwZXNpemUubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG1rYmluKQorCisjIEdlbmVyYXRlICQoS0xJQklOQykva2xpYmMvaGF2ZXN5c2NhbGwuaCArIG1ha2VmaWxlIGZyYWdtZW50CisjIFVzaW5nIHN5c3N0dWIucGwgaW4gYXJjaCBkaXIgZ2VuZXJhdGUgYWxsIC5TIGZpbGVzCitxdWlldF9jbWRfc3lzY2FsbHMgPSBHRU4gICAgICRACisgICAgICBjbWRfc3lzY2FsbHMgPSBta2RpciAtcCAkKEtMSUJDSU5DKS9rbGliYy87ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgJChQRVJMKSAkKEtMSUJDU1JDKS9zeXNjYWxscy5wbCAtMiAkKG9iaikvU1lTQ0FMTFMuaSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChLTElCQ1NSQykvYXJjaC8kKEtMSUJDQVJDSERJUikvc3lzc3R1Yi5waCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoS0xJQkNBUkNIKSAkKEtMSUJDQklUU0laRSkgJChvYmopL3N5c2NhbGxzLm5ycyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEtMSUJDSU5DKS9rbGliYy9oYXZlc3lzY2FsbC5oIAkJICAgIFwKKwkJCSAgICAgJChvYmopL3R5cGVzaXplLmJpbiA+ICRAICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICggcm0gLWYgJEAgOyBleGl0IDEgKQorCiskKG9iaikvc3lzY2FsbHMubWs6ICQoS0xJQkNTUkMpL3N5c2NhbGxzLnBsICQob2JqKS9TWVNDQUxMUy5pIFwKKyAgICAgICAgICAgICAgICAgICAgJChLTElCQ1NSQykvYXJjaC8kKEtMSUJDQVJDSERJUikvc3lzc3R1Yi5waCBcCisgICAgICAgICAgICAgICAgICAgICQoY2FsbCBvYmplY3RpZnksICQoc3lzY2FsbC1vYmpzOi5vPS5TKSkgXAorICAgICAgICAgICAgICAgICAgICAkKHNyYykvc3lzY29tbW9uLmggJChvYmopL3N5c2NhbGxzLm5ycyBcCisJCSAgICAkKG9iaikvdHlwZXNpemUuYmluIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2FsbHMpCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3lzY2FsbHMvc3lzY29tbW9uLmggYi91c3Iva2xpYmMvc3lzY2FsbHMvc3lzY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjYWUxMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zeXNjYWxscy9zeXNjb21tb24uaApAQCAtMCwwICsxLDMzIEBACisvKgorICogc3lzY29tbW9uLmgKKyAqCisgKiBDb21tb24gaGVhZGVyIGZpbGUgZm9yIHN5c3RlbSBjYWxsIHN0dWJzCisgKi8KKworI2RlZmluZSBfX0lOX1NZU19DT01NT04KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL2tsb2cuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxzeXMvdXRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19pMzg2X18KKyMgaW5jbHVkZSA8c3lzL3ZtODYuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N5c2xvZy5jIGIvdXNyL2tsaWJjL3N5c2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTJlYWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvc3lzbG9nLmMKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIHN5c2xvZy5jCisgKgorICogSXNzdWUgc3lzbG9nIG1lc3NhZ2VzIHZpYSB0aGUga2VybmVsIHByaW50ayBxdWV1ZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisvKiBNYXhpbXVtIHNpemUgZm9yIGEga2VybmVsIG1lc3NhZ2UgKi8KKyNkZWZpbmUgQlVGTEVOIDEwMjQKKworLyogTG9nZ2luZyBub2RlICovCisjZGVmaW5lIExPR0RFViAiL2Rldi9rbXNnIgorCisvKiBNYXggbGVuZ3RoIG9mIElEIHN0cmluZyAqLworI2RlZmluZSBNQVhJRCAzMQkJLyogTUFYSUQrNSBtdXN0IGJlIDwgQlVGTEVOICovCisKK2ludCBfX3N5c2xvZ19mZCA9IC0xOworc3RhdGljIGNoYXIgaWRbTUFYSUQgKyAxXTsKK3N0YXRpYyBpbnQgc3lzbG9nX2ZsYWdzID0gMDsKKwordm9pZCBvcGVubG9nKGNvbnN0IGNoYXIgKmlkZW50LCBpbnQgb3B0aW9uLCBpbnQgZmFjaWxpdHkpCit7CisJaW50IGZkOworCisJKHZvaWQpb3B0aW9uOworCSh2b2lkKWZhY2lsaXR5OwkJLyogVW51c2VkICovCisKKwlpZiAoX19zeXNsb2dfZmQgPT0gLTEpIHsKKwkJX19zeXNsb2dfZmQgPSBmZCA9IG9wZW4oTE9HREVWLCBPX1dST05MWSk7CisJCWlmIChmZCA9PSAtMSkKKwkJCXJldHVybjsKKwkJZmNudGwoZmQsIEZfU0VURkQsIChsb25nKUZEX0NMT0VYRUMpOworCX0KKworCXN5c2xvZ19mbGFncyA9IG9wdGlvbjsKKworCXN0cm5jcHkoaWQsIGlkZW50ID8gaWRlbnQgOiAiIiwgTUFYSUQpOworfQorCit2b2lkIHZzeXNsb2coaW50IHByaW8sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwljaGFyIGJ1ZltCVUZMRU5dOworCWludCBsZW47CisJaW50IGZkOworCisJaWYgKF9fc3lzbG9nX2ZkID09IC0xKQorCQlvcGVubG9nKE5VTEwsIDAsIDApOworCisJYnVmWzBdID0gJzwnOworCWJ1ZlsxXSA9IExPR19QUkkocHJpbykgKyAnMCc7CisJYnVmWzJdID0gJz4nOworCWxlbiA9IDM7CisKKwlpZiAoc3lzbG9nX2ZsYWdzICYgTE9HX1BJRCkKKwkJbGVuICs9IHNwcmludGYoYnVmICsgMywgIiVzWyV1XTogIiwgaWQsIGdldHBpZCgpKTsKKwllbHNlIGlmICgqaWQpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIDMsICIlczogIiwgaWQpOworCisJbGVuICs9IHZzbnByaW50ZihidWYgKyBsZW4sIEJVRkxFTiAtIGxlbiwgZm9ybWF0LCBhcCk7CisKKwlpZiAobGVuID4gQlVGTEVOIC0gMSkKKwkJbGVuID0gQlVGTEVOIC0gMTsKKwlpZiAoYnVmW2xlbiAtIDFdICE9ICdcbicpCisJCWJ1ZltsZW4rK10gPSAnXG4nOworCisJZmQgPSBfX3N5c2xvZ19mZDsKKwlpZiAoZmQgPT0gLTEpCisJCWZkID0gMjsJCS8qIEZhaWxlZCB0byBvcGVuIGxvZywgd3JpdGUgdG8gc3RkZXJyICovCisKKwl3cml0ZShmZCwgYnVmLCBsZW4pOworCisJaWYgKHN5c2xvZ19mbGFncyAmIExPR19QRVJST1IpCisJCV9md3JpdGUoYnVmICsgMywgbGVuIC0gMywgc3RkZXJyKTsKK30KKwordm9pZCBzeXNsb2coaW50IHByaW8sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwl2c3lzbG9nKHByaW8sIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvc3lzdGVtLmMgYi91c3Iva2xpYmMvc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ3OGIyMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy9zeXN0ZW0uYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogc3lzdGVtLmMKKyAqCisgKiBUaGUgc3lzdGVtKCkgZnVuY3Rpb24uICBJZiB0aGlzIHR1cm5zIG91dCB0byBhY3R1YWxseSBiZSAqdXNlZCosCisgKiB3ZSBtYXkgd2FudCB0byB0cnkgdG8gZGV0ZWN0IHRoZSB2ZXJ5IHNpbXBsZSBjYXNlcyAobm8gc2hlbGwgbWFnaWMpCisgKiBhbmQgaGFuZGxlIHRoZW0gaW50ZXJuYWxseSwgaW5zdGVhZCBvZiByZXF1aXJpbmcgdGhhdCAvYmluL3NoIGJlCisgKiBwcmVzZW50LgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKK2ludCBzeXN0ZW0oY29uc3QgY2hhciAqc3RyaW5nKQoreworCXBpZF90IHBpZDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGlnbm9yZSwgb2xkX2ludCwgb2xkX3F1aXQ7CisJc2lnc2V0X3QgbWFza2VkLCBvbGRtYXNrOworCXN0YXRpYyBjb25zdCBjaGFyICphcmd2W10gPSB7ICIvYmluL3NoIiwgIi1jIiwgTlVMTCwgTlVMTCB9OworCWludCBzdGF0dXM7CisKKwkvKiBCbG9jayBTSUdDSExEIGFuZCBpZ25vcmUgU0lHSU5UIGFuZCBTSUdRVUlUICovCisJLyogRG8gdGhpcyBiZWZvcmUgdGhlIGZvcmsoKSB0byBhdm9pZCByYWNlcyAqLworCisJaWdub3JlLnNhX2hhbmRsZXIgPSBTSUdfSUdOOworCXNpZ2VtcHR5c2V0KCZpZ25vcmUuc2FfbWFzayk7CisJaWdub3JlLnNhX2ZsYWdzID0gMDsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmaWdub3JlLCAmb2xkX2ludCk7CisJc2lnYWN0aW9uKFNJR1FVSVQsICZpZ25vcmUsICZvbGRfcXVpdCk7CisKKwlzaWdlbXB0eXNldCgmbWFza2VkKTsKKwlzaWdhZGRzZXQoJm1hc2tlZCwgU0lHQ0hMRCk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFza2VkLCAmb2xkbWFzayk7CisKKwlwaWQgPSBmb3JrKCk7CisKKwlpZiAocGlkIDwgMCkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHBpZCA9PSAwKSB7CisJCXNpZ2FjdGlvbihTSUdJTlQsICZvbGRfaW50LCBOVUxMKTsKKwkJc2lnYWN0aW9uKFNJR1FVSVQsICZvbGRfcXVpdCwgTlVMTCk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkbWFzaywgTlVMTCk7CisKKwkJYXJndlsyXSA9IHN0cmluZzsKKworCQlleGVjdmUoYXJndlswXSwgKGNoYXIgKmNvbnN0ICopYXJndiwgKGNoYXIgKmNvbnN0ICopZW52aXJvbik7CisJCV9leGl0KDEyNyk7CisJfQorCisJLyogZWxzZS4uLiAqLworCisJd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJc2lnYWN0aW9uKFNJR0lOVCwgJm9sZF9pbnQsIE5VTEwpOworCXNpZ2FjdGlvbihTSUdRVUlULCAmb2xkX3F1aXQsIE5VTEwpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkbWFzaywgTlVMTCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3N5c3Zfc2lnbmFsLmMgYi91c3Iva2xpYmMvc3lzdl9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWVlN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3N5c3Zfc2lnbmFsLmMKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIHN5c3Zfc2lnbmFsLmMKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK19fc2lnaGFuZGxlcl90IHN5c3Zfc2lnbmFsKGludCBzaWdudW0sIF9fc2lnaGFuZGxlcl90IGhhbmRsZXIpCit7CisJLyogTGludXgvU3lzViBzaWduYWwoKSBzZW1hbnRpY3MgKi8KKwlyZXR1cm4gX19zaWduYWwoc2lnbnVtLCBoYW5kbGVyLCBTQV9SRVNFVEhBTkQpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL0tidWlsZCBiL3Vzci9rbGliYy90ZXN0cy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlOGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9LYnVpbGQKQEAgLTAsMCArMSw1MCBAQAorIworIyBLYnVpbGQgZmlsZSBmb3IgYWxsIHRlc3QgZmlsZXMKKyMKKwordGVzdC1maWxlcyA6PSAkKHdpbGRjYXJkICQoc3JjdHJlZSkvJChzcmMpLyouYykKK3Rlc3QtZmlsZXMgOj0gJChub3RkaXIgJCh0ZXN0LWZpbGVzKSkKKworIyBUaGlzIHBhcnRpY3VsYXIgZmlsZSB1c2VzIGEgYnVuY2ggb2YgZm9ybWF0cyBnY2MgZG9uJ3Qga25vdyBvZiwgaW4gb3JkZXIKKyMgdG8gdGVzdCB0aGUgZnVsbCByYW5nZSBvZiBvdXIgdnNucHJpbnRmKCkgZnVuY3Rpb24uICBUaGlzIG91dHB1dHMgYSBidW5jaAorIyBvZiB1c2VsZXNzIHdhcm5pbmdzIHVubGVzcyB3ZSB0ZWxsIGl0IG5vdCB0by4KK0tMSUJDQ0ZMQUdTX3Rlc3R2c25wLm8gOj0gLVduby1mb3JtYXQKKworc3RhdGljLXkgOj0gJCh0ZXN0LWZpbGVzOi5jPSkKK3NoYXJlZC15IDo9ICQoYWRkc3VmZml4IC5zaGFyZWQsICQoc3RhdGljLXkpKQorCitlbnZpcm9uLnNoYXJlZC15CTo9IGVudmlyb24ubworZmNudGwuc2hhcmVkLXkJCTo9IGZjbnRsLm8KK2ZubWF0Y2guc2hhcmVkLXkJOj0gZm5tYXRjaC5vCitnZXRvcHR0ZXN0LnNoYXJlZC15CTo9IGdldG9wdHRlc3QubworZ2V0b3B0bG9uZy5zaGFyZWQteQk6PSBnZXRvcHRsb25nLm8KK2dldHBhZ2VzaXplLnNoYXJlZC15CTo9IGdldHBhZ2VzaXplLm8KK2hlbGxvLnNoYXJlZC15CQk6PSBoZWxsby5vCitpZHRlc3Quc2hhcmVkLXkJCTo9IGlkdGVzdC5vCittYWxsb2N0ZXN0LnNoYXJlZC15CTo9IG1hbGxvY3Rlc3QubworbWFsbG9jdGVzdDIuc2hhcmVkLXkJOj0gbWFsbG9jdGVzdDIubworbWVtc3RydGVzdC5zaGFyZWQteQk6PSBtZW1zdHJ0ZXN0Lm8KK21pY3JvaGVsbG8uc2hhcmVkLXkJOj0gbWljcm9oZWxsby5vCittaW5paGVsbG8uc2hhcmVkLXkJOj0gbWluaWhlbGxvLm8KK21tYXB0ZXN0LnNoYXJlZC15CTo9IG1tYXB0ZXN0Lm8KK25mc19ub19ycGMuc2hhcmVkLXkJOj0gbmZzX25vX3JwYy5vCitvcGVudGVzdC5zaGFyZWQteQk6PSBvcGVudGVzdC5vCitwaXBldGVzdC5zaGFyZWQteQk6PSBwaXBldGVzdC5vCitydHNpZy5zaGFyZWQteQkJOj0gcnRzaWcubworc2VsZWN0LnNoYXJlZC15CQk6PSBzZWxlY3Qubworc2V0ZW52dGVzdC5zaGFyZWQteQk6PSBzZXRlbnZ0ZXN0Lm8KK3NldGptcHRlc3Quc2hhcmVkLXkJOj0gc2V0am1wdGVzdC5vCitzaWdpbnQuc2hhcmVkLXkJCTo9IHNpZ2ludC5vCitzdGF0LnNoYXJlZC15CQk6PSBzdGF0Lm8KK3N0YXRmcy5zaGFyZWQteQkJOj0gc3RhdGZzLm8KK3N0cmxjcHljYXQuc2hhcmVkLXkJOj0gc3RybGNweWNhdC5vCitzdHJ0b2ltYXguc2hhcmVkLXkJOj0gc3RydG9pbWF4Lm8KK3N0cnRvdGltZS5zaGFyZWQteQk6PSBzdHJ0b3RpbWUubwordGVzdHJhbmQ0OC5zaGFyZWQteQk6PSB0ZXN0cmFuZDQ4Lm8KK3Rlc3R2c25wLnNoYXJlZC15CTo9IHRlc3R2c25wLm8KK3Zmb3JrLnNoYXJlZC15CQk6PSB2Zm9yay5vCisKKyMgQ2xlYW5pbmcKK2NsZWFuLWZpbGVzIDo9ICQoc3RhdGljLXkpICQoc2hhcmVkLXkpIFwKKwkkKGFkZHN1ZmZpeCAuZywgJChzdGF0aWMteSkgJChzaGFyZWQteSkpIFwKKwkkKHRlc3QtZmlsZXM6LmM9Lm8pCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvZW52aXJvbi5jIGIvdXNyL2tsaWJjL3Rlc3RzL2Vudmlyb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWIwODJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL2Vudmlyb24uYwpAQCAtMCwwICsxLDI0IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqZW52cFtdKQoreworCWludCBpOworCisJLyogVmVyaWZ5IGVudnAgPT0gZW52aXJvbiAqLworCXByaW50ZigiVmVyaWZ5aW5nIGVudnAgPT0gZW52aXJvbi4uLiAlc1xuIiwKKwkgICAgICAgKGVudnAgPT0gZW52aXJvbikgPyAib2siIDogIkVSUk9SIik7CisKKwkvKiBUZXN0IGFyZ2MvYXJndiAqLworCXByaW50ZigiYXJnYyA9ICVkLCBhcmd2ID0gJXBcbiIsIGFyZ2MsIGFyZ3YpOworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJcHJpbnRmKCJhcmd2WyUyZF0gPSAlc1xuIiwgaSwgYXJndltpXSk7CisJfQorCisJLyogVGVzdCBlbnZpcm9uICovCisJZm9yIChpID0gMDsgZW52cFtpXTsgaSsrKQorCQlwcmludGYoIiVzXG4iLCBlbnZwW2ldKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL2ZjbnRsLmMgYi91c3Iva2xpYmMvdGVzdHMvZmNudGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2FhM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL2ZjbnRsLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIFNpbXBsZSB0ZXN0IG9mIGZjbnRsCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBmZCA9IG9wZW4oYXJndlswXSwgT19SRE9OTFkpOworCXN0cnVjdCBmbG9jayBsOworCWxvbmcgZmxhZ3M7CisKKwkodm9pZClhcmdjOworCisJaWYgKGZkIDwgMCkgeworCQlwZXJyb3IoIm9wZW4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBHZXQgdGhlIGZsYWdzIG9uIHRoaXMgRkQgKi8KKworCWlmICgoZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCkpID09IC0xKSB7CisJCXBlcnJvcigiRl9HRVRGTCIpOworCQlleGl0KDEpOworCX0KKworCWlmIChmbGFncyAhPSAoT19SRE9OTFkgfCBPX0xBUkdFRklMRSkpCisJCWZwcmludGYoc3RkZXJyLCAiZmxhZ3MgPSAlI2x4XG4iLCBmbGFncyk7CisKKwkvKiBTZXQgYSBsb2NrIG9uIHRoaXMgRkQgKi8KKwltZW1zZXQoJmwsIDAsIHNpemVvZiBsKTsKKwlsLmxfdHlwZSA9IEZfUkRMQ0s7CisJbC5sX3doZW5jZSA9IFNFRUtfU0VUOworCWwubF9zdGFydCA9IDEyMzsKKwlsLmxfbGVuID0gNDU2OworCisJaWYgKGZjbnRsKGZkLCBGX1NFVExLLCAmbCkgPT0gLTEpIHsKKwkJcGVycm9yKCJGX1NFVExLIik7CisJCWV4aXQoMSk7CisJfQorCisJLyogRXZlbnR1YWxseSwgZm9yayBhbmQgdHJ5IHRvIGNvbmZsaWN0IHdpdGggdGhpcyBsb2NrLi4uICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9mbm1hdGNoLmMgYi91c3Iva2xpYmMvdGVzdHMvZm5tYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTA4NTcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvZm5tYXRjaC5jCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmxhZ3MgPSBhdG9pKGFyZ3ZbM10pOworCWludCBtYXRjaCA9IGZubWF0Y2goYXJndlsxXSwgYXJndlsyXSwgZmxhZ3MpOworCisJcHJpbnRmKCJcIiVzXCIgbWF0Y2hlcyBcIiVzXCI6ICVkXG4iLCBhcmd2WzFdLCBhcmd2WzJdLCBtYXRjaCk7CisKKwlyZXR1cm4gbWF0Y2g7Cit9CisKKwkKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9nZXRvcHRsb25nLmMgYi91c3Iva2xpYmMvdGVzdHMvZ2V0b3B0bG9uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTc0YWJjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL2dldG9wdGxvbmcuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogZ2V0b3B0bG9uZy5jCisgKgorICogU2ltcGxlIHRlc3QgZm9yIGdldG9wdF9sb25nLCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdFVE9QVFRFU1QKKyAqIHRvIGdpdmUgdGhlIGFyZ3VtZW50IHN0cmluZyB0byBnZXRvcHQoKQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCitzdGF0aWMgaW50IGZvbyA9IDA7CisJCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwl7ICJmaXJzdCIsICAgMSwgTlVMTCwgJ2YnIH0sCisJeyAic2Vjb25kIiwgIDAsIE5VTEwsICdzJyB9LAorCXsgInRoaXJkIiwgICAyLCBOVUxMLCAnMycgfSwKKwl7ICJmb3VydGgiLCAgMCwgTlVMTCwgIDQgfSwKKwl7ICJzZXQtZm9vIiwgMCwgJmZvbywgIDEgfSwKKwl7IE5VTEwsIDAsIE5VTEwsIDAgfQorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQoreworCWNvbnN0IGNoYXIgKnBhcnNlcjsKKwljb25zdCBjaGFyICpzaG93Y2hhcjsKKwljaGFyIG9uZV9jaGFyW10gPSAiXCc/XCciOworCWNoYXIgbnVtX2J1ZlsxNl07CisJaW50IGM7CisJaW50IGxvbmdpbmRleDsKKworCXBhcnNlciA9IGdldGVudigiR0VUT1BUVEVTVCIpOworCWlmICghcGFyc2VyKQorCQlwYXJzZXIgPSAiYWJ6ZjpvOiI7CisKKwlkbyB7CisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBwYXJzZXIsIGxvbmdfb3B0aW9ucywgJmxvbmdpbmRleCk7CisKKwkJaWYgKGMgPT0gRU9GKSB7CisJCQlzaG93Y2hhciA9ICJFT0YiOworCQl9IGVsc2UgaWYgKGMgPj0gMzIgJiYgYyA8PSAxMjYpIHsKKwkJCW9uZV9jaGFyWzFdID0gYzsKKwkJCXNob3djaGFyID0gb25lX2NoYXI7CisJCX0gZWxzZSB7CisJCQlzbnByaW50ZihudW1fYnVmLCBzaXplb2YgbnVtX2J1ZiwgIiVkIiwgYyk7CisJCQlzaG93Y2hhciA9IG51bV9idWY7CisJCX0KKworCQlwcmludGYoImMgPSAlcywgb3B0aW5kID0gJWQgKFwiJXNcIiksIG9wdGFyZyA9IFwiJXNcIiwgIgorCQkgICAgICAgIm9wdG9wdCA9IFwnJWNcJywgZm9vID0gJWQsIGxvbmdpbmRleCA9ICVkXG4iLAorCQkgICAgICAgc2hvd2NoYXIsIG9wdGluZCwgYXJndltvcHRpbmRdLAorCQkgICAgICAgb3B0YXJnLCBvcHRvcHQsIGZvbywgbG9uZ2luZGV4KTsKKwl9IHdoaWxlIChjICE9IC0xKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL2dldG9wdHRlc3QuYyBiL3Vzci9rbGliYy90ZXN0cy9nZXRvcHR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2MTlkMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9nZXRvcHR0ZXN0LmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIGdldG9wdHRlc3QuYworICoKKyAqIFNpbXBsZSB0ZXN0IGZvciBnZXRvcHQsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR0VUT1BUVEVTVAorICogdG8gZ2l2ZSB0aGUgYXJndW1lbnQgc3RyaW5nIHRvIGdldG9wdCgpCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKK3sKKwljb25zdCBjaGFyICpwYXJzZXI7CisJY2hhciBzaG93Y2hhcltdID0gIlwnP1wnIjsKKwlpbnQgYzsKKworCXBhcnNlciA9IGdldGVudigiR0VUT1BUVEVTVCIpOworCWlmICghcGFyc2VyKQorCQlwYXJzZXIgPSAiYWJ6ZjpvOiI7CisKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgcGFyc2VyKTsKKwkJc2hvd2NoYXJbMV0gPSBjOworCQlwcmludGYKKwkJICAgICgiYyA9ICVzLCBvcHRpbmQgPSAlZCAoJXMpLCBvcHRhcmcgPSBcIiVzXCIsIG9wdG9wdCA9IFwnJWNcJ1xuIiwKKwkJICAgICAoYyA9PSBFT0YpID8gIkVPRiIgOiBzaG93Y2hhciwgb3B0aW5kLCBhcmd2W29wdGluZF0sCisJCSAgICAgb3B0YXJnLCBvcHRvcHQpOworCX0gd2hpbGUgKGMgIT0gLTEpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvZ2V0cGFnZXNpemUuYyBiL3Vzci9rbGliYy90ZXN0cy9nZXRwYWdlc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTk0NmEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvZ2V0cGFnZXNpemUuYwpAQCAtMCwwICsxLDEwIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKwlwcmludGYoImdldHBhZ2VzaXplKCkgICAgPSAlZFxuIgorCSAgICAgICAiX19nZXRwYWdlc2hpZnQoKSA9ICVkXG4iLCBnZXRwYWdlc2l6ZSgpLCBfX2dldHBhZ2VzaGlmdCgpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL2hlbGxvLmMgYi91c3Iva2xpYmMvdGVzdHMvaGVsbG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg1OWJkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL2hlbGxvLmMKQEAgLTAsMCArMSw3IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4odm9pZCkKK3sKKwlwcmludGYoIkhlbGxvLCBXb3JsZCFcbiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL2lkdGVzdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL2lkdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzQ0NDcKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvaWR0ZXN0LmMKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJcHJpbnRmKCJwaWQgICA9ICV1XG4iLCBnZXRwaWQoKSk7CisJcHJpbnRmKCJwcGlkICA9ICV1XG4iLCBnZXRwcGlkKCkpOworCXByaW50ZigidWlkICAgPSAldVxuIiwgZ2V0dWlkKCkpOworCXByaW50ZigiZXVpZCAgPSAldVxuIiwgZ2V0ZXVpZCgpKTsKKwlwcmludGYoImdpZCAgID0gJXVcbiIsIGdldGdpZCgpKTsKKwlwcmludGYoImVnaWQgID0gJXVcbiIsIGdldGVnaWQoKSk7CisJc2xlZXAoMTApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL21hbGxvY3Rlc3QuYyBiL3Vzci9rbGliYy90ZXN0cy9tYWxsb2N0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlMTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9tYWxsb2N0ZXN0LmMKQEAgLTAsMCArMSw0MTQ2IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBOQ1lDTEVTIDQwOTYKKworaW50IHNpemVzW05DWUNMRVNdID0geworCTExOTg2LAorCTI3NzgwNiwKKwkyNjU5LAorCTQ2LAorCTAsCisJNzc1NTUzLAorCTE5OTEsCisJMjEsCisJNzYzOCwKKwkyNTAxOTcsCisJMTU1ODI4LAorCTU3NzcsCisJOSwKKwkzMTUwMDYsCisJOTAwNzg4LAorCTAsCisJMjQ4OTMsCisJMTE5OTk2LAorCTcyMjk5LAorCTE3MTI2NiwKKwkzNTcsCisJNTYwLAorCTM2OCwKKwkyMjk1MiwKKwk1NDA1OCwKKwkxMjYzOCwKKwkzOTE1NSwKKwkyNzM4LAorCTIxNzU2MywKKwkyNjg1MywKKwk0NywKKwk3NSwKKwkxMTY3LAorCTE2OTE3LAorCTE4OTksCisJMjkwNSwKKwk5MzM3LAorCTYyMjQzLAorCTE0MjE0LAorCTI3MDUyMywKKwk0MDI0LAorCTIxLAorCTMyLAorCTE0ODkyLAorCTYyNTE0NCwKKwkxMywKKwkyMTcwMCwKKwk4ODA0LAorCTI1NDE0NywKKwkwLAorCTYsCisJODM2MDA0LAorCTE3MTgsCisJMjI4OSwKKwkxNTU1NCwKKwk0MTI4NTcsCisJMTg1MDk3LAorCTgwNjcwOSwKKwk2NCwKKwkxODYwMiwKKwkxNzA2NCwKKwkxNzc5LAorCTc4MTUzLAorCTE3MDYwMCwKKwkxOTkxMDAsCisJNTQ2NTI4LAorCTAsCisJMjEsCisJMjA2MDksCisJMTY1MTQsCisJNTQ4MTk2LAorCTMxMTQ0NiwKKwk1MzQ4NCwKKwkwLAorCTU1MSwKKwkyMjIyNSwKKwkyNCwKKwkxNTM5ODksCisJNDU3MzA5LAorCTUyNjgzMywKKwkyMjc5NzksCisJNzU3MTY3LAorCTQyOTU2MCwKKwkwLAorCTgzNSwKKwkxNzAyLAorCTQ3NTI3NSwKKwk3OTg0MTYsCisJNzUzLAorCTAsCisJMTExMjYsCisJMTQ1Nzc5LAorCTIwMDYsCisJMCwKKwk4MTgyLAorCTAsCisJNTY5NDMyLAorCTk2NzEsCisJMzYsCisJNTUyMywKKwk0MDczMjUsCisJMCwKKwk2NSwKKwk5MjkzLAorCTAsCisJNjc5MywKKwk0Njg3MDEsCisJNzMsCisJMCwKKwkxODYyMzYsCisJMCwKKwkzMjg0MDUsCisJMTI1NjE2LAorCTUwODAxMywKKwkzODA1MTksCisJNTk5NTE4LAorCTgzLAorCTE1MTk3MywKKwk0NjY5MDYsCisJOTAyOSwKKwkxNTk3MjUsCisJMTMxNiwKKwkxLAorCTkxMTUzMiwKKwkxNTA4LAorCTE5MDUwLAorCTk3Mjg1MCwKKwkxMjYsCisJNDM5Mzc3LAorCTI5LAorCTM3OTI4LAorCTE0OTYyOCwKKwk1NCwKKwkxMzAyNDgsCisJMiwKKwkxNDMsCisJMCwKKwk3MTY4NzMsCisJMzMyNywKKwk1LAorCTExNjEzMSwKKwk1MTI0LAorCTU1OTYyMSwKKwkyODg2LAorCTUzNCwKKwkxODY0MzIsCisJNDQxLAorCTczNDgsCisJMTAzMzEsCisJMSwKKwkyNjA5MzUsCisJNywKKwk0MzcwLAorCTQwNTQxNSwKKwkyLAorCTg0NTE4LAorCTE5NzAsCisJMSwKKwkyODE5MTAsCisJNDYsCisJMjc0LAorCTIyNzMsCisJMzcwNTY1LAorCTQxOTAsCisJODIwNjQxLAorCTU3Nzk3MCwKKwkzMjgwOSwKKwk5NzQ4OTMsCisJMzk4MDY3LAorCTM4MDY5OCwKKwk0LAorCTI1OTc4LAorCTE1MywKKwk4ODI2NjgsCisJMzEyMzY1LAorCTk1MjMsCisJMTU2NDIxLAorCTAsCisJMjY4MTQzLAorCTYsCisJMiwKKwk0Mjk4NywKKwkyMTIsCisJMTIzMDMsCisJNjcyMywKKwkxMTc5LAorCTAsCisJMTIwOTI0LAorCTM4NzcsCisJMzMwNDIxLAorCTMxMDQ0NSwKKwkzOTI2NCwKKwk4LAorCTg1MzgwLAorCTQ2NDcxNiwKKwkwLAorCTMzNjU3LAorCTYyODUsCisJMCwKKwk0NDkxLAorCTIyOSwKKwk1MCwKKwkzNzMxOTcsCisJNjAyOSwKKwkxOSwKKwk4Njg4NCwKKwkyNDM3NDUsCisJMzM1NjU2LAorCTkwOTQ1LAorCTM4OTczLAorCTU3Mjk1MCwKKwkxNjQxMjksCisJMCwKKwkzLAorCTE3LAorCTEzNTc5LAorCTQ0NDgsCisJNDcsCisJMywKKwkxMzI5NjYsCisJNzI2MjQ5LAorCTQ5ODUwMywKKwkyNTYsCisJMCwKKwkyNTg0MSwKKwkwLAorCTcsCisJOTQ1MzgwLAorCTExODcyLAorCTY5LAorCTM3OTksCisJNzcyMjMsCisJMTkxNCwKKwk3MywKKwk4MTA5NjgsCisJMTAyMjMsCisJMjU3OTE4LAorCTE4NDI1MiwKKwkzNTAsCisJODEwMSwKKwk3MjUsCisJOSwKKwkyLAorCTIwODksCisJMTc1LAorCTI0NywKKwkxODU5NjQsCisJMzY1MTcsCisJMzcyMywKKwkzMTM0NjUsCisJMjA5LAorCTEzMDAsCisJMTI4MDcxLAorCTc0MjUsCisJMjQzNiwKKwk2MiwKKwkxMzc1MywKKwk5NTE0LAorCTQxLAorCTQwOTE0MSwKKwk0NjY0MywKKwkyMDg2NiwKKwkxNTY2NCwKKwkzODg1NDgsCisJODQ2OTIsCisJOTU0OSwKKwk2MTAsCisJNzIxMywKKwkxNCwKKwkxNDkzMCwKKwkyNDQ3MTksCisJNDc0OCwKKwk0MTY4MiwKKwk0MDEwOTgsCisJMTAyNTA2LAorCTE3NjUzNSwKKwkwLAorCTUxMzMsCisJNTQ4LAorCTUyMzQsCisJNTYsCisJMTExMDEsCisJODc2MzgsCisJMzM2NTc5LAorCTI5MTcwNSwKKwk2NDAyNTAsCisJNzY4MTY1LAorCTM3MCwKKwkyODA5LAorCTMsCisJMCwKKwk0NDUxMjIsCisJNDcxOTAsCisJMjQ4ODUsCisJMTQzNTU2LAorCTg0LAorCTUwNDcyNiwKKwk2MTAwMjAsCisJNDAzNTUsCisJOTAyMjMwLAorCTQzNjAsCisJMTc0NywKKwkzNDk2LAorCTQ4OTUwMSwKKwkxOSwKKwk4MDE2MDEsCisJNjIxODksCisJNDgsCisJMjY0NSwKKwkzMjA2MDEsCisJMjczMDQsCisJMTc3NDAsCisJMzQ0LAorCTEwLAorCTk5MSwKKwk5MjU1MDMsCisJMCwKKwkzMTUsCisJMjUxLAorCTM2MTEsCisJMTc1NiwKKwk2ODMsCisJMTY1LAorCTM4MDEzMiwKKwkxODExMDEsCisJNDUzMDQxLAorCTg5MjA1NiwKKwk2NzE5MSwKKwkyNTI1OTIsCisJMzI0MDcsCisJNTYyNDIsCisJOCwKKwkyOTcxNzMsCisJNTQyOTAzLAorCTgzMDMzNCwKKwk1ODUyMzYsCisJNDIyNTU1LAorCTQ0NzY5LAorCTAsCisJNjgsCisJNDE0MywKKwkzODc1NCwKKwk3MzUzOSwKKwk0NDU3OSwKKwk5NDAwMSwKKwk0Mjg1MzcsCisJMzg1NTQsCisJMTA2NjEyLAorCTAsCisJMTgyOTg3LAorCTgzMTczMSwKKwkzNjA1LAorCTc1Mjg1MSwKKwk1MiwKKwk3MiwKKwkxMjA4NzIsCisJOTYzNzU0LAorCTMxLAorCTc2NCwKKwkyNDA1OTIsCisJOTkxMDEsCisJMzI4NTM4LAorCTQ0MDMyNSwKKwkxMjIxMSwKKwkxNTEyODIsCisJMzUzNDM2LAorCTI5OTEsCisJNDA3MTAsCisJNTIxMiwKKwk1MTA2LAorCTEzOTEyMiwKKwkxNDg5MTUsCisJNDk4NTA1LAorCTEzNjYsCisJNTE2LAorCTI5MTkwLAorCTE3LAorCTIyNDIwOCwKKwk0MCwKKwk4OSwKKwkxOTE5MCwKKwk4LAorCTI1Mzc3LAorCTEwMDI5LAorCTcyMCwKKwk5Nzk2MywKKwkwLAorCTYxNCwKKwkyNDQ1NjcsCisJMjExMywKKwk5MDM2NzUsCisJODM4OCwKKwk2LAorCTM5MDcwNSwKKwkzMjUwMDYsCisJMjg0MjcyLAorCTEwODA4NiwKKwkxNywKKwkyNjI4LAorCTk1MjUzMCwKKwkyMDQ3NCwKKwk4OTgyNzYsCisJMTM4NjYxLAorCTM4ODMsCisJOTAzLAorCTU2OTk5MywKKwkzNzY5MTgsCisJNTg0OSwKKwkxMDM0MDQsCisJNzk0NDk5LAorCTM1Mzg4LAorCTUsCisJMCwKKwk5NjE2MjYsCisJMjc0MTUsCisJMTkyNywKKwk5MjAzNiwKKwk0NjI0MSwKKwkzNTk3OCwKKwk3NDI2LAorCTM5OTg4NCwKKwkyOTQ5MCwKKwkyNTI2NTUsCisJNjc1OTcxLAorCTM1MDksCisJNTQxNzAsCisJMTcwNzkwLAorCTgzMTM0MSwKKwkxMzQ1NzksCisJMCwKKwk3OTA0MjIsCisJMzUsCisJOTMwODMwLAorCTk3Mzk0LAorCTIwMjY1LAorCTY3MCwKKwkzODQ5NywKKwkxNzU5LAorCTcxMjA5LAorCTkzLAorCTczNiwKKwkxMSwKKwk4ODYsCisJMTk2MSwKKwk3LAorCTIxMDYwNywKKwk2MjIyNiwKKwkxODY3MzYsCisJMTUxOCwKKwk1LAorCTUsCisJMTMsCisJNjY5ODksCisJNDQyMzIxLAorCTAsCisJNjA3OTM5LAorCTExMjUzLAorCTIxMDg3NSwKKwk0OTU1MzAsCisJMiwKKwkyMjExMzYsCisJMzc3NjYzLAorCTM3MiwKKwkyMDA2NTgsCisJMTg1OTEsCisJMTI5NzgzLAorCTgwMzQxMSwKKwk4Njc1MDYsCisJNzU3NDQ2LAorCTQ4ODM2LAorCTM0LAorCTIwMCwKKwkxMTQ5ODMsCisJNzI4NywKKwkyMjg0OSwKKwkyMjY2NjksCisJMTMsCisJMCwKKwkyMDE2NCwKKwk3ODI4LAorCTM5LAorCTQ5NDQ4LAorCTI2NzQwLAorCTE4NTU2NiwKKwk5OTI3LAorCTM2MTkyLAorCTkxMDY4LAorCTMzODM2OCwKKwk5MjYsCisJMjc3NDYsCisJNTM0Nzk0LAorCTkzNjEzMiwKKwkyOTIyLAorCTUsCisJMTgzMTYyLAorCTI1Njg0NiwKKwkyNDI1NTEsCisJMTM0MzE4LAorCTIxMjk1OSwKKwkxNjcxNjIsCisJNDcwLAorCTQ3NzA0NSwKKwk1MzIxMTYsCisJNDgzNzk0LAorCTczMywKKwk1MzM1LAorCTgzMDc0LAorCTQ2ODYsCisJOTU2NywKKwkxLAorCTE5NTEwMCwKKwk0MDM1NCwKKwk4NzMzOCwKKwkzNjksCisJODAwLAorCTAsCisJMTk0NTA0LAorCTQ2OTA1MSwKKwkzNjM1MzIsCisJODUwNTc0LAorCTUwODUsCisJMTY3MDI3LAorCTc5NDUxMSwKKwkxMjQzMjAsCisJMzAzMjMxLAorCTEzMjE5NSwKKwkxMzIyNSwKKwk0NjMzMywKKwk0MzEzLAorCTg5LAorCTc5OSwKKwk1MTQ4MiwKKwkwLAorCTI2LAorCTEyNjU5LAorCTEwNDUsCisJMjM2MjEsCisJMCwKKwk3NDkyNiwKKwk0OTA5NzksCisJNiwKKwkzMTg4LAorCTk0NDgsCisJMTc0NzMwLAorCTM4OTgyLAorCTEwMjMxNywKKwkxODk2MjEsCisJODUzLAorCTI5MjI3LAorCTQzMzc0LAorCTQyMywKKwk0MjA5NTEsCisJNjg2LAorCTEyOCwKKwkzMTI5MSwKKwkwLAorCTQwMjgxOSwKKwk2NjMxNDMsCisJNTU5MDMsCisJMTQyLAorCTIsCisJMzMxNTg0LAorCTE5NzE2NCwKKwk3LAorCTY3MTk4MywKKwk1MywKKwk1MDIwLAorCTk3ODIsCisJMTIzLAorCTc0MzQwNywKKwkxMjc2LAorCTExMTUsCisJMTE2OSwKKwkxMjI3NTIsCisJODI0NjkwLAorCTI5MjAzMCwKKwkyMDk0LAorCTE0NDYyNiwKKwkwLAorCTI5NzI3OCwKKwk0NDAsCisJNzQyLAorCTk1ODc5LAorCTE3NjgyLAorCTEwNjU0LAorCTMxLAorCTIyMTgzLAorCTc0NiwKKwkwLAorCTAsCisJMTExODUsCisJMjgsCisJMzk0OTg3LAorCTM2LAorCTQ3NCwKKwkyNDM3NDksCisJMTQzMSwKKwk1NjcwMiwKKwk3NiwKKwkxNTYxOSwKKwkzMzA3MSwKKwkxMjE4MSwKKwkxNTg2NDcsCisJMjYxNzg2LAorCTEsCisJMTE5NzgzLAorCTQ4ODE2LAorCTYyNzgsCisJNDEyMSwKKwk2MTEyMiwKKwk2OSwKKwk0ODc5MCwKKwkzNDUzMzUsCisJMjc1OTE3LAorCTk2NDM5MywKKwk0MjQsCisJNTg2NDMzLAorCTIwNTE5LAorCTE4MTU2LAorCTc1NjQwMCwKKwkyNzczNiwKKwk0NTg3MDYsCisJMSwKKwkzMjg2LAorCTkyOTYyNCwKKwkxODgzLAorCTIsCisJMTA4NiwKKwk0Mzk1MDEsCisJNTUyLAorCTE1NzEzMiwKKwk1NTY1LAorCTEwNTA2MSwKKwk4MTk5LAorCTIzLAorCTE3ODc5NywKKwkwLAorCTEzMDY0NCwKKwkxLAorCTY5NTIsCisJNzU0LAorCTUwMCwKKwk2NDc2ODMsCisJMCwKKwk5NTkwNzksCisJNjIyNTYxLAorCTExMzEsCisJNTU5NzgzLAorCTY4NjIsCisJMTc1NDIwLAorCTQwODY3MSwKKwk0NjM0NjEsCisJNTU5MDgsCisJNjA2NDk2LAorCTE2OSwKKwk0OTA2MCwKKwkyNDcsCisJOTUzLAorCTMzMzAzMCwKKwkwLAorCTIzMzk5LAorCTI5MTkzLAorCTkzMDMsCisJMTUsCisJNTE1NDAyLAorCTM0OTYxLAorCTM2NTg1NiwKKwk2MzMwNDMsCisJMTczLAorCTU1NjA4OSwKKwkxODA5LAorCTEyMjE1LAorCTE0LAorCTMxNiwKKwkyMDY0MiwKKwk5LAorCTE1LAorCTE5MDM5MSwKKwk5NTE0NjMsCisJMjUwNTksCisJMTM2NTQsCisJMzg1MDQwLAorCTQyNzIsCisJOTI5MDMzLAorCTIwODgxMywKKwkzNTE2NiwKKwk0Mjg0OSwKKwk2NjI2NDgsCisJMjU0ODExLAorCTQyMzAsCisJODEyNDU5LAorCTY4MSwKKwkzOTAxNjgsCisJNTM4MSwKKwk0NjYyLAorCTE3MzI1NywKKwk0Nzg4NjMsCisJMTAzLAorCTg5MzMyLAorCTAsCisJMCwKKwk1ODk0ODQsCisJMTkzNjksCisJOTQsCisJOSwKKwk2Mzk5MTcsCisJMTExMCwKKwkzOTMsCisJMTAxMDQwLAorCTkxMSwKKwkxNTI4OTksCisJMCwKKwkyLAorCTAsCisJMCwKKwkzMzU2OTEsCisJNDM2OTQsCisJNjIyNzMsCisJMjAwMTIxLAorCTIyNTAsCisJNjIxMDA0LAorCTE0OTkxOCwKKwk0MTA2MywKKwkyMTgyMjksCisJMCwKKwk0OTc5MjQsCisJMTY4MzIsCisJNTg3MDcxLAorCTAsCisJMCwKKwk3Mjk5MTgsCisJMiwKKwk4MDg1MTMsCisJOTQxNywKKwk3MTgsCisJMCwKKwkyNzY5LAorCTI4NzA0LAorCTEzMzUsCisJNzM0NzI2LAorCTIxOTE1NywKKwk3ODYyMzAsCisJOTgxMDA0LAorCTM1MDc4OCwKKwk4ODQ1MjksCisJMCwKKwk4Nzg3MiwKKwkzNDY0NywKKwk4NTQ2OSwKKwk0NTI0LAorCTMzOTgzOCwKKwkzODIyOCwKKwkwLAorCTQxNTEsCisJMTE0NSwKKwkwLAorCTM1MSwKKwkxNjc5NTYsCisJODEwMDc1LAorCTY4OSwKKwkyNTEyMTIsCisJNTgzMDY4LAorCTI5MjksCisJMTg5NDU2LAorCTIwODksCisJNDg3NDksCisJMjc4OTUyLAorCTc3MTM0LAorCTAsCisJMCwKKwk0NTU5NSwKKwkyODE4MjksCisJOTY5NjAyLAorCTQzOTk5LAorCTY5ODI0LAorCTg1Njk4MiwKKwk2MTczMiwKKwkzMzYsCisJMjU0ODgsCisJMjEzLAorCTQ2NjgzLAorCTE5MDksCisJMTc0MDk3LAorCTU3OTMwLAorCTkxNDY2LAorCTgyODQxOCwKKwk5NTc0MCwKKwkzNzg4MjgsCisJMTI4MDY1LAorCTY4MDY4LAorCTAsCisJMTMzMTIsCisJMjYwMDYsCisJNjc2MCwKKwk1MSwKKwkyNzYwODEsCisJNjQwMDY4LAorCTYzNDk4NSwKKwk3MTMxLAorCTc4NDg4MiwKKwk3OTAxMjYsCisJNjI4NTg1LAorCTIwNTgyNCwKKwk3NjQ5NjUsCisJMTc3OTMsCisJMzE1OSwKKwk2NDk5MjQsCisJMCwKKwkzNzM4MywKKwk5OTE5LAorCTM1MywKKwkwLAorCTE0OTAwMywKKwk2MjA2MjksCisJOTU5MjgsCisJMjU2MCwKKwk1MDQzNDMsCisJMTAwMCwKKwkzMiwKKwk0MzgzNiwKKwk0MDcwMzEsCisJMjA3LAorCTgwMDg5NCwKKwkzMjIyLAorCTUxMDI4LAorCTcsCisJNiwKKwkyMjAxMCwKKwkwLAorCTIxMTc0LAorCTEyODkzLAorCTgyNDkzMiwKKwk3MzA1LAorCTcwLAorCTYyNDI1OCwKKwkzNzIxMzksCisJMjE1MDQsCisJMzg3OTk2LAorCTQxODkzMSwKKwk5MTQyNjgsCisJNTc2LAorCTAsCisJMCwKKwk2MTgyMjQsCisJNzg3NTE2LAorCTEzMzAxNCwKKwk0MjIsCisJMzgzMTI0LAorCTY1NjMxOCwKKwk0NDIwLAorCTYwODIsCisJMjQ0ODEzLAorCTM4NTg1LAorCTMyMDAsCisJMSwKKwkyLAorCTExODgyLAorCTExMywKKwk0NTU4MSwKKwkxMzEyMSwKKwk5NTQ3NSwKKwk4MDcyMTksCisJODE5NSwKKwk5OTUxMTYsCisJMTMsCisJMjE0NiwKKwkzNjk5MjUsCisJNjAxMDMsCisJMjUsCisJMTI1MTY1LAorCTUxMzAwLAorCTQ4OTQsCisJMTczMjYxLAorCTc0MTg2LAorCTEwNDQsCisJMTIyOTkyLAorCTEyNDMsCisJMjE3MDMsCisJMjYyOTQsCisJMTk3LAorCTMzMzgyNSwKKwk0MjY4NzIsCisJNzE5NTgwLAorCTM1OTgsCisJMTA2LAorCTAsCisJOTkzMiwKKwk2MTUwOSwKKwkxNDYsCisJNzIxNDI4LAorCTk2NDc4MSwKKwkzMTk4NTAsCisJNTczODAyLAorCTc0NTgsCisJMzE3ODg5LAorCTAsCisJMTMzMDg2LAorCTg3ODM2LAorCTYwNDk2LAorCTMwNDI0OSwKKwkxNTY1LAorCTI3LAorCTQyLAorCTg5OTMyNCwKKwkxODk2MzcsCisJODY0OCwKKwkxMDQ1NzAsCisJOTAxNTk4LAorCTQ0Nzc2NSwKKwkyNCwKKwkxMDgsCisJMTIwMTI3LAorCTgyODYyNiwKKwk4LAorCTg5OTUxNCwKKwkyOCwKKwkxMywKKwk3NTc2LAorCTE2MzM5MCwKKwkxNjI1LAorCTMwMjMsCisJMTU1MTc1LAorCTIsCisJMzkxLAorCTEsCisJNDkzMDczLAorCTM5OCwKKwkyMTA3NzEsCisJMjYyNjYsCisJMjg3OTk5LAorCTM4MjU1LAorCTI0OTY2NiwKKwk1OTgyMDIsCisJMTE5NjAxLAorCTIxNjkzMywKKwk5MTIwNSwKKwkwLAorCTcyNDcsCisJNzcwNzcsCisJNTY1MzgzLAorCTI5MTAyLAorCTI1MzY0MSwKKwk0ODg1NSwKKwkxOTcyMiwKKwk0NjM1MzYsCisJNDAxODIsCisJNjUzOTMsCisJODI5NDQ0LAorCTU5ODQwMiwKKwkxNTkwLAorCTc5OCwKKwk0NjcsCisJODM0ODQ3LAorCTMwMDcsCisJMTM3MTEsCisJMCwKKwkxOTUsCisJMTAxNjYyLAorCTI1NTc0OSwKKwkxMjkyMDEsCisJMTE5NjUsCisJMTc4MSwKKwkxMzM0OSwKKwkzMTAwLAorCTcxODA2NiwKKwk5OSwKKwk3MTI0NTAsCisJODg4MjE1LAorCTQyNTAzLAorCTQzMTcxLAorCTQ5NDk0NiwKKwkwLAorCTIxNzUsCisJMTIzODcsCisJMjU2NjIsCisJNzgsCisJNzM5MDMwLAorCTAsCisJMTksCisJNDI3NTI2LAorCTQyNzUsCisJNTU4MywKKwkwLAorCTI0NDcsCisJMTMyMzk4LAorCTI2NDM3LAorCTM4NzMsCisJNDQwMDM1LAorCTIxLAorCTYsCisJMzU0MzIsCisJNDE1MjMsCisJNzE3OSwKKwk3MTI3MDMsCisJNDI4ODY4LAorCTI3OTMsCisJNiwKKwkyODYyNzcsCisJMTg4MiwKKwk5NTExNiwKKwkyOTU5LAorCTg2LAorCTExNTQyNSwKKwk4MTM4NiwKKwk1OTgzNiwKKwkzNywKKwkyNDc1OTgsCisJMzQ3MzIsCisJMjQ5LAorCTUwMDExMCwKKwk1NTg5LAorCTQwMzE5LAorCTU3NSwKKwkxMjE0NSwKKwkzODU4MjksCisJNTY1NjAwLAorCTU4MjE1MCwKKwk5MiwKKwkyMjMyMDksCisJMCwKKwk5MTAsCisJMTA0OCwKKwk0NzMyOSwKKwk5MDk0NCwKKwkyMzUsCisJODczOSwKKwk2ODY2ODUsCisJMTc1MywKKwkxMjYsCisJNDM0LAorCTYwOTQ3NywKKwkyNTAyMSwKKwk2NjEwLAorCTUyNjc1LAorCTQsCisJNzE3ODQ2LAorCTE1MDg2NCwKKwk0MTg1ODMsCisJMTc3NTEsCisJNTEzNzk0LAorCTE4MTM2MiwKKwkzMjk1NTYsCisJMTA0MjYsCisJNzE3MDE5LAorCTQ1NywKKwk2MTYsCisJMzg4OTg0LAorCTE3LAorCTgzMzgsCisJNTk1MzEsCisJMzIsCisJOTk1NjUsCisJMzc2MTQ2LAorCTEzNDU3OCwKKwk5NjYsCisJMCwKKwkwLAorCTE3NCwKKwkyMTA1LAorCTU1NSwKKwk4OTkwLAorCTI5OCwKKwkxNjk5MzIsCisJMjQ3MjgxLAorCTI0MDkxOCwKKwkyOTg2NTUsCisJMTU4NzQzLAorCTE1OTk0LAorCTk1NzA4LAorCTUxLAorCTI5ODUsCisJNDI5NCwKKwk3MzE5MzQsCisJMTg1NjQwLAorCTE0ODMsCisJODcsCisJNzQyMDMzLAorCTksCisJMTM0NSwKKwkzNjgwLAorCTEzMzUzMCwKKwk5MzU1LAorCTgwMDExMSwKKwkyODUwOCwKKwkwLAorCTM2OSwKKwkzMTY4MSwKKwkyNCwKKwk4MjM3LAorCTMxMzM4MCwKKwk0NzMyLAorCTI3NTQyMywKKwk5NTE1OTIsCisJMCwKKwk0MTM4MSwKKwkyMjU1MTUsCisJMzkzMDA0LAorCTUyNiwKKwkxODcsCisJMTk1MTUsCisJNjAwNiwKKwkyODkyMywKKwkzMTAxNTEsCisJMjM5MCwKKwkzNzQsCisJMCwKKwkxOTE0MiwKKwk3MiwKKwkxMTQsCisJMTkzMzA1LAorCTI0MDM1LAorCTM5NzA2NywKKwkxOCwKKwkxNDgzOSwKKwkzNDczLAorCTE2NCwKKwkxMDQ2MjIsCisJMzc4OTU4LAorCTIyMTgsCisJMCwKKwk4OTA1MywKKwkxMDUxODMsCisJMzEyMjY1LAorCTgyMTQ2LAorCTE0NzIxMCwKKwkzNDE5LAorCTUxNzgsCisJMzQ5NDgsCisJNDY4MzYsCisJNDEzMTksCisJODQyODI1LAorCTU5NTk3MiwKKwkwLAorCTI0OTYyNSwKKwkzMjUsCisJNjA4LAorCTM3MjMyOCwKKwkxMTk2MzQsCisJNzUwNCwKKwk5MjAyMTQsCisJNzMwMiwKKwk0NDQ1MzIsCisJMzU5MjEzLAorCTI3MjY1LAorCTE3NTUsCisJNDgsCisJMTI2Nzk5LAorCTY1MTI3MCwKKwk4MTgyMjAsCisJNzk5NDkzLAorCTcyNDAyNCwKKwk2NDA0NywKKwk3MzY5OSwKKwkyMDY5OTksCisJMjA5LAorCTE1ODEsCisJMCwKKwk0MjkzNywKKwkzMDExNDQsCisJNzM0MTYsCisJMCwKKwkyNDIwNTgsCisJMjk2NjAsCisJMywKKwkzNDcwOSwKKwkxNjI3MTksCisJMjg2MywKKwkzOTkyLAorCTUyMTIsCisJMTUxODE0LAorCTMwOTIsCisJMTk4MDAxLAorCTQ0MzMxLAorCTM2LAorCTQwNywKKwkzNjQ3NzEsCisJMTM0OSwKKwk1MDI3NzIsCisJMjE0NzI2LAorCTYwNywKKwkzODg1ODMsCisJMTM3NjYwLAorCTMzNzEyNCwKKwkxMzI3OSwKKwkxMDU0OSwKKwk5NDMwNzUsCisJMTY0MDY4LAorCTE5MTU3LAorCTM4NDQzLAorCTI2MzUxLAorCTAsCisJNjcxNjcsCisJNzM1LAorCTQ2NDg2LAorCTEzMDMwNSwKKwkyMzIzMzAsCisJNzQ0LAorCTg4MjMzNywKKwkyLAorCTY5Mjc1LAorCTEyNjM1NCwKKwk5MzcwLAorCTI4NDUsCisJMjk5LAorCTM4OTg4LAorCTM3ODM0LAorCTAsCisJMzA2NDMzLAorCTkxMzksCisJMjM3MTMyLAorCTAsCisJNTAwLAorCTEzNDYyLAorCTM3MzY4NCwKKwkxMDc0NTMsCisJMzgxOTI0LAorCTM0NzkxNSwKKwk0MzI5LAorCTE2NjgsCisJMzk2MCwKKwkzNzA2NjEsCisJMzYxNCwKKwk2MzYwNDgsCisJMCwKKwk0ODc0NDksCisJNjQ5MjUsCisJMzMzODk0LAorCTExLAorCTUyMTkyLAorCTUzMTIwMCwKKwkxNTU1NTQsCisJNDYxLAorCTE1NDcsCisJOTk0MzYxLAorCTExOTU1LAorCTMyMTA1NiwKKwkzNzQyNSwKKwkxNDI0OSwKKwk2OTE1MSwKKwk2MjE4NjIsCisJMTc0LAorCTc5NjA3LAorCTM0LAorCTc3NTc3LAorCTEzNzIzLAorCTI2NzU1MCwKKwkxMzgwMSwKKwk2OTgsCisJMTIsCisJMTcxNTU2LAorCTU3MzU0LAorCTY3Njg0NSwKKwkwLAorCTI0OTY1LAorCTkwODk1NSwKKwk1NzA0ODMsCisJMCwKKwkyOTYzODcsCisJOTgzOTY2LAorCTg1MDEyLAorCTEzMDI5OCwKKwkxNTE5NDYsCisJMzg0NDc0LAorCTczMTQ1NSwKKwkxNTA2OTksCisJNzcyLAorCTIxNjEzMSwKKwkzNDYsCisJMTMwOTM1LAorCTM0NzIsCisJMTgsCisJNDI2MDQ1LAorCTY3NzI2MiwKKwk4MDgsCisJMTcwMzAsCisJNTE4OCwKKwkwLAorCTQ5MTE1MywKKwk2NzI5OSwKKwkxOSwKKwk2MDM0MiwKKwk2OSwKKwkwLAorCTc2NDc4LAorCTk1NzYzLAorCTAsCisJMjg3NzgsCisJMTQ3ODY5LAorCTMzNTkyNywKKwkyNzg0NiwKKwkyMTYzLAorCTIyNzUwLAorCTE2MiwKKwkyMywKKwkxMTM5MSwKKwk0NjkwOTksCisJNTg1MiwKKwk2MywKKwkwLAorCTAsCisJMjIxOTMsCisJMTY1LAorCTQ4OTAwNywKKwk5MjQ5LAorCTEyNDc3LAorCTI4NDEsCisJMjIzNTMyLAorCTEzODc3LAorCTE3MywKKwkzNTcwLAorCTQ1NDc3LAorCTIzMzA3MywKKwkyMzI5NiwKKwk2NDM3NywKKwk0OTEwLAorCTgsCisJNzYyNDYsCisJNDExMTQ3LAorCTI4NzQxMSwKKwkxMDQ1MCwKKwkzNjY3LAorCTEsCisJNTAwOTMzLAorCTMxMzYzLAorCTI1NywKKwkxNzA1LAorCTYwMzYsCisJNDk5MzQsCisJMTM3MzgsCisJMTM0ODUsCisJNjE2MDgsCisJNTYxOTc4LAorCTc2NDkzLAorCTE2Mzc3LAorCTE4MTcsCisJMCwKKwkyMzU2MDAsCisJMCwKKwkxNjM0NywKKwk2ODA0NzgsCisJNTExNSwKKwk4OTU2MDcsCisJMTM4MjcwLAorCTM2OTkxMiwKKwk1MzExMCwKKwkwLAorCTY0NzA4MywKKwk4NSwKKwk0NTg2ODEsCisJMTYzMjI3LAorCTUyNzY3LAorCTE5NiwKKwkyNjc3MTksCisJMTQwNDcsCisJMTQ3MjkzLAorCTgxNDQ1NywKKwkxNzQ4OTYsCisJMCwKKwkzNDEzOCwKKwkzNiwKKwkyMTU3NSwKKwkzLAorCTAsCisJMCwKKwkzODM5MSwKKwkyNTk3LAorCTIsCisJMTQzMywKKwkzODA3LAorCTM2NDc2LAorCTI4NywKKwkxNDE1MzAsCisJMjkzODksCisJNDk1NjU1LAorCTMwMDE0LAorCTAsCisJNTUwNzY2LAorCTExOTU4LAorCTM0OCwKKwkyMjY3NjAsCisJMTUsCisJMjUxMzUzLAorCTY3NTc4OCwKKwk1MTgzMDgsCisJMjE1LAorCTgxOTg3LAorCTQwOTg2MiwKKwk1NTk1OTYsCisJMTE0MjgzLAorCTQ5MjUsCisJMCwKKwkxNywKKwkxNDIyMSwKKwkwLAorCTE2MiwKKwk3NjYzNzAsCisJNDg5OCwKKwk5OTgsCisJNDkzLAorCTEzODQxOCwKKwkyNjUxNTksCisJMTIxNTIsCisJNTIyOSwKKwkxMjA0LAorCTE4MTQsCisJNDMyNTMwLAorCTI4ODksCisJMTQ0LAorCTExNDksCisJMzU4ODYsCisJNjM2OTMxLAorCTY2NDAsCisJMTUwOCwKKwk0MTQxMTgsCisJODU4LAorCTIwMDM5LAorCTE3Mzk4LAorCTMsCisJNTA5NCwKKwk2LAorCTEzOTk2LAorCTY3NTQsCisJMzYyLAorCTQ1MTQ4NywKKwkxMTQ3MSwKKwk3ODk2LAorCTMzMDAwOSwKKwkyNDQyNjksCisJOTk5MjgsCisJMCwKKwkxNDMxMSwKKwk5OTQ5LAorCTE1MjUxLAorCTI4MzkyMywKKwkxMjM3NTQsCisJMTg4MzYwLAorCTkzOTAyLAorCTg1NDM4NCwKKwk1NDgwMDEsCisJNTMxNzg4LAorCTI2Mjk4LAorCTMyODQ3OSwKKwk5NDEsCisJMjQ2NTM1LAorCTEwNjMyMCwKKwkyODc2OSwKKwk0NDAsCisJNCwKKwk2MTI2MiwKKwk1NTYxNSwKKwkxNzAsCisJOTg5MzI3LAorCTY5MjUzNCwKKwk4MDYzLAorCTQ0NTg0MiwKKwk0NDM0LAorCTI1NTM0OSwKKwkxMTc3ODEsCisJNiwKKwk5MjQ5LAorCTEzNjIxNiwKKwkzODE2NSwKKwkzMDcwMTIsCisJMTIsCisJMjM0MSwKKwkxODA2MiwKKwkzNzE4ODIsCisJNjYyMTU0LAorCTEyNjIzLAorCTE3Njg0NywKKwkzMzIyMjAsCisJNTkwOTM1LAorCTMzNjgyLAorCTAsCisJMTIxMzc0LAorCTY3LAorCTQ2ODQxLAorCTQ5NTg5MCwKKwk2NDAsCisJMTksCisJMTQ3MzcsCisJMTEwMzIsCisJMTcsCisJNTk5MywKKwkzMDI1NjIsCisJODI3NzEwLAorCTE2NTM0NiwKKwk0OTYwNywKKwk4Nzg2MywKKwkzMDg1MTMsCisJNzM1MzAwLAorCTE5MTQsCisJMjkwMCwKKwkyMDczMDgsCisJOTA2OCwKKwk4MzQ5NCwKKwkxNzksCisJNDE3LAorCTQxNjA1LAorCTc0NjgxLAorCTY1MjE3MSwKKwk0MDEzLAorCTI5ODExLAorCTEzOTY2LAorCTgxMzYsCisJNzgsCisJNjExODIsCisJNjc0MTg3LAorCTAsCisJMzMxMTIxLAorCTAsCisJMTg1NTksCisJMzg2LAorCTc3LAorCTM0ODQzOSwKKwk5NzUzNTgsCisJMTgsCisJMzM3MDAsCisJNDczOTYsCisJMjA0NzUxLAorCTIzNTAsCisJMjY1MDMsCisJMCwKKwk4MzY1MywKKwk0NDYsCisJMTA4NDQsCisJNDg1LAorCTkyNDEsCisJODgzNDcsCisJMjMyNDE5LAorCTkzNjkwMCwKKwk0MzI1MCwKKwkyLAorCTI2MTEyLAorCTgxMTk1NSwKKwkyMDcyMywKKwkxMDIwNjksCisJNDIyNTUsCisJODQzMSwKKwkxMTk1MDgsCisJNDA4MCwKKwkxMzU2NSwKKwkxMiwKKwk0NjExMCwKKwk2MjA5NiwKKwk2Mzg3NzcsCisJNDQwMjUsCisJMTUyOTg1LAorCTEzMzYyLAorCTMsCisJMTIzMzEsCisJMTkzMzM3LAorCTU2NDE5LAorCTE0NTkzLAorCTM4MzcsCisJMjgyMzE0LAorCTQwMzQ1NCwKKwk0ODU4OSwKKwkxMzUsCisJMTgzNTAsCisJMjE2MCwKKwk5MCwKKwk5MTgyMTYsCisJNzA4MywKKwkxMDU1MzQsCisJNzQyODI2LAorCTM5OTAyOCwKKwkxNDcwLAorCTIzNzcwLAorCTQ4MCwKKwk2Nzc4ODQsCisJMzQwNDcyLAorCTEwNzQwNiwKKwkwLAorCTUwMDIsCisJNDQ1LAorCTc0ODk0OCwKKwk1MzQwMTIsCisJNTkyNDY0LAorCTY1MzksCisJODE5NjMyLAorCTMxMzgsCisJNCwKKwkzOTM5NywKKwkyMjk2ODMsCisJMTIyMDQsCisJMjQzOSwKKwk2NTEzMSwKKwk4MTcyMjYsCisJMjI1OTYsCisJMCwKKwkxMDQ2LAorCTk0NjM4LAorCTAsCisJOTU0MDMsCisJMTIzMCwKKwk3OTAwNTYsCisJMTk5NzYsCisJNDMwODUsCisJMTQyNTEsCisJMTM5MTg3LAorCTIwMjMyLAorCTY5MywKKwkzMDU4LAorCTI3NjU0LAorCTY1NjkwLAorCTQwOTQ4LAorCTE1MDAxLAorCTIxMDg5LAorCTE0NDI1LAorCTMyMjQ1OSwKKwkxMzU3MSwKKwkyMjgxNTQsCisJNTM2ODE0LAorCTc2MTIyMSwKKwkyODAzMCwKKwkyMzIyLAorCTkyMSwKKwkxLAorCTExMzcsCisJMTg3ODE1LAorCTgsCisJMzQ5MTEsCisJNDUyNywKKwkxNSwKKwk0NiwKKwk3ODgwMSwKKwkwLAorCTczNjA1LAorCTQ0LAorCTI4MjMzLAorCTEzNzAsCisJNzM0MDksCisJMTk4MTU5LAorCTY2NTg2LAorCTMsCisJMjU3NiwKKwkxNSwKKwkzNTQ2MCwKKwkyNjMyMzcsCisJNDQ5OTcsCisJMjg3MywKKwkyNDAsCisJMTc4MSwKKwkyNjksCisJNDYsCisJMjcyNzc4LAorCTI4NDA0LAorCTgyMzIsCisJNDE3MDczLAorCTIzNDU5MSwKKwk5LAorCTcyMDM0OSwKKwkxMTc2LAorCTE2MTk1LAorCTAsCisJOTcwNSwKKwkwLAorCTE0LAorCTk0NzA0OCwKKwkxNjMsCisJNzYyODgsCisJMTExNSwKKwkyNjcwMjAsCisJMzQxNiwKKwk0MTQyMTcsCisJNDQxMDA0LAorCTk1MTMxLAorCTc2NTAwMiwKKwk2MTk2LAorCTkwNjksCisJMjcwMTcsCisJMTM3MDM5LAorCTY1MjQ3LAorCTI2NjQ4OSwKKwk0ODQ5NDUsCisJMTg3MDA4LAorCTQ1NDA1LAorCTU3MDAsCisJOSwKKwk3NzUxLAorCTEyLAorCTI5NCwKKwkzMDkzLAorCTYzNTAsCisJMTAzMzAzLAorCTYwNDUsCisJMjUyMzQ1LAorCTE0MDIwNywKKwkyMjM5MCwKKwkyMzQ4NjcsCisJNDQzMzI2LAorCTEsCisJMCwKKwk4OTk3MiwKKwk4NjM3LAorCTQyNzE1MCwKKwkyMjE0NiwKKwkwLAorCTMxMDQzMiwKKwkzOTAzMzMsCisJMTA0NjEsCisJMTYzMiwKKwkzMTQwMywKKwk5MDg2NTMsCisJMCwKKwk2NTQzLAorCTE2MzQ3OSwKKwk2NzYwOCwKKwkxOTU1NDMsCisJMzE1ODg5LAorCTgyMjk2NCwKKwkzODM1MzYsCisJOTU0OTU0LAorCTE2MTksCisJMjQxLAorCTk2MDUzLAorCTEwNDU1NiwKKwk3NjczMDIsCisJMjQ2OSwKKwkxMiwKKwkxNjQzMzAsCisJNzgsCisJMTQxLAorCTE3MDUxOSwKKwkyNjgyMTQsCisJNTMzMzgsCisJNDgzNDIsCisJNzIxLAorCTU4OTgwLAorCTQzNDUsCisJMSwKKwk4NTYyNjUsCisJODcyODksCisJNTcyMTksCisJNzc1Njc5LAorCTEyMzk5MiwKKwk2OTU4MDQsCisJMTEzMDI1LAorCTgzMiwKKwkxMTc0MjAsCisJMTY2MzQsCisJMzUyLAorCTI0NzI5LAorCTE0OTczLAorCTI1NjIyLAorCTEzMTI5MCwKKwkwLAorCTIyLAorCTg3NzQwLAorCTU5MTcsCisJNTMzLAorCTI5MzQsCisJMzQyNjEsCisJOTE3NCwKKwkwLAorCTE2NTYsCisJNzY0NTg3LAorCTU0NjUyLAorCTM1NTk3LAorCTM2Mzg5LAorCTU3Nzg4OSwKKwk2Mzk1NywKKwkyNjgwOCwKKwkzNDU1NiwKKwk1NiwKKwkxNTY0MSwKKwkxMzcsCisJMSwKKwkzLAorCTExNzI0LAorCTE5NzM5NywKKwkzOTAyNywKKwk4NzkwMiwKKwkzMjAsCisJNzkxNDc5LAorCTcsCisJNDg3ODY0LAorCTAsCisJNDMzLAorCTI1NzMzLAorCTY5NTYsCisJMTU0MDcsCisJMzEyNTU3LAorCTUyNjMwMiwKKwkzODMwMTksCisJMzQwMjE1LAorCTk2LAorCTI3NjE1OCwKKwk2NDkzLAorCTEzNTYxMywKKwkyMDAwLAorCTEyMTgsCisJOTMwLAorCTI3NjgwOCwKKwkyNzMyNDksCisJODg5NiwKKwkzOTcsCisJNzM1MDk1LAorCTIwNjQ4LAorCTIwNzksCisJNTM0OSwKKwkyMDUsCisJMzU2MzEzLAorCTg0MTk1NCwKKwk4MjU1LAorCTI2Njg3NCwKKwkwLAorCTk2NSwKKwkyODc5OTMsCisJMTU0OSwKKwkyMDc4MzMsCisJNzUsCisJMTc4MTgwLAorCTM5MDcyLAorCTAsCisJNDMyNTQsCisJMzg0NywKKwkyMjcsCisJMjcxMiwKKwkxNjEwNDMsCisJNDYzMjY0LAorCTc0NzIwLAorCTc5NTc4OSwKKwkxMiwKKwk2ODEyLAorCTIwMjgwNCwKKwkyOTM3OSwKKwk2NDI0MSwKKwkxMzIxMjEsCisJNzkwNjIyLAorCTQ5MzU4OCwKKwkwLAorCTQ4LAorCTE0NzM1MiwKKwk5MjUxOTcsCisJMzgxNDksCisJMTgzODAsCisJMCwKKwkyNzAyODAsCisJNjMzLAorCTMzNzMsCisJMzEyOTQsCisJNzgzMCwKKwkwLAorCTAsCisJMTEzNzEsCisJNTYxNDMsCisJNTM5MywKKwk3NDcyNCwKKwk0OTUxMDksCisJMCwKKwkxODk5MywKKwkyMTUyNCwKKwkwLAorCTUzODg5LAorCTQwMDUwOSwKKwkyMDQ1NjMsCisJMCwKKwkxMTYyNSwKKwk5NjM1LAorCTAsCisJMTY3OCwKKwkxMjA5NiwKKwk1OSwKKwk4MTcxMTIsCisJMTAwMDIsCisJMTI4MjA5LAorCTExNTkzLAorCTE3MzEzLAorCTE1MjAwLAorCTEwNjc5NiwKKwkyNjE0MDEsCisJNzA3MDc3LAorCTAsCisJMzE0MDMwLAorCTc5ODU5MSwKKwkxNDE3NSwKKwk1NjY4LAorCTI3NjYsCisJMCwKKwk1NjYsCisJNTU0MywKKwkyNDExMiwKKwkxNTQ0ODIsCisJNTY0MiwKKwkwLAorCTM4NDEwLAorCTMsCisJNCwKKwk3MDA3MjQsCisJMjUwMjQsCisJNSwKKwk0MDcsCisJNTY0MTUwLAorCTY3MiwKKwkxNDMsCisJMjA0OSwKKwk1NzQ3MDgsCisJNjU4NTgsCisJMjEzNDEyLAorCTM3OTcsCisJNTExLAorCTMwOTA3LAorCTEyMTIsCisJNzY1LAorCTIxMjcsCisJNDgxLAorCTEzMDA0OCwKKwkxMTM4MTYsCisJMzk4NjEsCisJMTUzMTY5LAorCTUwMzM3OCwKKwk1MjM5NDQsCisJMTExLAorCTU1MDgzLAorCTY5OCwKKwkyNzUsCisJMywKKwkzMTk1LAorCTE2NTcsCisJMCwKKwkzMTc4ODEsCisJNjY3MiwKKwk1NDMsCisJMTUzMDExLAorCTc3MjQwLAorCTkzMzgsCisJODg5ODUwLAorCTI5NTE4LAorCTg3MjQ4NSwKKwkxODE5MjcsCisJMzc2MDg2LAorCTI2NiwKKwk0MDksCisJNCwKKwkxNDg1NiwKKwkzMTk0MywKKwkyNDQ4LAorCTgsCisJNzUsCisJMzgzMDk3LAorCTI5NDM2NiwKKwkwLAorCTE3MzA4NCwKKwk3NTMxNjAsCisJNjY0NTcsCisJNzI1NzgzLAorCTUxLAorCTEyNzY1MSwKKwkxMDczLAorCTEyNTk4LAorCTE0MDA4MCwKKwkwLAorCTI5NjM3NSwKKwk1ODE3MjAsCisJMjE3MzQ2LAorCTgyNzIsCisJMjA1MSwKKwkxODUzOTAsCisJNTIwNjQ1LAorCTEyNjAsCisJMTM4NzMsCisJMTY4MDQwLAorCTE5NjkwLAorCTEwMzM0NywKKwkyOTUwMTEsCisJNTQ4NDA0LAorCTQ4LAorCTQsCisJOTE2NDE3LAorCTE5NDgsCisJNjIxMzY1LAorCTI2MzI0NSwKKwkyNzkyLAorCTg2ODAzLAorCTE4MTE5MywKKwk1NTgwODEsCisJNTA5MDcsCisJNDQyNzcwLAorCTUxNDQ4LAorCTM0MDI3NiwKKwkxMzQ2LAorCTYwNywKKwk0NTk2MjcsCisJMCwKKwkzMCwKKwk3MzI5OCwKKwkxNTM4OSwKKwkxMjI2NCwKKwkyNzE5LAorCTI5MzYsCisJMTQzMDQzLAorCTIwOTk3MCwKKwkwLAorCTQyLAorCTY2NTcsCisJMzE3NDE5LAorCTAsCisJMzI2MjIsCisJNTI0MDAwLAorCTAsCisJMzEwMzMxLAorCTMwMzc3OCwKKwkyNjg3MTAsCisJOSwKKwkxMDQxMCwKKwkyNTM0MywKKwk5NDk1MDYsCisJNzg0MzUzLAorCTM4NjEsCisJNDY4MjMsCisJMjUxMjkyLAorCTc1MDA4LAorCTI2OTc5OCwKKwk4NzczMSwKKwkxMTI4MTMsCisJNTcxNjc5LAorCTM4NSwKKwkzLAorCTI4MTEsCisJMzYwMjUsCisJOTI0MywKKwk5MzUxMjgsCisJOTA2LAorCTEwNjg4LAorCTI1LAorCTg2NzU3LAorCTMwNywKKwk1NSwKKwkyMiwKKwkyLAorCTYxLAorCTYyMDQyNiwKKwk0ODQ1MzAsCisJNjMzODA2LAorCTAsCisJMTM0MiwKKwk5MjkzLAorCTk5MjE4MSwKKwk1MDMsCisJMTk1NDMzLAorCTQ2MTUwLAorCTg5MzA5MSwKKwkzMjA3LAorCTI4NjUsCisJNzI4OTQsCisJODMwMjk5LAorCTM1NSwKKwkzMjc0NzksCisJMCwKKwkzNTU3MywKKwkzMDY4LAorCTE1Njk5LAorCTMxMTg3LAorCTU1Mzc4LAorCTQxNjA2NywKKwk5MTcyMSwKKwkxNTksCisJMCwKKwkyNTUxMzksCisJMjEwNCwKKwkxOSwKKwk2MDY3NTcsCisJMzIzLAorCTkwMjY1OSwKKwkzNjU2NTUsCisJNDAwLAorCTkwMywKKwk0MDgsCisJMzg1LAorCTIxNzc0LAorCTcwMTI5MCwKKwkyMzQ0MjYsCisJMTcwMjAsCisJOTUwLAorCTAsCisJMCwKKwk0MjksCisJMTI0NSwKKwk0MDU4NzEsCisJMTA5NywKKwkyODA2MzQsCisJNzQsCisJMTU4MjMzLAorCTE1ODMsCisJMTgwMzMzLAorCTQyMTE0LAorCTU3NTk3MywKKwk1MzkzMjcsCisJNTkyNTIsCisJMTIxOTI4LAorCTE2NSwKKwkxNDg1MDEsCisJNTU3NTcsCisJNzQ5NCwKKwkxMjc3MjgsCisJNzgzMiwKKwk2ODUwNCwKKwk2MTk3NzAsCisJNzA5OTUsCisJMzEyODE2LAorCTczMDcsCisJMzgyNjUsCisJNDYyNDgsCisJMzYzMzA0LAorCTI2OTQ0MiwKKwk3NzExMiwKKwk0NDgzMzEsCisJOTEwNDQyLAorCTQ3NDQxOCwKKwkxNTI3NTIsCisJNzUyLAorCTEwNDkxMiwKKwk0MDg0OTIsCisJNjkxNzA5LAorCTYzMjM4MSwKKwk0ODUxOSwKKwkyMDUyNCwKKwkzNDQyOTQsCisJMTQ2NzAsCisJMCwKKwkyMTYwNywKKwk4MTE2MiwKKwkxODE0NTgsCisJMCwKKwk5MDgzMjIsCisJNzI2MSwKKwkxMDg4OCwKKwk1ODA1NCwKKwkxNzg4LAorCTk3MDkzMywKKwk1OTI1LAorCTEyMTU1MywKKwkzNjE1MiwKKwk1ODgyNjcsCisJMjM2MTUsCisJMTg1MCwKKwkzMDcyOCwKKwkzNTk5LAorCTEzMTksCisJNjAyNywKKwkwLAorCTMyMTQxLAorCTk4NDE1NiwKKwk0MzY3ODEsCisJMTUwMDMsCisJNjIxNDA3LAorCTk0MTIsCisJNTYyOTExLAorCTE4OTc0MCwKKwkzNzc4OTUsCisJNjU2ODAwLAorCTE5NywKKwkxNDQxMywKKwk5OTM4MiwKKwkzODQsCisJMTE0ODAsCisJMCwKKwk4NjExOCwKKwk4ODE5NjEsCisJMTkwNSwKKwk4MjA2MSwKKwk0MTQwLAorCTc0MTE1MywKKwkyNiwKKwk2ODcsCisJMTIyNTEsCisJMTA5NDUsCisJMjA5MjY3LAorCTIyMDYwMiwKKwkxMzU4ODEsCisJNiwKKwkyMzc5NDUsCisJMTU4LAorCTUsCisJNzYzMDMsCisJODEzNDQsCisJOTg2MDQyLAorCTk1NjA2MywKKwkzMDI4MiwKKwkxODYwNTUsCisJMzU3ODAyLAorCTEyNDkyLAorCTU3NzQ3NiwKKwk4MzgsCisJMCwKKwkxMSwKKwkxMTc2MDIsCisJMCwKKwkxODc5MjgsCisJOTY4NjAsCisJNDI2OCwKKwkzNDc4LAorCTgxODI2NCwKKwkxNjQ5LAorCTE3MTc1LAorCTI3MiwKKwkxNTg5NTEsCisJNDQwOTg3LAorCTY3NzU5NCwKKwkxNDkzNSwKKwkzNzk1MywKKwkwLAorCTE5OCwKKwkxNjA0MDQsCisJMTIsCisJMjg3ODAzLAorCTIzODYsCisJMTAsCisJMjcxNjYzLAorCTMxOTE1MiwKKwkzNjEzMjIsCisJNjgzNzAsCisJNDI4LAorCTE4MjcwNywKKwkzODc0MjksCisJMTE1MiwKKwkzNjAwNjUsCisJMjUyMTgsCisJMjc5MCwKKwk0MjIyOCwKKwkxMywKKwkxMTA5NDIsCisJNDUyNDkxLAorCTEsCisJNjY1NjM4LAorCTIzMDgsCisJMTE5NiwKKwk4NzMwNiwKKwk2NiwKKwkyMTksCisJMCwKKwkxMzA3MzYsCisJMzM0LAorCTYwNSwKKwk1OTc5LAorCTI2ODEsCisJMCwKKwkxMjM0NjMsCisJMTEyMTksCisJMjgzNjgxLAorCTE5MjY5LAorCTU1MywKKwk2MjE3LAorCTEzMDk2NSwKKwk3MTQ0MDksCisJMjQyLAorCTY3NDgzMywKKwkyMzc1ODEsCisJMTMzMjg0LAorCTY4MywKKwkxNzU4LAorCTI3ODE5MywKKwk1MTg3MjYsCisJNDQsCisJNDIwMzYxLAorCTMyNTIyOCwKKwkxNDk1NSwKKwkxMCwKKwkxMTk5NCwKKwk2NDE1NywKKwkxOTM3LAorCTIwMjE0LAorCTg0OCwKKwkyNzgwNCwKKwkxNTEzNDEsCisJNzkyMzYsCisJMzE2MzkzLAorCTE1ODg4MywKKwkxMTk2LAorCTMzNCwKKwkyMjc5NywKKwkxODU5NTUsCisJMTM4NTcsCisJMzk3MzU3LAorCTc5NDgsCisJNjAzOCwKKwkwLAorCTI2MjEsCisJMTYsCisJMTU1MjY3LAorCTQ0ODA5LAorCTkxNzEsCisJMjEzMjgsCisJMTIyMTIsCisJNDAyMDAsCisJMjYwMCwKKwk0MzksCisJODA0MDE0LAorCTEwOTM4LAorCTk2MTM1LAorCTQzNjk2LAorCTE1ODcxNSwKKwk0LAorCTI4NDU1OCwKKwkxOTEsCisJMjcwMjU0LAorCTc5MjMsCisJODgwNjAzLAorCTIxMDMyLAorCTEwNzcwMCwKKwkxNzIsCisJNzAwODIzLAorCTU2MTMsCisJNzg4MTYsCisJMjU4MjkwLAorCTIxNDM5OCwKKwk4MjE4NTYsCisJMjk1MzI1LAorCTAsCisJMSwKKwkyMzU1OSwKKwk2Mzg5NSwKKwkyMTI0OSwKKwk3MTc0OTAsCisJOTU2OTUyLAorCTk0NDgxOSwKKwk3OTMsCisJMzU2LAorCTc1NzcxNiwKKwkxMTE3NzMsCisJMzk0ODI2LAorCTI1NjY1LAorCTQzNTgsCisJNjQwMjE2LAorCTExNTIsCisJMzcxNzUsCisJMTUwMTkyLAorCTEwNjA3MSwKKwkyODk5MiwKKwk2NywKKwkxNjg1LAorCTEzNDI0MiwKKwkyLAorCTEwMjA0NSwKKwkxNDU3LAorCTQxOTU4OSwKKwk2Nzg5LAorCTY3NywKKwk5NDY3NSwKKwkxMTMwMCwKKwkyNTk1LAorCTgsCisJOTI2NTM1LAorCTI2NTE5NCwKKwkwLAorCTg4NjA0OCwKKwkyNDYyNDIsCisJMTQ5NCwKKwkxOTEsCisJMTY5OTg1LAorCTY0OTc2NSwKKwkwLAorCTIwMSwKKwkxMDY5LAorCTY3OTE2MywKKwkxNjYyNywKKwkyNzQ2MzksCisJODQ0MzgsCisJMywKKwkxMzAxLAorCTI0NzQ5NiwKKwk1ODc5LAorCTcxMDkwNCwKKwk0MDM2NTIsCisJOTU4MjQxLAorCTM2MSwKKwkxMzk3MzIsCisJNjA0MiwKKwkxNTk4NSwKKwkyMzc4LAorCTI2NzAzMSwKKwkyMjM3NjcsCisJOTY1NiwKKwkyNDE3MTcsCisJMzM4NjMsCisJMTQzMTQsCisJMjA1Njk3LAorCTEyNzQsCisJMTY4MDAwLAorCTYyMTc3NywKKwk4Mzc5MTMsCisJODk2NTQsCisJNjU5ODI5LAorCTY5LAorCTUwMzg4NCwKKwk0MzI3MTcsCisJNzA0NDMsCisJMTEwODkxLAorCTE5NjU1LAorCTEzMjQzMiwKKwk2MjA0MDEsCisJNDI4LAorCTAsCisJNDI1NjYyLAorCTAsCisJMCwKKwkwLAorCTE5NDQ4OSwKKwk3NjAxLAorCTI2ODcwLAorCTAsCisJNjMsCisJNTk0LAorCTEyMjc4LAorCTU4MjQ3OSwKKwkyMTM3MjMsCisJNDI0NDg5LAorCTk2NDQ2LAorCTk5MDY2NCwKKwk0Njk2NiwKKwk0NDEzNywKKwk4Mjk4MTAsCisJMTA0LAorCTE5NzA3LAorCTE2LAorCTAsCisJMjQ5OSwKKwkxNjcwNzUsCisJMTQwOTcyLAorCTI0OTI4MywKKwk2NjIwLAorCTY4MzY4LAorCTg1NjQxNCwKKwk5MjU1LAorCTE0MzE1LAorCTAsCisJMTE0MzIsCisJMjQzMjksCisJMjE2NDYzLAorCTI5OTU1NiwKKwk4MTg0MDEsCisJMjQ2NjA3LAorCTY5NzczMywKKwkyMjksCisJMTQ0LAorCTM4OTM5NCwKKwk2NjQ2MzQsCisJMCwKKwkxOTM5MywKKwk2NTc5MDMsCisJNTI5MTIsCisJOTUyMTc3LAorCTUzNjkzMSwKKwkxODcyNzEsCisJMTc2ODcsCisJOTcwMTU1LAorCTIzMjU3MSwKKwkyMzQwMTYsCisJMTU5OTgwLAorCTEzNTEwLAorCTMyOTUyLAorCTAsCisJMCwKKwkyNDEzMiwKKwkxODgwNiwKKwkxNTYyNCwKKwkyODM2NCwKKwk0NzIxMjYsCisJNjI2OTc4LAorCTU5OSwKKwkxMTI4NDMsCisJNTAyOTMzLAorCTkxNTY2MCwKKwk2MzkyMCwKKwkwLAorCTg0LAorCTEwODk5LAorCTkwNDgyMywKKwkxMjYsCisJNDY5MTMyLAorCTU5MDA1MiwKKwkxOTU4MzEsCisJNDQzMTEzLAorCTI5NDE0OSwKKwkxNTk0NCwKKwkyMjcxLAorCTI4Mjk3NCwKKwkyMTEsCisJMCwKKwkyMjkzNCwKKwk4MjI4MywKKwk0OTk3MywKKwk0MTcwNywKKwk4NzUzMCwKKwkwLAorCTkxMDUyOCwKKwkwLAorCTM2MDI5LAorCTQyMzMzNywKKwk4MTc1MTIsCisJMjIzNjcxLAorCTI3ODAwLAorCTM5ODg0NywKKwkxOTg1MjgsCisJMSwKKwk1NjA2NzksCisJNTE4MjcwLAorCTIzMDMzLAorCTUwMTA1OSwKKwkwLAorCTM5MDksCisJMjcyMDYyLAorCTI2MTU4MSwKKwkxODcsCisJNTIwNDMsCisJMzM0LAorCTI0MzU0LAorCTM5NDcsCisJODU0OSwKKwkzNzg2MywKKwkzMjg4NTEsCisJOTYzNzcxLAorCTEsCisJMzkzMCwKKwk4MjQxNiwKKwk2LAorCTI5NDMsCisJMTIyMTAxLAorCTgyNTc3LAorCTg1LAorCTg5NTQwLAorCTUxMzUsCisJMTA5MjM2LAorCTE4Mjk3LAorCTEsCisJMTc3MzcxLAorCTQ1NDEsCisJNzY5NTc3LAorCTE3OCwKKwk0MTcsCisJOTYwNTY2LAorCTMzODAzLAorCTkxMTY1MSwKKwkyNDgxNjAsCisJMTUzNzI1LAorCTQzOTgxLAorCTgwOTE3NCwKKwkxMTYsCisJNDg2OTAwLAorCTQ4NDIsCisJMTQ4NDkwLAorCTEzMTUzNCwKKwk0MzQ3LAorCTIzOTk0OSwKKwk5ODQwOTYsCisJNzQ5NzU2LAorCTQyOTQ5OSwKKwkyNzk0LAorCTc4MjA5LAorCTE4ODEyLAorCTIxMTExLAorCTQ5MCwKKwkzMjgwNDIsCisJMTIsCisJMTMyMTE5LAorCTUwNTEwMywKKwkzNTMxNDgsCisJMCwKKwkzNzM2NTYsCisJOTUxMjQ0LAorCTQ5MSwKKwkzNTU3NzgsCisJMzA2MjAsCisJMzE3LAorCTYwMTc1LAorCTIyMCwKKwkyMTQ0OTYsCisJNDEyNDksCisJNTE2OSwKKwk3ODM2NywKKwk1MDY4MDQsCisJMCwKKwkxMzY4LAorCTQwNywKKwkyOTUxMjYsCisJMTI4OCwKKwk4NiwKKwk5NzYxNCwKKwk2MTY0MCwKKwkyNDQ3MjMsCisJMywKKwkwLAorCTg2OTgyNywKKwk1MjcyNDYsCisJNTIsCisJMTA3MDM2LAorCTI0MDczOSwKKwk3ODAyODEsCisJMTEzMDg0LAorCTYyMDA5LAorCTc0MDM0MywKKwk0ODMyMDEsCisJODY0OSwKKwkxNjQxOSwKKwkxLAorCTgwMTU3NCwKKwk5NTUyNCwKKwkzMjYxMjYsCisJMjY5MTIsCisJODc3MDQwLAorCTEwMjYyLAorCTU4OTUsCisJMCwKKwkxMzI2MzMsCisJNTkxNzEsCisJMzA2MzQ3LAorCTcwMjcwMSwKKwkxOTYyNDUsCisJMTI2NDIsCisJMzI3MjMsCisJMjQ2MDgsCisJMzAyODcsCisJNDU3NzUsCisJMTgyODEsCisJNzU4NywKKwkxNDQ1MzIsCisJNSwKKwkzNSwKKwk5OTg2MiwKKwkyMTUxMjcsCisJMTcwODc1LAorCTYxNDYxLAorCTc3NzkwLAorCTUsCisJMCwKKwkxMjkzNTgsCisJMCwKKwkxMDUwODQsCisJMjEzOTksCisJNDIyMzMsCisJODUzOTcsCisJNDgwNjU0LAorCTU1NTk4OCwKKwk4OTU3NSwKKwk0MjM0NiwKKwkyMDAwNCwKKwkxMTEwMiwKKwkyMTMyMSwKKwkxODUsCisJMzc5MjY3LAorCTg0OTE0NywKKwkxMjE1MTQsCisJMzM4OCwKKwkzMzY2MiwKKwkxMiwKKwkxNjQ4OTgsCisJMjI2LAorCTI3NCwKKwkzODUwMDMsCisJMzY1MDUyLAorCTY5MzM3NiwKKwk0MTI0NSwKKwk5MDEwLAorCTQxNTk0LAorCTg5ODM1LAorCTEwNDkwLAorCTI3MiwKKwkxMjg0MzcsCisJMCwKKwkxMjI2NDgsCisJMjc3LAorCTExNjUwNSwKKwkzODM3MiwKKwk0LAorCTEzNzYsCisJMCwKKwk0NjMxNywKKwkxMzkzNjgsCisJMzYzOTgsCisJMTkzODk5LAorCTMwNjMyLAorCTI2MzcxLAorCTc1NDgsCisJMzY3NjQzLAorCTk1NDg0OSwKKwkyNTg4OSwKKwkzNjU2NywKKwkxNzYsCisJMTQwNjMxLAorCTQ2OTAsCisJOTc1MDMxLAorCTgwOTY1LAorCTUwMDQ3MSwKKwk4NDQyLAorCTQzLAorCTI3NzU4LAorCTMwMTUwMSwKKwkzNzk3LAorCTgwLAorCTM4NDQ0MCwKKwk5Mjg0NzcsCisJNDk2MCwKKwkyNDU2NiwKKwkzMzI0NSwKKwkxNDYzOCwKKwkyMjgzNTQsCisJNTQzNDcsCisJODYxMjg1LAorCTEyODQxLAorCTIsCisJMTU3NDAyLAorCTY0Njc0NywKKwk1Mzc2MywKKwkxLAorCTIxNDczMiwKKwk0OTQ3MSwKKwk0OTc1NywKKwk5OTgsCisJMjAxMTM1LAorCTU2NiwKKwk3MzUxMiwKKwkxOTQyNDAsCisJMzkxNzczLAorCTIxNTEwLAorCTEzLAorCTgyOTg5NCwKKwk3ODMyMDAsCisJNTY1MzI5LAorCTIxMDEsCisJMTIsCisJMTkxMDQzLAorCTE2MjEsCisJMTg0NDMsCisJMjc5LAorCTI5NDEzNSwKKwk1MjY1MDMsCisJNzI5NzM1LAorCTQ2MzksCisJNDQ0MTM4LAorCTU4MzUsCisJMTIzNzIsCisJNDYzNjIsCisJMTU0MywKKwk4NzA5MDcsCisJODMyNjIsCisJMCwKKwkzODMzMSwKKwk5NSwKKwkxMTk0LAorCTkwOSwKKwk4MDUzLAorCTQ1MzA2NiwKKwk4NDU1NjEsCisJNDExLAorCTMyMjksCisJMSwKKwkxNTgsCisJMTQzMSwKKwk4MzUxMzcsCisJMjE3NzQsCisJNzI5OCwKKwkxNDgzODgsCisJMjI0NjQ5LAorCTM3OTMxOCwKKwk1MjAxMzgsCisJMzk3ODEsCisJMTcyMTMwLAorCTM2MjYzNCwKKwk0ODc0OTUsCisJNTE5NTcsCisJMTU4LAorCTE3NzAsCisJNywKKwkxODAxMCwKKwkxMDYzLAorCTE3MTQ4NCwKKwkxOTkyNCwKKwkyNzk4NjcsCisJNDY5OTU2LAorCTE4OTc4NSwKKwkwLAorCTgxNCwKKwk2MDU4MCwKKwk5NDQzNDksCisJMTg3NDMsCisJNTUzMjM1LAorCTAsCisJOTU0NzUsCisJOTksCisJMCwKKwk1LAorCTQyNjIzLAorCTE3ODQxOCwKKwkzOTg5NDAsCisJNTcwMCwKKwk2OTAyMywKKwk1Nzg2LAorCTAsCisJMTA1MzEsCisJNTUxLAorCTg2MzA4LAorCTYzNDUxLAorCTMyNzA0LAorCTE3NjkwMywKKwkwLAorCTI1MTY4OSwKKwkxMTU4OSwKKwkyNTcxMSwKKwk0MzQzNywKKwkxNDMxLAorCTMwNCwKKwk1Mjk2NSwKKwkzNDgxNiwKKwkyNjg2ODgsCisJNDc3NTYsCisJODI1MzIzLAorCTEyMjYwOCwKKwk4MTI0NiwKKwk2OTk3NCwKKwkzNjA1MTUsCisJOTk5NzMsCisJMTQzMDE1LAorCTUwNjMsCisJNDQ5OSwKKwkzNDQ1OSwKKwkxNzE5ODIsCisJNjc3OTQzLAorCTQ4OTA4MiwKKwkyNTc1MTUsCisJMzc2NSwKKwk1LAorCTc0MTYsCisJNjAyMjA2LAorCTc0MTIyLAorCTMsCisJNjg2MjA0LAorCTU0OTMsCisJMjg5MDEsCisJMTEzNDksCisJNTQ5NjY4LAorCTI1NzA4MiwKKwk4MjAwMCwKKwkxNzAzMSwKKwkxNTE3LAorCTc0NDIsCisJOTM3MTYwLAorCTcyMiwKKwkwLAorCTcyOTUyLAorCTM3NzE5MiwKKwk0MzgyNjYsCisJNTU1LAorCTMxNDM2LAorCTI4NCwKKwk1NjM5MCwKKwkwLAorCTU4NTg1NiwKKwkyNzYzNSwKKwk1MTkzNDQsCisJMTI2MTMxLAorCTM2MDI3MywKKwk4NDUwNzMsCisJMCwKKwkxOTE5NjUsCisJNTU2NTIsCisJMjMsCisJMTEyNzczLAorCTYzOTAyNSwKKwk4NDc0OSwKKwkwLAorCTMzMDgyMiwKKwk3MTczLAorCTEyNjIxNywKKwk4NzEsCisJMTEyMTEyLAorCTAsCisJNjY0LAorCTUzMDQ3NCwKKwkxLAorCTM3OTU2NCwKKwkxNzI2MTcsCisJNjQ3MzA4LAorCTAsCisJMzU2LAorCTE3LAorCTg0MzQ1LAorCTQ1NywKKwkwLAorCTgsCisJNiwKKwkxMzY2MDIsCisJNjM0NDI0LAorCTAsCisJMTc3Mjk4LAorCTEwMDcyNiwKKwk5MTY2MSwKKwkzODM3OTIsCisJMTY2NSwKKwk0MzU4MywKKwkxNTc3NSwKKwk0MDgzLAorCTQyNzcsCisJMzQ1NzQ5LAorCTk2OTU5OSwKKwk2NTgwNCwKKwkxOTMyNywKKwkwLAorCTM1MjUxNCwKKwk0MjI1LAorCTksCisJMTAzNzY3LAorCTAsCisJMCwKKwkxNDg0MzYsCisJODUwLAorCTMzLAorCTIxNDYsCisJMjAxNTMsCisJNTAsCisJOTA2MywKKwk1MDMyOSwKKwkzNDgzNzksCisJMjU2OSwKKwk4MzY5NywKKwkzNzA3MywKKwk3MTU0ODYsCisJNjI5LAorCTQ3NTMsCisJNDQyLAorCTI1OTIwMywKKwkyODcyMjMsCisJNDg2MjUsCisJOSwKKwk3MDE4NCwKKwk0NTk0NiwKKwkxNDQ5NDcsCisJMCwKKwk2MDI4NSwKKwkyODY0MCwKKwk3NjI2LAorCTEzNDE1OSwKKwkzMywKKwkxMjQ1MiwKKwkxNTA1NjYsCisJMzQ4MjkzLAorCTEyNDQyNiwKKwkzNTM5NTIsCisJMTEsCisJMjIsCisJNzc2NzQyLAorCTI5MDcyLAorCTEzMjE2OCwKKwkyNTQ1MzMsCisJMzE5OTU3LAorCTE2MDIsCisJMTY1OSwKKwkyMDkzNDEsCisJMzI4NDcsCisJOTIzOTIsCisJNzUzMDA1LAorCTEzOTIsCisJMTAyNzEsCisJMjg1NTcsCisJNjcxNywKKwk5NDE3NDUsCisJMCwKKwkwLAorCTAsCisJNzg2NDUsCisJNDUzMjAsCisJMTExOTMsCisJMTQ0OCwKKwkxMzA2MjYsCisJMzc3OTA3LAorCTc5NTUzNSwKKwkyNDI4NSwKKwkyNjA5NCwKKwkyNjY2OTEsCisJNjQ0NDksCisJNzc0MDAsCisJMTkxNDEwLAorCTEsCisJMTM0NiwKKwkyNTIyNCwKKwk0ODk2MzcsCisJNDcwNTIsCisJMjQ4NTkyLAorCTc2Njg5LAorCTAsCisJNzcyMiwKKwk0NzI4NSwKKwkzMTUyLAorCTI4NTU3NywKKwkwLAorCTE0OTM2NiwKKwkyNjQzNDYsCisJMSwKKwkyMDg2MDIsCisJMzIwNDU5LAorCTEzMTc3MSwKKwkxNDIxLAorCTM1MCwKKwk3MjMyODMsCisJNzE0OTM0LAorCTAsCisJNTY2NDM5LAorCTExNjU2LAorCTM0MTg5LAorCTEyNTQ4NCwKKwk5NDMyNzMsCisJMTUsCisJNzc4OSwKKwkwLAorCTc0MjcsCisJNDY0Mjc4LAorCTY4MDkyNCwKKwk2NTExMDIsCisJODc3OTQsCisJMzk2NDAsCisJODM4NjQ0LAorCTk2NDUwMCwKKwkxLAorCTE3NjUsCisJMjcyNjA0LAorCTEwLAorCTgzNzM0NywKKwk0NDg0NSwKKwkxMzAsCisJMTYzMzU3LAorCTQxNTAsCisJNDAzMzMxLAorCTgzOTEzMiwKKwk0NDg3NiwKKwkyNzI3OTIsCisJNTkyNTI3LAorCTU3MjI1LAorCTEyODgyNiwKKwkyOTE1LAorCTIsCisJMzU3MCwKKwkyNDEwLAorCTE5OSwKKwkxNzEzNTgsCisJNTkzMSwKKwk1MzYyMCwKKwk1NTI5OSwKKwkxODY4LAorCTI0MTIzLAorCTE2NSwKKwkzNDY1MTMsCisJMTY1MjcsCisJMTMzLAorCTUxNzQxMiwKKwkxOTU3MDAsCisJNzMwMzY1LAorCTg5NjIwOSwKKwkxNTI3NjAsCisJMjQ1NzcsCisJNjUsCisJODIxOCwKKwkzNDk2NDIsCisJOTAxMzQ1LAorCTUxMjcsCisJNTEwMiwKKwkyMzgzMTgsCisJOTU1LAorCTYzMTkyMSwKKwkxMjIxOCwKKwk1NTEwMSwKKwk5MzAzODEsCisJMjE5NTAzLAorCTQ2OTIzNywKKwkxMzIsCisJMTY3MDEsCisJNDk0LAorCTE5OTcyOSwKKwkwLAorCTMyMTM5LAorCTMxNCwKKwkxNzIsCisJMjk0NywKKwkxMDY5OTcsCisJNDg3MSwKKwkyMzYsCisJNjE0NiwKKwkxODQzLAorCTEyOCwKKwkwLAorCTI1NDI0MCwKKwkyOTY0LAorCTE0ODI1LAorCTYwNjI0LAorCTIxMDgsCisJMjg2OTUzLAorCTY1NDkzMSwKKwkwLAorCTAsCisJMzk2NTg3LAorCTE5ODUyLAorCTcwMzExLAorCTM2MzU2MSwKKwkyODIsCisJMTc5NjYsCisJOTI0MjU0LAorCTEwNDE3MywKKwkxMzA4MTYsCisJMTc5MDk2LAorCTEwNTQ2NiwKKwkxMzYsCisJNjE4MjYxLAorCTM1ODQzMywKKwkyNTU4NywKKwk0OTM1NywKKwkxMDIsCisJMTMzNzQ2LAorCTYyMDc3NiwKKwkxNzA4NCwKKwk0MDY4ODEsCisJODAyNjc1LAorCTM0OSwKKwk2OSwKKwk4NzYxLAorCTI3ODQ4MiwKKwkxNjMzNiwKKwkxMjgsCisJMTYwMDk2LAorCTI1ODU3LAorCTI4MCwKKwkzOTYzOSwKKwk3MjYyOTksCisJMjkzOTA1LAorCTQ2MjEsCisJNDEsCisJNjQ5LAorCTM2NTUsCisJMjY5Mjg2LAorCTU3ODAyNiwKKwkwLAorCTExMTU2LAorCTEsCisJNzQ0ODU4LAorCTUzMSwKKwk0ODE1NSwKKwkyODQzNSwKKwk3OTkxLAorCTQ0NywKKwkxMDIwMSwKKwkzNzkzNDEsCisJMCwKKwk1NzczLAorCTAsCisJMjk1LAorCTIyODU5MiwKKwkzMzExNTUsCisJMTA0MDg5LAorCTYyODA2OSwKKwkyOTY5MywKKwkyMiwKKwkxMywKKwkwLAorCTAsCisJNTU0MzQ5LAorCTYwODIsCisJMjM4LAorCTIzLAorCTE1MTg3MywKKwk4MDU5MzcsCisJMCwKKwkxOTQwNzYsCisJNjQ1MCwKKwkzLAorCTEyODMyMiwKKwk2OTE0OSwKKwk5NTUxMSwKKwk4NiwKKwk4NDQzNjgsCisJNDE1OTY0LAorCTUxOTg1LAorCTMwODY4NiwKKwk1NTM0MDMsCisJNjI0OTQzLAorCTM2NTgwMCwKKwk0LAorCTEyMDI2MywKKwk5MTIzOSwKKwkxOTUyNDgsCisJNTgwMTAsCisJMTksCisJNDE1MTEyLAorCTEzNjgwNiwKKwk0MiwKKwk1NzE4NDgsCisJNTUzMDYsCisJMjk0NTQsCisJMywKKwkxNDQ5MjYsCisJMTg5LAorCTAsCisJMTYxOTQzLAorCTU5MjE1NSwKKwkxMDkzMCwKKwkyNzkyOTcsCisJNTY5MzIsCisJOTU3NDMwLAorCTEwMjQ0LAorCTE5MDI5NiwKKwk4MDcyMDksCisJNzgxLAorCTE0NjYsCisJMjM1MDU1LAorCTMzLAorCTE5NiwKKwk1ODI4MCwKKwk0MzYsCisJNDA4NjQ5LAorCTIyMSwKKwk3MTExNDMsCisJMTA0OTUsCisJMjQ0MSwKKwkyNzU3MjAsCisJMiwKKwkxNTM5MSwKKwkxMzIxMDcsCisJMTAyNjEwLAorCTY4ODU0OSwKKwkyMzcxNDIsCisJMzA0MSwKKwkxNCwKKwkzMDg2MjMsCisJMCwKKwkwLAorCTI4NywKKwkyOTUxNDcsCisJNjE0NDMsCisJMjI5LAorCTIwNywKKwkyMDUxLAorCTY0LAorCTEzNDc5LAorCTU1NjU2LAorCTU3MDEzNCwKKwk1MDM4NywKKwkyMjU4NjksCisJMjA2MTUsCisJMjU4NDY1LAorCTY0OTMyLAorCTExMjQ2MSwKKwkxNjQ1MjEsCisJOTA3MjY5LAorCTc1ODU2MywKKwkyMjkwMSwKKwkwLAorCTc5NDQsCisJNDgsCisJMTU0OTIxLAorCTI3ODQsCisJNTQ4NjA4LAorCTAsCisJMTI1MjQsCisJMTQyNTU2LAorCTAsCisJMTM4ODIsCisJNTA3MjI3LAorCTMxNjU5OCwKKwk5ODc1NTEsCisJMCwKKwk4OTQ2ODcsCisJMTk2NCwKKwkzNjQsCisJMTAzMTYsCisJNDQwMjY5LAorCTksCisJNzc2NzIzLAorCTcyMjg4LAorCTU0NjA0LAorCTE4NTEwMSwKKwkxNDIsCisJMzYyLAorCTExNjc5LAorCTc3LAorCTc5LAorCTUyOTMyMSwKKwkzNjQsCisJNDIzODcsCisJMCwKKwk1NzA4NzksCisJNDE3NTAzLAorCTYwNDg3MSwKKwk1Nzg4MDYsCisJMTEwMiwKKwk2NjU4NCwKKwk2MTU0NDAsCisJMTQ2NzQ0LAorCTE5NDQxLAorCTE3MDQ3OCwKKwkxNDQwNjksCisJMzYxNzAsCisJMTQ1Mzc2LAorCTg0MjI4MywKKwkxOTM2MTIsCisJMywKKwkzNTk0MjksCisJMzY4NTk2LAorCTAsCisJMTEwNjQsCisJNzcyNiwKKwkyMjk0MTAsCisJNjM1NjksCisJNjc0MDIsCisJOTEsCisJMjAzMjAxLAorCTIxMzUxMywKKwkwLAorCTcwNDQ3OSwKKwkxMzI1LAorCTAsCisJMzg1MTU0LAorCTEzLAorCTgwNjc2MywKKwkxOTcxMzIsCisJNjE4MywKKwk0NTc2MCwKKwk5OTM3NywKKwkwLAorCTk3MjA3NywKKwk0MDQzLAorCTE5NTcwMCwKKwkzNDIyOSwKKwkwLAorCTE1NDAyNywKKwk2MzMsCisJNiwKKwkzMjE0MiwKKwkwLAorCTI5LAorCTYyMDg0MiwKKwkxNDA5OSwKKwk0OTU0NjUsCisJMjY5MzcsCisJMCwKKwkwLAorCTQzMiwKKwkyMjc3MDQsCisJMCwKKwk2MywKKwkwLAorCTE5LAorCTg2MzQ5MSwKKwkyMCwKKwkxLAorCTE2MDcxMywKKwkyNDYwNywKKwk4NTgwMCwKKwkzNTY2LAorCTM3ODU0LAorCTgxOTEzLAorCTEyMTU3MywKKwk4MTYsCisJMjAsCisJMTMzMjUzLAorCTY5MjIzMSwKKwk0ODY5LAorCTI1NTE3NSwKKwkxNTAyOCwKKwk5MzgzLAorCTU0Mjg3NywKKwk0NjA4LAorCTM2OTYxMCwKKwkyNDM2MzUsCisJMzg1Mjg1LAorCTM5MTU2NSwKKwkyODYwMDksCisJMCwKKwk2MTY4NSwKKwk0MTYzMTgsCisJMjA4LAorCTY3MDE5LAorCTc4ODQxNiwKKwk4OCwKKwkxNjUwNTYsCisJMCwKKwk0Mzk1ODksCisJMTYwLAorCTEwNTUyOCwKKwkxNTIsCisJMTYwNjI0LAorCTg2NSwKKwkzOTAyMjksCisJNzE0MDg2LAorCTYwMDcsCisJMzAyMjksCisJNDgxMzA2LAorCTE3MzI2NiwKKwkxMTM1LAorCTIyNjYsCisJOCwKKwk1OSwKKwkxMDQ3MjIsCisJNjQ3ODg1LAorCTU3OTQ3MSwKKwkyMTMwOSwKKwkyMzA4MzQsCisJMTQwMjc4LAorCTMxODU4LAorCTMyODgsCisJMzYwMTEsCisJMTUxMzg3LAorCTU5NDIxNywKKwkyMjQzOSwKKwk0MTg2MzgsCisJNzY4NTksCisJMjkzNjMsCisJMTU0ODA5LAorCTI3NTUzMywKKwkzOSwKKwk0NzI5OTYsCisJMjIwNzYsCisJNzQ4MSwKKwkxNTU3MDUsCisJMTA0MDYsCisJMjE0Nzc5LAorCTIyMywKKwkxMzEyLAorCTE2MzkxLAorCTE3MjAzLAorCTU1NjA1LAorCTQ0NTc5LAorCTY5MzMyLAorCTMwMywKKwkxOTIxNywKKwkyNjI4OCwKKwkxMjYyMTIsCisJMzE2LAorCTk4LAorCTExNCwKKwkzNzM4MiwKKwkxMzc1OTEsCisJNDM5NzQ5LAorCTEyOTcyLAorCTU0LAorCTE1NDg3OSwKKwkwLAorCTEwMjY4MCwKKwk3NjM5LAorCTMwOTExOSwKKwkyNjM1NTAsCisJNzY2LAorCTExMjQsCisJNTYsCisJNjg2NjA4LAorCTEyMzc2NywKKwk1MTgwNTQsCisJMTgsCisJNjcyMzg1LAorCTMxNjEsCisJNTM3OTEsCisJMjY3NjksCisJNDUxNjcwLAorCTYxLAorCTE0ODI0NSwKKwkyNzEzLAorCTk2NzI1LAorCTQ3OTQsCisJMzMyNDcsCisJMjk3OTQ2LAorCTMzMzgwLAorCTAsCisJMjAwMzQsCisJNTY0NywKKwkxNzIyNywKKwk3NjQ0NCwKKwkwLAorCTIxMDExLAorCTY3NSwKKwkxMzIyNiwKKwkxMDI3LAorCTk5MDg0MiwKKwkxMjQ0NTksCisJMzQ0MDYsCisJNTMsCisJNjk1NDAsCisJMTM0LAorCTAsCisJMTY4NTIxLAorCTYsCisJNDA3NSwKKwkxMTM3LAorCTYzNzQwLAorCTIyMCwKKwkxMDQzNCwKKwkxMTcxLAorCTI4OTUwLAorCTAsCisJNzk2ODAsCisJOTkzMjY5LAorCTM1NTYyMiwKKwkxNSwKKwkwLAorCTE0NTIsCisJMjE2NjcsCisJMjIyMDgsCisJNDk0NDg0LAorCTMzOTg0LAorCTY5MTMwOCwKKwkxMCwKKwk2OTM2ODYsCisJMTk2LAorCTksCisJNzA2NzYsCisJMTU3NjYwLAorCTc3NSwKKwkxNjUsCisJNDY4NDMyLAorCTEwODMsCisJNTE1MTU0LAorCTc3ODM0NCwKKwk3MDI0MSwKKwk0MiwKKwk0MDkzMSwKKwkyNzcxMjUsCisJNDM4MzcsCisJMzAxODgxLAorCTEzMzIsCisJNTY3MTIsCisJOTAxMywKKwkxMjk5LAorCTc1NjQsCisJMzEwOTIsCisJMTk3NSwKKwkxMTM1MTcsCisJODMzMjk1LAorCTI0NTAyMSwKKwkzNjUwMywKKwkyMzU4NiwKKwkxNDkzMjcsCisJODkxNzUsCisJMTA1MTIsCisJNDg0MzQ4LAorCTE4Nzc5MywKKwk5NTQ2MDksCisJNTMxOTksCisJNzkyMTc1LAorCTEyNiwKKwkxMjM2OSwKKwk0MDUsCisJMCwKKwk2NjE0LAorCTMyMjg1NywKKwkxNjYsCisJNTcxODc0LAorCTYwODM5LAorCTE4MDk3NSwKKwkxNDY3MjIsCisJNDExNTY1LAorCTE1MzYsCisJMSwKKwkxMSwKKwkxMTYyMzAsCisJNjA1MTQsCisJOTAwMywKKwkyMzI1LAorCTQzNzYzLAorCTYzLAorCTM1NTU1MywKKwkwLAorCTM4OTg3NiwKKwkxNDY3MiwKKwkxMTUyNiwKKwkxNjAyMDksCisJNjUsCisJMTAyODMsCisJOTY2LAorCTEwLAorCTU4MzMzLAorCTEyOTkyMCwKKwkyODUwLAorCTgzMzQ2LAorCTAsCisJMTQsCisJMjk1ODE5LAorCTY3OTU1MCwKKwkxNDM5MjgsCisJMjk0ODksCisJODIzMjQsCisJMzY1NTgsCisJMjY3MTE4LAorCTE0MzMxMywKKwk5MDEwNywKKwkxMjc4OSwKKwk5NTEsCisJMCwKKwkxODc2MTksCisJMjk1MzE3LAorCTgyLAorCTQxMzI2LAorCTMwOTY4MiwKKwk5MDczMjcsCisJODA5MzU4LAorCTMyNCwKKwkxMzkxNTcsCisJMTIsCisJNzgzNjYsCisJNjcxODExLAorCTM1NCwKKwkxMzEsCisJNzA1MjUsCisJMzU4MzAsCisJMjgxMDE4LAorCTkxNDU2LAorCTkyNTIzLAorCTU0ODc0LAorCTQ4MjczLAorCTI0MjMsCisJMCwKKwk4MSwKKwkzNjEzMTQsCisJMzc0ODExLAorCTM5NDc1OCwKKwkxNTM1MCwKKwk3OTUsCisJMywKKwkxNjc3OSwKKwk3OTY2ODQsCisJNDc3NTU2LAorCTczOTI3LAorCTI2NjQzLAorCTExOTI4MSwKKwk2MjY5MiwKKwkxNzAzOSwKKwk0NTQ3NzgsCisJOTUyLAorCTQ4OTczLAorCTE5NTI5LAorCTE1MSwKKwkyMzkxMjEsCisJOTM1MDksCisJMjU0NzAyLAorCTEzMDcsCisJMTAwMjksCisJNzk3MywKKwk1NDY3MDYsCisJODA2NjQ0LAorCTY4MDUxNywKKwkyMjMsCisJMCwKKwkyLAorCTAsCisJNDAyNDIxLAorCTYxOTE5MywKKwkxNTY4NSwKKwkyLAorCTkzOTcxNSwKKwk1MTkxOTgsCisJMCwKKwk0NDQzMTIsCisJMjMyMDQsCisJMzU2NjksCisJMzI0NjcsCisJMCwKKwk3OTk3MjUsCisJNTg4MywKKwkyMjE3LAorCTMyMjkyLAorCTM1NTU1NywKKwkyMjE3OSwKKwkxMDY2LAorCTE1NzA0LAorCTYxMCwKKwkzNzgxOSwKKwk0MDM2MjYsCisJODMxMDEsCisJMTA5ODksCisJMzExNjA3LAorCTQzMzk0LAorCTcyNTc2LAorCTMzNTQ1MCwKKwk4NTk2NCwKKwk3MzczNCwKKwkxMDUxNDIsCisJMzgyOTIsCisJMCwKKwkxODE1MTYsCisJMzM5NTksCisJNjExNzk3LAorCTIyMTgzOCwKKwk1OTMxLAorCTc2NjYsCisJMTA0NCwKKwk0NzcxNzMsCisJMTM1OTEsCisJNDA1LAorCTUyMSwKKwkxOTA2NTMsCisJMTg0MTkxLAorCTAsCisJMjE1LAorCTg0NzE5NSwKKwkyMjc4MiwKKwkxMTkxMiwKKwkyNzM0NSwKKwkyNTcyLAorCTAsCisJNTY2MzUwLAorCTcsCisJNTIzMDIsCisJMjY2NDEsCisJNTg3ODI2LAorCTEyNywKKwkyLAorCTQ0NDQ5LAorCTE1MzE5OCwKKwkxNCwKKwk5MjYsCisJMjg1LAorCTAsCisJOTM4MTk2LAorCTUyMjU1LAorCTkxNTMsCisJODA3LAorCTEyNTQ4LAorCTM1ODMyNCwKKwkxODUyMSwKKwkxMDQ5NTYsCisJNDI3MzgsCisJMTE2LAorCTEzNTc3MiwKKwkxODk1NTQsCisJMzgsCisJNTQsCisJMzYsCisJODk3NjgsCisJMTcxNzAsCisJNzUsCisJMzQ1MDIsCisJNDU0ODksCisJMTcyNzk2LAorCTk3MTgxMCwKKwkxNjE1MywKKwk0OTkyODAsCisJMSwKKwk4Nzk2NjMsCisJNTM4MzAsCisJMTg2LAorCTUzOSwKKwkyNDIwNTksCisJMjY4LAorCTQwMiwKKwkyNzMyLAorCTY4MDU3LAorCTE4NDYzLAorCTE5ODU2MCwKKwkxMDA2OCwKKwk1OTE3NTMsCisJNjExNiwKKwk2OTkyODAsCisJMSwKKwkwLAorCTExNDI1OCwKKwkyNzcsCisJMTQ5LAorCTI4MzgyMSwKKwkzNTI1NjEsCisJODgxNzIsCisJNjg0NDc2LAorCTM0NTAsCisJODcsCisJOTk5MzYsCisJMzE1NSwKKwk3Mjk4MywKKwkzMTYxOSwKKwk4ODMyLAorCTU4NjY2LAorCTAsCisJNTkwMjMsCisJMzA2MDkxLAorCTM1MjE1MCwKKwkyNTUwNjMsCisJOTkyNzA4LAorCTIzLAorCTQ4OTYsCisJMTgxNjUsCisJNDI0NDAxLAorCTIyNzYxMywKKwk1MTc1LAorCTM0NywKKwkxMzk4NDYsCisJMTE5NjIsCisJNzE0LAorCTM1MDEsCisJODIzNjcsCisJMTExMTAsCisJMTAsCisJMTI4NzQsCisJMCwKKwkwLAorCTIyMjcxMiwKKwkxNjksCisJMTIzMjgxLAorCTAsCisJMjY4MTQ5LAorCTEwMSwKKwkxNzQ0NiwKKwk0MjYyLAorCTQ4OSwKKwkwLAorCTMwLAorCTAsCisJMjc3MjM1LAorCTI4LAorCTcxLAorCTIzLAorCTYxMjE5LAorCTk1MzYzMSwKKwk0Nzc1NDgsCisJNjYyNDkxLAorCTI3MywKKwk0NDc4NywKKwk0MTMwLAorCTE0NDgzLAorCTQ3MDU3MSwKKwk3MzU5NzcsCisJNDA2NjQ4LAorCTgxNTg5OCwKKwk1OTg1LAorCTQ2MjY5NiwKKwk5Mzc1MTAsCisJOSwKKwkwLAorCTExMTcyNywKKwk5MywKKwkzMzE0MzUsCisJMzM2NDAyLAorCTc4NjkwLAorCTQ5LAorCTAsCisJODc0MjIsCisJMTI0MiwKKwkwLAorCTg3ODMsCisJODU0MCwKKwkzMTQsCisJMzM0MTEsCisJODA1NzE4LAorCTI0NywKKwk2ODcwLAorCTUyMzc0MywKKwk4MzIzLAorCTYxMjU5MywKKwk0MzAsCisJMzU0MDQ4LAorCTI2NDkxMywKKwk4MywKKwkxMTQwNjMsCisJMjAyODI1LAorCTM1MjAyLAorCTMyODIzLAorCTE4NTU1NCwKKwk4NTc2MCwKKwk0NTE1OSwKKwk1OTcxLAorCTI2NzczMywKKwk0NTQ1LAorCTExNiwKKwk2OTEwLAorCTI0ODMzLAorCTIxOCwKKwk5MjIzNjIsCisJMjIxNzM1LAorCTc0MCwKKwk3MTEyLAorCTMxLAorCTE1NzM5LAorCTUyMzU4OSwKKwk0LAorCTk1OTk2LAorCTkzNiwKKwk4MjM5NTEsCisJMCwKKwk4OCwKKwkxNjAsCisJMzc1NDE5LAorCTY2MzYyNywKKwkzNzQxLAorCTIyODk2LAorCTExNDMyNiwKKwk0MTU5NjIsCisJODgwMTAwLAorCTYyMjIsCisJMTg2NTAsCisJMzU1MjQsCisJMTk1MDc2LAorCTUwNiwKKwk0NTE2NDAsCisJNTQxMzM2LAorCTcwOTAzLAorCTM5NDYsCisJMSwKKwk2MTc2NSwKKwkxLAorCTI2OTYsCisJNzUzMTI5LAorCTI4OSwKKwkyMjUyMzQsCisJMzc4NjkyLAorCTE3MDMsCisJNjc1MSwKKwkxLAorCTgyMCwKKwk3Njc3LAorCTU4OSwKKwkxMjQxMiwKKwkzMTcsCisJNjksCisJMjI2MDMxLAorCTEzNDUyMywKKwkzMTgyNTMsCisJNjY2NzcsCisJMTExMDI1LAorCTk2LAorCTAsCisJOTYsCisJNTIzNTI4LAorCTEwMTcsCisJMCwKKwkyNTg3NDAsCisJNDIwOTQ3LAorCTQ2MDAsCisJNDAwNjg0LAorCTEyMTc0LAorCTExNzcwLAorCTUyLAorCTU5NTksCisJODI2NTgsCisJNTMxNzg3LAorCTIwMiwKKwk1NDg0MzAsCisJOTY0LAorCTEwNTQsCisJMzQsCisJOTY4OTcsCisJMjU0NDUsCisJNDc2MDksCisJMzg2MDUyLAorCTk3MDA0LAorCTE5MzUsCisJMzAwNzQsCisJMTM0NTgsCisJNDk0MTA1LAorCTU0LAorCTY1NTc1LAorCTU5NDY5OCwKKwkyMzQwLAorCTIwMjU5LAorCTg0LAorCTI3NzQsCisJNTM0LAorCTk3MjUzNCwKKwkxMTUwNTcsCisJMCwKKwkxMTM3OSwKKwkwLAorCTI3MSwKKwkyNjYzMDUsCisJMTMyNTk1LAorCTIsCisJNzczNTYxLAorCTUyMzY1LAorCTM1ODUsCisJMzUxLAorCTE0ODIwNiwKKwk3Nzg5NjQsCisJMTQ5Mzc5LAorCTU5NiwKKwkyODQ5MTQsCisJMjkwMCwKKwkzNTU5NiwKKwkxNTQ3LAorCTIxMjAyNywKKwk4MTAwLAorCTEyMjQ4LAorCTMwMTMsCisJMTgxNCwKKwkxODM0MTUsCisJMjczNjMzLAorCTE1ODEyLAorCTAsCisJOTY2NjgwLAorCTE0ODMwLAorCTEzNDMwOSwKKwkwLAorCTQxNjQ1MCwKKwkyMDY2MTEsCisJODE2LAorCTgyMjU4LAorCTk4NzMsCisJMzE1NSwKKwk1MzQ4NSwKKwk3Nzk4MDUsCisJMTA3NjkwLAorCTI1NDQ3NSwKKwkxMDI1MDQsCisJNzI0OTUsCisJMTczMDEsCisJNDcyMTMwLAorCTY4OTUsCisJMjQ1NDIwLAorCTcyOTksCisJMTEwNTA4LAorCTI3Nzc2LAorCTI0NjEzNCwKKwkwLAorCTMzMDg1MywKKwkwLAorCTI3MTc2NywKKwk2MTg4NiwKKwkyNDEyMywKKwkzMDk2ODEsCisJNTgzMjUsCisJNjA4ODY1LAorCTIwNjY2LAorCTg3MzQ5LAorCTIyOTIyOCwKKwkyNDYsCisJNDU3NzY4LAorCTUzNzQsCisJNjk2NDMsCisJMTQ4LAorCTYxODM3NSwKKwk0NTIzNiwKKwkzNTI1NjUsCisJMTMzOTA0LAorCTE1MiwKKwkxMDY4OCwKKwkxOCwKKwkwLAorCTI3NjAzNiwKKwk0OTMyODEsCisJMTExNTYsCisJMTI1NjYsCisJNTc2MiwKKwkxMTMsCisJMjQxNzksCisJOTgsCisJMzI3LAorCTg5MywKKwkyMDkxODAsCisJMTQwODA1LAorCTAsCisJMjM0MSwKKwk2NjMwOSwKKwkzMDMwNSwKKwk2MzA1NTksCisJMzY4MiwKKwkxNTI3NjcsCisJMjY1ODIyLAorCTE0Mjg2OCwKKwkxNTM1LAorCTcyODYwMywKKwk2OTA4MSwKKwkzNTMxNTEsCisJMjM3OTk1LAorCTEwNzUsCisJOTI1MDcxLAorCTg2LAorCTY3NDgsCisJMCwKKwk2ODQxODYsCisJNzM1LAorCTEzNzkzLAorCTQ3OTAsCisJNzMxNzUsCisJNjk2NzcsCisJMzY3NjI3LAorCTIzODY1MCwKKwkzMDM1NDMsCisJMSwKKwkyNjA1OSwKKwkyMTM5MiwKKwkxMCwKKwkyODg2MDksCisJMCwKKwk3NjM0NSwKKwkxNTg0OTYsCisJNzAwMCwKKwkxODY1LAorCTIwMzg1LAorCTAsCisJNTQyMTMsCisJOTk0OCwKKwkxMDI2NjcsCisJNjk2MywKKwk3MSwKKwk1NTU3NDQsCisJNTYyNiwKKwkyNTEyLAorCTExMjQsCisJNzE3MSwKKwk2MjgsCisJMjkyMjUsCisJMzIxNjg3LAorCTYxNTE5LAorCTQsCisJODM1MiwKKwk5MTU2LAorfTsKKworY2hhciAqcG9pbnRlcnNbTkNZQ0xFU107CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IHIsIGksIGosIHNwLCBzcTsKKwljaGFyICpwLCAqcSwgKmVwLCAqZXE7CisJaW50IG9rOworCWludCBlcnIgPSAwOworCisJZm9yIChyID0gMDsgciA8IDQ7IHIrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgTkNZQ0xFUzsgaSsrKSB7CisJCQlwb2ludGVyc1tpXSA9IHAgPSBtYWxsb2Moc3AgPSBzaXplc1tpXSk7CisJCQllcCA9IHAgKyBzcDsKKwkJCW9rID0gMTsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlxID0gcG9pbnRlcnNbal07CisJCQkJc3EgPSBzaXplc1tqXTsKKwkJCQllcSA9IHEgKyBzcTsKKworCQkJCWlmICgocCA8IHEgJiYgZXAgPiBxKSB8fCAocCA+PSBxICYmIHAgPCBlcSkpIHsKKwkJCQkJb2sgPSAwOworCQkJCQllcnIgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwcmludGYoIkFsbG9jYXRlZCAlNmQgYnl0ZXMgYXQgJXAsIG9rID0gJWRcbiIsIHNwLCBwLAorCQkJICAgICAgIG9rKTsKKworCQkJaWYgKHApCisJCQkJbWVtc2V0KHAsIDB4ZWUsIHNwKTsJLyogUG9pc29uIHRoaXMgbWVtb3J5ICovCisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgTkNZQ0xFUzsgaSsrKSB7CisJCQlmcmVlKHBvaW50ZXJzW2ldKTsKKwkJCXByaW50ZigiRnJlZWQgJTZkIGJ5dGVzIGF0ICVwXG4iLCBzaXplc1tpXSwKKwkJCSAgICAgICBwb2ludGVyc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL21hbGxvY3Rlc3QyLmMgYi91c3Iva2xpYmMvdGVzdHMvbWFsbG9jdGVzdDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ1MDczCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL21hbGxvY3Rlc3QyLmMKQEAgLTAsMCArMSw2MiBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTkNZQ0xFUyAzMjc2OAorI2RlZmluZSBOU0xPVFMgIDQwOTYKKworc3RydWN0IHNsb3QgeworCWNoYXIgKnB0cjsKKwlzaXplX3Qgc2l6ZTsKK307CisKK3N0cnVjdCBzbG90IHNbTlNMT1RTXTsKKworaW50IG1haW4odm9pZCkKK3sKKwlzaXplX3Qgc3AsIHNxOworCWNoYXIgKnAsICplcCwgKnEsICplcTsKKwlpbnQgciwgaSwgajsKKwlpbnQgb2s7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKHIgPSAwOyByIDwgTkNZQ0xFUzsgcisrKSB7CisJCWkgPSBscmFuZDQ4KCkgJSBOU0xPVFM7CisKKwkJaWYgKHNbaV0ucHRyKSB7CisJCQlmcmVlKHNbaV0ucHRyKTsKKwkJCXByaW50ZigiRnJlZWQgICAgICU4enUgYnl0ZXMgYXQgJXBcbiIsIHNbaV0uc2l6ZSwKKwkJCSAgICAgICBzW2ldLnB0cik7CisJCQlzW2ldLnB0ciA9IE5VTEw7CisJCQlzW2ldLnNpemUgPSAwOworCQl9IGVsc2UgeworCQkJc3AgPSBscmFuZDQ4KCk7CS8qIDMyLWJpdCByYW5kb20gbnVtYmVyICovCisJCQlzcCA+Pj0gMTIgKyAobHJhbmQ0OCgpICUgMjApOworCisJCQlzW2ldLnNpemUgPSBzcDsKKwkJCXNbaV0ucHRyID0gcCA9IG1hbGxvYyhzcCk7CisJCQllcCA9IHAgKyBzcDsKKwkJCW9rID0gMTsKKwkJCWZvciAoaiA9IDA7IGogPCBOU0xPVFM7IGorKykgeworCQkJCXEgPSBzW2pdLnB0cjsKKwkJCQlpZiAoaSAhPSBqICYmIHEpIHsKKwkJCQkJc3EgPSBzW2pdLnNpemU7CisJCQkJCWVxID0gcSArIHNxOworCisJCQkJCWlmICgocCA8IHEgJiYgZXAgPiBxKQorCQkJCQkgICAgfHwgKHAgPj0gcSAmJiBwIDwgZXEpKSB7CisJCQkJCQlvayA9IDA7CisJCQkJCQllcnIgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlwcmludGYoIkFsbG9jYXRlZCAlOHp1IGJ5dGVzIGF0ICVwLCBvayA9ICVkXG4iLCBzcCwgcCwKKwkJCSAgICAgICBvayk7CisKKwkJCWlmIChwKQorCQkJCW1lbXNldChwLCAweGVlLCBzcCk7CS8qIFBvaXNvbiB0aGlzIG1lbW9yeSAqLworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvbWVtc3RydGVzdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL21lbXN0cnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ3M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL21lbXN0cnRlc3QuYwpAQCAtMCwwICsxLDI4IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1haW4odm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHQxWzI1Nl0sIHQyWzI1Nl07CisJaW50IGk7CisJaW50IHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGludClzaXplb2YodDEpOyBpKyspCisJCXQxW2ldID0gdDJbaV0gPSAodW5zaWduZWQgY2hhcilpOworCisJciA9IG1lbWNtcCh0MSwgdDIsIHNpemVvZih0MSkpOworCXByaW50ZigibWVtY21wIHIgPSAlZFxuIiwgcik7CisJciA9IG1lbWNtcCh0MSwgdDIsIHNpemVvZih0MSkgLyAyKTsKKwlwcmludGYoIm1lbWNtcCByID0gJWRcbiIsIHIpOworCXQxWzI1NV0gPSAwOworCXIgPSBtZW1jbXAodDEsIHQyLCBzaXplb2YodDEpKTsKKwlwcmludGYoIm1lbWNtcCByID0gJWRcbiIsIHIpOworCisJZm9yIChpID0gMDsgaSA8IChpbnQpc2l6ZW9mKHQxKTsgaSsrKQorCQl0MVtpXSA9IDB4YWE7CisJbWVtc2V0KHQyLCAweGFhLCBzaXplb2YodDIpKTsKKwlyID0gbWVtY21wKHQxLCB0Miwgc2l6ZW9mKHQxKSk7CisJcHJpbnRmKCJtZW1jbXAgciA9ICVkXG4iLCByKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9taWNyb2hlbGxvLmMgYi91c3Iva2xpYmMvdGVzdHMvbWljcm9oZWxsby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTlkMTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvbWljcm9oZWxsby5jCkBAIC0wLDAgKzEsOSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaGVsbG9bXSA9ICJIZWxsbywgV29ybGQhXG4iOworCV9md3JpdGUoaGVsbG8sIHNpemVvZiBoZWxsbyAtIDEsIHN0ZG91dCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvbWluaWhlbGxvLmMgYi91c3Iva2xpYmMvdGVzdHMvbWluaWhlbGxvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5MDcyZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9taW5paGVsbG8uYwpAQCAtMCwwICsxLDcgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbih2b2lkKQoreworCWZwdXRzKCJIZWxsbywgV29ybGQhXG4iLCBzdGRvdXQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL21tYXB0ZXN0LmMgYi91c3Iva2xpYmMvdGVzdHMvbW1hcHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWMwNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL21tYXB0ZXN0LmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIG1tYXB0ZXN0LmMKKyAqCisgKiBUZXN0IHNvbWUgc2ltcGxlIGNhc2VzIG9mIG1tYXAoKQorICovCisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitzdGF0aWMgdm9pZCBtYWtlX3Rlc3RfZmlsZShpbnQgZmQpCit7CisJdW5zaWduZWQgbG9uZyB2OworCUZJTEUgKmYgPSBmZG9wZW4oZmQsICJ3YiIpOworCisJZm9yICh2ID0gMDsgdiA8IDI2MjE0NDsgdiArPSBzaXplb2YodikpCisJCV9md3JpdGUoJnYsIHNpemVvZih2KSwgZik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdm9pZCAqZm9vOworCWNoYXIgKnRlc3RfZmlsZSA9IChhcmdjID4gMSkgPyBhcmd2WzFdIDogIi90bXAvbW1hcHRlc3QudG1wIjsKKwlpbnQgcnYsIGZkOworCisJLyogSW1wb3J0YW50IGNhc2UsIHRoaXMgaXMgaG93IHdlIGdldCBtZW1vcnkgZm9yIG1hbGxvYygpICovCisJZXJybm8gPSAwOworCWZvbyA9IG1tYXAoTlVMTCwgNjU1MzYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgMCwgMCk7CisKKwlwcmludGYoIm1tYXAoKSByZXR1cm5lZCAlcCwgZXJybm8gPSAlZFxuIiwgZm9vLCBlcnJubyk7CisJaWYgKGZvbyA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm4gMTsKKworCXJ2ID0gbXVubWFwKGZvbywgNjU1MzYpOworCXByaW50ZigibXVubWFwKCkgcmV0dXJuZWQgJWQsIGVycm5vID0gJWRcbiIsIHJ2LCBlcnJubyk7CisJaWYgKHJ2KQorCQlyZXR1cm4gMTsKKworCS8qIENyZWF0ZSB0ZXN0IGZpbGUgKi8KKwlmZCA9IG9wZW4odGVzdF9maWxlLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY2Nik7CisJaWYgKGZkIDwgMCkgeworCQlwZXJyb3IodGVzdF9maWxlKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbWFrZV90ZXN0X2ZpbGUoZmQpOworCisJLyogTWFwIHRlc3QgZmlsZSAqLworCWZvbyA9IG1tYXAoTlVMTCwgNjU1MzYsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDEzMTA3Mik7CisJcHJpbnRmKCJtbWFwKCkgcmV0dXJuZWQgJXAsIGVycm5vID0gJWRcbiIsIGZvbywgZXJybm8pOworCWlmIChmb28gPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKih1bnNpZ25lZCBsb25nICopZm9vICE9IDEzMTA3MikgeworCQlwcmludGYoIm1tYXAoKSB3aXRoIG9mZnNldCByZXR1cm5lZCB0aGUgd3Jvbmcgb2Zmc2V0ICVsZCFcbiIsCisJCSAgICAgICAqKHVuc2lnbmVkIGxvbmcgKilmb28pOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobXVubWFwKGZvbywgNjU1MzYpKSB7CisJCXByaW50ZigibXVubWFwKCkgcmV0dXJuZWQgbm9uemVybywgZXJybm8gPSAlZFxuIiwgZXJybm8pOworCQlyZXR1cm4gMTsKKwl9CisKKwljbG9zZShmZCk7CisJdW5saW5rKHRlc3RfZmlsZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9vcGVudGVzdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL29wZW50ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlN2IzZAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy9vcGVudGVzdC5jCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbih2b2lkKQoreworCWNoYXIgYnVmZmVyWzEwMjRdOworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4oIi9ldGMvcGFzc3dkIiwgInIiKTsKKwlmZ2V0cyhidWZmZXIsIDEwMjQsIGYpOworCWZjbG9zZShmKTsKKworCXByaW50ZigiTGluZSAxID0gJXMiLCBidWZmZXIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvcGlwZXRlc3QuYyBiL3Vzci9rbGliYy90ZXN0cy9waXBldGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNDk3MjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvcGlwZXRlc3QuYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJLyogU2l6ZSBvZiBtZXNzYWdlIG11c3QgYmUgPD0gUElQRV9CVUYgKi8KKwljb25zdCBjaGFyIG1zZ1tdID0gIkhlbGxvLCBXb3JsZCEiOworCWNoYXIgYnVmWzUxMl07CisJaW50IHJ2OworCWludCBwZmRbMl07CisKKwlpZiAocGlwZShwZmQpKSB7CisJCXBlcnJvcigicGlwZSIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAod3JpdGUocGZkWzFdLCBtc2csIHNpemVvZiBtc2cpICE9IHNpemVvZiBtc2cpIHsKKwkJcGVycm9yKCJ3cml0ZSIpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3aGlsZSAoKHJ2ID0gcmVhZChwZmRbMF0sIGJ1Ziwgc2l6ZW9mIGJ1ZikpIDwgc2l6ZW9mIG1zZykgeworCQlpZiAocnYgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisJCQljb250aW51ZTsKKwkJcGVycm9yKCJyZWFkIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChtZW1jbXAobXNnLCBidWYsIHNpemVvZiBtc2cpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTWVzc2FnZSBtaXNjb21wYXJlIVxuIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL3J0c2lnLmMgYi91c3Iva2xpYmMvdGVzdHMvcnRzaWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y4ZWVkCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3J0c2lnLmMKQEAgLTAsMCArMSwxMiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisjaWZkZWYgU0lHUlRNSU4KKwlwcmludGYoInNpZ3J0bWluID0gJWQsIHNpZ3J0bWF4ID0gJWRcbiIsIFNJR1JUTUlOLCBTSUdSVE1BWCk7CisjZWxzZQorCXByaW50ZigiTm8gcmVhbHRpbWUgc2lnbmFsc1xuIik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zZWxlY3QuYyBiL3Vzci9rbGliYy90ZXN0cy9zZWxlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc1YzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3NlbGVjdC5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBTaW1wbGUgdGVzdCBvZiBzZWxlY3QoKQorICovCisKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGZkbiwgZmR6LCBwZmRbMl0sIHJ2OworCWZkX3NldCByZWFkc2V0OworCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisJaW50IGVyciA9IDA7CisKKwkvKiBXZSBjYW4gYWx3YXlzIHJlYWQgZnJvbSAvZGV2L3plcm87IG9wZW4gYSBwaXBlIHRoYXQgaXMgbmV2ZXIKKwkgICByZWFkeSBmb3IgYSAibmV2ZXIgcmVhZGFibGUiIGZpbGUgZGVzY3JpcHRvciAqLworCWZkeiA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRPTkxZKTsKKwlwaXBlKHBmZCk7CisJZmRuID0gcGZkWzBdOworCisJRkRfWkVSTygmcmVhZHNldCk7CisJRkRfU0VUKGZkbiwgJnJlYWRzZXQpOworCisJdGltZW91dC50dl9zZWMgPSAwOworCXRpbWVvdXQudHZfdXNlYyA9IDEwMDAwMDsKKworCXJ2ID0gc2VsZWN0KEZEX1NFVFNJWkUsICZyZWFkc2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCk7CisKKwlpZiAocnYgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJzZWxlY3Qgd2l0aCB0aW1lb3V0IGZhaWxlZCAocnYgPSAlZCwgZXJybm8gPSAlcylcbiIsCisJCQlydiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXJyKys7CisJfQorCisJRkRfWkVSTygmcmVhZHNldCk7CisJRkRfU0VUKGZkbiwgJnJlYWRzZXQpOworCUZEX1NFVChmZHosICZyZWFkc2V0KTsKKworCXJ2ID0gc2VsZWN0KEZEX1NFVFNJWkUsICZyZWFkc2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCk7CisJCisJaWYgKHJ2ICE9IDEgfHwgIUZEX0lTU0VUKGZkeiwgJnJlYWRzZXQpIHx8CisJICAgIEZEX0lTU0VUKGZkbiwgJnJlYWRzZXQpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJInNlbGVjdCB3aXRoIC9kZXYvemVybyBmYWlsZWQgKHJ2ID0gJWQsIGVycm5vID0gJXMpXG4iLAorCQkJcnYsIHN0cmVycm9yKGVycm5vKSk7CisJCWVycisrOworCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGVzdHMvc2V0ZW52dGVzdC5jIGIvdXNyL2tsaWJjL3Rlc3RzL3NldGVudnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjA3MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3NldGVudnRlc3QuYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwkodm9pZClhcmdjOworCSh2b2lkKWFyZ3Y7CisKKwkvKiBTZXQgU0VURU5WICovCisJc2V0ZW52KCJTRVRFTlYiLCAic2V0ZW52IiwgMSk7CisKKwkvKiBTZXQgUFVURU5WICovCisJcHV0ZW52KCJQVVRFTlY9cHV0ZW52Iik7CisKKwkvKiBQcmludCB0aGUgcmVzdWx0cy4uLiAqLworCXByaW50ZigiU0VURU5WID0gJXNcbiIsIGdldGVudigiU0VURU5WIikpOworCXByaW50ZigiUFVURU5WID0gJXNcbiIsIGdldGVudigiUFVURU5WIikpOworCisJLyogT3ZlcnJpZGUgdGVzdHMgKi8KKwlzZXRlbnYoIlNFVEVOViIsICJzZXRlbnZfZ29vZCIsIDEpOworCXB1dGVudigiUFVURU5WPXB1dGVudl9nb29kIik7CisJcHJpbnRmKCJTRVRFTlYgPSAlc1xuIiwgZ2V0ZW52KCJTRVRFTlYiKSk7CisJcHJpbnRmKCJQVVRFTlYgPSAlc1xuIiwgZ2V0ZW52KCJQVVRFTlYiKSk7CisKKwkvKiBOb24tb3ZlcnJpZGUgdGVzdCAqLworCXNldGVudigiU0VURU5WIiwgInNldGVudl9iYWQiLCAwKTsKKwlzZXRlbnYoIk5FV0VOViIsICJuZXdlbnZfZ29vZCIsIDApOworCXByaW50ZigiU0VURU5WID0gJXNcbiIsIGdldGVudigiU0VURU5WIikpOworCXByaW50ZigiTkVXRU5WID0gJXNcbiIsIGdldGVudigiTkVXRU5WIikpOworCisJLyogVW5kZWYgdGVzdCAqLworCXVuc2V0ZW52KCJTRVRFTlYiKTsKKwl1bnNldGVudigiTkVXRU5WIik7CisJcHJpbnRmKCJTRVRFTlYgPSAlc1xuIiwgZ2V0ZW52KCJTRVRFTlYiKSk7CisJcHJpbnRmKCJORVdFTlYgPSAlc1xuIiwgZ2V0ZW52KCJORVdFTlYiKSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zZXRqbXB0ZXN0LmMgYi91c3Iva2xpYmMvdGVzdHMvc2V0am1wdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzRlMTYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvc2V0am1wdGVzdC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBzZXRqbXB0ZXN0LmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworc3RhdGljIGptcF9idWYgYnVmOworCit2b2lkIGRvX3N0dWZmKGludCB2KQoreworCXByaW50ZigiY2FsbGluZyBsb25nam1wIHdpdGggJWQuLi4gIiwgdiArIDEpOworCWxvbmdqbXAoYnVmLCB2ICsgMSk7Cit9CisKK3ZvaWQgcmVjdXJzZShpbnQgY3RyLCBpbnQgdikKK3sKKwlpZiAoY3RyLS0pIHsKKwkJcmVjdXJzZShjdHIsIHYpOworCX0gZWxzZSB7CisJCWRvX3N0dWZmKHYpOworCX0KKworCXByaW50ZigiRVJST1IhXG4iKTsJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uICovCit9CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IHY7CisKKwl2ID0gc2V0am1wKGJ1Zik7CisJcHJpbnRmKCJzZXRqbXAgcmV0dXJuZWQgJWRcbiIsIHYpOworCisJaWYgKHYgPCAyNTYpCisJCXJlY3Vyc2Uodiwgdik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zaWdpbnQuYyBiL3Vzci9rbGliYy90ZXN0cy9zaWdpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFhZTFmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3NpZ2ludC5jCkBAIC0wLDAgKzEsNjQgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitzdGF0aWMgc2lnX2F0b21pY190IGNvdW50ZXIgPSAwOworCitzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnbnVtKQoreworCXN0YXRpYyBjaGFyIG1zZ1tdID0gIlNpZ25hbCBoYW5kbGVyXG4iOworCisJKHZvaWQpc2lnbnVtOworCisJd3JpdGUoMSwgbXNnLCBzaXplb2YgbXNnIC0gMSk7CisJY291bnRlcisrOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBzaWdhY3Rpb24gYWN0LCBvYWN0OworCXBpZF90IGY7CisJc2lnc2V0X3Qgc2V0OworCisJKHZvaWQpYXJnYzsKKworCW1lbXNldCgmYWN0LCAweDAwLCBzaXplb2Yoc3RydWN0IHNpZ2FjdGlvbikpOworCWFjdC5zYV9oYW5kbGVyID0gc2lnX2hhbmRsZXI7CisJc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKKwlhY3Quc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOworCisJLyogb2FjdCBpcyB0aGVyZSBmb3IgdGhlIGJlbmVmaXQgb2Ygc3RyYWNlKCkgKi8KKwlzaWdhY3Rpb24oU0lHSU5ULCAmYWN0LCAmb2FjdCk7CisJc2lnYWN0aW9uKFNJR1RFUk0sICZhY3QsICZvYWN0KTsKKworCXNpZ2VtcHR5c2V0KCZzZXQpOworCXNpZ2FkZHNldCgmc2V0LCBTSUdJTlQpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNldCwgTlVMTCk7CisKKwlmID0gZm9yaygpOworCisJaWYgKGYgPCAwKSB7CisJCXBlcnJvcihhcmd2WzBdKTsKKwkJZXhpdCgyNTUpOworCX0gZWxzZSBpZiAoZiA+IDApIHsKKwkJc2xlZXAoMyk7CisJCWlmIChjb3VudGVyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlNpZ25hbCByZWNlaXZlZCB3aGlsZSBtYXNrZWQhXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzZXQsIE5VTEwpOworCQlzbGVlcCgzKTsKKwkJaWYgKCFjb3VudGVyKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHNpZ25hbCByZWNlaXZlZCFcbiIpOworCQkJZXhpdCgxKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiU2lnbmFsIHJlY2VpdmVkIE9LXG4iKTsKKwkJCWV4aXQoMCk7CisJCX0KKwl9IGVsc2UgeworCQlzbGVlcCgxKTsKKwkJa2lsbChnZXRwcGlkKCksIFNJR0lOVCk7CisJCV9leGl0KDApOworCX0KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zdGF0LmMgYi91c3Iva2xpYmMvdGVzdHMvc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjIzY2YKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvc3RhdC5jCkBAIC0wLDAgKzEsNjMgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK3N0YXRpYyB2b2lkIGRvX3N0YXQoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KHBhdGgsICZzdCkpIHsKKwkJcGVycm9yKHBhdGgpOworCQlleGl0KDEpOworCX0KKworCXByaW50ZigiUGF0aCA9ICVzXG4iCisJICAgICAgICIgICBzdF9kZXYgICAgICAgPSAlI2p4ICgldSwldSlcbiIKKwkgICAgICAgIiAgIHN0X2lubyAgICAgICA9ICVqdVxuIgorCSAgICAgICAiICAgc3RfbW9kZSAgICAgID0gJSNqb1xuIgorCSAgICAgICAiICAgc3RfbmxpbmsgICAgID0gJWp1XG4iCisJICAgICAgICIgICBzdF91aWQgICAgICAgPSAlanVcbiIKKwkgICAgICAgIiAgIHN0X2dpZCAgICAgICA9ICVqdVxuIgorCSAgICAgICAiICAgc3RfcmRldiAgICAgID0gJSNqeCAoJXUsJXUpXG4iCisJICAgICAgICIgICBzdF9zaXplICAgICAgPSAlanVcbiIKKwkgICAgICAgIiAgIHN0X2Jsa3NpemUgICA9ICVqdVxuIgorCSAgICAgICAiICAgc3RfYmxvY2tzICAgID0gJWp1XG4iLAorCSAgICAgICBwYXRoLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9kZXYsIG1ham9yKHN0LnN0X2RldiksIG1pbm9yKHN0LnN0X2RldiksCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X2lubywKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfbW9kZSwKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfbmxpbmssCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X3VpZCwKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfZ2lkLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9yZGV2LCBtYWpvcihzdC5zdF9yZGV2KSwgbWlub3Ioc3Quc3RfcmRldiksCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X3NpemUsCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X2Jsa3NpemUsICh1aW50bWF4X3QpIHN0LnN0X2Jsb2Nrcyk7CisKKyNpZmRlZiBfU1RBVEJVRl9TVF9OU0VDCisJcHJpbnRmKCIgICBzdF9hdGltICAgICAgPSAlamQuJTA5dVxuIgorCSAgICAgICAiICAgc3QubXRpbSAgICAgID0gJWpkLiUwOXVcbiIKKwkgICAgICAgIiAgIHN0LmN0aW0gICAgICA9ICVqZC4lMDl1XG4iLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9hdGltLnR2X3NlYywgKHVuc2lnbmVkIGludClzdC5zdF9hdGltLnR2X25zZWMsCisJICAgICAgICh1aW50bWF4X3QpIHN0LnN0X210aW0udHZfc2VjLCAodW5zaWduZWQgaW50KXN0LnN0X210aW0udHZfbnNlYywKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfY3RpbS50dl9zZWMsICh1bnNpZ25lZCBpbnQpc3Quc3RfY3RpbS50dl9uc2VjKTsKKyNlbHNlCisJcHJpbnRmKCIgICBzdF9hdGltZSAgICAgPSAlamRcbiIKKwkgICAgICAgIiAgIHN0Lm10aW1lICAgICA9ICVqZFxuIgorCSAgICAgICAiICAgc3QuY3RpbWUgICAgID0gJWpkXG4iLAorCSAgICAgICAodWludG1heF90KSBzdC5zdF9hdGltZSwKKwkgICAgICAgKHVpbnRtYXhfdCkgc3Quc3RfbXRpbWUsICh1aW50bWF4X3QpIHN0LnN0X2N0aW1lKTsKKyNlbmRpZgorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKwkJZG9fc3RhdChhcmd2W2ldKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL3N0YXRmcy5jIGIvdXNyL2tsaWJjL3Rlc3RzL3N0YXRmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjk5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvc3RhdGZzLmMKQEAgLTAsMCArMSw0MiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisKK3N0YXRpYyB2b2lkIGRvX3N0YXRmcyhjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBzdGF0ZnMgc2ZzOworCisJaWYgKHN0YXRmcyhwYXRoLCAmc2ZzKSkgeworCQlwZXJyb3IocGF0aCk7CisJCWV4aXQoMSk7CisJfQorCisJcHJpbnRmKCJQYXRoID0gJXNcbiIKKwkgICAgICAgIiAgIGZfdHlwZSAgICAgPSAlI2p4XG4iCisJICAgICAgICIgICBmX2JzaXplICAgID0gJWpkXG4iCisJICAgICAgICIgICBmX2Jsb2NrcyAgID0gJWpkXG4iCisJICAgICAgICIgICBmX2JmcmVlICAgID0gJWpkXG4iCisJICAgICAgICIgICBmX2JhdmFpbCAgID0gJWpkXG4iCisJICAgICAgICIgICBmX2ZpbGVzICAgID0gJWpkXG4iCisJICAgICAgICIgICBmX2ZmcmVlICAgID0gJWpkXG4iCisJICAgICAgICIgICBmX25hbWVsZW4gID0gJWpkXG4iLAorCSAgICAgICBwYXRoLAorCSAgICAgICAodWludG1heF90KSBzZnMuZl90eXBlLAorCSAgICAgICAoaW50bWF4X3QpIHNmcy5mX2JzaXplLAorCSAgICAgICAoaW50bWF4X3QpIHNmcy5mX2Jsb2NrcywKKwkgICAgICAgKGludG1heF90KSBzZnMuZl9iZnJlZSwKKwkgICAgICAgKGludG1heF90KSBzZnMuZl9iYXZhaWwsCisJICAgICAgIChpbnRtYXhfdCkgc2ZzLmZfZmlsZXMsCisJICAgICAgIChpbnRtYXhfdCkgc2ZzLmZfZmZyZWUsIChpbnRtYXhfdCkgc2ZzLmZfbmFtZWxlbik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCQlkb19zdGF0ZnMoYXJndltpXSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zdHJsY3B5Y2F0LmMgYi91c3Iva2xpYmMvdGVzdHMvc3RybGNweWNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZGYwY2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvc3RybGNweWNhdC5jCkBAIC0wLDAgKzEsMTExIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1haW4odm9pZCkKK3sKKwljaGFyIHRlbXBbOF07CisJc2l6ZV90IGxlbjsKKworCXByaW50Zigic3RybGNweTpcbiIpOworCWxlbiA9IHN0cmxjcHkodGVtcCwgIjEyMyIsIHNpemVvZih0ZW1wKSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiMTIzIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWxlbiA9IHN0cmxjcHkodGVtcCwgIiIsIHNpemVvZih0ZW1wKSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWxlbiA9IHN0cmxjcHkodGVtcCwgIjEyMzQ1Njc4OTAiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIjEyMzQ1NjciKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJbGVuID0gc3RybGNweSh0ZW1wLCAiMTIzIiwgMSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWxlbiA9IHN0cmxjcHkodGVtcCwgIjEyMzQ1Njc4OTAiLCAxKTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICIiKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJbGVuID0gc3RybGNweSh0ZW1wLCAiMTIzIiwgMCk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWxlbiA9IHN0cmxjcHkodGVtcCwgIjEyMzQ1Njc4OTAiLCAwKTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICIiKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJbGVuID0gc3RybGNweSh0ZW1wLCAiMTIzNDU2NyIsIHNpemVvZih0ZW1wKSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiMTIzNDU2NyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlsZW4gPSBzdHJsY3B5KHRlbXAsICIxMjM0NTY3OCIsIHNpemVvZih0ZW1wKSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiMTIzNDU2NyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJzdHJsY2F0OlxuIik7CisJc3RyY3B5KHRlbXAsICIiKTsKKwlsZW4gPSBzdHJsY2F0KHRlbXAsICIxMjMiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIjEyMyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdHJjcHkodGVtcCwgIkFCQyIpOworCWxlbiA9IHN0cmxjYXQodGVtcCwgIiIsIHNpemVvZih0ZW1wKSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiQUJDIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweSh0ZW1wLCAiIik7CisJbGVuID0gc3RybGNhdCh0ZW1wLCAiIiwgc2l6ZW9mKHRlbXApKTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICIiKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJc3RyY3B5KHRlbXAsICJBQkMiKTsKKwlsZW4gPSBzdHJsY2F0KHRlbXAsICIxMjMiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIkFCQzEyMyIpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdHJjcHkodGVtcCwgIkFCQyIpOworCWxlbiA9IHN0cmxjYXQodGVtcCwgIjEyMzQ1Njc4OTAiLCBzaXplb2YodGVtcCkpOworCXByaW50ZigiJyVzJ2xlbjolenUgc3RybGVuOiV6dVxuIiwgdGVtcCwgbGVuLCBzdHJsZW4odGVtcCkpOworCWlmIChzdHJjbXAodGVtcCwgIkFCQzEyMzQiKSAhPSAwKQorCQlnb3RvIGVycm9yOworCisJc3RyY3B5KHRlbXAsICJBQkMiKTsKKwlsZW4gPSBzdHJsY2F0KHRlbXAsICIxMjMiLCA1KTsKKwlwcmludGYoIiclcydsZW46JXp1IHN0cmxlbjolenVcbiIsIHRlbXAsIGxlbiwgc3RybGVuKHRlbXApKTsKKwlpZiAoc3RyY21wKHRlbXAsICJBQkMxIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweSh0ZW1wLCAiQUJDIik7CisJbGVuID0gc3RybGNhdCh0ZW1wLCAiMTIzIiwgMSk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiQUJDIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCXN0cmNweSh0ZW1wLCAiQUJDIik7CisJbGVuID0gc3RybGNhdCh0ZW1wLCAiMTIzIiwgMCk7CisJcHJpbnRmKCInJXMnbGVuOiV6dSBzdHJsZW46JXp1XG4iLCB0ZW1wLCBsZW4sIHN0cmxlbih0ZW1wKSk7CisJaWYgKHN0cmNtcCh0ZW1wLCAiQUJDIikgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWV4aXQoMCk7CitlcnJvcjoKKwlwcmludGYoInVuZXhwZWN0ZWQgcmVzdWx0XG4iKTsKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL3N0cnRvaW1heC5jIGIvdXNyL2tsaWJjL3Rlc3RzL3N0cnRvaW1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOGYyZDQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdGVzdHMvc3RydG9pbWF4LmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIHN0cnRvaW1heHRlc3QuYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisJY2hhciAqZXA7CisJaW50bWF4X3QgaXY7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWl2ID0gc3RydG9pbWF4KGFyZ3ZbaV0sICZlcCwgMCk7CisJCXByaW50Zigic3RydG9pbWF4KFwiJXNcIikgPSAlamRcbiIsIGFyZ3ZbaV0sIGl2KTsKKwkJaWYgKCplcCkKKwkJCXByaW50ZigiICAgZXAgPSBcIiVzXCJcbiIsIGVwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy9zdHJ0b3RpbWUuYyBiL3Vzci9rbGliYy90ZXN0cy9zdHJ0b3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQyZTBmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3N0cnRvdGltZS5jCkBAIC0wLDAgKzEsMjUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJaW50IGk7CisJY29uc3QgY2hhciAqcnYsICpyczsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJcnMgPSBzdHJ0b3RpbWVzcGVjKGFyZ3ZbaV0sICZ0cyk7CisJCXJ2ID0gc3RydG90aW1ldmFsKGFyZ3ZbaV0sICZ0dik7CisJCXByaW50ZigiU3RyaW5nOiAgIFwiJXNcIlxuIgorCQkgICAgICAgIlRpbWVzcGVjOiAlbGQuJTA5bGRcbiIKKwkJICAgICAgICJSZXNpZHVhbDogXCIlc1wiXG4iCisJCSAgICAgICAiVGltZXZhbDogICVsZC4lMDZsZFxuIgorCQkgICAgICAgIlJlc2lkdWFsOiBcIiVzXCJcbiIsCisJCSAgICAgICBhcmd2W2ldLAorCQkgICAgICAgKGxvbmcpdHMudHZfc2VjLCAobG9uZyl0cy50dl9uc2VjLCBycywKKwkJICAgICAgIChsb25nKXR2LnR2X3NlYywgKGxvbmcpdHYudHZfdXNlYywgcnYpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL3Rlc3RyYW5kNDguYyBiL3Vzci9rbGliYy90ZXN0cy90ZXN0cmFuZDQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4NjhjNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy90ZXN0cmFuZDQ4LmMKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgc2VlZDFbXSA9IHsgMHgxMjM0LCAweDU2NzgsIDB4OWFiYyB9OworCXVuc2lnbmVkIHNob3J0ICpvbGRzZWVkOworCisJb2xkc2VlZCA9IHNlZWQ0OChzZWVkMSk7CisJcHJpbnRmKCJJbml0aWFsIHNlZWQ6ICUjMDZ4ICUjMDZ4ICUjMDZ4XG4iLAorCSAgICAgICBvbGRzZWVkWzBdLCBvbGRzZWVkWzFdLCBvbGRzZWVkWzJdKTsKKworCXByaW50ZigibHJhbmQ0OCgpID0gJWxkXG4iLCBscmFuZDQ4KCkpOworCisJc2VlZDQ4KHNlZWQxKTsKKwlwcmludGYoIm1yYW5kNDgoKSA9ICVsZFxuIiwgbXJhbmQ0OCgpKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Rlc3RzL3Rlc3R2c25wLmMgYi91c3Iva2xpYmMvdGVzdHMvdGVzdHZzbnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOThiNDlhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Rlc3RzL3Rlc3R2c25wLmMKQEAgLTAsMCArMSwxMTkgQEAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbih2b2lkKQoreworCWludCByLCBpOworCWNoYXIgYnVmZmVyWzUxMl07CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJWQiLCAzNyk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJ2QiLCAzNzM3MzczNyk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJ3giLCAweGRlYWRiZWVmKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICUnI1giLCAweGRlYWRiZWVmKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICUnI2xsbyIsIDAxMjM0NTY3MDEyMzQ1NjdVTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwkvKiBNYWtlIHN1cmUgb3ZlcmZsb3cgd29ya3MgY29ycmVjdGx5ICovCisJbWVtc2V0KGJ1ZmZlciwgJ1x4ZmYnLCA1MTIpOworCXIgPSBzbnByaW50ZihidWZmZXIsIDE2LCAiSGVsbG8sICUnI2xsbyIsIDAxMjM0NTY3MDEyMzQ1NjdVTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisJZm9yIChpID0gMTY7IGkgPCA1MTI7IGkrKykKKwkJYXNzZXJ0KGJ1ZmZlcltpXSA9PSAnXHhmZicpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICUnIzQwLjIwbGxvIiwgMDEyMzQ1NjcwMTIzNDU2N1VMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyMtNDAuMjBsbG8iLCAwMTIzNDU2NzAxMjM0NTY3VUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICUnIyouKmxsbyIsIDQwLCAyMCwKKwkJICAgICAwMTIzNDU2NzAxMjM0NTY3VUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICUnIyouKmxsbyIsIC00MCwgMjAsCisJCSAgICAgMDEyMzQ1NjcwMTIzNDU2N1VMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlJyMqLipsbG8iLCAtNDAsIC0yMCwKKwkJICAgICAwMTIzNDU2NzAxMjM0NTY3VUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICUnIyouKmxseCIsIC00MCwgLTIwLAorCQkgICAgIDAxMjM0NTY3MDEyMzQ1NjdVTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJXAiLCAmYnVmZmVyKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNTEyLCAiSGVsbG8sICVQIiwgJmJ1ZmZlcik7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlMjBwIiwgJmJ1ZmZlcik7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDUxMiwgIkhlbGxvLCAlLTIwcCIsICZidWZmZXIpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA1MTIsICJIZWxsbywgJS0yMHAiLCBOVUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgMjAsICJIZWxsbywgJSctMjBwIiwgTlVMTCk7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDE1LCAiSGVsbG8sICUnLTIwcCIsIE5VTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCAzLCAiSGVsbG8sICUnLTIwcCIsIE5VTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwkvKiBUaGlzIHNob3VsZG4ndCBjaGFuZ2UgYnVmZmVyIGluIGFueSB3YXkhICovCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgMCwgIkhlbGxvLCAlJy0yMHAiLCBOVUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJZm9yIChpID0gLTMwOyBpIDw9IDMwOyBpKyspIHsKKwkJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJScqcCIsIGksIE5VTEwpOworCQlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksCisJCSAgICAgICByKTsKKwl9CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA0MCwgIkhlbGxvLCAlJy0yMHMiLCAiU3RyaW5nIik7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDQwLCAiSGVsbG8sICUnMjBzIiwgIlN0cmluZyIpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA0MCwgIkhlbGxvLCAlJzAyMHMiLCAiU3RyaW5nIik7CisJcHJpbnRmKCJidWZmZXIgPSBcIiVzXCIgKCVkKSwgciA9ICVkXG4iLCBidWZmZXIsIHN0cmxlbihidWZmZXIpLCByKTsKKworCXIgPSBzbnByaW50ZihidWZmZXIsIDQwLCAiSGVsbG8sICUnLTIwcyIsIE5VTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA0MCwgIkhlbGxvLCAlJzIwcyIsIE5VTEwpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA0MCwgIkhlbGxvLCAlJzAyMHMiLCBOVUxMKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJSctMjBjIiwgJyonKTsKKwlwcmludGYoImJ1ZmZlciA9IFwiJXNcIiAoJWQpLCByID0gJWRcbiIsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlciksIHIpOworCisJciA9IHNucHJpbnRmKGJ1ZmZlciwgNDAsICJIZWxsbywgJScyMGMiLCAnKicpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyID0gc25wcmludGYoYnVmZmVyLCA0MCwgIkhlbGxvLCAlJzAyMGMiLCAnKicpOworCXByaW50ZigiYnVmZmVyID0gXCIlc1wiICglZCksIHIgPSAlZFxuIiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwgcik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy90ZXN0cy92Zm9yay5jIGIvdXNyL2tsaWJjL3Rlc3RzL3Zmb3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkYzAzNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy90ZXN0cy92Zm9yay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiB1c3Iva2xpYmMvdGVzdHMvdmZvcmsuYworICoKKyAqIHZmb3JrIGlzIG1lc3N5IG9uIG1vc3QgYXJjaGl0ZWN0dXJlcy4gIERvIG91ciBiZXN0IHRvIHRlc3QgaXQgb3V0LgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlwaWRfdCBmLCBydjsKKwlpbnQgc3RhdHVzOworCisJZiA9IHZmb3JrKCk7CisKKwlpZiAoZiA9PSAwKSB7CisJCXByaW50ZigiQ2hpbGQgKCVkKS4uLlxuIiwgKGludClnZXRwaWQoKSk7CisJCV9leGl0KDEyMyk7CisJfSBlbHNlIGlmIChmID4gMCkgeworCQlpbnQgZXJyID0gMDsKKworCQlwcmludGYoIlBhcmVudCAoY2hpbGQgPSAlZClcbiIsIChpbnQpZik7CisKKwkJcnYgPSB3YWl0cGlkKGYsICZzdGF0dXMsIDApOworCQlpZiAocnYgIT0gZikgeworCQkJcHJpbnRmKCJ3YWl0cGlkIHJldHVybmVkICVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIChpbnQpcnYsIGVycm5vKTsKKwkJCWVycisrOworCQl9CisJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSAxMjMpIHsKKwkJCXByaW50ZigiQ2hpbGQgcHJvY2VzcyBleGlzdGVkIHdpdGggd3Jvbmcgc3RhdHVzICVkXG4iLAorCQkJICAgICAgIHN0YXR1cyk7CisJCQllcnIrKzsKKwkJfQorCQlyZXR1cm4gZXJyOworCX0gZWxzZSB7CisJCXByaW50ZigidmZvcmsgcmV0dXJuZWQgJWQsIGVycm5vID0gJWRcbiIsCisJCSAgICAgICAoaW50KWYsIGVycm5vKTsKKwkJcmV0dXJuIDEyNzsKKwl9Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdGltZS5jIGIvdXNyL2tsaWJjL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGMzNjZiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3RpbWUuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogdGltZS5jCisgKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZm5kZWYgX19OUl90aW1lCisKK3RpbWVfdCB0aW1lKHRpbWVfdCAqIHQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworCWlmICh0KQorCQkqdCA9ICh0aW1lX3QpIHR2LnR2X3NlYzsKKworCXJldHVybiAodGltZV90KSB0di50dl9zZWM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Vtb3VudC5jIGIvdXNyL2tsaWJjL3Vtb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMWEzMDAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdW1vdW50LmMKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIHVtb3VudC5jCisgKgorICogU2luZ2xlLWFyZ3VtZW50IGZvcm0gb2YgdW1vdW50CisgKi8KKworI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorCitpbnQgdW1vdW50KGNvbnN0IGNoYXIgKmRpcikKK3sKKwlyZXR1cm4gdW1vdW50MihkaXIsIDApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Vuc2V0ZW52LmMgYi91c3Iva2xpYmMvdW5zZXRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNjOTVhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Vuc2V0ZW52LmMKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIHVuc2V0ZW52LmMKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJlbnYuaCIKKworaW50IHVuc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc2l6ZV90IGxlbjsKKwljaGFyICoqcCwgKnE7CisJY29uc3QgY2hhciAqejsKKworCWlmICghbmFtZSB8fCAhbmFtZVswXSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKworCWxlbiA9IDA7CisJZm9yICh6ID0gbmFtZTsgKno7IHorKykgeworCQlsZW4rKzsKKwkJaWYgKCp6ID09ICc9JykgeworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoIWVudmlyb24pCisJCXJldHVybiAwOworCisJZm9yIChwID0gZW52aXJvbjsgKHEgPSAqcCk7IHArKykgeworCQlpZiAoIXN0cm5jbXAobmFtZSwgcSwgbGVuKSAmJiBxW2xlbl0gPT0gJz0nKQorCQkJYnJlYWs7CisJfQorCisJZm9yICg7IChxID0gKnApOyBwKyspIHsKKwkJcFswXSA9IHBbMV07CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdXNlcmRiL2dldGdyZ2lkLmMgYi91c3Iva2xpYmMvdXNlcmRiL2dldGdyZ2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxM2E0NwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy91c2VyZGIvZ2V0Z3JnaWQuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogZ2V0Z3JnaWQuYworICoKKyAqIER1bW15IGdldGdyZ2lkKCkgdG8gc3VwcG9ydCB1ZGV2CisgKi8KKworI2luY2x1ZGUgInVzZXJkYi5oIgorCitzdHJ1Y3QgZ3JvdXAgKmdldGdyZ2lkKGdpZF90IGdpZCkKK3sKKwlpZiAoIWdpZCkKKwkJcmV0dXJuIChzdHJ1Y3QgZ3JvdXAgKikmX19yb290X2dyb3VwOworCisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdXNlcmRiL2dldGdybmFtLmMgYi91c3Iva2xpYmMvdXNlcmRiL2dldGdybmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmN2I4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy91c2VyZGIvZ2V0Z3JuYW0uYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogZ2V0Z3JuYW0uYworICoKKyAqIER1bW15IGdldGdybmFtKCkgdG8gc3VwcG9ydCB1ZGV2CisgKi8KKworI2luY2x1ZGUgInVzZXJkYi5oIgorCitzdHJ1Y3QgZ3JvdXAgKmdldGdybmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFzdHJjbXAobmFtZSwgInJvb3QiKSkKKwkJcmV0dXJuIChzdHJ1Y3QgZ3JvdXAgKikmX19yb290X2dyb3VwOworCisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdXNlcmRiL2dldHB3bmFtLmMgYi91c3Iva2xpYmMvdXNlcmRiL2dldHB3bmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxMzU5YwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy91c2VyZGIvZ2V0cHduYW0uYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogZ2V0cHduYW0uYworICoKKyAqIER1bW15IGdldHB3bmFtKCkgdG8gc3VwcG9ydCB1ZGV2CisgKi8KKworI2luY2x1ZGUgInVzZXJkYi5oIgorCisKK3N0cnVjdCBwYXNzd2QgKmdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFzdHJjbXAobmFtZSwgInJvb3QiKSkKKwkJcmV0dXJuIChzdHJ1Y3QgcGFzc3dkICopJl9fcm9vdF91c2VyOworCisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdXNlcmRiL2dldHB3dWlkLmMgYi91c3Iva2xpYmMvdXNlcmRiL2dldHB3dWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyNGYyOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy91c2VyZGIvZ2V0cHd1aWQuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogZ2V0cHd1aWQuYworICoKKyAqIER1bW15IGdldHB3dWlkKCkgdG8gc3VwcG9ydCB1ZGV2CisgKi8KKworI2luY2x1ZGUgInVzZXJkYi5oIgorCisKK3N0cnVjdCBwYXNzd2QgKmdldHB3dWlkKHVpZF90IHVpZCkKK3sKKwlpZiAoIXVpZCkKKwkJcmV0dXJuIChzdHJ1Y3QgcGFzc3dkICopJl9fcm9vdF91c2VyOworCisJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdXNlcmRiL3Jvb3RfZ3JvdXAuYyBiL3Vzci9rbGliYy91c2VyZGIvcm9vdF9ncm91cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzZkNTQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNlcmRiL3Jvb3RfZ3JvdXAuYwpAQCAtMCwwICsxLDEyIEBACisvKgorICogcm9vdF9ncm91cC5jCisgKi8KKworI2luY2x1ZGUgInVzZXJkYi5oIgorCitjb25zdCBzdHJ1Y3QgZ3JvdXAgX19yb290X2dyb3VwID0geworCS5ncl9uYW1lICAgPSAicm9vdCIsCisJLmdyX3Bhc3N3ZCA9ICIiLAorCS5ncl9naWQgICAgPSAwLAorCS5ncl9tZW0gICAgPSBOVUxMCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3VzZXJkYi9yb290X3VzZXIuYyBiL3Vzci9rbGliYy91c2VyZGIvcm9vdF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZTk5YQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy91c2VyZGIvcm9vdF91c2VyLmMKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIHJvb3RfdXNlci5jCisgKgorICovCisKKyNpbmNsdWRlICJ1c2VyZGIuaCIKKyNpbmNsdWRlIDxwYXRocy5oPgorCitjb25zdCBzdHJ1Y3QgcGFzc3dkIF9fcm9vdF91c2VyID0geworCS5wd19uYW1lICAgID0gInJvb3QiLAorCS5wd19wYXNzd2QgID0gIiIsCisJLnB3X3VpZCAgICAgPSAwLAorCS5wd19naWQgICAgID0gMCwKKwkucHdfZ2Vjb3MgICA9ICJyb290IiwKKwkucHdfZGlyICAgICA9ICIvIiwKKwkucHdfc2hlbGwgICA9IF9QQVRIX0JTSEVMTAorfTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy91c2VyZGIvdXNlcmRiLmggYi91c3Iva2xpYmMvdXNlcmRiL3VzZXJkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTA5M2YKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNlcmRiL3VzZXJkYi5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiB1c2VyZGIuaAorICoKKyAqIENvbW1vbiBoZWFkZXIgZmlsZQorICovCisKKyNpZm5kZWYgVVNFUkRCX0gKKyNkZWZpbmUgVVNFUkRCX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcGFzc3dkIF9fcm9vdF91c2VyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBncm91cCBfX3Jvb3RfZ3JvdXA7CisKKyNlbmRpZiAvKiBVU0VSREJfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3VzbGVlcC5jIGIvdXNyL2tsaWJjL3VzbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmZhYmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdXNsZWVwLmMKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIHVzbGVlcC5jCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCit2b2lkIHVzbGVlcCh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJdHMudHZfc2VjID0gdXNlYyAvIDEwMDAwMDBVTDsKKwl0cy50dl9uc2VjID0gKHVzZWMgJSAxMDAwMDAwVUwpICogMTAwMDsKKwl3aGlsZSAobmFub3NsZWVwKCZ0cywgJnRzKSA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3V0aW1lLmMgYi91c3Iva2xpYmMvdXRpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjhmNTBhCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3V0aW1lLmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHV0aW1lLmMKKyAqLworCisjaW5jbHVkZSA8dXRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZm5kZWYgX19OUl91dGltZQorCitpbnQgdXRpbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IHN0cnVjdCB1dGltYnVmICpidWYpCit7CisJc3RydWN0IHRpbWV2YWwgdHZwWzJdOworCisJdHZwWzBdLnR2X3NlYyA9IGJ1Zi0+YWN0aW1lOworCXR2cFswXS50dl91c2VjID0gMDsKKwl0dnBbMV0udHZfc2VjID0gYnVmLT5tb2R0aW1lOworCXR2cFsxXS50dl91c2VjID0gMDsKKworCXJldHVybiB1dGltZXMoZmlsZW5hbWUsIHR2cCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3Zhc3ByaW50Zi5jIGIvdXNyL2tsaWJjL3Zhc3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzMwMmYKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdmFzcHJpbnRmLmMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIHZhc3ByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCB2YXNwcmludGYoY2hhciAqKmJ1ZnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwl2YV9saXN0IGFwMTsKKwlpbnQgYnl0ZXM7CisJY2hhciAqcDsKKworCXZhX2NvcHkoYXAxLCBhcCk7CisKKwlieXRlcyA9IHZzbnByaW50ZihOVUxMLCAwLCBmb3JtYXQsIGFwMSkgKyAxOworCXZhX2VuZChhcDEpOworCisJKmJ1ZnAgPSBwID0gbWFsbG9jKGJ5dGVzKTsKKwlpZiAoIXApCisJCXJldHVybiAtMTsKKworCXJldHVybiB2c25wcmludGYocCwgYnl0ZXMsIGZvcm1hdCwgYXApOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3ZlcnNpb24gYi91c3Iva2xpYmMvdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI0MzJjCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3ZlcnNpb24KQEAgLTAsMCArMSBAQAorMS40LjM5CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdmZvcmsuYyBiL3Vzci9rbGliYy92Zm9yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYjFhODUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvdmZvcmsuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogdmZvcmsuYworICoKKyAqIEVtdWxhdGUgdmZvcmsoKSB3aXRoIGZvcmsoKSBpZiBuZWNlc3NhcnkKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8a2xpYmMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxrbGliYy9zeXNjb25maWcuaD4KKworI2lmICFfS0xJQkNfTk9fTU1VICYmICFfS0xJQkNfUkVBTF9WRk9SSworaW50IHZmb3JrKHZvaWQpCit7CisJcmV0dXJuIGZvcmsoKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3ZmcHJpbnRmLmMgYi91c3Iva2xpYmMvdmZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU2NjNiCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3ZmcHJpbnRmLmMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIHZmcHJpbnRmLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBCVUZGRVJfU0laRQkzMjc2OAorCitpbnQgdmZwcmludGYoRklMRSAqIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwlpbnQgcnY7CisJY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworCisJcnYgPSB2c25wcmludGYoYnVmZmVyLCBCVUZGRVJfU0laRSwgZm9ybWF0LCBhcCk7CisKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisKKwlpZiAocnYgPiBCVUZGRVJfU0laRSAtIDEpCisJCXJ2ID0gQlVGRkVSX1NJWkUgLSAxOworCisJcmV0dXJuIF9md3JpdGUoYnVmZmVyLCBydiwgZmlsZSk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdnByaW50Zi5jIGIvdXNyL2tsaWJjL3ZwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmJmZWFmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3ZwcmludGYuYwpAQCAtMCwwICsxLDExIEBACisvKgorICogdnByaW50Zi5jCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCB2cHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwlyZXR1cm4gdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy92c25wcmludGYuYyBiL3Vzci9rbGliYy92c25wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJlNzEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3ZzbnByaW50Zi5jCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogdnNucHJpbnRmLmMKKyAqCisgKiB2c25wcmludGYoKSwgZnJvbSB3aGljaCB0aGUgcmVzdCBvZiB0aGUgcHJpbnRmKCkKKyAqIGZhbWlseSBpcyBidWlsdAorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2VudW0gZmxhZ3MgeworCUZMX1pFUk8JCT0gMHgwMSwJLyogWmVybyBtb2RpZmllciAqLworCUZMX01JTlVTCT0gMHgwMiwJLyogTWludXMgbW9kaWZpZXIgKi8KKwlGTF9QTFVTCQk9IDB4MDQsCS8qIFBsdXMgbW9kaWZpZXIgKi8KKwlGTF9USUNLCQk9IDB4MDgsCS8qICcgbW9kaWZpZXIgKi8KKwlGTF9TUEFDRQk9IDB4MTAsCS8qIFNwYWNlIG1vZGlmaWVyICovCisJRkxfSEFTSAkJPSAweDIwLAkvKiAjIG1vZGlmaWVyICovCisJRkxfU0lHTkVECT0gMHg0MCwJLyogTnVtYmVyIGlzIHNpZ25lZCAqLworCUZMX1VQUEVSCT0gMHg4MAkvKiBVcHBlciBjYXNlIGRpZ2l0cyAqLworfTsKKworLyogVGhlc2UgbWF5IGhhdmUgdG8gYmUgYWRqdXN0ZWQgb24gY2VydGFpbiBpbXBsZW1lbnRhdGlvbnMgKi8KK2VudW0gcmFua3MgeworCXJhbmtfY2hhcgk9IC0yLAorCXJhbmtfc2hvcnQJPSAtMSwKKwlyYW5rX2ludAk9ICAwLAorCXJhbmtfbG9uZwk9ICAxLAorCXJhbmtfbG9uZ2xvbmcJPSAgMgorfTsKKworI2RlZmluZSBNSU5fUkFOSwlyYW5rX2NoYXIKKyNkZWZpbmUgTUFYX1JBTksJcmFua19sb25nbG9uZworCisjZGVmaW5lIElOVE1BWF9SQU5LCXJhbmtfbG9uZ2xvbmcKKyNkZWZpbmUgU0laRV9UX1JBTksJcmFua19sb25nCisjZGVmaW5lIFBUUkRJRkZfVF9SQU5LCXJhbmtfbG9uZworCisjZGVmaW5lIEVNSVQoeCkgKHsgaWYgKG88bil7KnErKyA9ICh4KTt9IG8rKzsgfSkKKworc3RhdGljIHNpemVfdAorZm9ybWF0X2ludChjaGFyICpxLCBzaXplX3QgbiwgdWludG1heF90IHZhbCwgZW51bSBmbGFncyBmbGFncywKKwkgICBpbnQgYmFzZSwgaW50IHdpZHRoLCBpbnQgcHJlYykKK3sKKwljaGFyICpxcTsKKwlzaXplX3QgbyA9IDAsIG9vOworCXN0YXRpYyBjb25zdCBjaGFyIGxjZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJc3RhdGljIGNvbnN0IGNoYXIgdWNkaWdpdHNbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKwljb25zdCBjaGFyICpkaWdpdHM7CisJdWludG1heF90IHRtcHZhbDsKKwlpbnQgbWludXMgPSAwOworCWludCBuZGlnaXRzID0gMCwgbmNoYXJzOworCWludCB0aWNrc2tpcCwgYjR0aWNrOworCisJLyogU2VsZWN0IHR5cGUgb2YgZGlnaXRzICovCisJZGlnaXRzID0gKGZsYWdzICYgRkxfVVBQRVIpID8gdWNkaWdpdHMgOiBsY2RpZ2l0czsKKworCS8qIElmIHNpZ25lZCwgc2VwYXJhdGUgb3V0IHRoZSBtaW51cyAqLworCWlmIChmbGFncyAmIEZMX1NJR05FRCAmJiAoaW50bWF4X3QpIHZhbCA8IDApIHsKKwkJbWludXMgPSAxOworCQl2YWwgPSAodWludG1heF90KSAoLShpbnRtYXhfdCkgdmFsKTsKKwl9CisKKwkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBuZWVkZWQuICBUaGlzIHJldHVybnMgemVybyBmb3IgMC4gKi8KKwl0bXB2YWwgPSB2YWw7CisJd2hpbGUgKHRtcHZhbCkgeworCQl0bXB2YWwgLz0gYmFzZTsKKwkJbmRpZ2l0cysrOworCX0KKworCS8qIEFkanVzdCBuZGlnaXRzIGZvciBzaXplIG9mIG91dHB1dCAqLworCisJaWYgKGZsYWdzICYgRkxfSEFTSCAmJiBiYXNlID09IDgpIHsKKwkJaWYgKHByZWMgPCBuZGlnaXRzICsgMSkKKwkJCXByZWMgPSBuZGlnaXRzICsgMTsKKwl9CisKKwlpZiAobmRpZ2l0cyA8IHByZWMpIHsKKwkJbmRpZ2l0cyA9IHByZWM7CS8qIE1hbmRhdG9yeSBudW1iZXIgcGFkZGluZyAqLworCX0gZWxzZSBpZiAodmFsID09IDApIHsKKwkJbmRpZ2l0cyA9IDE7CS8qIFplcm8gc3RpbGwgcmVxdWlyZXMgc3BhY2UgKi8KKwl9CisKKwkvKiBGb3IgJywgZmlndXJlIG91dCB3aGF0IHRoZSBza2lwIHNob3VsZCBiZSAqLworCWlmIChmbGFncyAmIEZMX1RJQ0spIHsKKwkJdGlja3NraXAgPSAoYmFzZSA9PSAxNikgPyA0IDogMzsKKwl9IGVsc2UgeworCQl0aWNrc2tpcCA9IG5kaWdpdHM7CS8qIE5vIHRpY2sgbWFya3MgKi8KKwl9CisKKwkvKiBUaWNrIG1hcmtzIGFyZW4ndCBkaWdpdHMsIGJ1dCBnZW5lcmF0ZWQgYnkgdGhlIG51bWJlciBjb252ZXJ0ZXIgKi8KKwluZGlnaXRzICs9IChuZGlnaXRzIC0gMSkgLyB0aWNrc2tpcDsKKworCS8qIE5vdyBjb21wdXRlIHRoZSBudW1iZXIgb2Ygbm9uZGlnaXRzICovCisJbmNoYXJzID0gbmRpZ2l0czsKKworCWlmIChtaW51cyB8fCAoZmxhZ3MgJiAoRkxfUExVUyB8IEZMX1NQQUNFKSkpCisJCW5jaGFycysrOwkvKiBOZWVkIHNwYWNlIGZvciBzaWduICovCisJaWYgKChmbGFncyAmIEZMX0hBU0gpICYmIGJhc2UgPT0gMTYpIHsKKwkJbmNoYXJzICs9IDI7CS8qIEFkZCAweCBmb3IgaGV4ICovCisJfQorCisJLyogRW1pdCBlYXJseSBzcGFjZSBwYWRkaW5nICovCisJaWYgKCEoZmxhZ3MgJiAoRkxfTUlOVVMgfCBGTF9aRVJPKSkgJiYgd2lkdGggPiBuY2hhcnMpIHsKKwkJd2hpbGUgKHdpZHRoID4gbmNoYXJzKSB7CisJCQlFTUlUKCcgJyk7CisJCQl3aWR0aC0tOworCQl9CisJfQorCisJLyogRW1pdCBub25kaWdpdHMgKi8KKwlpZiAobWludXMpCisJCUVNSVQoJy0nKTsKKwllbHNlIGlmIChmbGFncyAmIEZMX1BMVVMpCisJCUVNSVQoJysnKTsKKwllbHNlIGlmIChmbGFncyAmIEZMX1NQQUNFKQorCQlFTUlUKCcgJyk7CisKKwlpZiAoKGZsYWdzICYgRkxfSEFTSCkgJiYgYmFzZSA9PSAxNikgeworCQlFTUlUKCcwJyk7CisJCUVNSVQoKGZsYWdzICYgRkxfVVBQRVIpID8gJ1gnIDogJ3gnKTsKKwl9CisKKwkvKiBFbWl0IHplcm8gcGFkZGluZyAqLworCWlmICgoZmxhZ3MgJiAoRkxfTUlOVVMgfCBGTF9aRVJPKSkgPT0gRkxfWkVSTyAmJiB3aWR0aCA+IG5kaWdpdHMpIHsKKwkJd2hpbGUgKHdpZHRoID4gbmNoYXJzKSB7CisJCQlFTUlUKCcwJyk7CisJCQl3aWR0aC0tOworCQl9CisJfQorCisJLyogR2VuZXJhdGUgdGhlIG51bWJlci4gIFRoaXMgaXMgZG9uZSBmcm9tIHJpZ2h0IHRvIGxlZnQuICovCisJcSArPSBuZGlnaXRzOwkJLyogQWR2YW5jZSB0aGUgcG9pbnRlciB0byBlbmQgb2YgbnVtYmVyICovCisJbyArPSBuZGlnaXRzOworCXFxID0gcTsKKwlvbyA9IG87CQkJLyogVGVtcG9yYXJ5IHZhbHVlcyAqLworCisJYjR0aWNrID0gdGlja3NraXA7CisJd2hpbGUgKG5kaWdpdHMgPiAwKSB7CisJCWlmICghYjR0aWNrLS0pIHsKKwkJCXFxLS07CisJCQlvby0tOworCQkJbmRpZ2l0cy0tOworCQkJaWYgKG9vIDwgbikKKwkJCQkqcXEgPSAnXyc7CisJCQliNHRpY2sgPSB0aWNrc2tpcCAtIDE7CisJCX0KKwkJcXEtLTsKKwkJb28tLTsKKwkJbmRpZ2l0cy0tOworCQlpZiAob28gPCBuKQorCQkJKnFxID0gZGlnaXRzW3ZhbCAlIGJhc2VdOworCQl2YWwgLz0gYmFzZTsKKwl9CisKKwkvKiBFbWl0IGxhdGUgc3BhY2UgcGFkZGluZyAqLworCXdoaWxlICgoZmxhZ3MgJiBGTF9NSU5VUykgJiYgd2lkdGggPiBuY2hhcnMpIHsKKwkJRU1JVCgnICcpOworCQl3aWR0aC0tOworCX0KKworCXJldHVybiBvOworfQorCitpbnQgdnNucHJpbnRmKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwljb25zdCBjaGFyICpwID0gZm9ybWF0OworCWNoYXIgY2g7CisJY2hhciAqcSA9IGJ1ZmZlcjsKKwlzaXplX3QgbyA9IDA7CQkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBvdXRwdXQgKi8KKwl1aW50bWF4X3QgdmFsID0gMDsKKwlpbnQgcmFuayA9IHJhbmtfaW50OwkvKiBEZWZhdWx0IHJhbmsgKi8KKwlpbnQgd2lkdGggPSAwOworCWludCBwcmVjID0gLTE7CisJaW50IGJhc2U7CisJc2l6ZV90IHN6OworCWVudW0gZmxhZ3MgZmxhZ3MgPSAwOworCWVudW0geworCQlzdF9ub3JtYWwsCS8qIEdyb3VuZCBzdGF0ZSAqLworCQlzdF9mbGFncywJLyogU3BlY2lhbCBmbGFncyAqLworCQlzdF93aWR0aCwJLyogRmllbGQgd2lkdGggKi8KKwkJc3RfcHJlYywJLyogRmllbGQgcHJlY2lzaW9uICovCisJCXN0X21vZGlmaWVycwkvKiBMZW5ndGggb3IgY29udmVyc2lvbiBtb2RpZmllcnMgKi8KKwl9IHN0YXRlID0gc3Rfbm9ybWFsOworCWNvbnN0IGNoYXIgKnNhcmc7CS8qICVzIHN0cmluZyBhcmd1bWVudCAqLworCWNoYXIgY2FyZzsJCS8qICVjIGNoYXIgYXJndW1lbnQgKi8KKwlpbnQgc2xlbjsJCS8qIFN0cmluZyBsZW5ndGggKi8KKworCXdoaWxlICgoY2ggPSAqcCsrKSkgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2Ugc3Rfbm9ybWFsOgorCQkJaWYgKGNoID09ICclJykgeworCQkJCXN0YXRlID0gc3RfZmxhZ3M7CisJCQkJZmxhZ3MgPSAwOworCQkJCXJhbmsgPSByYW5rX2ludDsKKwkJCQl3aWR0aCA9IDA7CisJCQkJcHJlYyA9IC0xOworCQkJfSBlbHNlIHsKKwkJCQlFTUlUKGNoKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Ugc3RfZmxhZ3M6CisJCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICctJzoKKwkJCQlmbGFncyB8PSBGTF9NSU5VUzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJysnOgorCQkJCWZsYWdzIHw9IEZMX1BMVVM7CisJCQkJYnJlYWs7CisJCQljYXNlICdcJyc6CisJCQkJZmxhZ3MgfD0gRkxfVElDSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyAnOgorCQkJCWZsYWdzIHw9IEZMX1NQQUNFOworCQkJCWJyZWFrOworCQkJY2FzZSAnIyc6CisJCQkJZmxhZ3MgfD0gRkxfSEFTSDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzAnOgorCQkJCWZsYWdzIHw9IEZMX1pFUk87CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXN0YXRlID0gc3Rfd2lkdGg7CisJCQkJcC0tOwkvKiBQcm9jZXNzIHRoaXMgY2hhcmFjdGVyIGFnYWluICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHN0X3dpZHRoOgorCQkJaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwkJCQl3aWR0aCA9IHdpZHRoICogMTAgKyAoY2ggLSAnMCcpOworCQkJfSBlbHNlIGlmIChjaCA9PSAnKicpIHsKKwkJCQl3aWR0aCA9IHZhX2FyZyhhcCwgaW50KTsKKwkJCQlpZiAod2lkdGggPCAwKSB7CisJCQkJCXdpZHRoID0gLXdpZHRoOworCQkJCQlmbGFncyB8PSBGTF9NSU5VUzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGNoID09ICcuJykgeworCQkJCXByZWMgPSAwOwkvKiBQcmVjaXNpb24gZ2l2ZW4gKi8KKwkJCQlzdGF0ZSA9IHN0X3ByZWM7CisJCQl9IGVsc2UgeworCQkJCXN0YXRlID0gc3RfbW9kaWZpZXJzOworCQkJCXAtLTsJLyogUHJvY2VzcyB0aGlzIGNoYXJhY3RlciBhZ2FpbiAqLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBzdF9wcmVjOgorCQkJaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKwkJCQlwcmVjID0gcHJlYyAqIDEwICsgKGNoIC0gJzAnKTsKKwkJCX0gZWxzZSBpZiAoY2ggPT0gJyonKSB7CisJCQkJcHJlYyA9IHZhX2FyZyhhcCwgaW50KTsKKwkJCQlpZiAocHJlYyA8IDApCisJCQkJCXByZWMgPSAtMTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdGUgPSBzdF9tb2RpZmllcnM7CisJCQkJcC0tOwkvKiBQcm9jZXNzIHRoaXMgY2hhcmFjdGVyIGFnYWluICovCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHN0X21vZGlmaWVyczoKKwkJCXN3aXRjaCAoY2gpIHsKKwkJCQkvKiBMZW5ndGggbW9kaWZpZXJzIC0gbm9udGVybWluYWwgc2VxdWVuY2VzICovCisJCQljYXNlICdoJzoKKwkJCQlyYW5rLS07CS8qIFNob3J0ZXIgcmFuayAqLworCQkJCWJyZWFrOworCQkJY2FzZSAnbCc6CisJCQkJcmFuaysrOwkvKiBMb25nZXIgcmFuayAqLworCQkJCWJyZWFrOworCQkJY2FzZSAnaic6CisJCQkJcmFuayA9IElOVE1BWF9SQU5LOworCQkJCWJyZWFrOworCQkJY2FzZSAneic6CisJCQkJcmFuayA9IFNJWkVfVF9SQU5LOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJcmFuayA9IFBUUkRJRkZfVF9SQU5LOworCQkJCWJyZWFrOworCQkJY2FzZSAnTCc6CisJCQljYXNlICdxJzoKKwkJCQlyYW5rICs9IDI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIE91dHB1dCBtb2RpZmllcnMgLSB0ZXJtaW5hbCBzZXF1ZW5jZXMgKi8KKworCQkJCS8qIE5leHQgc3RhdGUgd2lsbCBiZSBub3JtYWwgKi8KKwkJCQlzdGF0ZSA9IHN0X25vcm1hbDsKKworCQkJCS8qIENhbm9uaWNhbGl6ZSByYW5rICovCisJCQkJaWYgKHJhbmsgPCBNSU5fUkFOSykKKwkJCQkJcmFuayA9IE1JTl9SQU5LOworCQkJCWVsc2UgaWYgKHJhbmsgPiBNQVhfUkFOSykKKwkJCQkJcmFuayA9IE1BWF9SQU5LOworCisJCQkJc3dpdGNoIChjaCkgeworCQkJCWNhc2UgJ1AnOgkvKiBVcHBlciBjYXNlIHBvaW50ZXIgKi8KKwkJCQkJZmxhZ3MgfD0gRkxfVVBQRVI7CisJCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJCWNhc2UgJ3AnOgkvKiBQb2ludGVyICovCisJCQkJCWJhc2UgPSAxNjsKKwkJCQkJcHJlYyA9IChDSEFSX0JJVCpzaXplb2Yodm9pZCAqKSszKS80OworCQkJCQlmbGFncyB8PSBGTF9IQVNIOworCQkJCQl2YWwgPSAodWludG1heF90KSh1aW50cHRyX3QpCisJCQkJCQl2YV9hcmcoYXAsIHZvaWQgKik7CisJCQkJCWdvdG8gaXNfaW50ZWdlcjsKKworCQkJCWNhc2UgJ2QnOgkvKiBTaWduZWQgZGVjaW1hbCBvdXRwdXQgKi8KKwkJCQljYXNlICdpJzoKKwkJCQkJYmFzZSA9IDEwOworCQkJCQlmbGFncyB8PSBGTF9TSUdORUQ7CisJCQkJCXN3aXRjaCAocmFuaykgeworCQkJCQljYXNlIHJhbmtfY2hhcjoKKwkJCQkJCS8qIFllcywgYWxsIHRoZXNlIGNhc3RzIGFyZQorCQkJCQkJICAgbmVlZGVkLi4uICovCisJCQkJCQl2YWwgPSAodWludG1heF90KShpbnRtYXhfdCkKKwkJCQkJCQkoc2lnbmVkIGNoYXIpCisJCQkJCQkJdmFfYXJnKGFwLCBzaWduZWQgaW50KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJhbmtfc2hvcnQ6CisJCQkJCQl2YWwgPSAodWludG1heF90KShpbnRtYXhfdCkKKwkJCQkJCQkoc2lnbmVkIHNob3J0KQorCQkJCQkJCXZhX2FyZyhhcCwgc2lnbmVkIGludCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSByYW5rX2ludDoKKwkJCQkJCXZhbCA9ICh1aW50bWF4X3QpKGludG1heF90KQorCQkJCQkJICAgIHZhX2FyZyhhcCwgc2lnbmVkIGludCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSByYW5rX2xvbmc6CisJCQkJCQl2YWwgPSAodWludG1heF90KShpbnRtYXhfdCkKKwkJCQkJCSAgICB2YV9hcmcoYXAsIHNpZ25lZCBsb25nKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJhbmtfbG9uZ2xvbmc6CisJCQkJCQl2YWwgPSAodWludG1heF90KShpbnRtYXhfdCkKKwkJCQkJCSAgICB2YV9hcmcoYXAsCisJCQkJCQkJICAgc2lnbmVkIGxvbmcgbG9uZyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlnb3RvIGlzX2ludGVnZXI7CisJCQkJY2FzZSAnbyc6CS8qIE9jdGFsICovCisJCQkJCWJhc2UgPSA4OworCQkJCQlnb3RvIGlzX3Vuc2lnbmVkOworCQkJCWNhc2UgJ3UnOgkvKiBVbnNpZ25lZCBkZWNpbWFsICovCisJCQkJCWJhc2UgPSAxMDsKKwkJCQkJZ290byBpc191bnNpZ25lZDsKKwkJCQljYXNlICdYJzoJLyogVXBwZXIgY2FzZSBoZXhhZGVjaW1hbCAqLworCQkJCQlmbGFncyB8PSBGTF9VUFBFUjsKKwkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJY2FzZSAneCc6CS8qIEhleGFkZWNpbWFsICovCisJCQkJCWJhc2UgPSAxNjsKKwkJCQkJZ290byBpc191bnNpZ25lZDsKKworCQkJCWlzX3Vuc2lnbmVkOgorCQkJCQlzd2l0Y2ggKHJhbmspIHsKKwkJCQkJY2FzZSByYW5rX2NoYXI6CisJCQkJCQl2YWwgPSAodWludG1heF90KQorCQkJCQkJCSh1bnNpZ25lZCBjaGFyKQorCQkJCQkJCXZhX2FyZyhhcCwgdW5zaWduZWQKKwkJCQkJCQkgICAgICAgaW50KTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJhbmtfc2hvcnQ6CisJCQkJCQl2YWwgPSAodWludG1heF90KQorCQkJCQkJCSh1bnNpZ25lZCBzaG9ydCkKKwkJCQkJCQl2YV9hcmcoYXAsIHVuc2lnbmVkCisJCQkJCQkJICAgICAgIGludCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSByYW5rX2ludDoKKwkJCQkJCXZhbCA9ICh1aW50bWF4X3QpCisJCQkJCQkJdmFfYXJnKGFwLCB1bnNpZ25lZAorCQkJCQkJCSAgICAgICBpbnQpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFua19sb25nOgorCQkJCQkJdmFsID0gKHVpbnRtYXhfdCkKKwkJCQkJCQl2YV9hcmcoYXAsIHVuc2lnbmVkCisJCQkJCQkJICAgICAgIGxvbmcpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFua19sb25nbG9uZzoKKwkJCQkJCXZhbCA9ICh1aW50bWF4X3QpCisJCQkJCQkJdmFfYXJnKGFwLCB1bnNpZ25lZAorCQkJCQkJCSAgICAgICBsb25nIGxvbmcpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJCQlpc19pbnRlZ2VyOgorCQkJCQlzeiA9IGZvcm1hdF9pbnQocSwgKG8gPCBuKSA/IG4gLSBvIDogMCwKKwkJCQkJCQl2YWwsIGZsYWdzLCBiYXNlLAorCQkJCQkJCXdpZHRoLCBwcmVjKTsKKwkJCQkJcSArPSBzejsKKwkJCQkJbyArPSBzejsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdjJzoJLyogQ2hhcmFjdGVyICovCisJCQkJCWNhcmcgPSAoY2hhcil2YV9hcmcoYXAsIGludCk7CisJCQkJCXNhcmcgPSAmY2FyZzsKKwkJCQkJc2xlbiA9IDE7CisJCQkJCWdvdG8gaXNfc3RyaW5nOworCQkJCWNhc2UgJ3MnOgkvKiBTdHJpbmcgKi8KKwkJCQkJc2FyZyA9IHZhX2FyZyhhcCwgY29uc3QgY2hhciAqKTsKKwkJCQkJc2FyZyA9IHNhcmcgPyBzYXJnIDogIihudWxsKSI7CisJCQkJCXNsZW4gPSBzdHJsZW4oc2FyZyk7CisJCQkJCWdvdG8gaXNfc3RyaW5nOworCisJCQkJaXNfc3RyaW5nOgorCQkJCQl7CisJCQkJCQljaGFyIHNjaDsKKwkJCQkJCWludCBpOworCisJCQkJCQlpZiAocHJlYyAhPSAtMSAmJiBzbGVuID4gcHJlYykKKwkJCQkJCQlzbGVuID0gcHJlYzsKKworCQkJCQkJaWYgKHdpZHRoID4gc2xlbgorCQkJCQkJICAgICYmICEoZmxhZ3MgJiBGTF9NSU5VUykpIHsKKwkJCQkJCQljaGFyIHBhZCA9CisJCQkJCQkJICAgIChmbGFncyAmIEZMX1pFUk8pID8KKwkJCQkJCQkgICAgJzAnIDogJyAnOworCQkJCQkJCXdoaWxlICh3aWR0aCA+IHNsZW4pIHsKKwkJCQkJCQkJRU1JVChwYWQpOworCQkJCQkJCQl3aWR0aC0tOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWZvciAoaSA9IHNsZW47IGk7IGktLSkgeworCQkJCQkJCXNjaCA9ICpzYXJnKys7CisJCQkJCQkJRU1JVChzY2gpOworCQkJCQkJfQorCQkJCQkJaWYgKHdpZHRoID4gc2xlbgorCQkJCQkJICAgICYmIChmbGFncyAmIEZMX01JTlVTKSkgeworCQkJCQkJCXdoaWxlICh3aWR0aCA+IHNsZW4pIHsKKwkJCQkJCQkJRU1JVCgnICcpOworCQkJCQkJCQl3aWR0aC0tOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ24nOgorCQkJCQl7CisJCQkJCQkvKiBPdXRwdXQgdGhlIG51bWJlciBvZgorCQkJCQkJICAgY2hhcmFjdGVycyB3cml0dGVuICovCisKKwkJCQkJCXN3aXRjaCAocmFuaykgeworCQkJCQkJY2FzZSByYW5rX2NoYXI6CisJCQkJCQkJKnZhX2FyZyhhcCwKKwkJCQkJCQkJc2lnbmVkIGNoYXIgKikKKwkJCQkJCQkJPSBvOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX3Nob3J0OgorCQkJCQkJCSp2YV9hcmcoYXAsCisJCQkJCQkJCXNpZ25lZCBzaG9ydCAqKQorCQkJCQkJCQk9IG87CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIHJhbmtfaW50OgorCQkJCQkJCSp2YV9hcmcoYXAsCisJCQkJCQkJCXNpZ25lZCBpbnQgKikKKwkJCQkJCQkJPSBvOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX2xvbmc6CisJCQkJCQkJKnZhX2FyZyhhcCwKKwkJCQkJCQkJc2lnbmVkIGxvbmcgKikKKwkJCQkJCQkJPSBvOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX2xvbmdsb25nOgorCQkJCQkJCSp2YV9hcmcoYXAsCisJCQkJCQkJCXNpZ25lZCBsb25nIGxvbmcgKikKKwkJCQkJCQkJPSBvOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoJLyogQW55dGhpbmcgZWxzZSwgaW5jbHVkaW5nICUgKi8KKwkJCQkJRU1JVChjaCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIE51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwlpZiAobyA8IG4pCisJCSpxID0gJ1wwJzsJLyogTm8gb3ZlcmZsb3cgKi8KKwllbHNlIGlmIChuID4gMCkKKwkJYnVmZmVyW24gLSAxXSA9ICdcMCc7CS8qIE92ZXJmbG93IC0gdGVybWluYXRlIGF0IGVuZCBvZiBidWZmZXIgKi8KKworCXJldHVybiBvOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3ZzcHJpbnRmLmMgYi91c3Iva2xpYmMvdnNwcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWY1ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3ZzcHJpbnRmLmMKQEAgLTAsMCArMSwxMSBAQAorLyoKKyAqIHZzcHJpbnRmLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworCXJldHVybiB2c25wcmludGYoYnVmZmVyLCB+KHNpemVfdCkgMCwgZm9ybWF0LCBhcCk7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvdnNzY2FuZi5jIGIvdXNyL2tsaWJjL3Zzc2NhbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWU1MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3Zzc2NhbmYuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIHZzc2NhbmYuYworICoKKyAqIHZzc2NhbmYoKSwgZnJvbSB3aGljaCB0aGUgcmVzdCBvZiB0aGUgc2NhbmYoKQorICogZmFtaWx5IGlzIGJ1aWx0CisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZuZGVmIExPTkdfQklUCisjZGVmaW5lIExPTkdfQklUIChDSEFSX0JJVCpzaXplb2YobG9uZykpCisjZW5kaWYKKworZW51bSBmbGFncyB7CisJRkxfU1BMQVQgPSAweDAxLAkvKiBEcm9wIHRoZSB2YWx1ZSwgZG8gbm90IGFzc2lnbiAqLworCUZMX0lOViAgID0gMHgwMiwJLyogQ2hhcmFjdGVyLXNldCB3aXRoIGludmVyc2UgKi8KKwlGTF9XSURUSCA9IDB4MDQsCS8qIEZpZWxkIHdpZHRoIHNwZWNpZmllZCAqLworCUZMX01JTlVTID0gMHgwOCwJLyogTmVnYXRpdmUgbnVtYmVyICovCit9OworCitlbnVtIHJhbmtzIHsKKwlyYW5rX2NoYXIgICAgID0gLTIsCisJcmFua19zaG9ydCAgICA9IC0xLAorCXJhbmtfaW50ICAgICAgPSAwLAorCXJhbmtfbG9uZyAgICAgPSAxLAorCXJhbmtfbG9uZ2xvbmcgPSAyLAorCXJhbmtfcHRyICAgICAgPSBJTlRfTUFYCS8qIFNwZWNpYWwgdmFsdWUgdXNlZCBmb3IgcG9pbnRlcnMgKi8KK307CisKKyNkZWZpbmUgTUlOX1JBTksJcmFua19jaGFyCisjZGVmaW5lIE1BWF9SQU5LCXJhbmtfbG9uZ2xvbmcKKworI2RlZmluZSBJTlRNQVhfUkFOSwlyYW5rX2xvbmdsb25nCisjZGVmaW5lIFNJWkVfVF9SQU5LCXJhbmtfbG9uZworI2RlZmluZSBQVFJESUZGX1RfUkFOSwlyYW5rX2xvbmcKKworZW51bSBiYWlsIHsKKwliYWlsX25vbmUgPSAwLAkJLyogTm8gZXJyb3IgY29uZGl0aW9uICovCisJYmFpbF9lb2YsCQkvKiBIaXQgRU9GICovCisJYmFpbF9lcnIJCS8qIENvbnZlcnNpb24gbWlzbWF0Y2ggKi8KK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqc2tpcHNwYWNlKGNvbnN0IGNoYXIgKnApCit7CisJd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnApKQorCQlwKys7CisJcmV0dXJuIHA7Cit9CisKKyN1bmRlZiBzZXRfYml0CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdCh1bnNpZ25lZCBsb25nICpiaXRtYXAsIHVuc2lnbmVkIGludCBiaXQpCit7CisJYml0bWFwW2JpdCAvIExPTkdfQklUXSB8PSAxVUwgPDwgKGJpdCAlIExPTkdfQklUKTsKK30KKworI3VuZGVmIHRlc3RfYml0CitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2JpdCh1bnNpZ25lZCBsb25nICpiaXRtYXAsIHVuc2lnbmVkIGludCBiaXQpCit7CisJcmV0dXJuIChpbnQpKGJpdG1hcFtiaXQgLyBMT05HX0JJVF0gPj4gKGJpdCAlIExPTkdfQklUKSkgJiAxOworfQorCitpbnQgdnNzY2FuZihjb25zdCBjaGFyICpidWZmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKwljb25zdCBjaGFyICpwID0gZm9ybWF0OworCWNoYXIgY2g7CisJdW5zaWduZWQgY2hhciB1YzsKKwljb25zdCBjaGFyICpxID0gYnVmZmVyOworCWNvbnN0IGNoYXIgKnFxOworCXVpbnRtYXhfdCB2YWwgPSAwOworCWludCByYW5rID0gcmFua19pbnQ7CS8qIERlZmF1bHQgcmFuayAqLworCXVuc2lnbmVkIGludCB3aWR0aCA9IFVJTlRfTUFYOworCWludCBiYXNlOworCWVudW0gZmxhZ3MgZmxhZ3MgPSAwOworCWVudW0geworCQlzdF9ub3JtYWwsCS8qIEdyb3VuZCBzdGF0ZSAqLworCQlzdF9mbGFncywJLyogU3BlY2lhbCBmbGFncyAqLworCQlzdF93aWR0aCwJLyogRmllbGQgd2lkdGggKi8KKwkJc3RfbW9kaWZpZXJzLAkvKiBMZW5ndGggb3IgY29udmVyc2lvbiBtb2RpZmllcnMgKi8KKwkJc3RfbWF0Y2hfaW5pdCwJLyogSW5pdGlhbCBzdGF0ZSBvZiAlWyBzZXF1ZW5jZSAqLworCQlzdF9tYXRjaCwJLyogTWFpbiBzdGF0ZSBvZiAlWyBzZXF1ZW5jZSAqLworCQlzdF9tYXRjaF9yYW5nZSwJLyogQWZ0ZXIgLSBpbiBhICVbIHNlcXVlbmNlICovCisJfSBzdGF0ZSA9IHN0X25vcm1hbDsKKwljaGFyICpzYXJnID0gTlVMTDsJLyogJXMgJWMgb3IgJVsgc3RyaW5nIGFyZ3VtZW50ICovCisJZW51bSBiYWlsIGJhaWwgPSBiYWlsX25vbmU7CisJaW50IHNpZ247CisJaW50IGNvbnZlcnRlZCA9IDA7CS8qIFN1Y2Nlc3NmdWwgY29udmVyc2lvbnMgKi8KKwl1bnNpZ25lZCBsb25nIG1hdGNobWFwWygoMSA8PCBDSEFSX0JJVCkgKyAoTE9OR19CSVQgLSAxKSkgLyBMT05HX0JJVF07CisJaW50IG1hdGNoaW52ID0gMDsJLyogSXMgbWF0Y2ggbWFwIGludmVydGVkPyAqLworCXVuc2lnbmVkIGNoYXIgcmFuZ2Vfc3RhcnQgPSAwOworCisJd2hpbGUgKChjaCA9ICpwKyspICYmICFiYWlsKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBzdF9ub3JtYWw6CisJCQlpZiAoY2ggPT0gJyUnKSB7CisJCQkJc3RhdGUgPSBzdF9mbGFnczsKKwkJCQlmbGFncyA9IDA7CisJCQkJcmFuayA9IHJhbmtfaW50OworCQkJCXdpZHRoID0gVUlOVF9NQVg7CisJCQl9IGVsc2UgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpY2gpKSB7CisJCQkJcSA9IHNraXBzcGFjZShxKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCpxID09IGNoKQorCQkJCQlxKys7CisJCQkJZWxzZQorCQkJCQliYWlsID0gYmFpbF9lcnI7IC8qIE1hdGNoIGZhaWx1cmUgKi8KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Ugc3RfZmxhZ3M6CisJCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICcqJzoKKwkJCQlmbGFncyB8PSBGTF9TUExBVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzAnLi4uJzknOgorCQkJCXdpZHRoID0gKGNoIC0gJzAnKTsKKwkJCQlzdGF0ZSA9IHN0X3dpZHRoOworCQkJCWZsYWdzIHw9IEZMX1dJRFRIOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzdGF0ZSA9IHN0X21vZGlmaWVyczsKKwkJCQlwLS07CS8qIFByb2Nlc3MgdGhpcyBjaGFyYWN0ZXIgYWdhaW4gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Ugc3Rfd2lkdGg6CisJCQlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworCQkJCXdpZHRoID0gd2lkdGggKiAxMCArIChjaCAtICcwJyk7CisJCQl9IGVsc2UgeworCQkJCXN0YXRlID0gc3RfbW9kaWZpZXJzOworCQkJCXAtLTsJLyogUHJvY2VzcyB0aGlzIGNoYXJhY3RlciBhZ2FpbiAqLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBzdF9tb2RpZmllcnM6CisJCQlzd2l0Y2ggKGNoKSB7CisJCQkJLyogTGVuZ3RoIG1vZGlmaWVycyAtIG5vbnRlcm1pbmFsIHNlcXVlbmNlcyAqLworCQkJY2FzZSAnaCc6CisJCQkJcmFuay0tOwkvKiBTaG9ydGVyIHJhbmsgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCXJhbmsrKzsJLyogTG9uZ2VyIHJhbmsgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2onOgorCQkJCXJhbmsgPSBJTlRNQVhfUkFOSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3onOgorCQkJCXJhbmsgPSBTSVpFX1RfUkFOSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCXJhbmsgPSBQVFJESUZGX1RfUkFOSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0wnOgorCQkJY2FzZSAncSc6CisJCQkJcmFuayA9IHJhbmtfbG9uZ2xvbmc7CS8qIGxvbmcgZG91YmxlL2xvbmcgbG9uZyAqLworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCS8qIE91dHB1dCBtb2RpZmllcnMgLSB0ZXJtaW5hbCBzZXF1ZW5jZXMgKi8KKwkJCQkvKiBOZXh0IHN0YXRlIHdpbGwgYmUgbm9ybWFsICovCisJCQkJc3RhdGUgPSBzdF9ub3JtYWw7CisKKwkJCQkvKiBDYW5vbmljYWxpemUgcmFuayAqLworCQkJCWlmIChyYW5rIDwgTUlOX1JBTkspCisJCQkJCXJhbmsgPSBNSU5fUkFOSzsKKwkJCQllbHNlIGlmIChyYW5rID4gTUFYX1JBTkspCisJCQkJCXJhbmsgPSBNQVhfUkFOSzsKKworCQkJCXN3aXRjaCAoY2gpIHsKKwkJCQljYXNlICdQJzoJLyogVXBwZXIgY2FzZSBwb2ludGVyICovCisJCQkJY2FzZSAncCc6CS8qIFBvaW50ZXIgKi8KKwkJCQkJcmFuayA9IHJhbmtfcHRyOworCQkJCQliYXNlID0gMDsKKwkJCQkJc2lnbiA9IDA7CisJCQkJCWdvdG8gc2Nhbl9pbnQ7CisKKwkJCQljYXNlICdpJzoJLyogQmFzZS1pbmRlcGVuZGVudCBpbnRlZ2VyICovCisJCQkJCWJhc2UgPSAwOworCQkJCQlzaWduID0gMTsKKwkJCQkJZ290byBzY2FuX2ludDsKKworCQkJCWNhc2UgJ2QnOgkvKiBEZWNpbWFsIGludGVnZXIgKi8KKwkJCQkJYmFzZSA9IDEwOworCQkJCQlzaWduID0gMTsKKwkJCQkJZ290byBzY2FuX2ludDsKKworCQkJCWNhc2UgJ28nOgkvKiBPY3RhbCBpbnRlZ2VyICovCisJCQkJCWJhc2UgPSA4OworCQkJCQlzaWduID0gMDsKKwkJCQkJZ290byBzY2FuX2ludDsKKworCQkJCWNhc2UgJ3UnOgkvKiBVbnNpZ25lZCBkZWNpbWFsIGludGVnZXIgKi8KKwkJCQkJYmFzZSA9IDEwOworCQkJCQlzaWduID0gMDsKKwkJCQkJZ290byBzY2FuX2ludDsKKworCQkJCWNhc2UgJ3gnOgkvKiBIZXhhZGVjaW1hbCBpbnRlZ2VyICovCisJCQkJY2FzZSAnWCc6CisJCQkJCWJhc2UgPSAxNjsKKwkJCQkJc2lnbiA9IDA7CisJCQkJCWdvdG8gc2Nhbl9pbnQ7CisKKwkJCQljYXNlICduJzoJLyogIyBvZiBjaGFyYWN0ZXJzIGNvbnN1bWVkICovCisJCQkJCXZhbCA9IChxIC0gYnVmZmVyKTsKKwkJCQkJZ290byBzZXRfaW50ZWdlcjsKKworCQkJCSAgICAgIHNjYW5faW50OgorCQkJCQlxID0gc2tpcHNwYWNlKHEpOworCQkJCQlpZiAoISpxKSB7CisJCQkJCQliYWlsID0gYmFpbF9lb2Y7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQl2YWwgPQorCQkJCQkgICAgc3RybnRvdW1heChxLCAoY2hhciAqKikmcXEsIGJhc2UsCisJCQkJCQkgICAgICAgd2lkdGgpOworCQkJCQlpZiAocXEgPT0gcSkgeworCQkJCQkJYmFpbCA9IGJhaWxfZXJyOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcSA9IHFxOworCQkJCQlpZiAoIShmbGFncyAmIEZMX1NQTEFUKSkKKwkJCQkJCWNvbnZlcnRlZCsrOworCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQkJCSAgICAgIHNldF9pbnRlZ2VyOgorCQkJCQlpZiAoIShmbGFncyAmIEZMX1NQTEFUKSkgeworCQkJCQkJc3dpdGNoIChyYW5rKSB7CisJCQkJCQljYXNlIHJhbmtfY2hhcjoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQl1bnNpZ25lZCBjaGFyICopCisJCQkJCQkJCT0gdmFsOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX3Nob3J0OgorCQkJCQkJCSp2YV9hcmcoYXAsCisJCQkJCQkJCXVuc2lnbmVkIHNob3J0CisJCQkJCQkJCSopID0gdmFsOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX2ludDoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQl1bnNpZ25lZCBpbnQgKikKKwkJCQkJCQkgICAgPSB2YWw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIHJhbmtfbG9uZzoKKwkJCQkJCQkqdmFfYXJnKGFwLAorCQkJCQkJCQl1bnNpZ25lZCBsb25nICopCisJCQkJCQkJCT0gdmFsOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSByYW5rX2xvbmdsb25nOgorCQkJCQkJCSp2YV9hcmcoYXAsCisJCQkJCQkJCXVuc2lnbmVkIGxvbmcKKwkJCQkJCQkJbG9uZyAqKSA9IHZhbDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgcmFua19wdHI6CisJCQkJCQkJKnZhX2FyZyhhcCwgdm9pZCAqKikgPQorCQkJCQkJCQkodm9pZCAqKQorCQkJCQkJCQkodWludHB0cl90KXZhbDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ2MnOgkvKiBDaGFyYWN0ZXIgKi8KKwkJCQkJLyogRGVmYXVsdCB3aWR0aCA9PSAxICovCisJCQkJCXdpZHRoID0gKGZsYWdzICYgRkxfV0lEVEgpID8gd2lkdGggOiAxOworCQkJCQlpZiAoZmxhZ3MgJiBGTF9TUExBVCkgeworCQkJCQkJd2hpbGUgKHdpZHRoLS0pIHsKKwkJCQkJCQlpZiAoISpxKSB7CisJCQkJCQkJCWJhaWwgPSBiYWlsX2VvZjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJc2FyZyA9IHZhX2FyZyhhcCwgY2hhciAqKTsKKwkJCQkJCXdoaWxlICh3aWR0aC0tKSB7CisJCQkJCQkJaWYgKCEqcSkgeworCQkJCQkJCQliYWlsID0gYmFpbF9lb2Y7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQkqc2FyZysrID0gKnErKzsKKwkJCQkJCX0KKwkJCQkJCWlmICghYmFpbCkKKwkJCQkJCQljb252ZXJ0ZWQrKzsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ3MnOgkvKiBTdHJpbmcgKi8KKwkJCQkJdWMgPSAxOwkvKiBBbnl0aGluZyBub256ZXJvICovCisJCQkJCWlmIChmbGFncyAmIEZMX1NQTEFUKSB7CisJCQkJCQl3aGlsZSAod2lkdGgtLSAmJiAodWMgPSAqcSkgJiYKKwkJCQkJCSAgICAgICAhaXNzcGFjZSh1YykpIHsKKwkJCQkJCQlxKys7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQljaGFyICpzcDsKKwkJCQkJCXNwID0gc2FyZyA9IHZhX2FyZyhhcCwgY2hhciAqKTsKKwkJCQkJCXdoaWxlICh3aWR0aC0tICYmICh1YyA9ICpxKSAmJgorCQkJCQkJICAgICAgICFpc3NwYWNlKHVjKSkgeworCQkJCQkJCSpzcCsrID0gdWM7CisJCQkJCQkJcSsrOworCQkJCQkJfQorCQkJCQkJaWYgKHNhcmcgIT0gc3ApIHsKKwkJCQkJCQkvKiBUZXJtaW5hdGUgb3V0cHV0ICovCisJCQkJCQkJKnNwID0gJ1wwJzsKKwkJCQkJCQljb252ZXJ0ZWQrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoIXVjKQorCQkJCQkJYmFpbCA9IGJhaWxfZW9mOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ1snOgkvKiBDaGFyYWN0ZXIgcmFuZ2UgKi8KKwkJCQkJc2FyZyA9IChmbGFncyAmIEZMX1NQTEFUKSA/IE5VTEwKKwkJCQkJCTogdmFfYXJnKGFwLCBjaGFyICopOworCQkJCQlzdGF0ZSA9IHN0X21hdGNoX2luaXQ7CisJCQkJCW1hdGNoaW52ID0gMDsKKwkJCQkJbWVtc2V0KG1hdGNobWFwLCAwLCBzaXplb2YgbWF0Y2htYXApOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJyUnOgkvKiAlJSBzZXF1ZW5jZSAqLworCQkJCQlpZiAoKnEgPT0gJyUnKQorCQkJCQkJcSsrOworCQkJCQllbHNlCisJCQkJCQliYWlsID0gYmFpbF9lcnI7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoJLyogQW55dGhpbmcgZWxzZSAqLworCQkJCQkvKiBVbmtub3duIHNlcXVlbmNlICovCisJCQkJCWJhaWwgPSBiYWlsX2VycjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBzdF9tYXRjaF9pbml0OgkvKiBJbml0aWFsIHN0YXRlIGZvciAlWyBtYXRjaCAqLworCQkJaWYgKGNoID09ICdeJyAmJiAhKGZsYWdzICYgRkxfSU5WKSkgeworCQkJCW1hdGNoaW52ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJc2V0X2JpdChtYXRjaG1hcCwgKHVuc2lnbmVkIGNoYXIpY2gpOworCQkJCXN0YXRlID0gc3RfbWF0Y2g7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHN0X21hdGNoOgkvKiBNYWluIHN0YXRlIGZvciAlWyBtYXRjaCAqLworCQkJaWYgKGNoID09ICddJykgeworCQkJCWdvdG8gbWF0Y2hfcnVuOworCQkJfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKwkJCQlyYW5nZV9zdGFydCA9ICh1bnNpZ25lZCBjaGFyKWNoOworCQkJCXN0YXRlID0gc3RfbWF0Y2hfcmFuZ2U7CisJCQl9IGVsc2UgeworCQkJCXNldF9iaXQobWF0Y2htYXAsICh1bnNpZ25lZCBjaGFyKWNoKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Ugc3RfbWF0Y2hfcmFuZ2U6CS8qICVbIG1hdGNoIGFmdGVyIC0gKi8KKwkJCWlmIChjaCA9PSAnXScpIHsKKwkJCQkvKiAtIHdhcyBsYXN0IGNoYXJhY3RlciAqLworCQkJCXNldF9iaXQobWF0Y2htYXAsICh1bnNpZ25lZCBjaGFyKSctJyk7CisJCQkJZ290byBtYXRjaF9ydW47CisJCQl9IGVsc2UgeworCQkJCWludCBpOworCQkJCWZvciAoaSA9IHJhbmdlX3N0YXJ0OyBpIDwgKHVuc2lnbmVkIGNoYXIpY2g7CisJCQkJICAgICBpKyspCisJCQkJCXNldF9iaXQobWF0Y2htYXAsIGkpOworCQkJCXN0YXRlID0gc3RfbWF0Y2g7CisJCQl9CisJCQlicmVhazsKKworCQkgICAgICBtYXRjaF9ydW46CS8qIE1hdGNoIGV4cHJlc3Npb24gZmluaXNoZWQgKi8KKwkJCXFxID0gcTsKKwkJCXVjID0gMTsJLyogQW55dGhpbmcgbm9uemVybyAqLworCQkJd2hpbGUgKHdpZHRoICYmICh1YyA9ICpxKQorCQkJICAgICAgICYmIHRlc3RfYml0KG1hdGNobWFwLCB1YylebWF0Y2hpbnYpIHsKKwkJCQlpZiAoc2FyZykKKwkJCQkJKnNhcmcrKyA9IHVjOworCQkJCXErKzsKKwkJCX0KKwkJCWlmIChxICE9IHFxICYmIHNhcmcpIHsKKwkJCQkqc2FyZyA9ICdcMCc7CisJCQkJY29udmVydGVkKys7CisJCQl9IGVsc2UgeworCQkJCWJhaWwgPSBiYWlsX2VycjsKKwkJCX0KKwkJCWlmICghdWMpCisJCQkJYmFpbCA9IGJhaWxfZW9mOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYmFpbCA9PSBiYWlsX2VvZiAmJiAhY29udmVydGVkKQorCQljb252ZXJ0ZWQgPSAtMTsJLyogUmV0dXJuIEVPRiAoLTEpICovCisKKwlyZXR1cm4gY29udmVydGVkOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3dhaXQuYyBiL3Vzci9rbGliYy93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiYjFhMgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy93YWl0LmMKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIHdhaXQuYworICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitwaWRfdCB3YWl0KGludCAqc3RhdHVzKQoreworCXJldHVybiB3YWl0NCgocGlkX3QpIC0gMSwgc3RhdHVzLCAwLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy93YWl0My5jIGIvdXNyL2tsaWJjL3dhaXQzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzNTQxNAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy93YWl0My5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiB3YWl0My5jCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKK3BpZF90IHdhaXQzKGludCAqc3RhdHVzLCBpbnQgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSAqIHJ1c2FnZSkKK3sKKwlyZXR1cm4gd2FpdDQoKHBpZF90KSAtIDEsIHN0YXR1cywgb3B0aW9ucywgcnVzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy93YWl0cGlkLmMgYi91c3Iva2xpYmMvd2FpdHBpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTcxMjIKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvd2FpdHBpZC5jCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiB3YWl0cGlkLmMKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworcGlkX3Qgd2FpdHBpZChwaWRfdCBwaWQsIGludCAqc3RhdHVzLCBpbnQgb3B0aW9ucykKK3sKKwlyZXR1cm4gd2FpdDQocGlkLCBzdGF0dXMsIG9wdGlvbnMsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvRkFRIGIvdXNyL2tsaWJjL3psaWIvRkFRCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWQ5MTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9GQVEKQEAgLTAsMCArMSwzMzkgQEAKKworICAgICAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKKworCitJZiB5b3VyIHF1ZXN0aW9uIGlzIG5vdCB0aGVyZSwgcGxlYXNlIGNoZWNrIHRoZSB6bGliIGhvbWUgcGFnZQoraHR0cDovL3d3dy56bGliLm9yZyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KK1RoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCisKKworIDEuIElzIHpsaWIgWTJLLWNvbXBsaWFudD8KKworICAgIFllcy4gemxpYiBkb2Vzbid0IGhhbmRsZSBkYXRlcy4KKworIDIuIFdoZXJlIGNhbiBJIGdldCBhIFdpbmRvd3MgRExMIHZlcnNpb24/CisKKyAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLgorICAgIFNlZSB0aGUgZmlsZSB3aW4zMi9ETExfRkFRLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24uCisgICAgUG9pbnRlcnMgdG8gdGhlIHByZWNvbXBpbGVkIERMTCBhcmUgZm91bmQgaW4gdGhlIHpsaWIgd2ViIHNpdGUgYXQKKyAgICBodHRwOi8vd3d3LnpsaWIub3JnLgorCisgMy4gV2hlcmUgY2FuIEkgZ2V0IGEgVmlzdWFsIEJhc2ljIGludGVyZmFjZSB0byB6bGliPworCisgICAgU2VlCisgICAgICAgICogaHR0cDovL3d3dy5kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCisgICAgICAgICogY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbgorICAgICAgICAqIHdpbjMyL0RMTF9GQVEudHh0IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbgorCisgNC4gY29tcHJlc3MoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgorCisgICAgTWFrZSBzdXJlIHRoYXQgYmVmb3JlIHRoZSBjYWxsIG9mIGNvbXByZXNzLCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkCisgICAgYnVmZmVyIGlzIGVxdWFsIHRvIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBhbmQgbm90CisgICAgemVyby4gRm9yIFZpc3VhbCBCYXNpYywgY2hlY2sgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCisgICAgKCJhcyBhbnkiKSwgbm90IGJ5IHZhbHVlICgiYXMgbG9uZyIpLgorCisgNS4gZGVmbGF0ZSgpIG9yIGluZmxhdGUoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgorCisgICAgQmVmb3JlIG1ha2luZyB0aGUgY2FsbCwgbWFrZSBzdXJlIHRoYXQgYXZhaWxfaW4gYW5kIGF2YWlsX291dCBhcmUgbm90CisgICAgemVyby4gV2hlbiBzZXR0aW5nIHRoZSBwYXJhbWV0ZXIgZmx1c2ggZXF1YWwgdG8gWl9GSU5JU0gsIGFsc28gbWFrZSBzdXJlCisgICAgdGhhdCBhdmFpbF9vdXQgaXMgYmlnIGVub3VnaCB0byBhbGxvdyBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGlucHV0LgorICAgIE5vdGUgdGhhdCBhIFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbC0tYW5vdGhlciBjYWxsIHRvIGRlZmxhdGUoKSBvcgorICAgIGluZmxhdGUoKSBjYW4gYmUgbWFkZSB3aXRoIG1vcmUgaW5wdXQgb3Igb3V0cHV0IHNwYWNlLiBBIFpfQlVGX0VSUk9SCisgICAgbWF5IGluIGZhY3QgYmUgdW5hdm9pZGFibGUgZGVwZW5kaW5nIG9uIGhvdyB0aGUgZnVuY3Rpb25zIGFyZSB1c2VkLCBzaW5jZQorICAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIG1vcmUgb3V0cHV0IHBlbmRpbmcKKyAgICB3aGVuIHN0cm0uYXZhaWxfb3V0IHJldHVybnMgd2l0aCB6ZXJvLgorCisgNi4gV2hlcmUncyB0aGUgemxpYiBkb2N1bWVudGF0aW9uIChtYW4gcGFnZXMsIGV0Yy4pPworCisgICAgSXQncyBpbiB6bGliLmggZm9yIHRoZSBtb21lbnQsIGFuZCBGcmFuY2lzIFMuIExpbiBoYXMgY29udmVydGVkIGl0IHRvIGEKKyAgICB3ZWIgcGFnZSB6bGliLmh0bWwuIFZvbHVudGVlcnMgdG8gdHJhbnNmb3JtIHRoaXMgdG8gVW5peC1zdHlsZSBtYW4gcGFnZXMsCisgICAgcGxlYXNlIGNvbnRhY3QgdXMgKHpsaWJAZ3ppcC5vcmcpLiBFeGFtcGxlcyBvZiB6bGliIHVzYWdlIGFyZSBpbiB0aGUgZmlsZXMKKyAgICBleGFtcGxlLmMgYW5kIG1pbmlnemlwLmMuCisKKyA3LiBXaHkgZG9uJ3QgeW91IHVzZSBHTlUgYXV0b2NvbmYgb3IgbGlidG9vbCBvciAuLi4/CisKKyAgICBCZWNhdXNlIHdlIHdvdWxkIGxpa2UgdG8ga2VlcCB6bGliIGFzIGEgdmVyeSBzbWFsbCBhbmQgc2ltcGxlCisgICAgcGFja2FnZS4gemxpYiBpcyByYXRoZXIgcG9ydGFibGUgYW5kIGRvZXNuJ3QgbmVlZCBtdWNoIGNvbmZpZ3VyYXRpb24uCisKKyA4LiBJIGZvdW5kIGEgYnVnIGluIHpsaWIuCisKKyAgICBNb3N0IG9mIHRoZSB0aW1lLCBzdWNoIHByb2JsZW1zIGFyZSBkdWUgdG8gYW4gaW5jb3JyZWN0IHVzYWdlIG9mCisgICAgemxpYi4gUGxlYXNlIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIHNtYWxsIHByb2dyYW0gYW5kIHNlbmQKKyAgICB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgdG8gdXMgYXQgemxpYkBnemlwLm9yZyAuIERvIG5vdCBzZW5kCisgICAgbXVsdGktbWVnYWJ5dGUgZGF0YSBmaWxlcyB3aXRob3V0IHByaW9yIGFncmVlbWVudC4KKworIDkuIFdoeSBkbyBJIGdldCAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBnenB1dGMiPworCisgICAgSWYgIm1ha2UgdGVzdCIgcHJvZHVjZXMgc29tZXRoaW5nIGxpa2UKKworICAgICAgIGV4YW1wbGUubygudGV4dCsweDE1NCk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYGd6cHV0YycKKworICAgIGNoZWNrIHRoYXQgeW91IGRvbid0IGhhdmUgb2xkIGZpbGVzIGxpYnouKiBpbiAvdXNyL2xpYiwgL3Vzci9sb2NhbC9saWIgb3IKKyAgICAvdXNyL1gxMVI2L2xpYi4gUmVtb3ZlIGFueSBvbGQgdmVyc2lvbnMsIHRoZW4gZG8gIm1ha2UgaW5zdGFsbCIuCisKKzEwLiBJIG5lZWQgYSBEZWxwaGkgaW50ZXJmYWNlIHRvIHpsaWIuCisKKyAgICBTZWUgdGhlIGNvbnRyaWIvZGVscGhpIGRpcmVjdG9yeSBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24uCisKKzExLiBDYW4gemxpYiBoYW5kbGUgLnppcCBhcmNoaXZlcz8KKworICAgIE5vdCBieSBpdHNlbGYsIG5vLiAgU2VlIHRoZSBkaXJlY3RvcnkgY29udHJpYi9taW5pemlwIGluIHRoZSB6bGliCisgICAgZGlzdHJpYnV0aW9uLgorCisxMi4gQ2FuIHpsaWIgaGFuZGxlIC5aIGZpbGVzPworCisgICAgTm8sIHNvcnJ5LiBZb3UgaGF2ZSB0byBzcGF3biBhbiB1bmNvbXByZXNzIG9yIGd1bnppcCBzdWJwcm9jZXNzLCBvciBhZGFwdAorICAgIHRoZSBjb2RlIG9mIHVuY29tcHJlc3Mgb24geW91ciBvd24uCisKKzEzLiBIb3cgY2FuIEkgbWFrZSBhIFVuaXggc2hhcmVkIGxpYnJhcnk/CisKKyAgICBtYWtlIGNsZWFuCisgICAgLi9jb25maWd1cmUgLXMKKyAgICBtYWtlCisKKzE0LiBIb3cgZG8gSSBpbnN0YWxsIGEgc2hhcmVkIHpsaWIgbGlicmFyeSBvbiBVbml4PworCisgICAgQWZ0ZXIgdGhlIGFib3ZlLCB0aGVuOgorCisgICAgbWFrZSBpbnN0YWxsCisKKyAgICBIb3dldmVyLCBtYW55IGZsYXZvcnMgb2YgVW5peCBjb21lIHdpdGggYSBzaGFyZWQgemxpYiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICBCZWZvcmUgZ29pbmcgdG8gdGhlIHRyb3VibGUgb2YgY29tcGlsaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgemxpYiBhbmQKKyAgICB0cnlpbmcgdG8gaW5zdGFsbCBpdCwgeW91IG1heSB3YW50IHRvIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSB0aGVyZSEgSWYgeW91CisgICAgY2FuICNpbmNsdWRlIDx6bGliLmg+LCBpdCdzIHRoZXJlLiBUaGUgLWx6IG9wdGlvbiB3aWxsIHByb2JhYmx5IGxpbmsgdG8gaXQuCisKKzE1LiBJIGhhdmUgYSBxdWVzdGlvbiBhYm91dCBPdHRvUERGLgorCisgICAgV2UgYXJlIG5vdCB0aGUgYXV0aG9ycyBvZiBPdHRvUERGLiBUaGUgcmVhbCBhdXRob3IgaXMgb24gdGhlIE90dG9QREYgd2ViCisgICAgc2l0ZTogSm9lbCBIYWlubGV5LCBqaGFpbmxleUBteW5ka3J5bWUuY29tLgorCisxNi4gQ2FuIHpsaWIgZGVjb2RlIEZsYXRlIGRhdGEgaW4gYW4gQWRvYmUgUERGIGZpbGU/CisKKyAgICBZZXMuIFNlZSBodHRwOi8vd3d3LmZhc3Rpby5jb20vIChDbGliUERGKSwgb3IgaHR0cDovL3d3dy5wZGZsaWIuY29tLyAuCisgICAgVG8gbW9kaWZ5IFBERiBmb3Jtcywgc2VlIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNyb2Zvcm10b29sLyAuCisKKzE3LiBXaHkgYW0gSSBnZXR0aW5nIHRoaXMgInJlZ2lzdGVyX2ZyYW1lX2luZm8gbm90IGZvdW5kIiBlcnJvciBvbiBTb2xhcmlzPworCisgICAgQWZ0ZXIgaW5zdGFsbGluZyB6bGliIDEuMS40IG9uIFNvbGFyaXMgMi42LCBydW5uaW5nIGFwcGxpY2F0aW9ucyB1c2luZyB6bGliCisgICAgZ2VuZXJhdGVzIGFuIGVycm9yIHN1Y2ggYXM6CisKKyAgICAgICAgbGQuc28uMTogcnBtOiBmYXRhbDogcmVsb2NhdGlvbiBlcnJvcjogZmlsZSAvdXNyL2xvY2FsL2xpYi9saWJ6LnNvOgorICAgICAgICBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvOiByZWZlcmVuY2VkIHN5bWJvbCBub3QgZm91bmQKKworICAgIFRoZSBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvIGlzIG5vdCBwYXJ0IG9mIHpsaWIsIGl0IGlzIGdlbmVyYXRlZCBieQorICAgIHRoZSBDIGNvbXBpbGVyIChjYyBvciBnY2MpLiBZb3UgbXVzdCByZWNvbXBpbGUgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKKyAgICB3aGljaCBoYXZlIHRoaXMgcHJvYmxlbS4gVGhpcyBwcm9ibGVtIGlzIHNwZWNpZmljIHRvIFNvbGFyaXMuIFNlZQorICAgIGh0dHA6Ly93d3cuc3VuZnJlZXdhcmUuY29tIGZvciBTb2xhcmlzIHZlcnNpb25zIG9mIHpsaWIgYW5kIGFwcGxpY2F0aW9ucworICAgIHVzaW5nIHpsaWIuCisKKzE4LiBXaHkgZG9lcyBnemlwIGdpdmUgYW4gZXJyb3Igb24gYSBmaWxlIEkgbWFrZSB3aXRoIGNvbXByZXNzL2RlZmxhdGU/CisKKyAgICBUaGUgY29tcHJlc3MgYW5kIGRlZmxhdGUgZnVuY3Rpb25zIHByb2R1Y2UgZGF0YSBpbiB0aGUgemxpYiBmb3JtYXQsIHdoaWNoCisgICAgaXMgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZ3ppcCBmb3JtYXQuIFRoZSBneiogZnVuY3Rpb25zIGluCisgICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiBCb3RoIHRoZSB6bGliIGFuZCBnemlwCisgICAgZm9ybWF0cyB1c2UgdGhlIHNhbWUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCBpbnRlcm5hbGx5LCBidXQgaGF2ZSBkaWZmZXJlbnQKKyAgICBoZWFkZXJzIGFuZCB0cmFpbGVycyBhcm91bmQgdGhlIGNvbXByZXNzZWQgZGF0YS4KKworMTkuIE9rLCBzbyB3aHkgYXJlIHRoZXJlIHR3byBkaWZmZXJlbnQgZm9ybWF0cz8KKworICAgIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gcmV0YWluIHRoZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gYWJvdXQKKyAgICBhIHNpbmdsZSBmaWxlLCBzdWNoIGFzIHRoZSBuYW1lIGFuZCBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlLiBUaGUgemxpYgorICAgIGZvcm1hdCBvbiB0aGUgb3RoZXIgaGFuZCB3YXMgZGVzaWduZWQgZm9yIGluLW1lbW9yeSBhbmQgY29tbXVuaWNhdGlvbgorICAgIGNoYW5uZWwgYXBwbGljYXRpb25zLCBhbmQgaGFzIGEgbXVjaCBtb3JlIGNvbXBhY3QgaGVhZGVyIGFuZCB0cmFpbGVyIGFuZAorICAgIHVzZXMgYSBmYXN0ZXIgaW50ZWdyaXR5IGNoZWNrIHRoYW4gZ3ppcC4KKworMjAuIFdlbGwgdGhhdCdzIG5pY2UsIGJ1dCBob3cgZG8gSSBtYWtlIGEgZ3ppcCBmaWxlIGluIG1lbW9yeT8KKworICAgIFlvdSBjYW4gcmVxdWVzdCB0aGF0IGRlZmxhdGUgd3JpdGUgdGhlIGd6aXAgZm9ybWF0IGluc3RlYWQgb2YgdGhlIHpsaWIKKyAgICBmb3JtYXQgdXNpbmcgZGVmbGF0ZUluaXQyKCkuIFlvdSBjYW4gYWxzbyByZXF1ZXN0IHRoYXQgaW5mbGF0ZSBkZWNvZGUKKyAgICB0aGUgZ3ppcCBmb3JtYXQgdXNpbmcgaW5mbGF0ZUluaXQyKCkuIFJlYWQgemxpYi5oIGZvciBtb3JlIGRldGFpbHMuCisKKzIxLiBJcyB6bGliIHRocmVhZC1zYWZlPworCisgICAgWWVzLiBIb3dldmVyIGFueSBsaWJyYXJ5IHJvdXRpbmVzIHRoYXQgemxpYiB1c2VzIGFuZCBhbnkgYXBwbGljYXRpb24tCisgICAgcHJvdmlkZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgbXVzdCBhbHNvIGJlIHRocmVhZC1zYWZlLiB6bGliJ3MgZ3oqCisgICAgZnVuY3Rpb25zIHVzZSBzdGRpbyBsaWJyYXJ5IHJvdXRpbmVzLCBhbmQgbW9zdCBvZiB6bGliJ3MgZnVuY3Rpb25zIHVzZSB0aGUKKyAgICBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGJ5IGRlZmF1bHQuIHpsaWIncyBJbml0IGZ1bmN0aW9ucyBhbGxvdworICAgIGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKKyAgICBPZiBjb3Vyc2UsIHlvdSBzaG91bGQgb25seSBvcGVyYXRlIG9uIGFueSBnaXZlbiB6bGliIG9yIGd6aXAgc3RyZWFtIGZyb20gYQorICAgIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLgorCisyMi4gQ2FuIEkgdXNlIHpsaWIgaW4gbXkgY29tbWVyY2lhbCBhcHBsaWNhdGlvbj8KKworICAgIFllcy4gUGxlYXNlIHJlYWQgdGhlIGxpY2Vuc2UgaW4gemxpYi5oLgorCisyMy4gSXMgemxpYiB1bmRlciB0aGUgR05VIGxpY2Vuc2U/CisKKyAgICBOby4gUGxlYXNlIHJlYWQgdGhlIGxpY2Vuc2UgaW4gemxpYi5oLgorCisyNC4gVGhlIGxpY2Vuc2Ugc2F5cyB0aGF0IGFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgInBsYWlubHkgbWFya2VkIi4gU28KKyAgICB3aGF0IGV4YWN0bHkgZG8gSSBuZWVkIHRvIGRvIHRvIG1lZXQgdGhhdCByZXF1aXJlbWVudD8KKworICAgIFlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgWkxJQl9WRVJTSU9OIGFuZCBaTElCX1ZFUk5VTSAjZGVmaW5lcyBpbiB6bGliLmguIEluCisgICAgcGFydGljdWxhciwgdGhlIGZpbmFsIHZlcnNpb24gbnVtYmVyIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gImYiLCBhbmQgYW4KKyAgICBpZGVudGlmaWNhdGlvbiBzdHJpbmcgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIFpMSUJfVkVSU0lPTi4gVmVyc2lvbiBudW1iZXJzCisgICAgeC54LnguZiBhcmUgcmVzZXJ2ZWQgZm9yIG1vZGlmaWNhdGlvbnMgdG8gemxpYiBieSBvdGhlcnMgdGhhbiB0aGUgemxpYgorICAgIG1haW50YWluZXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgemxpYiB5b3UgYXJlIGFsdGVyaW5nCisgICAgaXMgIjEuMi4zLjQiLCB0aGVuIGluIHpsaWIuaCB5b3Ugc2hvdWxkIGNoYW5nZSBaTElCX1ZFUk5VTSB0byAweDEyM2YsIGFuZAorICAgIFpMSUJfVkVSU0lPTiB0byBzb21ldGhpbmcgbGlrZSAiMS4yLjMuZi16YWNoYXJ5LW1vZHMtdjMiLiBZb3UgY2FuIGFsc28KKyAgICB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5ncyBpbiBkZWZsYXRlLmMgYW5kIGluZnRyZWVzLmMuCisKKyAgICBGb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9ucywgeW91IHNob3VsZCBhbHNvIG5vdGUgdGhlIG9yaWdpbiBhbmQKKyAgICBuYXR1cmUgb2YgdGhlIGNoYW5nZXMgaW4gemxpYi5oLCBhcyB3ZWxsIGFzIGluIENoYW5nZUxvZyBhbmQgUkVBRE1FLCBhbG9uZworICAgIHdpdGggdGhlIGRhdGVzIG9mIHRoZSBhbHRlcmF0aW9ucy4gVGhlIG9yaWdpbiBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCB5b3VyCisgICAgbmFtZSAob3IgeW91ciBjb21wYW55J3MgbmFtZSksIGFuZCBhbiBlbWFpbCBhZGRyZXNzIHRvIGNvbnRhY3QgZm9yIGhlbHAgb3IKKyAgICBpc3N1ZXMgd2l0aCB0aGUgbGlicmFyeS4KKworICAgIE5vdGUgdGhhdCBkaXN0cmlidXRpbmcgYSBjb21waWxlZCB6bGliIGxpYnJhcnkgYWxvbmcgd2l0aCB6bGliLmggYW5kCisgICAgemNvbmYuaCBpcyBhbHNvIGEgc291cmNlIGRpc3RyaWJ1dGlvbiwgYW5kIHNvIHlvdSBzaG91bGQgY2hhbmdlCisgICAgWkxJQl9WRVJTSU9OIGFuZCBaTElCX1ZFUk5VTSBhbmQgbm90ZSB0aGUgb3JpZ2luIGFuZCBuYXR1cmUgb2YgdGhlIGNoYW5nZXMKKyAgICBpbiB6bGliLmggYXMgeW91IHdvdWxkIGZvciBhIGZ1bGwgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworMjUuIFdpbGwgemxpYiB3b3JrIG9uIGEgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZSwgYW5kIGNhbiBJCisgICAgZXhjaGFuZ2UgY29tcHJlc3NlZCBkYXRhIGJldHdlZW4gdGhlbT8KKworICAgIFllcyBhbmQgeWVzLgorCisyNi4gV2lsbCB6bGliIHdvcmsgb24gYSA2NC1iaXQgbWFjaGluZT8KKworICAgIEl0IHNob3VsZC4gSXQgaGFzIGJlZW4gdGVzdGVkIG9uIDY0LWJpdCBtYWNoaW5lcywgYW5kIGhhcyBubyBkZXBlbmRlbmNlCisgICAgb24gYW55IGRhdGEgdHlwZXMgYmVpbmcgbGltaXRlZCB0byAzMi1iaXRzIGluIGxlbmd0aC4gSWYgeW91IGhhdmUgYW55CisgICAgZGlmZmljdWx0aWVzLCBwbGVhc2UgcHJvdmlkZSBhIGNvbXBsZXRlIHByb2JsZW0gcmVwb3J0IHRvIHpsaWJAZ3ppcC5vcmcKKworMjcuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KKworICAgIE5vLiBUaGUgUEtXYXJlIERDTCB1c2VzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAorICAgIHRoYW4gZG9lcyBQS1pJUCBhbmQgemxpYi4gSG93ZXZlciwgeW91IGNhbiBsb29rIGluIHpsaWIncyBjb250cmliL2JsYXN0CisgICAgZGlyZWN0b3J5IGZvciBhIHBvc3NpYmxlIHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4KKworMjguIENhbiBJIGFjY2VzcyBkYXRhIHJhbmRvbWx5IGluIGEgY29tcHJlc3NlZCBzdHJlYW0/CisKKyAgICBObywgbm90IHdpdGhvdXQgc29tZSBwcmVwYXJhdGlvbi4gSWYgd2hlbiBjb21wcmVzc2luZyB5b3UgcGVyaW9kaWNhbGx5CisgICAgdXNlIFpfRlVMTF9GTFVTSCwgY2FyZWZ1bGx5IHdyaXRlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGF0IHRob3NlIHBvaW50cywKKyAgICBhbmQga2VlcCBhbiBpbmRleCBvZiB0aG9zZSBsb2NhdGlvbnMsIHRoZW4geW91IGNhbiBzdGFydCBkZWNvbXByZXNzaW9uCisgICAgYXQgdGhvc2UgcG9pbnRzLiBZb3UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIG5vdCB1c2UgWl9GVUxMX0ZMVVNIIHRvbworICAgIG9mdGVuLCBzaW5jZSBpdCBjYW4gc2lnbmlmaWNhbnRseSBkZWdyYWRlIGNvbXByZXNzaW9uLgorCisyOS4gRG9lcyB6bGliIHdvcmsgb24gTVZTLCBPUy8zOTAsIENJQ1MsIGV0Yy4/CisKKyAgICBXZSBkb24ndCBrbm93IGZvciBzdXJlLiBXZSBoYXZlIGhlYXJkIG9jY2FzaW9uYWwgcmVwb3J0cyBvZiBzdWNjZXNzIG9uCisgICAgdGhlc2Ugc3lzdGVtcy4gSWYgeW91IGRvIHVzZSBpdCBvbiBvbmUgb2YgdGhlc2UsIHBsZWFzZSBwcm92aWRlIHVzIHdpdGgKKyAgICBhIHJlcG9ydCwgaW5zdHJ1Y3Rpb25zLCBhbmQgcGF0Y2hlcyB0aGF0IHdlIGNhbiByZWZlcmVuY2Ugd2hlbiB3ZSBnZXQKKyAgICB0aGVzZSBxdWVzdGlvbnMuIFRoYW5rcy4KKworMzAuIElzIHRoZXJlIHNvbWUgc2ltcGxlciwgZWFzaWVyIHRvIHJlYWQgdmVyc2lvbiBvZiBpbmZsYXRlIEkgY2FuIGxvb2sgYXQKKyAgICB0byB1bmRlcnN0YW5kIHRoZSBkZWZsYXRlIGZvcm1hdD8KKworICAgIEZpcnN0IG9mZiwgeW91IHNob3VsZCByZWFkIFJGQyAxOTUxLiBTZWNvbmQsIHllcy4gTG9vayBpbiB6bGliJ3MKKyAgICBjb250cmliL3B1ZmYgZGlyZWN0b3J5LgorCiszMS4gRG9lcyB6bGliIGluZnJpbmdlIG9uIGFueSBwYXRlbnRzPworCisgICAgQXMgZmFyIGFzIHdlIGtub3csIG5vLiBJbiBmYWN0LCB0aGF0IHdhcyBvcmlnaW5hbGx5IHRoZSB3aG9sZSBwb2ludCBiZWhpbmQKKyAgICB6bGliLiBMb29rIGhlcmUgZm9yIHNvbWUgbW9yZSBpbmZvcm1hdGlvbjoKKworICAgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvI2ZhcTExCisKKzMyLiBDYW4gemxpYiB3b3JrIHdpdGggZ3JlYXRlciB0aGFuIDQgR0Igb2YgZGF0YT8KKworICAgIFllcy4gaW5mbGF0ZSgpIGFuZCBkZWZsYXRlKCkgd2lsbCBwcm9jZXNzIGFueSBhbW91bnQgb2YgZGF0YSBjb3JyZWN0bHkuCisgICAgRWFjaCBjYWxsIG9mIGluZmxhdGUoKSBvciBkZWZsYXRlKCkgaXMgbGltaXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IGNodW5rcworICAgIG9mIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiB0aGUgY29tcGlsZXIncyAidW5zaWduZWQgaW50IgorICAgIHR5cGUsIGJ1dCB0aGVyZSBpcyBubyBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGNodW5rcy4gTm90ZSBob3dldmVyIHRoYXQgdGhlCisgICAgc3RybS50b3RhbF9pbiBhbmQgc3RybV90b3RhbF9vdXQgY291bnRlcnMgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQi4gVGhlc2UKKyAgICBjb3VudGVycyBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBhbmQgYXJlIG5vdCB1c2VkIGludGVybmFsbHkgYnkKKyAgICBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpLiBUaGUgYXBwbGljYXRpb24gY2FuIGVhc2lseSBzZXQgdXAgaXRzIG93biBjb3VudGVycworICAgIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBjYWxsIG9mIGluZmxhdGUoKSBvciBkZWZsYXRlKCkgdG8gY291bnQgYmV5b25kIDQgR0IuCisgICAgY29tcHJlc3MoKSBhbmQgdW5jb21wcmVzcygpIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IsIHNpbmNlIHRoZXkgb3BlcmF0ZSBpbiBhCisgICAgc2luZ2xlIGNhbGwuIGd6c2VlaygpIGFuZCBnenRlbGwoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCIGRlcGVuZGluZyBvbiBob3cKKyAgICB6bGliIGlzIGNvbXBpbGVkLiBTZWUgdGhlIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiBpbiB6bGliLmguCisKKyAgICBUaGUgd29yZCAibWF5IiBhcHBlYXJzIHNldmVyYWwgdGltZXMgYWJvdmUgc2luY2UgdGhlcmUgaXMgYSA0IEdCIGxpbWl0CisgICAgb25seSBpZiB0aGUgY29tcGlsZXIncyAibG9uZyIgdHlwZSBpcyAzMiBiaXRzLiBJZiB0aGUgY29tcGlsZXIncyAibG9uZyIKKyAgICB0eXBlIGlzIDY0IGJpdHMsIHRoZW4gdGhlIGxpbWl0IGlzIDE2IGV4YWJ5dGVzLgorCiszMy4gRG9lcyB6bGliIGhhdmUgYW55IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcz8KKworICAgIFRoZSBvbmx5IG9uZSB0aGF0IHdlIGFyZSBhd2FyZSBvZiBpcyBwb3RlbnRpYWxseSBpbiBnenByaW50ZigpLiBJZiB6bGliCisgICAgaXMgY29tcGlsZWQgdG8gdXNlIHNwcmludGYoKSBvciB2c3ByaW50ZigpLCB0aGVuIHRoZXJlIGlzIG5vIHByb3RlY3Rpb24KKyAgICBhZ2FpbnN0IGEgYnVmZmVyIG92ZXJmbG93IG9mIGEgNEsgc3RyaW5nIHNwYWNlLCBvdGhlciB0aGFuIHRoZSBjYWxsZXIgb2YKKyAgICBnenByaW50ZigpIGFzc3VyaW5nIHRoYXQgdGhlIG91dHB1dCB3aWxsIG5vdCBleGNlZWQgNEsuIE9uIHRoZSBvdGhlcgorICAgIGhhbmQsIGlmIHpsaWIgaXMgY29tcGlsZWQgdG8gdXNlIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCksIHdoaWNoIHNob3VsZAorICAgIG5vcm1hbGx5IGJlIHRoZSBjYXNlLCB0aGVuIHRoZXJlIGlzIG5vIHZ1bG5lcmFiaWxpdHkuIFRoZSAuL2NvbmZpZ3VyZQorICAgIHNjcmlwdCB3aWxsIGRpc3BsYXkgd2FybmluZ3MgaWYgYW4gaW5zZWN1cmUgdmFyaWF0aW9uIG9mIHNwcmludGYoKSB3aWxsCisgICAgYmUgdXNlZCBieSBnenByaW50ZigpLiBBbHNvIHRoZSB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gd2lsbCByZXR1cm4KKyAgICBpbmZvcm1hdGlvbiBvbiB3aGF0IHZhcmlhbnQgb2Ygc3ByaW50ZigpIGlzIHVzZWQgYnkgZ3pwcmludGYoKS4KKworICAgIElmIHlvdSBkb24ndCBoYXZlIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCkgYW5kIHdvdWxkIGxpa2Ugb25lLCB5b3UgY2FuCisgICAgZmluZCBhIHBvcnRhYmxlIGltcGxlbWVudGF0aW9uIGhlcmU6CisKKyAgICAgICAgaHR0cDovL3d3dy5panMuc2kvc29mdHdhcmUvc25wcmludGYvCisKKyAgICBOb3RlIHRoYXQgeW91IHNob3VsZCBiZSB1c2luZyB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBvZiB6bGliLiBWZXJzaW9ucworICAgIDEuMS4zIGFuZCBiZWZvcmUgd2VyZSBzdWJqZWN0IHRvIGEgZG91YmxlLWZyZWUgdnVsbmVyYWJpbGl0eS4KKworMzQuIElzIHRoZXJlIGEgSmF2YSB2ZXJzaW9uIG9mIHpsaWI/CisKKyAgICBQcm9iYWJseSB3aGF0IHlvdSB3YW50IGlzIHRvIHVzZSB6bGliIGluIEphdmEuIHpsaWIgaXMgYWxyZWFkeSBpbmNsdWRlZAorICAgIGFzIHBhcnQgb2YgdGhlIEphdmEgU0RLIGluIHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2UuIElmIHlvdSByZWFsbHkgd2FudAorICAgIGEgdmVyc2lvbiBvZiB6bGliIHdyaXR0ZW4gaW4gdGhlIEphdmEgbGFuZ3VhZ2UsIGxvb2sgb24gdGhlIHpsaWIgaG9tZQorICAgIHBhZ2UgZm9yIGxpbmtzOiBodHRwOi8vd3d3LnpsaWIub3JnLworCiszNS4gSSBnZXQgdGhpcyBvciB0aGF0IGNvbXBpbGVyIG9yIHNvdXJjZS1jb2RlIHNjYW5uZXIgd2FybmluZyB3aGVuIEkgY3JhbmsgaXQKKyAgICB1cCB0byBtYXhpbWFsbHktcGVkYW50aWMuIENhbid0IHlvdSBndXlzIHdyaXRlIHByb3BlciBjb2RlPworCisgICAgTWFueSB5ZWFycyBhZ28sIHdlIGdhdmUgdXAgYXR0ZW1wdGluZyB0byBhdm9pZCB3YXJuaW5ncyBvbiBldmVyeSBjb21waWxlcgorICAgIGluIHRoZSB1bml2ZXJzZS4gSXQganVzdCBnb3QgdG8gYmUgYSB3YXN0ZSBvZiB0aW1lLCBhbmQgc29tZSBjb21waWxlcnMKKyAgICB3ZXJlIGRvd25yaWdodCBzaWxseS4gU28gbm93LCB3ZSBzaW1wbHkgbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGUgYWx3YXlzCisgICAgd29ya3MuCisKKzM2LiBWYWxncmluZCAob3Igc29tZSBzaW1pbGFyIG1lbW9yeSBhY2Nlc3MgY2hlY2tlcikgc2F5cyB0aGF0IGRlZmxhdGUgaXMKKyAgICBwZXJmb3JtaW5nIGEgY29uZGl0aW9uYWwganVtcCB0aGF0IGRlcGVuZHMgb24gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KKyAgICBJc24ndCB0aGF0IGEgYnVnPworCisgICAgTm8uICBUaGF0IGlzIGludGVudGlvbmFsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbmQgdGhlIG91dHB1dCBvZgorICAgIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkLiAgVGhpcyBvbmx5IHN0YXJ0ZWQgc2hvd2luZyB1cCByZWNlbnRseSBzaW5jZQorICAgIHpsaWIgMS4yLnggdXNlcyBtYWxsb2MoKSBieSBkZWZhdWx0IGZvciBhbGxvY2F0aW9ucywgd2hlcmVhcyBlYXJsaWVyCisgICAgdmVyc2lvbnMgdXNlZCBjYWxsb2MoKSwgd2hpY2ggemVyb3Mgb3V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorCiszNy4gV2lsbCB6bGliIHJlYWQgdGhlIChpbnNlcnQgYW55IGFuY2llbnQgb3IgYXJjYW5lIGZvcm1hdCBoZXJlKSBjb21wcmVzc2VkCisgICAgZGF0YSBmb3JtYXQ/CisKKyAgICBQcm9iYWJseSBub3QuIExvb2sgaW4gdGhlIGNvbXAuY29tcHJlc3Npb24gRkFRIGZvciBwb2ludGVycyB0byB2YXJpb3VzCisgICAgZm9ybWF0cyBhbmQgYXNzb2NpYXRlZCBzb2Z0d2FyZS4KKworMzguIEhvdyBjYW4gSSBlbmNyeXB0L2RlY3J5cHQgemlwIGZpbGVzIHdpdGggemxpYj8KKworICAgIHpsaWIgZG9lc24ndCBzdXBwb3J0IGVuY3J5cHRpb24uIFRoZSBvcmlnaW5hbCBQS1pJUCBlbmNyeXB0aW9uIGlzIHZlcnkgd2VhaworICAgIGFuZCBjYW4gYmUgYnJva2VuIHdpdGggZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtcy4gVG8gZ2V0IHN0cm9uZyBlbmNyeXB0aW9uLAorICAgIHVzZSBHbnVQRywgaHR0cDovL3d3dy5nbnVwZy5vcmcvICwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB6bGliIGNvbXByZXNzaW9uLgorICAgIEZvciBQS1pJUCBjb21wYXRpYmxlICJlbmNyeXB0aW9uIiwgbG9vayBhdCBodHRwOi8vd3d3LmluZm8temlwLm9yZy8KKworMzkuIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAiZ3ppcCIgYW5kICJkZWZsYXRlIiBIVFRQIDEuMSBlbmNvZGluZ3M/CisKKyAgICAiZ3ppcCIgaXMgdGhlIGd6aXAgZm9ybWF0LCBhbmQgImRlZmxhdGUiIGlzIHRoZSB6bGliIGZvcm1hdC4gVGhleSBzaG91bGQKKyAgICBwcm9iYWJseSBoYXZlIGNhbGxlZCB0aGUgc2Vjb25kIG9uZSAiemxpYiIgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpb24KKyAgICB3aXRoIHRoZSByYXcgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0LiBXaGlsZSB0aGUgSFRUUCAxLjEgUkZDIDI2MTYKKyAgICBjb3JyZWN0bHkgcG9pbnRzIHRvIHRoZSB6bGliIHNwZWNpZmljYXRpb24gaW4gUkZDIDE5NTAgZm9yIHRoZSAiZGVmbGF0ZSIKKyAgICB0cmFuc2ZlciBlbmNvZGluZywgdGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgb2Ygc2VydmVycyBhbmQgYnJvd3NlcnMgdGhhdAorICAgIGluY29ycmVjdGx5IHByb2R1Y2Ugb3IgZXhwZWN0IHJhdyBkZWZsYXRlIGRhdGEgcGVyIHRoZSBkZWZsYXRlCisgICAgc3BlY2ZpY2lhdGlvbiBpbiBSRkMgMTk1MSwgbW9zdCBub3RhYmx5IE1pY3Jvc29mdC4gU28gZXZlbiB0aG91Z2ggdGhlCisgICAgImRlZmxhdGUiIHRyYW5zZmVyIGVuY29kaW5nIHVzaW5nIHRoZSB6bGliIGZvcm1hdCB3b3VsZCBiZSB0aGUgbW9yZQorICAgIGVmZmljaWVudCBhcHByb2FjaCAoYW5kIGluIGZhY3QgZXhhY3RseSB3aGF0IHRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQKKyAgICBmb3IpLCB1c2luZyB0aGUgImd6aXAiIHRyYW5zZmVyIGVuY29kaW5nIGlzIHByb2JhYmx5IG1vcmUgcmVsaWFibGUgZHVlIHRvCisgICAgYW4gdW5mb3J0dW5hdGUgY2hvaWNlIG9mIG5hbWUgb24gdGhlIHBhcnQgb2YgdGhlIEhUVFAgMS4xIGF1dGhvcnMuCisKKyAgICBCb3R0b20gbGluZTogdXNlIHRoZSBnemlwIGZvcm1hdCBmb3IgSFRUUCAxLjEgZW5jb2RpbmcuCisKKzQwLiBEb2VzIHpsaWIgc3VwcG9ydCB0aGUgbmV3ICJEZWZsYXRlNjQiIGZvcm1hdCBpbnRyb2R1Y2VkIGJ5IFBLV2FyZT8KKworICAgIE5vLiBQS1dhcmUgaGFzIGFwcGFyZW50bHkgZGVjaWRlZCB0byBrZWVwIHRoYXQgZm9ybWF0IHByb3ByaWV0YXJ5LCBzaW5jZQorICAgIHRoZXkgaGF2ZSBub3QgZG9jdW1lbnRlZCBpdCBhcyB0aGV5IGhhdmUgcHJldmlvdXMgY29tcHJlc3Npb24gZm9ybWF0cy4KKyAgICBJbiBhbnkgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGltcHJvdmVtZW50cyBhcmUgc28gbW9kZXN0IGNvbXBhcmVkIHRvIG90aGVyCisgICAgbW9yZSBtb2Rlcm4gYXBwcm9hY2hlcywgdGhhdCBpdCdzIG5vdCB3b3J0aCB0aGUgZWZmb3J0IHRvIGltcGxlbWVudC4KKworNDEuIENhbiB5b3UgcGxlYXNlIHNpZ24gdGhlc2UgbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgYW5kIGZheCB0aGVtIGJhY2sgdG8gdXMKKyAgICBzbyB0aGF0IHdlIGNhbiB1c2UgeW91ciBzb2Z0d2FyZSBpbiBvdXIgcHJvZHVjdD8KKworICAgIE5vLiBHbyBhd2F5LiBTaG9vLgpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvSU5ERVggYi91c3Iva2xpYmMvemxpYi9JTkRFWApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg3ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvSU5ERVgKQEAgLTAsMCArMSw1MSBAQAorQ2hhbmdlTG9nICAgICAgIGhpc3Rvcnkgb2YgY2hhbmdlcworRkFRICAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKK0lOREVYICAgICAgICAgICB0aGlzIGZpbGUKK01ha2VmaWxlICAgICAgICBtYWtlZmlsZSBmb3IgVW5peCAoZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZSkKK01ha2VmaWxlLmluICAgICBtYWtlZmlsZSBmb3IgVW5peCAodGVtcGxhdGUgZm9yIGNvbmZpZ3VyZSkKK1JFQURNRSAgICAgICAgICBndWVzcyB3aGF0CithbGdvcml0aG0udHh0ICAgZGVzY3JpcHRpb24gb2YgdGhlIChkZSljb21wcmVzc2lvbiBhbGdvcml0aG0KK2NvbmZpZ3VyZSAgICAgICBjb25maWd1cmUgc2NyaXB0IGZvciBVbml4Cit6Y29uZi5pbi5oICAgICAgdGVtcGxhdGUgZm9yIHpjb25mLmggKHVzZWQgYnkgY29uZmlndXJlKQorCithbWlnYS8gICAgICAgICAgbWFrZWZpbGVzIGZvciBBbWlnYSBTQVMgQworYXM0MDAvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgSUJNIEFTLzQwMAorbXNkb3MvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgTVNET1MKK29sZC8gICAgICAgICAgICBtYWtlZmlsZXMgZm9yIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcyBhbmQgemxpYiBkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAgICAgZmlsZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiB1cGRhdGVkIGZvciB6bGliIDEuMi54Citwcm9qZWN0cy8gICAgICAgcHJvamVjdHMgZm9yIHZhcmlvdXMgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudHMKK3FueC8gICAgICAgICAgICBtYWtlZmlsZXMgZm9yIFFOWAord2luMzIvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgV2luZG93cworCisgICAgICAgICAgICAgICAgemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChtdXN0IGJlIGtlcHQpOgoremNvbmYuaAoremxpYi5oCisKKyAgICAgICAgICAgICAgICBwcml2YXRlIHNvdXJjZSBmaWxlcyB1c2VkIHRvIGJ1aWxkIHRoZSB6bGliIGxpYnJhcnk6CithZGxlcjMyLmMKK2NvbXByZXNzLmMKK2NyYzMyLmMKK2NyYzMyLmgKK2RlZmxhdGUuYworZGVmbGF0ZS5oCitnemlvLmMKK2luZmJhY2suYworaW5mZmFzdC5jCitpbmZmYXN0LmgKK2luZmZpeGVkLmgKK2luZmxhdGUuYworaW5mbGF0ZS5oCitpbmZ0cmVlcy5jCitpbmZ0cmVlcy5oCit0cmVlcy5jCit0cmVlcy5oCit1bmNvbXByLmMKK3p1dGlsLmMKK3p1dGlsLmgKKworICAgICAgICAgICAgICAgIHNvdXJjZSBmaWxlcyBmb3Igc2FtcGxlIHByb2dyYW1zOgorZXhhbXBsZS5jCittaW5pZ3ppcC5jCisKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZCBjb250cmlidXRpb24gYnkgdGhpcmQgcGFydGllcworU2VlIGNvbnRyaWIvUkVBRE1FLmNvbnRyaWIKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL0tidWlsZCBiL3Vzci9rbGliYy96bGliL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmUxYmYyCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvS2J1aWxkCkBAIC0wLDAgKzEsOCBAQAorIyB6bGliCisKK2tsaWIteSA6PSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6aW8ubwora2xpYi15ICs9IHVuY29tcHIubyBkZWZsYXRlLm8gdHJlZXMubyB6dXRpbC5vCitrbGliLXkgKz0gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubworCisjIHpsaWIgc3BlY2lmaWMgZmxhZworRVhUUkFfS0xJQkNDRkxBR1MgOj0gLUREWU5BTUlDX0NSQ19UQUJMRQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvUkVBRE1FIGIvdXNyL2tsaWJjL3psaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGNjNTAKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9SRUFETUUKQEAgLTAsMCArMSwxMjUgQEAKK1pMSUIgREFUQSBDT01QUkVTU0lPTiBMSUJSQVJZCisKK3psaWIgMS4yLjMgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlIGlzCit0aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MKKyhSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcworaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KQorYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuIFRoZXNlIGRvY3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gb3RoZXIKK2Zvcm1hdHMgZnJvbSBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvemxpYi96ZG9jLWluZGV4Lmh0bWwKKworQWxsIGZ1bmN0aW9ucyBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSB6bGliLmgKKyh2b2x1bnRlZXIgdG8gd3JpdGUgbWFuIHBhZ2VzIHdlbGNvbWUsIGNvbnRhY3QgemxpYkBnemlwLm9yZykuIEEgdXNhZ2UgZXhhbXBsZQorb2YgdGhlIGxpYnJhcnkgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUgZXhhbXBsZS5jIHdoaWNoIGFsc28gdGVzdHMgdGhhdCB0aGUgbGlicmFyeQoraXMgd29ya2luZyBjb3JyZWN0bHkuIEFub3RoZXIgZXhhbXBsZSBpcyBnaXZlbiBpbiB0aGUgZmlsZSBtaW5pZ3ppcC5jLiBUaGUKK2NvbXByZXNzaW9uIGxpYnJhcnkgaXRzZWxmIGlzIGNvbXBvc2VkIG9mIGFsbCBzb3VyY2UgZmlsZXMgZXhjZXB0IGV4YW1wbGUuYyBhbmQKK21pbmlnemlwLmMuCisKK1RvIGNvbXBpbGUgYWxsIGZpbGVzIGFuZCBydW4gdGhlIHRlc3QgcHJvZ3JhbSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZ2l2ZW4gYXQKK3RoZSB0b3Agb2YgTWFrZWZpbGUuIEluIHNob3J0ICJtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIgc2hvdWxkIHdvcmsgZm9yIG1vc3QKK21hY2hpbmVzLiBGb3IgVW5peDogIi4vY29uZmlndXJlOyBtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIuIEZvciBNU0RPUywgdXNlIG9uZQorb2YgdGhlIHNwZWNpYWwgbWFrZWZpbGVzIHN1Y2ggYXMgTWFrZWZpbGUubXNjLiBGb3IgVk1TLCB1c2UgbWFrZV92bXMuY29tLgorCitRdWVzdGlvbnMgYWJvdXQgemxpYiBzaG91bGQgYmUgc2VudCB0byA8emxpYkBnemlwLm9yZz4sIG9yIHRvIEdpbGxlcyBWb2xsYW50Cis8aW5mb0B3aW5pbWFnZS5jb20+IGZvciB0aGUgV2luZG93cyBETEwgdmVyc2lvbi4gVGhlIHpsaWIgaG9tZSBwYWdlIGlzCitodHRwOi8vd3d3LnpsaWIub3JnIG9yIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8gQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sCitwbGVhc2UgY2hlY2sgdGhpcyBzaXRlIHRvIHZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliOworb3RoZXJ3aXNlIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gYW5kIGNoZWNrIHdoZXRoZXIgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzIG9yCitub3QuCisKK1BMRUFTRSByZWFkIHRoZSB6bGliIEZBUSBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvemxpYl9mYXEuaHRtbCBiZWZvcmUgYXNraW5nCitmb3IgaGVscC4KKworTWFyayBOZWxzb24gPG1hcmtuQGllZWUub3JnPiB3cm90ZSBhbiBhcnRpY2xlIGFib3V0IHpsaWIgZm9yIHRoZSBKYW4uIDE5OTcKK2lzc3VlIG9mICBEci4gRG9iYidzIEpvdXJuYWw7IGEgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgaW4KK2h0dHA6Ly9kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCisKK1RoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjIuMyBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBDaGFuZ2VMb2cuCisKK1Vuc3VwcG9ydGVkIHRoaXJkIHBhcnR5IGNvbnRyaWJ1dGlvbnMgYXJlIHByb3ZpZGVkIGluIGRpcmVjdG9yeSAiY29udHJpYiIuCisKK0EgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB6bGliIGlzIGF2YWlsYWJsZSBpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQKK2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvemlwL3BhY2thZ2Utc3VtbWFyeS5odG1sCitTZWUgdGhlIHpsaWIgaG9tZSBwYWdlIGh0dHA6Ly93d3cuemxpYi5vcmcgZm9yIGRldGFpbHMuCisKK0EgUGVybCBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgPHBtcXNAY3Bhbi5vcmc+IGlzIGluIHRoZQorQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMKK2h0dHA6Ly93d3cuY3Bhbi5vcmcvbW9kdWxlcy9ieS1tb2R1bGUvQ29tcHJlc3MvCisKK0EgUHl0aG9uIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyA8YW1rQGFtay5jYT4gaXMKK2F2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9ucywgc2VlCitodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2xpYi9tb2R1bGUtemxpYi5odG1sCisKK0EgemxpYiBiaW5kaW5nIGZvciBUQ0wgd3JpdHRlbiBieSBBbmRyZWFzIEt1cHJpZXMgPGEua3Vwcmllc0B3ZXN0ZW5kLmNvbT4gaXMKK2F2YWlsbGFibGUgYXQgaHR0cDovL3d3dy5vY2hlLmRlL35ha3Vwcmllcy9zb2Z0L3RyZi90cmZfemlwLmh0bWwKKworQW4gZXhwZXJpbWVudGFsIHBhY2thZ2UgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgaW4gLnppcCBmb3JtYXQsIHdyaXR0ZW4gb24gdG9wCitvZiB6bGliIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4sIGlzIGF2YWlsYWJsZSBpbiB0aGUKK2NvbnRyaWIvbWluaXppcCBkaXJlY3Rvcnkgb2YgemxpYi4KKworCitOb3RlcyBmb3Igc29tZSB0YXJnZXRzOgorCistIEZvciBXaW5kb3dzIERMTCB2ZXJzaW9ucywgcGxlYXNlIHNlZSB3aW4zMi9ETExfRkFRLnR4dAorCistIEZvciA2NC1iaXQgSXJpeCwgZGVmbGF0ZS5jIG11c3QgYmUgY29tcGlsZWQgd2l0aG91dCBhbnkgb3B0aW1pemF0aW9uLiBXaXRoCisgIC1PLCBvbmUgbGlicG5nIHRlc3QgZmFpbHMuIFRoZSB0ZXN0IHdvcmtzIGluIDMyIGJpdCBtb2RlICh3aXRoIHRoZSAtbjMyCisgIGNvbXBpbGVyIGZsYWcpLiBUaGUgY29tcGlsZXIgYnVnIGhhcyBiZWVuIHJlcG9ydGVkIHRvIFNHSS4KKworLSB6bGliIGRvZXNuJ3Qgd29yayB3aXRoIGdjYyAyLjYuMyBvbiBhIERFQyAzMDAwLzMwMExYIHVuZGVyIE9TRi8xIDIuMSBpdCB3b3JrcworICB3aGVuIGNvbXBpbGVkIHdpdGggY2MuCisKKy0gT24gRGlnaXRhbCBVbml4IDQuMEQgKGZvcm1lbHkgT1NGLzEpIG9uIEFscGhhU2VydmVyLCB0aGUgY2Mgb3B0aW9uIC1zdGQxIGlzCisgIG5lY2Vzc2FyeSB0byBnZXQgZ3pwcmludGYgd29ya2luZyBjb3JyZWN0bHkuIFRoaXMgaXMgZG9uZSBieSBjb25maWd1cmUuCisKKy0gemxpYiBkb2Vzbid0IHdvcmsgb24gSFAtVVggOS4wNSB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgL2Jpbi9jYy4gSXQgd29ya3Mgd2l0aAorICBvdGhlciBjb21waWxlcnMuIFVzZSAibWFrZSB0ZXN0IiB0byBjaGVjayB5b3VyIGNvbXBpbGVyLgorCistIGd6ZG9wZW4gaXMgbm90IHN1cHBvcnRlZCBvbiBSSVNDT1MsIEJFT1MgYW5kIGJ5IHNvbWUgTWFjIGNvbXBpbGVycy4KKworLSBGb3IgUGFsbU9zLCBzZWUgaHR0cDovL3BhbG16bGliLnNvdXJjZWZvcmdlLm5ldC8KKworLSBXaGVuIGJ1aWxkaW5nIGEgc2hhcmVkLCBpLmUuIGR5bmFtaWMgbGlicmFyeSBvbiBNYWMgT1MgWCwgdGhlIGxpYnJhcnkgbXVzdCBiZQorICBpbnN0YWxsZWQgYmVmb3JlIHRlc3RpbmcgKGRvICJtYWtlIGluc3RhbGwiIGJlZm9yZSAibWFrZSB0ZXN0IiksIHNpbmNlIHRoZQorICBsaWJyYXJ5IGxvY2F0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgbGlicmFyeS4KKworCitBY2tub3dsZWRnbWVudHM6CisKKyAgVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkgemxpYiB3YXMgZGVmaW5lZCBieSBQaGlsIEthdHouIFRoZSBkZWZsYXRlCisgIGFuZCB6bGliIHNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiBQZXRlciBEZXV0c2NoLiBUaGFua3MgdG8gYWxsIHRoZQorICBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cyBpbXByb3ZlbWVudHMgaW4gemxpYjsKKyAgdGhleSBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKworQ29weXJpZ2h0IG5vdGljZToKKworIChDKSAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgd2Ugd291bGQgYXBwcmVjaWF0ZSAqbm90KgorcmVjZWl2aW5nIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIHRvIHNpZ24uIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZAorZm9yIGZyZWUgYnV0IHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbgorZW50aXJlbHkgd3JpdHRlbiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdAoraW5jbHVkZSB0aGlyZC1wYXJ0eSBjb2RlLgorCitJZiB5b3UgcmVkaXN0cmlidXRlIG1vZGlmaWVkIHNvdXJjZXMsIHdlIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3UgaW5jbHVkZQoraW4gdGhlIGZpbGUgQ2hhbmdlTG9nIGhpc3RvcnkgaW5mb3JtYXRpb24gZG9jdW1lbnRpbmcgeW91ciBjaGFuZ2VzLiBQbGVhc2UKK3JlYWQgdGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZQordmVyc2lvbnMuCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9hZGxlcjMyLmMgYi91c3Iva2xpYmMvemxpYi9hZGxlcjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMTE1MQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2FkbGVyMzIuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogYWRsZXIzMi5jIC0tIGNvbXB1dGUgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBzdHJlYW0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZDogYWRsZXIzMi5jLHYgMS4xIDIwMDUvMDIvMjcgMjM6MTU6MzkgaHBhIEV4cCAkICovCisKKyNkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2luY2x1ZGUgInpsaWIuaCIKKworI2RlZmluZSBCQVNFIDY1NTIxVUwgICAgLyogbGFyZ2VzdCBwcmltZSBzbWFsbGVyIHRoYW4gNjU1MzYgKi8KKyNkZWZpbmUgTk1BWCA1NTUyCisvKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KKworI2RlZmluZSBETzEoYnVmLGkpICB7YWRsZXIgKz0gKGJ1ZilbaV07IHN1bTIgKz0gYWRsZXI7fQorI2RlZmluZSBETzIoYnVmLGkpICBETzEoYnVmLGkpOyBETzEoYnVmLGkrMSk7CisjZGVmaW5lIERPNChidWYsaSkgIERPMihidWYsaSk7IERPMihidWYsaSsyKTsKKyNkZWZpbmUgRE84KGJ1ZixpKSAgRE80KGJ1ZixpKTsgRE80KGJ1ZixpKzQpOworI2RlZmluZSBETzE2KGJ1ZikgICBETzgoYnVmLDApOyBETzgoYnVmLDgpOworCisvKiB1c2UgTk9fRElWSURFIGlmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IGRvIGRpdmlzaW9uIGluIGhhcmR3YXJlICovCisjaWZkZWYgTk9fRElWSURFCisjICBkZWZpbmUgTU9EKGEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTYpKSBhIC09IChCQVNFIDw8IDE2KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxNSkpIGEgLT0gKEJBU0UgPDwgMTUpOyBcCisgICAgICAgIGlmIChhID49IChCQVNFIDw8IDE0KSkgYSAtPSAoQkFTRSA8PCAxNCk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTMpKSBhIC09IChCQVNFIDw8IDEzKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxMikpIGEgLT0gKEJBU0UgPDwgMTIpOyBcCisgICAgICAgIGlmIChhID49IChCQVNFIDw8IDExKSkgYSAtPSAoQkFTRSA8PCAxMSk7IFwKKyAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTApKSBhIC09IChCQVNFIDw8IDEwKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA5KSkgYSAtPSAoQkFTRSA8PCA5KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA4KSkgYSAtPSAoQkFTRSA8PCA4KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA3KSkgYSAtPSAoQkFTRSA8PCA3KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA2KSkgYSAtPSAoQkFTRSA8PCA2KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA1KSkgYSAtPSAoQkFTRSA8PCA1KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA0KSkgYSAtPSAoQkFTRSA8PCA0KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAzKSkgYSAtPSAoQkFTRSA8PCAzKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAyKSkgYSAtPSAoQkFTRSA8PCAyKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxKSkgYSAtPSAoQkFTRSA8PCAxKTsgXAorICAgICAgICBpZiAoYSA+PSBCQVNFKSBhIC09IEJBU0U7IFwKKyAgICB9IHdoaWxlICgwKQorIyAgZGVmaW5lIE1PRDQoYSkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA0KSkgYSAtPSAoQkFTRSA8PCA0KTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAzKSkgYSAtPSAoQkFTRSA8PCAzKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAyKSkgYSAtPSAoQkFTRSA8PCAyKTsgXAorICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxKSkgYSAtPSAoQkFTRSA8PCAxKTsgXAorICAgICAgICBpZiAoYSA+PSBCQVNFKSBhIC09IEJBU0U7IFwKKyAgICB9IHdoaWxlICgwKQorI2Vsc2UKKyMgIGRlZmluZSBNT0QoYSkgYSAlPSBCQVNFCisjICBkZWZpbmUgTU9ENChhKSBhICU9IEJBU0UKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuKQorICAgIHVMb25nIGFkbGVyOworICAgIGNvbnN0IEJ5dGVmICpidWY7CisgICAgdUludCBsZW47Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW0yOworICAgIHVuc2lnbmVkIG47CisKKyAgICAvKiBzcGxpdCBBZGxlci0zMiBpbnRvIGNvbXBvbmVudCBzdW1zICovCisgICAgc3VtMiA9IChhZGxlciA+PiAxNikgJiAweGZmZmY7CisgICAgYWRsZXIgJj0gMHhmZmZmOworCisgICAgLyogaW4gY2FzZSB1c2VyIGxpa2VzIGRvaW5nIGEgYnl0ZSBhdCBhIHRpbWUsIGtlZXAgaXQgZmFzdCAqLworICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICBhZGxlciArPSBidWZbMF07CisgICAgICAgIGlmIChhZGxlciA+PSBCQVNFKQorICAgICAgICAgICAgYWRsZXIgLT0gQkFTRTsKKyAgICAgICAgc3VtMiArPSBhZGxlcjsKKyAgICAgICAgaWYgKHN1bTIgPj0gQkFTRSkKKyAgICAgICAgICAgIHN1bTIgLT0gQkFTRTsKKyAgICAgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworICAgIH0KKworICAgIC8qIGluaXRpYWwgQWRsZXItMzIgdmFsdWUgKGRlZmVycmVkIGNoZWNrIGZvciBsZW4gPT0gMSBzcGVlZCkgKi8KKyAgICBpZiAoYnVmID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIDFMOworCisgICAgLyogaW4gY2FzZSBzaG9ydCBsZW5ndGhzIGFyZSBwcm92aWRlZCwga2VlcCBpdCBzb21ld2hhdCBmYXN0ICovCisgICAgaWYgKGxlbiA8IDE2KSB7CisgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgYWRsZXIgKz0gKmJ1ZisrOworICAgICAgICAgICAgc3VtMiArPSBhZGxlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRsZXIgPj0gQkFTRSkKKyAgICAgICAgICAgIGFkbGVyIC09IEJBU0U7CisgICAgICAgIE1PRDQoc3VtMik7ICAgICAgICAgICAgIC8qIG9ubHkgYWRkZWQgc28gbWFueSBCQVNFJ3MgKi8KKyAgICAgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworICAgIH0KKworICAgIC8qIGRvIGxlbmd0aCBOTUFYIGJsb2NrcyAtLSByZXF1aXJlcyBqdXN0IG9uZSBtb2R1bG8gb3BlcmF0aW9uICovCisgICAgd2hpbGUgKGxlbiA+PSBOTUFYKSB7CisgICAgICAgIGxlbiAtPSBOTUFYOworICAgICAgICBuID0gTk1BWCAvIDE2OyAgICAgICAgICAvKiBOTUFYIGlzIGRpdmlzaWJsZSBieSAxNiAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBETzE2KGJ1Zik7ICAgICAgICAgIC8qIDE2IHN1bXMgdW5yb2xsZWQgKi8KKyAgICAgICAgICAgIGJ1ZiArPSAxNjsKKyAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgTU9EKGFkbGVyKTsKKyAgICAgICAgTU9EKHN1bTIpOworICAgIH0KKworICAgIC8qIGRvIHJlbWFpbmluZyBieXRlcyAobGVzcyB0aGFuIE5NQVgsIHN0aWxsIGp1c3Qgb25lIG1vZHVsbykgKi8KKyAgICBpZiAobGVuKSB7ICAgICAgICAgICAgICAgICAgLyogYXZvaWQgbW9kdWxvcyBpZiBub25lIHJlbWFpbmluZyAqLworICAgICAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICAgICAgICBsZW4gLT0gMTY7CisgICAgICAgICAgICBETzE2KGJ1Zik7CisgICAgICAgICAgICBidWYgKz0gMTY7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBhZGxlciArPSAqYnVmKys7CisgICAgICAgICAgICBzdW0yICs9IGFkbGVyOworICAgICAgICB9CisgICAgICAgIE1PRChhZGxlcik7CisgICAgICAgIE1PRChzdW0yKTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gcmVjb21iaW5lZCBzdW1zICovCisgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZShhZGxlcjEsIGFkbGVyMiwgbGVuMikKKyAgICB1TG9uZyBhZGxlcjE7CisgICAgdUxvbmcgYWRsZXIyOworICAgIHpfb2ZmX3QgbGVuMjsKK3sKKyAgICB1bnNpZ25lZCBsb25nIHN1bTE7CisgICAgdW5zaWduZWQgbG9uZyBzdW0yOworICAgIHVuc2lnbmVkIHJlbTsKKworICAgIC8qIHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgZm9ybXVsYSBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyICovCisgICAgcmVtID0gKHVuc2lnbmVkKShsZW4yICUgQkFTRSk7CisgICAgc3VtMSA9IGFkbGVyMSAmIDB4ZmZmZjsKKyAgICBzdW0yID0gcmVtICogc3VtMTsKKyAgICBNT0Qoc3VtMik7CisgICAgc3VtMSArPSAoYWRsZXIyICYgMHhmZmZmKSArIEJBU0UgLSAxOworICAgIHN1bTIgKz0gKChhZGxlcjEgPj4gMTYpICYgMHhmZmZmKSArICgoYWRsZXIyID4+IDE2KSAmIDB4ZmZmZikgKyBCQVNFIC0gcmVtOworICAgIGlmIChzdW0xID4gQkFTRSkgc3VtMSAtPSBCQVNFOworICAgIGlmIChzdW0xID4gQkFTRSkgc3VtMSAtPSBCQVNFOworICAgIGlmIChzdW0yID4gKEJBU0UgPDwgMSkpIHN1bTIgLT0gKEJBU0UgPDwgMSk7CisgICAgaWYgKHN1bTIgPiBCQVNFKSBzdW0yIC09IEJBU0U7CisgICAgcmV0dXJuIHN1bTEgfCAoc3VtMiA8PCAxNik7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9hbGdvcml0aG0udHh0IGIvdXNyL2tsaWJjL3psaWIvYWxnb3JpdGhtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDIyZGRlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvYWxnb3JpdGhtLnR4dApAQCAtMCwwICsxLDIwOSBAQAorMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQorCitUaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgorTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCit0aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCitwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCitsZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKK3RvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKKzMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcworZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAorYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKKworTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAorbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAoraW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55CitzaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KK2F2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0CitpdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcworc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQorCitEdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKK2xlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgordGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKK3N0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCit0aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KKworVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bworZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgorVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCitoYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgorCitUbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Cit0cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAorcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Citwb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCisKK2RlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgorbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCithIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCitwcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQorbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAordGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgorc3RlcHMgbGF0ZXIuCisKK1RoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCit0aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKK21hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCitpbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCit0aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KKworVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgorbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKK2FyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgord2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbworYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCisKKworMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCisKKzIuMSBJbnRyb2R1Y3Rpb24KKworVGhlIGtleSBxdWVzdGlvbiBpcyBob3cgdG8gcmVwcmVzZW50IGEgSHVmZm1hbiBjb2RlIChvciBhbnkgcHJlZml4IGNvZGUpIHNvCit0aGF0IHlvdSBjYW4gZGVjb2RlIGZhc3QuICBUaGUgbW9zdCBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCBzaG9ydGVyCitjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuIGxvbmdlciBjb2Rlcywgc28gcGF5IGF0dGVudGlvbiB0byBkZWNvZGluZyB0aGUKK3Nob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQgdGhlIGxvbmcgY29kZXMgdGFrZSBsb25nZXIgdG8gZGVjb2RlLgorCitpbmZsYXRlKCkgc2V0cyB1cCBhIGZpcnN0IGxldmVsIHRhYmxlIHRoYXQgY292ZXJzIHNvbWUgbnVtYmVyIG9mIGJpdHMgb2YKK2lucHV0IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIGxvbmdlc3QgY29kZS4gIEl0IGdldHMgdGhhdCBtYW55IGJpdHMgZnJvbSB0aGUKK3N0cmVhbSwgYW5kIGxvb2tzIGl0IHVwIGluIHRoZSB0YWJsZS4gIFRoZSB0YWJsZSB3aWxsIHRlbGwgaWYgdGhlIG5leHQKK2NvZGUgaXMgdGhhdCBtYW55IGJpdHMgb3IgbGVzcyBhbmQgaG93IG1hbnksIGFuZCBpZiBpdCBpcywgaXQgd2lsbCB0ZWxsCit0aGUgdmFsdWUsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBsZXZlbCB0YWJsZSBmb3Igd2hpY2ggaW5mbGF0ZSgpCitncmFicyBtb3JlIGJpdHMgYW5kIHRyaWVzIHRvIGRlY29kZSBhIGxvbmdlciBjb2RlLgorCitIb3cgbWFueSBiaXRzIHRvIG1ha2UgdGhlIGZpcnN0IGxvb2t1cCBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gdGhlIHRpbWUgaXQKK3Rha2VzIHRvIGRlY29kZSBhbmQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gYnVpbGQgdGhlIHRhYmxlLiAgSWYgYnVpbGRpbmcgdGhlCit0YWJsZSB0b29rIG5vIHRpbWUgKGFuZCBpZiB5b3UgaGFkIGluZmluaXRlIG1lbW9yeSksIHRoZW4gdGhlcmUgd291bGQgb25seQorYmUgYSBmaXJzdCBsZXZlbCB0YWJsZSB0byBjb3ZlciBhbGwgdGhlIHdheSB0byB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwKK2J1aWxkaW5nIHRoZSB0YWJsZSBlbmRzIHVwIHRha2luZyBhIGxvdCBsb25nZXIgZm9yIG1vcmUgYml0cyBzaW5jZSBzaG9ydAorY29kZXMgYXJlIHJlcGxpY2F0ZWQgbWFueSB0aW1lcyBpbiBzdWNoIGEgdGFibGUuICBXaGF0IGluZmxhdGUoKSBkb2VzIGlzCitzaW1wbHkgdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpcnN0IHRhYmxlIGEgdmFyaWFibGUsIGFuZCAgdGhlbgordG8gc2V0IHRoYXQgdmFyaWFibGUgZm9yIHRoZSBtYXhpbXVtIHNwZWVkLgorCitGb3IgaW5mbGF0ZSwgd2hpY2ggaGFzIDI4NiBwb3NzaWJsZSBjb2RlcyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplCitvZiB0aGUgZmlyc3QgdGFibGUgaXMgbmluZSBiaXRzLiAgQWxzbyB0aGUgZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZQordmFsdWVzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGZpcnN0IHRhYmxlIGlzIHNpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mCit0aG9zZSBjYXNlcywgdGhlIHRhYmxlIGVuZGVkIHVwIG9uZSBiaXQgbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUKK2xlbmd0aCwgaS5lLiB0aGUgY29kZSBsZW5ndGggb2YgYW4gYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYQorbGl0dGxlIG1vcmUgdGhhbiBlaWdodCBiaXRzIGZvciAyODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cworZm9yIDMwIHN5bWJvbHMuCisKKworMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKKworT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5Citsb29rcyBsaWtlLiAgWW91IGFyZSBjb3JyZWN0IHRoYXQgaXQncyBub3QgYSBIdWZmbWFuIHRyZWUuICBJdCBpcyBzaW1wbHkgYQorbG9va3VwIHRhYmxlIGZvciB0aGUgZmlyc3QsIGxldCdzIHNheSwgbmluZSBiaXRzIG9mIGEgSHVmZm1hbiBzeW1ib2wuICBUaGUKK3N5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhcgorc3ltYm9sIGlzIHNob3J0ZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBzeW1ib2wncyB0cmFuc2xhdGlvbiBpcyBkdXBsaWNhdGVkCitpbiBhbGwgdGhvc2UgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggdGhhdCBzeW1ib2wncyBiaXRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQorc3ltYm9sIGlzIGZvdXIgYml0cywgdGhlbiBpdCdzIGR1cGxpY2F0ZWQgMzIgdGltZXMgaW4gYSBuaW5lLWJpdCB0YWJsZS4gIElmIGEKK3N5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KKworSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzCit0byBhbm90aGVyIHNpbWlsYXIgdGFibGUgZm9yIHRoZSByZW1haW5pbmcgYml0cy4gIEFnYWluLCB0aGVyZSBhcmUgZHVwbGljYXRlZAorZW50cmllcyBhcyBuZWVkZWQuICBUaGUgaWRlYSBpcyB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUgdGhlIHN5bWJvbCB3aWxsIGJlIHNob3J0CithbmQgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0YWJsZSBsb29rIHVwLiAgKFRoYXQncyB3aG9sZSBpZGVhIGJlaGluZCBkYXRhCitjb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUKK3dpbGwgYmUgdHdvIGxvb2t1cHMuICBJZiB5b3UgaGFkIGEgY29tcHJlc3Npb24gbWV0aG9kIHdpdGggcmVhbGx5IGxvbmcKK3N5bWJvbHMsIHlvdSBjb3VsZCBoYXZlIGFzIG1hbnkgbGV2ZWxzIG9mIGxvb2t1cHMgYXMgaXMgZWZmaWNpZW50LiAgRm9yCitpbmZsYXRlLCB0d28gaXMgZW5vdWdoLgorCitTbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4KK3RoZSBhYm92ZSBleGFtcGxlIGFyZSBnb2JibGVkKSwgb3IgaXQgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgc3ltYm9sCithbmQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGdvYmJsZS4gIFRoZW4geW91IHN0YXJ0IGFnYWluIHdpdGggdGhlIG5leHQKK3VuZ29iYmxlZCBiaXQuCisKK1lvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlCitsb25nZXN0IHN5bWJvbCBpcz8gIFRoZSByZWFzb24gaXMgdGhhdCBpZiB5b3UgZG8gdGhhdCwgeW91IGVuZCB1cCBzcGVuZGluZworbW9yZSB0aW1lIGZpbGxpbmcgaW4gZHVwbGljYXRlIHN5bWJvbCBlbnRyaWVzIHRoYW4geW91IGRvIGFjdHVhbGx5IGRlY29kaW5nLgorQXQgbGVhc3QgZm9yIGRlZmxhdGUncyBvdXRwdXQgdGhhdCBnZW5lcmF0ZXMgbmV3IHRyZWVzIGV2ZXJ5IHNldmVyYWwgMTAncyBvZgora2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUKK3dvdWxkIHRha2UgdG9vIGxvbmcgaWYgeW91J3JlIG9ubHkgZGVjb2Rpbmcgc2V2ZXJhbCB0aG91c2FuZCBzeW1ib2xzLiAgQXQgdGhlCitvdGhlciBleHRyZW1lLCB5b3UgY291bGQgbWFrZSBhIG5ldyB0YWJsZSBmb3IgZXZlcnkgYml0IGluIHRoZSBjb2RlLiAgSW4gZmFjdCwKK3RoYXQncyBlc3NlbnRpYWxseSBhIEh1ZmZtYW4gdHJlZS4gIEJ1dCB0aGVuIHlvdSBzcGVuZCB0d28gbXVjaCB0aW1lCit0cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgorCitTbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0bworZmlsbCBvdXQgdGhlIHRhYmxlIHZzLiB0aGUgdGltZSBzcGVudCBsb29raW5nIGF0IHRoZSBzZWNvbmQgbGV2ZWwgYW5kIGFib3ZlIG9mCit0aGUgdGFibGUuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSwgc2NhbGVkIGRvd246CisKK1RoZSBjb2RlIGJlaW5nIGRlY29kZWQsIHdpdGggMTAgc3ltYm9scywgZnJvbSAxIHRvIDYgYml0cyBsb25nOgorCitBOiAwCitCOiAxMAorQzogMTEwMAorRDogMTEwMTAKK0U6IDExMDExCitGOiAxMTEwMAorRzogMTExMDEKK0g6IDExMTEwCitJOiAxMTExMTAKK0o6IDExMTExMQorCitMZXQncyBtYWtlIHRoZSBmaXJzdCB0YWJsZSB0aHJlZSBiaXRzIGxvbmcgKGVpZ2h0IGVudHJpZXMpOgorCiswMDA6IEEsMQorMDAxOiBBLDEKKzAxMDogQSwxCiswMTE6IEEsMQorMTAwOiBCLDIKKzEwMTogQiwyCisxMTA6IC0+IHRhYmxlIFggKGdvYmJsZSAzIGJpdHMpCisxMTE6IC0+IHRhYmxlIFkgKGdvYmJsZSAzIGJpdHMpCisKK0VhY2ggZW50cnkgaXMgd2hhdCB0aGUgYml0cyBkZWNvZGUgYXMgYW5kIGhvdyBtYW55IGJpdHMgdGhhdCBpcywgaS5lLiBob3cKK21hbnkgYml0cyB0byBnb2JibGUuICBPciB0aGUgZW50cnkgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUsIHdpdGggdGhlIG51bWJlciBvZgorYml0cyB0byBnb2JibGUgaW1wbGljaXQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLgorCitUYWJsZSBYIGlzIHR3byBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMCBpcyBmaXZlIGJpdHMKK2xvbmc6CisKKzAwOiBDLDEKKzAxOiBDLDEKKzEwOiBELDIKKzExOiBFLDIKKworVGFibGUgWSBpcyB0aHJlZSBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMSBpcyBzaXgKK2JpdHMgbG9uZzoKKworMDAwOiBGLDIKKzAwMTogRiwyCiswMTA6IEcsMgorMDExOiBHLDIKKzEwMDogSCwyCisxMDE6IEgsMgorMTEwOiBJLDMKKzExMTogSiwzCisKK1NvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8KK2JlIGNvbnN0cnVjdGVkLiAgVGhhdCdzIGNvbXBhcmVkIHRvIDY0IGVudHJpZXMgZm9yIGEgc2luZ2xlIHRhYmxlLiAgT3IKK2NvbXBhcmVkIHRvIDE2IGVudHJpZXMgZm9yIGEgSHVmZm1hbiB0cmVlIChzaXggdHdvIGVudHJ5IHRhYmxlcyBhbmQgb25lIGZvdXIKK2VudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZgordGhlIHN5bWJvbHMsIGl0IHRha2VzIG9uIHRoZSBhdmVyYWdlIDEuMjUgbG9va3VwcyBwZXIgc3ltYm9sLiAgVGhhdCdzIGNvbXBhcmVkCit0byBvbmUgbG9va3VwIGZvciB0aGUgc2luZ2xlIHRhYmxlLCBvciAxLjY2IGxvb2t1cHMgcGVyIHN5bWJvbCBmb3IgdGhlCitIdWZmbWFuIHRyZWUuCisKK1RoZXJlLCBJIHRoaW5rIHRoYXQgZ2l2ZXMgeW91IGEgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24uICBGb3IgaW5mbGF0ZSwgdGhlCittZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYQorYnl0ZSAoYSAibGl0ZXJhbCIpLCBvciBpdCBjYW4gYmUgZWl0aGVyIGEgbGVuZ3RoIG9yIGEgZGlzdGFuY2Ugd2hpY2gKK2luZGljYXRlcyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyIG9mIGJpdHMgdG8gZmV0Y2ggYWZ0ZXIgdGhlIGNvZGUgdGhhdCBpcworYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZQorZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgaW4gaW5mdHJlZXMuYyB0cnkgdG8gZW5jb2RlIGFsbCB0aGF0IGluZm9ybWF0aW9uCitjb21wYWN0bHkgaW4gdGhlIHRhYmxlcy4KKworCitKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCitqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworUmVmZXJlbmNlczoKKworW0xaNzddIFppdiBKLiwgTGVtcGVsIEEuLCBgYEEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCitDb21wcmVzc2lvbiwnJyBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsIE5vLiAzLAorcHAuIDMzNy0zNDMuCisKK2BgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24nJyBhdmFpbGFibGUgaW4KK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTEudHh0CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi9jb21wcmVzcy5jIGIvdXNyL2tsaWJjL3psaWIvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ4ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvY29tcHJlc3MuYwpAQCAtMCwwICsxLDc5IEBACisvKiBjb21wcmVzcy5jIC0tIGNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZDogY29tcHJlc3MuYyx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNpbmNsdWRlICJ6bGliLmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCisgICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKKyAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuIHNvdXJjZUxlbiBwbHVzCisgICAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KK2ludCBaRVhQT1JUIGNvbXByZXNzMiAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4sIGxldmVsKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKKyAgICBpbnQgbGV2ZWw7Cit7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCBlcnI7CisKKyAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOworICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKKyNpZmRlZiBNQVhTRUdfNjRLCisgICAgLyogQ2hlY2sgZm9yIHNvdXJjZSA+IDY0SyBvbiAxNi1iaXQgbWFjaGluZTogKi8KKyAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9pbiAhPSBzb3VyY2VMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKKyNlbmRpZgorICAgIHN0cmVhbS5uZXh0X291dCA9IGRlc3Q7CisgICAgc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpkZXN0TGVuOworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX291dCAhPSAqZGVzdExlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBlcnIgPSBkZWZsYXRlSW5pdCgmc3RyZWFtLCBsZXZlbCk7CisgICAgaWYgKGVyciAhPSBaX09LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIGVyciA9PSBaX09LID8gWl9CVUZfRVJST1IgOiBlcnI7CisgICAgfQorICAgICpkZXN0TGVuID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK2ludCBaRVhQT1JUIGNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKKyAgICBCeXRlZiAqZGVzdDsKKyAgICB1TG9uZ2YgKmRlc3RMZW47CisgICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgcmV0dXJuIGNvbXByZXNzMihkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIElmIHRoZSBkZWZhdWx0IG1lbUxldmVsIG9yIHdpbmRvd0JpdHMgZm9yIGRlZmxhdGVJbml0KCkgaXMgY2hhbmdlZCwgdGhlbgorICAgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSB1cGRhdGVkLgorICovCit1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgKHNvdXJjZUxlbikKKyAgICB1TG9uZyBzb3VyY2VMZW47Cit7CisgICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKyAxMTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2NyYzMyLmMgYi91c3Iva2xpYmMvemxpYi9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NThhOWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9jcmMzMi5jCkBAIC0wLDAgKzEsNDIzIEBACisvKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogVGhhbmtzIHRvIFJvZG5leSBCcm93biA8cmJyb3duNjRAY3NjLmNvbS5hdT4gZm9yIGhpcyBjb250cmlidXRpb24gb2YgZmFzdGVyCisgKiBDUkMgbWV0aG9kczogZXhjbHVzaXZlLW9yaW5nIDMyIGJpdHMgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZCBwcmUtY29tcHV0aW5nCisgKiB0YWJsZXMgZm9yIHVwZGF0aW5nIHRoZSBzaGlmdCByZWdpc3RlciBpbiBvbmUgc3RlcCB3aXRoIHRocmVlIGV4Y2x1c2l2ZS1vcnMKKyAqIGluc3RlYWQgb2YgZm91ciBzdGVwcyB3aXRoIGZvdXIgZXhjbHVzaXZlLW9ycy4gIFRoaXMgcmVzdWx0cyBpbiBhYm91dCBhCisgKiBmYWN0b3Igb2YgdHdvIGluY3JlYXNlIGluIHNwZWVkIG9uIGEgUG93ZXIgUEMgRzQgKFBQQzc0NTUpIHVzaW5nIGdjYyAtTzMuCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKy8qCisgIE5vdGUgb24gdGhlIHVzZSBvZiBEWU5BTUlDX0NSQ19UQUJMRTogdGhlcmUgaXMgbm8gbXV0ZXggb3Igc2VtYXBob3JlCisgIHByb3RlY3Rpb24gb24gdGhlIHN0YXRpYyB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHRoZSBmaXJzdC11c2UgZ2VuZXJhdGlvbgorICBvZiB0aGUgY3JjIHRhYmxlcy4gIFRoZXJlZm9yZSwgaWYgeW91ICNkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUsIHlvdSBzaG91bGQKKyAgZmlyc3QgY2FsbCBnZXRfY3JjX3RhYmxlKCkgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzIGJlZm9yZSBhbGxvd2luZyBtb3JlIHRoYW4KKyAgb25lIHRocmVhZCB0byB1c2UgY3JjMzIoKS4KKyAqLworCisjaWZkZWYgTUFLRUNSQ0gKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBpZm5kZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyMgICAgZGVmaW5lIERZTkFNSUNfQ1JDX1RBQkxFCisjICBlbmRpZiAvKiAhRFlOQU1JQ19DUkNfVEFCTEUgKi8KKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworCisjaW5jbHVkZSAienV0aWwuaCIgICAgICAvKiBmb3IgU1REQyBhbmQgRkFSIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKKy8qIEZpbmQgYSBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlIGZvciBjcmMzMl9saXR0bGUoKSBhbmQgY3JjMzJfYmlnKCkuICovCisjaWZuZGVmIE5PQllGT1VSCisjICBpZmRlZiBTVERDICAgICAgICAgICAvKiBuZWVkIEFOU0kgQyBsaW1pdHMuaCB0byBkZXRlcm1pbmUgc2l6ZXMgKi8KKyMgICAgaW5jbHVkZSA8bGltaXRzLmg+CisjICAgIGRlZmluZSBCWUZPVVIKKyMgICAgaWYgKFVJTlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCB1NDsKKyMgICAgZWxzZQorIyAgICAgIGlmIChVTE9OR19NQVggPT0gMHhmZmZmZmZmZlVMKQorICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHU0OworIyAgICAgIGVsc2UKKyMgICAgICAgIGlmIChVU0hSVF9NQVggPT0gMHhmZmZmZmZmZlVMKQorICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHU0OworIyAgICAgICAgZWxzZQorIyAgICAgICAgICB1bmRlZiBCWUZPVVIgICAgIC8qIGNhbid0IGZpbmQgYSBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlISAqLworIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYgLyogU1REQyAqLworI2VuZGlmIC8qICFOT0JZRk9VUiAqLworCisvKiBEZWZpbml0aW9ucyBmb3IgZG9pbmcgdGhlIGNyYyBmb3VyIGRhdGEgYnl0ZXMgYXQgYSB0aW1lLiAqLworI2lmZGVmIEJZRk9VUgorIyAgZGVmaW5lIFJFVih3KSAoKCh3KT4+MjQpKygoKHcpPj44KSYweGZmMDApKyBcCisgICAgICAgICAgICAgICAgKCgodykmMHhmZjAwKTw8OCkrKCgodykmMHhmZik8PDI0KSkKKyAgIGxvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfbGl0dGxlIE9GKCh1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKiwgdW5zaWduZWQpKTsKKyAgIGxvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfYmlnIE9GKCh1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKiwgdW5zaWduZWQpKTsKKyMgIGRlZmluZSBUQkxTIDgKKyNlbHNlCisjICBkZWZpbmUgVEJMUyAxCisjZW5kaWYgLyogQllGT1VSICovCisKKy8qIExvY2FsIGZ1bmN0aW9ucyBmb3IgY3JjIGNvbmNhdGVuYXRpb24gKi8KK2xvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyBPRigodW5zaWduZWQgbG9uZyAqbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZlYykpOworbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZSBPRigodW5zaWduZWQgbG9uZyAqc3F1YXJlLCB1bnNpZ25lZCBsb25nICptYXQpKTsKKworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisKK2xvY2FsIHZvbGF0aWxlIGludCBjcmNfdGFibGVfZW1wdHkgPSAxOworbG9jYWwgdW5zaWduZWQgbG9uZyBGQVIgY3JjX3RhYmxlW1RCTFNdWzI1Nl07Citsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlIE9GKCh2b2lkKSk7CisjaWZkZWYgTUFLRUNSQ0gKKyAgIGxvY2FsIHZvaWQgd3JpdGVfdGFibGUgT0YoKEZJTEUgKiwgY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKikpOworI2VuZGlmIC8qIE1BS0VDUkNIICovCisvKgorICBHZW5lcmF0ZSB0YWJsZXMgZm9yIGEgYnl0ZS13aXNlIDMyLWJpdCBDUkMgY2FsY3VsYXRpb24gb24gdGhlIHBvbHlub21pYWw6CisgIHheMzIreF4yNit4XjIzK3heMjIreF4xNit4XjEyK3heMTEreF4xMCt4XjgreF43K3heNSt4XjQreF4yK3grMS4KKworICBQb2x5bm9taWFscyBvdmVyIEdGKDIpIGFyZSByZXByZXNlbnRlZCBpbiBiaW5hcnksIG9uZSBiaXQgcGVyIGNvZWZmaWNpZW50LAorICB3aXRoIHRoZSBsb3dlc3QgcG93ZXJzIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIFRoZW4gYWRkaW5nIHBvbHlub21pYWxzCisgIGlzIGp1c3QgZXhjbHVzaXZlLW9yLCBhbmQgbXVsdGlwbHlpbmcgYSBwb2x5bm9taWFsIGJ5IHggaXMgYSByaWdodCBzaGlmdCBieQorICBvbmUuICBJZiB3ZSBjYWxsIHRoZSBhYm92ZSBwb2x5bm9taWFsIHAsIGFuZCByZXByZXNlbnQgYSBieXRlIGFzIHRoZQorICBwb2x5bm9taWFsIHEsIGFsc28gd2l0aCB0aGUgbG93ZXN0IHBvd2VyIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCAoc28gdGhlCisgIGJ5dGUgMHhiMSBpcyB0aGUgcG9seW5vbWlhbCB4XjcreF4zK3grMSksIHRoZW4gdGhlIENSQyBpcyAocSp4XjMyKSBtb2QgcCwKKyAgd2hlcmUgYSBtb2QgYiBtZWFucyB0aGUgcmVtYWluZGVyIGFmdGVyIGRpdmlkaW5nIGEgYnkgYi4KKworICBUaGlzIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgdGhlIHNoaWZ0LXJlZ2lzdGVyIG1ldGhvZCBvZiBtdWx0aXBseWluZyBhbmQKKyAgdGFraW5nIHRoZSByZW1haW5kZXIuICBUaGUgcmVnaXN0ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybywgYW5kIGZvciBlYWNoCisgIGluY29taW5nIGJpdCwgeF4zMiBpcyBhZGRlZCBtb2QgcCB0byB0aGUgcmVnaXN0ZXIgaWYgdGhlIGJpdCBpcyBhIG9uZSAod2hlcmUKKyAgeF4zMiBtb2QgcCBpcyBwK3heMzIgPSB4XjI2Ky4uLisxKSwgYW5kIHRoZSByZWdpc3RlciBpcyBtdWx0aXBsaWVkIG1vZCBwIGJ5CisgIHggKHdoaWNoIGlzIHNoaWZ0aW5nIHJpZ2h0IGJ5IG9uZSBhbmQgYWRkaW5nIHheMzIgbW9kIHAgaWYgdGhlIGJpdCBzaGlmdGVkCisgIG91dCBpcyBhIG9uZSkuICBXZSBzdGFydCB3aXRoIHRoZSBoaWdoZXN0IHBvd2VyIChsZWFzdCBzaWduaWZpY2FudCBiaXQpIG9mCisgIHEgYW5kIHJlcGVhdCBmb3IgYWxsIGVpZ2h0IGJpdHMgb2YgcS4KKworICBUaGUgZmlyc3QgdGFibGUgaXMgc2ltcGx5IHRoZSBDUkMgb2YgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMuICBUaGlzIGlzCisgIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGdlbmVyYXRlIENSQ3Mgb24gZGF0YSBhIGJ5dGUgYXQgYSB0aW1lIGZvciBhbGwKKyAgY29tYmluYXRpb25zIG9mIENSQyByZWdpc3RlciB2YWx1ZXMgYW5kIGluY29taW5nIGJ5dGVzLiAgVGhlIHJlbWFpbmluZyB0YWJsZXMKKyAgYWxsb3cgZm9yIHdvcmQtYXQtYS10aW1lIENSQyBjYWxjdWxhdGlvbiBmb3IgYm90aCBiaWctZW5kaWFuIGFuZCBsaXR0bGUtCisgIGVuZGlhbiBtYWNoaW5lcywgd2hlcmUgYSB3b3JkIGlzIGZvdXIgYnl0ZXMuCisqLworbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSgpCit7CisgICAgdW5zaWduZWQgbG9uZyBjOworICAgIGludCBuLCBrOworICAgIHVuc2lnbmVkIGxvbmcgcG9seTsgICAgICAgICAgICAgICAgIC8qIHBvbHlub21pYWwgZXhjbHVzaXZlLW9yIHBhdHRlcm4gKi8KKyAgICAvKiB0ZXJtcyBvZiBwb2x5bm9taWFsIGRlZmluaW5nIHRoaXMgY3JjIChleGNlcHQgeF4zMik6ICovCisgICAgc3RhdGljIHZvbGF0aWxlIGludCBmaXJzdCA9IDE7ICAgICAgLyogZmxhZyB0byBsaW1pdCBjb25jdXJyZW50IG1ha2luZyAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBbXSA9IHswLDEsMiw0LDUsNyw4LDEwLDExLDEyLDE2LDIyLDIzLDI2fTsKKworICAgIC8qIFNlZSBpZiBhbm90aGVyIHRhc2sgaXMgYWxyZWFkeSBkb2luZyB0aGlzIChub3QgdGhyZWFkLXNhZmUsIGJ1dCBiZXR0ZXIKKyAgICAgICB0aGFuIG5vdGhpbmcgLS0gc2lnbmlmaWNhbnRseSByZWR1Y2VzIGR1cmF0aW9uIG9mIHZ1bG5lcmFiaWxpdHkgaW4KKyAgICAgICBjYXNlIHRoZSBhZHZpY2UgYWJvdXQgRFlOQU1JQ19DUkNfVEFCTEUgaXMgaWdub3JlZCkgKi8KKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSAwOworCisgICAgICAgIC8qIG1ha2UgZXhjbHVzaXZlLW9yIHBhdHRlcm4gZnJvbSBwb2x5bm9taWFsICgweGVkYjg4MzIwVUwpICovCisgICAgICAgIHBvbHkgPSAwVUw7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOyBuKyspCisgICAgICAgICAgICBwb2x5IHw9IDFVTCA8PCAoMzEgLSBwW25dKTsKKworICAgICAgICAvKiBnZW5lcmF0ZSBhIGNyYyBmb3IgZXZlcnkgOC1iaXQgdmFsdWUgKi8KKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7CisgICAgICAgICAgICBjID0gKHVuc2lnbmVkIGxvbmcpbjsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgYyA9IGMgJiAxID8gcG9seSBeIChjID4+IDEpIDogYyA+PiAxOworICAgICAgICAgICAgY3JjX3RhYmxlWzBdW25dID0gYzsKKyAgICAgICAgfQorCisjaWZkZWYgQllGT1VSCisgICAgICAgIC8qIGdlbmVyYXRlIGNyYyBmb3IgZWFjaCB2YWx1ZSBmb2xsb3dlZCBieSBvbmUsIHR3bywgYW5kIHRocmVlIHplcm9zLAorICAgICAgICAgICBhbmQgdGhlbiB0aGUgYnl0ZSByZXZlcnNhbCBvZiB0aG9zZSBhcyB3ZWxsIGFzIHRoZSBmaXJzdCB0YWJsZSAqLworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKKyAgICAgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bbl07CisgICAgICAgICAgICBjcmNfdGFibGVbNF1bbl0gPSBSRVYoYyk7CisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgNDsgaysrKSB7CisgICAgICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtjICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICAgICAgICAgICAgICBjcmNfdGFibGVba11bbl0gPSBjOworICAgICAgICAgICAgICAgIGNyY190YWJsZVtrICsgNF1bbl0gPSBSRVYoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBCWUZPVVIgKi8KKworICAgICAgICBjcmNfdGFibGVfZW1wdHkgPSAwOworICAgIH0KKyAgICBlbHNlIHsgICAgICAvKiBub3QgZmlyc3QgKi8KKyAgICAgICAgLyogd2FpdCBmb3IgdGhlIG90aGVyIGd1eSB0byBmaW5pc2ggKG5vdCBlZmZpY2llbnQsIGJ1dCByYXJlKSAqLworICAgICAgICB3aGlsZSAoY3JjX3RhYmxlX2VtcHR5KQorICAgICAgICAgICAgOworICAgIH0KKworI2lmZGVmIE1BS0VDUkNICisgICAgLyogd3JpdGUgb3V0IENSQyB0YWJsZXMgdG8gY3JjMzIuaCAqLworICAgIHsKKyAgICAgICAgRklMRSAqb3V0OworCisgICAgICAgIG91dCA9IGZvcGVuKCJjcmMzMi5oIiwgInciKTsKKyAgICAgICAgaWYgKG91dCA9PSBOVUxMKSByZXR1cm47CisgICAgICAgIGZwcmludGYob3V0LCAiLyogY3JjMzIuaCAtLSB0YWJsZXMgZm9yIHJhcGlkIENSQyBjYWxjdWxhdGlvblxuIik7CisgICAgICAgIGZwcmludGYob3V0LCAiICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuY1xuICovXG5cbiIpOworICAgICAgICBmcHJpbnRmKG91dCwgImxvY2FsIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICIpOworICAgICAgICBmcHJpbnRmKG91dCwgImNyY190YWJsZVtUQkxTXVsyNTZdID1cbntcbiAge1xuIik7CisgICAgICAgIHdyaXRlX3RhYmxlKG91dCwgY3JjX3RhYmxlWzBdKTsKKyMgIGlmZGVmIEJZRk9VUgorICAgICAgICBmcHJpbnRmKG91dCwgIiNpZmRlZiBCWUZPVVJcbiIpOworICAgICAgICBmb3IgKGsgPSAxOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiAgfSxcbiAge1xuIik7CisgICAgICAgICAgICB3cml0ZV90YWJsZShvdXQsIGNyY190YWJsZVtrXSk7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihvdXQsICIjZW5kaWZcbiIpOworIyAgZW5kaWYgLyogQllGT1VSICovCisgICAgICAgIGZwcmludGYob3V0LCAiICB9XG59O1xuIik7CisgICAgICAgIGZjbG9zZShvdXQpOworICAgIH0KKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworfQorCisjaWZkZWYgTUFLRUNSQ0gKK2xvY2FsIHZvaWQgd3JpdGVfdGFibGUob3V0LCB0YWJsZSkKKyAgICBGSUxFICpvdXQ7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKnRhYmxlOworeworICAgIGludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQorICAgICAgICBmcHJpbnRmKG91dCwgIiVzMHglMDhseFVMJXMiLCBuICUgNSA/ICIiIDogIiAgICAiLCB0YWJsZVtuXSwKKyAgICAgICAgICAgICAgICBuID09IDI1NSA/ICJcbiIgOiAobiAlIDUgPT0gNCA/ICIsXG4iIDogIiwgIikpOworfQorI2VuZGlmIC8qIE1BS0VDUkNIICovCisKKyNlbHNlIC8qICFEWU5BTUlDX0NSQ19UQUJMRSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUYWJsZXMgb2YgQ1JDLTMycyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzLCBtYWRlIGJ5IG1ha2VfY3JjX3RhYmxlKCkuCisgKi8KKyNpbmNsdWRlICJjcmMzMi5oIgorI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgYXNtIHZlcnNpb25zIG9mIGNyYzMyKCkKKyAqLworY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUoKQoreworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgaWYgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLworICAgIHJldHVybiAoY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKiljcmNfdGFibGU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgRE8xIGNyYyA9IGNyY190YWJsZVswXVsoKGludCljcmMgXiAoKmJ1ZisrKSkgJiAweGZmXSBeIChjcmMgPj4gOCkKKyNkZWZpbmUgRE84IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3Vuc2lnbmVkIGxvbmcgWkVYUE9SVCBjcmMzMihjcmMsIGJ1ZiwgbGVuKQorICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMFVMOworCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQorICAgICAgICBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCisKKyNpZmRlZiBCWUZPVVIKKyAgICBpZiAoc2l6ZW9mKHZvaWQgKikgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpIHsKKyAgICAgICAgdTQgZW5kaWFuOworCisgICAgICAgIGVuZGlhbiA9IDE7CisgICAgICAgIGlmICgqKCh1bnNpZ25lZCBjaGFyICopKCZlbmRpYW4pKSkKKyAgICAgICAgICAgIHJldHVybiBjcmMzMl9saXR0bGUoY3JjLCBidWYsIGxlbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbik7CisgICAgfQorI2VuZGlmIC8qIEJZRk9VUiAqLworICAgIGNyYyA9IGNyYyBeIDB4ZmZmZmZmZmZVTDsKKyAgICB3aGlsZSAobGVuID49IDgpIHsKKyAgICAgICAgRE84OworICAgICAgICBsZW4gLT0gODsKKyAgICB9CisgICAgaWYgKGxlbikgZG8geworICAgICAgICBETzE7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmVUw7Cit9CisKKyNpZmRlZiBCWUZPVVIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBET0xJVDQgYyBePSAqYnVmNCsrOyBcCisgICAgICAgIGMgPSBjcmNfdGFibGVbM11bYyAmIDB4ZmZdIF4gY3JjX3RhYmxlWzJdWyhjID4+IDgpICYgMHhmZl0gXiBcCisgICAgICAgICAgICBjcmNfdGFibGVbMV1bKGMgPj4gMTYpICYgMHhmZl0gXiBjcmNfdGFibGVbMF1bYyA+PiAyNF0KKyNkZWZpbmUgRE9MSVQzMiBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZShjcmMsIGJ1ZiwgbGVuKQorICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIHJlZ2lzdGVyIHU0IGM7CisgICAgcmVnaXN0ZXIgY29uc3QgdTQgRkFSICpidWY0OworCisgICAgYyA9ICh1NCljcmM7CisgICAgYyA9IH5jOworICAgIHdoaWxlIChsZW4gJiYgKChwdHJkaWZmX3QpYnVmICYgMykpIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKKyAgICB3aGlsZSAobGVuID49IDMyKSB7CisgICAgICAgIERPTElUMzI7CisgICAgICAgIGxlbiAtPSAzMjsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgICAgIERPTElUNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgfQorICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqKWJ1ZjQ7CisKKyAgICBpZiAobGVuKSBkbyB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bKGMgXiAqYnVmKyspICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICB9IHdoaWxlICgtLWxlbik7CisgICAgYyA9IH5jOworICAgIHJldHVybiAodW5zaWduZWQgbG9uZyljOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIERPQklHNCBjIF49ICorK2J1ZjQ7IFwKKyAgICAgICAgYyA9IGNyY190YWJsZVs0XVtjICYgMHhmZl0gXiBjcmNfdGFibGVbNV1bKGMgPj4gOCkgJiAweGZmXSBeIFwKKyAgICAgICAgICAgIGNyY190YWJsZVs2XVsoYyA+PiAxNikgJiAweGZmXSBeIGNyY190YWJsZVs3XVtjID4+IDI0XQorI2RlZmluZSBET0JJRzMyIERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfYmlnKGNyYywgYnVmLCBsZW4pCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgcmVnaXN0ZXIgdTQgYzsKKyAgICByZWdpc3RlciBjb25zdCB1NCBGQVIgKmJ1ZjQ7CisKKyAgICBjID0gUkVWKCh1NCljcmMpOworICAgIGMgPSB+YzsKKyAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKKyAgICBidWY0LS07CisgICAgd2hpbGUgKGxlbiA+PSAzMikgeworICAgICAgICBET0JJRzMyOworICAgICAgICBsZW4gLT0gMzI7CisgICAgfQorICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgICBET0JJRzQ7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKyAgICBidWY0Kys7CisgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKKworICAgIGlmIChsZW4pIGRvIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVs0XVsoYyA+PiAyNCkgXiAqYnVmKytdIF4gKGMgPDwgOCk7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIGMgPSB+YzsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKFJFVihjKSk7Cit9CisKKyNlbmRpZiAvKiBCWUZPVVIgKi8KKworI2RlZmluZSBHRjJfRElNIDMyICAgICAgLyogZGltZW5zaW9uIG9mIEdGKDIpIHZlY3RvcnMgKGxlbmd0aCBvZiBDUkMpICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyhtYXQsIHZlYykKKyAgICB1bnNpZ25lZCBsb25nICptYXQ7CisgICAgdW5zaWduZWQgbG9uZyB2ZWM7Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW07CisKKyAgICBzdW0gPSAwOworICAgIHdoaWxlICh2ZWMpIHsKKyAgICAgICAgaWYgKHZlYyAmIDEpCisgICAgICAgICAgICBzdW0gXj0gKm1hdDsKKyAgICAgICAgdmVjID4+PSAxOworICAgICAgICBtYXQrKzsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZShzcXVhcmUsIG1hdCkKKyAgICB1bnNpZ25lZCBsb25nICpzcXVhcmU7CisgICAgdW5zaWduZWQgbG9uZyAqbWF0OworeworICAgIGludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IEdGMl9ESU07IG4rKykKKyAgICAgICAgc3F1YXJlW25dID0gZ2YyX21hdHJpeF90aW1lcyhtYXQsIG1hdFtuXSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZl90IGxlbjI7Cit7CisgICAgaW50IG47CisgICAgdW5zaWduZWQgbG9uZyByb3c7CisgICAgdW5zaWduZWQgbG9uZyBldmVuW0dGMl9ESU1dOyAgICAvKiBldmVuLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLworICAgIHVuc2lnbmVkIGxvbmcgb2RkW0dGMl9ESU1dOyAgICAgLyogb2RkLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLworCisgICAgLyogZGVnZW5lcmF0ZSBjYXNlICovCisgICAgaWYgKGxlbjIgPT0gMCkKKyAgICAgICAgcmV0dXJuIGNyYzE7CisKKyAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIG9uZSB6ZXJvIGJpdCBpbiBvZGQgKi8KKyAgICBvZGRbMF0gPSAweGVkYjg4MzIwTDsgICAgICAgICAgIC8qIENSQy0zMiBwb2x5bm9taWFsICovCisgICAgcm93ID0gMTsKKyAgICBmb3IgKG4gPSAxOyBuIDwgR0YyX0RJTTsgbisrKSB7CisgICAgICAgIG9kZFtuXSA9IHJvdzsKKyAgICAgICAgcm93IDw8PSAxOworICAgIH0KKworICAgIC8qIHB1dCBvcGVyYXRvciBmb3IgdHdvIHplcm8gYml0cyBpbiBldmVuICovCisgICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKKworICAgIC8qIHB1dCBvcGVyYXRvciBmb3IgZm91ciB6ZXJvIGJpdHMgaW4gb2RkICovCisgICAgZ2YyX21hdHJpeF9zcXVhcmUob2RkLCBldmVuKTsKKworICAgIC8qIGFwcGx5IGxlbjIgemVyb3MgdG8gY3JjMSAoZmlyc3Qgc3F1YXJlIHdpbGwgcHV0IHRoZSBvcGVyYXRvciBmb3Igb25lCisgICAgICAgemVybyBieXRlLCBlaWdodCB6ZXJvIGJpdHMsIGluIGV2ZW4pICovCisgICAgZG8geworICAgICAgICAvKiBhcHBseSB6ZXJvcyBvcGVyYXRvciBmb3IgdGhpcyBiaXQgb2YgbGVuMiAqLworICAgICAgICBnZjJfbWF0cml4X3NxdWFyZShldmVuLCBvZGQpOworICAgICAgICBpZiAobGVuMiAmIDEpCisgICAgICAgICAgICBjcmMxID0gZ2YyX21hdHJpeF90aW1lcyhldmVuLCBjcmMxKTsKKyAgICAgICAgbGVuMiA+Pj0gMTsKKworICAgICAgICAvKiBpZiBubyBtb3JlIGJpdHMgc2V0LCB0aGVuIGRvbmUgKi8KKyAgICAgICAgaWYgKGxlbjIgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGFub3RoZXIgaXRlcmF0aW9uIG9mIHRoZSBsb29wIHdpdGggb2RkIGFuZCBldmVuIHN3YXBwZWQgKi8KKyAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUob2RkLCBldmVuKTsKKyAgICAgICAgaWYgKGxlbjIgJiAxKQorICAgICAgICAgICAgY3JjMSA9IGdmMl9tYXRyaXhfdGltZXMob2RkLCBjcmMxKTsKKyAgICAgICAgbGVuMiA+Pj0gMTsKKworICAgICAgICAvKiBpZiBubyBtb3JlIGJpdHMgc2V0LCB0aGVuIGRvbmUgKi8KKyAgICB9IHdoaWxlIChsZW4yICE9IDApOworCisgICAgLyogcmV0dXJuIGNvbWJpbmVkIGNyYyAqLworICAgIGNyYzEgXj0gY3JjMjsKKyAgICByZXR1cm4gY3JjMTsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2NyYzMyLmggYi91c3Iva2xpYmMvemxpYi9jcmMzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTNiNjEKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9jcmMzMi5oCkBAIC0wLDAgKzEsNDQxIEBACisvKiBjcmMzMi5oIC0tIHRhYmxlcyBmb3IgcmFwaWQgQ1JDIGNhbGN1bGF0aW9uCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjcmMzMi5jCisgKi8KKworbG9jYWwgY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgY3JjX3RhYmxlW1RCTFNdWzI1Nl0gPQoreworICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDc3MDczMDk2VUwsIDB4ZWUwZTYxMmNVTCwgMHg5OTA5NTFiYVVMLCAweDA3NmRjNDE5VUwsCisgICAgMHg3MDZhZjQ4ZlVMLCAweGU5NjNhNTM1VUwsIDB4OWU2NDk1YTNVTCwgMHgwZWRiODgzMlVMLCAweDc5ZGNiOGE0VUwsCisgICAgMHhlMGQ1ZTkxZVVMLCAweDk3ZDJkOTg4VUwsIDB4MDliNjRjMmJVTCwgMHg3ZWIxN2NiZFVMLCAweGU3YjgyZDA3VUwsCisgICAgMHg5MGJmMWQ5MVVMLCAweDFkYjcxMDY0VUwsIDB4NmFiMDIwZjJVTCwgMHhmM2I5NzE0OFVMLCAweDg0YmU0MWRlVUwsCisgICAgMHgxYWRhZDQ3ZFVMLCAweDZkZGRlNGViVUwsIDB4ZjRkNGI1NTFVTCwgMHg4M2QzODVjN1VMLCAweDEzNmM5ODU2VUwsCisgICAgMHg2NDZiYThjMFVMLCAweGZkNjJmOTdhVUwsIDB4OGE2NWM5ZWNVTCwgMHgxNDAxNWM0ZlVMLCAweDYzMDY2Y2Q5VUwsCisgICAgMHhmYTBmM2Q2M1VMLCAweDhkMDgwZGY1VUwsIDB4M2I2ZTIwYzhVTCwgMHg0YzY5MTA1ZVVMLCAweGQ1NjA0MWU0VUwsCisgICAgMHhhMjY3NzE3MlVMLCAweDNjMDNlNGQxVUwsIDB4NGIwNGQ0NDdVTCwgMHhkMjBkODVmZFVMLCAweGE1MGFiNTZiVUwsCisgICAgMHgzNWI1YThmYVVMLCAweDQyYjI5ODZjVUwsIDB4ZGJiYmM5ZDZVTCwgMHhhY2JjZjk0MFVMLCAweDMyZDg2Y2UzVUwsCisgICAgMHg0NWRmNWM3NVVMLCAweGRjZDYwZGNmVUwsIDB4YWJkMTNkNTlVTCwgMHgyNmQ5MzBhY1VMLCAweDUxZGUwMDNhVUwsCisgICAgMHhjOGQ3NTE4MFVMLCAweGJmZDA2MTE2VUwsIDB4MjFiNGY0YjVVTCwgMHg1NmIzYzQyM1VMLCAweGNmYmE5NTk5VUwsCisgICAgMHhiOGJkYTUwZlVMLCAweDI4MDJiODllVUwsIDB4NWYwNTg4MDhVTCwgMHhjNjBjZDliMlVMLCAweGIxMGJlOTI0VUwsCisgICAgMHgyZjZmN2M4N1VMLCAweDU4Njg0YzExVUwsIDB4YzE2MTFkYWJVTCwgMHhiNjY2MmQzZFVMLCAweDc2ZGM0MTkwVUwsCisgICAgMHgwMWRiNzEwNlVMLCAweDk4ZDIyMGJjVUwsIDB4ZWZkNTEwMmFVTCwgMHg3MWIxODU4OVVMLCAweDA2YjZiNTFmVUwsCisgICAgMHg5ZmJmZTRhNVVMLCAweGU4YjhkNDMzVUwsIDB4NzgwN2M5YTJVTCwgMHgwZjAwZjkzNFVMLCAweDk2MDlhODhlVUwsCisgICAgMHhlMTBlOTgxOFVMLCAweDdmNmEwZGJiVUwsIDB4MDg2ZDNkMmRVTCwgMHg5MTY0NmM5N1VMLCAweGU2NjM1YzAxVUwsCisgICAgMHg2YjZiNTFmNFVMLCAweDFjNmM2MTYyVUwsIDB4ODU2NTMwZDhVTCwgMHhmMjYyMDA0ZVVMLCAweDZjMDY5NWVkVUwsCisgICAgMHgxYjAxYTU3YlVMLCAweDgyMDhmNGMxVUwsIDB4ZjUwZmM0NTdVTCwgMHg2NWIwZDljNlVMLCAweDEyYjdlOTUwVUwsCisgICAgMHg4YmJlYjhlYVVMLCAweGZjYjk4ODdjVUwsIDB4NjJkZDFkZGZVTCwgMHgxNWRhMmQ0OVVMLCAweDhjZDM3Y2YzVUwsCisgICAgMHhmYmQ0NGM2NVVMLCAweDRkYjI2MTU4VUwsIDB4M2FiNTUxY2VVTCwgMHhhM2JjMDA3NFVMLCAweGQ0YmIzMGUyVUwsCisgICAgMHg0YWRmYTU0MVVMLCAweDNkZDg5NWQ3VUwsIDB4YTRkMWM0NmRVTCwgMHhkM2Q2ZjRmYlVMLCAweDQzNjllOTZhVUwsCisgICAgMHgzNDZlZDlmY1VMLCAweGFkNjc4ODQ2VUwsIDB4ZGE2MGI4ZDBVTCwgMHg0NDA0MmQ3M1VMLCAweDMzMDMxZGU1VUwsCisgICAgMHhhYTBhNGM1ZlVMLCAweGRkMGQ3Y2M5VUwsIDB4NTAwNTcxM2NVTCwgMHgyNzAyNDFhYVVMLCAweGJlMGIxMDEwVUwsCisgICAgMHhjOTBjMjA4NlVMLCAweDU3NjhiNTI1VUwsIDB4MjA2Zjg1YjNVTCwgMHhiOTY2ZDQwOVVMLCAweGNlNjFlNDlmVUwsCisgICAgMHg1ZWRlZjkwZVVMLCAweDI5ZDljOTk4VUwsIDB4YjBkMDk4MjJVTCwgMHhjN2Q3YThiNFVMLCAweDU5YjMzZDE3VUwsCisgICAgMHgyZWI0MGQ4MVVMLCAweGI3YmQ1YzNiVUwsIDB4YzBiYTZjYWRVTCwgMHhlZGI4ODMyMFVMLCAweDlhYmZiM2I2VUwsCisgICAgMHgwM2I2ZTIwY1VMLCAweDc0YjFkMjlhVUwsIDB4ZWFkNTQ3MzlVTCwgMHg5ZGQyNzdhZlVMLCAweDA0ZGIyNjE1VUwsCisgICAgMHg3M2RjMTY4M1VMLCAweGUzNjMwYjEyVUwsIDB4OTQ2NDNiODRVTCwgMHgwZDZkNmEzZVVMLCAweDdhNmE1YWE4VUwsCisgICAgMHhlNDBlY2YwYlVMLCAweDkzMDlmZjlkVUwsIDB4MGEwMGFlMjdVTCwgMHg3ZDA3OWViMVVMLCAweGYwMGY5MzQ0VUwsCisgICAgMHg4NzA4YTNkMlVMLCAweDFlMDFmMjY4VUwsIDB4NjkwNmMyZmVVTCwgMHhmNzYyNTc1ZFVMLCAweDgwNjU2N2NiVUwsCisgICAgMHgxOTZjMzY3MVVMLCAweDZlNmIwNmU3VUwsIDB4ZmVkNDFiNzZVTCwgMHg4OWQzMmJlMFVMLCAweDEwZGE3YTVhVUwsCisgICAgMHg2N2RkNGFjY1VMLCAweGY5YjlkZjZmVUwsIDB4OGViZWVmZjlVTCwgMHgxN2I3YmU0M1VMLCAweDYwYjA4ZWQ1VUwsCisgICAgMHhkNmQ2YTNlOFVMLCAweGExZDE5MzdlVUwsIDB4MzhkOGMyYzRVTCwgMHg0ZmRmZjI1MlVMLCAweGQxYmI2N2YxVUwsCisgICAgMHhhNmJjNTc2N1VMLCAweDNmYjUwNmRkVUwsIDB4NDhiMjM2NGJVTCwgMHhkODBkMmJkYVVMLCAweGFmMGExYjRjVUwsCisgICAgMHgzNjAzNGFmNlVMLCAweDQxMDQ3YTYwVUwsIDB4ZGY2MGVmYzNVTCwgMHhhODY3ZGY1NVVMLCAweDMxNmU4ZWVmVUwsCisgICAgMHg0NjY5YmU3OVVMLCAweGNiNjFiMzhjVUwsIDB4YmM2NjgzMWFVTCwgMHgyNTZmZDJhMFVMLCAweDUyNjhlMjM2VUwsCisgICAgMHhjYzBjNzc5NVVMLCAweGJiMGI0NzAzVUwsIDB4MjIwMjE2YjlVTCwgMHg1NTA1MjYyZlVMLCAweGM1YmEzYmJlVUwsCisgICAgMHhiMmJkMGIyOFVMLCAweDJiYjQ1YTkyVUwsIDB4NWNiMzZhMDRVTCwgMHhjMmQ3ZmZhN1VMLCAweGI1ZDBjZjMxVUwsCisgICAgMHgyY2Q5OWU4YlVMLCAweDViZGVhZTFkVUwsIDB4OWI2NGMyYjBVTCwgMHhlYzYzZjIyNlVMLCAweDc1NmFhMzljVUwsCisgICAgMHgwMjZkOTMwYVVMLCAweDljMDkwNmE5VUwsIDB4ZWIwZTM2M2ZVTCwgMHg3MjA3Njc4NVVMLCAweDA1MDA1NzEzVUwsCisgICAgMHg5NWJmNGE4MlVMLCAweGUyYjg3YTE0VUwsIDB4N2JiMTJiYWVVTCwgMHgwY2I2MWIzOFVMLCAweDkyZDI4ZTliVUwsCisgICAgMHhlNWQ1YmUwZFVMLCAweDdjZGNlZmI3VUwsIDB4MGJkYmRmMjFVTCwgMHg4NmQzZDJkNFVMLCAweGYxZDRlMjQyVUwsCisgICAgMHg2OGRkYjNmOFVMLCAweDFmZGE4MzZlVUwsIDB4ODFiZTE2Y2RVTCwgMHhmNmI5MjY1YlVMLCAweDZmYjA3N2UxVUwsCisgICAgMHgxOGI3NDc3N1VMLCAweDg4MDg1YWU2VUwsIDB4ZmYwZjZhNzBVTCwgMHg2NjA2M2JjYVVMLCAweDExMDEwYjVjVUwsCisgICAgMHg4ZjY1OWVmZlVMLCAweGY4NjJhZTY5VUwsIDB4NjE2YmZmZDNVTCwgMHgxNjZjY2Y0NVVMLCAweGEwMGFlMjc4VUwsCisgICAgMHhkNzBkZDJlZVVMLCAweDRlMDQ4MzU0VUwsIDB4MzkwM2IzYzJVTCwgMHhhNzY3MjY2MVVMLCAweGQwNjAxNmY3VUwsCisgICAgMHg0OTY5NDc0ZFVMLCAweDNlNmU3N2RiVUwsIDB4YWVkMTZhNGFVTCwgMHhkOWQ2NWFkY1VMLCAweDQwZGYwYjY2VUwsCisgICAgMHgzN2Q4M2JmMFVMLCAweGE5YmNhZTUzVUwsIDB4ZGViYjllYzVVTCwgMHg0N2IyY2Y3ZlVMLCAweDMwYjVmZmU5VUwsCisgICAgMHhiZGJkZjIxY1VMLCAweGNhYmFjMjhhVUwsIDB4NTNiMzkzMzBVTCwgMHgyNGI0YTNhNlVMLCAweGJhZDAzNjA1VUwsCisgICAgMHhjZGQ3MDY5M1VMLCAweDU0ZGU1NzI5VUwsIDB4MjNkOTY3YmZVTCwgMHhiMzY2N2EyZVVMLCAweGM0NjE0YWI4VUwsCisgICAgMHg1ZDY4MWIwMlVMLCAweDJhNmYyYjk0VUwsIDB4YjQwYmJlMzdVTCwgMHhjMzBjOGVhMVVMLCAweDVhMDVkZjFiVUwsCisgICAgMHgyZDAyZWY4ZFVMCisjaWZkZWYgQllGT1VSCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4MTkxYjMxNDFVTCwgMHgzMjM2NjI4MlVMLCAweDJiMmQ1M2MzVUwsIDB4NjQ2Y2M1MDRVTCwKKyAgICAweDdkNzdmNDQ1VUwsIDB4NTY1YWE3ODZVTCwgMHg0ZjQxOTZjN1VMLCAweGM4ZDk4YTA4VUwsIDB4ZDFjMmJiNDlVTCwKKyAgICAweGZhZWZlODhhVUwsIDB4ZTNmNGQ5Y2JVTCwgMHhhY2I1NGYwY1VMLCAweGI1YWU3ZTRkVUwsIDB4OWU4MzJkOGVVTCwKKyAgICAweDg3OTgxY2NmVUwsIDB4NGFjMjEyNTFVTCwgMHg1M2Q5MjMxMFVMLCAweDc4ZjQ3MGQzVUwsIDB4NjFlZjQxOTJVTCwKKyAgICAweDJlYWVkNzU1VUwsIDB4MzdiNWU2MTRVTCwgMHgxYzk4YjVkN1VMLCAweDA1ODM4NDk2VUwsIDB4ODIxYjk4NTlVTCwKKyAgICAweDliMDBhOTE4VUwsIDB4YjAyZGZhZGJVTCwgMHhhOTM2Y2I5YVVMLCAweGU2Nzc1ZDVkVUwsIDB4ZmY2YzZjMWNVTCwKKyAgICAweGQ0NDEzZmRmVUwsIDB4Y2Q1YTBlOWVVTCwgMHg5NTg0MjRhMlVMLCAweDhjOWYxNWUzVUwsIDB4YTdiMjQ2MjBVTCwKKyAgICAweGJlYTk3NzYxVUwsIDB4ZjFlOGUxYTZVTCwgMHhlOGYzZDBlN1VMLCAweGMzZGU4MzI0VUwsIDB4ZGFjNWIyNjVVTCwKKyAgICAweDVkNWRhZWFhVUwsIDB4NDQ0NjlmZWJVTCwgMHg2ZjZiY2MyOFVMLCAweDc2NzBmZDY5VUwsIDB4MzkzMTZiYWVVTCwKKyAgICAweDIwMmE1YWVmVUwsIDB4MGIwNzA5MmNVTCwgMHgxMjFjMzg2ZFVMLCAweGRmNDYzNmYzVUwsIDB4YzY1ZDA3YjJVTCwKKyAgICAweGVkNzA1NDcxVUwsIDB4ZjQ2YjY1MzBVTCwgMHhiYjJhZjNmN1VMLCAweGEyMzFjMmI2VUwsIDB4ODkxYzkxNzVVTCwKKyAgICAweDkwMDdhMDM0VUwsIDB4MTc5ZmJjZmJVTCwgMHgwZTg0OGRiYVVMLCAweDI1YTlkZTc5VUwsIDB4M2NiMmVmMzhVTCwKKyAgICAweDczZjM3OWZmVUwsIDB4NmFlODQ4YmVVTCwgMHg0MWM1MWI3ZFVMLCAweDU4ZGUyYTNjVUwsIDB4ZjA3OTRmMDVVTCwKKyAgICAweGU5NjI3ZTQ0VUwsIDB4YzI0ZjJkODdVTCwgMHhkYjU0MWNjNlVMLCAweDk0MTU4YTAxVUwsIDB4OGQwZWJiNDBVTCwKKyAgICAweGE2MjNlODgzVUwsIDB4YmYzOGQ5YzJVTCwgMHgzOGEwYzUwZFVMLCAweDIxYmJmNDRjVUwsIDB4MGE5NmE3OGZVTCwKKyAgICAweDEzOGQ5NmNlVUwsIDB4NWNjYzAwMDlVTCwgMHg0NWQ3MzE0OFVMLCAweDZlZmE2MjhiVUwsIDB4NzdlMTUzY2FVTCwKKyAgICAweGJhYmI1ZDU0VUwsIDB4YTNhMDZjMTVVTCwgMHg4ODhkM2ZkNlVMLCAweDkxOTYwZTk3VUwsIDB4ZGVkNzk4NTBVTCwKKyAgICAweGM3Y2NhOTExVUwsIDB4ZWNlMWZhZDJVTCwgMHhmNWZhY2I5M1VMLCAweDcyNjJkNzVjVUwsIDB4NmI3OWU2MWRVTCwKKyAgICAweDQwNTRiNWRlVUwsIDB4NTk0Zjg0OWZVTCwgMHgxNjBlMTI1OFVMLCAweDBmMTUyMzE5VUwsIDB4MjQzODcwZGFVTCwKKyAgICAweDNkMjM0MTliVUwsIDB4NjVmZDZiYTdVTCwgMHg3Y2U2NWFlNlVMLCAweDU3Y2IwOTI1VUwsIDB4NGVkMDM4NjRVTCwKKyAgICAweDAxOTFhZWEzVUwsIDB4MTg4YTlmZTJVTCwgMHgzM2E3Y2MyMVVMLCAweDJhYmNmZDYwVUwsIDB4YWQyNGUxYWZVTCwKKyAgICAweGI0M2ZkMGVlVUwsIDB4OWYxMjgzMmRVTCwgMHg4NjA5YjI2Y1VMLCAweGM5NDgyNGFiVUwsIDB4ZDA1MzE1ZWFVTCwKKyAgICAweGZiN2U0NjI5VUwsIDB4ZTI2NTc3NjhVTCwgMHgyZjNmNzlmNlVMLCAweDM2MjQ0OGI3VUwsIDB4MWQwOTFiNzRVTCwKKyAgICAweDA0MTIyYTM1VUwsIDB4NGI1M2JjZjJVTCwgMHg1MjQ4OGRiM1VMLCAweDc5NjVkZTcwVUwsIDB4NjA3ZWVmMzFVTCwKKyAgICAweGU3ZTZmM2ZlVUwsIDB4ZmVmZGMyYmZVTCwgMHhkNWQwOTE3Y1VMLCAweGNjY2JhMDNkVUwsIDB4ODM4YTM2ZmFVTCwKKyAgICAweDlhOTEwN2JiVUwsIDB4YjFiYzU0NzhVTCwgMHhhOGE3NjUzOVVMLCAweDNiODM5ODRiVUwsIDB4MjI5OGE5MGFVTCwKKyAgICAweDA5YjVmYWM5VUwsIDB4MTBhZWNiODhVTCwgMHg1ZmVmNWQ0ZlVMLCAweDQ2ZjQ2YzBlVUwsIDB4NmRkOTNmY2RVTCwKKyAgICAweDc0YzIwZThjVUwsIDB4ZjM1YTEyNDNVTCwgMHhlYTQxMjMwMlVMLCAweGMxNmM3MGMxVUwsIDB4ZDg3NzQxODBVTCwKKyAgICAweDk3MzZkNzQ3VUwsIDB4OGUyZGU2MDZVTCwgMHhhNTAwYjVjNVVMLCAweGJjMWI4NDg0VUwsIDB4NzE0MThhMWFVTCwKKyAgICAweDY4NWFiYjViVUwsIDB4NDM3N2U4OThVTCwgMHg1YTZjZDlkOVVMLCAweDE1MmQ0ZjFlVUwsIDB4MGMzNjdlNWZVTCwKKyAgICAweDI3MWIyZDljVUwsIDB4M2UwMDFjZGRVTCwgMHhiOTk4MDAxMlVMLCAweGEwODMzMTUzVUwsIDB4OGJhZTYyOTBVTCwKKyAgICAweDkyYjU1M2QxVUwsIDB4ZGRmNGM1MTZVTCwgMHhjNGVmZjQ1N1VMLCAweGVmYzJhNzk0VUwsIDB4ZjZkOTk2ZDVVTCwKKyAgICAweGFlMDdiY2U5VUwsIDB4YjcxYzhkYThVTCwgMHg5YzMxZGU2YlVMLCAweDg1MmFlZjJhVUwsIDB4Y2E2Yjc5ZWRVTCwKKyAgICAweGQzNzA0OGFjVUwsIDB4Zjg1ZDFiNmZVTCwgMHhlMTQ2MmEyZVVMLCAweDY2ZGUzNmUxVUwsIDB4N2ZjNTA3YTBVTCwKKyAgICAweDU0ZTg1NDYzVUwsIDB4NGRmMzY1MjJVTCwgMHgwMmIyZjNlNVVMLCAweDFiYTljMmE0VUwsIDB4MzA4NDkxNjdVTCwKKyAgICAweDI5OWZhMDI2VUwsIDB4ZTRjNWFlYjhVTCwgMHhmZGRlOWZmOVVMLCAweGQ2ZjNjYzNhVUwsIDB4Y2ZlOGZkN2JVTCwKKyAgICAweDgwYTk2YmJjVUwsIDB4OTliMjVhZmRVTCwgMHhiMjlmMDkzZVVMLCAweGFiODQzODdmVUwsIDB4MmMxYzI0YjBVTCwKKyAgICAweDM1MDcxNWYxVUwsIDB4MWUyYTQ2MzJVTCwgMHgwNzMxNzc3M1VMLCAweDQ4NzBlMWI0VUwsIDB4NTE2YmQwZjVVTCwKKyAgICAweDdhNDY4MzM2VUwsIDB4NjM1ZGIyNzdVTCwgMHhjYmZhZDc0ZVVMLCAweGQyZTFlNjBmVUwsIDB4ZjljY2I1Y2NVTCwKKyAgICAweGUwZDc4NDhkVUwsIDB4YWY5NjEyNGFVTCwgMHhiNjhkMjMwYlVMLCAweDlkYTA3MGM4VUwsIDB4ODRiYjQxODlVTCwKKyAgICAweDAzMjM1ZDQ2VUwsIDB4MWEzODZjMDdVTCwgMHgzMTE1M2ZjNFVMLCAweDI4MGUwZTg1VUwsIDB4Njc0Zjk4NDJVTCwKKyAgICAweDdlNTRhOTAzVUwsIDB4NTU3OWZhYzBVTCwgMHg0YzYyY2I4MVVMLCAweDgxMzhjNTFmVUwsIDB4OTgyM2Y0NWVVTCwKKyAgICAweGIzMGVhNzlkVUwsIDB4YWExNTk2ZGNVTCwgMHhlNTU0MDAxYlVMLCAweGZjNGYzMTVhVUwsIDB4ZDc2MjYyOTlVTCwKKyAgICAweGNlNzk1M2Q4VUwsIDB4NDllMTRmMTdVTCwgMHg1MGZhN2U1NlVMLCAweDdiZDcyZDk1VUwsIDB4NjJjYzFjZDRVTCwKKyAgICAweDJkOGQ4YTEzVUwsIDB4MzQ5NmJiNTJVTCwgMHgxZmJiZTg5MVVMLCAweDA2YTBkOWQwVUwsIDB4NWU3ZWYzZWNVTCwKKyAgICAweDQ3NjVjMmFkVUwsIDB4NmM0ODkxNmVVTCwgMHg3NTUzYTAyZlVMLCAweDNhMTIzNmU4VUwsIDB4MjMwOTA3YTlVTCwKKyAgICAweDA4MjQ1NDZhVUwsIDB4MTEzZjY1MmJVTCwgMHg5NmE3NzllNFVMLCAweDhmYmM0OGE1VUwsIDB4YTQ5MTFiNjZVTCwKKyAgICAweGJkOGEyYTI3VUwsIDB4ZjJjYmJjZTBVTCwgMHhlYmQwOGRhMVVMLCAweGMwZmRkZTYyVUwsIDB4ZDllNmVmMjNVTCwKKyAgICAweDE0YmNlMWJkVUwsIDB4MGRhN2QwZmNVTCwgMHgyNjhhODMzZlVMLCAweDNmOTFiMjdlVUwsIDB4NzBkMDI0YjlVTCwKKyAgICAweDY5Y2IxNWY4VUwsIDB4NDJlNjQ2M2JVTCwgMHg1YmZkNzc3YVVMLCAweGRjNjU2YmI1VUwsIDB4YzU3ZTVhZjRVTCwKKyAgICAweGVlNTMwOTM3VUwsIDB4Zjc0ODM4NzZVTCwgMHhiODA5YWViMVVMLCAweGExMTI5ZmYwVUwsIDB4OGEzZmNjMzNVTCwKKyAgICAweDkzMjRmZDcyVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHgwMWMyNmEzN1VMLCAweDAzODRkNDZlVUwsIDB4MDI0NmJlNTlVTCwgMHgwNzA5YThkY1VMLAorICAgIDB4MDZjYmMyZWJVTCwgMHgwNDhkN2NiMlVMLCAweDA1NGYxNjg1VUwsIDB4MGUxMzUxYjhVTCwgMHgwZmQxM2I4ZlVMLAorICAgIDB4MGQ5Nzg1ZDZVTCwgMHgwYzU1ZWZlMVVMLCAweDA5MWFmOTY0VUwsIDB4MDhkODkzNTNVTCwgMHgwYTllMmQwYVVMLAorICAgIDB4MGI1YzQ3M2RVTCwgMHgxYzI2YTM3MFVMLCAweDFkZTRjOTQ3VUwsIDB4MWZhMjc3MWVVTCwgMHgxZTYwMWQyOVVMLAorICAgIDB4MWIyZjBiYWNVTCwgMHgxYWVkNjE5YlVMLCAweDE4YWJkZmMyVUwsIDB4MTk2OWI1ZjVVTCwgMHgxMjM1ZjJjOFVMLAorICAgIDB4MTNmNzk4ZmZVTCwgMHgxMWIxMjZhNlVMLCAweDEwNzM0YzkxVUwsIDB4MTUzYzVhMTRVTCwgMHgxNGZlMzAyM1VMLAorICAgIDB4MTZiODhlN2FVTCwgMHgxNzdhZTQ0ZFVMLCAweDM4NGQ0NmUwVUwsIDB4Mzk4ZjJjZDdVTCwgMHgzYmM5OTI4ZVVMLAorICAgIDB4M2EwYmY4YjlVTCwgMHgzZjQ0ZWUzY1VMLCAweDNlODY4NDBiVUwsIDB4M2NjMDNhNTJVTCwgMHgzZDAyNTA2NVVMLAorICAgIDB4MzY1ZTE3NThVTCwgMHgzNzljN2Q2ZlVMLCAweDM1ZGFjMzM2VUwsIDB4MzQxOGE5MDFVTCwgMHgzMTU3YmY4NFVMLAorICAgIDB4MzA5NWQ1YjNVTCwgMHgzMmQzNmJlYVVMLCAweDMzMTEwMWRkVUwsIDB4MjQ2YmU1OTBVTCwgMHgyNWE5OGZhN1VMLAorICAgIDB4MjdlZjMxZmVVTCwgMHgyNjJkNWJjOVVMLCAweDIzNjI0ZDRjVUwsIDB4MjJhMDI3N2JVTCwgMHgyMGU2OTkyMlVMLAorICAgIDB4MjEyNGYzMTVVTCwgMHgyYTc4YjQyOFVMLCAweDJiYmFkZTFmVUwsIDB4MjlmYzYwNDZVTCwgMHgyODNlMGE3MVVMLAorICAgIDB4MmQ3MTFjZjRVTCwgMHgyY2IzNzZjM1VMLCAweDJlZjVjODlhVUwsIDB4MmYzN2EyYWRVTCwgMHg3MDlhOGRjMFVMLAorICAgIDB4NzE1OGU3ZjdVTCwgMHg3MzFlNTlhZVVMLCAweDcyZGMzMzk5VUwsIDB4Nzc5MzI1MWNVTCwgMHg3NjUxNGYyYlVMLAorICAgIDB4NzQxN2YxNzJVTCwgMHg3NWQ1OWI0NVVMLCAweDdlODlkYzc4VUwsIDB4N2Y0YmI2NGZVTCwgMHg3ZDBkMDgxNlVMLAorICAgIDB4N2NjZjYyMjFVTCwgMHg3OTgwNzRhNFVMLCAweDc4NDIxZTkzVUwsIDB4N2EwNGEwY2FVTCwgMHg3YmM2Y2FmZFVMLAorICAgIDB4NmNiYzJlYjBVTCwgMHg2ZDdlNDQ4N1VMLCAweDZmMzhmYWRlVUwsIDB4NmVmYTkwZTlVTCwgMHg2YmI1ODY2Y1VMLAorICAgIDB4NmE3N2VjNWJVTCwgMHg2ODMxNTIwMlVMLCAweDY5ZjMzODM1VUwsIDB4NjJhZjdmMDhVTCwgMHg2MzZkMTUzZlVMLAorICAgIDB4NjEyYmFiNjZVTCwgMHg2MGU5YzE1MVVMLCAweDY1YTZkN2Q0VUwsIDB4NjQ2NGJkZTNVTCwgMHg2NjIyMDNiYVVMLAorICAgIDB4NjdlMDY5OGRVTCwgMHg0OGQ3Y2IyMFVMLCAweDQ5MTVhMTE3VUwsIDB4NGI1MzFmNGVVTCwgMHg0YTkxNzU3OVVMLAorICAgIDB4NGZkZTYzZmNVTCwgMHg0ZTFjMDljYlVMLCAweDRjNWFiNzkyVUwsIDB4NGQ5OGRkYTVVTCwgMHg0NmM0OWE5OFVMLAorICAgIDB4NDcwNmYwYWZVTCwgMHg0NTQwNGVmNlVMLCAweDQ0ODIyNGMxVUwsIDB4NDFjZDMyNDRVTCwgMHg0MDBmNTg3M1VMLAorICAgIDB4NDI0OWU2MmFVTCwgMHg0MzhiOGMxZFVMLCAweDU0ZjE2ODUwVUwsIDB4NTUzMzAyNjdVTCwgMHg1Nzc1YmMzZVVMLAorICAgIDB4NTZiN2Q2MDlVTCwgMHg1M2Y4YzA4Y1VMLCAweDUyM2FhYWJiVUwsIDB4NTA3YzE0ZTJVTCwgMHg1MWJlN2VkNVVMLAorICAgIDB4NWFlMjM5ZThVTCwgMHg1YjIwNTNkZlVMLCAweDU5NjZlZDg2VUwsIDB4NThhNDg3YjFVTCwgMHg1ZGViOTEzNFVMLAorICAgIDB4NWMyOWZiMDNVTCwgMHg1ZTZmNDU1YVVMLCAweDVmYWQyZjZkVUwsIDB4ZTEzNTFiODBVTCwgMHhlMGY3NzFiN1VMLAorICAgIDB4ZTJiMWNmZWVVTCwgMHhlMzczYTVkOVVMLCAweGU2M2NiMzVjVUwsIDB4ZTdmZWQ5NmJVTCwgMHhlNWI4NjczMlVMLAorICAgIDB4ZTQ3YTBkMDVVTCwgMHhlZjI2NGEzOFVMLCAweGVlZTQyMDBmVUwsIDB4ZWNhMjllNTZVTCwgMHhlZDYwZjQ2MVVMLAorICAgIDB4ZTgyZmUyZTRVTCwgMHhlOWVkODhkM1VMLCAweGViYWIzNjhhVUwsIDB4ZWE2OTVjYmRVTCwgMHhmZDEzYjhmMFVMLAorICAgIDB4ZmNkMWQyYzdVTCwgMHhmZTk3NmM5ZVVMLCAweGZmNTUwNmE5VUwsIDB4ZmExYTEwMmNVTCwgMHhmYmQ4N2ExYlVMLAorICAgIDB4Zjk5ZWM0NDJVTCwgMHhmODVjYWU3NVVMLCAweGYzMDBlOTQ4VUwsIDB4ZjJjMjgzN2ZVTCwgMHhmMDg0M2QyNlVMLAorICAgIDB4ZjE0NjU3MTFVTCwgMHhmNDA5NDE5NFVMLCAweGY1Y2IyYmEzVUwsIDB4Zjc4ZDk1ZmFVTCwgMHhmNjRmZmZjZFVMLAorICAgIDB4ZDk3ODVkNjBVTCwgMHhkOGJhMzc1N1VMLCAweGRhZmM4OTBlVUwsIDB4ZGIzZWUzMzlVTCwgMHhkZTcxZjViY1VMLAorICAgIDB4ZGZiMzlmOGJVTCwgMHhkZGY1MjFkMlVMLCAweGRjMzc0YmU1VUwsIDB4ZDc2YjBjZDhVTCwgMHhkNmE5NjZlZlVMLAorICAgIDB4ZDRlZmQ4YjZVTCwgMHhkNTJkYjI4MVVMLCAweGQwNjJhNDA0VUwsIDB4ZDFhMGNlMzNVTCwgMHhkM2U2NzA2YVVMLAorICAgIDB4ZDIyNDFhNWRVTCwgMHhjNTVlZmUxMFVMLCAweGM0OWM5NDI3VUwsIDB4YzZkYTJhN2VVTCwgMHhjNzE4NDA0OVVMLAorICAgIDB4YzI1NzU2Y2NVTCwgMHhjMzk1M2NmYlVMLCAweGMxZDM4MmEyVUwsIDB4YzAxMWU4OTVVTCwgMHhjYjRkYWZhOFVMLAorICAgIDB4Y2E4ZmM1OWZVTCwgMHhjOGM5N2JjNlVMLCAweGM5MGIxMWYxVUwsIDB4Y2M0NDA3NzRVTCwgMHhjZDg2NmQ0M1VMLAorICAgIDB4Y2ZjMGQzMWFVTCwgMHhjZTAyYjkyZFVMLCAweDkxYWY5NjQwVUwsIDB4OTA2ZGZjNzdVTCwgMHg5MjJiNDIyZVVMLAorICAgIDB4OTNlOTI4MTlVTCwgMHg5NmE2M2U5Y1VMLCAweDk3NjQ1NGFiVUwsIDB4OTUyMmVhZjJVTCwgMHg5NGUwODBjNVVMLAorICAgIDB4OWZiY2M3ZjhVTCwgMHg5ZTdlYWRjZlVMLCAweDljMzgxMzk2VUwsIDB4OWRmYTc5YTFVTCwgMHg5OGI1NmYyNFVMLAorICAgIDB4OTk3NzA1MTNVTCwgMHg5YjMxYmI0YVVMLCAweDlhZjNkMTdkVUwsIDB4OGQ4OTM1MzBVTCwgMHg4YzRiNWYwN1VMLAorICAgIDB4OGUwZGUxNWVVTCwgMHg4ZmNmOGI2OVVMLCAweDhhODA5ZGVjVUwsIDB4OGI0MmY3ZGJVTCwgMHg4OTA0NDk4MlVMLAorICAgIDB4ODhjNjIzYjVVTCwgMHg4MzlhNjQ4OFVMLCAweDgyNTgwZWJmVUwsIDB4ODAxZWIwZTZVTCwgMHg4MWRjZGFkMVVMLAorICAgIDB4ODQ5M2NjNTRVTCwgMHg4NTUxYTY2M1VMLCAweDg3MTcxODNhVUwsIDB4ODZkNTcyMGRVTCwgMHhhOWUyZDBhMFVMLAorICAgIDB4YTgyMGJhOTdVTCwgMHhhYTY2MDRjZVVMLCAweGFiYTQ2ZWY5VUwsIDB4YWVlYjc4N2NVTCwgMHhhZjI5MTI0YlVMLAorICAgIDB4YWQ2ZmFjMTJVTCwgMHhhY2FkYzYyNVVMLCAweGE3ZjE4MTE4VUwsIDB4YTYzM2ViMmZVTCwgMHhhNDc1NTU3NlVMLAorICAgIDB4YTViNzNmNDFVTCwgMHhhMGY4MjljNFVMLCAweGExM2E0M2YzVUwsIDB4YTM3Y2ZkYWFVTCwgMHhhMmJlOTc5ZFVMLAorICAgIDB4YjVjNDczZDBVTCwgMHhiNDA2MTllN1VMLCAweGI2NDBhN2JlVUwsIDB4Yjc4MmNkODlVTCwgMHhiMmNkZGIwY1VMLAorICAgIDB4YjMwZmIxM2JVTCwgMHhiMTQ5MGY2MlVMLCAweGIwOGI2NTU1VUwsIDB4YmJkNzIyNjhVTCwgMHhiYTE1NDg1ZlVMLAorICAgIDB4Yjg1M2Y2MDZVTCwgMHhiOTkxOWMzMVVMLCAweGJjZGU4YWI0VUwsIDB4YmQxY2UwODNVTCwgMHhiZjVhNWVkYVVMLAorICAgIDB4YmU5ODM0ZWRVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweGI4YmM2NzY1VUwsIDB4YWEwOWM4OGJVTCwgMHgxMmI1YWZlZVVMLCAweDhmNjI5NzU3VUwsCisgICAgMHgzN2RlZjAzMlVMLCAweDI1NmI1ZmRjVUwsIDB4OWRkNzM4YjlVTCwgMHhjNWI0MjhlZlVMLCAweDdkMDg0ZjhhVUwsCisgICAgMHg2ZmJkZTA2NFVMLCAweGQ3MDE4NzAxVUwsIDB4NGFkNmJmYjhVTCwgMHhmMjZhZDhkZFVMLCAweGUwZGY3NzMzVUwsCisgICAgMHg1ODYzMTA1NlVMLCAweDUwMTk1NzlmVUwsIDB4ZThhNTMwZmFVTCwgMHhmYTEwOWYxNFVMLCAweDQyYWNmODcxVUwsCisgICAgMHhkZjdiYzBjOFVMLCAweDY3YzdhN2FkVUwsIDB4NzU3MjA4NDNVTCwgMHhjZGNlNmYyNlVMLCAweDk1YWQ3ZjcwVUwsCisgICAgMHgyZDExMTgxNVVMLCAweDNmYTRiN2ZiVUwsIDB4ODcxOGQwOWVVTCwgMHgxYWNmZTgyN1VMLCAweGEyNzM4ZjQyVUwsCisgICAgMHhiMGM2MjBhY1VMLCAweDA4N2E0N2M5VUwsIDB4YTAzMmFmM2VVTCwgMHgxODhlYzg1YlVMLCAweDBhM2I2N2I1VUwsCisgICAgMHhiMjg3MDBkMFVMLCAweDJmNTAzODY5VUwsIDB4OTdlYzVmMGNVTCwgMHg4NTU5ZjBlMlVMLCAweDNkZTU5Nzg3VUwsCisgICAgMHg2NTg2ODdkMVVMLCAweGRkM2FlMGI0VUwsIDB4Y2Y4ZjRmNWFVTCwgMHg3NzMzMjgzZlVMLCAweGVhZTQxMDg2VUwsCisgICAgMHg1MjU4NzdlM1VMLCAweDQwZWRkODBkVUwsIDB4Zjg1MWJmNjhVTCwgMHhmMDJiZjhhMVVMLCAweDQ4OTc5ZmM0VUwsCisgICAgMHg1YTIyMzAyYVVMLCAweGUyOWU1NzRmVUwsIDB4N2Y0OTZmZjZVTCwgMHhjN2Y1MDg5M1VMLCAweGQ1NDBhNzdkVUwsCisgICAgMHg2ZGZjYzAxOFVMLCAweDM1OWZkMDRlVUwsIDB4OGQyM2I3MmJVTCwgMHg5Zjk2MThjNVVMLCAweDI3MmE3ZmEwVUwsCisgICAgMHhiYWZkNDcxOVVMLCAweDAyNDEyMDdjVUwsIDB4MTBmNDhmOTJVTCwgMHhhODQ4ZThmN1VMLCAweDliMTQ1ODNkVUwsCisgICAgMHgyM2E4M2Y1OFVMLCAweDMxMWQ5MGI2VUwsIDB4ODlhMWY3ZDNVTCwgMHgxNDc2Y2Y2YVVMLCAweGFjY2FhODBmVUwsCisgICAgMHhiZTdmMDdlMVVMLCAweDA2YzM2MDg0VUwsIDB4NWVhMDcwZDJVTCwgMHhlNjFjMTdiN1VMLCAweGY0YTliODU5VUwsCisgICAgMHg0YzE1ZGYzY1VMLCAweGQxYzJlNzg1VUwsIDB4Njk3ZTgwZTBVTCwgMHg3YmNiMmYwZVVMLCAweGMzNzc0ODZiVUwsCisgICAgMHhjYjBkMGZhMlVMLCAweDczYjE2OGM3VUwsIDB4NjEwNGM3MjlVTCwgMHhkOWI4YTA0Y1VMLCAweDQ0NmY5OGY1VUwsCisgICAgMHhmY2QzZmY5MFVMLCAweGVlNjY1MDdlVUwsIDB4NTZkYTM3MWJVTCwgMHgwZWI5Mjc0ZFVMLCAweGI2MDU0MDI4VUwsCisgICAgMHhhNGIwZWZjNlVMLCAweDFjMGM4OGEzVUwsIDB4ODFkYmIwMWFVTCwgMHgzOTY3ZDc3ZlVMLCAweDJiZDI3ODkxVUwsCisgICAgMHg5MzZlMWZmNFVMLCAweDNiMjZmNzAzVUwsIDB4ODM5YTkwNjZVTCwgMHg5MTJmM2Y4OFVMLCAweDI5OTM1OGVkVUwsCisgICAgMHhiNDQ0NjA1NFVMLCAweDBjZjgwNzMxVUwsIDB4MWU0ZGE4ZGZVTCwgMHhhNmYxY2ZiYVVMLCAweGZlOTJkZmVjVUwsCisgICAgMHg0NjJlYjg4OVVMLCAweDU0OWIxNzY3VUwsIDB4ZWMyNzcwMDJVTCwgMHg3MWYwNDhiYlVMLCAweGM5NGMyZmRlVUwsCisgICAgMHhkYmY5ODAzMFVMLCAweDYzNDVlNzU1VUwsIDB4NmIzZmEwOWNVTCwgMHhkMzgzYzdmOVVMLCAweGMxMzY2ODE3VUwsCisgICAgMHg3OThhMGY3MlVMLCAweGU0NWQzN2NiVUwsIDB4NWNlMTUwYWVVTCwgMHg0ZTU0ZmY0MFVMLCAweGY2ZTg5ODI1VUwsCisgICAgMHhhZThiODg3M1VMLCAweDE2MzdlZjE2VUwsIDB4MDQ4MjQwZjhVTCwgMHhiYzNlMjc5ZFVMLCAweDIxZTkxZjI0VUwsCisgICAgMHg5OTU1Nzg0MVVMLCAweDhiZTBkN2FmVUwsIDB4MzM1Y2IwY2FVTCwgMHhlZDU5YjYzYlVMLCAweDU1ZTVkMTVlVUwsCisgICAgMHg0NzUwN2ViMFVMLCAweGZmZWMxOWQ1VUwsIDB4NjIzYjIxNmNVTCwgMHhkYTg3NDYwOVVMLCAweGM4MzJlOWU3VUwsCisgICAgMHg3MDhlOGU4MlVMLCAweDI4ZWQ5ZWQ0VUwsIDB4OTA1MWY5YjFVTCwgMHg4MmU0NTY1ZlVMLCAweDNhNTgzMTNhVUwsCisgICAgMHhhNzhmMDk4M1VMLCAweDFmMzM2ZWU2VUwsIDB4MGQ4NmMxMDhVTCwgMHhiNTNhYTY2ZFVMLCAweGJkNDBlMWE0VUwsCisgICAgMHgwNWZjODZjMVVMLCAweDE3NDkyOTJmVUwsIDB4YWZmNTRlNGFVTCwgMHgzMjIyNzZmM1VMLCAweDhhOWUxMTk2VUwsCisgICAgMHg5ODJiYmU3OFVMLCAweDIwOTdkOTFkVUwsIDB4NzhmNGM5NGJVTCwgMHhjMDQ4YWUyZVVMLCAweGQyZmQwMWMwVUwsCisgICAgMHg2YTQxNjZhNVVMLCAweGY3OTY1ZTFjVUwsIDB4NGYyYTM5NzlVTCwgMHg1ZDlmOTY5N1VMLCAweGU1MjNmMWYyVUwsCisgICAgMHg0ZDZiMTkwNVVMLCAweGY1ZDc3ZTYwVUwsIDB4ZTc2MmQxOGVVTCwgMHg1ZmRlYjZlYlVMLCAweGMyMDk4ZTUyVUwsCisgICAgMHg3YWI1ZTkzN1VMLCAweDY4MDA0NmQ5VUwsIDB4ZDBiYzIxYmNVTCwgMHg4OGRmMzFlYVVMLCAweDMwNjM1NjhmVUwsCisgICAgMHgyMmQ2Zjk2MVVMLCAweDlhNmE5ZTA0VUwsIDB4MDdiZGE2YmRVTCwgMHhiZjAxYzFkOFVMLCAweGFkYjQ2ZTM2VUwsCisgICAgMHgxNTA4MDk1M1VMLCAweDFkNzI0ZTlhVUwsIDB4YTVjZTI5ZmZVTCwgMHhiNzdiODYxMVVMLCAweDBmYzdlMTc0VUwsCisgICAgMHg5MjEwZDljZFVMLCAweDJhYWNiZWE4VUwsIDB4MzgxOTExNDZVTCwgMHg4MGE1NzYyM1VMLCAweGQ4YzY2Njc1VUwsCisgICAgMHg2MDdhMDExMFVMLCAweDcyY2ZhZWZlVUwsIDB4Y2E3M2M5OWJVTCwgMHg1N2E0ZjEyMlVMLCAweGVmMTg5NjQ3VUwsCisgICAgMHhmZGFkMzlhOVVMLCAweDQ1MTE1ZWNjVUwsIDB4NzY0ZGVlMDZVTCwgMHhjZWYxODk2M1VMLCAweGRjNDQyNjhkVUwsCisgICAgMHg2NGY4NDFlOFVMLCAweGY5MmY3OTUxVUwsIDB4NDE5MzFlMzRVTCwgMHg1MzI2YjFkYVVMLCAweGViOWFkNmJmVUwsCisgICAgMHhiM2Y5YzZlOVVMLCAweDBiNDVhMThjVUwsIDB4MTlmMDBlNjJVTCwgMHhhMTRjNjkwN1VMLCAweDNjOWI1MWJlVUwsCisgICAgMHg4NDI3MzZkYlVMLCAweDk2OTI5OTM1VUwsIDB4MmUyZWZlNTBVTCwgMHgyNjU0Yjk5OVVMLCAweDllZThkZWZjVUwsCisgICAgMHg4YzVkNzExMlVMLCAweDM0ZTExNjc3VUwsIDB4YTkzNjJlY2VVTCwgMHgxMThhNDlhYlVMLCAweDAzM2ZlNjQ1VUwsCisgICAgMHhiYjgzODEyMFVMLCAweGUzZTA5MTc2VUwsIDB4NWI1Y2Y2MTNVTCwgMHg0OWU5NTlmZFVMLCAweGYxNTUzZTk4VUwsCisgICAgMHg2YzgyMDYyMVVMLCAweGQ0M2U2MTQ0VUwsIDB4YzY4YmNlYWFVTCwgMHg3ZTM3YTljZlVMLCAweGQ2N2Y0MTM4VUwsCisgICAgMHg2ZWMzMjY1ZFVMLCAweDdjNzY4OWIzVUwsIDB4YzRjYWVlZDZVTCwgMHg1OTFkZDY2ZlVMLCAweGUxYTFiMTBhVUwsCisgICAgMHhmMzE0MWVlNFVMLCAweDRiYTg3OTgxVUwsIDB4MTNjYjY5ZDdVTCwgMHhhYjc3MGViMlVMLCAweGI5YzJhMTVjVUwsCisgICAgMHgwMTdlYzYzOVVMLCAweDljYTlmZTgwVUwsIDB4MjQxNTk5ZTVVTCwgMHgzNmEwMzYwYlVMLCAweDhlMWM1MTZlVUwsCisgICAgMHg4NjY2MTZhN1VMLCAweDNlZGE3MWMyVUwsIDB4MmM2ZmRlMmNVTCwgMHg5NGQzYjk0OVVMLCAweDA5MDQ4MWYwVUwsCisgICAgMHhiMWI4ZTY5NVVMLCAweGEzMGQ0OTdiVUwsIDB4MWJiMTJlMWVVTCwgMHg0M2QyM2U0OFVMLCAweGZiNmU1OTJkVUwsCisgICAgMHhlOWRiZjZjM1VMLCAweDUxNjc5MWE2VUwsIDB4Y2NiMGE5MWZVTCwgMHg3NDBjY2U3YVVMLCAweDY2Yjk2MTk0VUwsCisgICAgMHhkZTA1MDZmMVVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4OTYzMDA3NzdVTCwgMHgyYzYxMGVlZVVMLCAweGJhNTEwOTk5VUwsIDB4MTljNDZkMDdVTCwKKyAgICAweDhmZjQ2YTcwVUwsIDB4MzVhNTYzZTlVTCwgMHhhMzk1NjQ5ZVVMLCAweDMyODhkYjBlVUwsIDB4YTRiOGRjNzlVTCwKKyAgICAweDFlZTlkNWUwVUwsIDB4ODhkOWQyOTdVTCwgMHgyYjRjYjYwOVVMLCAweGJkN2NiMTdlVUwsIDB4MDcyZGI4ZTdVTCwKKyAgICAweDkxMWRiZjkwVUwsIDB4NjQxMGI3MWRVTCwgMHhmMjIwYjA2YVVMLCAweDQ4NzFiOWYzVUwsIDB4ZGU0MWJlODRVTCwKKyAgICAweDdkZDRkYTFhVUwsIDB4ZWJlNGRkNmRVTCwgMHg1MWI1ZDRmNFVMLCAweGM3ODVkMzgzVUwsIDB4NTY5ODZjMTNVTCwKKyAgICAweGMwYTg2YjY0VUwsIDB4N2FmOTYyZmRVTCwgMHhlY2M5NjU4YVVMLCAweDRmNWMwMTE0VUwsIDB4ZDk2YzA2NjNVTCwKKyAgICAweDYzM2QwZmZhVUwsIDB4ZjUwZDA4OGRVTCwgMHhjODIwNmUzYlVMLCAweDVlMTA2OTRjVUwsIDB4ZTQ0MTYwZDVVTCwKKyAgICAweDcyNzE2N2EyVUwsIDB4ZDFlNDAzM2NVTCwgMHg0N2Q0MDQ0YlVMLCAweGZkODUwZGQyVUwsIDB4NmJiNTBhYTVVTCwKKyAgICAweGZhYThiNTM1VUwsIDB4NmM5OGIyNDJVTCwgMHhkNmM5YmJkYlVMLCAweDQwZjliY2FjVUwsIDB4ZTM2Y2Q4MzJVTCwKKyAgICAweDc1NWNkZjQ1VUwsIDB4Y2YwZGQ2ZGNVTCwgMHg1OTNkZDFhYlVMLCAweGFjMzBkOTI2VUwsIDB4M2EwMGRlNTFVTCwKKyAgICAweDgwNTFkN2M4VUwsIDB4MTY2MWQwYmZVTCwgMHhiNWY0YjQyMVVMLCAweDIzYzRiMzU2VUwsIDB4OTk5NWJhY2ZVTCwKKyAgICAweDBmYTViZGI4VUwsIDB4OWViODAyMjhVTCwgMHgwODg4MDU1ZlVMLCAweGIyZDkwY2M2VUwsIDB4MjRlOTBiYjFVTCwKKyAgICAweDg3N2M2ZjJmVUwsIDB4MTE0YzY4NThVTCwgMHhhYjFkNjFjMVVMLCAweDNkMmQ2NmI2VUwsIDB4OTA0MWRjNzZVTCwKKyAgICAweDA2NzFkYjAxVUwsIDB4YmMyMGQyOThVTCwgMHgyYTEwZDVlZlVMLCAweDg5ODViMTcxVUwsIDB4MWZiNWI2MDZVTCwKKyAgICAweGE1ZTRiZjlmVUwsIDB4MzNkNGI4ZThVTCwgMHhhMmM5MDc3OFVMLCAweDM0ZjkwMDBmVUwsIDB4OGVhODA5OTZVTCwKKyAgICAweDE4OTgwZWUxVUwsIDB4YmIwZDZhN2ZVTCwgMHgyZDNkNmQwOFVMLCAweDk3NmM2NDkxVUwsIDB4MDE1YzYzZTZVTCwKKyAgICAweGY0NTE2YjZiVUwsIDB4NjI2MTZjMWNVTCwgMHhkODMwNjU4NVVMLCAweDRlMDA2MmYyVUwsIDB4ZWQ5NTA2NmNVTCwKKyAgICAweDdiYTUwMTFiVUwsIDB4YzFmNDA4ODJVTCwgMHg1N2M0MGZmNVVMLCAweGM2ZDliMDY1VUwsIDB4NTBlOWI3MTJVTCwKKyAgICAweGVhYjhiZThiVUwsIDB4N2M4OGI5ZmNVTCwgMHhkZjFkZGQ2MlVMLCAweDQ5MmRkYTE1VUwsIDB4ZjM3Y2QzOGNVTCwKKyAgICAweDY1NGNkNGZiVUwsIDB4NTg2MWIyNGRVTCwgMHhjZTUxYjUzYVVMLCAweDc0MDBiY2EzVUwsIDB4ZTIzMGJiZDRVTCwKKyAgICAweDQxYTVkZjRhVUwsIDB4ZDc5NWQ4M2RVTCwgMHg2ZGM0ZDFhNFVMLCAweGZiZjRkNmQzVUwsIDB4NmFlOTY5NDNVTCwKKyAgICAweGZjZDk2ZTM0VUwsIDB4NDY4ODY3YWRVTCwgMHhkMGI4NjBkYVVMLCAweDczMmQwNDQ0VUwsIDB4ZTUxZDAzMzNVTCwKKyAgICAweDVmNGMwYWFhVUwsIDB4Yzk3YzBkZGRVTCwgMHgzYzcxMDU1MFVMLCAweGFhNDEwMjI3VUwsIDB4MTAxMDBiYmVVTCwKKyAgICAweDg2MjAwY2M5VUwsIDB4MjViNTY4NTdVTCwgMHhiMzg1NmYyMFVMLCAweDA5ZDQ2NmI5VUwsIDB4OWZlNDYxY2VVTCwKKyAgICAweDBlZjlkZTVlVUwsIDB4OThjOWQ5MjlVTCwgMHgyMjk4ZDBiMFVMLCAweGI0YThkN2M3VUwsIDB4MTczZGIzNTlVTCwKKyAgICAweDgxMGRiNDJlVUwsIDB4M2I1Y2JkYjdVTCwgMHhhZDZjYmFjMFVMLCAweDIwODNiOGVkVUwsIDB4YjZiM2JmOWFVTCwKKyAgICAweDBjZTJiNjAzVUwsIDB4OWFkMmIxNzRVTCwgMHgzOTQ3ZDVlYVVMLCAweGFmNzdkMjlkVUwsIDB4MTUyNmRiMDRVTCwKKyAgICAweDgzMTZkYzczVUwsIDB4MTIwYjYzZTNVTCwgMHg4NDNiNjQ5NFVMLCAweDNlNmE2ZDBkVUwsIDB4YTg1YTZhN2FVTCwKKyAgICAweDBiY2YwZWU0VUwsIDB4OWRmZjA5OTNVTCwgMHgyN2FlMDAwYVVMLCAweGIxOWUwNzdkVUwsIDB4NDQ5MzBmZjBVTCwKKyAgICAweGQyYTMwODg3VUwsIDB4NjhmMjAxMWVVTCwgMHhmZWMyMDY2OVVMLCAweDVkNTc2MmY3VUwsIDB4Y2I2NzY1ODBVTCwKKyAgICAweDcxMzY2YzE5VUwsIDB4ZTcwNjZiNmVVTCwgMHg3NjFiZDRmZVVMLCAweGUwMmJkMzg5VUwsIDB4NWE3YWRhMTBVTCwKKyAgICAweGNjNGFkZDY3VUwsIDB4NmZkZmI5ZjlVTCwgMHhmOWVmYmU4ZVVMLCAweDQzYmViNzE3VUwsIDB4ZDU4ZWIwNjBVTCwKKyAgICAweGU4YTNkNmQ2VUwsIDB4N2U5M2QxYTFVTCwgMHhjNGMyZDgzOFVMLCAweDUyZjJkZjRmVUwsIDB4ZjE2N2JiZDFVTCwKKyAgICAweDY3NTdiY2E2VUwsIDB4ZGQwNmI1M2ZVTCwgMHg0YjM2YjI0OFVMLCAweGRhMmIwZGQ4VUwsIDB4NGMxYjBhYWZVTCwKKyAgICAweGY2NGEwMzM2VUwsIDB4NjA3YTA0NDFVTCwgMHhjM2VmNjBkZlVMLCAweDU1ZGY2N2E4VUwsIDB4ZWY4ZTZlMzFVTCwKKyAgICAweDc5YmU2OTQ2VUwsIDB4OGNiMzYxY2JVTCwgMHgxYTgzNjZiY1VMLCAweGEwZDI2ZjI1VUwsIDB4MzZlMjY4NTJVTCwKKyAgICAweDk1NzcwY2NjVUwsIDB4MDM0NzBiYmJVTCwgMHhiOTE2MDIyMlVMLCAweDJmMjYwNTU1VUwsIDB4YmUzYmJhYzVVTCwKKyAgICAweDI4MGJiZGIyVUwsIDB4OTI1YWI0MmJVTCwgMHgwNDZhYjM1Y1VMLCAweGE3ZmZkN2MyVUwsIDB4MzFjZmQwYjVVTCwKKyAgICAweDhiOWVkOTJjVUwsIDB4MWRhZWRlNWJVTCwgMHhiMGMyNjQ5YlVMLCAweDI2ZjI2M2VjVUwsIDB4OWNhMzZhNzVVTCwKKyAgICAweDBhOTM2ZDAyVUwsIDB4YTkwNjA5OWNVTCwgMHgzZjM2MGVlYlVMLCAweDg1NjcwNzcyVUwsIDB4MTM1NzAwMDVVTCwKKyAgICAweDgyNGFiZjk1VUwsIDB4MTQ3YWI4ZTJVTCwgMHhhZTJiYjE3YlVMLCAweDM4MWJiNjBjVUwsIDB4OWI4ZWQyOTJVTCwKKyAgICAweDBkYmVkNWU1VUwsIDB4YjdlZmRjN2NVTCwgMHgyMWRmZGIwYlVMLCAweGQ0ZDJkMzg2VUwsIDB4NDJlMmQ0ZjFVTCwKKyAgICAweGY4YjNkZDY4VUwsIDB4NmU4M2RhMWZVTCwgMHhjZDE2YmU4MVVMLCAweDViMjZiOWY2VUwsIDB4ZTE3N2IwNmZVTCwKKyAgICAweDc3NDdiNzE4VUwsIDB4ZTY1YTA4ODhVTCwgMHg3MDZhMGZmZlVMLCAweGNhM2IwNjY2VUwsIDB4NWMwYjAxMTFVTCwKKyAgICAweGZmOWU2NThmVUwsIDB4NjlhZTYyZjhVTCwgMHhkM2ZmNmI2MVVMLCAweDQ1Y2Y2YzE2VUwsIDB4NzhlMjBhYTBVTCwKKyAgICAweGVlZDIwZGQ3VUwsIDB4NTQ4MzA0NGVVTCwgMHhjMmIzMDMzOVVMLCAweDYxMjY2N2E3VUwsIDB4ZjcxNjYwZDBVTCwKKyAgICAweDRkNDc2OTQ5VUwsIDB4ZGI3NzZlM2VVTCwgMHg0YTZhZDFhZVVMLCAweGRjNWFkNmQ5VUwsIDB4NjYwYmRmNDBVTCwKKyAgICAweGYwM2JkODM3VUwsIDB4NTNhZWJjYTlVTCwgMHhjNTllYmJkZVVMLCAweDdmY2ZiMjQ3VUwsIDB4ZTlmZmI1MzBVTCwKKyAgICAweDFjZjJiZGJkVUwsIDB4OGFjMmJhY2FVTCwgMHgzMDkzYjM1M1VMLCAweGE2YTNiNDI0VUwsIDB4MDUzNmQwYmFVTCwKKyAgICAweDkzMDZkN2NkVUwsIDB4Mjk1N2RlNTRVTCwgMHhiZjY3ZDkyM1VMLCAweDJlN2E2NmIzVUwsIDB4Yjg0YTYxYzRVTCwKKyAgICAweDAyMWI2ODVkVUwsIDB4OTQyYjZmMmFVTCwgMHgzN2JlMGJiNFVMLCAweGExOGUwY2MzVUwsIDB4MWJkZjA1NWFVTCwKKyAgICAweDhkZWYwMjJkVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg0MTMxMWIxOVVMLCAweDgyNjIzNjMyVUwsIDB4YzM1MzJkMmJVTCwgMHgwNGM1NmM2NFVMLAorICAgIDB4NDVmNDc3N2RVTCwgMHg4NmE3NWE1NlVMLCAweGM3OTY0MTRmVUwsIDB4MDg4YWQ5YzhVTCwgMHg0OWJiYzJkMVVMLAorICAgIDB4OGFlOGVmZmFVTCwgMHhjYmQ5ZjRlM1VMLCAweDBjNGZiNWFjVUwsIDB4NGQ3ZWFlYjVVTCwgMHg4ZTJkODM5ZVVMLAorICAgIDB4Y2YxYzk4ODdVTCwgMHg1MTEyYzI0YVVMLCAweDEwMjNkOTUzVUwsIDB4ZDM3MGY0NzhVTCwgMHg5MjQxZWY2MVVMLAorICAgIDB4NTVkN2FlMmVVTCwgMHgxNGU2YjUzN1VMLCAweGQ3YjU5ODFjVUwsIDB4OTY4NDgzMDVVTCwgMHg1OTk4MWI4MlVMLAorICAgIDB4MThhOTAwOWJVTCwgMHhkYmZhMmRiMFVMLCAweDlhY2IzNmE5VUwsIDB4NWQ1ZDc3ZTZVTCwgMHgxYzZjNmNmZlVMLAorICAgIDB4ZGYzZjQxZDRVTCwgMHg5ZTBlNWFjZFVMLCAweGEyMjQ4NDk1VUwsIDB4ZTMxNTlmOGNVTCwgMHgyMDQ2YjJhN1VMLAorICAgIDB4NjE3N2E5YmVVTCwgMHhhNmUxZThmMVVMLCAweGU3ZDBmM2U4VUwsIDB4MjQ4M2RlYzNVTCwgMHg2NWIyYzVkYVVMLAorICAgIDB4YWFhZTVkNWRVTCwgMHhlYjlmNDY0NFVMLCAweDI4Y2M2YjZmVUwsIDB4NjlmZDcwNzZVTCwgMHhhZTZiMzEzOVVMLAorICAgIDB4ZWY1YTJhMjBVTCwgMHgyYzA5MDcwYlVMLCAweDZkMzgxYzEyVUwsIDB4ZjMzNjQ2ZGZVTCwgMHhiMjA3NWRjNlVMLAorICAgIDB4NzE1NDcwZWRVTCwgMHgzMDY1NmJmNFVMLCAweGY3ZjMyYWJiVUwsIDB4YjZjMjMxYTJVTCwgMHg3NTkxMWM4OVVMLAorICAgIDB4MzRhMDA3OTBVTCwgMHhmYmJjOWYxN1VMLCAweGJhOGQ4NDBlVUwsIDB4NzlkZWE5MjVVTCwgMHgzOGVmYjIzY1VMLAorICAgIDB4ZmY3OWYzNzNVTCwgMHhiZTQ4ZTg2YVVMLCAweDdkMWJjNTQxVUwsIDB4M2MyYWRlNThVTCwgMHgwNTRmNzlmMFVMLAorICAgIDB4NDQ3ZTYyZTlVTCwgMHg4NzJkNGZjMlVMLCAweGM2MWM1NGRiVUwsIDB4MDE4YTE1OTRVTCwgMHg0MGJiMGU4ZFVMLAorICAgIDB4ODNlODIzYTZVTCwgMHhjMmQ5MzhiZlVMLCAweDBkYzVhMDM4VUwsIDB4NGNmNGJiMjFVTCwgMHg4ZmE3OTYwYVVMLAorICAgIDB4Y2U5NjhkMTNVTCwgMHgwOTAwY2M1Y1VMLCAweDQ4MzFkNzQ1VUwsIDB4OGI2MmZhNmVVTCwgMHhjYTUzZTE3N1VMLAorICAgIDB4NTQ1ZGJiYmFVTCwgMHgxNTZjYTBhM1VMLCAweGQ2M2Y4ZDg4VUwsIDB4OTcwZTk2OTFVTCwgMHg1MDk4ZDdkZVVMLAorICAgIDB4MTFhOWNjYzdVTCwgMHhkMmZhZTFlY1VMLCAweDkzY2JmYWY1VUwsIDB4NWNkNzYyNzJVTCwgMHgxZGU2Nzk2YlVMLAorICAgIDB4ZGViNTU0NDBVTCwgMHg5Zjg0NGY1OVVMLCAweDU4MTIwZTE2VUwsIDB4MTkyMzE1MGZVTCwgMHhkYTcwMzgyNFVMLAorICAgIDB4OWI0MTIzM2RVTCwgMHhhNzZiZmQ2NVVMLCAweGU2NWFlNjdjVUwsIDB4MjUwOWNiNTdVTCwgMHg2NDM4ZDA0ZVVMLAorICAgIDB4YTNhZTkxMDFVTCwgMHhlMjlmOGExOFVMLCAweDIxY2NhNzMzVUwsIDB4NjBmZGJjMmFVTCwgMHhhZmUxMjRhZFVMLAorICAgIDB4ZWVkMDNmYjRVTCwgMHgyZDgzMTI5ZlVMLCAweDZjYjIwOTg2VUwsIDB4YWIyNDQ4YzlVTCwgMHhlYTE1NTNkMFVMLAorICAgIDB4Mjk0NjdlZmJVTCwgMHg2ODc3NjVlMlVMLCAweGY2NzkzZjJmVUwsIDB4Yjc0ODI0MzZVTCwgMHg3NDFiMDkxZFVMLAorICAgIDB4MzUyYTEyMDRVTCwgMHhmMmJjNTM0YlVMLCAweGIzOGQ0ODUyVUwsIDB4NzBkZTY1NzlVTCwgMHgzMWVmN2U2MFVMLAorICAgIDB4ZmVmM2U2ZTdVTCwgMHhiZmMyZmRmZVVMLCAweDdjOTFkMGQ1VUwsIDB4M2RhMGNiY2NVTCwgMHhmYTM2OGE4M1VMLAorICAgIDB4YmIwNzkxOWFVTCwgMHg3ODU0YmNiMVVMLCAweDM5NjVhN2E4VUwsIDB4NGI5ODgzM2JVTCwgMHgwYWE5OTgyMlVMLAorICAgIDB4YzlmYWI1MDlVTCwgMHg4OGNiYWUxMFVMLCAweDRmNWRlZjVmVUwsIDB4MGU2Y2Y0NDZVTCwgMHhjZDNmZDk2ZFVMLAorICAgIDB4OGMwZWMyNzRVTCwgMHg0MzEyNWFmM1VMLCAweDAyMjM0MWVhVUwsIDB4YzE3MDZjYzFVTCwgMHg4MDQxNzdkOFVMLAorICAgIDB4NDdkNzM2OTdVTCwgMHgwNmU2MmQ4ZVVMLCAweGM1YjUwMGE1VUwsIDB4ODQ4NDFiYmNVTCwgMHgxYThhNDE3MVVMLAorICAgIDB4NWJiYjVhNjhVTCwgMHg5OGU4Nzc0M1VMLCAweGQ5ZDk2YzVhVUwsIDB4MWU0ZjJkMTVVTCwgMHg1ZjdlMzYwY1VMLAorICAgIDB4OWMyZDFiMjdVTCwgMHhkZDFjMDAzZVVMLCAweDEyMDA5OGI5VUwsIDB4NTMzMTgzYTBVTCwgMHg5MDYyYWU4YlVMLAorICAgIDB4ZDE1M2I1OTJVTCwgMHgxNmM1ZjRkZFVMLCAweDU3ZjRlZmM0VUwsIDB4OTRhN2MyZWZVTCwgMHhkNTk2ZDlmNlVMLAorICAgIDB4ZTliYzA3YWVVTCwgMHhhODhkMWNiN1VMLCAweDZiZGUzMTljVUwsIDB4MmFlZjJhODVVTCwgMHhlZDc5NmJjYVVMLAorICAgIDB4YWM0ODcwZDNVTCwgMHg2ZjFiNWRmOFVMLCAweDJlMmE0NmUxVUwsIDB4ZTEzNmRlNjZVTCwgMHhhMDA3YzU3ZlVMLAorICAgIDB4NjM1NGU4NTRVTCwgMHgyMjY1ZjM0ZFVMLCAweGU1ZjNiMjAyVUwsIDB4YTRjMmE5MWJVTCwgMHg2NzkxODQzMFVMLAorICAgIDB4MjZhMDlmMjlVTCwgMHhiOGFlYzVlNFVMLCAweGY5OWZkZWZkVUwsIDB4M2FjY2YzZDZVTCwgMHg3YmZkZThjZlVMLAorICAgIDB4YmM2YmE5ODBVTCwgMHhmZDVhYjI5OVVMLCAweDNlMDk5ZmIyVUwsIDB4N2YzODg0YWJVTCwgMHhiMDI0MWMyY1VMLAorICAgIDB4ZjExNTA3MzVVTCwgMHgzMjQ2MmExZVVMLCAweDczNzczMTA3VUwsIDB4YjRlMTcwNDhVTCwgMHhmNWQwNmI1MVVMLAorICAgIDB4MzY4MzQ2N2FVTCwgMHg3N2IyNWQ2M1VMLCAweDRlZDdmYWNiVUwsIDB4MGZlNmUxZDJVTCwgMHhjY2I1Y2NmOVVMLAorICAgIDB4OGQ4NGQ3ZTBVTCwgMHg0YTEyOTZhZlVMLCAweDBiMjM4ZGI2VUwsIDB4Yzg3MGEwOWRVTCwgMHg4OTQxYmI4NFVMLAorICAgIDB4NDY1ZDIzMDNVTCwgMHgwNzZjMzgxYVVMLCAweGM0M2YxNTMxVUwsIDB4ODUwZTBlMjhVTCwgMHg0Mjk4NGY2N1VMLAorICAgIDB4MDNhOTU0N2VVTCwgMHhjMGZhNzk1NVVMLCAweDgxY2I2MjRjVUwsIDB4MWZjNTM4ODFVTCwgMHg1ZWY0MjM5OFVMLAorICAgIDB4OWRhNzBlYjNVTCwgMHhkYzk2MTVhYVVMLCAweDFiMDA1NGU1VUwsIDB4NWEzMTRmZmNVTCwgMHg5OTYyNjJkN1VMLAorICAgIDB4ZDg1Mzc5Y2VVTCwgMHgxNzRmZTE0OVVMLCAweDU2N2VmYTUwVUwsIDB4OTUyZGQ3N2JVTCwgMHhkNDFjY2M2MlVMLAorICAgIDB4MTM4YThkMmRVTCwgMHg1MmJiOTYzNFVMLCAweDkxZThiYjFmVUwsIDB4ZDBkOWEwMDZVTCwgMHhlY2YzN2U1ZVVMLAorICAgIDB4YWRjMjY1NDdVTCwgMHg2ZTkxNDg2Y1VMLCAweDJmYTA1Mzc1VUwsIDB4ZTgzNjEyM2FVTCwgMHhhOTA3MDkyM1VMLAorICAgIDB4NmE1NDI0MDhVTCwgMHgyYjY1M2YxMVVMLCAweGU0NzlhNzk2VUwsIDB4YTU0OGJjOGZVTCwgMHg2NjFiOTFhNFVMLAorICAgIDB4MjcyYThhYmRVTCwgMHhlMGJjY2JmMlVMLCAweGExOGRkMGViVUwsIDB4NjJkZWZkYzBVTCwgMHgyM2VmZTZkOVVMLAorICAgIDB4YmRlMWJjMTRVTCwgMHhmY2QwYTcwZFVMLCAweDNmODM4YTI2VUwsIDB4N2ViMjkxM2ZVTCwgMHhiOTI0ZDA3MFVMLAorICAgIDB4ZjgxNWNiNjlVTCwgMHgzYjQ2ZTY0MlVMLCAweDdhNzdmZDViVUwsIDB4YjU2YjY1ZGNVTCwgMHhmNDVhN2VjNVVMLAorICAgIDB4MzcwOTUzZWVVTCwgMHg3NjM4NDhmN1VMLCAweGIxYWUwOWI4VUwsIDB4ZjA5ZjEyYTFVTCwgMHgzM2NjM2Y4YVVMLAorICAgIDB4NzJmZDI0OTNVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDM3NmFjMjAxVUwsIDB4NmVkNDg0MDNVTCwgMHg1OWJlNDYwMlVMLCAweGRjYTgwOTA3VUwsCisgICAgMHhlYmMyY2IwNlVMLCAweGIyN2M4ZDA0VUwsIDB4ODUxNjRmMDVVTCwgMHhiODUxMTMwZVVMLCAweDhmM2JkMTBmVUwsCisgICAgMHhkNjg1OTcwZFVMLCAweGUxZWY1NTBjVUwsIDB4NjRmOTFhMDlVTCwgMHg1MzkzZDgwOFVMLCAweDBhMmQ5ZTBhVUwsCisgICAgMHgzZDQ3NWMwYlVMLCAweDcwYTMyNjFjVUwsIDB4NDdjOWU0MWRVTCwgMHgxZTc3YTIxZlVMLCAweDI5MWQ2MDFlVUwsCisgICAgMHhhYzBiMmYxYlVMLCAweDliNjFlZDFhVUwsIDB4YzJkZmFiMThVTCwgMHhmNWI1NjkxOVVMLCAweGM4ZjIzNTEyVUwsCisgICAgMHhmZjk4ZjcxM1VMLCAweGE2MjZiMTExVUwsIDB4OTE0YzczMTBVTCwgMHgxNDVhM2MxNVVMLCAweDIzMzBmZTE0VUwsCisgICAgMHg3YThlYjgxNlVMLCAweDRkZTQ3YTE3VUwsIDB4ZTA0NjRkMzhVTCwgMHhkNzJjOGYzOVVMLCAweDhlOTJjOTNiVUwsCisgICAgMHhiOWY4MGIzYVVMLCAweDNjZWU0NDNmVUwsIDB4MGI4NDg2M2VVTCwgMHg1MjNhYzAzY1VMLCAweDY1NTAwMjNkVUwsCisgICAgMHg1ODE3NWUzNlVMLCAweDZmN2Q5YzM3VUwsIDB4MzZjM2RhMzVVTCwgMHgwMWE5MTgzNFVMLCAweDg0YmY1NzMxVUwsCisgICAgMHhiM2Q1OTUzMFVMLCAweGVhNmJkMzMyVUwsIDB4ZGQwMTExMzNVTCwgMHg5MGU1NmIyNFVMLCAweGE3OGZhOTI1VUwsCisgICAgMHhmZTMxZWYyN1VMLCAweGM5NWIyZDI2VUwsIDB4NGM0ZDYyMjNVTCwgMHg3YjI3YTAyMlVMLCAweDIyOTllNjIwVUwsCisgICAgMHgxNWYzMjQyMVVMLCAweDI4YjQ3ODJhVUwsIDB4MWZkZWJhMmJVTCwgMHg0NjYwZmMyOVVMLCAweDcxMGEzZTI4VUwsCisgICAgMHhmNDFjNzEyZFVMLCAweGMzNzZiMzJjVUwsIDB4OWFjOGY1MmVVTCwgMHhhZGEyMzcyZlVMLCAweGMwOGQ5YTcwVUwsCisgICAgMHhmN2U3NTg3MVVMLCAweGFlNTkxZTczVUwsIDB4OTkzM2RjNzJVTCwgMHgxYzI1OTM3N1VMLCAweDJiNGY1MTc2VUwsCisgICAgMHg3MmYxMTc3NFVMLCAweDQ1OWJkNTc1VUwsIDB4NzhkYzg5N2VVTCwgMHg0ZmI2NGI3ZlVMLCAweDE2MDgwZDdkVUwsCisgICAgMHgyMTYyY2Y3Y1VMLCAweGE0NzQ4MDc5VUwsIDB4OTMxZTQyNzhVTCwgMHhjYWEwMDQ3YVVMLCAweGZkY2FjNjdiVUwsCisgICAgMHhiMDJlYmM2Y1VMLCAweDg3NDQ3ZTZkVUwsIDB4ZGVmYTM4NmZVTCwgMHhlOTkwZmE2ZVVMLCAweDZjODZiNTZiVUwsCisgICAgMHg1YmVjNzc2YVVMLCAweDAyNTIzMTY4VUwsIDB4MzUzOGYzNjlVTCwgMHgwODdmYWY2MlVMLCAweDNmMTU2ZDYzVUwsCisgICAgMHg2NmFiMmI2MVVMLCAweDUxYzFlOTYwVUwsIDB4ZDRkN2E2NjVVTCwgMHhlM2JkNjQ2NFVMLCAweGJhMDMyMjY2VUwsCisgICAgMHg4ZDY5ZTA2N1VMLCAweDIwY2JkNzQ4VUwsIDB4MTdhMTE1NDlVTCwgMHg0ZTFmNTM0YlVMLCAweDc5NzU5MTRhVUwsCisgICAgMHhmYzYzZGU0ZlVMLCAweGNiMDkxYzRlVUwsIDB4OTJiNzVhNGNVTCwgMHhhNWRkOTg0ZFVMLCAweDk4OWFjNDQ2VUwsCisgICAgMHhhZmYwMDY0N1VMLCAweGY2NGU0MDQ1VUwsIDB4YzEyNDgyNDRVTCwgMHg0NDMyY2Q0MVVMLCAweDczNTgwZjQwVUwsCisgICAgMHgyYWU2NDk0MlVMLCAweDFkOGM4YjQzVUwsIDB4NTA2OGYxNTRVTCwgMHg2NzAyMzM1NVVMLCAweDNlYmM3NTU3VUwsCisgICAgMHgwOWQ2Yjc1NlVMLCAweDhjYzBmODUzVUwsIDB4YmJhYTNhNTJVTCwgMHhlMjE0N2M1MFVMLCAweGQ1N2ViZTUxVUwsCisgICAgMHhlODM5ZTI1YVVMLCAweGRmNTMyMDViVUwsIDB4ODZlZDY2NTlVTCwgMHhiMTg3YTQ1OFVMLCAweDM0OTFlYjVkVUwsCisgICAgMHgwM2ZiMjk1Y1VMLCAweDVhNDU2ZjVlVUwsIDB4NmQyZmFkNWZVTCwgMHg4MDFiMzVlMVVMLCAweGI3NzFmN2UwVUwsCisgICAgMHhlZWNmYjFlMlVMLCAweGQ5YTU3M2UzVUwsIDB4NWNiMzNjZTZVTCwgMHg2YmQ5ZmVlN1VMLCAweDMyNjdiOGU1VUwsCisgICAgMHgwNTBkN2FlNFVMLCAweDM4NGEyNmVmVUwsIDB4MGYyMGU0ZWVVTCwgMHg1NjllYTJlY1VMLCAweDYxZjQ2MGVkVUwsCisgICAgMHhlNGUyMmZlOFVMLCAweGQzODhlZGU5VUwsIDB4OGEzNmFiZWJVTCwgMHhiZDVjNjllYVVMLCAweGYwYjgxM2ZkVUwsCisgICAgMHhjN2QyZDFmY1VMLCAweDllNmM5N2ZlVUwsIDB4YTkwNjU1ZmZVTCwgMHgyYzEwMWFmYVVMLCAweDFiN2FkOGZiVUwsCisgICAgMHg0MmM0OWVmOVVMLCAweDc1YWU1Y2Y4VUwsIDB4NDhlOTAwZjNVTCwgMHg3ZjgzYzJmMlVMLCAweDI2M2Q4NGYwVUwsCisgICAgMHgxMTU3NDZmMVVMLCAweDk0NDEwOWY0VUwsIDB4YTMyYmNiZjVVTCwgMHhmYTk1OGRmN1VMLCAweGNkZmY0ZmY2VUwsCisgICAgMHg2MDVkNzhkOVVMLCAweDU3MzdiYWQ4VUwsIDB4MGU4OWZjZGFVTCwgMHgzOWUzM2VkYlVMLCAweGJjZjU3MWRlVUwsCisgICAgMHg4YjlmYjNkZlVMLCAweGQyMjFmNWRkVUwsIDB4ZTU0YjM3ZGNVTCwgMHhkODBjNmJkN1VMLCAweGVmNjZhOWQ2VUwsCisgICAgMHhiNmQ4ZWZkNFVMLCAweDgxYjIyZGQ1VUwsIDB4MDRhNDYyZDBVTCwgMHgzM2NlYTBkMVVMLCAweDZhNzBlNmQzVUwsCisgICAgMHg1ZDFhMjRkMlVMLCAweDEwZmU1ZWM1VUwsIDB4Mjc5NDljYzRVTCwgMHg3ZTJhZGFjNlVMLCAweDQ5NDAxOGM3VUwsCisgICAgMHhjYzU2NTdjMlVMLCAweGZiM2M5NWMzVUwsIDB4YTI4MmQzYzFVTCwgMHg5NWU4MTFjMFVMLCAweGE4YWY0ZGNiVUwsCisgICAgMHg5ZmM1OGZjYVVMLCAweGM2N2JjOWM4VUwsIDB4ZjExMTBiYzlVTCwgMHg3NDA3NDRjY1VMLCAweDQzNmQ4NmNkVUwsCisgICAgMHgxYWQzYzBjZlVMLCAweDJkYjkwMmNlVUwsIDB4NDA5NmFmOTFVTCwgMHg3N2ZjNmQ5MFVMLCAweDJlNDIyYjkyVUwsCisgICAgMHgxOTI4ZTk5M1VMLCAweDljM2VhNjk2VUwsIDB4YWI1NDY0OTdVTCwgMHhmMmVhMjI5NVVMLCAweGM1ODBlMDk0VUwsCisgICAgMHhmOGM3YmM5ZlVMLCAweGNmYWQ3ZTllVUwsIDB4OTYxMzM4OWNVTCwgMHhhMTc5ZmE5ZFVMLCAweDI0NmZiNTk4VUwsCisgICAgMHgxMzA1Nzc5OVVMLCAweDRhYmIzMTliVUwsIDB4N2RkMWYzOWFVTCwgMHgzMDM1ODk4ZFVMLCAweDA3NWY0YjhjVUwsCisgICAgMHg1ZWUxMGQ4ZVVMLCAweDY5OGJjZjhmVUwsIDB4ZWM5ZDgwOGFVTCwgMHhkYmY3NDI4YlVMLCAweDgyNDkwNDg5VUwsCisgICAgMHhiNTIzYzY4OFVMLCAweDg4NjQ5YTgzVUwsIDB4YmYwZTU4ODJVTCwgMHhlNmIwMWU4MFVMLCAweGQxZGFkYzgxVUwsCisgICAgMHg1NGNjOTM4NFVMLCAweDYzYTY1MTg1VUwsIDB4M2ExODE3ODdVTCwgMHgwZDcyZDU4NlVMLCAweGEwZDBlMmE5VUwsCisgICAgMHg5N2JhMjBhOFVMLCAweGNlMDQ2NmFhVUwsIDB4Zjk2ZWE0YWJVTCwgMHg3Yzc4ZWJhZVVMLCAweDRiMTIyOWFmVUwsCisgICAgMHgxMmFjNmZhZFVMLCAweDI1YzZhZGFjVUwsIDB4MTg4MWYxYTdVTCwgMHgyZmViMzNhNlVMLCAweDc2NTU3NWE0VUwsCisgICAgMHg0MTNmYjdhNVVMLCAweGM0MjlmOGEwVUwsIDB4ZjM0MzNhYTFVTCwgMHhhYWZkN2NhM1VMLCAweDlkOTdiZWEyVUwsCisgICAgMHhkMDczYzRiNVVMLCAweGU3MTkwNmI0VUwsIDB4YmVhNzQwYjZVTCwgMHg4OWNkODJiN1VMLCAweDBjZGJjZGIyVUwsCisgICAgMHgzYmIxMGZiM1VMLCAweDYyMGY0OWIxVUwsIDB4NTU2NThiYjBVTCwgMHg2ODIyZDdiYlVMLCAweDVmNDgxNWJhVUwsCisgICAgMHgwNmY2NTNiOFVMLCAweDMxOWM5MWI5VUwsIDB4YjQ4YWRlYmNVTCwgMHg4M2UwMWNiZFVMLCAweGRhNWU1YWJmVUwsCisgICAgMHhlZDM0OThiZVVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4NjU2N2JjYjhVTCwgMHg4YmM4MDlhYVVMLCAweGVlYWZiNTEyVUwsIDB4NTc5NzYyOGZVTCwKKyAgICAweDMyZjBkZTM3VUwsIDB4ZGM1ZjZiMjVVTCwgMHhiOTM4ZDc5ZFVMLCAweGVmMjhiNGM1VUwsIDB4OGE0ZjA4N2RVTCwKKyAgICAweDY0ZTBiZDZmVUwsIDB4MDE4NzAxZDdVTCwgMHhiOGJmZDY0YVVMLCAweGRkZDg2YWYyVUwsIDB4MzM3N2RmZTBVTCwKKyAgICAweDU2MTA2MzU4VUwsIDB4OWY1NzE5NTBVTCwgMHhmYTMwYTVlOFVMLCAweDE0OWYxMGZhVUwsIDB4NzFmOGFjNDJVTCwKKyAgICAweGM4YzA3YmRmVUwsIDB4YWRhN2M3NjdVTCwgMHg0MzA4NzI3NVVMLCAweDI2NmZjZWNkVUwsIDB4NzA3ZmFkOTVVTCwKKyAgICAweDE1MTgxMTJkVUwsIDB4ZmJiN2E0M2ZVTCwgMHg5ZWQwMTg4N1VMLCAweDI3ZThjZjFhVUwsIDB4NDI4ZjczYTJVTCwKKyAgICAweGFjMjBjNmIwVUwsIDB4Yzk0NzdhMDhVTCwgMHgzZWFmMzJhMFVMLCAweDViYzg4ZTE4VUwsIDB4YjU2NzNiMGFVTCwKKyAgICAweGQwMDA4N2IyVUwsIDB4NjkzODUwMmZVTCwgMHgwYzVmZWM5N1VMLCAweGUyZjA1OTg1VUwsIDB4ODc5N2U1M2RVTCwKKyAgICAweGQxODc4NjY1VUwsIDB4YjRlMDNhZGRVTCwgMHg1YTRmOGZjZlVMLCAweDNmMjgzMzc3VUwsIDB4ODYxMGU0ZWFVTCwKKyAgICAweGUzNzc1ODUyVUwsIDB4MGRkOGVkNDBVTCwgMHg2OGJmNTFmOFVMLCAweGExZjgyYmYwVUwsIDB4YzQ5Zjk3NDhVTCwKKyAgICAweDJhMzAyMjVhVUwsIDB4NGY1NzllZTJVTCwgMHhmNjZmNDk3ZlVMLCAweDkzMDhmNWM3VUwsIDB4N2RhNzQwZDVVTCwKKyAgICAweDE4YzBmYzZkVUwsIDB4NGVkMDlmMzVVTCwgMHgyYmI3MjM4ZFVMLCAweGM1MTg5NjlmVUwsIDB4YTA3ZjJhMjdVTCwKKyAgICAweDE5NDdmZGJhVUwsIDB4N2MyMDQxMDJVTCwgMHg5MjhmZjQxMFVMLCAweGY3ZTg0OGE4VUwsIDB4M2Q1ODE0OWJVTCwKKyAgICAweDU4M2ZhODIzVUwsIDB4YjY5MDFkMzFVTCwgMHhkM2Y3YTE4OVVMLCAweDZhY2Y3NjE0VUwsIDB4MGZhOGNhYWNVTCwKKyAgICAweGUxMDc3ZmJlVUwsIDB4ODQ2MGMzMDZVTCwgMHhkMjcwYTA1ZVVMLCAweGI3MTcxY2U2VUwsIDB4NTliOGE5ZjRVTCwKKyAgICAweDNjZGYxNTRjVUwsIDB4ODVlN2MyZDFVTCwgMHhlMDgwN2U2OVVMLCAweDBlMmZjYjdiVUwsIDB4NmI0ODc3YzNVTCwKKyAgICAweGEyMGYwZGNiVUwsIDB4Yzc2OGIxNzNVTCwgMHgyOWM3MDQ2MVVMLCAweDRjYTBiOGQ5VUwsIDB4ZjU5ODZmNDRVTCwKKyAgICAweDkwZmZkM2ZjVUwsIDB4N2U1MDY2ZWVVTCwgMHgxYjM3ZGE1NlVMLCAweDRkMjdiOTBlVUwsIDB4Mjg0MDA1YjZVTCwKKyAgICAweGM2ZWZiMGE0VUwsIDB4YTM4ODBjMWNVTCwgMHgxYWIwZGI4MVVMLCAweDdmZDc2NzM5VUwsIDB4OTE3OGQyMmJVTCwKKyAgICAweGY0MWY2ZTkzVUwsIDB4MDNmNzI2M2JVTCwgMHg2NjkwOWE4M1VMLCAweDg4M2YyZjkxVUwsIDB4ZWQ1ODkzMjlVTCwKKyAgICAweDU0NjA0NGI0VUwsIDB4MzEwN2Y4MGNVTCwgMHhkZmE4NGQxZVVMLCAweGJhY2ZmMWE2VUwsIDB4ZWNkZjkyZmVVTCwKKyAgICAweDg5YjgyZTQ2VUwsIDB4NjcxNzliNTRVTCwgMHgwMjcwMjdlY1VMLCAweGJiNDhmMDcxVUwsIDB4ZGUyZjRjYzlVTCwKKyAgICAweDMwODBmOWRiVUwsIDB4NTVlNzQ1NjNVTCwgMHg5Y2EwM2Y2YlVMLCAweGY5Yzc4M2QzVUwsIDB4MTc2ODM2YzFVTCwKKyAgICAweDcyMGY4YTc5VUwsIDB4Y2IzNzVkZTRVTCwgMHhhZTUwZTE1Y1VMLCAweDQwZmY1NDRlVUwsIDB4MjU5OGU4ZjZVTCwKKyAgICAweDczODg4YmFlVUwsIDB4MTZlZjM3MTZVTCwgMHhmODQwODIwNFVMLCAweDlkMjczZWJjVUwsIDB4MjQxZmU5MjFVTCwKKyAgICAweDQxNzg1NTk5VUwsIDB4YWZkN2UwOGJVTCwgMHhjYWIwNWMzM1VMLCAweDNiYjY1OWVkVUwsIDB4NWVkMWU1NTVVTCwKKyAgICAweGIwN2U1MDQ3VUwsIDB4ZDUxOWVjZmZVTCwgMHg2YzIxM2I2MlVMLCAweDA5NDY4N2RhVUwsIDB4ZTdlOTMyYzhVTCwKKyAgICAweDgyOGU4ZTcwVUwsIDB4ZDQ5ZWVkMjhVTCwgMHhiMWY5NTE5MFVMLCAweDVmNTZlNDgyVUwsIDB4M2EzMTU4M2FVTCwKKyAgICAweDgzMDk4ZmE3VUwsIDB4ZTY2ZTMzMWZVTCwgMHgwOGMxODYwZFVMLCAweDZkYTYzYWI1VUwsIDB4YTRlMTQwYmRVTCwKKyAgICAweGMxODZmYzA1VUwsIDB4MmYyOTQ5MTdVTCwgMHg0YTRlZjVhZlVMLCAweGYzNzYyMjMyVUwsIDB4OTYxMTllOGFVTCwKKyAgICAweDc4YmUyYjk4VUwsIDB4MWRkOTk3MjBVTCwgMHg0YmM5ZjQ3OFVMLCAweDJlYWU0OGMwVUwsIDB4YzAwMWZkZDJVTCwKKyAgICAweGE1NjY0MTZhVUwsIDB4MWM1ZTk2ZjdVTCwgMHg3OTM5MmE0ZlVMLCAweDk3OTY5ZjVkVUwsIDB4ZjJmMTIzZTVVTCwKKyAgICAweDA1MTk2YjRkVUwsIDB4NjA3ZWQ3ZjVVTCwgMHg4ZWQxNjJlN1VMLCAweGViYjZkZTVmVUwsIDB4NTI4ZTA5YzJVTCwKKyAgICAweDM3ZTliNTdhVUwsIDB4ZDk0NjAwNjhVTCwgMHhiYzIxYmNkMFVMLCAweGVhMzFkZjg4VUwsIDB4OGY1NjYzMzBVTCwKKyAgICAweDYxZjlkNjIyVUwsIDB4MDQ5ZTZhOWFVTCwgMHhiZGE2YmQwN1VMLCAweGQ4YzEwMWJmVUwsIDB4MzY2ZWI0YWRVTCwKKyAgICAweDUzMDkwODE1VUwsIDB4OWE0ZTcyMWRVTCwgMHhmZjI5Y2VhNVVMLCAweDExODY3YmI3VUwsIDB4NzRlMWM3MGZVTCwKKyAgICAweGNkZDkxMDkyVUwsIDB4YThiZWFjMmFVTCwgMHg0NjExMTkzOFVMLCAweDIzNzZhNTgwVUwsIDB4NzU2NmM2ZDhVTCwKKyAgICAweDEwMDE3YTYwVUwsIDB4ZmVhZWNmNzJVTCwgMHg5YmM5NzNjYVVMLCAweDIyZjFhNDU3VUwsIDB4NDc5NjE4ZWZVTCwKKyAgICAweGE5MzlhZGZkVUwsIDB4Y2M1ZTExNDVVTCwgMHgwNmVlNGQ3NlVMLCAweDYzODlmMWNlVUwsIDB4OGQyNjQ0ZGNVTCwKKyAgICAweGU4NDFmODY0VUwsIDB4NTE3OTJmZjlVTCwgMHgzNDFlOTM0MVVMLCAweGRhYjEyNjUzVUwsIDB4YmZkNjlhZWJVTCwKKyAgICAweGU5YzZmOWIzVUwsIDB4OGNhMTQ1MGJVTCwgMHg2MjBlZjAxOVVMLCAweDA3Njk0Y2ExVUwsIDB4YmU1MTliM2NVTCwKKyAgICAweGRiMzYyNzg0VUwsIDB4MzU5OTkyOTZVTCwgMHg1MGZlMmUyZVVMLCAweDk5Yjk1NDI2VUwsIDB4ZmNkZWU4OWVVTCwKKyAgICAweDEyNzE1ZDhjVUwsIDB4NzcxNmUxMzRVTCwgMHhjZTJlMzZhOVVMLCAweGFiNDk4YTExVUwsIDB4NDVlNjNmMDNVTCwKKyAgICAweDIwODE4M2JiVUwsIDB4NzY5MWUwZTNVTCwgMHgxM2Y2NWM1YlVMLCAweGZkNTllOTQ5VUwsIDB4OTgzZTU1ZjFVTCwKKyAgICAweDIxMDY4MjZjVUwsIDB4NDQ2MTNlZDRVTCwgMHhhYWNlOGJjNlVMLCAweGNmYTkzNzdlVUwsIDB4Mzg0MTdmZDZVTCwKKyAgICAweDVkMjZjMzZlVUwsIDB4YjM4OTc2N2NVTCwgMHhkNmVlY2FjNFVMLCAweDZmZDYxZDU5VUwsIDB4MGFiMWExZTFVTCwKKyAgICAweGU0MWUxNGYzVUwsIDB4ODE3OWE4NGJVTCwgMHhkNzY5Y2IxM1VMLCAweGIyMGU3N2FiVUwsIDB4NWNhMWMyYjlVTCwKKyAgICAweDM5YzY3ZTAxVUwsIDB4ODBmZWE5OWNVTCwgMHhlNTk5MTUyNFVMLCAweDBiMzZhMDM2VUwsIDB4NmU1MTFjOGVVTCwKKyAgICAweGE3MTY2Njg2VUwsIDB4YzI3MWRhM2VVTCwgMHgyY2RlNmYyY1VMLCAweDQ5YjlkMzk0VUwsIDB4ZjA4MTA0MDlVTCwKKyAgICAweDk1ZTZiOGIxVUwsIDB4N2I0OTBkYTNVTCwgMHgxZTJlYjExYlVMLCAweDQ4M2VkMjQzVUwsIDB4MmQ1OTZlZmJVTCwKKyAgICAweGMzZjZkYmU5VUwsIDB4YTY5MTY3NTFVTCwgMHgxZmE5YjBjY1VMLCAweDdhY2UwYzc0VUwsIDB4OTQ2MWI5NjZVTCwKKyAgICAweGYxMDYwNWRlVUwKKyNlbmRpZgorICB9Cit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvZGVmbGF0ZS5jIGIvdXNyL2tsaWJjL3psaWIvZGVmbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWIwM2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9kZWZsYXRlLmMKQEAgLTAsMCArMSwxNzM2IEBACisvKiBkZWZsYXRlLmMgLS0gY29tcHJlc3MgZGF0YSB1c2luZyB0aGUgZGVmbGF0aW9uIGFsZ29yaXRobQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogIEFMR09SSVRITQorICoKKyAqICAgICAgVGhlICJkZWZsYXRpb24iIHByb2Nlc3MgZGVwZW5kcyBvbiBiZWluZyBhYmxlIHRvIGlkZW50aWZ5IHBvcnRpb25zCisgKiAgICAgIG9mIHRoZSBpbnB1dCB0ZXh0IHdoaWNoIGFyZSBpZGVudGljYWwgdG8gZWFybGllciBpbnB1dCAod2l0aGluIGEKKyAqICAgICAgc2xpZGluZyB3aW5kb3cgdHJhaWxpbmcgYmVoaW5kIHRoZSBpbnB1dCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkKS4KKyAqCisgKiAgICAgIFRoZSBtb3N0IHN0cmFpZ2h0Zm9yd2FyZCB0ZWNobmlxdWUgdHVybnMgb3V0IHRvIGJlIHRoZSBmYXN0ZXN0IGZvcgorICogICAgICBtb3N0IGlucHV0IGZpbGVzOiB0cnkgYWxsIHBvc3NpYmxlIG1hdGNoZXMgYW5kIHNlbGVjdCB0aGUgbG9uZ2VzdC4KKyAqICAgICAgVGhlIGtleSBmZWF0dXJlIG9mIHRoaXMgYWxnb3JpdGhtIGlzIHRoYXQgaW5zZXJ0aW9ucyBpbnRvIHRoZSBzdHJpbmcKKyAqICAgICAgZGljdGlvbmFyeSBhcmUgdmVyeSBzaW1wbGUgYW5kIHRodXMgZmFzdCwgYW5kIGRlbGV0aW9ucyBhcmUgYXZvaWRlZAorICogICAgICBjb21wbGV0ZWx5LiBJbnNlcnRpb25zIGFyZSBwZXJmb3JtZWQgYXQgZWFjaCBpbnB1dCBjaGFyYWN0ZXIsIHdoZXJlYXMKKyAqICAgICAgc3RyaW5nIG1hdGNoZXMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGVuZHMuIFNvIGl0CisgKiAgICAgIGlzIHByZWZlcmFibGUgdG8gc3BlbmQgbW9yZSB0aW1lIGluIG1hdGNoZXMgdG8gYWxsb3cgdmVyeSBmYXN0IHN0cmluZworICogICAgICBpbnNlcnRpb25zIGFuZCBhdm9pZCBkZWxldGlvbnMuIFRoZSBtYXRjaGluZyBhbGdvcml0aG0gZm9yIHNtYWxsCisgKiAgICAgIHN0cmluZ3MgaXMgaW5zcGlyZWQgZnJvbSB0aGF0IG9mIFJhYmluICYgS2FycC4gQSBicnV0ZSBmb3JjZSBhcHByb2FjaAorICogICAgICBpcyB1c2VkIHRvIGZpbmQgbG9uZ2VyIHN0cmluZ3Mgd2hlbiBhIHNtYWxsIG1hdGNoIGhhcyBiZWVuIGZvdW5kLgorICogICAgICBBIHNpbWlsYXIgYWxnb3JpdGhtIGlzIHVzZWQgaW4gY29taWMgKGJ5IEphbi1NYXJrIFdhbXMpIGFuZCBmcmVlemUKKyAqICAgICAgKGJ5IExlb25pZCBCcm91a2hpcykuCisgKiAgICAgICAgIEEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdXNlZCBhIG1vcmUgc29waGlzdGljYXRlZCBhbGdvcml0aG0KKyAqICAgICAgKGJ5IEZpYWxhIGFuZCBHcmVlbmUpIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuIGluIGxpbmVhciBhbW9ydGl6ZWQKKyAqICAgICAgdGltZSwgYnV0IGhhcyBhIGxhcmdlciBhdmVyYWdlIGNvc3QsIHVzZXMgbW9yZSBtZW1vcnkgYW5kIGlzIHBhdGVudGVkLgorICogICAgICBIb3dldmVyIHRoZSBGJkcgYWxnb3JpdGhtIG1heSBiZSBmYXN0ZXIgZm9yIHNvbWUgaGlnaGx5IHJlZHVuZGFudAorICogICAgICBmaWxlcyBpZiB0aGUgcGFyYW1ldGVyIG1heF9jaGFpbl9sZW5ndGggKGRlc2NyaWJlZCBiZWxvdykgaXMgdG9vIGxhcmdlLgorICoKKyAqICBBQ0tOT1dMRURHRU1FTlRTCisgKgorICogICAgICBUaGUgaWRlYSBvZiBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBpcyBkdWUgdG8gSmFuLU1hcmsgV2FtcywgYW5kCisgKiAgICAgIEkgZm91bmQgaXQgaW4gJ2ZyZWV6ZScgd3JpdHRlbiBieSBMZW9uaWQgQnJvdWtoaXMuCisgKiAgICAgIFRoYW5rcyB0byBtYW55IHBlb3BsZSBmb3IgYnVnIHJlcG9ydHMgYW5kIHRlc3RpbmcuCisgKgorICogIFJFRkVSRU5DRVMKKyAqCisgKiAgICAgIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KKyAqICAgICAgQXZhaWxhYmxlIGluIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTEudHh0CisgKgorICogICAgICBBIGRlc2NyaXB0aW9uIG9mIHRoZSBSYWJpbiBhbmQgS2FycCBhbGdvcml0aG0gaXMgZ2l2ZW4gaW4gdGhlIGJvb2sKKyAqICAgICAgICAgIkFsZ29yaXRobXMiIGJ5IFIuIFNlZGdld2ljaywgQWRkaXNvbi1XZXNsZXksIHAyNTIuCisgKgorICogICAgICBGaWFsYSxFLlIuLCBhbmQgR3JlZW5lLEQuSC4KKyAqICAgICAgICAgRGF0YSBDb21wcmVzc2lvbiB3aXRoIEZpbml0ZSBXaW5kb3dzLCBDb21tLkFDTSwgMzIsNCAoMTk4OSkgNDkwLTU5NQorICoKKyAqLworCisvKiBAKCMpICRJZDogZGVmbGF0ZS5jLHYgMS4xIDIwMDUvMDIvMjcgMjM6MTU6MzkgaHBhIEV4cCAkICovCisKKyNpbmNsdWRlICJkZWZsYXRlLmgiCisKK2NvbnN0IGNoYXIgZGVmbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGRlZmxhdGUgMS4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5ICI7CisvKgorICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCisgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKKyAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCisgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogIEZ1bmN0aW9uIHByb3RvdHlwZXMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgbmVlZF9tb3JlLCAgICAgIC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqLworICAgIGJsb2NrX2RvbmUsICAgICAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi8KKyAgICBmaW5pc2hfc3RhcnRlZCwgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi8KKyAgICBmaW5pc2hfZG9uZSAgICAgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqLworfSBibG9ja19zdGF0ZTsKKwordHlwZWRlZiBibG9ja19zdGF0ZSAoKmNvbXByZXNzX2Z1bmMpIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKKy8qIENvbXByZXNzaW9uIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBibG9jayBzdGF0ZSBhZnRlciB0aGUgY2FsbC4gKi8KKworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworI2lmbmRlZiBGQVNURVNUCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7CisjZW5kaWYKK2xvY2FsIHZvaWQgbG1faW5pdCAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHZvaWQgcHV0U2hvcnRNU0IgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVJbnQgYikpOworbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nICBPRigoel9zdHJlYW1wIHN0cm0pKTsKK2xvY2FsIGludCByZWFkX2J1ZiAgICAgICAgT0YoKHpfc3RyZWFtcCBzdHJtLCBCeXRlZiAqYnVmLCB1bnNpZ25lZCBzaXplKSk7CisjaWZuZGVmIEZBU1RFU1QKKyNpZmRlZiBBU01WCisgICAgICB2b2lkIG1hdGNoX2luaXQgT0YoKHZvaWQpKTsgLyogYXNtIGNvZGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CisjZWxzZQorbG9jYWwgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKKyNlbmRpZgorI2VuZGlmCitsb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2hfZmFzdCBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKKworI2lmZGVmIERFQlVHCitsb2NhbCAgdm9pZCBjaGVja19tYXRjaCBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBzdGFydCwgSVBvcyBtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSk7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCBkYXRhCisgKi8KKworI2RlZmluZSBOSUwgMAorLyogVGFpbCBvZiBoYXNoIGNoYWlucyAqLworCisjaWZuZGVmIFRPT19GQVIKKyMgIGRlZmluZSBUT09fRkFSIDQwOTYKKyNlbmRpZgorLyogTWF0Y2hlcyBvZiBsZW5ndGggMyBhcmUgZGlzY2FyZGVkIGlmIHRoZWlyIGRpc3RhbmNlIGV4Y2VlZHMgVE9PX0ZBUiAqLworCisjZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKKy8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCisgKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCisgKi8KKworLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uCisgKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG8KKyAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZQorICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBjb25maWdfcyB7CisgICB1c2ggZ29vZF9sZW5ndGg7IC8qIHJlZHVjZSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9sYXp5OyAgICAvKiBkbyBub3QgcGVyZm9ybSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG5pY2VfbGVuZ3RoOyAvKiBxdWl0IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9jaGFpbjsKKyAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKK30gY29uZmlnOworCisjaWZkZWYgRkFTVEVTVAorbG9jYWwgY29uc3QgY29uZmlnIGNvbmZpZ3VyYXRpb25fdGFibGVbMl0gPSB7CisvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCisvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLworLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH19OyAvKiBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqLworI2Vsc2UKK2xvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzEwXSA9IHsKKy8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi8KKy8qIDAgKi8gezAsICAgIDAsICAwLCAgICAwLCBkZWZsYXRlX3N0b3JlZH0sICAvKiBzdG9yZSBvbmx5ICovCisvKiAxICovIHs0LCAgICA0LCAgOCwgICAgNCwgZGVmbGF0ZV9mYXN0fSwgLyogbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKy8qIDIgKi8gezQsICAgIDUsIDE2LCAgICA4LCBkZWZsYXRlX2Zhc3R9LAorLyogMyAqLyB7NCwgICAgNiwgMzIsICAgMzIsIGRlZmxhdGVfZmFzdH0sCisKKy8qIDQgKi8gezQsICAgIDQsIDE2LCAgIDE2LCBkZWZsYXRlX3Nsb3d9LCAgLyogbGF6eSBtYXRjaGVzICovCisvKiA1ICovIHs4LCAgIDE2LCAzMiwgICAzMiwgZGVmbGF0ZV9zbG93fSwKKy8qIDYgKi8gezgsICAgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3d9LAorLyogNyAqLyB7OCwgICAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvd30sCisvKiA4ICovIHszMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvd30sCisvKiA5ICovIHszMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvd319OyAvKiBtYXggY29tcHJlc3Npb24gKi8KKyNlbmRpZgorCisvKiBOb3RlOiB0aGUgZGVmbGF0ZSgpIGNvZGUgcmVxdWlyZXMgbWF4X2xhenkgPj0gTUlOX01BVENIIGFuZCBtYXhfY2hhaW4gPj0gNAorICogRm9yIGRlZmxhdGVfZmFzdCgpIChsZXZlbHMgPD0gMykgZ29vZCBpcyBpZ25vcmVkIGFuZCBsYXp5IGhhcyBhIGRpZmZlcmVudAorICogbWVhbmluZy4KKyAqLworCisjZGVmaW5lIEVRVUFMIDAKKy8qIHJlc3VsdCBvZiBtZW1jbXAgZm9yIGVxdWFsIHN0cmluZ3MgKi8KKworI2lmbmRlZiBOT19EVU1NWV9ERUNMCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGEgaGFzaCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbnB1dCBieXRlCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gVVBEQVRFX0hBU0ggYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogICAgaW5wdXQgY2hhcmFjdGVycywgc28gdGhhdCBhIHJ1bm5pbmcgaGFzaCBrZXkgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlCisgKiAgICBwcmV2aW91cyBrZXkgaW5zdGVhZCBvZiBjb21wbGV0ZSByZWNhbGN1bGF0aW9uIGVhY2ggdGltZS4KKyAqLworI2RlZmluZSBVUERBVEVfSEFTSChzLGgsYykgKGggPSAoKChoKTw8cy0+aGFzaF9zaGlmdCkgXiAoYykpICYgcy0+aGFzaF9tYXNrKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5zZXJ0IHN0cmluZyBzdHIgaW4gdGhlIGRpY3Rpb25hcnkgYW5kIHNldCBtYXRjaF9oZWFkIHRvIHRoZSBwcmV2aW91cyBoZWFkCisgKiBvZiB0aGUgaGFzaCBjaGFpbiAodGhlIG1vc3QgcmVjZW50IHN0cmluZyB3aXRoIHNhbWUgaGFzaCBrZXkpLiBSZXR1cm4KKyAqIHRoZSBwcmV2aW91cyBsZW5ndGggb2YgdGhlIGhhc2ggY2hhaW4uCisgKiBJZiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCAtREZBU1RFU1QsIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBmb3JjZWQKKyAqIHRvIDEsIGFuZCBubyBoYXNoIGNoYWlucyBhcmUgbWFpbnRhaW5lZC4KKyAqIElOICBhc3NlcnRpb246IGFsbCBjYWxscyB0byB0byBJTlNFUlRfU1RSSU5HIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMgYW5kIHRoZSBmaXJzdCBNSU5fTUFUQ0ggYnl0ZXMgb2Ygc3RyIGFyZSB2YWxpZAorICogICAgKGV4Y2VwdCBmb3IgdGhlIGxhc3QgTUlOX01BVENILTEgYnl0ZXMgb2YgdGhlIGlucHV0IGZpbGUpLgorICovCisjaWZkZWYgRkFTVEVTVAorI2RlZmluZSBJTlNFUlRfU1RSSU5HKHMsIHN0ciwgbWF0Y2hfaGVhZCkgXAorICAgKFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbKHN0cikgKyAoTUlOX01BVENILTEpXSksIFwKKyAgICBtYXRjaF9oZWFkID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKKyAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCisjZWxzZQorI2RlZmluZSBJTlNFUlRfU1RSSU5HKHMsIHN0ciwgbWF0Y2hfaGVhZCkgXAorICAgKFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbKHN0cikgKyAoTUlOX01BVENILTEpXSksIFwKKyAgICBtYXRjaF9oZWFkID0gcy0+cHJldlsoc3RyKSAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXSwgXAorICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcykoc3RyKSkKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgKGF2b2lkaW5nIDY0SyBvdmVyZmxvdyBmb3IgMTYgYml0IHN5c3RlbXMpLgorICogcHJldltdIHdpbGwgYmUgaW5pdGlhbGl6ZWQgb24gdGhlIGZseS4KKyAqLworI2RlZmluZSBDTEVBUl9IQVNIKHMpIFwKKyAgICBzLT5oZWFkW3MtPmhhc2hfc2l6ZS0xXSA9IE5JTDsgXAorICAgIHptZW16ZXJvKChCeXRlZiAqKXMtPmhlYWQsICh1bnNpZ25lZCkocy0+aGFzaF9zaXplLTEpKnNpemVvZigqcy0+aGVhZCkpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdF8oc3RybSwgbGV2ZWwsIHZlcnNpb24sIHN0cmVhbV9zaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCBsZXZlbDsKKyAgICBjb25zdCBjaGFyICp2ZXJzaW9uOworICAgIGludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICByZXR1cm4gZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgIFpfREVGQVVMVF9TVFJBVEVHWSwgdmVyc2lvbiwgc3RyZWFtX3NpemUpOworICAgIC8qIFRvIGRvOiBpZ25vcmUgc3RybS0+bmV4dF9pbiBpZiB3ZSB1c2UgaXQgYXMgd2luZG93ICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgdmVyc2lvbiwgc3RyZWFtX3NpemUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50ICBsZXZlbDsKKyAgICBpbnQgIG1ldGhvZDsKKyAgICBpbnQgIHdpbmRvd0JpdHM7CisgICAgaW50ICBtZW1MZXZlbDsKKyAgICBpbnQgIHN0cmF0ZWd5OworICAgIGNvbnN0IGNoYXIgKnZlcnNpb247CisgICAgaW50IHN0cmVhbV9zaXplOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IHdyYXAgPSAxOworICAgIHN0YXRpYyBjb25zdCBjaGFyIG15X3ZlcnNpb25bXSA9IFpMSUJfVkVSU0lPTjsKKworICAgIHVzaGYgKm92ZXJsYXk7CisgICAgLyogV2Ugb3ZlcmxheSBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYuIFRoaXMgd29ya3Mgc2luY2UgdGhlIGF2ZXJhZ2UKKyAgICAgKiBvdXRwdXQgc2l6ZSBmb3IgKGxlbmd0aCxkaXN0YW5jZSkgY29kZXMgaXMgPD0gMjQgYml0cy4KKyAgICAgKi8KKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IG15X3ZlcnNpb25bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gc2l6ZW9mKHpfc3RyZWFtKSkgeworICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOworICAgIH0KKyAgICBpZiAoc3RybSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKworI2lmZGVmIEZBU1RFU1QKKyAgICBpZiAobGV2ZWwgIT0gMCkgbGV2ZWwgPSAxOworI2Vsc2UKKyAgICBpZiAobGV2ZWwgPT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBsZXZlbCA9IDY7CisjZW5kaWYKKworICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi8KKyAgICAgICAgd3JhcCA9IDA7CisgICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKKyAgICB9CisjaWZkZWYgR1pJUAorICAgIGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkgeworICAgICAgICB3cmFwID0gMjsgICAgICAgLyogd3JpdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgKi8KKyAgICAgICAgd2luZG93Qml0cyAtPSAxNjsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAobWVtTGV2ZWwgPCAxIHx8IG1lbUxldmVsID4gTUFYX01FTV9MRVZFTCB8fCBtZXRob2QgIT0gWl9ERUZMQVRFRCB8fAorICAgICAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fAorICAgICAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHdpbmRvd0JpdHMgPT0gOCkgd2luZG93Qml0cyA9IDk7ICAvKiB1bnRpbCAyNTYtYnl0ZSB3aW5kb3cgYnVnIGZpeGVkICovCisgICAgcyA9IChkZWZsYXRlX3N0YXRlICopIFpBTExPQyhzdHJtLCAxLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOworICAgIGlmIChzID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIHN0cm0tPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKilzOworICAgIHMtPnN0cm0gPSBzdHJtOworCisgICAgcy0+d3JhcCA9IHdyYXA7CisgICAgcy0+Z3poZWFkID0gWl9OVUxMOworICAgIHMtPndfYml0cyA9IHdpbmRvd0JpdHM7CisgICAgcy0+d19zaXplID0gMSA8PCBzLT53X2JpdHM7CisgICAgcy0+d19tYXNrID0gcy0+d19zaXplIC0gMTsKKworICAgIHMtPmhhc2hfYml0cyA9IG1lbUxldmVsICsgNzsKKyAgICBzLT5oYXNoX3NpemUgPSAxIDw8IHMtPmhhc2hfYml0czsKKyAgICBzLT5oYXNoX21hc2sgPSBzLT5oYXNoX3NpemUgLSAxOworICAgIHMtPmhhc2hfc2hpZnQgPSAgKChzLT5oYXNoX2JpdHMrTUlOX01BVENILTEpL01JTl9NQVRDSCk7CisKKyAgICBzLT53aW5kb3cgPSAoQnl0ZWYgKikgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOworICAgIHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+d19zaXplLCBzaXplb2YoUG9zKSk7CisgICAgcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhzdHJtLCBzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKKworICAgIHMtPmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi8KKworICAgIG92ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpOworICAgIHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKyAgICBzLT5wZW5kaW5nX2J1Zl9zaXplID0gKHVsZylzLT5saXRfYnVmc2l6ZSAqIChzaXplb2YodXNoKSsyTCk7CisKKyAgICBpZiAocy0+d2luZG93ID09IFpfTlVMTCB8fCBzLT5wcmV2ID09IFpfTlVMTCB8fCBzLT5oZWFkID09IFpfTlVMTCB8fAorICAgICAgICBzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOworICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciopRVJSX01TRyhaX01FTV9FUlJPUik7CisgICAgICAgIGRlZmxhdGVFbmQgKHN0cm0pOworICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorICAgIHMtPmRfYnVmID0gb3ZlcmxheSArIHMtPmxpdF9idWZzaXplL3NpemVvZih1c2gpOworICAgIHMtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7CisKKyAgICBzLT5sZXZlbCA9IGxldmVsOworICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcy0+bWV0aG9kID0gKEJ5dGUpbWV0aG9kOworCisgICAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgKHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7CisgICAgdUludCAgZGljdExlbmd0aDsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVJbnQgbGVuZ3RoID0gZGljdExlbmd0aDsKKyAgICB1SW50IG47CisgICAgSVBvcyBoYXNoX2hlYWQgPSAwOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBkaWN0aW9uYXJ5ID09IFpfTlVMTCB8fAorICAgICAgICBzdHJtLT5zdGF0ZS0+d3JhcCA9PSAyIHx8CisgICAgICAgIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAxICYmIHN0cm0tPnN0YXRlLT5zdGF0dXMgIT0gSU5JVF9TVEFURSkpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBpZiAocy0+d3JhcCkKKyAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKKworICAgIGlmIChsZW5ndGggPCBNSU5fTUFUQ0gpIHJldHVybiBaX09LOworICAgIGlmIChsZW5ndGggPiBNQVhfRElTVChzKSkgeworICAgICAgICBsZW5ndGggPSBNQVhfRElTVChzKTsKKyAgICAgICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gbGVuZ3RoOyAvKiB1c2UgdGhlIHRhaWwgb2YgdGhlIGRpY3Rpb25hcnkgKi8KKyAgICB9CisgICAgem1lbWNweShzLT53aW5kb3csIGRpY3Rpb25hcnksIGxlbmd0aCk7CisgICAgcy0+c3Ryc3RhcnQgPSBsZW5ndGg7CisgICAgcy0+YmxvY2tfc3RhcnQgPSAobG9uZylsZW5ndGg7CisKKyAgICAvKiBJbnNlcnQgYWxsIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgKGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHdvIGJ5dGVzKS4KKyAgICAgKiBzLT5sb29rYWhlYWQgc3RheXMgbnVsbCwgc28gcy0+aW5zX2ggd2lsbCBiZSByZWNvbXB1dGVkIGF0IHRoZSBuZXh0CisgICAgICogY2FsbCBvZiBmaWxsX3dpbmRvdy4KKyAgICAgKi8KKyAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1swXTsKKyAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WzFdKTsKKyAgICBmb3IgKG4gPSAwOyBuIDw9IGxlbmd0aCAtIE1JTl9NQVRDSDsgbisrKSB7CisgICAgICAgIElOU0VSVF9TVFJJTkcocywgbiwgaGFzaF9oZWFkKTsKKyAgICB9CisgICAgaWYgKGhhc2hfaGVhZCkgaGFzaF9oZWFkID0gMDsgIC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IChzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8CisgICAgICAgIHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorCisgICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSAwOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgLyogdXNlIHpmcmVlIGlmIHdlIGV2ZXIgYWxsb2NhdGUgbXNnIGR5bmFtaWNhbGx5ICovCisgICAgc3RybS0+ZGF0YV90eXBlID0gWl9VTktOT1dOOworCisgICAgcyA9IChkZWZsYXRlX3N0YXRlICopc3RybS0+c3RhdGU7CisgICAgcy0+cGVuZGluZyA9IDA7CisgICAgcy0+cGVuZGluZ19vdXQgPSBzLT5wZW5kaW5nX2J1ZjsKKworICAgIGlmIChzLT53cmFwIDwgMCkgeworICAgICAgICBzLT53cmFwID0gLXMtPndyYXA7IC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovCisgICAgfQorICAgIHMtPnN0YXR1cyA9IHMtPndyYXAgPyBJTklUX1NUQVRFIDogQlVTWV9TVEFURTsKKyAgICBzdHJtLT5hZGxlciA9CisjaWZkZWYgR1pJUAorICAgICAgICBzLT53cmFwID09IDIgPyBjcmMzMigwTCwgWl9OVUxMLCAwKSA6CisjZW5kaWYKKyAgICAgICAgYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICBzLT5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDsKKworICAgIF90cl9pbml0KHMpOworICAgIGxtX2luaXQocyk7CisKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVNldEhlYWRlciAoc3RybSwgaGVhZCkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBnel9oZWFkZXJwIGhlYWQ7Cit7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCAhPSAyKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+c3RhdGUtPmd6aGVhZCA9IGhlYWQ7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVQcmltZSAoc3RybSwgYml0cywgdmFsdWUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGJpdHM7CisgICAgaW50IHZhbHVlOworeworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtLT5zdGF0ZS0+YmlfdmFsaWQgPSBiaXRzOworICAgIHN0cm0tPnN0YXRlLT5iaV9idWYgPSAodXNoKSh2YWx1ZSAmICgoMSA8PCBiaXRzKSAtIDEpKTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyhzdHJtLCBsZXZlbCwgc3RyYXRlZ3kpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGxldmVsOworICAgIGludCBzdHJhdGVneTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKKyAgICBpbnQgZXJyID0gWl9PSzsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzID0gc3RybS0+c3RhdGU7CisKKyNpZmRlZiBGQVNURVNUCisgICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKKyNlbHNlCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworI2VuZGlmCisgICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIGZ1bmMgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jOworCisgICAgaWYgKGZ1bmMgIT0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0uZnVuYyAmJiBzdHJtLT50b3RhbF9pbiAhPSAwKSB7CisgICAgICAgIC8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KKyAgICAgICAgZXJyID0gZGVmbGF0ZShzdHJtLCBaX1BBUlRJQUxfRkxVU0gpOworICAgIH0KKyAgICBpZiAocy0+bGV2ZWwgIT0gbGV2ZWwpIHsKKyAgICAgICAgcy0+bGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9sYXp5OworICAgICAgICBzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0uZ29vZF9sZW5ndGg7CisgICAgICAgIHMtPm5pY2VfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5uaWNlX2xlbmd0aDsKKyAgICAgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9jaGFpbjsKKyAgICB9CisgICAgcy0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZShzdHJtLCBnb29kX2xlbmd0aCwgbWF4X2xhenksIG5pY2VfbGVuZ3RoLCBtYXhfY2hhaW4pCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGdvb2RfbGVuZ3RoOworICAgIGludCBtYXhfbGF6eTsKKyAgICBpbnQgbmljZV9sZW5ndGg7CisgICAgaW50IG1heF9jaGFpbjsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBzLT5nb29kX21hdGNoID0gZ29vZF9sZW5ndGg7CisgICAgcy0+bWF4X2xhenlfbWF0Y2ggPSBtYXhfbGF6eTsKKyAgICBzLT5uaWNlX21hdGNoID0gbmljZV9sZW5ndGg7CisgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IG1heF9jaGFpbjsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRm9yIHRoZSBkZWZhdWx0IHdpbmRvd0JpdHMgb2YgMTUgYW5kIG1lbUxldmVsIG9mIDgsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICogYSBjbG9zZSB0byBleGFjdCwgYXMgd2VsbCBhcyBzbWFsbCwgdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZS4KKyAqIFRoZXkgYXJlIGNvZGVkIGFzIGNvbnN0YW50cyBoZXJlIGZvciBhIHJlYXNvbi0taWYgdGhlICNkZWZpbmUncyBhcmUKKyAqIGNoYW5nZWQsIHRoZW4gdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjaGFuZ2VkIGFzIHdlbGwuICBUaGUgcmV0dXJuCisgKiB2YWx1ZSBmb3IgMTUgYW5kIDggb25seSB3b3JrcyBmb3IgdGhvc2UgZXhhY3Qgc2V0dGluZ3MuCisgKgorICogRm9yIGFueSBzZXR0aW5nIG90aGVyIHRoYW4gdGhvc2UgZGVmYXVsdHMgZm9yIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLAorICogdGhlIHZhbHVlIHJldHVybmVkIGlzIGEgY29uc2VydmF0aXZlIHdvcnN0IGNhc2UgZm9yIHRoZSBtYXhpbXVtIGV4cGFuc2lvbgorICogcmVzdWx0aW5nIGZyb20gdXNpbmcgZml4ZWQgYmxvY2tzIGluc3RlYWQgb2Ygc3RvcmVkIGJsb2Nrcywgd2hpY2ggZGVmbGF0ZQorICogY2FuIGVtaXQgb24gY29tcHJlc3NlZCBkYXRhIGZvciBzb21lIGNvbWJpbmF0aW9ucyBvZiB0aGUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vcmUgc29waGlzdGljYXRlZCB0byBwcm92aWRlIGNsb3NlciB1cHBlciBib3VuZHMKKyAqIGZvciBldmVyeSBjb21iaW5hdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbCwgYXMgd2VsbCBhcyB3cmFwLgorICogQnV0IGV2ZW4gdGhlIGNvbnNlcnZhdGl2ZSB1cHBlciBib3VuZCBvZiBhYm91dCAxNCUgZXhwYW5zaW9uIGRvZXMgbm90CisgKiBzZWVtIG9uZXJvdXMgZm9yIG91dHB1dCBidWZmZXIgYWxsb2NhdGlvbi4KKyAqLwordUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQoc3RybSwgc291cmNlTGVuKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVMb25nIGRlc3RMZW47CisKKyAgICAvKiBjb25zZXJ2YXRpdmUgdXBwZXIgYm91bmQgKi8KKyAgICBkZXN0TGVuID0gc291cmNlTGVuICsKKyAgICAgICAgICAgICAgKChzb3VyY2VMZW4gKyA3KSA+PiAzKSArICgoc291cmNlTGVuICsgNjMpID4+IDYpICsgMTE7CisKKyAgICAvKiBpZiBjYW4ndCBnZXQgcGFyYW1ldGVycywgcmV0dXJuIGNvbnNlcnZhdGl2ZSBib3VuZCAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBkZXN0TGVuOworCisgICAgLyogaWYgbm90IGRlZmF1bHQgcGFyYW1ldGVycywgcmV0dXJuIGNvbnNlcnZhdGl2ZSBib3VuZCAqLworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBpZiAocy0+d19iaXRzICE9IDE1IHx8IHMtPmhhc2hfYml0cyAhPSA4ICsgNykKKyAgICAgICAgcmV0dXJuIGRlc3RMZW47CisKKyAgICAvKiBkZWZhdWx0IHNldHRpbmdzOiByZXR1cm4gdGlnaHQgYm91bmQgZm9yIHRoYXQgY2FzZSAqLworICAgIHJldHVybiBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluCisgKiBwZW5kaW5nX2J1Zi4KKyAqLworbG9jYWwgdm9pZCBwdXRTaG9ydE1TQiAocywgYikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVJbnQgYjsKK3sKKyAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7CisgICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXMKKyAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQKKyAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X291dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC4KKyAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS4KKyAqLworbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgdW5zaWduZWQgbGVuID0gc3RybS0+c3RhdGUtPnBlbmRpbmc7CisKKyAgICBpZiAobGVuID4gc3RybS0+YXZhaWxfb3V0KSBsZW4gPSBzdHJtLT5hdmFpbF9vdXQ7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisKKyAgICB6bWVtY3B5KHN0cm0tPm5leHRfb3V0LCBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQsIGxlbik7CisgICAgc3RybS0+bmV4dF9vdXQgICs9IGxlbjsKKyAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQgICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9vdXQgKz0gbGVuOworICAgIHN0cm0tPmF2YWlsX291dCAgLT0gbGVuOworICAgIHN0cm0tPnN0YXRlLT5wZW5kaW5nIC09IGxlbjsKKyAgICBpZiAoc3RybS0+c3RhdGUtPnBlbmRpbmcgPT0gMCkgeworICAgICAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQgPSBzdHJtLT5zdGF0ZS0+cGVuZGluZ19idWY7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlIChzdHJtLCBmbHVzaCkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IG9sZF9mbHVzaDsgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8CisgICAgICAgIGZsdXNoID4gWl9GSU5JU0ggfHwgZmx1c2ggPCAwKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgcyA9IHN0cm0tPnN0YXRlOworCisgICAgaWYgKHN0cm0tPm5leHRfb3V0ID09IFpfTlVMTCB8fAorICAgICAgICAoc3RybS0+bmV4dF9pbiA9PSBaX05VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgfHwKKyAgICAgICAgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT0gWl9GSU5JU0gpKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9TVFJFQU1fRVJST1IpOworICAgIH0KKyAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworCisgICAgcy0+c3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqLworICAgIG9sZF9mbHVzaCA9IHMtPmxhc3RfZmx1c2g7CisgICAgcy0+bGFzdF9mbHVzaCA9IGZsdXNoOworCisgICAgLyogV3JpdGUgdGhlIGhlYWRlciAqLworICAgIGlmIChzLT5zdGF0dXMgPT0gSU5JVF9TVEFURSkgeworI2lmZGVmIEdaSVAKKyAgICAgICAgaWYgKHMtPndyYXAgPT0gMikgeworICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHB1dF9ieXRlKHMsIDMxKTsKKyAgICAgICAgICAgIHB1dF9ieXRlKHMsIDEzOSk7CisgICAgICAgICAgICBwdXRfYnl0ZShzLCA4KTsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIDApOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIDApOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIDApOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIDApOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIDApOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmxldmVsID09IDkgPyAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy0+bGV2ZWwgPCAyID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTsKKyAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKHMtPmd6aGVhZC0+dGV4dCA/IDEgOiAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+aGNyYyA/IDIgOiAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+ZXh0cmEgPT0gWl9OVUxMID8gMCA6IDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+Z3poZWFkLT5uYW1lID09IFpfTlVMTCA/IDAgOiA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+Y29tbWVudCA9PSBaX05VTEwgPyAwIDogMTYpCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKShzLT5nemhlYWQtPnRpbWUgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzLT5nemhlYWQtPnRpbWUgPj4gOCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzLT5nemhlYWQtPnRpbWUgPj4gMTYpICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDI0KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5sZXZlbCA9PSA5ID8gMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5vcyAmIDB4ZmYpOworICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmV4dHJhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKHMtPmd6aGVhZC0+ZXh0cmFfbGVuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpCisgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcpOworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEVYVFJBX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICB1SW50IGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLT53X2JpdHMtOCk8PDQpKSA8PCA4OworICAgICAgICAgICAgdUludCBsZXZlbF9mbGFnczsKKworICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMikKKyAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChzLT5sZXZlbCA8IDYpCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPT0gNikKKyAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzOworICAgICAgICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJzdGFydCAhPSAwKSBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7CisgICAgICAgICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpOworCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKKworICAgICAgICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovCisgICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgeworICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBpZiAocy0+c3RhdHVzID09IEVYVFJBX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmV4dHJhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KKworICAgICAgICAgICAgd2hpbGUgKHMtPmd6aW5kZXggPCAocy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5leHRyYVtzLT5nemluZGV4XSk7CisgICAgICAgICAgICAgICAgcy0+Z3ppbmRleCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICBpZiAocy0+Z3ppbmRleCA9PSBzLT5nemhlYWQtPmV4dHJhX2xlbikgeworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IE5BTUVfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gTkFNRV9TVEFURTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXR1cyA9PSBOQU1FX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPm5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLworICAgICAgICAgICAgaW50IHZhbDsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgICAgICAgICBiZWcgPSBzLT5wZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsID0gcy0+Z3poZWFkLT5uYW1lW3MtPmd6aW5kZXgrK107CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgdmFsKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHZhbCAhPSAwKTsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcgLSBiZWcpOworICAgICAgICAgICAgaWYgKHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+Z3ppbmRleCA9IDA7CisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gQ09NTUVOVF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBDT01NRU5UX1NUQVRFOworICAgIH0KKyAgICBpZiAocy0+c3RhdHVzID09IENPTU1FTlRfU1RBVEUpIHsKKyAgICAgICAgaWYgKHMtPmd6aGVhZC0+Y29tbWVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCisgICAgICAgICAgICBpbnQgdmFsOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSBzLT5nemhlYWQtPmNvbW1lbnRbcy0+Z3ppbmRleCsrXTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOworICAgICAgICAgICAgfSB3aGlsZSAodmFsICE9IDApOworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICBpZiAodmFsID09IDApCisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBIQ1JDX1NUQVRFOworICAgIH0KKyAgICBpZiAocy0+c3RhdHVzID09IEhDUkNfU1RBVEUpIHsKKyAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYykgeworICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyID4gcy0+cGVuZGluZ19idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyIDw9IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+YWRsZXIgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi8KKyAgICBpZiAocy0+cGVuZGluZyAhPSAwKSB7CisgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAorICAgICAgICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmQKKyAgICAgICAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLAorICAgICAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZToKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOworICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZQorICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwCisgICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLgorICAgICAqLworICAgIH0gZWxzZSBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBmbHVzaCA8PSBvbGRfZmx1c2ggJiYKKyAgICAgICAgICAgICAgIGZsdXNoICE9IFpfRklOSVNIKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworICAgIH0KKworICAgIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovCisgICAgaWYgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgeworICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuCisgICAgICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luICE9IDAgfHwgcy0+bG9va2FoZWFkICE9IDAgfHwKKyAgICAgICAgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgcy0+c3RhdHVzICE9IEZJTklTSF9TVEFURSkpIHsKKyAgICAgICAgYmxvY2tfc3RhdGUgYnN0YXRlOworCisgICAgICAgIGJzdGF0ZSA9ICgqKGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLmZ1bmMpKShzLCBmbHVzaCk7CisKKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCB8fCBic3RhdGUgPT0gZmluaXNoX2RvbmUpIHsKKyAgICAgICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnN0YXRlID09IG5lZWRfbW9yZSB8fCBic3RhdGUgPT0gZmluaXNoX3N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gWl9PSzsKKyAgICAgICAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW4KKyAgICAgICAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvCisgICAgICAgICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3QKKyAgICAgICAgICAgICAqIG9uZSBlbXB0eSBibG9jay4KKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIGlmIChic3RhdGUgPT0gYmxvY2tfZG9uZSkgeworICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfUEFSVElBTF9GTFVTSCkgeworICAgICAgICAgICAgICAgIF90cl9hbGlnbihzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqLworICAgICAgICAgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgKGNoYXIqKTAsIDBMLCAwKTsKKyAgICAgICAgICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZAorICAgICAgICAgICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfRlVMTF9GTFVTSCkgeworICAgICAgICAgICAgICAgICAgICBDTEVBUl9IQVNIKHMpOyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KKyAgICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsICJidWcyIik7CisKKyAgICBpZiAoZmx1c2ggIT0gWl9GSU5JU0gpIHJldHVybiBaX09LOworICAgIGlmIChzLT53cmFwIDw9IDApIHJldHVybiBaX1NUUkVBTV9FTkQ7CisKKyAgICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqLworI2lmZGVmIEdaSVAKKyAgICBpZiAocy0+d3JhcCA9PSAyKSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKShzdHJtLT5hZGxlciAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiAxNikgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+YWRsZXIgPj4gMjQpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+dG90YWxfaW4gJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gOCkgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gMTYpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgPj4gMTYpKTsKKyAgICAgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyICYgMHhmZmZmKSk7CisgICAgfQorICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpbgorICAgICAqIHRvIGZsdXNoIHRoZSByZXN0LgorICAgICAqLworICAgIGlmIChzLT53cmFwID4gMCkgcy0+d3JhcCA9IC1zLT53cmFwOyAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovCisgICAgcmV0dXJuIHMtPnBlbmRpbmcgIT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVFbmQgKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgaW50IHN0YXR1czsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHN0YXR1cyA9IHN0cm0tPnN0YXRlLT5zdGF0dXM7CisgICAgaWYgKHN0YXR1cyAhPSBJTklUX1NUQVRFICYmCisgICAgICAgIHN0YXR1cyAhPSBFWFRSQV9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gTkFNRV9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gQ09NTUVOVF9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gSENSQ19TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gQlVTWV9TVEFURSAmJgorICAgICAgICBzdGF0dXMgIT0gRklOSVNIX1NUQVRFKSB7CisgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorCisgICAgLyogRGVhbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb25zOiAqLworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wZW5kaW5nX2J1Zik7CisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPmhlYWQpOworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wcmV2KTsKKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+d2luZG93KTsKKworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKworICAgIHJldHVybiBzdGF0dXMgPT0gQlVTWV9TVEFURSA/IFpfREFUQV9FUlJPUiA6IFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgdGhlIHNvdXJjZSBzdGF0ZSB0byB0aGUgZGVzdGluYXRpb24gc3RhdGUuCisgKiBUbyBzaW1wbGlmeSB0aGUgc291cmNlLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIDE2LWJpdCBNU0RPUyAod2hpY2gKKyAqIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5IGFueXdheSB0byBkdXBsaWNhdGUgY29tcHJlc3Npb24gc3RhdGVzKS4KKyAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgKGRlc3QsIHNvdXJjZSkKKyAgICB6X3N0cmVhbXAgZGVzdDsKKyAgICB6X3N0cmVhbXAgc291cmNlOworeworI2lmZGVmIE1BWFNFR182NEsKKyAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgIGRlZmxhdGVfc3RhdGUgKmRzOworICAgIGRlZmxhdGVfc3RhdGUgKnNzOworICAgIHVzaGYgKm92ZXJsYXk7CisKKworICAgIGlmIChzb3VyY2UgPT0gWl9OVUxMIHx8IGRlc3QgPT0gWl9OVUxMIHx8IHNvdXJjZS0+c3RhdGUgPT0gWl9OVUxMKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisKKyAgICBzcyA9IHNvdXJjZS0+c3RhdGU7CisKKyAgICB6bWVtY3B5KGRlc3QsIHNvdXJjZSwgc2l6ZW9mKHpfc3RyZWFtKSk7CisKKyAgICBkcyA9IChkZWZsYXRlX3N0YXRlICopIFpBTExPQyhkZXN0LCAxLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOworICAgIGlmIChkcyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBkZXN0LT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopIGRzOworICAgIHptZW1jcHkoZHMsIHNzLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOworICAgIGRzLT5zdHJtID0gZGVzdDsKKworICAgIGRzLT53aW5kb3cgPSAoQnl0ZWYgKikgWkFMTE9DKGRlc3QsIGRzLT53X3NpemUsIDIqc2l6ZW9mKEJ5dGUpKTsKKyAgICBkcy0+cHJldiAgID0gKFBvc2YgKikgIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCBzaXplb2YoUG9zKSk7CisgICAgZHMtPmhlYWQgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPmhhc2hfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIG92ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0MoZGVzdCwgZHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTsKKyAgICBkcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5OworCisgICAgaWYgKGRzLT53aW5kb3cgPT0gWl9OVUxMIHx8IGRzLT5wcmV2ID09IFpfTlVMTCB8fCBkcy0+aGVhZCA9PSBaX05VTEwgfHwKKyAgICAgICAgZHMtPnBlbmRpbmdfYnVmID09IFpfTlVMTCkgeworICAgICAgICBkZWZsYXRlRW5kIChkZXN0KTsKKyAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIH0KKyAgICAvKiBmb2xsb3dpbmcgem1lbWNweSBkbyBub3Qgd29yayBmb3IgMTYtYml0IE1TRE9TICovCisgICAgem1lbWNweShkcy0+d2luZG93LCBzcy0+d2luZG93LCBkcy0+d19zaXplICogMiAqIHNpemVvZihCeXRlKSk7CisgICAgem1lbWNweShkcy0+cHJldiwgc3MtPnByZXYsIGRzLT53X3NpemUgKiBzaXplb2YoUG9zKSk7CisgICAgem1lbWNweShkcy0+aGVhZCwgc3MtPmhlYWQsIGRzLT5oYXNoX3NpemUgKiBzaXplb2YoUG9zKSk7CisgICAgem1lbWNweShkcy0+cGVuZGluZ19idWYsIHNzLT5wZW5kaW5nX2J1ZiwgKHVJbnQpZHMtPnBlbmRpbmdfYnVmX3NpemUpOworCisgICAgZHMtPnBlbmRpbmdfb3V0ID0gZHMtPnBlbmRpbmdfYnVmICsgKHNzLT5wZW5kaW5nX291dCAtIHNzLT5wZW5kaW5nX2J1Zik7CisgICAgZHMtPmRfYnVmID0gb3ZlcmxheSArIGRzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKKyAgICBkcy0+bF9idWYgPSBkcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqZHMtPmxpdF9idWZzaXplOworCisgICAgZHMtPmxfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fbHRyZWU7CisgICAgZHMtPmRfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fZHRyZWU7CisgICAgZHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBkcy0+YmxfdHJlZTsKKworICAgIHJldHVybiBaX09LOworI2VuZGlmIC8qIE1BWFNFR182NEsgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyCisgKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaAorICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWQKKyAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X2luIGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LgorICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuCisgKi8KK2xvY2FsIGludCByZWFkX2J1ZihzdHJtLCBidWYsIHNpemUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgQnl0ZWYgKmJ1ZjsKKyAgICB1bnNpZ25lZCBzaXplOworeworICAgIHVuc2lnbmVkIGxlbiA9IHN0cm0tPmF2YWlsX2luOworCisgICAgaWYgKGxlbiA+IHNpemUpIGxlbiA9IHNpemU7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gMDsKKworICAgIHN0cm0tPmF2YWlsX2luICAtPSBsZW47CisKKyAgICBpZiAoc3RybS0+c3RhdGUtPndyYXAgPT0gMSkgeworICAgICAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBlbHNlIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAyKSB7CisgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgfQorI2VuZGlmCisgICAgem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgc3RybS0+bmV4dF9pbiAgKz0gbGVuOworICAgIHN0cm0tPnRvdGFsX2luICs9IGxlbjsKKworICAgIHJldHVybiAoaW50KWxlbjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtCisgKi8KK2xvY2FsIHZvaWQgbG1faW5pdCAocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIHMtPndpbmRvd19zaXplID0gKHVsZykyTCpzLT53X3NpemU7CisKKyAgICBDTEVBUl9IQVNIKHMpOworCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczoKKyAgICAgKi8KKyAgICBzLT5tYXhfbGF6eV9tYXRjaCAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubWF4X2xhenk7CisgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLmdvb2RfbGVuZ3RoOworICAgIHMtPm5pY2VfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5uaWNlX2xlbmd0aDsKKyAgICBzLT5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubWF4X2NoYWluOworCisgICAgcy0+c3Ryc3RhcnQgPSAwOworICAgIHMtPmJsb2NrX3N0YXJ0ID0gMEw7CisgICAgcy0+bG9va2FoZWFkID0gMDsKKyAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgcy0+aW5zX2ggPSAwOworI2lmbmRlZiBGQVNURVNUCisjaWZkZWYgQVNNVgorICAgIG1hdGNoX2luaXQoKTsgLyogaW5pdGlhbGl6ZSB0aGUgYXNtIGNvZGUgKi8KKyNlbmRpZgorI2VuZGlmCit9CisKKyNpZm5kZWYgRkFTVEVTVAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmQKKyAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXMKKyAqIGdhcmJhZ2UuCisgKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50CisgKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLgorICovCisjaWZuZGVmIEFTTVYKKy8qIEZvciA4MHg4NiBhbmQgNjgweDAsIGFuIG9wdGltaXplZCB2ZXJzaW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gbWF0Y2guYXNtIG9yCisgKiBtYXRjaC5TLiBUaGUgY29kZSB3aWxsIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LgorICovCitsb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCit7CisgICAgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8KKyAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLworICAgIGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovCisgICAgaW50IG5pY2VfbWF0Y2ggPSBzLT5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovCisgICAgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPworICAgICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOworICAgIC8qIFN0b3Agd2hlbiBjdXJfbWF0Y2ggYmVjb21lcyA8PSBsaW1pdC4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsCisgICAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC4KKyAgICAgKi8KKyAgICBQb3NmICpwcmV2ID0gcy0+cHJldjsKKyAgICB1SW50IHdtYXNrID0gcy0+d19tYXNrOworCisjaWZkZWYgVU5BTElHTkVEX09LCisgICAgLyogQ29tcGFyZSB0d28gYnl0ZXMgYXQgYSB0aW1lLiBOb3RlOiB0aGlzIGlzIG5vdCBhbHdheXMgYmVuZWZpY2lhbC4KKyAgICAgKiBUcnkgd2l0aCBhbmQgd2l0aG91dCAtRFVOQUxJR05FRF9PSyB0byBjaGVjay4KKyAgICAgKi8KKyAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0ggLSAxOworICAgIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOworICAgIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIOworICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQxICA9IHNjYW5bYmVzdF9sZW4tMV07CisgICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07CisjZW5kaWYKKworICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKKworICAgIC8qIERvIG5vdCB3YXN0ZSB0b28gbXVjaCB0aW1lIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGdvb2QgbWF0Y2g6ICovCisgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsKKyAgICAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOworICAgIH0KKyAgICAvKiBEbyBub3QgbG9vayBmb3IgbWF0Y2hlcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuIFRoaXMgaXMgbmVjZXNzYXJ5CisgICAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuCisgICAgICovCisgICAgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CisKKyAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCAibmVlZCBsb29rYWhlYWQiKTsKKworICAgIGRvIHsKKyAgICAgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisgICAgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOworCisgICAgICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZQorICAgICAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3cKKyAgICAgICAgICogZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBvY2N1ciBvY2Nhc2lvbmFsbHkgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kCisgICAgICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuCisgICAgICAgICAqIEhvd2V2ZXIgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbGltaXRlZCB0byB0aGUgbG9va2FoZWFkLCBzbworICAgICAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy4KKyAgICAgICAgICovCisjaWYgKGRlZmluZWQoVU5BTElHTkVEX09LKSAmJiBNQVhfTUFUQ0ggPT0gMjU4KQorICAgICAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyBzaXplb2YodW5zaWduZWQgc2hvcnQpID09IDIuIERvIG5vdCB1c2UKKyAgICAgICAgICogVU5BTElHTkVEX09LIGlmIHlvdXIgY29tcGlsZXIgdXNlcyBhIGRpZmZlcmVudCBzaXplLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8CisgICAgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOworCisgICAgICAgIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5IGFyZQorICAgICAgICAgKiBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQgdGhlIGhhc2gga2V5cworICAgICAgICAgKiBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguIENvbXBhcmUgMiBieXRlcyBhdCBhIHRpbWUgYXQKKyAgICAgICAgICogc3Ryc3RhcnQrMywgKzUsIC4uLiB1cCB0byBzdHJzdGFydCsyNTcuIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQKKyAgICAgICAgICogbG9va2FoZWFkIG9ubHkgZXZlcnkgNHRoIGNvbXBhcmlzb247IHRoZSAxMjh0aCBjaGVjayB3aWxsIGJlIG1hZGUKKyAgICAgICAgICogYXQgc3Ryc3RhcnQrMjU3LiBJZiBNQVhfTUFUQ0gtMiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LCBpdCBpcworICAgICAgICAgKiBuZWNlc3NhcnkgdG8gcHV0IG1vcmUgZ3VhcmQgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LCBvcgorICAgICAgICAgKiB0byBjaGVjayBtb3JlIG9mdGVuIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW5bMl0gPT0gbWF0Y2hbMl0sICJzY2FuWzJdPyIpOworICAgICAgICBzY2FuKyssIG1hdGNoKys7CisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworICAgICAgICAvKiBUaGUgZnVubnkgImRvIHt9IiBnZW5lcmF0ZXMgYmV0dGVyIGNvZGUgb24gbW9zdCBjb21waWxlcnMgKi8KKworICAgICAgICAvKiBIZXJlLCBzY2FuIDw9IHdpbmRvdytzdHJzdGFydCsyNTcgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICptYXRjaCkgc2NhbisrOworCisgICAgICAgIGxlbiA9IChNQVhfTUFUQ0ggLSAxKSAtIChpbnQpKHN0cmVuZC1zY2FuKTsKKyAgICAgICAgc2NhbiA9IHN0cmVuZCAtIChNQVhfTUFUQ0gtMSk7CisKKyNlbHNlIC8qIFVOQUxJR05FRF9PSyAqLworCisgICAgICAgIGlmIChtYXRjaFtiZXN0X2xlbl0gICAhPSBzY2FuX2VuZCAgfHwKKyAgICAgICAgICAgIG1hdGNoW2Jlc3RfbGVuLTFdICE9IHNjYW5fZW5kMSB8fAorICAgICAgICAgICAgKm1hdGNoICAgICAgICAgICAgIT0gKnNjYW4gICAgIHx8CisgICAgICAgICAgICAqKyttYXRjaCAgICAgICAgICAhPSBzY2FuWzFdKSAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pCisgICAgICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKKyAgICAgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguCisgICAgICAgICAqLworICAgICAgICBzY2FuICs9IDIsIG1hdGNoKys7CisgICAgICAgIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsKKworICAgICAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KKyAgICAgICAgICovCisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisKKyAgICAgICAgbGVuID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7CisKKyNlbmRpZiAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobGVuID4gYmVzdF9sZW4pIHsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOworICAgICAgICAgICAgYmVzdF9sZW4gPSBsZW47CisgICAgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOworI2lmZGVmIFVOQUxJR05FRF9PSworICAgICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOworI2Vsc2UKKyAgICAgICAgICAgIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgICAgICAgICAgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKKyAgICAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKKworICAgIGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsKKyAgICByZXR1cm4gcy0+bG9va2FoZWFkOworfQorI2VuZGlmIC8qIEFTTVYgKi8KKyNlbmRpZiAvKiBGQVNURVNUICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT3B0aW1pemVkIHZlcnNpb24gZm9yIGxldmVsID09IDEgb3Igc3RyYXRlZ3kgPT0gWl9STEUgb25seQorICovCitsb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2hfZmFzdChzLCBjdXJfbWF0Y2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KK3sKKyAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKworICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOworCisgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisKKyAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKKworICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6CisgICAgICovCisgICAgaWYgKG1hdGNoWzBdICE9IHNjYW5bMF0gfHwgbWF0Y2hbMV0gIT0gc2NhblsxXSkgcmV0dXJuIE1JTl9NQVRDSC0xOworCisgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKKyAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAorICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAqLworICAgIHNjYW4gKz0gMiwgbWF0Y2ggKz0gMjsKKyAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgorICAgICAqLworICAgIGRvIHsKKyAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisKKyAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKKworICAgIGlmIChsZW4gPCBNSU5fTUFUQ0gpIHJldHVybiBNSU5fTUFUQ0ggLSAxOworCisgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CisgICAgcmV0dXJuICh1SW50KWxlbiA8PSBzLT5sb29rYWhlYWQgPyAodUludClsZW4gOiBzLT5sb29rYWhlYWQ7Cit9CisKKyNpZmRlZiBERUJVRworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0aGF0IHRoZSBtYXRjaCBhdCBtYXRjaF9zdGFydCBpcyBpbmRlZWQgYSBtYXRjaC4KKyAqLworbG9jYWwgdm9pZCBjaGVja19tYXRjaChzLCBzdGFydCwgbWF0Y2gsIGxlbmd0aCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3Mgc3RhcnQsIG1hdGNoOworICAgIGludCBsZW5ndGg7Cit7CisgICAgLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KKyAgICBpZiAoem1lbWNtcChzLT53aW5kb3cgKyBtYXRjaCwKKyAgICAgICAgICAgICAgICBzLT53aW5kb3cgKyBzdGFydCwgbGVuZ3RoKSAhPSBFUVVBTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBzdGFydCAldSwgbWF0Y2ggJXUsIGxlbmd0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICBzdGFydCwgbWF0Y2gsIGxlbmd0aCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWMlYyIsIHMtPndpbmRvd1ttYXRjaCsrXSwgcy0+d2luZG93W3N0YXJ0KytdKTsKKyAgICAgICAgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CisgICAgICAgIHpfZXJyb3IoImludmFsaWQgbWF0Y2giKTsKKyAgICB9CisgICAgaWYgKHpfdmVyYm9zZSA+IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlxcWyVkLCVkXSIsIHN0YXJ0LW1hdGNoLCBsZW5ndGgpOworICAgICAgICBkbyB7IHB1dGMocy0+d2luZG93W3N0YXJ0KytdLCBzdGRlcnIpOyB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICB9Cit9CisjZWxzZQorIyAgZGVmaW5lIGNoZWNrX21hdGNoKHMsIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQorI2VuZGlmIC8qIERFQlVHICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC4KKyAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC4KKyAqCisgKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQKKyAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFECisgKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmUKKyAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sCisgKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS4KKyAqLworbG9jYWwgdm9pZCBmaWxsX3dpbmRvdyhzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbiwgbTsKKyAgICByZWdpc3RlciBQb3NmICpwOworICAgIHVuc2lnbmVkIG1vcmU7ICAgIC8qIEFtb3VudCBvZiBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdy4gKi8KKyAgICB1SW50IHdzaXplID0gcy0+d19zaXplOworCisgICAgZG8geworICAgICAgICBtb3JlID0gKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZSAtKHVsZylzLT5sb29rYWhlYWQgLSh1bGcpcy0+c3Ryc3RhcnQpOworCisgICAgICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovCisgICAgICAgIGlmIChzaXplb2YoaW50KSA8PSAyKSB7CisgICAgICAgICAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICBtb3JlID0gd3NpemU7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkgeworICAgICAgICAgICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZgorICAgICAgICAgICAgICAgICAqIHN0cnN0YXJ0ID09IDAgJiYgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgYSBieXRlIGF0IHRpbWUpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbW9yZS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCwKKyAgICAgICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5zdHJzdGFydCA+PSB3c2l6ZStNQVhfRElTVChzKSkgeworCisgICAgICAgICAgICB6bWVtY3B5KHMtPndpbmRvdywgcy0+d2luZG93K3dzaXplLCAodW5zaWduZWQpd3NpemUpOworICAgICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgLT0gd3NpemU7CisgICAgICAgICAgICBzLT5zdHJzdGFydCAgICAtPSB3c2l6ZTsgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi8KKyAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0IC09IChsb25nKSB3c2l6ZTsKKworICAgICAgICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzCisgICAgICAgICAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMAorICAgICAgICAgICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMAorICAgICAgICAgICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mCisgICAgICAgICAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAlJSUgYXZvaWQgdGhpcyB3aGVuIFpfUkxFICovCisgICAgICAgICAgICBuID0gcy0+aGFzaF9zaXplOworICAgICAgICAgICAgcCA9ICZzLT5oZWFkW25dOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG0gPSAqLS1wOworICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworICAgICAgICAgICAgfSB3aGlsZSAoLS1uKTsKKworICAgICAgICAgICAgbiA9IHdzaXplOworI2lmbmRlZiBGQVNURVNUCisgICAgICAgICAgICBwID0gJnMtPnByZXZbbl07CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbSA9ICotLXA7CisgICAgICAgICAgICAgICAgKnAgPSAoUG9zKShtID49IHdzaXplID8gbS13c2l6ZSA6IE5JTCk7CisgICAgICAgICAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXQKKyAgICAgICAgICAgICAgICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyNlbmRpZgorICAgICAgICAgICAgbW9yZSArPSB3c2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgcmV0dXJuOworCisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOgorICAgICAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJgorICAgICAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnQKKyAgICAgICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpCisgICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMgorICAgICAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSwKKyAgICAgICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiYKKyAgICAgICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC4KKyAgICAgICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi4KKyAgICAgICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLgorICAgICAgICAgKi8KKyAgICAgICAgQXNzZXJ0KG1vcmUgPj0gMiwgIm1vcmUgPCAyIik7CisKKyAgICAgICAgbiA9IHJlYWRfYnVmKHMtPnN0cm0sIHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkLCBtb3JlKTsKKyAgICAgICAgcy0+bG9va2FoZWFkICs9IG47CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzLT5zdHJzdGFydF07CisgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKKyNpZiBNSU5fTUFUQ0ggIT0gMworICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXMKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSwKKyAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLgorICAgICAgICAgKi8KKworICAgIH0gd2hpbGUgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy0+c3RybS0+YXZhaWxfaW4gIT0gMCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGN1cnJlbnQgYmxvY2ssIHdpdGggZ2l2ZW4gZW5kLW9mLWZpbGUgZmxhZy4KKyAqIElOIGFzc2VydGlvbjogc3Ryc3RhcnQgaXMgc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWF0Y2guCisgKi8KKyNkZWZpbmUgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpIHsgXAorICAgX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLT5ibG9ja19zdGFydCA+PSAwTCA/IFwKKyAgICAgICAgICAgICAgICAgICAoY2hhcmYgKikmcy0+d2luZG93Wyh1bnNpZ25lZClzLT5ibG9ja19zdGFydF0gOiBcCisgICAgICAgICAgICAgICAgICAgKGNoYXJmICopWl9OVUxMKSwgXAorICAgICAgICAgICAgICAgICh1bGcpKChsb25nKXMtPnN0cnN0YXJ0IC0gcy0+YmxvY2tfc3RhcnQpLCBcCisgICAgICAgICAgICAgICAgKGVvZikpOyBcCisgICBzLT5ibG9ja19zdGFydCA9IHMtPnN0cnN0YXJ0OyBcCisgICBmbHVzaF9wZW5kaW5nKHMtPnN0cm0pOyBcCisgICBUcmFjZXYoKHN0ZGVyciwiW0ZMVVNIXSIpKTsgXAorfQorCisvKiBTYW1lIGJ1dCBmb3JjZSBwcmVtYXR1cmUgZXhpdCBpZiBuZWNlc3NhcnkuICovCisjZGVmaW5lIEZMVVNIX0JMT0NLKHMsIGVvZikgeyBcCisgICBGTFVTSF9CTE9DS19PTkxZKHMsIGVvZik7IFwKKyAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIChlb2YpID8gZmluaXNoX3N0YXJ0ZWQgOiBuZWVkX21vcmU7IFwKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybgorICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZQorICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi4KKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KKyAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi4KKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWQKKyAgICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjoKKyAgICAgKi8KKyAgICB1bGcgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7CisgICAgdWxnIG1heF9zdGFydDsKKworICAgIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7CisgICAgICAgIG1heF9ibG9ja19zaXplID0gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDU7CisgICAgfQorCisgICAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPD0gMSkgeworCisgICAgICAgICAgICBBc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHwKKyAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOworCisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSByZXR1cm4gbmVlZF9tb3JlOworCisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisgICAgICAgIEFzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgImJsb2NrIGdvbmUiKTsKKworICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7CisgICAgICAgIHMtPmxvb2thaGVhZCA9IDA7CisKKyAgICAgICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCisgICAgICAgIG1heF9zdGFydCA9IHMtPmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CisgICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8ICh1bGcpcy0+c3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CisgICAgICAgICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqLworICAgICAgICAgICAgcy0+bG9va2FoZWFkID0gKHVJbnQpKHMtPnN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gKHVJbnQpbWF4X3N0YXJ0OworICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgICAgIH0KKyAgICAgICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lCisgICAgICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgLSAodUludClzLT5ibG9ja19zdGFydCA+PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOworICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50CisgKiBibG9jayBzdGF0ZS4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0cworICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0CisgKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBmbHVzaDsKK3sKKyAgICBJUG9zIGhhc2hfaGVhZCA9IE5JTDsgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqLworICAgIGludCBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CisgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQorICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0gKKyAgICAgICAgICovCisgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gTklMICYmIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisgICAgICAgICAgICAgKi8KKyNpZmRlZiBGQVNURVNUCisgICAgICAgICAgICBpZiAoKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZICYmIHMtPnN0cmF0ZWd5ICE9IFpfUkxFKSB8fAorICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA9PSBaX1JMRSAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA9PSAxKSkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2hfZmFzdCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBpZiAocy0+c3RyYXRlZ3kgIT0gWl9IVUZGTUFOX09OTFkgJiYgcy0+c3RyYXRlZ3kgIT0gWl9STEUpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoIChzLCBoYXNoX2hlYWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX1JMRSAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaF9mYXN0IChzLCBoYXNoX2hlYWQpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgb3IgbG9uZ2VzdF9tYXRjaF9mYXN0KCkgc2V0cyBtYXRjaF9zdGFydCAqLworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+bWF0Y2hfc3RhcnQsIHMtPm1hdGNoX2xlbmd0aCk7CisKKyAgICAgICAgICAgIF90cl90YWxseV9kaXN0KHMsIHMtPnN0cnN0YXJ0IC0gcy0+bWF0Y2hfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGgKKyAgICAgICAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgICAgICAgICAgICAgKi8KKyNpZm5kZWYgRkFTVEVTVAorICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA8PSBzLT5tYXhfaW5zZXJ0X2xlbmd0aCAmJgorICAgICAgICAgICAgICAgIHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi8KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5tYXRjaF9sZW5ndGggIT0gMCk7CisgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQgKz0gcy0+bWF0Y2hfbGVuZ3RoOworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdOworICAgICAgICAgICAgICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQrMV0pOworI2lmIE1JTl9NQVRDSCAhPSAzCisgICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXMKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90CisgICAgICAgICAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7CisgICAgICAgICAgICBfdHJfdGFsbHlfbGl0IChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdLCBiZmx1c2gpOworICAgICAgICAgICAgcy0+bG9va2FoZWFkLS07CisgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICB9CisgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworICAgIH0KKyAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7CisgICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworfQorCisjaWZuZGVmIEZBU1RFU1QKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eQorICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpcworICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi4KKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93KHMsIGZsdXNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IGZsdXNoOworeworICAgIElQb3MgaGFzaF9oZWFkID0gTklMOyAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi8KKyAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICAvKiBQcm9jZXNzIHRoZSBpbnB1dCBibG9jay4gKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKyAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGUKKyAgICAgICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCisgICAgICAgICAqLworICAgICAgICBzLT5wcmV2X2xlbmd0aCA9IHMtPm1hdGNoX2xlbmd0aCwgcy0+cHJldl9tYXRjaCA9IHMtPm1hdGNoX3N0YXJ0OworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKworICAgICAgICBpZiAoaGFzaF9oZWFkICE9IE5JTCAmJiBzLT5wcmV2X2xlbmd0aCA8IHMtPm1heF9sYXp5X21hdGNoICYmCisgICAgICAgICAgICBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAorICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocy0+c3RyYXRlZ3kgIT0gWl9IVUZGTUFOX09OTFkgJiYgcy0+c3RyYXRlZ3kgIT0gWl9STEUpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoIChzLCBoYXNoX2hlYWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX1JMRSAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaF9mYXN0IChzLCBoYXNoX2hlYWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIG9yIGxvbmdlc3RfbWF0Y2hfZmFzdCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KKworICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA8PSA1ICYmIChzLT5zdHJhdGVneSA9PSBaX0ZJTFRFUkVECisjaWYgVE9PX0ZBUiA8PSAzMjc2NworICAgICAgICAgICAgICAgIHx8IChzLT5tYXRjaF9sZW5ndGggPT0gTUlOX01BVENIICYmCisgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0IC0gcy0+bWF0Y2hfc3RhcnQgPiBUT09fRkFSKQorI2VuZGlmCisgICAgICAgICAgICAgICAgKSkgeworCisgICAgICAgICAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZQorICAgICAgICAgICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50CisgICAgICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+cHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMtPm1hdGNoX2xlbmd0aCA8PSBzLT5wcmV2X2xlbmd0aCkgeworICAgICAgICAgICAgdUludCBtYXhfaW5zZXJ0ID0gcy0+c3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7CisgICAgICAgICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi8KKworICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQtMSwgcy0+cHJldl9tYXRjaCwgcy0+cHJldl9sZW5ndGgpOworCisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtMSAtIHMtPnByZXZfbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKworICAgICAgICAgICAgLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guCisgICAgICAgICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4gSWYgdGhlcmUgaXMgbm90CisgICAgICAgICAgICAgKiBlbm91Z2ggbG9va2FoZWFkLCB0aGUgbGFzdCB0d28gc3RyaW5ncyBhcmUgbm90IGluc2VydGVkIGluCisgICAgICAgICAgICAgKiB0aGUgaGFzaCB0YWJsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHMtPnByZXZfbGVuZ3RoLTE7CisgICAgICAgICAgICBzLT5wcmV2X2xlbmd0aCAtPSAyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICgrK3MtPnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICgtLXMtPnByZXZfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKworICAgICAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhCisgICAgICAgICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoCisgICAgICAgICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7CisgICAgICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKyAgICAgICAgICAgIGlmIChiZmx1c2gpIHsKKyAgICAgICAgICAgICAgICBGTFVTSF9CTE9DS19PTkxZKHMsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvcgorICAgICAgICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDE7CisgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICAgICAgcy0+bG9va2FoZWFkLS07CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCAibm8gZmx1c2g/Iik7CisgICAgaWYgKHMtPm1hdGNoX2F2YWlsYWJsZSkgeworICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7CisgICAgICAgIF90cl90YWxseV9saXQocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdLCBiZmx1c2gpOworICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgIH0KKyAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7CisgICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworfQorI2VuZGlmIC8qIEZBU1RFU1QgKi8KKworI2lmIDAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRm9yIFpfUkxFLCBzaW1wbHkgbG9vayBmb3IgcnVucyBvZiBieXRlcywgZ2VuZXJhdGUgbWF0Y2hlcyBvbmx5IG9mIGRpc3RhbmNlCisgKiBvbmUuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLiAgKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YKKyAqIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIFpfUkxFLikKKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9ybGUocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IGJmbHVzaDsgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KKyAgICB1SW50IHJ1bjsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBydW4gKi8KKyAgICB1SW50IG1heDsgICAgICAgICAgIC8qIG1heGltdW0gbGVuZ3RoIG9mIHJ1biAqLworICAgIHVJbnQgcHJldjsgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi8KKyAgICBCeXRlZiAqc2NhbjsgICAgICAgIC8qIHNjYW4gZm9yIGVuZCBvZiBydW4gKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CisgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCisgICAgICAgICAqIGZvciB0aGUgbG9uZ2VzdCBlbmNvZGFibGUgcnVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1BWF9NQVRDSCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUFYX01BVENIICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNlZSBob3cgbWFueSB0aW1lcyB0aGUgcHJldmlvdXMgYnl0ZSByZXBlYXRzICovCisgICAgICAgIHJ1biA9IDA7CisgICAgICAgIGlmIChzLT5zdHJzdGFydCA+IDApIHsgICAgICAvKiBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGJ5dGUsIHRoYXQgaXMgKi8KKyAgICAgICAgICAgIG1heCA9IHMtPmxvb2thaGVhZCA8IE1BWF9NQVRDSCA/IHMtPmxvb2thaGVhZCA6IE1BWF9NQVRDSDsKKyAgICAgICAgICAgIHNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCAtIDE7CisgICAgICAgICAgICBwcmV2ID0gKnNjYW4rKzsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoKnNjYW4rKyAhPSBwcmV2KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gd2hpbGUgKCsrcnVuIDwgbWF4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi8KKyAgICAgICAgaWYgKHJ1biA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LCBzLT5zdHJzdGFydCAtIDEsIHJ1bik7CisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCAxLCBydW4gLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQgLT0gcnVuOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgKz0gcnVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKKyAgICAgICAgICAgIF90cl90YWxseV9saXQgKHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0sIGJmbHVzaCk7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2RlZmxhdGUuaCBiL3Vzci9rbGliYy96bGliL2RlZmxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTM3ZDcwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvZGVmbGF0ZS5oCkBAIC0wLDAgKzEsMzMxIEBACisvKiBkZWZsYXRlLmggLS0gaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IEplYW4tbG91cCBHYWlsbHkKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogQCgjKSAkSWQ6IGRlZmxhdGUuaCx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjaWZuZGVmIERFRkxBVEVfSAorI2RlZmluZSBERUZMQVRFX0gKKworI2luY2x1ZGUgInp1dGlsLmgiCisKKy8qIGRlZmluZSBOT19HWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGNyZWF0aW9uIGJ5IGRlZmxhdGUoKS4gIE5PX0daSVAgd291bGQgYmUgdXNlZCB0byBhdm9pZCBsaW5raW5nIGluCisgICB0aGUgY3JjIGNvZGUgd2hlbiBpdCBpcyBub3QgbmVlZGVkLiAgRm9yIHNoYXJlZCBsaWJyYXJpZXMsIGd6aXAgZW5jb2RpbmcKKyAgIHNob3VsZCBiZSBsZWZ0IGVuYWJsZWQuICovCisjaWZuZGVmIE5PX0daSVAKKyMgIGRlZmluZSBHWklQCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KKyAqLworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgTF9DT0RFUyAoTElURVJBTFMrMStMRU5HVEhfQ09ERVMpCisvKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBEX0NPREVTICAgMzAKKy8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisjZGVmaW5lIEJMX0NPREVTICAxOQorLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovCisKKyNkZWZpbmUgSEVBUF9TSVpFICgyKkxfQ09ERVMrMSkKKy8qIG1heGltdW0gaGVhcCBzaXplICovCisKKyNkZWZpbmUgTUFYX0JJVFMgMTUKKy8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLworCisjZGVmaW5lIElOSVRfU1RBVEUgICAgNDIKKyNkZWZpbmUgRVhUUkFfU1RBVEUgICA2OQorI2RlZmluZSBOQU1FX1NUQVRFICAgIDczCisjZGVmaW5lIENPTU1FTlRfU1RBVEUgOTEKKyNkZWZpbmUgSENSQ19TVEFURSAgIDEwMworI2RlZmluZSBCVVNZX1NUQVRFICAgMTEzCisjZGVmaW5lIEZJTklTSF9TVEFURSA2NjYKKy8qIFN0cmVhbSBzdGF0dXMgKi8KKworCisvKiBEYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2luZ2xlIHZhbHVlIGFuZCBpdHMgY29kZSBzdHJpbmcuICovCit0eXBlZGVmIHN0cnVjdCBjdF9kYXRhX3MgeworICAgIHVuaW9uIHsKKyAgICAgICAgdXNoICBmcmVxOyAgICAgICAvKiBmcmVxdWVuY3kgY291bnQgKi8KKyAgICAgICAgdXNoICBjb2RlOyAgICAgICAvKiBiaXQgc3RyaW5nICovCisgICAgfSBmYzsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZGFkOyAgICAgICAgLyogZmF0aGVyIG5vZGUgaW4gSHVmZm1hbiB0cmVlICovCisgICAgICAgIHVzaCAgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KKyAgICB9IGRsOworfSBGQVIgY3RfZGF0YTsKKworI2RlZmluZSBGcmVxIGZjLmZyZXEKKyNkZWZpbmUgQ29kZSBmYy5jb2RlCisjZGVmaW5lIERhZCAgZGwuZGFkCisjZGVmaW5lIExlbiAgZGwubGVuCisKK3R5cGVkZWYgc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyAgc3RhdGljX3RyZWVfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgdHJlZV9kZXNjX3MgeworICAgIGN0X2RhdGEgKmR5bl90cmVlOyAgICAgICAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqLworICAgIGludCAgICAgbWF4X2NvZGU7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgc3RhdGljX3RyZWVfZGVzYyAqc3RhdF9kZXNjOyAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqLworfSBGQVIgdHJlZV9kZXNjOworCit0eXBlZGVmIHVzaCBQb3M7Cit0eXBlZGVmIFBvcyBGQVIgUG9zZjsKK3R5cGVkZWYgdW5zaWduZWQgSVBvczsKKworLyogQSBQb3MgaXMgYW4gaW5kZXggaW4gdGhlIGNoYXJhY3RlciB3aW5kb3cuIFdlIHVzZSBzaG9ydCBpbnN0ZWFkIG9mIGludCB0bworICogc2F2ZSBzcGFjZSBpbiB0aGUgdmFyaW91cyB0YWJsZXMuIElQb3MgaXMgdXNlZCBvbmx5IGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7CisgICAgel9zdHJlYW1wIHN0cm07ICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi8KKyAgICBpbnQgICBzdGF0dXM7ICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovCisgICAgQnl0ZWYgKnBlbmRpbmdfYnVmOyAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi8KKyAgICB1bGcgICBwZW5kaW5nX2J1Zl9zaXplOyAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovCisgICAgQnl0ZWYgKnBlbmRpbmdfb3V0OyAgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi8KKyAgICB1SW50ICAgcGVuZGluZzsgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi8KKyAgICBpbnQgICB3cmFwOyAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCisgICAgZ3pfaGVhZGVycCAgZ3poZWFkOyAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi8KKyAgICB1SW50ICAgZ3ppbmRleDsgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqLworICAgIEJ5dGUgIG1ldGhvZDsgICAgICAgIC8qIFNUT1JFRCAoZm9yIHppcCBvbmx5KSBvciBERUZMQVRFRCAqLworICAgIGludCAgIGxhc3RfZmx1c2g7ICAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KKworICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgZGVmbGF0ZS5jOiAqLworCisgICAgdUludCAgd19zaXplOyAgICAgICAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovCisgICAgdUludCAgd19iaXRzOyAgICAgICAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovCisgICAgdUludCAgd19tYXNrOyAgICAgICAgLyogd19zaXplIC0gMSAqLworCisgICAgQnl0ZWYgKndpbmRvdzsKKyAgICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdywKKyAgICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZQorICAgICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKKyAgICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXMKKyAgICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4gQWxzbywgaXQgbGltaXRzCisgICAgICogdGhlIHdpbmRvdyBzaXplIHRvIDY0Sywgd2hpY2ggaXMgcXVpdGUgdXNlZnVsIG9uIE1TRE9TLgorICAgICAqIFRvIGRvOiB1c2UgdGhlIHVzZXIgaW5wdXQgYnVmZmVyIGFzIHNsaWRpbmcgd2luZG93LgorICAgICAqLworCisgICAgdWxnIHdpbmRvd19zaXplOworICAgIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyCisgICAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy4KKyAgICAgKi8KKworICAgIFBvc2YgKnByZXY7CisgICAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKKyAgICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLgorICAgICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLgorICAgICAqLworCisgICAgUG9zZiAqaGVhZDsgLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi8KKworICAgIHVJbnQgIGluc19oOyAgICAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqLworICAgIHVJbnQgIGhhc2hfc2l6ZTsgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqLworICAgIHVJbnQgIGhhc2hfYml0czsgICAgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi8KKyAgICB1SW50ICBoYXNoX21hc2s7ICAgICAgLyogaGFzaF9zaXplLTEgKi8KKworICAgIHVJbnQgIGhhc2hfc2hpZnQ7CisgICAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXQKKyAgICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKKyAgICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczoKKyAgICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzCisgICAgICovCisKKyAgICBsb25nIGJsb2NrX3N0YXJ0OworICAgIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cworICAgICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuCisgICAgICovCisKKyAgICB1SW50IG1hdGNoX2xlbmd0aDsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovCisgICAgSVBvcyBwcmV2X21hdGNoOyAgICAgICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqLworICAgIGludCBtYXRjaF9hdmFpbGFibGU7ICAgICAgICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqLworICAgIHVJbnQgc3Ryc3RhcnQ7ICAgICAgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqLworICAgIHVJbnQgbWF0Y2hfc3RhcnQ7ICAgICAgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovCisgICAgdUludCBsb29rYWhlYWQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovCisKKyAgICB1SW50IHByZXZfbGVuZ3RoOworICAgIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpcworICAgICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLgorICAgICAqLworCisgICAgdUludCBtYXhfY2hhaW5fbGVuZ3RoOworICAgIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzCisgICAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZQorICAgICAqIHNwZWVkLgorICAgICAqLworCisgICAgdUludCBtYXhfbGF6eV9tYXRjaDsKKyAgICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5CisgICAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24KKyAgICAgKiBsZXZlbHMgPj0gNC4KKyAgICAgKi8KKyMgICBkZWZpbmUgbWF4X2luc2VydF9sZW5ndGggIG1heF9sYXp5X21hdGNoCisgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QKKyAgICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgICAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy4KKyAgICAgKi8KKworICAgIGludCBsZXZlbDsgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovCisgICAgaW50IHN0cmF0ZWd5OyAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovCisKKyAgICB1SW50IGdvb2RfbWF0Y2g7CisgICAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovCisKKyAgICBpbnQgbmljZV9tYXRjaDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqLworCisgICAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqLworICAgIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHJlc3MgY29tcGlsZXIgd2FybmluZyAqLworICAgIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi8KKworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBsX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqLworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBkX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgYmxfZGVzYzsgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi8KKworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KKyAgICBpbnQgaGVhcF9sZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKyAgICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCisgICAgICovCisKKyAgICB1Y2ggZGVwdGhbMipMX0NPREVTKzFdOworICAgIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kKKyAgICAgKi8KKworICAgIHVjaGYgKmxfYnVmOyAgICAgICAgICAvKiBidWZmZXIgZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi8KKworICAgIHVJbnQgIGxpdF9idWZzaXplOworICAgIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3IKKyAgICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6CisgICAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycworICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQKKyAgICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4KKyAgICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IKKyAgICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgICAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCisgICAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS4KKyAgICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuCisgICAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAorICAgICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yCisgICAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICAgICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZQorICAgICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmcKKyAgICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LgorICAgICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKKyAgICAgKi8KKworICAgIHVJbnQgbGFzdF9saXQ7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCisgICAgdXNoZiAqZF9idWY7CisgICAgLyogQnVmZmVyIGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZQorICAgICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnCisgICAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LgorICAgICAqLworCisgICAgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCisgICAgdWxnIHN0YXRpY19sZW47ICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KKyAgICB1SW50IG1hdGNoZXM7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovCisgICAgaW50IGxhc3RfZW9iX2xlbjsgICAvKiBiaXQgbGVuZ3RoIG9mIEVPQiBjb2RlIGZvciBsYXN0IGJsb2NrICovCisKKyNpZmRlZiBERUJVRworICAgIHVsZyBjb21wcmVzc2VkX2xlbjsgLyogdG90YWwgYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGZpbGUgbW9kIDJeMzIgKi8KKyAgICB1bGcgYml0c19zZW50OyAgICAgIC8qIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBkYXRhIHNlbnQgbW9kIDJeMzIgKi8KKyNlbmRpZgorCisgICAgdXNoIGJpX2J1ZjsKKyAgICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdAorICAgICAqIHNpZ25pZmljYW50IGJpdHMpLgorICAgICAqLworICAgIGludCBiaV92YWxpZDsKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXQKKyAgICAgKiBhcmUgYWx3YXlzIHplcm8uCisgICAgICovCisKK30gRkFSIGRlZmxhdGVfc3RhdGU7CisKKy8qIE91dHB1dCBhIGJ5dGUgb24gdGhlIHN0cmVhbS4KKyAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ19idWYuCisgKi8KKyNkZWZpbmUgcHV0X2J5dGUocywgYykge3MtPnBlbmRpbmdfYnVmW3MtPnBlbmRpbmcrK10gPSAoYyk7fQorCisKKyNkZWZpbmUgTUlOX0xPT0tBSEVBRCAoTUFYX01BVENIK01JTl9NQVRDSCsxKQorLyogTWluaW11bSBhbW91bnQgb2YgbG9va2FoZWFkLCBleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqIFNlZSBkZWZsYXRlLmMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBNSU5fTUFUQ0grMS4KKyAqLworCisjZGVmaW5lIE1BWF9ESVNUKHMpICAoKHMpLT53X3NpemUtTUlOX0xPT0tBSEVBRCkKKy8qIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBwYXJ0aWN1bGFybHkgb24gMTYgYml0IG1hY2hpbmVzLCBtYXRjaAorICogZGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIE1BWF9ESVNUIGluc3RlYWQgb2YgV1NJWkUuCisgKi8KKworICAgICAgICAvKiBpbiB0cmVlcy5jICovCit2b2lkIF90cl9pbml0ICAgICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2ludCAgX3RyX3RhbGx5ICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdW5zaWduZWQgZGlzdCwgdW5zaWduZWQgbGMpKTsKK3ZvaWQgX3RyX2ZsdXNoX2Jsb2NrICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlb2YpKTsKK3ZvaWQgX3RyX2FsaWduICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwordm9pZCBfdHJfc3RvcmVkX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLCB1bGcgc3RvcmVkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVvZikpOworCisjZGVmaW5lIGRfY29kZShkaXN0KSBcCisgICAoKGRpc3QpIDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2KygoZGlzdCk+PjcpXSkKKy8qIE1hcHBpbmcgZnJvbSBhIGRpc3RhbmNlIHRvIGEgZGlzdGFuY2UgY29kZS4gZGlzdCBpcyB0aGUgZGlzdGFuY2UgLSAxIGFuZAorICogbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuIF9kaXN0X2NvZGVbMjU2XSBhbmQgX2Rpc3RfY29kZVsyNTddIGFyZSBuZXZlcgorICogdXNlZC4KKyAqLworCisjaWZuZGVmIERFQlVHCisvKiBJbmxpbmUgdmVyc2lvbnMgb2YgX3RyX3RhbGx5IGZvciBzcGVlZDogKi8KKworI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCisgIGV4dGVybiB1Y2ggX2xlbmd0aF9jb2RlW107CisgIGV4dGVybiB1Y2ggX2Rpc3RfY29kZVtdOworI2Vsc2UKKyAgZXh0ZXJuIGNvbnN0IHVjaCBfbGVuZ3RoX2NvZGVbXTsKKyAgZXh0ZXJuIGNvbnN0IHVjaCBfZGlzdF9jb2RlW107CisjZW5kaWYKKworIyBkZWZpbmUgX3RyX3RhbGx5X2xpdChzLCBjLCBmbHVzaCkgXAorICB7IHVjaCBjYyA9IChjKTsgXAorICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9IDA7IFwKKyAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9IGNjOyBcCisgICAgcy0+ZHluX2x0cmVlW2NjXS5GcmVxKys7IFwKKyAgICBmbHVzaCA9IChzLT5sYXN0X2xpdCA9PSBzLT5saXRfYnVmc2l6ZS0xKTsgXAorICAgfQorIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKKyAgeyB1Y2ggbGVuID0gKGxlbmd0aCk7IFwKKyAgICB1c2ggZGlzdCA9IChkaXN0YW5jZSk7IFwKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSBkaXN0OyBcCisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBsZW47IFwKKyAgICBkaXN0LS07IFwKKyAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xlbl0rTElURVJBTFMrMV0uRnJlcSsrOyBcCisgICAgcy0+ZHluX2R0cmVlW2RfY29kZShkaXN0KV0uRnJlcSsrOyBcCisgICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKKyAgfQorI2Vsc2UKKyMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIGZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIGMpCisjIGRlZmluZSBfdHJfdGFsbHlfZGlzdChzLCBkaXN0YW5jZSwgbGVuZ3RoLCBmbHVzaCkgXAorICAgICAgICAgICAgICBmbHVzaCA9IF90cl90YWxseShzLCBkaXN0YW5jZSwgbGVuZ3RoKQorI2VuZGlmCisKKyNlbmRpZiAvKiBERUZMQVRFX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2d6aW8uYyBiL3Vzci9rbGliYy96bGliL2d6aW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE2ZWEzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvZ3ppby5jCkBAIC0wLDAgKzEsMTAyOSBAQAorLyogZ3ppby5jIC0tIElPIG9uIC5neiBmaWxlcworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqCisgKiBDb21waWxlIHRoaXMgZmlsZSB3aXRoIC1ETk9fR1pDT01QUkVTUyB0byBhdm9pZCB0aGUgY29tcHJlc3Npb24gY29kZS4KKyAqLworCisvKiBAKCMpICRJZDogZ3ppby5jLHYgMS4xIDIwMDUvMDIvMjcgMjM6MTU6MzkgaHBhIEV4cCAkICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAienV0aWwuaCIKKworI2lmZGVmIE5PX0RFRkxBVEUgICAgICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGVmaW5pdGlvbiAqLworIyAgZGVmaW5lIE5PX0daQ09NUFJFU1MKKyNlbmRpZgorCisjaWZuZGVmIE5PX0RVTU1ZX0RFQ0wKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCisjaWZuZGVmIFpfQlVGU0laRQorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgWl9CVUZTSVpFIDQwOTYgLyogbWluaW1pemUgbWVtb3J5IHVzYWdlIGZvciAxNi1iaXQgRE9TICovCisjICBlbHNlCisjICAgIGRlZmluZSBaX0JVRlNJWkUgMTYzODQKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgWl9QUklOVEZfQlVGU0laRQorIyAgZGVmaW5lIFpfUFJJTlRGX0JVRlNJWkUgNDA5NgorI2VuZGlmCisKKyNpZmRlZiBfX01WU19fCisjICBwcmFnbWEgbWFwIChmZG9wZW4gLCAiXDE3NFwxNzRGRE9QRU4iKQorICAgRklMRSAqZmRvcGVuKGludCwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKK2V4dGVybiB2b2lkcCAgbWFsbG9jIE9GKCh1SW50IHNpemUpKTsKK2V4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBBTExPQyhzaXplKSBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQorCitzdGF0aWMgaW50IGNvbnN0IGd6X21hZ2ljWzJdID0gezB4MWYsIDB4OGJ9OyAvKiBnemlwIG1hZ2ljIGhlYWRlciAqLworCisvKiBnemlwIGZsYWcgYnl0ZSAqLworI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMSAvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgYXNjaWkgdGV4dCAqLworI2RlZmluZSBIRUFEX0NSQyAgICAgMHgwMiAvKiBiaXQgMSBzZXQ6IGhlYWRlciBDUkMgcHJlc2VudCAqLworI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNCAvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDggLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLworI2RlZmluZSBDT01NRU5UICAgICAgMHgxMCAvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEUwIC8qIGJpdHMgNS4uNzogcmVzZXJ2ZWQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZ3pfc3RyZWFtIHsKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50ICAgICAgel9lcnI7ICAgLyogZXJyb3IgY29kZSBmb3IgbGFzdCBzdHJlYW0gb3BlcmF0aW9uICovCisgICAgaW50ICAgICAgel9lb2Y7ICAgLyogc2V0IGlmIGVuZCBvZiBpbnB1dCBmaWxlICovCisgICAgRklMRSAgICAgKmZpbGU7ICAgLyogLmd6IGZpbGUgKi8KKyAgICBCeXRlICAgICAqaW5idWY7ICAvKiBpbnB1dCBidWZmZXIgKi8KKyAgICBCeXRlICAgICAqb3V0YnVmOyAvKiBvdXRwdXQgYnVmZmVyICovCisgICAgdUxvbmcgICAgY3JjOyAgICAgLyogY3JjMzIgb2YgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICBjaGFyICAgICAqbXNnOyAgICAvKiBlcnJvciBtZXNzYWdlICovCisgICAgY2hhciAgICAgKnBhdGg7ICAgLyogcGF0aCBuYW1lIGZvciBkZWJ1Z2dpbmcgb25seSAqLworICAgIGludCAgICAgIHRyYW5zcGFyZW50OyAvKiAxIGlmIGlucHV0IGZpbGUgaXMgbm90IGEgLmd6IGZpbGUgKi8KKyAgICBjaGFyICAgICBtb2RlOyAgICAvKiAndycgb3IgJ3InICovCisgICAgel9vZmZfdCAgc3RhcnQ7ICAgLyogc3RhcnQgb2YgY29tcHJlc3NlZCBkYXRhIGluIGZpbGUgKGhlYWRlciBza2lwcGVkKSAqLworICAgIHpfb2ZmX3QgIGluOyAgICAgIC8qIGJ5dGVzIGludG8gZGVmbGF0ZSBvciBpbmZsYXRlICovCisgICAgel9vZmZfdCAgb3V0OyAgICAgLyogYnl0ZXMgb3V0IG9mIGRlZmxhdGUgb3IgaW5mbGF0ZSAqLworICAgIGludCAgICAgIGJhY2s7ICAgIC8qIG9uZSBjaGFyYWN0ZXIgcHVzaC1iYWNrICovCisgICAgaW50ICAgICAgbGFzdDsgICAgLyogdHJ1ZSBpZiBwdXNoLWJhY2sgaXMgbGFzdCBjaGFyYWN0ZXIgKi8KK30gZ3pfc3RyZWFtOworCisKK2xvY2FsIGd6RmlsZSBnel9vcGVuICAgICAgT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUsIGludCAgZmQpKTsKK2xvY2FsIGludCBkb19mbHVzaCAgICAgICAgT0YoKGd6RmlsZSBmaWxlLCBpbnQgZmx1c2gpKTsKK2xvY2FsIGludCAgICBnZXRfYnl0ZSAgICAgT0YoKGd6X3N0cmVhbSAqcykpOworbG9jYWwgdm9pZCAgIGNoZWNrX2hlYWRlciBPRigoZ3pfc3RyZWFtICpzKSk7Citsb2NhbCBpbnQgICAgZGVzdHJveSAgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKK2xvY2FsIHZvaWQgICBwdXRMb25nICAgICAgT0YoKEZJTEUgKmZpbGUsIHVMb25nIHgpKTsKK2xvY2FsIHVMb25nICBnZXRMb25nICAgICAgT0YoKGd6X3N0cmVhbSAqcykpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCisgICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKS4gVGhlIGZpbGUgaXMgZ2l2ZW4gZWl0aGVyIGJ5IGZpbGUgZGVzY3JpcHRvcgorICAgb3IgcGF0aCBuYW1lIChpZiBmZCA9PSAtMSkuCisgICAgIGd6X29wZW4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCisgICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGU7IGVycm5vCisgICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKKyAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLgorKi8KK2xvY2FsIGd6RmlsZSBnel9vcGVuIChwYXRoLCBtb2RlLCBmZCkKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7CisgICAgaW50ICBmZDsKK3sKKyAgICBpbnQgZXJyOworICAgIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsgLyogY29tcHJlc3Npb24gbGV2ZWwgKi8KKyAgICBpbnQgc3RyYXRlZ3kgPSBaX0RFRkFVTFRfU1RSQVRFR1k7IC8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5ICovCisgICAgY2hhciAqcCA9IChjaGFyKiltb2RlOworICAgIGd6X3N0cmVhbSAqczsKKyAgICBjaGFyIGZtb2RlWzgwXTsgLyogY29weSBvZiBtb2RlLCB3aXRob3V0IHRoZSBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIGNoYXIgKm0gPSBmbW9kZTsKKworICAgIGlmICghcGF0aCB8fCAhbW9kZSkgcmV0dXJuIFpfTlVMTDsKKworICAgIHMgPSAoZ3pfc3RyZWFtICopQUxMT0Moc2l6ZW9mKGd6X3N0cmVhbSkpOworICAgIGlmICghcykgcmV0dXJuIFpfTlVMTDsKKworICAgIHMtPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIHMtPnN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBzLT5zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWYgPSBaX05VTEw7CisgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmID0gWl9OVUxMOworICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IHMtPnN0cmVhbS5hdmFpbF9vdXQgPSAwOworICAgIHMtPmZpbGUgPSBOVUxMOworICAgIHMtPnpfZXJyID0gWl9PSzsKKyAgICBzLT56X2VvZiA9IDA7CisgICAgcy0+aW4gPSAwOworICAgIHMtPm91dCA9IDA7CisgICAgcy0+YmFjayA9IEVPRjsKKyAgICBzLT5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICBzLT5tc2cgPSBOVUxMOworICAgIHMtPnRyYW5zcGFyZW50ID0gMDsKKworICAgIHMtPnBhdGggPSAoY2hhciopQUxMT0Moc3RybGVuKHBhdGgpKzEpOworICAgIGlmIChzLT5wYXRoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworICAgIH0KKyAgICBzdHJjcHkocy0+cGF0aCwgcGF0aCk7IC8qIGRvIHRoaXMgZWFybHkgZm9yIGRlYnVnZ2luZyAqLworCisgICAgcy0+bW9kZSA9ICdcMCc7CisgICAgZG8geworICAgICAgICBpZiAoKnAgPT0gJ3InKSBzLT5tb2RlID0gJ3InOworICAgICAgICBpZiAoKnAgPT0gJ3cnIHx8ICpwID09ICdhJykgcy0+bW9kZSA9ICd3JzsKKyAgICAgICAgaWYgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpIHsKKyAgICAgICAgICAgIGxldmVsID0gKnAgLSAnMCc7CisgICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJ2YnKSB7CisgICAgICAgICAgc3RyYXRlZ3kgPSBaX0ZJTFRFUkVEOworICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdoJykgeworICAgICAgICAgIHN0cmF0ZWd5ID0gWl9IVUZGTUFOX09OTFk7CisgICAgICAgIH0gZWxzZSBpZiAoKnAgPT0gJ1InKSB7CisgICAgICAgICAgc3RyYXRlZ3kgPSBaX1JMRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICptKysgPSAqcDsgLyogY29weSB0aGUgbW9kZSAqLworICAgICAgICB9CisgICAgfSB3aGlsZSAoKnArKyAmJiBtICE9IGZtb2RlICsgc2l6ZW9mKGZtb2RlKSk7CisgICAgaWYgKHMtPm1vZGUgPT0gJ1wwJykgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworCisgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisjaWZkZWYgTk9fR1pDT01QUkVTUworICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIGVyciA9IGRlZmxhdGVJbml0MigmKHMtPnN0cmVhbSksIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZMQVRFRCwgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgc3RyYXRlZ3kpOworICAgICAgICAvKiB3aW5kb3dCaXRzIGlzIHBhc3NlZCA8IDAgdG8gc3VwcHJlc3MgemxpYiBoZWFkZXIgKi8KKworICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKKyNlbmRpZgorICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+b3V0YnVmID09IFpfTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gID0gcy0+aW5idWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKKworICAgICAgICBlcnIgPSBpbmZsYXRlSW5pdDIoJihzLT5zdHJlYW0pLCAtTUFYX1dCSVRTKTsKKyAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHRlbGwgdGhhdCB0aGVyZSBpcyBubyB6bGliIGhlYWRlci4KKyAgICAgICAgICogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpbmZsYXRlICpyZXF1aXJlcyogYW4gZXh0cmEgImR1bW15IiBieXRlCisgICAgICAgICAqIGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbSBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIGFuZAorICAgICAgICAgKiByZXR1cm4gWl9TVFJFQU1fRU5ELiBIZXJlIHRoZSBnemlwIENSQzMyIGVuc3VyZXMgdGhhdCA0IGJ5dGVzIGFyZQorICAgICAgICAgKiBwcmVzZW50IGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChlcnIgIT0gWl9PSyB8fCBzLT5pbmJ1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOworCisgICAgZXJybm8gPSAwOworICAgIHMtPmZpbGUgPSBmZCA8IDAgPyBGX09QRU4ocGF0aCwgZm1vZGUpIDogKEZJTEUqKWZkb3BlbihmZCwgZm1vZGUpOworCisgICAgaWYgKHMtPmZpbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7CisgICAgfQorICAgIGlmIChzLT5tb2RlID09ICd3JykgeworICAgICAgICAvKiBXcml0ZSBhIHZlcnkgc2ltcGxlIC5neiBoZWFkZXI6CisgICAgICAgICAqLworICAgICAgICBmcHJpbnRmKHMtPmZpbGUsICIlYyVjJWMlYyVjJWMlYyVjJWMlYyIsIGd6X21hZ2ljWzBdLCBnel9tYWdpY1sxXSwKKyAgICAgICAgICAgICBaX0RFRkxBVEVELCAwIC8qZmxhZ3MqLywgMCwwLDAsMCAvKnRpbWUqLywgMCAvKnhmbGFncyovLCBPU19DT0RFKTsKKyAgICAgICAgcy0+c3RhcnQgPSAxMEw7CisgICAgICAgIC8qIFdlIHVzZSAxMEwgaW5zdGVhZCBvZiBmdGVsbChzLT5maWxlKSB0byBiZWNhdXNlIGZ0ZWxsIGNhdXNlcyBhbgorICAgICAgICAgKiBmZmx1c2ggb24gc29tZSBzeXN0ZW1zLiBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lc24ndCB1c2UKKyAgICAgICAgICogc3RhcnQgYW55d2F5IGluIHdyaXRlIG1vZGUsIHNvIHRoaXMgaW5pdGlhbGl6YXRpb24gaXMgbm90CisgICAgICAgICAqIG5lY2Vzc2FyeS4KKyAgICAgICAgICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hlY2tfaGVhZGVyKHMpOyAvKiBza2lwIHRoZSAuZ3ogaGVhZGVyICovCisgICAgICAgIHMtPnN0YXJ0ID0gZnRlbGwocy0+ZmlsZSkgLSBzLT5zdHJlYW0uYXZhaWxfaW47CisgICAgfQorCisgICAgcmV0dXJuIChnekZpbGUpczsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCisqLworZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuIChwYXRoLCBtb2RlKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbiAocGF0aCwgbW9kZSwgLTEpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgQXNzb2NpYXRlIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gZmQgaXMgbm90IGR1cCdlZCBoZXJlCisgICB0byBtaW1pYyB0aGUgYmVoYXZpbyh1KXIgb2YgZmRvcGVuLgorKi8KK2d6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gKGZkLCBtb2RlKQorICAgIGludCBmZDsKKyAgICBjb25zdCBjaGFyICptb2RlOworeworICAgIGNoYXIgbmFtZVs0Nl07ICAgICAgLyogYWxsb3cgZm9yIHVwIHRvIDEyOC1iaXQgaW50ZWdlcnMgKi8KKworICAgIGlmIChmZCA8IDApIHJldHVybiAoZ3pGaWxlKVpfTlVMTDsKKyAgICBzcHJpbnRmKG5hbWUsICI8ZmQ6JWQ+IiwgZmQpOyAvKiBmb3IgZGVidWdnaW5nICovCisKKyAgICByZXR1cm4gZ3pfb3BlbiAobmFtZSwgbW9kZSwgZmQpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5CisgKi8KK2ludCBaRVhQT1JUIGd6c2V0cGFyYW1zIChmaWxlLCBsZXZlbCwgc3RyYXRlZ3kpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGxldmVsOworICAgIGludCBzdHJhdGVneTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogTWFrZSByb29tIHRvIGFsbG93IGZsdXNoaW5nICovCisgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworCisgICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKKyAgICAgICAgaWYgKGZ3cml0ZShzLT5vdXRidWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSkgIT0gWl9CVUZTSVpFKSB7CisgICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87CisgICAgICAgIH0KKyAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVmbGF0ZVBhcmFtcyAoJihzLT5zdHJlYW0pLCBsZXZlbCwgc3RyYXRlZ3kpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmVhZCBhIGJ5dGUgZnJvbSBhIGd6X3N0cmVhbTsgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luLiBSZXR1cm4gRU9GCisgICBmb3IgZW5kIG9mIGZpbGUuCisgICBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gcyBoYXMgYmVlbiBzdWNlc3NmdWxseSBvcGVuZWQgZm9yIHJlYWRpbmcuCisqLworbG9jYWwgaW50IGdldF9ieXRlKHMpCisgICAgZ3pfc3RyZWFtICpzOworeworICAgIGlmIChzLT56X2VvZikgcmV0dXJuIEVPRjsKKyAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDApIHsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludClmcmVhZChzLT5pbmJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKTsKKyAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICBzLT56X2VvZiA9IDE7CisJICAgIC8qIGtsaWJjIGhhY2sgKi8KKyAgICAgICAgICAgIGlmIChlcnJubykgcy0+el9lcnIgPSBaX0VSUk5POworICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgfQorICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworICAgIH0KKyAgICBzLT5zdHJlYW0uYXZhaWxfaW4tLTsKKyAgICByZXR1cm4gKihzLT5zdHJlYW0ubmV4dF9pbikrKzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBDaGVjayB0aGUgZ3ppcCBoZWFkZXIgb2YgYSBnel9zdHJlYW0gb3BlbmVkIGZvciByZWFkaW5nLiBTZXQgdGhlIHN0cmVhbQorICAgIG1vZGUgdG8gdHJhbnNwYXJlbnQgaWYgdGhlIGd6aXAgbWFnaWMgaGVhZGVyIGlzIG5vdCBwcmVzZW50OyBzZXQgcy0+ZXJyCisgICAgdG8gWl9EQVRBX0VSUk9SIGlmIHRoZSBtYWdpYyBoZWFkZXIgaXMgcHJlc2VudCBidXQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlcgorICAgIGlzIGluY29ycmVjdC4KKyAgICBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gcyBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgc3VjZXNzZnVsbHk7CisgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luIGlzIHplcm8gZm9yIHRoZSBmaXJzdCB0aW1lLCBidXQgbWF5IGJlIG5vbi16ZXJvCisgICAgICAgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMuCisqLworbG9jYWwgdm9pZCBjaGVja19oZWFkZXIocykKKyAgICBnel9zdHJlYW0gKnM7Cit7CisgICAgaW50IG1ldGhvZDsgLyogbWV0aG9kIGJ5dGUgKi8KKyAgICBpbnQgZmxhZ3M7ICAvKiBmbGFncyBieXRlICovCisgICAgdUludCBsZW47CisgICAgaW50IGM7CisKKyAgICAvKiBBc3N1cmUgdHdvIGJ5dGVzIGluIHRoZSBidWZmZXIgc28gd2UgY2FuIHBlZWsgYWhlYWQgLS0gaGFuZGxlIGNhc2UKKyAgICAgICB3aGVyZSBmaXJzdCBieXRlIG9mIGhlYWRlciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYWZ0ZXIgdGhlIGxhc3QKKyAgICAgICBnemlwIHNlZ21lbnQgKi8KKyAgICBsZW4gPSBzLT5zdHJlYW0uYXZhaWxfaW47CisgICAgaWYgKGxlbiA8IDIpIHsKKyAgICAgICAgaWYgKGxlbikgcy0+aW5idWZbMF0gPSBzLT5zdHJlYW0ubmV4dF9pblswXTsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBsZW4gPSAodUludClmcmVhZChzLT5pbmJ1ZiArIGxlbiwgMSwgWl9CVUZTSVpFID4+IGxlbiwgcy0+ZmlsZSk7CisJLyoga2xpYmMgaGFjayAqLworICAgICAgICBpZiAobGVuID09IDAgJiYgZXJybm8pIHMtPnpfZXJyID0gWl9FUlJOTzsKKyAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luICs9IGxlbjsKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKyAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA8IDIpIHsKKyAgICAgICAgICAgIHMtPnRyYW5zcGFyZW50ID0gcy0+c3RyZWFtLmF2YWlsX2luOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUGVlayBhaGVhZCB0byBjaGVjayB0aGUgZ3ppcCBtYWdpYyBoZWFkZXIgKi8KKyAgICBpZiAocy0+c3RyZWFtLm5leHRfaW5bMF0gIT0gZ3pfbWFnaWNbMF0gfHwKKyAgICAgICAgcy0+c3RyZWFtLm5leHRfaW5bMV0gIT0gZ3pfbWFnaWNbMV0pIHsKKyAgICAgICAgcy0+dHJhbnNwYXJlbnQgPSAxOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHMtPnN0cmVhbS5hdmFpbF9pbiAtPSAyOworICAgIHMtPnN0cmVhbS5uZXh0X2luICs9IDI7CisKKyAgICAvKiBDaGVjayB0aGUgcmVzdCBvZiB0aGUgZ3ppcCBoZWFkZXIgKi8KKyAgICBtZXRob2QgPSBnZXRfYnl0ZShzKTsKKyAgICBmbGFncyA9IGdldF9ieXRlKHMpOworICAgIGlmIChtZXRob2QgIT0gWl9ERUZMQVRFRCB8fCAoZmxhZ3MgJiBSRVNFUlZFRCkgIT0gMCkgeworICAgICAgICBzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIERpc2NhcmQgdGltZSwgeGZsYWdzIGFuZCBPUyBjb2RlOiAqLworICAgIGZvciAobGVuID0gMDsgbGVuIDwgNjsgbGVuKyspICh2b2lkKWdldF9ieXRlKHMpOworCisgICAgaWYgKChmbGFncyAmIEVYVFJBX0ZJRUxEKSAhPSAwKSB7IC8qIHNraXAgdGhlIGV4dHJhIGZpZWxkICovCisgICAgICAgIGxlbiAgPSAgKHVJbnQpZ2V0X2J5dGUocyk7CisgICAgICAgIGxlbiArPSAoKHVJbnQpZ2V0X2J5dGUocykpPDw4OworICAgICAgICAvKiBsZW4gaXMgZ2FyYmFnZSBpZiBFT0YgYnV0IHRoZSBsb29wIGJlbG93IHdpbGwgcXVpdCBhbnl3YXkgKi8KKyAgICAgICAgd2hpbGUgKGxlbi0tICE9IDAgJiYgZ2V0X2J5dGUocykgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBPUklHX05BTUUpICE9IDApIHsgLyogc2tpcCB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lICovCisgICAgICAgIHdoaWxlICgoYyA9IGdldF9ieXRlKHMpKSAhPSAwICYmIGMgIT0gRU9GKSA7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBDT01NRU5UKSAhPSAwKSB7ICAgLyogc2tpcCB0aGUgLmd6IGZpbGUgY29tbWVudCAqLworICAgICAgICB3aGlsZSAoKGMgPSBnZXRfYnl0ZShzKSkgIT0gMCAmJiBjICE9IEVPRikgOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgSEVBRF9DUkMpICE9IDApIHsgIC8qIHNraXAgdGhlIGhlYWRlciBjcmMgKi8KKyAgICAgICAgZm9yIChsZW4gPSAwOyBsZW4gPCAyOyBsZW4rKykgKHZvaWQpZ2V0X2J5dGUocyk7CisgICAgfQorICAgIHMtPnpfZXJyID0gcy0+el9lb2YgPyBaX0RBVEFfRVJST1IgOiBaX09LOworfQorCisgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDbGVhbnVwIHRoZW4gZnJlZSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBSZXR1cm4gYSB6bGliIGVycm9yIGNvZGUuCisgICBUcnkgZnJlZWluZyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9ucy4KKyAqLworbG9jYWwgaW50IGRlc3Ryb3kgKHMpCisgICAgZ3pfc3RyZWFtICpzOworeworICAgIGludCBlcnIgPSBaX09LOworCisgICAgaWYgKCFzKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBUUllGUkVFKHMtPm1zZyk7CisKKyAgICBpZiAocy0+c3RyZWFtLnN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisjaWZkZWYgTk9fR1pDT01QUkVTUworICAgICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICAgICAgZXJyID0gZGVmbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOworI2VuZGlmCisgICAgICAgIH0gZWxzZSBpZiAocy0+bW9kZSA9PSAncicpIHsKKyAgICAgICAgICAgIGVyciA9IGluZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+ZmlsZSAhPSBOVUxMICYmIGZjbG9zZShzLT5maWxlKSkgeworI2lmZGVmIEVTUElQRQorICAgICAgICBpZiAoZXJybm8gIT0gRVNQSVBFKSAvKiBmY2xvc2UgaXMgYnJva2VuIGZvciBwaXBlcyBpbiBIUC9VWCAqLworI2VuZGlmCisgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgIH0KKyAgICBpZiAocy0+el9lcnIgPCAwKSBlcnIgPSBzLT56X2VycjsKKworICAgIFRSWUZSRUUocy0+aW5idWYpOworICAgIFRSWUZSRUUocy0+b3V0YnVmKTsKKyAgICBUUllGUkVFKHMtPnBhdGgpOworICAgIFRSWUZSRUUocyk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6cmVhZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IgZW5kIG9mIGZpbGUpLgorKi8KK2ludCBaRVhQT1JUIGd6cmVhZCAoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdm9pZHAgYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworICAgIEJ5dGVmICpzdGFydCA9IChCeXRlZiopYnVmOyAvKiBzdGFydGluZyBwb2ludCBmb3IgY3JjIGNvbXB1dGF0aW9uICovCisgICAgQnl0ZSAgKm5leHRfb3V0OyAvKiA9PSBzdHJlYW0ubmV4dF9vdXQgYnV0IG5vdCBmb3JjZWQgZmFyIChmb3IgTVNET1MpICovCisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBpZiAocy0+el9lcnIgPT0gWl9EQVRBX0VSUk9SIHx8IHMtPnpfZXJyID09IFpfRVJSTk8pIHJldHVybiAtMTsKKyAgICBpZiAocy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKSByZXR1cm4gMDsgIC8qIEVPRiAqLworCisgICAgbmV4dF9vdXQgPSAoQnl0ZSopYnVmOworICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IChCeXRlZiopYnVmOworICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBsZW47CisKKyAgICBpZiAocy0+c3RyZWFtLmF2YWlsX291dCAmJiBzLT5iYWNrICE9IEVPRikgeworICAgICAgICAqbmV4dF9vdXQrKyA9IHMtPmJhY2s7CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCsrOworICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0LS07CisgICAgICAgIHMtPmJhY2sgPSBFT0Y7CisgICAgICAgIHMtPm91dCsrOworICAgICAgICBzdGFydCsrOworICAgICAgICBpZiAocy0+bGFzdCkgeworICAgICAgICAgICAgcy0+el9lcnIgPSBaX1NUUkVBTV9FTkQ7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDApIHsKKworICAgICAgICBpZiAocy0+dHJhbnNwYXJlbnQpIHsKKyAgICAgICAgICAgIC8qIENvcHkgZmlyc3QgdGhlIGxvb2thaGVhZCBieXRlczogKi8KKyAgICAgICAgICAgIHVJbnQgbiA9IHMtPnN0cmVhbS5hdmFpbF9pbjsKKyAgICAgICAgICAgIGlmIChuID4gcy0+c3RyZWFtLmF2YWlsX291dCkgbiA9IHMtPnN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgICAgICB6bWVtY3B5KHMtPnN0cmVhbS5uZXh0X291dCwgcy0+c3RyZWFtLm5leHRfaW4sIG4pOworICAgICAgICAgICAgICAgIG5leHRfb3V0ICs9IG47CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gbmV4dF9vdXQ7CisgICAgICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gICArPSBuOworICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgLT0gbjsKKyAgICAgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gIC09IG47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX291dCA+IDApIHsKKyAgICAgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0IC09CisgICAgICAgICAgICAgICAgICAgICh1SW50KWZyZWFkKG5leHRfb3V0LCAxLCBzLT5zdHJlYW0uYXZhaWxfb3V0LCBzLT5maWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICAgICAgcy0+aW4gICs9IGxlbjsKKyAgICAgICAgICAgIHMtPm91dCArPSBsZW47CisgICAgICAgICAgICBpZiAobGVuID09IDApIHMtPnpfZW9mID0gMTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KWxlbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDAgJiYgIXMtPnpfZW9mKSB7CisKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWZyZWFkKHMtPmluYnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpOworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+el9lb2YgPSAxOworICAgICAgICAgICAgICAgIGlmIChlcnJubykgeworICAgICAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CisgICAgICAgIH0KKyAgICAgICAgcy0+aW4gKz0gcy0+c3RyZWFtLmF2YWlsX2luOworICAgICAgICBzLT5vdXQgKz0gcy0+c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgcy0+el9lcnIgPSBpbmZsYXRlKCYocy0+c3RyZWFtKSwgWl9OT19GTFVTSCk7CisgICAgICAgIHMtPmluIC09IHMtPnN0cmVhbS5hdmFpbF9pbjsKKyAgICAgICAgcy0+b3V0IC09IHMtPnN0cmVhbS5hdmFpbF9vdXQ7CisKKyAgICAgICAgaWYgKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgLyogQ2hlY2sgQ1JDIGFuZCBvcmlnaW5hbCBzaXplICovCisgICAgICAgICAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIHN0YXJ0LCAodUludCkocy0+c3RyZWFtLm5leHRfb3V0IC0gc3RhcnQpKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gcy0+c3RyZWFtLm5leHRfb3V0OworCisgICAgICAgICAgICBpZiAoZ2V0TG9uZyhzKSAhPSBzLT5jcmMpIHsKKyAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpZ2V0TG9uZyhzKTsKKyAgICAgICAgICAgICAgICAvKiBUaGUgdW5jb21wcmVzc2VkIGxlbmd0aCByZXR1cm5lZCBieSBhYm92ZSBnZXRsb25nKCkgbWF5IGJlCisgICAgICAgICAgICAgICAgICogZGlmZmVyZW50IGZyb20gcy0+b3V0IGluIGNhc2Ugb2YgY29uY2F0ZW5hdGVkIC5neiBmaWxlcy4KKyAgICAgICAgICAgICAgICAgKiBDaGVjayBmb3Igc3VjaCBmaWxlczoKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjaGVja19oZWFkZXIocyk7CisgICAgICAgICAgICAgICAgaWYgKHMtPnpfZXJyID09IFpfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZVJlc2V0KCYocy0+c3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSyB8fCBzLT56X2VvZikgYnJlYWs7CisgICAgfQorICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgc3RhcnQsICh1SW50KShzLT5zdHJlYW0ubmV4dF9vdXQgLSBzdGFydCkpOworCisgICAgaWYgKGxlbiA9PSBzLT5zdHJlYW0uYXZhaWxfb3V0ICYmCisgICAgICAgIChzLT56X2VyciA9PSBaX0RBVEFfRVJST1IgfHwgcy0+el9lcnIgPT0gWl9FUlJOTykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKGludCkobGVuIC0gcy0+c3RyZWFtLmF2YWlsX291dCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBSZWFkcyBvbmUgYnl0ZSBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZQorICAgb3IgLTEgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4KKyovCitpbnQgWkVYUE9SVCBnemdldGMoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisKKyAgICByZXR1cm4gZ3pyZWFkKGZpbGUsICZjLCAxKSA9PSAxID8gYyA6IC0xOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgUHVzaCBvbmUgYnl0ZSBiYWNrIG9udG8gdGhlIHN0cmVhbS4KKyovCitpbnQgWkVYUE9SVCBnenVuZ2V0YyhjLCBmaWxlKQorICAgIGludCBjOworICAgIGd6RmlsZSBmaWxlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InIHx8IGMgPT0gRU9GIHx8IHMtPmJhY2sgIT0gRU9GKSByZXR1cm4gRU9GOworICAgIHMtPmJhY2sgPSBjOworICAgIHMtPm91dC0tOworICAgIHMtPmxhc3QgPSAocy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKTsKKyAgICBpZiAocy0+bGFzdCkgcy0+el9lcnIgPSBaX09LOworICAgIHMtPnpfZW9mID0gMDsKKyAgICByZXR1cm4gYzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZQorICAgcmVhZCwgb3IgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuCisgICBlbmQtb2YtZmlsZSBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZAorICAgd2l0aCBhIG51bGwgY2hhcmFjdGVyLgorICAgICAgZ3pnZXRzIHJldHVybnMgYnVmLCBvciBaX05VTEwgaW4gY2FzZSBvZiBlcnJvci4KKworICAgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90IG9wdGltaXplZCBhdCBhbGwuCisqLworY2hhciAqIFpFWFBPUlQgZ3pnZXRzKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworeworICAgIGNoYXIgKmIgPSBidWY7CisgICAgaWYgKGJ1ZiA9PSBaX05VTEwgfHwgbGVuIDw9IDApIHJldHVybiBaX05VTEw7CisKKyAgICB3aGlsZSAoLS1sZW4gPiAwICYmIGd6cmVhZChmaWxlLCBidWYsIDEpID09IDEgJiYgKmJ1ZisrICE9ICdcbicpIDsKKyAgICAqYnVmID0gJ1wwJzsKKyAgICByZXR1cm4gYiA9PSBidWYgJiYgbGVuID4gMCA/IFpfTlVMTCA6IGI7Cit9CisKKworI2lmbmRlZiBOT19HWkNPTVBSRVNTCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworaW50IFpFWFBPUlQgZ3p3cml0ZSAoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdm9pZHBjIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHMtPnN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilidWY7CisgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gbGVuOworCisgICAgd2hpbGUgKHMtPnN0cmVhbS5hdmFpbF9pbiAhPSAwKSB7CisKKyAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworCisgICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWY7CisgICAgICAgICAgICBpZiAoZndyaXRlKHMtPm91dGJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKSAhPSBaX0JVRlNJWkUpIHsKKyAgICAgICAgICAgICAgICBzLT56X2VyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOworICAgICAgICB9CisgICAgICAgIHMtPmluICs9IHMtPnN0cmVhbS5hdmFpbF9pbjsKKyAgICAgICAgcy0+b3V0ICs9IHMtPnN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgIHMtPnpfZXJyID0gZGVmbGF0ZSgmKHMtPnN0cmVhbSksIFpfTk9fRkxVU0gpOworICAgICAgICBzLT5pbiAtPSBzLT5zdHJlYW0uYXZhaWxfaW47CisgICAgICAgIHMtPm91dCAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSykgYnJlYWs7CisgICAgfQorICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgKGNvbnN0IEJ5dGVmICopYnVmLCBsZW4pOworCisgICAgcmV0dXJuIChpbnQpKGxlbiAtIHMtPnN0cmVhbS5hdmFpbF9pbik7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKKyAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworI2lmZGVmIFNUREMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworaW50IFpFWFBPUlRWQSBnenByaW50ZiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLyogYXJncyAqLyAuLi4pCit7CisgICAgY2hhciBidWZbWl9QUklOVEZfQlVGU0laRV07CisgICAgdmFfbGlzdCB2YTsKKyAgICBpbnQgbGVuOworCisgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworI2lmZGVmIE5PX3ZzbnByaW50ZgorIyAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKKyAgICAodm9pZCl2c3ByaW50ZihidWYsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplb2YoYnVmKTsgbGVuKyspCisgICAgICAgIGlmIChidWZbbGVuXSA9PSAwKSBicmVhazsKKyMgIGVsc2UKKyAgICBsZW4gPSB2c3ByaW50ZihidWYsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisjICBlbmRpZgorI2Vsc2UKKyMgIGlmZGVmIEhBU192c25wcmludGZfdm9pZAorICAgICh2b2lkKXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIGxlbiA9IHN0cmxlbihidWYpOworIyAgZWxzZQorICAgIGxlbiA9IHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworIyAgZW5kaWYKKyNlbmRpZgorICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gKGludClzaXplb2YoYnVmKSB8fCBidWZbc2l6ZW9mKGJ1ZikgLSAxXSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCBidWYsICh1bnNpZ25lZClsZW4pOworfQorI2Vsc2UgLyogbm90IEFOU0kgQyAqLworCitpbnQgWkVYUE9SVFZBIGd6cHJpbnRmIChmaWxlLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICBpbnQgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAorICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjA7Cit7CisgICAgY2hhciBidWZbWl9QUklOVEZfQlVGU0laRV07CisgICAgaW50IGxlbjsKKworICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKKyNpZmRlZiBOT19zbnByaW50ZgorIyAgaWZkZWYgSEFTX3NwcmludGZfdm9pZAorICAgIHNwcmludGYoYnVmLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKyAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplb2YoYnVmKTsgbGVuKyspCisgICAgICAgIGlmIChidWZbbGVuXSA9PSAwKSBicmVhazsKKyMgIGVsc2UKKyAgICBsZW4gPSBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCisgICAgICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyMgIGVuZGlmCisjZWxzZQorIyAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKyAgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworICAgIGxlbiA9IHN0cmxlbihidWYpOworIyAgZWxzZQorICAgIGxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorICAgICAgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworIyAgZW5kaWYKKyNlbmRpZgorICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gc2l6ZW9mKGJ1ZikgfHwgYnVmW3NpemVvZihidWYpIC0gMV0gIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgYnVmLCBsZW4pOworfQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICBnenB1dGMgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyovCitpbnQgWkVYUE9SVCBnenB1dGMoZmlsZSwgYykKKyAgICBnekZpbGUgZmlsZTsKKyAgICBpbnQgYzsKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGNjID0gKHVuc2lnbmVkIGNoYXIpIGM7IC8qIHJlcXVpcmVkIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKi8KKworICAgIHJldHVybiBnendyaXRlKGZpbGUsICZjYywgMSkgPT0gMSA/IChpbnQpY2MgOiAtMTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKKyAgIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KKyAgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KK2ludCBaRVhQT1JUIGd6cHV0cyhmaWxlLCBzKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNvbnN0IGNoYXIgKnM7Cit7CisgICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgKGNoYXIqKXMsICh1bnNpZ25lZClzdHJsZW4ocykpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKKyAgIGZsdXNoIGlzIGFzIGluIHRoZSBkZWZsYXRlKCkgZnVuY3Rpb24uCisqLworbG9jYWwgaW50IGRvX2ZsdXNoIChmaWxlLCBmbHVzaCkKKyAgICBnekZpbGUgZmlsZTsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgdUludCBsZW47CisgICAgaW50IGRvbmUgPSAwOworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3cnKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAwOyAvKiBzaG91bGQgYmUgemVybyBhbHJlYWR5IGFueXdheSAqLworCisgICAgZm9yICg7OykgeworICAgICAgICBsZW4gPSBaX0JVRlNJWkUgLSBzLT5zdHJlYW0uYXZhaWxfb3V0OworCisgICAgICAgIGlmIChsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKCh1SW50KWZ3cml0ZShzLT5vdXRidWYsIDEsIGxlbiwgcy0+ZmlsZSkgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICAgIHJldHVybiBaX0VSUk5POworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmOworICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9uZSkgYnJlYWs7CisgICAgICAgIHMtPm91dCArPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworICAgICAgICBzLT56X2VyciA9IGRlZmxhdGUoJihzLT5zdHJlYW0pLCBmbHVzaCk7CisgICAgICAgIHMtPm91dCAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OworCisgICAgICAgIC8qIElnbm9yZSB0aGUgc2Vjb25kIG9mIHR3byBjb25zZWN1dGl2ZSBmbHVzaGVzOiAqLworICAgICAgICBpZiAobGVuID09IDAgJiYgcy0+el9lcnIgPT0gWl9CVUZfRVJST1IpIHMtPnpfZXJyID0gWl9PSzsKKworICAgICAgICAvKiBkZWZsYXRlIGhhcyBmaW5pc2hlZCBmbHVzaGluZyBvbmx5IHdoZW4gaXQgaGFzbid0IHVzZWQgdXAKKyAgICAgICAgICogYWxsIHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXI6CisgICAgICAgICAqLworICAgICAgICBkb25lID0gKHMtPnN0cmVhbS5hdmFpbF9vdXQgIT0gMCB8fCBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpOworCisgICAgICAgIGlmIChzLT56X2VyciAhPSBaX09LICYmIHMtPnpfZXJyICE9IFpfU1RSRUFNX0VORCkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IHMtPnpfZXJyOworfQorCitpbnQgWkVYUE9SVCBnemZsdXNoIChmaWxlLCBmbHVzaCkKKyAgICAgZ3pGaWxlIGZpbGU7CisgICAgIGludCBmbHVzaDsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworICAgIGludCBlcnIgPSBkb19mbHVzaCAoZmlsZSwgZmx1c2gpOworCisgICAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAgICBmZmx1c2gocy0+ZmlsZSk7CisgICAgcmV0dXJuICBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQgPyBaX09LIDogcy0+el9lcnI7Cit9CisjZW5kaWYgLyogTk9fR1pDT01QUkVTUyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFNldHMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgICAgZ3pzZWVrIHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQorICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgIFNFRUtfRU5EIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJucyBlcnJvci4KKyAgICAgIEluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgZ3pzZWVrIGNhbiBiZSBleHRyZW1lbHkgc2xvdy4KKyovCit6X29mZl90IFpFWFBPUlQgZ3pzZWVrIChmaWxlLCBvZmZzZXQsIHdoZW5jZSkKKyAgICBnekZpbGUgZmlsZTsKKyAgICB6X29mZl90IG9mZnNldDsKKyAgICBpbnQgd2hlbmNlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHdoZW5jZSA9PSBTRUVLX0VORCB8fAorICAgICAgICBzLT56X2VyciA9PSBaX0VSUk5PIHx8IHMtPnpfZXJyID09IFpfREFUQV9FUlJPUikgeworICAgICAgICByZXR1cm4gLTFMOworICAgIH0KKworICAgIGlmIChzLT5tb2RlID09ICd3JykgeworI2lmZGVmIE5PX0daQ09NUFJFU1MKKyAgICAgICAgcmV0dXJuIC0xTDsKKyNlbHNlCisgICAgICAgIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSBzLT5pbjsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0IDwgMCkgcmV0dXJuIC0xTDsKKworICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvZmZzZXQgaXMgdGhlIG51bWJlciBvZiB6ZXJvIGJ5dGVzIHRvIHdyaXRlLiAqLworICAgICAgICBpZiAocy0+aW5idWYgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICBzLT5pbmJ1ZiA9IChCeXRlKilBTExPQyhaX0JVRlNJWkUpOyAvKiBmb3Igc2Vla2luZyAqLworICAgICAgICAgICAgaWYgKHMtPmluYnVmID09IFpfTlVMTCkgcmV0dXJuIC0xTDsKKyAgICAgICAgICAgIHptZW16ZXJvKHMtPmluYnVmLCBaX0JVRlNJWkUpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChvZmZzZXQgPiAwKSAgeworICAgICAgICAgICAgdUludCBzaXplID0gWl9CVUZTSVpFOworICAgICAgICAgICAgaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9ICh1SW50KW9mZnNldDsKKworICAgICAgICAgICAgc2l6ZSA9IGd6d3JpdGUoZmlsZSwgcy0+aW5idWYsIHNpemUpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIC0xTDsKKworICAgICAgICAgICAgb2Zmc2V0IC09IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHMtPmluOworI2VuZGlmCisgICAgfQorICAgIC8qIFJlc3Qgb2YgZnVuY3Rpb24gaXMgZm9yIHJlYWRpbmcgb25seSAqLworCisgICAgLyogY29tcHV0ZSBhYnNvbHV0ZSBwb3NpdGlvbiAqLworICAgIGlmICh3aGVuY2UgPT0gU0VFS19DVVIpIHsKKyAgICAgICAgb2Zmc2V0ICs9IHMtPm91dDsKKyAgICB9CisgICAgaWYgKG9mZnNldCA8IDApIHJldHVybiAtMUw7CisKKyAgICBpZiAocy0+dHJhbnNwYXJlbnQpIHsKKyAgICAgICAgLyogbWFwIHRvIGZzZWVrICovCisgICAgICAgIHMtPmJhY2sgPSBFT0Y7CisgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CisgICAgICAgIGlmIChmc2VlayhzLT5maWxlLCBvZmZzZXQsIFNFRUtfU0VUKSA8IDApIHJldHVybiAtMUw7CisKKyAgICAgICAgcy0+aW4gPSBzLT5vdXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorCisgICAgLyogRm9yIGEgbmVnYXRpdmUgc2VlaywgcmV3aW5kIGFuZCB1c2UgcG9zaXRpdmUgc2VlayAqLworICAgIGlmIChvZmZzZXQgPj0gcy0+b3V0KSB7CisgICAgICAgIG9mZnNldCAtPSBzLT5vdXQ7CisgICAgfSBlbHNlIGlmIChnenJld2luZChmaWxlKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xTDsKKyAgICB9CisgICAgLyogb2Zmc2V0IGlzIG5vdyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICovCisKKyAgICBpZiAob2Zmc2V0ICE9IDAgJiYgcy0+b3V0YnVmID09IFpfTlVMTCkgeworICAgICAgICBzLT5vdXRidWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsKKyAgICAgICAgaWYgKHMtPm91dGJ1ZiA9PSBaX05VTEwpIHJldHVybiAtMUw7CisgICAgfQorICAgIGlmIChvZmZzZXQgJiYgcy0+YmFjayAhPSBFT0YpIHsKKyAgICAgICAgcy0+YmFjayA9IEVPRjsKKyAgICAgICAgcy0+b3V0Kys7CisgICAgICAgIG9mZnNldC0tOworICAgICAgICBpZiAocy0+bGFzdCkgcy0+el9lcnIgPSBaX1NUUkVBTV9FTkQ7CisgICAgfQorICAgIHdoaWxlIChvZmZzZXQgPiAwKSAgeworICAgICAgICBpbnQgc2l6ZSA9IFpfQlVGU0laRTsKKyAgICAgICAgaWYgKG9mZnNldCA8IFpfQlVGU0laRSkgc2l6ZSA9IChpbnQpb2Zmc2V0OworCisgICAgICAgIHNpemUgPSBnenJlYWQoZmlsZSwgcy0+b3V0YnVmLCAodUludClzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPD0gMCkgcmV0dXJuIC0xTDsKKyAgICAgICAgb2Zmc2V0IC09IHNpemU7CisgICAgfQorICAgIHJldHVybiBzLT5vdXQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXdpbmRzIGlucHV0IGZpbGUuCisqLworaW50IFpFWFBPUlQgZ3pyZXdpbmQgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiAtMTsKKworICAgIHMtPnpfZXJyID0gWl9PSzsKKyAgICBzLT56X2VvZiA9IDA7CisgICAgcy0+YmFjayA9IEVPRjsKKyAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgIHMtPnN0cmVhbS5uZXh0X2luID0gcy0+aW5idWY7CisgICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgaWYgKCFzLT50cmFuc3BhcmVudCkgKHZvaWQpaW5mbGF0ZVJlc2V0KCZzLT5zdHJlYW0pOworICAgIHMtPmluID0gMDsKKyAgICBzLT5vdXQgPSAwOworICAgIHJldHVybiBmc2VlayhzLT5maWxlLCBzLT5zdGFydCwgU0VFS19TRVQpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCisqLworel9vZmZfdCBaRVhQT1JUIGd6dGVsbCAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICByZXR1cm4gZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX0NVUik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXR1cm5zIDEgd2hlbiBFT0YgaGFzIHByZXZpb3VzbHkgYmVlbiBkZXRlY3RlZCByZWFkaW5nIHRoZSBnaXZlbgorICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KKyovCitpbnQgWkVYUE9SVCBnemVvZiAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOworCisgICAgLyogV2l0aCBjb25jYXRlbmF0ZWQgY29tcHJlc3NlZCBmaWxlcyB0aGF0IGNhbiBoYXZlIGVtYmVkZGVkCisgICAgICogY3JjIHRyYWlsZXJzLCB6X2VvZiBpcyBubyBsb25nZXIgdGhlIG9ubHkvYmVzdCBpbmRpY2F0b3Igb2YgRU9GCisgICAgICogb24gYSBnel9zdHJlYW0uIEhhbmRsZSBlbmQtb2Ytc3RyZWFtIGVycm9yIGV4cGxpY2l0bHkgaGVyZS4KKyAgICAgKi8KKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gMDsKKyAgICBpZiAocy0+el9lb2YpIHJldHVybiAxOworICAgIHJldHVybiBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXR1cm5zIDEgaWYgcmVhZGluZyBhbmQgZG9pbmcgc28gdHJhbnNwYXJlbnRseSwgb3RoZXJ3aXNlIHplcm8uCisqLworaW50IFpFWFBPUlQgZ3pkaXJlY3QgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiAwOworICAgIHJldHVybiBzLT50cmFuc3BhcmVudDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBPdXRwdXRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgdG8gdGhlIGdpdmVuIGZpbGUKKyovCitsb2NhbCB2b2lkIHB1dExvbmcgKGZpbGUsIHgpCisgICAgRklMRSAqZmlsZTsKKyAgICB1TG9uZyB4OworeworICAgIGludCBuOworICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKKyAgICAgICAgZnB1dGMoKGludCkoeCAmIDB4ZmYpLCBmaWxlKTsKKyAgICAgICAgeCA+Pj0gODsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgUmVhZHMgYSBsb25nIGluIExTQiBvcmRlciBmcm9tIHRoZSBnaXZlbiBnel9zdHJlYW0uIFNldHMgel9lcnIgaW4gY2FzZQorICAgb2YgZXJyb3IuCisqLworbG9jYWwgdUxvbmcgZ2V0TG9uZyAocykKKyAgICBnel9zdHJlYW0gKnM7Cit7CisgICAgdUxvbmcgeCA9ICh1TG9uZylnZXRfYnl0ZShzKTsKKyAgICBpbnQgYzsKKworICAgIHggKz0gKCh1TG9uZylnZXRfYnl0ZShzKSk8PDg7CisgICAgeCArPSAoKHVMb25nKWdldF9ieXRlKHMpKTw8MTY7CisgICAgYyA9IGdldF9ieXRlKHMpOworICAgIGlmIChjID09IEVPRikgcy0+el9lcnIgPSBaX0RBVEFfRVJST1I7CisgICAgeCArPSAoKHVMb25nKWMpPDwyNDsKKyAgICByZXR1cm4geDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4KKyovCitpbnQgWkVYUE9SVCBnemNsb3NlIChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyNpZmRlZiBOT19HWkNPTVBSRVNTCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIGlmIChkb19mbHVzaCAoZmlsZSwgWl9GSU5JU0gpICE9IFpfT0spCisgICAgICAgICAgICByZXR1cm4gZGVzdHJveSgoZ3pfc3RyZWFtKilmaWxlKTsKKworICAgICAgICBwdXRMb25nIChzLT5maWxlLCBzLT5jcmMpOworICAgICAgICBwdXRMb25nIChzLT5maWxlLCAodUxvbmcpKHMtPmluICYgMHhmZmZmZmZmZikpOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBkZXN0cm95KChnel9zdHJlYW0qKWZpbGUpOworfQorCisjaWZkZWYgU1REQworIyAgZGVmaW5lIHpzdHJlcnJvcihlcnJudW0pIHN0cmVycm9yKGVycm51bSkKKyNlbHNlCisjICBkZWZpbmUgenN0cmVycm9yKGVycm51bSkgIiIKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGxhc3QgZXJyb3Igd2hpY2ggb2NjdXJyZWQgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCisgICBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCisgICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisqLworY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciAoZmlsZSwgZXJybnVtKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCAqZXJybnVtOworeworICAgIGNoYXIgKm07CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgKmVycm51bSA9IFpfU1RSRUFNX0VSUk9SOworICAgICAgICByZXR1cm4gKGNvbnN0IGNoYXIqKUVSUl9NU0coWl9TVFJFQU1fRVJST1IpOworICAgIH0KKyAgICAqZXJybnVtID0gcy0+el9lcnI7CisgICAgaWYgKCplcnJudW0gPT0gWl9PSykgcmV0dXJuIChjb25zdCBjaGFyKikiIjsKKworICAgIG0gPSAoY2hhciopKCplcnJudW0gPT0gWl9FUlJOTyA/IHpzdHJlcnJvcihlcnJubykgOiBzLT5zdHJlYW0ubXNnKTsKKworICAgIGlmIChtID09IE5VTEwgfHwgKm0gPT0gJ1wwJykgbSA9IChjaGFyKilFUlJfTVNHKHMtPnpfZXJyKTsKKworICAgIFRSWUZSRUUocy0+bXNnKTsKKyAgICBzLT5tc2cgPSAoY2hhciopQUxMT0Moc3RybGVuKHMtPnBhdGgpICsgc3RybGVuKG0pICsgMyk7CisgICAgaWYgKHMtPm1zZyA9PSBaX05VTEwpIHJldHVybiAoY29uc3QgY2hhciopRVJSX01TRyhaX01FTV9FUlJPUik7CisgICAgc3RyY3B5KHMtPm1zZywgcy0+cGF0aCk7CisgICAgc3RyY2F0KHMtPm1zZywgIjogIik7CisgICAgc3RyY2F0KHMtPm1zZywgbSk7CisgICAgcmV0dXJuIChjb25zdCBjaGFyKilzLT5tc2c7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBDbGVhciB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzLCBhbmQgZG8gdGhlIHNhbWUgZm9yIHRoZSByZWFsIGZpbGUuCisqLwordm9pZCBaRVhQT1JUIGd6Y2xlYXJlcnIgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwpIHJldHVybjsKKyAgICBpZiAocy0+el9lcnIgIT0gWl9TVFJFQU1fRU5EKSBzLT56X2VyciA9IFpfT0s7CisgICAgcy0+el9lb2YgPSAwOworICAgIC8qIGtsaWJjIGhhY2sgKi8KKyAgICAvKiBjbGVhcmVycihzLT5maWxlKTsgKi8KK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZmJhY2suYyBiL3Vzci9rbGliYy96bGliL2luZmJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTVkYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvaW5mYmFjay5jCkBAIC0wLDAgKzEsNjIzIEBACisvKiBpbmZiYWNrLmMgLS0gaW5mbGF0ZSB1c2luZyBhIGNhbGwtYmFjayBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICAgVGhpcyBjb2RlIGlzIGxhcmdlbHkgY29waWVkIGZyb20gaW5mbGF0ZS5jLiAgTm9ybWFsbHkgZWl0aGVyIGluZmJhY2subyBvcgorICAgaW5mbGF0ZS5vIHdvdWxkIGJlIGxpbmtlZCBpbnRvIGFuIGFwcGxpY2F0aW9uLS1ub3QgYm90aC4gIFRoZSBpbnRlcmZhY2UKKyAgIHdpdGggaW5mZmFzdC5jIGlzIHJldGFpbmVkIHNvIHRoYXQgb3B0aW1pemVkIGFzc2VtYmxlci1jb2RlZCB2ZXJzaW9ucyBvZgorICAgaW5mbGF0ZV9mYXN0KCkgY2FuIGJlIHVzZWQgd2l0aCBlaXRoZXIgaW5mbGF0ZS5jIG9yIGluZmJhY2suYy4KKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK2xvY2FsIHZvaWQgZml4ZWR0YWJsZXMgT0YoKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGUpKTsKKworLyoKKyAgIHN0cm0gcHJvdmlkZXMgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGluIHphbGxvYyBhbmQgemZyZWUsIG9yCisgICBaX05VTEwgdG8gdXNlIHRoZSBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgd2luZG93Qml0cyBpcyBpbiB0aGUgcmFuZ2UgOC4uMTUsIGFuZCB3aW5kb3cgaXMgYSB1c2VyLXN1cHBsaWVkCisgICB3aW5kb3cgYW5kIG91dHB1dCBidWZmZXIgdGhhdCBpcyAyKip3aW5kb3dCaXRzIGJ5dGVzLgorICovCitpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfKHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2ludCB3aW5kb3dCaXRzOwordW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAorICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgd2luZG93ID09IFpfTlVMTCB8fAorICAgICAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLworICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgeworICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOworICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHN0cm0tPnpmcmVlID0gemNmcmVlOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKVpBTExPQyhzdHJtLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopc3RhdGU7CisgICAgc3RhdGUtPmRtYXggPSAzMjc2OFU7CisgICAgc3RhdGUtPndiaXRzID0gd2luZG93Qml0czsKKyAgICBzdGF0ZS0+d3NpemUgPSAxVSA8PCB3aW5kb3dCaXRzOworICAgIHN0YXRlLT53aW5kb3cgPSB3aW5kb3c7CisgICAgc3RhdGUtPndyaXRlID0gMDsKKyAgICBzdGF0ZS0+d2hhdmUgPSAwOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bworICAgZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgorICAgSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQorICAgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZAorICAgdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KKyAgIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpbgorICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KKyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyhzdGF0ZSkKK3N0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Cit7CisjaWZkZWYgQlVJTERGSVhFRAorICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKKyAgICBzdGF0aWMgY29kZSAqbGVuZml4LCAqZGlzdGZpeDsKKyAgICBzdGF0aWMgY29kZSBmaXhlZFs1NDRdOworCisgICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KKyAgICBpZiAodmlyZ2luKSB7CisgICAgICAgIHVuc2lnbmVkIHN5bSwgYml0czsKKyAgICAgICAgc3RhdGljIGNvZGUgKm5leHQ7CisKKyAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUtPmxlbnNbc3ltKytdID0gOTsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgc3RhdGUtPmxlbnNbc3ltKytdID0gNzsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKKyAgICAgICAgbmV4dCA9IGZpeGVkOworICAgICAgICBsZW5maXggPSBuZXh0OworICAgICAgICBiaXRzID0gOTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KKyAgICAgICAgc3ltID0gMDsKKyAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA1OworICAgICAgICBkaXN0Zml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDU7CisgICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zLCAzMiwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCisgICAgICAgIHZpcmdpbiA9IDA7CisgICAgfQorI2Vsc2UgLyogIUJVSUxERklYRUQgKi8KKyMgICBpbmNsdWRlICJpbmZmaXhlZC5oIgorI2VuZGlmIC8qIEJVSUxERklYRUQgKi8KKyAgICBzdGF0ZS0+bGVuY29kZSA9IGxlbmZpeDsKKyAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgc3RhdGUtPmRpc3Rjb2RlID0gZGlzdGZpeDsKKyAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA1OworfQorCisvKiBNYWNyb3MgZm9yIGluZmxhdGVCYWNrKCk6ICovCisKKy8qIExvYWQgcmV0dXJuZWQgc3RhdGUgZnJvbSBpbmZsYXRlX2Zhc3QoKSAqLworI2RlZmluZSBMT0FEKCkgXAorICAgIGRvIHsgXAorICAgICAgICBwdXQgPSBzdHJtLT5uZXh0X291dDsgXAorICAgICAgICBsZWZ0ID0gc3RybS0+YXZhaWxfb3V0OyBcCisgICAgICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOyBcCisgICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9pbjsgXAorICAgICAgICBob2xkID0gc3RhdGUtPmhvbGQ7IFwKKyAgICAgICAgYml0cyA9IHN0YXRlLT5iaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogU2V0IHN0YXRlIGZyb20gcmVnaXN0ZXJzIGZvciBpbmZsYXRlX2Zhc3QoKSAqLworI2RlZmluZSBSRVNUT1JFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBzdHJtLT5uZXh0X291dCA9IHB1dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZWZ0OyBcCisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsgXAorICAgICAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7IFwKKyAgICAgICAgc3RhdGUtPmJpdHMgPSBiaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBJTklUQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA9IDA7IFwKKyAgICAgICAgYml0cyA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZS4gIElmIGlucHV0IGlzIHJlcXVlc3RlZCwgYnV0IGRlbmllZCwKKyAgIHRoZW4gcmV0dXJuIGEgWl9CVUZfRVJST1IgZnJvbSBpbmZsYXRlQmFjaygpLiAqLworI2RlZmluZSBQVUxMKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKKyAgICAgICAgICAgIGhhdmUgPSBpbihpbl9kZXNjLCAmbmV4dCk7IFwKKyAgICAgICAgICAgIGlmIChoYXZlID09IDApIHsgXAorICAgICAgICAgICAgICAgIG5leHQgPSBaX05VTEw7IFwKKyAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAorICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkKKyAgIHdpdGggYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLworI2RlZmluZSBQVUxMQllURSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgUFVMTCgpOyBcCisgICAgICAgIGhhdmUtLTsgXAorICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCisgICAgICAgIGJpdHMgKz0gODsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCisgICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aAorICAgYW4gZXJyb3IuICovCisjZGVmaW5lIE5FRURCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCisgICAgICAgICAgICBQVUxMQllURSgpOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPCAxNikgKi8KKyNkZWZpbmUgQklUUyhuKSBcCisgICAgKCh1bnNpZ25lZClob2xkICYgKCgxVSA8PCAobikpIC0gMSkpCisKKy8qIFJlbW92ZSBuIGJpdHMgZnJvbSB0aGUgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIERST1BCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gKG4pOyBcCisgICAgICAgIGJpdHMgLT0gKHVuc2lnbmVkKShuKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlbW92ZSB6ZXJvIHRvIHNldmVuIGJpdHMgYXMgbmVlZGVkIHRvIGdvIHRvIGEgYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZSBCWVRFQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gYml0cyAmIDc7IFwKKyAgICAgICAgYml0cyAtPSBiaXRzICYgNzsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHNvbWUgb3V0cHV0IHNwYWNlIGlzIGF2YWlsYWJsZSwgYnkgd3JpdGluZyBvdXQgdGhlIHdpbmRvdworICAgaWYgaXQncyBmdWxsLiAgSWYgdGhlIHdyaXRlIGZhaWxzLCByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGggYQorICAgWl9CVUZfRVJST1IuICovCisjZGVmaW5lIFJPT00oKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChsZWZ0ID09IDApIHsgXAorICAgICAgICAgICAgcHV0ID0gc3RhdGUtPndpbmRvdzsgXAorICAgICAgICAgICAgbGVmdCA9IHN0YXRlLT53c2l6ZTsgXAorICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gbGVmdDsgXAorICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgcHV0LCBsZWZ0KSkgeyBcCisgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKKyAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qCisgICBzdHJtIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgYW5kIHdpbmRvdyBidWZmZXIgb24gaW5wdXQsCisgICBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHVudXNlZCBpbnB1dCBvbiByZXR1cm4uICBGb3IgWl9EQVRBX0VSUk9SCisgICByZXR1cm5zLCBzdHJtIHdpbGwgYWxzbyBwcm92aWRlIGFuIGVycm9yIG1lc3NhZ2UuCisKKyAgIGluKCkgYW5kIG91dCgpIGFyZSB0aGUgY2FsbC1iYWNrIGlucHV0IGFuZCBvdXRwdXQgZnVuY3Rpb25zLiAgV2hlbgorICAgaW5mbGF0ZUJhY2soKSBuZWVkcyBtb3JlIGlucHV0LCBpdCBjYWxscyBpbigpLiAgV2hlbiBpbmZsYXRlQmFjaygpIGhhcworICAgZmlsbGVkIHRoZSB3aW5kb3cgd2l0aCBvdXRwdXQsIG9yIHdoZW4gaXQgY29tcGxldGVzIHdpdGggZGF0YSBpbiB0aGUKKyAgIHdpbmRvdywgaXQgY2FsbHMgb3V0KCkgdG8gd3JpdGUgb3V0IHRoZSBkYXRhLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90CisgICBjaGFuZ2UgdGhlIHByb3ZpZGVkIGlucHV0IHVudGlsIGluKCkgaXMgY2FsbGVkIGFnYWluIG9yIGluZmxhdGVCYWNrKCkKKyAgIHJldHVybnMuICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QgY2hhbmdlIHRoZSB3aW5kb3cvb3V0cHV0IGJ1ZmZlciB1bnRpbAorICAgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgorCisgICBpbigpIGFuZCBvdXQoKSBhcmUgY2FsbGVkIHdpdGggYSBkZXNjcmlwdG9yIHBhcmFtZXRlciBwcm92aWRlZCBpbiB0aGUKKyAgIGluZmxhdGVCYWNrKCkgY2FsbC4gIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHN0cnVjdHVyZSB0aGF0IHByb3ZpZGVzIHRoZQorICAgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gZG8gdGhlIHJlYWQgb3Igd3JpdGUsIGFzIHdlbGwgYXMgYWNjdW11bGF0ZWQKKyAgIGluZm9ybWF0aW9uIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN1Y2ggYXMgdG90YWxzIGFuZCBjaGVjayB2YWx1ZXMuCisKKyAgIGluKCkgc2hvdWxkIHJldHVybiB6ZXJvIG9uIGZhaWx1cmUuICBvdXQoKSBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIG9uCisgICBmYWlsdXJlLiAgSWYgZWl0aGVyIGluKCkgb3Igb3V0KCkgZmFpbHMsIHRoYW4gaW5mbGF0ZUJhY2soKSByZXR1cm5zIGEKKyAgIFpfQlVGX0VSUk9SLiAgc3RybS0+bmV4dF9pbiBjYW4gYmUgY2hlY2tlZCBmb3IgWl9OVUxMIHRvIHNlZSB3aGV0aGVyIGl0CisgICB3YXMgaW4oKSBvciBvdXQoKSB0aGF0IGNhdXNlZCBpbiB0aGUgZXJyb3IuICBPdGhlcndpc2UsICBpbmZsYXRlQmFjaygpCisgICByZXR1cm5zIFpfU1RSRUFNX0VORCBvbiBzdWNjZXNzLCBaX0RBVEFfRVJST1IgZm9yIGFuIGRlZmxhdGUgZm9ybWF0CisgICBlcnJvciwgb3IgWl9NRU1fRVJST1IgaWYgaXQgY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHN0YXRlLgorICAgaW5mbGF0ZUJhY2soKSBjYW4gYWxzbyByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgIGFyZSBub3QgY29ycmVjdCwgaS5lLiBzdHJtIGlzIFpfTlVMTCBvciB0aGUgc3RhdGUgd2FzIG5vdCBpbml0aWFsaXplZC4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2soc3RybSwgaW4sIGluX2Rlc2MsIG91dCwgb3V0X2Rlc2MpCit6X3N0cmVhbXAgc3RybTsKK2luX2Z1bmMgaW47Cit2b2lkIEZBUiAqaW5fZGVzYzsKK291dF9mdW5jIG91dDsKK3ZvaWQgRkFSICpvdXRfZGVzYzsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KKyAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqLworICAgIGNvZGUgbGFzdDsgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqLworICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RybSBleGlzdHMgYW5kIHRoYXQgdGhlIHN0YXRlIHdhcyBpbml0aWFsaXplZCAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgc3RhdGUtPmxhc3QgPSAwOworICAgIHN0YXRlLT53aGF2ZSA9IDA7CisgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47CisgICAgaGF2ZSA9IG5leHQgIT0gWl9OVUxMID8gc3RybS0+YXZhaWxfaW4gOiAwOworICAgIGhvbGQgPSAwOworICAgIGJpdHMgPSAwOworICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7CisgICAgbGVmdCA9IHN0YXRlLT53c2l6ZTsKKworICAgIC8qIEluZmxhdGUgdW50aWwgZW5kIG9mIGJsb2NrIG1hcmtlZCBhcyBsYXN0ICovCisgICAgZm9yICg7OykKKyAgICAgICAgc3dpdGNoIChzdGF0ZS0+bW9kZSkgeworICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgYW5kIGRpc3BhdGNoIGJsb2NrIHR5cGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7CisgICAgICAgICAgICBEUk9QQklUUygxKTsKKyAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLworICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOyAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVE9SRUQ6CisgICAgICAgICAgICAvKiBnZXQgYW5kIHZlcmlmeSBzdG9yZWQgYmxvY2sgbGVuZ3RoICovCisgICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgc3RvcmVkIGJsb2NrIGZyb20gaW5wdXQgdG8gb3V0cHV0ICovCisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgUFVMTCgpOworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOworICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgIC8qIGdldCBkeW5hbWljIHRhYmxlIGVudHJpZXMgZGVzY3JpcHRvciAqLworICAgICAgICAgICAgTkVFREJJVFMoMTQpOworICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOworCisgICAgICAgICAgICAvKiBnZXQgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIChub3QgYSB0eXBvKSAqLworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDc7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xuIikpOworCisgICAgICAgICAgICAvKiBnZXQgbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gdGhpcy52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlIC0gMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YWwgPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOworCisgICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAqLworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCBzdGF0ZS0+bmxlbiwgJihzdGF0ZS0+bmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Y29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICAvKiB1c2UgaW5mbGF0ZV9mYXN0KCkgaWYgd2UgaGF2ZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCAqLworICAgICAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkgeworICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemUgLSBsZWZ0OworICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBzdGF0ZS0+d3NpemUpOworICAgICAgICAgICAgICAgIExPQUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZ2V0IGEgbGl0ZXJhbCwgbGVuZ3RoLCBvciBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMub3AgJiYgKHRoaXMub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IHRoaXM7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyB0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpdGhpcy52YWw7CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgbGl0ZXJhbCAqLworICAgICAgICAgICAgaWYgKHRoaXMub3AgPT0gMCkgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdGhpcy52YWwgPj0gMHgyMCAmJiB0aGlzLnZhbCA8IDB4N2YgPworICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCB0aGlzLnZhbCkpOworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcm9jZXNzIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgaWYgKHRoaXMub3AgJiAzMikgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBsZW5ndGggY29kZSAtLSBnZXQgZXh0cmEgYml0cywgaWYgYW55ICovCisgICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKHRoaXMub3ApICYgMTU7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgc3RhdGUtPmxlbmd0aCkpOworCisgICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+ZGlzdGNvZGVbQklUUyhzdGF0ZS0+ZGlzdGJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHRoaXMub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IHRoaXM7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5vZmZzZXQgPSAodW5zaWduZWQpdGhpcy52YWw7CisKKyAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBleHRyYSBiaXRzLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkodGhpcy5vcCkgJiAxNTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPndzaXplIC0gKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IDogMCkpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBzdGF0ZS0+b2Zmc2V0KSk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgbWF0Y2ggZnJvbSB3aW5kb3cgdG8gb3V0cHV0ICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+d3NpemUgLSBzdGF0ZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgIGlmIChjb3B5IDwgbGVmdCkgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0ICsgY29weTsKKyAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQgLSBjb3B5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7CisgICAgICAgICAgICB9IHdoaWxlIChzdGF0ZS0+bGVuZ3RoICE9IDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBET05FOgorICAgICAgICAgICAgLyogaW5mbGF0ZSBzdHJlYW0gdGVybWluYXRlZCBwcm9wZXJseSAtLSB3cml0ZSBsZWZ0b3ZlciBvdXRwdXQgKi8KKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGlmIChsZWZ0IDwgc3RhdGUtPndzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgc3RhdGUtPndpbmRvdywgc3RhdGUtPndzaXplIC0gbGVmdCkpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisKKyAgICAgICAgY2FzZSBCQUQ6CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBjYW4ndCBoYXBwZW4sIGJ1dCBtYWtlcyBjb21waWxlcnMgaGFwcHkgKi8KKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VSUk9SOworICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisgICAgICAgIH0KKworICAgIC8qIFJldHVybiB1bnVzZWQgaW5wdXQgKi8KKyAgaW5mX2xlYXZlOgorICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OworICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7CisgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKKyAgICByZXR1cm4gWl9PSzsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZmZhc3QuYyBiL3Vzci9rbGliYy96bGliL2luZmZhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmVlOTJlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvaW5mZmFzdC5jCkBAIC0wLDAgKzEsMzE4IEBACisvKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisjaW5jbHVkZSAiaW5mbGF0ZS5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKKworI2lmbmRlZiBBU01JTkYKKworLyogQWxsb3cgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW1pemF0aW9uIGZvciBwb3N0LWluY3JlbWVudCBvciBwcmUtaW5jcmVtZW50LgorICAgQmFzZWQgb24gdGVzdGluZyB0byBkYXRlLAorICAgUHJlLWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgorICAgLSBQb3dlclBDIEczIChBZGxlcikKKyAgIC0gTUlQUyBSNTAwMCAoUmFuZGVycy1QZWhyc29uKQorICAgUG9zdC1pbmNyZW1lbnQgcHJlZmVycmVkIGZvcjoKKyAgIC0gbm9uZQorICAgTm8gbWVhc3VyYWJsZSBkaWZmZXJlbmNlOgorICAgLSBQZW50aXVtIElJSSAoQW5kZXJzb24pCisgICAtIE02ODA2MCAoTmlrbCkKKyAqLworI2lmZGVmIFBPU1RJTkMKKyMgIGRlZmluZSBPRkYgMAorIyAgZGVmaW5lIFBVUChhKSAqKGEpKysKKyNlbHNlCisjICBkZWZpbmUgT0ZGIDEKKyMgIGRlZmluZSBQVVAoYSkgKisrKGEpCisjZW5kaWYKKworLyoKKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKKyAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcworICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKKyAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKKyAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgorCisgICBFbnRyeSBhc3N1bXB0aW9uczoKKworICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPj0gNgorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4CisgICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dAorICAgICAgICBzdGF0ZS0+Yml0cyA8IDgKKworICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6CisKKyAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0CisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCisgICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCisKKyAgIE5vdGVzOgorCisgICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAorICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KKyAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KKworICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCisgICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCisgICAgICBvdXRwdXQgc3BhY2UuCisgKi8KK3ZvaWQgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KQorel9zdHJlYW1wIHN0cm07Cit1bnNpZ25lZCBzdGFydDsgICAgICAgICAvKiBpbmZsYXRlKCkncyBzdGFydGluZyB2YWx1ZSBmb3Igc3RybS0+YXZhaWxfb3V0ICovCit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9pbiAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpsYXN0OyAgICAvKiB3aGlsZSBpbiA8IGxhc3QsIGVub3VnaCBpbnB1dCBhdmFpbGFibGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqb3V0OyAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLT5uZXh0X291dCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICplbmQ7ICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi8KKyNpZmRlZiBJTkZMQVRFX1NUUklDVAorICAgIHVuc2lnbmVkIGRtYXg7ICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi8KKyNlbmRpZgorICAgIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3aGF2ZTsgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdyaXRlOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGxvY2FsIHN0cm0tPmhvbGQgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS0+Yml0cyAqLworICAgIGNvZGUgY29uc3QgRkFSICpsY29kZTsgICAgICAvKiBsb2NhbCBzdHJtLT5sZW5jb2RlICovCisgICAgY29kZSBjb25zdCBGQVIgKmRjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmRpc3Rjb2RlICovCisgICAgdW5zaWduZWQgbG1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqLworICAgIHVuc2lnbmVkIGRtYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqLworICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBvcDsgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovCisgICAgdW5zaWduZWQgZGlzdDsgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmZyb207ICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqLworCisgICAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpbiA9IHN0cm0tPm5leHRfaW4gLSBPRkY7CisgICAgbGFzdCA9IGluICsgKHN0cm0tPmF2YWlsX2luIC0gNSk7CisgICAgb3V0ID0gc3RybS0+bmV4dF9vdXQgLSBPRkY7CisgICAgYmVnID0gb3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsKKyAgICBlbmQgPSBvdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gMjU3KTsKKyNpZmRlZiBJTkZMQVRFX1NUUklDVAorICAgIGRtYXggPSBzdGF0ZS0+ZG1heDsKKyNlbmRpZgorICAgIHdzaXplID0gc3RhdGUtPndzaXplOworICAgIHdoYXZlID0gc3RhdGUtPndoYXZlOworICAgIHdyaXRlID0gc3RhdGUtPndyaXRlOworICAgIHdpbmRvdyA9IHN0YXRlLT53aW5kb3c7CisgICAgaG9sZCA9IHN0YXRlLT5ob2xkOworICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsKKyAgICBsY29kZSA9IHN0YXRlLT5sZW5jb2RlOworICAgIGRjb2RlID0gc3RhdGUtPmRpc3Rjb2RlOworICAgIGxtYXNrID0gKDFVIDw8IHN0YXRlLT5sZW5iaXRzKSAtIDE7CisgICAgZG1hc2sgPSAoMVUgPDwgc3RhdGUtPmRpc3RiaXRzKSAtIDE7CisKKyAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2gKKyAgICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqLworICAgIGRvIHsKKyAgICAgICAgaWYgKGJpdHMgPCAxNSkgeworICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza107CisgICAgICBkb2xlbjoKKyAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMuYml0cyk7CisgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICBiaXRzIC09IG9wOworICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5vcCk7CisgICAgICAgIGlmIChvcCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHRoaXMudmFsID49IDB4MjAgJiYgdGhpcy52YWwgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKKyAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHRoaXMudmFsKSk7CisgICAgICAgICAgICBQVVAob3V0KSA9ICh1bnNpZ25lZCBjaGFyKSh0aGlzLnZhbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovCisgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKHRoaXMudmFsKTsKKyAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovCisgICAgICAgICAgICBpZiAob3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuICs9ICh1bnNpZ25lZClob2xkICYgKCgxVSA8PCBvcCkgLSAxKTsKKyAgICAgICAgICAgICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgICAgICAgICBiaXRzIC09IG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcbiIsIGxlbikpOworICAgICAgICAgICAgaWYgKGJpdHMgPCAxNSkgeworICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcyA9IGRjb2RlW2hvbGQgJiBkbWFza107CisgICAgICAgICAgZG9kaXN0OgorICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMuYml0cyk7CisgICAgICAgICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5vcCk7CisgICAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovCisgICAgICAgICAgICAgICAgZGlzdCA9ICh1bnNpZ25lZCkodGhpcy52YWwpOworICAgICAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXN0ICs9ICh1bnNpZ25lZClob2xkICYgKCgxVSA8PCBvcCkgLSAxKTsKKyNpZmRlZiBJTkZMQVRFX1NUUklDVAorICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkgeworICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgICAgICAgICBiaXRzIC09IG9wOworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIGRpc3QpKTsKKyAgICAgICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkob3V0IC0gYmVnKTsgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcm9tID0gd2luZG93IC0gT0ZGOworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGUgPT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdyaXRlIDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3cml0ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgb3AgLT0gd3JpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlIDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gd3JpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3cml0ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgICAgIHRoaXMgPSBkY29kZVt0aGlzLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOworICAgICAgICAgICAgICAgIGdvdG8gZG9kaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICB0aGlzID0gbGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmICgoMVUgPDwgb3ApIC0gMSkpXTsKKyAgICAgICAgICAgIGdvdG8gZG9sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqLworICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKTsKKworICAgIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqLworICAgIGxlbiA9IGJpdHMgPj4gMzsKKyAgICBpbiAtPSBsZW47CisgICAgYml0cyAtPSBsZW4gPDwgMzsKKyAgICBob2xkICY9ICgxVSA8PCBiaXRzKSAtIDE7CisKKyAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqLworICAgIHN0cm0tPm5leHRfaW4gPSBpbiArIE9GRjsKKyAgICBzdHJtLT5uZXh0X291dCA9IG91dCArIE9GRjsKKyAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZCkoaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gaW4pIDogNSAtIChpbiAtIGxhc3QpKTsKKyAgICBzdHJtLT5hdmFpbF9vdXQgPSAodW5zaWduZWQpKG91dCA8IGVuZCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTcgKyAoZW5kIC0gb3V0KSA6IDI1NyAtIChvdXQgLSBlbmQpKTsKKyAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7CisgICAgc3RhdGUtPmJpdHMgPSBiaXRzOworICAgIHJldHVybjsKK30KKworLyoKKyAgIGluZmxhdGVfZmFzdCgpIHNwZWVkdXBzIHRoYXQgdHVybmVkIG91dCBzbG93ZXIgKG9uIGEgUG93ZXJQQyBHMyA3NTBDWGUpOgorICAgLSBVc2luZyBiaXQgZmllbGRzIGZvciBjb2RlIHN0cnVjdHVyZQorICAgLSBEaWZmZXJlbnQgb3AgZGVmaW5pdGlvbiB0byBhdm9pZCAmIGZvciBleHRyYSBiaXRzIChkbyAmIGZvciB0YWJsZSBiaXRzKQorICAgLSBUaHJlZSBzZXBhcmF0ZSBkZWNvZGluZyBkby1sb29wcyBmb3IgZGlyZWN0LCB3aW5kb3csIGFuZCB3cml0ZSA9PSAwCisgICAtIFNwZWNpYWwgY2FzZSBmb3IgZGlzdGFuY2UgPiAxIGNvcGllcyB0byBkbyBvdmVybGFwcGVkIGxvYWQgYW5kIHN0b3JlIGNvcHkKKyAgIC0gRXhwbGljaXQgYnJhbmNoIHByZWRpY3Rpb25zIChiYXNlZCBvbiBtZWFzdXJlZCBicmFuY2ggcHJvYmFiaWxpdGllcykKKyAgIC0gRGVmZXJyaW5nIG1hdGNoIGNvcHkgYW5kIGludGVyc3BlcnNlZCBpdCB3aXRoIGRlY29kaW5nIHN1YnNlcXVlbnQgY29kZXMKKyAgIC0gU3dhcHBpbmcgbGl0ZXJhbC9sZW5ndGggZWxzZQorICAgLSBTd2FwcGluZyB3aW5kb3cvZGlyZWN0IGVsc2UKKyAgIC0gTGFyZ2VyIHVucm9sbGVkIGNvcHkgbG9vcHMgKHRocmVlIGlzIGFib3V0IHJpZ2h0KQorICAgLSBNb3ZpbmcgbGVuIC09IDMgc3RhdGVtZW50IGludG8gbWlkZGxlIG9mIGxvb3AKKyAqLworCisjZW5kaWYgLyogIUFTTUlORiAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvaW5mZmFzdC5oIGIvdXNyL2tsaWJjL3psaWIvaW5mZmFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODhkMmQKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9pbmZmYXN0LmgKQEAgLTAsMCArMSwxMSBAQAorLyogaW5mZmFzdC5oIC0tIGhlYWRlciB0byB1c2UgaW5mZmFzdC5jCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKK3ZvaWQgaW5mbGF0ZV9mYXN0IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgc3RhcnQpKTsKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZmZpeGVkLmggYi91c3Iva2xpYmMvemxpYi9pbmZmaXhlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWQ0YjUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9pbmZmaXhlZC5oCkBAIC0wLDAgKzEsOTQgQEAKKyAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcworICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZCgpLgorICAgICAqLworCisgICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQKKyAgICAgICBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQKKyAgICAgICBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgICAgICovCisKKyAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbNTEyXSA9IHsKKyAgICAgICAgezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sezIwLDgsMTE1fSx7MTgsNywzMX0sezAsOCwxMTJ9LHswLDgsNDh9LAorICAgICAgICB7MCw5LDE5Mn0sezE2LDcsMTB9LHswLDgsOTZ9LHswLDgsMzJ9LHswLDksMTYwfSx7MCw4LDB9LHswLDgsMTI4fSwKKyAgICAgICAgezAsOCw2NH0sezAsOSwyMjR9LHsxNiw3LDZ9LHswLDgsODh9LHswLDgsMjR9LHswLDksMTQ0fSx7MTksNyw1OX0sCisgICAgICAgIHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOH0sezE3LDcsMTd9LHswLDgsMTA0fSx7MCw4LDQwfSx7MCw5LDE3Nn0sCisgICAgICAgIHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LHswLDksMjQwfSx7MTYsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSwKKyAgICAgICAgezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LHswLDgsNTJ9LHswLDksMjAwfSx7MTcsNywxM30sezAsOCwxMDB9LAorICAgICAgICB7MCw4LDM2fSx7MCw5LDE2OH0sezAsOCw0fSx7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzJ9LHsxNiw3LDh9LAorICAgICAgICB7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1Mn0sezIwLDcsODN9LHswLDgsMTI0fSx7MCw4LDYwfSx7MCw5LDIxNn0sCisgICAgICAgIHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sezAsOSwxODR9LHswLDgsMTJ9LHswLDgsMTQwfSx7MCw4LDc2fSwKKyAgICAgICAgezAsOSwyNDh9LHsxNiw3LDN9LHswLDgsODJ9LHswLDgsMTh9LHsyMSw4LDE2M30sezE5LDcsMzV9LHswLDgsMTE0fSwKKyAgICAgICAgezAsOCw1MH0sezAsOSwxOTZ9LHsxNyw3LDExfSx7MCw4LDk4fSx7MCw4LDM0fSx7MCw5LDE2NH0sezAsOCwyfSwKKyAgICAgICAgezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI4fSx7MTYsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OH0sCisgICAgICAgIHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sezAsOSwyMTJ9LHsxOCw3LDE5fSx7MCw4LDEwNn0sezAsOCw0Mn0sCisgICAgICAgIHswLDksMTgwfSx7MCw4LDEwfSx7MCw4LDEzOH0sezAsOCw3NH0sezAsOSwyNDR9LHsxNiw3LDV9LHswLDgsODZ9LAorICAgICAgICB7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA0fSx7MTcsNywxNX0sCisgICAgICAgIHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3Mn0sezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzZ9LAorICAgICAgICB7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSx7MCw5LDE1Nn0sezIwLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSwKKyAgICAgICAgezAsOSwyMjB9LHsxOCw3LDI3fSx7MCw4LDExMH0sezAsOCw0Nn0sezAsOSwxODh9LHswLDgsMTR9LHswLDgsMTQyfSwKKyAgICAgICAgezAsOCw3OH0sezAsOSwyNTJ9LHs5Niw3LDB9LHswLDgsODF9LHswLDgsMTd9LHsyMSw4LDEzMX0sezE4LDcsMzF9LAorICAgICAgICB7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTR9LHsxNiw3LDEwfSx7MCw4LDk3fSx7MCw4LDMzfSx7MCw5LDE2Mn0sCisgICAgICAgIHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LHswLDksMjI2fSx7MTYsNyw2fSx7MCw4LDg5fSx7MCw4LDI1fSwKKyAgICAgICAgezAsOSwxNDZ9LHsxOSw3LDU5fSx7MCw4LDEyMX0sezAsOCw1N30sezAsOSwyMTB9LHsxNyw3LDE3fSx7MCw4LDEwNX0sCisgICAgICAgIHswLDgsNDF9LHswLDksMTc4fSx7MCw4LDl9LHswLDgsMTM3fSx7MCw4LDczfSx7MCw5LDI0Mn0sezE2LDcsNH0sCisgICAgICAgIHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sezE5LDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwMn0sCisgICAgICAgIHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sezAsOSwxNzB9LHswLDgsNX0sezAsOCwxMzN9LHswLDgsNjl9LAorICAgICAgICB7MCw5LDIzNH0sezE2LDcsOH0sezAsOCw5M30sezAsOCwyOX0sezAsOSwxNTR9LHsyMCw3LDgzfSx7MCw4LDEyNX0sCisgICAgICAgIHswLDgsNjF9LHswLDksMjE4fSx7MTgsNywyM30sezAsOCwxMDl9LHswLDgsNDV9LHswLDksMTg2fSx7MCw4LDEzfSwKKyAgICAgICAgezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUwfSx7MTYsNywzfSx7MCw4LDgzfSx7MCw4LDE5fSx7MjEsOCwxOTV9LAorICAgICAgICB7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LHswLDksMTk4fSx7MTcsNywxMX0sezAsOCw5OX0sezAsOCwzNX0sCisgICAgICAgIHswLDksMTY2fSx7MCw4LDN9LHswLDgsMTMxfSx7MCw4LDY3fSx7MCw5LDIzMH0sezE2LDcsN30sezAsOCw5MX0sCisgICAgICAgIHswLDgsMjd9LHswLDksMTUwfSx7MjAsNyw2N30sezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE0fSx7MTgsNywxOX0sCisgICAgICAgIHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4Mn0sezAsOCwxMX0sezAsOCwxMzl9LHswLDgsNzV9LHswLDksMjQ2fSwKKyAgICAgICAgezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE5fSx7MCw4LDU1fSwKKyAgICAgICAgezAsOSwyMDZ9LHsxNyw3LDE1fSx7MCw4LDEwM30sezAsOCwzOX0sezAsOSwxNzR9LHswLDgsN30sezAsOCwxMzV9LAorICAgICAgICB7MCw4LDcxfSx7MCw5LDIzOH0sezE2LDcsOX0sezAsOCw5NX0sezAsOCwzMX0sezAsOSwxNTh9LHsyMCw3LDk5fSwKKyAgICAgICAgezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIyfSx7MTgsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkwfSwKKyAgICAgICAgezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LHswLDksMjU0fSx7OTYsNywwfSx7MCw4LDgwfSx7MCw4LDE2fSwKKyAgICAgICAgezIwLDgsMTE1fSx7MTgsNywzMX0sezAsOCwxMTJ9LHswLDgsNDh9LHswLDksMTkzfSx7MTYsNywxMH0sezAsOCw5Nn0sCisgICAgICAgIHswLDgsMzJ9LHswLDksMTYxfSx7MCw4LDB9LHswLDgsMTI4fSx7MCw4LDY0fSx7MCw5LDIyNX0sezE2LDcsNn0sCisgICAgICAgIHswLDgsODh9LHswLDgsMjR9LHswLDksMTQ1fSx7MTksNyw1OX0sezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA5fSwKKyAgICAgICAgezE3LDcsMTd9LHswLDgsMTA0fSx7MCw4LDQwfSx7MCw5LDE3N30sezAsOCw4fSx7MCw4LDEzNn0sezAsOCw3Mn0sCisgICAgICAgIHswLDksMjQxfSx7MTYsNyw0fSx7MCw4LDg0fSx7MCw4LDIwfSx7MjEsOCwyMjd9LHsxOSw3LDQzfSx7MCw4LDExNn0sCisgICAgICAgIHswLDgsNTJ9LHswLDksMjAxfSx7MTcsNywxM30sezAsOCwxMDB9LHswLDgsMzZ9LHswLDksMTY5fSx7MCw4LDR9LAorICAgICAgICB7MCw4LDEzMn0sezAsOCw2OH0sezAsOSwyMzN9LHsxNiw3LDh9LHswLDgsOTJ9LHswLDgsMjh9LHswLDksMTUzfSwKKyAgICAgICAgezIwLDcsODN9LHswLDgsMTI0fSx7MCw4LDYwfSx7MCw5LDIxN30sezE4LDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSwKKyAgICAgICAgezAsOSwxODV9LHswLDgsMTJ9LHswLDgsMTQwfSx7MCw4LDc2fSx7MCw5LDI0OX0sezE2LDcsM30sezAsOCw4Mn0sCisgICAgICAgIHswLDgsMTh9LHsyMSw4LDE2M30sezE5LDcsMzV9LHswLDgsMTE0fSx7MCw4LDUwfSx7MCw5LDE5N30sezE3LDcsMTF9LAorICAgICAgICB7MCw4LDk4fSx7MCw4LDM0fSx7MCw5LDE2NX0sezAsOCwyfSx7MCw4LDEzMH0sezAsOCw2Nn0sezAsOSwyMjl9LAorICAgICAgICB7MTYsNyw3fSx7MCw4LDkwfSx7MCw4LDI2fSx7MCw5LDE0OX0sezIwLDcsNjd9LHswLDgsMTIyfSx7MCw4LDU4fSwKKyAgICAgICAgezAsOSwyMTN9LHsxOCw3LDE5fSx7MCw4LDEwNn0sezAsOCw0Mn0sezAsOSwxODF9LHswLDgsMTB9LHswLDgsMTM4fSwKKyAgICAgICAgezAsOCw3NH0sezAsOSwyNDV9LHsxNiw3LDV9LHswLDgsODZ9LHswLDgsMjJ9LHs2NCw4LDB9LHsxOSw3LDUxfSwKKyAgICAgICAgezAsOCwxMTh9LHswLDgsNTR9LHswLDksMjA1fSx7MTcsNywxNX0sezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTczfSwKKyAgICAgICAgezAsOCw2fSx7MCw4LDEzNH0sezAsOCw3MH0sezAsOSwyMzd9LHsxNiw3LDl9LHswLDgsOTR9LHswLDgsMzB9LAorICAgICAgICB7MCw5LDE1N30sezIwLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSx7MCw5LDIyMX0sezE4LDcsMjd9LHswLDgsMTEwfSwKKyAgICAgICAgezAsOCw0Nn0sezAsOSwxODl9LHswLDgsMTR9LHswLDgsMTQyfSx7MCw4LDc4fSx7MCw5LDI1M30sezk2LDcsMH0sCisgICAgICAgIHswLDgsODF9LHswLDgsMTd9LHsyMSw4LDEzMX0sezE4LDcsMzF9LHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NX0sCisgICAgICAgIHsxNiw3LDEwfSx7MCw4LDk3fSx7MCw4LDMzfSx7MCw5LDE2M30sezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sCisgICAgICAgIHswLDksMjI3fSx7MTYsNyw2fSx7MCw4LDg5fSx7MCw4LDI1fSx7MCw5LDE0N30sezE5LDcsNTl9LHswLDgsMTIxfSwKKyAgICAgICAgezAsOCw1N30sezAsOSwyMTF9LHsxNyw3LDE3fSx7MCw4LDEwNX0sezAsOCw0MX0sezAsOSwxNzl9LHswLDgsOX0sCisgICAgICAgIHswLDgsMTM3fSx7MCw4LDczfSx7MCw5LDI0M30sezE2LDcsNH0sezAsOCw4NX0sezAsOCwyMX0sezE2LDgsMjU4fSwKKyAgICAgICAgezE5LDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwM30sezE3LDcsMTN9LHswLDgsMTAxfSx7MCw4LDM3fSwKKyAgICAgICAgezAsOSwxNzF9LHswLDgsNX0sezAsOCwxMzN9LHswLDgsNjl9LHswLDksMjM1fSx7MTYsNyw4fSx7MCw4LDkzfSwKKyAgICAgICAgezAsOCwyOX0sezAsOSwxNTV9LHsyMCw3LDgzfSx7MCw4LDEyNX0sezAsOCw2MX0sezAsOSwyMTl9LHsxOCw3LDIzfSwKKyAgICAgICAgezAsOCwxMDl9LHswLDgsNDV9LHswLDksMTg3fSx7MCw4LDEzfSx7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTF9LAorICAgICAgICB7MTYsNywzfSx7MCw4LDgzfSx7MCw4LDE5fSx7MjEsOCwxOTV9LHsxOSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sCisgICAgICAgIHswLDksMTk5fSx7MTcsNywxMX0sezAsOCw5OX0sezAsOCwzNX0sezAsOSwxNjd9LHswLDgsM30sezAsOCwxMzF9LAorICAgICAgICB7MCw4LDY3fSx7MCw5LDIzMX0sezE2LDcsN30sezAsOCw5MX0sezAsOCwyN30sezAsOSwxNTF9LHsyMCw3LDY3fSwKKyAgICAgICAgezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE1fSx7MTgsNywxOX0sezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgzfSwKKyAgICAgICAgezAsOCwxMX0sezAsOCwxMzl9LHswLDgsNzV9LHswLDksMjQ3fSx7MTYsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSwKKyAgICAgICAgezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE5fSx7MCw4LDU1fSx7MCw5LDIwN30sezE3LDcsMTV9LHswLDgsMTAzfSwKKyAgICAgICAgezAsOCwzOX0sezAsOSwxNzV9LHswLDgsN30sezAsOCwxMzV9LHswLDgsNzF9LHswLDksMjM5fSx7MTYsNyw5fSwKKyAgICAgICAgezAsOCw5NX0sezAsOCwzMX0sezAsOSwxNTl9LHsyMCw3LDk5fSx7MCw4LDEyN30sezAsOCw2M30sezAsOSwyMjN9LAorICAgICAgICB7MTgsNywyN30sezAsOCwxMTF9LHswLDgsNDd9LHswLDksMTkxfSx7MCw4LDE1fSx7MCw4LDE0M30sezAsOCw3OX0sCisgICAgICAgIHswLDksMjU1fQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WzMyXSA9IHsKKyAgICAgICAgezE2LDUsMX0sezIzLDUsMjU3fSx7MTksNSwxN30sezI3LDUsNDA5N30sezE3LDUsNX0sezI1LDUsMTAyNX0sCisgICAgICAgIHsyMSw1LDY1fSx7MjksNSwxNjM4NX0sezE2LDUsM30sezI0LDUsNTEzfSx7MjAsNSwzM30sezI4LDUsODE5M30sCisgICAgICAgIHsxOCw1LDl9LHsyNiw1LDIwNDl9LHsyMiw1LDEyOX0sezY0LDUsMH0sezE2LDUsMn0sezIzLDUsMzg1fSwKKyAgICAgICAgezE5LDUsMjV9LHsyNyw1LDYxNDV9LHsxNyw1LDd9LHsyNSw1LDE1Mzd9LHsyMSw1LDk3fSx7MjksNSwyNDU3N30sCisgICAgICAgIHsxNiw1LDR9LHsyNCw1LDc2OX0sezIwLDUsNDl9LHsyOCw1LDEyMjg5fSx7MTgsNSwxM30sezI2LDUsMzA3M30sCisgICAgICAgIHsyMiw1LDE5M30sezY0LDUsMH0KKyAgICB9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvaW5mbGF0ZS5jIGIvdXNyL2tsaWJjL3psaWIvaW5mbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmZkZWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9pbmZsYXRlLmMKQEAgLTAsMCArMSwxMzY4IEBACisvKiBpbmZsYXRlLmMgLS0gemxpYiBkZWNvbXByZXNzaW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqIENoYW5nZSBoaXN0b3J5OgorICoKKyAqIDEuMi5iZXRhMCAgICAyNCBOb3YgMjAwMgorICogLSBGaXJzdCB2ZXJzaW9uIC0tIGNvbXBsZXRlIHJld3JpdGUgb2YgaW5mbGF0ZSB0byBzaW1wbGlmeSBjb2RlLCBhdm9pZAorICogICBjcmVhdGlvbiBvZiB3aW5kb3cgd2hlbiBub3QgbmVlZGVkLCBtaW5pbWl6ZSB1c2Ugb2Ygd2luZG93IHdoZW4gaXQgaXMKKyAqICAgbmVlZGVkLCBtYWtlIGluZmZhc3QuYyBldmVuIGZhc3RlciwgaW1wbGVtZW50IGd6aXAgZGVjb2RpbmcsIGFuZCB0bworICogICBpbXByb3ZlIGNvZGUgcmVhZGFiaWxpdHkgYW5kIHN0eWxlIG92ZXIgdGhlIHByZXZpb3VzIHpsaWIgaW5mbGF0ZSBjb2RlCisgKgorICogMS4yLmJldGExICAgIDI1IE5vdiAyMDAyCisgKiAtIFVzZSBwb2ludGVycyBmb3IgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgY2hlY2tpbmcgaW4gaW5mZmFzdC5jCisgKiAtIFJlbW92ZSBpbnB1dCBhbmQgb3V0cHV0IGNvdW50ZXJzIGluIGluZmZhc3QuYworICogLSBDaGFuZ2UgaW5mZmFzdC5jIGVudHJ5IGFuZCBsb29wIGZyb20gYXZhaWxfaW4gPj0gNyB0byA+PSA2CisgKiAtIFJlbW92ZSB1bm5lY2Vzc2FyeSBzZWNvbmQgYnl0ZSBwdWxsIGZyb20gbGVuZ3RoIGV4dHJhIGluIGluZmZhc3QuYworICogLSBVbnJvbGwgZGlyZWN0IGNvcHkgdG8gdGhyZWUgY29waWVzIHBlciBsb29wIGluIGluZmZhc3QuYworICoKKyAqIDEuMi5iZXRhMiAgICA0IERlYyAyMDAyCisgKiAtIENoYW5nZSBleHRlcm5hbCByb3V0aW5lIG5hbWVzIHRvIHJlZHVjZSBwb3RlbnRpYWwgY29uZmxpY3RzCisgKiAtIENvcnJlY3QgZmlsZW5hbWUgdG8gaW5mZml4ZWQuaCBmb3IgZml4ZWQgdGFibGVzIGluIGluZmxhdGUuYworICogLSBNYWtlIGhidWZbXSB1bnNpZ25lZCBjaGFyIHRvIG1hdGNoIHBhcmFtZXRlciB0eXBlIGluIGluZmxhdGUuYworICogLSBDaGFuZ2Ugc3RybS0+bmV4dF9vdXRbLXN0YXRlLT5vZmZzZXRdIHRvICooc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+b2Zmc2V0KQorICogICB0byBhdm9pZCBuZWdhdGlvbiBwcm9ibGVtIG9uIEFscGhhcyAoNjQgYml0KSBpbiBpbmZsYXRlLmMKKyAqCisgKiAxLjIuYmV0YTMgICAgMjIgRGVjIDIwMDIKKyAqIC0gQWRkIGNvbW1lbnRzIG9uIHN0YXRlLT5iaXRzIGFzc2VydGlvbiBpbiBpbmZmYXN0LmMKKyAqIC0gQWRkIGNvbW1lbnRzIG9uIG9wIGZpZWxkIGluIGluZnRyZWVzLmgKKyAqIC0gRml4IGJ1ZyBpbiByZXVzZSBvZiBhbGxvY2F0ZWQgd2luZG93IGFmdGVyIGluZmxhdGVSZXNldCgpCisgKiAtIFJlbW92ZSBiaXQgZmllbGRzLS1iYWNrIHRvIGJ5dGUgc3RydWN0dXJlIGZvciBzcGVlZAorICogLSBSZW1vdmUgZGlzdGFuY2UgZXh0cmEgPT0gMCBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKS0tb25seSBoZWxwcyBmb3IgbGVuZ3RocworICogLSBDaGFuZ2UgcG9zdC1pbmNyZW1lbnRzIHRvIHByZS1pbmNyZW1lbnRzIGluIGluZmxhdGVfZmFzdCgpLCBQUEMgYmlhc2VkPworICogLSBBZGQgY29tcGlsZSB0aW1lIG9wdGlvbiwgUE9TVElOQywgdG8gdXNlIHBvc3QtaW5jcmVtZW50cyBpbnN0ZWFkIChJbnRlbD8pCisgKiAtIE1ha2UgTUFUQ0ggY29weSBpbiBpbmZsYXRlKCkgbXVjaCBmYXN0ZXIgZm9yIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKKyAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiBzdHJlYW0gbmV4dCBhbmQgYXZhaWwgdmFsdWVzLCBhcyB3ZWxsIGFzIGxvY2FsIGJpdAorICogICBidWZmZXIgYW5kIGJpdCBjb3VudCBpbiBpbmZsYXRlKCktLWZvciBzcGVlZCB3aGVuIGluZmxhdGVfZmFzdCgpIG5vdCB1c2VkCisgKgorICogMS4yLmJldGE0ICAgIDEgSmFuIDIwMDMKKyAqIC0gU3BsaXQgcHRyIC0gMjU3IHN0YXRlbWVudHMgaW4gaW5mbGF0ZV90YWJsZSgpIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCisgKiAtIE1vdmUgYSBjb21tZW50IG9uIG91dHB1dCBidWZmZXIgc2l6ZXMgZnJvbSBpbmZmYXN0LmMgdG8gaW5mbGF0ZS5jCisgKiAtIEFkZCBjb21tZW50cyBpbiBpbmZmYXN0LmMgdG8gaW50cm9kdWNlIHRoZSBpbmZsYXRlX2Zhc3QoKSByb3V0aW5lCisgKiAtIFJlYXJyYW5nZSB3aW5kb3cgY29waWVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZCBhbmQgc2ltcGxpZmljYXRpb24KKyAqIC0gVW5yb2xsIGxhc3QgY29weSBmb3Igd2luZG93IG1hdGNoIGluIGluZmxhdGVfZmFzdCgpCisgKiAtIFVzZSBsb2NhbCBjb3BpZXMgb2Ygd2luZG93IHZhcmlhYmxlcyBpbiBpbmZsYXRlX2Zhc3QoKSBmb3Igc3BlZWQKKyAqIC0gUHVsbCBvdXQgY29tbW9uIHdyaXRlID09IDAgY2FzZSBmb3Igc3BlZWQgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gTWFrZSBvcCBhbmQgbGVuIGluIGluZmxhdGVfZmFzdCgpIHVuc2lnbmVkIGZvciBjb25zaXN0ZW5jeQorICogLSBBZGQgRkFSIHRvIGxjb2RlIGFuZCBkY29kZSBkZWNsYXJhdGlvbnMgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gU2ltcGxpZmllZCBiYWQgZGlzdGFuY2UgY2hlY2sgaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gQWRkZWQgaW5mbGF0ZUJhY2tJbml0KCksIGluZmxhdGVCYWNrKCksIGFuZCBpbmZsYXRlQmFja0VuZCgpIGluIG5ldworICogICBzb3VyY2UgZmlsZSBpbmZiYWNrLmMgdG8gcHJvdmlkZSBhIGNhbGwtYmFjayBpbnRlcmZhY2UgdG8gaW5mbGF0ZSBmb3IKKyAqICAgcHJvZ3JhbXMgbGlrZSBnemlwIGFuZCB1bnppcCAtLSB1c2VzIHdpbmRvdyBhcyBvdXRwdXQgYnVmZmVyIHRvIGF2b2lkCisgKiAgIHdpbmRvdyBjb3B5aW5nCisgKgorICogMS4yLmJldGE1ICAgIDEgSmFuIDIwMDMKKyAqIC0gSW1wcm92ZWQgaW5mbGF0ZUJhY2soKSBpbnRlcmZhY2UgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBwcm92aWRlIGluaXRpYWwKKyAqICAgaW5wdXQgaW4gc3RybS4KKyAqIC0gRml4ZWQgc3RvcmVkIGJsb2NrcyBidWcgaW4gaW5mbGF0ZUJhY2soKQorICoKKyAqIDEuMi5iZXRhNiAgICA0IEphbiAyMDAzCisgKiAtIEFkZGVkIGNvbW1lbnRzIGluIGluZmZhc3QuYyBvbiBlZmZlY3RpdmVuZXNzIG9mIFBPU1RJTkMKKyAqIC0gVHlwZWNhc3RpbmcgYWxsIGFyb3VuZCB0byByZWR1Y2UgY29tcGlsZXIgd2FybmluZ3MKKyAqIC0gQ2hhbmdlZCBsb29wcyBmcm9tIHdoaWxlICgxKSBvciBkbyB7fSB3aGlsZSAoMSkgdG8gZm9yICg7OyksIGFnYWluIHRvCisgKiAgIG1ha2UgY29tcGlsZXJzIGhhcHB5CisgKiAtIENoYW5nZWQgdHlwZSBvZiB3aW5kb3cgaW4gaW5mbGF0ZUJhY2tJbml0KCkgdG8gdW5zaWduZWQgY2hhciAqCisgKgorICogMS4yLmJldGE3ICAgIDI3IEphbiAyMDAzCisgKiAtIENoYW5nZWQgbWFueSB0eXBlcyB0byB1bnNpZ25lZCBvciB1bnNpZ25lZCBzaG9ydCB0byBhdm9pZCB3YXJuaW5ncworICogLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uCisgKgorICogMS4yLjAgICAgICAgIDkgTWFyIDIwMDMKKyAqIC0gQ2hhbmdlZCBpbmZsYXRlQmFjaygpIGludGVyZmFjZSB0byBwcm92aWRlIHNlcGFyYXRlIG9wYXF1ZSBkZXNjcmlwdG9ycworICogICBmb3IgdGhlIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucworICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgYXJndW1lbnQgYW5kIGluX2Z1bmMgdHlwZWRlZiB0byBzd2FwIHRoZSBsZW5ndGgKKyAqICAgYW5kIGJ1ZmZlciBhZGRyZXNzIHJldHVybiB2YWx1ZXMgZm9yIHRoZSBpbnB1dCBmdW5jdGlvbgorICogLSBDaGVjayBuZXh0X2luIGFuZCBuZXh0X291dCBmb3IgWl9OVUxMIG9uIGVudHJ5IHRvIGluZmxhdGUoKQorICoKKyAqIFRoZSBoaXN0b3J5IGZvciB2ZXJzaW9ucyBhZnRlciAxLjIuMCBhcmUgaW4gQ2hhbmdlTG9nIGluIHpsaWIgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisjaW5jbHVkZSAiaW5mbGF0ZS5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKKworI2lmZGVmIE1BS0VGSVhFRAorIyAgaWZuZGVmIEJVSUxERklYRUQKKyMgICAgZGVmaW5lIEJVSUxERklYRUQKKyMgIGVuZGlmCisjZW5kaWYKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworbG9jYWwgdm9pZCBmaXhlZHRhYmxlcyBPRigoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZSkpOworbG9jYWwgaW50IHVwZGF0ZXdpbmRvdyBPRigoel9zdHJlYW1wIHN0cm0sIHVuc2lnbmVkIG91dCkpOworI2lmZGVmIEJVSUxERklYRUQKKyAgIHZvaWQgbWFrZWZpeGVkIE9GKCh2b2lkKSk7CisjZW5kaWYKK2xvY2FsIHVuc2lnbmVkIHN5bmNzZWFyY2ggT0YoKHVuc2lnbmVkIEZBUiAqaGF2ZSwgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOworCitpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSBzdGF0ZS0+dG90YWwgPSAwOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBzdHJtLT5hZGxlciA9IDE7ICAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovCisgICAgc3RhdGUtPm1vZGUgPSBIRUFEOworICAgIHN0YXRlLT5sYXN0ID0gMDsKKyAgICBzdGF0ZS0+aGF2ZWRpY3QgPSAwOworICAgIHN0YXRlLT5kbWF4ID0gMzI3NjhVOworICAgIHN0YXRlLT5oZWFkID0gWl9OVUxMOworICAgIHN0YXRlLT53c2l6ZSA9IDA7CisgICAgc3RhdGUtPndoYXZlID0gMDsKKyAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgIHN0YXRlLT5ob2xkID0gMDsKKyAgICBzdGF0ZS0+Yml0cyA9IDA7CisgICAgc3RhdGUtPmxlbmNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGUgPSBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IHJlc2V0XG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVQcmltZShzdHJtLCBiaXRzLCB2YWx1ZSkKK3pfc3RyZWFtcCBzdHJtOworaW50IGJpdHM7CitpbnQgdmFsdWU7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoYml0cyA+IDE2IHx8IHN0YXRlLT5iaXRzICsgYml0cyA+IDMyKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgdmFsdWUgJj0gKDFMIDw8IGJpdHMpIC0gMTsKKyAgICBzdGF0ZS0+aG9sZCArPSB2YWx1ZSA8PCBzdGF0ZS0+Yml0czsKKyAgICBzdGF0ZS0+Yml0cyArPSBiaXRzOworICAgIHJldHVybiBaX09LOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfKHN0cm0sIHdpbmRvd0JpdHMsIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07CitpbnQgd2luZG93Qml0czsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAorICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLworICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgeworICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOworICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHN0cm0tPnpmcmVlID0gemNmcmVlOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKQorICAgICAgICAgICAgWkFMTE9DKHN0cm0sIDEsIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOworICAgIGlmIChzdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGFsbG9jYXRlZFxuIikpOworICAgIHN0cm0tPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKilzdGF0ZTsKKyAgICBpZiAod2luZG93Qml0cyA8IDApIHsKKyAgICAgICAgc3RhdGUtPndyYXAgPSAwOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0ZS0+d3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTsKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkgd2luZG93Qml0cyAmPSAxNTsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSB7CisgICAgICAgIFpGUkVFKHN0cm0sIHN0YXRlKTsKKyAgICAgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgc3RhdGUtPndiaXRzID0gKHVuc2lnbmVkKXdpbmRvd0JpdHM7CisgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKKyAgICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8oc3RybSwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2NvbnN0IGNoYXIgKnZlcnNpb247CitpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgcmV0dXJuIGluZmxhdGVJbml0Ml8oc3RybSwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Cit9CisKKy8qCisgICBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvCisgICBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguCisgICBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlCisgICBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kCisgICB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpbgorICAgZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlCisgICB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luCisgICBtYXkgbm90IGJlIHRocmVhZC1zYWZlLgorICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzKHN0YXRlKQorc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKK3sKKyNpZmRlZiBCVUlMREZJWEVECisgICAgc3RhdGljIGludCB2aXJnaW4gPSAxOworICAgIHN0YXRpYyBjb2RlICpsZW5maXgsICpkaXN0Zml4OworICAgIHN0YXRpYyBjb2RlIGZpeGVkWzU0NF07CisKKyAgICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqLworICAgIGlmICh2aXJnaW4pIHsKKyAgICAgICAgdW5zaWduZWQgc3ltLCBiaXRzOworICAgICAgICBzdGF0aWMgY29kZSAqbmV4dDsKKworICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqLworICAgICAgICBzeW0gPSAwOworICAgICAgICB3aGlsZSAoc3ltIDwgMTQ0KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OworICAgICAgICB3aGlsZSAoc3ltIDwgMjU2KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA5OworICAgICAgICB3aGlsZSAoc3ltIDwgMjgwKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA3OworICAgICAgICB3aGlsZSAoc3ltIDwgMjg4KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OworICAgICAgICBuZXh0ID0gZml4ZWQ7CisgICAgICAgIGxlbmZpeCA9IG5leHQ7CisgICAgICAgIGJpdHMgPSA5OworICAgICAgICBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCAyODgsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKKworICAgICAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLworICAgICAgICBzeW0gPSAwOworICAgICAgICB3aGlsZSAoc3ltIDwgMzIpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDU7CisgICAgICAgIGRpc3RmaXggPSBuZXh0OworICAgICAgICBiaXRzID0gNTsKKyAgICAgICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMsIDMyLCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7CisKKyAgICAgICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi8KKyAgICAgICAgdmlyZ2luID0gMDsKKyAgICB9CisjZWxzZSAvKiAhQlVJTERGSVhFRCAqLworIyAgIGluY2x1ZGUgImluZmZpeGVkLmgiCisjZW5kaWYgLyogQlVJTERGSVhFRCAqLworICAgIHN0YXRlLT5sZW5jb2RlID0gbGVuZml4OworICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICBzdGF0ZS0+ZGlzdGNvZGUgPSBkaXN0Zml4OworICAgIHN0YXRlLT5kaXN0Yml0cyA9IDU7Cit9CisKKyNpZmRlZiBNQUtFRklYRUQKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICAgV3JpdGUgb3V0IHRoZSBpbmZmaXhlZC5oIHRoYXQgaXMgI2luY2x1ZGUnZCBhYm92ZS4gIERlZmluaW5nIE1BS0VGSVhFRCBhbHNvCisgICBkZWZpbmVzIEJVSUxERklYRUQsIHNvIHRoZSB0YWJsZXMgYXJlIGJ1aWx0IG9uIHRoZSBmbHkuICBtYWtlZml4ZWQoKSB3cml0ZXMKKyAgIHRob3NlIHRhYmxlcyB0byBzdGRvdXQsIHdoaWNoIHdvdWxkIGJlIHBpcGVkIHRvIGluZmZpeGVkLmguICBBIHNtYWxsIHByb2dyYW0KKyAgIGNhbiBzaW1wbHkgY2FsbCBtYWtlZml4ZWQgdG8gZG8gdGhpczoKKworICAgIHZvaWQgbWFrZWZpeGVkKHZvaWQpOworCisgICAgaW50IG1haW4odm9pZCkKKyAgICB7CisgICAgICAgIG1ha2VmaXhlZCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgIFRoZW4gdGhhdCBjYW4gYmUgbGlua2VkIHdpdGggemxpYiBidWlsdCB3aXRoIE1BS0VGSVhFRCBkZWZpbmVkIGFuZCBydW46CisKKyAgICBhLm91dCA+IGluZmZpeGVkLmgKKyAqLwordm9pZCBtYWtlZml4ZWQoKQoreworICAgIHVuc2lnbmVkIGxvdywgc2l6ZTsKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBzdGF0ZTsKKworICAgIGZpeGVkdGFibGVzKCZzdGF0ZSk7CisgICAgcHV0cygiICAgIC8qIGluZmZpeGVkLmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzIik7CisgICAgcHV0cygiICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZCgpLiIpOworICAgIHB1dHMoIiAgICAgKi8iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBwdXRzKCIgICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4iKTsKKyAgICBwdXRzKCIgICAgICAgSXQgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBsaWJyYXJ5IGFuZCBpcyIpOworICAgIHB1dHMoIiAgICAgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguIik7CisgICAgcHV0cygiICAgICAqLyIpOworICAgIHB1dHMoIiIpOworICAgIHNpemUgPSAxVSA8PCA5OworICAgIHByaW50ZigiICAgIHN0YXRpYyBjb25zdCBjb2RlIGxlbmZpeFsldV0gPSB7Iiwgc2l6ZSk7CisgICAgbG93ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgobG93ICUgNykgPT0gMCkgcHJpbnRmKCJcbiAgICAgICAgIik7CisgICAgICAgIHByaW50ZigieyV1LCV1LCVkfSIsIHN0YXRlLmxlbmNvZGVbbG93XS5vcCwgc3RhdGUubGVuY29kZVtsb3ddLmJpdHMsCisgICAgICAgICAgICAgICBzdGF0ZS5sZW5jb2RlW2xvd10udmFsKTsKKyAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOworICAgICAgICBwdXRjaGFyKCcsJyk7CisgICAgfQorICAgIHB1dHMoIlxuICAgIH07Iik7CisgICAgc2l6ZSA9IDFVIDw8IDU7CisgICAgcHJpbnRmKCJcbiAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WyV1XSA9IHsiLCBzaXplKTsKKyAgICBsb3cgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKChsb3cgJSA2KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKKyAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9Iiwgc3RhdGUuZGlzdGNvZGVbbG93XS5vcCwgc3RhdGUuZGlzdGNvZGVbbG93XS5iaXRzLAorICAgICAgICAgICAgICAgc3RhdGUuZGlzdGNvZGVbbG93XS52YWwpOworICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7CisgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICB9CisgICAgcHV0cygiXG4gICAgfTsiKTsKK30KKyNlbmRpZiAvKiBNQUtFRklYRUQgKi8KKworLyoKKyAgIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmUKKyAgIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWQKKyAgIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXMKKyAgIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC4KKyAgIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5CisgICBpcyBsb2FkZWQuCisKKyAgIFByb3ZpZGluZyBvdXRwdXQgYnVmZmVycyBsYXJnZXIgdGhhbiAzMksgdG8gaW5mbGF0ZSgpIHNob3VsZCBwcm92aWRlIGEgc3BlZWQKKyAgIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3cKKyAgIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mCisgICBvdXRwdXQgd2lsbCBmYWxsIGluIHRoZSBvdXRwdXQgZGF0YSwgbWFraW5nIG1hdGNoIGNvcGllcyBzaW1wbGVyIGFuZCBmYXN0ZXIuCisgICBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLgorICovCitsb2NhbCBpbnQgdXBkYXRld2luZG93KHN0cm0sIG91dCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgb3V0OworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY29weSwgZGlzdDsKKworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworCisgICAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqLworICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgeworICAgICAgICBzdGF0ZS0+d2luZG93ID0gKHVuc2lnbmVkIGNoYXIgRkFSICopCisgICAgICAgICAgICAgICAgICAgICAgICBaQUxMT0Moc3RybSwgMVUgPDwgc3RhdGUtPndiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisgICAgICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogaWYgd2luZG93IG5vdCBpbiB1c2UgeWV0LCBpbml0aWFsaXplICovCisgICAgaWYgKHN0YXRlLT53c2l6ZSA9PSAwKSB7CisgICAgICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKKyAgICAgICAgc3RhdGUtPndyaXRlID0gMDsKKyAgICAgICAgc3RhdGUtPndoYXZlID0gMDsKKyAgICB9CisKKyAgICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi8KKyAgICBjb3B5ID0gb3V0IC0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChjb3B5ID49IHN0YXRlLT53c2l6ZSkgeworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPndzaXplLCBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkaXN0ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPndyaXRlOworICAgICAgICBpZiAoZGlzdCA+IGNvcHkpIGRpc3QgPSBjb3B5OworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d3JpdGUsIHN0cm0tPm5leHRfb3V0IC0gY29weSwgZGlzdCk7CisgICAgICAgIGNvcHkgLT0gZGlzdDsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBjb3B5LCBjb3B5KTsKKyAgICAgICAgICAgIHN0YXRlLT53cml0ZSA9IGNvcHk7CisgICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGF0ZS0+d3JpdGUgKz0gZGlzdDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JpdGUgPT0gc3RhdGUtPndzaXplKSBzdGF0ZS0+d3JpdGUgPSAwOworICAgICAgICAgICAgaWYgKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndoYXZlICs9IGRpc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZSgpOiAqLworCisvKiBjaGVjayBmdW5jdGlvbiB0byB1c2UgYWRsZXIzMigpIGZvciB6bGliIG9yIGNyYzMyKCkgZm9yIGd6aXAgKi8KKyNpZmRlZiBHVU5aSVAKKyMgIGRlZmluZSBVUERBVEUoY2hlY2ssIGJ1ZiwgbGVuKSBcCisgICAgKHN0YXRlLT5mbGFncyA/IGNyYzMyKGNoZWNrLCBidWYsIGxlbikgOiBhZGxlcjMyKGNoZWNrLCBidWYsIGxlbikpCisjZWxzZQorIyAgZGVmaW5lIFVQREFURShjaGVjaywgYnVmLCBsZW4pIGFkbGVyMzIoY2hlY2ssIGJ1ZiwgbGVuKQorI2VuZGlmCisKKy8qIGNoZWNrIG1hY3JvcyBmb3IgaGVhZGVyIGNyYyAqLworI2lmZGVmIEdVTlpJUAorIyAgZGVmaW5lIENSQzIoY2hlY2ssIHdvcmQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSh3b3JkKTsgXAorICAgICAgICBoYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiA4KTsgXAorICAgICAgICBjaGVjayA9IGNyYzMyKGNoZWNrLCBoYnVmLCAyKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyMgIGRlZmluZSBDUkM0KGNoZWNrLCB3b3JkKSBcCisgICAgZG8geyBcCisgICAgICAgIGhidWZbMF0gPSAodW5zaWduZWQgY2hhcikod29yZCk7IFwKKyAgICAgICAgaGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gOCk7IFwKKyAgICAgICAgaGJ1ZlsyXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gMTYpOyBcCisgICAgICAgIGhidWZbM10gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDI0KTsgXAorICAgICAgICBjaGVjayA9IGNyYzMyKGNoZWNrLCBoYnVmLCA0KTsgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogTG9hZCByZWdpc3RlcnMgd2l0aCBzdGF0ZSBpbiBpbmZsYXRlKCkgZm9yIHNwZWVkICovCisjZGVmaW5lIExPQUQoKSBcCisgICAgZG8geyBcCisgICAgICAgIHB1dCA9IHN0cm0tPm5leHRfb3V0OyBcCisgICAgICAgIGxlZnQgPSBzdHJtLT5hdmFpbF9vdXQ7IFwKKyAgICAgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47IFwKKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOyBcCisgICAgICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsgXAorICAgICAgICBiaXRzID0gc3RhdGUtPmJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXN0b3JlIHN0YXRlIGZyb20gcmVnaXN0ZXJzIGluIGluZmxhdGUoKSAqLworI2RlZmluZSBSRVNUT1JFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBzdHJtLT5uZXh0X291dCA9IHB1dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZWZ0OyBcCisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsgXAorICAgICAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7IFwKKyAgICAgICAgc3RhdGUtPmJpdHMgPSBiaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBJTklUQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA9IDA7IFwKKyAgICAgICAgYml0cyA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBHZXQgYSBieXRlIG9mIGlucHV0IGludG8gdGhlIGJpdCBhY2N1bXVsYXRvciwgb3IgcmV0dXJuIGZyb20gaW5mbGF0ZSgpCisgICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICovCisjZGVmaW5lIFBVTExCWVRFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlKCkuICovCisjZGVmaW5lIE5FRURCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCisgICAgICAgICAgICBQVUxMQllURSgpOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPCAxNikgKi8KKyNkZWZpbmUgQklUUyhuKSBcCisgICAgKCh1bnNpZ25lZClob2xkICYgKCgxVSA8PCAobikpIC0gMSkpCisKKy8qIFJlbW92ZSBuIGJpdHMgZnJvbSB0aGUgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIERST1BCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gKG4pOyBcCisgICAgICAgIGJpdHMgLT0gKHVuc2lnbmVkKShuKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlbW92ZSB6ZXJvIHRvIHNldmVuIGJpdHMgYXMgbmVlZGVkIHRvIGdvIHRvIGEgYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZSBCWVRFQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gYml0cyAmIDc7IFwKKyAgICAgICAgYml0cyAtPSBiaXRzICYgNzsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldmVyc2UgdGhlIGJ5dGVzIGluIGEgMzItYml0IHZhbHVlICovCisjZGVmaW5lIFJFVkVSU0UocSkgXAorICAgICgoKChxKSA+PiAyNCkgJiAweGZmKSArICgoKHEpID4+IDgpICYgMHhmZjAwKSArIFwKKyAgICAgKCgocSkgJiAweGZmMDApIDw8IDgpICsgKCgocSkgJiAweGZmKSA8PCAyNCkpCisKKy8qCisgICBpbmZsYXRlKCkgdXNlcyBhIHN0YXRlIG1hY2hpbmUgdG8gcHJvY2VzcyBhcyBtdWNoIGlucHV0IGRhdGEgYW5kIGdlbmVyYXRlIGFzCisgICBtdWNoIG91dHB1dCBkYXRhIGFzIHBvc3NpYmxlIGJlZm9yZSByZXR1cm5pbmcuICBUaGUgc3RhdGUgbWFjaGluZSBpcworICAgc3RydWN0dXJlZCByb3VnaGx5IGFzIGZvbGxvd3M6CisKKyAgICBmb3IgKDs7KSBzd2l0Y2ggKHN0YXRlKSB7CisgICAgLi4uCisgICAgY2FzZSBTVEFURW46CisgICAgICAgIGlmIChub3QgZW5vdWdoIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlIHRvIG1ha2UgcHJvZ3Jlc3MpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC4uLiBtYWtlIHByb2dyZXNzIC4uLgorICAgICAgICBzdGF0ZSA9IFNUQVRFbTsKKyAgICAgICAgYnJlYWs7CisgICAgLi4uCisgICAgfQorCisgICBzbyB3aGVuIGluZmxhdGUoKSBpcyBjYWxsZWQgYWdhaW4sIHRoZSBzYW1lIGNhc2UgaXMgYXR0ZW1wdGVkIGFnYWluLCBhbmQKKyAgIGlmIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZXMgYXJlIHByb3ZpZGVkLCB0aGUgbWFjaGluZSBwcm9jZWVkcyB0byB0aGUKKyAgIG5leHQgc3RhdGUuICBUaGUgTkVFREJJVFMoKSBtYWNybyBpcyB1c3VhbGx5IHRoZSB3YXkgdGhlIHN0YXRlIGV2YWx1YXRlcworICAgd2hldGhlciBpdCBjYW4gcHJvY2VlZCBvciBzaG91bGQgcmV0dXJuLiAgTkVFREJJVFMoKSBkb2VzIHRoZSByZXR1cm4gaWYKKyAgIHRoZSByZXF1ZXN0ZWQgYml0cyBhcmUgbm90IGF2YWlsYWJsZS4gIFRoZSB0eXBpY2FsIHVzZSBvZiB0aGUgQklUUyBtYWNyb3MKKyAgIGlzOgorCisgICAgICAgIE5FRURCSVRTKG4pOworICAgICAgICAuLi4gZG8gc29tZXRoaW5nIHdpdGggQklUUyhuKSAuLi4KKyAgICAgICAgRFJPUEJJVFMobik7CisKKyAgIHdoZXJlIE5FRURCSVRTKG4pIGVpdGhlciByZXR1cm5zIGZyb20gaW5mbGF0ZSgpIGlmIHRoZXJlIGlzbid0IGVub3VnaAorICAgaW5wdXQgbGVmdCB0byBsb2FkIG4gYml0cyBpbnRvIHRoZSBhY2N1bXVsYXRvciwgb3IgaXQgY29udGludWVzLiAgQklUUyhuKQorICAgZ2l2ZXMgdGhlIGxvdyBuIGJpdHMgaW4gdGhlIGFjY3VtdWxhdG9yLiAgV2hlbiBkb25lLCBEUk9QQklUUyhuKSBkcm9wcworICAgdGhlIGxvdyBuIGJpdHMgb2ZmIHRoZSBhY2N1bXVsYXRvci4gIElOSVRCSVRTKCkgY2xlYXJzIHRoZSBhY2N1bXVsYXRvcgorICAgYW5kIHNldHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYml0cyB0byB6ZXJvLiAgQllURUJJVFMoKSBkaXNjYXJkcyBqdXN0CisgICBlbm91Z2ggYml0cyB0byBwdXQgdGhlIGFjY3VtdWxhdG9yIG9uIGEgYnl0ZSBib3VuZGFyeS4gIEFmdGVyIEJZVEVCSVRTKCkKKyAgIGFuZCBhIE5FRURCSVRTKDgpLCB0aGVuIEJJVFMoOCkgd291bGQgcmV0dXJuIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbS4KKworICAgTkVFREJJVFMobikgdXNlcyBQVUxMQllURSgpIHRvIGdldCBhbiBhdmFpbGFibGUgYnl0ZSBvZiBpbnB1dCwgb3IgdG8gcmV0dXJuCisgICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICBUaGUgZGVjb2Rpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGNvZGVzIHVzZXMKKyAgIFBVTExCWVRFKCkgZGlyZWN0bHkgaW4gb3JkZXIgdG8gcHVsbCBqdXN0IGVub3VnaCBieXRlcyB0byBkZWNvZGUgdGhlIG5leHQKKyAgIGNvZGUsIGFuZCBubyBtb3JlLgorCisgICBTb21lIHN0YXRlcyBsb29wIHVudGlsIHRoZXkgZ2V0IGVub3VnaCBpbnB1dCwgbWFraW5nIHN1cmUgdGhhdCBlbm91Z2gKKyAgIHN0YXRlIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgdG8gY29udGludWUgdGhlIGxvb3Agd2hlcmUgaXQgbGVmdCBvZmYKKyAgIGlmIE5FRURCSVRTKCkgcmV0dXJucyBpbiB0aGUgbG9vcC4gIEZvciBleGFtcGxlLCB3YW50LCBuZWVkLCBhbmQga2VlcAorICAgd291bGQgYWxsIGhhdmUgdG8gYWN0dWFsbHkgYmUgcGFydCBvZiB0aGUgc2F2ZWQgc3RhdGUgaW4gY2FzZSBORUVEQklUUygpCisgICByZXR1cm5zOgorCisgICAgY2FzZSBTVEFURXc6CisgICAgICAgIHdoaWxlICh3YW50IDwgbmVlZCkgeworICAgICAgICAgICAgTkVFREJJVFMobik7CisgICAgICAgICAgICBrZWVwW3dhbnQrK10gPSBCSVRTKG4pOworICAgICAgICAgICAgRFJPUEJJVFMobik7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUgPSBTVEFURXg7CisgICAgY2FzZSBTVEFURXg6CisKKyAgIEFzIHNob3duIGFib3ZlLCBpZiB0aGUgbmV4dCBzdGF0ZSBpcyBhbHNvIHRoZSBuZXh0IGNhc2UsIHRoZW4gdGhlIGJyZWFrCisgICBpcyBvbWl0dGVkLgorCisgICBBIHN0YXRlIG1heSBhbHNvIHJldHVybiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSBhdmFpbGFibGUgdG8KKyAgIGNvbXBsZXRlIHRoYXQgc3RhdGUuICBUaG9zZSBzdGF0ZXMgYXJlIGNvcHlpbmcgc3RvcmVkIGRhdGEsIHdyaXRpbmcgYQorICAgbGl0ZXJhbCBieXRlLCBhbmQgY29weWluZyBhIG1hdGNoaW5nIHN0cmluZy4KKworICAgV2hlbiByZXR1cm5pbmcsIGEgImdvdG8gaW5mX2xlYXZlIiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgdG90YWwgY291bnRlcnMsCisgICB1cGRhdGUgdGhlIGNoZWNrIHZhbHVlLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgYW55IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKKyAgIGR1cmluZyB0aGF0IGluZmxhdGUoKSBjYWxsIGluIG9yZGVyIHRvIHJldHVybiB0aGUgcHJvcGVyIHJldHVybiBjb2RlLgorICAgUHJvZ3Jlc3MgaXMgZGVmaW5lZCBhcyBhIGNoYW5nZSBpbiBlaXRoZXIgc3RybS0+YXZhaWxfaW4gb3Igc3RybS0+YXZhaWxfb3V0LgorICAgV2hlbiB0aGVyZSBpcyBhIHdpbmRvdywgZ290byBpbmZfbGVhdmUgd2lsbCB1cGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0CisgICBvdXRwdXQgd3JpdHRlbi4gIElmIGEgZ290byBpbmZfbGVhdmUgb2NjdXJzIGluIHRoZSBtaWRkbGUgb2YgZGVjb21wcmVzc2lvbgorICAgYW5kIHRoZXJlIGlzIG5vIHdpbmRvdyBjdXJyZW50bHksIGdvdG8gaW5mX2xlYXZlIHdpbGwgY3JlYXRlIG9uZSBhbmQgY29weQorICAgb3V0cHV0IHRvIHRoZSB3aW5kb3cgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgorCisgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBvbmx5IGFmZmVjdHMgdGhlCisgICByZXR1cm4gY29kZSAocGVyIHpsaWIuaCkuICBpbmZsYXRlKCkgYWx3YXlzIHdyaXRlcyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvCisgICBzdHJtLT5uZXh0X291dCwgZ2l2ZW4gdGhlIHNwYWNlIGF2YWlsYWJsZSBhbmQgdGhlIHByb3ZpZGVkIGlucHV0LS10aGUgZWZmZWN0CisgICBkb2N1bWVudGVkIGluIHpsaWIuaCBvZiBaX1NZTkNfRkxVU0guICBGdXJ0aGVybW9yZSwgaW5mbGF0ZSgpIGFsd2F5cyBkZWZlcnMKKyAgIHRoZSBhbGxvY2F0aW9uIG9mIGFuZCBjb3B5aW5nIGludG8gYSBzbGlkaW5nIHdpbmRvdyB1bnRpbCBuZWNlc3NhcnksIHdoaWNoCisgICBwcm92aWRlcyB0aGUgZWZmZWN0IGRvY3VtZW50ZWQgaW4gemxpYi5oIGZvciBaX0ZJTklTSCB3aGVuIHRoZSBlbnRpcmUgaW5wdXQKKyAgIHN0cmVhbSBhdmFpbGFibGUuICBTbyB0aGUgb25seSB0aGluZyB0aGUgZmx1c2ggcGFyYW1ldGVyIGFjdHVhbGx5IGRvZXMgaXM6CisgICB3aGVuIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgaW5mbGF0ZSgpIGNhbm5vdCByZXR1cm4gWl9PSy4gIEluc3RlYWQgaXQKKyAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIGl0IGhhcyBub3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgKi8KKworaW50IFpFWFBPUlQgaW5mbGF0ZShzdHJtLCBmbHVzaCkKK3pfc3RyZWFtcCBzdHJtOworaW50IGZsdXNoOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY2hhciBGQVIgKm5leHQ7ICAgIC8qIG5leHQgaW5wdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqcHV0OyAgICAgLyogbmV4dCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBoYXZlLCBsZWZ0OyAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBpbiwgb3V0OyAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCisgICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KKyAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyNpZmRlZiBHVU5aSVAKKyAgICB1bnNpZ25lZCBjaGFyIGhidWZbNF07ICAgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi8KKyNlbmRpZgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKKyAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gVFlQRSkgc3RhdGUtPm1vZGUgPSBUWVBFRE87ICAgICAgLyogc2tpcCBjaGVjayAqLworICAgIExPQUQoKTsKKyAgICBpbiA9IGhhdmU7CisgICAgb3V0ID0gbGVmdDsKKyAgICByZXQgPSBaX09LOworICAgIGZvciAoOzspCisgICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBIRUFEOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEVETzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgICAgIGlmICgoc3RhdGUtPndyYXAgJiAyKSAmJiBob2xkID09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEZMQUdTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZG9uZSA9IC0xOworICAgICAgICAgICAgaWYgKCEoc3RhdGUtPndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi8KKyNlbHNlCisgICAgICAgICAgICBpZiAoCisjZW5kaWYKKyAgICAgICAgICAgICAgICAoKEJJVFMoOCkgPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEJJVFMoNCkgIT0gWl9ERUZMQVRFRCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDQpOworICAgICAgICAgICAgbGVuID0gQklUUyg0KSArIDg7CisgICAgICAgICAgICBpZiAobGVuID4gc3RhdGUtPndiaXRzKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCB3aW5kb3cgc2l6ZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZG1heCA9IDFVIDw8IGxlbjsKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICB6bGliIGhlYWRlciBva1xuIikpOworICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIEdVTlpJUAorICAgICAgICBjYXNlIEZMQUdTOgorICAgICAgICAgICAgTkVFREJJVFMoMTYpOworICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gKGludCkoaG9sZCk7CisgICAgICAgICAgICBpZiAoKHN0YXRlLT5mbGFncyAmIDB4ZmYpICE9IFpfREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHhlMDAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnRleHQgPSAoaW50KSgoaG9sZCA+PiA4KSAmIDEpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVElNRTsKKyAgICAgICAgY2FzZSBUSU1FOgorICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+dGltZSA9IGhvbGQ7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkM0KHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBPUzsKKyAgICAgICAgY2FzZSBPUzoKKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+eGZsYWdzID0gKGludCkoaG9sZCAmIDB4ZmYpOworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5vcyA9IChpbnQpKGhvbGQgPj4gOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBFWExFTjsKKyAgICAgICAgY2FzZSBFWExFTjoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA0MDApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCkoaG9sZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhX2xlbiA9ICh1bnNpZ25lZClob2xkOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYSA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRVhUUkE7CisgICAgICAgIGNhc2UgRVhUUkE6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwNDAwKSB7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+aGVhZC0+ZXh0cmFfbGVuIC0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPmhlYWQtPmV4dHJhICsgbGVuLCBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKyBjb3B5ID4gc3RhdGUtPmhlYWQtPmV4dHJhX21heCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGgpIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE5BTUU7CisgICAgICAgIGNhc2UgTkFNRToKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA4MDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+bmFtZV9tYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZVtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lID0gWl9OVUxMOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPTU1FTlQ7CisgICAgICAgIGNhc2UgQ09NTUVOVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDEwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+Y29tbV9tYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudFtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ID0gWl9OVUxMOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBIQ1JDOworICAgICAgICBjYXNlIEhDUkM6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMTYpOworICAgICAgICAgICAgICAgIGlmIChob2xkICE9IChzdGF0ZS0+Y2hlY2sgJiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImhlYWRlciBjcmMgbWlzbWF0Y2giOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmhjcmMgPSAoaW50KSgoc3RhdGUtPmZsYWdzID4+IDkpICYgMSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmRvbmUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgRElDVElEOgorICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBSRVZFUlNFKGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElDVDsKKyAgICAgICAgY2FzZSBESUNUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlZGljdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfQkxPQ0spIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIFRZUEVETzoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDSEVDSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsgICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRBQkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYmxvY2sgdHlwZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUT1JFRDoKKyAgICAgICAgICAgIEJZVEVCSVRTKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT0gKChob2xkID4+IDE2KSBeIDB4ZmZmZikpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpaG9sZCAmIDB4ZmZmZjsKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCkpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09QWTsKKyAgICAgICAgY2FzZSBDT1BZOgorICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7CisgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgIG5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgcHV0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKKyAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OworICAgICAgICAgICAgRFJPUEJJVFMoNCk7CisjaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOTEVOUzsKKyAgICAgICAgY2FzZSBMRU5MRU5TOgorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDc7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT0RFTEVOUzsKKyAgICAgICAgY2FzZSBDT0RFTEVOUzoKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IHRoaXMudmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsID09IDE3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgc3RhdGUtPm5sZW4sICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmRpc3RiaXRzID0gNjsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zICsgc3RhdGUtPm5sZW4sIHN0YXRlLT5uZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5uZXh0KSwgJihzdGF0ZS0+ZGlzdGJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZXMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICBjYXNlIExFTjoKKyAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKKyAgICAgICAgICAgICAgICBSRVNUT1JFKCk7CisgICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIG91dCk7CisgICAgICAgICAgICAgICAgTE9BRCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMub3AgJiYgKHRoaXMub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IHRoaXM7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyB0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpdGhpcy52YWw7CisgICAgICAgICAgICBpZiAoKGludCkodGhpcy5vcCkgPT0gMCkgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdGhpcy52YWwgPj0gMHgyMCAmJiB0aGlzLnZhbCA8IDB4N2YgPworICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCB0aGlzLnZhbCkpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTElUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMub3AgJiAzMikgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKHRoaXMub3ApICYgMTU7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkVYVDsKKyAgICAgICAgY2FzZSBMRU5FWFQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcbiIsIHN0YXRlLT5sZW5ndGgpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVDsKKyAgICAgICAgY2FzZSBESVNUOgorICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+ZGlzdGNvZGVbQklUUyhzdGF0ZS0+ZGlzdGJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHRoaXMub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IHRoaXM7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5vZmZzZXQgPSAodW5zaWduZWQpdGhpcy52YWw7CisgICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKHRoaXMub3ApICYgMTU7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJU1RFWFQ7CisgICAgICAgIGNhc2UgRElTVEVYVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5vZmZzZXQgKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICB9CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPmRtYXgpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPndoYXZlICsgb3V0IC0gbGVmdCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIHN0YXRlLT5vZmZzZXQpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTUFUQ0g7CisgICAgICAgIGNhc2UgTUFUQ0g6CisgICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgIGNvcHkgPSBvdXQgLSBsZWZ0OworICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+b2Zmc2V0IC0gY29weTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT53cml0ZSkgeworICAgICAgICAgICAgICAgICAgICBjb3B5IC09IHN0YXRlLT53cml0ZTsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHN0YXRlLT53aW5kb3cgKyAoc3RhdGUtPndzaXplIC0gY29weSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHN0YXRlLT53aW5kb3cgKyAoc3RhdGUtPndyaXRlIC0gY29weSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+bGVuZ3RoKSBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUtPm9mZnNldDsKKyAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKnB1dCsrID0gKmZyb20rKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbmd0aCA9PSAwKSBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExJVDoKKyAgICAgICAgICAgIGlmIChsZWZ0ID09IDApIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgKnB1dCsrID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlLT5sZW5ndGgpOworICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDSEVDSzoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgICAgICBvdXQgLT0gbGVmdDsKKyAgICAgICAgICAgICAgICBzdHJtLT50b3RhbF9vdXQgKz0gb3V0OworICAgICAgICAgICAgICAgIHN0YXRlLT50b3RhbCArPSBvdXQ7CisgICAgICAgICAgICAgICAgaWYgKG91dCkKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFKHN0YXRlLT5jaGVjaywgcHV0IC0gb3V0LCBvdXQpOworICAgICAgICAgICAgICAgIG91dCA9IGxlZnQ7CisgICAgICAgICAgICAgICAgaWYgKCgKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5mbGFncyA/IGhvbGQgOgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICBSRVZFUlNFKGhvbGQpKSAhPSBzdGF0ZS0+Y2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGRhdGEgY2hlY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxuIikpOworICAgICAgICAgICAgfQorI2lmZGVmIEdVTlpJUAorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5HVEg7CisgICAgICAgIGNhc2UgTEVOR1RIOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwICYmIHN0YXRlLT5mbGFncykgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKKyAgICAgICAgICAgICAgICBpZiAoaG9sZCAhPSAoc3RhdGUtPnRvdGFsICYgMHhmZmZmZmZmZlVMKSkgeworICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXG4iKSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRE9ORTsKKyAgICAgICAgY2FzZSBET05FOgorICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOworICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisgICAgICAgIGNhc2UgQkFEOgorICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisgICAgICAgIGNhc2UgTUVNOgorICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgICAgICBjYXNlIFNZTkM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgICAgIH0KKworICAgIC8qCisgICAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuCisgICAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlcgorICAgICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLgorICAgICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS4KKyAgICAgKi8KKyAgaW5mX2xlYXZlOgorICAgIFJFU1RPUkUoKTsKKyAgICBpZiAoc3RhdGUtPndzaXplIHx8IChzdGF0ZS0+bW9kZSA8IENIRUNLICYmIG91dCAhPSBzdHJtLT5hdmFpbF9vdXQpKQorICAgICAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIG91dCkpIHsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTUVNOworICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgICAgICB9CisgICAgaW4gLT0gc3RybS0+YXZhaWxfaW47CisgICAgb3V0IC09IHN0cm0tPmF2YWlsX291dDsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBpbjsKKyAgICBzdHJtLT50b3RhbF9vdXQgKz0gb3V0OworICAgIHN0YXRlLT50b3RhbCArPSBvdXQ7CisgICAgaWYgKHN0YXRlLT53cmFwICYmIG91dCkKKyAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPQorICAgICAgICAgICAgVVBEQVRFKHN0YXRlLT5jaGVjaywgc3RybS0+bmV4dF9vdXQgLSBvdXQsIG91dCk7CisgICAgc3RybS0+ZGF0YV90eXBlID0gc3RhdGUtPmJpdHMgKyAoc3RhdGUtPmxhc3QgPyA2NCA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gVFlQRSA/IDEyOCA6IDApOworICAgIGlmICgoKGluID09IDAgJiYgb3V0ID09IDApIHx8IGZsdXNoID09IFpfRklOSVNIKSAmJiByZXQgPT0gWl9PSykKKyAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUVuZChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgWkZSRUUoc3RybSwgc3RhdGUtPndpbmRvdyk7CisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpCit6X3N0cmVhbXAgc3RybTsKK2NvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OwordUludCBkaWN0TGVuZ3RoOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgbG9uZyBpZDsKKworICAgIC8qIGNoZWNrIHN0YXRlICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmIChzdGF0ZS0+d3JhcCAhPSAwICYmIHN0YXRlLT5tb2RlICE9IERJQ1QpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWQgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gRElDVCkgeworICAgICAgICBpZCA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgIGlkID0gYWRsZXIzMihpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7CisgICAgICAgIGlmIChpZCAhPSBzdGF0ZS0+Y2hlY2spCisgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIH0KKworICAgIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgKi8KKyAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0tPmF2YWlsX291dCkpIHsKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgaWYgKGRpY3RMZW5ndGggPiBzdGF0ZS0+d3NpemUpIHsKKyAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93LCBkaWN0aW9uYXJ5ICsgZGljdExlbmd0aCAtIHN0YXRlLT53c2l6ZSwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d3NpemUgLSBkaWN0TGVuZ3RoLCBkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgIGRpY3RMZW5ndGgpOworICAgICAgICBzdGF0ZS0+d2hhdmUgPSBkaWN0TGVuZ3RoOworICAgIH0KKyAgICBzdGF0ZS0+aGF2ZWRpY3QgPSAxOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxuIikpOworICAgIHJldHVybiBaX09LOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpCit6X3N0cmVhbXAgc3RybTsKK2d6X2hlYWRlcnAgaGVhZDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgLyogY2hlY2sgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKChzdGF0ZS0+d3JhcCAmIDIpID09IDApIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqLworICAgIHN0YXRlLT5oZWFkID0gaGVhZDsKKyAgICBoZWFkLT5kb25lID0gMDsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFNlYXJjaCBidWZbMC4ubGVuLTFdIGZvciB0aGUgcGF0dGVybjogMCwgMCwgMHhmZiwgMHhmZi4gIFJldHVybiB3aGVuIGZvdW5kCisgICBvciB3aGVuIG91dCBvZiBpbnB1dC4gIFdoZW4gY2FsbGVkLCAqaGF2ZSBpcyB0aGUgbnVtYmVyIG9mIHBhdHRlcm4gYnl0ZXMKKyAgIGZvdW5kIGluIG9yZGVyIHNvIGZhciwgaW4gMC4uMy4gIE9uIHJldHVybiAqaGF2ZSBpcyB1cGRhdGVkIHRvIHRoZSBuZXcKKyAgIHN0YXRlLiAgSWYgb24gcmV0dXJuICpoYXZlIGVxdWFscyBmb3VyLCB0aGVuIHRoZSBwYXR0ZXJuIHdhcyBmb3VuZCBhbmQgdGhlCisgICByZXR1cm4gdmFsdWUgaXMgaG93IG1hbnkgYnl0ZXMgd2VyZSByZWFkIGluY2x1ZGluZyB0aGUgbGFzdCBieXRlIG9mIHRoZQorICAgcGF0dGVybi4gIElmICpoYXZlIGlzIGxlc3MgdGhhbiBmb3VyLCB0aGVuIHRoZSBwYXR0ZXJuIGhhcyBub3QgYmVlbiBmb3VuZAorICAgeWV0IGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGxlbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc3luY3NlYXJjaCgpIGNhbiBiZQorICAgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBkYXRhIGFuZCB0aGUgKmhhdmUgc3RhdGUuICAqaGF2ZSBpcyBpbml0aWFsaXplZCB0bworICAgemVybyBmb3IgdGhlIGZpcnN0IGNhbGwuCisgKi8KK2xvY2FsIHVuc2lnbmVkIHN5bmNzZWFyY2goaGF2ZSwgYnVmLCBsZW4pCit1bnNpZ25lZCBGQVIgKmhhdmU7Cit1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOwordW5zaWduZWQgbGVuOworeworICAgIHVuc2lnbmVkIGdvdDsKKyAgICB1bnNpZ25lZCBuZXh0OworCisgICAgZ290ID0gKmhhdmU7CisgICAgbmV4dCA9IDA7CisgICAgd2hpbGUgKG5leHQgPCBsZW4gJiYgZ290IDwgNCkgeworICAgICAgICBpZiAoKGludCkoYnVmW25leHRdKSA9PSAoZ290IDwgMiA/IDAgOiAweGZmKSkKKyAgICAgICAgICAgIGdvdCsrOworICAgICAgICBlbHNlIGlmIChidWZbbmV4dF0pCisgICAgICAgICAgICBnb3QgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3QgPSA0IC0gZ290OworICAgICAgICBuZXh0Kys7CisgICAgfQorICAgICpoYXZlID0gZ290OworICAgIHJldHVybiBuZXh0OworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlU3luYyhzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB0byBsb29rIGF0IG9yIGxvb2tlZCBhdCAqLworICAgIHVuc2lnbmVkIGxvbmcgaW4sIG91dDsgICAgICAvKiB0ZW1wb3JhcnkgdG8gc2F2ZSB0b3RhbF9pbiBhbmQgdG90YWxfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciBidWZbNF07ICAgICAgIC8qIHRvIHJlc3RvcmUgYml0IGJ1ZmZlciB0byBieXRlIHN0cmluZyAqLworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwICYmIHN0YXRlLT5iaXRzIDwgOCkgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgLyogaWYgZmlyc3QgdGltZSwgc3RhcnQgc2VhcmNoIGluIGJpdCBidWZmZXIgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gU1lOQykgeworICAgICAgICBzdGF0ZS0+bW9kZSA9IFNZTkM7CisgICAgICAgIHN0YXRlLT5ob2xkIDw8PSBzdGF0ZS0+Yml0cyAmIDc7CisgICAgICAgIHN0YXRlLT5iaXRzIC09IHN0YXRlLT5iaXRzICYgNzsKKyAgICAgICAgbGVuID0gMDsKKyAgICAgICAgd2hpbGUgKHN0YXRlLT5iaXRzID49IDgpIHsKKyAgICAgICAgICAgIGJ1ZltsZW4rK10gPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmhvbGQpOworICAgICAgICAgICAgc3RhdGUtPmhvbGQgPj49IDg7CisgICAgICAgICAgICBzdGF0ZS0+Yml0cyAtPSA4OworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgc3luY3NlYXJjaCgmKHN0YXRlLT5oYXZlKSwgYnVmLCBsZW4pOworICAgIH0KKworICAgIC8qIHNlYXJjaCBhdmFpbGFibGUgaW5wdXQgKi8KKyAgICBsZW4gPSBzeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBzdHJtLT5uZXh0X2luLCBzdHJtLT5hdmFpbF9pbik7CisgICAgc3RybS0+YXZhaWxfaW4gLT0gbGVuOworICAgIHN0cm0tPm5leHRfaW4gKz0gbGVuOworICAgIHN0cm0tPnRvdGFsX2luICs9IGxlbjsKKworICAgIC8qIHJldHVybiBubyBqb3kgb3Igc2V0IHVwIHRvIHJlc3RhcnQgaW5mbGF0ZSgpIG9uIGEgbmV3IGJsb2NrICovCisgICAgaWYgKHN0YXRlLT5oYXZlICE9IDQpIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgaW4gPSBzdHJtLT50b3RhbF9pbjsgIG91dCA9IHN0cm0tPnRvdGFsX291dDsKKyAgICBpbmZsYXRlUmVzZXQoc3RybSk7CisgICAgc3RybS0+dG90YWxfaW4gPSBpbjsgIHN0cm0tPnRvdGFsX291dCA9IG91dDsKKyAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qCisgICBSZXR1cm5zIHRydWUgaWYgaW5mbGF0ZSBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGdlbmVyYXRlZCBieQorICAgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IG9uZSBQUFAKKyAgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbCBzYWZldHkgY2hlY2suIFBQUCB1c2VzCisgICBaX1NZTkNfRkxVU0ggYnV0IHJlbW92ZXMgdGhlIGxlbmd0aCBieXRlcyBvZiB0aGUgcmVzdWx0aW5nIGVtcHR5IHN0b3JlZAorICAgYmxvY2suIFdoZW4gZGVjb21wcmVzc2luZywgUFBQIGNoZWNrcyB0aGF0IGF0IHRoZSBlbmQgb2YgaW5wdXQgcGFja2V0LAorICAgaW5mbGF0ZSBpcyB3YWl0aW5nIGZvciB0aGVzZSBsZW5ndGggYnl0ZXMuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IFNUT1JFRCAmJiBzdGF0ZS0+Yml0cyA9PSAwOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlQ29weShkZXN0LCBzb3VyY2UpCit6X3N0cmVhbXAgZGVzdDsKK3pfc3RyZWFtcCBzb3VyY2U7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKmNvcHk7CisgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdzsKKyAgICB1bnNpZ25lZCB3c2l6ZTsKKworICAgIC8qIGNoZWNrIGlucHV0ICovCisgICAgaWYgKGRlc3QgPT0gWl9OVUxMIHx8IHNvdXJjZSA9PSBaX05VTEwgfHwgc291cmNlLT5zdGF0ZSA9PSBaX05VTEwgfHwKKyAgICAgICAgc291cmNlLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCB8fCBzb3VyY2UtPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXNvdXJjZS0+c3RhdGU7CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSAqLworICAgIGNvcHkgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopCisgICAgICAgICAgIFpBTExPQyhzb3VyY2UsIDEsIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOworICAgIGlmIChjb3B5ID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIHdpbmRvdyA9IFpfTlVMTDsKKyAgICBpZiAoc3RhdGUtPndpbmRvdyAhPSBaX05VTEwpIHsKKyAgICAgICAgd2luZG93ID0gKHVuc2lnbmVkIGNoYXIgRkFSICopCisgICAgICAgICAgICAgICAgIFpBTExPQyhzb3VyY2UsIDFVIDw8IHN0YXRlLT53Yml0cywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKKyAgICAgICAgaWYgKHdpbmRvdyA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgIFpGUkVFKHNvdXJjZSwgY29weSk7CisgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb3B5IHN0YXRlICovCisgICAgem1lbWNweShkZXN0LCBzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOworICAgIHptZW1jcHkoY29weSwgc3RhdGUsIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOworICAgIGlmIChzdGF0ZS0+bGVuY29kZSA+PSBzdGF0ZS0+Y29kZXMgJiYKKyAgICAgICAgc3RhdGUtPmxlbmNvZGUgPD0gc3RhdGUtPmNvZGVzICsgRU5PVUdIIC0gMSkgeworICAgICAgICBjb3B5LT5sZW5jb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmxlbmNvZGUgLSBzdGF0ZS0+Y29kZXMpOworICAgICAgICBjb3B5LT5kaXN0Y29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5kaXN0Y29kZSAtIHN0YXRlLT5jb2Rlcyk7CisgICAgfQorICAgIGNvcHktPm5leHQgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+bmV4dCAtIHN0YXRlLT5jb2Rlcyk7CisgICAgaWYgKHdpbmRvdyAhPSBaX05VTEwpIHsKKyAgICAgICAgd3NpemUgPSAxVSA8PCBzdGF0ZS0+d2JpdHM7CisgICAgICAgIHptZW1jcHkod2luZG93LCBzdGF0ZS0+d2luZG93LCB3c2l6ZSk7CisgICAgfQorICAgIGNvcHktPndpbmRvdyA9IHdpbmRvdzsKKyAgICBkZXN0LT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopY29weTsKKyAgICByZXR1cm4gWl9PSzsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZmxhdGUuaCBiL3Vzci9rbGliYy96bGliL2luZmxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JkM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvaW5mbGF0ZS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKiBpbmZsYXRlLmggLS0gaW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIGRlZmluZSBOT19HWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGRlY29kaW5nIGJ5IGluZmxhdGUoKS4gIE5PX0daSVAgd291bGQgYmUgdXNlZCB0byBhdm9pZCBsaW5raW5nIGluCisgICB0aGUgY3JjIGNvZGUgd2hlbiBpdCBpcyBub3QgbmVlZGVkLiAgRm9yIHNoYXJlZCBsaWJyYXJpZXMsIGd6aXAgZGVjb2RpbmcKKyAgIHNob3VsZCBiZSBsZWZ0IGVuYWJsZWQuICovCisjaWZuZGVmIE5PX0daSVAKKyMgIGRlZmluZSBHVU5aSVAKKyNlbmRpZgorCisvKiBQb3NzaWJsZSBpbmZsYXRlIG1vZGVzIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzICovCit0eXBlZGVmIGVudW0geworICAgIEhFQUQsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqLworICAgIEZMQUdTLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovCisgICAgVElNRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovCisgICAgT1MsICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovCisgICAgRVhMRU4sICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgbGVuZ3RoIChnemlwKSAqLworICAgIEVYVFJBLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqLworICAgIE5BTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovCisgICAgQ09NTUVOVCwgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovCisgICAgSENSQywgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi8KKyAgICBESUNUSUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovCisgICAgRElDVCwgICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovCisgICAgICAgIFRZUEUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi8KKyAgICAgICAgVFlQRURPLCAgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqLworICAgICAgICBTVE9SRUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqLworICAgICAgICBDT1BZLCAgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqLworICAgICAgICBUQUJMRSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgTEVOTEVOUywgICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgICAgIENPREVMRU5TLCAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAgICAgTEVOLCAgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBjb2RlICovCisgICAgICAgICAgICBMRU5FWFQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqLworICAgICAgICAgICAgRElTVCwgICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgRElTVEVYVCwgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgTUFUQ0gsICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovCisgICAgICAgICAgICBMSVQsICAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqLworICAgIENIRUNLLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBjaGVjayB2YWx1ZSAqLworICAgIExFTkdUSCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovCisgICAgRE9ORSwgICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBCQUQsICAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgTUVNLCAgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBTWU5DICAgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi8KK30gaW5mbGF0ZV9tb2RlOworCisvKgorICAgIFN0YXRlIHRyYW5zaXRpb25zIGJldHdlZW4gYWJvdmUgbW9kZXMgLQorCisgICAgKG1vc3QgbW9kZXMgY2FuIGdvIHRvIHRoZSBCQUQgb3IgTUVNIG1vZGUgLS0gbm90IHNob3duIGZvciBjbGFyaXR5KQorCisgICAgUHJvY2VzcyBoZWFkZXI6CisgICAgICAgIEhFQUQgLT4gKGd6aXApIG9yICh6bGliKQorICAgICAgICAoZ3ppcCkgLT4gRkxBR1MgLT4gVElNRSAtPiBPUyAtPiBFWExFTiAtPiBFWFRSQSAtPiBOQU1FCisgICAgICAgIE5BTUUgLT4gQ09NTUVOVCAtPiBIQ1JDIC0+IFRZUEUKKyAgICAgICAgKHpsaWIpIC0+IERJQ1RJRCBvciBUWVBFCisgICAgICAgIERJQ1RJRCAtPiBESUNUIC0+IFRZUEUKKyAgICBSZWFkIGRlZmxhdGUgYmxvY2tzOgorICAgICAgICAgICAgVFlQRSAtPiBTVE9SRUQgb3IgVEFCTEUgb3IgTEVOIG9yIENIRUNLCisgICAgICAgICAgICBTVE9SRUQgLT4gQ09QWSAtPiBUWVBFCisgICAgICAgICAgICBUQUJMRSAtPiBMRU5MRU5TIC0+IENPREVMRU5TIC0+IExFTgorICAgIFJlYWQgZGVmbGF0ZSBjb2RlczoKKyAgICAgICAgICAgICAgICBMRU4gLT4gTEVORVhUIG9yIExJVCBvciBUWVBFCisgICAgICAgICAgICAgICAgTEVORVhUIC0+IERJU1QgLT4gRElTVEVYVCAtPiBNQVRDSCAtPiBMRU4KKyAgICAgICAgICAgICAgICBMSVQgLT4gTEVOCisgICAgUHJvY2VzcyB0cmFpbGVyOgorICAgICAgICBDSEVDSyAtPiBMRU5HVEggLT4gRE9ORQorICovCisKKy8qIHN0YXRlIG1haW50YWluZWQgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMuICBBcHByb3hpbWF0ZWx5IDdLIGJ5dGVzLiAqLworc3RydWN0IGluZmxhdGVfc3RhdGUgeworICAgIGluZmxhdGVfbW9kZSBtb2RlOyAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqLworICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqLworICAgIGludCB3cmFwOyAgICAgICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCisgICAgaW50IGhhdmVkaWN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqLworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovCisgICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovCisgICAgdW5zaWduZWQgbG9uZyBjaGVjazsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovCisgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqLworICAgIGd6X2hlYWRlcnAgaGVhZDsgICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovCisgICAgICAgIC8qIHNsaWRpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2JpdHM7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovCisgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCisgICAgdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLworICAgICAgICAvKiBiaXQgYWNjdW11bGF0b3IgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluICJpbiIgKi8KKyAgICAgICAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi8KKyAgICB1bnNpZ25lZCBsZW5ndGg7ICAgICAgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCisgICAgdW5zaWduZWQgb2Zmc2V0OyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLworICAgICAgICAvKiBmb3IgdGFibGUgYW5kIGNvZGUgZGVjb2RpbmcgKi8KKyAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KKyAgICAgICAgLyogZml4ZWQgYW5kIGR5bmFtaWMgY29kZSB0YWJsZXMgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqbGVuY29kZTsgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovCisgICAgY29kZSBjb25zdCBGQVIgKmRpc3Rjb2RlOyAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAgIHVuc2lnbmVkIGxlbmJpdHM7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovCisgICAgdW5zaWduZWQgZGlzdGJpdHM7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovCisgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi8KKyAgICB1bnNpZ25lZCBuY29kZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIG5sZW47ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIG5kaXN0OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovCisgICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBsZW5zWzMyMF07ICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHNob3J0IHdvcmtbMjg4XTsgICAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi8KKyAgICBjb2RlIGNvZGVzW0VOT1VHSF07ICAgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovCit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvaW5mdHJlZXMuYyBiL3Vzci9rbGliYy96bGliL2luZnRyZWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5YzEzZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL2luZnRyZWVzLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIGluZnRyZWVzLmMgLS0gZ2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKworI2RlZmluZSBNQVhCSVRTIDE1CisKK2NvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGluZmxhdGUgMS4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBNYXJrIEFkbGVyICI7CisvKgorICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCisgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKKyAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCisgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorICovCisKKy8qCisgICBCdWlsZCBhIHNldCBvZiB0YWJsZXMgdG8gZGVjb2RlIHRoZSBwcm92aWRlZCBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLgorICAgVGhlIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIFRoZSByZXN1bHQgc3RhcnRzIGF0ICp0YWJsZSwKKyAgIHdob3NlIGluZGljZXMgYXJlIDAuLjJeYml0cy0xLiAgd29yayBpcyBhIHdyaXRhYmxlIGFycmF5IG9mIGF0IGxlYXN0CisgICBsZW5zIHNob3J0cywgd2hpY2ggaXMgdXNlZCBhcyBhIHdvcmsgYXJlYS4gIHR5cGUgaXMgdGhlIHR5cGUgb2YgY29kZQorICAgdG8gYmUgZ2VuZXJhdGVkLCBDT0RFUywgTEVOUywgb3IgRElTVFMuICBPbiByZXR1cm4sIHplcm8gaXMgc3VjY2VzcywKKyAgIC0xIGlzIGFuIGludmFsaWQgY29kZSwgYW5kICsxIG1lYW5zIHRoYXQgRU5PVUdIIGlzbid0IGVub3VnaC4gIHRhYmxlCisgICBvbiByZXR1cm4gcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSdzIGFkZHJlc3MuICBiaXRzIGlzIHRoZQorICAgcmVxdWVzdGVkIHJvb3QgdGFibGUgaW5kZXggYml0cywgYW5kIG9uIHJldHVybiBpdCBpcyB0aGUgYWN0dWFsIHJvb3QKKyAgIHRhYmxlIGluZGV4IGJpdHMuICBJdCB3aWxsIGRpZmZlciBpZiB0aGUgcmVxdWVzdCBpcyBncmVhdGVyIHRoYW4gdGhlCisgICBsb25nZXN0IGNvZGUgb3IgaWYgaXQgaXMgbGVzcyB0aGFuIHRoZSBzaG9ydGVzdCBjb2RlLgorICovCitpbnQgaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBjb2RlcywgdGFibGUsIGJpdHMsIHdvcmspCitjb2RldHlwZSB0eXBlOwordW5zaWduZWQgc2hvcnQgRkFSICpsZW5zOwordW5zaWduZWQgY29kZXM7Citjb2RlIEZBUiAqIEZBUiAqdGFibGU7Cit1bnNpZ25lZCBGQVIgKmJpdHM7Cit1bnNpZ25lZCBzaG9ydCBGQVIgKndvcms7Cit7CisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovCisgICAgdW5zaWduZWQgc3ltOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqLworICAgIHVuc2lnbmVkIG1pbiwgbWF4OyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHJvb3Q7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGN1cnI7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGRyb3A7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgdXNlZDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovCisgICAgdW5zaWduZWQgaHVmZjsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqLworICAgIHVuc2lnbmVkIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovCisgICAgdW5zaWduZWQgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovCisgICAgdW5zaWduZWQgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqLworICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KKyAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmJhc2U7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovCisgICAgaW50IGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovCisgICAgdW5zaWduZWQgc2hvcnQgY291bnRbTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGJhc2VbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KKyAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCisgICAgICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCAyMDEsIDE5Nn07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqLworICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCisgICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKKyAgICAgICAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRleHRbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqLworICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMiwKKyAgICAgICAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsCisgICAgICAgIDI4LCAyOCwgMjksIDI5LCA2NCwgNjR9OworCisgICAgLyoKKyAgICAgICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlCisgICAgICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGUKKyAgICAgICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlcgorICAgICAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHMKKyAgICAgICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlcgorICAgICAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoCisgICAgICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkcworICAgICAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGUKKyAgICAgICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2RlcworICAgICAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuCisKKyAgICAgICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpbgorICAgICAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuCisgICAgICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXQKKyAgICAgICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLgorCisgICAgICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLAorICAgICAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZQorICAgICAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZAorICAgICAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieQorICAgICAgIHRoZSBjYWxsZXIuCisKKyAgICAgICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nCisgICAgICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWQKKyAgICAgICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGUKKyAgICAgICBkZWNvZGluZyB0YWJsZXMuCisgICAgICovCisKKyAgICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi8KKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykKKyAgICAgICAgY291bnRbbGVuXSA9IDA7CisgICAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspCisgICAgICAgIGNvdW50W2xlbnNbc3ltXV0rKzsKKworICAgIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovCisgICAgcm9vdCA9ICpiaXRzOworICAgIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKQorICAgICAgICBpZiAoY291bnRbbWF4XSAhPSAwKSBicmVhazsKKyAgICBpZiAocm9vdCA+IG1heCkgcm9vdCA9IG1heDsKKyAgICBpZiAobWF4ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovCisgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLworICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikxOworICAgICAgICB0aGlzLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOworICAgICAgICAqKCp0YWJsZSkrKyA9IHRoaXM7ICAgICAgICAgICAgIC8qIG1ha2UgYSB0YWJsZSB0byBmb3JjZSBhbiBlcnJvciAqLworICAgICAgICAqKCp0YWJsZSkrKyA9IHRoaXM7CisgICAgICAgICpiaXRzID0gMTsKKyAgICAgICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3IgZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovCisgICAgfQorICAgIGZvciAobWluID0gMTsgbWluIDw9IE1BWEJJVFM7IG1pbisrKQorICAgICAgICBpZiAoY291bnRbbWluXSAhPSAwKSBicmVhazsKKyAgICBpZiAocm9vdCA8IG1pbikgcm9vdCA9IG1pbjsKKworICAgIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqLworICAgIGxlZnQgPSAxOworICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7CisgICAgICAgIGxlZnQgPDw9IDE7CisgICAgICAgIGxlZnQgLT0gY291bnRbbGVuXTsKKyAgICAgICAgaWYgKGxlZnQgPCAwKSByZXR1cm4gLTE7ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi8KKyAgICB9CisgICAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09IENPREVTIHx8IG1heCAhPSAxKSkKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqLworCisgICAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi8KKyAgICBvZmZzWzFdID0gMDsKKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTsKKworICAgIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi8KKyAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKKyAgICAgICAgaWYgKGxlbnNbc3ltXSAhPSAwKSB3b3JrW29mZnNbbGVuc1tzeW1dXSsrXSA9ICh1bnNpZ25lZCBzaG9ydClzeW07CisKKyAgICAvKgorICAgICAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZworICAgICAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmCisgICAgICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wCisgICAgICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLAorICAgICAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG8KKyAgICAgICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy4KKworICAgICAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHMKKyAgICAgICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleAorICAgICAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhCisgICAgICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzCisgICAgICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLgorCisgICAgICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGUKKyAgICAgICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aAorICAgICAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlCisgICAgICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLgorCisgICAgICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGUKKyAgICAgICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIHdoZW4gYSBMRU5TIHRhYmxlIGlzIGJlaW5nIG1hZGUKKyAgICAgICBhZ2FpbnN0IHRoZSBzcGFjZSBpbiAqdGFibGUsIEVOT1VHSCwgbWludXMgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIGJ5CisgICAgICAgdGhlIHdvcnN0IGNhc2UgZGlzdGFuY2UgY29kZSwgTUFYRC4gIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IHRoZQorICAgICAgIHN1ZmZpY2llbmN5IG9mIEVOT1VHSCBoYXMgbm90IGJlZW4gcHJvdmVuIGV4aGF1c3RpdmVseSwgaGVuY2UgdGhlIGNoZWNrLgorICAgICAgIFRoaXMgYXNzdW1lcyB0aGF0IHdoZW4gdHlwZSA9PSBMRU5TLCBiaXRzID09IDkuCisKKyAgICAgICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuCisgICAgICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpcworICAgICAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHMKKyAgICAgICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuCisgICAgICovCisKKyAgICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqLworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ09ERVM6CisgICAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqLworICAgICAgICBlbmQgPSAxOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMRU5TOgorICAgICAgICBiYXNlID0gbGJhc2U7CisgICAgICAgIGJhc2UgLT0gMjU3OworICAgICAgICBleHRyYSA9IGxleHQ7CisgICAgICAgIGV4dHJhIC09IDI1NzsKKyAgICAgICAgZW5kID0gMjU2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIERJU1RTICovCisgICAgICAgIGJhc2UgPSBkYmFzZTsKKyAgICAgICAgZXh0cmEgPSBkZXh0OworICAgICAgICBlbmQgPSAtMTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHN0YXRlIGZvciBsb29wICovCisgICAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi8KKyAgICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi8KKyAgICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi8KKyAgICBuZXh0ID0gKnRhYmxlOyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovCisgICAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqLworICAgIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovCisgICAgbG93ID0gKHVuc2lnbmVkKSgtMSk7ICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi8KKyAgICB1c2VkID0gMVUgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqLworICAgIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovCisKKyAgICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi8KKyAgICBpZiAodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIIC0gTUFYRCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi8KKyAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOworICAgICAgICBpZiAoKGludCkod29ya1tzeW1dKSA8IGVuZCkgeworICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKTA7CisgICAgICAgICAgICB0aGlzLnZhbCA9IHdvcmtbc3ltXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaW50KSh3b3JrW3N5bV0pID4gZW5kKSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKGV4dHJhW3dvcmtbc3ltXV0pOworICAgICAgICAgICAgdGhpcy52YWwgPSBiYXNlW3dvcmtbc3ltXV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKDMyICsgNjQpOyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgdGhpcy52YWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSBkcm9wKTsKKyAgICAgICAgZmlsbCA9IDFVIDw8IGN1cnI7CisgICAgICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZpbGwgLT0gaW5jcjsKKyAgICAgICAgICAgIG5leHRbKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IHRoaXM7CisgICAgICAgIH0gd2hpbGUgKGZpbGwgIT0gMCk7CisKKyAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKKyAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQorICAgICAgICAgICAgaW5jciA+Pj0gMTsKKyAgICAgICAgaWYgKGluY3IgIT0gMCkgeworICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKKyAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBodWZmID0gMDsKKworICAgICAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi8KKyAgICAgICAgc3ltKys7CisgICAgICAgIGlmICgtLShjb3VudFtsZW5dKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGVuID09IG1heCkgYnJlYWs7CisgICAgICAgICAgICBsZW4gPSBsZW5zW3dvcmtbc3ltXV07CisgICAgICAgIH0KKworICAgICAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPSBsb3cpIHsKKyAgICAgICAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqLworICAgICAgICAgICAgaWYgKGRyb3AgPT0gMCkKKyAgICAgICAgICAgICAgICBkcm9wID0gcm9vdDsKKworICAgICAgICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqLworICAgICAgICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovCisKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLworICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7CisgICAgICAgICAgICBsZWZ0ID0gKGludCkoMSA8PCBjdXJyKTsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkgeworICAgICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOworICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCisgICAgICAgICAgICB1c2VkICs9IDFVIDw8IGN1cnI7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIIC0gTUFYRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi8KKyAgICAgICAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5vcCA9ICh1bnNpZ25lZCBjaGFyKWN1cnI7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLmJpdHMgPSAodW5zaWduZWQgY2hhcilyb290OworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS52YWwgPSAodW5zaWduZWQgc2hvcnQpKG5leHQgLSAqdGFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgICBGaWxsIGluIHJlc3Qgb2YgdGFibGUgZm9yIGluY29tcGxldGUgY29kZXMuICBUaGlzIGxvb3AgaXMgc2ltaWxhciB0byB0aGUKKyAgICAgICBsb29wIGFib3ZlIGluIGluY3JlbWVudGluZyBodWZmIGZvciB0YWJsZSBpbmRpY2VzLiAgSXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgbGVuIGlzIGVxdWFsIHRvIGN1cnIgKyBkcm9wLCBzbyB0aGVyZSBpcyBubyBsb29wIG5lZWRlZCB0byBpbmNyZW1lbnQKKyAgICAgICB0aHJvdWdoIGhpZ2ggaW5kZXggYml0cy4gIFdoZW4gdGhlIGN1cnJlbnQgc3ViLXRhYmxlIGlzIGZpbGxlZCwgdGhlIGxvb3AKKyAgICAgICBkcm9wcyBiYWNrIHRvIHRoZSByb290IHRhYmxlIHRvIGZpbGwgaW4gYW55IHJlbWFpbmluZyBlbnRyaWVzIHRoZXJlLgorICAgICAqLworICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcik2NDsgICAgICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLworICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKKyAgICB0aGlzLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOworICAgIHdoaWxlIChodWZmICE9IDApIHsKKyAgICAgICAgLyogd2hlbiBkb25lIHdpdGggc3ViLXRhYmxlLCBkcm9wIGJhY2sgdG8gcm9vdCB0YWJsZSAqLworICAgICAgICBpZiAoZHJvcCAhPSAwICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgICBkcm9wID0gMDsKKyAgICAgICAgICAgIGxlbiA9IHJvb3Q7CisgICAgICAgICAgICBuZXh0ID0gKnRhYmxlOworICAgICAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpbGVuOworICAgICAgICB9CisKKyAgICAgICAgLyogcHV0IGludmFsaWQgY29kZSBtYXJrZXIgaW4gdGFibGUgKi8KKyAgICAgICAgbmV4dFtodWZmID4+IGRyb3BdID0gdGhpczsKKworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGh1ZmYgPSAwOworICAgIH0KKworICAgIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqLworICAgICp0YWJsZSArPSB1c2VkOworICAgICpiaXRzID0gcm9vdDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL2luZnRyZWVzLmggYi91c3Iva2xpYmMvemxpYi9pbmZ0cmVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTA0YzgKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi9pbmZ0cmVlcy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIGluZnRyZWVzLmggLS0gaGVhZGVyIHRvIHVzZSBpbmZ0cmVlcy5jCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIFN0cnVjdHVyZSBmb3IgZGVjb2RpbmcgdGFibGVzLiAgRWFjaCBlbnRyeSBwcm92aWRlcyBlaXRoZXIgdGhlCisgICBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZG8gdGhlIG9wZXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIGNvZGUgdGhhdAorICAgaW5kZXhlZCB0aGF0IHRhYmxlIGVudHJ5LCBvciBpdCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gYW5vdGhlcgorICAgdGFibGUgdGhhdCBpbmRleGVzIG1vcmUgYml0cyBvZiB0aGUgY29kZS4gIG9wIGluZGljYXRlcyB3aGV0aGVyCisgICB0aGUgZW50cnkgaXMgYSBwb2ludGVyIHRvIGFub3RoZXIgdGFibGUsIGEgbGl0ZXJhbCwgYSBsZW5ndGggb3IKKyAgIGRpc3RhbmNlLCBhbiBlbmQtb2YtYmxvY2ssIG9yIGFuIGludmFsaWQgY29kZS4gIEZvciBhIHRhYmxlCisgICBwb2ludGVyLCB0aGUgbG93IGZvdXIgYml0cyBvZiBvcCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgb2YKKyAgIHRoYXQgdGFibGUuICBGb3IgYSBsZW5ndGggb3IgZGlzdGFuY2UsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wCisgICBpcyB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gZ2V0IGFmdGVyIHRoZSBjb2RlLiAgYml0cyBpcworICAgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBwYXJ0IG9mIHRoZSBjb2RlIHRvIGRyb3Agb2ZmCisgICBvZiB0aGUgYml0IGJ1ZmZlci4gIHZhbCBpcyB0aGUgYWN0dWFsIGJ5dGUgdG8gb3V0cHV0IGluIHRoZSBjYXNlCisgICBvZiBhIGxpdGVyYWwsIHRoZSBiYXNlIGxlbmd0aCBvciBkaXN0YW5jZSwgb3IgdGhlIG9mZnNldCBmcm9tCisgICB0aGUgY3VycmVudCB0YWJsZSB0byB0aGUgbmV4dCB0YWJsZS4gIEVhY2ggZW50cnkgaXMgZm91ciBieXRlcy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyIG9wOyAgICAgICAgICAgLyogb3BlcmF0aW9uLCBleHRyYSBiaXRzLCB0YWJsZSBiaXRzICovCisgICAgdW5zaWduZWQgY2hhciBiaXRzOyAgICAgICAgIC8qIGJpdHMgaW4gdGhpcyBwYXJ0IG9mIHRoZSBjb2RlICovCisgICAgdW5zaWduZWQgc2hvcnQgdmFsOyAgICAgICAgIC8qIG9mZnNldCBpbiB0YWJsZSBvciBjb2RlIHZhbHVlICovCit9IGNvZGU7CisKKy8qIG9wIHZhbHVlcyBhcyBzZXQgYnkgaW5mbGF0ZV90YWJsZSgpOgorICAgIDAwMDAwMDAwIC0gbGl0ZXJhbAorICAgIDAwMDB0dHR0IC0gdGFibGUgbGluaywgdHR0dCAhPSAwIGlzIHRoZSBudW1iZXIgb2YgdGFibGUgaW5kZXggYml0cworICAgIDAwMDFlZWVlIC0gbGVuZ3RoIG9yIGRpc3RhbmNlLCBlZWVlIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cworICAgIDAxMTAwMDAwIC0gZW5kIG9mIGJsb2NrCisgICAgMDEwMDAwMDAgLSBpbnZhbGlkIGNvZGUKKyAqLworCisvKiBNYXhpbXVtIHNpemUgb2YgZHluYW1pYyB0cmVlLiAgVGhlIG1heGltdW0gZm91bmQgaW4gYSBsb25nIGJ1dCBub24tCisgICBleGhhdXN0aXZlIHNlYXJjaCB3YXMgMTQ0NCBjb2RlIHN0cnVjdHVyZXMgKDg1MiBmb3IgbGVuZ3RoL2xpdGVyYWxzCisgICBhbmQgNTkyIGZvciBkaXN0YW5jZXMsIHRoZSBsYXR0ZXIgYWN0dWFsbHkgdGhlIHJlc3VsdCBvZiBhbgorICAgZXhoYXVzdGl2ZSBzZWFyY2gpLiAgVGhlIHRydWUgbWF4aW11bSBpcyBub3Qga25vd24sIGJ1dCB0aGUgdmFsdWUKKyAgIGJlbG93IGlzIG1vcmUgdGhhbiBzYWZlLiAqLworI2RlZmluZSBFTk9VR0ggMjA0OAorI2RlZmluZSBNQVhEIDU5MgorCisvKiBUeXBlIG9mIGNvZGUgdG8gYnVpbGQgZm9yIGluZnRhYmxlKCkgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ09ERVMsCisgICAgTEVOUywKKyAgICBESVNUUworfSBjb2RldHlwZTsKKworZXh0ZXJuIGludCBpbmZsYXRlX3RhYmxlIE9GKChjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVzLCBjb2RlIEZBUiAqIEZBUiAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZBUiAqYml0cywgdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKSk7CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi90cmVlcy5jIGIvdXNyL2tsaWJjL3psaWIvdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjU3OGExCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvdHJlZXMuYwpAQCAtMCwwICsxLDEyMTkgQEAKKy8qIHRyZWVzLmMgLS0gb3V0cHV0IGRlZmxhdGVkIGRhdGEgdXNpbmcgSHVmZm1hbiBjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogIEFMR09SSVRITQorICoKKyAqICAgICAgVGhlICJkZWZsYXRpb24iIHByb2Nlc3MgdXNlcyBzZXZlcmFsIEh1ZmZtYW4gdHJlZXMuIFRoZSBtb3JlCisgKiAgICAgIGNvbW1vbiBzb3VyY2UgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBieSBzaG9ydGVyIGJpdCBzZXF1ZW5jZXMuCisgKgorICogICAgICBFYWNoIGNvZGUgdHJlZSBpcyBzdG9yZWQgaW4gYSBjb21wcmVzc2VkIGZvcm0gd2hpY2ggaXMgaXRzZWxmCisgKiBhIEh1ZmZtYW4gZW5jb2Rpbmcgb2YgdGhlIGxlbmd0aHMgb2YgYWxsIHRoZSBjb2RlIHN0cmluZ3MgKGluCisgKiBhc2NlbmRpbmcgb3JkZXIgYnkgc291cmNlIHZhbHVlcykuICBUaGUgYWN0dWFsIGNvZGUgc3RyaW5ncyBhcmUKKyAqIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgbGVuZ3RocyBpbiB0aGUgaW5mbGF0ZSBwcm9jZXNzLCBhcyBkZXNjcmliZWQKKyAqIGluIHRoZSBkZWZsYXRlIHNwZWNpZmljYXRpb24uCisgKgorICogIFJFRkVSRU5DRVMKKyAqCisgKiAgICAgIERldXRzY2gsIEwuUC4sIidEZWZsYXRlJyBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLgorICogICAgICBBdmFpbGFibGUgaW4gZnRwLnV1Lm5ldDovcHViL2FyY2hpdmluZy96aXAvZG9jL2RlZmxhdGUtMS4xLmRvYworICoKKyAqICAgICAgU3RvcmVyLCBKYW1lcyBBLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIE1ldGhvZHMgYW5kIFRoZW9yeSwgcHAuIDQ5LTUwLgorICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4gIElTQk4gMC03MTY3LTgxNTYtNS4KKyAqCisgKiAgICAgIFNlZGdld2ljaywgUi4KKyAqICAgICAgICAgIEFsZ29yaXRobXMsIHAyOTAuCisgKiAgICAgICAgICBBZGRpc29uLVdlc2xleSwgMTk4My4gSVNCTiAwLTIwMS0wNjY3Mi02LgorICovCisKKy8qIEAoIykgJElkOiB0cmVlcy5jLHYgMS4xIDIwMDUvMDIvMjcgMjM6MTU6MzkgaHBhIEV4cCAkICovCisKKy8qICNkZWZpbmUgR0VOX1RSRUVTX0ggKi8KKworI2luY2x1ZGUgImRlZmxhdGUuaCIKKworI2lmZGVmIERFQlVHCisjICBpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RhbnRzCisgKi8KKworI2RlZmluZSBNQVhfQkxfQklUUyA3CisvKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovCisKKyNkZWZpbmUgRU5EX0JMT0NLIDI1NgorLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqLworCisjZGVmaW5lIFJFUF8zXzYgICAgICAxNgorLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCisjZGVmaW5lIFJFUFpfM18xMCAgICAxNworLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKKyNkZWZpbmUgUkVQWl8xMV8xMzggIDE4CisvKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCitsb2NhbCBjb25zdCBpbnQgZXh0cmFfbGJpdHNbTEVOR1RIX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovCisgICA9IHswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDB9OworCitsb2NhbCBjb25zdCBpbnQgZXh0cmFfZGJpdHNbRF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlICovCisgICA9IHswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzfTsKKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2JsYml0c1tCTF9DT0RFU10vKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLworICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN307CisKK2xvY2FsIGNvbnN0IHVjaCBibF9vcmRlcltCTF9DT0RFU10KKyAgID0gezE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTV9OworLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZworICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuCisgKi8KKworI2RlZmluZSBCdWZfc2l6ZSAoOCAqIDIqc2l6ZW9mKGNoYXIpKQorLyogTnVtYmVyIG9mIGJpdHMgdXNlZCB3aXRoaW4gYmlfYnVmLiAoYmlfYnVmIG1pZ2h0IGJlIGltcGxlbWVudGVkIG9uCisgKiBtb3JlIHRoYW4gMTYgYml0cyBvbiBzb21lIHN5c3RlbXMuKQorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KKyAqLworCisjZGVmaW5lIERJU1RfQ09ERV9MRU4gIDUxMiAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi8KKworI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCisvKiBub24gQU5TSSBjb21waWxlcnMgbWF5IG5vdCBhY2NlcHQgdHJlZXMuaCAqLworCitsb2NhbCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdOworLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm8KKyAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyCisgKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXQKKyAqIGJlbG93KS4KKyAqLworCitsb2NhbCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXTsKKy8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKKyAqIDUgYml0cy4pCisgKi8KKwordWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl07CisvKiBEaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzCisgKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mCisgKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KKyAqLworCit1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV07CisvKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdOworLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi8KKworbG9jYWwgaW50IGJhc2VfZGlzdFtEX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovCisKKyNlbHNlCisjICBpbmNsdWRlICJ0cmVlcy5oIgorI2VuZGlmIC8qIEdFTl9UUkVFU19IICovCisKK3N0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgeworICAgIGNvbnN0IGN0X2RhdGEgKnN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqLworICAgIGNvbnN0IGludGYgKmV4dHJhX2JpdHM7ICAgICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi8KKyAgICBpbnQgICAgIGV4dHJhX2Jhc2U7ICAgICAgICAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi8KKyAgICBpbnQgICAgIGVsZW1zOyAgICAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi8KKyAgICBpbnQgICAgIG1heF9sZW5ndGg7ICAgICAgICAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KK307CisKK2xvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19sX2Rlc2MgPQore3N0YXRpY19sdHJlZSwgZXh0cmFfbGJpdHMsIExJVEVSQUxTKzEsIExfQ09ERVMsIE1BWF9CSVRTfTsKKworbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2RfZGVzYyA9Cit7c3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFN9OworCitsb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfYmxfZGVzYyA9Cit7KGNvbnN0IGN0X2RhdGEgKikwLCBleHRyYV9ibGJpdHMsIDAsICAgQkxfQ09ERVMsIE1BWF9CTF9CSVRTfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCAoc3RhdGljKSByb3V0aW5lcyBpbiB0aGlzIGZpbGUuCisgKi8KKworbG9jYWwgdm9pZCB0cl9zdGF0aWNfaW5pdCBPRigodm9pZCkpOworbG9jYWwgdm9pZCBpbml0X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBwcWRvd25oZWFwICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IGspKTsKK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbiAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBnZW5fY29kZXMgICAgICBPRigoY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlLCB1c2hmICpibF9jb3VudCkpOworbG9jYWwgdm9pZCBidWlsZF90cmVlICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdHJlZV9kZXNjICpkZXNjKSk7Citsb2NhbCB2b2lkIHNjYW5fdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIHZvaWQgc2VuZF90cmVlICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSkpOworbG9jYWwgaW50ICBidWlsZF9ibF90cmVlICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBzZW5kX2FsbF90cmVlcyBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGxjb2RlcywgaW50IGRjb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGNvZGVzKSk7Citsb2NhbCB2b2lkIGNvbXByZXNzX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICpsdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2RhdGEgKmR0cmVlKSk7Citsb2NhbCB2b2lkIHNldF9kYXRhX3R5cGUgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB1bnNpZ25lZCBiaV9yZXZlcnNlIE9GKCh1bnNpZ25lZCB2YWx1ZSwgaW50IGxlbmd0aCkpOworbG9jYWwgdm9pZCBiaV93aW5kdXAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBiaV9mbHVzaCAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBjb3B5X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwgdW5zaWduZWQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcikpOworCisjaWZkZWYgR0VOX1RSRUVTX0gKK2xvY2FsIHZvaWQgZ2VuX3RyZWVzX2hlYWRlciBPRigodm9pZCkpOworI2VuZGlmCisKKyNpZm5kZWYgREVCVUcKKyMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pCisgICAvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQgdHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworCisjZWxzZSAvKiBERUJVRyAqLworIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBcCisgICAgIHsgaWYgKHpfdmVyYm9zZT4yKSBmcHJpbnRmKHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCisgICAgICAgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyB9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS4KKyAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi4KKyAqLworI2RlZmluZSBwdXRfc2hvcnQocywgdykgeyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpOyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuCisgKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy4KKyAqLworI2lmZGVmIERFQlVHCitsb2NhbCB2b2lkIHNlbmRfYml0cyAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgdmFsdWUsIGludCBsZW5ndGgpKTsKKworbG9jYWwgdm9pZCBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCB2YWx1ZTsgIC8qIHZhbHVlIHRvIHNlbmQgKi8KKyAgICBpbnQgbGVuZ3RoOyAvKiBudW1iZXIgb2YgYml0cyAqLworeworICAgIFRyYWNldnYoKHN0ZGVyciwiIGwgJTJkIHYgJTR4ICIsIGxlbmd0aCwgdmFsdWUpKTsKKyAgICBBc3NlcnQobGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gMTUsICJpbnZhbGlkIGxlbmd0aCIpOworICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbmd0aDsKKworICAgIC8qIElmIG5vdCBlbm91Z2ggcm9vbSBpbiBiaV9idWYsIHVzZSAodmFsaWQpIGJpdHMgZnJvbSBiaV9idWYgYW5kCisgICAgICogKDE2IC0gYmlfdmFsaWQpIGJpdHMgZnJvbSB2YWx1ZSwgbGVhdmluZyAod2lkdGggLSAoMTYtYmlfdmFsaWQpKQorICAgICAqIHVudXNlZCBiaXRzIGluIHZhbHVlLgorICAgICAqLworICAgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW5ndGgpIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9ICh2YWx1ZSA8PCBzLT5iaV92YWxpZCk7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAodXNoKXZhbHVlID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTsKKyAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+YmlfYnVmIHw9IHZhbHVlIDw8IHMtPmJpX3ZhbGlkOworICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGg7CisgICAgfQorfQorI2Vsc2UgLyogIURFQlVHICovCisKKyNkZWZpbmUgc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIFwKK3sgaW50IGxlbiA9IGxlbmd0aDtcCisgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW4pIHtcCisgICAgaW50IHZhbCA9IHZhbHVlO1wKKyAgICBzLT5iaV9idWYgfD0gKHZhbCA8PCBzLT5iaV92YWxpZCk7XAorICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpO1wKKyAgICBzLT5iaV9idWYgPSAodXNoKXZhbCA+PiAoQnVmX3NpemUgLSBzLT5iaV92YWxpZCk7XAorICAgIHMtPmJpX3ZhbGlkICs9IGxlbiAtIEJ1Zl9zaXplO1wKKyAgfSBlbHNlIHtcCisgICAgcy0+YmlfYnVmIHw9ICh2YWx1ZSkgPDwgcy0+YmlfdmFsaWQ7XAorICAgIHMtPmJpX3ZhbGlkICs9IGxlbjtcCisgIH1cCit9CisjZW5kaWYgLyogREVCVUcgKi8KKworCisvKiB0aGUgYXJndW1lbnRzIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy4KKyAqLworbG9jYWwgdm9pZCB0cl9zdGF0aWNfaW5pdCgpCit7CisjaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKKyAgICBzdGF0aWMgaW50IHN0YXRpY19pbml0X2RvbmUgPSAwOworICAgIGludCBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqLworICAgIGludCBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovCisgICAgaW50IGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovCisgICAgaW50IGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqLworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGlmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47CisKKyAgICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovCisgICAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTsKKyAgICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0czsKKyAgICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlOworICAgIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzOworICAgIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovCisgICAgbGVuZ3RoID0gMDsKKyAgICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgTEVOR1RIX0NPREVTLTE7IGNvZGUrKykgeworICAgICAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9sYml0c1tjb2RlXSk7IG4rKykgeworICAgICAgICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGxlbmd0aCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NiIpOworICAgIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkCisgICAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2UKKyAgICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6CisgICAgICovCisgICAgX2xlbmd0aF9jb2RlW2xlbmd0aC0xXSA9ICh1Y2gpY29kZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqLworICAgIGRpc3QgPSAwOworICAgIGZvciAoY29kZSA9IDAgOyBjb2RlIDwgMTY7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChkaXN0ID09IDI1NiwgInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NiIpOworICAgIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqLworICAgIGZvciAoIDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8KGV4dHJhX2RiaXRzW2NvZGVdLTcpKTsgbisrKSB7CisgICAgICAgICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChkaXN0ID09IDI1NiwgInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTIiKTsKKworICAgIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi8KKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIGJsX2NvdW50W2JpdHNdID0gMDsKKyAgICBuID0gMDsKKyAgICB3aGlsZSAobiA8PSAxNDMpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDgsIGJsX2NvdW50WzhdKys7CisgICAgd2hpbGUgKG4gPD0gMjU1KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA5LCBibF9jb3VudFs5XSsrOworICAgIHdoaWxlIChuIDw9IDI3OSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gNywgYmxfY291bnRbN10rKzsKKyAgICB3aGlsZSAobiA8PSAyODcpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDgsIGJsX2NvdW50WzhdKys7CisgICAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlCisgICAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2FsIEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlCisgICAgICogYWxsIG9uZXMpCisgICAgICovCisgICAgZ2VuX2NvZGVzKChjdF9kYXRhICopc3RhdGljX2x0cmVlLCBMX0NPREVTKzEsIGJsX2NvdW50KTsKKworICAgIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqLworICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHsKKyAgICAgICAgc3RhdGljX2R0cmVlW25dLkxlbiA9IDU7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZSgodW5zaWduZWQpbiwgNSk7CisgICAgfQorICAgIHN0YXRpY19pbml0X2RvbmUgPSAxOworCisjICBpZmRlZiBHRU5fVFJFRVNfSAorICAgIGdlbl90cmVlc19oZWFkZXIoKTsKKyMgIGVuZGlmCisjZW5kaWYgLyogZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmVyYXRlIHRoZSBmaWxlIHRyZWVzLmggZGVzY3JpYmluZyB0aGUgc3RhdGljIHRyZWVzLgorICovCisjaWZkZWYgR0VOX1RSRUVTX0gKKyMgIGlmbmRlZiBERUJVRworIyAgICBpbmNsdWRlIDxzdGRpby5oPgorIyAgZW5kaWYKKworIyAgZGVmaW5lIFNFUEFSQVRPUihpLCBsYXN0LCB3aWR0aCkgXAorICAgICAgKChpKSA9PSAobGFzdCk/ICJcbn07XG5cbiIgOiAgICBcCisgICAgICAgKChpKSAlICh3aWR0aCkgPT0gKHdpZHRoKS0xID8gIixcbiIgOiAiLCAiKSkKKwordm9pZCBnZW5fdHJlZXNfaGVhZGVyKCkKK3sKKyAgICBGSUxFICpoZWFkZXIgPSBmb3BlbigidHJlZXMuaCIsICJ3Iik7CisgICAgaW50IGk7CisKKyAgICBBc3NlcnQgKGhlYWRlciAhPSBOVUxMLCAiQ2FuJ3Qgb3BlbiB0cmVlcy5oIik7CisgICAgZnByaW50ZihoZWFkZXIsCisgICAgICAgICAgICAiLyogaGVhZGVyIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aXRoIC1ER0VOX1RSRUVTX0ggKi9cblxuIik7CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl0gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTF9DT0RFUysyOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICJ7eyUzdX0seyUzdX19JXMiLCBzdGF0aWNfbHRyZWVbaV0uQ29kZSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfbHRyZWVbaV0uTGVuLCBTRVBBUkFUT1IoaSwgTF9DT0RFUysxLCA1KSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBEX0NPREVTOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICJ7eyUydX0seyUydX19JXMiLCBzdGF0aWNfZHRyZWVbaV0uQ29kZSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfZHRyZWVbaV0uTGVuLCBTRVBBUkFUT1IoaSwgRF9DT0RFUy0xLCA1KSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJjb25zdCB1Y2ggX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBESVNUX0NPREVfTEVOOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9kaXN0X2NvZGVbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIERJU1RfQ09ERV9MRU4tMSwgMjApKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXT0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NQVRDSC1NSU5fTUFUQ0grMTsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfbGVuZ3RoX2NvZGVbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIE1BWF9NQVRDSC1NSU5fTUFUQ0gsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBMRU5HVEhfQ09ERVM7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUxdSVzIiwgYmFzZV9sZW5ndGhbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIExFTkdUSF9DT0RFUy0xLCAyMCkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBEX0NPREVTOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlNXUlcyIsIGJhc2VfZGlzdFtpXSwKKyAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgRF9DT0RFUy0xLCAxMCkpOworICAgIH0KKworICAgIGZjbG9zZShoZWFkZXIpOworfQorI2VuZGlmIC8qIEdFTl9UUkVFU19IICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLgorICovCit2b2lkIF90cl9pbml0KHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICB0cl9zdGF0aWNfaW5pdCgpOworCisgICAgcy0+bF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2x0cmVlOworICAgIHMtPmxfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2xfZGVzYzsKKworICAgIHMtPmRfZGVzYy5keW5fdHJlZSA9IHMtPmR5bl9kdHJlZTsKKyAgICBzLT5kX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19kX2Rlc2M7CisKKyAgICBzLT5ibF9kZXNjLmR5bl90cmVlID0gcy0+YmxfdHJlZTsKKyAgICBzLT5ibF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfYmxfZGVzYzsKKworICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgcy0+YmlfdmFsaWQgPSAwOworICAgIHMtPmxhc3RfZW9iX2xlbiA9IDg7IC8qIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUgKi8KKyNpZmRlZiBERUJVRworICAgIHMtPmNvbXByZXNzZWRfbGVuID0gMEw7CisgICAgcy0+Yml0c19zZW50ID0gMEw7CisjZW5kaWYKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqLworICAgIGluaXRfYmxvY2socyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay4KKyAqLworbG9jYWwgdm9pZCBpbml0X2Jsb2NrKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpbnQgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgcy0+ZHluX2x0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSBzLT5keW5fZHRyZWVbbl0uRnJlcSA9IDA7CisgICAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHMtPmJsX3RyZWVbbl0uRnJlcSA9IDA7CisKKyAgICBzLT5keW5fbHRyZWVbRU5EX0JMT0NLXS5GcmVxID0gMTsKKyAgICBzLT5vcHRfbGVuID0gcy0+c3RhdGljX2xlbiA9IDBMOworICAgIHMtPmxhc3RfbGl0ID0gcy0+bWF0Y2hlcyA9IDA7Cit9CisKKyNkZWZpbmUgU01BTExFU1QgMQorLyogSW5kZXggd2l0aGluIHRoZSBoZWFwIGFycmF5IG9mIGxlYXN0IGZyZXF1ZW50IG5vZGUgaW4gdGhlIEh1ZmZtYW4gdHJlZSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVtb3ZlIHRoZSBzbWFsbGVzdCBlbGVtZW50IGZyb20gdGhlIGhlYXAgYW5kIHJlY3JlYXRlIHRoZSBoZWFwIHdpdGgKKyAqIG9uZSBsZXNzIGVsZW1lbnQuIFVwZGF0ZXMgaGVhcCBhbmQgaGVhcF9sZW4uCisgKi8KKyNkZWZpbmUgcHFyZW1vdmUocywgdHJlZSwgdG9wKSBcCit7XAorICAgIHRvcCA9IHMtPmhlYXBbU01BTExFU1RdOyBcCisgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBzLT5oZWFwW3MtPmhlYXBfbGVuLS1dOyBcCisgICAgcHFkb3duaGVhcChzLCB0cmVlLCBTTUFMTEVTVCk7IFwKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlbgorICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguCisgKi8KKyNkZWZpbmUgc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkgXAorICAgKHRyZWVbbl0uRnJlcSA8IHRyZWVbbV0uRnJlcSB8fCBcCisgICAodHJlZVtuXS5GcmVxID09IHRyZWVbbV0uRnJlcSAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssCisgKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMgdHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZworICogd2hlbiB0aGUgaGVhcCBwcm9wZXJ0eSBpcyByZS1lc3RhYmxpc2hlZCAoZWFjaCBmYXRoZXIgc21hbGxlciB0aGFuIGl0cworICogdHdvIHNvbnMpLgorICovCitsb2NhbCB2b2lkIHBxZG93bmhlYXAocywgdHJlZSwgaykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovCisgICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi8KK3sKKyAgICBpbnQgdiA9IHMtPmhlYXBba107CisgICAgaW50IGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovCisgICAgd2hpbGUgKGogPD0gcy0+aGVhcF9sZW4pIHsKKyAgICAgICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KKyAgICAgICAgaWYgKGogPCBzLT5oZWFwX2xlbiAmJgorICAgICAgICAgICAgc21hbGxlcih0cmVlLCBzLT5oZWFwW2orMV0sIHMtPmhlYXBbal0sIHMtPmRlcHRoKSkgeworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovCisgICAgICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMtPmhlYXBbal0sIHMtPmRlcHRoKSkgYnJlYWs7CisKKyAgICAgICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi8KKyAgICAgICAgcy0+aGVhcFtrXSA9IHMtPmhlYXBbal07ICBrID0gajsKKworICAgICAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCisgICAgICAgIGogPDw9IDE7CisgICAgfQorICAgIHMtPmhlYXBba10gPSB2OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoCisgKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZAorICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGUKKyAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC4KKyAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMKKyAqICAgICBub3QgbnVsbC4KKyAqLworbG9jYWwgdm9pZCBnZW5fYml0bGVuKHMsIGRlc2MpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB0cmVlX2Rlc2MgKmRlc2M7ICAgIC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi8KK3sKKyAgICBjdF9kYXRhICp0cmVlICAgICAgICA9IGRlc2MtPmR5bl90cmVlOworICAgIGludCBtYXhfY29kZSAgICAgICAgID0gZGVzYy0+bWF4X2NvZGU7CisgICAgY29uc3QgY3RfZGF0YSAqc3RyZWUgPSBkZXNjLT5zdGF0X2Rlc2MtPnN0YXRpY190cmVlOworICAgIGNvbnN0IGludGYgKmV4dHJhICAgID0gZGVzYy0+c3RhdF9kZXNjLT5leHRyYV9iaXRzOworICAgIGludCBiYXNlICAgICAgICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5leHRyYV9iYXNlOworICAgIGludCBtYXhfbGVuZ3RoICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5tYXhfbGVuZ3RoOworICAgIGludCBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqLworICAgIGludCBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovCisgICAgaW50IHhiaXRzOyAgICAgICAgICAvKiBleHRyYSBiaXRzICovCisgICAgdXNoIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi8KKyAgICBpbnQgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovCisKKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHMtPmJsX2NvdW50W2JpdHNdID0gMDsKKworICAgIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5CisgICAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuCisgICAgICovCisgICAgdHJlZVtzLT5oZWFwW3MtPmhlYXBfbWF4XV0uTGVuID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqLworCisgICAgZm9yIChoID0gcy0+aGVhcF9tYXgrMTsgaCA8IEhFQVBfU0laRTsgaCsrKSB7CisgICAgICAgIG4gPSBzLT5oZWFwW2hdOworICAgICAgICBiaXRzID0gdHJlZVt0cmVlW25dLkRhZF0uTGVuICsgMTsKKyAgICAgICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSBiaXRzID0gbWF4X2xlbmd0aCwgb3ZlcmZsb3crKzsKKyAgICAgICAgdHJlZVtuXS5MZW4gPSAodXNoKWJpdHM7CisgICAgICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovCisKKyAgICAgICAgaWYgKG4gPiBtYXhfY29kZSkgY29udGludWU7IC8qIG5vdCBhIGxlYWYgbm9kZSAqLworCisgICAgICAgIHMtPmJsX2NvdW50W2JpdHNdKys7CisgICAgICAgIHhiaXRzID0gMDsKKyAgICAgICAgaWYgKG4gPj0gYmFzZSkgeGJpdHMgPSBleHRyYVtuLWJhc2VdOworICAgICAgICBmID0gdHJlZVtuXS5GcmVxOworICAgICAgICBzLT5vcHRfbGVuICs9ICh1bGcpZiAqIChiaXRzICsgeGJpdHMpOworICAgICAgICBpZiAoc3RyZWUpIHMtPnN0YXRpY19sZW4gKz0gKHVsZylmICogKHN0cmVlW25dLkxlbiArIHhiaXRzKTsKKyAgICB9CisgICAgaWYgKG92ZXJmbG93ID09IDApIHJldHVybjsKKworICAgIFRyYWNlKChzdGRlcnIsIlxuYml0IGxlbmd0aCBvdmVyZmxvd1xuIikpOworICAgIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovCisKKyAgICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqLworICAgIGRvIHsKKyAgICAgICAgYml0cyA9IG1heF9sZW5ndGgtMTsKKyAgICAgICAgd2hpbGUgKHMtPmJsX2NvdW50W2JpdHNdID09IDApIGJpdHMtLTsKKyAgICAgICAgcy0+YmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi8KKyAgICAgICAgcy0+YmxfY291bnRbYml0cysxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovCisgICAgICAgIHMtPmJsX2NvdW50W21heF9sZW5ndGhdLS07CisgICAgICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsCisgICAgICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXQorICAgICAgICAgKi8KKyAgICAgICAgb3ZlcmZsb3cgLT0gMjsKKyAgICB9IHdoaWxlIChvdmVyZmxvdyA+IDApOworCisgICAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LgorICAgICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGwKKyAgICAgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlbgorICAgICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKQorICAgICAqLworICAgIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT0gMDsgYml0cy0tKSB7CisgICAgICAgIG4gPSBzLT5ibF9jb3VudFtiaXRzXTsKKyAgICAgICAgd2hpbGUgKG4gIT0gMCkgeworICAgICAgICAgICAgbSA9IHMtPmhlYXBbLS1oXTsKKyAgICAgICAgICAgIGlmIChtID4gbWF4X2NvZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkgdHJlZVttXS5MZW4gIT0gKHVuc2lnbmVkKSBiaXRzKSB7CisgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTsKKyAgICAgICAgICAgICAgICBzLT5vcHRfbGVuICs9ICgobG9uZyliaXRzIC0gKGxvbmcpdHJlZVttXS5MZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxvbmcpdHJlZVttXS5GcmVxOworICAgICAgICAgICAgICAgIHRyZWVbbV0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbi0tOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZQorICogb3B0aW1hbCkuCisgKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvcgorICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCisgKiAgICAgemVybyBjb2RlIGxlbmd0aC4KKyAqLworbG9jYWwgdm9pZCBnZW5fY29kZXMgKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudCkKKyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqLworICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi8KK3sKKyAgICB1c2ggbmV4dF9jb2RlW01BWF9CSVRTKzFdOyAvKiBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqLworICAgIHVzaCBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqLworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi8KKworICAgIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlcworICAgICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLgorICAgICAqLworICAgIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgeworICAgICAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzLTFdKSA8PCAxOworICAgIH0KKyAgICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlCisgICAgICogbXVzdCBiZSBhbGwgb25lcy4KKyAgICAgKi8KKyAgICBBc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsCisgICAgICAgICAgICAiaW5jb25zaXN0ZW50IGJpdCBjb3VudHMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwiXG5nZW5fY29kZXM6IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7CisKKyAgICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGludCBsZW4gPSB0cmVlW25dLkxlbjsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi8KKyAgICAgICAgdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOworCisgICAgICAgIFRyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSAiLAorICAgICAgICAgICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgorICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKKyAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcworICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KKyAqLworbG9jYWwgdm9pZCBidWlsZF90cmVlKHMsIGRlc2MpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB0cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi8KK3sKKyAgICBjdF9kYXRhICp0cmVlICAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBjb25zdCBjdF9kYXRhICpzdHJlZSAgPSBkZXNjLT5zdGF0X2Rlc2MtPnN0YXRpY190cmVlOworICAgIGludCBlbGVtcyAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZWxlbXM7CisgICAgaW50IG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovCisgICAgaW50IG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIGludCBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovCisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluCisgICAgICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uCisgICAgICogaGVhcFswXSBpcyBub3QgdXNlZC4KKyAgICAgKi8KKyAgICBzLT5oZWFwX2xlbiA9IDAsIHMtPmhlYXBfbWF4ID0gSEVBUF9TSVpFOworCisgICAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHsKKyAgICAgICAgaWYgKHRyZWVbbl0uRnJlcSAhPSAwKSB7CisgICAgICAgICAgICBzLT5oZWFwWysrKHMtPmhlYXBfbGVuKV0gPSBtYXhfY29kZSA9IG47CisgICAgICAgICAgICBzLT5kZXB0aFtuXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmVlW25dLkxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLAorICAgICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0CisgICAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS4KKyAgICAgKi8KKyAgICB3aGlsZSAocy0+aGVhcF9sZW4gPCAyKSB7CisgICAgICAgIG5vZGUgPSBzLT5oZWFwWysrKHMtPmhlYXBfbGVuKV0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApOworICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSAxOworICAgICAgICBzLT5kZXB0aFtub2RlXSA9IDA7CisgICAgICAgIHMtPm9wdF9sZW4tLTsgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGVdLkxlbjsKKyAgICAgICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovCisgICAgfQorICAgIGRlc2MtPm1heF9jb2RlID0gbWF4X2NvZGU7CisKKyAgICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsCisgICAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6CisgICAgICovCisgICAgZm9yIChuID0gcy0+aGVhcF9sZW4vMjsgbiA+PSAxOyBuLS0pIHBxZG93bmhlYXAocywgdHJlZSwgbik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvCisgICAgICogZnJlcXVlbnQgbm9kZXMuCisgICAgICovCisgICAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovCisgICAgZG8geworICAgICAgICBwcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqLworICAgICAgICBtID0gcy0+aGVhcFtTTUFMTEVTVF07IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovCisKKyAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLworICAgICAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBtOworCisgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovCisgICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IHRyZWVbbl0uRnJlcSArIHRyZWVbbV0uRnJlcTsKKyAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAodWNoKSgocy0+ZGVwdGhbbl0gPj0gcy0+ZGVwdGhbbV0gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXB0aFtuXSA6IHMtPmRlcHRoW21dKSArIDEpOworICAgICAgICB0cmVlW25dLkRhZCA9IHRyZWVbbV0uRGFkID0gKHVzaClub2RlOworI2lmZGVmIERVTVBfQkxfVFJFRQorICAgICAgICBpZiAodHJlZSA9PSBzLT5ibF90cmVlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5ub2RlICVkKCVkKSwgc29ucyAlZCglZCkgJWQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgdHJlZVtub2RlXS5GcmVxLCBuLCB0cmVlW25dLkZyZXEsIG0sIHRyZWVbbV0uRnJlcSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqLworICAgICAgICBzLT5oZWFwW1NNQUxMRVNUXSA9IG5vZGUrKzsKKyAgICAgICAgcHFkb3duaGVhcChzLCB0cmVlLCBTTUFMTEVTVCk7CisKKyAgICB9IHdoaWxlIChzLT5oZWFwX2xlbiA+PSAyKTsKKworICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IHMtPmhlYXBbU01BTExFU1RdOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vdworICAgICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KKyAgICAgKi8KKyAgICBnZW5fYml0bGVuKHMsICh0cmVlX2Rlc2MgKilkZXNjKTsKKworICAgIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KKyAgICBnZW5fY29kZXMgKChjdF9kYXRhICopdHJlZSwgbWF4X2NvZGUsIHMtPmJsX2NvdW50KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzCisgKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLgorICovCitsb2NhbCB2b2lkIHNjYW5fdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgdHJlZVttYXhfY29kZSsxXS5MZW4gPSAodXNoKTB4ZmZmZjsgLyogZ3VhcmQgKi8KKworICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKKyAgICAgICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSArPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSsrOworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBfM182XS5GcmVxKys7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQWl8zXzEwXS5GcmVxKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfMTFfMTM4XS5GcmVxKys7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW4KKyAqIGJsX3RyZWUuCisgKi8KK2xvY2FsIHZvaWQgc2VuZF90cmVlIChzLCB0cmVlLCBtYXhfY29kZSkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi8KKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgZG8geyBzZW5kX2NvZGUocywgY3VybGVuLCBzLT5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKKworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY3VybGVuICE9IHByZXZsZW4pIHsKKyAgICAgICAgICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLT5ibF90cmVlKTsgY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsICIgM182PyIpOworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMik7CisKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfM18xMCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0zLCAzKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTExLCA3KTsKKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IDA7IHByZXZsZW4gPSBjdXJsZW47CisgICAgICAgIGlmIChuZXh0bGVuID09IDApIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDcsIG1pbl9jb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpbgorICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgKi8KK2xvY2FsIGludCBidWlsZF9ibF90cmVlKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpbnQgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisgICAgc2Nhbl90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBzLT5sX2Rlc2MubWF4X2NvZGUpOworICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgcy0+ZF9kZXNjLm1heF9jb2RlKTsKKworICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovCisgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+YmxfZGVzYykpKTsKKyAgICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0CisgICAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy4KKyAgICAgKi8KKworICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdAorICAgICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzCisgICAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKQorICAgICAqLworICAgIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUy0xOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CisgICAgICAgIGlmIChzLT5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XV0uTGVuICE9IDApIGJyZWFrOworICAgIH0KKyAgICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqLworICAgIHMtPm9wdF9sZW4gKz0gMyoobWF4X2JsaW5kZXgrMSkgKyA1KzUrNDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZCIsCisgICAgICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7CisKKyAgICByZXR1cm4gbWF4X2JsaW5kZXg7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlCisgKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS4KKyAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC4KKyAqLworbG9jYWwgdm9pZCBzZW5kX2FsbF90cmVlcyhzLCBsY29kZXMsIGRjb2RlcywgYmxjb2RlcykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi8KK3sKKyAgICBpbnQgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovCisKKyAgICBBc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOworICAgIEFzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUywKKyAgICAgICAgICAgICJ0b28gbWFueSBjb2RlcyIpOworICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb3VudHM6ICIpKTsKKyAgICBzZW5kX2JpdHMocywgbGNvZGVzLTI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLworICAgIHNlbmRfYml0cyhzLCBkY29kZXMtMSwgICA1KTsKKyAgICBzZW5kX2JpdHMocywgYmxjb2Rlcy00LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb2RlICUyZCAiLCBibF9vcmRlcltyYW5rXSkpOworICAgICAgICBzZW5kX2JpdHMocywgcy0+YmxfdHJlZVtibF9vcmRlcltyYW5rXV0uTGVuLCAzKTsKKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0c19zZW50KSk7CisKKyAgICBzZW5kX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIGxjb2Rlcy0xKTsgLyogbGl0ZXJhbCB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlLCBkY29kZXMtMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBzdG9yZWQgYmxvY2sKKyAqLwordm9pZCBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgZW9mKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2sgKi8KKyAgICB1bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKyAgICBpbnQgZW9mOyAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLPDwxKStlb2YsIDMpOyAgLyogc2VuZCBibG9jayB0eXBlICovCisjaWZkZWYgREVCVUcKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IChzLT5jb21wcmVzc2VkX2xlbiArIDMgKyA3KSAmICh1bGcpfjdMOworICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IChzdG9yZWRfbGVuICsgNCkgPDwgMzsKKyNlbmRpZgorICAgIGNvcHlfYmxvY2socywgYnVmLCAodW5zaWduZWQpc3RvcmVkX2xlbiwgMSk7IC8qIHdpdGggaGVhZGVyICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS4KKyAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLgorICogVGhlIGN1cnJlbnQgaW5mbGF0ZSBjb2RlIHJlcXVpcmVzIDkgYml0cyBvZiBsb29rYWhlYWQuIElmIHRoZQorICogbGFzdCB0d28gY29kZXMgZm9yIHRoZSBwcmV2aW91cyBibG9jayAocmVhbCBjb2RlIHBsdXMgRU9CKSB3ZXJlIGNvZGVkCisgKiBvbiA1IGJpdHMgb3IgbGVzcywgaW5mbGF0ZSBtYXkgaGF2ZSBvbmx5IDUrMyBiaXRzIG9mIGxvb2thaGVhZCB0byBkZWNvZGUKKyAqIHRoZSBsYXN0IHJlYWwgY29kZS4gSW4gdGhpcyBjYXNlIHdlIHNlbmQgdHdvIGVtcHR5IHN0YXRpYyBibG9ja3MgaW5zdGVhZAorICogb2Ygb25lLiAoVGhlcmUgYXJlIG5vIHByb2JsZW1zIGlmIHRoZSBwcmV2aW91cyBibG9jayBpcyBzdG9yZWQgb3IgZml4ZWQuKQorICogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIGFzc3VtZSB0aGUgd29yc3QgY2FzZSBvZiBsYXN0IHJlYWwgY29kZSBlbmNvZGVkCisgKiBvbiBvbmUgYml0IG9ubHkuCisgKi8KK3ZvaWQgX3RyX2FsaWduKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTPDwxLCAzKTsKKyAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMTBMOyAvKiAzIGZvciBibG9jayB0eXBlLCA3IGZvciBFT0IgKi8KKyNlbmRpZgorICAgIGJpX2ZsdXNoKHMpOworICAgIC8qIE9mIHRoZSAxMCBiaXRzIGZvciB0aGUgZW1wdHkgYmxvY2ssIHdlIGhhdmUgYWxyZWFkeSBzZW50CisgICAgICogKDEwIC0gYmlfdmFsaWQpIGJpdHMuIFRoZSBsb29rYWhlYWQgZm9yIHRoZSBsYXN0IHJlYWwgY29kZSAoYmVmb3JlCisgICAgICogdGhlIEVPQiBvZiB0aGUgcHJldmlvdXMgYmxvY2spIHdhcyB0aHVzIGF0IGxlYXN0IG9uZSBwbHVzIHRoZSBsZW5ndGgKKyAgICAgKiBvZiB0aGUgRU9CIHBsdXMgd2hhdCB3ZSBoYXZlIGp1c3Qgc2VudCBvZiB0aGUgZW1wdHkgc3RhdGljIGJsb2NrLgorICAgICAqLworICAgIGlmICgxICsgcy0+bGFzdF9lb2JfbGVuICsgMTAgLSBzLT5iaV92YWxpZCA8IDkpIHsKKyAgICAgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CisgICAgICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMTBMOworI2VuZGlmCisgICAgICAgIGJpX2ZsdXNoKHMpOworICAgIH0KKyAgICBzLT5sYXN0X2VvYl9sZW4gPSA3OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYworICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLgorICovCit2b2lkIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGVvZikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi8KKyAgICB1bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKyAgICBpbnQgZW9mOyAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi8KKyAgICBpbnQgbWF4X2JsaW5kZXggPSAwOyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqLworICAgIGlmIChzLT5sZXZlbCA+IDApIHsKKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBiaW5hcnkgb3IgdGV4dCAqLworICAgICAgICBpZiAoc3RvcmVkX2xlbiA+IDAgJiYgcy0+c3RybS0+ZGF0YV90eXBlID09IFpfVU5LTk9XTikKKyAgICAgICAgICAgIHNldF9kYXRhX3R5cGUocyk7CisKKyAgICAgICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworICAgICAgICBidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5sX2Rlc2MpKSk7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBzLT5vcHRfbGVuLAorICAgICAgICAgICAgICAgIHMtPnN0YXRpY19sZW4pKTsKKworICAgICAgICBidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5kX2Rlc2MpKSk7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKKyAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7CisgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZgorICAgICAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLgorICAgICAgICAgKi8KKworICAgICAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleAorICAgICAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKyAgICAgICAgICovCisgICAgICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTsKKworICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovCisgICAgICAgIG9wdF9sZW5iID0gKHMtPm9wdF9sZW4rMys3KT4+MzsKKyAgICAgICAgc3RhdGljX2xlbmIgPSAocy0+c3RhdGljX2xlbiszKzcpPj4zOworCisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSAiLAorICAgICAgICAgICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbiwKKyAgICAgICAgICAgICAgICBzLT5sYXN0X2xpdCkpOworCisgICAgICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFzc2VydChidWYgIT0gKGNoYXIqKTAsICJsb3N0IGJ1ZiIpOworICAgICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovCisgICAgfQorCisjaWZkZWYgRk9SQ0VfU1RPUkVECisgICAgaWYgKGJ1ZiAhPSAoY2hhciopMCkgeyAvKiBmb3JjZSBzdG9yZWQgYmxvY2sgKi8KKyNlbHNlCisgICAgaWYgKHN0b3JlZF9sZW4rNCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gKGNoYXIqKTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqLworI2VuZGlmCisgICAgICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuCisgICAgICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2UKKyAgICAgICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuCisgICAgICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bworICAgICAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGVvZik7CisKKyNpZmRlZiBGT1JDRV9TVEFUSUMKKyAgICB9IGVsc2UgaWYgKHN0YXRpY19sZW5iID49IDApIHsgLyogZm9yY2Ugc3RhdGljIHRyZWVzICovCisjZWxzZQorICAgIH0gZWxzZSBpZiAocy0+c3RyYXRlZ3kgPT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PSBvcHRfbGVuYikgeworI2VuZGlmCisgICAgICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTPDwxKStlb2YsIDMpOworICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgKGN0X2RhdGEgKilzdGF0aWNfZHRyZWUpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5zdGF0aWNfbGVuOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VuZF9iaXRzKHMsIChEWU5fVFJFRVM8PDEpK2VvZiwgMyk7CisgICAgICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMtPmxfZGVzYy5tYXhfY29kZSsxLCBzLT5kX2Rlc2MubWF4X2NvZGUrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4X2JsaW5kZXgrMSk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMyArIHMtPm9wdF9sZW47CisjZW5kaWYKKyAgICB9CisgICAgQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsICJiYWQgY29tcHJlc3NlZCBzaXplIik7CisgICAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUIKKyAgICAgKiBhbmQgdUxvbmcgaW1wbGVtZW50ZWQgb24gMzIgYml0cy4KKyAgICAgKi8KKyAgICBpbml0X2Jsb2NrKHMpOworCisgICAgaWYgKGVvZikgeworICAgICAgICBiaV93aW5kdXAocyk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gNzsgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KKyNlbmRpZgorICAgIH0KKyAgICBUcmFjZXYoKHN0ZGVyciwiXG5jb21wcmxlbiAlbHUoJWx1KSAiLCBzLT5jb21wcmVzc2VkX2xlbj4+MywKKyAgICAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNyplb2YpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKKyAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC4KKyAqLworaW50IF90cl90YWxseSAocywgZGlzdCwgbGMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICB1bnNpZ25lZCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1JTl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi8KK3sKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSAodXNoKWRpc3Q7CisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSAodWNoKWxjOworICAgIGlmIChkaXN0ID09IDApIHsKKyAgICAgICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovCisgICAgICAgIHMtPmR5bl9sdHJlZVtsY10uRnJlcSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPm1hdGNoZXMrKzsKKyAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLworICAgICAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KKyAgICAgICAgQXNzZXJ0KCh1c2gpZGlzdCA8ICh1c2gpTUFYX0RJU1QocykgJiYKKyAgICAgICAgICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiYKKyAgICAgICAgICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgIl90cl90YWxseTogYmFkIG1hdGNoIik7CisKKyAgICAgICAgcy0+ZHluX2x0cmVlW19sZW5ndGhfY29kZVtsY10rTElURVJBTFMrMV0uRnJlcSsrOworICAgICAgICBzLT5keW5fZHRyZWVbZF9jb2RlKGRpc3QpXS5GcmVxKys7CisgICAgfQorCisjaWZkZWYgVFJVTkNBVEVfQkxPQ0sKKyAgICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi8KKyAgICBpZiAoKHMtPmxhc3RfbGl0ICYgMHgxZmZmKSA9PSAwICYmIHMtPmxldmVsID4gMikgeworICAgICAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi8KKyAgICAgICAgdWxnIG91dF9sZW5ndGggPSAodWxnKXMtPmxhc3RfbGl0KjhMOworICAgICAgICB1bGcgaW5fbGVuZ3RoID0gKHVsZykoKGxvbmcpcy0+c3Ryc3RhcnQgLSBzLT5ibG9ja19zdGFydCk7CisgICAgICAgIGludCBkY29kZTsKKyAgICAgICAgZm9yIChkY29kZSA9IDA7IGRjb2RlIDwgRF9DT0RFUzsgZGNvZGUrKykgeworICAgICAgICAgICAgb3V0X2xlbmd0aCArPSAodWxnKXMtPmR5bl9kdHJlZVtkY29kZV0uRnJlcSAqCisgICAgICAgICAgICAgICAgKDVMK2V4dHJhX2RiaXRzW2Rjb2RlXSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0X2xlbmd0aCA+Pj0gMzsKKyAgICAgICAgVHJhY2V2KChzdGRlcnIsIlxubGFzdF9saXQgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpICIsCisgICAgICAgICAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLAorICAgICAgICAgICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTsKKyAgICAgICAgaWYgKHMtPm1hdGNoZXMgPCBzLT5sYXN0X2xpdC8yICYmIG91dF9sZW5ndGggPCBpbl9sZW5ndGgvMikgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIChzLT5sYXN0X2xpdCA9PSBzLT5saXRfYnVmc2l6ZS0xKTsKKyAgICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEsKKyAgICAgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0bworICAgICAqIDY0Sy0xIGJ5dGVzLgorICAgICAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlcworICovCitsb2NhbCB2b2lkIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGN0X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi8KKyAgICBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqLworeworICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICBpbnQgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqLworICAgIHVuc2lnbmVkIGx4ID0gMDsgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworICAgIHVuc2lnbmVkIGNvZGU7ICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqLworICAgIGludCBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqLworCisgICAgaWYgKHMtPmxhc3RfbGl0ICE9IDApIGRvIHsKKyAgICAgICAgZGlzdCA9IHMtPmRfYnVmW2x4XTsKKyAgICAgICAgbGMgPSBzLT5sX2J1ZltseCsrXTsKKyAgICAgICAgaWYgKGRpc3QgPT0gMCkgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi8KKyAgICAgICAgICAgIFRyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsIiAnJWMnICIsIGxjKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgICAgICBjb2RlID0gX2xlbmd0aF9jb2RlW2xjXTsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBjb2RlK0xJVEVSQUxTKzEsIGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi8KKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdOworICAgICAgICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzdC0tOyAvKiBkaXN0IGlzIG5vdyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovCisgICAgICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpOworICAgICAgICAgICAgQXNzZXJ0IChjb2RlIDwgRF9DT0RFUywgImJhZCBkX2NvZGUiKTsKKworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGlzdCAtPSBiYXNlX2Rpc3RbY29kZV07CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsgICAvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gLyogbGl0ZXJhbCBvciBtYXRjaCBwYWlyID8gKi8KKworICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqLworICAgICAgICBBc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LAorICAgICAgICAgICAgICAgInBlbmRpbmdCdWYgb3ZlcmZsb3ciKTsKKworICAgIH0gd2hpbGUgKGx4IDwgcy0+bGFzdF9saXQpOworCisgICAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpOworICAgIHMtPmxhc3RfZW9iX2xlbiA9IGx0cmVlW0VORF9CTE9DS10uTGVuOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCB0aGUgZGF0YSB0eXBlIHRvIEJJTkFSWSBvciBURVhULCB1c2luZyBhIGNydWRlIGFwcHJveGltYXRpb246CisgKiBzZXQgaXQgdG8gWl9URVhUIGlmIGFsbCBzeW1ib2xzIGFyZSBlaXRoZXIgcHJpbnRhYmxlIGNoYXJhY3RlcnMgKDMzIHRvIDI1NSkKKyAqIG9yIHdoaXRlIHNwYWNlcyAoOSB0byAxMywgb3IgMzIpOyBvciBzZXQgaXQgdG8gWl9CSU5BUlkgb3RoZXJ3aXNlLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuCisgKi8KK2xvY2FsIHZvaWQgc2V0X2RhdGFfdHlwZShzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaW50IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgOTsgbisrKQorICAgICAgICBpZiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChuID09IDkpCisgICAgICAgIGZvciAobiA9IDE0OyBuIDwgMzI7IG4rKykKKyAgICAgICAgICAgIGlmIChzLT5keW5fbHRyZWVbbl0uRnJlcSAhPSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIHMtPnN0cm0tPmRhdGFfdHlwZSA9IChuID09IDMyKSA/IFpfVEVYVCA6IFpfQklOQVJZOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCisgKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCisgKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1CisgKi8KK2xvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UoY29kZSwgbGVuKQorICAgIHVuc2lnbmVkIGNvZGU7IC8qIHRoZSB2YWx1ZSB0byBpbnZlcnQgKi8KKyAgICBpbnQgbGVuOyAgICAgICAvKiBpdHMgYml0IGxlbmd0aCAqLworeworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHJlcyA9IDA7CisgICAgZG8geworICAgICAgICByZXMgfD0gY29kZSAmIDE7CisgICAgICAgIGNvZGUgPj49IDEsIHJlcyA8PD0gMTsKKyAgICB9IHdoaWxlICgtLWxlbiA+IDApOworICAgIHJldHVybiByZXMgPj4gMTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC4KKyAqLworbG9jYWwgdm9pZCBiaV9mbHVzaChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgaWYgKHMtPmJpX3ZhbGlkID09IDE2KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPSAwOworICAgICAgICBzLT5iaV92YWxpZCA9IDA7CisgICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+PSA4KSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA+Pj0gODsKKyAgICAgICAgcy0+YmlfdmFsaWQgLT0gODsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5CisgKi8KK2xvY2FsIHZvaWQgYmlfd2luZHVwKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpZiAocy0+YmlfdmFsaWQgPiA4KSB7CisgICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOworICAgIH0gZWxzZSBpZiAocy0+YmlfdmFsaWQgPiAwKSB7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7CisgICAgfQorICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgcy0+YmlfdmFsaWQgPSAwOworI2lmZGVmIERFQlVHCisgICAgcy0+Yml0c19zZW50ID0gKHMtPmJpdHNfc2VudCs3KSAmIH43OworI2VuZGlmCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHMKKyAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLgorICovCitsb2NhbCB2b2lkIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcikKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqLworICAgIGludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqLworeworICAgIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi8KKyAgICBzLT5sYXN0X2VvYl9sZW4gPSA4OyAvKiBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlICovCisKKyAgICBpZiAoaGVhZGVyKSB7CisgICAgICAgIHB1dF9zaG9ydChzLCAodXNoKWxlbik7CisgICAgICAgIHB1dF9zaG9ydChzLCAodXNoKX5sZW4pOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmJpdHNfc2VudCArPSAyKjE2OworI2VuZGlmCisgICAgfQorI2lmZGVmIERFQlVHCisgICAgcy0+Yml0c19zZW50ICs9ICh1bGcpbGVuPDwzOworI2VuZGlmCisgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgIHB1dF9ieXRlKHMsICpidWYrKyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvdHJlZXMuaCBiL3Vzci9rbGliYy96bGliL3RyZWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkZmExNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL3RyZWVzLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovCisKK2xvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl0gPSB7Cit7eyAxMn0seyAgOH19LCB7ezE0MH0seyAgOH19LCB7eyA3Nn0seyAgOH19LCB7ezIwNH0seyAgOH19LCB7eyA0NH0seyAgOH19LAore3sxNzJ9LHsgIDh9fSwge3sxMDh9LHsgIDh9fSwge3syMzZ9LHsgIDh9fSwge3sgMjh9LHsgIDh9fSwge3sxNTZ9LHsgIDh9fSwKK3t7IDkyfSx7ICA4fX0sIHt7MjIwfSx7ICA4fX0sIHt7IDYwfSx7ICA4fX0sIHt7MTg4fSx7ICA4fX0sIHt7MTI0fSx7ICA4fX0sCit7ezI1Mn0seyAgOH19LCB7eyAgMn0seyAgOH19LCB7ezEzMH0seyAgOH19LCB7eyA2Nn0seyAgOH19LCB7ezE5NH0seyAgOH19LAore3sgMzR9LHsgIDh9fSwge3sxNjJ9LHsgIDh9fSwge3sgOTh9LHsgIDh9fSwge3syMjZ9LHsgIDh9fSwge3sgMTh9LHsgIDh9fSwKK3t7MTQ2fSx7ICA4fX0sIHt7IDgyfSx7ICA4fX0sIHt7MjEwfSx7ICA4fX0sIHt7IDUwfSx7ICA4fX0sIHt7MTc4fSx7ICA4fX0sCit7ezExNH0seyAgOH19LCB7ezI0Mn0seyAgOH19LCB7eyAxMH0seyAgOH19LCB7ezEzOH0seyAgOH19LCB7eyA3NH0seyAgOH19LAore3syMDJ9LHsgIDh9fSwge3sgNDJ9LHsgIDh9fSwge3sxNzB9LHsgIDh9fSwge3sxMDZ9LHsgIDh9fSwge3syMzR9LHsgIDh9fSwKK3t7IDI2fSx7ICA4fX0sIHt7MTU0fSx7ICA4fX0sIHt7IDkwfSx7ICA4fX0sIHt7MjE4fSx7ICA4fX0sIHt7IDU4fSx7ICA4fX0sCit7ezE4Nn0seyAgOH19LCB7ezEyMn0seyAgOH19LCB7ezI1MH0seyAgOH19LCB7eyAgNn0seyAgOH19LCB7ezEzNH0seyAgOH19LAore3sgNzB9LHsgIDh9fSwge3sxOTh9LHsgIDh9fSwge3sgMzh9LHsgIDh9fSwge3sxNjZ9LHsgIDh9fSwge3sxMDJ9LHsgIDh9fSwKK3t7MjMwfSx7ICA4fX0sIHt7IDIyfSx7ICA4fX0sIHt7MTUwfSx7ICA4fX0sIHt7IDg2fSx7ICA4fX0sIHt7MjE0fSx7ICA4fX0sCit7eyA1NH0seyAgOH19LCB7ezE4Mn0seyAgOH19LCB7ezExOH0seyAgOH19LCB7ezI0Nn0seyAgOH19LCB7eyAxNH0seyAgOH19LAore3sxNDJ9LHsgIDh9fSwge3sgNzh9LHsgIDh9fSwge3syMDZ9LHsgIDh9fSwge3sgNDZ9LHsgIDh9fSwge3sxNzR9LHsgIDh9fSwKK3t7MTEwfSx7ICA4fX0sIHt7MjM4fSx7ICA4fX0sIHt7IDMwfSx7ICA4fX0sIHt7MTU4fSx7ICA4fX0sIHt7IDk0fSx7ICA4fX0sCit7ezIyMn0seyAgOH19LCB7eyA2Mn0seyAgOH19LCB7ezE5MH0seyAgOH19LCB7ezEyNn0seyAgOH19LCB7ezI1NH0seyAgOH19LAore3sgIDF9LHsgIDh9fSwge3sxMjl9LHsgIDh9fSwge3sgNjV9LHsgIDh9fSwge3sxOTN9LHsgIDh9fSwge3sgMzN9LHsgIDh9fSwKK3t7MTYxfSx7ICA4fX0sIHt7IDk3fSx7ICA4fX0sIHt7MjI1fSx7ICA4fX0sIHt7IDE3fSx7ICA4fX0sIHt7MTQ1fSx7ICA4fX0sCit7eyA4MX0seyAgOH19LCB7ezIwOX0seyAgOH19LCB7eyA0OX0seyAgOH19LCB7ezE3N30seyAgOH19LCB7ezExM30seyAgOH19LAore3syNDF9LHsgIDh9fSwge3sgIDl9LHsgIDh9fSwge3sxMzd9LHsgIDh9fSwge3sgNzN9LHsgIDh9fSwge3syMDF9LHsgIDh9fSwKK3t7IDQxfSx7ICA4fX0sIHt7MTY5fSx7ICA4fX0sIHt7MTA1fSx7ICA4fX0sIHt7MjMzfSx7ICA4fX0sIHt7IDI1fSx7ICA4fX0sCit7ezE1M30seyAgOH19LCB7eyA4OX0seyAgOH19LCB7ezIxN30seyAgOH19LCB7eyA1N30seyAgOH19LCB7ezE4NX0seyAgOH19LAore3sxMjF9LHsgIDh9fSwge3syNDl9LHsgIDh9fSwge3sgIDV9LHsgIDh9fSwge3sxMzN9LHsgIDh9fSwge3sgNjl9LHsgIDh9fSwKK3t7MTk3fSx7ICA4fX0sIHt7IDM3fSx7ICA4fX0sIHt7MTY1fSx7ICA4fX0sIHt7MTAxfSx7ICA4fX0sIHt7MjI5fSx7ICA4fX0sCit7eyAyMX0seyAgOH19LCB7ezE0OX0seyAgOH19LCB7eyA4NX0seyAgOH19LCB7ezIxM30seyAgOH19LCB7eyA1M30seyAgOH19LAore3sxODF9LHsgIDh9fSwge3sxMTd9LHsgIDh9fSwge3syNDV9LHsgIDh9fSwge3sgMTN9LHsgIDh9fSwge3sxNDF9LHsgIDh9fSwKK3t7IDc3fSx7ICA4fX0sIHt7MjA1fSx7ICA4fX0sIHt7IDQ1fSx7ICA4fX0sIHt7MTczfSx7ICA4fX0sIHt7MTA5fSx7ICA4fX0sCit7ezIzN30seyAgOH19LCB7eyAyOX0seyAgOH19LCB7ezE1N30seyAgOH19LCB7eyA5M30seyAgOH19LCB7ezIyMX0seyAgOH19LAore3sgNjF9LHsgIDh9fSwge3sxODl9LHsgIDh9fSwge3sxMjV9LHsgIDh9fSwge3syNTN9LHsgIDh9fSwge3sgMTl9LHsgIDl9fSwKK3t7Mjc1fSx7ICA5fX0sIHt7MTQ3fSx7ICA5fX0sIHt7NDAzfSx7ICA5fX0sIHt7IDgzfSx7ICA5fX0sIHt7MzM5fSx7ICA5fX0sCit7ezIxMX0seyAgOX19LCB7ezQ2N30seyAgOX19LCB7eyA1MX0seyAgOX19LCB7ezMwN30seyAgOX19LCB7ezE3OX0seyAgOX19LAore3s0MzV9LHsgIDl9fSwge3sxMTV9LHsgIDl9fSwge3szNzF9LHsgIDl9fSwge3syNDN9LHsgIDl9fSwge3s0OTl9LHsgIDl9fSwKK3t7IDExfSx7ICA5fX0sIHt7MjY3fSx7ICA5fX0sIHt7MTM5fSx7ICA5fX0sIHt7Mzk1fSx7ICA5fX0sIHt7IDc1fSx7ICA5fX0sCit7ezMzMX0seyAgOX19LCB7ezIwM30seyAgOX19LCB7ezQ1OX0seyAgOX19LCB7eyA0M30seyAgOX19LCB7ezI5OX0seyAgOX19LAore3sxNzF9LHsgIDl9fSwge3s0Mjd9LHsgIDl9fSwge3sxMDd9LHsgIDl9fSwge3szNjN9LHsgIDl9fSwge3syMzV9LHsgIDl9fSwKK3t7NDkxfSx7ICA5fX0sIHt7IDI3fSx7ICA5fX0sIHt7MjgzfSx7ICA5fX0sIHt7MTU1fSx7ICA5fX0sIHt7NDExfSx7ICA5fX0sCit7eyA5MX0seyAgOX19LCB7ezM0N30seyAgOX19LCB7ezIxOX0seyAgOX19LCB7ezQ3NX0seyAgOX19LCB7eyA1OX0seyAgOX19LAore3szMTV9LHsgIDl9fSwge3sxODd9LHsgIDl9fSwge3s0NDN9LHsgIDl9fSwge3sxMjN9LHsgIDl9fSwge3szNzl9LHsgIDl9fSwKK3t7MjUxfSx7ICA5fX0sIHt7NTA3fSx7ICA5fX0sIHt7ICA3fSx7ICA5fX0sIHt7MjYzfSx7ICA5fX0sIHt7MTM1fSx7ICA5fX0sCit7ezM5MX0seyAgOX19LCB7eyA3MX0seyAgOX19LCB7ezMyN30seyAgOX19LCB7ezE5OX0seyAgOX19LCB7ezQ1NX0seyAgOX19LAore3sgMzl9LHsgIDl9fSwge3syOTV9LHsgIDl9fSwge3sxNjd9LHsgIDl9fSwge3s0MjN9LHsgIDl9fSwge3sxMDN9LHsgIDl9fSwKK3t7MzU5fSx7ICA5fX0sIHt7MjMxfSx7ICA5fX0sIHt7NDg3fSx7ICA5fX0sIHt7IDIzfSx7ICA5fX0sIHt7Mjc5fSx7ICA5fX0sCit7ezE1MX0seyAgOX19LCB7ezQwN30seyAgOX19LCB7eyA4N30seyAgOX19LCB7ezM0M30seyAgOX19LCB7ezIxNX0seyAgOX19LAore3s0NzF9LHsgIDl9fSwge3sgNTV9LHsgIDl9fSwge3szMTF9LHsgIDl9fSwge3sxODN9LHsgIDl9fSwge3s0Mzl9LHsgIDl9fSwKK3t7MTE5fSx7ICA5fX0sIHt7Mzc1fSx7ICA5fX0sIHt7MjQ3fSx7ICA5fX0sIHt7NTAzfSx7ICA5fX0sIHt7IDE1fSx7ICA5fX0sCit7ezI3MX0seyAgOX19LCB7ezE0M30seyAgOX19LCB7ezM5OX0seyAgOX19LCB7eyA3OX0seyAgOX19LCB7ezMzNX0seyAgOX19LAore3syMDd9LHsgIDl9fSwge3s0NjN9LHsgIDl9fSwge3sgNDd9LHsgIDl9fSwge3szMDN9LHsgIDl9fSwge3sxNzV9LHsgIDl9fSwKK3t7NDMxfSx7ICA5fX0sIHt7MTExfSx7ICA5fX0sIHt7MzY3fSx7ICA5fX0sIHt7MjM5fSx7ICA5fX0sIHt7NDk1fSx7ICA5fX0sCit7eyAzMX0seyAgOX19LCB7ezI4N30seyAgOX19LCB7ezE1OX0seyAgOX19LCB7ezQxNX0seyAgOX19LCB7eyA5NX0seyAgOX19LAore3szNTF9LHsgIDl9fSwge3syMjN9LHsgIDl9fSwge3s0Nzl9LHsgIDl9fSwge3sgNjN9LHsgIDl9fSwge3szMTl9LHsgIDl9fSwKK3t7MTkxfSx7ICA5fX0sIHt7NDQ3fSx7ICA5fX0sIHt7MTI3fSx7ICA5fX0sIHt7MzgzfSx7ICA5fX0sIHt7MjU1fSx7ICA5fX0sCit7ezUxMX0seyAgOX19LCB7eyAgMH0seyAgN319LCB7eyA2NH0seyAgN319LCB7eyAzMn0seyAgN319LCB7eyA5Nn0seyAgN319LAore3sgMTZ9LHsgIDd9fSwge3sgODB9LHsgIDd9fSwge3sgNDh9LHsgIDd9fSwge3sxMTJ9LHsgIDd9fSwge3sgIDh9LHsgIDd9fSwKK3t7IDcyfSx7ICA3fX0sIHt7IDQwfSx7ICA3fX0sIHt7MTA0fSx7ICA3fX0sIHt7IDI0fSx7ICA3fX0sIHt7IDg4fSx7ICA3fX0sCit7eyA1Nn0seyAgN319LCB7ezEyMH0seyAgN319LCB7eyAgNH0seyAgN319LCB7eyA2OH0seyAgN319LCB7eyAzNn0seyAgN319LAore3sxMDB9LHsgIDd9fSwge3sgMjB9LHsgIDd9fSwge3sgODR9LHsgIDd9fSwge3sgNTJ9LHsgIDd9fSwge3sxMTZ9LHsgIDd9fSwKK3t7ICAzfSx7ICA4fX0sIHt7MTMxfSx7ICA4fX0sIHt7IDY3fSx7ICA4fX0sIHt7MTk1fSx7ICA4fX0sIHt7IDM1fSx7ICA4fX0sCit7ezE2M30seyAgOH19LCB7eyA5OX0seyAgOH19LCB7ezIyN30seyAgOH19Cit9OworCitsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXSA9IHsKK3t7IDB9LHsgNX19LCB7ezE2fSx7IDV9fSwge3sgOH0seyA1fX0sIHt7MjR9LHsgNX19LCB7eyA0fSx7IDV9fSwKK3t7MjB9LHsgNX19LCB7ezEyfSx7IDV9fSwge3syOH0seyA1fX0sIHt7IDJ9LHsgNX19LCB7ezE4fSx7IDV9fSwKK3t7MTB9LHsgNX19LCB7ezI2fSx7IDV9fSwge3sgNn0seyA1fX0sIHt7MjJ9LHsgNX19LCB7ezE0fSx7IDV9fSwKK3t7MzB9LHsgNX19LCB7eyAxfSx7IDV9fSwge3sxN30seyA1fX0sIHt7IDl9LHsgNX19LCB7ezI1fSx7IDV9fSwKK3t7IDV9LHsgNX19LCB7ezIxfSx7IDV9fSwge3sxM30seyA1fX0sIHt7Mjl9LHsgNX19LCB7eyAzfSx7IDV9fSwKK3t7MTl9LHsgNX19LCB7ezExfSx7IDV9fSwge3syN30seyA1fX0sIHt7IDd9LHsgNX19LCB7ezIzfSx7IDV9fQorfTsKKworY29uc3QgdWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7CisgMCwgIDEsICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCisgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsCisxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgIDAsICAwLCAxNiwgMTcsCisxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsCisyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisyNCwgMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5Cit9OworCitjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHsKKyAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKKzEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKzE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwKKzE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwKKzIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwKKzIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywKKzIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKKzI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKKzI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKKzI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKKzI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI4Cit9OworCitsb2NhbCBjb25zdCBpbnQgYmFzZV9sZW5ndGhbTEVOR1RIX0NPREVTXSA9IHsKKzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDEwLCAxMiwgMTQsIDE2LCAyMCwgMjQsIDI4LCAzMiwgNDAsIDQ4LCA1NiwKKzY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAwCit9OworCitsb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0geworICAgIDAsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNiwgICAgIDgsICAgIDEyLCAgICAxNiwgICAgMjQsCisgICAzMiwgICAgNDgsICAgIDY0LCAgICA5NiwgICAxMjgsICAgMTkyLCAgIDI1NiwgICAzODQsICAgNTEyLCAgIDc2OCwKKyAxMDI0LCAgMTUzNiwgIDIwNDgsICAzMDcyLCAgNDA5NiwgIDYxNDQsICA4MTkyLCAxMjI4OCwgMTYzODQsIDI0NTc2Cit9OwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvdW5jb21wci5jIGIvdXNyL2tsaWJjL3psaWIvdW5jb21wci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmVlNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvdW5jb21wci5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIHVuY29tcHIuYyAtLSBkZWNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZDogdW5jb21wci5jLHYgMS4xIDIwMDUvMDIvMjcgMjM6MTU6MzkgaHBhIEV4cCAkICovCisKKyNkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2luY2x1ZGUgInpsaWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKKyAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgorICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKKyAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisKKyAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgorKi8KK2ludCBaRVhQT1JUIHVuY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50IGVycjsKKworICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7CisgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOworICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OworICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKKyAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKworICAgIGVyciA9IGluZmxhdGVJbml0KCZzdHJlYW0pOworICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICAgIGlmIChlcnIgPT0gWl9ORUVEX0RJQ1QgfHwgKGVyciA9PSBaX0JVRl9FUlJPUiAmJiBzdHJlYW0uYXZhaWxfaW4gPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi96Y29uZi5pbi5oIGIvdXNyL2tsaWJjL3psaWIvemNvbmYuaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzU3NWViCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL2tsaWJjL3psaWIvemNvbmYuaW4uaApAQCAtMCwwICsxLDMzMiBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQ6IHpjb25mLmluLmgsdiAxLjEgMjAwNS8wMi8yNyAyMzoxNTozOSBocGEgRXhwICQgKi8KKworI2lmbmRlZiBaQ09ORl9ICisjZGVmaW5lIFpDT05GX0gKKworLyoKKyAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgorICovCisjaWZkZWYgWl9QUkVGSVgKKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXworIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKKyMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjaworIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCisjICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcworIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGRlZmluZSB6RXJyb3IgICAgICAgICAgICAgICAgel96RXJyb3IKKworIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpZiAwICAgICAgICAgICAvKiBIQVZFX1VOSVNURF9IIC0tIHRoaXMgbGluZSBpcyB1cGRhdGVkIGJ5IC4vY29uZmlndXJlICovCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KKyMgIGlmZGVmIFZNUworIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjICBkZWZpbmUgel9vZmZfdCBvZmZfdAorI2VuZGlmCisjaWZuZGVmIFNFRUtfU0VUCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NVlNfXykKKyMgIGRlZmluZSBOT192c25wcmludGYKKyMgIGlmZGVmIEZBUgorIyAgICB1bmRlZiBGQVIKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS91c3Iva2xpYmMvemxpYi96bGliLjMgYi91c3Iva2xpYmMvemxpYi96bGliLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiODE2MgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL3psaWIuMwpAQCAtMCwwICsxLDE1OSBAQAorLlRIIFpMSUIgMyAiMTggSnVseSAyMDA1IgorLlNIIE5BTUUKK3psaWIgXC0gY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBsaWJyYXJ5CisuU0ggU1lOT1BTSVMKK1tzZWUKKy5JIHpsaWIuaAorZm9yIGZ1bGwgZGVzY3JpcHRpb25dCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkkgemxpYgorbGlicmFyeSBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCitUaGUgY29kZSBpcyB0aHJlYWQgc2FmZS4KK0l0IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsCitpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCitUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kIChkZWZsYXRpb24pCitidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyCithbmQgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cmVhbSBpbnRlcmZhY2UuCisuTFAKK0NvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaAorKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksCitvciBjYW4gYmUgZG9uZSBieSByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uCitJbiB0aGUgbGF0dGVyIGNhc2UsCit0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KKy5MUAorVGhlIGxpYnJhcnkgYWxzbyBzdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzIGluCisuSVIgZ3ppcCAoMSkKKyguZ3opIGZvcm1hdAord2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLgorLkxQCitUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4KK1RoZSBkZWNvZGVyIGNoZWNrcyB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwKK3NvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlciBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorLkxQCitBbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlCisuSVIgemxpYi5oIC4KK1RoZSBkaXN0cmlidXRpb24gc291cmNlIGluY2x1ZGVzIGV4YW1wbGVzIG9mIHVzZSBvZiB0aGUgbGlicmFyeQoraW4gdGhlIGZpbGVzCisuSSBleGFtcGxlLmMKK2FuZAorLklSIG1pbmlnemlwLmMgLgorLkxQCitDaGFuZ2VzIHRvIHRoaXMgdmVyc2lvbiBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZQorLkkgQ2hhbmdlTG9nCit0aGF0IGFjY29tcGFuaWVzIHRoZSBzb3VyY2UsCithbmQgYXJlIGNvbmNlcm5lZCBwcmltYXJpbHkgd2l0aCBidWcgZml4ZXMgYW5kIHBvcnRhYmlsaXR5IGVuaGFuY2VtZW50cy4KKy5MUAorQSBKYXZhIGltcGxlbWVudGF0aW9uIG9mCisuSSB6bGliCitpcyBhdmFpbGFibGUgaW4gdGhlIEphdmEgRGV2ZWxvcG1lbnQgS2l0IDEuMToKKy5JUAoraHR0cDovL3d3dy5qYXZhc29mdC5jb20vcHJvZHVjdHMvSkRLLzEuMS9kb2NzL2FwaS9QYWNrYWdlLWphdmEudXRpbC56aXAuaHRtbAorLkxQCitBIFBlcmwgaW50ZXJmYWNlIHRvCisuSVIgemxpYiAsCit3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgKHBtcXNAY3Bhbi5vcmcpLAoraXMgYXZhaWxhYmxlIGF0IENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzLAoraW5jbHVkaW5nOgorLklQCitodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL0NvbXByZXNzLworLkxQCitBIFB5dGhvbiBpbnRlcmZhY2UgdG8KKy5JUiB6bGliICwKK3dyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyAoYW1rQG1hZ25ldC5jb20pLAoraXMgYXZhaWxhYmxlIGluIFB5dGhvbiAxLjUgYW5kIGxhdGVyIHZlcnNpb25zOgorLklQCitodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2xpYi9tb2R1bGUtemxpYi5odG1sCisuTFAKK0EKKy5JIHpsaWIKK2JpbmRpbmcgZm9yCisuSVIgdGNsICgxKSwKK3dyaXR0ZW4gYnkgQW5kcmVhcyBLdXByaWVzIChhLmt1cHJpZXNAd2VzdGVuZC5jb20pLAoraXMgYXZhaWxsYWJsZSBhdDoKKy5JUAoraHR0cDovL3d3dy53ZXN0ZW5kLmNvbS9+a3Vwcmllcy9kb2MvdHJmL21hbi9tYW4uaHRtbAorLkxQCitBbiBleHBlcmltZW50YWwgcGFja2FnZSB0byByZWFkIGFuZCB3cml0ZSBmaWxlcyBpbiAuemlwIGZvcm1hdCwKK3dyaXR0ZW4gb24gdG9wIG9mCisuSSB6bGliCitieSBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLAoraXMgYXZhaWxhYmxlIGF0OgorLklQCitodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKK2FuZCBhbHNvIGluIHRoZQorLkkgY29udHJpYi9taW5pemlwCitkaXJlY3Rvcnkgb2YgdGhlIG1haW4KKy5JIHpsaWIKK3dlYiBzaXRlLgorLlNIICJTRUUgQUxTTyIKK1RoZQorLkkgemxpYgord2ViIHNpdGUgY2FuIGJlIGZvdW5kIGF0IGVpdGhlciBvZiB0aGVzZSBsb2NhdGlvbnM6CisuSVAKK2h0dHA6Ly93d3cuemxpYi5vcmcKKy5icgoraHR0cDovL3d3dy5nemlwLm9yZy96bGliLworLkxQCitUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkMKKyhSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlczoKKy5JUAoraHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKGNvbmNlcm5pbmcgemxpYiBmb3JtYXQpCisuYnIKK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTEudHh0IChjb25jZXJuaW5nIGRlZmxhdGUgZm9ybWF0KQorLmJyCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUyLnR4dCAoY29uY2VybmluZyBnemlwIGZvcm1hdCkKKy5MUAorVGhlc2UgZG9jdW1lbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiBvdGhlciBmb3JtYXRzIGZyb206CisuSVAKK2Z0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvcG5nL2RvY3VtZW50cy96bGliL3pkb2MtaW5kZXguaHRtbAorLkxQCitNYXJrIE5lbHNvbiAobWFya25AaWVlZS5vcmcpIHdyb3RlIGFuIGFydGljbGUgYWJvdXQKKy5JIHpsaWIKK2ZvciB0aGUgSmFuLiAxOTk3IGlzc3VlIG9mICBEci4gRG9iYidzIEpvdXJuYWw7CithIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGF0OgorLklQCitodHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQorLlNIICJSRVBPUlRJTkcgUFJPQkxFTVMiCitCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwKK3BsZWFzZSBjaGVjayB0aGUKKy5JIHpsaWIKK3dlYiBzaXRlIHRvIHZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgorLklSIHpsaWIgOworb3RoZXJ3aXNlLAorb2J0YWluIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgc2VlIGlmIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cy4KK1BsZWFzZSByZWFkIHRoZQorLkkgemxpYgorRkFRIGF0OgorLklQCitodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvemxpYl9mYXEuaHRtbAorLkxQCitiZWZvcmUgYXNraW5nIGZvciBoZWxwLgorU2VuZCBxdWVzdGlvbnMgYW5kL29yIGNvbW1lbnRzIHRvIHpsaWJAZ3ppcC5vcmcsCitvciAoZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uKSB0byBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLgorLlNIIEFVVEhPUlMKK1ZlcnNpb24gMS4yLjMKK0NvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKQorYW5kIE1hcmsgQWRsZXIgKG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUpLgorLkxQCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcy1pcywiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCitJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KK1NlZSB0aGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gcmVxdWlyZW1lbnRzCitnb3Zlcm5pbmcgcmVkaXN0cmlidXRpb24uCitUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieQorLkkgemxpYgord2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LgorVGhlIGRlZmxhdGUgYW5kCisuSSB6bGliCitzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gUGV0ZXIgRGV1dHNjaC4KK1RoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzCitpbXByb3ZlbWVudHMgaW4KKy5JUiB6bGliIDsKK3dobyBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKy5MUAorVU5JWCBtYW51YWwgcGFnZSBieSBSLiBQLiBDLiBSb2RnZXJzLAorVS5TLiBOYXRpb25hbCBMaWJyYXJ5IG9mIE1lZGljaW5lIChyb2RnZXJzQG5sbS5uaWguZ292KS4KKy5cIiBlbmQgb2YgbWFuIHBhZ2UKZGlmZiAtLWdpdCBhL3Vzci9rbGliYy96bGliL3p1dGlsLmMgYi91c3Iva2xpYmMvemxpYi96dXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2U5NTMKLS0tIC9kZXYvbnVsbAorKysgYi91c3Iva2xpYmMvemxpYi96dXRpbC5jCkBAIC0wLDAgKzEsMzE4IEBACisvKiB6dXRpbC5jIC0tIHRhcmdldCBkZXBlbmRlbnQgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkOiB6dXRpbC5jLHYgMS4xIDIwMDUvMDIvMjcgMjM6MTU6MzkgaHBhIEV4cCAkICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorCisjaWZuZGVmIE5PX0RVTU1ZX0RFQ0wKK3N0cnVjdCBpbnRlcm5hbF9zdGF0ZSAgICAgIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2VuZGlmCisKK2NvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF0gPSB7CisibmVlZCBkaWN0aW9uYXJ5IiwgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovCisic3RyZWFtIGVuZCIsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovCisiIiwgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovCisiZmlsZSBlcnJvciIsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovCisic3RyZWFtIGVycm9yIiwgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovCisiZGF0YSBlcnJvciIsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovCisiaW5zdWZmaWNpZW50IG1lbW9yeSIsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovCisiYnVmZmVyIGVycm9yIiwgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovCisiaW5jb21wYXRpYmxlIHZlcnNpb24iLC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovCisiIn07CisKKworY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24oKQoreworICAgIHJldHVybiBaTElCX1ZFUlNJT047Cit9CisKK3VMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncygpCit7CisgICAgdUxvbmcgZmxhZ3M7CisKKyAgICBmbGFncyA9IDA7CisgICAgc3dpdGNoIChzaXplb2YodUludCkpIHsKKyAgICBjYXNlIDI6ICAgICBicmVhazsKKyAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxOyAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMjsgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDM7CisgICAgfQorICAgIHN3aXRjaCAoc2l6ZW9mKHVMb25nKSkgeworICAgIGNhc2UgMjogICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgMjsgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgMjsgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgMjsKKyAgICB9CisgICAgc3dpdGNoIChzaXplb2Yodm9pZHBmKSkgeworICAgIGNhc2UgMjogICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNDsgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNDsgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNDsKKyAgICB9CisgICAgc3dpdGNoIChzaXplb2Yoel9vZmZfdCkpIHsKKyAgICBjYXNlIDI6ICAgICBicmVhazsKKyAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDY7ICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDY7ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzIDw8IDY7CisgICAgfQorI2lmZGVmIERFQlVHCisgICAgZmxhZ3MgKz0gMSA8PCA4OworI2VuZGlmCisjaWYgZGVmaW5lZChBU01WKSB8fCBkZWZpbmVkKEFTTUlORikKKyAgICBmbGFncyArPSAxIDw8IDk7CisjZW5kaWYKKyNpZmRlZiBaTElCX1dJTkFQSQorICAgIGZsYWdzICs9IDEgPDwgMTA7CisjZW5kaWYKKyNpZmRlZiBCVUlMREZJWEVECisgICAgZmxhZ3MgKz0gMSA8PCAxMjsKKyNlbmRpZgorI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgZmxhZ3MgKz0gMSA8PCAxMzsKKyNlbmRpZgorI2lmZGVmIE5PX0daQ09NUFJFU1MKKyAgICBmbGFncyArPSAxTCA8PCAxNjsKKyNlbmRpZgorI2lmZGVmIE5PX0daSVAKKyAgICBmbGFncyArPSAxTCA8PCAxNzsKKyNlbmRpZgorI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgZmxhZ3MgKz0gMUwgPDwgMjA7CisjZW5kaWYKKyNpZmRlZiBGQVNURVNUCisgICAgZmxhZ3MgKz0gMUwgPDwgMjE7CisjZW5kaWYKKyNpZmRlZiBTVERDCisjICBpZmRlZiBOT192c25wcmludGYKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjU7CisjICAgIGlmZGVmIEhBU192c3ByaW50Zl92b2lkCisgICAgICAgIGZsYWdzICs9IDFMIDw8IDI2OworIyAgICBlbmRpZgorIyAgZWxzZQorIyAgICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjQ7CisjICBpZmRlZiBOT19zbnByaW50ZgorICAgICAgICBmbGFncyArPSAxTCA8PCAyNTsKKyMgICAgaWZkZWYgSEFTX3NwcmludGZfdm9pZAorICAgICAgICBmbGFncyArPSAxTCA8PCAyNjsKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKKyAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisgICAgcmV0dXJuIGZsYWdzOworfQorCisjaWZkZWYgREVCVUcKKworIyAgaWZuZGVmIHZlcmJvc2UKKyMgICAgZGVmaW5lIHZlcmJvc2UgMAorIyAgZW5kaWYKK2ludCB6X3ZlcmJvc2UgPSB2ZXJib3NlOworCit2b2lkIHpfZXJyb3IgKG0pCisgICAgY2hhciAqbTsKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtKTsKKyAgICBleGl0KDEpOworfQorI2VuZGlmCisKKy8qIGV4cG9ydGVkIHRvIGFsbG93IGNvbnZlcnNpb24gb2YgZXJyb3IgY29kZSB0byBzdHJpbmcgZm9yIGNvbXByZXNzKCkgYW5kCisgKiB1bmNvbXByZXNzKCkKKyAqLworY29uc3QgY2hhciAqIFpFWFBPUlQgekVycm9yKGVycikKKyAgICBpbnQgZXJyOworeworICAgIHJldHVybiBFUlJfTVNHKGVycik7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgLyogVGhlIE1pY3Jvc29mdCBDIFJ1bi1UaW1lIExpYnJhcnkgZm9yIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlCisgICAgICogZXJybm8uICBXZSBkZWZpbmUgaXQgYXMgYSBnbG9iYWwgdmFyaWFibGUgdG8gc2ltcGxpZnkgcG9ydGluZy4KKyAgICAgKiBJdHMgdmFsdWUgaXMgYWx3YXlzIDAgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBpbnQgZXJybm8gPSAwOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NRU1DUFkKKwordm9pZCB6bWVtY3B5KGRlc3QsIHNvdXJjZSwgbGVuKQorICAgIEJ5dGVmKiBkZXN0OworICAgIGNvbnN0IEJ5dGVmKiBzb3VyY2U7CisgICAgdUludCAgbGVuOworeworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworICAgIGRvIHsKKyAgICAgICAgKmRlc3QrKyA9ICpzb3VyY2UrKzsgLyogPz8/IHRvIGJlIHVucm9sbGVkICovCisgICAgfSB3aGlsZSAoLS1sZW4gIT0gMCk7Cit9CisKK2ludCB6bWVtY21wKHMxLCBzMiwgbGVuKQorICAgIGNvbnN0IEJ5dGVmKiBzMTsKKyAgICBjb25zdCBCeXRlZiogczI7CisgICAgdUludCAgbGVuOworeworICAgIHVJbnQgajsKKworICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICBpZiAoczFbal0gIT0gczJbal0pIHJldHVybiAyKihzMVtqXSA+IHMyW2pdKS0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6bWVtemVybyhkZXN0LCBsZW4pCisgICAgQnl0ZWYqIGRlc3Q7CisgICAgdUludCAgbGVuOworeworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworICAgIGRvIHsKKyAgICAgICAgKmRlc3QrKyA9IDA7ICAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KKyAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBTWVMxNkJJVAorCisjaWZkZWYgX19UVVJCT0NfXworLyogVHVyYm8gQyBpbiAxNi1iaXQgbW9kZSAqLworCisjICBkZWZpbmUgTVlfWkNBTExPQworCisvKiBUdXJibyBDIG1hbGxvYygpIGRvZXMgbm90IGFsbG93IGR5bmFtaWMgYWxsb2NhdGlvbiBvZiA2NEsgYnl0ZXMKKyAqIGFuZCBmYXJtYWxsb2MoNjRLKSByZXR1cm5zIGEgcG9pbnRlciB3aXRoIGFuIG9mZnNldCBvZiA4LCBzbyB3ZQorICogbXVzdCBmaXggdGhlIHBvaW50ZXIuIFdhcm5pbmc6IHRoZSBwb2ludGVyIG11c3QgYmUgcHV0IGJhY2sgdG8gaXRzCisgKiBvcmlnaW5hbCBmb3JtIGluIG9yZGVyIHRvIGZyZWUgaXQsIHVzZSB6Y2ZyZWUoKS4KKyAqLworCisjZGVmaW5lIE1BWF9QVFIgMTAKKy8qIDEwKjY0SyA9IDY0MEsgKi8KKworbG9jYWwgaW50IG5leHRfcHRyID0gMDsKKwordHlwZWRlZiBzdHJ1Y3QgcHRyX3RhYmxlX3MgeworICAgIHZvaWRwZiBvcmdfcHRyOworICAgIHZvaWRwZiBuZXdfcHRyOworfSBwdHJfdGFibGU7CisKK2xvY2FsIHB0cl90YWJsZSB0YWJsZVtNQVhfUFRSXTsKKy8qIFRoaXMgdGFibGUgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgb3JpZ2luYWwgZm9ybSBvZiBwb2ludGVycworICogdG8gbGFyZ2UgYnVmZmVycyAoNjRLKS4gU3VjaCBwb2ludGVycyBhcmUgbm9ybWFsaXplZCB3aXRoIGEgemVybyBvZmZzZXQuCisgKiBTaW5jZSBNU0RPUyBpcyBub3QgYSBwcmVlbXB0aXZlIG11bHRpdGFza2luZyBPUywgdGhpcyB0YWJsZSBpcyBub3QKKyAqIHByb3RlY3RlZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiBUaGlzIGhhY2sgZG9lc24ndCB3b3JrIGFueXdheSBvbgorICogYSBwcm90ZWN0ZWQgc3lzdGVtIGxpa2UgT1MvMi4gVXNlIE1pY3Jvc29mdCBDIGluc3RlYWQuCisgKi8KKwordm9pZHBmIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKQoreworICAgIHZvaWRwZiBidWYgPSBvcGFxdWU7IC8qIGp1c3QgdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLworICAgIHVsZyBic2l6ZSA9ICh1bGcpaXRlbXMqc2l6ZTsKKworICAgIC8qIElmIHdlIGFsbG9jYXRlIGxlc3MgdGhhbiA2NTUyMCBieXRlcywgd2UgYXNzdW1lIHRoYXQgZmFybWFsbG9jCisgICAgICogd2lsbCByZXR1cm4gYSB1c2FibGUgcG9pbnRlciB3aGljaCBkb2Vzbid0IGhhdmUgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAgKi8KKyAgICBpZiAoYnNpemUgPCA2NTUyMEwpIHsKKyAgICAgICAgYnVmID0gZmFybWFsbG9jKGJzaXplKTsKKyAgICAgICAgaWYgKCoodXNoKikmYnVmICE9IDApIHJldHVybiBidWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmID0gZmFybWFsbG9jKGJzaXplICsgMTZMKTsKKyAgICB9CisgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IG5leHRfcHRyID49IE1BWF9QVFIpIHJldHVybiBOVUxMOworICAgIHRhYmxlW25leHRfcHRyXS5vcmdfcHRyID0gYnVmOworCisgICAgLyogTm9ybWFsaXplIHRoZSBwb2ludGVyIHRvIHNlZzowICovCisgICAgKigodXNoKikmYnVmKzEpICs9ICgodXNoKSgodWNoKilidWYtMCkgKyAxNSkgPj4gNDsKKyAgICAqKHVzaCopJmJ1ZiA9IDA7CisgICAgdGFibGVbbmV4dF9wdHIrK10ubmV3X3B0ciA9IGJ1ZjsKKyAgICByZXR1cm4gYnVmOworfQorCit2b2lkICB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit7CisgICAgaW50IG47CisgICAgaWYgKCoodXNoKikmcHRyICE9IDApIHsgLyogb2JqZWN0IDwgNjRLICovCisgICAgICAgIGZhcmZyZWUocHRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBGaW5kIHRoZSBvcmlnaW5hbCBwb2ludGVyICovCisgICAgZm9yIChuID0gMDsgbiA8IG5leHRfcHRyOyBuKyspIHsKKyAgICAgICAgaWYgKHB0ciAhPSB0YWJsZVtuXS5uZXdfcHRyKSBjb250aW51ZTsKKworICAgICAgICBmYXJmcmVlKHRhYmxlW25dLm9yZ19wdHIpOworICAgICAgICB3aGlsZSAoKytuIDwgbmV4dF9wdHIpIHsKKyAgICAgICAgICAgIHRhYmxlW24tMV0gPSB0YWJsZVtuXTsKKyAgICAgICAgfQorICAgICAgICBuZXh0X3B0ci0tOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHB0ciA9IG9wYXF1ZTsgLyoganVzdCB0byBtYWtlIHNvbWUgY29tcGlsZXJzIGhhcHB5ICovCisgICAgQXNzZXJ0KDAsICJ6Y2ZyZWU6IHB0ciBub3QgZm91bmQiKTsKK30KKworI2VuZGlmIC8qIF9fVFVSQk9DX18gKi8KKworCisjaWZkZWYgTV9JODYKKy8qIE1pY3Jvc29mdCBDIGluIDE2LWJpdCBtb2RlICovCisKKyMgIGRlZmluZSBNWV9aQ0FMTE9DCisKKyNpZiAoIWRlZmluZWQoX01TQ19WRVIpIHx8IChfTVNDX1ZFUiA8PSA2MDApKQorIyAgZGVmaW5lIF9oYWxsb2MgIGhhbGxvYworIyAgZGVmaW5lIF9oZnJlZSAgIGhmcmVlCisjZW5kaWYKKwordm9pZHBmIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKQoreworICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyAgICByZXR1cm4gX2hhbGxvYygobG9uZylpdGVtcywgc2l6ZSk7Cit9CisKK3ZvaWQgIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKK3sKKyAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgX2hmcmVlKHB0cik7Cit9CisKKyNlbmRpZiAvKiBNX0k4NiAqLworCisjZW5kaWYgLyogU1lTMTZCSVQgKi8KKworCisjaWZuZGVmIE1ZX1pDQUxMT0MgLyogQW55IHN5c3RlbSB3aXRob3V0IGEgc3BlY2lhbCBhbGxvYyBmdW5jdGlvbiAqLworCisjaWZuZGVmIFNUREMKK2V4dGVybiB2b2lkcCAgbWFsbG9jIE9GKCh1SW50IHNpemUpKTsKK2V4dGVybiB2b2lkcCAgY2FsbG9jIE9GKCh1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKK2V4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7CisjZW5kaWYKKwordm9pZHBmIHpjYWxsb2MgKG9wYXF1ZSwgaXRlbXMsIHNpemUpCisgICAgdm9pZHBmIG9wYXF1ZTsKKyAgICB1bnNpZ25lZCBpdGVtczsKKyAgICB1bnNpZ25lZCBzaXplOworeworICAgIGlmIChvcGFxdWUpIGl0ZW1zICs9IHNpemUgLSBzaXplOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIHNpemVvZih1SW50KSA+IDIgPyAodm9pZHBmKW1hbGxvYyhpdGVtcyAqIHNpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkcGYpY2FsbG9jKGl0ZW1zLCBzaXplKTsKK30KKwordm9pZCAgemNmcmVlIChvcGFxdWUsIHB0cikKKyAgICB2b2lkcGYgb3BhcXVlOworICAgIHZvaWRwZiBwdHI7Cit7CisgICAgZnJlZShwdHIpOworICAgIGlmIChvcGFxdWUpIHJldHVybjsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLworfQorCisjZW5kaWYgLyogTVlfWkNBTExPQyAqLwpkaWZmIC0tZ2l0IGEvdXNyL2tsaWJjL3psaWIvenV0aWwuaCBiL3Vzci9rbGliYy96bGliL3p1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmNTJiMQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci9rbGliYy96bGliL3p1dGlsLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8qIHp1dGlsLmggLS0gaW50ZXJuYWwgaW50ZXJmYWNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBAKCMpICRJZDogenV0aWwuaCx2IDEuMSAyMDA1LzAyLzI3IDIzOjE1OjM5IGhwYSBFeHAgJCAqLworCisjaWZuZGVmIFpVVElMX0gKKyNkZWZpbmUgWlVUSUxfSAorCisjZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZmRlZiBTVERDCisjICBpZm5kZWYgX1dJTjMyX1dDRQorIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgIGVuZGlmCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgTk9fRVJSTk9fSAorIyAgIGlmZGVmIF9XSU4zMl9XQ0UKKyAgICAgIC8qIFRoZSBNaWNyb3NvZnQgQyBSdW4tVGltZSBMaWJyYXJ5IGZvciBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZQorICAgICAgICogZXJybm8uICBXZSBkZWZpbmUgaXQgYXMgYSBnbG9iYWwgdmFyaWFibGUgdG8gc2ltcGxpZnkgcG9ydGluZy4KKyAgICAgICAqIEl0cyB2YWx1ZSBpcyBhbHdheXMgMCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgV2UgcmVuYW1lIGl0IHRvCisgICAgICAgKiBhdm9pZCBjb25mbGljdCB3aXRoIG90aGVyIGxpYnJhcmllcyB0aGF0IHVzZSB0aGUgc2FtZSB3b3JrYXJvdW5kLgorICAgICAgICovCisjICAgICBkZWZpbmUgZXJybm8gel9lcnJubworIyAgIGVuZGlmCisgICAgZXh0ZXJuIGludCBlcnJubzsKKyNlbHNlCisjICBpZm5kZWYgX1dJTjMyX1dDRQorIyAgICBpbmNsdWRlIDxlcnJuby5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIGxvY2FsCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisjZW5kaWYKKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKK3R5cGVkZWYgdWNoIEZBUiB1Y2hmOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVzaCBGQVIgdXNoZjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IHpfZXJybXNnWzEwXTsgLyogaW5kZXhlZCBieSAyLXpsaWJfZXJyb3IgKi8KKy8qIChzaXplIGdpdmVuIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKykgKi8KKworI2RlZmluZSBFUlJfTVNHKGVycikgel9lcnJtc2dbWl9ORUVEX0RJQ1QtKGVycildCisKKyNkZWZpbmUgRVJSX1JFVFVSTihzdHJtLGVycikgXAorICByZXR1cm4gKHN0cm0tPm1zZyA9IChjaGFyKilFUlJfTVNHKGVyciksIChlcnIpKQorLyogVG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN0YXRlIGlzIGtub3duIHRvIGJlIHZhbGlkICovCisKKyAgICAgICAgLyogY29tbW9uIGNvbnN0YW50cyAqLworCisjaWZuZGVmIERFRl9XQklUUworIyAgZGVmaW5lIERFRl9XQklUUyBNQVhfV0JJVFMKKyNlbmRpZgorLyogZGVmYXVsdCB3aW5kb3dCaXRzIGZvciBkZWNvbXByZXNzaW9uLiBNQVhfV0JJVFMgaXMgZm9yIGNvbXByZXNzaW9uIG9ubHkgKi8KKworI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorI2Vsc2UKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCisjZW5kaWYKKy8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KKworI2RlZmluZSBTVE9SRURfQkxPQ0sgMAorI2RlZmluZSBTVEFUSUNfVFJFRVMgMQorI2RlZmluZSBEWU5fVFJFRVMgICAgMgorLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBQUkVTRVRfRElDVCAweDIwIC8qIHByZXNldCBkaWN0aW9uYXJ5IGZsYWcgaW4gemxpYiBoZWFkZXIgKi8KKworICAgICAgICAvKiB0YXJnZXQgZGVwZW5kZW5jaWVzICovCisKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU5ET1dTKSAmJiAhZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMAorIyAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgICAgaWYoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKKyAgICAgICAvKiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkICovCisgICAgICAgdm9pZCBfQ2RlY2wgZmFyZnJlZSggdm9pZCAqYmxvY2sgKTsKKyAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOworIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSA8YWxsb2MuaD4KKyMgICAgZW5kaWYKKyMgIGVsc2UgLyogTVNDIG9yIERKR1BQICovCisjICAgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQU1JR0EKKyMgIGRlZmluZSBPU19DT0RFICAweDAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoVkFYQykgfHwgZGVmaW5lZChWTVMpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMgorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBcCisgICAgIGZvcGVuKChuYW1lKSwgKG1vZGUpLCAibWJjPTYwIiwgImN0eD1zdG0iLCAicmZtPWZpeCIsICJtcnM9NTEyIikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBVEFSSSkgfHwgZGVmaW5lZChhdGFyaXN0KQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDUKKyNlbmRpZgorCisjaWZkZWYgT1MyCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwNgorIyAgaWZkZWYgTV9JODYKKyAgICAgI2luY2x1ZGUgPG1hbGxvYy5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNQUNPUykgfHwgZGVmaW5lZChUQVJHRVRfT1NfTUFDKQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDcKKyMgIGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKKyMgICAgaW5jbHVkZSA8dW5peC5oPiAvKiBmb3IgZmRvcGVuICovCisjICBlbHNlCisjICAgIGlmbmRlZiBmZG9wZW4KKyMgICAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFRPUFMyMAorIyAgZGVmaW5lIE9TX0NPREUgIDB4MGEKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyMgIGlmbmRlZiBfX0NZR1dJTl9fICAvKiBDeWd3aW4gaXMgVW5peCwgbm90IFdpbjMyICovCisjICAgIGRlZmluZSBPU19DT0RFICAweDBiCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfXzUwU0VSSUVTIC8qIFByaW1lL1BSSU1PUyAqLworIyAgZGVmaW5lIE9TX0NPREUgIDB4MGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfQkVPU18pIHx8IGRlZmluZWQoUklTQ09TKQorIyAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiA2MDApKQorIyAgaWYgZGVmaW5lZChfV0lOMzJfV0NFKQorIyAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KKyMgICAgaWZuZGVmIF9QVFJESUZGX1RfREVGSU5FRAorICAgICAgIHR5cGVkZWYgaW50IHB0cmRpZmZfdDsKKyMgICAgICBkZWZpbmUgX1BUUkRJRkZfVF9ERUZJTkVECisjICAgIGVuZGlmCisjICBlbHNlCisjICAgIGRlZmluZSBmZG9wZW4oZmQsdHlwZSkgIF9mZG9wZW4oZmQsdHlwZSkKKyMgIGVuZGlmCisjZW5kaWYKKworICAgICAgICAvKiBjb21tb24gZGVmYXVsdHMgKi8KKworI2lmbmRlZiBPU19DT0RFCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMyAgLyogYXNzdW1lIFVuaXggKi8KKyNlbmRpZgorCisjaWZuZGVmIEZfT1BFTgorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBmb3BlbigobmFtZSksIChtb2RlKSkKKyNlbmRpZgorCisgICAgICAgICAvKiBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoU1REQzk5KSB8fCAoZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBfX1RVUkJPQ19fID49IDB4NTUwKQorIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCisjICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9WU05QUklOVEYKKyMgIGlmZGVmIE1TRE9TCisgICAgIC8qIHZzbnByaW50ZiBtYXkgZXhpc3Qgb24gc29tZSBNUy1ET1MgY29tcGlsZXJzIChESkdQUD8pLAorICAgICAgICBidXQgZm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSBpdCBkb2Vzbid0LiAqLworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgX19UVVJCT0NfXworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgV0lOMzIKKyAgICAgLyogSW4gV2luMzIsIHZzbnByaW50ZiBpcyBhdmFpbGFibGUgYXMgdGhlICJub24tQU5TSSIgX3ZzbnByaW50Zi4gKi8KKyMgICAgaWYgIWRlZmluZWQodnNucHJpbnRmKSAmJiAhZGVmaW5lZChOT192c25wcmludGYpCisjICAgICAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX19TQVNDCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBWTVMKKyMgIGRlZmluZSBOT192c25wcmludGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChweXIpCisjICBkZWZpbmUgTk9fTUVNQ1BZCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKKyAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgorICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgorICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgorICAqLworIyAgZGVmaW5lIE5PX01FTUNQWQorI2VuZGlmCisjaWYgZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChIQVZFX01FTUNQWSkgJiYgIWRlZmluZWQoTk9fTUVNQ1BZKQorIyAgZGVmaW5lIEhBVkVfTUVNQ1BZCisjZW5kaWYKKyNpZmRlZiBIQVZFX01FTUNQWQorIyAgaWZkZWYgU01BTExfTUVESVVNIC8qIE1TRE9TIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgem1lbWNweSBfZm1lbWNweQorIyAgICBkZWZpbmUgem1lbWNtcCBfZm1lbWNtcAorIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBfZm1lbXNldChkZXN0LCAwLCBsZW4pCisjICBlbHNlCisjICAgIGRlZmluZSB6bWVtY3B5IG1lbWNweQorIyAgICBkZWZpbmUgem1lbWNtcCBtZW1jbXAKKyMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgbWVtc2V0KGRlc3QsIDAsIGxlbikKKyMgIGVuZGlmCisjZWxzZQorICAgZXh0ZXJuIHZvaWQgem1lbWNweSAgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOworICAgZXh0ZXJuIGludCAgem1lbWNtcCAgT0YoKGNvbnN0IEJ5dGVmKiBzMSwgY29uc3QgQnl0ZWYqIHMyLCB1SW50IGxlbikpOworICAgZXh0ZXJuIHZvaWQgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOworI2VuZGlmCisKKy8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCisjaWZkZWYgREVCVUcKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisgICBleHRlcm4gaW50IHpfdmVyYm9zZTsKKyAgIGV4dGVybiB2b2lkIHpfZXJyb3IgICAgT0YoKGNoYXIgKm0pKTsKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSB6X2Vycm9yKG1zZyk7fQorIyAgZGVmaW5lIFRyYWNlKHgpIHtpZiAoel92ZXJib3NlPj0wKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh6X3ZlcmJvc2U+MCkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHpfdmVyYm9zZT4xKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHpfdmVyYm9zZT4wICYmIChjKSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAoel92ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KKyNlbHNlCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQorIyAgZGVmaW5lIFRyYWNlKHgpCisjICBkZWZpbmUgVHJhY2V2KHgpCisjICBkZWZpbmUgVHJhY2V2dih4KQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpCisjICBkZWZpbmUgVHJhY2VjdihjLHgpCisjZW5kaWYKKworCit2b2lkcGYgemNhbGxvYyBPRigodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpKTsKK3ZvaWQgICB6Y2ZyZWUgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKSk7CisKKyNkZWZpbmUgWkFMTE9DKHN0cm0sIGl0ZW1zLCBzaXplKSBcCisgICAgICAgICAgICgqKChzdHJtKS0+emFsbG9jKSkoKHN0cm0pLT5vcGFxdWUsIChpdGVtcyksIChzaXplKSkKKyNkZWZpbmUgWkZSRUUoc3RybSwgYWRkcikgICgqKChzdHJtKS0+emZyZWUpKSgoc3RybSktPm9wYXF1ZSwgKHZvaWRwZikoYWRkcikpCisjZGVmaW5lIFRSWV9GUkVFKHMsIHApIHtpZiAocCkgWkZSRUUocywgcCk7fQorCisjZW5kaWYgLyogWlVUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL0tidWlsZCBiL3Vzci91dGlscy9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NGI1OQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9LYnVpbGQKQEAgLTAsMCArMSw2OCBAQAorIworIyBLYnVpbGQgZmlsZSBmb3Iga2xpYiB1dGlscworIworCitwcm9ncyA6PSBjaHJvb3QgZGQgbWtkaXIgbWtmaWZvIG1rbm9kIG1vdW50IHBpdm90X3Jvb3QgdW1vdW50Citwcm9ncyArPSB0cnVlIGZhbHNlIHNsZWVwIGxuIG51a2UgbWluaXBzIGNhdAorcHJvZ3MgKz0gaW5zbW9kIHVuYW1lIGhhbHQga2lsbCByZWFkbGluayBjcGlvCisKK3N0YXRpYy15IDo9ICQoYWRkcHJlZml4IHN0YXRpYy8sICQocHJvZ3MpKQorc2hhcmVkLXkgOj0gJChhZGRwcmVmaXggc2hhcmVkLywgJChwcm9ncykpCisKKyMgVGhlIGJpbmFyeSBpcyBwbGFjZWQgaW4gYSBzdWJkaXIsIHNvIHdlIG5lZWQgdG8gdGVsbCBrYnVpbGQgdGhpcworc3RhdGljL2Nocm9vdC15ICAgICA6PSBjaHJvb3Qubworc2hhcmVkL2Nocm9vdC15ICAgICA6PSBjaHJvb3Qubworc3RhdGljL2RkLXkgICAgICAgICA6PSBkZC5vCitzaGFyZWQvZGQteSAgICAgICAgIDo9IGRkLm8KK3N0YXRpYy9ta2Rpci15ICAgICAgOj0gbWtkaXIubyBmaWxlX21vZGUubworc2hhcmVkL21rZGlyLXkgICAgICA6PSBta2Rpci5vIGZpbGVfbW9kZS5vCitzdGF0aWMvbWtmaWZvLXkgICAgIDo9IG1rZmlmby5vIGZpbGVfbW9kZS5vCitzaGFyZWQvbWtmaWZvLXkgICAgIDo9IG1rZmlmby5vIGZpbGVfbW9kZS5vCitzdGF0aWMvbWtub2QteSAgICAgIDo9IG1rbm9kLm8gZmlsZV9tb2RlLm8KK3NoYXJlZC9ta25vZC15ICAgICAgOj0gbWtub2QubyBmaWxlX21vZGUubworc3RhdGljL21vdW50LXkgICAgICA6PSBtb3VudF9tYWluLm8gbW91bnRfb3B0cy5vCitzaGFyZWQvbW91bnQteSAgICAgIDo9IG1vdW50X21haW4ubyBtb3VudF9vcHRzLm8KK3N0YXRpYy9waXZvdF9yb290LXkgOj0gcGl2b3Rfcm9vdC5vCitzaGFyZWQvcGl2b3Rfcm9vdC15IDo9IHBpdm90X3Jvb3Qubworc3RhdGljL3Vtb3VudC15ICAgICA6PSB1bW91bnQubworc2hhcmVkL3Vtb3VudC15ICAgICA6PSB1bW91bnQubworc3RhdGljL3RydWUteSAgICAgICA6PSB0cnVlLm8KK3NoYXJlZC90cnVlLXkgICAgICAgOj0gdHJ1ZS5vCitzdGF0aWMvZmFsc2UteSAgICAgIDo9IGZhbHNlLm8KK3NoYXJlZC9mYWxzZS15ICAgICAgOj0gZmFsc2Uubworc3RhdGljL3NsZWVwLXkgICAgICA6PSBzbGVlcC5vCitzaGFyZWQvc2xlZXAteSAgICAgIDo9IHNsZWVwLm8KK3N0YXRpYy9sbi15ICAgICAgICAgOj0gbG4ubworc2hhcmVkL2xuLXkgICAgICAgICA6PSBsbi5vCitzdGF0aWMvbnVrZS15ICAgICAgIDo9IG51a2Uubworc2hhcmVkL251a2UteSAgICAgICA6PSBudWtlLm8KK3N0YXRpYy9taW5pcHMteSAgICAgOj0gbWluaXBzLm8KK3NoYXJlZC9taW5pcHMteSAgICAgOj0gbWluaXBzLm8KK3N0YXRpYy9jYXQteSAgICAgICAgOj0gY2F0Lm8KK3NoYXJlZC9jYXQteSAgICAgICAgOj0gY2F0Lm8KK3N0YXRpYy9pbnNtb2QteSAgICAgOj0gaW5zbW9kLm8KK3NoYXJlZC9pbnNtb2QteSAgICAgOj0gaW5zbW9kLm8KK3N0YXRpYy91bmFtZS15ICAgICAgOj0gdW5hbWUubworc2hhcmVkL3VuYW1lLXkgICAgICA6PSB1bmFtZS5vCitzdGF0aWMvaGFsdC15ICAgICAgIDo9IGhhbHQubworc2hhcmVkL2hhbHQteSAgICAgICA6PSBoYWx0Lm8KK3N0YXRpYy9raWxsLXkgICAgICAgOj0ga2lsbC5vCitzaGFyZWQva2lsbC15ICAgICAgIDo9IGtpbGwubworc3RhdGljL3JlYWRsaW5rLXkgICA6PSByZWFkbGluay5vCitzaGFyZWQvcmVhZGxpbmsteSAgIDo9IHJlYWRsaW5rLm8KK3N0YXRpYy9jcGlvLXkJICAgIDo9IGNwaW8ubworc2hhcmVkL2NwaW8teSAgICAgICA6PSBjcGlvLm8KKworIyBBZGRpdGlvbmFsbHkgbGlua2VkIHRhcmdldHMKK2Fsd2F5cyA6PSBzdGF0aWMvcmVib290IHN0YXRpYy9wb3dlcm9mZiBzaGFyZWQvcmVib290IHNoYXJlZC9wb3dlcm9mZgorCiskKG9iaikvc3RhdGljL3JlYm9vdCAkKG9iaikvc3RhdGljL3Bvd2Vyb2ZmOiAkKG9iaikvc3RhdGljL2hhbHQKKwkkKGNhbGwgY21kLGxuKQorJChvYmopL3NoYXJlZC9yZWJvb3QgJChvYmopL3NoYXJlZC9wb3dlcm9mZjogJChvYmopL3NoYXJlZC9oYWx0CisJJChjYWxsIGNtZCxsbikKKworIyBDbGVhbiBkZWxldGVzIHRoZSBzdGF0aWMgYW5kIHNoYXJlZCBkaXIKK2NsZWFuLWRpcnMgOj0gc3RhdGljIHNoYXJlZAorCisjIGluc3RhbGwgb25seSBpbnN0YWxsIHRoZSBzaGFyZWQgYmluYXJpZXMKK2luc3RhbGwteSA6PSAkKHNoYXJlZC15KSBzaGFyZWQvcmVib290IHNoYXJlZC9wb3dlcm9mZgpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2NhdC5jIGIvdXNyL3V0aWxzL2NhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDhkMmUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvY2F0LmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qICROZXRCU0Q6IGNhdC5jLHYgMS40MyAyMDA0LzAxLzA0IDAzOjMxOjI4IGpzY2hhdW1hIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtldmluIEZhbGwuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19DT1BZUklHSFQKKyNkZWZpbmUgX19DT1BZUklHSFQoYXJnKQorI2VuZGlmCisjaWZuZGVmIF9fUkNTSUQKKyNkZWZpbmUgX19SQ1NJRChhcmcpCisjZW5kaWYKKworI2lmIEhBVkVfTkJUT09MX0NPTkZJR19ICisjaW5jbHVkZSAibmJ0b29sX2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZm5kZWYgX19LTElCQ19fCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjZW5kaWYKKyNpZiAhZGVmaW5lZChsaW50KQorX19DT1BZUklHSFQoIkAoIykgQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzXG5cCisJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iKTsKKyNpZiAwCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpY2F0LmMJOC4yIChCZXJrZWxleSkgNC8yNy85NSI7CisjZWxzZQorX19SQ1NJRCgiJE5ldEJTRDogY2F0LmMsdiAxLjQzIDIwMDQvMDEvMDQgMDM6MzE6MjgganNjaGF1bWEgRXhwICQiKTsKKyNlbmRpZgorI2VuZGlmCQkJCS8qIG5vdCBsaW50ICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZm5kZWYgX19LTElCQ19fCisjaW5jbHVkZSA8ZXJyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZuZGVmIF9fS0xJQkNfXworI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IGJmbGFnLCBlZmxhZywgZmZsYWcsIGxmbGFnLCBuZmxhZywgc2ZsYWcsIHRmbGFnLCB2ZmxhZzsKK2ludCBydmFsOworY29uc3QgY2hhciAqZmlsZW5hbWU7CisKK2ludCBtYWluKGludCwgY2hhciAqW10pOwordm9pZCBjb29rX2FyZ3MoY2hhciAqYXJndltdKTsKK3ZvaWQgY29va19idWYoRklMRSAqKTsKK3ZvaWQgcmF3X2FyZ3MoY2hhciAqYXJndltdKTsKK3ZvaWQgcmF3X2NhdChpbnQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjaDsKKwlzdHJ1Y3QgZmxvY2sgc3Rkb3V0X2xvY2s7CisKKyNpZm5kZWYgX19LTElCQ19fCisJc2V0cHJvZ25hbWUoYXJndlswXSk7CisJKHZvaWQpc2V0bG9jYWxlKExDX0FMTCwgIiIpOworI2VuZGlmCisKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJiZWZsbnN0dXYiKSkgIT0gLTEpCisJCXN3aXRjaCAoY2gpIHsKKwkJY2FzZSAnYic6CisJCQliZmxhZyA9IG5mbGFnID0gMTsJLyogLWIgaW1wbGllcyAtbiAqLworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJZWZsYWcgPSB2ZmxhZyA9IDE7CS8qIC1lIGltcGxpZXMgLXYgKi8KKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWZmbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWxmbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5mbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXNmbGFnID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXRmbGFnID0gdmZsYWcgPSAxOwkvKiAtdCBpbXBsaWVzIC12ICovCisJCQlicmVhazsKKwkJY2FzZSAndSc6CisjaWZuZGVmIF9fS0xJQkNfXworCQkJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZmbGFnID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlICc/JzoKKwkJCSh2b2lkKWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAgICJ1c2FnZTogY2F0IFstYmVmbG5zdHV2XSBbLV0gW2ZpbGUgLi4uXVxuIik7CisJCQlleGl0KDEpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAobGZsYWcpIHsKKwkJc3Rkb3V0X2xvY2subF9sZW4gPSAwOworCQlzdGRvdXRfbG9jay5sX3N0YXJ0ID0gMDsKKwkJc3Rkb3V0X2xvY2subF90eXBlID0gRl9XUkxDSzsKKwkJc3Rkb3V0X2xvY2subF93aGVuY2UgPSBTRUVLX1NFVDsKKwkJaWYgKGZjbnRsKFNURE9VVF9GSUxFTk8sIEZfU0VUTEtXLCAmc3Rkb3V0X2xvY2spID09IC0xKSB7CisJCQlwZXJyb3IoImZjbnRsIik7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKGJmbGFnIHx8IGVmbGFnIHx8IG5mbGFnIHx8IHNmbGFnIHx8IHRmbGFnIHx8IHZmbGFnKQorCQljb29rX2FyZ3MoYXJndik7CisJZWxzZQorCQlyYXdfYXJncyhhcmd2KTsKKwlpZiAoZmNsb3NlKHN0ZG91dCkpIHsKKwkJcGVycm9yKCJmY2xvc2UiKTsKKwkJZXhpdCgxKTsKKwl9CisJZXhpdChydmFsKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3ZvaWQgY29va19hcmdzKGNoYXIgKiphcmd2KQoreworCUZJTEUgKmZwOworCisJZnAgPSBzdGRpbjsKKwlmaWxlbmFtZSA9ICJzdGRpbiI7CisJZG8geworCQlpZiAoKmFyZ3YpIHsKKwkJCWlmICghc3RyY21wKCphcmd2LCAiLSIpKQorCQkJCWZwID0gc3RkaW47CisJCQllbHNlIGlmICgoZnAgPSBmb3BlbigqYXJndiwKKwkJCQkJICAgICBmZmxhZyA/ICJyZiIgOiAiciIpKSA9PSBOVUxMKSB7CisJCQkJcGVycm9yKCJmb3BlbiIpOworCQkJCXJ2YWwgPSAxOworCQkJCSsrYXJndjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZpbGVuYW1lID0gKmFyZ3YrKzsKKwkJfQorCQljb29rX2J1ZihmcCk7CisJCWlmIChmcCAhPSBzdGRpbikKKwkJCSh2b2lkKWZjbG9zZShmcCk7CisJfSB3aGlsZSAoKmFyZ3YpOworfQorCit2b2lkIGNvb2tfYnVmKEZJTEUgKiBmcCkKK3sKKwlpbnQgY2gsIGdvYmJsZSwgbGluZSwgcHJldjsKKwlpbnQgc3Rkb3V0X2VyciA9IDA7CisKKwlsaW5lID0gZ29iYmxlID0gMDsKKwlmb3IgKHByZXYgPSAnXG4nOyAoY2ggPSBnZXRjKGZwKSkgIT0gRU9GOyBwcmV2ID0gY2gpIHsKKwkJaWYgKHByZXYgPT0gJ1xuJykgeworCQkJaWYgKGNoID09ICdcbicpIHsKKwkJCQlpZiAoc2ZsYWcpIHsKKwkJCQkJaWYgKCFnb2JibGUgJiYgcHV0Y2hhcihjaCkgPT0gRU9GKQorCQkJCQkJYnJlYWs7CisJCQkJCWdvYmJsZSA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAobmZsYWcpIHsKKwkJCQkJaWYgKCFiZmxhZykgeworCQkJCQkJaWYgKGZwcmludGYoc3Rkb3V0LAorCQkJCQkJCSAgICAiJTZkXHQiLAorCQkJCQkJCSAgICArK2xpbmUpIDwgMCkgeworCQkJCQkJCXN0ZG91dF9lcnIrKzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChlZmxhZykgeworCQkJCQkJaWYgKGZwcmludGYoc3Rkb3V0LAorCQkJCQkJCSAgICAiJTZzXHQiLCAiIikgPCAwKSB7CisJCQkJCQkJc3Rkb3V0X2VycisrOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChuZmxhZykgeworCQkJCWlmIChmcHJpbnRmKHN0ZG91dCwgIiU2ZFx0IiwgKytsaW5lKSA8IDApIHsKKwkJCQkJc3Rkb3V0X2VycisrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJZ29iYmxlID0gMDsKKwkJaWYgKGNoID09ICdcbicpIHsKKwkJCWlmIChlZmxhZykKKwkJCQlpZiAocHV0Y2hhcignJCcpID09IEVPRikKKwkJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoY2ggPT0gJ1x0JykgeworCQkJaWYgKHRmbGFnKSB7CisJCQkJaWYgKHB1dGNoYXIoJ14nKSA9PSBFT0YgfHwgcHV0Y2hhcignSScpID09IEVPRikKKwkJCQkJYnJlYWs7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSBpZiAodmZsYWcpIHsKKwkJCWlmICghaXNhc2NpaShjaCkpIHsKKwkJCQlpZiAocHV0Y2hhcignTScpID09IEVPRiB8fCBwdXRjaGFyKCctJykgPT0gRU9GKQorCQkJCQlicmVhazsKKwkJCQljaCA9IChjaCkgJiAweDdmOworCQkJfQorCQkJaWYgKGlzY250cmwoY2gpKSB7CisJCQkJaWYgKHB1dGNoYXIoJ14nKSA9PSBFT0YgfHwKKwkJCQkgICAgcHV0Y2hhcihjaCA9PSAnXDE3NycgPyAnPycgOgorCQkJCQkgICAgY2ggfCAwMTAwKSA9PSBFT0YpCisJCQkJCWJyZWFrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChwdXRjaGFyKGNoKSA9PSBFT0YpCisJCQlicmVhazsKKwl9CisJaWYgKHN0ZG91dF9lcnIpIHsKKwkJcGVycm9yKGZpbGVuYW1lKTsKKwkJcnZhbCA9IDE7CisJfQorfQorCit2b2lkIHJhd19hcmdzKGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKworCWZkID0gZmlsZW5vKHN0ZGluKTsKKwlmaWxlbmFtZSA9ICJzdGRpbiI7CisJZG8geworCQlpZiAoKmFyZ3YpIHsKKwkJCWlmICghc3RyY21wKCphcmd2LCAiLSIpKQorCQkJCWZkID0gZmlsZW5vKHN0ZGluKTsKKwkJCWVsc2UgaWYgKGZmbGFnKSB7CisJCQkJc3RydWN0IHN0YXQgc3Q7CisJCQkJZmQgPSBvcGVuKCphcmd2LCBPX1JET05MWSB8IE9fTk9OQkxPQ0ssIDApOworCQkJCWlmIChmZCA8IDApCisJCQkJCWdvdG8gc2tpcDsKKworCQkJCWlmIChmc3RhdChmZCwgJnN0KSA9PSAtMSkgeworCQkJCQljbG9zZShmZCk7CisJCQkJCWdvdG8gc2tpcDsKKwkJCQl9CisJCQkJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCQkJCWNsb3NlKGZkKTsKKwkJCQkJZXJybm8gPSBFSU5WQUw7CisJCQkJCWdvdG8gc2tpcG5vbXNnOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKGZkID0gb3BlbigqYXJndiwgT19SRE9OTFksIDApKSA8IDApIHsKKwkJCSAgICAgIHNraXA6CisJCQkJcGVycm9yKCphcmd2KTsKKwkJCSAgICAgIHNraXBub21zZzoKKwkJCQlydmFsID0gMTsKKwkJCQkrK2FyZ3Y7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmaWxlbmFtZSA9ICphcmd2Kys7CisJCX0KKwkJcmF3X2NhdChmZCk7CisJCWlmIChmZCAhPSBmaWxlbm8oc3RkaW4pKQorCQkJKHZvaWQpY2xvc2UoZmQpOworCX0gd2hpbGUgKCphcmd2KTsKK30KKwordm9pZCByYXdfY2F0KGludCByZmQpCit7CisJc3RhdGljIGNoYXIgKmJ1ZjsKKwlzdGF0aWMgY2hhciBmYl9idWZbQlVGU0laXTsKKwlzdGF0aWMgc2l6ZV90IGJzaXplOworCisJc3RydWN0IHN0YXQgc2J1ZjsKKwlzc2l6ZV90IG5yLCBudywgb2ZmOworCWludCB3ZmQ7CisKKwl3ZmQgPSBmaWxlbm8oc3Rkb3V0KTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJaWYgKGZzdGF0KHdmZCwgJnNidWYpID09IDApIHsKKwkJCWJzaXplID0gc2J1Zi5zdF9ibGtzaXplID4gQlVGU0laID8KKwkJCSAgICBzYnVmLnN0X2Jsa3NpemUgOiBCVUZTSVo7CisJCQlidWYgPSBtYWxsb2MoYnNpemUpOworCQl9CisJCWlmIChidWYgPT0gTlVMTCkgeworCQkJYnVmID0gZmJfYnVmOworCQkJYnNpemUgPSBCVUZTSVo7CisJCX0KKwl9CisJd2hpbGUgKChuciA9IHJlYWQocmZkLCBidWYsIGJzaXplKSkgPiAwKQorCQlmb3IgKG9mZiA9IDA7IG5yOyBuciAtPSBudywgb2ZmICs9IG53KQorCQkJaWYgKChudyA9IHdyaXRlKHdmZCwgYnVmICsgb2ZmLCAoc2l6ZV90KSBucikpIDwgMCkgeworCQkJCXBlcnJvcigid3JpdGUiKTsKKwkJCQlleGl0KDEpOworCQkJfQorCWlmIChuciA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBsZW5ndGhcbiIsIGZpbGVuYW1lKTsKKwkJcnZhbCA9IDE7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2Nocm9vdC5jIGIvdXNyL3V0aWxzL2Nocm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTY3OTEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvY2hyb290LmMKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIGJ5IHJtaworICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqZW52cFtdKQoreworCWlmIChhcmdjIDwgMykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBuZXdyb290IGNvbW1hbmQuLi5cbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoY2hyb290KGFyZ3ZbMV0pID09IC0xKSB7CisJCXBlcnJvcigiY2hyb290Iik7CisJCXJldHVybiAxOworCX0KKworCWlmIChleGVjdmUoYXJndlsyXSwgYXJndiArIDIsIGVudnApID09IC0xKSB7CisJCXBlcnJvcigiZXhlY3ZlIik7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2NwaW8uYyBiL3Vzci91dGlscy9jcGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxZjQwYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9jcGlvLmMKQEAgLTAsMCArMSwxMTAyIEBACisvKiBjb3B5aW4uYyAtIGV4dHJhY3Qgb3IgbGlzdCBhIGNwaW8gYXJjaGl2ZQorICAgQ29weXJpZ2h0IChDKSAxOTkwLDE5OTEsMTk5MiwyMDAxLDIwMDIsMjAwMywyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aW1lLmg+CisjaWZuZGVmCUZOTV9QQVRITkFNRQorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNlbmRpZgorCisjaWZuZGVmCU9fQklOQVJZCisjIGRlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworIyBpZm5kZWYgRElSRUNUT1JZX1NFUEFSQVRPUgorIyAgZGVmaW5lIERJUkVDVE9SWV9TRVBBUkFUT1IgJy8nCisjIGVuZGlmCisKKyMgaWZuZGVmIElTU0xBU0gKKyMgIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gRElSRUNUT1JZX1NFUEFSQVRPUikKKyMgZW5kaWYKKworIyBpZm5kZWYgRklMRV9TWVNURU1fUFJFRklYX0xFTgorIyAgZGVmaW5lIEZJTEVfU1lTVEVNX1BSRUZJWF9MRU4oRmlsZW5hbWUpIDAKKyMgZW5kaWYKKworI2lmbmRlZiBTWU1MSU5LX1VTRVNfVU1BU0sKKyMgZGVmaW5lIFVNQVNLRURfU1lNTElOSyhuYW1lMSxuYW1lMixtb2RlKSAgICBzeW1saW5rKG5hbWUxLG5hbWUyKQorI2Vsc2UKKyMgZGVmaW5lIFVNQVNLRURfU1lNTElOSyhuYW1lMSxuYW1lMixtb2RlKSAgICB1bWFza2VkX3N5bWxpbmsobmFtZTEsbmFtZTIsbW9kZSkKKyNlbmRpZgkJCQkvKiBTWU1MSU5LX1VTRVNfVU1BU0sgKi8KKworLyogUmV0dXJuIDEgaWYgYW4gYXJyYXkgb2YgTiBvYmplY3RzLCBlYWNoIG9mIHNpemUgUywgY2Fubm90IGV4aXN0IGR1ZQorICAgdG8gc2l6ZSBhcml0aG1ldGljIG92ZXJmbG93LiAgUyBtdXN0IGJlIHBvc2l0aXZlIGFuZCBOIG11c3QgYmUKKyAgIG5vbm5lZ2F0aXZlLiAgVGhpcyBpcyBhIG1hY3JvLCBub3QgYW4gaW5saW5lIGZ1bmN0aW9uLCBzbyB0aGF0IGl0CisgICB3b3JrcyBjb3JyZWN0bHkgZXZlbiB3aGVuIFNJWkVfTUFYIDwgTi4KKworICAgQnkgZ251bGliIGNvbnZlbnRpb24sIFNJWkVfTUFYIHJlcHJlc2VudHMgb3ZlcmZsb3cgaW4gc2l6ZQorICAgY2FsY3VsYXRpb25zLCBzbyB0aGUgY29uc2VydmF0aXZlIGRpdmlkZW5kIHRvIHVzZSBoZXJlIGlzCisgICBTSVpFX01BWCAtIDEsIHNpbmNlIFNJWkVfTUFYIG1pZ2h0IHJlcHJlc2VudCBhbiBvdmVyZmxvd2VkIHZhbHVlLgorICAgSG93ZXZlciwgbWFsbG9jIChTSVpFX01BWCkgZmFpbHMgb24gYWxsIGtub3duIGhvc3RzIHdoZXJlCisgICBzaXplb2YgKHB0cmRpZmZfdCkgPD0gc2l6ZW9mIChzaXplX3QpLCBzbyBkbyBub3QgYm90aGVyIHRvIHRlc3QgZm9yCisgICBleGFjdGx5LVNJWkVfTUFYIGFsbG9jYXRpb25zIG9uIHN1Y2ggaG9zdHM7IHRoaXMgYXZvaWRzIGEgdGVzdCBhbmQKKyAgIGJyYW5jaCB3aGVuIFMgaXMga25vd24gdG8gYmUgMS4gICovCisjIGRlZmluZSB4YWxsb2Nfb3ZlcnNpemVkKG4sIHMpIFwKKyAgICAoKHNpemVfdCkgKHNpemVvZiAocHRyZGlmZl90KSA8PSBzaXplb2YgKHNpemVfdCkgPyAtMSA6IC0yKSAvIChzKSA8IChuKSkKKworI2RlZmluZSBESVNLX0lPX0JMT0NLX1NJWkUJKDUxMikKKworY2hhciAqcHJvZ25hbWUgPSBOVUxMOworCisvKiBJZiB0cnVlLCBwcmludCBhIC4gZm9yIGVhY2ggZmlsZSBwcm9jZXNzZWQuICgtVikgKi8KK2NoYXIgZG90X2ZsYWcgPSBmYWxzZTsKKworLyogSW5wdXQgYW5kIG91dHB1dCBidWZmZXJzLiAgKi8KK2NoYXIgKmlucHV0X2J1ZmZlciwgKm91dHB1dF9idWZmZXI7CisKKy8qIFRoZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuICAqLworbG9uZyBpbnB1dF9idWZmZXJfc2l6ZTsKKworLyogQ3VycmVudCBsb2NhdGlvbnMgaW4gYGlucHV0X2J1ZmZlcicgYW5kIGBvdXRwdXRfYnVmZmVyJy4gICovCitjaGFyICppbl9idWZmLCAqb3V0X2J1ZmY7CisKKy8qIEN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBhdCBgaW5wdXRfYnVmZicgYW5kIGBvdXRwdXRfYnVmZicuICAqLworbG9uZyBpbnB1dF9zaXplLCBvdXRwdXRfc2l6ZTsKKworLyogQmxvY2sgc2l6ZSB2YWx1ZSwgaW5pdGlhbGx5IDUxMi4gIC1CIHNldHMgdG8gNTEyMC4gICovCitpbnQgaW9fYmxvY2tfc2l6ZSA9IDUxMjsKKworc3RydWN0IG5ld19jcGlvX2hlYWRlciB7CisJdW5zaWduZWQgc2hvcnQgY19tYWdpYzsKKwl1bnNpZ25lZCBsb25nIGNfaW5vOworCXVuc2lnbmVkIGxvbmcgY19tb2RlOworCXVuc2lnbmVkIGxvbmcgY191aWQ7CisJdW5zaWduZWQgbG9uZyBjX2dpZDsKKwl1bnNpZ25lZCBsb25nIGNfbmxpbms7CisJdW5zaWduZWQgbG9uZyBjX210aW1lOworCXVuc2lnbmVkIGxvbmcgY19maWxlc2l6ZTsKKwlsb25nIGNfZGV2X21hajsKKwlsb25nIGNfZGV2X21pbjsKKwlsb25nIGNfcmRldl9tYWo7CisJbG9uZyBjX3JkZXZfbWluOworCXVuc2lnbmVkIGxvbmcgY19uYW1lc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGNfY2hrc3VtOworCWNoYXIgKmNfbmFtZTsKKwljaGFyICpjX3Rhcl9saW5rbmFtZTsKK307CisKKy8qIFRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGFuZCB3cml0dGVuIGZvciBhbGwgZmlsZXMuICAKKyAgIE5vdyB0aGF0IG1hbnkgdGFwZSBkcml2ZXMgaG9sZCBtb3JlIHRoYW4gNEdiIHdlIG5lZWQgbW9yZSB0aGFuIDMyCisgICBiaXRzIHRvIGhvbGQgaW5wdXRfYnl0ZXMgYW5kIG91dHB1dF9ieXRlcy4gIEJ1dCBpdCdzIG5vdCB3b3J0aAorICAgdGhlIHRyb3VibGUgb2YgYWRkaW5nIHNwZWNpYWwgbXVsdGktcHJlY2lzaW9uIGFyaXRobWV0aWMgaWYgdGhlIAorICAgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IDY0IGJpdCBpbnRzIHNpbmNlIGlucHV0X2J5dGVzIGFuZAorICAgb3V0cHV0X2J5dGVzIGFyZSBvbmx5IHVzZWQgdG8gcHJpbnQgdGhlIG51bWJlciBvZiBibG9ja3MgY29waWVkLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworbG9uZyBsb25nIGlucHV0X2J5dGVzLCBvdXRwdXRfYnl0ZXM7CisjZWxzZQorbG9uZyBpbnB1dF9ieXRlcywgb3V0cHV0X2J5dGVzOworI2VuZGlmCisKKy8qIEFsbG9jYXRlIE4gYnl0ZXMgb2YgbWVtb3J5IGR5bmFtaWNhbGx5LCB3aXRoIGVycm9yIGNoZWNraW5nLiAgKi8KKwordm9pZCAqeG1hbGxvYyhzaXplX3QgbikKK3sKKwl2b2lkICpwOworCWlmICh4YWxsb2Nfb3ZlcnNpemVkKG4sIDEpIHx8ICghKHAgPSBtYWxsb2MobikpICYmIG4gIT0gMCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogbWVtb3J5IGV4aGF1c3RlZFxuIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKwlyZXR1cm4gcDsKKy8qICAgcmV0dXJuIHhubWFsbG9jX2lubGluZSAobiwgMSk7ICovCit9CisKKy8qIENoYW5nZSB0aGUgc2l6ZSBvZiBhbiBhbGxvY2F0ZWQgYmxvY2sgb2YgbWVtb3J5IFAgdG8gTiBieXRlcywKKyAgIHdpdGggZXJyb3IgY2hlY2tpbmcuICAqLworCit2b2lkICp4cmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbikKK3sKKwlpZiAoeGFsbG9jX292ZXJzaXplZChuLCAxKSB8fCAoIShwID0gcmVhbGxvYyhwLCBuKSkgJiYgbiAhPSAwKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBtZW1vcnkgZXhoYXVzdGVkXG4iLCBwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXJldHVybiBwOworLyogICByZXR1cm4geG5yZWFsbG9jX2lubGluZSAocCwgbiwgMSk7ICovCit9CisKKy8qIENsb25lIFNUUklORy4gICovCisKK2NoYXIgKnhzdHJkdXAoY2hhciBjb25zdCAqc3RyaW5nKQoreworCXNpemVfdCBzID0gc3RybGVuKHN0cmluZykgKyAxOworCXJldHVybiBtZW1jcHkoeG1hbGxvYyhzKSwgc3RyaW5nLCBzKTsKKy8qICAgcmV0dXJuIHhtZW1kdXBfaW5saW5lIChzdHJpbmcsIHN0cmxlbiAoc3RyaW5nKSArIDEpOyAqLworfQorCisvKiBDb3B5IE5VTV9CWVRFUyBvZiBidWZmZXIgYGluX2J1ZmYnIGludG8gSU5fQlVGLgorICAgYGluX2J1ZmYnIG1heSBiZSBwYXJ0bHkgZnVsbC4KKyAgIFdoZW4gYGluX2J1ZmYnIGlzIGV4aGF1c3RlZCwgcmVmaWxsIGl0IGZyb20gZmlsZSBkZXNjcmlwdG9yIElOX0RFUy4gICovCisKK3N0YXRpYyB2b2lkIHRhcGVfZmlsbF9pbnB1dF9idWZmZXIoaW50IGluX2RlcywgaW50IG51bV9ieXRlcykKK3sKKwlpbl9idWZmID0gaW5wdXRfYnVmZmVyOworCW51bV9ieXRlcyA9IChudW1fYnl0ZXMgPCBpb19ibG9ja19zaXplKSA/IG51bV9ieXRlcyA6IGlvX2Jsb2NrX3NpemU7CisJaW5wdXRfc2l6ZSA9IHJlYWQoaW5fZGVzLCBpbnB1dF9idWZmZXIsIG51bV9ieXRlcyk7CisJaWYgKGlucHV0X3NpemUgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHJlYWQgZXJyb3I6ICVzXG4iLCBwcm9nbmFtZSwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChpbnB1dF9zaXplID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogcHJlbWF0dXJlIGVuZCBvZiBmaWxlXG4iLCBwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlucHV0X2J5dGVzICs9IGlucHV0X3NpemU7Cit9CisKKy8qIFdyaXRlIGBvdXRwdXRfc2l6ZScgYnl0ZXMgb2YgYG91dHB1dF9idWZmZXInIHRvIGZpbGUKKyAgIGRlc2NyaXB0b3IgT1VUX0RFUyBhbmQgcmVzZXQgYG91dHB1dF9zaXplJyBhbmQgYG91dF9idWZmJy4KKyAgIElmIGBzd2FwcGluZ19oYWxmd29yZHMnIG9yIGBzd2FwcGluZ19ieXRlcycgaXMgc2V0LAorICAgZG8gdGhlIGFwcHJvcHJpYXRlIHN3YXBwaW5nIGZpcnN0LiAgT3VyIGNhbGxlcnMgaGF2ZQorICAgdG8gbWFrZSBzdXJlIHRvIG9ubHkgc2V0IHRoZXNlIGZsYWdzIGlmIGBvdXRwdXRfc2l6ZScgCisgICBpcyBhcHByb3ByaWF0ZSAoYSBtdWx0aXBsZSBvZiA0IGZvciBgc3dhcHBpbmdfaGFsZndvcmRzJywKKyAgIDIgZm9yIGBzd2FwcGluZ19ieXRlcycpLiAgVGhlIGZhY3QgdGhhdCBESVNLX0lPX0JMT0NLX1NJWkUKKyAgIG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCBoZWxwcyB1cyAoYW5kIG91ciBjYWxsZXJzKQorICAgaW5zdXJlIHRoaXMuICAqLworCit2b2lkIGRpc2tfZW1wdHlfb3V0cHV0X2J1ZmZlcihpbnQgb3V0X2RlcykKK3sKKwlpbnQgYnl0ZXNfd3JpdHRlbjsKKworCWJ5dGVzX3dyaXR0ZW4gPSB3cml0ZShvdXRfZGVzLCBvdXRwdXRfYnVmZmVyLCBvdXRwdXRfc2l6ZSk7CisKKwlpZiAoYnl0ZXNfd3JpdHRlbiAhPSBvdXRwdXRfc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cml0ZSBlcnJvcjogJXNcbiIsCisJCQlwcm9nbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisJb3V0cHV0X2J5dGVzICs9IG91dHB1dF9zaXplOworCW91dF9idWZmID0gb3V0cHV0X2J1ZmZlcjsKKwlvdXRwdXRfc2l6ZSA9IDA7Cit9CisKKy8qIENvcHkgTlVNX0JZVEVTIG9mIGJ1ZmZlciBJTl9CVUYgdG8gYG91dF9idWZmJywgd2hpY2ggbWF5IGJlIHBhcnRseSBmdWxsLgorICAgV2hlbiBgb3V0X2J1ZmYnIGZpbGxzIHVwLCBmbHVzaCBpdCB0byBmaWxlIGRlc2NyaXB0b3IgT1VUX0RFUy4gICovCisKK3ZvaWQgZGlza19idWZmZXJlZF93cml0ZShjaGFyICppbl9idWYsIGludCBvdXRfZGVzLCBsb25nIG51bV9ieXRlcykKK3sKKwlyZWdpc3RlciBsb25nIGJ5dGVzX2xlZnQgPSBudW1fYnl0ZXM7CS8qIEJ5dGVzIG5lZWRpbmcgdG8gYmUgY29waWVkLiAgKi8KKwlyZWdpc3RlciBsb25nIHNwYWNlX2xlZnQ7CS8qIFJvb20gbGVmdCBpbiBvdXRwdXQgYnVmZmVyLiAgKi8KKworCXdoaWxlIChieXRlc19sZWZ0ID4gMCkgeworCQlzcGFjZV9sZWZ0ID0gRElTS19JT19CTE9DS19TSVpFIC0gb3V0cHV0X3NpemU7CisJCWlmIChzcGFjZV9sZWZ0ID09IDApCisJCQlkaXNrX2VtcHR5X291dHB1dF9idWZmZXIob3V0X2Rlcyk7CisJCWVsc2UgeworCQkJaWYgKGJ5dGVzX2xlZnQgPCBzcGFjZV9sZWZ0KQorCQkJCXNwYWNlX2xlZnQgPSBieXRlc19sZWZ0OworCQkJbWVtbW92ZShvdXRfYnVmZiwgaW5fYnVmLCAodW5zaWduZWQpc3BhY2VfbGVmdCk7CisJCQlvdXRfYnVmZiArPSBzcGFjZV9sZWZ0OworCQkJb3V0cHV0X3NpemUgKz0gc3BhY2VfbGVmdDsKKwkJCWluX2J1ZiArPSBzcGFjZV9sZWZ0OworCQkJYnl0ZXNfbGVmdCAtPSBzcGFjZV9sZWZ0OworCQl9CisJfQorfQorCisvKiBDb3B5IGEgZmlsZSB1c2luZyB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzLCB3aGljaCBtYXkgc3RhcnQgb3V0CisgICBwYXJ0bHkgZnVsbC4gIEFmdGVyIHRoZSBjb3B5LCB0aGUgZmlsZXMgYXJlIG5vdCBjbG9zZWQgbm9yIHRoZSBsYXN0CisgICBibG9jayBmbHVzaGVkIHRvIG91dHB1dCwgYW5kIHRoZSBpbnB1dCBidWZmZXIgbWF5IHN0aWxsIGJlIHBhcnRseQorICAgZnVsbC4gIElmIGBjcmNfaV9mbGFnJyBpcyBzZXQsIGFkZCBlYWNoIGJ5dGUgdG8gYGNyYycuCisgICBJTl9ERVMgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgaW5wdXQ7CisgICBPVVRfREVTIGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIG91dHB1dDsKKyAgIE5VTV9CWVRFUyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuICAqLworCit2b2lkIGNvcHlfZmlsZXNfdGFwZV90b19kaXNrKGludCBpbl9kZXMsIGludCBvdXRfZGVzLCBsb25nIG51bV9ieXRlcykKK3sKKwlsb25nIHNpemU7CisKKwl3aGlsZSAobnVtX2J5dGVzID4gMCkgeworCQlpZiAoaW5wdXRfc2l6ZSA9PSAwKQorCQkJdGFwZV9maWxsX2lucHV0X2J1ZmZlcihpbl9kZXMsIGlvX2Jsb2NrX3NpemUpOworCQlzaXplID0gKGlucHV0X3NpemUgPCBudW1fYnl0ZXMpID8gaW5wdXRfc2l6ZSA6IG51bV9ieXRlczsKKwkJZGlza19idWZmZXJlZF93cml0ZShpbl9idWZmLCBvdXRfZGVzLCBzaXplKTsKKwkJbnVtX2J5dGVzIC09IHNpemU7CisJCWlucHV0X3NpemUgLT0gc2l6ZTsKKwkJaW5fYnVmZiArPSBzaXplOworCX0KK30KKworLyogaWYgSU5fQlVGIGlzIE5VTEwsIFNraXAgdGhlIG5leHQgTlVNX0JZVEVTIGJ5dGVzIG9mIGZpbGUgZGVzY3JpcHRvciBJTl9ERVMuICovCit2b2lkIHRhcGVfYnVmZmVyZWRfcmVhZChjaGFyICppbl9idWYsIGludCBpbl9kZXMsIGxvbmcgbnVtX2J5dGVzKQoreworCXJlZ2lzdGVyIGxvbmcgYnl0ZXNfbGVmdCA9IG51bV9ieXRlczsJLyogQnl0ZXMgbmVlZGluZyB0byBiZSBjb3BpZWQuICAqLworCXJlZ2lzdGVyIGxvbmcgc3BhY2VfbGVmdDsJLyogQnl0ZXMgdG8gY29weSBmcm9tIGlucHV0IGJ1ZmZlci4gICovCisKKwl3aGlsZSAoYnl0ZXNfbGVmdCA+IDApIHsKKwkJaWYgKGlucHV0X3NpemUgPT0gMCkKKwkJCXRhcGVfZmlsbF9pbnB1dF9idWZmZXIoaW5fZGVzLCBpb19ibG9ja19zaXplKTsKKwkJaWYgKGJ5dGVzX2xlZnQgPCBpbnB1dF9zaXplKQorCQkJc3BhY2VfbGVmdCA9IGJ5dGVzX2xlZnQ7CisJCWVsc2UKKwkJCXNwYWNlX2xlZnQgPSBpbnB1dF9zaXplOworCQlpZiAoaW5fYnVmICE9IE5VTEwpIHsKKwkJCW1lbW1vdmUoaW5fYnVmLCBpbl9idWZmLCAodW5zaWduZWQpc3BhY2VfbGVmdCk7CisJCQlpbl9idWYgKz0gc3BhY2VfbGVmdDsKKwkJfQorCQlpbl9idWZmICs9IHNwYWNlX2xlZnQ7CisJCWlucHV0X3NpemUgLT0gc3BhY2VfbGVmdDsKKwkJYnl0ZXNfbGVmdCAtPSBzcGFjZV9sZWZ0OworCX0KK30KKworLyogU2tpcCB0aGUgbmV4dCBOVU1fQllURVMgYnl0ZXMgb2YgZmlsZSBkZXNjcmlwdG9yIElOX0RFUy4gICovCisjZGVmaW5lIHRhcGVfdG9zc19pbnB1dChpbl9kZXMsbnVtX2J5dGVzKSBcCisodGFwZV9idWZmZXJlZF9yZWFkKE5VTEwsKGluX2RlcyksKG51bV9ieXRlcykpKQorCitzdHJ1Y3QgZGVmZXJtZW50IHsKKwlzdHJ1Y3QgZGVmZXJtZW50ICpuZXh0OworCXN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgaGVhZGVyOworfTsKKworc3RydWN0IGRlZmVybWVudCAqY3JlYXRlX2RlZmVybWVudChzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkcikKK3sKKwlzdHJ1Y3QgZGVmZXJtZW50ICpkOworCWQgPSAoc3RydWN0IGRlZmVybWVudCAqKXhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWZlcm1lbnQpKTsKKwlkLT5oZWFkZXIgPSAqZmlsZV9oZHI7CisJZC0+aGVhZGVyLmNfbmFtZSA9IChjaGFyICopeG1hbGxvYyhzdHJsZW4oZmlsZV9oZHItPmNfbmFtZSkgKyAxKTsKKwlzdHJjcHkoZC0+aGVhZGVyLmNfbmFtZSwgZmlsZV9oZHItPmNfbmFtZSk7CisJcmV0dXJuIGQ7Cit9CisKK3ZvaWQgZnJlZV9kZWZlcm1lbnQoc3RydWN0IGRlZmVybWVudCAqZCkKK3sKKwlmcmVlKGQtPmhlYWRlci5jX25hbWUpOworCWZyZWUoZCk7Cit9CisKK2ludCBsaW5rX3RvX25hbWUoY2hhciAqbGlua19uYW1lLCBjaGFyICpsaW5rX3RhcmdldCkKK3sKKwlpbnQgcmVzID0gbGluayhsaW5rX3RhcmdldCwgbGlua19uYW1lKTsKKwlyZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgaW5vZGVfdmFsIHsKKwl1bnNpZ25lZCBsb25nIGlub2RlOworCXVuc2lnbmVkIGxvbmcgbWFqb3JfbnVtOworCXVuc2lnbmVkIGxvbmcgbWlub3JfbnVtOworCWNoYXIgKmZpbGVfbmFtZTsKK307CisKKy8qIElub2RlIGhhc2ggdGFibGUuICBBbGxvY2F0ZWQgYnkgZmlyc3QgY2FsbCB0byBhZGRfaW5vZGUuICAqLworc3RhdGljIHN0cnVjdCBpbm9kZV92YWwgKipoYXNoX3RhYmxlID0gTlVMTDsKKworLyogU2l6ZSBvZiBjdXJyZW50IGhhc2ggdGFibGUuICBJbml0aWFsIHNpemUgaXMgNDcuICAoNDcgPSAyKjIyICsgMykgKi8KK3N0YXRpYyBpbnQgaGFzaF9zaXplID0gMjI7CisKKy8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBjdXJyZW50IGhhc2ggdGFibGUuICAqLworc3RhdGljIGludCBoYXNoX251bTsKKworLyogRG8gdGhlIGhhc2ggaW5zZXJ0LiAgVXNlZCBpbiBub3JtYWwgaW5zZXJ0cyBhbmQgcmVzaXppbmcgdGhlIGhhc2gKKyAgIHRhYmxlLiAgSXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZXJlIGlzIHJvb20gdG8gaW5zZXJ0IHRoZSBpdGVtLgorICAgTkVXX1ZBTFVFIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBpbm9kZSwgZmlsZQorICAgbmFtZSBhc3NvY2lhdGlvbiByZWNvcmQuICAqLworCitzdGF0aWMgdm9pZCBoYXNoX2luc2VydChzdHJ1Y3QgaW5vZGVfdmFsICpuZXdfdmFsdWUpCit7CisJaW50IHN0YXJ0OwkJLyogSG9tZSBwb3NpdGlvbiBmb3IgdGhlIHZhbHVlLiAgKi8KKwlpbnQgdGVtcDsJCS8qIFVzZWQgZm9yIHJlaGFzaGluZy4gICovCisKKwkvKiBIYXNoIGZ1bmN0aW9uIGlzIG5vZGUgbnVtYmVyIG1vZHVsbyB0aGUgdGFibGUgc2l6ZS4gICovCisJc3RhcnQgPSBuZXdfdmFsdWUtPmlub2RlICUgaGFzaF9zaXplOworCisJLyogRG8gdGhlIGluaXRpYWwgbG9vayBpbnRvIHRoZSB0YWJsZS4gICovCisJaWYgKGhhc2hfdGFibGVbc3RhcnRdID09IE5VTEwpIHsKKwkJaGFzaF90YWJsZVtzdGFydF0gPSBuZXdfdmFsdWU7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiB3ZSBnZXQgdG8gaGVyZSwgdGhlIGhvbWUgcG9zaXRpb24gaXMgZnVsbCB3aXRoIGEgZGlmZmVyZW50IGlub2RlCisJICAgcmVjb3JkLiAgRG8gYSBsaW5lYXIgc2VhcmNoIGZvciB0aGUgZmlyc3QgTlVMTCBwb2ludGVyIGFuZCBpbnNlcnQKKwkgICB0aGUgbmV3IGl0ZW0gdGhlcmUuICAqLworCXRlbXAgPSAoc3RhcnQgKyAxKSAlIGhhc2hfc2l6ZTsKKwl3aGlsZSAoaGFzaF90YWJsZVt0ZW1wXSAhPSBOVUxMKQorCQl0ZW1wID0gKHRlbXAgKyAxKSAlIGhhc2hfc2l6ZTsKKworCS8qIEluc2VydCBhdCB0aGUgTlVMTC4gICovCisJaGFzaF90YWJsZVt0ZW1wXSA9IG5ld192YWx1ZTsKK30KKworLyogQXNzb2NpYXRlIEZJTEVfTkFNRSB3aXRoIHRoZSBpbm9kZSBOT0RFX05VTS4gIChJbnNlcnQgaW50byBoYXNoIHRhYmxlLikgICovCisKK3ZvaWQKK2FkZF9pbm9kZSh1bnNpZ25lZCBsb25nIG5vZGVfbnVtLCBjaGFyICpmaWxlX25hbWUsIHVuc2lnbmVkIGxvbmcgbWFqb3JfbnVtLAorCSAgdW5zaWduZWQgbG9uZyBtaW5vcl9udW0pCit7CisJc3RydWN0IGlub2RlX3ZhbCAqdGVtcDsKKworCS8qIENyZWF0ZSBuZXcgaW5vZGUgcmVjb3JkLiAgKi8KKwl0ZW1wID0gKHN0cnVjdCBpbm9kZV92YWwgKil4bWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5vZGVfdmFsKSk7CisJdGVtcC0+aW5vZGUgPSBub2RlX251bTsKKwl0ZW1wLT5tYWpvcl9udW0gPSBtYWpvcl9udW07CisJdGVtcC0+bWlub3JfbnVtID0gbWlub3JfbnVtOworCXRlbXAtPmZpbGVfbmFtZSA9IHhzdHJkdXAoZmlsZV9uYW1lKTsKKworCS8qIERvIHdlIGhhdmUgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgKG9yIGluaXRpYWxseSBhbGxvY2F0ZSkKKwkgICB0aGUgaGFzaCB0YWJsZT8gICovCisJaWYgKGhhc2hfbnVtID09IGhhc2hfc2l6ZSB8fCBoYXNoX3RhYmxlID09IE5VTEwpIHsKKwkJc3RydWN0IGlub2RlX3ZhbCAqKm9sZF90YWJsZTsJLyogUG9pbnRlciB0byBvbGQgdGFibGUuICAqLworCQlpbnQgaTsJCS8qIEluZGV4IGZvciByZS1pbnNlcnQgbG9vcC4gICovCisKKwkJLyogU2F2ZSBvbGQgdGFibGUuICAqLworCQlvbGRfdGFibGUgPSBoYXNoX3RhYmxlOworCQlpZiAob2xkX3RhYmxlID09IE5VTEwpCisJCQloYXNoX251bSA9IDA7CisKKwkJLyogQ2FsY3VsYXRlIG5ldyBzaXplIG9mIHRhYmxlIGFuZCBhbGxvY2F0ZSBpdC4KKwkJICAgU2VxdWVuY2Ugb2YgdGFibGUgc2l6ZXMgaXMgNDcsIDk3LCAxOTcsIDM5NywgNzk3LCAxNTk3LCAzMTk3LCA2Mzk3IC4uLgorCQkgICB3aGVyZSAzMTk3IGFuZCBtb3N0IG9mIHRoZSBzaXplcyBhZnRlciA2Mzk3IGFyZSBub3QgcHJpbWUuICBUaGUgb3RoZXIKKwkJICAgbnVtYmVycyBsaXN0ZWQgYXJlIHByaW1lLiAgKi8KKwkJaGFzaF9zaXplID0gMiAqIGhhc2hfc2l6ZSArIDM7CisJCWhhc2hfdGFibGUgPSAoc3RydWN0IGlub2RlX3ZhbCAqKikKKwkJICAgIHhtYWxsb2MoaGFzaF9zaXplICogc2l6ZW9mKHN0cnVjdCBpbm9kZV92YWwgKikpOworCQltZW1zZXQoaGFzaF90YWJsZSwgMCwgaGFzaF9zaXplICogc2l6ZW9mKHN0cnVjdCBpbm9kZV92YWwgKikpOworCisJCS8qIEluc2VydCB0aGUgdmFsdWVzIGZyb20gdGhlIG9sZCB0YWJsZSBpbnRvIHRoZSBuZXcgdGFibGUuICAqLworCQlmb3IgKGkgPSAwOyBpIDwgaGFzaF9udW07IGkrKykKKwkJCWhhc2hfaW5zZXJ0KG9sZF90YWJsZVtpXSk7CisKKwkJaWYgKG9sZF90YWJsZSAhPSBOVUxMKQorCQkJZnJlZShvbGRfdGFibGUpOworCX0KKworCS8qIEluc2VydCB0aGUgbmV3IHJlY29yZCBhbmQgaW5jcmVtZW50IHRoZSBjb3VudCBvZiBlbGVtZW50cyBpbiB0aGUKKwkgICBoYXNoIHRhYmxlLiAgKi8KKwloYXNoX2luc2VydCh0ZW1wKTsKKwloYXNoX251bSsrOworfQorCitjaGFyICpmaW5kX2lub2RlX2ZpbGUodW5zaWduZWQgbG9uZyBub2RlX251bSwgdW5zaWduZWQgbG9uZyBtYWpvcl9udW0sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWlub3JfbnVtKQoreworCWludCBzdGFydDsJCS8qIEluaXRpYWwgaGFzaCBsb2NhdGlvbi4gICovCisJaW50IHRlbXA7CQkvKiBSZWhhc2ggc2VhcmNoIHZhcmlhYmxlLiAgKi8KKworCWlmIChoYXNoX3RhYmxlICE9IE5VTEwpIHsKKwkJLyogSGFzaCBmdW5jdGlvbiBpcyBub2RlIG51bWJlciBtb2R1bG8gdGhlIHRhYmxlIHNpemUuICAqLworCQlzdGFydCA9IG5vZGVfbnVtICUgaGFzaF9zaXplOworCisJCS8qIEluaXRpYWwgbG9vayBpbnRvIHRoZSB0YWJsZS4gICovCisJCWlmIChoYXNoX3RhYmxlW3N0YXJ0XSA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChoYXNoX3RhYmxlW3N0YXJ0XS0+aW5vZGUgPT0gbm9kZV9udW0KKwkJICAgICYmIGhhc2hfdGFibGVbc3RhcnRdLT5tYWpvcl9udW0gPT0gbWFqb3JfbnVtCisJCSAgICAmJiBoYXNoX3RhYmxlW3N0YXJ0XS0+bWlub3JfbnVtID09IG1pbm9yX251bSkKKwkJCXJldHVybiBoYXNoX3RhYmxlW3N0YXJ0XS0+ZmlsZV9uYW1lOworCisJCS8qIFRoZSBob21lIHBvc2l0aW9uIGlzIGZ1bGwgd2l0aCBhIGRpZmZlcmVudCBpbm9kZSByZWNvcmQuCisJCSAgIERvIGEgbGluZWFyIHNlYXJjaCB0ZXJtaW5hdGVkIGJ5IGEgTlVMTCBwb2ludGVyLiAgKi8KKwkJZm9yICh0ZW1wID0gKHN0YXJ0ICsgMSkgJSBoYXNoX3NpemU7CisJCSAgICAgaGFzaF90YWJsZVt0ZW1wXSAhPSBOVUxMICYmIHRlbXAgIT0gc3RhcnQ7CisJCSAgICAgdGVtcCA9ICh0ZW1wICsgMSkgJSBoYXNoX3NpemUpIHsKKwkJCWlmIChoYXNoX3RhYmxlW3RlbXBdLT5pbm9kZSA9PSBub2RlX251bQorCQkJICAgICYmIGhhc2hfdGFibGVbc3RhcnRdLT5tYWpvcl9udW0gPT0gbWFqb3JfbnVtCisJCQkgICAgJiYgaGFzaF90YWJsZVtzdGFydF0tPm1pbm9yX251bSA9PSBtaW5vcl9udW0pCisJCQkJcmV0dXJuIGhhc2hfdGFibGVbdGVtcF0tPmZpbGVfbmFtZTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogVHJ5IGFuZCBjcmVhdGUgYSBoYXJkIGxpbmsgZnJvbSBGSUxFX05BTUUgdG8gYW5vdGhlciBmaWxlIAorICAgd2l0aCB0aGUgZ2l2ZW4gbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciBhbmQgaW5vZGUuICBJZiBubyBvdGhlcgorICAgZmlsZSB3aXRoIHRoZSBzYW1lIG1ham9yL21pbm9yL2lub2RlIG51bWJlcnMgaXMga25vd24sIGFkZCB0aGlzIGZpbGUKKyAgIHRvIHRoZSBsaXN0IG9mIGtub3duIGZpbGVzIGFuZCBhc3NvY2lhdGVkIG1ham9yL21pbm9yL2lub2RlIG51bWJlcnMKKyAgIGFuZCByZXR1cm4gLTEuICBJZiBhbm90aGVyIGZpbGUgd2l0aCB0aGUgc2FtZSBtYWpvci9taW5vci9pbm9kZQorICAgbnVtYmVycyBpcyBmb3VuZCwgdHJ5IGFuZCBjcmVhdGUgYW5vdGhlciBsaW5rIHRvIGl0IHVzaW5nCisgICBsaW5rX3RvX25hbWUsIGFuZCByZXR1cm4gMCBmb3Igc3VjY2VzcyBhbmQgLTEgZm9yIGZhaWx1cmUuICAqLworCitpbnQKK2xpbmtfdG9fbWFqX21pbl9pbm8oY2hhciAqZmlsZV9uYW1lLCBpbnQgc3RfZGV2X21haiwgaW50IHN0X2Rldl9taW4sIGludCBzdF9pbm8pCit7CisJaW50IGxpbmtfcmVzOworCWNoYXIgKmxpbmtfbmFtZTsKKwlsaW5rX3JlcyA9IC0xOworCS8qIElzIHRoZSBmaWxlIGEgbGluayB0byBhIHByZXZpb3VzbHkgY29waWVkIGZpbGU/ICAqLworCWxpbmtfbmFtZSA9IGZpbmRfaW5vZGVfZmlsZShzdF9pbm8sIHN0X2Rldl9tYWosIHN0X2Rldl9taW4pOworCWlmIChsaW5rX25hbWUgPT0gTlVMTCkKKwkJYWRkX2lub2RlKHN0X2lubywgZmlsZV9uYW1lLCBzdF9kZXZfbWFqLCBzdF9kZXZfbWluKTsKKwllbHNlCisJCWxpbmtfcmVzID0gbGlua190b19uYW1lKGZpbGVfbmFtZSwgbGlua19uYW1lKTsKKwlyZXR1cm4gbGlua19yZXM7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlpbl9yZWd1bGFyX2ZpbGUoc3RydWN0IG5ld19jcGlvX2hlYWRlciAqZmlsZV9oZHIsCisJCQkJaW50IGluX2ZpbGVfZGVzKTsKKwordm9pZCB3YXJuX2p1bmtfYnl0ZXMobG9uZyBieXRlc19za2lwcGVkKQoreworCWZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmc6IHNraXBwZWQgJWxkIGJ5dGUocykgb2YganVua1xuIiwKKwkJcHJvZ25hbWUsIGJ5dGVzX3NraXBwZWQpOworfQorCisvKiBTa2lwIHRoZSBwYWRkaW5nIG9uIElOX0ZJTEVfREVTIGFmdGVyIGEgaGVhZGVyIG9yIGZpbGUsCisgICB1cCB0byB0aGUgbmV4dCBoZWFkZXIuCisgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQgaXMgYmFzZWQgb24gT0ZGU0VUIC0tIHRoZSBjdXJyZW50IG9mZnNldAorICAgZnJvbSB0aGUgbGFzdCBzdGFydCBvZiBhIGhlYWRlciAob3IgZmlsZSkgLS0gYW5kIHRoZSBjdXJyZW50CisgICBoZWFkZXIgdHlwZS4gICovCisKK3N0YXRpYyB2b2lkIHRhcGVfc2tpcF9wYWRkaW5nKGludCBpbl9maWxlX2RlcywgaW50IG9mZnNldCkKK3sKKwlpbnQgcGFkOworCXBhZCA9ICg0IC0gKG9mZnNldCAlIDQpKSAlIDQ7CisKKwlpZiAocGFkICE9IDApCisJCXRhcGVfdG9zc19pbnB1dChpbl9maWxlX2RlcywgcGFkKTsKK30KKworc3RhdGljIGludAordHJ5X2V4aXN0aW5nX2ZpbGUoc3RydWN0IG5ld19jcGlvX2hlYWRlciAqZmlsZV9oZHIsIGludCBpbl9maWxlX2RlcywKKwkJICBpbnQgKmV4aXN0aW5nX2RpcikKK3sKKwlzdHJ1Y3Qgc3RhdCBmaWxlX3N0YXQ7CisKKwkqZXhpc3RpbmdfZGlyID0gZmFsc2U7CisJaWYgKGxzdGF0KGZpbGVfaGRyLT5jX25hbWUsICZmaWxlX3N0YXQpID09IDApIHsKKwkJaWYgKFNfSVNESVIoZmlsZV9zdGF0LnN0X21vZGUpCisJCSAgICAmJiAoKGZpbGVfaGRyLT5jX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpKSB7CisJCQkvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgZGlyZWN0b3J5IHRoZXJlIHRoYXQKKwkJCSAgIHdlIGFyZSB0cnlpbmcgdG8gY3JlYXRlLCBkb24ndCBjb21wbGFpbiBhYm91dAorCQkJICAgaXQuICAqLworCQkJKmV4aXN0aW5nX2RpciA9IHRydWU7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChTX0lTRElSKGZpbGVfc3RhdC5zdF9tb2RlKQorCQkJICAgPyBybWRpcihmaWxlX2hkci0+Y19uYW1lKQorCQkJICAgOiB1bmxpbmsoZmlsZV9oZHItPmNfbmFtZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCByZW1vdmUgY3VycmVudCAlczogJXNcbiIsCisJCQkJcHJvZ25hbWUsIGZpbGVfaGRyLT5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQl0YXBlX3Rvc3NfaW5wdXQoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwkJCXRhcGVfc2tpcF9wYWRkaW5nKGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJCQlyZXR1cm4gLTE7CS8qIEdvIHRvIHRoZSBuZXh0IGZpbGUuICAqLworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGUgbmV3YyBhbmQgY3JjIGZvcm1hdHMgc3RvcmUgbXVsdGlwbHkgbGlua2VkIGNvcGllcyBvZiB0aGUgc2FtZSBmaWxlIAorICAgaW4gdGhlIGFyY2hpdmUgb25seSBvbmNlLiAgVGhlIGFjdHVhbCBkYXRhIGlzIGF0dGFjaGVkIHRvIHRoZSBsYXN0IGxpbmsgCisgICBpbiB0aGUgYXJjaGl2ZSwgYW5kIHRoZSBvdGhlciBsaW5rcyBhbGwgaGF2ZSBhIGZpbGVzaXplIG9mIDAuICBXaGVuIGEgCisgICBmaWxlIGluIHRoZSBhcmNoaXZlIGhhcyBtdWx0aXBsZSBsaW5rcyBhbmQgYSBmaWxlc2l6ZSBvZiAwLCBpdHMgZGF0YSBpcyAKKyAgIHByb2JhYmx5ICJhdHRhdGNoZWQiIHRvIGFub3RoZXIgZmlsZSBpbiB0aGUgYXJjaGl2ZSwgc28gd2UgY2FuJ3QgY3JlYXRlCisgICBpdCByaWdodCBhd2F5LiAgV2UgaGF2ZSB0byAiZGVmZXIiIGNyZWF0aW5nIGl0IHVudGlsIHdlIGhhdmUgY3JlYXRlZAorICAgdGhlIGZpbGUgdGhhdCBoYXMgdGhlIGRhdGEgImF0dGF0Y2hlZCIgdG8gaXQuICBXZSBrZWVwIGEgbGlzdCBvZiB0aGUKKyAgICJkZWZlcmVkIiBsaW5rcyBvbiBkZWZlcm1lbnRzLiAgKi8KKworc3RydWN0IGRlZmVybWVudCAqZGVmZXJtZW50cyA9IE5VTEw7CisKKy8qIEFkZCBhIGZpbGUgaGVhZGVyIHRvIHRoZSBkZWZlcm1lbnRzIGxpc3QuICBGb3Igbm93IHRoZXkgYWxsIGp1c3QKKyAgIGdvIG9uIG9uZSBsaXN0LCBhbHRob3VnaCB3ZSBjb3VsZCBvcHRpbWl6ZSB0aGlzIGlmIG5lY2Vzc2FyeS4gICovCisKK3N0YXRpYyB2b2lkIGRlZmVyX2NvcHlpbihzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkcikKK3sKKwlzdHJ1Y3QgZGVmZXJtZW50ICpkOworCWQgPSBjcmVhdGVfZGVmZXJtZW50KGZpbGVfaGRyKTsKKwlkLT5uZXh0ID0gZGVmZXJtZW50czsKKwlkZWZlcm1lbnRzID0gZDsKKwlyZXR1cm47Cit9CisKKy8qIFdlIGp1c3QgY3JlYXRlZCBhIGZpbGUgdGhhdCAocHJvYmFibHkpIGhhcyBzb21lIG90aGVyIGxpbmtzIHRvIGl0CisgICB3aGljaCBoYXZlIGJlZW4gZGVmZXJlZC4gIEdvIHRocm91Z2ggYWxsIG9mIHRoZSBsaW5rcyBvbiB0aGUgZGVmZXJtZW50cworICAgbGlzdCBhbmQgY3JlYXRlIGFueSB3aGljaCBhcmUgbGlua3MgdG8gdGhpcyBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQgY3JlYXRlX2RlZmVyZWRfbGlua3Moc3RydWN0IG5ld19jcGlvX2hlYWRlciAqZmlsZV9oZHIpCit7CisJc3RydWN0IGRlZmVybWVudCAqZDsKKwlzdHJ1Y3QgZGVmZXJtZW50ICpkX3ByZXY7CisJaW50IGlubzsKKwlpbnQgbWFqOworCWludCBtaW47CisJaW50IGxpbmtfcmVzOworCWlubyA9IGZpbGVfaGRyLT5jX2lubzsKKwltYWogPSBmaWxlX2hkci0+Y19kZXZfbWFqOworCW1pbiA9IGZpbGVfaGRyLT5jX2Rldl9taW47CisJZCA9IGRlZmVybWVudHM7CisJZF9wcmV2ID0gTlVMTDsKKwl3aGlsZSAoZCAhPSBOVUxMKSB7CisJCWlmICgoZC0+aGVhZGVyLmNfaW5vID09IGlubykgJiYgKGQtPmhlYWRlci5jX2Rldl9tYWogPT0gbWFqKQorCQkgICAgJiYgKGQtPmhlYWRlci5jX2Rldl9taW4gPT0gbWluKSkgeworCQkJc3RydWN0IGRlZmVybWVudCAqZF9mcmVlOworCQkJbGlua19yZXMgPQorCQkJICAgIGxpbmtfdG9fbmFtZShkLT5oZWFkZXIuY19uYW1lLCBmaWxlX2hkci0+Y19uYW1lKTsKKwkJCWlmIChsaW5rX3JlcyA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBjYW5ub3QgbGluayAlcyB0byAlczogJXNcbiIsCisJCQkJCXByb2duYW1lLCBkLT5oZWFkZXIuY19uYW1lLAorCQkJCQlmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQkJaWYgKGRfcHJldiAhPSBOVUxMKQorCQkJCWRfcHJldi0+bmV4dCA9IGQtPm5leHQ7CisJCQllbHNlCisJCQkJZGVmZXJtZW50cyA9IGQtPm5leHQ7CisJCQlkX2ZyZWUgPSBkOworCQkJZCA9IGQtPm5leHQ7CisJCQlmcmVlX2RlZmVybWVudChkX2ZyZWUpOworCQl9IGVsc2UgeworCQkJZF9wcmV2ID0gZDsKKwkJCWQgPSBkLT5uZXh0OworCQl9CisJfQorfQorCisvKiBJZiB3ZSBoYWQgYSBtdWx0aXBseSBsaW5rZWQgZmlsZSB0aGF0IHJlYWxseSB3YXMgZW1wdHkgdGhlbiB3ZSB3b3VsZAorICAgaGF2ZSBkZWZlcmVkIGFsbCBvZiBpdHMgbGlua3MsIHNpbmNlIHdlIG5ldmVyIGZvdW5kIGFueSB3aXRoIGRhdGEKKyAgICJhdHRhY2hlZCIsIGFuZCB0aGV5IHdpbGwgc3RpbGwgYmUgb24gdGhlIGRlZmVybWVudCBsaXN0IGV2ZW4gd2hlbgorICAgd2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgd2hvbGUgYXJjaGl2ZS4gIFdyaXRlIG91dCBhbGwgb2YgdGhlc2UKKyAgIGVtcHR5IGxpbmtzIHRoYXQgYXJlIHN0aWxsIG9uIHRoZSBkZWZlcm1lbnRzIGxpc3QuICAqLworCitzdGF0aWMgdm9pZCBjcmVhdGVfZmluYWxfZGVmZXJzKCkKK3sKKwlzdHJ1Y3QgZGVmZXJtZW50ICpkOworCWludCBsaW5rX3JlczsKKwlpbnQgb3V0X2ZpbGVfZGVzOworCXN0cnVjdCB1dGltYnVmIHRpbWVzOwkvKiBGb3Igc2V0dGluZyBmaWxlIHRpbWVzLiAgKi8KKwkvKiBJbml0aWFsaXplIHRoaXMgaW4gY2FzZSBpdCBoYXMgbWVtYmVycyB3ZSBkb24ndCBrbm93IHRvIHNldC4gICovCisJbWVtc2V0KCZ0aW1lcywgMCwgc2l6ZW9mKHN0cnVjdCB1dGltYnVmKSk7CisKKwlmb3IgKGQgPSBkZWZlcm1lbnRzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KSB7CisJCS8qIERlYmlhbiBoYWNrOiBBIGxpbmUsIHdoaWNoIGNvdWxkIGNhdXNlIGFuIGVuZGxlc3MgbG9vcCwgd2FzCisJCSAgIHJlbW92ZWQgKDk3LzEvMikuICBJdCB3YXMgcmVwb3J0ZWQgYnkgUm9uYWxkIEYuIEd1aWxtZXR0ZSB0bworCQkgICB0aGUgdXBzdHJlYW0gbWFpbnRhaW5lcnMuIC1CRU0gKi8KKwkJLyogRGViaWFuIGhhY2s6ICBUaGlzIHdhcyByZXBvcnRlZCBieSBIb3JzdCBLbm9ibG9jaC4gVGhpcyBidWcgaGFzCisJCSAgIGJlZW4gcmVwb3J0ZWQgdG8gImJ1Zy1nbnUtdXRpbHNAcHJlcC5haS5taXQuZWR1Ii4gKDk5LzEvNikgLUJFTQorCQkgKi8KKwkJbGlua19yZXMgPSBsaW5rX3RvX21hal9taW5faW5vKGQtPmhlYWRlci5jX25hbWUsCisJCQkJCSAgICAgICBkLT5oZWFkZXIuY19kZXZfbWFqLAorCQkJCQkgICAgICAgZC0+aGVhZGVyLmNfZGV2X21pbiwKKwkJCQkJICAgICAgIGQtPmhlYWRlci5jX2lubyk7CisJCWlmIChsaW5rX3JlcyA9PSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlvdXRfZmlsZV9kZXMgPSBvcGVuKGQtPmhlYWRlci5jX25hbWUsCisJCQkJICAgIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fQklOQVJZLCAwNjAwKTsKKwkJaWYgKG91dF9maWxlX2RlcyA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IG9wZW4gJXM6ICVzXG4iLAorCQkJCXByb2duYW1lLCBkLT5oZWFkZXIuY19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBGaWxlIGlzIG5vdyBjb3BpZWQ7IHNldCBhdHRyaWJ1dGVzLiAgKi8KKwkJaWYgKChmY2hvd24ob3V0X2ZpbGVfZGVzLCBkLT5oZWFkZXIuY191aWQsIGQtPmhlYWRlci5jX2dpZCkgPCAwKQorCQkgICAgJiYgZXJybm8gIT0gRVBFUk0pCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBmY2hvd24gJXM6ICVzXG4iLAorCQkJCXByb2duYW1lLCBkLT5oZWFkZXIuY19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQkvKiBjaG93biBtYXkgaGF2ZSB0dXJuZWQgb2ZmIHNvbWUgcGVybWlzc2lvbnMgd2Ugd2FudGVkLiAqLworCQlpZiAoZmNobW9kKG91dF9maWxlX2RlcywgKGludClkLT5oZWFkZXIuY19tb2RlKSA8IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBmY2htb2QgJXM6ICVzXG4iLAorCQkJCXByb2duYW1lLCBkLT5oZWFkZXIuY19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCisJCWlmIChjbG9zZShvdXRfZmlsZV9kZXMpIDwgMCkKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNsb3NlICVzOiAlc1xuIiwKKwkJCQlwcm9nbmFtZSwgZC0+aGVhZGVyLmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCX0KK30KKworc3RhdGljIHZvaWQKK2NvcHlpbl9yZWd1bGFyX2ZpbGUoc3RydWN0IG5ld19jcGlvX2hlYWRlciAqZmlsZV9oZHIsIGludCBpbl9maWxlX2RlcykKK3sKKwlpbnQgb3V0X2ZpbGVfZGVzOwkvKiBPdXRwdXQgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKworCS8qIENhbiB0aGUgY3VycmVudCBmaWxlIGJlIGxpbmtlZCB0byBhIHByZXZpb3VzbHkgY29waWVkIGZpbGU/ICovCisJaWYgKGZpbGVfaGRyLT5jX25saW5rID4gMSkgeworCQlpbnQgbGlua19yZXM7CisJCWlmIChmaWxlX2hkci0+Y19maWxlc2l6ZSA9PSAwKSB7CisJCQkvKiBUaGUgbmV3YyBhbmQgY3JjIGZvcm1hdHMgc3RvcmUgbXVsdGlwbHkgbGlua2VkIGNvcGllcworCQkJICAgb2YgdGhlIHNhbWUgZmlsZSBpbiB0aGUgYXJjaGl2ZSBvbmx5IG9uY2UuICBUaGUKKwkJCSAgIGFjdHVhbCBkYXRhIGlzIGF0dGFjaGVkIHRvIHRoZSBsYXN0IGxpbmsgaW4gdGhlCisJCQkgICBhcmNoaXZlLCBhbmQgdGhlIG90aGVyIGxpbmtzIGFsbCBoYXZlIGEgZmlsZXNpemUKKwkJCSAgIG9mIDAuICBTaW5jZSB0aGlzIGZpbGUgaGFzIG11bHRpcGxlIGxpbmtzIGFuZCBhCisJCQkgICBmaWxlc2l6ZSBvZiAwLCBpdHMgZGF0YSBpcyBwcm9iYWJseSBhdHRhdGNoZWQgdG8KKwkJCSAgIGFub3RoZXIgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIFNhdmUgdGhlIGxpbmssIGFuZAorCQkJICAgcHJvY2VzcyBpdCBsYXRlciB3aGVuIHdlIGdldCB0aGUgYWN0dWFsIGRhdGEuICBXZQorCQkJICAgY2FuJ3QganVzdCBjcmVhdGUgaXQgd2l0aCBsZW5ndGggMCBhbmQgYWRkIHRoZQorCQkJICAgZGF0YSBsYXRlciwgaW4gY2FzZSB0aGUgZmlsZSBpcyByZWFkb25seS4gIFdlIHN0aWxsCisJCQkgICBsb3NlIGlmIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIHJlYWRvbmx5IChhbmQgd2UgYXJlbid0CisJCQkgICBydW5uaW5nIGFzIHJvb3QpLCBidXQgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dAorCQkJICAgdGhhdC4gICovCisJCQlkZWZlcl9jb3B5aW4oZmlsZV9oZHIpOworCQkJdGFwZV90b3NzX2lucHV0KGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJCQl0YXBlX3NraXBfcGFkZGluZyhpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCQkJcmV0dXJuOworCQl9CisJCS8qIElmIHRoZSBmaWxlIGhhcyBkYXRhIChmaWxlc2l6ZSAhPSAwKSwgdGhlbiBwcmVzdW1hYmx5CisJCSAgIGFueSBvdGhlciBsaW5rcyBoYXZlIGFscmVhZHkgYmVlbiBkZWZlcl9jb3B5aW4nZWQoKSwKKwkJICAgYnV0IEdOVSBjcGlvIHZlcnNpb24gMi4wLTIuMiBkaWRuJ3QgZG8gdGhhdCwgc28gd2UKKwkJICAgc3RpbGwgaGF2ZSB0byBjaGVjayBmb3IgbGlua3MgaGVyZSAoYW5kIGFsc28gaW4gY2FzZQorCQkgICB0aGUgYXJjaGl2ZSB3YXMgY3JlYXRlZCBhbmQgbGF0ZXIgYXBwZW5lZGVkIHRvKS4gKi8KKwkJLyogRGViaWFuIGhhY2s6ICg5Ny8xLzIpIFRoaXMgd2FzIHJlcG9ydGVkIGJ5IFJvbmFsZAorCQkgICBGLiBHdWlsbWV0dGUgdG8gdGhlIHVwc3RyZWFtIG1haW50YWluZXJzLiAtQkVNICovCisJCWxpbmtfcmVzID0gbGlua190b19tYWpfbWluX2lubyhmaWxlX2hkci0+Y19uYW1lLAorCQkJCQkgICAgICAgZmlsZV9oZHItPmNfZGV2X21haiwKKwkJCQkJICAgICAgIGZpbGVfaGRyLT5jX2Rldl9taW4sCisJCQkJCSAgICAgICBmaWxlX2hkci0+Y19pbm8pOworCQlpZiAobGlua19yZXMgPT0gMCkgeworCQkJdGFwZV90b3NzX2lucHV0KGluX2ZpbGVfZGVzLCBmaWxlX2hkci0+Y19maWxlc2l6ZSk7CisJCQl0YXBlX3NraXBfcGFkZGluZyhpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogSWYgbm90IGxpbmtlZCwgY29weSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuICAqLworCW91dF9maWxlX2RlcyA9IG9wZW4oZmlsZV9oZHItPmNfbmFtZSwKKwkJCSAgICBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0JJTkFSWSwgMDYwMCk7CisKKwlpZiAob3V0X2ZpbGVfZGVzIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBvcGVuICVzOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQl0YXBlX3Rvc3NfaW5wdXQoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwkJdGFwZV9za2lwX3BhZGRpbmcoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwkJcmV0dXJuOworCX0KKworCWNvcHlfZmlsZXNfdGFwZV90b19kaXNrKGluX2ZpbGVfZGVzLCBvdXRfZmlsZV9kZXMsCisJCQkJZmlsZV9oZHItPmNfZmlsZXNpemUpOworCWRpc2tfZW1wdHlfb3V0cHV0X2J1ZmZlcihvdXRfZmlsZV9kZXMpOworCisJaWYgKGNsb3NlKG91dF9maWxlX2RlcykgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjbG9zZSAlczogJXNcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIEZpbGUgaXMgbm93IGNvcGllZDsgc2V0IGF0dHJpYnV0ZXMuICAqLworCWlmICgoY2hvd24oZmlsZV9oZHItPmNfbmFtZSwgZmlsZV9oZHItPmNfdWlkLCBmaWxlX2hkci0+Y19naWQpIDwgMCkKKwkgICAgJiYgZXJybm8gIT0gRVBFUk0pCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNob3duICVzOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCisJLyogY2hvd24gbWF5IGhhdmUgdHVybmVkIG9mZiBzb21lIHBlcm1pc3Npb25zIHdlIHdhbnRlZC4gKi8KKwlpZiAoY2htb2QoZmlsZV9oZHItPmNfbmFtZSwgKGludClmaWxlX2hkci0+Y19tb2RlKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNobW9kICVzOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCisJdGFwZV9za2lwX3BhZGRpbmcoaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwlpZiAoZmlsZV9oZHItPmNfbmxpbmsgPiAxKSB7CisJCS8qIChzZWUgY29tbWVudCBhYm92ZSBmb3IgaG93IHRoZSBuZXdjIGFuZCBjcmMgZm9ybWF0cyAKKwkJICAgc3RvcmUgbXVsdGlwbGUgbGlua3MpLiAgTm93IHRoYXQgd2UgaGF2ZSB0aGUgZGF0YSAKKwkJICAgZm9yIHRoaXMgZmlsZSwgY3JlYXRlIGFueSBvdGhlciBsaW5rcyB0byBpdCB3aGljaAorCQkgICB3ZSBkZWZlcmVkLiAgKi8KKwkJY3JlYXRlX2RlZmVyZWRfbGlua3MoZmlsZV9oZHIpOworCX0KK30KKworLyogSW4gZ2VuZXJhbCwgd2UgY2FuJ3QgdXNlIHRoZSBidWlsdGluIGBiYXNlbmFtZScgZnVuY3Rpb24gaWYgYXZhaWxhYmxlLAorICAgc2luY2UgaXQgaGFzIGRpZmZlcmVudCBtZWFuaW5ncyBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLgorICAgSW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIGJ1aWx0aW4gYGJhc2VuYW1lJyBtb2RpZmllcyBpdHMgYXJndW1lbnQuCisKKyAgIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBmaWxlIG5hbWUgY29tcG9uZW50IG9mIE5BTUUuICBJZgorICAgTkFNRSBoYXMgbm8gZmlsZSBuYW1lIGNvbXBvbmVudHMgYmVjYXVzZSBpdCBpcyBhbGwgc2xhc2hlcywgcmV0dXJuCisgICBOQU1FIGlmIGl0IGlzIGVtcHR5LCB0aGUgYWRkcmVzcyBvZiBpdHMgbGFzdCBzbGFzaCBvdGhlcndpc2UuICAqLworCitjaGFyICpiYXNlX25hbWUoY2hhciBjb25zdCAqbmFtZSkKK3sKKwljaGFyIGNvbnN0ICpiYXNlID0gbmFtZSArIEZJTEVfU1lTVEVNX1BSRUZJWF9MRU4obmFtZSk7CisJY2hhciBjb25zdCAqcDsKKworCWZvciAocCA9IGJhc2U7ICpwOyBwKyspIHsKKwkJaWYgKElTU0xBU0goKnApKSB7CisJCQkvKiBUcmVhdCBtdWx0aXBsZSBhZGphY2VudCBzbGFzaGVzIGxpa2UgYSBzaW5nbGUgc2xhc2guICAqLworCQkJZG8KKwkJCQlwKys7CisJCQl3aGlsZSAoSVNTTEFTSCgqcCkpOworCisJCQkvKiBJZiB0aGUgZmlsZSBuYW1lIGVuZHMgaW4gc2xhc2gsIHVzZSB0aGUgdHJhaWxpbmcgc2xhc2ggYXMKKwkJCSAgIHRoZSBiYXNlbmFtZSBpZiBubyBub24tc2xhc2hlcyBoYXZlIGJlZW4gZm91bmQuICAqLworCQkJaWYgKCEqcCkgeworCQkJCWlmIChJU1NMQVNIKCpiYXNlKSkKKwkJCQkJYmFzZSA9IHAgLSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiAqUCBpcyBhIG5vbi1zbGFzaCBwcmVjZWRlZCBieSBhIHNsYXNoLiAgKi8KKwkJCWJhc2UgPSBwOworCQl9CisJfQorCisJcmV0dXJuIChjaGFyICopYmFzZTsKK30KKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2Ygb2YgdGhlIGJhc2VuYW1lIE5BTUUuICBUeXBpY2FsbHkgTkFNRSBpcyB0aGUKKyAgIHZhbHVlIHJldHVybmVkIGJ5IGJhc2VfbmFtZS4gIEFjdCBsaWtlIHN0cmxlbiAoTkFNRSksIGV4Y2VwdCBvbWl0CisgICByZWR1bmRhbnQgdHJhaWxpbmcgc2xhc2hlcy4gICovCisKK3NpemVfdCBiYXNlX2xlbihjaGFyIGNvbnN0ICpuYW1lKQoreworCXNpemVfdCBsZW47CisKKwlmb3IgKGxlbiA9IHN0cmxlbihuYW1lKTsgMSA8IGxlbiAmJiBJU1NMQVNIKG5hbWVbbGVuIC0gMV0pOyBsZW4tLSkKKwkJY29udGludWU7CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIFBBVEguCisgICBSZXR1cm4gdHJ1ZSBpZiBhIHRyYWlsaW5nIHNsYXNoIHdhcyByZW1vdmVkLgorICAgVGhpcyBpcyB1c2VmdWwgd2hlbiB1c2luZyBmaWxlbmFtZSBjb21wbGV0aW9uIGZyb20gYSBzaGVsbCB0aGF0CisgICBhZGRzIGEgIi8iIGFmdGVyIGRpcmVjdG9yeSBuYW1lcyAoc3VjaCBhcyB0Y3NoIGFuZCBiYXNoKSwgYmVjYXVzZQorICAgdGhlIFVuaXggcmVuYW1lIGFuZCBybWRpciBzeXN0ZW0gY2FsbHMgcmV0dXJuIGFuICJJbnZhbGlkIGFyZ3VtZW50IiBlcnJvcgorICAgd2hlbiBnaXZlbiBhIHBhdGggdGhhdCBlbmRzIGluICIvIiAoZXhjZXB0IGZvciB0aGUgcm9vdCBkaXJlY3RvcnkpLiAgKi8KKworYm9vbCBzdHJpcF90cmFpbGluZ19zbGFzaGVzKGNoYXIgKnBhdGgpCit7CisJY2hhciAqYmFzZSA9IGJhc2VfbmFtZShwYXRoKTsKKwljaGFyICpiYXNlX2xpbSA9IGJhc2UgKyBiYXNlX2xlbihiYXNlKTsKKwlib29sIGhhZF9zbGFzaCA9ICgqYmFzZV9saW0gIT0gJ1wwJyk7CisJKmJhc2VfbGltID0gJ1wwJzsKKwlyZXR1cm4gaGFkX3NsYXNoOworfQorCitzdGF0aWMgdm9pZCBjb3B5aW5fZGlyZWN0b3J5KHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyLCBpbnQgZXhpc3RpbmdfZGlyKQoreworCWludCByZXM7CQkvKiBSZXN1bHQgb2YgdmFyaW91cyBmdW5jdGlvbiBjYWxscy4gICovCisKKwkvKiBTdHJpcCBhbnkgdHJhaWxpbmcgYC8ncyBvZmYgdGhlIGZpbGVuYW1lOyB0YXIgcHV0cworCSAgIHRoZW0gb24uICBXZSBtaWdodCBhcyB3ZWxsIGRvIGl0IGhlcmUgaW4gY2FzZSBhbnlib2R5CisJICAgZWxzZSBkb2VzIHRvbywgc2luY2UgdGhleSBjYXVzZSBzdHJhbmdlIHRoaW5ncyB0byBoYXBwZW4uICAqLworCXN0cmlwX3RyYWlsaW5nX3NsYXNoZXMoZmlsZV9oZHItPmNfbmFtZSk7CisKKwkvKiBJZ25vcmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgSXQgbXVzdCBhbHJlYWR5IGV4aXN0LAorCSAgIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdHMgcGVybWlzc2lvbiwgb3duZXJzaGlwCisJICAgb3IgdGltZS4gICovCisJaWYgKGZpbGVfaGRyLT5jX25hbWVbMF0gPT0gJy4nICYmIGZpbGVfaGRyLT5jX25hbWVbMV0gPT0gJ1wwJykgeworCQlyZXR1cm47CisJfQorCisJaWYgKCFleGlzdGluZ19kaXIpCisJeworCQlyZXMgPSBta2RpcihmaWxlX2hkci0+Y19uYW1lLCBmaWxlX2hkci0+Y19tb2RlKTsKKwl9IGVsc2UKKwkJcmVzID0gMDsKKwlpZiAocmVzIDwgMCkgeworCQkvKiBJbiBzb21lIG9kZCBjYXNlcyB3aGVyZSB0aGUgZmlsZV9oZHItPmNfbmFtZSBpbmNsdWRlcyBgLicsCisJCSAgIHRoZSBkaXJlY3RvcnkgbWF5IGhhdmUgYWN0dWFsbHkgYmVlbiBjcmVhdGVkIGJ5CisJCSAgIGNyZWF0ZV9hbGxfZGlyZWN0b3JpZXMoKSwgc28gdGhlIG1rZGlyIHdpbGwgZmFpbAorCQkgICBiZWNhdXNlIHRoZSBkaXJlY3RvcnkgZXhpc3RzLiAgSWYgdGhhdCdzIHRoZSBjYXNlLAorCQkgICBkb24ndCBjb21wbGFpbiBhYm91dCBpdC4gICovCisJCXN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKKwkJaWYgKChlcnJubyAhPSBFRVhJU1QpIHx8CisJCSAgICAobHN0YXQoZmlsZV9oZHItPmNfbmFtZSwgJmZpbGVfc3RhdCkgIT0gMCkgfHwKKwkJICAgICEoU19JU0RJUihmaWxlX3N0YXQuc3RfbW9kZSkpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBsc3RhdCAlczogJXNcbiIsCisJCQkJcHJvZ25hbWUsIGZpbGVfaGRyLT5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKChjaG93bihmaWxlX2hkci0+Y19uYW1lLCBmaWxlX2hkci0+Y191aWQsIGZpbGVfaGRyLT5jX2dpZCkgPCAwKQorCSAgICAmJiBlcnJubyAhPSBFUEVSTSkKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2hvd24gJXM6ICVzXG4iLAorCQkJcHJvZ25hbWUsIGZpbGVfaGRyLT5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJLyogY2hvd24gbWF5IGhhdmUgdHVybmVkIG9mZiBzb21lIHBlcm1pc3Npb25zIHdlIHdhbnRlZC4gKi8KKwlpZiAoY2htb2QoZmlsZV9oZHItPmNfbmFtZSwgKGludClmaWxlX2hkci0+Y19tb2RlKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNobW9kICVzOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgdm9pZCBjb3B5aW5fZGV2aWNlKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyKQoreworCWludCByZXM7CQkvKiBSZXN1bHQgb2YgdmFyaW91cyBmdW5jdGlvbiBjYWxscy4gICovCisKKwlpZiAoZmlsZV9oZHItPmNfbmxpbmsgPiAxKSB7CisJCWludCBsaW5rX3JlczsKKwkJLyogRGViaWFuIGhhY2s6ICBUaGlzIHdhcyByZXBvcnRlZCBieSBIb3JzdAorCQkgICBLbm9ibG9jaC4gVGhpcyBidWcgaGFzIGJlZW4gcmVwb3J0ZWQgdG8KKwkJICAgImJ1Zy1nbnUtdXRpbHNAcHJlcC5haS5taXQuZWR1Ii4gKDk5LzEvNikgLUJFTSAqLworCQlsaW5rX3JlcyA9IGxpbmtfdG9fbWFqX21pbl9pbm8oZmlsZV9oZHItPmNfbmFtZSwKKwkJCQkJICAgICAgIGZpbGVfaGRyLT5jX2Rldl9tYWosCisJCQkJCSAgICAgICBmaWxlX2hkci0+Y19kZXZfbWluLAorCQkJCQkgICAgICAgZmlsZV9oZHItPmNfaW5vKTsKKwkJaWYgKGxpbmtfcmVzID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXJlcyA9IG1rbm9kKGZpbGVfaGRyLT5jX25hbWUsIGZpbGVfaGRyLT5jX21vZGUsCisJCSAgICBtYWtlZGV2KGZpbGVfaGRyLT5jX3JkZXZfbWFqLCBmaWxlX2hkci0+Y19yZGV2X21pbikpOworCWlmIChyZXMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG1rbm9kICVzOiAlc1xuIiwgcHJvZ25hbWUsCisJCQlmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCWlmICgoY2hvd24oZmlsZV9oZHItPmNfbmFtZSwgZmlsZV9oZHItPmNfdWlkLCBmaWxlX2hkci0+Y19naWQpIDwgMCkKKwkgICAgJiYgZXJybm8gIT0gRVBFUk0pCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNob3duICVzOiAlc1xuIiwgcHJvZ25hbWUsCisJCQlmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCS8qIGNob3duIG1heSBoYXZlIHR1cm5lZCBvZmYgc29tZSBwZXJtaXNzaW9ucyB3ZSB3YW50ZWQuICovCisJaWYgKGNobW9kKGZpbGVfaGRyLT5jX25hbWUsIGZpbGVfaGRyLT5jX21vZGUpIDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2htb2QgJXM6ICVzXG4iLCBwcm9nbmFtZSwKKwkJCWZpbGVfaGRyLT5jX25hbWUsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlpbl9saW5rKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyLCBpbnQgaW5fZmlsZV9kZXMpCit7CisJY2hhciAqbGlua19uYW1lID0gTlVMTDsJLyogTmFtZSBvZiBoYXJkIGFuZCBzeW1ib2xpYyBsaW5rcy4gICovCisJaW50IHJlczsJCS8qIFJlc3VsdCBvZiB2YXJpb3VzIGZ1bmN0aW9uIGNhbGxzLiAgKi8KKworCWxpbmtfbmFtZSA9IChjaGFyICopeG1hbGxvYygodW5zaWduZWQgaW50KWZpbGVfaGRyLT5jX2ZpbGVzaXplICsgMSk7CisJbGlua19uYW1lW2ZpbGVfaGRyLT5jX2ZpbGVzaXplXSA9ICdcMCc7CisJdGFwZV9idWZmZXJlZF9yZWFkKGxpbmtfbmFtZSwgaW5fZmlsZV9kZXMsIGZpbGVfaGRyLT5jX2ZpbGVzaXplKTsKKwl0YXBlX3NraXBfcGFkZGluZyhpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCisJcmVzID0gVU1BU0tFRF9TWU1MSU5LKGxpbmtfbmFtZSwgZmlsZV9oZHItPmNfbmFtZSwgZmlsZV9oZHItPmNfbW9kZSk7CisJaWYgKHJlcyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogVU1BU0tFRF9TWU1MSU5LICVzOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlmcmVlKGxpbmtfbmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKChsY2hvd24oZmlsZV9oZHItPmNfbmFtZSwgZmlsZV9oZHItPmNfdWlkLCBmaWxlX2hkci0+Y19naWQpIDwgMCkKKwkgICAgJiYgZXJybm8gIT0gRVBFUk0pIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogbGNob3duICVzOiAlc1xuIiwKKwkJCXByb2duYW1lLCBmaWxlX2hkci0+Y19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCX0KKwlmcmVlKGxpbmtfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlpbl9maWxlKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyLCBpbnQgaW5fZmlsZV9kZXMpCit7CisJaW50IGV4aXN0aW5nX2RpcjsKKworCWlmICh0cnlfZXhpc3RpbmdfZmlsZShmaWxlX2hkciwgaW5fZmlsZV9kZXMsICZleGlzdGluZ19kaXIpIDwgMCkKKwkJcmV0dXJuOworCisJLyogRG8gdGhlIHJlYWwgY29weSBvciBsaW5rLiAgKi8KKwlzd2l0Y2ggKGZpbGVfaGRyLT5jX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWNvcHlpbl9yZWd1bGFyX2ZpbGUoZmlsZV9oZHIsIGluX2ZpbGVfZGVzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNfSUZESVI6CisJCWNvcHlpbl9kaXJlY3RvcnkoZmlsZV9oZHIsIGV4aXN0aW5nX2Rpcik7CisJCWJyZWFrOworCisJY2FzZSBTX0lGQ0hSOgorCWNhc2UgU19JRkJMSzoKKyNpZmRlZiBTX0lGU09DSworCWNhc2UgU19JRlNPQ0s6CisjZW5kaWYKKyNpZmRlZiBTX0lGSUZPCisJY2FzZSBTX0lGSUZPOgorI2VuZGlmCisJCWNvcHlpbl9kZXZpY2UoZmlsZV9oZHIpOworCQlicmVhazsKKworI2lmZGVmIFNfSUZMTksKKwljYXNlIFNfSUZMTks6CisJCWNvcHlpbl9saW5rKGZpbGVfaGRyLCBpbl9maWxlX2Rlcyk7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogdW5rbm93biBmaWxlIHR5cGVcbiIsCisJCQlwcm9nbmFtZSwgZmlsZV9oZHItPmNfbmFtZSk7CisJCXRhcGVfdG9zc19pbnB1dChpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCQl0YXBlX3NraXBfcGFkZGluZyhpbl9maWxlX2RlcywgZmlsZV9oZHItPmNfZmlsZXNpemUpOworCX0KK30KKworLyogRmlsbCBpbiBGSUxFX0hEUiBieSByZWFkaW5nIGEgbmV3LWZvcm1hdCBBU0NJSSBmb3JtYXQgY3BpbyBoZWFkZXIgZnJvbQorICAgZmlsZSBkZXNjcmlwdG9yIElOX0RFUywgZXhjZXB0IGZvciB0aGUgbWFnaWMgbnVtYmVyLCB3aGljaCBpcworICAgYWxyZWFkeSBmaWxsZWQgaW4uICAqLworCit2b2lkIHJlYWRfaW5fbmV3X2FzY2lpKHN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgKmZpbGVfaGRyLCBpbnQgaW5fZGVzKQoreworCWNoYXIgYXNjaWlfaGVhZGVyWzExMl07CisKKwl0YXBlX2J1ZmZlcmVkX3JlYWQoYXNjaWlfaGVhZGVyLCBpbl9kZXMsIDEwNEwpOworCWFzY2lpX2hlYWRlclsxMDRdID0gJ1wwJzsKKwlzc2NhbmYoYXNjaWlfaGVhZGVyLAorCSAgICAgICAiJThseCU4bHglOGx4JThseCU4bHglOGx4JThseCU4bHglOGx4JThseCU4bHglOGx4JThseCIsCisJICAgICAgICZmaWxlX2hkci0+Y19pbm8sICZmaWxlX2hkci0+Y19tb2RlLCAmZmlsZV9oZHItPmNfdWlkLAorCSAgICAgICAmZmlsZV9oZHItPmNfZ2lkLCAmZmlsZV9oZHItPmNfbmxpbmssICZmaWxlX2hkci0+Y19tdGltZSwKKwkgICAgICAgJmZpbGVfaGRyLT5jX2ZpbGVzaXplLCAmZmlsZV9oZHItPmNfZGV2X21haiwKKwkgICAgICAgJmZpbGVfaGRyLT5jX2Rldl9taW4sICZmaWxlX2hkci0+Y19yZGV2X21haiwKKwkgICAgICAgJmZpbGVfaGRyLT5jX3JkZXZfbWluLCAmZmlsZV9oZHItPmNfbmFtZXNpemUsCisJICAgICAgICZmaWxlX2hkci0+Y19jaGtzdW0pOworCS8qIFJlYWQgZmlsZSBuYW1lIGZyb20gaW5wdXQuICAqLworCWlmIChmaWxlX2hkci0+Y19uYW1lICE9IE5VTEwpCisJCWZyZWUoZmlsZV9oZHItPmNfbmFtZSk7CisJZmlsZV9oZHItPmNfbmFtZSA9IChjaGFyICopeG1hbGxvYyhmaWxlX2hkci0+Y19uYW1lc2l6ZSk7CisJdGFwZV9idWZmZXJlZF9yZWFkKGZpbGVfaGRyLT5jX25hbWUsIGluX2RlcywKKwkJCSAgIChsb25nKWZpbGVfaGRyLT5jX25hbWVzaXplKTsKKworCS8qIEluIFNWUjQgQVNDSUkgZm9ybWF0LCB0aGUgYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIGhlYWRlcgorCSAgIGlzIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbG9uZy13b3JkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGRyb3AKKwkgICAxLTMgYnl0ZXMuICAqLworCXRhcGVfc2tpcF9wYWRkaW5nKGluX2RlcywgZmlsZV9oZHItPmNfbmFtZXNpemUgKyAxMTApOworfQorCisvKiBSZXR1cm4gMTYtYml0IGludGVnZXIgSSB3aXRoIHRoZSBieXRlcyBzd2FwcGVkLiAgKi8KKyNkZWZpbmUgc3dhYl9zaG9ydChpKSAoKCgoaSkgPDwgOCkgJiAweGZmMDApIHwgKCgoaSkgPj4gOCkgJiAweDAwZmYpKQorCisvKiBSZWFkIHRoZSBoZWFkZXIsIGluY2x1ZGluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgZnJvbSBmaWxlCisgICBkZXNjcmlwdG9yIElOX0RFUyBpbnRvIEZJTEVfSERSLiAgKi8KKwordm9pZCByZWFkX2luX2hlYWRlcihzdHJ1Y3QgbmV3X2NwaW9faGVhZGVyICpmaWxlX2hkciwgaW50IGluX2RlcykKK3sKKwlsb25nIGJ5dGVzX3NraXBwZWQgPSAwOwkvKiBCeXRlcyBvZiBqdW5rIGZvdW5kIGJlZm9yZSBtYWdpYyBudW1iZXIuICAqLworCisJLyogU2VhcmNoIGZvciBhIHZhbGlkIG1hZ2ljIG51bWJlci4gICovCisKKwlmaWxlX2hkci0+Y190YXJfbGlua25hbWUgPSBOVUxMOworCisJdGFwZV9idWZmZXJlZF9yZWFkKChjaGFyICopZmlsZV9oZHIsIGluX2RlcywgNkwpOworCXdoaWxlICgxKSB7CisJCWlmICghc3RybmNtcCgoY2hhciAqKWZpbGVfaGRyLCAiMDcwNzAyIiwgNikKKwkJICAgIHx8ICFzdHJuY21wKChjaGFyICopZmlsZV9oZHIsICIwNzA3MDEiLCA2KSkKKwkJeworCQkJaWYgKGJ5dGVzX3NraXBwZWQgPiAwKQorCQkJCXdhcm5fanVua19ieXRlcyhieXRlc19za2lwcGVkKTsKKworCQkJcmVhZF9pbl9uZXdfYXNjaWkoZmlsZV9oZHIsIGluX2Rlcyk7CisJCQlicmVhazsKKwkJfQorCQlieXRlc19za2lwcGVkKys7CisJCW1lbW1vdmUoKGNoYXIgKilmaWxlX2hkciwgKGNoYXIgKilmaWxlX2hkciArIDEsIDUpOworCQl0YXBlX2J1ZmZlcmVkX3JlYWQoKGNoYXIgKilmaWxlX2hkciArIDUsIGluX2RlcywgMUwpOworCX0KK30KKworLyogUmVhZCB0aGUgY29sbGVjdGlvbiBmcm9tIHN0YW5kYXJkIGlucHV0IGFuZCBjcmVhdGUgZmlsZXMKKyAgIGluIHRoZSBmaWxlIHN5c3RlbS4gICovCisKK3ZvaWQgcHJvY2Vzc19jb3B5X2luKCkKK3sKKwljaGFyIGRvbmUgPSBmYWxzZTsJLyogVHJ1ZSBpZiB0cmFpbGVyIHJlYWNoZWQuICAqLworCXN0cnVjdCBuZXdfY3Bpb19oZWFkZXIgZmlsZV9oZHI7CS8qIE91dHB1dCBoZWFkZXIgaW5mb3JtYXRpb24uICAqLworCWludCBpbl9maWxlX2RlczsJLyogSW5wdXQgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKworCS8qIEluaXRpYWxpemUgdGhlIGNvcHkgaW4uICAqLworCWZpbGVfaGRyLmNfbmFtZSA9IE5VTEw7CisKKwkvKiBvbmx5IGZyb20gc3RkaW4gKi8KKwlpbl9maWxlX2RlcyA9IDA7CisKKwkvKiBXaGlsZSB0aGVyZSBpcyBtb3JlIGlucHV0IGluIHRoZSBjb2xsZWN0aW9uLCBwcm9jZXNzIHRoZSBpbnB1dC4gICovCisJd2hpbGUgKCFkb25lKSB7CisJCS8qIFN0YXJ0IHByb2Nlc3NpbmcgdGhlIG5leHQgZmlsZSBieSByZWFkaW5nIHRoZSBoZWFkZXIuICAqLworCQlyZWFkX2luX2hlYWRlcigmZmlsZV9oZHIsIGluX2ZpbGVfZGVzKTsKKworCQkvKiBJcyB0aGlzIHRoZSBoZWFkZXIgZm9yIHRoZSBUUkFJTEVSIGZpbGU/ICAqLworCQlpZiAoc3RyY21wKCJUUkFJTEVSISEhIiwgZmlsZV9oZHIuY19uYW1lKSA9PSAwKSB7CisJCQlkb25lID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ29weSB0aGUgaW5wdXQgZmlsZSBpbnRvIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgKi8KKworCQljb3B5aW5fZmlsZSgmZmlsZV9oZHIsIGluX2ZpbGVfZGVzKTsKKworCQlpZiAoZG90X2ZsYWcpCisJCQlmcHV0YygnLicsIHN0ZGVycik7CisJfQorCisJaWYgKGRvdF9mbGFnKQorCQlmcHV0YygnXG4nLCBzdGRlcnIpOworCisJY3JlYXRlX2ZpbmFsX2RlZmVycygpOworCit9CisKKy8qIEluaXRpYWxpemUgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0byB0aGVpciBwcm9wZXIgc2l6ZSBhbmQKKyAgIGluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IGFuZCBvdXRwdXQKKyAgIGJ1ZmZlcnMuICAqLworCit2b2lkIGluaXRpYWxpemVfYnVmZmVycygpCit7CisJaW50IGluX2J1Zl9zaXplLCBvdXRfYnVmX3NpemU7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGlucHV0IGJ1ZmZlciBjYW4gYWx3YXlzIGhvbGQgMiBibG9ja3MgYW5kIHRoYXQgaXQKKwkgICBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgMSB0YXIgcmVjb3JkICg1MTIgYnl0ZXMpIGV2ZW4gaWYgaXQKKwkgICBpcyBub3QgYWxpZ25lZCBvbiBhIGJsb2NrIGJvdW5kYXJ5LiAgVGhlIGV4dHJhIGJ1ZmZlciBzcGFjZQorCSAgIGlzIG5lZWRlZCBieSBwcm9jZXNzX2NvcHlpbiBhbmQgcGVla19pbl9idWYgdG8gYXV0b21hdGljYWxseQorCSAgIGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGFyY2hpdmUgaXQgaXMgcmVhZGluZy4gICovCisJaWYgKGlvX2Jsb2NrX3NpemUgPj0gNTEyKQorCQlpbl9idWZfc2l6ZSA9IDIgKiBpb19ibG9ja19zaXplOworCWVsc2UKKwkJaW5fYnVmX3NpemUgPSAxMDI0OworCW91dF9idWZfc2l6ZSA9IERJU0tfSU9fQkxPQ0tfU0laRTsKKworCWlucHV0X2J1ZmZlciA9IChjaGFyICopeG1hbGxvYyhpbl9idWZfc2l6ZSk7CisJaW5fYnVmZiA9IGlucHV0X2J1ZmZlcjsKKwlpbnB1dF9idWZmZXJfc2l6ZSA9IGluX2J1Zl9zaXplOworCWlucHV0X3NpemUgPSAwOworCWlucHV0X2J5dGVzID0gMDsKKworCW91dHB1dF9idWZmZXIgPSAoY2hhciAqKXhtYWxsb2Mob3V0X2J1Zl9zaXplKTsKKwlvdXRfYnVmZiA9IG91dHB1dF9idWZmZXI7CisJb3V0cHV0X3NpemUgPSAwOworCW91dHB1dF9ieXRlcyA9IDA7CisKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgYzsKKwlpbnQgZXh0cmFjdF9mbGFnID0gZmFsc2U7CisKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgImlWIik7CisJCWlmIChjID09IEVPRikKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnVic6CisJCQlkb3RfZmxhZyA9IHRydWU7CisJCQlicmVhazsKKworCQljYXNlICdpJzoKKwkJCWV4dHJhY3RfZmxhZyA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiJXM6IG5vdCBpbXBsZW1lbnRlZCBvciBpbnZhbGlkIG9wdGlvbiAtJWNcbiIsCisJCQkJcHJvZ25hbWUsIG9wdG9wdCk7CisJCQlleGl0KDEpOworCisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmIChleHRyYWN0X2ZsYWcpIHsKKwkJaW5pdGlhbGl6ZV9idWZmZXJzKCk7CisKKwkJcHJvY2Vzc19jb3B5X2luKCk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1WXSAtaSBbPCBhcmNoaXZlXVxuIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2RkLmMgYi91c3IvdXRpbHMvZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJlMmNmCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL2RkLmMKQEAgLTAsMCArMSw1MzMgQEAKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkJKHNpemVvZih4KSAvIHNpemVvZih4WzBdKSkKKworc3RhdGljIGNoYXIgKnByb2duYW1lOworCitzdHJ1Y3Qgb3B0aW9uIHsKKwljb25zdCBjaGFyICpvcHQ7CisJY2hhciAqc3RyOworCWNoYXIgKmFyZzsKK307CisKK3N0cnVjdCBjb252IHsKKwljb25zdCBjaGFyIHN0cls4XTsKKwl1bnNpZ25lZCBpbnQgc2V0OworCXVuc2lnbmVkIGludCBleGNsdWRlOworfTsKKworI2RlZmluZSBDT05WX0JMT0NLCSgxPDwwKQorI2RlZmluZSBDT05WX1VOQkxPQ0sJKDE8PDEpCisKKyNkZWZpbmUgQ09OVl9MQ0FTRQkoMTw8MikKKyNkZWZpbmUgQ09OVl9VQ0FTRQkoMTw8MykKKworI2RlZmluZSBDT05WX1NXQUIJKDE8PDQpCisjZGVmaW5lIENPTlZfTk9FUlJPUgkoMTw8NSkKKyNkZWZpbmUgQ09OVl9OT1RSVU5DCSgxPDw2KQorI2RlZmluZSBDT05WX1NZTkMJKDE8PDcpCisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwl7ImJzIiwgTlVMTCwgTlVMTH0sCisjZGVmaW5lIE9QVF9CUwkJKCZvcHRpb25zWzBdKQorCXsiY2JzIiwgTlVMTCwgTlVMTH0sCisjZGVmaW5lIE9QVF9DQlMJCSgmb3B0aW9uc1sxXSkKKwl7ImNvbnYiLCBOVUxMLCBOVUxMfSwKKyNkZWZpbmUgT1BUX0NPTlYJKCZvcHRpb25zWzJdKQorCXsiY291bnQiLCBOVUxMLCBOVUxMfSwKKyNkZWZpbmUgT1BUX0NPVU5UCSgmb3B0aW9uc1szXSkKKwl7ImlicyIsIE5VTEwsIE5VTEx9LAorI2RlZmluZSBPUFRfSUJTCQkoJm9wdGlvbnNbNF0pCisJeyJpZiIsIE5VTEwsIE5VTEx9LAorI2RlZmluZSBPUFRfSUYJCSgmb3B0aW9uc1s1XSkKKwl7Im9icyIsIE5VTEwsIE5VTEx9LAorI2RlZmluZSBPUFRfT0JTCQkoJm9wdGlvbnNbNl0pCisJeyJvZiIsIE5VTEwsIE5VTEx9LAorI2RlZmluZSBPUFRfT0YJCSgmb3B0aW9uc1s3XSkKKwl7InNlZWsiLCBOVUxMLCBOVUxMfSwKKyNkZWZpbmUgT1BUX1NFRUsJKCZvcHRpb25zWzhdKQorCXsic2tpcCIsIE5VTEwsIE5VTEx9CisjZGVmaW5lIE9QVF9TS0lQCSgmb3B0aW9uc1s5XSkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29udiBjb252X29wdHNbXSA9IHsKKwl7ImJsb2NrIiwgQ09OVl9CTE9DSywgQ09OVl9VTkJMT0NLfSwKKwl7InVuYmxvY2siLCBDT05WX1VOQkxPQ0ssIENPTlZfQkxPQ0t9LAorCXsibGNhc2UiLCBDT05WX0xDQVNFLCBDT05WX1VDQVNFfSwKKwl7InVjYXNlIiwgQ09OVl9VQ0FTRSwgQ09OVl9MQ0FTRX0sCisJeyJzd2FiIiwgQ09OVl9TV0FCLCAwfSwKKwl7Im5vZXJyb3IiLCBDT05WX05PRVJST1IsIDB9LAorCXsibm90cnVuYyIsIENPTlZfTk9UUlVOQywgMH0sCisJeyJzeW5jIiwgQ09OVl9TWU5DLCAwfSwKK307CisKK3N0YXRpYyBzaXplX3QgY2JzOworc3RhdGljIHVuc2lnbmVkIGludCBjb252Oworc3RhdGljIHVuc2lnbmVkIGludCBjb3VudDsKK3N0YXRpYyBzaXplX3QgaWJzID0gNTEyOworc3RhdGljIHNpemVfdCBvYnMgPSA1MTI7CitzdGF0aWMgdW5zaWduZWQgaW50IHNlZWs7CitzdGF0aWMgdW5zaWduZWQgaW50IHNraXA7CitzdGF0aWMgY2hhciAqaW5fYnVmOworc3RhdGljIGNoYXIgKm91dF9idWY7CisKK3N0YXRpYyBzaXplX3QgcGFyc2VfYnMoc3RydWN0IG9wdGlvbiAqb3B0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsLCByZWFsdmFsID0gMTsKKwljaGFyICpzdHIgPSBvcHQtPnN0cjsKKwlpbnQgZXJyID0gMDsKKworCWRvIHsKKwkJY2hhciAqcyA9IHN0cjsKKwkJdmFsID0gc3RydG91bChzdHIsICZzdHIsIDEwKTsKKwkJaWYgKHMgPT0gc3RyIHx8ICh2YWwgPT0gVUxPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkpIHsKKwkJCWVyciA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgb3B0aW9uIG1heSBiZSBmb2xsb3dlZCBieQorCQkgKiAnYicsICdrJyBvciAneCcKKwkJICovCisJCWlmICgqc3RyID09ICdiJykgeworCQkJdmFsICo9IDUxMjsKKwkJCXN0cisrOworCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ2snKSB7CisJCQl2YWwgKj0gMTAyNDsKKwkJCXN0cisrOworCQl9CisJCXJlYWx2YWwgKj0gdmFsOworCQlpZiAoKnN0ciAhPSAneCcpCisJCQlicmVhazsKKwkJc3RyKys7CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoKnN0ciAhPSAnXDAnKQorCQllcnIgPSAxOworCisJaWYgKGVycikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgb3BlcmFuZCBgJXMnXG4iLCBwcm9nbmFtZSwgb3B0LT5hcmcpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiAoc2l6ZV90KSByZWFsdmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBhcnNlX251bShzdHJ1Y3Qgb3B0aW9uICpvcHQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJY2hhciAqc3RyID0gb3B0LT5zdHI7CisKKwl2YWwgPSBzdHJ0b3VsKHN0ciwgJnN0ciwgMTApOworCWlmIChzdHIgPT0gb3B0LT5zdHIgfHwgKHZhbCA9PSBVTE9OR19NQVggJiYgZXJybm8gPT0gRVJBTkdFKSB8fAorCSAgICB2YWwgPiBVSU5UX01BWCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgb3BlcmFuZCBgJXMnXG4iLCBwcm9nbmFtZSwgb3B0LT5hcmcpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiAodW5zaWduZWQgaW50KXZhbDsKK30KKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqcCwgKnM7CisJaW50IGFyZzsKKworCS8qCisJICogV2UgY2hlYXQgaGVyZTsgd2UgZG9uJ3QgcGFyc2UgdGhlIG9wZXJhbmQgdmFsdWVzCisJICogdGhlbXNlbHZlcyBoZXJlLiAgV2UgbWVyZWx5IHNwbGl0IHRoZSBvcGVyYW5kcworCSAqIHVwLiAgVGhpcyBtZWFucyB0aGF0IGJzPWZvbyBicz0xIHdvbid0IHByb2R1Y2UKKwkgKiBhbiBlcnJvci4KKwkgKi8KKwlmb3IgKGFyZyA9IDE7IGFyZyA8IGFyZ2M7IGFyZysrKSB7CisJCXVuc2lnbmVkIGludCBsZW47CisKKwkJcyA9IHN0cmNocihhcmd2W2FyZ10sICc9Jyk7CisJCWlmICghcykKKwkJCXMgPSBhcmd2W2FyZ107CS8qIGRvbid0IHJlY29nbmlzZSB0aGlzIGFyZyAqLworCisJCWxlbiA9IHMgLSBhcmd2W2FyZ107CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wdGlvbnMpOyBpKyspIHsKKwkJCWlmIChzdHJuY21wKG9wdGlvbnNbaV0ub3B0LCBhcmd2W2FyZ10sIGxlbikgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJb3B0aW9uc1tpXS5zdHIgPSBzICsgMTsKKwkJCW9wdGlvbnNbaV0uYXJnID0gYXJndlthcmddOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKG9wdGlvbnMpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgb3BlcmFuZCBgJXMnXG4iLAorCQkJCXByb2duYW1lLCBhcmd2W2FyZ10pOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKgorCSAqIFRyYW5zbGF0ZSBudW1lcmljIG9wZXJhbmRzLgorCSAqLworCWlmIChPUFRfSUJTLT5zdHIpCisJCWlicyA9IHBhcnNlX2JzKE9QVF9JQlMpOworCWlmIChPUFRfT0JTLT5zdHIpCisJCW9icyA9IHBhcnNlX2JzKE9QVF9PQlMpOworCWlmIChPUFRfQ0JTLT5zdHIpCisJCWNicyA9IHBhcnNlX2JzKE9QVF9DQlMpOworCWlmIChPUFRfQ09VTlQtPnN0cikKKwkJY291bnQgPSBwYXJzZV9udW0oT1BUX0NPVU5UKTsKKwlpZiAoT1BUX1NFRUstPnN0cikKKwkJc2VlayA9IHBhcnNlX251bShPUFRfU0VFSyk7CisJaWYgKE9QVF9TS0lQLT5zdHIpCisJCXNraXAgPSBwYXJzZV9udW0oT1BUX1NLSVApOworCisJLyoKKwkgKiBJZiBicz0gaXMgc3BlY2lmaWVkLCBpdCBvdmVycmlkZXMgaWJzPSBhbmQgb2JzPQorCSAqLworCWlmIChPUFRfQlMtPnN0cikKKwkJaWJzID0gb2JzID0gcGFyc2VfYnMoT1BUX0JTKTsKKworCS8qCisJICogQW5kIGZpbmFsbHkgY29udj0KKwkgKi8KKwlpZiAoT1BUX0NPTlYtPnN0cikgeworCQlwID0gT1BUX0NPTlYtPnN0cjsKKworCQl3aGlsZSAoKHMgPSBzdHJzZXAoJnAsICIsIikpICE9IE5VTEwpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbnZfb3B0cyk7IGkrKykgeworCQkJCWlmIChzdHJjbXAocywgY29udl9vcHRzW2ldLnN0cikgIT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJY29udiAmPSB+Y29udl9vcHRzW2ldLmV4Y2x1ZGU7CisJCQkJY29udiB8PSBjb252X29wdHNbaV0uc2V0OworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaSA9PSBBUlJBWV9TSVpFKGNvbnZfb3B0cykpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgY29udmVyc2lvbiBgJXMnXG4iLAorCQkJCQlwcm9nbmFtZSwgcyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY29udiAmIChDT05WX0JMT0NLIHwgQ09OVl9VTkJMT0NLKSAmJiBjYnMgPT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBibG9jay91bmJsb2NrIGNvbnZlcnNpb24gd2l0aCB6ZXJvIGNic1xuIiwKKwkJCXByb2duYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2FmZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0LCBjb3VudCA9IDA7CisJY2hhciAqcCA9IGJ1ZjsKKworCXdoaWxlIChzaXplKSB7CisJCXJldCA9IHJlYWQoZmQsIHAsIHNpemUpOworCisJCS8qCisJCSAqIElmIHdlIGdvdCBFSU5UUiwgZ28gYWdhaW4uCisJCSAqLworCQlpZiAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWYgd2UgZW5jb3VudGVyZWQgYW4gZXJyb3IgY29uZGl0aW9uCisJCSAqIG9yIHJlYWQgMCBieXRlcyAoRU9GKSByZXR1cm4gd2hhdCB3ZQorCQkgKiBoYXZlLgorCQkgKi8KKwkJaWYgKHJldCA9PSAtMSB8fCByZXQgPT0gMCkKKwkJCXJldHVybiBjb3VudCA/IGNvdW50IDogcmV0OworCisJCS8qCisJCSAqIFdlIHJlYWQgc29tZSBieXRlcy4KKwkJICovCisJCWNvdW50ICs9IHJldDsKKwkJc2l6ZSAtPSByZXQ7CisJCXAgKz0gcmV0OworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBza2lwX2Jsb2NrcyhpbnQgZmQsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGJsa3MsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGludCBibGs7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIFRyeSB0byBzZWVrLgorCSAqLworCWZvciAoYmxrID0gMDsgYmxrIDwgYmxrczsgYmxrKyspIHsKKwkJcmV0ID0gbHNlZWsoZmQsIHNpemUsIFNFRUtfQ1VSKTsKKwkJaWYgKHJldCA9PSAtMSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgd2UgZmFpbGVkIHRvIHNlZWssIHJlYWQgaW5zdGVhZC4KKwkgKiBGSVhNRTogd2UgZG9uJ3QgaGFuZGxlIHNob3J0IHJlYWRzIGhlcmUsIG9yCisJICogRUlOVFIgY29ycmVjdGx5LgorCSAqLworCWlmIChibGsgPT0gMCAmJiByZXQgPT0gLTEgJiYgZXJybm8gPT0gRVNQSVBFKSB7CisJCWZvciAoYmxrID0gMDsgYmxrIDwgYmxrczsgYmxrKyspIHsKKwkJCXJldCA9IHNhZmVfcmVhZChmZCwgYnVmLCBzaXplKTsKKwkJCWlmIChyZXQgIT0gKGludClzaXplKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCA9PSAtMSkgeworCQlwZXJyb3IoInNlZWsvc2tpcCIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzdGF0cyB7CisJdW5zaWduZWQgaW50IGluX2Z1bGw7CisJdW5zaWduZWQgaW50IGluX3BhcnRpYWw7CisJdW5zaWduZWQgaW50IG91dF9mdWxsOworCXVuc2lnbmVkIGludCBvdXRfcGFydGlhbDsKKwl1bnNpZ25lZCBpbnQgdHJ1bmNhdGVkOworfTsKKworc3RhdGljIGludCBkb19kZChpbnQgcmQsIGludCB3ciwgc3RydWN0IHN0YXRzICpzdGF0cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCWludCBmaWxsX3ZhbCA9IDA7CisJc2l6ZV90IG91dF9zaXplID0gMDsKKwlzaXplX3QgaW5fc2l6ZTsKKwljaGFyICpidWY7CisKKwlpZiAoY29udiAmIChDT05WX0JMT0NLIHwgQ09OVl9VTkJMT0NLKSkKKwkJZmlsbF92YWwgPSAnICc7CisKKwl3aGlsZSAoIU9QVF9DT1VOVC0+c3RyIHx8IGNvdW50LS0gIT0gMCkgeworCQlidWYgPSBpbl9idWY7CisKKwkJLyoKKwkJICogMS4gcmVhZCBpYnMtc2l6ZWQgYnVmZmVyCisJCSAqLworCQlpbl9zaXplID0gcmV0ID0gcmVhZChyZCwgaW5fYnVmLCBpYnMpOworCQlpZiAocmV0ID09IC0xIHx8IChyZXQgPT0gMCAmJiAoY29udiAmIENPTlZfTk9FUlJPUikgPT0gMCkpCisJCQlicmVhazsKKworCQlpZiAoaW5fc2l6ZSA9PSBpYnMpIHsKKwkJCXN0YXRzLT5pbl9mdWxsKys7CisJCX0gZWxzZSB7CisJCQlzdGF0cy0+aW5fcGFydGlhbCsrOworCisJCQkvKgorCQkJICogMi4gemVybyAob3IgYXBwZW5kIHNwYWNlcykKKwkJCSAqLworCQkJaWYgKGNvbnYgJiBDT05WX1NZTkMpIHsKKwkJCQltZW1zZXQoaW5fYnVmICsgaW5fc2l6ZSwgZmlsbF92YWwsCisJCQkJICAgICAgIGlicyAtIGluX3NpemUpOworCQkJCWluX3NpemUgPSBpYnM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiA0LiBzd2FiIGNvbnZlcnNpb24uICBXaXRoIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsCisJCSAqIGxhc3QgYnl0ZSBkb2VzIG5vdCBnZXQgc3dhcHBlZC4KKwkJICovCisJCWlmIChjb252ICYgQ09OVl9TV0FCKSB7CisJCQljaGFyIGM7CisKKwkJCWZvciAoaSA9IDE7IGkgPCBpbl9zaXplOyBpICs9IDIpIHsKKwkJCQljID0gaW5fYnVmW2kgLSAxXTsKKwkJCQlpbl9idWZbaSAtIDFdID0gaW5fYnVmW2ldOworCQkJCWluX2J1ZltpXSA9IGM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiA1LiByZW1haW5pbmcgY29udmVyc2lvbnMuCisJCSAqLworCQlpZiAoY29udiAmIENPTlZfTENBU0UpCisJCQlmb3IgKGkgPSAwOyBpIDwgaW5fc2l6ZTsgaSsrKQorCQkJCWluX2J1ZltpXSA9IHRvbG93ZXIoaW5fYnVmW2ldKTsKKworCQlpZiAoY29udiAmIENPTlZfVUNBU0UpCisJCQlmb3IgKGkgPSAwOyBpIDwgaW5fc2l6ZTsgaSsrKQorCQkJCWluX2J1ZltpXSA9IHRvdXBwZXIoaW5fYnVmW2ldKTsKKworCQkvKiBibG9jay91bmJsb2NrID8gKi8KKworCQkvKgorCQkgKiA2LiBBZ2dyZWdhdGUgaW50byBvYnMgc2l6ZWQgYnVmZmVycy4KKwkJICogSWYgdGhlIGluX3NpemUgaXMgb2JzLXNpemVkIGFuZCB3ZSBoYXZlIG5vCisJCSAqIGRhdGEgd2FpdGluZywganVzdCB3cml0ZSAiYnVmIiB0byB0aGUgb3V0cHV0LgorCQkgKi8KKwkJaWYgKG91dF9zaXplID09IDAgJiYgaW5fc2l6ZSA9PSBvYnMpIHsKKwkJCXdyaXRlKHdyLCBidWYsIG9icyk7CisJCQlzdGF0cy0+b3V0X2Z1bGwrKzsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBXZSBoYWQgZGF0YSB3YWl0aW5nLCBvciB3ZSBkaWRuJ3QgaGF2ZSBhbgorCQkJICogb2JzLXNpemVkIGlucHV0IGJsb2NrLiAgV2UgbmVlZCB0byBhcHBlbmQKKwkJCSAqIHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorCQkJICovCisJCQl1bnNpZ25lZCBpbnQgc3BhY2U7CisJCQljaGFyICppbl9wdHIgPSBpbl9idWY7CisKKwkJCWRvIHsKKwkJCQlzcGFjZSA9IG9icyAtIG91dF9zaXplOworCQkJCWlmIChzcGFjZSA+IGluX3NpemUpCisJCQkJCXNwYWNlID0gaW5fc2l6ZTsKKworCQkJCW1lbWNweShvdXRfYnVmICsgb3V0X3NpemUsIGluX3B0ciwgc3BhY2UpOworCQkJCW91dF9zaXplICs9IHNwYWNlOworCQkJCWluX3NpemUgLT0gc3BhY2U7CisJCQkJaW5fcHRyICs9IHNwYWNlOworCisJCQkJaWYgKG91dF9zaXplID09IG9icykgeworCQkJCQl3cml0ZSh3ciwgb3V0X2J1Ziwgb2JzKTsKKwkJCQkJc3RhdHMtPm91dF9mdWxsKys7CisJCQkJCW91dF9zaXplID0gMDsKKwkJCQl9CisJCQl9IHdoaWxlIChvdXRfc2l6ZSA9PSAwICYmIGluX3NpemUpOworCisJCQlpZiAoaW5fc2l6ZSkgeworCQkJCW1lbWNweShvdXRfYnVmLCBpbl9wdHIsIGluX3NpemUpOworCQkJCW91dF9zaXplID0gaW5fc2l6ZTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChvdXRfc2l6ZSkgeworCQl3cml0ZSh3ciwgb3V0X2J1Ziwgb3V0X3NpemUpOworCQlzdGF0cy0+b3V0X3BhcnRpYWwrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpZ2ptcF9idWYgam1wOworCitzdGF0aWMgdm9pZCBzaWdpbnRfaGFuZGxlcihpbnQgc2lnKQoreworCXNpZ2xvbmdqbXAoam1wLCAtc2lnKTsKK30KKworc3RhdGljIGludCBkZChpbnQgcmRfZmQsIGludCB3cl9mZCwgc3RydWN0IHN0YXRzICpzdGF0cykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2lnc2V0am1wKGptcCwgMSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXN5c3Zfc2lnbmFsKFNJR0lOVCwgc2lnaW50X2hhbmRsZXIpOworCQlyZXQgPSBkb19kZChyZF9mZCwgd3JfZmQsIHN0YXRzKTsKKwl9CisKKwlzeXN2X3NpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IHN0YXRzIHN0YXRzOworCWludCByZXQ7CisJaW50IHJkX2ZkID0gMCwgd3JfZmQgPSAxOworCisJcHJvZ25hbWUgPSBhcmd2WzBdOworCisJcmV0ID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNvbnYgJiAoQ09OVl9CTE9DSyB8IENPTlZfVU5CTE9DSykpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogYmxvY2svdW5ibG9jayBub3QgaW1wbGVtZW50ZWRcbiIsCisJCQlwcm9nbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWluX2J1ZiA9IG1hbGxvYyhpYnMpOworCWlmICghaW5fYnVmKSB7CisJCXBlcnJvcigibWFsbG9jIGlicyIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlvdXRfYnVmID0gbWFsbG9jKG9icyk7CisJaWYgKCFvdXRfYnVmKSB7CisJCXBlcnJvcigibWFsbG9jIG9icyIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIE9wZW4gdGhlIGlucHV0IGZpbGUsIGlmIHNwZWNpZmllZC4KKwkgKi8KKwlpZiAoT1BUX0lGLT5zdHIpIHsKKwkJcmRfZmQgPSBvcGVuKE9QVF9JRi0+c3RyLCBPX1JET05MWSk7CisJCWlmIChyZF9mZCA9PSAtMSkgeworCQkJcGVycm9yKCJvcGVuIGlucHV0IGZpbGUiKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyoKKwkgKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSwgaWYgc3BlY2lmaWVkLgorCSAqLworCWlmIChPUFRfT0YtPnN0cikgeworCQlpbnQgZmxhZ3MgPSBPX1dST05MWXxPX0NSRUFUOworCQlmbGFncyB8PSAoY29udiAmIENPTlZfTk9UUlVOQykgPyAwIDogT19UUlVOQzsKKwkJd3JfZmQgPSBvcGVuKE9QVF9PRi0+c3RyLCBmbGFncywgMDY2Nik7CisJCWlmICh3cl9mZCA9PSAtMSkgeworCQkJcGVycm9yKCJvcGVuIG91dHB1dCBmaWxlIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qCisJICogU2tpcCBvYnMtc2l6ZWQgYmxvY2tzIG9mIG91dHB1dCBmaWxlLgorCSAqLworCWlmIChPUFRfU0VFSy0+c3RyICYmIHNraXBfYmxvY2tzKHdyX2ZkLCBvdXRfYnVmLCBzZWVrLCBvYnMpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogU2tpcCBpYnMtc2l6ZWQgYmxvY2tzIG9mIGlucHV0IGZpbGUuCisJICovCisJaWYgKE9QVF9TS0lQLT5zdHIgJiYgc2tpcF9ibG9ja3MocmRfZmQsIGluX2J1Ziwgc2tpcCwgaWJzKSkKKwkJcmV0dXJuIDE7CisKKwltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKKworCS8qCisJICogRG8gdGhlIHJlYWwgd29yaworCSAqLworCXJldCA9IGRkKHJkX2ZkLCB3cl9mZCwgJnN0YXRzKTsKKworCWlmIChjbG9zZShyZF9mZCkgPT0gLTEpCisJCXBlcnJvcihPUFRfSUYtPnN0ciA/IE9QVF9JRi0+c3RyIDogInN0ZGluIik7CisJaWYgKGNsb3NlKHdyX2ZkKSA9PSAtMSkKKwkJcGVycm9yKE9QVF9PRi0+c3RyID8gT1BUX09GLT5zdHIgOiAic3Rkb3V0Iik7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiV1KyV1IHJlY29yZHMgaW5cbiIsIHN0YXRzLmluX2Z1bGwsIHN0YXRzLmluX3BhcnRpYWwpOworCWZwcmludGYoc3RkZXJyLCAiJXUrJXUgcmVjb3JkcyBvdXRcbiIsCisJCXN0YXRzLm91dF9mdWxsLCBzdGF0cy5vdXRfcGFydGlhbCk7CisJaWYgKHN0YXRzLnRydW5jYXRlZCkKKwkJZnByaW50ZihzdGRlcnIsICIldSB0cnVuY2F0ZWQgcmVjb3JkJXNcbiIsCisJCQlzdGF0cy50cnVuY2F0ZWQsIHN0YXRzLnRydW5jYXRlZCA9PSAxID8gIiIgOiAicyIpOworCisJLyoKKwkgKiByZXQgd2lsbCBiZSAtU0lHSU5UIGlmIHdlIGdvdCBhIFNJR0lOVC4gIFJhaXNlCisJICogdGhlIHNpZ25hbCBhZ2FpbiB0byBjYXVzZSB1cyB0byB0ZXJtaW5hdGUgd2l0aAorCSAqIFNJR0lOVCBzdGF0dXMuCisJICovCisJaWYgKHJldCA9PSAtU0lHSU5UKQorCQlyYWlzZShTSUdJTlQpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9mYWxzZS5jIGIvdXNyL3V0aWxzL2ZhbHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzMjQzYQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9mYWxzZS5jCkBAIC0wLDAgKzEsNCBAQAoraW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9maWxlX21vZGUuYyBiL3Vzci91dGlscy9maWxlX21vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY3ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL2ZpbGVfbW9kZS5jCkBAIC0wLDAgKzEsMTQzIEBACisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImZpbGVfbW9kZS5oIgorCitleHRlcm4gY2hhciAqcHJvZ25hbWU7CisKK21vZGVfdCBwYXJzZV9maWxlX21vZGUoY2hhciAqYXJnLCBtb2RlX3QgbW9kZSwgbW9kZV90IHN1bWFzaykKK3sKKwljaGFyICpjbGF1c2U7CisKKwlpZiAoaXNkaWdpdCgqYXJnKSAmJiAqYXJnIDwgJzgnKSB7CisJCXVuc2lnbmVkIGxvbmcgbnVtOworCisJCW51bSA9IHN0cnRvdWwoYXJnLCBOVUxMLCA4KTsKKwkJaWYgKChudW0gPT0gVUxPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkgfHwgbnVtID4gMDc3NzcpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgbW9kZSBgJXMnXG4iLCBwcm9nbmFtZSwKKwkJCQlhcmcpOworCQkJZXhpdCgyNTUpOworCQl9CisJCXJldHVybiAobW9kZV90KSBudW07CisJfQorCisJd2hpbGUgKChjbGF1c2UgPSBzdHJzZXAoJmFyZywgIiwiKSkgIT0gTlVMTCkgeworCQltb2RlX3Qgd2hvID0gMDsKKwkJaW50IGFjdGlvbjsKKwkJY2hhciAqcCA9IGNsYXVzZTsKKworCQkvKgorCQkgKiBQYXJzZSB0aGUgd2hvIGxpc3QuICBPcHRpb25hbC4KKwkJICovCisJCXdoaWxlICgxKSB7CisJCQlzd2l0Y2ggKCpwKyspIHsKKwkJCWNhc2UgJ3UnOgorCQkJCXdobyB8PSBTX0lSV1hVIHwgU19JU1VJRDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJ2cnOgorCQkJCXdobyB8PSBTX0lSV1hHIHwgU19JU0dJRDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJ28nOgorCQkJCXdobyB8PSBTX0lSV1hPIHwgU19JU1ZUWDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJ2EnOgorCQkJCXdobyA9CisJCQkJICAgIFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTyB8IFNfSVNVSUQgfAorCQkJCSAgICBTX0lTR0lEIHwgU19JU1ZUWDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIHVuZG8gdGhlIGluY3JlbWVudCBhYm92ZSAqLworCQkJcC0tOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAod2hvID09IDApCisJCQl3aG8gPSAofnN1bWFzaykgfCBTX0lTVlRYOworCisJCS8qCisJCSAqIFBhcnNlIGFuIGFjdGlvbiBsaXN0LiAgTXVzdCBiZSBhdCBsZWFzdCBvbmUgYWN0aW9uLgorCQkgKi8KKwkJd2hpbGUgKCpwKSB7CisJCQltb2RlX3QgcGVybSA9IDA7CisKKwkJCS8qCisJCQkgKiBQYXJzZSB0aGUgYWN0aW9uCisJCQkgKi8KKwkJCWFjdGlvbiA9ICpwOworCQkJaWYgKGFjdGlvbiA9PSAnKycgfHwgYWN0aW9uID09ICctJyB8fCBhY3Rpb24gPT0gJz0nKQorCQkJCXArKzsKKworCQkJLyoKKwkJCSAqIFBhcnNlIHBlcm0KKwkJCSAqLworCQkJd2hpbGUgKCpwKSB7CisJCQkJc3dpdGNoICgqcCsrKSB7CisJCQkJY2FzZSAncic6CisJCQkJCXBlcm0gfD0gU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCQkJCQljb250aW51ZTsKKwkJCQljYXNlICd3JzoKKwkJCQkJcGVybSB8PSBTX0lXVVNSIHwgU19JV0dSUCB8IFNfSVdPVEg7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJ3gnOgorCQkJCQlwZXJtIHw9IFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USDsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSAnWCc6CisJCQkJCXBlcm0gfD0gU19JU1ZUWDsKKwkJCQkJY29udGludWU7CisJCQkJY2FzZSAncyc6CisJCQkJCXBlcm0gfD0gU19JU1VJRCB8IFNfSVNHSUQ7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJ3UnOgorCQkJCQlwZXJtID0gbW9kZSAmIFNfSVJXWFU7CisJCQkJCXBlcm0gfD0gcGVybSA+PiAzIHwgcGVybSA+PiA2OworCQkJCQlpZiAobW9kZSAmIFNfSVNVSUQpCisJCQkJCQlwZXJtIHw9IFNfSVNHSUQ7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJ2cnOgorCQkJCQlwZXJtID0gbW9kZSAmIFNfSVJXWEc7CisJCQkJCXBlcm0gfD0gcGVybSA8PCAzIHwgcGVybSA+PiAzOworCQkJCQlpZiAobW9kZSAmIFNfSVNHSUQpCisJCQkJCQlwZXJtIHw9IFNfSVNVSUQ7CisJCQkJCWNvbnRpbnVlOworCQkJCWNhc2UgJ28nOgorCQkJCQlwZXJtID0gbW9kZSAmIFNfSVJXWE87CisJCQkJCXBlcm0gfD0gcGVybSA8PCA2IHwgcGVybSA8PCAzOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogdW5kbyB0aGUgaW5jcmVtZW50IGFib3ZlICovCisJCQkJcC0tOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwZXJtICY9IHdobzsKKworCQkJc3dpdGNoIChhY3Rpb24pIHsKKwkJCWNhc2UgJysnOgorCQkJCW1vZGUgfD0gcGVybTsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnLSc6CisJCQkJbW9kZSAmPSB+cGVybTsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSAnPSc6CisJCQkJbW9kZSAmPSB+d2hvOworCQkJCW1vZGUgfD0gcGVybTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFhY3Rpb24pCisJCQkJYnJlYWs7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG1vZGUgYCVzJ1xuIiwgcHJvZ25hbWUsCisJCQkJY2xhdXNlKTsKKwkJCWV4aXQoMjU1KTsKKwkJfQorCX0KKworCXJldHVybiBtb2RlOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2ZpbGVfbW9kZS5oIGIvdXNyL3V0aWxzL2ZpbGVfbW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NGY2MDMKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvZmlsZV9tb2RlLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFVUSUxTX0ZJTEVfTU9ERV9ICisjZGVmaW5lIFVUSUxTX0ZJTEVfTU9ERV9ICisKK21vZGVfdCBwYXJzZV9maWxlX21vZGUoY2hhciAqYXJnLCBtb2RlX3QgbW9kZSwgbW9kZV90IHN1bWFzayk7CisKKyNlbmRpZiAvKiBVVElMU19GSUxFX01PREVfSCAqLwpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL2hhbHQuYyBiL3Vzci91dGlscy9oYWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2NTZiNQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9oYWx0LmMKQEAgLTAsMCArMSw1NSBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9yZWJvb3QuaD4KKyNpbmNsdWRlIDxrbGliYy9jb21waWxlci5oPgorCitzdGF0aWMgX19ub3JldHVybiB1c2FnZSh2b2lkKQoreworICAgICAgIHN0YXRpYyBjaGFyIG1lc2dbXSA9ICJVc2FnZToge2hhbHR8cmVib290fHBvd2Vyb2ZmfSBbLW5dXG4iOworICAgICAgIHdyaXRlKDIsIG1lc2csIHNpemVvZihtZXNnKSAtIDEpOworICAgICAgIGV4aXQoMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgICAgaW50IGNtZCA9IDA7IC8qIGluaXRhbGl6ZSB0byBzaHV0IGdjYyB1cCAqLworICAgICAgIGludCBkb19zeW5jID0gMTsKKyAgICAgICBjaGFyICpwdHIsICpwdHIyOworCisgICAgICAgLyogV2hpY2ggYWN0aW9uIChwcm9ncmFtIG5hbWUpPyAqLworICAgICAgIHB0cjIgPSBwdHIgPSBhcmd2WzBdOworICAgICAgIHdoaWxlICgqcHRyMikKKyAgICAgICAgICAgICAgIGlmICgqcHRyMisrID09ICcvJykKKyAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcHRyMjsKKyAgICAgICBpZiAoKnB0ciA9PSAncicpCisgICAgICAgICAgICAgICBjbWQgPSBMSU5VWF9SRUJPT1RfQ01EX1JFU1RBUlQ7CisgICAgICAgZWxzZSBpZiAoKnB0ciA9PSAnaCcpCisgICAgICAgICAgICAgICBjbWQgPSBMSU5VWF9SRUJPT1RfQ01EX0hBTFQ7CisgICAgICAgZWxzZSBpZiAoKnB0ciA9PSAncCcpCisgICAgICAgICAgICAgICBjbWQgPSBMSU5VWF9SRUJPT1RfQ01EX1BPV0VSX09GRjsKKyAgICAgICBlbHNlCisgICAgICAgICAgICAgICB1c2FnZSgpOworCisgICAgICAgLyogV2FsayBvcHRpb25zICovCisgICAgICAgd2hpbGUgKCorK2FyZ3YgJiYgKiphcmd2ID09ICctJykKKyAgICAgICAgICAgICAgIHN3aXRjaCAoKisrKmFyZ3YpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6IGJyZWFrOyAvKiAtZiBhc3N1bWVkICovCisgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOiBkb19zeW5jID0gMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICBpZiAoKmFyZ3YpCisgICAgICAgICAgICAgICB1c2FnZSgpOyAvKiBhbnkgYXJncyA9PSBlcnJvciAqLworCisgICAgICAgaWYgKGRvX3N5bmMpCisgICAgICAgICAgICAgICBzeW5jKCk7CisgICAgICAgcmVib290KExJTlVYX1JFQk9PVF9DTURfQ0FEX09GRik7IC8qIEVuYWJsZSBDVFJMK0FMVCtERUwgKi8KKyAgICAgICBpZiAoIXJlYm9vdChjbWQpKSB7CisgICAgICAgICAgICAgICAvKiBTdWNjZXNzLiBDdXJyZW50bHksIENNRF9IQUxUIHJldHVybnMsIHNvIHN0b3AgdGhlIHdvcmxkICovCisgICAgICAgICAgICAgICAvKiBraWxsKC0xLCBTSUdTVE9QKTsgKi8KKyAgICAgICAgICAgICAgIGtpbGwoZ2V0cGlkKCksIFNJR1NUT1ApOworICAgICAgIH0KKyAgICAgICB3cml0ZSgyLCAiZmFpbGVkLlxuIiwgOCk7CisgICAgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvaW5zbW9kLmMgYi91c3IvdXRpbHMvaW5zbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiNTg4MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9pbnNtb2QuYwpAQCAtMCwwICsxLDE0MCBAQAorLyogaW5zbW9kLmM6IGluc2VydCBhIG1vZHVsZSBpbnRvIHRoZSBrZXJuZWwuCisgICAgQ29weXJpZ2h0IChDKSAyMDAxICBSdXN0eSBSdXNzZWxsLgorICAgIENvcHlyaWdodCAoQykgMjAwMiAgUnVzdHkgUnVzc2VsbCwgSUJNIENvcnBvcmF0aW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgc3RyZXEoYSxiKSAoc3RyY21wKChhKSwoYikpID09IDApCisKKy8qIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGluIGEgaGVhZGVyIGZpbGUuLi4gKi8KK2V4dGVybiBsb25nIGluaXRfbW9kdWxlKHZvaWQgKiwgdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqKTsKKworc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgZmlsZW5hbWUgW2FyZ3NdXG4iLCBwcm9nbmFtZSk7CisJZXhpdCgxKTsKK30KKworLyogV2UgdXNlIGVycm9yIG51bWJlcnMgaW4gYSBsb29zZSB0cmFuc2xhdGlvbi4uLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVycm9yKGludCBlcnIpCit7CisJc3dpdGNoIChlcnIpIHsKKwljYXNlIEVOT0VYRUM6CisJCXJldHVybiAiSW52YWxpZCBtb2R1bGUgZm9ybWF0IjsKKwljYXNlIEVOT0VOVDoKKwkJcmV0dXJuICJVbmtub3duIHN5bWJvbCBpbiBtb2R1bGUiOworCWNhc2UgRVNSQ0g6CisJCXJldHVybiAiTW9kdWxlIGhhcyB3cm9uZyBzeW1ib2wgdmVyc2lvbiI7CisJY2FzZSBFSU5WQUw6CisJCXJldHVybiAiSW52YWxpZCBwYXJhbWV0ZXJzIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3RyZXJyb3IoZXJyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICpncmFiX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJdW5zaWduZWQgaW50IG1heCA9IDE2Mzg0OworCWludCByZXQsIGZkOworCXZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhtYXgpOworCisJaWYgKHN0cmVxKGZpbGVuYW1lLCAiLSIpKQorCQlmZCA9IGR1cChTVERJTl9GSUxFTk8pOworCWVsc2UKKwkJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSwgMCk7CisKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCSpzaXplID0gMDsKKwl3aGlsZSAoKHJldCA9IHJlYWQoZmQsIGJ1ZmZlciArICpzaXplLCBtYXggLSAqc2l6ZSkpID4gMCkgeworCQkqc2l6ZSArPSByZXQ7CisJCWlmICgqc2l6ZSA9PSBtYXgpCisJCQlidWZmZXIgPSByZWFsbG9jKGJ1ZmZlciwgbWF4ICo9IDIpOworCX0KKwlpZiAocmV0IDwgMCkgeworCQlmcmVlKGJ1ZmZlcik7CisJCWJ1ZmZlciA9IE5VTEw7CisJfQorCWNsb3NlKGZkKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpOworCWxvbmcgaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwl2b2lkICpmaWxlOworCWNoYXIgKmZpbGVuYW1lLCAqb3B0aW9ucyA9IHN0cmR1cCgiIik7CisJY2hhciAqcHJvZ25hbWUgPSBhcmd2WzBdOworCisJaWYgKGFyZ3ZbMV0gJiYgKHN0cmVxKGFyZ3ZbMV0sICItLXZlcnNpb24iKSB8fCBzdHJlcShhcmd2WzFdLCAiLVYiKSkpIHsKKwkJcHV0cygia2xpYmMgaW5zbW9kIik7CisJCWV4aXQoMCk7CisJfQorCisJLyogSWdub3JlIG9sZCBvcHRpb25zLCBmb3IgYmFja3dhcmRzIGNvbXBhdC4gKi8KKwl3aGlsZSAoYXJndlsxXSAmJiAoc3RyZXEoYXJndlsxXSwgIi1wIikKKwkJCSAgIHx8IHN0cmVxKGFyZ3ZbMV0sICItcyIpCisJCQkgICB8fCBzdHJlcShhcmd2WzFdLCAiLWYiKSkpIHsKKwkJYXJndisrOworCQlhcmdjLS07CisJfQorCisJZmlsZW5hbWUgPSBhcmd2WzFdOworCWlmICghZmlsZW5hbWUpCisJCXByaW50X3VzYWdlKHByb2duYW1lKTsKKworCS8qIFJlc3QgaXMgb3B0aW9ucyAqLworCWZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIHsKKwkJb3B0aW9ucyA9IHJlYWxsb2Mob3B0aW9ucywKKwkJCQkgIHN0cmxlbihvcHRpb25zKSArIDIgKyBzdHJsZW4oYXJndltpXSkgKyAyKTsKKwkJLyogU3BhY2VzIGhhbmRsZWQgYnkgIiIgcGFpcnMsIGJ1dCBubyB3YXkgb2YgZXNjYXBpbmcKKwkJICAgcXVvdGVzICovCisJCWlmIChzdHJjaHIoYXJndltpXSwgJyAnKSkKKwkJCXN0cmNhdChvcHRpb25zLCAiXCIiKTsKKwkJc3RyY2F0KG9wdGlvbnMsIGFyZ3ZbaV0pOworCQlpZiAoc3RyY2hyKGFyZ3ZbaV0sICcgJykpCisJCQlzdHJjYXQob3B0aW9ucywgIlwiIik7CisJCXN0cmNhdChvcHRpb25zLCAiICIpOworCX0KKworCWZpbGUgPSBncmFiX2ZpbGUoZmlsZW5hbWUsICZsZW4pOworCWlmICghZmlsZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImluc21vZDogY2FuJ3QgcmVhZCAnJXMnOiAlc1xuIiwKKwkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCXJldCA9IGluaXRfbW9kdWxlKGZpbGUsIGxlbiwgb3B0aW9ucyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW5zbW9kOiBlcnJvciBpbnNlcnRpbmcgJyVzJzogJWxpICVzXG4iLAorCQkJZmlsZW5hbWUsIHJldCwgbW9kZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9raWxsLmMgYi91c3IvdXRpbHMva2lsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjhmYWEKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMva2lsbC5jCkBAIC0wLDAgKzEsMzMgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitjaGFyICpwcm9nbmFtZTsKKworc3RhdGljIF9fbm9yZXR1cm4gdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBwaWRcbiIsIHByb2duYW1lKTsKKwlleGl0KDEpOworfQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqZW52cFtdKQoreworCWxvbmcgcGlkOworCWNoYXIgKmVuZHA7CisKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisJaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoKTsKKworCXBpZCA9IHN0cnRvbChhcmd2WzFdLCAmZW5kcCwgMTApOworCWlmICgqZW5kcCAhPSAnXDAnKSB7CisJCXBlcnJvcigicGlkIik7CisJCXVzYWdlKCk7CisJfQorCisJaWYgKGtpbGwocGlkLCBTSUdURVJNKSA9PSAtMSkgeworCQlwZXJyb3IoImtpbGwiKTsKKwkJZXhpdCgtMSk7CisJfQorCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbG4uYyBiL3Vzci91dGlscy9sbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjZlYjgKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbG4uYwpAQCAtMCwwICsxLDc3IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGMsIHMsIGY7CisJY2hhciAqcDsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKworCXMgPSBmID0gMDsKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgInNmIik7CisJCWlmIChjID09IEVPRikKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCisJCWNhc2UgJ3MnOgorCQkJcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlmID0gMTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgb3B0aW9uIC0lY1xuIiwKKwkJCQlhcmd2WzBdLCBvcHRvcHQpOworCQkJcmV0dXJuIDE7CisJCX0KKworCX0gd2hpbGUgKDEpOworCisJaWYgKG9wdGluZCA9PSBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstc10gWy1mXSB0YXJnZXQgbGlua1xuIiwgYXJndlswXSk7CisJCXJldHVybiAxOworCX0KKworCW1lbXNldCgmc2IsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdCkpOworCWlmIChzdGF0KGFyZ3ZbYXJnYyAtIDFdLCAmc2IpIDwgMCAmJiBhcmdjIC0gb3B0aW5kID4gMikgeworCQlpZiAoIShTX0lTRElSKHNiLnN0X21vZGUpKSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIm11bHRpcGxlIHRhcmdldHMgYW5kICVzIGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwKKwkJCQlhcmd2W2FyZ2MgLSAxXSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWZvciAoYyA9IG9wdGluZDsgYyA8IGFyZ2MgLSAxOyBjKyspIHsKKwkJY2hhciB0YXJnZXRbUEFUSF9NQVhdOworCisJCXAgPSBzdHJyY2hyKGFyZ3ZbY10sICcvJyk7CisJCXArKzsKKworCQlpZiAoU19JU0RJUihzYi5zdF9tb2RlKSkKKwkJCXNucHJpbnRmKHRhcmdldCwgUEFUSF9NQVgsICIlcy8lcyIsIGFyZ3ZbYXJnYyAtIDFdLCBwKTsKKwkJZWxzZQorCQkJc25wcmludGYodGFyZ2V0LCBQQVRIX01BWCwgIiVzIiwgYXJndlthcmdjIC0gMV0pOworCisJCWlmIChmKQorCQkJdW5saW5rKHRhcmdldCk7CisKKwkJaWYgKHMpIHsKKwkJCWlmIChzeW1saW5rKGFyZ3ZbY10sIHRhcmdldCkgPT0gLTEpCisJCQkJcGVycm9yKHRhcmdldCk7CisJCX0gZWxzZSB7CisJCQlpZiAobGluayhhcmd2W2NdLCB0YXJnZXQpID09IC0xKQorCQkJCXBlcnJvcih0YXJnZXQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbWluaXBzLmMgYi91c3IvdXRpbHMvbWluaXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiZjhiNgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9taW5pcHMuYwpAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4IGJ5IEFsYmVydCBDYWhhbGFuOyBhbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBmaWxlIG1heSBiZSB1c2VkIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIG9yIGFueSBsYXRlciB2ZXJzaW9uCisgKiBhdCB5b3VyIG9wdGlvbiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBUaGlzIGlzIGEgbWluaW1hbCAvYmluL3BzLCBkZXNpZ25lZCB0byBiZSBzbWFsbGVyIHRoYW4gdGhlIG9sZCBwcworICogd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBzb21lIG9mIHRoZSBtb3JlIGltcG9ydGFudCBmZWF0dXJlcyBvZiB0aGUKKyAqIG5ldyBwcy4gKGZvciB0b3RhbCBzaXplLCBub3RlIHRoYXQgdGhpcyBwcyBkb2VzIG5vdCBuZWVkIGxpYnByb2MpCisgKiBJdCBpcyBzdWl0YWJsZSBmb3IgTGludXgtb24tYS1mbG9wcHkgc3lzdGVtcyBvbmx5LgorICoKKyAqIE1haW50YWluZXJzOiBkbyBub3QgY29tcGlsZSBvciBpbnN0YWxsIGZvciBub3JtYWwgc3lzdGVtcy4KKyAqIEFueW9uZSBuZWVkaW5nIHRoaXMgd2lsbCB3YW50IHRvIHR3ZWFrIHRoZWlyIGNvbXBpbGVyIGFueXdheS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4JCS8qIEhaICovCisKK3N0YXRpYyBpbnQgUF9ldWlkOworc3RhdGljIGludCBQX3BpZDsKK3N0YXRpYyBjaGFyIFBfY21kWzE2XTsKK3N0YXRpYyBjaGFyIFBfc3RhdGU7CitzdGF0aWMgaW50IFBfcHBpZCwgUF9wZ3JwLCBQX3Nlc3Npb24sIFBfdHR5LCBQX3RwZ2lkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgUF9mbGFncywgUF9taW5fZmx0LCBQX2NtaW5fZmx0LCBQX21hal9mbHQsIFBfY21hal9mbHQsCisgICAgUF91dGltZSwgUF9zdGltZTsKK3N0YXRpYyBsb25nIFBfY3V0aW1lLCBQX2NzdGltZSwgUF9wcmlvcml0eSwgUF9uaWNlLCBQX3RpbWVvdXQsIFBfaXRfcmVhbF92YWx1ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBfc3RhcnRfdGltZSwgUF92c2l6ZTsKK3N0YXRpYyBsb25nIFBfcnNzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgUF9yc3NfcmxpbSwgUF9zdGFydF9jb2RlLCBQX2VuZF9jb2RlLCBQX3N0YXJ0X3N0YWNrLAorICAgIFBfa3N0a19lc3AsIFBfa3N0a19laXA7CitzdGF0aWMgdW5zaWduZWQgUF9zaWduYWwsIFBfYmxvY2tlZCwgUF9zaWdpZ25vcmUsIFBfc2lnY2F0Y2g7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBQX3djaGFuLCBQX25zd2FwLCBQX2Nuc3dhcDsKKworI2lmIDAKK3N0YXRpYyBpbnQgc2NyZWVuX2NvbHMgPSA4MDsKK3N0YXRpYyBpbnQgd19jb3VudDsKKyNlbmRpZgorCitzdGF0aWMgaW50IHdhbnRfb25lX3BpZDsKK3N0YXRpYyBjb25zdCBjaGFyICp3YW50X29uZV9jb21tYW5kOworc3RhdGljIGludCBzZWxlY3Rfbm90dHk7CitzdGF0aWMgaW50IHNlbGVjdF9hbGw7CisKK3N0YXRpYyBpbnQgcHNfZm9ybWF0Oworc3RhdGljIGludCBvbGRfaF9vcHRpb247CisKKy8qIHdlIG9ubHkgcHJldGVuZCB0byBzdXBwb3J0IHRoaXMgKi8KK3N0YXRpYyBpbnQgc2hvd19hcmdzOwkJLyogaW1wbGljaXQgd2l0aCAtZiBhbmQgYWxsIEJTRCBvcHRpb25zICovCitzdGF0aWMgaW50IGJzZF9jX29wdGlvbjsJLyogdGhpcyBvcHRpb24gb3ZlcnJpZGVzIHRoZSBhYm92ZSAqLworCitzdGF0aWMgaW50IHBzX2FyZ2M7CQkvKiBnbG9iYWwgYXJnYyAqLworc3RhdGljIGNoYXIgKipwc19hcmd2OwkJLyogZ2xvYmFsIGFyZ3YgKi8KK3N0YXRpYyBpbnQgdGhpc2FyZzsJCS8qIGluZGV4IGludG8gcHNfYXJndiAqLworc3RhdGljIGNoYXIgKmZsYWdwdHI7CQkvKiBjdXJyZW50IGxvY2F0aW9uIGluIHBzX2FyZ3ZbdGhpc2FyZ10gKi8KKworI2lmbmRlZiBIWgorI3dhcm5pbmcgSFogbm90IGRlZmluZWQsIGFzc3VtaW5nIGl0IGlzIDEwMAorI2RlZmluZSBIWiAxMDAKKyNlbmRpZgorCitpbnQgcGFnZV9zaGlmdDsJCQkvKiBQYWdlIHNpemUgYXMgc2hpZnQgY291bnQgKi8KKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIi1DICAgc2VsZWN0IGJ5IGNvbW1hbmQgbmFtZSAobWluaW1hbCBwcyBvbmx5IGFjY2VwdHMgb25lKVxuIgorCQkiLXAgICBzZWxlY3QgYnkgcHJvY2VzcyBJRCAobWluaW1hbCBwcyBvbmx5IGFjY2VwdHMgb25lKVxuIgorCQkiLWUgICBhbGwgcHJvY2Vzc2VzIChzYW1lIGFzIGF4KVxuIgorCQkiYSAgICBhbGwgcHJvY2Vzc2VzIHcvIHR0eSwgaW5jbHVkaW5nIG90aGVyIHVzZXJzXG4iCisJCSJ4ICAgIHByb2Nlc3NlcyB3L28gY29udHJvbGxpbmcgdHR5c1xuIgorCQkiLWYgICBmdWxsIGZvcm1hdFxuIgorCQkiLWosaiBqb2IgY29udHJvbCBmb3JtYXRcbiIKKwkJInYgICAgdmlydHVhbCBtZW1vcnkgZm9ybWF0XG4iCisJCSItbCxsIGxvbmcgZm9ybWF0XG4iCisJCSJ1ICAgIHVzZXItb3JpZW50ZWQgZm9ybWF0XG4iCisJCSItbyAgIHVzZXItZGVmaW5lZCBmb3JtYXQgKGxpbWl0ZWQgc3VwcG9ydCwgb25seSBcInBzIC1vIHBpZD1cIilcbiIKKwkJImggICAgbm8gaGVhZGVyXG4iCisvKgorICAgICItQSAgIGFsbCBwcm9jZXNzZXMgKHNhbWUgYXMgYXgpXG4iCisgICAgImMgICAgdHJ1ZSBjb21tYW5kIG5hbWVcbiIKKyAgICAiLXcsdyB3aWRlIG91dHB1dFxuIgorKi8KKwkgICAgKTsKKwlleGl0KDEpOworfQorCisvKgorICogUmV0dXJuIHRoZSBuZXh0IGFyZ3VtZW50LCBvciBjYWxsIHRoZSB1c2FnZSBmdW5jdGlvbi4KKyAqIFRoaXMgaGFuZGxlcyBib3RoOiAgIC1vRk9PICAgLW8gRk9PCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfb3B0X2FyZyh2b2lkKQoreworCWNvbnN0IGNoYXIgKnJldDsKKwlyZXQgPSBmbGFncHRyICsgMTsJLyogYXNzdW1lIGFyZ3VtZW50IGlzIHBhcnQgb2YgcHNfYXJndlt0aGlzYXJnXSAqLworCWlmICgqcmV0KQorCQlyZXR1cm4gcmV0OworCWlmICgrK3RoaXNhcmcgPj0gcHNfYXJnYykKKwkJdXNhZ2UoKTsJLyogdGhlcmUgaXMgbm90aGluZyBsZWZ0ICovCisJLyogYXJndW1lbnQgaXMgdGhlIG5ldyBwc19hcmd2W3RoaXNhcmddICovCisJcmV0ID0gcHNfYXJndlt0aGlzYXJnXTsKKwlpZiAoIXJldCB8fCAhKnJldCkKKwkJdXNhZ2UoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiByZXR1cm4gdGhlIFBJRCwgb3IgMCBpZiBub3RoaW5nIGdvb2QgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3BpZChjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqZW5kcDsKKwlpbnQgbnVtOworCWlmICghc3RyKQorCQlnb3RvIGJhZDsKKwludW0gPSBzdHJ0b2woc3RyLCAmZW5kcCwgMCk7CisJaWYgKCplbmRwICE9ICdcMCcpCisJCWdvdG8gYmFkOworCWlmIChudW0gPCAxKQorCQlnb3RvIGJhZDsKKwlpZiAod2FudF9vbmVfcGlkKQorCQlnb3RvIGJhZDsKKwl3YW50X29uZV9waWQgPSBudW07CisJcmV0dXJuOworICAgICAgYmFkOgorCXVzYWdlKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKiBwYXJzZSBTeXNWIG9wdGlvbnMsIGluY2x1ZGluZyBVbml4OTggICoqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGFyc2Vfc3lzdl9vcHRpb24odm9pZCkKK3sKKwlkbyB7CisJCXN3aXRjaCAoKmZsYWdwdHIpIHsKKyAgICAvKioqKiBzZWxlY3Rpb24gKioqKi8KKwkJY2FzZSAnQyc6CS8qIGVuZCAqLworCQkJaWYgKHdhbnRfb25lX2NvbW1hbmQpCisJCQkJdXNhZ2UoKTsKKwkJCXdhbnRfb25lX2NvbW1hbmQgPSBnZXRfb3B0X2FyZygpOworCQkJcmV0dXJuOwkvKiBjYW4ndCBoYXZlIGFueSBtb3JlIG9wdGlvbnMgKi8KKwkJY2FzZSAncCc6CS8qIGVuZCAqLworCQkJcGFyc2VfcGlkKGdldF9vcHRfYXJnKCkpOworCQkJcmV0dXJuOwkvKiBjYW4ndCBoYXZlIGFueSBtb3JlIG9wdGlvbnMgKi8KKwkJY2FzZSAnQSc6CisJCWNhc2UgJ2UnOgorCQkJc2VsZWN0X2FsbCsrOworCQkJc2VsZWN0X25vdHR5Kys7CisJCWNhc2UgJ3cnOgkvKiBoZXJlIGZvciBub3csIHNpbmNlIHRoZSByZWFsIG9uZSBpcyBub3QgdXNlZCAqLworCQkJYnJlYWs7CisgICAgLyoqKiogb3V0cHV0IGZvcm1hdCAqKioqLworCQljYXNlICdmJzoKKwkJCXNob3dfYXJncyA9IDE7CisJCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwkJY2FzZSAnaic6CisJCWNhc2UgJ2wnOgorCQkJaWYgKHBzX2Zvcm1hdCkKKwkJCQl1c2FnZSgpOworCQkJcHNfZm9ybWF0ID0gKmZsYWdwdHI7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CS8qIGVuZCAqLworCQkJLyogV2Ugb25seSBzdXBwb3J0IGEgbGltaXRlZCBmb3JtOiAicHMgLW8gcGlkPSIgICh5ZXMsIGp1c3QgInBpZD0iKSAqLworCQkJaWYgKHN0cmNtcChnZXRfb3B0X2FyZygpLCAicGlkPSIpKQorCQkJCXVzYWdlKCk7CisJCQlpZiAocHNfZm9ybWF0KQorCQkJCXVzYWdlKCk7CisJCQlwc19mb3JtYXQgPSAnbyc7CisJCQlvbGRfaF9vcHRpb24rKzsKKwkJCXJldHVybjsJLyogY2FuJ3QgaGF2ZSBhbnkgbW9yZSBvcHRpb25zICovCisgICAgLyoqKiogb3RoZXIgc3R1ZmYgKioqKi8KKyNpZiAwCisJCWNhc2UgJ3cnOgorCQkJd19jb3VudCsrOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0JCS8qIHN3aXRjaCAqLworCX0gd2hpbGUgKCorK2ZsYWdwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBwYXJzZSBCU0Qgb3B0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGFyc2VfYnNkX29wdGlvbih2b2lkKQoreworCWRvIHsKKwkJc3dpdGNoICgqZmxhZ3B0cikgeworICAgIC8qKioqIHNlbGVjdGlvbiAqKioqLworCQljYXNlICdhJzoKKwkJCXNlbGVjdF9hbGwrKzsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCXNlbGVjdF9ub3R0eSsrOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgkvKiBlbmQgKi8KKwkJCXBhcnNlX3BpZChnZXRfb3B0X2FyZygpKTsKKwkJCXJldHVybjsJLyogY2FuJ3QgaGF2ZSBhbnkgbW9yZSBvcHRpb25zICovCisgICAgLyoqKiogb3V0cHV0IGZvcm1hdCAqKioqLworCQljYXNlICdqJzoKKwkJY2FzZSAnbCc6CisJCWNhc2UgJ3UnOgorCQljYXNlICd2JzoKKwkJCWlmIChwc19mb3JtYXQpCisJCQkJdXNhZ2UoKTsKKwkJCXBzX2Zvcm1hdCA9IDB4ODAgfCAqZmxhZ3B0cjsJLyogdXNlIDB4ODAgdG8gdGVsbCBCU0QgZnJvbSBTeXNWICovCisJCQlicmVhazsKKyAgICAvKioqKiBvdGhlciBzdHVmZiAqKioqLworCQljYXNlICdjJzoKKwkJCWJzZF9jX29wdGlvbisrOworI2lmIDAKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgJ3cnOgorI2lmIDAKKwkJCXdfY291bnQrKzsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJb2xkX2hfb3B0aW9uKys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0JCS8qIHN3aXRjaCAqLworCX0gd2hpbGUgKCorK2ZsYWdwdHIpOworfQorCisjaWYgMAorLyogbm90IHVzZWQgeWV0ICovCitzdGF0aWMgdm9pZCBjaG9vc2VfZGltZW5zaW9ucyh2b2lkKQoreworCXN0cnVjdCB3aW5zaXplIHdzOworCWNoYXIgKmNvbHVtbnM7CisJLyogc2NyZWVuX2NvbHMgaXMgODAgYnkgZGVmYXVsdCAqLworCWlmIChpb2N0bCgxLCBUSU9DR1dJTlNaLCAmd3MpICE9IC0xICYmIHdzLndzX2NvbCA+IDMwKQorCQlzY3JlZW5fY29scyA9IHdzLndzX2NvbDsKKwljb2x1bW5zID0gZ2V0ZW52KCJDT0xVTU5TIik7CisJaWYgKGNvbHVtbnMgJiYgKmNvbHVtbnMpIHsKKwkJbG9uZyB0OworCQljaGFyICplbmRwdHI7CisJCXQgPSBzdHJ0b2woY29sdW1ucywgJmVuZHB0ciwgMCk7CisJCWlmICghKmVuZHB0ciAmJiAodCA+IDMwKSAmJiAodCA8IChsb25nKTk5OTk5OTk5OSkpCisJCQlzY3JlZW5fY29scyA9IChpbnQpdDsKKwl9CisJaWYgKHdfY291bnQgJiYgKHNjcmVlbl9jb2xzIDwgMTMyKSkKKwkJc2NyZWVuX2NvbHMgPSAxMzI7CisJaWYgKHdfY291bnQgPiAxKQorCQlzY3JlZW5fY29scyA9IDk5OTk5OTk5OTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhcmdfcGFyc2UoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgc2VsID0gMDsJCS8qIHRvIHZlcmlmeSBvcHRpb24gc2FuaXR5ICovCisJcHNfYXJnYyA9IGFyZ2M7CisJcHNfYXJndiA9IGFyZ3Y7CisJdGhpc2FyZyA9IDA7CisgIC8qKioqIGl0ZXJhdGUgb3ZlciB0aGUgYXJncyAqKioqLworCXdoaWxlICgrK3RoaXNhcmcgPCBwc19hcmdjKSB7CisJCWZsYWdwdHIgPSBwc19hcmd2W3RoaXNhcmddOworCQlzd2l0Y2ggKCpmbGFncHRyKSB7CisJCWNhc2UgJzAnLi4uJzknOgorCQkJc2hvd19hcmdzID0gMTsKKwkJCXBhcnNlX3BpZChmbGFncHRyKTsKKwkJCWJyZWFrOworCQljYXNlICctJzoKKwkJCWZsYWdwdHIrKzsKKwkJCXBhcnNlX3N5c3Zfb3B0aW9uKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNob3dfYXJncyA9IDE7CisJCQlwYXJzZV9ic2Rfb3B0aW9uKCk7CisJCQlicmVhazsKKwkJfQorCX0KKyAgLyoqKiogc2FuaXR5IGNoZWNrIGFuZCBjbGVhbi11cCAqKioqLworCWlmICh3YW50X29uZV9waWQpCisJCXNlbCsrOworCWlmICh3YW50X29uZV9jb21tYW5kKQorCQlzZWwrKzsKKwlpZiAoc2VsZWN0X25vdHR5IHx8IHNlbGVjdF9hbGwpCisJCXNlbCsrOworCWlmIChzZWwgPiAxIHx8IHNlbGVjdF9ub3R0eSA+IDEgfHwgc2VsZWN0X2FsbCA+IDEgfHwgYnNkX2Nfb3B0aW9uID4gMQorCSAgICB8fCBvbGRfaF9vcHRpb24gPiAxKQorCQl1c2FnZSgpOworCWlmIChic2RfY19vcHRpb24pCisJCXNob3dfYXJncyA9IDA7Cit9CisKKy8qIHJldHVybiAxIGlmIGl0IHdvcmtzLCBvciAwIGZvciBmYWlsdXJlICovCitzdGF0aWMgaW50IHN0YXQycHJvYyhpbnQgcGlkKQoreworCWNoYXIgYnVmWzgwMF07CQkvKiBhYm91dCA0MCBmaWVsZHMsIDY0LWJpdCBkZWNpbWFsIGlzIGFib3V0IDIwIGNoYXJzICovCisJaW50IG51bTsKKwlpbnQgZmQ7CisJY2hhciAqdG1wOworCXN0cnVjdCBzdGF0IHNiOwkJLyogc3RhdCgpIHVzZWQgdG8gZ2V0IEVVSUQgKi8KKwlzbnByaW50ZihidWYsIDMyLCAiL3Byb2MvJWQvc3RhdCIsIHBpZCk7CisJaWYgKChmZCA9IG9wZW4oYnVmLCBPX1JET05MWSwgMCkpID09IC0xKQorCQlyZXR1cm4gMDsKKwludW0gPSByZWFkKGZkLCBidWYsIHNpemVvZiBidWYgLSAxKTsKKwlmc3RhdChmZCwgJnNiKTsKKwlQX2V1aWQgPSBzYi5zdF91aWQ7CisJY2xvc2UoZmQpOworCWlmIChudW0gPCA4MCkKKwkJcmV0dXJuIDA7CisJYnVmW251bV0gPSAnXDAnOworCXRtcCA9IHN0cnJjaHIoYnVmLCAnKScpOwkvKiBzcGxpdCBpbnRvICJQSUQgKGNtZCIgYW5kICI8cmVzdD4iICovCisJKnRtcCA9ICdcMCc7CQkvKiByZXBsYWNlIHRyYWlsaW5nICcpJyB3aXRoIE5VTCAqLworCS8qIHBhcnNlIHRoZXNlIHR3byBzdHJpbmdzIHNlcGFyYXRlbHksIHNraXBwaW5nIHRoZSBsZWFkaW5nICIoIi4gKi8KKwltZW1zZXQoUF9jbWQsIDAsIHNpemVvZiBQX2NtZCk7CS8qIGNsZWFyICovCisJc3NjYW5mKGJ1ZiwgIiVkICglMTVjIiwgJlBfcGlkLCBQX2NtZCk7CS8qIGNvbW1bMTZdIGluIGtlcm5lbCAqLworCW51bSA9IHNzY2FuZih0bXAgKyAyLAkvKiBza2lwIHNwYWNlIGFmdGVyICcpJyB0b28gKi8KKwkJICAgICAiJWMgIiAiJWQgJWQgJWQgJWQgJWQgIiAiJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICIgIiVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICIgIiVsdSAlbHUgIiAiJWxkICIgIiVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICIgIiV1ICV1ICV1ICV1ICIJLyogbm8gdXNlIGZvciBSVCBzaWduYWxzICovCisJCSAgICAgIiVsdSAlbHUgJWx1IiwKKwkJICAgICAmUF9zdGF0ZSwKKwkJICAgICAmUF9wcGlkLCAmUF9wZ3JwLCAmUF9zZXNzaW9uLCAmUF90dHksICZQX3RwZ2lkLAorCQkgICAgICZQX2ZsYWdzLCAmUF9taW5fZmx0LCAmUF9jbWluX2ZsdCwgJlBfbWFqX2ZsdCwgJlBfY21hal9mbHQsCisJCSAgICAgJlBfdXRpbWUsICZQX3N0aW1lLCAmUF9jdXRpbWUsICZQX2NzdGltZSwgJlBfcHJpb3JpdHksCisJCSAgICAgJlBfbmljZSwgJlBfdGltZW91dCwgJlBfaXRfcmVhbF92YWx1ZSwgJlBfc3RhcnRfdGltZSwKKwkJICAgICAmUF92c2l6ZSwgJlBfcnNzLCAmUF9yc3NfcmxpbSwgJlBfc3RhcnRfY29kZSwgJlBfZW5kX2NvZGUsCisJCSAgICAgJlBfc3RhcnRfc3RhY2ssICZQX2tzdGtfZXNwLCAmUF9rc3RrX2VpcCwgJlBfc2lnbmFsLAorCQkgICAgICZQX2Jsb2NrZWQsICZQX3NpZ2lnbm9yZSwgJlBfc2lnY2F0Y2gsICZQX3djaGFuLCAmUF9uc3dhcCwKKwkJICAgICAmUF9jbnN3YXApOworLyogICAgZnByaW50ZihzdGRlcnIsICJzdGF0MnByb2MgY29udmVydGVkICVkIGZpZWxkcy5cbiIsbnVtKTsgKi8KKwlQX3ZzaXplIC89IDEwMjQ7CisJUF9yc3MgPDw9IHBhZ2Vfc2hpZnQgLSAxMDsKKwlpZiAobnVtIDwgMzApCisJCXJldHVybiAwOworCWlmIChQX3BpZCAhPSBwaWQpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZG9fdGltZSh1bnNpZ25lZCBsb25nIHQpCit7CisJaW50IGhoLCBtbSwgc3M7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKwlpbnQgY250ID0gMDsKKwl0IC89IEhaOworCXNzID0gdCAlIDYwOworCXQgLz0gNjA7CisJbW0gPSB0ICUgNjA7CisJdCAvPSA2MDsKKwloaCA9IHQgJSAyNDsKKwl0IC89IDI0OworCWlmICh0KQorCQljbnQgPSBzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZC0iLCAoaW50KXQpOworCXNucHJpbnRmKGNudCArIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSBjbnQsICIlMDJkOiUwMmQ6JTAyZCIsIGhoLCBtbSwgc3MpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3Byb2Modm9pZCkKK3sKKwljaGFyIHR0eVsxNl07CisJc25wcmludGYodHR5LCBzaXplb2YgdHR5LCAiJTNkLCUtM2QiLCAoUF90dHkgPj4gOCkgJiAweGZmLAorCQkgUF90dHkgJiAweGZmKTsKKwlzd2l0Y2ggKHBzX2Zvcm1hdCkgeworCWNhc2UgMDoKKwkJcHJpbnRmKCIlNWQgJXMgJXMiLCBQX3BpZCwgdHR5LCBkb190aW1lKFBfdXRpbWUgKyBQX3N0aW1lKSk7CisJCWJyZWFrOworCWNhc2UgJ28nOgorCQlwcmludGYoIiVkXG4iLCBQX3BpZCk7CisJCXJldHVybjsJCS8qIGRvbid0IHdhbnQgdGhlIGNvbW1hbmQgKi8KKwljYXNlICdsJzoKKwkJcHJpbnRmKCIlMDN4ICVjICU1ZCAlNWQgJTVkICAtICUzZCAlM2QgLSAiCisJCSAgICAgICAiJTVsZCAlMDZ4ICVzICVzIiwKKwkJICAgICAgICh1bnNpZ25lZClQX2ZsYWdzICYgMHg3NzcsIFBfc3RhdGUsIFBfZXVpZCwgUF9waWQsCisJCSAgICAgICBQX3BwaWQsIChpbnQpUF9wcmlvcml0eSwgKGludClQX25pY2UsCisJCSAgICAgICBQX3ZzaXplID4+IChwYWdlX3NoaWZ0IC0gMTApLAorCQkgICAgICAgKHVuc2lnbmVkKShQX3djaGFuICYgMHhmZmZmZmYpLCB0dHksCisJCSAgICAgICBkb190aW1lKFBfdXRpbWUgKyBQX3N0aW1lKQorCQkgICAgKTsKKwkJYnJlYWs7CisJY2FzZSAnZic6CisJCXByaW50ZigiJTVkICU1ZCAlNWQgIC0gICAtICAgJXMgJXMiLAorCQkgICAgICAgUF9ldWlkLCBQX3BpZCwgUF9wcGlkLCB0dHksIGRvX3RpbWUoUF91dGltZSArIFBfc3RpbWUpCisJCSAgICApOworCQlicmVhazsKKwljYXNlICdqJzoKKwkJcHJpbnRmKCIlNWQgJTVkICU1ZCAlcyAlcyIsCisJCSAgICAgICBQX3BpZCwgUF9wZ3JwLCBQX3Nlc3Npb24sIHR0eSwgZG9fdGltZShQX3V0aW1lICsgUF9zdGltZSkKKwkJICAgICk7CisJCWJyZWFrOworCWNhc2UgJ3UnIHwgMHg4MDoKKwkJcHJpbnRmKCIlNWQgJTVkICAgIC0gICAgLSAlNWxkICU1bGQgJXMgJWMgICAtICAgJXMiLAorCQkgICAgICAgUF9ldWlkLCBQX3BpZCwgUF92c2l6ZSwgUF9yc3MsIHR0eSwgUF9zdGF0ZSwKKwkJICAgICAgIGRvX3RpbWUoUF91dGltZSArIFBfc3RpbWUpCisJCSAgICApOworCQlicmVhazsKKwljYXNlICd2JyB8IDB4ODA6CisJCXByaW50ZigiJTVkICVzICVjICVzICU2ZCAgIC0gICAtICU1ZCAgICAtIiwKKwkJICAgICAgIFBfcGlkLCB0dHksIFBfc3RhdGUsIGRvX3RpbWUoUF91dGltZSArIFBfc3RpbWUpLAorCQkgICAgICAgKGludClQX21hal9mbHQsIChpbnQpUF9yc3MpOworCQlicmVhazsKKwljYXNlICdqJyB8IDB4ODA6CisJCXByaW50ZigiJTVkICU1ZCAlNWQgJTVkICVzICU1ZCAlYyAlNWQgJXMiLAorCQkgICAgICAgUF9wcGlkLCBQX3BpZCwgUF9wZ3JwLCBQX3Nlc3Npb24sIHR0eSwgUF90cGdpZCwgUF9zdGF0ZSwKKwkJICAgICAgIFBfZXVpZCwgZG9fdGltZShQX3V0aW1lICsgUF9zdGltZSkKKwkJICAgICk7CisJCWJyZWFrOworCWNhc2UgJ2wnIHwgMHg4MDoKKwkJcHJpbnRmKCIlMDN4ICU1ZCAlNWQgJTVkICUzZCAlM2QgIgorCQkgICAgICAgIiU1bGQgJTRsZCAlMDZ4ICVjICVzICVzIiwKKwkJICAgICAgICh1bnNpZ25lZClQX2ZsYWdzICYgMHg3NzcsIFBfZXVpZCwgUF9waWQsIFBfcHBpZCwKKwkJICAgICAgIChpbnQpUF9wcmlvcml0eSwgKGludClQX25pY2UsIFBfdnNpemUsIFBfcnNzLAorCQkgICAgICAgKHVuc2lnbmVkKShQX3djaGFuICYgMHhmZmZmZmYpLCBQX3N0YXRlLCB0dHksCisJCSAgICAgICBkb190aW1lKFBfdXRpbWUgKyBQX3N0aW1lKQorCQkgICAgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChzaG93X2FyZ3MpCisJCXByaW50ZigiIFslc11cbiIsIFBfY21kKTsKKwllbHNlCisJCXByaW50ZigiICVzXG4iLCBQX2NtZCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJYXJnX3BhcnNlKGFyZ2MsIGFyZ3YpOworCisJcGFnZV9zaGlmdCA9IF9fZ2V0cGFnZXNoaWZ0KCk7CisKKyNpZiAwCisJY2hvb3NlX2RpbWVuc2lvbnMoKTsKKyNlbmRpZgorCWlmICghb2xkX2hfb3B0aW9uKSB7CisJCWNvbnN0IGNoYXIgKmhlYWQ7CisJCXN3aXRjaCAocHNfZm9ybWF0KSB7CisJCWRlZmF1bHQ6CS8qIGNhbid0IGhhcHBlbiAqLworCQljYXNlIDA6CisJCQloZWFkID0gIiAgUElEIFRUWSAgICAgICAgIFRJTUUgQ01EIjsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWhlYWQgPQorCQkJICAgICIgIEYgUyAgIFVJRCAgIFBJRCAgUFBJRCAgQyBQUkkgIE5JIEFERFIgU1ogV0NIQU4gICAgVFRZICAgICAgIFRJTUUgQ01EIjsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWhlYWQgPQorCQkJICAgICIgIFVJRCAgIFBJRCAgUFBJRCAgQyBTVElNRSAgIFRUWSAgICAgICBUSU1FIENNRCI7CisJCQlicmVhazsKKwkJY2FzZSAnaic6CisJCQloZWFkID0gIiAgUElEICBQR0lEICAgU0lEIFRUWSAgICAgICAgIFRJTUUgQ01EIjsKKwkJCWJyZWFrOworCQljYXNlICd1JyB8IDB4ODA6CisJCQloZWFkID0KKwkJCSAgICAiICBVSUQgICBQSUQgJUNQVSAlTUVNICAgVlNaICAgUlNTICAgVFRZICAgUyBTVEFSVCAgICAgVElNRSBDT01NQU5EIjsKKwkJCWJyZWFrOworCQljYXNlICd2JyB8IDB4ODA6CisJCQloZWFkID0KKwkJCSAgICAiICBQSUQgICBUVFkgICBTICAgICBUSU1FICBNQUpGTCBUUlMgRFJTICAgUlNTICVNRU0gQ09NTUFORCI7CisJCQlicmVhazsKKwkJY2FzZSAnaicgfCAweDgwOgorCQkJaGVhZCA9CisJCQkgICAgIiBQUElEICAgUElEICBQR0lEICAgU0lEICAgVFRZICAgVFBHSUQgUyAgIFVJRCAgICAgVElNRSBDT01NQU5EIjsKKwkJCWJyZWFrOworCQljYXNlICdsJyB8IDB4ODA6CisJCQloZWFkID0KKwkJCSAgICAiICBGICAgVUlEICAgUElEICBQUElEIFBSSSAgTkkgICBWU1ogIFJTUyBXQ0hBTiAgUyAgIFRUWSAgICAgICBUSU1FIENPTU1BTkQiOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCIlc1xuIiwgaGVhZCk7CisJfQorCWlmICh3YW50X29uZV9waWQpIHsKKwkJaWYgKHN0YXQycHJvYyh3YW50X29uZV9waWQpKQorCQkJcHJpbnRfcHJvYygpOworCQllbHNlCisJCQlleGl0KDEpOworCX0gZWxzZSB7CisJCXN0cnVjdCBkaXJlbnQgKmVudDsJLyogZGlyZW50IGhhbmRsZSAqLworCQlESVIgKmRpcjsKKwkJaW50IG91cnVpZDsKKwkJaW50IGZvdW5kX2FfcHJvYzsKKwkJZm91bmRfYV9wcm9jID0gMDsKKwkJb3VydWlkID0gZ2V0dWlkKCk7CisJCWRpciA9IG9wZW5kaXIoIi9wcm9jIik7CisJCWlmICghZGlyKQorCQkJZXhpdCgxKTsKKwkJd2hpbGUgKChlbnQgPSByZWFkZGlyKGRpcikpKSB7CisJCQlpZiAoKmVudC0+ZF9uYW1lIDwgJzAnIHx8ICplbnQtPmRfbmFtZSA+ICc5JykKKwkJCQljb250aW51ZTsKKwkJCWlmICghc3RhdDJwcm9jKGF0b2koZW50LT5kX25hbWUpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh3YW50X29uZV9jb21tYW5kKSB7CisJCQkJaWYgKHN0cmNtcCh3YW50X29uZV9jb21tYW5kLCBQX2NtZCkpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXNlbGVjdF9ub3R0eSAmJiBQX3R0eSA9PSAtMSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKCFzZWxlY3RfYWxsICYmIFBfZXVpZCAhPSBvdXJ1aWQpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZm91bmRfYV9wcm9jKys7CisJCQlwcmludF9wcm9jKCk7CisJCX0KKwkJY2xvc2VkaXIoZGlyKTsKKwkJZXhpdCghZm91bmRfYV9wcm9jKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbWtkaXIuYyBiL3Vzci91dGlscy9ta2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjQxZWYKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbWtkaXIuYwpAQCAtMCwwICsxLDE1NCBAQAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJmaWxlX21vZGUuaCIKKworc3RhdGljIG1vZGVfdCBsZWFmX21vZGUsIHN1YmRpcl9tb2RlOworc3RhdGljIGludCBwX2ZsYWc7CisKK2NoYXIgKnByb2duYW1lOworCitzdGF0aWMgX19ub3JldHVybiB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstcF0gWy1tIG1vZGVdIGRpci4uLlxuIiwgcHJvZ25hbWUpOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9vbmVfZGlyKGNoYXIgKmRpciwgbW9kZV90IG1vZGUpCit7CisJc3RydWN0IHN0YXQgc3RidWY7CisKKwlpZiAobWtkaXIoZGlyLCBtb2RlKSA9PSAtMSkgeworCQlpbnQgZXJyID0gZXJybm87CisKKwkJLyoKKwkJICogSWdub3JlIHRoZSBlcnJvciBpZiBpdCBhbGwgb2YgdGhlIGZvbGxvd2luZworCQkgKiBhcmUgc2F0aXNmaWVkOgorCQkgKiAgLSBlcnJvciB3YXMgRUVYSVNUCisJCSAqICAtIC1wIHdhcyBzcGVjaWZpZWQKKwkJICogIC0gc3RhdCBpbmRpY2F0ZXMgdGhhdCBpdHMgYSBkaXJlY3RvcnkKKwkJICovCisJCWlmIChwX2ZsYWcgJiYgZXJybm8gPT0gRUVYSVNUICYmCisJCSAgICBzdGF0KGRpciwgJnN0YnVmKSA9PSAwICYmIFNfSVNESVIoc3RidWYuc3RfbW9kZSkpCisJCQlyZXR1cm4gMTsKKwkJZXJybm8gPSBlcnI7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKKwkJcGVycm9yKGRpcik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9kaXIoY2hhciAqZGlyKQoreworCWludCByZXQ7CisKKwlpZiAocF9mbGFnKSB7CisJCWNoYXIgKnMsICpwOworCisJCS8qCisJCSAqIFJlY3Vyc2UgZWFjaCBkaXJlY3RvcnksIHRyeWluZyB0byBtYWtlIGl0CisJCSAqIGFzIHdlIGdvLiAgU2hvdWxkIHdlIGNoZWNrIHRvIHNlZSBpZiBpdAorCQkgKiBleGlzdHMsIGFuZCBpZiBzbyBpZiBpdCdzIGEgZGlyZWN0b3J5CisJCSAqIGJlZm9yZSBjYWxsaW5nIG1rZGlyPworCQkgKi8KKwkJcyA9IGRpcjsKKwkJd2hpbGUgKChwID0gc3RyY2hyKHMsICcvJykpICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBJZ25vcmUgdGhlIGxlYWRpbmcgLworCQkJICovCisJCQlpZiAocCAhPSBkaXIpIHsKKwkJCQkqcCA9ICdcMCc7CisKKwkJCQkvKgorCQkJCSAqIE1ha2UgdGhlIGludGVybWVkaWFyeSBkaXJlY3RvcnkuICBQT1NJWAorCQkJCSAqIHNheXMgdGhhdCB0aGVzZSBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZAorCQkJCSAqIHdpdGggdW1hc2ssdSt3eAorCQkJCSAqLworCQkJCWlmIChtYWtlX29uZV9kaXIoZGlyLCBzdWJkaXJfbW9kZSkgPT0gLTEpCisJCQkJCXJldHVybiAtMTsKKworCQkJCSpwID0gJy8nOworCQkJfQorCQkJcyA9IHAgKyAxOworCQl9CisJfQorCisJLyoKKwkgKiBNYWtlIHRoZSBmaW5hbCB0YXJnZXQuICBPbmx5IGNvbXBsYWluIGlmIHRoZQorCSAqIHRhcmdldCBhbHJlYWR5IGV4aXN0cyBpZiAtcCB3YXMgbm90IHNwZWNpZmllZC4KKwkgKiBUaGlzIGlzIGNyZWF0ZWQgd2l0aCB0aGUgYXNrZWQgZm9yIG1vZGUgJiB+dW1hc2sKKwkgKi8KKwlyZXQgPSBtYWtlX29uZV9kaXIoZGlyLCBsZWFmX21vZGUpOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKworCS8qCisJICogV2UgbWlnaHQgbm90IHNldCBhbGwgdGhlIHBlcm1pc3Npb24gYml0cy4gIERvIHRoYXQKKwkgKiBoZXJlIChidXQgb25seSBpZiB3ZSBkaWQgY3JlYXRlIGl0LikKKwkgKi8KKwlpZiAocmV0ID09IDAgJiYgY2htb2QoZGlyLCBsZWFmX21vZGUpID09IC0xKSB7CisJCWludCBlcnJfc2F2ZSA9IGVycm5vOworCisJCS8qCisJCSAqIFdlIGZhaWxlZCwgcmVtb3ZlIHRoZSBkaXJlY3Rvcnkgd2UgY3JlYXRlZAorCQkgKi8KKwkJcm1kaXIoZGlyKTsKKwkJZXJybm8gPSBlcnJfc2F2ZTsKKwkJZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ25hbWUpOworCQlwZXJyb3IoZGlyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgYywgcmV0ID0gMDsKKwltb2RlX3Qgc2F2ZWRfdW1hc2s7CisKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKwlzYXZlZF91bWFzayA9IHVtYXNrKDApOworCWxlYWZfbW9kZSA9IChTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pICYgfnNhdmVkX3VtYXNrOworCXN1YmRpcl9tb2RlID0gKHNhdmVkX3VtYXNrIF4gKFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykpCisJICAgIHwgU19JV1VTUiB8IFNfSVhVU1I7CisKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgInBtOiIpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ20nOgorCQkJbGVhZl9tb2RlID0KKwkJCSAgICBwYXJzZV9maWxlX21vZGUob3B0YXJnLCBsZWFmX21vZGUsIHNhdmVkX3VtYXNrKTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXBfZmxhZyA9IDE7CisJCQlicmVhazsKKworCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgb3B0aW9uIC0lY1xuIiwKKwkJCQlwcm9nbmFtZSwgb3B0b3B0KTsKKwkJCXVzYWdlKCk7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmIChvcHRpbmQgPT0gYXJnYykKKwkJdXNhZ2UoKTsKKworCXdoaWxlIChvcHRpbmQgPCBhcmdjKSB7CisJCWlmIChtYWtlX2Rpcihhcmd2W29wdGluZF0pKQorCQkJcmV0ID0gMjU1OwkvKiBzZWVtcyB0byBiZSB3aGF0IGdudSBta2RpciBkb2VzICovCisJCW9wdGluZCsrOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvbWtmaWZvLmMgYi91c3IvdXRpbHMvbWtmaWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhYzM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9ta2ZpZm8uYwpAQCAtMCwwICsxLDcxIEBACisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImZpbGVfbW9kZS5oIgorCitzdGF0aWMgbW9kZV90IGxlYWZfbW9kZTsKKworY2hhciAqcHJvZ25hbWU7CisKK3N0YXRpYyBpbnQgbWFrZV9maWZvKGNoYXIgKmRpcikKK3sKKwlpZiAobWtmaWZvKGRpciwgbGVhZl9tb2RlKSkgeworCQkvKgorCQkgKiBXZSBmYWlsZWQsIHJlbW92ZSB0aGUgZGlyZWN0b3J5IHdlIGNyZWF0ZWQuCisJCSAqLworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisJCXBlcnJvcihkaXIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjLCByZXQgPSAwOworCW1vZGVfdCBzYXZlZF91bWFzazsKKworCXByb2duYW1lID0gYXJndlswXTsKKworCXNhdmVkX3VtYXNrID0gdW1hc2soMCk7CisJbGVhZl9tb2RlID0KKwkgICAgKFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lST1RIIHwgU19JV09USCkgJgorCSAgICB+c2F2ZWRfdW1hc2s7CisKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgIm06Iik7CisJCWlmIChjID09IEVPRikKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnbSc6CisJCQlsZWFmX21vZGUgPQorCQkJICAgIHBhcnNlX2ZpbGVfbW9kZShvcHRhcmcsIGxlYWZfbW9kZSwgc2F2ZWRfdW1hc2spOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG9wdGlvbiAtJWNcbiIsCisJCQkJcHJvZ25hbWUsIG9wdG9wdCk7CisJCQlleGl0KDEpOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAob3B0aW5kID09IGFyZ2MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1tIG1vZGVdIGZpbGUuLi5cbiIsIHByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl3aGlsZSAob3B0aW5kIDwgYXJnYykgeworCQlpZiAobWFrZV9maWZvKGFyZ3Zbb3B0aW5kXSkpCisJCQlyZXQgPSAyNTU7CS8qIHNlZW1zIHRvIGJlIHdoYXQgZ251IG1rZGlyIGRvZXMgKi8KKwkJb3B0aW5kKys7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9ta25vZC5jIGIvdXNyL3V0aWxzL21rbm9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9ta25vZC5jCkBAIC0wLDAgKzEsNzAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK2NoYXIgKnByb2duYW1lOworCitzdGF0aWMgX19ub3JldHVybiB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIG5hbWUge2J8Y3xwfSBtYWpvciBtaW5vclxuIiwgcHJvZ25hbWUpOworCWV4aXQoMSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciAqbmFtZSwgKnR5cGUsIHR5cGVjLCAqZW5kcDsKKwl1bnNpZ25lZCBpbnQgbWFqb3IsIG1pbm9yOworCW1vZGVfdCBtb2RlOworCWRldl90IGRldjsKKworCXByb2duYW1lID0gKmFyZ3YrKzsKKworCW5hbWUgPSAqYXJndisrOworCWlmICghbmFtZSkKKwkJdXNhZ2UoKTsKKworCXR5cGUgPSAqYXJndisrOworCWlmICghdHlwZSB8fCAhdHlwZVswXSB8fCB0eXBlWzFdKQorCQl1c2FnZSgpOworCXR5cGVjID0gdHlwZVswXTsKKworCW1vZGUgPSAwOworCXN3aXRjaCAodHlwZVswXSkgeworCWNhc2UgJ2MnOgorCQltb2RlID0gU19JRkNIUjsKKwkJYnJlYWs7CisJY2FzZSAnYic6CisJCW1vZGUgPSBTX0lGQkxLOworCQlicmVhazsKKwljYXNlICdwJzoKKwkJbW9kZSA9IFNfSUZJRk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVzYWdlKCk7CisJfQorCisJaWYgKG1vZGUgPT0gU19JRklGTykgeworCQlkZXYgPSAwOworCX0gZWxzZSB7CisJCWlmICghYXJndlswXSB8fCAhYXJndlsxXSkKKwkJCXVzYWdlKCk7CisKKwkJbWFqb3IgPSBzdHJ0b2woKmFyZ3YrKywgJmVuZHAsIDApOworCQlpZiAoKmVuZHAgIT0gJ1wwJykKKwkJCXVzYWdlKCk7CisJCW1pbm9yID0gc3RydG9sKCphcmd2KyssICZlbmRwLCAwKTsKKwkJaWYgKCplbmRwICE9ICdcMCcpCisJCQl1c2FnZSgpOworCQlkZXYgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJfQorCisJaWYgKCphcmd2KQorCQl1c2FnZSgpOworCisJaWYgKG1rbm9kKG5hbWUsIG1vZGV8MDY2NiwgZGV2KSA9PSAtMSkgeworCQlwZXJyb3IoIm1rbm9kIik7CisJCWV4aXQoMSk7CisJfQorCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9tb3VudF9tYWluLmMgYi91c3IvdXRpbHMvbW91bnRfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTIyY2QKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbW91bnRfbWFpbi5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogYnkgcm1rCisgKi8KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJtb3VudF9vcHRzLmgiCisKK2NoYXIgKnByb2duYW1lOworCitzdGF0aWMgc3RydWN0IGV4dHJhX29wdHMgZXh0cmE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByd2ZsYWc7CisKK3N0YXRpYyBpbnQKK2RvX21vdW50KGNoYXIgKmRldiwgY2hhciAqZGlyLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIHJ3ZmxhZywgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpzOworCWludCBlcnJvciA9IDA7CisKKwl3aGlsZSAoKHMgPSBzdHJzZXAoJnR5cGUsICIsIikpICE9IE5VTEwpIHsKKwkgICAgICByZXRyeToKKwkJaWYgKG1vdW50KGRldiwgZGlyLCBzLCByd2ZsYWcsIGRhdGEpID09IC0xKSB7CisJCQllcnJvciA9IGVycm5vOworCQkJLyoKKwkJCSAqIElmIHRoZSBmaWxlc3lzdGVtIGlzIG5vdCBmb3VuZCwgb3IgdGhlCisJCQkgKiBzdXBlcmJsb2NrIGlzIGludmFsaWQsIHRyeSB0aGUgbmV4dC4KKwkJCSAqLworCQkJaWYgKGVycm9yID09IEVOT0RFViB8fCBlcnJvciA9PSBFSU5WQUwpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBnZXQgRUFDQ0VTUywgYW5kIHdlJ3JlIHRyeWluZyB0bworCQkJICogbW91bnQgcmVhZHdyaXRlIGFuZCB0aGlzIGlzbid0IGEgcmVtb3VudCwKKwkJCSAqIHRyeSByZWFkIG9ubHkuCisJCQkgKi8KKwkJCWlmIChlcnJvciA9PSBFQUNDRVMgJiYKKwkJCSAgICAocndmbGFnICYgKE1TX1JFTU9VTlQgfCBNU19SRE9OTFkpKSA9PSAwKSB7CisJCQkJcndmbGFnIHw9IE1TX1JET05MWTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZXJyb3IpIHsKKwkJZXJybm8gPSBlcnJvcjsKKwkJcGVycm9yKCJtb3VudCIpOworCQlyZXR1cm4gMjU1OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKnR5cGUgPSBOVUxMOworCWludCBjOworCisJcHJvZ25hbWUgPSBhcmd2WzBdOworCXJ3ZmxhZyA9IE1TX1ZFUkJPU0U7CisKKwlkbyB7CisJCWMgPSBnZXRvcHQoYXJnYywgYXJndiwgIm86cnQ6dyIpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ28nOgorCQkJcndmbGFnID0gcGFyc2VfbW91bnRfb3B0aW9ucyhvcHRhcmcsIHJ3ZmxhZywgJmV4dHJhKTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJ3ZmxhZyB8PSBNU19SRE9OTFk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQl0eXBlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJcndmbGFnICY9IH5NU19SRE9OTFk7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbnZhbGlkIG9wdGlvbiAtJWNcbiIsCisJCQkJcHJvZ25hbWUsIG9wdG9wdCk7CisJCQlleGl0KDEpOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwkvKgorCSAqIElmIHJlbW91bnQsIGJpbmQgb3IgbW92ZSB3YXMgc3BlY2lmaWVkLCB0aGVuIHdlIGRvbid0CisJICogaGF2ZSBhICJ0eXBlIiBhcyBzdWNoLiAgVXNlIHRoZSBkdW1teSAibm9uZSIgdHlwZS4KKwkgKi8KKwlpZiAocndmbGFnICYgTVNfVFlQRSkKKwkJdHlwZSA9ICJub25lIjsKKworCWlmIChvcHRpbmQgKyAyICE9IGFyZ2MgfHwgdHlwZSA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstcl0gWy13XSBbLW8gb3B0aW9uc10gWy10IHR5cGVdICIKKwkJCSJkZXZpY2UgZGlyZWN0b3J5XG4iLCBwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dXJuIGRvX21vdW50KGFyZ3Zbb3B0aW5kXSwgYXJndltvcHRpbmQgKyAxXSwgdHlwZSwgcndmbGFnLAorCQkJZXh0cmEuc3RyKTsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9tb3VudF9vcHRzLmMgYi91c3IvdXRpbHMvbW91bnRfb3B0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjU4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbW91bnRfb3B0cy5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBieSBybWsKKyAqCisgKiBEZWNvZGUgbW91bnQgb3B0aW9ucy4KKyAqLworI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibW91bnRfb3B0cy5oIgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkJKHNpemVvZih4KSAvIHNpemVvZih4WzBdKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtb3VudF9vcHRzIG9wdGlvbnNbXSA9IHsKKwkvKiBuYW1lICAgICAgICAgbWFzayAgICAgICAgICAgIHNldCAgICAgICAgICAgICBub3NldCAgICAgICAgICAgKi8KKwl7ImFzeW5jIiwgTVNfU1lOQ0hST05PVVMsIDAsIE1TX1NZTkNIUk9OT1VTfSwKKwl7ImF0aW1lIiwgTVNfTk9BVElNRSwgMCwgTVNfTk9BVElNRX0sCisJeyJiaW5kIiwgTVNfVFlQRSwgTVNfQklORCwgMCx9LAorCXsiZGV2IiwgTVNfTk9ERVYsIDAsIE1TX05PREVWfSwKKwl7ImRpcmF0aW1lIiwgTVNfTk9ESVJBVElNRSwgMCwgTVNfTk9ESVJBVElNRX0sCisJeyJkaXJzeW5jIiwgTVNfRElSU1lOQywgTVNfRElSU1lOQywgMH0sCisJeyJleGVjIiwgTVNfTk9FWEVDLCAwLCBNU19OT0VYRUN9LAorCXsibW92ZSIsIE1TX1RZUEUsIE1TX01PVkUsIDB9LAorCXsicmVjdXJzZSIsIE1TX1JFQywgTVNfUkVDLCAwfSwKKwl7InJlbW91bnQiLCBNU19UWVBFLCBNU19SRU1PVU5ULCAwfSwKKwl7InJvIiwgTVNfUkRPTkxZLCBNU19SRE9OTFksIDB9LAorCXsicnciLCBNU19SRE9OTFksIDAsIE1TX1JET05MWX0sCisJeyJzdWlkIiwgTVNfTk9TVUlELCAwLCBNU19OT1NVSUR9LAorCXsic3luYyIsIE1TX1NZTkNIUk9OT1VTLCBNU19TWU5DSFJPTk9VUywgMH0sCisJeyJ2ZXJib3NlIiwgTVNfVkVSQk9TRSwgTVNfVkVSQk9TRSwgMH0sCit9OworCitzdGF0aWMgdm9pZCBhZGRfZXh0cmFfb3B0aW9uKHN0cnVjdCBleHRyYV9vcHRzICpleHRyYSwgY2hhciAqcykKK3sKKwlpbnQgbGVuID0gc3RybGVuKHMpOworCWludCBuZXdsZW4gPSBleHRyYS0+dXNlZF9zaXplICsgbGVuOworCisJaWYgKGV4dHJhLT5zdHIpCisJCWxlbisrOwkJLyogKzEgZm9yICcsJyAqLworCisJaWYgKG5ld2xlbiA+PSBleHRyYS0+YWxsb2Nfc2l6ZSkgeworCQljaGFyICpuZXc7CisKKwkJbmV3ID0gcmVhbGxvYyhleHRyYS0+c3RyLCBuZXdsZW4gKyAxKTsJLyogKzEgZm9yIE5VTCAqLworCQlpZiAoIW5ldykKKwkJCXJldHVybjsKKworCQlleHRyYS0+c3RyID0gbmV3OworCQlleHRyYS0+ZW5kID0gZXh0cmEtPnN0ciArIGV4dHJhLT51c2VkX3NpemU7CisJCWV4dHJhLT5hbGxvY19zaXplID0gbmV3bGVuOworCX0KKworCWlmIChleHRyYS0+dXNlZF9zaXplKSB7CisJCSpleHRyYS0+ZW5kID0gJywnOworCQlleHRyYS0+ZW5kKys7CisJfQorCXN0cmNweShleHRyYS0+ZW5kLCBzKTsKKwlleHRyYS0+dXNlZF9zaXplICs9IGxlbjsKKworfQorCit1bnNpZ25lZCBsb25nCitwYXJzZV9tb3VudF9vcHRpb25zKGNoYXIgKmFyZywgdW5zaWduZWQgbG9uZyByd2ZsYWcsIHN0cnVjdCBleHRyYV9vcHRzICpleHRyYSkKK3sKKwljaGFyICpzOworCisJd2hpbGUgKChzID0gc3Ryc2VwKCZhcmcsICIsIikpICE9IE5VTEwpIHsKKwkJY2hhciAqb3B0ID0gczsKKwkJdW5zaWduZWQgaW50IGk7CisJCWludCByZXMsIG5vID0gc1swXSA9PSAnbicgJiYgc1sxXSA9PSAnbyc7CisKKwkJaWYgKG5vKQorCQkJcyArPSAyOworCisJCWZvciAoaSA9IDAsIHJlcyA9IDE7IGkgPCBBUlJBWV9TSVpFKG9wdGlvbnMpOyBpKyspIHsKKwkJCXJlcyA9IHN0cmNtcChzLCBvcHRpb25zW2ldLnN0cik7CisKKwkJCWlmIChyZXMgPT0gMCkgeworCQkJCXJ3ZmxhZyAmPSB+b3B0aW9uc1tpXS5yd21hc2s7CisJCQkJaWYgKG5vKQorCQkJCQlyd2ZsYWcgfD0gb3B0aW9uc1tpXS5yd25vc2V0OworCQkJCWVsc2UKKwkJCQkJcndmbGFnIHw9IG9wdGlvbnNbaV0ucndzZXQ7CisJCQl9CisJCQlpZiAocmVzIDw9IDApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmVzICE9IDAgJiYgc1swXSkKKwkJCWFkZF9leHRyYV9vcHRpb24oZXh0cmEsIG9wdCk7CisJfQorCisJcmV0dXJuIHJ3ZmxhZzsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9tb3VudF9vcHRzLmggYi91c3IvdXRpbHMvbW91bnRfb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDdjYWUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbW91bnRfb3B0cy5oCkBAIC0wLDAgKzEsMjYgQEAKKyNpZm5kZWYgVVRJTFNfTU9VTlRfT1BUU19ICisjZGVmaW5lIFVUSUxTX01PVU5UX09QVFNfSAorCitzdHJ1Y3QgbW91bnRfb3B0cyB7CisJY29uc3QgY2hhciBzdHJbOF07CisJdW5zaWduZWQgbG9uZyByd21hc2s7CisJdW5zaWduZWQgbG9uZyByd3NldDsKKwl1bnNpZ25lZCBsb25nIHJ3bm9zZXQ7Cit9OworCitzdHJ1Y3QgZXh0cmFfb3B0cyB7CisJY2hhciAqc3RyOworCWNoYXIgKmVuZDsKKwlpbnQgdXNlZF9zaXplOworCWludCBhbGxvY19zaXplOworfTsKKworLyoKKyAqIFRoZXNlIG9wdGlvbnMgZGVmaW5lIHRoZSBmdW5jdGlvbiBvZiAibW91bnQoMikiLgorICovCisjZGVmaW5lIE1TX1RZUEUJKE1TX1JFTU9VTlR8TVNfQklORHxNU19NT1ZFKQorCit1bnNpZ25lZCBsb25nCitwYXJzZV9tb3VudF9vcHRpb25zKGNoYXIgKmFyZywgdW5zaWduZWQgbG9uZyByd2ZsYWcsIHN0cnVjdCBleHRyYV9vcHRzICpleHRyYSk7CisKKyNlbmRpZiAvKiBVVElMU19NT1VOVF9PUFRTX0ggKi8KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9udWtlLmMgYi91c3IvdXRpbHMvbnVrZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOWJkMDUKLS0tIC9kZXYvbnVsbAorKysgYi91c3IvdXRpbHMvbnVrZS5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwNC0yMDA2IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20KKyAqICAgdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgIGNvbmRpdGlvbnM6CisgKgorICogICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbAorICogICBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogU2ltcGxlIHByb2dyYW0gd2hpY2ggZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBybSAtcmYsIGV4Y2VwdCBpdCB0YWtlcworICogbm8gb3B0aW9ucyBhbmQgY2FuIHRoZXJlZm9yZSBub3QgZ2V0IGNvbmZ1c2VkIGJ5IGZpbGVuYW1lcyBzdGFydGluZworICogd2l0aCAtLiAgU2ltaWxhcmx5LCBhbiBlbXB0eSBsaXN0IG9mIGlucHV0cyBpcyBhc3N1bWVkIHRvIG1lYW4gZG9uJ3QKKyAqIGRvIGFueXRoaW5nLgorICovCisKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9ncmFtOworCitzdGF0aWMgaW50IG51a2UoY29uc3QgY2hhciAqd2hhdCk7CisKK3N0YXRpYyBpbnQgbnVrZV9kaXJlbnQoaW50IGxlbiwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBieXRlcyA9IGxlbiArIHN0cmxlbihuYW1lKSArIDI7CisJY2hhciBwYXRoW2J5dGVzXTsKKwlpbnQgeGxlbjsKKworCXhsZW4gPSBzbnByaW50ZihwYXRoLCBieXRlcywgIiVzLyVzIiwgZGlyLCBuYW1lKTsKKwlhc3NlcnQoeGxlbiA8IGJ5dGVzKTsKKworCXJldHVybiBudWtlKHBhdGgpOworfQorCisvKiBXaXBlIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeSwgYnV0IG5vdCB0aGUgZGlyZWN0b3J5IGl0c2VsZiAqLworc3RhdGljIGludCBudWtlX2Rpcihjb25zdCBjaGFyICp3aGF0KQoreworCWludCBsZW4gPSBzdHJsZW4od2hhdCk7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghKGRpciA9IG9wZW5kaXIod2hhdCkpKSB7CisJCS8qIEVBQ0NFUyBtZWFucyB3ZSBjYW4ndCByZWFkIGl0LiAgTWlnaHQgYmUgZW1wdHkgYW5kIHJlbW92YWJsZTsKKwkJICAgaWYgbm90LCB0aGUgcm1kaXIoKSBpbiBudWtlKCkgd2lsbCB0cmlnZ2VyIGFuIGVycm9yLiAqLworCQlyZXR1cm4gKGVycm5vID09IEVBQ0NFUykgPyAwIDogZXJybm87CisJfQorCisJd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSkgeworCQkvKiBTa2lwIC4gYW5kIC4uICovCisJCWlmIChkLT5kX25hbWVbMF0gPT0gJy4nICYmCisJCSAgICAoZC0+ZF9uYW1lWzFdID09ICdcMCcgfHwKKwkJICAgICAoZC0+ZF9uYW1lWzFdID09ICcuJyAmJiBkLT5kX25hbWVbMl0gPT0gJ1wwJykpKQorCQkJY29udGludWU7CisKKwkJZXJyID0gbnVrZV9kaXJlbnQobGVuLCB3aGF0LCBkLT5kX25hbWUpOworCQlpZiAoZXJyKSB7CisJCQljbG9zZWRpcihkaXIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCWNsb3NlZGlyKGRpcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudWtlKGNvbnN0IGNoYXIgKndoYXQpCit7CisJaW50IHJ2OworCWludCBlcnIgPSAwOworCisJcnYgPSB1bmxpbmsod2hhdCk7CisJaWYgKHJ2IDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUlTRElSKSB7CisJCQkvKiBJdCdzIGEgZGlyZWN0b3J5LiAqLworCQkJZXJyID0gbnVrZV9kaXIod2hhdCk7CisJCQlpZiAoIWVycikKKwkJCQlybWRpcih3aGF0KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpOworCisJcHJvZ3JhbSA9IGFyZ3ZbMF07CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCQludWtlKGFyZ3ZbaV0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvcGl2b3Rfcm9vdC5jIGIvdXNyL3V0aWxzL3Bpdm90X3Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWIyZWEwCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL3Bpdm90X3Jvb3QuYwpAQCAtMCwwICsxLDE5IEBACisvKiBDaGFuZ2UgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gKi8KKworLyogV3JpdHRlbiAyMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWlmIChhcmdjICE9IDMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgbmV3X3Jvb3QgcHV0X29sZFxuIiwgYXJndlswXSk7CisJCXJldHVybiAxOworCX0KKwlpZiAocGl2b3Rfcm9vdChhcmd2WzFdLCBhcmd2WzJdKSA8IDApIHsKKwkJcGVycm9yKCJwaXZvdF9yb290Iik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy9yZWFkbGluay5jIGIvdXNyL3V0aWxzL3JlYWRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjMmExZQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy9yZWFkbGluay5jCkBAIC0wLDAgKzEsMzggQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK2NoYXIgKnByb2duYW1lOworCitzdGF0aWMgX19ub3JldHVybiB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIGxpbmtcbiIsIHByb2duYW1lKTsKKwlleGl0KDEpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKm5hbWUsICpsaW5rID0gTlVMTDsKKwlzaXplX3QgbWF4X3NpeiA9IDEyODsKKworCXByb2duYW1lID0gKmFyZ3YrKzsKKworCW5hbWUgPSAqYXJndisrOworCWlmICghbmFtZSkKKwkJdXNhZ2UoKTsKKworCWxpbmsgPSBtYWxsb2MobWF4X3Npeik7CisJaWYgKCFsaW5rKSB7CisJCXBlcnJvcigibWFsbG9jIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKHJlYWRsaW5rKG5hbWUsIGxpbmssIG1heF9zaXopID09IC0xKSB7CisJCXBlcnJvcigicmVhZGxpbmsiKTsKKwkJZXhpdCgxKTsKKwl9CisJcHJpbnRmKCIlc1xuIiwgbGluayk7CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvdXNyL3V0aWxzL3NsZWVwLmMgYi91c3IvdXRpbHMvc2xlZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGY2YWVlCi0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL3NsZWVwLmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWNoYXIgKnA7CisKKwlpZiAoYXJnYyAhPSAyKQorCQlnb3RvIGVycjsKKworCXAgPSBzdHJ0b3RpbWVzcGVjKGFyZ3ZbMV0sICZ0cyk7CisJaWYgKCpwKQorCQlnb3RvIGVycjsKKworCXdoaWxlIChuYW5vc2xlZXAoJnRzLCAmdHMpID09IC0xICYmIGVycm5vID09IEVJTlRSKSA7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXJyOgorCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIHNlY29uZHNbLmZyYWN0aW9uXVxuIiwgYXJndlswXSk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvdHJ1ZS5jIGIvdXNyL3V0aWxzL3RydWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRiZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXNyL3V0aWxzL3RydWUuYwpAQCAtMCwwICsxLDQgQEAKK2ludCBtYWluKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91c3IvdXRpbHMvdW1vdW50LmMgYi91c3IvdXRpbHMvdW1vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0OTdhNwotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy91bW91bnQuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogYnkgcm1rCisgKi8KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2NoYXIgKnByb2duYW1lOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjLCBmbGFnID0gMDsKKworCXByb2duYW1lID0gYXJndlswXTsKKworCWRvIHsKKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZmwiKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkJYnJlYWs7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdmJzoKKwkJCWZsYWcgfD0gTU5UX0ZPUkNFOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJZmxhZyB8PSBNTlRfREVUQUNIOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBvcHRpb24gLSVjXG4iLAorCQkJCXByb2duYW1lLCBvcHRvcHQpOworCQkJZXhpdCgxKTsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKG9wdGluZCArIDEgIT0gYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWZdIFstbF0gbW50cG9pbnRcbiIsIHByb2duYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHVtb3VudDIoYXJndltvcHRpbmRdLCBmbGFnKSA9PSAtMSkgeworCQlwZXJyb3IoInVtb3VudDIiKTsKKwkJcmV0dXJuIDI1NTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Vzci91dGlscy91bmFtZS5jIGIvdXNyL3V0aWxzL3VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhZWRiOQotLS0gL2Rldi9udWxsCisrKyBiL3Vzci91dGlscy91bmFtZS5jCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogYnkgdGxoCisgKgorICogVGhlIHVuYW1lIHByb2dyYW0gZm9yIHN5c3RlbSBpbmZvcm1hdGlvbjoga2VybmVsIG5hbWUsIGtlcm5lbAorICogcmVsZWFzZSwga2VybmVsIHJlbGVhc2UsIG1hY2hpbmUsIHByb2Nlc3NvciwgcGxhdGZvcm0sIG9zIGFuZAorICogaG9zdG5hbWUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCitlbnVtIHVuYW1lX2ZpZWxkcyB7CisJVU5fU1lTTkFNRSwKKwlVTl9OT0RFTkFNRSwKKwlVTl9SRUxFQVNFLAorCVVOX1ZFUlNJT04sCisJVU5fTUFDSElORSwKKyNpZiBOT1RfSU1QTEVNRU5URURfUFJPQ0VTU09SCisJVU5fUFJPQ0VTU09SLAorI2VuZGlmCisJVU5fSEFSRFdBUkUsCisjaWYgTk9UX0lNUExFTUVOVEVEX09TCisJVU5fT1MsCisjZW5kaWYKKwlVTl9OUl9GSUVMRFMKK307CisKK3ZvaWQgdXNhZ2UoRklMRSAqIHN0cmVhbSwgY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisJZnByaW50ZihzdHJlYW0sCisJCSJVc2FnZTogJXMgW09QVElPTl0gLiAuIC5cbiIKKwkJIlByaW50IHN5c3RlbSBpbmZvcm1hdGlvbiwgIE5vIG9wdGlvbnMgZGVmYXVsdHMgdG8gLXMuXG4iCisJCSJcbiIKKwkJIiAgLWEgICBwcmludCBhbGwgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzYW1lIG9yZGVyIGFzIGZvbGxvd3MgYmVsb3dcbiIKKwkJIiAgLXMgICBrZXJuZWwgbmFtZVxuIgorCQkiICAtbiAgIG5ldHdvcmsgbm9kZSBuYW1lIChob3N0bmFtZSlcbiIKKwkJIiAgLXIgICBrZXJuZWwgcmVsZWFzZVxuIgorCQkiICAtdiAgIGtlcm5lbCB2ZXJzaW9uXG4iICIgIC1tICAgbWFjaGluZSBoYXJkd2FyZSBuYW1lXG4iCisjaWYgTk9UX0lNUExFTUVOVEVEX1BST0NFU1NPUgorCQkiICAtcCAgIHByb2Nlc3NvciB0eXBlXG4iCisjZW5kaWYKKwkJIiAgLWkgICBoYXJkd2FyZSBwbGF0Zm9ybVxuIgorI2lmIE5PVF9JTVBMRU1FTlRFRF9PUworCQkiICAtbyAgIG9wZXJhdGluZyBzeXN0ZW1cbiIKKyNlbmRpZgorCQkiXG4iICIgIC1oICAgaGVscC91c2FnZVxuIiAiXG4iLCBwcm9nbmFtZSk7Cit9CisKK2NoYXIgKm1ha2VfaGFyZHdhcmUoY29uc3QgY2hhciAqbWFjaGluZSkKK3sKKwljaGFyICpoYXJkd2FyZTsKKworCWlmICghKGhhcmR3YXJlID0gc3RyZHVwKG1hY2hpbmUpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInN0cmR1cCgpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoc3RybGVuKGhhcmR3YXJlKSA9PSA0CisJICAgICYmIGhhcmR3YXJlWzBdID09ICdpJyAmJiBoYXJkd2FyZVsyXSA9PSAnOCcgJiYgaGFyZHdhcmVbM10gPT0gJzYnKSB7CisJCWhhcmR3YXJlWzFdID0gJzMnOworCX0KKyAgICAgIGVuZDoKKwlyZXR1cm4gaGFyZHdhcmU7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGVjID0gMTsKKwlpbnQgb3B0OworCWludCBpOworCWludCBucl9wcjsKKwlzdHJ1Y3QgdXRzbmFtZSBidWY7CisJY2hhciAqdW5hbWVfZmllbGRzW1VOX05SX0ZJRUxEU10gPSB7IE5VTEwgfTsKKworCWlmICgtMSA9PSB1bmFtZSgmYnVmKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuYW1lKCkgZmFpbHVyZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZW5kOworCX0KKworCWlmICgxID09IGFyZ2MpCisJCS8qIG5vIG9wdGlvbnMgZ2l2ZW4gLSBkZWZhdWx0IHRvIC1zICovCisJCXVuYW1lX2ZpZWxkc1tVTl9TWVNOQU1FXSA9IGJ1Zi5zeXNuYW1lOworCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImFzbnJ2bXBpb2giKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnYSc6CisJCQl1bmFtZV9maWVsZHNbVU5fU1lTTkFNRV0gPSBidWYuc3lzbmFtZTsKKwkJCXVuYW1lX2ZpZWxkc1tVTl9OT0RFTkFNRV0gPSBidWYubm9kZW5hbWU7CisJCQl1bmFtZV9maWVsZHNbVU5fUkVMRUFTRV0gPSBidWYucmVsZWFzZTsKKwkJCXVuYW1lX2ZpZWxkc1tVTl9WRVJTSU9OXSA9IGJ1Zi52ZXJzaW9uOworCQkJdW5hbWVfZmllbGRzW1VOX01BQ0hJTkVdID0gYnVmLm1hY2hpbmU7CisJCQl1bmFtZV9maWVsZHNbVU5fSEFSRFdBUkVdID0gbWFrZV9oYXJkd2FyZShidWYubWFjaGluZSk7CisJCQlpZiAoIXVuYW1lX2ZpZWxkc1tVTl9IQVJEV0FSRV0pCisJCQkJZ290byBlbmQ7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQl1bmFtZV9maWVsZHNbVU5fU1lTTkFNRV0gPSBidWYuc3lzbmFtZTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXVuYW1lX2ZpZWxkc1tVTl9OT0RFTkFNRV0gPSBidWYubm9kZW5hbWU7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQl1bmFtZV9maWVsZHNbVU5fUkVMRUFTRV0gPSBidWYucmVsZWFzZTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXVuYW1lX2ZpZWxkc1tVTl9WRVJTSU9OXSA9IGJ1Zi52ZXJzaW9uOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJdW5hbWVfZmllbGRzW1VOX01BQ0hJTkVdID0gYnVmLm1hY2hpbmU7CisJCQlicmVhazsKKyNpZiBOT1RfSU1QTEVNRU5URURfUFJPQ0VTU09SCisJCWNhc2UgJ3AnOgorCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAnaSc6CisJCQl1bmFtZV9maWVsZHNbVU5fSEFSRFdBUkVdID0gbWFrZV9oYXJkd2FyZShidWYubWFjaGluZSk7CisJCQlpZiAoIXVuYW1lX2ZpZWxkc1tVTl9IQVJEV0FSRV0pCisJCQkJZ290byBlbmQ7CisJCQlicmVhazsKKyNpZiBOT1RfSU1QTEVNRU5URURfT1MKKwkJY2FzZSAnbyc6CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlICdoJzoKKwkJCXVzYWdlKHN0ZG91dCwgYXJndlswXSk7CisJCQllYyA9IDA7CisJCQlnb3RvIGVuZDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXNhZ2Uoc3RkZXJyLCBhcmd2WzBdKTsKKwkJCWdvdG8gZW5kOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmb3IgKG5yX3ByID0gMCwgaSA9IFVOX1NZU05BTUU7IGkgPCBVTl9OUl9GSUVMRFM7IGkrKykgeworCQlpZiAoIXVuYW1lX2ZpZWxkc1tpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAobnJfcHIpCisJCQlmcHV0YygnICcsIHN0ZG91dCk7CisJCWZwdXRzKHVuYW1lX2ZpZWxkc1tpXSwgc3Rkb3V0KTsKKwkJbnJfcHIrKzsKKwl9CisJZnB1dGMoJ1xuJywgc3Rkb3V0KTsKKworCWVjID0gMDsKKworICAgICAgZW5kOgorCWlmICh1bmFtZV9maWVsZHNbVU5fSEFSRFdBUkVdKQorCQlmcmVlKHVuYW1lX2ZpZWxkc1tVTl9IQVJEV0FSRV0pOworCXJldHVybiBlYzsKK30K