Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CiAqCiAqIFRoaXMgdmVyc2lvbiBvZiBpbnNtb2Qgc3VwcG9ydHMgQVJNLCBDUklTLCBIOC8zMDAsIHg4NiwgaWE2NCwgeDg2XzY0LAogKiBtNjhrLCBNSVBTLCBQb3dlclBDLCBTMzkwLCBTSDMvNC81LCBTcGFyYywgdjg1MGUsIGFuZCB4ODZfNjQuCiAqCiAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KICogYW5kIFJvbiBBbGRlciA8YWxkZXJAbGluZW8uY29tPgogKgogKiBSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+IDE3LUF1Zy0yMDA0LgogKiAgIEFkZGVkIHg4Nl82NCBzdXBwb3J0LgogKgogKiBNaWxlcyBCYWRlciA8bWlsZXNAZ251Lm9yZz4gYWRkZWQgTkVDIFY4NTBFIHN1cHBvcnQuCiAqCiAqIE1vZGlmaWVkIGJ5IEJyeWFuIFJpdHRtZXllciA8YnJ5YW5AaXhpYWNvbS5jb20+IHRvIHN1cHBvcnQgU0g0CiAqIGFuZCAodGhlb3JldGljYWxseSkgU0gzLiBJIGhhdmUgb25seSB0ZXN0ZWQgU0g0IGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KICoKICogTW9kaWZpZWQgYnkgQWxjb3ZlLCBKdWxpZW4gR2F1bG1pbiA8anVsaWVuLmdhdWxtaW5AYWxjb3ZlLmZyPiBhbmQKICogTmljb2xhcyBGZXJyZSA8bmljb2xhcy5mZXJyZUBhbGNvdmUuZnI+IHRvIHN1cHBvcnQgQVJNN1RETUkuICBPbmx5CiAqIHZlcnkgbWlub3IgY2hhbmdlcyByZXF1aXJlZCB0byBhbHNvIHdvcmsgd2l0aCBTdHJvbmdBcm0gYW5kIHByZXN1bWFibHkKICogYWxsIEFSTSBiYXNlZCBzeXN0ZW1zLgogKgogKiBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+IDE5LU1heS0yMDA0LgogKiAgIGFkZGVkIFJlbmVzYXMgSDgvMzAwIHN1cHBvcnQuCiAqCiAqIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+IDA4LUF1Zy0yMDAzLgogKiAgIEludGVncmF0ZWQgc3VwcG9ydCBmb3Igc2g2NCAoU0gtNSksIGZyb20gcHJlbGltaW5hcnkgbW9kdXRpbHMKICogICBwYXRjaGVzIGZyb20gQmVuZWRpY3QgR2FzdGVyIDxiZW5lZGljdC5nYXN0ZXJAc3VwZXJoLmNvbT4uCiAqICAgQ3VycmVudGx5IGxpbWl0ZWQgdG8gc3VwcG9ydCBmb3IgMzJiaXQgQUJJLgogKgogKiBNYWdudXMgRGFtbSA8ZGFtbUBvcGVuc291cmNlLnNlPiAyMi1NYXktMjAwMi4KICogICBUaGUgcGx0IGFuZCBnb3QgY29kZSBhcmUgbm93IHVzaW5nIHRoZSBzYW1lIHN0cnVjdHMuCiAqICAgQWRkZWQgZ2VuZXJpYyBsaW5rZWQgbGlzdCBjb2RlIHRvIGZ1bGx5IHN1cHBvcnQgUG93ZXJQQy4KICogICBSZXBsYWNlZCB0aGUgbWVzcyBpbiBhcmNoX2FwcGx5X3JlbG9jYXRpb24oKSB3aXRoIGFyY2hpdGVjdHVyZSBibG9ja3MuCiAqICAgVGhlIGFyY2hfY3JlYXRlX2dvdCgpIGZ1bmN0aW9uIGdvdCBjbGVhbmVkIHVwIHdpdGggYXJjaGl0ZWN0dXJlIGJsb2Nrcy4KICogICBUaGVzZSBibG9ja3Mgc2hvdWxkIGJlIGVhc3kgbWFpbnRhaW4gYW5kIHN5bmMgd2l0aCBvYmpfeHh4LmMgaW4gbW9kdXRpbHMuCiAqCiAqIE1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+IGFkZGVkIFBvd2VyUEMgc3VwcG9ydCAyMC1GZWItMjAwMS4KICogICBQb3dlclBDIHNwZWNpZmljIGNvZGUgc3RvbGVuIGZyb20gbW9kdXRpbHMtMi4zLjE2LAogKiAgIHdyaXR0ZW4gYnkgUGF1bCBNYWNrZXJyYXMsIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCiAqICAgSSd2ZSBvbmx5IHRlc3RlZCB0aGUgY29kZSBvbiBtcGM4eHggcGxhdGZvcm1zIGluIGJpZy1lbmRpYW4gbW9kZS4KICogICBEaWQgc29tZSBjbGVhbnVwIGFuZCBhZGRlZCBVU0VfeHh4X0VOVFJJRVMuLi4KICoKICogUXVpbm4gSmVuc2VuIDxqZW5zZW5xQGxpbmVvLmNvbT4gYWRkZWQgTUlQUyBzdXBwb3J0IDIzLUZlYi0yMDAxLgogKiAgIGJhc2VkIG9uIG1vZHV0aWxzLTIuNC4yCiAqICAgTUlQUyBzcGVjaWZpYyBzdXBwb3J0IGZvciBFbGYgbG9hZGluZyBhbmQgcmVsb2NhdGlvbi4KICogICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgogKiAgIENvbnRyaWJ1dGVkIGJ5IFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT4KICoKICogQmFzZWQgYWxtb3N0IGVudGlyZWx5IG9uIHRoZSBMaW51eCBtb2R1dGlscy0yLjMuMTEgaW1wbGVtZW50YXRpb24uCiAqICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KICogICBOZXcgaW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KICogICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KICogICBSZXN0cnVjdHVyZWQgKGFuZCBwYXJ0bHkgcmV3cml0dGVuKSBieToKICogICBCavZybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+IEZlYnJ1YXJ5IDE5OTkKICoKICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyB0YXJiYWxsIGZvciBkZXRhaWxzLgogKi8KCiNpbmNsdWRlICJidXN5Ym94LmgiCiNpbmNsdWRlIDxsaWJnZW4uaD4KI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CgojaWYgIUVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTICYmICFFTkFCTEVfRkVBVFVSRV8yXzZfTU9EVUxFUwojdW5kZWYgRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMKI2RlZmluZSBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUyAxCiNlbmRpZgoKI2lmICFFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUwojZGVmaW5lIGluc21vZF9uZ19tYWluIGluc21vZF9tYWluCiNlbmRpZgoKI2lmIEVOQUJMRV9GRUFUVVJFXzJfNl9NT0RVTEVTCmV4dGVybiBpbnQgaW5zbW9kX25nX21haW4oIGludCBhcmdjLCBjaGFyICoqYXJndik7CiNlbmRpZgoKCiNpZiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUwoKCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTQojZGVmaW5lIExPQURCSVRTIDAKI2Vsc2UKI2RlZmluZSBMT0FEQklUUyAxCiNlbmRpZgoKCi8qIEFscGhhICovCiNpZiBkZWZpbmVkKF9fYWxwaGFfXykKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0FMUEhBKQojZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCiNkZWZpbmUgRWxmNjRfUmVsTSAgICAgRWxmNjRfUmVsYQojZGVmaW5lIEVMRkNMQVNTTSAgICAgIEVMRkNMQVNTNjQKI2VuZGlmCgovKiBBUk0gc3VwcG9ydCAqLwojaWYgZGVmaW5lZChfX2FybV9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQVJNKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUwKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbAojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNkZWZpbmUgVVNFX1BMVF9FTlRSSUVTCiNkZWZpbmUgUExUX0VOVFJZX1NJWkUgOAojZGVmaW5lIFVTRV9HT1RfRU5UUklFUwojZGVmaW5lIEdPVF9FTlRSWV9TSVpFIDgKI2RlZmluZSBVU0VfU0lOR0xFCiNlbmRpZgoKLyogYmxhY2tmaW4gKi8KI2lmIGRlZmluZWQoQkZJTikKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0JMQUNLRklOKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2VuZGlmCgovKiBDUklTICovCiNpZiBkZWZpbmVkKF9fY3Jpc19fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQ1JJUykKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNpZm5kZWYgRU1fQ1JJUwojZGVmaW5lIEVNX0NSSVMgNzYKI2RlZmluZSBSX0NSSVNfTk9ORSAwCiNkZWZpbmUgUl9DUklTXzMyICAgMwojZW5kaWYKI2VuZGlmCgovKiBIOC8zMDAgKi8KI2lmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fSDhfMzAwKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2RlZmluZSBVU0VfU0lOR0xFCiNkZWZpbmUgU1lNQk9MX1BSRUZJWAkiXyIKI2VuZGlmCgovKiBQQS1SSVNDIC8gSFAtUEEgKi8KI2lmIGRlZmluZWQoX19ocHBhX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9QQVJJU0MpCiNkZWZpbmUgU0hUX1JFTE0gICAgICAgU0hUX1JFTEEKI2lmIGRlZmluZWQoX19MUDY0X18pCiNkZWZpbmUgRWxmNjRfUmVsTSAgICAgRWxmNjRfUmVsYQojZGVmaW5lIEVMRkNMQVNTTSAgICAgIEVMRkNMQVNTNjQKI2Vsc2UKI2RlZmluZSBFbGYzMl9SZWxNICAgICBFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1MzMgojZW5kaWYKI2VuZGlmCgovKiB4ODYgKi8KI2lmIGRlZmluZWQoX19pMzg2X18pCiNpZm5kZWYgRU1fNDg2CiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV8zODYpCiNlbHNlCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV8zODYgfHwgeCA9PSBFTV80ODYpCiNlbmRpZgojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUwKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbAojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNkZWZpbmUgVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgR09UX0VOVFJZX1NJWkUgNAojZGVmaW5lIFVTRV9TSU5HTEUKI2VuZGlmCgovKiBJQTY0LCBha2EgSXRhbml1bSAqLwojaWYgZGVmaW5lZChfX2lhNjRfXykKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0lBXzY0KQojZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCiNkZWZpbmUgRWxmNjRfUmVsTSAgICAgRWxmNjRfUmVsYQojZGVmaW5lIEVMRkNMQVNTTSAgICAgIEVMRkNMQVNTNjQKI2VuZGlmCgovKiBtNjhrICovCiNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fNjhLKQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKI2RlZmluZSBHT1RfRU5UUllfU0laRSA0CiNkZWZpbmUgVVNFX1NJTkdMRQojZW5kaWYKCi8qIE1pY3JvYmxhemUgKi8KI2lmIGRlZmluZWQoX19taWNyb2JsYXplX18pCiNkZWZpbmUgVVNFX1NJTkdMRQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fWElMSU5YX01JQ1JPQkxBWkUpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZW5kaWYKCi8qIE1JUFMgKi8KI2lmIGRlZmluZWQoX19taXBzX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9NSVBTIHx8IHggPT0gRU1fTUlQU19SUzNfTEUpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTAojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTMzIKLyogQWNjb3VudCBmb3IgRUxGIHNwZWMgY2hhbmdlcy4gICovCiNpZm5kZWYgRU1fTUlQU19SUzNfTEUKI2lmZGVmIEVNX01JUFNfUlM0X0JFCiNkZWZpbmUgRU1fTUlQU19SUzNfTEUJRU1fTUlQU19SUzRfQkUKI2Vsc2UKI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAojZW5kaWYKI2VuZGlmIC8qICFFTV9NSVBTX1JTM19MRSAqLwojZGVmaW5lIEFSQ0hEQVRBTSAgICAgICAiX19kYmVfdGFibGUiCiNlbmRpZgoKLyogTmlvcyBJSSAqLwojaWYgZGVmaW5lZChfX25pb3MyX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9BTFRFUkFfTklPUzIpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZW5kaWYKCi8qIFBvd2VyUEMgKi8KI2lmIGRlZmluZWQoX19wb3dlcnBjNjRfXykKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1BQQzY0KQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgRWxmNjRfUmVsTQlFbGY2NF9SZWxhCiNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTNjQKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1BQQykKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNkZWZpbmUgVVNFX1BMVF9FTlRSSUVTCiNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKI2RlZmluZSBVU0VfUExUX0xJU1QKI2RlZmluZSBMSVNUX0FSQ0hUWVBFIEVsZlcoQWRkcikKI2RlZmluZSBVU0VfTElTVAojZGVmaW5lIEFSQ0hEQVRBTSAgICAgICAiX19mdHJfZml4dXAiCiNlbmRpZgoKLyogUzM5MCAqLwojaWYgZGVmaW5lZChfX3MzOTBfXykKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1MzOTApCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgojZGVmaW5lIFVTRV9QTFRfRU5UUklFUwojZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDgKI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKI2RlZmluZSBHT1RfRU5UUllfU0laRSA4CiNkZWZpbmUgVVNFX1NJTkdMRQojZW5kaWYKCi8qIFN1cGVySCAqLwojaWYgZGVmaW5lZChfX3NoX18pCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9TSCkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNkZWZpbmUgVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgR09UX0VOVFJZX1NJWkUgNAojZGVmaW5lIFVTRV9TSU5HTEUKLyogdGhlIFNIIGNoYW5nZXMgaGF2ZSBvbmx5IGJlZW4gdGVzdGVkIGluID1saXR0bGUgZW5kaWFuPSBtb2RlICovCi8qIEknbSBub3Qgc3VyZSBhYm91dCBiaWcgZW5kaWFuLCBzbyBsZXQncyB3YXJuOiAqLwojaWYgZGVmaW5lZChfX3NoX18pICYmIEJCX0JJR19FTkRJQU4KIyBlcnJvciBpbnNtb2QuYyBtYXkgcmVxdWlyZSBjaGFuZ2VzIGZvciB1c2Ugb24gYmlnIGVuZGlhbiBTSAojZW5kaWYKLyogaXQgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgU0gxL1NIMi4uLiBFcnJvciBvbiB0aG9zZSBhbHNvICovCiNpZiAoKCEoZGVmaW5lZChfX1NIM19fKSB8fCBkZWZpbmVkKF9fU0g0X18pIHx8IGRlZmluZWQoX19TSDVfXykpKSkgJiYgKGRlZmluZWQoX19zaF9fKSkKI2Vycm9yIGluc21vZC5jIG1heSByZXF1aXJlIGNoYW5nZXMgZm9yIFNIMSBvciBTSDIgdXNlCiNlbmRpZgojZW5kaWYKCi8qIFNwYXJjICovCiNpZiBkZWZpbmVkKF9fc3BhcmNfXykKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1NQQVJDKQojZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCiNkZWZpbmUgRWxmMzJfUmVsTSAgICAgRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTSAgICAgIEVMRkNMQVNTMzIKI2VuZGlmCgovKiB2ODUwZSAqLwojaWYgZGVmaW5lZCAoX192ODUwZV9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKCh4KSA9PSBFTV9WODUwIHx8ICh4KSA9PSBFTV9DWUdOVVNfVjg1MCkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQojZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCiNkZWZpbmUgVVNFX1BMVF9FTlRSSUVTCiNkZWZpbmUgUExUX0VOVFJZX1NJWkUgOAojZGVmaW5lIFVTRV9TSU5HTEUKI2lmbmRlZiBFTV9DWUdOVVNfVjg1MAkvKiBncnVtYmxlICovCiNkZWZpbmUgRU1fQ1lHTlVTX1Y4NTAJMHg5MDgwCiNlbmRpZgojZGVmaW5lIFNZTUJPTF9QUkVGSVgJIl8iCiNlbmRpZgoKLyogWDg2XzY0ICAqLwojaWYgZGVmaW5lZChfX3g4Nl82NF9fKQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fWDg2XzY0KQojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCiNkZWZpbmUgVVNFX0dPVF9FTlRSSUVTCiNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAojZGVmaW5lIFVTRV9TSU5HTEUKI2RlZmluZSBFbGY2NF9SZWxNCUVsZjY0X1JlbGEKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1M2NAojZW5kaWYKCiNpZm5kZWYgU0hUX1JFTE0KI2Vycm9yIFNvcnJ5LCBidXQgaW5zbW9kLmMgZG9lcyBub3QgeWV0IHN1cHBvcnQgdGhpcyBhcmNoaXRlY3R1cmUuLi4KI2VuZGlmCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLS0tLS0tLS1tb2R1dGlscyBtb2R1bGUuaCwgbGluZXMgNDUtMjQyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBMaW51eCBtb2R1bGUgc3lzY2FsbCBpbnRlcmZhY2UuCiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCgogICBDb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgoKICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IG1vZHV0aWxzLgoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KCgojaWZuZGVmIE1PRFVUSUxTX01PRFVMRV9ICgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBGb3Igc2l6ZW9mKCkgd2hpY2ggYXJlIHJlbGF0ZWQgdG8gdGhlIG1vZHVsZSBwbGF0Zm9ybSBhbmQgbm90IHRvIHRoZQogICBlbnZpcm9ubWVudCBpc25tb2QgaXMgcnVubmluZyBpbiwgdXNlIHNpemVvZl94eCBpbnN0ZWFkIG9mIHNpemVvZih4eCkuICAqLwoKI2RlZmluZSB0Z3Rfc2l6ZW9mX2NoYXIJCXNpemVvZihjaGFyKQojZGVmaW5lIHRndF9zaXplb2Zfc2hvcnQJc2l6ZW9mKHNob3J0KQojZGVmaW5lIHRndF9zaXplb2ZfaW50CQlzaXplb2YoaW50KQojZGVmaW5lIHRndF9zaXplb2ZfbG9uZwkJc2l6ZW9mKGxvbmcpCiNkZWZpbmUgdGd0X3NpemVvZl9jaGFyX3AJc2l6ZW9mKGNoYXIgKikKI2RlZmluZSB0Z3Rfc2l6ZW9mX3ZvaWRfcAlzaXplb2Yodm9pZCAqKQojZGVmaW5lIHRndF9sb25nCQlsb25nCgojaWYgZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykgJiYgZGVmaW5lZChBUkNIX3NwYXJjNjQpCiN1bmRlZiB0Z3Rfc2l6ZW9mX2xvbmcKI3VuZGVmIHRndF9zaXplb2ZfY2hhcl9wCiN1bmRlZiB0Z3Rfc2l6ZW9mX3ZvaWRfcAojdW5kZWYgdGd0X2xvbmcKZW51bSB7Cgl0Z3Rfc2l6ZW9mX2xvbmcgPSA4LAoJdGd0X3NpemVvZl9jaGFyX3AgPSA4LAoJdGd0X3NpemVvZl92b2lkX3AgPSA4Cn07CiNkZWZpbmUgdGd0X2xvbmcJCWxvbmcgbG9uZwojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qIFRoZSBzdHJ1Y3R1cmVzIHVzZWQgaW4gTGludXggMi4xLiAgKi8KCi8qIE5vdGU6IG5ld19tb2R1bGVfc3ltYm9sIGRvZXMgbm90IHVzZSB0Z3RfbG9uZyBpbnRlbnRpb25hbGx5ICovCnN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCB7Cgl1bnNpZ25lZCBsb25nIHZhbHVlOwoJdW5zaWduZWQgbG9uZyBuYW1lOwp9OwoKc3RydWN0IG5ld19tb2R1bGVfcGVyc2lzdDsKCnN0cnVjdCBuZXdfbW9kdWxlX3JlZiB7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBkZXA7CQkvKiBrZXJuZWwgYWRkcmVzc2VzICovCgl1bnNpZ25lZCB0Z3RfbG9uZyByZWY7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBuZXh0X3JlZjsKfTsKCnN0cnVjdCBuZXdfbW9kdWxlIHsKCXVuc2lnbmVkIHRndF9sb25nIHNpemVfb2Zfc3RydWN0OwkvKiA9PSBzaXplb2YobW9kdWxlKSAqLwoJdW5zaWduZWQgdGd0X2xvbmcgbmV4dDsKCXVuc2lnbmVkIHRndF9sb25nIG5hbWU7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBzaXplOwoKCXRndF9sb25nIHVzZWNvdW50OwoJdW5zaWduZWQgdGd0X2xvbmcgZmxhZ3M7CQkvKiBBVVRPQ0xFQU4gZXQgYWwgKi8KCgl1bnNpZ25lZCBuc3ltczsKCXVuc2lnbmVkIG5kZXBzOwoKCXVuc2lnbmVkIHRndF9sb25nIHN5bXM7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBkZXBzOwoJdW5zaWduZWQgdGd0X2xvbmcgcmVmczsKCXVuc2lnbmVkIHRndF9sb25nIGluaXQ7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBjbGVhbnVwOwoJdW5zaWduZWQgdGd0X2xvbmcgZXhfdGFibGVfc3RhcnQ7Cgl1bnNpZ25lZCB0Z3RfbG9uZyBleF90YWJsZV9lbmQ7CiNpZmRlZiBfX2FscGhhX18KCXVuc2lnbmVkIHRndF9sb25nIGdwOwojZW5kaWYKCS8qIEV2ZXJ5dGhpbmcgYWZ0ZXIgaGVyZSBpcyBleHRlbnNpb24uICAqLwoJdW5zaWduZWQgdGd0X2xvbmcgcGVyc2lzdF9zdGFydDsKCXVuc2lnbmVkIHRndF9sb25nIHBlcnNpc3RfZW5kOwoJdW5zaWduZWQgdGd0X2xvbmcgY2FuX3VubG9hZDsKCXVuc2lnbmVkIHRndF9sb25nIHJ1bnNpemU7Cgljb25zdCBjaGFyICprYWxsc3ltc19zdGFydDsgICAgIC8qIEFsbCBzeW1ib2xzIGZvciBrZXJuZWwgZGVidWdnaW5nICovCgljb25zdCBjaGFyICprYWxsc3ltc19lbmQ7Cgljb25zdCBjaGFyICphcmNoZGF0YV9zdGFydDsgICAgIC8qIGFyY2ggc3BlY2lmaWMgZGF0YSBmb3IgbW9kdWxlICovCgljb25zdCBjaGFyICphcmNoZGF0YV9lbmQ7Cgljb25zdCBjaGFyICprZXJuZWxfZGF0YTsgICAgICAgIC8qIFJlc2VydmVkIGZvciBrZXJuZWwgaW50ZXJuYWwgdXNlICovCn07CgojaWZkZWYgQVJDSERBVEFNCiNkZWZpbmUgQVJDSERBVEFfU0VDX05BTUUgQVJDSERBVEFNCiNlbHNlCiNkZWZpbmUgQVJDSERBVEFfU0VDX05BTUUgIl9fYXJjaGRhdGEiCiNlbmRpZgojZGVmaW5lIEtBTExTWU1TX1NFQ19OQU1FICJfX2thbGxzeW1zIgoKCnN0cnVjdCBuZXdfbW9kdWxlX2luZm8gewoJdW5zaWduZWQgbG9uZyBhZGRyOwoJdW5zaWduZWQgbG9uZyBzaXplOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWxvbmcgdXNlY291bnQ7Cn07CgovKiBCaXRzIG9mIG1vZHVsZS5mbGFncy4gICovCmVudW0gewoJTkVXX01PRF9SVU5OSU5HID0gMSwKCU5FV19NT0RfREVMRVRFRCA9IDIsCglORVdfTU9EX0FVVE9DTEVBTiA9IDQsCglORVdfTU9EX1ZJU0lURUQgPSA4LAoJTkVXX01PRF9VU0VEX09OQ0UgPSAxNgp9OwoKaW50IGluaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBuZXdfbW9kdWxlICopOwppbnQgcXVlcnlfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCB3aGljaCwgdm9pZCAqYnVmLAoJCXNpemVfdCBidWZzaXplLCBzaXplX3QgKnJldCk7CgovKiBWYWx1ZXMgZm9yIHF1ZXJ5X21vZHVsZSdzIHdoaWNoLiAgKi8KZW51bSB7CglRTV9NT0RVTEVTID0gMSwKCVFNX0RFUFMgPSAyLAoJUU1fUkVGUyA9IDMsCglRTV9TWU1CT0xTID0gNCwKCVFNX0lORk8gPSA1Cn07CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBUaGUgc3lzdGVtIGNhbGxzIHVuY2hhbmdlZCBiZXR3ZWVuIDIuMCBhbmQgMi4xLiAgKi8KCnVuc2lnbmVkIGxvbmcgY3JlYXRlX21vZHVsZShjb25zdCBjaGFyICosIHNpemVfdCk7CmludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKik7CgoKI2VuZGlmIC8qIG1vZHVsZS5oICovCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8tLS0tLS0tLWVuZCBvZiBtb2R1dGlscyBtb2R1bGUuaAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLS0tLS0tLS1tb2R1dGlscyBvYmouaCwgbGluZXMgMjUzLTQ2MgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qIEVsZiBvYmplY3QgZmlsZSBsb2FkaW5nIGFuZCByZWxvY2F0aW9uIHJvdXRpbmVzLgogICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgoKICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBtb2R1dGlscy4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCgoKI2lmbmRlZiBNT0RVVElMU19PQkpfSAoKLyogVGhlIHJlbG9jYXRhYmxlIG9iamVjdCBpcyBtYW5pcHVsYXRlZCB1c2luZyBlbGZpbiB0eXBlcy4gICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVsZi5oPgojaW5jbHVkZSA8ZW5kaWFuLmg+CgojaWZuZGVmIEVsZlcKIyBpZiBFTEZDTEFTU00gPT0gRUxGQ0xBU1MzMgojICBkZWZpbmUgRWxmVyh4KSAgRWxmMzJfICMjIHgKIyAgZGVmaW5lIEVMRlcoeCkgIEVMRjMyXyAjIyB4CiMgZWxzZQojICBkZWZpbmUgRWxmVyh4KSAgRWxmNjRfICMjIHgKIyAgZGVmaW5lIEVMRlcoeCkgIEVMRjY0XyAjIyB4CiMgZW5kaWYKI2VuZGlmCgovKiBGb3Igc29tZSByZWFzb24gdGhpcyBpcyBtaXNzaW5nIGZyb20gc29tZSBhbmNpZW50IEMgbGlicmFyaWVzLi4uLiAgKi8KI2lmbmRlZiBFTEYzMl9TVF9JTkZPCiMgZGVmaW5lIEVMRjMyX1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKI2VuZGlmCgojaWZuZGVmIEVMRjY0X1NUX0lORk8KIyBkZWZpbmUgRUxGNjRfU1RfSU5GTyhiaW5kLCB0eXBlKSAgICAgICAoKChiaW5kKSA8PCA0KSArICgodHlwZSkgJiAweGYpKQojZW5kaWYKCiNkZWZpbmUgRUxGX1NUX0JJTkQoaW5mbykgRUxGVyhTVF9CSU5EKShpbmZvKQojZGVmaW5lIEVMRl9TVF9UWVBFKGluZm8pIEVMRlcoU1RfVFlQRSkoaW5mbykKI2RlZmluZSBFTEZfU1RfSU5GTyhiaW5kLCB0eXBlKSBFTEZXKFNUX0lORk8pKGJpbmQsIHR5cGUpCiNkZWZpbmUgRUxGX1JfVFlQRSh2YWwpIEVMRlcoUl9UWVBFKSh2YWwpCiNkZWZpbmUgRUxGX1JfU1lNKHZhbCkgRUxGVyhSX1NZTSkodmFsKQoKc3RydWN0IG9ial9zdHJpbmdfcGF0Y2g7CnN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoOwoKc3RydWN0IG9ial9zZWN0aW9uCnsKCUVsZlcoU2hkcikgaGVhZGVyOwoJY29uc3QgY2hhciAqbmFtZTsKCWNoYXIgKmNvbnRlbnRzOwoJc3RydWN0IG9ial9zZWN0aW9uICpsb2FkX25leHQ7CglpbnQgaWR4Owp9OwoKc3RydWN0IG9ial9zeW1ib2wKewoJc3RydWN0IG9ial9zeW1ib2wgKm5leHQ7CS8qIGhhc2ggdGFibGUgbGluayAqLwoJY29uc3QgY2hhciAqbmFtZTsKCXVuc2lnbmVkIGxvbmcgdmFsdWU7Cgl1bnNpZ25lZCBsb25nIHNpemU7CglpbnQgc2VjaWR4OwkJCS8qIHRoZSBkZWZpbmluZyBzZWN0aW9uIGluZGV4L21vZHVsZSAqLwoJaW50IGluZm87CglpbnQga3N5bWlkeDsJCQkvKiBmb3IgZXhwb3J0IHRvIHRoZSBrZXJuZWwgc3ltdGFiICovCglpbnQgcmVmZXJlbmNlZDsJCS8qIGFjdHVhbGx5IHVzZWQgaW4gdGhlIGxpbmsgKi8KfTsKCi8qIEhhcmRjb2RlIHRoZSBoYXNoIHRhYmxlIHNpemUuICBXZSBzaG91bGRuJ3QgYmUgbmVlZGluZyBzbyBtYW55CiAgIHN5bWJvbHMgdGhhdCB3ZSBiZWdpbiB0byBkZWdyYWRlIHBlcmZvcm1hbmNlLCBhbmQgd2UgZ2V0IGEgYmlnIHdpbgogICBieSBnaXZpbmcgdGhlIGNvbXBpbGVyIGEgY29uc3RhbnQgZGl2aXNvci4gICovCgojZGVmaW5lIEhBU0hfQlVDS0VUUyAgNTIxCgpzdHJ1Y3Qgb2JqX2ZpbGUgewoJRWxmVyhFaGRyKSBoZWFkZXI7CglFbGZXKEFkZHIpIGJhc2VhZGRyOwoJc3RydWN0IG9ial9zZWN0aW9uICoqc2VjdGlvbnM7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmxvYWRfb3JkZXI7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKipsb2FkX29yZGVyX3NlYXJjaF9zdGFydDsKCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpzdHJpbmdfcGF0Y2hlczsKCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpzeW1ib2xfcGF0Y2hlczsKCWludCAoKnN5bWJvbF9jbXApKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKCXVuc2lnbmVkIGxvbmcgKCpzeW1ib2xfaGFzaCkoY29uc3QgY2hhciAqKTsKCXVuc2lnbmVkIGxvbmcgbG9jYWxfc3ltdGFiX3NpemU7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqKmxvY2FsX3N5bXRhYjsKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW10YWJbSEFTSF9CVUNLRVRTXTsKfTsKCmVudW0gb2JqX3JlbG9jIHsKCW9ial9yZWxvY19vaywKCW9ial9yZWxvY19vdmVyZmxvdywKCW9ial9yZWxvY19kYW5nZXJvdXMsCglvYmpfcmVsb2NfdW5oYW5kbGVkCn07CgpzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCB7CglzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCAqbmV4dDsKCWludCByZWxvY19zZWNpZHg7CglFbGZXKEFkZHIpIHJlbG9jX29mZnNldDsKCUVsZlcoQWRkcikgc3RyaW5nX29mZnNldDsKfTsKCnN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoIHsKCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpuZXh0OwoJaW50IHJlbG9jX3NlY2lkeDsKCUVsZlcoQWRkcikgcmVsb2Nfb2Zmc2V0OwoJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKfTsKCgovKiBHZW5lcmljIG9iamVjdCBtYW5pcHVsYXRpb24gcm91dGluZXMuICAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2VsZl9oYXNoKGNvbnN0IGNoYXIgKik7CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgbGVuKTsKCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqb2JqX2ZpbmRfc3ltYm9sIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpOwoKc3RhdGljIEVsZlcoQWRkcikgb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkgIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pOwoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCnN0YXRpYyB2b2lkIG9ial9zZXRfc3ltYm9sX2NvbXBhcmUoc3RydWN0IG9ial9maWxlICpmLAoJCQkgICAgaW50ICgqY21wKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCgkJCSAgICB1bnNpZ25lZCBsb25nICgqaGFzaCkoY29uc3QgY2hhciAqKSk7CiNlbmRpZgoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2ZpbmRfc2VjdGlvbiAoc3RydWN0IG9ial9maWxlICpmLAoJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOwoKc3RhdGljIHZvaWQgb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIgKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCSAgICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYyk7CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbiAoc3RydWN0IG9ial9maWxlICpmLAoJCQkJCQljb25zdCBjaGFyICpuYW1lLAoJCQkJCQl1bnNpZ25lZCBsb25nIGFsaWduLAoJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUpOwoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3QgKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKCQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwKCQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKCnN0YXRpYyB2b2lkICpvYmpfZXh0ZW5kX3NlY3Rpb24gKHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjLCB1bnNpZ25lZCBsb25nIG1vcmUpOwoKc3RhdGljIGludCBvYmpfc3RyaW5nX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCgkJICAgICBjb25zdCBjaGFyICpzdHJpbmcpOwoKc3RhdGljIGludCBvYmpfc3ltYm9sX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCgkJICAgICBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKTsKCnN0YXRpYyBpbnQgb2JqX2NoZWNrX3VuZGVmaW5lZHMoc3RydWN0IG9ial9maWxlICpmKTsKCnN0YXRpYyB2b2lkIG9ial9hbGxvY2F0ZV9jb21tb25zKHN0cnVjdCBvYmpfZmlsZSAqZik7CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbG9hZF9zaXplIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOwoKc3RhdGljIGludCBvYmpfcmVsb2NhdGUgKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKTsKCnN0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKEZJTEUgKmYsIGludCBsb2FkcHJvZ2JpdHMpOwoKc3RhdGljIGludCBvYmpfY3JlYXRlX2ltYWdlIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgKmltYWdlKTsKCi8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBtYW5pcHVsYXRpb24gcm91dGluZXMuICAqLwoKc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqYXJjaF9uZXdfZmlsZSAodm9pZCk7CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICphcmNoX25ld19zZWN0aW9uICh2b2lkKTsKCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sICh2b2lkKTsKCnN0YXRpYyBlbnVtIG9ial9yZWxvYyBhcmNoX2FwcGx5X3JlbG9jYXRpb24gKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCSAgICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYywKCQkJCSAgICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqc3ltc2VjLAoJCQkJICAgICAgc3RydWN0IG9ial9zeW1ib2wgKnN5bSwKCQkJCSAgICAgIEVsZlcoUmVsTSkgKnJlbCwgRWxmVyhBZGRyKSB2YWx1ZSk7CgpzdGF0aWMgdm9pZCBhcmNoX2NyZWF0ZV9nb3QgKHN0cnVjdCBvYmpfZmlsZSAqZik7CiNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQpzdGF0aWMgaW50IG9ial9ncGxfbGljZW5zZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKipsaWNlbnNlKTsKI2VuZGlmIC8qIEZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgKi8KI2VuZGlmIC8qIG9iai5oICovCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLS0tZW5kIG9mIG1vZHV0aWxzIG9iai5oCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8qIFNQRlggaXMgYWx3YXlzIGEgc3RyaW5nLCBzbyBpdCBjYW4gYmUgY29uY2F0ZW5hdGVkIHRvIHN0cmluZyBjb25zdGFudHMuICAqLwojaWZkZWYgU1lNQk9MX1BSRUZJWAojZGVmaW5lIFNQRlgJU1lNQk9MX1BSRUZJWAojZWxzZQojZGVmaW5lIFNQRlgJIiIKI2VuZGlmCgoKI2RlZmluZSBfUEFUSF9NT0RVTEVTCSIvbGliL21vZHVsZXMiCmVudW0geyBTVFJWRVJTSU9OTEVOID0gNjQgfTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZGVmaW5lIE9QVElPTl9TVFIgInNMbzpma3ZxeCIgVVNFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQKCJtIikKZW51bSB7CglPUFRfcyA9IDB4MSwgLy8gLXMgLyogbG9nIHRvIHN5c2xvZyAqLwoJCS8qIE5vdCBzdXBwb3J0ZWQgYnV0IGtlcm5lbCBuZWVkcyB0aGlzIGZvciByZXF1ZXN0X21vZHVsZSgpLAoJCSAgIGFzIHRoaXMgY2FsbHM6IG1vZHByb2JlIC1rIC1zIC0tIDxtb2R1bGU+CgkJICAgc28gc2lsZW50bHkgaWdub3JlIHRoaXMgZmxhZyAqLwoJT1BUX0wgPSAweDIsIC8vIC1MIC8qIFN0dWIgd2FybmluZyAqLwoJCS8qIENvbXBhdGliaWxpdHkgd2l0aCBtb2Rwcm9iZS4KCQkgICBJbiB0aGVvcnksIHRoaXMgZG9lcyBsb2NraW5nLCBidXQgd2UgZG9uJ3QgZG8KCQkgICB0aGF0LiAgU28gYmUgY2FyZWZ1bCBhbmQgcGxhbiB5b3VyIGxpZmUgYXJvdW5kIG5vdAoJCSAgIGxvYWRpbmcgdGhlIHNhbWUgbW9kdWxlIDUwIHRpbWVzIGNvbmN1cnJlbnRseS4gKi8KCU9QVF9vID0gMHg0LCAvLyAtbyAvKiBuYW1lIHRoZSBvdXRwdXQgbW9kdWxlICovCglPUFRfZiA9IDB4OCwgLy8gLWYgLyogZm9yY2UgbG9hZGluZyAqLwoJT1BUX2sgPSAweDEwLCAvLyAtayAvKiBtb2R1bGUgbG9hZGVkIGJ5IGtlcm5lbGQsIGF1dG8tY2xlYW5hYmxlICovCglPUFRfdiA9IDB4MjAsIC8vIC12IC8qIHZlcmJvc2Ugb3V0cHV0ICovCglPUFRfcSA9IDB4NDAsIC8vIC1xIC8qIHNpbGVudCAqLwoJT1BUX3ggPSAweDgwLCAvLyAteCAvKiBkbyBub3QgZXhwb3J0IGV4dGVybnMgKi8KCU9QVF9tID0gMHgxMDAsIC8vIC1tIC8qIHByaW50IG1vZHVsZSBsb2FkIG1hcCAqLwp9OwojZGVmaW5lIGZsYWdfZm9yY2VfbG9hZCAob3B0aW9uX21hc2szMiAmIE9QVF9mKQojZGVmaW5lIGZsYWdfYXV0b2NsZWFuIChvcHRpb25fbWFzazMyICYgT1BUX2spCiNkZWZpbmUgZmxhZ192ZXJib3NlIChvcHRpb25fbWFzazMyICYgT1BUX3YpCiNkZWZpbmUgZmxhZ19xdWlldCAob3B0aW9uX21hc2szMiAmIE9QVF9xKQojZGVmaW5lIGZsYWdfbm9leHBvcnQgKG9wdGlvbl9tYXNrMzIgJiBPUFRfeCkKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUAojZGVmaW5lIGZsYWdfcHJpbnRfbG9hZF9tYXAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbSkKI2Vsc2UKI2RlZmluZSBmbGFnX3ByaW50X2xvYWRfbWFwIDAKI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2lmIGRlZmluZWQoVVNFX0xJU1QpCgpzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5CnsKCXN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKm5leHQ7CglMSVNUX0FSQ0hUWVBFIGFkZGVuZDsKCWludCBvZmZzZXQ7CglpbnQgaW5pdGVkIDogMTsKfTsKCiNlbmRpZgoKI2lmIGRlZmluZWQoVVNFX1NJTkdMRSkKCnN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeQp7CglpbnQgb2Zmc2V0OwoJaW50IGluaXRlZCA6IDE7CglpbnQgYWxsb2NhdGVkIDogMTsKfTsKCiNlbmRpZgoKI2lmIGRlZmluZWQoX19taXBzX18pCnN0cnVjdCBtaXBzX2hpMTYKewoJc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKCUVsZlcoQWRkcikgKmFkZHI7CglFbGZXKEFkZHIpIHZhbHVlOwp9OwojZW5kaWYKCnN0cnVjdCBhcmNoX2ZpbGUgewoJc3RydWN0IG9ial9maWxlIHJvb3Q7CiNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKCXN0cnVjdCBvYmpfc2VjdGlvbiAqcGx0OwojZW5kaWYKI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQoJc3RydWN0IG9ial9zZWN0aW9uICpnb3Q7CiNlbmRpZgojaWYgZGVmaW5lZChfX21pcHNfXykKCXN0cnVjdCBtaXBzX2hpMTYgKm1pcHNfaGkxNl9saXN0OwojZW5kaWYKfTsKCnN0cnVjdCBhcmNoX3N5bWJvbCB7CglzdHJ1Y3Qgb2JqX3N5bWJvbCByb290OwojaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCiNpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKCXN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKnBsdGVudDsKI2Vsc2UKCXN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSBwbHRlbnQ7CiNlbmRpZgojZW5kaWYKI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQoJc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5IGdvdGVudDsKI2VuZGlmCn07CgoKc3RydWN0IGV4dGVybmFsX21vZHVsZSB7Cgljb25zdCBjaGFyICpuYW1lOwoJRWxmVyhBZGRyKSBhZGRyOwoJaW50IHVzZWQ7CglzaXplX3QgbnN5bXM7CglzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnN5bXM7Cn07CgpzdGF0aWMgc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICprc3ltczsKc3RhdGljIHNpemVfdCBua3N5bXM7CgpzdGF0aWMgc3RydWN0IGV4dGVybmFsX21vZHVsZSAqZXh0X21vZHVsZXM7CnN0YXRpYyBpbnQgbl9leHRfbW9kdWxlczsKc3RhdGljIGludCBuX2V4dF9tb2R1bGVzX3VzZWQ7CmV4dGVybiBpbnQgZGVsZXRlX21vZHVsZShjb25zdCBjaGFyICopOwoKc3RhdGljIGNoYXIgKm1fZmlsZW5hbWU7CnN0YXRpYyBjaGFyICptX2Z1bGxOYW1lOwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKc3RhdGljIGludCBjaGVja19tb2R1bGVfbmFtZV9tYXRjaChjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsCgkJCQl2b2lkICp1c2VyZGF0YSwgaW50IGRlcHRoKQp7CgljaGFyICpmdWxsbmFtZSA9IChjaGFyICopIHVzZXJkYXRhOwoKCWlmIChmdWxsbmFtZVswXSA9PSAnXDAnKQoJCXJldHVybiBGQUxTRTsKCWVsc2UgewoJCWNoYXIgKnRtcCwgKnRtcDEgPSB4c3RyZHVwKGZpbGVuYW1lKTsKCQl0bXAgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudCh0bXAxKTsKCQlpZiAoc3RyY21wKHRtcCwgZnVsbG5hbWUpID09IDApIHsKCQkJZnJlZSh0bXAxKTsKCQkJLyogU3RvcCBzZWFyY2hpbmcgaWYgd2UgZmluZCBhIG1hdGNoICovCgkJCW1fZmlsZW5hbWUgPSB4c3RyZHVwKGZpbGVuYW1lKTsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQlmcmVlKHRtcDEpOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqYXJjaF9uZXdfZmlsZSh2b2lkKQp7CglzdHJ1Y3QgYXJjaF9maWxlICpmOwoJZiA9IHhtYWxsb2Moc2l6ZW9mKCpmKSk7CgoJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOwoKCXJldHVybiAmZi0+cm9vdDsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF9uZXdfc2VjdGlvbih2b2lkKQp7CglyZXR1cm4geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uKSk7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sKHZvaWQpCnsKCXN0cnVjdCBhcmNoX3N5bWJvbCAqc3ltOwoJc3ltID0geG1hbGxvYyhzaXplb2YoKnN5bSkpOwoKCW1lbXNldChzeW0sIDAsIHNpemVvZigqc3ltKSk7CgoJcmV0dXJuICZzeW0tPnJvb3Q7Cn0KCnN0YXRpYyBlbnVtIG9ial9yZWxvYwphcmNoX2FwcGx5X3JlbG9jYXRpb24oc3RydWN0IG9ial9maWxlICpmLAoJCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjLAoJCQkJc3RydWN0IG9ial9zZWN0aW9uICpzeW1zZWMsCgkJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltLAoJCQkJRWxmVyhSZWxNKSAqcmVsLCBFbGZXKEFkZHIpIHYpCnsKCXN0cnVjdCBhcmNoX2ZpbGUgKmlmaWxlID0gKHN0cnVjdCBhcmNoX2ZpbGUgKikgZjsKCWVudW0gb2JqX3JlbG9jIHJldCA9IG9ial9yZWxvY19vazsKCUVsZlcoQWRkcikgKmxvYyA9IChFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwoJRWxmVyhBZGRyKSBkb3QgPSB0YXJnc2VjLT5oZWFkZXIuc2hfYWRkciArIHJlbC0+cl9vZmZzZXQ7CiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykgfHwgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCglzdHJ1Y3QgYXJjaF9zeW1ib2wgKmlzeW0gPSAoc3RydWN0IGFyY2hfc3ltYm9sICopIHN5bTsKI2VuZGlmCiNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fczM5MF9fKQojaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCglFbGZXKEFkZHIpIGdvdCA9IGlmaWxlLT5nb3QgPyBpZmlsZS0+Z290LT5oZWFkZXIuc2hfYWRkciA6IDA7CiNlbmRpZgojZW5kaWYKI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoJRWxmVyhBZGRyKSBwbHQgPSBpZmlsZS0+cGx0ID8gaWZpbGUtPnBsdC0+aGVhZGVyLnNoX2FkZHIgOiAwOwoJdW5zaWduZWQgbG9uZyAqaXA7CiMgaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCglzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwZTsKIyBlbHNlCglzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgKnBlOwojIGVuZGlmCiNlbmRpZgoKCXN3aXRjaCAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykpIHsKCiNpZiBkZWZpbmVkKF9fYXJtX18pCgoJCWNhc2UgUl9BUk1fTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl9BUk1fQUJTMzI6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9BUk1fR09UMzI6CgkJCWdvdG8gYmJfdXNlX2dvdDsKCgkJY2FzZSBSX0FSTV9HT1RQQzoKCQkJLyogcmVsYXRpdmUgcmVsb2MsIGFsd2F5cyB0byBfR0xPQkFMX09GRlNFVF9UQUJMRV8KCQkJICogKHdoaWNoIGlzIC5nb3QpIHNpbWlsYXIgdG8gYnJhbmNoLAoJCQkgKiBidXQgaXMgZnVsbCAzMiBiaXRzIHJlbGF0aXZlICovCgoJCQkqbG9jICs9IGdvdCAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl9BUk1fUEMyNDoKCQljYXNlIFJfQVJNX1BMVDMyOgoJCQlnb3RvIGJiX3VzZV9wbHQ7CgoJCWNhc2UgUl9BUk1fR09UT0ZGOiAvKiBhZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBnb3QgKi8KCQkJKmxvYyArPSB2IC0gZ290OwoJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19jcmlzX18pCgoJCWNhc2UgUl9DUklTX05PTkU6CgkJCWJyZWFrOwoKCQljYXNlIFJfQ1JJU18zMjoKCQkJLyogQ1JJUyBrZWVwcyB0aGUgcmVsb2NhdGlvbiB2YWx1ZSBpbiB0aGUgcl9hZGRlbmQgZmllbGQgYW5kCgkJCSAqIHNob3VsZCBub3QgdXNlIHdoYXRzIGluICpsb2MgYXQgYWxsCgkJCSAqLwoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKCgkJY2FzZSBSX0g4X0RJUjI0Ujg6CgkJCWxvYyA9IChFbGZXKEFkZHIpICopKChFbGZXKEFkZHIpKWxvYyAtIDEpOwoJCQkqbG9jID0gKCpsb2MgJiAweGZmMDAwMDAwKSB8ICgoKmxvYyAmIDB4ZmZmZmZmKSArIHYpOwoJCQlicmVhazsKCQljYXNlIFJfSDhfRElSMjRBODoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCQljYXNlIFJfSDhfRElSMzI6CgkJY2FzZSBSX0g4X0RJUjMyQTE2OgoJCQkqbG9jICs9IHY7CgkJCWJyZWFrOwoJCWNhc2UgUl9IOF9QQ1JFTDE2OgoJCQl2IC09IGRvdCArIDI7CgkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4N2ZmZiB8fAoJCQkgICAgKEVsZlcoU3dvcmQpKXYgPCAtKEVsZlcoU3dvcmQpKTB4ODAwMCkKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJZWxzZQoJCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHY7CgkJCWJyZWFrOwoJCWNhc2UgUl9IOF9QQ1JFTDg6CgkJCXYgLT0gZG90ICsgMTsKCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHg3ZiB8fAoJCQkgICAgKEVsZlcoU3dvcmQpKXYgPCAtKEVsZlcoU3dvcmQpKTB4ODApCgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCWVsc2UKCQkJCSoodW5zaWduZWQgY2hhciAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX2kzODZfXykKCgkJY2FzZSBSXzM4Nl9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSXzM4Nl8zMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSXzM4Nl9QTFQzMjoKCQljYXNlIFJfMzg2X1BDMzI6CgkJCSpsb2MgKz0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zODZfR0xPQl9EQVQ6CgkJY2FzZSBSXzM4Nl9KTVBfU0xPVDoKCQkJKmxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzg2X1JFTEFUSVZFOgoJCQkqbG9jICs9IGYtPmJhc2VhZGRyOwoJCQlicmVhazsKCgkJY2FzZSBSXzM4Nl9HT1RQQzoKCQkJKmxvYyArPSBnb3QgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzg2X0dPVDMyOgoJCQlnb3RvIGJiX3VzZV9nb3Q7CgoJCWNhc2UgUl8zODZfR09UT0ZGOgoJCQkqbG9jICs9IHYgLSBnb3Q7CgkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZCAoX19taWNyb2JsYXplX18pCgkJY2FzZSBSX01JQ1JPQkxBWkVfTk9ORToKCQljYXNlIFJfTUlDUk9CTEFaRV82NF9OT05FOgoJCWNhc2UgUl9NSUNST0JMQVpFXzMyX1NZTV9PUF9TWU06CgkJY2FzZSBSX01JQ1JPQkxBWkVfMzJfUENSRUw6CgkJCWJyZWFrOwoKCQljYXNlIFJfTUlDUk9CTEFaRV82NF9QQ1JFTDogewoJCQkvKiBkb3QgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCgkJCSAqIHYgaXMgdGhlIHRhcmdldCBzeW1ib2wgYWRkcmVzcy4KCQkJICogU28gd2UgbmVlZCB0byBleHRyYWN0IHRoZSBvZmZzZXQgaW4gdGhlIGNvZGUsCgkJCSAqIGFkZGluZyB2LCB0aGVuIHN1YnRyYXRpbmcgdGhlIGN1cnJlbnQgYWRkcmVzcwoJCQkgKiBvZiB0aGlzIGluc3RydWN0aW9uLgoJCQkgKiBFeDogIklNTSAweEZGRkUgIGJyYWxpZCAweDAwMDAiID0gImJyYWxpZCAweEZGRkUwMDAwIgoJCQkgKi8KCgkJCS8qIEdldCBzcGxpdCBvZmZzZXQgc3RvcmVkIGluIGNvZGUgKi8KCQkJdW5zaWduZWQgaW50IHRlbXAgPSAobG9jWzBdICYgMHhGRkZGKSA8PCAxNiB8CgkJCQkJCShsb2NbMV0gJiAweEZGRkYpOwoKCQkJLyogQWRqdXN0IHJlbGF0aXZlIG9mZnNldC4gLTQgYWRqdXN0bWVudCByZXF1aXJlZAoJCQkgKiBiZWNhdXNlIGRvdCBwb2ludHMgdG8gdGhlIElNTSBpbnNuLCBidXQgYnJhbmNoCgkJCSAqIGlzIGNvbXB1dGVkIHJlbGF0aXZlIHRvIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXRzZWxmLgoJCQkgKi8KCQkJdGVtcCArPSB2IC0gZG90IC0gNDsKCgkJCS8qIFN0b3JlIGJhY2sgaW50byBjb2RlICovCgkJCWxvY1swXSA9IChsb2NbMF0gJiAweEZGRkYwMDAwKSB8IHRlbXAgPj4gMTY7CgkJCWxvY1sxXSA9IChsb2NbMV0gJiAweEZGRkYwMDAwKSB8ICh0ZW1wICYgMHhGRkZGKTsKCgkJCWJyZWFrOwoJCX0KCgkJY2FzZSBSX01JQ1JPQkxBWkVfMzI6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9NSUNST0JMQVpFXzY0OiB7CgkJCS8qIEdldCBzcGxpdCBwb2ludGVyIHN0b3JlZCBpbiBjb2RlICovCgkJCXVuc2lnbmVkIGludCB0ZW1wMSA9IChsb2NbMF0gJiAweEZGRkYpIDw8IDE2IHwKCQkJCQkJKGxvY1sxXSAmIDB4RkZGRik7CgoJCQkvKiBBZGQgcmVsb2Mgb2Zmc2V0ICovCgkJCXRlbXAxKz12OwoKCQkJLyogU3RvcmUgYmFjayBpbnRvIGNvZGUgKi8KCQkJbG9jWzBdID0gKGxvY1swXSAmIDB4RkZGRjAwMDApIHwgdGVtcDEgPj4gMTY7CgkJCWxvY1sxXSA9IChsb2NbMV0gJiAweEZGRkYwMDAwKSB8ICh0ZW1wMSAmIDB4RkZGRik7CgoJCQlicmVhazsKCQl9CgoJCWNhc2UgUl9NSUNST0JMQVpFXzMyX1BDUkVMX0xPOgoJCWNhc2UgUl9NSUNST0JMQVpFXzMyX0xPOgoJCWNhc2UgUl9NSUNST0JMQVpFX1NSTzMyOgoJCWNhc2UgUl9NSUNST0JMQVpFX1NSVzMyOgoJCQlyZXQgPSBvYmpfcmVsb2NfdW5oYW5kbGVkOwoJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19tYzY4MDAwX18pCgoJCWNhc2UgUl82OEtfTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfMzI6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfODoKCQkJaWYgKHYgPiAweGZmKSB7CgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCX0KCQkJKihjaGFyICopbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfMTY6CgkJCWlmICh2ID4gMHhmZmZmKSB7CgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCX0KCQkJKihzaG9ydCAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLX1BDODoKCQkJdiAtPSBkb3Q7CgkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4N2YgfHwKCQkJCQkoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MCkgewoJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQl9CgkJCSooY2hhciAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLX1BDMTY6CgkJCXYgLT0gZG90OwoJCQlpZiAoKEVsZlcoU3dvcmQpKXYgPiAweDdmZmYgfHwKCQkJCQkoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MDAwKSB7CgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCX0KCQkJKihzaG9ydCAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLX1BDMzI6CgkJCSooaW50ICopbG9jID0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfR0xPQl9EQVQ6CgkJY2FzZSBSXzY4S19KTVBfU0xPVDoKCQkJKmxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfNjhLX1JFTEFUSVZFOgoJCQkqKGludCAqKWxvYyArPSBmLT5iYXNlYWRkcjsKCQkJYnJlYWs7CgoJCWNhc2UgUl82OEtfR09UMzI6CgkJCWdvdG8gYmJfdXNlX2dvdDsKCiMgaWZkZWYgUl82OEtfR09UT0ZGCgkJY2FzZSBSXzY4S19HT1RPRkY6CgkJCSpsb2MgKz0gdiAtIGdvdDsKCQkJYnJlYWs7CiMgZW5kaWYKCiNlbGlmIGRlZmluZWQoX19taXBzX18pCgoJCWNhc2UgUl9NSVBTX05PTkU6CgkJCWJyZWFrOwoKCQljYXNlIFJfTUlQU18zMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX01JUFNfMjY6CgkJCWlmICh2ICUgNCkKCQkJCXJldCA9IG9ial9yZWxvY19kYW5nZXJvdXM7CgkJCWlmICgodiAmIDB4ZjAwMDAwMDApICE9ICgoZG90ICsgNCkgJiAweGYwMDAwMDAwKSkKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJKmxvYyA9CgkJCQkoKmxvYyAmIH4weDAzZmZmZmZmKSB8ICgoKmxvYyArICh2ID4+IDIpKSAmCgkJCQkJCQkJCQkweDAzZmZmZmZmKTsKCQkJYnJlYWs7CgoJCWNhc2UgUl9NSVBTX0hJMTY6CgkJCXsKCQkJCXN0cnVjdCBtaXBzX2hpMTYgKm47CgoJCQkJLyogV2UgY2Fubm90IHJlbG9jYXRlIHRoaXMgb25lIG5vdyBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlCgkJCQkgICBvZiB0aGUgY2Fycnkgd2UgbmVlZCB0byBhZGQuICBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2CgkJCQkgICBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwoJCQkJbiA9IHhtYWxsb2Moc2l6ZW9mICpuKTsKCQkJCW4tPmFkZHIgPSBsb2M7CgkJCQluLT52YWx1ZSA9IHY7CgkJCQluLT5uZXh0ID0gaWZpbGUtPm1pcHNfaGkxNl9saXN0OwoJCQkJaWZpbGUtPm1pcHNfaGkxNl9saXN0ID0gbjsKCQkJCWJyZWFrOwoJCQl9CgoJCWNhc2UgUl9NSVBTX0xPMTY6CgkJCXsKCQkJCXVuc2lnbmVkIGxvbmcgaW5zbmxvID0gKmxvYzsKCQkJCUVsZlcoQWRkcikgdmFsLCB2YWxsbzsKCgkJCQkvKiBTaWduIGV4dGVuZCB0aGUgYWRkZW5kIHdlIGV4dHJhY3QgZnJvbSB0aGUgbG8gaW5zbi4gICovCgkJCQl2YWxsbyA9ICgoaW5zbmxvICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7CgoJCQkJaWYgKGlmaWxlLT5taXBzX2hpMTZfbGlzdCAhPSBOVUxMKSB7CgkJCQkJc3RydWN0IG1pcHNfaGkxNiAqbDsKCgkJCQkJbCA9IGlmaWxlLT5taXBzX2hpMTZfbGlzdDsKCQkJCQl3aGlsZSAobCAhPSBOVUxMKSB7CgkJCQkJCXN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CgkJCQkJCXVuc2lnbmVkIGxvbmcgaW5zbjsKCgkJCQkJCS8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKCQkJCQkJICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlCgkJCQkJCSAgIHRvIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZSBMTzE2LiAgKi8KCQkJCQkJaW5zbiA9ICpsLT5hZGRyOwoJCQkJCQl2YWwgPQoJCQkJCQkJKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKwoJCQkJCQkJdmFsbG87CgkJCQkJCXZhbCArPSB2OwoKCQkJCQkJLyogQWNjb3VudCBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uIHRoYXQgd2lsbCBoYXBwZW4gaW4gdGhlCgkJCQkJCSAgIGxvdyBiaXRzLiAgKi8KCQkJCQkJdmFsID0KCQkJCQkJCSgodmFsID4+IDE2KSArCgkJCQkJCQkgKCh2YWwgJiAweDgwMDApICE9CgkJCQkJCQkgIDApKSAmIDB4ZmZmZjsKCgkJCQkJCWluc24gPSAoaW5zbiAmIH4weGZmZmYpIHwgdmFsOwoJCQkJCQkqbC0+YWRkciA9IGluc247CgoJCQkJCQluZXh0ID0gbC0+bmV4dDsKCQkJCQkJZnJlZShsKTsKCQkJCQkJbCA9IG5leHQ7CgkJCQkJfQoKCQkJCQlpZmlsZS0+bWlwc19oaTE2X2xpc3QgPSBOVUxMOwoJCQkJfQoKCQkJCS8qIE9rLCB3ZSdyZSBkb25lIHdpdGggdGhlIEhJMTYgcmVsb2NzLiAgTm93IGRlYWwgd2l0aCB0aGUgTE8xNi4gICovCgkJCQl2YWwgPSB2ICsgdmFsbG87CgkJCQlpbnNubG8gPSAoaW5zbmxvICYgfjB4ZmZmZikgfCAodmFsICYgMHhmZmZmKTsKCQkJCSpsb2MgPSBpbnNubG87CgkJCQlicmVhazsKCQkJfQoKI2VsaWYgZGVmaW5lZChfX25pb3MyX18pCgoJCWNhc2UgUl9OSU9TMl9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX05JT1MyX0JGRF9SRUxPQ18zMjoKCQkJKmxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX05JT1MyX0JGRF9SRUxPQ18xNjoKCQkJaWYgKHYgPiAweGZmZmYpIHsKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJfQoJCQkqKHNob3J0ICopbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9CRkRfUkVMT0NfODoKCQkJaWYgKHYgPiAweGZmKSB7CgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCX0KCQkJKihjaGFyICopbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9TMTY6CgkJCXsKCQkJCUVsZjMyX0FkZHIgd29yZDsKCgkJCQlpZiAoKEVsZjMyX1N3b3JkKXYgPiAweDdmZmYgfHwKCQkJCSAgICAoRWxmMzJfU3dvcmQpdiA8IC0oRWxmMzJfU3dvcmQpMHg4MDAwKSB7CgkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQkJfQoKCQkJCXdvcmQgPSAqbG9jOwoJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwKCQkJCSAgICAgICAod29yZCAmIDB4M2YpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfVTE2OgoJCQl7CgkJCQlFbGYzMl9BZGRyIHdvcmQ7CgoJCQkJaWYgKHYgPiAweGZmZmYpIHsKCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCQl9CgoJCQkJd29yZCA9ICpsb2M7CgkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICh2ICYgMHhmZmZmKSkgPDwgNikgfAoJCQkJICAgICAgICh3b3JkICYgMHgzZik7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9QQ1JFTDE2OgoJCQl7CgkJCQlFbGYzMl9BZGRyIHdvcmQ7CgoJCQkJdiAtPSBkb3QgKyA0OwoJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZmZmIHx8CgkJCQkgICAgKEVsZjMyX1N3b3JkKXYgPCAtKEVsZjMyX1N3b3JkKTB4ODAwMCkgewoJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJCX0KCgkJCQl3b3JkID0gKmxvYzsKCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8ICh3b3JkICYgMHgzZik7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9HUFJFTDoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkLCBncDsKCQkJCS8qIGdldCBfZ3AgKi8KCQkJCWdwID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiX2dwIikpOwoJCQkJdi09Z3A7CgkJCQlpZiAoKEVsZjMyX1N3b3JkKXYgPiAweDdmZmYgfHwKCQkJCQkJKEVsZjMyX1N3b3JkKXYgPCAtKEVsZjMyX1N3b3JkKTB4ODAwMCkgewoJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJCX0KCgkJCQl3b3JkID0gKmxvYzsKCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8ICh3b3JkICYgMHgzZik7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9DQUxMMjY6CgkJCWlmICh2ICYgMykKCQkJCXJldCA9IG9ial9yZWxvY19kYW5nZXJvdXM7CgkJCWlmICgodiA+PiAyOCkgIT0gKGRvdCA+PiAyOCkpCgkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCSpsb2MgPSAoKmxvYyAmIDB4M2YpIHwgKCh2ID4+IDIpIDw8IDYpOwoJCQlicmVhazsKCgkJY2FzZSBSX05JT1MyX0lNTTU6CgkJCXsKCQkJCUVsZjMyX0FkZHIgd29yZDsKCgkJCQlpZiAodiA+IDB4MWYpIHsKCQkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJCQl9CgoJCQkJd29yZCA9ICpsb2MgJiB+MHg3YzA7CgkJCQkqbG9jID0gd29yZCB8ICgodiAmIDB4MWYpIDw8IDYpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfSU1NNjoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkOwoKCQkJCWlmICh2ID4gMHgzZikgewoJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkJCX0KCgkJCQl3b3JkID0gKmxvYyAmIH4weGZjMDsKCQkJCSpsb2MgPSB3b3JkIHwgKCh2ICYgMHgzZikgPDwgNik7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9JTU04OgoJCQl7CgkJCQlFbGYzMl9BZGRyIHdvcmQ7CgoJCQkJaWYgKHYgPiAweGZmKSB7CgkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCQkJfQoKCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZjMDsKCQkJCSpsb2MgPSB3b3JkIHwgKCh2ICYgMHhmZikgPDwgNik7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUl9OSU9TMl9ISTE2OgoJCQl7CgkJCQlFbGYzMl9BZGRyIHdvcmQ7CgoJCQkJd29yZCA9ICpsb2M7CgkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICgodiA+PjE2KSAmIDB4ZmZmZikpIDw8IDYpIHwKCQkJCSAgICAgICAod29yZCAmIDB4M2YpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfTE8xNjoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkOwoKCQkJCXdvcmQgPSAqbG9jOwoJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwKCQkJCSAgICAgICAod29yZCAmIDB4M2YpOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJfTklPUzJfSElBREoxNjoKCQkJewoJCQkJRWxmMzJfQWRkciB3b3JkMSwgd29yZDI7CgoJCQkJd29yZDEgPSAqbG9jOwoJCQkJd29yZDIgPSAoKHYgPj4gMTYpICsgKCh2ID4+IDE1KSAmIDEpKSAmIDB4ZmZmZjsKCQkJCSpsb2MgPSAoKCgod29yZDEgPj4gMjIpIDw8IDE2KSB8IHdvcmQyKSA8PCA2KSB8CgkJCQkgICAgICAgKHdvcmQxICYgMHgzZik7CgkJCX0KCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCgkJLyogUFBDNjQgbmVlZHMgYSAyLjYga2VybmVsLCAyLjQgbW9kdWxlIHJlbG9jYXRpb24gaXJyZWxldmFudCAqLwoKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKCgkJY2FzZSBSX1BQQ19BRERSMTZfSEE6CgkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSAodiArIDB4ODAwMCkgPj4gMTY7CgkJCWJyZWFrOwoKCQljYXNlIFJfUFBDX0FERFIxNl9ISToKCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHYgPj4gMTY7CgkJCWJyZWFrOwoKCQljYXNlIFJfUFBDX0FERFIxNl9MTzoKCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfUFBDX1JFTDI0OgoJCQlnb3RvIGJiX3VzZV9wbHQ7CgoJCWNhc2UgUl9QUENfUkVMMzI6CgkJCSpsb2MgPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1BQQ19BRERSMzI6CgkJCSpsb2MgPSB2OwoJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19zMzkwX18pCgoJCWNhc2UgUl8zOTBfMzI6CgkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2OwoJCQlicmVhazsKCQljYXNlIFJfMzkwXzE2OgoJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2OwoJCQlicmVhazsKCQljYXNlIFJfMzkwXzg6CgkJCSoodW5zaWduZWQgY2hhciAqKSBsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfUEMzMjoKCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHYgLSBkb3Q7CgkJCWJyZWFrOwoJCWNhc2UgUl8zOTBfUEMxNkRCTDoKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gKHYgLSBkb3QpID4+IDE7CgkJCWJyZWFrOwoJCWNhc2UgUl8zOTBfUEMxNjoKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfUExUMzI6CgkJY2FzZSBSXzM5MF9QTFQxNkRCTDoKCQkJLyogZmluZCB0aGUgcGx0IGVudHJ5IGFuZCBpbml0aWFsaXplIGl0LiAgKi8KCQkJcGUgPSAoc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5ICopICZpc3ltLT5wbHRlbnQ7CgkJCWlmIChwZS0+aW5pdGVkID09IDApIHsKCQkJCWlwID0gKHVuc2lnbmVkIGxvbmcgKikoaWZpbGUtPnBsdC0+Y29udGVudHMgKyBwZS0+b2Zmc2V0KTsKCQkJCWlwWzBdID0gMHgwZDEwNTgxMDsgLyogYmFzciAxLDA7IGxnIDEsMTAoMSk7IGJyIDEgKi8KCQkJCWlwWzFdID0gMHgxMDA2MDdmMTsKCQkJCWlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9QTFQxNkRCTCkKCQkJCQlpcFsyXSA9IHYgLSAyOwoJCQkJZWxzZQoJCQkJCWlwWzJdID0gdjsKCQkJCXBlLT5pbml0ZWQgPSAxOwoJCQl9CgoJCQkvKiBJbnNlcnQgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGFyZ2V0LiAgKi8KCQkJdiA9IHBsdCArIHBlLT5vZmZzZXQgLSBkb3Q7CgkJCWlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9QTFQzMikKCQkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9ICh1bnNpZ25lZCBpbnQpIHY7CgkJCWVsc2UgaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX1BMVDE2REJMKQoJCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgPSAodW5zaWduZWQgc2hvcnQpICgodiArIDIpID4+IDEpOwoJCQlicmVhazsKCgkJY2FzZSBSXzM5MF9HTE9CX0RBVDoKCQljYXNlIFJfMzkwX0pNUF9TTE9UOgoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfUkVMQVRJVkU6CgkJCSpsb2MgKz0gZi0+YmFzZWFkZHI7CgkJCWJyZWFrOwoKCQljYXNlIFJfMzkwX0dPVFBDOgoJCQkqKHVuc2lnbmVkIGxvbmcgKikgbG9jICs9IGdvdCAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl8zOTBfR09UMTI6CgkJY2FzZSBSXzM5MF9HT1QxNjoKCQljYXNlIFJfMzkwX0dPVDMyOgoJCQlpZiAoIWlzeW0tPmdvdGVudC5pbml0ZWQpCgkJCXsKCQkJCWlzeW0tPmdvdGVudC5pbml0ZWQgPSAxOwoJCQkJKihFbGZXKEFkZHIpICopKGlmaWxlLT5nb3QtPmNvbnRlbnRzICsgaXN5bS0+Z290ZW50Lm9mZnNldCkgPSB2OwoJCQl9CgkJCWlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9HT1QxMikKCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jIHw9ICgqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArIGlzeW0tPmdvdGVudC5vZmZzZXQpICYgMHhmZmY7CgkJCWVsc2UgaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX0dPVDE2KQoJCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldDsKCQkJZWxzZSBpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfR09UMzIpCgkJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldDsKCQkJYnJlYWs7CgojIGlmbmRlZiBSXzM5MF9HT1RPRkYzMgojICBkZWZpbmUgUl8zOTBfR09UT0ZGMzIgUl8zOTBfR09UT0ZGCiMgZW5kaWYKCQljYXNlIFJfMzkwX0dPVE9GRjMyOgoJCQkqbG9jICs9IHYgLSBnb3Q7CgkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX3NoX18pCgoJCWNhc2UgUl9TSF9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX1NIX0RJUjMyOgoJCQkqbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfUkVMMzI6CgkJCSpsb2MgKz0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl9TSF9QTFQzMjoKCQkJKmxvYyA9IHYgLSBkb3Q7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfR0xPQl9EQVQ6CgkJY2FzZSBSX1NIX0pNUF9TTE9UOgoJCQkqbG9jID0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9TSF9SRUxBVElWRToKCQkJKmxvYyA9IGYtPmJhc2VhZGRyICsgcmVsLT5yX2FkZGVuZDsKCQkJYnJlYWs7CgoJCWNhc2UgUl9TSF9HT1RQQzoKCQkJKmxvYyA9IGdvdCAtIGRvdCArIHJlbC0+cl9hZGRlbmQ7CgkJCWJyZWFrOwoKCQljYXNlIFJfU0hfR09UMzI6CgkJCWdvdG8gYmJfdXNlX2dvdDsKCgkJY2FzZSBSX1NIX0dPVE9GRjoKCQkJKmxvYyA9IHYgLSBnb3Q7CgkJCWJyZWFrOwoKIyBpZiBkZWZpbmVkKF9fU0g1X18pCgkJY2FzZSBSX1NIX0lNTV9NRURMT1cxNjoKCQljYXNlIFJfU0hfSU1NX0xPVzE2OgoJCQl7CgkJCQlFbGZXKEFkZHIpIHdvcmQ7CgoJCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfU0hfSU1NX01FRExPVzE2KQoJCQkJCXYgPj49IDE2OwoKCQkJCS8qCgkJCQkgKiAgbW92aSBhbmQgc2hvcmkgaGF2ZSB0aGUgZm9ybWF0OgoJCQkJICoKCQkJCSAqICB8ICBvcCAgfCBpbW0gIHwgcmVnIHwgcmVzZXJ2ZWQgfAoJCQkJICogICAzMS4uMjYgMjUuLjEwIDkuLiA0IDMgICAuLiAgIDAKCQkJCSAqCgkJCQkgKiBzbyB3ZSBzaW1wbHkgbWFzayBhbmQgb3IgaW4gaW1tLgoJCQkJICovCgkJCQl3b3JkID0gKmxvYyAmIH4weDNmZmZjMDA7CgkJCQl3b3JkIHw9ICh2ICYgMHhmZmZmKSA8PCAxMDsKCgkJCQkqbG9jID0gd29yZDsKCgkJCQlicmVhazsKCQkJfQoKCQljYXNlIFJfU0hfSU1NX01FRExPVzE2X1BDUkVMOgoJCWNhc2UgUl9TSF9JTU1fTE9XMTZfUENSRUw6CgkJCXsKCQkJCUVsZlcoQWRkcikgd29yZDsKCgkJCQl3b3JkID0gKmxvYyAmIH4weDNmZmZjMDA7CgoJCQkJdiAtPSBkb3Q7CgoJCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfU0hfSU1NX01FRExPVzE2X1BDUkVMKQoJCQkJCXYgPj49IDE2OwoKCQkJCXdvcmQgfD0gKHYgJiAweGZmZmYpIDw8IDEwOwoKCQkJCSpsb2MgPSB3b3JkOwoKCQkJCWJyZWFrOwoJCQl9CiMgZW5kaWYgLyogX19TSDVfXyAqLwoKI2VsaWYgZGVmaW5lZCAoX192ODUwZV9fKQoKCQljYXNlIFJfVjg1MF9OT05FOgoJCQlicmVhazsKCgkJY2FzZSBSX1Y4NTBfMzI6CgkJCS8qIFdlIHdyaXRlIHR3byBzaG9ydHMgaW5zdGVhZCBvZiBhIGxvbmcgYmVjYXVzZSBldmVuCgkJCSAgIDMyLWJpdCBpbnNucyBvbmx5IG5lZWQgaGFsZi13b3JkIGFsaWdubWVudCwgYnV0CgkJCSAgIDMyLWJpdCBkYXRhIG5lZWRzIHRvIGJlIGxvbmctd29yZCBhbGlnbmVkLiAgKi8KCQkJdiArPSAoKHVuc2lnbmVkIHNob3J0ICopbG9jKVswXTsKCQkJdiArPSAoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA8PCAxNjsKCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMF0gPSB2ICYgMHhmZmZmOwoJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA9ICh2ID4+IDE2KSAmIDB4ZmZmZjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9WODUwXzIyX1BDUkVMOgoJCQlnb3RvIGJiX3VzZV9wbHQ7CgojZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCgoJCWNhc2UgUl9YODZfNjRfTk9ORToKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfNjQ6CgkJCSpsb2MgKz0gdjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfMzI6CgkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2OwoJCQlpZiAodiA+IDB4ZmZmZmZmZmYpCgkJCXsKCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsgLyogS2VybmVsIG1vZHVsZSBjb21waWxlZCB3aXRob3V0IC1tY21vZGVsPWtlcm5lbC4gKi8KCQkJCS8qIGVycm9yKCJQb3NzaWJseSBpcyBtb2R1bGUgY29tcGlsZWQgd2l0aG91dCAtbWNtb2RlbD1rZXJuZWwhIik7ICovCgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfMzJTOgoJCQkqKHNpZ25lZCBpbnQgKikgbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfWDg2XzY0XzE2OgoJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF84OgoJCQkqKHVuc2lnbmVkIGNoYXIgKikgbG9jICs9IHY7CgkJCWJyZWFrOwoKCQljYXNlIFJfWDg2XzY0X1BDMzI6CgkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF9QQzE2OgoJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSB2IC0gZG90OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF9QQzg6CgkJCSoodW5zaWduZWQgY2hhciAqKSBsb2MgKz0gdiAtIGRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfR0xPQl9EQVQ6CgkJY2FzZSBSX1g4Nl82NF9KVU1QX1NMT1Q6CgkJCSpsb2MgPSB2OwoJCQlicmVhazsKCgkJY2FzZSBSX1g4Nl82NF9SRUxBVElWRToKCQkJKmxvYyArPSBmLT5iYXNlYWRkcjsKCQkJYnJlYWs7CgoJCWNhc2UgUl9YODZfNjRfR09UMzI6CgkJY2FzZSBSX1g4Nl82NF9HT1RQQ1JFTDoKCQkJZ290byBiYl91c2VfZ290OwojIGlmIDAKCQkJaWYgKCFpc3ltLT5nb3RlbnQucmVsb2NfZG9uZSkKCQkJewoJCQkJaXN5bS0+Z290ZW50LnJlbG9jX2RvbmUgPSAxOwoJCQkJKihFbGY2NF9BZGRyICopKGlmaWxlLT5nb3QtPmNvbnRlbnRzICsgaXN5bS0+Z290ZW50Lm9mZnNldCkgPSB2OwoJCQl9CgkJCS8qIFhYWCBhcmUgdGhlc2UgcmVhbGx5IGNvcnJlY3Q/ICAqLwoJCQlpZiAoRUxGNjRfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSX1g4Nl82NF9HT1RQQ1JFTCkKCQkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2ICsgaXN5bS0+Z290ZW50Lm9mZnNldDsKCQkJZWxzZQoJCQkJKmxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OwoJCQlicmVhazsKIyBlbmRpZgoKI2Vsc2UKIyB3YXJuaW5nICJubyBpZGVhIGhvdyB0byBoYW5kbGUgcmVsb2NhdGlvbnMgb24geW91ciBhcmNoIgojZW5kaWYKCgkJZGVmYXVsdDoKCQkJcHJpbnRmKCJXYXJuaW5nOiB1bmhhbmRsZWQgcmVsb2MgJWRcbiIsKGludClFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CgkJCXJldCA9IG9ial9yZWxvY191bmhhbmRsZWQ7CgkJCWJyZWFrOwoKI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoKYmJfdXNlX3BsdDoKCgkJCS8qIGZpbmQgdGhlIHBsdCBlbnRyeSBhbmQgaW5pdGlhbGl6ZSBpdCBpZiBuZWNlc3NhcnkgKi8KCiNpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKCQkJZm9yIChwZSA9IGlzeW0tPnBsdGVudDsgcGUgIT0gTlVMTCAmJiBwZS0+YWRkZW5kICE9IHJlbC0+cl9hZGRlbmQ7KQoJCQkJcGUgPSBwZS0+bmV4dDsKI2Vsc2UKCQkJcGUgPSAmaXN5bS0+cGx0ZW50OwojZW5kaWYKCgkJCWlmICghIHBlLT5pbml0ZWQpIHsKCQkJCWlwID0gKHVuc2lnbmVkIGxvbmcgKikgKGlmaWxlLT5wbHQtPmNvbnRlbnRzICsgcGUtPm9mZnNldCk7CgoJCQkJLyogZ2VuZXJhdGUgc29tZSBtYWNoaW5lIGNvZGUgKi8KCiNpZiBkZWZpbmVkKF9fYXJtX18pCgkJCQlpcFswXSA9IDB4ZTUxZmYwMDQ7CQkJLyogbGRyIHBjLFtwYywjLTRdICovCgkJCQlpcFsxXSA9IHY7CQkJCS8qIHN5bUAgKi8KI2VuZGlmCiNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQoJCQkJaXBbMF0gPSAweDNkNjAwMDAwICsgKCh2ICsgMHg4MDAwKSA+PiAxNik7ICAvKiBsaXMgcjExLHN5bUBoYSAqLwoJCQkJaXBbMV0gPSAweDM5NmIwMDAwICsgKHYgJiAweGZmZmYpOyAgICAgICAgICAvKiBhZGRpIHIxMSxyMTEsc3ltQGwgKi8KCQkJCWlwWzJdID0gMHg3ZDY5MDNhNjsJCQkgICAgICAvKiBtdGN0ciByMTEgKi8KCQkJCWlwWzNdID0gMHg0ZTgwMDQyMDsJCQkgICAgICAvKiBiY3RyICovCiNlbmRpZgojaWYgZGVmaW5lZCAoX192ODUwZV9fKQoJCQkJLyogV2UgaGF2ZSB0byB0cmFzaCBhIHJlZ2lzdGVyLCBzbyB3ZSBhc3N1bWUgdGhhdCBhbnkgY29udHJvbAoJCQkJICAgdHJhbnNmZXIgbW9yZSB0aGFuIDIxLWJpdHMgYXdheSBtdXN0IGJlIGEgZnVuY3Rpb24gY2FsbAoJCQkJICAgKHNvIHdlIGNhbiB1c2UgYSBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcikuICAqLwoJCQkJaXBbMF0gPSAweDA2MjEgKyAoKHYgJiAweGZmZmYpIDw8IDE2KTsgICAvKiBtb3Ygc3ltLCByMSAuLi4gKi8KCQkJCWlwWzFdID0gKCh2ID4+IDE2KSAmIDB4ZmZmZikgKyAweDYxMDAwMDsgLyogLi4uOyBqbXAgcjEgKi8KI2VuZGlmCgkJCQlwZS0+aW5pdGVkID0gMTsKCQkJfQoKCQkJLyogcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGFyZ2V0ICovCgkJCXYgLT0gZG90OwoJCQkvKiBpZiB0aGUgdGFyZ2V0IGlzIHRvbyBmYXIgYXdheS4uLi4gKi8KI2lmIGRlZmluZWQgKF9fYXJtX18pIHx8IGRlZmluZWQgKF9fcG93ZXJwY19fKQoJCQlpZiAoKGludCl2IDwgLTB4MDIwMDAwMDAgfHwgKGludCl2ID49IDB4MDIwMDAwMDApCiNlbGlmIGRlZmluZWQgKF9fdjg1MGVfXykKCQkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4MWZmZmZmIHx8IChFbGZXKFN3b3JkKSl2IDwgKEVsZlcoU3dvcmQpKS0weDIwMDAwMCkKI2VuZGlmCgkJCQkJLyogZ28gdmlhIHRoZSBwbHQgKi8KCQkJCQl2ID0gcGx0ICsgcGUtPm9mZnNldCAtIGRvdDsKCiNpZiBkZWZpbmVkIChfX3Y4NTBlX18pCgkJCWlmICh2ICYgMSkKI2Vsc2UKCQkJCWlmICh2ICYgMykKI2VuZGlmCgkJCQkJcmV0ID0gb2JqX3JlbG9jX2Rhbmdlcm91czsKCgkJCS8qIG1lcmdlIHRoZSBvZmZzZXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICovCiNpZiBkZWZpbmVkKF9fYXJtX18pCgkJCS8qIENvbnZlcnQgdG8gd29yZHMuICovCgkJCXYgPj49IDI7CgoJCQkqbG9jID0gKCpsb2MgJiB+MHgwMGZmZmZmZikgfCAoKHYgKyAqbG9jKSAmIDB4MDBmZmZmZmYpOwojZW5kaWYKI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCgkJCSpsb2MgPSAoKmxvYyAmIH4weDAzZmZmZmZjKSB8ICh2ICYgMHgwM2ZmZmZmYyk7CiNlbmRpZgojaWYgZGVmaW5lZCAoX192ODUwZV9fKQoJCQkvKiBXZSB3cml0ZSB0d28gc2hvcnRzIGluc3RlYWQgb2YgYSBsb25nIGJlY2F1c2UgZXZlbiAzMi1iaXQgaW5zbnMKCQkJICAgb25seSBuZWVkIGhhbGYtd29yZCBhbGlnbm1lbnQsIGJ1dCB0aGUgMzItYml0IGRhdGEgd3JpdGUgbmVlZHMKCQkJICAgdG8gYmUgbG9uZy13b3JkIGFsaWduZWQuICAqLwoJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVswXSA9CgkJCQkoKih1bnNpZ25lZCBzaG9ydCAqKWxvYyAmIDB4ZmZjMCkgLyogb3Bjb2RlICsgcmVnICovCgkJCQl8ICgodiA+PiAxNikgJiAweDNmKTsgICAgICAgICAgICAgLyogb2ZmcyBoaWdoIHBhcnQgKi8KCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMV0gPQoJCQkJKHYgJiAweGZmZmYpOyAgICAgICAgICAgICAgICAgICAgLyogb2ZmcyBsb3cgcGFydCAqLwojZW5kaWYKCQkJYnJlYWs7CiNlbmRpZiAvKiBVU0VfUExUX0VOVFJJRVMgKi8KCiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKYmJfdXNlX2dvdDoKCgkJCS8qIG5lZWRzIGFuIGVudHJ5IGluIHRoZSAuZ290OiBzZXQgaXQsIG9uY2UgKi8KCQkJaWYgKCFpc3ltLT5nb3RlbnQuaW5pdGVkKSB7CgkJCQlpc3ltLT5nb3RlbnQuaW5pdGVkID0gMTsKCQkJCSooRWxmVyhBZGRyKSAqKSAoaWZpbGUtPmdvdC0+Y29udGVudHMgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSA9IHY7CgkJCX0KCQkJLyogbWFrZSB0aGUgcmVsb2Mgd2l0aF9yZXNwZWN0X3RvXy5nb3QgKi8KI2lmIGRlZmluZWQoX19zaF9fKQoJCQkqbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQgKyByZWwtPnJfYWRkZW5kOwojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pCgkJCSpsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldDsKI2VuZGlmCgkJCWJyZWFrOwoKI2VuZGlmIC8qIFVTRV9HT1RfRU5UUklFUyAqLwoJfQoKCXJldHVybiByZXQ7Cn0KCgojaWYgZGVmaW5lZChVU0VfTElTVCkKCnN0YXRpYyBpbnQgYXJjaF9saXN0X2FkZChFbGZXKFJlbE0pICpyZWwsIHN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKipsaXN0LAoJCQkgIGludCBvZmZzZXQsIGludCBzaXplKQp7CglzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICpwZTsKCglmb3IgKHBlID0gKmxpc3Q7IHBlICE9IE5VTEw7IHBlID0gcGUtPm5leHQpIHsKCQlpZiAocGUtPmFkZGVuZCA9PSByZWwtPnJfYWRkZW5kKSB7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAocGUgPT0gTlVMTCkgewoJCXBlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGFyY2hfbGlzdF9lbnRyeSkpOwoJCXBlLT5uZXh0ID0gKmxpc3Q7CgkJcGUtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CgkJcGUtPm9mZnNldCA9IG9mZnNldDsKCQlwZS0+aW5pdGVkID0gMDsKCQkqbGlzdCA9IHBlOwoJCXJldHVybiBzaXplOwoJfQoJcmV0dXJuIDA7Cn0KCiNlbmRpZgoKI2lmIGRlZmluZWQoVVNFX1NJTkdMRSkKCnN0YXRpYyBpbnQgYXJjaF9zaW5nbGVfaW5pdChFbGZXKFJlbE0pICpyZWwsIHN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSAqc2luZ2xlLAoJCQkgICAgIGludCBvZmZzZXQsIGludCBzaXplKQp7CglpZiAoc2luZ2xlLT5hbGxvY2F0ZWQgPT0gMCkgewoJCXNpbmdsZS0+YWxsb2NhdGVkID0gMTsKCQlzaW5nbGUtPm9mZnNldCA9IG9mZnNldDsKCQlzaW5nbGUtPmluaXRlZCA9IDA7CgkJcmV0dXJuIHNpemU7Cgl9CglyZXR1cm4gMDsKfQoKI2VuZGlmCgojaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpIHx8IGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF94c2VjdF9pbml0KHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqbmFtZSwKCQkJCQkgICBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpteXJlbHNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgbmFtZSk7CgoJaWYgKG9mZnNldCA9PSAwKSB7CgkJb2Zmc2V0ICs9IHNpemU7Cgl9CgoJaWYgKG15cmVsc2VjKSB7CgkJb2JqX2V4dGVuZF9zZWN0aW9uKG15cmVsc2VjLCBvZmZzZXQpOwoJfSBlbHNlIHsKCQlteXJlbHNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsIG5hbWUsCgkJCQlzaXplLCBvZmZzZXQpOwoJfQoKCXJldHVybiBteXJlbHNlYzsKfQoKI2VuZGlmCgpzdGF0aWMgdm9pZCBhcmNoX2NyZWF0ZV9nb3Qoc3RydWN0IG9ial9maWxlICpmKQp7CiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykgfHwgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCglzdHJ1Y3QgYXJjaF9maWxlICppZmlsZSA9IChzdHJ1Y3QgYXJjaF9maWxlICopIGY7CglpbnQgaTsKI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQoJaW50IGdvdF9vZmZzZXQgPSAwLCBnb3RfbmVlZGVkID0gMCwgZ290X2FsbG9jYXRlOwojZW5kaWYKI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoJaW50IHBsdF9vZmZzZXQgPSAwLCBwbHRfbmVlZGVkID0gMCwgcGx0X2FsbG9jYXRlOwojZW5kaWYKCXN0cnVjdCBvYmpfc2VjdGlvbiAqcmVsc2VjLCAqc3ltc2VjLCAqc3Ryc2VjOwoJRWxmVyhSZWxNKSAqcmVsLCAqcmVsZW5kOwoJRWxmVyhTeW0pICpzeW10YWIsICpleHRzeW07Cgljb25zdCBjaGFyICpzdHJ0YWIsICpuYW1lOwoJc3RydWN0IGFyY2hfc3ltYm9sICppbnRzeW07CgoJZm9yIChpID0gMDsgaSA8IGYtPmhlYWRlci5lX3NobnVtOyArK2kpIHsKCQlyZWxzZWMgPSBmLT5zZWN0aW9uc1tpXTsKCQlpZiAocmVsc2VjLT5oZWFkZXIuc2hfdHlwZSAhPSBTSFRfUkVMTSkKCQkJY29udGludWU7CgoJCXN5bXNlYyA9IGYtPnNlY3Rpb25zW3JlbHNlYy0+aGVhZGVyLnNoX2xpbmtdOwoJCXN0cnNlYyA9IGYtPnNlY3Rpb25zW3N5bXNlYy0+aGVhZGVyLnNoX2xpbmtdOwoKCQlyZWwgPSAoRWxmVyhSZWxNKSAqKSByZWxzZWMtPmNvbnRlbnRzOwoJCXJlbGVuZCA9IHJlbCArIChyZWxzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoUmVsTSkpKTsKCQlzeW10YWIgPSAoRWxmVyhTeW0pICopIHN5bXNlYy0+Y29udGVudHM7CgkJc3RydGFiID0gKGNvbnN0IGNoYXIgKikgc3Ryc2VjLT5jb250ZW50czsKCgkJZm9yICg7IHJlbCA8IHJlbGVuZDsgKytyZWwpIHsKCQkJZXh0c3ltID0gJnN5bXRhYltFTEZfUl9TWU0ocmVsLT5yX2luZm8pXTsKCiNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKCQkJZ290X2FsbG9jYXRlID0gMDsKI2VuZGlmCiNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKCQkJcGx0X2FsbG9jYXRlID0gMDsKI2VuZGlmCgoJCQlzd2l0Y2ggKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pKSB7CiNpZiBkZWZpbmVkKF9fYXJtX18pCgkJCWNhc2UgUl9BUk1fUEMyNDoKCQkJY2FzZSBSX0FSTV9QTFQzMjoKCQkJCXBsdF9hbGxvY2F0ZSA9IDE7CgkJCQlicmVhazsKCgkJCWNhc2UgUl9BUk1fR09UT0ZGOgoJCQljYXNlIFJfQVJNX0dPVFBDOgoJCQkJZ290X25lZWRlZCA9IDE7CgkJCQljb250aW51ZTsKCgkJCWNhc2UgUl9BUk1fR09UMzI6CgkJCQlnb3RfYWxsb2NhdGUgPSAxOwoJCQkJYnJlYWs7CgojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoJCQljYXNlIFJfMzg2X0dPVFBDOgoJCQljYXNlIFJfMzg2X0dPVE9GRjoKCQkJCWdvdF9uZWVkZWQgPSAxOwoJCQkJY29udGludWU7CgoJCQljYXNlIFJfMzg2X0dPVDMyOgoJCQkJZ290X2FsbG9jYXRlID0gMTsKCQkJCWJyZWFrOwoKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKCQkJY2FzZSBSX1BQQ19SRUwyNDoKCQkJCXBsdF9hbGxvY2F0ZSA9IDE7CgkJCQlicmVhazsKCiNlbGlmIGRlZmluZWQoX19tYzY4MDAwX18pCgkJCWNhc2UgUl82OEtfR09UMzI6CgkJCQlnb3RfYWxsb2NhdGUgPSAxOwoJCQkJYnJlYWs7CgojaWZkZWYgUl82OEtfR09UT0ZGCgkJCWNhc2UgUl82OEtfR09UT0ZGOgoJCQkJZ290X25lZWRlZCA9IDE7CgkJCQljb250aW51ZTsKI2VuZGlmCgojZWxpZiBkZWZpbmVkKF9fc2hfXykKCQkJY2FzZSBSX1NIX0dPVDMyOgoJCQkJZ290X2FsbG9jYXRlID0gMTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBSX1NIX0dPVFBDOgoJCQljYXNlIFJfU0hfR09UT0ZGOgoJCQkJZ290X25lZWRlZCA9IDE7CgkJCQljb250aW51ZTsKCiNlbGlmIGRlZmluZWQgKF9fdjg1MGVfXykKCQkJY2FzZSBSX1Y4NTBfMjJfUENSRUw6CgkJCQlwbHRfbmVlZGVkID0gMTsKCQkJCWJyZWFrOwoKI2VuZGlmCgkJCWRlZmF1bHQ6CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKGV4dHN5bS0+c3RfbmFtZSAhPSAwKSB7CgkJCQluYW1lID0gc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lOwoJCQl9IGVsc2UgewoJCQkJbmFtZSA9IGYtPnNlY3Rpb25zW2V4dHN5bS0+c3Rfc2huZHhdLT5uYW1lOwoJCQl9CgkJCWludHN5bSA9IChzdHJ1Y3QgYXJjaF9zeW1ib2wgKikgb2JqX2ZpbmRfc3ltYm9sKGYsIG5hbWUpOwojaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCgkJCWlmIChnb3RfYWxsb2NhdGUpIHsKCQkJCWdvdF9vZmZzZXQgKz0gYXJjaF9zaW5nbGVfaW5pdCgKCQkJCQkJcmVsLCAmaW50c3ltLT5nb3RlbnQsCgkJCQkJCWdvdF9vZmZzZXQsIEdPVF9FTlRSWV9TSVpFKTsKCgkJCQlnb3RfbmVlZGVkID0gMTsKCQkJfQojZW5kaWYKI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQoJCQlpZiAocGx0X2FsbG9jYXRlKSB7CiNpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKCQkJCXBsdF9vZmZzZXQgKz0gYXJjaF9saXN0X2FkZCgKCQkJCQkJcmVsLCAmaW50c3ltLT5wbHRlbnQsCgkJCQkJCXBsdF9vZmZzZXQsIFBMVF9FTlRSWV9TSVpFKTsKI2Vsc2UKCQkJCXBsdF9vZmZzZXQgKz0gYXJjaF9zaW5nbGVfaW5pdCgKCQkJCQkJcmVsLCAmaW50c3ltLT5wbHRlbnQsCgkJCQkJCXBsdF9vZmZzZXQsIFBMVF9FTlRSWV9TSVpFKTsKI2VuZGlmCgkJCQlwbHRfbmVlZGVkID0gMTsKCQkJfQojZW5kaWYKCQl9Cgl9CgojaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCglpZiAoZ290X25lZWRlZCkgewoJCWlmaWxlLT5nb3QgPSBhcmNoX3hzZWN0X2luaXQoZiwgIi5nb3QiLCBnb3Rfb2Zmc2V0LAoJCQkJR09UX0VOVFJZX1NJWkUpOwoJfQojZW5kaWYKCiNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKCWlmIChwbHRfbmVlZGVkKSB7CgkJaWZpbGUtPnBsdCA9IGFyY2hfeHNlY3RfaW5pdChmLCAiLnBsdCIsIHBsdF9vZmZzZXQsCgkJCQlQTFRfRU5UUllfU0laRSk7Cgl9CiNlbmRpZgoKI2VuZGlmIC8qIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykgKi8KfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qIFN0YW5kYXJkIEVMRiBoYXNoIGZ1bmN0aW9uLiAgKi8Kc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2VsZl9oYXNoX24oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBuKQp7Cgl1bnNpZ25lZCBsb25nIGggPSAwOwoJdW5zaWduZWQgbG9uZyBnOwoJdW5zaWduZWQgY2hhciBjaDsKCgl3aGlsZSAobiA+IDApIHsKCQljaCA9ICpuYW1lKys7CgkJaCA9IChoIDw8IDQpICsgY2g7CgkJaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkgIT0gMCkgewoJCQloIF49IGcgPj4gMjQ7CgkJCWggJj0gfmc7CgkJfQoJCW4tLTsKCX0KCXJldHVybiBoOwp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2goY29uc3QgY2hhciAqbmFtZSkKewoJcmV0dXJuIG9ial9lbGZfaGFzaF9uKG5hbWUsIHN0cmxlbihuYW1lKSk7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwovKiBTdHJpbmcgY29tcGFyaXNvbiBmb3Igbm9uLWNvLXZlcnNpb25lZCBrZXJuZWwgYW5kIG1vZHVsZS4gICovCgpzdGF0aWMgaW50IG5jdl9zdHJjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKewoJc2l6ZV90IGFsZW4gPSBzdHJsZW4oYSksIGJsZW4gPSBzdHJsZW4oYik7CgoJaWYgKGJsZW4gPT0gYWxlbiArIDEwICYmIGJbYWxlbl0gPT0gJ18nICYmIGJbYWxlbiArIDFdID09ICdSJykKCQlyZXR1cm4gc3RybmNtcChhLCBiLCBhbGVuKTsKCWVsc2UgaWYgKGFsZW4gPT0gYmxlbiArIDEwICYmIGFbYmxlbl0gPT0gJ18nICYmIGFbYmxlbiArIDFdID09ICdSJykKCQlyZXR1cm4gc3RybmNtcChhLCBiLCBibGVuKTsKCWVsc2UKCQlyZXR1cm4gc3RyY21wKGEsIGIpOwp9CgovKiBTdHJpbmcgaGFzaGluZyBmb3Igbm9uLWNvLXZlcnNpb25lZCBrZXJuZWwgYW5kIG1vZHVsZS4gIEhlcmUKICAgd2UgYXJlIHNpbXBseSBmb3JjZWQgdG8gZHJvcCB0aGUgY3JjIGZyb20gdGhlIGhhc2guICAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbmN2X3N5bWJvbF9oYXNoKGNvbnN0IGNoYXIgKnN0cikKewoJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOwoJaWYgKGxlbiA+IDEwICYmIHN0cltsZW4gLSAxMF0gPT0gJ18nICYmIHN0cltsZW4gLSA5XSA9PSAnUicpCgkJbGVuIC09IDEwOwoJcmV0dXJuIG9ial9lbGZfaGFzaF9uKHN0ciwgbGVuKTsKfQoKc3RhdGljIHZvaWQKb2JqX3NldF9zeW1ib2xfY29tcGFyZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJICAgaW50ICgqY21wKSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopLAoJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKCpoYXNoKSAoY29uc3QgY2hhciAqKSkKewoJaWYgKGNtcCkKCQlmLT5zeW1ib2xfY21wID0gY21wOwoJaWYgKGhhc2gpIHsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqdG1wdGFiW0hBU0hfQlVDS0VUU10sICpzeW0sICpuZXh0OwoJCWludCBpOwoKCQlmLT5zeW1ib2xfaGFzaCA9IGhhc2g7CgoJCW1lbWNweSh0bXB0YWIsIGYtPnN5bXRhYiwgc2l6ZW9mKHRtcHRhYikpOwoJCW1lbXNldChmLT5zeW10YWIsIDAsIHNpemVvZihmLT5zeW10YWIpKTsKCgkJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKQoJCQlmb3IgKHN5bSA9IHRtcHRhYltpXTsgc3ltOyBzeW0gPSBuZXh0KSB7CgkJCQl1bnNpZ25lZCBsb25nIGggPSBoYXNoKHN5bS0+bmFtZSkgJSBIQVNIX0JVQ0tFVFM7CgkJCQluZXh0ID0gc3ltLT5uZXh0OwoJCQkJc3ltLT5uZXh0ID0gZi0+c3ltdGFiW2hdOwoJCQkJZi0+c3ltdGFiW2hdID0gc3ltOwoJCQl9Cgl9Cn0KCiNlbmRpZiAvKiBGRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgpzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKgpvYmpfYWRkX3N5bWJvbChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCgkJCQl1bnNpZ25lZCBsb25nIHN5bWlkeCwgaW50IGluZm8sCgkJCQlpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIHZhbHVlLAoJCQkJdW5zaWduZWQgbG9uZyBzaXplKQp7CglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJdW5zaWduZWQgbG9uZyBoYXNoID0gZi0+c3ltYm9sX2hhc2gobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CglpbnQgbl90eXBlID0gRUxGX1NUX1RZUEUoaW5mbyk7CglpbnQgbl9iaW5kaW5nID0gRUxGX1NUX0JJTkQoaW5mbyk7CgoJZm9yIChzeW0gPSBmLT5zeW10YWJbaGFzaF07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCWlmIChmLT5zeW1ib2xfY21wKHN5bS0+bmFtZSwgbmFtZSkgPT0gMCkgewoJCQlpbnQgb19zZWNpZHggPSBzeW0tPnNlY2lkeDsKCQkJaW50IG9faW5mbyA9IHN5bS0+aW5mbzsKCQkJaW50IG9fdHlwZSA9IEVMRl9TVF9UWVBFKG9faW5mbyk7CgkJCWludCBvX2JpbmRpbmcgPSBFTEZfU1RfQklORChvX2luZm8pOwoKCQkJLyogQSByZWRlZmluaXRpb24hICBJcyBpdCBsZWdhbD8gICovCgoJCQlpZiAoc2VjaWR4ID09IFNITl9VTkRFRikKCQkJCXJldHVybiBzeW07CgkJCWVsc2UgaWYgKG9fc2VjaWR4ID09IFNITl9VTkRFRikKCQkJCWdvdG8gZm91bmQ7CgkJCWVsc2UgaWYgKG5fYmluZGluZyA9PSBTVEJfR0xPQkFMICYmIG9fYmluZGluZyA9PSBTVEJfTE9DQUwpIHsKCQkJCS8qIENvcGUgd2l0aCBsb2NhbCBhbmQgZ2xvYmFsIHN5bWJvbHMgb2YgdGhlIHNhbWUgbmFtZQoJCQkJICAgaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUsIGFzIG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkCgkJCQkgICBieSBsZCAtci4gIFRoZSBvbmx5IHJlYXNvbiBsb2NhbHMgYXJlIG5vdyBzZWVuIGF0IHRoaXMKCQkJCSAgIGxldmVsIGF0IGFsbCBpcyBzbyB0aGF0IHdlIGNhbiBkbyBzZW1pLXNlbnNpYmxlIHRoaW5ncwoJCQkJICAgd2l0aCBwYXJhbWV0ZXJzLiAgKi8KCgkJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqbnN5bSwgKipwOwoKCQkJCW5zeW0gPSBhcmNoX25ld19zeW1ib2woKTsKCQkJCW5zeW0tPm5leHQgPSBzeW0tPm5leHQ7CgkJCQluc3ltLT5rc3ltaWR4ID0gLTE7CgoJCQkJLyogRXhjaXNlIHRoZSBvbGQgKGxvY2FsKSBzeW1ib2wgZnJvbSB0aGUgaGFzaCBjaGFpbi4gICovCgkJCQlmb3IgKHAgPSAmZi0+c3ltdGFiW2hhc2hdOyAqcCAhPSBzeW07IHAgPSAmKCpwKS0+bmV4dCkKCQkJCQljb250aW51ZTsKCQkJCSpwID0gc3ltID0gbnN5bTsKCQkJCWdvdG8gZm91bmQ7CgkJCX0gZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9MT0NBTCkgewoJCQkJLyogQW5vdGhlciBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuCgkJCQkgICBKdXN0IGFkZCB0aGlzIHRvIHRoZSBsb2NhbCB0YWJsZS4gICovCgkJCQlzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKCQkJCXN5bS0+bmV4dCA9IE5VTEw7CgkJCQlzeW0tPmtzeW1pZHggPSAtMTsKCQkJCWYtPmxvY2FsX3N5bXRhYltzeW1pZHhdID0gc3ltOwoJCQkJZ290byBmb3VuZDsKCQkJfSBlbHNlIGlmIChuX2JpbmRpbmcgPT0gU1RCX1dFQUspCgkJCQlyZXR1cm4gc3ltOwoJCQllbHNlIGlmIChvX2JpbmRpbmcgPT0gU1RCX1dFQUspCgkJCQlnb3RvIGZvdW5kOwoJCQkvKiBEb24ndCB1bmlmeSBDT01NT04gc3ltYm9scyB3aXRoIG9iamVjdCB0eXBlcyB0aGUgcHJvZ3JhbW1lcgoJCQkgICBkb2Vzbid0IGV4cGVjdC4gICovCgkJCWVsc2UgaWYgKHNlY2lkeCA9PSBTSE5fQ09NTU9OCgkJCQkJJiYgKG9fdHlwZSA9PSBTVFRfTk9UWVBFIHx8IG9fdHlwZSA9PSBTVFRfT0JKRUNUKSkKCQkJCXJldHVybiBzeW07CgkJCWVsc2UgaWYgKG9fc2VjaWR4ID09IFNITl9DT01NT04KCQkJCQkmJiAobl90eXBlID09IFNUVF9OT1RZUEUgfHwgbl90eXBlID09IFNUVF9PQkpFQ1QpKQoJCQkJZ290byBmb3VuZDsKCQkJZWxzZSB7CgkJCQkvKiBEb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcyBjb21pbmcgZnJvbQoJCQkJICAgdGhlIGtlcm5lbCBvciBzb21lIGV4dGVybmFsIG1vZHVsZS4gICovCgkJCQlpZiAoc2VjaWR4IDw9IFNITl9ISVJFU0VSVkUpCgkJCQkJYmJfZXJyb3JfbXNnKCIlcyBtdWx0aXBseSBkZWZpbmVkIiwgbmFtZSk7CgkJCQlyZXR1cm4gc3ltOwoJCQl9CgkJfQoKCS8qIENvbXBsZXRlbHkgbmV3IHN5bWJvbC4gICovCglzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKCXN5bS0+bmV4dCA9IGYtPnN5bXRhYltoYXNoXTsKCWYtPnN5bXRhYltoYXNoXSA9IHN5bTsKCXN5bS0+a3N5bWlkeCA9IC0xOwoKCWlmIChFTEZfU1RfQklORChpbmZvKSA9PSBTVEJfTE9DQUwgJiYgc3ltaWR4ICE9IC0xKSB7CgkJaWYgKHN5bWlkeCA+PSBmLT5sb2NhbF9zeW10YWJfc2l6ZSkKCQkJYmJfZXJyb3JfbXNnKCJsb2NhbCBzeW1ib2wgJXMgd2l0aCBpbmRleCAlbGQgZXhjZWVkcyBsb2NhbF9zeW10YWJfc2l6ZSAlbGQiLAoJCQkJCW5hbWUsIChsb25nKSBzeW1pZHgsIChsb25nKSBmLT5sb2NhbF9zeW10YWJfc2l6ZSk7CgkJZWxzZQoJCQlmLT5sb2NhbF9zeW10YWJbc3ltaWR4XSA9IHN5bTsKCX0KCmZvdW5kOgoJc3ltLT5uYW1lID0gbmFtZTsKCXN5bS0+dmFsdWUgPSB2YWx1ZTsKCXN5bS0+c2l6ZSA9IHNpemU7CglzeW0tPnNlY2lkeCA9IHNlY2lkeDsKCXN5bS0+aW5mbyA9IGluZm87CgoJcmV0dXJuIHN5bTsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICoKb2JqX2ZpbmRfc3ltYm9sKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSkKewoJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGYtPnN5bWJvbF9oYXNoKG5hbWUpICUgSEFTSF9CVUNLRVRTOwoKCWZvciAoc3ltID0gZi0+c3ltdGFiW2hhc2hdOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKCQlpZiAoZi0+c3ltYm9sX2NtcChzeW0tPm5hbWUsIG5hbWUpID09IDApCgkJCXJldHVybiBzeW07CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBFbGZXKEFkZHIpIG9ial9zeW1ib2xfZmluYWxfdmFsdWUoc3RydWN0IG9ial9maWxlICogZiwgc3RydWN0IG9ial9zeW1ib2wgKiBzeW0pCnsKCWlmIChzeW0pIHsKCQlpZiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSkKCQkJcmV0dXJuIHN5bS0+dmFsdWU7CgoJCXJldHVybiBzeW0tPnZhbHVlICsgZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdLT5oZWFkZXIuc2hfYWRkcjsKCX0gZWxzZSB7CgkJLyogQXMgYSBzcGVjaWFsIGNhc2UsIGEgTlVMTCBzeW0gaGFzIHZhbHVlIHplcm8uICAqLwoJCXJldHVybiAwOwoJfQp9CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfZmluZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSkKewoJaW50IGksIG4gPSBmLT5oZWFkZXIuZV9zaG51bTsKCglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQoJCWlmIChzdHJjbXAoZi0+c2VjdGlvbnNbaV0tPm5hbWUsIG5hbWUpID09IDApCgkJCXJldHVybiBmLT5zZWN0aW9uc1tpXTsKCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludCBvYmpfbG9hZF9vcmRlcl9wcmlvKHN0cnVjdCBvYmpfc2VjdGlvbiAqYSkKewoJdW5zaWduZWQgbG9uZyBhZiwgYWM7CgoJYWYgPSBhLT5oZWFkZXIuc2hfZmxhZ3M7CgoJYWMgPSAwOwoJaWYgKGEtPm5hbWVbMF0gIT0gJy4nIHx8IHN0cmxlbihhLT5uYW1lKSAhPSAxMCB8fAoJCQlzdHJjbXAoYS0+bmFtZSArIDUsICIuaW5pdCIpKQoJCWFjIHw9IDMyOwoJaWYgKGFmICYgU0hGX0FMTE9DKQoJCWFjIHw9IDE2OwoJaWYgKCEoYWYgJiBTSEZfV1JJVEUpKQoJCWFjIHw9IDg7CglpZiAoYWYgJiBTSEZfRVhFQ0lOU1RSKQoJCWFjIHw9IDQ7CglpZiAoYS0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX05PQklUUykKCQlhYyB8PSAyOwoKCXJldHVybiBhYzsKfQoKc3RhdGljIHZvaWQKb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYykKewoJc3RydWN0IG9ial9zZWN0aW9uICoqcDsKCWludCBwcmlvID0gb2JqX2xvYWRfb3JkZXJfcHJpbyhzZWMpOwoJZm9yIChwID0gZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQ7ICpwOyBwID0gJigqcCktPmxvYWRfbmV4dCkKCQlpZiAob2JqX2xvYWRfb3JkZXJfcHJpbygqcCkgPCBwcmlvKQoJCQlicmVhazsKCXNlYy0+bG9hZF9uZXh0ID0gKnA7CgkqcCA9IHNlYzsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLAoJCQkJY29uc3QgY2hhciAqbmFtZSwKCQkJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCgkJCQl1bnNpZ25lZCBsb25nIHNpemUpCnsKCWludCBuZXdpZHggPSBmLT5oZWFkZXIuZV9zaG51bSsrOwoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJZi0+c2VjdGlvbnMgPSB4cmVhbGxvYyhmLT5zZWN0aW9ucywgKG5ld2lkeCArIDEpICogc2l6ZW9mKHNlYykpOwoJZi0+c2VjdGlvbnNbbmV3aWR4XSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKCgltZW1zZXQoc2VjLCAwLCBzaXplb2YoKnNlYykpOwoJc2VjLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKCXNlYy0+aGVhZGVyLnNoX2ZsYWdzID0gU0hGX1dSSVRFIHwgU0hGX0FMTE9DOwoJc2VjLT5oZWFkZXIuc2hfc2l6ZSA9IHNpemU7CglzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSBhbGlnbjsKCXNlYy0+bmFtZSA9IG5hbWU7CglzZWMtPmlkeCA9IG5ld2lkeDsKCWlmIChzaXplKQoJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNpemUpOwoKCW9ial9pbnNlcnRfc2VjdGlvbl9sb2FkX29yZGVyKGYsIHNlYyk7CgoJcmV0dXJuIHNlYzsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3Qoc3RydWN0IG9ial9maWxlICpmLAoJCQkJY29uc3QgY2hhciAqbmFtZSwKCQkJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCgkJCQl1bnNpZ25lZCBsb25nIHNpemUpCnsKCWludCBuZXdpZHggPSBmLT5oZWFkZXIuZV9zaG51bSsrOwoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJZi0+c2VjdGlvbnMgPSB4cmVhbGxvYyhmLT5zZWN0aW9ucywgKG5ld2lkeCArIDEpICogc2l6ZW9mKHNlYykpOwoJZi0+c2VjdGlvbnNbbmV3aWR4XSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKCgltZW1zZXQoc2VjLCAwLCBzaXplb2YoKnNlYykpOwoJc2VjLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKCXNlYy0+aGVhZGVyLnNoX2ZsYWdzID0gU0hGX1dSSVRFIHwgU0hGX0FMTE9DOwoJc2VjLT5oZWFkZXIuc2hfc2l6ZSA9IHNpemU7CglzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ24gPSBhbGlnbjsKCXNlYy0+bmFtZSA9IG5hbWU7CglzZWMtPmlkeCA9IG5ld2lkeDsKCWlmIChzaXplKQoJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNpemUpOwoKCXNlYy0+bG9hZF9uZXh0ID0gZi0+bG9hZF9vcmRlcjsKCWYtPmxvYWRfb3JkZXIgPSBzZWM7CglpZiAoZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPT0gJmYtPmxvYWRfb3JkZXIpCgkJZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPSAmc2VjLT5sb2FkX25leHQ7CgoJcmV0dXJuIHNlYzsKfQoKc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYywgdW5zaWduZWQgbG9uZyBtb3JlKQp7Cgl1bnNpZ25lZCBsb25nIG9sZHNpemUgPSBzZWMtPmhlYWRlci5zaF9zaXplOwoJaWYgKG1vcmUpIHsKCQlzZWMtPmNvbnRlbnRzID0geHJlYWxsb2Moc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSArPSBtb3JlKTsKCX0KCXJldHVybiBzZWMtPmNvbnRlbnRzICsgb2xkc2l6ZTsKfQoKCi8qIENvbmRpdGlvbmFsbHkgYWRkIHRoZSBzeW1ib2xzIGZyb20gdGhlIGdpdmVuIHN5bWJvbCBzZXQgdG8gdGhlCiAgIG5ldyBtb2R1bGUuICAqLwoKc3RhdGljIGludAphZGRfc3ltYm9sc19mcm9tKCBzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkgaW50IGlkeCwgc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zLCBzaXplX3QgbnN5bXMpCnsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqczsKCXNpemVfdCBpOwoJaW50IHVzZWQgPSAwOwojaWZkZWYgU1lNQk9MX1BSRUZJWAoJY2hhciAqbmFtZV9idWYgPSAwOwoJc2l6ZV90IG5hbWVfYWxsb2NlZF9zaXplID0gMDsKI2VuZGlmCiNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQoJaW50IGdwbDsKCglncGwgPSBvYmpfZ3BsX2xpY2Vuc2UoZiwgTlVMTCkgPT0gMDsKI2VuZGlmCglmb3IgKGkgPSAwLCBzID0gc3ltczsgaSA8IG5zeW1zOyArK2ksICsrcykgewoJCS8qIE9ubHkgYWRkIHN5bWJvbHMgdGhhdCBhcmUgYWxyZWFkeSBtYXJrZWQgZXh0ZXJuYWwuCgkJICAgSWYgd2Ugb3ZlcnJpZGUgbG9jYWxzIHdlIG1heSBjYXVzZSBwcm9ibGVtcyBmb3IKCQkgICBhcmd1bWVudCBpbml0aWFsaXphdGlvbi4gIFdlIHdpbGwgYWxzbyBjcmVhdGUgYSBmYWxzZQoJCSAgIGRlcGVuZGVuY3kgb24gdGhlIG1vZHVsZS4gICovCgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQljaGFyICpuYW1lOwoKCQkvKiBHUEwgbGljZW5zZWQgbW9kdWxlcyBjYW4gdXNlIHN5bWJvbHMgZXhwb3J0ZWQgd2l0aAoJCSAqIEVYUE9SVF9TWU1CT0xfR1BMLCBzbyBpZ25vcmUgYW55IEdQTE9OTFlfIHByZWZpeCBvbiB0aGUKCQkgKiBleHBvcnRlZCBuYW1lcy4gIE5vbi1HUEwgbW9kdWxlcyBuZXZlciBzZWUgYW55IEdQTE9OTFlfCgkJICogc3ltYm9scyBzbyB0aGV5IGNhbm5vdCBmdWRnZSBpdCBieSBhZGRpbmcgdGhlIHByZWZpeCBvbgoJCSAqIHRoZWlyIHJlZmVyZW5jZXMuCgkJICovCgkJaWYgKHN0cm5jbXAoKGNoYXIgKilzLT5uYW1lLCAiR1BMT05MWV8iLCA4KSA9PSAwKSB7CiNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQoJCQlpZiAoZ3BsKQoJCQkJcy0+bmFtZSArPSA4OwoJCQllbHNlCiNlbmRpZgoJCQkJY29udGludWU7CgkJfQoJCW5hbWUgPSAoY2hhciAqKXMtPm5hbWU7CgojaWZkZWYgU1lNQk9MX1BSRUZJWAoJCS8qIFByZXBlbmQgU1lNQk9MX1BSRUZJWCB0byB0aGUgc3ltYm9sJ3MgbmFtZSAodGhlCgkJICAga2VybmVsIGV4cG9ydHMgYEMgbmFtZXMnLCBidXQgbW9kdWxlIG9iamVjdCBmaWxlcwoJCSAgIHJlZmVyZW5jZSBgbGlua2VyIG5hbWVzJykuICAqLwoJCXNpemVfdCBleHRyYSA9IHNpemVvZiBTWU1CT0xfUFJFRklYOwoJCXNpemVfdCBuYW1lX3NpemUgPSBzdHJsZW4gKG5hbWUpICsgZXh0cmE7CgkJaWYgKG5hbWVfc2l6ZSA+IG5hbWVfYWxsb2NlZF9zaXplKSB7CgkJCW5hbWVfYWxsb2NlZF9zaXplID0gbmFtZV9zaXplICogMjsKCQkJbmFtZV9idWYgPSBhbGxvY2EgKG5hbWVfYWxsb2NlZF9zaXplKTsKCQl9CgkJc3RyY3B5IChuYW1lX2J1ZiwgU1lNQk9MX1BSRUZJWCk7CgkJc3RyY3B5IChuYW1lX2J1ZiArIGV4dHJhIC0gMSwgbmFtZSk7CgkJbmFtZSA9IG5hbWVfYnVmOwojZW5kaWYgLyogU1lNQk9MX1BSRUZJWCAqLwoKCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgbmFtZSk7CgkJaWYgKHN5bSAmJiAhKEVMRl9TVF9CSU5EKHN5bS0+aW5mbykgPT0gU1RCX0xPQ0FMKSkgewojaWZkZWYgU1lNQk9MX1BSRUZJWAoJCQkvKiBQdXQgTkFNRV9CVUYgaW50byBtb3JlIHBlcm1hbmVudCBzdG9yYWdlLiAgKi8KCQkJbmFtZSA9IHhtYWxsb2MgKG5hbWVfc2l6ZSk7CgkJCXN0cmNweSAobmFtZSwgbmFtZV9idWYpOwojZW5kaWYKCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsCgkJCQkJRUxGX1NUX0lORk8oU1RCX0dMT0JBTCwKCQkJCQkJU1RUX05PVFlQRSksCgkJCQkJaWR4LCBzLT52YWx1ZSwgMCk7CgkJCS8qIERpZCBvdXIgc3ltYm9sIGp1c3QgZ2V0IGluc3RhbGxlZD8gIElmIHNvLCBtYXJrIHRoZQoJCQkgICBtb2R1bGUgYXMgInVzZWQiLiAgKi8KCQkJaWYgKHN5bS0+c2VjaWR4ID09IGlkeCkKCQkJCXVzZWQgPSAxOwoJCX0KCX0KCglyZXR1cm4gdXNlZDsKfQoKc3RhdGljIHZvaWQgYWRkX2tlcm5lbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IGV4dGVybmFsX21vZHVsZSAqbTsKCWludCBpLCBudXNlZCA9IDA7CgoJLyogQWRkIG1vZHVsZSBzeW1ib2xzIGZpcnN0LiAgKi8KCglmb3IgKGkgPSAwLCBtID0gZXh0X21vZHVsZXM7IGkgPCBuX2V4dF9tb2R1bGVzOyArK2ksICsrbSkKCQlpZiAobS0+bnN5bXMKCQkJCSYmIGFkZF9zeW1ib2xzX2Zyb20oZiwgU0hOX0hJUkVTRVJWRSArIDIgKyBpLCBtLT5zeW1zLAoJCQkJCW0tPm5zeW1zKSkgbS0+dXNlZCA9IDEsICsrbnVzZWQ7CgoJbl9leHRfbW9kdWxlc191c2VkID0gbnVzZWQ7CgoJLyogQW5kIGZpbmFsbHkgdGhlIHN5bWJvbHMgZnJvbSB0aGUga2VybmVsIHByb3Blci4gICovCgoJaWYgKG5rc3ltcykKCQlhZGRfc3ltYm9sc19mcm9tKGYsIFNITl9ISVJFU0VSVkUgKyAxLCBrc3ltcywgbmtzeW1zKTsKfQoKc3RhdGljIGNoYXIgKmdldF9tb2RpbmZvX3ZhbHVlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqa2V5KQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCWNoYXIgKnAsICp2LCAqbiwgKmVwOwoJc2l6ZV90IGtsZW4gPSBzdHJsZW4oa2V5KTsKCglzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIubW9kaW5mbyIpOwoJaWYgKHNlYyA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJcCA9IHNlYy0+Y29udGVudHM7CgllcCA9IHAgKyBzZWMtPmhlYWRlci5zaF9zaXplOwoJd2hpbGUgKHAgPCBlcCkgewoJCXYgPSBzdHJjaHIocCwgJz0nKTsKCQluID0gc3RyY2hyKHAsICdcMCcpOwoJCWlmICh2KSB7CgkJCWlmIChwICsga2xlbiA9PSB2ICYmIHN0cm5jbXAocCwga2V5LCBrbGVuKSA9PSAwKQoJCQkJcmV0dXJuIHYgKyAxOwoJCX0gZWxzZSB7CgkJCWlmIChwICsga2xlbiA9PSBuICYmIHN0cmNtcChwLCBrZXkpID09IDApCgkJCQlyZXR1cm4gbjsKCQl9CgkJcCA9IG4gKyAxOwoJfQoKCXJldHVybiBOVUxMOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogRnVuY3Rpb25zIHJlbGF0aW5nIHRvIG1vZHVsZSBsb2FkaW5nIGFmdGVyIDIuMS4xOC4gICovCgpzdGF0aWMgaW50Cm5ld19wcm9jZXNzX21vZHVsZV9hcmd1bWVudHMoc3RydWN0IG9ial9maWxlICpmLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXdoaWxlIChhcmdjID4gMCkgewoJCWNoYXIgKnAsICpxLCAqa2V5LCAqc3ltX25hbWU7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQljaGFyICpjb250ZW50cywgKmxvYzsKCQlpbnQgbWluLCBtYXgsIG47CgoJCXAgPSAqYXJndjsKCQlpZiAoKHEgPSBzdHJjaHIocCwgJz0nKSkgPT0gTlVMTCkgewoJCQlhcmdjLS07CgkJCWNvbnRpbnVlOwoJCX0KCgkJa2V5ID0gYWxsb2NhKHEgLSBwICsgNik7CgkJbWVtY3B5KGtleSwgInBhcm1fIiwgNSk7CgkJbWVtY3B5KGtleSArIDUsIHAsIHEgLSBwKTsKCQlrZXlbcSAtIHAgKyA1XSA9IDA7CgoJCXAgPSBnZXRfbW9kaW5mb192YWx1ZShmLCBrZXkpOwoJCWtleSArPSA1OwoJCWlmIChwID09IE5VTEwpIHsKCQkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIHBhcmFtZXRlciAlcyIsIGtleSk7CgkJCXJldHVybiAwOwoJCX0KCiNpZmRlZiBTWU1CT0xfUFJFRklYCgkJc3ltX25hbWUgPSBhbGxvY2EgKHN0cmxlbiAoa2V5KSArIHNpemVvZiBTWU1CT0xfUFJFRklYKTsKCQlzdHJjcHkgKHN5bV9uYW1lLCBTWU1CT0xfUFJFRklYKTsKCQlzdHJjYXQgKHN5bV9uYW1lLCBrZXkpOwojZWxzZQoJCXN5bV9uYW1lID0ga2V5OwojZW5kaWYKCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgc3ltX25hbWUpOwoKCQkvKiBBbHNvIGNoZWNrIHRoYXQgdGhlIHBhcmFtZXRlciB3YXMgbm90IHJlc29sdmVkIGZyb20gdGhlIGtlcm5lbC4gICovCgkJaWYgKHN5bSA9PSBOVUxMIHx8IHN5bS0+c2VjaWR4ID4gU0hOX0hJUkVTRVJWRSkgewoJCQliYl9lcnJvcl9tc2coInN5bWJvbCBmb3IgcGFyYW1ldGVyICVzIG5vdCBmb3VuZCIsIGtleSk7CgkJCXJldHVybiAwOwoJCX0KCgkJaWYgKGlzZGlnaXQoKnApKSB7CgkJCW1pbiA9IHN0cnRvdWwocCwgJnAsIDEwKTsKCQkJaWYgKCpwID09ICctJykKCQkJCW1heCA9IHN0cnRvdWwocCArIDEsICZwLCAxMCk7CgkJCWVsc2UKCQkJCW1heCA9IG1pbjsKCQl9IGVsc2UKCQkJbWluID0gbWF4ID0gMTsKCgkJY29udGVudHMgPSBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmNvbnRlbnRzOwoJCWxvYyA9IGNvbnRlbnRzICsgc3ltLT52YWx1ZTsKCQluID0gKCorK3EgIT0gJ1wwJyk7CgoJCXdoaWxlICgxKSB7CgkJCWlmICgoKnAgPT0gJ3MnKSB8fCAoKnAgPT0gJ2MnKSkgewoJCQkJY2hhciAqc3RyOwoKCQkJCS8qIERvIEMgcXVvdGluZyBpZiB3ZSBiZWdpbiB3aXRoIGEgIiwgZWxzZSBzbHVycCB0aGUgbG90LiAgKi8KCQkJCWlmICgqcSA9PSAnIicpIHsKCQkJCQljaGFyICpyOwoKCQkJCQlzdHIgPSBhbGxvY2Eoc3RybGVuKHEpKTsKCQkJCQlmb3IgKHIgPSBzdHIsIHErKzsgKnEgIT0gJyInOyArK3EsICsrcikgewoJCQkJCQlpZiAoKnEgPT0gJ1wwJykgewoJCQkJCQkJYmJfZXJyb3JfbXNnKCJpbXByb3Blcmx5IHRlcm1pbmF0ZWQgc3RyaW5nIGFyZ3VtZW50IGZvciAlcyIsCgkJCQkJCQkJCWtleSk7CgkJCQkJCQlyZXR1cm4gMDsKCQkJCQkJfSBlbHNlIGlmICgqcSA9PSAnXFwnKQoJCQkJCQkJc3dpdGNoICgqKytxKSB7CgkJCQkJCQljYXNlICdhJzoKCQkJCQkJCQkqciA9ICdcYSc7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdiJzoKCQkJCQkJCQkqciA9ICdcYic7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdlJzoKCQkJCQkJCQkqciA9ICdcMDMzJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2YnOgoJCQkJCQkJCSpyID0gJ1xmJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ24nOgoJCQkJCQkJCSpyID0gJ1xuJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3InOgoJCQkJCQkJCSpyID0gJ1xyJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJCSpyID0gJ1x0JzsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICcwJzoKCQkJCQkJCWNhc2UgJzEnOgoJCQkJCQkJY2FzZSAnMic6CgkJCQkJCQljYXNlICczJzoKCQkJCQkJCWNhc2UgJzQnOgoJCQkJCQkJY2FzZSAnNSc6CgkJCQkJCQljYXNlICc2JzoKCQkJCQkJCWNhc2UgJzcnOgoJCQkJCQkJCXsKCQkJCQkJCQkJaW50IGMgPSAqcSAtICcwJzsKCQkJCQkJCQkJaWYgKHFbMV0gPj0gJzAnICYmIHFbMV0gPD0gJzcnKSB7CgkJCQkJCQkJCQljID0gKGMgKiA4KSArICorK3EgLSAnMCc7CgkJCQkJCQkJCQlpZiAocVsxXSA+PSAnMCcgJiYgcVsxXSA8PSAnNycpCgkJCQkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSpyID0gYzsKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkqciA9ICpxOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfSBlbHNlCgkJCQkJCQkJKnIgPSAqcTsKCQkJCQl9CgkJCQkJKnIgPSAnXDAnOwoJCQkJCSsrcTsKCQkJCX0gZWxzZSB7CgkJCQkJY2hhciAqcjsKCgkJCQkJLyogSW4gdGhpcyBjYXNlLCB0aGUgc3RyaW5nIGlzIG5vdCBxdW90ZWQuIFdlIHdpbGwgYnJlYWsKCQkJCQkgICBpdCB1c2luZyB0aGUgY29tYSAobGlrZSBmb3IgaW50cykuIElmIHRoZSB1c2VyIHdhbnRzIHRvCgkJCQkJICAgaW5jbHVkZSBjb21hcyBpbiBhIHN0cmluZywgaGUganVzdCBoYXMgdG8gcXVvdGUgaXQgKi8KCgkJCQkJLyogU2VhcmNoIHRoZSBuZXh0IGNvbWEgKi8KCQkJCQlyID0gc3RyY2hyKHEsICcsJyk7CgoJCQkJCS8qIEZvdW5kID8gKi8KCQkJCQlpZiAociAhPSAoY2hhciAqKSBOVUxMKSB7CgkJCQkJCS8qIFJlY29weSB0aGUgY3VycmVudCBmaWVsZCAqLwoJCQkJCQlzdHIgPSBhbGxvY2EociAtIHEgKyAxKTsKCQkJCQkJbWVtY3B5KHN0ciwgcSwgciAtIHEpOwoKCQkJCQkJLyogSSBkb24ndCBrbm93IGlmIGl0IGlzIHVzZWZ1bCwgYXMgdGhlIHByZXZpb3VzIGNhc2UKCQkJCQkJICAgZG9lc24ndCBudWwgdGVybWluYXRlIHRoZSBzdHJpbmcgPz8/ICovCgkJCQkJCXN0cltyIC0gcV0gPSAnXDAnOwoKCQkJCQkJLyogS2VlcCBuZXh0IGZpZWxkcyAqLwoJCQkJCQlxID0gcjsKCQkJCQl9IGVsc2UgewoJCQkJCQkvKiBsYXN0IHN0cmluZyAqLwoJCQkJCQlzdHIgPSBxOwoJCQkJCQlxID0gIiI7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICgqcCA9PSAncycpIHsKCQkJCQkvKiBOb3JtYWwgc3RyaW5nICovCgkJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzeW0tPnNlY2lkeCwgbG9jIC0gY29udGVudHMsIHN0cik7CgkJCQkJbG9jICs9IHRndF9zaXplb2ZfY2hhcl9wOwoJCQkJfSBlbHNlIHsKCQkJCQkvKiBBcnJheSBvZiBjaGFycyAoaW4gZmFjdCwgbWF0cml4ICEpICovCgkJCQkJdW5zaWduZWQgbG9uZyBjaGFyc3NpemU7CS8qIHNpemUgb2YgZWFjaCBtZW1iZXIgKi8KCgkJCQkJLyogR2V0IHRoZSBzaXplIG9mIGVhY2ggbWVtYmVyICovCgkJCQkJLyogUHJvYmFibHkgd2Ugc2hvdWxkIGRvIHRoYXQgb3V0c2lkZSB0aGUgbG9vcCA/ICovCgkJCQkJaWYgKCFpc2RpZ2l0KCoocCArIDEpKSkgewoJCQkJCQliYl9lcnJvcl9tc2coInBhcmFtZXRlciB0eXBlICdjJyBmb3IgJXMgbXVzdCBiZSBmb2xsb3dlZCBieSIKCQkJCQkJCQkiIHRoZSBtYXhpbXVtIHNpemUiLCBrZXkpOwoJCQkJCQlyZXR1cm4gMDsKCQkJCQl9CgkJCQkJY2hhcnNzaXplID0gc3RydG91bChwICsgMSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKCgkJCQkJLyogQ2hlY2sgbGVuZ3RoICovCgkJCQkJaWYgKHN0cmxlbihzdHIpID49IGNoYXJzc2l6ZSkgewoJCQkJCQliYl9lcnJvcl9tc2coInN0cmluZyB0b28gbG9uZyBmb3IgJXMgKG1heCAlbGQpIiwga2V5LAoJCQkJCQkJCWNoYXJzc2l6ZSAtIDEpOwoJCQkJCQlyZXR1cm4gMDsKCQkJCQl9CgoJCQkJCS8qIENvcHkgdG8gbG9jYXRpb24gKi8KCQkJCQlzdHJjcHkoKGNoYXIgKikgbG9jLCBzdHIpOwoJCQkJCWxvYyArPSBjaGFyc3NpemU7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlsb25nIHYgPSBzdHJ0b3VsKHEsICZxLCAwKTsKCQkJCXN3aXRjaCAoKnApIHsKCQkJCWNhc2UgJ2InOgoJCQkJCSpsb2MrKyA9IHY7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdoJzoKCQkJCQkqKHNob3J0ICopIGxvYyA9IHY7CgkJCQkJbG9jICs9IHRndF9zaXplb2Zfc2hvcnQ7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdpJzoKCQkJCQkqKGludCAqKSBsb2MgPSB2OwoJCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2ludDsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2wnOgoJCQkJCSoobG9uZyAqKSBsb2MgPSB2OwoJCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2xvbmc7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQliYl9lcnJvcl9tc2coInVua25vd24gcGFyYW1ldGVyIHR5cGUgJyVjJyBmb3IgJXMiLCAqcCwga2V5KTsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJfQoKcmV0cnlfZW5kX29mX3ZhbHVlOgoJCQlzd2l0Y2ggKCpxKSB7CgkJCWNhc2UgJ1wwJzoKCQkJCWdvdG8gZW5kX29mX2FyZzsKCgkJCWNhc2UgJyAnOgoJCQljYXNlICdcdCc6CgkJCWNhc2UgJ1xuJzoKCQkJY2FzZSAnXHInOgoJCQkJKytxOwoJCQkJZ290byByZXRyeV9lbmRfb2ZfdmFsdWU7CgoJCQljYXNlICcsJzoKCQkJCWlmICgrK24gPiBtYXgpIHsKCQkJCQliYl9lcnJvcl9tc2coInRvbyBtYW55IHZhbHVlcyBmb3IgJXMgKG1heCAlZCkiLCBrZXksIG1heCk7CgkJCQkJcmV0dXJuIDA7CgkJCQl9CgkJCQkrK3E7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQliYl9lcnJvcl9tc2coImludmFsaWQgYXJndW1lbnQgc3ludGF4IGZvciAlcyIsIGtleSk7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCX0KCmVuZF9vZl9hcmc6CgkJaWYgKG4gPCBtaW4pIHsKCQkJYmJfZXJyb3JfbXNnKCJ0b28gZmV3IHZhbHVlcyBmb3IgJXMgKG1pbiAlZCkiLCBrZXksIG1pbik7CgkJCXJldHVybiAwOwoJCX0KCgkJYXJnYy0tLCBhcmd2Kys7Cgl9CgoJcmV0dXJuIDE7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwpzdGF0aWMgaW50IG5ld19pc19tb2R1bGVfY2hlY2tzdW1tZWQoc3RydWN0IG9ial9maWxlICpmKQp7Cgljb25zdCBjaGFyICpwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwgInVzaW5nX2NoZWNrc3VtcyIpOwoJaWYgKHApCgkJcmV0dXJuIHhhdG9pKHApOwoJZWxzZQoJCXJldHVybiAwOwp9CgovKiBHZXQgdGhlIG1vZHVsZSdzIGtlcm5lbCB2ZXJzaW9uIGluIHRoZSBjYW5vbmljYWwgaW50ZWdlciBmb3JtLiAgKi8KCnN0YXRpYyBpbnQKbmV3X2dldF9tb2R1bGVfdmVyc2lvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgc3RyW1NUUlZFUlNJT05MRU5dKQp7CgljaGFyICpwLCAqcTsKCWludCBhLCBiLCBjOwoKCXAgPSBnZXRfbW9kaW5mb192YWx1ZShmLCAia2VybmVsX3ZlcnNpb24iKTsKCWlmIChwID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJc2FmZV9zdHJuY3B5KHN0ciwgcCwgU1RSVkVSU0lPTkxFTik7CgoJYSA9IHN0cnRvdWwocCwgJnAsIDEwKTsKCWlmICgqcCAhPSAnLicpCgkJcmV0dXJuIC0xOwoJYiA9IHN0cnRvdWwocCArIDEsICZwLCAxMCk7CglpZiAoKnAgIT0gJy4nKQoJCXJldHVybiAtMTsKCWMgPSBzdHJ0b3VsKHAgKyAxLCAmcSwgMTApOwoJaWYgKHAgKyAxID09IHEpCgkJcmV0dXJuIC0xOwoKCXJldHVybiBhIDw8IDE2IHwgYiA8PCA4IHwgYzsKfQoKI2VuZGlmICAgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLwoKCi8qIEZldGNoIHRoZSBsb2FkZWQgbW9kdWxlcywgYW5kIGFsbCBjdXJyZW50bHkgZXhwb3J0ZWQgc3ltYm9scy4gICovCgpzdGF0aWMgaW50IG5ld19nZXRfa2VybmVsX3N5bWJvbHModm9pZCkKewoJY2hhciAqbW9kdWxlX25hbWVzLCAqbW47CglzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICptb2R1bGVzLCAqbTsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqc3ltcywgKnM7CglzaXplX3QgcmV0LCBidWZzaXplLCBubW9kLCBuc3ltcywgaSwgajsKCgkvKiBDb2xsZWN0IHRoZSBsb2FkZWQgbW9kdWxlcy4gICovCgoJbW9kdWxlX25hbWVzID0geG1hbGxvYyhidWZzaXplID0gMjU2KTsKcmV0cnlfbW9kdWxlc19sb2FkOgoJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCBRTV9NT0RVTEVTLCBtb2R1bGVfbmFtZXMsIGJ1ZnNpemUsICZyZXQpKSB7CgkJaWYgKGVycm5vID09IEVOT1NQQyAmJiBidWZzaXplIDwgcmV0KSB7CgkJCW1vZHVsZV9uYW1lcyA9IHhyZWFsbG9jKG1vZHVsZV9uYW1lcywgYnVmc2l6ZSA9IHJldCk7CgkJCWdvdG8gcmV0cnlfbW9kdWxlc19sb2FkOwoJCX0KCQliYl9wZXJyb3JfbXNnKCJRTV9NT0RVTEVTIik7CgkJcmV0dXJuIDA7Cgl9CgoJbl9leHRfbW9kdWxlcyA9IG5tb2QgPSByZXQ7CgoJLyogQ29sbGVjdCB0aGUgbW9kdWxlcycgc3ltYm9scy4gICovCgoJaWYgKG5tb2QpIHsKCQlleHRfbW9kdWxlcyA9IG1vZHVsZXMgPSB4bWFsbG9jKG5tb2QgKiBzaXplb2YoKm1vZHVsZXMpKTsKCQltZW1zZXQobW9kdWxlcywgMCwgbm1vZCAqIHNpemVvZigqbW9kdWxlcykpOwoJCWZvciAoaSA9IDAsIG1uID0gbW9kdWxlX25hbWVzLCBtID0gbW9kdWxlczsKCQkJCWkgPCBubW9kOyArK2ksICsrbSwgbW4gKz0gc3RybGVuKG1uKSArIDEpIHsKCQkJc3RydWN0IG5ld19tb2R1bGVfaW5mbyBpbmZvOwoKCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fSU5GTywgJmluZm8sIHNpemVvZihpbmZvKSwgJnJldCkpIHsKCQkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKCQkJCQkvKiBUaGUgbW9kdWxlIHdhcyByZW1vdmVkIG91dCBmcm9tIHVuZGVybmVhdGggdXMuICAqLwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJYmJfcGVycm9yX21zZygicXVlcnlfbW9kdWxlOiBRTV9JTkZPOiAlcyIsIG1uKTsKCQkJCXJldHVybiAwOwoJCQl9CgoJCQlzeW1zID0geG1hbGxvYyhidWZzaXplID0gMTAyNCk7CnJldHJ5X21vZF9zeW1fbG9hZDoKCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fU1lNQk9MUywgc3ltcywgYnVmc2l6ZSwgJnJldCkpIHsKCQkJCXN3aXRjaCAoZXJybm8pIHsKCQkJCQljYXNlIEVOT1NQQzoKCQkJCQkJc3ltcyA9IHhyZWFsbG9jKHN5bXMsIGJ1ZnNpemUgPSByZXQpOwoJCQkJCQlnb3RvIHJldHJ5X21vZF9zeW1fbG9hZDsKCQkJCQljYXNlIEVOT0VOVDoKCQkJCQkJLyogVGhlIG1vZHVsZSB3YXMgcmVtb3ZlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHVzLiAgKi8KCQkJCQkJY29udGludWU7CgkJCQkJZGVmYXVsdDoKCQkJCQkJYmJfcGVycm9yX21zZygicXVlcnlfbW9kdWxlOiBRTV9TWU1CT0xTOiAlcyIsIG1uKTsKCQkJCQkJcmV0dXJuIDA7CgkJCQl9CgkJCX0KCQkJbnN5bXMgPSByZXQ7CgoJCQltLT5uYW1lID0gbW47CgkJCW0tPmFkZHIgPSBpbmZvLmFkZHI7CgkJCW0tPm5zeW1zID0gbnN5bXM7CgkJCW0tPnN5bXMgPSBzeW1zOwoKCQkJZm9yIChqID0gMCwgcyA9IHN5bXM7IGogPCBuc3ltczsgKytqLCArK3MpIHsKCQkJCXMtPm5hbWUgKz0gKHVuc2lnbmVkIGxvbmcpIHN5bXM7CgkJCX0KCQl9Cgl9CgoJLyogQ29sbGVjdCB0aGUga2VybmVsJ3Mgc3ltYm9scy4gICovCgoJc3ltcyA9IHhtYWxsb2MoYnVmc2l6ZSA9IDE2ICogMTAyNCk7CnJldHJ5X2tlcm5fc3ltX2xvYWQ6CglpZiAocXVlcnlfbW9kdWxlKE5VTEwsIFFNX1NZTUJPTFMsIHN5bXMsIGJ1ZnNpemUsICZyZXQpKSB7CgkJaWYgKGVycm5vID09IEVOT1NQQyAmJiBidWZzaXplIDwgcmV0KSB7CgkJCXN5bXMgPSB4cmVhbGxvYyhzeW1zLCBidWZzaXplID0gcmV0KTsKCQkJZ290byByZXRyeV9rZXJuX3N5bV9sb2FkOwoJCX0KCQliYl9wZXJyb3JfbXNnKCJrZXJuZWw6IFFNX1NZTUJPTFMiKTsKCQlyZXR1cm4gMDsKCX0KCW5rc3ltcyA9IG5zeW1zID0gcmV0OwoJa3N5bXMgPSBzeW1zOwoKCWZvciAoaiA9IDAsIHMgPSBzeW1zOyBqIDwgbnN5bXM7ICsraiwgKytzKSB7CgkJcy0+bmFtZSArPSAodW5zaWduZWQgbG9uZykgc3ltczsKCX0KCXJldHVybiAxOwp9CgoKLyogUmV0dXJuIHRoZSBrZXJuZWwgc3ltYm9sIGNoZWNrc3VtIHZlcnNpb24sIG9yIHplcm8gaWYgbm90IHVzZWQuICAqLwoKc3RhdGljIGludCBuZXdfaXNfa2VybmVsX2NoZWNrc3VtbWVkKHZvaWQpCnsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqczsKCXNpemVfdCBpOwoKCS8qIFVzaW5nX1ZlcnNpb25zIGlzIG5vdCB0aGUgZmlyc3Qgc3ltYm9sLCBidXQgaXQgc2hvdWxkIGJlIGluIHRoZXJlLiAgKi8KCglmb3IgKGkgPSAwLCBzID0ga3N5bXM7IGkgPCBua3N5bXM7ICsraSwgKytzKQoJCWlmIChzdHJjbXAoKGNoYXIgKikgcy0+bmFtZSwgIlVzaW5nX1ZlcnNpb25zIikgPT0gMCkKCQkJcmV0dXJuIHMtPnZhbHVlOwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCBuZXdfY3JlYXRlX3RoaXNfbW9kdWxlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbV9uYW1lKQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCglzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdChmLCAiLnRoaXMiLCB0Z3Rfc2l6ZW9mX2xvbmcsCgkJCXNpemVvZihzdHJ1Y3QgbmV3X21vZHVsZSkpOwoJbWVtc2V0KHNlYy0+Y29udGVudHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV3X21vZHVsZSkpOwoKCW9ial9hZGRfc3ltYm9sKGYsIFNQRlggIl9fdGhpc19tb2R1bGUiLCAtMSwKCQkJRUxGX1NUX0lORk8oU1RCX0xPQ0FMLCBTVFRfT0JKRUNUKSwgc2VjLT5pZHgsIDAsCgkJCXNpemVvZihzdHJ1Y3QgbmV3X21vZHVsZSkpOwoKCW9ial9zdHJpbmdfcGF0Y2goZiwgc2VjLT5pZHgsIG9mZnNldG9mKHN0cnVjdCBuZXdfbW9kdWxlLCBuYW1lKSwKCQkJbV9uYW1lKTsKCglyZXR1cm4gMTsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCi8qIGFkZCBhbiBlbnRyeSB0byB0aGUgX19rc3ltdGFiIHNlY3Rpb24sIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeSAqLwpzdGF0aWMgdm9pZCBuZXdfYWRkX2tzeW10YWIoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCUVsZlcoQWRkcikgb2ZzOwoKCS8qIGVuc3VyZSBfX2tzeW10YWIgaXMgYWxsb2NhdGVkLCBFWFBPUlRfTk9TWU1CT0xTIGNyZWF0ZXMgYSBub24tYWxsb2Mgc2VjdGlvbi4KCSAqIElmIF9fa3N5bXRhYiBpcyBkZWZpbmVkIGJ1dCBub3QgbWFya2VkIGFsbG9jLCB4IG91dCB0aGUgZmlyc3QgY2hhcmFjdGVyCgkgKiAobm8gb2JqX2RlbGV0ZSByb3V0aW5lKSBhbmQgY3JlYXRlIGEgbmV3IF9fa3N5bXRhYiB3aXRoIHRoZSBjb3JyZWN0CgkgKiBjaGFyYWN0ZXJpc3RpY3MuCgkgKi8KCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpOwoJaWYgKHNlYyAmJiAhKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkgewoJCSooKGNoYXIgKikoc2VjLT5uYW1lKSkgPSAneCc7CS8qIG92ZXJyaWRlIGNvbnN0ICovCgkJc2VjID0gTlVMTDsKCX0KCWlmICghc2VjKQoJCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiLAoJCQkJdGd0X3NpemVvZl92b2lkX3AsIDApOwoJaWYgKCFzZWMpCgkJcmV0dXJuOwoJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwoJLyogRW1wdHkgc2VjdGlvbiBtaWdodCBiZSBieXRlLWFsaWduZWQgKi8KCXNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbiA9IHRndF9zaXplb2Zfdm9pZF9wOwoJb2ZzID0gc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcywgc3ltKTsKCW9ial9zdHJpbmdfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcyArIHRndF9zaXplb2Zfdm9pZF9wLCBzeW0tPm5hbWUpOwoJb2JqX2V4dGVuZF9zZWN0aW9uKHNlYywgMiAqIHRndF9zaXplb2ZfY2hhcl9wKTsKfQojZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyAqLwoKc3RhdGljIGludCBuZXdfY3JlYXRlX21vZHVsZV9rc3ltdGFiKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CglpbnQgaTsKCgkvKiBXZSBtdXN0IGFsd2F5cyBhZGQgdGhlIG1vZHVsZSByZWZlcmVuY2VzLiAgKi8KCglpZiAobl9leHRfbW9kdWxlc191c2VkKSB7CgkJc3RydWN0IG5ld19tb2R1bGVfcmVmICpkZXA7CgkJc3RydWN0IG9ial9zeW1ib2wgKnRtOwoKCQlzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiLmttb2R0YWIiLCB0Z3Rfc2l6ZW9mX3ZvaWRfcCwKCQkJCShzaXplb2Yoc3RydWN0IG5ld19tb2R1bGVfcmVmKQoJCQkJICogbl9leHRfbW9kdWxlc191c2VkKSk7CgkJaWYgKCFzZWMpCgkJCXJldHVybiAwOwoKCQl0bSA9IG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJfX3RoaXNfbW9kdWxlIik7CgkJZGVwID0gKHN0cnVjdCBuZXdfbW9kdWxlX3JlZiAqKSBzZWMtPmNvbnRlbnRzOwoJCWZvciAoaSA9IDA7IGkgPCBuX2V4dF9tb2R1bGVzOyArK2kpCgkJCWlmIChleHRfbW9kdWxlc1tpXS51c2VkKSB7CgkJCQlkZXAtPmRlcCA9IGV4dF9tb2R1bGVzW2ldLmFkZHI7CgkJCQlvYmpfc3ltYm9sX3BhdGNoKGYsIHNlYy0+aWR4LAoJCQkJCQkoY2hhciAqKSAmZGVwLT5yZWYgLSBzZWMtPmNvbnRlbnRzLCB0bSk7CgkJCQlkZXAtPm5leHRfcmVmID0gMDsKCQkJCSsrZGVwOwoJCQl9Cgl9CgoJaWYgKCFmbGFnX25vZXhwb3J0ICYmICFvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKSkgewoJCXNpemVfdCBuc3ltczsKCQlpbnQgKmxvYWRlZDsKCgkJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIsIHRndF9zaXplb2Zfdm9pZF9wLCAwKTsKCgkJLyogV2UgZG9uJ3Qgd2FudCB0byBleHBvcnQgc3ltYm9scyByZXNpZGluZyBpbiBzZWN0aW9ucyB0aGF0CgkJICAgYXJlbid0IGxvYWRlZC4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGVzZSBjcmVhdGVkIHNvIHRoYXQKCQkgICB3ZSBtYWtlIHN1cmUgY2VydGFpbiBtb2R1bGUgb3B0aW9ucyBkb24ndCBhcHBlYXIgdHdpY2UuICAqLwoKCQlsb2FkZWQgPSBhbGxvY2Eoc2l6ZW9mKGludCkgKiAoaSA9IGYtPmhlYWRlci5lX3NobnVtKSk7CgkJd2hpbGUgKC0taSA+PSAwKQoJCQlsb2FkZWRbaV0gPSAoZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMDsKCgkJZm9yIChuc3ltcyA9IGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKCQkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQkJaWYgKEVMRl9TVF9CSU5EKHN5bS0+aW5mbykgIT0gU1RCX0xPQ0FMCgkJCQkJCSYmIHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUKCQkJCQkJJiYgKHN5bS0+c2VjaWR4ID49IFNITl9MT1JFU0VSVkUKCQkJCQkJCXx8IGxvYWRlZFtzeW0tPnNlY2lkeF0pKSB7CgkJCQkJRWxmVyhBZGRyKSBvZnMgPSBuc3ltcyAqIDIgKiB0Z3Rfc2l6ZW9mX3ZvaWRfcDsKCgkJCQkJb2JqX3N5bWJvbF9wYXRjaChmLCBzZWMtPmlkeCwgb2ZzLCBzeW0pOwoJCQkJCW9ial9zdHJpbmdfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcyArIHRndF9zaXplb2Zfdm9pZF9wLAoJCQkJCQkJc3ltLT5uYW1lKTsKCgkJCQkJbnN5bXMrKzsKCQkJCX0KCQl9CgoJCW9ial9leHRlbmRfc2VjdGlvbihzZWMsIG5zeW1zICogMiAqIHRndF9zaXplb2ZfY2hhcl9wKTsKCX0KCglyZXR1cm4gMTsKfQoKCnN0YXRpYyBpbnQKbmV3X2luaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm1fbmFtZSwgc3RydWN0IG9ial9maWxlICpmLCB1bnNpZ25lZCBsb25nIG1fc2l6ZSkKewoJc3RydWN0IG5ld19tb2R1bGUgKm1vZHVsZTsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJdm9pZCAqaW1hZ2U7CglpbnQgcmV0OwoJdGd0X2xvbmcgbV9hZGRyOwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50aGlzIik7CglpZiAoIXNlYyB8fCAhc2VjLT5jb250ZW50cykgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdCBtb2R1bGUgJXM/IixtX25hbWUpOwoJfQoJbW9kdWxlID0gKHN0cnVjdCBuZXdfbW9kdWxlICopIHNlYy0+Y29udGVudHM7CgltX2FkZHIgPSBzZWMtPmhlYWRlci5zaF9hZGRyOwoKCW1vZHVsZS0+c2l6ZV9vZl9zdHJ1Y3QgPSBzaXplb2YoKm1vZHVsZSk7Cgltb2R1bGUtPnNpemUgPSBtX3NpemU7Cgltb2R1bGUtPmZsYWdzID0gZmxhZ19hdXRvY2xlYW4gPyBORVdfTU9EX0FVVE9DTEVBTiA6IDA7CgoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiX19rc3ltdGFiIik7CglpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKCQltb2R1bGUtPnN5bXMgPSBzZWMtPmhlYWRlci5zaF9hZGRyOwoJCW1vZHVsZS0+bnN5bXMgPSBzZWMtPmhlYWRlci5zaF9zaXplIC8gKDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7Cgl9CgoJaWYgKG5fZXh0X21vZHVsZXNfdXNlZCkgewoJCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rbW9kdGFiIik7CgkJbW9kdWxlLT5kZXBzID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQltb2R1bGUtPm5kZXBzID0gbl9leHRfbW9kdWxlc191c2VkOwoJfQoKCW1vZHVsZS0+aW5pdCA9CgkJb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiaW5pdF9tb2R1bGUiKSk7Cgltb2R1bGUtPmNsZWFudXAgPQoJCW9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgb2JqX2ZpbmRfc3ltYm9sKGYsIFNQRlggImNsZWFudXBfbW9kdWxlIikpOwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fZXhfdGFibGUiKTsKCWlmIChzZWMpIHsKCQltb2R1bGUtPmV4X3RhYmxlX3N0YXJ0ID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQltb2R1bGUtPmV4X3RhYmxlX2VuZCA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgKyBzZWMtPmhlYWRlci5zaF9zaXplOwoJfQoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50ZXh0LmluaXQiKTsKCWlmIChzZWMpIHsKCQltb2R1bGUtPnJ1bnNpemUgPSBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyOwoJfQoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmRhdGEuaW5pdCIpOwoJaWYgKHNlYykgewoJCWlmICghbW9kdWxlLT5ydW5zaXplIHx8CgkJCQltb2R1bGUtPnJ1bnNpemUgPiBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyKQoJCQltb2R1bGUtPnJ1bnNpemUgPSBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyOwoJfQoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBBUkNIREFUQV9TRUNfTkFNRSk7CglpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKCQltb2R1bGUtPmFyY2hkYXRhX3N0YXJ0ID0gKHZvaWQqKXNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJbW9kdWxlLT5hcmNoZGF0YV9lbmQgPSBtb2R1bGUtPmFyY2hkYXRhX3N0YXJ0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCX0KCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgS0FMTFNZTVNfU0VDX05BTUUpOwoJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CgkJbW9kdWxlLT5rYWxsc3ltc19zdGFydCA9ICh2b2lkKilzZWMtPmhlYWRlci5zaF9hZGRyOwoJCW1vZHVsZS0+a2FsbHN5bXNfZW5kID0gbW9kdWxlLT5rYWxsc3ltc19zdGFydCArIHNlYy0+aGVhZGVyLnNoX3NpemU7Cgl9CgoJLyogV2hldyEgIEFsbCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuICBDb2xsZWN0IHRoZSBmaW5hbAoJICAgbW9kdWxlIGltYWdlIGFuZCBnaXZlIGl0IHRvIHRoZSBrZXJuZWwuICAqLwoKCWltYWdlID0geG1hbGxvYyhtX3NpemUpOwoJb2JqX2NyZWF0ZV9pbWFnZShmLCBpbWFnZSk7CgoJcmV0ID0gaW5pdF9tb2R1bGUobV9uYW1lLCAoc3RydWN0IG5ld19tb2R1bGUgKikgaW1hZ2UpOwoJaWYgKHJldCkKCQliYl9wZXJyb3JfbXNnKCJpbml0X21vZHVsZTogJXMiLCBtX25hbWUpOwoKCWZyZWUoaW1hZ2UpOwoKCXJldHVybiByZXQgPT0gMDsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgaW50Cm9ial9zdHJpbmdfcGF0Y2goc3RydWN0IG9ial9maWxlICpmLCBpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIG9mZnNldCwKCQkJCSBjb25zdCBjaGFyICpzdHJpbmcpCnsKCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpwOwoJc3RydWN0IG9ial9zZWN0aW9uICpzdHJzZWM7CglzaXplX3QgbGVuID0gc3RybGVuKHN0cmluZykgKyAxOwoJY2hhciAqbG9jOwoKCXAgPSB4bWFsbG9jKHNpemVvZigqcCkpOwoJcC0+bmV4dCA9IGYtPnN0cmluZ19wYXRjaGVzOwoJcC0+cmVsb2Nfc2VjaWR4ID0gc2VjaWR4OwoJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OwoJZi0+c3RyaW5nX3BhdGNoZXMgPSBwOwoKCXN0cnNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rc3RydGFiIik7CglpZiAoc3Ryc2VjID09IE5VTEwpIHsKCQlzdHJzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiLCAxLCBsZW4pOwoJCXAtPnN0cmluZ19vZmZzZXQgPSAwOwoJCWxvYyA9IHN0cnNlYy0+Y29udGVudHM7Cgl9IGVsc2UgewoJCXAtPnN0cmluZ19vZmZzZXQgPSBzdHJzZWMtPmhlYWRlci5zaF9zaXplOwoJCWxvYyA9IG9ial9leHRlbmRfc2VjdGlvbihzdHJzZWMsIGxlbik7Cgl9CgltZW1jcHkobG9jLCBzdHJpbmcsIGxlbik7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKb2JqX3N5bWJvbF9wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAoJCQkJIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pCnsKCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOwoKCXAgPSB4bWFsbG9jKHNpemVvZigqcCkpOwoJcC0+bmV4dCA9IGYtPnN5bWJvbF9wYXRjaGVzOwoJcC0+cmVsb2Nfc2VjaWR4ID0gc2VjaWR4OwoJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OwoJcC0+c3ltID0gc3ltOwoJZi0+c3ltYm9sX3BhdGNoZXMgPSBwOwoKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IG9ial9jaGVja191bmRlZmluZWRzKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJdW5zaWduZWQgbG9uZyBpOwoJaW50IHJldCA9IDE7CgoJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fVU5ERUYpIHsKCQkJCWlmIChFTEZfU1RfQklORChzeW0tPmluZm8pID09IFNUQl9XRUFLKSB7CgkJCQkJc3ltLT5zZWNpZHggPSBTSE5fQUJTOwoJCQkJCXN5bS0+dmFsdWUgPSAwOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIWZsYWdfcXVpZXQpIHsKCQkJCQkJYmJfZXJyb3JfbXNnKCJ1bnJlc29sdmVkIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CgkJCQkJfQoJCQkJCXJldCA9IDA7CgkJCQl9CgkJCX0KCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBvYmpfYWxsb2NhdGVfY29tbW9ucyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCnsKCXN0cnVjdCBjb21tb25fZW50cnkgewoJCXN0cnVjdCBjb21tb25fZW50cnkgKm5leHQ7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCX0gKmNvbW1vbl9oZWFkID0gTlVMTDsKCgl1bnNpZ25lZCBsb25nIGk7CgoJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fQ09NTU9OKSB7CgkJCQkvKiBDb2xsZWN0IGFsbCBDT01NT04gc3ltYm9scyBhbmQgc29ydCB0aGVtIGJ5IHNpemUgc28gYXMgdG8KCQkJCSAgIG1pbmltaXplIHNwYWNlIHdhc3RlZCBieSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLiAgKi8KCQkJCXsKCQkJCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICoqcCwgKm47CgkJCQkJZm9yIChwID0gJmNvbW1vbl9oZWFkOyAqcDsgcCA9ICYoKnApLT5uZXh0KQoJCQkJCQlpZiAoc3ltLT5zaXplIDw9ICgqcCktPnN5bS0+c2l6ZSkKCQkJCQkJCWJyZWFrOwoKCQkJCQluID0gYWxsb2NhKHNpemVvZigqbikpOwoJCQkJCW4tPm5leHQgPSAqcDsKCQkJCQluLT5zeW0gPSBzeW07CgkJCQkJKnAgPSBuOwoJCQkJfQoJCQl9Cgl9CgoJZm9yIChpID0gMTsgaSA8IGYtPmxvY2FsX3N5bXRhYl9zaXplOyArK2kpIHsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltID0gZi0+bG9jYWxfc3ltdGFiW2ldOwoJCWlmIChzeW0gJiYgc3ltLT5zZWNpZHggPT0gU0hOX0NPTU1PTikgewoJCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICoqcCwgKm47CgkJCWZvciAocCA9ICZjb21tb25faGVhZDsgKnA7IHAgPSAmKCpwKS0+bmV4dCkKCQkJCWlmIChzeW0gPT0gKCpwKS0+c3ltKQoJCQkJCWJyZWFrOwoJCQkJZWxzZSBpZiAoc3ltLT5zaXplIDwgKCpwKS0+c3ltLT5zaXplKSB7CgkJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKCQkJCQluLT5uZXh0ID0gKnA7CgkJCQkJbi0+c3ltID0gc3ltOwoJCQkJCSpwID0gbjsKCQkJCQlicmVhazsKCQkJCX0KCQl9Cgl9CgoJaWYgKGNvbW1vbl9oZWFkKSB7CgkJLyogRmluZCB0aGUgYnNzIHNlY3Rpb24uICAqLwoJCWZvciAoaSA9IDA7IGkgPCBmLT5oZWFkZXIuZV9zaG51bTsgKytpKQoJCQlpZiAoZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF90eXBlID09IFNIVF9OT0JJVFMpCgkJCQlicmVhazsKCgkJLyogSWYgZm9yIHNvbWUgcmVhc29uIHRoZXJlIGhhZG4ndCBiZWVuIG9uZSwgY3JlYXRlIG9uZS4gICovCgkJaWYgKGkgPT0gZi0+aGVhZGVyLmVfc2hudW0pIHsKCQkJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJCQlmLT5zZWN0aW9ucyA9IHhyZWFsbG9jKGYtPnNlY3Rpb25zLCAoaSArIDEpICogc2l6ZW9mKHNlYykpOwoJCQlmLT5zZWN0aW9uc1tpXSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKCQkJZi0+aGVhZGVyLmVfc2hudW0gPSBpICsgMTsKCgkJCW1lbXNldChzZWMsIDAsIHNpemVvZigqc2VjKSk7CgkJCXNlYy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CgkJCXNlYy0+aGVhZGVyLnNoX2ZsYWdzID0gU0hGX1dSSVRFIHwgU0hGX0FMTE9DOwoJCQlzZWMtPm5hbWUgPSAiLmJzcyI7CgkJCXNlYy0+aWR4ID0gaTsKCQl9CgoJCS8qIEFsbG9jYXRlIHRoZSBDT01NT05TLiAgKi8KCQl7CgkJCUVsZlcoQWRkcikgYnNzX3NpemUgPSBmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX3NpemU7CgkJCUVsZlcoQWRkcikgbWF4X2FsaWduID0gZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyYWxpZ247CgkJCXN0cnVjdCBjb21tb25fZW50cnkgKmM7CgoJCQlmb3IgKGMgPSBjb21tb25faGVhZDsgYzsgYyA9IGMtPm5leHQpIHsKCQkJCUVsZlcoQWRkcikgYWxpZ24gPSBjLT5zeW0tPnZhbHVlOwoKCQkJCWlmIChhbGlnbiA+IG1heF9hbGlnbikKCQkJCQltYXhfYWxpZ24gPSBhbGlnbjsKCQkJCWlmIChic3Nfc2l6ZSAmIChhbGlnbiAtIDEpKQoJCQkJCWJzc19zaXplID0gKGJzc19zaXplIHwgKGFsaWduIC0gMSkpICsgMTsKCgkJCQljLT5zeW0tPnNlY2lkeCA9IGk7CgkJCQljLT5zeW0tPnZhbHVlID0gYnNzX3NpemU7CgoJCQkJYnNzX3NpemUgKz0gYy0+c3ltLT5zaXplOwoJCQl9CgoJCQlmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX3NpemUgPSBic3Nfc2l6ZTsKCQkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyYWxpZ24gPSBtYXhfYWxpZ247CgkJfQoJfQoKCS8qIEZvciB0aGUgc2FrZSBvZiBwYXRjaCByZWxvY2F0aW9uIGFuZCBwYXJhbWV0ZXIgaW5pdGlhbGl6YXRpb24sCgkgICBhbGxvY2F0ZSB6ZXJvZWQgZGF0YSBmb3IgTk9CSVRTIHNlY3Rpb25zIG5vdy4gIE5vdGUgdGhhdCBhZnRlcgoJICAgdGhpcyB3ZSBjYW5ub3QgYXNzdW1lIE5PQklUUyBhcmUgcmVhbGx5IGVtcHR5LiAgKi8KCWZvciAoaSA9IDA7IGkgPCBmLT5oZWFkZXIuZV9zaG51bTsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpzID0gZi0+c2VjdGlvbnNbaV07CgkJaWYgKHMtPmhlYWRlci5zaF90eXBlID09IFNIVF9OT0JJVFMpIHsKCQkJaWYgKHMtPmhlYWRlci5zaF9zaXplICE9IDApCgkJCQlzLT5jb250ZW50cyA9IG1lbXNldCh4bWFsbG9jKHMtPmhlYWRlci5zaF9zaXplKSwKCQkJCQkJMCwgcy0+aGVhZGVyLnNoX3NpemUpOwoJCQllbHNlCgkJCQlzLT5jb250ZW50cyA9IE5VTEw7CgoJCQlzLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKCQl9Cgl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9sb2FkX3NpemUoc3RydWN0IG9ial9maWxlICpmKQp7Cgl1bnNpZ25lZCBsb25nIGRvdCA9IDA7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCgkvKiBGaW5hbGl6ZSB0aGUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyByZWxhdGl2ZSB0byBvbmUgYW5vdGhlci4gICovCgoJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CgkJRWxmVyhBZGRyKSBhbGlnbjsKCgkJYWxpZ24gPSBzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ247CgkJaWYgKGFsaWduICYmIChkb3QgJiAoYWxpZ24gLSAxKSkpCgkJCWRvdCA9IChkb3QgfCAoYWxpZ24gLSAxKSkgKyAxOwoKCQlzZWMtPmhlYWRlci5zaF9hZGRyID0gZG90OwoJCWRvdCArPSBzZWMtPmhlYWRlci5zaF9zaXplOwoJfQoKCXJldHVybiBkb3Q7Cn0KCnN0YXRpYyBpbnQgb2JqX3JlbG9jYXRlKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKQp7CglpbnQgaSwgbiA9IGYtPmhlYWRlci5lX3NobnVtOwoJaW50IHJldCA9IDE7CgoJLyogRmluYWxpemUgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMuICAqLwoKCWYtPmJhc2VhZGRyID0gYmFzZTsKCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCgkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyICs9IGJhc2U7CgoJLyogQW5kIGl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIHJlbG9jYXRpb25zLiAgKi8KCglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpyZWxzZWMsICpzeW1zZWMsICp0YXJnc2VjLCAqc3Ryc2VjOwoJCUVsZlcoUmVsTSkgKiByZWwsICpyZWxlbmQ7CgkJRWxmVyhTeW0pICogc3ltdGFiOwoJCWNvbnN0IGNoYXIgKnN0cnRhYjsKCgkJcmVsc2VjID0gZi0+c2VjdGlvbnNbaV07CgkJaWYgKHJlbHNlYy0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX1JFTE0pCgkJCWNvbnRpbnVlOwoKCQlzeW1zZWMgPSBmLT5zZWN0aW9uc1tyZWxzZWMtPmhlYWRlci5zaF9saW5rXTsKCQl0YXJnc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfaW5mb107CgkJc3Ryc2VjID0gZi0+c2VjdGlvbnNbc3ltc2VjLT5oZWFkZXIuc2hfbGlua107CgoJCXJlbCA9IChFbGZXKFJlbE0pICopIHJlbHNlYy0+Y29udGVudHM7CgkJcmVsZW5kID0gcmVsICsgKHJlbHNlYy0+aGVhZGVyLnNoX3NpemUgLyBzaXplb2YoRWxmVyhSZWxNKSkpOwoJCXN5bXRhYiA9IChFbGZXKFN5bSkgKikgc3ltc2VjLT5jb250ZW50czsKCQlzdHJ0YWIgPSAoY29uc3QgY2hhciAqKSBzdHJzZWMtPmNvbnRlbnRzOwoKCQlmb3IgKDsgcmVsIDwgcmVsZW5kOyArK3JlbCkgewoJCQlFbGZXKEFkZHIpIHZhbHVlID0gMDsKCQkJc3RydWN0IG9ial9zeW1ib2wgKmludHN5bSA9IE5VTEw7CgkJCXVuc2lnbmVkIGxvbmcgc3ltbmR4OwoJCQlFbGZXKFN5bSkgKiBleHRzeW0gPSAwOwoJCQljb25zdCBjaGFyICplcnJtc2c7CgoJCQkvKiBBdHRlbXB0IHRvIGZpbmQgYSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgcmVsb2NhdGlvbi4gICovCgoJCQlzeW1uZHggPSBFTEZfUl9TWU0ocmVsLT5yX2luZm8pOwoJCQlpZiAoc3ltbmR4KSB7CgkJCQkvKiBOb3RlIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwoKCQkJCWV4dHN5bSA9ICZzeW10YWJbc3ltbmR4XTsKCQkJCWlmIChFTEZfU1RfQklORChleHRzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCkgewoJCQkJCS8qIExvY2FsIHN5bWJvbHMgd2UgbG9vayB1cCBpbiB0aGUgbG9jYWwgdGFibGUgdG8gYmUgc3VyZQoJCQkJCSAgIHdlIGdldCB0aGUgb25lIHRoYXQgaXMgcmVhbGx5IGludGVuZGVkLiAgKi8KCQkJCQlpbnRzeW0gPSBmLT5sb2NhbF9zeW10YWJbc3ltbmR4XTsKCQkJCX0gZWxzZSB7CgkJCQkJLyogT3RoZXJzIHdlIGxvb2sgdXAgaW4gdGhlIGhhc2ggdGFibGUuICAqLwoJCQkJCWNvbnN0IGNoYXIgKm5hbWU7CgkJCQkJaWYgKGV4dHN5bS0+c3RfbmFtZSkKCQkJCQkJbmFtZSA9IHN0cnRhYiArIGV4dHN5bS0+c3RfbmFtZTsKCQkJCQllbHNlCgkJCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tleHRzeW0tPnN0X3NobmR4XS0+bmFtZTsKCQkJCQlpbnRzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgbmFtZSk7CgkJCQl9CgoJCQkJdmFsdWUgPSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIGludHN5bSk7CgkJCQlpbnRzeW0tPnJlZmVyZW5jZWQgPSAxOwoJCQl9CiNpZiBTSFRfUkVMTSA9PSBTSFRfUkVMQQojaWYgZGVmaW5lZChfX2FscGhhX18pICYmIGRlZmluZWQoQVhQX0JST0tFTl9HQVMpCgkJCS8qIFdvcmsgYXJvdW5kIGEgbmFzdHkgR0FTIGJ1ZywgdGhhdCBpcyBmaXhlZCBhcyBvZiAyLjcuMC45LiAgKi8KCQkJaWYgKCFleHRzeW0gfHwgIWV4dHN5bS0+c3RfbmFtZSB8fAoJCQkJCUVMRl9TVF9CSU5EKGV4dHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQojZW5kaWYKCQkJCXZhbHVlICs9IHJlbC0+cl9hZGRlbmQ7CiNlbmRpZgoKCQkJLyogRG8gaXQhICovCgkJCXN3aXRjaCAoYXJjaF9hcHBseV9yZWxvY2F0aW9uCgkJCQkJKGYsIHRhcmdzZWMsIHN5bXNlYywgaW50c3ltLCByZWwsIHZhbHVlKQoJCQkpIHsKCQkJY2FzZSBvYmpfcmVsb2Nfb2s6CgkJCQlicmVhazsKCgkJCWNhc2Ugb2JqX3JlbG9jX292ZXJmbG93OgoJCQkJZXJybXNnID0gIlJlbG9jYXRpb24gb3ZlcmZsb3ciOwoJCQkJZ290byBiYWRfcmVsb2M7CgkJCWNhc2Ugb2JqX3JlbG9jX2Rhbmdlcm91czoKCQkJCWVycm1zZyA9ICJEYW5nZXJvdXMgcmVsb2NhdGlvbiI7CgkJCQlnb3RvIGJhZF9yZWxvYzsKCQkJY2FzZSBvYmpfcmVsb2NfdW5oYW5kbGVkOgoJCQkJZXJybXNnID0gIlVuaGFuZGxlZCByZWxvY2F0aW9uIjsKYmFkX3JlbG9jOgoJCQkJaWYgKGV4dHN5bSkgewoJCQkJCWJiX2Vycm9yX21zZygiJXMgb2YgdHlwZSAlbGQgZm9yICVzIiwgZXJybXNnLAoJCQkJCQkJKGxvbmcpIEVMRl9SX1RZUEUocmVsLT5yX2luZm8pLAoJCQkJCQkJc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lKTsKCQkJCX0gZWxzZSB7CgkJCQkJYmJfZXJyb3JfbXNnKCIlcyBvZiB0eXBlICVsZCIsIGVycm1zZywKCQkJCQkJCShsb25nKSBFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CgkJCQl9CgkJCQlyZXQgPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJLyogRmluYWxseSwgdGFrZSBjYXJlIG9mIHRoZSBwYXRjaGVzLiAgKi8KCglpZiAoZi0+c3RyaW5nX3BhdGNoZXMpIHsKCQlzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCAqcDsKCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKCQlFbGZXKEFkZHIpIHN0cnNlY19iYXNlOwoJCXN0cnNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rc3RydGFiIik7CgkJc3Ryc2VjX2Jhc2UgPSBzdHJzZWMtPmhlYWRlci5zaF9hZGRyOwoKCQlmb3IgKHAgPSBmLT5zdHJpbmdfcGF0Y2hlczsgcDsgcCA9IHAtPm5leHQpIHsKCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjID0gZi0+c2VjdGlvbnNbcC0+cmVsb2Nfc2VjaWR4XTsKCQkJKihFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHAtPnJlbG9jX29mZnNldCkKCQkJCT0gc3Ryc2VjX2Jhc2UgKyBwLT5zdHJpbmdfb2Zmc2V0OwoJCX0KCX0KCglpZiAoZi0+c3ltYm9sX3BhdGNoZXMpIHsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqcDsKCgkJZm9yIChwID0gZi0+c3ltYm9sX3BhdGNoZXM7IHA7IHAgPSBwLT5uZXh0KSB7CgkJCXN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYyA9IGYtPnNlY3Rpb25zW3AtPnJlbG9jX3NlY2lkeF07CgkJCSooRWxmVyhBZGRyKSAqKSAodGFyZ3NlYy0+Y29udGVudHMgKyBwLT5yZWxvY19vZmZzZXQpCgkJCQk9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgcC0+c3ltKTsKCQl9Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBvYmpfY3JlYXRlX2ltYWdlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqaW1hZ2UpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJRWxmVyhBZGRyKSBiYXNlID0gZi0+YmFzZWFkZHI7CgoJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CgkJY2hhciAqc2VjaW1nOwoKCQlpZiAoc2VjLT5jb250ZW50cyA9PSAwIHx8IHNlYy0+aGVhZGVyLnNoX3NpemUgPT0gMCkKCQkJY29udGludWU7CgoJCXNlY2ltZyA9IGltYWdlICsgKHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBiYXNlKTsKCgkJLyogTm90ZSB0aGF0IHdlIGFsbG9jYXRlZCBkYXRhIGZvciBOT0JJVFMgc2VjdGlvbnMgZWFybGllci4gICovCgkJbWVtY3B5KHNlY2ltZywgc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSk7Cgl9CgoJcmV0dXJuIDE7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgc3RydWN0IG9ial9maWxlICpvYmpfbG9hZChGSUxFICogZnAsIGludCBsb2FkcHJvZ2JpdHMpCnsKCXN0cnVjdCBvYmpfZmlsZSAqZjsKCUVsZlcoU2hkcikgKiBzZWN0aW9uX2hlYWRlcnM7CglpbnQgc2hudW0sIGk7CgljaGFyICpzaHN0cnRhYjsKCgkvKiBSZWFkIHRoZSBmaWxlIGhlYWRlci4gICovCgoJZiA9IGFyY2hfbmV3X2ZpbGUoKTsKCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKCWYtPnN5bWJvbF9jbXAgPSBzdHJjbXA7CglmLT5zeW1ib2xfaGFzaCA9IG9ial9lbGZfaGFzaDsKCWYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0ID0gJmYtPmxvYWRfb3JkZXI7CgoJZnNlZWsoZnAsIDAsIFNFRUtfU0VUKTsKCWlmIChmcmVhZCgmZi0+aGVhZGVyLCBzaXplb2YoZi0+aGVhZGVyKSwgMSwgZnApICE9IDEpIHsKCQliYl9wZXJyb3JfbXNnKCJlcnJvciByZWFkaW5nIEVMRiBoZWFkZXIiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglpZiAoZi0+aGVhZGVyLmVfaWRlbnRbRUlfTUFHMF0gIT0gRUxGTUFHMAoJCQl8fCBmLT5oZWFkZXIuZV9pZGVudFtFSV9NQUcxXSAhPSBFTEZNQUcxCgkJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX01BRzJdICE9IEVMRk1BRzIKCQkJfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfTUFHM10gIT0gRUxGTUFHMykgewoJCWJiX2Vycm9yX21zZygibm90IGFuIEVMRiBmaWxlIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglpZiAoZi0+aGVhZGVyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTTQoJCQl8fCBmLT5oZWFkZXIuZV9pZGVudFtFSV9EQVRBXSAhPSAoQkJfQklHX0VORElBTgoJCQkJPyBFTEZEQVRBMk1TQiA6IEVMRkRBVEEyTFNCKQoJCQl8fCBmLT5oZWFkZXIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UCgkJCXx8ICFNQVRDSF9NQUNISU5FKGYtPmhlYWRlci5lX21hY2hpbmUpKSB7CgkJYmJfZXJyb3JfbXNnKCJFTEYgZmlsZSBub3QgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglpZiAoZi0+aGVhZGVyLmVfdHlwZSAhPSBFVF9SRUwpIHsKCQliYl9lcnJvcl9tc2coIkVMRiBmaWxlIG5vdCBhIHJlbG9jYXRhYmxlIG9iamVjdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIFJlYWQgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCgoJaWYgKGYtPmhlYWRlci5lX3NoZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhTaGRyKSkpIHsKCQliYl9lcnJvcl9tc2coInNlY3Rpb24gaGVhZGVyIHNpemUgbWlzbWF0Y2g6ICVsdSAhPSAlbHUiLAoJCQkJKHVuc2lnbmVkIGxvbmcpIGYtPmhlYWRlci5lX3NoZW50c2l6ZSwKCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoRWxmVyhTaGRyKSkpOwoJCXJldHVybiBOVUxMOwoJfQoKCXNobnVtID0gZi0+aGVhZGVyLmVfc2hudW07CglmLT5zZWN0aW9ucyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfc2VjdGlvbiAqKSAqIHNobnVtKTsKCW1lbXNldChmLT5zZWN0aW9ucywgMCwgc2l6ZW9mKHN0cnVjdCBvYmpfc2VjdGlvbiAqKSAqIHNobnVtKTsKCglzZWN0aW9uX2hlYWRlcnMgPSBhbGxvY2Eoc2l6ZW9mKEVsZlcoU2hkcikpICogc2hudW0pOwoJZnNlZWsoZnAsIGYtPmhlYWRlci5lX3Nob2ZmLCBTRUVLX1NFVCk7CglpZiAoZnJlYWQoc2VjdGlvbl9oZWFkZXJzLCBzaXplb2YoRWxmVyhTaGRyKSksIHNobnVtLCBmcCkgIT0gc2hudW0pIHsKCQliYl9wZXJyb3JfbXNnKCJlcnJvciByZWFkaW5nIEVMRiBzZWN0aW9uIGhlYWRlcnMiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKiBSZWFkIHRoZSBzZWN0aW9uIGRhdGEuICAqLwoKCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJCWYtPnNlY3Rpb25zW2ldID0gc2VjID0gYXJjaF9uZXdfc2VjdGlvbigpOwoJCW1lbXNldChzZWMsIDAsIHNpemVvZigqc2VjKSk7CgoJCXNlYy0+aGVhZGVyID0gc2VjdGlvbl9oZWFkZXJzW2ldOwoJCXNlYy0+aWR4ID0gaTsKCgkJaWYoc2VjLT5oZWFkZXIuc2hfc2l6ZSkgewoJCQlzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKCQkJY2FzZSBTSFRfTlVMTDoKCQkJY2FzZSBTSFRfTk9URToKCQkJY2FzZSBTSFRfTk9CSVRTOgoJCQkJLyogaWdub3JlICovCgkJCQlicmVhazsKCgkJCWNhc2UgU0hUX1BST0dCSVRTOgojaWYgTE9BREJJVFMKCQkJCWlmICghbG9hZHByb2diaXRzKSB7CgkJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CgkJCQkJYnJlYWs7CgkJCQl9CiNlbmRpZgoJCQljYXNlIFNIVF9TWU1UQUI6CgkJCWNhc2UgU0hUX1NUUlRBQjoKCQkJY2FzZSBTSFRfUkVMTToKCQkJCWlmIChzZWMtPmhlYWRlci5zaF9zaXplID4gMCkgewoJCQkJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNlYy0+aGVhZGVyLnNoX3NpemUpOwoJCQkJCWZzZWVrKGZwLCBzZWMtPmhlYWRlci5zaF9vZmZzZXQsIFNFRUtfU0VUKTsKCQkJCQlpZiAoZnJlYWQoc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSwgMSwgZnApICE9IDEpIHsKCQkJCQkJYmJfcGVycm9yX21zZygiZXJyb3IgcmVhZGluZyBFTEYgc2VjdGlvbiBkYXRhIik7CgkJCQkJCXJldHVybiBOVUxMOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CgkJCQl9CgkJCQlicmVhazsKCiNpZiBTSFRfUkVMTSA9PSBTSFRfUkVMCgkJCWNhc2UgU0hUX1JFTEE6CgkJCQliYl9lcnJvcl9tc2coIlJFTEEgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSIpOwoJCQkJcmV0dXJuIE5VTEw7CiNlbHNlCgkJCWNhc2UgU0hUX1JFTDoKCQkJCWJiX2Vycm9yX21zZygiUkVMIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUiKTsKCQkJCXJldHVybiBOVUxMOwojZW5kaWYKCgkJCWRlZmF1bHQ6CgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfdHlwZSA+PSBTSFRfTE9QUk9DKSB7CgkJCQkJLyogQXNzdW1lIHByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIHR5cGVzIGFyZSBkZWJ1ZwoJCQkJCSAgIGluZm8gYW5kIGNhbiBzYWZlbHkgYmUgaWdub3JlZC4gIElmIHRoaXMgaXMgZXZlciBub3QKCQkJCQkgICB0aGUgY2FzZSAoSGVsbG8gTUlQUz8pLCBkb24ndCBwdXQgaWZkZWZzIGhlcmUgYnV0CgkJCQkJICAgY3JlYXRlIGFuIGFyY2hfbG9hZF9wcm9jX3NlY3Rpb24oKS4gICovCgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBoYW5kbGUgc2VjdGlvbnMgb2YgdHlwZSAlbGQiLAoJCQkJCQkobG9uZykgc2VjLT5oZWFkZXIuc2hfdHlwZSk7CgkJCQlyZXR1cm4gTlVMTDsKCQkJfQoJCX0KCX0KCgkvKiBEbyB3aGF0IHNvcnQgb2YgaW50ZXJwcmV0YXRpb24gYXMgbmVlZGVkIGJ5IGVhY2ggc2VjdGlvbi4gICovCgoJc2hzdHJ0YWIgPSBmLT5zZWN0aW9uc1tmLT5oZWFkZXIuZV9zaHN0cm5keF0tPmNvbnRlbnRzOwoKCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMgPSBmLT5zZWN0aW9uc1tpXTsKCQlzZWMtPm5hbWUgPSBzaHN0cnRhYiArIHNlYy0+aGVhZGVyLnNoX25hbWU7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYyA9IGYtPnNlY3Rpb25zW2ldOwoKCQkvKiAubW9kaW5mbyBzaG91bGQgYmUgY29udGVudHMgb25seSBidXQgZ2NjIGhhcyBubyBhdHRyaWJ1dGUgZm9yIHRoYXQuCgkJICogVGhlIGtlcm5lbCBtYXkgaGF2ZSBtYXJrZWQgLm1vZGluZm8gYXMgQUxMT0MsIGlnbm9yZSB0aGlzIGJpdC4KCQkgKi8KCQlpZiAoc3RyY21wKHNlYy0+bmFtZSwgIi5tb2RpbmZvIikgPT0gMCkKCQkJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJj0gflNIRl9BTExPQzsKCgkJaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKQoJCQlvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihmLCBzZWMpOwoKCQlzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKCQljYXNlIFNIVF9TWU1UQUI6CgkJCXsKCQkJCXVuc2lnbmVkIGxvbmcgbnN5bSwgajsKCQkJCWNoYXIgKnN0cnRhYjsKCQkJCUVsZlcoU3ltKSAqIHN5bTsKCgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhTeW0pKSkgewoJCQkJCWJiX2Vycm9yX21zZygic3ltYm9sIHNpemUgbWlzbWF0Y2g6ICVsdSAhPSAlbHUiLAoJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNlYy0+aGVhZGVyLnNoX2VudHNpemUsCgkJCQkJCQkodW5zaWduZWQgbG9uZykgc2l6ZW9mKEVsZlcoU3ltKSkpOwoJCQkJCXJldHVybiBOVUxMOwoJCQkJfQoKCQkJCW5zeW0gPSBzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoU3ltKSk7CgkJCQlzdHJ0YWIgPSBmLT5zZWN0aW9uc1tzZWMtPmhlYWRlci5zaF9saW5rXS0+Y29udGVudHM7CgkJCQlzeW0gPSAoRWxmVyhTeW0pICopIHNlYy0+Y29udGVudHM7CgoJCQkJLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgdGFibGUgb2YgbG9jYWwgc3ltYm9scy4gICovCgkJCQlqID0gZi0+bG9jYWxfc3ltdGFiX3NpemUgPSBzZWMtPmhlYWRlci5zaF9pbmZvOwoJCQkJZi0+bG9jYWxfc3ltdGFiID0geHphbGxvYyhqICogc2l6ZW9mKHN0cnVjdCBvYmpfc3ltYm9sICopKTsKCgkJCQkvKiBJbnNlcnQgYWxsIHN5bWJvbHMgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCgkJCQlmb3IgKGogPSAxLCArK3N5bTsgaiA8IG5zeW07ICsraiwgKytzeW0pIHsKCQkJCQlFbGZXKEFkZHIpIHZhbCA9IHN5bS0+c3RfdmFsdWU7CgkJCQkJY29uc3QgY2hhciAqbmFtZTsKCQkJCQlpZiAoc3ltLT5zdF9uYW1lKQoJCQkJCQluYW1lID0gc3RydGFiICsgc3ltLT5zdF9uYW1lOwoJCQkJCWVsc2UgaWYgKHN5bS0+c3Rfc2huZHggPCBzaG51bSkKCQkJCQkJbmFtZSA9IGYtPnNlY3Rpb25zW3N5bS0+c3Rfc2huZHhdLT5uYW1lOwoJCQkJCWVsc2UKCQkJCQkJY29udGludWU7CiNpZiBkZWZpbmVkKF9fU0g1X18pCgkJCQkJLyoKCQkJCQkgKiBGb3Igc2g2NCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0YXJnZXQgb2YgYSBicmFuY2gKCQkJCQkgKiByZXF1aXJlcyBhIG1vZGUgc3dpdGNoICgzMiB0byAxNiBhbmQgYmFjayBhZ2FpbikuCgkJCQkJICoKCQkJCQkgKiBUaGlzIGlzIGltcGxpZWQgYnkgdGhlIGxzYiBiZWluZyBzZXQgaW4gdGhlIHRhcmdldAoJCQkJCSAqIGFkZHJlc3MgZm9yIFNIbWVkaWEgbW9kZSBhbmQgY2xlYXIgZm9yIFNIY29tcGFjdC4KCQkJCQkgKi8KCQkJCQl2YWwgfD0gc3ltLT5zdF9vdGhlciAmIDQ7CiNlbmRpZgoKCQkJCQlvYmpfYWRkX3N5bWJvbChmLCBuYW1lLCBqLCBzeW0tPnN0X2luZm8sIHN5bS0+c3Rfc2huZHgsCgkJCQkJCQl2YWwsIHN5bS0+c3Rfc2l6ZSk7CgkJCQl9CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgU0hUX1JFTE06CgkJCWlmIChzZWMtPmhlYWRlci5zaF9lbnRzaXplICE9IHNpemVvZihFbGZXKFJlbE0pKSkgewoJCQkJYmJfZXJyb3JfbXNnKCJyZWxvY2F0aW9uIGVudHJ5IHNpemUgbWlzbWF0Y2g6ICVsdSAhPSAlbHUiLAoJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFJlbE0pKSk7CgkJCQlyZXR1cm4gTlVMTDsKCQkJfQoJCQlicmVhazsKCQkJLyogWFhYICBSZWxvY2F0aW9uIGNvZGUgZnJvbSBtb2R1dGlscy0yLjMuMTkgaXMgbm90IGhlcmUuCgkJCSAqIFdoeT8gIFRoYXQncyBhYm91dCAyMCBsaW5lcyBvZiBjb2RlIGZyb20gb2JqL29ial9sb2FkLmMsCgkJCSAqIHdoaWNoIGdldHMgZG9uZSBpbiBhIHNlY29uZCBwYXNzIHRocm91Z2ggdGhlIHNlY3Rpb25zLgoJCQkgKiBUaGlzIEJ1c3lCb3ggaW5zbW9kIGRvZXMgc2ltaWxhciB3b3JrIGluIG9ial9yZWxvY2F0ZSgpLiAqLwoJCX0KCX0KCglyZXR1cm4gZjsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNCi8qCiAqIGxvYWQgdGhlIHVubG9hZGVkIHNlY3Rpb25zIGRpcmVjdGx5IGludG8gdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkKICoga2VybmVsIGZvciB0aGUgbW9kdWxlCiAqLwoKc3RhdGljIGludCBvYmpfbG9hZF9wcm9nYml0cyhGSUxFICogZnAsIHN0cnVjdCBvYmpfZmlsZSogZiwgY2hhciogaW1hZ2ViYXNlKQp7CglFbGZXKEFkZHIpIGJhc2UgPSBmLT5iYXNlYWRkcjsKCXN0cnVjdCBvYmpfc2VjdGlvbiogc2VjOwoKCWZvciAoc2VjID0gZi0+bG9hZF9vcmRlcjsgc2VjOyBzZWMgPSBzZWMtPmxvYWRfbmV4dCkgewoKCQkvKiBzZWN0aW9uIGFscmVhZHkgbG9hZGVkPyAqLwoJCWlmIChzZWMtPmNvbnRlbnRzICE9IE5VTEwpCgkJCWNvbnRpbnVlOwoKCQlpZiAoc2VjLT5oZWFkZXIuc2hfc2l6ZSA9PSAwKQoJCQljb250aW51ZTsKCgkJc2VjLT5jb250ZW50cyA9IGltYWdlYmFzZSArIChzZWMtPmhlYWRlci5zaF9hZGRyIC0gYmFzZSk7CgkJZnNlZWsoZnAsIHNlYy0+aGVhZGVyLnNoX29mZnNldCwgU0VFS19TRVQpOwoJCWlmIChmcmVhZChzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplLCAxLCBmcCkgIT0gMSkgewoJCQliYl9wZXJyb3JfbXNnKCJlcnJvciByZWFkaW5nIEVMRiBzZWN0aW9uIGRhdGEiKTsKCQkJcmV0dXJuIDA7CgkJfQoKCX0KCXJldHVybiAxOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgaGlkZV9zcGVjaWFsX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmKQp7CglzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3BlY2lhbHNbXSA9IHsKCQlTUEZYICJjbGVhbnVwX21vZHVsZSIsCgkJU1BGWCAiaW5pdF9tb2R1bGUiLAoJCVNQRlggImtlcm5lbF92ZXJzaW9uIiwKCQlOVUxMCgl9OwoKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cgljb25zdCBjaGFyICpjb25zdCAqcDsKCglmb3IgKHAgPSBzcGVjaWFsczsgKnA7ICsrcCkgewoJCXN5bSA9IG9ial9maW5kX3N5bWJvbChmLCAqcCk7CgkJaWYgKHN5bSAhPSBOVUxMKQoJCQlzeW0tPmluZm8gPSBFTEZfU1RfSU5GTyhTVEJfTE9DQUwsIEVMRl9TVF9UWVBFKHN5bS0+aW5mbykpOwoJfQp9CgoKI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFCnN0YXRpYyBpbnQgb2JqX2dwbF9saWNlbnNlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqKmxpY2Vuc2UpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJLyogVGhpcyBsaXN0IG11c3QgbWF0Y2ggKmV4YWN0bHkqIHRoZSBsaXN0IG9mIGFsbG93YWJsZSBsaWNlbnNlcyBpbgoJICogbGludXgvaW5jbHVkZS9saW51eC9tb2R1bGUuaC4gIENoZWNraW5nIGZvciBsZWFkaW5nICJHUEwiIHdpbGwgbm90CgkgKiB3b3JrLCBzb21lYm9keSB3aWxsIHVzZSAiR1BMIHN1Y2tzLCB0aGlzIGlzIHByb3ByaWV0YXJ5Ii4KCSAqLwoJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncGxfbGljZW5zZXNbXSA9IHsKCQkiR1BMIiwKCQkiR1BMIHYyIiwKCQkiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIsCgkJIkR1YWwgQlNEL0dQTCIsCgkJIkR1YWwgTVBML0dQTCIsCgl9OwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5tb2RpbmZvIik7CglpZiAoc2VjKSB7CgkJY29uc3QgY2hhciAqdmFsdWUsICpwdHIsICplbmRwdHI7CgkJcHRyID0gc2VjLT5jb250ZW50czsKCQllbmRwdHIgPSBwdHIgKyBzZWMtPmhlYWRlci5zaF9zaXplOwoJCXdoaWxlIChwdHIgPCBlbmRwdHIpIHsKCQkJdmFsdWUgPSBzdHJjaHIocHRyLCAnPScpOwoJCQlpZiAodmFsdWUgJiYgc3RybmNtcChwdHIsICJsaWNlbnNlIiwgdmFsdWUtcHRyKSA9PSAwKSB7CgkJCQlpbnQgaTsKCQkJCWlmIChsaWNlbnNlKQoJCQkJCSpsaWNlbnNlID0gdmFsdWUrMTsKCQkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZ3BsX2xpY2Vuc2VzKS9zaXplb2YoZ3BsX2xpY2Vuc2VzWzBdKTsgKytpKSB7CgkJCQkJaWYgKHN0cmNtcCh2YWx1ZSsxLCBncGxfbGljZW5zZXNbaV0pID09IDApCgkJCQkJCXJldHVybiAwOwoJCQkJfQoJCQkJcmV0dXJuIDI7CgkJCX0KCQkJaWYgKHN0cmNocihwdHIsICdcMCcpKQoJCQkJcHRyID0gc3RyY2hyKHB0ciwgJ1wwJykgKyAxOwoJCQllbHNlCgkJCQlwdHIgPSBlbmRwdHI7CgkJfQoJfQoJcmV0dXJuIDE7Cn0KCiNkZWZpbmUgVEFJTlRfRklMRU5BTUUgICAgICAgICAgICAgICAgICAiL3Byb2Mvc3lzL2tlcm5lbC90YWludGVkIgojZGVmaW5lIFRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSAgICAgICAgKDE8PDApCiNkZWZpbmUgVEFJTlRfRk9SQ0VEX01PRFVMRSAgICAgICAgICAgICAoMTw8MSkKI2RlZmluZSBUQUlOVF9VTlNBRkVfU01QICAgICAgICAgICAgICAgICgxPDwyKQojZGVmaW5lIFRBSU5UX1VSTCAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudHV4Lm9yZy9sa21sLyNleHBvcnQtdGFpbnRlZCIKCnN0YXRpYyB2b2lkIHNldF90YWludGVkKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IGZkLCBjaGFyICptX25hbWUsCgkJaW50IGtlcm5lbF9oYXNfdGFpbnRlZCwgaW50IHRhaW50LCBjb25zdCBjaGFyICp0ZXh0MSwgY29uc3QgY2hhciAqdGV4dDIpCnsKCWNoYXIgYnVmWzgwXTsKCWludCBvbGR2YWw7CglzdGF0aWMgaW50IGZpcnN0ID0gMTsKCWlmIChmZCA8IDAgJiYgIWtlcm5lbF9oYXNfdGFpbnRlZCkKCQlyZXR1cm47CQkvKiBOZXcgbW9kdXRpbHMgb24gb2xkIGtlcm5lbCAqLwoJcHJpbnRmKCJXYXJuaW5nOiBsb2FkaW5nICVzIHdpbGwgdGFpbnQgdGhlIGtlcm5lbDogJXMlc1xuIiwKCQkJbV9uYW1lLCB0ZXh0MSwgdGV4dDIpOwoJaWYgKGZpcnN0KSB7CgkJcHJpbnRmKCIgIFNlZSAlcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGFpbnRlZCBtb2R1bGVzXG4iLCBUQUlOVF9VUkwpOwoJCWZpcnN0ID0gMDsKCX0KCWlmIChmZCA+PSAwKSB7CgkJcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKS0xKTsKCQlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOwoJCW9sZHZhbCA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgkJc3ByaW50ZihidWYsICIlZFxuIiwgb2xkdmFsIHwgdGFpbnQpOwoJCXdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKTsKCX0KfQoKLyogQ2hlY2sgaWYgbG9hZGluZyB0aGlzIG1vZHVsZSB3aWxsIHRhaW50IHRoZSBrZXJuZWwuICovCnN0YXRpYyB2b2lkIGNoZWNrX3RhaW50ZWRfbW9kdWxlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqbV9uYW1lKQp7CglzdGF0aWMgY29uc3QgY2hhciB0YWludGVkX2ZpbGVbXSA9IFRBSU5UX0ZJTEVOQU1FOwoJaW50IGZkLCBrZXJuZWxfaGFzX3RhaW50ZWQ7Cgljb25zdCBjaGFyICpwdHI7CgoJa2VybmVsX2hhc190YWludGVkID0gMTsKCWZkID0gb3Blbih0YWludGVkX2ZpbGUsIE9fUkRXUik7CglpZiAoZmQgPCAwKSB7CgkJaWYgKGVycm5vID09IEVOT0VOVCkKCQkJa2VybmVsX2hhc190YWludGVkID0gMDsKCQllbHNlIGlmIChlcnJubyA9PSBFQUNDRVMpCgkJCWtlcm5lbF9oYXNfdGFpbnRlZCA9IDE7CgkJZWxzZSB7CgkJCXBlcnJvcih0YWludGVkX2ZpbGUpOwoJCQlrZXJuZWxfaGFzX3RhaW50ZWQgPSAwOwoJCX0KCX0KCglzd2l0Y2ggKG9ial9ncGxfbGljZW5zZShmLCAmcHRyKSkgewoJCWNhc2UgMDoKCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQlzZXRfdGFpbnRlZChmLCBmZCwgbV9uYW1lLCBrZXJuZWxfaGFzX3RhaW50ZWQsIFRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSwgIm5vIGxpY2Vuc2UiLCAiIik7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJLyogVGhlIG1vZHVsZSBoYXMgYSBub24tR1BMIGxpY2Vuc2Ugc28gd2UgcHJldGVuZCB0aGF0IHRoZQoJCQkgKiBrZXJuZWwgYWx3YXlzIGhhcyBhIHRhaW50IGZsYWcgdG8gZ2V0IGEgd2FybmluZyBldmVuIG9uCgkJCSAqIGtlcm5lbHMgd2l0aG91dCB0aGUgcHJvYyBmbGFnLgoJCQkgKi8KCQkJc2V0X3RhaW50ZWQoZiwgZmQsIG1fbmFtZSwgMSwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAibm9uLUdQTCBsaWNlbnNlIC0gIiwgcHRyKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJc2V0X3RhaW50ZWQoZiwgZmQsIG1fbmFtZSwgMSwgVEFJTlRfUFJPUFJJRVRPUllfTU9EVUxFLCAiVW5leHBlY3RlZCByZXR1cm4gZnJvbSBvYmpfZ3BsX2xpY2Vuc2UiLCAiIik7CgkJCWJyZWFrOwoJfQoKCWlmIChmbGFnX2ZvcmNlX2xvYWQpCgkJc2V0X3RhaW50ZWQoZiwgZmQsIG1fbmFtZSwgMSwgVEFJTlRfRk9SQ0VEX01PRFVMRSwgImZvcmNlZCBsb2FkIiwgIiIpOwoKCWlmIChmZCA+PSAwKQoJCWNsb3NlKGZkKTsKfQojZWxzZSAvKiBGRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFICovCiNkZWZpbmUgY2hlY2tfdGFpbnRlZF9tb2R1bGUoeCwgeSkgZG8geyB9IHdoaWxlICgwKTsKI2VuZGlmIC8qIEZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgKi8KCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUwovKiBhZGQgbW9kdWxlIHNvdXJjZSwgdGltZXN0YW1wLCBrZXJuZWwgdmVyc2lvbiBhbmQgYSBzeW1ib2wgZm9yIHRoZQogKiBzdGFydCBvZiBzb21lIHNlY3Rpb25zLiAgdGhpcyBpbmZvIGlzIHVzZWQgYnkga3N5bW9vcHMgdG8gZG8gYmV0dGVyCiAqIGRlYnVnZ2luZy4KICovCnN0YXRpYyBpbnQKZ2V0X21vZHVsZV92ZXJzaW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciBzdHJbU1RSVkVSU0lPTkxFTl0pCnsKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCglyZXR1cm4gbmV3X2dldF9tb2R1bGVfdmVyc2lvbihmLCBzdHIpOwojZWxzZSAgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLwoJc3RybmNweShzdHIsICI/Pz8iLCBzaXplb2Yoc3RyKSk7CglyZXR1cm4gLTE7CiNlbmRpZiAvKiBGRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCn0KCi8qIGFkZCBtb2R1bGUgc291cmNlLCB0aW1lc3RhbXAsIGtlcm5lbCB2ZXJzaW9uIGFuZCBhIHN5bWJvbCBmb3IgdGhlCiAqIHN0YXJ0IG9mIHNvbWUgc2VjdGlvbnMuICB0aGlzIGluZm8gaXMgdXNlZCBieSBrc3ltb29wcyB0byBkbyBiZXR0ZXIKICogZGVidWdnaW5nLgogKi8Kc3RhdGljIHZvaWQKYWRkX2tzeW1vb3BzX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKCQkJCSBjb25zdCBjaGFyICptX25hbWUpCnsKCXN0YXRpYyBjb25zdCBjaGFyIHN5bXByZWZpeFtdID0gIl9faW5zbW9kXyI7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgljaGFyICpuYW1lLCAqYWJzb2x1dGVfZmlsZW5hbWU7CgljaGFyIHN0cltTVFJWRVJTSU9OTEVOXSwgcmVhbFtQQVRIX01BWF07CglpbnQgaSwgbCwgbG1fbmFtZSwgbGZpbGVuYW1lLCB1c2Vfa3N5bXRhYiwgdmVyc2lvbjsKCXN0cnVjdCBzdGF0IHN0YXRidWY7CgoJc3RhdGljIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZXNbXSA9IHsKCQkiLnRleHQiLAoJCSIucm9kYXRhIiwKCQkiLmRhdGEiLAoJCSIuYnNzIiwKCQkiLnNic3MiCgl9OwoKCWlmIChyZWFscGF0aChmaWxlbmFtZSwgcmVhbCkpIHsKCQlhYnNvbHV0ZV9maWxlbmFtZSA9IHhzdHJkdXAocmVhbCk7Cgl9IGVsc2UgewoJCWJiX3BlcnJvcl9tc2coImNhbm5vdCBnZXQgcmVhbHBhdGggZm9yICVzIiwgZmlsZW5hbWUpOwoJCWFic29sdXRlX2ZpbGVuYW1lID0geHN0cmR1cChmaWxlbmFtZSk7Cgl9CgoJbG1fbmFtZSA9IHN0cmxlbihtX25hbWUpOwoJbGZpbGVuYW1lID0gc3RybGVuKGFic29sdXRlX2ZpbGVuYW1lKTsKCgkvKiBhZGQgdG8ga3N5bXRhYiBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvciB0aGVyZSBpcyBubyBrc3ltdGFiIGFuZCBvdGhlciBzeW1ib2xzCgkgKiBhcmUgbm90IHRvIGJlIGV4cG9ydGVkLiAgb3RoZXJ3aXNlIGxlYXZlIGtzeW10YWIgYWxvbmUgZm9yIG5vdywgdGhlCgkgKiAiZXhwb3J0IGFsbCBzeW1ib2xzIiBjb21wYXRpYmlsaXR5IGNvZGUgd2lsbCBleHBvcnQgdGhlc2Ugc3ltYm9scyBsYXRlci4KCSAqLwoJdXNlX2tzeW10YWIgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKSB8fCBmbGFnX25vZXhwb3J0OwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50aGlzIik7CglpZiAoc2VjKSB7CgkJLyogdGFnIHRoZSBtb2R1bGUgaGVhZGVyIHdpdGggdGhlIG9iamVjdCBuYW1lLCBsYXN0IG1vZGlmaWVkCgkJICogdGltZXN0YW1wIGFuZCBtb2R1bGUgdmVyc2lvbi4gIHdvcnN0IGNhc2UgZm9yIG1vZHVsZSB2ZXJzaW9uCgkJICogaXMgMHhmZmZmZmYsIGRlY2ltYWwgMTY3NzcyMTUuICBwdXR0aW5nIGFsbCB0aHJlZSBmaWVsZHMgaW4KCQkgKiBvbmUgc3ltYm9sIGlzIGxlc3MgcmVhZGFibGUgYnV0IHNhdmVzIGtlcm5lbCBzcGFjZS4KCQkgKi8KCQlsID0gc2l6ZW9mKHN5bXByZWZpeCkrCQkJLyogIl9faW5zbW9kXyIgKi8KCQkJbG1fbmFtZSsJCQkJLyogbW9kdWxlIG5hbWUgKi8KCQkJMisJCQkJCS8qICJfTyIgKi8KCQkJbGZpbGVuYW1lKwkJCQkvKiBvYmplY3QgZmlsZW5hbWUgKi8KCQkJMisJCQkJCS8qICJfTSIgKi8KCQkJMipzaXplb2Yoc3RhdGJ1Zi5zdF9tdGltZSkrCQkvKiBtdGltZSBpbiBoZXggKi8KCQkJMisJCQkJCS8qICJfViIgKi8KCQkJOCsJCQkJCS8qIHZlcnNpb24gaW4gZGVjICovCgkJCTE7CQkJCQkvKiBudWwgKi8KCQluYW1lID0geG1hbGxvYyhsKTsKCQlpZiAoc3RhdChhYnNvbHV0ZV9maWxlbmFtZSwgJnN0YXRidWYpICE9IDApCgkJCXN0YXRidWYuc3RfbXRpbWUgPSAwOwoJCXZlcnNpb24gPSBnZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKTsJLyogLTEgaWYgbm90IGZvdW5kICovCgkJc25wcmludGYobmFtZSwgbCwgIiVzJXNfTyVzX00lMCpsWF9WJWQiLAoJCQkJc3ltcHJlZml4LCBtX25hbWUsIGFic29sdXRlX2ZpbGVuYW1lLAoJCQkJKGludCkoMipzaXplb2Yoc3RhdGJ1Zi5zdF9tdGltZSkpLCBzdGF0YnVmLnN0X210aW1lLAoJCQkJdmVyc2lvbik7CgkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsCgkJCQlFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfTk9UWVBFKSwKCQkJCXNlYy0+aWR4LCBzZWMtPmhlYWRlci5zaF9hZGRyLCAwKTsKCQlpZiAodXNlX2tzeW10YWIpCgkJCW5ld19hZGRfa3N5bXRhYihmLCBzeW0pOwoJfQoJZnJlZShhYnNvbHV0ZV9maWxlbmFtZSk7CiNpZmRlZiBfTk9UX1NVUFBPUlRFRF8KCS8qIHJlY29yZCB3aGVyZSB0aGUgcGVyc2lzdGVudCBkYXRhIGlzIGdvaW5nLCBzYW1lIGFkZHJlc3MgYXMgcHJldmlvdXMgc3ltYm9sICovCgoJaWYgKGYtPnBlcnNpc3QpIHsKCQlsID0gc2l6ZW9mKHN5bXByZWZpeCkrCQkvKiAiX19pbnNtb2RfIiAqLwoJCQlsbV9uYW1lKwkJLyogbW9kdWxlIG5hbWUgKi8KCQkJMisJCQkvKiAiX1AiICovCgkJCXN0cmxlbihmLT5wZXJzaXN0KSsJLyogZGF0YSBzdG9yZSAqLwoJCQkxOwkJCS8qIG51bCAqLwoJCW5hbWUgPSB4bWFsbG9jKGwpOwoJCXNucHJpbnRmKG5hbWUsIGwsICIlcyVzX1AlcyIsCgkJCQlzeW1wcmVmaXgsIG1fbmFtZSwgZi0+cGVyc2lzdCk7CgkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsIEVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAoJCQkJc2VjLT5pZHgsIHNlYy0+aGVhZGVyLnNoX2FkZHIsIDApOwoJCWlmICh1c2Vfa3N5bXRhYikKCQkJbmV3X2FkZF9rc3ltdGFiKGYsIHN5bSk7Cgl9CiNlbmRpZiAvKiBfTk9UX1NVUFBPUlRFRF8gKi8KCS8qIHRhZyB0aGUgZGVzaXJlZCBzZWN0aW9ucyBpZiBzaXplIGlzIG5vbi16ZXJvICovCgoJZm9yIChpID0gMDsgaSA8IHNpemVvZihzZWN0aW9uX25hbWVzKS9zaXplb2Yoc2VjdGlvbl9uYW1lc1swXSk7ICsraSkgewoJCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgc2VjdGlvbl9uYW1lc1tpXSk7CgkJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CgkJCWwgPSBzaXplb2Yoc3ltcHJlZml4KSsJCS8qICJfX2luc21vZF8iICovCgkJCQlsbV9uYW1lKwkJLyogbW9kdWxlIG5hbWUgKi8KCQkJCTIrCQkJLyogIl9TIiAqLwoJCQkJc3RybGVuKHNlYy0+bmFtZSkrCS8qIHNlY3Rpb24gbmFtZSAqLwoJCQkJMisJCQkvKiAiX0wiICovCgkJCQk4KwkJCS8qIGxlbmd0aCBpbiBkZWMgKi8KCQkJCTE7CQkJLyogbnVsICovCgkJCW5hbWUgPSB4bWFsbG9jKGwpOwoJCQlzbnByaW50ZihuYW1lLCBsLCAiJXMlc19TJXNfTCVsZCIsCgkJCQkJc3ltcHJlZml4LCBtX25hbWUsIHNlYy0+bmFtZSwKCQkJCQkobG9uZylzZWMtPmhlYWRlci5zaF9zaXplKTsKCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsIEVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAoJCQkJCXNlYy0+aWR4LCBzZWMtPmhlYWRlci5zaF9hZGRyLCAwKTsKCQkJaWYgKHVzZV9rc3ltdGFiKQoJCQkJbmV3X2FkZF9rc3ltdGFiKGYsIHN5bSk7CgkJfQoJfQp9CiNlbmRpZiAvKiBGRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTICovCgojaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCnN0YXRpYyB2b2lkIHByaW50X2xvYWRfbWFwKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTAoJc3RydWN0IG9ial9zeW1ib2wgKiphbGwsICoqcDsKCWludCBpLCBuc3ltcywgKmxvYWRlZDsKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CiNlbmRpZgoJLyogUmVwb3J0IG9uIHRoZSBzZWN0aW9uIGxheW91dC4gICovCgoJcHJpbnRmKCJTZWN0aW9uczogICAgICAgU2l6ZSAgICAgICUtKnMgIEFsaWduXG4iLAoJCQkoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwgIkFkZHJlc3MiKTsKCglmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKCQlpbnQgYTsKCQl1bnNpZ25lZCBsb25nIHRtcDsKCgkJZm9yIChhID0gLTEsIHRtcCA9IHNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbjsgdG1wOyArK2EpCgkJCXRtcCA+Pj0gMTsKCQlpZiAoYSA9PSAtMSkKCQkJYSA9IDA7CgoJCXByaW50ZigiJS0xNXMgJTA4bHggICUwKmx4ICAyKiolZFxuIiwKCQkJCXNlYy0+bmFtZSwKCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX3NpemUsCgkJCQkoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwKCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX2FkZHIsCgkJCQlhKTsKCX0KI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMCgkvKiBRdWljayByZWZlcmVuY2Ugd2hpY2ggc2VjdGlvbiBpbmRpY2llcyBhcmUgbG9hZGVkLiAgKi8KCglsb2FkZWQgPSBhbGxvY2Eoc2l6ZW9mKGludCkgKiAoaSA9IGYtPmhlYWRlci5lX3NobnVtKSk7Cgl3aGlsZSAoLS1pID49IDApCgkJbG9hZGVkW2ldID0gKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDA7CgoJLyogQ29sbGVjdCB0aGUgc3ltYm9scyB3ZSdsbCBiZSBsaXN0aW5nLiAgKi8KCglmb3IgKG5zeW1zID0gaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkKCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCWlmIChzeW0tPnNlY2lkeCA8PSBTSE5fSElSRVNFUlZFCgkJCQkJJiYgKHN5bS0+c2VjaWR4ID49IFNITl9MT1JFU0VSVkUgfHwgbG9hZGVkW3N5bS0+c2VjaWR4XSkpCgkJCQkrK25zeW1zOwoKCWFsbCA9IGFsbG9jYShuc3ltcyAqIHNpemVvZihzdHJ1Y3Qgb2JqX3N5bWJvbCAqKSk7CgoJZm9yIChpID0gMCwgcCA9IGFsbDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKQoJCWZvciAoc3ltID0gZi0+c3ltdGFiW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKCQkJaWYgKHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUKCQkJCQkmJiAoc3ltLT5zZWNpZHggPj0gU0hOX0xPUkVTRVJWRSB8fCBsb2FkZWRbc3ltLT5zZWNpZHhdKSkKCQkJCSpwKysgPSBzeW07CgoJLyogQW5kIGxpc3QgdGhlbS4gICovCglwcmludGYoIlxuU3ltYm9sczpcbiIpOwoJZm9yIChwID0gYWxsOyBwIDwgYWxsICsgbnN5bXM7ICsrcCkgewoJCWNoYXIgdHlwZSA9ICc/JzsKCQl1bnNpZ25lZCBsb25nIHZhbHVlOwoKCQlzeW0gPSAqcDsKCQlpZiAoc3ltLT5zZWNpZHggPT0gU0hOX0FCUykgewoJCQl0eXBlID0gJ0EnOwoJCQl2YWx1ZSA9IHN5bS0+dmFsdWU7CgkJfSBlbHNlIGlmIChzeW0tPnNlY2lkeCA9PSBTSE5fVU5ERUYpIHsKCQkJdHlwZSA9ICdVJzsKCQkJdmFsdWUgPSAwOwoJCX0gZWxzZSB7CgkJCXNlYyA9IGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XTsKCgkJCWlmIChzZWMtPmhlYWRlci5zaF90eXBlID09IFNIVF9OT0JJVFMpCgkJCQl0eXBlID0gJ0InOwoJCQllbHNlIGlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykgewoJCQkJaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0VYRUNJTlNUUikKCQkJCQl0eXBlID0gJ1QnOwoJCQkJZWxzZSBpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfV1JJVEUpCgkJCQkJdHlwZSA9ICdEJzsKCQkJCWVsc2UKCQkJCQl0eXBlID0gJ1InOwoJCQl9CgkJCXZhbHVlID0gc3ltLT52YWx1ZSArIHNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJfQoKCQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSA9PSBTVEJfTE9DQUwpCgkJCXR5cGUgPSB0b2xvd2VyKHR5cGUpOwoKCQlwcmludGYoIiUwKmx4ICVjICVzXG4iLCAoaW50KSAoMiAqIHNpemVvZih2b2lkICopKSwgdmFsdWUsCgkJCQl0eXBlLCBzeW0tPm5hbWUpOwoJfQojZW5kaWYKfQojZWxzZSAvKiAhRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgKi8Kdm9pZCBwcmludF9sb2FkX21hcChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOwojZW5kaWYKCmludCBpbnNtb2RfbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CgljaGFyICpvcHRfbywgKmFyZzE7CglpbnQgbGVuOwoJaW50IGtfY3JjczsKCWNoYXIgKnRtcCwgKnRtcDE7Cgl1bnNpZ25lZCBsb25nIG1fc2l6ZTsKCUVsZlcoQWRkcikgbV9hZGRyOwoJc3RydWN0IG9ial9maWxlICpmOwoJc3RydWN0IHN0YXQgc3Q7CgljaGFyICptX25hbWUgPSAwOwoJaW50IGV4aXRfc3RhdHVzID0gRVhJVF9GQUlMVVJFOwoJaW50IG1faGFzX21vZGluZm87CiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwoJc3RydWN0IHV0c25hbWUgdXRzX2luZm87CgljaGFyIG1fc3RydmVyc2lvbltTVFJWRVJTSU9OTEVOXTsKCWludCBtX3ZlcnNpb24sIG1fY3JjczsKI2VuZGlmCiNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAoJRklMRSAqZnAgPSAwOwojZWxzZQoJRklMRSAqZnA7CiNlbmRpZgoJaW50IGtfdmVyc2lvbiA9IDA7CglzdHJ1Y3QgdXRzbmFtZSBteXVuYW1lOwoKCS8qIFBhcnNlIGFueSBvcHRpb25zICovCglnZXRvcHQzMihhcmdjLCBhcmd2LCBPUFRJT05fU1RSLCAmb3B0X28pOwoJYXJnMSA9IGFyZ3Zbb3B0aW5kXTsKCWlmIChvcHRpb25fbWFzazMyICYgT1BUX28pIHsgLy8gLW8gLyogbmFtZSB0aGUgb3V0cHV0IG1vZHVsZSAqLwoJCWZyZWUobV9uYW1lKTsKCQltX25hbWUgPSB4c3RyZHVwKG9wdF9vKTsKCX0KCglpZiAoYXJnMSA9PSBOVUxMKSB7CgkJYmJfc2hvd191c2FnZSgpOwoJfQoKCS8qIEdyYWIgdGhlIG1vZHVsZSBuYW1lICovCgl0bXAxID0geHN0cmR1cChhcmcxKTsKCXRtcCA9IGJhc2VuYW1lKHRtcDEpOwoJbGVuID0gc3RybGVuKHRtcCk7CgoJaWYgKHVuYW1lKCZteXVuYW1lKSA9PSAwKSB7CgkJaWYgKG15dW5hbWUucmVsZWFzZVswXSA9PSAnMicpIHsKCQkJa192ZXJzaW9uID0gbXl1bmFtZS5yZWxlYXNlWzJdIC0gJzAnOwoJCX0KCX0KCiNpZiBFTkFCTEVfRkVBVFVSRV8yXzZfTU9EVUxFUwoJaWYgKGtfdmVyc2lvbiA+IDQgJiYgbGVuID4gMyAmJiB0bXBbbGVuIC0gM10gPT0gJy4nCgkgJiYgdG1wW2xlbiAtIDJdID09ICdrJyAmJiB0bXBbbGVuIC0gMV0gPT0gJ28nCgkpIHsKCQlsZW4gLT0gMzsKCQl0bXBbbGVuXSA9ICdcMCc7Cgl9IGVsc2UKI2VuZGlmCgkJaWYgKGxlbiA+IDIgJiYgdG1wW2xlbiAtIDJdID09ICcuJyAmJiB0bXBbbGVuIC0gMV0gPT0gJ28nKSB7CgkJCWxlbiAtPSAyOwoJCQl0bXBbbGVuXSA9ICdcMCc7CgkJfQoKCiNpZiBFTkFCTEVfRkVBVFVSRV8yXzZfTU9EVUxFUwoJaWYgKGtfdmVyc2lvbiA+IDQpCgkJbV9mdWxsTmFtZSA9IHhhc3ByaW50ZigiJXMua28iLCB0bXApOwoJZWxzZQojZW5kaWYKCQltX2Z1bGxOYW1lID0geGFzcHJpbnRmKCIlcy5vIiwgdG1wKTsKCglpZiAoIW1fbmFtZSkgewoJCW1fbmFtZSA9IHRtcDsKCX0gZWxzZSB7CgkJZnJlZSh0bXAxKTsKCQl0bXAxID0gMDsgICAgICAgLyogZmxhZyBmb3IgZnJlZShtX25hbWUpIGJlZm9yZSBleGl0KCkgKi8KCX0KCgkvKiBHZXQgYSBmaWxlZGVzYyBmb3IgdGhlIG1vZHVsZS4gIENoZWNrIHdlIHdlIGhhdmUgYSBjb21wbGV0ZSBwYXRoICovCglpZiAoc3RhdChhcmcxLCAmc3QpIDwgMCB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKQoJIHx8IChmcCA9IGZvcGVuKGFyZzEsICJyIikpID09IE5VTEwKCSkgewoJCS8qIEhtbS4gIENvdWxkIG5vdCBvcGVuIGl0LiAgRmlyc3Qgc2VhcmNoIHVuZGVyIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgLAoJCSAqIGJ1dCBkbyBub3QgZXJyb3Igb3V0IHlldCBpZiB3ZSBmYWlsIHRvIGZpbmQgaXQuLi4gKi8KCQlpZiAoa192ZXJzaW9uKSB7CS8qIHVuYW1lIHN1Y2NlZWRkICovCgkJCWNoYXIgKm1vZHVsZV9kaXI7CgkJCWNoYXIgKnRtZG47CgkJCWNoYXIgcmVhbF9tb2R1bGVfZGlyW0ZJTEVOQU1FX01BWF07CgoJCQl0bWRuID0gY29uY2F0X3BhdGhfZmlsZShfUEFUSF9NT0RVTEVTLCBteXVuYW1lLnJlbGVhc2UpOwoJCQkvKiBKdW1wIHRocm91Z2ggaG9vcHMgaW4gY2FzZSAvbGliL21vZHVsZXMvYHVuYW1lIC1yYAoJCQkgKiBpcyBhIHN5bWxpbmsuICBXZSBkbyBub3Qgd2FudCByZWN1cnNpdmVfYWN0aW9uIHRvCgkJCSAqIGZvbGxvdyBzeW1saW5rcywgYnV0IHdlIGRvIHdhbnQgdG8gZm9sbG93IHRoZQoJCQkgKiAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCBkaXIsIFNvIHJlc29sdmUgaXQgb3Vyc2VsdmVzCgkJCSAqIGlmIGl0IGlzIGEgbGluay4uLiAqLwoJCQlpZiAocmVhbHBhdGgodG1kbiwgcmVhbF9tb2R1bGVfZGlyKSA9PSBOVUxMKQoJCQkJbW9kdWxlX2RpciA9IHRtZG47CgkJCWVsc2UKCQkJCW1vZHVsZV9kaXIgPSByZWFsX21vZHVsZV9kaXI7CgkJCXJlY3Vyc2l2ZV9hY3Rpb24obW9kdWxlX2RpciwgVFJVRSwgRkFMU0UsIEZBTFNFLAoJCQkJCWNoZWNrX21vZHVsZV9uYW1lX21hdGNoLCAwLCBtX2Z1bGxOYW1lLCAwKTsKCQkJZnJlZSh0bWRuKTsKCQl9CgoJCS8qIENoZWNrIGlmIHdlIGhhdmUgZm91bmQgYW55dGhpbmcgeWV0ICovCgkJaWYgKG1fZmlsZW5hbWUgPT0gMCB8fCAoKGZwID0gZm9wZW4obV9maWxlbmFtZSwgInIiKSkgPT0gTlVMTCkpIHsKCQkJY2hhciBtb2R1bGVfZGlyW0ZJTEVOQU1FX01BWF07CgoJCQlmcmVlKG1fZmlsZW5hbWUpOwoJCQltX2ZpbGVuYW1lID0gMDsKCQkJaWYgKHJlYWxwYXRoIChfUEFUSF9NT0RVTEVTLCBtb2R1bGVfZGlyKSA9PSBOVUxMKQoJCQkJc3RyY3B5KG1vZHVsZV9kaXIsIF9QQVRIX01PRFVMRVMpOwoJCQkvKiBObyBtb2R1bGUgZm91bmQgdW5kZXIgL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAsIHRoaXMKCQkJICogdGltZSBjYXN0IHRoZSBuZXQgYSBiaXQgd2lkZXIuICBTZWFyY2ggL2xpYi9tb2R1bGVzLyAqLwoJCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24obW9kdWxlX2RpciwgVFJVRSwgRkFMU0UsIEZBTFNFLAoJCQkJCQkgICAgY2hlY2tfbW9kdWxlX25hbWVfbWF0Y2gsIDAsIG1fZnVsbE5hbWUsIDApCgkJCSkgewoJCQkJaWYgKG1fZmlsZW5hbWUgPT0gMAoJCQkJIHx8ICgoZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKQoJCQkJKSB7CgkJCQkJYmJfZXJyb3JfbXNnKCIlczogbm8gbW9kdWxlIGJ5IHRoYXQgbmFtZSBmb3VuZCIsIG1fZnVsbE5hbWUpOwoJCQkJCWdvdG8gb3V0OwoJCQkJfQoJCQl9IGVsc2UKCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm8gbW9kdWxlIGJ5IHRoYXQgbmFtZSBmb3VuZCIsIG1fZnVsbE5hbWUpOwoJCX0KCX0gZWxzZQoJCW1fZmlsZW5hbWUgPSB4c3RyZHVwKGFyZzEpOwoKCWlmIChmbGFnX3ZlcmJvc2UpCgkJcHJpbnRmKCJVc2luZyAlc1xuIiwgbV9maWxlbmFtZSk7CgojaWYgRU5BQkxFX0ZFQVRVUkVfMl82X01PRFVMRVMKCWlmIChrX3ZlcnNpb24gPiA0KSB7CgkJYXJndltvcHRpbmRdID0gbV9maWxlbmFtZTsKCQlvcHRpbmQtLTsKCQlyZXR1cm4gaW5zbW9kX25nX21haW4oYXJnYyAtIG9wdGluZCwgYXJndiArIG9wdGluZCk7Cgl9CiNlbmRpZgoKCWYgPSBvYmpfbG9hZChmcCwgTE9BREJJVFMpOwoJaWYgKGYgPT0gTlVMTCkKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbm5vdCBsb2FkIHRoZSBtb2R1bGUiKTsKCglpZiAoZ2V0X21vZGluZm9fdmFsdWUoZiwgImtlcm5lbF92ZXJzaW9uIikgPT0gTlVMTCkKCQltX2hhc19tb2RpbmZvID0gMDsKCWVsc2UKCQltX2hhc19tb2RpbmZvID0gMTsKCiNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwoJLyogVmVyc2lvbiBjb3JyZXNwb25kZW5jZT8gICovCglpZiAoIWZsYWdfcXVpZXQpIHsKCQlpZiAodW5hbWUoJnV0c19pbmZvKSA8IDApCgkJCXV0c19pbmZvLnJlbGVhc2VbMF0gPSAnXDAnOwoJCWlmIChtX2hhc19tb2RpbmZvKSB7CgkJCW1fdmVyc2lvbiA9IG5ld19nZXRfbW9kdWxlX3ZlcnNpb24oZiwgbV9zdHJ2ZXJzaW9uKTsKCQkJaWYgKG1fdmVyc2lvbiA9PSAtMSkgewoJCQkJYmJfZXJyb3JfbXNnKCJjYW5ub3QgZmluZCB0aGUga2VybmVsIHZlcnNpb24gdGhlIG1vZHVsZSB3YXMgIgoJCQkJCQkiY29tcGlsZWQgZm9yIik7CgkJCQlnb3RvIG91dDsKCQkJfQoJCX0KCgkJaWYgKHN0cm5jbXAodXRzX2luZm8ucmVsZWFzZSwgbV9zdHJ2ZXJzaW9uLCBTVFJWRVJTSU9OTEVOKSAhPSAwKSB7CgkJCWlmIChmbGFnX2ZvcmNlX2xvYWQpIHsKCQkJCWJiX2Vycm9yX21zZygid2FybmluZzoga2VybmVsLW1vZHVsZSB2ZXJzaW9uIG1pc21hdGNoXG4iCgkJCQkJCSJcdCVzIHdhcyBjb21waWxlZCBmb3Iga2VybmVsIHZlcnNpb24gJXNcbiIKCQkJCQkJIlx0d2hpbGUgdGhpcyBrZXJuZWwgaXMgdmVyc2lvbiAlcyIsCgkJCQkJCW1fZmlsZW5hbWUsIG1fc3RydmVyc2lvbiwgdXRzX2luZm8ucmVsZWFzZSk7CgkJCX0gZWxzZSB7CgkJCQliYl9lcnJvcl9tc2coImtlcm5lbC1tb2R1bGUgdmVyc2lvbiBtaXNtYXRjaFxuIgoJCQkJCQkiXHQlcyB3YXMgY29tcGlsZWQgZm9yIGtlcm5lbCB2ZXJzaW9uICVzXG4iCgkJCQkJCSJcdHdoaWxlIHRoaXMga2VybmVsIGlzIHZlcnNpb24gJXMuIiwKCQkJCQkJbV9maWxlbmFtZSwgbV9zdHJ2ZXJzaW9uLCB1dHNfaW5mby5yZWxlYXNlKTsKCQkJCWdvdG8gb3V0OwoJCQl9CgkJfQoJfQoJa19jcmNzID0gMDsKI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KCglpZiAoIXF1ZXJ5X21vZHVsZShOVUxMLCAwLCBOVUxMLCAwLCBOVUxMKSkgewoJCWlmICghbmV3X2dldF9rZXJuZWxfc3ltYm9scygpKQoJCQlnb3RvIG91dDsKCQlrX2NyY3MgPSBuZXdfaXNfa2VybmVsX2NoZWNrc3VtbWVkKCk7Cgl9IGVsc2UgewoJCWJiX2Vycm9yX21zZygibm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBvbGQga2VybmVscyIpOwoJCWdvdG8gb3V0OwoJfQoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCgltX2NyY3MgPSAwOwoJaWYgKG1faGFzX21vZGluZm8pCgkJbV9jcmNzID0gbmV3X2lzX21vZHVsZV9jaGVja3N1bW1lZChmKTsKCglpZiAobV9jcmNzICE9IGtfY3JjcykKCQlvYmpfc2V0X3N5bWJvbF9jb21wYXJlKGYsIG5jdl9zdHJjbXAsIG5jdl9zeW1ib2xfaGFzaCk7CiNlbmRpZiAvKiBGRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgoJLyogTGV0IHRoZSBtb2R1bGUga25vdyBhYm91dCB0aGUga2VybmVsIHN5bWJvbHMuICAqLwoJYWRkX2tlcm5lbF9zeW1ib2xzKGYpOwoKCS8qIEFsbG9jYXRlIGNvbW1vbiBzeW1ib2xzLCBzeW1ib2wgdGFibGVzLCBhbmQgc3RyaW5nIHRhYmxlcy4gICovCgoJaWYgKCFuZXdfY3JlYXRlX3RoaXNfbW9kdWxlKGYsIG1fbmFtZSkpIHsKCQlnb3RvIG91dDsKCX0KCglpZiAoIW9ial9jaGVja191bmRlZmluZWRzKGYpKSB7CgkJZ290byBvdXQ7Cgl9CglvYmpfYWxsb2NhdGVfY29tbW9ucyhmKTsKCWNoZWNrX3RhaW50ZWRfbW9kdWxlKGYsIG1fbmFtZSk7CgoJLyogZG9uZSB3aXRoIHRoZSBtb2R1bGUgbmFtZSwgb24gdG8gdGhlIG9wdGlvbmFsIHZhcj12YWx1ZSBhcmd1bWVudHMgKi8KCSsrb3B0aW5kOwoJaWYgKG9wdGluZCA8IGFyZ2MpIHsKCQlpZiAoIW5ld19wcm9jZXNzX21vZHVsZV9hcmd1bWVudHMoZiwgYXJnYyAtIG9wdGluZCwgYXJndiArIG9wdGluZCkpIHsKCQkJZ290byBvdXQ7CgkJfQoJfQoKCWFyY2hfY3JlYXRlX2dvdChmKTsKCWhpZGVfc3BlY2lhbF9zeW1ib2xzKGYpOwoKI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCglhZGRfa3N5bW9vcHNfc3ltYm9scyhmLCBtX2ZpbGVuYW1lLCBtX25hbWUpOwojZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyAqLwoKCW5ld19jcmVhdGVfbW9kdWxlX2tzeW10YWIoZik7CgoJLyogRmluZCBjdXJyZW50IHNpemUgb2YgdGhlIG1vZHVsZSAqLwoJbV9zaXplID0gb2JqX2xvYWRfc2l6ZShmKTsKCgoJbV9hZGRyID0gY3JlYXRlX21vZHVsZShtX25hbWUsIG1fc2l6ZSk7CglpZiAobV9hZGRyID09IC0xKSBzd2l0Y2ggKGVycm5vKSB7CgkJY2FzZSBFRVhJU1Q6CgkJCWJiX2Vycm9yX21zZygiYSBtb2R1bGUgbmFtZWQgJXMgYWxyZWFkeSBleGlzdHMiLCBtX25hbWUpOwoJCQlnb3RvIG91dDsKCQljYXNlIEVOT01FTToKCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBhbGxvY2F0ZSBrZXJuZWwgbWVtb3J5IGZvciBtb2R1bGU7IG5lZWRlZCAlbHUgYnl0ZXMiLAoJCQkJCW1fc2l6ZSk7CgkJCWdvdG8gb3V0OwoJCWRlZmF1bHQ6CgkJCWJiX3BlcnJvcl9tc2coImNyZWF0ZV9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKCQkJZ290byBvdXQ7Cgl9CgojaWYgICFMT0FEQklUUwoJLyoKCSAqIHRoZSBQUk9HQklUUyBzZWN0aW9uIHdhcyBub3QgbG9hZGVkIGJ5IHRoZSBvYmpfbG9hZAoJICogbm93IHdlIGNhbiBsb2FkIHRoZW0gZGlyZWN0bHkgaW50byB0aGUga2VybmVsIG1lbW9yeQoJICovCglpZiAoIW9ial9sb2FkX3Byb2diaXRzKGZwLCBmLCAoY2hhciopbV9hZGRyKSkgewoJCWRlbGV0ZV9tb2R1bGUobV9uYW1lKTsKCQlnb3RvIG91dDsKCX0KI2VuZGlmCgoJaWYgKCFvYmpfcmVsb2NhdGUoZiwgbV9hZGRyKSkgewoJCWRlbGV0ZV9tb2R1bGUobV9uYW1lKTsKCQlnb3RvIG91dDsKCX0KCglpZiAoIW5ld19pbml0X21vZHVsZShtX25hbWUsIGYsIG1fc2l6ZSkpIHsKCQlkZWxldGVfbW9kdWxlKG1fbmFtZSk7CgkJZ290byBvdXQ7Cgl9CgoJaWYoZmxhZ19wcmludF9sb2FkX21hcCkKCQlwcmludF9sb2FkX21hcChmKTsKCglleGl0X3N0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKCm91dDoKI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCglpZihmcCkKCQlmY2xvc2UoZnApOwoJZnJlZSh0bXAxKTsKCWlmKCF0bXAxKQoJCWZyZWUobV9uYW1lKTsKCWZyZWUobV9maWxlbmFtZSk7CiNlbmRpZgoJcmV0dXJuIGV4aXRfc3RhdHVzOwp9CgoKI2VuZGlmCgoKI2lmIEVOQUJMRV9GRUFUVVJFXzJfNl9NT0RVTEVTCgojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CgovKiBXZSB1c2UgZXJyb3IgbnVtYmVycyBpbiBhIGxvb3NlIHRyYW5zbGF0aW9uLi4uICovCnN0YXRpYyBjb25zdCBjaGFyICptb2RlcnJvcihpbnQgZXJyKQp7Cglzd2l0Y2ggKGVycikgewoJY2FzZSBFTk9FWEVDOgoJCXJldHVybiAiSW52YWxpZCBtb2R1bGUgZm9ybWF0IjsKCWNhc2UgRU5PRU5UOgoJCXJldHVybiAiVW5rbm93biBzeW1ib2wgaW4gbW9kdWxlIjsKCWNhc2UgRVNSQ0g6CgkJcmV0dXJuICJNb2R1bGUgaGFzIHdyb25nIHN5bWJvbCB2ZXJzaW9uIjsKCWNhc2UgRUlOVkFMOgoJCXJldHVybiAiSW52YWxpZCBwYXJhbWV0ZXJzIjsKCWRlZmF1bHQ6CgkJcmV0dXJuIHN0cmVycm9yKGVycik7Cgl9Cn0KCmludCBpbnNtb2RfbmdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWxvbmcgcmV0OwoJc2l6ZV90IGxlbjsKCXZvaWQgKm1hcDsKCWNoYXIgKmZpbGVuYW1lLCAqb3B0aW9uczsKCglmaWxlbmFtZSA9ICorK2FyZ3Y7CglpZiAoIWZpbGVuYW1lKQoJCWJiX3Nob3dfdXNhZ2UoKTsKCgkvKiBSZXN0IGlzIG9wdGlvbnMgKi8KCW9wdGlvbnMgPSB4c3RyZHVwKCIiKTsKCXdoaWxlICgqKythcmd2KSB7CgkJaW50IG9wdGxlbiA9IHN0cmxlbihvcHRpb25zKTsKCQlvcHRpb25zID0geHJlYWxsb2Mob3B0aW9ucywgb3B0bGVuICsgMiArIHN0cmxlbigqYXJndikgKyAyKTsKCQkvKiBTcGFjZXMgaGFuZGxlZCBieSAiIiBwYWlycywgYnV0IG5vIHdheSBvZiBlc2NhcGluZyBxdW90ZXMgKi8KCQlzcHJpbnRmKG9wdGlvbnMgKyBvcHRsZW4sIChzdHJjaHIoKmFyZ3YsJyAnKSA/ICJcIiVzXCIgIiA6ICIlcyAiKSwgKmFyZ3YpOwoJfQoKI2lmIDAKCS8qIEFueSBzcGVjaWFsIHJlYXNvbiB3aHkgbW1hcD8gSXQgaXNuJ3QgcGVyZm9ybWFjZSBjcml0aWNhbC4uLiAqLwoJaW50IGZkOwoJc3RydWN0IHN0YXQgc3Q7Cgl1bnNpZ25lZCBsb25nIGxlbjsKCWZkID0geG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKCWZzdGF0KGZkLCAmc3QpOwoJbGVuID0gc3Quc3Rfc2l6ZTsKCW1hcCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CglpZiAobWFwID09IE1BUF9GQUlMRUQpIHsKCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbm5vdCBtbWFwICclcyciLCBmaWxlbmFtZSk7Cgl9CgoJLyogbWFwID09IE5VTEwgb24gQmxhY2tmaW4sIHByb2JhYmx5IG9uIG90aGVyIE1NVS1sZXNzIHN5c3RlbXMgdG9vLiBXb3JrYXJvdW5kLiAqLwoJaWYgKG1hcCA9PSBOVUxMKSB7CgkJbWFwID0geG1hbGxvYyhsZW4pOwoJCXhyZWFkKGZkLCBtYXAsIGxlbik7Cgl9CiNlbHNlCglsZW4gPSBNQVhJTlQoc3NpemVfdCk7CgltYXAgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShmaWxlbmFtZSwgJmxlbik7CiNlbmRpZgoKCXJldCA9IHN5c2NhbGwoX19OUl9pbml0X21vZHVsZSwgbWFwLCBsZW4sIG9wdGlvbnMpOwoJaWYgKHJldCAhPSAwKSB7CgkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW5ub3QgaW5zZXJ0ICclcyc6ICVzICglbGkpIiwKCQkJCWZpbGVuYW1lLCBtb2RlcnJvcihlcnJubyksIHJldCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCiNlbmRpZgo=