LyoKICogIHdpbmJvbmQtY2lyLmMgLSBEcml2ZXIgZm9yIHRoZSBDb25zdW1lciBJUiBmdW5jdGlvbmFsaXR5IG9mIFdpbmJvbmQKICogICAgICAgICAgICAgICAgICBTdXBlckkvTyBjaGlwcy4KICoKICogIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgV2luYm9uZCBXUENEMzc2aSBjaGlwIChQTlAgaWQgV0VDMTAyMiksIGJ1dAogKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQogKiAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgogKgogKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CiAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDkgRGF2aWQgSORyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgogKgogKiAgRGVkaWNhdGVkIHRvIE1hdGlsZGEsIG15IG5ld2Jvcm4gZGF1Z2h0ZXIsIHdpdGhvdXQgd2hvc2UgbG92aW5nIGF0dGVudGlvbgogKiAgdGhpcyBkcml2ZXIgd291bGQgaGF2ZSBiZWVuIGZpbmlzaGVkIGluIGhhbGYgdGhlIHRpbWUgYW5kIHdpdGggYSBmcmFjdGlvbgogKiAgb2YgdGhlIGJ1Z3MuCiAqCiAqICBXcml0dGVuIHVzaW5nOgogKiAgICBvIFdpbmJvbmQgV1BDRDM3NkkgZGF0YXNoZWV0IGhlbHBmdWxseSBwcm92aWRlZCBieSBKZXNzZSBCYXJuZXMgYXQgSW50ZWwKICogICAgbyBOYXRTZW1pIFBDODczMzgvUEM5NzMzOCBkYXRhc2hlZXQgKGZvciB0aGUgc2VyaWFsIHBvcnQgc3R1ZmYpCiAqICAgIG8gRFNEVCBkdW1wcwogKgogKiAgU3VwcG9ydGVkIGZlYXR1cmVzOgogKiAgICBvIFJDNgogKiAgICBvIFdha2UtT24tQ0lSIGZ1bmN0aW9uYWxpdHkKICoKICogIFRvIGRvOgogKiAgICBvIFRlc3QgTkVDIGFuZCBSQzUKICoKICogIExlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXI6CiAqICAgIG8gTGVhcm5pbmcgKEkgaGF2ZSBuZWl0aGVyIHRoZSBoYXJkd2FyZSwgbm9yIHRoZSBuZWVkKQogKiAgICBvIElSIFRyYW5zbWl0IChpYmlkKQogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3BucC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiNpbmNsdWRlIDxsaW51eC9pby5oPgojaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KCiNkZWZpbmUgRFJWTkFNRSAid2luYm9uZC1jaXIiCgovKiBDRUlSIFdha2UtVXAgUmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBkYXRhLT53YmFzZSAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DVEwJMHgwMyAvKiBDRUlSIFJlY2VpdmVyIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX1NUUwkweDA0IC8qIENFSVIgUmVjZWl2ZXIgU3RhdHVzCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTgkweDA1IC8qIENFSVIgUmVjZWl2ZXIgRXZlbnQgRW5hYmxlCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NOVEwJMHgwNiAvKiBDRUlSIFJlY2VpdmVyIENvdW50ZXIgTG93CSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NOVEgJMHgwNyAvKiBDRUlSIFJlY2VpdmVyIENvdW50ZXIgSGlnaAkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWAkweDA4IC8qIENFSVIgUmVjZWl2ZXIgSW5kZXgJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0RBVEEJMHgwOSAvKiBDRUlSIFJlY2VpdmVyIERhdGEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NTTAkweDBBIC8qIENFSVIgUmUuIENvbXBhcmUgU3RybGVuCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19XQ0VJUl9DRkcxCTB4MEIgLyogQ0VJUiBSZS4gQ29uZmlndXJhdGlvbiAxCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NGRzIJMHgwQyAvKiBDRUlSIFJlLiBDb25maWd1cmF0aW9uIDIJKi8KCi8qIENFSVIgRW5oYW5jZWQgRnVuY3Rpb25hbGl0eSBSZWdpc3RlcnMsIHJlbGF0aXZlIHRvIGRhdGEtPmViYXNlICAgICAgICovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NUUwkweDAwIC8qIEVuaGFuY2VkIElSIENvbnRyb2wgU3RhdHVzCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NDVEwJMHgwMSAvKiBJbmZyYXJlZCBDb3VudGVyIENvbnRyb2wJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ05UX0xPCTB4MDIgLyogSW5mcmFyZWQgQ291bnRlciBMU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0NOVF9ISQkweDAzIC8qIEluZnJhcmVkIENvdW50ZXIgTVNCCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9JUkVNCTB4MDQgLyogSW5mcmFyZWQgRW1pdHRlciBTdGF0dXMJCSovCgovKiBTUDMgQmFua2VkIFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+c2Jhc2UgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQlNSCTB4MDMgLyogQmFuayBTZWxlY3QsIGFsbCBiYW5rcwkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMAkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhEQVRBCTB4MDAgLyogRklGTyBSWCBkYXRhIChyKQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1RYREFUQQkweDAwIC8qIEZJRk8gVFggZGF0YSAodykJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JRVIJMHgwMSAvKiBJbnRlcnJ1cHQgRW5hYmxlCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRUlSCTB4MDIgLyogRXZlbnQgSWRlbnRpZmljYXRpb24gKHIpCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19GQ1IJMHgwMiAvKiBGSUZPIENvbnRyb2wgKHcpCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTUNSCTB4MDQgLyogTW9kZSBDb250cm9sCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0xTUgkweDA1IC8qIExpbmsgU3RhdHVzCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX01TUgkweDA2IC8qIE1vZGVtIFN0YXR1cwkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19BU0NSCTB4MDcgLyogQXV4IFN0YXR1cyBhbmQgQ29udHJvbAkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMgkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfQkdETAkweDAwIC8qIEJhdWQgRGl2aXNvciBMU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19CR0RICTB4MDEgLyogQmF1ZCBEaXZpc29yIE1TQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0VYQ1IxCTB4MDIgLyogRXh0ZW5kZWQgQ29udHJvbCAxCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRVhDUjIJMHgwNCAvKiBFeHRlbmRlZCBDb250cm9sIDIJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19UWEZMVgkweDA2IC8qIFRYIEZJRk8gTGV2ZWwJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfUlhGTFYJMHgwNyAvKiBSWCBGSUZPIExldmVsCQkJKi8KCQkJCSAgICAgIC8qIEJhbmsgMwkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTVJJRAkweDAwIC8qIE1vZHVsZSBJZGVudGlmaWNhdGlvbgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NIX0xDUgkweDAxIC8qIExDUiBTaGFkb3cJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfU0hfRkNSCTB4MDIgLyogRkNSIFNoYWRvdwkJCSovCgkJCQkgICAgICAvKiBCYW5rIDQJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IxCTB4MDIgLyogSW5mcmFyZWQgQ29udHJvbCAxCQkqLwoJCQkJICAgICAgLyogQmFuayA1CQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNSMgkweDA0IC8qIEluZnJhcmVkIENvbnRyb2wgMgkJKi8KCQkJCSAgICAgIC8qIEJhbmsgNgkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDUjMJMHgwMCAvKiBJbmZyYXJlZCBDb250cm9sIDMJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19TSVJfUFcJMHgwMiAvKiBTSVIgUHVsc2UgV2lkdGgJCSovCgkJCQkgICAgICAvKiBCYW5rIDcJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSUlhEQwkweDAwIC8qIElSIFJYIERlbW9kIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUlRYTUMJMHgwMSAvKiBJUiBUWCBNb2QgQ29udHJvbAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1JDQ0ZHCTB4MDIgLyogQ0VJUiBDb25maWcJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDRkcxCTB4MDQgLyogSW5mcmFyZWQgQ29uZmlnIDEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNGRzQJMHgwNyAvKiBJbmZyYXJlZCBDb25maWcgNAkJKi8KCi8qCiAqIE1hZ2ljIHZhbHVlcyBmb2xsb3cKICovCgovKiBObyBpbnRlcnJ1cHRzIGZvciBXQkNJUl9SRUdfU1AzX0lFUiBhbmQgV0JDSVJfUkVHX1NQM19FSVIgKi8KI2RlZmluZSBXQkNJUl9JUlFfTk9ORQkJMHgwMAovKiBSWCBkYXRhIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19JRVIgYW5kIFdCQ0lSX1JFR19TUDNfRUlSICovCiNkZWZpbmUgV0JDSVJfSVJRX1JYCQkweDAxCi8qIE92ZXIvVW5kZXItZmxvdyBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9FUlIJCTB4MDQKLyogTGVkIGVuYWJsZS9kaXNhYmxlIGJpdCBmb3IgV0JDSVJfUkVHX0VDRUlSX0NUUyAqLwojZGVmaW5lIFdCQ0lSX0xFRF9FTkFCTEUJMHg4MAovKiBSWCBkYXRhIGF2YWlsYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfTFNSICovCiNkZWZpbmUgV0JDSVJfUlhfQVZBSUwJCTB4MDEKLyogUlggZGlzYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfQVNDUiAqLwojZGVmaW5lIFdCQ0lSX1JYX0RJU0FCTEUJMHgyMAovKiBFeHRlbmRlZCBtb2RlIGVuYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfRVhDUjEgKi8KI2RlZmluZSBXQkNJUl9FWFRfRU5BQkxFCTB4MDEKLyogU2VsZWN0IGNvbXBhcmUgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9DT01QQVJFCTB4MTAKLyogU2VsZWN0IG1hc2sgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9NQVNLCTB4MjAKLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBzZWxlY3RlZCByZWdpc3RlciBpbiBXQkNJUl9SRUdfV0NFSVJfSU5ERVggKi8KI2RlZmluZSBXQkNJUl9SRUdfQUREUjAJCTB4MDAKCi8qIFZhbGlkIGJhbmtzIGZvciB0aGUgU1AzIFVBUlQgKi8KZW51bSB3YmNpcl9iYW5rIHsKCVdCQ0lSX0JBTktfMCAgICAgICAgICA9IDB4MDAsCglXQkNJUl9CQU5LXzEgICAgICAgICAgPSAweDgwLAoJV0JDSVJfQkFOS18yICAgICAgICAgID0gMHhFMCwKCVdCQ0lSX0JBTktfMyAgICAgICAgICA9IDB4RTQsCglXQkNJUl9CQU5LXzQgICAgICAgICAgPSAweEU4LAoJV0JDSVJfQkFOS181ICAgICAgICAgID0gMHhFQywKCVdCQ0lSX0JBTktfNiAgICAgICAgICA9IDB4RjAsCglXQkNJUl9CQU5LXzcgICAgICAgICAgPSAweEY0LAp9OwoKLyogU3VwcG9ydGVkIElSIFByb3RvY29scyAqLwplbnVtIHdiY2lyX3Byb3RvY29sIHsKCUlSX1BST1RPQ09MX1JDNSAgICAgICAgICA9IDB4MCwKCUlSX1BST1RPQ09MX05FQyAgICAgICAgICA9IDB4MSwKCUlSX1BST1RPQ09MX1JDNiAgICAgICAgICA9IDB4MiwKfTsKCi8qIE1pc2MgKi8KI2RlZmluZSBXQkNJUl9OQU1FCSJXaW5ib25kIENJUiIKI2RlZmluZSBXQkNJUl9JRF9GQU1JTFkgICAgICAgICAgMHhGMSAvKiBGYW1pbHkgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lCVdCQ0lSX0lEX0NISVAgICAgICAgICAgICAweDA0IC8qIENoaXAgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lIElSX0tFWVBSRVNTX1RJTUVPVVQgICAgICAgMjUwIC8qIEZJWE1FOiBzaG91bGQgYmUgcGVyLXByb3RvY29sPyAqLwojZGVmaW5lIElOVkFMSURfU0NBTkNPREUgICAweDdGRkZGRkZGIC8qIEludmFsaWQgd2l0aCBhbGwgcHJvdG9zCSovCiNkZWZpbmUgV0FLRVVQX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogV2FrZS1VcCBJL08gUmVnIExlbgkJKi8KI2RlZmluZSBFSEZVTkNfSU9NRU1fTEVOICAgICAgICAgMHgxMCAvKiBFbmhhbmNlZCBGdW5jIEkvTyBSZWcgTGVuCSovCiNkZWZpbmUgU1BfSU9NRU1fTEVOICAgICAgICAgICAgIDB4MDggLyogU2VyaWFsIFBvcnQgMyAoSVIpIFJlZyBMZW4JKi8KI2RlZmluZSBXQkNJUl9NQVhfSURMRV9CWVRFUyAgICAgICAxMAoKc3RhdGljIERFRklORV9TUElOTE9DSyh3YmNpcl9sb2NrKTsKc3RhdGljIERFRklORV9SV0xPQ0soa2V5dGFibGVfbG9jayk7CgpzdHJ1Y3Qgd2JjaXJfa2V5IHsKCXUzMiBzY2FuY29kZTsKCXVuc2lnbmVkIGludCBrZXljb2RlOwp9OwoKc3RydWN0IHdiY2lyX2tleWVudHJ5IHsKCXN0cnVjdCB3YmNpcl9rZXkga2V5OwoJc3RydWN0IGxpc3RfaGVhZCBsaXN0Owp9OwoKc3RhdGljIHN0cnVjdCB3YmNpcl9rZXkgcmM2X2RlZl9rZXltYXBbXSA9IHsKCXsgMHg4MDBGMDQwMCwgS0VZX05VTUVSSUNfMAkJfSwKCXsgMHg4MDBGMDQwMSwgS0VZX05VTUVSSUNfMQkJfSwKCXsgMHg4MDBGMDQwMiwgS0VZX05VTUVSSUNfMgkJfSwKCXsgMHg4MDBGMDQwMywgS0VZX05VTUVSSUNfMwkJfSwKCXsgMHg4MDBGMDQwNCwgS0VZX05VTUVSSUNfNAkJfSwKCXsgMHg4MDBGMDQwNSwgS0VZX05VTUVSSUNfNQkJfSwKCXsgMHg4MDBGMDQwNiwgS0VZX05VTUVSSUNfNgkJfSwKCXsgMHg4MDBGMDQwNywgS0VZX05VTUVSSUNfNwkJfSwKCXsgMHg4MDBGMDQwOCwgS0VZX05VTUVSSUNfOAkJfSwKCXsgMHg4MDBGMDQwOSwgS0VZX05VTUVSSUNfOQkJfSwKCXsgMHg4MDBGMDQxRCwgS0VZX05VTUVSSUNfU1RBUgkJfSwKCXsgMHg4MDBGMDQxQywgS0VZX05VTUVSSUNfUE9VTkQJCX0sCgl7IDB4ODAwRjA0MTAsIEtFWV9WT0xVTUVVUAkJfSwKCXsgMHg4MDBGMDQxMSwgS0VZX1ZPTFVNRURPV04JCX0sCgl7IDB4ODAwRjA0MTIsIEtFWV9DSEFOTkVMVVAJCX0sCgl7IDB4ODAwRjA0MTMsIEtFWV9DSEFOTkVMRE9XTgkJfSwKCXsgMHg4MDBGMDQwRSwgS0VZX01VVEUJCQl9LAoJeyAweDgwMEYwNDBELCBLRVlfVkVORE9SCQl9LCAvKiBWaXN0YSBMb2dvIEtleSAqLwoJeyAweDgwMEYwNDFFLCBLRVlfVVAJCQl9LAoJeyAweDgwMEYwNDFGLCBLRVlfRE9XTgkJCX0sCgl7IDB4ODAwRjA0MjAsIEtFWV9MRUZUCQkJfSwKCXsgMHg4MDBGMDQyMSwgS0VZX1JJR0hUCQkJfSwKCXsgMHg4MDBGMDQyMiwgS0VZX09LCQkJfSwKCXsgMHg4MDBGMDQyMywgS0VZX0VTQwkJCX0sCgl7IDB4ODAwRjA0MEYsIEtFWV9JTkZPCQkJfSwKCXsgMHg4MDBGMDQwQSwgS0VZX0NMRUFSCQkJfSwKCXsgMHg4MDBGMDQwQiwgS0VZX0VOVEVSCQkJfSwKCXsgMHg4MDBGMDQ1QiwgS0VZX1JFRAkJCX0sCgl7IDB4ODAwRjA0NUMsIEtFWV9HUkVFTgkJCX0sCgl7IDB4ODAwRjA0NUQsIEtFWV9ZRUxMT1cJCX0sCgl7IDB4ODAwRjA0NUUsIEtFWV9CTFVFCQkJfSwKCXsgMHg4MDBGMDQ1QSwgS0VZX1RFWFQJCQl9LAoJeyAweDgwMEYwNDI3LCBLRVlfU1dJVENIVklERU9NT0RFCX0sCgl7IDB4ODAwRjA0MEMsIEtFWV9QT1dFUgkJCX0sCgl7IDB4ODAwRjA0NTAsIEtFWV9SQURJTwkJCX0sCgl7IDB4ODAwRjA0NDgsIEtFWV9QVlIJCQl9LAoJeyAweDgwMEYwNDQ3LCBLRVlfQVVESU8JCQl9LAoJeyAweDgwMEYwNDI2LCBLRVlfRVBHCQkJfSwKCXsgMHg4MDBGMDQ0OSwgS0VZX0NBTUVSQQkJfSwKCXsgMHg4MDBGMDQyNSwgS0VZX1RWCQkJfSwKCXsgMHg4MDBGMDQ0QSwgS0VZX1ZJREVPCQkJfSwKCXsgMHg4MDBGMDQyNCwgS0VZX0RWRAkJCX0sCgl7IDB4ODAwRjA0MTYsIEtFWV9QTEFZCQkJfSwKCXsgMHg4MDBGMDQxOCwgS0VZX1BBVVNFCQkJfSwKCXsgMHg4MDBGMDQxOSwgS0VZX1NUT1AJCQl9LAoJeyAweDgwMEYwNDE0LCBLRVlfRkFTVEZPUldBUkQJCX0sCgl7IDB4ODAwRjA0MUEsIEtFWV9ORVhUCQkJfSwKCXsgMHg4MDBGMDQxQiwgS0VZX1BSRVZJT1VTCQl9LAoJeyAweDgwMEYwNDE1LCBLRVlfUkVXSU5ECQl9LAoJeyAweDgwMEYwNDE3LCBLRVlfUkVDT1JECQl9LAp9OwoKLyogUmVnaXN0ZXJzIGFuZCBvdGhlciBzdGF0ZSBpcyBwcm90ZWN0ZWQgYnkgd2JjaXJfbG9jayAqLwpzdHJ1Y3Qgd2JjaXJfZGF0YSB7Cgl1bnNpZ25lZCBsb25nIHdiYXNlOyAgICAgICAgLyogV2FrZS1VcCBCYXNlYWRkcgkJKi8KCXVuc2lnbmVkIGxvbmcgZWJhc2U7ICAgICAgICAvKiBFbmhhbmNlZCBGdW5jLiBCYXNlYWRkcgkqLwoJdW5zaWduZWQgbG9uZyBzYmFzZTsgICAgICAgIC8qIFNlcmlhbCBQb3J0IEJhc2VhZGRyCSovCgl1bnNpZ25lZCBpbnQgIGlycTsgICAgICAgICAgLyogU2VyaWFsIFBvcnQgSVJRCQkqLwoKCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX2tleXVwOwoJc3RydWN0IGxlZF90cmlnZ2VyICpyeHRyaWdnZXI7CglzdHJ1Y3QgbGVkX3RyaWdnZXIgKnR4dHJpZ2dlcjsKCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkOwoKCXUzMiBsYXN0X3NjYW5jb2RlOwoJdW5zaWduZWQgaW50IGxhc3Rfa2V5Y29kZTsKCXU4IGxhc3RfdG9nZ2xlOwoJdTgga2V5cHJlc3NlZDsKCXVuc2lnbmVkIGxvbmcga2V5dXBfamlmZmllczsKCXVuc2lnbmVkIGludCBpZGxlX2NvdW50OwoKCS8qIFJYIGlyZGF0YSBhbmQgcGFyc2luZyBzdGF0ZSAqLwoJdW5zaWduZWQgbG9uZyBpcmRhdGFbMzBdOwoJdW5zaWduZWQgaW50IGlyZGF0YV9jb3VudDsKCXVuc2lnbmVkIGludCBpcmRhdGFfaWRsZTsKCXVuc2lnbmVkIGludCBpcmRhdGFfb2ZmOwoJdW5zaWduZWQgaW50IGlyZGF0YV9lcnJvcjsKCgkvKiBQcm90ZWN0ZWQgYnkga2V5dGFibGVfbG9jayAqLwoJc3RydWN0IGxpc3RfaGVhZCBrZXl0YWJsZTsKfTsKCnN0YXRpYyBlbnVtIHdiY2lyX3Byb3RvY29sIHByb3RvY29sID0gSVJfUFJPVE9DT0xfUkM2Owptb2R1bGVfcGFyYW0ocHJvdG9jb2wsIHVpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHByb3RvY29sLCAiSVIgcHJvdG9jb2wgdG8gdXNlICIKCQkgIigwID0gUkM1LCAxID0gTkVDLCAyID0gUkM2QSwgZGVmYXVsdCkiKTsKCnN0YXRpYyBpbnQgaW52ZXJ0OyAvKiBkZWZhdWx0ID0gMCAqLwptb2R1bGVfcGFyYW0oaW52ZXJ0LCBib29sLCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhpbnZlcnQsICJJbnZlcnQgdGhlIHNpZ25hbCBmcm9tIHRoZSBJUiByZWNlaXZlciIpOwoKc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX3NjID0gMHg4MDBGMDQwQzsKbW9kdWxlX3BhcmFtKHdha2Vfc2MsIHVpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHdha2Vfc2MsICJTY2FuY29kZSBvZiB0aGUgcG93ZXItb24gSVIgY29tbWFuZCIpOwoKc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX3JjNm1vZGUgPSA2Owptb2R1bGVfcGFyYW0od2FrZV9yYzZtb2RlLCB1aW50LCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyh3YWtlX3JjNm1vZGUsICJSQzYgbW9kZSBmb3IgdGhlIHBvd2VyLW9uIGNvbW1hbmQgIgoJCSAiKDAgPSAwLCA2ID0gNkEsIGRlZmF1bHQpIik7CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBVVElMSVRZIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCB3YmNpcl9sb2NrICovCnN0YXRpYyB2b2lkCndiY2lyX3NldF9iaXRzKHVuc2lnbmVkIGxvbmcgYWRkciwgdTggYml0cywgdTggbWFzaykKewoJdTggdmFsOwoKCXZhbCA9IGluYihhZGRyKTsKCXZhbCA9ICgodmFsICYgfm1hc2spIHwgKGJpdHMgJiBtYXNrKSk7CglvdXRiKHZhbCwgYWRkcik7Cn0KCi8qIFNlbGVjdHMgdGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSBzZXJpYWwgcG9ydCAqLwpzdGF0aWMgaW5saW5lIHZvaWQKd2JjaXJfc2VsZWN0X2Jhbmsoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIGVudW0gd2JjaXJfYmFuayBiYW5rKQp7CglvdXRiKGJhbmssIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CU1IpOwp9CgpzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcwp3YmNpcl9sZWRfYnJpZ2h0bmVzc19nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAoJCQkJCSAgICAgICBzdHJ1Y3Qgd2JjaXJfZGF0YSwKCQkJCQkgICAgICAgbGVkKTsKCglpZiAoaW5iKGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUykgJiBXQkNJUl9MRURfRU5BQkxFKQoJCXJldHVybiBMRURfRlVMTDsKCWVsc2UKCQlyZXR1cm4gTEVEX09GRjsKfQoKc3RhdGljIHZvaWQKd2JjaXJfbGVkX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAoJCQkgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGNvbnRhaW5lcl9vZihsZWRfY2RldiwKCQkJCQkgICAgICAgc3RydWN0IHdiY2lyX2RhdGEsCgkJCQkJICAgICAgIGxlZCk7CgoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ1RTLAoJCSAgICAgICBicmlnaHRuZXNzID09IExFRF9PRkYgPyAweDAwIDogV0JDSVJfTEVEX0VOQUJMRSwKCQkgICAgICAgV0JDSVJfTEVEX0VOQUJMRSk7Cn0KCi8qIE1hbmNoZXN0ZXIgZW5jb2RlcyBiaXRzIHRvIFJDNiBtZXNzYWdlIGNlbGxzIChzZWUgd2JjaXJfcGFyc2VfcmM2KSAqLwpzdGF0aWMgdTgKd2JjaXJfdG9fcmM2Y2VsbHModTggdmFsKQp7Cgl1OCBjb2RlZCA9IDB4MDA7CglpbnQgaTsKCgl2YWwgJj0gMHgwRjsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlpZiAodmFsICYgMHgwMSkKCQkJY29kZWQgfD0gMHgwMiA8PCAoaSAqIDIpOwoJCWVsc2UKCQkJY29kZWQgfD0gMHgwMSA8PCAoaSAqIDIpOwoJCXZhbCA+Pj0gMTsKCX0KCglyZXR1cm4gY29kZWQ7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIElOUFVUIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdW5zaWduZWQgaW50CndiY2lyX2RvX2dldGtleWNvZGUoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEsIHUzMiBzY2FuY29kZSkKewoJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXllbnRyeTsKCXVuc2lnbmVkIGludCBrZXljb2RlID0gS0VZX1JFU0VSVkVEOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglyZWFkX2xvY2tfaXJxc2F2ZSgma2V5dGFibGVfbG9jaywgZmxhZ3MpOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoa2V5ZW50cnksICZkYXRhLT5rZXl0YWJsZSwgbGlzdCkgewoJCWlmIChrZXllbnRyeS0+a2V5LnNjYW5jb2RlID09IHNjYW5jb2RlKSB7CgkJCWtleWNvZGUgPSBrZXllbnRyeS0+a2V5LmtleWNvZGU7CgkJCWJyZWFrOwoJCX0KCX0KCglyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZrZXl0YWJsZV9sb2NrLCBmbGFncyk7CglyZXR1cm4ga2V5Y29kZTsKfQoKc3RhdGljIGludAp3YmNpcl9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKCgkqa2V5Y29kZSA9IChpbnQpd2JjaXJfZG9fZ2V0a2V5Y29kZShkYXRhLCAodTMyKXNjYW5jb2RlKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CndiY2lyX3NldGtleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc3NjYW5jb2RlLCBpbnQga2V5Y29kZSkKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwoJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXllbnRyeTsKCXN0cnVjdCB3YmNpcl9rZXllbnRyeSAqbmV3X2tleWVudHJ5OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGludCBvbGRfa2V5Y29kZSA9IEtFWV9SRVNFUlZFRDsKCXUzMiBzY2FuY29kZSA9ICh1MzIpc3NjYW5jb2RlOwoKCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKCQlyZXR1cm4gLUVJTlZBTDsKCgluZXdfa2V5ZW50cnkgPSBrbWFsbG9jKHNpemVvZigqbmV3X2tleWVudHJ5KSwgR0ZQX0tFUk5FTCk7CglpZiAoIW5ld19rZXllbnRyeSkKCQlyZXR1cm4gLUVOT01FTTsKCgl3cml0ZV9sb2NrX2lycXNhdmUoJmtleXRhYmxlX2xvY2ssIGZsYWdzKTsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KGtleWVudHJ5LCAmZGF0YS0+a2V5dGFibGUsIGxpc3QpIHsKCQlpZiAoa2V5ZW50cnktPmtleS5zY2FuY29kZSAhPSBzY2FuY29kZSkKCQkJY29udGludWU7CgoJCW9sZF9rZXljb2RlID0ga2V5ZW50cnktPmtleS5rZXljb2RlOwoJCWtleWVudHJ5LT5rZXkua2V5Y29kZSA9IGtleWNvZGU7CgoJCWlmIChrZXllbnRyeS0+a2V5LmtleWNvZGUgPT0gS0VZX1JFU0VSVkVEKSB7CgkJCWxpc3RfZGVsKCZrZXllbnRyeS0+bGlzdCk7CgkJCWtmcmVlKGtleWVudHJ5KTsKCQl9CgoJCWJyZWFrOwoJfQoKCXNldF9iaXQoa2V5Y29kZSwgZGV2LT5rZXliaXQpOwoKCWlmIChvbGRfa2V5Y29kZSA9PSBLRVlfUkVTRVJWRUQpIHsKCQluZXdfa2V5ZW50cnktPmtleS5zY2FuY29kZSA9IHNjYW5jb2RlOwoJCW5ld19rZXllbnRyeS0+a2V5LmtleWNvZGUgPSBrZXljb2RlOwoJCWxpc3RfYWRkKCZuZXdfa2V5ZW50cnktPmxpc3QsICZkYXRhLT5rZXl0YWJsZSk7Cgl9IGVsc2UgewoJCWtmcmVlKG5ld19rZXllbnRyeSk7CgkJY2xlYXJfYml0KG9sZF9rZXljb2RlLCBkZXYtPmtleWJpdCk7CgkJbGlzdF9mb3JfZWFjaF9lbnRyeShrZXllbnRyeSwgJmRhdGEtPmtleXRhYmxlLCBsaXN0KSB7CgkJCWlmIChrZXllbnRyeS0+a2V5LmtleWNvZGUgPT0gb2xkX2tleWNvZGUpIHsKCQkJCXNldF9iaXQob2xkX2tleWNvZGUsIGRldi0+a2V5Yml0KTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZrZXl0YWJsZV9sb2NrLCBmbGFncyk7CglyZXR1cm4gMDsKfQoKLyoKICogVGltZXIgZnVuY3Rpb24gdG8gcmVwb3J0IGtleXVwIGV2ZW50IHNvbWUgdGltZSBhZnRlciBrZXlkb3duIGlzCiAqIHJlcG9ydGVkIGJ5IHRoZSBJU1IuCiAqLwpzdGF0aWMgdm9pZAp3YmNpcl9rZXl1cCh1bnNpZ25lZCBsb25nIGNvb2tpZSkKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSAoc3RydWN0IHdiY2lyX2RhdGEgKiljb29raWU7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCS8qCgkgKiBkYXRhLT5rZXl1cF9qaWZmaWVzIGlzIHVzZWQgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIGlmIGEKCSAqIGhhcmR3YXJlIGludGVycnVwdCBvY2N1cnMgYXQgdGhpcyBwb2ludCBhbmQgdGhlIGtleXVwIHRpbWVyCgkgKiBldmVudCBpcyBtb3ZlZCBmdXJ0aGVyIGludG8gdGhlIGZ1dHVyZSBhcyBhIHJlc3VsdC4KCSAqCgkgKiBUaGUgdGltZXIgd2lsbCB0aGVuIGJlIHJlYWN0aXZhdGVkIGFuZCB0aGlzIGZ1bmN0aW9uIGNhbGxlZAoJICogYWdhaW4gaW4gdGhlIGZ1dHVyZS4gV2UgbmVlZCB0byBleGl0IGdyYWNlZnVsbHkgaW4gdGhhdCBjYXNlCgkgKiB0byBhbGxvdyB0aGUgaW5wdXQgc3Vic3lzdGVtIHRvIGRvIGl0cyBhdXRvLXJlcGVhdCBtYWdpYyBvcgoJICogYSBrZXl1cCBldmVudCBtaWdodCBmb2xsb3cgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGtleWRvd24uCgkgKi8KCglzcGluX2xvY2tfaXJxc2F2ZSgmd2JjaXJfbG9jaywgZmxhZ3MpOwoKCWlmICh0aW1lX2lzX2FmdGVyX2VxX2ppZmZpZXMoZGF0YS0+a2V5dXBfamlmZmllcykgJiYgZGF0YS0+a2V5cHJlc3NlZCkgewoJCWRhdGEtPmtleXByZXNzZWQgPSAwOwoJCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwgTEVEX09GRik7CgkJaW5wdXRfcmVwb3J0X2tleShkYXRhLT5pbnB1dF9kZXYsIGRhdGEtPmxhc3Rfa2V5Y29kZSwgMCk7CgkJaW5wdXRfc3luYyhkYXRhLT5pbnB1dF9kZXYpOwoJfQoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndiY2lyX2xvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQKd2JjaXJfa2V5ZG93bihzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgdTMyIHNjYW5jb2RlLCB1OCB0b2dnbGUpCnsKCXVuc2lnbmVkIGludCBrZXljb2RlOwoKCS8qIFJlcGVhdD8gKi8KCWlmIChkYXRhLT5sYXN0X3NjYW5jb2RlID09IHNjYW5jb2RlICYmCgkgICAgZGF0YS0+bGFzdF90b2dnbGUgPT0gdG9nZ2xlICYmCgkgICAgZGF0YS0+a2V5cHJlc3NlZCkKCQlnb3RvIHNldF90aW1lcjsKCWRhdGEtPmxhc3Rfc2NhbmNvZGUgPSBzY2FuY29kZTsKCgkvKiBEbyB3ZSBuZWVkIHRvIHJlbGVhc2UgYW4gb2xkIGtleXByZXNzPyAqLwoJaWYgKGRhdGEtPmtleXByZXNzZWQpIHsKCQlpbnB1dF9yZXBvcnRfa2V5KGRhdGEtPmlucHV0X2RldiwgZGF0YS0+bGFzdF9rZXljb2RlLCAwKTsKCQlpbnB1dF9zeW5jKGRhdGEtPmlucHV0X2Rldik7CgkJZGF0YS0+a2V5cHJlc3NlZCA9IDA7Cgl9CgoJLyogUmVwb3J0IHNjYW5jb2RlICovCglpbnB1dF9ldmVudChkYXRhLT5pbnB1dF9kZXYsIEVWX01TQywgTVNDX1NDQU4sIChpbnQpc2NhbmNvZGUpOwoKCS8qIERvIHdlIGtub3cgdGhpcyBzY2FuY29kZT8gKi8KCWtleWNvZGUgPSB3YmNpcl9kb19nZXRrZXljb2RlKGRhdGEsIHNjYW5jb2RlKTsKCWlmIChrZXljb2RlID09IEtFWV9SRVNFUlZFRCkKCQlnb3RvIHNldF90aW1lcjsKCgkvKiBSZWdpc3RlciBhIGtleXByZXNzICovCglpbnB1dF9yZXBvcnRfa2V5KGRhdGEtPmlucHV0X2Rldiwga2V5Y29kZSwgMSk7CglkYXRhLT5rZXlwcmVzc2VkID0gMTsKCWRhdGEtPmxhc3Rfa2V5Y29kZSA9IGtleWNvZGU7CglkYXRhLT5sYXN0X3RvZ2dsZSA9IHRvZ2dsZTsKCnNldF90aW1lcjoKCWlucHV0X3N5bmMoZGF0YS0+aW5wdXRfZGV2KTsKCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwKCQkJICBkYXRhLT5rZXlwcmVzc2VkID8gTEVEX0ZVTEwgOiBMRURfT0ZGKTsKCWRhdGEtPmtleXVwX2ppZmZpZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJUl9LRVlQUkVTU19USU1FT1VUKTsKCW1vZF90aW1lcigmZGF0YS0+dGltZXJfa2V5dXAsIGRhdGEtPmtleXVwX2ppZmZpZXMpOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBJUiBQQVJTSU5HIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBSZXNldHMgYWxsIGlyZGF0YSAqLwpzdGF0aWMgdm9pZAp3YmNpcl9yZXNldF9pcmRhdGEoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEpCnsKCW1lbXNldChkYXRhLT5pcmRhdGEsIDAsIHNpemVvZihkYXRhLT5pcmRhdGEpKTsKCWRhdGEtPmlyZGF0YV9jb3VudCA9IDA7CglkYXRhLT5pcmRhdGFfb2ZmID0gMDsKCWRhdGEtPmlyZGF0YV9lcnJvciA9IDA7CglkYXRhLT5pZGxlX2NvdW50ID0gMDsKfQoKLyogQWRkcyBvbmUgYml0IG9mIGlyZGF0YSAqLwpzdGF0aWMgdm9pZAphZGRfaXJkYXRhX2JpdChzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgaW50IHNldCkKewoJaWYgKGRhdGEtPmlyZGF0YV9jb3VudCA+PSBzaXplb2YoZGF0YS0+aXJkYXRhKSAqIDgpIHsKCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOwoJCXJldHVybjsKCX0KCglpZiAoc2V0KQoJCV9fc2V0X2JpdChkYXRhLT5pcmRhdGFfY291bnQsIGRhdGEtPmlyZGF0YSk7CglkYXRhLT5pcmRhdGFfY291bnQrKzsKfQoKLyogR2V0cyBjb3VudCBiaXRzIG9mIGlyZGF0YSAqLwpzdGF0aWMgdTE2CmdldF9iaXRzKHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhLCBpbnQgY291bnQpCnsKCXUxNiB2YWwgPSAweDA7CgoJaWYgKGRhdGEtPmlyZGF0YV9jb3VudCAtIGRhdGEtPmlyZGF0YV9vZmYgPCBjb3VudCkgewoJCWRhdGEtPmlyZGF0YV9lcnJvciA9IDE7CgkJcmV0dXJuIDB4MDsKCX0KCgl3aGlsZSAoY291bnQgPiAwKSB7CgkJdmFsIDw8PSAxOwoJCWlmICh0ZXN0X2JpdChkYXRhLT5pcmRhdGFfb2ZmLCBkYXRhLT5pcmRhdGEpKQoJCQl2YWwgfD0gMHgxOwoJCWNvdW50LS07CgkJZGF0YS0+aXJkYXRhX29mZisrOwoJfQoKCXJldHVybiB2YWw7Cn0KCi8qIFJlYWRzIDE2IGNlbGxzIGFuZCBjb252ZXJ0cyB0aGVtIHRvIGEgYnl0ZSAqLwpzdGF0aWMgdTgKd2JjaXJfcmM2Y2VsbHNfdG9fYnl0ZShzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKewoJdTE2IHJhdyA9IGdldF9iaXRzKGRhdGEsIDE2KTsKCXU4IHZhbCA9IDB4MDA7CglpbnQgYml0OwoKCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKCQlzd2l0Y2ggKHJhdyAmIDB4MDMpIHsKCQljYXNlIDB4MDE6CgkJCWJyZWFrOwoJCWNhc2UgMHgwMjoKCQkJdmFsIHw9ICgweDAxIDw8IGJpdCk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWRhdGEtPmlyZGF0YV9lcnJvciA9IDE7CgkJCWJyZWFrOwoJCX0KCQlyYXcgPj49IDI7Cgl9CgoJcmV0dXJuIHZhbDsKfQoKLyogRGVjb2RlcyBhIG51bWJlciBvZiBiaXRzIGZyb20gcmF3IFJDNSBkYXRhICovCnN0YXRpYyB1OAp3YmNpcl9nZXRfcmM1Yml0cyhzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQp7Cgl1MTYgcmF3ID0gZ2V0X2JpdHMoZGF0YSwgY291bnQgKiAyKTsKCXU4IHZhbCA9IDB4MDA7CglpbnQgYml0OwoKCWZvciAoYml0ID0gMDsgYml0IDwgY291bnQ7IGJpdCsrKSB7CgkJc3dpdGNoIChyYXcgJiAweDAzKSB7CgkJY2FzZSAweDAxOgoJCQl2YWwgfD0gKDB4MDEgPDwgYml0KTsKCQkJYnJlYWs7CgkJY2FzZSAweDAyOgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOwoJCQlicmVhazsKCQl9CgkJcmF3ID4+PSAyOwoJfQoKCXJldHVybiB2YWw7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX3BhcnNlX3JjNihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQp7CgkvKgoJICogTm9ybWFsIGJpdHMgYXJlIG1hbmNoZXN0ZXIgY29kZWQgYXMgZm9sbG93czoKCSAqIGNlbGwwICsgY2VsbDEgPSBsb2dpYyAiMCIKCSAqIGNlbGwxICsgY2VsbDAgPSBsb2dpYyAiMSIKCSAqCgkgKiBUaGUgSVIgcHVsc2UgaGFzIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czoKCSAqCgkgKiBMZWFkZXIJCS0gNiAqIGNlbGwxIC0gZGlzY2FyZGVkCgkgKiBHYXAgICAgCQktIDIgKiBjZWxsMCAtIGRpc2NhcmRlZAoJICogU3RhcnQgYml0CQktIE5vcm1hbCBDb2RpbmcgLSBhbHdheXMgIjEiCgkgKiBNb2RlIEJpdCAyIC0gMAktIE5vcm1hbCBDb2RpbmcKCSAqIFRvZ2dsZSBiaXQJCS0gTm9ybWFsIENvZGluZyB3aXRoIGRvdWJsZSBiaXQgdGltZSwKCSAqCQkJICBlLmcuIGNlbGwwICsgY2VsbDAgKyBjZWxsMSArIGNlbGwxCgkgKgkJCSAgbWVhbnMgbG9naWMgIjAiLgoJICoKCSAqIFRoZSByZXN0IGRlcGVuZHMgb24gdGhlIG1vZGUsIHRoZSBmb2xsb3dpbmcgbW9kZXMgYXJlIGtub3duOgoJICoKCSAqIE1PREUgMDoKCSAqICBBZGRyZXNzIEJpdCA3IC0gMAktIE5vcm1hbCBDb2RpbmcKCSAqICBDb21tYW5kIEJpdCA3IC0gMAktIE5vcm1hbCBDb2RpbmcKCSAqCgkgKiBNT0RFIDY6CgkgKiAgVGhlIGFib3ZlIFRvZ2dsZSBCaXQgaXMgdXNlZCBhcyBhIHN1Ym1vZGUgYml0LCAwID0gQSwgMSA9IEIuCgkgKiAgU3VibW9kZSBCIGlzIGZvciBwb2ludGluZyBkZXZpY2VzLCBvbmx5IHJlbW90ZXMgdXNpbmcgc3VibW9kZSBBCgkgKiAgYXJlIHN1cHBvcnRlZC4KCSAqCgkgKiAgQ3VzdG9tZXIgcmFuZ2UgYml0CS0gMCA9PiBDdXN0b21lciA9IDcgYml0cywgMC4uLjEyNwoJICogICAgICAgICAgICAgICAgICAgICAgICAxID0+IEN1c3RvbWVyID0gMTUgYml0cywgMzI3NjguLi42NTUzNQoJICogIEN1c3RvbWVyIEJpdHMJLSBOb3JtYWwgQ29kaW5nCgkgKgoJICogIEN1c3RvbWVyIGNvZGVzIGFyZSBhbGxvY2F0ZWQgYnkgUGhpbGlwcy4gVGhlIHJlc3Qgb2YgdGhlIGJpdHMKCSAqICBhcmUgY3VzdG9tZXIgZGVwZW5kZW50LiBUaGUgZm9sbG93aW5nIGlzIGNvbW1vbmx5IHVzZWQgKGFuZCB0aGUKCSAqICBvbmx5IHN1cHBvcnRlZCBjb25maWcpOgoJICoKCSAqICBUb2dnbGUgQml0CQktIE5vcm1hbCBDb2RpbmcKCSAqICBBZGRyZXNzIEJpdCA2IC0gMAktIE5vcm1hbCBDb2RpbmcKCSAqICBDb21tYW5kIEJpdCA3IC0gMAktIE5vcm1hbCBDb2RpbmcKCSAqCgkgKiBBbGwgbW9kZXMgYXJlIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IDYgKiBjZWxsMC4KCSAqCgkgKiBNT0RFIDAgbXNnbGVuOgoJICogIDEgKiAyIChzdGFydCBiaXQpICsgMyAqIDIgKG1vZGUpICsgMiAqIDIgKHRvZ2dsZSkgKwoJICogIDggKiAyIChhZGRyZXNzKSArIDggKiAyIChjb21tYW5kKSA9CgkgKiAgNDQgY2VsbHMKCSAqCgkgKiBNT0RFIDZBIG1zZ2xlbjoKCSAqICAxICogMiAoc3RhcnQgYml0KSArIDMgKiAyIChtb2RlKSArIDIgKiAyIChzdWJtb2RlKSArCgkgKiAgMSAqIDIgKGN1c3RvbWVyIHJhbmdlIGJpdCkgKyA3LzE1ICogMiAoY3VzdG9tZXIgYml0cykgKwoJICogIDEgKiAyICh0b2dnbGUgYml0KSArIDcgKiAyIChhZGRyZXNzKSArIDggKiAyIChjb21tYW5kKSA9CgkgKiAgNjAgLSA3NiBjZWxscwoJICovCgl1OCBtb2RlOwoJdTggdG9nZ2xlOwoJdTE2IGN1c3RvbWVyID0gMHgwOwoJdTggYWRkcmVzczsKCXU4IGNvbW1hbmQ7Cgl1MzIgc2NhbmNvZGU7CgoJLyogTGVhZGVyIG1hcmsgKi8KCXdoaWxlIChnZXRfYml0cyhkYXRhLCAxKSAmJiAhZGF0YS0+aXJkYXRhX2Vycm9yKQoJCS8qIERvIG5vdGhpbmcgKi87CgoJLyogTGVhZGVyIHNwYWNlICovCglpZiAoZ2V0X2JpdHMoZGF0YSwgMSkpIHsKCQlkZXZfZGJnKGRldiwgIlJDNiAtIEludmFsaWQgbGVhZGVyIHNwYWNlXG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogU3RhcnQgYml0ICovCglpZiAoZ2V0X2JpdHMoZGF0YSwgMikgIT0gMHgwMikgewoJCWRldl9kYmcoZGV2LCAiUkM2IC0gSW52YWxpZCBzdGFydCBiaXRcbiIpOwoJCXJldHVybjsKCX0KCgkvKiBNb2RlICovCgltb2RlID0gZ2V0X2JpdHMoZGF0YSwgNik7Cglzd2l0Y2ggKG1vZGUpIHsKCWNhc2UgMHgxNTogLyogMDEwMTAxID0gYjAwMCAqLwoJCW1vZGUgPSAwOwoJCWJyZWFrOwoJY2FzZSAweDI5OiAvKiAxMDEwMDEgPSBiMTEwICovCgkJbW9kZSA9IDY7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWRldl9kYmcoZGV2LCAiUkM2IC0gSW52YWxpZCBtb2RlXG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogVG9nZ2xlIGJpdCAvIFN1Ym1vZGUgYml0ICovCgl0b2dnbGUgPSBnZXRfYml0cyhkYXRhLCA0KTsKCXN3aXRjaCAodG9nZ2xlKSB7CgljYXNlIDB4MDM6CgkJdG9nZ2xlID0gMDsKCQlicmVhazsKCWNhc2UgMHgwQzoKCQl0b2dnbGUgPSAxOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZGJnKGRldiwgIlJDNiAtIFRvZ2dsZSBiaXQgZXJyb3JcbiIpOwoJCWJyZWFrOwoJfQoKCS8qIEN1c3RvbWVyICovCglpZiAobW9kZSA9PSA2KSB7CgkJaWYgKHRvZ2dsZSAhPSAwKSB7CgkJCWRldl9kYmcoZGV2LCAiUkM2QiAtIE5vdCBTdXBwb3J0ZWRcbiIpOwoJCQlyZXR1cm47CgkJfQoKCQljdXN0b21lciA9IHdiY2lyX3JjNmNlbGxzX3RvX2J5dGUoZGF0YSk7CgoJCWlmIChjdXN0b21lciAmIDB4ODApIHsKCQkJLyogMTUgYml0IGN1c3RvbWVyIHZhbHVlICovCgkJCWN1c3RvbWVyIDw8PSA4OwoJCQljdXN0b21lciB8PSB3YmNpcl9yYzZjZWxsc190b19ieXRlKGRhdGEpOwoJCX0KCX0KCgkvKiBBZGRyZXNzICovCglhZGRyZXNzID0gd2JjaXJfcmM2Y2VsbHNfdG9fYnl0ZShkYXRhKTsKCWlmIChtb2RlID09IDYpIHsKCQl0b2dnbGUgPSBhZGRyZXNzID4+IDc7CgkJYWRkcmVzcyAmPSAweDdGOwoJfQoKCS8qIENvbW1hbmQgKi8KCWNvbW1hbmQgPSB3YmNpcl9yYzZjZWxsc190b19ieXRlKGRhdGEpOwoKCS8qIENyZWF0ZSBzY2FuY29kZSAqLwoJc2NhbmNvZGUgPSAgY29tbWFuZDsKCXNjYW5jb2RlIHw9IGFkZHJlc3MgPDwgODsKCXNjYW5jb2RlIHw9IGN1c3RvbWVyIDw8IDE2OwoKCS8qIExhc3Qgc2FuaXR5IGNoZWNrICovCglpZiAoZGF0YS0+aXJkYXRhX2Vycm9yKSB7CgkJZGV2X2RiZyhkZXYsICJSQzYgLSBDZWxsIGVycm9yKHMpXG4iKTsKCQlyZXR1cm47Cgl9CgoJZGV2X2RiZyhkZXYsICJJUi1SQzYgYWQgMHglMDJYIGNtIDB4JTAyWCBjdSAweCUwNFggIgoJCSJ0b2dnbGUgJXUgbW9kZSAldSBzY2FuIDB4JTA4WFxuIiwKCQlhZGRyZXNzLAoJCWNvbW1hbmQsCgkJY3VzdG9tZXIsCgkJKHVuc2lnbmVkIGludCl0b2dnbGUsCgkJKHVuc2lnbmVkIGludCltb2RlLAoJCXNjYW5jb2RlKTsKCgl3YmNpcl9rZXlkb3duKGRhdGEsIHNjYW5jb2RlLCB0b2dnbGUpOwp9CgpzdGF0aWMgdm9pZAp3YmNpcl9wYXJzZV9yYzUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKewoJLyoKCSAqIEJpdHMgYXJlIG1hbmNoZXN0ZXIgY29kZWQgYXMgZm9sbG93czoKCSAqIGNlbGwxICsgY2VsbDAgPSBsb2dpYyAiMCIKCSAqIGNlbGwwICsgY2VsbDEgPSBsb2dpYyAiMSIKCSAqIChpLmUuIHRoZSByZXZlcnNlIG9mIFJDNikKCSAqCgkgKiBTdGFydCBiaXQgMQkJLSAiMSIgLSBkaXNjYXJkZWQKCSAqIFN0YXJ0IGJpdCAyCQktIE11c3QgYmUgaW52ZXJ0ZWQgdG8gZ2V0IGNvbW1hbmQgYml0IDYKCSAqIFRvZ2dsZSBiaXQKCSAqIEFkZHJlc3MgQml0IDQgLSAwCgkgKiBDb21tYW5kIEJpdCA1IC0gMAoJICovCgl1OCB0b2dnbGU7Cgl1OCBhZGRyZXNzOwoJdTggY29tbWFuZDsKCXUzMiBzY2FuY29kZTsKCgkvKiBTdGFydCBiaXQgMSAqLwoJaWYgKCFnZXRfYml0cyhkYXRhLCAxKSkgewoJCWRldl9kYmcoZGV2LCAiUkM1IC0gSW52YWxpZCBzdGFydCBiaXRcbiIpOwoJCXJldHVybjsKCX0KCgkvKiBTdGFydCBiaXQgMiAqLwoJaWYgKCF3YmNpcl9nZXRfcmM1Yml0cyhkYXRhLCAxKSkKCQljb21tYW5kID0gMHg0MDsKCWVsc2UKCQljb21tYW5kID0gMHgwMDsKCgl0b2dnbGUgICA9IHdiY2lyX2dldF9yYzViaXRzKGRhdGEsIDEpOwoJYWRkcmVzcyAgPSB3YmNpcl9nZXRfcmM1Yml0cyhkYXRhLCA1KTsKCWNvbW1hbmQgfD0gd2JjaXJfZ2V0X3JjNWJpdHMoZGF0YSwgNik7CglzY2FuY29kZSA9IGFkZHJlc3MgPDwgNyB8IGNvbW1hbmQ7CgoJLyogTGFzdCBzYW5pdHkgY2hlY2sgKi8KCWlmIChkYXRhLT5pcmRhdGFfZXJyb3IpIHsKCQlkZXZfZGJnKGRldiwgIlJDNSAtIEludmFsaWQgbWVzc2FnZVxuIik7CgkJcmV0dXJuOwoJfQoKCWRldl9kYmcoZGV2LCAiSVItUkM1IGFkICV1IGNtICV1IHQgJXUgcyAldVxuIiwKCQkodW5zaWduZWQgaW50KWFkZHJlc3MsCgkJKHVuc2lnbmVkIGludCljb21tYW5kLAoJCSh1bnNpZ25lZCBpbnQpdG9nZ2xlLAoJCSh1bnNpZ25lZCBpbnQpc2NhbmNvZGUpOwoKCXdiY2lyX2tleWRvd24oZGF0YSwgc2NhbmNvZGUsIHRvZ2dsZSk7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX3BhcnNlX25lYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhKQp7CgkvKgoJICogRWFjaCBiaXQgcmVwcmVzZW50cyA1NjAgdXMuCgkgKgoJICogTGVhZGVyCQktIDkgbXMgYnVyc3QKCSAqIEdhcAkJCS0gNC41IG1zIHNpbGVuY2UKCSAqIEFkZHJlc3MxIGJpdCAwIC0gNwktIEFkZHJlc3MgMQoJICogQWRkcmVzczIgYml0IDAgLSA3CS0gQWRkcmVzcyAyCgkgKiBDb21tYW5kMSBiaXQgMCAtIDcJLSBDb21tYW5kIDEKCSAqIENvbW1hbmQyIGJpdCAwIC0gNwktIENvbW1hbmQgMgoJICoKCSAqIE5vdGUgdGhlIGJpdCBvcmRlciEKCSAqCgkgKiBXaXRoIHRoZSBvbGQgTkVDIHByb3RvY29sLCBBZGRyZXNzMiB3YXMgdGhlIGludmVyc2Ugb2YgQWRkcmVzczEKCSAqIGFuZCBDb21tYW5kMiB3YXMgdGhlIGludmVyc2Ugb2YgQ29tbWFuZDEgYW5kIHdlcmUgdXNlZCBhcwoJICogYW4gZXJyb3IgY2hlY2suCgkgKgoJICogV2l0aCBORUMgZXh0ZW5kZWQsIEFkZHJlc3MxIGlzIHRoZSBMU0Igb2YgdGhlIEFkZHJlc3MgYW5kCgkgKiBBZGRyZXNzMiBpcyB0aGUgTVNCLCBDb21tYW5kIHBhcnNpbmcgcmVtYWlucyB1bmNoYW5nZWQuCgkgKgoJICogQSByZXBlYXQgbWVzc2FnZSBpcyBjb2RlZCBhczoKCSAqIExlYWRlcgkJLSA5IG1zIGJ1cnN0CgkgKiBHYXAJCQktIDIuMjUgbXMgc2lsZW5jZQoJICogUmVwZWF0CQktIDU2MCB1cyBhY3RpdmUKCSAqLwoJdTggYWRkcmVzczE7Cgl1OCBhZGRyZXNzMjsKCXU4IGNvbW1hbmQxOwoJdTggY29tbWFuZDI7Cgl1MTYgYWRkcmVzczsKCXUzMiBzY2FuY29kZTsKCgkvKiBMZWFkZXIgbWFyayAqLwoJd2hpbGUgKGdldF9iaXRzKGRhdGEsIDEpICYmICFkYXRhLT5pcmRhdGFfZXJyb3IpCgkJLyogRG8gbm90aGluZyAqLzsKCgkvKiBMZWFkZXIgc3BhY2UgKi8KCWlmIChnZXRfYml0cyhkYXRhLCA0KSkgewoJCWRldl9kYmcoZGV2LCAiTkVDIC0gSW52YWxpZCBsZWFkZXIgc3BhY2VcbiIpOwoJCXJldHVybjsKCX0KCgkvKiBSZXBlYXQ/ICovCglpZiAoZ2V0X2JpdHMoZGF0YSwgMSkpIHsKCQlpZiAoIWRhdGEtPmtleXByZXNzZWQpIHsKCQkJZGV2X2RiZyhkZXYsICJORUMgLSBTdHJheSByZXBlYXQgbWVzc2FnZVxuIik7CgkJCXJldHVybjsKCQl9CgoJCWRldl9kYmcoZGV2LCAiSVItTkVDIHJlcGVhdCBzICV1XG4iLAoJCQkodW5zaWduZWQgaW50KWRhdGEtPmxhc3Rfc2NhbmNvZGUpOwoKCQl3YmNpcl9rZXlkb3duKGRhdGEsIGRhdGEtPmxhc3Rfc2NhbmNvZGUsIGRhdGEtPmxhc3RfdG9nZ2xlKTsKCQlyZXR1cm47Cgl9CgoJLyogUmVtYWluaW5nIGxlYWRlciBzcGFjZSAqLwoJaWYgKGdldF9iaXRzKGRhdGEsIDMpKSB7CgkJZGV2X2RiZyhkZXYsICJORUMgLSBJbnZhbGlkIGxlYWRlciBzcGFjZVxuIik7CgkJcmV0dXJuOwoJfQoKCWFkZHJlc3MxICA9IGJpdHJldjgoZ2V0X2JpdHMoZGF0YSwgOCkpOwoJYWRkcmVzczIgID0gYml0cmV2OChnZXRfYml0cyhkYXRhLCA4KSk7Cgljb21tYW5kMSAgPSBiaXRyZXY4KGdldF9iaXRzKGRhdGEsIDgpKTsKCWNvbW1hbmQyICA9IGJpdHJldjgoZ2V0X2JpdHMoZGF0YSwgOCkpOwoKCS8qIFNhbml0eSBjaGVjayAqLwoJaWYgKGRhdGEtPmlyZGF0YV9lcnJvcikgewoJCWRldl9kYmcoZGV2LCAiTkVDIC0gSW52YWxpZCBtZXNzYWdlXG4iKTsKCQlyZXR1cm47Cgl9CgoJLyogQ2hlY2sgY29tbWFuZCB2YWxpZGl0eSAqLwoJaWYgKGNvbW1hbmQxICE9IH5jb21tYW5kMikgewoJCWRldl9kYmcoZGV2LCAiTkVDIC0gQ29tbWFuZCBieXRlcyBtaXNtYXRjaFxuIik7CgkJcmV0dXJuOwoJfQoKCS8qIENoZWNrIGZvciBleHRlbmRlZCBORUMgcHJvdG9jb2wgKi8KCWFkZHJlc3MgPSBhZGRyZXNzMTsKCWlmIChhZGRyZXNzMSAhPSB+YWRkcmVzczIpCgkJYWRkcmVzcyB8PSBhZGRyZXNzMiA8PCA4OwoKCXNjYW5jb2RlID0gYWRkcmVzcyA8PCA4IHwgY29tbWFuZDE7CgoJZGV2X2RiZyhkZXYsICJJUi1ORUMgYWQgJXUgY20gJXUgcyAldVxuIiwKCQkodW5zaWduZWQgaW50KWFkZHJlc3MsCgkJKHVuc2lnbmVkIGludCljb21tYW5kMSwKCQkodW5zaWduZWQgaW50KXNjYW5jb2RlKTsKCgl3YmNpcl9rZXlkb3duKGRhdGEsIHNjYW5jb2RlLCAhZGF0YS0+bGFzdF90b2dnbGUpOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBJTlRFUlJVUFQgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpcnFyZXR1cm5fdAp3YmNpcl9pcnFfaGFuZGxlcihpbnQgaXJxbm8sIHZvaWQgKmNvb2tpZSkKewoJc3RydWN0IHBucF9kZXYgKmRldmljZSA9IGNvb2tpZTsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CglzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGV2aWNlLT5kZXY7Cgl1OCBzdGF0dXM7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTggaXJkYXRhWzhdOwoJaW50IGk7Cgl1bnNpZ25lZCBpbnQgaHc7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJndiY2lyX2xvY2ssIGZsYWdzKTsKCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoKCXN0YXR1cyA9IGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRUlSKTsKCglpZiAoIShzdGF0dXMgJiAoV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUikpKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2JjaXJfbG9jaywgZmxhZ3MpOwoJCXJldHVybiBJUlFfTk9ORTsKCX0KCglpZiAoc3RhdHVzICYgV0JDSVJfSVJRX0VSUikKCQlkYXRhLT5pcmRhdGFfZXJyb3IgPSAxOwoKCWlmICghKHN0YXR1cyAmIFdCQ0lSX0lSUV9SWCkpCgkJZ290byBvdXQ7CgoJLyogU2luY2UgUlhIRExFViBpcyBzZXQsIGF0IGxlYXN0IDggYnl0ZXMgYXJlIGluIHRoZSBGSUZPICovCglpbnNiKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19SWERBVEEsICZpcmRhdGFbMF0sIDgpOwoKCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXJkYXRhKTsgaSsrKSB7CgkJaHcgPSBod2VpZ2h0OChpcmRhdGFbaV0pOwoJCWlmIChodyA+IDQpCgkJCWFkZF9pcmRhdGFfYml0KGRhdGEsIDApOwoJCWVsc2UKCQkJYWRkX2lyZGF0YV9iaXQoZGF0YSwgMSk7CgoJCWlmIChodyA9PSA4KQoJCQlkYXRhLT5pZGxlX2NvdW50Kys7CgkJZWxzZQoJCQlkYXRhLT5pZGxlX2NvdW50ID0gMDsKCX0KCglpZiAoZGF0YS0+aWRsZV9jb3VudCA+IFdCQ0lSX01BWF9JRExFX0JZVEVTKSB7CgkJLyogU2V0IFJYSU5BQ1RJVkUuLi4gKi8KCQlvdXRiKFdCQ0lSX1JYX0RJU0FCTEUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19BU0NSKTsKCgkJLyogLi4uYW5kIGRyYWluIHRoZSBGSUZPICovCgkJd2hpbGUgKGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTFNSKSAmIFdCQ0lSX1JYX0FWQUlMKQoJCQlpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSk7CgoJCWRldl9kYmcoZGV2LCAiSVJEQVRBOlxuIik7CgkJZm9yIChpID0gMDsgaSA8IGRhdGEtPmlyZGF0YV9jb3VudDsgaSArPSBCSVRTX1BFUl9MT05HKQoJCQlkZXZfZGJnKGRldiwgIjB4JTA4bFhcbiIsIGRhdGEtPmlyZGF0YVtpL0JJVFNfUEVSX0xPTkddKTsKCgkJc3dpdGNoIChwcm90b2NvbCkgewoJCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJCQl3YmNpcl9wYXJzZV9yYzUoZGV2LCBkYXRhKTsKCQkJYnJlYWs7CgkJY2FzZSBJUl9QUk9UT0NPTF9SQzY6CgkJCXdiY2lyX3BhcnNlX3JjNihkZXYsIGRhdGEpOwoJCQlicmVhazsKCQljYXNlIElSX1BST1RPQ09MX05FQzoKCQkJd2JjaXJfcGFyc2VfbmVjKGRldiwgZGF0YSk7CgkJCWJyZWFrOwoJCX0KCgkJd2JjaXJfcmVzZXRfaXJkYXRhKGRhdGEpOwoJfQoKb3V0OgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2JjaXJfbG9jaywgZmxhZ3MpOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBTRVRVUC9JTklUL1NVU1BFTkQvUkVTVU1FIEZVTkNUSU9OUwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZAp3YmNpcl9zaHV0ZG93bihzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlKQp7CglzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGV2aWNlLT5kZXY7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IHBucF9nZXRfZHJ2ZGF0YShkZXZpY2UpOwoJaW50IGRvX3dha2UgPSAxOwoJdTggbWF0Y2hbMTFdOwoJdTggbWFza1sxMV07Cgl1OCByYzZfY3NsID0gMDsKCWludCBpOwoKCW1lbXNldChtYXRjaCwgMCwgc2l6ZW9mKG1hdGNoKSk7CgltZW1zZXQobWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKCglpZiAod2FrZV9zYyA9PSBJTlZBTElEX1NDQU5DT0RFIHx8ICFkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7CgkJZG9fd2FrZSA9IDA7CgkJZ290byBmaW5pc2g7Cgl9CgoJc3dpdGNoIChwcm90b2NvbCkgewoJY2FzZSBJUl9QUk9UT0NPTF9SQzU6CgkJaWYgKHdha2Vfc2MgPiAweEZGRikgewoJCQlkb193YWtlID0gMDsKCQkJZGV2X2VycihkZXYsICJSQzUgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQlicmVhazsKCQl9CgoJCS8qIE1hc2sgPSAxMyBiaXRzLCBleCB0b2dnbGUgKi8KCQltYXNrWzBdID0gMHhGRjsKCQltYXNrWzFdID0gMHgxNzsKCgkJbWF0Y2hbMF0gID0gKHdha2Vfc2MgJiAweDAwM0YpOyAgICAgIC8qIDYgY29tbWFuZCBiaXRzICovCgkJbWF0Y2hbMF0gfD0gKHdha2Vfc2MgJiAweDAxODApID4+IDE7IC8qIDIgYWRkcmVzcyBiaXRzICovCgkJbWF0Y2hbMV0gID0gKHdha2Vfc2MgJiAweDBFMDApID4+IDk7IC8qIDMgYWRkcmVzcyBiaXRzICovCgkJaWYgKCEod2FrZV9zYyAmIDB4MDA0MCkpICAgICAgICAgICAgIC8qIDJuZCBzdGFydCBiaXQgICovCgkJCW1hdGNoWzFdIHw9IDB4MTA7CgoJCWJyZWFrOwoKCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgoJCWlmICh3YWtlX3NjID4gMHhGRkZGRkYpIHsKCQkJZG9fd2FrZSA9IDA7CgkJCWRldl9lcnIoZGV2LCAiTkVDIC0gSW52YWxpZCB3YWtlIHNjYW5jb2RlXG4iKTsKCQkJYnJlYWs7CgkJfQoKCQltYXNrWzBdID0gbWFza1sxXSA9IG1hc2tbMl0gPSBtYXNrWzNdID0gMHhGRjsKCgkJbWF0Y2hbMV0gPSBiaXRyZXY4KCh3YWtlX3NjICYgMHhGRikpOwoJCW1hdGNoWzBdID0gfm1hdGNoWzFdOwoKCQltYXRjaFszXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDApID4+IDgpOwoJCWlmICh3YWtlX3NjID4gMHhGRkZGKQoJCQltYXRjaFsyXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDAwMCkgPj4gMTYpOwoJCWVsc2UKCQkJbWF0Y2hbMl0gPSB+bWF0Y2hbM107CgoJCWJyZWFrOwoKCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgoKCQlpZiAod2FrZV9yYzZtb2RlID09IDApIHsKCQkJaWYgKHdha2Vfc2MgPiAweEZGRkYpIHsKCQkJCWRvX3dha2UgPSAwOwoJCQkJZGV2X2VycihkZXYsICJSQzYgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCS8qIENvbW1hbmQgKi8KCQkJbWF0Y2hbMF0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICAwKTsKCQkJbWFza1swXSAgPSAweEZGOwoJCQltYXRjaFsxXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDQpOwoJCQltYXNrWzFdICA9IDB4RkY7CgoJCQkvKiBBZGRyZXNzICovCgkJCW1hdGNoWzJdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgOCk7CgkJCW1hc2tbMl0gID0gMHhGRjsKCQkJbWF0Y2hbM10gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDEyKTsKCQkJbWFza1szXSAgPSAweEZGOwoKCQkJLyogSGVhZGVyICovCgkJCW1hdGNoWzRdID0gMHg1MDsgLyogbW9kZTEgPSBtb2RlMCA9IDAsIGlnbm9yZSB0b2dnbGUgKi8KCQkJbWFza1s0XSAgPSAweEYwOwoJCQltYXRjaFs1XSA9IDB4MDk7IC8qIHN0YXJ0IGJpdCA9IDEsIG1vZGUyID0gMCAqLwoJCQltYXNrWzVdICA9IDB4MEY7CgoJCQlyYzZfY3NsID0gNDQ7CgoJCX0gZWxzZSBpZiAod2FrZV9yYzZtb2RlID09IDYpIHsKCQkJaSA9IDA7CgoJCQkvKiBDb21tYW5kICovCgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDApOwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA0KTsKCQkJbWFza1tpKytdID0gMHhGRjsKCgkJCS8qIEFkZHJlc3MgKyBUb2dnbGUgKi8KCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgOCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMTIpOwoJCQltYXNrW2krK10gPSAweDNGOwoKCQkJLyogQ3VzdG9tZXIgYml0cyA3IC0gMCAqLwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDE2KTsKCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAyMCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgoJCQlpZiAod2FrZV9zYyAmIDB4ODAwMDAwMDApIHsKCQkJCS8qIEN1c3RvbWVyIHJhbmdlIGJpdCBhbmQgYml0cyAxNSAtIDggKi8KCQkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMjQpOwoJCQkJbWFza1tpKytdID0gMHhGRjsKCQkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMjgpOwoJCQkJbWFza1tpKytdID0gMHhGRjsKCQkJCXJjNl9jc2wgPSA3NjsKCQkJfSBlbHNlIGlmICh3YWtlX3NjIDw9IDB4MDA3RkZGRkYpIHsKCQkJCXJjNl9jc2wgPSA2MDsKCQkJfSBlbHNlIHsKCQkJCWRvX3dha2UgPSAwOwoJCQkJZGV2X2VycihkZXYsICJSQzYgLSBJbnZhbGlkIHdha2Ugc2NhbmNvZGVcbiIpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCS8qIEhlYWRlciAqLwoJCQltYXRjaFtpXSAgPSAweDkzOyAvKiBtb2RlMSA9IG1vZGUwID0gMSwgc3VibW9kZSA9IDAgKi8KCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gMHgwQTsgLyogc3RhcnQgYml0ID0gMSwgbW9kZTIgPSAxICovCgkJCW1hc2tbaSsrXSA9IDB4MEY7CgoJCX0gZWxzZSB7CgkJCWRvX3dha2UgPSAwOwoJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBtb2RlXG4iKTsKCQl9CgoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZG9fd2FrZSA9IDA7CgkJYnJlYWs7Cgl9CgpmaW5pc2g6CglpZiAoZG9fd2FrZSkgewoJCS8qIFNldCBjb21wYXJlIGFuZCBjb21wYXJlIG1hc2sgKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCwKCQkJICAgICAgIFdCQ0lSX1JFR1NFTF9DT01QQVJFIHwgV0JDSVJfUkVHX0FERFIwLAoJCQkgICAgICAgMHgzRik7CgkJb3V0c2IoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfREFUQSwgbWF0Y2gsIDExKTsKCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9JTkRFWCwKCQkJICAgICAgIFdCQ0lSX1JFR1NFTF9NQVNLIHwgV0JDSVJfUkVHX0FERFIwLAoJCQkgICAgICAgMHgzRik7CgkJb3V0c2IoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfREFUQSwgbWFzaywgMTEpOwoKCQkvKiBSQzYgQ29tcGFyZSBTdHJpbmcgTGVuICovCgkJb3V0YihyYzZfY3NsLCBkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DU0wpOwoKCQkvKiBDbGVhciBzdGF0dXMgYml0cyBORUNfUkVQLCBCVUZGLCBNU0dfRU5ELCBNQVRDSCAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJCS8qIENsZWFyIEJVRkZfRU4sIENsZWFyIEVORF9FTiwgU2V0IE1BVENIX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDEsIDB4MDcpOwoKCQkvKiBTZXQgQ0VJUl9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCwgMHgwMSwgMHgwMSk7CgoJfSBlbHNlIHsKCQkvKiBDbGVhciBCVUZGX0VOLCBDbGVhciBFTkRfRU4sIENsZWFyIE1BVENIX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfRVZfRU4sIDB4MDAsIDB4MDcpOwoKCQkvKiBDbGVhciBDRUlSX0VOICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAwLCAweDAxKTsKCX0KCgkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKFdCQ0lSX0lSUV9OT05FLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSUVSKTsKCgkvKgoJICogQUNQSSB3aWxsIHNldCB0aGUgSFcgZGlzYWJsZSBiaXQgZm9yIFNQMyB3aGljaCBtZWFucyB0aGF0IHRoZQoJICogb3V0cHV0IHNpZ25hbHMgYXJlIGxlZnQgaW4gYW4gdW5kZWZpbmVkIHN0YXRlIHdoaWNoIG1heSBjYXVzZQoJICogc3B1cmlvdXMgaW50ZXJydXB0cyB3aGljaCB3ZSBuZWVkIHRvIGlnbm9yZSB1bnRpbCB0aGUgaGFyZHdhcmUKCSAqIGlzIHJlaW5pdGlhbGl6ZWQuCgkgKi8KCWRpc2FibGVfaXJxKGRhdGEtPmlycSk7Cn0KCnN0YXRpYyBpbnQKd2JjaXJfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCXdiY2lyX3NodXRkb3duKGRldmljZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKd2JjaXJfaW5pdF9odyhzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSkKewoJdTggdG1wOwoKCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoV0JDSVJfSVJRX05PTkUsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JRVIpOwoKCS8qIFNldCBQUk9UX1NFTCwgUlhfSU5WLCBDbGVhciBDRUlSX0VOIChuZWVkZWQgZm9yIHRoZSBsZWQpICovCgl0bXAgPSBwcm90b2NvbCA8PCA0OwoJaWYgKGludmVydCkKCQl0bXAgfD0gMHgwODsKCW91dGIodG1wLCBkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwpOwoKCS8qIENsZWFyIHN0YXR1cyBiaXRzIE5FQ19SRVAsIEJVRkYsIE1TR19FTkQsIE1BVENIICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9TVFMsIDB4MTcsIDB4MTcpOwoKCS8qIENsZWFyIEJVRkZfRU4sIENsZWFyIEVORF9FTiwgQ2xlYXIgTUFUQ0hfRU4gKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAwLCAweDA3KTsKCgkvKiBTZXQgUkM1IGNlbGwgdGltZSB0byBjb3JyZXNwb25kIHRvIDM2IGtIeiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ0ZHMSwgMHg0QSwgMHg3Rik7CgoJLyogU2V0IElSVFhfSU5WICovCglpZiAoaW52ZXJ0KQoJCW91dGIoMHgwNCwgZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ0NUTCk7CgllbHNlCgkJb3V0YigweDAwLCBkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DQ1RMKTsKCgkvKgoJICogQ2xlYXIgSVIgTEVELCBzZXQgU1AzIGNsb2NrIHRvIDI0TWh6CgkgKiBzZXQgU1AzX0lSUlhfU1cgdG8gYmluYXJ5IDAxLCBoZWxwZnVsbHkgbm90IGRvY3VtZW50ZWQKCSAqLwoJb3V0YigweDEwLCBkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DVFMpOwoKCS8qIEVuYWJsZSBleHRlbmRlZCBtb2RlICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzIpOwoJb3V0YihXQkNJUl9FWFRfRU5BQkxFLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRVhDUjEpOwoKCS8qCgkgKiBDb25maWd1cmUgYmF1ZCBnZW5lcmF0b3IsIElSIGRhdGEgd2lsbCBiZSBzYW1wbGVkIGF0CgkgKiBhIGJpdHJhdGUgb2Y6ICgyNE1oeiAqIHByZXNjYWxlcikgLyAoZGl2aXNvciAqIDE2KS4KCSAqCgkgKiBUaGUgRUNJUiByZWdpc3RlcnMgaW5jbHVkZSBhIGZsYWcgdG8gY2hhbmdlIHRoZQoJICogMjRNaHogY2xvY2sgZnJlcSB0byA0OE1oei4KCSAqCgkgKiBJdCdzIG5vdCBkb2N1bWVudGVkIGluIHRoZSBzcGVjcywgYnV0IGZpZm8gbGV2ZWxzCgkgKiBvdGhlciB0aGFuIDE2IHNlZW1zIHRvIGJlIHVuc3VwcG9ydGVkLgoJICovCgoJLyogcHJlc2NhbGVyIDEuMCwgdHgvcnggZmlmbyBsdmwgMTYgKi8KCW91dGIoMHgzMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0VYQ1IyKTsKCgkvKiBTZXQgYmF1ZCBkaXZpc29yIHRvIGdlbmVyYXRlIG9uZSBieXRlIHBlciBiaXQvY2VsbCAqLwoJc3dpdGNoIChwcm90b2NvbCkgewoJY2FzZSBJUl9QUk9UT0NPTF9SQzU6CgkJb3V0YigweEE3LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7CgkJYnJlYWs7CgljYXNlIElSX1BST1RPQ09MX1JDNjoKCQlvdXRiKDB4NTMsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKCQlicmVhazsKCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgoJCW91dGIoMHg2OSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwoJCWJyZWFrOwoJfQoJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdESCk7CgoJLyogU2V0IENFSVIgbW9kZSAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18wKTsKCW91dGIoMHhDMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX01DUik7CglpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUik7IC8qIENsZWFyIExTUiAqLwoJaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19NU1IpOyAvKiBDbGVhciBNU1IgKi8KCgkvKiBEaXNhYmxlIFJYIGRlbW9kLCBydW4tbGVuZ3RoIGVuY29kaW5nL2RlY29kaW5nLCBzZXQgZnJlcSBzcGFuICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzcpOwoJb3V0YigweDEwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUkNDRkcpOwoKCS8qIERpc2FibGUgdGltZXIgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNCk7CglvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMSk7CgoJLyogRW5hYmxlIE1TUiBpbnRlcnJ1cHQsIENsZWFyIEFVWF9JUlggKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNSk7CglvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMik7CgoJLyogRGlzYWJsZSBDUkMgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNik7CglvdXRiKDB4MjAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNSMyk7CgoJLyogU2V0IFJYL1RYIChkZSltb2R1bGF0aW9uIGZyZXEsIG5vdCByZWFsbHkgdXNlZCAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS183KTsKCW91dGIoMHhGMiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSUlhEQyk7CglvdXRiKDB4NjksIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUlRYTUMpOwoKCS8qIFNldCBpbnZlcnQgYW5kIHBpbiBkaXJlY3Rpb24gKi8KCWlmIChpbnZlcnQpCgkJb3V0YigweDEwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDRkc0KTsKCWVsc2UKCQlvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUkNGRzQpOwoKCS8qIFNldCBGSUZPIHRocmVzaG9sZHMgKFJYID0gOCwgVFggPSAzKSwgcmVzZXQgUlgvVFggKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKDB4OTcsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19GQ1IpOwoKCS8qIENsZWFyIEFVWCBzdGF0dXMgYml0cyAqLwoJb3V0YigweEUwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CgoJLyogRW5hYmxlIGludGVycnVwdHMgKi8KCXdiY2lyX3Jlc2V0X2lyZGF0YShkYXRhKTsKCW91dGIoV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7Cn0KCnN0YXRpYyBpbnQKd2JjaXJfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7CgoJd2JjaXJfaW5pdF9odyhkYXRhKTsKCWVuYWJsZV9pcnEoZGF0YS0+aXJxKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQKd2JjaXJfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldmljZSwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKewoJc3RydWN0IGRldmljZSAqZGV2ID0gJmRldmljZS0+ZGV2OwoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGE7CglpbnQgZXJyOwoKCWlmICghKHBucF9wb3J0X2xlbihkZXZpY2UsIDApID09IEVIRlVOQ19JT01FTV9MRU4gJiYKCSAgICAgIHBucF9wb3J0X2xlbihkZXZpY2UsIDEpID09IFdBS0VVUF9JT01FTV9MRU4gJiYKCSAgICAgIHBucF9wb3J0X2xlbihkZXZpY2UsIDIpID09IFNQX0lPTUVNX0xFTikpIHsKCQlkZXZfZXJyKGRldiwgIkludmFsaWQgcmVzb3VyY2VzXG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICghZGF0YSkgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0OwoJfQoKCXBucF9zZXRfZHJ2ZGF0YShkZXZpY2UsIGRhdGEpOwoKCWRhdGEtPmViYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAwKTsKCWRhdGEtPndiYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAxKTsKCWRhdGEtPnNiYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAyKTsKCWRhdGEtPmlycSA9IHBucF9pcnEoZGV2aWNlLCAwKTsKCglpZiAoZGF0YS0+d2Jhc2UgPT0gMCB8fCBkYXRhLT5lYmFzZSA9PSAwIHx8CgkgICAgZGF0YS0+c2Jhc2UgPT0gMCB8fCBkYXRhLT5pcnEgPT0gMCkgewoJCWVyciA9IC1FTk9ERVY7CgkJZGV2X2VycihkZXYsICJJbnZhbGlkIHJlc291cmNlc1xuIik7CgkJZ290byBleGl0X2ZyZWVfZGF0YTsKCX0KCglkZXZfZGJnKCZkZXZpY2UtPmRldiwgIkZvdW5kIGRldmljZSAiCgkJIih3OiAweCVsWCwgZTogMHglbFgsIHM6IDB4JWxYLCBpOiAldSlcbiIsCgkJZGF0YS0+d2Jhc2UsIGRhdGEtPmViYXNlLCBkYXRhLT5zYmFzZSwgZGF0YS0+aXJxKTsKCglpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPndiYXNlLCBXQUtFVVBfSU9NRU1fTEVOLCBEUlZOQU1FKSkgewoJCWRldl9lcnIoZGV2LCAiUmVnaW9uIDB4JWx4LTB4JWx4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJZGF0YS0+d2Jhc2UsIGRhdGEtPndiYXNlICsgV0FLRVVQX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfZnJlZV9kYXRhOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4sIERSVk5BTUUpKSB7CgkJZGV2X2VycihkZXYsICJSZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlkYXRhLT5lYmFzZSwgZGF0YS0+ZWJhc2UgKyBFSEZVTkNfSU9NRU1fTEVOIC0gMSk7CgkJZXJyID0gLUVCVVNZOwoJCWdvdG8gZXhpdF9yZWxlYXNlX3diYXNlOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTiwgRFJWTkFNRSkpIHsKCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCgkJCWRhdGEtPnNiYXNlLCBkYXRhLT5zYmFzZSArIFNQX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9lYmFzZTsKCX0KCgllcnIgPSByZXF1ZXN0X2lycShkYXRhLT5pcnEsIHdiY2lyX2lycV9oYW5kbGVyLAoJCQkgIElSUUZfRElTQUJMRUQsIERSVk5BTUUsIGRldmljZSk7CglpZiAoZXJyKSB7CgkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY2xhaW0gSVJRICV1XG4iLCBkYXRhLT5pcnEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9zYmFzZTsKCX0KCglsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoImNpci10eCIsICZkYXRhLT50eHRyaWdnZXIpOwoJaWYgKCFkYXRhLT50eHRyaWdnZXIpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF9mcmVlX2lycTsKCX0KCglsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoImNpci1yeCIsICZkYXRhLT5yeHRyaWdnZXIpOwoJaWYgKCFkYXRhLT5yeHRyaWdnZXIpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3R4dHJpZ2dlcjsKCX0KCglkYXRhLT5sZWQubmFtZSA9ICJjaXI6OmFjdGl2aXR5IjsKCWRhdGEtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPSAiY2lyLXJ4IjsKCWRhdGEtPmxlZC5icmlnaHRuZXNzX3NldCA9IHdiY2lyX2xlZF9icmlnaHRuZXNzX3NldDsKCWRhdGEtPmxlZC5icmlnaHRuZXNzX2dldCA9IHdiY2lyX2xlZF9icmlnaHRuZXNzX2dldDsKCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZGV2aWNlLT5kZXYsICZkYXRhLT5sZWQpOwoJaWYgKGVycikKCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9yeHRyaWdnZXI7CgoJZGF0YS0+aW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CglpZiAoIWRhdGEtPmlucHV0X2RldikgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0X3VucmVnaXN0ZXJfbGVkOwoJfQoKCWRhdGEtPmlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKCWRhdGEtPmlucHV0X2Rldi0+bmFtZSA9IFdCQ0lSX05BTUU7CglkYXRhLT5pbnB1dF9kZXYtPnBoeXMgPSAid2JjaXIvY2lyMCI7CglkYXRhLT5pbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKCWRhdGEtPmlucHV0X2Rldi0+aWQudmVuZG9yICA9IFBDSV9WRU5ET1JfSURfV0lOQk9ORDsKCWRhdGEtPmlucHV0X2Rldi0+aWQucHJvZHVjdCA9IFdCQ0lSX0lEX0ZBTUlMWTsKCWRhdGEtPmlucHV0X2Rldi0+aWQudmVyc2lvbiA9IFdCQ0lSX0lEX0NISVA7CglkYXRhLT5pbnB1dF9kZXYtPmdldGtleWNvZGUgPSB3YmNpcl9nZXRrZXljb2RlOwoJZGF0YS0+aW5wdXRfZGV2LT5zZXRrZXljb2RlID0gd2JjaXJfc2V0a2V5Y29kZTsKCWlucHV0X3NldF9jYXBhYmlsaXR5KGRhdGEtPmlucHV0X2RldiwgRVZfTVNDLCBNU0NfU0NBTik7CglpbnB1dF9zZXRfZHJ2ZGF0YShkYXRhLT5pbnB1dF9kZXYsIGRhdGEpOwoKCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShkYXRhLT5pbnB1dF9kZXYpOwoJaWYgKGVycikKCQlnb3RvIGV4aXRfZnJlZV9pbnB1dDsKCglkYXRhLT5sYXN0X3NjYW5jb2RlID0gSU5WQUxJRF9TQ0FOQ09ERTsKCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5rZXl0YWJsZSk7CglzZXR1cF90aW1lcigmZGF0YS0+dGltZXJfa2V5dXAsIHdiY2lyX2tleXVwLCAodW5zaWduZWQgbG9uZylkYXRhKTsKCgkvKiBMb2FkIGRlZmF1bHQga2V5bWFwcyAqLwoJaWYgKHByb3RvY29sID09IElSX1BST1RPQ09MX1JDNikgewoJCWludCBpOwoJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJjNl9kZWZfa2V5bWFwKTsgaSsrKSB7CgkJCWVyciA9IHdiY2lyX3NldGtleWNvZGUoZGF0YS0+aW5wdXRfZGV2LAoJCQkJCSAgICAgICAoaW50KXJjNl9kZWZfa2V5bWFwW2ldLnNjYW5jb2RlLAoJCQkJCSAgICAgICAoaW50KXJjNl9kZWZfa2V5bWFwW2ldLmtleWNvZGUpOwoJCQlpZiAoZXJyKQoJCQkJZ290byBleGl0X3VucmVnaXN0ZXJfa2V5czsKCQl9Cgl9CgoJZGV2aWNlX2luaXRfd2FrZXVwKCZkZXZpY2UtPmRldiwgMSk7CgoJd2JjaXJfaW5pdF9odyhkYXRhKTsKCglyZXR1cm4gMDsKCmV4aXRfdW5yZWdpc3Rlcl9rZXlzOgoJaWYgKCFsaXN0X2VtcHR5KCZkYXRhLT5rZXl0YWJsZSkpIHsKCQlzdHJ1Y3Qgd2JjaXJfa2V5ZW50cnkgKmtleTsKCQlzdHJ1Y3Qgd2JjaXJfa2V5ZW50cnkgKmtleXRtcDsKCgkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtleSwga2V5dG1wLCAmZGF0YS0+a2V5dGFibGUsIGxpc3QpIHsKCQkJbGlzdF9kZWwoJmtleS0+bGlzdCk7CgkJCWtmcmVlKGtleSk7CgkJfQoJfQoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKCS8qIENhbid0IGNhbGwgaW5wdXRfZnJlZV9kZXZpY2Ugb24gYW4gdW5yZWdpc3RlcmVkIGRldmljZSAqLwoJZGF0YS0+aW5wdXRfZGV2ID0gTlVMTDsKZXhpdF9mcmVlX2lucHV0OgoJaW5wdXRfZnJlZV9kZXZpY2UoZGF0YS0+aW5wdXRfZGV2KTsKZXhpdF91bnJlZ2lzdGVyX2xlZDoKCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkYXRhLT5sZWQpOwpleGl0X3VucmVnaXN0ZXJfcnh0cmlnZ2VyOgoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+cnh0cmlnZ2VyKTsKZXhpdF91bnJlZ2lzdGVyX3R4dHJpZ2dlcjoKCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnR4dHJpZ2dlcik7CmV4aXRfZnJlZV9pcnE6CglmcmVlX2lycShkYXRhLT5pcnEsIGRldmljZSk7CmV4aXRfcmVsZWFzZV9zYmFzZToKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPnNiYXNlLCBTUF9JT01FTV9MRU4pOwpleGl0X3JlbGVhc2VfZWJhc2U6CglyZWxlYXNlX3JlZ2lvbihkYXRhLT5lYmFzZSwgRUhGVU5DX0lPTUVNX0xFTik7CmV4aXRfcmVsZWFzZV93YmFzZToKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPndiYXNlLCBXQUtFVVBfSU9NRU1fTEVOKTsKZXhpdF9mcmVlX2RhdGE6CglrZnJlZShkYXRhKTsKCXBucF9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOwpleGl0OgoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0CndiY2lyX3JlbW92ZShzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlKQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IHBucF9nZXRfZHJ2ZGF0YShkZXZpY2UpOwoJc3RydWN0IHdiY2lyX2tleWVudHJ5ICprZXk7CglzdHJ1Y3Qgd2JjaXJfa2V5ZW50cnkgKmtleXRtcDsKCgkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKFdCQ0lSX0lSUV9OT05FLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSUVSKTsKCglkZWxfdGltZXJfc3luYygmZGF0YS0+dGltZXJfa2V5dXApOwoKCWZyZWVfaXJxKGRhdGEtPmlycSwgZGV2aWNlKTsKCgkvKiBDbGVhciBzdGF0dXMgYml0cyBORUNfUkVQLCBCVUZGLCBNU0dfRU5ELCBNQVRDSCAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfU1RTLCAweDE3LCAweDE3KTsKCgkvKiBDbGVhciBDRUlSX0VOICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDAsIDB4MDEpOwoKCS8qIENsZWFyIEJVRkZfRU4sIEVORF9FTiwgTUFUQ0hfRU4gKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAwLCAweDA3KTsKCgkvKiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBrZXl1cCBldmVudCBpZiBuZWNlc3NhcnkgKi8KCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmlucHV0X2Rldik7CgoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+cnh0cmlnZ2VyKTsKCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnR4dHJpZ2dlcik7CglsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkKTsKCgkvKiBUaGlzIGlzIG9rIHNpbmNlICZkYXRhLT5sZWQgaXNuJ3QgYWN0dWFsbHkgdXNlZCAqLwoJd2JjaXJfbGVkX2JyaWdodG5lc3Nfc2V0KCZkYXRhLT5sZWQsIExFRF9PRkYpOwoKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPndiYXNlLCBXQUtFVVBfSU9NRU1fTEVOKTsKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPmViYXNlLCBFSEZVTkNfSU9NRU1fTEVOKTsKCXJlbGVhc2VfcmVnaW9uKGRhdGEtPnNiYXNlLCBTUF9JT01FTV9MRU4pOwoKCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShrZXksIGtleXRtcCwgJmRhdGEtPmtleXRhYmxlLCBsaXN0KSB7CgkJbGlzdF9kZWwoJmtleS0+bGlzdCk7CgkJa2ZyZWUoa2V5KTsKCX0KCglrZnJlZShkYXRhKTsKCglwbnBfc2V0X2RydmRhdGEoZGV2aWNlLCBOVUxMKTsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkIHdiY2lyX2lkc1tdID0gewoJeyAiV0VDMTAyMiIsIDAgfSwKCXsgIiIsIDAgfQp9OwpNT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgd2JjaXJfaWRzKTsKCnN0YXRpYyBzdHJ1Y3QgcG5wX2RyaXZlciB3YmNpcl9kcml2ZXIgPSB7CgkubmFtZSAgICAgPSBXQkNJUl9OQU1FLAoJLmlkX3RhYmxlID0gd2JjaXJfaWRzLAoJLnByb2JlICAgID0gd2JjaXJfcHJvYmUsCgkucmVtb3ZlICAgPSBfX2RldmV4aXRfcCh3YmNpcl9yZW1vdmUpLAoJLnN1c3BlbmQgID0gd2JjaXJfc3VzcGVuZCwKCS5yZXN1bWUgICA9IHdiY2lyX3Jlc3VtZSwKCS5zaHV0ZG93biA9IHdiY2lyX3NodXRkb3duCn07CgpzdGF0aWMgaW50IF9faW5pdAp3YmNpcl9pbml0KHZvaWQpCnsKCWludCByZXQ7CgoJc3dpdGNoIChwcm90b2NvbCkgewoJY2FzZSBJUl9QUk9UT0NPTF9SQzU6CgljYXNlIElSX1BST1RPQ09MX05FQzoKCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBJbnZhbGlkIHByb3RvY29sIGFyZ3VtZW50XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglyZXQgPSBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZ3YmNpcl9kcml2ZXIpOwoJaWYgKHJldCkKCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBVbmFibGUgdG8gcmVnaXN0ZXIgZHJpdmVyXG4iKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQKd2JjaXJfZXhpdCh2b2lkKQp7CglwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJndiY2lyX2RyaXZlcik7Cn0KCk1PRFVMRV9BVVRIT1IoIkRhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJXaW5ib25kIFN1cGVySS9PIENvbnN1bWVyIElSIERyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfaW5pdCh3YmNpcl9pbml0KTsKbW9kdWxlX2V4aXQod2JjaXJfZXhpdCk7CgoK