Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CiAqCiAqIFRoaXMgdmVyc2lvbiBvZiBpbnNtb2Qgc3VwcG9ydHMgQVJNLCBDUklTLCBIOC8zMDAsIHg4NiwgaWE2NCwgeDg2XzY0LAogKiBtNjhrLCBNSVBTLCBQb3dlclBDLCBTMzkwLCBTSDMvNC81LCBTcGFyYywgdjg1MGUsIGFuZCB4ODZfNjQuCiAqCiAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KICogYW5kIFJvbiBBbGRlciA8YWxkZXJAbGluZW8uY29tPgogKgogKiBSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+IDE3LUF1Zy0yMDA0LgogKiAgIEFkZGVkIHg4Nl82NCBzdXBwb3J0LgogKgogKiBNaWxlcyBCYWRlciA8bWlsZXNAZ251Lm9yZz4gYWRkZWQgTkVDIFY4NTBFIHN1cHBvcnQuCiAqCiAqIE1vZGlmaWVkIGJ5IEJyeWFuIFJpdHRtZXllciA8YnJ5YW5AaXhpYWNvbS5jb20+IHRvIHN1cHBvcnQgU0g0CiAqIGFuZCAodGhlb3JldGljYWxseSkgU0gzLiBJIGhhdmUgb25seSB0ZXN0ZWQgU0g0IGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KICoKICogTW9kaWZpZWQgYnkgQWxjb3ZlLCBKdWxpZW4gR2F1bG1pbiA8anVsaWVuLmdhdWxtaW5AYWxjb3ZlLmZyPiBhbmQKICogTmljb2xhcyBGZXJyZSA8bmljb2xhcy5mZXJyZUBhbGNvdmUuZnI+IHRvIHN1cHBvcnQgQVJNN1RETUkuICBPbmx5CiAqIHZlcnkgbWlub3IgY2hhbmdlcyByZXF1aXJlZCB0byBhbHNvIHdvcmsgd2l0aCBTdHJvbmdBcm0gYW5kIHByZXN1bWFibHkKICogYWxsIEFSTSBiYXNlZCBzeXN0ZW1zLgogKgogKiBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+IDE5LU1heS0yMDA0LgogKiAgIGFkZGVkIFJlbmVzYXMgSDgvMzAwIHN1cHBvcnQuCiAqCiAqIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+IDA4LUF1Zy0yMDAzLgogKiAgIEludGVncmF0ZWQgc3VwcG9ydCBmb3Igc2g2NCAoU0gtNSksIGZyb20gcHJlbGltaW5hcnkgbW9kdXRpbHMKICogICBwYXRjaGVzIGZyb20gQmVuZWRpY3QgR2FzdGVyIDxiZW5lZGljdC5nYXN0ZXJAc3VwZXJoLmNvbT4uCiAqICAgQ3VycmVudGx5IGxpbWl0ZWQgdG8gc3VwcG9ydCBmb3IgMzJiaXQgQUJJLgogKgogKiBNYWdudXMgRGFtbSA8ZGFtbUBvcGVuc291cmNlLnNlPiAyMi1NYXktMjAwMi4KICogICBUaGUgcGx0IGFuZCBnb3QgY29kZSBhcmUgbm93IHVzaW5nIHRoZSBzYW1lIHN0cnVjdHMuCiAqICAgQWRkZWQgZ2VuZXJpYyBsaW5rZWQgbGlzdCBjb2RlIHRvIGZ1bGx5IHN1cHBvcnQgUG93ZXJQQy4KICogICBSZXBsYWNlZCB0aGUgbWVzcyBpbiBhcmNoX2FwcGx5X3JlbG9jYXRpb24oKSB3aXRoIGFyY2hpdGVjdHVyZSBibG9ja3MuCiAqICAgVGhlIGFyY2hfY3JlYXRlX2dvdCgpIGZ1bmN0aW9uIGdvdCBjbGVhbmVkIHVwIHdpdGggYXJjaGl0ZWN0dXJlIGJsb2Nrcy4KICogICBUaGVzZSBibG9ja3Mgc2hvdWxkIGJlIGVhc3kgbWFpbnRhaW4gYW5kIHN5bmMgd2l0aCBvYmpfeHh4LmMgaW4gbW9kdXRpbHMuCiAqCiAqIE1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+IGFkZGVkIFBvd2VyUEMgc3VwcG9ydCAyMC1GZWItMjAwMS4KICogICBQb3dlclBDIHNwZWNpZmljIGNvZGUgc3RvbGVuIGZyb20gbW9kdXRpbHMtMi4zLjE2LAogKiAgIHdyaXR0ZW4gYnkgUGF1bCBNYWNrZXJyYXMsIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCiAqICAgSSd2ZSBvbmx5IHRlc3RlZCB0aGUgY29kZSBvbiBtcGM4eHggcGxhdGZvcm1zIGluIGJpZy1lbmRpYW4gbW9kZS4KICogICBEaWQgc29tZSBjbGVhbnVwIGFuZCBhZGRlZCBVU0VfeHh4X0VOVFJJRVMuLi4KICoKICogUXVpbm4gSmVuc2VuIDxqZW5zZW5xQGxpbmVvLmNvbT4gYWRkZWQgTUlQUyBzdXBwb3J0IDIzLUZlYi0yMDAxLgogKiAgIGJhc2VkIG9uIG1vZHV0aWxzLTIuNC4yCiAqICAgTUlQUyBzcGVjaWZpYyBzdXBwb3J0IGZvciBFbGYgbG9hZGluZyBhbmQgcmVsb2NhdGlvbi4KICogICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgogKiAgIENvbnRyaWJ1dGVkIGJ5IFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT4KICoKICogQmFzZWQgYWxtb3N0IGVudGlyZWx5IG9uIHRoZSBMaW51eCBtb2R1dGlscy0yLjMuMTEgaW1wbGVtZW50YXRpb24uCiAqICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KICogICBOZXcgaW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KICogICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KICogICBSZXN0cnVjdHVyZWQgKGFuZCBwYXJ0bHkgcmV3cml0dGVuKSBieToKICogICBCavZybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+IEZlYnJ1YXJ5IDE5OTkKICoKICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyB0YXJiYWxsIGZvciBkZXRhaWxzLgogKi8KCiNpbmNsdWRlICJsaWJiYi5oIgojaW5jbHVkZSA8bGliZ2VuLmg+CiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgoKI2lmICFFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUyAmJiAhRU5BQkxFX0ZFQVRVUkVfMl82X01PRFVMRVMKI3VuZGVmIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTCiNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMgMQojZW5kaWYKCi8qCiAqIEJpZyBwaWVjZSBvZiAyLjQtc3BlY2lmaWMgY29kZQogKi8KI2lmIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTCgojaWYgRU5BQkxFX0ZFQVRVUkVfMl82X01PRFVMRVMKc3RhdGljIGludCBpbnNtb2RfbmdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwojZW5kaWYKCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTQojZGVmaW5lIExPQURCSVRTIDAKI2Vsc2UKI2RlZmluZSBMT0FEQklUUyAxCiNlbmRpZgoKLyogQWxwaGEgKi8KI2lmIGRlZmluZWQoX19hbHBoYV9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQUxQSEEpCiNkZWZpbmUgU0hUX1JFTE0gICAgICAgU0hUX1JFTEEKI2RlZmluZSBFbGY2NF9SZWxNICAgICBFbGY2NF9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAojZW5kaWYKCi8qIEFSTSBzdXBwb3J0ICovCiNpZiBkZWZpbmVkKF9fYXJtX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9BUk0pCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTAojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2RlZmluZSBVU0VfUExUX0VOVFJJRVMKI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CiNkZWZpbmUgVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAojZGVmaW5lIFVTRV9TSU5HTEUKI2VuZGlmCgovKiBibGFja2ZpbiAqLwojaWYgZGVmaW5lZChCRklOKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQkxBQ0tGSU4pCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZW5kaWYKCi8qIENSSVMgKi8KI2lmIGRlZmluZWQoX19jcmlzX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9DUklTKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2lmbmRlZiBFTV9DUklTCiNkZWZpbmUgRU1fQ1JJUyA3NgojZGVmaW5lIFJfQ1JJU19OT05FIDAKI2RlZmluZSBSX0NSSVNfMzIgICAzCiNlbmRpZgojZW5kaWYKCi8qIEg4LzMwMCAqLwojaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9IOF8zMDApCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZGVmaW5lIFVTRV9TSU5HTEUKI2RlZmluZSBTWU1CT0xfUFJFRklYCSJfIgojZW5kaWYKCi8qIFBBLVJJU0MgLyBIUC1QQSAqLwojaWYgZGVmaW5lZChfX2hwcGFfXykKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1BBUklTQykKI2RlZmluZSBTSFRfUkVMTSAgICAgICBTSFRfUkVMQQojaWYgZGVmaW5lZChfX0xQNjRfXykKI2RlZmluZSBFbGY2NF9SZWxNICAgICBFbGY2NF9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAojZWxzZQojZGVmaW5lIEVsZjMyX1JlbE0gICAgIEVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00gICAgICBFTEZDTEFTUzMyCiNlbmRpZgojZW5kaWYKCi8qIHg4NiAqLwojaWYgZGVmaW5lZChfX2kzODZfXykKI2lmbmRlZiBFTV80ODYKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNXzM4NikKI2Vsc2UKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNXzM4NiB8fCB4ID09IEVNXzQ4NikKI2VuZGlmCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTAojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CiNkZWZpbmUgVVNFX1NJTkdMRQojZW5kaWYKCi8qIElBNjQsIGFrYSBJdGFuaXVtICovCiNpZiBkZWZpbmVkKF9faWE2NF9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fSUFfNjQpCiNkZWZpbmUgU0hUX1JFTE0gICAgICAgU0hUX1JFTEEKI2RlZmluZSBFbGY2NF9SZWxNICAgICBFbGY2NF9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAojZW5kaWYKCi8qIG02OGsgKi8KI2lmIGRlZmluZWQoX19tYzY4MDAwX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV82OEspCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZGVmaW5lIFVTRV9HT1RfRU5UUklFUwojZGVmaW5lIEdPVF9FTlRSWV9TSVpFIDQKI2RlZmluZSBVU0VfU0lOR0xFCiNlbmRpZgoKLyogTWljcm9ibGF6ZSAqLwojaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKI2RlZmluZSBVU0VfU0lOR0xFCiNpbmNsdWRlIDxsaW51eC9lbGYtZW0uaD4KI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1hJTElOWF9NSUNST0JMQVpFKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2VuZGlmCgovKiBNSVBTICovCiNpZiBkZWZpbmVkKF9fbWlwc19fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fTUlQUyB8fCB4ID09IEVNX01JUFNfUlMzX0xFKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUwKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbAojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCi8qIEFjY291bnQgZm9yIEVMRiBzcGVjIGNoYW5nZXMuICAqLwojaWZuZGVmIEVNX01JUFNfUlMzX0xFCiNpZmRlZiBFTV9NSVBTX1JTNF9CRQojZGVmaW5lIEVNX01JUFNfUlMzX0xFCUVNX01JUFNfUlM0X0JFCiNlbHNlCiNkZWZpbmUgRU1fTUlQU19SUzNfTEUJMTAKI2VuZGlmCiNlbmRpZiAvKiAhRU1fTUlQU19SUzNfTEUgKi8KI2RlZmluZSBBUkNIREFUQU0gICAgICAgIl9fZGJlX3RhYmxlIgojZW5kaWYKCi8qIE5pb3MgSUkgKi8KI2lmIGRlZmluZWQoX19uaW9zMl9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQUxURVJBX05JT1MyKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2VuZGlmCgovKiBQb3dlclBDICovCiNpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9QUEM2NCkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjY0X1JlbE0JRWxmNjRfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzY0CiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9QUEMpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZGVmaW5lIFVTRV9QTFRfRU5UUklFUwojZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2CiNkZWZpbmUgVVNFX1BMVF9MSVNUCiNkZWZpbmUgTElTVF9BUkNIVFlQRSBFbGZXKEFkZHIpCiNkZWZpbmUgVVNFX0xJU1QKI2RlZmluZSBBUkNIREFUQU0gICAgICAgIl9fZnRyX2ZpeHVwIgojZW5kaWYKCi8qIFMzOTAgKi8KI2lmIGRlZmluZWQoX19zMzkwX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9TMzkwKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2RlZmluZSBVU0VfUExUX0VOVFJJRVMKI2RlZmluZSBQTFRfRU5UUllfU0laRSA4CiNkZWZpbmUgVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAojZGVmaW5lIFVTRV9TSU5HTEUKI2VuZGlmCgovKiBTdXBlckggKi8KI2lmIGRlZmluZWQoX19zaF9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fU0gpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZGVmaW5lIFVTRV9HT1RfRU5UUklFUwojZGVmaW5lIEdPVF9FTlRSWV9TSVpFIDQKI2RlZmluZSBVU0VfU0lOR0xFCi8qIHRoZSBTSCBjaGFuZ2VzIGhhdmUgb25seSBiZWVuIHRlc3RlZCBpbiA9bGl0dGxlIGVuZGlhbj0gbW9kZSAqLwovKiBJJ20gbm90IHN1cmUgYWJvdXQgYmlnIGVuZGlhbiwgc28gbGV0J3Mgd2FybjogKi8KI2lmIGRlZmluZWQoX19zaF9fKSAmJiBCQl9CSUdfRU5ESUFOCiMgZXJyb3IgaW5zbW9kLmMgbWF5IHJlcXVpcmUgY2hhbmdlcyBmb3IgdXNlIG9uIGJpZyBlbmRpYW4gU0gKI2VuZGlmCi8qIGl0IG1heSBvciBtYXkgbm90IHdvcmsgb24gdGhlIFNIMS9TSDIuLi4gRXJyb3Igb24gdGhvc2UgYWxzbyAqLwojaWYgKCghKGRlZmluZWQoX19TSDNfXykgfHwgZGVmaW5lZChfX1NINF9fKSB8fCBkZWZpbmVkKF9fU0g1X18pKSkpICYmIChkZWZpbmVkKF9fc2hfXykpCiNlcnJvciBpbnNtb2QuYyBtYXkgcmVxdWlyZSBjaGFuZ2VzIGZvciBTSDEgb3IgU0gyIHVzZQojZW5kaWYKI2VuZGlmCgovKiBTcGFyYyAqLwojaWYgZGVmaW5lZChfX3NwYXJjX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9TUEFSQykKI2RlZmluZSBTSFRfUkVMTSAgICAgICBTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0gICAgIEVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00gICAgICBFTEZDTEFTUzMyCiNlbmRpZgoKLyogdjg1MGUgKi8KI2lmIGRlZmluZWQoX192ODUwZV9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKCh4KSA9PSBFTV9WODUwIHx8ICh4KSA9PSBFTV9DWUdOVVNfVjg1MCkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNkZWZpbmUgVVNFX1BMVF9FTlRSSUVTCiNkZWZpbmUgUExUX0VOVFJZX1NJWkUgOAojZGVmaW5lIFVTRV9TSU5HTEUKI2lmbmRlZiBFTV9DWUdOVVNfVjg1MAkvKiBncnVtYmxlICovCiNkZWZpbmUgRU1fQ1lHTlVTX1Y4NTAJMHg5MDgwCiNlbmRpZgojZGVmaW5lIFNZTUJPTF9QUkVGSVgJIl8iCiNlbmRpZgoKLyogWDg2XzY0ICAqLwojaWYgZGVmaW5lZChfX3g4Nl82NF9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fWDg2XzY0KQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAojZGVmaW5lIFVTRV9TSU5HTEUKI2RlZmluZSBFbGY2NF9SZWxNCUVsZjY0X1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1M2NAojZW5kaWYKCiNpZm5kZWYgU0hUX1JFTE0KI2Vycm9yIFNvcnJ5LCBidXQgaW5zbW9kLmMgZG9lcyBub3QgeWV0IHN1cHBvcnQgdGhpcyBhcmNoaXRlY3R1cmUuLi4KI2VuZGlmCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLS0tLS0tLS1tb2R1dGlscyBtb2R1bGUuaCwgbGluZXMgNDUtMjQyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBMaW51eCBtb2R1bGUgc3lzY2FsbCBpbnRlcmZhY2UuCiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCgogICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgoKICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IG1vZHV0aWxzLgoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KCgojaWZuZGVmIE1PRFVUSUxTX01PRFVMRV9ICgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBGb3Igc2l6ZW9mKCkgd2hpY2ggYXJlIHJlbGF0ZWQgdG8gdGhlIG1vZHVsZSBwbGF0Zm9ybSBhbmQgbm90IHRvIHRoZQogICBlbnZpcm9ubWVudCBpc25tb2QgaXMgcnVubmluZyBpbiwgdXNlIHNpemVvZl94eCBpbnN0ZWFkIG9mIHNpemVvZih4eCkuICAqLwoKI2RlZmluZSB0Z3Rfc2l6ZW9mX2NoYXIJCXNpemVvZihjaGFyKQojZGVmaW5lIHRndF9zaXplb2Zfc2hvcnQJc2l6ZW9mKHNob3J0KQojZGVmaW5lIHRndF9zaXplb2ZfaW50CQlzaXplb2YoaW50KQojZGVmaW5lIHRndF9zaXplb2ZfbG9uZwkJc2l6ZW9mKGxvbmcpCiNkZWZpbmUgdGd0X3NpemVvZl9jaGFyX3AJc2l6ZW9mKGNoYXIgKikKI2RlZmluZSB0Z3Rfc2l6ZW9mX3ZvaWRfcAlzaXplb2Yodm9pZCAqKQojZGVmaW5lIHRndF9sb25nCQlsb25nCgojaWYgZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykgJiYgZGVmaW5lZChBUkNIX3NwYXJjNjQpCiN1bmRlZiB0Z3Rfc2l6ZW9mX2xvbmcKI3VuZGVmIHRndF9zaXplb2ZfY2hhcl9wCiN1bmRlZiB0Z3Rfc2l6ZW9mX3ZvaWRfcAojdW5kZWYgdGd0X2xvbmcKZW51bSB7Cgl0Z3Rfc2l6ZW9mX2xvbmcgPSA4LAoJdGd0X3NpemVvZl9jaGFyX3AgPSA4LAoJdGd0X3NpemVvZl92b2lkX3AgPSA4Cn07CiNkZWZpbmUgdGd0X2xvbmcJCWxvbmcgbG9uZwojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qIFRoZSBzdHJ1Y3R1cmVzIHVzZWQgaW4gTGludXggMi4xLiAgKi8KCi8qIE5vdGU6IG5ld19tb2R1bGVfc3ltYm9sIGRvZXMgbm90IHVzZSB0Z3RfbG9uZyBpbnRlbnRpb25hbGx5ICovCnN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCB7Cgl1bnNpZ25lZCBsb25nIHZhbHVlOwoJdW5zaWduZWQgbG9uZyBuYW1lOwp9OwoKc3RydWN0IG5ld19tb2R1bGVfcGVyc2lzdDsKCnN0cnVjdCBuZXdfbW9kdWxlX3JlZiB7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBkZXA7CQkvKiBrZXJuZWwgYWRkcmVzc2VzICovCgl1bnNpZ25lZCB0Z3RfbG9uZyByZWY7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBuZXh0X3JlZjsKfTsKCnN0cnVjdCBuZXdfbW9kdWxlIHsKCXVuc2lnbmVkIHRndF9sb25nIHNpemVfb2Zfc3RydWN0OwkvKiA9PSBzaXplb2YobW9kdWxlKSAqLwoJdW5zaWduZWQgdGd0X2xvbmcgbmV4dDsKCXVuc2lnbmVkIHRndF9sb25nIG5hbWU7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBzaXplOwoKCXRndF9sb25nIHVzZWNvdW50OwoJdW5zaWduZWQgdGd0X2xvbmcgZmxhZ3M7CQkvKiBBVVRPQ0xFQU4gZXQgYWwgKi8KCgl1bnNpZ25lZCBuc3ltczsKCXVuc2lnbmVkIG5kZXBzOwoKCXVuc2lnbmVkIHRndF9sb25nIHN5bXM7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBkZXBzOwoJdW5zaWduZWQgdGd0X2xvbmcgcmVmczsKCXVuc2lnbmVkIHRndF9sb25nIGluaXQ7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBjbGVhbnVwOwoJdW5zaWduZWQgdGd0X2xvbmcgZXhfdGFibGVfc3RhcnQ7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBleF90YWJsZV9lbmQ7CiNpZmRlZiBfX2FscGhhX18KCXVuc2lnbmVkIHRndF9sb25nIGdwOwojZW5kaWYKCS8qIEV2ZXJ5dGhpbmcgYWZ0ZXIgaGVyZSBpcyBleHRlbnNpb24uICAqLwoJdW5zaWduZWQgdGd0X2xvbmcgcGVyc2lzdF9zdGFydDsKCXVuc2lnbmVkIHRndF9sb25nIHBlcnNpc3RfZW5kOwoJdW5zaWduZWQgdGd0X2xvbmcgY2FuX3VubG9hZDsKCXVuc2lnbmVkIHRndF9sb25nIHJ1bnNpemU7Cgljb25zdCBjaGFyICprYWxsc3ltc19zdGFydDsgICAgIC8qIEFsbCBzeW1ib2xzIGZvciBrZXJuZWwgZGVidWdnaW5nICovCgljb25zdCBjaGFyICprYWxsc3ltc19lbmQ7Cgljb25zdCBjaGFyICphcmNoZGF0YV9zdGFydDsgICAgIC8qIGFyY2ggc3BlY2lmaWMgZGF0YSBmb3IgbW9kdWxlICovCgljb25zdCBjaGFyICphcmNoZGF0YV9lbmQ7Cgljb25zdCBjaGFyICprZXJuZWxfZGF0YTsgICAgICAgIC8qIFJlc2VydmVkIGZvciBrZXJuZWwgaW50ZXJuYWwgdXNlICovCn07CgojaWZkZWYgQVJDSERBVEFNCiNkZWZpbmUgQVJDSERBVEFfU0VDX05BTUUgQVJDSERBVEFNCiNlbHNlCiNkZWZpbmUgQVJDSERBVEFfU0VDX05BTUUgIl9fYXJjaGRhdGEiCiNlbmRpZgojZGVmaW5lIEtBTExTWU1TX1NFQ19OQU1FICJfX2thbGxzeW1zIgoKCnN0cnVjdCBuZXdfbW9kdWxlX2luZm8gewoJdW5zaWduZWQgbG9uZyBhZGRyOwoJdW5zaWduZWQgbG9uZyBzaXplOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWxvbmcgdXNlY291bnQ7Cn07CgovKiBCaXRzIG9mIG1vZHVsZS5mbGFncy4gICovCmVudW0gewoJTkVXX01PRF9SVU5OSU5HID0gMSwKCU5FV19NT0RfREVMRVRFRCA9IDIsCglORVdfTU9EX0FVVE9DTEVBTiA9IDQsCglORVdfTU9EX1ZJU0lURUQgPSA4LAoJTkVXX01PRF9VU0VEX09OQ0UgPSAxNgp9OwoKaW50IGluaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBuZXdfbW9kdWxlICopOwppbnQgcXVlcnlfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCB3aGljaCwgdm9pZCAqYnVmLAoJCXNpemVfdCBidWZzaXplLCBzaXplX3QgKnJldCk7CgovKiBWYWx1ZXMgZm9yIHF1ZXJ5X21vZHVsZSdzIHdoaWNoLiAgKi8KZW51bSB7CglRTV9NT0RVTEVTID0gMSwKCVFNX0RFUFMgPSAyLAoJUU1fUkVGUyA9IDMsCglRTV9TWU1CT0xTID0gNCwKCVFNX0lORk8gPSA1Cn07CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBUaGUgc3lzdGVtIGNhbGxzIHVuY2hhbmdlZCBiZXR3ZWVuIDIuMCBhbmQgMi4xLiAgKi8KCnVuc2lnbmVkIGxvbmcgY3JlYXRlX21vZHVsZShjb25zdCBjaGFyICosIHNpemVfdCk7CmludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKCgojZW5kaWYgLyogbW9kdWxlLmggKi8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLS0tZW5kIG9mIG1vZHV0aWxzIG1vZHVsZS5oCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8tLS0tLS0tLW1vZHV0aWxzIG9iai5oLCBsaW5lcyAyNTMtNDYyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyogRWxmIG9iamVjdCBmaWxlIGxvYWRpbmcgYW5kIHJlbG9jYXRpb24gcm91dGluZXMuCiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCgogICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgoKICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IG1vZHV0aWxzLgoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KCgojaWZuZGVmIE1PRFVUSUxTX09CSl9ICgovKiBUaGUgcmVsb2NhdGFibGUgb2JqZWN0IGlzIG1hbmlwdWxhdGVkIHVzaW5nIGVsZmluIHR5cGVzLiAgKi8KCiNpbmNsdWRlIDxlbGYuaD4KI2luY2x1ZGUgPGVuZGlhbi5oPgoKI2lmbmRlZiBFbGZXCiMgaWYgRUxGQ0xBU1NNID09IEVMRkNMQVNTMzIKIyAgZGVmaW5lIEVsZlcoeCkgIEVsZjMyXyAjIyB4CiMgIGRlZmluZSBFTEZXKHgpICBFTEYzMl8gIyMgeAojIGVsc2UKIyAgZGVmaW5lIEVsZlcoeCkgIEVsZjY0XyAjIyB4CiMgIGRlZmluZSBFTEZXKHgpICBFTEY2NF8gIyMgeAojIGVuZGlmCiNlbmRpZgoKLyogRm9yIHNvbWUgcmVhc29uIHRoaXMgaXMgbWlzc2luZyBmcm9tIHNvbWUgYW5jaWVudCBDIGxpYnJhcmllcy4uLi4gICovCiNpZm5kZWYgRUxGMzJfU1RfSU5GTwojIGRlZmluZSBFTEYzMl9TVF9JTkZPKGJpbmQsIHR5cGUpICAgICAgICgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4ZikpCiNlbmRpZgoKI2lmbmRlZiBFTEY2NF9TVF9JTkZPCiMgZGVmaW5lIEVMRjY0X1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKI2VuZGlmCgojZGVmaW5lIEVMRl9TVF9CSU5EKGluZm8pIEVMRlcoU1RfQklORCkoaW5mbykKI2RlZmluZSBFTEZfU1RfVFlQRShpbmZvKSBFTEZXKFNUX1RZUEUpKGluZm8pCiNkZWZpbmUgRUxGX1NUX0lORk8oYmluZCwgdHlwZSkgRUxGVyhTVF9JTkZPKShiaW5kLCB0eXBlKQojZGVmaW5lIEVMRl9SX1RZUEUodmFsKSBFTEZXKFJfVFlQRSkodmFsKQojZGVmaW5lIEVMRl9SX1NZTSh2YWwpIEVMRlcoUl9TWU0pKHZhbCkKCnN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoOwpzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaDsKCnN0cnVjdCBvYmpfc2VjdGlvbgp7CglFbGZXKFNoZHIpIGhlYWRlcjsKCWNvbnN0IGNoYXIgKm5hbWU7CgljaGFyICpjb250ZW50czsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqbG9hZF9uZXh0OwoJaW50IGlkeDsKfTsKCnN0cnVjdCBvYmpfc3ltYm9sCnsKCXN0cnVjdCBvYmpfc3ltYm9sICpuZXh0OwkvKiBoYXNoIHRhYmxlIGxpbmsgKi8KCWNvbnN0IGNoYXIgKm5hbWU7Cgl1bnNpZ25lZCBsb25nIHZhbHVlOwoJdW5zaWduZWQgbG9uZyBzaXplOwoJaW50IHNlY2lkeDsJCQkvKiB0aGUgZGVmaW5pbmcgc2VjdGlvbiBpbmRleC9tb2R1bGUgKi8KCWludCBpbmZvOwoJaW50IGtzeW1pZHg7CQkJLyogZm9yIGV4cG9ydCB0byB0aGUga2VybmVsIHN5bXRhYiAqLwoJaW50IHJlZmVyZW5jZWQ7CQkvKiBhY3R1YWxseSB1c2VkIGluIHRoZSBsaW5rICovCn07CgovKiBIYXJkY29kZSB0aGUgaGFzaCB0YWJsZSBzaXplLiAgV2Ugc2hvdWxkbid0IGJlIG5lZWRpbmcgc28gbWFueQogICBzeW1ib2xzIHRoYXQgd2UgYmVnaW4gdG8gZGVncmFkZSBwZXJmb3JtYW5jZSwgYW5kIHdlIGdldCBhIGJpZyB3aW4KICAgYnkgZ2l2aW5nIHRoZSBjb21waWxlciBhIGNvbnN0YW50IGRpdmlzb3IuICAqLwoKI2RlZmluZSBIQVNIX0JVQ0tFVFMgIDUyMQoKc3RydWN0IG9ial9maWxlIHsKCUVsZlcoRWhkcikgaGVhZGVyOwoJRWxmVyhBZGRyKSBiYXNlYWRkcjsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqKnNlY3Rpb25zOwoJc3RydWN0IG9ial9zZWN0aW9uICpsb2FkX29yZGVyOwoJc3RydWN0IG9ial9zZWN0aW9uICoqbG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQ7CglzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCAqc3RyaW5nX3BhdGNoZXM7CglzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqc3ltYm9sX3BhdGNoZXM7CglpbnQgKCpzeW1ib2xfY21wKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Cgl1bnNpZ25lZCBsb25nICgqc3ltYm9sX2hhc2gpKGNvbnN0IGNoYXIgKik7Cgl1bnNpZ25lZCBsb25nIGxvY2FsX3N5bXRhYl9zaXplOwoJc3RydWN0IG9ial9zeW1ib2wgKipsb2NhbF9zeW10YWI7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltdGFiW0hBU0hfQlVDS0VUU107Cn07CgplbnVtIG9ial9yZWxvYyB7CglvYmpfcmVsb2Nfb2ssCglvYmpfcmVsb2Nfb3ZlcmZsb3csCglvYmpfcmVsb2NfZGFuZ2Vyb3VzLAoJb2JqX3JlbG9jX3VuaGFuZGxlZAp9OwoKc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggewoJc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggKm5leHQ7CglpbnQgcmVsb2Nfc2VjaWR4OwoJRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CglFbGZXKEFkZHIpIHN0cmluZ19vZmZzZXQ7Cn07CgpzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCB7CglzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqbmV4dDsKCWludCByZWxvY19zZWNpZHg7CglFbGZXKEFkZHIpIHJlbG9jX29mZnNldDsKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cn07CgoKLyogR2VuZXJpYyBvYmplY3QgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLiAgKi8KCnN0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9lbGZfaGFzaChjb25zdCBjaGFyICopOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2VsZl9oYXNoX24oY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nIGxlbik7CgpzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKm9ial9maW5kX3N5bWJvbChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpOwoKc3RhdGljIEVsZlcoQWRkcikgb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkgIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pOwoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCnN0YXRpYyB2b2lkIG9ial9zZXRfc3ltYm9sX2NvbXBhcmUoc3RydWN0IG9ial9maWxlICpmLAoJCQkgICAgaW50ICgqY21wKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCgkJCSAgICB1bnNpZ25lZCBsb25nICgqaGFzaCkoY29uc3QgY2hhciAqKSk7CiNlbmRpZgoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2ZpbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJICAgY29uc3QgY2hhciAqbmFtZSk7CgpzdGF0aWMgdm9pZCBvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkgICAgc3RydWN0IG9ial9zZWN0aW9uICpzZWMpOwoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLAoJCQkJCQljb25zdCBjaGFyICpuYW1lLAoJCQkJCQl1bnNpZ25lZCBsb25nIGFsaWduLAoJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUpOwoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3Qoc3RydWN0IG9ial9maWxlICpmLAoJCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAoJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsaWduLAoJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOwoKc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYywgdW5zaWduZWQgbG9uZyBtb3JlKTsKCnN0YXRpYyB2b2lkIG9ial9zdHJpbmdfcGF0Y2goc3RydWN0IG9ial9maWxlICpmLCBpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIG9mZnNldCwKCQkgICAgIGNvbnN0IGNoYXIgKnN0cmluZyk7CgpzdGF0aWMgdm9pZCBvYmpfc3ltYm9sX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCgkJICAgICBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKTsKCnN0YXRpYyB2b2lkIG9ial9jaGVja191bmRlZmluZWRzKHN0cnVjdCBvYmpfZmlsZSAqZik7CgpzdGF0aWMgdm9pZCBvYmpfYWxsb2NhdGVfY29tbW9ucyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2xvYWRfc2l6ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOwoKc3RhdGljIGludCBvYmpfcmVsb2NhdGUoc3RydWN0IG9ial9maWxlICpmLCBFbGZXKEFkZHIpIGJhc2UpOwoKc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqb2JqX2xvYWQoRklMRSAqZiwgaW50IGxvYWRwcm9nYml0cyk7CgpzdGF0aWMgaW50IG9ial9jcmVhdGVfaW1hZ2Uoc3RydWN0IG9ial9maWxlICpmLCBjaGFyICppbWFnZSk7CgovKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLiAgKi8KCnN0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKmFyY2hfbmV3X2ZpbGUodm9pZCk7CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICphcmNoX25ld19zZWN0aW9uKHZvaWQpOwoKc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICphcmNoX25ld19zeW1ib2wodm9pZCk7CgpzdGF0aWMgZW51bSBvYmpfcmVsb2MgYXJjaF9hcHBseV9yZWxvY2F0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCSAgICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYywKCQkJCSAgICAgIC8qc3RydWN0IG9ial9zZWN0aW9uICpzeW1zZWMsKi8KCQkJCSAgICAgIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0sCgkJCQkgICAgICBFbGZXKFJlbE0pICpyZWwsIEVsZlcoQWRkcikgdmFsdWUpOwoKc3RhdGljIHZvaWQgYXJjaF9jcmVhdGVfZ290KHN0cnVjdCBvYmpfZmlsZSAqZik7CiNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQpzdGF0aWMgaW50IG9ial9ncGxfbGljZW5zZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKipsaWNlbnNlKTsKI2VuZGlmIC8qIEZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgKi8KI2VuZGlmIC8qIG9iai5oICovCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLS0tZW5kIG9mIG1vZHV0aWxzIG9iai5oCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8qIFNQRlggaXMgYWx3YXlzIGEgc3RyaW5nLCBzbyBpdCBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvIHN0cmluZyBjb25zdGFudHMuICAqLwojaWZkZWYgU1lNQk9MX1BSRUZJWAojZGVmaW5lIFNQRlgJU1lNQk9MX1BSRUZJWAojZWxzZQojZGVmaW5lIFNQRlgJIiIKI2VuZGlmCgplbnVtIHsgU1RSVkVSU0lPTkxFTiA9IDY0IH07CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2RlZmluZSBPUFRJT05fU1RSICJzTG86Zmt2cXgiIFVTRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgibSIpCmVudW0gewoJT1BUX3MgPSAweDEsIC8vIC1zIC8qIGxvZyB0byBzeXNsb2cgKi8KCQkvKiBOb3Qgc3VwcG9ydGVkIGJ1dCBrZXJuZWwgbmVlZHMgdGhpcyBmb3IgcmVxdWVzdF9tb2R1bGUoKSwKCQkgICBhcyB0aGlzIGNhbGxzOiBtb2Rwcm9iZSAtayAtcyAtLSA8bW9kdWxlPgoJCSAgIHNvIHNpbGVudGx5IGlnbm9yZSB0aGlzIGZsYWcgKi8KCU9QVF9MID0gMHgyLCAvLyAtTCAvKiBTdHViIHdhcm5pbmcgKi8KCQkvKiBDb21wYXRpYmlsaXR5IHdpdGggbW9kcHJvYmUuCgkJICAgSW4gdGhlb3J5LCB0aGlzIGRvZXMgbG9ja2luZywgYnV0IHdlIGRvbid0IGRvCgkJICAgdGhhdC4gIFNvIGJlIGNhcmVmdWwgYW5kIHBsYW4geW91ciBsaWZlIGFyb3VuZCBub3QKCQkgICBsb2FkaW5nIHRoZSBzYW1lIG1vZHVsZSA1MCB0aW1lcyBjb25jdXJyZW50bHkuICovCglPUFRfbyA9IDB4NCwgLy8gLW8gLyogbmFtZSB0aGUgb3V0cHV0IG1vZHVsZSAqLwoJT1BUX2YgPSAweDgsIC8vIC1mIC8qIGZvcmNlIGxvYWRpbmcgKi8KCU9QVF9rID0gMHgxMCwgLy8gLWsgLyogbW9kdWxlIGxvYWRlZCBieSBrZXJuZWxkLCBhdXRvLWNsZWFuYWJsZSAqLwoJT1BUX3YgPSAweDIwLCAvLyAtdiAvKiB2ZXJib3NlIG91dHB1dCAqLwoJT1BUX3EgPSAweDQwLCAvLyAtcSAvKiBzaWxlbnQgKi8KCU9QVF94ID0gMHg4MCwgLy8gLXggLyogZG8gbm90IGV4cG9ydCBleHRlcm5zICovCglPUFRfbSA9IDB4MTAwLCAvLyAtbSAvKiBwcmludCBtb2R1bGUgbG9hZCBtYXAgKi8KfTsKI2RlZmluZSBmbGFnX2ZvcmNlX2xvYWQgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZikKI2RlZmluZSBmbGFnX2F1dG9jbGVhbiAob3B0aW9uX21hc2szMiAmIE9QVF9rKQojZGVmaW5lIGZsYWdfdmVyYm9zZSAob3B0aW9uX21hc2szMiAmIE9QVF92KQojZGVmaW5lIGZsYWdfcXVpZXQgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcSkKI2RlZmluZSBmbGFnX25vZXhwb3J0IChvcHRpb25fbWFzazMyICYgT1BUX3gpCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAKI2RlZmluZSBmbGFnX3ByaW50X2xvYWRfbWFwIChvcHRpb25fbWFzazMyICYgT1BUX20pCiNlbHNlCiNkZWZpbmUgZmxhZ19wcmludF9sb2FkX21hcCAwCiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNpZiBkZWZpbmVkKFVTRV9MSVNUKQoKc3RydWN0IGFyY2hfbGlzdF9lbnRyeQp7CglzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpuZXh0OwoJTElTVF9BUkNIVFlQRSBhZGRlbmQ7CglpbnQgb2Zmc2V0OwoJaW50IGluaXRlZCA6IDE7Cn07CgojZW5kaWYKCiNpZiBkZWZpbmVkKFVTRV9TSU5HTEUpCgpzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkKewoJaW50IG9mZnNldDsKCWludCBpbml0ZWQgOiAxOwoJaW50IGFsbG9jYXRlZCA6IDE7Cn07CgojZW5kaWYKCiNpZiBkZWZpbmVkKF9fbWlwc19fKQpzdHJ1Y3QgbWlwc19oaTE2CnsKCXN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CglFbGZXKEFkZHIpICphZGRyOwoJRWxmVyhBZGRyKSB2YWx1ZTsKfTsKI2VuZGlmCgpzdHJ1Y3QgYXJjaF9maWxlIHsKCXN0cnVjdCBvYmpfZmlsZSByb290OwojaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnBsdDsKI2VuZGlmCiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKCXN0cnVjdCBvYmpfc2VjdGlvbiAqZ290OwojZW5kaWYKI2lmIGRlZmluZWQoX19taXBzX18pCglzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKI2VuZGlmCn07CgpzdHJ1Y3QgYXJjaF9zeW1ib2wgewoJc3RydWN0IG9ial9zeW1ib2wgcm9vdDsKI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQojaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCglzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwbHRlbnQ7CiNlbHNlCglzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgcGx0ZW50OwojZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKCXN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSBnb3RlbnQ7CiNlbmRpZgp9OwoKCnN0cnVjdCBleHRlcm5hbF9tb2R1bGUgewoJY29uc3QgY2hhciAqbmFtZTsKCUVsZlcoQWRkcikgYWRkcjsKCWludCB1c2VkOwoJc2l6ZV90IG5zeW1zOwoJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zOwp9OwoKc3RhdGljIHN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqa3N5bXM7CnN0YXRpYyBzaXplX3QgbmtzeW1zOwoKc3RhdGljIHN0cnVjdCBleHRlcm5hbF9tb2R1bGUgKmV4dF9tb2R1bGVzOwpzdGF0aWMgaW50IG5fZXh0X21vZHVsZXM7CnN0YXRpYyBpbnQgbl9leHRfbW9kdWxlc191c2VkOwoKc3RhdGljIGNoYXIgKm1fZmlsZW5hbWU7CnN0YXRpYyBjaGFyICptX2Z1bGxOYW1lOwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKc3RhdGljIGludCBjaGVja19tb2R1bGVfbmFtZV9tYXRjaChjb25zdCBjaGFyICpmaWxlbmFtZSwKCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBBVFRSSUJVVEVfVU5VU0VELAoJCXZvaWQgKnVzZXJkYXRhLCBpbnQgZGVwdGggQVRUUklCVVRFX1VOVVNFRCkKewoJY2hhciAqZnVsbG5hbWUgPSAoY2hhciAqKSB1c2VyZGF0YTsKCWNoYXIgKnRtcDsKCglpZiAoZnVsbG5hbWVbMF0gPT0gJ1wwJykKCQlyZXR1cm4gRkFMU0U7CgoJdG1wID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChmaWxlbmFtZSk7CglpZiAoc3RyY21wKHRtcCwgZnVsbG5hbWUpID09IDApIHsKCQkvKiBTdG9wIHNlYXJjaGluZyBpZiB3ZSBmaW5kIGEgbWF0Y2ggKi8KCQltX2ZpbGVuYW1lID0geHN0cmR1cChmaWxlbmFtZSk7CgkJcmV0dXJuIEZBTFNFOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqYXJjaF9uZXdfZmlsZSh2b2lkKQp7CglzdHJ1Y3QgYXJjaF9maWxlICpmOwoJZiA9IHh6YWxsb2Moc2l6ZW9mKCpmKSk7CglyZXR1cm4gJmYtPnJvb3Q7IC8qIGl0J3MgYSBmaXJzdCBtZW1iZXIgKi8KfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF9uZXdfc2VjdGlvbih2b2lkKQp7CglyZXR1cm4geHphbGxvYyhzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uKSk7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sKHZvaWQpCnsKCXN0cnVjdCBhcmNoX3N5bWJvbCAqc3ltOwoJc3ltID0geHphbGxvYyhzaXplb2YoKnN5bSkpOwoJcmV0dXJuICZzeW0tPnJvb3Q7Cn0KCnN0YXRpYyBlbnVtIG9ial9yZWxvYwphcmNoX2FwcGx5X3JlbG9jYXRpb24oc3RydWN0IG9ial9maWxlICpmLAoJCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjLAoJCQkJLypzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN5bXNlYywqLwoJCQkJc3RydWN0IG9ial9zeW1ib2wgKnN5bSwKCQkJCUVsZlcoUmVsTSkgKnJlbCwgRWxmVyhBZGRyKSB2KQp7CiNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pIFwKIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCglzdHJ1Y3QgYXJjaF9maWxlICppZmlsZSA9IChzdHJ1Y3QgYXJjaF9maWxlICopIGY7CiNlbmRpZgoJZW51bSBvYmpfcmVsb2MgcmV0ID0gb2JqX3JlbG9jX29rOwoJRWxmVyhBZGRyKSAqbG9jID0gKEVsZlcoQWRkcikgKikgKHRhcmdzZWMtPmNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CiNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKSBcCiB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fbWM2ODAwMF9fKSB8fCBkZWZpbmVkKF9fbWljcm9ibGF6ZV9fKSBcCiB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fbmlvczJfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgXAogfHwgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKCUVsZlcoQWRkcikgZG90ID0gdGFyZ3NlYy0+aGVhZGVyLnNoX2FkZHIgKyByZWwtPnJfb2Zmc2V0OwojZW5kaWYKI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKCXN0cnVjdCBhcmNoX3N5bWJvbCAqaXN5bSA9IChzdHJ1Y3QgYXJjaF9zeW1ib2wgKikgc3ltOwojZW5kaWYKI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgXAogfHwgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX19zMzkwX18pCiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKCUVsZlcoQWRkcikgZ290ID0gaWZpbGUtPmdvdCA/IGlmaWxlLT5nb3QtPmhlYWRlci5zaF9hZGRyIDogMDsKI2VuZGlmCiNlbmRpZgojaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCglFbGZXKEFkZHIpIHBsdCA9IGlmaWxlLT5wbHQgPyBpZmlsZS0+cGx0LT5oZWFkZXIuc2hfYWRkciA6IDA7Cgl1bnNpZ25lZCBsb25nICppcDsKIyBpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKCXN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKnBlOwojIGVsc2UKCXN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSAqcGU7CiMgZW5kaWYKI2VuZGlmCgoJc3dpdGNoIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSkgewoKI2lmIGRlZmluZWQoX19hcm1fXykKCgkJY2FzZSBSX0FSTV9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX0FSTV9BQlMzMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX0FSTV9HT1QzMjoKCQkJZ290byBiYl91c2VfZ290OwoKCQljYXNlIFJfQVJNX0dPVFBDOgoJCQkvKiByZWxhdGl2ZSByZWxvYywgYWx3YXlzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXwoJCQkgKiAod2hpY2ggaXMgLmdvdCkgc2ltaWxhciB0byBicmFuY2gsCgkJCSAqIGJ1dCBpcyBmdWxsIDMyIGJpdHMgcmVsYXRpdmUgKi8KCgkJCSpsb2MgKz0gZ290IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX0FSTV9QQzI0OgoJCWNhc2UgUl9BUk1fUExUMzI6CgkJCWdvdG8gYmJfdXNlX3BsdDsKCgkJY2FzZSBSX0FSTV9HT1RPRkY6IC8qIGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIGdvdCAqLwoJCQkqbG9jICs9IHYgLSBnb3Q7CgkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX2NyaXNfXykKCgkJY2FzZSBSX0NSSVNfTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl9DUklTXzMyOgoJCQkvKiBDUklTIGtlZXBzIHRoZSByZWxvY2F0aW9uIHZhbHVlIGluIHRoZSByX2FkZGVuZCBmaWVsZCBhbmQKCQkJICogc2hvdWxkIG5vdCB1c2Ugd2hhdHMgaW4gKmxvYyBhdCBhbGwKCQkJICovCgkJCSpsb2MgPSB2OwoJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQoKCQljYXNlIFJfSDhfRElSMjRSODoKCQkJbG9jID0gKEVsZlcoQWRkcikgKikoKEVsZlcoQWRkcikpbG9jIC0gMSk7CgkJCSpsb2MgPSAoKmxvYyAmIDB4ZmYwMDAwMDApIHwgKCgqbG9jICYgMHhmZmZmZmYpICsgdik7CgkJCWJyZWFrOwoJCWNhc2UgUl9IOF9ESVIyNEE4OgoJCQkqbG9jICs9IHY7CgkJCWJyZWFrOwoJCWNhc2UgUl9IOF9ESVIzMjoKCQljYXNlIFJfSDhfRElSMzJBMTY6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgkJY2FzZSBSX0g4X1BDUkVMMTY6CgkJCXYgLT0gZG90ICsgMjsKCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHg3ZmZmIHx8CgkJCSAgICAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MDAwKQoJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQllbHNlCgkJCQkqKHVuc2lnbmVkIHNob3J0ICopbG9jID0gdjsKCQkJYnJlYWs7CgkJY2FzZSBSX0g4X1BDUkVMODoKCQkJdiAtPSBkb3QgKyAxOwoJCQlpZiAoKEVsZlcoU3dvcmQpKXYgPiAweDdmIHx8CgkJCSAgICAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MCkKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJZWxzZQoJCQkJKih1bnNpZ25lZCBjaGFyICopbG9jID0gdjsKCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoKCQljYXNlIFJfMzg2X05PTkU6CgkJCWJyZWFrOwoKCQljYXNlIFJfMzg2XzMyOgoJCQkqbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzg2X1BMVDMyOgoJCWNhc2UgUl8zODZfUEMzMjoKCQljYXNlIFJfMzg2X0dPVE9GRjoKCQkJKmxvYyArPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSXzM4Nl9HTE9CX0RBVDoKCQljYXNlIFJfMzg2X0pNUF9TTE9UOgoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zODZfUkVMQVRJVkU6CgkJCSpsb2MgKz0gZi0+YmFzZWFkZHI7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzg2X0dPVFBDOgoJCQkqbG9jICs9IGdvdCAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zODZfR09UMzI6CgkJCWdvdG8gYmJfdXNlX2dvdDsKCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fbWljcm9ibGF6ZV9fKQoJCWNhc2UgUl9NSUNST0JMQVpFX05PTkU6CgkJY2FzZSBSX01JQ1JPQkxBWkVfNjRfTk9ORToKCQljYXNlIFJfTUlDUk9CTEFaRV8zMl9TWU1fT1BfU1lNOgoJCWNhc2UgUl9NSUNST0JMQVpFXzMyX1BDUkVMOgoJCQlicmVhazsKCgkJY2FzZSBSX01JQ1JPQkxBWkVfNjRfUENSRUw6IHsKCQkJLyogZG90IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgoJCQkgKiB2IGlzIHRoZSB0YXJnZXQgc3ltYm9sIGFkZHJlc3MuCgkJCSAqIFNvIHdlIG5lZWQgdG8gZXh0cmFjdCB0aGUgb2Zmc2V0IGluIHRoZSBjb2RlLAoJCQkgKiBhZGRpbmcgdiwgdGhlbiBzdWJ0cmF0aW5nIHRoZSBjdXJyZW50IGFkZHJlc3MKCQkJICogb2YgdGhpcyBpbnN0cnVjdGlvbi4KCQkJICogRXg6ICJJTU0gMHhGRkZFICBicmFsaWQgMHgwMDAwIiA9ICJicmFsaWQgMHhGRkZFMDAwMCIKCQkJICovCgoJCQkvKiBHZXQgc3BsaXQgb2Zmc2V0IHN0b3JlZCBpbiBjb2RlICovCgkJCXVuc2lnbmVkIGludCB0ZW1wID0gKGxvY1swXSAmIDB4RkZGRikgPDwgMTYgfAoJCQkJCQkobG9jWzFdICYgMHhGRkZGKTsKCgkJCS8qIEFkanVzdCByZWxhdGl2ZSBvZmZzZXQuIC00IGFkanVzdG1lbnQgcmVxdWlyZWQKCQkJICogYmVjYXVzZSBkb3QgcG9pbnRzIHRvIHRoZSBJTU0gaW5zbiwgYnV0IGJyYW5jaAoJCQkgKiBpcyBjb21wdXRlZCByZWxhdGl2ZSB0byB0aGUgYnJhbmNoIGluc3RydWN0aW9uIGl0c2VsZi4KCQkJICovCgkJCXRlbXAgKz0gdiAtIGRvdCAtIDQ7CgoJCQkvKiBTdG9yZSBiYWNrIGludG8gY29kZSAqLwoJCQlsb2NbMF0gPSAobG9jWzBdICYgMHhGRkZGMDAwMCkgfCB0ZW1wID4+IDE2OwoJCQlsb2NbMV0gPSAobG9jWzFdICYgMHhGRkZGMDAwMCkgfCAodGVtcCAmIDB4RkZGRik7CgoJCQlicmVhazsKCQl9CgoJCWNhc2UgUl9NSUNST0JMQVpFXzMyOgoJCQkqbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfTUlDUk9CTEFaRV82NDogewoJCQkvKiBHZXQgc3BsaXQgcG9pbnRlciBzdG9yZWQgaW4gY29kZSAqLwoJCQl1bnNpZ25lZCBpbnQgdGVtcDEgPSAobG9jWzBdICYgMHhGRkZGKSA8PCAxNiB8CgkJCQkJCShsb2NbMV0gJiAweEZGRkYpOwoKCQkJLyogQWRkIHJlbG9jIG9mZnNldCAqLwoJCQl0ZW1wMSs9djsKCgkJCS8qIFN0b3JlIGJhY2sgaW50byBjb2RlICovCgkJCWxvY1swXSA9IChsb2NbMF0gJiAweEZGRkYwMDAwKSB8IHRlbXAxID4+IDE2OwoJCQlsb2NbMV0gPSAobG9jWzFdICYgMHhGRkZGMDAwMCkgfCAodGVtcDEgJiAweEZGRkYpOwoKCQkJYnJlYWs7CgkJfQoKCQljYXNlIFJfTUlDUk9CTEFaRV8zMl9QQ1JFTF9MTzoKCQljYXNlIFJfTUlDUk9CTEFaRV8zMl9MTzoKCQljYXNlIFJfTUlDUk9CTEFaRV9TUk8zMjoKCQljYXNlIFJfTUlDUk9CTEFaRV9TUlczMjoKCQkJcmV0ID0gb2JqX3JlbG9jX3VuaGFuZGxlZDsKCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQoKCQljYXNlIFJfNjhLX05PTkU6CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLXzMyOgoJCQkqbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLXzg6CgkJCWlmICh2ID4gMHhmZikgewoJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQl9CgkJCSooY2hhciAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLXzE2OgoJCQlpZiAodiA+IDB4ZmZmZikgewoJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQl9CgkJCSooc2hvcnQgKilsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S19QQzg6CgkJCXYgLT0gZG90OwoJCQlpZiAoKEVsZlcoU3dvcmQpKXYgPiAweDdmIHx8CgkJCQkJKEVsZlcoU3dvcmQpKXYgPCAtKEVsZlcoU3dvcmQpKTB4ODApIHsKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJfQoJCQkqKGNoYXIgKilsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S19QQzE2OgoJCQl2IC09IGRvdDsKCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHg3ZmZmIHx8CgkJCQkJKEVsZlcoU3dvcmQpKXYgPCAtKEVsZlcoU3dvcmQpKTB4ODAwMCkgewoJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQl9CgkJCSooc2hvcnQgKilsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S19QQzMyOgoJCQkqKGludCAqKWxvYyA9IHYgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLX0dMT0JfREFUOgoJCWNhc2UgUl82OEtfSk1QX1NMT1Q6CgkJCSpsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzY4S19SRUxBVElWRToKCQkJKihpbnQgKilsb2MgKz0gZi0+YmFzZWFkZHI7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLX0dPVDMyOgoJCQlnb3RvIGJiX3VzZV9nb3Q7CgojIGlmZGVmIFJfNjhLX0dPVE9GRgoJCWNhc2UgUl82OEtfR09UT0ZGOgoJCQkqbG9jICs9IHYgLSBnb3Q7CgkJCWJyZWFrOwojIGVuZGlmCgojZWxpZiBkZWZpbmVkKF9fbWlwc19fKQoKCQljYXNlIFJfTUlQU19OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX01JUFNfMzI6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9NSVBTXzI2OgoJCQlpZiAodiAlIDQpCgkJCQlyZXQgPSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOwoJCQlpZiAoKHYgJiAweGYwMDAwMDAwKSAhPSAoKGRvdCArIDQpICYgMHhmMDAwMDAwMCkpCgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCSpsb2MgPQoJCQkJKCpsb2MgJiB+MHgwM2ZmZmZmZikgfCAoKCpsb2MgKyAodiA+PiAyKSkgJgoJCQkJCQkJCQkJMHgwM2ZmZmZmZik7CgkJCWJyZWFrOwoKCQljYXNlIFJfTUlQU19ISTE2OgoJCQl7CgkJCQlzdHJ1Y3QgbWlwc19oaTE2ICpuOwoKCQkJCS8qIFdlIGNhbm5vdCByZWxvY2F0ZSB0aGlzIG9uZSBub3cgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSB2YWx1ZQoJCQkJICAgb2YgdGhlIGNhcnJ5IHdlIG5lZWQgdG8gYWRkLiAgU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgTE8xNgoJCQkJICAgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KCQkJCW4gPSB4bWFsbG9jKHNpemVvZiAqbik7CgkJCQluLT5hZGRyID0gbG9jOwoJCQkJbi0+dmFsdWUgPSB2OwoJCQkJbi0+bmV4dCA9IGlmaWxlLT5taXBzX2hpMTZfbGlzdDsKCQkJCWlmaWxlLT5taXBzX2hpMTZfbGlzdCA9IG47CgkJCQlicmVhazsKCQkJfQoKCQljYXNlIFJfTUlQU19MTzE2OgoJCQl7CgkJCQl1bnNpZ25lZCBsb25nIGluc25sbyA9ICpsb2M7CgkJCQlFbGZXKEFkZHIpIHZhbCwgdmFsbG87CgoJCQkJLyogU2lnbiBleHRlbmQgdGhlIGFkZGVuZCB3ZSBleHRyYWN0IGZyb20gdGhlIGxvIGluc24uICAqLwoJCQkJdmFsbG8gPSAoKGluc25sbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwoKCQkJCWlmIChpZmlsZS0+bWlwc19oaTE2X2xpc3QgIT0gTlVMTCkgewoJCQkJCXN0cnVjdCBtaXBzX2hpMTYgKmw7CgoJCQkJCWwgPSBpZmlsZS0+bWlwc19oaTE2X2xpc3Q7CgkJCQkJd2hpbGUgKGwgIT0gTlVMTCkgewoJCQkJCQlzdHJ1Y3QgbWlwc19oaTE2ICpuZXh0OwoJCQkJCQl1bnNpZ25lZCBsb25nIGluc247CgoJCQkJCQkvKiBEbyB0aGUgSEkxNiByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0CgkJCQkJCSAgIG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZQoJCQkJCQkgICB0byBmaW5kIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgYWRkZW5kIG5lZWRlZCBieSB0aGUgTE8xNi4gICovCgkJCQkJCWluc24gPSAqbC0+YWRkcjsKCQkJCQkJdmFsID0KCQkJCQkJCSgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsKCQkJCQkJCXZhbGxvOwoJCQkJCQl2YWwgKz0gdjsKCgkJCQkJCS8qIEFjY291bnQgZm9yIHRoZSBzaWduIGV4dGVuc2lvbiB0aGF0IHdpbGwgaGFwcGVuIGluIHRoZQoJCQkJCQkgICBsb3cgYml0cy4gICovCgkJCQkJCXZhbCA9CgkJCQkJCQkoKHZhbCA+PiAxNikgKwoJCQkJCQkJICgodmFsICYgMHg4MDAwKSAhPQoJCQkJCQkJICAwKSkgJiAweGZmZmY7CgoJCQkJCQlpbnNuID0gKGluc24gJiB+MHhmZmZmKSB8IHZhbDsKCQkJCQkJKmwtPmFkZHIgPSBpbnNuOwoKCQkJCQkJbmV4dCA9IGwtPm5leHQ7CgkJCQkJCWZyZWUobCk7CgkJCQkJCWwgPSBuZXh0OwoJCQkJCX0KCgkJCQkJaWZpbGUtPm1pcHNfaGkxNl9saXN0ID0gTlVMTDsKCQkJCX0KCgkJCQkvKiBPaywgd2UncmUgZG9uZSB3aXRoIHRoZSBISTE2IHJlbG9jcy4gIE5vdyBkZWFsIHdpdGggdGhlIExPMTYuICAqLwoJCQkJdmFsID0gdiArIHZhbGxvOwoJCQkJaW5zbmxvID0gKGluc25sbyAmIH4weGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7CgkJCQkqbG9jID0gaW5zbmxvOwoJCQkJYnJlYWs7CgkJCX0KCiNlbGlmIGRlZmluZWQoX19uaW9zMl9fKQoKCQljYXNlIFJfTklPUzJfTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9CRkRfUkVMT0NfMzI6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9CRkRfUkVMT0NfMTY6CgkJCWlmICh2ID4gMHhmZmZmKSB7CgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCX0KCQkJKihzaG9ydCAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfQkZEX1JFTE9DXzg6CgkJCWlmICh2ID4gMHhmZikgewoJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQl9CgkJCSooY2hhciAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfUzE2OgoJCQl7CgkJCQlFbGYzMl9BZGRyIHdvcmQ7CgoJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZmZmIHx8CgkJCQkgICAgKEVsZjMyX1N3b3JkKXYgPCAtKEVsZjMyX1N3b3JkKTB4ODAwMCkgewoJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJCX0KCgkJCQl3b3JkID0gKmxvYzsKCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8CgkJCQkgICAgICAgKHdvcmQgJiAweDNmKTsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSX05JT1MyX1UxNjoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkOwoKCQkJCWlmICh2ID4gMHhmZmZmKSB7CgkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQkJfQoKCQkJCXdvcmQgPSAqbG9jOwoJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwKCQkJCSAgICAgICAod29yZCAmIDB4M2YpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfUENSRUwxNjoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkOwoKCQkJCXYgLT0gZG90ICsgNDsKCQkJCWlmICgoRWxmMzJfU3dvcmQpdiA+IDB4N2ZmZiB8fAoJCQkJICAgIChFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwMDApIHsKCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCQl9CgoJCQkJd29yZCA9ICpsb2M7CgkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICh2ICYgMHhmZmZmKSkgPDwgNikgfCAod29yZCAmIDB4M2YpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfR1BSRUw6CgkJCXsKCQkJCUVsZjMyX0FkZHIgd29yZCwgZ3A7CgkJCQkvKiBnZXQgX2dwICovCgkJCQlncCA9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgb2JqX2ZpbmRfc3ltYm9sKGYsIFNQRlggIl9ncCIpKTsKCQkJCXYtPWdwOwoJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZmZmIHx8CgkJCQkJCShFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwMDApIHsKCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCQl9CgoJCQkJd29yZCA9ICpsb2M7CgkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICh2ICYgMHhmZmZmKSkgPDwgNikgfCAod29yZCAmIDB4M2YpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfQ0FMTDI2OgoJCQlpZiAodiAmIDMpCgkJCQlyZXQgPSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOwoJCQlpZiAoKHYgPj4gMjgpICE9IChkb3QgPj4gMjgpKQoJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQkqbG9jID0gKCpsb2MgJiAweDNmKSB8ICgodiA+PiAyKSA8PCA2KTsKCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9JTU01OgoJCQl7CgkJCQlFbGYzMl9BZGRyIHdvcmQ7CgoJCQkJaWYgKHYgPiAweDFmKSB7CgkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQkJfQoKCQkJCXdvcmQgPSAqbG9jICYgfjB4N2MwOwoJCQkJKmxvYyA9IHdvcmQgfCAoKHYgJiAweDFmKSA8PCA2KTsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSX05JT1MyX0lNTTY6CgkJCXsKCQkJCUVsZjMyX0FkZHIgd29yZDsKCgkJCQlpZiAodiA+IDB4M2YpIHsKCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCQl9CgoJCQkJd29yZCA9ICpsb2MgJiB+MHhmYzA7CgkJCQkqbG9jID0gd29yZCB8ICgodiAmIDB4M2YpIDw8IDYpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfSU1NODoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkOwoKCQkJCWlmICh2ID4gMHhmZikgewoJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJCX0KCgkJCQl3b3JkID0gKmxvYyAmIH4weDNmYzA7CgkJCQkqbG9jID0gd29yZCB8ICgodiAmIDB4ZmYpIDw8IDYpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfSEkxNjoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkOwoKCQkJCXdvcmQgPSAqbG9jOwoJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAoKHYgPj4xNikgJiAweGZmZmYpKSA8PCA2KSB8CgkJCQkgICAgICAgKHdvcmQgJiAweDNmKTsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSX05JT1MyX0xPMTY6CgkJCXsKCQkJCUVsZjMyX0FkZHIgd29yZDsKCgkJCQl3b3JkID0gKmxvYzsKCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8CgkJCQkgICAgICAgKHdvcmQgJiAweDNmKTsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSX05JT1MyX0hJQURKMTY6CgkJCXsKCQkJCUVsZjMyX0FkZHIgd29yZDEsIHdvcmQyOwoKCQkJCXdvcmQxID0gKmxvYzsKCQkJCXdvcmQyID0gKCh2ID4+IDE2KSArICgodiA+PiAxNSkgJiAxKSkgJiAweGZmZmY7CgkJCQkqbG9jID0gKCgoKHdvcmQxID4+IDIyKSA8PCAxNikgfCB3b3JkMikgPDwgNikgfAoJCQkJICAgICAgICh3b3JkMSAmIDB4M2YpOwoJCQl9CgkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQoJCS8qIFBQQzY0IG5lZWRzIGEgMi42IGtlcm5lbCwgMi40IG1vZHVsZSByZWxvY2F0aW9uIGlycmVsZXZhbnQgKi8KCiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCgoJCWNhc2UgUl9QUENfQUREUjE2X0hBOgoJCQkqKHVuc2lnbmVkIHNob3J0ICopbG9jID0gKHYgKyAweDgwMDApID4+IDE2OwoJCQlicmVhazsKCgkJY2FzZSBSX1BQQ19BRERSMTZfSEk6CgkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSB2ID4+IDE2OwoJCQlicmVhazsKCgkJY2FzZSBSX1BQQ19BRERSMTZfTE86CgkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX1BQQ19SRUwyNDoKCQkJZ290byBiYl91c2VfcGx0OwoKCQljYXNlIFJfUFBDX1JFTDMyOgoJCQkqbG9jID0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl9QUENfQUREUjMyOgoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fczM5MF9fKQoKCQljYXNlIFJfMzkwXzMyOgoJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gdjsKCQkJYnJlYWs7CgkJY2FzZSBSXzM5MF8xNjoKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdjsKCQkJYnJlYWs7CgkJY2FzZSBSXzM5MF84OgoJCQkqKHVuc2lnbmVkIGNoYXIgKikgbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzkwX1BDMzI6CgkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2IC0gZG90OwoJCQlicmVhazsKCQljYXNlIFJfMzkwX1BDMTZEQkw6CgkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jICs9ICh2IC0gZG90KSA+PiAxOwoJCQlicmVhazsKCQljYXNlIFJfMzkwX1BDMTY6CgkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jICs9IHYgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzkwX1BMVDMyOgoJCWNhc2UgUl8zOTBfUExUMTZEQkw6CgkJCS8qIGZpbmQgdGhlIHBsdCBlbnRyeSBhbmQgaW5pdGlhbGl6ZSBpdC4gICovCgkJCXBlID0gKHN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSAqKSAmaXN5bS0+cGx0ZW50OwoJCQlpZiAocGUtPmluaXRlZCA9PSAwKSB7CgkJCQlpcCA9ICh1bnNpZ25lZCBsb25nICopKGlmaWxlLT5wbHQtPmNvbnRlbnRzICsgcGUtPm9mZnNldCk7CgkJCQlpcFswXSA9IDB4MGQxMDU4MTA7IC8qIGJhc3IgMSwwOyBsZyAxLDEwKDEpOyBiciAxICovCgkJCQlpcFsxXSA9IDB4MTAwNjA3ZjE7CgkJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfUExUMTZEQkwpCgkJCQkJaXBbMl0gPSB2IC0gMjsKCQkJCWVsc2UKCQkJCQlpcFsyXSA9IHY7CgkJCQlwZS0+aW5pdGVkID0gMTsKCQkJfQoKCQkJLyogSW5zZXJ0IHJlbGF0aXZlIGRpc3RhbmNlIHRvIHRhcmdldC4gICovCgkJCXYgPSBwbHQgKyBwZS0+b2Zmc2V0IC0gZG90OwoJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfUExUMzIpCgkJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgPSAodW5zaWduZWQgaW50KSB2OwoJCQllbHNlIGlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9QTFQxNkRCTCkKCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jID0gKHVuc2lnbmVkIHNob3J0KSAoKHYgKyAyKSA+PiAxKTsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfR0xPQl9EQVQ6CgkJY2FzZSBSXzM5MF9KTVBfU0xPVDoKCQkJKmxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzkwX1JFTEFUSVZFOgoJCQkqbG9jICs9IGYtPmJhc2VhZGRyOwoJCQlicmVhazsKCgkJY2FzZSBSXzM5MF9HT1RQQzoKCQkJKih1bnNpZ25lZCBsb25nICopIGxvYyArPSBnb3QgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzkwX0dPVDEyOgoJCWNhc2UgUl8zOTBfR09UMTY6CgkJY2FzZSBSXzM5MF9HT1QzMjoKCQkJaWYgKCFpc3ltLT5nb3RlbnQuaW5pdGVkKQoJCQl7CgkJCQlpc3ltLT5nb3RlbnQuaW5pdGVkID0gMTsKCQkJCSooRWxmVyhBZGRyKSAqKShpZmlsZS0+Z290LT5jb250ZW50cyArIGlzeW0tPmdvdGVudC5vZmZzZXQpID0gdjsKCQkJfQoJCQlpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfR09UMTIpCgkJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyB8PSAoKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSAmIDB4ZmZmOwoJCQllbHNlIGlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9HT1QxNikKCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CgkJCWVsc2UgaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX0dPVDMyKQoJCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CgkJCWJyZWFrOwoKIyBpZm5kZWYgUl8zOTBfR09UT0ZGMzIKIyAgZGVmaW5lIFJfMzkwX0dPVE9GRjMyIFJfMzkwX0dPVE9GRgojIGVuZGlmCgkJY2FzZSBSXzM5MF9HT1RPRkYzMjoKCQkJKmxvYyArPSB2IC0gZ290OwoJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19zaF9fKQoKCQljYXNlIFJfU0hfTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl9TSF9ESVIzMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX1NIX1JFTDMyOgoJCQkqbG9jICs9IHYgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfUExUMzI6CgkJCSpsb2MgPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1NIX0dMT0JfREFUOgoJCWNhc2UgUl9TSF9KTVBfU0xPVDoKCQkJKmxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfUkVMQVRJVkU6CgkJCSpsb2MgPSBmLT5iYXNlYWRkciArIHJlbC0+cl9hZGRlbmQ7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfR09UUEM6CgkJCSpsb2MgPSBnb3QgLSBkb3QgKyByZWwtPnJfYWRkZW5kOwoJCQlicmVhazsKCgkJY2FzZSBSX1NIX0dPVDMyOgoJCQlnb3RvIGJiX3VzZV9nb3Q7CgoJCWNhc2UgUl9TSF9HT1RPRkY6CgkJCSpsb2MgPSB2IC0gZ290OwoJCQlicmVhazsKCiMgaWYgZGVmaW5lZChfX1NINV9fKQoJCWNhc2UgUl9TSF9JTU1fTUVETE9XMTY6CgkJY2FzZSBSX1NIX0lNTV9MT1cxNjoKCQkJewoJCQkJRWxmVyhBZGRyKSB3b3JkOwoKCQkJCWlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSX1NIX0lNTV9NRURMT1cxNikKCQkJCQl2ID4+PSAxNjsKCgkJCQkvKgoJCQkJICogIG1vdmkgYW5kIHNob3JpIGhhdmUgdGhlIGZvcm1hdDoKCQkJCSAqCgkJCQkgKiAgfCAgb3AgIHwgaW1tICB8IHJlZyB8IHJlc2VydmVkIHwKCQkJCSAqICAgMzEuLjI2IDI1Li4xMCA5Li4gNCAzICAgLi4gICAwCgkJCQkgKgoJCQkJICogc28gd2Ugc2ltcGx5IG1hc2sgYW5kIG9yIGluIGltbS4KCQkJCSAqLwoJCQkJd29yZCA9ICpsb2MgJiB+MHgzZmZmYzAwOwoJCQkJd29yZCB8PSAodiAmIDB4ZmZmZikgPDwgMTA7CgoJCQkJKmxvYyA9IHdvcmQ7CgoJCQkJYnJlYWs7CgkJCX0KCgkJY2FzZSBSX1NIX0lNTV9NRURMT1cxNl9QQ1JFTDoKCQljYXNlIFJfU0hfSU1NX0xPVzE2X1BDUkVMOgoJCQl7CgkJCQlFbGZXKEFkZHIpIHdvcmQ7CgoJCQkJd29yZCA9ICpsb2MgJiB+MHgzZmZmYzAwOwoKCQkJCXYgLT0gZG90OwoKCQkJCWlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSX1NIX0lNTV9NRURMT1cxNl9QQ1JFTCkKCQkJCQl2ID4+PSAxNjsKCgkJCQl3b3JkIHw9ICh2ICYgMHhmZmZmKSA8PCAxMDsKCgkJCQkqbG9jID0gd29yZDsKCgkJCQlicmVhazsKCQkJfQojIGVuZGlmIC8qIF9fU0g1X18gKi8KCiNlbGlmIGRlZmluZWQoX192ODUwZV9fKQoKCQljYXNlIFJfVjg1MF9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX1Y4NTBfMzI6CgkJCS8qIFdlIHdyaXRlIHR3byBzaG9ydHMgaW5zdGVhZCBvZiBhIGxvbmcgYmVjYXVzZSBldmVuCgkJCSAgIDMyLWJpdCBpbnNucyBvbmx5IG5lZWQgaGFsZi13b3JkIGFsaWdubWVudCwgYnV0CgkJCSAgIDMyLWJpdCBkYXRhIG5lZWRzIHRvIGJlIGxvbmctd29yZCBhbGlnbmVkLiAgKi8KCQkJdiArPSAoKHVuc2lnbmVkIHNob3J0ICopbG9jKVswXTsKCQkJdiArPSAoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA8PCAxNjsKCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMF0gPSB2ICYgMHhmZmZmOwoJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA9ICh2ID4+IDE2KSAmIDB4ZmZmZjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9WODUwXzIyX1BDUkVMOgoJCQlnb3RvIGJiX3VzZV9wbHQ7CgojZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCgoJCWNhc2UgUl9YODZfNjRfTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfNjQ6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfMzI6CgkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2OwoJCQlpZiAodiA+IDB4ZmZmZmZmZmYpCgkJCXsKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsgLyogS2VybmVsIG1vZHVsZSBjb21waWxlZCB3aXRob3V0IC1tY21vZGVsPWtlcm5lbC4gKi8KCQkJCS8qIGVycm9yKCJQb3NzaWJseSBpcyBtb2R1bGUgY29tcGlsZWQgd2l0aG91dCAtbWNtb2RlbD1rZXJuZWwhIik7ICovCgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfMzJTOgoJCQkqKHNpZ25lZCBpbnQgKikgbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfWDg2XzY0XzE2OgoJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF84OgoJCQkqKHVuc2lnbmVkIGNoYXIgKikgbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfWDg2XzY0X1BDMzI6CgkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF9QQzE2OgoJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF9QQzg6CgkJCSoodW5zaWduZWQgY2hhciAqKSBsb2MgKz0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfR0xPQl9EQVQ6CgkJY2FzZSBSX1g4Nl82NF9KVU1QX1NMT1Q6CgkJCSpsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF9SRUxBVElWRToKCQkJKmxvYyArPSBmLT5iYXNlYWRkcjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfR09UMzI6CgkJY2FzZSBSX1g4Nl82NF9HT1RQQ1JFTDoKCQkJZ290byBiYl91c2VfZ290OwojIGlmIDAKCQkJaWYgKCFpc3ltLT5nb3RlbnQucmVsb2NfZG9uZSkKCQkJewoJCQkJaXN5bS0+Z290ZW50LnJlbG9jX2RvbmUgPSAxOwoJCQkJKihFbGY2NF9BZGRyICopKGlmaWxlLT5nb3QtPmNvbnRlbnRzICsgaXN5bS0+Z290ZW50Lm9mZnNldCkgPSB2OwoJCQl9CgkJCS8qIFhYWCBhcmUgdGhlc2UgcmVhbGx5IGNvcnJlY3Q/ICAqLwoJCQlpZiAoRUxGNjRfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSX1g4Nl82NF9HT1RQQ1JFTCkKCQkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2ICsgaXN5bS0+Z290ZW50Lm9mZnNldDsKCQkJZWxzZQoJCQkJKmxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OwoJCQlicmVhazsKIyBlbmRpZgoKI2Vsc2UKIyB3YXJuaW5nICJubyBpZGVhIGhvdyB0byBoYW5kbGUgcmVsb2NhdGlvbnMgb24geW91ciBhcmNoIgojZW5kaWYKCgkJZGVmYXVsdDoKCQkJcHJpbnRmKCJXYXJuaW5nOiB1bmhhbmRsZWQgcmVsb2MgJWRcbiIsKGludClFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CgkJCXJldCA9IG9ial9yZWxvY191bmhhbmRsZWQ7CgkJCWJyZWFrOwoKI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoKYmJfdXNlX3BsdDoKCgkJCS8qIGZpbmQgdGhlIHBsdCBlbnRyeSBhbmQgaW5pdGlhbGl6ZSBpdCBpZiBuZWNlc3NhcnkgKi8KCiNpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKCQkJZm9yIChwZSA9IGlzeW0tPnBsdGVudDsgcGUgIT0gTlVMTCAmJiBwZS0+YWRkZW5kICE9IHJlbC0+cl9hZGRlbmQ7KQoJCQkJcGUgPSBwZS0+bmV4dDsKI2Vsc2UKCQkJcGUgPSAmaXN5bS0+cGx0ZW50OwojZW5kaWYKCgkJCWlmICghIHBlLT5pbml0ZWQpIHsKCQkJCWlwID0gKHVuc2lnbmVkIGxvbmcgKikgKGlmaWxlLT5wbHQtPmNvbnRlbnRzICsgcGUtPm9mZnNldCk7CgoJCQkJLyogZ2VuZXJhdGUgc29tZSBtYWNoaW5lIGNvZGUgKi8KCiNpZiBkZWZpbmVkKF9fYXJtX18pCgkJCQlpcFswXSA9IDB4ZTUxZmYwMDQ7CQkJLyogbGRyIHBjLFtwYywjLTRdICovCgkJCQlpcFsxXSA9IHY7CQkJCS8qIHN5bUAgKi8KI2VuZGlmCiNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQoJCQkJaXBbMF0gPSAweDNkNjAwMDAwICsgKCh2ICsgMHg4MDAwKSA+PiAxNik7ICAvKiBsaXMgcjExLHN5bUBoYSAqLwoJCQkJaXBbMV0gPSAweDM5NmIwMDAwICsgKHYgJiAweGZmZmYpOyAgICAgICAgICAvKiBhZGRpIHIxMSxyMTEsc3ltQGwgKi8KCQkJCWlwWzJdID0gMHg3ZDY5MDNhNjsJCQkgICAgICAvKiBtdGN0ciByMTEgKi8KCQkJCWlwWzNdID0gMHg0ZTgwMDQyMDsJCQkgICAgICAvKiBiY3RyICovCiNlbmRpZgojaWYgZGVmaW5lZChfX3Y4NTBlX18pCgkJCQkvKiBXZSBoYXZlIHRvIHRyYXNoIGEgcmVnaXN0ZXIsIHNvIHdlIGFzc3VtZSB0aGF0IGFueSBjb250cm9sCgkJCQkgICB0cmFuc2ZlciBtb3JlIHRoYW4gMjEtYml0cyBhd2F5IG11c3QgYmUgYSBmdW5jdGlvbiBjYWxsCgkJCQkgICAoc28gd2UgY2FuIHVzZSBhIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVyKS4gICovCgkJCQlpcFswXSA9IDB4MDYyMSArICgodiAmIDB4ZmZmZikgPDwgMTYpOyAgIC8qIG1vdiBzeW0sIHIxIC4uLiAqLwoJCQkJaXBbMV0gPSAoKHYgPj4gMTYpICYgMHhmZmZmKSArIDB4NjEwMDAwOyAvKiAuLi47IGptcCByMSAqLwojZW5kaWYKCQkJCXBlLT5pbml0ZWQgPSAxOwoJCQl9CgoJCQkvKiByZWxhdGl2ZSBkaXN0YW5jZSB0byB0YXJnZXQgKi8KCQkJdiAtPSBkb3Q7CgkJCS8qIGlmIHRoZSB0YXJnZXQgaXMgdG9vIGZhciBhd2F5Li4uLiAqLwojaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKQoJCQlpZiAoKGludCl2IDwgLTB4MDIwMDAwMDAgfHwgKGludCl2ID49IDB4MDIwMDAwMDApCiNlbGlmIGRlZmluZWQoX192ODUwZV9fKQoJCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHgxZmZmZmYgfHwgKEVsZlcoU3dvcmQpKXYgPCAoRWxmVyhTd29yZCkpLTB4MjAwMDAwKQojZW5kaWYKCQkJCQkvKiBnbyB2aWEgdGhlIHBsdCAqLwoJCQkJCXYgPSBwbHQgKyBwZS0+b2Zmc2V0IC0gZG90OwoKI2lmIGRlZmluZWQoX192ODUwZV9fKQoJCQlpZiAodiAmIDEpCiNlbHNlCgkJCQlpZiAodiAmIDMpCiNlbmRpZgoJCQkJCXJldCA9IG9ial9yZWxvY19kYW5nZXJvdXM7CgoJCQkvKiBtZXJnZSB0aGUgb2Zmc2V0IGludG8gdGhlIGluc3RydWN0aW9uLiAqLwojaWYgZGVmaW5lZChfX2FybV9fKQoJCQkvKiBDb252ZXJ0IHRvIHdvcmRzLiAqLwoJCQl2ID4+PSAyOwoKCQkJKmxvYyA9ICgqbG9jICYgfjB4MDBmZmZmZmYpIHwgKCh2ICsgKmxvYykgJiAweDAwZmZmZmZmKTsKI2VuZGlmCiNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQoJCQkqbG9jID0gKCpsb2MgJiB+MHgwM2ZmZmZmYykgfCAodiAmIDB4MDNmZmZmZmMpOwojZW5kaWYKI2lmIGRlZmluZWQoX192ODUwZV9fKQoJCQkvKiBXZSB3cml0ZSB0d28gc2hvcnRzIGluc3RlYWQgb2YgYSBsb25nIGJlY2F1c2UgZXZlbiAzMi1iaXQgaW5zbnMKCQkJICAgb25seSBuZWVkIGhhbGYtd29yZCBhbGlnbm1lbnQsIGJ1dCB0aGUgMzItYml0IGRhdGEgd3JpdGUgbmVlZHMKCQkJICAgdG8gYmUgbG9uZy13b3JkIGFsaWduZWQuICAqLwoJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVswXSA9CgkJCQkoKih1bnNpZ25lZCBzaG9ydCAqKWxvYyAmIDB4ZmZjMCkgLyogb3Bjb2RlICsgcmVnICovCgkJCQl8ICgodiA+PiAxNikgJiAweDNmKTsgICAgICAgICAgICAgLyogb2ZmcyBoaWdoIHBhcnQgKi8KCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMV0gPQoJCQkJKHYgJiAweGZmZmYpOyAgICAgICAgICAgICAgICAgICAgLyogb2ZmcyBsb3cgcGFydCAqLwojZW5kaWYKCQkJYnJlYWs7CiNlbmRpZiAvKiBVU0VfUExUX0VOVFJJRVMgKi8KCiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKYmJfdXNlX2dvdDoKCgkJCS8qIG5lZWRzIGFuIGVudHJ5IGluIHRoZSAuZ290OiBzZXQgaXQsIG9uY2UgKi8KCQkJaWYgKCFpc3ltLT5nb3RlbnQuaW5pdGVkKSB7CgkJCQlpc3ltLT5nb3RlbnQuaW5pdGVkID0gMTsKCQkJCSooRWxmVyhBZGRyKSAqKSAoaWZpbGUtPmdvdC0+Y29udGVudHMgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSA9IHY7CgkJCX0KCQkJLyogbWFrZSB0aGUgcmVsb2Mgd2l0aF9yZXNwZWN0X3RvXy5nb3QgKi8KI2lmIGRlZmluZWQoX19zaF9fKQoJCQkqbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQgKyByZWwtPnJfYWRkZW5kOwojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pCgkJCSpsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldDsKI2VuZGlmCgkJCWJyZWFrOwoKI2VuZGlmIC8qIFVTRV9HT1RfRU5UUklFUyAqLwoJfQoKCXJldHVybiByZXQ7Cn0KCgojaWYgZGVmaW5lZChVU0VfTElTVCkKCnN0YXRpYyBpbnQgYXJjaF9saXN0X2FkZChFbGZXKFJlbE0pICpyZWwsIHN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKipsaXN0LAoJCQkgIGludCBvZmZzZXQsIGludCBzaXplKQp7CglzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwZTsKCglmb3IgKHBlID0gKmxpc3Q7IHBlICE9IE5VTEw7IHBlID0gcGUtPm5leHQpIHsKCQlpZiAocGUtPmFkZGVuZCA9PSByZWwtPnJfYWRkZW5kKSB7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAocGUgPT0gTlVMTCkgewoJCXBlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGFyY2hfbGlzdF9lbnRyeSkpOwoJCXBlLT5uZXh0ID0gKmxpc3Q7CgkJcGUtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CgkJcGUtPm9mZnNldCA9IG9mZnNldDsKCQlwZS0+aW5pdGVkID0gMDsKCQkqbGlzdCA9IHBlOwoJCXJldHVybiBzaXplOwoJfQoJcmV0dXJuIDA7Cn0KCiNlbmRpZgoKI2lmIGRlZmluZWQoVVNFX1NJTkdMRSkKCnN0YXRpYyBpbnQgYXJjaF9zaW5nbGVfaW5pdCgvKkVsZlcoUmVsTSkgKnJlbCwqLyBzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgKnNpbmdsZSwKCQkJICAgICBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKewoJaWYgKHNpbmdsZS0+YWxsb2NhdGVkID09IDApIHsKCQlzaW5nbGUtPmFsbG9jYXRlZCA9IDE7CgkJc2luZ2xlLT5vZmZzZXQgPSBvZmZzZXQ7CgkJc2luZ2xlLT5pbml0ZWQgPSAwOwoJCXJldHVybiBzaXplOwoJfQoJcmV0dXJuIDA7Cn0KCiNlbmRpZgoKI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmFyY2hfeHNlY3RfaW5pdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCgkJCQkJICAgaW50IG9mZnNldCwgaW50IHNpemUpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqbXlyZWxzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIG5hbWUpOwoKCWlmIChvZmZzZXQgPT0gMCkgewoJCW9mZnNldCArPSBzaXplOwoJfQoKCWlmIChteXJlbHNlYykgewoJCW9ial9leHRlbmRfc2VjdGlvbihteXJlbHNlYywgb2Zmc2V0KTsKCX0gZWxzZSB7CgkJbXlyZWxzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCBuYW1lLAoJCQkJc2l6ZSwgb2Zmc2V0KTsKCX0KCglyZXR1cm4gbXlyZWxzZWM7Cn0KCiNlbmRpZgoKc3RhdGljIHZvaWQgYXJjaF9jcmVhdGVfZ290KHN0cnVjdCBvYmpfZmlsZSAqZikKewojaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoJc3RydWN0IGFyY2hfZmlsZSAqaWZpbGUgPSAoc3RydWN0IGFyY2hfZmlsZSAqKSBmOwoJaW50IGk7CiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKCWludCBnb3Rfb2Zmc2V0ID0gMCwgZ290X25lZWRlZCA9IDAsIGdvdF9hbGxvY2F0ZTsKI2VuZGlmCiNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKCWludCBwbHRfb2Zmc2V0ID0gMCwgcGx0X25lZWRlZCA9IDAsIHBsdF9hbGxvY2F0ZTsKI2VuZGlmCglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnJlbHNlYywgKnN5bXNlYywgKnN0cnNlYzsKCUVsZlcoUmVsTSkgKnJlbCwgKnJlbGVuZDsKCUVsZlcoU3ltKSAqc3ltdGFiLCAqZXh0c3ltOwoJY29uc3QgY2hhciAqc3RydGFiLCAqbmFtZTsKCXN0cnVjdCBhcmNoX3N5bWJvbCAqaW50c3ltOwoKCWZvciAoaSA9IDA7IGkgPCBmLT5oZWFkZXIuZV9zaG51bTsgKytpKSB7CgkJcmVsc2VjID0gZi0+c2VjdGlvbnNbaV07CgkJaWYgKHJlbHNlYy0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX1JFTE0pCgkJCWNvbnRpbnVlOwoKCQlzeW1zZWMgPSBmLT5zZWN0aW9uc1tyZWxzZWMtPmhlYWRlci5zaF9saW5rXTsKCQlzdHJzZWMgPSBmLT5zZWN0aW9uc1tzeW1zZWMtPmhlYWRlci5zaF9saW5rXTsKCgkJcmVsID0gKEVsZlcoUmVsTSkgKikgcmVsc2VjLT5jb250ZW50czsKCQlyZWxlbmQgPSByZWwgKyAocmVsc2VjLT5oZWFkZXIuc2hfc2l6ZSAvIHNpemVvZihFbGZXKFJlbE0pKSk7CgkJc3ltdGFiID0gKEVsZlcoU3ltKSAqKSBzeW1zZWMtPmNvbnRlbnRzOwoJCXN0cnRhYiA9IChjb25zdCBjaGFyICopIHN0cnNlYy0+Y29udGVudHM7CgoJCWZvciAoOyByZWwgPCByZWxlbmQ7ICsrcmVsKSB7CgkJCWV4dHN5bSA9ICZzeW10YWJbRUxGX1JfU1lNKHJlbC0+cl9pbmZvKV07CgojaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCgkJCWdvdF9hbGxvY2F0ZSA9IDA7CiNlbmRpZgojaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCgkJCXBsdF9hbGxvY2F0ZSA9IDA7CiNlbmRpZgoKCQkJc3dpdGNoIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSkgewojaWYgZGVmaW5lZChfX2FybV9fKQoJCQljYXNlIFJfQVJNX1BDMjQ6CgkJCWNhc2UgUl9BUk1fUExUMzI6CgkJCQlwbHRfYWxsb2NhdGUgPSAxOwoJCQkJYnJlYWs7CgoJCQljYXNlIFJfQVJNX0dPVE9GRjoKCQkJY2FzZSBSX0FSTV9HT1RQQzoKCQkJCWdvdF9uZWVkZWQgPSAxOwoJCQkJY29udGludWU7CgoJCQljYXNlIFJfQVJNX0dPVDMyOgoJCQkJZ290X2FsbG9jYXRlID0gMTsKCQkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX2kzODZfXykKCQkJY2FzZSBSXzM4Nl9HT1RQQzoKCQkJY2FzZSBSXzM4Nl9HT1RPRkY6CgkJCQlnb3RfbmVlZGVkID0gMTsKCQkJCWNvbnRpbnVlOwoKCQkJY2FzZSBSXzM4Nl9HT1QzMjoKCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CgkJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCgkJCWNhc2UgUl9QUENfUkVMMjQ6CgkJCQlwbHRfYWxsb2NhdGUgPSAxOwoJCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQoJCQljYXNlIFJfNjhLX0dPVDMyOgoJCQkJZ290X2FsbG9jYXRlID0gMTsKCQkJCWJyZWFrOwoKI2lmZGVmIFJfNjhLX0dPVE9GRgoJCQljYXNlIFJfNjhLX0dPVE9GRjoKCQkJCWdvdF9uZWVkZWQgPSAxOwoJCQkJY29udGludWU7CiNlbmRpZgoKI2VsaWYgZGVmaW5lZChfX3NoX18pCgkJCWNhc2UgUl9TSF9HT1QzMjoKCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CgkJCQlicmVhazsKCgkJCWNhc2UgUl9TSF9HT1RQQzoKCQkJY2FzZSBSX1NIX0dPVE9GRjoKCQkJCWdvdF9uZWVkZWQgPSAxOwoJCQkJY29udGludWU7CgojZWxpZiBkZWZpbmVkKF9fdjg1MGVfXykKCQkJY2FzZSBSX1Y4NTBfMjJfUENSRUw6CgkJCQlwbHRfbmVlZGVkID0gMTsKCQkJCWJyZWFrOwoKI2VuZGlmCgkJCWRlZmF1bHQ6CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKGV4dHN5bS0+c3RfbmFtZSAhPSAwKSB7CgkJCQluYW1lID0gc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lOwoJCQl9IGVsc2UgewoJCQkJbmFtZSA9IGYtPnNlY3Rpb25zW2V4dHN5bS0+c3Rfc2huZHhdLT5uYW1lOwoJCQl9CgkJCWludHN5bSA9IChzdHJ1Y3QgYXJjaF9zeW1ib2wgKikgb2JqX2ZpbmRfc3ltYm9sKGYsIG5hbWUpOwojaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCgkJCWlmIChnb3RfYWxsb2NhdGUpIHsKCQkJCWdvdF9vZmZzZXQgKz0gYXJjaF9zaW5nbGVfaW5pdCgKCQkJCQkJLypyZWwsKi8gJmludHN5bS0+Z290ZW50LAoJCQkJCQlnb3Rfb2Zmc2V0LCBHT1RfRU5UUllfU0laRSk7CgoJCQkJZ290X25lZWRlZCA9IDE7CgkJCX0KI2VuZGlmCiNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKCQkJaWYgKHBsdF9hbGxvY2F0ZSkgewojaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCgkJCQlwbHRfb2Zmc2V0ICs9IGFyY2hfbGlzdF9hZGQoCgkJCQkJCXJlbCwgJmludHN5bS0+cGx0ZW50LAoJCQkJCQlwbHRfb2Zmc2V0LCBQTFRfRU5UUllfU0laRSk7CiNlbHNlCgkJCQlwbHRfb2Zmc2V0ICs9IGFyY2hfc2luZ2xlX2luaXQoCgkJCQkJCS8qcmVsLCovICZpbnRzeW0tPnBsdGVudCwKCQkJCQkJcGx0X29mZnNldCwgUExUX0VOVFJZX1NJWkUpOwojZW5kaWYKCQkJCXBsdF9uZWVkZWQgPSAxOwoJCQl9CiNlbmRpZgoJCX0KCX0KCiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKCWlmIChnb3RfbmVlZGVkKSB7CgkJaWZpbGUtPmdvdCA9IGFyY2hfeHNlY3RfaW5pdChmLCAiLmdvdCIsIGdvdF9vZmZzZXQsCgkJCQlHT1RfRU5UUllfU0laRSk7Cgl9CiNlbmRpZgoKI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoJaWYgKHBsdF9uZWVkZWQpIHsKCQlpZmlsZS0+cGx0ID0gYXJjaF94c2VjdF9pbml0KGYsICIucGx0IiwgcGx0X29mZnNldCwKCQkJCVBMVF9FTlRSWV9TSVpFKTsKCX0KI2VuZGlmCgojZW5kaWYgLyogZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKSAqLwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyogU3RhbmRhcmQgRUxGIGhhc2ggZnVuY3Rpb24uICAqLwpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG4pCnsKCXVuc2lnbmVkIGxvbmcgaCA9IDA7Cgl1bnNpZ25lZCBsb25nIGc7Cgl1bnNpZ25lZCBjaGFyIGNoOwoKCXdoaWxlIChuID4gMCkgewoJCWNoID0gKm5hbWUrKzsKCQloID0gKGggPDwgNCkgKyBjaDsKCQlnID0gKGggJiAweGYwMDAwMDAwKTsKCQlpZiAoZyAhPSAwKSB7CgkJCWggXj0gZyA+PiAyNDsKCQkJaCAmPSB+ZzsKCQl9CgkJbi0tOwoJfQoJcmV0dXJuIGg7Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9lbGZfaGFzaChjb25zdCBjaGFyICpuYW1lKQp7CglyZXR1cm4gb2JqX2VsZl9oYXNoX24obmFtZSwgc3RybGVuKG5hbWUpKTsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCi8qIFN0cmluZyBjb21wYXJpc29uIGZvciBub24tY28tdmVyc2lvbmVkIGtlcm5lbCBhbmQgbW9kdWxlLiAgKi8KCnN0YXRpYyBpbnQgbmN2X3N0cmNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQp7CglzaXplX3QgYWxlbiA9IHN0cmxlbihhKSwgYmxlbiA9IHN0cmxlbihiKTsKCglpZiAoYmxlbiA9PSBhbGVuICsgMTAgJiYgYlthbGVuXSA9PSAnXycgJiYgYlthbGVuICsgMV0gPT0gJ1InKQoJCXJldHVybiBzdHJuY21wKGEsIGIsIGFsZW4pOwoJZWxzZSBpZiAoYWxlbiA9PSBibGVuICsgMTAgJiYgYVtibGVuXSA9PSAnXycgJiYgYVtibGVuICsgMV0gPT0gJ1InKQoJCXJldHVybiBzdHJuY21wKGEsIGIsIGJsZW4pOwoJZWxzZQoJCXJldHVybiBzdHJjbXAoYSwgYik7Cn0KCi8qIFN0cmluZyBoYXNoaW5nIGZvciBub24tY28tdmVyc2lvbmVkIGtlcm5lbCBhbmQgbW9kdWxlLiAgSGVyZQogICB3ZSBhcmUgc2ltcGx5IGZvcmNlZCB0byBkcm9wIHRoZSBjcmMgZnJvbSB0aGUgaGFzaC4gICovCgpzdGF0aWMgdW5zaWduZWQgbG9uZyBuY3Zfc3ltYm9sX2hhc2goY29uc3QgY2hhciAqc3RyKQp7CglzaXplX3QgbGVuID0gc3RybGVuKHN0cik7CglpZiAobGVuID4gMTAgJiYgc3RyW2xlbiAtIDEwXSA9PSAnXycgJiYgc3RyW2xlbiAtIDldID09ICdSJykKCQlsZW4gLT0gMTA7CglyZXR1cm4gb2JqX2VsZl9oYXNoX24oc3RyLCBsZW4pOwp9CgpzdGF0aWMgdm9pZApvYmpfc2V0X3N5bWJvbF9jb21wYXJlKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCQkgICBpbnQgKCpjbXApIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCgkJCQkJICAgdW5zaWduZWQgbG9uZyAoKmhhc2gpIChjb25zdCBjaGFyICopKQp7CglpZiAoY21wKQoJCWYtPnN5bWJvbF9jbXAgPSBjbXA7CglpZiAoaGFzaCkgewoJCXN0cnVjdCBvYmpfc3ltYm9sICp0bXB0YWJbSEFTSF9CVUNLRVRTXSwgKnN5bSwgKm5leHQ7CgkJaW50IGk7CgoJCWYtPnN5bWJvbF9oYXNoID0gaGFzaDsKCgkJbWVtY3B5KHRtcHRhYiwgZi0+c3ltdGFiLCBzaXplb2YodG1wdGFiKSk7CgkJbWVtc2V0KGYtPnN5bXRhYiwgMCwgc2l6ZW9mKGYtPnN5bXRhYikpOwoKCQlmb3IgKGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpCgkJCWZvciAoc3ltID0gdG1wdGFiW2ldOyBzeW07IHN5bSA9IG5leHQpIHsKCQkJCXVuc2lnbmVkIGxvbmcgaCA9IGhhc2goc3ltLT5uYW1lKSAlIEhBU0hfQlVDS0VUUzsKCQkJCW5leHQgPSBzeW0tPm5leHQ7CgkJCQlzeW0tPm5leHQgPSBmLT5zeW10YWJbaF07CgkJCQlmLT5zeW10YWJbaF0gPSBzeW07CgkJCX0KCX0KfQoKI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqCm9ial9hZGRfc3ltYm9sKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSwKCQkJCXVuc2lnbmVkIGxvbmcgc3ltaWR4LCBpbnQgaW5mbywKCQkJCWludCBzZWNpZHgsIEVsZlcoQWRkcikgdmFsdWUsCgkJCQl1bnNpZ25lZCBsb25nIHNpemUpCnsKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cgl1bnNpZ25lZCBsb25nIGhhc2ggPSBmLT5zeW1ib2xfaGFzaChuYW1lKSAlIEhBU0hfQlVDS0VUUzsKCWludCBuX3R5cGUgPSBFTEZfU1RfVFlQRShpbmZvKTsKCWludCBuX2JpbmRpbmcgPSBFTEZfU1RfQklORChpbmZvKTsKCglmb3IgKHN5bSA9IGYtPnN5bXRhYltoYXNoXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKCQlpZiAoZi0+c3ltYm9sX2NtcChzeW0tPm5hbWUsIG5hbWUpID09IDApIHsKCQkJaW50IG9fc2VjaWR4ID0gc3ltLT5zZWNpZHg7CgkJCWludCBvX2luZm8gPSBzeW0tPmluZm87CgkJCWludCBvX3R5cGUgPSBFTEZfU1RfVFlQRShvX2luZm8pOwoJCQlpbnQgb19iaW5kaW5nID0gRUxGX1NUX0JJTkQob19pbmZvKTsKCgkJCS8qIEEgcmVkZWZpbml0aW9uISAgSXMgaXQgbGVnYWw/ICAqLwoKCQkJaWYgKHNlY2lkeCA9PSBTSE5fVU5ERUYpCgkJCQlyZXR1cm4gc3ltOwoJCQllbHNlIGlmIChvX3NlY2lkeCA9PSBTSE5fVU5ERUYpCgkJCQlnb3RvIGZvdW5kOwoJCQllbHNlIGlmIChuX2JpbmRpbmcgPT0gU1RCX0dMT0JBTCAmJiBvX2JpbmRpbmcgPT0gU1RCX0xPQ0FMKSB7CgkJCQkvKiBDb3BlIHdpdGggbG9jYWwgYW5kIGdsb2JhbCBzeW1ib2xzIG9mIHRoZSBzYW1lIG5hbWUKCQkJCSAgIGluIHRoZSBzYW1lIG9iamVjdCBmaWxlLCBhcyBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZAoJCQkJICAgYnkgbGQgLXIuICBUaGUgb25seSByZWFzb24gbG9jYWxzIGFyZSBub3cgc2VlbiBhdCB0aGlzCgkJCQkgICBsZXZlbCBhdCBhbGwgaXMgc28gdGhhdCB3ZSBjYW4gZG8gc2VtaS1zZW5zaWJsZSB0aGluZ3MKCQkJCSAgIHdpdGggcGFyYW1ldGVycy4gICovCgoJCQkJc3RydWN0IG9ial9zeW1ib2wgKm5zeW0sICoqcDsKCgkJCQluc3ltID0gYXJjaF9uZXdfc3ltYm9sKCk7CgkJCQluc3ltLT5uZXh0ID0gc3ltLT5uZXh0OwoJCQkJbnN5bS0+a3N5bWlkeCA9IC0xOwoKCQkJCS8qIEV4Y2lzZSB0aGUgb2xkIChsb2NhbCkgc3ltYm9sIGZyb20gdGhlIGhhc2ggY2hhaW4uICAqLwoJCQkJZm9yIChwID0gJmYtPnN5bXRhYltoYXNoXTsgKnAgIT0gc3ltOyBwID0gJigqcCktPm5leHQpCgkJCQkJY29udGludWU7CgkJCQkqcCA9IHN5bSA9IG5zeW07CgkJCQlnb3RvIGZvdW5kOwoJCQl9IGVsc2UgaWYgKG5fYmluZGluZyA9PSBTVEJfTE9DQUwpIHsKCQkJCS8qIEFub3RoZXIgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLgoJCQkJICAgSnVzdCBhZGQgdGhpcyB0byB0aGUgbG9jYWwgdGFibGUuICAqLwoJCQkJc3ltID0gYXJjaF9uZXdfc3ltYm9sKCk7CgkJCQlzeW0tPm5leHQgPSBOVUxMOwoJCQkJc3ltLT5rc3ltaWR4ID0gLTE7CgkJCQlmLT5sb2NhbF9zeW10YWJbc3ltaWR4XSA9IHN5bTsKCQkJCWdvdG8gZm91bmQ7CgkJCX0gZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9XRUFLKQoJCQkJcmV0dXJuIHN5bTsKCQkJZWxzZSBpZiAob19iaW5kaW5nID09IFNUQl9XRUFLKQoJCQkJZ290byBmb3VuZDsKCQkJLyogRG9uJ3QgdW5pZnkgQ09NTU9OIHN5bWJvbHMgd2l0aCBvYmplY3QgdHlwZXMgdGhlIHByb2dyYW1tZXIKCQkJICAgZG9lc24ndCBleHBlY3QuICAqLwoJCQllbHNlIGlmIChzZWNpZHggPT0gU0hOX0NPTU1PTgoJCQkJCSYmIChvX3R5cGUgPT0gU1RUX05PVFlQRSB8fCBvX3R5cGUgPT0gU1RUX09CSkVDVCkpCgkJCQlyZXR1cm4gc3ltOwoJCQllbHNlIGlmIChvX3NlY2lkeCA9PSBTSE5fQ09NTU9OCgkJCQkJJiYgKG5fdHlwZSA9PSBTVFRfTk9UWVBFIHx8IG5fdHlwZSA9PSBTVFRfT0JKRUNUKSkKCQkJCWdvdG8gZm91bmQ7CgkJCWVsc2UgewoJCQkJLyogRG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHRoZSBzeW1ib2wgaXMgY29taW5nIGZyb20KCQkJCSAgIHRoZSBrZXJuZWwgb3Igc29tZSBleHRlcm5hbCBtb2R1bGUuICAqLwoJCQkJaWYgKHNlY2lkeCA8PSBTSE5fSElSRVNFUlZFKQoJCQkJCWJiX2Vycm9yX21zZygiJXMgbXVsdGlwbHkgZGVmaW5lZCIsIG5hbWUpOwoJCQkJcmV0dXJuIHN5bTsKCQkJfQoJCX0KCX0KCgkvKiBDb21wbGV0ZWx5IG5ldyBzeW1ib2wuICAqLwoJc3ltID0gYXJjaF9uZXdfc3ltYm9sKCk7CglzeW0tPm5leHQgPSBmLT5zeW10YWJbaGFzaF07CglmLT5zeW10YWJbaGFzaF0gPSBzeW07CglzeW0tPmtzeW1pZHggPSAtMTsKCWlmIChFTEZfU1RfQklORChpbmZvKSA9PSBTVEJfTE9DQUwgJiYgc3ltaWR4ICE9ICh1bnNpZ25lZCBsb25nKSgtMSkpIHsKCQlpZiAoc3ltaWR4ID49IGYtPmxvY2FsX3N5bXRhYl9zaXplKQoJCQliYl9lcnJvcl9tc2coImxvY2FsIHN5bWJvbCAlcyB3aXRoIGluZGV4ICVsZCBleGNlZWRzIGxvY2FsX3N5bXRhYl9zaXplICVsZCIsCgkJCQkJbmFtZSwgKGxvbmcpIHN5bWlkeCwgKGxvbmcpIGYtPmxvY2FsX3N5bXRhYl9zaXplKTsKCQllbHNlCgkJCWYtPmxvY2FsX3N5bXRhYltzeW1pZHhdID0gc3ltOwoJfQoKZm91bmQ6CglzeW0tPm5hbWUgPSBuYW1lOwoJc3ltLT52YWx1ZSA9IHZhbHVlOwoJc3ltLT5zaXplID0gc2l6ZTsKCXN5bS0+c2VjaWR4ID0gc2VjaWR4OwoJc3ltLT5pbmZvID0gaW5mbzsKCglyZXR1cm4gc3ltOwp9CgpzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgpvYmpfZmluZF9zeW1ib2woc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lKQp7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJdW5zaWduZWQgbG9uZyBoYXNoID0gZi0+c3ltYm9sX2hhc2gobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CgoJZm9yIChzeW0gPSBmLT5zeW10YWJbaGFzaF07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCWlmIChmLT5zeW1ib2xfY21wKHN5bS0+bmFtZSwgbmFtZSkgPT0gMCkKCQkJcmV0dXJuIHN5bTsKCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIEVsZlcoQWRkcikgb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKiBmLCBzdHJ1Y3Qgb2JqX3N5bWJvbCAqIHN5bSkKewoJaWYgKHN5bSkgewoJCWlmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFKQoJCQlyZXR1cm4gc3ltLT52YWx1ZTsKCgkJcmV0dXJuIHN5bS0+dmFsdWUgKyBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmhlYWRlci5zaF9hZGRyOwoJfSBlbHNlIHsKCQkvKiBBcyBhIHNwZWNpYWwgY2FzZSwgYSBOVUxMIHN5bSBoYXMgdmFsdWUgemVyby4gICovCgkJcmV0dXJuIDA7Cgl9Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9maW5kX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lKQp7CglpbnQgaSwgbiA9IGYtPmhlYWRlci5lX3NobnVtOwoKCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCgkJaWYgKHN0cmNtcChmLT5zZWN0aW9uc1tpXS0+bmFtZSwgbmFtZSkgPT0gMCkKCQkJcmV0dXJuIGYtPnNlY3Rpb25zW2ldOwoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50IG9ial9sb2FkX29yZGVyX3ByaW8oc3RydWN0IG9ial9zZWN0aW9uICphKQp7Cgl1bnNpZ25lZCBsb25nIGFmLCBhYzsKCglhZiA9IGEtPmhlYWRlci5zaF9mbGFnczsKCglhYyA9IDA7CglpZiAoYS0+bmFtZVswXSAhPSAnLicgfHwgc3RybGVuKGEtPm5hbWUpICE9IDEwIHx8CgkJCXN0cmNtcChhLT5uYW1lICsgNSwgIi5pbml0IikpCgkJYWMgfD0gMzI7CglpZiAoYWYgJiBTSEZfQUxMT0MpCgkJYWMgfD0gMTY7CglpZiAoIShhZiAmIFNIRl9XUklURSkpCgkJYWMgfD0gODsKCWlmIChhZiAmIFNIRl9FWEVDSU5TVFIpCgkJYWMgfD0gNDsKCWlmIChhLT5oZWFkZXIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQoJCWFjIHw9IDI7CgoJcmV0dXJuIGFjOwp9CgpzdGF0aWMgdm9pZApvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjKQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKipwOwoJaW50IHByaW8gPSBvYmpfbG9hZF9vcmRlcl9wcmlvKHNlYyk7Cglmb3IgKHAgPSBmLT5sb2FkX29yZGVyX3NlYXJjaF9zdGFydDsgKnA7IHAgPSAmKCpwKS0+bG9hZF9uZXh0KQoJCWlmIChvYmpfbG9hZF9vcmRlcl9wcmlvKCpwKSA8IHByaW8pCgkJCWJyZWFrOwoJc2VjLT5sb2FkX25leHQgPSAqcDsKCSpwID0gc2VjOwp9CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQljb25zdCBjaGFyICpuYW1lLAoJCQkJdW5zaWduZWQgbG9uZyBhbGlnbiwKCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJaW50IG5ld2lkeCA9IGYtPmhlYWRlci5lX3NobnVtKys7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCglmLT5zZWN0aW9ucyA9IHhyZWFsbG9jKGYtPnNlY3Rpb25zLCAobmV3aWR4ICsgMSkgKiBzaXplb2Yoc2VjKSk7CglmLT5zZWN0aW9uc1tuZXdpZHhdID0gc2VjID0gYXJjaF9uZXdfc2VjdGlvbigpOwoKCXNlYy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CglzZWMtPmhlYWRlci5zaF9mbGFncyA9IFNIRl9XUklURSB8IFNIRl9BTExPQzsKCXNlYy0+aGVhZGVyLnNoX3NpemUgPSBzaXplOwoJc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gYWxpZ247CglzZWMtPm5hbWUgPSBuYW1lOwoJc2VjLT5pZHggPSBuZXdpZHg7CglpZiAoc2l6ZSkKCQlzZWMtPmNvbnRlbnRzID0geG1hbGxvYyhzaXplKTsKCglvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihmLCBzZWMpOwoKCXJldHVybiBzZWM7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0KHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCWNvbnN0IGNoYXIgKm5hbWUsCgkJCQl1bnNpZ25lZCBsb25nIGFsaWduLAoJCQkJdW5zaWduZWQgbG9uZyBzaXplKQp7CglpbnQgbmV3aWR4ID0gZi0+aGVhZGVyLmVfc2hudW0rKzsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCWYtPnNlY3Rpb25zID0geHJlYWxsb2MoZi0+c2VjdGlvbnMsIChuZXdpZHggKyAxKSAqIHNpemVvZihzZWMpKTsKCWYtPnNlY3Rpb25zW25ld2lkeF0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CgoJc2VjLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKCXNlYy0+aGVhZGVyLnNoX2ZsYWdzID0gU0hGX1dSSVRFIHwgU0hGX0FMTE9DOwoJc2VjLT5oZWFkZXIuc2hfc2l6ZSA9IHNpemU7CglzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSBhbGlnbjsKCXNlYy0+bmFtZSA9IG5hbWU7CglzZWMtPmlkeCA9IG5ld2lkeDsKCWlmIChzaXplKQoJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNpemUpOwoKCXNlYy0+bG9hZF9uZXh0ID0gZi0+bG9hZF9vcmRlcjsKCWYtPmxvYWRfb3JkZXIgPSBzZWM7CglpZiAoZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPT0gJmYtPmxvYWRfb3JkZXIpCgkJZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPSAmc2VjLT5sb2FkX25leHQ7CgoJcmV0dXJuIHNlYzsKfQoKc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYywgdW5zaWduZWQgbG9uZyBtb3JlKQp7Cgl1bnNpZ25lZCBsb25nIG9sZHNpemUgPSBzZWMtPmhlYWRlci5zaF9zaXplOwoJaWYgKG1vcmUpIHsKCQlzZWMtPmNvbnRlbnRzID0geHJlYWxsb2Moc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSArPSBtb3JlKTsKCX0KCXJldHVybiBzZWMtPmNvbnRlbnRzICsgb2xkc2l6ZTsKfQoKCi8qIENvbmRpdGlvbmFsbHkgYWRkIHRoZSBzeW1ib2xzIGZyb20gdGhlIGdpdmVuIHN5bWJvbCBzZXQgdG8gdGhlCiAgIG5ldyBtb2R1bGUuICAqLwoKc3RhdGljIGludAphZGRfc3ltYm9sc19mcm9tKCBzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkgaW50IGlkeCwgc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zLCBzaXplX3QgbnN5bXMpCnsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqczsKCXNpemVfdCBpOwoJaW50IHVzZWQgPSAwOwojaWZkZWYgU1lNQk9MX1BSRUZJWAoJY2hhciAqbmFtZV9idWYgPSAwOwoJc2l6ZV90IG5hbWVfYWxsb2NlZF9zaXplID0gMDsKI2VuZGlmCiNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQoJaW50IGdwbDsKCglncGwgPSBvYmpfZ3BsX2xpY2Vuc2UoZiwgTlVMTCkgPT0gMDsKI2VuZGlmCglmb3IgKGkgPSAwLCBzID0gc3ltczsgaSA8IG5zeW1zOyArK2ksICsrcykgewoJCS8qIE9ubHkgYWRkIHN5bWJvbHMgdGhhdCBhcmUgYWxyZWFkeSBtYXJrZWQgZXh0ZXJuYWwuCgkJICAgSWYgd2Ugb3ZlcnJpZGUgbG9jYWxzIHdlIG1heSBjYXVzZSBwcm9ibGVtcyBmb3IKCQkgICBhcmd1bWVudCBpbml0aWFsaXphdGlvbi4gIFdlIHdpbGwgYWxzbyBjcmVhdGUgYSBmYWxzZQoJCSAgIGRlcGVuZGVuY3kgb24gdGhlIG1vZHVsZS4gICovCgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQljaGFyICpuYW1lOwoKCQkvKiBHUEwgbGljZW5zZWQgbW9kdWxlcyBjYW4gdXNlIHN5bWJvbHMgZXhwb3J0ZWQgd2l0aAoJCSAqIEVYUE9SVF9TWU1CT0xfR1BMLCBzbyBpZ25vcmUgYW55IEdQTE9OTFlfIHByZWZpeCBvbiB0aGUKCQkgKiBleHBvcnRlZCBuYW1lcy4gIE5vbi1HUEwgbW9kdWxlcyBuZXZlciBzZWUgYW55IEdQTE9OTFlfCgkJICogc3ltYm9scyBzbyB0aGV5IGNhbm5vdCBmdWRnZSBpdCBieSBhZGRpbmcgdGhlIHByZWZpeCBvbgoJCSAqIHRoZWlyIHJlZmVyZW5jZXMuCgkJICovCgkJaWYgKHN0cm5jbXAoKGNoYXIgKilzLT5uYW1lLCAiR1BMT05MWV8iLCA4KSA9PSAwKSB7CiNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQoJCQlpZiAoZ3BsKQoJCQkJcy0+bmFtZSArPSA4OwoJCQllbHNlCiNlbmRpZgoJCQkJY29udGludWU7CgkJfQoJCW5hbWUgPSAoY2hhciAqKXMtPm5hbWU7CgojaWZkZWYgU1lNQk9MX1BSRUZJWAoJCS8qIFByZXBlbmQgU1lNQk9MX1BSRUZJWCB0byB0aGUgc3ltYm9sJ3MgbmFtZSAodGhlCgkJICAga2VybmVsIGV4cG9ydHMgYEMgbmFtZXMnLCBidXQgbW9kdWxlIG9iamVjdCBmaWxlcwoJCSAgIHJlZmVyZW5jZSBgbGlua2VyIG5hbWVzJykuICAqLwoJCXNpemVfdCBleHRyYSA9IHNpemVvZiBTWU1CT0xfUFJFRklYOwoJCXNpemVfdCBuYW1lX3NpemUgPSBzdHJsZW4obmFtZSkgKyBleHRyYTsKCQlpZiAobmFtZV9zaXplID4gbmFtZV9hbGxvY2VkX3NpemUpIHsKCQkJbmFtZV9hbGxvY2VkX3NpemUgPSBuYW1lX3NpemUgKiAyOwoJCQluYW1lX2J1ZiA9IGFsbG9jYShuYW1lX2FsbG9jZWRfc2l6ZSk7CgkJfQoJCXN0cmNweShuYW1lX2J1ZiwgU1lNQk9MX1BSRUZJWCk7CgkJc3RyY3B5KG5hbWVfYnVmICsgZXh0cmEgLSAxLCBuYW1lKTsKCQluYW1lID0gbmFtZV9idWY7CiNlbmRpZiAvKiBTWU1CT0xfUFJFRklYICovCgoJCXN5bSA9IG9ial9maW5kX3N5bWJvbChmLCBuYW1lKTsKCQlpZiAoc3ltICYmICEoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSA9PSBTVEJfTE9DQUwpKSB7CiNpZmRlZiBTWU1CT0xfUFJFRklYCgkJCS8qIFB1dCBOQU1FX0JVRiBpbnRvIG1vcmUgcGVybWFuZW50IHN0b3JhZ2UuICAqLwoJCQluYW1lID0geG1hbGxvYyhuYW1lX3NpemUpOwoJCQlzdHJjcHkobmFtZSwgbmFtZV9idWYpOwojZW5kaWYKCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsCgkJCQkJRUxGX1NUX0lORk8oU1RCX0dMT0JBTCwKCQkJCQkJU1RUX05PVFlQRSksCgkJCQkJaWR4LCBzLT52YWx1ZSwgMCk7CgkJCS8qIERpZCBvdXIgc3ltYm9sIGp1c3QgZ2V0IGluc3RhbGxlZD8gIElmIHNvLCBtYXJrIHRoZQoJCQkgICBtb2R1bGUgYXMgInVzZWQiLiAgKi8KCQkJaWYgKHN5bS0+c2VjaWR4ID09IGlkeCkKCQkJCXVzZWQgPSAxOwoJCX0KCX0KCglyZXR1cm4gdXNlZDsKfQoKc3RhdGljIHZvaWQgYWRkX2tlcm5lbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IGV4dGVybmFsX21vZHVsZSAqbTsKCWludCBpLCBudXNlZCA9IDA7CgoJLyogQWRkIG1vZHVsZSBzeW1ib2xzIGZpcnN0LiAgKi8KCglmb3IgKGkgPSAwLCBtID0gZXh0X21vZHVsZXM7IGkgPCBuX2V4dF9tb2R1bGVzOyArK2ksICsrbSkgewoJCWlmIChtLT5uc3ltcwoJCSAmJiBhZGRfc3ltYm9sc19mcm9tKGYsIFNITl9ISVJFU0VSVkUgKyAyICsgaSwgbS0+c3ltcywgbS0+bnN5bXMpCgkJKSB7CgkJCW0tPnVzZWQgPSAxOwoJCQkrK251c2VkOwoJCX0KCX0KCgluX2V4dF9tb2R1bGVzX3VzZWQgPSBudXNlZDsKCgkvKiBBbmQgZmluYWxseSB0aGUgc3ltYm9scyBmcm9tIHRoZSBrZXJuZWwgcHJvcGVyLiAgKi8KCglpZiAobmtzeW1zKQoJCWFkZF9zeW1ib2xzX2Zyb20oZiwgU0hOX0hJUkVTRVJWRSArIDEsIGtzeW1zLCBua3N5bXMpOwp9CgpzdGF0aWMgY2hhciAqZ2V0X21vZGluZm9fdmFsdWUoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICprZXkpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJY2hhciAqcCwgKnYsICpuLCAqZXA7CglzaXplX3Qga2xlbiA9IHN0cmxlbihrZXkpOwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5tb2RpbmZvIik7CglpZiAoc2VjID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CglwID0gc2VjLT5jb250ZW50czsKCWVwID0gcCArIHNlYy0+aGVhZGVyLnNoX3NpemU7Cgl3aGlsZSAocCA8IGVwKSB7CgkJdiA9IHN0cmNocihwLCAnPScpOwoJCW4gPSBzdHJjaHIocCwgJ1wwJyk7CgkJaWYgKHYpIHsKCQkJaWYgKHAgKyBrbGVuID09IHYgJiYgc3RybmNtcChwLCBrZXksIGtsZW4pID09IDApCgkJCQlyZXR1cm4gdiArIDE7CgkJfSBlbHNlIHsKCQkJaWYgKHAgKyBrbGVuID09IG4gJiYgc3RyY21wKHAsIGtleSkgPT0gMCkKCQkJCXJldHVybiBuOwoJCX0KCQlwID0gbiArIDE7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBGdW5jdGlvbnMgcmVsYXRpbmcgdG8gbW9kdWxlIGxvYWRpbmcgYWZ0ZXIgMi4xLjE4LiAgKi8KCnN0YXRpYyB2b2lkCm5ld19wcm9jZXNzX21vZHVsZV9hcmd1bWVudHMoc3RydWN0IG9ial9maWxlICpmLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXdoaWxlIChhcmdjID4gMCkgewoJCWNoYXIgKnAsICpxLCAqa2V5LCAqc3ltX25hbWU7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQljaGFyICpjb250ZW50cywgKmxvYzsKCQlpbnQgbWluLCBtYXgsIG47CgoJCXAgPSAqYXJndjsKCQlxID0gc3RyY2hyKHAsICc9Jyk7CgkJaWYgKHEgPT0gTlVMTCkgewoJCQlhcmdjLS07CgkJCWNvbnRpbnVlOwoJCX0KCgkJa2V5ID0gYWxsb2NhKHEgLSBwICsgNik7CgkJbWVtY3B5KGtleSwgInBhcm1fIiwgNSk7CgkJbWVtY3B5KGtleSArIDUsIHAsIHEgLSBwKTsKCQlrZXlbcSAtIHAgKyA1XSA9IDA7CgoJCXAgPSBnZXRfbW9kaW5mb192YWx1ZShmLCBrZXkpOwoJCWtleSArPSA1OwoJCWlmIChwID09IE5VTEwpIHsKCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgcGFyYW1ldGVyICVzIiwga2V5KTsKCQl9CgojaWZkZWYgU1lNQk9MX1BSRUZJWAoJCXN5bV9uYW1lID0gYWxsb2NhKHN0cmxlbihrZXkpICsgc2l6ZW9mIFNZTUJPTF9QUkVGSVgpOwoJCXN0cmNweShzeW1fbmFtZSwgU1lNQk9MX1BSRUZJWCk7CgkJc3RyY2F0KHN5bV9uYW1lLCBrZXkpOwojZWxzZQoJCXN5bV9uYW1lID0ga2V5OwojZW5kaWYKCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgc3ltX25hbWUpOwoKCQkvKiBBbHNvIGNoZWNrIHRoYXQgdGhlIHBhcmFtZXRlciB3YXMgbm90IHJlc29sdmVkIGZyb20gdGhlIGtlcm5lbC4gICovCgkJaWYgKHN5bSA9PSBOVUxMIHx8IHN5bS0+c2VjaWR4ID4gU0hOX0hJUkVTRVJWRSkgewoJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3ltYm9sIGZvciBwYXJhbWV0ZXIgJXMgbm90IGZvdW5kIiwga2V5KTsKCQl9CgoJCWlmIChpc2RpZ2l0KCpwKSkgewoJCQltaW4gPSBzdHJ0b3VsKHAsICZwLCAxMCk7CgkJCWlmICgqcCA9PSAnLScpCgkJCQltYXggPSBzdHJ0b3VsKHAgKyAxLCAmcCwgMTApOwoJCQllbHNlCgkJCQltYXggPSBtaW47CgkJfSBlbHNlCgkJCW1pbiA9IG1heCA9IDE7CgoJCWNvbnRlbnRzID0gZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdLT5jb250ZW50czsKCQlsb2MgPSBjb250ZW50cyArIHN5bS0+dmFsdWU7CgkJbiA9ICgqKytxICE9ICdcMCcpOwoKCQl3aGlsZSAoMSkgewoJCQlpZiAoKCpwID09ICdzJykgfHwgKCpwID09ICdjJykpIHsKCQkJCWNoYXIgKnN0cjsKCgkJCQkvKiBEbyBDIHF1b3RpbmcgaWYgd2UgYmVnaW4gd2l0aCBhICIsIGVsc2Ugc2x1cnAgdGhlIGxvdC4gICovCgkJCQlpZiAoKnEgPT0gJyInKSB7CgkJCQkJY2hhciAqcjsKCgkJCQkJc3RyID0gYWxsb2NhKHN0cmxlbihxKSk7CgkJCQkJZm9yIChyID0gc3RyLCBxKys7ICpxICE9ICciJzsgKytxLCArK3IpIHsKCQkJCQkJaWYgKCpxID09ICdcMCcpCgkJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW1wcm9wZXJseSB0ZXJtaW5hdGVkIHN0cmluZyBhcmd1bWVudCBmb3IgJXMiLAoJCQkJCQkJCQlrZXkpOwoJCQkJCQlpZiAoKnEgPT0gJ1xcJykKCQkJCQkJCXN3aXRjaCAoKisrcSkgewoJCQkJCQkJY2FzZSAnYSc6CgkJCQkJCQkJKnIgPSAnXGEnOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnYic6CgkJCQkJCQkJKnIgPSAnXGInOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnZSc6CgkJCQkJCQkJKnIgPSAnXDAzMyc7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdmJzoKCQkJCQkJCQkqciA9ICdcZic7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICduJzoKCQkJCQkJCQkqciA9ICdcbic7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdyJzoKCQkJCQkJCQkqciA9ICdccic7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0JzoKCQkJCQkJCQkqciA9ICdcdCc7CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJY2FzZSAnMCc6CgkJCQkJCQljYXNlICcxJzoKCQkJCQkJCWNhc2UgJzInOgoJCQkJCQkJY2FzZSAnMyc6CgkJCQkJCQljYXNlICc0JzoKCQkJCQkJCWNhc2UgJzUnOgoJCQkJCQkJY2FzZSAnNic6CgkJCQkJCQljYXNlICc3JzoKCQkJCQkJCQl7CgkJCQkJCQkJCWludCBjID0gKnEgLSAnMCc7CgkJCQkJCQkJCWlmIChxWzFdID49ICcwJyAmJiBxWzFdIDw9ICc3JykgewoJCQkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJCQkJaWYgKHFbMV0gPj0gJzAnICYmIHFbMV0gPD0gJzcnKQoJCQkJCQkJCQkJCWMgPSAoYyAqIDgpICsgKisrcSAtICcwJzsKCQkJCQkJCQkJfQoJCQkJCQkJCQkqciA9IGM7CgkJCQkJCQkJfQoJCQkJCQkJCWJyZWFrOwoKCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJKnIgPSAqcTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQkJKnIgPSAqcTsKCQkJCQl9CgkJCQkJKnIgPSAnXDAnOwoJCQkJCSsrcTsKCQkJCX0gZWxzZSB7CgkJCQkJY2hhciAqcjsKCgkJCQkJLyogSW4gdGhpcyBjYXNlLCB0aGUgc3RyaW5nIGlzIG5vdCBxdW90ZWQuIFdlIHdpbGwgYnJlYWsKCQkJCQkgICBpdCB1c2luZyB0aGUgY29tYSAobGlrZSBmb3IgaW50cykuIElmIHRoZSB1c2VyIHdhbnRzIHRvCgkJCQkJICAgaW5jbHVkZSBjb21hcyBpbiBhIHN0cmluZywgaGUganVzdCBoYXMgdG8gcXVvdGUgaXQgKi8KCgkJCQkJLyogU2VhcmNoIHRoZSBuZXh0IGNvbWEgKi8KCQkJCQlyID0gc3RyY2hyKHEsICcsJyk7CgoJCQkJCS8qIEZvdW5kID8gKi8KCQkJCQlpZiAociAhPSAoY2hhciAqKSBOVUxMKSB7CgkJCQkJCS8qIFJlY29weSB0aGUgY3VycmVudCBmaWVsZCAqLwoJCQkJCQlzdHIgPSBhbGxvY2EociAtIHEgKyAxKTsKCQkJCQkJbWVtY3B5KHN0ciwgcSwgciAtIHEpOwoKCQkJCQkJLyogSSBkb24ndCBrbm93IGlmIGl0IGlzIHVzZWZ1bCwgYXMgdGhlIHByZXZpb3VzIGNhc2UKCQkJCQkJICAgZG9lc24ndCBudWwgdGVybWluYXRlIHRoZSBzdHJpbmcgPz8/ICovCgkJCQkJCXN0cltyIC0gcV0gPSAnXDAnOwoKCQkJCQkJLyogS2VlcCBuZXh0IGZpZWxkcyAqLwoJCQkJCQlxID0gcjsKCQkJCQl9IGVsc2UgewoJCQkJCQkvKiBsYXN0IHN0cmluZyAqLwoJCQkJCQlzdHIgPSBxOwoJCQkJCQlxID0gKGNoYXIqKSIiOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoKnAgPT0gJ3MnKSB7CgkJCQkJLyogTm9ybWFsIHN0cmluZyAqLwoJCQkJCW9ial9zdHJpbmdfcGF0Y2goZiwgc3ltLT5zZWNpZHgsIGxvYyAtIGNvbnRlbnRzLCBzdHIpOwoJCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2NoYXJfcDsKCQkJCX0gZWxzZSB7CgkJCQkJLyogQXJyYXkgb2YgY2hhcnMgKGluIGZhY3QsIG1hdHJpeCEpICovCgkJCQkJdW5zaWduZWQgbG9uZyBjaGFyc3NpemU7CS8qIHNpemUgb2YgZWFjaCBtZW1iZXIgKi8KCgkJCQkJLyogR2V0IHRoZSBzaXplIG9mIGVhY2ggbWVtYmVyICovCgkJCQkJLyogUHJvYmFibHkgd2Ugc2hvdWxkIGRvIHRoYXQgb3V0c2lkZSB0aGUgbG9vcCA/ICovCgkJCQkJaWYgKCFpc2RpZ2l0KCoocCArIDEpKSkgewoJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicGFyYW1ldGVyIHR5cGUgJ2MnIGZvciAlcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IgoJCQkJCQkJCSIgdGhlIG1heGltdW0gc2l6ZSIsIGtleSk7CgkJCQkJfQoJCQkJCWNoYXJzc2l6ZSA9IHN0cnRvdWwocCArIDEsIChjaGFyICoqKSBOVUxMLCAxMCk7CgoJCQkJCS8qIENoZWNrIGxlbmd0aCAqLwoJCQkJCWlmIChzdHJsZW4oc3RyKSA+PSBjaGFyc3NpemUpIHsKCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0cmluZyB0b28gbG9uZyBmb3IgJXMgKG1heCAlbGQpIiwga2V5LAoJCQkJCQkJCWNoYXJzc2l6ZSAtIDEpOwoJCQkJCX0KCgkJCQkJLyogQ29weSB0byBsb2NhdGlvbiAqLwoJCQkJCXN0cmNweSgoY2hhciAqKSBsb2MsIHN0cik7CgkJCQkJbG9jICs9IGNoYXJzc2l6ZTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWxvbmcgdiA9IHN0cnRvdWwocSwgJnEsIDApOwoJCQkJc3dpdGNoICgqcCkgewoJCQkJY2FzZSAnYic6CgkJCQkJKmxvYysrID0gdjsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2gnOgoJCQkJCSooc2hvcnQgKikgbG9jID0gdjsKCQkJCQlsb2MgKz0gdGd0X3NpemVvZl9zaG9ydDsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2knOgoJCQkJCSooaW50ICopIGxvYyA9IHY7CgkJCQkJbG9jICs9IHRndF9zaXplb2ZfaW50OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnbCc6CgkJCQkJKihsb25nICopIGxvYyA9IHY7CgkJCQkJbG9jICs9IHRndF9zaXplb2ZfbG9uZzsKCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHBhcmFtZXRlciB0eXBlICclYycgZm9yICVzIiwgKnAsIGtleSk7CgkJCQl9CgkJCX0KIHJldHJ5X2VuZF9vZl92YWx1ZToKCQkJc3dpdGNoICgqcSkgewoJCQljYXNlICdcMCc6CgkJCQlnb3RvIGVuZF9vZl9hcmc7CgoJCQljYXNlICcgJzoKCQkJY2FzZSAnXHQnOgoJCQljYXNlICdcbic6CgkJCWNhc2UgJ1xyJzoKCQkJCSsrcTsKCQkJCWdvdG8gcmV0cnlfZW5kX29mX3ZhbHVlOwoKCQkJY2FzZSAnLCc6CgkJCQlpZiAoKytuID4gbWF4KSB7CgkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IHZhbHVlcyBmb3IgJXMgKG1heCAlZCkiLCBrZXksIG1heCk7CgkJCQl9CgkJCQkrK3E7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBhcmd1bWVudCBzeW50YXggZm9yICVzIiwga2V5KTsKCQkJfQoJCX0KIGVuZF9vZl9hcmc6CgkJaWYgKG4gPCBtaW4pIHsKCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBmZXcgdmFsdWVzIGZvciAlcyAobWluICVkKSIsIGtleSwgbWluKTsKCQl9CgoJCWFyZ2MtLTsKCQlhcmd2Kys7Cgl9Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwpzdGF0aWMgaW50IG5ld19pc19tb2R1bGVfY2hlY2tzdW1tZWQoc3RydWN0IG9ial9maWxlICpmKQp7Cgljb25zdCBjaGFyICpwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgInVzaW5nX2NoZWNrc3VtcyIpOwoJaWYgKHApCgkJcmV0dXJuIHhhdG9pKHApOwoJcmV0dXJuIDA7Cn0KCi8qIEdldCB0aGUgbW9kdWxlJ3Mga2VybmVsIHZlcnNpb24gaW4gdGhlIGNhbm9uaWNhbCBpbnRlZ2VyIGZvcm0uICAqLwoKc3RhdGljIGludApuZXdfZ2V0X21vZHVsZV92ZXJzaW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciBzdHJbU1RSVkVSU0lPTkxFTl0pCnsKCWNoYXIgKnAsICpxOwoJaW50IGEsIGIsIGM7CgoJcCA9IGdldF9tb2RpbmZvX3ZhbHVlKGYsICJrZXJuZWxfdmVyc2lvbiIpOwoJaWYgKHAgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglzYWZlX3N0cm5jcHkoc3RyLCBwLCBTVFJWRVJTSU9OTEVOKTsKCglhID0gc3RydG91bChwLCAmcCwgMTApOwoJaWYgKCpwICE9ICcuJykKCQlyZXR1cm4gLTE7CgliID0gc3RydG91bChwICsgMSwgJnAsIDEwKTsKCWlmICgqcCAhPSAnLicpCgkJcmV0dXJuIC0xOwoJYyA9IHN0cnRvdWwocCArIDEsICZxLCAxMCk7CglpZiAocCArIDEgPT0gcSkKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIGEgPDwgMTYgfCBiIDw8IDggfCBjOwp9CgojZW5kaWYgICAvKiBGRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgoKLyogRmV0Y2ggdGhlIGxvYWRlZCBtb2R1bGVzLCBhbmQgYWxsIGN1cnJlbnRseSBleHBvcnRlZCBzeW1ib2xzLiAgKi8KCnN0YXRpYyB2b2lkIG5ld19nZXRfa2VybmVsX3N5bWJvbHModm9pZCkKewoJY2hhciAqbW9kdWxlX25hbWVzLCAqbW47CglzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICptb2R1bGVzLCAqbTsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqc3ltcywgKnM7CglzaXplX3QgcmV0LCBidWZzaXplLCBubW9kLCBuc3ltcywgaSwgajsKCgkvKiBDb2xsZWN0IHRoZSBsb2FkZWQgbW9kdWxlcy4gICovCgoJYnVmc2l6ZSA9IDI1NjsKCW1vZHVsZV9uYW1lcyA9IHhtYWxsb2MoYnVmc2l6ZSk7CgogcmV0cnlfbW9kdWxlc19sb2FkOgoJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCBRTV9NT0RVTEVTLCBtb2R1bGVfbmFtZXMsIGJ1ZnNpemUsICZyZXQpKSB7CgkJaWYgKGVycm5vID09IEVOT1NQQyAmJiBidWZzaXplIDwgcmV0KSB7CgkJCWJ1ZnNpemUgPSByZXQ7CgkJCW1vZHVsZV9uYW1lcyA9IHhyZWFsbG9jKG1vZHVsZV9uYW1lcywgYnVmc2l6ZSk7CgkJCWdvdG8gcmV0cnlfbW9kdWxlc19sb2FkOwoJCX0KCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlFNX01PRFVMRVMiKTsKCX0KCgluX2V4dF9tb2R1bGVzID0gbm1vZCA9IHJldDsKCgkvKiBDb2xsZWN0IHRoZSBtb2R1bGVzJyBzeW1ib2xzLiAgKi8KCglpZiAobm1vZCkgewoJCWV4dF9tb2R1bGVzID0gbW9kdWxlcyA9IHhtYWxsb2Mobm1vZCAqIHNpemVvZigqbW9kdWxlcykpOwoJCW1lbXNldChtb2R1bGVzLCAwLCBubW9kICogc2l6ZW9mKCptb2R1bGVzKSk7CgkJZm9yIChpID0gMCwgbW4gPSBtb2R1bGVfbmFtZXMsIG0gPSBtb2R1bGVzOwoJCQkJaSA8IG5tb2Q7ICsraSwgKyttLCBtbiArPSBzdHJsZW4obW4pICsgMSkgewoJCQlzdHJ1Y3QgbmV3X21vZHVsZV9pbmZvIGluZm87CgoJCQlpZiAocXVlcnlfbW9kdWxlKG1uLCBRTV9JTkZPLCAmaW5mbywgc2l6ZW9mKGluZm8pLCAmcmV0KSkgewoJCQkJaWYgKGVycm5vID09IEVOT0VOVCkgewoJCQkJCS8qIFRoZSBtb2R1bGUgd2FzIHJlbW92ZWQgb3V0IGZyb20gdW5kZXJuZWF0aCB1cy4gICovCgkJCQkJY29udGludWU7CgkJCQl9CgkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInF1ZXJ5X21vZHVsZTogUU1fSU5GTzogJXMiLCBtbik7CgkJCX0KCgkJCWJ1ZnNpemUgPSAxMDI0OwoJCQlzeW1zID0geG1hbGxvYyhidWZzaXplKTsKIHJldHJ5X21vZF9zeW1fbG9hZDoKCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fU1lNQk9MUywgc3ltcywgYnVmc2l6ZSwgJnJldCkpIHsKCQkJCXN3aXRjaCAoZXJybm8pIHsKCQkJCQljYXNlIEVOT1NQQzoKCQkJCQkJYnVmc2l6ZSA9IHJldDsKCQkJCQkJc3ltcyA9IHhyZWFsbG9jKHN5bXMsIGJ1ZnNpemUpOwoJCQkJCQlnb3RvIHJldHJ5X21vZF9zeW1fbG9hZDsKCQkJCQljYXNlIEVOT0VOVDoKCQkJCQkJLyogVGhlIG1vZHVsZSB3YXMgcmVtb3ZlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHVzLiAgKi8KCQkJCQkJY29udGludWU7CgkJCQkJZGVmYXVsdDoKCQkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJxdWVyeV9tb2R1bGU6IFFNX1NZTUJPTFM6ICVzIiwgbW4pOwoJCQkJfQoJCQl9CgkJCW5zeW1zID0gcmV0OwoKCQkJbS0+bmFtZSA9IG1uOwoJCQltLT5hZGRyID0gaW5mby5hZGRyOwoJCQltLT5uc3ltcyA9IG5zeW1zOwoJCQltLT5zeW1zID0gc3ltczsKCgkJCWZvciAoaiA9IDAsIHMgPSBzeW1zOyBqIDwgbnN5bXM7ICsraiwgKytzKSB7CgkJCQlzLT5uYW1lICs9ICh1bnNpZ25lZCBsb25nKSBzeW1zOwoJCQl9CgkJfQoJfQoKCS8qIENvbGxlY3QgdGhlIGtlcm5lbCdzIHN5bWJvbHMuICAqLwoKCXN5bXMgPSB4bWFsbG9jKGJ1ZnNpemUgPSAxNiAqIDEwMjQpOwogcmV0cnlfa2Vybl9zeW1fbG9hZDoKCWlmIChxdWVyeV9tb2R1bGUoTlVMTCwgUU1fU1lNQk9MUywgc3ltcywgYnVmc2l6ZSwgJnJldCkpIHsKCQlpZiAoZXJybm8gPT0gRU5PU1BDICYmIGJ1ZnNpemUgPCByZXQpIHsKCQkJc3ltcyA9IHhyZWFsbG9jKHN5bXMsIGJ1ZnNpemUgPSByZXQpOwoJCQlnb3RvIHJldHJ5X2tlcm5fc3ltX2xvYWQ7CgkJfQoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgia2VybmVsOiBRTV9TWU1CT0xTIik7Cgl9Cglua3N5bXMgPSBuc3ltcyA9IHJldDsKCWtzeW1zID0gc3ltczsKCglmb3IgKGogPSAwLCBzID0gc3ltczsgaiA8IG5zeW1zOyArK2osICsrcykgewoJCXMtPm5hbWUgKz0gKHVuc2lnbmVkIGxvbmcpIHN5bXM7Cgl9Cn0KCgovKiBSZXR1cm4gdGhlIGtlcm5lbCBzeW1ib2wgY2hlY2tzdW0gdmVyc2lvbiwgb3IgemVybyBpZiBub3QgdXNlZC4gICovCgpzdGF0aWMgaW50IG5ld19pc19rZXJuZWxfY2hlY2tzdW1tZWQodm9pZCkKewoJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzOwoJc2l6ZV90IGk7CgoJLyogVXNpbmdfVmVyc2lvbnMgaXMgbm90IHRoZSBmaXJzdCBzeW1ib2wsIGJ1dCBpdCBzaG91bGQgYmUgaW4gdGhlcmUuICAqLwoKCWZvciAoaSA9IDAsIHMgPSBrc3ltczsgaSA8IG5rc3ltczsgKytpLCArK3MpCgkJaWYgKHN0cmNtcCgoY2hhciAqKSBzLT5uYW1lLCAiVXNpbmdfVmVyc2lvbnMiKSA9PSAwKQoJCQlyZXR1cm4gcy0+dmFsdWU7CgoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgdm9pZCAgbmV3X2NyZWF0ZV90aGlzX21vZHVsZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm1fbmFtZSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3QoZiwgIi50aGlzIiwgdGd0X3NpemVvZl9sb25nLAoJCQlzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCW1lbXNldChzZWMtPmNvbnRlbnRzLCAwLCBzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCglvYmpfYWRkX3N5bWJvbChmLCBTUEZYICJfX3RoaXNfbW9kdWxlIiwgLTEsCgkJCUVMRl9TVF9JTkZPKFNUQl9MT0NBTCwgU1RUX09CSkVDVCksIHNlYy0+aWR4LCAwLAoJCQlzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCglvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZmZzZXRvZihzdHJ1Y3QgbmV3X21vZHVsZSwgbmFtZSksCgkJCW1fbmFtZSk7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUwovKiBhZGQgYW4gZW50cnkgdG8gdGhlIF9fa3N5bXRhYiBzZWN0aW9uLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkgKi8Kc3RhdGljIHZvaWQgbmV3X2FkZF9rc3ltdGFiKHN0cnVjdCBvYmpfZmlsZSAqZiwgc3RydWN0IG9ial9zeW1ib2wgKnN5bSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CglFbGZXKEFkZHIpIG9mczsKCgkvKiBlbnN1cmUgX19rc3ltdGFiIGlzIGFsbG9jYXRlZCwgRVhQT1JUX05PU1lNQk9MUyBjcmVhdGVzIGEgbm9uLWFsbG9jIHNlY3Rpb24uCgkgKiBJZiBfX2tzeW10YWIgaXMgZGVmaW5lZCBidXQgbm90IG1hcmtlZCBhbGxvYywgeCBvdXQgdGhlIGZpcnN0IGNoYXJhY3RlcgoJICogKG5vIG9ial9kZWxldGUgcm91dGluZSkgYW5kIGNyZWF0ZSBhIG5ldyBfX2tzeW10YWIgd2l0aCB0aGUgY29ycmVjdAoJICogY2hhcmFjdGVyaXN0aWNzLgoJICovCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKTsKCWlmIChzZWMgJiYgIShzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykpIHsKCQkqKChjaGFyICopKHNlYy0+bmFtZSkpID0gJ3gnOwkvKiBvdmVycmlkZSBjb25zdCAqLwoJCXNlYyA9IE5VTEw7Cgl9CglpZiAoIXNlYykKCQlzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiX19rc3ltdGFiIiwKCQkJCXRndF9zaXplb2Zfdm9pZF9wLCAwKTsKCWlmICghc2VjKQoJCXJldHVybjsKCXNlYy0+aGVhZGVyLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKCS8qIEVtcHR5IHNlY3Rpb24gbWlnaHQgYmUgYnl0ZS1hbGlnbmVkICovCglzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSB0Z3Rfc2l6ZW9mX3ZvaWRfcDsKCW9mcyA9IHNlYy0+aGVhZGVyLnNoX3NpemU7CglvYmpfc3ltYm9sX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMsIHN5bSk7CglvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMgKyB0Z3Rfc2l6ZW9mX3ZvaWRfcCwgc3ltLT5uYW1lKTsKCW9ial9leHRlbmRfc2VjdGlvbihzZWMsIDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7Cn0KI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgKi8KCnN0YXRpYyBpbnQgbmV3X2NyZWF0ZV9tb2R1bGVfa3N5bXRhYihzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJaW50IGk7CgoJLyogV2UgbXVzdCBhbHdheXMgYWRkIHRoZSBtb2R1bGUgcmVmZXJlbmNlcy4gICovCgoJaWYgKG5fZXh0X21vZHVsZXNfdXNlZCkgewoJCXN0cnVjdCBuZXdfbW9kdWxlX3JlZiAqZGVwOwoJCXN0cnVjdCBvYmpfc3ltYm9sICp0bTsKCgkJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgIi5rbW9kdGFiIiwgdGd0X3NpemVvZl92b2lkX3AsCgkJCQkoc2l6ZW9mKHN0cnVjdCBuZXdfbW9kdWxlX3JlZikKCQkJCSAqIG5fZXh0X21vZHVsZXNfdXNlZCkpOwoJCWlmICghc2VjKQoJCQlyZXR1cm4gMDsKCgkJdG0gPSBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiX190aGlzX21vZHVsZSIpOwoJCWRlcCA9IChzdHJ1Y3QgbmV3X21vZHVsZV9yZWYgKikgc2VjLT5jb250ZW50czsKCQlmb3IgKGkgPSAwOyBpIDwgbl9leHRfbW9kdWxlczsgKytpKQoJCQlpZiAoZXh0X21vZHVsZXNbaV0udXNlZCkgewoJCQkJZGVwLT5kZXAgPSBleHRfbW9kdWxlc1tpXS5hZGRyOwoJCQkJb2JqX3N5bWJvbF9wYXRjaChmLCBzZWMtPmlkeCwKCQkJCQkJKGNoYXIgKikgJmRlcC0+cmVmIC0gc2VjLT5jb250ZW50cywgdG0pOwoJCQkJZGVwLT5uZXh0X3JlZiA9IDA7CgkJCQkrK2RlcDsKCQkJfQoJfQoKCWlmICghZmxhZ19ub2V4cG9ydCAmJiAhb2JqX2ZpbmRfc2VjdGlvbihmLCAiX19rc3ltdGFiIikpIHsKCQlzaXplX3QgbnN5bXM7CgkJaW50ICpsb2FkZWQ7CgoJCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiLCB0Z3Rfc2l6ZW9mX3ZvaWRfcCwgMCk7CgoJCS8qIFdlIGRvbid0IHdhbnQgdG8gZXhwb3J0IHN5bWJvbHMgcmVzaWRpbmcgaW4gc2VjdGlvbnMgdGhhdAoJCSAgIGFyZW4ndCBsb2FkZWQuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdGhlc2UgY3JlYXRlZCBzbyB0aGF0CgkJICAgd2UgbWFrZSBzdXJlIGNlcnRhaW4gbW9kdWxlIG9wdGlvbnMgZG9uJ3QgYXBwZWFyIHR3aWNlLiAgKi8KCgkJbG9hZGVkID0gYWxsb2NhKHNpemVvZihpbnQpICogKGkgPSBmLT5oZWFkZXIuZV9zaG51bSkpOwoJCXdoaWxlICgtLWkgPj0gMCkKCQkJbG9hZGVkW2ldID0gKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDA7CgoJCWZvciAobnN5bXMgPSBpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJCWZvciAoc3ltID0gZi0+c3ltdGFiW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKCQkJCWlmIChFTEZfU1RfQklORChzeW0tPmluZm8pICE9IFNUQl9MT0NBTAoJCQkJCQkmJiBzeW0tPnNlY2lkeCA8PSBTSE5fSElSRVNFUlZFCgkJCQkJCSYmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFCgkJCQkJCQl8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKSkgewoJCQkJCUVsZlcoQWRkcikgb2ZzID0gbnN5bXMgKiAyICogdGd0X3NpemVvZl92b2lkX3A7CgoJCQkJCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcywgc3ltKTsKCQkJCQlvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMgKyB0Z3Rfc2l6ZW9mX3ZvaWRfcCwKCQkJCQkJCXN5bS0+bmFtZSk7CgoJCQkJCW5zeW1zKys7CgkJCQl9CgkJfQoKCQlvYmpfZXh0ZW5kX3NlY3Rpb24oc2VjLCBuc3ltcyAqIDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7Cgl9CgoJcmV0dXJuIDE7Cn0KCgpzdGF0aWMgaW50Cm5ld19pbml0X21vZHVsZShjb25zdCBjaGFyICptX25hbWUsIHN0cnVjdCBvYmpfZmlsZSAqZiwgdW5zaWduZWQgbG9uZyBtX3NpemUpCnsKCXN0cnVjdCBuZXdfbW9kdWxlICptb2R1bGU7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCXZvaWQgKmltYWdlOwoJaW50IHJldDsKCXRndF9sb25nIG1fYWRkcjsKCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIudGhpcyIpOwoJaWYgKCFzZWMgfHwgIXNlYy0+Y29udGVudHMpIHsKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHQgbW9kdWxlICVzPyIsbV9uYW1lKTsKCX0KCW1vZHVsZSA9IChzdHJ1Y3QgbmV3X21vZHVsZSAqKSBzZWMtPmNvbnRlbnRzOwoJbV9hZGRyID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKCgltb2R1bGUtPnNpemVfb2Zfc3RydWN0ID0gc2l6ZW9mKCptb2R1bGUpOwoJbW9kdWxlLT5zaXplID0gbV9zaXplOwoJbW9kdWxlLT5mbGFncyA9IGZsYWdfYXV0b2NsZWFuID8gTkVXX01PRF9BVVRPQ0xFQU4gOiAwOwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpOwoJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CgkJbW9kdWxlLT5zeW1zID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQltb2R1bGUtPm5zeW1zID0gc2VjLT5oZWFkZXIuc2hfc2l6ZSAvICgyICogdGd0X3NpemVvZl9jaGFyX3ApOwoJfQoKCWlmIChuX2V4dF9tb2R1bGVzX3VzZWQpIHsKCQlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIua21vZHRhYiIpOwoJCW1vZHVsZS0+ZGVwcyA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJbW9kdWxlLT5uZGVwcyA9IG5fZXh0X21vZHVsZXNfdXNlZDsKCX0KCgltb2R1bGUtPmluaXQgPQoJCW9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgb2JqX2ZpbmRfc3ltYm9sKGYsIFNQRlggImluaXRfbW9kdWxlIikpOwoJbW9kdWxlLT5jbGVhbnVwID0KCQlvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJjbGVhbnVwX21vZHVsZSIpKTsKCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2V4X3RhYmxlIik7CglpZiAoc2VjKSB7CgkJbW9kdWxlLT5leF90YWJsZV9zdGFydCA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJbW9kdWxlLT5leF90YWJsZV9lbmQgPSBzZWMtPmhlYWRlci5zaF9hZGRyICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCX0KCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIudGV4dC5pbml0Iik7CglpZiAoc2VjKSB7CgkJbW9kdWxlLT5ydW5zaXplID0gc2VjLT5oZWFkZXIuc2hfYWRkciAtIG1fYWRkcjsKCX0KCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5kYXRhLmluaXQiKTsKCWlmIChzZWMpIHsKCQlpZiAoIW1vZHVsZS0+cnVuc2l6ZSB8fAoJCQkJbW9kdWxlLT5ydW5zaXplID4gc2VjLT5oZWFkZXIuc2hfYWRkciAtIG1fYWRkcikKCQkJbW9kdWxlLT5ydW5zaXplID0gc2VjLT5oZWFkZXIuc2hfYWRkciAtIG1fYWRkcjsKCX0KCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgQVJDSERBVEFfU0VDX05BTUUpOwoJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CgkJbW9kdWxlLT5hcmNoZGF0YV9zdGFydCA9ICh2b2lkKilzZWMtPmhlYWRlci5zaF9hZGRyOwoJCW1vZHVsZS0+YXJjaGRhdGFfZW5kID0gbW9kdWxlLT5hcmNoZGF0YV9zdGFydCArIHNlYy0+aGVhZGVyLnNoX3NpemU7Cgl9CglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIEtBTExTWU1TX1NFQ19OQU1FKTsKCWlmIChzZWMgJiYgc2VjLT5oZWFkZXIuc2hfc2l6ZSkgewoJCW1vZHVsZS0+a2FsbHN5bXNfc3RhcnQgPSAodm9pZCopc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQltb2R1bGUtPmthbGxzeW1zX2VuZCA9IG1vZHVsZS0+a2FsbHN5bXNfc3RhcnQgKyBzZWMtPmhlYWRlci5zaF9zaXplOwoJfQoKCS8qIFdoZXchICBBbGwgb2YgdGhlIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLiAgQ29sbGVjdCB0aGUgZmluYWwKCSAgIG1vZHVsZSBpbWFnZSBhbmQgZ2l2ZSBpdCB0byB0aGUga2VybmVsLiAgKi8KCglpbWFnZSA9IHhtYWxsb2MobV9zaXplKTsKCW9ial9jcmVhdGVfaW1hZ2UoZiwgaW1hZ2UpOwoKCXJldCA9IGluaXRfbW9kdWxlKG1fbmFtZSwgKHN0cnVjdCBuZXdfbW9kdWxlICopIGltYWdlKTsKCWlmIChyZXQpCgkJYmJfcGVycm9yX21zZygiaW5pdF9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKCglmcmVlKGltYWdlKTsKCglyZXR1cm4gcmV0ID09IDA7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHZvaWQKb2JqX3N0cmluZ19wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAoJCQkJIGNvbnN0IGNoYXIgKnN0cmluZykKewoJc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggKnA7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKCXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyaW5nKSArIDE7CgljaGFyICpsb2M7CgoJcCA9IHhtYWxsb2Moc2l6ZW9mKCpwKSk7CglwLT5uZXh0ID0gZi0+c3RyaW5nX3BhdGNoZXM7CglwLT5yZWxvY19zZWNpZHggPSBzZWNpZHg7CglwLT5yZWxvY19vZmZzZXQgPSBvZmZzZXQ7CglmLT5zdHJpbmdfcGF0Y2hlcyA9IHA7CgoJc3Ryc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiKTsKCWlmIChzdHJzZWMgPT0gTlVMTCkgewoJCXN0cnNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua3N0cnRhYiIsIDEsIGxlbik7CgkJcC0+c3RyaW5nX29mZnNldCA9IDA7CgkJbG9jID0gc3Ryc2VjLT5jb250ZW50czsKCX0gZWxzZSB7CgkJcC0+c3RyaW5nX29mZnNldCA9IHN0cnNlYy0+aGVhZGVyLnNoX3NpemU7CgkJbG9jID0gb2JqX2V4dGVuZF9zZWN0aW9uKHN0cnNlYywgbGVuKTsKCX0KCW1lbWNweShsb2MsIHN0cmluZywgbGVuKTsKfQoKc3RhdGljIHZvaWQKb2JqX3N5bWJvbF9wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAoJCQkJIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pCnsKCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOwoKCXAgPSB4bWFsbG9jKHNpemVvZigqcCkpOwoJcC0+bmV4dCA9IGYtPnN5bWJvbF9wYXRjaGVzOwoJcC0+cmVsb2Nfc2VjaWR4ID0gc2VjaWR4OwoJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OwoJcC0+c3ltID0gc3ltOwoJZi0+c3ltYm9sX3BhdGNoZXMgPSBwOwp9CgpzdGF0aWMgdm9pZCBvYmpfY2hlY2tfdW5kZWZpbmVkcyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCnsKCXVuc2lnbmVkIGk7CgoJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fVU5ERUYpIHsKCQkJCWlmIChFTEZfU1RfQklORChzeW0tPmluZm8pID09IFNUQl9XRUFLKSB7CgkJCQkJc3ltLT5zZWNpZHggPSBTSE5fQUJTOwoJCQkJCXN5bS0+dmFsdWUgPSAwOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIWZsYWdfcXVpZXQpCgkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnJlc29sdmVkIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CgkJCQl9CgkJCX0KCX0KfQoKc3RhdGljIHZvaWQgb2JqX2FsbG9jYXRlX2NvbW1vbnMoc3RydWN0IG9ial9maWxlICpmKQp7CglzdHJ1Y3QgY29tbW9uX2VudHJ5IHsKCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpuZXh0OwoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cgl9ICpjb21tb25faGVhZCA9IE5VTEw7CgoJdW5zaWduZWQgbG9uZyBpOwoKCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgewoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQlpZiAoc3ltLT5zZWNpZHggPT0gU0hOX0NPTU1PTikgewoJCQkJLyogQ29sbGVjdCBhbGwgQ09NTU9OIHN5bWJvbHMgYW5kIHNvcnQgdGhlbSBieSBzaXplIHNvIGFzIHRvCgkJCQkgICBtaW5pbWl6ZSBzcGFjZSB3YXN0ZWQgYnkgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gICovCgkJCQl7CgkJCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOwoJCQkJCWZvciAocCA9ICZjb21tb25faGVhZDsgKnA7IHAgPSAmKCpwKS0+bmV4dCkKCQkJCQkJaWYgKHN5bS0+c2l6ZSA8PSAoKnApLT5zeW0tPnNpemUpCgkJCQkJCQlicmVhazsKCgkJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKCQkJCQluLT5uZXh0ID0gKnA7CgkJCQkJbi0+c3ltID0gc3ltOwoJCQkJCSpwID0gbjsKCQkJCX0KCQkJfQoJfQoKCWZvciAoaSA9IDE7IGkgPCBmLT5sb2NhbF9zeW10YWJfc2l6ZTsgKytpKSB7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bSA9IGYtPmxvY2FsX3N5bXRhYltpXTsKCQlpZiAoc3ltICYmIHN5bS0+c2VjaWR4ID09IFNITl9DT01NT04pIHsKCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOwoJCQlmb3IgKHAgPSAmY29tbW9uX2hlYWQ7ICpwOyBwID0gJigqcCktPm5leHQpCgkJCQlpZiAoc3ltID09ICgqcCktPnN5bSkKCQkJCQlicmVhazsKCQkJCWVsc2UgaWYgKHN5bS0+c2l6ZSA8ICgqcCktPnN5bS0+c2l6ZSkgewoJCQkJCW4gPSBhbGxvY2Eoc2l6ZW9mKCpuKSk7CgkJCQkJbi0+bmV4dCA9ICpwOwoJCQkJCW4tPnN5bSA9IHN5bTsKCQkJCQkqcCA9IG47CgkJCQkJYnJlYWs7CgkJCQl9CgkJfQoJfQoKCWlmIChjb21tb25faGVhZCkgewoJCS8qIEZpbmQgdGhlIGJzcyBzZWN0aW9uLiAgKi8KCQlmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkKCQkJaWYgKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQoJCQkJYnJlYWs7CgoJCS8qIElmIGZvciBzb21lIHJlYXNvbiB0aGVyZSBoYWRuJ3QgYmVlbiBvbmUsIGNyZWF0ZSBvbmUuICAqLwoJCWlmIChpID09IGYtPmhlYWRlci5lX3NobnVtKSB7CgkJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCQkJZi0+c2VjdGlvbnMgPSB4cmVhbGxvYyhmLT5zZWN0aW9ucywgKGkgKyAxKSAqIHNpemVvZihzZWMpKTsKCQkJZi0+c2VjdGlvbnNbaV0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CgkJCWYtPmhlYWRlci5lX3NobnVtID0gaSArIDE7CgoJCQlzZWMtPmhlYWRlci5zaF90eXBlID0gU0hUX1BST0dCSVRTOwoJCQlzZWMtPmhlYWRlci5zaF9mbGFncyA9IFNIRl9XUklURSB8IFNIRl9BTExPQzsKCQkJc2VjLT5uYW1lID0gIi5ic3MiOwoJCQlzZWMtPmlkeCA9IGk7CgkJfQoKCQkvKiBBbGxvY2F0ZSB0aGUgQ09NTU9OUy4gICovCgkJewoJCQlFbGZXKEFkZHIpIGJzc19zaXplID0gZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9zaXplOwoJCQlFbGZXKEFkZHIpIG1heF9hbGlnbiA9IGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduOwoJCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpjOwoKCQkJZm9yIChjID0gY29tbW9uX2hlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CgkJCQlFbGZXKEFkZHIpIGFsaWduID0gYy0+c3ltLT52YWx1ZTsKCgkJCQlpZiAoYWxpZ24gPiBtYXhfYWxpZ24pCgkJCQkJbWF4X2FsaWduID0gYWxpZ247CgkJCQlpZiAoYnNzX3NpemUgJiAoYWxpZ24gLSAxKSkKCQkJCQlic3Nfc2l6ZSA9IChic3Nfc2l6ZSB8IChhbGlnbiAtIDEpKSArIDE7CgoJCQkJYy0+c3ltLT5zZWNpZHggPSBpOwoJCQkJYy0+c3ltLT52YWx1ZSA9IGJzc19zaXplOwoKCQkJCWJzc19zaXplICs9IGMtPnN5bS0+c2l6ZTsKCQkJfQoKCQkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9zaXplID0gYnNzX3NpemU7CgkJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gbWF4X2FsaWduOwoJCX0KCX0KCgkvKiBGb3IgdGhlIHNha2Ugb2YgcGF0Y2ggcmVsb2NhdGlvbiBhbmQgcGFyYW1ldGVyIGluaXRpYWxpemF0aW9uLAoJICAgYWxsb2NhdGUgemVyb2VkIGRhdGEgZm9yIE5PQklUUyBzZWN0aW9ucyBub3cuICBOb3RlIHRoYXQgYWZ0ZXIKCSAgIHRoaXMgd2UgY2Fubm90IGFzc3VtZSBOT0JJVFMgYXJlIHJlYWxseSBlbXB0eS4gICovCglmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqcyA9IGYtPnNlY3Rpb25zW2ldOwoJCWlmIChzLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKSB7CgkJCWlmIChzLT5oZWFkZXIuc2hfc2l6ZSAhPSAwKQoJCQkJcy0+Y29udGVudHMgPSBtZW1zZXQoeG1hbGxvYyhzLT5oZWFkZXIuc2hfc2l6ZSksCgkJCQkJCTAsIHMtPmhlYWRlci5zaF9zaXplKTsKCQkJZWxzZQoJCQkJcy0+Y29udGVudHMgPSBOVUxMOwoKCQkJcy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CgkJfQoJfQp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbG9hZF9zaXplKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJdW5zaWduZWQgbG9uZyBkb3QgPSAwOwoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJLyogRmluYWxpemUgdGhlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgcmVsYXRpdmUgdG8gb25lIGFub3RoZXIuICAqLwoKCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgewoJCUVsZlcoQWRkcikgYWxpZ247CgoJCWFsaWduID0gc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduOwoJCWlmIChhbGlnbiAmJiAoZG90ICYgKGFsaWduIC0gMSkpKQoJCQlkb3QgPSAoZG90IHwgKGFsaWduIC0gMSkpICsgMTsKCgkJc2VjLT5oZWFkZXIuc2hfYWRkciA9IGRvdDsKCQlkb3QgKz0gc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCX0KCglyZXR1cm4gZG90Owp9CgpzdGF0aWMgaW50IG9ial9yZWxvY2F0ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIEVsZlcoQWRkcikgYmFzZSkKewoJaW50IGksIG4gPSBmLT5oZWFkZXIuZV9zaG51bTsKCWludCByZXQgPSAxOwoKCS8qIEZpbmFsaXplIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KCglmLT5iYXNlYWRkciA9IGJhc2U7Cglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQoJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkciArPSBiYXNlOwoKCS8qIEFuZCBpdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSByZWxvY2F0aW9ucy4gICovCgoJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqcmVsc2VjLCAqc3ltc2VjLCAqdGFyZ3NlYywgKnN0cnNlYzsKCQlFbGZXKFJlbE0pICogcmVsLCAqcmVsZW5kOwoJCUVsZlcoU3ltKSAqIHN5bXRhYjsKCQljb25zdCBjaGFyICpzdHJ0YWI7CgoJCXJlbHNlYyA9IGYtPnNlY3Rpb25zW2ldOwoJCWlmIChyZWxzZWMtPmhlYWRlci5zaF90eXBlICE9IFNIVF9SRUxNKQoJCQljb250aW51ZTsKCgkJc3ltc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfbGlua107CgkJdGFyZ3NlYyA9IGYtPnNlY3Rpb25zW3JlbHNlYy0+aGVhZGVyLnNoX2luZm9dOwoJCXN0cnNlYyA9IGYtPnNlY3Rpb25zW3N5bXNlYy0+aGVhZGVyLnNoX2xpbmtdOwoKCQlyZWwgPSAoRWxmVyhSZWxNKSAqKSByZWxzZWMtPmNvbnRlbnRzOwoJCXJlbGVuZCA9IHJlbCArIChyZWxzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoUmVsTSkpKTsKCQlzeW10YWIgPSAoRWxmVyhTeW0pICopIHN5bXNlYy0+Y29udGVudHM7CgkJc3RydGFiID0gKGNvbnN0IGNoYXIgKikgc3Ryc2VjLT5jb250ZW50czsKCgkJZm9yICg7IHJlbCA8IHJlbGVuZDsgKytyZWwpIHsKCQkJRWxmVyhBZGRyKSB2YWx1ZSA9IDA7CgkJCXN0cnVjdCBvYmpfc3ltYm9sICppbnRzeW0gPSBOVUxMOwoJCQl1bnNpZ25lZCBsb25nIHN5bW5keDsKCQkJRWxmVyhTeW0pICogZXh0c3ltID0gMDsKCQkJY29uc3QgY2hhciAqZXJybXNnOwoKCQkJLyogQXR0ZW1wdCB0byBmaW5kIGEgdmFsdWUgdG8gdXNlIGZvciB0aGlzIHJlbG9jYXRpb24uICAqLwoKCQkJc3ltbmR4ID0gRUxGX1JfU1lNKHJlbC0+cl9pbmZvKTsKCQkJaWYgKHN5bW5keCkgewoJCQkJLyogTm90ZSB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KCgkJCQlleHRzeW0gPSAmc3ltdGFiW3N5bW5keF07CgkJCQlpZiAoRUxGX1NUX0JJTkQoZXh0c3ltLT5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpIHsKCQkJCQkvKiBMb2NhbCBzeW1ib2xzIHdlIGxvb2sgdXAgaW4gdGhlIGxvY2FsIHRhYmxlIHRvIGJlIHN1cmUKCQkJCQkgICB3ZSBnZXQgdGhlIG9uZSB0aGF0IGlzIHJlYWxseSBpbnRlbmRlZC4gICovCgkJCQkJaW50c3ltID0gZi0+bG9jYWxfc3ltdGFiW3N5bW5keF07CgkJCQl9IGVsc2UgewoJCQkJCS8qIE90aGVycyB3ZSBsb29rIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KCQkJCQljb25zdCBjaGFyICpuYW1lOwoJCQkJCWlmIChleHRzeW0tPnN0X25hbWUpCgkJCQkJCW5hbWUgPSBzdHJ0YWIgKyBleHRzeW0tPnN0X25hbWU7CgkJCQkJZWxzZQoJCQkJCQluYW1lID0gZi0+c2VjdGlvbnNbZXh0c3ltLT5zdF9zaG5keF0tPm5hbWU7CgkJCQkJaW50c3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIG5hbWUpOwoJCQkJfQoKCQkJCXZhbHVlID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBpbnRzeW0pOwoJCQkJaW50c3ltLT5yZWZlcmVuY2VkID0gMTsKCQkJfQojaWYgU0hUX1JFTE0gPT0gU0hUX1JFTEEKI2lmIGRlZmluZWQoX19hbHBoYV9fKSAmJiBkZWZpbmVkKEFYUF9CUk9LRU5fR0FTKQoJCQkvKiBXb3JrIGFyb3VuZCBhIG5hc3R5IEdBUyBidWcsIHRoYXQgaXMgZml4ZWQgYXMgb2YgMi43LjAuOS4gICovCgkJCWlmICghZXh0c3ltIHx8ICFleHRzeW0tPnN0X25hbWUgfHwKCQkJCQlFTEZfU1RfQklORChleHRzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKI2VuZGlmCgkJCQl2YWx1ZSArPSByZWwtPnJfYWRkZW5kOwojZW5kaWYKCgkJCS8qIERvIGl0ISAqLwoJCQlzd2l0Y2ggKGFyY2hfYXBwbHlfcmVsb2NhdGlvbgoJCQkJCShmLCB0YXJnc2VjLCAvKnN5bXNlYywqLyBpbnRzeW0sIHJlbCwgdmFsdWUpCgkJCSkgewoJCQljYXNlIG9ial9yZWxvY19vazoKCQkJCWJyZWFrOwoKCQkJY2FzZSBvYmpfcmVsb2Nfb3ZlcmZsb3c6CgkJCQllcnJtc2cgPSAiUmVsb2NhdGlvbiBvdmVyZmxvdyI7CgkJCQlnb3RvIGJhZF9yZWxvYzsKCQkJY2FzZSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOgoJCQkJZXJybXNnID0gIkRhbmdlcm91cyByZWxvY2F0aW9uIjsKCQkJCWdvdG8gYmFkX3JlbG9jOwoJCQljYXNlIG9ial9yZWxvY191bmhhbmRsZWQ6CgkJCQllcnJtc2cgPSAiVW5oYW5kbGVkIHJlbG9jYXRpb24iOwpiYWRfcmVsb2M6CgkJCQlpZiAoZXh0c3ltKSB7CgkJCQkJYmJfZXJyb3JfbXNnKCIlcyBvZiB0eXBlICVsZCBmb3IgJXMiLCBlcnJtc2csCgkJCQkJCQkobG9uZykgRUxGX1JfVFlQRShyZWwtPnJfaW5mbyksCgkJCQkJCQlzdHJ0YWIgKyBleHRzeW0tPnN0X25hbWUpOwoJCQkJfSBlbHNlIHsKCQkJCQliYl9lcnJvcl9tc2coIiVzIG9mIHR5cGUgJWxkIiwgZXJybXNnLAoJCQkJCQkJKGxvbmcpIEVMRl9SX1RZUEUocmVsLT5yX2luZm8pKTsKCQkJCX0KCQkJCXJldCA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvKiBGaW5hbGx5LCB0YWtlIGNhcmUgb2YgdGhlIHBhdGNoZXMuICAqLwoKCWlmIChmLT5zdHJpbmdfcGF0Y2hlcykgewoJCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpwOwoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc3Ryc2VjOwoJCUVsZlcoQWRkcikgc3Ryc2VjX2Jhc2U7CgkJc3Ryc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiKTsKCQlzdHJzZWNfYmFzZSA9IHN0cnNlYy0+aGVhZGVyLnNoX2FkZHI7CgoJCWZvciAocCA9IGYtPnN0cmluZ19wYXRjaGVzOyBwOyBwID0gcC0+bmV4dCkgewoJCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnRhcmdzZWMgPSBmLT5zZWN0aW9uc1twLT5yZWxvY19zZWNpZHhdOwoJCQkqKEVsZlcoQWRkcikgKikgKHRhcmdzZWMtPmNvbnRlbnRzICsgcC0+cmVsb2Nfb2Zmc2V0KQoJCQkJPSBzdHJzZWNfYmFzZSArIHAtPnN0cmluZ19vZmZzZXQ7CgkJfQoJfQoKCWlmIChmLT5zeW1ib2xfcGF0Y2hlcykgewoJCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOwoKCQlmb3IgKHAgPSBmLT5zeW1ib2xfcGF0Y2hlczsgcDsgcCA9IHAtPm5leHQpIHsKCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjID0gZi0+c2VjdGlvbnNbcC0+cmVsb2Nfc2VjaWR4XTsKCQkJKihFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHAtPnJlbG9jX29mZnNldCkKCQkJCT0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBwLT5zeW0pOwoJCX0KCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IG9ial9jcmVhdGVfaW1hZ2Uoc3RydWN0IG9ial9maWxlICpmLCBjaGFyICppbWFnZSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CglFbGZXKEFkZHIpIGJhc2UgPSBmLT5iYXNlYWRkcjsKCglmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKCQljaGFyICpzZWNpbWc7CgoJCWlmIChzZWMtPmNvbnRlbnRzID09IDAgfHwgc2VjLT5oZWFkZXIuc2hfc2l6ZSA9PSAwKQoJCQljb250aW51ZTsKCgkJc2VjaW1nID0gaW1hZ2UgKyAoc2VjLT5oZWFkZXIuc2hfYWRkciAtIGJhc2UpOwoKCQkvKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGVkIGRhdGEgZm9yIE5PQklUUyBzZWN0aW9ucyBlYXJsaWVyLiAgKi8KCQltZW1jcHkoc2VjaW1nLCBzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplKTsKCX0KCglyZXR1cm4gMTsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKEZJTEUgKiBmcCwgaW50IGxvYWRwcm9nYml0cyBBVFRSSUJVVEVfVU5VU0VEKQp7CglzdHJ1Y3Qgb2JqX2ZpbGUgKmY7CglFbGZXKFNoZHIpICogc2VjdGlvbl9oZWFkZXJzOwoJc2l6ZV90IHNobnVtLCBpOwoJY2hhciAqc2hzdHJ0YWI7CgoJLyogUmVhZCB0aGUgZmlsZSBoZWFkZXIuICAqLwoKCWYgPSBhcmNoX25ld19maWxlKCk7CglmLT5zeW1ib2xfY21wID0gc3RyY21wOwoJZi0+c3ltYm9sX2hhc2ggPSBvYmpfZWxmX2hhc2g7CglmLT5sb2FkX29yZGVyX3NlYXJjaF9zdGFydCA9ICZmLT5sb2FkX29yZGVyOwoKCWZzZWVrKGZwLCAwLCBTRUVLX1NFVCk7CglpZiAoZnJlYWQoJmYtPmhlYWRlciwgc2l6ZW9mKGYtPmhlYWRlciksIDEsIGZwKSAhPSAxKSB7CgkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcnJvciByZWFkaW5nIEVMRiBoZWFkZXIiKTsKCX0KCglpZiAoZi0+aGVhZGVyLmVfaWRlbnRbRUlfTUFHMF0gIT0gRUxGTUFHMAoJCQl8fCBmLT5oZWFkZXIuZV9pZGVudFtFSV9NQUcxXSAhPSBFTEZNQUcxCgkJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX01BRzJdICE9IEVMRk1BRzIKCQkJfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfTUFHM10gIT0gRUxGTUFHMykgewoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgYW4gRUxGIGZpbGUiKTsKCX0KCWlmIChmLT5oZWFkZXIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1NNCgkJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX0RBVEFdICE9IChCQl9CSUdfRU5ESUFOCgkJCQk/IEVMRkRBVEEyTVNCIDogRUxGREFUQTJMU0IpCgkJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX1ZFUlNJT05dICE9IEVWX0NVUlJFTlQKCQkJfHwgIU1BVENIX01BQ0hJTkUoZi0+aGVhZGVyLmVfbWFjaGluZSkpIHsKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiRUxGIGZpbGUgbm90IGZvciB0aGlzIGFyY2hpdGVjdHVyZSIpOwoJfQoJaWYgKGYtPmhlYWRlci5lX3R5cGUgIT0gRVRfUkVMKSB7CgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkVMRiBmaWxlIG5vdCBhIHJlbG9jYXRhYmxlIG9iamVjdCIpOwoJfQoKCS8qIFJlYWQgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCgoJaWYgKGYtPmhlYWRlci5lX3NoZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhTaGRyKSkpIHsKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2VjdGlvbiBoZWFkZXIgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCgkJCQkodW5zaWduZWQgbG9uZykgZi0+aGVhZGVyLmVfc2hlbnRzaXplLAoJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFNoZHIpKSk7Cgl9CgoJc2hudW0gPSBmLT5oZWFkZXIuZV9zaG51bTsKCWYtPnNlY3Rpb25zID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uICopICogc2hudW0pOwoJbWVtc2V0KGYtPnNlY3Rpb25zLCAwLCBzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uICopICogc2hudW0pOwoKCXNlY3Rpb25faGVhZGVycyA9IGFsbG9jYShzaXplb2YoRWxmVyhTaGRyKSkgKiBzaG51bSk7Cglmc2VlayhmcCwgZi0+aGVhZGVyLmVfc2hvZmYsIFNFRUtfU0VUKTsKCWlmIChmcmVhZChzZWN0aW9uX2hlYWRlcnMsIHNpemVvZihFbGZXKFNoZHIpKSwgc2hudW0sIGZwKSAhPSBzaG51bSkgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgcmVhZGluZyBFTEYgc2VjdGlvbiBoZWFkZXJzIik7Cgl9CgoJLyogUmVhZCB0aGUgc2VjdGlvbiBkYXRhLiAgKi8KCglmb3IgKGkgPSAwOyBpIDwgc2hudW07ICsraSkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCQlmLT5zZWN0aW9uc1tpXSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKCgkJc2VjLT5oZWFkZXIgPSBzZWN0aW9uX2hlYWRlcnNbaV07CgkJc2VjLT5pZHggPSBpOwoKCQlpZiAoc2VjLT5oZWFkZXIuc2hfc2l6ZSkgewoJCQlzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKCQkJY2FzZSBTSFRfTlVMTDoKCQkJY2FzZSBTSFRfTk9URToKCQkJY2FzZSBTSFRfTk9CSVRTOgoJCQkJLyogaWdub3JlICovCgkJCQlicmVhazsKCgkJCWNhc2UgU0hUX1BST0dCSVRTOgojaWYgTE9BREJJVFMKCQkJCWlmICghbG9hZHByb2diaXRzKSB7CgkJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CgkJCQkJYnJlYWs7CgkJCQl9CiNlbmRpZgoJCQljYXNlIFNIVF9TWU1UQUI6CgkJCWNhc2UgU0hUX1NUUlRBQjoKCQkJY2FzZSBTSFRfUkVMTToKCQkJCWlmIChzZWMtPmhlYWRlci5zaF9zaXplID4gMCkgewoJCQkJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNlYy0+aGVhZGVyLnNoX3NpemUpOwoJCQkJCWZzZWVrKGZwLCBzZWMtPmhlYWRlci5zaF9vZmZzZXQsIFNFRUtfU0VUKTsKCQkJCQlpZiAoZnJlYWQoc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSwgMSwgZnApICE9IDEpIHsKCQkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcnJvciByZWFkaW5nIEVMRiBzZWN0aW9uIGRhdGEiKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXNlYy0+Y29udGVudHMgPSBOVUxMOwoJCQkJfQoJCQkJYnJlYWs7CgojaWYgU0hUX1JFTE0gPT0gU0hUX1JFTAoJCQljYXNlIFNIVF9SRUxBOgoJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlJFTEEgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSIpOwojZWxzZQoJCQljYXNlIFNIVF9SRUw6CgkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiUkVMIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUiKTsKI2VuZGlmCgkJCWRlZmF1bHQ6CgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfdHlwZSA+PSBTSFRfTE9QUk9DKSB7CgkJCQkJLyogQXNzdW1lIHByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzIGFyZSBkZWJ1ZwoJCQkJCSAgIGluZm8gYW5kIGNhbiBzYWZlbHkgYmUgaWdub3JlZC4gIElmIHRoaXMgaXMgZXZlciBub3QKCQkJCQkgICB0aGUgY2FzZSAoSGVsbG8gTUlQUz8pLCBkb24ndCBwdXQgaWZkZWZzIGhlcmUgYnV0CgkJCQkJICAgY3JlYXRlIGFuIGFyY2hfbG9hZF9wcm9jX3NlY3Rpb24oKS4gICovCgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGhhbmRsZSBzZWN0aW9ucyBvZiB0eXBlICVsZCIsCgkJCQkJCShsb25nKSBzZWMtPmhlYWRlci5zaF90eXBlKTsKCQkJfQoJCX0KCX0KCgkvKiBEbyB3aGF0IHNvcnQgb2YgaW50ZXJwcmV0YXRpb24gYXMgbmVlZGVkIGJ5IGVhY2ggc2VjdGlvbi4gICovCgoJc2hzdHJ0YWIgPSBmLT5zZWN0aW9uc1tmLT5oZWFkZXIuZV9zaHN0cm5keF0tPmNvbnRlbnRzOwoKCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMgPSBmLT5zZWN0aW9uc1tpXTsKCQlzZWMtPm5hbWUgPSBzaHN0cnRhYiArIHNlYy0+aGVhZGVyLnNoX25hbWU7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYyA9IGYtPnNlY3Rpb25zW2ldOwoKCQkvKiAubW9kaW5mbyBzaG91bGQgYmUgY29udGVudHMgb25seSBidXQgZ2NjIGhhcyBubyBhdHRyaWJ1dGUgZm9yIHRoYXQuCgkJICogVGhlIGtlcm5lbCBtYXkgaGF2ZSBtYXJrZWQgLm1vZGluZm8gYXMgQUxMT0MsIGlnbm9yZSB0aGlzIGJpdC4KCQkgKi8KCQlpZiAoc3RyY21wKHNlYy0+bmFtZSwgIi5tb2RpbmZvIikgPT0gMCkKCQkJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJj0gflNIRl9BTExPQzsKCgkJaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKQoJCQlvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihmLCBzZWMpOwoKCQlzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKCQljYXNlIFNIVF9TWU1UQUI6CgkJCXsKCQkJCXVuc2lnbmVkIGxvbmcgbnN5bSwgajsKCQkJCWNoYXIgKnN0cnRhYjsKCQkJCUVsZlcoU3ltKSAqIHN5bTsKCgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhTeW0pKSkgewoJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW1ib2wgc2l6ZSBtaXNtYXRjaDogJWx1ICE9ICVsdSIsCgkJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKCQkJCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoRWxmVyhTeW0pKSk7CgkJCQl9CgoJCQkJbnN5bSA9IHNlYy0+aGVhZGVyLnNoX3NpemUgLyBzaXplb2YoRWxmVyhTeW0pKTsKCQkJCXN0cnRhYiA9IGYtPnNlY3Rpb25zW3NlYy0+aGVhZGVyLnNoX2xpbmtdLT5jb250ZW50czsKCQkJCXN5bSA9IChFbGZXKFN5bSkgKikgc2VjLT5jb250ZW50czsKCgkJCQkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSB0YWJsZSBvZiBsb2NhbCBzeW1ib2xzLiAgKi8KCQkJCWogPSBmLT5sb2NhbF9zeW10YWJfc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2luZm87CgkJCQlmLT5sb2NhbF9zeW10YWIgPSB4emFsbG9jKGogKiBzaXplb2Yoc3RydWN0IG9ial9zeW1ib2wgKikpOwoKCQkJCS8qIEluc2VydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KCQkJCWZvciAoaiA9IDEsICsrc3ltOyBqIDwgbnN5bTsgKytqLCArK3N5bSkgewoJCQkJCUVsZlcoQWRkcikgdmFsID0gc3ltLT5zdF92YWx1ZTsKCQkJCQljb25zdCBjaGFyICpuYW1lOwoJCQkJCWlmIChzeW0tPnN0X25hbWUpCgkJCQkJCW5hbWUgPSBzdHJ0YWIgKyBzeW0tPnN0X25hbWU7CgkJCQkJZWxzZSBpZiAoc3ltLT5zdF9zaG5keCA8IHNobnVtKQoJCQkJCQluYW1lID0gZi0+c2VjdGlvbnNbc3ltLT5zdF9zaG5keF0tPm5hbWU7CgkJCQkJZWxzZQoJCQkJCQljb250aW51ZTsKI2lmIGRlZmluZWQoX19TSDVfXykKCQkJCQkvKgoJCQkJCSAqIEZvciBzaDY0IGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHRhcmdldCBvZiBhIGJyYW5jaAoJCQkJCSAqIHJlcXVpcmVzIGEgbW9kZSBzd2l0Y2ggKDMyIHRvIDE2IGFuZCBiYWNrIGFnYWluKS4KCQkJCQkgKgoJCQkJCSAqIFRoaXMgaXMgaW1wbGllZCBieSB0aGUgbHNiIGJlaW5nIHNldCBpbiB0aGUgdGFyZ2V0CgkJCQkJICogYWRkcmVzcyBmb3IgU0htZWRpYSBtb2RlIGFuZCBjbGVhciBmb3IgU0hjb21wYWN0LgoJCQkJCSAqLwoJCQkJCXZhbCB8PSBzeW0tPnN0X290aGVyICYgNDsKI2VuZGlmCgkJCQkJb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgaiwgc3ltLT5zdF9pbmZvLCBzeW0tPnN0X3NobmR4LAoJCQkJCQkJdmFsLCBzeW0tPnN0X3NpemUpOwoJCQkJfQoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFNIVF9SRUxNOgoJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhSZWxNKSkpIHsKCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyZWxvY2F0aW9uIGVudHJ5IHNpemUgbWlzbWF0Y2g6ICVsdSAhPSAlbHUiLAoJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFJlbE0pKSk7CgkJCX0KCQkJYnJlYWs7CgkJCS8qIFhYWCAgUmVsb2NhdGlvbiBjb2RlIGZyb20gbW9kdXRpbHMtMi4zLjE5IGlzIG5vdCBoZXJlLgoJCQkgKiBXaHk/ICBUaGF0J3MgYWJvdXQgMjAgbGluZXMgb2YgY29kZSBmcm9tIG9iai9vYmpfbG9hZC5jLAoJCQkgKiB3aGljaCBnZXRzIGRvbmUgaW4gYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHRoZSBzZWN0aW9ucy4KCQkJICogVGhpcyBCdXN5Qm94IGluc21vZCBkb2VzIHNpbWlsYXIgd29yayBpbiBvYmpfcmVsb2NhdGUoKS4gKi8KCQl9Cgl9CgoJcmV0dXJuIGY7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTQovKgogKiBsb2FkIHRoZSB1bmxvYWRlZCBzZWN0aW9ucyBkaXJlY3RseSBpbnRvIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5CiAqIGtlcm5lbCBmb3IgdGhlIG1vZHVsZQogKi8KCnN0YXRpYyBpbnQgb2JqX2xvYWRfcHJvZ2JpdHMoRklMRSAqIGZwLCBzdHJ1Y3Qgb2JqX2ZpbGUqIGYsIGNoYXIqIGltYWdlYmFzZSkKewoJRWxmVyhBZGRyKSBiYXNlID0gZi0+YmFzZWFkZHI7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24qIHNlYzsKCglmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKCgkJLyogc2VjdGlvbiBhbHJlYWR5IGxvYWRlZD8gKi8KCQlpZiAoc2VjLT5jb250ZW50cyAhPSBOVUxMKQoJCQljb250aW51ZTsKCgkJaWYgKHNlYy0+aGVhZGVyLnNoX3NpemUgPT0gMCkKCQkJY29udGludWU7CgoJCXNlYy0+Y29udGVudHMgPSBpbWFnZWJhc2UgKyAoc2VjLT5oZWFkZXIuc2hfYWRkciAtIGJhc2UpOwoJCWZzZWVrKGZwLCBzZWMtPmhlYWRlci5zaF9vZmZzZXQsIFNFRUtfU0VUKTsKCQlpZiAoZnJlYWQoc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSwgMSwgZnApICE9IDEpIHsKCQkJYmJfcGVycm9yX21zZygiZXJyb3IgcmVhZGluZyBFTEYgc2VjdGlvbiBkYXRhIik7CgkJCXJldHVybiAwOwoJCX0KCgl9CglyZXR1cm4gMTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGhpZGVfc3BlY2lhbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNwZWNpYWxzW10gPSB7CgkJU1BGWCAiY2xlYW51cF9tb2R1bGUiLAoJCVNQRlggImluaXRfbW9kdWxlIiwKCQlTUEZYICJrZXJuZWxfdmVyc2lvbiIsCgkJTlVMTAoJfTsKCglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJY29uc3QgY2hhciAqY29uc3QgKnA7CgoJZm9yIChwID0gc3BlY2lhbHM7ICpwOyArK3ApIHsKCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgKnApOwoJCWlmIChzeW0gIT0gTlVMTCkKCQkJc3ltLT5pbmZvID0gRUxGX1NUX0lORk8oU1RCX0xPQ0FMLCBFTEZfU1RfVFlQRShzeW0tPmluZm8pKTsKCX0KfQoKCiNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQpzdGF0aWMgaW50IG9ial9ncGxfbGljZW5zZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKipsaWNlbnNlKQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCS8qIFRoaXMgbGlzdCBtdXN0IG1hdGNoICpleGFjdGx5KiB0aGUgbGlzdCBvZiBhbGxvd2FibGUgbGljZW5zZXMgaW4KCSAqIGxpbnV4L2luY2x1ZGUvbGludXgvbW9kdWxlLmguICBDaGVja2luZyBmb3IgbGVhZGluZyAiR1BMIiB3aWxsIG5vdAoJICogd29yaywgc29tZWJvZHkgd2lsbCB1c2UgIkdQTCBzdWNrcywgdGhpcyBpcyBwcm9wcmlldGFyeSIuCgkgKi8KCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBncGxfbGljZW5zZXNbXSA9IHsKCQkiR1BMIiwKCQkiR1BMIHYyIiwKCQkiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIsCgkJIkR1YWwgQlNEL0dQTCIsCgkJIkR1YWwgTVBML0dQTCIKCX07CgoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLm1vZGluZm8iKTsKCWlmIChzZWMpIHsKCQljb25zdCBjaGFyICp2YWx1ZSwgKnB0ciwgKmVuZHB0cjsKCQlwdHIgPSBzZWMtPmNvbnRlbnRzOwoJCWVuZHB0ciA9IHB0ciArIHNlYy0+aGVhZGVyLnNoX3NpemU7CgkJd2hpbGUgKHB0ciA8IGVuZHB0cikgewoJCQl2YWx1ZSA9IHN0cmNocihwdHIsICc9Jyk7CgkJCWlmICh2YWx1ZSAmJiBzdHJuY21wKHB0ciwgImxpY2Vuc2UiLCB2YWx1ZS1wdHIpID09IDApIHsKCQkJCXVuc2lnbmVkIGk7CgkJCQlpZiAobGljZW5zZSkKCQkJCQkqbGljZW5zZSA9IHZhbHVlKzE7CgkJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShncGxfbGljZW5zZXMpOyArK2kpIHsKCQkJCQlpZiAoc3RyY21wKHZhbHVlKzEsIGdwbF9saWNlbnNlc1tpXSkgPT0gMCkKCQkJCQkJcmV0dXJuIDA7CgkJCQl9CgkJCQlyZXR1cm4gMjsKCQkJfQoJCQlwdHIgPSBzdHJjaHIocHRyLCAnXDAnKTsKCQkJaWYgKHB0cikKCQkJCXB0cisrOwoJCQllbHNlCgkJCQlwdHIgPSBlbmRwdHI7CgkJfQoJfQoJcmV0dXJuIDE7Cn0KCiNkZWZpbmUgVEFJTlRfRklMRU5BTUUgICAgICAgICAgICAgICAgICAiL3Byb2Mvc3lzL2tlcm5lbC90YWludGVkIgojZGVmaW5lIFRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSAgICAgICAgKDEgPDwgMCkKI2RlZmluZSBUQUlOVF9GT1JDRURfTU9EVUxFICAgICAgICAgICAgICgxIDw8IDEpCiNkZWZpbmUgVEFJTlRfVU5TQUZFX1NNUCAgICAgICAgICAgICAgICAoMSA8PCAyKQojZGVmaW5lIFRBSU5UX1VSTCAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudHV4Lm9yZy9sa21sLyNleHBvcnQtdGFpbnRlZCIKCnN0YXRpYyB2b2lkIHNldF90YWludGVkKGludCBmZCwgY2hhciAqbV9uYW1lLAoJCWludCBrZXJuZWxfaGFzX3RhaW50ZWQsIGludCB0YWludCwgY29uc3QgY2hhciAqdGV4dDEsIGNvbnN0IGNoYXIgKnRleHQyKQp7CglzdGF0aWMgc21hbGxpbnQgcHJpbnRlZF9pbmZvOwoKCWNoYXIgYnVmWzgwXTsKCWludCBvbGR2YWw7CgoJaWYgKGZkIDwgMCAmJiAha2VybmVsX2hhc190YWludGVkKQoJCXJldHVybjsJCS8qIE5ldyBtb2R1dGlscyBvbiBvbGQga2VybmVsICovCglwcmludGYoIldhcm5pbmc6IGxvYWRpbmcgJXMgd2lsbCB0YWludCB0aGUga2VybmVsOiAlcyVzXG4iLAoJCQltX25hbWUsIHRleHQxLCB0ZXh0Mik7CglpZiAoIXByaW50ZWRfaW5mbykgewoJCXByaW50ZigiICBTZWUgJXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRhaW50ZWQgbW9kdWxlc1xuIiwgVEFJTlRfVVJMKTsKCQlwcmludGVkX2luZm8gPSAxOwoJfQoJaWYgKGZkID49IDApIHsKCQlyZWFkKGZkLCBidWYsIHNpemVvZihidWYpLTEpOwoJCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CgkJb2xkdmFsID0gc3RydG91bChidWYsIE5VTEwsIDEwKTsKCQlzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvbGR2YWwgfCB0YWludCk7CgkJd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOwoJfQp9CgovKiBDaGVjayBpZiBsb2FkaW5nIHRoaXMgbW9kdWxlIHdpbGwgdGFpbnQgdGhlIGtlcm5lbC4gKi8Kc3RhdGljIHZvaWQgY2hlY2tfdGFpbnRlZF9tb2R1bGUoc3RydWN0IG9ial9maWxlICpmLCBjaGFyICptX25hbWUpCnsKCXN0YXRpYyBjb25zdCBjaGFyIHRhaW50ZWRfZmlsZVtdIEFMSUdOMSA9IFRBSU5UX0ZJTEVOQU1FOwoKCWludCBmZCwga2VybmVsX2hhc190YWludGVkOwoJY29uc3QgY2hhciAqcHRyOwoKCWtlcm5lbF9oYXNfdGFpbnRlZCA9IDE7CglmZCA9IG9wZW4odGFpbnRlZF9maWxlLCBPX1JEV1IpOwoJaWYgKGZkIDwgMCkgewoJCWlmIChlcnJubyA9PSBFTk9FTlQpCgkJCWtlcm5lbF9oYXNfdGFpbnRlZCA9IDA7CgkJZWxzZSBpZiAoZXJybm8gPT0gRUFDQ0VTKQoJCQlrZXJuZWxfaGFzX3RhaW50ZWQgPSAxOwoJCWVsc2UgewoJCQlwZXJyb3IodGFpbnRlZF9maWxlKTsKCQkJa2VybmVsX2hhc190YWludGVkID0gMDsKCQl9Cgl9CgoJc3dpdGNoIChvYmpfZ3BsX2xpY2Vuc2UoZiwgJnB0cikpIHsKCQljYXNlIDA6CgkJCWJyZWFrOwoJCWNhc2UgMToKCQkJc2V0X3RhaW50ZWQoZmQsIG1fbmFtZSwga2VybmVsX2hhc190YWludGVkLCBUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUsICJubyBsaWNlbnNlIiwgIiIpOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCS8qIFRoZSBtb2R1bGUgaGFzIGEgbm9uLUdQTCBsaWNlbnNlIHNvIHdlIHByZXRlbmQgdGhhdCB0aGUKCQkJICoga2VybmVsIGFsd2F5cyBoYXMgYSB0YWludCBmbGFnIHRvIGdldCBhIHdhcm5pbmcgZXZlbiBvbgoJCQkgKiBrZXJuZWxzIHdpdGhvdXQgdGhlIHByb2MgZmxhZy4KCQkJICovCgkJCXNldF90YWludGVkKGZkLCBtX25hbWUsIDEsIFRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSwgIm5vbi1HUEwgbGljZW5zZSAtICIsIHB0cik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXNldF90YWludGVkKGZkLCBtX25hbWUsIDEsIFRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSwgIlVuZXhwZWN0ZWQgcmV0dXJuIGZyb20gb2JqX2dwbF9saWNlbnNlIiwgIiIpOwoJCQlicmVhazsKCX0KCglpZiAoZmxhZ19mb3JjZV9sb2FkKQoJCXNldF90YWludGVkKGZkLCBtX25hbWUsIDEsIFRBSU5UX0ZPUkNFRF9NT0RVTEUsICJmb3JjZWQgbG9hZCIsICIiKTsKCglpZiAoZmQgPj0gMCkKCQljbG9zZShmZCk7Cn0KI2Vsc2UgLyogRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSAqLwojZGVmaW5lIGNoZWNrX3RhaW50ZWRfbW9kdWxlKHgsIHkpIGRvIHsgfSB3aGlsZSAoMCk7CiNlbmRpZiAvKiBGRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFICovCgojaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMKLyogYWRkIG1vZHVsZSBzb3VyY2UsIHRpbWVzdGFtcCwga2VybmVsIHZlcnNpb24gYW5kIGEgc3ltYm9sIGZvciB0aGUKICogc3RhcnQgb2Ygc29tZSBzZWN0aW9ucy4gIHRoaXMgaW5mbyBpcyB1c2VkIGJ5IGtzeW1vb3BzIHRvIGRvIGJldHRlcgogKiBkZWJ1Z2dpbmcuCiAqLwojaWYgIUVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCiNkZWZpbmUgZ2V0X21vZHVsZV92ZXJzaW9uKGYsIHN0cikgZ2V0X21vZHVsZV92ZXJzaW9uKHN0cikKI2VuZGlmCnN0YXRpYyBpbnQKZ2V0X21vZHVsZV92ZXJzaW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciBzdHJbU1RSVkVSU0lPTkxFTl0pCnsKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCglyZXR1cm4gbmV3X2dldF9tb2R1bGVfdmVyc2lvbihmLCBzdHIpOwojZWxzZSAgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLwoJc3RybmNweShzdHIsICI/Pz8iLCBzaXplb2Yoc3RyKSk7CglyZXR1cm4gLTE7CiNlbmRpZiAvKiBGRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCn0KCi8qIGFkZCBtb2R1bGUgc291cmNlLCB0aW1lc3RhbXAsIGtlcm5lbCB2ZXJzaW9uIGFuZCBhIHN5bWJvbCBmb3IgdGhlCiAqIHN0YXJ0IG9mIHNvbWUgc2VjdGlvbnMuICB0aGlzIGluZm8gaXMgdXNlZCBieSBrc3ltb29wcyB0byBkbyBiZXR0ZXIKICogZGVidWdnaW5nLgogKi8Kc3RhdGljIHZvaWQKYWRkX2tzeW1vb3BzX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKCQkJCSBjb25zdCBjaGFyICptX25hbWUpCnsKCXN0YXRpYyBjb25zdCBjaGFyIHN5bXByZWZpeFtdIEFMSUdOMSA9ICJfX2luc21vZF8iOwoJc3RhdGljIGNvbnN0IGNoYXIgc2VjdGlvbl9uYW1lc1tdWzhdID0gewoJCSIudGV4dCIsCgkJIi5yb2RhdGEiLAoJCSIuZGF0YSIsCgkJIi5ic3MiLAoJCSIuc2JzcyIKCX07CgoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJY2hhciAqbmFtZSwgKmFic29sdXRlX2ZpbGVuYW1lOwoJY2hhciBzdHJbU1RSVkVSU0lPTkxFTl07Cgl1bnNpZ25lZCBpOwoJaW50IGwsIGxtX25hbWUsIGxmaWxlbmFtZSwgdXNlX2tzeW10YWIsIHZlcnNpb247CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoKCS8qIFdBUk5JTkc6IHdhcyB1c2luZyByZWFscGF0aCwgYnV0IHJlcGxhY2VkIGJ5IHJlYWRsaW5rIHRvIHN0b3AgdXNpbmcKCSAqIGxvdHMgb2Ygc3RhY2suIEJ1dCBoZXJlIGl0IHNlZW1zIHRvIGJlIGFibGUgdG8gY2F1c2UgcHJvYmxlbXM/ICovCglhYnNvbHV0ZV9maWxlbmFtZSA9IHhtYWxsb2NfcmVhZGxpbmsoZmlsZW5hbWUpOwoJaWYgKCFhYnNvbHV0ZV9maWxlbmFtZSkKCQlhYnNvbHV0ZV9maWxlbmFtZSA9IHhzdHJkdXAoZmlsZW5hbWUpOwoKCWxtX25hbWUgPSBzdHJsZW4obV9uYW1lKTsKCWxmaWxlbmFtZSA9IHN0cmxlbihhYnNvbHV0ZV9maWxlbmFtZSk7CgoJLyogYWRkIHRvIGtzeW10YWIgaWYgaXQgYWxyZWFkeSBleGlzdHMgb3IgdGhlcmUgaXMgbm8ga3N5bXRhYiBhbmQgb3RoZXIgc3ltYm9scwoJICogYXJlIG5vdCB0byBiZSBleHBvcnRlZC4gIG90aGVyd2lzZSBsZWF2ZSBrc3ltdGFiIGFsb25lIGZvciBub3csIHRoZQoJICogImV4cG9ydCBhbGwgc3ltYm9scyIgY29tcGF0aWJpbGl0eSBjb2RlIHdpbGwgZXhwb3J0IHRoZXNlIHN5bWJvbHMgbGF0ZXIuCgkgKi8KCXVzZV9rc3ltdGFiID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiX19rc3ltdGFiIikgfHwgZmxhZ19ub2V4cG9ydDsKCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIudGhpcyIpOwoJaWYgKHNlYykgewoJCS8qIHRhZyB0aGUgbW9kdWxlIGhlYWRlciB3aXRoIHRoZSBvYmplY3QgbmFtZSwgbGFzdCBtb2RpZmllZAoJCSAqIHRpbWVzdGFtcCBhbmQgbW9kdWxlIHZlcnNpb24uICB3b3JzdCBjYXNlIGZvciBtb2R1bGUgdmVyc2lvbgoJCSAqIGlzIDB4ZmZmZmZmLCBkZWNpbWFsIDE2Nzc3MjE1LiAgcHV0dGluZyBhbGwgdGhyZWUgZmllbGRzIGluCgkJICogb25lIHN5bWJvbCBpcyBsZXNzIHJlYWRhYmxlIGJ1dCBzYXZlcyBrZXJuZWwgc3BhY2UuCgkJICovCgkJbCA9IHNpemVvZihzeW1wcmVmaXgpICsgICAgICAgICAgICAgICAgIC8qICJfX2luc21vZF8iICovCgkJCWxtX25hbWUgKyAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIG5hbWUgKi8KCQkJMiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiX08iICovCgkJCWxmaWxlbmFtZSArICAgICAgICAgICAgICAgICAgICAgLyogb2JqZWN0IGZpbGVuYW1lICovCgkJCTIgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIl9NIiAqLwoJCQkyICogc2l6ZW9mKHN0YXRidWYuc3RfbXRpbWUpICsgIC8qIG10aW1lIGluIGhleCAqLwoJCQkyICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJfViIgKi8KCQkJOCArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uIGluIGRlYyAqLwoJCQkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bCAqLwoJCW5hbWUgPSB4bWFsbG9jKGwpOwoJCWlmIChzdGF0KGFic29sdXRlX2ZpbGVuYW1lLCAmc3RhdGJ1ZikgIT0gMCkKCQkJc3RhdGJ1Zi5zdF9tdGltZSA9IDA7CgkJdmVyc2lvbiA9IGdldF9tb2R1bGVfdmVyc2lvbihmLCBzdHIpOwkvKiAtMSBpZiBub3QgZm91bmQgKi8KCQlzbnByaW50ZihuYW1lLCBsLCAiJXMlc19PJXNfTSUwKmxYX1YlZCIsCgkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgYWJzb2x1dGVfZmlsZW5hbWUsCgkJCQkoaW50KSgyICogc2l6ZW9mKHN0YXRidWYuc3RfbXRpbWUpKSwgc3RhdGJ1Zi5zdF9tdGltZSwKCQkJCXZlcnNpb24pOwoJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLAoJCQkJRUxGX1NUX0lORk8oU1RCX0dMT0JBTCwgU1RUX05PVFlQRSksCgkJCQlzZWMtPmlkeCwgc2VjLT5oZWFkZXIuc2hfYWRkciwgMCk7CgkJaWYgKHVzZV9rc3ltdGFiKQoJCQluZXdfYWRkX2tzeW10YWIoZiwgc3ltKTsKCX0KCWZyZWUoYWJzb2x1dGVfZmlsZW5hbWUpOwojaWZkZWYgX05PVF9TVVBQT1JURURfCgkvKiByZWNvcmQgd2hlcmUgdGhlIHBlcnNpc3RlbnQgZGF0YSBpcyBnb2luZywgc2FtZSBhZGRyZXNzIGFzIHByZXZpb3VzIHN5bWJvbCAqLwoKCWlmIChmLT5wZXJzaXN0KSB7CgkJbCA9IHNpemVvZihzeW1wcmVmaXgpICsgICAgICAgICAvKiAiX19pbnNtb2RfIiAqLwoJCQlsbV9uYW1lICsgICAgICAgICAgICAgICAvKiBtb2R1bGUgbmFtZSAqLwoJCQkyICsgICAgICAgICAgICAgICAgICAgICAvKiAiX1AiICovCgkJCXN0cmxlbihmLT5wZXJzaXN0KSArICAgIC8qIGRhdGEgc3RvcmUgKi8KCQkJMTsgICAgICAgICAgICAgICAgICAgICAgLyogbnVsICovCgkJbmFtZSA9IHhtYWxsb2MobCk7CgkJc25wcmludGYobmFtZSwgbCwgIiVzJXNfUCVzIiwKCQkJCXN5bXByZWZpeCwgbV9uYW1lLCBmLT5wZXJzaXN0KTsKCQlzeW0gPSBvYmpfYWRkX3N5bWJvbChmLCBuYW1lLCAtMSwgRUxGX1NUX0lORk8oU1RCX0dMT0JBTCwgU1RUX05PVFlQRSksCgkJCQlzZWMtPmlkeCwgc2VjLT5oZWFkZXIuc2hfYWRkciwgMCk7CgkJaWYgKHVzZV9rc3ltdGFiKQoJCQluZXdfYWRkX2tzeW10YWIoZiwgc3ltKTsKCX0KI2VuZGlmIC8qIF9OT1RfU1VQUE9SVEVEXyAqLwoJLyogdGFnIHRoZSBkZXNpcmVkIHNlY3Rpb25zIGlmIHNpemUgaXMgbm9uLXplcm8gKi8KCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWN0aW9uX25hbWVzKTsgKytpKSB7CgkJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBzZWN0aW9uX25hbWVzW2ldKTsKCQlpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKCQkJbCA9IHNpemVvZihzeW1wcmVmaXgpICsgICAgICAgICAvKiAiX19pbnNtb2RfIiAqLwoJCQkJbG1fbmFtZSArICAgICAgICAgICAgICAgLyogbW9kdWxlIG5hbWUgKi8KCQkJCTIgKyAgICAgICAgICAgICAgICAgICAgIC8qICJfUyIgKi8KCQkJCXN0cmxlbihzZWMtPm5hbWUpICsgICAgIC8qIHNlY3Rpb24gbmFtZSAqLwoJCQkJMiArICAgICAgICAgICAgICAgICAgICAgLyogIl9MIiAqLwoJCQkJOCArICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGluIGRlYyAqLwoJCQkJMTsgICAgICAgICAgICAgICAgICAgICAgLyogbnVsICovCgkJCW5hbWUgPSB4bWFsbG9jKGwpOwoJCQlzbnByaW50ZihuYW1lLCBsLCAiJXMlc19TJXNfTCVsZCIsCgkJCQkJc3ltcHJlZml4LCBtX25hbWUsIHNlYy0+bmFtZSwKCQkJCQkobG9uZylzZWMtPmhlYWRlci5zaF9zaXplKTsKCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsIEVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAoJCQkJCXNlYy0+aWR4LCBzZWMtPmhlYWRlci5zaF9hZGRyLCAwKTsKCQkJaWYgKHVzZV9rc3ltdGFiKQoJCQkJbmV3X2FkZF9rc3ltdGFiKGYsIHN5bSk7CgkJfQoJfQp9CiNlbmRpZiAvKiBGRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTICovCgojaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCnN0YXRpYyB2b2lkIHByaW50X2xvYWRfbWFwKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTAoJc3RydWN0IG9ial9zeW1ib2wgKiphbGwsICoqcDsKCWludCBpLCBuc3ltcywgKmxvYWRlZDsKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CiNlbmRpZgoJLyogUmVwb3J0IG9uIHRoZSBzZWN0aW9uIGxheW91dC4gICovCgoJcHJpbnRmKCJTZWN0aW9uczogICAgICAgU2l6ZSAgICAgICUtKnMgIEFsaWduXG4iLAoJCQkoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwgIkFkZHJlc3MiKTsKCglmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKCQlpbnQgYTsKCQl1bnNpZ25lZCBsb25nIHRtcDsKCgkJZm9yIChhID0gLTEsIHRtcCA9IHNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbjsgdG1wOyArK2EpCgkJCXRtcCA+Pj0gMTsKCQlpZiAoYSA9PSAtMSkKCQkJYSA9IDA7CgoJCXByaW50ZigiJS0xNXMgJTA4bHggICUwKmx4ICAyKiolZFxuIiwKCQkJCXNlYy0+bmFtZSwKCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX3NpemUsCgkJCQkoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwKCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX2FkZHIsCgkJCQlhKTsKCX0KI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCgkvKiBRdWljayByZWZlcmVuY2Ugd2hpY2ggc2VjdGlvbiBpbmRpY2llcyBhcmUgbG9hZGVkLiAgKi8KCglpID0gZi0+aGVhZGVyLmVfc2hudW07Cglsb2FkZWQgPSBhbGxvY2Eoc2l6ZW9mKGludCkgKiBpKTsKCXdoaWxlICgtLWkgPj0gMCkKCQlsb2FkZWRbaV0gPSAoKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApOwoKCS8qIENvbGxlY3QgdGhlIHN5bWJvbHMgd2UnbGwgYmUgbGlzdGluZy4gICovCgoJZm9yIChuc3ltcyA9IGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpCgkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQlpZiAoc3ltLT5zZWNpZHggPD0gU0hOX0hJUkVTRVJWRQoJCQkJCSYmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFIHx8IGxvYWRlZFtzeW0tPnNlY2lkeF0pKQoJCQkJKytuc3ltczsKCglhbGwgPSBhbGxvY2EobnN5bXMgKiBzaXplb2Yoc3RydWN0IG9ial9zeW1ib2wgKikpOwoKCWZvciAoaSA9IDAsIHAgPSBhbGw7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkKCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCWlmIChzeW0tPnNlY2lkeCA8PSBTSE5fSElSRVNFUlZFCgkJCQkJJiYgKHN5bS0+c2VjaWR4ID49IFNITl9MT1JFU0VSVkUgfHwgbG9hZGVkW3N5bS0+c2VjaWR4XSkpCgkJCQkqcCsrID0gc3ltOwoKCS8qIEFuZCBsaXN0IHRoZW0uICAqLwoJcHJpbnRmKCJcblN5bWJvbHM6XG4iKTsKCWZvciAocCA9IGFsbDsgcCA8IGFsbCArIG5zeW1zOyArK3ApIHsKCQljaGFyIHR5cGUgPSAnPyc7CgkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKCgkJc3ltID0gKnA7CgkJaWYgKHN5bS0+c2VjaWR4ID09IFNITl9BQlMpIHsKCQkJdHlwZSA9ICdBJzsKCQkJdmFsdWUgPSBzeW0tPnZhbHVlOwoJCX0gZWxzZSBpZiAoc3ltLT5zZWNpZHggPT0gU0hOX1VOREVGKSB7CgkJCXR5cGUgPSAnVSc7CgkJCXZhbHVlID0gMDsKCQl9IGVsc2UgewoJCQlzZWMgPSBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF07CgoJCQlpZiAoc2VjLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQoJCQkJdHlwZSA9ICdCJzsKCQkJZWxzZSBpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpIHsKCQkJCWlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIpCgkJCQkJdHlwZSA9ICdUJzsKCQkJCWVsc2UgaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX1dSSVRFKQoJCQkJCXR5cGUgPSAnRCc7CgkJCQllbHNlCgkJCQkJdHlwZSA9ICdSJzsKCQkJfQoJCQl2YWx1ZSA9IHN5bS0+dmFsdWUgKyBzZWMtPmhlYWRlci5zaF9hZGRyOwoJCX0KCgkJaWYgKEVMRl9TVF9CSU5EKHN5bS0+aW5mbykgPT0gU1RCX0xPQ0FMKQoJCQl0eXBlID0gdG9sb3dlcih0eXBlKTsKCgkJcHJpbnRmKCIlMCpseCAlYyAlc1xuIiwgKGludCkgKDIgKiBzaXplb2Yodm9pZCAqKSksIHZhbHVlLAoJCQkJdHlwZSwgc3ltLT5uYW1lKTsKCX0KI2VuZGlmCn0KI2Vsc2UgLyogIUZFQVRVUkVfSU5TTU9EX0xPQURfTUFQICovCnZvaWQgcHJpbnRfbG9hZF9tYXAoc3RydWN0IG9ial9maWxlICpmKTsKI2VuZGlmCgppbnQgaW5zbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKaW50IGluc21vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJY2hhciAqb3B0X28sICphcmcxOwoJaW50IGxlbjsKCWludCBrX2NyY3M7CgljaGFyICp0bXAsICp0bXAxOwoJdW5zaWduZWQgbG9uZyBtX3NpemU7CglFbGZXKEFkZHIpIG1fYWRkcjsKCXN0cnVjdCBvYmpfZmlsZSAqZjsKCXN0cnVjdCBzdGF0IHN0OwoJY2hhciAqbV9uYW1lID0gTlVMTDsKCWludCBleGl0X3N0YXR1cyA9IEVYSVRfRkFJTFVSRTsKCWludCBtX2hhc19tb2RpbmZvOwojaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKCXN0cnVjdCB1dHNuYW1lIHV0c19pbmZvOwoJY2hhciBtX3N0cnZlcnNpb25bU1RSVkVSU0lPTkxFTl07CglpbnQgbV92ZXJzaW9uLCBtX2NyY3M7CiNlbmRpZgojaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKCUZJTEUgKmZwID0gTlVMTDsKI2Vsc2UKCUZJTEUgKmZwOwojZW5kaWYKCWludCBrX3ZlcnNpb24gPSAwOwoJc3RydWN0IHV0c25hbWUgbXl1bmFtZTsKCgkvKiBQYXJzZSBhbnkgb3B0aW9ucyAqLwoJZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiwgJm9wdF9vKTsKCWFyZzEgPSBhcmd2W29wdGluZF07CglpZiAob3B0aW9uX21hc2szMiAmIE9QVF9vKSB7IC8vIC1vIC8qIG5hbWUgdGhlIG91dHB1dCBtb2R1bGUgKi8KCQlmcmVlKG1fbmFtZSk7CgkJbV9uYW1lID0geHN0cmR1cChvcHRfbyk7Cgl9CgoJaWYgKGFyZzEgPT0gTlVMTCkgewoJCWJiX3Nob3dfdXNhZ2UoKTsKCX0KCgkvKiBHcmFiIHRoZSBtb2R1bGUgbmFtZSAqLwoJdG1wMSA9IHhzdHJkdXAoYXJnMSk7Cgl0bXAgPSBiYXNlbmFtZSh0bXAxKTsKCWxlbiA9IHN0cmxlbih0bXApOwoKCWlmICh1bmFtZSgmbXl1bmFtZSkgPT0gMCkgewoJCWlmIChteXVuYW1lLnJlbGVhc2VbMF0gPT0gJzInKSB7CgkJCWtfdmVyc2lvbiA9IG15dW5hbWUucmVsZWFzZVsyXSAtICcwJzsKCQl9Cgl9CgojaWYgRU5BQkxFX0ZFQVRVUkVfMl82X01PRFVMRVMKCWlmIChrX3ZlcnNpb24gPiA0ICYmIGxlbiA+IDMgJiYgdG1wW2xlbiAtIDNdID09ICcuJwoJICYmIHRtcFtsZW4gLSAyXSA9PSAnaycgJiYgdG1wW2xlbiAtIDFdID09ICdvJwoJKSB7CgkJbGVuIC09IDM7CgkJdG1wW2xlbl0gPSAnXDAnOwoJfSBlbHNlCiNlbmRpZgoJCWlmIChsZW4gPiAyICYmIHRtcFtsZW4gLSAyXSA9PSAnLicgJiYgdG1wW2xlbiAtIDFdID09ICdvJykgewoJCQlsZW4gLT0gMjsKCQkJdG1wW2xlbl0gPSAnXDAnOwoJCX0KCgojaWYgRU5BQkxFX0ZFQVRVUkVfMl82X01PRFVMRVMKCWlmIChrX3ZlcnNpb24gPiA0KQoJCW1fZnVsbE5hbWUgPSB4YXNwcmludGYoIiVzLmtvIiwgdG1wKTsKCWVsc2UKI2VuZGlmCgkJbV9mdWxsTmFtZSA9IHhhc3ByaW50ZigiJXMubyIsIHRtcCk7CgoJaWYgKCFtX25hbWUpIHsKCQltX25hbWUgPSB0bXA7Cgl9IGVsc2UgewoJCWZyZWUodG1wMSk7CgkJdG1wMSA9IE5VTEw7ICAgICAgIC8qIGZsYWcgZm9yIGZyZWUobV9uYW1lKSBiZWZvcmUgZXhpdCgpICovCgl9CgoJLyogR2V0IGEgZmlsZWRlc2MgZm9yIHRoZSBtb2R1bGUuICBDaGVjayB0aGF0IHdlIGhhdmUgYSBjb21wbGV0ZSBwYXRoICovCglpZiAoc3RhdChhcmcxLCAmc3QpIDwgMCB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKQoJIHx8IChmcCA9IGZvcGVuKGFyZzEsICJyIikpID09IE5VTEwKCSkgewoJCS8qIEhtbS4gIENvdWxkIG5vdCBvcGVuIGl0LiAgRmlyc3Qgc2VhcmNoIHVuZGVyIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgLAoJCSAqIGJ1dCBkbyBub3QgZXJyb3Igb3V0IHlldCBpZiB3ZSBmYWlsIHRvIGZpbmQgaXQuLi4gKi8KCQlpZiAoa192ZXJzaW9uKSB7CS8qIHVuYW1lIHN1Y2NlZWRkICovCgkJCWNoYXIgKm1vZHVsZV9kaXI7CgkJCWNoYXIgKnRtZG47CgoJCQl0bWRuID0gY29uY2F0X3BhdGhfZmlsZShDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUiwgbXl1bmFtZS5yZWxlYXNlKTsKCQkJLyogSnVtcCB0aHJvdWdoIGhvb3BzIGluIGNhc2UgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAKCQkJICogaXMgYSBzeW1saW5rLiAgV2UgZG8gbm90IHdhbnQgcmVjdXJzaXZlX2FjdGlvbiB0bwoJCQkgKiBmb2xsb3cgc3ltbGlua3MsIGJ1dCB3ZSBkbyB3YW50IHRvIGZvbGxvdyB0aGUKCQkJICogL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAgZGlyLCBTbyByZXNvbHZlIGl0IG91cnNlbHZlcwoJCQkgKiBpZiBpdCBpcyBhIGxpbmsuLi4gKi8KCQkJbW9kdWxlX2RpciA9IHhtYWxsb2NfcmVhZGxpbmsodG1kbik7CgkJCWlmICghbW9kdWxlX2RpcikKCQkJCW1vZHVsZV9kaXIgPSB4c3RyZHVwKHRtZG4pOwoJCQlyZWN1cnNpdmVfYWN0aW9uKG1vZHVsZV9kaXIsIEFDVElPTl9SRUNVUlNFLAoJCQkJCWNoZWNrX21vZHVsZV9uYW1lX21hdGNoLCBOVUxMLCBtX2Z1bGxOYW1lLCAwKTsKCQkJZnJlZShtb2R1bGVfZGlyKTsKCQkJZnJlZSh0bWRuKTsKCQl9CgoJCS8qIENoZWNrIGlmIHdlIGhhdmUgZm91bmQgYW55dGhpbmcgeWV0ICovCgkJaWYgKCFtX2ZpbGVuYW1lIHx8ICgoZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSkgewoJCQlpbnQgcjsKCQkJY2hhciAqbW9kdWxlX2RpcjsKCgkJCWZyZWUobV9maWxlbmFtZSk7CgkJCW1fZmlsZW5hbWUgPSBOVUxMOwoJCQltb2R1bGVfZGlyID0geG1hbGxvY19yZWFkbGluayhDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUik7CgkJCWlmICghbW9kdWxlX2RpcikKCQkJCW1vZHVsZV9kaXIgPSB4c3RyZHVwKENPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSKTsKCQkJLyogTm8gbW9kdWxlIGZvdW5kIHVuZGVyIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgLCB0aGlzCgkJCSAqIHRpbWUgY2FzdCB0aGUgbmV0IGEgYml0IHdpZGVyLiAgU2VhcmNoIC9saWIvbW9kdWxlcy8gKi8KCQkJciA9IHJlY3Vyc2l2ZV9hY3Rpb24obW9kdWxlX2RpciwgQUNUSU9OX1JFQ1VSU0UsCgkJCQkJY2hlY2tfbW9kdWxlX25hbWVfbWF0Y2gsIE5VTEwsIG1fZnVsbE5hbWUsIDApOwoJCQlpZiAocikKCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbW9kdWxlIG5vdCBmb3VuZCIsIG1fZnVsbE5hbWUpOwoJCQlmcmVlKG1vZHVsZV9kaXIpOwoJCQlpZiAobV9maWxlbmFtZSA9PSBOVUxMCgkJCSB8fCAoKGZwID0gZm9wZW4obV9maWxlbmFtZSwgInIiKSkgPT0gTlVMTCkKCQkJKSB7CgkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG1vZHVsZSBub3QgZm91bmQiLCBtX2Z1bGxOYW1lKTsKCQkJfQoJCX0KCX0gZWxzZQoJCW1fZmlsZW5hbWUgPSB4c3RyZHVwKGFyZzEpOwoKCWlmIChmbGFnX3ZlcmJvc2UpCgkJcHJpbnRmKCJVc2luZyAlc1xuIiwgbV9maWxlbmFtZSk7CgojaWYgRU5BQkxFX0ZFQVRVUkVfMl82X01PRFVMRVMKCWlmIChrX3ZlcnNpb24gPiA0KSB7CgkJYXJndltvcHRpbmRdID0gbV9maWxlbmFtZTsKCQlvcHRpbmQtLTsKCQlyZXR1cm4gaW5zbW9kX25nX21haW4oYXJnYyAtIG9wdGluZCwgYXJndiArIG9wdGluZCk7Cgl9CiNlbmRpZgoKCWYgPSBvYmpfbG9hZChmcCwgTE9BREJJVFMpOwoKCWlmIChnZXRfbW9kaW5mb192YWx1ZShmLCAia2VybmVsX3ZlcnNpb24iKSA9PSBOVUxMKQoJCW1faGFzX21vZGluZm8gPSAwOwoJZWxzZQoJCW1faGFzX21vZGluZm8gPSAxOwoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCgkvKiBWZXJzaW9uIGNvcnJlc3BvbmRlbmNlPyAgKi8KCWlmICghZmxhZ19xdWlldCkgewoJCWlmICh1bmFtZSgmdXRzX2luZm8pIDwgMCkKCQkJdXRzX2luZm8ucmVsZWFzZVswXSA9ICdcMCc7CgkJaWYgKG1faGFzX21vZGluZm8pIHsKCQkJbV92ZXJzaW9uID0gbmV3X2dldF9tb2R1bGVfdmVyc2lvbihmLCBtX3N0cnZlcnNpb24pOwoJCQlpZiAobV92ZXJzaW9uID09IC0xKSB7CgkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2Fubm90IGZpbmQgdGhlIGtlcm5lbCB2ZXJzaW9uIHRoZSBtb2R1bGUgd2FzICIKCQkJCQkJImNvbXBpbGVkIGZvciIpOwoJCQl9CgkJfQoKCQlpZiAoc3RybmNtcCh1dHNfaW5mby5yZWxlYXNlLCBtX3N0cnZlcnNpb24sIFNUUlZFUlNJT05MRU4pICE9IDApIHsKCQkJYmJfZXJyb3JfbXNnKCIlc2tlcm5lbC1tb2R1bGUgdmVyc2lvbiBtaXNtYXRjaFxuIgoJCQkJIlx0JXMgd2FzIGNvbXBpbGVkIGZvciBrZXJuZWwgdmVyc2lvbiAlc1xuIgoJCQkJIlx0d2hpbGUgdGhpcyBrZXJuZWwgaXMgdmVyc2lvbiAlcyIsCgkJCQlmbGFnX2ZvcmNlX2xvYWQgPyAid2FybmluZzogIiA6ICIiLAoJCQkJbV9maWxlbmFtZSwgbV9zdHJ2ZXJzaW9uLCB1dHNfaW5mby5yZWxlYXNlKTsKCQkJaWYgKCFmbGFnX2ZvcmNlX2xvYWQpCgkJCQlnb3RvIG91dDsKCQl9Cgl9CglrX2NyY3MgPSAwOwojZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLwoKCWlmIChxdWVyeV9tb2R1bGUoTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCkpCgkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBjb25maWd1cmVkIHRvIHN1cHBvcnQgb2xkIGtlcm5lbHMiKTsKCW5ld19nZXRfa2VybmVsX3N5bWJvbHMoKTsKCWtfY3JjcyA9IG5ld19pc19rZXJuZWxfY2hlY2tzdW1tZWQoKTsKCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwoJbV9jcmNzID0gMDsKCWlmIChtX2hhc19tb2RpbmZvKQoJCW1fY3JjcyA9IG5ld19pc19tb2R1bGVfY2hlY2tzdW1tZWQoZik7CgoJaWYgKG1fY3JjcyAhPSBrX2NyY3MpCgkJb2JqX3NldF9zeW1ib2xfY29tcGFyZShmLCBuY3Zfc3RyY21wLCBuY3Zfc3ltYm9sX2hhc2gpOwojZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLwoKCS8qIExldCB0aGUgbW9kdWxlIGtub3cgYWJvdXQgdGhlIGtlcm5lbCBzeW1ib2xzLiAgKi8KCWFkZF9rZXJuZWxfc3ltYm9scyhmKTsKCgkvKiBBbGxvY2F0ZSBjb21tb24gc3ltYm9scywgc3ltYm9sIHRhYmxlcywgYW5kIHN0cmluZyB0YWJsZXMuICAqLwoKCW5ld19jcmVhdGVfdGhpc19tb2R1bGUoZiwgbV9uYW1lKTsKCW9ial9jaGVja191bmRlZmluZWRzKGYpOwoJb2JqX2FsbG9jYXRlX2NvbW1vbnMoZik7CgljaGVja190YWludGVkX21vZHVsZShmLCBtX25hbWUpOwoKCS8qIGRvbmUgd2l0aCB0aGUgbW9kdWxlIG5hbWUsIG9uIHRvIHRoZSBvcHRpb25hbCB2YXI9dmFsdWUgYXJndW1lbnRzICovCgkrK29wdGluZDsKCWlmIChvcHRpbmQgPCBhcmdjKSB7CgkJbmV3X3Byb2Nlc3NfbW9kdWxlX2FyZ3VtZW50cyhmLCBhcmdjIC0gb3B0aW5kLCBhcmd2ICsgb3B0aW5kKTsKCX0KCglhcmNoX2NyZWF0ZV9nb3QoZik7CgloaWRlX3NwZWNpYWxfc3ltYm9scyhmKTsKCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUwoJYWRkX2tzeW1vb3BzX3N5bWJvbHMoZiwgbV9maWxlbmFtZSwgbV9uYW1lKTsKI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgKi8KCgluZXdfY3JlYXRlX21vZHVsZV9rc3ltdGFiKGYpOwoKCS8qIEZpbmQgY3VycmVudCBzaXplIG9mIHRoZSBtb2R1bGUgKi8KCW1fc2l6ZSA9IG9ial9sb2FkX3NpemUoZik7CgoJbV9hZGRyID0gY3JlYXRlX21vZHVsZShtX25hbWUsIG1fc2l6ZSk7CglpZiAobV9hZGRyID09IChFbGZXKEFkZHIpKSgtMSkpIHN3aXRjaCAoZXJybm8pIHsKCQljYXNlIEVFWElTVDoKCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImEgbW9kdWxlIG5hbWVkICVzIGFscmVhZHkgZXhpc3RzIiwgbV9uYW1lKTsKCQljYXNlIEVOT01FTToKCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGFsbG9jYXRlIGtlcm5lbCBtZW1vcnkgZm9yIG1vZHVsZTsgbmVlZGVkICVsdSBieXRlcyIsCgkJCQkJbV9zaXplKTsKCQlkZWZhdWx0OgoJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNyZWF0ZV9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKCX0KCiNpZiAhTE9BREJJVFMKCS8qCgkgKiB0aGUgUFJPR0JJVFMgc2VjdGlvbiB3YXMgbm90IGxvYWRlZCBieSB0aGUgb2JqX2xvYWQKCSAqIG5vdyB3ZSBjYW4gbG9hZCB0aGVtIGRpcmVjdGx5IGludG8gdGhlIGtlcm5lbCBtZW1vcnkKCSAqLwoJaWYgKCFvYmpfbG9hZF9wcm9nYml0cyhmcCwgZiwgKGNoYXIqKW1fYWRkcikpIHsKCQlkZWxldGVfbW9kdWxlKG1fbmFtZSwgMCk7CgkJZ290byBvdXQ7Cgl9CiNlbmRpZgoKCWlmICghb2JqX3JlbG9jYXRlKGYsIG1fYWRkcikpIHsKCQlkZWxldGVfbW9kdWxlKG1fbmFtZSwgMCk7CgkJZ290byBvdXQ7Cgl9CgoJaWYgKCFuZXdfaW5pdF9tb2R1bGUobV9uYW1lLCBmLCBtX3NpemUpKSB7CgkJZGVsZXRlX21vZHVsZShtX25hbWUsIDApOwoJCWdvdG8gb3V0OwoJfQoKCWlmIChmbGFnX3ByaW50X2xvYWRfbWFwKQoJCXByaW50X2xvYWRfbWFwKGYpOwoKCWV4aXRfc3RhdHVzID0gRVhJVF9TVUNDRVNTOwoKIG91dDoKI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCglpZiAoZnApCgkJZmNsb3NlKGZwKTsKCWZyZWUodG1wMSk7CglpZiAoIXRtcDEpCgkJZnJlZShtX25hbWUpOwoJZnJlZShtX2ZpbGVuYW1lKTsKI2VuZGlmCglyZXR1cm4gZXhpdF9zdGF0dXM7Cn0KCiNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUyAqLwovKgogKiBFbmQgb2YgYmlnIHBpZWNlIG9mIDIuNC1zcGVjaWZpYyBjb2RlCiAqLwoKCiNpZiBFTkFCTEVfRkVBVFVSRV8yXzZfTU9EVUxFUwoKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CgojaWYgZGVmaW5lZCBfX1VDTElCQ19fICYmICFFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUwovKiBiaWcgdGltZSBzdWNrYWdlLiBUaGUgb2xkIHByb3RvdHlwZSBhYm92ZSByZW5kZXJzIG91ciBuaWNlIGZ3ZC1kZWNsIHdyb25nICovCmV4dGVybiBpbnQgaW5pdF9tb2R1bGUodm9pZCAqbW9kdWxlLCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgY2hhciAqb3B0aW9ucyk7CiNlbHNlCiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgojZGVmaW5lIGluaXRfbW9kdWxlKG1vZCwgbGVuLCBvcHRzKSBzeXNjYWxsKF9fTlJfaW5pdF9tb2R1bGUsIG1vZCwgbGVuLCBvcHRzKQojZW5kaWYKCi8qIFdlIHVzZSBlcnJvciBudW1iZXJzIGluIGEgbG9vc2UgdHJhbnNsYXRpb24uLi4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgKm1vZGVycm9yKGludCBlcnIpCnsKCXN3aXRjaCAoZXJyKSB7CgljYXNlIEVOT0VYRUM6CgkJcmV0dXJuICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOwoJY2FzZSBFTk9FTlQ6CgkJcmV0dXJuICJ1bmtub3duIHN5bWJvbCBpbiBtb2R1bGUiOwoJY2FzZSBFU1JDSDoKCQlyZXR1cm4gIm1vZHVsZSBoYXMgd3Jvbmcgc3ltYm9sIHZlcnNpb24iOwoJY2FzZSBFSU5WQUw6CgkJcmV0dXJuICJpbnZhbGlkIHBhcmFtZXRlcnMiOwoJZGVmYXVsdDoKCQlyZXR1cm4gc3RyZXJyb3IoZXJyKTsKCX0KfQoKI2lmICFFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUwppbnQgaW5zbW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKaW50IGluc21vZF9tYWluKGludCBhcmdjIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKiphcmd2KQojZWxzZQpzdGF0aWMgaW50IGluc21vZF9uZ19tYWluKGludCBhcmdjIEFUVFJJQlVURV9VTlVTRUQsIGNoYXIgKiphcmd2KQojZW5kaWYKewoJc2l6ZV90IGxlbjsKCWludCBvcHRsZW47Cgl2b2lkICptYXA7CgljaGFyICpmaWxlbmFtZSwgKm9wdGlvbnM7CgoJZmlsZW5hbWUgPSAqKythcmd2OwoJaWYgKCFmaWxlbmFtZSkKCQliYl9zaG93X3VzYWdlKCk7CgoJLyogUmVzdCBpcyBvcHRpb25zICovCglvcHRpb25zID0geHphbGxvYygxKTsKCW9wdGxlbiA9IDA7Cgl3aGlsZSAoKisrYXJndikgewoJCW9wdGlvbnMgPSB4cmVhbGxvYyhvcHRpb25zLCBvcHRsZW4gKyAyICsgc3RybGVuKCphcmd2KSArIDIpOwoJCS8qIFNwYWNlcyBoYW5kbGVkIGJ5ICIiIHBhaXJzLCBidXQgbm8gd2F5IG9mIGVzY2FwaW5nIHF1b3RlcyAqLwoJCW9wdGxlbiArPSBzcHJpbnRmKG9wdGlvbnMgKyBvcHRsZW4sIChzdHJjaHIoKmFyZ3YsJyAnKSA/ICJcIiVzXCIgIiA6ICIlcyAiKSwgKmFyZ3YpOwoJfQoKI2lmIDAKCS8qIEFueSBzcGVjaWFsIHJlYXNvbiB3aHkgbW1hcD8gSXQgaXNuJ3QgcGVyZm9ybWFuY2UgY3JpdGljYWwuIC12ZGEgKi8KCS8qIFllcywgeG1hbGxvYydpbmcgY2FuIHVzZSAqYWxvdCogb2YgUkFNLiBEb24ndCBmb3JnZXQgdGhhdCB0aGVyZSBhcmUKCSAqIG1vZHVsZXMgb3V0IHRoZXJlIHRoYXQgYXJlIGhhbGYgYSBtZWdhYnl0ZSEgbW1hcCgpaW5nIGlzIHdheSBuaWNlcgoJICogZm9yIHNtYWxsIG1lbSBib3hlcywgaSBndWVzcy4gKi8KCS8qIEJ1dCBhZnRlciBsb2FkLCB0aGVzZSBtb2R1bGVzIHdpbGwgdGFrZSB1cCB0aGF0IDAuNW1iIGluIGtlcm5lbAoJICogYW55d2F5LiBVc2luZyBtYWxsb2MgaGVyZSBjYXVzZXMgb25seSBhIHRyYW5zaWVudCBzcGlrZSB0byAxbWIsCgkgKiBhZnRlciBtb2R1bGUgaXMgbG9hZGVkLCB3ZSBnbyBiYWNrIHRvIG5vcm1hbCAwLjVtYiB1c2FnZQoJICogKGluIGtlcm5lbCkuIEFsc28sIG1tYXAgaXNuJ3QgbWFnaWMgLSB3aGVuIHdlIHRvdWNoIG1hcHBlZCBkYXRhLAoJICogd2UgdXNlIG1lbW9yeS4gLXZkYSAqLwoJaW50IGZkOwoJc3RydWN0IHN0YXQgc3Q7Cgl1bnNpZ25lZCBsb25nIGxlbjsKCWZkID0geG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKCWZzdGF0KGZkLCAmc3QpOwoJbGVuID0gc3Quc3Rfc2l6ZTsKCW1hcCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CglpZiAobWFwID09IE1BUF9GQUlMRUQpIHsKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbm5vdCBtbWFwICclcyciLCBmaWxlbmFtZSk7Cgl9CgoJLyogbWFwID09IE5VTEwgb24gQmxhY2tmaW4sIHByb2JhYmx5IG9uIG90aGVyIE1NVS1sZXNzIHN5c3RlbXMgdG9vLiBXb3JrYXJvdW5kLiAqLwoJaWYgKG1hcCA9PSBOVUxMKSB7CgkJbWFwID0geG1hbGxvYyhsZW4pOwoJCXhyZWFkKGZkLCBtYXAsIGxlbik7Cgl9CiNlbHNlCglsZW4gPSBNQVhJTlQoc3NpemVfdCk7CgltYXAgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShmaWxlbmFtZSwgJmxlbik7CiNlbmRpZgoKCWlmIChpbml0X21vZHVsZShtYXAsIGxlbiwgb3B0aW9ucykgIT0gMCkKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2Fubm90IGluc2VydCAnJXMnOiAlcyIsCgkJCQlmaWxlbmFtZSwgbW9kZXJyb3IoZXJybm8pKTsKCXJldHVybiAwOwp9CgojZW5kaWYK