LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIEZJWE1FOiB3ZSB1c2UgcmVhZHx3cml0ZSBhY2Nlc3MgaW4gYWxsIGNhc2VzLiBTaG91bGRuJ3Qgd2UgZGVwZW5kIHRoYXQKICogb24gdGhlIGFjY2VzcyBvZiB0aGUgY3VycmVudCBoYW5kbGU/CiAqLwoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN5cy9lcnJuby5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgoKc3RydWN0IHNvY2sKewogICAgc3RydWN0IG9iamVjdCAgICAgICBvYmo7ICAgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLwogICAgc3RydWN0IHNlbGVjdF91c2VyICBzZWxlY3Q7ICAgICAgLyogc2VsZWN0IHVzZXIgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgc3RhdGU7ICAgICAgIC8qIHN0YXR1cyBiaXRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIG1hc2s7ICAgICAgICAvKiBldmVudCBtYXNrICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIGhtYXNrOyAgICAgICAvKiBoZWxkIChibG9ja2VkKSBldmVudHMgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgcG1hc2s7ICAgICAgIC8qIHBlbmRpbmcgZXZlbnRzICovCiAgICBzdHJ1Y3QgZXZlbnQgICAgICAgKmV2ZW50OyAgICAgICAvKiBldmVudCBvYmplY3QgKi8KICAgIGludCAgICAgICAgICAgICAgICAgZXJyb3JzW0ZEX01BWF9FVkVOVFNdOyAvKiBldmVudCBlcnJvcnMgKi8KfTsKCnN0YXRpYyB2b2lkIHNvY2tfZHVtcCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApOwpzdGF0aWMgaW50IHNvY2tfYWRkX3F1ZXVlKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB3YWl0X3F1ZXVlX2VudHJ5ICplbnRyeSApOwpzdGF0aWMgdm9pZCBzb2NrX3JlbW92ZV9xdWV1ZSggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSAqZW50cnkgKTsKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOwpzdGF0aWMgaW50IHNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLAogICAgc29ja19kdW1wLAogICAgc29ja19hZGRfcXVldWUsCiAgICBzb2NrX3JlbW92ZV9xdWV1ZSwKICAgIHNvY2tfc2lnbmFsZWQsCiAgICBub19zYXRpc2ZpZWQsCiAgICBzb2NrX2dldF9mZCwKICAgIHNvY2tfZ2V0X2ZkLAogICAgbm9fZmx1c2gsCiAgICBub19nZXRfZmlsZV9pbmZvLAogICAgc29ja19kZXN0cm95Cn07CgpzdGF0aWMgaW50IHNvY2tfZXZlbnQoIHN0cnVjdCBzb2NrICpzb2NrICkKewogICAgdW5zaWduZWQgaW50IG1hc2sgPSBzb2NrLT5tYXNrICYgc29jay0+c3RhdGUgJiB+c29jay0+aG1hc2s7CiAgICBpbnQgZXYgPSBFWENFUFRfRVZFTlQ7CgogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfQ09OTkVDVCkKICAgICAgICAvKiBjb25uZWN0aW5nLCB3YWl0IGZvciB3cml0YWJsZSAqLwogICAgICAgIHJldHVybiBXUklURV9FVkVOVCB8IEVYQ0VQVF9FVkVOVDsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0xJU1RFTklORykKICAgICAgICAvKiBsaXN0ZW5pbmcsIHdhaXQgZm9yIHJlYWRhYmxlICovCiAgICAgICAgcmV0dXJuICgoc29jay0+aG1hc2sgJiBGRF9BQ0NFUFQpID8gMCA6IFJFQURfRVZFTlQpIHwgRVhDRVBUX0VWRU5UOwoKICAgIGlmIChtYXNrICYgRkRfUkVBRCkgIGV2IHw9IFJFQURfRVZFTlQ7CiAgICBpZiAobWFzayAmIEZEX1dSSVRFKSBldiB8PSBXUklURV9FVkVOVDsKICAgIHJldHVybiBldjsKfQoKc3RhdGljIHZvaWQgc29ja19yZXNlbGVjdCggc3RydWN0IHNvY2sgKnNvY2sgKQp7CiAgICBzZXRfc2VsZWN0X2V2ZW50cyggJnNvY2stPnNlbGVjdCwgc29ja19ldmVudCggc29jayApICk7Cn0KCmlubGluZSBzdGF0aWMgaW50IHNvY2tfZXJyb3IoaW50IHMpCnsKICAgIHVuc2lnbmVkIGludCBvcHR2YWwsIG9wdGxlbjsKICAgIAogICAgb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7CiAgICBnZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSAmb3B0dmFsLCAmb3B0bGVuKTsKICAgIHJldHVybiBvcHR2YWw7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfc2VsZWN0X2V2ZW50KCBpbnQgZXZlbnQsIHZvaWQgKnByaXZhdGUgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKXByaXZhdGU7CiAgICB1bnNpZ25lZCBpbnQgZW1hc2s7CiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBpZiAoc29jay0+c3RhdGUgJiBXU19GRF9DT05ORUNUKQogICAgewogICAgICAgIC8qIGNvbm5lY3RpbmcgKi8KICAgICAgICBpZiAoZXZlbnQgJiBXUklURV9FVkVOVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGdvdCBjb25uZWN0ZWQgKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgfD0gV1NfRkRfQ09OTkVDVEVEfFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5XU19GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQgJiBFWENFUFRfRVZFTlQpCiAgICAgICAgewogICAgICAgICAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGNvbm5lY3RlZD8gKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfldTX0ZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DT05ORUNUX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5zZWxlY3QuZmQgKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0xJU1RFTklORykKICAgIHsKICAgICAgICAvKiBsaXN0ZW5pbmcgKi8KICAgICAgICBpZiAoZXZlbnQgJiBSRUFEX0VWRU5UKQogICAgICAgIHsKICAgICAgICAgICAgLyogaW5jb21pbmcgY29ubmVjdGlvbiAqLwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9BQ0NFUFRfQklUXSA9IDA7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQgJiBFWENFUFRfRVZFTlQpCiAgICAgICAgewogICAgICAgICAgICAvKiBmYWlsZWQgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5zZWxlY3QuZmQgKTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgIH0gZWxzZQogICAgewogICAgICAgIC8qIG5vcm1hbCBkYXRhIGZsb3cgKi8KICAgICAgICBpZiAoZXZlbnQgJiBSRUFEX0VWRU5UKQogICAgICAgIHsKICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoZXJlJ3MgZGF0YSBoZXJlICovCiAgICAgICAgICAgIGludCBieXRlcyA9IDA7CiAgICAgICAgICAgIGlvY3RsKHNvY2stPnNlbGVjdC5mZCwgRklPTlJFQUQsIChjaGFyKikmYnl0ZXMpOwogICAgICAgICAgICBpZiAoYnl0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgKi8KICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiAwIGJ5dGVzIHJlYWRhYmxlID09IHNvY2tldCBjbG9zZWQgY2xlYW5seSAqLwogICAgICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfihXU19GRF9DT05ORUNURUR8V1NfRkRfUkVBRHxXU19GRF9XUklURSk7CiAgICAgICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DTE9TRTsKICAgICAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DTE9TRV9CSVRdID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBXUklURV9FVkVOVCkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1dSSVRFX0JJVF0gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBFWENFUFRfRVZFTlQpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSA9IHNvY2tfZXJyb3IoIHNvY2stPnNlbGVjdC5mZCApOwogICAgICAgICAgICBpZiAoc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIHdlIGdvdCBhbiBlcnJvciwgc29ja2V0IGNsb3Npbmc/ICovCiAgICAgICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+KFdTX0ZEX0NPTk5FQ1RFRHxXU19GRF9SRUFEfFdTX0ZEX1dSSVRFKTsKICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogbm8gZXJyb3IsIE9PQiBkYXRhPyAqLwogICAgICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIC8qIHdha2UgdXAgYW55b25lIHdhaXRpbmcgZm9yIHdoYXRldmVyIGp1c3QgaGFwcGVuZWQgKi8KICAgIGVtYXNrID0gc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrOwogICAgaWYgKGVtYXNrICYmIHNvY2stPmV2ZW50KQogICAgICAgIHNldF9ldmVudChzb2NrLT5ldmVudCk7CgogICAgLyogaWYgYW55b25lIGlzIHN0dXBpZCBlbm91Z2ggdG8gd2FpdCBvbiB0aGUgc29ja2V0IG9iamVjdCBpdHNlbGYsCiAgICAgKiBtYXliZSB3ZSBzaG91bGQgd2FrZSB0aGVtIHVwIHRvbywganVzdCBpbiBjYXNlPyAqLwogICAgd2FrZV91cCggJnNvY2stPm9iaiwgMCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBwcmludGYoICJTb2NrZXQgZmQ9JWRcbiIsIHNvY2stPnNlbGVjdC5mZCApOwp9CgpzdGF0aWMgaW50IHNvY2tfYWRkX3F1ZXVlKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB3YWl0X3F1ZXVlX2VudHJ5ICplbnRyeSApCnsKLyogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7ICovCiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIGFkZF9xdWV1ZSggb2JqLCBlbnRyeSApOwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcmVtb3ZlX3F1ZXVlKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB3YWl0X3F1ZXVlX2VudHJ5ICplbnRyeSApCnsKLyogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilncmFiX29iamVjdChvYmopOyAqLwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICByZW1vdmVfcXVldWUoIG9iaiwgZW50cnkgKTsKICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKfQoKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICByZXR1cm4gY2hlY2tfc2VsZWN0X2V2ZW50cyggJnNvY2stPnNlbGVjdCwgc29ja19ldmVudCggc29jayApICk7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfZmQoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgaW50IGZkOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIGZkID0gZHVwKCBzb2NrLT5zZWxlY3QuZmQgKTsKICAgIGlmIChmZD09LTEpCiAgICAJc29ja19zZXRfZXJyb3IoKTsKICAgIHJldHVybiBmZDsKfQoKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgdW5yZWdpc3Rlcl9zZWxlY3RfdXNlciggJnNvY2stPnNlbGVjdCApOwogICAgLyogRklYTUU6IHNwZWNpYWwgc29ja2V0IHNodXRkb3duIHN0dWZmPyAqLwogICAgY2xvc2UoIHNvY2stPnNlbGVjdC5mZCApOwogICAgaWYgKHNvY2stPmV2ZW50KQogICAgewogICAgICAgIC8qIGlmIHRoZSBzZXJ2aWNlIHRocmVhZCB3YXMgd2FpdGluZyBmb3IgdGhlIGV2ZW50IG9iamVjdCwKICAgICAgICAgKiB3ZSBzaG91bGQgbm93IHNpZ25hbCBpdCwgdG8gbGV0IHRoZSBzZXJ2aWNlIHRocmVhZAogICAgICAgICAqIG9iamVjdCBkZXRlY3QgdGhhdCBpdCBpcyBub3cgb3JwaGFuZWQuLi4gKi8KICAgICAgICBzZXRfZXZlbnQoIHNvY2stPmV2ZW50ICk7CiAgICAgICAgLyogd2UncmUgdGhyb3VnaCB3aXRoIGl0ICovCiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2stPmV2ZW50ICk7CiAgICB9CiAgICBmcmVlKCBzb2NrICk7Cn0KCi8qIGNyZWF0ZSBhIG5ldyBhbmQgdW5jb25uZWN0ZWQgc29ja2V0ICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfc29ja2V0KCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sICkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgaWYgKCEoc29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzICkpKQogICAgICAgIHJldHVybiBOVUxMOwogICAgc29jay0+c2VsZWN0LmZkICAgICAgPSBzb2NrZXQoZmFtaWx5LHR5cGUscHJvdG9jb2wpOwogICAgc29jay0+c2VsZWN0LmZ1bmMgICAgPSBzb2NrX3NlbGVjdF9ldmVudDsKICAgIHNvY2stPnNlbGVjdC5wcml2YXRlID0gc29jazsKICAgIHNvY2stPnN0YXRlICAgICAgICAgID0gKHR5cGUhPVNPQ0tfU1RSRUFNKSA/IFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEUgOiAwOwogICAgc29jay0+bWFzayAgICAgICAgICAgPSAwOwogICAgc29jay0+aG1hc2sgICAgICAgICAgPSAwOwogICAgc29jay0+cG1hc2sgICAgICAgICAgPSAwOwogICAgc29jay0+ZXZlbnQgICAgICAgICAgPSBOVUxMOwogICAgZnByaW50ZihzdGRlcnIsInNvY2tldCglZCwlZCwlZCk9JWRcbiIsZmFtaWx5LHR5cGUscHJvdG9jb2wsc29jay0+c2VsZWN0LmZkKTsKICAgIGZjbnRsKHNvY2stPnNlbGVjdC5mZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICByZWdpc3Rlcl9zZWxlY3RfdXNlciggJnNvY2stPnNlbGVjdCApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHJldHVybiAmc29jay0+b2JqOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKGNyZWF0ZXMgYSBuZXcgZmQpICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICphY2NlcHRfc29ja2V0KCBpbnQgaGFuZGxlICkKewogICAgc3RydWN0IHNvY2sgKmFjY2VwdHNvY2s7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludAlhY2NlcHRmZDsKICAgIHN0cnVjdCBzb2NrYWRkcglzYWRkcjsKICAgIGludAkJCXNsZW47CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MsaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCiAgICAJcmV0dXJuIE5VTEw7CiAgICAvKiBUcnkgdG8gYWNjZXB0KDIpLiBXZSBjYW4ndCBiZSBzYWZlIHRoYXQgdGhpcyBhbiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQgCiAgICAgKiBvciB0aGF0IGFjY2VwdCgpIGlzIGFsbG93ZWQgb24gaXQuIEluIHRob3NlIGNhc2VzIHdlIHdpbGwgZ2V0IC0xL2Vycm5vCiAgICAgKiByZXR1cm4uCiAgICAgKi8KICAgIHNsZW4gPSBzaXplb2Yoc2FkZHIpOwogICAgYWNjZXB0ZmQgPSBhY2NlcHQoc29jay0+c2VsZWN0LmZkLCZzYWRkciwmc2xlbik7CiAgICBpZiAoYWNjZXB0ZmQ9PS0xKSB7CiAgICAJc29ja19zZXRfZXJyb3IoKTsKICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwoJcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAoIShhY2NlcHRzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMgKSkpCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBhY2NlcHRzb2NrLT5zZWxlY3QuZmQgICAgICA9IGFjY2VwdGZkOwogICAgYWNjZXB0c29jay0+c2VsZWN0LmZ1bmMgICAgPSBzb2NrX3NlbGVjdF9ldmVudDsKICAgIGFjY2VwdHNvY2stPnNlbGVjdC5wcml2YXRlID0gc29jazsKICAgIGFjY2VwdHNvY2stPnN0YXRlICAgICAgICAgID0gV1NfRkRfQ09OTkVDVEVEfFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEU7CiAgICBhY2NlcHRzb2NrLT5tYXNrICAgICAgICAgICA9IHNvY2stPm1hc2s7CiAgICBhY2NlcHRzb2NrLT5obWFzayAgICAgICAgICA9IDA7CiAgICBhY2NlcHRzb2NrLT5wbWFzayAgICAgICAgICA9IDA7CiAgICBhY2NlcHRzb2NrLT5ldmVudCAgICAgICAgICA9IChzdHJ1Y3QgZXZlbnQgKilncmFiX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgIHJlZ2lzdGVyX3NlbGVjdF91c2VyKCAmYWNjZXB0c29jay0+c2VsZWN0ICk7CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuICZhY2NlcHRzb2NrLT5vYmo7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCkKewogICAgc3dpdGNoIChlcnJubykKICAgIHsKICAgICAgICBjYXNlIEVJTlRSOiAgICAgICAgICAgICBzZXRfZXJyb3IoV1NBRUlOVFIpO2JyZWFrOwogICAgICAgIGNhc2UgRUJBREY6ICAgICAgICAgICAgIHNldF9lcnJvcihXU0FFQkFERik7YnJlYWs7CiAgICAgICAgY2FzZSBFUEVSTToKICAgICAgICBjYXNlIEVBQ0NFUzogICAgICAgICAgICBzZXRfZXJyb3IoV1NBRUFDQ0VTKTticmVhazsKICAgICAgICBjYXNlIEVGQVVMVDogICAgICAgICAgICBzZXRfZXJyb3IoV1NBRUZBVUxUKTticmVhazsKICAgICAgICBjYXNlIEVJTlZBTDogICAgICAgICAgICBzZXRfZXJyb3IoV1NBRUlOVkFMKTticmVhazsKICAgICAgICBjYXNlIEVNRklMRTogICAgICAgICAgICBzZXRfZXJyb3IoV1NBRU1GSUxFKTticmVhazsKICAgICAgICBjYXNlIEVXT1VMREJMT0NLOiAgICAgICBzZXRfZXJyb3IoV1NBRVdPVUxEQkxPQ0spO2JyZWFrOwogICAgICAgIGNhc2UgRUlOUFJPR1JFU1M6ICAgICAgIHNldF9lcnJvcihXU0FFSU5QUk9HUkVTUyk7YnJlYWs7CiAgICAgICAgY2FzZSBFQUxSRUFEWTogICAgICAgICAgc2V0X2Vycm9yKFdTQUVBTFJFQURZKTticmVhazsKICAgICAgICBjYXNlIEVOT1RTT0NLOiAgICAgICAgICBzZXRfZXJyb3IoV1NBRU5PVFNPQ0spO2JyZWFrOwogICAgICAgIGNhc2UgRURFU1RBRERSUkVROiAgICAgIHNldF9lcnJvcihXU0FFREVTVEFERFJSRVEpO2JyZWFrOwogICAgICAgIGNhc2UgRU1TR1NJWkU6ICAgICAgICAgIHNldF9lcnJvcihXU0FFTVNHU0laRSk7YnJlYWs7CiAgICAgICAgY2FzZSBFUFJPVE9UWVBFOiAgICAgICAgc2V0X2Vycm9yKFdTQUVQUk9UT1RZUEUpO2JyZWFrOwogICAgICAgIGNhc2UgRU5PUFJPVE9PUFQ6ICAgICAgIHNldF9lcnJvcihXU0FFTk9QUk9UT09QVCk7YnJlYWs7CiAgICAgICAgY2FzZSBFUFJPVE9OT1NVUFBPUlQ6ICAgc2V0X2Vycm9yKFdTQUVQUk9UT05PU1VQUE9SVCk7YnJlYWs7CiAgICAgICAgY2FzZSBFU09DS1ROT1NVUFBPUlQ6ICAgc2V0X2Vycm9yKFdTQUVTT0NLVE5PU1VQUE9SVCk7YnJlYWs7CiAgICAgICAgY2FzZSBFT1BOT1RTVVBQOiAgICAgICAgc2V0X2Vycm9yKFdTQUVPUE5PVFNVUFApO2JyZWFrOwogICAgICAgIGNhc2UgRVBGTk9TVVBQT1JUOiAgICAgIHNldF9lcnJvcihXU0FFUEZOT1NVUFBPUlQpO2JyZWFrOwogICAgICAgIGNhc2UgRUFGTk9TVVBQT1JUOiAgICAgIHNldF9lcnJvcihXU0FFQUZOT1NVUFBPUlQpO2JyZWFrOwogICAgICAgIGNhc2UgRUFERFJJTlVTRTogICAgICAgIHNldF9lcnJvcihXU0FFQUREUklOVVNFKTticmVhazsKICAgICAgICBjYXNlIEVBRERSTk9UQVZBSUw6ICAgICBzZXRfZXJyb3IoV1NBRUFERFJOT1RBVkFJTCk7YnJlYWs7CiAgICAgICAgY2FzZSBFTkVURE9XTjogICAgICAgICAgc2V0X2Vycm9yKFdTQUVORVRET1dOKTticmVhazsKICAgICAgICBjYXNlIEVORVRVTlJFQUNIOiAgICAgICBzZXRfZXJyb3IoV1NBRU5FVFVOUkVBQ0gpO2JyZWFrOwogICAgICAgIGNhc2UgRU5FVFJFU0VUOiAgICAgICAgIHNldF9lcnJvcihXU0FFTkVUUkVTRVQpO2JyZWFrOwogICAgICAgIGNhc2UgRUNPTk5BQk9SVEVEOiAgICAgIHNldF9lcnJvcihXU0FFQ09OTkFCT1JURUQpO2JyZWFrOwogICAgICAgIGNhc2UgRVBJUEU6CiAgICAgICAgY2FzZSBFQ09OTlJFU0VUOiAgICAgICAgc2V0X2Vycm9yKFdTQUVDT05OUkVTRVQpO2JyZWFrOwogICAgICAgIGNhc2UgRU5PQlVGUzogICAgICAgICAgIHNldF9lcnJvcihXU0FFTk9CVUZTKTticmVhazsKICAgICAgICBjYXNlIEVJU0NPTk46ICAgICAgICAgICBzZXRfZXJyb3IoV1NBRUlTQ09OTik7YnJlYWs7CiAgICAgICAgY2FzZSBFTk9UQ09OTjogICAgICAgICAgc2V0X2Vycm9yKFdTQUVOT1RDT05OKTticmVhazsKICAgICAgICBjYXNlIEVTSFVURE9XTjogICAgICAgICBzZXRfZXJyb3IoV1NBRVNIVVRET1dOKTticmVhazsKICAgICAgICBjYXNlIEVUT09NQU5ZUkVGUzogICAgICBzZXRfZXJyb3IoV1NBRVRPT01BTllSRUZTKTticmVhazsKICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgICAgICBzZXRfZXJyb3IoV1NBRVRJTUVET1VUKTticmVhazsKICAgICAgICBjYXNlIEVDT05OUkVGVVNFRDogICAgICBzZXRfZXJyb3IoV1NBRUNPTk5SRUZVU0VEKTticmVhazsKICAgICAgICBjYXNlIEVMT09QOiAgICAgICAgICAgICBzZXRfZXJyb3IoV1NBRUxPT1ApO2JyZWFrOwogICAgICAgIGNhc2UgRU5BTUVUT09MT05HOiAgICAgIHNldF9lcnJvcihXU0FFTkFNRVRPT0xPTkcpO2JyZWFrOwogICAgICAgIGNhc2UgRUhPU1RET1dOOiAgICAgICAgIHNldF9lcnJvcihXU0FFSE9TVERPV04pO2JyZWFrOwogICAgICAgIGNhc2UgRUhPU1RVTlJFQUNIOiAgICAgIHNldF9lcnJvcihXU0FFSE9TVFVOUkVBQ0gpO2JyZWFrOwogICAgICAgIGNhc2UgRU5PVEVNUFRZOiAgICAgICAgIHNldF9lcnJvcihXU0FFTk9URU1QVFkpO2JyZWFrOwojaWZkZWYgRVBST0NMSU0KICAgICAgICBjYXNlIEVQUk9DTElNOiAgICAgICAgICBzZXRfZXJyb3IoV1NBRVBST0NMSU0pO2JyZWFrOwojZW5kaWYKI2lmZGVmIEVVU0VSUwogICAgICAgIGNhc2UgRVVTRVJTOiAgICAgICAgICAgIHNldF9lcnJvcihXU0FFVVNFUlMpO2JyZWFrOwojZW5kaWYKI2lmZGVmIEVEUVVPVAogICAgICAgIGNhc2UgRURRVU9UOiAgICAgICAgICAgIHNldF9lcnJvcihXU0FFRFFVT1QpO2JyZWFrOwojZW5kaWYKI2lmZGVmIEVTVEFMRQogICAgICAgIGNhc2UgRVNUQUxFOiAgICAgICAgICAgIHNldF9lcnJvcihXU0FFU1RBTEUpO2JyZWFrOwojZW5kaWYKI2lmZGVmIEVSRU1PVEUKICAgICAgICBjYXNlIEVSRU1PVEU6ICAgICAgICAgICBzZXRfZXJyb3IoV1NBRVJFTU9URSk7YnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDogICAgICAgIHBlcnJvcigic29ja19zZXRfZXJyb3IiKTsgc2V0X2Vycm9yKCBFUlJPUl9VTktOT1dOICk7IGJyZWFrOwogICAgfQp9CgovKiBjcmVhdGUgYSBzb2NrZXQgKi8KREVDTF9IQU5ETEVSKGNyZWF0ZV9zb2NrZXQpCnsKICAgIHN0cnVjdCBvYmplY3QgKm9iajsKICAgIGludCBzID0gLTE7CgogICAgaWYgKChvYmogPSBjcmVhdGVfc29ja2V0KCByZXEtPmZhbWlseSwgcmVxLT50eXBlLCByZXEtPnByb3RvY29sICkpICE9IE5VTEwpCiAgICB7CiAgICAgICAgcyA9IGFsbG9jX2hhbmRsZSggY3VycmVudC0+cHJvY2Vzcywgb2JqLCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0ICk7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9iaiApOwogICAgfQogICAgcmVxLT5oYW5kbGUgPSBzOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKi8KREVDTF9IQU5ETEVSKGFjY2VwdF9zb2NrZXQpCnsKICAgIHN0cnVjdCBvYmplY3QgKm9iajsKICAgIGludCBzID0gLTE7CgogICAgaWYgKChvYmogPSBhY2NlcHRfc29ja2V0KCByZXEtPmxoYW5kbGUgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICBzID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIHJlcS0+YWNjZXNzLCByZXEtPmluaGVyaXQgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggb2JqICk7CiAgICB9CiAgICByZXEtPmhhbmRsZSA9IHM7Cn0KCi8qIHNldCBzb2NrZXQgZXZlbnQgcGFyYW1ldGVycyAqLwpERUNMX0hBTkRMRVIoc2V0X3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBzdHJ1Y3QgZXZlbnQgKm9ldmVudDsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQoJcmV0dXJuOwogICAgb2V2ZW50ID0gc29jay0+ZXZlbnQ7CiAgICBzb2NrLT5tYXNrICAgID0gcmVxLT5tYXNrOwogICAgc29jay0+ZXZlbnQgICA9IGdldF9ldmVudF9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+ZXZlbnQsIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFICk7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBpZiAoc29jay0+bWFzaykKICAgICAgICBzb2NrLT5zdGF0ZSB8PSBXU19GRF9OT05CTE9DS0lORzsKICAgIGlmIChvZXZlbnQpCiAgICB7CiAgICAJaWYgKG9ldmVudCAhPSBzb2NrLT5ldmVudCkKICAgICAgICAgICAgLyogaWYgdGhlIHNlcnZpY2UgdGhyZWFkIHdhcyB3YWl0aW5nIGZvciB0aGUgb2xkIGV2ZW50IG9iamVjdCwKICAgICAgICAgICAgICogd2Ugc2hvdWxkIG5vdyBzaWduYWwgaXQsIHRvIGxldCB0aGUgc2VydmljZSB0aHJlYWQKICAgICAgICAgICAgICogb2JqZWN0IGRldGVjdCB0aGF0IGl0IGlzIG5vdyBvcnBoYW5lZC4uLiAqLwogICAgICAgICAgICBzZXRfZXZlbnQoIG9ldmVudCApOwogICAgICAgIC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvZXZlbnQgKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIGdldCBzb2NrZXQgZXZlbnQgcGFyYW1ldGVycyAqLwpERUNMX0hBTkRMRVIoZ2V0X3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MscmVxLT5oYW5kbGUsR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKICAgIHsKCXJlcS0+bWFzayAgPSAwOwoJcmVxLT5wbWFzayA9IDA7CglyZXEtPnN0YXRlID0gMDsKCXNldF9lcnJvcihXU0FFTk9UU09DSyk7CglyZXR1cm47CiAgICB9CiAgICByZXEtPm1hc2sgICAgPSBzb2NrLT5tYXNrOwogICAgcmVxLT5wbWFzayAgID0gc29jay0+cG1hc2s7CiAgICByZXEtPnN0YXRlICAgPSBzb2NrLT5zdGF0ZTsKICAgIG1lbWNweShyZXEtPmVycm9ycywgc29jay0+ZXJyb3JzLCBzaXplb2Yoc29jay0+ZXJyb3JzKSk7CiAgICBjbGVhcl9lcnJvcigpOwogICAgaWYgKHJlcS0+c2VydmljZSkKICAgIHsKICAgICAgICBpZiAocmVxLT5zX2V2ZW50KQogICAgICAgIHsKICAgICAgICAgICAgc3RydWN0IGV2ZW50ICpzZXZlbnQgPSBnZXRfZXZlbnRfb2JqKGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+c19ldmVudCwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUpOwogICAgICAgICAgICBpZiAoc2V2ZW50ID09IHNvY2stPmV2ZW50KQogICAgICAgICAgICAgICAgcmVxLT5zX2V2ZW50ID0gMDsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNldmVudCApOwogICAgICAgIH0KICAgICAgICBpZiAoIXJlcS0+c19ldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrID0gMDsKICAgICAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgICAgIH0KICAgICAgICBlbHNlIHNldF9lcnJvcihXU0FFSU5WQUwpOwogICAgfQogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogcmUtZW5hYmxlIHBlbmRpbmcgc29ja2V0IGV2ZW50cyAqLwpERUNMX0hBTkRMRVIoZW5hYmxlX3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MscmVxLT5oYW5kbGUsR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKICAgIAlyZXR1cm47CiAgICBzb2NrLT5wbWFzayAmPSB+cmVxLT5tYXNrOyAvKiBpcyB0aGlzIHNhZmU/ICovCiAgICBzb2NrLT5obWFzayAmPSB+cmVxLT5tYXNrOwogICAgc29jay0+c3RhdGUgfD0gcmVxLT5zc3RhdGU7CiAgICBzb2NrLT5zdGF0ZSAmPSB+cmVxLT5jc3RhdGU7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9Cg==